aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore13
-rw-r--r--AUTHORS125
-rw-r--r--COPYING2
-rw-r--r--COPYING.LGPL2
-rw-r--r--Makefile1
-rw-r--r--NEWS65
-rw-r--r--README147
-rw-r--r--audio/audiostream.cpp25
-rw-r--r--audio/audiostream.h13
-rw-r--r--audio/decoders/aac.cpp127
-rw-r--r--audio/decoders/aac.h19
-rw-r--r--audio/decoders/adpcm.cpp10
-rw-r--r--audio/decoders/adpcm_intern.h5
-rw-r--r--audio/decoders/codec.h (renamed from engines/tsage/blueforce_logic.h)32
-rw-r--r--audio/decoders/mp3.cpp10
-rw-r--r--audio/decoders/qdm2.cpp116
-rw-r--r--audio/decoders/qdm2.h15
-rw-r--r--audio/decoders/quicktime.cpp58
-rw-r--r--audio/decoders/quicktime.h7
-rw-r--r--audio/decoders/quicktime_intern.h12
-rw-r--r--audio/decoders/raw.cpp22
-rw-r--r--audio/decoders/voc.cpp93
-rw-r--r--audio/decoders/voc.h11
-rw-r--r--audio/decoders/vorbis.cpp12
-rw-r--r--audio/decoders/xa.cpp (renamed from audio/decoders/vag.cpp)111
-rw-r--r--audio/decoders/xa.h (renamed from audio/decoders/vag.h)18
-rw-r--r--audio/fmopl.cpp1
-rw-r--r--audio/fmopl.h1
-rw-r--r--audio/mididrv.cpp63
-rw-r--r--audio/mididrv.h2
-rw-r--r--audio/mixer.cpp9
-rw-r--r--audio/mods/maxtrax.cpp4
-rw-r--r--audio/module.mk2
-rw-r--r--audio/mpu401.cpp7
-rw-r--r--audio/rate.cpp3
-rw-r--r--audio/rate_arm.cpp1
-rw-r--r--audio/softsynth/appleiigs.cpp1
-rw-r--r--audio/softsynth/cms.cpp16
-rw-r--r--audio/softsynth/eas.cpp1
-rw-r--r--audio/softsynth/emumidi.h6
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_audio.h1
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_euphony.h1
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_midi.cpp7
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_midi.h1
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp1
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_pc98_driver.h1
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h1
-rw-r--r--audio/softsynth/mt32.cpp2
-rw-r--r--audio/softsynth/mt32/mt32_file.cpp1
-rw-r--r--audio/softsynth/opl/dbopl.cpp8
-rw-r--r--audio/softsynth/opl/dbopl.h4
-rw-r--r--audio/softsynth/opl/dosbox.h1
-rw-r--r--audio/softsynth/opl/mame.cpp3
-rw-r--r--backends/base-backend.cpp7
-rw-r--r--backends/events/dinguxsdl/dinguxsdl-events.cpp12
-rw-r--r--backends/events/gph/gph-events.cpp262
-rw-r--r--backends/events/linuxmotosdl/linuxmotosdl-events.cpp14
-rw-r--r--backends/events/maemosdl/maemosdl-events.cpp155
-rw-r--r--backends/events/maemosdl/maemosdl-events.h52
-rw-r--r--backends/events/openpandora/op-events.cpp32
-rw-r--r--backends/events/ps3sdl/ps3sdl-events.cpp163
-rw-r--r--backends/events/ps3sdl/ps3sdl-events.h38
-rw-r--r--backends/events/sdl/sdl-events.cpp215
-rw-r--r--backends/events/sdl/sdl-events.h18
-rw-r--r--backends/events/symbiansdl/symbiansdl-events.cpp15
-rw-r--r--backends/events/symbiansdl/symbiansdl-events.h1
-rw-r--r--backends/events/webossdl/webossdl-events.cpp398
-rw-r--r--backends/events/webossdl/webossdl-events.h74
-rw-r--r--backends/events/wincesdl/wincesdl-events.cpp19
-rw-r--r--backends/events/wincesdl/wincesdl-events.h2
-rw-r--r--backends/fs/ds/ds-fs-factory.cpp2
-rw-r--r--backends/fs/n64/n64-fs-factory.cpp1
-rw-r--r--backends/fs/n64/n64-fs.cpp1
-rw-r--r--backends/fs/n64/romfsstream.cpp1
-rw-r--r--backends/fs/posix/posix-fs-factory.cpp2
-rw-r--r--backends/fs/posix/posix-fs-factory.h1
-rw-r--r--backends/fs/posix/posix-fs.cpp2
-rw-r--r--backends/fs/ps2/ps2-fs-factory.cpp2
-rw-r--r--backends/fs/ps3/ps3-fs-factory.cpp26
-rw-r--r--backends/fs/ps3/ps3-fs-factory.h36
-rw-r--r--backends/fs/psp/psp-fs-factory.cpp2
-rw-r--r--backends/fs/stdiostream.cpp4
-rw-r--r--backends/fs/symbian/symbian-fs.cpp2
-rw-r--r--backends/fs/symbian/symbianstream.cpp1
-rw-r--r--backends/fs/wii/wii-fs-factory.cpp3
-rw-r--r--backends/fs/wii/wii-fs-factory.h1
-rw-r--r--backends/fs/wii/wii-fs.cpp1
-rw-r--r--backends/fs/windows/windows-fs.cpp12
-rw-r--r--backends/fs/windows/windows-fs.h11
-rw-r--r--backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp39
-rw-r--r--backends/graphics/dinguxsdl/dinguxsdl-graphics.h2
-rw-r--r--backends/graphics/gph/gph-graphics.cpp150
-rw-r--r--backends/graphics/gph/gph-graphics.h4
-rw-r--r--backends/graphics/graphics.h4
-rw-r--r--backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp25
-rw-r--r--backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h3
-rw-r--r--backends/graphics/opengl/gltexture.h20
-rw-r--r--backends/graphics/opengl/opengl-graphics.cpp53
-rw-r--r--backends/graphics/opengl/opengl-graphics.h21
-rw-r--r--backends/graphics/openglsdl/openglsdl-graphics.cpp106
-rw-r--r--backends/graphics/openglsdl/openglsdl-graphics.h15
-rw-r--r--backends/graphics/openpandora/op-graphics.h2
-rw-r--r--backends/graphics/sdl/sdl-graphics.cpp35
-rw-r--r--backends/graphics/sdl/sdl-graphics.h86
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.cpp70
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.h11
-rw-r--r--backends/graphics/symbiansdl/symbiansdl-graphics.cpp1
-rw-r--r--backends/graphics/symbiansdl/symbiansdl-graphics.h1
-rw-r--r--backends/graphics/wincesdl/wincesdl-graphics.cpp46
-rw-r--r--backends/graphics/wincesdl/wincesdl-graphics.h7
-rw-r--r--backends/log/log.cpp1
-rw-r--r--backends/log/log.h1
-rw-r--r--backends/mixer/sdl13/sdl13-mixer.cpp109
-rw-r--r--backends/mixer/sdl13/sdl13-mixer.h67
-rw-r--r--backends/mixer/symbiansdl/symbiansdl-mixer.cpp1
-rw-r--r--backends/mixer/symbiansdl/symbiansdl-mixer.h1
-rw-r--r--backends/mixer/wincesdl/wincesdl-mixer.cpp12
-rw-r--r--backends/mixer/wincesdl/wincesdl-mixer.h1
-rw-r--r--backends/module.mk30
-rw-r--r--backends/platform/android/android.cpp3
-rw-r--r--backends/platform/android/android.h1
-rw-r--r--backends/platform/android/android.mk1
-rw-r--r--backends/platform/android/asset-archive.h1
-rw-r--r--backends/platform/android/events.cpp1
-rw-r--r--backends/platform/android/gfx.cpp1
-rw-r--r--backends/platform/android/jni.cpp4
-rw-r--r--backends/platform/android/jni.h1
-rw-r--r--backends/platform/android/module.mk1
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java1
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java1
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/ScummVM.java1
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java1
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java1
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/ScummVMEvents.java1
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/Unpacker.java7
-rw-r--r--backends/platform/android/texture.cpp1
-rw-r--r--backends/platform/android/texture.h1
-rw-r--r--backends/platform/bada/README.TXT92
-rw-r--r--backends/platform/bada/application.cpp111
-rw-r--r--backends/platform/bada/application.h54
-rw-r--r--backends/platform/bada/audio.cpp260
-rw-r--r--backends/platform/bada/audio.h73
-rw-r--r--backends/platform/bada/bada.mk5
-rw-r--r--backends/platform/bada/form.cpp464
-rw-r--r--backends/platform/bada/form.h108
-rw-r--r--backends/platform/bada/fs.cpp435
-rw-r--r--backends/platform/bada/fs.h82
-rw-r--r--backends/platform/bada/graphics.cpp261
-rw-r--r--backends/platform/bada/graphics.h72
-rw-r--r--backends/platform/bada/main.cpp67
-rw-r--r--backends/platform/bada/missing.cpp113
-rw-r--r--backends/platform/bada/portdefs.h84
-rw-r--r--backends/platform/bada/sscanf.cpp213
-rw-r--r--backends/platform/bada/system.cpp506
-rw-r--r--backends/platform/bada/system.h102
-rw-r--r--backends/platform/dc/DCLauncherDialog.h1
-rw-r--r--backends/platform/dc/README1
-rw-r--r--backends/platform/dc/audio.cpp2
-rw-r--r--backends/platform/dc/cache.S1
-rw-r--r--backends/platform/dc/dc-fs.cpp3
-rw-r--r--backends/platform/dc/dc.h1
-rw-r--r--backends/platform/dc/dcmain.cpp1
-rw-r--r--backends/platform/dc/display.cpp1
-rw-r--r--backends/platform/dc/input.cpp1
-rw-r--r--backends/platform/dc/label.cpp1
-rw-r--r--backends/platform/dc/plugin_head.S1
-rw-r--r--backends/platform/dc/selector.cpp27
-rw-r--r--backends/platform/dingux/README.DINGUX1
-rw-r--r--backends/platform/dingux/scummvm.gpe1
-rw-r--r--backends/platform/ds/arm7/source/libcartreset/cartreset.c3
-rw-r--r--backends/platform/ds/arm7/source/libcartreset/cartreset_nolibfat.h1
-rw-r--r--backends/platform/ds/arm7/source/main.cpp1
-rw-r--r--backends/platform/ds/arm9/dist/readme_ds.txt5
-rw-r--r--backends/platform/ds/arm9/source/dsoptions.cpp1
-rw-r--r--backends/platform/ds/arm9/source/fat/disc_io.h1
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3_common.c1
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3_common.h1
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3sd_asm.s1
-rw-r--r--backends/platform/ds/arm9/source/fat/io_njsd.c2
-rw-r--r--backends/platform/ds/arm9/source/fat/io_scsd.c2
-rw-r--r--backends/platform/ds/arm9/source/fat/io_scsd_asm.s11
-rw-r--r--backends/platform/ds/arm9/source/fat/io_sd_common.c2
-rw-r--r--backends/platform/ds/arm9/source/fat/m3sd.s1
-rw-r--r--backends/platform/ds/arm9/source/keys.cpp1
-rw-r--r--backends/platform/ds/arm9/source/osystem_ds.cpp2
-rw-r--r--backends/platform/ds/arm9/source/scummhelp.cpp1
-rw-r--r--backends/platform/ds/ds.mk1
-rw-r--r--backends/platform/gph/build/gp2xwiz-bundle.sh10
-rw-r--r--backends/platform/gph/devices/gp2x/mmuhack/README (renamed from backends/platform/gph/devices/gp2x/mmuhack/readme.txt)8
-rw-r--r--backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h1
-rw-r--r--backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s1
-rw-r--r--backends/platform/gph/gph-backend.cpp97
-rw-r--r--backends/platform/gph/gph-hw.cpp58
-rw-r--r--backends/platform/gph/gph-hw.h8
-rw-r--r--backends/platform/gph/gph-main.cpp4
-rw-r--r--backends/platform/gph/gph.h (renamed from backends/platform/gph/gph-sdl.h)2
-rw-r--r--backends/platform/iphone/iphone_main.m1
-rw-r--r--backends/platform/iphone/iphone_video.m1
-rw-r--r--backends/platform/maemo/debian/changelog227
-rw-r--r--backends/platform/maemo/debian/compat1
-rw-r--r--backends/platform/maemo/debian/control51
-rw-r--r--backends/platform/maemo/debian/copyright22
-rw-r--r--backends/platform/maemo/debian/postinst25
-rwxr-xr-xbackends/platform/maemo/debian/rules71
-rw-r--r--backends/platform/maemo/debian/scummvm.dirs8
-rw-r--r--backends/platform/maemo/maemo-common.h56
-rw-r--r--backends/platform/maemo/maemo.cpp113
-rw-r--r--backends/platform/maemo/maemo.h56
-rw-r--r--backends/platform/maemo/main.cpp52
-rw-r--r--backends/platform/maemo/module.mk13
-rw-r--r--backends/platform/maemo/scummvm-1.1.0-maemo.patch1371
-rw-r--r--backends/platform/n64/Makefile1
-rw-r--r--backends/platform/n64/README.N641
-rw-r--r--backends/platform/n64/framfs_save_manager.cpp1
-rw-r--r--backends/platform/n64/framfs_save_manager.h1
-rw-r--r--backends/platform/n64/n64.mk1
-rw-r--r--backends/platform/n64/nintendo64.cpp1
-rw-r--r--backends/platform/n64/osys_n64.h1
-rw-r--r--backends/platform/n64/osys_n64_base.cpp1
-rw-r--r--backends/platform/n64/osys_n64_events.cpp1
-rw-r--r--backends/platform/n64/osys_n64_utilities.cpp1
-rwxr-xr-xbackends/platform/n64/pad_rom.sh1
-rw-r--r--backends/platform/n64/pakfs_save_manager.cpp1
-rw-r--r--backends/platform/n64/pakfs_save_manager.h1
-rw-r--r--backends/platform/n64/portdefs.h1
-rwxr-xr-xbackends/platform/openpandora/build/PXML.xml83
-rw-r--r--backends/platform/openpandora/build/PXML_schema.xsd341
-rwxr-xr-xbackends/platform/openpandora/build/pnd_make.sh340
-rwxr-xr-xbackends/platform/openpandora/build/runscummvm.sh2
-rw-r--r--backends/platform/openpandora/op-backend.cpp112
-rwxr-xr-xbackends/platform/openpandora/op-bundle.mk3
-rw-r--r--backends/platform/openpandora/op-main.cpp2
-rw-r--r--backends/platform/openpandora/op-options.cpp8
-rw-r--r--backends/platform/openpandora/op-options.h2
-rw-r--r--backends/platform/openpandora/op-sdl.h2
-rw-r--r--backends/platform/ps2/DmaPipe.h1
-rw-r--r--backends/platform/ps2/Gs2dScreen.cpp2
-rw-r--r--backends/platform/ps2/Makefile.gdb1
-rw-r--r--backends/platform/ps2/Makefile.ps21
-rw-r--r--backends/platform/ps2/asyncfio.cpp1
-rw-r--r--backends/platform/ps2/asyncfio.h1
-rw-r--r--backends/platform/ps2/eecodyvdfs.c2
-rw-r--r--backends/platform/ps2/eecodyvdfs.h1
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h1
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c1
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h1
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c1
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h1
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/imports.lst2
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c2
-rw-r--r--backends/platform/ps2/iop/rpckbd/src/imports.lst1
-rw-r--r--backends/platform/ps2/irxboot.cpp1
-rw-r--r--backends/platform/ps2/irxboot.h1
-rw-r--r--backends/platform/ps2/ps2debug.cpp1
-rw-r--r--backends/platform/ps2/ps2debug.h1
-rw-r--r--backends/platform/ps2/ps2input.cpp2
-rw-r--r--backends/platform/ps2/ps2input.h1
-rw-r--r--backends/platform/ps2/ps2mutex.cpp1
-rw-r--r--backends/platform/ps2/ps2pad.cpp2
-rw-r--r--backends/platform/ps2/ps2pad.h1
-rw-r--r--backends/platform/ps2/rpckbd.c1
-rw-r--r--backends/platform/ps2/rpckbd.h1
-rw-r--r--backends/platform/ps2/sdlkeys.h2
-rw-r--r--backends/platform/ps2/systemps2.cpp4
-rw-r--r--backends/platform/psp/Makefile1
-rw-r--r--backends/platform/psp/README.PSP3
-rw-r--r--backends/platform/psp/README.PSP.in1
-rw-r--r--backends/platform/psp/display_manager.cpp3
-rw-r--r--backends/platform/psp/dummy.cpp2
-rw-r--r--backends/platform/psp/image_viewer.cpp4
-rw-r--r--backends/platform/psp/image_viewer.h2
-rw-r--r--backends/platform/psp/input.cpp2
-rw-r--r--backends/platform/psp/memory.h2
-rw-r--r--backends/platform/psp/mp3.cpp6
-rw-r--r--backends/platform/psp/mp3.h4
-rw-r--r--backends/platform/psp/png_loader.cpp10
-rw-r--r--backends/platform/psp/png_loader.h4
-rw-r--r--backends/platform/psp/portdefs.h2
-rw-r--r--backends/platform/psp/powerman.cpp2
-rw-r--r--backends/platform/psp/pspkeyboard.cpp2
-rw-r--r--backends/platform/psp/rtc.cpp3
-rw-r--r--backends/platform/psp/thread.cpp1
-rw-r--r--backends/platform/psp/thread.h2
-rw-r--r--backends/platform/psp/trace.cpp1
-rwxr-xr-xbackends/platform/sdl/macosx/appmenu_osx.h32
-rwxr-xr-xbackends/platform/sdl/macosx/appmenu_osx.mm110
-rw-r--r--backends/platform/sdl/macosx/macosx.cpp65
-rw-r--r--backends/platform/sdl/macosx/macosx.h2
-rw-r--r--backends/platform/sdl/main.cpp3
-rw-r--r--backends/platform/sdl/module.mk9
-rw-r--r--backends/platform/sdl/posix/posix-main.cpp2
-rw-r--r--backends/platform/sdl/ps3/ps3-main.cpp49
-rw-r--r--backends/platform/sdl/ps3/ps3.cpp94
-rw-r--r--backends/platform/sdl/ps3/ps3.h47
-rw-r--r--backends/platform/sdl/sdl-sys.h23
-rw-r--r--backends/platform/sdl/sdl.cpp82
-rw-r--r--backends/platform/sdl/sdl.h6
-rw-r--r--backends/platform/sdl/win32/win32.cpp116
-rw-r--r--backends/platform/sdl/win32/win32.h2
-rw-r--r--backends/platform/symbian/.placeholder2
-rw-r--r--backends/platform/symbian/BuildPackageUpload_AllVersions.pl2
-rw-r--r--backends/platform/symbian/README12
-rw-r--r--backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg2
-rw-r--r--backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in6
-rw-r--r--backends/platform/symbian/S60v3/ScummVM_Loc.rss1
-rw-r--r--backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in6
-rw-r--r--backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg5
-rw-r--r--backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg88
-rw-r--r--backends/platform/symbian/S60v3/scummvm_A0000658_loc.rss1
-rw-r--r--backends/platform/symbian/S60v3/scummvm_A0000658_reg.rss1
-rw-r--r--backends/platform/symbian/S60v3/scummvm_reg.rss1
-rw-r--r--backends/platform/symbian/S80/ScummVM_S80.mmp.in1
-rw-r--r--backends/platform/symbian/S90/Scummvm_S90.mmp.in1
-rw-r--r--backends/platform/symbian/UIQ2/ScummVM.rss1
-rw-r--r--backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in1
-rw-r--r--backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2_SE.pkg2
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM.rss1
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_A0000658.rss1
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in6
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in6
-rw-r--r--backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg6
-rw-r--r--backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg86
-rw-r--r--backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss1
-rw-r--r--backends/platform/symbian/UIQ3/scummvm_A0000658_reg.rss1
-rw-r--r--backends/platform/symbian/UIQ3/scummvm_loc.rss1
-rw-r--r--backends/platform/symbian/UIQ3/scummvm_reg.rss1
-rw-r--r--backends/platform/symbian/mmp/scummvm_agi.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_agos.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_base.mmp.in4
-rw-r--r--backends/platform/symbian/mmp/scummvm_cine.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_cruise.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_draci.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_drascula.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_gob.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_groovie.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_hugo.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_kyra.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_lure.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_m4.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_made.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_mohawk.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_parallaction.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_queen.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_saga.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_sci.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_scumm.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_sky.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_sword1.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_sword2.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_teenagent.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_tinsel.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_toon.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_touche.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_tsage.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_tucker.mmp.in2
-rw-r--r--backends/platform/symbian/res/ScummVmAif.rss3
-rw-r--r--backends/platform/symbian/src/ScummApp.cpp2
-rw-r--r--backends/platform/symbian/src/ScummApp.h2
-rw-r--r--backends/platform/symbian/src/portdefs.h6
-rw-r--r--backends/platform/webos/webos.mk21
-rw-r--r--backends/platform/wii/gdb.txt1
-rw-r--r--backends/platform/wii/main.cpp1
-rw-r--r--backends/platform/wii/module.mk1
-rw-r--r--backends/platform/wii/options.cpp1
-rw-r--r--backends/platform/wii/options.h1
-rw-r--r--backends/platform/wii/osystem_events.cpp1
-rw-r--r--backends/platform/wii/osystem_gfx.cpp2
-rw-r--r--backends/platform/wii/osystem_sfx.cpp1
-rw-r--r--backends/platform/wii/wii.mk1
-rw-r--r--backends/platform/wince/CEActionsPocket.cpp14
-rw-r--r--backends/platform/wince/CEActionsSmartphone.cpp14
-rw-r--r--backends/platform/wince/CELauncherDialog.cpp6
-rw-r--r--backends/platform/wince/CEScaler.cpp1
-rw-r--r--backends/platform/wince/CEgui/CEGUI.h1
-rw-r--r--backends/platform/wince/CEgui/PanelKeyboard.cpp1
-rw-r--r--backends/platform/wince/CEkeys/CEKeys.h1
-rw-r--r--backends/platform/wince/CEkeys/EventsBuffer.cpp2
-rw-r--r--backends/platform/wince/README-WinCE.txt45
-rw-r--r--backends/platform/wince/missing/assert.h1
-rw-r--r--backends/platform/wince/missing/io.h1
-rw-r--r--backends/platform/wince/wince-sdl.cpp86
-rw-r--r--backends/platform/wince/wince-sdl.h1
-rw-r--r--backends/platform/wince/wince.mk4
-rw-r--r--backends/plugins/ds/ds-provider.cpp1
-rw-r--r--backends/plugins/ds/ds-provider.h1
-rw-r--r--backends/plugins/elf/arm-loader.cpp1
-rw-r--r--backends/plugins/elf/arm-loader.h1
-rw-r--r--backends/plugins/elf/elf-loader.cpp1
-rw-r--r--backends/plugins/elf/elf-loader.h1
-rw-r--r--backends/plugins/elf/elf-provider.cpp1
-rw-r--r--backends/plugins/elf/elf-provider.h1
-rw-r--r--backends/plugins/elf/elf32.h1
-rw-r--r--backends/plugins/elf/memory-manager.cpp3
-rw-r--r--backends/plugins/elf/mips-loader.cpp1
-rw-r--r--backends/plugins/elf/mips-loader.h1
-rw-r--r--backends/plugins/elf/ppc-loader.cpp1
-rw-r--r--backends/plugins/elf/ppc-loader.h1
-rw-r--r--backends/plugins/elf/shorts-segment-manager.cpp4
-rw-r--r--backends/plugins/elf/shorts-segment-manager.h1
-rw-r--r--backends/plugins/elf/version.cpp1
-rw-r--r--backends/plugins/elf/version.h1
-rw-r--r--backends/plugins/ps2/ps2-provider.cpp1
-rw-r--r--backends/plugins/ps2/ps2-provider.h1
-rw-r--r--backends/plugins/psp/psp-provider.cpp1
-rw-r--r--backends/plugins/psp/psp-provider.h1
-rw-r--r--backends/plugins/wii/wii-provider.cpp1
-rw-r--r--backends/plugins/wii/wii-provider.h1
-rw-r--r--backends/saves/psp/psp-saves.cpp1
-rw-r--r--backends/taskbar/unity/unity-taskbar.cpp13
-rw-r--r--backends/taskbar/unity/unity-taskbar.h12
-rw-r--r--backends/taskbar/win32/mingw-compat.h21
-rw-r--r--backends/taskbar/win32/win32-taskbar.cpp166
-rw-r--r--backends/taskbar/win32/win32-taskbar.h14
-rwxr-xr-xbackends/timer/bada/timer.cpp115
-rwxr-xr-xbackends/timer/bada/timer.h62
-rw-r--r--backends/timer/default/default-timer.cpp36
-rw-r--r--backends/timer/default/default-timer.h7
-rw-r--r--backends/updates/macosx/macosx-updates.h48
-rw-r--r--backends/updates/macosx/macosx-updates.mm127
-rw-r--r--backends/vkeybd/virtual-keyboard-parser.cpp6
-rw-r--r--backends/vkeybd/virtual-keyboard.cpp1
-rw-r--r--base/commandLine.cpp35
-rw-r--r--base/internal_version.h2
-rw-r--r--base/main.cpp21
-rw-r--r--base/plugins.cpp10
-rw-r--r--base/version.cpp1
-rw-r--r--common/EventDispatcher.cpp30
-rw-r--r--common/EventRecorder.cpp119
-rw-r--r--common/EventRecorder.h6
-rw-r--r--common/algorithm.h5
-rw-r--r--common/archive.cpp7
-rw-r--r--common/archive.h2
-rw-r--r--common/array.h4
-rw-r--r--common/bitstream.h325
-rw-r--r--common/config-file.cpp29
-rw-r--r--common/config-file.h2
-rw-r--r--common/config-manager.cpp21
-rw-r--r--common/config-manager.h8
-rw-r--r--common/cosinetables.cpp8274
-rw-r--r--common/cosinetables.h37
-rw-r--r--common/dcl.cpp11
-rw-r--r--common/dcl.h1
-rw-r--r--common/dct.cpp208
-rw-r--r--common/dct.h76
-rw-r--r--common/debug.cpp5
-rw-r--r--common/events.h42
-rw-r--r--common/fft.cpp243
-rw-r--r--common/fft.h78
-rw-r--r--common/file.cpp2
-rw-r--r--common/file.h2
-rw-r--r--common/forbidden.h7
-rw-r--r--common/fs.cpp18
-rw-r--r--common/func.h5
-rw-r--r--common/hashmap.h11
-rw-r--r--common/huffman.cpp86
-rw-r--r--common/huffman.h82
-rw-r--r--common/iff_container.cpp6
-rw-r--r--common/iff_container.h28
-rw-r--r--common/keyboard.h2
-rw-r--r--common/localization.cpp66
-rw-r--r--common/localization.h52
-rw-r--r--common/macresman.cpp1
-rw-r--r--common/math.h128
-rw-r--r--common/memorypool.cpp1
-rw-r--r--common/module.mk11
-rw-r--r--common/ptr.h41
-rw-r--r--common/quicktime.cpp35
-rw-r--r--common/quicktime.h31
-rw-r--r--common/rational.cpp4
-rw-r--r--common/rdft.cpp102
-rw-r--r--common/rdft.h70
-rw-r--r--common/scummsys.h2
-rw-r--r--common/serializer.h8
-rw-r--r--common/sinetables.cpp8274
-rw-r--r--common/sinetables.h37
-rw-r--r--common/singleton.h6
-rw-r--r--common/str.cpp6
-rw-r--r--common/str.h8
-rw-r--r--common/stream.cpp9
-rw-r--r--common/substream.h11
-rw-r--r--common/system.cpp9
-rw-r--r--common/system.h33
-rw-r--r--common/taskbar.h14
-rw-r--r--common/timer.h4
-rw-r--r--common/tokenizer.cpp1
-rw-r--r--common/translation.cpp16
-rw-r--r--common/unarj.cpp20
-rw-r--r--common/unzip.cpp8
-rw-r--r--common/updates.h102
-rw-r--r--common/util.cpp78
-rw-r--r--common/util.h77
-rw-r--r--common/winexe_pe.cpp2
-rw-r--r--common/xmlparser.cpp12
-rw-r--r--common/xmlparser.h5
-rw-r--r--common/zlib.cpp55
-rw-r--r--common/zlib.h9
-rwxr-xr-xconfigure510
-rw-r--r--devtools/convbdf.c6
-rw-r--r--devtools/create_drascula/Makefile4
-rw-r--r--devtools/create_drascula/dists/msvc8/create_drascula.sln20
-rw-r--r--devtools/create_drascula/dists/msvc8/create_drascula.vcproj191
-rw-r--r--devtools/create_drascula/dists/msvc8_to_msvc9.bat32
-rw-r--r--devtools/create_drascula/dists/msvc9/create_drascula.sln20
-rw-r--r--devtools/create_drascula/dists/msvc9/create_drascula.vcproj192
-rw-r--r--devtools/create_drascula/dists/msvc9_to_msvc8.bat33
-rw-r--r--devtools/create_hugo/README1
-rw-r--r--devtools/create_hugo/dists/msvc10/create_hugo.sln20
-rw-r--r--devtools/create_hugo/dists/msvc10/create_hugo.vcxproj113
-rw-r--r--devtools/create_hugo/dists/msvc9/create_hugo.sln20
-rw-r--r--devtools/create_hugo/dists/msvc9/create_hugo.vcproj219
-rw-r--r--devtools/create_hugo/staticdata.h1
-rw-r--r--devtools/create_kyradat/create_kyradat.cpp18
-rw-r--r--devtools/create_kyradat/create_kyradat.h4
-rw-r--r--devtools/create_kyradat/extract.cpp125
-rw-r--r--devtools/create_kyradat/extract.h1
-rw-r--r--devtools/create_kyradat/games.cpp96
-rw-r--r--devtools/create_kyradat/search.cpp1
-rw-r--r--devtools/create_kyradat/search.h1
-rw-r--r--devtools/create_kyradat/tables.cpp81
-rw-r--r--devtools/create_kyradat/tables.h1
-rw-r--r--devtools/create_kyradat/util.cpp1
-rw-r--r--devtools/create_lure/Makefile4
-rw-r--r--devtools/create_lure/dists/msvc8/create_lure.sln20
-rw-r--r--devtools/create_lure/dists/msvc8/create_lure.vcproj222
-rw-r--r--devtools/create_lure/dists/msvc8_to_msvc9.bat32
-rw-r--r--devtools/create_lure/dists/msvc9/create_lure.sln20
-rw-r--r--devtools/create_lure/dists/msvc9/create_lure.vcproj223
-rw-r--r--devtools/create_lure/dists/msvc9_to_msvc8.bat33
-rw-r--r--devtools/create_mads/Makefile4
-rw-r--r--devtools/create_mads/dists/msvc9/create_mads.sln20
-rw-r--r--devtools/create_mads/dists/msvc9/create_mads.vcproj187
-rw-r--r--devtools/create_mads/main.cpp2
-rw-r--r--devtools/create_mads/scripts/rex_nebular.txt2
-rw-r--r--devtools/create_project/codeblocks.cpp32
-rw-r--r--devtools/create_project/codeblocks.h2
-rw-r--r--devtools/create_project/create_project.cpp180
-rw-r--r--devtools/create_project/create_project.h21
-rw-r--r--devtools/create_project/msbuild.cpp69
-rw-r--r--devtools/create_project/msbuild.h4
-rw-r--r--devtools/create_project/msvc.cpp35
-rw-r--r--devtools/create_project/msvc.h2
-rw-r--r--devtools/create_project/msvc10/create_project.vcxproj22
-rw-r--r--devtools/create_project/msvc10/create_project.vcxproj.filters2
-rw-r--r--devtools/create_project/scripts/installer.vbs5
-rw-r--r--devtools/create_project/scripts/postbuild.cmd18
-rw-r--r--devtools/create_project/visualstudio.cpp53
-rw-r--r--devtools/create_project/visualstudio.h6
-rw-r--r--devtools/create_toon/create_toon.cpp7
-rw-r--r--devtools/create_toon/create_toon.h6
-rw-r--r--devtools/create_toon/dists/msvc9/create_toon.sln20
-rw-r--r--devtools/create_toon/dists/msvc9/create_toon.vcproj187
-rw-r--r--devtools/create_toon/staticdata.h1
-rwxr-xr-xdevtools/credits.pl1287
-rw-r--r--devtools/sci/musicplayer.cpp2
-rw-r--r--devtools/sci/scitrace.asm1
-rw-r--r--devtools/scumm-md5.txt6
-rw-r--r--devtools/skycpt/AsciiCptCompile.sln21
-rw-r--r--devtools/skycpt/AsciiCptCompile.vcproj402
-rw-r--r--devtools/skycpt/KmpSearch.h2
-rw-r--r--devtools/skycpt/skycpt-engine.patch1
-rw-r--r--devtools/tasmrecover/.gitignore1
-rw-r--r--devtools/tasmrecover/dreamweb/backdrop.asm24
-rw-r--r--devtools/tasmrecover/dreamweb/dreamweb.asm36
-rw-r--r--devtools/tasmrecover/dreamweb/keypad.asm8
-rw-r--r--devtools/tasmrecover/dreamweb/look.asm6
-rw-r--r--devtools/tasmrecover/dreamweb/monitor.asm23
-rw-r--r--devtools/tasmrecover/dreamweb/newplace.asm18
-rw-r--r--devtools/tasmrecover/dreamweb/object.asm25
-rw-r--r--devtools/tasmrecover/dreamweb/print.asm5
-rw-r--r--devtools/tasmrecover/dreamweb/saveload.asm5
-rw-r--r--devtools/tasmrecover/dreamweb/sblaster.asm30
-rw-r--r--devtools/tasmrecover/dreamweb/sprite.asm20
-rw-r--r--devtools/tasmrecover/dreamweb/talk.asm22
-rw-r--r--devtools/tasmrecover/dreamweb/titles.asm13
-rw-r--r--devtools/tasmrecover/dreamweb/use.asm56
-rw-r--r--devtools/tasmrecover/dreamweb/vars.asm3
-rw-r--r--devtools/tasmrecover/dreamweb/vgafades.asm2
-rw-r--r--devtools/tasmrecover/dreamweb/vgagrafx.asm2
-rwxr-xr-xdevtools/tasmrecover/tasm-recover192
-rw-r--r--devtools/tasmrecover/tasm/cpp.py92
-rw-r--r--devtools/tasmrecover/tasm/lex.py21
-rw-r--r--devtools/tasmrecover/tasm/op.py22
-rw-r--r--devtools/tasmrecover/tasm/parser.py21
-rw-r--r--devtools/tasmrecover/tasm/proc.py21
-rw-r--r--devtools/themeparser.py1
-rwxr-xr-xdevtools/update-version.pl2
-rw-r--r--dists/android/AndroidManifest.xml6
-rw-r--r--dists/android/AndroidManifest.xml.in4
-rw-r--r--dists/android/README.Android1
-rwxr-xr-xdists/android/mkplugin.sh1
-rw-r--r--dists/android/plugin-manifest.xml6
-rw-r--r--dists/android/plugin-manifest.xml.in4
-rw-r--r--dists/android/plugin-strings.xml1
-rw-r--r--dists/android/res/layout/main.xml1
-rw-r--r--dists/bada/Icons/mainMenu1.pngbin0 -> 16408 bytes
-rw-r--r--dists/bada/Icons/mainMenu2.pngbin0 -> 7302 bytes
-rw-r--r--dists/bada/Icons/splash1.pngbin0 -> 90434 bytes
-rw-r--r--dists/bada/Icons/splash2.pngbin0 -> 34816 bytes
-rw-r--r--dists/bada/Res/scummmobile/THEMERC1
-rw-r--r--dists/bada/Res/scummmobile/checkbox.bmpbin0 -> 774 bytes
-rw-r--r--dists/bada/Res/scummmobile/checkbox_empty.bmpbin0 -> 774 bytes
-rw-r--r--dists/bada/Res/scummmobile/clR6x12-iso-8859-2.fccbin0 -> 6403 bytes
-rw-r--r--dists/bada/Res/scummmobile/clR6x12-iso-8859-5.fccbin0 -> 6403 bytes
-rw-r--r--dists/bada/Res/scummmobile/cursor.bmpbin0 -> 3126 bytes
-rw-r--r--dists/bada/Res/scummmobile/cursor_small.bmpbin0 -> 1062 bytes
-rw-r--r--dists/bada/Res/scummmobile/fixed5x8-iso-8859-2.fccbin0 -> 4619 bytes
-rw-r--r--dists/bada/Res/scummmobile/fixed5x8-iso-8859-5.fccbin0 -> 3985 bytes
-rw-r--r--dists/bada/Res/scummmobile/helvB14-ASCII.fccbin0 -> 7285 bytes
-rw-r--r--dists/bada/Res/scummmobile/helvB14.bdf16308
-rw-r--r--dists/bada/Res/scummmobile/helvB18-ASCII.fccbin0 -> 9823 bytes
-rw-r--r--dists/bada/Res/scummmobile/helvB18.bdf19752
-rw-r--r--dists/bada/Res/scummmobile/helvB24-ASCII.fccbin0 -> 15057 bytes
-rw-r--r--dists/bada/Res/scummmobile/helvB24.bdf24371
-rw-r--r--dists/bada/Res/scummmobile/helvb12-iso-8859-1.fccbin0 -> 5615 bytes
-rw-r--r--dists/bada/Res/scummmobile/helvb12-iso-8859-2.fccbin0 -> 5727 bytes
-rw-r--r--dists/bada/Res/scummmobile/helvb12-iso-8859-5.fccbin0 -> 5234 bytes
-rw-r--r--dists/bada/Res/scummmobile/logo.bmpbin0 -> 69174 bytes
-rw-r--r--dists/bada/Res/scummmobile/logo_small.bmpbin0 -> 17334 bytes
-rw-r--r--dists/bada/Res/scummmobile/radiobutton.bmpbin0 -> 774 bytes
-rw-r--r--dists/bada/Res/scummmobile/radiobutton_empty.bmpbin0 -> 774 bytes
-rw-r--r--dists/bada/Res/scummmobile/scummmobile_gfx.stx671
-rw-r--r--dists/bada/Res/scummmobile/scummmobile_layout.stx861
-rw-r--r--dists/bada/Res/scummmobile/search.bmpbin0 -> 872 bytes
-rw-r--r--dists/bada/Res/vkeybd_bada/lowercase-symbols800x399.bmpbin0 -> 957654 bytes
-rw-r--r--dists/bada/Res/vkeybd_bada/lowercase800x399.bmpbin0 -> 957654 bytes
-rw-r--r--dists/bada/Res/vkeybd_bada/uppercase-symbols800x399.bmpbin0 -> 957654 bytes
-rw-r--r--dists/bada/Res/vkeybd_bada/uppercase800x399.bmpbin0 -> 957654 bytes
-rw-r--r--dists/bada/Res/vkeybd_bada/vkeybd_bada.xml637
-rw-r--r--dists/engine-data/README2
-rw-r--r--dists/engine-data/kyra.datbin356433 -> 385091 bytes
-rw-r--r--dists/iphone/Info.plist4
-rw-r--r--dists/irix/scummvm.spec2
-rw-r--r--dists/macosx/Info.plist29
-rw-r--r--dists/macosx/Info.plist.in23
-rwxr-xr-xdists/macosx/scummvm_osx_appcast.xml25
-rw-r--r--dists/maemo/scummvm.servicewrapper1
-rw-r--r--dists/motomagx/mgx/readme-motomagx-mgx.txt1
-rw-r--r--dists/motomagx/mgx/scummvm.cfg2
-rw-r--r--dists/motomagx/pep/description.ini1
-rw-r--r--dists/msvc10/create_msvc10.bat11
-rw-r--r--dists/msvc8/create_msvc8.bat11
-rw-r--r--dists/msvc9/create_msvc9.bat11
-rw-r--r--dists/nsis/graphics/scummvm-install.icobin15086 -> 0 bytes
-rw-r--r--dists/os2/readme.os22
-rw-r--r--dists/ps3/ICON0.PNGbin0 -> 43210 bytes
-rw-r--r--dists/ps3/PIC1.PNGbin0 -> 3193068 bytes
-rw-r--r--dists/ps3/readme-ps3.md49
-rw-r--r--dists/ps3/sfo.xml33
-rw-r--r--dists/redhat/scummvm-tools.spec2
-rw-r--r--dists/redhat/scummvm.spec7
-rw-r--r--dists/redhat/scummvm.spec.in5
-rw-r--r--dists/scummvm.rc14
-rw-r--r--dists/scummvm.rc.in6
-rwxr-xr-xdists/slackware/scummvm.SlackBuild2
-rw-r--r--dists/wii/READMII1
-rw-r--r--dists/wii/meta.xml3
-rw-r--r--dists/wii/meta.xml.in1
-rw-r--r--dists/win32/ScummVM.iss52
-rw-r--r--dists/win32/graphics/left.bmp (renamed from dists/nsis/graphics/left.bmp)bin154542 -> 154542 bytes
-rw-r--r--dists/win32/graphics/scummvm-install.icobin0 -> 77799 bytes
-rw-r--r--dists/win32/plugins/Games.dllbin0 -> 105472 bytes
-rw-r--r--dists/win32/scummvm.gdf.xml44
-rw-r--r--dists/win32/scummvm.nsi (renamed from dists/nsis/scummvm.nsi)151
-rw-r--r--dists/win32/scummvm.nsi.in (renamed from dists/nsis/scummvm.nsi.in)147
-rw-r--r--[-rwxr-xr-x]doc/QuickStart (renamed from doc/translations/README-translation_template.txt)5
-rw-r--r--doc/cz/PrectiMe1576
-rw-r--r--doc/de/Liesmich2307
-rw-r--r--doc/de/Neues1610
-rw-r--r--doc/de/Schnellstart176
-rw-r--r--doc/es/Inicio rápido161
-rw-r--r--[-rwxr-xr-x]doc/fr/DemarrageRapide (renamed from doc/translations/README-fr.txt)13
-rw-r--r--doc/he/bink-md5s.txt28
-rw-r--r--doc/he/md5s.txt2861
-rw-r--r--doc/he/smacker-md5s.txt46
-rw-r--r--doc/he/u32.txt39
-rw-r--r--doc/he/versions.html754
-rw-r--r--doc/it/GuidaRapida161
-rw-r--r--doc/no-nb/HurtigStart156
-rwxr-xr-xdoc/translations/README-de.txt178
-rw-r--r--engines/advancedDetector.cpp8
-rw-r--r--engines/advancedDetector.h10
-rw-r--r--engines/agi/agi.cpp63
-rw-r--r--engines/agi/agi.h275
-rw-r--r--engines/agi/checks.cpp30
-rw-r--r--engines/agi/console.cpp34
-rw-r--r--engines/agi/console.h32
-rw-r--r--engines/agi/cycle.cpp7
-rw-r--r--engines/agi/detection.cpp47
-rw-r--r--engines/agi/detection_tables.h137
-rw-r--r--engines/agi/graphics.cpp1
-rw-r--r--engines/agi/id.cpp18
-rw-r--r--engines/agi/keyboard.cpp19
-rw-r--r--engines/agi/loader_v1.cpp329
-rw-r--r--engines/agi/module.mk3
-rw-r--r--engines/agi/motion.cpp28
-rw-r--r--engines/agi/objects.cpp47
-rw-r--r--engines/agi/op_cmd.cpp1503
-rw-r--r--engines/agi/op_dbg.cpp255
-rw-r--r--engines/agi/op_test.cpp435
-rw-r--r--engines/agi/opcodes.cpp381
-rw-r--r--engines/agi/opcodes.h246
-rw-r--r--engines/agi/preagi.cpp244
-rw-r--r--engines/agi/preagi.h29
-rw-r--r--engines/agi/preagi_common.cpp205
-rw-r--r--engines/agi/preagi_mickey.cpp1062
-rw-r--r--engines/agi/preagi_mickey.h18
-rw-r--r--engines/agi/preagi_troll.cpp304
-rw-r--r--engines/agi/preagi_troll.h13
-rw-r--r--engines/agi/preagi_winnie.cpp638
-rw-r--r--engines/agi/preagi_winnie.h15
-rw-r--r--engines/agi/saveload.cpp75
-rw-r--r--engines/agi/sound.cpp27
-rw-r--r--engines/agi/sound.h10
-rw-r--r--engines/agi/sound_2gs.cpp2
-rw-r--r--engines/agi/sound_2gs.h2
-rw-r--r--engines/agi/sound_coco3.cpp2
-rw-r--r--engines/agi/sound_coco3.h2
-rw-r--r--engines/agi/sound_midi.cpp2
-rw-r--r--engines/agi/sound_midi.h2
-rw-r--r--engines/agi/sound_pcjr.cpp166
-rw-r--r--engines/agi/sound_pcjr.h17
-rw-r--r--engines/agi/sound_sarien.cpp2
-rw-r--r--engines/agi/sound_sarien.h2
-rw-r--r--engines/agi/sprite.cpp29
-rw-r--r--engines/agi/text.cpp52
-rw-r--r--engines/agi/view.cpp57
-rw-r--r--engines/agi/view.h66
-rw-r--r--engines/agi/wagparser.cpp4
-rw-r--r--engines/agi/words.cpp140
-rw-r--r--engines/agos/agos.cpp97
-rw-r--r--engines/agos/agos.h49
-rw-r--r--engines/agos/animation.cpp12
-rw-r--r--engines/agos/animation.h2
-rw-r--r--engines/agos/charset-fontdata.cpp3
-rw-r--r--engines/agos/charset.cpp4
-rw-r--r--engines/agos/contain.cpp2
-rw-r--r--engines/agos/cursor.cpp4
-rw-r--r--engines/agos/debug.cpp27
-rw-r--r--engines/agos/debug.h1
-rw-r--r--engines/agos/debugger.cpp8
-rw-r--r--engines/agos/detection.cpp33
-rw-r--r--engines/agos/detection_tables.h416
-rw-r--r--engines/agos/draw.cpp3
-rw-r--r--engines/agos/event.cpp2
-rw-r--r--engines/agos/feeble.cpp4
-rw-r--r--engines/agos/gfx.cpp3
-rw-r--r--engines/agos/icons.cpp2
-rw-r--r--engines/agos/input.cpp11
-rw-r--r--engines/agos/input_pn.cpp2
-rw-r--r--engines/agos/installshield_cab.cpp221
-rw-r--r--engines/agos/installshield_cab.h41
-rw-r--r--engines/agos/intern.h6
-rw-r--r--engines/agos/items.cpp2
-rw-r--r--engines/agos/menus.cpp2
-rw-r--r--engines/agos/midi.cpp5
-rw-r--r--engines/agos/midiparser_s1d.cpp207
-rw-r--r--engines/agos/module.mk1
-rw-r--r--engines/agos/oracle.cpp1
-rw-r--r--engines/agos/res.cpp143
-rw-r--r--engines/agos/res_ami.cpp2
-rw-r--r--engines/agos/res_snd.cpp68
-rw-r--r--engines/agos/rooms.cpp4
-rw-r--r--engines/agos/saveload.cpp9
-rw-r--r--engines/agos/script.cpp3
-rw-r--r--engines/agos/script_dp.cpp2
-rw-r--r--engines/agos/script_pn.cpp9
-rw-r--r--engines/agos/script_s1.cpp33
-rw-r--r--engines/agos/script_s2.cpp5
-rw-r--r--engines/agos/script_ww.cpp2
-rw-r--r--engines/agos/sound.cpp14
-rw-r--r--engines/agos/sound.h4
-rw-r--r--engines/agos/string.cpp3
-rw-r--r--engines/agos/string_pn.cpp2
-rw-r--r--engines/agos/subroutine.cpp22
-rw-r--r--engines/agos/verb.cpp1
-rw-r--r--engines/agos/verb_pn.cpp2
-rw-r--r--engines/agos/vga.cpp1
-rw-r--r--engines/agos/vga_e2.cpp1
-rw-r--r--engines/agos/vga_s2.cpp17
-rw-r--r--engines/agos/window.cpp1
-rw-r--r--engines/agos/zones.cpp2
-rw-r--r--engines/cge/bitmap.cpp392
-rw-r--r--engines/cge/bitmap.h88
-rw-r--r--engines/cge/cge.cpp220
-rw-r--r--engines/cge/cge.h339
-rw-r--r--engines/cge/cge_main.cpp1579
-rw-r--r--engines/cge/cge_main.h114
-rw-r--r--engines/cge/console.cpp34
-rw-r--r--engines/cge/console.h (renamed from engines/agi/preagi_common.h)32
-rw-r--r--engines/cge/detection.cpp238
-rw-r--r--engines/cge/events.cpp378
-rw-r--r--engines/cge/events.h154
-rw-r--r--engines/cge/fileio.cpp240
-rw-r--r--engines/cge/fileio.h120
-rw-r--r--engines/cge/game.cpp54
-rw-r--r--engines/cge/game.h53
-rw-r--r--engines/cge/general.h43
-rw-r--r--engines/cge/module.mk30
-rw-r--r--engines/cge/snail.cpp1254
-rw-r--r--engines/cge/snail.h85
-rw-r--r--engines/cge/sound.cpp290
-rw-r--r--engines/cge/sound.h136
-rw-r--r--engines/cge/talk.cpp292
-rw-r--r--engines/cge/talk.h76
-rw-r--r--engines/cge/text.cpp205
-rw-r--r--engines/cge/text.h66
-rw-r--r--engines/cge/vga13h.cpp1009
-rw-r--r--engines/cge/vga13h.h243
-rw-r--r--engines/cge/vmenu.cpp142
-rw-r--r--engines/cge/vmenu.h73
-rw-r--r--engines/cge/walk.cpp273
-rw-r--r--engines/cge/walk.h87
-rw-r--r--engines/cine/detection.cpp4
-rw-r--r--engines/cine/detection_tables.h68
-rw-r--r--engines/cine/prc.cpp4
-rw-r--r--engines/cine/texte.cpp40
-rw-r--r--engines/cine/texte.h6
-rw-r--r--engines/cine/various.cpp10
-rw-r--r--engines/composer/composer.cpp527
-rw-r--r--engines/composer/composer.h215
-rw-r--r--engines/composer/detection.cpp284
-rw-r--r--engines/composer/graphics.cpp774
-rw-r--r--engines/composer/graphics.h71
-rw-r--r--engines/composer/module.mk16
-rw-r--r--engines/composer/resource.cpp337
-rw-r--r--engines/composer/resource.h124
-rw-r--r--engines/composer/scripting.cpp729
-rw-r--r--engines/cruise/cruise.h10
-rw-r--r--engines/cruise/cruise_main.cpp44
-rw-r--r--engines/cruise/detection.cpp53
-rw-r--r--engines/cruise/mainDraw.cpp8
-rw-r--r--engines/cruise/module.mk1
-rw-r--r--engines/cruise/saveload.cpp7
-rw-r--r--engines/cruise/script.cpp4
-rw-r--r--engines/cruise/sound.cpp1
-rw-r--r--engines/cruise/sound.h4
-rw-r--r--engines/dialogs.cpp19
-rw-r--r--engines/draci/detection.cpp59
-rw-r--r--engines/draci/game.cpp2
-rw-r--r--engines/draci/saveload.cpp10
-rw-r--r--engines/draci/script.cpp4
-rw-r--r--engines/draci/sound.cpp13
-rw-r--r--engines/drascula/detection.cpp30
-rw-r--r--engines/drascula/drascula.h8
-rw-r--r--engines/drascula/interface.cpp2
-rw-r--r--engines/drascula/resource.cpp9
-rw-r--r--engines/drascula/saveload.cpp109
-rw-r--r--engines/drascula/sound.cpp1
-rw-r--r--engines/dreamweb/backdrop.cpp333
-rw-r--r--engines/dreamweb/console.cpp3
-rw-r--r--engines/dreamweb/console.h3
-rw-r--r--engines/dreamweb/detection.cpp26
-rw-r--r--engines/dreamweb/detection_tables.h99
-rw-r--r--engines/dreamweb/dreamgen.cpp8175
-rw-r--r--engines/dreamweb/dreamgen.h2246
-rw-r--r--engines/dreamweb/dreamweb.cpp125
-rw-r--r--engines/dreamweb/dreamweb.h18
-rw-r--r--engines/dreamweb/module.mk10
-rw-r--r--engines/dreamweb/object.cpp114
-rw-r--r--engines/dreamweb/pathfind.cpp254
-rw-r--r--engines/dreamweb/print.cpp233
-rw-r--r--engines/dreamweb/runtime.h47
-rw-r--r--engines/dreamweb/saveload.cpp343
-rw-r--r--engines/dreamweb/sprite.cpp907
-rw-r--r--engines/dreamweb/structs.h251
-rw-r--r--engines/dreamweb/stubs.cpp1726
-rw-r--r--engines/dreamweb/stubs.h249
-rw-r--r--engines/dreamweb/use.cpp178
-rw-r--r--engines/dreamweb/vgagrafx.cpp468
-rw-r--r--engines/engine.cpp32
-rw-r--r--engines/engine.h16
-rw-r--r--engines/engines.mk11
-rw-r--r--engines/game.cpp12
-rw-r--r--engines/game.h6
-rw-r--r--engines/gob/anifile.cpp326
-rw-r--r--engines/gob/anifile.h161
-rw-r--r--engines/gob/aniobject.cpp210
-rw-r--r--engines/gob/aniobject.h119
-rw-r--r--engines/gob/console.cpp18
-rw-r--r--engines/gob/console.h1
-rw-r--r--engines/gob/dataio.cpp116
-rw-r--r--engines/gob/dataio.h15
-rw-r--r--engines/gob/decfile.cpp214
-rw-r--r--engines/gob/decfile.h111
-rw-r--r--engines/gob/detection.cpp2
-rw-r--r--engines/gob/detection_tables.h722
-rw-r--r--engines/gob/draw.cpp3
-rw-r--r--engines/gob/draw.h3
-rw-r--r--engines/gob/draw_v1.cpp7
-rw-r--r--engines/gob/draw_v2.cpp4
-rw-r--r--engines/gob/game.cpp9
-rw-r--r--engines/gob/gob.cpp13
-rw-r--r--engines/gob/hotspots.cpp37
-rw-r--r--engines/gob/hotspots.h4
-rw-r--r--engines/gob/init.cpp2
-rw-r--r--engines/gob/init.h11
-rw-r--r--engines/gob/init_geisha.cpp54
-rw-r--r--engines/gob/init_v1.cpp4
-rw-r--r--engines/gob/init_v2.cpp4
-rw-r--r--engines/gob/init_v6.cpp3
-rw-r--r--engines/gob/inter.h44
-rw-r--r--engines/gob/inter_bargon.cpp6
-rw-r--r--engines/gob/inter_geisha.cpp312
-rw-r--r--engines/gob/inter_v1.cpp16
-rw-r--r--engines/gob/inter_v3.cpp35
-rw-r--r--engines/gob/inter_v6.cpp1
-rw-r--r--engines/gob/minigames/geisha/diving.cpp439
-rw-r--r--engines/gob/minigames/geisha/diving.h127
-rw-r--r--engines/gob/minigames/geisha/evilfish.cpp189
-rw-r--r--engines/gob/minigames/geisha/evilfish.h90
-rw-r--r--engines/gob/minigames/geisha/penetration.cpp106
-rw-r--r--engines/gob/minigames/geisha/penetration.h61
-rw-r--r--engines/gob/module.mk10
-rw-r--r--engines/gob/palanim.cpp9
-rw-r--r--engines/gob/rxyfile.cpp82
-rw-r--r--engines/gob/rxyfile.h76
-rw-r--r--engines/gob/save/saveload.h54
-rw-r--r--engines/gob/save/saveload_geisha.cpp215
-rw-r--r--engines/gob/scenery.cpp2
-rw-r--r--engines/gob/sound/sound.cpp10
-rw-r--r--engines/gob/util.cpp45
-rw-r--r--engines/gob/util.h9
-rw-r--r--engines/gob/videoplayer.cpp4
-rw-r--r--engines/gob/videoplayer.h2
-rw-r--r--engines/groovie/detection.cpp30
-rw-r--r--engines/groovie/groovie.cpp3
-rw-r--r--engines/groovie/music.cpp5
-rw-r--r--engines/groovie/music.h2
-rw-r--r--engines/groovie/roq.cpp51
-rw-r--r--engines/groovie/roq.h11
-rw-r--r--engines/groovie/saveload.cpp4
-rw-r--r--engines/groovie/script.cpp9
-rw-r--r--engines/hugo/detection.cpp19
-rw-r--r--engines/hugo/display.cpp1
-rw-r--r--engines/hugo/file.cpp1
-rw-r--r--engines/hugo/file_v1d.cpp3
-rw-r--r--engines/hugo/file_v1w.cpp3
-rw-r--r--engines/hugo/file_v2d.cpp3
-rw-r--r--engines/hugo/file_v2w.cpp1
-rw-r--r--engines/hugo/file_v3d.cpp5
-rw-r--r--engines/hugo/hugo.cpp2
-rw-r--r--engines/hugo/intro.cpp2
-rw-r--r--engines/hugo/object.cpp2
-rw-r--r--engines/hugo/parser.cpp4
-rw-r--r--engines/hugo/schedule.cpp8
-rw-r--r--engines/hugo/sound.cpp132
-rw-r--r--engines/hugo/sound.h12
-rw-r--r--engines/hugo/util.cpp2
-rw-r--r--engines/kyra/animator_hof.cpp1
-rw-r--r--engines/kyra/animator_lok.cpp1
-rw-r--r--engines/kyra/animator_lok.h1
-rw-r--r--engines/kyra/animator_mr.cpp3
-rw-r--r--engines/kyra/animator_v2.cpp1
-rw-r--r--engines/kyra/debugger.cpp10
-rw-r--r--engines/kyra/debugger.h1
-rw-r--r--engines/kyra/detection.cpp16
-rw-r--r--engines/kyra/detection_tables.h349
-rw-r--r--engines/kyra/gui.cpp5
-rw-r--r--engines/kyra/gui.h1
-rw-r--r--engines/kyra/gui_hof.cpp1
-rw-r--r--engines/kyra/gui_hof.h1
-rw-r--r--engines/kyra/gui_lok.cpp15
-rw-r--r--engines/kyra/gui_lok.h1
-rw-r--r--engines/kyra/gui_lol.cpp15
-rw-r--r--engines/kyra/gui_lol.h1
-rw-r--r--engines/kyra/gui_mr.cpp1
-rw-r--r--engines/kyra/gui_mr.h1
-rw-r--r--engines/kyra/gui_v2.cpp10
-rw-r--r--engines/kyra/gui_v2.h1
-rw-r--r--engines/kyra/item.h1
-rw-r--r--engines/kyra/items_hof.cpp1
-rw-r--r--engines/kyra/items_lok.cpp8
-rw-r--r--engines/kyra/items_lol.cpp1
-rw-r--r--engines/kyra/items_mr.cpp1
-rw-r--r--engines/kyra/items_v2.cpp1
-rw-r--r--engines/kyra/kyra_hof.cpp24
-rw-r--r--engines/kyra/kyra_hof.h5
-rw-r--r--engines/kyra/kyra_lok.cpp12
-rw-r--r--engines/kyra/kyra_lok.h1
-rw-r--r--engines/kyra/kyra_mr.cpp9
-rw-r--r--engines/kyra/kyra_mr.h3
-rw-r--r--engines/kyra/kyra_v1.cpp6
-rw-r--r--engines/kyra/kyra_v1.h21
-rw-r--r--engines/kyra/kyra_v2.cpp1
-rw-r--r--engines/kyra/kyra_v2.h1
-rw-r--r--engines/kyra/lol.cpp66
-rw-r--r--engines/kyra/lol.h5
-rw-r--r--engines/kyra/module.mk7
-rw-r--r--engines/kyra/resource.cpp3
-rw-r--r--engines/kyra/resource.h5
-rw-r--r--engines/kyra/saveload.cpp8
-rw-r--r--engines/kyra/saveload_hof.cpp3
-rw-r--r--engines/kyra/saveload_lok.cpp3
-rw-r--r--engines/kyra/saveload_lol.cpp3
-rw-r--r--engines/kyra/saveload_mr.cpp3
-rw-r--r--engines/kyra/scene_hof.cpp3
-rw-r--r--engines/kyra/scene_lok.cpp1
-rw-r--r--engines/kyra/scene_lol.cpp1
-rw-r--r--engines/kyra/scene_mr.cpp4
-rw-r--r--engines/kyra/scene_v2.cpp1
-rw-r--r--engines/kyra/screen.cpp3
-rw-r--r--engines/kyra/screen.h1
-rw-r--r--engines/kyra/screen_hof.cpp1
-rw-r--r--engines/kyra/screen_hof.h1
-rw-r--r--engines/kyra/screen_lol.cpp1
-rw-r--r--engines/kyra/screen_lol.h1
-rw-r--r--engines/kyra/screen_v2.cpp1
-rw-r--r--engines/kyra/screen_v2.h1
-rw-r--r--engines/kyra/script.cpp1
-rw-r--r--engines/kyra/script.h1
-rw-r--r--engines/kyra/script_hof.cpp1
-rw-r--r--engines/kyra/script_lok.cpp6
-rw-r--r--engines/kyra/script_lol.cpp1
-rw-r--r--engines/kyra/script_tim.cpp1
-rw-r--r--engines/kyra/script_tim.h1
-rw-r--r--engines/kyra/script_v1.cpp1
-rw-r--r--engines/kyra/script_v2.cpp1
-rw-r--r--engines/kyra/seqplayer.cpp1
-rw-r--r--engines/kyra/seqplayer.h1
-rw-r--r--engines/kyra/sequences_hof.cpp2
-rw-r--r--engines/kyra/sequences_lok.cpp3
-rw-r--r--engines/kyra/sequences_lol.cpp4
-rw-r--r--engines/kyra/sequences_mr.cpp5
-rw-r--r--engines/kyra/sequences_v2.cpp1
-rw-r--r--engines/kyra/sound.cpp14
-rw-r--r--engines/kyra/sound.h2
-rw-r--r--engines/kyra/sound_adlib.cpp44
-rw-r--r--engines/kyra/sound_adlib.h4
-rw-r--r--engines/kyra/sound_amiga.cpp1
-rw-r--r--engines/kyra/sound_digital.cpp1
-rw-r--r--engines/kyra/sound_lol.cpp1
-rw-r--r--engines/kyra/sound_midi.cpp4
-rw-r--r--engines/kyra/sound_pcspk.cpp1
-rw-r--r--engines/kyra/sound_towns.cpp1
-rw-r--r--engines/kyra/sprites.cpp1
-rw-r--r--engines/kyra/sprites.h1
-rw-r--r--engines/kyra/sprites_lol.cpp1
-rw-r--r--engines/kyra/staticres.cpp50
-rw-r--r--engines/kyra/staticres_lol.cpp35
-rw-r--r--engines/kyra/text.h1
-rw-r--r--engines/kyra/text_hof.cpp2
-rw-r--r--engines/kyra/text_hof.h1
-rw-r--r--engines/kyra/text_lol.cpp1
-rw-r--r--engines/kyra/text_lol.h1
-rw-r--r--engines/kyra/text_mr.cpp3
-rw-r--r--engines/kyra/timer.h1
-rw-r--r--engines/kyra/timer_lok.cpp1
-rw-r--r--engines/kyra/timer_lol.cpp1
-rw-r--r--engines/kyra/util.cpp1
-rw-r--r--engines/kyra/util.h1
-rw-r--r--engines/kyra/wsamovie.cpp2
-rw-r--r--engines/kyra/wsamovie.h2
-rw-r--r--engines/lastexpress/data/animation.cpp12
-rw-r--r--engines/lastexpress/data/background.cpp2
-rw-r--r--engines/lastexpress/data/font.cpp8
-rw-r--r--engines/lastexpress/data/scene.cpp8
-rw-r--r--engines/lastexpress/data/sequence.cpp14
-rw-r--r--engines/lastexpress/data/snd.cpp396
-rw-r--r--engines/lastexpress/data/snd.h14
-rw-r--r--engines/lastexpress/data/subtitle.cpp4
-rw-r--r--engines/lastexpress/debug.cpp11
-rw-r--r--engines/lastexpress/detection.cpp40
-rw-r--r--engines/lastexpress/entities/abbot.cpp10
-rw-r--r--engines/lastexpress/entities/alexei.cpp3
-rw-r--r--engines/lastexpress/entities/alouan.cpp3
-rw-r--r--engines/lastexpress/entities/anna.cpp65
-rw-r--r--engines/lastexpress/entities/august.cpp28
-rw-r--r--engines/lastexpress/entities/boutarel.cpp8
-rw-r--r--engines/lastexpress/entities/chapters.cpp147
-rw-r--r--engines/lastexpress/entities/cooks.cpp8
-rw-r--r--engines/lastexpress/entities/coudert.cpp26
-rw-r--r--engines/lastexpress/entities/entity.cpp15
-rw-r--r--engines/lastexpress/entities/entity.h24
-rw-r--r--engines/lastexpress/entities/entity_intern.h4
-rw-r--r--engines/lastexpress/entities/francois.cpp16
-rw-r--r--engines/lastexpress/entities/gendarmes.cpp18
-rw-r--r--engines/lastexpress/entities/gendarmes.h4
-rw-r--r--engines/lastexpress/entities/hadija.cpp3
-rw-r--r--engines/lastexpress/entities/ivo.cpp6
-rw-r--r--engines/lastexpress/entities/kahina.cpp18
-rw-r--r--engines/lastexpress/entities/kronos.cpp16
-rw-r--r--engines/lastexpress/entities/mahmud.cpp24
-rw-r--r--engines/lastexpress/entities/max.cpp48
-rw-r--r--engines/lastexpress/entities/mertens.cpp26
-rw-r--r--engines/lastexpress/entities/milos.cpp29
-rw-r--r--engines/lastexpress/entities/mmeboutarel.cpp10
-rw-r--r--engines/lastexpress/entities/pascale.cpp24
-rw-r--r--engines/lastexpress/entities/rebecca.cpp10
-rw-r--r--engines/lastexpress/entities/salko.cpp11
-rw-r--r--engines/lastexpress/entities/servers0.cpp3
-rw-r--r--engines/lastexpress/entities/servers1.cpp3
-rw-r--r--engines/lastexpress/entities/sophie.cpp3
-rw-r--r--engines/lastexpress/entities/tables.cpp22
-rw-r--r--engines/lastexpress/entities/tatiana.cpp30
-rw-r--r--engines/lastexpress/entities/train.cpp50
-rw-r--r--engines/lastexpress/entities/vassili.cpp10
-rw-r--r--engines/lastexpress/entities/verges.cpp32
-rw-r--r--engines/lastexpress/entities/vesna.cpp10
-rw-r--r--engines/lastexpress/entities/yasmin.cpp3
-rw-r--r--engines/lastexpress/fight/fight.cpp409
-rw-r--r--engines/lastexpress/fight/fight.h125
-rw-r--r--engines/lastexpress/fight/fighter.cpp249
-rw-r--r--engines/lastexpress/fight/fighter.h123
-rw-r--r--engines/lastexpress/fight/fighter_anna.cpp187
-rw-r--r--engines/lastexpress/fight/fighter_anna.h48
-rw-r--r--engines/lastexpress/fight/fighter_ivo.cpp245
-rw-r--r--engines/lastexpress/fight/fighter_ivo.h51
-rw-r--r--engines/lastexpress/fight/fighter_milos.cpp222
-rw-r--r--engines/lastexpress/fight/fighter_milos.h51
-rw-r--r--engines/lastexpress/fight/fighter_salko.cpp202
-rw-r--r--engines/lastexpress/fight/fighter_salko.h51
-rw-r--r--engines/lastexpress/fight/fighter_vesna.cpp265
-rw-r--r--engines/lastexpress/fight/fighter_vesna.h51
-rw-r--r--engines/lastexpress/game/action.cpp72
-rw-r--r--engines/lastexpress/game/beetle.cpp14
-rw-r--r--engines/lastexpress/game/entities.cpp93
-rw-r--r--engines/lastexpress/game/fight.cpp1583
-rw-r--r--engines/lastexpress/game/fight.h266
-rw-r--r--engines/lastexpress/game/inventory.cpp19
-rw-r--r--engines/lastexpress/game/logic.cpp29
-rw-r--r--engines/lastexpress/game/object.cpp2
-rw-r--r--engines/lastexpress/game/savegame.cpp81
-rw-r--r--engines/lastexpress/game/savepoint.cpp6
-rw-r--r--engines/lastexpress/game/scenes.cpp24
-rw-r--r--engines/lastexpress/game/sound.cpp2302
-rw-r--r--engines/lastexpress/game/sound.h389
-rw-r--r--engines/lastexpress/game/state.cpp2
-rw-r--r--engines/lastexpress/game/state.h2
-rw-r--r--engines/lastexpress/graphics.cpp6
-rw-r--r--engines/lastexpress/helpers.h1
-rw-r--r--engines/lastexpress/lastexpress.cpp38
-rw-r--r--engines/lastexpress/lastexpress.h1
-rw-r--r--engines/lastexpress/menu/clock.cpp106
-rw-r--r--engines/lastexpress/menu/clock.h53
-rw-r--r--engines/lastexpress/menu/menu.cpp (renamed from engines/lastexpress/game/menu.cpp)274
-rw-r--r--engines/lastexpress/menu/menu.h (renamed from engines/lastexpress/game/menu.h)0
-rw-r--r--engines/lastexpress/menu/trainline.cpp142
-rw-r--r--engines/lastexpress/menu/trainline.h51
-rw-r--r--engines/lastexpress/module.mk18
-rw-r--r--engines/lastexpress/resource.cpp4
-rw-r--r--engines/lastexpress/resource.h2
-rw-r--r--engines/lastexpress/shared.h80
-rw-r--r--engines/lastexpress/sound/entry.cpp465
-rw-r--r--engines/lastexpress/sound/entry.h196
-rw-r--r--engines/lastexpress/sound/queue.cpp400
-rw-r--r--engines/lastexpress/sound/queue.h121
-rw-r--r--engines/lastexpress/sound/sound.cpp1383
-rw-r--r--engines/lastexpress/sound/sound.h93
-rw-r--r--engines/lure/debugger.cpp14
-rw-r--r--engines/lure/detection.cpp20
-rw-r--r--engines/lure/disk.cpp3
-rw-r--r--engines/lure/hotspots.cpp9
-rw-r--r--engines/lure/memory.cpp8
-rw-r--r--engines/lure/module.mk1
-rw-r--r--engines/lure/sound.cpp2
-rw-r--r--engines/lure/sound.h3
-rw-r--r--engines/m4/converse.cpp6
-rw-r--r--engines/m4/detection.cpp43
-rw-r--r--engines/m4/dialogs.cpp2
-rw-r--r--engines/m4/globals.cpp9
-rw-r--r--engines/m4/globals.h2
-rw-r--r--engines/m4/m4.h1
-rw-r--r--engines/m4/m4_views.cpp4
-rw-r--r--engines/m4/mads_logic.cpp41
-rw-r--r--engines/m4/midi.h1
-rw-r--r--engines/m4/saveload.cpp3
-rw-r--r--engines/m4/scripttab.h1
-rw-r--r--engines/made/database.cpp14
-rw-r--r--engines/made/database.h14
-rw-r--r--engines/made/detection.cpp93
-rw-r--r--engines/made/graphics.cpp7
-rw-r--r--engines/made/graphics.h9
-rw-r--r--engines/made/made.cpp34
-rw-r--r--engines/made/made.h27
-rw-r--r--engines/made/music.cpp7
-rw-r--r--engines/made/music.h6
-rw-r--r--engines/made/pmvplayer.cpp10
-rw-r--r--engines/made/pmvplayer.h22
-rw-r--r--engines/made/redreader.cpp3
-rw-r--r--engines/made/redreader.h9
-rw-r--r--engines/made/resource.cpp16
-rw-r--r--engines/made/resource.h22
-rw-r--r--engines/made/screen.cpp8
-rw-r--r--engines/made/screen.h11
-rw-r--r--engines/made/screenfx.cpp129
-rw-r--r--engines/made/screenfx.h25
-rw-r--r--engines/made/script.cpp8
-rw-r--r--engines/made/script.h3
-rw-r--r--engines/made/scriptfuncs.cpp22
-rw-r--r--engines/made/scriptfuncs.h10
-rw-r--r--engines/made/sound.cpp6
-rw-r--r--engines/made/sound.h3
-rw-r--r--engines/mohawk/console.cpp23
-rw-r--r--engines/mohawk/cstime.cpp2
-rw-r--r--engines/mohawk/cstime.h2
-rw-r--r--engines/mohawk/cursors.cpp56
-rw-r--r--engines/mohawk/cursors.h2
-rw-r--r--engines/mohawk/detection_tables.h571
-rw-r--r--engines/mohawk/dialogs.cpp24
-rw-r--r--engines/mohawk/dialogs.h1
-rw-r--r--engines/mohawk/graphics.cpp49
-rw-r--r--engines/mohawk/graphics.h5
-rw-r--r--engines/mohawk/livingbooks.cpp518
-rw-r--r--engines/mohawk/livingbooks.h61
-rw-r--r--engines/mohawk/livingbooks_code.cpp555
-rw-r--r--engines/mohawk/livingbooks_code.h14
-rw-r--r--engines/mohawk/mohawk.cpp2
-rw-r--r--engines/mohawk/mohawk.h4
-rw-r--r--engines/mohawk/myst.cpp18
-rw-r--r--engines/mohawk/myst.h1
-rw-r--r--engines/mohawk/myst_scripts.cpp179
-rw-r--r--engines/mohawk/myst_stacks/channelwood.cpp10
-rw-r--r--engines/mohawk/myst_stacks/demo.cpp99
-rw-r--r--engines/mohawk/myst_stacks/demo.h14
-rw-r--r--engines/mohawk/myst_stacks/dni.cpp2
-rw-r--r--engines/mohawk/myst_stacks/mechanical.cpp20
-rw-r--r--engines/mohawk/myst_stacks/myst.cpp4
-rw-r--r--engines/mohawk/myst_stacks/myst.h4
-rw-r--r--engines/mohawk/myst_stacks/preview.cpp217
-rw-r--r--engines/mohawk/myst_stacks/preview.h27
-rw-r--r--engines/mohawk/myst_stacks/slides.cpp27
-rw-r--r--engines/mohawk/myst_stacks/slides.h2
-rw-r--r--engines/mohawk/myst_state.cpp8
-rw-r--r--engines/mohawk/resource.cpp601
-rw-r--r--engines/mohawk/resource.h146
-rw-r--r--engines/mohawk/riven.cpp179
-rw-r--r--engines/mohawk/riven.h8
-rw-r--r--engines/mohawk/riven_external.cpp32
-rw-r--r--engines/mohawk/riven_saveload.cpp93
-rw-r--r--engines/mohawk/riven_vars.cpp8
-rw-r--r--engines/mohawk/sound.cpp20
-rw-r--r--engines/mohawk/sound.h7
-rw-r--r--engines/neverhood/detection.cpp5
-rw-r--r--engines/parallaction/detection.cpp21
-rw-r--r--engines/parallaction/gfxbase.cpp21
-rw-r--r--engines/parallaction/graphics.h10
-rw-r--r--engines/parallaction/gui_br.cpp1
-rw-r--r--engines/parallaction/objects.cpp6
-rw-r--r--engines/parallaction/parallaction.cpp25
-rw-r--r--engines/parallaction/parser_br.cpp12
-rw-r--r--engines/parallaction/parser_ns.cpp17
-rw-r--r--engines/parallaction/sound.h3
-rw-r--r--engines/parallaction/walk.cpp80
-rw-r--r--engines/queen/command.h1
-rw-r--r--engines/queen/credits.cpp1
-rw-r--r--engines/queen/graphics.cpp2
-rw-r--r--engines/queen/input.cpp2
-rw-r--r--engines/queen/input.h2
-rw-r--r--engines/queen/musicdata.cpp2
-rw-r--r--engines/queen/queen.cpp6
-rw-r--r--engines/queen/resource.cpp2
-rw-r--r--engines/queen/resource.h2
-rw-r--r--engines/queen/sound.h2
-rw-r--r--engines/queen/talk.cpp2
-rw-r--r--engines/saga/actor.cpp1
-rw-r--r--engines/saga/actor.h2
-rw-r--r--engines/saga/actor_walk.cpp10
-rw-r--r--engines/saga/detection.cpp11
-rw-r--r--engines/saga/detection_tables.h83
-rw-r--r--engines/saga/input.cpp1
-rw-r--r--engines/saga/interface.cpp7
-rw-r--r--engines/saga/introproc_ite.cpp33
-rw-r--r--engines/saga/music.cpp12
-rw-r--r--engines/saga/palanim.h1
-rw-r--r--engines/saga/puzzle.cpp18
-rw-r--r--engines/saga/render.cpp2
-rw-r--r--engines/saga/resource.cpp6
-rw-r--r--engines/saga/saga.cpp5
-rw-r--r--engines/saga/saga.h15
-rw-r--r--engines/saga/saveload.cpp7
-rw-r--r--engines/saga/scene.cpp2
-rw-r--r--engines/saga/script.cpp13
-rw-r--r--engines/saga/shorten.cpp1
-rw-r--r--engines/saga/shorten.h1
-rw-r--r--engines/saga/sndres.cpp9
-rw-r--r--engines/saga/sthread.cpp18
-rw-r--r--engines/savestate.cpp44
-rw-r--r--engines/savestate.h165
-rw-r--r--engines/sci/console.cpp14
-rw-r--r--engines/sci/decompressor.cpp46
-rw-r--r--engines/sci/decompressor.h1
-rw-r--r--engines/sci/detection.cpp46
-rw-r--r--engines/sci/detection_tables.h779
-rw-r--r--engines/sci/engine/kernel.cpp19
-rw-r--r--engines/sci/engine/kernel.h7
-rw-r--r--engines/sci/engine/kernel_tables.h95
-rw-r--r--engines/sci/engine/kfile.cpp29
-rw-r--r--engines/sci/engine/kgraphics.cpp372
-rw-r--r--engines/sci/engine/klists.cpp10
-rw-r--r--engines/sci/engine/kmath.cpp8
-rw-r--r--engines/sci/engine/kmisc.cpp38
-rw-r--r--engines/sci/engine/kmovement.cpp110
-rw-r--r--engines/sci/engine/kstring.cpp57
-rw-r--r--engines/sci/engine/kvideo.cpp94
-rw-r--r--engines/sci/engine/object.cpp7
-rw-r--r--engines/sci/engine/savegame.cpp15
-rw-r--r--engines/sci/engine/script_patches.cpp18
-rw-r--r--engines/sci/engine/scriptdebug.cpp5
-rw-r--r--engines/sci/engine/seg_manager.cpp6
-rw-r--r--engines/sci/engine/selector.cpp1
-rw-r--r--engines/sci/engine/selector.h1
-rw-r--r--engines/sci/engine/static_selectors.cpp53
-rw-r--r--engines/sci/engine/vm.cpp12
-rw-r--r--engines/sci/engine/workarounds.cpp12
-rw-r--r--engines/sci/graphics/animate.cpp16
-rw-r--r--engines/sci/graphics/cache.cpp4
-rw-r--r--engines/sci/graphics/cache.h2
-rw-r--r--engines/sci/graphics/compare.cpp35
-rw-r--r--engines/sci/graphics/compare.h2
-rw-r--r--engines/sci/graphics/controls.cpp5
-rw-r--r--engines/sci/graphics/cursor.cpp14
-rw-r--r--engines/sci/graphics/frameout.cpp221
-rw-r--r--engines/sci/graphics/frameout.h9
-rw-r--r--engines/sci/graphics/paint.h2
-rw-r--r--engines/sci/graphics/paint16.cpp31
-rw-r--r--engines/sci/graphics/paint16.h2
-rw-r--r--engines/sci/graphics/paint32.h2
-rw-r--r--engines/sci/graphics/palette.cpp42
-rw-r--r--engines/sci/graphics/palette.h2
-rw-r--r--engines/sci/graphics/picture.cpp52
-rw-r--r--engines/sci/graphics/picture.h5
-rw-r--r--engines/sci/graphics/screen.cpp4
-rw-r--r--engines/sci/graphics/text16.cpp2
-rw-r--r--engines/sci/graphics/text32.cpp283
-rw-r--r--engines/sci/graphics/text32.h58
-rw-r--r--engines/sci/graphics/view.cpp26
-rw-r--r--engines/sci/graphics/view.h2
-rw-r--r--engines/sci/module.mk1
-rw-r--r--engines/sci/parser/said.cpp1
-rw-r--r--engines/sci/resource.cpp55
-rw-r--r--engines/sci/resource.h2
-rw-r--r--engines/sci/resource_audio.cpp2
-rw-r--r--engines/sci/sci.cpp16
-rw-r--r--engines/sci/sci.h2
-rw-r--r--engines/sci/sound/drivers/cms.cpp1
-rw-r--r--engines/sci/sound/drivers/gm_names.h4
-rw-r--r--engines/sci/sound/midiparser_sci.cpp23
-rw-r--r--engines/sci/sound/music.cpp7
-rw-r--r--engines/sci/sound/soundcmd.cpp112
-rw-r--r--engines/sci/sound/soundcmd.h4
-rw-r--r--engines/scumm/actor.cpp4
-rw-r--r--engines/scumm/charset.cpp966
-rw-r--r--engines/scumm/charset.h91
-rw-r--r--engines/scumm/costume.cpp12
-rw-r--r--engines/scumm/cursor.cpp82
-rw-r--r--engines/scumm/detection.cpp73
-rw-r--r--engines/scumm/detection.h2
-rw-r--r--engines/scumm/detection_tables.h261
-rw-r--r--engines/scumm/dialogs.cpp73
-rw-r--r--engines/scumm/gfx.cpp31
-rw-r--r--engines/scumm/he/animation_he.cpp128
-rw-r--r--engines/scumm/he/animation_he.h35
-rw-r--r--engines/scumm/he/intern_he.h3
-rw-r--r--engines/scumm/he/logic/baseball2001.cpp63
-rw-r--r--engines/scumm/he/logic/basketball.cpp230
-rw-r--r--engines/scumm/he/logic/football.cpp288
-rw-r--r--engines/scumm/he/logic/funshop.cpp216
-rw-r--r--engines/scumm/he/logic/moonbase.cpp50
-rw-r--r--engines/scumm/he/logic/puttrace.cpp376
-rw-r--r--engines/scumm/he/logic/soccer.cpp1206
-rw-r--r--engines/scumm/he/logic_he.cpp1393
-rw-r--r--engines/scumm/he/logic_he.h155
-rw-r--r--engines/scumm/he/resource_he.cpp34
-rw-r--r--engines/scumm/he/script_v100he.cpp24
-rw-r--r--engines/scumm/he/script_v60he.cpp12
-rw-r--r--engines/scumm/he/script_v72he.cpp11
-rw-r--r--engines/scumm/he/script_v80he.cpp5
-rw-r--r--engines/scumm/he/script_v90he.cpp4
-rw-r--r--engines/scumm/he/sprite_he.cpp10
-rw-r--r--engines/scumm/he/sprite_he.h1
-rw-r--r--engines/scumm/he/wiz_he.cpp2
-rw-r--r--engines/scumm/help.cpp2
-rw-r--r--engines/scumm/help.h1
-rw-r--r--engines/scumm/imuse/imuse.cpp153
-rw-r--r--engines/scumm/imuse/imuse.h7
-rw-r--r--engines/scumm/imuse/imuse_internal.h42
-rw-r--r--engines/scumm/imuse/imuse_part.cpp12
-rw-r--r--engines/scumm/imuse/imuse_player.cpp49
-rw-r--r--engines/scumm/imuse/instrument.cpp100
-rw-r--r--engines/scumm/imuse/instrument.h7
-rw-r--r--engines/scumm/imuse/pcspk.cpp834
-rw-r--r--engines/scumm/imuse/pcspk.h160
-rw-r--r--engines/scumm/imuse/sysex.h1
-rw-r--r--engines/scumm/imuse/sysex_samnmax.cpp3
-rw-r--r--engines/scumm/imuse/sysex_scumm.cpp81
-rw-r--r--engines/scumm/imuse_digi/dimuse.cpp2
-rw-r--r--engines/scumm/imuse_digi/dimuse_codecs.cpp2
-rw-r--r--engines/scumm/input.cpp12
-rw-r--r--engines/scumm/insane/insane_enemy.cpp1
-rw-r--r--engines/scumm/insane/insane_iact.cpp1
-rw-r--r--engines/scumm/insane/insane_scenes.cpp1
-rw-r--r--engines/scumm/module.mk10
-rw-r--r--engines/scumm/palette.cpp461
-rw-r--r--engines/scumm/player_towns.cpp3
-rw-r--r--engines/scumm/player_v2.h5
-rw-r--r--engines/scumm/player_v2base.h6
-rw-r--r--engines/scumm/player_v2cms.cpp536
-rw-r--r--engines/scumm/player_v2cms.h74
-rw-r--r--engines/scumm/resource.cpp33
-rw-r--r--engines/scumm/resource.h7
-rw-r--r--engines/scumm/room.cpp7
-rw-r--r--engines/scumm/saveload.cpp35
-rw-r--r--engines/scumm/saveload.h2
-rw-r--r--engines/scumm/script_v0.cpp2
-rw-r--r--engines/scumm/script_v4.cpp12
-rw-r--r--engines/scumm/script_v5.cpp38
-rw-r--r--engines/scumm/scumm-md5.h8
-rw-r--r--engines/scumm/scumm.cpp112
-rw-r--r--engines/scumm/scumm.h36
-rw-r--r--engines/scumm/smush/channel.cpp12
-rw-r--r--engines/scumm/smush/codec37.cpp1
-rw-r--r--engines/scumm/smush/smush_font.cpp1
-rw-r--r--engines/scumm/smush/smush_player.cpp4
-rw-r--r--engines/scumm/sound.cpp71
-rw-r--r--engines/scumm/sound.h3
-rw-r--r--engines/scumm/string.cpp18
-rw-r--r--engines/scumm/vars.cpp11
-rw-r--r--engines/scumm/verbs.cpp1
-rw-r--r--engines/sky/autoroute.h1
-rw-r--r--engines/sky/compact.cpp2
-rw-r--r--engines/sky/compact.h2
-rw-r--r--engines/sky/debug.cpp12
-rw-r--r--engines/sky/detection.cpp24
-rw-r--r--engines/sky/disk.cpp4
-rw-r--r--engines/sky/logic.cpp11
-rw-r--r--engines/sky/sound.cpp2
-rw-r--r--engines/sword1/animation.cpp4
-rw-r--r--engines/sword1/control.cpp110
-rw-r--r--engines/sword1/control.h5
-rw-r--r--engines/sword1/debug.h1
-rw-r--r--engines/sword1/detection.cpp70
-rw-r--r--engines/sword1/eventman.cpp36
-rw-r--r--engines/sword1/logic.cpp166
-rw-r--r--engines/sword1/logic.h194
-rw-r--r--engines/sword1/memman.cpp2
-rw-r--r--engines/sword1/memman.h6
-rw-r--r--engines/sword1/menu.cpp4
-rw-r--r--engines/sword1/mouse.cpp36
-rw-r--r--engines/sword1/mouse.h22
-rw-r--r--engines/sword1/music.cpp8
-rw-r--r--engines/sword1/music.h2
-rw-r--r--engines/sword1/object.h161
-rw-r--r--engines/sword1/objectman.cpp30
-rw-r--r--engines/sword1/objectman.h8
-rw-r--r--engines/sword1/resman.cpp108
-rw-r--r--engines/sword1/resman.h24
-rw-r--r--engines/sword1/router.cpp338
-rw-r--r--engines/sword1/router.h54
-rw-r--r--engines/sword1/screen.cpp78
-rw-r--r--engines/sword1/screen.h28
-rw-r--r--engines/sword1/sound.cpp97
-rw-r--r--engines/sword1/sound.h16
-rw-r--r--engines/sword1/staticres.cpp4
-rw-r--r--engines/sword1/sword1.cpp78
-rw-r--r--engines/sword1/sword1.h42
-rw-r--r--engines/sword1/sworddefs.h100
-rw-r--r--engines/sword1/text.cpp30
-rw-r--r--engines/sword1/text.h10
-rw-r--r--engines/sword2/controls.cpp2
-rw-r--r--engines/sword2/music.cpp4
-rw-r--r--engines/sword2/render.cpp10
-rw-r--r--engines/sword2/sound.cpp6
-rw-r--r--engines/sword2/sword2.cpp2
-rw-r--r--engines/sword25/detection.cpp3
-rw-r--r--engines/sword25/detection_tables.h25
-rw-r--r--engines/sword25/fmv/theora_decoder.cpp11
-rw-r--r--engines/sword25/gfx/animationtemplateregistry.cpp2
-rw-r--r--engines/sword25/gfx/graphicengine.cpp2
-rw-r--r--engines/sword25/gfx/image/art.cpp71
-rw-r--r--engines/sword25/gfx/image/art.h5
-rw-r--r--engines/sword25/gfx/image/renderedimage.cpp5
-rw-r--r--engines/sword25/gfx/image/vectorimage.cpp4
-rw-r--r--engines/sword25/gfx/image/vectorimagerenderer.cpp7
-rw-r--r--engines/sword25/gfx/staticbitmap.cpp5
-rw-r--r--engines/sword25/kernel/inputpersistenceblock.cpp33
-rw-r--r--engines/sword25/kernel/inputpersistenceblock.h7
-rw-r--r--engines/sword25/kernel/outputpersistenceblock.cpp12
-rw-r--r--engines/sword25/kernel/persistenceblock.h42
-rw-r--r--engines/sword25/kernel/persistenceservice.cpp30
-rw-r--r--engines/sword25/kernel/persistenceservice.h1
-rw-r--r--engines/sword25/math/regionregistry.cpp2
-rw-r--r--engines/sword25/package/packagemanager.h3
-rw-r--r--engines/sword25/sfx/soundengine.cpp152
-rw-r--r--engines/sword25/sfx/soundengine.h18
-rw-r--r--engines/sword25/sword25.cpp2
-rw-r--r--engines/sword25/util/lua/lapi.cpp1
-rw-r--r--engines/sword25/util/lua/lauxlib.cpp1
-rw-r--r--engines/sword25/util/lua/lauxlib.h2
-rw-r--r--engines/sword25/util/lua/lbaselib.cpp1
-rw-r--r--engines/sword25/util/lua/lcode.cpp1
-rw-r--r--engines/sword25/util/lua/ldblib.cpp1
-rw-r--r--engines/sword25/util/lua/ldebug.cpp1
-rw-r--r--engines/sword25/util/lua/ldo.cpp2
-rw-r--r--engines/sword25/util/lua/ldo.h1
-rw-r--r--engines/sword25/util/lua/lfunc.cpp1
-rw-r--r--engines/sword25/util/lua/lgc.cpp1
-rw-r--r--engines/sword25/util/lua/linit.cpp1
-rw-r--r--engines/sword25/util/lua/liolib.cpp1
-rw-r--r--engines/sword25/util/lua/llex.cpp3
-rw-r--r--engines/sword25/util/lua/lmathlib.cpp1
-rw-r--r--engines/sword25/util/lua/lmem.cpp1
-rw-r--r--engines/sword25/util/lua/lmem.h1
-rw-r--r--engines/sword25/util/lua/loadlib.cpp1
-rw-r--r--engines/sword25/util/lua/lobject.h1
-rw-r--r--engines/sword25/util/lua/lopcodes.cpp1
-rw-r--r--engines/sword25/util/lua/loslib.cpp1
-rw-r--r--engines/sword25/util/lua/lstate.cpp1
-rw-r--r--engines/sword25/util/lua/lstate.h1
-rw-r--r--engines/sword25/util/lua/lstring.cpp1
-rw-r--r--engines/sword25/util/lua/lstrlib.cpp1
-rw-r--r--engines/sword25/util/lua/ltablib.cpp1
-rw-r--r--engines/sword25/util/lua/ltm.cpp1
-rw-r--r--engines/sword25/util/lua/luaconf.h1
-rw-r--r--engines/sword25/util/lua/lvm.cpp1
-rw-r--r--engines/sword25/util/lua/lzio.cpp2
-rw-r--r--engines/sword25/util/pluto/CHANGELOG1
-rw-r--r--engines/sword25/util/pluto/FILEFORMAT2
-rw-r--r--engines/sword25/util/pluto/THANKS1
-rw-r--r--engines/sword25/util/pluto/plzio.cpp2
-rw-r--r--engines/teenagent/actor.cpp4
-rw-r--r--engines/teenagent/animation.cpp28
-rw-r--r--engines/teenagent/animation.h2
-rw-r--r--engines/teenagent/callbacks.cpp22
-rw-r--r--engines/teenagent/console.cpp8
-rw-r--r--engines/teenagent/detection.cpp11
-rw-r--r--engines/teenagent/font.h1
-rw-r--r--engines/teenagent/inventory.cpp12
-rw-r--r--engines/teenagent/music.cpp2
-rw-r--r--engines/teenagent/objects.cpp26
-rw-r--r--engines/teenagent/objects.h14
-rw-r--r--engines/teenagent/pack.cpp2
-rw-r--r--engines/teenagent/pack.h9
-rw-r--r--engines/teenagent/resources.cpp11
-rw-r--r--engines/teenagent/scene.cpp255
-rw-r--r--engines/teenagent/scene.h80
-rw-r--r--engines/teenagent/surface.cpp20
-rw-r--r--engines/teenagent/surface.h4
-rw-r--r--engines/teenagent/surface_list.cpp18
-rw-r--r--engines/teenagent/surface_list.h7
-rw-r--r--engines/teenagent/teenagent.cpp204
-rw-r--r--engines/teenagent/teenagent.h2
-rw-r--r--engines/testbed/config-params.cpp2
-rw-r--r--engines/testbed/detection.cpp2
-rw-r--r--engines/testbed/misc.cpp4
-rw-r--r--engines/tinsel/actors.cpp13
-rw-r--r--engines/tinsel/actors.h2
-rw-r--r--engines/tinsel/adpcm.cpp2
-rw-r--r--engines/tinsel/config.cpp6
-rw-r--r--engines/tinsel/coroutine.cpp1
-rw-r--r--engines/tinsel/detection.cpp16
-rw-r--r--engines/tinsel/detection_tables.h91
-rw-r--r--engines/tinsel/pcode.h2
-rw-r--r--engines/tinsel/saveload.cpp16
-rw-r--r--engines/tinsel/savescn.cpp4
-rw-r--r--engines/tinsel/sound.cpp9
-rw-r--r--engines/tinsel/strres.h1
-rw-r--r--engines/tinsel/tinsel.cpp6
-rw-r--r--engines/tinsel/tinsel.h10
-rw-r--r--engines/toon/anim.cpp16
-rw-r--r--engines/toon/anim.h1
-rw-r--r--engines/toon/audio.cpp7
-rw-r--r--engines/toon/character.cpp10
-rw-r--r--engines/toon/detection.cpp21
-rw-r--r--engines/toon/drew.cpp1
-rw-r--r--engines/toon/font.cpp14
-rw-r--r--engines/toon/hotspot.cpp1
-rw-r--r--engines/toon/movie.cpp3
-rw-r--r--engines/toon/path.cpp124
-rw-r--r--engines/toon/path.h17
-rw-r--r--engines/toon/picture.cpp13
-rw-r--r--engines/toon/picture.h2
-rw-r--r--engines/toon/resource.cpp2
-rw-r--r--engines/toon/script.cpp1
-rw-r--r--engines/toon/script.h1
-rw-r--r--engines/toon/script_func.cpp10
-rw-r--r--engines/toon/tools.cpp2
-rw-r--r--engines/toon/toon.cpp31
-rw-r--r--engines/touche/detection.cpp18
-rw-r--r--engines/touche/menu.cpp2
-rw-r--r--engines/touche/resource.cpp22
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.cpp434
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.h92
-rw-r--r--engines/tsage/blue_force/blueforce_logic.cpp1548
-rw-r--r--engines/tsage/blue_force/blueforce_logic.h394
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.cpp1136
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.h190
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.cpp3399
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.h488
-rw-r--r--engines/tsage/blue_force/blueforce_scenes2.cpp1853
-rw-r--r--engines/tsage/blue_force/blueforce_scenes2.h298
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.cpp5930
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.h893
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.cpp1674
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.h268
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.cpp2555
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.h407
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.cpp515
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.h125
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.cpp277
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.h103
-rw-r--r--engines/tsage/blue_force/blueforce_scenes8.cpp3612
-rw-r--r--engines/tsage/blue_force/blueforce_scenes8.h568
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.cpp3892
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.h498
-rw-r--r--engines/tsage/blue_force/blueforce_speakers.cpp1023
-rw-r--r--engines/tsage/blue_force/blueforce_speakers.h359
-rw-r--r--engines/tsage/blueforce_logic.cpp120
-rw-r--r--engines/tsage/converse.cpp154
-rw-r--r--engines/tsage/converse.h15
-rw-r--r--engines/tsage/core.cpp944
-rw-r--r--engines/tsage/core.h94
-rw-r--r--engines/tsage/debugger.cpp137
-rw-r--r--engines/tsage/debugger.h7
-rw-r--r--engines/tsage/detection.cpp56
-rw-r--r--engines/tsage/detection_tables.h70
-rw-r--r--engines/tsage/dialogs.cpp228
-rw-r--r--engines/tsage/dialogs.h40
-rw-r--r--engines/tsage/events.cpp116
-rw-r--r--engines/tsage/events.h44
-rw-r--r--engines/tsage/globals.cpp258
-rw-r--r--engines/tsage/globals.h161
-rw-r--r--engines/tsage/graphics.cpp165
-rw-r--r--engines/tsage/graphics.h6
-rw-r--r--engines/tsage/module.mk45
-rw-r--r--engines/tsage/resources.cpp19
-rw-r--r--engines/tsage/resources.h9
-rw-r--r--engines/tsage/ringworld/ringworld_demo.cpp (renamed from engines/tsage/ringworld_demo.cpp)34
-rw-r--r--engines/tsage/ringworld/ringworld_demo.h (renamed from engines/tsage/ringworld_demo.h)12
-rw-r--r--engines/tsage/ringworld/ringworld_dialogs.cpp222
-rw-r--r--engines/tsage/ringworld/ringworld_dialogs.h70
-rw-r--r--engines/tsage/ringworld/ringworld_logic.cpp691
-rw-r--r--engines/tsage/ringworld/ringworld_logic.h191
-rw-r--r--engines/tsage/ringworld/ringworld_scenes1.cpp (renamed from engines/tsage/ringworld_scenes1.cpp)930
-rw-r--r--engines/tsage/ringworld/ringworld_scenes1.h (renamed from engines/tsage/ringworld_scenes1.h)20
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.cpp (renamed from engines/tsage/ringworld_scenes10.cpp)1042
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.h (renamed from engines/tsage/ringworld_scenes10.h)24
-rw-r--r--engines/tsage/ringworld/ringworld_scenes2.cpp (renamed from engines/tsage/ringworld_scenes2.cpp)244
-rw-r--r--engines/tsage/ringworld/ringworld_scenes2.h (renamed from engines/tsage/ringworld_scenes2.h)13
-rw-r--r--engines/tsage/ringworld/ringworld_scenes3.cpp (renamed from engines/tsage/ringworld_scenes3.cpp)2038
-rw-r--r--engines/tsage/ringworld/ringworld_scenes3.h (renamed from engines/tsage/ringworld_scenes3.h)13
-rw-r--r--engines/tsage/ringworld/ringworld_scenes4.cpp (renamed from engines/tsage/ringworld_scenes4.cpp)52
-rw-r--r--engines/tsage/ringworld/ringworld_scenes4.h (renamed from engines/tsage/ringworld_scenes4.h)13
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.cpp (renamed from engines/tsage/ringworld_scenes5.cpp)1496
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.h (renamed from engines/tsage/ringworld_scenes5.h)12
-rw-r--r--engines/tsage/ringworld/ringworld_scenes6.cpp (renamed from engines/tsage/ringworld_scenes6.cpp)895
-rw-r--r--engines/tsage/ringworld/ringworld_scenes6.h (renamed from engines/tsage/ringworld_scenes6.h)12
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.cpp (renamed from engines/tsage/ringworld_scenes8.cpp)650
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.h (renamed from engines/tsage/ringworld_scenes8.h)13
-rw-r--r--engines/tsage/ringworld/ringworld_speakers.cpp (renamed from engines/tsage/ringworld_logic.cpp)603
-rw-r--r--engines/tsage/ringworld/ringworld_speakers.h (renamed from engines/tsage/ringworld_logic.h)144
-rw-r--r--engines/tsage/ringworld2/ringworld2_dialogs.cpp193
-rw-r--r--engines/tsage/ringworld2/ringworld2_dialogs.h66
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp761
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.h250
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.cpp331
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.h84
-rw-r--r--engines/tsage/saveload.cpp61
-rw-r--r--engines/tsage/saveload.h21
-rw-r--r--engines/tsage/scenes.cpp268
-rw-r--r--engines/tsage/scenes.h28
-rw-r--r--engines/tsage/sound.cpp477
-rw-r--r--engines/tsage/sound.h101
-rw-r--r--engines/tsage/staticres.cpp76
-rw-r--r--engines/tsage/staticres.h67
-rw-r--r--engines/tsage/tsage.cpp83
-rw-r--r--engines/tsage/tsage.h17
-rw-r--r--engines/tsage/user_interface.cpp529
-rw-r--r--engines/tsage/user_interface.h150
-rw-r--r--engines/tucker/detection.cpp16
-rw-r--r--engines/tucker/staticres.cpp2
-rw-r--r--engines/tucker/tucker.h2
-rw-r--r--graphics/cursor.h63
-rw-r--r--graphics/cursorman.cpp2
-rw-r--r--graphics/dither.cpp313
-rw-r--r--graphics/dither.h195
-rw-r--r--graphics/font.cpp764
-rw-r--r--graphics/font.h63
-rw-r--r--graphics/fontman.cpp26
-rw-r--r--graphics/fontman.h10
-rw-r--r--graphics/fonts/bdf.cpp796
-rw-r--r--graphics/fonts/bdf.h99
-rw-r--r--graphics/fonts/consolefont.cpp4
-rw-r--r--graphics/fonts/newfont.cpp4
-rw-r--r--graphics/fonts/newfont_big.cpp4
-rw-r--r--graphics/fonts/winfont.cpp14
-rw-r--r--graphics/imagedec.h1
-rw-r--r--graphics/maccursor.h12
-rw-r--r--graphics/module.mk2
-rw-r--r--graphics/pict.cpp409
-rw-r--r--graphics/pict.h50
-rw-r--r--graphics/png.cpp30
-rw-r--r--graphics/primitives.h1
-rw-r--r--graphics/scaler.cpp4
-rw-r--r--graphics/scaler/aspect.cpp1
-rw-r--r--graphics/scaler/hq2x_i386.asm1
-rw-r--r--graphics/scaler/hq3x_i386.asm1
-rw-r--r--graphics/scaler/scale2x.cpp1
-rw-r--r--graphics/scaler/scale2x.h1
-rw-r--r--graphics/scaler/scale3x.cpp1
-rw-r--r--graphics/scaler/scale3x.h1
-rw-r--r--graphics/scaler/scalebit.cpp1
-rw-r--r--graphics/scaler/scalebit.h1
-rw-r--r--graphics/scaler/thumbnail_intern.cpp1
-rw-r--r--graphics/sjis.cpp519
-rw-r--r--graphics/sjis.h101
-rw-r--r--graphics/surface.cpp6
-rw-r--r--graphics/thumbnail.cpp18
-rw-r--r--graphics/thumbnail.h3
-rw-r--r--graphics/wincursor.cpp57
-rw-r--r--graphics/wincursor.h14
-rw-r--r--graphics/yuv_to_rgb.cpp9
-rw-r--r--graphics/yuv_to_rgb.h8
-rw-r--r--gui/ThemeEngine.cpp15
-rw-r--r--gui/console.cpp9
-rw-r--r--gui/credits.h163
-rw-r--r--gui/debugger.h1
-rw-r--r--gui/gui-manager.cpp2
-rw-r--r--gui/launcher.cpp8
-rw-r--r--gui/options.cpp44
-rw-r--r--gui/options.h2
-rw-r--r--gui/saveload.cpp37
-rw-r--r--gui/themebrowser.cpp1
-rw-r--r--gui/themebrowser.h1
-rw-r--r--gui/themes/fonts/topaz/README.ScummVM1
-rw-r--r--gui/themes/translations.datbin220969 -> 273189 bytes
-rw-r--r--gui/widget.cpp4
-rw-r--r--gui/widget.h2
-rw-r--r--gui/widgets/scrollbar.cpp8
-rw-r--r--icons/count.icobin0 -> 1150 bytes
-rw-r--r--icons/scummvm.icobin91198 -> 94081 bytes
-rw-r--r--icons/scummvm.svg2
-rw-r--r--po/POTFILES4
-rw-r--r--po/ca_ES.po1188
-rw-r--r--po/cs_CZ.po687
-rw-r--r--po/da_DA.po680
-rw-r--r--po/de_DE.po727
-rw-r--r--po/es_ES.po887
-rw-r--r--po/fr_FR.po864
-rw-r--r--po/hu_HU.po672
-rw-r--r--po/it_IT.po867
-rw-r--r--po/module.mk2
-rw-r--r--po/nb_NO.po682
-rw-r--r--po/nn_NO.po682
-rw-r--r--po/pl_PL.po682
-rw-r--r--po/pt_BR.po861
-rw-r--r--po/ru_RU.po908
-rw-r--r--po/scummvm.pot650
-rw-r--r--po/se_SE.po682
-rw-r--r--po/uk_UA.po1016
-rw-r--r--ports.mk140
-rw-r--r--test/README2
-rw-r--r--test/audio/audiostream.h1
-rw-r--r--test/audio/helper.h1
-rw-r--r--test/common/algorithm.h25
-rw-r--r--test/common/array.h5
-rw-r--r--test/common/fixedstack.h1
-rw-r--r--test/common/math.h18
-rw-r--r--test/common/queue.h1
-rw-r--r--test/common/stack.h1
-rw-r--r--test/common/tokenizer.h1
-rw-r--r--test/cxxtest/COPYING2
-rw-r--r--test/cxxtest/TODO1
-rw-r--r--test/cxxtest/cxxtest.spec1
-rw-r--r--test/cxxtest/cxxtest/Descriptions.h1
-rw-r--r--test/cxxtest/cxxtest/DummyDescriptions.cpp1
-rw-r--r--test/cxxtest/cxxtest/DummyDescriptions.h1
-rw-r--r--test/cxxtest/cxxtest/GlobalFixture.cpp1
-rw-r--r--test/cxxtest/cxxtest/GlobalFixture.h1
-rw-r--r--test/cxxtest/cxxtest/LinkedList.h1
-rw-r--r--test/cxxtest/cxxtest/RealDescriptions.cpp1
-rw-r--r--test/cxxtest/cxxtest/RealDescriptions.h1
-rw-r--r--test/cxxtest/docs/guide.html1
-rw-r--r--test/cxxtest/sample/Construct2
-rw-r--r--test/cxxtest/sample/aborter.tpl1
-rw-r--r--test/cxxtest/sample/file_printer.tpl1
-rw-r--r--test/cxxtest/sample/mock/Dice.cpp2
-rw-r--r--test/cxxtest/sample/mock/Dice.h1
-rw-r--r--test/cxxtest/sample/msvc/CxxTest_Workspace.dsw1
-rw-r--r--test/cxxtest/sample/only.tpl1
-rw-r--r--test/cxxtest/sample/winddk/SOURCES1
-rw-r--r--test/cxxtest_mingw.h11
-rw-r--r--test/module.mk2
-rw-r--r--video/bink_decoder.cpp1644
-rw-r--r--video/bink_decoder.h336
-rw-r--r--video/binkdata.h578
-rw-r--r--video/codecs/cdtoons.cpp1
-rw-r--r--video/codecs/cinepak.cpp8
-rw-r--r--video/module.mk5
-rw-r--r--video/qt_decoder.cpp21
-rw-r--r--video/smk_decoder.cpp152
1791 files changed, 202302 insertions, 49711 deletions
diff --git a/.gitignore b/.gitignore
index 6294cb451d..80adcb7551 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@ lib*.a
/MT32_CONTROL.ROM
/MT32_PCM.ROM
/ScummVM.app
+/scummvm-ps3.pkg
/*.ipk
/.project
/.cproject
@@ -27,6 +28,8 @@ lib*.a
/Icon.*
/build
+/staging
+/portdist
/backends/platform/dc/gui
/backends/platform/dc/graphics
@@ -85,6 +88,7 @@ project.xcworkspace
/dists/msvc*/[Dd]ebug*/
/dists/msvc*/[Rr]elease*/
+/dists/msvc*/[Aa]nalysis*/
/dists/msvc*/*.lib
/dists/msvc*/*.SAV
/dists/msvc*/*.dat
@@ -155,3 +159,12 @@ ipch/
#Ignore default Visual Studio build folders
[Dd]ebug/
[Rr]elease/
+
+#Ignore Qt Creator project files
+ScummVM.config
+ScummVM.creator
+ScummVM.files
+ScummVM.includes
+
+#Ignore Komodo IDE/Edit project files
+*.komodoproject
diff --git a/AUTHORS b/AUTHORS
index 6492b4781d..ae6b4fc76d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,8 +1,19 @@
ScummVM Team
************
- Project Leaders
- ---------------
+ Project Leader
+ --------------
+ Eugene Sandulenko
+
+ PR Office
+ ---------
+ Arnaud Boutonne - Public Relations Officer, Project Administrator
+ Eugene Sandulenko - Project Leader
+
+ Core Team
+ ---------
+ Willem Jan Palenstijn
Eugene Sandulenko
+ Johannes Schickel
Retired Project Leaders
-----------------------
@@ -19,7 +30,7 @@ ScummVM Team
Jonathan Gray - (retired)
Vincent Hamm - (retired)
Max Horn - (retired)
- Travis Howell - (retired)
+ Travis Howell
Pawel Kolodziejski - Codecs, iMUSE, Smush, etc.
Gregory Montoir
Eugene Sandulenko - FT INSANE, MM NES, MM C64, game detection,
@@ -28,7 +39,7 @@ ScummVM Team
HE:
Jonathan Gray - (retired)
- Travis Howell - (retired)
+ Travis Howell
Gregory Montoir
Eugene Sandulenko
@@ -37,7 +48,7 @@ ScummVM Team
Matthew Hoops
Filippos Karapetis
Pawel Kolodziejski
- Walter van Niftrik
+ Walter van Niftrik - (retired)
Kari Salminen
Eugene Sandulenko
David Symonds - (retired)
@@ -45,10 +56,14 @@ ScummVM Team
AGOS:
Torbjorn Andersson
Paul Gilbert
- Travis Howell - (retired)
+ Travis Howell
Oliver Kiehl - (retired)
Ludvig Strigeus - (retired)
+ CGE:
+ Arnaud Boutonne
+ Paul Gilbert
+
Cine:
Vincent Hamm - (retired)
Pawel Kolodziejski
@@ -69,8 +84,9 @@ ScummVM Team
Pawel Kolodziejski
DreamWeb:
- Vladimir Menshakov
Torbjorn Andersson
+ Bertrand Augereau
+ Vladimir Menshakov
Gob:
Torbjorn Andersson
@@ -141,7 +157,7 @@ ScummVM Team
Max Horn - (retired)
Filippos Karapetis
Martin Kiewitz
- Walter van Niftrik
+ Walter van Niftrik - (retired)
Willem Jan Palenstijn
Jordi Vilalta Prat
Lars Skovlund
@@ -162,11 +178,11 @@ ScummVM Team
Jonathan Gray - (retired)
Sword25:
- Eugene Sandulenko
- Filippos Karapetis
- Max Horn - (retired)
- Paul Gilbert
Torbjorn Andersson
+ Paul Gilbert
+ Max Horn - (retired)
+ Filippos Karapetis
+ Eugene Sandulenko
TeenAgent:
Robert Megone - Help with callback rewriting
@@ -188,8 +204,8 @@ ScummVM Team
Gregory Montoir
TsAGE:
- Paul Gilbert
Arnaud Boutonne
+ Paul Gilbert
Tucker:
Gregory Montoir
@@ -200,6 +216,9 @@ ScummVM Team
Andre Heider
Angus Lees
+ BADA:
+ Chris Warren-Smith
+
Dreamcast:
Marcus Comstedt
@@ -213,12 +232,14 @@ ScummVM Team
Lubomyr Lisen
Maemo:
- Frantisek Dufka
+ Frantisek Dufka - (retired)
+ Tarek Soliman
Nintendo 64:
Fabio Battaglia
Nintendo DS:
+ Bertrand Augereau - HQ software scaler
Neil Millstone
OpenPandora:
@@ -234,8 +255,8 @@ ScummVM Team
Max Lingua
PSP (PlayStation Portable):
- Joost Peters
Yotam Barnoy
+ Joost Peters
SDL (Win/Linux/OS X/etc.):
Max Horn - (retired)
@@ -361,7 +382,7 @@ Other contributions
Markus Strangl
Win32:
- Travis Howell - (retired)
+ Travis Howell
Win64:
Chris Gray - (retired)
@@ -421,11 +442,11 @@ Other contributions
Websites (design)
-----------------
Dobo Balazs - Website design
+ William Claydon - Skins for doxygen, buildbot and wiki
Yaroslav Fedevych - HTML/CSS for the website
- David Jensen - SVG logo conversion
Jean Marc Gimenez - ScummVM logo
+ David Jensen - SVG logo conversion
Raina - ScummVM forum buttons
- William Claydon - Skins for doxygen, buildbot and wiki
Code contributions
------------------
@@ -452,7 +473,7 @@ Other contributions
Tim Phillips - Initial MI1 CD music support
Quietust - Sound support for Amiga SCUMM V2/V3 games, MM
NES support
- segra - Improved support for Apple II/C64 versions of MM
+ Robert Crossfield - Improved support for Apple II/C64 versions of MM
Andreas Roever - Broken Sword I & II MPEG2 cutscene support
Edward Rudd - Fixes for playing MP3 versions of MI1/Loom audio
Daniel Schepler - Final MI1 CD music support, initial Ogg Vorbis
@@ -461,50 +482,50 @@ Other contributions
FreeSCI Contributors
--------------------
- Anders Baden Nielsen - PPC testing
- Bas Zoetekouw - Man pages, debian package management, CVS
- maintenance
- Carl Muckenhoupt - Sources to the SCI resource viewer tools that
- started it all
+ Francois-R Boyer - MT-32 information and mapping code
+ Rainer Canavan - IRIX MIDI driver and bug fixes
+ Xiaojun Chen
+ Paul David Doherty - Game version information
+ Vyacheslav Dikonov - Config script improvements
+ Ruediger Hanke - Port to the MorphOS platform
+ Matt Hargett - Clean-ups, bugfixes, Hardcore QA, Win32
+ Max Horn - SetJump implementation
+ Ravi I. - SCI0 sound resource specification
+ Emmanuel Jeandel - Bugfixes and bug reports
+ Dmitry Jemerov - Port to the Win32 platform, numerous bugfixes
Chris Kehler - Makefile enhancements
- Christoph Reichenbach - UN*X code, VM/Graphics/Sound/other
- infrastructure
Christopher T. Lansdo - Original CVS maintainer, Alpha compatibility
fixes
+ Sergey Lapin - Port of Carl's type 2 decompression code
+ Rickard Lind - MT-32->GM MIDI mapping magic, sound research
+ Hubert Maier - AmigaOS 4 port
+ Johannes Manhave - Document format translation
Claudio Matsuoka - CVS snapshots, daily builds, BeOS and cygwin
ports
Dark Minister - SCI research (bytecode and parser)
- Dmitry Jemerov - Port to the Win32 platform, numerous bugfixes
- Emmanuel Jeandel - Bugfixes and bug reports
- Francois-R Boyer - MT-32 information and mapping code
+ Carl Muckenhoupt - Sources to the SCI resource viewer tools that
+ started it all
+ Anders Baden Nielsen - PPC testing
+ Walter van Niftrik - Ports to the Dreamcast and GP32 platforms
+ Rune Orsval - Configuration file editor
+ Solomon Peachy - SDL ports and much of the sound subsystem
+ Robey Pointer - Bug tracking system hosting
+ Magnus Reftel - Heap implementation, Python class viewer,
+ bugfixes
+ Christoph Reichenbach - UN*X code, VM/Graphics/Sound/other
+ infrastructure
George Reid - FreeBSD package management
- Hubert Maier - AmigaOS 4 port
- Hugues Valois - Game selection menu
- Johannes Manhave - Document format translation
- Jordi Vilalta - Numerous code and website clean-up patches
Lars Skovlund - Project maintenance, most documentation,
bugfixes, SCI1 support
- Magnus Reftel - Heap implementation, Python class viewer,
- bugfixes
- Matt Hargett - Clean-ups, bugfixes, Hardcore QA, Win32
- Max Horn - SetJump implementation
- Paul David Doherty - Game version information
- Petr Vyhnak - The DCL-INFLATE algorithm, many Win32
- improvements
- Rainer Canavan - IRIX MIDI driver and bug fixes
- Rainer De Temple - SCI research
- Ravi I. - SCI0 sound resource specification
- Ruediger Hanke - Port to the MorphOS platform
- Rune Orsval - Configuration file editor
- Rickard Lind - MT-32->GM MIDI mapping magic, sound research
Rink Springer - Port to the DOS platform, several bug fixes
- Robey Pointer - Bug tracking system hosting
- Sergey Lapin - Port of Carl's type 2 decompression code
- Solomon Peachy - SDL ports and much of the sound subsystem
- Vyacheslav Dikonov - Config script improvements
- Walter van Niftrik - Ports to the Dreamcast and GP32 platforms
- Xiaojun Chen
+ Rainer De Temple - SCI research
Sean Terrell
+ Hugues Valois - Game selection menu
+ Jordi Vilalta - Numerous code and website clean-up patches
+ Petr Vyhnak - The DCL-INFLATE algorithm, many Win32
+ improvements
+ Bas Zoetekouw - Man pages, debian package management, CVS
+ maintenance
Special thanks to Prof. Dr. Gary Nutt for allowing the FreeSCI VM
extension as a course project in his Advanced OS course.
diff --git a/COPYING b/COPYING
index 75a1ad8761..00ccfbb628 100644
--- a/COPYING
+++ b/COPYING
@@ -336,4 +336,4 @@ This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. \ No newline at end of file
+Public License instead of this License.
diff --git a/COPYING.LGPL b/COPYING.LGPL
index 56a87b85ed..8dda7c5005 100644
--- a/COPYING.LGPL
+++ b/COPYING.LGPL
@@ -506,5 +506,3 @@ necessary. Here is a sample; alter the names:
Ty Coon, President of Vice
That's all there is to it!
-
-
diff --git a/Makefile b/Makefile
index dd921b82aa..a40ef62c53 100644
--- a/Makefile
+++ b/Makefile
@@ -90,4 +90,3 @@ endif
ifneq ($(origin port_mk), undefined)
include $(srcdir)/$(port_mk)
endif
-
diff --git a/NEWS b/NEWS
index 3849d82fae..77fc9a106d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,19 +1,80 @@
For a more comprehensive changelog of the latest experimental code, see:
https://github.com/scummvm/scummvm/commits/
-1.4.0 (????-??-??)
+1.5.0 (????-??-??)
SDL ports:
- Added support for OpenGL (GSoC Task).
-1.3.1 (????-??-??)
+1.4.0 (2011-11-11)
+ New Games:
+ - Added support for Lands of Lore: The Throne of Chaos.
+ - Added support for Blue's Birthday Adventure.
+ - Added support for Ringworld: Revenge Of The Patriarch.
+ - Added support for the Amiga version of Conquests of the Longbow.
+
+ New Ports:
+ - Added PlayStation 3 port.
+
+ AGI:
+ - Implemented sound support for the DOS version of Winnie the Pooh in the
+ Hundred Acre Wood.
+
+ AGOS:
+ - Implemented support for loading data directly from InstallShield
+ cabinets in The Feeble Files and Simon the Sorcerer's Puzzle Pack.
+ - Fixed loading and saving in the PC version of Waxworks.
+ - Fixed music in the PC versions of Elvira 1/2 and Waxworks.
+
+ Groovie:
+ - Added support for the iOS version of The 7th Guest.
+
+ Lure:
+ - Fixed crash when trying to talk and ask something at the same time.
+
+ SCI:
+ - Added better handling of digital vs. synthesized sound effects. If the
+ "Mixed Adlib / MIDI mode" checkbox is checked, the engine will prefer
+ digital sound effects, otherwise their synthesized counterparts will be
+ preferred instead, if both versions of the same effect exist.
+
+ SCUMM:
+ - Implemented PC Speaker support for SCUMM v5 games.
+ - Fixed priority bug in iMuse. As a result the AdLib music should sound
+ better, since important notes are not interrupted anymore.
+ - Implemented CMS support for Loom, The Secret of Monkey Island and
+ Indiana Jones and the Last Crusade.
+ - Improved palette handling for the Amiga version of Indiana Jones and the
+ Fate of Atlantis.
+
+ Tinsel:
+ - Fixed deleting saved games from the list of saved games (from the launcher
+ and the in-game ScummVM menu).
+ - The US version of Discworld II now shows the correct title screen and
+ language flag.
+
+1.3.1 (2011-07-12)
General:
- Improved audio device detection and fallback.
There should be no more silent errors due to invalid audio devices.
Instead ScummVM should pick up a suitable alternative device.
+ Mohawk:
+ - Added detection entries for more variants of some Living Books
+ games.
+
Tinsel:
- Fixed a regression that made Discworld uncompletable.
+ SAGA:
+ - Fixed a regression in Inherit the Earth's dragon walk code which
+ was causing crashes there.
+ - Fixed a regression causing various crashes in I Have No Mouth and
+ I Must Scream.
+
+ SCI:
+ - Added detection entries for some Macintosh game versions.
+ - Audio settings are now stored correctly for the CD version of EcoQuest 1.
+
SCUMM:
- Fixed graphics bug in FM-TOWNS versions of games on ARM devices
(Android, iPhone, etc.).
diff --git a/README b/README
index e13a8c9a01..4e306d35c8 100644
--- a/README
+++ b/README
@@ -56,7 +56,7 @@ Table of Contents:
* 7.7 TiMidity++ MIDI server support
* 7.8 Using compressed audio files (MP3, Ogg Vorbis, Flac)
* 7.9 Output sample rate
-8.0) Configuration Files
+8.0) Configuration file
9.0) Compiling
@@ -153,7 +153,7 @@ support an unsupported game -- read the FAQ on our web site first.
---- ---------------
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.
+reproducible, and still occurs in the latest git/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:
@@ -164,7 +164,7 @@ completeable in the 'Supported Games' section, or compatibility list. We
-know- those games have bugs.
Please include the following information:
- - ScummVM version (PLEASE test the latest SVN/Daily build)
+ - ScummVM version (PLEASE test the latest git/Daily build)
- Bug details, including instructions on reproducing
- Language of game (English, German, ...)
- Version of game (talkie, floppy, ...)
@@ -219,6 +219,7 @@ AGI Games by Sierra:
AGOS Games by Adventuresoft/Horrorsoft:
Elvira - Mistress of the Dark [elvira1]
Elvira II - The Jaws of Cerberus [elvira2]
+ Personal Nightmare [pn]
Waxworks [waxworks]
Simon the Sorcerer 1 [simon1]
Simon the Sorcerer 2 [simon2]
@@ -276,6 +277,7 @@ SCUMM Games by Humongous Entertainment:
Blue's 123 Time Activities [Blues123Time]
Blue's ABC Time Activities [BluesABCTime]
Blue's Art Time Activities [arttime]
+ Blue's Birthday Adventure [BluesBirthday]
Blue's Reading Time Activities [readtime]
Fatty Bear's Birthday Surprise [fbear]
Fatty Bear's Fun Pack [fbpack]
@@ -302,12 +304,12 @@ SCUMM Games by Humongous Entertainment:
From Your Head to Your Feet [pajama3]
Pajama Sam's Lost & Found [lost]
Pajama Sam's Sock Works [socks]
- Putt-Putt Enters the Race [puttrace]
- Putt-Putt Goes to the Moon [puttmoon]
- Putt-Putt Joins the Circus [puttcircus]
Putt-Putt Joins the Parade [puttputt]
+ Putt-Putt Goes to the Moon [puttmoon]
Putt-Putt Saves the Zoo [puttzoo]
Putt-Putt Travels Through Time [putttime]
+ Putt-Putt Enters the Race [puttrace]
+ Putt-Putt Joins the Circus [puttcircus]
Putt-Putt and Pep's Balloon-O-Rama [balloon]
Putt-Putt and Pep's Dog on a Stick [dog]
Putt-Putt & Fatty Bear's Activity Pack [activity]
@@ -344,7 +346,6 @@ and view the compatibility chart.
Backyard Soccer [soccer]
Backyard Soccer MLS [soccermls]
Backyard Soccer 2004 [soccer2004]
- Blue's Birthday Adventure [BluesBirthday]
Blue's Treasure Hunt [BluesTreasureHunt]
Pajama Sam: Games to Play on Any Day [pjgames]
@@ -532,8 +533,8 @@ and follow the instructions in its readme.txt file. (Broken Sword II
already has subtitles; no extra work is needed for them.)
-3.7.2) Broken Sword games cutscenes, in retrospect
------- -------------------------------------------
+3.7.2) Broken Sword games cutscenes, in retrospect:
+------ --------------------------------------------
The original releases of the Broken Sword games used RAD Game Tools's
Smacker(tm) format. As RAD was unwilling to open the older legacy
versions of this format to us, and had requested we not reverse engineer
@@ -769,11 +770,12 @@ to be able to play the game under ScummVM.
3.19) Dragon History notes:
----- ---------------------
-There are 3 language variants of the game: Czech, English, and Polish.
-Each of them is distributed in a separate archive. The only official
-version is the Czech one, and the English and Polish ports have always
-been work in progress and never officially released. Although all texts
-are fully translated, it is known that some of them contain typos.
+There are 4 language variants of the game: Czech, English, Polish and
+German. Each of them is distributed in a separate archive. The only
+official version is the Czech one, and the English, Polish and German
+ports have always been work in progress and never officially released.
+Although all texts are fully translated, it is known that some of them
+contain typos.
There exists an optional Czech dubbing for the game. For bandwidth
reasons, you can download it separately and then unpack it to the
@@ -845,8 +847,8 @@ site, please see the section on reporting bugs.
Simon the Sorcerer's Puzzle Pack:
- No support for displaying, entering, loading or saving high scores.
- - No support for displaying explanation, when clicking on items in
- Swampy Adventures.
+ - No support for displaying names of items, when hovering over them
+ in Swampy Adventures.
The Feeble Files:
- Subtitles are often incomplete, they were always disabled in the
@@ -867,7 +869,7 @@ site, please see the section on reporting bugs.
ScummVM has been ported to run on many platforms and operating systems.
Links to these ports can be found either on the ScummVM web page or by a
Google search. Many thanks to our porters for their efforts. If you have
-a port of ScummVM and wish to commit it into the main SVN, feel free to
+a port of ScummVM and wish to commit it into the master git, feel free to
contact us!
Supported platforms include (but are not limited to):
@@ -882,7 +884,7 @@ Supported platforms include (but are not limited to):
Dreamcast
GP2x
iPhone (also includes iPod Touch and iPad)
- Maemo (Nokia Internet tablets 770, N800, N810, N900)
+ Maemo (Nokia Internet tablet N810)
Nintendo 64
Nintendo DS
Nintendo GameCube
@@ -942,6 +944,7 @@ arguments -- see the next section.
-z, --list-games Display list of supported games and exit
-t, --list-targets Display list of configured targets and exit
--list-saves=TARGET Display a list of savegames for the game (TARGET) specified
+ --console Enable the console window (default: enabled) (Windows only)
-c, --config=CONFIG Use alternate configuration file
-p, --path=PATH Path to where the game is installed
@@ -953,7 +956,7 @@ arguments -- see the next section.
--themepath=PATH Path to where GUI themes are stored
--list-themes Display list of all usable GUI themes
-e, --music-driver=MODE Select music driver (see also section 7.0)
- -q, --language=LANG Select language (see also section 5.2)
+ -q, --language=LANG Select game's language (see also section 5.2)
-m, --music-volume=NUM Set the music volume, 0-255 (default: 192)
-s, --sfx-volume=NUM Set the sfx volume, 0-255 (default: 192)
-r, --speech-volume=NUM Set the voice volume, 0-255 (default: 192)
@@ -1024,8 +1027,8 @@ Examples:
5.2) Language options:
---- -----------------
ScummVM includes a language option for Maniac Mansion, Zak McKracken,
-The Dig, The Curse of Monkey Island, Beneath a Steel Sky, Broken Sword
-and Simon the Sorcerer 1 and 2.
+The Dig, The Curse of Monkey Island, Beneath a Steel Sky and
+Broken Sword.
Note that with the exception of Beneath a Steel Sky, Broken Sword,
multilanguage versions of Goblins games and Nippon Safes Inc., using
@@ -1079,16 +1082,6 @@ Broken Sword
pt - Portuguese
cz - Czech
-Simon the Sorcerer 1 and 2
- en - English (default)
- de - German
- fr - French
- it - Italian
- es - Spanish
- he - Hebrew
- pl - Polish
- ru - Russian
-
5.3) Graphics filters:
---- -----------------
@@ -1115,8 +1108,8 @@ They are:
tv2x - Interlace filter, tries to emulate a TV. Factor 2x.
dotmatrix - Dot matrix effect. Factor 2x.
-To select a graphics filter, pass its name via the '-g' option to
-scummvm, for example:
+To select a graphics filter, select it in the Launcher, or pass its name
+via the '-g' option to scummvm, for example:
scummvm -gadvmame2x monkey2
@@ -1170,8 +1163,8 @@ Engines which currently support returning to the Launcher are:
TUCKER
-5.5) Hot Keys:
----- ---------
+5.5) Hotkeys:
+---- --------
ScummVM supports various in-game hotkeys. They differ between SCUMM games and
other games.
@@ -1282,10 +1275,14 @@ other games.
b - Background sounds on/off
[Simon the Sorcerer 2 only]
Pause - Pauses
- t - Switch between speech and subtitles
+ t - Switch between speech only and
+ combined speech and subtitles
+ [Simon the Sorcerer 1 CD (other than
+ English and German) and Simon the
+ Sorcerer 2 CD (all languages)]
v - Switch between subtitles only and
combined speech and subtitles
- [Simon the Sorcerer 2 only]
+ [Simon the Sorcerer 2 CD only]
Simon the Sorcerer's Puzzle Pack
Ctrl-d - Starts the debugger
@@ -1303,7 +1300,8 @@ other games.
F9 - Hitbox names on/off
s - Sound effects on/off
Pause - Pauses
- t - Switch between speech and subtitles
+ t - Switch between speech only and
+ combined speech and subtitles
v - Switch between subtitles only and
combined speech and subtitles
@@ -1445,14 +1443,14 @@ Where 'xxx' is exact the saved game slot (ie 001) under ScummVM
7.0) Music and Sound:
---- ----------------
On most operating systems and for most games, ScummVM will by default
-use AdLib emulation for music playback. MIDI may not be available on all
-operating systems or may need manual configuration. If you want to use
-MIDI, you have several different choices of output, depending on your
-operating system and configuration.
+use MT-32 or AdLib emulation for music playback. MIDI may not be
+available on all operating systems or may need manual configuration. If
+you want to use MIDI, you have several different choices of output,
+depending on your operating system and configuration.
null - Null output. Don't play any music.
- adlib - Internal AdLib emulation (default)
+ adlib - Internal AdLib emulation
fluidsynth - FluidSynth MIDI emulation
mt32 - Internal MT-32 emulation
pcjr - Internal PCjr emulation (only usable in SCUMM games)
@@ -1477,7 +1475,7 @@ via the '-e' option to scummvm, for example:
7.1) Playing sound with AdLib emulation:
---- -----------------------------------
By default an AdLib card will be emulated and ScummVM will output the
-music as sampled waves. This is the default mode for most games, and
+music as sampled waves. This is the default mode for several games, and
offers the best compatibility between machines and games.
@@ -1648,7 +1646,7 @@ command as described earlier in this section.
7.6.2) Playing sound with IRIX dmedia sequencer: [UNIX ONLY]
----- ------------------------------------------
+---- -------------------------------------------
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
@@ -1672,7 +1670,7 @@ 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
+If your system lacks any MIDI sequencer, but you still want better MIDI
quality than default AdLib emulation can offer, you can try the
TiMidity++ MIDI server. See http://timidity.sourceforge.net/ for
download and install instructions.
@@ -1714,9 +1712,9 @@ q specifying the desired quality from 0 to 10:
7.8.2) Using Flac files for CD audio:
------- ------------------------------------
+------ ------------------------------
Use flac or some other flac encoder to encode the audio tracks to files.
-Name the files track1.flac track2.flac etc. In your filesystem only
+Name the files track1.flac track2.flac etc. If your filesystem only
allows three letter extensions, name the files track1.fla track2.fla
etc. ScummVM must be compiled with flac support to use this option. You
will need to rip the files from the CD as a WAV file, then encode the
@@ -1752,7 +1750,7 @@ of time than MP3, so have a good book handy.
7.8.5) Compressing MONSTER.SOU with Flac:
------- ----------------------------------------
+------ ----------------------------------
As above, but ScummVM must be compiled with Flac support. Run:
compress_scumm_sou --flac monster.sou
@@ -1766,8 +1764,8 @@ those kind of soundfiles. Be sure to read the encoder documentation
before you use other values.
-7.8.6) Compressing music/sfx/speech in AGOS games
------- -----------------------------------------------------------------
+7.8.6) Compressing music/sfx/speech in AGOS games:
+------ -------------------------------------------
Use our 'compress_agos' utility from the scummvm-tools package to
perform this task. You can choose between multiple target formats, but
note that you can only use each if ScummVM was compiled with the
@@ -1801,14 +1799,14 @@ Eventually you will have a much smaller *.mp3, *.ogg or *.fla file, copy
this file to your game directory. You can safely remove the old file.
-7.8.7) Compressing speech/music in Broken Sword
------- ----------------------------------------
+7.8.7) Compressing speech/music in Broken Sword:
+------ -----------------------------------------
The 'compress_sword1' tool from the scummvm-tools package can encode
-music and speech to MP3 as well as Ogg Vorbis. The easiest way to encode
-the files is simply copying the executable into your BS1 directory
-(together with the lame encoder) and run it from there. This way, it
-will automatically encode everything to MP3. Afterwards, you can
-manually remove the SPEECH?.CLU files and the wave music files.
+music and speech to MP3, Ogg Vorbis as well as Flac. The easiest way
+to encode the files is simply copying the executable into your
+BS1 directory (together with the lame encoder) and run it from there.
+This way, it will automatically encode everything to MP3. Afterwards,
+you can manually remove the SPEECH?.CLU files and the wave music files.
Running "compress_sword1 --vorbis" will compress the files using Ogg
Vorbis instead of MP3.
@@ -1819,8 +1817,8 @@ instead of MP3.
Use "compress_sword1 --help" to get a full list of the options.
-7.8.8) Compressing speech/music in Broken Sword II
------- -------------------------------------------
+7.8.8) Compressing speech/music in Broken Sword II:
+------ --------------------------------------------
Use our 'compress_sword2' utility from the scummvm-tools package to
perform this task. You can choose between multiple target formats, but
note that you can only use each if ScummVM was compiled with the
@@ -1974,6 +1972,7 @@ The following keywords are recognized:
confirm_exit bool Ask for confirmation by the user before quitting
(SDL backend only).
+ console bool Enable the console window (default: enabled) (Windows only).
cdrom number Number of CD-ROM unit to use for audio. If
negative, don't even try to access the CD-ROM.
joystick_num number Number of joystick device to use for input
@@ -2022,7 +2021,7 @@ Flight of the Amazon Queen adds the following non-standard keywords:
music_mute bool If true, music is muted
sfx_mute bool If true, sound effects are muted
-King's Quest VI Windows adds the following non-standard keywords:
+King's Quest VI Windows adds the following non-standard keyword:
windows_cursors bool If true, the original unscaled black and white
Windows cursors are used instead of the DOS
@@ -2056,7 +2055,7 @@ compressed sound. For compressed save states, zlib is required.
Some parts of ScummVM, particularly scalers, have highly optimized
versions written in assembler. If you wish to use this option, you will
-need to install nasm assembler (see http://nasm.sf.net). Note, that
+need to install nasm assembler (see http://nasm.sf.net). Note that
currently we have only x86 MMX optimized versions, and they will not
compile on other processors.
@@ -2073,19 +2072,12 @@ debug messages (see http://www.sysinternals.com/ntw2k/freeware/debugview.shtml).
respectively
http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW
- Microsoft Visual C++ 6.0:
- * Open the workspace file "scummwm.dsw" in the "dists\msvc6" directory.
- * Enter the path to the needed libraries and includes in
- "Tools|Options|Directories".
- * Now it should compile successfully.
- * For more information refer to:
- http://wiki.scummvm.org/index.php/Compiling_ScummVM/VS2005
-
- Microsoft Visual C++ 7.0/8.0:
- * Open the solution file "scummwm.sln" in the "dists\msvc7"
- respectively "dists\msvc8" directory.
+ Microsoft Visual C++ 8/9/10:
+ * Read up on how to create the project files in "dists\msvc8",
+ "dists\msvc9" respectively "dists\msvc10".
+ * Open the resulting solution file.
* Enter the path to the needed libraries and includes in
- Tools|Options|Projects|VC++ Directories".
+ Tools|Options|Projects and Solutions|VC++ Directories".
* Now it should compile successfully.
* For more information refer to:
http://wiki.scummvm.org/index.php/Compiling_ScummVM/VS2005
@@ -2135,12 +2127,11 @@ debug messages (see http://www.sysinternals.com/ntw2k/freeware/debugview.shtml).
http://wiki.scummvm.org/index.php/Compiling_ScummVM/iPhone
Maemo:
- * Get Scratchbox environment with Maemo 2.2 rootstrap (2.2 is for 770 and up)
+ * Install Maemo SDK with 4.1.2 rootstrap
* Install libmad, Tremor, FLAC from source
- * patch scummvm source (some stuff is currently too dirty to be in svn directly)
- patch -p1 < backends/platform/maemo/scummvm-[currentversion]-maemo.patch
+ * run 'ln -s backends/platform/maemo/debian'
* update debian/changelog
- * run 'fakeroot dpkg-buildpackage -b -d'
+ * run 'sb2 dpkg-buildpackage -b'
------------------------------------------------------------------------
Good Luck and Happy Adventuring!
diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp
index 547aa77526..1c5c435359 100644
--- a/audio/audiostream.cpp
+++ b/audio/audiostream.cpp
@@ -61,15 +61,13 @@ static const StreamFileFormat STREAM_FILEFORMATS[] = {
{ "MPEG Layer 3", ".mp3", makeMP3Stream },
#endif
{ "MPEG-4 Audio", ".m4a", makeQuickTimeStream },
-
- { NULL, NULL, NULL } // Terminator
};
SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &basename) {
SeekableAudioStream *stream = NULL;
Common::File *fileHandle = new Common::File();
- for (int i = 0; i < ARRAYSIZE(STREAM_FILEFORMATS)-1 && stream == NULL; ++i) {
+ for (int i = 0; i < ARRAYSIZE(STREAM_FILEFORMATS); ++i) {
Common::String filename = basename + STREAM_FILEFORMATS[i].fileExtension;
fileHandle->open(filename);
if (fileHandle->isOpen()) {
@@ -93,7 +91,7 @@ SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &b
#pragma mark -
LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse)
- : _parent(stream), _disposeAfterUse(disposeAfterUse), _loops(loops), _completeIterations(0) {
+ : _parent(stream, disposeAfterUse), _loops(loops), _completeIterations(0) {
assert(stream);
if (!stream->rewind()) {
@@ -102,11 +100,6 @@ LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops
}
}
-LoopingAudioStream::~LoopingAudioStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _parent;
-}
-
int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
if ((_loops && _completeIterations == _loops) || !numSamples)
return 0;
@@ -169,7 +162,7 @@ SubLoopingAudioStream::SubLoopingAudioStream(SeekableAudioStream *stream,
const Timestamp loopStart,
const Timestamp loopEnd,
DisposeAfterUse::Flag disposeAfterUse)
- : _parent(stream), _disposeAfterUse(disposeAfterUse), _loops(loops),
+ : _parent(stream, disposeAfterUse), _loops(loops),
_pos(0, getRate() * (isStereo() ? 2 : 1)),
_loopStart(convertTimeToStreamPos(loopStart, getRate(), isStereo())),
_loopEnd(convertTimeToStreamPos(loopEnd, getRate(), isStereo())),
@@ -180,11 +173,6 @@ SubLoopingAudioStream::SubLoopingAudioStream(SeekableAudioStream *stream,
_done = true;
}
-SubLoopingAudioStream::~SubLoopingAudioStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _parent;
-}
-
int SubLoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
if (_done)
return 0;
@@ -225,7 +213,7 @@ int SubLoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
#pragma mark -
SubSeekableAudioStream::SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse)
- : _parent(parent), _disposeAfterUse(disposeAfterUse),
+ : _parent(parent, disposeAfterUse),
_start(convertTimeToStreamPos(start, getRate(), isStereo())),
_pos(0, getRate() * (isStereo() ? 2 : 1)),
_length(convertTimeToStreamPos(end, getRate(), isStereo()) - _start) {
@@ -234,11 +222,6 @@ SubSeekableAudioStream::SubSeekableAudioStream(SeekableAudioStream *parent, cons
_parent->seek(_start);
}
-SubSeekableAudioStream::~SubSeekableAudioStream() {
- if (_disposeAfterUse)
- delete _parent;
-}
-
int SubSeekableAudioStream::readBuffer(int16 *buffer, const int numSamples) {
int framesLeft = MIN(_length.frameDiff(_pos), numSamples);
int framesRead = _parent->readBuffer(buffer, framesLeft);
diff --git a/audio/audiostream.h b/audio/audiostream.h
index 0ffaa241ce..9c28e4d67f 100644
--- a/audio/audiostream.h
+++ b/audio/audiostream.h
@@ -23,6 +23,7 @@
#ifndef SOUND_AUDIOSTREAM_H
#define SOUND_AUDIOSTREAM_H
+#include "common/ptr.h"
#include "common/scummsys.h"
#include "common/str.h"
#include "common/types.h"
@@ -114,7 +115,6 @@ public:
* @param disposeAfterUse Destroy the stream after the LoopingAudioStream has finished playback.
*/
LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
- ~LoopingAudioStream();
int readBuffer(int16 *buffer, const int numSamples);
bool endOfData() const;
@@ -129,8 +129,7 @@ public:
*/
uint getCompleteIterations() const { return _completeIterations; }
private:
- RewindableAudioStream *_parent;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<RewindableAudioStream> _parent;
uint _loops;
uint _completeIterations;
@@ -246,7 +245,6 @@ public:
const Timestamp loopStart,
const Timestamp loopEnd,
DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
- ~SubLoopingAudioStream();
int readBuffer(int16 *buffer, const int numSamples);
bool endOfData() const { return _done; }
@@ -254,8 +252,7 @@ public:
bool isStereo() const { return _parent->isStereo(); }
int getRate() const { return _parent->getRate(); }
private:
- SeekableAudioStream *_parent;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<SeekableAudioStream> _parent;
uint _loops;
Timestamp _pos;
@@ -283,7 +280,6 @@ public:
* @param disposeAfterUse Whether the parent stream object should be destroyed on destruction of the SubSeekableAudioStream.
*/
SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
- ~SubSeekableAudioStream();
int readBuffer(int16 *buffer, const int numSamples);
@@ -297,8 +293,7 @@ public:
Timestamp getLength() const { return _length; }
private:
- SeekableAudioStream *_parent;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<SeekableAudioStream> _parent;
const Timestamp _start;
const Timestamp _length;
diff --git a/audio/decoders/aac.cpp b/audio/decoders/aac.cpp
index 874062a702..7700bb3215 100644
--- a/audio/decoders/aac.cpp
+++ b/audio/decoders/aac.cpp
@@ -8,19 +8,16 @@
* 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 "audio/decoders/aac.h"
@@ -28,74 +25,34 @@
#ifdef USE_FAAD
#include "common/debug.h"
+#include "common/memstream.h"
#include "common/stream.h"
#include "common/textconsole.h"
#include "common/util.h"
#include "audio/audiostream.h"
+#include "audio/decoders/codec.h"
+#include "audio/decoders/raw.h"
#include <neaacdec.h>
namespace Audio {
-class AACStream : public AudioStream {
+class AACDecoder : public Codec {
public:
- AACStream(Common::SeekableReadStream *stream,
- DisposeAfterUse::Flag disposeStream,
- Common::SeekableReadStream *extraData,
+ AACDecoder(Common::SeekableReadStream *extraData,
DisposeAfterUse::Flag disposeExtraData);
- ~AACStream();
-
- int readBuffer(int16 *buffer, const int numSamples);
+ ~AACDecoder();
- bool endOfData() const { return _inBufferPos >= _inBufferSize && !_remainingSamples; }
- bool isStereo() const { return _channels == 2; }
- int getRate() const { return _rate; }
+ AudioStream *decodeFrame(Common::SeekableReadStream &stream);
private:
NeAACDecHandle _handle;
byte _channels;
unsigned long _rate;
-
- byte *_inBuffer;
- uint32 _inBufferSize;
- uint32 _inBufferPos;
-
- int16 *_remainingSamples;
- uint32 _remainingSamplesSize;
- uint32 _remainingSamplesPos;
-
- void init(Common::SeekableReadStream *extraData);
};
-AACStream::AACStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeStream,
- Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) {
-
- _remainingSamples = 0;
- _inBufferPos = 0;
-
- init(extraData);
-
- // Copy all the data to a pointer so it can be passed through
- // (At least MPEG-4 chunks shouldn't be large)
- _inBufferSize = stream->size();
- _inBuffer = new byte[_inBufferSize];
- stream->read(_inBuffer, _inBufferSize);
-
- if (disposeStream == DisposeAfterUse::YES)
- delete stream;
-
- if (disposeExtraData == DisposeAfterUse::YES)
- delete extraData;
-}
-
-AACStream::~AACStream() {
- NeAACDecClose(_handle);
- delete[] _inBuffer;
- delete[] _remainingSamples;
-}
-
-void AACStream::init(Common::SeekableReadStream *extraData) {
+AACDecoder::AACDecoder(Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) {
// Open the library
_handle = NeAACDecOpen();
@@ -117,59 +74,55 @@ void AACStream::init(Common::SeekableReadStream *extraData) {
if (err < 0)
error("Could not initialize AAC decoder: %s", NeAACDecGetErrorMessage(err));
-}
-int AACStream::readBuffer(int16 *buffer, const int numSamples) {
- int samples = 0;
-
- assert((numSamples % _channels) == 0);
+ if (disposeExtraData == DisposeAfterUse::YES)
+ delete extraData;
+}
- // Dip into our remaining samples pool if it's available
- if (_remainingSamples) {
- samples = MIN<int>(numSamples, _remainingSamplesSize - _remainingSamplesPos);
+AACDecoder::~AACDecoder() {
+ NeAACDecClose(_handle);
+}
- memcpy(buffer, _remainingSamples + _remainingSamplesPos, samples * 2);
- _remainingSamplesPos += samples;
+AudioStream *AACDecoder::decodeFrame(Common::SeekableReadStream &stream) {
+ // read everything into a buffer
+ uint32 inBufferPos = 0;
+ uint32 inBufferSize = stream.size();
+ byte *inBuffer = new byte[inBufferSize];
+ stream.read(inBuffer, inBufferSize);
- if (_remainingSamplesPos == _remainingSamplesSize) {
- delete[] _remainingSamples;
- _remainingSamples = 0;
- }
- }
+ QueuingAudioStream *audioStream = makeQueuingAudioStream(_rate, _channels == 2);
// Decode until we have enough samples (or there's no more left)
- while (samples < numSamples && !endOfData()) {
+ while (inBufferPos < inBufferSize) {
NeAACDecFrameInfo frameInfo;
- uint16 *decodedSamples = (uint16 *)NeAACDecDecode(_handle, &frameInfo, _inBuffer + _inBufferPos, _inBufferSize - _inBufferPos);
+ void *decodedSamples = NeAACDecDecode(_handle, &frameInfo, inBuffer + inBufferPos, inBufferSize - inBufferPos);
if (frameInfo.error != 0)
error("Failed to decode AAC frame: %s", NeAACDecGetErrorMessage(frameInfo.error));
- int decodedSampleSize = frameInfo.samples;
- int copySamples = (decodedSampleSize > (numSamples - samples)) ? (numSamples - samples) : decodedSampleSize;
+ byte *buffer = (byte *)malloc(frameInfo.samples * 2);
+ memcpy(buffer, decodedSamples, frameInfo.samples * 2);
+
+ byte flags = FLAG_16BITS;
- memcpy(buffer + samples, decodedSamples, copySamples * 2);
- samples += copySamples;
+ if (_channels == 2)
+ flags |= FLAG_STEREO;
- // Copy leftover samples for use in a later readBuffer() call
- if (copySamples != decodedSampleSize) {
- _remainingSamplesSize = decodedSampleSize - copySamples;
- _remainingSamples = new int16[_remainingSamplesSize];
- _remainingSamplesPos = 0;
- memcpy(_remainingSamples, decodedSamples + copySamples, _remainingSamplesSize * 2);
- }
+#ifdef SCUMM_LITTLE_ENDIAN
+ flags |= FLAG_LITTLE_ENDIAN;
+#endif
- _inBufferPos += frameInfo.bytesconsumed;
+ audioStream->queueBuffer(buffer, frameInfo.samples * 2, DisposeAfterUse::YES, flags);
+
+ inBufferPos += frameInfo.bytesconsumed;
}
- return samples;
+ return audioStream;
}
// Factory function
-AudioStream *makeAACStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeStream,
- Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) {
-
- return new AACStream(stream, disposeStream, extraData, disposeExtraData);
+Codec *makeAACDecoder(Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) {
+ return new AACDecoder(extraData, disposeExtraData);
}
} // End of namespace Audio
diff --git a/audio/decoders/aac.h b/audio/decoders/aac.h
index efcbcc6f42..68e322c844 100644
--- a/audio/decoders/aac.h
+++ b/audio/decoders/aac.h
@@ -8,19 +8,16 @@
* 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$
- *
*/
/**
@@ -43,23 +40,19 @@ namespace Common {
namespace Audio {
-class AudioStream;
+class Codec;
/**
- * Create a new AudioStream from the AAC data of an MPEG-4 file in the given stream.
+ * Create a new Codec for decoding AAC data of an MPEG-4 file in the given stream.
*
* @note This should *only* be called by our QuickTime/MPEG-4 decoder since it relies
* on the MPEG-4 extra data. If you want to decode a file using AAC, go use
* makeQuickTimeStream() instead!
- * @param stream the SeekableReadStream from which to read the AAC data
- * @param disposeStream whether to delete the stream after use
* @param extraData the SeekableReadStream from which to read the AAC extra data
* @param disposeExtraData whether to delete the extra data stream after use
- * @return a new AudioStream, or NULL, if an error occurred
+ * @return a new Codec, or NULL, if an error occurred
*/
-AudioStream *makeAACStream(
- Common::SeekableReadStream *stream,
- DisposeAfterUse::Flag disposeStream,
+Codec *makeAACDecoder(
Common::SeekableReadStream *extraData,
DisposeAfterUse::Flag disposeExtraData = DisposeAfterUse::NO);
diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp
index f75196c882..535652a0b3 100644
--- a/audio/decoders/adpcm.cpp
+++ b/audio/decoders/adpcm.cpp
@@ -41,8 +41,7 @@ namespace Audio {
// <http://wiki.multimedia.cx/index.php?title=Microsoft_IMA_ADPCM>.
ADPCMStream::ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign)
- : _stream(stream),
- _disposeAfterUse(disposeAfterUse),
+ : _stream(stream, disposeAfterUse),
_startpos(stream->pos()),
_endpos(_startpos + size),
_channels(channels),
@@ -52,11 +51,6 @@ ADPCMStream::ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Fl
reset();
}
-ADPCMStream::~ADPCMStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _stream;
-}
-
void ADPCMStream::reset() {
memset(&_status, 0, sizeof(_status));
_blockPos[0] = _blockPos[1] = _blockAlign; // To make sure first header is read
@@ -234,7 +228,7 @@ int MSIma_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) {
while (samples < numSamples && _samplesLeft[0] != 0) {
for (int i = 0; i < _channels; i++) {
- buffer[samples] = _buffer[i][8 - _samplesLeft[i]];
+ buffer[samples + i] = _buffer[i][8 - _samplesLeft[i]];
_samplesLeft[i]--;
}
diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h
index c9f894fb84..38514d7fca 100644
--- a/audio/decoders/adpcm_intern.h
+++ b/audio/decoders/adpcm_intern.h
@@ -33,6 +33,7 @@
#include "audio/audiostream.h"
#include "common/endian.h"
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/textconsole.h"
@@ -41,8 +42,7 @@ namespace Audio {
class ADPCMStream : public RewindableAudioStream {
protected:
- Common::SeekableReadStream *_stream;
- const DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _stream;
const int32 _startpos;
const int32 _endpos;
const int _channels;
@@ -62,7 +62,6 @@ protected:
public:
ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign);
- ~ADPCMStream();
virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos); }
virtual bool isStereo() const { return _channels == 2; }
diff --git a/engines/tsage/blueforce_logic.h b/audio/decoders/codec.h
index 9237e50a13..93b6878dee 100644
--- a/engines/tsage/blueforce_logic.h
+++ b/audio/decoders/codec.h
@@ -8,35 +8,37 @@
* 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
+ * 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 TSAGE_BLUEFORCE_LOGIC_H
-#define TSAGE_BLUEFORCE_LOGIC_H
+#ifndef AUDIO_DECODERS_CODEC_H
+#define AUDIO_DECODERS_CODEC_H
+
+namespace Common {
+ class SeekableReadStream;
+}
-#include "common/scummsys.h"
-#include "tsage/events.h"
-#include "tsage/core.h"
-#include "tsage/scenes.h"
-#include "tsage/globals.h"
+namespace Audio {
-namespace tSage {
+class AudioStream;
-class BlueForceGame: public Game {
+class Codec {
public:
- virtual void start();
- virtual Scene *createScene(int sceneNumber);
+ Codec() {}
+ virtual ~Codec() {}
+
+ virtual AudioStream *decodeFrame(Common::SeekableReadStream &data) = 0;
};
-} // End of namespace tSage
+} // End of namespace Audio
#endif
diff --git a/audio/decoders/mp3.cpp b/audio/decoders/mp3.cpp
index 8d7f006ec7..00669945c2 100644
--- a/audio/decoders/mp3.cpp
+++ b/audio/decoders/mp3.cpp
@@ -25,6 +25,7 @@
#ifdef USE_MAD
#include "common/debug.h"
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/textconsole.h"
#include "common/util.h"
@@ -52,8 +53,7 @@ protected:
MP3_STATE_EOS // end of data reached (may need to loop)
};
- Common::SeekableReadStream *_inStream;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _inStream;
uint _posInFrame;
State _state;
@@ -95,8 +95,7 @@ protected:
};
MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) :
- _inStream(inStream),
- _disposeAfterUse(dispose),
+ _inStream(inStream, dispose),
_posInFrame(0),
_state(MP3_STATE_INIT),
_length(0, 1000),
@@ -134,9 +133,6 @@ MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag
MP3Stream::~MP3Stream() {
deinitStream();
-
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _inStream;
}
void MP3Stream::decodeMP3Data() {
diff --git a/audio/decoders/qdm2.cpp b/audio/decoders/qdm2.cpp
index a178c363b5..19b30217e9 100644
--- a/audio/decoders/qdm2.cpp
+++ b/audio/decoders/qdm2.cpp
@@ -28,10 +28,13 @@
#ifdef AUDIO_QDM2_H
#include "audio/audiostream.h"
+#include "audio/decoders/codec.h"
#include "audio/decoders/qdm2data.h"
+#include "audio/decoders/raw.h"
#include "common/array.h"
#include "common/debug.h"
+#include "common/math.h"
#include "common/stream.h"
#include "common/textconsole.h"
@@ -150,19 +153,14 @@ struct RDFTContext {
FFTContext fft;
};
-class QDM2Stream : public AudioStream {
+class QDM2Stream : public Codec {
public:
- QDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData);
+ QDM2Stream(Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData);
~QDM2Stream();
- bool isStereo() const { return _channels == 2; }
- bool endOfData() const { return _stream->pos() >= _stream->size() && _outputSamples.size() == 0 && _subPacket == 0; }
- int getRate() const { return _sampleRate; }
- int readBuffer(int16 *buffer, const int numSamples);
+ AudioStream *decodeFrame(Common::SeekableReadStream &stream);
private:
- Common::SeekableReadStream *_stream;
-
// Parameters from codec header, do not change during playback
uint8 _channels;
uint16 _sampleRate;
@@ -204,7 +202,6 @@ private:
// I/O data
uint8 *_compressedData;
float _outputBuffer[1024];
- Common::Array<int16> _outputSamples;
// Synthesis filter
int16 ff_mpa_synth_window[512];
@@ -285,7 +282,7 @@ private:
void qdm2_fft_tone_synthesizer(uint8 sub_packet);
void qdm2_calculate_fft(int channel);
void qdm2_synthesis_filter(uint8 index);
- int qdm2_decodeFrame(Common::SeekableReadStream *in);
+ bool qdm2_decodeFrame(Common::SeekableReadStream &in, QueuingAudioStream *audioStream);
};
// Fix compilation for non C99-compliant compilers, like MSVC
@@ -293,21 +290,6 @@ private:
typedef signed long long int int64_t;
#endif
-// Integer log2 function. This is much faster than invoking
-// double precision C99 log2 math functions or equivalent, since
-// this is only used to determine maximum number of bits needed
-// i.e. only non-fractional part is needed. Also, the double
-// version is incorrect for exact cases due to floating point
-// rounding errors.
-static inline int scummvm_log2(int n) {
- int ret = -1;
- while(n != 0) {
- n /= 2;
- ret++;
- }
- return ret;
-}
-
#define QDM2_LIST_ADD(list, size, packet) \
do { \
if (size > 0) \
@@ -1711,7 +1693,7 @@ void QDM2Stream::initVlc(void) {
}
}
-QDM2Stream::QDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData) {
+QDM2Stream::QDM2Stream(Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) {
uint32 tmp;
int32 tmp_s;
int tmp_val;
@@ -1719,7 +1701,6 @@ QDM2Stream::QDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadS
debug(1, "QDM2Stream::QDM2Stream() Call");
- _stream = stream;
_compressedData = NULL;
_subPacket = 0;
_superBlockStart = 0;
@@ -1841,11 +1822,11 @@ QDM2Stream::QDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadS
warning("QDM2Stream::QDM2Stream() u4 field not 0");
}
- _fftOrder = scummvm_log2(_frameSize) + 1;
+ _fftOrder = Common::intLog2(_frameSize) + 1;
_fftFrameSize = 2 * _frameSize; // complex has two floats
// something like max decodable tones
- _groupOrder = scummvm_log2(_blockSize) + 1;
+ _groupOrder = Common::intLog2(_blockSize) + 1;
_sFrameSize = _blockSize / 16; // 16 iterations per super block
_subSampling = _fftOrder - 7;
@@ -1906,11 +1887,13 @@ QDM2Stream::QDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadS
initNoiseSamples();
_compressedData = new uint8[_packetSize];
+
+ if (disposeExtraData == DisposeAfterUse::YES)
+ delete extraData;
}
QDM2Stream::~QDM2Stream() {
delete[] _compressedData;
- delete _stream;
}
static int qdm2_get_vlc(GetBitContext *gb, VLC *vlc, int flag, int depth) {
@@ -3158,30 +3141,30 @@ void QDM2Stream::qdm2_synthesis_filter(uint8 index)
_outputBuffer[_channels * i + ch] += (float)(samples[_channels * sub_sampling * i + ch] >> (sizeof(int16)*8-16));
}
-int QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream *in) {
- debug(1, "QDM2Stream::qdm2_decodeFrame in->pos(): %d in->size(): %d", in->pos(), in->size());
+bool QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream &in, QueuingAudioStream *audioStream) {
+ debug(1, "QDM2Stream::qdm2_decodeFrame in.pos(): %d in.size(): %d", in.pos(), in.size());
int ch, i;
const int frame_size = (_sFrameSize * _channels);
// If we're in any packet but the first, seek back to the first
if (_subPacket == 0)
- _superBlockStart = in->pos();
+ _superBlockStart = in.pos();
else
- in->seek(_superBlockStart);
+ in.seek(_superBlockStart);
// select input buffer
- if (in->eos() || in->pos() >= in->size()) {
+ if (in.eos() || in.pos() >= in.size()) {
debug(1, "QDM2Stream::qdm2_decodeFrame End of Input Stream");
- return 0;
+ return false;
}
- if ((in->size() - in->pos()) < _packetSize) {
- debug(1, "QDM2Stream::qdm2_decodeFrame Insufficient Packet Data in Input Stream Found: %d Need: %d", in->size() - in->pos(), _packetSize);
- return 0;
+ if ((in.size() - in.pos()) < _packetSize) {
+ debug(1, "QDM2Stream::qdm2_decodeFrame Insufficient Packet Data in Input Stream Found: %d Need: %d", in.size() - in.pos(), _packetSize);
+ return false;
}
- if (!in->eos()) {
- in->read(_compressedData, _packetSize);
+ if (!in.eos()) {
+ in.read(_compressedData, _packetSize);
debug(1, "QDM2Stream::qdm2_decodeFrame constructed input data");
}
@@ -3190,7 +3173,7 @@ int QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream *in) {
memset(&_outputBuffer[frame_size], 0, frame_size * sizeof(float));
debug(1, "QDM2Stream::qdm2_decodeFrame cleared outputBuffer");
- if (!in->eos()) {
+ if (!in.eos()) {
// decode block of QDM2 compressed data
debug(1, "QDM2Stream::qdm2_decodeFrame decode block of QDM2 compressed data");
if (_subPacket == 0) {
@@ -3218,7 +3201,7 @@ int QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream *in) {
if (!_hasErrors && _subPacketListC[0].packet != NULL) {
error("QDM2 : has errors, and C list is not empty");
- return 0;
+ return false;
}
}
@@ -3236,6 +3219,12 @@ int QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream *in) {
debug(1, "QDM2Stream::qdm2_decodeFrame clip and convert output float[] to 16bit signed samples");
}
+ if (frame_size == 0)
+ return false;
+
+ // Prepare a buffer for queuing
+ uint16 *outputBuffer = (uint16 *)malloc(frame_size * 2);
+
for (i = 0; i < frame_size; i++) {
int value = (int)_outputBuffer[i];
@@ -3244,34 +3233,35 @@ int QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream *in) {
else if (value < -SOFTCLIP_THRESHOLD)
value = (value < -HARDCLIP_THRESHOLD) ? -32767 : -_softclipTable[-value - SOFTCLIP_THRESHOLD];
- _outputSamples.push_back(value);
+ outputBuffer[i] = value;
}
- return frame_size;
-}
-int QDM2Stream::readBuffer(int16 *buffer, const int numSamples) {
- debug(1, "QDM2Stream::readBuffer numSamples: %d", numSamples);
- int32 decodedSamples = _outputSamples.size();
- int32 i;
+ // Queue the translated buffer to our stream
+ byte flags = FLAG_16BITS;
- while (decodedSamples < numSamples) {
- i = qdm2_decodeFrame(_stream);
- if (i == 0)
- break; // Out Of Decode Frames...
- decodedSamples += i;
- }
+ if (_channels == 2)
+ flags |= FLAG_STEREO;
+
+#ifdef SCUMM_LITTLE_ENDIAN
+ flags |= FLAG_LITTLE_ENDIAN;
+#endif
+
+ audioStream->queueBuffer((byte *)outputBuffer, frame_size * 2, DisposeAfterUse::YES, flags);
+
+ return true;
+}
- if (decodedSamples > numSamples)
- decodedSamples = numSamples;
+AudioStream *QDM2Stream::decodeFrame(Common::SeekableReadStream &stream) {
+ QueuingAudioStream *audioStream = makeQueuingAudioStream(_sampleRate, _channels == 2);
- for (i = 0; i < decodedSamples; i++)
- buffer[i] = _outputSamples.remove_at(0);
+ while (qdm2_decodeFrame(stream, audioStream))
+ ;
- return decodedSamples;
+ return audioStream;
}
-AudioStream *makeQDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData) {
- return new QDM2Stream(stream, extraData);
+Codec *makeQDM2Decoder(Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) {
+ return new QDM2Stream(extraData, disposeExtraData);
}
} // End of namespace Audio
diff --git a/audio/decoders/qdm2.h b/audio/decoders/qdm2.h
index c0ec647bfd..f0793e3c1e 100644
--- a/audio/decoders/qdm2.h
+++ b/audio/decoders/qdm2.h
@@ -26,22 +26,25 @@
#ifndef AUDIO_QDM2_H
#define AUDIO_QDM2_H
+#include "common/types.h"
+
namespace Common {
class SeekableReadStream;
}
namespace Audio {
-class AudioStream;
+class Codec;
/**
- * Create a new AudioStream from the QDM2 data in the given stream.
+ * Create a new Codec from the QDM2 data in the given stream.
*
- * @param stream the SeekableReadStream from which to read the FLAC data
- * @param extraData the QuickTime extra data stream
- * @return a new AudioStream, or NULL, if an error occurred
+ * @param extraData the QuickTime extra data stream
+ * @param disposeExtraData the QuickTime extra data stream
+ * @return a new Codec, or NULL, if an error occurred
*/
-AudioStream *makeQDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData);
+Codec *makeQDM2Decoder(Common::SeekableReadStream *extraData,
+ DisposeAfterUse::Flag disposeExtraData = DisposeAfterUse::NO);
} // End of namespace Audio
diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp
index 0ad2821cd5..8cf0305e88 100644
--- a/audio/decoders/quicktime.cpp
+++ b/audio/decoders/quicktime.cpp
@@ -8,19 +8,16 @@
* 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/debug.h"
@@ -30,6 +27,7 @@
#include "common/textconsole.h"
#include "audio/audiostream.h"
+#include "audio/decoders/codec.h"
#include "audio/decoders/quicktime.h"
#include "audio/decoders/quicktime_intern.h"
@@ -86,6 +84,9 @@ void QuickTimeAudioDecoder::init() {
// Make sure the bits per sample transfers to the sample size
if (entry->getCodecTag() == MKTAG('r', 'a', 'w', ' ') || entry->getCodecTag() == MKTAG('t', 'w', 'o', 's'))
_tracks[_audioTrackIndex]->sampleSize = (entry->_bitsPerSample / 8) * entry->_channels;
+
+ // Initialize the codec (if necessary)
+ entry->initCodec();
}
}
}
@@ -217,6 +218,9 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) {
Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_tracks[_audioTrackIndex]->sampleDescs[0];
_audStream = Audio::makeQueuingAudioStream(entry->_sampleRate, entry->_channels == 2);
+ // Reinitialize the codec
+ entry->initCodec();
+
// First, we need to track down what audio sample we need
Audio::Timestamp curAudioTime = where.convertToFramerate(_tracks[_audioTrackIndex]->timeScale);
uint32 sample = curAudioTime.totalNumberOfFrames();
@@ -266,6 +270,11 @@ QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc(Common::QuickTimeParser:
_samplesPerFrame = 0;
_bytesPerFrame = 0;
_bitsPerSample = 0;
+ _codec = 0;
+}
+
+QuickTimeAudioDecoder::AudioSampleDesc::~AudioSampleDesc() {
+ delete _codec;
}
bool QuickTimeAudioDecoder::AudioSampleDesc::isAudioCodecSupported() const {
@@ -313,7 +322,12 @@ AudioStream *QuickTimeAudioDecoder::AudioSampleDesc::createAudioStream(Common::S
if (!stream)
return 0;
- if (_codecTag == MKTAG('t', 'w', 'o', 's') || _codecTag == MKTAG('r', 'a', 'w', ' ')) {
+ if (_codec) {
+ // If we've loaded a codec, make sure we use first
+ AudioStream *audioStream = _codec->decodeFrame(*stream);
+ delete stream;
+ return audioStream;
+ } else if (_codecTag == MKTAG('t', 'w', 'o', 's') || _codecTag == MKTAG('r', 'a', 'w', ' ')) {
// Fortunately, most of the audio used in Myst videos is raw...
uint16 flags = 0;
if (_codecTag == MKTAG('r', 'a', 'w', ' '))
@@ -330,24 +344,32 @@ AudioStream *QuickTimeAudioDecoder::AudioSampleDesc::createAudioStream(Common::S
} else if (_codecTag == MKTAG('i', 'm', 'a', '4')) {
// Riven uses this codec (as do some Myst ME videos)
return makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), kADPCMApple, _sampleRate, _channels, 34);
- } else if (_codecTag == MKTAG('m', 'p', '4', 'a')) {
- // The 7th Guest iOS uses an MPEG-4 codec
-#ifdef USE_FAAD
- if (_parentTrack->objectTypeMP4 == 0x40)
- return makeAACStream(stream, DisposeAfterUse::YES, _parentTrack->extraData);
-#endif
-#ifdef AUDIO_QDM2_H
- } else if (_codecTag == MKTAG('Q', 'D', 'M', '2')) {
- // Myst ME uses this codec for many videos
- return makeQDM2Stream(stream, _parentTrack->extraData);
-#endif
}
error("Unsupported audio codec");
-
return NULL;
}
+void QuickTimeAudioDecoder::AudioSampleDesc::initCodec() {
+ delete _codec; _codec = 0;
+
+ switch (_codecTag) {
+ case MKTAG('Q', 'D', 'M', '2'):
+#ifdef AUDIO_QDM2_H
+ _codec = makeQDM2Decoder(_parentTrack->extraData);
+#endif
+ break;
+ case MKTAG('m', 'p', '4', 'a'):
+#ifdef USE_FAAD
+ if (_parentTrack->objectTypeMP4 == 0x40)
+ _codec = makeAACDecoder(_parentTrack->extraData);
+#endif
+ break;
+ default:
+ break;
+ }
+}
+
/**
* A wrapper around QuickTimeAudioDecoder that implements the RewindableAudioStream API
*/
diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h
index 9f6c6c20e0..4dd1a57710 100644
--- a/audio/decoders/quicktime.h
+++ b/audio/decoders/quicktime.h
@@ -8,19 +8,16 @@
* 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$
- *
*/
/**
diff --git a/audio/decoders/quicktime_intern.h b/audio/decoders/quicktime_intern.h
index f288d5604b..e31a1d3872 100644
--- a/audio/decoders/quicktime_intern.h
+++ b/audio/decoders/quicktime_intern.h
@@ -8,19 +8,16 @@
* 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$
- *
*/
/**
@@ -45,6 +42,7 @@ namespace Common {
namespace Audio {
class AudioStream;
+class Codec;
class QueuingAudioStream;
class QuickTimeAudioDecoder : public Common::QuickTimeParser {
@@ -68,10 +66,12 @@ protected:
class AudioSampleDesc : public Common::QuickTimeParser::SampleDesc {
public:
AudioSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag);
+ ~AudioSampleDesc();
bool isAudioCodecSupported() const;
uint32 getAudioChunkSampleCount(uint chunk) const;
AudioStream *createAudioStream(Common::SeekableReadStream *stream) const;
+ void initCodec();
// TODO: Make private in the long run
uint16 _bitsPerSample;
@@ -79,6 +79,8 @@ protected:
uint32 _sampleRate;
uint32 _samplesPerFrame;
uint32 _bytesPerFrame;
+
+ Codec *_codec;
};
// Common::QuickTimeParser API
diff --git a/audio/decoders/raw.cpp b/audio/decoders/raw.cpp
index 4789fd0f36..881b8c1d6a 100644
--- a/audio/decoders/raw.cpp
+++ b/audio/decoders/raw.cpp
@@ -51,7 +51,7 @@ template<bool is16Bit, bool isUnsigned, bool isLE>
class RawStream : public SeekableAudioStream {
public:
RawStream(int rate, bool stereo, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream, const RawStreamBlockList &blocks)
- : _rate(rate), _isStereo(stereo), _playtime(0, rate), _stream(stream), _disposeAfterUse(disposeStream), _blocks(blocks), _curBlock(_blocks.begin()), _blockLeft(0), _buffer(0) {
+ : _rate(rate), _isStereo(stereo), _playtime(0, rate), _stream(stream, disposeStream), _blocks(blocks), _curBlock(_blocks.begin()), _blockLeft(0), _buffer(0) {
assert(_blocks.size() > 0);
@@ -82,9 +82,6 @@ public:
}
~RawStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _stream;
-
delete[] _buffer;
}
@@ -98,15 +95,14 @@ public:
bool seek(const Timestamp &where);
private:
- const int _rate; ///< Sample rate of stream
- const bool _isStereo; ///< Whether this is an stereo stream
- Timestamp _playtime; ///< Calculated total play time
- Common::SeekableReadStream *_stream; ///< Stream to read data from
- const DisposeAfterUse::Flag _disposeAfterUse; ///< Indicates whether the stream object should be deleted when this RawStream is destructed
- const RawStreamBlockList _blocks; ///< Audio block list
-
- RawStreamBlockList::const_iterator _curBlock; ///< Current audio block number
- int32 _blockLeft; ///< How many bytes are still left in the current block
+ const int _rate; ///< Sample rate of stream
+ const bool _isStereo; ///< Whether this is an stereo stream
+ Timestamp _playtime; ///< Calculated total play time
+ Common::DisposablePtr<Common::SeekableReadStream> _stream; ///< Stream to read data from
+ const RawStreamBlockList _blocks; ///< Audio block list
+
+ RawStreamBlockList::const_iterator _curBlock; ///< Current audio block number
+ int32 _blockLeft; ///< How many bytes are still left in the current block
/**
* Advance one block in the stream in case
diff --git a/audio/decoders/voc.cpp b/audio/decoders/voc.cpp
index 74ea4440a1..f06e7f95f2 100644
--- a/audio/decoders/voc.cpp
+++ b/audio/decoders/voc.cpp
@@ -47,7 +47,7 @@ int getSampleRateFromVOCRate(int vocSR) {
}
}
-static byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate, int &loops, int &begin_loop, int &end_loop) {
+byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate) {
VocFileHeader fileHeader;
debug(2, "loadVOCFromStream");
@@ -84,8 +84,6 @@ static byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate,
int len;
byte *ret_sound = 0;
size = 0;
- begin_loop = 0;
- end_loop = 0;
while ((code = stream.readByte())) {
len = stream.readByte();
@@ -118,14 +116,16 @@ static byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate,
debug(9, "VOC Data Block: %d, %d, %d", rate, packing, len);
if (packing == 0) {
if (size) {
- ret_sound = (byte *)realloc(ret_sound, size + len);
+ byte *tmp = (byte *)realloc(ret_sound, size + len);
+ if (!tmp)
+ error("Cannot reallocate memory for VOC Data Block");
+
+ ret_sound = tmp;
} else {
ret_sound = (byte *)malloc(len);
}
stream.read(ret_sound + size, len);
size += len;
- begin_loop = size;
- end_loop = size;
} else {
warning("VOC file packing %d unsupported", packing);
}
@@ -140,7 +140,7 @@ static byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate,
break;
case 6: // begin of loop
assert(len == 2);
- loops = stream.readUint16LE();
+ stream.readUint16LE();
break;
case 7: // end of loop
assert(len == 0);
@@ -169,15 +169,9 @@ static byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate,
return ret_sound;
}
-byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate) {
- int loops, begin_loop, end_loop;
- return loadVOCFromStream(stream, size, rate, loops, begin_loop, end_loop);
-}
-
-
#ifdef STREAM_AUDIO_FROM_DISK
-int parseVOCFormat(Common::SeekableReadStream& stream, RawStreamBlock* block, int &rate, int &loops, int &begin_loop, int &end_loop) {
+int parseVOCFormat(Common::SeekableReadStream& stream, RawStreamBlock* block, int &rate) {
VocFileHeader fileHeader;
int currentBlock = 0;
int size = 0;
@@ -215,8 +209,6 @@ int parseVOCFormat(Common::SeekableReadStream& stream, RawStreamBlock* block, in
int len;
size = 0;
- begin_loop = 0;
- end_loop = 0;
while ((code = stream.readByte())) {
len = stream.readByte();
@@ -257,8 +249,6 @@ int parseVOCFormat(Common::SeekableReadStream& stream, RawStreamBlock* block, in
stream.seek(len, SEEK_CUR);
size += len;
- begin_loop = size;
- end_loop = size;
} else {
warning("VOC file packing %d unsupported", packing);
}
@@ -273,7 +263,7 @@ int parseVOCFormat(Common::SeekableReadStream& stream, RawStreamBlock* block, in
break;
case 6: // begin of loop
assert(len == 2);
- loops = stream.readUint16LE();
+ stream.readUint16LE();
break;
case 7: // end of loop
assert(len == 0);
@@ -296,33 +286,13 @@ int parseVOCFormat(Common::SeekableReadStream& stream, RawStreamBlock* block, in
return currentBlock;
}
-AudioStream *makeVOCDiskStream(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse) {
- const int MAX_AUDIO_BLOCKS = 256;
-
- RawStreamBlock *block = new RawStreamBlock[MAX_AUDIO_BLOCKS];
- int rate, loops, begin_loop, end_loop;
-
- int numBlocks = parseVOCFormat(*stream, block, rate, loops, begin_loop, end_loop);
-
- AudioStream *audioStream = 0;
-
- // Create an audiostream from the data. Note the numBlocks may be 0,
- // e.g. when invalid data is encountered. See bug #2890038.
- if (numBlocks)
- audioStream = makeRawDiskStream_OLD(stream, block, numBlocks, rate, flags, disposeAfterUse/*, begin_loop, end_loop*/);
-
- delete[] block;
-
- return audioStream;
-}
-
SeekableAudioStream *makeVOCDiskStreamNoLoop(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse) {
const int MAX_AUDIO_BLOCKS = 256;
RawStreamBlock *block = new RawStreamBlock[MAX_AUDIO_BLOCKS];
- int rate, loops, begin_loop, end_loop;
+ int rate;
- int numBlocks = parseVOCFormat(*stream, block, rate, loops, begin_loop, end_loop);
+ int numBlocks = parseVOCFormat(*stream, block, rate);
SeekableAudioStream *audioStream = 0;
@@ -338,47 +308,6 @@ SeekableAudioStream *makeVOCDiskStreamNoLoop(Common::SeekableReadStream *stream,
#endif
-
-AudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags, uint loopStart, uint loopEnd, DisposeAfterUse::Flag disposeAfterUse) {
-#ifdef STREAM_AUDIO_FROM_DISK
- return makeVOCDiskStream(stream, flags, disposeAfterUse);
-#else
- int size, rate;
-
- byte *data = loadVOCFromStream(*stream, size, rate);
-
- if (!data) {
- if (disposeAfterUse == DisposeAfterUse::YES)
- delete stream;
- return 0;
- }
-
- SeekableAudioStream *s = Audio::makeRawStream(data, size, rate, flags);
-
- if (loopStart != loopEnd) {
- const bool isStereo = (flags & Audio::FLAG_STEREO) != 0;
- const bool is16Bit = (flags & Audio::FLAG_16BITS) != 0;
-
- if (loopEnd == 0)
- loopEnd = size;
- assert(loopStart <= loopEnd);
- assert(loopEnd <= (uint)size);
-
- // Verify the buffer sizes are sane
- if (is16Bit && isStereo)
- assert((loopStart & 3) == 0 && (loopEnd & 3) == 0);
- else if (is16Bit || isStereo)
- assert((loopStart & 1) == 0 && (loopEnd & 1) == 0);
-
- const uint32 extRate = s->getRate() * (is16Bit ? 2 : 1) * (isStereo ? 2 : 1);
-
- return new SubLoopingAudioStream(s, 0, Timestamp(0, loopStart, extRate), Timestamp(0, loopEnd, extRate));
- } else {
- return s;
- }
-#endif
-}
-
SeekableAudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse) {
#ifdef STREAM_AUDIO_FROM_DISK
return makeVOCDiskStreamNoLoop(stream, flags, disposeAfterUse);
diff --git a/audio/decoders/voc.h b/audio/decoders/voc.h
index 8bc6dcf46f..a920eac933 100644
--- a/audio/decoders/voc.h
+++ b/audio/decoders/voc.h
@@ -24,9 +24,7 @@
* @file
* Sound decoder used in engines:
* - agos
- * - drascula
* - kyra
- * - made
* - saga
* - scumm
* - touche
@@ -90,16 +88,11 @@ extern byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate)
/**
* Try to load a VOC from the given seekable stream and create an AudioStream
* from that data. Currently this function only supports uncompressed raw PCM
- * data. Optionally supports (infinite) looping of a portion of the data.
+ * data.
*
- * This function uses loadVOCFromStream() internally.
- */
-AudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags = 0, uint loopStart = 0, uint loopEnd = 0, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::NO);
-
-/**
* This does not use any of the looping features of VOC files!
*/
-SeekableAudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse);
+SeekableAudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::NO);
} // End of namespace Audio
diff --git a/audio/decoders/vorbis.cpp b/audio/decoders/vorbis.cpp
index 2724dd1f02..64cacb4d58 100644
--- a/audio/decoders/vorbis.cpp
+++ b/audio/decoders/vorbis.cpp
@@ -29,6 +29,7 @@
#ifdef USE_VORBIS
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/textconsole.h"
#include "common/util.h"
@@ -42,6 +43,7 @@
#include <tremor/ivorbisfile.h>
#endif
#else
+#define OV_EXCLUDE_STATIC_CALLBACKS
#include <vorbis/vorbisfile.h>
#endif
@@ -88,8 +90,7 @@ static ov_callbacks g_stream_wrap = {
class VorbisStream : public SeekableAudioStream {
protected:
- Common::SeekableReadStream *_inStream;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _inStream;
bool _isStereo;
int _rate;
@@ -120,10 +121,9 @@ protected:
};
VorbisStream::VorbisStream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) :
- _inStream(inStream),
- _disposeAfterUse(dispose),
+ _inStream(inStream, dispose),
_length(0, 1000),
- _bufferEnd(_buffer + ARRAYSIZE(_buffer)) {
+ _bufferEnd(ARRAYEND(_buffer)) {
int res = ov_open_callbacks(inStream, &_ovFile, NULL, 0, g_stream_wrap);
if (res < 0) {
@@ -149,8 +149,6 @@ VorbisStream::VorbisStream(Common::SeekableReadStream *inStream, DisposeAfterUse
VorbisStream::~VorbisStream() {
ov_clear(&_ovFile);
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _inStream;
}
int VorbisStream::readBuffer(int16 *buffer, const int numSamples) {
diff --git a/audio/decoders/vag.cpp b/audio/decoders/xa.cpp
index 10ef69708c..818cd2df59 100644
--- a/audio/decoders/vag.cpp
+++ b/audio/decoders/xa.cpp
@@ -20,79 +20,78 @@
*
*/
-#include "audio/decoders/vag.h"
+#include "audio/decoders/xa.h"
#include "audio/audiostream.h"
#include "common/stream.h"
namespace Audio {
-class VagStream : public Audio::RewindableAudioStream {
+class XAStream : public Audio::RewindableAudioStream {
public:
- VagStream(Common::SeekableReadStream *stream, int rate);
- ~VagStream();
+ XAStream(Common::SeekableReadStream *stream, int rate, DisposeAfterUse::Flag disposeAfterUse);
+ ~XAStream();
bool isStereo() const { return false; }
- bool endOfData() const { return _stream->pos() == _stream->size(); }
+ bool endOfData() const { return _endOfData && _samplesRemaining == 0; }
int getRate() const { return _rate; }
int readBuffer(int16 *buffer, const int numSamples);
bool rewind();
private:
Common::SeekableReadStream *_stream;
+ DisposeAfterUse::Flag _disposeAfterUse;
+
+ void seekToPos(uint pos);
byte _predictor;
double _samples[28];
byte _samplesRemaining;
int _rate;
double _s1, _s2;
+ uint _loopPoint;
+ bool _endOfData;
};
-VagStream::VagStream(Common::SeekableReadStream *stream, int rate) : _stream(stream) {
+XAStream::XAStream(Common::SeekableReadStream *stream, int rate, DisposeAfterUse::Flag disposeAfterUse)
+ : _stream(stream), _disposeAfterUse(disposeAfterUse) {
_samplesRemaining = 0;
_predictor = 0;
_s1 = _s2 = 0.0;
_rate = rate;
+ _loopPoint = 0;
+ _endOfData = false;
}
-VagStream::~VagStream() {
- delete _stream;
+XAStream::~XAStream() {
+ if (_disposeAfterUse == DisposeAfterUse::YES)
+ delete _stream;
}
-static const double s_vagDataTable[5][2] =
- {
- { 0.0, 0.0 },
- { 60.0 / 64.0, 0.0 },
- { 115.0 / 64.0, -52.0 / 64.0 },
- { 98.0 / 64.0, -55.0 / 64.0 },
- { 122.0 / 64.0, -60.0 / 64.0 }
- };
+static const double s_xaDataTable[5][2] = {
+ { 0.0, 0.0 },
+ { 60.0 / 64.0, 0.0 },
+ { 115.0 / 64.0, -52.0 / 64.0 },
+ { 98.0 / 64.0, -55.0 / 64.0 },
+ { 122.0 / 64.0, -60.0 / 64.0 }
+};
-int VagStream::readBuffer(int16 *buffer, const int numSamples) {
+int XAStream::readBuffer(int16 *buffer, const int numSamples) {
int32 samplesDecoded = 0;
- if (_samplesRemaining) {
- byte i = 0;
-
- for (i = 28 - _samplesRemaining; i < 28 && samplesDecoded < numSamples; i++) {
- _samples[i] = _samples[i] + _s1 * s_vagDataTable[_predictor][0] + _s2 * s_vagDataTable[_predictor][1];
- _s2 = _s1;
- _s1 = _samples[i];
- int16 d = (int) (_samples[i] + 0.5);
- buffer[samplesDecoded] = d;
- samplesDecoded++;
- }
-
-#if 0
- assert(i == 28); // We're screwed if this fails :P
-#endif
- // This might mean the file is corrupted, or that the stream has
- // been closed.
- if (i != 28) return 0;
-
- _samplesRemaining = 0;
+ for (int i = 28 - _samplesRemaining; i < 28 && samplesDecoded < numSamples; i++) {
+ _samples[i] = _samples[i] + _s1 * s_xaDataTable[_predictor][0] + _s2 * s_xaDataTable[_predictor][1];
+ _s2 = _s1;
+ _s1 = _samples[i];
+ int16 d = (int) (_samples[i] + 0.5);
+ buffer[samplesDecoded] = d;
+ samplesDecoded++;
+ _samplesRemaining--;
}
+ if (endOfData())
+ return samplesDecoded;
+
while (samplesDecoded < numSamples) {
byte i = 0;
@@ -100,8 +99,19 @@ int VagStream::readBuffer(int16 *buffer, const int numSamples) {
byte shift = _predictor & 0xf;
_predictor >>= 4;
- if (_stream->readByte() == 7)
+ byte flags = _stream->readByte();
+ if (flags == 3) {
+ // Loop
+ seekToPos(_loopPoint);
+ continue;
+ } else if (flags == 6) {
+ // Set loop point
+ _loopPoint = _stream->pos() - 2;
+ } else if (flags == 7) {
+ // End of stream
+ _endOfData = true;
return samplesDecoded;
+ }
for (i = 0; i < 28; i += 2) {
byte d = _stream->readByte();
@@ -116,7 +126,7 @@ int VagStream::readBuffer(int16 *buffer, const int numSamples) {
}
for (i = 0; i < 28 && samplesDecoded < numSamples; i++) {
- _samples[i] = _samples[i] + _s1 * s_vagDataTable[_predictor][0] + _s2 * s_vagDataTable[_predictor][1];
+ _samples[i] = _samples[i] + _s1 * s_xaDataTable[_predictor][0] + _s2 * s_xaDataTable[_predictor][1];
_s2 = _s1;
_s1 = _samples[i];
int16 d = (int) (_samples[i] + 0.5);
@@ -124,24 +134,31 @@ int VagStream::readBuffer(int16 *buffer, const int numSamples) {
samplesDecoded++;
}
- if (i != 27)
+ if (i != 28)
_samplesRemaining = 28 - i;
+
+ if (_stream->pos() >= _stream->size())
+ _endOfData = true;
}
return samplesDecoded;
}
-bool VagStream::rewind() {
- _stream->seek(0);
+bool XAStream::rewind() {
+ seekToPos(0);
+ return true;
+}
+
+void XAStream::seekToPos(uint pos) {
+ _stream->seek(pos);
_samplesRemaining = 0;
_predictor = 0;
_s1 = _s2 = 0.0;
-
- return true;
+ _endOfData = false;
}
-RewindableAudioStream *makeVagStream(Common::SeekableReadStream *stream, int rate) {
- return new VagStream(stream, rate);
+RewindableAudioStream *makeXAStream(Common::SeekableReadStream *stream, int rate, DisposeAfterUse::Flag disposeAfterUse) {
+ return new XAStream(stream, rate, disposeAfterUse);
}
-}
+} // End of namespace Audio
diff --git a/audio/decoders/vag.h b/audio/decoders/xa.h
index b80fbdb98f..cf28d8001a 100644
--- a/audio/decoders/vag.h
+++ b/audio/decoders/xa.h
@@ -28,8 +28,10 @@
* - tinsel (PSX port of the game)
*/
-#ifndef SOUND_VAG_H
-#define SOUND_VAG_H
+#ifndef AUDIO_DECODERS_XA_H
+#define AUDIO_DECODERS_XA_H
+
+#include "common/types.h"
namespace Common {
class SeekableReadStream;
@@ -40,17 +42,19 @@ namespace Audio {
class RewindableAudioStream;
/**
- * Takes an input stream containing Vag sound data and creates
+ * Takes an input stream containing XA ADPCM sound data and creates
* an RewindableAudioStream from that.
*
- * @param stream the SeekableReadStream from which to read the ADPCM data
+ * @param stream the SeekableReadStream from which to read the XA ADPCM data
* @param rate the sampling rate
+ * @param disposeAfterUse whether to delete the stream after use.
* @return a new RewindableAudioStream, or NULL, if an error occurred
*/
-RewindableAudioStream *makeVagStream(
+RewindableAudioStream *makeXAStream(
Common::SeekableReadStream *stream,
- int rate = 11025);
+ int rate,
+ DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
-} // End of namespace Sword1
+} // End of namespace Audio
#endif
diff --git a/audio/fmopl.cpp b/audio/fmopl.cpp
index a24c2a533c..da655643a7 100644
--- a/audio/fmopl.cpp
+++ b/audio/fmopl.cpp
@@ -192,4 +192,3 @@ FM_OPL *makeAdLibOPL(int rate) {
return opl;
}
-
diff --git a/audio/fmopl.h b/audio/fmopl.h
index b88325a52e..f62587f557 100644
--- a/audio/fmopl.h
+++ b/audio/fmopl.h
@@ -176,4 +176,3 @@ void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length);
FM_OPL *makeAdLibOPL(int rate);
#endif
-
diff --git a/audio/mididrv.cpp b/audio/mididrv.cpp
index b71c02f991..f638250dcd 100644
--- a/audio/mididrv.cpp
+++ b/audio/mididrv.cpp
@@ -55,27 +55,30 @@ const byte MidiDriver::_gmToMt32[128] = {
101, 103, 100, 120, 117, 113, 99, 128, 128, 128, 128, 124, 123, 128, 128, 128, // 7x
};
-static const uint32 GUIOMapping[] = {
- MT_PCSPK, Common::GUIO_MIDIPCSPK,
- MT_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
+static const struct {
+ uint32 type;
+ const char *guio;
+} GUIOMapping[] = {
+ { MT_PCSPK, GUIO_MIDIPCSPK, },
+ { MT_CMS, GUIO_MIDICMS, },
+ { MT_PCJR, GUIO_MIDIPCJR, },
+ { MT_ADLIB, GUIO_MIDIADLIB, },
+ { MT_C64, GUIO_MIDIC64, },
+ { MT_AMIGA, GUIO_MIDIAMIGA, },
+ { MT_APPLEIIGS, GUIO_MIDIAPPLEIIGS, },
+ { MT_TOWNS, GUIO_MIDITOWNS, },
+ { MT_PC98, GUIO_MIDIPC98, },
+ { MT_GM, GUIO_MIDIGM, },
+ { MT_MT32, GUIO_MIDIMT32, },
+ { 0, 0 },
};
-uint32 MidiDriver::musicType2GUIO(uint32 musicType) {
- uint32 res = 0;
+Common::String MidiDriver::musicType2GUIO(uint32 musicType) {
+ Common::String res = "";
- for (int i = 0; GUIOMapping[i] || GUIOMapping[i + 1]; i += 2) {
- if (musicType == GUIOMapping[i] || musicType == (uint32)-1)
- res |= GUIOMapping[i + 1];
+ for (int i = 0; GUIOMapping[i].guio; i++) {
+ if (musicType == GUIOMapping[i].type || musicType == (uint32)-1)
+ res += GUIOMapping[i].guio;
}
return res;
@@ -128,7 +131,8 @@ Common::String MidiDriver::getDeviceString(DeviceHandle handle, DeviceStringType
MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
// Query the selected music device (defaults to MT_AUTO device).
- DeviceHandle hdl = getDeviceHandle(ConfMan.get("music_driver"));
+ Common::String selDevStr = ConfMan.hasKey("music_driver") ? ConfMan.get("music_driver") : Common::String("auto");
+ DeviceHandle hdl = getDeviceHandle(selDevStr.empty() ? Common::String("auto") : selDevStr);
DeviceHandle reslt = 0;
_forceTypeMT32 = false;
@@ -200,8 +204,8 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
if (getMusicType(hdl) == MT_INVALID) {
// If the expressly selected driver or device cannot be found (no longer compiled in, turned off, etc.)
// we display a warning and continue.
- failedDevStr = ConfMan.get("music_driver");
- Common::String warningMsg = Common::String::format(_("The selected audio device '%s' was not found (e.g. might be turned off or disconnected). Attempting to fall back to the next available device..."), failedDevStr.c_str());
+ failedDevStr = selDevStr;
+ Common::String warningMsg = Common::String::format(_("The selected audio device '%s' was not found (e.g. might be turned off or disconnected)."), failedDevStr.c_str()) + " " + _("Attempting to fall back to the next available device...");
GUI::MessageDialog dialog(warningMsg);
dialog.runModal();
}
@@ -213,7 +217,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
} else {
// If the expressly selected device cannot be used we display a warning and continue.
failedDevStr = getDeviceString(hdl, MidiDriver::kDeviceName);
- Common::String warningMsg = Common::String::format(_("The selected audio device '%s' cannot be used. See log file for more information. Attempting to fall back to the next available device..."), failedDevStr.c_str());
+ Common::String warningMsg = Common::String::format(_("The selected audio device '%s' cannot be used. See log file for more information."), failedDevStr.c_str()) + " " + _("Attempting to fall back to the next available device...");
GUI::MessageDialog dialog(warningMsg);
dialog.runModal();
}
@@ -230,13 +234,15 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
// If a preferred MT32 or GM device has been selected that device gets returned if available.
Common::String devStr;
if (flags & MDT_PREFER_MT32)
- devStr = ConfMan.get("mt32_device");
+ devStr = ConfMan.hasKey("mt32_device") ? ConfMan.get("mt32_device") : Common::String("null");
else if (flags & MDT_PREFER_GM)
- devStr = ConfMan.get("gm_device");
+ devStr = ConfMan.hasKey("gm_device") ? ConfMan.get("gm_device") : Common::String("null");
else
devStr = "auto";
-
- hdl = getDeviceHandle(devStr);
+
+ // Default to Null device here, since we also register a default null setting for
+ // the MT32 or GM device in the config manager.
+ hdl = getDeviceHandle(devStr.empty() ? Common::String("null") : devStr);
const MusicType type = getMusicType(hdl);
// If we have a "Don't use GM/MT-32" setting we skip this part and jump
@@ -247,7 +253,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
// we display a warning and continue. Don't warn about the missing device if we did already (this becomes relevant if the
// missing device is selected as preferred device and also as GM or MT-32 device).
if (failedDevStr != devStr) {
- Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' was not found (e.g. might be turned off or disconnected). Attempting to fall back to the next available device..."), devStr.c_str());
+ Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' was not found (e.g. might be turned off or disconnected)."), devStr.c_str()) + " " + _("Attempting to fall back to the next available device...");
GUI::MessageDialog dialog(warningMsg);
dialog.runModal();
}
@@ -262,7 +268,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
// Don't warn about the failing device if we did already (this becomes relevant if the failing
// device is selected as preferred device and also as GM or MT-32 device).
if (failedDevStr != getDeviceString(hdl, MidiDriver::kDeviceName)) {
- Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' cannot be used. See log file for more information. Attempting to fall back to the next available device..."), getDeviceString(hdl, MidiDriver::kDeviceName).c_str());
+ Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' cannot be used. See log file for more information."), getDeviceString(hdl, MidiDriver::kDeviceName).c_str()) + " " + _("Attempting to fall back to the next available device...");
GUI::MessageDialog dialog(warningMsg);
dialog.runModal();
}
@@ -409,4 +415,3 @@ void MidiDriver::sendGMReset() {
sysEx(resetSysEx, sizeof(resetSysEx));
g_system->delayMillis(100);
}
-
diff --git a/audio/mididrv.h b/audio/mididrv.h
index e3f6461be9..cdf2943f2a 100644
--- a/audio/mididrv.h
+++ b/audio/mididrv.h
@@ -146,7 +146,7 @@ public:
kDeviceId
};
- static uint32 musicType2GUIO(uint32 musicType);
+ static Common::String musicType2GUIO(uint32 musicType);
/** Create music driver matching the given device handle, or NULL if there is no match. */
static MidiDriver *createMidi(DeviceHandle handle);
diff --git a/audio/mixer.cpp b/audio/mixer.cpp
index 128224ae85..965766170d 100644
--- a/audio/mixer.cpp
+++ b/audio/mixer.cpp
@@ -163,9 +163,8 @@ private:
uint32 _pauseStartTime;
uint32 _pauseTime;
- DisposeAfterUse::Flag _autofreeStream;
RateConverter *_converter;
- AudioStream *_stream;
+ Common::DisposablePtr<AudioStream> _stream;
};
#pragma mark -
@@ -492,8 +491,8 @@ Channel::Channel(Mixer *mixer, Mixer::SoundType type, AudioStream *stream,
DisposeAfterUse::Flag autofreeStream, bool reverseStereo, int id, bool permanent)
: _type(type), _mixer(mixer), _id(id), _permanent(permanent), _volume(Mixer::kMaxChannelVolume),
_balance(0), _pauseLevel(0), _samplesConsumed(0), _samplesDecoded(0), _mixerTimeStamp(0),
- _pauseStartTime(0), _pauseTime(0), _autofreeStream(autofreeStream), _converter(0),
- _stream(stream) {
+ _pauseStartTime(0), _pauseTime(0), _converter(0),
+ _stream(stream, autofreeStream) {
assert(mixer);
assert(stream);
@@ -503,8 +502,6 @@ Channel::Channel(Mixer *mixer, Mixer::SoundType type, AudioStream *stream,
Channel::~Channel() {
delete _converter;
- if (_autofreeStream == DisposeAfterUse::YES)
- delete _stream;
}
void Channel::setVolume(const byte volume) {
diff --git a/audio/mods/maxtrax.cpp b/audio/mods/maxtrax.cpp
index 953bb8f8d2..344d678b76 100644
--- a/audio/mods/maxtrax.cpp
+++ b/audio/mods/maxtrax.cpp
@@ -707,8 +707,8 @@ int8 MaxTrax::noteOn(ChannelContext &channel, const byte note, uint16 volume, ui
if ((channel.flags & ChannelContext::kFlagMono) == 0) {
voiceNum = pickvoice((channel.flags & ChannelContext::kFlagRightChannel) != 0 ? 1 : 0, pri);
} else {
- VoiceContext *voice = _voiceCtx + ARRAYSIZE(_voiceCtx) - 1;
- for (voiceNum = ARRAYSIZE(_voiceCtx) - 1; voiceNum >= 0 && voice->channel != &channel; --voiceNum, --voice)
+ VoiceContext *voice = ARRAYEND(_voiceCtx);
+ for (voiceNum = ARRAYSIZE(_voiceCtx); voiceNum-- != 0 && --voice->channel != &channel;)
;
if (voiceNum < 0)
voiceNum = pickvoice((channel.flags & ChannelContext::kFlagRightChannel) != 0 ? 1 : 0, pri);
diff --git a/audio/module.mk b/audio/module.mk
index 46cb9944e1..e3aa0aaa81 100644
--- a/audio/module.mk
+++ b/audio/module.mk
@@ -23,10 +23,10 @@ MODULE_OBJS := \
decoders/qdm2.o \
decoders/quicktime.o \
decoders/raw.o \
- decoders/vag.o \
decoders/voc.o \
decoders/vorbis.o \
decoders/wave.o \
+ decoders/xa.o \
mods/infogrames.o \
mods/maxtrax.o \
mods/module.o \
diff --git a/audio/mpu401.cpp b/audio/mpu401.cpp
index caad945258..103a3501db 100644
--- a/audio/mpu401.cpp
+++ b/audio/mpu401.cpp
@@ -33,7 +33,10 @@ void MidiChannel_MPU401::init(MidiDriver *owner, byte channel) {
bool MidiChannel_MPU401::allocate() {
if (_allocated)
return false;
- return (_allocated = true);
+
+ _allocated = true;
+
+ return true;
}
MidiDriver *MidiChannel_MPU401::device() {
@@ -143,6 +146,6 @@ void MidiDriver_MPU401::setTimerCallback(void *timer_param, Common::TimerManager
g_system->getTimerManager()->removeTimerProc(_timer_proc);
_timer_proc = timer_proc;
if (timer_proc)
- g_system->getTimerManager()->installTimerProc(timer_proc, 10000, timer_param);
+ g_system->getTimerManager()->installTimerProc(timer_proc, 10000, timer_param, "MPU401");
}
}
diff --git a/audio/rate.cpp b/audio/rate.cpp
index 83abd6150b..0fc23a8a54 100644
--- a/audio/rate.cpp
+++ b/audio/rate.cpp
@@ -298,6 +298,9 @@ public:
_bufferSize = osamp;
}
+ if (!_buffer)
+ error("[CopyRateConverter::flow] Cannot allocate memory for temp buffer");
+
// Read up to 'osamp' samples into our temporary buffer
len = input.readBuffer(_buffer, osamp);
diff --git a/audio/rate_arm.cpp b/audio/rate_arm.cpp
index 433a7d3423..4135cdd1af 100644
--- a/audio/rate_arm.cpp
+++ b/audio/rate_arm.cpp
@@ -467,4 +467,3 @@ RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stere
}
} // End of namespace Audio
-
diff --git a/audio/softsynth/appleiigs.cpp b/audio/softsynth/appleiigs.cpp
index 6ee70d1202..bbb3f0b005 100644
--- a/audio/softsynth/appleiigs.cpp
+++ b/audio/softsynth/appleiigs.cpp
@@ -51,4 +51,3 @@ MusicDevices AppleIIGSMusicPlugin::getDevices() const {
//#else
REGISTER_PLUGIN_STATIC(APPLEIIGS, PLUGIN_TYPE_MUSIC, AppleIIGSMusicPlugin);
//#endif
-
diff --git a/audio/softsynth/cms.cpp b/audio/softsynth/cms.cpp
index 67eacd1a41..a675da3f03 100644
--- a/audio/softsynth/cms.cpp
+++ b/audio/softsynth/cms.cpp
@@ -163,19 +163,15 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) {
struct SAA1099 *saa = &_saa1099[chip];
int j, ch;
+ if (chip == 0) {
+ memset(buffer, 0, sizeof(int16)*length*2);
+ }
+
/* if the channels are disabled we're done */
if (!saa->all_ch_enable) {
- /* init output data */
- if (chip == 0) {
- memset(buffer, 0, sizeof(int16)*length*2);
- }
return;
}
- if (chip == 0) {
- memset(buffer, 0, sizeof(int16)*length*2);
- }
-
for (ch = 0; ch < 2; ch++) {
switch (saa->noise_params[ch]) {
case 0: saa->noise[ch].freq = 31250.0 * 2; break;
@@ -244,8 +240,8 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) {
}
}
/* write sound data to the buffer */
- buffer[j*2] += output_l / 6;
- buffer[j*2+1] += output_r / 6;
+ buffer[j*2+0] = CLIP<int>(buffer[j*2+0] + output_l / 6, -32768, 32767);
+ buffer[j*2+1] = CLIP<int>(buffer[j*2+1] + output_r / 6, -32768, 32767);
}
}
diff --git a/audio/softsynth/eas.cpp b/audio/softsynth/eas.cpp
index d829e3b39a..ea79b25329 100644
--- a/audio/softsynth/eas.cpp
+++ b/audio/softsynth/eas.cpp
@@ -480,4 +480,3 @@ Common::Error EASMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver
//#endif
#endif
-
diff --git a/audio/softsynth/emumidi.h b/audio/softsynth/emumidi.h
index f3d7645f87..f72dad7eaf 100644
--- a/audio/softsynth/emumidi.h
+++ b/audio/softsynth/emumidi.h
@@ -26,8 +26,6 @@
#include "audio/mididrv.h"
#include "audio/mixer.h"
-#define FIXP_SHIFT 16
-
class MidiDriver_Emulated : public Audio::AudioStream, public MidiDriver {
protected:
bool _isOpen;
@@ -38,6 +36,10 @@ private:
Common::TimerManager::TimerProc _timerProc;
void *_timerParam;
+ enum {
+ FIXP_SHIFT = 16
+ };
+
int _nextTick;
int _samplesPerTick;
diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.h b/audio/softsynth/fmtowns_pc98/towns_audio.h
index 4af888f009..211133a1fe 100644
--- a/audio/softsynth/fmtowns_pc98/towns_audio.h
+++ b/audio/softsynth/fmtowns_pc98/towns_audio.h
@@ -53,4 +53,3 @@ private:
};
#endif
-
diff --git a/audio/softsynth/fmtowns_pc98/towns_euphony.h b/audio/softsynth/fmtowns_pc98/towns_euphony.h
index 6b30bfb7f5..bff0e99660 100644
--- a/audio/softsynth/fmtowns_pc98/towns_euphony.h
+++ b/audio/softsynth/fmtowns_pc98/towns_euphony.h
@@ -181,4 +181,3 @@ private:
};
#endif
-
diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.cpp b/audio/softsynth/fmtowns_pc98/towns_midi.cpp
index e415a0dda5..b8203944c0 100644
--- a/audio/softsynth/fmtowns_pc98/towns_midi.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_midi.cpp
@@ -464,9 +464,10 @@ int TownsMidiOutputChannel::advanceEffectEnvelope(EffectEnvelope *s, EffectDef *
s->currentLevel = t;
s->modWheelLast = s->modWheelState;
t = getEffectModLevel(t, s->modWheelState);
- if (t != d->phase)
+ if (t != d->phase) {
d->phase = t;
- retFlags |= 1;
+ retFlags |= 1;
+ }
}
if (--s->stepCounter)
@@ -562,7 +563,7 @@ int TownsMidiOutputChannel::getEffectModLevel(int lvl, int mod) {
if (lvl < 0)
return -_driver->_operatorLevelTable[((-lvl) << 5) + mod];
else
- return _driver->_operatorLevelTable[((-lvl) << 5) + mod];
+ return _driver->_operatorLevelTable[(lvl << 5) + mod];
}
return 0;
diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.h b/audio/softsynth/fmtowns_pc98/towns_midi.h
index 8c764c55d9..1143dbaa02 100644
--- a/audio/softsynth/fmtowns_pc98/towns_midi.h
+++ b/audio/softsynth/fmtowns_pc98/towns_midi.h
@@ -81,4 +81,3 @@ private:
};
#endif
-
diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
index 001d258873..05a4079442 100644
--- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
@@ -1449,4 +1449,3 @@ const uint8 TownsPC98_AudioDriver::_drvTables[] = {
};
#undef EUPHONY_FADEOUT_TICKS
-
diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h
index ff58482227..c0009e4957 100644
--- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h
+++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h
@@ -115,4 +115,3 @@ private:
};
#endif
-
diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
index 4f81fa9a5c..49700be5dc 100644
--- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
+++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
@@ -185,4 +185,3 @@ private:
};
#endif
-
diff --git a/audio/softsynth/mt32.cpp b/audio/softsynth/mt32.cpp
index 6703a6f7b7..eabde21296 100644
--- a/audio/softsynth/mt32.cpp
+++ b/audio/softsynth/mt32.cpp
@@ -486,7 +486,7 @@ void MidiDriver_ThreadedMT32::setTimerCallback(void *timer_param, TimerManager::
_vm->_timer->removeTimerProc(_timer_proc);
_timer_proc = timer_proc;
if (timer_proc)
- _vm->_timer->installTimerProc(timer_proc, getBaseTempo(), timer_param);
+ _vm->_timer->installTimerProc(timer_proc, getBaseTempo(), timer_param, "MT32tempo");
}
}
diff --git a/audio/softsynth/mt32/mt32_file.cpp b/audio/softsynth/mt32/mt32_file.cpp
index cdf9fa13f6..643082b086 100644
--- a/audio/softsynth/mt32/mt32_file.cpp
+++ b/audio/softsynth/mt32/mt32_file.cpp
@@ -67,4 +67,3 @@ bool File::writeBit32u(Bit32u out) {
}
} // End of namespace MT32Emu
-
diff --git a/audio/softsynth/opl/dbopl.cpp b/audio/softsynth/opl/dbopl.cpp
index 2c46cfee75..02c2317b25 100644
--- a/audio/softsynth/opl/dbopl.cpp
+++ b/audio/softsynth/opl/dbopl.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2002-2010 The DOSBox Team
+ * Copyright (C) 2002-2011 The DOSBox Team
*
* 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
@@ -32,7 +32,7 @@
//DUNNO Keyon in 4op, switch to 2op without keyoff.
*/
-// Last synch with DOSBox SVN trunk r3556
+// Last synch with DOSBox SVN trunk r3752
#include "dbopl.h"
@@ -572,7 +572,7 @@ INLINE Bits Operator::GetWave( Bitu index, Bitu vol ) {
return (waveBase[ index & waveMask ] * MulTable[ vol >> ENV_EXTRA ]) >> MUL_SH;
#elif ( DBOPL_WAVE == WAVE_TABLELOG )
Bit32s wave = waveBase[ index & waveMask ];
- Bit32u total = ( wave & 0x7fff ) + ( vol << ( 3 - ENV_EXTRA ) );
+ Bit32u total = ( wave & 0x7fff ) + vol << ( 3 - ENV_EXTRA );
Bit32s sig = ExpTable[ total & 0xff ];
Bit32u exp = total >> 8;
Bit32s neg = wave >> 16;
@@ -1236,7 +1236,7 @@ void Chip::GenerateBlock2( Bitu total, Bit32s* output ) {
void Chip::GenerateBlock3( Bitu total, Bit32s* output ) {
while ( total > 0 ) {
Bit32u samples = ForwardLFO( total );
- memset(output, 0, sizeof(Bit32s) * 2 * samples);
+ memset(output, 0, sizeof(Bit32s) * samples * 2);
int count = 0;
for( Channel* ch = chan; ch < chan + 18; ) {
count++;
diff --git a/audio/softsynth/opl/dbopl.h b/audio/softsynth/opl/dbopl.h
index 87d1045fab..3dbd98986d 100644
--- a/audio/softsynth/opl/dbopl.h
+++ b/audio/softsynth/opl/dbopl.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2002-2010 The DOSBox Team
+ * Copyright (C) 2002-2011 The DOSBox Team
*
* 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
@@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-// Last synch with DOSBox SVN trunk r3556
+// Last synch with DOSBox SVN trunk r3752
#ifndef SOUND_SOFTSYNTH_OPL_DBOPL_H
#define SOUND_SOFTSYNTH_OPL_DBOPL_H
diff --git a/audio/softsynth/opl/dosbox.h b/audio/softsynth/opl/dosbox.h
index 125dde8aec..cdf86df114 100644
--- a/audio/softsynth/opl/dosbox.h
+++ b/audio/softsynth/opl/dosbox.h
@@ -104,4 +104,3 @@ public:
#endif // !DISABLE_DOSBOX_OPL
#endif
-
diff --git a/audio/softsynth/opl/mame.cpp b/audio/softsynth/opl/mame.cpp
index 74699ba4c6..dd3c354045 100644
--- a/audio/softsynth/opl/mame.cpp
+++ b/audio/softsynth/opl/mame.cpp
@@ -725,6 +725,8 @@ static int OPLOpenTable(void) {
ENV_CURVE = (int *)malloc(sizeof(int) * (2*EG_ENT+1));
+ if (!ENV_CURVE)
+ error("[OPLOpenTable] Cannot allocate memory");
/* envelope counter -> envelope output table */
for (i=0; i < EG_ENT; i++) {
@@ -1243,4 +1245,3 @@ FM_OPL *makeAdLibOPL(int rate) {
} // End of namespace MAME
} // End of namespace OPL
-
diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp
index 8d22ab732d..3e0005dedd 100644
--- a/backends/base-backend.cpp
+++ b/backends/base-backend.cpp
@@ -8,19 +8,16 @@
* 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/base-backend.h"
diff --git a/backends/events/dinguxsdl/dinguxsdl-events.cpp b/backends/events/dinguxsdl/dinguxsdl-events.cpp
index 946507ccfd..64d8fbeb62 100644
--- a/backends/events/dinguxsdl/dinguxsdl-events.cpp
+++ b/backends/events/dinguxsdl/dinguxsdl-events.cpp
@@ -50,7 +50,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_DOWN) {
@@ -63,7 +63,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_LEFT) {
@@ -76,7 +76,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_RIGHT) {
@@ -89,7 +89,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_Y) { // left mouse button
@@ -99,7 +99,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_LBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_B) { // right mouse button
@@ -109,7 +109,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_RBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_X) { // '.' skip dialogue
diff --git a/backends/events/gph/gph-events.cpp b/backends/events/gph/gph-events.cpp
index b461f85fbb..b4e106b790 100644
--- a/backends/events/gph/gph-events.cpp
+++ b/backends/events/gph/gph-events.cpp
@@ -42,167 +42,141 @@
#define JOY_YAXIS 1
/* Quick default button states for modifiers. */
-int BUTTON_STATE_L = false;
+int BUTTON_STATE_L = false;
#if defined(CAANOO)
- /* Caanoo: Main Joystick Button Mappings */
- /* The Caanoo has an analogue stick so no digital DPAD */
- enum {
- /* Joystick Buttons */
- BUTTON_A = 0,
- BUTTON_X = 1,
- BUTTON_B = 2,
- BUTTON_Y = 3,
- BUTTON_L = 4,
- BUTTON_R = 5,
- BUTTON_HOME = 6, // Home
- BUTTON_HOLD = 7, // Hold (on Power)
- BUTTON_HELP = 8, // Help I
- BUTTON_HELP2 = 9, // Help II
- BUTTON_CLICK = 10 // Stick Click
- };
-
- enum {
- /* Unused Joystick Buttons on the Caanoo */
- BUTTON_VOLUP = 51,
- BUTTON_VOLDOWN = 52,
- BUTTON_UP = 53,
- BUTTON_UPLEFT = 54,
- BUTTON_LEFT = 55,
- BUTTON_DOWNLEFT = 56,
- BUTTON_DOWN = 57,
- BUTTON_DOWNRIGHT = 58,
- BUTTON_RIGHT = 59,
- BUTTON_UPRIGHT = 60,
- BUTTON_MENU = 61,
- BUTTON_SELECT = 62
- };
+/* Caanoo: Main Joystick Button Mappings */
+/* The Caanoo has an analogue stick so no digital DPAD */
+enum {
+ /* Joystick Buttons */
+ BUTTON_A = 0,
+ BUTTON_X = 1,
+ BUTTON_B = 2,
+ BUTTON_Y = 3,
+ BUTTON_L = 4,
+ BUTTON_R = 5,
+ BUTTON_HOME = 6, // Home
+ BUTTON_HOLD = 7, // Hold (on Power)
+ BUTTON_HELP = 8, // Help I
+ BUTTON_HELP2 = 9, // Help II
+ BUTTON_CLICK = 10 // Stick Click
+};
-#endif
+enum {
+ /* Unused Joystick Buttons on the Caanoo */
+ BUTTON_VOLUP = 51,
+ BUTTON_VOLDOWN = 52,
+ BUTTON_UP = 53,
+ BUTTON_UPLEFT = 54,
+ BUTTON_LEFT = 55,
+ BUTTON_DOWNLEFT = 56,
+ BUTTON_DOWN = 57,
+ BUTTON_DOWNRIGHT = 58,
+ BUTTON_RIGHT = 59,
+ BUTTON_UPRIGHT = 60,
+ BUTTON_MENU = 61,
+ BUTTON_SELECT = 62
+};
-#if defined(GP2XWIZ)
-
- /* Wiz: Main Joystick Mappings */
- enum {
- /* DPAD */
- BUTTON_UP = 0,
- BUTTON_UPLEFT = 1,
- BUTTON_LEFT = 2,
- BUTTON_DOWNLEFT = 3,
- BUTTON_DOWN = 4,
- BUTTON_DOWNRIGHT = 5,
- BUTTON_RIGHT = 6,
- BUTTON_UPRIGHT = 7,
- /* Joystick Buttons */
- BUTTON_MENU = 8,
- BUTTON_SELECT = 9,
- BUTTON_L = 10,
- BUTTON_R = 11,
- BUTTON_A = 12,
- BUTTON_B = 13,
- BUTTON_X = 14,
- BUTTON_Y = 15,
- BUTTON_VOLUP = 16,
- BUTTON_VOLDOWN = 17
- };
-
- enum {
- /* Unused Joystick Buttons on the Wiz */
- BUTTON_HOME = 51,
- BUTTON_HOLD = 52,
- BUTTON_CLICK = 53,
- BUTTON_HELP = 54,
- BUTTON_HELP2 = 55
- };
+#elif defined(GP2XWIZ)
-#endif
+/* Wiz: Main Joystick Mappings */
+enum {
+ /* DPAD */
+ BUTTON_UP = 0,
+ BUTTON_UPLEFT = 1,
+ BUTTON_LEFT = 2,
+ BUTTON_DOWNLEFT = 3,
+ BUTTON_DOWN = 4,
+ BUTTON_DOWNRIGHT = 5,
+ BUTTON_RIGHT = 6,
+ BUTTON_UPRIGHT = 7,
+ /* Joystick Buttons */
+ BUTTON_MENU = 8,
+ BUTTON_SELECT = 9,
+ BUTTON_L = 10,
+ BUTTON_R = 11,
+ BUTTON_A = 12,
+ BUTTON_B = 13,
+ BUTTON_X = 14,
+ BUTTON_Y = 15,
+ BUTTON_VOLUP = 16,
+ BUTTON_VOLDOWN = 17
+};
-#if defined(GP2X)
+enum {
+ /* Unused Joystick Buttons on the Wiz */
+ BUTTON_HOME = 51,
+ BUTTON_HOLD = 52,
+ BUTTON_CLICK = 53,
+ BUTTON_HELP = 54,
+ BUTTON_HELP2 = 55
+};
+
+#elif defined(GP2X)
enum {
/* DPAD/Stick */
- BUTTON_UP = 0,
- BUTTON_UPLEFT = 1,
- BUTTON_LEFT = 2,
- BUTTON_DOWNLEFT = 3,
- BUTTON_DOWN = 4,
- BUTTON_DOWNRIGHT = 5,
- BUTTON_RIGHT = 6,
- BUTTON_UPRIGHT = 7,
+ BUTTON_UP = 0,
+ BUTTON_UPLEFT = 1,
+ BUTTON_LEFT = 2,
+ BUTTON_DOWNLEFT = 3,
+ BUTTON_DOWN = 4,
+ BUTTON_DOWNRIGHT = 5,
+ BUTTON_RIGHT = 6,
+ BUTTON_UPRIGHT = 7,
/* Joystick Buttons */
- BUTTON_MENU = 8, // Start on F100 GP2X
- BUTTON_SELECT = 9,
- BUTTON_L = 10,
- BUTTON_R = 11,
- BUTTON_A = 12,
- BUTTON_B = 13,
- BUTTON_X = 14,
- BUTTON_Y = 15,
- BUTTON_VOLUP = 16,
- BUTTON_VOLDOWN = 17,
- BUTTON_CLICK = 18
+ BUTTON_MENU = 8, // Start on F100 GP2X
+ BUTTON_SELECT = 9,
+ BUTTON_L = 10,
+ BUTTON_R = 11,
+ BUTTON_A = 12,
+ BUTTON_B = 13,
+ BUTTON_X = 14,
+ BUTTON_Y = 15,
+ BUTTON_VOLUP = 16,
+ BUTTON_VOLDOWN = 17,
+ BUTTON_CLICK = 18
};
enum {
/* Unused Joystick Buttons on the GP2X */
- BUTTON_HOME = 51,
- BUTTON_HOLD = 52,
- BUTTON_HELP = 53,
- BUTTON_HELP2 = 54
+ BUTTON_HOME = 51,
+ BUTTON_HOLD = 52,
+ BUTTON_HELP = 53,
+ BUTTON_HELP2 = 54
};
#endif
enum {
/* Touchscreen TapMode */
- TAPMODE_LEFT = 0,
- TAPMODE_RIGHT = 1,
- TAPMODE_HOVER = 2
+ TAPMODE_LEFT = 0,
+ TAPMODE_RIGHT = 1,
+ TAPMODE_HOVER = 2
};
GPHEventSource::GPHEventSource()
- : _buttonStateL(false){
+ : _buttonStateL(false) {
}
-//void GPHEventSource::fillMouseEvent(Common::Event &event, int x, int y) {
-// if (GPHGraphicsManager::_videoMode.mode == GFX_HALF && !GPHGraphicsManager::_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 GPHEventSource::moveStick() {
bool stickBtn[32];
memcpy(stickBtn, _stickBtn, sizeof(stickBtn));
- if ((stickBtn[0])||(stickBtn[2])||(stickBtn[4])||(stickBtn[6]))
+ if ((stickBtn[0]) || (stickBtn[2]) || (stickBtn[4]) || (stickBtn[6]))
stickBtn[1] = stickBtn[3] = stickBtn[5] = stickBtn[7] = 0;
- if ((stickBtn[1])||(stickBtn[2])||(stickBtn[3])) {
- if (_km.x_down_count!=2) {
+ if ((stickBtn[1]) || (stickBtn[2]) || (stickBtn[3])) {
+ if (_km.x_down_count != 2) {
_km.x_vel = -1;
_km.x_down_count = 1;
} else
_km.x_vel = -4;
- } else if ((stickBtn[5])||(stickBtn[6])||(stickBtn[7])) {
- if (_km.x_down_count!=2) {
+ } else if ((stickBtn[5]) || (stickBtn[6]) || (stickBtn[7])) {
+ if (_km.x_down_count != 2) {
_km.x_vel = 1;
_km.x_down_count = 1;
} else
@@ -212,14 +186,14 @@ void GPHEventSource::moveStick() {
_km.x_down_count = 0;
}
- if ((stickBtn[0])||(stickBtn[1])||(stickBtn[7])) {
- if (_km.y_down_count!=2) {
+ if ((stickBtn[0]) || (stickBtn[1]) || (stickBtn[7])) {
+ if (_km.y_down_count != 2) {
_km.y_vel = -1;
_km.y_down_count = 1;
} else
_km.y_vel = -4;
- } else if ((stickBtn[3])||(stickBtn[4])||(stickBtn[5])) {
- if (_km.y_down_count!=2) {
+ } else if ((stickBtn[3]) || (stickBtn[4]) || (stickBtn[5])) {
+ if (_km.y_down_count != 2) {
_km.y_vel = 1;
_km.y_down_count = 1;
} else
@@ -233,7 +207,7 @@ void GPHEventSource::moveStick() {
/* Custom handleMouseButtonDown/handleMouseButtonUp to deal with 'Tap Mode' for the touchscreen */
bool GPHEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
- if (ev.button.button == SDL_BUTTON_LEFT){
+ if (ev.button.button == SDL_BUTTON_LEFT) {
if (BUTTON_STATE_L == true) /* BUTTON_STATE_L = Left Trigger Held, force Right Click */
event.type = Common::EVENT_RBUTTONDOWN;
else if (GPH::tapmodeLevel == TAPMODE_LEFT) /* TAPMODE_LEFT = Left Click Tap Mode */
@@ -244,8 +218,7 @@ bool GPHEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event)
event.type = Common::EVENT_MOUSEMOVE;
else
event.type = Common::EVENT_LBUTTONDOWN; /* For normal mice etc. */
- }
- else if (ev.button.button == SDL_BUTTON_RIGHT)
+ } else if (ev.button.button == SDL_BUTTON_RIGHT)
event.type = Common::EVENT_RBUTTONDOWN;
#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN)
else if (ev.button.button == SDL_BUTTON_WHEELUP)
@@ -260,13 +233,13 @@ bool GPHEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event)
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
bool GPHEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
- if (ev.button.button == SDL_BUTTON_LEFT){
+ if (ev.button.button == SDL_BUTTON_LEFT) {
if (BUTTON_STATE_L == true) /* BUTTON_STATE_L = Left Trigger Held, force Right Click */
event.type = Common::EVENT_RBUTTONUP;
else if (GPH::tapmodeLevel == TAPMODE_LEFT) /* TAPMODE_LEFT = Left Click Tap Mode */
@@ -277,8 +250,7 @@ bool GPHEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_MOUSEMOVE;
else
event.type = Common::EVENT_LBUTTONUP; /* For normal mice etc. */
- }
- else if (ev.button.button == SDL_BUTTON_RIGHT)
+ } else if (ev.button.button == SDL_BUTTON_RIGHT)
event.type = Common::EVENT_RBUTTONUP;
#if defined(SDL_BUTTON_MIDDLE)
else if (ev.button.button == SDL_BUTTON_MIDDLE)
@@ -287,7 +259,7 @@ bool GPHEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -310,16 +282,16 @@ bool GPHEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
case BUTTON_UPRIGHT:
moveStick();
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_B:
case BUTTON_CLICK:
event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_X:
event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_L:
BUTTON_STATE_L = true;
@@ -354,8 +326,8 @@ bool GPHEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
if (BUTTON_STATE_L == true) {
event.type = Common::EVENT_PREDICTIVE_DIALOG;
} else {
- event.kbd.keycode = Common::KEYCODE_PERIOD;
- event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
+ event.kbd.keycode = Common::KEYCODE_PERIOD;
+ event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
}
break;
case BUTTON_Y:
@@ -433,16 +405,16 @@ bool GPHEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
case BUTTON_UPRIGHT:
moveStick();
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_B:
case BUTTON_CLICK:
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_X:
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_L:
BUTTON_STATE_L = false;
@@ -500,7 +472,7 @@ bool GPHEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
return true;
}
-bool GPHEventSource::remapKey(SDL_Event &ev,Common::Event &event) {
+bool GPHEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
return false;
}
diff --git a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
index e859c5291b..5d9f032e19 100644
--- a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
+++ b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
@@ -132,7 +132,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_RIGHT) {
if (ev.type == SDL_KEYDOWN) {
@@ -144,7 +144,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_DOWN) {
@@ -157,7 +157,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_UP) {
@@ -170,7 +170,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_RETURN) {
@@ -181,7 +181,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_LBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_PLUS) {
@@ -191,7 +191,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
} else {
event.type = Common::EVENT_RBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_MINUS) {
@@ -202,7 +202,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_LBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else {
diff --git a/backends/events/maemosdl/maemosdl-events.cpp b/backends/events/maemosdl/maemosdl-events.cpp
new file mode 100644
index 0000000000..32d5cfb5ac
--- /dev/null
+++ b/backends/events/maemosdl/maemosdl-events.cpp
@@ -0,0 +1,155 @@
+/* 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.
+ *
+ */
+
+#if defined(MAEMO)
+
+#include "common/scummsys.h"
+
+#include "backends/events/maemosdl/maemosdl-events.h"
+#include "common/translation.h"
+
+namespace Maemo {
+
+MaemoSdlEventSource::MaemoSdlEventSource() : SdlEventSource(), _clickEnabled(true) {
+
+}
+
+bool MaemoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
+
+ Model model = Model(((OSystem_SDL_Maemo *)g_system)->getModel());
+ debug(10, "Model: %s %u %s %s", model.hwId, model.modelType, model.hwAlias, model.hwKeyboard ? "true" : "false");
+
+ // List of special N810 keys:
+ // SDLK_F4 -> menu
+ // SDLK_F5 -> home
+ // SDLK_F6 -> fullscreen
+ // SDLK_F7 -> zoom +
+ // SDLK_F8 -> zoom -
+
+ switch (ev.type) {
+ case SDL_KEYDOWN:{
+ if (ev.key.keysym.sym == SDLK_F4) {
+ event.type = Common::EVENT_MAINMENU;
+ debug(9, "remapping to main menu");
+ return true;
+ } else if (ev.key.keysym.sym == SDLK_F6) {
+ if (!model.hwKeyboard) {
+ event.type = Common::EVENT_KEYDOWN;
+ event.kbd.keycode = Common::KEYCODE_F7;
+ event.kbd.ascii = Common::ASCII_F7;
+ event.kbd.flags = 0;
+ debug(9, "remapping to F7 down (virtual keyboard)");
+ return true;
+ } else {
+ // handled in keyup
+ }
+ } else if (ev.key.keysym.sym == SDLK_F7) {
+ event.type = Common::EVENT_RBUTTONDOWN;
+ processMouseEvent(event, _km.x, _km.y);
+ debug(9, "remapping to right click down");
+ return true;
+ } else if (ev.key.keysym.sym == SDLK_F8) {
+ if (ev.key.keysym.mod & KMOD_CTRL) {
+ event.type = Common::EVENT_KEYDOWN;
+ event.kbd.keycode = Common::KEYCODE_F7;
+ event.kbd.ascii = Common::ASCII_F7;
+ event.kbd.flags = 0;
+ debug(9, "remapping to F7 down (virtual keyboard)");
+ return true;
+ } else {
+ // handled in keyup
+ return true;
+ }
+ }
+ break;
+ }
+ case SDL_KEYUP: {
+ if (ev.key.keysym.sym == SDLK_F4) {
+ event.type = Common::EVENT_MAINMENU;
+ return true;
+ } else if (ev.key.keysym.sym == SDLK_F6) {
+ if (!model.hwKeyboard) {
+ event.type = Common::EVENT_KEYUP;
+ event.kbd.keycode = Common::KEYCODE_F7;
+ event.kbd.ascii = Common::ASCII_F7;
+ event.kbd.flags = 0;
+ debug(9, "remapping to F7 down (virtual keyboard)");
+ return true;
+ } else {
+ bool currentState = ((OSystem_SDL *)g_system)->getGraphicsManager()->getFeatureState(OSystem::kFeatureFullscreenMode);
+ g_system->beginGFXTransaction();
+ ((OSystem_SDL *)g_system)->getGraphicsManager()->setFeatureState(OSystem::kFeatureFullscreenMode, !currentState);
+ g_system->endGFXTransaction();
+ debug(9, "remapping to full screen toggle");
+ return true;
+ }
+ } else if (ev.key.keysym.sym == SDLK_F7) {
+ event.type = Common::EVENT_RBUTTONUP;
+ processMouseEvent(event, _km.x, _km.y);
+ debug(9, "remapping to right click up");
+ return true;
+ } else if (ev.key.keysym.sym == SDLK_F8) {
+ if (ev.key.keysym.mod & KMOD_CTRL) {
+ event.type = Common::EVENT_KEYUP;
+ event.kbd.keycode = Common::KEYCODE_F7;
+ event.kbd.ascii = Common::ASCII_F7;
+ event.kbd.flags = 0;
+ debug(9, "remapping to F7 up (virtual keyboard)");
+ return true;
+ } else {
+ _clickEnabled = !_clickEnabled;
+ ((SurfaceSdlGraphicsManager*) _graphicsManager)->displayMessageOnOSD(
+ _clickEnabled ? _("Clicking Enabled") : _("Clicking Disabled"));
+ debug(9, "remapping to click toggle");
+ return true;
+ }
+ }
+ break;
+ }
+ }
+ // Invoke parent implementation of this method
+ return SdlEventSource::remapKey(ev, event);
+}
+
+bool MaemoSdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
+
+ if (ev.button.button == SDL_BUTTON_LEFT && !_clickEnabled) {
+ return false;
+ }
+
+ // Invoke parent implementation of this method
+ return SdlEventSource::handleMouseButtonDown(ev, event);
+}
+
+bool MaemoSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
+
+ if (ev.button.button == SDL_BUTTON_LEFT && !_clickEnabled) {
+ return false;
+ }
+
+ // Invoke parent implementation of this method
+ return SdlEventSource::handleMouseButtonUp(ev, event);
+}
+
+} // namespace Maemo
+
+#endif // if defined(MAEMO)
diff --git a/backends/events/maemosdl/maemosdl-events.h b/backends/events/maemosdl/maemosdl-events.h
new file mode 100644
index 0000000000..5c06c4bc22
--- /dev/null
+++ b/backends/events/maemosdl/maemosdl-events.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.
+ *
+ */
+
+#if defined(MAEMO)
+
+#if !defined(BACKEND_EVENTS_SDL_MAEMO_H) && !defined(DISABLE_DEFAULT_EVENTMANAGER)
+#define BACKEND_EVENTS_SDL_MAEMO_H
+
+#include "backends/events/sdl/sdl-events.h"
+#include "backends/platform/maemo/maemo.h"
+#include "backends/graphics/surfacesdl/surfacesdl-graphics.h"
+
+namespace Maemo {
+
+/**
+ * SDL events manager for Maemo
+ */
+class MaemoSdlEventSource : public SdlEventSource {
+public:
+ MaemoSdlEventSource();
+protected:
+ virtual bool remapKey(SDL_Event &ev, Common::Event &event);
+ virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event);
+ virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event);
+
+ bool _clickEnabled;
+};
+
+} // namespace Maemo
+
+#endif // include guard
+
+#endif // if defined(MAEMO)
diff --git a/backends/events/openpandora/op-events.cpp b/backends/events/openpandora/op-events.cpp
index 72bc56c95d..c1d6362fcb 100644
--- a/backends/events/openpandora/op-events.cpp
+++ b/backends/events/openpandora/op-events.cpp
@@ -38,23 +38,23 @@
#include "common/events.h"
/* Quick default button states for modifiers. */
-int BUTTON_STATE_L = false;
+int BUTTON_STATE_L = false;
enum {
/* Touchscreen TapMode */
- TAPMODE_LEFT = 0,
- TAPMODE_RIGHT = 1,
- TAPMODE_HOVER = 2
+ TAPMODE_LEFT = 0,
+ TAPMODE_RIGHT = 1,
+ TAPMODE_HOVER = 2
};
OPEventSource::OPEventSource()
- : _buttonStateL(false){
+ : _buttonStateL(false) {
}
/* Custom handleMouseButtonDown/handleMouseButtonUp to deal with 'Tap Mode' for the touchscreen */
bool OPEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
- if (ev.button.button == SDL_BUTTON_LEFT){
+ if (ev.button.button == SDL_BUTTON_LEFT) {
if (BUTTON_STATE_L == true) /* BUTTON_STATE_L = Left Trigger Held, force Right Click */
event.type = Common::EVENT_RBUTTONDOWN;
else if (OP::tapmodeLevel == TAPMODE_LEFT) /* TAPMODE_LEFT = Left Click Tap Mode */
@@ -65,8 +65,7 @@ bool OPEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_MOUSEMOVE;
else
event.type = Common::EVENT_LBUTTONDOWN; /* For normal mice etc. */
- }
- else if (ev.button.button == SDL_BUTTON_RIGHT)
+ } else if (ev.button.button == SDL_BUTTON_RIGHT)
event.type = Common::EVENT_RBUTTONDOWN;
#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN)
else if (ev.button.button == SDL_BUTTON_WHEELUP)
@@ -81,13 +80,13 @@ bool OPEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
bool OPEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
- if (ev.button.button == SDL_BUTTON_LEFT){
+ if (ev.button.button == SDL_BUTTON_LEFT) {
if (BUTTON_STATE_L == true) /* BUTTON_STATE_L = Left Trigger Held, force Right Click */
event.type = Common::EVENT_RBUTTONUP;
else if (OP::tapmodeLevel == TAPMODE_LEFT) /* TAPMODE_LEFT = Left Click Tap Mode */
@@ -98,8 +97,7 @@ bool OPEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_MOUSEMOVE;
else
event.type = Common::EVENT_LBUTTONUP; /* For normal mice etc. */
- }
- else if (ev.button.button == SDL_BUTTON_RIGHT)
+ } else if (ev.button.button == SDL_BUTTON_RIGHT)
event.type = Common::EVENT_RBUTTONUP;
#if defined(SDL_BUTTON_MIDDLE)
else if (ev.button.button == SDL_BUTTON_MIDDLE)
@@ -108,7 +106,7 @@ bool OPEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -123,12 +121,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
switch (ev.key.keysym.sym) {
case SDLK_HOME:
event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_END:
event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_PAGEDOWN:
@@ -159,12 +157,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
switch (ev.key.keysym.sym) {
case SDLK_HOME:
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_END:
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_PAGEDOWN:
diff --git a/backends/events/ps3sdl/ps3sdl-events.cpp b/backends/events/ps3sdl/ps3sdl-events.cpp
new file mode 100644
index 0000000000..723942af11
--- /dev/null
+++ b/backends/events/ps3sdl/ps3sdl-events.cpp
@@ -0,0 +1,163 @@
+/* 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.
+ *
+ */
+
+#include "common/scummsys.h"
+
+#if defined(PLAYSTATION3)
+
+#include "backends/events/ps3sdl/ps3sdl-events.h"
+#include "backends/platform/sdl/sdl.h"
+#include "engines/engine.h"
+
+#include "common/util.h"
+#include "common/events.h"
+
+enum {
+ BTN_LEFT = 0,
+ BTN_DOWN = 1,
+ BTN_RIGHT = 2,
+ BTN_UP = 3,
+
+ BTN_START = 4,
+ BTN_R3 = 5,
+ BTN_L3 = 6,
+ BTN_SELECT = 7,
+
+ BTN_SQUARE = 8,
+ BTN_CROSS = 9,
+ BTN_CIRCLE = 10,
+ BTN_TRIANGLE = 11,
+
+ BTN_R1 = 12,
+ BTN_L1 = 13,
+ BTN_R2 = 14,
+ BTN_L2 = 15
+};
+
+bool PS3SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
+
+ event.kbd.flags = 0;
+
+ switch (ev.jbutton.button) {
+ case BTN_CROSS: // Left mouse button
+ event.type = Common::EVENT_LBUTTONDOWN;
+ processMouseEvent(event, _km.x, _km.y);
+ break;
+ case BTN_CIRCLE: // Right mouse button
+ event.type = Common::EVENT_RBUTTONDOWN;
+ processMouseEvent(event, _km.x, _km.y);
+ break;
+ case BTN_TRIANGLE: // Game menu
+ event.type = Common::EVENT_KEYDOWN;
+ event.kbd.keycode = Common::KEYCODE_F5;
+ event.kbd.ascii = mapKey(SDLK_F5, (SDLMod) ev.key.keysym.mod, 0);
+ break;
+ case BTN_SELECT: // Virtual keyboard
+ event.type = Common::EVENT_KEYDOWN;
+ event.kbd.keycode = Common::KEYCODE_F7;
+ event.kbd.ascii = mapKey(SDLK_F7, (SDLMod) ev.key.keysym.mod, 0);
+ break;
+ case BTN_SQUARE: // Escape
+ event.type = Common::EVENT_KEYDOWN;
+ event.kbd.keycode = Common::KEYCODE_ESCAPE;
+ event.kbd.ascii = mapKey(SDLK_ESCAPE, (SDLMod) ev.key.keysym.mod, 0);
+ break;
+ case BTN_L1: // Predictive input dialog
+ event.type = Common::EVENT_PREDICTIVE_DIALOG;
+ break;
+ case BTN_START: // ScummVM in game menu
+ event.type = Common::EVENT_MAINMENU;
+ break;
+ }
+ return true;
+}
+
+bool PS3SdlEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
+
+ event.kbd.flags = 0;
+
+ switch (ev.jbutton.button) {
+ case BTN_CROSS: // Left mouse button
+ event.type = Common::EVENT_LBUTTONUP;
+ processMouseEvent(event, _km.x, _km.y);
+ break;
+ case BTN_CIRCLE: // Right mouse button
+ event.type = Common::EVENT_RBUTTONUP;
+ processMouseEvent(event, _km.x, _km.y);
+ break;
+ case BTN_TRIANGLE: // Game menu
+ event.type = Common::EVENT_KEYUP;
+ event.kbd.keycode = Common::KEYCODE_F5;
+ event.kbd.ascii = mapKey(SDLK_F5, (SDLMod) ev.key.keysym.mod, 0);
+ break;
+ case BTN_SELECT: // Virtual keyboard
+ event.type = Common::EVENT_KEYUP;
+ event.kbd.keycode = Common::KEYCODE_F7;
+ event.kbd.ascii = mapKey(SDLK_F7, (SDLMod) ev.key.keysym.mod, 0);
+ break;
+ case BTN_SQUARE: // Escape
+ event.type = Common::EVENT_KEYUP;
+ event.kbd.keycode = Common::KEYCODE_ESCAPE;
+ event.kbd.ascii = mapKey(SDLK_ESCAPE, (SDLMod) ev.key.keysym.mod, 0);
+ break;
+ }
+ return true;
+}
+
+/**
+ * The XMB (PS3 in game menu) needs the screen buffers to be constantly flip while open.
+ * This pauses execution and keeps redrawing the screen until the XMB is closed.
+ */
+void PS3SdlEventSource::preprocessEvents(SDL_Event *event) {
+ if (event->type == SDL_ACTIVEEVENT) {
+ if (event->active.state == SDL_APPMOUSEFOCUS && !event->active.gain) {
+ // XMB opened
+ if (g_engine)
+ g_engine->pauseEngine(true);
+
+ for (;;) {
+ if (!SDL_PollEvent(event)) {
+ // Locking the screen forces a full redraw
+ Graphics::Surface* screen = g_system->lockScreen();
+ if (screen) {
+ g_system->unlockScreen();
+ g_system->updateScreen();
+ }
+ SDL_Delay(10);
+ continue;
+ }
+ if (event->type == SDL_QUIT)
+ return;
+ if (event->type != SDL_ACTIVEEVENT)
+ continue;
+ if (event->active.state == SDL_APPMOUSEFOCUS && event->active.gain) {
+ // XMB closed
+ if (g_engine)
+ g_engine->pauseEngine(false);
+ return;
+ }
+ }
+ }
+ }
+}
+
+#endif
diff --git a/backends/events/ps3sdl/ps3sdl-events.h b/backends/events/ps3sdl/ps3sdl-events.h
new file mode 100644
index 0000000000..8cf2f43426
--- /dev/null
+++ b/backends/events/ps3sdl/ps3sdl-events.h
@@ -0,0 +1,38 @@
+/* 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.
+ *
+ */
+
+#if !defined(BACKEND_EVENTS_PS3_H) && !defined(DISABLE_DEFAULT_EVENTMANAGER)
+#define BACKEND_EVENTS_PS3_H
+
+#include "backends/events/sdl/sdl-events.h"
+
+/**
+ * SDL Events manager for the PS3.
+ */
+class PS3SdlEventSource : public SdlEventSource {
+protected:
+ void preprocessEvents(SDL_Event *event);
+ bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event);
+ bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event);
+};
+
+#endif /* BACKEND_EVENTS_PS3_H */
diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp
index 835d98e718..f94171646a 100644
--- a/backends/events/sdl/sdl-events.cpp
+++ b/backends/events/sdl/sdl-events.cpp
@@ -50,7 +50,7 @@
#define JOY_BUT_F5 5
SdlEventSource::SdlEventSource()
- : _scrollLock(false), _joystick(0), _lastScreenID(0), EventSource() {
+ : EventSource(), _scrollLock(false), _joystick(0), _lastScreenID(0), _graphicsManager(0) {
// Reset mouse state
memset(&_km, 0, sizeof(_km));
@@ -91,10 +91,15 @@ int SdlEventSource::mapKey(SDLKey key, SDLMod mod, Uint16 unicode) {
return key;
}
-void SdlEventSource::fillMouseEvent(Common::Event &event, int x, int y) {
+void SdlEventSource::processMouseEvent(Common::Event &event, int x, int y) {
event.mouse.x = x;
event.mouse.y = y;
+ if (_graphicsManager) {
+ _graphicsManager->notifyMousePos(Common::Point(x, y));
+ _graphicsManager->transformMouseCoordinates(event.mouse);
+ }
+
// Update the "keyboard mouse" coords
_km.x = x;
_km.y = y;
@@ -194,6 +199,149 @@ void SdlEventSource::SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) {
event.kbd.flags |= Common::KBD_CAPS;
}
+Common::KeyCode SdlEventSource::SDLToOSystemKeycode(const SDLKey key) {
+ switch (key) {
+ case SDLK_BACKSPACE: return Common::KEYCODE_BACKSPACE;
+ case SDLK_TAB: return Common::KEYCODE_TAB;
+ case SDLK_CLEAR: return Common::KEYCODE_CLEAR;
+ case SDLK_RETURN: return Common::KEYCODE_RETURN;
+ case SDLK_PAUSE: return Common::KEYCODE_PAUSE;
+ case SDLK_ESCAPE: return Common::KEYCODE_ESCAPE;
+ case SDLK_SPACE: return Common::KEYCODE_SPACE;
+ case SDLK_EXCLAIM: return Common::KEYCODE_EXCLAIM;
+ case SDLK_QUOTEDBL: return Common::KEYCODE_QUOTEDBL;
+ case SDLK_HASH: return Common::KEYCODE_HASH;
+ case SDLK_DOLLAR: return Common::KEYCODE_DOLLAR;
+ case SDLK_AMPERSAND: return Common::KEYCODE_AMPERSAND;
+ case SDLK_QUOTE: return Common::KEYCODE_QUOTE;
+ case SDLK_LEFTPAREN: return Common::KEYCODE_LEFTPAREN;
+ case SDLK_RIGHTPAREN: return Common::KEYCODE_RIGHTPAREN;
+ case SDLK_ASTERISK: return Common::KEYCODE_ASTERISK;
+ case SDLK_PLUS: return Common::KEYCODE_PLUS;
+ case SDLK_COMMA: return Common::KEYCODE_COMMA;
+ case SDLK_MINUS: return Common::KEYCODE_MINUS;
+ case SDLK_PERIOD: return Common::KEYCODE_PERIOD;
+ case SDLK_SLASH: return Common::KEYCODE_SLASH;
+ case SDLK_0: return Common::KEYCODE_0;
+ case SDLK_1: return Common::KEYCODE_1;
+ case SDLK_2: return Common::KEYCODE_2;
+ case SDLK_3: return Common::KEYCODE_3;
+ case SDLK_4: return Common::KEYCODE_4;
+ case SDLK_5: return Common::KEYCODE_5;
+ case SDLK_6: return Common::KEYCODE_6;
+ case SDLK_7: return Common::KEYCODE_7;
+ case SDLK_8: return Common::KEYCODE_8;
+ case SDLK_9: return Common::KEYCODE_9;
+ case SDLK_COLON: return Common::KEYCODE_COLON;
+ case SDLK_SEMICOLON: return Common::KEYCODE_SEMICOLON;
+ case SDLK_LESS: return Common::KEYCODE_LESS;
+ case SDLK_EQUALS: return Common::KEYCODE_EQUALS;
+ case SDLK_GREATER: return Common::KEYCODE_GREATER;
+ case SDLK_QUESTION: return Common::KEYCODE_QUESTION;
+ case SDLK_AT: return Common::KEYCODE_AT;
+ case SDLK_LEFTBRACKET: return Common::KEYCODE_LEFTBRACKET;
+ case SDLK_BACKSLASH: return Common::KEYCODE_BACKSLASH;
+ case SDLK_RIGHTBRACKET: return Common::KEYCODE_RIGHTBRACKET;
+ case SDLK_CARET: return Common::KEYCODE_CARET;
+ case SDLK_UNDERSCORE: return Common::KEYCODE_UNDERSCORE;
+ case SDLK_BACKQUOTE: return Common::KEYCODE_BACKQUOTE;
+ case SDLK_a: return Common::KEYCODE_a;
+ case SDLK_b: return Common::KEYCODE_b;
+ case SDLK_c: return Common::KEYCODE_c;
+ case SDLK_d: return Common::KEYCODE_d;
+ case SDLK_e: return Common::KEYCODE_e;
+ case SDLK_f: return Common::KEYCODE_f;
+ case SDLK_g: return Common::KEYCODE_g;
+ case SDLK_h: return Common::KEYCODE_h;
+ case SDLK_i: return Common::KEYCODE_i;
+ case SDLK_j: return Common::KEYCODE_j;
+ case SDLK_k: return Common::KEYCODE_k;
+ case SDLK_l: return Common::KEYCODE_l;
+ case SDLK_m: return Common::KEYCODE_m;
+ case SDLK_n: return Common::KEYCODE_n;
+ case SDLK_o: return Common::KEYCODE_o;
+ case SDLK_p: return Common::KEYCODE_p;
+ case SDLK_q: return Common::KEYCODE_q;
+ case SDLK_r: return Common::KEYCODE_r;
+ case SDLK_s: return Common::KEYCODE_s;
+ case SDLK_t: return Common::KEYCODE_t;
+ case SDLK_u: return Common::KEYCODE_u;
+ case SDLK_v: return Common::KEYCODE_v;
+ case SDLK_w: return Common::KEYCODE_w;
+ case SDLK_x: return Common::KEYCODE_x;
+ case SDLK_y: return Common::KEYCODE_y;
+ case SDLK_z: return Common::KEYCODE_z;
+ case SDLK_DELETE: return Common::KEYCODE_DELETE;
+#if SDL_VERSION_ATLEAST(1, 3, 0)
+ case SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_GRAVE): return Common::KEYCODE_TILDE;
+#else
+ case SDLK_WORLD_16: return Common::KEYCODE_TILDE;
+#endif
+ case SDLK_KP0: return Common::KEYCODE_KP0;
+ case SDLK_KP1: return Common::KEYCODE_KP1;
+ case SDLK_KP2: return Common::KEYCODE_KP2;
+ case SDLK_KP3: return Common::KEYCODE_KP3;
+ case SDLK_KP4: return Common::KEYCODE_KP4;
+ case SDLK_KP5: return Common::KEYCODE_KP5;
+ case SDLK_KP6: return Common::KEYCODE_KP6;
+ case SDLK_KP7: return Common::KEYCODE_KP7;
+ case SDLK_KP8: return Common::KEYCODE_KP8;
+ case SDLK_KP9: return Common::KEYCODE_KP9;
+ case SDLK_KP_PERIOD: return Common::KEYCODE_KP_PERIOD;
+ case SDLK_KP_DIVIDE: return Common::KEYCODE_KP_DIVIDE;
+ case SDLK_KP_MULTIPLY: return Common::KEYCODE_KP_MULTIPLY;
+ case SDLK_KP_MINUS: return Common::KEYCODE_KP_MINUS;
+ case SDLK_KP_PLUS: return Common::KEYCODE_KP_PLUS;
+ case SDLK_KP_ENTER: return Common::KEYCODE_KP_ENTER;
+ case SDLK_KP_EQUALS: return Common::KEYCODE_KP_EQUALS;
+ case SDLK_UP: return Common::KEYCODE_UP;
+ case SDLK_DOWN: return Common::KEYCODE_DOWN;
+ case SDLK_RIGHT: return Common::KEYCODE_RIGHT;
+ case SDLK_LEFT: return Common::KEYCODE_LEFT;
+ case SDLK_INSERT: return Common::KEYCODE_INSERT;
+ case SDLK_HOME: return Common::KEYCODE_HOME;
+ case SDLK_END: return Common::KEYCODE_END;
+ case SDLK_PAGEUP: return Common::KEYCODE_PAGEUP;
+ case SDLK_PAGEDOWN: return Common::KEYCODE_PAGEDOWN;
+ case SDLK_F1: return Common::KEYCODE_F1;
+ case SDLK_F2: return Common::KEYCODE_F2;
+ case SDLK_F3: return Common::KEYCODE_F3;
+ case SDLK_F4: return Common::KEYCODE_F4;
+ case SDLK_F5: return Common::KEYCODE_F5;
+ case SDLK_F6: return Common::KEYCODE_F6;
+ case SDLK_F7: return Common::KEYCODE_F7;
+ case SDLK_F8: return Common::KEYCODE_F8;
+ case SDLK_F9: return Common::KEYCODE_F9;
+ case SDLK_F10: return Common::KEYCODE_F10;
+ case SDLK_F11: return Common::KEYCODE_F11;
+ case SDLK_F12: return Common::KEYCODE_F12;
+ case SDLK_F13: return Common::KEYCODE_F13;
+ case SDLK_F14: return Common::KEYCODE_F14;
+ case SDLK_F15: return Common::KEYCODE_F15;
+ case SDLK_NUMLOCK: return Common::KEYCODE_NUMLOCK;
+ case SDLK_CAPSLOCK: return Common::KEYCODE_CAPSLOCK;
+ case SDLK_SCROLLOCK: return Common::KEYCODE_SCROLLOCK;
+ case SDLK_RSHIFT: return Common::KEYCODE_RSHIFT;
+ case SDLK_LSHIFT: return Common::KEYCODE_LSHIFT;
+ case SDLK_RCTRL: return Common::KEYCODE_RCTRL;
+ case SDLK_LCTRL: return Common::KEYCODE_LCTRL;
+ case SDLK_RALT: return Common::KEYCODE_RALT;
+ case SDLK_LALT: return Common::KEYCODE_LALT;
+ case SDLK_LSUPER: return Common::KEYCODE_LSUPER;
+ case SDLK_RSUPER: return Common::KEYCODE_RSUPER;
+ case SDLK_MODE: return Common::KEYCODE_MODE;
+ case SDLK_COMPOSE: return Common::KEYCODE_COMPOSE;
+ case SDLK_HELP: return Common::KEYCODE_HELP;
+ case SDLK_PRINT: return Common::KEYCODE_PRINT;
+ case SDLK_SYSREQ: return Common::KEYCODE_SYSREQ;
+ case SDLK_BREAK: return Common::KEYCODE_BREAK;
+ case SDLK_MENU: return Common::KEYCODE_MENU;
+ case SDLK_POWER: return Common::KEYCODE_POWER;
+ case SDLK_UNDO: return Common::KEYCODE_UNDO;
+ default: return Common::KEYCODE_INVALID;
+ }
+}
+
bool SdlEventSource::pollEvent(Common::Event &event) {
handleKbdMouse();
@@ -206,7 +354,6 @@ bool SdlEventSource::pollEvent(Common::Event &event) {
}
SDL_Event ev;
- ev.type = SDL_NOEVENT;
while (SDL_PollEvent(&ev)) {
preprocessEvents(&ev);
if (dispatchSDLEvent(ev, event))
@@ -235,16 +382,14 @@ bool SdlEventSource::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) {
return handleJoyAxisMotion(ev, event);
case SDL_VIDEOEXPOSE:
- // HACK: Send a fake event, handled by SdlGraphicsManager
- event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose;
- return true;
+ if (_graphicsManager)
+ _graphicsManager->notifyVideoExpose();
+ return false;
case SDL_VIDEORESIZE:
- // HACK: Send a fake event, handled by OpenGLSdlGraphicsManager
- event.type = (Common::EventType)OSystem_SDL::kSdlEventResize;
- event.mouse.x = ev.resize.w;
- event.mouse.y = ev.resize.h;
- return true;
+ if (_graphicsManager)
+ _graphicsManager->notifyResize(ev.resize.w, ev.resize.h);
+ return false;
case SDL_QUIT:
event.type = Common::EVENT_QUIT;
@@ -291,6 +436,14 @@ bool SdlEventSource::handleKeyDown(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_QUIT;
return true;
}
+
+ #ifdef WIN32
+ // On Windows, also use the default Alt-F4 quit combination
+ if ((ev.key.keysym.mod & KMOD_ALT) && ev.key.keysym.sym == SDLK_F4) {
+ event.type = Common::EVENT_QUIT;
+ return true;
+ }
+ #endif
#endif
// Ctrl-u toggles mute
@@ -303,8 +456,8 @@ bool SdlEventSource::handleKeyDown(SDL_Event &ev, Common::Event &event) {
return true;
event.type = Common::EVENT_KEYDOWN;
- 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);
+ event.kbd.keycode = SDLToOSystemKeycode(ev.key.keysym.sym);
+ event.kbd.ascii = mapKey(ev.key.keysym.sym, (SDLMod)ev.key.keysym.mod, (Uint16)ev.key.keysym.unicode);
return true;
}
@@ -347,8 +500,8 @@ bool SdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) {
// continue normally
event.type = Common::EVENT_KEYUP;
- 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);
+ event.kbd.keycode = SDLToOSystemKeycode(ev.key.keysym.sym);
+ event.kbd.ascii = mapKey(ev.key.keysym.sym, (SDLMod)ev.key.keysym.mod, (Uint16)ev.key.keysym.unicode);
// Ctrl-Alt-<key> will change the GFX mode
SDLModToOSystemKeyFlags(mod, event);
@@ -362,7 +515,7 @@ bool SdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) {
bool SdlEventSource::handleMouseMotion(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, ev.motion.x, ev.motion.y);
+ processMouseEvent(event, ev.motion.x, ev.motion.y);
return true;
}
@@ -385,7 +538,7 @@ bool SdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event)
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -401,7 +554,7 @@ bool SdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
#endif
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -409,28 +562,28 @@ bool SdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
bool SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
if (ev.jbutton.button == JOY_BUT_LMOUSE) {
event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else {
event.type = Common::EVENT_KEYDOWN;
switch (ev.jbutton.button) {
case JOY_BUT_ESCAPE:
event.kbd.keycode = Common::KEYCODE_ESCAPE;
- event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_ESCAPE, (SDLMod)ev.key.keysym.mod, 0);
break;
case JOY_BUT_PERIOD:
event.kbd.keycode = Common::KEYCODE_PERIOD;
- event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_PERIOD, (SDLMod)ev.key.keysym.mod, 0);
break;
case JOY_BUT_SPACE:
event.kbd.keycode = Common::KEYCODE_SPACE;
- event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_SPACE, (SDLMod)ev.key.keysym.mod, 0);
break;
case JOY_BUT_F5:
event.kbd.keycode = Common::KEYCODE_F5;
- event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_F5, (SDLMod)ev.key.keysym.mod, 0);
break;
}
}
@@ -440,28 +593,28 @@ bool SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
bool SdlEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
if (ev.jbutton.button == JOY_BUT_LMOUSE) {
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else {
event.type = Common::EVENT_KEYUP;
switch (ev.jbutton.button) {
case JOY_BUT_ESCAPE:
event.kbd.keycode = Common::KEYCODE_ESCAPE;
- event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_ESCAPE, (SDLMod)ev.key.keysym.mod, 0);
break;
case JOY_BUT_PERIOD:
event.kbd.keycode = Common::KEYCODE_PERIOD;
- event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_PERIOD, (SDLMod)ev.key.keysym.mod, 0);
break;
case JOY_BUT_SPACE:
event.kbd.keycode = Common::KEYCODE_SPACE;
- event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_SPACE, (SDLMod)ev.key.keysym.mod, 0);
break;
case JOY_BUT_F5:
event.kbd.keycode = Common::KEYCODE_F5;
- event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
+ event.kbd.ascii = mapKey(SDLK_F5, (SDLMod)ev.key.keysym.mod, 0);
break;
}
}
@@ -511,7 +664,7 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) {
#endif
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
}
diff --git a/backends/events/sdl/sdl-events.h b/backends/events/sdl/sdl-events.h
index 805b76b108..2ba88c702b 100644
--- a/backends/events/sdl/sdl-events.h
+++ b/backends/events/sdl/sdl-events.h
@@ -24,6 +24,7 @@
#define BACKEND_EVENTS_SDL_H
#include "backends/platform/sdl/sdl-sys.h"
+#include "backends/graphics/sdl/sdl-graphics.h"
#include "common/events.h"
@@ -36,6 +37,8 @@ public:
SdlEventSource();
virtual ~SdlEventSource();
+ void setGraphicsManager(SdlGraphicsManager *gMan) { _graphicsManager = gMan; }
+
/**
* Gets and processes SDL events.
*/
@@ -77,6 +80,11 @@ protected:
int _lastScreenID;
/**
+ * The associated graphics manager.
+ */
+ SdlGraphicsManager *_graphicsManager;
+
+ /**
* Pre process an event before it is dispatched.
*/
virtual void preprocessEvents(SDL_Event *event) {}
@@ -108,9 +116,10 @@ protected:
//@}
/**
- * Assigns the mouse coords to the mouse event
+ * Assigns the mouse coords to the mouse event. Furthermore notify the
+ * graphics manager about the position change.
*/
- virtual void fillMouseEvent(Common::Event &event, int x, int y);
+ virtual void processMouseEvent(Common::Event &event, int x, int y);
/**
* Remaps key events. This allows platforms to configure
@@ -127,6 +136,11 @@ protected:
* Configures the key modifiers flags status
*/
virtual void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event);
+
+ /**
+ * Translates SDL key codes to OSystem key codes
+ */
+ Common::KeyCode SDLToOSystemKeycode(const SDLKey key);
};
#endif
diff --git a/backends/events/symbiansdl/symbiansdl-events.cpp b/backends/events/symbiansdl/symbiansdl-events.cpp
index 40bd89b8dc..308621e697 100644
--- a/backends/events/symbiansdl/symbiansdl-events.cpp
+++ b/backends/events/symbiansdl/symbiansdl-events.cpp
@@ -63,7 +63,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.y_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -76,7 +76,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.y_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -89,7 +89,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.x_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -102,19 +102,19 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.x_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
case GUI::ACTION_LEFTCLICK:
event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_LBUTTONDOWN : Common::EVENT_LBUTTONUP);
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
case GUI::ACTION_RIGHTCLICK:
event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_RBUTTONDOWN : Common::EVENT_RBUTTONUP);
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -132,7 +132,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
if (_currentZone >= TOTAL_ZONES)
_currentZone = 0;
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _mouseXZone[_currentZone], _mouseYZone[_currentZone]);
+ processMouseEvent(event, _mouseXZone[_currentZone], _mouseYZone[_currentZone]);
SDL_WarpMouse(event.mouse.x, event.mouse.y);
}
@@ -195,4 +195,3 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
#endif
-
diff --git a/backends/events/symbiansdl/symbiansdl-events.h b/backends/events/symbiansdl/symbiansdl-events.h
index 7186fc9116..66c0b451eb 100644
--- a/backends/events/symbiansdl/symbiansdl-events.h
+++ b/backends/events/symbiansdl/symbiansdl-events.h
@@ -53,4 +53,3 @@ protected:
};
#endif
-
diff --git a/backends/events/webossdl/webossdl-events.cpp b/backends/events/webossdl/webossdl-events.cpp
index 102eb5802e..d01e51fafe 100644
--- a/backends/events/webossdl/webossdl-events.cpp
+++ b/backends/events/webossdl/webossdl-events.cpp
@@ -22,55 +22,17 @@
#ifdef WEBOS
-// Allow use of stuff in <time.h>
-#define FORBIDDEN_SYMBOL_EXCEPTION_time_h
-
#include "common/scummsys.h"
#include "common/system.h"
-#include "sys/time.h"
-#include "time.h"
+#include "common/str.h"
+#include "common/translation.h"
#include "backends/events/webossdl/webossdl-events.h"
#include "gui/message.h"
+#include "engines/engine.h"
-// Inidicates if gesture area is pressed down or not.
-static bool gestureDown = false;
-
-// The timestamp when screen was pressed down.
-static int screenDownTime = 0;
-
-// The timestamp when a possible drag operation was triggered.
-static int dragStartTime = 0;
-
-// The index of the motion pointer.
-static int motionPtrIndex = -1;
-
-// The maximum horizontal motion during dragging (For tap recognition).
-static int dragDiffX = 0;
-
-// The maximum vertical motion during dragging (For tap recognition).
-static int dragDiffY = 0;
-
-// Indicates if we are in drag mode.
-static bool dragging = false;
-
-// The current mouse position on the screen.
-static int curX = 0, curY = 0;
-
-// The time (seconds after 1/1/1970) when program started.
-static time_t programStartTime = time(0);
-
-/**
- * Returns the number of passed milliseconds since program start.
- *
- * @return The number of passed milliseconds.
- */
-static time_t getMillis()
-{
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return (time(0) - programStartTime) * 1000 + tv.tv_usec / 1000;
-}
+// PDL.h provided by the official Palm WebOS PDK.
+#include <PDL.h>
/**
* WebOS devices only have a Shift key and a CTRL key. There is also an Alt
@@ -91,7 +53,7 @@ void WebOSSdlEventSource::SDLModToOSystemKeyFlags(SDLMod mod,
event.kbd.flags |= Common::KBD_CTRL;
// Holding down the gesture area emulates the ALT key
- if (gestureDown)
+ if (_gestureDown)
event.kbd.flags |= Common::KBD_ALT;
}
@@ -106,7 +68,7 @@ void WebOSSdlEventSource::SDLModToOSystemKeyFlags(SDLMod mod,
bool WebOSSdlEventSource::handleKeyDown(SDL_Event &ev, Common::Event &event) {
// Handle gesture area tap.
if (ev.key.keysym.sym == SDLK_WORLD_71) {
- gestureDown = true;
+ _gestureDown = true;
return true;
}
@@ -115,7 +77,18 @@ bool WebOSSdlEventSource::handleKeyDown(SDL_Event &ev, Common::Event &event) {
// gesture tap AFTER the backward gesture event and not BEFORE (Like
// WebOS 2).
if (ev.key.keysym.sym == 27 || ev.key.keysym.sym == 229) {
- gestureDown = false;
+ _gestureDown = false;
+ }
+
+ // handle virtual keyboard dismiss key
+ if (ev.key.keysym.sym == 24) {
+ int gblPDKVersion = PDL_GetPDKVersion();
+ // check for correct PDK Version, as this determines whether an
+ // OS-supplied virtual keyboard is available on this device.
+ if (gblPDKVersion >= 300) {
+ PDL_SetKeyboardState(PDL_FALSE);
+ return true;
+ }
}
// Call original SDL key handler.
@@ -133,10 +106,21 @@ bool WebOSSdlEventSource::handleKeyDown(SDL_Event &ev, Common::Event &event) {
bool WebOSSdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) {
// Handle gesture area tap.
if (ev.key.keysym.sym == SDLK_WORLD_71) {
- gestureDown = false;
+ _gestureDown = false;
return true;
}
+ // handle virtual keyboard dismiss key
+ if (ev.key.keysym.sym == 24) {
+ int gblPDKVersion = PDL_GetPDKVersion();
+ // check for correct PDK Version, as this determines whether an
+ // OS-supplied virtual keyboard is available on this device.
+ if (gblPDKVersion >= 300) {
+ PDL_SetKeyboardState(PDL_FALSE);
+ return true;
+ }
+ }
+
// Call original SDL key handler.
return SdlEventSource::handleKeyUp(ev, event);
}
@@ -148,19 +132,45 @@ bool WebOSSdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) {
* @param event The ScummVM event.
* @return True if event was processed, false if not.
*/
-bool WebOSSdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
- if (motionPtrIndex == -1) {
- motionPtrIndex = ev.button.which;
- dragDiffX = 0;
- dragDiffY = 0;
- screenDownTime = getMillis();
-
- // Start dragging when pressing the screen shortly after a tap.
- if (getMillis() - dragStartTime < 250) {
- dragging = true;
+bool WebOSSdlEventSource::handleMouseButtonDown(SDL_Event &ev,
+ Common::Event &event) {
+ _dragDiffX[ev.button.which] = 0;
+ _dragDiffY[ev.button.which] = 0;
+ _fingerDown[ev.button.which] = true;
+ _screenDownTime[ev.button.which] = g_system->getMillis();
+
+ if (ev.button.which == 0) {
+ // Do a click when the finger lifts unless we leave the range
+ _doClick = true;
+ // Queue up dragging if auto-drag mode is on
+ if (_autoDragMode)
+ _queuedDragTime = g_system->getMillis() + QUEUED_DRAG_DELAY;
+ // Turn drag mode on instantly for a double-tap
+ else if (g_system->getMillis() - _dragStartTime < DOUBLETAP_LIMIT) {
+ _dragging = true;
event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, _curX, _curY);
}
+ // If we're not in touchpad mode, move the cursor to the tap
+ if (!_touchpadMode) {
+ _curX = MIN(_screenX, MAX(0, 0 + ev.motion.x));
+ _curY = MIN(_screenY, MAX(0, 0 + ev.motion.y));
+ // If we're already clicking, hold it until after the move.
+ if (event.type == Common::EVENT_LBUTTONDOWN) {
+ processMouseEvent(event, _curX, _curY);
+ g_system->getEventManager()->pushEvent(event);
+ }
+ // Move the mouse
+ event.type = Common::EVENT_MOUSEMOVE;
+ processMouseEvent(event, _curX, _curY);
+ }
+ // Watch for a double-tap-triggered drag
+ _dragStartTime = g_system->getMillis();
+ } else if (ev.button.which == 1) {
+ // Kill any queued drag event if a second finger goes down
+ if (_queuedDragTime > 0)
+ _queuedDragTime = 0;
+ _doClick = false;
}
return true;
}
@@ -172,54 +182,48 @@ bool WebOSSdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &ev
* @param event The ScummVM event.
* @return True if event was processed, false if not.
*/
-bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
- if (motionPtrIndex == ev.button.which) {
- motionPtrIndex = -1;
-
- // When drag mode was active then simply send a mouse up event
- if (dragging)
- {
+bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev,
+ Common::Event &event) {
+ // Only react if the finger hasn't been virtually lifted already
+ if (_fingerDown[ev.button.which]) {
+ // No matter what, if it's the first finger that's lifted when
+ // we're dragging, just lift the mouse button.
+ if (ev.button.which == 0 && _dragging) {
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, curX, curY);
- dragging = false;
- return true;
- }
-
- // When mouse was moved 5 pixels or less then emulate a mouse button
- // click.
- if (ABS(dragDiffX) < 6 && ABS(dragDiffY) < 6)
- {
- int duration = getMillis() - screenDownTime;
-
- // When screen was pressed for less than 500ms then emulate a
- // left mouse click.
- if (duration < 500) {
+ processMouseEvent(event, _curX, _curY);
+ _dragging = false;
+ } else {
+ // If it was the first finger and the click hasn't been
+ // canceled, it's a click.
+ if (ev.button.which == 0 && _doClick &&
+ !_fingerDown[1] && !_fingerDown[2]) {
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, _curX, _curY);
g_system->getEventManager()->pushEvent(event);
event.type = Common::EVENT_LBUTTONDOWN;
- dragStartTime = getMillis();
- }
-
- // When screen was pressed for less than 1000ms then emulate a
- // right mouse click.
- else if (duration < 1000) {
- event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, curX, curY);
- g_system->getEventManager()->pushEvent(event);
+ if (_queuedDragTime > 0)
+ _queuedDragTime = 0;
+ } else if (ev.button.which == 1 &&
+ _fingerDown[0] && _fingerDown[1] && !_fingerDown[2]) {
+ // If the first finger's down and the second taps, it's a
+ // right mouse click.
event.type = Common::EVENT_RBUTTONDOWN;
- }
-
- // When screen was pressed for more than 1000ms then emulate a
- // middle mouse click.
- else {
+ processMouseEvent(event, _curX, _curY);
+ _queuedRUpTime = g_system->getMillis() + QUEUED_RUP_DELAY;
+ } else if (ev.button.which == 2 &&
+ _fingerDown[0] && _fingerDown[1]) {
+ // If two fingers are down and a third taps, it's a middle
+ // click -- but lift the second finger so it doesn't register
+ // as a right click.
event.type = Common::EVENT_MBUTTONUP;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, _curX, _curY);
g_system->getEventManager()->pushEvent(event);
event.type = Common::EVENT_MBUTTONDOWN;
+ _fingerDown[1] = false;
}
-
}
+ // Officially lift the finger that was raised.
+ _fingerDown[ev.button.which] = false;
}
return true;
}
@@ -231,18 +235,200 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even
* @param event The ScummVM event.
* @return True if event was processed, false if not.
*/
-bool WebOSSdlEventSource::handleMouseMotion(SDL_Event &ev, Common::Event &event) {
- if (ev.motion.which == motionPtrIndex) {
- int screenX = g_system->getWidth();
- int screenY = g_system->getHeight();
- curX = MIN(screenX, MAX(0, curX + ev.motion.xrel));
- curY = MIN(screenY, MAX(0, curY + ev.motion.yrel));
- dragDiffX += ev.motion.xrel;
- dragDiffY += ev.motion.yrel;
- event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, curX, curY);
+bool WebOSSdlEventSource::handleMouseMotion(SDL_Event &ev,
+ Common::Event &event) {
+ if (_fingerDown[ev.motion.which]) {
+ _dragDiffX[ev.motion.which] += ev.motion.xrel;
+ _dragDiffY[ev.motion.which] += ev.motion.yrel;
+
+ switch (ev.motion.which) {
+ case 0:
+ // If our dragDiff goes too many pixels in either direction,
+ // kill the future click and any queued drag event.
+ if (_doClick && (ABS(_dragDiffX[0]) > MOUSE_DEADZONE_PIXELS ||
+ ABS(_dragDiffY[0]) > MOUSE_DEADZONE_PIXELS)) {
+ _doClick = false;
+ if (_queuedDragTime > 0)
+ _queuedDragTime = 0;
+ }
+ // If only one finger is on the screen and moving, that's
+ // the mouse pointer.
+ if (!_fingerDown[1] && !_fingerDown[2]) {
+ if (_touchpadMode) {
+ _curX = MIN(_screenX, MAX(0, _curX + ev.motion.xrel));
+ _curY = MIN(_screenY, MAX(0, _curY + ev.motion.yrel));
+ } else {
+ _curX = MIN(_screenX, MAX(0, 0 + ev.motion.x));
+ _curY = MIN(_screenY, MAX(0, 0 + ev.motion.y));
+ }
+ event.type = Common::EVENT_MOUSEMOVE;
+ processMouseEvent(event, _curX, _curY);
+ }
+ break;
+ case 1:
+ // Check for a two-finger swipe
+ if (_fingerDown[0] && !_fingerDown[2]) {
+ // Check for a vertical swipe
+ if (ABS(_dragDiffY[0]) > _swipeDistY &&
+ ABS(_dragDiffY[1]) > _swipeDistY) {
+ // Virtually lift fingers to prevent repeat triggers
+ _fingerDown[0] = _fingerDown[1] = false;
+ if (_dragDiffY[0] < 0 && _dragDiffY[1] < 0) {
+ // A swipe up triggers the keyboard, if it exists. We
+ // test for existance of a virtual OS keyboard by
+ // checking for the version of the linked PDK libs.
+ int gblPDKVersion = PDL_GetPDKVersion();
+ if (gblPDKVersion >= 300)
+ PDL_SetKeyboardState(PDL_TRUE);
+ } else if (_dragDiffY[0] > 0 && _dragDiffY[1] > 0) {
+ // A swipe down triggers the menu
+ if (g_engine && !g_engine->isPaused())
+ g_engine->openMainMenuDialog();
+ }
+ return true;
+ }
+ // Check for a horizontal swipe
+ if (ABS(_dragDiffX[0]) > _swipeDistX &&
+ ABS(_dragDiffX[1]) > _swipeDistX) {
+ // Virtually lift fingers to prevent repeat triggers
+ _fingerDown[0] = _fingerDown[1] = false;
+ if (_dragDiffX[0] < 0 && _dragDiffX[1] < 0) {
+ // A swipe left presses escape
+ event.type = Common::EVENT_KEYDOWN;
+ event.kbd.flags = 0;
+ event.kbd.keycode = Common::KEYCODE_ESCAPE;
+ event.kbd.ascii = Common::ASCII_ESCAPE;
+ _queuedEscapeUpTime = g_system->getMillis() +
+ QUEUED_KEY_DELAY;
+ } else if (_dragDiffX[0] > 0 && _dragDiffX[1] > 0) {
+ // A swipe right toggles touchpad mode
+ _touchpadMode = !_touchpadMode;
+ g_system->showMouse(_touchpadMode);
+ // I18N: Touchpad mode toggle status.
+ Common::String dialogMsg(_("Touchpad mode is now"));
+ dialogMsg += " ";
+ // I18N: Touchpad mode on or off.
+ dialogMsg += (_touchpadMode ? _("ON") : _("OFF"));
+ dialogMsg += ".\n";
+ // I18N: Instructions to toggle Touchpad mode.
+ dialogMsg +=
+ _("Swipe two fingers to the right to toggle.");
+ GUI::TimedMessageDialog dialog(dialogMsg, 1500);
+ dialog.runModal();
+ }
+ return true;
+ }
+ }
+ break;
+ case 2:
+ // Check for a three-finger swipe
+ if (_fingerDown[0] && _fingerDown[1]) {
+ // Swipe to the right toggles Auto-drag
+ if (_dragDiffX[0] > _swipeDistX &&
+ _dragDiffX[1] > _swipeDistX &&
+ _dragDiffX[2] > _swipeDistX) {
+ // Virtually lift fingers to prevent repeat triggers
+ _fingerDown[0] = _fingerDown[1] = _fingerDown[2] = false;
+ // Toggle Auto-drag mode
+ _autoDragMode = !_autoDragMode;
+ // I18N: Auto-drag toggle status.
+ Common::String dialogMsg(_("Auto-drag mode is now"));
+ dialogMsg += " ";
+ // I18N: Auto-drag on or off.
+ dialogMsg += (_autoDragMode ? _("ON") : _("OFF"));
+ dialogMsg += ".\n";
+ // I18N: Instructions to toggle auto-drag.
+ dialogMsg += _(
+ "Swipe three fingers to the right to toggle.");
+ GUI::TimedMessageDialog dialog(dialogMsg, 1500);
+ dialog.runModal();
+ return true;
+ } else if (_dragDiffY[0] > _swipeDistY &&
+ _dragDiffY[1] > _swipeDistY &&
+ _dragDiffY[2] > _swipeDistY ) {
+ // Swipe down to emulate spacebar (pause)
+ // Virtually lift fingers to prevent repeat triggers
+ _fingerDown[0] = _fingerDown[1] = _fingerDown[2] = false;
+ // Press space
+ event.type = Common::EVENT_KEYDOWN;
+ event.kbd.flags = 0;
+ event.kbd.keycode = Common::KEYCODE_SPACE;
+ event.kbd.ascii = Common::ASCII_SPACE;
+ _queuedSpaceUpTime = g_system->getMillis() +
+ QUEUED_KEY_DELAY;
+ }
+ }
+ }
}
return true;
}
+/**
+ * Before calling the original SDL implementation, this method loads in
+ * queued events.
+ *
+ * @param event The ScummVM event
+ */
+bool WebOSSdlEventSource::pollEvent(Common::Event &event) {
+ uint32 curTime = g_system->getMillis();
+
+ // Event-dependent nitializations for when SDL runs its first poll.
+ if (_firstPoll) {
+ // Set the initial dimensions
+ calculateDimensions();
+
+ // Having a mouse pointer on screen when not in Touchpad mode is poor
+ // interface design, because the user won't know whether to tap buttons
+ // or drag the pointer to them. On the first poll, set the appropriate
+ // pointer visibility.
+ g_system->showMouse(_touchpadMode);
+ _firstPoll = false;
+ }
+
+ // Run down the priority list for queued events. The built-in
+ // event queue runs events on the next poll, which causes many
+ // WebOS devices (and a few game engines) to ignore certain inputs.
+ // Allowing keys and clicks to stay "down" longer is enough to register
+ // the press.
+ if (_queuedEscapeUpTime != 0 && curTime >= _queuedEscapeUpTime) {
+ event.type = Common::EVENT_KEYUP;
+ event.kbd.flags = 0;
+ event.kbd.keycode = Common::KEYCODE_ESCAPE;
+ event.kbd.ascii = Common::ASCII_ESCAPE;
+ _queuedEscapeUpTime = 0;
+ return true;
+ } else if (_queuedSpaceUpTime != 0 && curTime >= _queuedSpaceUpTime) {
+ event.type = Common::EVENT_KEYUP;
+ event.kbd.flags = 0;
+ event.kbd.keycode = Common::KEYCODE_SPACE;
+ event.kbd.ascii = Common::ASCII_SPACE;
+ _queuedSpaceUpTime = 0;
+ return true;
+ } else if (_queuedRUpTime != 0 && curTime >= _queuedRUpTime) {
+ event.type = Common::EVENT_RBUTTONUP;
+ processMouseEvent(event, _curX, _curY);
+ _queuedRUpTime = 0;
+ return true;
+ } else if (_queuedDragTime != 0 && curTime >= _queuedDragTime) {
+ event.type = Common::EVENT_LBUTTONDOWN;
+ _dragging = true;
+ processMouseEvent(event, _curX, _curY);
+ _queuedDragTime = 0;
+ return true;
+ }
+
+ return SdlEventSource::pollEvent(event);
+}
+
+/**
+ * Sets the _screenX and _screenY variables to the effective screen dimensions,
+ * and alters _swipeDistX and _swipeDistY to the correct relative values.
+ */
+void WebOSSdlEventSource::calculateDimensions() {
+ _screenX = g_system->getOverlayWidth();
+ _screenY = g_system->getOverlayHeight();
+ _swipeDistX = _screenX * SWIPE_PERCENT_HORIZ / 100;
+ _swipeDistY = _screenY * SWIPE_PERCENT_VERT / 100;
+}
+
#endif
diff --git a/backends/events/webossdl/webossdl-events.h b/backends/events/webossdl/webossdl-events.h
index c925132d92..a36ee535a3 100644
--- a/backends/events/webossdl/webossdl-events.h
+++ b/backends/events/webossdl/webossdl-events.h
@@ -29,13 +29,87 @@
* SDL events manager for WebOS
*/
class WebOSSdlEventSource : public SdlEventSource {
+public:
+ enum {
+ DOUBLETAP_LIMIT = 400,
+ MAX_FINGERS = 3,
+ MOUSE_DEADZONE_PIXELS = 5,
+ QUEUED_DRAG_DELAY = 500,
+ QUEUED_KEY_DELAY = 250,
+ QUEUED_RUP_DELAY = 50,
+ SWIPE_PERCENT_HORIZ = 15,
+ SWIPE_PERCENT_VERT = 20
+ };
+ WebOSSdlEventSource() :
+ _gestureDown(false),
+ _dragStartTime(0), _dragging(false),
+ _curX(0), _curY(0),
+ _screenX(0), _screenY(0),
+ _touchpadMode(false), _autoDragMode(true),
+ _doClick(true),
+ _queuedDragTime(0), _queuedEscapeUpTime(0), _queuedSpaceUpTime(0),
+ _queuedRUpTime(0),
+ _firstPoll(true) {
+ for (int i = 0; i < MAX_FINGERS; i++) {
+ _fingerDown[i] = false;
+ _screenDownTime[i] = _dragDiffX[i] = _dragDiffY[i] = 0;
+ }
+ };
protected:
+ // Inidicates if gesture area is pressed down or not.
+ bool _gestureDown;
+
+ // The timestamp when screen was pressed down for each finger.
+ uint32 _screenDownTime[MAX_FINGERS];
+
+ // The timestamp when a possible drag operation was triggered.
+ uint32 _dragStartTime;
+
+ // The distance each finger traveled from touch to release.
+ int _dragDiffX[MAX_FINGERS], _dragDiffY[MAX_FINGERS];
+
+ // Indicates if we are in drag mode.
+ bool _dragging;
+
+ // The current mouse position on the screen.
+ int _curX, _curY;
+
+ // The current screen dimensions
+ int _screenX, _screenY;
+
+ // The drag distance for linear gestures
+ int _swipeDistX, _swipeDistY;
+
+ // Indicates if we're in touchpad mode or tap-to-move mode.
+ bool _touchpadMode;
+
+ // Indicates if we're in automatic drag mode.
+ bool _autoDragMode;
+
+ // Tracks which fingers are currently touching the screen.
+ bool _fingerDown[MAX_FINGERS];
+
+ // Indicates if a click should be executed when the first finger is lifted
+ bool _doClick;
+
+ // Indicates whether the event poll has been run before
+ bool _firstPoll;
+
+ // Event queues
+ uint32 _queuedDragTime, _queuedEscapeUpTime, _queuedSpaceUpTime,
+ _queuedRUpTime;
+
+ // SDL overrides
virtual void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event);
virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event);
virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event);
virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event);
virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event);
virtual bool handleMouseMotion(SDL_Event &ev, Common::Event &event);
+ virtual bool pollEvent(Common::Event &event);
+
+ // Utility functions
+ void calculateDimensions();
};
#endif
diff --git a/backends/events/wincesdl/wincesdl-events.cpp b/backends/events/wincesdl/wincesdl-events.cpp
index 4fab47a58e..e73a4e66dd 100644
--- a/backends/events/wincesdl/wincesdl-events.cpp
+++ b/backends/events/wincesdl/wincesdl-events.cpp
@@ -43,7 +43,7 @@ void WINCESdlEventSource::init(WINCESdlGraphicsManager *graphicsMan) {
_graphicsMan = graphicsMan;
}
-void WINCESdlEventSource::fillMouseEvent(Common::Event &event, int x, int y) {
+void WINCESdlEventSource::processMouseEvent(Common::Event &event, int x, int y) {
event.mouse.x = x;
event.mouse.y = y;
@@ -153,7 +153,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
case SDL_MOUSEMOTION:
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, ev.motion.x, ev.motion.y);
+ processMouseEvent(event, ev.motion.x, ev.motion.y);
_graphicsMan->setMousePos(event.mouse.x, event.mouse.y);
return true;
@@ -165,7 +165,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
event.type = Common::EVENT_RBUTTONDOWN;
else
break;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
if (event.mouse.x > _tapX)
@@ -183,7 +183,8 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
if (_tapTime) { // second tap
if (_closeClick && (GetTickCount() - _tapTime < 1000)) {
if (event.mouse.y <= 20 &&
- _graphicsMan->_panelInitialized) {
+ _graphicsMan->_panelInitialized &&
+ !_graphicsMan->_noDoubleTapPT) {
// top of screen (show panel)
_graphicsMan->swap_panel_visibility();
} else if (!_graphicsMan->_noDoubleTapRMB) {
@@ -240,7 +241,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
_rbutton = false;
}
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
if (freeLookActive && !_closeClick) {
_tapX = event.mouse.x;
@@ -260,8 +261,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
return true;
case SDL_VIDEOEXPOSE:
- // HACK: Send a fake event, handled by SdlGraphicsManager
- event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose;
+ _graphicsMan->notifyVideoExpose();
break;
case SDL_QUIT:
@@ -278,9 +278,8 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
if (ev.active.state & SDL_APPINPUTFOCUS) {
_graphicsMan->_hasfocus = ev.active.gain;
SDL_PauseAudio(!_graphicsMan->_hasfocus);
- if (_graphicsMan->_hasfocus) {
- event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose;
- }
+ if (_graphicsMan->_hasfocus)
+ _graphicsMan->notifyVideoExpose();
}
break;
}
diff --git a/backends/events/wincesdl/wincesdl-events.h b/backends/events/wincesdl/wincesdl-events.h
index deeee6196c..5eff630c2a 100644
--- a/backends/events/wincesdl/wincesdl-events.h
+++ b/backends/events/wincesdl/wincesdl-events.h
@@ -43,7 +43,7 @@ public:
// Overloaded from SDL backend (toolbar handling)
bool pollEvent(Common::Event &event);
// Overloaded from SDL backend (mouse and new scaler handling)
- void fillMouseEvent(Common::Event &event, int x, int y);
+ void processMouseEvent(Common::Event &event, int x, int y);
protected:
diff --git a/backends/fs/ds/ds-fs-factory.cpp b/backends/fs/ds/ds-fs-factory.cpp
index 3fd97d07eb..4e09c3446b 100644
--- a/backends/fs/ds/ds-fs-factory.cpp
+++ b/backends/fs/ds/ds-fs-factory.cpp
@@ -27,7 +27,9 @@
#include "backends/fs/ds/ds-fs.h"
#include "dsmain.h" //for the isGBAMPAvailable() function
+namespace Common {
DECLARE_SINGLETON(DSFilesystemFactory);
+}
AbstractFSNode *DSFilesystemFactory::makeRootFileNode() const {
if (DS::isGBAMPAvailable()) {
diff --git a/backends/fs/n64/n64-fs-factory.cpp b/backends/fs/n64/n64-fs-factory.cpp
index 7cabbf4f7a..5c588c5eb5 100644
--- a/backends/fs/n64/n64-fs-factory.cpp
+++ b/backends/fs/n64/n64-fs-factory.cpp
@@ -42,4 +42,3 @@ AbstractFSNode *N64FilesystemFactory::makeFileNodePath(const Common::String &pat
}
#endif
-
diff --git a/backends/fs/n64/n64-fs.cpp b/backends/fs/n64/n64-fs.cpp
index e712c198a9..fe37dad467 100644
--- a/backends/fs/n64/n64-fs.cpp
+++ b/backends/fs/n64/n64-fs.cpp
@@ -161,4 +161,3 @@ Common::WriteStream *N64FilesystemNode::createWriteStream() {
}
#endif //#ifdef __N64__
-
diff --git a/backends/fs/n64/romfsstream.cpp b/backends/fs/n64/romfsstream.cpp
index c833a228f5..570f25932d 100644
--- a/backends/fs/n64/romfsstream.cpp
+++ b/backends/fs/n64/romfsstream.cpp
@@ -83,4 +83,3 @@ RomfsStream *RomfsStream::makeFromPath(const Common::String &path, bool writeMod
}
#endif /* __N64__ */
-
diff --git a/backends/fs/posix/posix-fs-factory.cpp b/backends/fs/posix/posix-fs-factory.cpp
index 829355be84..776ea86155 100644
--- a/backends/fs/posix/posix-fs-factory.cpp
+++ b/backends/fs/posix/posix-fs-factory.cpp
@@ -19,7 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#if defined(POSIX)
+#if defined(POSIX) || defined(PLAYSTATION3)
// Re-enable some forbidden symbols to avoid clashes with stat.h and unistd.h.
// Also with clock() in sys/time.h in some Mac OS X SDKs.
diff --git a/backends/fs/posix/posix-fs-factory.h b/backends/fs/posix/posix-fs-factory.h
index a7075db94c..c7cec6fab5 100644
--- a/backends/fs/posix/posix-fs-factory.h
+++ b/backends/fs/posix/posix-fs-factory.h
@@ -30,6 +30,7 @@
* Parts of this class are documented in the base interface class, FilesystemFactory.
*/
class POSIXFilesystemFactory : public FilesystemFactory {
+protected:
virtual AbstractFSNode *makeRootFileNode() const;
virtual AbstractFSNode *makeCurrentDirectoryFileNode() const;
virtual AbstractFSNode *makeFileNodePath(const Common::String &path) const;
diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp
index 0b94c37b16..320c5a6f39 100644
--- a/backends/fs/posix/posix-fs.cpp
+++ b/backends/fs/posix/posix-fs.cpp
@@ -19,7 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#if defined(POSIX)
+#if defined(POSIX) || defined(PLAYSTATION3)
// Re-enable some forbidden symbols to avoid clashes with stat.h and unistd.h.
// Also with clock() in sys/time.h in some Mac OS X SDKs.
diff --git a/backends/fs/ps2/ps2-fs-factory.cpp b/backends/fs/ps2/ps2-fs-factory.cpp
index cad92b5dec..ef7b2013a3 100644
--- a/backends/fs/ps2/ps2-fs-factory.cpp
+++ b/backends/fs/ps2/ps2-fs-factory.cpp
@@ -27,7 +27,9 @@
#include "backends/fs/ps2/ps2-fs-factory.h"
#include "backends/fs/ps2/ps2-fs.h"
+namespace Common {
DECLARE_SINGLETON(Ps2FilesystemFactory);
+}
AbstractFSNode *Ps2FilesystemFactory::makeRootFileNode() const {
return new Ps2FilesystemNode();
diff --git a/backends/fs/ps3/ps3-fs-factory.cpp b/backends/fs/ps3/ps3-fs-factory.cpp
new file mode 100644
index 0000000000..3257246c50
--- /dev/null
+++ b/backends/fs/ps3/ps3-fs-factory.cpp
@@ -0,0 +1,26 @@
+/* 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.
+ */
+
+#include "backends/fs/ps3/ps3-fs-factory.h"
+
+AbstractFSNode *PS3FilesystemFactory::makeCurrentDirectoryFileNode() const {
+ return makeRootFileNode();
+}
diff --git a/backends/fs/ps3/ps3-fs-factory.h b/backends/fs/ps3/ps3-fs-factory.h
new file mode 100644
index 0000000000..6c1988b1c9
--- /dev/null
+++ b/backends/fs/ps3/ps3-fs-factory.h
@@ -0,0 +1,36 @@
+/* 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 PS3_FILESYSTEM_FACTORY_H
+#define PS3_FILESYSTEM_FACTORY_H
+
+#include "backends/fs/posix/posix-fs-factory.h"
+
+/**
+ * Creates PS3FilesystemFactory objects.
+ *
+ * Parts of this class are documented in the base interface class, FilesystemFactory.
+ */
+class PS3FilesystemFactory : public POSIXFilesystemFactory {
+ virtual AbstractFSNode *makeCurrentDirectoryFileNode() const;
+};
+
+#endif /*PS3_FILESYSTEM_FACTORY_H*/
diff --git a/backends/fs/psp/psp-fs-factory.cpp b/backends/fs/psp/psp-fs-factory.cpp
index ef1df246ba..bb3aca8ee6 100644
--- a/backends/fs/psp/psp-fs-factory.cpp
+++ b/backends/fs/psp/psp-fs-factory.cpp
@@ -43,7 +43,9 @@
#include <unistd.h>
+namespace Common {
DECLARE_SINGLETON(PSPFilesystemFactory);
+}
AbstractFSNode *PSPFilesystemFactory::makeRootFileNode() const {
return new PSPFilesystemNode();
diff --git a/backends/fs/stdiostream.cpp b/backends/fs/stdiostream.cpp
index 7342df0029..3ea0f9898b 100644
--- a/backends/fs/stdiostream.cpp
+++ b/backends/fs/stdiostream.cpp
@@ -20,6 +20,8 @@
*
*/
+#if !defined(DISABLE_STDIO_FILESTREAM)
+
// Disable symbol overrides so that we can use FILE, fopen etc.
#define FORBIDDEN_SYMBOL_ALLOW_ALL
@@ -100,3 +102,5 @@ StdioStream *StdioStream::makeFromPath(const Common::String &path, bool writeMod
return new StdioStream(handle);
return 0;
}
+
+#endif
diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp
index fd74c8ca46..9f70e7a7c9 100644
--- a/backends/fs/symbian/symbian-fs.cpp
+++ b/backends/fs/symbian/symbian-fs.cpp
@@ -231,5 +231,3 @@ Common::WriteStream *SymbianFilesystemNode::createWriteStream() {
return SymbianStdioStream::makeFromPath(getPath(), true);
}
#endif //#if defined (__SYMBIAN32__)
-
-
diff --git a/backends/fs/symbian/symbianstream.cpp b/backends/fs/symbian/symbianstream.cpp
index 352595e25a..39249578f7 100644
--- a/backends/fs/symbian/symbianstream.cpp
+++ b/backends/fs/symbian/symbianstream.cpp
@@ -268,4 +268,3 @@ SymbianStdioStream *SymbianStdioStream::makeFromPath(const Common::String &path,
return new SymbianStdioStream(handle);
return 0;
}
-
diff --git a/backends/fs/wii/wii-fs-factory.cpp b/backends/fs/wii/wii-fs-factory.cpp
index 34cde8ef46..760e5316e7 100644
--- a/backends/fs/wii/wii-fs-factory.cpp
+++ b/backends/fs/wii/wii-fs-factory.cpp
@@ -40,7 +40,9 @@
#include <smb.h>
#endif
+namespace Common {
DECLARE_SINGLETON(WiiFilesystemFactory);
+}
WiiFilesystemFactory::WiiFilesystemFactory() :
_dvdMounted(false),
@@ -216,4 +218,3 @@ void WiiFilesystemFactory::umountUnused(const String &path) {
}
#endif
-
diff --git a/backends/fs/wii/wii-fs-factory.h b/backends/fs/wii/wii-fs-factory.h
index 42795ebf33..913c0a3b64 100644
--- a/backends/fs/wii/wii-fs-factory.h
+++ b/backends/fs/wii/wii-fs-factory.h
@@ -85,4 +85,3 @@ private:
};
#endif /*Wii_FILESYSTEM_FACTORY_H*/
-
diff --git a/backends/fs/wii/wii-fs.cpp b/backends/fs/wii/wii-fs.cpp
index eb631df1bf..4a19e18240 100644
--- a/backends/fs/wii/wii-fs.cpp
+++ b/backends/fs/wii/wii-fs.cpp
@@ -202,4 +202,3 @@ Common::WriteStream *WiiFilesystemNode::createWriteStream() {
}
#endif //#if defined(__WII__)
-
diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp
index 9e864753c9..c32ad2da94 100644
--- a/backends/fs/windows/windows-fs.cpp
+++ b/backends/fs/windows/windows-fs.cpp
@@ -54,7 +54,7 @@ bool WindowsFilesystemNode::isWritable() const {
return _access(_path.c_str(), W_OK) == 0;
}
-void WindowsFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data) {
+void WindowsFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, bool hidden, WIN32_FIND_DATA* find_data) {
WindowsFilesystemNode entry;
char *asciiName = toAscii(find_data->cFileName);
bool isDirectory;
@@ -63,6 +63,10 @@ void WindowsFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const c
if (!strcmp(asciiName, ".") || !strcmp(asciiName, ".."))
return;
+ // Skip hidden files if asked
+ if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) && !hidden)
+ return;
+
isDirectory = (find_data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? true : false);
if ((!isDirectory && mode == Common::FSNode::kListDirectoriesOnly) ||
@@ -163,8 +167,6 @@ AbstractFSNode *WindowsFilesystemNode::getChild(const Common::String &n) const {
bool WindowsFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, bool hidden) const {
assert(_isDirectory);
- //TODO: honor the hidden flag
-
if (_isPseudoRoot) {
#ifndef _WIN32_WCE
// Drives enumeration
@@ -200,10 +202,10 @@ bool WindowsFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b
if (handle == INVALID_HANDLE_VALUE)
return false;
- addFile(myList, mode, _path.c_str(), &desc);
+ addFile(myList, mode, _path.c_str(), hidden, &desc);
while (FindNextFile(handle, &desc))
- addFile(myList, mode, _path.c_str(), &desc);
+ addFile(myList, mode, _path.c_str(), hidden, &desc);
FindClose(handle);
}
diff --git a/backends/fs/windows/windows-fs.h b/backends/fs/windows/windows-fs.h
index 37d1e9099b..351307bef0 100644
--- a/backends/fs/windows/windows-fs.h
+++ b/backends/fs/windows/windows-fs.h
@@ -93,12 +93,13 @@ private:
* Adds a single WindowsFilesystemNode to a given list.
* This method is used by getChildren() to populate the directory entries list.
*
- * @param list List to put the file entry node in.
- * @param mode Mode to use while adding the file entry to the list.
- * @param base Common::String with the directory being listed.
- * @param find_data Describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find.
+ * @param list List to put the file entry node in.
+ * @param mode Mode to use while adding the file entry to the list.
+ * @param base Common::String with the directory being listed.
+ * @param hidden true if hidden files should be added, false otherwise
+ * @param find_data Describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find.
*/
- static void addFile(AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data);
+ static void addFile(AbstractFSList &list, ListMode mode, const char *base, bool hidden, WIN32_FIND_DATA* find_data);
/**
* Converts a Unicode string to Ascii format.
diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
index 8075d0d45b..17a95688f3 100644
--- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
+++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
@@ -122,7 +122,7 @@ void DINGUXSdlGraphicsManager::initSize(uint w, uint h) {
if (w > 320 || h > 240) {
setGraphicsMode(GFX_HALF);
setGraphicsModeIntern();
- _sdlEventSource->toggleMouseGrab();
+ _eventSource->toggleMouseGrab();
}
_transactionDetails.sizeChanged = true;
@@ -427,6 +427,7 @@ void DINGUXSdlGraphicsManager::hideOverlay() {
}
bool DINGUXSdlGraphicsManager::loadGFXMode() {
+ debug("Game ScreenMode = %d*%d", _videoMode.screenWidth, _videoMode.screenHeight);
// Forcefully disable aspect ratio correction for games
// which starts with a native 240px height resolution.
@@ -435,7 +436,6 @@ bool DINGUXSdlGraphicsManager::loadGFXMode() {
_videoMode.aspectRatioCorrection = false;
}
- debug("Game ScreenMode = %d*%d", _videoMode.screenWidth, _videoMode.screenHeight);
if (_videoMode.screenWidth > 320 || _videoMode.screenHeight > 240) {
_videoMode.aspectRatioCorrection = false;
setGraphicsMode(GFX_HALF);
@@ -473,9 +473,13 @@ bool DINGUXSdlGraphicsManager::hasFeature(OSystem::Feature f) {
void DINGUXSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
switch (f) {
- case OSystem::kFeatureAspectRatioCorrection:
+ case OSystem::kFeatureAspectRatioCorrection:
setAspectRatioCorrection(enable);
break;
+ case OSystem::kFeatureCursorPalette:
+ _cursorPaletteDisabled = !enable;
+ blitCursor();
+ break;
default:
break;
}
@@ -485,8 +489,10 @@ bool DINGUXSdlGraphicsManager::getFeatureState(OSystem::Feature f) {
assert(_transactionMode == kTransactionNone);
switch (f) {
- case OSystem::kFeatureAspectRatioCorrection:
- return _videoMode.aspectRatioCorrection;
+ case OSystem::kFeatureAspectRatioCorrection:
+ return _videoMode.aspectRatioCorrection;
+ case OSystem::kFeatureCursorPalette:
+ return !_cursorPaletteDisabled;
default:
return false;
}
@@ -510,21 +516,16 @@ void DINGUXSdlGraphicsManager::warpMouse(int x, int y) {
SurfaceSdlGraphicsManager::warpMouse(x, y);
}
-void DINGUXSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- if (_videoMode.mode == GFX_HALF) {
- newEvent.mouse.x *= 2;
- newEvent.mouse.y *= 2;
- }
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
+void DINGUXSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ if (_videoMode.mode == GFX_HALF) {
+ point.x *= 2;
+ point.y *= 2;
}
- g_system->getEventManager()->pushEvent(newEvent);
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
}
diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
index 84a784b771..ecdd01d166 100644
--- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
+++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
@@ -57,7 +57,7 @@ public:
SurfaceSdlGraphicsManager::MousePos *getMouseCurState();
SurfaceSdlGraphicsManager::VideoState *getVideoMode();
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
};
#endif /* BACKENDS_GRAPHICS_SDL_DINGUX_H */
diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp
index 82a32203fb..a0c1d9ad2b 100644
--- a/backends/graphics/gph/gph-graphics.cpp
+++ b/backends/graphics/gph/gph-graphics.cpp
@@ -36,7 +36,7 @@ static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
};
GPHGraphicsManager::GPHGraphicsManager(SdlEventSource *sdlEventSource)
- : SurfaceSdlGraphicsManager(sdlEventSource) {
+ : SurfaceSdlGraphicsManager(sdlEventSource) {
}
const OSystem::GraphicsMode *GPHGraphicsManager::getSupportedGraphicsModes() const {
@@ -138,10 +138,10 @@ void GPHGraphicsManager::initSize(uint w, uint h, const Graphics::PixelFormat *f
_videoMode.screenWidth = w;
_videoMode.screenHeight = h;
- if (w > 320 || h > 240){
+ if (w > 320 || h > 240) {
setGraphicsMode(GFX_HALF);
setGraphicsModeIntern();
- _sdlEventSource->toggleMouseGrab();
+ _eventSource->toggleMouseGrab();
}
_videoMode.overlayWidth = 320;
@@ -161,9 +161,9 @@ void GPHGraphicsManager::drawMouse() {
int width, height;
int hotX, hotY;
- if (_videoMode.mode == GFX_HALF && !_overlayVisible){
- dst.x = _mouseCurState.x/2;
- dst.y = _mouseCurState.y/2;
+ 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;
@@ -230,9 +230,9 @@ void GPHGraphicsManager::undrawMouse() {
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);
+ 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);
}
@@ -252,8 +252,8 @@ void GPHGraphicsManager::internUpdateScreen() {
// If the shake position changed, fill the dirty area with blackness
if (_currentShakePos != _newShakePos ||
- (_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) {
- SDL_Rect blackrect = {0, 0, _videoMode.screenWidth * _videoMode.scaleFactor, _newShakePos * _videoMode.scaleFactor};
+ (_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) {
+ SDL_Rect blackrect = {0, 0, _videoMode.screenWidth *_videoMode.scaleFactor, _newShakePos *_videoMode.scaleFactor};
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
blackrect.h = real2Aspect(blackrect.h - 1) + 1;
@@ -269,8 +269,8 @@ void GPHGraphicsManager::internUpdateScreen() {
// screen surface accordingly.
if (_screen && _paletteDirtyEnd != 0) {
SDL_SetColors(_screen, _currentPalette + _paletteDirtyStart,
- _paletteDirtyStart,
- _paletteDirtyEnd - _paletteDirtyStart);
+ _paletteDirtyStart,
+ _paletteDirtyEnd - _paletteDirtyStart);
_paletteDirtyEnd = 0;
@@ -326,6 +326,9 @@ void GPHGraphicsManager::internUpdateScreen() {
_dirtyRectList[0].y = 0;
_dirtyRectList[0].w = width;
_dirtyRectList[0].h = height;
+
+ // HACK: Make sure the full hardware screen is wiped clean.
+ SDL_FillRect(_hwscreen, NULL, 0);
}
// Only draw anything if necessary
@@ -337,8 +340,8 @@ void GPHGraphicsManager::internUpdateScreen() {
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.
+ 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());
@@ -374,11 +377,11 @@ void GPHGraphicsManager::internUpdateScreen() {
assert(scalerProc != NULL);
if ((_videoMode.mode == GFX_HALF) && (scalerProc == DownscaleAllByHalf)) {
- if (dst_x%2==1){
+ if (dst_x % 2 == 1) {
dst_x--;
dst_w++;
}
- if (dst_y%2==1){
+ if (dst_y % 2 == 1) {
dst_y--;
dst_h++;
}
@@ -388,14 +391,14 @@ void GPHGraphicsManager::internUpdateScreen() {
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);
+ (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){
+ if (_videoMode.mode == GFX_HALF && scalerProc == DownscaleAllByHalf) {
r->w = r->w / 2;
r->h = dst_h / 2;
} else {
@@ -419,7 +422,7 @@ void GPHGraphicsManager::internUpdateScreen() {
// This is necessary if shaking is active.
if (_forceFull) {
_dirtyRectList[0].y = 0;
- _dirtyRectList[0].h = (_videoMode.mode == GFX_HALF) ? effectiveScreenHeight()/2 : effectiveScreenHeight();
+ _dirtyRectList[0].h = (_videoMode.mode == GFX_HALF) ? effectiveScreenHeight() / 2 : effectiveScreenHeight();
}
drawMouse();
@@ -439,7 +442,7 @@ void GPHGraphicsManager::internUpdateScreen() {
}
void GPHGraphicsManager::showOverlay() {
- if (_videoMode.mode == GFX_HALF){
+ if (_videoMode.mode == GFX_HALF) {
_mouseCurState.x = _mouseCurState.x / 2;
_mouseCurState.y = _mouseCurState.y / 2;
}
@@ -447,89 +450,41 @@ void GPHGraphicsManager::showOverlay() {
}
void GPHGraphicsManager::hideOverlay() {
- if (_videoMode.mode == GFX_HALF){
+ if (_videoMode.mode == GFX_HALF) {
_mouseCurState.x = _mouseCurState.x * 2;
_mouseCurState.y = _mouseCurState.y * 2;
}
SurfaceSdlGraphicsManager::hideOverlay();
}
+bool GPHGraphicsManager::loadGFXMode() {
-//bool GPHGraphicsManager::loadGFXMode() {
-
-
-// _videoMode.overlayWidth = 320;
-// _videoMode.overlayHeight = 240;
-// _videoMode.fullscreen = true;
-//
-// /* Forcefully disable aspect ratio correction for games
-// that start with a native 240px height resolution
-// This corrects games with non-standard resolutions
-// such as MM Nes (256x240).
-// */
-// if(_videoMode.screenHeight == 240) {
-// _videoMode.aspectRatioCorrection = false;
-// }
-
-// debug("Game ScreenMode = %d*%d", _videoMode.screenWidth, _videoMode.screenHeight);
-// if (_videoMode.screenWidth > 320 || _videoMode.screenHeight > 240) {
-// _videoMode.aspectRatioCorrection = false;
-// setGraphicsMode(GFX_HALF);
-// debug("GraphicsMode set to HALF");
-// } else {
-// setGraphicsMode(GFX_NORMAL);
-// debug("GraphicsMode set to NORMAL");
-// }
-
-
-// if ((_videoMode.mode == GFX_HALF) && !_overlayVisible) {
-// //_videoMode.overlayWidth = _videoMode.screenWidth / 2;
-// //_videoMode.overlayHeight = _videoMode.screenHeight / 2;
-// _videoMode.overlayWidth = 320;
-// _videoMode.overlayHeight = 240;
-// _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();
-// _videoMode.hardwareWidth = 320;
-// _videoMode.hardwareHeight = 240;
-//
-// }
-
-// return SurfaceSdlGraphicsManager::loadGFXMode();
-//}
+ // We don't offer anything other than fullscreen on GPH devices so let’s not even pretend.
+ _videoMode.fullscreen = true;
+
+ // Set the hardware stats to match the LCD.
+ _videoMode.hardwareWidth = 320;
+ _videoMode.hardwareHeight = 240;
+
+ if (_videoMode.screenHeight != 200)
+ _videoMode.aspectRatioCorrection = false;
-bool GPHGraphicsManager::loadGFXMode() {
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 SurfaceSdlGraphicsManager::loadGFXMode();
}
@@ -542,9 +497,13 @@ bool GPHGraphicsManager::hasFeature(OSystem::Feature f) {
void GPHGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
switch (f) {
- case OSystem::kFeatureAspectRatioCorrection:
+ case OSystem::kFeatureAspectRatioCorrection:
setAspectRatioCorrection(enable);
break;
+ case OSystem::kFeatureCursorPalette:
+ _cursorPaletteDisabled = !enable;
+ blitCursor();
+ break;
default:
break;
}
@@ -554,8 +513,10 @@ bool GPHGraphicsManager::getFeatureState(OSystem::Feature f) {
assert(_transactionMode == kTransactionNone);
switch (f) {
- case OSystem::kFeatureAspectRatioCorrection:
+ case OSystem::kFeatureAspectRatioCorrection:
return _videoMode.aspectRatioCorrection;
+ case OSystem::kFeatureCursorPalette:
+ return !_cursorPaletteDisabled;
default:
return false;
}
@@ -571,7 +532,7 @@ SurfaceSdlGraphicsManager::VideoState *GPHGraphicsManager::getVideoMode() {
void GPHGraphicsManager::warpMouse(int x, int y) {
if (_mouseCurState.x != x || _mouseCurState.y != y) {
- if (_videoMode.mode == GFX_HALF && !_overlayVisible){
+ if (_videoMode.mode == GFX_HALF && !_overlayVisible) {
x = x / 2;
y = y / 2;
}
@@ -579,21 +540,16 @@ void GPHGraphicsManager::warpMouse(int x, int y) {
SurfaceSdlGraphicsManager::warpMouse(x, y);
}
-void GPHGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- if (_videoMode.mode == GFX_HALF) {
- newEvent.mouse.x *= 2;
- newEvent.mouse.y *= 2;
- }
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
+void GPHGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ if (_videoMode.mode == GFX_HALF) {
+ point.x *= 2;
+ point.y *= 2;
}
- g_system->getEventManager()->pushEvent(newEvent);
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
}
diff --git a/backends/graphics/gph/gph-graphics.h b/backends/graphics/gph/gph-graphics.h
index 45b8618569..f1f3d18b41 100644
--- a/backends/graphics/gph/gph-graphics.h
+++ b/backends/graphics/gph/gph-graphics.h
@@ -24,7 +24,7 @@
#define BACKENDS_GRAPHICS_GPH_H
#include "backends/graphics/surfacesdl/surfacesdl-graphics.h"
-#include "graphics/scaler/aspect.h" // for aspect2Real
+#include "graphics/scaler/aspect.h" // for aspect2Real
#include "graphics/scaler/downscaler.h"
enum {
@@ -56,7 +56,7 @@ public:
SurfaceSdlGraphicsManager::MousePos *getMouseCurState();
SurfaceSdlGraphicsManager::VideoState *getVideoMode();
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
};
#endif /* BACKENDS_GRAPHICS_GPH_H */
diff --git a/backends/graphics/graphics.h b/backends/graphics/graphics.h
index 20924ed581..3f282df587 100644
--- a/backends/graphics/graphics.h
+++ b/backends/graphics/graphics.h
@@ -84,6 +84,10 @@ public:
virtual void setCursorPalette(const byte *colors, uint start, uint num) = 0;
virtual void displayMessageOnOSD(const char *msg) {}
+
+ // Graphics::PaletteManager interface
+ //virtual void setPalette(const byte *colors, uint start, uint num) = 0;
+ //virtual void grabPalette(byte *colors, uint start, uint num) = 0;
};
#endif
diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
index 732074b7e2..de9838a0d7 100644
--- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
+++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
@@ -134,7 +134,7 @@ void LinuxmotoSdlGraphicsManager::initSize(uint w, uint h) {
if (w > 320 || h > 240) {
setGraphicsMode(GFX_HALF);
setGraphicsModeIntern();
- _sdlEventSource->toggleMouseGrab();
+ _eventSource->toggleMouseGrab();
}
_transactionDetails.sizeChanged = true;
@@ -478,21 +478,16 @@ void LinuxmotoSdlGraphicsManager::warpMouse(int x, int y) {
SurfaceSdlGraphicsManager::warpMouse(x, y);
}
-void LinuxmotoSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- if (_videoMode.mode == GFX_HALF) {
- newEvent.mouse.x *= 2;
- newEvent.mouse.y *= 2;
- }
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
+void LinuxmotoSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ if (_videoMode.mode == GFX_HALF) {
+ point.x *= 2;
+ point.y *= 2;
}
- g_system->getEventManager()->pushEvent(newEvent);
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
}
diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
index 938512f323..ee2a566d71 100644
--- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
+++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
@@ -42,8 +42,7 @@ public:
virtual void hideOverlay();
virtual void warpMouse(int x, int y);
-protected:
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
};
#endif
diff --git a/backends/graphics/opengl/gltexture.h b/backends/graphics/opengl/gltexture.h
index f0cd7aed56..71f1eeb78f 100644
--- a/backends/graphics/opengl/gltexture.h
+++ b/backends/graphics/opengl/gltexture.h
@@ -20,6 +20,9 @@
*
*/
+#ifndef BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H
+#define BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H
+
#include "common/scummsys.h"
#ifdef WIN32
@@ -31,7 +34,20 @@
#undef ARRAYSIZE
#endif
-#if defined(USE_GLES)
+// HACK: At this point in Windows platforms, common/util.h has been included
+// via common/rect.h (from backends/graphics/sdl/sdl-graphics.h), via
+// backends/graphics/openglsdl/openglsdl-graphics.h. Thus, we end up with
+// COMMON_UTIL_H defined, and ARRAYSIZE undefined (bad!). Therefore,
+// ARRAYSIZE is undefined in openglsdl-graphics.cpp. This is a temporary
+// hackish solution fo fix compilation under Windows.
+#if !defined(ARRAYSIZE) && defined(COMMON_UTIL_H)
+#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0])))
+#endif
+
+#if defined(BADA)
+#include <FGraphicsOpengl.h>
+using namespace Osp::Graphics::Opengl;
+#elif defined(USE_GLES)
#include <GLES/gl.h>
#elif defined(SDL_BACKEND)
#include <SDL_opengl.h>
@@ -106,3 +122,5 @@ protected:
GLint _filter;
bool _refresh;
};
+
+#endif
diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp
index 046be4c669..8e01e76f16 100644
--- a/backends/graphics/opengl/opengl-graphics.cpp
+++ b/backends/graphics/opengl/opengl-graphics.cpp
@@ -67,10 +67,6 @@ OpenGLGraphicsManager::OpenGLGraphicsManager()
}
OpenGLGraphicsManager::~OpenGLGraphicsManager() {
- // Unregister the event observer
- if (g_system->getEventManager()->getEventDispatcher() != NULL)
- g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
-
free(_gamePalette);
free(_cursorPalette);
@@ -79,11 +75,6 @@ OpenGLGraphicsManager::~OpenGLGraphicsManager() {
delete _cursorTexture;
}
-void OpenGLGraphicsManager::initEventObserver() {
- // Register the graphics manager as a event observer
- g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false);
-}
-
//
// Feature
//
@@ -1254,12 +1245,16 @@ void OpenGLGraphicsManager::toggleAntialiasing() {
_transactionDetails.filterChanged = true;
}
-uint OpenGLGraphicsManager::getAspectRatio() {
+uint OpenGLGraphicsManager::getAspectRatio() const {
// In case we enable aspect ratio correction we force a 4/3 ratio.
+ // But just for 320x200 and 640x400 games, since other games do not need
+ // this.
// TODO: This makes OpenGL Normal behave like OpenGL Conserve, when aspect
// ratio correction is enabled, but it's better than the previous 4/3 mode
// mess at least...
- if (_videoMode.aspectRatioCorrection)
+ if (_videoMode.aspectRatioCorrection
+ && ((_videoMode.screenWidth == 320 && _videoMode.screenHeight == 200)
+ || (_videoMode.screenWidth == 640 && _videoMode.screenHeight == 400)))
return 13333;
else if (_videoMode.mode == OpenGL::GFX_NORMAL)
return _videoMode.hardwareWidth * 10000 / _videoMode.hardwareHeight;
@@ -1282,36 +1277,6 @@ void OpenGLGraphicsManager::adjustMousePosition(int16 &x, int16 &y) {
}
}
-bool OpenGLGraphicsManager::notifyEvent(const Common::Event &event) {
- switch (event.type) {
- case Common::EVENT_MOUSEMOVE:
- if (!event.synthetic) {
- _cursorState.x = event.mouse.x;
- _cursorState.y = event.mouse.y;
- }
- case Common::EVENT_LBUTTONDOWN:
- case Common::EVENT_RBUTTONDOWN:
- case Common::EVENT_WHEELUP:
- case Common::EVENT_WHEELDOWN:
- case Common::EVENT_MBUTTONDOWN:
- case Common::EVENT_LBUTTONUP:
- case Common::EVENT_RBUTTONUP:
- case Common::EVENT_MBUTTONUP:
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- adjustMousePosition(newEvent.mouse.x, newEvent.mouse.y);
- g_system->getEventManager()->pushEvent(newEvent);
- }
- return !event.synthetic;
-
- default:
- break;
- }
-
- return false;
-}
-
bool OpenGLGraphicsManager::saveScreenshot(const char *filename) {
int width = _videoMode.hardwareWidth;
int height = _videoMode.hardwareHeight;
@@ -1383,9 +1348,13 @@ const char *OpenGLGraphicsManager::getCurrentModeName() {
}
#ifdef USE_OSD
+const Graphics::Font *OpenGLGraphicsManager::getFontOSD() {
+ return FontMan.getFontByUsage(Graphics::FontManager::kLocalizedFont);
+}
+
void OpenGLGraphicsManager::updateOSD() {
// The font we are going to use:
- const Graphics::Font *font = FontMan.getFontByUsage(Graphics::FontManager::kLocalizedFont);
+ const Graphics::Font *font = getFontOSD();
if (_osdSurface.w != _osdTexture->getWidth() || _osdSurface.h != _osdTexture->getHeight())
_osdSurface.create(_osdTexture->getWidth(), _osdTexture->getHeight(), _overlayFormat);
diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h
index 56f7d92a12..6ded680eae 100644
--- a/backends/graphics/opengl/opengl-graphics.h
+++ b/backends/graphics/opengl/opengl-graphics.h
@@ -26,7 +26,8 @@
#include "backends/graphics/opengl/gltexture.h"
#include "backends/graphics/graphics.h"
#include "common/array.h"
-#include "common/events.h"
+#include "common/rect.h"
+#include "graphics/font.h"
#include "graphics/pixelformat.h"
// Uncomment this to enable the 'on screen display' code.
@@ -50,13 +51,11 @@ enum {
* the buffers swap, and implement loadGFXMode for handling the window/context if
* needed. If USE_RGB_COLOR is enabled, getSupportedFormats must be implemented.
*/
-class OpenGLGraphicsManager : public GraphicsManager, public Common::EventObserver {
+class OpenGLGraphicsManager : public GraphicsManager {
public:
OpenGLGraphicsManager();
virtual ~OpenGLGraphicsManager();
- virtual void initEventObserver();
-
virtual bool hasFeature(OSystem::Feature f);
virtual void setFeatureState(OSystem::Feature f, bool enable);
virtual bool getFeatureState(OSystem::Feature f);
@@ -109,10 +108,6 @@ public:
virtual void setCursorPalette(const byte *colors, uint start, uint num);
virtual void displayMessageOnOSD(const char *msg);
-
- // Override from Common::EventObserver
- bool notifyEvent(const Common::Event &event);
-
protected:
/**
* Setup OpenGL settings
@@ -220,10 +215,7 @@ protected:
virtual void calculateDisplaySize(int &width, int &height);
virtual void refreshDisplaySize();
- /**
- * Returns the current target aspect ratio x 10000
- */
- virtual uint getAspectRatio();
+ uint getAspectRatio() const;
bool _formatBGR;
@@ -324,6 +316,11 @@ protected:
*/
Common::Array<Common::String> _osdLines;
+ /**
+ * Returns the font used for on screen display
+ */
+ virtual const Graphics::Font *getFontOSD();
+
/**
* Update the OSD texture / surface.
*/
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp
index bd7dd32e3b..cfc78cfcac 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.cpp
+++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp
@@ -30,8 +30,9 @@
#include "common/textconsole.h"
#include "common/translation.h"
-OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager()
+OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(SdlEventSource *eventSource)
:
+ SdlGraphicsManager(eventSource),
_hwscreen(0),
_screenResized(false),
_activeFullscreenMode(-2),
@@ -71,6 +72,14 @@ OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager()
}
OpenGLSdlGraphicsManager::~OpenGLSdlGraphicsManager() {
+ // Unregister the event observer
+ if (g_system->getEventManager()->getEventDispatcher() != NULL)
+ g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
+}
+
+void OpenGLSdlGraphicsManager::initEventObserver() {
+ // Register the graphics manager as a event observer
+ g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false);
}
bool OpenGLSdlGraphicsManager::hasFeature(OSystem::Feature f) {
@@ -304,14 +313,17 @@ bool OpenGLSdlGraphicsManager::loadGFXMode() {
_videoMode.overlayWidth = _videoMode.hardwareWidth = _videoMode.screenWidth * scaleFactor;
_videoMode.overlayHeight = _videoMode.hardwareHeight = _videoMode.screenHeight * scaleFactor;
- int screenAspectRatio = _videoMode.screenWidth * 10000 / _videoMode.screenHeight;
- int desiredAspectRatio = getAspectRatio();
-
- // Do not downscale dimensions, only enlarge them if needed
- if (screenAspectRatio > desiredAspectRatio)
- _videoMode.hardwareHeight = (_videoMode.overlayWidth * 10000 + 5000) / desiredAspectRatio;
- else if (screenAspectRatio < desiredAspectRatio)
- _videoMode.hardwareWidth = (_videoMode.overlayHeight * desiredAspectRatio + 5000) / 10000;
+ // The only modes where we need to adapt the aspect ratio are 320x200
+ // and 640x400. That is since our aspect ratio correction in fact is
+ // only used to ensure that the original pixel size aspect for these
+ // modes is used.
+ // (Non-square pixels on old monitors vs square pixel on new ones).
+ if (_videoMode.aspectRatioCorrection
+ && ((_videoMode.screenWidth == 320 && _videoMode.screenHeight == 200)
+ || (_videoMode.screenWidth == 640 && _videoMode.screenHeight == 400)))
+ _videoMode.overlayHeight = _videoMode.hardwareHeight = 240 * scaleFactor;
+ else
+ _videoMode.overlayHeight = _videoMode.hardwareHeight = _videoMode.screenHeight * scaleFactor;
}
_screenResized = false;
@@ -448,6 +460,10 @@ void OpenGLSdlGraphicsManager::toggleFullScreen(int loop) {
_activeFullscreenMode = -2;
setFullscreenMode(!isFullscreen);
}
+
+ // HACK: We need to force a refresh here, since we change the
+ // fullscreen mode.
+ _transactionDetails.needRefresh = true;
endGFXTransaction();
// Ignore resize events for the next 10 frames
@@ -609,50 +625,54 @@ bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) {
}
}
break;
+
case Common::EVENT_KEYUP:
return isHotkey(event);
- // HACK: Handle special SDL event
- // The new screen size is saved on the mouse event as part of HACK,
- // there is no common resize event.
- case OSystem_SDL::kSdlEventResize:
- // Do not resize if ignoring resize events.
- if (!_ignoreResizeFrames && !getFullscreenMode()) {
- bool scaleChanged = false;
- beginGFXTransaction();
- _videoMode.hardwareWidth = event.mouse.x;
- _videoMode.hardwareHeight = event.mouse.y;
-
- if (_videoMode.mode != OpenGL::GFX_ORIGINAL) {
- _screenResized = true;
- calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight);
- }
- int scale = MIN(_videoMode.hardwareWidth / _videoMode.screenWidth,
- _videoMode.hardwareHeight / _videoMode.screenHeight);
+ default:
+ break;
+ }
- if (getScale() != scale) {
- scaleChanged = true;
- setScale(MAX(MIN(scale, 3), 1));
- }
+ return false;
+}
- if (_videoMode.mode == OpenGL::GFX_ORIGINAL) {
- calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight);
- }
+void OpenGLSdlGraphicsManager::notifyVideoExpose() {
+}
+
+void OpenGLSdlGraphicsManager::notifyResize(const uint width, const uint height) {
+ // Do not resize if ignoring resize events.
+ if (!_ignoreResizeFrames && !getFullscreenMode()) {
+ bool scaleChanged = false;
+ beginGFXTransaction();
+ _videoMode.hardwareWidth = width;
+ _videoMode.hardwareHeight = height;
+
+ _screenResized = true;
+
+ int scale = MIN(_videoMode.hardwareWidth / _videoMode.screenWidth,
+ _videoMode.hardwareHeight / _videoMode.screenHeight);
- _transactionDetails.sizeChanged = true;
- endGFXTransaction();
+ if (getScale() != scale) {
+ scaleChanged = true;
+ setScale(MAX(MIN(scale, 3), 1));
+ }
+
+ _transactionDetails.sizeChanged = true;
+ endGFXTransaction();
#ifdef USE_OSD
- if (scaleChanged)
- displayScaleChangedMsg();
+ if (scaleChanged)
+ displayScaleChangedMsg();
#endif
- }
- return true;
-
- default:
- break;
}
+}
- return OpenGLGraphicsManager::notifyEvent(event);
+void OpenGLSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ adjustMousePosition(point.x, point.y);
+}
+
+void OpenGLSdlGraphicsManager::notifyMousePos(Common::Point mouse) {
+ _cursorState.x = mouse.x;
+ _cursorState.y = mouse.y;
}
#endif
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.h b/backends/graphics/openglsdl/openglsdl-graphics.h
index ba9f94db2d..1587183328 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.h
+++ b/backends/graphics/openglsdl/openglsdl-graphics.h
@@ -27,15 +27,17 @@
#if defined(ARRAYSIZE) && !defined(_WINDOWS_)
#undef ARRAYSIZE
#endif
-
+#include "backends/graphics/sdl/sdl-graphics.h"
#include "backends/graphics/opengl/opengl-graphics.h"
+#include "common/events.h"
+
/**
* SDL OpenGL graphics manager
*/
-class OpenGLSdlGraphicsManager : public OpenGLGraphicsManager {
+class OpenGLSdlGraphicsManager : public OpenGLGraphicsManager, public SdlGraphicsManager, public Common::EventObserver {
public:
- OpenGLSdlGraphicsManager();
+ OpenGLSdlGraphicsManager(SdlEventSource *eventSource);
virtual ~OpenGLSdlGraphicsManager();
virtual bool hasFeature(OSystem::Feature f);
@@ -45,10 +47,17 @@ public:
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const;
#endif
+ virtual void initEventObserver();
virtual bool notifyEvent(const Common::Event &event);
virtual void updateScreen();
+ // SdlGraphicsManager interface
+ virtual void notifyVideoExpose();
+ virtual void notifyResize(const uint width, const uint height);
+ virtual void transformMouseCoordinates(Common::Point &point);
+ virtual void notifyMousePos(Common::Point mouse);
+
protected:
virtual void internUpdateScreen();
diff --git a/backends/graphics/openpandora/op-graphics.h b/backends/graphics/openpandora/op-graphics.h
index ed26df7475..0b3eeae8ec 100644
--- a/backends/graphics/openpandora/op-graphics.h
+++ b/backends/graphics/openpandora/op-graphics.h
@@ -24,7 +24,7 @@
#define BACKENDS_GRAPHICS_OP_H
#include "backends/graphics/surfacesdl/surfacesdl-graphics.h"
-#include "graphics/scaler/aspect.h" // for aspect2Real
+#include "graphics/scaler/aspect.h" // for aspect2Real
#include "graphics/scaler/downscaler.h"
enum {
diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp
new file mode 100644
index 0000000000..2eca4b8aab
--- /dev/null
+++ b/backends/graphics/sdl/sdl-graphics.cpp
@@ -0,0 +1,35 @@
+/* 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.
+ *
+ */
+
+#include "backends/graphics/sdl/sdl-graphics.h"
+
+#include "backends/events/sdl/sdl-events.h"
+
+SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source)
+ : _eventSource(source) {
+ _eventSource->setGraphicsManager(this);
+}
+
+SdlGraphicsManager::~SdlGraphicsManager() {
+ _eventSource->setGraphicsManager(0);
+}
+
diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h
new file mode 100644
index 0000000000..ea9149fccb
--- /dev/null
+++ b/backends/graphics/sdl/sdl-graphics.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.
+ *
+ */
+
+#ifndef BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H
+#define BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H
+
+#include "common/rect.h"
+
+class SdlEventSource;
+
+/**
+ * Base class for a SDL based graphics manager.
+ *
+ * It features a few extra a few extra features required by SdlEventSource.
+ * FIXME/HACK:
+ * Note it does not inherit from GraphicsManager to avoid a diamond inheritance
+ * in the current OpenGLSdlGraphicsManager.
+ */
+class SdlGraphicsManager {
+public:
+ SdlGraphicsManager(SdlEventSource *source);
+ virtual ~SdlGraphicsManager();
+
+ /**
+ * Notify the graphics manager that the graphics needs to be redrawn, since
+ * the application window was modified.
+ *
+ * This is basically called when SDL_VIDEOEXPOSE was received.
+ */
+ virtual void notifyVideoExpose() = 0;
+
+ /**
+ * Notify the graphics manager about an resize event.
+ *
+ * It is noteworthy that the requested width/height should actually be set
+ * up as is and not changed by the graphics manager, since else it might
+ * lead to odd behavior for certain window managers.
+ *
+ * It is only required to overwrite this method in case you want a
+ * resizable window. The default implementation just does nothing.
+ *
+ * @param width Requested window width.
+ * @param height Requested window height.
+ */
+ virtual void notifyResize(const uint width, const uint height) {}
+
+ /**
+ * Transforms real screen coordinates into the current active screen
+ * coordinates (may be either game screen or overlay).
+ *
+ * @param point Mouse coordinates to transform.
+ */
+ virtual void transformMouseCoordinates(Common::Point &point) = 0;
+
+ /**
+ * Notifies the graphics manager about a position change according to the
+ * real screen coordinates.
+ *
+ * @param mouse Mouse position.
+ */
+ virtual void notifyMousePos(Common::Point mouse) = 0;
+
+protected:
+ SdlEventSource *_eventSource;
+};
+
+#endif
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
index 66207b6808..f3a1cad040 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
@@ -122,7 +122,7 @@ static AspectRatio getDesiredAspectRatio() {
SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource)
:
- _sdlEventSource(sdlEventSource),
+ SdlGraphicsManager(sdlEventSource),
#ifdef USE_OSD
_osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0),
#endif
@@ -249,7 +249,10 @@ void SurfaceSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable)
}
bool SurfaceSdlGraphicsManager::getFeatureState(OSystem::Feature f) {
- assert(_transactionMode == kTransactionNone);
+ // We need to allow this to be called from within a transaction, since we
+ // currently use it to retreive the graphics state, when switching from
+ // SDL->OpenGL mode for example.
+ //assert(_transactionMode == kTransactionNone);
switch (f) {
case OSystem::kFeatureFullscreenMode:
@@ -728,7 +731,8 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() {
_videoMode.hardwareWidth = _videoMode.screenWidth * _videoMode.scaleFactor;
_videoMode.hardwareHeight = effectiveScreenHeight();
-#else
+// On GPH devices ALL the _videoMode.hardware... are setup in GPHGraphicsManager::loadGFXMode()
+#elif !defined(GPH_DEVICE)
_videoMode.hardwareWidth = _videoMode.overlayWidth;
_videoMode.hardwareHeight = _videoMode.overlayHeight;
#endif
@@ -752,6 +756,12 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() {
error("allocating _screen failed");
#endif
+ // SDL 1.2 palettes default to all black,
+ // SDL 1.3 palettes default to all white,
+ // Thus set our own default palette to all black.
+ // SDL_SetColors does nothing for non indexed surfaces.
+ SDL_SetColors(_screen, _currentPalette, 0, 256);
+
//
// Create the surface that contains the scaled graphics in 16 bit mode
//
@@ -840,7 +850,7 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() {
SDL_SetColorKey(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kOSDColorKey);
#endif
- _sdlEventSource->resetKeyboadEmulation(
+ _eventSource->resetKeyboadEmulation(
_videoMode.screenWidth * _videoMode.scaleFactor - 1,
effectiveScreenHeight() - 1);
@@ -2229,20 +2239,6 @@ bool SurfaceSdlGraphicsManager::isScalerHotkey(const Common::Event &event) {
return false;
}
-void SurfaceSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
- }
- g_system->getEventManager()->pushEvent(newEvent);
- }
-}
-
void SurfaceSdlGraphicsManager::toggleFullScreen() {
beginGFXTransaction();
setFullscreenMode(!_videoMode.fullscreen);
@@ -2291,26 +2287,10 @@ bool SurfaceSdlGraphicsManager::notifyEvent(const Common::Event &event) {
if (handleScalerHotkeys(event.kbd.keycode))
return true;
}
+
case Common::EVENT_KEYUP:
return isScalerHotkey(event);
- case Common::EVENT_MOUSEMOVE:
- if (event.synthetic)
- setMousePos(event.mouse.x, event.mouse.y);
- case Common::EVENT_LBUTTONDOWN:
- case Common::EVENT_RBUTTONDOWN:
- case Common::EVENT_WHEELUP:
- case Common::EVENT_WHEELDOWN:
- case Common::EVENT_MBUTTONDOWN:
- case Common::EVENT_LBUTTONUP:
- case Common::EVENT_RBUTTONUP:
- case Common::EVENT_MBUTTONUP:
- adjustMouseEvent(event);
- return !event.synthetic;
-
- // HACK: Handle special SDL event
- case OSystem_SDL::kSdlEventExpose:
- _forceFull = true;
- return false;
+
default:
break;
}
@@ -2318,4 +2298,22 @@ bool SurfaceSdlGraphicsManager::notifyEvent(const Common::Event &event) {
return false;
}
+void SurfaceSdlGraphicsManager::notifyVideoExpose() {
+ _forceFull = true;
+}
+
+void SurfaceSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
+ }
+}
+
+void SurfaceSdlGraphicsManager::notifyMousePos(Common::Point mouse) {
+ transformMouseCoordinates(mouse);
+ setMousePos(mouse.x, mouse.y);
+}
+
#endif
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h
index cd8710d443..f71096d43e 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.h
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h
@@ -24,6 +24,7 @@
#define BACKENDS_GRAPHICS_SURFACESDL_GRAPHICS_H
#include "backends/graphics/graphics.h"
+#include "backends/graphics/sdl/sdl-graphics.h"
#include "graphics/pixelformat.h"
#include "graphics/scaler.h"
#include "common/events.h"
@@ -74,7 +75,7 @@ public:
/**
* SDL graphics manager
*/
-class SurfaceSdlGraphicsManager : public GraphicsManager, public Common::EventObserver {
+class SurfaceSdlGraphicsManager : public GraphicsManager, public SdlGraphicsManager, public Common::EventObserver {
public:
SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource);
virtual ~SurfaceSdlGraphicsManager();
@@ -140,9 +141,12 @@ public:
// Override from Common::EventObserver
bool notifyEvent(const Common::Event &event);
-protected:
- SdlEventSource *_sdlEventSource;
+ // SdlGraphicsManager interface
+ virtual void notifyVideoExpose();
+ virtual void transformMouseCoordinates(Common::Point &point);
+ virtual void notifyMousePos(Common::Point mouse);
+protected:
#ifdef USE_OSD
/** Surface containing the OSD message */
SDL_Surface *_osdSurface;
@@ -329,7 +333,6 @@ protected:
virtual bool handleScalerHotkeys(Common::KeyCode key);
virtual bool isScalerHotkey(const Common::Event &event);
- virtual void adjustMouseEvent(const Common::Event &event);
virtual void setMousePos(int x, int y);
virtual void toggleFullScreen();
virtual bool saveScreenshot(const char *filename);
diff --git a/backends/graphics/symbiansdl/symbiansdl-graphics.cpp b/backends/graphics/symbiansdl/symbiansdl-graphics.cpp
index 4a9a219641..5fe8b19887 100644
--- a/backends/graphics/symbiansdl/symbiansdl-graphics.cpp
+++ b/backends/graphics/symbiansdl/symbiansdl-graphics.cpp
@@ -77,4 +77,3 @@ void SymbianSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable)
}
#endif
-
diff --git a/backends/graphics/symbiansdl/symbiansdl-graphics.h b/backends/graphics/symbiansdl/symbiansdl-graphics.h
index 404ca87a0a..73e810a629 100644
--- a/backends/graphics/symbiansdl/symbiansdl-graphics.h
+++ b/backends/graphics/symbiansdl/symbiansdl-graphics.h
@@ -39,4 +39,3 @@ public:
};
#endif
-
diff --git a/backends/graphics/wincesdl/wincesdl-graphics.cpp b/backends/graphics/wincesdl/wincesdl-graphics.cpp
index f9f963dc70..58b735ef8b 100644
--- a/backends/graphics/wincesdl/wincesdl-graphics.cpp
+++ b/backends/graphics/wincesdl/wincesdl-graphics.cpp
@@ -44,7 +44,7 @@
WINCESdlGraphicsManager::WINCESdlGraphicsManager(SdlEventSource *sdlEventSource)
: SurfaceSdlGraphicsManager(sdlEventSource),
- _panelInitialized(false), _noDoubleTapRMB(false),
+ _panelInitialized(false), _noDoubleTapRMB(false), _noDoubleTapPT(false),
_toolbarHighDrawn(false), _newOrientation(0), _orientationLandscape(0),
_panelVisible(true), _saveActiveToolbar(NAME_MAIN_PANEL), _panelStateForced(false),
_canBeAspectScaled(false), _scalersChanged(false), _saveToolbarState(false),
@@ -478,6 +478,9 @@ void WINCESdlGraphicsManager::update_game_settings() {
if (ConfMan.hasKey("no_doubletap_rightclick"))
_noDoubleTapRMB = ConfMan.getBool("no_doubletap_rightclick");
+
+ if (ConfMan.hasKey("no_doubletap_paneltoggle"))
+ _noDoubleTapPT = ConfMan.getBool("no_doubletap_paneltoggle");
}
void WINCESdlGraphicsManager::internUpdateScreen() {
@@ -931,7 +934,7 @@ bool WINCESdlGraphicsManager::loadGFXMode() {
_toolbarHigh = NULL;
// keyboard cursor control, some other better place for it?
- _sdlEventSource->resetKeyboadEmulation(_videoMode.screenWidth * _scaleFactorXm / _scaleFactorXd - 1, _videoMode.screenHeight * _scaleFactorXm / _scaleFactorXd - 1);
+ _eventSource->resetKeyboadEmulation(_videoMode.screenWidth * _scaleFactorXm / _scaleFactorXd - 1, _videoMode.screenHeight * _scaleFactorXm / _scaleFactorXd - 1);
return true;
}
@@ -1155,22 +1158,17 @@ void WINCESdlGraphicsManager::setMouseCursor(const byte *buf, uint w, uint h, in
}
}
-void WINCESdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- /*
- if (!_overlayVisible) {
- newEvent.mouse.x = newEvent.mouse.x * _scaleFactorXd / _scaleFactorXm;
- newEvent.mouse.y = newEvent.mouse.y * _scaleFactorYd / _scaleFactorYm;
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
- }
- */
- g_system->getEventManager()->pushEvent(newEvent);
+void WINCESdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ /*
+ if (!_overlayVisible) {
+ point.x = point.x * _scaleFactorXd / _scaleFactorXm;
+ point.y = point.y * _scaleFactorYd / _scaleFactorYm;
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
+ */
}
void WINCESdlGraphicsManager::setMousePos(int x, int y) {
@@ -1599,6 +1597,19 @@ void WINCESdlGraphicsManager::swap_mouse_visibility() {
undrawMouse();
}
+void WINCESdlGraphicsManager::init_panel() {
+ _panelVisible = true;
+ if (_panelInitialized) {
+ _toolbarHandler.setVisible(true);
+ _toolbarHandler.setActive(NAME_MAIN_PANEL);
+ }
+}
+
+void WINCESdlGraphicsManager::reset_panel() {
+ _panelVisible = false;
+ _toolbarHandler.setVisible(false);
+}
+
// Smartphone actions
void WINCESdlGraphicsManager::initZones() {
int i;
@@ -1641,4 +1652,3 @@ WINCESdlGraphicsManager::zoneDesc WINCESdlGraphicsManager::_zones[TOTAL_ZONES] =
};
#endif /* _WIN32_WCE */
-
diff --git a/backends/graphics/wincesdl/wincesdl-graphics.h b/backends/graphics/wincesdl/wincesdl-graphics.h
index c620082b0c..2e8c3313b3 100644
--- a/backends/graphics/wincesdl/wincesdl-graphics.h
+++ b/backends/graphics/wincesdl/wincesdl-graphics.h
@@ -90,6 +90,8 @@ public:
void swap_zoom_up();
void swap_zoom_down();
void swap_mouse_visibility();
+ void init_panel();
+ void reset_panel();
void swap_freeLook();
bool getFreeLookState();
@@ -115,6 +117,7 @@ public:
bool _panelInitialized; // only initialize the toolbar once
bool _noDoubleTapRMB; // disable double tap -> rmb click
+ bool _noDoubleTapPT; // disable double tap for toolbar toggling
CEGUI::ToolbarHandler _toolbarHandler;
@@ -155,8 +158,7 @@ public:
static zoneDesc _zones[TOTAL_ZONES];
-protected:
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
private:
bool update_scalers();
@@ -203,4 +205,3 @@ private:
};
#endif /* BACKENDS_GRAPHICS_WINCE_SDL_H */
-
diff --git a/backends/log/log.cpp b/backends/log/log.cpp
index c02643b48b..693399bae5 100644
--- a/backends/log/log.cpp
+++ b/backends/log/log.cpp
@@ -102,4 +102,3 @@ void Log::printTimeStamp() {
} // End of namespace Log
} // End of namespace Backends
-
diff --git a/backends/log/log.h b/backends/log/log.h
index 8c95bfc435..524f70405f 100644
--- a/backends/log/log.h
+++ b/backends/log/log.h
@@ -126,4 +126,3 @@ private:
} // End of namespace Backends
#endif
-
diff --git a/backends/mixer/sdl13/sdl13-mixer.cpp b/backends/mixer/sdl13/sdl13-mixer.cpp
new file mode 100644
index 0000000000..84777c8bab
--- /dev/null
+++ b/backends/mixer/sdl13/sdl13-mixer.cpp
@@ -0,0 +1,109 @@
+/* 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.
+ *
+ */
+
+#include "common/scummsys.h"
+
+#if defined(SDL_BACKEND)
+
+#include "backends/mixer/sdl13/sdl13-mixer.h"
+#include "common/debug.h"
+#include "common/system.h"
+#include "common/config-manager.h"
+#include "common/textconsole.h"
+
+#ifdef GP2X
+#define SAMPLES_PER_SEC 11025
+#else
+#define SAMPLES_PER_SEC 22050
+#endif
+//#define SAMPLES_PER_SEC 44100
+
+Sdl13MixerManager::Sdl13MixerManager()
+ :
+ SdlMixerManager(),
+ _device(0) {
+
+}
+
+Sdl13MixerManager::~Sdl13MixerManager() {
+ _mixer->setReady(false);
+
+ SDL_CloseAudioDevice(_device);
+
+ delete _mixer;
+}
+
+void Sdl13MixerManager::init() {
+ // Start SDL Audio subsystem
+ if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) {
+ error("Could not initialize SDL: %s", SDL_GetError());
+ }
+
+ // Get the desired audio specs
+ SDL_AudioSpec desired = getAudioSpec(SAMPLES_PER_SEC);
+
+ // Start SDL audio with the desired specs
+ _device = SDL_OpenAudioDevice(NULL, 0, &desired, &_obtained,
+ SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
+
+ if (_device <= 0) {
+ warning("Could not open audio device: %s", SDL_GetError());
+
+ _mixer = new Audio::MixerImpl(g_system, desired.freq);
+ assert(_mixer);
+ _mixer->setReady(false);
+ } else {
+ debug(1, "Output sample rate: %d Hz", _obtained.freq);
+
+ _mixer = new Audio::MixerImpl(g_system, _obtained.freq);
+ assert(_mixer);
+ _mixer->setReady(true);
+
+ startAudio();
+ }
+}
+
+void Sdl13MixerManager::startAudio() {
+ // Start the sound system
+ SDL_PauseAudioDevice(_device, 0);
+}
+
+void Sdl13MixerManager::suspendAudio() {
+ SDL_CloseAudioDevice(_device);
+ _audioSuspended = true;
+}
+
+int Sdl13MixerManager::resumeAudio() {
+ if (!_audioSuspended)
+ return -2;
+
+ _device = SDL_OpenAudioDevice(NULL, 0, &_obtained, NULL, 0);
+ if (_device <= 0) {
+ return -1;
+ }
+
+ SDL_PauseAudioDevice(_device, 0);
+ _audioSuspended = false;
+ return 0;
+}
+
+#endif
diff --git a/backends/mixer/sdl13/sdl13-mixer.h b/backends/mixer/sdl13/sdl13-mixer.h
new file mode 100644
index 0000000000..9e07ea8673
--- /dev/null
+++ b/backends/mixer/sdl13/sdl13-mixer.h
@@ -0,0 +1,67 @@
+/* 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 BACKENDS_MIXER_SDL13_H
+#define BACKENDS_MIXER_SDL13_H
+
+#include "backends/mixer/sdl/sdl-mixer.h"
+
+/**
+ * SDL mixer manager. It wraps the actual implementation
+ * of the Audio:Mixer used by the engine, and setups
+ * the SDL audio subsystem and the callback for the
+ * audio mixer implementation.
+ */
+class Sdl13MixerManager : public SdlMixerManager {
+public:
+ Sdl13MixerManager();
+ virtual ~Sdl13MixerManager();
+
+ /**
+ * Initialize and setups the mixer
+ */
+ virtual void init();
+
+ /**
+ * Pauses the audio system
+ */
+ virtual void suspendAudio();
+
+ /**
+ * Resumes the audio system
+ */
+ virtual int resumeAudio();
+
+protected:
+
+ /**
+ * The opened SDL audio device
+ */
+ SDL_AudioDeviceID _device;
+
+ /**
+ * Starts SDL audio
+ */
+ virtual void startAudio();
+};
+
+#endif
diff --git a/backends/mixer/symbiansdl/symbiansdl-mixer.cpp b/backends/mixer/symbiansdl/symbiansdl-mixer.cpp
index c911a99b61..d4637fdd88 100644
--- a/backends/mixer/symbiansdl/symbiansdl-mixer.cpp
+++ b/backends/mixer/symbiansdl/symbiansdl-mixer.cpp
@@ -72,4 +72,3 @@ void SymbianSdlMixerManager::callbackHandler(byte *samples, int len) {
}
#endif
-
diff --git a/backends/mixer/symbiansdl/symbiansdl-mixer.h b/backends/mixer/symbiansdl/symbiansdl-mixer.h
index e3104e45eb..d59c98753b 100644
--- a/backends/mixer/symbiansdl/symbiansdl-mixer.h
+++ b/backends/mixer/symbiansdl/symbiansdl-mixer.h
@@ -41,4 +41,3 @@ protected:
};
#endif
-
diff --git a/backends/mixer/wincesdl/wincesdl-mixer.cpp b/backends/mixer/wincesdl/wincesdl-mixer.cpp
index 36ac310ad9..db5ab59446 100644
--- a/backends/mixer/wincesdl/wincesdl-mixer.cpp
+++ b/backends/mixer/wincesdl/wincesdl-mixer.cpp
@@ -131,15 +131,20 @@ uint32 WINCESdlMixerManager::compute_sample_rate() {
ConfMan.setBool("FM_medium_quality", true);
ConfMan.flushToDisk();
}
+ } else {
+ if (!ConfMan.hasKey("FM_high_quality") && !ConfMan.hasKey("FM_medium_quality")) {
+ ConfMan.setBool("FM_high_quality", true);
+ ConfMan.flushToDisk();
+ }
}
// See if the output frequency is forced by the game
if (gameid == "ft" || gameid == "dig" || gameid == "comi" || gameid == "queen" || gameid == "sword" || gameid == "agi")
sampleRate = SAMPLES_PER_SEC_NEW;
else {
- if (ConfMan.hasKey("high_sample_rate") && ConfMan.getBool("high_sample_rate"))
- sampleRate = SAMPLES_PER_SEC_NEW;
- else
+ if (ConfMan.hasKey("high_sample_rate") && !ConfMan.getBool("high_sample_rate"))
sampleRate = SAMPLES_PER_SEC_OLD;
+ else
+ sampleRate = SAMPLES_PER_SEC_NEW;
}
#ifdef USE_VORBIS
@@ -182,4 +187,3 @@ bool WINCESdlMixerManager::checkOggHighSampleRate() {
#endif
#endif
-
diff --git a/backends/mixer/wincesdl/wincesdl-mixer.h b/backends/mixer/wincesdl/wincesdl-mixer.h
index 8274d39d1c..fb51f6ac64 100644
--- a/backends/mixer/wincesdl/wincesdl-mixer.h
+++ b/backends/mixer/wincesdl/wincesdl-mixer.h
@@ -47,4 +47,3 @@ private:
};
#endif
-
diff --git a/backends/module.mk b/backends/module.mk
index e568002d40..89cde44536 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -60,14 +60,20 @@ endif
# derive from the SDL backend, and they all need the following files.
ifdef SDL_BACKEND
MODULE_OBJS += \
- audiocd/sdl/sdl-audiocd.o \
events/sdl/sdl-events.o \
+ graphics/sdl/sdl-graphics.o \
graphics/surfacesdl/surfacesdl-graphics.o \
mixer/doublebuffersdl/doublebuffersdl-mixer.o \
mixer/sdl/sdl-mixer.o \
mutex/sdl/sdl-mutex.o \
plugins/sdl/sdl-provider.o \
timer/sdl/sdl-timer.o
+
+# SDL 1.3 removed audio CD support
+ifndef USE_SDL13
+MODULE_OBJS += \
+ audiocd/sdl/sdl-audiocd.o
+endif
endif
ifdef POSIX
@@ -82,7 +88,8 @@ endif
ifdef MACOSX
MODULE_OBJS += \
midi/coreaudio.o \
- midi/coremidi.o
+ midi/coremidi.o \
+ updates/macosx/macosx-updates.o
endif
ifdef WIN32
@@ -101,6 +108,20 @@ MODULE_OBJS += \
midi/camd.o
endif
+ifdef PLAYSTATION3
+MODULE_OBJS += \
+ fs/posix/posix-fs.o \
+ fs/posix/posix-fs-factory.o \
+ fs/ps3/ps3-fs-factory.o \
+ events/ps3sdl/ps3sdl-events.o \
+ mixer/sdl13/sdl13-mixer.o
+endif
+
+ifeq ($(BACKEND),bada)
+MODULE_OBJS += \
+ timer/bada/timer.o
+endif
+
ifeq ($(BACKEND),ds)
MODULE_OBJS += \
fs/ds/ds-fs.o \
@@ -126,6 +147,11 @@ MODULE_OBJS += \
graphics/linuxmotosdl/linuxmotosdl-graphics.o
endif
+ifeq ($(BACKEND),maemo)
+MODULE_OBJS += \
+ events/maemosdl/maemosdl-events.o
+endif
+
ifeq ($(BACKEND),n64)
MODULE_OBJS += \
fs/n64/n64-fs.o \
diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp
index 17c7d4f9cb..aba31320ea 100644
--- a/backends/platform/android/android.cpp
+++ b/backends/platform/android/android.cpp
@@ -174,6 +174,8 @@ OSystem_Android::~OSystem_Android() {
_mixer = 0;
delete _fsFactory;
_fsFactory = 0;
+ delete _timerManager;
+ _timerManager = 0;
deleteMutex(_event_queue_lock);
}
@@ -602,4 +604,3 @@ void AndroidPluginProvider::addCustomDirectories(Common::FSList &dirs) const {
#endif
#endif
-
diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h
index c2ada2ab77..f39a8f1144 100644
--- a/backends/platform/android/android.h
+++ b/backends/platform/android/android.h
@@ -296,4 +296,3 @@ public:
#endif
#endif
-
diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk
index 77fdb139d8..63d194fdc1 100644
--- a/backends/platform/android/android.mk
+++ b/backends/platform/android/android.mk
@@ -189,4 +189,3 @@ androiddistdebug: all
done
.PHONY: androidrelease androidtest
-
diff --git a/backends/platform/android/asset-archive.h b/backends/platform/android/asset-archive.h
index 016e3e31a5..9216412e0a 100644
--- a/backends/platform/android/asset-archive.h
+++ b/backends/platform/android/asset-archive.h
@@ -52,4 +52,3 @@ private:
#endif
#endif
-
diff --git a/backends/platform/android/events.cpp b/backends/platform/android/events.cpp
index cf1d4b173c..2a16e69411 100644
--- a/backends/platform/android/events.cpp
+++ b/backends/platform/android/events.cpp
@@ -820,4 +820,3 @@ bool OSystem_Android::pollEvent(Common::Event &event) {
}
#endif
-
diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp
index b8a9e74437..8bc914f567 100644
--- a/backends/platform/android/gfx.cpp
+++ b/backends/platform/android/gfx.cpp
@@ -826,4 +826,3 @@ void OSystem_Android::disableCursorPalette() {
}
#endif
-
diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp
index c4daf24e16..b44a585528 100644
--- a/backends/platform/android/jni.cpp
+++ b/backends/platform/android/jni.cpp
@@ -22,8 +22,9 @@
#if defined(__ANDROID__)
-// Allow use of stuff in <time.h>
+// Allow use of stuff in <time.h> and abort()
#define FORBIDDEN_SYMBOL_EXCEPTION_time_h
+#define FORBIDDEN_SYMBOL_EXCEPTION_abort
// Disable printf override in common/forbidden.h to avoid
// clashes with log.h from the Android SDK.
@@ -618,4 +619,3 @@ void JNI::setPause(JNIEnv *env, jobject self, jboolean value) {
}
#endif
-
diff --git a/backends/platform/android/jni.h b/backends/platform/android/jni.h
index 1abecf0a37..52698e0f35 100644
--- a/backends/platform/android/jni.h
+++ b/backends/platform/android/jni.h
@@ -145,4 +145,3 @@ inline int JNI::writeAudio(JNIEnv *env, jbyteArray &data, int offset, int size)
#endif
#endif
-
diff --git a/backends/platform/android/module.mk b/backends/platform/android/module.mk
index 2fe4b40585..de5fe98a53 100644
--- a/backends/platform/android/module.mk
+++ b/backends/platform/android/module.mk
@@ -12,4 +12,3 @@ MODULE_OBJS := \
MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS))
OBJS := $(MODULE_OBJS) $(OBJS)
MODULE_DIRS += $(sort $(dir $(MODULE_OBJS)))
-
diff --git a/backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java b/backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java
index cede7eedd4..3aef14b851 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java
@@ -59,4 +59,3 @@ public class EditableSurfaceView extends SurfaceView {
return new MyInputConnection();
}
}
-
diff --git a/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java b/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java
index 3c91d9f5dc..d90b7b2c68 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java
@@ -51,4 +51,3 @@ public class PluginProvider extends BroadcastReceiver {
setResultExtras(extras);
}
}
-
diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
index ef9f4cc1e0..246a02c9be 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
@@ -449,4 +449,3 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
System.load(libpath.getPath());
}
}
-
diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java
index 1978b690d0..ce4e016322 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java
@@ -222,4 +222,3 @@ public class ScummVMActivity extends Activity {
InputMethodManager.HIDE_IMPLICIT_ONLY);
}
}
-
diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java
index f9eec72eac..8ab7d1a084 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java
@@ -28,4 +28,3 @@ public class ScummVMApplication extends Application {
return _cache_dir;
}
}
-
diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMEvents.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMEvents.java
index 2d5c100a1c..175ff0b677 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/ScummVMEvents.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMEvents.java
@@ -229,4 +229,3 @@ public class ScummVMEvents implements
return true;
}
}
-
diff --git a/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java
index c4b2ad7f5d..6cc7f8eadb 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java
@@ -44,6 +44,9 @@ public class Unpacker extends Activity {
private AsyncTask<String, Integer, Void> mUnpacker;
private final static int REQUEST_MARKET = 1;
+ // Android 3.1+ only
+ public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 32;
+
private static class UnpackJob {
public ZipFile zipfile;
public Set<String> paths;
@@ -273,6 +276,9 @@ public class Unpacker extends Activity {
unpack_libs);
Intent intent = new Intent(ScummVMApplication.ACTION_PLUGIN_QUERY);
+ // Android 3.1 defaults to FLAG_EXCLUDE_STOPPED_PACKAGES, and since
+ // none of our plugins will ever be running, that is not helpful
+ intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);
sendOrderedBroadcast(intent, Manifest.permission.SCUMMVM_PLUGIN,
new PluginBroadcastReciever(),
null, RESULT_OK, null, extras);
@@ -370,4 +376,3 @@ public class Unpacker extends Activity {
}
}
}
-
diff --git a/backends/platform/android/texture.cpp b/backends/platform/android/texture.cpp
index e993ed6794..53b4d1cc59 100644
--- a/backends/platform/android/texture.cpp
+++ b/backends/platform/android/texture.cpp
@@ -488,4 +488,3 @@ GLESFakePalette5551Texture::~GLESFakePalette5551Texture() {
}
#endif
-
diff --git a/backends/platform/android/texture.h b/backends/platform/android/texture.h
index dd34ba9d88..4307b5a1bc 100644
--- a/backends/platform/android/texture.h
+++ b/backends/platform/android/texture.h
@@ -271,4 +271,3 @@ public:
#endif
#endif
-
diff --git a/backends/platform/bada/README.TXT b/backends/platform/bada/README.TXT
new file mode 100644
index 0000000000..c4a04d5450
--- /dev/null
+++ b/backends/platform/bada/README.TXT
@@ -0,0 +1,92 @@
+Build instructions:
+
+1. Install BADA SDK (requires free registration):
+
+ http://developer.bada.com/apis/index.do
+
+2. Install Cygwin:
+
+ http://www.cygwin.com/
+
+ Add the following to your cygwin .bash_profile:
+
+ alias mmake=/cygdrive/c/MinGW/bin/mingw32-make.exe
+ export BADA_SDK=/cygdrive/c/bada/1.2.1
+ export ARM_BIN=c:/bada/1.2.1/Tools/Toolchains/ARM/bin
+ export CPPFLAGS="-fpic -fshort-wchar -mcpu=cortex-a8 -mfpu=vfpv3 \
+ -mfloat-abi=hard -mlittle-endian -mthumb-interwork -Wno-psabi \
+ -fno-strict-aliasing -fno-short-enums"
+ export LDFLAGS="-nostdlib -lc-newlib -lm-newlib -LC:/bada/1.2.1/Model/Wave_LP1/Target"
+ #export PATH=${BADA_SDK}/Tools/Toolchains/Win32/bin:${PATH}
+ export PATH=${BADA_SDK}/Tools/Toolchains/ARM/bin:~/utils:${PATH}
+ alias gcc=${ARM_BIN}/arm-samsung-nucleuseabi-gcc.exe
+ alias ar=${ARM_BIN}/arm-samsung-nucleuseabi-ar.exe
+
+ The following were added to ~/utils for zlib:
+
+ ar:
+ #!/bin/sh
+ ${ARM_BIN}/arm-samsung-nucleuseabi-ar.exe $*
+
+ gcc:
+ #!/bin/sh
+ ${ARM_BIN}/arm-samsung-nucleuseabi-gcc.exe $*
+
+3. Build dependencies
+
+ zlib, libogg, libvorbis, libmad, FLAC
+
+ see: "Building the libraries" under:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW#Building_the_libraries
+ for instructions on how to obtain these modules
+
+ 3.1 For Target-Release configure ogg and mad with:
+
+ ./configure --host=arm-samsung-nucleuseabi --disable-shared
+
+ when building vorbis and flac:
+
+ ./configure --host=arm-samsung-nucleuseabi --disable-shared --with-ogg=c:/cygwin/usr/local
+
+ 3.2 for each module, after a successful configure, add the following
+ to the generated config.h (gzguts.h for zlib)
+
+ #undef __MINGW32__
+ #undef _WIN32
+ #include "c:/src/scummvm/backends/platform/bada/portdefs.h"
+
+ 3.3 Additional post configure edits:
+
+ - removed -fforce-mem from the libMAD Makefile
+ - in libvorbis/lib/Makefile comment lines with vorbis_selftests
+ - edit libFLAC/Makefile ... CFLAGS = $(OGG_CFLAGS)
+
+ Note: you can ignore the ranlib errors when doing make install.
+
+4. Build the ScummVM base library:
+
+ ./configure --host=bada --enable-release
+
+ To target the Win32 simulator:
+
+ ./configure --host=bada --enable-debug
+
+5. Build the front end application using BADA-Ide:
+
+ Copy the scummvm/dists/bada folder into a clean directory
+ outside of the scummvm package. Start the BADA IDE then
+ choose this folder as the eclipse workspace. Click
+ Project / Build.
+
+Links:
+
+A short turorial on implementing OpenGL ES 1.1 in BADA:
+ http://forums.badadev.com/viewtopic.php?f=7&t=208
+
+HelvB14 font files:
+ http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html
+ http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts-75dpi100dpi.tar.gz
+
+ Then run the following command:
+ $ ./ucs2any.pl 100dpi/helvB14.bdf MAPPINGS/8859-1.TXT iso8859-1 \
+ MAPPINGS/8859-2.TXT iso8859-2 MAPPINGS/8859-3.TXT iso8859-3
diff --git a/backends/platform/bada/application.cpp b/backends/platform/bada/application.cpp
new file mode 100644
index 0000000000..bf585d2782
--- /dev/null
+++ b/backends/platform/bada/application.cpp
@@ -0,0 +1,111 @@
+/* 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.
+ *
+ */
+
+#include "engines/engine.h"
+
+#include "backends/platform/bada/form.h"
+#include "backends/platform/bada/system.h"
+#include "backends/platform/bada/application.h"
+
+using namespace Osp::System;
+using namespace Osp::Ui::Controls;
+
+Application *BadaScummVM::createInstance() {
+ return new BadaScummVM();
+}
+
+BadaScummVM::BadaScummVM() : _appForm(0) {
+}
+
+BadaScummVM::~BadaScummVM() {
+ logEntered();
+ if (g_system) {
+ BadaSystem *system = (BadaSystem *)g_system;
+ system->destroyBackend();
+ delete system;
+ g_system = 0;
+ }
+}
+
+bool BadaScummVM::OnAppInitializing(AppRegistry &appRegistry) {
+ _appForm = systemStart(this);
+ return (_appForm != NULL);
+}
+
+bool BadaScummVM::OnAppTerminating(AppRegistry &appRegistry,
+ bool forcedTermination) {
+ logEntered();
+ return true;
+}
+
+void BadaScummVM::OnUserEventReceivedN(RequestId requestId,
+ Osp::Base::Collection::IList *args) {
+ logEntered();
+
+ if (requestId == USER_MESSAGE_EXIT) {
+ // normal program termination
+ Terminate();
+ } else if (requestId == USER_MESSAGE_EXIT_ERR) {
+ // assertion failure termination
+ String *message = NULL;
+ if (args) {
+ message = (String*)args->GetAt(0);
+ }
+ if (!message) {
+ message = new String("Unknown error");
+ }
+
+ MessageBox messageBox;
+ messageBox.Construct(L"Oops...", *message, MSGBOX_STYLE_OK);
+ int modalResult;
+ messageBox.ShowAndWait(modalResult);
+ Terminate();
+ }
+}
+
+void BadaScummVM::OnForeground(void) {
+ logEntered();
+ pauseGame(false);
+}
+
+void BadaScummVM::OnBackground(void) {
+ logEntered();
+ pauseGame(true);
+}
+
+void BadaScummVM::OnBatteryLevelChanged(BatteryLevel batteryLevel) {
+}
+
+void BadaScummVM::OnLowMemory(void) {
+}
+
+void BadaScummVM::pauseGame(bool pause) {
+ if (_appForm) {
+ if (pause && g_engine && !g_engine->isPaused()) {
+ _appForm->pushKey(Common::KEYCODE_SPACE);
+ }
+
+ if (g_system) {
+ ((BadaSystem *)g_system)->setMute(pause);
+ }
+ }
+}
diff --git a/backends/platform/bada/application.h b/backends/platform/bada/application.h
new file mode 100644
index 0000000000..2b0d37f1ef
--- /dev/null
+++ b/backends/platform/bada/application.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.
+ *
+ */
+
+#ifndef BADA_APPLICATION_H
+#define BADA_APPLICATION_H
+
+#include <FBase.h>
+#include <FApp.h>
+#include <FGraphics.h>
+#include <FUi.h>
+#include <FSystem.h>
+
+#include "backends/platform/bada/system.h"
+
+class BadaScummVM : public Osp::App::Application {
+public:
+ BadaScummVM();
+ ~BadaScummVM();
+
+ static Osp::App::Application *createInstance(void);
+
+ bool OnAppInitializing(Osp::App::AppRegistry &appRegistry);
+ bool OnAppTerminating(Osp::App::AppRegistry &appRegistry, bool forcedTermination = false);
+ void OnForeground(void);
+ void OnBackground(void);
+ void OnLowMemory(void);
+ void OnBatteryLevelChanged(Osp::System::BatteryLevel batteryLevel);
+ void OnUserEventReceivedN(RequestId requestId, Osp::Base::Collection::IList *pArgs);
+
+private:
+ void pauseGame(bool pause);
+ BadaAppForm *_appForm;
+};
+
+#endif
diff --git a/backends/platform/bada/audio.cpp b/backends/platform/bada/audio.cpp
new file mode 100644
index 0000000000..b868e91357
--- /dev/null
+++ b/backends/platform/bada/audio.cpp
@@ -0,0 +1,260 @@
+/* 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.
+ *
+ */
+
+#include <FSysSettingInfo.h>
+#include <FAppAppRegistry.h>
+
+#include "backends/platform/bada/audio.h"
+#include "backends/platform/bada/system.h"
+
+#define TIMER_INCREMENT 10
+#define TIMER_INTERVAL 40
+#define MIN_TIMER_INTERVAL 10
+#define MAX_TIMER_INTERVAL 160
+#define INIT_LEVEL 3
+#define CONFIG_KEY L"audiovol"
+
+// sound level pre-sets
+const int levels[] = {0, 1, 10, 45, 70, 99};
+
+AudioThread::AudioThread() :
+ _mixer(0),
+ _timer(0),
+ _audioOut(0),
+ _head(0),
+ _tail(0),
+ _ready(0),
+ _interval(TIMER_INTERVAL),
+ _playing(-1),
+ _muted(true) {
+}
+
+Audio::MixerImpl *AudioThread::Construct(OSystem *system) {
+ logEntered();
+
+ if (IsFailed(Thread::Construct(THREAD_TYPE_EVENT_DRIVEN,
+ DEFAULT_STACK_SIZE,
+ THREAD_PRIORITY_HIGH))) {
+ AppLog("Failed to create AudioThread");
+ return NULL;
+ }
+
+ _mixer = new Audio::MixerImpl(system, 44100);
+ return _mixer;
+}
+
+AudioThread::~AudioThread() {
+ logEntered();
+}
+
+bool AudioThread::isSilentMode() {
+ bool silentMode;
+ String key(L"SilentMode");
+ Osp::System::SettingInfo::GetValue(key, silentMode);
+ return silentMode;
+}
+
+void AudioThread::setMute(bool on) {
+ if (_audioOut && _timer) {
+ _muted = on;
+ if (on) {
+ _timer->Cancel();
+ } else {
+ _timer->Start(_interval);
+ }
+ }
+}
+
+int AudioThread::setVolume(bool up, bool minMax) {
+ int level = -1;
+ int numLevels = sizeof(levels) / sizeof(levels[0]);
+
+ if (_audioOut) {
+ int volume = _audioOut->GetVolume();
+ if (minMax) {
+ level = up ? numLevels - 1 : 0;
+ volume = levels[level];
+ } else {
+ // adjust volume to be one of the preset values
+ for (int i = 0; i < numLevels && level == -1; i++) {
+ if (volume == levels[i]) {
+ level = i;
+ if (up) {
+ if (i + 1 < numLevels) {
+ level = i + 1;
+ }
+ } else if (i > 0) {
+ level = i - 1;
+ }
+ }
+ }
+
+ // default to INIT_LEVEL when current not preset value
+ if (level == -1) {
+ level = INIT_LEVEL;
+ }
+ volume = levels[level];
+ }
+
+ _audioOut->SetVolume(volume);
+
+ // remember the chosen setting
+ AppRegistry *registry = Application::GetInstance()->GetAppRegistry();
+ if (registry) {
+ registry->Set(CONFIG_KEY, volume);
+ }
+ }
+ return level;
+}
+
+bool AudioThread::OnStart(void) {
+ logEntered();
+
+ _audioOut = new Osp::Media::AudioOut();
+ if (!_audioOut ||
+ IsFailed(_audioOut->Construct(*this))) {
+ AppLog("Failed to create AudioOut");
+ return false;
+ }
+
+ int sampleRate = _mixer->getOutputRate();
+
+ // ideally we would update _mixer with GetOptimizedSampleRate here
+ if (_audioOut->GetOptimizedSampleRate() != sampleRate) {
+ AppLog("Non optimal sample rate %d", _audioOut->GetOptimizedSampleRate());
+ }
+
+ if (IsFailed(_audioOut->Prepare(AUDIO_TYPE_PCM_S16_LE,
+ AUDIO_CHANNEL_TYPE_STEREO,
+ sampleRate))) {
+ AppLog("Failed to prepare AudioOut %d", sampleRate);
+ return false;
+ }
+
+ int bufferSize = _audioOut->GetMinBufferSize();
+ for (int i = 0; i < NUM_AUDIO_BUFFERS; i++) {
+ if (IsFailed(_audioBuffer[i].Construct(bufferSize))) {
+ AppLog("Failed to create audio buffer");
+ return false;
+ }
+ }
+
+ _timer = new Timer();
+ if (!_timer || IsFailed(_timer->Construct(*this))) {
+ AppLog("Failed to create audio timer");
+ return false;
+ }
+
+ if (IsFailed(_timer->Start(_interval))) {
+ AppLog("failed to start audio timer");
+ return false;
+ }
+
+ // get the volume from the app-registry
+ int volume = levels[INIT_LEVEL];
+ AppRegistry *registry = Application::GetInstance()->GetAppRegistry();
+ if (registry) {
+ if (E_KEY_NOT_FOUND == registry->Get(CONFIG_KEY, volume)) {
+ registry->Add(CONFIG_KEY, volume);
+ volume = levels[INIT_LEVEL];
+ } else {
+ AppLog("Setting volume: %d", volume);
+ }
+ }
+
+ _muted = false;
+ _mixer->setReady(true);
+ _audioOut->SetVolume(isSilentMode() ? 0 : volume);
+ _audioOut->Start();
+ return true;
+}
+
+void AudioThread::OnStop(void) {
+ logEntered();
+
+ _mixer->setReady(false);
+
+ if (_timer) {
+ if (!_muted) {
+ _timer->Cancel();
+ }
+ delete _timer;
+ }
+
+ if (_audioOut) {
+ _audioOut->Reset();
+ delete _audioOut;
+ }
+}
+
+void AudioThread::OnAudioOutErrorOccurred(Osp::Media::AudioOut &src, result r) {
+ logEntered();
+}
+
+void AudioThread::OnAudioOutInterrupted(Osp::Media::AudioOut &src) {
+ logEntered();
+}
+
+void AudioThread::OnAudioOutReleased(Osp::Media::AudioOut &src) {
+ logEntered();
+ _audioOut->Start();
+}
+
+void AudioThread::OnAudioOutBufferEndReached(Osp::Media::AudioOut &src) {
+ if (_ready > 0) {
+ _playing = _tail;
+ _audioOut->WriteBuffer(_audioBuffer[_tail]);
+ _tail = (_tail + 1) % NUM_AUDIO_BUFFERS;
+ _ready--;
+ } else {
+ // audio buffer empty: decrease timer inverval
+ _playing = -1;
+ _interval -= TIMER_INCREMENT;
+ if (_interval < MIN_TIMER_INTERVAL) {
+ _interval = MIN_TIMER_INTERVAL;
+ }
+ }
+}
+
+void AudioThread::OnTimerExpired(Timer &timer) {
+ if (_ready < NUM_AUDIO_BUFFERS) {
+ uint len = _audioBuffer[_head].GetCapacity();
+ int samples = _mixer->mixCallback((byte*)_audioBuffer[_head].GetPointer(), len);
+ if (samples) {
+ _head = (_head + 1) % NUM_AUDIO_BUFFERS;
+ _ready++;
+ }
+ } else {
+ // audio buffer full: increase timer inverval
+ _interval += TIMER_INCREMENT;
+ if (_interval > MAX_TIMER_INTERVAL) {
+ _interval = MAX_TIMER_INTERVAL;
+ }
+ }
+
+ if (_ready && _playing == -1) {
+ OnAudioOutBufferEndReached(*_audioOut);
+ }
+
+ _timer->Start(_interval);
+}
+
diff --git a/backends/platform/bada/audio.h b/backends/platform/bada/audio.h
new file mode 100644
index 0000000000..72c537a942
--- /dev/null
+++ b/backends/platform/bada/audio.h
@@ -0,0 +1,73 @@
+/* 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 BADA_AUDIO_H
+#define BADA_AUDIO_H
+
+#include <FBase.h>
+#include <FMedia.h>
+#include <FIo.h>
+#include <FBaseByteBuffer.h>
+
+#include "config.h"
+#include "common/scummsys.h"
+#include "common/system.h"
+#include "audio/mixer_intern.h"
+
+using namespace Osp::Base;
+using namespace Osp::Base::Collection;
+using namespace Osp::Base::Runtime;
+using namespace Osp::Media;
+using namespace Osp::Io;
+
+#define NUM_AUDIO_BUFFERS 2
+
+class AudioThread: public Osp::Media::IAudioOutEventListener,
+ public Osp::Base::Runtime::ITimerEventListener,
+ public Osp::Base::Runtime::Thread {
+public:
+ AudioThread(void);
+ ~AudioThread(void);
+
+ Audio::MixerImpl *Construct(OSystem *system);
+ bool isSilentMode();
+ void setMute(bool on);
+ int setVolume(bool up, bool minMax);
+
+ bool OnStart(void);
+ void OnStop(void);
+ void OnAudioOutErrorOccurred(Osp::Media::AudioOut &src, result r);
+ void OnAudioOutInterrupted(Osp::Media::AudioOut &src);
+ void OnAudioOutReleased(Osp::Media::AudioOut &src);
+ void OnAudioOutBufferEndReached(Osp::Media::AudioOut &src);
+ void OnTimerExpired(Timer &timer);
+
+private:
+ Audio::MixerImpl *_mixer;
+ Osp::Base::Runtime::Timer *_timer;
+ Osp::Media::AudioOut *_audioOut;
+ Osp::Base::ByteBuffer _audioBuffer[NUM_AUDIO_BUFFERS];
+ int _head, _tail, _ready, _interval, _playing;
+ bool _muted;
+};
+
+#endif
diff --git a/backends/platform/bada/bada.mk b/backends/platform/bada/bada.mk
new file mode 100644
index 0000000000..7c72d7752b
--- /dev/null
+++ b/backends/platform/bada/bada.mk
@@ -0,0 +1,5 @@
+# Bada specific modules are built under eclipse
+
+$(EXECUTABLE): $(OBJS)
+ rm -f $@
+ ar Tru $@ $(OBJS)
diff --git a/backends/platform/bada/form.cpp b/backends/platform/bada/form.cpp
new file mode 100644
index 0000000000..dfa72bce08
--- /dev/null
+++ b/backends/platform/bada/form.cpp
@@ -0,0 +1,464 @@
+/* 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.
+ *
+ */
+
+#include <FAppApplication.h>
+
+#include "common/translation.h"
+#include "base/main.h"
+
+#include "backends/platform/bada/form.h"
+#include "backends/platform/bada/system.h"
+
+using namespace Osp::Base::Runtime;
+using namespace Osp::Ui;
+using namespace Osp::Ui::Controls;
+
+// number of volume levels
+#define LEVEL_RANGE 5
+
+// round down small Y touch values to 1 to allow the
+// cursor to be positioned at the top of the screen
+#define MIN_TOUCH_Y 10
+
+// block for up to 2.5 seconds during shutdown to
+// allow the game thread to exit gracefully.
+#define EXIT_SLEEP_STEP 10
+#define EXIT_SLEEP 250
+
+//
+// BadaAppForm
+//
+BadaAppForm::BadaAppForm() :
+ _gameThread(0),
+ _state(kInitState),
+ _buttonState(kLeftButton),
+ _shortcut(kSetVolume) {
+ _eventQueueLock = new Mutex();
+ _eventQueueLock->Create();
+}
+
+result BadaAppForm::Construct() {
+ result r = Form::Construct(Controls::FORM_STYLE_NORMAL);
+ if (IsFailed(r)) {
+ return r;
+ }
+
+ BadaSystem *badaSystem = NULL;
+ _gameThread = NULL;
+
+ badaSystem = new BadaSystem(this);
+ r = badaSystem != NULL ? E_SUCCESS : E_OUT_OF_MEMORY;
+
+ if (!IsFailed(r)) {
+ r = badaSystem->Construct();
+ }
+
+ if (!IsFailed(r)) {
+ _gameThread = new Thread();
+ r = _gameThread != NULL ? E_SUCCESS : E_OUT_OF_MEMORY;
+ }
+
+ if (!IsFailed(r)) {
+ r = _gameThread->Construct(*this);
+ }
+
+ if (IsFailed(r)) {
+ if (badaSystem != NULL) {
+ delete badaSystem;
+ }
+ if (_gameThread != NULL) {
+ delete _gameThread;
+ _gameThread = NULL;
+ }
+ } else {
+ g_system = badaSystem;
+ }
+
+ return r;
+}
+
+BadaAppForm::~BadaAppForm() {
+ logEntered();
+
+ if (_gameThread && _state != kErrorState) {
+ terminate();
+
+ _gameThread->Stop();
+ if (_state != kErrorState) {
+ _gameThread->Join();
+ }
+
+ delete _gameThread;
+ _gameThread = NULL;
+ }
+
+ if (_eventQueueLock) {
+ delete _eventQueueLock;
+ _eventQueueLock = NULL;
+ }
+
+ logLeaving();
+}
+
+//
+// abort the game thread
+//
+void BadaAppForm::terminate() {
+ if (_state == kActiveState) {
+ ((BadaSystem *)g_system)->setMute(true);
+
+ _eventQueueLock->Acquire();
+
+ Common::Event e;
+ e.type = Common::EVENT_QUIT;
+ _eventQueue.push(e);
+ _state = kClosingState;
+
+ _eventQueueLock->Release();
+
+ // block while thread ends
+ AppLog("waiting for shutdown");
+ for (int i = 0; i < EXIT_SLEEP_STEP && _state == kClosingState; i++) {
+ Thread::Sleep(EXIT_SLEEP);
+ }
+
+ if (_state == kClosingState) {
+ // failed to terminate - Join() will freeze
+ _state = kErrorState;
+ }
+ }
+}
+
+void BadaAppForm::exitSystem() {
+ _state = kErrorState;
+
+ if (_gameThread) {
+ _gameThread->Stop();
+ delete _gameThread;
+ _gameThread = NULL;
+ }
+}
+
+result BadaAppForm::OnInitializing(void) {
+ logEntered();
+
+ SetOrientation(ORIENTATION_LANDSCAPE);
+ AddOrientationEventListener(*this);
+ AddTouchEventListener(*this);
+ AddKeyEventListener(*this);
+
+ // set focus to enable receiving key events
+ SetFocusable(true);
+ SetFocus();
+
+ return E_SUCCESS;
+}
+
+result BadaAppForm::OnDraw(void) {
+ logEntered();
+
+ if (g_system) {
+ BadaSystem *system = (BadaSystem *)g_system;
+ BadaGraphicsManager *graphics = system->getGraphics();
+ if (graphics && graphics->isReady()) {
+ g_system->updateScreen();
+ }
+ }
+
+ return E_SUCCESS;
+}
+
+bool BadaAppForm::pollEvent(Common::Event &event) {
+ bool result = false;
+
+ _eventQueueLock->Acquire();
+ if (!_eventQueue.empty()) {
+ event = _eventQueue.pop();
+ result = true;
+ }
+ _eventQueueLock->Release();
+
+ return result;
+}
+
+void BadaAppForm::pushEvent(Common::EventType type, const Point &currentPosition) {
+ BadaSystem *system = (BadaSystem *)g_system;
+ BadaGraphicsManager *graphics = system->getGraphics();
+ if (graphics) {
+ // graphics could be NULL at startup or when
+ // displaying the system error screen
+ Common::Event e;
+ e.type = type;
+ e.mouse.x = currentPosition.x;
+ e.mouse.y = currentPosition.y > MIN_TOUCH_Y ? currentPosition.y : 1;
+
+ bool moved = graphics->moveMouse(e.mouse.x, e.mouse.y);
+
+ _eventQueueLock->Acquire();
+
+ if (moved && type != Common::EVENT_MOUSEMOVE) {
+ Common::Event moveEvent;
+ moveEvent.type = Common::EVENT_MOUSEMOVE;
+ moveEvent.mouse = e.mouse;
+ _eventQueue.push(moveEvent);
+ }
+
+ _eventQueue.push(e);
+ _eventQueueLock->Release();
+ }
+}
+
+void BadaAppForm::pushKey(Common::KeyCode keycode) {
+ Common::Event e;
+ e.synthetic = false;
+ e.kbd.keycode = keycode;
+ e.kbd.ascii = keycode;
+ e.kbd.flags = 0;
+
+ _eventQueueLock->Acquire();
+
+ e.type = Common::EVENT_KEYDOWN;
+ _eventQueue.push(e);
+ e.type = Common::EVENT_KEYUP;
+ _eventQueue.push(e);
+
+ _eventQueueLock->Release();
+}
+
+void BadaAppForm::OnOrientationChanged(const Control &source,
+ OrientationStatus orientationStatus) {
+ logEntered();
+ if (_state == kInitState) {
+ _state = kActiveState;
+ _gameThread->Start();
+ }
+}
+
+Object *BadaAppForm::Run(void) {
+ scummvm_main(0, 0);
+
+ if (_state == kActiveState) {
+ Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT, NULL);
+ }
+ _state = kDoneState;
+ return NULL;
+}
+
+void BadaAppForm::setButtonShortcut() {
+ switch (_buttonState) {
+ case kLeftButton:
+ g_system->displayMessageOnOSD(_("Right Click Once"));
+ _buttonState = kRightButtonOnce;
+ break;
+ case kRightButtonOnce:
+ g_system->displayMessageOnOSD(_("Right Click"));
+ _buttonState = kRightButton;
+ break;
+ case kRightButton:
+ g_system->displayMessageOnOSD(_("Move Only"));
+ _buttonState = kMoveOnly;
+ break;
+ case kMoveOnly:
+ g_system->displayMessageOnOSD(_("Left Click"));
+ _buttonState = kLeftButton;
+ break;
+ }
+}
+
+void BadaAppForm::setShortcut() {
+ // cycle to the next shortcut
+ switch (_shortcut) {
+ case kControlMouse:
+ g_system->displayMessageOnOSD(_("Escape Key"));
+ _shortcut = kEscapeKey;
+ break;
+
+ case kEscapeKey:
+ g_system->displayMessageOnOSD(_("Game Menu"));
+ _shortcut = kGameMenu;
+ break;
+
+ case kGameMenu:
+ g_system->displayMessageOnOSD(_("Show Keypad"));
+ _shortcut = kShowKeypad;
+ break;
+
+ case kSetVolume:
+ // fallthru
+
+ case kShowKeypad:
+ g_system->displayMessageOnOSD(_("Control Mouse"));
+ _shortcut = kControlMouse;
+ break;
+ }
+}
+
+void BadaAppForm::setVolume(bool up, bool minMax) {
+ int level = ((BadaSystem *)g_system)->setVolume(up, minMax);
+ if (level != -1) {
+ char message[32];
+ char ind[LEVEL_RANGE]; // 1..5 (0=off)
+ int j = LEVEL_RANGE - 1; // 0..4
+ for (int i = 1; i <= LEVEL_RANGE; i++) {
+ ind[j--] = level >= i ? '|' : ' ';
+ }
+ snprintf(message, sizeof(message), "Volume: [ %c%c%c%c%c ]",
+ ind[0], ind[1], ind[2], ind[3], ind[4]);
+ g_system->displayMessageOnOSD(message);
+ }
+}
+
+void BadaAppForm::showKeypad() {
+ // display the soft keyboard
+ _buttonState = kLeftButton;
+ pushKey(Common::KEYCODE_F7);
+}
+
+void BadaAppForm::OnTouchDoublePressed(const Control &source,
+ const Point &currentPosition,
+ const TouchEventInfo &touchInfo) {
+ if (_buttonState != kMoveOnly) {
+ pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN,
+ currentPosition);
+ pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN,
+ currentPosition);
+ }
+}
+
+void BadaAppForm::OnTouchFocusIn(const Control &source,
+ const Point &currentPosition,
+ const TouchEventInfo &touchInfo) {
+}
+
+void BadaAppForm::OnTouchFocusOut(const Control &source,
+ const Point &currentPosition,
+ const TouchEventInfo &touchInfo) {
+}
+
+void BadaAppForm::OnTouchLongPressed(const Control &source,
+ const Point &currentPosition,
+ const TouchEventInfo &touchInfo) {
+ if (_buttonState != kLeftButton) {
+ pushKey(Common::KEYCODE_RETURN);
+ }
+}
+
+void BadaAppForm::OnTouchMoved(const Control &source,
+ const Point &currentPosition,
+ const TouchEventInfo &touchInfo) {
+ pushEvent(Common::EVENT_MOUSEMOVE, currentPosition);
+}
+
+void BadaAppForm::OnTouchPressed(const Control &source,
+ const Point &currentPosition,
+ const TouchEventInfo &touchInfo) {
+ if (_buttonState != kMoveOnly) {
+ pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN,
+ currentPosition);
+ }
+}
+
+void BadaAppForm::OnTouchReleased(const Control &source,
+ const Point &currentPosition,
+ const TouchEventInfo &touchInfo) {
+ if (_buttonState != kMoveOnly) {
+ pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONUP : Common::EVENT_RBUTTONUP,
+ currentPosition);
+ if (_buttonState == kRightButtonOnce) {
+ _buttonState = kLeftButton;
+ }
+ // flick to skip dialog
+ if (touchInfo.IsFlicked()) {
+ pushKey(Common::KEYCODE_PERIOD);
+ }
+ }
+}
+
+void BadaAppForm::OnKeyLongPressed(const Control &source, KeyCode keyCode) {
+ logEntered();
+ switch (keyCode) {
+ case KEY_SIDE_UP:
+ _shortcut = kSetVolume;
+ setVolume(true, true);
+ return;
+
+ case KEY_SIDE_DOWN:
+ _shortcut = kSetVolume;
+ setVolume(false, true);
+ return;
+
+ case KEY_CAMERA:
+ _shortcut = kShowKeypad;
+ showKeypad();
+ return;
+
+ default:
+ break;
+ }
+}
+
+void BadaAppForm::OnKeyPressed(const Control &source, KeyCode keyCode) {
+ switch (keyCode) {
+ case KEY_SIDE_UP:
+ if (_shortcut != kSetVolume) {
+ _shortcut = kSetVolume;
+ } else {
+ setVolume(true, false);
+ }
+ return;
+
+ case KEY_SIDE_DOWN:
+ switch (_shortcut) {
+ case kControlMouse:
+ setButtonShortcut();
+ break;
+
+ case kEscapeKey:
+ pushKey(Common::KEYCODE_ESCAPE);
+ break;
+
+ case kGameMenu:
+ _buttonState = kLeftButton;
+ pushKey(Common::KEYCODE_F5);
+ break;
+
+ case kShowKeypad:
+ showKeypad();
+ break;
+
+ default:
+ setVolume(false, false);
+ break;
+ }
+ break;
+
+ case KEY_CAMERA:
+ setShortcut();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void BadaAppForm::OnKeyReleased(const Control &source, KeyCode keyCode) {
+}
diff --git a/backends/platform/bada/form.h b/backends/platform/bada/form.h
new file mode 100644
index 0000000000..3340e2216b
--- /dev/null
+++ b/backends/platform/bada/form.h
@@ -0,0 +1,108 @@
+/* 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 BADA_FORM_H
+#define BADA_FORM_H
+
+#include <FApp.h>
+#include <FUi.h>
+#include <FSystem.h>
+#include <FBase.h>
+#include <FUiITouchEventListener.h>
+#include <FUiITextEventListener.h>
+
+#include "config.h"
+#include "common/scummsys.h"
+#include "common/events.h"
+#include "common/queue.h"
+#include "common/mutex.h"
+
+//
+// BadaAppForm
+//
+class BadaAppForm : public Osp::Ui::Controls::Form,
+ public Osp::Ui::IOrientationEventListener,
+ public Osp::Ui::ITouchEventListener,
+ public Osp::Ui::IKeyEventListener,
+ public Osp::Base::Runtime::IRunnable {
+public:
+ BadaAppForm();
+ ~BadaAppForm();
+
+ result Construct();
+ bool pollEvent(Common::Event &event);
+ bool isClosing() { return _state == kClosingState; }
+ void pushKey(Common::KeyCode keycode);
+ void exitSystem();
+
+private:
+ Object *Run();
+ result OnInitializing(void);
+ result OnDraw(void);
+ void OnOrientationChanged(const Osp::Ui::Control &source,
+ Osp::Ui::OrientationStatus orientationStatus);
+ void OnTouchDoublePressed(const Osp::Ui::Control &source,
+ const Osp::Graphics::Point &currentPosition,
+ const Osp::Ui::TouchEventInfo &touchInfo);
+ void OnTouchFocusIn(const Osp::Ui::Control &source,
+ const Osp::Graphics::Point &currentPosition,
+ const Osp::Ui::TouchEventInfo &touchInfo);
+ void OnTouchFocusOut(const Osp::Ui::Control &source,
+ const Osp::Graphics::Point &currentPosition,
+ const Osp::Ui::TouchEventInfo &touchInfo);
+ void OnTouchLongPressed(const Osp::Ui::Control &source,
+ const Osp::Graphics::Point &currentPosition,
+ const Osp::Ui::TouchEventInfo &touchInfo);
+ void OnTouchMoved(const Osp::Ui::Control &source,
+ const Osp::Graphics::Point &currentPosition,
+ const Osp::Ui::TouchEventInfo &touchInfo);
+ void OnTouchPressed(const Osp::Ui::Control &source,
+ const Osp::Graphics::Point &currentPosition,
+ const Osp::Ui::TouchEventInfo &touchInfo);
+ void OnTouchReleased(const Osp::Ui::Control &source,
+ const Osp::Graphics::Point &currentPosition,
+ const Osp::Ui::TouchEventInfo &touchInfo);
+ void OnKeyLongPressed(const Osp::Ui::Control &source,
+ Osp::Ui::KeyCode keyCode);
+ void OnKeyPressed(const Osp::Ui::Control &source,
+ Osp::Ui::KeyCode keyCode);
+ void OnKeyReleased(const Osp::Ui::Control &source,
+ Osp::Ui::KeyCode keyCode);
+
+ void pushEvent(Common::EventType type,
+ const Osp::Graphics::Point &currentPosition);
+ void terminate();
+ void setButtonShortcut();
+ void setShortcut();
+ void setVolume(bool up, bool minMax);
+ void showKeypad();
+
+ // event handling
+ Osp::Base::Runtime::Thread *_gameThread;
+ Osp::Base::Runtime::Mutex *_eventQueueLock;
+ Common::Queue<Common::Event> _eventQueue;
+ enum { kInitState, kActiveState, kClosingState, kDoneState, kErrorState } _state;
+ enum { kLeftButton, kRightButtonOnce, kRightButton, kMoveOnly } _buttonState;
+ enum { kControlMouse, kEscapeKey, kGameMenu, kShowKeypad, kSetVolume } _shortcut;
+};
+
+#endif
diff --git a/backends/platform/bada/fs.cpp b/backends/platform/bada/fs.cpp
new file mode 100644
index 0000000000..0ae0cde43d
--- /dev/null
+++ b/backends/platform/bada/fs.cpp
@@ -0,0 +1,435 @@
+/* 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.
+ */
+
+#include "config.h"
+#include "backends/platform/bada/system.h"
+#include "backends/platform/bada/fs.h"
+
+#define BUFFER_SIZE 1024
+
+// internal BADA paths
+#define PATH_ROOT "/"
+#define PATH_HOME "/Home"
+#define PATH_HOME_SHARE "/Home/Share"
+#define PATH_HOME_SHARE2 "/Home/Share2"
+#define PATH_HOME_X "/Home/"
+#define PATH_HOME_EXT "/HomeExt"
+#define PATH_MEDIA "/Media"
+#define PATH_CARD "/Storagecard"
+#define PATH_CARD_MEDIA "/Storagecard/Media"
+
+//
+// BadaFileStream
+//
+class BadaFileStream : public Common::SeekableReadStream,
+ public Common::WriteStream,
+ public Common::NonCopyable {
+public:
+ static BadaFileStream *makeFromPath(const String &path, bool writeMode);
+
+ BadaFileStream(File *file, bool writeMode);
+ ~BadaFileStream();
+
+ bool err() const;
+ void clearErr();
+ bool eos() const;
+
+ uint32 write(const void *dataPtr, uint32 dataSize);
+ bool flush();
+
+ int32 pos() const;
+ int32 size() const;
+ bool seek(int32 offs, int whence = SEEK_SET);
+ uint32 read(void *dataPtr, uint32 dataSize);
+
+private:
+ byte buffer[BUFFER_SIZE];
+ uint32 bufferIndex;
+ uint32 bufferLength;
+ bool writeMode;
+ File *file;
+};
+
+BadaFileStream::BadaFileStream(File *ioFile, bool writeMode) :
+ bufferIndex(0),
+ bufferLength(0),
+ writeMode(writeMode),
+ file(ioFile) {
+ AppAssert(ioFile != 0);
+}
+
+BadaFileStream::~BadaFileStream() {
+ if (file) {
+ if (writeMode) {
+ flush();
+ }
+ delete file;
+ }
+}
+
+bool BadaFileStream::err() const {
+ result r = GetLastResult();
+ return (r != E_SUCCESS && r != E_END_OF_FILE);
+}
+
+void BadaFileStream::clearErr() {
+ SetLastResult(E_SUCCESS);
+}
+
+bool BadaFileStream::eos() const {
+ return (bufferLength - bufferIndex == 0) && (GetLastResult() == E_END_OF_FILE);
+}
+
+int32 BadaFileStream::pos() const {
+ return file->Tell() - (bufferLength - bufferIndex);
+}
+
+int32 BadaFileStream::size() const {
+ int32 oldPos = file->Tell();
+ file->Seek(FILESEEKPOSITION_END, 0);
+
+ int32 length = file->Tell();
+ SetLastResult(file->Seek(FILESEEKPOSITION_BEGIN, oldPos));
+
+ return length;
+}
+
+bool BadaFileStream::seek(int32 offs, int whence) {
+ bool result = false;
+ switch (whence) {
+ case SEEK_SET:
+ // set from start of file
+ SetLastResult(file->Seek(FILESEEKPOSITION_BEGIN, offs));
+ result = (E_SUCCESS == GetLastResult());
+ break;
+
+ case SEEK_CUR:
+ // set relative to offs
+ if (bufferIndex < bufferLength && bufferIndex > (uint32)-offs) {
+ // re-position within the buffer
+ SetLastResult(E_SUCCESS);
+ bufferIndex += offs;
+ return true;
+ } else {
+ offs -= (bufferLength - bufferIndex);
+ if (offs < 0 && file->Tell() + offs < 0) {
+ // avoid negative positioning
+ offs = 0;
+ }
+ if (offs != 0) {
+ SetLastResult(file->Seek(FILESEEKPOSITION_CURRENT, offs));
+ result = (E_SUCCESS == GetLastResult());
+ } else {
+ result = true;
+ }
+ }
+ break;
+
+ case SEEK_END:
+ // set relative to end - positive will increase the file size
+ SetLastResult(file->Seek(FILESEEKPOSITION_END, offs));
+ result = (E_SUCCESS == GetLastResult());
+ break;
+
+ default:
+ AppLog("Invalid whence %d", whence);
+ return false;
+ }
+
+ if (!result) {
+ AppLog("seek failed");
+ }
+
+ bufferIndex = bufferLength = 0;
+ return result;
+}
+
+uint32 BadaFileStream::read(void *ptr, uint32 len) {
+ uint32 result = 0;
+ if (!eos()) {
+ if (bufferIndex < bufferLength) {
+ // use existing buffer
+ uint32 available = bufferLength - bufferIndex;
+ if (len <= available) {
+ // use allocation
+ memcpy((byte*)ptr, &buffer[bufferIndex], len);
+ bufferIndex += len;
+ result = len;
+ } else {
+ // use remaining allocation
+ memcpy((byte*)ptr, &buffer[bufferIndex], available);
+ uint32 remaining = len - available;
+ result = available;
+
+ if (remaining) {
+ result += file->Read(((byte*)ptr) + available, remaining);
+ }
+ bufferIndex = bufferLength = 0;
+ }
+ } else if (len < BUFFER_SIZE) {
+ // allocate and use buffer
+ bufferIndex = 0;
+ bufferLength = file->Read(buffer, BUFFER_SIZE);
+ if (bufferLength) {
+ if (bufferLength < len) {
+ len = bufferLength;
+ }
+ memcpy((byte*)ptr, buffer, len);
+ result = bufferIndex = len;
+ }
+ } else {
+ result = file->Read((byte*)ptr, len);
+ bufferIndex = bufferLength = 0;
+ }
+ } else {
+ AppLog("Attempted to read past EOS");
+ }
+ return result;
+}
+
+uint32 BadaFileStream::write(const void *ptr, uint32 len) {
+ result r = file->Write(ptr, len);
+ SetLastResult(r);
+ return (r == E_SUCCESS ? len : 0);
+}
+
+bool BadaFileStream::flush() {
+ logEntered();
+ SetLastResult(file->Flush());
+ return (E_SUCCESS == GetLastResult());
+}
+
+BadaFileStream *BadaFileStream::makeFromPath(const String &path, bool writeMode) {
+ File *ioFile = new File();
+
+ String filePath = path;
+ if (writeMode && (path[0] != '.' && path[0] != '/')) {
+ filePath.Insert(PATH_HOME_X, 0);
+ }
+
+ AppLog("Open file %S", filePath.GetPointer());
+
+ result r = ioFile->Construct(filePath, writeMode ? L"w" : L"r", writeMode);
+ if (r == E_SUCCESS) {
+ return new BadaFileStream(ioFile, writeMode);
+ }
+
+ AppLog("Failed to open file");
+ delete ioFile;
+ return 0;
+}
+
+//
+// converts a bada (wchar) String into a scummVM (char) string
+//
+Common::String fromString(const Osp::Base::String &in) {
+ ByteBuffer *buf = StringUtil::StringToUtf8N(in);
+ Common::String result((const char*)buf->GetPointer());
+ delete buf;
+
+ return result;
+}
+
+//
+// BadaFilesystemNode
+//
+BadaFilesystemNode::BadaFilesystemNode(const Common::String &nodePath) {
+ AppAssert(nodePath.size() > 0);
+ init(nodePath);
+}
+
+BadaFilesystemNode::BadaFilesystemNode(const Common::String &root,
+ const Common::String &nodePath) {
+ // Make sure the string contains no slashes
+ AppAssert(!nodePath.contains('/'));
+
+ // We assume here that path is already normalized (hence don't bother to
+ // call Common::normalizePath on the final path).
+ Common::String newPath(root);
+ if (root.lastChar() != '/') {
+ newPath += '/';
+ }
+ newPath += nodePath;
+
+ init(newPath);
+}
+
+void BadaFilesystemNode::init(const Common::String &nodePath) {
+ // Normalize the path (that is, remove unneeded slashes etc.)
+ _path = Common::normalizePath(nodePath, '/');
+ _displayName = Common::lastPathComponent(_path, '/');
+
+ StringUtil::Utf8ToString(_path.c_str(), _unicodePath);
+ _isVirtualDir = (_path == PATH_ROOT ||
+ _path == PATH_HOME ||
+ _path == PATH_HOME_SHARE ||
+ _path == PATH_HOME_SHARE2 ||
+ _path == PATH_CARD);
+ _isValid = _isVirtualDir || !IsFailed(File::GetAttributes(_unicodePath, _attr));
+}
+
+bool BadaFilesystemNode::exists() const {
+ return _isValid;
+}
+
+bool BadaFilesystemNode::isReadable() const {
+ return _isVirtualDir || _isValid;
+}
+
+bool BadaFilesystemNode::isDirectory() const {
+ return _isVirtualDir || (_isValid && _attr.IsDirectory());
+}
+
+bool BadaFilesystemNode::isWritable() const {
+ bool result = (_isValid && !_isVirtualDir && !_attr.IsDirectory() && !_attr.IsReadOnly());
+ if (_path == PATH_HOME ||
+ _path == PATH_HOME_EXT ||
+ _path == PATH_HOME_SHARE ||
+ _path == PATH_HOME_SHARE2) {
+ result = true;
+ }
+ return result;
+}
+
+AbstractFSNode *BadaFilesystemNode::getChild(const Common::String &n) const {
+ AppAssert(!_path.empty());
+ AppAssert(isDirectory());
+ return new BadaFilesystemNode(_path, n);
+}
+
+bool BadaFilesystemNode::getChildren(AbstractFSList &myList,
+ ListMode mode, bool hidden) const {
+ AppAssert(isDirectory());
+
+ bool result = false;
+
+ if (_isVirtualDir && mode != Common::FSNode::kListFilesOnly) {
+ // present well known BADA file system areas
+ if (_path == PATH_ROOT) {
+ myList.push_back(new BadaFilesystemNode(PATH_HOME));
+ myList.push_back(new BadaFilesystemNode(PATH_HOME_EXT));
+ myList.push_back(new BadaFilesystemNode(PATH_MEDIA));
+ myList.push_back(new BadaFilesystemNode(PATH_CARD));
+ result = true; // no more entries
+ } else if (_path == PATH_CARD) {
+ myList.push_back(new BadaFilesystemNode(PATH_CARD_MEDIA));
+ result = true; // no more entries
+ } else if (_path == PATH_HOME) {
+ // ensure share path is always included
+ myList.push_back(new BadaFilesystemNode(PATH_HOME_SHARE));
+ myList.push_back(new BadaFilesystemNode(PATH_HOME_SHARE2));
+ }
+ }
+
+ if (!result) {
+ DirEnumerator *pDirEnum = 0;
+ Directory *pDir = new Directory();
+
+ // open directory
+ if (IsFailed(pDir->Construct(_unicodePath))) {
+ AppLog("Failed to open directory: %S", _unicodePath.GetPointer());
+ } else {
+ // read all directory entries
+ pDirEnum = pDir->ReadN();
+ if (pDirEnum) {
+ result = true;
+ }
+
+ // loop through all directory entries
+ while (pDirEnum && pDirEnum->MoveNext() == E_SUCCESS) {
+ DirEntry dirEntry = pDirEnum->GetCurrentDirEntry();
+
+ // skip 'invisible' files if necessary
+ Osp::Base::String fileName = dirEntry.GetName();
+
+ if (fileName[0] == '.' && !hidden) {
+ continue;
+ }
+
+ // skip '.' and '..' to avoid cycles
+ if (fileName == L"." || fileName == L"..") {
+ continue;
+ }
+
+ // Honor the chosen mode
+ if ((mode == Common::FSNode::kListFilesOnly && dirEntry.IsDirectory()) ||
+ (mode == Common::FSNode::kListDirectoriesOnly && !dirEntry.IsDirectory())) {
+ continue;
+ }
+ myList.push_back(new BadaFilesystemNode(_path, fromString(fileName)));
+ }
+ }
+
+ // cleanup
+ if (pDirEnum) {
+ delete pDirEnum;
+ }
+
+ // close the opened directory
+ if (pDir) {
+ delete pDir;
+ }
+ }
+
+ return result;
+}
+
+AbstractFSNode *BadaFilesystemNode::getParent() const {
+ logEntered();
+ if (_path == PATH_ROOT) {
+ return 0; // The filesystem root has no parent
+ }
+
+ const char *start = _path.c_str();
+ const char *end = start + _path.size();
+
+ // Strip of the last component. We make use of the fact that at this
+ // point, path is guaranteed to be normalized
+ while (end > start && *(end-1) != '/') {
+ end--;
+ }
+
+ if (end == start) {
+ // This only happens if we were called with a relative path, for which
+ // there simply is no parent.
+ // TODO: We could also resolve this by assuming that the parent is the
+ // current working directory, and returning a node referring to that.
+ return 0;
+ }
+
+ return new BadaFilesystemNode(Common::String(start, end));
+}
+
+Common::SeekableReadStream *BadaFilesystemNode::createReadStream() {
+ Common::SeekableReadStream *result = BadaFileStream::makeFromPath(_unicodePath, false);
+ if (result != NULL) {
+ _isValid = !IsFailed(File::GetAttributes(_unicodePath, _attr));
+ }
+ return result;
+}
+
+Common::WriteStream *BadaFilesystemNode::createWriteStream() {
+ Common::WriteStream *result = BadaFileStream::makeFromPath(_unicodePath, true);
+ if (result != NULL) {
+ _isValid = !IsFailed(File::GetAttributes(_unicodePath, _attr));
+ }
+ return result;
+}
diff --git a/backends/platform/bada/fs.h b/backends/platform/bada/fs.h
new file mode 100644
index 0000000000..d7d368ac20
--- /dev/null
+++ b/backends/platform/bada/fs.h
@@ -0,0 +1,82 @@
+/* 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 BADA_FILESYSTEM_H
+#define BADA_FILESYSTEM_H
+
+#include <FBaseString.h>
+#include <FBaseUtilStringUtil.h>
+#include <FIoDirectory.h>
+#include <FIoFile.h>
+
+#include "config.h"
+#include "common/scummsys.h"
+#include "common/stream.h"
+#include "backends/fs/abstract-fs.h"
+
+using namespace Osp::Io;
+using namespace Osp::Base;
+using namespace Osp::Base::Utility;
+
+/**
+ * Implementation of the ScummVM file system API based on BADA.
+ *
+ * Parts of this class are documented in the base interface class, AbstractFSNode.
+ */
+class BadaFilesystemNode : public AbstractFSNode {
+public:
+ /**
+ * Creates a BadaFilesystemNode for a given path.
+ *
+ * @param path the path the new node should point to.
+ */
+ BadaFilesystemNode(const Common::String &path);
+
+ Common::String getDisplayName() const { return _displayName; }
+ Common::String getName() const { return _displayName; }
+ Common::String getPath() const { return _path; }
+
+ bool exists() const;
+ bool isDirectory() const;
+ bool isReadable() const;
+ bool isWritable() const;
+
+ AbstractFSNode *getChild(const Common::String &n) const;
+ bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const;
+ AbstractFSNode *getParent() const;
+
+ Common::SeekableReadStream *createReadStream();
+ Common::WriteStream *createWriteStream();
+
+protected:
+ BadaFilesystemNode(const Common::String &root,
+ const Common::String &p);
+ void init(const Common::String &nodePath);
+
+ Common::String _displayName;
+ Common::String _path;
+ String _unicodePath;
+ bool _isValid;
+ bool _isVirtualDir;
+ FileAttributes _attr;
+};
+
+#endif
diff --git a/backends/platform/bada/graphics.cpp b/backends/platform/bada/graphics.cpp
new file mode 100644
index 0000000000..bd65c597c6
--- /dev/null
+++ b/backends/platform/bada/graphics.cpp
@@ -0,0 +1,261 @@
+/* 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.
+ *
+ */
+
+#include "graphics/fontman.h"
+
+#include "backends/platform/bada/form.h"
+#include "backends/platform/bada/system.h"
+#include "backends/platform/bada/graphics.h"
+
+//
+// BadaGraphicsManager
+//
+BadaGraphicsManager::BadaGraphicsManager(BadaAppForm *appForm) :
+ _appForm(appForm),
+ _eglDisplay(EGL_DEFAULT_DISPLAY),
+ _eglSurface(EGL_NO_SURFACE),
+ _eglConfig(0),
+ _eglContext(EGL_NO_CONTEXT),
+ _initState(true) {
+ assert(appForm != NULL);
+ _videoMode.fullscreen = true;
+}
+
+const Graphics::Font *BadaGraphicsManager::getFontOSD() {
+ return FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont);
+}
+
+bool BadaGraphicsManager::moveMouse(int16 &x, int16 &y) {
+ int16 currentX = _cursorState.x;
+ int16 currentY = _cursorState.y;
+
+ // save the current hardware coordinates
+ _cursorState.x = x;
+ _cursorState.y = y;
+
+ // return x/y as game coordinates
+ adjustMousePosition(x, y);
+
+ // convert current x/y to game coordinates
+ adjustMousePosition(currentX, currentY);
+
+ // return whether game coordinates have changed
+ return (currentX != x || currentY != y);
+}
+
+Common::List<Graphics::PixelFormat> BadaGraphicsManager::getSupportedFormats() const {
+ logEntered();
+
+ Common::List<Graphics::PixelFormat> res;
+ res.push_back(Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0));
+ res.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0));
+ res.push_back(Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0));
+ res.push_back(Graphics::PixelFormat::createFormatCLUT8());
+ return res;
+}
+
+bool BadaGraphicsManager::hasFeature(OSystem::Feature f) {
+ bool result = (f == OSystem::kFeatureFullscreenMode ||
+ f == OSystem::kFeatureVirtualKeyboard ||
+ OpenGLGraphicsManager::hasFeature(f));
+ return result;
+}
+
+void BadaGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
+ OpenGLGraphicsManager::setFeatureState(f, enable);
+}
+
+void BadaGraphicsManager::setReady() {
+ _initState = false;
+}
+
+void BadaGraphicsManager::updateScreen() {
+ if (_transactionMode == kTransactionNone) {
+ internUpdateScreen();
+ }
+}
+
+bool BadaGraphicsManager::loadEgl() {
+ logEntered();
+
+ EGLint numConfigs = 1;
+ EGLint eglConfigList[] = {
+ EGL_RED_SIZE, 5,
+ EGL_GREEN_SIZE, 6,
+ EGL_BLUE_SIZE, 5,
+ EGL_ALPHA_SIZE, 0,
+ EGL_DEPTH_SIZE, 8,
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
+ EGL_NONE
+ };
+
+ EGLint eglContextList[] = {
+ EGL_CONTEXT_CLIENT_VERSION, 1,
+ EGL_NONE
+ };
+
+ eglBindAPI(EGL_OPENGL_ES_API);
+
+ if (_eglDisplay) {
+ unloadGFXMode();
+ }
+
+ _eglDisplay = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY);
+ if (EGL_NO_DISPLAY == _eglDisplay) {
+ systemError("eglGetDisplay() failed");
+ return false;
+ }
+
+ if (EGL_FALSE == eglInitialize(_eglDisplay, NULL, NULL) ||
+ EGL_SUCCESS != eglGetError()) {
+ systemError("eglInitialize() failed");
+ return false;
+ }
+
+ if (EGL_FALSE == eglChooseConfig(_eglDisplay, eglConfigList,
+ &_eglConfig, 1, &numConfigs) ||
+ EGL_SUCCESS != eglGetError()) {
+ systemError("eglChooseConfig() failed");
+ return false;
+ }
+
+ if (!numConfigs) {
+ systemError("eglChooseConfig() failed. Matching config does not exist \n");
+ return false;
+ }
+
+ _eglSurface = eglCreateWindowSurface(_eglDisplay, _eglConfig,
+ (EGLNativeWindowType)_appForm, NULL);
+ if (EGL_NO_SURFACE == _eglSurface || EGL_SUCCESS != eglGetError()) {
+ systemError("eglCreateWindowSurface() failed. EGL_NO_SURFACE");
+ return false;
+ }
+
+ _eglContext = eglCreateContext(_eglDisplay, _eglConfig,
+ EGL_NO_CONTEXT, eglContextList);
+ if (EGL_NO_CONTEXT == _eglContext ||
+ EGL_SUCCESS != eglGetError()) {
+ systemError("eglCreateContext() failed");
+ return false;
+ }
+
+ if (false == eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext) ||
+ EGL_SUCCESS != eglGetError()) {
+ systemError("eglMakeCurrent() failed");
+ return false;
+ }
+
+ logLeaving();
+ return true;
+}
+
+bool BadaGraphicsManager::loadGFXMode() {
+ logEntered();
+
+ if (!loadEgl()) {
+ unloadGFXMode();
+ return false;
+ }
+
+ int x, y, width, height;
+ _appForm->GetBounds(x, y, width, height);
+ _videoMode.overlayWidth = _videoMode.hardwareWidth = width;
+ _videoMode.overlayHeight = _videoMode.hardwareHeight = height;
+ _videoMode.scaleFactor = 3; // for proportional sized cursor in the launcher
+
+ AppLog("screen size: %dx%d", _videoMode.hardwareWidth, _videoMode.hardwareHeight);
+ return OpenGLGraphicsManager::loadGFXMode();
+}
+
+void BadaGraphicsManager::loadTextures() {
+ logEntered();
+
+ OpenGLGraphicsManager::loadTextures();
+
+ // prevent image skew in some games, see:
+ // http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+}
+
+void BadaGraphicsManager::internUpdateScreen() {
+ if (!_initState) {
+ OpenGLGraphicsManager::internUpdateScreen();
+ eglSwapBuffers(_eglDisplay, _eglSurface);
+ } else {
+ showSplash();
+ }
+}
+
+void BadaGraphicsManager::unloadGFXMode() {
+ logEntered();
+
+ if (EGL_NO_DISPLAY != _eglDisplay) {
+ eglMakeCurrent(_eglDisplay, NULL, NULL, NULL);
+
+ if (_eglContext != EGL_NO_CONTEXT) {
+ eglDestroyContext(_eglDisplay, _eglContext);
+ _eglContext = EGL_NO_CONTEXT;
+ }
+
+ if (_eglSurface != EGL_NO_SURFACE) {
+ eglDestroySurface(_eglDisplay, _eglSurface);
+ _eglSurface = EGL_NO_SURFACE;
+ }
+
+ eglTerminate(_eglDisplay);
+ _eglDisplay = EGL_NO_DISPLAY;
+ }
+
+ _eglConfig = NULL;
+
+ OpenGLGraphicsManager::unloadGFXMode();
+ logLeaving();
+}
+
+// display a simple splash screen until launcher is ready
+void BadaGraphicsManager::showSplash() {
+ Canvas canvas;
+ canvas.Construct();
+ canvas.SetBackgroundColor(Color::COLOR_BLACK);
+ canvas.Clear();
+
+ int x = _videoMode.hardwareWidth / 3;
+ int y = _videoMode.hardwareHeight / 3;
+
+ Font *pFont = new Font();
+ pFont->Construct(FONT_STYLE_ITALIC | FONT_STYLE_BOLD, 55);
+ canvas.SetFont(*pFont);
+ canvas.SetForegroundColor(Color::COLOR_GREEN);
+ canvas.DrawText(Point(x, y), L"ScummVM");
+ delete pFont;
+
+ pFont = new Font();
+ pFont->Construct(FONT_STYLE_ITALIC | FONT_STYLE_BOLD, 35);
+ canvas.SetFont(*pFont);
+ canvas.SetForegroundColor(Color::COLOR_WHITE);
+ canvas.DrawText(Point(x + 70, y + 50), L"Loading ...");
+ delete pFont;
+
+ canvas.Show();
+
+}
diff --git a/backends/platform/bada/graphics.h b/backends/platform/bada/graphics.h
new file mode 100644
index 0000000000..b2aaca43bc
--- /dev/null
+++ b/backends/platform/bada/graphics.h
@@ -0,0 +1,72 @@
+/* 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 BADA_GRAPHICS_H
+#define BADA_GRAPHICS_H
+
+#include <FBase.h>
+#include <FGraphics.h>
+#include <FApp.h>
+#include <FGraphicsOpengl.h>
+#include <FSystem.h>
+#include <FUi.h>
+
+#include "config.h"
+#include "backends/graphics/opengl/opengl-graphics.h"
+#include "graphics/font.h"
+#include "backends/platform/bada/form.h"
+
+using namespace Osp::Graphics;
+using namespace Osp::Graphics::Opengl;
+using namespace Osp::App;
+
+class BadaGraphicsManager : public OpenGLGraphicsManager {
+public:
+ BadaGraphicsManager(BadaAppForm *appForm);
+
+ Common::List<Graphics::PixelFormat> getSupportedFormats() const;
+ bool hasFeature(OSystem::Feature f);
+ void updateScreen();
+ void setFeatureState(OSystem::Feature f, bool enable);
+ void setReady();
+ bool isReady() { return !_initState; }
+ const Graphics::Font *getFontOSD();
+ bool moveMouse(int16 &x, int16 &y);
+
+private:
+ void internUpdateScreen();
+ bool loadGFXMode();
+ void loadTextures();
+ void unloadGFXMode();
+ void setInternalMousePosition(int x, int y) {}
+ void showSplash();
+
+ bool loadEgl();
+ BadaAppForm *_appForm;
+ EGLDisplay _eglDisplay;
+ EGLSurface _eglSurface;
+ EGLConfig _eglConfig;
+ EGLContext _eglContext;
+ bool _initState;
+};
+
+#endif
diff --git a/backends/platform/bada/main.cpp b/backends/platform/bada/main.cpp
new file mode 100644
index 0000000000..8c40f24dd1
--- /dev/null
+++ b/backends/platform/bada/main.cpp
@@ -0,0 +1,67 @@
+/* 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.
+ *
+ */
+
+#include <FBase.h>
+#include <FApp.h>
+#include <FSystem.h>
+
+#include "backends/platform/bada/portdefs.h"
+#include "backends/platform/bada/form.h"
+#include "backends/platform/bada/system.h"
+#include "backends/platform/bada/application.h"
+
+using namespace Osp::Base;
+using namespace Osp::Base::Collection;
+
+C_LINKAGE_BEGIN
+
+_EXPORT_ int OspMain(int argc, char *pArgv[]);
+
+/**
+ * The entry function of bada application called by the operating system.
+ */
+int OspMain(int argc, char *pArgv[]) {
+ result r = E_SUCCESS;
+
+ AppLog("Application started.");
+ ArrayList *pArgs = new ArrayList();
+ pArgs->Construct();
+
+ for (int i = 0; i < argc; i++) {
+ pArgs->Add(*(new String(pArgv[i])));
+ }
+
+ r = Osp::App::Application::Execute(BadaScummVM::createInstance, pArgs);
+ if (IsFailed(r)) {
+ r &= 0x0000FFFF;
+ }
+
+ pArgs->RemoveAll(true);
+ delete pArgs;
+ AppLog("Application finished.");
+
+ return static_cast<int>(r);
+}
+
+C_LINKAGE_END
+
+
diff --git a/backends/platform/bada/missing.cpp b/backends/platform/bada/missing.cpp
new file mode 100644
index 0000000000..a5433ec61a
--- /dev/null
+++ b/backends/platform/bada/missing.cpp
@@ -0,0 +1,113 @@
+/* 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.
+ *
+ */
+
+#include <FApp.h>
+#include <FGraphics.h>
+#include <FUi.h>
+#include <FSystem.h>
+#include <FBase.h>
+
+#include "backends/platform/bada/portdefs.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#define BUF_SIZE 255
+
+void systemError(const char *message);
+
+C_LINKAGE_BEGIN
+
+int __errno; // for overridden method in saves/default/default-saves.cpp
+
+void __assert_func(const char *file, int line,
+ const char *func, const char *err) {
+ char buffer[BUF_SIZE];
+ snprintf(buffer, sizeof(buffer), "%s %d %s %s", file, line, func, err);
+ systemError(buffer);
+}
+
+void stderr_fprintf(void*, const char *format, ...) {
+ va_list ap;
+ char buffer[BUF_SIZE];
+
+ va_start(ap, format);
+ vsnprintf(buffer, sizeof(buffer), format, ap);
+ va_end(ap);
+
+ AppLog(buffer);
+}
+
+void stderr_vfprintf(void*, const char *format, va_list ap) {
+ char buffer[BUF_SIZE];
+ vsnprintf(buffer, sizeof(buffer), format, ap);
+ AppLog(buffer);
+}
+
+int printf(const char *format, ...) {
+ int result = 0;
+ va_list ap;
+ char buffer[BUF_SIZE];
+
+ va_start(ap, format);
+ result = vsnprintf(buffer, sizeof(buffer), format, ap);
+ va_end(ap);
+
+ AppLog(buffer);
+
+ return result;
+}
+
+int sprintf(char *str, const char *format, ...) {
+ va_list ap;
+ int result;
+ char buffer[BUF_SIZE];
+
+ va_start(ap, format);
+ result = vsnprintf(buffer, sizeof(buffer), format, ap);
+ va_end(ap);
+
+ strcpy(str, buffer);
+
+ return result;
+}
+
+char *strdup(const char *strSource) {
+ char *buffer;
+ int len = strlen(strSource) + 1;
+ buffer = (char*)malloc(len);
+ if (buffer) {
+ memcpy(buffer, strSource, len);
+ }
+ return buffer;
+}
+
+int vsprintf(char *str, const char *format, va_list ap) {
+ char buffer[BUF_SIZE];
+ int result = vsnprintf(buffer, sizeof(buffer), format, ap);
+ strcpy(str, buffer);
+ return result;
+}
+
+C_LINKAGE_END
diff --git a/backends/platform/bada/portdefs.h b/backends/platform/bada/portdefs.h
new file mode 100644
index 0000000000..e85d578678
--- /dev/null
+++ b/backends/platform/bada/portdefs.h
@@ -0,0 +1,84 @@
+/* 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 PORT_DEFS_H
+#define PORT_DEFS_H
+
+#include <assert.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <math.h>
+
+#define M_PI 3.14159265358979323846
+
+#ifdef __cplusplus
+ #include <ctype.h> // causes a link error when building c programs
+ #define C_LINKAGE_BEGIN extern "C" {
+ #define C_LINKAGE_END }
+#else
+ #define C_LINKAGE_BEGIN
+ #define C_LINKAGE_END
+#endif
+
+C_LINKAGE_BEGIN
+
+// for libFLAC
+#undef fseeko
+#undef ftello
+#define fseeko fseek
+#define ftello ftell
+
+// overcome use of fprintf since bada/newlib (1.2) does not
+// support stderr/stdout (undefined reference to `_impure_ptr').
+
+void stderr_fprintf(void*, const char *format, ...);
+void stderr_vfprintf(void*, const char *format, va_list ap);
+
+#undef fprintf
+#undef vfprintf
+#undef stderr
+#undef stdout
+#undef stdin
+#undef fputs
+#undef fflush
+
+#define stderr (void*)0
+#define stdout (void*)1
+#define stdin (void*)2
+#define fputs(str, file)
+#define fflush(file)
+#define sscanf simple_sscanf
+#define fprintf stderr_fprintf
+#define vfprintf stderr_vfprintf
+
+int printf(const char *format, ...);
+int sprintf(char *str, const char *format, ...);
+int simple_sscanf(const char *buffer, const char *format, ...);
+char *strdup(const char *s1);
+int vsprintf(char *str, const char *format, va_list ap);
+
+C_LINKAGE_END
+
+#endif
diff --git a/backends/platform/bada/sscanf.cpp b/backends/platform/bada/sscanf.cpp
new file mode 100644
index 0000000000..b5e5b88cb5
--- /dev/null
+++ b/backends/platform/bada/sscanf.cpp
@@ -0,0 +1,213 @@
+/* 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.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+//
+// simple sscanf replacement to match scummvm usage patterns
+//
+
+bool scanInt(const char **in, va_list *ap, int max) {
+ // skip leading space characters
+ while (**in && **in == ' ') {
+ (*in)++;
+ }
+
+ // number optionally preceeded with a + or - sign.
+ bool negate = false;
+ if (**in == '-') {
+ (*in)++;
+ negate = true;
+ }
+
+ if (**in == '+') {
+ (*in)++;
+ }
+
+ int *arg = va_arg(*ap, int*);
+ char *end;
+ long n = strtol(*in, &end, 10);
+ if (negate) {
+ n = -n;
+ }
+
+ bool err = false;
+ if (end == *in || (max > 0 && (end - *in) > max)) {
+ err = true;
+ } else {
+ *arg = (int)n;
+ *in = end;
+ }
+ return err;
+}
+
+bool scanHex(const char **in, va_list *ap) {
+ unsigned *arg = va_arg(*ap, unsigned*);
+ char *end;
+ long n = strtol(*in, &end, 16);
+ if (end == *in) {
+ return true;
+ }
+
+ *in = end;
+ *arg = (unsigned) n;
+ return false;
+}
+
+bool scanString(const char **in, va_list *ap) {
+ char *arg = va_arg(*ap, char*);
+ while (**in && **in != ' ' && **in != '\n' && **in != '\t') {
+ *arg = **in;
+ arg++;
+ (*in)++;
+ }
+ *arg = '\0';
+ (*in)++;
+ return false;
+}
+
+bool scanStringUntil(const char **in, va_list *ap, char c_end) {
+ char *arg = va_arg(*ap, char*);
+ while (**in && **in != c_end) {
+ *arg = **in;
+ *arg++;
+ (*in)++;
+ }
+ *arg = 0;
+ (*in)++;
+ return false;
+}
+
+bool scanChar(const char **in, va_list *ap) {
+ char *arg = va_arg(*ap, char*);
+ if (**in) {
+ *arg = **in;
+ (*in)++;
+ }
+ return false;
+}
+
+extern "C" int simple_sscanf(const char *input, const char *format, ...) {
+ va_list ap;
+ int result = 0;
+ const char *next = input;
+
+ va_start(ap, format);
+
+ while (*format) {
+ if (*format == '%') {
+ format++;
+ int max = 0;
+ while (isdigit(*format)) {
+ max = (max * 10) + (*format - '0');
+ format++;
+ }
+
+ bool err = false;
+ switch (*format++) {
+ case 'c':
+ err = scanChar(&next, &ap);
+ break;
+ case 'd':
+ case 'u':
+ err = scanInt(&next, &ap, max);
+ break;
+ case 'x':
+ err = scanHex(&next, &ap);
+ break;
+ case 's':
+ err = scanString(&next, &ap);
+ break;
+ case '[':
+ // assume %[^c]
+ if ('^' != *format) {
+ err = true;
+ } else {
+ format++;
+ if (*format && *(format+1) == ']') {
+ err = scanStringUntil(&next, &ap, *format);
+ format += 2;
+ } else {
+ err = true;
+ }
+ }
+ break;
+ default:
+ err = true;
+ break;
+ }
+
+ if (err) {
+ break;
+ } else {
+ result++;
+ }
+ } else if (*format++ != *next++) {
+ // match input
+ break;
+ }
+ }
+
+ va_end(ap);
+ return result;
+}
+
+#if defined(TEST)
+int main(int argc, char *pArgv[]) {
+ int x,y,xx,yy,h;
+ char buffer[100];
+ unsigned u;
+ char c;
+ strcpy(buffer, "hello");
+ char *b = buffer;
+
+ if (simple_sscanf("BBX 00009 -1 +10 000",
+ "BBX %d %d %d %d",
+ &x, &y, &xx, &yy) != 4) {
+ printf("Failed\n");
+ } else {
+ printf("Success %d %d %d %d\n", x, y, xx, yy);
+ }
+
+ if (simple_sscanf("CAT 123x-10 0x100h 123456.AUD $ ",
+ "CAT %dx%d %xh %06u.AUD %c",
+ &x, &y, &h, &u, &c) != 5) {
+ printf("Failed\n");
+ } else {
+ printf("Success %d %d %d %d '%c' \n", x, y, h, u, c);
+ }
+
+ if (simple_sscanf("COPYRIGHT \"Copyright (c) 1984, 1987 Foo Systems Incorporated",
+ "COPYRIGHT \"%[^\"]",
+ b) != 1) {
+ printf("Failed\n");
+ } else {
+ printf("Success %s\n", buffer);
+ }
+
+ return 0;
+}
+#endif
diff --git a/backends/platform/bada/system.cpp b/backends/platform/bada/system.cpp
new file mode 100644
index 0000000000..d284688068
--- /dev/null
+++ b/backends/platform/bada/system.cpp
@@ -0,0 +1,506 @@
+/* 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.
+ *
+ */
+
+#include <FUiCtrlMessageBox.h>
+
+#include "common/config-manager.h"
+#include "common/file.h"
+#include "engines/engine.h"
+#include "graphics/font.h"
+#include "graphics/fontman.h"
+#include "graphics/fonts/bdf.h"
+#include "backends/saves/default/default-saves.h"
+#include "backends/events/default/default-events.h"
+#include "backends/audiocd/default/default-audiocd.h"
+#include "backends/mutex/mutex.h"
+#include "backends/fs/fs-factory.h"
+#include "backends/timer/bada/timer.h"
+
+#include "backends/platform/bada/form.h"
+#include "backends/platform/bada/system.h"
+#include "backends/platform/bada/graphics.h"
+#include "backends/platform/bada/audio.h"
+
+using namespace Osp::Base;
+using namespace Osp::Base::Runtime;
+using namespace Osp::Ui::Controls;
+
+#define DEFAULT_CONFIG_FILE "/Home/scummvm.ini"
+#define RESOURCE_PATH "/Res"
+#define MUTEX_BUFFER_SIZE 5
+
+//
+// BadaFilesystemFactory
+//
+class BadaFilesystemFactory : public FilesystemFactory {
+ AbstractFSNode *makeRootFileNode() const;
+ AbstractFSNode *makeCurrentDirectoryFileNode() const;
+ AbstractFSNode *makeFileNodePath(const Common::String &path) const;
+};
+
+AbstractFSNode *BadaFilesystemFactory::makeRootFileNode() const {
+ return new BadaFilesystemNode("/");
+}
+
+AbstractFSNode *BadaFilesystemFactory::makeCurrentDirectoryFileNode() const {
+ return new BadaFilesystemNode("/Home");
+}
+
+AbstractFSNode *BadaFilesystemFactory::makeFileNodePath(const Common::String &path) const {
+ AppAssert(!path.empty());
+ return new BadaFilesystemNode(path);
+}
+
+//
+// BadaSaveFileManager
+//
+struct BadaSaveFileManager : public DefaultSaveFileManager {
+ bool removeSavefile(const Common::String &filename);
+};
+
+bool BadaSaveFileManager::removeSavefile(const Common::String &filename) {
+ Common::String savePathName = getSavePath();
+
+ checkPath(Common::FSNode(savePathName));
+ if (getError().getCode() != Common::kNoError) {
+ return false;
+ }
+
+ // recreate FSNode since checkPath may have changed/created the directory
+ Common::FSNode savePath(savePathName);
+ Common::FSNode file = savePath.getChild(filename);
+
+ String unicodeFileName;
+ StringUtil::Utf8ToString(file.getPath().c_str(), unicodeFileName);
+
+ switch (Osp::Io::File::Remove(unicodeFileName)) {
+ case E_SUCCESS:
+ return true;
+
+ case E_ILLEGAL_ACCESS:
+ setError(Common::kWritePermissionDenied, "Search or write permission denied: " +
+ file.getName());
+ break;
+
+ default:
+ setError(Common::kPathDoesNotExist, "removeSavefile: '" + file.getName() +
+ "' does not exist or path is invalid");
+ break;
+ }
+
+ return false;
+}
+
+//
+// BadaMutexManager
+//
+struct BadaMutexManager : public MutexManager {
+ BadaMutexManager();
+ ~BadaMutexManager();
+ OSystem::MutexRef createMutex();
+ void lockMutex(OSystem::MutexRef mutex);
+ void unlockMutex(OSystem::MutexRef mutex);
+ void deleteMutex(OSystem::MutexRef mutex);
+private:
+ Mutex *buffer[MUTEX_BUFFER_SIZE];
+};
+
+BadaMutexManager::BadaMutexManager() {
+ for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) {
+ buffer[i] = NULL;
+ }
+}
+
+BadaMutexManager::~BadaMutexManager() {
+ for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) {
+ if (buffer[i] != NULL) {
+ delete buffer[i];
+ }
+ }
+}
+
+OSystem::MutexRef BadaMutexManager::createMutex() {
+ Mutex *mutex = new Mutex();
+ mutex->Create();
+
+ for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) {
+ if (buffer[i] == NULL) {
+ buffer[i] = mutex;
+ break;
+ }
+ }
+
+ return (OSystem::MutexRef) mutex;
+}
+
+void BadaMutexManager::lockMutex(OSystem::MutexRef mutex) {
+ Mutex *m = (Mutex *)mutex;
+ m->Acquire();
+}
+
+void BadaMutexManager::unlockMutex(OSystem::MutexRef mutex) {
+ Mutex *m = (Mutex *)mutex;
+ m->Release();
+}
+
+void BadaMutexManager::deleteMutex(OSystem::MutexRef mutex) {
+ Mutex *m = (Mutex *)mutex;
+
+ for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) {
+ if (buffer[i] == m) {
+ buffer[i] = NULL;
+ }
+ }
+
+ delete m;
+}
+
+//
+// BadaEventManager
+//
+struct BadaEventManager : public DefaultEventManager {
+ BadaEventManager(Common::EventSource *boss);
+ void init();
+ int shouldQuit() const;
+};
+
+BadaEventManager::BadaEventManager(Common::EventSource *boss) :
+ DefaultEventManager(boss) {
+}
+
+void BadaEventManager::init() {
+ DefaultEventManager::init();
+
+ // theme and vkbd should have now loaded - clear the splash screen
+ BadaSystem *system = (BadaSystem *)g_system;
+ BadaGraphicsManager *graphics = system->getGraphics();
+ if (graphics) {
+ graphics->setReady();
+ graphics->updateScreen();
+ }
+}
+
+int BadaEventManager::shouldQuit() const {
+ BadaSystem *system = (BadaSystem *)g_system;
+ return DefaultEventManager::shouldQuit() || system->isClosing();
+}
+
+//
+// BadaSystem
+//
+BadaSystem::BadaSystem(BadaAppForm *appForm) :
+ _appForm(appForm),
+ _audioThread(0),
+ _epoch(0) {
+}
+
+result BadaSystem::Construct(void) {
+ logEntered();
+
+ _fsFactory = new BadaFilesystemFactory();
+ if (!_fsFactory) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ return E_SUCCESS;
+}
+
+BadaSystem::~BadaSystem() {
+ logEntered();
+}
+
+result BadaSystem::initModules() {
+ logEntered();
+
+ _mutexManager = new BadaMutexManager();
+ if (!_mutexManager) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ _timerManager = new BadaTimerManager();
+ if (!_timerManager) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ _savefileManager = new BadaSaveFileManager();
+ if (!_savefileManager) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ _graphicsManager = (GraphicsManager *)new BadaGraphicsManager(_appForm);
+ if (!_graphicsManager) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ // depends on _graphicsManager when ENABLE_VKEYBD enabled
+ _eventManager = new BadaEventManager(this);
+ if (!_eventManager) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ _audioThread = new AudioThread();
+ if (!_audioThread) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ _mixer = _audioThread->Construct(this);
+ if (!_mixer) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ _audiocdManager = (AudioCDManager *)new DefaultAudioCDManager();
+ if (!_audiocdManager) {
+ return E_OUT_OF_MEMORY;
+ }
+
+ if (IsFailed(_audioThread->Start())) {
+ AppLog("Failed to start audio thread");
+ return E_OUT_OF_MEMORY;
+ }
+
+ logLeaving();
+ return E_SUCCESS;
+}
+
+void BadaSystem::initBackend() {
+ logEntered();
+
+ // use the mobile device theme
+ ConfMan.set("gui_theme", "/Res/scummmobile");
+
+ // allow bada virtual keypad pack to be found
+ ConfMan.set("vkeybdpath", "/Res/vkeybd_bada");
+ ConfMan.set("vkeybd_pack_name", "vkeybd_bada");
+
+ // set default save path to writable area
+ if (!ConfMan.hasKey("savepath")) {
+ ConfMan.set("savepath", "/Home/Share");
+ }
+
+ // default to no auto-save
+ if (!ConfMan.hasKey("autosave_period")) {
+ ConfMan.setInt("autosave_period", 0);
+ }
+
+ ConfMan.registerDefault("fullscreen", true);
+ ConfMan.registerDefault("aspect_ratio", false);
+ ConfMan.setBool("confirm_exit", false);
+
+ Osp::System::SystemTime::GetTicks(_epoch);
+
+ if (E_SUCCESS != initModules()) {
+ AppLog("initModules failed");
+ } else {
+ OSystem::initBackend();
+ }
+
+ // replace kBigGUIFont using the large font from the scummmobile theme
+ Common::File fontFile;
+ Common::String fileName = "/Res/scummmobile/helvB14-iso-8859-1.fcc";
+ BadaFilesystemNode file(fileName);
+ if (file.exists()) {
+ Common::SeekableReadStream *stream = file.createReadStream();
+ if (stream) {
+ if (fontFile.open(stream, fileName)) {
+ Graphics::BdfFont *font = Graphics::BdfFont::loadFromCache(fontFile);
+ if (font) {
+ // use this font for the vkbd and on-screen messages
+ FontMan.setFont(Graphics::FontManager::kBigGUIFont, font);
+ }
+ }
+ }
+ }
+
+ logLeaving();
+}
+
+void BadaSystem::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) {
+ // allow translations.dat and game .DAT files to be found
+ s.addDirectory(RESOURCE_PATH, RESOURCE_PATH, priority);
+}
+
+void BadaSystem::destroyBackend() {
+ closeAudio();
+
+ delete _graphicsManager;
+ _graphicsManager = 0;
+
+ delete _savefileManager;
+ _savefileManager = 0;
+
+ delete _fsFactory;
+ _fsFactory = 0;
+
+ delete _mixer;
+ _mixer = 0;
+
+ delete _audiocdManager;
+ _audiocdManager = 0;
+
+ delete _timerManager;
+ _timerManager = 0;
+
+ delete _eventManager;
+ _eventManager = 0;
+
+ delete _mutexManager;
+ _mutexManager = 0;
+}
+
+bool BadaSystem::pollEvent(Common::Event &event) {
+ return _appForm->pollEvent(event);
+}
+
+uint32 BadaSystem::getMillis() {
+ long long result, ticks = 0;
+ Osp::System::SystemTime::GetTicks(ticks);
+ result = ticks - _epoch;
+ return result;
+}
+
+void BadaSystem::delayMillis(uint msecs) {
+ if (!_appForm->isClosing()) {
+ Thread::Sleep(msecs);
+ }
+}
+
+void BadaSystem::updateScreen() {
+ if (_graphicsManager != NULL) {
+ _graphicsManager->updateScreen();
+ }
+}
+
+void BadaSystem::getTimeAndDate(TimeDate &td) const {
+ DateTime currentTime;
+
+ if (E_SUCCESS == Osp::System::SystemTime::GetCurrentTime(currentTime)) {
+ td.tm_sec = currentTime.GetSecond();
+ td.tm_min = currentTime.GetMinute();
+ td.tm_hour = currentTime.GetHour();
+ td.tm_mday = currentTime.GetDay();
+ td.tm_mon = currentTime.GetMonth();
+ td.tm_year = currentTime.GetYear();
+ }
+}
+
+void BadaSystem::fatalError() {
+ systemError("ScummVM: Fatal internal error.");
+}
+
+void BadaSystem::exitSystem() {
+ if (_appForm) {
+ closeAudio();
+ closeGraphics();
+ _appForm->exitSystem();
+ }
+}
+
+void BadaSystem::logMessage(LogMessageType::Type type, const char *message) {
+ if (type == LogMessageType::kError) {
+ systemError(message);
+ } else {
+ AppLog(message);
+ }
+}
+
+Common::SeekableReadStream *BadaSystem::createConfigReadStream() {
+ BadaFilesystemNode file(DEFAULT_CONFIG_FILE);
+ return file.createReadStream();
+}
+
+Common::WriteStream *BadaSystem::createConfigWriteStream() {
+ BadaFilesystemNode file(DEFAULT_CONFIG_FILE);
+ return file.createWriteStream();
+}
+
+void BadaSystem::closeAudio() {
+ if (_audioThread) {
+ _audioThread->Stop();
+ _audioThread->Join();
+ delete _audioThread;
+ _audioThread = 0;
+ }
+}
+
+void BadaSystem::closeGraphics() {
+ if (_graphicsManager) {
+ delete _graphicsManager;
+ _graphicsManager = 0;
+ }
+}
+
+void BadaSystem::setMute(bool on) {
+ // only change mute after eventManager init() has completed
+ if (_audioThread) {
+ BadaGraphicsManager *graphics = getGraphics();
+ if (graphics && graphics->isReady()) {
+ _audioThread->setMute(on);
+ }
+ }
+}
+
+int BadaSystem::setVolume(bool up, bool minMax) {
+ int level = -1;
+ if (_audioThread) {
+ level = _audioThread->setVolume(up, minMax);
+ }
+ return level;
+}
+
+//
+// create the ScummVM system
+//
+BadaAppForm *systemStart(Osp::App::Application *app) {
+ logEntered();
+
+ BadaAppForm *appForm = new BadaAppForm();
+ if (!appForm) {
+ AppLog("Failed to create appForm");
+ return NULL;
+ }
+
+ if (E_SUCCESS != appForm->Construct() ||
+ E_SUCCESS != app->GetAppFrame()->GetFrame()->AddControl(*appForm)) {
+ delete appForm;
+ AppLog("Failed to construct appForm");
+ return NULL;
+ }
+
+ return appForm;
+}
+
+//
+// display a fatal error notification
+//
+void systemError(const char *message) {
+ AppLog("Fatal system error: %s", message);
+
+ ArrayList *args = new ArrayList();
+ args->Construct();
+ args->Add(*(new String(message)));
+ Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT_ERR, args);
+
+ if (g_system) {
+ BadaSystem *system = (BadaSystem *)g_system;
+ system->exitSystem();
+ }
+}
diff --git a/backends/platform/bada/system.h b/backends/platform/bada/system.h
new file mode 100644
index 0000000000..c28686cb3d
--- /dev/null
+++ b/backends/platform/bada/system.h
@@ -0,0 +1,102 @@
+/* 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 BADA_SYSTEM_H
+#define BADA_SYSTEM_H
+
+#include <FApp.h>
+#include <FGraphics.h>
+#include <FUi.h>
+#include <FSystem.h>
+#include <FBase.h>
+#include <FIoFile.h>
+
+#include "config.h"
+#include "common/scummsys.h"
+#include "backends/modular-backend.h"
+
+#include "backends/platform/bada/fs.h"
+#include "backends/platform/bada/form.h"
+#include "backends/platform/bada/audio.h"
+#include "backends/platform/bada/graphics.h"
+
+#if defined(_DEBUG)
+#define logEntered() AppLog("%s entered (%s %d)", \
+ __FUNCTION__, __FILE__, __LINE__);
+#define logLeaving() AppLog("%s leaving (%s %d)", \
+ __FUNCTION__, __FILE__, __LINE__);
+#else
+#define logEntered()
+#define logLeaving()
+#endif
+
+BadaAppForm *systemStart(Osp::App::Application *app);
+void systemError(const char *message);
+
+#define USER_MESSAGE_EXIT 1000
+#define USER_MESSAGE_EXIT_ERR 1001
+
+//
+// BadaSystem
+//
+class BadaSystem : public ModularBackend,
+ Common::EventSource {
+public:
+ BadaSystem(BadaAppForm *appForm);
+ ~BadaSystem();
+
+ result Construct();
+ void closeAudio();
+ void closeGraphics();
+ void destroyBackend();
+ void setMute(bool on);
+ int setVolume(bool up, bool minMax);
+ void exitSystem();
+ bool isClosing() { return _appForm->isClosing(); }
+
+ BadaGraphicsManager *getGraphics() {
+ return (BadaGraphicsManager *)_graphicsManager;
+ }
+
+private:
+ void initBackend();
+ result initModules();
+
+ void updateScreen();
+ bool pollEvent(Common::Event &event);
+ uint32 getMillis();
+ void delayMillis(uint msecs);
+ void getTimeAndDate(TimeDate &t) const;
+ void fatalError();
+ void logMessage(LogMessageType::Type type, const char *message);
+ void addSysArchivesToSearchSet(Common::SearchSet &s, int priority);
+
+ Common::EventSource *getDefaultEventSource() { return this; }
+ Common::SeekableReadStream *createConfigReadStream();
+ Common::WriteStream *createConfigWriteStream();
+
+ BadaAppForm *_appForm;
+ AudioThread *_audioThread;
+ long long _epoch;
+};
+
+#endif
diff --git a/backends/platform/dc/DCLauncherDialog.h b/backends/platform/dc/DCLauncherDialog.h
index 72df3e15cc..519524222f 100644
--- a/backends/platform/dc/DCLauncherDialog.h
+++ b/backends/platform/dc/DCLauncherDialog.h
@@ -25,4 +25,3 @@ class DCLauncherDialog {
DCLauncherDialog() {}
int runModal();
};
-
diff --git a/backends/platform/dc/README b/backends/platform/dc/README
index e4ebda840e..e26df500e8 100644
--- a/backends/platform/dc/README
+++ b/backends/platform/dc/README
@@ -23,4 +23,3 @@ should get a scrambled binary SCUMMVM.BIN and some plugins *.PLG.
For serial/IP upload, remove the "DYNAMIC_MODULES" line and just run `make',
to get a static binary with the name `scummvm.elf'.
-
diff --git a/backends/platform/dc/audio.cpp b/backends/platform/dc/audio.cpp
index 1fee970a90..35cb51f349 100644
--- a/backends/platform/dc/audio.cpp
+++ b/backends/platform/dc/audio.cpp
@@ -74,5 +74,3 @@ void OSystem_Dreamcast::checkSound()
if ((fillpos += n) >= curr_ring_buffer_samples)
fillpos = 0;
}
-
-
diff --git a/backends/platform/dc/cache.S b/backends/platform/dc/cache.S
index 1a1595a9a1..4beeedcea7 100644
--- a/backends/platform/dc/cache.S
+++ b/backends/platform/dc/cache.S
@@ -35,4 +35,3 @@ ccr_addr:
.long 0xff00001c
ccr_data:
.word 0x0905
-
diff --git a/backends/platform/dc/dc-fs.cpp b/backends/platform/dc/dc-fs.cpp
index ac709f62b9..f30c9c56d1 100644
--- a/backends/platform/dc/dc-fs.cpp
+++ b/backends/platform/dc/dc-fs.cpp
@@ -124,7 +124,7 @@ bool RoninCDDirectoryNode::getChildren(AbstractFSList &myList, ListMode mode, bo
if (mode == Common::FSNode::kListFilesOnly)
continue;
- myList.push_back(new RoninCDDirectoryNode(newPath+"/"));
+ myList.push_back(new RoninCDDirectoryNode(newPath));
} else {
// Honor the chosen mode
if (mode == Common::FSNode::kListDirectoriesOnly)
@@ -165,4 +165,3 @@ AbstractFSNode *OSystem_Dreamcast::makeFileNodePath(const Common::String &path)
AbstractFSNode *node = RoninCDFileNode::makeFileNodePath(path);
return (node? node : new RoninCDNonexistingNode(path));
}
-
diff --git a/backends/platform/dc/dc.h b/backends/platform/dc/dc.h
index bde50daa2d..2e32ff3eb4 100644
--- a/backends/platform/dc/dc.h
+++ b/backends/platform/dc/dc.h
@@ -259,4 +259,3 @@ extern int handleInput(struct mapledev *pad,
int &mouse_x, int &mouse_y,
byte &shiftFlags, Interactive *inter = NULL);
extern bool selectGame(char *&, char *&, Common::Language &, Common::Platform &, class Icon &);
-
diff --git a/backends/platform/dc/dcmain.cpp b/backends/platform/dc/dcmain.cpp
index 06738a687d..3e3279f9c3 100644
--- a/backends/platform/dc/dcmain.cpp
+++ b/backends/platform/dc/dcmain.cpp
@@ -377,4 +377,3 @@ int DCLauncherDialog::runModal()
return 0;
}
-
diff --git a/backends/platform/dc/display.cpp b/backends/platform/dc/display.cpp
index a11e329df3..76658c6590 100644
--- a/backends/platform/dc/display.cpp
+++ b/backends/platform/dc/display.cpp
@@ -732,4 +732,3 @@ int16 OSystem_Dreamcast::getOverlayWidth()
{
return OVL_W;
}
-
diff --git a/backends/platform/dc/input.cpp b/backends/platform/dc/input.cpp
index 3759eec6df..7b21c76efa 100644
--- a/backends/platform/dc/input.cpp
+++ b/backends/platform/dc/input.cpp
@@ -249,4 +249,3 @@ bool OSystem_Dreamcast::pollEvent(Common::Event &event)
return false;
}
}
-
diff --git a/backends/platform/dc/label.cpp b/backends/platform/dc/label.cpp
index 1094dd3fb4..5db031958f 100644
--- a/backends/platform/dc/label.cpp
+++ b/backends/platform/dc/label.cpp
@@ -134,4 +134,3 @@ void Label::draw(float x, float y, unsigned int argb, float scale)
myvertex.cmd |= TA_CMD_VERTEX_EOS;
ta_commit_list(&myvertex);
}
-
diff --git a/backends/platform/dc/plugin_head.S b/backends/platform/dc/plugin_head.S
index 6cbe9eec85..a056f1c0f0 100644
--- a/backends/platform/dc/plugin_head.S
+++ b/backends/platform/dc/plugin_head.S
@@ -3,4 +3,3 @@
.section .dtors,"aw",@progbits
.end
-
diff --git a/backends/platform/dc/selector.cpp b/backends/platform/dc/selector.cpp
index 859f2a40ed..339e5df62d 100644
--- a/backends/platform/dc/selector.cpp
+++ b/backends/platform/dc/selector.cpp
@@ -185,12 +185,24 @@ static void makeDefIcon(Icon &icon)
icon.load(scummvm_icon, sizeof(scummvm_icon));
}
+static bool sameOrSubdir(const char *dir1, const char *dir2)
+{
+ int l1 = strlen(dir1), l2 = strlen(dir2);
+ if (l1<=l2)
+ return !strcmp(dir1, dir2);
+ else
+ return !memcmp(dir1, dir2, l2);
+}
+
static bool uniqueGame(const char *base, const char *dir,
Common::Language lang, Common::Platform plf,
Game *games, int cnt)
{
while (cnt--)
- if (!strcmp(dir, games->dir) &&
+ if (/*Don't detect the same game in a subdir,
+ this is a workaround for the detector bug in toon... */
+ sameOrSubdir(dir, games->dir) &&
+ /*!strcmp(dir, games->dir) &&*/
!stricmp(base, games->filename_base) &&
lang == games->language &&
plf == games->platform)
@@ -237,19 +249,24 @@ static int findGames(Game *games, int max, bool use_ini)
}
while ((curr_game < max || use_ini) && curr_dir < num_dirs) {
- strncpy(dirs[curr_dir].name, dirs[curr_dir].node.getPath().c_str(), 252);
- dirs[curr_dir].name[251] = '\0';
+ strncpy(dirs[curr_dir].name, dirs[curr_dir].node.getPath().c_str(), 251);
+ dirs[curr_dir].name[250] = '\0';
+ if (!dirs[curr_dir].name[0] ||
+ dirs[curr_dir].name[strlen(dirs[curr_dir].name)-1] != '/')
+ strcat(dirs[curr_dir].name, "/");
dirs[curr_dir].deficon[0] = '\0';
Common::FSList files, fslist;
dirs[curr_dir++].node.getChildren(fslist, Common::FSNode::kListAll);
for (Common::FSList::const_iterator entry = fslist.begin(); entry != fslist.end();
++entry) {
if (entry->isDirectory()) {
- if (!use_ini && num_dirs < MAX_DIR &&
- strcasecmp(entry->getDisplayName().c_str(), "install")) {
+ if (!use_ini && num_dirs < MAX_DIR) {
dirs[num_dirs].node = *entry;
num_dirs++;
}
+ /* Toonstruck detector needs directories to be present too */
+ if(!use_ini)
+ files.push_back(*entry);
} else
if (isIcon(*entry))
strcpy(dirs[curr_dir-1].deficon, entry->getDisplayName().c_str());
diff --git a/backends/platform/dingux/README.DINGUX b/backends/platform/dingux/README.DINGUX
index d867e02f03..04f0d30844 100644
--- a/backends/platform/dingux/README.DINGUX
+++ b/backends/platform/dingux/README.DINGUX
@@ -65,4 +65,3 @@ I still raccomand the use of opendingux kernel + rootfs, but if you don't, this
image plus another kernel (eg. SiENcE's one) should be do the job.
Enjoy
-
diff --git a/backends/platform/dingux/scummvm.gpe b/backends/platform/dingux/scummvm.gpe
index 84ab0c6b95..ce5d174a5c 100644
--- a/backends/platform/dingux/scummvm.gpe
+++ b/backends/platform/dingux/scummvm.gpe
@@ -2,4 +2,3 @@
HOME=`pwd`
$HOME/scummvm.elf
-
diff --git a/backends/platform/ds/arm7/source/libcartreset/cartreset.c b/backends/platform/ds/arm7/source/libcartreset/cartreset.c
index db2f3cfddc..85be823b71 100644
--- a/backends/platform/ds/arm7/source/libcartreset/cartreset.c
+++ b/backends/platform/ds/arm7/source/libcartreset/cartreset.c
@@ -104,6 +104,3 @@ void cartExecute()
}
#endif
-
-
-
diff --git a/backends/platform/ds/arm7/source/libcartreset/cartreset_nolibfat.h b/backends/platform/ds/arm7/source/libcartreset/cartreset_nolibfat.h
index f1faebea37..98808f79c5 100644
--- a/backends/platform/ds/arm7/source/libcartreset/cartreset_nolibfat.h
+++ b/backends/platform/ds/arm7/source/libcartreset/cartreset_nolibfat.h
@@ -54,4 +54,3 @@ void cartExecute();
#endif
#endif
-
diff --git a/backends/platform/ds/arm7/source/main.cpp b/backends/platform/ds/arm7/source/main.cpp
index 6b5a0ec321..2e9cacc669 100644
--- a/backends/platform/ds/arm7/source/main.cpp
+++ b/backends/platform/ds/arm7/source/main.cpp
@@ -650,4 +650,3 @@ int main(int argc, char ** argv) {
//////////////////////////////////////////////////////////////////////
-
diff --git a/backends/platform/ds/arm9/dist/readme_ds.txt b/backends/platform/ds/arm9/dist/readme_ds.txt
index 24c85ad556..dc37fecce5 100644
--- a/backends/platform/ds/arm9/dist/readme_ds.txt
+++ b/backends/platform/ds/arm9/dist/readme_ds.txt
@@ -861,8 +861,3 @@ For other builds, substitute the letters b - g in the above line.
To build everything, type:
make allbuildssafe
-
-
-
-
-
diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp
index 263ca58705..7154d4ae3f 100644
--- a/backends/platform/ds/arm9/source/dsoptions.cpp
+++ b/backends/platform/ds/arm9/source/dsoptions.cpp
@@ -433,4 +433,3 @@ void setOptions() {
}
} // End of namespace DS
-
diff --git a/backends/platform/ds/arm9/source/fat/disc_io.h b/backends/platform/ds/arm9/source/fat/disc_io.h
index 0fc83a7493..cd930ba454 100644
--- a/backends/platform/ds/arm9/source/fat/disc_io.h
+++ b/backends/platform/ds/arm9/source/fat/disc_io.h
@@ -218,4 +218,3 @@ typedef struct {
#endif
#endif // define DISC_IO_H
-
diff --git a/backends/platform/ds/arm9/source/fat/io_m3_common.c b/backends/platform/ds/arm9/source/fat/io_m3_common.c
index 9c8280c808..e3232a4df6 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3_common.c
+++ b/backends/platform/ds/arm9/source/fat/io_m3_common.c
@@ -57,4 +57,3 @@ void _M3_changeMode (u32 mode) {
_M3_readHalfword (0x08000188);
}
}
-
diff --git a/backends/platform/ds/arm9/source/fat/io_m3_common.h b/backends/platform/ds/arm9/source/fat/io_m3_common.h
index 6d0c669783..6a0cc03c2e 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3_common.h
+++ b/backends/platform/ds/arm9/source/fat/io_m3_common.h
@@ -45,4 +45,3 @@
extern void _M3_changeMode (u32 mode);
#endif // IO_M3_COMMON_H
-
diff --git a/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s b/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s
index a6bb8dc187..f2bcce7da9 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s
+++ b/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s
@@ -193,4 +193,3 @@ sd_data_write_busy2:
ldmfd r13!,{r4-r5,r15}
@-----------------end-------------------
-
diff --git a/backends/platform/ds/arm9/source/fat/io_njsd.c b/backends/platform/ds/arm9/source/fat/io_njsd.c
index b9cb52aa00..12388da8e9 100644
--- a/backends/platform/ds/arm9/source/fat/io_njsd.c
+++ b/backends/platform/ds/arm9/source/fat/io_njsd.c
@@ -678,4 +678,4 @@ LPIO_INTERFACE NJSD_GetInterface(void) {
} ;
#endif // defined NDS
-#endif \ No newline at end of file
+#endif
diff --git a/backends/platform/ds/arm9/source/fat/io_scsd.c b/backends/platform/ds/arm9/source/fat/io_scsd.c
index 0a6ab5a528..270691436d 100644
--- a/backends/platform/ds/arm9/source/fat/io_scsd.c
+++ b/backends/platform/ds/arm9/source/fat/io_scsd.c
@@ -103,4 +103,4 @@ LPIO_INTERFACE SCSD_GetInterface(void) {
return &io_scsd ;
} ;
-#endif \ No newline at end of file
+#endif
diff --git a/backends/platform/ds/arm9/source/fat/io_scsd_asm.s b/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
index 390d36afeb..a33fa6af35 100644
--- a/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
+++ b/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
@@ -508,14 +508,3 @@ MemoryCard_IsInserted:
@----------------end MemoryCard_IsInserted---------------
.END
-
-
-
-
-
-
-
-
-
-
-
diff --git a/backends/platform/ds/arm9/source/fat/io_sd_common.c b/backends/platform/ds/arm9/source/fat/io_sd_common.c
index ade9df0d80..e7ab472e1b 100644
--- a/backends/platform/ds/arm9/source/fat/io_sd_common.c
+++ b/backends/platform/ds/arm9/source/fat/io_sd_common.c
@@ -199,5 +199,3 @@ bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
return true;
}
-
-
diff --git a/backends/platform/ds/arm9/source/fat/m3sd.s b/backends/platform/ds/arm9/source/fat/m3sd.s
index f6fab1a9e2..899cbc7927 100644
--- a/backends/platform/ds/arm9/source/fat/m3sd.s
+++ b/backends/platform/ds/arm9/source/fat/m3sd.s
@@ -197,4 +197,3 @@ DC_FlushRangeLoop:
bx lr
@---------------------------------------
.end
-
diff --git a/backends/platform/ds/arm9/source/keys.cpp b/backends/platform/ds/arm9/source/keys.cpp
index 2f8497ab19..aec7d57bda 100644
--- a/backends/platform/ds/arm9/source/keys.cpp
+++ b/backends/platform/ds/arm9/source/keys.cpp
@@ -134,4 +134,3 @@ uint32 keysUp(void) {
} // End of namespace DS
-
diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp
index b157a3a87a..fdd310ec17 100644
--- a/backends/platform/ds/arm9/source/osystem_ds.cpp
+++ b/backends/platform/ds/arm9/source/osystem_ds.cpp
@@ -901,5 +901,3 @@ void OSystem_DS::engineDone() {
#endif
}
-
-
diff --git a/backends/platform/ds/arm9/source/scummhelp.cpp b/backends/platform/ds/arm9/source/scummhelp.cpp
index 670b46a3b9..112ba49d76 100644
--- a/backends/platform/ds/arm9/source/scummhelp.cpp
+++ b/backends/platform/ds/arm9/source/scummhelp.cpp
@@ -98,4 +98,3 @@ void updateStrings(byte gameId, byte version, Common::Platform platform,
#undef ADD_BIND
#undef ADD_TEXT
#undef ADD_LINE
-
diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk
index 654475e1f3..78216cb9a2 100644
--- a/backends/platform/ds/ds.mk
+++ b/backends/platform/ds/ds.mk
@@ -236,4 +236,3 @@ $(ndsdir)/arm7/arm7.bin: $(ndsdir)/arm7/arm7.elf
#
# Fingolfin used
# CXX=arm-eabi-g++ CC=arm-eabi-gcc ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' --disable-shared --disable-debugging LDFLAGS=$DEVKITPRO/libnds/lib/libnds9.a
-
diff --git a/backends/platform/gph/build/gp2xwiz-bundle.sh b/backends/platform/gph/build/gp2xwiz-bundle.sh
index 579e2dc77b..2182f207c3 100644
--- a/backends/platform/gph/build/gp2xwiz-bundle.sh
+++ b/backends/platform/gph/build/gp2xwiz-bundle.sh
@@ -2,6 +2,16 @@
echo Quick script to make building a distribution of the GP2X Wiz backend more consistent.
+# Set the paths up here to support the build.
+
+export PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/bin:$PATH
+export PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin:$PATH
+export CXX=arm-open2x-linux-g++
+export CC=arm-open2x-linux-gcc
+export CXXFLAGS=-march=armv4t
+export LDFLAGS=-static
+export ASFLAGS=-mfloat-abi=soft
+
cd ../../../..
echo Building ScummVM for GP2X Wiz.
diff --git a/backends/platform/gph/devices/gp2x/mmuhack/readme.txt b/backends/platform/gph/devices/gp2x/mmuhack/README
index bea49d7d6d..6db7d81845 100644
--- a/backends/platform/gph/devices/gp2x/mmuhack/readme.txt
+++ b/backends/platform/gph/devices/gp2x/mmuhack/README
@@ -1,3 +1,10 @@
+PLEASE NOTE:
+
+The binary object 'mmuhack.o' is stored in the source tree as it is very awkward to
+build it manually each time and would require the use of 2 toolchains to do so.
+
+Notes on how to rebuild from the included source can be found below.
+
About
-----
@@ -107,4 +114,3 @@ Credits
Original idea/implementation: Squidge (this whole thing is also known as squidgehack)
Kernel module: NK
Documentation: notaz
-
diff --git a/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h
index 520841ace7..d01548e474 100644
--- a/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h
+++ b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h
@@ -8,4 +8,3 @@ void flush_uppermem_cache(void *start_address, void *end_address, int flags);
#ifdef __cplusplus
}
#endif
-
diff --git a/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s
index 17628c156a..265908e1fd 100644
--- a/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s
+++ b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s
@@ -3,4 +3,3 @@
flush_uppermem_cache:
swi #0x9f0002
bx lr
-
diff --git a/backends/platform/gph/gph-backend.cpp b/backends/platform/gph/gph-backend.cpp
index ae3466b836..49a1edf411 100644
--- a/backends/platform/gph/gph-backend.cpp
+++ b/backends/platform/gph/gph-backend.cpp
@@ -25,10 +25,9 @@
#include "backends/platform/sdl/sdl-sys.h"
-// #include "backends/platform/gph/gph-options.h"
#include "backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h"
#include "backends/platform/gph/gph-hw.h"
-#include "backends/platform/gph/gph-sdl.h"
+#include "backends/platform/gph/gph.h"
#include "backends/plugins/posix/posix-provider.h"
#include "backends/saves/default/default-saves.h"
#include "backends/timer/default/default-timer.h"
@@ -51,7 +50,7 @@
#include <limits.h>
#include <errno.h>
#include <sys/stat.h>
-#include <time.h> // for getTimeAndDate()
+#include <time.h> // for getTimeAndDate()
/* Dump console info to files. */
#define DUMP_STDOUT
@@ -104,49 +103,50 @@ void OSystem_GPH::initBackend() {
_savefileManager = new DefaultSaveFileManager(savePath);
- #ifdef DUMP_STDOUT
- // The GP2X Wiz has a serial console on the breakout board but most users do not use this so we
- // output all our STDOUT and STDERR to files for debug purposes.
- char STDOUT_FILE[PATH_MAX+1];
- char STDERR_FILE[PATH_MAX+1];
-
- strcpy(STDOUT_FILE, workDirName);
- strcpy(STDERR_FILE, workDirName);
- strcat(STDOUT_FILE, "/scummvm.stdout.txt");
- strcat(STDERR_FILE, "/scummvm.stderr.txt");
-
- // Flush the output in case anything is queued
- fclose(stdout);
- fclose(stderr);
-
- // Redirect standard input and standard output
- FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
- if (newfp == NULL) {
- #if !defined(stdout)
- stdout = fopen(STDOUT_FILE, "w");
- #else
- newfp = fopen(STDOUT_FILE, "w");
- if (newfp) {
- *stdout = *newfp;
- }
- #endif
+#ifdef DUMP_STDOUT
+ // The GPH devices have a serial console on the breakout board
+ // but most users do not use this so we output all our STDOUT
+ // and STDERR to files for debug purposes.
+ char STDOUT_FILE[PATH_MAX+1];
+ char STDERR_FILE[PATH_MAX+1];
+
+ strcpy(STDOUT_FILE, workDirName);
+ strcpy(STDERR_FILE, workDirName);
+ strcat(STDOUT_FILE, "/scummvm.stdout.txt");
+ strcat(STDERR_FILE, "/scummvm.stderr.txt");
+
+ // Flush the output in case anything is queued
+ fclose(stdout);
+ fclose(stderr);
+
+ // Redirect standard input and standard output
+ FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
+ if (newfp == NULL) {
+#if !defined(stdout)
+ stdout = fopen(STDOUT_FILE, "w");
+#else
+ newfp = fopen(STDOUT_FILE, "w");
+ if (newfp) {
+ *stdout = *newfp;
}
+#endif
+ }
- newfp = freopen(STDERR_FILE, "w", stderr);
- if (newfp == NULL) {
- #if !defined(stderr)
- stderr = fopen(STDERR_FILE, "w");
- #else
- newfp = fopen(STDERR_FILE, "w");
- if (newfp) {
- *stderr = *newfp;
- }
- #endif
+ newfp = freopen(STDERR_FILE, "w", stderr);
+ if (newfp == NULL) {
+#if !defined(stderr)
+ stderr = fopen(STDERR_FILE, "w");
+#else
+ newfp = fopen(STDERR_FILE, "w");
+ if (newfp) {
+ *stderr = *newfp;
}
+#endif
+ }
- setbuf(stderr, NULL);
- printf("%s\n", "Debug: STDOUT and STDERR redirected to text files.");
- #endif /* DUMP_STDOUT */
+ setbuf(stderr, NULL);
+ printf("%s\n", "Debug: STDOUT and STDERR redirected to text files.");
+#endif /* DUMP_STDOUT */
/* Initialize any GP2X Wiz specific stuff we may want (Batt Status, scaler etc.) */
WIZ_HW::deviceInit();
@@ -169,9 +169,6 @@ void OSystem_GPH::initBackend() {
/* Make sure SDL knows that we have a joystick we want to use. */
ConfMan.setInt("joystick_num", 0);
- /* Now setup any device specific user options (Left handed mode, that sort of thing). */
- // GPH::setOptions();
-
/* Pass to POSIX method to do the heavy lifting */
OSystem_POSIX::initBackend();
@@ -217,11 +214,11 @@ void OSystem_GPH::quit() {
WIZ_HW::deviceDeinit();
- #ifdef DUMP_STDOUT
- printf("%s\n", "Debug: STDOUT and STDERR text files closed.");
- fclose(stdout);
- fclose(stderr);
- #endif /* DUMP_STDOUT */
+#ifdef DUMP_STDOUT
+ printf("%s\n", "Debug: STDOUT and STDERR text files closed.");
+ fclose(stdout);
+ fclose(stderr);
+#endif /* DUMP_STDOUT */
OSystem_POSIX::quit();
}
diff --git a/backends/platform/gph/gph-hw.cpp b/backends/platform/gph/gph-hw.cpp
index 2d70158001..cde50dc6b4 100644
--- a/backends/platform/gph/gph-hw.cpp
+++ b/backends/platform/gph/gph-hw.cpp
@@ -43,13 +43,13 @@
namespace WIZ_HW {
enum {
- VOLUME_NOCHG = 0,
- VOLUME_DOWN = 1,
- VOLUME_UP = 2,
- VOLUME_CHANGE_RATE = 8,
- VOLUME_MIN = 0,
- VOLUME_INITIAL = 60,
- VOLUME_MAX = 100
+ VOLUME_NOCHG = 0,
+ VOLUME_DOWN = 1,
+ VOLUME_UP = 2,
+ VOLUME_CHANGE_RATE = 8,
+ VOLUME_MIN = 0,
+ VOLUME_INITIAL = 60,
+ VOLUME_MAX = 100
};
int volumeLevel = VOLUME_INITIAL;
@@ -61,24 +61,24 @@ void deviceDeinit() {
}
void mixerMoveVolume(int direction) {
- if (volumeLevel <= 10) {
- if (direction == VOLUME_UP) volumeLevel += VOLUME_CHANGE_RATE/2;
- if (direction == VOLUME_DOWN) volumeLevel -= VOLUME_CHANGE_RATE/2;
- } else {
- if (direction == VOLUME_UP) volumeLevel += VOLUME_CHANGE_RATE;
- if (direction == VOLUME_DOWN) volumeLevel -= VOLUME_CHANGE_RATE;
- }
-
- if (volumeLevel < VOLUME_MIN) volumeLevel = VOLUME_MIN;
- if (volumeLevel > VOLUME_MAX) volumeLevel = VOLUME_MAX;
-
- unsigned long soundDev = open("/dev/mixer", O_RDWR);
-
- if (soundDev) {
- int vol = ((volumeLevel << 8) | volumeLevel);
- ioctl(soundDev, SOUND_MIXER_WRITE_PCM, &vol);
- close(soundDev);
- }
+ if (volumeLevel <= 10) {
+ if (direction == VOLUME_UP) volumeLevel += VOLUME_CHANGE_RATE / 2;
+ if (direction == VOLUME_DOWN) volumeLevel -= VOLUME_CHANGE_RATE / 2;
+ } else {
+ if (direction == VOLUME_UP) volumeLevel += VOLUME_CHANGE_RATE;
+ if (direction == VOLUME_DOWN) volumeLevel -= VOLUME_CHANGE_RATE;
+ }
+
+ if (volumeLevel < VOLUME_MIN) volumeLevel = VOLUME_MIN;
+ if (volumeLevel > VOLUME_MAX) volumeLevel = VOLUME_MAX;
+
+ unsigned long soundDev = open("/dev/mixer", O_RDWR);
+
+ if (soundDev) {
+ int vol = ((volumeLevel << 8) | volumeLevel);
+ ioctl(soundDev, SOUND_MIXER_WRITE_PCM, &vol);
+ close(soundDev);
+ }
}
} /* namespace WIZ_HW */
@@ -87,9 +87,9 @@ namespace GPH {
enum {
/* Touchscreen TapMode */
- TAPMODE_LEFT = 0,
- TAPMODE_RIGHT = 1,
- TAPMODE_HOVER = 2
+ TAPMODE_LEFT = 0,
+ TAPMODE_RIGHT = 1,
+ TAPMODE_HOVER = 2
};
int tapmodeLevel = TAPMODE_LEFT;
@@ -103,7 +103,7 @@ void ToggleTapMode() {
tapmodeLevel = TAPMODE_LEFT;
} else {
tapmodeLevel = TAPMODE_LEFT;
- }
+ }
}
} /* namespace GPH */
diff --git a/backends/platform/gph/gph-hw.h b/backends/platform/gph/gph-hw.h
index 0a1205156b..f9584ca37e 100644
--- a/backends/platform/gph/gph-hw.h
+++ b/backends/platform/gph/gph-hw.h
@@ -32,9 +32,9 @@ namespace WIZ_HW {
extern int volumeLevel;
-extern void deviceInit();
-extern void deviceDeinit();
-extern void mixerMoveVolume(int);
+extern void deviceInit();
+extern void deviceDeinit();
+extern void mixerMoveVolume(int);
} /* namespace WIZ_HW */
@@ -42,7 +42,7 @@ namespace GPH {
extern int tapmodeLevel;
-extern void ToggleTapMode();
+extern void ToggleTapMode();
} /* namespace GPH */
diff --git a/backends/platform/gph/gph-main.cpp b/backends/platform/gph/gph-main.cpp
index 1a8c6686ca..2c43af151f 100644
--- a/backends/platform/gph/gph-main.cpp
+++ b/backends/platform/gph/gph-main.cpp
@@ -20,7 +20,7 @@
*
*/
-#include "backends/platform/gph/gph-sdl.h"
+#include "backends/platform/gph/gph.h"
#include "backends/plugins/posix/posix-provider.h"
#include "base/main.h"
@@ -43,7 +43,7 @@ int main(int argc, char *argv[]) {
int res = scummvm_main(argc, argv);
// Free OSystem
- delete (OSystem_GPH *)g_system;
+ delete(OSystem_GPH *)g_system;
return res;
}
diff --git a/backends/platform/gph/gph-sdl.h b/backends/platform/gph/gph.h
index 8b943f98f3..80f43f0bab 100644
--- a/backends/platform/gph/gph-sdl.h
+++ b/backends/platform/gph/gph.h
@@ -34,7 +34,7 @@
#define __GP2XWIZ__
#ifndef PATH_MAX
- #define PATH_MAX 255
+#define PATH_MAX 255
#endif
class OSystem_GPH : public OSystem_POSIX {
diff --git a/backends/platform/iphone/iphone_main.m b/backends/platform/iphone/iphone_main.m
index 7bb5f0c317..c2ec328bf5 100644
--- a/backends/platform/iphone/iphone_main.m
+++ b/backends/platform/iphone/iphone_main.m
@@ -137,4 +137,3 @@ int main(int argc, char** argv) {
}
@end
-
diff --git a/backends/platform/iphone/iphone_video.m b/backends/platform/iphone/iphone_video.m
index 04d25cebf8..eb16676428 100644
--- a/backends/platform/iphone/iphone_video.m
+++ b/backends/platform/iphone/iphone_video.m
@@ -754,4 +754,3 @@ bool getLocalMouseCoords(CGPoint *point) {
}
@end
-
diff --git a/backends/platform/maemo/debian/changelog b/backends/platform/maemo/debian/changelog
new file mode 100644
index 0000000000..d3e0287186
--- /dev/null
+++ b/backends/platform/maemo/debian/changelog
@@ -0,0 +1,227 @@
+scummvm (1.4.0~git) unstable; urgency=low
+
+ * development snapshot
+
+ -- Tarek Soliman <tsoliman@scummvm.org> Wed, 05 Oct 2011 19:01:25 -0500
+
+scummvm (1.2.1~pre) unstable; urgency=low
+
+ * 1.2.1 testing release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 8 Dec 2010 21:43:29 +0100
+scummvm (1.2.0~pre) unstable; urgency=low
+
+ * 1.2.0 testing release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 8 Oct 2010 21:38:12 +0200
+scummvm (1.1.0~pre) unstable; urgency=low
+
+ * 1.1.0 testing release
+ * cleanup for N900 (new firmwares need less hacks)
+ * unified binary for all devices now have datafiles included (~2MB)
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 24 Mar 2010 01:48:05 +0100
+scummvm (1.0.0-4) unstable; urgency=low
+
+ * datadir optified (/usr/share/scummvm -> /opt/scummvm/share)
+ * added engine files to datadir
+ * Application Manager icon enlarged to 48x48
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Thu, 17 Dec 2009 13:54:51 +0100
+scummvm (1.0.0-3) unstable; urgency=low
+
+ * disable taskmanager topleft button in fullscreen mode (N900)
+ * map shift+click to right button click
+ * mam ctrl+click to mouse move (no click)
+ * set fullscreen window as _HILDON_NON_COMPOSITED_WINDOW (N900)
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Tue, 15 Dec 2009 23:12:51 +0100
+scummvm (1.0.0-2) unstable; urgency=low
+
+ * grab N900 volume keys
+ * map Shift+Backspace to Escape key, shift+enter to Menu key (N900)
+ * optified = main binary moved to /opt/scummvm/bin/scummvm
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 12 Dec 2009 23:39:04 +0100
+scummvm (1.0.0-1) unstable; urgency=low
+
+ * -mcpu=arm1136j-s -mfpu=vfp -mfloat-abi=softfp breaks Gobliins, reverted
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 2 Dec 2009 10:25:11 +0100
+scummvm (1.0.0) unstable; urgency=low
+
+ * upstream 1.0 release
+ * Initial support for N900
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 6 Nov 2009 22:02:25 +0100
+scummvm (1.0.0~rc1-3) unstable; urgency=low
+
+ * updated to 1.0 branch revision 43999 to fix bugs (Cruise pause, ..)
+ * Cruise for Corpse mapping added to zoom+ for N800/770
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 7 Sep 2009 09:03:13 +0200
+scummvm (1.0.0~rc1-2) unstable; urgency=low
+
+ * Cruise for Corpse key bindings added
+ - menu key for menu, zoom-=right click, zoom+=context menu
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 2 Sep 2009 23:03:59 +0200
+scummvm (1.0.0~rc1-1) unstable; urgency=low
+
+ * Discworld key bindings added - menu key for menu, zoom-=right click, zoom+=Enter/y key
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 2 Sep 2009 09:53:08 +0200
+scummvm (1.0.0~rc1) unstable; urgency=low
+
+ * upstream 1.0.0rc1 release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Thu, 20 Aug 2009 23:33:59 +0200
+scummvm (0.13.1) unstable; urgency=low
+
+ * upstream 0.13.1 release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 18 Apr 2009 22:40:42 +0200
+scummvm (0.13.0-2) unstable; urgency=low
+
+ * dbus_service.patch is incomplete - needs also install line in debian/rules
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 27 Feb 2009 20:37:29 +0100
+scummvm (0.13.0-1) unstable; urgency=low
+
+ * fix crash in task switcher caption code when .scummvmrc had fullscreen value set
+ * enabled also dbus_service.patch for home key switching back (not needed in OS < 2008)
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 27 Feb 2009 09:29:01 +0100
+scummvm (0.13.0) unstable; urgency=low
+
+ * upstream 0.13.0 release
+ * Feeble Files mapping
+ * task switcher item name patch from mikkov
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 18 Feb 2009 21:52:33 +0100
+scummvm (0.11.99-4) unstable; urgency=low
+
+ * Maemo extras-devel test version
+ - maemo-taskswitcher.patch: title shown right from the beginning
+ and title not fixed to "ScummVM" only
+ - dbus_service.patch: modify scummvm.desktop, scummvm.wrapper and
+ scummvm.service to make switching application automatically back
+ via second home key long press to work
+
+ -- Mikko Vartiainen <mvartiainen@gmail.com> Thu, 03 Jan 2009 01:59:52 +0200
+scummvm (0.11.99-3) unstable; urgency=low
+
+ * Maemo extras-devel test version
+ - maemo-taskswitcher.patch
+
+ -- Mikko Vartiainen <mvartiainen@gmail.com> Thu, 01 Jan 2009 13:13:13 +0200
+scummvm (0.11.99-2) unstable; urgency=low
+
+ * Maemo extras-devel test version
+ - keeping version below 0.12.0
+ - not in user/ category
+
+ -- Mikko Vartiainen <mvartiainen@gmail.com> Thu, 01 Jan 2009 02:04:14 +0200
+scummvm (0.12.0) unstable; urgency=low
+
+ * upstream 0.12.0 release
+ * update description
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 25 Aug 2008 21:47:41 +0200
+scummvm (0.11.99) unstable; urgency=low
+
+ * upstream 0.12.0 testing pre-release
+ * big icons added for OS2008 menu
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 22 Aug 2008 08:20:48 +0200
+scummvm (0.11.1) unstable; urgency=low
+
+ * upstream 0.11.1 release
+ * mapping for N810: zoom+ = menu for all games (except FW)
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 23 Feb 2008 20:41:37 +0100
+scummvm (0.11.0-2) unstable; urgency=low
+
+ * mapping for N800/770: zoom+ = y, zoom- = 1 (all games except FW)
+ this fixes save dialog in BS1 and also allows to exit some games via 'y'
+ * mapping for N810: zoom- = rightclick for all games
+ * updated to revision 30849 from 0.11 branch (some bugfixes for 0.11.1)
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 11 Feb 2008 22:22:48 +0100
+scummvm (0.11.0-1) unstable; urgency=low
+
+ * theme files added back
+ * SWORD2,SAGA - added zoom keys =1/2 for saved games
+ * different mapping for N810 rightclick=zoom-,menu=zoom+ (currently only in LURE)
+ * added NEWS README COPYRIGHT do doc dir as per scummvm project guidelines
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Sun, 13 Jan 2008 22:58:41 +0100
+scummvm (0.11.0-0) unstable; urgency=low
+
+ * upstream 0.11 release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 12 Jan 2008 22:26:34 +0100
+scummvm (0.10.0-5) unstable; urgency=low
+
+ * fixed for chinook, menu selection postinst script added
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Thu, 25 Oct 2007 09:56:32 +0200
+scummvm (0.10.0-4) unstable; urgency=low
+
+ * AGI - added pred.dic to DATA_PATH (=/usr/share/scummvm) to enable
+ predictive input
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Tue, 28 Aug 2007 09:58:29 +0200
+scummvm (0.10.0-3) unstable; urgency=low
+
+ * SCUMM - added mapping also for key up events (may fix right button in FT?)
+ * SWORD2 - added right button press mapping (not tested)
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 20 Aug 2007 22:39:07 +0200
+scummvm (0.10.0-2) unstable; urgency=low
+
+ * Future Wars - add mapping for left/up/down/right,zoom +/-
+ * fix SDL backend to set mouse position on button down event
+ as we may not have mousemove events with touchscreen
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 13 Jul 2007 09:56:37 +0200
+scummvm (0.10.0-1) unstable; urgency=low
+
+ * mapped F10 in Future Wars to menu key
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 11 Jul 2007 22:20:00 +0200
+scummvm (0.10.0) unstable; urgency=low
+
+ * upstream 0.10 release, enabled FLAC too
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 4 Jul 2007 12:48:48 +0200
+scummvm (0.9.1-1) unstable; urgency=low
+
+ * 0.9.1 mapped right mouse button in sword1
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 18 Jun 2007 21:15:31 +0200
+scummvm (0.9.1) unstable; urgency=low
+
+ * 0.9.1 upstream release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 1 Nov 2006 20:40:51 +0100
+scummvm (0.9.0-3) unstable; urgency=low
+
+ * merged fixes in 0.9.0 upstream branch
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 9 Oct 2006 15:40:59 +0200
+scummvm (0.9.0-2) unstable; urgency=low
+
+ * merged fixes in 0.9.0 upstream branch
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 12 Aug 2006 20:10:47 +0200
+scummvm (0.9.0-1) unstable; urgency=low
+
+ * merged changes in 0.9.0 upstream release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Sun, 23 Jul 2006 22:29:51 +0200
+scummvm (0.9.0) unstable; urgency=low
+
+ * 0.9.0 upstream release
+
+ -- Frantisek Dufka <dufkaf@seznam.cz> Tue, 27 Jun 2006 20:30:54 +0200
diff --git a/backends/platform/maemo/debian/compat b/backends/platform/maemo/debian/compat
new file mode 100644
index 0000000000..b8626c4cff
--- /dev/null
+++ b/backends/platform/maemo/debian/compat
@@ -0,0 +1 @@
+4
diff --git a/backends/platform/maemo/debian/control b/backends/platform/maemo/debian/control
new file mode 100644
index 0000000000..a1f0d95002
--- /dev/null
+++ b/backends/platform/maemo/debian/control
@@ -0,0 +1,51 @@
+Source: scummvm
+Section: user/games
+Priority: optional
+Maintainer: Tarek Soliman <tsoliman@scummvm.org>
+Build-Depends: debhelper (>> 4.0.0), libsdl1.2-dev, libmad0-dev, libasound2-dev, libvorbisidec-dev, libmpeg2-4-dev, libflac-dev (>= 1.1.2), libz-dev, quilt
+
+Standards-Version: 3.6.1.1
+Package: scummvm
+Depends: ${shlibs:Depends}
+Architecture: i386 armel
+Section: user/games
+Description: interpreter that will play graphic adventure games
+ written for LucasArts' SCUMM virtual machine, Sierra's AGI adventures,
+ Adventure Soft's Simon the Sorcerer 1, 2 and Feeble Files,
+ Revolution Software's Beneath a Steel Sky and Broken Sword 1 and 2,
+ Interactive Binary Illusions' Flight of the Amazon Queen,
+ Coktel Vision's Gobliiins, Wyrmkeep's Inherit the Earth,
+ Westwood's Legend of Kyrandia, and various others.
+ This package does not contain any actual games.
+XBS-Maemo-Icon-26:
+ iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAC/VBMVEUICwcH
+ CQUKDAgLDQoMDwsOEAwREAUPEQ0QEg8PFQoRExAUEwoVFAwPGAcTFBIRFg0W
+ FQ0XFg4RGgkTGA8XGQsTGwwUHA0aGRIWGxMXHQkVHQ8aGhMbGxQcHQocGxUZ
+ HwsYIgcfHxgeIRUbJQwhIBofJAweJwgfKQocKwwgKgshKw0gLggfLg8jLQ8n
+ LwwpLhEmMwcoMRQjNgotLCYmNwQlNwwqOBQtOQgsOQ8xNh4sPQswNyQqQAUw
+ PAsuOiAsQgcwOyIqRgIsSAQvRgs0PyY1Rg06RA0+PDAwSwg2RxUzTQE4TQsz
+ VAc/SSo6VAk4VwE6VRM2XAVAUC85XwlJVCNEXQo+YwJGXwxMWS1JXC5AagBI
+ awJUagRIcQBSbwpHeAJTaD9OdwNXcwJKewZNfABacRlOfQBPfgBQfwBMggBW
+ fgBNgwNSgQJOhAVecUJjdSZefwNUiABZhgBjeDZieDxhezFQjQBgghZkhQ5j
+ iQJUkAZcixJmgDZnhCtckQpblgBekw5clwBqgkthlQBdmAJriz90hz5omgBs
+ mAhxlgd0mAB5lgBpnA16khdzmAtxnABooQBtnwB4jUpzngBkpQR5nQF8j0Vr
+ pQduoRZ4nRR3k014oQBzpAt8oAh/ogBvqA5trACBmypwqRF1pw+GogCAow+D
+ pQB8phJ/nUNurxh0rRd4rwmHqQd6qDOArwCJqwyDsgCMrgB8ryiFtAB7uQN8
+ sDKBuAWOsBWJqFR8ti2IsiOSswaBuRt6vxCOtgqXsgePrjR9wQCFuw2KuQyB
+ uSeSuACEux6JuR2OvACAxACEvCuSuhOHujSMwQGTtiqfuACRvwGOvRWHuz2T
+ wASPwwmYvwaLvTebuxiWvhmSwBqZwAmNu0aevgiKvkCVviaMvE6bwQycuTid
+ vhylvQyZwB2cwg+QywCawR6fwB+bwyGI0gaewCudxCOjwyOT1ACmwjiX0g+j
+ xTqmxzOd1gCV0i6kyyuoyTah1Sif2h6tzjukzF+pz1uq1Eeg2Uml3U1kaLAB
+ AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAHrSURBVCjPY2BAAC5ubkFB
+ BkzAzggDfKgSUFEmKCmOIsPvktA0aVpbSYQ+FwsjkwpMBsi2m/X7z89v3759
+ +ngg1UqIlZEVponJYcW/rw9unH/04u2bc0vbo+WZWGCahEv/fj+6Yc2SZfv3
+ b5w6+eACHVYWmCazMz+unN44b3ZfV3dnx5yDiaKsUAOZGD2/fL58+PSGg3Gu
+ buEVWyZacLCzw6S8X324fOHqibMxWpKy5okBIjAZoNOt9r47e+HOnafbe/ND
+ DNWkOGAyDKwsCtXPTly4eufqm+fvHy4M1RRggsnJMLI6z9x99Oqtx7cuPP/2
+ ele5LjtCGyObbcHcDfuevHn+5s319RuSpOByrEwcwsqhlcvXHbp38+LxiXP6
+ DeBSTKzWvkrCun5Zq04dO7S6p67ZHibFziiRt6PYUk5YtfbUqSMTGnKyHaFS
+ rMDA3fHr7tqayKDWa0dWVmXHp5lCpRgZ2QI2HTl25NLt+1t3rppRFJ8SrwGX
+ 4g9rmbJo0cpVqxZNaK5OS0nzF4NLMWkHZ1TVN9bXlxXmAo2L0uNgZITaxcjI
+ axAYH5+RATQrPtZHk5udA+Z2cIpQN3Hy8vOwMVLmYGTidoenDSawLAsnJz8L
+ kMUiY4ySpviYoKmKRVAcIyXKyIiLyygi+ADqVqrAkApevwAAAABJRU5ErkJg
+ gg==
diff --git a/backends/platform/maemo/debian/copyright b/backends/platform/maemo/debian/copyright
new file mode 100644
index 0000000000..a90e5a21cc
--- /dev/null
+++ b/backends/platform/maemo/debian/copyright
@@ -0,0 +1,22 @@
+ScummVM was debianized by Bastien Nocera <hadess@hadess.net> the 5th Apr 2002.
+It was adopted by Tore Anderson <tore@linpro.no> the 4th Oct 2002.
+Packaged for the Maemo platform by Tomas Junnoen <tomas@fs-security.com> Oct 2005
+From 0.8.2 to 1.2.1, packaging for Maemo was done by Frantisek Dufka <dufkaf@seznam.cz>
+Since 1.4 packaging for Maemo is done by Tarek Soliman <tarek@bashasoliman.com>
+
+It was downloaded from <http://www.scummvm.org/>.
+
+Upstream Authors: see AUTHORS file of the ScummVM source distribution.
+
+Copyright:
+
+ 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, or (at your option) any
+ later version. In addition, some parts are also licensed under LGPL and
+ BSD licenses. See COPYING.BSD and COPYING.LGPL.
+
+ On Debian GNU/Linux systems, the complete text of the GNU General
+ Public License can be found in `/usr/share/common-licenses/GPL'.
+
+This copyright also applies to the Debian-related build scripts.
diff --git a/backends/platform/maemo/debian/postinst b/backends/platform/maemo/debian/postinst
new file mode 100644
index 0000000000..3925f6c275
--- /dev/null
+++ b/backends/platform/maemo/debian/postinst
@@ -0,0 +1,25 @@
+#! /bin/sh
+
+# This is a workaround for older maemo versions related to the icon.
+# The /usr/share/icons/scummvm.xpm icon is needed for OS2006 (Nokia 770)
+# but if present it overrides nicer icons for newer systems in /usr/share/icons/hicolor.
+# This workaround removes it if the OS isn't old (2006/2007).
+
+if [ "$1" = "configure" ] ; then
+OSVER=$OSSO_VERSION
+[ -z "$OSVER" -a -f /etc/osso_software_version ] && OSVER=`cat /etc/osso_software_version`
+OSVER=`echo $OSVER | cut -d _ -f 2`
+case $OSVER in
+ 2006*|2007*)
+ #nothing to do
+ true
+ ;;
+ *)
+ #ugly trick, until this icon is removed big icon in menu does not show
+ [ -f /usr/share/icons/scummvm.xpm ] && rm /usr/share/icons/scummvm.xpm
+ ;;
+esac
+ [ -x /usr/bin/gtk-update-icon-cache ] && /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
+ [ -x /usr/bin/maemo-select-menu-location -a -z "$2" ] && /usr/bin/maemo-select-menu-location scummvm.desktop tana_fi_games
+fi
+exit 0
diff --git a/backends/platform/maemo/debian/rules b/backends/platform/maemo/debian/rules
new file mode 100755
index 0000000000..7613df25b4
--- /dev/null
+++ b/backends/platform/maemo/debian/rules
@@ -0,0 +1,71 @@
+#!/usr/bin/make -f
+
+#include /usr/share/quilt/quilt.make
+
+build: scummvm
+
+scummvm:
+ dh_testdir
+ ./configure --host=maemo
+ $(MAKE)
+
+clean:
+ dh_testdir
+ dh_testroot
+ -$(MAKE) distclean
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean
+ dh_installdirs
+# run as fake dbus-service to enable switching back to application from desktop via home key
+ install -m0755 dists/maemo/scummvm.servicewrapper debian/scummvm/usr/games/scummvm
+ install -m0644 dists/maemo/scummvm.servicedesktop debian/scummvm/usr/share/applications/hildon/scummvm.desktop
+ install -m0644 dists/maemo/scummvm.service debian/scummvm/usr/share/dbus-1/services
+# the following commented out lines are the alternative for not running scummvm as a fake service
+# install -m0755 dists/maemo/scummvm.wrapper debian/scummvm/usr/games/scummvm
+# install -m0644 dists/maemo/scummvm.desktop debian/scummvm/usr/share/applications/hildon
+ install -m0644 dists/maemo/scummvm26.png debian/scummvm/usr/share/icons/hicolor/26x26/hildon/scummvm.png
+ install -m0644 dists/maemo/scummvm40.png debian/scummvm/usr/share/icons/hicolor/40x40/hildon/scummvm.png
+ install -m0644 dists/maemo/scummvm48.png debian/scummvm/usr/share/icons/hicolor/48x48/hildon/scummvm.png
+ install -m0644 dists/maemo/scummvm64.png debian/scummvm/usr/share/icons/hicolor/64x64/hildon/scummvm.png
+ install -m0644 icons/scummvm.xpm debian/scummvm/usr/share/icons
+# install -m0644 -d debian/scummvm/usr/lib/scummvm
+# install -m0644 plugins/lib*.so debian/scummvm/usr/lib/scummvm
+##non-optified version
+# install -m0755 scummvm debian/scummvm/usr/games/scummvm.bin
+# install -m0644 -d debian/scummvm/usr/share/scummvm
+# install -m0644 dists/pred.dic debian/scummvm/usr/share/scummvm
+# install -m0644 gui/themes/scummclassic.zip gui/themes/scummmodern.zip debian/scummvm/usr/share/scummvm
+# optified version (save rootfs space on N900), see also configure prefix and datadir paths above
+ install -m0644 -d debian/scummvm/opt/scummvm/bin
+ install -m0755 scummvm debian/scummvm/opt/scummvm/bin
+ install -m0644 -d debian/scummvm/opt/scummvm/share
+ install -m0644 dists/pred.dic debian/scummvm/opt/scummvm/share
+ install -m0644 gui/themes/scummclassic.zip gui/themes/scummmodern.zip debian/scummvm/opt/scummvm/share
+ install -m0644 backends/vkeybd/packs/vkeybd_default.zip debian/scummvm/opt/scummvm/share
+# for optified version we can also add engine datafiles
+ install -m0644 dists/engine-data/drascula.dat dists/engine-data/hugo.dat dists/engine-data/kyra.dat dists/engine-data/lure.dat dists/engine-data/m4.dat dists/engine-data/mads.dat dists/engine-data/queen.tbl dists/engine-data/sky.cpt dists/engine-data/teenagent.dat dists/engine-data/toon.dat debian/scummvm/opt/scummvm/share
+
+ install -m0644 -d debian/scummvm/usr/share/doc/scummvm
+ install -m0644 NEWS README COPYRIGHT debian/scummvm/usr/share/doc/scummvm
+binary: binary-arch
+
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs NEWS
+ dh_link
+ dh_strip
+ dh_fixperms
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary-indep:
+
+.PHONY: build clean binary install binary-arch binary-indep
diff --git a/backends/platform/maemo/debian/scummvm.dirs b/backends/platform/maemo/debian/scummvm.dirs
new file mode 100644
index 0000000000..1a452dfbfc
--- /dev/null
+++ b/backends/platform/maemo/debian/scummvm.dirs
@@ -0,0 +1,8 @@
+usr/games
+usr/share/icons
+usr/share/icons/hicolor/26x26/hildon
+usr/share/icons/hicolor/40x40/hildon
+usr/share/icons/hicolor/48x48/hildon
+usr/share/icons/hicolor/64x64/hildon
+usr/share/applications/hildon
+usr/share/dbus-1/services
diff --git a/backends/platform/maemo/maemo-common.h b/backends/platform/maemo/maemo-common.h
new file mode 100644
index 0000000000..f33aa24278
--- /dev/null
+++ b/backends/platform/maemo/maemo-common.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.
+ *
+ */
+
+#if defined(MAEMO)
+
+#ifndef PLATFORM_SDL_MAEMO_COMMON_H
+#define PLATFORM_SDL_MAEMO_COMMON_H
+
+namespace Maemo {
+
+enum ModelType {
+ kModelTypeN800 = 1,
+ kModelTypeN810 = 2,
+ kModelTypeN900 = 4,
+ kModelTypeInvalid = 0
+};
+
+struct Model {
+ const char *hwId;
+ ModelType modelType;
+ const char *hwAlias;
+ bool hwKeyboard;
+};
+
+static const Model models[] = {
+ {"RX-34", kModelTypeN800, "N800", false},
+ {"RX-44", kModelTypeN810, "N810", true},
+ {"RX-48", kModelTypeN810, "N810W", true},
+ {"RX-51", kModelTypeN900, "N900", true},
+ {0, kModelTypeInvalid, 0, true}
+};
+
+} // namespace Maemo
+
+#endif // ifndef PLATFORM_SDL_MAEMO_COMMON_H
+
+#endif // if defined(MAEMO)
diff --git a/backends/platform/maemo/maemo.cpp b/backends/platform/maemo/maemo.cpp
new file mode 100644
index 0000000000..3571039e62
--- /dev/null
+++ b/backends/platform/maemo/maemo.cpp
@@ -0,0 +1,113 @@
+/* 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.
+ *
+ */
+
+#if defined(MAEMO)
+
+#define FORBIDDEN_SYMBOL_EXCEPTION_getenv
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+
+#include "backends/platform/maemo/maemo.h"
+#include "backends/events/maemosdl/maemosdl-events.h"
+#include "common/textconsole.h"
+
+
+#include <SDL/SDL_syswm.h>
+#include <X11/Xutil.h>
+
+namespace Maemo {
+
+OSystem_SDL_Maemo::OSystem_SDL_Maemo()
+ :
+ OSystem_POSIX() {
+}
+
+void OSystem_SDL_Maemo::initBackend() {
+ // Create the events manager
+ if (_eventSource == 0)
+ _eventSource = new MaemoSdlEventSource();
+
+ ConfMan.set("vkeybdpath", DATA_PATH);
+
+ _model = Model(detectModel());
+
+ // Call parent implementation of this method
+ OSystem_POSIX::initBackend();
+}
+
+void OSystem_SDL_Maemo::quit() {
+ delete this;
+}
+
+void OSystem_SDL_Maemo::fatalError() {
+ delete this;
+}
+
+void OSystem_SDL_Maemo::setXWindowName(const char *caption) {
+ SDL_SysWMinfo info;
+ SDL_VERSION(&info.version);
+ if (SDL_GetWMInfo(&info)) {
+ Display *dpy = info.info.x11.display;
+ Window win;
+ win = info.info.x11.fswindow;
+ if (win) XStoreName(dpy, win, caption);
+ win = info.info.x11.wmwindow;
+ if (win) XStoreName(dpy, win, caption);
+ }
+}
+
+void OSystem_SDL_Maemo::setWindowCaption(const char *caption) {
+ Common::String cap;
+ byte c;
+
+ // The string caption is supposed to be in LATIN-1 encoding.
+ // SDL expects UTF-8. So we perform the conversion here.
+ while ((c = *(const byte *)caption++)) {
+ if (c < 0x80)
+ cap += c;
+ else {
+ cap += 0xC0 | (c >> 6);
+ cap += 0x80 | (c & 0x3F);
+ }
+ }
+
+ SDL_WM_SetCaption(cap.c_str(), cap.c_str());
+
+ Common::String cap2("ScummVM - "); // 2 lines in OS2008 task switcher, set first line
+ cap = cap2 + cap;
+ setXWindowName(cap.c_str());
+}
+
+const Maemo::Model OSystem_SDL_Maemo::detectModel() {
+ Common::String deviceHwId = Common::String(getenv("SCUMMVM_MAEMO_DEVICE"));
+ const Model *model;
+ for (model = models; model->hwId; model++) {
+ if (deviceHwId.equals(model->hwId))
+ return *model;
+ }
+ return *model;
+}
+
+} //namespace Maemo
+
+#endif
diff --git a/backends/platform/maemo/maemo.h b/backends/platform/maemo/maemo.h
new file mode 100644
index 0000000000..e42936ddf0
--- /dev/null
+++ b/backends/platform/maemo/maemo.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.
+ *
+ */
+
+#if defined(MAEMO)
+
+#ifndef PLATFORM_SDL_MAEMO_H
+#define PLATFORM_SDL_MAEMO_H
+
+#include "backends/platform/sdl/posix/posix.h"
+#include "backends/platform/maemo/maemo-common.h"
+
+namespace Maemo {
+
+class OSystem_SDL_Maemo : public OSystem_POSIX {
+public:
+ OSystem_SDL_Maemo();
+
+ virtual void initBackend();
+ virtual void quit();
+ virtual void fatalError();
+ virtual void setWindowCaption(const char *caption);
+
+ Model getModel() { return _model; }
+
+private:
+ virtual void setXWindowName(const char *caption);
+
+ const Model detectModel();
+ Model _model;
+
+};
+
+} // namespace Maemo
+
+#endif // ifndef PLATFORM_SDL_MAEMO_H
+
+#endif // if defined(MAEMO)
diff --git a/backends/platform/maemo/main.cpp b/backends/platform/maemo/main.cpp
new file mode 100644
index 0000000000..7e8a316eb5
--- /dev/null
+++ b/backends/platform/maemo/main.cpp
@@ -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.
+ *
+ */
+
+#if defined(MAEMO)
+
+#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h
+
+#include "backends/platform/maemo/maemo.h"
+#include "backends/plugins/sdl/sdl-provider.h"
+#include "base/main.h"
+
+#include <unistd.h>
+
+int main(int argc, char* argv[]) {
+ g_system = new Maemo::OSystem_SDL_Maemo();
+ assert(g_system);
+
+ ((Maemo::OSystem_SDL_Maemo *)g_system)->init();
+
+#ifdef DYNAMIC_MODULES
+ PluginManager::instance().addPluginProvider(new SDLPluginProvider());
+#endif
+
+ // Invoke the actual ScummVM main entry point:
+ int res = scummvm_main(argc, argv);
+
+ // Free OSystem
+ delete (Maemo::OSystem_SDL_Maemo *)g_system;
+
+ return res;
+}
+
+#endif
diff --git a/backends/platform/maemo/module.mk b/backends/platform/maemo/module.mk
new file mode 100644
index 0000000000..47f6b56ad0
--- /dev/null
+++ b/backends/platform/maemo/module.mk
@@ -0,0 +1,13 @@
+MODULE := backends/platform/maemo
+
+MODULE_OBJS := \
+ main.o \
+ maemo.o
+
+# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS.
+MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS))
+OBJS := $(MODULE_OBJS) $(OBJS)
+MODULE_DIRS += $(sort $(dir $(MODULE_OBJS)))
+
+# Hack to ensure the SDL backend is built so we can use OSystem_SDL.
+-include $(srcdir)/backends/platform/sdl/module.mk
diff --git a/backends/platform/maemo/scummvm-1.1.0-maemo.patch b/backends/platform/maemo/scummvm-1.1.0-maemo.patch
deleted file mode 100644
index 49b14120b5..0000000000
--- a/backends/platform/maemo/scummvm-1.1.0-maemo.patch
+++ /dev/null
@@ -1,1371 +0,0 @@
-diff -Naur scummvm-1.1.orig/debian/changelog scummvm-1.1/debian/changelog
---- scummvm-1.1.orig/debian/changelog 1970-01-01 01:00:00.000000000 +0100
-+++ scummvm-1.1/debian/changelog 2010-03-24 15:40:44.000000000 +0100
-@@ -0,0 +1,211 @@
-+scummvm (1.1.0~pre) unstable; urgency=low
-+
-+ * 1.1.0 testing release
-+ * cleanup for N900 (new firmwares need less hacks)
-+ * unified binary for all devices now have datafiles included (~2MB)
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 24 Mar 2010 01:48:05 +0100
-+scummvm (1.0.0-4) unstable; urgency=low
-+
-+ * datadir optified (/usr/share/scummvm -> /opt/scummvm/share)
-+ * added engine files to datadir
-+ * Application Manager icon enlarged to 48x48
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Thu, 17 Dec 2009 13:54:51 +0100
-+scummvm (1.0.0-3) unstable; urgency=low
-+
-+ * disable taskmanager topleft button in fullscreen mode (N900)
-+ * map shift+click to right button click
-+ * mam ctrl+click to mouse move (no click)
-+ * set fullscreen window as _HILDON_NON_COMPOSITED_WINDOW (N900)
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Tue, 15 Dec 2009 23:12:51 +0100
-+scummvm (1.0.0-2) unstable; urgency=low
-+
-+ * grab N900 volume keys
-+ * map Shift+Backspace to Escape key, shift+enter to Menu key (N900)
-+ * optified = main binary moved to /opt/scummvm/bin/scummvm
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 12 Dec 2009 23:39:04 +0100
-+scummvm (1.0.0-1) unstable; urgency=low
-+
-+ * -mcpu=arm1136j-s -mfpu=vfp -mfloat-abi=softfp breaks Gobliins, reverted
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 2 Dec 2009 10:25:11 +0100
-+scummvm (1.0.0) unstable; urgency=low
-+
-+ * upstream 1.0 release
-+ * Initial support for N900
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 6 Nov 2009 22:02:25 +0100
-+scummvm (1.0.0~rc1-3) unstable; urgency=low
-+
-+ * updated to 1.0 branch revision 43999 to fix bugs (Cruise pause, ..)
-+ * Cruise for Corpse mapping added to zoom+ for N800/770
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 7 Sep 2009 09:03:13 +0200
-+scummvm (1.0.0~rc1-2) unstable; urgency=low
-+
-+ * Cruise for Corpse key bindings added
-+ - menu key for menu, zoom-=right click, zoom+=context menu
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 2 Sep 2009 23:03:59 +0200
-+scummvm (1.0.0~rc1-1) unstable; urgency=low
-+
-+ * Discworld key bindings added - menu key for menu, zoom-=right click, zoom+=Enter/y key
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 2 Sep 2009 09:53:08 +0200
-+scummvm (1.0.0~rc1) unstable; urgency=low
-+
-+ * upstream 1.0.0rc1 release
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Thu, 20 Aug 2009 23:33:59 +0200
-+scummvm (0.13.1) unstable; urgency=low
-+
-+ * upstream 0.13.1 release
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 18 Apr 2009 22:40:42 +0200
-+scummvm (0.13.0-2) unstable; urgency=low
-+
-+ * dbus_service.patch is incomplete - needs also install line in debian/rules
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 27 Feb 2009 20:37:29 +0100
-+scummvm (0.13.0-1) unstable; urgency=low
-+
-+ * fix crash in task switcher caption code when .scummvmrc had fullscreen value set
-+ * enabled also dbus_service.patch for home key switching back (not needed in OS < 2008)
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 27 Feb 2009 09:29:01 +0100
-+scummvm (0.13.0) unstable; urgency=low
-+
-+ * upstream 0.13.0 release
-+ * Feeble Files mapping
-+ * task switcher item name patch from mikkov
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 18 Feb 2009 21:52:33 +0100
-+scummvm (0.11.99-4) unstable; urgency=low
-+
-+ * Maemo extras-devel test version
-+ - maemo-taskswitcher.patch: title shown right from the beginning
-+ and title not fixed to "ScummVM" only
-+ - dbus_service.patch: modify scummvm.desktop, scummvm.wrapper and
-+ scummvm.service to make switching application automatically back
-+ via second home key long press to work
-+
-+ -- Mikko Vartiainen <mvartiainen@gmail.com> Thu, 03 Jan 2009 01:59:52 +0200
-+scummvm (0.11.99-3) unstable; urgency=low
-+
-+ * Maemo extras-devel test version
-+ - maemo-taskswitcher.patch
-+
-+ -- Mikko Vartiainen <mvartiainen@gmail.com> Thu, 01 Jan 2009 13:13:13 +0200
-+scummvm (0.11.99-2) unstable; urgency=low
-+
-+ * Maemo extras-devel test version
-+ - keeping version below 0.12.0
-+ - not in user/ category
-+
-+ -- Mikko Vartiainen <mvartiainen@gmail.com> Thu, 01 Jan 2009 02:04:14 +0200
-+scummvm (0.12.0) unstable; urgency=low
-+
-+ * upstream 0.12.0 release
-+ * update description
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 25 Aug 2008 21:47:41 +0200
-+scummvm (0.11.99) unstable; urgency=low
-+
-+ * upstream 0.12.0 testing pre-release
-+ * big icons added for OS2008 menu
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 22 Aug 2008 08:20:48 +0200
-+scummvm (0.11.1) unstable; urgency=low
-+
-+ * upstream 0.11.1 release
-+ * mapping for N810: zoom+ = menu for all games (except FW)
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 23 Feb 2008 20:41:37 +0100
-+scummvm (0.11.0-2) unstable; urgency=low
-+
-+ * mapping for N800/770: zoom+ = y, zoom- = 1 (all games except FW)
-+ this fixes save dialog in BS1 and also allows to exit some games via 'y'
-+ * mapping for N810: zoom- = rightclick for all games
-+ * updated to revision 30849 from 0.11 branch (some bugfixes for 0.11.1)
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 11 Feb 2008 22:22:48 +0100
-+scummvm (0.11.0-1) unstable; urgency=low
-+
-+ * theme files added back
-+ * SWORD2,SAGA - added zoom keys =1/2 for saved games
-+ * different mapping for N810 rightclick=zoom-,menu=zoom+ (currently only in LURE)
-+ * added NEWS README COPYRIGHT do doc dir as per scummvm project guidelines
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Sun, 13 Jan 2008 22:58:41 +0100
-+scummvm (0.11.0-0) unstable; urgency=low
-+
-+ * upstream 0.11 release
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 12 Jan 2008 22:26:34 +0100
-+scummvm (0.10.0-5) unstable; urgency=low
-+
-+ * fixed for chinook, menu selection postinst script added
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Thu, 25 Oct 2007 09:56:32 +0200
-+scummvm (0.10.0-4) unstable; urgency=low
-+
-+ * AGI - added pred.dic to DATA_PATH (=/usr/share/scummvm) to enable
-+ predictive input
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Tue, 28 Aug 2007 09:58:29 +0200
-+scummvm (0.10.0-3) unstable; urgency=low
-+
-+ * SCUMM - added mapping also for key up events (may fix right button in FT?)
-+ * SWORD2 - added right button press mapping (not tested)
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 20 Aug 2007 22:39:07 +0200
-+scummvm (0.10.0-2) unstable; urgency=low
-+
-+ * Future Wars - add mapping for left/up/down/right,zoom +/-
-+ * fix SDL backend to set mouse position on button down event
-+ as we may not have mousemove events with touchscreen
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Fri, 13 Jul 2007 09:56:37 +0200
-+scummvm (0.10.0-1) unstable; urgency=low
-+
-+ * mapped F10 in Future Wars to menu key
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 11 Jul 2007 22:20:00 +0200
-+scummvm (0.10.0) unstable; urgency=low
-+
-+ * upstream 0.10 release, enabled FLAC too
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 4 Jul 2007 12:48:48 +0200
-+scummvm (0.9.1-1) unstable; urgency=low
-+
-+ * 0.9.1 mapped right mouse button in sword1
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 18 Jun 2007 21:15:31 +0200
-+scummvm (0.9.1) unstable; urgency=low
-+
-+ * 0.9.1 upstream release
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Wed, 1 Nov 2006 20:40:51 +0100
-+scummvm (0.9.0-3) unstable; urgency=low
-+
-+ * merged fixes in 0.9.0 upstream branch
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Mon, 9 Oct 2006 15:40:59 +0200
-+scummvm (0.9.0-2) unstable; urgency=low
-+
-+ * merged fixes in 0.9.0 upstream branch
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Sat, 12 Aug 2006 20:10:47 +0200
-+scummvm (0.9.0-1) unstable; urgency=low
-+
-+ * merged changes in 0.9.0 upstream release
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Sun, 23 Jul 2006 22:29:51 +0200
-+scummvm (0.9.0) unstable; urgency=low
-+
-+ * 0.9.0 upstream release
-+
-+ -- Frantisek Dufka <dufkaf@seznam.cz> Tue, 27 Jun 2006 20:30:54 +0200
-diff -Naur scummvm-1.1.orig/debian/compat scummvm-1.1/debian/compat
---- scummvm-1.1.orig/debian/compat 1970-01-01 01:00:00.000000000 +0100
-+++ scummvm-1.1/debian/compat 2010-03-24 00:14:36.000000000 +0100
-@@ -0,0 +1 @@
-+4
-diff -Naur scummvm-1.1.orig/debian/control scummvm-1.1/debian/control
---- scummvm-1.1.orig/debian/control 1970-01-01 01:00:00.000000000 +0100
-+++ scummvm-1.1/debian/control 2010-03-24 00:14:36.000000000 +0100
-@@ -0,0 +1,51 @@
-+Source: scummvm
-+Section: user/games
-+Priority: optional
-+Maintainer: Frantisek Dufka <dufkaf@seznam.cz>
-+Build-Depends: debhelper (>> 4.0.0), libsdl1.2-dev, libmad0-dev, libasound2-dev, libvorbisidec-dev, libmpeg2-4-dev, libflac-dev (>= 1.1.2), libz-dev, quilt
-+
-+Standards-Version: 3.6.1.1
-+Package: scummvm
-+Depends: ${shlibs:Depends}
-+Architecture: i386 armel
-+Section: user/games
-+Description: interpreter that will play graphic adventure games
-+ written for LucasArts' SCUMM virtual machine, Sierra's AGI adventures,
-+ Adventure Soft's Simon the Sorcerer 1, 2 and Feeble Files,
-+ Revolution Software's Beneath a Steel Sky and Broken Sword 1 and 2,
-+ Interactive Binary Illusions' Flight of the Amazon Queen,
-+ Coktel Vision's Gobliiins, Wyrmkeep's Inherit the Earth,
-+ Westwood's Legend of Kyrandia, and various others.
-+ This package does not contain any actual games.
-+XBS-Maemo-Icon-26:
-+ iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAC/VBMVEUICwcH
-+ CQUKDAgLDQoMDwsOEAwREAUPEQ0QEg8PFQoRExAUEwoVFAwPGAcTFBIRFg0W
-+ FQ0XFg4RGgkTGA8XGQsTGwwUHA0aGRIWGxMXHQkVHQ8aGhMbGxQcHQocGxUZ
-+ HwsYIgcfHxgeIRUbJQwhIBofJAweJwgfKQocKwwgKgshKw0gLggfLg8jLQ8n
-+ LwwpLhEmMwcoMRQjNgotLCYmNwQlNwwqOBQtOQgsOQ8xNh4sPQswNyQqQAUw
-+ PAsuOiAsQgcwOyIqRgIsSAQvRgs0PyY1Rg06RA0+PDAwSwg2RxUzTQE4TQsz
-+ VAc/SSo6VAk4VwE6VRM2XAVAUC85XwlJVCNEXQo+YwJGXwxMWS1JXC5AagBI
-+ awJUagRIcQBSbwpHeAJTaD9OdwNXcwJKewZNfABacRlOfQBPfgBQfwBMggBW
-+ fgBNgwNSgQJOhAVecUJjdSZefwNUiABZhgBjeDZieDxhezFQjQBgghZkhQ5j
-+ iQJUkAZcixJmgDZnhCtckQpblgBekw5clwBqgkthlQBdmAJriz90hz5omgBs
-+ mAhxlgd0mAB5lgBpnA16khdzmAtxnABooQBtnwB4jUpzngBkpQR5nQF8j0Vr
-+ pQduoRZ4nRR3k014oQBzpAt8oAh/ogBvqA5trACBmypwqRF1pw+GogCAow+D
-+ pQB8phJ/nUNurxh0rRd4rwmHqQd6qDOArwCJqwyDsgCMrgB8ryiFtAB7uQN8
-+ sDKBuAWOsBWJqFR8ti2IsiOSswaBuRt6vxCOtgqXsgePrjR9wQCFuw2KuQyB
-+ uSeSuACEux6JuR2OvACAxACEvCuSuhOHujSMwQGTtiqfuACRvwGOvRWHuz2T
-+ wASPwwmYvwaLvTebuxiWvhmSwBqZwAmNu0aevgiKvkCVviaMvE6bwQycuTid
-+ vhylvQyZwB2cwg+QywCawR6fwB+bwyGI0gaewCudxCOjwyOT1ACmwjiX0g+j
-+ xTqmxzOd1gCV0i6kyyuoyTah1Sif2h6tzjukzF+pz1uq1Eeg2Uml3U1kaLAB
-+ AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAHrSURBVCjPY2BAAC5ubkFB
-+ BkzAzggDfKgSUFEmKCmOIsPvktA0aVpbSYQ+FwsjkwpMBsi2m/X7z89v3759
-+ +ngg1UqIlZEVponJYcW/rw9unH/04u2bc0vbo+WZWGCahEv/fj+6Yc2SZfv3
-+ b5w6+eACHVYWmCazMz+unN44b3ZfV3dnx5yDiaKsUAOZGD2/fL58+PSGg3Gu
-+ buEVWyZacLCzw6S8X324fOHqibMxWpKy5okBIjAZoNOt9r47e+HOnafbe/ND
-+ DNWkOGAyDKwsCtXPTly4eufqm+fvHy4M1RRggsnJMLI6z9x99Oqtx7cuPP/2
-+ ele5LjtCGyObbcHcDfuevHn+5s319RuSpOByrEwcwsqhlcvXHbp38+LxiXP6
-+ DeBSTKzWvkrCun5Zq04dO7S6p67ZHibFziiRt6PYUk5YtfbUqSMTGnKyHaFS
-+ rMDA3fHr7tqayKDWa0dWVmXHp5lCpRgZ2QI2HTl25NLt+1t3rppRFJ8SrwGX
-+ 4g9rmbJo0cpVqxZNaK5OS0nzF4NLMWkHZ1TVN9bXlxXmAo2L0uNgZITaxcjI
-+ axAYH5+RATQrPtZHk5udA+Z2cIpQN3Hy8vOwMVLmYGTidoenDSawLAsnJz8L
-+ kMUiY4ySpviYoKmKRVAcIyXKyIiLyygi+ADqVqrAkApevwAAAABJRU5ErkJg
-+ gg==
-diff -Naur scummvm-1.1.orig/debian/copyright scummvm-1.1/debian/copyright
---- scummvm-1.1.orig/debian/copyright 1970-01-01 01:00:00.000000000 +0100
-+++ scummvm-1.1/debian/copyright 2010-03-24 00:14:36.000000000 +0100
-@@ -0,0 +1,20 @@
-+ScummVM was debianized by Bastien Nocera <hadess@hadess.net> the 5th Apr 2002.
-+It was adopted by Tore Anderson <tore@linpro.no> the 4th Oct 2002.
-+Packaged for the Maemo platform by Tomas Junnoen <tomas@fs-security.com> Oct 2005
-+Since 0.8.2 packaging for Maemo done by Frantisek Dufka <dufkaf@seznam.cz>
-+
-+It was downloaded from <http://www.scummvm.org/>.
-+
-+Upstream Authors: see AUTHORS file of the ScummVM source distribution.
-+
-+Copyright:
-+
-+ 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, or (at your option) any
-+ later version.
-+
-+ On Debian GNU/Linux systems, the complete text of the GNU General
-+ Public License can be found in `/usr/share/common-licenses/GPL'.
-+
-+This copyright also applies to the Debian-related build scripts.
-diff -Naur scummvm-1.1.orig/debian/postinst scummvm-1.1/debian/postinst
---- scummvm-1.1.orig/debian/postinst 1970-01-01 01:00:00.000000000 +0100
-+++ scummvm-1.1/debian/postinst 2010-03-24 00:14:36.000000000 +0100
-@@ -0,0 +1,19 @@
-+#! /bin/sh
-+if [ "$1" = "configure" ] ; then
-+OSVER=$OSSO_VERSION
-+[ -z "$OSVER" -a -f /etc/osso_software_version ] && OSVER=`cat /etc/osso_software_version`
-+OSVER=`echo $OSVER | cut -d _ -f 2`
-+case $OSVER in
-+ 2006*|2007*)
-+ #nothing to do
-+ true
-+ ;;
-+ *)
-+ #ugly trick, until this icon is removed big icon in menu does not show
-+ [ -f /usr/share/icons/scummvm.xpm ] && rm /usr/share/icons/scummvm.xpm
-+ ;;
-+esac
-+ [ -x /usr/bin/gtk-update-icon-cache ] && /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
-+ [ -x /usr/bin/maemo-select-menu-location -a -z "$2" ] && /usr/bin/maemo-select-menu-location scummvm.desktop tana_fi_games
-+fi
-+exit 0
-diff -Naur scummvm-1.1.orig/debian/rules scummvm-1.1/debian/rules
---- scummvm-1.1.orig/debian/rules 1970-01-01 01:00:00.000000000 +0100
-+++ scummvm-1.1/debian/rules 2010-03-24 13:39:46.000000000 +0100
-@@ -0,0 +1,72 @@
-+#!/usr/bin/make -f
-+
-+#include /usr/share/quilt/quilt.make
-+
-+build: scummvm
-+
-+scummvm:
-+ dh_testdir
-+ CXXFLAGS="-Os -mcpu=arm926ej-s -fomit-frame-pointer -DMAEMO_SDL -I/usr/X11R6/include" ./configure --prefix=/usr --disable-debug --disable-mt32emu --disable-hq-scalers --with-tremor-prefix=/usr --enable-tremor --with-zlib-prefix=/usr --enable-zlib --with-mad-prefix=/usr --enable-mad --enable-flac --disable-alsa --prefix=/opt/scummvm --datadir=/opt/scummvm/share
-+## --host=arm-linux --enable-plugins --disable-scumm-7-8
-+ $(MAKE)
-+
-+clean:
-+ dh_testdir
-+ dh_testroot
-+ -$(MAKE) distclean
-+ dh_clean
-+
-+install: build
-+ dh_testdir
-+ dh_testroot
-+ dh_clean
-+ dh_installdirs
-+# not as a service
-+# install -m0755 dists/maemo/scummvm.wrapper debian/scummvm/usr/games/scummvm
-+# install -m0644 dists/maemo/scummvm.desktop debian/scummvm/usr/share/applications/hildon
-+# run as fake dbus-service to enable switching back to application from desktop via home key
-+ install -m0755 dists/maemo/scummvm.servicewrapper debian/scummvm/usr/games/scummvm
-+ install -m0644 dists/maemo/scummvm.servicedesktop debian/scummvm/usr/share/applications/hildon/scummvm.desktop
-+ install -m0644 dists/maemo/scummvm.service debian/scummvm/usr/share/dbus-1/services
-+# end of fake dbus service
-+ install -m0644 dists/maemo/scummvm26.png debian/scummvm/usr/share/icons/hicolor/26x26/hildon/scummvm.png
-+ install -m0644 dists/maemo/scummvm40.png debian/scummvm/usr/share/icons/hicolor/40x40/hildon/scummvm.png
-+ install -m0644 dists/maemo/scummvm48.png debian/scummvm/usr/share/icons/hicolor/48x48/hildon/scummvm.png
-+ install -m0644 dists/maemo/scummvm64.png debian/scummvm/usr/share/icons/hicolor/64x64/hildon/scummvm.png
-+ install -m0644 icons/scummvm.xpm debian/scummvm/usr/share/icons
-+# install -m0644 -d debian/scummvm/usr/lib/scummvm
-+# install -m0644 plugins/lib*.so debian/scummvm/usr/lib/scummvm
-+##non-optified version
-+# install -m0755 scummvm debian/scummvm/usr/games/scummvm.bin
-+# install -m0644 -d debian/scummvm/usr/share/scummvm
-+# install -m0644 dists/pred.dic debian/scummvm/usr/share/scummvm
-+# install -m0644 gui/themes/scummclassic.zip gui/themes/scummmodern.zip debian/scummvm/usr/share/scummvm
-+# optified version (save rootfs space on N900), see also configure prefix and datadir paths above
-+ install -m0644 -d debian/scummvm/opt/scummvm/bin
-+ install -m0755 scummvm debian/scummvm/opt/scummvm/bin
-+ install -m0644 -d debian/scummvm/opt/scummvm/share
-+ install -m0644 dists/pred.dic debian/scummvm/opt/scummvm/share
-+ install -m0644 gui/themes/scummclassic.zip gui/themes/scummmodern.zip debian/scummvm/opt/scummvm/share
-+# for optified version we can also add engine datafiles
-+ install -m0644 dists/engine-data/drascula.dat dists/engine-data/kyra.dat dists/engine-data/lure.dat dists/engine-data/queen.tbl dists/engine-data/sky.cpt dists/engine-data/teenagent.dat debian/scummvm/opt/scummvm/share
-+
-+ install -m0644 -d debian/scummvm/usr/share/doc/scummvm
-+ install -m0644 NEWS README COPYRIGHT debian/scummvm/usr/share/doc/scummvm
-+binary: binary-arch
-+
-+binary-arch: build install
-+ dh_testdir
-+ dh_testroot
-+ dh_installchangelogs NEWS
-+ dh_link
-+ dh_strip
-+ dh_fixperms
-+ dh_installdeb
-+ dh_shlibdeps
-+ dh_gencontrol
-+ dh_md5sums
-+ dh_builddeb
-+
-+binary-indep:
-+
-+.PHONY: build clean binary install binary-arch binary-indep
-diff -Naur scummvm-1.1.orig/debian/scummvm.dirs scummvm-1.1/debian/scummvm.dirs
---- scummvm-1.1.orig/debian/scummvm.dirs 1970-01-01 01:00:00.000000000 +0100
-+++ scummvm-1.1/debian/scummvm.dirs 2010-03-24 00:14:36.000000000 +0100
-@@ -0,0 +1,8 @@
-+usr/games
-+usr/share/icons
-+usr/share/icons/hicolor/26x26/hildon
-+usr/share/icons/hicolor/40x40/hildon
-+usr/share/icons/hicolor/48x48/hildon
-+usr/share/icons/hicolor/64x64/hildon
-+usr/share/applications/hildon
-+usr/share/dbus-1/services
-\ No newline at end of file
---- scummvm-1.1.orig/configure 2010-03-24 21:25:00.000000000 +0100
-+++ scummvm-1.1/configure 2010-03-24 21:24:28.000000000 +0100
-@@ -1355,6 +1355,9 @@
- _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 'ARM_USE_GFX_ASM = 1'
-+ add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1'
- ;;
- arm-riscos|linupy)
- DEFINES="$DEFINES -DUNIX -DLINUPY"
-@@ -2205,11 +2208,11 @@
- #
- test -z "$_bindir" && _bindir="$_prefix/bin"
- test -z "$_mandir" && _mandir="$_prefix/share/man"
--test -z "$_datadir" && _datadir="$_prefix/share"
--test -z "$_libdir" && _libdir="$_prefix/lib"
-+test -z "$_datadir" && _datadir="$_prefix/share/scummvm"
-+test -z "$_libdir" && _libdir="$_prefix/lib/scummvm"
-
--DEFINES="$DEFINES -DDATA_PATH=\\\"$_datadir/scummvm\\\""
--DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"$_libdir/scummvm\\\""
-+DEFINES="$DEFINES -DDATA_PATH=\\\"$_datadir\\\""
-+DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"$_libdir\\\""
-
-
- echo_n "Backend... "
---- scummvm-1.1.orig/engines/kyra/module.mk 2010-03-21 22:01:04.000000000 +0100
-+++ scummvm-1.1/engines/kyra/module.mk 2010-03-24 00:14:36.000000000 +0100
-@@ -95,3 +95,9 @@
-
- # Include common rules
- include $(srcdir)/rules.mk
-+
-+#ugly workaround, screen.cpp crashes gcc version 3.4.4 (CodeSourcery ARM 2005q3-2) with anything but -O3
-+$(MODULE)/screen.o: $(MODULE)/screen.cpp
-+ $(MKDIR) $(*D)/$(DEPDIR)
-+ $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) -O3 $(CPPFLAGS) -c $(<) -o $*.o
-+
---- scummvm-1.1.orig/engines/gob/util.cpp 2010-03-21 22:01:08.000000000 +0100
-+++ scummvm-1.1/engines/gob/util.cpp 2010-03-24 00:17:52.000000000 +0100
-@@ -114,6 +114,10 @@
- _mouseButtons = (MouseButtons) (((uint32) _mouseButtons) & ~((uint32) kMouseButtonsRight));
- break;
- case Common::EVENT_KEYDOWN:
-+#ifdef MAEMO_SDL
-+ if (event.kbd.keycode==Common::KEYCODE_F4)
-+ _mouseButtons = (MouseButtons) (((uint32) _mouseButtons) | ((uint32) kMouseButtonsRight));
-+#endif
- if (event.kbd.hasFlags(Common::KBD_CTRL)) {
- if (event.kbd.keycode == Common::KEYCODE_f)
- _fastMode ^= 1;
-@@ -126,6 +130,10 @@
- addKeyToBuffer(event.kbd);
- break;
- case Common::EVENT_KEYUP:
-+#ifdef MAEMO_SDL
-+ if (event.kbd.keycode==Common::KEYCODE_F4)
-+ _mouseButtons = (MouseButtons) (((uint32) _mouseButtons) & ~((uint32) kMouseButtonsRight));
-+#endif
- break;
- default:
- break;
---- scummvm-1.1.orig/engines/queen/input.cpp 2010-03-21 22:01:14.000000000 +0100
-+++ scummvm-1.1/engines/queen/input.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -176,7 +176,11 @@
- }
- break;
- case Common::KEYCODE_F1: // use Journal
-+#ifdef MAEMO_SDL
-+ case Common::KEYCODE_F4: // menu key on N770
-+#else
- case Common::KEYCODE_F5:
-+#endif
- if (_cutawayRunning) {
- if (_canQuit) {
- _keyVerb = VERB_USE_JOURNAL;
---- scummvm-1.1.orig/engines/sword1/sword1.cpp 2010-03-21 22:01:22.000000000 +0100
-+++ scummvm-1.1/engines/sword1/sword1.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -697,8 +697,21 @@
- while (_eventMan->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_KEYDOWN:
-+#ifdef MAEMO_SDL
-+// map center to right button
-+ if (event.kbd.keycode == 13) {
-+ _mouseState |= BS1R_BUTTON_DOWN;
-+ } else
-+#endif
- _keyPressed = event.kbd;
- break;
-+#ifdef MAEMO_SDL
-+ case Common::EVENT_KEYUP:
-+ if (event.kbd.keycode == 13) {
-+ _mouseState |= BS1R_BUTTON_UP;
-+ }
-+ break;
-+#endif
- case Common::EVENT_MOUSEMOVE:
- _mouseCoord = event.mouse;
- break;
---- scummvm-1.1.orig/engines/sword2/sword2.cpp 2010-03-21 22:01:23.000000000 +0100
-+++ scummvm-1.1/engines/sword2/sword2.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -662,11 +662,27 @@
- _gameSpeed = 1;
- }
- }
-+#ifdef MAEMO_SDL
-+// map center to right button
-+ else if (event.kbd.keycode == 13 && !(_inputEventFilter & RD_RIGHTBUTTONDOWN)) {
-+ _mouseEvent.pending = true;
-+ _mouseEvent.buttons = RD_RIGHTBUTTONDOWN;
-+ } else
-+#endif
- if (!(_inputEventFilter & RD_KEYDOWN)) {
- _keyboardEvent.pending = true;
- _keyboardEvent.kbd = event.kbd;
- }
- break;
-+#ifdef MAEMO_SDL
-+ case Common::EVENT_KEYUP:
-+// map center to right button
-+ if (event.kbd.keycode == 13 && !(_inputEventFilter & RD_RIGHTBUTTONUP)) {
-+ _mouseEvent.pending = true;
-+ _mouseEvent.buttons = RD_RIGHTBUTTONUP;
-+ }
-+ break;
-+#endif
- case Common::EVENT_LBUTTONDOWN:
- if (!(_inputEventFilter & RD_LEFTBUTTONDOWN)) {
- _mouseEvent.pending = true;
---- scummvm-1.1.orig/engines/scumm/input.cpp 2010-03-21 22:01:31.000000000 +0100
-+++ scummvm-1.1/engines/scumm/input.cpp 2010-03-24 00:19:14.000000000 +0100
-@@ -135,7 +135,20 @@
- // Normal key press, pass on to the game.
- _keyPressed = event.kbd;
- }
--
-+#ifdef MAEMO_SDL
-+ switch (_keyPressed.keycode) {
-+ case Common::KEYCODE_F8: _fastMode ^= 1; break ;// Map F8 (zoom out) to toggle fast mode
-+ case Common::KEYCODE_F4: _keyPressed.keycode = Common::KEYCODE_F5; _keyPressed.ascii=Common::ASCII_F5 ; break; // map F4 to F5 (menu key)
-+ case Common::KEYCODE_RETURN: _keyPressed.keycode = Common::KEYCODE_TAB; _keyPressed.ascii=Common::ASCII_TAB ; break; // map Select (return) to Tab (right mouse button)
-+ default: ;
-+ }
-+ if (_game.version < 7) switch(event.kbd.keycode){
-+ case Common::KEYCODE_UP: _keyPressed.ascii = ' '; _keyPressed.keycode=Common::KEYCODE_SPACE; break ;// map Up to space (pause game)
-+ case Common::KEYCODE_DOWN: _keyPressed.ascii ='.'; _keyPressed.keycode=Common::KEYCODE_PERIOD; break ;// map Down to . (skip one line of dialog)
-+ default: ;
-+ }
-+#endif
-+
- // FIXME: We are using ASCII values to index the _keyDownMap here,
- // yet later one code which checks _keyDownMap will use KEYCODEs
- // to do so. That is, we are mixing ascii and keycode values here,
-@@ -151,6 +164,20 @@
- break;
-
- case Common::EVENT_KEYUP:
-+#ifdef MAEMO_SDL
-+ // map keyup with similar rules as keydown
-+ switch (event.kbd.keycode) {
-+
-+ case Common::KEYCODE_F4: event.kbd.keycode = Common::KEYCODE_F5; event.kbd.ascii=Common::ASCII_F5 ; break; // map F4 to F5 (menu key)
-+ case Common::KEYCODE_RETURN: event.kbd.keycode = Common::KEYCODE_TAB; event.kbd.ascii=Common::ASCII_TAB ; break; // map Select (return) to Tab (right mouse button)
-+ default: ;
-+ }
-+ if (_game.version < 7) switch(event.kbd.keycode){
-+ case Common::KEYCODE_UP: event.kbd.ascii = ' '; event.kbd.keycode=Common::KEYCODE_SPACE; break ;// map Up to space (pause game)
-+ case Common::KEYCODE_DOWN: event.kbd.ascii ='.'; event.kbd.keycode=Common::KEYCODE_PERIOD; break ;// map Down to . (skip one line of dialog)
-+ default: ;
-+ }
-+#endif
- if (event.kbd.ascii >= 512) {
- debugC(DEBUG_GENERAL, "keyPressed > 512 (%d)", event.kbd.ascii);
- } else {
-@@ -513,9 +540,10 @@
- if (VAR_SAVELOAD_SCRIPT != 0xFF && _currentRoom != 0)
- runScript(VAR(VAR_SAVELOAD_SCRIPT2), 0, 0, 0);
-
-+#ifndef MAEMO_SDL
- } else if (restartKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_F8 && lastKeyHit.hasFlags(0))) {
- confirmRestartDialog();
--
-+#endif
- } else if (pauseKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_SPACE && lastKeyHit.hasFlags(0))) {
- pauseGame();
-
---- scummvm-1.1.orig/engines/scumm/dialogs.cpp 2010-03-21 22:01:31.000000000 +0100
-+++ scummvm-1.1/engines/scumm/dialogs.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -633,7 +633,11 @@
- }
-
- void PauseDialog::handleKeyDown(Common::KeyState state) {
-+#ifdef MAEMO_SDL
-+ if (state.ascii == ' ' || state.keycode == Common::KEYCODE_UP ) // Close pause dialog if space or UP key is pressed
-+#else
- if (state.ascii == ' ') // Close pause dialog if space key is pressed
-+#endif
- close();
- else
- ScummDialog::handleKeyDown(state);
-@@ -695,12 +699,19 @@
- }
-
- void ValueDisplayDialog::handleKeyDown(Common::KeyState state) {
-+#ifdef MAEMO_SDL
-+ if (state.ascii == _incKey || state.ascii == _decKey || state.keycode == 275 || state.keycode == 276) {
-+ if ((state.ascii == _incKey || state.keycode == 275 ) && _value < _max)
-+ _value++;
-+ else if ((state.ascii == _decKey || state.keycode == 276) && _value > _min)
-+ _value--;
-+#else
- if (state.ascii == _incKey || state.ascii == _decKey) {
- if (state.ascii == _incKey && _value < _max)
- _value++;
- else if (state.ascii == _decKey && _value > _min)
- _value--;
--
-+#endif
- setResult(_value);
- _timer = getMillis() + kDisplayDelay;
- draw();
---- scummvm-1.1.orig/engines/touche/touche.cpp 2010-03-21 22:01:32.000000000 +0100
-+++ scummvm-1.1/engines/touche/touche.cpp 2010-03-24 00:25:29.000000000 +0100
-@@ -294,6 +294,13 @@
- while (_eventMan->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_KEYDOWN:
-+#ifdef MAEMO_SDL
-+ if (event.kbd.keycode == 13) { // select button simulates righ button toggle
-+ _inp_rightMouseButtonPressed=!_inp_rightMouseButtonPressed;
-+ } else {
-+ _inp_rightMouseButtonPressed = false;
-+ }
-+#endif
- if (!handleKeyEvents) {
- break;
- }
-@@ -304,10 +311,18 @@
- quitGame();
- }
- }
-+#ifdef MAEMO_SDL
-+ } else if (event.kbd.keycode == Common::KEYCODE_F4) {
-+#else
- } else if (event.kbd.keycode == Common::KEYCODE_F5) {
-+#endif
- if (_flagsTable[618] == 0 && !_hideInventoryTexts) {
- handleOptions(0);
- }
-+#ifdef MAEMO_SDL
-+ } else if (event.kbd.keycode == Common::KEYCODE_F8) {
-+ _fastWalkMode = !_fastWalkMode;
-+#endif
- } else if (event.kbd.keycode == Common::KEYCODE_F9) {
- _fastWalkMode = true;
- } else if (event.kbd.keycode == Common::KEYCODE_F10) {
-@@ -332,12 +347,22 @@
- case Common::EVENT_LBUTTONDOWN:
- _inp_leftMouseButtonPressed = true;
- break;
-+#ifdef MAEMO_SDL
-+ case Common::EVENT_LBUTTONUP:
-+ // this is done elsewhere _inp_leftMouseButtonPressed = false;
-+ _inp_rightMouseButtonPressed = false; // simulate rbutton up to close menu
-+ break;
-+ case Common::EVENT_RBUTTONDOWN:
-+ _inp_rightMouseButtonPressed = !_inp_rightMouseButtonPressed;
-+ break;
-+#else
- case Common::EVENT_RBUTTONDOWN:
- _inp_rightMouseButtonPressed = true;
- break;
- case Common::EVENT_RBUTTONUP:
- _inp_rightMouseButtonPressed = false;
- break;
-+#endif
- default:
- break;
- }
---- scummvm-1.1.orig/engines/sky/sky.cpp 2010-03-21 22:01:39.000000000 +0100
-+++ scummvm-1.1/engines/sky/sky.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -406,6 +406,17 @@
- switch (event.type) {
- case Common::EVENT_KEYDOWN:
- _keyPressed = event.kbd;
-+#ifdef MAEMO_SDL
-+ // Maemo platform keybindings
-+ if (_keyPressed.keycode == Common::KEYCODE_F4) // Map F4 (menu) to F5 (access main menu)
-+ _keyPressed.keycode = Common::KEYCODE_F5;
-+ if (_keyPressed.ascii == 13) // Map Select=Enter to right mouse button
-+ _skyMouse->buttonPressed(1);
-+ if (_keyPressed.keycode == Common::KEYCODE_F8) // Map F8 (zoom out) to toggle fast mode
-+ _fastMode ^= 1;
-+ if (_keyPressed.keycode == Common::KEYCODE_DOWN) // Map Down to . (skip one line of dialog)
-+ _keyPressed.ascii = '.';
-+#endif
- break;
- case Common::EVENT_MOUSEMOVE:
- if (!(_systemVars.systemFlags & SF_MOUSE_LOCKED))
---- scummvm-1.1.orig/engines/lure/menu.cpp 2010-03-21 22:01:40.000000000 +0100
-+++ scummvm-1.1/engines/lure/menu.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -34,7 +34,7 @@
- #include "lure/events.h"
- #include "lure/lure.h"
-
--#if defined(_WIN32_WCE) || defined(__SYMBIAN32__)
-+#if defined(_WIN32_WCE) || defined(MAEMO_SDL) || defined(__SYMBIAN32__)
- #define LURE_CLICKABLE_MENUS
- #endif
-
---- scummvm-1.1.orig/engines/cine/main_loop.cpp 2010-03-21 22:01:43.000000000 +0100
-+++ scummvm-1.1/engines/cine/main_loop.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -75,18 +75,27 @@
- mouseRight = 1;
- }
- break;
-+#ifdef MAEMO_SDL
-+ case Common::KEYCODE_UP:
-+#else
- case Common::KEYCODE_F1:
-+#endif
- if (allowPlayerInput) {
- playerCommand = 0; // EXAMINE
- makeCommandLine();
- }
- break;
-+#ifdef MAEMO_SDL
-+ case Common::KEYCODE_DOWN:
-+#else
- case Common::KEYCODE_F2:
-+#endif
- if (allowPlayerInput) {
- playerCommand = 1; // TAKE
- makeCommandLine();
- }
- break;
-+#ifndef MAEMO_SDL
- case Common::KEYCODE_F3:
- if (allowPlayerInput) {
- playerCommand = 2; // INVENTORY
-@@ -99,13 +108,43 @@
- makeCommandLine();
- }
- break;
-+#else
-+//map f3, f4 to f8,f7 = zoom +- keys, when in menu generate keypresses for savegame
-+ case Common::KEYCODE_F8:
-+ if (inMenu)
-+ lastKeyStroke = '1';
-+ else if (allowPlayerInput) {
-+ playerCommand = 2; // INVENTORY
-+ makeCommandLine();
-+ }
-+ break;
-+ case Common::KEYCODE_F7:
-+ if (inMenu)
-+ lastKeyStroke = '2';
-+ else
-+ if (allowPlayerInput) {
-+ playerCommand = 3; // USE
-+ makeCommandLine();
-+ }
-+ break;
-+#endif
-+#ifdef MAEMO_SDL
-+ case Common::KEYCODE_LEFT:
-+// if (event.kbd.flags&Common::KBD_SHIFT)
-+// moveUsingKeyboard(-1, 0); // Left
-+#else
- case Common::KEYCODE_F5:
-+#endif
- if (allowPlayerInput) {
- playerCommand = 4; // ACTIVATE
- makeCommandLine();
- }
- break;
-+#ifdef MAEMO_SDL
-+ case Common::KEYCODE_RIGHT:
-+#else
- case Common::KEYCODE_F6:
-+#endif
- if (allowPlayerInput) {
- playerCommand = 5; // SPEAK
- makeCommandLine();
-@@ -117,7 +156,11 @@
- makeCommandLine();
- }
- break;
-+#ifdef MAEMO_SDL
-+ case Common::KEYCODE_F4: // Menu key
-+#else
- case Common::KEYCODE_F10:
-+#endif
- if (!disableSystemMenu && !inMenu) {
- g_cine->makeSystemMenu();
- }
-@@ -133,19 +176,19 @@
- case Common::KEYCODE_KP_PLUS:
- g_cine->modifyGameSpeed(+1); // Faster
- break;
-- case Common::KEYCODE_LEFT:
-+// case Common::KEYCODE_LEFT:
- case Common::KEYCODE_KP4:
- moveUsingKeyboard(-1, 0); // Left
- break;
-- case Common::KEYCODE_RIGHT:
-+// case Common::KEYCODE_RIGHT:
- case Common::KEYCODE_KP6:
- moveUsingKeyboard(+1, 0); // Right
- break;
-- case Common::KEYCODE_UP:
-+// case Common::KEYCODE_UP:
- case Common::KEYCODE_KP8:
- moveUsingKeyboard(0, +1); // Up
- break;
-- case Common::KEYCODE_DOWN:
-+// case Common::KEYCODE_DOWN:
- case Common::KEYCODE_KP2:
- moveUsingKeyboard(0, -1); // Down
- break;
---- scummvm-1.1.orig/backends/platform/sdl/graphics.cpp 2010-03-21 22:01:52.000000000 +0100
-+++ scummvm-1.1/backends/platform/sdl/graphics.cpp 2010-03-24 09:34:28.000000000 +0100
-@@ -520,6 +520,56 @@
- height = bestMode->h;
- }
-
-+#ifdef MAEMO_SDL
-+#include "SDL_syswm.h"
-+
-+static void maemo5_WM_init(int fullscreen){
-+//static int fsdone=0;
-+//static int wmdone=0;
-+SDL_SysWMinfo info;
-+SDL_VERSION(&info.version);
-+if ( SDL_GetWMInfo(&info) ) {
-+ Display *dpy = info.info.x11.display;
-+ Window win;
-+ unsigned long val = 1;
-+ Atom atom_zoom = XInternAtom(dpy, "_HILDON_ZOOM_KEY_ATOM", 0);
-+ info.info.x11.lock_func();
-+ win = info.info.x11.fswindow;
-+ if (win)
-+ XChangeProperty (dpy,win,atom_zoom,XA_INTEGER,32,PropModeReplace,(unsigned char *) &val,1); // grab zoom keys
-+ win = info.info.x11.wmwindow;
-+ if (win)
-+ XChangeProperty (dpy,win,atom_zoom,XA_INTEGER,32,PropModeReplace,(unsigned char *) &val,1); // grab zoom keys
-+#if 0
-+ if (win && fullscreen /* && !fsdone */ ) {
-+ XUnmapWindow(dpy,win);
-+ XChangeProperty (dpy,win,atom_zoom,XA_INTEGER,32,PropModeReplace,(unsigned char *) &val,1); // grab zoom keys
-+ Atom atom_noncomposited = XInternAtom(dpy, "_HILDON_NON_COMPOSITED_WINDOW", 0);
-+ Atom atom_wmstate = XInternAtom(dpy, "_NET_WM_STATE", 0);
-+ Atom atom_wmstate_fullscreen = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", 0);
-+ XSetWindowAttributes xattr;
-+ xattr.override_redirect = False;
-+ XChangeProperty (dpy,win,atom_noncomposited,XA_INTEGER,32,PropModeReplace,(unsigned char *) &val,1); // make window not composited
-+ //XChangeWindowAttributes(dpy, win, CWOverrideRedirect, &xattr); //
-+ XChangeProperty (dpy,win,atom_wmstate,XA_ATOM,32,PropModeReplace,(unsigned char *) &atom_wmstate_fullscreen,1); // mark as fullscreen = disable tskswitch button
-+ XMapWindow(dpy,win);
-+ //fsdone=1;
-+ }
-+ win = info.info.x11.wmwindow;
-+ if (win && !fullscreen /* && !wmdone */) {
-+ XUnmapWindow(dpy,win);
-+ XChangeProperty (dpy,win,atom_zoom,XA_INTEGER,32,PropModeReplace,(unsigned char *) &val,1);
-+ XMapWindow(dpy,win);
-+ //wmdone=1;
-+ }
-+#endif
-+ info.info.x11.unlock_func();
-+// XSync(dpy,False);
-+}
-+}
-+#endif
-+
-+
- bool OSystem_SDL::loadGFXMode() {
- assert(_inited);
- _forceFull = true;
-@@ -560,6 +610,9 @@
- error("allocating _screen failed");
- #endif
-
-+#ifdef MAEMO_SDL
-+ maemo5_WM_init(_videoMode.fullscreen);
-+#endif
- //
- // Create the surface that contains the scaled graphics in 16 bit mode
- //
-@@ -939,6 +992,14 @@
- _videoMode.fullscreen = enable;
- _transactionDetails.needHotswap = true;
- }
-+#ifdef MAEMO_SDL
-+ char *caption;
-+ char title[50];
-+ title[49] = '\0';
-+ SDL_WM_GetCaption(&caption, NULL);
-+ if (caption!=NULL) {strncpy(title,caption,49);
-+ setXWindowName(caption); }
-+#endif
- }
-
- void OSystem_SDL::setAspectRatioCorrection(bool enable) {
---- scummvm-1.1.orig/backends/platform/sdl/sdl.cpp 2010-03-21 22:01:52.000000000 +0100
-+++ scummvm-1.1/backends/platform/sdl/sdl.cpp 2010-03-24 00:14:36.000000000 +0100
-@@ -47,6 +47,10 @@
- #include "icons/scummvm.xpm"
-
- #include <time.h> // for getTimeAndDate()
-+#ifdef MAEMO_SDL
-+#include <SDL/SDL_syswm.h>
-+#include <X11/Xutil.h>
-+#endif
-
- //#define SAMPLES_PER_SEC 11025
- #define SAMPLES_PER_SEC 22050
-@@ -212,7 +216,15 @@
- _timerID = SDL_AddTimer(10, &timer_handler, _timer);
- }
-
-- // Invoke parent implementation of this method
-+#ifdef MAEMO_SDL
-+ // some keymappings are done differently for devices with full keyboard (N810=RX-34)
-+ _have_keyboard=0;
-+ char *device=getenv("SCUMMVM_MAEMO_DEVICE");
-+ if (device != NULL)
-+ if ( (strcmp(device,"RX-44") == 0) || (strcmp(device,"RX-48") == 0) || (strcmp(device,"RX-51") == 0))
-+ _have_keyboard=1;
-+#endif
-+ // Invoke parent implementation of this method
- OSystem::initBackend();
-
- _inited = true;
-@@ -429,6 +441,23 @@
- return file.createWriteStream();
- }
-
-+#ifdef MAEMO_SDL
-+void OSystem_SDL::setXWindowName(const char *caption) {
-+ SDL_SysWMinfo info;
-+ SDL_VERSION(&info.version);
-+ if ( SDL_GetWMInfo(&info) ) {
-+ Display *dpy = info.info.x11.display;
-+ Window win;
-+ //if (_videoMode.fullscreen)
-+ win = info.info.x11.fswindow;
-+ if (win) XStoreName(dpy, win, caption);
-+ //else
-+ win = info.info.x11.wmwindow;
-+ if (win) XStoreName(dpy, win, caption);
-+ }
-+}
-+#endif
-+
- void OSystem_SDL::setWindowCaption(const char *caption) {
- Common::String cap;
- byte c;
-@@ -445,6 +474,11 @@
- }
-
- SDL_WM_SetCaption(cap.c_str(), cap.c_str());
-+#ifdef MAEMO_SDL
-+ Common::String cap2("ScummVM - "); // 2 lines in OS2008 task switcher, set first line
-+ cap=cap2+cap;
-+ setXWindowName(cap.c_str());
-+#endif
- }
-
- bool OSystem_SDL::hasFeature(Feature f) {
-@@ -529,6 +563,14 @@
- #endif
- }
-
-+#ifdef MAEMO_SDL
-+// no Maemo version needs setupIcon
-+// also N900 is hit by SDL_WM_SetIcon bug (window cannot receive input)
-+// http://bugzilla.libsdl.org/show_bug.cgi?id=586
-+void OSystem_SDL::setupIcon() {
-+ ;
-+}
-+#else
- void OSystem_SDL::setupIcon() {
- int x, y, w, h, ncols, nbytes, i;
- unsigned int rgba[256];
-@@ -580,6 +622,7 @@
- SDL_FreeSurface(sdl_surf);
- free(icon);
- }
-+#endif
-
- OSystem::MutexRef OSystem_SDL::createMutex() {
- return (MutexRef) SDL_CreateMutex();
---- scummvm-1.1.orig/backends/platform/sdl/events.cpp 2010-04-02 22:45:24.000000000 +0200
-+++ scummvm-1.1/backends/platform/sdl/events.cpp 2010-04-02 22:44:04.000000000 +0200
-@@ -26,7 +26,9 @@
- #include "backends/platform/sdl/sdl.h"
- #include "common/util.h"
- #include "common/events.h"
--
-+#ifdef MAEMO_SDL
-+#include "common/config-manager.h"
-+#endif
- // FIXME move joystick defines out and replace with confile file options
- // we should really allow users to map any key to a joystick button
- #define JOY_DEADZONE 3200
-@@ -232,8 +234,13 @@
-
- bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) {
-
-+#ifdef MAEMO_SDL
-+// we want to remap first including ctr/shift/alt modifiers
-+ const bool event_complete = remapKey(ev, event);
-+ SDLModToOSystemKeyFlags(ev.key.keysym.mod, event);
-+#else
- SDLModToOSystemKeyFlags(SDL_GetModState(), event);
--
-+#endif
- // Handle scroll lock as a key modifier
- if (ev.key.keysym.sym == SDLK_SCROLLOCK)
- _scrollLock = !_scrollLock;
-@@ -241,8 +248,13 @@
- if (_scrollLock)
- event.kbd.flags |= Common::KBD_SCRL;
-
-+#ifdef MAEMO_SDL
-+ // fullscreen button or ctrl+space toggle full screen mode
-+ if (ev.key.keysym.sym == SDLK_F6 || (_have_keyboard && event.kbd.hasFlags(Common::KBD_CTRL) && (ev.key.keysym.sym == SDLK_SPACE) ) ) {
-+#else
- // Alt-Return and Alt-Enter toggle full screen mode
- if (event.kbd.hasFlags(Common::KBD_ALT) && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER)) {
-+#endif
- beginGFXTransaction();
- setFullscreenMode(!_videoMode.fullscreen);
- endGFXTransaction();
-@@ -276,11 +288,15 @@
- return false;
- }
-
-+#ifndef MAEMO_SDL
- // Ctrl-m toggles mouse capture
- if (event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'm') {
- toggleMouseGrab();
- return false;
- }
-+#else
-+// mouse capture makes no sense for Maemo and ctrl+m is used for global menu
-+#endif
-
- #if defined(MACOSX)
- // On Macintosh', Cmd-Q quits
-@@ -313,7 +329,11 @@
- return false;
- }
-
-+#ifdef MAEMO_SDL
-+ if (event_complete)
-+#else
- if (remapKey(ev, event))
-+#endif
- return true;
-
- event.type = Common::EVENT_KEYDOWN;
-@@ -332,7 +352,12 @@
- event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
-
- // Ctrl-Alt-<key> will change the GFX mode
-+#ifdef MAEMO_SDL
-+ // we can't call SDL_GetModState(), modifiers can be remapped too
-+ SDLModToOSystemKeyFlags(ev.key.keysym.mod, event);
-+#else
- SDLModToOSystemKeyFlags(SDL_GetModState(), event);
-+#endif
-
- // Set the scroll lock sticky flag
- if (_scrollLock)
-@@ -355,8 +380,20 @@
- }
-
- bool OSystem_SDL::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
-+#ifdef MAEMO_SDL
-+ if (ev.button.button == SDL_BUTTON_LEFT){
-+ SDLMod mod=SDL_GetModState();
-+ if (mod & KMOD_SHIFT)
-+ event.type = Common::EVENT_RBUTTONDOWN;
-+ else if ( mod & KMOD_CTRL)
-+ event.type = Common::EVENT_MOUSEMOVE;
-+ else
-+ event.type = Common::EVENT_LBUTTONDOWN;
-+ }
-+#else
- if (ev.button.button == SDL_BUTTON_LEFT)
- event.type = Common::EVENT_LBUTTONDOWN;
-+#endif
- else if (ev.button.button == SDL_BUTTON_RIGHT)
- event.type = Common::EVENT_RBUTTONDOWN;
- #if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN)
-@@ -372,14 +409,33 @@
- else
- return false;
-
-+#ifdef MAEMO_SDL
-+ // we have touchscreen so we may have no mousemotion events between taps
-+ setMousePos(event.mouse.x, event.mouse.y);
-+ // this is trying to fix wrong action done by mouse click in some engines
-+ // it looks like clicking affects objects in previous mouse position
-+ // if this does not help we should perhaps generate some fake mouse motion event(s)
-+#endif
- fillMouseEvent(event, ev.button.x, ev.button.y);
-
- return true;
- }
-
- bool OSystem_SDL::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
-+#ifdef MAEMO_SDL
-+ if (ev.button.button == SDL_BUTTON_LEFT){
-+ SDLMod mod=SDL_GetModState();
-+ if (mod & KMOD_SHIFT)
-+ event.type = Common::EVENT_RBUTTONUP;
-+ else if ( mod & KMOD_CTRL)
-+ event.type = Common::EVENT_MOUSEMOVE;
-+ else
-+ event.type = Common::EVENT_LBUTTONUP;
-+ }
-+#else
- if (ev.button.button == SDL_BUTTON_LEFT)
- event.type = Common::EVENT_LBUTTONUP;
-+#endif
- else if (ev.button.button == SDL_BUTTON_RIGHT)
- event.type = Common::EVENT_RBUTTONUP;
- #if defined(SDL_BUTTON_MIDDLE)
-@@ -503,7 +559,203 @@
- return true;
- }
-
-+// called on SDL KEYUP and KEYDOWN events
- bool OSystem_SDL::remapKey(SDL_Event &ev, Common::Event &event) {
-+#ifdef MAEMO_SDL
-+ static int engine=0;
-+#define ENG_OTHER -1
-+//#define ENG_SCUMM 1
-+ static int game=0;
-+#define GAME_OTHER -1
-+#define GAME_LURE 1
-+#define GAME_SWORD1 2
-+#define GAME_SWORD2 3
-+#define GAME_SAGA 4
-+#define GAME_FW 5
-+//#define GAME_SIMON1 6
-+//#define GAME_SIMON2 7
-+#define GAME_FEEBLE 8
-+//#define GAME_TOUCHE 9
-+#define GAME_DISCWORLD 10
-+#define GAME_CRUISE 11
-+
-+
-+ if (engine == 0){
-+ // one time initialization
-+ Common::String gameid(ConfMan.get("gameid"));
-+ if (gameid.hasPrefix("lure")) {
-+ game=GAME_LURE;
-+ engine=ENG_OTHER;
-+ } else if (gameid.hasPrefix("sword2")) {
-+ game=GAME_SWORD2;
-+ engine=ENG_OTHER;
-+ } else if (gameid.hasPrefix("cine")) {
-+ game=GAME_FW;
-+ engine=ENG_OTHER;
-+/* } else if (gameid == "touche") {
-+ game=GAME_TOUCHE;
-+ engine=ENG_OTHER;
-+ } else if (gameid == "simon1") {
-+ game=GAME_SIMON1;
-+ engine=ENG_OTHER;
-+ } else if (gameid == "simon2") {
-+ game=GAME_SIMON2;
-+ engine=ENG_OTHER;
-+*/
-+ } else if (gameid.hasPrefix("feeble")) {
-+ game=GAME_FEEBLE;
-+ engine=ENG_OTHER;
-+ } else if (gameid.hasPrefix("sword1")) {
-+ game=GAME_SWORD1;
-+ engine=ENG_OTHER;
-+ } else if (gameid.hasPrefix("saga")) {
-+ game=GAME_SAGA;
-+ engine=ENG_OTHER;
-+ } else if (gameid.hasPrefix("tinsel")) {
-+ game=GAME_DISCWORLD;
-+ engine=ENG_OTHER;
-+ } else if (gameid.hasPrefix("cruise")) {
-+ game=GAME_CRUISE;
-+ engine=ENG_OTHER;
-+ } else {
-+ game=GAME_OTHER;
-+ engine=ENG_OTHER;
-+ }
-+ }
-+ // global mapping - N810, N900
-+ if (_have_keyboard && (ev.key.keysym.mod & KMOD_CTRL)){
-+ // map ctrl-m to ctrl F5 = global scummvm menu
-+ if (ev.key.keysym.sym==SDLK_m) ev.key.keysym.sym=SDLK_F5 ;
-+ }
-+ if (_have_keyboard && (ev.key.keysym.mod & KMOD_SHIFT)){
-+ // map shift backspace to escape, shift enter to menu key
-+ if (ev.key.keysym.sym==SDLK_BACKSPACE) { ev.key.keysym.sym=SDLK_ESCAPE ; ev.key.keysym.mod = (SDLMod) (ev.key.keysym.mod & ~KMOD_SHIFT); }
-+ if (ev.key.keysym.sym==SDLK_KP_ENTER) { ev.key.keysym.sym=SDLK_F4; ev.key.keysym.mod = (SDLMod) (ev.key.keysym.mod & ~KMOD_SHIFT); }
-+ }
-+
-+ // engine specific mappings
-+ switch (engine){
-+ // nothing now
-+ }
-+ // game specific mapping
-+ switch (game) {
-+ case GAME_LURE:
-+ if ((ev.key.keysym.sym==SDLK_F8 && _have_keyboard ) || (ev.key.keysym.sym==SDLK_F4 && !_have_keyboard)){
-+ // map zoom - to right click if we have keyboard (N810), otherwise map menu key (770,N800)
-+ event.type = ((ev.type==SDL_KEYUP) ? Common::EVENT_RBUTTONUP : Common::EVENT_RBUTTONDOWN );
-+ event.mouse.x = _mouseCurState.x;
-+ event.mouse.y = _mouseCurState.y;
-+ return true;
-+
-+ }
-+ switch(ev.key.keysym.sym){
-+ case SDLK_F5: // map F5 (home key) to f9 = restart game
-+ ev.key.keysym.sym=SDLK_F9;
-+ break;
-+ case SDLK_F8: // map F8 (zoom - key) to F5 (save dialog) in game
-+ ev.key.keysym.sym=SDLK_F5;
-+ break;
-+ case SDLK_F4: // same as above, only one mapping happens due to right click maping above
-+ ev.key.keysym.sym=SDLK_F5;
-+ default:
-+ ;
-+ }
-+ break;
-+ case GAME_FW:
-+ // Future Wars - no mapping here, done in game engine
-+ break;
-+ case GAME_FEEBLE:
-+ if ((ev.key.keysym.sym==SDLK_F8 && _have_keyboard ) || (ev.key.keysym.sym==SDLK_F4 && !_have_keyboard)){
-+ // map zoom - to right click if we have keyboard (N810), otherwise map menu key (770,N800)
-+ event.type = ((ev.type==SDL_KEYUP) ? Common::EVENT_RBUTTONUP : Common::EVENT_RBUTTONDOWN );
-+ event.mouse.x = _mouseCurState.x;
-+ event.mouse.y = _mouseCurState.y;
-+ return true;
-+
-+ }
-+ if (!_have_keyboard) switch(ev.key.keysym.sym){
-+ case SDLK_F7: // map F7 (zoom + key) to letter y
-+ ev.key.keysym.sym=SDLK_y;
-+ break;
-+ case SDLK_F8: // map F8 (zoom - key) to letter 1
-+ ev.key.keysym.sym=SDLK_1;
-+ break;
-+ default:
-+ ;
-+ }
-+ break;
-+ case GAME_DISCWORLD:
-+ switch(ev.key.keysym.sym) {
-+ case SDLK_F8: // map F8 (zoom - key) to right click
-+ event.type = ((ev.type==SDL_KEYUP) ? Common::EVENT_RBUTTONUP : Common::EVENT_RBUTTONDOWN );
-+ event.mouse.x = _mouseCurState.x;
-+ event.mouse.y = _mouseCurState.y;
-+ return true;
-+ // now map F7 (=zoom+) to Enter for N810 (useful when closed)
-+ case SDLK_F7:
-+ if (_have_keyboard) ev.key.keysym.sym=SDLK_RETURN; else ev.key.keysym.sym=SDLK_y;
-+ break;
-+ case SDLK_F4: // map menu key to game menu
-+ case SDLK_F5: // swap/home key too
-+ ev.key.keysym.sym=SDLK_F1;
-+ break;
-+ default:
-+ ;
-+ }
-+ break;
-+ case GAME_CRUISE:
-+ switch(ev.key.keysym.sym) {
-+ case SDLK_F8: // map F8 (zoom - key) to right click
-+ event.type = ((ev.type==SDL_KEYUP) ? Common::EVENT_RBUTTONUP : Common::EVENT_RBUTTONDOWN );
-+ event.mouse.x = _mouseCurState.x;
-+ event.mouse.y = _mouseCurState.y;
-+ return true;
-+ // now map F7 (=zoom+) to menu for N810 (useful when closed)
-+ case SDLK_F7:
-+ if (_have_keyboard) ev.key.keysym.sym=SDLK_F10; else ev.key.keysym.sym=SDLK_p;
-+ break;
-+ case SDLK_F4: // map menu key to game menu
-+ ev.key.keysym.sym=SDLK_F10;
-+ break;
-+ default:
-+ ;
-+ }
-+ break;
-+ default:
-+ //case GAME_SWORD2:
-+ //case GAME_SWORD1:
-+ //case GAME_SAGA: //I Have No Mouth
-+ if (!_have_keyboard) switch(ev.key.keysym.sym){
-+ case SDLK_F7: // map F7 (zoom + key) to letter y for save game entry and 'yes' replies (simon, touche)
-+ ev.key.keysym.sym=SDLK_y;
-+ break;
-+ case SDLK_F8: // map F8 (zoom - key) to letter 1 for save game entry and copyprotection in monkey2
-+ ev.key.keysym.sym=SDLK_1;
-+ break;
-+ default:
-+ ;
-+ } else switch(ev.key.keysym.sym) {
-+ case SDLK_F8: // map F8 (zoom - key) to right click
-+ event.type = ((ev.type==SDL_KEYUP) ? Common::EVENT_RBUTTONUP : Common::EVENT_RBUTTONDOWN );
-+ event.mouse.x = _mouseCurState.x;
-+ event.mouse.y = _mouseCurState.y;
-+ return true;
-+ // now map F7 (=zoom+) to menu (=F4) so we can have same mapping for N810 and 770/800 for menu key
-+ // N800's real menu key is hidden on retractable keyboard so we use zoom+ for it instead too
-+ case SDLK_F7:
-+ ev.key.keysym.sym=SDLK_F4;
-+ break;
-+ /* with real keyboard we can afford to lose F7, do not remap F4 back
-+ case SDLK_F4:
-+ ev.key.keysym.sym=SDLK_F7;
-+ break; */
-+ default:
-+ ;
-+ }
-+ break;
-+ }
-+#endif //SDL_MAEMO
-+
- #ifdef LINUPY
- // On Yopy map the End button to quit
- if ((ev.key.keysym.sym == 293)) {
---- scummvm-1.1.orig/backends/platform/sdl/sdl.h 2010-03-21 22:01:52.000000000 +0100
-+++ scummvm-1.1/backends/platform/sdl/sdl.h 2010-03-24 00:14:36.000000000 +0100
-@@ -230,6 +230,9 @@
- virtual int getGraphicsMode() const;
-
- virtual void setWindowCaption(const char *caption);
-+#ifdef MAEMO_SDL
-+ void setXWindowName(const char *caption);
-+#endif
- virtual bool openCD(int drive);
-
- virtual bool hasFeature(Feature f);
-@@ -418,6 +421,9 @@
- // joystick
- SDL_Joystick *_joystick;
-
-+#ifdef MAEMO_SDL
-+ int _have_keyboard;
-+#endif
- // Shake mode
- int _currentShakePos;
- int _newShakePos;
diff --git a/backends/platform/n64/Makefile b/backends/platform/n64/Makefile
index cffe277312..4f3744f7e8 100644
--- a/backends/platform/n64/Makefile
+++ b/backends/platform/n64/Makefile
@@ -90,4 +90,3 @@ spotless : distclean
send: $(TARGET).v64
sudo ucon64 --xv64 $(TARGET).v64
-
diff --git a/backends/platform/n64/README.N64 b/backends/platform/n64/README.N64
index b47b239658..42f78f4754 100644
--- a/backends/platform/n64/README.N64
+++ b/backends/platform/n64/README.N64
@@ -113,4 +113,3 @@ Notes
==========
Write the rest of this README.
-
diff --git a/backends/platform/n64/framfs_save_manager.cpp b/backends/platform/n64/framfs_save_manager.cpp
index 983b9aba8d..78f5333f2e 100644
--- a/backends/platform/n64/framfs_save_manager.cpp
+++ b/backends/platform/n64/framfs_save_manager.cpp
@@ -69,4 +69,3 @@ Common::StringArray FRAMSaveManager::listSavefiles(const Common::String &pattern
return list;
}
-
diff --git a/backends/platform/n64/framfs_save_manager.h b/backends/platform/n64/framfs_save_manager.h
index d50c17d85b..da553e423a 100644
--- a/backends/platform/n64/framfs_save_manager.h
+++ b/backends/platform/n64/framfs_save_manager.h
@@ -129,4 +129,3 @@ public:
#endif
-
diff --git a/backends/platform/n64/n64.mk b/backends/platform/n64/n64.mk
index 2e383e670d..83ad405503 100644
--- a/backends/platform/n64/n64.mk
+++ b/backends/platform/n64/n64.mk
@@ -26,4 +26,3 @@ endif
$(srcdir)/backends/platform/n64/pad_rom.sh scummvm.v64
rm scummvm.bak
mv scummvm.v64 $(bundle_name)/scummvm.v64
-
diff --git a/backends/platform/n64/nintendo64.cpp b/backends/platform/n64/nintendo64.cpp
index 3e811e73d2..bc416157e6 100644
--- a/backends/platform/n64/nintendo64.cpp
+++ b/backends/platform/n64/nintendo64.cpp
@@ -31,4 +31,3 @@ int main(void) {
g_system->quit(); // TODO: Consider removing / replacing this!
return res;
}
-
diff --git a/backends/platform/n64/osys_n64.h b/backends/platform/n64/osys_n64.h
index 354f25a1cf..4788beb1ca 100644
--- a/backends/platform/n64/osys_n64.h
+++ b/backends/platform/n64/osys_n64.h
@@ -212,4 +212,3 @@ public:
};
#endif /* __OSYS_N64_H__ */
-
diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp
index 4bc3780fe2..c3adb9691c 100644
--- a/backends/platform/n64/osys_n64_base.cpp
+++ b/backends/platform/n64/osys_n64_base.cpp
@@ -922,4 +922,3 @@ void OSystem_N64::detectControllers(void) {
inline uint16 colRGB888toBGR555(byte r, byte g, byte b) {
return ((r >> 3) << 1) | ((g >> 3) << 6) | ((b >> 3) << 11);
}
-
diff --git a/backends/platform/n64/osys_n64_events.cpp b/backends/platform/n64/osys_n64_events.cpp
index 62f11aef64..c83eb194ac 100644
--- a/backends/platform/n64/osys_n64_events.cpp
+++ b/backends/platform/n64/osys_n64_events.cpp
@@ -439,4 +439,3 @@ bool OSystem_N64::pollEvent(Common::Event &event) {
return false;
}
-
diff --git a/backends/platform/n64/osys_n64_utilities.cpp b/backends/platform/n64/osys_n64_utilities.cpp
index 0622e6423d..94d727e421 100644
--- a/backends/platform/n64/osys_n64_utilities.cpp
+++ b/backends/platform/n64/osys_n64_utilities.cpp
@@ -115,4 +115,3 @@ int timer_handler(int t) {
tm->handler();
return t;
}
-
diff --git a/backends/platform/n64/pad_rom.sh b/backends/platform/n64/pad_rom.sh
index 085203306f..463eeb4e28 100755
--- a/backends/platform/n64/pad_rom.sh
+++ b/backends/platform/n64/pad_rom.sh
@@ -10,4 +10,3 @@ REMAINDER=`echo $BASESIZE - $REMAINDER | bc`
CARTSIZE=`echo $CARTSIZE + $REMAINDER | bc`
ucon64 -q --n64 --v64 --chk --padn=$CARTSIZE $1
-
diff --git a/backends/platform/n64/pakfs_save_manager.cpp b/backends/platform/n64/pakfs_save_manager.cpp
index df9baa4d21..bf2fe8b1bc 100644
--- a/backends/platform/n64/pakfs_save_manager.cpp
+++ b/backends/platform/n64/pakfs_save_manager.cpp
@@ -70,4 +70,3 @@ Common::StringArray PAKSaveManager::listSavefiles(const Common::String &pattern)
return list;
}
-
diff --git a/backends/platform/n64/pakfs_save_manager.h b/backends/platform/n64/pakfs_save_manager.h
index 6987801294..e0fcbc1e2d 100644
--- a/backends/platform/n64/pakfs_save_manager.h
+++ b/backends/platform/n64/pakfs_save_manager.h
@@ -130,4 +130,3 @@ public:
#endif
-
diff --git a/backends/platform/n64/portdefs.h b/backends/platform/n64/portdefs.h
index 35ef3c71db..677ad48477 100644
--- a/backends/platform/n64/portdefs.h
+++ b/backends/platform/n64/portdefs.h
@@ -49,4 +49,3 @@ typedef signed int int32;
#define SCUMMVM_DONT_DEFINE_TYPES
#endif
-
diff --git a/backends/platform/openpandora/build/PXML.xml b/backends/platform/openpandora/build/PXML.xml
index f4d2e2a595..a87c49e2b8 100755
--- a/backends/platform/openpandora/build/PXML.xml
+++ b/backends/platform/openpandora/build/PXML.xml
@@ -1,34 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<PXML xmlns="http://openpandora.org/namespaces/PXML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PXML_schema.xsd">
-
- <application id="scummvm.djwillis.0001" appdata="scummvm">
-
- <title lang="en_US">ScummVM</title>
-
- <exec command="./runscummvm.sh"/>
- <icon src="icon/scummvm.png"/>
-
- <previewpics>
- <pic src="icon/preview-pic.png"/>
- </previewpics>
-
- <info name="ScummVM Documentation" type="text/html" src="docs/index.html"/>
-
- <description lang="en_US">Point & click game interpreter.</description>
-
- <author name="DJWillis" website="http://www.scummvm.org/"/>
-
- <version major="1" minor="1" release="1" build="1"/><!--This programs version-->
- <osversion major="1" minor="0" release="0" build="0"/><!--The minimum OS version required-->
-
- <categories>
- <category name="Game"><!--category like "Games", "Graphics", "Internet" etc-->
- <subcategory name="Adventure Games"/><!--subcategory, like "Board Games", "Strategy", "First Person Shooters"-->
- </category>
- </categories>
-
- <clockspeed frequency="500"/><!--Frequency in Hz-->
-
- </application>
-
+ <!-- This is the package, in our case ScummVM -->
+ <package id="scummvm.djwillis.0001">
+ <author name="DJWillis" website="http://www.scummvm.org/"/>
+ <!-- version type can be alpha, beta or release, set to release in branch -->
+ <version major="1" minor="4" release="0" build="1" type="alpha"/>
+ <!-- Both title and titles are needed -->
+ <title lang="en_US">ScummVM</title>
+ <titles>
+ <title lang="en_US">ScummVM</title>
+ </titles>
+ <descriptions>
+ <description lang="en_US">
+ ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed!
+
+ ScummVM supports many adventure games, including LucasArts SCUMM games (such as Monkey Island 1-3, Day of the Tentacle, Sam &amp; Max, ...), many of Sierra's AGI and SCI games (such as King's Quest 1-6, Space Quest 1-5, ...), Discworld 1 and 2, Simon the Sorcerer 1 and 2, Beneath A Steel Sky, Lure of the Temptress, Broken Sword 1 and 2, Flight of the Amazon Queen, Gobliiins 1-3, The Legend of Kyrandia 1-3, many of Humongous Entertainment's children's SCUMM games (including Freddi Fish and Putt Putt games) and many more.
+ </description>
+ </descriptions>
+ <icon src="icon/scummvm.png"/>
+ </package>
+
+ <!-- This is the application, the ScummVM binary -->
+ <application id="scummvm.djwillis.0001" appdata="scummvm">
+ <exec command="./runscummvm.sh"/>
+ <author name="DJWillis" website="http://www.scummvm.org/"/>
+ <!-- version type can be alpha, beta or release, set to release in branch -->
+ <version major="1" minor="4" release="0" build="1" type="alpha"/>
+ <!-- Both title and titles are needed -->
+ <title lang="en_US">ScummVM</title>
+ <titles>
+ <title lang="en_US">ScummVM</title>
+ </titles>
+ <descriptions>
+ <description lang="en_US">
+ ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed!
+
+ ScummVM supports many adventure games, including LucasArts SCUMM games (such as Monkey Island 1-3, Day of the Tentacle, Sam &amp; Max, ...), many of Sierra's AGI and SCI games (such as King's Quest 1-6, Space Quest 1-5, ...), Discworld 1 and 2, Simon the Sorcerer 1 and 2, Beneath A Steel Sky, Lure of the Temptress, Broken Sword 1 and 2, Flight of the Amazon Queen, Gobliiins 1-3, The Legend of Kyrandia 1-3, many of Humongous Entertainment's children's SCUMM games (including Freddi Fish and Putt Putt games) and many more.
+ </description>
+ </descriptions>
+ <licenses>
+ <license name="GPLv2" url="http://www.gnu.org/licenses/gpl-2.0.html" sourcecodeurl="http://www.scummvm.org"/>
+ </licenses>
+ <icon src="icon/scummvm.png"/>
+ <previewpics>
+ <pic src="icon/preview-pic.png"/>
+ </previewpics>
+ <info name="ScummVM Documentation" type="text/html" src="docs/index.html"/>
+ <categories>
+ <category name="Game">
+ <subcategory name="AdventureGame"/>
+ </category>
+ </categories>
+ </application>
</PXML>
diff --git a/backends/platform/openpandora/build/PXML_schema.xsd b/backends/platform/openpandora/build/PXML_schema.xsd
new file mode 100644
index 0000000000..7c0d635016
--- /dev/null
+++ b/backends/platform/openpandora/build/PXML_schema.xsd
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://openpandora.org/namespaces/PXML" xmlns="http://openpandora.org/namespaces/PXML" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
+
+
+ <!-- declare some simpleTypes for later usage -->
+
+ <!-- Specify params allows with the 'x11' entry in exec -->
+ <xs:simpleType name="x11Param">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="req" />
+ <xs:enumeration value="stop" />
+ <xs:enumeration value="ignore" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Specify the valid documentation formats in the <info> block -->
+ <xs:simpleType name="docType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="text/html" />
+ <xs:enumeration value="text/plain" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Make sure that version numbers only consist of letters, numbers and + as well as - -->
+ <xs:simpleType name="versionNumber">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:pattern value="[a-zA-Z0-9+-]*" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Specify what is valid as release type -->
+ <xs:simpleType name="releaseType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="alpha" />
+ <xs:enumeration value="beta" />
+ <xs:enumeration value="release" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Specify what makes an email address "valid" -->
+ <xs:simpleType name="emailAddress">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[^@]+@[^\.]+\..+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- some restrictions regarding file names that are eg not allowed/possible when using sd cards formated as fat32 -->
+ <xs:simpleType name="dumbPath">
+ <xs:restriction base="xs:normalizedString">
+ <xs:pattern value="[^?>:]+" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="dumbFolderName">
+ <xs:restriction base="xs:normalizedString">
+ <xs:pattern value="[^?>:/]+" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Specify lang codes -->
+ <xs:simpleType name="isoLangcode">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="2"/>
+ <xs:pattern value="[a-zA-Z]{2,3}(_[a-zA-Z0-9]{2,3})*" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="isoLangcode_en_US">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="en_US" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Definition of all allowed categories following the FDO specs -->
+ <xs:simpleType name="fdoCategory">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="AudioVideo|Audio|Video|Development|Education|Game|Graphics|Network|Office|Settings|System|Utility"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- Definition of all allowed subcategories following the FDO specs (should be based upon the given main categories, but would significantly increase complexity of the schema) -->
+ <xs:simpleType name="fdoSubCategory">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="Building|Debugger|IDE|GUIDesigner|Profiling|RevisionControl|Translation|Calendar|ContactManagement|Database|Dictionary|Chart|Email|Finance|FlowChart|PDA|ProjectManagement|Presentation|Spreadsheet|WordProcessor|2DGraphics|VectorGraphics|RasterGraphics|3DGraphics|Scanning|OCR|Photography|Publishing|Viewer|TextTools|DesktopSettings|HardwareSettings|Printing|PackageManager|Dialup|InstantMessaging|Chat|IRCClient|FileTransfer|HamRadio|News|P2P|RemoteAccess|Telephony|TelephonyTools|VideoConference|WebBrowser|WebDevelopment|Midi|Mixer|Sequencer|Tuner|TV|AudioVideoEditing|Player|Recorder|DiscBurning|ActionGame|AdventureGame|ArcadeGame|BoardGame|BlocksGame|CardGame|KidsGame|LogicGame|RolePlaying|Simulation|SportsGame|StrategyGame|Art|Construction|Music|Languages|Science|ArtificialIntelligence|Astronomy|Biology|Chemistry|ComputerScience|DataVisualization|Economy|Electricity|Geography|Geology|Geoscience|History|ImageProcessing|Literature|Math|NumericalAnalysis|MedicalSoftware|Physics|Robotics|Sports|ParallelComputing|Amusement|Archiving|Compression|Electronics|Emulator|Engineering|FileTools|FileManager|TerminalEmulator|Filesystem|Monitor|Security|Accessibility|Calculator|Clock|TextEditor|Documentation|Core|KDE|GNOME|GTK|Qt|Motif|Java|ConsoleOnly"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Create some way to enforce entries to be nonempty -->
+ <xs:simpleType name="nonempty_token">
+ <xs:restriction base="xs:token">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="nonempty_string">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="nonempty_normalizedString">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+
+
+ <!-- declare some complexTypes for later usage -->
+
+ <!-- type used for file associations -->
+ <xs:complexType name="association_data">
+ <xs:attribute name="name" use="required" type="nonempty_normalizedString" />
+ <xs:attribute name="filetype" use="required" type="nonempty_token" />
+ <xs:attribute name="exec" use="required" type="nonempty_token" />
+ </xs:complexType>
+
+ <!-- type used for author info -->
+ <xs:complexType name="author_data">
+ <xs:attribute name="name" use="required" type="nonempty_normalizedString" />
+ <xs:attribute name="website" use="optional" type="xs:anyURI" />
+ <xs:attribute name="email" use="optional" type="emailAddress" />
+ </xs:complexType>
+
+ <!-- type used for version informations (full entry as well as os version) -->
+ <xs:complexType name="app_version_info">
+ <xs:attribute name="major" use="required" type="versionNumber" />
+ <xs:attribute name="minor" use="required" type="versionNumber" />
+ <xs:attribute name="release" use="required" type="versionNumber" />
+ <xs:attribute name="build" use="required" type="versionNumber" />
+ <xs:attribute name="type" use="optional" type="releaseType" />
+ </xs:complexType>
+ <xs:complexType name="os_version_info">
+ <xs:attribute name="major" use="required" type="versionNumber" />
+ <xs:attribute name="minor" use="required" type="versionNumber" />
+ <xs:attribute name="release" use="required" type="versionNumber" />
+ <xs:attribute name="build" use="required" type="versionNumber" />
+ </xs:complexType>
+
+ <!-- type used for exec entries -->
+ <xs:complexType name="exec_params">
+ <xs:attribute name="command" use="required" type="nonempty_token" />
+ <xs:attribute name="arguments" use="optional" type="nonempty_token" />
+ <xs:attribute name="background" use="optional" type="xs:boolean" />
+ <xs:attribute name="startdir" use="optional" type="dumbPath" />
+ <xs:attribute name="standalone" use="optional" type="xs:boolean" />
+ <xs:attribute name="x11" use="optional" type="x11Param" />
+ </xs:complexType>
+
+ <!-- type used for tiles or descriptions, once in 'normal' version, once enforcing usage of en_US -->
+ <xs:complexType name="title_or_description">
+ <xs:simpleContent>
+ <xs:extension base="nonempty_string">
+ <xs:attribute name="lang" use="required" type="isoLangcode" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="title_or_description_enUS">
+ <xs:simpleContent>
+ <xs:extension base="nonempty_string">
+ <xs:attribute name="lang" use="required" type="isoLangcode_en_US" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <!-- type used for referencing images -->
+ <xs:complexType name="image_entry">
+ <xs:attribute name="src" use="required" type="dumbPath" />
+ </xs:complexType>
+
+ <!-- type for referencing manuals/readme docs -->
+ <xs:complexType name="information_entry">
+ <xs:attribute name="name" use="required" type="nonempty_normalizedString" />
+ <xs:attribute name="type" use="required" type="docType" />
+ <xs:attribute name="src" use="required" type="dumbPath" />
+ </xs:complexType>
+
+ <!-- type used for the license information -->
+ <xs:complexType name="license_info">
+ <xs:attribute name="name" use="required" type="nonempty_normalizedString" />
+ <xs:attribute name="url" use="optional" type="xs:anyURI" />
+ <xs:attribute name="sourcecodeurl" use="optional" type="xs:anyURI" />
+ </xs:complexType>
+
+
+
+ <!-- Combine the symple and complex types into the "real" PXML specification -->
+
+ <xs:element name="PXML">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- specify the <package> tag with info about the complete package, information providable:
+ author
+ version
+ title(s)
+ description(s)
+ icon
+ -->
+ <xs:element name="package" minOccurs="1" maxOccurs="1">
+ <xs:complexType>
+ <xs:all>
+ <!--Author info-->
+ <xs:element name="author" type="author_data" minOccurs="1" />
+ <!--App version info-->
+ <xs:element name="version" type="app_version_info" minOccurs="1" />
+ <!--Title-->
+ <xs:element name="titles" minOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="title" type="title_or_description_enUS" minOccurs="1" maxOccurs="1" />
+ <xs:element name="title" type="title_or_description" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Description-->
+ <xs:element name="descriptions" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="title" type="title_or_description_enUS" minOccurs="0" maxOccurs="1" />
+ <xs:element name="description" type="title_or_description" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Icon-->
+ <xs:element name="icon" type="image_entry" minOccurs="0" />
+ </xs:all>
+ <!--Package ID-->
+ <xs:attribute name="id" use="required" type="dumbFolderName" />
+ </xs:complexType>
+ </xs:element>
+ <!-- specify the <application> tag with info about a single program
+ executable call
+ author
+ version (of the application)
+ osversion (min OS version supported)
+ title(s) (allowing compatibility to <HF6, too!)
+ description(s) (allowing compatibility to <HF6, too!)
+ icon
+ license
+ preview pictures
+ info/manual/readme entry
+ categories
+ associations to file types
+ clockspeed
+ -->
+ <xs:element name="application" minOccurs="1" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:all>
+ <!--Execution params -->
+ <xs:element name="exec" type="exec_params" minOccurs="1" />
+ <!--Author info-->
+ <xs:element name="author" type="author_data" minOccurs="1" />
+ <!--App version info-->
+ <xs:element name="version" type="app_version_info" minOccurs="1" />
+ <!--OS Version info-->
+ <xs:element name="osversion" type="os_version_info" minOccurs="0" />
+ <!--Title-->
+ <!-- via <titles> element, used for HF6+ -->
+ <xs:element name="titles" minOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="title" type="title_or_description_enUS" minOccurs="1" maxOccurs="1" />
+ <xs:element name="title" type="title_or_description" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Title-->
+ <!-- via <title> element, only one for en_US allowed, meant for backwards compatibility with libpnd from <HF6 -->
+ <xs:element name="title" type="title_or_description_enUS" minOccurs="0" />
+ <!--Description-->
+ <!-- via <descriptions> element, used for HF6+ -->
+ <xs:element name="descriptions" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="description" type="title_or_description_enUS" minOccurs="1" maxOccurs="1" />
+ <xs:element name="description" type="title_or_description" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Description-->
+ <!-- via <description> element, only one for en_US allowed, meant for backwards compatibility with libpnd from <HF6 -->
+ <xs:element name="description" type="title_or_description_enUS" minOccurs="0" />
+ <!--Icon-->
+ <xs:element name="icon" type="image_entry" minOccurs="0" />
+ <!--License-->
+ <xs:element name="licenses" minOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="license" type="license_info" minOccurs="1" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Preview pics-->
+ <xs:element name="previewpics" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="pic" type="image_entry" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Info (aka manual or readme entry)-->
+ <xs:element name="info" type="information_entry" minOccurs="0" />
+ <!--Categories-->
+ <xs:element name="categories" minOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="category" minOccurs="1" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="subcategory" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="name" type="fdoSubCategory" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" use="required" type="fdoCategory" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Associations-->
+ <xs:element name="associations" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="association" type="association_data" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--Clockspeed-->
+ <xs:element name="clockspeed" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="frequency" use="required" type="xs:positiveInteger" />
+ </xs:complexType>
+ </xs:element>
+ </xs:all>
+ <!--AppID-->
+ <xs:attribute name="id" use="required" type="dumbFolderName" />
+ <xs:attribute name="appdata" use="optional" type="dumbFolderName" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/backends/platform/openpandora/build/pnd_make.sh b/backends/platform/openpandora/build/pnd_make.sh
index b19de87bb4..0c03e8154d 100755
--- a/backends/platform/openpandora/build/pnd_make.sh
+++ b/backends/platform/openpandora/build/pnd_make.sh
@@ -1,65 +1,321 @@
-#!/bin/sh
+#!/bin/bash
+#
+# pnd_make.sh
+#
+# This script is meant to ease generation of a pnd file. Please consult the output
+# when running --help for a list of available parameters and an explaination of
+# those.
+#
+# Required tools when running the script:
+# bash
+# echo, cat, mv, rm
+# mkisofs or mksquashfs (the latter when using the -c param!)
+# xmllint (optional, only for validation of the PXML against the schema)
-######adjust path of genpxml.sh if you want to use that "feture"#####
-TEMP=`getopt -o p:d:x:i:c -- "$@"`
+PXML_schema=$(dirname ${0})/PXML_schema.xsd
+GENPXML_PATH=$(dirname ${0})/genpxml.sh
-if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
+# useful functions ...
+black='\E[30m'
+red='\E[31m'
+green='\E[32m'
+yellow='\E[33m'
+blue='\E[34m'
+magenta='\E[35m'
+cyan='\E[36m'
+white='\E[37m'
-eval set -- "$TEMP"
-while true ; do
- case "$1" in
- -p) echo "PNDNAME set to $2" ;PNDNAME=$2;shift 2;;
- -d) echo "FOLDER set to $2" ;FOLDER=$2;shift 2 ;;
- -x) echo "PXML set to $2" ;PXML=$2;shift 2 ;;
- -i) echo "ICON set to $2" ;ICON=$2;shift 2 ;;
- -c) echo "-c set, will create compressed squasfs image instead of iso $2" ;SQUASH=1;shift 1 ;;
- --) shift ; break ;;
- *) echo "Error while parsing arguments! $2" ; exit 1 ;;
- esac
+check_for_tool()
+{
+ which $1 &> /dev/null
+ if [ "$?" -ne "0" ];
+ then
+ cecho "ERROR: Could not find the program '$1'. Please make sure
+that it is available in your PATH since it is required to complete your request." $red
+ exit 1
+ fi
+}
+
+cecho () # Color-echo. Argument $1 = message, Argument $2 = color
+{
+ local default_msg="No message passed." # Doesn't really need to be a local variable.
+ message=${1:-$default_msg} # Defaults to default message.
+ color=${2:-$black} # Defaults to black, if not specified.
+ echo -e "$color$message"
+ tput sgr0 # Reset to normal.
+ return
+}
+
+
+print_help()
+{
+ cat << EOSTREAM
+pnd_make.sh - A script to package "something" into a PND.
+
+Usage:
+ $(basename ${0}) {--directory|-d} <folder> {--pndname|-p} <file> [{--compress-squashfs|-c}]
+ [{--genpxml} <file>] [{--icon|-i} <file>] [{--pxml|-x} <file>]
+ [{--schema|-s} <file>] [{--help|-h}]
+
+
+Switches:
+ --compress-squashfs / -c Define whether or not the pnd should be compressed using
+ squashfs. If this parameter is selected, a compressed pnd
+ will be created.
+
+ --directory / -d Sets the folder that is to be used for the resulting pnd
+ to <folder>. This option is mandatory for the script to
+ function correctly.
+
+ --genpxml Sets the script used for generating a PXML file (if none
+ is available already) to <file>. Please make sure to either
+ provide a full path or prefix a script in the current folder
+ with './' so that the script can actually be executed. If
+ this variable is not specified, $GENPXML_PATH
+ will be used.
+
+ --help / -h Displays this help text.
+
+ --icon / -i Sets the icon that will be appended in the pnd to <file>.
+
+ --pndname / -p Sets the output filename of the resulting pnd to <file>.
+ This option is mandatory for the script to function
+ correctly.
+
+ --pxml / -x Sets the PXML file that is to be used to <file>. If you
+ neither provide a PXML file or set this entry to 'guess',
+ an existing 'PXML.xml' in your selected '--directory'
+ will be used, or the script $GENPXML_PATH
+ will be called to try to generate a basic PXML file for you.
+
+ --schema / -s Sets the schema file, that is to be used for validation,
+ to <file. If this is not defined, the script will try to
+ use the file '$PXML_schema'. If this fails,
+ a warning is issued.
+
+If you select the option to create a compressed squashfs, a version >=4.0 of squashfs
+is required to be available in your PATH.
+EOSTREAM
+}
+
+
+# Parse command line parameters
+while [ "${1}" != "" ]; do
+ if [ "${1}" = "--compress-squashfs" ] || [ "${1}" = "-c" ];
+ then
+ SQUASH=1
+ shift 1
+ elif [ "${1}" = "--directory" ] || [ "${1}" = "-d" ];
+ then
+ FOLDER=$2
+ shift 2
+ elif [ "${1}" = "--genpxml" ];
+ then
+ GENPXML_PATH=$2
+ shift 2
+ elif [ "${1}" = "--help" ] || [ "${1}" = "-h" ];
+ then
+ print_help
+ exit 0
+ elif [ "${1}" = "--icon" ] || [ "${1}" = "-i" ];
+ then
+ ICON=$2
+ shift 2
+ elif [ "${1}" = "--pndname" ] || [ "${1}" = "-p" ];
+ then
+ PNDNAME=$2
+ shift 2
+ elif [ "${1}" = "--pxml" ] || [ "${1}" = "-x" ];
+ then
+ PXML=$2
+ shift 2
+ elif [ "${1}" = "--schema" ] || [ "${1}" = "-f" ]
+ then
+ PXML_schema=$2
+ shift 2
+ else
+ cecho "ERROR: '$1' is not a known argument. Printing --help and aborting." $red
+ print_help
+ exit 1
+ fi
done
-rnd=$RANDOM; # random number for genpxml and index$rnd.xml
-#generate pxml if guess or empty
-if [ ! $PXML ] || [ $PXML = "guess" ] && [ $PNDNAME ] && [ $FOLDER ]; then
- PXMLtxt=$(/home/user/libpnd/pandora-libraries/testdata/scripts/genpxml.sh $FOLDER $ICON)
- PXML=$FOLDER/PXML.xml
- echo "$PXMLtxt" > $FOLDER/PXML.xml
+# Generate a PXML if the param is set to Guess or it is empty.
+if [ ! $PXML ] || [ $PXML = "guess" ] && [ $PNDNAME ] && [ $FOLDER ];
+then
+ if [ -f $FOLDER/PXML.xml ]; # use the already existing PXML.xml file if there is one...
+ then
+ PXML=$FOLDER/PXML.xml
+ PXML_ALREADY_EXISTING="true"
+ else
+ if [ -f $GENPXML_PATH ];
+ then
+ $GENPXML_PATH --src $FOLDER --dest $FOLDER --author $USER
+ if [ -f $FOLDER/PXML.xml ];
+ then
+ PXML_GENERATED="true"
+ else
+ cecho "ERROR: Generating a PXML file using '$GENPXML_PATH' failed.
+Please generate a PXML file manually." $red
+ exit 1
+ fi
+ else
+ cecho "ERROR: Could not find '$GENPXML_PATH' for generating a PXML file." $red
+ exit 1
+ fi
+ fi
fi
-#check arguments
-if [ ! $PNDNAME ] || [ ! $FOLDER ] || [ ! $PXML ]; then
- echo " Usage: pnd_make.sh -p your.pnd -d folder/containing/your/app/ -x
- your.pxml (or \"guess\" to try to generate it from the folder) -i icon.png"
+
+# Probe if required variables were set
+echo -e
+cecho "Checking if all required variables were set." $green
+if [ ! $PNDNAME ] || [ ! $FOLDER ] || [ ! $PXML ];
+then
+ echo -e
+ cecho "ERROR: Not all required options were set! Please see the --help information below." $red
+ echo -e
+ print_help
exit 1
+else
+ echo "PNDNAME set to '$PNDNAME'."
+fi
+# Check if the selected folder actually exists
+if [ ! -d $FOLDER ];
+then
+ echo -e
+ cecho "ERROR: '$FOLDER' doesn't exist or is not a folder." $red
+ exit 1
+else
+ echo "FOLDER set to '$FOLDER'."
+fi
+# Check if the selected PXML file actually exists
+if [ ! -f $PXML ];
+then
+ echo -e
+ cecho "ERROR: '$PXML' doesn't exist or is not a file." $red
+ exit 1
+else
+ if [ $PXML_ALREADY_EXISTING ];
+ then
+ echo "You have not explicitly specified a PXML to use, but an existing file was
+found. Will be using this one."
+ elif [ $PXML_GENERATED ];
+ then
+ echo "A PXML file was generated for you using '$GENPXML_PATH'. This file will
+not be removed at the end of this script because you might want to review it, adjust
+single entries and rerun the script to generate a pnd with a PXML file with all the
+information you want to have listed."
+ fi
+ echo "PXML set to '$PXML'."
fi
-if [ ! -d $FOLDER ]; then echo "$FOLDER doesnt exist"; exit 1; fi #check if folder actually exists
-if [ ! -f $PXML ]; then echo "$PXML doesnt exist"; exit 1; fi #check if pxml actually exists
-#make iso from folder
-if [ ! $SQUASH ]; then
- mkisofs -o $PNDNAME.iso -R $FOLDER
+# Print the other variables:
+if [ $ICON ];
+then
+ if [ ! -f $ICON ]
+ then
+ cecho "WARNING: '$ICON' doesn't exist, will not append the selected icon to the pnd." $red
+ else
+ echo "ICON set to '$ICON'."
+ USE_ICON="true"
+ fi
+fi
+if [ $SQUASH ];
+then
+ echo "Will use a squashfs for '$PNDNAME'."
+fi
+
+
+# Validate the PXML file (if xmllint is available)
+# Errors and problems in this section will be shown but are not fatal.
+echo -e
+cecho "Trying to validate '$PXML' now. Will be using '$PXML_schema' to do so." $green
+which xmllint &> /dev/null
+if [ "$?" -ne "0" ];
+then
+ VALIDATED=false
+ cecho "WARNING: Could not find 'xmllint'. Validity check of '$PXML' is not possible!" $red
else
- if [ $(mksquashfs -version | awk '{if ($3 >= 4) print 1}') = 1 ]; then
- echo "your squashfs version is older then version 4, please upgrade to 4.0 or later"
+ if [ ! -f "$PXML_schema" ];
+ then
+ VALIDATED=false
+ cecho "WARNING: Could not find '$PXML_schema'. If you want to validate your
+PXML file please make sure to provide a schema using the --schema option." $red
+ else
+ xmllint --noout --schema $PXML_schema $PXML
+ if [ "$?" -ne "0" ]; then VALIDATED=false; else VALIDATED=true; fi
+ fi
+fi
+# Print some message at the end about the validation in case the user missed the output above
+if [ $VALIDATED = "false" ]
+then
+ cecho "WARNING: Could not successfully validate '$PXML'. Please check the output
+above. This does not mean that your pnd will be broken. Either you are not following the strict
+syntax required for validation or you don't have all files/programs required for validating." $red
+else
+ cecho "Your file '$PXML' was validated successfully. The resulting pnd should
+work nicely with libpnd." $green
+fi
+
+
+# Make iso from folder
+echo -e
+cecho "Creating an iso file based on '$FOLDER'." $green
+if [ $SQUASH ];
+then
+ check_for_tool mksquashfs
+ if [ $(mksquashfs -version | awk 'BEGIN{r=0} $3>=4{r=1} END{print r}') -eq 0 ];
+ then
+ cecho "ERROR: Your squashfs version is older then version 4, please upgrade to 4.0 or later" $red
exit 1
fi
- mksquashfs -no-recovery -nopad $FOLDER $PNDNAME.iso
+ mksquashfs $FOLDER $PNDNAME.iso -nopad -no-recovery
+else
+ check_for_tool mkisofs
+ mkisofs -o $PNDNAME.iso -R $FOLDER
+fi
+
+# Check that the iso file was actually created before continuing
+if [ ! -f $PNDNAME.iso ];
+then
+ cecho "ERROR: The temporary file '$PNDNAME.iso' could not be created.
+Please check the output above for any errors and retry after fixing them. Aborting." $red
+ exit 1
fi
-#append pxml to iso
-cat $PNDNAME.iso $PXML > $PNDNAME
+
+
+# Append pxml to iso
+echo -e
+cecho "Appending '$PXML' to the created iso file." $green
+cat $PNDNAME.iso $PXML > $PNDNAME
rm $PNDNAME.iso #cleanup
-#append icon if specified
-if [ $ICON ]; then # check if we want to add an icon
- if [ ! -f $ICON ]; then #does the icon actually exist?
- echo "$ICON doesnt exist"
- else # yes
+
+# Append icon if specified and available
+if [ $USE_ICON ];
+then
+ echo -e
+ cecho "Appending the icon '$ICON' to the pnd." $green
mv $PNDNAME $PNDNAME.tmp
cat $PNDNAME.tmp $ICON > $PNDNAME # append icon
rm $PNDNAME.tmp #cleanup
- fi
fi
-if [ $PXML = "guess" ];then rm $FOLDER/PXML.xml; fi #cleanup
+
+# Final message
+echo -e
+if [ -f $PNDNAME ];
+then
+ cecho "Successfully finished creating the pnd '$PNDNAME'." $green
+else
+ cecho "There seems to have been a problem and '$PNDNAME' was not created. Please check
+the output above for any error messages. A possible cause for this is that there was
+not enough space available." $red
+ exit 1
+fi
+
+
+#if [ $PXML = "guess" ];then rm $FOLDER/PXML.xml; fi #cleanup
diff --git a/backends/platform/openpandora/build/runscummvm.sh b/backends/platform/openpandora/build/runscummvm.sh
index 48d24a2b81..9c9d8362cb 100755
--- a/backends/platform/openpandora/build/runscummvm.sh
+++ b/backends/platform/openpandora/build/runscummvm.sh
@@ -11,4 +11,4 @@ mkdir saves
mkdir runtime
cd runtime
-../bin/scummvm --fullscreen --gfx-mode=2x --config=../scummvm.config
+../bin/scummvm --fullscreen --gfx-mode=2x --config=../scummvm.config --themepath=../data
diff --git a/backends/platform/openpandora/op-backend.cpp b/backends/platform/openpandora/op-backend.cpp
index 5231e9790d..dcec387f97 100644
--- a/backends/platform/openpandora/op-backend.cpp
+++ b/backends/platform/openpandora/op-backend.cpp
@@ -49,7 +49,7 @@
#include <limits.h>
#include <errno.h>
#include <sys/stat.h>
-#include <time.h> // for getTimeAndDate()
+#include <time.h> // for getTimeAndDate()
/* Dump console info to files. */
#define DUMP_STDOUT
@@ -97,7 +97,7 @@ void OSystem_OP::initBackend() {
// if (_mixer == 0) {
// _mixerManager = new DoubleBufferSDLMixerManager();
- // Setup and start mixer
+ // Setup and start mixer
// _mixerManager->init();
// }
@@ -123,49 +123,49 @@ void OSystem_OP::initBackend() {
_savefileManager = new DefaultSaveFileManager(savePath);
- #ifdef DUMP_STDOUT
- // The OpenPandora has a serial console on the EXT connection but most users do not use this so we
- // output all our STDOUT and STDERR to files for debug purposes.
- char STDOUT_FILE[PATH_MAX+1];
- char STDERR_FILE[PATH_MAX+1];
-
- strcpy(STDOUT_FILE, workDirName);
- strcpy(STDERR_FILE, workDirName);
- strcat(STDOUT_FILE, "/scummvm.stdout.txt");
- strcat(STDERR_FILE, "/scummvm.stderr.txt");
-
- // Flush the output in case anything is queued
- fclose(stdout);
- fclose(stderr);
-
- // Redirect standard input and standard output
- FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
- if (newfp == NULL) {
- #if !defined(stdout)
- stdout = fopen(STDOUT_FILE, "w");
- #else
- newfp = fopen(STDOUT_FILE, "w");
- if (newfp) {
- *stdout = *newfp;
- }
- #endif
+#ifdef DUMP_STDOUT
+ // The OpenPandora has a serial console on the EXT connection but most users do not use this so we
+ // output all our STDOUT and STDERR to files for debug purposes.
+ char STDOUT_FILE[PATH_MAX+1];
+ char STDERR_FILE[PATH_MAX+1];
+
+ strcpy(STDOUT_FILE, workDirName);
+ strcpy(STDERR_FILE, workDirName);
+ strcat(STDOUT_FILE, "/scummvm.stdout.txt");
+ strcat(STDERR_FILE, "/scummvm.stderr.txt");
+
+ // Flush the output in case anything is queued
+ fclose(stdout);
+ fclose(stderr);
+
+ // Redirect standard input and standard output
+ FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
+ if (newfp == NULL) {
+#if !defined(stdout)
+ stdout = fopen(STDOUT_FILE, "w");
+#else
+ newfp = fopen(STDOUT_FILE, "w");
+ if (newfp) {
+ *stdout = *newfp;
}
+#endif
+ }
- newfp = freopen(STDERR_FILE, "w", stderr);
- if (newfp == NULL) {
- #if !defined(stderr)
- stderr = fopen(STDERR_FILE, "w");
- #else
- newfp = fopen(STDERR_FILE, "w");
- if (newfp) {
- *stderr = *newfp;
- }
- #endif
+ newfp = freopen(STDERR_FILE, "w", stderr);
+ if (newfp == NULL) {
+#if !defined(stderr)
+ stderr = fopen(STDERR_FILE, "w");
+#else
+ newfp = fopen(STDERR_FILE, "w");
+ if (newfp) {
+ *stderr = *newfp;
}
+#endif
+ }
- setbuf(stderr, NULL);
- printf("%s\n", "Debug: STDOUT and STDERR redirected to text files.");
- #endif /* DUMP_STDOUT */
+ setbuf(stderr, NULL);
+ printf("%s\n", "Debug: STDOUT and STDERR redirected to text files.");
+#endif /* DUMP_STDOUT */
/* Trigger autosave every 4 minutes. */
ConfMan.registerDefault("autosave_period", 4 * 60);
@@ -187,7 +187,7 @@ void OSystem_OP::initBackend() {
_inited = true;
}
- // enable joystick
+// enable joystick
// if (joystick_num > -1 && SDL_NumJoysticks() > 0) {
// printf("Using joystick: %s\n", SDL_JoystickName(0));
// _joystick = SDL_JoystickOpen(joystick_num);
@@ -195,13 +195,13 @@ void OSystem_OP::initBackend() {
//
// setupMixer();
- // Note: We could implement a custom SDLTimerManager by using
- // SDL_AddTimer. That might yield better timer resolution, but it would
- // also change the semantics of a timer: Right now, ScummVM timers
- // *never* run in parallel, due to the way they are implemented. If we
- // switched to SDL_AddTimer, each timer might run in a separate thread.
- // However, not all our code is prepared for that, so we can't just
- // switch. Still, it's a potential future change to keep in mind.
+// Note: We could implement a custom SDLTimerManager by using
+// SDL_AddTimer. That might yield better timer resolution, but it would
+// also change the semantics of a timer: Right now, ScummVM timers
+// *never* run in parallel, due to the way they are implemented. If we
+// switched to SDL_AddTimer, each timer might run in a separate thread.
+// However, not all our code is prepared for that, so we can't just
+// switch. Still, it's a potential future change to keep in mind.
// _timer = new DefaultTimerManager();
// _timerID = SDL_AddTimer(10, &timer_handler, _timer);
@@ -217,9 +217,9 @@ void OSystem_OP::initSDL() {
if (SDL_Init(sdlFlags) == -1)
error("Could not initialize SDL: %s", SDL_GetError());
- uint8_t hiddenCursorData = 0;
+ uint8_t hiddenCursorData = 0;
- hiddenCursor = SDL_CreateCursor(&hiddenCursorData, &hiddenCursorData, 8, 1, 0, 0);
+ hiddenCursor = SDL_CreateCursor(&hiddenCursorData, &hiddenCursorData, 8, 1, 0, 0);
/* On the OpenPandora we need to work around an SDL assumption that
returns relative mouse coordinates when you get to the screen
@@ -277,11 +277,11 @@ void OSystem_OP::quit() {
SDL_FreeCursor(hiddenCursor);
- #ifdef DUMP_STDOUT
- printf("%s\n", "Debug: STDOUT and STDERR text files closed.");
- fclose(stdout);
- fclose(stderr);
- #endif /* DUMP_STDOUT */
+#ifdef DUMP_STDOUT
+ printf("%s\n", "Debug: STDOUT and STDERR text files closed.");
+ fclose(stdout);
+ fclose(stderr);
+#endif /* DUMP_STDOUT */
OSystem_POSIX::quit();
}
diff --git a/backends/platform/openpandora/op-bundle.mk b/backends/platform/openpandora/op-bundle.mk
index 163f4711ce..089430f43c 100755
--- a/backends/platform/openpandora/op-bundle.mk
+++ b/backends/platform/openpandora/op-bundle.mk
@@ -75,11 +75,10 @@ endif
$(CP) $(libloc)/../arm-angstrom-linux-gnueabi/usr/lib/libFLAC.so.8.2.0 $(bundle_name)/scummvm/lib/libFLAC.so.8
- $(srcdir)/backends/platform/openpandora/build/pnd_make.sh -p $(bundle_name).pnd -d $(bundle_name)/scummvm -x $(bundle_name)/scummvm/data/PXML.xml -i $(bundle_name)/scummvm/icon/scummvm.png
+ $(srcdir)/backends/platform/openpandora/build/pnd_make.sh -p $(bundle_name).pnd -c -d $(bundle_name)/scummvm -x $(bundle_name)/scummvm/data/PXML.xml -i $(bundle_name)/scummvm/icon/scummvm.png
$(CP) $(srcdir)/backends/platform/openpandora/build/README-PND.txt $(bundle_name)
tar -cvjf $(bundle_name)-pnd.tar.bz2 $(bundle_name).pnd $(bundle_name)/README-PND.txt
rm -R ./$(bundle_name)
-# rm $(bundle_name).pnd
.PHONY: op-bundle op-pnd
diff --git a/backends/platform/openpandora/op-main.cpp b/backends/platform/openpandora/op-main.cpp
index bb359e7204..ebe018f570 100644
--- a/backends/platform/openpandora/op-main.cpp
+++ b/backends/platform/openpandora/op-main.cpp
@@ -43,7 +43,7 @@ int main(int argc, char *argv[]) {
int res = scummvm_main(argc, argv);
// Free OSystem
- delete (OSystem_OP *)g_system;
+ delete(OSystem_OP *)g_system;
return res;
}
diff --git a/backends/platform/openpandora/op-options.cpp b/backends/platform/openpandora/op-options.cpp
index c60ba58cc7..58f0fb7188 100644
--- a/backends/platform/openpandora/op-options.cpp
+++ b/backends/platform/openpandora/op-options.cpp
@@ -31,9 +31,9 @@ namespace OP {
enum {
/* Touchscreen TapMode */
- TAPMODE_LEFT = 0,
- TAPMODE_RIGHT = 1,
- TAPMODE_HOVER = 2
+ TAPMODE_LEFT = 0,
+ TAPMODE_RIGHT = 1,
+ TAPMODE_HOVER = 2
};
int tapmodeLevel = TAPMODE_LEFT;
@@ -47,7 +47,7 @@ void ToggleTapMode() {
tapmodeLevel = TAPMODE_LEFT;
} else {
tapmodeLevel = TAPMODE_LEFT;
- }
+ }
}
} /* namespace OP */
diff --git a/backends/platform/openpandora/op-options.h b/backends/platform/openpandora/op-options.h
index ebc83ca00c..919d217f4b 100644
--- a/backends/platform/openpandora/op-options.h
+++ b/backends/platform/openpandora/op-options.h
@@ -32,7 +32,7 @@ namespace OP {
extern int tapmodeLevel;
-extern void ToggleTapMode();
+extern void ToggleTapMode();
} /* namespace OP */
diff --git a/backends/platform/openpandora/op-sdl.h b/backends/platform/openpandora/op-sdl.h
index d493c3957c..8cccbb5f86 100644
--- a/backends/platform/openpandora/op-sdl.h
+++ b/backends/platform/openpandora/op-sdl.h
@@ -34,7 +34,7 @@
//#define MIXER_DOUBLE_BUFFERING 1
#ifndef PATH_MAX
- #define PATH_MAX 255
+#define PATH_MAX 255
#endif
class OSystem_OP : public OSystem_POSIX {
diff --git a/backends/platform/ps2/DmaPipe.h b/backends/platform/ps2/DmaPipe.h
index fd8f55c154..c99da1c395 100644
--- a/backends/platform/ps2/DmaPipe.h
+++ b/backends/platform/ps2/DmaPipe.h
@@ -64,4 +64,3 @@ private:
};
#endif //__DMAPIPE_H__
-
diff --git a/backends/platform/ps2/Gs2dScreen.cpp b/backends/platform/ps2/Gs2dScreen.cpp
index 332b2a3c03..ddc1bdf668 100644
--- a/backends/platform/ps2/Gs2dScreen.cpp
+++ b/backends/platform/ps2/Gs2dScreen.cpp
@@ -816,5 +816,3 @@ const uint32 Gs2dScreen::_binaryClut[16] __attribute__((aligned(64))) = {
GS_RGBA(0xFF, 0xFF, 0xFF, 0x80), GS_RGBA(0xFF, 0xFF, 0xFF, 0x80),
GS_RGBA(0xFF, 0xFF, 0xFF, 0x80), GS_RGBA(0xFF, 0xFF, 0xFF, 0x80)
};
-
-
diff --git a/backends/platform/ps2/Makefile.gdb b/backends/platform/ps2/Makefile.gdb
index 1e2510d3f4..8ca47cd9f1 100644
--- a/backends/platform/ps2/Makefile.gdb
+++ b/backends/platform/ps2/Makefile.gdb
@@ -102,4 +102,3 @@ all: $(TARGET)
$(TARGET): $(OBJS)
$(LD) $^ $(LDFLAGS) -o $@
-
diff --git a/backends/platform/ps2/Makefile.ps2 b/backends/platform/ps2/Makefile.ps2
index 77cc735c5f..d6ce08ae84 100644
--- a/backends/platform/ps2/Makefile.ps2
+++ b/backends/platform/ps2/Makefile.ps2
@@ -105,4 +105,3 @@ all: $(TARGET)
$(TARGET): $(OBJS)
$(LD) $^ $(LDFLAGS) -o $@
-
diff --git a/backends/platform/ps2/asyncfio.cpp b/backends/platform/ps2/asyncfio.cpp
index d3d8eb65c7..3f20349107 100644
--- a/backends/platform/ps2/asyncfio.cpp
+++ b/backends/platform/ps2/asyncfio.cpp
@@ -237,4 +237,3 @@ bool AsyncFio::fioAvail(void) {
}
return retVal;
}
-
diff --git a/backends/platform/ps2/asyncfio.h b/backends/platform/ps2/asyncfio.h
index 26ee3f63dd..31684d4349 100644
--- a/backends/platform/ps2/asyncfio.h
+++ b/backends/platform/ps2/asyncfio.h
@@ -50,4 +50,3 @@ private:
volatile int * volatile _runningOp;
volatile int _ioSlots[MAX_HANDLES];
};
-
diff --git a/backends/platform/ps2/eecodyvdfs.c b/backends/platform/ps2/eecodyvdfs.c
index e9d4bc6a5c..f410b0c8ec 100644
--- a/backends/platform/ps2/eecodyvdfs.c
+++ b/backends/platform/ps2/eecodyvdfs.c
@@ -63,5 +63,3 @@ int driveStandby(void) {
driveStopped = 0;
return *(int *)sbuff;
}
-
-
diff --git a/backends/platform/ps2/eecodyvdfs.h b/backends/platform/ps2/eecodyvdfs.h
index 4b383795c7..1d43fb662f 100644
--- a/backends/platform/ps2/eecodyvdfs.h
+++ b/backends/platform/ps2/eecodyvdfs.h
@@ -49,4 +49,3 @@ extern "C" {
#endif
#endif
-
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h b/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h
index ebf57328dd..ad86631cfd 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h
@@ -131,4 +131,3 @@ typedef struct {
} ISOPvd __attribute__ ((packed)); // 0x800
#endif // __CDTYPES_H__
-
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c b/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c
index 77a5b93720..e55e62853b 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c
@@ -344,4 +344,3 @@ int strnicmp(const char *s1, const char *s2, int n) {
}
return 0;
}
-
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h b/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h
index 902065f385..b9f1edc194 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h
@@ -81,4 +81,3 @@ int checkDiscReady(int retries);
int strnicmp(const char *s1, const char *s2, int n);
#endif // __MYCDVDFS_H__
-
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c
index 8aecece3d9..f0a06f927b 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c
@@ -262,4 +262,3 @@ int cd_dclose(iop_file_t *handle) {
hd->size = hd->lba = 0;
return 0;
}
-
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h
index d0aa9533f2..db942b0b7e 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h
@@ -34,4 +34,3 @@ int cd_dread(iop_file_t *handle, fio_dirent_t *buf);
int cd_dclose(iop_file_t *handle);
#endif // __FIOFS_H__
-
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/imports.lst b/backends/platform/ps2/iop/CoDyVDfs/iop/imports.lst
index eb85e04462..4950bf8ced 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/imports.lst
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/imports.lst
@@ -61,5 +61,3 @@ I_StartThread
I_GetThreadId
I_DelayThread
thbase_IMPORTS_end
-
-
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c b/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c
index 3e45a5ff3d..5b760faa06 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c
@@ -111,5 +111,3 @@ void *rpcServer(int func, void *data, int size) {
}
return NULL;
}
-
-
diff --git a/backends/platform/ps2/iop/rpckbd/src/imports.lst b/backends/platform/ps2/iop/rpckbd/src/imports.lst
index 41e13e6e73..e9ba01e020 100644
--- a/backends/platform/ps2/iop/rpckbd/src/imports.lst
+++ b/backends/platform/ps2/iop/rpckbd/src/imports.lst
@@ -55,4 +55,3 @@ I_UsbSetDevicePrivateData
I_UsbTransfer
I_UsbRegisterDriver
usbd_IMPORTS_end
-
diff --git a/backends/platform/ps2/irxboot.cpp b/backends/platform/ps2/irxboot.cpp
index 5072e8a52c..aa904d4f5b 100644
--- a/backends/platform/ps2/irxboot.cpp
+++ b/backends/platform/ps2/irxboot.cpp
@@ -210,4 +210,3 @@ int loadIrxModules(int device, const char *irxPath, IrxReference **modules) {
sioprintf("%s\n", resModules[i].path);
return curModule - resModules;
}
-
diff --git a/backends/platform/ps2/irxboot.h b/backends/platform/ps2/irxboot.h
index ef1bfb1256..81b47a37c6 100644
--- a/backends/platform/ps2/irxboot.h
+++ b/backends/platform/ps2/irxboot.h
@@ -84,4 +84,3 @@ struct IrxReference {
int loadIrxModules(int device, const char *irxPath, IrxReference **modules);
#endif // __IRXBOOT_H__
-
diff --git a/backends/platform/ps2/ps2debug.cpp b/backends/platform/ps2/ps2debug.cpp
index 1fc3d50170..300e18316f 100644
--- a/backends/platform/ps2/ps2debug.cpp
+++ b/backends/platform/ps2/ps2debug.cpp
@@ -44,4 +44,3 @@ void sioprintf(const char *zFormat, ...) {
pos++;
}
}
-
diff --git a/backends/platform/ps2/ps2debug.h b/backends/platform/ps2/ps2debug.h
index 127032ae80..02831e0623 100644
--- a/backends/platform/ps2/ps2debug.h
+++ b/backends/platform/ps2/ps2debug.h
@@ -28,4 +28,3 @@
void sioprintf(const char *zFormat, ...);
#endif // __PS2DEBUG_H__
-
diff --git a/backends/platform/ps2/ps2input.cpp b/backends/platform/ps2/ps2input.cpp
index 07104a6d97..6f36c5ff90 100644
--- a/backends/platform/ps2/ps2input.cpp
+++ b/backends/platform/ps2/ps2input.cpp
@@ -545,5 +545,3 @@ const Common::KeyCode Ps2Input::_padFlags[16] = {
Common::KEYCODE_INVALID, // Cross
Common::KEYCODE_INVALID // Square
};
-
-
diff --git a/backends/platform/ps2/ps2input.h b/backends/platform/ps2/ps2input.h
index c5d2f5b840..b97daac042 100644
--- a/backends/platform/ps2/ps2input.h
+++ b/backends/platform/ps2/ps2input.h
@@ -61,4 +61,3 @@ private:
};
#endif // __PS2INPUT_H__
-
diff --git a/backends/platform/ps2/ps2mutex.cpp b/backends/platform/ps2/ps2mutex.cpp
index 75b3a15482..5b30fa7862 100644
--- a/backends/platform/ps2/ps2mutex.cpp
+++ b/backends/platform/ps2/ps2mutex.cpp
@@ -97,4 +97,3 @@ void OSystem_PS2::deleteMutex(MutexRef mutex) {
sysMutex->sema = -1;
SignalSema(_mutexSema);
}
-
diff --git a/backends/platform/ps2/ps2pad.cpp b/backends/platform/ps2/ps2pad.cpp
index 00512c40c3..eeb9dfbd93 100644
--- a/backends/platform/ps2/ps2pad.cpp
+++ b/backends/platform/ps2/ps2pad.cpp
@@ -148,5 +148,3 @@ void Ps2Pad::readPad(uint16 *pbuttons, int16 *joyh, int16 *joyv) {
*pbuttons = 0;
}
}
-
-
diff --git a/backends/platform/ps2/ps2pad.h b/backends/platform/ps2/ps2pad.h
index 16c7c796d3..aebb3c6339 100644
--- a/backends/platform/ps2/ps2pad.h
+++ b/backends/platform/ps2/ps2pad.h
@@ -63,4 +63,3 @@ private:
};
#endif //__PS2PAD_H__
-
diff --git a/backends/platform/ps2/rpckbd.c b/backends/platform/ps2/rpckbd.c
index 0d37e4cfcb..0bb45208f5 100644
--- a/backends/platform/ps2/rpckbd.c
+++ b/backends/platform/ps2/rpckbd.c
@@ -175,4 +175,3 @@ int PS2KbdResetKeymap(void)
} else
return -1;
}
-
diff --git a/backends/platform/ps2/rpckbd.h b/backends/platform/ps2/rpckbd.h
index bc94cddf1b..bffd8e5be5 100644
--- a/backends/platform/ps2/rpckbd.h
+++ b/backends/platform/ps2/rpckbd.h
@@ -47,4 +47,3 @@ extern "C" {
#endif
#endif
-
diff --git a/backends/platform/ps2/sdlkeys.h b/backends/platform/ps2/sdlkeys.h
index b2f783cedd..791b1eb190 100644
--- a/backends/platform/ps2/sdlkeys.h
+++ b/backends/platform/ps2/sdlkeys.h
@@ -260,5 +260,3 @@ enum SdlKeyCodes {
};
#endif
-
-
diff --git a/backends/platform/ps2/systemps2.cpp b/backends/platform/ps2/systemps2.cpp
index d3acd06089..c75d7493a2 100644
--- a/backends/platform/ps2/systemps2.cpp
+++ b/backends/platform/ps2/systemps2.cpp
@@ -66,7 +66,7 @@
#include "engines/engine.h"
-#include "graphics/font.h"
+#include "graphics/fonts/bdf.h"
#include "graphics/surface.h"
#include "icon.h"
@@ -96,7 +96,7 @@ OSystem_PS2 *g_systemPs2;
#define FOREVER 2147483647
namespace Graphics {
- extern const NewFont g_sysfont;
+ extern const BdfFont g_sysfont;
};
PS2Device detectBootPath(const char *elfPath, char *bootPath);
diff --git a/backends/platform/psp/Makefile b/backends/platform/psp/Makefile
index 899bf37e80..7f4f20446e 100644
--- a/backends/platform/psp/Makefile
+++ b/backends/platform/psp/Makefile
@@ -201,4 +201,3 @@ SCEkxploit: $(TARGET).elf $(PSP_EBOOT_SFO)
$(PACK_PBP) "%__SCE__$(TARGET)/$(PSP_EBOOT)" $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_PIC0) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) NULL $(PSP_EBOOT_PSAR)
-
diff --git a/backends/platform/psp/README.PSP b/backends/platform/psp/README.PSP
index dcfa30898c..bc0bd35a6e 100644
--- a/backends/platform/psp/README.PSP
+++ b/backends/platform/psp/README.PSP
@@ -1,4 +1,4 @@
-ScummVM-PSP 1.4.0git README
+ScummVM-PSP 1.5.0git README
==============================================================================
Installation
@@ -169,4 +169,3 @@ Joost Peters (joostp@scummvm.org)
Paolo Costabel (paoloc@pacbell.net)
Thomas Mayer (tommybear@internode.on.net)
Yotam Barnoy (yotambarnoy@gmail.com)
-
diff --git a/backends/platform/psp/README.PSP.in b/backends/platform/psp/README.PSP.in
index 978f8a60bd..1ee99db84b 100644
--- a/backends/platform/psp/README.PSP.in
+++ b/backends/platform/psp/README.PSP.in
@@ -169,4 +169,3 @@ Joost Peters (joostp@scummvm.org)
Paolo Costabel (paoloc@pacbell.net)
Thomas Mayer (tommybear@internode.on.net)
Yotam Barnoy (yotambarnoy@gmail.com)
-
diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp
index e945dca4a8..cdb130e2a0 100644
--- a/backends/platform/psp/display_manager.cpp
+++ b/backends/platform/psp/display_manager.cpp
@@ -62,7 +62,9 @@ const OSystem::GraphicsMode DisplayManager::_supportedModes[] = {
// Class VramAllocator -----------------------------------
+namespace Common {
DECLARE_SINGLETON(VramAllocator);
+}
//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */
//#define __PSP_DEBUG_PRINT__
@@ -477,4 +479,3 @@ Common::List<Graphics::PixelFormat> DisplayManager::getSupportedPixelFormats() c
return list;
}
-
diff --git a/backends/platform/psp/dummy.cpp b/backends/platform/psp/dummy.cpp
index 748ac8cbf3..998ecf1488 100644
--- a/backends/platform/psp/dummy.cpp
+++ b/backends/platform/psp/dummy.cpp
@@ -53,4 +53,4 @@
getsockopt(0, 0, 0, NULL, NULL);
return i;
-} \ No newline at end of file
+}
diff --git a/backends/platform/psp/image_viewer.cpp b/backends/platform/psp/image_viewer.cpp
index 1ed7698bc8..98205ddee9 100644
--- a/backends/platform/psp/image_viewer.cpp
+++ b/backends/platform/psp/image_viewer.cpp
@@ -69,7 +69,7 @@ bool ImageViewer::load(int imageNum) {
assert(_renderer);
// Load a PNG into our buffer and palette. Size it by the actual size of the image
- PngLoader image(file, *_buffer, *_palette, Buffer::kSizeBySourceSize);
+ PngLoader image(*file, *_buffer, *_palette, Buffer::kSizeBySourceSize);
PngLoader::Status status = image.allocate(); // allocate the buffers for the file
@@ -321,4 +321,4 @@ void ImageViewer::handleEvent(uint32 event) {
PSP_ERROR("Unknown event %d\n", event);
break;
}
-} \ No newline at end of file
+}
diff --git a/backends/platform/psp/image_viewer.h b/backends/platform/psp/image_viewer.h
index ad188536a3..91a70b85cc 100644
--- a/backends/platform/psp/image_viewer.h
+++ b/backends/platform/psp/image_viewer.h
@@ -99,4 +99,4 @@ public:
void setDisplayManager(DisplayManager *displayManager) { _displayManager = displayManager; }
};
-#endif /* PSP_IMAGE_VIEWER_H */ \ No newline at end of file
+#endif /* PSP_IMAGE_VIEWER_H */
diff --git a/backends/platform/psp/input.cpp b/backends/platform/psp/input.cpp
index a9ad441b4d..5e20fb1e43 100644
--- a/backends/platform/psp/input.cpp
+++ b/backends/platform/psp/input.cpp
@@ -566,5 +566,3 @@ void InputHandler::setButtonsForImageViewer() {
_nub.getPad().getButton(ButtonPad::BTN_RIGHT, UNSHIFTED).setPspEvent(PSP_EVENT_IMAGE_VIEWER, ImageViewer::EVENT_MOVE_RIGHT,
PSP_EVENT_IMAGE_VIEWER, ImageViewer::EVENT_MOVE_STOP);
}
-
-
diff --git a/backends/platform/psp/memory.h b/backends/platform/psp/memory.h
index b5e29af634..5b728460fc 100644
--- a/backends/platform/psp/memory.h
+++ b/backends/platform/psp/memory.h
@@ -122,5 +122,3 @@ public:
};
#endif /* PSP_INCLUDE_SWAP */
-
-
diff --git a/backends/platform/psp/mp3.cpp b/backends/platform/psp/mp3.cpp
index 266e31e445..3dbf31112a 100644
--- a/backends/platform/psp/mp3.cpp
+++ b/backends/platform/psp/mp3.cpp
@@ -179,8 +179,7 @@ bool Mp3PspStream::loadStartAudioModule(const char *modname, int partition){
// TODO: make parallel function for unloading the 1.50 modules
Mp3PspStream::Mp3PspStream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) :
- _inStream(inStream),
- _disposeAfterUse(dispose),
+ _inStream(inStream, dispose),
_pcmLength(0),
_posInFrame(0),
_state(MP3_STATE_INIT),
@@ -274,9 +273,6 @@ Mp3PspStream::~Mp3PspStream() {
deinitStream();
releaseStreamME(); // free the memory used for this stream
-
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _inStream;
}
void Mp3PspStream::deinitStream() {
diff --git a/backends/platform/psp/mp3.h b/backends/platform/psp/mp3.h
index 8b01fe4872..f7bfdda254 100644
--- a/backends/platform/psp/mp3.h
+++ b/backends/platform/psp/mp3.h
@@ -23,6 +23,7 @@
#ifndef SOUND_MP3_PSP_H
#define SOUND_MP3_PSP_H
+#include "common/ptr.h"
#include "common/types.h"
#include "common/scummsys.h"
@@ -48,8 +49,7 @@ protected:
byte _codecInBuffer[3072] __attribute__((aligned(64))); // the codec always needs alignment
unsigned long _codecParams[65]__attribute__((aligned(64))); // TODO: change to struct
- Common::SeekableReadStream *_inStream;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _inStream;
uint32 _pcmLength; // how many pcm samples we have for this type of file (x2 this for stereo)
diff --git a/backends/platform/psp/png_loader.cpp b/backends/platform/psp/png_loader.cpp
index 16377539c8..4de13d1e73 100644
--- a/backends/platform/psp/png_loader.cpp
+++ b/backends/platform/psp/png_loader.cpp
@@ -78,7 +78,7 @@ PngLoader::Status PngLoader::allocate() {
bool PngLoader::load() {
DEBUG_ENTER_FUNC();
// Try to load the image
- _file->seek(0); // Go back to start
+ _file.seek(0); // Go back to start
if (!loadImageIntoBuffer()) {
PSP_DEBUG_PRINT("failed to load image\n");
@@ -99,11 +99,9 @@ void PngLoader::warningFn(png_structp png_ptr, png_const_charp warning_msg) {
// Read function for png library to be able to read from our SeekableReadStream
//
void PngLoader::libReadFunc(png_structp pngPtr, png_bytep data, png_size_t length) {
- Common::SeekableReadStream *file;
+ Common::SeekableReadStream &file = *(Common::SeekableReadStream *)pngPtr->io_ptr;
- file = (Common::SeekableReadStream *)pngPtr->io_ptr;
-
- file->read(data, length);
+ file.read(data, length);
}
bool PngLoader::basicImageLoad() {
@@ -120,7 +118,7 @@ bool PngLoader::basicImageLoad() {
return false;
}
// Set the png lib to use our read function
- png_set_read_fn(_pngPtr, (void *)_file, libReadFunc);
+ png_set_read_fn(_pngPtr, &_file, libReadFunc);
unsigned int sig_read = 0;
diff --git a/backends/platform/psp/png_loader.h b/backends/platform/psp/png_loader.h
index 0ff9d8a65d..48a3220d78 100644
--- a/backends/platform/psp/png_loader.h
+++ b/backends/platform/psp/png_loader.h
@@ -34,7 +34,7 @@ private:
static void warningFn(png_structp png_ptr, png_const_charp warning_msg);
static void libReadFunc(png_structp pngPtr, png_bytep data, png_size_t length);
- Common::SeekableReadStream *_file;
+ Common::SeekableReadStream &_file;
Buffer *_buffer;
Palette *_palette;
@@ -57,7 +57,7 @@ public:
BAD_FILE
};
- PngLoader(Common::SeekableReadStream *file, Buffer &buffer, Palette &palette,
+ PngLoader(Common::SeekableReadStream &file, Buffer &buffer, Palette &palette,
Buffer::HowToSize sizeBy = Buffer::kSizeByTextureSize) :
_file(file), _buffer(&buffer), _palette(&palette),
_width(0), _height(0), _paletteSize(0),
diff --git a/backends/platform/psp/portdefs.h b/backends/platform/psp/portdefs.h
index feb0c944ee..e8a28b31e2 100644
--- a/backends/platform/psp/portdefs.h
+++ b/backends/platform/psp/portdefs.h
@@ -53,5 +53,3 @@
//#define printf pspDebugScreenPrintf
#endif /* PORTDEFS_H */
-
-
diff --git a/backends/platform/psp/powerman.cpp b/backends/platform/psp/powerman.cpp
index fe9dcfa673..b72d05809d 100644
--- a/backends/platform/psp/powerman.cpp
+++ b/backends/platform/psp/powerman.cpp
@@ -30,7 +30,9 @@
//#define __PSP_DEBUG_PRINT__
#include "backends/platform/psp/trace.h"
+namespace Common {
DECLARE_SINGLETON(PowerManager);
+}
// Function to debug the Power Manager (we have no output to screen)
inline void PowerManager::debugPM() {
diff --git a/backends/platform/psp/pspkeyboard.cpp b/backends/platform/psp/pspkeyboard.cpp
index 43c4cada15..66efe9145d 100644
--- a/backends/platform/psp/pspkeyboard.cpp
+++ b/backends/platform/psp/pspkeyboard.cpp
@@ -298,7 +298,7 @@ bool PSPKeyboard::load() {
goto ERROR;
}
- PngLoader image(file, _buffers[i], _palettes[i]);
+ PngLoader image(*file, _buffers[i], _palettes[i]);
if (image.allocate() != PngLoader::OK) {
PSP_ERROR("Failed to allocate memory for keyboard image %s\n", _guiStrings[i]);
diff --git a/backends/platform/psp/rtc.cpp b/backends/platform/psp/rtc.cpp
index 3d6d4295a6..cbbb7d3f80 100644
--- a/backends/platform/psp/rtc.cpp
+++ b/backends/platform/psp/rtc.cpp
@@ -34,7 +34,9 @@
// Class PspRtc ---------------------------------------------------------------
+namespace Common {
DECLARE_SINGLETON(PspRtc);
+}
void PspRtc::init() { // init our starting ticks
uint32 ticks[2];
@@ -81,4 +83,3 @@ uint32 PspRtc::getMicros() {
return ticks[0];
}
-
diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp
index 5f38a54ab7..57370f7685 100644
--- a/backends/platform/psp/thread.cpp
+++ b/backends/platform/psp/thread.cpp
@@ -228,4 +228,3 @@ void PspCondition::wait(PspMutex &externalMutex) {
externalMutex.lock(); // must lock external mutex here for continuation
}
-
diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h
index a2f3b5eda2..ca94b8c82c 100644
--- a/backends/platform/psp/thread.h
+++ b/backends/platform/psp/thread.h
@@ -105,5 +105,3 @@ enum StackSizes {
};
#endif /* PSP_THREADS_H */
-
-
diff --git a/backends/platform/psp/trace.cpp b/backends/platform/psp/trace.cpp
index b799b4e870..008b508b7e 100644
--- a/backends/platform/psp/trace.cpp
+++ b/backends/platform/psp/trace.cpp
@@ -148,4 +148,3 @@ void mipsBacktrace(uint32 levels, void **addresses) {
}
}
}
-
diff --git a/backends/platform/sdl/macosx/appmenu_osx.h b/backends/platform/sdl/macosx/appmenu_osx.h
new file mode 100755
index 0000000000..005414b789
--- /dev/null
+++ b/backends/platform/sdl/macosx/appmenu_osx.h
@@ -0,0 +1,32 @@
+/* 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 APPMENU_OSX_H
+#define APPMENU_OSX_H
+
+#if defined(MACOSX)
+
+void replaceApplicationMenuItems();
+
+#endif // MACOSX
+
+#endif
diff --git a/backends/platform/sdl/macosx/appmenu_osx.mm b/backends/platform/sdl/macosx/appmenu_osx.mm
new file mode 100755
index 0000000000..bb089a6b61
--- /dev/null
+++ b/backends/platform/sdl/macosx/appmenu_osx.mm
@@ -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.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+#include "backends/platform/sdl/macosx/appmenu_osx.h"
+#include "common/translation.h"
+
+#include <Cocoa/Cocoa.h>
+
+// Apple removed setAppleMenu from the header files in 10.4,
+// but as the method still exists we declare it ourselves here.
+// Yes, this works :)
+@interface NSApplication(MissingFunction)
+- (void)setAppleMenu:(NSMenu *)menu;
+@end
+
+void replaceApplicationMenuItems() {
+
+ // Code mainly copied and adapted from SDLmain.m
+ NSMenu *appleMenu;
+ NSMenu *windowMenu;
+ NSMenuItem *menuItem;
+
+ // For some reason [[NSApp mainMenu] removeAllItems] doesn't work and crashes, so we need
+ // to remove the SDL generated menus one by one
+ [[NSApp mainMenu] removeItemAtIndex:0]; // Remove application menu
+ [[NSApp mainMenu] removeItemAtIndex:0]; // Remove "Windows" menu
+
+ // Create new application menu
+ appleMenu = [[NSMenu alloc] initWithTitle:@""];
+
+ // Get current encoding
+#ifdef USE_TRANSLATION
+ NSStringEncoding stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)[NSString stringWithCString:(TransMan.getCurrentCharset()).c_str() encoding:NSASCIIStringEncoding]));
+#else
+ NSStringEncoding stringEncoding = NSASCIIStringEncoding;
+#endif
+
+ // Add "About ScummVM" menu item
+ [appleMenu addItemWithTitle:[NSString stringWithCString:_("About ScummVM") encoding:stringEncoding] action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
+
+ // Add separator
+ [appleMenu addItem:[NSMenuItem separatorItem]];
+
+ // Add "Hide ScummVM" menu item
+ [appleMenu addItemWithTitle:[NSString stringWithCString:_("Hide ScummVM") encoding:stringEncoding] action:@selector(hide:) keyEquivalent:@"h"];
+
+ // Add "Hide Others" menu item
+ menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:[NSString stringWithCString:_("Hide Others") encoding:stringEncoding] action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
+ [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
+
+ // Add "Show All" menu item
+ [appleMenu addItemWithTitle:[NSString stringWithCString:_("Show All") encoding:stringEncoding] action:@selector(unhideAllApplications:) keyEquivalent:@""];
+
+ // Add separator
+ [appleMenu addItem:[NSMenuItem separatorItem]];
+
+ // Add "Quit ScummVM" menu item
+ [appleMenu addItemWithTitle:[NSString stringWithCString:_("Quit ScummVM") encoding:stringEncoding] action:@selector(terminate:) keyEquivalent:@"q"];
+
+ // Put application menu into the menubar
+ menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
+ [menuItem setSubmenu:appleMenu];
+ [[NSApp mainMenu] addItem:menuItem];
+
+ // Tell the application object that this is now the application menu
+ [NSApp setAppleMenu:appleMenu];
+
+
+ // Create new "Window" menu
+ windowMenu = [[NSMenu alloc] initWithTitle:[NSString stringWithCString:_("Window") encoding:stringEncoding]];
+
+ // Add "Minimize" menu item
+ menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithCString:_("Minimize") encoding:stringEncoding] action:@selector(performMiniaturize:) keyEquivalent:@"m"];
+ [windowMenu addItem:menuItem];
+
+ // Put menu into the menubar
+ menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithCString:_("Window") encoding:stringEncoding] action:nil keyEquivalent:@""];
+ [menuItem setSubmenu:windowMenu];
+ [[NSApp mainMenu] addItem:menuItem];
+
+ // Tell the application object that this is now the window menu.
+ [NSApp setWindowsMenu:windowMenu];
+
+ // Finally give up our references to the objects
+ [appleMenu release];
+ [windowMenu release];
+ [menuItem release];
+}
diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp
index 817f61e864..639bd980f6 100644
--- a/backends/platform/sdl/macosx/macosx.cpp
+++ b/backends/platform/sdl/macosx/macosx.cpp
@@ -29,9 +29,13 @@
#include "backends/platform/sdl/macosx/macosx.h"
#include "backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h"
+#include "backends/platform/sdl/macosx/appmenu_osx.h"
+#include "backends/updates/macosx/macosx-updates.h"
#include "common/archive.h"
+#include "common/config-manager.h"
#include "common/fs.h"
+#include "common/translation.h"
#include "ApplicationServices/ApplicationServices.h" // for LSOpenFSRef
#include "CoreFoundation/CoreFoundation.h" // for CF* stuff
@@ -51,6 +55,20 @@ void OSystem_MacOSX::initBackend() {
_mixerManager->init();
}
+#ifdef USE_TRANSLATION
+ // We need to initialize the translataion manager here for the following
+ // call to replaceApplicationMenuItems() work correctly
+ TransMan.setLanguage(ConfMan.get("gui_language").c_str());
+#endif // USE_TRANSLATION
+
+ // Replace the SDL generated menu items with our own translated ones on Mac OS X
+ replaceApplicationMenuItems();
+
+#ifdef USE_SPARKLE
+ // Initialize updates manager
+ _updateManager = new MacOSXUpdateManager();
+#endif
+
// Invoke parent implementation of this method
OSystem_POSIX::initBackend();
}
@@ -100,4 +118,51 @@ bool OSystem_MacOSX::displayLogFile() {
return err != noErr;
}
+Common::String OSystem_MacOSX::getSystemLanguage() const {
+#if defined(USE_DETECTLANG) && defined(USE_TRANSLATION)
+ CFArrayRef availableLocalizations = CFBundleCopyBundleLocalizations(CFBundleGetMainBundle());
+ if (availableLocalizations) {
+ CFArrayRef preferredLocalizations = CFBundleCopyPreferredLocalizationsFromArray(availableLocalizations);
+ CFRelease(availableLocalizations);
+ if (preferredLocalizations) {
+ CFIndex localizationsSize = CFArrayGetCount(preferredLocalizations);
+ // Since we have a list of sorted preferred localization, I would like here to
+ // check that they are supported by the TranslationManager and take the first
+ // one that is supported. The listed localizations are taken from the Bundle
+ // plist file, so they should all be supported, unless the plist file is not
+ // synchronized with the translations.dat file. So this is not really a big
+ // issue. And because getSystemLanguage() is called from the constructor of
+ // TranslationManager (therefore before the instance pointer is set), calling
+ // TransMan here results in an infinite loop and creation of a lot of TransMan
+ // instances.
+ /*
+ for (CFIndex i = 0 ; i < localizationsSize ; ++i) {
+ CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(preferredLocalizations, i);
+ char buffer[10];
+ CFStringGetCString(language, buffer, 50, kCFStringEncodingASCII);
+ int32 languageId = TransMan.findMatchingLanguage(buffer);
+ if (languageId != -1) {
+ CFRelease(preferredLocalizations);
+ return TransMan.getLangById(languageId);
+ }
+ }
+ */
+ if (localizationsSize > 0) {
+ CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(preferredLocalizations, 0);
+ char buffer[10];
+ CFStringGetCString(language, buffer, 50, kCFStringEncodingASCII);
+ CFRelease(preferredLocalizations);
+ return buffer;
+ }
+ CFRelease(preferredLocalizations);
+ }
+
+ }
+ // Falback to POSIX implementation
+ return OSystem_POSIX::getSystemLanguage();
+#else // USE_DETECTLANG
+ return OSystem_POSIX::getSystemLanguage();
+#endif // USE_DETECTLANG
+}
+
#endif
diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h
index 86c70297ec..4837e643b3 100644
--- a/backends/platform/sdl/macosx/macosx.h
+++ b/backends/platform/sdl/macosx/macosx.h
@@ -32,6 +32,8 @@ public:
virtual bool hasFeature(Feature f);
virtual bool displayLogFile();
+
+ virtual Common::String getSystemLanguage() const;
virtual void initBackend();
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp
index 1992bdd3f2..040028079d 100644
--- a/backends/platform/sdl/main.cpp
+++ b/backends/platform/sdl/main.cpp
@@ -26,7 +26,7 @@
// of this file. The following "#if" ensures that.
#if !defined(POSIX) && \
!defined(WIN32) && \
- !defined(__MAEMO__) && \
+ !defined(MAEMO) && \
!defined(__SYMBIAN32__) && \
!defined(_WIN32_WCE) && \
!defined(__amigaos4__) && \
@@ -34,6 +34,7 @@
!defined(CAANOO) && \
!defined(LINUXMOTO) && \
!defined(SAMSUNGTV) && \
+ !defined(PLAYSTATION3) && \
!defined(OPENPANDORA)
#include "backends/platform/sdl/sdl.h"
diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk
index efc5168d5b..f1afe37349 100644
--- a/backends/platform/sdl/module.mk
+++ b/backends/platform/sdl/module.mk
@@ -14,7 +14,8 @@ endif
ifdef MACOSX
MODULE_OBJS += \
macosx/macosx-main.o \
- macosx/macosx.o
+ macosx/macosx.o \
+ macosx/appmenu_osx.o
endif
ifdef WIN32
@@ -29,6 +30,12 @@ MODULE_OBJS += \
amigaos/amigaos.o
endif
+ifdef PLAYSTATION3
+MODULE_OBJS += \
+ ps3/ps3-main.o \
+ ps3/ps3.o
+endif
+
# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS.
MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS))
OBJS := $(MODULE_OBJS) $(OBJS)
diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp
index f78e001398..5f0914e04f 100644
--- a/backends/platform/sdl/posix/posix-main.cpp
+++ b/backends/platform/sdl/posix/posix-main.cpp
@@ -22,7 +22,7 @@
#include "common/scummsys.h"
-#if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA)
+#if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(MAEMO) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) && !defined(PLAYSTATION3)
#include "backends/platform/sdl/posix/posix.h"
#include "backends/plugins/sdl/sdl-provider.h"
diff --git a/backends/platform/sdl/ps3/ps3-main.cpp b/backends/platform/sdl/ps3/ps3-main.cpp
new file mode 100644
index 0000000000..ba548a3749
--- /dev/null
+++ b/backends/platform/sdl/ps3/ps3-main.cpp
@@ -0,0 +1,49 @@
+/* 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.
+ *
+ */
+
+#include "common/scummsys.h"
+
+#include "backends/platform/sdl/ps3/ps3.h"
+#include "backends/plugins/sdl/sdl-provider.h"
+#include "base/main.h"
+
+int main(int argc, char *argv[]) {
+
+ // Create our OSystem instance
+ g_system = new OSystem_PS3();
+ assert(g_system);
+
+ // Pre initialize the backend
+ ((OSystem_PS3 *)g_system)->init();
+
+#ifdef DYNAMIC_MODULES
+ PluginManager::instance().addPluginProvider(new SDLPluginProvider());
+#endif
+
+ // Invoke the actual ScummVM main entry point:
+ int res = scummvm_main(argc, argv);
+
+ // Free OSystem
+ delete (OSystem_PS3 *)g_system;
+
+ return res;
+}
diff --git a/backends/platform/sdl/ps3/ps3.cpp b/backends/platform/sdl/ps3/ps3.cpp
new file mode 100644
index 0000000000..33586ce693
--- /dev/null
+++ b/backends/platform/sdl/ps3/ps3.cpp
@@ -0,0 +1,94 @@
+/* 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.
+ *
+ */
+
+#define FORBIDDEN_SYMBOL_EXCEPTION_mkdir
+#define FORBIDDEN_SYMBOL_EXCEPTION_time_h // sys/stat.h includes sys/time.h
+#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "backends/platform/sdl/ps3/ps3.h"
+#include "backends/graphics/surfacesdl/surfacesdl-graphics.h"
+#include "backends/saves/default/default-saves.h"
+#include "backends/fs/ps3/ps3-fs-factory.h"
+#include "backends/events/ps3sdl/ps3sdl-events.h"
+#include "backends/mixer/sdl13/sdl13-mixer.h"
+
+#include <dirent.h>
+#include <sys/stat.h>
+
+int access(const char *pathname, int mode) {
+ struct stat sb;
+
+ if (stat(pathname, &sb) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+OSystem_PS3::OSystem_PS3(Common::String baseConfigName)
+ : _baseConfigName(baseConfigName) {
+}
+
+void OSystem_PS3::init() {
+ // Initialze File System Factory
+ _fsFactory = new PS3FilesystemFactory();
+
+ // Invoke parent implementation of this method
+ OSystem_SDL::init();
+}
+
+void OSystem_PS3::initBackend() {
+ ConfMan.set("joystick_num", 0);
+ ConfMan.set("vkeybdpath", PREFIX "/data");
+ ConfMan.registerDefault("fullscreen", true);
+ ConfMan.registerDefault("aspect_ratio", true);
+
+ // Create the savefile manager
+ if (_savefileManager == 0)
+ _savefileManager = new DefaultSaveFileManager(PREFIX "/saves");
+
+ // Create the mixer manager
+ if (_mixer == 0) {
+ _mixerManager = new Sdl13MixerManager();
+
+ // Setup and start mixer
+ _mixerManager->init();
+ }
+
+ // Event source
+ if (_eventSource == 0)
+ _eventSource = new PS3SdlEventSource();
+
+ // Invoke parent implementation of this method
+ OSystem_SDL::initBackend();
+}
+
+Common::String OSystem_PS3::getDefaultConfigFileName() {
+ return PREFIX "/" + _baseConfigName;
+}
+
+Common::WriteStream *OSystem_PS3::createLogFile() {
+ Common::FSNode file(PREFIX "/scummvm.log");
+ return file.createWriteStream();
+}
diff --git a/backends/platform/sdl/ps3/ps3.h b/backends/platform/sdl/ps3/ps3.h
new file mode 100644
index 0000000000..daed7599a9
--- /dev/null
+++ b/backends/platform/sdl/ps3/ps3.h
@@ -0,0 +1,47 @@
+/* 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 PLATFORM_SDL_PS3_H
+#define PLATFORM_SDL_PS3_H
+
+#include "backends/platform/sdl/sdl.h"
+
+class OSystem_PS3 : public OSystem_SDL {
+public:
+ // Let the subclasses be able to change _baseConfigName in the constructor
+ OSystem_PS3(Common::String baseConfigName = "scummvm.ini");
+ virtual ~OSystem_PS3() {}
+
+ virtual void init();
+ virtual void initBackend();
+
+protected:
+ // Base string for creating the default path and filename
+ // for the configuration file
+ Common::String _baseConfigName;
+
+ virtual Common::String getDefaultConfigFileName();
+
+ virtual Common::WriteStream *createLogFile();
+};
+
+#endif
diff --git a/backends/platform/sdl/sdl-sys.h b/backends/platform/sdl/sdl-sys.h
index 63bfc58617..ca3c586e03 100644
--- a/backends/platform/sdl/sdl-sys.h
+++ b/backends/platform/sdl/sdl-sys.h
@@ -27,7 +27,7 @@
// fashion, even on the Symbian port.
// Moreover, it contains a workaround for the fact that SDL_rwops.h uses
// a FILE pointer in one place, which conflicts with common/forbidden.h.
-
+// The SDL 1.3 headers also include strings.h
#include "common/scummsys.h"
@@ -39,6 +39,16 @@ typedef struct { int FAKE; } FAKE_FILE;
#define FILE FAKE_FILE
#endif
+#if !defined(FORBIDDEN_SYMBOL_ALLOW_ALL) && !defined(FORBIDDEN_SYMBOL_EXCEPTION_strcasecmp)
+#undef strcasecmp
+#define strcasecmp FAKE_strcasecmp
+#endif
+
+#if !defined(FORBIDDEN_SYMBOL_ALLOW_ALL) && !defined(FORBIDDEN_SYMBOL_EXCEPTION_strncasecmp)
+#undef strncasecmp
+#define strncasecmp FAKE_strncasecmp
+#endif
+
#if defined(__SYMBIAN32__)
#include <esdl\SDL.h>
#else
@@ -51,4 +61,15 @@ typedef struct { int FAKE; } FAKE_FILE;
#define FILE FORBIDDEN_SYMBOL_REPLACEMENT
#endif
+#if !defined(FORBIDDEN_SYMBOL_ALLOW_ALL) && !defined(FORBIDDEN_SYMBOL_EXCEPTION_strcasecmp)
+#undef strcasecmp
+#define strcasecmp FORBIDDEN_SYMBOL_REPLACEMENT
+#endif
+
+#if !defined(FORBIDDEN_SYMBOL_ALLOW_ALL) && !defined(FORBIDDEN_SYMBOL_EXCEPTION_strncasecmp)
+#undef strncasecmp
+#define strncasecmp FORBIDDEN_SYMBOL_REPLACEMENT
+#endif
+
+
#endif
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index 3f85b1a564..8dff5cec05 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -35,13 +35,21 @@
#include "common/textconsole.h"
#include "backends/saves/default/default-saves.h"
+
+// Audio CD support was removed with SDL 1.3
+#if SDL_VERSION_ATLEAST(1, 3, 0)
+#include "backends/audiocd/default/default-audiocd.h"
+#else
#include "backends/audiocd/sdl/sdl-audiocd.h"
+#endif
+
#include "backends/events/sdl/sdl-events.h"
#include "backends/mutex/sdl/sdl-mutex.h"
#include "backends/timer/sdl/sdl-timer.h"
#include "backends/graphics/surfacesdl/surfacesdl-graphics.h"
#ifdef USE_OPENGL
#include "backends/graphics/openglsdl/openglsdl-graphics.h"
+#include "graphics/cursorman.h"
#endif
#include "icons/scummvm.xpm"
@@ -167,7 +175,7 @@ void OSystem_SDL::initBackend() {
// If the gfx_mode is from OpenGL, create the OpenGL graphics manager
if (use_opengl) {
- _graphicsManager = new OpenGLSdlGraphicsManager();
+ _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource);
graphicsManagerType = 1;
}
}
@@ -188,8 +196,15 @@ void OSystem_SDL::initBackend() {
_mixerManager->init();
}
- if (_audiocdManager == 0)
+ if (_audiocdManager == 0) {
+ // Audio CD support was removed with SDL 1.3
+#if SDL_VERSION_ATLEAST(1, 3, 0)
+ _audiocdManager = new DefaultAudioCDManager();
+#else
_audiocdManager = new SdlAudioCDManager();
+#endif
+
+ }
// Setup a custom program icon.
setupIcon();
@@ -413,6 +428,7 @@ void OSystem_SDL::setupIcon() {
for (i = 0; i < ncols; i++) {
unsigned char code;
char color[32];
+ memset(color, 0, sizeof(color));
unsigned int col;
if (sscanf(scummvm_icon[1 + i], "%c c %s", &code, color) != 2) {
warning("Wrong format of scummvm_icon[%d] (%s)", 1 + i, scummvm_icon[1 + i]);
@@ -457,7 +473,8 @@ uint32 OSystem_SDL::getMillis() {
}
void OSystem_SDL::delayMillis(uint msecs) {
- SDL_Delay(msecs);
+ if (!g_eventRec.processDelayMillis(msecs))
+ SDL_Delay(msecs);
}
void OSystem_SDL::getTimeAndDate(TimeDate &td) const {
@@ -508,6 +525,22 @@ bool OSystem_SDL::setGraphicsMode(int mode) {
i = _sdlModesCount;
}
+ // Very hacky way to set up the old graphics manager state, in case we
+ // switch from SDL->OpenGL or OpenGL->SDL.
+ //
+ // This is a probably temporary workaround to fix bugs like #3368143
+ // "SDL/OpenGL: Crash when switching renderer backend".
+ const int screenWidth = _graphicsManager->getWidth();
+ const int screenHeight = _graphicsManager->getHeight();
+ const bool arState = _graphicsManager->getFeatureState(kFeatureAspectRatioCorrection);
+ const bool fullscreen = _graphicsManager->getFeatureState(kFeatureFullscreenMode);
+ const bool cursorPalette = _graphicsManager->getFeatureState(kFeatureCursorPalette);
+#ifdef USE_RGB_COLOR
+ const Graphics::PixelFormat pixelFormat = _graphicsManager->getScreenFormat();
+#endif
+
+ bool switchedManager = false;
+
// Loop through modes
while (srcMode->name) {
if (i == mode) {
@@ -519,16 +552,55 @@ bool OSystem_SDL::setGraphicsMode(int mode) {
_graphicsManager = new SurfaceSdlGraphicsManager(_eventSource);
((SurfaceSdlGraphicsManager *)_graphicsManager)->initEventObserver();
_graphicsManager->beginGFXTransaction();
+
+ switchedManager = true;
} else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) {
debug(1, "switching to OpenGL graphics");
delete _graphicsManager;
- _graphicsManager = new OpenGLSdlGraphicsManager();
+ _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource);
((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver();
_graphicsManager->beginGFXTransaction();
+
+ switchedManager = true;
}
_graphicsMode = mode;
- return _graphicsManager->setGraphicsMode(srcMode->id);
+
+ if (switchedManager) {
+#ifdef USE_RGB_COLOR
+ _graphicsManager->initSize(screenWidth, screenHeight, &pixelFormat);
+#else
+ _graphicsManager->initSize(screenWidth, screenHeight, 0);
+#endif
+ _graphicsManager->setFeatureState(kFeatureAspectRatioCorrection, arState);
+ _graphicsManager->setFeatureState(kFeatureFullscreenMode, fullscreen);
+ _graphicsManager->setFeatureState(kFeatureCursorPalette, cursorPalette);
+
+ // Worst part about this right now, tell the cursor manager to
+ // resetup the cursor + cursor palette if necessarily
+
+ // First we need to try to setup the old state on the new manager...
+ if (_graphicsManager->endGFXTransaction() != kTransactionSuccess) {
+ // Oh my god if this failed the client code might just explode.
+ return false;
+ }
+
+ // Next setup the cursor again
+ CursorMan.pushCursor(0, 0, 0, 0, 0, 0);
+ CursorMan.popCursor();
+
+ // Next setup cursor palette if needed
+ if (cursorPalette) {
+ CursorMan.pushCursorPalette(0, 0, 0);
+ CursorMan.popCursorPalette();
+ }
+
+ _graphicsManager->beginGFXTransaction();
+ // Oh my god if this failed the client code might just explode.
+ return _graphicsManager->setGraphicsMode(srcMode->id);
+ } else {
+ return _graphicsManager->setGraphicsMode(srcMode->id);
+ }
}
i++;
diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h
index 395b2b3aac..22d79dbfe7 100644
--- a/backends/platform/sdl/sdl.h
+++ b/backends/platform/sdl/sdl.h
@@ -74,12 +74,6 @@ public:
virtual void getTimeAndDate(TimeDate &td) const;
virtual Audio::Mixer *getMixer();
- // HACK: Special SDL events types
- enum SdlEvent {
- kSdlEventExpose = 100,
- kSdlEventResize = 101
- };
-
protected:
bool _inited;
bool _initedSDL;
diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp
index 5b02a20abc..a2c8e43424 100644
--- a/backends/platform/sdl/win32/win32.cpp
+++ b/backends/platform/sdl/win32/win32.cpp
@@ -23,10 +23,6 @@
// Disable symbol overrides so that we can use system headers.
#define FORBIDDEN_SYMBOL_ALLOW_ALL
-#include "common/scummsys.h"
-#include "common/error.h"
-#include "common/textconsole.h"
-
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
@@ -34,6 +30,13 @@
#undef ARRAYSIZE // winnt.h defines ARRAYSIZE, but we want our own one...
#include <shellapi.h>
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "common/error.h"
+#include "common/textconsole.h"
+
+#include <SDL_syswm.h> // For setting the icon
+
#include "backends/platform/sdl/win32/win32.h"
#include "backends/fs/windows/windows-fs-factory.h"
#include "backends/taskbar/win32/win32-taskbar.h"
@@ -42,46 +45,7 @@
#define DEFAULT_CONFIG_FILE "scummvm.ini"
-//#define HIDE_CONSOLE
-
-#ifdef HIDE_CONSOLE
-struct SdlConsoleHidingWin32 {
- DWORD myPid;
- DWORD myTid;
- HWND consoleHandle;
-};
-
-// console hiding for win32
-static BOOL CALLBACK initBackendFindConsoleWin32Proc(HWND hWnd, LPARAM lParam) {
- DWORD pid, tid;
- SdlConsoleHidingWin32 *variables = (SdlConsoleHidingWin32 *)lParam;
- tid = GetWindowThreadProcessId(hWnd, &pid);
- if ((tid == variables->myTid) && (pid == variables->myPid)) {
- variables->consoleHandle = hWnd;
- return FALSE;
- }
- return TRUE;
-}
-
-#endif
-
void OSystem_Win32::init() {
-#ifdef HIDE_CONSOLE
- // console hiding for win32
- SdlConsoleHidingWin32 consoleHidingWin32;
- consoleHidingWin32.consoleHandle = 0;
- consoleHidingWin32.myPid = GetCurrentProcessId();
- consoleHidingWin32.myTid = GetCurrentThreadId();
- EnumWindows (initBackendFindConsoleWin32Proc, (LPARAM)&consoleHidingWin32);
-
- if (!ConfMan.getBool("show_console")) {
- if (consoleHidingWin32.consoleHandle) {
- // We won't find a window with our TID/PID in case we were started from command-line
- ShowWindow(consoleHidingWin32.consoleHandle, SW_HIDE);
- }
- }
-#endif
-
// Initialize File System Factory
_fsFactory = new WindowsFilesystemFactory();
@@ -94,6 +58,26 @@ void OSystem_Win32::init() {
OSystem_SDL::init();
}
+void OSystem_Win32::initBackend() {
+ // Console window is enabled by default on Windows
+ ConfMan.registerDefault("console", true);
+
+ // Enable or disable the window console window
+ if (ConfMan.getBool("console")) {
+ if (AllocConsole()) {
+ freopen("CONIN$","r",stdin);
+ freopen("CONOUT$","w",stdout);
+ freopen("CONOUT$","w",stderr);
+ }
+ SetConsoleTitle("ScummVM Status Window");
+ } else {
+ FreeConsole();
+ }
+
+ // Invoke parent implementation of this method
+ OSystem_SDL::initBackend();
+}
+
bool OSystem_Win32::hasFeature(Feature f) {
if (f == kFeatureDisplayLogFile)
@@ -137,6 +121,28 @@ bool OSystem_Win32::displayLogFile() {
return false;
}
+void OSystem_Win32::setupIcon() {
+ HMODULE handle = GetModuleHandle(NULL);
+ HICON ico = LoadIcon(handle, MAKEINTRESOURCE(1001 /* IDI_ICON */));
+ if (ico) {
+ SDL_SysWMinfo wminfo;
+ SDL_VERSION(&wminfo.version);
+ if (SDL_GetWMInfo(&wminfo)) {
+ // Replace the handle to the icon associated with the window class by our custom icon
+ SetClassLongPtr(wminfo.window, GCLP_HICON, (ULONG_PTR)ico);
+
+ // Since there wasn't any default icon, we can't use the return value from SetClassLong
+ // to check for errors (it would be 0 in both cases: error or no previous value for the
+ // icon handle). Instead we check for the last-error code value.
+ if (GetLastError() == ERROR_SUCCESS)
+ return;
+ }
+ }
+
+ // If no icon has been set, fallback to default path
+ OSystem_SDL::setupIcon();
+}
+
Common::String OSystem_Win32::getDefaultConfigFileName() {
char configFile[MAXPATHLEN];
@@ -155,18 +161,31 @@ Common::String OSystem_Win32::getDefaultConfigFileName() {
error("Unable to access user profile directory");
strcat(configFile, "\\Application Data");
- CreateDirectory(configFile, NULL);
+
+ // If the directory already exists (as it should in most cases),
+ // we don't want to fail, but we need to stop on other errors (such as ERROR_PATH_NOT_FOUND)
+ if (!CreateDirectory(configFile, NULL)) {
+ if (GetLastError() != ERROR_ALREADY_EXISTS)
+ error("Cannot create Application data folder");
+ }
}
strcat(configFile, "\\ScummVM");
- CreateDirectory(configFile, NULL);
+ if (!CreateDirectory(configFile, NULL)) {
+ if (GetLastError() != ERROR_ALREADY_EXISTS)
+ error("Cannot create ScummVM application data folder");
+ }
+
strcat(configFile, "\\" DEFAULT_CONFIG_FILE);
FILE *tmp = NULL;
if ((tmp = fopen(configFile, "r")) == NULL) {
// Check windows directory
char oldConfigFile[MAXPATHLEN];
- GetWindowsDirectory(oldConfigFile, MAXPATHLEN);
+ uint ret = GetWindowsDirectory(oldConfigFile, MAXPATHLEN);
+ if (ret == 0 || ret > MAXPATHLEN)
+ error("Cannot retrieve the path of the Windows directory");
+
strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE);
if ((tmp = fopen(oldConfigFile, "r"))) {
strcpy(configFile, oldConfigFile);
@@ -178,7 +197,10 @@ Common::String OSystem_Win32::getDefaultConfigFileName() {
}
} else {
// Check windows directory
- GetWindowsDirectory(configFile, MAXPATHLEN);
+ uint ret = GetWindowsDirectory(configFile, MAXPATHLEN);
+ if (ret == 0 || ret > MAXPATHLEN)
+ error("Cannot retrieve the path of the Windows directory");
+
strcat(configFile, "\\" DEFAULT_CONFIG_FILE);
}
diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h
index ef7b6af3f1..b56997a63b 100644
--- a/backends/platform/sdl/win32/win32.h
+++ b/backends/platform/sdl/win32/win32.h
@@ -28,6 +28,7 @@
class OSystem_Win32 : public OSystem_SDL {
public:
virtual void init();
+ virtual void initBackend();
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
@@ -46,6 +47,7 @@ protected:
*/
Common::String _logFilePath;
+ virtual void setupIcon();
virtual Common::String getDefaultConfigFileName();
virtual Common::WriteStream *createLogFile();
};
diff --git a/backends/platform/symbian/.placeholder b/backends/platform/symbian/.placeholder
index dcf4d34a62..4af1e27cc7 100644
--- a/backends/platform/symbian/.placeholder
+++ b/backends/platform/symbian/.placeholder
@@ -1 +1 @@
->> SumthinWicked *grins* << \ No newline at end of file
+>> SumthinWicked *grins* <<
diff --git a/backends/platform/symbian/BuildPackageUpload_AllVersions.pl b/backends/platform/symbian/BuildPackageUpload_AllVersions.pl
index 3bdcede76a..3062068852 100644
--- a/backends/platform/symbian/BuildPackageUpload_AllVersions.pl
+++ b/backends/platform/symbian/BuildPackageUpload_AllVersions.pl
@@ -798,5 +798,3 @@ sub PrintMessage()
}
##################################################################################################################
-
-
diff --git a/backends/platform/symbian/README b/backends/platform/symbian/README
index 1f49c52f02..83e98a534a 100644
--- a/backends/platform/symbian/README
+++ b/backends/platform/symbian/README
@@ -24,6 +24,17 @@ About ScummVM
Jurgen and Lars have successfully transfered all needed changes into CVS/SVN, with additional helpful tools for Symbian OS
Release History:
+ Release version: 1.4.0
+ * Nothing significant in the Symbian port, except SDL improvements (new SDL version used)
+ * See main readme for general ScummVM improvements, major update
+
+ Release version: 1.3.1
+ * Nothing significant in the Symbian port, except SDL improvements (new SDL version used)
+ * See main readme for general ScummVM improvements, major update
+
+ Release version: 1.3.0
+ * Nothing significant in the Symbian port, except SDL improvements (new SDL version used)
+ * See main readme for general ScummVM improvements, major update
Release version: 1.2.1
* Symbian port now split in two parts, ScummVM 1 and ScummVM 2 to keep the exe size down.
ScummVM 1 contains the following engines:
@@ -177,4 +188,3 @@ Greetz & such
greetz,
SumthinWicked & Anotherguest
-
diff --git a/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg b/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg
index 469c815afb..0d22c9d016 100644
--- a/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg
+++ b/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg
@@ -61,4 +61,4 @@
""-"!:\system\apps\ScummVM\sdl.ini",FILENULL
; This install layout will let you upgrade to newer versions wihout loss of scummvm.ini.
-; It will remove the config file, std***.txt files & dirs on uninstall. \ No newline at end of file
+; It will remove the config file, std***.txt files & dirs on uninstall.
diff --git a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
index aa5e1f9b18..583d1a35e7 100644
--- a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
+++ b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
@@ -87,7 +87,7 @@ STATICLIBRARY esdl.lib
// *** Include paths
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\engines
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl ..\..\..\..\audio
SYSTEMINCLUDE \epoc32\include\ESDL
@@ -130,9 +130,13 @@ SOURCE gui\Dialog.cpp
// Common error
source common\error.cpp
+source common\quicktime.cpp
// Special for graphics
source graphics\iff.cpp
+source backends\graphics\symbiansdl\symbiansdl-graphics.cpp
+source backends\graphics\surfacesdl\surfacesdl-graphics.cpp
+source engines\obsolete.cpp
// *** Dynamic Libraries
LIBRARY cone.lib eikcore.lib
diff --git a/backends/platform/symbian/S60v3/ScummVM_Loc.rss b/backends/platform/symbian/S60v3/ScummVM_Loc.rss
index d98ef5ae71..7247ce1207 100644
--- a/backends/platform/symbian/S60v3/ScummVM_Loc.rss
+++ b/backends/platform/symbian/S60v3/ScummVM_Loc.rss
@@ -19,4 +19,3 @@ RESOURCE LOCALISABLE_APP_INFO
}
};
}
-
diff --git a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
index 09592ef3e3..5367bf0d1f 100644
--- a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
+++ b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
@@ -87,7 +87,7 @@ STATICLIBRARY esdl.lib
// *** Include paths
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\engines
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl ..\..\..\..\audio
SYSTEMINCLUDE \epoc32\include\ESDL
@@ -130,9 +130,13 @@ SOURCE gui\Dialog.cpp
// Common error
source common\error.cpp
+source common\quicktime.cpp
// Special for graphics
source graphics\iff.cpp
+source backends\graphics\symbiansdl\symbiansdl-graphics.cpp
+source backends\graphics\surfacesdl\surfacesdl-graphics.cpp
+source engines\obsolete.cpp
// *** Dynamic Libraries
LIBRARY cone.lib eikcore.lib
diff --git a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg
index 2cc49a2bc6..efa1a3c50f 100644
--- a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg
+++ b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg
@@ -33,7 +33,7 @@
:"ScummVM"
; UID is the app's UID
-#{"ScummVM S60v3"},(0xA0000657),1,30,0
+#{"ScummVM S60v3"},(0xA0000657),1,40,0
;Supports Series 60 v 3.0
[0x101F7961], 0, 0, 0, {"Series60ProductID"}
@@ -60,12 +60,15 @@
; Common datafiles needed for some games
"..\..\..\..\dists\engine-data\kyra.dat"-"c:\data\scummvm\kyra.dat"
"..\..\..\..\dists\engine-data\sky.cpt"-"c:\data\scummvm\sky.cpt"
+"..\..\..\..\dists\engine-data\hugo.dat"-"c:\data\scummvm\hugo.dat"
"..\..\..\..\dists\engine-data\lure.dat"-"c:\data\scummvm\lure.dat"
"..\..\..\..\dists\engine-data\drascula.dat"-"c:\data\scummvm\drascula.dat"
"..\..\..\..\dists\engine-data\m4.dat"-"c:\data\scummvm\m4.dat"
"..\..\..\..\dists\engine-data\teenagent.dat"-"c:\data\scummvm\teenagent.dat"
+"..\..\..\..\dists\engine-data\toon.dat"-"c:\data\scummvm\toon.dat"
"..\..\..\vkeybd\packs\vkeybd_default.zip"-"c:\data\scummvm\vkeybd_default.zip"
"..\..\..\..\gui\themes\translations.dat"-"c:\data\scummvm\translations.dat"
+"..\..\..\..\gui\themes\scummmodern.zip"-"c:\data\scummvm\scummmodern.zip"
; Config/log files: 'empty' will automagically be removed on uninstall
""-"c:\data\scummvm\scummvm.ini",FILENULL
diff --git a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg
new file mode 100644
index 0000000000..aea6701709
--- /dev/null
+++ b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg
@@ -0,0 +1,88 @@
+;
+; 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$
+;
+;
+
+;;;
+;;; ScummVM .PKG file for .SIS gegeration
+;;;
+
+;Language - standard language definitions
+&EN
+
+; List of localised vendor names - one per language. At least one must be provided (English [EN]).
+; List must correspond to list of languages specified elsewhere in the .pkg
+%{"ScummVM"}
+; The non-localised, globally unique vendor name (mandatory)
+:"ScummVM"
+
+; UID is the app's UID
+#{"ScummVM S60v3"},(0xA0000657),1,40,0
+
+;Supports Series 60 v 3.0
+[0x101F7961], 0, 0, 0, {"Series60ProductID"}
+;Supports Series 60 v 5.0
+[0x1028315F], 0, 0, 0, {"Series60ProductID"}
+
+; Launcher, Application, AIF & Resource file
+"\epoc32\release\gcce\urel\ScummVM.exe"- "!:\sys\bin\ScummVM.exe"
+"\epoc32\data\z\resource\apps\ScummVM.rsc"- "!:\resource\apps\ScummVM.rsc"
+"\epoc32\Data\Z\resource\apps\scummvm_loc.rsc"- "!:\resource\apps\scummvm_loc.rsc"
+"\epoc32\data\Z\resource\APPS\scummvm.MIF"- "!:\resource\apps\scummvm.MIF"
+"\epoc32\data\z\private\10003a3f\apps\scummvm_reg.rsc"-"!:\private\10003a3f\import\apps\scummvm_reg.rsc"
+
+"\epoc32\release\gcce\urel\ScummVM_A0000658.exe"- "!:\sys\bin\ScummVM_A0000658.exe"
+"\epoc32\data\z\resource\apps\ScummVM_A0000658.rsc"- "!:\resource\apps\ScummVM_A0000658.rsc"
+"\epoc32\Data\Z\resource\apps\ScummVM_A0000658_loc.rsc"- "!:\resource\apps\ScummVM_A0000658_loc.rsc"
+"\epoc32\data\z\private\10003a3f\apps\scummvm_A0000658_reg.rsc"-"!:\private\10003a3f\import\apps\scummvm_A0000658_reg.rsc"
+
+"..\..\..\..\dists\pred.dic"-"c:\data\scummvm\pred.dic"
+
+; Scummvm Documentation
+"..\..\..\..\COPYRIGHT"-"!:\resource\apps\scummvm\COPYRIGHT", FT, TC
+"..\..\..\..\COPYING"-"!:\resource\apps\scummvm\COPYING", FT, TC
+"..\README"-"!:\resource\apps\scummvm\SYMBIAN_README", FT, TC
+"..\..\..\..\AUTHORS"-"!:\resource\apps\scummvm\AUTHORS"
+"..\..\..\..\README"-"!:\resource\apps\scummvm\README"
+"..\..\..\..\NEWS"-"!:\resource\apps\scummvm\NEWS"
+
+; Common datafiles needed for some games
+"..\..\..\..\dists\engine-data\kyra.dat"-"c:\data\scummvm\kyra.dat"
+"..\..\..\..\dists\engine-data\sky.cpt"-"c:\data\scummvm\sky.cpt"
+"..\..\..\..\dists\engine-data\hugo.dat"-"c:\data\scummvm\hugo.dat"
+"..\..\..\..\dists\engine-data\lure.dat"-"c:\data\scummvm\lure.dat"
+"..\..\..\..\dists\engine-data\drascula.dat"-"c:\data\scummvm\drascula.dat"
+"..\..\..\..\dists\engine-data\m4.dat"-"c:\data\scummvm\m4.dat"
+"..\..\..\..\dists\engine-data\teenagent.dat"-"c:\data\scummvm\teenagent.dat"
+"..\..\..\..\dists\engine-data\toon.dat"-"c:\data\scummvm\toon.dat"
+"..\..\..\vkeybd\packs\vkeybd_default.zip"-"c:\data\scummvm\vkeybd_default.zip"
+"..\..\..\..\gui\themes\translations.dat"-"c:\data\scummvm\translations.dat"
+"..\..\..\..\gui\themes\scummmodern.zip"-"c:\data\scummvm\scummmodern.zip"
+
+; Config/log files: 'empty' will automagically be removed on uninstall
+""-"c:\data\scummvm\scummvm.ini",FILENULL
+""-"c:\data\scummvm\scummvm.stdout.txt",FILENULL
+""-"c:\data\scummvm\scummvm.stderr.txt",FILENULL
+""-"c:\data\scummvm\sdl.ini",FILENULL
+
+; This install layout will let you upgrade to newer versions wihout loss of scummvm.ini.
+; It will remove the config file, std***.txt files & dirs on uninstall.
diff --git a/backends/platform/symbian/S60v3/scummvm_A0000658_loc.rss b/backends/platform/symbian/S60v3/scummvm_A0000658_loc.rss
index 9273312f42..849e0b017f 100644
--- a/backends/platform/symbian/S60v3/scummvm_A0000658_loc.rss
+++ b/backends/platform/symbian/S60v3/scummvm_A0000658_loc.rss
@@ -19,4 +19,3 @@ RESOURCE LOCALISABLE_APP_INFO
}
};
}
-
diff --git a/backends/platform/symbian/S60v3/scummvm_A0000658_reg.rss b/backends/platform/symbian/S60v3/scummvm_A0000658_reg.rss
index 1b1cc9e64f..031be012cd 100644
--- a/backends/platform/symbian/S60v3/scummvm_A0000658_reg.rss
+++ b/backends/platform/symbian/S60v3/scummvm_A0000658_reg.rss
@@ -15,4 +15,3 @@ RESOURCE APP_REGISTRATION_INFO
// Specify the location of the localisable icon/caption definition file
localisable_resource_file = "\\Resource\\Apps\\ScummVM_A0000658_loc";
}
-
diff --git a/backends/platform/symbian/S60v3/scummvm_reg.rss b/backends/platform/symbian/S60v3/scummvm_reg.rss
index 1156694bd7..b5617913d6 100644
--- a/backends/platform/symbian/S60v3/scummvm_reg.rss
+++ b/backends/platform/symbian/S60v3/scummvm_reg.rss
@@ -15,4 +15,3 @@ RESOURCE APP_REGISTRATION_INFO
// Specify the location of the localisable icon/caption definition file
localisable_resource_file = "\\Resource\\Apps\\ScummVM_loc";
}
-
diff --git a/backends/platform/symbian/S80/ScummVM_S80.mmp.in b/backends/platform/symbian/S80/ScummVM_S80.mmp.in
index efd0d0ee32..5e4b6d447e 100644
--- a/backends/platform/symbian/S80/ScummVM_S80.mmp.in
+++ b/backends/platform/symbian/S80/ScummVM_S80.mmp.in
@@ -107,4 +107,3 @@ LIBRARY euser.lib apparc.lib fbscli.lib
LIBRARY estlib.lib apgrfx.lib
LIBRARY gdi.lib hal.lib bitgdi.lib
LIBRARY mediaclientaudiostream.lib efsrv.lib ws32.lib bafl.lib
-
diff --git a/backends/platform/symbian/S90/Scummvm_S90.mmp.in b/backends/platform/symbian/S90/Scummvm_S90.mmp.in
index 4afdb5c62e..06d65f1641 100644
--- a/backends/platform/symbian/S90/Scummvm_S90.mmp.in
+++ b/backends/platform/symbian/S90/Scummvm_S90.mmp.in
@@ -107,4 +107,3 @@ LIBRARY euser.lib apparc.lib fbscli.lib
LIBRARY estlib.lib apgrfx.lib
LIBRARY gdi.lib hal.lib bitgdi.lib bafl.lib
LIBRARY mediaclientaudiostream.lib efsrv.lib ws32.lib
-
diff --git a/backends/platform/symbian/UIQ2/ScummVM.rss b/backends/platform/symbian/UIQ2/ScummVM.rss
index 3550d82f7d..374bd50680 100644
--- a/backends/platform/symbian/UIQ2/ScummVM.rss
+++ b/backends/platform/symbian/UIQ2/ScummVM.rss
@@ -41,4 +41,3 @@ RESOURCE TBUF16 { buf=""; }
RESOURCE EIK_APP_INFO
{
}
-
diff --git a/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in b/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in
index 4000b1653d..80ba37d694 100644
--- a/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in
+++ b/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in
@@ -106,4 +106,3 @@ LIBRARY qikctl.lib bafl.lib
START WINS
WIN32_LIBRARY lldiv.obj llmul.obj llshl.obj
END
-
diff --git a/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2_SE.pkg b/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2_SE.pkg
index ad3a31cb30..8284f64611 100644
--- a/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2_SE.pkg
+++ b/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2_SE.pkg
@@ -54,4 +54,4 @@
; add extra Vibration lib for P800, will be ignored during all other installs
IF MachineUID = 0x101F408B
@"Vibration.sis", (0x101F94A3)
-ENDIF \ No newline at end of file
+ENDIF
diff --git a/backends/platform/symbian/UIQ3/ScummVM.rss b/backends/platform/symbian/UIQ3/ScummVM.rss
index cb47568288..2021b0506e 100644
--- a/backends/platform/symbian/UIQ3/ScummVM.rss
+++ b/backends/platform/symbian/UIQ3/ScummVM.rss
@@ -48,4 +48,3 @@ RESOURCE EIK_APP_INFO
}
#include <sdl.ra>
-
diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss b/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
index cb47568288..2021b0506e 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
+++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
@@ -48,4 +48,3 @@ RESOURCE EIK_APP_INFO
}
#include <sdl.ra>
-
diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
index e6f2b691ce..3bc93d8ce3 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
+++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
@@ -88,7 +88,7 @@ STATICLIBRARY esdl.lib
// *** Include paths
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\engines
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl ..\..\..\..\sound
SYSTEMINCLUDE \epoc32\include\ESDL
@@ -128,9 +128,13 @@ SOURCE gui\Dialog.cpp
// Common error
source common\error.cpp
+source common\quicktime.cpp
// Special for graphics
source graphics\iff.cpp
+source backends\graphics\symbiansdl\symbiansdl-graphics.cpp
+source backends\graphics\surfacesdl\surfacesdl-graphics.cpp
+source engines\obsolete.cpp
// *** Dynamic Libraries
LIBRARY cone.lib eikcore.lib
diff --git a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
index 3b6a3d9bd7..bd5016f8d1 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
+++ b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
@@ -88,7 +88,7 @@ STATICLIBRARY esdl.lib
// *** Include paths
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\engines
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl ..\..\..\..\sound
SYSTEMINCLUDE \epoc32\include\ESDL
@@ -128,9 +128,13 @@ SOURCE gui\Dialog.cpp
// Common error
source common\error.cpp
+source common\quicktime.cpp
// Special for graphics
source graphics\iff.cpp
+source backends\graphics\symbiansdl\symbiansdl-graphics.cpp
+source backends\graphics\surfacesdl\surfacesdl-graphics.cpp
+source engines\obsolete.cpp
// *** Dynamic Libraries
LIBRARY cone.lib eikcore.lib
diff --git a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg
index 2187a375a8..47e0ebbd09 100644
--- a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg
+++ b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg
@@ -32,7 +32,7 @@
:"ScummVM"
; UID is the app's UID
-#{"ScummVM UIQ3"},(0xA0000657),1,30,0
+#{"ScummVM UIQ3"},(0xA0000657),1,40,0
; ProductID for UIQ 3.0
; Product/platform version UID, Major, Minor, Build, Product ID
@@ -44,6 +44,7 @@
"\epoc32\Data\Z\resource\apps\scummvm_loc.rsc"- "!:\resource\apps\scummvm_loc.rsc"
"\epoc32\data\Z\resource\APPS\scummvm.MBM"- "!:\resource\apps\scummvm.MBM"
"\epoc32\data\z\private\10003a3f\apps\scummvm_reg.rsc"-"!:\private\10003a3f\import\apps\scummvm_reg.rsc"
+
"..\..\..\..\dists\pred.dic"-"c:\shared\scummvm\pred.dic"
; Scummvm Documentation
@@ -57,12 +58,15 @@
; Common datafiles needed for some games
"..\..\..\..\dists\engine-data\kyra.dat"-"c:\shared\scummvm\kyra.dat"
"..\..\..\..\dists\engine-data\sky.cpt"-"c:\shared\scummvm\sky.cpt"
+"..\..\..\..\dists\engine-data\hugo.dat"-"c:\shared\scummvm\hugo.dat"
"..\..\..\..\dists\engine-data\lure.dat"-"c:\shared\scummvm\lure.dat"
"..\..\..\..\dists\engine-data\drascula.dat"-"c:\shared\scummvm\drascula.dat"
"..\..\..\..\dists\engine-data\m4.dat"-"c:\shared\scummvm\m4.dat"
"..\..\..\..\dists\engine-data\teenagent.dat"-"c:\shared\scummvm\teenagent.dat"
+"..\..\..\..\dists\engine-data\toon.dat"-"c:\shared\scummvm\toon.dat"
"..\..\..\vkeybd\packs\vkeybd_default.zip"-"c:\shared\scummvm\vkeybd_default.zip"
"..\..\..\..\gui\themes\translations.dat"-"c:\shared\scummvm\translations.dat"
+"..\..\..\..\gui\themes\scummmodern.zip"-"c:\shared\scummvm\scummmodern.zip"
; Config/log files: 'empty' will automagically be removed on uninstall
""-"c:\shared\scummvm\scummvm.ini",FILENULL
diff --git a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg
new file mode 100644
index 0000000000..fb9923fae0
--- /dev/null
+++ b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg
@@ -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$
+;
+;
+
+;;;
+;;; ScummVM .PKG file for .SIS gegeration
+;;;
+
+
+; List of localised vendor names - one per language. At least one must be provided (English [EN]).
+; List must correspond to list of languages specified elsewhere in the .pkg
+%{"ScummVM"}
+; The non-localised, globally unique vendor name (mandatory)
+:"ScummVM"
+
+; UID is the app's UID
+#{"ScummVM UIQ3"},(0xA0000657),1,40,0
+
+; ProductID for UIQ 3.0
+; Product/platform version UID, Major, Minor, Build, Product ID
+(0x101F6300), 3, 0, 0, {"UIQ30ProductID"}
+
+; Application, AIF & Resource file
+"\epoc32\release\gcce\urel\ScummVM.exe"- "!:\sys\bin\ScummVM.exe"
+"\epoc32\data\z\resource\apps\ScummVM.rsc"- "!:\resource\apps\ScummVM.rsc"
+"\epoc32\Data\Z\resource\apps\scummvm_loc.rsc"- "!:\resource\apps\scummvm_loc.rsc"
+"\epoc32\data\Z\resource\APPS\scummvm.MBM"- "!:\resource\apps\scummvm.MBM"
+"\epoc32\data\z\private\10003a3f\apps\scummvm_reg.rsc"-"!:\private\10003a3f\import\apps\scummvm_reg.rsc"
+
+"\epoc32\release\gcce\urel\ScummVM_A0000658.exe"- "!:\sys\bin\ScummVM_A0000658.exe"
+"\epoc32\data\z\resource\apps\ScummVM_A0000658.rsc"- "!:\resource\apps\ScummVM_A0000658.rsc"
+"\epoc32\Data\Z\resource\apps\ScummVM_A0000658_loc.rsc"- "!:\resource\apps\ScummVM_A0000658_loc.rsc"
+"\epoc32\data\z\private\10003a3f\apps\scummvm_A0000658_reg.rsc"-"!:\private\10003a3f\import\apps\scummvm_A0000658_reg.rsc"
+
+"..\..\..\..\dists\pred.dic"-"c:\shared\scummvm\pred.dic"
+
+; Scummvm Documentation
+"..\..\..\..\COPYRIGHT"-"!:\resource\apps\scummvm\COPYRIGHT", FT, TC
+"..\..\..\..\COPYING"-"!:\resource\apps\scummvm\COPYING", FT, TC
+"..\README"-"!:\system\apps\scummvm\SYMBIAN_README", FT, TC
+"..\..\..\..\AUTHORS"-"!:\resource\apps\scummvm\AUTHORS"
+"..\..\..\..\README"-"!:\resource\apps\scummvm\README"
+"..\..\..\..\NEWS"-"!:\resource\apps\scummvm\NEWS"
+
+; Common datafiles needed for some games
+"..\..\..\..\dists\engine-data\kyra.dat"-"c:\shared\scummvm\kyra.dat"
+"..\..\..\..\dists\engine-data\sky.cpt"-"c:\shared\scummvm\sky.cpt"
+"..\..\..\..\dists\engine-data\hugo.dat"-"c:\shared\scummvm\hugo.dat"
+"..\..\..\..\dists\engine-data\lure.dat"-"c:\shared\scummvm\lure.dat"
+"..\..\..\..\dists\engine-data\drascula.dat"-"c:\shared\scummvm\drascula.dat"
+"..\..\..\..\dists\engine-data\m4.dat"-"c:\shared\scummvm\m4.dat"
+"..\..\..\..\dists\engine-data\teenagent.dat"-"c:\shared\scummvm\teenagent.dat"
+"..\..\..\..\dists\engine-data\toon.dat"-"c:\shared\scummvm\toon.dat"
+"..\..\..\vkeybd\packs\vkeybd_default.zip"-"c:\shared\scummvm\vkeybd_default.zip"
+"..\..\..\..\gui\themes\translations.dat"-"c:\shared\scummvm\translations.dat"
+"..\..\..\..\gui\themes\scummmodern.zip"-"c:\shared\scummvm\scummmodern.zip"
+
+; Config/log files: 'empty' will automagically be removed on uninstall
+""-"c:\shared\scummvm\scummvm.ini",FILENULL
+""-"c:\shared\scummvm\scummvm.stdout.txt",FILENULL
+""-"c:\shared\scummvm\scummvm.stderr.txt",FILENULL
+""-"c:\shared\scummvm\sdl.ini",FILENULL
+
+; This install layout will let you upgrade to newer versions wihout loss of scummvm.ini.
+; It will remove the config file, std***.txt files & dirs on uninstall.
diff --git a/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss b/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
index a6ee70ab25..7f3b71ef84 100644
--- a/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
+++ b/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
@@ -82,4 +82,3 @@ RESOURCE LOCALISABLE_APP_INFO
}
};
}
-
diff --git a/backends/platform/symbian/UIQ3/scummvm_A0000658_reg.rss b/backends/platform/symbian/UIQ3/scummvm_A0000658_reg.rss
index 2158406d0d..68d0d33abd 100644
--- a/backends/platform/symbian/UIQ3/scummvm_A0000658_reg.rss
+++ b/backends/platform/symbian/UIQ3/scummvm_A0000658_reg.rss
@@ -15,4 +15,3 @@ RESOURCE APP_REGISTRATION_INFO
// Specify the location of the localisable icon/caption definition file
localisable_resource_file = "\\Resource\\Apps\\ScummVM_A0000658_loc";
}
-
diff --git a/backends/platform/symbian/UIQ3/scummvm_loc.rss b/backends/platform/symbian/UIQ3/scummvm_loc.rss
index 201aacefa3..d00a67f3dc 100644
--- a/backends/platform/symbian/UIQ3/scummvm_loc.rss
+++ b/backends/platform/symbian/UIQ3/scummvm_loc.rss
@@ -56,4 +56,3 @@ RESOURCE LOCALISABLE_APP_INFO
}
};
}
-
diff --git a/backends/platform/symbian/UIQ3/scummvm_reg.rss b/backends/platform/symbian/UIQ3/scummvm_reg.rss
index 1156694bd7..b5617913d6 100644
--- a/backends/platform/symbian/UIQ3/scummvm_reg.rss
+++ b/backends/platform/symbian/UIQ3/scummvm_reg.rss
@@ -15,4 +15,3 @@ RESOURCE APP_REGISTRATION_INFO
// Specify the location of the localisable icon/caption definition file
localisable_resource_file = "\\Resource\\Apps\\ScummVM_loc";
}
-
diff --git a/backends/platform/symbian/mmp/scummvm_agi.mmp.in b/backends/platform/symbian/mmp/scummvm_agi.mmp.in
index a7dcfb0bb5..5805d36133 100644
--- a/backends/platform/symbian/mmp/scummvm_agi.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_agi.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\agi
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_agos.mmp.in b/backends/platform/symbian/mmp/scummvm_agos.mmp.in
index 4708a040ec..236a62f1b8 100644
--- a/backends/platform/symbian/mmp/scummvm_agos.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_agos.mmp.in
@@ -62,6 +62,6 @@ SOURCEPATH ..\..\..\..\engines\agos
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_base.mmp.in b/backends/platform/symbian/mmp/scummvm_base.mmp.in
index 9acef57cea..0387bfaf26 100644
--- a/backends/platform/symbian/mmp/scummvm_base.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_base.mmp.in
@@ -48,7 +48,7 @@ ALWAYS_BUILD_AS_ARM
// *** Include paths
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl
SYSTEMINCLUDE \epoc32\include\ESDL
@@ -156,4 +156,4 @@ SOURCE backends\vkeybd\virtual-keyboard.cpp
// Downscaler
SOURCE graphics\scaler\downscaler.cpp
-MACRO SDL_BACKEND \ No newline at end of file
+MACRO SDL_BACKEND
diff --git a/backends/platform/symbian/mmp/scummvm_cine.mmp.in b/backends/platform/symbian/mmp/scummvm_cine.mmp.in
index aac7d8b5b1..e75ece95f1 100644
--- a/backends/platform/symbian/mmp/scummvm_cine.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_cine.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\cine
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_cruise.mmp.in b/backends/platform/symbian/mmp/scummvm_cruise.mmp.in
index fc60bfeace..a91d33b5f5 100644
--- a/backends/platform/symbian/mmp/scummvm_cruise.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_cruise.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\cruise
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_draci.mmp.in b/backends/platform/symbian/mmp/scummvm_draci.mmp.in
index d879a03797..044247fac7 100644
--- a/backends/platform/symbian/mmp/scummvm_draci.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_draci.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\draci
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_drascula.mmp.in b/backends/platform/symbian/mmp/scummvm_drascula.mmp.in
index f83bcdb68f..0561e494c1 100644
--- a/backends/platform/symbian/mmp/scummvm_drascula.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_drascula.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\drascula
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_gob.mmp.in b/backends/platform/symbian/mmp/scummvm_gob.mmp.in
index 900f862846..7c92611fd2 100644
--- a/backends/platform/symbian/mmp/scummvm_gob.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_gob.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\gob
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_groovie.mmp.in b/backends/platform/symbian/mmp/scummvm_groovie.mmp.in
index 1051e6adea..c0294b3b0d 100644
--- a/backends/platform/symbian/mmp/scummvm_groovie.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_groovie.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\groovie
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_hugo.mmp.in b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
index 31975d3107..66e22fc34b 100644
--- a/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\hugo
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_kyra.mmp.in b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in
index 453d41bdc1..d5f2ec951c 100644
--- a/backends/platform/symbian/mmp/scummvm_kyra.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in
@@ -62,5 +62,5 @@ SOURCEPATH ..\..\..\..\engines\kyra
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in b/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
index 5d0fe6de36..57efa31a85 100644
--- a/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\lastexpress
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_lure.mmp.in b/backends/platform/symbian/mmp/scummvm_lure.mmp.in
index add33d7d8b..2ac1f8f8ff 100644
--- a/backends/platform/symbian/mmp/scummvm_lure.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_lure.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\lure
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_m4.mmp.in b/backends/platform/symbian/mmp/scummvm_m4.mmp.in
index 6896dadf10..81ec94dbd4 100644
--- a/backends/platform/symbian/mmp/scummvm_m4.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_m4.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\m4
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_made.mmp.in b/backends/platform/symbian/mmp/scummvm_made.mmp.in
index c51d3ac618..dc24aee279 100644
--- a/backends/platform/symbian/mmp/scummvm_made.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_made.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\made
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_mohawk.mmp.in b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
index 296c458e39..cb5b18ba18 100644
--- a/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\mohawk
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_parallaction.mmp.in b/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
index 4052a16693..e86473e47a 100644
--- a/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\parallaction
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_queen.mmp.in b/backends/platform/symbian/mmp/scummvm_queen.mmp.in
index ec4ccff939..b5326abe74 100644
--- a/backends/platform/symbian/mmp/scummvm_queen.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_queen.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\queen
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_saga.mmp.in b/backends/platform/symbian/mmp/scummvm_saga.mmp.in
index 44e222144c..55d89f7868 100644
--- a/backends/platform/symbian/mmp/scummvm_saga.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_saga.mmp.in
@@ -68,5 +68,5 @@ SOURCEPATH ..\..\..\..\engines\saga
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_sci.mmp.in b/backends/platform/symbian/mmp/scummvm_sci.mmp.in
index 12588495cb..dc06f44a5d 100644
--- a/backends/platform/symbian/mmp/scummvm_sci.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sci.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\sci
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_scumm.mmp.in b/backends/platform/symbian/mmp/scummvm_scumm.mmp.in
index 381a6060dd..527ce75181 100644
--- a/backends/platform/symbian/mmp/scummvm_scumm.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_scumm.mmp.in
@@ -79,7 +79,7 @@ SOURCE smush/codec47ARM.s // ARM version: add ASM routines
// *** Include paths
USERINCLUDE ..\..\..\..\engines ..\..\..\..\engines\scumm\smush ..\..\..\..\engines\scumm\insane
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
SYSTEMINCLUDE \epoc32\include\libc
diff --git a/backends/platform/symbian/mmp/scummvm_sky.mmp.in b/backends/platform/symbian/mmp/scummvm_sky.mmp.in
index f34c839076..eeb517ffcc 100644
--- a/backends/platform/symbian/mmp/scummvm_sky.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sky.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\sky
// *** Include paths
USERINCLUDE ..\..\..\..\engines ..\..\..\..\engines\sky\music
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_sword1.mmp.in b/backends/platform/symbian/mmp/scummvm_sword1.mmp.in
index 58f9f8fa05..0adc156719 100644
--- a/backends/platform/symbian/mmp/scummvm_sword1.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sword1.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\sword1
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_sword2.mmp.in b/backends/platform/symbian/mmp/scummvm_sword2.mmp.in
index 4a19be92ce..c8034c3015 100644
--- a/backends/platform/symbian/mmp/scummvm_sword2.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sword2.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\sword2
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in b/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
index 6b4812489e..f065bf4376 100644
--- a/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\teenagent
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_tinsel.mmp.in b/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
index bb56022f20..d61492de6b 100644
--- a/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
@@ -56,5 +56,5 @@ SOURCEPATH ..\..\..\..\engines\tinsel
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/mmp/scummvm_toon.mmp.in b/backends/platform/symbian/mmp/scummvm_toon.mmp.in
index 05742d5242..01924614b4 100644
--- a/backends/platform/symbian/mmp/scummvm_toon.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_toon.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\toon
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_touche.mmp.in b/backends/platform/symbian/mmp/scummvm_touche.mmp.in
index ea8dd2392c..b9cb53b4bf 100644
--- a/backends/platform/symbian/mmp/scummvm_touche.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_touche.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\touche
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_tsage.mmp.in b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in
index b7eb3290b3..fa4968f704 100644
--- a/backends/platform/symbian/mmp/scummvm_tsage.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\tsage
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/mmp/scummvm_tucker.mmp.in b/backends/platform/symbian/mmp/scummvm_tucker.mmp.in
index 0aeb0dc4ec..1ea564c0c0 100644
--- a/backends/platform/symbian/mmp/scummvm_tucker.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_tucker.mmp.in
@@ -56,6 +56,6 @@ SOURCEPATH ..\..\..\..\engines\tucker
// *** Include paths
USERINCLUDE ..\..\..\..\engines
-USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\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/symbian/res/ScummVmAif.rss b/backends/platform/symbian/res/ScummVmAif.rss
index 31bf7bd394..b2addc3f21 100644
--- a/backends/platform/symbian/res/ScummVmAif.rss
+++ b/backends/platform/symbian/res/ScummVmAif.rss
@@ -42,6 +42,3 @@ RESOURCE AIF_DATA
//
num_icons=2;
}
-
-
-
diff --git a/backends/platform/symbian/src/ScummApp.cpp b/backends/platform/symbian/src/ScummApp.cpp
index c4d9fc88d9..405fb5c3c2 100644
--- a/backends/platform/symbian/src/ScummApp.cpp
+++ b/backends/platform/symbian/src/ScummApp.cpp
@@ -116,5 +116,3 @@ void CScummApp::GetDataFolder(TDes& aDataFolder)
aDataFolder = _L("ScummVM");
}
/////////////////////////////////////////////////////////////////////////////////////////////////
-
-
diff --git a/backends/platform/symbian/src/ScummApp.h b/backends/platform/symbian/src/ScummApp.h
index 376964f0a1..0b9ebcdf53 100644
--- a/backends/platform/symbian/src/ScummApp.h
+++ b/backends/platform/symbian/src/ScummApp.h
@@ -48,5 +48,3 @@ public:
#endif
};
#endif
-
-
diff --git a/backends/platform/symbian/src/portdefs.h b/backends/platform/symbian/src/portdefs.h
index 86460e65c5..dd81080afe 100644
--- a/backends/platform/symbian/src/portdefs.h
+++ b/backends/platform/symbian/src/portdefs.h
@@ -32,7 +32,7 @@
#include <e32def.h>
#include <e32std.h>
-#include <math.h>
+#include <libc\math.h>
/* define pi */
#ifndef M_PI
@@ -157,6 +157,10 @@ void *scumm_bsearch(const void *key, const void *base, size_t nmemb, size_t size
#define FORBIDDEN_SYMBOL_EXCEPTION_FILE
#define FORBIDDEN_SYMBOL_EXCEPTION_fclose
#define FORBIDDEN_SYMBOL_EXCEPTION_fopen
+#define FORBIDDEN_SYMBOL_EXCEPTION_unlink
+#define FORBIDDEN_SYMBOL_EXCEPTION_getcwd
+#define FORBIDDEN_SYMBOL_EXCEPTION_stdout
+#define FORBIDDEN_SYMBOL_EXCEPTION_stderr
// we cannot include SymbianOS.h everywhere, but this works too (functions code is in SymbianOS.cpp)
namespace Symbian {
diff --git a/backends/platform/webos/webos.mk b/backends/platform/webos/webos.mk
index 37223ac56c..804b56de35 100644
--- a/backends/platform/webos/webos.mk
+++ b/backends/platform/webos/webos.mk
@@ -51,8 +51,8 @@
# Increment this number when the packaging of the app has been changed while
# ScummVM itself has the same version as before. The number can be reset to
-# 1 when the ScummVM version is increased.
-VER_PACKAGE = 5
+# 0 when the ScummVM version is increased.
+VER_PACKAGE = 0
PATH_DIST = $(srcdir)/dists/webos
PATH_MOJO = $(PATH_DIST)/mojo
@@ -60,10 +60,19 @@ APP_ID = $(shell basename $(prefix))
APP_VERSION = $(shell printf "%d.%d.%02d%02d" $(VER_MAJOR) $(VER_MINOR) $(VER_PATCH) $(VER_PACKAGE))
DESTDIR ?= staging
PORTDISTDIR ?= portdist
+ifeq ($(HOST_COMPILER),Darwin)
+ SED_DASH_I = "-i \"\""
+else
+ SED_DASH_I = "-i"
+endif
install: all
$(QUIET)$(INSTALL) -d "$(DESTDIR)$(prefix)"
+ifeq ($(HOST_COMPILER),Darwin)
+ $(QUIET)$(INSTALL) -m 0644 "$(PATH_MOJO)/"* "$(DESTDIR)$(prefix)/"
+else
$(QUIET)$(INSTALL) -m 0644 -t "$(DESTDIR)$(prefix)/" "$(PATH_MOJO)/"*
+endif
$(QUIET)$(INSTALL) -m 0755 "$(PATH_MOJO)/start" "$(DESTDIR)$(prefix)/"
$(QUIET)$(INSTALL) -d "$(DESTDIR)$(bindir)"
$(QUIET)$(INSTALL) -c -m 755 "./$(EXECUTABLE)" "$(DESTDIR)$(bindir)/$(EXECUTABLE)"
@@ -77,12 +86,12 @@ ifdef DYNAMIC_MODULES
$(QUIET)$(INSTALL) -c -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/"
$(QUIET)$(STRIP) "$(DESTDIR)$(libdir)/"*
endif
- $(QUIET)sed -i s/'APP_VERSION'/'$(APP_VERSION)'/ "$(DESTDIR)$(prefix)/appinfo.json"
- $(QUIET)sed -i s/'APP_ID'/'$(APP_ID)'/ "$(DESTDIR)$(prefix)/appinfo.json"
+ $(QUIET)sed $(SED_DASH_I) s/'APP_VERSION'/'$(APP_VERSION)'/ "$(DESTDIR)$(prefix)/appinfo.json"
+ $(QUIET)sed $(SED_DASH_I) s/'APP_ID'/'$(APP_ID)'/ "$(DESTDIR)$(prefix)/appinfo.json"
ifneq (,$(findstring -beta,$(APP_ID)))
- $(QUIET)sed -i s/'APP_TITLE'/'ScummVM Beta'/ "$(DESTDIR)$(prefix)/appinfo.json"
+ $(QUIET)sed $(SED_DASH_I) s/'APP_TITLE'/'ScummVM Beta'/ "$(DESTDIR)$(prefix)/appinfo.json"
else
- $(QUIET)sed -i s/'APP_TITLE'/'ScummVM'/ "$(DESTDIR)$(prefix)/appinfo.json"
+ $(QUIET)sed $(SED_DASH_I) s/'APP_TITLE'/'ScummVM'/ "$(DESTDIR)$(prefix)/appinfo.json"
endif
uninstall:
diff --git a/backends/platform/wii/gdb.txt b/backends/platform/wii/gdb.txt
index 4e6c7928c3..0bd2209745 100644
--- a/backends/platform/wii/gdb.txt
+++ b/backends/platform/wii/gdb.txt
@@ -1,4 +1,3 @@
target remote /dev/ttyUSB0
info threads
bt
-
diff --git a/backends/platform/wii/main.cpp b/backends/platform/wii/main.cpp
index 3965f51b7f..affe053b6a 100644
--- a/backends/platform/wii/main.cpp
+++ b/backends/platform/wii/main.cpp
@@ -247,4 +247,3 @@ int main(int argc, char *argv[]) {
#ifdef __cplusplus
}
#endif
-
diff --git a/backends/platform/wii/module.mk b/backends/platform/wii/module.mk
index 00eb0d7e49..88e75fba26 100644
--- a/backends/platform/wii/module.mk
+++ b/backends/platform/wii/module.mk
@@ -12,4 +12,3 @@ MODULE_OBJS := \
MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS))
OBJS := $(MODULE_OBJS) $(OBJS)
MODULE_DIRS += $(sort $(dir $(MODULE_OBJS)))
-
diff --git a/backends/platform/wii/options.cpp b/backends/platform/wii/options.cpp
index 8c12ad9b81..ede81343ca 100644
--- a/backends/platform/wii/options.cpp
+++ b/backends/platform/wii/options.cpp
@@ -315,4 +315,3 @@ void WiiOptionsDialog::save() {
ConfMan.flushToDisk();
}
-
diff --git a/backends/platform/wii/options.h b/backends/platform/wii/options.h
index 00d42bc2ef..9b500ef29f 100644
--- a/backends/platform/wii/options.h
+++ b/backends/platform/wii/options.h
@@ -77,4 +77,3 @@ private:
};
#endif
-
diff --git a/backends/platform/wii/osystem_events.cpp b/backends/platform/wii/osystem_events.cpp
index 389d3823e7..3ba66aed89 100644
--- a/backends/platform/wii/osystem_events.cpp
+++ b/backends/platform/wii/osystem_events.cpp
@@ -451,4 +451,3 @@ bool OSystem_Wii::pollEvent(Common::Event &event) {
return false;
}
-
diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp
index 859e3a1395..83607984cc 100644
--- a/backends/platform/wii/osystem_gfx.cpp
+++ b/backends/platform/wii/osystem_gfx.cpp
@@ -20,6 +20,7 @@
*/
#define FORBIDDEN_SYMBOL_EXCEPTION_printf
+#define FORBIDDEN_SYMBOL_EXCEPTION_abort
#include <malloc.h>
@@ -746,4 +747,3 @@ void OSystem_Wii::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX,
if ((_texMouse.palette) && (oldKeycolor != _mouseKeyColor))
_cursorPaletteDirty = true;
}
-
diff --git a/backends/platform/wii/osystem_sfx.cpp b/backends/platform/wii/osystem_sfx.cpp
index acab6df7e1..2e658e47aa 100644
--- a/backends/platform/wii/osystem_sfx.cpp
+++ b/backends/platform/wii/osystem_sfx.cpp
@@ -131,4 +131,3 @@ void OSystem_Wii::deinitSfx() {
free(sound_buffer[i]);
}
}
-
diff --git a/backends/platform/wii/wii.mk b/backends/platform/wii/wii.mk
index aed30523b2..7d2db68b4e 100644
--- a/backends/platform/wii/wii.mk
+++ b/backends/platform/wii/wii.mk
@@ -49,4 +49,3 @@ wiiloaddist: wiidist
$(DEVKITPPC)/bin/wiiload wiidist/scummvm.zip
.PHONY: wiiclean wiiload geckoupload wiigdb wiidebug wiidist wiiloaddist
-
diff --git a/backends/platform/wince/CEActionsPocket.cpp b/backends/platform/wince/CEActionsPocket.cpp
index a4786d330d..5980a41caa 100644
--- a/backends/platform/wince/CEActionsPocket.cpp
+++ b/backends/platform/wince/CEActionsPocket.cpp
@@ -137,6 +137,7 @@ void CEActionsPocket::initInstanceGame() {
bool is_tinsel = (gameid == "tinsel");
bool is_cruise = (gameid == "cruise");
bool is_made = (gameid == "made");
+ bool is_sci = (gameid == "sci");
GUI_Actions::initInstanceGame();
@@ -214,12 +215,14 @@ void CEActionsPocket::initInstanceGame() {
_key_action[POCKET_ACTION_MULTI].setKey(Common::ASCII_F1, SDLK_F1); // bargon : F1 to start
else if (gameid == "atlantis")
_key_action[POCKET_ACTION_MULTI].setKey(0, SDLK_KP0); // fate of atlantis : Ins to sucker-punch
+ else if (is_simon)
+ _key_action[POCKET_ACTION_MULTI].setKey(Common::ASCII_F10, SDLK_F10); // F10
else
_key_action[POCKET_ACTION_MULTI].setKey('V', SDLK_v, KMOD_SHIFT); // FT cheat : shift-V
// Key bind method
_action_enabled[POCKET_ACTION_BINDKEYS] = true;
// Disable double-tap right-click for convenience
- if (is_tinsel || is_cruise)
+ if (is_tinsel || is_cruise || is_sci)
if (!ConfMan.hasKey("no_doubletap_rightclick")) {
ConfMan.setBool("no_doubletap_rightclick", true);
ConfMan.flushToDisk();
@@ -267,6 +270,15 @@ bool CEActionsPocket::perform(GUI::ActionType action, bool pushed) {
else
_key_action[action].setKey(SDLK_s);
}
+ if (action == POCKET_ACTION_SKIP && ConfMan.get("gameid") == "agi") {
+ // In several AGI games (for example SQ2) it is needed to press F10 to exit from
+ // a screen. But we still want be able to skip normally with the skip button.
+ // Because of this, we inject a F10 keystroke here (this works and doesn't seem
+ // to have side-effects)
+ _key_action[action].setKey(Common::ASCII_F10, SDLK_F10); // F10
+ EventsBuffer::simulateKey(&_key_action[action], true);
+ _key_action[action].setKey(KEY_ALL_SKIP);
+ }
EventsBuffer::simulateKey(&_key_action[action], true);
return true;
case POCKET_ACTION_KEYBOARD:
diff --git a/backends/platform/wince/CEActionsSmartphone.cpp b/backends/platform/wince/CEActionsSmartphone.cpp
index b12dadabb6..2cce288323 100644
--- a/backends/platform/wince/CEActionsSmartphone.cpp
+++ b/backends/platform/wince/CEActionsSmartphone.cpp
@@ -128,6 +128,7 @@ void CEActionsSmartphone::initInstanceGame() {
bool is_tinsel = (gameid == "tinsel");
bool is_cruise = (gameid == "cruise");
bool is_made = (gameid == "made");
+ bool is_sci = (gameid == "sci");
GUI_Actions::initInstanceGame();
@@ -180,12 +181,14 @@ void CEActionsSmartphone::initInstanceGame() {
_key_action[SMARTPHONE_ACTION_MULTI].setKey(Common::ASCII_F1, SDLK_F1); // bargon : F1 to start
else if (gameid == "atlantis")
_key_action[SMARTPHONE_ACTION_MULTI].setKey(0, SDLK_KP0); // fate of atlantis : Ins to sucker-punch
+ else if (is_simon)
+ _key_action[SMARTPHONE_ACTION_MULTI].setKey(Common::ASCII_F10, SDLK_F10); // F10
else
_key_action[SMARTPHONE_ACTION_MULTI].setKey('V', SDLK_v, KMOD_SHIFT); // FT cheat : shift-V
// Bind keys
_action_enabled[SMARTPHONE_ACTION_BINDKEYS] = true;
// Disable double-tap right-click for convenience
- if (is_tinsel || is_cruise)
+ if (is_tinsel || is_cruise || is_sci)
if (!ConfMan.hasKey("no_doubletap_rightclick")) {
ConfMan.setBool("no_doubletap_rightclick", true);
ConfMan.flushToDisk();
@@ -231,6 +234,15 @@ bool CEActionsSmartphone::perform(GUI::ActionType action, bool pushed) {
else
_key_action[action].setKey(SDLK_s);
}
+ if (action == SMARTPHONE_ACTION_SKIP && ConfMan.get("gameid") == "agi") {
+ // In several AGI games (for example SQ2) it is needed to press F10 to exit from
+ // a screen. But we still want be able to skip normally with the skip button.
+ // Because of this, we inject a F10 keystroke here (this works and doesn't seem
+ // to have side-effects)
+ _key_action[action].setKey(Common::ASCII_F10, SDLK_F10); // F10
+ EventsBuffer::simulateKey(&_key_action[action], true);
+ _key_action[action].setKey(KEY_ALL_SKIP);
+ }
EventsBuffer::simulateKey(&_key_action[action], true);
return true;
case SMARTPHONE_ACTION_RIGHTCLICK:
diff --git a/backends/platform/wince/CELauncherDialog.cpp b/backends/platform/wince/CELauncherDialog.cpp
index 9c832dd585..dd6076e0af 100644
--- a/backends/platform/wince/CELauncherDialog.cpp
+++ b/backends/platform/wince/CELauncherDialog.cpp
@@ -24,6 +24,7 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "backends/platform/wince/wince-sdl.h"
+#include "backends/graphics/wincesdl/wincesdl-graphics.h"
#include "CELauncherDialog.h"
@@ -34,6 +35,7 @@
#include "gui/browser.h"
#include "gui/message.h"
#include "gui/ThemeEval.h"
+#include "gui/widgets/list.h"
#include "common/config-manager.h"
@@ -63,9 +65,13 @@ public:
};
CELauncherDialog::CELauncherDialog() : GUI::LauncherDialog() {
+ ((WINCESdlGraphicsManager *)((OSystem_SDL *)g_system)->getGraphicsManager())->reset_panel();
}
void CELauncherDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
+ if ((cmd == 'STRT') || (cmd == kListItemActivatedCmd) || (cmd == kListItemDoubleClickedCmd)) {
+ ((WINCESdlGraphicsManager *)((OSystem_SDL *)g_system)->getGraphicsManager())->init_panel();
+ }
LauncherDialog::handleCommand(sender, cmd, data);
if (cmd == 'ABOU') {
CEAboutDialog about;
diff --git a/backends/platform/wince/CEScaler.cpp b/backends/platform/wince/CEScaler.cpp
index f07a7ec84b..66f7809a3a 100644
--- a/backends/platform/wince/CEScaler.cpp
+++ b/backends/platform/wince/CEScaler.cpp
@@ -86,4 +86,3 @@ void SmartphoneLandscape(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, ui
}
#endif
-
diff --git a/backends/platform/wince/CEgui/CEGUI.h b/backends/platform/wince/CEgui/CEGUI.h
index 4e44115476..8b2e3528e3 100644
--- a/backends/platform/wince/CEgui/CEGUI.h
+++ b/backends/platform/wince/CEgui/CEGUI.h
@@ -24,4 +24,3 @@
#include "Panel.h"
#include "ItemSwitch.h"
#include "PanelKeyboard.h"
-
diff --git a/backends/platform/wince/CEgui/PanelKeyboard.cpp b/backends/platform/wince/CEgui/PanelKeyboard.cpp
index 442d7fc68c..cab02150c5 100644
--- a/backends/platform/wince/CEgui/PanelKeyboard.cpp
+++ b/backends/platform/wince/CEgui/PanelKeyboard.cpp
@@ -96,4 +96,3 @@ bool PanelKeyboard::action(int x, int y, bool pushed) {
}
} // End of namespace CEGUI
-
diff --git a/backends/platform/wince/CEkeys/CEKeys.h b/backends/platform/wince/CEkeys/CEKeys.h
index ac4907704d..cf71b982f3 100644
--- a/backends/platform/wince/CEkeys/CEKeys.h
+++ b/backends/platform/wince/CEkeys/CEKeys.h
@@ -21,4 +21,3 @@
*/
#include "EventsBuffer.h"
-
diff --git a/backends/platform/wince/CEkeys/EventsBuffer.cpp b/backends/platform/wince/CEkeys/EventsBuffer.cpp
index d5818c3731..c993798dc8 100644
--- a/backends/platform/wince/CEkeys/EventsBuffer.cpp
+++ b/backends/platform/wince/CEkeys/EventsBuffer.cpp
@@ -76,5 +76,3 @@ bool EventsBuffer::simulateMouseRightClick(int x, int y, bool pushed) {
return (SDL_PushEvent(&ev) == 0);
}
}
-
-
diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt
index c48d9ca998..429168c293 100644
--- a/backends/platform/wince/README-WinCE.txt
+++ b/backends/platform/wince/README-WinCE.txt
@@ -1,10 +1,40 @@
ScummVM Windows CE FAQ
-Last updated: 2011-05-27
-Release version: 1.3.0
+Last updated: 2011-10-15
+Release version: 1.4.0
------------------------------------------------------------------------
New in this version
-------------------
+1.4.0:
+- Changed the memory management so that it is finally possible to break the
+ 32MB per process barrier on Windows CE. It should be possible now (finally)
+ to play nearly every game with the "big" binary (scummvm.exe, which includes
+ all game engines).
+- Changed default values for "high_sample_rate" & "FM_high_quality" to "true"
+ as most devices today are fast enough to handle this. It's still possible to
+ set this to "false" if you have a slower device.
+- Fix for TeenAgent & Hugo engines (both weren't running at all, crashed right
+ at the beginning)
+- Discworld 2 is now playable (works now because of the new memory management)
+- Replaced the game mass-adding functionality with the functionality used on
+ all other platforms. It now shows progress while searching for games.
+
+1.3.1:
+- Fix for Normal2xAspect scaler which was causing screen update issues in some
+ games.
+- Fix for Normal1xAspect scaler which caused problems in the bottom part of the
+ screen when toolbar was hidden.
+- Fix for freelook mode.
+- Fix for timer manager, caused timing issues in some games.
+- Activated runtime language detection for ScummVM gui.
+- Toolbar is now hidden when returning to the game list.
+- Double-tap right-click emulation is now turned off for SCI games by default.
+- Added a new option "no_doubletap_paneltoggle" for scummvm.ini to disable
+ toolbar toggling when double-tapping on the top part of the screen.
+- SDL library related fixes:
+ * Fix for screen/mouse-cursor rotation issues (fixes erratic touchscreen
+ behaviour)
+ * Fix for hardware keyboard on some devices (HTC Touch Pro, etc.)
1.3.0:
This is the first official Windows CE release since 1.1.1.
@@ -345,14 +375,13 @@ Some parameters are specific to this port :
Game specific sections (f.e. [monkey2]) - performance options
* high_sample_rate bool Desktop quality (22 kHz) sound output if
- set. The default is 11 kHz.
- If you have a fast device, you can set this
- to true to enjoy better sound effects and
- music.
+ set. This is the default.
+ If you have a slow device, you can set this
+ to false to prevent lags/delays in the game.
* FM_high_quality bool Desktop quality FM synthesis if set. Lower
- quality otherwise. The default is low
+ quality otherwise. The default is high
quality. You can change this if you have a
- fast device.
+ slow device.
* sound_thread_priority int Set the priority of the sound thread (0, 1,
2). Depending on the release, this is set
to 1 internally (above normal).
diff --git a/backends/platform/wince/missing/assert.h b/backends/platform/wince/missing/assert.h
index 734b8f9482..e9c871da60 100644
--- a/backends/platform/wince/missing/assert.h
+++ b/backends/platform/wince/missing/assert.h
@@ -6,4 +6,3 @@ void CDECL _declspec(noreturn) error(const char *s, ...);
#define assert(e) ((e) ? 0 : (::error("Assertion failed %s (%s, %d)", #e, __FILE__, __LINE__)))
#define abort() ::error("Abort (%s, %d)", __FILE__, __LINE__)
-
diff --git a/backends/platform/wince/missing/io.h b/backends/platform/wince/missing/io.h
index de492cac68..b2cb2abd8e 100644
--- a/backends/platform/wince/missing/io.h
+++ b/backends/platform/wince/missing/io.h
@@ -9,4 +9,3 @@ typedef void FILE;
#endif
FILE *wce_fopen(const char *fname, const char *fmode);
#define fopen wce_fopen
-
diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp
index 9b1ffe817c..4e17827e5c 100644
--- a/backends/platform/wince/wince-sdl.cpp
+++ b/backends/platform/wince/wince-sdl.cpp
@@ -42,6 +42,7 @@
#include "audio/mixer_intern.h"
#include "audio/fmopl.h"
+#include "backends/mutex/sdl/sdl-mutex.h"
#include "backends/timer/sdl/sdl-timer.h"
#include "gui/Actions.h"
@@ -71,6 +72,50 @@
extern "C" _CRTIMP FILE *__cdecl _wfreopen(const wchar_t *, const wchar_t *, FILE *);
#endif
+#ifdef WRAP_MALLOC
+
+extern "C" void *__real_malloc(size_t size);
+extern "C" void __real_free(void *ptr);
+
+extern "C" void *__wrap_malloc(size_t size) {
+/*
+ void *ptr = __real_malloc(size);
+ printf("malloc(%d) = %p\n", size, ptr);
+ return ptr;
+*/
+ if (size < 64 * 1024) {
+ void *ptr = __real_malloc(size+4);
+// printf("malloc(%d) = %p\n", size, ptr);
+ if (ptr != NULL) {
+ *((HANDLE*)ptr) = 0;
+ return 4+(char*)ptr;
+ }
+ return NULL;
+ }
+ HANDLE H = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size+4, 0);
+ void *ptr = MapViewOfFile(H, FILE_MAP_ALL_ACCESS, 0, 0, 0);
+ *((HANDLE*)ptr) = H;
+ return 4+(char*)ptr;
+}
+
+extern "C" void __wrap_free(void *ptr) {
+/*
+ __real_free(ptr);
+ printf("free(%p)\n", ptr);
+*/
+ if (ptr != NULL) {
+ HANDLE H = *(HANDLE*)((char *)ptr-4);
+ if (H == 0) {
+ __real_free((char*)ptr-4);
+ return;
+ }
+ UnmapViewOfFile((char *)ptr-4);
+ CloseHandle(H);
+ }
+}
+
+#endif
+
using namespace CEGUI;
// ********************************************************************************************
@@ -353,9 +398,9 @@ void drawError(char *error) {
}
// ********************************************************************************************
-static DefaultTimerManager *_int_timer = NULL;
static Uint32 timer_handler_wrapper(Uint32 interval) {
- _int_timer->handler();
+ DefaultTimerManager *tm = (DefaultTimerManager *)g_system->getTimerManager();
+ tm->handler();
return interval;
}
@@ -379,21 +424,7 @@ void OSystem_WINCE3::initBackend() {
((WINCESdlEventSource *)_eventSource)->init((WINCESdlGraphicsManager *)_graphicsManager);
-
- // FIXME: This timer manager is *not accesible* from the outside.
- // Instead the timer manager setup by OSystem_SDL is visible on the outside.
- // Since the WinCE backend actually seems to work, my guess is that
- // SDL_AddTimer works after all and the following code is redundant.
- // However it may be, this must be resolved one way or another.
-
- // Create the timer. CE SDL does not support multiple timers (SDL_AddTimer).
- // We work around this by using the SetTimer function, since we only use
- // one timer in scummvm (for the time being)
- _int_timer = new DefaultTimerManager();
- //_timerID = NULL; // OSystem_SDL will call removetimer with this, it's ok
- SDL_SetTimer(10, &timer_handler_wrapper);
-
- // Chain init
+ // Call parent implementation of this method
OSystem_SDL::initBackend();
// Initialize global key mapping
@@ -404,9 +435,6 @@ void OSystem_WINCE3::initBackend() {
GUI_Actions::Instance()->saveMapping(); // write defaults
}
- // Call parent implementation of this method
- //OSystem_SDL::initBackend();
-
_inited = true;
}
@@ -555,6 +583,24 @@ void OSystem_WINCE3::initSDL() {
}
}
+void OSystem_WINCE3::init() {
+ // Create SdlMutexManager instance as the TimerManager relies on the
+ // MutexManager being already initialized
+ if (_mutexManager == 0)
+ _mutexManager = new SdlMutexManager();
+
+ // Create the timer. CE SDL does not support multiple timers (SDL_AddTimer).
+ // We work around this by using the SetTimer function, since we only use
+ // one timer in scummvm (for the time being)
+ if (_timerManager == 0) {
+ _timerManager = new DefaultTimerManager();
+ SDL_SetTimer(10, &timer_handler_wrapper);
+ }
+
+ // Call parent implementation of this method
+ OSystem_SDL::init();
+}
+
void OSystem_WINCE3::quit() {
fclose(stdout_file);
fclose(stderr_file);
diff --git a/backends/platform/wince/wince-sdl.h b/backends/platform/wince/wince-sdl.h
index 481956c19a..b4f323c9e2 100644
--- a/backends/platform/wince/wince-sdl.h
+++ b/backends/platform/wince/wince-sdl.h
@@ -52,6 +52,7 @@ public:
void initBackend();
// Overloaded from SDL backend
+ void init();
void quit();
virtual Common::String getSystemLanguage() const;
diff --git a/backends/platform/wince/wince.mk b/backends/platform/wince/wince.mk
index cac3ad4e8f..c5f3274747 100644
--- a/backends/platform/wince/wince.mk
+++ b/backends/platform/wince/wince.mk
@@ -1,3 +1,7 @@
+ifdef WRAP_MALLOC
+ LDFLAGS += -Wl,--wrap,malloc -Wl,--wrap,free
+endif
+
backends/platform/wince/PocketSCUMM.o: $(srcdir)/backends/platform/wince/PocketSCUMM.rc
$(QUIET)$(MKDIR) $(*D)
$(WINDRES) $(WINDRESFLAGS) -I$(srcdir)/backends/platform/wince $< $@
diff --git a/backends/plugins/ds/ds-provider.cpp b/backends/plugins/ds/ds-provider.cpp
index ff4cbe5f96..21ec157e5f 100644
--- a/backends/plugins/ds/ds-provider.cpp
+++ b/backends/plugins/ds/ds-provider.cpp
@@ -43,4 +43,3 @@ Plugin *DSPluginProvider::createPlugin(const Common::FSNode &node) const {
}
#endif // defined(DYNAMIC_MODULES) && defined(__DS__)
-
diff --git a/backends/plugins/ds/ds-provider.h b/backends/plugins/ds/ds-provider.h
index df8307a52d..1d806a03bd 100644
--- a/backends/plugins/ds/ds-provider.h
+++ b/backends/plugins/ds/ds-provider.h
@@ -35,4 +35,3 @@ public:
#endif // BACKENDS_PLUGINS_DS_PROVIDER_H
#endif // defined(DYNAMIC_MODULES) && defined(__DS__)
-
diff --git a/backends/plugins/elf/arm-loader.cpp b/backends/plugins/elf/arm-loader.cpp
index 12204ef68f..f8deac9c88 100644
--- a/backends/plugins/elf/arm-loader.cpp
+++ b/backends/plugins/elf/arm-loader.cpp
@@ -127,4 +127,3 @@ bool ARMDLObject::relocateRels(Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) {
}
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(ARM_TARGET) */
-
diff --git a/backends/plugins/elf/arm-loader.h b/backends/plugins/elf/arm-loader.h
index 60bc4f8720..598517d2ef 100644
--- a/backends/plugins/elf/arm-loader.h
+++ b/backends/plugins/elf/arm-loader.h
@@ -38,4 +38,3 @@ protected:
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(ARM_TARGET) */
#endif /* BACKENDS_PLUGINS_ARM_LOADER_H */
-
diff --git a/backends/plugins/elf/elf-loader.cpp b/backends/plugins/elf/elf-loader.cpp
index 4335ea6108..d75010196a 100644
--- a/backends/plugins/elf/elf-loader.cpp
+++ b/backends/plugins/elf/elf-loader.cpp
@@ -489,4 +489,3 @@ void *DLObject::symbol(const char *name) {
}
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) */
-
diff --git a/backends/plugins/elf/elf-loader.h b/backends/plugins/elf/elf-loader.h
index a953507631..58cc7714cf 100644
--- a/backends/plugins/elf/elf-loader.h
+++ b/backends/plugins/elf/elf-loader.h
@@ -102,4 +102,3 @@ public:
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) */
#endif /* BACKENDS_PLUGINS_ELF_LOADER_H */
-
diff --git a/backends/plugins/elf/elf-provider.cpp b/backends/plugins/elf/elf-provider.cpp
index 84054f44cb..f637596d8d 100644
--- a/backends/plugins/elf/elf-provider.cpp
+++ b/backends/plugins/elf/elf-provider.cpp
@@ -207,4 +207,3 @@ bool ELFPluginProvider::isPluginFilename(const Common::FSNode &node) const {
}
#endif // defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER)
-
diff --git a/backends/plugins/elf/elf-provider.h b/backends/plugins/elf/elf-provider.h
index 62ea930829..a966f371f6 100644
--- a/backends/plugins/elf/elf-provider.h
+++ b/backends/plugins/elf/elf-provider.h
@@ -92,4 +92,3 @@ protected:
#endif // defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER)
#endif /* BACKENDS_PLUGINS_ELF_PROVIDER_H */
-
diff --git a/backends/plugins/elf/elf32.h b/backends/plugins/elf/elf32.h
index aecedf5a37..1ecc68a8f0 100644
--- a/backends/plugins/elf/elf32.h
+++ b/backends/plugins/elf/elf32.h
@@ -246,4 +246,3 @@ typedef struct {
#endif // defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER)
#endif /* BACKENDS_ELF_H */
-
diff --git a/backends/plugins/elf/memory-manager.cpp b/backends/plugins/elf/memory-manager.cpp
index 02669b3647..47b77a3ec2 100644
--- a/backends/plugins/elf/memory-manager.cpp
+++ b/backends/plugins/elf/memory-manager.cpp
@@ -29,7 +29,9 @@
#include "common/util.h"
#include <malloc.h>
+namespace Common {
DECLARE_SINGLETON(ELFMemoryManager);
+}
ELFMemoryManager::ELFMemoryManager() :
_heap(0), _heapSize(0), _heapAlign(0),
@@ -170,4 +172,3 @@ void ELFMemoryManager::deallocateFromHeap(void *ptr) {
}
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) */
-
diff --git a/backends/plugins/elf/mips-loader.cpp b/backends/plugins/elf/mips-loader.cpp
index e043c9647f..6c0e688783 100644
--- a/backends/plugins/elf/mips-loader.cpp
+++ b/backends/plugins/elf/mips-loader.cpp
@@ -337,4 +337,3 @@ void MIPSDLObject::freeShortsSegment() {
}
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(MIPS_TARGET) */
-
diff --git a/backends/plugins/elf/mips-loader.h b/backends/plugins/elf/mips-loader.h
index 3066589c9b..1103e939ce 100644
--- a/backends/plugins/elf/mips-loader.h
+++ b/backends/plugins/elf/mips-loader.h
@@ -58,4 +58,3 @@ public:
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(MIPS_TARGET) */
#endif /* BACKENDS_PLUGINS_MIPS_LOADER_H */
-
diff --git a/backends/plugins/elf/ppc-loader.cpp b/backends/plugins/elf/ppc-loader.cpp
index 2f7042c682..4c9290ad5e 100644
--- a/backends/plugins/elf/ppc-loader.cpp
+++ b/backends/plugins/elf/ppc-loader.cpp
@@ -123,4 +123,3 @@ bool PPCDLObject::relocateRels(Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) {
}
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(PPC_TARGET) */
-
diff --git a/backends/plugins/elf/ppc-loader.h b/backends/plugins/elf/ppc-loader.h
index 9aa6c949f1..8614476a92 100644
--- a/backends/plugins/elf/ppc-loader.h
+++ b/backends/plugins/elf/ppc-loader.h
@@ -38,4 +38,3 @@ protected:
#endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(PPC_TARGET) */
#endif /* BACKENDS_PLUGINS_PPC_LOADER_H */
-
diff --git a/backends/plugins/elf/shorts-segment-manager.cpp b/backends/plugins/elf/shorts-segment-manager.cpp
index b3a9531c2d..993a538f6c 100644
--- a/backends/plugins/elf/shorts-segment-manager.cpp
+++ b/backends/plugins/elf/shorts-segment-manager.cpp
@@ -33,7 +33,9 @@ extern char __plugin_hole_start; // Indicates start of hole in program file for
extern char __plugin_hole_end; // Indicates end of hole in program file
extern char _gp[]; // Value of gp register
+namespace Common {
DECLARE_SINGLETON(ShortSegmentManager); // For singleton
+}
ShortSegmentManager::ShortSegmentManager() {
_shortsStart = &__plugin_hole_start ; //shorts segment begins at the plugin hole we made when linking
@@ -83,5 +85,3 @@ void ShortSegmentManager::deleteSegment(ShortSegmentManager::Segment *seg) {
}
#endif // defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(MIPS_TARGET)
-
-
diff --git a/backends/plugins/elf/shorts-segment-manager.h b/backends/plugins/elf/shorts-segment-manager.h
index 8293d55c08..34e233a2f4 100644
--- a/backends/plugins/elf/shorts-segment-manager.h
+++ b/backends/plugins/elf/shorts-segment-manager.h
@@ -111,4 +111,3 @@ private:
#endif // defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) && defined(MIPS_TARGET)
#endif /* SHORTS_SEGMENT_MANAGER_H */
-
diff --git a/backends/plugins/elf/version.cpp b/backends/plugins/elf/version.cpp
index 593a17fb2b..9f64870500 100644
--- a/backends/plugins/elf/version.cpp
+++ b/backends/plugins/elf/version.cpp
@@ -26,4 +26,3 @@
const char *gScummVMPluginBuildDate __attribute__((visibility("hidden"))) =
__DATE__ " " __TIME__ ;
#endif
-
diff --git a/backends/plugins/elf/version.h b/backends/plugins/elf/version.h
index 915132e8c4..1f6924028b 100644
--- a/backends/plugins/elf/version.h
+++ b/backends/plugins/elf/version.h
@@ -29,4 +29,3 @@ extern const char *gScummVMPluginBuildDate;
#endif
#endif
-
diff --git a/backends/plugins/ps2/ps2-provider.cpp b/backends/plugins/ps2/ps2-provider.cpp
index 7c7409eaf9..50cddb05e0 100644
--- a/backends/plugins/ps2/ps2-provider.cpp
+++ b/backends/plugins/ps2/ps2-provider.cpp
@@ -41,4 +41,3 @@ Plugin *PS2PluginProvider::createPlugin(const Common::FSNode &node) const {
}
#endif // defined(DYNAMIC_MODULES) && defined(__PLAYSTATION2__)
-
diff --git a/backends/plugins/ps2/ps2-provider.h b/backends/plugins/ps2/ps2-provider.h
index b9006b1716..f4498204b4 100644
--- a/backends/plugins/ps2/ps2-provider.h
+++ b/backends/plugins/ps2/ps2-provider.h
@@ -35,4 +35,3 @@ public:
#endif // BACKENDS_PLUGINS_PS2_PROVIDER_H
#endif // defined(DYNAMIC_MODULES) && defined(__PLAYSTATION2__)
-
diff --git a/backends/plugins/psp/psp-provider.cpp b/backends/plugins/psp/psp-provider.cpp
index 0c41af24a1..1d8cad6b50 100644
--- a/backends/plugins/psp/psp-provider.cpp
+++ b/backends/plugins/psp/psp-provider.cpp
@@ -43,4 +43,3 @@ Plugin *PSPPluginProvider::createPlugin(const Common::FSNode &node) const {
}
#endif // defined(DYNAMIC_MODULES) && defined(__PSP__)
-
diff --git a/backends/plugins/psp/psp-provider.h b/backends/plugins/psp/psp-provider.h
index 0cc0457740..4ace3e7f4b 100644
--- a/backends/plugins/psp/psp-provider.h
+++ b/backends/plugins/psp/psp-provider.h
@@ -35,4 +35,3 @@ public:
#endif // BACKENDS_PLUGINS_PSP_PROVIDER_H
#endif // defined(DYNAMIC_MODULES) && defined(__PSP__)
-
diff --git a/backends/plugins/wii/wii-provider.cpp b/backends/plugins/wii/wii-provider.cpp
index fa85588348..f96254eabe 100644
--- a/backends/plugins/wii/wii-provider.cpp
+++ b/backends/plugins/wii/wii-provider.cpp
@@ -43,4 +43,3 @@ Plugin *WiiPluginProvider::createPlugin(const Common::FSNode &node) const {
}
#endif // defined(DYNAMIC_MODULES) && defined(__WII__)
-
diff --git a/backends/plugins/wii/wii-provider.h b/backends/plugins/wii/wii-provider.h
index 573a8e7e59..fb847e1024 100644
--- a/backends/plugins/wii/wii-provider.h
+++ b/backends/plugins/wii/wii-provider.h
@@ -35,4 +35,3 @@ public:
#endif // BACKENDS_PLUGINS_WII_PROVIDER_H
#endif // defined(DYNAMIC_MODULES) && defined(__WII__)
-
diff --git a/backends/saves/psp/psp-saves.cpp b/backends/saves/psp/psp-saves.cpp
index 006a4e815d..65003e9fb9 100644
--- a/backends/saves/psp/psp-saves.cpp
+++ b/backends/saves/psp/psp-saves.cpp
@@ -78,4 +78,3 @@ void PSPSaveFileManager::checkPath(const Common::FSNode &dir) {
PowerMan.endCriticalSection();
}
#endif
-
diff --git a/backends/taskbar/unity/unity-taskbar.cpp b/backends/taskbar/unity/unity-taskbar.cpp
index 49c56b746d..f36e2bf628 100644
--- a/backends/taskbar/unity/unity-taskbar.cpp
+++ b/backends/taskbar/unity/unity-taskbar.cpp
@@ -8,29 +8,30 @@
* 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$
- *
*/
+#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h
+#define FORBIDDEN_SYMBOL_EXCEPTION_time_h
#include "common/scummsys.h"
-#if defined(UNIX) && defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
+#if defined(POSIX) && defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
#include "backends/taskbar/unity/unity-taskbar.h"
#include "common/textconsole.h"
+#include <unity.h>
+
UnityTaskbarManager::UnityTaskbarManager() {
g_type_init();
diff --git a/backends/taskbar/unity/unity-taskbar.h b/backends/taskbar/unity/unity-taskbar.h
index 9f14b44d8f..d1d9430bcd 100644
--- a/backends/taskbar/unity/unity-taskbar.h
+++ b/backends/taskbar/unity/unity-taskbar.h
@@ -8,31 +8,29 @@
* 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 BACKEND_UNITY_TASKBAR_H
#define BACKEND_UNITY_TASKBAR_H
-#if defined(UNIX) && defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
+#if defined(POSIX) && defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
#include "common/events.h"
#include "common/str.h"
#include "common/taskbar.h"
-#include <unity.h>
+typedef struct _GMainLoop GMainLoop;
+typedef struct _UnityLauncherEntry UnityLauncherEntry;
class UnityTaskbarManager : public Common::TaskbarManager, public Common::EventSource {
public:
diff --git a/backends/taskbar/win32/mingw-compat.h b/backends/taskbar/win32/mingw-compat.h
index 06968b62ff..55105407c6 100644
--- a/backends/taskbar/win32/mingw-compat.h
+++ b/backends/taskbar/win32/mingw-compat.h
@@ -8,23 +8,20 @@
* 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$
- *
*/
// TODO: Remove header when the latest changes to the Windows SDK have been integrated into MingW
-// For reference, the interface definitions here are imported the SDK headers and from the
+// For reference, the interface definitions here are imported the SDK headers and from the
// EcWin7 project (https://code.google.com/p/dukto/)
#ifndef BACKEND_WIN32_TASKBAR_MINGW_H
@@ -42,8 +39,14 @@
#include <commctrl.h>
#include <initguid.h>
#include <shlwapi.h>
+#include <shlguid.h>
#define CMIC_MASK_ASYNCOK SEE_MASK_ASYNCOK
+extern const GUID CLSID_ShellLink;
+
+// Shard enumeration value
+#define SHARD_LINK 0x00000006
+
// Taskbar GUID definitions
DEFINE_GUID(CLSID_TaskbarList,0x56fdf344,0xfd6d,0x11d0,0x95,0x8a,0x0,0x60,0x97,0xc9,0xa0,0x90);
DEFINE_GUID(IID_ITaskbarList3,0xea1afb91,0x9e28,0x4b86,0x90,0xE9,0x9e,0x9f,0x8a,0x5e,0xef,0xaf);
@@ -67,6 +70,9 @@ DECLARE_INTERFACE_(IPropertyStore, IUnknown) {
STDMETHOD (GetValue) (REFPROPERTYKEY key, PROPVARIANT *pv) PURE;
STDMETHOD (SetValue) (REFPROPERTYKEY key, REFPROPVARIANT propvar) PURE;
STDMETHOD (Commit) (void) PURE;
+
+private:
+ ~IPropertyStore();
};
typedef IPropertyStore *LPIPropertyStore;
@@ -131,6 +137,9 @@ DECLARE_INTERFACE_(ITaskbarList3, IUnknown) {
STDMETHOD (SetOverlayIcon) (THIS_ HWND hwnd, HICON hIcon, LPCWSTR pszDescription) PURE;
STDMETHOD (SetThumbnailTooltip) (THIS_ HWND hwnd, LPCWSTR pszTip) PURE;
STDMETHOD (SetThumbnailClip) (THIS_ HWND hwnd, RECT *prcClip) PURE;
+
+private:
+ ~ITaskbarList3();
};
typedef ITaskbarList3 *LPITaskbarList3;
diff --git a/backends/taskbar/win32/win32-taskbar.cpp b/backends/taskbar/win32/win32-taskbar.cpp
index 0cfd81e3f2..046ddb1cd0 100644
--- a/backends/taskbar/win32/win32-taskbar.cpp
+++ b/backends/taskbar/win32/win32-taskbar.cpp
@@ -8,19 +8,16 @@
* 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$
- *
*/
// We cannot use common/scummsys.h directly as it will include
@@ -66,7 +63,7 @@
// System.Title property key, values taken from http://msdn.microsoft.com/en-us/library/bb787584.aspx
const PROPERTYKEY PKEY_Title = { /* fmtid = */ { 0xF29F85E0, 0x4FF9, 0x1068, { 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9 } }, /* propID = */ 2 };
-Win32TaskbarManager::Win32TaskbarManager() {
+Win32TaskbarManager::Win32TaskbarManager() : _taskbar(NULL), _count(0), _icon(NULL) {
// Do nothing if not running on Windows 7 or later
if (!isWin7OrLater())
return;
@@ -96,6 +93,9 @@ Win32TaskbarManager::~Win32TaskbarManager() {
_taskbar->Release();
_taskbar = NULL;
+ if (_icon)
+ DestroyIcon(_icon);
+
CoUninitialize();
}
@@ -144,6 +144,123 @@ void Win32TaskbarManager::setProgressState(TaskbarProgressState state) {
_taskbar->SetProgressState(getHwnd(), (TBPFLAG)state);
}
+void Win32TaskbarManager::setCount(int count) {
+ if (_taskbar == NULL)
+ return;
+
+ if (count == 0) {
+ _taskbar->SetOverlayIcon(getHwnd(), NULL, L"");
+ return;
+ }
+
+ // FIXME: This isn't really nice and could use a cleanup.
+ // The only good thing is that it doesn't use GDI+
+ // and thus does not have a dependancy on it,
+ // with the downside of being a lot more ugly.
+ // Maybe replace it by a Graphic::Surface, use
+ // ScummVM font drawing and extract the contents at
+ // the end?
+
+ if (_count != count || _icon == NULL) {
+ // Cleanup previous icon
+ _count = count;
+ if (_icon)
+ DestroyIcon(_icon);
+
+ Common::String countString = (count < 100 ? Common::String::format("%d", count) : "9+");
+
+ // Create transparent background
+ BITMAPV5HEADER bi;
+ ZeroMemory(&bi, sizeof(BITMAPV5HEADER));
+ bi.bV5Size = sizeof(BITMAPV5HEADER);
+ bi.bV5Width = 16;
+ bi.bV5Height = 16;
+ bi.bV5Planes = 1;
+ bi.bV5BitCount = 32;
+ bi.bV5Compression = BI_RGB;
+ // Set 32 BPP alpha format
+ bi.bV5RedMask = 0x00FF0000;
+ bi.bV5GreenMask = 0x0000FF00;
+ bi.bV5BlueMask = 0x000000FF;
+ bi.bV5AlphaMask = 0xFF000000;
+
+ // Get DC
+ HDC hdc;
+ hdc = GetDC(NULL);
+ HDC hMemDC = CreateCompatibleDC(hdc);
+ ReleaseDC(NULL, hdc);
+
+ // Create a bitmap mask
+ HBITMAP hBitmapMask = CreateBitmap(16, 16, 1, 1, NULL);
+
+ // Create the DIB section with an alpha channel
+ void *lpBits;
+ HBITMAP hBitmap = CreateDIBSection(hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&lpBits, NULL, 0);
+ HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
+
+ // Load the icon background
+ HICON hIconBackground = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1002 /* IDI_COUNT */));
+ DrawIconEx(hMemDC, 0, 0, hIconBackground, 16, 16, 0, 0, DI_NORMAL);
+ DeleteObject(hIconBackground);
+
+ // Draw the count
+ LOGFONT lFont;
+ memset(&lFont, 0, sizeof(LOGFONT));
+ lFont.lfHeight = 10;
+ lFont.lfWeight = FW_BOLD;
+ lFont.lfItalic = 1;
+ strcpy(lFont.lfFaceName, "Arial");
+
+ HFONT hFont = CreateFontIndirect(&lFont);
+ SelectObject(hMemDC, hFont);
+
+ RECT rect;
+ SetRect(&rect, 4, 4, 12, 12);
+ SetTextColor(hMemDC, RGB(48, 48, 48));
+ SetBkMode(hMemDC, TRANSPARENT);
+ DrawText(hMemDC, countString.c_str(), -1, &rect, DT_NOCLIP|DT_CENTER);
+
+ // Set the text alpha to fully opaque (we consider the data inside the text rect)
+ DWORD *lpdwPixel = (DWORD *)lpBits;
+ for (int x = 3; x < 12; x++) {
+ for(int y = 3; y < 12; y++) {
+ unsigned char *p = (unsigned char *)(lpdwPixel + x * 16 + y);
+
+ if (p[0] != 0 && p[1] != 0 && p[2] != 0)
+ p[3] = 255;
+ }
+ }
+
+ // Cleanup DC
+ DeleteObject(hFont);
+ SelectObject(hMemDC, hOldBitmap);
+ DeleteDC(hMemDC);
+
+ // Prepare our new icon
+ ICONINFO ii;
+ ii.fIcon = FALSE;
+ ii.xHotspot = 0;
+ ii.yHotspot = 0;
+ ii.hbmMask = hBitmapMask;
+ ii.hbmColor = hBitmap;
+
+ _icon = CreateIconIndirect(&ii);
+
+ DeleteObject(hBitmap);
+ DeleteObject(hBitmapMask);
+
+ if (!_icon) {
+ warning("[Win32TaskbarManager::setCount] Cannot create icon for count");
+ return;
+ }
+ }
+
+ // Sets the overlay icon
+ LPWSTR desc = ansiToUnicode(Common::String::format("Found games: %d", count).c_str());
+ _taskbar->SetOverlayIcon(getHwnd(), _icon, desc);
+ delete[] desc;
+}
+
void Win32TaskbarManager::addRecent(const Common::String &name, const Common::String &description) {
//warning("[Win32TaskbarManager::addRecent] Adding recent list entry: %s (%s)", name.c_str(), description.c_str());
@@ -200,6 +317,15 @@ void Win32TaskbarManager::addRecent(const Common::String &name, const Common::St
}
}
+void Win32TaskbarManager::notifyError() {
+ setProgressState(Common::TaskbarManager::kTaskbarError);
+ setProgressValue(1, 1);
+}
+
+void Win32TaskbarManager::clearError() {
+ setProgressState(kTaskbarNoProgress);
+}
+
Common::String Win32TaskbarManager::getIconPath(Common::String target) {
// We first try to look for a iconspath configuration variable then
// fallback to the extra path
@@ -232,6 +358,28 @@ Common::String Win32TaskbarManager::getIconPath(Common::String target) {
return "";
}
+// VerSetConditionMask and VerifyVersionInfo didn't appear until Windows 2000,
+// so we need to check for them at runtime
+LONGLONG VerSetConditionMaskFunc(ULONGLONG dwlConditionMask, DWORD dwTypeMask, BYTE dwConditionMask) {
+ typedef BOOL (WINAPI *VerSetConditionMaskFunction)(ULONGLONG conditionMask, DWORD typeMask, BYTE conditionOperator);
+
+ VerSetConditionMaskFunction verSetConditionMask = (VerSetConditionMaskFunction)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "VerSetConditionMask");
+ if (verSetConditionMask == NULL)
+ return 0;
+
+ return verSetConditionMask(dwlConditionMask, dwTypeMask, dwConditionMask);
+}
+
+BOOL VerifyVersionInfoFunc(LPOSVERSIONINFOEXA lpVersionInformation, DWORD dwTypeMask, DWORDLONG dwlConditionMask) {
+ typedef BOOL (WINAPI *VerifyVersionInfoFunction)(LPOSVERSIONINFOEXA versionInformation, DWORD typeMask, DWORDLONG conditionMask);
+
+ VerifyVersionInfoFunction verifyVersionInfo = (VerifyVersionInfoFunction)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "VerifyVersionInfoA");
+ if (verifyVersionInfo == NULL)
+ return FALSE;
+
+ return verifyVersionInfo(lpVersionInformation, dwTypeMask, dwlConditionMask);
+}
+
bool Win32TaskbarManager::isWin7OrLater() {
OSVERSIONINFOEX versionInfo;
DWORDLONG conditionMask = 0;
@@ -241,10 +389,10 @@ bool Win32TaskbarManager::isWin7OrLater() {
versionInfo.dwMajorVersion = 6;
versionInfo.dwMinorVersion = 1;
- VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
- VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
+ conditionMask = VerSetConditionMaskFunc(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
+ conditionMask = VerSetConditionMaskFunc(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
- return VerifyVersionInfo(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, conditionMask);
+ return VerifyVersionInfoFunc(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, conditionMask);
}
LPWSTR Win32TaskbarManager::ansiToUnicode(const char *s) {
diff --git a/backends/taskbar/win32/win32-taskbar.h b/backends/taskbar/win32/win32-taskbar.h
index 3415a79bd7..36415c1c57 100644
--- a/backends/taskbar/win32/win32-taskbar.h
+++ b/backends/taskbar/win32/win32-taskbar.h
@@ -8,19 +8,16 @@
* 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 BACKEND_WIN32_TASKBAR_H
@@ -41,11 +38,18 @@ public:
virtual void setOverlayIcon(const Common::String &name, const Common::String &description);
virtual void setProgressValue(int completed, int total);
virtual void setProgressState(TaskbarProgressState state);
+ virtual void setCount(int count);
virtual void addRecent(const Common::String &name, const Common::String &description);
+ virtual void notifyError();
+ virtual void clearError();
private:
ITaskbarList3 *_taskbar;
+ // Count handling
+ HICON _icon;
+ int _count;
+
/**
* Get the path to an icon for the game
*
diff --git a/backends/timer/bada/timer.cpp b/backends/timer/bada/timer.cpp
new file mode 100755
index 0000000000..8f5620401f
--- /dev/null
+++ b/backends/timer/bada/timer.cpp
@@ -0,0 +1,115 @@
+/* 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.
+ *
+ */
+
+#if defined (BADA)
+
+#include "backends/timer/bada/timer.h"
+
+//
+// TimerSlot
+//
+TimerSlot::TimerSlot(Common::TimerManager::TimerProc callback,
+ uint32 interval, void *refCon) :
+ _timer(0),
+ _callback(callback),
+ _interval(interval),
+ _refCon(refCon) {
+}
+
+TimerSlot::~TimerSlot() {
+}
+
+bool TimerSlot::OnStart() {
+ _timer = new Osp::Base::Runtime::Timer();
+ if (!_timer || IsFailed(_timer->Construct(*this))) {
+ AppLog("Failed to create timer");
+ return false;
+ }
+
+ if (IsFailed(_timer->Start(_interval))) {
+ AppLog("failed to start timer");
+ return false;
+ }
+
+ AppLog("started timer %d", _interval);
+ return true;
+}
+
+void TimerSlot::OnStop() {
+ AppLog("timer stopped");
+ if (_timer) {
+ _timer->Cancel();
+ delete _timer;
+ _timer = NULL;
+ }
+}
+
+void TimerSlot::OnTimerExpired(Timer &timer) {
+ _callback(_refCon);
+ timer.Start(_interval);
+}
+
+//
+// BadaTimerManager
+//
+BadaTimerManager::BadaTimerManager() {
+}
+
+BadaTimerManager::~BadaTimerManager() {
+ for (Common::List<TimerSlot>::iterator slot = _timers.begin();
+ slot != _timers.end(); ++slot) {
+ slot->Stop();
+ slot = _timers.erase(slot);
+ }
+}
+
+bool BadaTimerManager::installTimerProc(TimerProc proc, int32 interval, void *refCon,
+ const Common::String &id) {
+ TimerSlot *slot = new TimerSlot(proc, interval / 1000, refCon);
+
+ if (IsFailed(slot->Construct(THREAD_TYPE_EVENT_DRIVEN))) {
+ AppLog("Failed to create timer thread");
+ delete slot;
+ return false;
+ }
+
+ if (IsFailed(slot->Start())) {
+ delete slot;
+ AppLog("Failed to start timer thread");
+ return false;
+ }
+
+ _timers.push_back(*slot);
+ return true;
+}
+
+void BadaTimerManager::removeTimerProc(TimerProc proc) {
+ for (Common::List<TimerSlot>::iterator slot = _timers.begin();
+ slot != _timers.end(); ++slot) {
+ if (slot->_callback == proc) {
+ slot->Stop();
+ slot = _timers.erase(slot);
+ }
+ }
+}
+
+#endif
diff --git a/backends/timer/bada/timer.h b/backends/timer/bada/timer.h
new file mode 100755
index 0000000000..04ca771c26
--- /dev/null
+++ b/backends/timer/bada/timer.h
@@ -0,0 +1,62 @@
+/* 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 BADA_TIMER_H
+#define BADA_TIMER_H
+
+#include <FBase.h>
+
+#include "common/timer.h"
+#include "common/list.h"
+
+using namespace Osp::Base::Runtime;
+
+struct TimerSlot: public ITimerEventListener, public Thread {
+ TimerSlot(Common::TimerManager::TimerProc callback,
+ uint32 interval,
+ void *refCon);
+ ~TimerSlot();
+
+ bool OnStart(void);
+ void OnStop(void);
+ void OnTimerExpired(Timer &timer);
+
+ Timer *_timer;
+ Common::TimerManager::TimerProc _callback;
+ uint32 _interval; // in microseconds
+ void *_refCon;
+};
+
+class BadaTimerManager : public Common::TimerManager {
+public:
+ BadaTimerManager();
+ ~BadaTimerManager();
+
+ bool installTimerProc(TimerProc proc, int32 interval, void *refCon,
+ const Common::String &id);
+ void removeTimerProc(TimerProc proc);
+
+private:
+ Common::List<TimerSlot> _timers;
+};
+
+#endif
diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp
index 8480fcc7ee..e1aadb62b8 100644
--- a/backends/timer/default/default-timer.cpp
+++ b/backends/timer/default/default-timer.cpp
@@ -24,10 +24,10 @@
#include "common/util.h"
#include "common/system.h"
-
struct TimerSlot {
Common::TimerManager::TimerProc callback;
void *refCon;
+ Common::String id;
uint32 interval; // in microseconds
uint32 nextFireTime; // in milliseconds
@@ -109,13 +109,28 @@ void DefaultTimerManager::handler() {
}
}
-bool DefaultTimerManager::installTimerProc(TimerProc callback, int32 interval, void *refCon) {
+bool DefaultTimerManager::installTimerProc(TimerProc callback, int32 interval, void *refCon, const Common::String &id) {
assert(interval > 0);
Common::StackLock lock(_mutex);
+ if (_callbacks.contains(id)) {
+ if (_callbacks[id] != callback) {
+ error("Different callbacks are referred by same name (%s)", id.c_str());
+ }
+ }
+ TimerSlotMap::const_iterator i;
+
+ for (i = _callbacks.begin(); i != _callbacks.end(); ++i) {
+ if (i->_value == callback) {
+ error("Same callback is referred by different names (%s vs %s)", i->_key.c_str(), id.c_str());
+ }
+ }
+ _callbacks[id] = callback;
+
TimerSlot *slot = new TimerSlot;
slot->callback = callback;
slot->refCon = refCon;
+ slot->id = id;
slot->interval = interval;
slot->nextFireTime = g_system->getMillis() + interval / 1000;
slot->nextFireTimeMicro = interval % 1000;
@@ -146,4 +161,21 @@ void DefaultTimerManager::removeTimerProc(TimerProc callback) {
slot = slot->next;
}
}
+
+ // We need to remove all names referencing the timer proc here.
+ //
+ // Else we run into troubles, when the client code removes and readds timer
+ // callbacks.
+ //
+ // Another issues occurs when one plays a game with ALSA as music driver,
+ // does RTL and starts a different engine game with ALSA as music driver.
+ // In this case the MPU401 code will add different timer procs with the
+ // same name, resulting in two different callbacks added with the same
+ // name and causing installTimerProc to error out.
+ // A good test case is running a SCUMM with ALSA output and then a KYRA
+ // game for example.
+ for (TimerSlotMap::iterator i = _callbacks.begin(), end = _callbacks.end(); i != end; ++i) {
+ if (i->_value == callback)
+ _callbacks.erase(i);
+ }
}
diff --git a/backends/timer/default/default-timer.h b/backends/timer/default/default-timer.h
index 66d2e3b091..e5a9dada79 100644
--- a/backends/timer/default/default-timer.h
+++ b/backends/timer/default/default-timer.h
@@ -22,6 +22,8 @@
#ifndef BACKENDS_TIMER_DEFAULT_H
#define BACKENDS_TIMER_DEFAULT_H
+#include "common/str.h"
+#include "common/hash-str.h"
#include "common/timer.h"
#include "common/mutex.h"
@@ -29,14 +31,17 @@ struct TimerSlot;
class DefaultTimerManager : public Common::TimerManager {
private:
+ typedef Common::HashMap<Common::String, TimerProc, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TimerSlotMap;
+
Common::Mutex _mutex;
void *_timerHandler;
TimerSlot *_head;
+ TimerSlotMap _callbacks;
public:
DefaultTimerManager();
virtual ~DefaultTimerManager();
- virtual bool installTimerProc(TimerProc proc, int32 interval, void *refCon);
+ virtual bool installTimerProc(TimerProc proc, int32 interval, void *refCon, const Common::String &id);
virtual void removeTimerProc(TimerProc proc);
/**
diff --git a/backends/updates/macosx/macosx-updates.h b/backends/updates/macosx/macosx-updates.h
new file mode 100644
index 0000000000..8c9ac1f743
--- /dev/null
+++ b/backends/updates/macosx/macosx-updates.h
@@ -0,0 +1,48 @@
+/* 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 BACKENDS_UPDATES_MACOSX_H
+#define BACKENDS_UPDATES_MACOSX_H
+
+#include "common/scummsys.h"
+
+#if defined(MACOSX) && defined(USE_SPARKLE)
+
+#include "common/updates.h"
+
+class MacOSXUpdateManager : public Common::UpdateManager {
+public:
+ MacOSXUpdateManager();
+ virtual ~MacOSXUpdateManager();
+
+ virtual void checkForUpdates();
+
+ virtual void setAutomaticallyChecksForUpdates(UpdateState state);
+ virtual UpdateState getAutomaticallyChecksForUpdates();
+
+ virtual void setUpdateCheckInterval(UpdateInterval interval);
+ virtual UpdateInterval getUpdateCheckInterval();
+};
+
+#endif
+
+#endif // BACKENDS_UPDATES_MACOSX_H
diff --git a/backends/updates/macosx/macosx-updates.mm b/backends/updates/macosx/macosx-updates.mm
new file mode 100644
index 0000000000..741e89891c
--- /dev/null
+++ b/backends/updates/macosx/macosx-updates.mm
@@ -0,0 +1,127 @@
+/* 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.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+#include "backends/updates/macosx/macosx-updates.h"
+
+#ifdef USE_SPARKLE
+#include "common/translation.h"
+
+#include <Cocoa/Cocoa.h>
+#include <Sparkle/Sparkle.h>
+
+SUUpdater *sparkleUpdater;
+
+/**
+ * Sparkle is a software update framework for Mac OS X which uses appcasts for
+ * release information. Appcasts are RSS-like XML feeds which contain information
+ * about the most current version at the time. If a new version is available, the
+ * user is presented the release-notes/changes/fixes and is asked if he wants to
+ * update, and if yes the Sparkle framework downloads a signed update package
+ * from the server and automatically installs and restarts the software.
+ * More detailed information is available at the following address:
+ * http://sparkle.andymatuschak.org/
+ *
+ */
+MacOSXUpdateManager::MacOSXUpdateManager() {
+ NSMenuItem *menuItem = [[NSApp mainMenu] itemAtIndex:0];
+ NSMenu *applicationMenu = [menuItem submenu];
+
+ // Init Sparkle
+ sparkleUpdater = [SUUpdater sharedUpdater];
+
+ NSBundle* mainBundle = [NSBundle mainBundle];
+
+ NSString* feedbackURL = [mainBundle objectForInfoDictionaryKey:@"SUFeedURL"];
+
+ // Set appcast URL
+ [sparkleUpdater setFeedURL:[NSURL URLWithString:feedbackURL]];
+
+ // Get current encoding
+ NSStringEncoding stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)[NSString stringWithCString:(TransMan.getCurrentCharset()).c_str() encoding:NSASCIIStringEncoding]));
+
+ // Add "Check for Updates..." menu item
+ NSMenuItem *updateMenuItem = [applicationMenu insertItemWithTitle:[NSString stringWithCString:_("Check for Updates...") encoding:stringEncoding] action:@selector(checkForUpdates:) keyEquivalent:@"" atIndex:1];
+
+ // Set the target of the new menu item
+ [updateMenuItem setTarget:sparkleUpdater];
+
+ // Finally give up our references to the objects
+ [menuItem release];
+
+ // Enable automatic update checking once a day (alternatively use
+ // checkForUpdates() here to check for updates on every startup)
+ // TODO: Should be removed when an update settings gui is implemented
+ setAutomaticallyChecksForUpdates(kUpdateStateEnabled);
+ setUpdateCheckInterval(kUpdateIntervalOneDay);
+}
+
+MacOSXUpdateManager::~MacOSXUpdateManager() {
+ [sparkleUpdater release];
+}
+
+void MacOSXUpdateManager::checkForUpdates() {
+ [sparkleUpdater checkForUpdatesInBackground];
+}
+
+void MacOSXUpdateManager::setAutomaticallyChecksForUpdates(UpdateManager::UpdateState state) {
+ if (state == kUpdateStateNotSupported)
+ return;
+
+ [sparkleUpdater setAutomaticallyChecksForUpdates:(state == kUpdateStateEnabled ? YES : NO)];
+}
+
+Common::UpdateManager::UpdateState MacOSXUpdateManager::getAutomaticallyChecksForUpdates() {
+ if ([sparkleUpdater automaticallyChecksForUpdates])
+ return kUpdateStateEnabled;
+ else
+ return kUpdateStateDisabled;
+}
+
+void MacOSXUpdateManager::setUpdateCheckInterval(UpdateInterval interval) {
+ if (interval == kUpdateIntervalNotSupported)
+ return;
+
+ [sparkleUpdater setUpdateCheckInterval:(NSTimeInterval)interval];
+}
+
+Common::UpdateManager::UpdateInterval MacOSXUpdateManager::getUpdateCheckInterval() {
+ // This is kind of a hack but necessary, as the value stored by Sparkle
+ // might have been changed outside of ScummVM (in which case we return the
+ // default interval of one day)
+
+ UpdateInterval updateInterval = (UpdateInterval)[sparkleUpdater updateCheckInterval];
+ switch (updateInterval) {
+ case kUpdateIntervalOneDay:
+ case kUpdateIntervalOneWeek:
+ case kUpdateIntervalOneMonth:
+ return updateInterval;
+
+ default:
+ // Return the default value (one day)
+ return kUpdateIntervalOneDay;
+ }
+}
+
+#endif
diff --git a/backends/vkeybd/virtual-keyboard-parser.cpp b/backends/vkeybd/virtual-keyboard-parser.cpp
index 5e4ce11fe4..58f0c468f6 100644
--- a/backends/vkeybd/virtual-keyboard-parser.cpp
+++ b/backends/vkeybd/virtual-keyboard-parser.cpp
@@ -205,6 +205,9 @@ bool VirtualKeyboardParser::parserCallback_event(ParserNode *node) {
evt->type = VirtualKeyboard::kVKEventModifier;
byte *flags = (byte*) malloc(sizeof(byte));
+ if (!flags)
+ error("[VirtualKeyboardParser::parserCallback_event] Cannot allocate memory");
+
*(flags) = parseFlags(node->values["modifiers"]);
evt->data = flags;
@@ -217,6 +220,9 @@ bool VirtualKeyboardParser::parserCallback_event(ParserNode *node) {
evt->type = VirtualKeyboard::kVKEventSwitchMode;
String& mode = node->values["mode"];
char *str = (char*) malloc(sizeof(char) * mode.size() + 1);
+ if (!str)
+ error("[VirtualKeyboardParser::parserCallback_event] Cannot allocate memory");
+
memcpy(str, mode.c_str(), sizeof(char) * mode.size());
str[mode.size()] = 0;
evt->data = str;
diff --git a/backends/vkeybd/virtual-keyboard.cpp b/backends/vkeybd/virtual-keyboard.cpp
index afdb800562..1dada06951 100644
--- a/backends/vkeybd/virtual-keyboard.cpp
+++ b/backends/vkeybd/virtual-keyboard.cpp
@@ -417,4 +417,3 @@ bool VirtualKeyboard::KeyPressQueue::hasStringChanged() {
} // End of namespace Common
#endif // #ifdef ENABLE_VKEYBD
-
diff --git a/base/commandLine.cpp b/base/commandLine.cpp
index 61853a1ebc..6550f60670 100644
--- a/base/commandLine.cpp
+++ b/base/commandLine.cpp
@@ -25,6 +25,8 @@
#define FORBIDDEN_SYMBOL_EXCEPTION_exit
+#include <limits.h>
+
#include "engines/metaengine.h"
#include "base/commandLine.h"
#include "base/plugins.h"
@@ -63,6 +65,9 @@ static const char HELP_STRING[] =
" -z, --list-games Display list of supported games and exit\n"
" -t, --list-targets Display list of configured targets and exit\n"
" --list-saves=TARGET Display a list of savegames for the game (TARGET) specified\n"
+#if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
+ " --console Enable the console window (default:enabled)\n"
+#endif
"\n"
" -c, --config=CONFIG Use alternate configuration file\n"
" -p, --path=PATH Path to where the game is installed\n"
@@ -179,8 +184,8 @@ void registerDefaults() {
ConfMan.registerDefault("native_mt32", false);
ConfMan.registerDefault("enable_gs", false);
ConfMan.registerDefault("midi_gain", 100);
-// ConfMan.registerDefault("music_driver", ???);
+ ConfMan.registerDefault("music_driver", "auto");
ConfMan.registerDefault("mt32_device", "null");
ConfMan.registerDefault("gm_device", "null");
@@ -229,13 +234,6 @@ void registerDefaults() {
ConfMan.registerDefault("record_temp_file_name", "record.tmp");
ConfMan.registerDefault("record_time_file_name", "record.time");
-#if 0
- // NEW CODE TO HIDE CONSOLE FOR WIN32
-#ifdef WIN32
- // console hiding for win32
- ConfMan.registerDefault("show_console", false);
-#endif
-#endif
}
//
@@ -264,17 +262,19 @@ void registerDefaults() {
if (!option) usage("Option '%s' requires an argument", argv[isLongCmd ? i : i-1]);
// Use this for options which have a required integer value
+// (we don't check ERANGE because WinCE doesn't support errno, so we're stuck just rejecting LONG_MAX/LONG_MIN..)
#define DO_OPTION_INT(shortCmd, longCmd) \
DO_OPTION(shortCmd, longCmd) \
- char *endptr = 0; \
- strtol(option, &endptr, 0); \
- if (endptr == NULL || *endptr != 0) usage("--%s: Invalid number '%s'", longCmd, option);
+ char *endptr; \
+ long int retval = strtol(option, &endptr, 0); \
+ if (*endptr != '\0' || retval == LONG_MAX || retval == LONG_MIN) \
+ usage("--%s: Invalid number '%s'", longCmd, option);
// Use this for boolean options; this distinguishes between "-x" and "-X",
// resp. between "--some-option" and "--no-some-option".
#define DO_OPTION_BOOL(shortCmd, longCmd) \
if (isLongCmd ? (!strcmp(s+2, longCmd) || !strcmp(s+2, "no-"longCmd)) : (tolower(s[1]) == shortCmd)) { \
- bool boolValue = (islower(s[1]) != 0); \
+ bool boolValue = (islower(static_cast<unsigned char>(s[1])) != 0); \
s += 2; \
if (isLongCmd) { \
boolValue = !strcmp(s, longCmd); \
@@ -550,14 +550,11 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha
END_OPTION
#endif
-#if 0
- // NEW CODE TO HIDE CONSOLE FOR WIN32
-#ifdef WIN32
- // console hiding for win32
- DO_LONG_OPTION_BOOL("show-console")
+#if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
+ // Optional console window on Windows (default: enabled)
+ DO_LONG_OPTION_BOOL("console")
END_OPTION
#endif
-#endif
unknownOption:
// If we get till here, the option is unhandled and hence unknown.
@@ -665,7 +662,7 @@ static Common::Error listSaves(const char *target) {
" ---- ------------------------------------------------------\n");
for (SaveStateList::const_iterator x = saveList.begin(); x != saveList.end(); ++x) {
- printf(" %-4s %s\n", x->save_slot().c_str(), x->description().c_str());
+ printf(" %-4d %s\n", x->getSaveSlot(), x->getDescription().c_str());
// TODO: Could also iterate over the full hashmap, printing all key-value pairs
}
} else {
diff --git a/base/internal_version.h b/base/internal_version.h
index bb25bce4e4..5392012169 100644
--- a/base/internal_version.h
+++ b/base/internal_version.h
@@ -16,4 +16,4 @@
#define SCUMMVM_REVISION
#endif
-#define SCUMMVM_VERSION "1.4.0git" SCUMMVM_REVISION
+#define SCUMMVM_VERSION "1.5.0git" SCUMMVM_REVISION
diff --git a/base/main.cpp b/base/main.cpp
index 717ccb3344..5d0c0ea09a 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -103,7 +103,7 @@ static const EnginePlugin *detectPlugin() {
// Query the plugins and find one that will handle the specified gameid
printf("User picked target '%s' (gameid '%s')...\n", ConfMan.getActiveDomainName().c_str(), gameid.c_str());
- printf("%s", " Looking for a plugin supporting this gameid... ");
+ printf(" Looking for a plugin supporting this gameid... ");
GameDescriptor game = EngineMan.findGame(gameid, &plugin);
@@ -111,10 +111,7 @@ static const EnginePlugin *detectPlugin() {
printf("failed\n");
warning("%s is an invalid gameid. Use the --list-games option to list supported gameid", gameid.c_str());
} else {
- printf("%s\n", plugin->getName());
-
- // FIXME: Do we really need this one?
- printf(" Starting '%s'\n", game.description().c_str());
+ printf("%s\n Starting '%s'\n", plugin->getName(), game.description().c_str());
}
return plugin;
@@ -186,9 +183,15 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const
}
// If a second extrapath is specified on the app domain level, add that as well.
+ // However, since the default hasKey() and get() check the app domain level,
+ // verify that it's not already there before adding it. The search manager will
+ // check for that too, so this check is mostly to avoid a warning message.
if (ConfMan.hasKey("extrapath", Common::ConfigManager::kApplicationDomain)) {
- dir = Common::FSNode(ConfMan.get("extrapath", Common::ConfigManager::kApplicationDomain));
- SearchMan.addDirectory(dir.getPath(), dir);
+ Common::String extraPath = ConfMan.get("extrapath", Common::ConfigManager::kApplicationDomain);
+ if (!SearchMan.hasArchive(extraPath)) {
+ dir = Common::FSNode(extraPath);
+ SearchMan.addDirectory(dir.getPath(), dir);
+ }
}
// On creation the engine should have set up all debug levels so we can use
@@ -419,6 +422,10 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) {
// Try to run the game
Common::Error result = runGame(plugin, system, specialDebug);
+ // Flush Event recorder file. The recorder does not get reinitialized for next game
+ // which is intentional. Only single game per session is allowed.
+ g_eventRec.deinit();
+
#if defined(UNCACHED_PLUGINS) && defined(DYNAMIC_MODULES)
// do our best to prevent fragmentation by unloading as soon as we can
PluginManager::instance().unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL, false);
diff --git a/base/plugins.cpp b/base/plugins.cpp
index 261ae4ca59..f9ac338d40 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -94,9 +94,15 @@ public:
#if PLUGIN_ENABLED_STATIC(AGOS)
LINK_PLUGIN(AGOS)
#endif
+ #if PLUGIN_ENABLED_STATIC(CGE)
+ LINK_PLUGIN(CGE)
+ #endif
#if PLUGIN_ENABLED_STATIC(CINE)
LINK_PLUGIN(CINE)
#endif
+ #if PLUGIN_ENABLED_STATIC(COMPOSER)
+ LINK_PLUGIN(COMPOSER)
+ #endif
#if PLUGIN_ENABLED_STATIC(CRUISE)
LINK_PLUGIN(CRUISE)
#endif
@@ -543,7 +549,9 @@ void PluginManager::addToPluginsInMemList(Plugin *plugin) {
#include "engines/metaengine.h"
+namespace Common {
DECLARE_SINGLETON(EngineManager);
+}
/**
* This function works for both cached and uncached PluginManagers.
@@ -634,7 +642,9 @@ const EnginePlugin::List &EngineManager::getPlugins() const {
#include "audio/musicplugin.h"
+namespace Common {
DECLARE_SINGLETON(MusicManager);
+}
const MusicPlugin::List &MusicManager::getPlugins() const {
return (const MusicPlugin::List &)PluginManager::instance().getPlugins(PLUGIN_TYPE_MUSIC);
diff --git a/base/version.cpp b/base/version.cpp
index c91698cba9..a068f2b141 100644
--- a/base/version.cpp
+++ b/base/version.cpp
@@ -122,4 +122,3 @@ const char *gScummVMFeatures = ""
"AAC "
#endif
;
-
diff --git a/common/EventDispatcher.cpp b/common/EventDispatcher.cpp
index e97068c0d0..4e3f671cfd 100644
--- a/common/EventDispatcher.cpp
+++ b/common/EventDispatcher.cpp
@@ -28,12 +28,12 @@ EventDispatcher::EventDispatcher() : _mapper(0) {
}
EventDispatcher::~EventDispatcher() {
- for (Common::List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
+ for (List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
if (i->autoFree)
delete i->source;
}
- for (Common::List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
+ for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
if (i->autoFree)
delete i->observer;
}
@@ -43,9 +43,11 @@ EventDispatcher::~EventDispatcher() {
}
void EventDispatcher::dispatch() {
- Common::Event event;
+ Event event;
- for (Common::List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
+ dispatchPoll();
+
+ for (List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
const bool allowMapping = i->source->allowMapping();
while (i->source->pollEvent(event)) {
@@ -83,7 +85,7 @@ void EventDispatcher::registerSource(EventSource *source, bool autoFree) {
}
void EventDispatcher::unregisterSource(EventSource *source) {
- for (Common::List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
+ for (List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
if (i->source == source) {
if (i->autoFree)
delete source;
@@ -94,14 +96,15 @@ void EventDispatcher::unregisterSource(EventSource *source) {
}
}
-void EventDispatcher::registerObserver(EventObserver *obs, uint priority, bool autoFree) {
+void EventDispatcher::registerObserver(EventObserver *obs, uint priority, bool autoFree, bool notifyPoll) {
ObserverEntry newEntry;
newEntry.observer = obs;
newEntry.priority = priority;
newEntry.autoFree = autoFree;
+ newEntry.poll = notifyPoll;
- for (Common::List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
+ for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
if (i->priority < priority) {
_observers.insert(i, newEntry);
return;
@@ -112,7 +115,7 @@ void EventDispatcher::registerObserver(EventObserver *obs, uint priority, bool a
}
void EventDispatcher::unregisterObserver(EventObserver *obs) {
- for (Common::List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
+ for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
if (i->observer == obs) {
if (i->autoFree)
delete obs;
@@ -124,11 +127,18 @@ void EventDispatcher::unregisterObserver(EventObserver *obs) {
}
void EventDispatcher::dispatchEvent(const Event &event) {
- for (Common::List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
+ for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
if (i->observer->notifyEvent(event))
break;
}
}
-} // End of namespace Common
+void EventDispatcher::dispatchPoll() {
+ for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
+ if (i->poll == true)
+ if (i->observer->notifyPoll())
+ break;
+ }
+}
+} // End of namespace Common
diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp
index eb22e1ea88..5e24f128c3 100644
--- a/common/EventRecorder.cpp
+++ b/common/EventRecorder.cpp
@@ -22,19 +22,41 @@
#include "common/EventRecorder.h"
+#include "common/bufferedstream.h"
#include "common/config-manager.h"
#include "common/random.h"
#include "common/savefile.h"
#include "common/textconsole.h"
-DECLARE_SINGLETON(Common::EventRecorder);
-
namespace Common {
+DECLARE_SINGLETON(EventRecorder);
+
#define RECORD_SIGNATURE 0x54455354
#define RECORD_VERSION 1
-void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
+uint32 readTime(ReadStream *inFile) {
+ uint32 d = inFile->readByte();
+ if (d == 0xff) {
+ d = inFile->readUint32LE();
+ }
+
+ return d;
+}
+
+void writeTime(WriteStream *outFile, uint32 d) {
+ //Simple RLE compression
+ if (d >= 0xff) {
+ outFile->writeByte(0xff);
+ outFile->writeUint32LE(d);
+ } else {
+ outFile->writeByte(d);
+ }
+}
+
+void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event, uint32 &millis) {
+ millis = readTime(inFile);
+
diff = inFile->readUint32LE();
event.type = (EventType)inFile->readUint32LE();
@@ -53,6 +75,8 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
case EVENT_RBUTTONUP:
case EVENT_WHEELUP:
case EVENT_WHEELDOWN:
+ case EVENT_MBUTTONDOWN:
+ case EVENT_MBUTTONUP:
event.mouse.x = inFile->readSint16LE();
event.mouse.y = inFile->readSint16LE();
break;
@@ -61,7 +85,9 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
}
}
-void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) {
+void writeRecord(WriteStream *outFile, uint32 diff, const Event &event, uint32 millis) {
+ writeTime(outFile, millis);
+
outFile->writeUint32LE(diff);
outFile->writeUint32LE((uint32)event.type);
@@ -80,6 +106,8 @@ void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) {
case EVENT_RBUTTONUP:
case EVENT_WHEELUP:
case EVENT_WHEELDOWN:
+ case EVENT_MBUTTONDOWN:
+ case EVENT_MBUTTONUP:
outFile->writeSint16LE(event.mouse.x);
outFile->writeSint16LE(event.mouse.y);
break;
@@ -99,23 +127,31 @@ EventRecorder::EventRecorder() {
_eventCount = 0;
_lastEventCount = 0;
_lastMillis = 0;
+ _lastEventMillis = 0;
_recordMode = kPassthrough;
}
EventRecorder::~EventRecorder() {
deinit();
+
+ g_system->deleteMutex(_timeMutex);
+ g_system->deleteMutex(_recorderMutex);
}
void EventRecorder::init() {
String recordModeString = ConfMan.get("record_mode");
if (recordModeString.compareToIgnoreCase("record") == 0) {
_recordMode = kRecorderRecord;
+
+ debug(3, "EventRecorder: record");
} else {
if (recordModeString.compareToIgnoreCase("playback") == 0) {
_recordMode = kRecorderPlayback;
+ debug(3, "EventRecorder: playback");
} else {
_recordMode = kPassthrough;
+ debug(3, "EventRecorder: passthrough");
}
}
@@ -136,8 +172,8 @@ void EventRecorder::init() {
if (_recordMode == kRecorderRecord) {
_recordCount = 0;
_recordTimeCount = 0;
- _recordFile = g_system->getSavefileManager()->openForSaving(_recordTempFileName);
- _recordTimeFile = g_system->getSavefileManager()->openForSaving(_recordTimeFileName);
+ _recordFile = wrapBufferedWriteStream(g_system->getSavefileManager()->openForSaving(_recordTempFileName), 128 * 1024);
+ _recordTimeFile = wrapBufferedWriteStream(g_system->getSavefileManager()->openForSaving(_recordTimeFileName), 128 * 1024);
_recordSubtitles = ConfMan.getBool("subtitles");
}
@@ -146,8 +182,8 @@ void EventRecorder::init() {
if (_recordMode == kRecorderPlayback) {
_playbackCount = 0;
_playbackTimeCount = 0;
- _playbackFile = g_system->getSavefileManager()->openForLoading(_recordFileName);
- _playbackTimeFile = g_system->getSavefileManager()->openForLoading(_recordTimeFileName);
+ _playbackFile = wrapBufferedSeekableReadStream(g_system->getSavefileManager()->openForLoading(_recordFileName), 128 * 1024, DisposeAfterUse::YES);
+ _playbackTimeFile = wrapBufferedSeekableReadStream(g_system->getSavefileManager()->openForLoading(_recordTimeFileName), 128 * 1024, DisposeAfterUse::YES);
if (!_playbackFile) {
warning("Cannot open playback file %s. Playback was switched off", _recordFileName.c_str());
@@ -173,6 +209,7 @@ void EventRecorder::init() {
_recordCount = _playbackFile->readUint32LE();
_recordTimeCount = _playbackFile->readUint32LE();
+
randomSourceCount = _playbackFile->readUint32LE();
for (uint i = 0; i < randomSourceCount; ++i) {
RandomSourceRecord rec;
@@ -190,10 +227,12 @@ void EventRecorder::init() {
}
g_system->getEventManager()->getEventDispatcher()->registerSource(this, false);
- g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 1, false);
+ g_system->getEventManager()->getEventDispatcher()->registerObserver(this, EventManager::kEventRecorderPriority, false, true);
}
void EventRecorder::deinit() {
+ debug(3, "EventRecorder: deinit");
+
g_system->getEventManager()->getEventDispatcher()->unregisterSource(this);
g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
@@ -236,8 +275,9 @@ void EventRecorder::deinit() {
for (uint i = 0; i < _recordCount; ++i) {
uint32 tempDiff;
Event tempEvent;
- readRecord(_playbackFile, tempDiff, tempEvent);
- writeRecord(_recordFile, tempDiff, tempEvent);
+ uint32 millis;
+ readRecord(_playbackFile, tempDiff, tempEvent, millis);
+ writeRecord(_recordFile, tempDiff, tempEvent, millis);
}
_recordFile->finalize();
@@ -246,9 +286,6 @@ void EventRecorder::deinit() {
//TODO: remove recordTempFileName'ed file
}
-
- g_system->deleteMutex(_timeMutex);
- g_system->deleteMutex(_recorderMutex);
}
void EventRecorder::registerRandomSource(RandomSource &rnd, const String &name) {
@@ -278,23 +315,23 @@ void EventRecorder::processMillis(uint32 &millis) {
g_system->lockMutex(_timeMutex);
if (_recordMode == kRecorderRecord) {
- //Simple RLE compression
d = millis - _lastMillis;
- if (d >= 0xff) {
- _recordTimeFile->writeByte(0xff);
- _recordTimeFile->writeUint32LE(d);
- } else {
- _recordTimeFile->writeByte(d);
- }
+ writeTime(_recordTimeFile, d);
+
_recordTimeCount++;
}
if (_recordMode == kRecorderPlayback) {
if (_recordTimeCount > _playbackTimeCount) {
- d = _playbackTimeFile->readByte();
- if (d == 0xff) {
- d = _playbackTimeFile->readUint32LE();
+ d = readTime(_playbackTimeFile);
+
+ while ((_lastMillis + d > millis) && (_lastMillis + d - millis > 50)) {
+ _recordMode = kPassthrough;
+ g_system->delayMillis(50);
+ millis = g_system->getMillis();
+ _recordMode = kRecorderPlayback;
}
+
millis = _lastMillis + d;
_playbackTimeCount++;
}
@@ -304,6 +341,23 @@ void EventRecorder::processMillis(uint32 &millis) {
g_system->unlockMutex(_timeMutex);
}
+bool EventRecorder::processDelayMillis(uint &msecs) {
+ if (_recordMode == kRecorderPlayback) {
+ _recordMode = kPassthrough;
+
+ uint32 millis = g_system->getMillis();
+
+ _recordMode = kRecorderPlayback;
+
+ if (_lastMillis > millis) {
+ // Skip delay if we're getting late
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool EventRecorder::notifyEvent(const Event &ev) {
if (_recordMode != kRecorderRecord)
return false;
@@ -311,15 +365,27 @@ bool EventRecorder::notifyEvent(const Event &ev) {
StackLock lock(_recorderMutex);
++_eventCount;
- writeRecord(_recordFile, _eventCount - _lastEventCount, ev);
+ writeRecord(_recordFile, _eventCount - _lastEventCount, ev, _lastMillis - _lastEventMillis);
_recordCount++;
_lastEventCount = _eventCount;
+ _lastEventMillis = _lastMillis;
+
+ return false;
+}
+
+bool EventRecorder::notifyPoll() {
+ if (_recordMode != kRecorderRecord)
+ return false;
+
+ ++_eventCount;
return false;
}
bool EventRecorder::pollEvent(Event &ev) {
+ uint32 millis;
+
if (_recordMode != kRecorderPlayback)
return false;
@@ -328,7 +394,7 @@ bool EventRecorder::pollEvent(Event &ev) {
if (!_hasPlaybackEvent) {
if (_recordCount > _playbackCount) {
- readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent);
+ readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent, millis);
_playbackCount++;
_hasPlaybackEvent = true;
}
@@ -360,4 +426,3 @@ bool EventRecorder::pollEvent(Event &ev) {
}
} // End of namespace Common
-
diff --git a/common/EventRecorder.h b/common/EventRecorder.h
index 8377d9e8bd..43a08b08cd 100644
--- a/common/EventRecorder.h
+++ b/common/EventRecorder.h
@@ -56,8 +56,12 @@ public:
/** TODO: Add documentation, this is only used by the backend */
void processMillis(uint32 &millis);
+ /** TODO: Add documentation, this is only used by the backend */
+ bool processDelayMillis(uint &msecs);
+
private:
bool notifyEvent(const Event &ev);
+ bool notifyPoll();
bool pollEvent(Event &ev);
bool allowMapping() const { return false; }
@@ -72,6 +76,7 @@ private:
volatile uint32 _recordCount;
volatile uint32 _lastRecordEvent;
volatile uint32 _recordTimeCount;
+ volatile uint32 _lastEventMillis;
WriteStream *_recordFile;
WriteStream *_recordTimeFile;
MutexRef _timeMutex;
@@ -103,4 +108,3 @@ private:
} // End of namespace Common
#endif
-
diff --git a/common/algorithm.h b/common/algorithm.h
index 00c0e1c98f..e7ccef4840 100644
--- a/common/algorithm.h
+++ b/common/algorithm.h
@@ -226,12 +226,12 @@ void sort(T first, T last, StrictWeakOrdering comp) {
*/
template<typename T>
void sort(T *first, T *last) {
- sort(first, last, Common::Less<T>());
+ sort(first, last, Less<T>());
}
template<class T>
void sort(T first, T last) {
- sort(first, last, Common::Less<typename T::ValueType>());
+ sort(first, last, Less<typename T::ValueType>());
}
// MSVC is complaining about the minus operator being applied to an unsigned type
@@ -269,4 +269,3 @@ T gcd(T a, T b) {
} // End of namespace Common
#endif
-
diff --git a/common/archive.cpp b/common/archive.cpp
index 0ef3893a8c..954de8bcaa 100644
--- a/common/archive.cpp
+++ b/common/archive.cpp
@@ -147,7 +147,7 @@ void SearchSet::addSubDirectoriesMatching(const FSNode &directory, String origPa
for (FSList::const_iterator i = subDirs.begin(); i != subDirs.end(); ++i) {
String name = i->getName();
- if (Common::matchString(name.c_str(), pattern.c_str(), ignoreCase)) {
+ if (matchString(name.c_str(), pattern.c_str(), ignoreCase)) {
matchIter = multipleMatches.find(name);
if (matchIter == multipleMatches.end()) {
multipleMatches[name] = true;
@@ -285,7 +285,6 @@ void SearchManager::clear() {
addDirectory(".", ".", -2);
}
-} // namespace Common
-
-DECLARE_SINGLETON(Common::SearchManager);
+DECLARE_SINGLETON(SearchManager);
+} // namespace Common
diff --git a/common/archive.h b/common/archive.h
index 8400c56d69..c8e78f9bc8 100644
--- a/common/archive.h
+++ b/common/archive.h
@@ -254,7 +254,7 @@ public:
virtual void clear();
private:
- friend class Common::Singleton<SingletonBaseType>;
+ friend class Singleton<SingletonBaseType>;
SearchManager();
};
diff --git a/common/array.h b/common/array.h
index e5434091fb..18cecfb98f 100644
--- a/common/array.h
+++ b/common/array.h
@@ -42,7 +42,7 @@ namespace Common {
* management scheme. There, only elements that 'live' are actually constructed
* (i.e., have their constructor called), and objects that are removed are
* immediately destructed (have their destructor called).
- * With Common::Array, this is not the case; instead, it simply uses new[] and
+ * With Array, this is not the case; instead, it simply uses new[] and
* delete[] to allocate whole blocks of objects, possibly more than are
* currently 'alive'. This simplifies memory management, but may have
* undesirable side effects when one wants to use an Array of complex
@@ -274,7 +274,7 @@ protected:
if (capacity) {
_storage = new T[capacity];
if (!_storage)
- ::error("Common::Array: failure to allocate %d bytes", capacity);
+ ::error("Common::Array: failure to allocate %u bytes", capacity * (uint)sizeof(T));
} else {
_storage = 0;
}
diff --git a/common/bitstream.h b/common/bitstream.h
new file mode 100644
index 0000000000..c8c8c11fca
--- /dev/null
+++ b/common/bitstream.h
@@ -0,0 +1,325 @@
+/* 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.
+ *
+ */
+
+// Based on eos' BitStream implementation
+
+#ifndef COMMON_BITSTREAM_H
+#define COMMON_BITSTREAM_H
+
+#include "common/scummsys.h"
+#include "common/textconsole.h"
+#include "common/stream.h"
+
+namespace Common {
+
+/** A bit stream. */
+class BitStream {
+public:
+ virtual ~BitStream() {
+ }
+
+ /** Return the stream position in bits. */
+ virtual uint32 pos() const = 0;
+
+ /** Return the stream size in bits. */
+ virtual uint32 size() const = 0;
+
+ /** Has the end of the stream been reached? */
+ virtual bool eos() const = 0;
+
+ /** Rewind the bit stream back to the start. */
+ virtual void rewind() = 0;
+
+ /** Skip the specified amount of bits. */
+ virtual void skip(uint32 n) = 0;
+
+ /** Read a bit from the bit stream. */
+ virtual uint32 getBit() = 0;
+
+ /** Read a multi-bit value from the bit stream. */
+ virtual uint32 getBits(uint8 n) = 0;
+
+ /** Read a bit from the bit stream, without changing the stream's position. */
+ virtual uint32 peekBit() = 0;
+
+ /** Read a multi-bit value from the bit stream, without changing the stream's position. */
+ virtual uint32 peekBits(uint8 n) = 0;
+
+ /** Add a bit to the value x, making it an n+1-bit value. */
+ virtual void addBit(uint32 &x, uint32 n) = 0;
+
+protected:
+ BitStream() {
+ }
+};
+
+/**
+ * A template implementing a bit stream for different data memory layouts.
+ *
+ * Such a bit stream reads valueBits-wide values from the data stream and
+ * gives access to their bits, one at a time.
+ *
+ * For example, a bit stream with the layout parameters 32, true, false
+ * for valueBits, isLE and isMSB2LSB, reads 32bit little-endian values
+ * from the data stream and hands out the bits in the order of LSB to MSB.
+ */
+template<int valueBits, bool isLE, bool isMSB2LSB>
+class BitStreamImpl : public BitStream {
+private:
+ SeekableReadStream *_stream; ///< The input stream.
+ bool _disposeAfterUse; ///< Should we delete the stream on destruction?
+
+ uint32 _value; ///< Current value.
+ uint8 _inValue; ///< Position within the current value.
+
+ /** Read a data value. */
+ inline uint32 readData() {
+ if (isLE) {
+ if (valueBits == 8)
+ return _stream->readByte();
+ if (valueBits == 16)
+ return _stream->readUint16LE();
+ if (valueBits == 32)
+ return _stream->readUint32LE();
+ } else {
+ if (valueBits == 8)
+ return _stream->readByte();
+ if (valueBits == 16)
+ return _stream->readUint16BE();
+ if (valueBits == 32)
+ return _stream->readUint32BE();
+ }
+
+ assert(false);
+ return 0;
+ }
+
+ /** Read the next data value. */
+ inline void readValue() {
+ if ((size() - pos()) < valueBits)
+ error("BitStreamImpl::readValue(): End of bit stream reached");
+
+ _value = readData();
+ if (_stream->err() || _stream->eos())
+ error("BitStreamImpl::readValue(): Read error");
+
+ // If we're reading the bits MSB first, we need to shift the value to that position
+ if (isMSB2LSB)
+ _value <<= 32 - valueBits;
+ }
+
+public:
+ /** Create a bit stream using this input data stream and optionally delete it on destruction. */
+ BitStreamImpl(SeekableReadStream *stream, bool disposeAfterUse = false) :
+ _stream(stream), _disposeAfterUse(disposeAfterUse), _value(0), _inValue(0) {
+
+ if ((valueBits != 8) && (valueBits != 16) && (valueBits != 32))
+ error("BitStreamImpl: Invalid memory layout %d, %d, %d", valueBits, isLE, isMSB2LSB);
+ }
+
+ /** Create a bit stream using this input data stream. */
+ BitStreamImpl(SeekableReadStream &stream) :
+ _stream(&stream), _disposeAfterUse(false), _value(0), _inValue(0) {
+
+ if ((valueBits != 8) && (valueBits != 16) && (valueBits != 32))
+ error("BitStreamImpl: Invalid memory layout %d, %d, %d", valueBits, isLE, isMSB2LSB);
+ }
+
+ ~BitStreamImpl() {
+ if (_disposeAfterUse)
+ delete _stream;
+ }
+
+ /** Read a bit from the bit stream. */
+ uint32 getBit() {
+ // Check if we need the next value
+ if (_inValue == 0)
+ readValue();
+
+ // Get the current bit
+ int b = 0;
+ if (isMSB2LSB)
+ b = ((_value & 0x80000000) == 0) ? 0 : 1;
+ else
+ b = ((_value & 1) == 0) ? 0 : 1;
+
+ // Shift to the next bit
+ if (isMSB2LSB)
+ _value <<= 1;
+ else
+ _value >>= 1;
+
+ // Increase the position within the current value
+ _inValue = (_inValue + 1) % valueBits;
+
+ return b;
+ }
+
+ /**
+ * Read a multi-bit value from the bit stream.
+ *
+ * The value is read as if just taken as a whole from the bitstream.
+ *
+ * For example:
+ * Reading a 4-bit value from an 8-bit bitstream with the contents 01010011:
+ * If the bitstream is MSB2LSB, the 4-bit value would be 0101.
+ * If the bitstream is LSB2MSB, the 4-bit value would be 0011.
+ */
+ uint32 getBits(uint8 n) {
+ if (n == 0)
+ return 0;
+
+ if (n > 32)
+ error("BitStreamImpl::getBits(): Too many bits requested to be read");
+
+ // Read the number of bits
+ uint32 v = 0;
+
+ if (isMSB2LSB) {
+ while (n-- > 0)
+ v = (v << 1) | getBit();
+ } else {
+ for (uint32 i = 0; i < n; i++)
+ v = (v >> 1) | (((uint32) getBit()) << 31);
+
+ v >>= (32 - n);
+ }
+
+ return v;
+ }
+
+ /** Read a bit from the bit stream, without changing the stream's position. */
+ uint32 peekBit() {
+ uint32 value = _value;
+ uint8 inValue = _inValue;
+ uint32 curPos = _stream->pos();
+
+ uint32 v = getBit();
+
+ _stream->seek(curPos);
+ _inValue = inValue;
+ _value = value;
+
+ return v;
+ }
+
+ /**
+ * Read a multi-bit value from the bit stream, without changing the stream's position.
+ *
+ * The bit order is the same as in getBits().
+ */
+ uint32 peekBits(uint8 n) {
+ uint32 value = _value;
+ uint8 inValue = _inValue;
+ uint32 curPos = _stream->pos();
+
+ uint32 v = getBits(n);
+
+ _stream->seek(curPos);
+ _inValue = inValue;
+ _value = value;
+
+ return v;
+ }
+
+ /**
+ * Add a bit to the value x, making it an n+1-bit value.
+ *
+ * The current value is shifted and the bit is added to the
+ * appropriate place, dependant on the stream's bitorder.
+ *
+ * For example:
+ * A bit y is added to the value 00001100 with size 4.
+ * If the stream's bitorder is MSB2LSB, the resulting value is 0001100y.
+ * If the stream's bitorder is LSB2MSB, the resulting value is 000y1100.
+ */
+ void addBit(uint32 &x, uint32 n) {
+ if (n >= 32)
+ error("BitStreamImpl::addBit(): Too many bits requested to be read");
+
+ if (isMSB2LSB)
+ x = (x << 1) | getBit();
+ else
+ x = (x & ~(1 << n)) | (getBit() << n);
+ }
+
+ /** Rewind the bit stream back to the start. */
+ void rewind() {
+ _stream->seek(0);
+
+ _value = 0;
+ _inValue = 0;
+ }
+
+ /** Skip the specified amount of bits. */
+ void skip(uint32 n) {
+ while (n-- > 0)
+ getBit();
+ }
+
+ /** Return the stream position in bits. */
+ uint32 pos() const {
+ if (_stream->pos() == 0)
+ return 0;
+
+ uint32 p = (_inValue == 0) ? _stream->pos() : ((_stream->pos() - 1) & ~((uint32) ((valueBits >> 3) - 1)));
+ return p * 8 + _inValue;
+ }
+
+ /** Return the stream size in bits. */
+ uint32 size() const {
+ return (_stream->size() & ~((uint32) ((valueBits >> 3) - 1))) * 8;
+ }
+
+ bool eos() const {
+ return _stream->eos() || (pos() >= size());
+ }
+};
+
+// typedefs for various memory layouts.
+
+/** 8-bit data, MSB to LSB. */
+typedef BitStreamImpl<8, false, true > BitStream8MSB;
+/** 8-bit data, LSB to MSB. */
+typedef BitStreamImpl<8, false, false> BitStream8LSB;
+
+/** 16-bit little-endian data, MSB to LSB. */
+typedef BitStreamImpl<16, true , true > BitStream16LEMSB;
+/** 16-bit little-endian data, LSB to MSB. */
+typedef BitStreamImpl<16, true , false> BitStream16LELSB;
+/** 16-bit big-endian data, MSB to LSB. */
+typedef BitStreamImpl<16, false, true > BitStream16BEMSB;
+/** 16-bit big-endian data, LSB to MSB. */
+typedef BitStreamImpl<16, false, false> BitStream16BELSB;
+
+/** 32-bit little-endian data, MSB to LSB. */
+typedef BitStreamImpl<32, true , true > BitStream32LEMSB;
+/** 32-bit little-endian data, LSB to MSB. */
+typedef BitStreamImpl<32, true , false> BitStream32LELSB;
+/** 32-bit big-endian data, MSB to LSB. */
+typedef BitStreamImpl<32, false, true > BitStream32BEMSB;
+/** 32-bit big-endian data, LSB to MSB. */
+typedef BitStreamImpl<32, false, false> BitStream32BELSB;
+
+} // End of namespace Common
+
+#endif // COMMON_BITSTREAM_H
diff --git a/common/config-file.cpp b/common/config-file.cpp
index 55941131ac..81e0ae6b45 100644
--- a/common/config-file.cpp
+++ b/common/config-file.cpp
@@ -26,19 +26,11 @@
#include "common/system.h"
#include "common/textconsole.h"
-#define MAXLINELEN 256
-
namespace Common {
-/**
- * Check whether the given string is a valid section or key name.
- * For that, it must only consist of letters, numbers, dashes and
- * underscores. In particular, white space and "#", "=", "[", "]"
- * are not valid!
- */
-bool ConfigFile::isValidName(const Common::String &name) {
+bool ConfigFile::isValidName(const String &name) {
const char *p = name.c_str();
- while (*p && (isalnum(*p) || *p == '-' || *p == '_' || *p == '.'))
+ while (*p && (isalnum(static_cast<unsigned char>(*p)) || *p == '-' || *p == '_' || *p == '.'))
p++;
return *p == 0;
}
@@ -116,7 +108,7 @@ bool ConfigFile::loadFromStream(SeekableReadStream &stream) {
// is, verify that it only consists of alphanumerics,
// periods, dashes and underscores). Mohawk Living Books games
// can have periods in their section names.
- while (*p && (isalnum(*p) || *p == '-' || *p == '_' || *p == '.'))
+ while (*p && (isalnum(static_cast<unsigned char>(*p)) || *p == '-' || *p == '_' || *p == '.'))
p++;
if (*p == '\0')
@@ -139,7 +131,7 @@ bool ConfigFile::loadFromStream(SeekableReadStream &stream) {
// Skip leading whitespaces
const char *t = line.c_str();
- while (isspace(*t))
+ while (isspace(static_cast<unsigned char>(*t)))
t++;
// Skip empty lines / lines with only whitespace
@@ -255,10 +247,15 @@ void ConfigFile::renameSection(const String &oldName, const String &newName) {
assert(isValidName(oldName));
assert(isValidName(newName));
- //Section *os = getSection(oldName);
- Section *ns = getSection(newName);
- if (ns) {
- ns->name = newName;
+ Section *os = getSection(oldName);
+ const Section *ns = getSection(newName);
+ if (os) {
+ // HACK: For now we just print a warning, for more info see the TODO
+ // below.
+ if (ns)
+ warning("ConfigFile::renameSection: Section name \"%s\" already used", newName.c_str());
+ else
+ os->name = newName;
}
// TODO: Check here whether there already is a section with the
// new name. Not sure how to cope with that case, we could:
diff --git a/common/config-file.h b/common/config-file.h
index d28ad34036..7bc5604b4c 100644
--- a/common/config-file.h
+++ b/common/config-file.h
@@ -93,7 +93,7 @@ public:
* underscores. In particular, white space and "#", "=", "[", "]"
* are not valid!
*/
- static bool isValidName(const Common::String &name);
+ static bool isValidName(const String &name);
/** Reset everything stored in this config file. */
void clear();
diff --git a/common/config-manager.cpp b/common/config-manager.cpp
index 3941e27cc1..c62dee8bea 100644
--- a/common/config-manager.cpp
+++ b/common/config-manager.cpp
@@ -27,22 +27,22 @@
#include "common/system.h"
#include "common/textconsole.h"
-DECLARE_SINGLETON(Common::ConfigManager);
-
static bool isValidDomainName(const Common::String &domName) {
const char *p = domName.c_str();
- while (*p && (isalnum(*p) || *p == '-' || *p == '_'))
+ while (*p && (isalnum(static_cast<unsigned char>(*p)) || *p == '-' || *p == '_'))
p++;
return *p == 0;
}
namespace Common {
-const char *ConfigManager::kApplicationDomain = "scummvm";
-const char *ConfigManager::kTransientDomain = "__TRANSIENT";
+DECLARE_SINGLETON(ConfigManager);
+
+char const *const ConfigManager::kApplicationDomain = "scummvm";
+char const *const ConfigManager::kTransientDomain = "__TRANSIENT";
#ifdef ENABLE_KEYMAPPER
-const char *ConfigManager::kKeymapperDomain = "keymapper";
+char const *const ConfigManager::kKeymapperDomain = "keymapper";
#endif
#pragma mark -
@@ -112,7 +112,7 @@ void ConfigManager::loadConfigFile(const String &filename) {
* Add a ready-made domain based on its name and contents
* The domain name should not already exist in the ConfigManager.
**/
-void ConfigManager::addDomain(const Common::String &domainName, const ConfigManager::Domain &domain) {
+void ConfigManager::addDomain(const String &domainName, const ConfigManager::Domain &domain) {
if (domainName.empty())
return;
if (domainName == kApplicationDomain) {
@@ -187,7 +187,7 @@ void ConfigManager::loadFromStream(SeekableReadStream &stream) {
// Get the domain name, and check whether it's valid (that
// is, verify that it only consists of alphanumerics,
// dashes and underscores).
- while (*p && (isalnum(*p) || *p == '-' || *p == '_'))
+ while (*p && (isalnum(static_cast<unsigned char>(*p)) || *p == '-' || *p == '_'))
p++;
if (*p == '\0')
@@ -205,7 +205,7 @@ void ConfigManager::loadFromStream(SeekableReadStream &stream) {
// Skip leading whitespaces
const char *t = line.c_str();
- while (isspace(*t))
+ while (isspace(static_cast<unsigned char>(*t)))
t++;
// Skip empty lines / lines with only whitespace
@@ -492,7 +492,7 @@ int ConfigManager::getInt(const String &key, const String &domName) const {
bool ConfigManager::getBool(const String &key, const String &domName) const {
String value(get(key, domName));
bool val;
- if (Common::parseBool(value, val))
+ if (parseBool(value, val))
return val;
error("ConfigManager::getBool(%s,%s): '%s' is not a valid bool",
@@ -696,4 +696,3 @@ bool ConfigManager::Domain::hasKVComment(const String &key) const {
}
} // End of namespace Common
-
diff --git a/common/config-manager.h b/common/config-manager.h
index 78a62b9808..02d4ec3438 100644
--- a/common/config-manager.h
+++ b/common/config-manager.h
@@ -64,14 +64,14 @@ public:
typedef HashMap<String, Domain, IgnoreCase_Hash, IgnoreCase_EqualTo> DomainMap;
/** The name of the application domain (normally 'scummvm'). */
- static const char *kApplicationDomain;
+ static char const *const kApplicationDomain;
/** The transient (pseudo) domain. */
- static const char *kTransientDomain;
+ static char const *const kTransientDomain;
#ifdef ENABLE_KEYMAPPER
/** The name of keymapper domain used to store the key maps */
- static const char *kKeymapperDomain;
+ static char const *const kKeymapperDomain;
#endif
void loadDefaultConfigFile();
@@ -153,7 +153,7 @@ private:
ConfigManager();
void loadFromStream(SeekableReadStream &stream);
- void addDomain(const Common::String &domainName, const Domain &domain);
+ void addDomain(const String &domainName, const Domain &domain);
void writeDomain(WriteStream &stream, const String &name, const Domain &domain);
void renameDomain(const String &oldName, const String &newName, DomainMap &map);
diff --git a/common/cosinetables.cpp b/common/cosinetables.cpp
new file mode 100644
index 0000000000..30f55b55fc
--- /dev/null
+++ b/common/cosinetables.cpp
@@ -0,0 +1,8274 @@
+/* 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.
+ *
+ */
+
+// Based on eos' cosine tables
+
+#include "common/cosinetables.h"
+#include "common/scummsys.h"
+
+namespace Common {
+
+static const float cosTable16[8] = {
+ 1.000000f, 0.923880f, 0.707107f, 0.382683f, 0.000000f, 0.382683f, 0.707107f, 0.923880f
+};
+
+static const float cosTable32[16] = {
+ 1.000000f, 0.980785f, 0.923880f, 0.831470f, 0.707107f, 0.555570f, 0.382683f, 0.195090f,
+ 0.000000f, 0.195090f, 0.382683f, 0.555570f, 0.707107f, 0.831470f, 0.923880f, 0.980785f
+};
+
+static const float cosTable64[32] = {
+ 1.000000f, 0.995185f, 0.980785f, 0.956940f, 0.923880f, 0.881921f, 0.831470f, 0.773010f,
+ 0.707107f, 0.634393f, 0.555570f, 0.471397f, 0.382683f, 0.290285f, 0.195090f, 0.098017f,
+ 0.000000f, 0.098017f, 0.195090f, 0.290285f, 0.382683f, 0.471397f, 0.555570f, 0.634393f,
+ 0.707107f, 0.773010f, 0.831470f, 0.881921f, 0.923880f, 0.956940f, 0.980785f, 0.995185f
+};
+
+static const float cosTable128[64] = {
+ 1.000000f, 0.998795f, 0.995185f, 0.989177f, 0.980785f, 0.970031f, 0.956940f, 0.941544f,
+ 0.923880f, 0.903989f, 0.881921f, 0.857729f, 0.831470f, 0.803208f, 0.773010f, 0.740951f,
+ 0.707107f, 0.671559f, 0.634393f, 0.595699f, 0.555570f, 0.514103f, 0.471397f, 0.427555f,
+ 0.382683f, 0.336890f, 0.290285f, 0.242980f, 0.195090f, 0.146730f, 0.098017f, 0.049068f,
+ 0.000000f, 0.049068f, 0.098017f, 0.146730f, 0.195090f, 0.242980f, 0.290285f, 0.336890f,
+ 0.382683f, 0.427555f, 0.471397f, 0.514103f, 0.555570f, 0.595699f, 0.634393f, 0.671559f,
+ 0.707107f, 0.740951f, 0.773010f, 0.803208f, 0.831470f, 0.857729f, 0.881921f, 0.903989f,
+ 0.923880f, 0.941544f, 0.956940f, 0.970031f, 0.980785f, 0.989177f, 0.995185f, 0.998795f
+};
+
+static const float cosTable256[128] = {
+ 1.000000f, 0.999699f, 0.998795f, 0.997290f, 0.995185f, 0.992480f, 0.989177f, 0.985278f,
+ 0.980785f, 0.975702f, 0.970031f, 0.963776f, 0.956940f, 0.949528f, 0.941544f, 0.932993f,
+ 0.923880f, 0.914210f, 0.903989f, 0.893224f, 0.881921f, 0.870087f, 0.857729f, 0.844854f,
+ 0.831470f, 0.817585f, 0.803208f, 0.788346f, 0.773010f, 0.757209f, 0.740951f, 0.724247f,
+ 0.707107f, 0.689541f, 0.671559f, 0.653173f, 0.634393f, 0.615232f, 0.595699f, 0.575808f,
+ 0.555570f, 0.534998f, 0.514103f, 0.492898f, 0.471397f, 0.449611f, 0.427555f, 0.405241f,
+ 0.382683f, 0.359895f, 0.336890f, 0.313682f, 0.290285f, 0.266713f, 0.242980f, 0.219101f,
+ 0.195090f, 0.170962f, 0.146730f, 0.122411f, 0.098017f, 0.073565f, 0.049068f, 0.024541f,
+ 0.000000f, 0.024541f, 0.049068f, 0.073565f, 0.098017f, 0.122411f, 0.146730f, 0.170962f,
+ 0.195090f, 0.219101f, 0.242980f, 0.266713f, 0.290285f, 0.313682f, 0.336890f, 0.359895f,
+ 0.382683f, 0.405241f, 0.427555f, 0.449611f, 0.471397f, 0.492898f, 0.514103f, 0.534998f,
+ 0.555570f, 0.575808f, 0.595699f, 0.615232f, 0.634393f, 0.653173f, 0.671559f, 0.689541f,
+ 0.707107f, 0.724247f, 0.740951f, 0.757209f, 0.773010f, 0.788346f, 0.803208f, 0.817585f,
+ 0.831470f, 0.844854f, 0.857729f, 0.870087f, 0.881921f, 0.893224f, 0.903989f, 0.914210f,
+ 0.923880f, 0.932993f, 0.941544f, 0.949528f, 0.956940f, 0.963776f, 0.970031f, 0.975702f,
+ 0.980785f, 0.985278f, 0.989177f, 0.992480f, 0.995185f, 0.997290f, 0.998795f, 0.999699f
+};
+
+static const float cosTable512[256] = {
+ 1.000000f, 0.999925f, 0.999699f, 0.999322f, 0.998795f, 0.998118f, 0.997290f, 0.996313f,
+ 0.995185f, 0.993907f, 0.992480f, 0.990903f, 0.989177f, 0.987301f, 0.985278f, 0.983105f,
+ 0.980785f, 0.978317f, 0.975702f, 0.972940f, 0.970031f, 0.966976f, 0.963776f, 0.960431f,
+ 0.956940f, 0.953306f, 0.949528f, 0.945607f, 0.941544f, 0.937339f, 0.932993f, 0.928506f,
+ 0.923880f, 0.919114f, 0.914210f, 0.909168f, 0.903989f, 0.898674f, 0.893224f, 0.887640f,
+ 0.881921f, 0.876070f, 0.870087f, 0.863973f, 0.857729f, 0.851355f, 0.844854f, 0.838225f,
+ 0.831470f, 0.824589f, 0.817585f, 0.810457f, 0.803208f, 0.795837f, 0.788346f, 0.780737f,
+ 0.773010f, 0.765167f, 0.757209f, 0.749136f, 0.740951f, 0.732654f, 0.724247f, 0.715731f,
+ 0.707107f, 0.698376f, 0.689541f, 0.680601f, 0.671559f, 0.662416f, 0.653173f, 0.643832f,
+ 0.634393f, 0.624860f, 0.615232f, 0.605511f, 0.595699f, 0.585798f, 0.575808f, 0.565732f,
+ 0.555570f, 0.545325f, 0.534998f, 0.524590f, 0.514103f, 0.503538f, 0.492898f, 0.482184f,
+ 0.471397f, 0.460539f, 0.449611f, 0.438616f, 0.427555f, 0.416430f, 0.405241f, 0.393992f,
+ 0.382683f, 0.371317f, 0.359895f, 0.348419f, 0.336890f, 0.325310f, 0.313682f, 0.302006f,
+ 0.290285f, 0.278520f, 0.266713f, 0.254866f, 0.242980f, 0.231058f, 0.219101f, 0.207111f,
+ 0.195090f, 0.183040f, 0.170962f, 0.158858f, 0.146730f, 0.134581f, 0.122411f, 0.110222f,
+ 0.098017f, 0.085797f, 0.073565f, 0.061321f, 0.049068f, 0.036807f, 0.024541f, 0.012272f,
+ 0.000000f, 0.012272f, 0.024541f, 0.036807f, 0.049068f, 0.061321f, 0.073565f, 0.085797f,
+ 0.098017f, 0.110222f, 0.122411f, 0.134581f, 0.146730f, 0.158858f, 0.170962f, 0.183040f,
+ 0.195090f, 0.207111f, 0.219101f, 0.231058f, 0.242980f, 0.254866f, 0.266713f, 0.278520f,
+ 0.290285f, 0.302006f, 0.313682f, 0.325310f, 0.336890f, 0.348419f, 0.359895f, 0.371317f,
+ 0.382683f, 0.393992f, 0.405241f, 0.416430f, 0.427555f, 0.438616f, 0.449611f, 0.460539f,
+ 0.471397f, 0.482184f, 0.492898f, 0.503538f, 0.514103f, 0.524590f, 0.534998f, 0.545325f,
+ 0.555570f, 0.565732f, 0.575808f, 0.585798f, 0.595699f, 0.605511f, 0.615232f, 0.624860f,
+ 0.634393f, 0.643832f, 0.653173f, 0.662416f, 0.671559f, 0.680601f, 0.689541f, 0.698376f,
+ 0.707107f, 0.715731f, 0.724247f, 0.732654f, 0.740951f, 0.749136f, 0.757209f, 0.765167f,
+ 0.773010f, 0.780737f, 0.788346f, 0.795837f, 0.803208f, 0.810457f, 0.817585f, 0.824589f,
+ 0.831470f, 0.838225f, 0.844854f, 0.851355f, 0.857729f, 0.863973f, 0.870087f, 0.876070f,
+ 0.881921f, 0.887640f, 0.893224f, 0.898674f, 0.903989f, 0.909168f, 0.914210f, 0.919114f,
+ 0.923880f, 0.928506f, 0.932993f, 0.937339f, 0.941544f, 0.945607f, 0.949528f, 0.953306f,
+ 0.956940f, 0.960431f, 0.963776f, 0.966976f, 0.970031f, 0.972940f, 0.975702f, 0.978317f,
+ 0.980785f, 0.983105f, 0.985278f, 0.987301f, 0.989177f, 0.990903f, 0.992480f, 0.993907f,
+ 0.995185f, 0.996313f, 0.997290f, 0.998118f, 0.998795f, 0.999322f, 0.999699f, 0.999925f
+};
+
+static const float cosTable1024[512] = {
+ 1.000000f, 0.999981f, 0.999925f, 0.999831f, 0.999699f, 0.999529f, 0.999322f, 0.999078f,
+ 0.998795f, 0.998476f, 0.998118f, 0.997723f, 0.997290f, 0.996820f, 0.996313f, 0.995767f,
+ 0.995185f, 0.994565f, 0.993907f, 0.993212f, 0.992480f, 0.991710f, 0.990903f, 0.990058f,
+ 0.989177f, 0.988258f, 0.987301f, 0.986308f, 0.985278f, 0.984210f, 0.983105f, 0.981964f,
+ 0.980785f, 0.979570f, 0.978317f, 0.977028f, 0.975702f, 0.974339f, 0.972940f, 0.971504f,
+ 0.970031f, 0.968522f, 0.966976f, 0.965394f, 0.963776f, 0.962121f, 0.960431f, 0.958703f,
+ 0.956940f, 0.955141f, 0.953306f, 0.951435f, 0.949528f, 0.947586f, 0.945607f, 0.943593f,
+ 0.941544f, 0.939459f, 0.937339f, 0.935184f, 0.932993f, 0.930767f, 0.928506f, 0.926210f,
+ 0.923880f, 0.921514f, 0.919114f, 0.916679f, 0.914210f, 0.911706f, 0.909168f, 0.906596f,
+ 0.903989f, 0.901349f, 0.898674f, 0.895966f, 0.893224f, 0.890449f, 0.887640f, 0.884797f,
+ 0.881921f, 0.879012f, 0.876070f, 0.873095f, 0.870087f, 0.867046f, 0.863973f, 0.860867f,
+ 0.857729f, 0.854558f, 0.851355f, 0.848120f, 0.844854f, 0.841555f, 0.838225f, 0.834863f,
+ 0.831470f, 0.828045f, 0.824589f, 0.821102f, 0.817585f, 0.814036f, 0.810457f, 0.806848f,
+ 0.803208f, 0.799537f, 0.795837f, 0.792107f, 0.788346f, 0.784557f, 0.780737f, 0.776888f,
+ 0.773010f, 0.769103f, 0.765167f, 0.761202f, 0.757209f, 0.753187f, 0.749136f, 0.745058f,
+ 0.740951f, 0.736817f, 0.732654f, 0.728464f, 0.724247f, 0.720003f, 0.715731f, 0.711432f,
+ 0.707107f, 0.702755f, 0.698376f, 0.693971f, 0.689541f, 0.685084f, 0.680601f, 0.676093f,
+ 0.671559f, 0.667000f, 0.662416f, 0.657807f, 0.653173f, 0.648514f, 0.643832f, 0.639124f,
+ 0.634393f, 0.629638f, 0.624860f, 0.620057f, 0.615232f, 0.610383f, 0.605511f, 0.600616f,
+ 0.595699f, 0.590760f, 0.585798f, 0.580814f, 0.575808f, 0.570781f, 0.565732f, 0.560662f,
+ 0.555570f, 0.550458f, 0.545325f, 0.540171f, 0.534998f, 0.529804f, 0.524590f, 0.519356f,
+ 0.514103f, 0.508830f, 0.503538f, 0.498228f, 0.492898f, 0.487550f, 0.482184f, 0.476799f,
+ 0.471397f, 0.465977f, 0.460539f, 0.455084f, 0.449611f, 0.444122f, 0.438616f, 0.433094f,
+ 0.427555f, 0.422000f, 0.416430f, 0.410843f, 0.405241f, 0.399624f, 0.393992f, 0.388345f,
+ 0.382683f, 0.377007f, 0.371317f, 0.365613f, 0.359895f, 0.354164f, 0.348419f, 0.342661f,
+ 0.336890f, 0.331106f, 0.325310f, 0.319502f, 0.313682f, 0.307850f, 0.302006f, 0.296151f,
+ 0.290285f, 0.284408f, 0.278520f, 0.272621f, 0.266713f, 0.260794f, 0.254866f, 0.248928f,
+ 0.242980f, 0.237024f, 0.231058f, 0.225084f, 0.219101f, 0.213110f, 0.207111f, 0.201105f,
+ 0.195090f, 0.189069f, 0.183040f, 0.177004f, 0.170962f, 0.164913f, 0.158858f, 0.152797f,
+ 0.146730f, 0.140658f, 0.134581f, 0.128498f, 0.122411f, 0.116319f, 0.110222f, 0.104122f,
+ 0.098017f, 0.091909f, 0.085797f, 0.079682f, 0.073565f, 0.067444f, 0.061321f, 0.055195f,
+ 0.049068f, 0.042938f, 0.036807f, 0.030675f, 0.024541f, 0.018407f, 0.012272f, 0.006136f,
+ 0.000000f, 0.006136f, 0.012272f, 0.018407f, 0.024541f, 0.030675f, 0.036807f, 0.042938f,
+ 0.049068f, 0.055195f, 0.061321f, 0.067444f, 0.073565f, 0.079682f, 0.085797f, 0.091909f,
+ 0.098017f, 0.104122f, 0.110222f, 0.116319f, 0.122411f, 0.128498f, 0.134581f, 0.140658f,
+ 0.146730f, 0.152797f, 0.158858f, 0.164913f, 0.170962f, 0.177004f, 0.183040f, 0.189069f,
+ 0.195090f, 0.201105f, 0.207111f, 0.213110f, 0.219101f, 0.225084f, 0.231058f, 0.237024f,
+ 0.242980f, 0.248928f, 0.254866f, 0.260794f, 0.266713f, 0.272621f, 0.278520f, 0.284408f,
+ 0.290285f, 0.296151f, 0.302006f, 0.307850f, 0.313682f, 0.319502f, 0.325310f, 0.331106f,
+ 0.336890f, 0.342661f, 0.348419f, 0.354164f, 0.359895f, 0.365613f, 0.371317f, 0.377007f,
+ 0.382683f, 0.388345f, 0.393992f, 0.399624f, 0.405241f, 0.410843f, 0.416430f, 0.422000f,
+ 0.427555f, 0.433094f, 0.438616f, 0.444122f, 0.449611f, 0.455084f, 0.460539f, 0.465977f,
+ 0.471397f, 0.476799f, 0.482184f, 0.487550f, 0.492898f, 0.498228f, 0.503538f, 0.508830f,
+ 0.514103f, 0.519356f, 0.524590f, 0.529804f, 0.534998f, 0.540171f, 0.545325f, 0.550458f,
+ 0.555570f, 0.560662f, 0.565732f, 0.570781f, 0.575808f, 0.580814f, 0.585798f, 0.590760f,
+ 0.595699f, 0.600616f, 0.605511f, 0.610383f, 0.615232f, 0.620057f, 0.624860f, 0.629638f,
+ 0.634393f, 0.639124f, 0.643832f, 0.648514f, 0.653173f, 0.657807f, 0.662416f, 0.667000f,
+ 0.671559f, 0.676093f, 0.680601f, 0.685084f, 0.689541f, 0.693971f, 0.698376f, 0.702755f,
+ 0.707107f, 0.711432f, 0.715731f, 0.720003f, 0.724247f, 0.728464f, 0.732654f, 0.736817f,
+ 0.740951f, 0.745058f, 0.749136f, 0.753187f, 0.757209f, 0.761202f, 0.765167f, 0.769103f,
+ 0.773010f, 0.776888f, 0.780737f, 0.784557f, 0.788346f, 0.792107f, 0.795837f, 0.799537f,
+ 0.803208f, 0.806848f, 0.810457f, 0.814036f, 0.817585f, 0.821102f, 0.824589f, 0.828045f,
+ 0.831470f, 0.834863f, 0.838225f, 0.841555f, 0.844854f, 0.848120f, 0.851355f, 0.854558f,
+ 0.857729f, 0.860867f, 0.863973f, 0.867046f, 0.870087f, 0.873095f, 0.876070f, 0.879012f,
+ 0.881921f, 0.884797f, 0.887640f, 0.890449f, 0.893224f, 0.895966f, 0.898674f, 0.901349f,
+ 0.903989f, 0.906596f, 0.909168f, 0.911706f, 0.914210f, 0.916679f, 0.919114f, 0.921514f,
+ 0.923880f, 0.926210f, 0.928506f, 0.930767f, 0.932993f, 0.935184f, 0.937339f, 0.939459f,
+ 0.941544f, 0.943593f, 0.945607f, 0.947586f, 0.949528f, 0.951435f, 0.953306f, 0.955141f,
+ 0.956940f, 0.958703f, 0.960431f, 0.962121f, 0.963776f, 0.965394f, 0.966976f, 0.968522f,
+ 0.970031f, 0.971504f, 0.972940f, 0.974339f, 0.975702f, 0.977028f, 0.978317f, 0.979570f,
+ 0.980785f, 0.981964f, 0.983105f, 0.984210f, 0.985278f, 0.986308f, 0.987301f, 0.988258f,
+ 0.989177f, 0.990058f, 0.990903f, 0.991710f, 0.992480f, 0.993212f, 0.993907f, 0.994565f,
+ 0.995185f, 0.995767f, 0.996313f, 0.996820f, 0.997290f, 0.997723f, 0.998118f, 0.998476f,
+ 0.998795f, 0.999078f, 0.999322f, 0.999529f, 0.999699f, 0.999831f, 0.999925f, 0.999981f
+};
+
+static const float cosTable2048[1024] = {
+ 1.000000f, 0.999995f, 0.999981f, 0.999958f, 0.999925f, 0.999882f, 0.999831f, 0.999769f,
+ 0.999699f, 0.999619f, 0.999529f, 0.999431f, 0.999322f, 0.999205f, 0.999078f, 0.998941f,
+ 0.998795f, 0.998640f, 0.998476f, 0.998302f, 0.998118f, 0.997925f, 0.997723f, 0.997511f,
+ 0.997290f, 0.997060f, 0.996820f, 0.996571f, 0.996313f, 0.996045f, 0.995767f, 0.995481f,
+ 0.995185f, 0.994879f, 0.994565f, 0.994240f, 0.993907f, 0.993564f, 0.993212f, 0.992850f,
+ 0.992480f, 0.992099f, 0.991710f, 0.991311f, 0.990903f, 0.990485f, 0.990058f, 0.989622f,
+ 0.989177f, 0.988722f, 0.988258f, 0.987784f, 0.987301f, 0.986809f, 0.986308f, 0.985798f,
+ 0.985278f, 0.984748f, 0.984210f, 0.983662f, 0.983105f, 0.982539f, 0.981964f, 0.981379f,
+ 0.980785f, 0.980182f, 0.979570f, 0.978948f, 0.978317f, 0.977677f, 0.977028f, 0.976370f,
+ 0.975702f, 0.975025f, 0.974339f, 0.973644f, 0.972940f, 0.972227f, 0.971504f, 0.970772f,
+ 0.970031f, 0.969281f, 0.968522f, 0.967754f, 0.966976f, 0.966190f, 0.965394f, 0.964590f,
+ 0.963776f, 0.962953f, 0.962121f, 0.961280f, 0.960431f, 0.959572f, 0.958703f, 0.957826f,
+ 0.956940f, 0.956045f, 0.955141f, 0.954228f, 0.953306f, 0.952375f, 0.951435f, 0.950486f,
+ 0.949528f, 0.948561f, 0.947586f, 0.946601f, 0.945607f, 0.944605f, 0.943593f, 0.942573f,
+ 0.941544f, 0.940506f, 0.939459f, 0.938404f, 0.937339f, 0.936266f, 0.935184f, 0.934093f,
+ 0.932993f, 0.931884f, 0.930767f, 0.929641f, 0.928506f, 0.927363f, 0.926210f, 0.925049f,
+ 0.923880f, 0.922701f, 0.921514f, 0.920318f, 0.919114f, 0.917901f, 0.916679f, 0.915449f,
+ 0.914210f, 0.912962f, 0.911706f, 0.910441f, 0.909168f, 0.907886f, 0.906596f, 0.905297f,
+ 0.903989f, 0.902673f, 0.901349f, 0.900016f, 0.898674f, 0.897325f, 0.895966f, 0.894599f,
+ 0.893224f, 0.891841f, 0.890449f, 0.889048f, 0.887640f, 0.886223f, 0.884797f, 0.883363f,
+ 0.881921f, 0.880471f, 0.879012f, 0.877545f, 0.876070f, 0.874587f, 0.873095f, 0.871595f,
+ 0.870087f, 0.868571f, 0.867046f, 0.865514f, 0.863973f, 0.862424f, 0.860867f, 0.859302f,
+ 0.857729f, 0.856147f, 0.854558f, 0.852961f, 0.851355f, 0.849742f, 0.848120f, 0.846491f,
+ 0.844854f, 0.843208f, 0.841555f, 0.839894f, 0.838225f, 0.836548f, 0.834863f, 0.833170f,
+ 0.831470f, 0.829761f, 0.828045f, 0.826321f, 0.824589f, 0.822850f, 0.821102f, 0.819348f,
+ 0.817585f, 0.815814f, 0.814036f, 0.812251f, 0.810457f, 0.808656f, 0.806848f, 0.805031f,
+ 0.803208f, 0.801376f, 0.799537f, 0.797691f, 0.795837f, 0.793975f, 0.792107f, 0.790230f,
+ 0.788346f, 0.786455f, 0.784557f, 0.782651f, 0.780737f, 0.778817f, 0.776888f, 0.774953f,
+ 0.773010f, 0.771061f, 0.769103f, 0.767139f, 0.765167f, 0.763188f, 0.761202f, 0.759209f,
+ 0.757209f, 0.755201f, 0.753187f, 0.751165f, 0.749136f, 0.747101f, 0.745058f, 0.743008f,
+ 0.740951f, 0.738887f, 0.736817f, 0.734739f, 0.732654f, 0.730563f, 0.728464f, 0.726359f,
+ 0.724247f, 0.722128f, 0.720003f, 0.717870f, 0.715731f, 0.713585f, 0.711432f, 0.709273f,
+ 0.707107f, 0.704934f, 0.702755f, 0.700569f, 0.698376f, 0.696177f, 0.693971f, 0.691759f,
+ 0.689541f, 0.687315f, 0.685084f, 0.682846f, 0.680601f, 0.678350f, 0.676093f, 0.673829f,
+ 0.671559f, 0.669283f, 0.667000f, 0.664711f, 0.662416f, 0.660114f, 0.657807f, 0.655493f,
+ 0.653173f, 0.650847f, 0.648514f, 0.646176f, 0.643832f, 0.641481f, 0.639124f, 0.636762f,
+ 0.634393f, 0.632019f, 0.629638f, 0.627252f, 0.624860f, 0.622461f, 0.620057f, 0.617647f,
+ 0.615232f, 0.612810f, 0.610383f, 0.607950f, 0.605511f, 0.603067f, 0.600616f, 0.598161f,
+ 0.595699f, 0.593232f, 0.590760f, 0.588282f, 0.585798f, 0.583309f, 0.580814f, 0.578314f,
+ 0.575808f, 0.573297f, 0.570781f, 0.568259f, 0.565732f, 0.563199f, 0.560662f, 0.558119f,
+ 0.555570f, 0.553017f, 0.550458f, 0.547894f, 0.545325f, 0.542751f, 0.540171f, 0.537587f,
+ 0.534998f, 0.532403f, 0.529804f, 0.527199f, 0.524590f, 0.521975f, 0.519356f, 0.516732f,
+ 0.514103f, 0.511469f, 0.508830f, 0.506187f, 0.503538f, 0.500885f, 0.498228f, 0.495565f,
+ 0.492898f, 0.490226f, 0.487550f, 0.484869f, 0.482184f, 0.479494f, 0.476799f, 0.474100f,
+ 0.471397f, 0.468689f, 0.465977f, 0.463260f, 0.460539f, 0.457813f, 0.455084f, 0.452350f,
+ 0.449611f, 0.446869f, 0.444122f, 0.441371f, 0.438616f, 0.435857f, 0.433094f, 0.430326f,
+ 0.427555f, 0.424780f, 0.422000f, 0.419217f, 0.416430f, 0.413638f, 0.410843f, 0.408044f,
+ 0.405241f, 0.402435f, 0.399624f, 0.396810f, 0.393992f, 0.391170f, 0.388345f, 0.385516f,
+ 0.382683f, 0.379847f, 0.377007f, 0.374164f, 0.371317f, 0.368467f, 0.365613f, 0.362756f,
+ 0.359895f, 0.357031f, 0.354164f, 0.351293f, 0.348419f, 0.345541f, 0.342661f, 0.339777f,
+ 0.336890f, 0.334000f, 0.331106f, 0.328210f, 0.325310f, 0.322408f, 0.319502f, 0.316593f,
+ 0.313682f, 0.310767f, 0.307850f, 0.304929f, 0.302006f, 0.299080f, 0.296151f, 0.293219f,
+ 0.290285f, 0.287347f, 0.284408f, 0.281465f, 0.278520f, 0.275572f, 0.272621f, 0.269668f,
+ 0.266713f, 0.263755f, 0.260794f, 0.257831f, 0.254866f, 0.251898f, 0.248928f, 0.245955f,
+ 0.242980f, 0.240003f, 0.237024f, 0.234042f, 0.231058f, 0.228072f, 0.225084f, 0.222094f,
+ 0.219101f, 0.216107f, 0.213110f, 0.210112f, 0.207111f, 0.204109f, 0.201105f, 0.198098f,
+ 0.195090f, 0.192080f, 0.189069f, 0.186055f, 0.183040f, 0.180023f, 0.177004f, 0.173984f,
+ 0.170962f, 0.167938f, 0.164913f, 0.161886f, 0.158858f, 0.155828f, 0.152797f, 0.149765f,
+ 0.146730f, 0.143695f, 0.140658f, 0.137620f, 0.134581f, 0.131540f, 0.128498f, 0.125455f,
+ 0.122411f, 0.119365f, 0.116319f, 0.113271f, 0.110222f, 0.107172f, 0.104122f, 0.101070f,
+ 0.098017f, 0.094963f, 0.091909f, 0.088854f, 0.085797f, 0.082740f, 0.079682f, 0.076624f,
+ 0.073565f, 0.070505f, 0.067444f, 0.064383f, 0.061321f, 0.058258f, 0.055195f, 0.052132f,
+ 0.049068f, 0.046003f, 0.042938f, 0.039873f, 0.036807f, 0.033741f, 0.030675f, 0.027608f,
+ 0.024541f, 0.021474f, 0.018407f, 0.015339f, 0.012272f, 0.009204f, 0.006136f, 0.003068f,
+ 0.000000f, 0.003068f, 0.006136f, 0.009204f, 0.012272f, 0.015339f, 0.018407f, 0.021474f,
+ 0.024541f, 0.027608f, 0.030675f, 0.033741f, 0.036807f, 0.039873f, 0.042938f, 0.046003f,
+ 0.049068f, 0.052132f, 0.055195f, 0.058258f, 0.061321f, 0.064383f, 0.067444f, 0.070505f,
+ 0.073565f, 0.076624f, 0.079682f, 0.082740f, 0.085797f, 0.088854f, 0.091909f, 0.094963f,
+ 0.098017f, 0.101070f, 0.104122f, 0.107172f, 0.110222f, 0.113271f, 0.116319f, 0.119365f,
+ 0.122411f, 0.125455f, 0.128498f, 0.131540f, 0.134581f, 0.137620f, 0.140658f, 0.143695f,
+ 0.146730f, 0.149765f, 0.152797f, 0.155828f, 0.158858f, 0.161886f, 0.164913f, 0.167938f,
+ 0.170962f, 0.173984f, 0.177004f, 0.180023f, 0.183040f, 0.186055f, 0.189069f, 0.192080f,
+ 0.195090f, 0.198098f, 0.201105f, 0.204109f, 0.207111f, 0.210112f, 0.213110f, 0.216107f,
+ 0.219101f, 0.222094f, 0.225084f, 0.228072f, 0.231058f, 0.234042f, 0.237024f, 0.240003f,
+ 0.242980f, 0.245955f, 0.248928f, 0.251898f, 0.254866f, 0.257831f, 0.260794f, 0.263755f,
+ 0.266713f, 0.269668f, 0.272621f, 0.275572f, 0.278520f, 0.281465f, 0.284408f, 0.287347f,
+ 0.290285f, 0.293219f, 0.296151f, 0.299080f, 0.302006f, 0.304929f, 0.307850f, 0.310767f,
+ 0.313682f, 0.316593f, 0.319502f, 0.322408f, 0.325310f, 0.328210f, 0.331106f, 0.334000f,
+ 0.336890f, 0.339777f, 0.342661f, 0.345541f, 0.348419f, 0.351293f, 0.354164f, 0.357031f,
+ 0.359895f, 0.362756f, 0.365613f, 0.368467f, 0.371317f, 0.374164f, 0.377007f, 0.379847f,
+ 0.382683f, 0.385516f, 0.388345f, 0.391170f, 0.393992f, 0.396810f, 0.399624f, 0.402435f,
+ 0.405241f, 0.408044f, 0.410843f, 0.413638f, 0.416430f, 0.419217f, 0.422000f, 0.424780f,
+ 0.427555f, 0.430326f, 0.433094f, 0.435857f, 0.438616f, 0.441371f, 0.444122f, 0.446869f,
+ 0.449611f, 0.452350f, 0.455084f, 0.457813f, 0.460539f, 0.463260f, 0.465977f, 0.468689f,
+ 0.471397f, 0.474100f, 0.476799f, 0.479494f, 0.482184f, 0.484869f, 0.487550f, 0.490226f,
+ 0.492898f, 0.495565f, 0.498228f, 0.500885f, 0.503538f, 0.506187f, 0.508830f, 0.511469f,
+ 0.514103f, 0.516732f, 0.519356f, 0.521975f, 0.524590f, 0.527199f, 0.529804f, 0.532403f,
+ 0.534998f, 0.537587f, 0.540171f, 0.542751f, 0.545325f, 0.547894f, 0.550458f, 0.553017f,
+ 0.555570f, 0.558119f, 0.560662f, 0.563199f, 0.565732f, 0.568259f, 0.570781f, 0.573297f,
+ 0.575808f, 0.578314f, 0.580814f, 0.583309f, 0.585798f, 0.588282f, 0.590760f, 0.593232f,
+ 0.595699f, 0.598161f, 0.600616f, 0.603067f, 0.605511f, 0.607950f, 0.610383f, 0.612810f,
+ 0.615232f, 0.617647f, 0.620057f, 0.622461f, 0.624860f, 0.627252f, 0.629638f, 0.632019f,
+ 0.634393f, 0.636762f, 0.639124f, 0.641481f, 0.643832f, 0.646176f, 0.648514f, 0.650847f,
+ 0.653173f, 0.655493f, 0.657807f, 0.660114f, 0.662416f, 0.664711f, 0.667000f, 0.669283f,
+ 0.671559f, 0.673829f, 0.676093f, 0.678350f, 0.680601f, 0.682846f, 0.685084f, 0.687315f,
+ 0.689541f, 0.691759f, 0.693971f, 0.696177f, 0.698376f, 0.700569f, 0.702755f, 0.704934f,
+ 0.707107f, 0.709273f, 0.711432f, 0.713585f, 0.715731f, 0.717870f, 0.720003f, 0.722128f,
+ 0.724247f, 0.726359f, 0.728464f, 0.730563f, 0.732654f, 0.734739f, 0.736817f, 0.738887f,
+ 0.740951f, 0.743008f, 0.745058f, 0.747101f, 0.749136f, 0.751165f, 0.753187f, 0.755201f,
+ 0.757209f, 0.759209f, 0.761202f, 0.763188f, 0.765167f, 0.767139f, 0.769103f, 0.771061f,
+ 0.773010f, 0.774953f, 0.776888f, 0.778817f, 0.780737f, 0.782651f, 0.784557f, 0.786455f,
+ 0.788346f, 0.790230f, 0.792107f, 0.793975f, 0.795837f, 0.797691f, 0.799537f, 0.801376f,
+ 0.803208f, 0.805031f, 0.806848f, 0.808656f, 0.810457f, 0.812251f, 0.814036f, 0.815814f,
+ 0.817585f, 0.819348f, 0.821102f, 0.822850f, 0.824589f, 0.826321f, 0.828045f, 0.829761f,
+ 0.831470f, 0.833170f, 0.834863f, 0.836548f, 0.838225f, 0.839894f, 0.841555f, 0.843208f,
+ 0.844854f, 0.846491f, 0.848120f, 0.849742f, 0.851355f, 0.852961f, 0.854558f, 0.856147f,
+ 0.857729f, 0.859302f, 0.860867f, 0.862424f, 0.863973f, 0.865514f, 0.867046f, 0.868571f,
+ 0.870087f, 0.871595f, 0.873095f, 0.874587f, 0.876070f, 0.877545f, 0.879012f, 0.880471f,
+ 0.881921f, 0.883363f, 0.884797f, 0.886223f, 0.887640f, 0.889048f, 0.890449f, 0.891841f,
+ 0.893224f, 0.894599f, 0.895966f, 0.897325f, 0.898674f, 0.900016f, 0.901349f, 0.902673f,
+ 0.903989f, 0.905297f, 0.906596f, 0.907886f, 0.909168f, 0.910441f, 0.911706f, 0.912962f,
+ 0.914210f, 0.915449f, 0.916679f, 0.917901f, 0.919114f, 0.920318f, 0.921514f, 0.922701f,
+ 0.923880f, 0.925049f, 0.926210f, 0.927363f, 0.928506f, 0.929641f, 0.930767f, 0.931884f,
+ 0.932993f, 0.934093f, 0.935184f, 0.936266f, 0.937339f, 0.938404f, 0.939459f, 0.940506f,
+ 0.941544f, 0.942573f, 0.943593f, 0.944605f, 0.945607f, 0.946601f, 0.947586f, 0.948561f,
+ 0.949528f, 0.950486f, 0.951435f, 0.952375f, 0.953306f, 0.954228f, 0.955141f, 0.956045f,
+ 0.956940f, 0.957826f, 0.958703f, 0.959572f, 0.960431f, 0.961280f, 0.962121f, 0.962953f,
+ 0.963776f, 0.964590f, 0.965394f, 0.966190f, 0.966976f, 0.967754f, 0.968522f, 0.969281f,
+ 0.970031f, 0.970772f, 0.971504f, 0.972227f, 0.972940f, 0.973644f, 0.974339f, 0.975025f,
+ 0.975702f, 0.976370f, 0.977028f, 0.977677f, 0.978317f, 0.978948f, 0.979570f, 0.980182f,
+ 0.980785f, 0.981379f, 0.981964f, 0.982539f, 0.983105f, 0.983662f, 0.984210f, 0.984748f,
+ 0.985278f, 0.985798f, 0.986308f, 0.986809f, 0.987301f, 0.987784f, 0.988258f, 0.988722f,
+ 0.989177f, 0.989622f, 0.990058f, 0.990485f, 0.990903f, 0.991311f, 0.991710f, 0.992099f,
+ 0.992480f, 0.992850f, 0.993212f, 0.993564f, 0.993907f, 0.994240f, 0.994565f, 0.994879f,
+ 0.995185f, 0.995481f, 0.995767f, 0.996045f, 0.996313f, 0.996571f, 0.996820f, 0.997060f,
+ 0.997290f, 0.997511f, 0.997723f, 0.997925f, 0.998118f, 0.998302f, 0.998476f, 0.998640f,
+ 0.998795f, 0.998941f, 0.999078f, 0.999205f, 0.999322f, 0.999431f, 0.999529f, 0.999619f,
+ 0.999699f, 0.999769f, 0.999831f, 0.999882f, 0.999925f, 0.999958f, 0.999981f, 0.999995f
+};
+
+static const float cosTable4096[2048] = {
+ 1.000000f, 0.999999f, 0.999995f, 0.999989f, 0.999981f, 0.999971f, 0.999958f, 0.999942f,
+ 0.999925f, 0.999905f, 0.999882f, 0.999858f, 0.999831f, 0.999801f, 0.999769f, 0.999735f,
+ 0.999699f, 0.999660f, 0.999619f, 0.999575f, 0.999529f, 0.999481f, 0.999431f, 0.999378f,
+ 0.999322f, 0.999265f, 0.999205f, 0.999142f, 0.999078f, 0.999011f, 0.998941f, 0.998870f,
+ 0.998795f, 0.998719f, 0.998640f, 0.998559f, 0.998476f, 0.998390f, 0.998302f, 0.998211f,
+ 0.998118f, 0.998023f, 0.997925f, 0.997825f, 0.997723f, 0.997618f, 0.997511f, 0.997402f,
+ 0.997290f, 0.997176f, 0.997060f, 0.996941f, 0.996820f, 0.996697f, 0.996571f, 0.996443f,
+ 0.996313f, 0.996180f, 0.996045f, 0.995907f, 0.995767f, 0.995625f, 0.995481f, 0.995334f,
+ 0.995185f, 0.995033f, 0.994879f, 0.994723f, 0.994565f, 0.994404f, 0.994240f, 0.994075f,
+ 0.993907f, 0.993737f, 0.993564f, 0.993389f, 0.993212f, 0.993032f, 0.992850f, 0.992666f,
+ 0.992480f, 0.992291f, 0.992099f, 0.991906f, 0.991710f, 0.991511f, 0.991311f, 0.991108f,
+ 0.990903f, 0.990695f, 0.990485f, 0.990273f, 0.990058f, 0.989841f, 0.989622f, 0.989400f,
+ 0.989177f, 0.988950f, 0.988722f, 0.988491f, 0.988258f, 0.988022f, 0.987784f, 0.987544f,
+ 0.987301f, 0.987057f, 0.986809f, 0.986560f, 0.986308f, 0.986054f, 0.985798f, 0.985539f,
+ 0.985278f, 0.985014f, 0.984748f, 0.984480f, 0.984210f, 0.983937f, 0.983662f, 0.983385f,
+ 0.983105f, 0.982824f, 0.982539f, 0.982253f, 0.981964f, 0.981673f, 0.981379f, 0.981083f,
+ 0.980785f, 0.980485f, 0.980182f, 0.979877f, 0.979570f, 0.979260f, 0.978948f, 0.978634f,
+ 0.978317f, 0.977998f, 0.977677f, 0.977354f, 0.977028f, 0.976700f, 0.976370f, 0.976037f,
+ 0.975702f, 0.975365f, 0.975025f, 0.974684f, 0.974339f, 0.973993f, 0.973644f, 0.973293f,
+ 0.972940f, 0.972584f, 0.972227f, 0.971866f, 0.971504f, 0.971139f, 0.970772f, 0.970403f,
+ 0.970031f, 0.969657f, 0.969281f, 0.968903f, 0.968522f, 0.968139f, 0.967754f, 0.967366f,
+ 0.966976f, 0.966584f, 0.966190f, 0.965793f, 0.965394f, 0.964993f, 0.964590f, 0.964184f,
+ 0.963776f, 0.963366f, 0.962953f, 0.962538f, 0.962121f, 0.961702f, 0.961280f, 0.960857f,
+ 0.960431f, 0.960002f, 0.959572f, 0.959139f, 0.958703f, 0.958266f, 0.957826f, 0.957385f,
+ 0.956940f, 0.956494f, 0.956045f, 0.955594f, 0.955141f, 0.954686f, 0.954228f, 0.953768f,
+ 0.953306f, 0.952842f, 0.952375f, 0.951906f, 0.951435f, 0.950962f, 0.950486f, 0.950008f,
+ 0.949528f, 0.949046f, 0.948561f, 0.948075f, 0.947586f, 0.947094f, 0.946601f, 0.946105f,
+ 0.945607f, 0.945107f, 0.944605f, 0.944100f, 0.943593f, 0.943084f, 0.942573f, 0.942060f,
+ 0.941544f, 0.941026f, 0.940506f, 0.939984f, 0.939459f, 0.938932f, 0.938404f, 0.937872f,
+ 0.937339f, 0.936803f, 0.936266f, 0.935726f, 0.935184f, 0.934639f, 0.934093f, 0.933544f,
+ 0.932993f, 0.932440f, 0.931884f, 0.931327f, 0.930767f, 0.930205f, 0.929641f, 0.929075f,
+ 0.928506f, 0.927935f, 0.927363f, 0.926787f, 0.926210f, 0.925631f, 0.925049f, 0.924465f,
+ 0.923880f, 0.923291f, 0.922701f, 0.922109f, 0.921514f, 0.920917f, 0.920318f, 0.919717f,
+ 0.919114f, 0.918508f, 0.917901f, 0.917291f, 0.916679f, 0.916065f, 0.915449f, 0.914830f,
+ 0.914210f, 0.913587f, 0.912962f, 0.912335f, 0.911706f, 0.911075f, 0.910441f, 0.909806f,
+ 0.909168f, 0.908528f, 0.907886f, 0.907242f, 0.906596f, 0.905947f, 0.905297f, 0.904644f,
+ 0.903989f, 0.903332f, 0.902673f, 0.902012f, 0.901349f, 0.900683f, 0.900016f, 0.899346f,
+ 0.898674f, 0.898001f, 0.897325f, 0.896646f, 0.895966f, 0.895284f, 0.894599f, 0.893913f,
+ 0.893224f, 0.892534f, 0.891841f, 0.891146f, 0.890449f, 0.889750f, 0.889048f, 0.888345f,
+ 0.887640f, 0.886932f, 0.886223f, 0.885511f, 0.884797f, 0.884081f, 0.883363f, 0.882643f,
+ 0.881921f, 0.881197f, 0.880471f, 0.879743f, 0.879012f, 0.878280f, 0.877545f, 0.876809f,
+ 0.876070f, 0.875329f, 0.874587f, 0.873842f, 0.873095f, 0.872346f, 0.871595f, 0.870842f,
+ 0.870087f, 0.869330f, 0.868571f, 0.867809f, 0.867046f, 0.866281f, 0.865514f, 0.864744f,
+ 0.863973f, 0.863199f, 0.862424f, 0.861646f, 0.860867f, 0.860085f, 0.859302f, 0.858516f,
+ 0.857729f, 0.856939f, 0.856147f, 0.855354f, 0.854558f, 0.853760f, 0.852961f, 0.852159f,
+ 0.851355f, 0.850549f, 0.849742f, 0.848932f, 0.848120f, 0.847307f, 0.846491f, 0.845673f,
+ 0.844854f, 0.844032f, 0.843208f, 0.842383f, 0.841555f, 0.840725f, 0.839894f, 0.839060f,
+ 0.838225f, 0.837387f, 0.836548f, 0.835706f, 0.834863f, 0.834018f, 0.833170f, 0.832321f,
+ 0.831470f, 0.830616f, 0.829761f, 0.828904f, 0.828045f, 0.827184f, 0.826321f, 0.825456f,
+ 0.824589f, 0.823721f, 0.822850f, 0.821977f, 0.821102f, 0.820226f, 0.819348f, 0.818467f,
+ 0.817585f, 0.816701f, 0.815814f, 0.814926f, 0.814036f, 0.813144f, 0.812251f, 0.811355f,
+ 0.810457f, 0.809558f, 0.808656f, 0.807753f, 0.806848f, 0.805940f, 0.805031f, 0.804120f,
+ 0.803208f, 0.802293f, 0.801376f, 0.800458f, 0.799537f, 0.798615f, 0.797691f, 0.796765f,
+ 0.795837f, 0.794907f, 0.793975f, 0.793042f, 0.792107f, 0.791169f, 0.790230f, 0.789289f,
+ 0.788346f, 0.787402f, 0.786455f, 0.785507f, 0.784557f, 0.783605f, 0.782651f, 0.781695f,
+ 0.780737f, 0.779778f, 0.778817f, 0.777853f, 0.776888f, 0.775922f, 0.774953f, 0.773983f,
+ 0.773010f, 0.772036f, 0.771061f, 0.770083f, 0.769103f, 0.768122f, 0.767139f, 0.766154f,
+ 0.765167f, 0.764179f, 0.763188f, 0.762196f, 0.761202f, 0.760207f, 0.759209f, 0.758210f,
+ 0.757209f, 0.756206f, 0.755201f, 0.754195f, 0.753187f, 0.752177f, 0.751165f, 0.750152f,
+ 0.749136f, 0.748119f, 0.747101f, 0.746080f, 0.745058f, 0.744034f, 0.743008f, 0.741980f,
+ 0.740951f, 0.739920f, 0.738887f, 0.737853f, 0.736817f, 0.735779f, 0.734739f, 0.733697f,
+ 0.732654f, 0.731609f, 0.730563f, 0.729514f, 0.728464f, 0.727413f, 0.726359f, 0.725304f,
+ 0.724247f, 0.723188f, 0.722128f, 0.721066f, 0.720003f, 0.718937f, 0.717870f, 0.716801f,
+ 0.715731f, 0.714659f, 0.713585f, 0.712509f, 0.711432f, 0.710353f, 0.709273f, 0.708191f,
+ 0.707107f, 0.706021f, 0.704934f, 0.703845f, 0.702755f, 0.701663f, 0.700569f, 0.699473f,
+ 0.698376f, 0.697277f, 0.696177f, 0.695075f, 0.693971f, 0.692866f, 0.691759f, 0.690651f,
+ 0.689541f, 0.688429f, 0.687315f, 0.686200f, 0.685084f, 0.683965f, 0.682846f, 0.681724f,
+ 0.680601f, 0.679476f, 0.678350f, 0.677222f, 0.676093f, 0.674962f, 0.673829f, 0.672695f,
+ 0.671559f, 0.670422f, 0.669283f, 0.668142f, 0.667000f, 0.665856f, 0.664711f, 0.663564f,
+ 0.662416f, 0.661266f, 0.660114f, 0.658961f, 0.657807f, 0.656651f, 0.655493f, 0.654334f,
+ 0.653173f, 0.652011f, 0.650847f, 0.649681f, 0.648514f, 0.647346f, 0.646176f, 0.645005f,
+ 0.643832f, 0.642657f, 0.641481f, 0.640303f, 0.639124f, 0.637944f, 0.636762f, 0.635578f,
+ 0.634393f, 0.633207f, 0.632019f, 0.630829f, 0.629638f, 0.628446f, 0.627252f, 0.626056f,
+ 0.624860f, 0.623661f, 0.622461f, 0.621260f, 0.620057f, 0.618853f, 0.617647f, 0.616440f,
+ 0.615232f, 0.614022f, 0.612810f, 0.611597f, 0.610383f, 0.609167f, 0.607950f, 0.606731f,
+ 0.605511f, 0.604290f, 0.603067f, 0.601842f, 0.600616f, 0.599389f, 0.598161f, 0.596931f,
+ 0.595699f, 0.594467f, 0.593232f, 0.591997f, 0.590760f, 0.589521f, 0.588282f, 0.587040f,
+ 0.585798f, 0.584554f, 0.583309f, 0.582062f, 0.580814f, 0.579565f, 0.578314f, 0.577062f,
+ 0.575808f, 0.574553f, 0.573297f, 0.572040f, 0.570781f, 0.569521f, 0.568259f, 0.566996f,
+ 0.565732f, 0.564466f, 0.563199f, 0.561931f, 0.560662f, 0.559391f, 0.558119f, 0.556845f,
+ 0.555570f, 0.554294f, 0.553017f, 0.551738f, 0.550458f, 0.549177f, 0.547894f, 0.546610f,
+ 0.545325f, 0.544039f, 0.542751f, 0.541462f, 0.540171f, 0.538880f, 0.537587f, 0.536293f,
+ 0.534998f, 0.533701f, 0.532403f, 0.531104f, 0.529804f, 0.528502f, 0.527199f, 0.525895f,
+ 0.524590f, 0.523283f, 0.521975f, 0.520666f, 0.519356f, 0.518045f, 0.516732f, 0.515418f,
+ 0.514103f, 0.512786f, 0.511469f, 0.510150f, 0.508830f, 0.507509f, 0.506187f, 0.504863f,
+ 0.503538f, 0.502212f, 0.500885f, 0.499557f, 0.498228f, 0.496897f, 0.495565f, 0.494232f,
+ 0.492898f, 0.491563f, 0.490226f, 0.488889f, 0.487550f, 0.486210f, 0.484869f, 0.483527f,
+ 0.482184f, 0.480839f, 0.479494f, 0.478147f, 0.476799f, 0.475450f, 0.474100f, 0.472749f,
+ 0.471397f, 0.470043f, 0.468689f, 0.467333f, 0.465977f, 0.464619f, 0.463260f, 0.461900f,
+ 0.460539f, 0.459177f, 0.457813f, 0.456449f, 0.455084f, 0.453717f, 0.452350f, 0.450981f,
+ 0.449611f, 0.448241f, 0.446869f, 0.445496f, 0.444122f, 0.442747f, 0.441371f, 0.439994f,
+ 0.438616f, 0.437237f, 0.435857f, 0.434476f, 0.433094f, 0.431711f, 0.430326f, 0.428941f,
+ 0.427555f, 0.426168f, 0.424780f, 0.423390f, 0.422000f, 0.420609f, 0.419217f, 0.417824f,
+ 0.416430f, 0.415034f, 0.413638f, 0.412241f, 0.410843f, 0.409444f, 0.408044f, 0.406643f,
+ 0.405241f, 0.403838f, 0.402435f, 0.401030f, 0.399624f, 0.398218f, 0.396810f, 0.395401f,
+ 0.393992f, 0.392582f, 0.391170f, 0.389758f, 0.388345f, 0.386931f, 0.385516f, 0.384100f,
+ 0.382683f, 0.381266f, 0.379847f, 0.378428f, 0.377007f, 0.375586f, 0.374164f, 0.372741f,
+ 0.371317f, 0.369892f, 0.368467f, 0.367040f, 0.365613f, 0.364185f, 0.362756f, 0.361326f,
+ 0.359895f, 0.358463f, 0.357031f, 0.355598f, 0.354164f, 0.352729f, 0.351293f, 0.349856f,
+ 0.348419f, 0.346980f, 0.345541f, 0.344101f, 0.342661f, 0.341219f, 0.339777f, 0.338334f,
+ 0.336890f, 0.335445f, 0.334000f, 0.332553f, 0.331106f, 0.329658f, 0.328210f, 0.326760f,
+ 0.325310f, 0.323859f, 0.322408f, 0.320955f, 0.319502f, 0.318048f, 0.316593f, 0.315138f,
+ 0.313682f, 0.312225f, 0.310767f, 0.309309f, 0.307850f, 0.306390f, 0.304929f, 0.303468f,
+ 0.302006f, 0.300543f, 0.299080f, 0.297616f, 0.296151f, 0.294685f, 0.293219f, 0.291752f,
+ 0.290285f, 0.288816f, 0.287347f, 0.285878f, 0.284408f, 0.282937f, 0.281465f, 0.279993f,
+ 0.278520f, 0.277046f, 0.275572f, 0.274097f, 0.272621f, 0.271145f, 0.269668f, 0.268191f,
+ 0.266713f, 0.265234f, 0.263755f, 0.262275f, 0.260794f, 0.259313f, 0.257831f, 0.256349f,
+ 0.254866f, 0.253382f, 0.251898f, 0.250413f, 0.248928f, 0.247442f, 0.245955f, 0.244468f,
+ 0.242980f, 0.241492f, 0.240003f, 0.238514f, 0.237024f, 0.235533f, 0.234042f, 0.232550f,
+ 0.231058f, 0.229565f, 0.228072f, 0.226578f, 0.225084f, 0.223589f, 0.222094f, 0.220598f,
+ 0.219101f, 0.217604f, 0.216107f, 0.214609f, 0.213110f, 0.211611f, 0.210112f, 0.208612f,
+ 0.207111f, 0.205610f, 0.204109f, 0.202607f, 0.201105f, 0.199602f, 0.198098f, 0.196595f,
+ 0.195090f, 0.193586f, 0.192080f, 0.190575f, 0.189069f, 0.187562f, 0.186055f, 0.184548f,
+ 0.183040f, 0.181532f, 0.180023f, 0.178514f, 0.177004f, 0.175494f, 0.173984f, 0.172473f,
+ 0.170962f, 0.169450f, 0.167938f, 0.166426f, 0.164913f, 0.163400f, 0.161886f, 0.160372f,
+ 0.158858f, 0.157343f, 0.155828f, 0.154313f, 0.152797f, 0.151281f, 0.149765f, 0.148248f,
+ 0.146730f, 0.145213f, 0.143695f, 0.142177f, 0.140658f, 0.139139f, 0.137620f, 0.136101f,
+ 0.134581f, 0.133061f, 0.131540f, 0.130019f, 0.128498f, 0.126977f, 0.125455f, 0.123933f,
+ 0.122411f, 0.120888f, 0.119365f, 0.117842f, 0.116319f, 0.114795f, 0.113271f, 0.111747f,
+ 0.110222f, 0.108697f, 0.107172f, 0.105647f, 0.104122f, 0.102596f, 0.101070f, 0.099544f,
+ 0.098017f, 0.096490f, 0.094963f, 0.093436f, 0.091909f, 0.090381f, 0.088854f, 0.087326f,
+ 0.085797f, 0.084269f, 0.082740f, 0.081211f, 0.079682f, 0.078153f, 0.076624f, 0.075094f,
+ 0.073565f, 0.072035f, 0.070505f, 0.068974f, 0.067444f, 0.065913f, 0.064383f, 0.062852f,
+ 0.061321f, 0.059790f, 0.058258f, 0.056727f, 0.055195f, 0.053664f, 0.052132f, 0.050600f,
+ 0.049068f, 0.047535f, 0.046003f, 0.044471f, 0.042938f, 0.041406f, 0.039873f, 0.038340f,
+ 0.036807f, 0.035274f, 0.033741f, 0.032208f, 0.030675f, 0.029142f, 0.027608f, 0.026075f,
+ 0.024541f, 0.023008f, 0.021474f, 0.019940f, 0.018407f, 0.016873f, 0.015339f, 0.013805f,
+ 0.012272f, 0.010738f, 0.009204f, 0.007670f, 0.006136f, 0.004602f, 0.003068f, 0.001534f,
+ 0.000000f, 0.001534f, 0.003068f, 0.004602f, 0.006136f, 0.007670f, 0.009204f, 0.010738f,
+ 0.012272f, 0.013805f, 0.015339f, 0.016873f, 0.018407f, 0.019940f, 0.021474f, 0.023008f,
+ 0.024541f, 0.026075f, 0.027608f, 0.029142f, 0.030675f, 0.032208f, 0.033741f, 0.035274f,
+ 0.036807f, 0.038340f, 0.039873f, 0.041406f, 0.042938f, 0.044471f, 0.046003f, 0.047535f,
+ 0.049068f, 0.050600f, 0.052132f, 0.053664f, 0.055195f, 0.056727f, 0.058258f, 0.059790f,
+ 0.061321f, 0.062852f, 0.064383f, 0.065913f, 0.067444f, 0.068974f, 0.070505f, 0.072035f,
+ 0.073565f, 0.075094f, 0.076624f, 0.078153f, 0.079682f, 0.081211f, 0.082740f, 0.084269f,
+ 0.085797f, 0.087326f, 0.088854f, 0.090381f, 0.091909f, 0.093436f, 0.094963f, 0.096490f,
+ 0.098017f, 0.099544f, 0.101070f, 0.102596f, 0.104122f, 0.105647f, 0.107172f, 0.108697f,
+ 0.110222f, 0.111747f, 0.113271f, 0.114795f, 0.116319f, 0.117842f, 0.119365f, 0.120888f,
+ 0.122411f, 0.123933f, 0.125455f, 0.126977f, 0.128498f, 0.130019f, 0.131540f, 0.133061f,
+ 0.134581f, 0.136101f, 0.137620f, 0.139139f, 0.140658f, 0.142177f, 0.143695f, 0.145213f,
+ 0.146730f, 0.148248f, 0.149765f, 0.151281f, 0.152797f, 0.154313f, 0.155828f, 0.157343f,
+ 0.158858f, 0.160372f, 0.161886f, 0.163400f, 0.164913f, 0.166426f, 0.167938f, 0.169450f,
+ 0.170962f, 0.172473f, 0.173984f, 0.175494f, 0.177004f, 0.178514f, 0.180023f, 0.181532f,
+ 0.183040f, 0.184548f, 0.186055f, 0.187562f, 0.189069f, 0.190575f, 0.192080f, 0.193586f,
+ 0.195090f, 0.196595f, 0.198098f, 0.199602f, 0.201105f, 0.202607f, 0.204109f, 0.205610f,
+ 0.207111f, 0.208612f, 0.210112f, 0.211611f, 0.213110f, 0.214609f, 0.216107f, 0.217604f,
+ 0.219101f, 0.220598f, 0.222094f, 0.223589f, 0.225084f, 0.226578f, 0.228072f, 0.229565f,
+ 0.231058f, 0.232550f, 0.234042f, 0.235533f, 0.237024f, 0.238514f, 0.240003f, 0.241492f,
+ 0.242980f, 0.244468f, 0.245955f, 0.247442f, 0.248928f, 0.250413f, 0.251898f, 0.253382f,
+ 0.254866f, 0.256349f, 0.257831f, 0.259313f, 0.260794f, 0.262275f, 0.263755f, 0.265234f,
+ 0.266713f, 0.268191f, 0.269668f, 0.271145f, 0.272621f, 0.274097f, 0.275572f, 0.277046f,
+ 0.278520f, 0.279993f, 0.281465f, 0.282937f, 0.284408f, 0.285878f, 0.287347f, 0.288816f,
+ 0.290285f, 0.291752f, 0.293219f, 0.294685f, 0.296151f, 0.297616f, 0.299080f, 0.300543f,
+ 0.302006f, 0.303468f, 0.304929f, 0.306390f, 0.307850f, 0.309309f, 0.310767f, 0.312225f,
+ 0.313682f, 0.315138f, 0.316593f, 0.318048f, 0.319502f, 0.320955f, 0.322408f, 0.323859f,
+ 0.325310f, 0.326760f, 0.328210f, 0.329658f, 0.331106f, 0.332553f, 0.334000f, 0.335445f,
+ 0.336890f, 0.338334f, 0.339777f, 0.341219f, 0.342661f, 0.344101f, 0.345541f, 0.346980f,
+ 0.348419f, 0.349856f, 0.351293f, 0.352729f, 0.354164f, 0.355598f, 0.357031f, 0.358463f,
+ 0.359895f, 0.361326f, 0.362756f, 0.364185f, 0.365613f, 0.367040f, 0.368467f, 0.369892f,
+ 0.371317f, 0.372741f, 0.374164f, 0.375586f, 0.377007f, 0.378428f, 0.379847f, 0.381266f,
+ 0.382683f, 0.384100f, 0.385516f, 0.386931f, 0.388345f, 0.389758f, 0.391170f, 0.392582f,
+ 0.393992f, 0.395401f, 0.396810f, 0.398218f, 0.399624f, 0.401030f, 0.402435f, 0.403838f,
+ 0.405241f, 0.406643f, 0.408044f, 0.409444f, 0.410843f, 0.412241f, 0.413638f, 0.415034f,
+ 0.416430f, 0.417824f, 0.419217f, 0.420609f, 0.422000f, 0.423390f, 0.424780f, 0.426168f,
+ 0.427555f, 0.428941f, 0.430326f, 0.431711f, 0.433094f, 0.434476f, 0.435857f, 0.437237f,
+ 0.438616f, 0.439994f, 0.441371f, 0.442747f, 0.444122f, 0.445496f, 0.446869f, 0.448241f,
+ 0.449611f, 0.450981f, 0.452350f, 0.453717f, 0.455084f, 0.456449f, 0.457813f, 0.459177f,
+ 0.460539f, 0.461900f, 0.463260f, 0.464619f, 0.465977f, 0.467333f, 0.468689f, 0.470043f,
+ 0.471397f, 0.472749f, 0.474100f, 0.475450f, 0.476799f, 0.478147f, 0.479494f, 0.480839f,
+ 0.482184f, 0.483527f, 0.484869f, 0.486210f, 0.487550f, 0.488889f, 0.490226f, 0.491563f,
+ 0.492898f, 0.494232f, 0.495565f, 0.496897f, 0.498228f, 0.499557f, 0.500885f, 0.502212f,
+ 0.503538f, 0.504863f, 0.506187f, 0.507509f, 0.508830f, 0.510150f, 0.511469f, 0.512786f,
+ 0.514103f, 0.515418f, 0.516732f, 0.518045f, 0.519356f, 0.520666f, 0.521975f, 0.523283f,
+ 0.524590f, 0.525895f, 0.527199f, 0.528502f, 0.529804f, 0.531104f, 0.532403f, 0.533701f,
+ 0.534998f, 0.536293f, 0.537587f, 0.538880f, 0.540171f, 0.541462f, 0.542751f, 0.544039f,
+ 0.545325f, 0.546610f, 0.547894f, 0.549177f, 0.550458f, 0.551738f, 0.553017f, 0.554294f,
+ 0.555570f, 0.556845f, 0.558119f, 0.559391f, 0.560662f, 0.561931f, 0.563199f, 0.564466f,
+ 0.565732f, 0.566996f, 0.568259f, 0.569521f, 0.570781f, 0.572040f, 0.573297f, 0.574553f,
+ 0.575808f, 0.577062f, 0.578314f, 0.579565f, 0.580814f, 0.582062f, 0.583309f, 0.584554f,
+ 0.585798f, 0.587040f, 0.588282f, 0.589521f, 0.590760f, 0.591997f, 0.593232f, 0.594467f,
+ 0.595699f, 0.596931f, 0.598161f, 0.599389f, 0.600616f, 0.601842f, 0.603067f, 0.604290f,
+ 0.605511f, 0.606731f, 0.607950f, 0.609167f, 0.610383f, 0.611597f, 0.612810f, 0.614022f,
+ 0.615232f, 0.616440f, 0.617647f, 0.618853f, 0.620057f, 0.621260f, 0.622461f, 0.623661f,
+ 0.624860f, 0.626056f, 0.627252f, 0.628446f, 0.629638f, 0.630829f, 0.632019f, 0.633207f,
+ 0.634393f, 0.635578f, 0.636762f, 0.637944f, 0.639124f, 0.640303f, 0.641481f, 0.642657f,
+ 0.643832f, 0.645005f, 0.646176f, 0.647346f, 0.648514f, 0.649681f, 0.650847f, 0.652011f,
+ 0.653173f, 0.654334f, 0.655493f, 0.656651f, 0.657807f, 0.658961f, 0.660114f, 0.661266f,
+ 0.662416f, 0.663564f, 0.664711f, 0.665856f, 0.667000f, 0.668142f, 0.669283f, 0.670422f,
+ 0.671559f, 0.672695f, 0.673829f, 0.674962f, 0.676093f, 0.677222f, 0.678350f, 0.679476f,
+ 0.680601f, 0.681724f, 0.682846f, 0.683965f, 0.685084f, 0.686200f, 0.687315f, 0.688429f,
+ 0.689541f, 0.690651f, 0.691759f, 0.692866f, 0.693971f, 0.695075f, 0.696177f, 0.697277f,
+ 0.698376f, 0.699473f, 0.700569f, 0.701663f, 0.702755f, 0.703845f, 0.704934f, 0.706021f,
+ 0.707107f, 0.708191f, 0.709273f, 0.710353f, 0.711432f, 0.712509f, 0.713585f, 0.714659f,
+ 0.715731f, 0.716801f, 0.717870f, 0.718937f, 0.720003f, 0.721066f, 0.722128f, 0.723188f,
+ 0.724247f, 0.725304f, 0.726359f, 0.727413f, 0.728464f, 0.729514f, 0.730563f, 0.731609f,
+ 0.732654f, 0.733697f, 0.734739f, 0.735779f, 0.736817f, 0.737853f, 0.738887f, 0.739920f,
+ 0.740951f, 0.741980f, 0.743008f, 0.744034f, 0.745058f, 0.746080f, 0.747101f, 0.748119f,
+ 0.749136f, 0.750152f, 0.751165f, 0.752177f, 0.753187f, 0.754195f, 0.755201f, 0.756206f,
+ 0.757209f, 0.758210f, 0.759209f, 0.760207f, 0.761202f, 0.762196f, 0.763188f, 0.764179f,
+ 0.765167f, 0.766154f, 0.767139f, 0.768122f, 0.769103f, 0.770083f, 0.771061f, 0.772036f,
+ 0.773010f, 0.773983f, 0.774953f, 0.775922f, 0.776888f, 0.777853f, 0.778817f, 0.779778f,
+ 0.780737f, 0.781695f, 0.782651f, 0.783605f, 0.784557f, 0.785507f, 0.786455f, 0.787402f,
+ 0.788346f, 0.789289f, 0.790230f, 0.791169f, 0.792107f, 0.793042f, 0.793975f, 0.794907f,
+ 0.795837f, 0.796765f, 0.797691f, 0.798615f, 0.799537f, 0.800458f, 0.801376f, 0.802293f,
+ 0.803208f, 0.804120f, 0.805031f, 0.805940f, 0.806848f, 0.807753f, 0.808656f, 0.809558f,
+ 0.810457f, 0.811355f, 0.812251f, 0.813144f, 0.814036f, 0.814926f, 0.815814f, 0.816701f,
+ 0.817585f, 0.818467f, 0.819348f, 0.820226f, 0.821102f, 0.821977f, 0.822850f, 0.823721f,
+ 0.824589f, 0.825456f, 0.826321f, 0.827184f, 0.828045f, 0.828904f, 0.829761f, 0.830616f,
+ 0.831470f, 0.832321f, 0.833170f, 0.834018f, 0.834863f, 0.835706f, 0.836548f, 0.837387f,
+ 0.838225f, 0.839060f, 0.839894f, 0.840725f, 0.841555f, 0.842383f, 0.843208f, 0.844032f,
+ 0.844854f, 0.845673f, 0.846491f, 0.847307f, 0.848120f, 0.848932f, 0.849742f, 0.850549f,
+ 0.851355f, 0.852159f, 0.852961f, 0.853760f, 0.854558f, 0.855354f, 0.856147f, 0.856939f,
+ 0.857729f, 0.858516f, 0.859302f, 0.860085f, 0.860867f, 0.861646f, 0.862424f, 0.863199f,
+ 0.863973f, 0.864744f, 0.865514f, 0.866281f, 0.867046f, 0.867809f, 0.868571f, 0.869330f,
+ 0.870087f, 0.870842f, 0.871595f, 0.872346f, 0.873095f, 0.873842f, 0.874587f, 0.875329f,
+ 0.876070f, 0.876809f, 0.877545f, 0.878280f, 0.879012f, 0.879743f, 0.880471f, 0.881197f,
+ 0.881921f, 0.882643f, 0.883363f, 0.884081f, 0.884797f, 0.885511f, 0.886223f, 0.886932f,
+ 0.887640f, 0.888345f, 0.889048f, 0.889750f, 0.890449f, 0.891146f, 0.891841f, 0.892534f,
+ 0.893224f, 0.893913f, 0.894599f, 0.895284f, 0.895966f, 0.896646f, 0.897325f, 0.898001f,
+ 0.898674f, 0.899346f, 0.900016f, 0.900683f, 0.901349f, 0.902012f, 0.902673f, 0.903332f,
+ 0.903989f, 0.904644f, 0.905297f, 0.905947f, 0.906596f, 0.907242f, 0.907886f, 0.908528f,
+ 0.909168f, 0.909806f, 0.910441f, 0.911075f, 0.911706f, 0.912335f, 0.912962f, 0.913587f,
+ 0.914210f, 0.914830f, 0.915449f, 0.916065f, 0.916679f, 0.917291f, 0.917901f, 0.918508f,
+ 0.919114f, 0.919717f, 0.920318f, 0.920917f, 0.921514f, 0.922109f, 0.922701f, 0.923291f,
+ 0.923880f, 0.924465f, 0.925049f, 0.925631f, 0.926210f, 0.926787f, 0.927363f, 0.927935f,
+ 0.928506f, 0.929075f, 0.929641f, 0.930205f, 0.930767f, 0.931327f, 0.931884f, 0.932440f,
+ 0.932993f, 0.933544f, 0.934093f, 0.934639f, 0.935184f, 0.935726f, 0.936266f, 0.936803f,
+ 0.937339f, 0.937872f, 0.938404f, 0.938932f, 0.939459f, 0.939984f, 0.940506f, 0.941026f,
+ 0.941544f, 0.942060f, 0.942573f, 0.943084f, 0.943593f, 0.944100f, 0.944605f, 0.945107f,
+ 0.945607f, 0.946105f, 0.946601f, 0.947094f, 0.947586f, 0.948075f, 0.948561f, 0.949046f,
+ 0.949528f, 0.950008f, 0.950486f, 0.950962f, 0.951435f, 0.951906f, 0.952375f, 0.952842f,
+ 0.953306f, 0.953768f, 0.954228f, 0.954686f, 0.955141f, 0.955594f, 0.956045f, 0.956494f,
+ 0.956940f, 0.957385f, 0.957826f, 0.958266f, 0.958703f, 0.959139f, 0.959572f, 0.960002f,
+ 0.960431f, 0.960857f, 0.961280f, 0.961702f, 0.962121f, 0.962538f, 0.962953f, 0.963366f,
+ 0.963776f, 0.964184f, 0.964590f, 0.964993f, 0.965394f, 0.965793f, 0.966190f, 0.966584f,
+ 0.966976f, 0.967366f, 0.967754f, 0.968139f, 0.968522f, 0.968903f, 0.969281f, 0.969657f,
+ 0.970031f, 0.970403f, 0.970772f, 0.971139f, 0.971504f, 0.971866f, 0.972227f, 0.972584f,
+ 0.972940f, 0.973293f, 0.973644f, 0.973993f, 0.974339f, 0.974684f, 0.975025f, 0.975365f,
+ 0.975702f, 0.976037f, 0.976370f, 0.976700f, 0.977028f, 0.977354f, 0.977677f, 0.977998f,
+ 0.978317f, 0.978634f, 0.978948f, 0.979260f, 0.979570f, 0.979877f, 0.980182f, 0.980485f,
+ 0.980785f, 0.981083f, 0.981379f, 0.981673f, 0.981964f, 0.982253f, 0.982539f, 0.982824f,
+ 0.983105f, 0.983385f, 0.983662f, 0.983937f, 0.984210f, 0.984480f, 0.984748f, 0.985014f,
+ 0.985278f, 0.985539f, 0.985798f, 0.986054f, 0.986308f, 0.986560f, 0.986809f, 0.987057f,
+ 0.987301f, 0.987544f, 0.987784f, 0.988022f, 0.988258f, 0.988491f, 0.988722f, 0.988950f,
+ 0.989177f, 0.989400f, 0.989622f, 0.989841f, 0.990058f, 0.990273f, 0.990485f, 0.990695f,
+ 0.990903f, 0.991108f, 0.991311f, 0.991511f, 0.991710f, 0.991906f, 0.992099f, 0.992291f,
+ 0.992480f, 0.992666f, 0.992850f, 0.993032f, 0.993212f, 0.993389f, 0.993564f, 0.993737f,
+ 0.993907f, 0.994075f, 0.994240f, 0.994404f, 0.994565f, 0.994723f, 0.994879f, 0.995033f,
+ 0.995185f, 0.995334f, 0.995481f, 0.995625f, 0.995767f, 0.995907f, 0.996045f, 0.996180f,
+ 0.996313f, 0.996443f, 0.996571f, 0.996697f, 0.996820f, 0.996941f, 0.997060f, 0.997176f,
+ 0.997290f, 0.997402f, 0.997511f, 0.997618f, 0.997723f, 0.997825f, 0.997925f, 0.998023f,
+ 0.998118f, 0.998211f, 0.998302f, 0.998390f, 0.998476f, 0.998559f, 0.998640f, 0.998719f,
+ 0.998795f, 0.998870f, 0.998941f, 0.999011f, 0.999078f, 0.999142f, 0.999205f, 0.999265f,
+ 0.999322f, 0.999378f, 0.999431f, 0.999481f, 0.999529f, 0.999575f, 0.999619f, 0.999660f,
+ 0.999699f, 0.999735f, 0.999769f, 0.999801f, 0.999831f, 0.999858f, 0.999882f, 0.999905f,
+ 0.999925f, 0.999942f, 0.999958f, 0.999971f, 0.999981f, 0.999989f, 0.999995f, 0.999999f
+};
+
+static const float cosTable8192[4096] = {
+ 1.000000f, 1.000000f, 0.999999f, 0.999997f, 0.999995f, 0.999993f, 0.999989f, 0.999986f,
+ 0.999981f, 0.999976f, 0.999971f, 0.999964f, 0.999958f, 0.999950f, 0.999942f, 0.999934f,
+ 0.999925f, 0.999915f, 0.999905f, 0.999894f, 0.999882f, 0.999870f, 0.999858f, 0.999844f,
+ 0.999831f, 0.999816f, 0.999801f, 0.999786f, 0.999769f, 0.999753f, 0.999735f, 0.999717f,
+ 0.999699f, 0.999680f, 0.999660f, 0.999640f, 0.999619f, 0.999597f, 0.999575f, 0.999553f,
+ 0.999529f, 0.999506f, 0.999481f, 0.999456f, 0.999431f, 0.999404f, 0.999378f, 0.999350f,
+ 0.999322f, 0.999294f, 0.999265f, 0.999235f, 0.999205f, 0.999174f, 0.999142f, 0.999110f,
+ 0.999078f, 0.999044f, 0.999011f, 0.998976f, 0.998941f, 0.998906f, 0.998870f, 0.998833f,
+ 0.998795f, 0.998758f, 0.998719f, 0.998680f, 0.998640f, 0.998600f, 0.998559f, 0.998518f,
+ 0.998476f, 0.998433f, 0.998390f, 0.998346f, 0.998302f, 0.998257f, 0.998211f, 0.998165f,
+ 0.998118f, 0.998071f, 0.998023f, 0.997974f, 0.997925f, 0.997876f, 0.997825f, 0.997774f,
+ 0.997723f, 0.997671f, 0.997618f, 0.997565f, 0.997511f, 0.997457f, 0.997402f, 0.997347f,
+ 0.997290f, 0.997234f, 0.997176f, 0.997119f, 0.997060f, 0.997001f, 0.996941f, 0.996881f,
+ 0.996820f, 0.996759f, 0.996697f, 0.996634f, 0.996571f, 0.996507f, 0.996443f, 0.996378f,
+ 0.996313f, 0.996247f, 0.996180f, 0.996113f, 0.996045f, 0.995976f, 0.995907f, 0.995838f,
+ 0.995767f, 0.995697f, 0.995625f, 0.995553f, 0.995481f, 0.995408f, 0.995334f, 0.995260f,
+ 0.995185f, 0.995109f, 0.995033f, 0.994957f, 0.994879f, 0.994802f, 0.994723f, 0.994644f,
+ 0.994565f, 0.994484f, 0.994404f, 0.994322f, 0.994240f, 0.994158f, 0.994075f, 0.993991f,
+ 0.993907f, 0.993822f, 0.993737f, 0.993651f, 0.993564f, 0.993477f, 0.993389f, 0.993301f,
+ 0.993212f, 0.993122f, 0.993032f, 0.992942f, 0.992850f, 0.992759f, 0.992666f, 0.992573f,
+ 0.992480f, 0.992385f, 0.992291f, 0.992195f, 0.992099f, 0.992003f, 0.991906f, 0.991808f,
+ 0.991710f, 0.991611f, 0.991511f, 0.991411f, 0.991311f, 0.991210f, 0.991108f, 0.991006f,
+ 0.990903f, 0.990799f, 0.990695f, 0.990590f, 0.990485f, 0.990379f, 0.990273f, 0.990166f,
+ 0.990058f, 0.989950f, 0.989841f, 0.989732f, 0.989622f, 0.989511f, 0.989400f, 0.989289f,
+ 0.989177f, 0.989064f, 0.988950f, 0.988836f, 0.988722f, 0.988607f, 0.988491f, 0.988374f,
+ 0.988258f, 0.988140f, 0.988022f, 0.987903f, 0.987784f, 0.987664f, 0.987544f, 0.987423f,
+ 0.987301f, 0.987179f, 0.987057f, 0.986933f, 0.986809f, 0.986685f, 0.986560f, 0.986434f,
+ 0.986308f, 0.986181f, 0.986054f, 0.985926f, 0.985798f, 0.985668f, 0.985539f, 0.985408f,
+ 0.985278f, 0.985146f, 0.985014f, 0.984882f, 0.984748f, 0.984615f, 0.984480f, 0.984346f,
+ 0.984210f, 0.984074f, 0.983937f, 0.983800f, 0.983662f, 0.983524f, 0.983385f, 0.983246f,
+ 0.983105f, 0.982965f, 0.982824f, 0.982682f, 0.982539f, 0.982396f, 0.982253f, 0.982109f,
+ 0.981964f, 0.981819f, 0.981673f, 0.981526f, 0.981379f, 0.981232f, 0.981083f, 0.980935f,
+ 0.980785f, 0.980635f, 0.980485f, 0.980334f, 0.980182f, 0.980030f, 0.979877f, 0.979724f,
+ 0.979570f, 0.979415f, 0.979260f, 0.979104f, 0.978948f, 0.978791f, 0.978634f, 0.978476f,
+ 0.978317f, 0.978158f, 0.977998f, 0.977838f, 0.977677f, 0.977516f, 0.977354f, 0.977191f,
+ 0.977028f, 0.976864f, 0.976700f, 0.976535f, 0.976370f, 0.976204f, 0.976037f, 0.975870f,
+ 0.975702f, 0.975534f, 0.975365f, 0.975195f, 0.975025f, 0.974855f, 0.974684f, 0.974512f,
+ 0.974339f, 0.974166f, 0.973993f, 0.973819f, 0.973644f, 0.973469f, 0.973293f, 0.973117f,
+ 0.972940f, 0.972762f, 0.972584f, 0.972406f, 0.972227f, 0.972047f, 0.971866f, 0.971685f,
+ 0.971504f, 0.971322f, 0.971139f, 0.970956f, 0.970772f, 0.970588f, 0.970403f, 0.970217f,
+ 0.970031f, 0.969845f, 0.969657f, 0.969470f, 0.969281f, 0.969092f, 0.968903f, 0.968713f,
+ 0.968522f, 0.968331f, 0.968139f, 0.967947f, 0.967754f, 0.967560f, 0.967366f, 0.967172f,
+ 0.966976f, 0.966781f, 0.966584f, 0.966387f, 0.966190f, 0.965992f, 0.965793f, 0.965594f,
+ 0.965394f, 0.965194f, 0.964993f, 0.964792f, 0.964590f, 0.964387f, 0.964184f, 0.963980f,
+ 0.963776f, 0.963571f, 0.963366f, 0.963160f, 0.962953f, 0.962746f, 0.962538f, 0.962330f,
+ 0.962121f, 0.961912f, 0.961702f, 0.961492f, 0.961280f, 0.961069f, 0.960857f, 0.960644f,
+ 0.960431f, 0.960217f, 0.960002f, 0.959787f, 0.959572f, 0.959355f, 0.959139f, 0.958921f,
+ 0.958703f, 0.958485f, 0.958266f, 0.958046f, 0.957826f, 0.957606f, 0.957385f, 0.957163f,
+ 0.956940f, 0.956717f, 0.956494f, 0.956270f, 0.956045f, 0.955820f, 0.955594f, 0.955368f,
+ 0.955141f, 0.954914f, 0.954686f, 0.954457f, 0.954228f, 0.953998f, 0.953768f, 0.953537f,
+ 0.953306f, 0.953074f, 0.952842f, 0.952609f, 0.952375f, 0.952141f, 0.951906f, 0.951671f,
+ 0.951435f, 0.951199f, 0.950962f, 0.950724f, 0.950486f, 0.950247f, 0.950008f, 0.949768f,
+ 0.949528f, 0.949287f, 0.949046f, 0.948804f, 0.948561f, 0.948318f, 0.948075f, 0.947830f,
+ 0.947586f, 0.947340f, 0.947094f, 0.946848f, 0.946601f, 0.946353f, 0.946105f, 0.945857f,
+ 0.945607f, 0.945358f, 0.945107f, 0.944856f, 0.944605f, 0.944353f, 0.944100f, 0.943847f,
+ 0.943593f, 0.943339f, 0.943084f, 0.942829f, 0.942573f, 0.942317f, 0.942060f, 0.941802f,
+ 0.941544f, 0.941285f, 0.941026f, 0.940766f, 0.940506f, 0.940245f, 0.939984f, 0.939722f,
+ 0.939459f, 0.939196f, 0.938932f, 0.938668f, 0.938404f, 0.938138f, 0.937872f, 0.937606f,
+ 0.937339f, 0.937072f, 0.936803f, 0.936535f, 0.936266f, 0.935996f, 0.935726f, 0.935455f,
+ 0.935184f, 0.934912f, 0.934639f, 0.934366f, 0.934093f, 0.933818f, 0.933544f, 0.933269f,
+ 0.932993f, 0.932716f, 0.932440f, 0.932162f, 0.931884f, 0.931606f, 0.931327f, 0.931047f,
+ 0.930767f, 0.930486f, 0.930205f, 0.929923f, 0.929641f, 0.929358f, 0.929075f, 0.928791f,
+ 0.928506f, 0.928221f, 0.927935f, 0.927649f, 0.927363f, 0.927075f, 0.926787f, 0.926499f,
+ 0.926210f, 0.925921f, 0.925631f, 0.925340f, 0.925049f, 0.924758f, 0.924465f, 0.924173f,
+ 0.923880f, 0.923586f, 0.923291f, 0.922997f, 0.922701f, 0.922405f, 0.922109f, 0.921812f,
+ 0.921514f, 0.921216f, 0.920917f, 0.920618f, 0.920318f, 0.920018f, 0.919717f, 0.919416f,
+ 0.919114f, 0.918811f, 0.918508f, 0.918205f, 0.917901f, 0.917596f, 0.917291f, 0.916985f,
+ 0.916679f, 0.916372f, 0.916065f, 0.915757f, 0.915449f, 0.915140f, 0.914830f, 0.914520f,
+ 0.914210f, 0.913899f, 0.913587f, 0.913275f, 0.912962f, 0.912649f, 0.912335f, 0.912021f,
+ 0.911706f, 0.911391f, 0.911075f, 0.910758f, 0.910441f, 0.910124f, 0.909806f, 0.909487f,
+ 0.909168f, 0.908848f, 0.908528f, 0.908207f, 0.907886f, 0.907564f, 0.907242f, 0.906919f,
+ 0.906596f, 0.906272f, 0.905947f, 0.905622f, 0.905297f, 0.904971f, 0.904644f, 0.904317f,
+ 0.903989f, 0.903661f, 0.903332f, 0.903003f, 0.902673f, 0.902343f, 0.902012f, 0.901681f,
+ 0.901349f, 0.901016f, 0.900683f, 0.900350f, 0.900016f, 0.899681f, 0.899346f, 0.899011f,
+ 0.898674f, 0.898338f, 0.898001f, 0.897663f, 0.897325f, 0.896986f, 0.896646f, 0.896307f,
+ 0.895966f, 0.895625f, 0.895284f, 0.894942f, 0.894599f, 0.894256f, 0.893913f, 0.893569f,
+ 0.893224f, 0.892879f, 0.892534f, 0.892187f, 0.891841f, 0.891493f, 0.891146f, 0.890797f,
+ 0.890449f, 0.890099f, 0.889750f, 0.889399f, 0.889048f, 0.888697f, 0.888345f, 0.887993f,
+ 0.887640f, 0.887286f, 0.886932f, 0.886578f, 0.886223f, 0.885867f, 0.885511f, 0.885154f,
+ 0.884797f, 0.884439f, 0.884081f, 0.883723f, 0.883363f, 0.883004f, 0.882643f, 0.882283f,
+ 0.881921f, 0.881559f, 0.881197f, 0.880834f, 0.880471f, 0.880107f, 0.879743f, 0.879378f,
+ 0.879012f, 0.878646f, 0.878280f, 0.877913f, 0.877545f, 0.877177f, 0.876809f, 0.876440f,
+ 0.876070f, 0.875700f, 0.875329f, 0.874958f, 0.874587f, 0.874215f, 0.873842f, 0.873469f,
+ 0.873095f, 0.872721f, 0.872346f, 0.871971f, 0.871595f, 0.871219f, 0.870842f, 0.870465f,
+ 0.870087f, 0.869709f, 0.869330f, 0.868951f, 0.868571f, 0.868190f, 0.867809f, 0.867428f,
+ 0.867046f, 0.866664f, 0.866281f, 0.865898f, 0.865514f, 0.865129f, 0.864744f, 0.864359f,
+ 0.863973f, 0.863586f, 0.863199f, 0.862812f, 0.862424f, 0.862035f, 0.861646f, 0.861257f,
+ 0.860867f, 0.860476f, 0.860085f, 0.859694f, 0.859302f, 0.858909f, 0.858516f, 0.858123f,
+ 0.857729f, 0.857334f, 0.856939f, 0.856543f, 0.856147f, 0.855751f, 0.855354f, 0.854956f,
+ 0.854558f, 0.854159f, 0.853760f, 0.853361f, 0.852961f, 0.852560f, 0.852159f, 0.851757f,
+ 0.851355f, 0.850953f, 0.850549f, 0.850146f, 0.849742f, 0.849337f, 0.848932f, 0.848526f,
+ 0.848120f, 0.847714f, 0.847307f, 0.846899f, 0.846491f, 0.846082f, 0.845673f, 0.845264f,
+ 0.844854f, 0.844443f, 0.844032f, 0.843620f, 0.843208f, 0.842796f, 0.842383f, 0.841969f,
+ 0.841555f, 0.841140f, 0.840725f, 0.840310f, 0.839894f, 0.839477f, 0.839060f, 0.838643f,
+ 0.838225f, 0.837806f, 0.837387f, 0.836968f, 0.836548f, 0.836127f, 0.835706f, 0.835285f,
+ 0.834863f, 0.834440f, 0.834018f, 0.833594f, 0.833170f, 0.832746f, 0.832321f, 0.831895f,
+ 0.831470f, 0.831043f, 0.830616f, 0.830189f, 0.829761f, 0.829333f, 0.828904f, 0.828475f,
+ 0.828045f, 0.827615f, 0.827184f, 0.826753f, 0.826321f, 0.825889f, 0.825456f, 0.825023f,
+ 0.824589f, 0.824155f, 0.823721f, 0.823285f, 0.822850f, 0.822414f, 0.821977f, 0.821540f,
+ 0.821102f, 0.820664f, 0.820226f, 0.819787f, 0.819348f, 0.818908f, 0.818467f, 0.818026f,
+ 0.817585f, 0.817143f, 0.816701f, 0.816258f, 0.815814f, 0.815371f, 0.814926f, 0.814482f,
+ 0.814036f, 0.813591f, 0.813144f, 0.812698f, 0.812251f, 0.811803f, 0.811355f, 0.810906f,
+ 0.810457f, 0.810008f, 0.809558f, 0.809107f, 0.808656f, 0.808205f, 0.807753f, 0.807300f,
+ 0.806848f, 0.806394f, 0.805940f, 0.805486f, 0.805031f, 0.804576f, 0.804120f, 0.803664f,
+ 0.803208f, 0.802750f, 0.802293f, 0.801835f, 0.801376f, 0.800917f, 0.800458f, 0.799998f,
+ 0.799537f, 0.799076f, 0.798615f, 0.798153f, 0.797691f, 0.797228f, 0.796765f, 0.796301f,
+ 0.795837f, 0.795372f, 0.794907f, 0.794442f, 0.793975f, 0.793509f, 0.793042f, 0.792575f,
+ 0.792107f, 0.791638f, 0.791169f, 0.790700f, 0.790230f, 0.789760f, 0.789289f, 0.788818f,
+ 0.788346f, 0.787874f, 0.787402f, 0.786929f, 0.786455f, 0.785981f, 0.785507f, 0.785032f,
+ 0.784557f, 0.784081f, 0.783605f, 0.783128f, 0.782651f, 0.782173f, 0.781695f, 0.781216f,
+ 0.780737f, 0.780258f, 0.779778f, 0.779297f, 0.778817f, 0.778335f, 0.777853f, 0.777371f,
+ 0.776888f, 0.776405f, 0.775922f, 0.775438f, 0.774953f, 0.774468f, 0.773983f, 0.773497f,
+ 0.773010f, 0.772524f, 0.772036f, 0.771549f, 0.771061f, 0.770572f, 0.770083f, 0.769593f,
+ 0.769103f, 0.768613f, 0.768122f, 0.767631f, 0.767139f, 0.766647f, 0.766154f, 0.765661f,
+ 0.765167f, 0.764673f, 0.764179f, 0.763684f, 0.763188f, 0.762693f, 0.762196f, 0.761700f,
+ 0.761202f, 0.760705f, 0.760207f, 0.759708f, 0.759209f, 0.758710f, 0.758210f, 0.757710f,
+ 0.757209f, 0.756708f, 0.756206f, 0.755704f, 0.755201f, 0.754698f, 0.754195f, 0.753691f,
+ 0.753187f, 0.752682f, 0.752177f, 0.751671f, 0.751165f, 0.750659f, 0.750152f, 0.749644f,
+ 0.749136f, 0.748628f, 0.748119f, 0.747610f, 0.747101f, 0.746591f, 0.746080f, 0.745569f,
+ 0.745058f, 0.744546f, 0.744034f, 0.743521f, 0.743008f, 0.742494f, 0.741980f, 0.741466f,
+ 0.740951f, 0.740436f, 0.739920f, 0.739404f, 0.738887f, 0.738370f, 0.737853f, 0.737335f,
+ 0.736817f, 0.736298f, 0.735779f, 0.735259f, 0.734739f, 0.734218f, 0.733697f, 0.733176f,
+ 0.732654f, 0.732132f, 0.731609f, 0.731086f, 0.730563f, 0.730039f, 0.729514f, 0.728990f,
+ 0.728464f, 0.727939f, 0.727413f, 0.726886f, 0.726359f, 0.725832f, 0.725304f, 0.724776f,
+ 0.724247f, 0.723718f, 0.723188f, 0.722659f, 0.722128f, 0.721597f, 0.721066f, 0.720535f,
+ 0.720003f, 0.719470f, 0.718937f, 0.718404f, 0.717870f, 0.717336f, 0.716801f, 0.716266f,
+ 0.715731f, 0.715195f, 0.714659f, 0.714122f, 0.713585f, 0.713047f, 0.712509f, 0.711971f,
+ 0.711432f, 0.710893f, 0.710353f, 0.709813f, 0.709273f, 0.708732f, 0.708191f, 0.707649f,
+ 0.707107f, 0.706564f, 0.706021f, 0.705478f, 0.704934f, 0.704390f, 0.703845f, 0.703300f,
+ 0.702755f, 0.702209f, 0.701663f, 0.701116f, 0.700569f, 0.700021f, 0.699473f, 0.698925f,
+ 0.698376f, 0.697827f, 0.697277f, 0.696728f, 0.696177f, 0.695626f, 0.695075f, 0.694524f,
+ 0.693971f, 0.693419f, 0.692866f, 0.692313f, 0.691759f, 0.691205f, 0.690651f, 0.690096f,
+ 0.689541f, 0.688985f, 0.688429f, 0.687872f, 0.687315f, 0.686758f, 0.686200f, 0.685642f,
+ 0.685084f, 0.684525f, 0.683965f, 0.683406f, 0.682846f, 0.682285f, 0.681724f, 0.681163f,
+ 0.680601f, 0.680039f, 0.679476f, 0.678913f, 0.678350f, 0.677786f, 0.677222f, 0.676658f,
+ 0.676093f, 0.675527f, 0.674962f, 0.674396f, 0.673829f, 0.673262f, 0.672695f, 0.672127f,
+ 0.671559f, 0.670990f, 0.670422f, 0.669852f, 0.669283f, 0.668712f, 0.668142f, 0.667571f,
+ 0.667000f, 0.666428f, 0.665856f, 0.665284f, 0.664711f, 0.664138f, 0.663564f, 0.662990f,
+ 0.662416f, 0.661841f, 0.661266f, 0.660690f, 0.660114f, 0.659538f, 0.658961f, 0.658384f,
+ 0.657807f, 0.657229f, 0.656651f, 0.656072f, 0.655493f, 0.654913f, 0.654334f, 0.653753f,
+ 0.653173f, 0.652592f, 0.652011f, 0.651429f, 0.650847f, 0.650264f, 0.649681f, 0.649098f,
+ 0.648514f, 0.647930f, 0.647346f, 0.646761f, 0.646176f, 0.645590f, 0.645005f, 0.644418f,
+ 0.643832f, 0.643245f, 0.642657f, 0.642069f, 0.641481f, 0.640892f, 0.640303f, 0.639714f,
+ 0.639124f, 0.638534f, 0.637944f, 0.637353f, 0.636762f, 0.636170f, 0.635578f, 0.634986f,
+ 0.634393f, 0.633800f, 0.633207f, 0.632613f, 0.632019f, 0.631424f, 0.630829f, 0.630234f,
+ 0.629638f, 0.629042f, 0.628446f, 0.627849f, 0.627252f, 0.626654f, 0.626056f, 0.625458f,
+ 0.624860f, 0.624260f, 0.623661f, 0.623061f, 0.622461f, 0.621861f, 0.621260f, 0.620659f,
+ 0.620057f, 0.619455f, 0.618853f, 0.618250f, 0.617647f, 0.617044f, 0.616440f, 0.615836f,
+ 0.615232f, 0.614627f, 0.614022f, 0.613416f, 0.612810f, 0.612204f, 0.611597f, 0.610990f,
+ 0.610383f, 0.609775f, 0.609167f, 0.608559f, 0.607950f, 0.607341f, 0.606731f, 0.606121f,
+ 0.605511f, 0.604900f, 0.604290f, 0.603678f, 0.603067f, 0.602455f, 0.601842f, 0.601230f,
+ 0.600616f, 0.600003f, 0.599389f, 0.598775f, 0.598161f, 0.597546f, 0.596931f, 0.596315f,
+ 0.595699f, 0.595083f, 0.594467f, 0.593850f, 0.593232f, 0.592615f, 0.591997f, 0.591378f,
+ 0.590760f, 0.590141f, 0.589521f, 0.588902f, 0.588282f, 0.587661f, 0.587040f, 0.586419f,
+ 0.585798f, 0.585176f, 0.584554f, 0.583931f, 0.583309f, 0.582685f, 0.582062f, 0.581438f,
+ 0.580814f, 0.580189f, 0.579565f, 0.578939f, 0.578314f, 0.577688f, 0.577062f, 0.576435f,
+ 0.575808f, 0.575181f, 0.574553f, 0.573925f, 0.573297f, 0.572669f, 0.572040f, 0.571410f,
+ 0.570781f, 0.570151f, 0.569521f, 0.568890f, 0.568259f, 0.567628f, 0.566996f, 0.566364f,
+ 0.565732f, 0.565099f, 0.564466f, 0.563833f, 0.563199f, 0.562565f, 0.561931f, 0.561297f,
+ 0.560662f, 0.560026f, 0.559391f, 0.558755f, 0.558119f, 0.557482f, 0.556845f, 0.556208f,
+ 0.555570f, 0.554932f, 0.554294f, 0.553656f, 0.553017f, 0.552378f, 0.551738f, 0.551098f,
+ 0.550458f, 0.549818f, 0.549177f, 0.548536f, 0.547894f, 0.547252f, 0.546610f, 0.545968f,
+ 0.545325f, 0.544682f, 0.544039f, 0.543395f, 0.542751f, 0.542106f, 0.541462f, 0.540817f,
+ 0.540171f, 0.539526f, 0.538880f, 0.538234f, 0.537587f, 0.536940f, 0.536293f, 0.535645f,
+ 0.534998f, 0.534349f, 0.533701f, 0.533052f, 0.532403f, 0.531754f, 0.531104f, 0.530454f,
+ 0.529804f, 0.529153f, 0.528502f, 0.527851f, 0.527199f, 0.526547f, 0.525895f, 0.525243f,
+ 0.524590f, 0.523937f, 0.523283f, 0.522629f, 0.521975f, 0.521321f, 0.520666f, 0.520011f,
+ 0.519356f, 0.518700f, 0.518045f, 0.517388f, 0.516732f, 0.516075f, 0.515418f, 0.514760f,
+ 0.514103f, 0.513445f, 0.512786f, 0.512128f, 0.511469f, 0.510810f, 0.510150f, 0.509490f,
+ 0.508830f, 0.508170f, 0.507509f, 0.506848f, 0.506187f, 0.505525f, 0.504863f, 0.504201f,
+ 0.503538f, 0.502876f, 0.502212f, 0.501549f, 0.500885f, 0.500221f, 0.499557f, 0.498893f,
+ 0.498228f, 0.497562f, 0.496897f, 0.496231f, 0.495565f, 0.494899f, 0.494232f, 0.493565f,
+ 0.492898f, 0.492231f, 0.491563f, 0.490895f, 0.490226f, 0.489558f, 0.488889f, 0.488220f,
+ 0.487550f, 0.486880f, 0.486210f, 0.485540f, 0.484869f, 0.484198f, 0.483527f, 0.482856f,
+ 0.482184f, 0.481512f, 0.480839f, 0.480167f, 0.479494f, 0.478821f, 0.478147f, 0.477473f,
+ 0.476799f, 0.476125f, 0.475450f, 0.474775f, 0.474100f, 0.473425f, 0.472749f, 0.472073f,
+ 0.471397f, 0.470720f, 0.470043f, 0.469366f, 0.468689f, 0.468011f, 0.467333f, 0.466655f,
+ 0.465977f, 0.465298f, 0.464619f, 0.463939f, 0.463260f, 0.462580f, 0.461900f, 0.461219f,
+ 0.460539f, 0.459858f, 0.459177f, 0.458495f, 0.457813f, 0.457131f, 0.456449f, 0.455766f,
+ 0.455084f, 0.454400f, 0.453717f, 0.453033f, 0.452350f, 0.451665f, 0.450981f, 0.450296f,
+ 0.449611f, 0.448926f, 0.448241f, 0.447555f, 0.446869f, 0.446183f, 0.445496f, 0.444809f,
+ 0.444122f, 0.443435f, 0.442747f, 0.442059f, 0.441371f, 0.440683f, 0.439994f, 0.439305f,
+ 0.438616f, 0.437927f, 0.437237f, 0.436547f, 0.435857f, 0.435167f, 0.434476f, 0.433785f,
+ 0.433094f, 0.432402f, 0.431711f, 0.431019f, 0.430326f, 0.429634f, 0.428941f, 0.428248f,
+ 0.427555f, 0.426862f, 0.426168f, 0.425474f, 0.424780f, 0.424085f, 0.423390f, 0.422695f,
+ 0.422000f, 0.421305f, 0.420609f, 0.419913f, 0.419217f, 0.418520f, 0.417824f, 0.417127f,
+ 0.416430f, 0.415732f, 0.415034f, 0.414337f, 0.413638f, 0.412940f, 0.412241f, 0.411542f,
+ 0.410843f, 0.410144f, 0.409444f, 0.408744f, 0.408044f, 0.407344f, 0.406643f, 0.405942f,
+ 0.405241f, 0.404540f, 0.403838f, 0.403137f, 0.402435f, 0.401732f, 0.401030f, 0.400327f,
+ 0.399624f, 0.398921f, 0.398218f, 0.397514f, 0.396810f, 0.396106f, 0.395401f, 0.394697f,
+ 0.393992f, 0.393287f, 0.392582f, 0.391876f, 0.391170f, 0.390464f, 0.389758f, 0.389052f,
+ 0.388345f, 0.387638f, 0.386931f, 0.386224f, 0.385516f, 0.384808f, 0.384100f, 0.383392f,
+ 0.382683f, 0.381975f, 0.381266f, 0.380557f, 0.379847f, 0.379138f, 0.378428f, 0.377718f,
+ 0.377007f, 0.376297f, 0.375586f, 0.374875f, 0.374164f, 0.373453f, 0.372741f, 0.372029f,
+ 0.371317f, 0.370605f, 0.369892f, 0.369180f, 0.368467f, 0.367754f, 0.367040f, 0.366327f,
+ 0.365613f, 0.364899f, 0.364185f, 0.363470f, 0.362756f, 0.362041f, 0.361326f, 0.360611f,
+ 0.359895f, 0.359179f, 0.358463f, 0.357747f, 0.357031f, 0.356314f, 0.355598f, 0.354881f,
+ 0.354164f, 0.353446f, 0.352729f, 0.352011f, 0.351293f, 0.350575f, 0.349856f, 0.349138f,
+ 0.348419f, 0.347700f, 0.346980f, 0.346261f, 0.345541f, 0.344821f, 0.344101f, 0.343381f,
+ 0.342661f, 0.341940f, 0.341219f, 0.340498f, 0.339777f, 0.339055f, 0.338334f, 0.337612f,
+ 0.336890f, 0.336168f, 0.335445f, 0.334722f, 0.334000f, 0.333277f, 0.332553f, 0.331830f,
+ 0.331106f, 0.330382f, 0.329658f, 0.328934f, 0.328210f, 0.327485f, 0.326760f, 0.326035f,
+ 0.325310f, 0.324585f, 0.323859f, 0.323134f, 0.322408f, 0.321682f, 0.320955f, 0.320229f,
+ 0.319502f, 0.318775f, 0.318048f, 0.317321f, 0.316593f, 0.315866f, 0.315138f, 0.314410f,
+ 0.313682f, 0.312953f, 0.312225f, 0.311496f, 0.310767f, 0.310038f, 0.309309f, 0.308579f,
+ 0.307850f, 0.307120f, 0.306390f, 0.305660f, 0.304929f, 0.304199f, 0.303468f, 0.302737f,
+ 0.302006f, 0.301275f, 0.300543f, 0.299812f, 0.299080f, 0.298348f, 0.297616f, 0.296883f,
+ 0.296151f, 0.295418f, 0.294685f, 0.293952f, 0.293219f, 0.292486f, 0.291752f, 0.291019f,
+ 0.290285f, 0.289551f, 0.288816f, 0.288082f, 0.287347f, 0.286613f, 0.285878f, 0.285143f,
+ 0.284408f, 0.283672f, 0.282937f, 0.282201f, 0.281465f, 0.280729f, 0.279993f, 0.279256f,
+ 0.278520f, 0.277783f, 0.277046f, 0.276309f, 0.275572f, 0.274834f, 0.274097f, 0.273359f,
+ 0.272621f, 0.271883f, 0.271145f, 0.270407f, 0.269668f, 0.268930f, 0.268191f, 0.267452f,
+ 0.266713f, 0.265973f, 0.265234f, 0.264494f, 0.263755f, 0.263015f, 0.262275f, 0.261534f,
+ 0.260794f, 0.260054f, 0.259313f, 0.258572f, 0.257831f, 0.257090f, 0.256349f, 0.255607f,
+ 0.254866f, 0.254124f, 0.253382f, 0.252640f, 0.251898f, 0.251155f, 0.250413f, 0.249670f,
+ 0.248928f, 0.248185f, 0.247442f, 0.246698f, 0.245955f, 0.245212f, 0.244468f, 0.243724f,
+ 0.242980f, 0.242236f, 0.241492f, 0.240748f, 0.240003f, 0.239258f, 0.238514f, 0.237769f,
+ 0.237024f, 0.236278f, 0.235533f, 0.234788f, 0.234042f, 0.233296f, 0.232550f, 0.231804f,
+ 0.231058f, 0.230312f, 0.229565f, 0.228819f, 0.228072f, 0.227325f, 0.226578f, 0.225831f,
+ 0.225084f, 0.224337f, 0.223589f, 0.222841f, 0.222094f, 0.221346f, 0.220598f, 0.219850f,
+ 0.219101f, 0.218353f, 0.217604f, 0.216856f, 0.216107f, 0.215358f, 0.214609f, 0.213860f,
+ 0.213110f, 0.212361f, 0.211611f, 0.210862f, 0.210112f, 0.209362f, 0.208612f, 0.207862f,
+ 0.207111f, 0.206361f, 0.205610f, 0.204860f, 0.204109f, 0.203358f, 0.202607f, 0.201856f,
+ 0.201105f, 0.200353f, 0.199602f, 0.198850f, 0.198098f, 0.197347f, 0.196595f, 0.195843f,
+ 0.195090f, 0.194338f, 0.193586f, 0.192833f, 0.192080f, 0.191328f, 0.190575f, 0.189822f,
+ 0.189069f, 0.188315f, 0.187562f, 0.186809f, 0.186055f, 0.185301f, 0.184548f, 0.183794f,
+ 0.183040f, 0.182286f, 0.181532f, 0.180777f, 0.180023f, 0.179268f, 0.178514f, 0.177759f,
+ 0.177004f, 0.176249f, 0.175494f, 0.174739f, 0.173984f, 0.173229f, 0.172473f, 0.171718f,
+ 0.170962f, 0.170206f, 0.169450f, 0.168694f, 0.167938f, 0.167182f, 0.166426f, 0.165670f,
+ 0.164913f, 0.164157f, 0.163400f, 0.162643f, 0.161886f, 0.161129f, 0.160372f, 0.159615f,
+ 0.158858f, 0.158101f, 0.157343f, 0.156586f, 0.155828f, 0.155071f, 0.154313f, 0.153555f,
+ 0.152797f, 0.152039f, 0.151281f, 0.150523f, 0.149765f, 0.149006f, 0.148248f, 0.147489f,
+ 0.146730f, 0.145972f, 0.145213f, 0.144454f, 0.143695f, 0.142936f, 0.142177f, 0.141418f,
+ 0.140658f, 0.139899f, 0.139139f, 0.138380f, 0.137620f, 0.136860f, 0.136101f, 0.135341f,
+ 0.134581f, 0.133821f, 0.133061f, 0.132300f, 0.131540f, 0.130780f, 0.130019f, 0.129259f,
+ 0.128498f, 0.127737f, 0.126977f, 0.126216f, 0.125455f, 0.124694f, 0.123933f, 0.123172f,
+ 0.122411f, 0.121649f, 0.120888f, 0.120127f, 0.119365f, 0.118604f, 0.117842f, 0.117080f,
+ 0.116319f, 0.115557f, 0.114795f, 0.114033f, 0.113271f, 0.112509f, 0.111747f, 0.110984f,
+ 0.110222f, 0.109460f, 0.108697f, 0.107935f, 0.107172f, 0.106410f, 0.105647f, 0.104884f,
+ 0.104122f, 0.103359f, 0.102596f, 0.101833f, 0.101070f, 0.100307f, 0.099544f, 0.098780f,
+ 0.098017f, 0.097254f, 0.096490f, 0.095727f, 0.094963f, 0.094200f, 0.093436f, 0.092673f,
+ 0.091909f, 0.091145f, 0.090381f, 0.089617f, 0.088854f, 0.088090f, 0.087326f, 0.086561f,
+ 0.085797f, 0.085033f, 0.084269f, 0.083505f, 0.082740f, 0.081976f, 0.081211f, 0.080447f,
+ 0.079682f, 0.078918f, 0.078153f, 0.077389f, 0.076624f, 0.075859f, 0.075094f, 0.074329f,
+ 0.073565f, 0.072800f, 0.072035f, 0.071270f, 0.070505f, 0.069739f, 0.068974f, 0.068209f,
+ 0.067444f, 0.066679f, 0.065913f, 0.065148f, 0.064383f, 0.063617f, 0.062852f, 0.062086f,
+ 0.061321f, 0.060555f, 0.059790f, 0.059024f, 0.058258f, 0.057493f, 0.056727f, 0.055961f,
+ 0.055195f, 0.054429f, 0.053664f, 0.052898f, 0.052132f, 0.051366f, 0.050600f, 0.049834f,
+ 0.049068f, 0.048302f, 0.047535f, 0.046769f, 0.046003f, 0.045237f, 0.044471f, 0.043705f,
+ 0.042938f, 0.042172f, 0.041406f, 0.040639f, 0.039873f, 0.039107f, 0.038340f, 0.037574f,
+ 0.036807f, 0.036041f, 0.035274f, 0.034508f, 0.033741f, 0.032975f, 0.032208f, 0.031441f,
+ 0.030675f, 0.029908f, 0.029142f, 0.028375f, 0.027608f, 0.026841f, 0.026075f, 0.025308f,
+ 0.024541f, 0.023774f, 0.023008f, 0.022241f, 0.021474f, 0.020707f, 0.019940f, 0.019174f,
+ 0.018407f, 0.017640f, 0.016873f, 0.016106f, 0.015339f, 0.014572f, 0.013805f, 0.013038f,
+ 0.012272f, 0.011505f, 0.010738f, 0.009971f, 0.009204f, 0.008437f, 0.007670f, 0.006903f,
+ 0.006136f, 0.005369f, 0.004602f, 0.003835f, 0.003068f, 0.002301f, 0.001534f, 0.000767f,
+ 0.000000f, 0.000767f, 0.001534f, 0.002301f, 0.003068f, 0.003835f, 0.004602f, 0.005369f,
+ 0.006136f, 0.006903f, 0.007670f, 0.008437f, 0.009204f, 0.009971f, 0.010738f, 0.011505f,
+ 0.012272f, 0.013038f, 0.013805f, 0.014572f, 0.015339f, 0.016106f, 0.016873f, 0.017640f,
+ 0.018407f, 0.019174f, 0.019940f, 0.020707f, 0.021474f, 0.022241f, 0.023008f, 0.023774f,
+ 0.024541f, 0.025308f, 0.026075f, 0.026841f, 0.027608f, 0.028375f, 0.029142f, 0.029908f,
+ 0.030675f, 0.031441f, 0.032208f, 0.032975f, 0.033741f, 0.034508f, 0.035274f, 0.036041f,
+ 0.036807f, 0.037574f, 0.038340f, 0.039107f, 0.039873f, 0.040639f, 0.041406f, 0.042172f,
+ 0.042938f, 0.043705f, 0.044471f, 0.045237f, 0.046003f, 0.046769f, 0.047535f, 0.048302f,
+ 0.049068f, 0.049834f, 0.050600f, 0.051366f, 0.052132f, 0.052898f, 0.053664f, 0.054429f,
+ 0.055195f, 0.055961f, 0.056727f, 0.057493f, 0.058258f, 0.059024f, 0.059790f, 0.060555f,
+ 0.061321f, 0.062086f, 0.062852f, 0.063617f, 0.064383f, 0.065148f, 0.065913f, 0.066679f,
+ 0.067444f, 0.068209f, 0.068974f, 0.069739f, 0.070505f, 0.071270f, 0.072035f, 0.072800f,
+ 0.073565f, 0.074329f, 0.075094f, 0.075859f, 0.076624f, 0.077389f, 0.078153f, 0.078918f,
+ 0.079682f, 0.080447f, 0.081211f, 0.081976f, 0.082740f, 0.083505f, 0.084269f, 0.085033f,
+ 0.085797f, 0.086561f, 0.087326f, 0.088090f, 0.088854f, 0.089617f, 0.090381f, 0.091145f,
+ 0.091909f, 0.092673f, 0.093436f, 0.094200f, 0.094963f, 0.095727f, 0.096490f, 0.097254f,
+ 0.098017f, 0.098780f, 0.099544f, 0.100307f, 0.101070f, 0.101833f, 0.102596f, 0.103359f,
+ 0.104122f, 0.104884f, 0.105647f, 0.106410f, 0.107172f, 0.107935f, 0.108697f, 0.109460f,
+ 0.110222f, 0.110984f, 0.111747f, 0.112509f, 0.113271f, 0.114033f, 0.114795f, 0.115557f,
+ 0.116319f, 0.117080f, 0.117842f, 0.118604f, 0.119365f, 0.120127f, 0.120888f, 0.121649f,
+ 0.122411f, 0.123172f, 0.123933f, 0.124694f, 0.125455f, 0.126216f, 0.126977f, 0.127737f,
+ 0.128498f, 0.129259f, 0.130019f, 0.130780f, 0.131540f, 0.132300f, 0.133061f, 0.133821f,
+ 0.134581f, 0.135341f, 0.136101f, 0.136860f, 0.137620f, 0.138380f, 0.139139f, 0.139899f,
+ 0.140658f, 0.141418f, 0.142177f, 0.142936f, 0.143695f, 0.144454f, 0.145213f, 0.145972f,
+ 0.146730f, 0.147489f, 0.148248f, 0.149006f, 0.149765f, 0.150523f, 0.151281f, 0.152039f,
+ 0.152797f, 0.153555f, 0.154313f, 0.155071f, 0.155828f, 0.156586f, 0.157343f, 0.158101f,
+ 0.158858f, 0.159615f, 0.160372f, 0.161129f, 0.161886f, 0.162643f, 0.163400f, 0.164157f,
+ 0.164913f, 0.165670f, 0.166426f, 0.167182f, 0.167938f, 0.168694f, 0.169450f, 0.170206f,
+ 0.170962f, 0.171718f, 0.172473f, 0.173229f, 0.173984f, 0.174739f, 0.175494f, 0.176249f,
+ 0.177004f, 0.177759f, 0.178514f, 0.179268f, 0.180023f, 0.180777f, 0.181532f, 0.182286f,
+ 0.183040f, 0.183794f, 0.184548f, 0.185301f, 0.186055f, 0.186809f, 0.187562f, 0.188315f,
+ 0.189069f, 0.189822f, 0.190575f, 0.191328f, 0.192080f, 0.192833f, 0.193586f, 0.194338f,
+ 0.195090f, 0.195843f, 0.196595f, 0.197347f, 0.198098f, 0.198850f, 0.199602f, 0.200353f,
+ 0.201105f, 0.201856f, 0.202607f, 0.203358f, 0.204109f, 0.204860f, 0.205610f, 0.206361f,
+ 0.207111f, 0.207862f, 0.208612f, 0.209362f, 0.210112f, 0.210862f, 0.211611f, 0.212361f,
+ 0.213110f, 0.213860f, 0.214609f, 0.215358f, 0.216107f, 0.216856f, 0.217604f, 0.218353f,
+ 0.219101f, 0.219850f, 0.220598f, 0.221346f, 0.222094f, 0.222841f, 0.223589f, 0.224337f,
+ 0.225084f, 0.225831f, 0.226578f, 0.227325f, 0.228072f, 0.228819f, 0.229565f, 0.230312f,
+ 0.231058f, 0.231804f, 0.232550f, 0.233296f, 0.234042f, 0.234788f, 0.235533f, 0.236278f,
+ 0.237024f, 0.237769f, 0.238514f, 0.239258f, 0.240003f, 0.240748f, 0.241492f, 0.242236f,
+ 0.242980f, 0.243724f, 0.244468f, 0.245212f, 0.245955f, 0.246698f, 0.247442f, 0.248185f,
+ 0.248928f, 0.249670f, 0.250413f, 0.251155f, 0.251898f, 0.252640f, 0.253382f, 0.254124f,
+ 0.254866f, 0.255607f, 0.256349f, 0.257090f, 0.257831f, 0.258572f, 0.259313f, 0.260054f,
+ 0.260794f, 0.261534f, 0.262275f, 0.263015f, 0.263755f, 0.264494f, 0.265234f, 0.265973f,
+ 0.266713f, 0.267452f, 0.268191f, 0.268930f, 0.269668f, 0.270407f, 0.271145f, 0.271883f,
+ 0.272621f, 0.273359f, 0.274097f, 0.274834f, 0.275572f, 0.276309f, 0.277046f, 0.277783f,
+ 0.278520f, 0.279256f, 0.279993f, 0.280729f, 0.281465f, 0.282201f, 0.282937f, 0.283672f,
+ 0.284408f, 0.285143f, 0.285878f, 0.286613f, 0.287347f, 0.288082f, 0.288816f, 0.289551f,
+ 0.290285f, 0.291019f, 0.291752f, 0.292486f, 0.293219f, 0.293952f, 0.294685f, 0.295418f,
+ 0.296151f, 0.296883f, 0.297616f, 0.298348f, 0.299080f, 0.299812f, 0.300543f, 0.301275f,
+ 0.302006f, 0.302737f, 0.303468f, 0.304199f, 0.304929f, 0.305660f, 0.306390f, 0.307120f,
+ 0.307850f, 0.308579f, 0.309309f, 0.310038f, 0.310767f, 0.311496f, 0.312225f, 0.312953f,
+ 0.313682f, 0.314410f, 0.315138f, 0.315866f, 0.316593f, 0.317321f, 0.318048f, 0.318775f,
+ 0.319502f, 0.320229f, 0.320955f, 0.321682f, 0.322408f, 0.323134f, 0.323859f, 0.324585f,
+ 0.325310f, 0.326035f, 0.326760f, 0.327485f, 0.328210f, 0.328934f, 0.329658f, 0.330382f,
+ 0.331106f, 0.331830f, 0.332553f, 0.333277f, 0.334000f, 0.334722f, 0.335445f, 0.336168f,
+ 0.336890f, 0.337612f, 0.338334f, 0.339055f, 0.339777f, 0.340498f, 0.341219f, 0.341940f,
+ 0.342661f, 0.343381f, 0.344101f, 0.344821f, 0.345541f, 0.346261f, 0.346980f, 0.347700f,
+ 0.348419f, 0.349138f, 0.349856f, 0.350575f, 0.351293f, 0.352011f, 0.352729f, 0.353446f,
+ 0.354164f, 0.354881f, 0.355598f, 0.356314f, 0.357031f, 0.357747f, 0.358463f, 0.359179f,
+ 0.359895f, 0.360611f, 0.361326f, 0.362041f, 0.362756f, 0.363470f, 0.364185f, 0.364899f,
+ 0.365613f, 0.366327f, 0.367040f, 0.367754f, 0.368467f, 0.369180f, 0.369892f, 0.370605f,
+ 0.371317f, 0.372029f, 0.372741f, 0.373453f, 0.374164f, 0.374875f, 0.375586f, 0.376297f,
+ 0.377007f, 0.377718f, 0.378428f, 0.379138f, 0.379847f, 0.380557f, 0.381266f, 0.381975f,
+ 0.382683f, 0.383392f, 0.384100f, 0.384808f, 0.385516f, 0.386224f, 0.386931f, 0.387638f,
+ 0.388345f, 0.389052f, 0.389758f, 0.390464f, 0.391170f, 0.391876f, 0.392582f, 0.393287f,
+ 0.393992f, 0.394697f, 0.395401f, 0.396106f, 0.396810f, 0.397514f, 0.398218f, 0.398921f,
+ 0.399624f, 0.400327f, 0.401030f, 0.401732f, 0.402435f, 0.403137f, 0.403838f, 0.404540f,
+ 0.405241f, 0.405942f, 0.406643f, 0.407344f, 0.408044f, 0.408744f, 0.409444f, 0.410144f,
+ 0.410843f, 0.411542f, 0.412241f, 0.412940f, 0.413638f, 0.414337f, 0.415034f, 0.415732f,
+ 0.416430f, 0.417127f, 0.417824f, 0.418520f, 0.419217f, 0.419913f, 0.420609f, 0.421305f,
+ 0.422000f, 0.422695f, 0.423390f, 0.424085f, 0.424780f, 0.425474f, 0.426168f, 0.426862f,
+ 0.427555f, 0.428248f, 0.428941f, 0.429634f, 0.430326f, 0.431019f, 0.431711f, 0.432402f,
+ 0.433094f, 0.433785f, 0.434476f, 0.435167f, 0.435857f, 0.436547f, 0.437237f, 0.437927f,
+ 0.438616f, 0.439305f, 0.439994f, 0.440683f, 0.441371f, 0.442059f, 0.442747f, 0.443435f,
+ 0.444122f, 0.444809f, 0.445496f, 0.446183f, 0.446869f, 0.447555f, 0.448241f, 0.448926f,
+ 0.449611f, 0.450296f, 0.450981f, 0.451665f, 0.452350f, 0.453033f, 0.453717f, 0.454400f,
+ 0.455084f, 0.455766f, 0.456449f, 0.457131f, 0.457813f, 0.458495f, 0.459177f, 0.459858f,
+ 0.460539f, 0.461219f, 0.461900f, 0.462580f, 0.463260f, 0.463939f, 0.464619f, 0.465298f,
+ 0.465977f, 0.466655f, 0.467333f, 0.468011f, 0.468689f, 0.469366f, 0.470043f, 0.470720f,
+ 0.471397f, 0.472073f, 0.472749f, 0.473425f, 0.474100f, 0.474775f, 0.475450f, 0.476125f,
+ 0.476799f, 0.477473f, 0.478147f, 0.478821f, 0.479494f, 0.480167f, 0.480839f, 0.481512f,
+ 0.482184f, 0.482856f, 0.483527f, 0.484198f, 0.484869f, 0.485540f, 0.486210f, 0.486880f,
+ 0.487550f, 0.488220f, 0.488889f, 0.489558f, 0.490226f, 0.490895f, 0.491563f, 0.492231f,
+ 0.492898f, 0.493565f, 0.494232f, 0.494899f, 0.495565f, 0.496231f, 0.496897f, 0.497562f,
+ 0.498228f, 0.498893f, 0.499557f, 0.500221f, 0.500885f, 0.501549f, 0.502212f, 0.502876f,
+ 0.503538f, 0.504201f, 0.504863f, 0.505525f, 0.506187f, 0.506848f, 0.507509f, 0.508170f,
+ 0.508830f, 0.509490f, 0.510150f, 0.510810f, 0.511469f, 0.512128f, 0.512786f, 0.513445f,
+ 0.514103f, 0.514760f, 0.515418f, 0.516075f, 0.516732f, 0.517388f, 0.518045f, 0.518700f,
+ 0.519356f, 0.520011f, 0.520666f, 0.521321f, 0.521975f, 0.522629f, 0.523283f, 0.523937f,
+ 0.524590f, 0.525243f, 0.525895f, 0.526547f, 0.527199f, 0.527851f, 0.528502f, 0.529153f,
+ 0.529804f, 0.530454f, 0.531104f, 0.531754f, 0.532403f, 0.533052f, 0.533701f, 0.534349f,
+ 0.534998f, 0.535645f, 0.536293f, 0.536940f, 0.537587f, 0.538234f, 0.538880f, 0.539526f,
+ 0.540171f, 0.540817f, 0.541462f, 0.542106f, 0.542751f, 0.543395f, 0.544039f, 0.544682f,
+ 0.545325f, 0.545968f, 0.546610f, 0.547252f, 0.547894f, 0.548536f, 0.549177f, 0.549818f,
+ 0.550458f, 0.551098f, 0.551738f, 0.552378f, 0.553017f, 0.553656f, 0.554294f, 0.554932f,
+ 0.555570f, 0.556208f, 0.556845f, 0.557482f, 0.558119f, 0.558755f, 0.559391f, 0.560026f,
+ 0.560662f, 0.561297f, 0.561931f, 0.562565f, 0.563199f, 0.563833f, 0.564466f, 0.565099f,
+ 0.565732f, 0.566364f, 0.566996f, 0.567628f, 0.568259f, 0.568890f, 0.569521f, 0.570151f,
+ 0.570781f, 0.571410f, 0.572040f, 0.572669f, 0.573297f, 0.573925f, 0.574553f, 0.575181f,
+ 0.575808f, 0.576435f, 0.577062f, 0.577688f, 0.578314f, 0.578939f, 0.579565f, 0.580189f,
+ 0.580814f, 0.581438f, 0.582062f, 0.582685f, 0.583309f, 0.583931f, 0.584554f, 0.585176f,
+ 0.585798f, 0.586419f, 0.587040f, 0.587661f, 0.588282f, 0.588902f, 0.589521f, 0.590141f,
+ 0.590760f, 0.591378f, 0.591997f, 0.592615f, 0.593232f, 0.593850f, 0.594467f, 0.595083f,
+ 0.595699f, 0.596315f, 0.596931f, 0.597546f, 0.598161f, 0.598775f, 0.599389f, 0.600003f,
+ 0.600616f, 0.601230f, 0.601842f, 0.602455f, 0.603067f, 0.603678f, 0.604290f, 0.604900f,
+ 0.605511f, 0.606121f, 0.606731f, 0.607341f, 0.607950f, 0.608559f, 0.609167f, 0.609775f,
+ 0.610383f, 0.610990f, 0.611597f, 0.612204f, 0.612810f, 0.613416f, 0.614022f, 0.614627f,
+ 0.615232f, 0.615836f, 0.616440f, 0.617044f, 0.617647f, 0.618250f, 0.618853f, 0.619455f,
+ 0.620057f, 0.620659f, 0.621260f, 0.621861f, 0.622461f, 0.623061f, 0.623661f, 0.624260f,
+ 0.624860f, 0.625458f, 0.626056f, 0.626654f, 0.627252f, 0.627849f, 0.628446f, 0.629042f,
+ 0.629638f, 0.630234f, 0.630829f, 0.631424f, 0.632019f, 0.632613f, 0.633207f, 0.633800f,
+ 0.634393f, 0.634986f, 0.635578f, 0.636170f, 0.636762f, 0.637353f, 0.637944f, 0.638534f,
+ 0.639124f, 0.639714f, 0.640303f, 0.640892f, 0.641481f, 0.642069f, 0.642657f, 0.643245f,
+ 0.643832f, 0.644418f, 0.645005f, 0.645590f, 0.646176f, 0.646761f, 0.647346f, 0.647930f,
+ 0.648514f, 0.649098f, 0.649681f, 0.650264f, 0.650847f, 0.651429f, 0.652011f, 0.652592f,
+ 0.653173f, 0.653753f, 0.654334f, 0.654913f, 0.655493f, 0.656072f, 0.656651f, 0.657229f,
+ 0.657807f, 0.658384f, 0.658961f, 0.659538f, 0.660114f, 0.660690f, 0.661266f, 0.661841f,
+ 0.662416f, 0.662990f, 0.663564f, 0.664138f, 0.664711f, 0.665284f, 0.665856f, 0.666428f,
+ 0.667000f, 0.667571f, 0.668142f, 0.668712f, 0.669283f, 0.669852f, 0.670422f, 0.670990f,
+ 0.671559f, 0.672127f, 0.672695f, 0.673262f, 0.673829f, 0.674396f, 0.674962f, 0.675527f,
+ 0.676093f, 0.676658f, 0.677222f, 0.677786f, 0.678350f, 0.678913f, 0.679476f, 0.680039f,
+ 0.680601f, 0.681163f, 0.681724f, 0.682285f, 0.682846f, 0.683406f, 0.683965f, 0.684525f,
+ 0.685084f, 0.685642f, 0.686200f, 0.686758f, 0.687315f, 0.687872f, 0.688429f, 0.688985f,
+ 0.689541f, 0.690096f, 0.690651f, 0.691205f, 0.691759f, 0.692313f, 0.692866f, 0.693419f,
+ 0.693971f, 0.694524f, 0.695075f, 0.695626f, 0.696177f, 0.696728f, 0.697277f, 0.697827f,
+ 0.698376f, 0.698925f, 0.699473f, 0.700021f, 0.700569f, 0.701116f, 0.701663f, 0.702209f,
+ 0.702755f, 0.703300f, 0.703845f, 0.704390f, 0.704934f, 0.705478f, 0.706021f, 0.706564f,
+ 0.707107f, 0.707649f, 0.708191f, 0.708732f, 0.709273f, 0.709813f, 0.710353f, 0.710893f,
+ 0.711432f, 0.711971f, 0.712509f, 0.713047f, 0.713585f, 0.714122f, 0.714659f, 0.715195f,
+ 0.715731f, 0.716266f, 0.716801f, 0.717336f, 0.717870f, 0.718404f, 0.718937f, 0.719470f,
+ 0.720003f, 0.720535f, 0.721066f, 0.721597f, 0.722128f, 0.722659f, 0.723188f, 0.723718f,
+ 0.724247f, 0.724776f, 0.725304f, 0.725832f, 0.726359f, 0.726886f, 0.727413f, 0.727939f,
+ 0.728464f, 0.728990f, 0.729514f, 0.730039f, 0.730563f, 0.731086f, 0.731609f, 0.732132f,
+ 0.732654f, 0.733176f, 0.733697f, 0.734218f, 0.734739f, 0.735259f, 0.735779f, 0.736298f,
+ 0.736817f, 0.737335f, 0.737853f, 0.738370f, 0.738887f, 0.739404f, 0.739920f, 0.740436f,
+ 0.740951f, 0.741466f, 0.741980f, 0.742494f, 0.743008f, 0.743521f, 0.744034f, 0.744546f,
+ 0.745058f, 0.745569f, 0.746080f, 0.746591f, 0.747101f, 0.747610f, 0.748119f, 0.748628f,
+ 0.749136f, 0.749644f, 0.750152f, 0.750659f, 0.751165f, 0.751671f, 0.752177f, 0.752682f,
+ 0.753187f, 0.753691f, 0.754195f, 0.754698f, 0.755201f, 0.755704f, 0.756206f, 0.756708f,
+ 0.757209f, 0.757710f, 0.758210f, 0.758710f, 0.759209f, 0.759708f, 0.760207f, 0.760705f,
+ 0.761202f, 0.761700f, 0.762196f, 0.762693f, 0.763188f, 0.763684f, 0.764179f, 0.764673f,
+ 0.765167f, 0.765661f, 0.766154f, 0.766647f, 0.767139f, 0.767631f, 0.768122f, 0.768613f,
+ 0.769103f, 0.769593f, 0.770083f, 0.770572f, 0.771061f, 0.771549f, 0.772036f, 0.772524f,
+ 0.773010f, 0.773497f, 0.773983f, 0.774468f, 0.774953f, 0.775438f, 0.775922f, 0.776405f,
+ 0.776888f, 0.777371f, 0.777853f, 0.778335f, 0.778817f, 0.779297f, 0.779778f, 0.780258f,
+ 0.780737f, 0.781216f, 0.781695f, 0.782173f, 0.782651f, 0.783128f, 0.783605f, 0.784081f,
+ 0.784557f, 0.785032f, 0.785507f, 0.785981f, 0.786455f, 0.786929f, 0.787402f, 0.787874f,
+ 0.788346f, 0.788818f, 0.789289f, 0.789760f, 0.790230f, 0.790700f, 0.791169f, 0.791638f,
+ 0.792107f, 0.792575f, 0.793042f, 0.793509f, 0.793975f, 0.794442f, 0.794907f, 0.795372f,
+ 0.795837f, 0.796301f, 0.796765f, 0.797228f, 0.797691f, 0.798153f, 0.798615f, 0.799076f,
+ 0.799537f, 0.799998f, 0.800458f, 0.800917f, 0.801376f, 0.801835f, 0.802293f, 0.802750f,
+ 0.803208f, 0.803664f, 0.804120f, 0.804576f, 0.805031f, 0.805486f, 0.805940f, 0.806394f,
+ 0.806848f, 0.807300f, 0.807753f, 0.808205f, 0.808656f, 0.809107f, 0.809558f, 0.810008f,
+ 0.810457f, 0.810906f, 0.811355f, 0.811803f, 0.812251f, 0.812698f, 0.813144f, 0.813591f,
+ 0.814036f, 0.814482f, 0.814926f, 0.815371f, 0.815814f, 0.816258f, 0.816701f, 0.817143f,
+ 0.817585f, 0.818026f, 0.818467f, 0.818908f, 0.819348f, 0.819787f, 0.820226f, 0.820664f,
+ 0.821102f, 0.821540f, 0.821977f, 0.822414f, 0.822850f, 0.823285f, 0.823721f, 0.824155f,
+ 0.824589f, 0.825023f, 0.825456f, 0.825889f, 0.826321f, 0.826753f, 0.827184f, 0.827615f,
+ 0.828045f, 0.828475f, 0.828904f, 0.829333f, 0.829761f, 0.830189f, 0.830616f, 0.831043f,
+ 0.831470f, 0.831895f, 0.832321f, 0.832746f, 0.833170f, 0.833594f, 0.834018f, 0.834440f,
+ 0.834863f, 0.835285f, 0.835706f, 0.836127f, 0.836548f, 0.836968f, 0.837387f, 0.837806f,
+ 0.838225f, 0.838643f, 0.839060f, 0.839477f, 0.839894f, 0.840310f, 0.840725f, 0.841140f,
+ 0.841555f, 0.841969f, 0.842383f, 0.842796f, 0.843208f, 0.843620f, 0.844032f, 0.844443f,
+ 0.844854f, 0.845264f, 0.845673f, 0.846082f, 0.846491f, 0.846899f, 0.847307f, 0.847714f,
+ 0.848120f, 0.848526f, 0.848932f, 0.849337f, 0.849742f, 0.850146f, 0.850549f, 0.850953f,
+ 0.851355f, 0.851757f, 0.852159f, 0.852560f, 0.852961f, 0.853361f, 0.853760f, 0.854159f,
+ 0.854558f, 0.854956f, 0.855354f, 0.855751f, 0.856147f, 0.856543f, 0.856939f, 0.857334f,
+ 0.857729f, 0.858123f, 0.858516f, 0.858909f, 0.859302f, 0.859694f, 0.860085f, 0.860476f,
+ 0.860867f, 0.861257f, 0.861646f, 0.862035f, 0.862424f, 0.862812f, 0.863199f, 0.863586f,
+ 0.863973f, 0.864359f, 0.864744f, 0.865129f, 0.865514f, 0.865898f, 0.866281f, 0.866664f,
+ 0.867046f, 0.867428f, 0.867809f, 0.868190f, 0.868571f, 0.868951f, 0.869330f, 0.869709f,
+ 0.870087f, 0.870465f, 0.870842f, 0.871219f, 0.871595f, 0.871971f, 0.872346f, 0.872721f,
+ 0.873095f, 0.873469f, 0.873842f, 0.874215f, 0.874587f, 0.874958f, 0.875329f, 0.875700f,
+ 0.876070f, 0.876440f, 0.876809f, 0.877177f, 0.877545f, 0.877913f, 0.878280f, 0.878646f,
+ 0.879012f, 0.879378f, 0.879743f, 0.880107f, 0.880471f, 0.880834f, 0.881197f, 0.881559f,
+ 0.881921f, 0.882283f, 0.882643f, 0.883004f, 0.883363f, 0.883723f, 0.884081f, 0.884439f,
+ 0.884797f, 0.885154f, 0.885511f, 0.885867f, 0.886223f, 0.886578f, 0.886932f, 0.887286f,
+ 0.887640f, 0.887993f, 0.888345f, 0.888697f, 0.889048f, 0.889399f, 0.889750f, 0.890099f,
+ 0.890449f, 0.890797f, 0.891146f, 0.891493f, 0.891841f, 0.892187f, 0.892534f, 0.892879f,
+ 0.893224f, 0.893569f, 0.893913f, 0.894256f, 0.894599f, 0.894942f, 0.895284f, 0.895625f,
+ 0.895966f, 0.896307f, 0.896646f, 0.896986f, 0.897325f, 0.897663f, 0.898001f, 0.898338f,
+ 0.898674f, 0.899011f, 0.899346f, 0.899681f, 0.900016f, 0.900350f, 0.900683f, 0.901016f,
+ 0.901349f, 0.901681f, 0.902012f, 0.902343f, 0.902673f, 0.903003f, 0.903332f, 0.903661f,
+ 0.903989f, 0.904317f, 0.904644f, 0.904971f, 0.905297f, 0.905622f, 0.905947f, 0.906272f,
+ 0.906596f, 0.906919f, 0.907242f, 0.907564f, 0.907886f, 0.908207f, 0.908528f, 0.908848f,
+ 0.909168f, 0.909487f, 0.909806f, 0.910124f, 0.910441f, 0.910758f, 0.911075f, 0.911391f,
+ 0.911706f, 0.912021f, 0.912335f, 0.912649f, 0.912962f, 0.913275f, 0.913587f, 0.913899f,
+ 0.914210f, 0.914520f, 0.914830f, 0.915140f, 0.915449f, 0.915757f, 0.916065f, 0.916372f,
+ 0.916679f, 0.916985f, 0.917291f, 0.917596f, 0.917901f, 0.918205f, 0.918508f, 0.918811f,
+ 0.919114f, 0.919416f, 0.919717f, 0.920018f, 0.920318f, 0.920618f, 0.920917f, 0.921216f,
+ 0.921514f, 0.921812f, 0.922109f, 0.922405f, 0.922701f, 0.922997f, 0.923291f, 0.923586f,
+ 0.923880f, 0.924173f, 0.924465f, 0.924758f, 0.925049f, 0.925340f, 0.925631f, 0.925921f,
+ 0.926210f, 0.926499f, 0.926787f, 0.927075f, 0.927363f, 0.927649f, 0.927935f, 0.928221f,
+ 0.928506f, 0.928791f, 0.929075f, 0.929358f, 0.929641f, 0.929923f, 0.930205f, 0.930486f,
+ 0.930767f, 0.931047f, 0.931327f, 0.931606f, 0.931884f, 0.932162f, 0.932440f, 0.932716f,
+ 0.932993f, 0.933269f, 0.933544f, 0.933818f, 0.934093f, 0.934366f, 0.934639f, 0.934912f,
+ 0.935184f, 0.935455f, 0.935726f, 0.935996f, 0.936266f, 0.936535f, 0.936803f, 0.937072f,
+ 0.937339f, 0.937606f, 0.937872f, 0.938138f, 0.938404f, 0.938668f, 0.938932f, 0.939196f,
+ 0.939459f, 0.939722f, 0.939984f, 0.940245f, 0.940506f, 0.940766f, 0.941026f, 0.941285f,
+ 0.941544f, 0.941802f, 0.942060f, 0.942317f, 0.942573f, 0.942829f, 0.943084f, 0.943339f,
+ 0.943593f, 0.943847f, 0.944100f, 0.944353f, 0.944605f, 0.944856f, 0.945107f, 0.945358f,
+ 0.945607f, 0.945857f, 0.946105f, 0.946353f, 0.946601f, 0.946848f, 0.947094f, 0.947340f,
+ 0.947586f, 0.947830f, 0.948075f, 0.948318f, 0.948561f, 0.948804f, 0.949046f, 0.949287f,
+ 0.949528f, 0.949768f, 0.950008f, 0.950247f, 0.950486f, 0.950724f, 0.950962f, 0.951199f,
+ 0.951435f, 0.951671f, 0.951906f, 0.952141f, 0.952375f, 0.952609f, 0.952842f, 0.953074f,
+ 0.953306f, 0.953537f, 0.953768f, 0.953998f, 0.954228f, 0.954457f, 0.954686f, 0.954914f,
+ 0.955141f, 0.955368f, 0.955594f, 0.955820f, 0.956045f, 0.956270f, 0.956494f, 0.956717f,
+ 0.956940f, 0.957163f, 0.957385f, 0.957606f, 0.957826f, 0.958046f, 0.958266f, 0.958485f,
+ 0.958703f, 0.958921f, 0.959139f, 0.959355f, 0.959572f, 0.959787f, 0.960002f, 0.960217f,
+ 0.960431f, 0.960644f, 0.960857f, 0.961069f, 0.961280f, 0.961492f, 0.961702f, 0.961912f,
+ 0.962121f, 0.962330f, 0.962538f, 0.962746f, 0.962953f, 0.963160f, 0.963366f, 0.963571f,
+ 0.963776f, 0.963980f, 0.964184f, 0.964387f, 0.964590f, 0.964792f, 0.964993f, 0.965194f,
+ 0.965394f, 0.965594f, 0.965793f, 0.965992f, 0.966190f, 0.966387f, 0.966584f, 0.966781f,
+ 0.966976f, 0.967172f, 0.967366f, 0.967560f, 0.967754f, 0.967947f, 0.968139f, 0.968331f,
+ 0.968522f, 0.968713f, 0.968903f, 0.969092f, 0.969281f, 0.969470f, 0.969657f, 0.969845f,
+ 0.970031f, 0.970217f, 0.970403f, 0.970588f, 0.970772f, 0.970956f, 0.971139f, 0.971322f,
+ 0.971504f, 0.971685f, 0.971866f, 0.972047f, 0.972227f, 0.972406f, 0.972584f, 0.972762f,
+ 0.972940f, 0.973117f, 0.973293f, 0.973469f, 0.973644f, 0.973819f, 0.973993f, 0.974166f,
+ 0.974339f, 0.974512f, 0.974684f, 0.974855f, 0.975025f, 0.975195f, 0.975365f, 0.975534f,
+ 0.975702f, 0.975870f, 0.976037f, 0.976204f, 0.976370f, 0.976535f, 0.976700f, 0.976864f,
+ 0.977028f, 0.977191f, 0.977354f, 0.977516f, 0.977677f, 0.977838f, 0.977998f, 0.978158f,
+ 0.978317f, 0.978476f, 0.978634f, 0.978791f, 0.978948f, 0.979104f, 0.979260f, 0.979415f,
+ 0.979570f, 0.979724f, 0.979877f, 0.980030f, 0.980182f, 0.980334f, 0.980485f, 0.980635f,
+ 0.980785f, 0.980935f, 0.981083f, 0.981232f, 0.981379f, 0.981526f, 0.981673f, 0.981819f,
+ 0.981964f, 0.982109f, 0.982253f, 0.982396f, 0.982539f, 0.982682f, 0.982824f, 0.982965f,
+ 0.983105f, 0.983246f, 0.983385f, 0.983524f, 0.983662f, 0.983800f, 0.983937f, 0.984074f,
+ 0.984210f, 0.984346f, 0.984480f, 0.984615f, 0.984748f, 0.984882f, 0.985014f, 0.985146f,
+ 0.985278f, 0.985408f, 0.985539f, 0.985668f, 0.985798f, 0.985926f, 0.986054f, 0.986181f,
+ 0.986308f, 0.986434f, 0.986560f, 0.986685f, 0.986809f, 0.986933f, 0.987057f, 0.987179f,
+ 0.987301f, 0.987423f, 0.987544f, 0.987664f, 0.987784f, 0.987903f, 0.988022f, 0.988140f,
+ 0.988258f, 0.988374f, 0.988491f, 0.988607f, 0.988722f, 0.988836f, 0.988950f, 0.989064f,
+ 0.989177f, 0.989289f, 0.989400f, 0.989511f, 0.989622f, 0.989732f, 0.989841f, 0.989950f,
+ 0.990058f, 0.990166f, 0.990273f, 0.990379f, 0.990485f, 0.990590f, 0.990695f, 0.990799f,
+ 0.990903f, 0.991006f, 0.991108f, 0.991210f, 0.991311f, 0.991411f, 0.991511f, 0.991611f,
+ 0.991710f, 0.991808f, 0.991906f, 0.992003f, 0.992099f, 0.992195f, 0.992291f, 0.992385f,
+ 0.992480f, 0.992573f, 0.992666f, 0.992759f, 0.992850f, 0.992942f, 0.993032f, 0.993122f,
+ 0.993212f, 0.993301f, 0.993389f, 0.993477f, 0.993564f, 0.993651f, 0.993737f, 0.993822f,
+ 0.993907f, 0.993991f, 0.994075f, 0.994158f, 0.994240f, 0.994322f, 0.994404f, 0.994484f,
+ 0.994565f, 0.994644f, 0.994723f, 0.994802f, 0.994879f, 0.994957f, 0.995033f, 0.995109f,
+ 0.995185f, 0.995260f, 0.995334f, 0.995408f, 0.995481f, 0.995553f, 0.995625f, 0.995697f,
+ 0.995767f, 0.995838f, 0.995907f, 0.995976f, 0.996045f, 0.996113f, 0.996180f, 0.996247f,
+ 0.996313f, 0.996378f, 0.996443f, 0.996507f, 0.996571f, 0.996634f, 0.996697f, 0.996759f,
+ 0.996820f, 0.996881f, 0.996941f, 0.997001f, 0.997060f, 0.997119f, 0.997176f, 0.997234f,
+ 0.997290f, 0.997347f, 0.997402f, 0.997457f, 0.997511f, 0.997565f, 0.997618f, 0.997671f,
+ 0.997723f, 0.997774f, 0.997825f, 0.997876f, 0.997925f, 0.997974f, 0.998023f, 0.998071f,
+ 0.998118f, 0.998165f, 0.998211f, 0.998257f, 0.998302f, 0.998346f, 0.998390f, 0.998433f,
+ 0.998476f, 0.998518f, 0.998559f, 0.998600f, 0.998640f, 0.998680f, 0.998719f, 0.998758f,
+ 0.998795f, 0.998833f, 0.998870f, 0.998906f, 0.998941f, 0.998976f, 0.999011f, 0.999044f,
+ 0.999078f, 0.999110f, 0.999142f, 0.999174f, 0.999205f, 0.999235f, 0.999265f, 0.999294f,
+ 0.999322f, 0.999350f, 0.999378f, 0.999404f, 0.999431f, 0.999456f, 0.999481f, 0.999506f,
+ 0.999529f, 0.999553f, 0.999575f, 0.999597f, 0.999619f, 0.999640f, 0.999660f, 0.999680f,
+ 0.999699f, 0.999717f, 0.999735f, 0.999753f, 0.999769f, 0.999786f, 0.999801f, 0.999816f,
+ 0.999831f, 0.999844f, 0.999858f, 0.999870f, 0.999882f, 0.999894f, 0.999905f, 0.999915f,
+ 0.999925f, 0.999934f, 0.999942f, 0.999950f, 0.999958f, 0.999964f, 0.999971f, 0.999976f,
+ 0.999981f, 0.999986f, 0.999989f, 0.999993f, 0.999995f, 0.999997f, 0.999999f, 1.000000
+};
+
+static const float cosTable16384[8192] = {
+ 1.000000f, 1.000000f, 1.000000f, 0.999999f, 0.999999f, 0.999998f, 0.999997f, 0.999996f,
+ 0.999995f, 0.999994f, 0.999993f, 0.999991f, 0.999989f, 0.999988f, 0.999986f, 0.999983f,
+ 0.999981f, 0.999979f, 0.999976f, 0.999973f, 0.999971f, 0.999968f, 0.999964f, 0.999961f,
+ 0.999958f, 0.999954f, 0.999950f, 0.999946f, 0.999942f, 0.999938f, 0.999934f, 0.999929f,
+ 0.999925f, 0.999920f, 0.999915f, 0.999910f, 0.999905f, 0.999899f, 0.999894f, 0.999888f,
+ 0.999882f, 0.999876f, 0.999870f, 0.999864f, 0.999858f, 0.999851f, 0.999844f, 0.999838f,
+ 0.999831f, 0.999823f, 0.999816f, 0.999809f, 0.999801f, 0.999793f, 0.999786f, 0.999778f,
+ 0.999769f, 0.999761f, 0.999753f, 0.999744f, 0.999735f, 0.999726f, 0.999717f, 0.999708f,
+ 0.999699f, 0.999689f, 0.999680f, 0.999670f, 0.999660f, 0.999650f, 0.999640f, 0.999629f,
+ 0.999619f, 0.999608f, 0.999597f, 0.999586f, 0.999575f, 0.999564f, 0.999553f, 0.999541f,
+ 0.999529f, 0.999518f, 0.999506f, 0.999493f, 0.999481f, 0.999469f, 0.999456f, 0.999443f,
+ 0.999431f, 0.999418f, 0.999404f, 0.999391f, 0.999378f, 0.999364f, 0.999350f, 0.999336f,
+ 0.999322f, 0.999308f, 0.999294f, 0.999279f, 0.999265f, 0.999250f, 0.999235f, 0.999220f,
+ 0.999205f, 0.999189f, 0.999174f, 0.999158f, 0.999142f, 0.999126f, 0.999110f, 0.999094f,
+ 0.999078f, 0.999061f, 0.999044f, 0.999028f, 0.999011f, 0.998994f, 0.998976f, 0.998959f,
+ 0.998941f, 0.998924f, 0.998906f, 0.998888f, 0.998870f, 0.998851f, 0.998833f, 0.998814f,
+ 0.998795f, 0.998777f, 0.998758f, 0.998738f, 0.998719f, 0.998700f, 0.998680f, 0.998660f,
+ 0.998640f, 0.998620f, 0.998600f, 0.998580f, 0.998559f, 0.998538f, 0.998518f, 0.998497f,
+ 0.998476f, 0.998454f, 0.998433f, 0.998411f, 0.998390f, 0.998368f, 0.998346f, 0.998324f,
+ 0.998302f, 0.998279f, 0.998257f, 0.998234f, 0.998211f, 0.998188f, 0.998165f, 0.998142f,
+ 0.998118f, 0.998094f, 0.998071f, 0.998047f, 0.998023f, 0.997999f, 0.997974f, 0.997950f,
+ 0.997925f, 0.997901f, 0.997876f, 0.997851f, 0.997825f, 0.997800f, 0.997774f, 0.997749f,
+ 0.997723f, 0.997697f, 0.997671f, 0.997645f, 0.997618f, 0.997592f, 0.997565f, 0.997538f,
+ 0.997511f, 0.997484f, 0.997457f, 0.997430f, 0.997402f, 0.997374f, 0.997347f, 0.997319f,
+ 0.997290f, 0.997262f, 0.997234f, 0.997205f, 0.997176f, 0.997148f, 0.997119f, 0.997089f,
+ 0.997060f, 0.997031f, 0.997001f, 0.996971f, 0.996941f, 0.996911f, 0.996881f, 0.996851f,
+ 0.996820f, 0.996790f, 0.996759f, 0.996728f, 0.996697f, 0.996666f, 0.996634f, 0.996603f,
+ 0.996571f, 0.996539f, 0.996507f, 0.996475f, 0.996443f, 0.996411f, 0.996378f, 0.996345f,
+ 0.996313f, 0.996280f, 0.996247f, 0.996213f, 0.996180f, 0.996146f, 0.996113f, 0.996079f,
+ 0.996045f, 0.996011f, 0.995976f, 0.995942f, 0.995907f, 0.995872f, 0.995838f, 0.995803f,
+ 0.995767f, 0.995732f, 0.995697f, 0.995661f, 0.995625f, 0.995589f, 0.995553f, 0.995517f,
+ 0.995481f, 0.995444f, 0.995408f, 0.995371f, 0.995334f, 0.995297f, 0.995260f, 0.995222f,
+ 0.995185f, 0.995147f, 0.995109f, 0.995071f, 0.995033f, 0.994995f, 0.994957f, 0.994918f,
+ 0.994879f, 0.994841f, 0.994802f, 0.994762f, 0.994723f, 0.994684f, 0.994644f, 0.994604f,
+ 0.994565f, 0.994525f, 0.994484f, 0.994444f, 0.994404f, 0.994363f, 0.994322f, 0.994281f,
+ 0.994240f, 0.994199f, 0.994158f, 0.994116f, 0.994075f, 0.994033f, 0.993991f, 0.993949f,
+ 0.993907f, 0.993865f, 0.993822f, 0.993779f, 0.993737f, 0.993694f, 0.993651f, 0.993608f,
+ 0.993564f, 0.993521f, 0.993477f, 0.993433f, 0.993389f, 0.993345f, 0.993301f, 0.993257f,
+ 0.993212f, 0.993167f, 0.993122f, 0.993077f, 0.993032f, 0.992987f, 0.992942f, 0.992896f,
+ 0.992850f, 0.992805f, 0.992759f, 0.992712f, 0.992666f, 0.992620f, 0.992573f, 0.992526f,
+ 0.992480f, 0.992433f, 0.992385f, 0.992338f, 0.992291f, 0.992243f, 0.992195f, 0.992147f,
+ 0.992099f, 0.992051f, 0.992003f, 0.991954f, 0.991906f, 0.991857f, 0.991808f, 0.991759f,
+ 0.991710f, 0.991660f, 0.991611f, 0.991561f, 0.991511f, 0.991462f, 0.991411f, 0.991361f,
+ 0.991311f, 0.991260f, 0.991210f, 0.991159f, 0.991108f, 0.991057f, 0.991006f, 0.990954f,
+ 0.990903f, 0.990851f, 0.990799f, 0.990747f, 0.990695f, 0.990643f, 0.990590f, 0.990538f,
+ 0.990485f, 0.990432f, 0.990379f, 0.990326f, 0.990273f, 0.990219f, 0.990166f, 0.990112f,
+ 0.990058f, 0.990004f, 0.989950f, 0.989896f, 0.989841f, 0.989787f, 0.989732f, 0.989677f,
+ 0.989622f, 0.989567f, 0.989511f, 0.989456f, 0.989400f, 0.989345f, 0.989289f, 0.989233f,
+ 0.989177f, 0.989120f, 0.989064f, 0.989007f, 0.988950f, 0.988893f, 0.988836f, 0.988779f,
+ 0.988722f, 0.988664f, 0.988607f, 0.988549f, 0.988491f, 0.988433f, 0.988374f, 0.988316f,
+ 0.988258f, 0.988199f, 0.988140f, 0.988081f, 0.988022f, 0.987963f, 0.987903f, 0.987844f,
+ 0.987784f, 0.987724f, 0.987664f, 0.987604f, 0.987544f, 0.987484f, 0.987423f, 0.987362f,
+ 0.987301f, 0.987240f, 0.987179f, 0.987118f, 0.987057f, 0.986995f, 0.986933f, 0.986871f,
+ 0.986809f, 0.986747f, 0.986685f, 0.986623f, 0.986560f, 0.986497f, 0.986434f, 0.986371f,
+ 0.986308f, 0.986245f, 0.986181f, 0.986118f, 0.986054f, 0.985990f, 0.985926f, 0.985862f,
+ 0.985798f, 0.985733f, 0.985668f, 0.985604f, 0.985539f, 0.985474f, 0.985408f, 0.985343f,
+ 0.985278f, 0.985212f, 0.985146f, 0.985080f, 0.985014f, 0.984948f, 0.984882f, 0.984815f,
+ 0.984748f, 0.984682f, 0.984615f, 0.984548f, 0.984480f, 0.984413f, 0.984346f, 0.984278f,
+ 0.984210f, 0.984142f, 0.984074f, 0.984006f, 0.983937f, 0.983869f, 0.983800f, 0.983731f,
+ 0.983662f, 0.983593f, 0.983524f, 0.983455f, 0.983385f, 0.983315f, 0.983246f, 0.983176f,
+ 0.983105f, 0.983035f, 0.982965f, 0.982894f, 0.982824f, 0.982753f, 0.982682f, 0.982611f,
+ 0.982539f, 0.982468f, 0.982396f, 0.982325f, 0.982253f, 0.982181f, 0.982109f, 0.982036f,
+ 0.981964f, 0.981891f, 0.981819f, 0.981746f, 0.981673f, 0.981600f, 0.981526f, 0.981453f,
+ 0.981379f, 0.981305f, 0.981232f, 0.981158f, 0.981083f, 0.981009f, 0.980935f, 0.980860f,
+ 0.980785f, 0.980710f, 0.980635f, 0.980560f, 0.980485f, 0.980409f, 0.980334f, 0.980258f,
+ 0.980182f, 0.980106f, 0.980030f, 0.979954f, 0.979877f, 0.979800f, 0.979724f, 0.979647f,
+ 0.979570f, 0.979493f, 0.979415f, 0.979338f, 0.979260f, 0.979182f, 0.979104f, 0.979026f,
+ 0.978948f, 0.978870f, 0.978791f, 0.978713f, 0.978634f, 0.978555f, 0.978476f, 0.978397f,
+ 0.978317f, 0.978238f, 0.978158f, 0.978078f, 0.977998f, 0.977918f, 0.977838f, 0.977758f,
+ 0.977677f, 0.977597f, 0.977516f, 0.977435f, 0.977354f, 0.977273f, 0.977191f, 0.977110f,
+ 0.977028f, 0.976946f, 0.976864f, 0.976782f, 0.976700f, 0.976618f, 0.976535f, 0.976453f,
+ 0.976370f, 0.976287f, 0.976204f, 0.976120f, 0.976037f, 0.975954f, 0.975870f, 0.975786f,
+ 0.975702f, 0.975618f, 0.975534f, 0.975449f, 0.975365f, 0.975280f, 0.975195f, 0.975110f,
+ 0.975025f, 0.974940f, 0.974855f, 0.974769f, 0.974684f, 0.974598f, 0.974512f, 0.974426f,
+ 0.974339f, 0.974253f, 0.974166f, 0.974080f, 0.973993f, 0.973906f, 0.973819f, 0.973732f,
+ 0.973644f, 0.973557f, 0.973469f, 0.973381f, 0.973293f, 0.973205f, 0.973117f, 0.973028f,
+ 0.972940f, 0.972851f, 0.972762f, 0.972673f, 0.972584f, 0.972495f, 0.972406f, 0.972316f,
+ 0.972227f, 0.972137f, 0.972047f, 0.971957f, 0.971866f, 0.971776f, 0.971685f, 0.971595f,
+ 0.971504f, 0.971413f, 0.971322f, 0.971231f, 0.971139f, 0.971048f, 0.970956f, 0.970864f,
+ 0.970772f, 0.970680f, 0.970588f, 0.970495f, 0.970403f, 0.970310f, 0.970217f, 0.970124f,
+ 0.970031f, 0.969938f, 0.969845f, 0.969751f, 0.969657f, 0.969564f, 0.969470f, 0.969375f,
+ 0.969281f, 0.969187f, 0.969092f, 0.968998f, 0.968903f, 0.968808f, 0.968713f, 0.968617f,
+ 0.968522f, 0.968427f, 0.968331f, 0.968235f, 0.968139f, 0.968043f, 0.967947f, 0.967850f,
+ 0.967754f, 0.967657f, 0.967560f, 0.967463f, 0.967366f, 0.967269f, 0.967172f, 0.967074f,
+ 0.966976f, 0.966879f, 0.966781f, 0.966683f, 0.966584f, 0.966486f, 0.966387f, 0.966289f,
+ 0.966190f, 0.966091f, 0.965992f, 0.965893f, 0.965793f, 0.965694f, 0.965594f, 0.965494f,
+ 0.965394f, 0.965294f, 0.965194f, 0.965094f, 0.964993f, 0.964893f, 0.964792f, 0.964691f,
+ 0.964590f, 0.964489f, 0.964387f, 0.964286f, 0.964184f, 0.964082f, 0.963980f, 0.963878f,
+ 0.963776f, 0.963674f, 0.963571f, 0.963469f, 0.963366f, 0.963263f, 0.963160f, 0.963057f,
+ 0.962953f, 0.962850f, 0.962746f, 0.962642f, 0.962538f, 0.962434f, 0.962330f, 0.962226f,
+ 0.962121f, 0.962017f, 0.961912f, 0.961807f, 0.961702f, 0.961597f, 0.961492f, 0.961386f,
+ 0.961280f, 0.961175f, 0.961069f, 0.960963f, 0.960857f, 0.960750f, 0.960644f, 0.960537f,
+ 0.960431f, 0.960324f, 0.960217f, 0.960109f, 0.960002f, 0.959895f, 0.959787f, 0.959679f,
+ 0.959572f, 0.959463f, 0.959355f, 0.959247f, 0.959139f, 0.959030f, 0.958921f, 0.958812f,
+ 0.958703f, 0.958594f, 0.958485f, 0.958376f, 0.958266f, 0.958156f, 0.958046f, 0.957937f,
+ 0.957826f, 0.957716f, 0.957606f, 0.957495f, 0.957385f, 0.957274f, 0.957163f, 0.957052f,
+ 0.956940f, 0.956829f, 0.956717f, 0.956606f, 0.956494f, 0.956382f, 0.956270f, 0.956158f,
+ 0.956045f, 0.955933f, 0.955820f, 0.955707f, 0.955594f, 0.955481f, 0.955368f, 0.955255f,
+ 0.955141f, 0.955028f, 0.954914f, 0.954800f, 0.954686f, 0.954572f, 0.954457f, 0.954343f,
+ 0.954228f, 0.954113f, 0.953998f, 0.953883f, 0.953768f, 0.953653f, 0.953537f, 0.953422f,
+ 0.953306f, 0.953190f, 0.953074f, 0.952958f, 0.952842f, 0.952725f, 0.952609f, 0.952492f,
+ 0.952375f, 0.952258f, 0.952141f, 0.952024f, 0.951906f, 0.951789f, 0.951671f, 0.951553f,
+ 0.951435f, 0.951317f, 0.951199f, 0.951080f, 0.950962f, 0.950843f, 0.950724f, 0.950605f,
+ 0.950486f, 0.950367f, 0.950247f, 0.950128f, 0.950008f, 0.949888f, 0.949768f, 0.949648f,
+ 0.949528f, 0.949408f, 0.949287f, 0.949167f, 0.949046f, 0.948925f, 0.948804f, 0.948683f,
+ 0.948561f, 0.948440f, 0.948318f, 0.948196f, 0.948075f, 0.947953f, 0.947830f, 0.947708f,
+ 0.947586f, 0.947463f, 0.947340f, 0.947217f, 0.947094f, 0.946971f, 0.946848f, 0.946724f,
+ 0.946601f, 0.946477f, 0.946353f, 0.946229f, 0.946105f, 0.945981f, 0.945857f, 0.945732f,
+ 0.945607f, 0.945482f, 0.945358f, 0.945232f, 0.945107f, 0.944982f, 0.944856f, 0.944731f,
+ 0.944605f, 0.944479f, 0.944353f, 0.944227f, 0.944100f, 0.943974f, 0.943847f, 0.943720f,
+ 0.943593f, 0.943466f, 0.943339f, 0.943212f, 0.943084f, 0.942957f, 0.942829f, 0.942701f,
+ 0.942573f, 0.942445f, 0.942317f, 0.942188f, 0.942060f, 0.941931f, 0.941802f, 0.941673f,
+ 0.941544f, 0.941415f, 0.941285f, 0.941156f, 0.941026f, 0.940896f, 0.940766f, 0.940636f,
+ 0.940506f, 0.940376f, 0.940245f, 0.940115f, 0.939984f, 0.939853f, 0.939722f, 0.939591f,
+ 0.939459f, 0.939328f, 0.939196f, 0.939064f, 0.938932f, 0.938800f, 0.938668f, 0.938536f,
+ 0.938404f, 0.938271f, 0.938138f, 0.938005f, 0.937872f, 0.937739f, 0.937606f, 0.937473f,
+ 0.937339f, 0.937205f, 0.937072f, 0.936938f, 0.936803f, 0.936669f, 0.936535f, 0.936400f,
+ 0.936266f, 0.936131f, 0.935996f, 0.935861f, 0.935726f, 0.935590f, 0.935455f, 0.935319f,
+ 0.935184f, 0.935048f, 0.934912f, 0.934775f, 0.934639f, 0.934503f, 0.934366f, 0.934229f,
+ 0.934093f, 0.933956f, 0.933818f, 0.933681f, 0.933544f, 0.933406f, 0.933269f, 0.933131f,
+ 0.932993f, 0.932855f, 0.932716f, 0.932578f, 0.932440f, 0.932301f, 0.932162f, 0.932023f,
+ 0.931884f, 0.931745f, 0.931606f, 0.931466f, 0.931327f, 0.931187f, 0.931047f, 0.930907f,
+ 0.930767f, 0.930627f, 0.930486f, 0.930346f, 0.930205f, 0.930064f, 0.929923f, 0.929782f,
+ 0.929641f, 0.929500f, 0.929358f, 0.929216f, 0.929075f, 0.928933f, 0.928791f, 0.928648f,
+ 0.928506f, 0.928364f, 0.928221f, 0.928078f, 0.927935f, 0.927792f, 0.927649f, 0.927506f,
+ 0.927363f, 0.927219f, 0.927075f, 0.926931f, 0.926787f, 0.926643f, 0.926499f, 0.926355f,
+ 0.926210f, 0.926066f, 0.925921f, 0.925776f, 0.925631f, 0.925486f, 0.925340f, 0.925195f,
+ 0.925049f, 0.924904f, 0.924758f, 0.924612f, 0.924465f, 0.924319f, 0.924173f, 0.924026f,
+ 0.923880f, 0.923733f, 0.923586f, 0.923439f, 0.923291f, 0.923144f, 0.922997f, 0.922849f,
+ 0.922701f, 0.922553f, 0.922405f, 0.922257f, 0.922109f, 0.921960f, 0.921812f, 0.921663f,
+ 0.921514f, 0.921365f, 0.921216f, 0.921067f, 0.920917f, 0.920768f, 0.920618f, 0.920468f,
+ 0.920318f, 0.920168f, 0.920018f, 0.919868f, 0.919717f, 0.919567f, 0.919416f, 0.919265f,
+ 0.919114f, 0.918963f, 0.918811f, 0.918660f, 0.918508f, 0.918357f, 0.918205f, 0.918053f,
+ 0.917901f, 0.917749f, 0.917596f, 0.917444f, 0.917291f, 0.917138f, 0.916985f, 0.916832f,
+ 0.916679f, 0.916526f, 0.916372f, 0.916219f, 0.916065f, 0.915911f, 0.915757f, 0.915603f,
+ 0.915449f, 0.915294f, 0.915140f, 0.914985f, 0.914830f, 0.914675f, 0.914520f, 0.914365f,
+ 0.914210f, 0.914054f, 0.913899f, 0.913743f, 0.913587f, 0.913431f, 0.913275f, 0.913119f,
+ 0.912962f, 0.912806f, 0.912649f, 0.912492f, 0.912335f, 0.912178f, 0.912021f, 0.911864f,
+ 0.911706f, 0.911548f, 0.911391f, 0.911233f, 0.911075f, 0.910917f, 0.910758f, 0.910600f,
+ 0.910441f, 0.910283f, 0.910124f, 0.909965f, 0.909806f, 0.909646f, 0.909487f, 0.909328f,
+ 0.909168f, 0.909008f, 0.908848f, 0.908688f, 0.908528f, 0.908368f, 0.908207f, 0.908047f,
+ 0.907886f, 0.907725f, 0.907564f, 0.907403f, 0.907242f, 0.907081f, 0.906919f, 0.906757f,
+ 0.906596f, 0.906434f, 0.906272f, 0.906110f, 0.905947f, 0.905785f, 0.905622f, 0.905460f,
+ 0.905297f, 0.905134f, 0.904971f, 0.904807f, 0.904644f, 0.904481f, 0.904317f, 0.904153f,
+ 0.903989f, 0.903825f, 0.903661f, 0.903497f, 0.903332f, 0.903168f, 0.903003f, 0.902838f,
+ 0.902673f, 0.902508f, 0.902343f, 0.902178f, 0.902012f, 0.901847f, 0.901681f, 0.901515f,
+ 0.901349f, 0.901183f, 0.901016f, 0.900850f, 0.900683f, 0.900517f, 0.900350f, 0.900183f,
+ 0.900016f, 0.899849f, 0.899681f, 0.899514f, 0.899346f, 0.899179f, 0.899011f, 0.898843f,
+ 0.898674f, 0.898506f, 0.898338f, 0.898169f, 0.898001f, 0.897832f, 0.897663f, 0.897494f,
+ 0.897325f, 0.897155f, 0.896986f, 0.896816f, 0.896646f, 0.896477f, 0.896307f, 0.896137f,
+ 0.895966f, 0.895796f, 0.895625f, 0.895455f, 0.895284f, 0.895113f, 0.894942f, 0.894771f,
+ 0.894599f, 0.894428f, 0.894256f, 0.894085f, 0.893913f, 0.893741f, 0.893569f, 0.893397f,
+ 0.893224f, 0.893052f, 0.892879f, 0.892706f, 0.892534f, 0.892361f, 0.892187f, 0.892014f,
+ 0.891841f, 0.891667f, 0.891493f, 0.891320f, 0.891146f, 0.890972f, 0.890797f, 0.890623f,
+ 0.890449f, 0.890274f, 0.890099f, 0.889925f, 0.889750f, 0.889574f, 0.889399f, 0.889224f,
+ 0.889048f, 0.888873f, 0.888697f, 0.888521f, 0.888345f, 0.888169f, 0.887993f, 0.887816f,
+ 0.887640f, 0.887463f, 0.887286f, 0.887109f, 0.886932f, 0.886755f, 0.886578f, 0.886400f,
+ 0.886223f, 0.886045f, 0.885867f, 0.885689f, 0.885511f, 0.885333f, 0.885154f, 0.884976f,
+ 0.884797f, 0.884618f, 0.884439f, 0.884260f, 0.884081f, 0.883902f, 0.883723f, 0.883543f,
+ 0.883363f, 0.883184f, 0.883004f, 0.882824f, 0.882643f, 0.882463f, 0.882283f, 0.882102f,
+ 0.881921f, 0.881740f, 0.881559f, 0.881378f, 0.881197f, 0.881016f, 0.880834f, 0.880653f,
+ 0.880471f, 0.880289f, 0.880107f, 0.879925f, 0.879743f, 0.879560f, 0.879378f, 0.879195f,
+ 0.879012f, 0.878829f, 0.878646f, 0.878463f, 0.878280f, 0.878096f, 0.877913f, 0.877729f,
+ 0.877545f, 0.877361f, 0.877177f, 0.876993f, 0.876809f, 0.876624f, 0.876440f, 0.876255f,
+ 0.876070f, 0.875885f, 0.875700f, 0.875515f, 0.875329f, 0.875144f, 0.874958f, 0.874773f,
+ 0.874587f, 0.874401f, 0.874215f, 0.874028f, 0.873842f, 0.873655f, 0.873469f, 0.873282f,
+ 0.873095f, 0.872908f, 0.872721f, 0.872534f, 0.872346f, 0.872159f, 0.871971f, 0.871783f,
+ 0.871595f, 0.871407f, 0.871219f, 0.871031f, 0.870842f, 0.870654f, 0.870465f, 0.870276f,
+ 0.870087f, 0.869898f, 0.869709f, 0.869519f, 0.869330f, 0.869140f, 0.868951f, 0.868761f,
+ 0.868571f, 0.868381f, 0.868190f, 0.868000f, 0.867809f, 0.867619f, 0.867428f, 0.867237f,
+ 0.867046f, 0.866855f, 0.866664f, 0.866472f, 0.866281f, 0.866089f, 0.865898f, 0.865706f,
+ 0.865514f, 0.865321f, 0.865129f, 0.864937f, 0.864744f, 0.864552f, 0.864359f, 0.864166f,
+ 0.863973f, 0.863780f, 0.863586f, 0.863393f, 0.863199f, 0.863006f, 0.862812f, 0.862618f,
+ 0.862424f, 0.862230f, 0.862035f, 0.861841f, 0.861646f, 0.861452f, 0.861257f, 0.861062f,
+ 0.860867f, 0.860672f, 0.860476f, 0.860281f, 0.860085f, 0.859890f, 0.859694f, 0.859498f,
+ 0.859302f, 0.859106f, 0.858909f, 0.858713f, 0.858516f, 0.858320f, 0.858123f, 0.857926f,
+ 0.857729f, 0.857531f, 0.857334f, 0.857137f, 0.856939f, 0.856741f, 0.856543f, 0.856345f,
+ 0.856147f, 0.855949f, 0.855751f, 0.855552f, 0.855354f, 0.855155f, 0.854956f, 0.854757f,
+ 0.854558f, 0.854359f, 0.854159f, 0.853960f, 0.853760f, 0.853561f, 0.853361f, 0.853161f,
+ 0.852961f, 0.852760f, 0.852560f, 0.852360f, 0.852159f, 0.851958f, 0.851757f, 0.851556f,
+ 0.851355f, 0.851154f, 0.850953f, 0.850751f, 0.850549f, 0.850348f, 0.850146f, 0.849944f,
+ 0.849742f, 0.849540f, 0.849337f, 0.849135f, 0.848932f, 0.848729f, 0.848526f, 0.848323f,
+ 0.848120f, 0.847917f, 0.847714f, 0.847510f, 0.847307f, 0.847103f, 0.846899f, 0.846695f,
+ 0.846491f, 0.846287f, 0.846082f, 0.845878f, 0.845673f, 0.845469f, 0.845264f, 0.845059f,
+ 0.844854f, 0.844648f, 0.844443f, 0.844238f, 0.844032f, 0.843826f, 0.843620f, 0.843414f,
+ 0.843208f, 0.843002f, 0.842796f, 0.842589f, 0.842383f, 0.842176f, 0.841969f, 0.841762f,
+ 0.841555f, 0.841348f, 0.841140f, 0.840933f, 0.840725f, 0.840518f, 0.840310f, 0.840102f,
+ 0.839894f, 0.839686f, 0.839477f, 0.839269f, 0.839060f, 0.838852f, 0.838643f, 0.838434f,
+ 0.838225f, 0.838015f, 0.837806f, 0.837597f, 0.837387f, 0.837178f, 0.836968f, 0.836758f,
+ 0.836548f, 0.836338f, 0.836127f, 0.835917f, 0.835706f, 0.835496f, 0.835285f, 0.835074f,
+ 0.834863f, 0.834652f, 0.834440f, 0.834229f, 0.834018f, 0.833806f, 0.833594f, 0.833382f,
+ 0.833170f, 0.832958f, 0.832746f, 0.832533f, 0.832321f, 0.832108f, 0.831895f, 0.831683f,
+ 0.831470f, 0.831257f, 0.831043f, 0.830830f, 0.830616f, 0.830403f, 0.830189f, 0.829975f,
+ 0.829761f, 0.829547f, 0.829333f, 0.829119f, 0.828904f, 0.828690f, 0.828475f, 0.828260f,
+ 0.828045f, 0.827830f, 0.827615f, 0.827399f, 0.827184f, 0.826968f, 0.826753f, 0.826537f,
+ 0.826321f, 0.826105f, 0.825889f, 0.825673f, 0.825456f, 0.825240f, 0.825023f, 0.824806f,
+ 0.824589f, 0.824372f, 0.824155f, 0.823938f, 0.823721f, 0.823503f, 0.823285f, 0.823068f,
+ 0.822850f, 0.822632f, 0.822414f, 0.822195f, 0.821977f, 0.821759f, 0.821540f, 0.821321f,
+ 0.821102f, 0.820884f, 0.820664f, 0.820445f, 0.820226f, 0.820007f, 0.819787f, 0.819567f,
+ 0.819348f, 0.819128f, 0.818908f, 0.818687f, 0.818467f, 0.818247f, 0.818026f, 0.817806f,
+ 0.817585f, 0.817364f, 0.817143f, 0.816922f, 0.816701f, 0.816479f, 0.816258f, 0.816036f,
+ 0.815814f, 0.815593f, 0.815371f, 0.815149f, 0.814926f, 0.814704f, 0.814482f, 0.814259f,
+ 0.814036f, 0.813814f, 0.813591f, 0.813368f, 0.813144f, 0.812921f, 0.812698f, 0.812474f,
+ 0.812251f, 0.812027f, 0.811803f, 0.811579f, 0.811355f, 0.811131f, 0.810906f, 0.810682f,
+ 0.810457f, 0.810232f, 0.810008f, 0.809783f, 0.809558f, 0.809332f, 0.809107f, 0.808882f,
+ 0.808656f, 0.808430f, 0.808205f, 0.807979f, 0.807753f, 0.807527f, 0.807300f, 0.807074f,
+ 0.806848f, 0.806621f, 0.806394f, 0.806167f, 0.805940f, 0.805713f, 0.805486f, 0.805259f,
+ 0.805031f, 0.804804f, 0.804576f, 0.804348f, 0.804120f, 0.803892f, 0.803664f, 0.803436f,
+ 0.803208f, 0.802979f, 0.802750f, 0.802522f, 0.802293f, 0.802064f, 0.801835f, 0.801606f,
+ 0.801376f, 0.801147f, 0.800917f, 0.800687f, 0.800458f, 0.800228f, 0.799998f, 0.799768f,
+ 0.799537f, 0.799307f, 0.799076f, 0.798846f, 0.798615f, 0.798384f, 0.798153f, 0.797922f,
+ 0.797691f, 0.797459f, 0.797228f, 0.796996f, 0.796765f, 0.796533f, 0.796301f, 0.796069f,
+ 0.795837f, 0.795605f, 0.795372f, 0.795140f, 0.794907f, 0.794674f, 0.794442f, 0.794209f,
+ 0.793975f, 0.793742f, 0.793509f, 0.793276f, 0.793042f, 0.792808f, 0.792575f, 0.792341f,
+ 0.792107f, 0.791872f, 0.791638f, 0.791404f, 0.791169f, 0.790935f, 0.790700f, 0.790465f,
+ 0.790230f, 0.789995f, 0.789760f, 0.789525f, 0.789289f, 0.789054f, 0.788818f, 0.788582f,
+ 0.788346f, 0.788110f, 0.787874f, 0.787638f, 0.787402f, 0.787165f, 0.786929f, 0.786692f,
+ 0.786455f, 0.786218f, 0.785981f, 0.785744f, 0.785507f, 0.785269f, 0.785032f, 0.784794f,
+ 0.784557f, 0.784319f, 0.784081f, 0.783843f, 0.783605f, 0.783366f, 0.783128f, 0.782889f,
+ 0.782651f, 0.782412f, 0.782173f, 0.781934f, 0.781695f, 0.781456f, 0.781216f, 0.780977f,
+ 0.780737f, 0.780498f, 0.780258f, 0.780018f, 0.779778f, 0.779538f, 0.779297f, 0.779057f,
+ 0.778817f, 0.778576f, 0.778335f, 0.778094f, 0.777853f, 0.777612f, 0.777371f, 0.777130f,
+ 0.776888f, 0.776647f, 0.776405f, 0.776164f, 0.775922f, 0.775680f, 0.775438f, 0.775195f,
+ 0.774953f, 0.774711f, 0.774468f, 0.774225f, 0.773983f, 0.773740f, 0.773497f, 0.773254f,
+ 0.773010f, 0.772767f, 0.772524f, 0.772280f, 0.772036f, 0.771793f, 0.771549f, 0.771305f,
+ 0.771061f, 0.770816f, 0.770572f, 0.770327f, 0.770083f, 0.769838f, 0.769593f, 0.769348f,
+ 0.769103f, 0.768858f, 0.768613f, 0.768368f, 0.768122f, 0.767876f, 0.767631f, 0.767385f,
+ 0.767139f, 0.766893f, 0.766647f, 0.766400f, 0.766154f, 0.765907f, 0.765661f, 0.765414f,
+ 0.765167f, 0.764920f, 0.764673f, 0.764426f, 0.764179f, 0.763931f, 0.763684f, 0.763436f,
+ 0.763188f, 0.762941f, 0.762693f, 0.762444f, 0.762196f, 0.761948f, 0.761700f, 0.761451f,
+ 0.761202f, 0.760954f, 0.760705f, 0.760456f, 0.760207f, 0.759957f, 0.759708f, 0.759459f,
+ 0.759209f, 0.758960f, 0.758710f, 0.758460f, 0.758210f, 0.757960f, 0.757710f, 0.757459f,
+ 0.757209f, 0.756958f, 0.756708f, 0.756457f, 0.756206f, 0.755955f, 0.755704f, 0.755453f,
+ 0.755201f, 0.754950f, 0.754698f, 0.754447f, 0.754195f, 0.753943f, 0.753691f, 0.753439f,
+ 0.753187f, 0.752934f, 0.752682f, 0.752429f, 0.752177f, 0.751924f, 0.751671f, 0.751418f,
+ 0.751165f, 0.750912f, 0.750659f, 0.750405f, 0.750152f, 0.749898f, 0.749644f, 0.749390f,
+ 0.749136f, 0.748882f, 0.748628f, 0.748374f, 0.748119f, 0.747865f, 0.747610f, 0.747355f,
+ 0.747101f, 0.746846f, 0.746591f, 0.746335f, 0.746080f, 0.745825f, 0.745569f, 0.745314f,
+ 0.745058f, 0.744802f, 0.744546f, 0.744290f, 0.744034f, 0.743777f, 0.743521f, 0.743265f,
+ 0.743008f, 0.742751f, 0.742494f, 0.742237f, 0.741980f, 0.741723f, 0.741466f, 0.741209f,
+ 0.740951f, 0.740694f, 0.740436f, 0.740178f, 0.739920f, 0.739662f, 0.739404f, 0.739146f,
+ 0.738887f, 0.738629f, 0.738370f, 0.738112f, 0.737853f, 0.737594f, 0.737335f, 0.737076f,
+ 0.736817f, 0.736557f, 0.736298f, 0.736038f, 0.735779f, 0.735519f, 0.735259f, 0.734999f,
+ 0.734739f, 0.734479f, 0.734218f, 0.733958f, 0.733697f, 0.733437f, 0.733176f, 0.732915f,
+ 0.732654f, 0.732393f, 0.732132f, 0.731871f, 0.731609f, 0.731348f, 0.731086f, 0.730825f,
+ 0.730563f, 0.730301f, 0.730039f, 0.729777f, 0.729514f, 0.729252f, 0.728990f, 0.728727f,
+ 0.728464f, 0.728202f, 0.727939f, 0.727676f, 0.727413f, 0.727149f, 0.726886f, 0.726623f,
+ 0.726359f, 0.726095f, 0.725832f, 0.725568f, 0.725304f, 0.725040f, 0.724776f, 0.724511f,
+ 0.724247f, 0.723983f, 0.723718f, 0.723453f, 0.723188f, 0.722924f, 0.722659f, 0.722393f,
+ 0.722128f, 0.721863f, 0.721597f, 0.721332f, 0.721066f, 0.720800f, 0.720535f, 0.720269f,
+ 0.720003f, 0.719736f, 0.719470f, 0.719204f, 0.718937f, 0.718670f, 0.718404f, 0.718137f,
+ 0.717870f, 0.717603f, 0.717336f, 0.717069f, 0.716801f, 0.716534f, 0.716266f, 0.715999f,
+ 0.715731f, 0.715463f, 0.715195f, 0.714927f, 0.714659f, 0.714390f, 0.714122f, 0.713853f,
+ 0.713585f, 0.713316f, 0.713047f, 0.712778f, 0.712509f, 0.712240f, 0.711971f, 0.711702f,
+ 0.711432f, 0.711163f, 0.710893f, 0.710623f, 0.710353f, 0.710083f, 0.709813f, 0.709543f,
+ 0.709273f, 0.709002f, 0.708732f, 0.708461f, 0.708191f, 0.707920f, 0.707649f, 0.707378f,
+ 0.707107f, 0.706836f, 0.706564f, 0.706293f, 0.706021f, 0.705750f, 0.705478f, 0.705206f,
+ 0.704934f, 0.704662f, 0.704390f, 0.704118f, 0.703845f, 0.703573f, 0.703300f, 0.703028f,
+ 0.702755f, 0.702482f, 0.702209f, 0.701936f, 0.701663f, 0.701389f, 0.701116f, 0.700842f,
+ 0.700569f, 0.700295f, 0.700021f, 0.699747f, 0.699473f, 0.699199f, 0.698925f, 0.698651f,
+ 0.698376f, 0.698102f, 0.697827f, 0.697552f, 0.697277f, 0.697003f, 0.696728f, 0.696452f,
+ 0.696177f, 0.695902f, 0.695626f, 0.695351f, 0.695075f, 0.694799f, 0.694524f, 0.694248f,
+ 0.693971f, 0.693695f, 0.693419f, 0.693143f, 0.692866f, 0.692590f, 0.692313f, 0.692036f,
+ 0.691759f, 0.691482f, 0.691205f, 0.690928f, 0.690651f, 0.690373f, 0.690096f, 0.689818f,
+ 0.689541f, 0.689263f, 0.688985f, 0.688707f, 0.688429f, 0.688151f, 0.687872f, 0.687594f,
+ 0.687315f, 0.687037f, 0.686758f, 0.686479f, 0.686200f, 0.685921f, 0.685642f, 0.685363f,
+ 0.685084f, 0.684804f, 0.684525f, 0.684245f, 0.683965f, 0.683686f, 0.683406f, 0.683126f,
+ 0.682846f, 0.682565f, 0.682285f, 0.682005f, 0.681724f, 0.681443f, 0.681163f, 0.680882f,
+ 0.680601f, 0.680320f, 0.680039f, 0.679758f, 0.679476f, 0.679195f, 0.678913f, 0.678632f,
+ 0.678350f, 0.678068f, 0.677786f, 0.677504f, 0.677222f, 0.676940f, 0.676658f, 0.676375f,
+ 0.676093f, 0.675810f, 0.675527f, 0.675245f, 0.674962f, 0.674679f, 0.674396f, 0.674112f,
+ 0.673829f, 0.673546f, 0.673262f, 0.672978f, 0.672695f, 0.672411f, 0.672127f, 0.671843f,
+ 0.671559f, 0.671275f, 0.670990f, 0.670706f, 0.670422f, 0.670137f, 0.669852f, 0.669567f,
+ 0.669283f, 0.668998f, 0.668712f, 0.668427f, 0.668142f, 0.667857f, 0.667571f, 0.667286f,
+ 0.667000f, 0.666714f, 0.666428f, 0.666142f, 0.665856f, 0.665570f, 0.665284f, 0.664997f,
+ 0.664711f, 0.664424f, 0.664138f, 0.663851f, 0.663564f, 0.663277f, 0.662990f, 0.662703f,
+ 0.662416f, 0.662128f, 0.661841f, 0.661553f, 0.661266f, 0.660978f, 0.660690f, 0.660402f,
+ 0.660114f, 0.659826f, 0.659538f, 0.659250f, 0.658961f, 0.658673f, 0.658384f, 0.658095f,
+ 0.657807f, 0.657518f, 0.657229f, 0.656940f, 0.656651f, 0.656361f, 0.656072f, 0.655782f,
+ 0.655493f, 0.655203f, 0.654913f, 0.654624f, 0.654334f, 0.654044f, 0.653753f, 0.653463f,
+ 0.653173f, 0.652882f, 0.652592f, 0.652301f, 0.652011f, 0.651720f, 0.651429f, 0.651138f,
+ 0.650847f, 0.650555f, 0.650264f, 0.649973f, 0.649681f, 0.649390f, 0.649098f, 0.648806f,
+ 0.648514f, 0.648222f, 0.647930f, 0.647638f, 0.647346f, 0.647054f, 0.646761f, 0.646469f,
+ 0.646176f, 0.645883f, 0.645590f, 0.645298f, 0.645005f, 0.644711f, 0.644418f, 0.644125f,
+ 0.643832f, 0.643538f, 0.643245f, 0.642951f, 0.642657f, 0.642363f, 0.642069f, 0.641775f,
+ 0.641481f, 0.641187f, 0.640892f, 0.640598f, 0.640303f, 0.640009f, 0.639714f, 0.639419f,
+ 0.639124f, 0.638829f, 0.638534f, 0.638239f, 0.637944f, 0.637649f, 0.637353f, 0.637057f,
+ 0.636762f, 0.636466f, 0.636170f, 0.635874f, 0.635578f, 0.635282f, 0.634986f, 0.634690f,
+ 0.634393f, 0.634097f, 0.633800f, 0.633504f, 0.633207f, 0.632910f, 0.632613f, 0.632316f,
+ 0.632019f, 0.631721f, 0.631424f, 0.631127f, 0.630829f, 0.630532f, 0.630234f, 0.629936f,
+ 0.629638f, 0.629340f, 0.629042f, 0.628744f, 0.628446f, 0.628147f, 0.627849f, 0.627550f,
+ 0.627252f, 0.626953f, 0.626654f, 0.626355f, 0.626056f, 0.625757f, 0.625458f, 0.625159f,
+ 0.624860f, 0.624560f, 0.624260f, 0.623961f, 0.623661f, 0.623361f, 0.623061f, 0.622761f,
+ 0.622461f, 0.622161f, 0.621861f, 0.621560f, 0.621260f, 0.620959f, 0.620659f, 0.620358f,
+ 0.620057f, 0.619756f, 0.619455f, 0.619154f, 0.618853f, 0.618552f, 0.618250f, 0.617949f,
+ 0.617647f, 0.617346f, 0.617044f, 0.616742f, 0.616440f, 0.616138f, 0.615836f, 0.615534f,
+ 0.615232f, 0.614929f, 0.614627f, 0.614324f, 0.614022f, 0.613719f, 0.613416f, 0.613113f,
+ 0.612810f, 0.612507f, 0.612204f, 0.611901f, 0.611597f, 0.611294f, 0.610990f, 0.610687f,
+ 0.610383f, 0.610079f, 0.609775f, 0.609471f, 0.609167f, 0.608863f, 0.608559f, 0.608254f,
+ 0.607950f, 0.607645f, 0.607341f, 0.607036f, 0.606731f, 0.606426f, 0.606121f, 0.605816f,
+ 0.605511f, 0.605206f, 0.604900f, 0.604595f, 0.604290f, 0.603984f, 0.603678f, 0.603372f,
+ 0.603067f, 0.602761f, 0.602455f, 0.602148f, 0.601842f, 0.601536f, 0.601230f, 0.600923f,
+ 0.600616f, 0.600310f, 0.600003f, 0.599696f, 0.599389f, 0.599082f, 0.598775f, 0.598468f,
+ 0.598161f, 0.597853f, 0.597546f, 0.597238f, 0.596931f, 0.596623f, 0.596315f, 0.596007f,
+ 0.595699f, 0.595391f, 0.595083f, 0.594775f, 0.594467f, 0.594158f, 0.593850f, 0.593541f,
+ 0.593232f, 0.592924f, 0.592615f, 0.592306f, 0.591997f, 0.591688f, 0.591378f, 0.591069f,
+ 0.590760f, 0.590450f, 0.590141f, 0.589831f, 0.589521f, 0.589212f, 0.588902f, 0.588592f,
+ 0.588282f, 0.587971f, 0.587661f, 0.587351f, 0.587040f, 0.586730f, 0.586419f, 0.586109f,
+ 0.585798f, 0.585487f, 0.585176f, 0.584865f, 0.584554f, 0.584243f, 0.583931f, 0.583620f,
+ 0.583309f, 0.582997f, 0.582685f, 0.582374f, 0.582062f, 0.581750f, 0.581438f, 0.581126f,
+ 0.580814f, 0.580502f, 0.580189f, 0.579877f, 0.579565f, 0.579252f, 0.578939f, 0.578627f,
+ 0.578314f, 0.578001f, 0.577688f, 0.577375f, 0.577062f, 0.576748f, 0.576435f, 0.576122f,
+ 0.575808f, 0.575495f, 0.575181f, 0.574867f, 0.574553f, 0.574239f, 0.573925f, 0.573611f,
+ 0.573297f, 0.572983f, 0.572669f, 0.572354f, 0.572040f, 0.571725f, 0.571410f, 0.571096f,
+ 0.570781f, 0.570466f, 0.570151f, 0.569836f, 0.569521f, 0.569205f, 0.568890f, 0.568574f,
+ 0.568259f, 0.567943f, 0.567628f, 0.567312f, 0.566996f, 0.566680f, 0.566364f, 0.566048f,
+ 0.565732f, 0.565416f, 0.565099f, 0.564783f, 0.564466f, 0.564150f, 0.563833f, 0.563516f,
+ 0.563199f, 0.562882f, 0.562565f, 0.562248f, 0.561931f, 0.561614f, 0.561297f, 0.560979f,
+ 0.560662f, 0.560344f, 0.560026f, 0.559709f, 0.559391f, 0.559073f, 0.558755f, 0.558437f,
+ 0.558119f, 0.557800f, 0.557482f, 0.557164f, 0.556845f, 0.556526f, 0.556208f, 0.555889f,
+ 0.555570f, 0.555251f, 0.554932f, 0.554613f, 0.554294f, 0.553975f, 0.553656f, 0.553336f,
+ 0.553017f, 0.552697f, 0.552378f, 0.552058f, 0.551738f, 0.551418f, 0.551098f, 0.550778f,
+ 0.550458f, 0.550138f, 0.549818f, 0.549497f, 0.549177f, 0.548856f, 0.548536f, 0.548215f,
+ 0.547894f, 0.547573f, 0.547252f, 0.546931f, 0.546610f, 0.546289f, 0.545968f, 0.545646f,
+ 0.545325f, 0.545003f, 0.544682f, 0.544360f, 0.544039f, 0.543717f, 0.543395f, 0.543073f,
+ 0.542751f, 0.542429f, 0.542106f, 0.541784f, 0.541462f, 0.541139f, 0.540817f, 0.540494f,
+ 0.540171f, 0.539849f, 0.539526f, 0.539203f, 0.538880f, 0.538557f, 0.538234f, 0.537910f,
+ 0.537587f, 0.537264f, 0.536940f, 0.536617f, 0.536293f, 0.535969f, 0.535645f, 0.535322f,
+ 0.534998f, 0.534674f, 0.534349f, 0.534025f, 0.533701f, 0.533377f, 0.533052f, 0.532728f,
+ 0.532403f, 0.532078f, 0.531754f, 0.531429f, 0.531104f, 0.530779f, 0.530454f, 0.530129f,
+ 0.529804f, 0.529478f, 0.529153f, 0.528828f, 0.528502f, 0.528176f, 0.527851f, 0.527525f,
+ 0.527199f, 0.526873f, 0.526547f, 0.526221f, 0.525895f, 0.525569f, 0.525243f, 0.524916f,
+ 0.524590f, 0.524263f, 0.523937f, 0.523610f, 0.523283f, 0.522956f, 0.522629f, 0.522302f,
+ 0.521975f, 0.521648f, 0.521321f, 0.520994f, 0.520666f, 0.520339f, 0.520011f, 0.519684f,
+ 0.519356f, 0.519028f, 0.518700f, 0.518372f, 0.518045f, 0.517716f, 0.517388f, 0.517060f,
+ 0.516732f, 0.516403f, 0.516075f, 0.515746f, 0.515418f, 0.515089f, 0.514760f, 0.514432f,
+ 0.514103f, 0.513774f, 0.513445f, 0.513116f, 0.512786f, 0.512457f, 0.512128f, 0.511798f,
+ 0.511469f, 0.511139f, 0.510810f, 0.510480f, 0.510150f, 0.509820f, 0.509490f, 0.509160f,
+ 0.508830f, 0.508500f, 0.508170f, 0.507839f, 0.507509f, 0.507179f, 0.506848f, 0.506517f,
+ 0.506187f, 0.505856f, 0.505525f, 0.505194f, 0.504863f, 0.504532f, 0.504201f, 0.503870f,
+ 0.503538f, 0.503207f, 0.502876f, 0.502544f, 0.502212f, 0.501881f, 0.501549f, 0.501217f,
+ 0.500885f, 0.500553f, 0.500221f, 0.499889f, 0.499557f, 0.499225f, 0.498893f, 0.498560f,
+ 0.498228f, 0.497895f, 0.497562f, 0.497230f, 0.496897f, 0.496564f, 0.496231f, 0.495898f,
+ 0.495565f, 0.495232f, 0.494899f, 0.494566f, 0.494232f, 0.493899f, 0.493565f, 0.493232f,
+ 0.492898f, 0.492564f, 0.492231f, 0.491897f, 0.491563f, 0.491229f, 0.490895f, 0.490561f,
+ 0.490226f, 0.489892f, 0.489558f, 0.489223f, 0.488889f, 0.488554f, 0.488220f, 0.487885f,
+ 0.487550f, 0.487215f, 0.486880f, 0.486545f, 0.486210f, 0.485875f, 0.485540f, 0.485205f,
+ 0.484869f, 0.484534f, 0.484198f, 0.483863f, 0.483527f, 0.483191f, 0.482856f, 0.482520f,
+ 0.482184f, 0.481848f, 0.481512f, 0.481176f, 0.480839f, 0.480503f, 0.480167f, 0.479830f,
+ 0.479494f, 0.479157f, 0.478821f, 0.478484f, 0.478147f, 0.477810f, 0.477473f, 0.477136f,
+ 0.476799f, 0.476462f, 0.476125f, 0.475788f, 0.475450f, 0.475113f, 0.474775f, 0.474438f,
+ 0.474100f, 0.473763f, 0.473425f, 0.473087f, 0.472749f, 0.472411f, 0.472073f, 0.471735f,
+ 0.471397f, 0.471058f, 0.470720f, 0.470382f, 0.470043f, 0.469705f, 0.469366f, 0.469028f,
+ 0.468689f, 0.468350f, 0.468011f, 0.467672f, 0.467333f, 0.466994f, 0.466655f, 0.466316f,
+ 0.465977f, 0.465637f, 0.465298f, 0.464958f, 0.464619f, 0.464279f, 0.463939f, 0.463600f,
+ 0.463260f, 0.462920f, 0.462580f, 0.462240f, 0.461900f, 0.461560f, 0.461219f, 0.460879f,
+ 0.460539f, 0.460198f, 0.459858f, 0.459517f, 0.459177f, 0.458836f, 0.458495f, 0.458154f,
+ 0.457813f, 0.457472f, 0.457131f, 0.456790f, 0.456449f, 0.456108f, 0.455766f, 0.455425f,
+ 0.455084f, 0.454742f, 0.454400f, 0.454059f, 0.453717f, 0.453375f, 0.453033f, 0.452692f,
+ 0.452350f, 0.452008f, 0.451665f, 0.451323f, 0.450981f, 0.450639f, 0.450296f, 0.449954f,
+ 0.449611f, 0.449269f, 0.448926f, 0.448583f, 0.448241f, 0.447898f, 0.447555f, 0.447212f,
+ 0.446869f, 0.446526f, 0.446183f, 0.445839f, 0.445496f, 0.445153f, 0.444809f, 0.444466f,
+ 0.444122f, 0.443779f, 0.443435f, 0.443091f, 0.442747f, 0.442403f, 0.442059f, 0.441715f,
+ 0.441371f, 0.441027f, 0.440683f, 0.440339f, 0.439994f, 0.439650f, 0.439305f, 0.438961f,
+ 0.438616f, 0.438272f, 0.437927f, 0.437582f, 0.437237f, 0.436892f, 0.436547f, 0.436202f,
+ 0.435857f, 0.435512f, 0.435167f, 0.434821f, 0.434476f, 0.434131f, 0.433785f, 0.433439f,
+ 0.433094f, 0.432748f, 0.432402f, 0.432057f, 0.431711f, 0.431365f, 0.431019f, 0.430673f,
+ 0.430326f, 0.429980f, 0.429634f, 0.429288f, 0.428941f, 0.428595f, 0.428248f, 0.427902f,
+ 0.427555f, 0.427208f, 0.426862f, 0.426515f, 0.426168f, 0.425821f, 0.425474f, 0.425127f,
+ 0.424780f, 0.424432f, 0.424085f, 0.423738f, 0.423390f, 0.423043f, 0.422695f, 0.422348f,
+ 0.422000f, 0.421653f, 0.421305f, 0.420957f, 0.420609f, 0.420261f, 0.419913f, 0.419565f,
+ 0.419217f, 0.418869f, 0.418520f, 0.418172f, 0.417824f, 0.417475f, 0.417127f, 0.416778f,
+ 0.416430f, 0.416081f, 0.415732f, 0.415383f, 0.415034f, 0.414685f, 0.414337f, 0.413987f,
+ 0.413638f, 0.413289f, 0.412940f, 0.412591f, 0.412241f, 0.411892f, 0.411542f, 0.411193f,
+ 0.410843f, 0.410493f, 0.410144f, 0.409794f, 0.409444f, 0.409094f, 0.408744f, 0.408394f,
+ 0.408044f, 0.407694f, 0.407344f, 0.406994f, 0.406643f, 0.406293f, 0.405942f, 0.405592f,
+ 0.405241f, 0.404891f, 0.404540f, 0.404189f, 0.403838f, 0.403488f, 0.403137f, 0.402786f,
+ 0.402435f, 0.402084f, 0.401732f, 0.401381f, 0.401030f, 0.400679f, 0.400327f, 0.399976f,
+ 0.399624f, 0.399273f, 0.398921f, 0.398569f, 0.398218f, 0.397866f, 0.397514f, 0.397162f,
+ 0.396810f, 0.396458f, 0.396106f, 0.395754f, 0.395401f, 0.395049f, 0.394697f, 0.394344f,
+ 0.393992f, 0.393640f, 0.393287f, 0.392934f, 0.392582f, 0.392229f, 0.391876f, 0.391523f,
+ 0.391170f, 0.390817f, 0.390464f, 0.390111f, 0.389758f, 0.389405f, 0.389052f, 0.388698f,
+ 0.388345f, 0.387992f, 0.387638f, 0.387285f, 0.386931f, 0.386577f, 0.386224f, 0.385870f,
+ 0.385516f, 0.385162f, 0.384808f, 0.384454f, 0.384100f, 0.383746f, 0.383392f, 0.383038f,
+ 0.382683f, 0.382329f, 0.381975f, 0.381620f, 0.381266f, 0.380911f, 0.380557f, 0.380202f,
+ 0.379847f, 0.379492f, 0.379138f, 0.378783f, 0.378428f, 0.378073f, 0.377718f, 0.377363f,
+ 0.377007f, 0.376652f, 0.376297f, 0.375942f, 0.375586f, 0.375231f, 0.374875f, 0.374520f,
+ 0.374164f, 0.373808f, 0.373453f, 0.373097f, 0.372741f, 0.372385f, 0.372029f, 0.371673f,
+ 0.371317f, 0.370961f, 0.370605f, 0.370249f, 0.369892f, 0.369536f, 0.369180f, 0.368823f,
+ 0.368467f, 0.368110f, 0.367754f, 0.367397f, 0.367040f, 0.366684f, 0.366327f, 0.365970f,
+ 0.365613f, 0.365256f, 0.364899f, 0.364542f, 0.364185f, 0.363828f, 0.363470f, 0.363113f,
+ 0.362756f, 0.362398f, 0.362041f, 0.361683f, 0.361326f, 0.360968f, 0.360611f, 0.360253f,
+ 0.359895f, 0.359537f, 0.359179f, 0.358821f, 0.358463f, 0.358105f, 0.357747f, 0.357389f,
+ 0.357031f, 0.356673f, 0.356314f, 0.355956f, 0.355598f, 0.355239f, 0.354881f, 0.354522f,
+ 0.354164f, 0.353805f, 0.353446f, 0.353087f, 0.352729f, 0.352370f, 0.352011f, 0.351652f,
+ 0.351293f, 0.350934f, 0.350575f, 0.350215f, 0.349856f, 0.349497f, 0.349138f, 0.348778f,
+ 0.348419f, 0.348059f, 0.347700f, 0.347340f, 0.346980f, 0.346621f, 0.346261f, 0.345901f,
+ 0.345541f, 0.345181f, 0.344821f, 0.344461f, 0.344101f, 0.343741f, 0.343381f, 0.343021f,
+ 0.342661f, 0.342300f, 0.341940f, 0.341580f, 0.341219f, 0.340859f, 0.340498f, 0.340138f,
+ 0.339777f, 0.339416f, 0.339055f, 0.338695f, 0.338334f, 0.337973f, 0.337612f, 0.337251f,
+ 0.336890f, 0.336529f, 0.336168f, 0.335806f, 0.335445f, 0.335084f, 0.334722f, 0.334361f,
+ 0.334000f, 0.333638f, 0.333277f, 0.332915f, 0.332553f, 0.332192f, 0.331830f, 0.331468f,
+ 0.331106f, 0.330744f, 0.330382f, 0.330020f, 0.329658f, 0.329296f, 0.328934f, 0.328572f,
+ 0.328210f, 0.327848f, 0.327485f, 0.327123f, 0.326760f, 0.326398f, 0.326035f, 0.325673f,
+ 0.325310f, 0.324948f, 0.324585f, 0.324222f, 0.323859f, 0.323497f, 0.323134f, 0.322771f,
+ 0.322408f, 0.322045f, 0.321682f, 0.321318f, 0.320955f, 0.320592f, 0.320229f, 0.319865f,
+ 0.319502f, 0.319139f, 0.318775f, 0.318412f, 0.318048f, 0.317684f, 0.317321f, 0.316957f,
+ 0.316593f, 0.316230f, 0.315866f, 0.315502f, 0.315138f, 0.314774f, 0.314410f, 0.314046f,
+ 0.313682f, 0.313318f, 0.312953f, 0.312589f, 0.312225f, 0.311860f, 0.311496f, 0.311132f,
+ 0.310767f, 0.310403f, 0.310038f, 0.309673f, 0.309309f, 0.308944f, 0.308579f, 0.308214f,
+ 0.307850f, 0.307485f, 0.307120f, 0.306755f, 0.306390f, 0.306025f, 0.305660f, 0.305294f,
+ 0.304929f, 0.304564f, 0.304199f, 0.303833f, 0.303468f, 0.303103f, 0.302737f, 0.302372f,
+ 0.302006f, 0.301640f, 0.301275f, 0.300909f, 0.300543f, 0.300177f, 0.299812f, 0.299446f,
+ 0.299080f, 0.298714f, 0.298348f, 0.297982f, 0.297616f, 0.297250f, 0.296883f, 0.296517f,
+ 0.296151f, 0.295785f, 0.295418f, 0.295052f, 0.294685f, 0.294319f, 0.293952f, 0.293586f,
+ 0.293219f, 0.292852f, 0.292486f, 0.292119f, 0.291752f, 0.291385f, 0.291019f, 0.290652f,
+ 0.290285f, 0.289918f, 0.289551f, 0.289184f, 0.288816f, 0.288449f, 0.288082f, 0.287715f,
+ 0.287347f, 0.286980f, 0.286613f, 0.286245f, 0.285878f, 0.285510f, 0.285143f, 0.284775f,
+ 0.284408f, 0.284040f, 0.283672f, 0.283304f, 0.282937f, 0.282569f, 0.282201f, 0.281833f,
+ 0.281465f, 0.281097f, 0.280729f, 0.280361f, 0.279993f, 0.279624f, 0.279256f, 0.278888f,
+ 0.278520f, 0.278151f, 0.277783f, 0.277415f, 0.277046f, 0.276678f, 0.276309f, 0.275940f,
+ 0.275572f, 0.275203f, 0.274834f, 0.274466f, 0.274097f, 0.273728f, 0.273359f, 0.272990f,
+ 0.272621f, 0.272252f, 0.271883f, 0.271514f, 0.271145f, 0.270776f, 0.270407f, 0.270038f,
+ 0.269668f, 0.269299f, 0.268930f, 0.268560f, 0.268191f, 0.267821f, 0.267452f, 0.267082f,
+ 0.266713f, 0.266343f, 0.265973f, 0.265604f, 0.265234f, 0.264864f, 0.264494f, 0.264125f,
+ 0.263755f, 0.263385f, 0.263015f, 0.262645f, 0.262275f, 0.261905f, 0.261534f, 0.261164f,
+ 0.260794f, 0.260424f, 0.260054f, 0.259683f, 0.259313f, 0.258943f, 0.258572f, 0.258202f,
+ 0.257831f, 0.257461f, 0.257090f, 0.256719f, 0.256349f, 0.255978f, 0.255607f, 0.255236f,
+ 0.254866f, 0.254495f, 0.254124f, 0.253753f, 0.253382f, 0.253011f, 0.252640f, 0.252269f,
+ 0.251898f, 0.251527f, 0.251155f, 0.250784f, 0.250413f, 0.250042f, 0.249670f, 0.249299f,
+ 0.248928f, 0.248556f, 0.248185f, 0.247813f, 0.247442f, 0.247070f, 0.246698f, 0.246327f,
+ 0.245955f, 0.245583f, 0.245212f, 0.244840f, 0.244468f, 0.244096f, 0.243724f, 0.243352f,
+ 0.242980f, 0.242608f, 0.242236f, 0.241864f, 0.241492f, 0.241120f, 0.240748f, 0.240375f,
+ 0.240003f, 0.239631f, 0.239258f, 0.238886f, 0.238514f, 0.238141f, 0.237769f, 0.237396f,
+ 0.237024f, 0.236651f, 0.236278f, 0.235906f, 0.235533f, 0.235160f, 0.234788f, 0.234415f,
+ 0.234042f, 0.233669f, 0.233296f, 0.232923f, 0.232550f, 0.232177f, 0.231804f, 0.231431f,
+ 0.231058f, 0.230685f, 0.230312f, 0.229939f, 0.229565f, 0.229192f, 0.228819f, 0.228445f,
+ 0.228072f, 0.227699f, 0.227325f, 0.226952f, 0.226578f, 0.226205f, 0.225831f, 0.225458f,
+ 0.225084f, 0.224710f, 0.224337f, 0.223963f, 0.223589f, 0.223215f, 0.222841f, 0.222468f,
+ 0.222094f, 0.221720f, 0.221346f, 0.220972f, 0.220598f, 0.220224f, 0.219850f, 0.219475f,
+ 0.219101f, 0.218727f, 0.218353f, 0.217979f, 0.217604f, 0.217230f, 0.216856f, 0.216481f,
+ 0.216107f, 0.215732f, 0.215358f, 0.214983f, 0.214609f, 0.214234f, 0.213860f, 0.213485f,
+ 0.213110f, 0.212736f, 0.212361f, 0.211986f, 0.211611f, 0.211237f, 0.210862f, 0.210487f,
+ 0.210112f, 0.209737f, 0.209362f, 0.208987f, 0.208612f, 0.208237f, 0.207862f, 0.207487f,
+ 0.207111f, 0.206736f, 0.206361f, 0.205986f, 0.205610f, 0.205235f, 0.204860f, 0.204484f,
+ 0.204109f, 0.203734f, 0.203358f, 0.202983f, 0.202607f, 0.202231f, 0.201856f, 0.201480f,
+ 0.201105f, 0.200729f, 0.200353f, 0.199978f, 0.199602f, 0.199226f, 0.198850f, 0.198474f,
+ 0.198098f, 0.197722f, 0.197347f, 0.196971f, 0.196595f, 0.196219f, 0.195843f, 0.195466f,
+ 0.195090f, 0.194714f, 0.194338f, 0.193962f, 0.193586f, 0.193209f, 0.192833f, 0.192457f,
+ 0.192080f, 0.191704f, 0.191328f, 0.190951f, 0.190575f, 0.190198f, 0.189822f, 0.189445f,
+ 0.189069f, 0.188692f, 0.188315f, 0.187939f, 0.187562f, 0.187185f, 0.186809f, 0.186432f,
+ 0.186055f, 0.185678f, 0.185301f, 0.184925f, 0.184548f, 0.184171f, 0.183794f, 0.183417f,
+ 0.183040f, 0.182663f, 0.182286f, 0.181909f, 0.181532f, 0.181154f, 0.180777f, 0.180400f,
+ 0.180023f, 0.179646f, 0.179268f, 0.178891f, 0.178514f, 0.178136f, 0.177759f, 0.177382f,
+ 0.177004f, 0.176627f, 0.176249f, 0.175872f, 0.175494f, 0.175117f, 0.174739f, 0.174362f,
+ 0.173984f, 0.173606f, 0.173229f, 0.172851f, 0.172473f, 0.172095f, 0.171718f, 0.171340f,
+ 0.170962f, 0.170584f, 0.170206f, 0.169828f, 0.169450f, 0.169072f, 0.168694f, 0.168316f,
+ 0.167938f, 0.167560f, 0.167182f, 0.166804f, 0.166426f, 0.166048f, 0.165670f, 0.165291f,
+ 0.164913f, 0.164535f, 0.164157f, 0.163778f, 0.163400f, 0.163022f, 0.162643f, 0.162265f,
+ 0.161886f, 0.161508f, 0.161129f, 0.160751f, 0.160372f, 0.159994f, 0.159615f, 0.159237f,
+ 0.158858f, 0.158480f, 0.158101f, 0.157722f, 0.157343f, 0.156965f, 0.156586f, 0.156207f,
+ 0.155828f, 0.155450f, 0.155071f, 0.154692f, 0.154313f, 0.153934f, 0.153555f, 0.153176f,
+ 0.152797f, 0.152418f, 0.152039f, 0.151660f, 0.151281f, 0.150902f, 0.150523f, 0.150144f,
+ 0.149765f, 0.149385f, 0.149006f, 0.148627f, 0.148248f, 0.147868f, 0.147489f, 0.147110f,
+ 0.146730f, 0.146351f, 0.145972f, 0.145592f, 0.145213f, 0.144833f, 0.144454f, 0.144075f,
+ 0.143695f, 0.143316f, 0.142936f, 0.142556f, 0.142177f, 0.141797f, 0.141418f, 0.141038f,
+ 0.140658f, 0.140279f, 0.139899f, 0.139519f, 0.139139f, 0.138760f, 0.138380f, 0.138000f,
+ 0.137620f, 0.137240f, 0.136860f, 0.136480f, 0.136101f, 0.135721f, 0.135341f, 0.134961f,
+ 0.134581f, 0.134201f, 0.133821f, 0.133441f, 0.133061f, 0.132680f, 0.132300f, 0.131920f,
+ 0.131540f, 0.131160f, 0.130780f, 0.130399f, 0.130019f, 0.129639f, 0.129259f, 0.128878f,
+ 0.128498f, 0.128118f, 0.127737f, 0.127357f, 0.126977f, 0.126596f, 0.126216f, 0.125835f,
+ 0.125455f, 0.125075f, 0.124694f, 0.124314f, 0.123933f, 0.123552f, 0.123172f, 0.122791f,
+ 0.122411f, 0.122030f, 0.121649f, 0.121269f, 0.120888f, 0.120507f, 0.120127f, 0.119746f,
+ 0.119365f, 0.118984f, 0.118604f, 0.118223f, 0.117842f, 0.117461f, 0.117080f, 0.116700f,
+ 0.116319f, 0.115938f, 0.115557f, 0.115176f, 0.114795f, 0.114414f, 0.114033f, 0.113652f,
+ 0.113271f, 0.112890f, 0.112509f, 0.112128f, 0.111747f, 0.111366f, 0.110984f, 0.110603f,
+ 0.110222f, 0.109841f, 0.109460f, 0.109079f, 0.108697f, 0.108316f, 0.107935f, 0.107554f,
+ 0.107172f, 0.106791f, 0.106410f, 0.106028f, 0.105647f, 0.105266f, 0.104884f, 0.104503f,
+ 0.104122f, 0.103740f, 0.103359f, 0.102977f, 0.102596f, 0.102214f, 0.101833f, 0.101451f,
+ 0.101070f, 0.100688f, 0.100307f, 0.099925f, 0.099544f, 0.099162f, 0.098780f, 0.098399f,
+ 0.098017f, 0.097635f, 0.097254f, 0.096872f, 0.096490f, 0.096109f, 0.095727f, 0.095345f,
+ 0.094963f, 0.094582f, 0.094200f, 0.093818f, 0.093436f, 0.093055f, 0.092673f, 0.092291f,
+ 0.091909f, 0.091527f, 0.091145f, 0.090763f, 0.090381f, 0.089999f, 0.089617f, 0.089236f,
+ 0.088854f, 0.088472f, 0.088090f, 0.087708f, 0.087326f, 0.086943f, 0.086561f, 0.086179f,
+ 0.085797f, 0.085415f, 0.085033f, 0.084651f, 0.084269f, 0.083887f, 0.083505f, 0.083122f,
+ 0.082740f, 0.082358f, 0.081976f, 0.081594f, 0.081211f, 0.080829f, 0.080447f, 0.080065f,
+ 0.079682f, 0.079300f, 0.078918f, 0.078536f, 0.078153f, 0.077771f, 0.077389f, 0.077006f,
+ 0.076624f, 0.076241f, 0.075859f, 0.075477f, 0.075094f, 0.074712f, 0.074329f, 0.073947f,
+ 0.073565f, 0.073182f, 0.072800f, 0.072417f, 0.072035f, 0.071652f, 0.071270f, 0.070887f,
+ 0.070505f, 0.070122f, 0.069739f, 0.069357f, 0.068974f, 0.068592f, 0.068209f, 0.067827f,
+ 0.067444f, 0.067061f, 0.066679f, 0.066296f, 0.065913f, 0.065531f, 0.065148f, 0.064765f,
+ 0.064383f, 0.064000f, 0.063617f, 0.063234f, 0.062852f, 0.062469f, 0.062086f, 0.061704f,
+ 0.061321f, 0.060938f, 0.060555f, 0.060172f, 0.059790f, 0.059407f, 0.059024f, 0.058641f,
+ 0.058258f, 0.057875f, 0.057493f, 0.057110f, 0.056727f, 0.056344f, 0.055961f, 0.055578f,
+ 0.055195f, 0.054812f, 0.054429f, 0.054046f, 0.053664f, 0.053281f, 0.052898f, 0.052515f,
+ 0.052132f, 0.051749f, 0.051366f, 0.050983f, 0.050600f, 0.050217f, 0.049834f, 0.049451f,
+ 0.049068f, 0.048685f, 0.048302f, 0.047919f, 0.047535f, 0.047152f, 0.046769f, 0.046386f,
+ 0.046003f, 0.045620f, 0.045237f, 0.044854f, 0.044471f, 0.044088f, 0.043705f, 0.043321f,
+ 0.042938f, 0.042555f, 0.042172f, 0.041789f, 0.041406f, 0.041022f, 0.040639f, 0.040256f,
+ 0.039873f, 0.039490f, 0.039107f, 0.038723f, 0.038340f, 0.037957f, 0.037574f, 0.037190f,
+ 0.036807f, 0.036424f, 0.036041f, 0.035657f, 0.035274f, 0.034891f, 0.034508f, 0.034124f,
+ 0.033741f, 0.033358f, 0.032975f, 0.032591f, 0.032208f, 0.031825f, 0.031441f, 0.031058f,
+ 0.030675f, 0.030291f, 0.029908f, 0.029525f, 0.029142f, 0.028758f, 0.028375f, 0.027991f,
+ 0.027608f, 0.027225f, 0.026841f, 0.026458f, 0.026075f, 0.025691f, 0.025308f, 0.024925f,
+ 0.024541f, 0.024158f, 0.023774f, 0.023391f, 0.023008f, 0.022624f, 0.022241f, 0.021857f,
+ 0.021474f, 0.021091f, 0.020707f, 0.020324f, 0.019940f, 0.019557f, 0.019174f, 0.018790f,
+ 0.018407f, 0.018023f, 0.017640f, 0.017256f, 0.016873f, 0.016490f, 0.016106f, 0.015723f,
+ 0.015339f, 0.014956f, 0.014572f, 0.014189f, 0.013805f, 0.013422f, 0.013038f, 0.012655f,
+ 0.012272f, 0.011888f, 0.011505f, 0.011121f, 0.010738f, 0.010354f, 0.009971f, 0.009587f,
+ 0.009204f, 0.008820f, 0.008437f, 0.008053f, 0.007670f, 0.007286f, 0.006903f, 0.006519f,
+ 0.006136f, 0.005752f, 0.005369f, 0.004985f, 0.004602f, 0.004218f, 0.003835f, 0.003451f,
+ 0.003068f, 0.002684f, 0.002301f, 0.001917f, 0.001534f, 0.001150f, 0.000767f, 0.000383f,
+ 0.000000f, 0.000383f, 0.000767f, 0.001150f, 0.001534f, 0.001917f, 0.002301f, 0.002684f,
+ 0.003068f, 0.003451f, 0.003835f, 0.004218f, 0.004602f, 0.004985f, 0.005369f, 0.005752f,
+ 0.006136f, 0.006519f, 0.006903f, 0.007286f, 0.007670f, 0.008053f, 0.008437f, 0.008820f,
+ 0.009204f, 0.009587f, 0.009971f, 0.010354f, 0.010738f, 0.011121f, 0.011505f, 0.011888f,
+ 0.012272f, 0.012655f, 0.013038f, 0.013422f, 0.013805f, 0.014189f, 0.014572f, 0.014956f,
+ 0.015339f, 0.015723f, 0.016106f, 0.016490f, 0.016873f, 0.017256f, 0.017640f, 0.018023f,
+ 0.018407f, 0.018790f, 0.019174f, 0.019557f, 0.019940f, 0.020324f, 0.020707f, 0.021091f,
+ 0.021474f, 0.021857f, 0.022241f, 0.022624f, 0.023008f, 0.023391f, 0.023774f, 0.024158f,
+ 0.024541f, 0.024925f, 0.025308f, 0.025691f, 0.026075f, 0.026458f, 0.026841f, 0.027225f,
+ 0.027608f, 0.027991f, 0.028375f, 0.028758f, 0.029142f, 0.029525f, 0.029908f, 0.030291f,
+ 0.030675f, 0.031058f, 0.031441f, 0.031825f, 0.032208f, 0.032591f, 0.032975f, 0.033358f,
+ 0.033741f, 0.034124f, 0.034508f, 0.034891f, 0.035274f, 0.035657f, 0.036041f, 0.036424f,
+ 0.036807f, 0.037190f, 0.037574f, 0.037957f, 0.038340f, 0.038723f, 0.039107f, 0.039490f,
+ 0.039873f, 0.040256f, 0.040639f, 0.041022f, 0.041406f, 0.041789f, 0.042172f, 0.042555f,
+ 0.042938f, 0.043321f, 0.043705f, 0.044088f, 0.044471f, 0.044854f, 0.045237f, 0.045620f,
+ 0.046003f, 0.046386f, 0.046769f, 0.047152f, 0.047535f, 0.047919f, 0.048302f, 0.048685f,
+ 0.049068f, 0.049451f, 0.049834f, 0.050217f, 0.050600f, 0.050983f, 0.051366f, 0.051749f,
+ 0.052132f, 0.052515f, 0.052898f, 0.053281f, 0.053664f, 0.054046f, 0.054429f, 0.054812f,
+ 0.055195f, 0.055578f, 0.055961f, 0.056344f, 0.056727f, 0.057110f, 0.057493f, 0.057875f,
+ 0.058258f, 0.058641f, 0.059024f, 0.059407f, 0.059790f, 0.060172f, 0.060555f, 0.060938f,
+ 0.061321f, 0.061704f, 0.062086f, 0.062469f, 0.062852f, 0.063234f, 0.063617f, 0.064000f,
+ 0.064383f, 0.064765f, 0.065148f, 0.065531f, 0.065913f, 0.066296f, 0.066679f, 0.067061f,
+ 0.067444f, 0.067827f, 0.068209f, 0.068592f, 0.068974f, 0.069357f, 0.069739f, 0.070122f,
+ 0.070505f, 0.070887f, 0.071270f, 0.071652f, 0.072035f, 0.072417f, 0.072800f, 0.073182f,
+ 0.073565f, 0.073947f, 0.074329f, 0.074712f, 0.075094f, 0.075477f, 0.075859f, 0.076241f,
+ 0.076624f, 0.077006f, 0.077389f, 0.077771f, 0.078153f, 0.078536f, 0.078918f, 0.079300f,
+ 0.079682f, 0.080065f, 0.080447f, 0.080829f, 0.081211f, 0.081594f, 0.081976f, 0.082358f,
+ 0.082740f, 0.083122f, 0.083505f, 0.083887f, 0.084269f, 0.084651f, 0.085033f, 0.085415f,
+ 0.085797f, 0.086179f, 0.086561f, 0.086943f, 0.087326f, 0.087708f, 0.088090f, 0.088472f,
+ 0.088854f, 0.089236f, 0.089617f, 0.089999f, 0.090381f, 0.090763f, 0.091145f, 0.091527f,
+ 0.091909f, 0.092291f, 0.092673f, 0.093055f, 0.093436f, 0.093818f, 0.094200f, 0.094582f,
+ 0.094963f, 0.095345f, 0.095727f, 0.096109f, 0.096490f, 0.096872f, 0.097254f, 0.097635f,
+ 0.098017f, 0.098399f, 0.098780f, 0.099162f, 0.099544f, 0.099925f, 0.100307f, 0.100688f,
+ 0.101070f, 0.101451f, 0.101833f, 0.102214f, 0.102596f, 0.102977f, 0.103359f, 0.103740f,
+ 0.104122f, 0.104503f, 0.104884f, 0.105266f, 0.105647f, 0.106028f, 0.106410f, 0.106791f,
+ 0.107172f, 0.107554f, 0.107935f, 0.108316f, 0.108697f, 0.109079f, 0.109460f, 0.109841f,
+ 0.110222f, 0.110603f, 0.110984f, 0.111366f, 0.111747f, 0.112128f, 0.112509f, 0.112890f,
+ 0.113271f, 0.113652f, 0.114033f, 0.114414f, 0.114795f, 0.115176f, 0.115557f, 0.115938f,
+ 0.116319f, 0.116700f, 0.117080f, 0.117461f, 0.117842f, 0.118223f, 0.118604f, 0.118984f,
+ 0.119365f, 0.119746f, 0.120127f, 0.120507f, 0.120888f, 0.121269f, 0.121649f, 0.122030f,
+ 0.122411f, 0.122791f, 0.123172f, 0.123552f, 0.123933f, 0.124314f, 0.124694f, 0.125075f,
+ 0.125455f, 0.125835f, 0.126216f, 0.126596f, 0.126977f, 0.127357f, 0.127737f, 0.128118f,
+ 0.128498f, 0.128878f, 0.129259f, 0.129639f, 0.130019f, 0.130399f, 0.130780f, 0.131160f,
+ 0.131540f, 0.131920f, 0.132300f, 0.132680f, 0.133061f, 0.133441f, 0.133821f, 0.134201f,
+ 0.134581f, 0.134961f, 0.135341f, 0.135721f, 0.136101f, 0.136480f, 0.136860f, 0.137240f,
+ 0.137620f, 0.138000f, 0.138380f, 0.138760f, 0.139139f, 0.139519f, 0.139899f, 0.140279f,
+ 0.140658f, 0.141038f, 0.141418f, 0.141797f, 0.142177f, 0.142556f, 0.142936f, 0.143316f,
+ 0.143695f, 0.144075f, 0.144454f, 0.144833f, 0.145213f, 0.145592f, 0.145972f, 0.146351f,
+ 0.146730f, 0.147110f, 0.147489f, 0.147868f, 0.148248f, 0.148627f, 0.149006f, 0.149385f,
+ 0.149765f, 0.150144f, 0.150523f, 0.150902f, 0.151281f, 0.151660f, 0.152039f, 0.152418f,
+ 0.152797f, 0.153176f, 0.153555f, 0.153934f, 0.154313f, 0.154692f, 0.155071f, 0.155450f,
+ 0.155828f, 0.156207f, 0.156586f, 0.156965f, 0.157343f, 0.157722f, 0.158101f, 0.158480f,
+ 0.158858f, 0.159237f, 0.159615f, 0.159994f, 0.160372f, 0.160751f, 0.161129f, 0.161508f,
+ 0.161886f, 0.162265f, 0.162643f, 0.163022f, 0.163400f, 0.163778f, 0.164157f, 0.164535f,
+ 0.164913f, 0.165291f, 0.165670f, 0.166048f, 0.166426f, 0.166804f, 0.167182f, 0.167560f,
+ 0.167938f, 0.168316f, 0.168694f, 0.169072f, 0.169450f, 0.169828f, 0.170206f, 0.170584f,
+ 0.170962f, 0.171340f, 0.171718f, 0.172095f, 0.172473f, 0.172851f, 0.173229f, 0.173606f,
+ 0.173984f, 0.174362f, 0.174739f, 0.175117f, 0.175494f, 0.175872f, 0.176249f, 0.176627f,
+ 0.177004f, 0.177382f, 0.177759f, 0.178136f, 0.178514f, 0.178891f, 0.179268f, 0.179646f,
+ 0.180023f, 0.180400f, 0.180777f, 0.181154f, 0.181532f, 0.181909f, 0.182286f, 0.182663f,
+ 0.183040f, 0.183417f, 0.183794f, 0.184171f, 0.184548f, 0.184925f, 0.185301f, 0.185678f,
+ 0.186055f, 0.186432f, 0.186809f, 0.187185f, 0.187562f, 0.187939f, 0.188315f, 0.188692f,
+ 0.189069f, 0.189445f, 0.189822f, 0.190198f, 0.190575f, 0.190951f, 0.191328f, 0.191704f,
+ 0.192080f, 0.192457f, 0.192833f, 0.193209f, 0.193586f, 0.193962f, 0.194338f, 0.194714f,
+ 0.195090f, 0.195466f, 0.195843f, 0.196219f, 0.196595f, 0.196971f, 0.197347f, 0.197722f,
+ 0.198098f, 0.198474f, 0.198850f, 0.199226f, 0.199602f, 0.199978f, 0.200353f, 0.200729f,
+ 0.201105f, 0.201480f, 0.201856f, 0.202231f, 0.202607f, 0.202983f, 0.203358f, 0.203734f,
+ 0.204109f, 0.204484f, 0.204860f, 0.205235f, 0.205610f, 0.205986f, 0.206361f, 0.206736f,
+ 0.207111f, 0.207487f, 0.207862f, 0.208237f, 0.208612f, 0.208987f, 0.209362f, 0.209737f,
+ 0.210112f, 0.210487f, 0.210862f, 0.211237f, 0.211611f, 0.211986f, 0.212361f, 0.212736f,
+ 0.213110f, 0.213485f, 0.213860f, 0.214234f, 0.214609f, 0.214983f, 0.215358f, 0.215732f,
+ 0.216107f, 0.216481f, 0.216856f, 0.217230f, 0.217604f, 0.217979f, 0.218353f, 0.218727f,
+ 0.219101f, 0.219475f, 0.219850f, 0.220224f, 0.220598f, 0.220972f, 0.221346f, 0.221720f,
+ 0.222094f, 0.222468f, 0.222841f, 0.223215f, 0.223589f, 0.223963f, 0.224337f, 0.224710f,
+ 0.225084f, 0.225458f, 0.225831f, 0.226205f, 0.226578f, 0.226952f, 0.227325f, 0.227699f,
+ 0.228072f, 0.228445f, 0.228819f, 0.229192f, 0.229565f, 0.229939f, 0.230312f, 0.230685f,
+ 0.231058f, 0.231431f, 0.231804f, 0.232177f, 0.232550f, 0.232923f, 0.233296f, 0.233669f,
+ 0.234042f, 0.234415f, 0.234788f, 0.235160f, 0.235533f, 0.235906f, 0.236278f, 0.236651f,
+ 0.237024f, 0.237396f, 0.237769f, 0.238141f, 0.238514f, 0.238886f, 0.239258f, 0.239631f,
+ 0.240003f, 0.240375f, 0.240748f, 0.241120f, 0.241492f, 0.241864f, 0.242236f, 0.242608f,
+ 0.242980f, 0.243352f, 0.243724f, 0.244096f, 0.244468f, 0.244840f, 0.245212f, 0.245583f,
+ 0.245955f, 0.246327f, 0.246698f, 0.247070f, 0.247442f, 0.247813f, 0.248185f, 0.248556f,
+ 0.248928f, 0.249299f, 0.249670f, 0.250042f, 0.250413f, 0.250784f, 0.251155f, 0.251527f,
+ 0.251898f, 0.252269f, 0.252640f, 0.253011f, 0.253382f, 0.253753f, 0.254124f, 0.254495f,
+ 0.254866f, 0.255236f, 0.255607f, 0.255978f, 0.256349f, 0.256719f, 0.257090f, 0.257461f,
+ 0.257831f, 0.258202f, 0.258572f, 0.258943f, 0.259313f, 0.259683f, 0.260054f, 0.260424f,
+ 0.260794f, 0.261164f, 0.261534f, 0.261905f, 0.262275f, 0.262645f, 0.263015f, 0.263385f,
+ 0.263755f, 0.264125f, 0.264494f, 0.264864f, 0.265234f, 0.265604f, 0.265973f, 0.266343f,
+ 0.266713f, 0.267082f, 0.267452f, 0.267821f, 0.268191f, 0.268560f, 0.268930f, 0.269299f,
+ 0.269668f, 0.270038f, 0.270407f, 0.270776f, 0.271145f, 0.271514f, 0.271883f, 0.272252f,
+ 0.272621f, 0.272990f, 0.273359f, 0.273728f, 0.274097f, 0.274466f, 0.274834f, 0.275203f,
+ 0.275572f, 0.275940f, 0.276309f, 0.276678f, 0.277046f, 0.277415f, 0.277783f, 0.278151f,
+ 0.278520f, 0.278888f, 0.279256f, 0.279624f, 0.279993f, 0.280361f, 0.280729f, 0.281097f,
+ 0.281465f, 0.281833f, 0.282201f, 0.282569f, 0.282937f, 0.283304f, 0.283672f, 0.284040f,
+ 0.284408f, 0.284775f, 0.285143f, 0.285510f, 0.285878f, 0.286245f, 0.286613f, 0.286980f,
+ 0.287347f, 0.287715f, 0.288082f, 0.288449f, 0.288816f, 0.289184f, 0.289551f, 0.289918f,
+ 0.290285f, 0.290652f, 0.291019f, 0.291385f, 0.291752f, 0.292119f, 0.292486f, 0.292852f,
+ 0.293219f, 0.293586f, 0.293952f, 0.294319f, 0.294685f, 0.295052f, 0.295418f, 0.295785f,
+ 0.296151f, 0.296517f, 0.296883f, 0.297250f, 0.297616f, 0.297982f, 0.298348f, 0.298714f,
+ 0.299080f, 0.299446f, 0.299812f, 0.300177f, 0.300543f, 0.300909f, 0.301275f, 0.301640f,
+ 0.302006f, 0.302372f, 0.302737f, 0.303103f, 0.303468f, 0.303833f, 0.304199f, 0.304564f,
+ 0.304929f, 0.305294f, 0.305660f, 0.306025f, 0.306390f, 0.306755f, 0.307120f, 0.307485f,
+ 0.307850f, 0.308214f, 0.308579f, 0.308944f, 0.309309f, 0.309673f, 0.310038f, 0.310403f,
+ 0.310767f, 0.311132f, 0.311496f, 0.311860f, 0.312225f, 0.312589f, 0.312953f, 0.313318f,
+ 0.313682f, 0.314046f, 0.314410f, 0.314774f, 0.315138f, 0.315502f, 0.315866f, 0.316230f,
+ 0.316593f, 0.316957f, 0.317321f, 0.317684f, 0.318048f, 0.318412f, 0.318775f, 0.319139f,
+ 0.319502f, 0.319865f, 0.320229f, 0.320592f, 0.320955f, 0.321318f, 0.321682f, 0.322045f,
+ 0.322408f, 0.322771f, 0.323134f, 0.323497f, 0.323859f, 0.324222f, 0.324585f, 0.324948f,
+ 0.325310f, 0.325673f, 0.326035f, 0.326398f, 0.326760f, 0.327123f, 0.327485f, 0.327848f,
+ 0.328210f, 0.328572f, 0.328934f, 0.329296f, 0.329658f, 0.330020f, 0.330382f, 0.330744f,
+ 0.331106f, 0.331468f, 0.331830f, 0.332192f, 0.332553f, 0.332915f, 0.333277f, 0.333638f,
+ 0.334000f, 0.334361f, 0.334722f, 0.335084f, 0.335445f, 0.335806f, 0.336168f, 0.336529f,
+ 0.336890f, 0.337251f, 0.337612f, 0.337973f, 0.338334f, 0.338695f, 0.339055f, 0.339416f,
+ 0.339777f, 0.340138f, 0.340498f, 0.340859f, 0.341219f, 0.341580f, 0.341940f, 0.342300f,
+ 0.342661f, 0.343021f, 0.343381f, 0.343741f, 0.344101f, 0.344461f, 0.344821f, 0.345181f,
+ 0.345541f, 0.345901f, 0.346261f, 0.346621f, 0.346980f, 0.347340f, 0.347700f, 0.348059f,
+ 0.348419f, 0.348778f, 0.349138f, 0.349497f, 0.349856f, 0.350215f, 0.350575f, 0.350934f,
+ 0.351293f, 0.351652f, 0.352011f, 0.352370f, 0.352729f, 0.353087f, 0.353446f, 0.353805f,
+ 0.354164f, 0.354522f, 0.354881f, 0.355239f, 0.355598f, 0.355956f, 0.356314f, 0.356673f,
+ 0.357031f, 0.357389f, 0.357747f, 0.358105f, 0.358463f, 0.358821f, 0.359179f, 0.359537f,
+ 0.359895f, 0.360253f, 0.360611f, 0.360968f, 0.361326f, 0.361683f, 0.362041f, 0.362398f,
+ 0.362756f, 0.363113f, 0.363470f, 0.363828f, 0.364185f, 0.364542f, 0.364899f, 0.365256f,
+ 0.365613f, 0.365970f, 0.366327f, 0.366684f, 0.367040f, 0.367397f, 0.367754f, 0.368110f,
+ 0.368467f, 0.368823f, 0.369180f, 0.369536f, 0.369892f, 0.370249f, 0.370605f, 0.370961f,
+ 0.371317f, 0.371673f, 0.372029f, 0.372385f, 0.372741f, 0.373097f, 0.373453f, 0.373808f,
+ 0.374164f, 0.374520f, 0.374875f, 0.375231f, 0.375586f, 0.375942f, 0.376297f, 0.376652f,
+ 0.377007f, 0.377363f, 0.377718f, 0.378073f, 0.378428f, 0.378783f, 0.379138f, 0.379492f,
+ 0.379847f, 0.380202f, 0.380557f, 0.380911f, 0.381266f, 0.381620f, 0.381975f, 0.382329f,
+ 0.382683f, 0.383038f, 0.383392f, 0.383746f, 0.384100f, 0.384454f, 0.384808f, 0.385162f,
+ 0.385516f, 0.385870f, 0.386224f, 0.386577f, 0.386931f, 0.387285f, 0.387638f, 0.387992f,
+ 0.388345f, 0.388698f, 0.389052f, 0.389405f, 0.389758f, 0.390111f, 0.390464f, 0.390817f,
+ 0.391170f, 0.391523f, 0.391876f, 0.392229f, 0.392582f, 0.392934f, 0.393287f, 0.393640f,
+ 0.393992f, 0.394344f, 0.394697f, 0.395049f, 0.395401f, 0.395754f, 0.396106f, 0.396458f,
+ 0.396810f, 0.397162f, 0.397514f, 0.397866f, 0.398218f, 0.398569f, 0.398921f, 0.399273f,
+ 0.399624f, 0.399976f, 0.400327f, 0.400679f, 0.401030f, 0.401381f, 0.401732f, 0.402084f,
+ 0.402435f, 0.402786f, 0.403137f, 0.403488f, 0.403838f, 0.404189f, 0.404540f, 0.404891f,
+ 0.405241f, 0.405592f, 0.405942f, 0.406293f, 0.406643f, 0.406994f, 0.407344f, 0.407694f,
+ 0.408044f, 0.408394f, 0.408744f, 0.409094f, 0.409444f, 0.409794f, 0.410144f, 0.410493f,
+ 0.410843f, 0.411193f, 0.411542f, 0.411892f, 0.412241f, 0.412591f, 0.412940f, 0.413289f,
+ 0.413638f, 0.413987f, 0.414337f, 0.414685f, 0.415034f, 0.415383f, 0.415732f, 0.416081f,
+ 0.416430f, 0.416778f, 0.417127f, 0.417475f, 0.417824f, 0.418172f, 0.418520f, 0.418869f,
+ 0.419217f, 0.419565f, 0.419913f, 0.420261f, 0.420609f, 0.420957f, 0.421305f, 0.421653f,
+ 0.422000f, 0.422348f, 0.422695f, 0.423043f, 0.423390f, 0.423738f, 0.424085f, 0.424432f,
+ 0.424780f, 0.425127f, 0.425474f, 0.425821f, 0.426168f, 0.426515f, 0.426862f, 0.427208f,
+ 0.427555f, 0.427902f, 0.428248f, 0.428595f, 0.428941f, 0.429288f, 0.429634f, 0.429980f,
+ 0.430326f, 0.430673f, 0.431019f, 0.431365f, 0.431711f, 0.432057f, 0.432402f, 0.432748f,
+ 0.433094f, 0.433439f, 0.433785f, 0.434131f, 0.434476f, 0.434821f, 0.435167f, 0.435512f,
+ 0.435857f, 0.436202f, 0.436547f, 0.436892f, 0.437237f, 0.437582f, 0.437927f, 0.438272f,
+ 0.438616f, 0.438961f, 0.439305f, 0.439650f, 0.439994f, 0.440339f, 0.440683f, 0.441027f,
+ 0.441371f, 0.441715f, 0.442059f, 0.442403f, 0.442747f, 0.443091f, 0.443435f, 0.443779f,
+ 0.444122f, 0.444466f, 0.444809f, 0.445153f, 0.445496f, 0.445839f, 0.446183f, 0.446526f,
+ 0.446869f, 0.447212f, 0.447555f, 0.447898f, 0.448241f, 0.448583f, 0.448926f, 0.449269f,
+ 0.449611f, 0.449954f, 0.450296f, 0.450639f, 0.450981f, 0.451323f, 0.451665f, 0.452008f,
+ 0.452350f, 0.452692f, 0.453033f, 0.453375f, 0.453717f, 0.454059f, 0.454400f, 0.454742f,
+ 0.455084f, 0.455425f, 0.455766f, 0.456108f, 0.456449f, 0.456790f, 0.457131f, 0.457472f,
+ 0.457813f, 0.458154f, 0.458495f, 0.458836f, 0.459177f, 0.459517f, 0.459858f, 0.460198f,
+ 0.460539f, 0.460879f, 0.461219f, 0.461560f, 0.461900f, 0.462240f, 0.462580f, 0.462920f,
+ 0.463260f, 0.463600f, 0.463939f, 0.464279f, 0.464619f, 0.464958f, 0.465298f, 0.465637f,
+ 0.465977f, 0.466316f, 0.466655f, 0.466994f, 0.467333f, 0.467672f, 0.468011f, 0.468350f,
+ 0.468689f, 0.469028f, 0.469366f, 0.469705f, 0.470043f, 0.470382f, 0.470720f, 0.471058f,
+ 0.471397f, 0.471735f, 0.472073f, 0.472411f, 0.472749f, 0.473087f, 0.473425f, 0.473763f,
+ 0.474100f, 0.474438f, 0.474775f, 0.475113f, 0.475450f, 0.475788f, 0.476125f, 0.476462f,
+ 0.476799f, 0.477136f, 0.477473f, 0.477810f, 0.478147f, 0.478484f, 0.478821f, 0.479157f,
+ 0.479494f, 0.479830f, 0.480167f, 0.480503f, 0.480839f, 0.481176f, 0.481512f, 0.481848f,
+ 0.482184f, 0.482520f, 0.482856f, 0.483191f, 0.483527f, 0.483863f, 0.484198f, 0.484534f,
+ 0.484869f, 0.485205f, 0.485540f, 0.485875f, 0.486210f, 0.486545f, 0.486880f, 0.487215f,
+ 0.487550f, 0.487885f, 0.488220f, 0.488554f, 0.488889f, 0.489223f, 0.489558f, 0.489892f,
+ 0.490226f, 0.490561f, 0.490895f, 0.491229f, 0.491563f, 0.491897f, 0.492231f, 0.492564f,
+ 0.492898f, 0.493232f, 0.493565f, 0.493899f, 0.494232f, 0.494566f, 0.494899f, 0.495232f,
+ 0.495565f, 0.495898f, 0.496231f, 0.496564f, 0.496897f, 0.497230f, 0.497562f, 0.497895f,
+ 0.498228f, 0.498560f, 0.498893f, 0.499225f, 0.499557f, 0.499889f, 0.500221f, 0.500553f,
+ 0.500885f, 0.501217f, 0.501549f, 0.501881f, 0.502212f, 0.502544f, 0.502876f, 0.503207f,
+ 0.503538f, 0.503870f, 0.504201f, 0.504532f, 0.504863f, 0.505194f, 0.505525f, 0.505856f,
+ 0.506187f, 0.506517f, 0.506848f, 0.507179f, 0.507509f, 0.507839f, 0.508170f, 0.508500f,
+ 0.508830f, 0.509160f, 0.509490f, 0.509820f, 0.510150f, 0.510480f, 0.510810f, 0.511139f,
+ 0.511469f, 0.511798f, 0.512128f, 0.512457f, 0.512786f, 0.513116f, 0.513445f, 0.513774f,
+ 0.514103f, 0.514432f, 0.514760f, 0.515089f, 0.515418f, 0.515746f, 0.516075f, 0.516403f,
+ 0.516732f, 0.517060f, 0.517388f, 0.517716f, 0.518045f, 0.518372f, 0.518700f, 0.519028f,
+ 0.519356f, 0.519684f, 0.520011f, 0.520339f, 0.520666f, 0.520994f, 0.521321f, 0.521648f,
+ 0.521975f, 0.522302f, 0.522629f, 0.522956f, 0.523283f, 0.523610f, 0.523937f, 0.524263f,
+ 0.524590f, 0.524916f, 0.525243f, 0.525569f, 0.525895f, 0.526221f, 0.526547f, 0.526873f,
+ 0.527199f, 0.527525f, 0.527851f, 0.528176f, 0.528502f, 0.528828f, 0.529153f, 0.529478f,
+ 0.529804f, 0.530129f, 0.530454f, 0.530779f, 0.531104f, 0.531429f, 0.531754f, 0.532078f,
+ 0.532403f, 0.532728f, 0.533052f, 0.533377f, 0.533701f, 0.534025f, 0.534349f, 0.534674f,
+ 0.534998f, 0.535322f, 0.535645f, 0.535969f, 0.536293f, 0.536617f, 0.536940f, 0.537264f,
+ 0.537587f, 0.537910f, 0.538234f, 0.538557f, 0.538880f, 0.539203f, 0.539526f, 0.539849f,
+ 0.540171f, 0.540494f, 0.540817f, 0.541139f, 0.541462f, 0.541784f, 0.542106f, 0.542429f,
+ 0.542751f, 0.543073f, 0.543395f, 0.543717f, 0.544039f, 0.544360f, 0.544682f, 0.545003f,
+ 0.545325f, 0.545646f, 0.545968f, 0.546289f, 0.546610f, 0.546931f, 0.547252f, 0.547573f,
+ 0.547894f, 0.548215f, 0.548536f, 0.548856f, 0.549177f, 0.549497f, 0.549818f, 0.550138f,
+ 0.550458f, 0.550778f, 0.551098f, 0.551418f, 0.551738f, 0.552058f, 0.552378f, 0.552697f,
+ 0.553017f, 0.553336f, 0.553656f, 0.553975f, 0.554294f, 0.554613f, 0.554932f, 0.555251f,
+ 0.555570f, 0.555889f, 0.556208f, 0.556526f, 0.556845f, 0.557164f, 0.557482f, 0.557800f,
+ 0.558119f, 0.558437f, 0.558755f, 0.559073f, 0.559391f, 0.559709f, 0.560026f, 0.560344f,
+ 0.560662f, 0.560979f, 0.561297f, 0.561614f, 0.561931f, 0.562248f, 0.562565f, 0.562882f,
+ 0.563199f, 0.563516f, 0.563833f, 0.564150f, 0.564466f, 0.564783f, 0.565099f, 0.565416f,
+ 0.565732f, 0.566048f, 0.566364f, 0.566680f, 0.566996f, 0.567312f, 0.567628f, 0.567943f,
+ 0.568259f, 0.568574f, 0.568890f, 0.569205f, 0.569521f, 0.569836f, 0.570151f, 0.570466f,
+ 0.570781f, 0.571096f, 0.571410f, 0.571725f, 0.572040f, 0.572354f, 0.572669f, 0.572983f,
+ 0.573297f, 0.573611f, 0.573925f, 0.574239f, 0.574553f, 0.574867f, 0.575181f, 0.575495f,
+ 0.575808f, 0.576122f, 0.576435f, 0.576748f, 0.577062f, 0.577375f, 0.577688f, 0.578001f,
+ 0.578314f, 0.578627f, 0.578939f, 0.579252f, 0.579565f, 0.579877f, 0.580189f, 0.580502f,
+ 0.580814f, 0.581126f, 0.581438f, 0.581750f, 0.582062f, 0.582374f, 0.582685f, 0.582997f,
+ 0.583309f, 0.583620f, 0.583931f, 0.584243f, 0.584554f, 0.584865f, 0.585176f, 0.585487f,
+ 0.585798f, 0.586109f, 0.586419f, 0.586730f, 0.587040f, 0.587351f, 0.587661f, 0.587971f,
+ 0.588282f, 0.588592f, 0.588902f, 0.589212f, 0.589521f, 0.589831f, 0.590141f, 0.590450f,
+ 0.590760f, 0.591069f, 0.591378f, 0.591688f, 0.591997f, 0.592306f, 0.592615f, 0.592924f,
+ 0.593232f, 0.593541f, 0.593850f, 0.594158f, 0.594467f, 0.594775f, 0.595083f, 0.595391f,
+ 0.595699f, 0.596007f, 0.596315f, 0.596623f, 0.596931f, 0.597238f, 0.597546f, 0.597853f,
+ 0.598161f, 0.598468f, 0.598775f, 0.599082f, 0.599389f, 0.599696f, 0.600003f, 0.600310f,
+ 0.600616f, 0.600923f, 0.601230f, 0.601536f, 0.601842f, 0.602148f, 0.602455f, 0.602761f,
+ 0.603067f, 0.603372f, 0.603678f, 0.603984f, 0.604290f, 0.604595f, 0.604900f, 0.605206f,
+ 0.605511f, 0.605816f, 0.606121f, 0.606426f, 0.606731f, 0.607036f, 0.607341f, 0.607645f,
+ 0.607950f, 0.608254f, 0.608559f, 0.608863f, 0.609167f, 0.609471f, 0.609775f, 0.610079f,
+ 0.610383f, 0.610687f, 0.610990f, 0.611294f, 0.611597f, 0.611901f, 0.612204f, 0.612507f,
+ 0.612810f, 0.613113f, 0.613416f, 0.613719f, 0.614022f, 0.614324f, 0.614627f, 0.614929f,
+ 0.615232f, 0.615534f, 0.615836f, 0.616138f, 0.616440f, 0.616742f, 0.617044f, 0.617346f,
+ 0.617647f, 0.617949f, 0.618250f, 0.618552f, 0.618853f, 0.619154f, 0.619455f, 0.619756f,
+ 0.620057f, 0.620358f, 0.620659f, 0.620959f, 0.621260f, 0.621560f, 0.621861f, 0.622161f,
+ 0.622461f, 0.622761f, 0.623061f, 0.623361f, 0.623661f, 0.623961f, 0.624260f, 0.624560f,
+ 0.624860f, 0.625159f, 0.625458f, 0.625757f, 0.626056f, 0.626355f, 0.626654f, 0.626953f,
+ 0.627252f, 0.627550f, 0.627849f, 0.628147f, 0.628446f, 0.628744f, 0.629042f, 0.629340f,
+ 0.629638f, 0.629936f, 0.630234f, 0.630532f, 0.630829f, 0.631127f, 0.631424f, 0.631721f,
+ 0.632019f, 0.632316f, 0.632613f, 0.632910f, 0.633207f, 0.633504f, 0.633800f, 0.634097f,
+ 0.634393f, 0.634690f, 0.634986f, 0.635282f, 0.635578f, 0.635874f, 0.636170f, 0.636466f,
+ 0.636762f, 0.637057f, 0.637353f, 0.637649f, 0.637944f, 0.638239f, 0.638534f, 0.638829f,
+ 0.639124f, 0.639419f, 0.639714f, 0.640009f, 0.640303f, 0.640598f, 0.640892f, 0.641187f,
+ 0.641481f, 0.641775f, 0.642069f, 0.642363f, 0.642657f, 0.642951f, 0.643245f, 0.643538f,
+ 0.643832f, 0.644125f, 0.644418f, 0.644711f, 0.645005f, 0.645298f, 0.645590f, 0.645883f,
+ 0.646176f, 0.646469f, 0.646761f, 0.647054f, 0.647346f, 0.647638f, 0.647930f, 0.648222f,
+ 0.648514f, 0.648806f, 0.649098f, 0.649390f, 0.649681f, 0.649973f, 0.650264f, 0.650555f,
+ 0.650847f, 0.651138f, 0.651429f, 0.651720f, 0.652011f, 0.652301f, 0.652592f, 0.652882f,
+ 0.653173f, 0.653463f, 0.653753f, 0.654044f, 0.654334f, 0.654624f, 0.654913f, 0.655203f,
+ 0.655493f, 0.655782f, 0.656072f, 0.656361f, 0.656651f, 0.656940f, 0.657229f, 0.657518f,
+ 0.657807f, 0.658095f, 0.658384f, 0.658673f, 0.658961f, 0.659250f, 0.659538f, 0.659826f,
+ 0.660114f, 0.660402f, 0.660690f, 0.660978f, 0.661266f, 0.661553f, 0.661841f, 0.662128f,
+ 0.662416f, 0.662703f, 0.662990f, 0.663277f, 0.663564f, 0.663851f, 0.664138f, 0.664424f,
+ 0.664711f, 0.664997f, 0.665284f, 0.665570f, 0.665856f, 0.666142f, 0.666428f, 0.666714f,
+ 0.667000f, 0.667286f, 0.667571f, 0.667857f, 0.668142f, 0.668427f, 0.668712f, 0.668998f,
+ 0.669283f, 0.669567f, 0.669852f, 0.670137f, 0.670422f, 0.670706f, 0.670990f, 0.671275f,
+ 0.671559f, 0.671843f, 0.672127f, 0.672411f, 0.672695f, 0.672978f, 0.673262f, 0.673546f,
+ 0.673829f, 0.674112f, 0.674396f, 0.674679f, 0.674962f, 0.675245f, 0.675527f, 0.675810f,
+ 0.676093f, 0.676375f, 0.676658f, 0.676940f, 0.677222f, 0.677504f, 0.677786f, 0.678068f,
+ 0.678350f, 0.678632f, 0.678913f, 0.679195f, 0.679476f, 0.679758f, 0.680039f, 0.680320f,
+ 0.680601f, 0.680882f, 0.681163f, 0.681443f, 0.681724f, 0.682005f, 0.682285f, 0.682565f,
+ 0.682846f, 0.683126f, 0.683406f, 0.683686f, 0.683965f, 0.684245f, 0.684525f, 0.684804f,
+ 0.685084f, 0.685363f, 0.685642f, 0.685921f, 0.686200f, 0.686479f, 0.686758f, 0.687037f,
+ 0.687315f, 0.687594f, 0.687872f, 0.688151f, 0.688429f, 0.688707f, 0.688985f, 0.689263f,
+ 0.689541f, 0.689818f, 0.690096f, 0.690373f, 0.690651f, 0.690928f, 0.691205f, 0.691482f,
+ 0.691759f, 0.692036f, 0.692313f, 0.692590f, 0.692866f, 0.693143f, 0.693419f, 0.693695f,
+ 0.693971f, 0.694248f, 0.694524f, 0.694799f, 0.695075f, 0.695351f, 0.695626f, 0.695902f,
+ 0.696177f, 0.696452f, 0.696728f, 0.697003f, 0.697277f, 0.697552f, 0.697827f, 0.698102f,
+ 0.698376f, 0.698651f, 0.698925f, 0.699199f, 0.699473f, 0.699747f, 0.700021f, 0.700295f,
+ 0.700569f, 0.700842f, 0.701116f, 0.701389f, 0.701663f, 0.701936f, 0.702209f, 0.702482f,
+ 0.702755f, 0.703028f, 0.703300f, 0.703573f, 0.703845f, 0.704118f, 0.704390f, 0.704662f,
+ 0.704934f, 0.705206f, 0.705478f, 0.705750f, 0.706021f, 0.706293f, 0.706564f, 0.706836f,
+ 0.707107f, 0.707378f, 0.707649f, 0.707920f, 0.708191f, 0.708461f, 0.708732f, 0.709002f,
+ 0.709273f, 0.709543f, 0.709813f, 0.710083f, 0.710353f, 0.710623f, 0.710893f, 0.711163f,
+ 0.711432f, 0.711702f, 0.711971f, 0.712240f, 0.712509f, 0.712778f, 0.713047f, 0.713316f,
+ 0.713585f, 0.713853f, 0.714122f, 0.714390f, 0.714659f, 0.714927f, 0.715195f, 0.715463f,
+ 0.715731f, 0.715999f, 0.716266f, 0.716534f, 0.716801f, 0.717069f, 0.717336f, 0.717603f,
+ 0.717870f, 0.718137f, 0.718404f, 0.718670f, 0.718937f, 0.719204f, 0.719470f, 0.719736f,
+ 0.720003f, 0.720269f, 0.720535f, 0.720800f, 0.721066f, 0.721332f, 0.721597f, 0.721863f,
+ 0.722128f, 0.722393f, 0.722659f, 0.722924f, 0.723188f, 0.723453f, 0.723718f, 0.723983f,
+ 0.724247f, 0.724511f, 0.724776f, 0.725040f, 0.725304f, 0.725568f, 0.725832f, 0.726095f,
+ 0.726359f, 0.726623f, 0.726886f, 0.727149f, 0.727413f, 0.727676f, 0.727939f, 0.728202f,
+ 0.728464f, 0.728727f, 0.728990f, 0.729252f, 0.729514f, 0.729777f, 0.730039f, 0.730301f,
+ 0.730563f, 0.730825f, 0.731086f, 0.731348f, 0.731609f, 0.731871f, 0.732132f, 0.732393f,
+ 0.732654f, 0.732915f, 0.733176f, 0.733437f, 0.733697f, 0.733958f, 0.734218f, 0.734479f,
+ 0.734739f, 0.734999f, 0.735259f, 0.735519f, 0.735779f, 0.736038f, 0.736298f, 0.736557f,
+ 0.736817f, 0.737076f, 0.737335f, 0.737594f, 0.737853f, 0.738112f, 0.738370f, 0.738629f,
+ 0.738887f, 0.739146f, 0.739404f, 0.739662f, 0.739920f, 0.740178f, 0.740436f, 0.740694f,
+ 0.740951f, 0.741209f, 0.741466f, 0.741723f, 0.741980f, 0.742237f, 0.742494f, 0.742751f,
+ 0.743008f, 0.743265f, 0.743521f, 0.743777f, 0.744034f, 0.744290f, 0.744546f, 0.744802f,
+ 0.745058f, 0.745314f, 0.745569f, 0.745825f, 0.746080f, 0.746335f, 0.746591f, 0.746846f,
+ 0.747101f, 0.747355f, 0.747610f, 0.747865f, 0.748119f, 0.748374f, 0.748628f, 0.748882f,
+ 0.749136f, 0.749390f, 0.749644f, 0.749898f, 0.750152f, 0.750405f, 0.750659f, 0.750912f,
+ 0.751165f, 0.751418f, 0.751671f, 0.751924f, 0.752177f, 0.752429f, 0.752682f, 0.752934f,
+ 0.753187f, 0.753439f, 0.753691f, 0.753943f, 0.754195f, 0.754447f, 0.754698f, 0.754950f,
+ 0.755201f, 0.755453f, 0.755704f, 0.755955f, 0.756206f, 0.756457f, 0.756708f, 0.756958f,
+ 0.757209f, 0.757459f, 0.757710f, 0.757960f, 0.758210f, 0.758460f, 0.758710f, 0.758960f,
+ 0.759209f, 0.759459f, 0.759708f, 0.759957f, 0.760207f, 0.760456f, 0.760705f, 0.760954f,
+ 0.761202f, 0.761451f, 0.761700f, 0.761948f, 0.762196f, 0.762444f, 0.762693f, 0.762941f,
+ 0.763188f, 0.763436f, 0.763684f, 0.763931f, 0.764179f, 0.764426f, 0.764673f, 0.764920f,
+ 0.765167f, 0.765414f, 0.765661f, 0.765907f, 0.766154f, 0.766400f, 0.766647f, 0.766893f,
+ 0.767139f, 0.767385f, 0.767631f, 0.767876f, 0.768122f, 0.768368f, 0.768613f, 0.768858f,
+ 0.769103f, 0.769348f, 0.769593f, 0.769838f, 0.770083f, 0.770327f, 0.770572f, 0.770816f,
+ 0.771061f, 0.771305f, 0.771549f, 0.771793f, 0.772036f, 0.772280f, 0.772524f, 0.772767f,
+ 0.773010f, 0.773254f, 0.773497f, 0.773740f, 0.773983f, 0.774225f, 0.774468f, 0.774711f,
+ 0.774953f, 0.775195f, 0.775438f, 0.775680f, 0.775922f, 0.776164f, 0.776405f, 0.776647f,
+ 0.776888f, 0.777130f, 0.777371f, 0.777612f, 0.777853f, 0.778094f, 0.778335f, 0.778576f,
+ 0.778817f, 0.779057f, 0.779297f, 0.779538f, 0.779778f, 0.780018f, 0.780258f, 0.780498f,
+ 0.780737f, 0.780977f, 0.781216f, 0.781456f, 0.781695f, 0.781934f, 0.782173f, 0.782412f,
+ 0.782651f, 0.782889f, 0.783128f, 0.783366f, 0.783605f, 0.783843f, 0.784081f, 0.784319f,
+ 0.784557f, 0.784794f, 0.785032f, 0.785269f, 0.785507f, 0.785744f, 0.785981f, 0.786218f,
+ 0.786455f, 0.786692f, 0.786929f, 0.787165f, 0.787402f, 0.787638f, 0.787874f, 0.788110f,
+ 0.788346f, 0.788582f, 0.788818f, 0.789054f, 0.789289f, 0.789525f, 0.789760f, 0.789995f,
+ 0.790230f, 0.790465f, 0.790700f, 0.790935f, 0.791169f, 0.791404f, 0.791638f, 0.791872f,
+ 0.792107f, 0.792341f, 0.792575f, 0.792808f, 0.793042f, 0.793276f, 0.793509f, 0.793742f,
+ 0.793975f, 0.794209f, 0.794442f, 0.794674f, 0.794907f, 0.795140f, 0.795372f, 0.795605f,
+ 0.795837f, 0.796069f, 0.796301f, 0.796533f, 0.796765f, 0.796996f, 0.797228f, 0.797459f,
+ 0.797691f, 0.797922f, 0.798153f, 0.798384f, 0.798615f, 0.798846f, 0.799076f, 0.799307f,
+ 0.799537f, 0.799768f, 0.799998f, 0.800228f, 0.800458f, 0.800687f, 0.800917f, 0.801147f,
+ 0.801376f, 0.801606f, 0.801835f, 0.802064f, 0.802293f, 0.802522f, 0.802750f, 0.802979f,
+ 0.803208f, 0.803436f, 0.803664f, 0.803892f, 0.804120f, 0.804348f, 0.804576f, 0.804804f,
+ 0.805031f, 0.805259f, 0.805486f, 0.805713f, 0.805940f, 0.806167f, 0.806394f, 0.806621f,
+ 0.806848f, 0.807074f, 0.807300f, 0.807527f, 0.807753f, 0.807979f, 0.808205f, 0.808430f,
+ 0.808656f, 0.808882f, 0.809107f, 0.809332f, 0.809558f, 0.809783f, 0.810008f, 0.810232f,
+ 0.810457f, 0.810682f, 0.810906f, 0.811131f, 0.811355f, 0.811579f, 0.811803f, 0.812027f,
+ 0.812251f, 0.812474f, 0.812698f, 0.812921f, 0.813144f, 0.813368f, 0.813591f, 0.813814f,
+ 0.814036f, 0.814259f, 0.814482f, 0.814704f, 0.814926f, 0.815149f, 0.815371f, 0.815593f,
+ 0.815814f, 0.816036f, 0.816258f, 0.816479f, 0.816701f, 0.816922f, 0.817143f, 0.817364f,
+ 0.817585f, 0.817806f, 0.818026f, 0.818247f, 0.818467f, 0.818687f, 0.818908f, 0.819128f,
+ 0.819348f, 0.819567f, 0.819787f, 0.820007f, 0.820226f, 0.820445f, 0.820664f, 0.820884f,
+ 0.821102f, 0.821321f, 0.821540f, 0.821759f, 0.821977f, 0.822195f, 0.822414f, 0.822632f,
+ 0.822850f, 0.823068f, 0.823285f, 0.823503f, 0.823721f, 0.823938f, 0.824155f, 0.824372f,
+ 0.824589f, 0.824806f, 0.825023f, 0.825240f, 0.825456f, 0.825673f, 0.825889f, 0.826105f,
+ 0.826321f, 0.826537f, 0.826753f, 0.826968f, 0.827184f, 0.827399f, 0.827615f, 0.827830f,
+ 0.828045f, 0.828260f, 0.828475f, 0.828690f, 0.828904f, 0.829119f, 0.829333f, 0.829547f,
+ 0.829761f, 0.829975f, 0.830189f, 0.830403f, 0.830616f, 0.830830f, 0.831043f, 0.831257f,
+ 0.831470f, 0.831683f, 0.831895f, 0.832108f, 0.832321f, 0.832533f, 0.832746f, 0.832958f,
+ 0.833170f, 0.833382f, 0.833594f, 0.833806f, 0.834018f, 0.834229f, 0.834440f, 0.834652f,
+ 0.834863f, 0.835074f, 0.835285f, 0.835496f, 0.835706f, 0.835917f, 0.836127f, 0.836338f,
+ 0.836548f, 0.836758f, 0.836968f, 0.837178f, 0.837387f, 0.837597f, 0.837806f, 0.838015f,
+ 0.838225f, 0.838434f, 0.838643f, 0.838852f, 0.839060f, 0.839269f, 0.839477f, 0.839686f,
+ 0.839894f, 0.840102f, 0.840310f, 0.840518f, 0.840725f, 0.840933f, 0.841140f, 0.841348f,
+ 0.841555f, 0.841762f, 0.841969f, 0.842176f, 0.842383f, 0.842589f, 0.842796f, 0.843002f,
+ 0.843208f, 0.843414f, 0.843620f, 0.843826f, 0.844032f, 0.844238f, 0.844443f, 0.844648f,
+ 0.844854f, 0.845059f, 0.845264f, 0.845469f, 0.845673f, 0.845878f, 0.846082f, 0.846287f,
+ 0.846491f, 0.846695f, 0.846899f, 0.847103f, 0.847307f, 0.847510f, 0.847714f, 0.847917f,
+ 0.848120f, 0.848323f, 0.848526f, 0.848729f, 0.848932f, 0.849135f, 0.849337f, 0.849540f,
+ 0.849742f, 0.849944f, 0.850146f, 0.850348f, 0.850549f, 0.850751f, 0.850953f, 0.851154f,
+ 0.851355f, 0.851556f, 0.851757f, 0.851958f, 0.852159f, 0.852360f, 0.852560f, 0.852760f,
+ 0.852961f, 0.853161f, 0.853361f, 0.853561f, 0.853760f, 0.853960f, 0.854159f, 0.854359f,
+ 0.854558f, 0.854757f, 0.854956f, 0.855155f, 0.855354f, 0.855552f, 0.855751f, 0.855949f,
+ 0.856147f, 0.856345f, 0.856543f, 0.856741f, 0.856939f, 0.857137f, 0.857334f, 0.857531f,
+ 0.857729f, 0.857926f, 0.858123f, 0.858320f, 0.858516f, 0.858713f, 0.858909f, 0.859106f,
+ 0.859302f, 0.859498f, 0.859694f, 0.859890f, 0.860085f, 0.860281f, 0.860476f, 0.860672f,
+ 0.860867f, 0.861062f, 0.861257f, 0.861452f, 0.861646f, 0.861841f, 0.862035f, 0.862230f,
+ 0.862424f, 0.862618f, 0.862812f, 0.863006f, 0.863199f, 0.863393f, 0.863586f, 0.863780f,
+ 0.863973f, 0.864166f, 0.864359f, 0.864552f, 0.864744f, 0.864937f, 0.865129f, 0.865321f,
+ 0.865514f, 0.865706f, 0.865898f, 0.866089f, 0.866281f, 0.866472f, 0.866664f, 0.866855f,
+ 0.867046f, 0.867237f, 0.867428f, 0.867619f, 0.867809f, 0.868000f, 0.868190f, 0.868381f,
+ 0.868571f, 0.868761f, 0.868951f, 0.869140f, 0.869330f, 0.869519f, 0.869709f, 0.869898f,
+ 0.870087f, 0.870276f, 0.870465f, 0.870654f, 0.870842f, 0.871031f, 0.871219f, 0.871407f,
+ 0.871595f, 0.871783f, 0.871971f, 0.872159f, 0.872346f, 0.872534f, 0.872721f, 0.872908f,
+ 0.873095f, 0.873282f, 0.873469f, 0.873655f, 0.873842f, 0.874028f, 0.874215f, 0.874401f,
+ 0.874587f, 0.874773f, 0.874958f, 0.875144f, 0.875329f, 0.875515f, 0.875700f, 0.875885f,
+ 0.876070f, 0.876255f, 0.876440f, 0.876624f, 0.876809f, 0.876993f, 0.877177f, 0.877361f,
+ 0.877545f, 0.877729f, 0.877913f, 0.878096f, 0.878280f, 0.878463f, 0.878646f, 0.878829f,
+ 0.879012f, 0.879195f, 0.879378f, 0.879560f, 0.879743f, 0.879925f, 0.880107f, 0.880289f,
+ 0.880471f, 0.880653f, 0.880834f, 0.881016f, 0.881197f, 0.881378f, 0.881559f, 0.881740f,
+ 0.881921f, 0.882102f, 0.882283f, 0.882463f, 0.882643f, 0.882824f, 0.883004f, 0.883184f,
+ 0.883363f, 0.883543f, 0.883723f, 0.883902f, 0.884081f, 0.884260f, 0.884439f, 0.884618f,
+ 0.884797f, 0.884976f, 0.885154f, 0.885333f, 0.885511f, 0.885689f, 0.885867f, 0.886045f,
+ 0.886223f, 0.886400f, 0.886578f, 0.886755f, 0.886932f, 0.887109f, 0.887286f, 0.887463f,
+ 0.887640f, 0.887816f, 0.887993f, 0.888169f, 0.888345f, 0.888521f, 0.888697f, 0.888873f,
+ 0.889048f, 0.889224f, 0.889399f, 0.889574f, 0.889750f, 0.889925f, 0.890099f, 0.890274f,
+ 0.890449f, 0.890623f, 0.890797f, 0.890972f, 0.891146f, 0.891320f, 0.891493f, 0.891667f,
+ 0.891841f, 0.892014f, 0.892187f, 0.892361f, 0.892534f, 0.892706f, 0.892879f, 0.893052f,
+ 0.893224f, 0.893397f, 0.893569f, 0.893741f, 0.893913f, 0.894085f, 0.894256f, 0.894428f,
+ 0.894599f, 0.894771f, 0.894942f, 0.895113f, 0.895284f, 0.895455f, 0.895625f, 0.895796f,
+ 0.895966f, 0.896137f, 0.896307f, 0.896477f, 0.896646f, 0.896816f, 0.896986f, 0.897155f,
+ 0.897325f, 0.897494f, 0.897663f, 0.897832f, 0.898001f, 0.898169f, 0.898338f, 0.898506f,
+ 0.898674f, 0.898843f, 0.899011f, 0.899179f, 0.899346f, 0.899514f, 0.899681f, 0.899849f,
+ 0.900016f, 0.900183f, 0.900350f, 0.900517f, 0.900683f, 0.900850f, 0.901016f, 0.901183f,
+ 0.901349f, 0.901515f, 0.901681f, 0.901847f, 0.902012f, 0.902178f, 0.902343f, 0.902508f,
+ 0.902673f, 0.902838f, 0.903003f, 0.903168f, 0.903332f, 0.903497f, 0.903661f, 0.903825f,
+ 0.903989f, 0.904153f, 0.904317f, 0.904481f, 0.904644f, 0.904807f, 0.904971f, 0.905134f,
+ 0.905297f, 0.905460f, 0.905622f, 0.905785f, 0.905947f, 0.906110f, 0.906272f, 0.906434f,
+ 0.906596f, 0.906757f, 0.906919f, 0.907081f, 0.907242f, 0.907403f, 0.907564f, 0.907725f,
+ 0.907886f, 0.908047f, 0.908207f, 0.908368f, 0.908528f, 0.908688f, 0.908848f, 0.909008f,
+ 0.909168f, 0.909328f, 0.909487f, 0.909646f, 0.909806f, 0.909965f, 0.910124f, 0.910283f,
+ 0.910441f, 0.910600f, 0.910758f, 0.910917f, 0.911075f, 0.911233f, 0.911391f, 0.911548f,
+ 0.911706f, 0.911864f, 0.912021f, 0.912178f, 0.912335f, 0.912492f, 0.912649f, 0.912806f,
+ 0.912962f, 0.913119f, 0.913275f, 0.913431f, 0.913587f, 0.913743f, 0.913899f, 0.914054f,
+ 0.914210f, 0.914365f, 0.914520f, 0.914675f, 0.914830f, 0.914985f, 0.915140f, 0.915294f,
+ 0.915449f, 0.915603f, 0.915757f, 0.915911f, 0.916065f, 0.916219f, 0.916372f, 0.916526f,
+ 0.916679f, 0.916832f, 0.916985f, 0.917138f, 0.917291f, 0.917444f, 0.917596f, 0.917749f,
+ 0.917901f, 0.918053f, 0.918205f, 0.918357f, 0.918508f, 0.918660f, 0.918811f, 0.918963f,
+ 0.919114f, 0.919265f, 0.919416f, 0.919567f, 0.919717f, 0.919868f, 0.920018f, 0.920168f,
+ 0.920318f, 0.920468f, 0.920618f, 0.920768f, 0.920917f, 0.921067f, 0.921216f, 0.921365f,
+ 0.921514f, 0.921663f, 0.921812f, 0.921960f, 0.922109f, 0.922257f, 0.922405f, 0.922553f,
+ 0.922701f, 0.922849f, 0.922997f, 0.923144f, 0.923291f, 0.923439f, 0.923586f, 0.923733f,
+ 0.923880f, 0.924026f, 0.924173f, 0.924319f, 0.924465f, 0.924612f, 0.924758f, 0.924904f,
+ 0.925049f, 0.925195f, 0.925340f, 0.925486f, 0.925631f, 0.925776f, 0.925921f, 0.926066f,
+ 0.926210f, 0.926355f, 0.926499f, 0.926643f, 0.926787f, 0.926931f, 0.927075f, 0.927219f,
+ 0.927363f, 0.927506f, 0.927649f, 0.927792f, 0.927935f, 0.928078f, 0.928221f, 0.928364f,
+ 0.928506f, 0.928648f, 0.928791f, 0.928933f, 0.929075f, 0.929216f, 0.929358f, 0.929500f,
+ 0.929641f, 0.929782f, 0.929923f, 0.930064f, 0.930205f, 0.930346f, 0.930486f, 0.930627f,
+ 0.930767f, 0.930907f, 0.931047f, 0.931187f, 0.931327f, 0.931466f, 0.931606f, 0.931745f,
+ 0.931884f, 0.932023f, 0.932162f, 0.932301f, 0.932440f, 0.932578f, 0.932716f, 0.932855f,
+ 0.932993f, 0.933131f, 0.933269f, 0.933406f, 0.933544f, 0.933681f, 0.933818f, 0.933956f,
+ 0.934093f, 0.934229f, 0.934366f, 0.934503f, 0.934639f, 0.934775f, 0.934912f, 0.935048f,
+ 0.935184f, 0.935319f, 0.935455f, 0.935590f, 0.935726f, 0.935861f, 0.935996f, 0.936131f,
+ 0.936266f, 0.936400f, 0.936535f, 0.936669f, 0.936803f, 0.936938f, 0.937072f, 0.937205f,
+ 0.937339f, 0.937473f, 0.937606f, 0.937739f, 0.937872f, 0.938005f, 0.938138f, 0.938271f,
+ 0.938404f, 0.938536f, 0.938668f, 0.938800f, 0.938932f, 0.939064f, 0.939196f, 0.939328f,
+ 0.939459f, 0.939591f, 0.939722f, 0.939853f, 0.939984f, 0.940115f, 0.940245f, 0.940376f,
+ 0.940506f, 0.940636f, 0.940766f, 0.940896f, 0.941026f, 0.941156f, 0.941285f, 0.941415f,
+ 0.941544f, 0.941673f, 0.941802f, 0.941931f, 0.942060f, 0.942188f, 0.942317f, 0.942445f,
+ 0.942573f, 0.942701f, 0.942829f, 0.942957f, 0.943084f, 0.943212f, 0.943339f, 0.943466f,
+ 0.943593f, 0.943720f, 0.943847f, 0.943974f, 0.944100f, 0.944227f, 0.944353f, 0.944479f,
+ 0.944605f, 0.944731f, 0.944856f, 0.944982f, 0.945107f, 0.945232f, 0.945358f, 0.945482f,
+ 0.945607f, 0.945732f, 0.945857f, 0.945981f, 0.946105f, 0.946229f, 0.946353f, 0.946477f,
+ 0.946601f, 0.946724f, 0.946848f, 0.946971f, 0.947094f, 0.947217f, 0.947340f, 0.947463f,
+ 0.947586f, 0.947708f, 0.947830f, 0.947953f, 0.948075f, 0.948196f, 0.948318f, 0.948440f,
+ 0.948561f, 0.948683f, 0.948804f, 0.948925f, 0.949046f, 0.949167f, 0.949287f, 0.949408f,
+ 0.949528f, 0.949648f, 0.949768f, 0.949888f, 0.950008f, 0.950128f, 0.950247f, 0.950367f,
+ 0.950486f, 0.950605f, 0.950724f, 0.950843f, 0.950962f, 0.951080f, 0.951199f, 0.951317f,
+ 0.951435f, 0.951553f, 0.951671f, 0.951789f, 0.951906f, 0.952024f, 0.952141f, 0.952258f,
+ 0.952375f, 0.952492f, 0.952609f, 0.952725f, 0.952842f, 0.952958f, 0.953074f, 0.953190f,
+ 0.953306f, 0.953422f, 0.953537f, 0.953653f, 0.953768f, 0.953883f, 0.953998f, 0.954113f,
+ 0.954228f, 0.954343f, 0.954457f, 0.954572f, 0.954686f, 0.954800f, 0.954914f, 0.955028f,
+ 0.955141f, 0.955255f, 0.955368f, 0.955481f, 0.955594f, 0.955707f, 0.955820f, 0.955933f,
+ 0.956045f, 0.956158f, 0.956270f, 0.956382f, 0.956494f, 0.956606f, 0.956717f, 0.956829f,
+ 0.956940f, 0.957052f, 0.957163f, 0.957274f, 0.957385f, 0.957495f, 0.957606f, 0.957716f,
+ 0.957826f, 0.957937f, 0.958046f, 0.958156f, 0.958266f, 0.958376f, 0.958485f, 0.958594f,
+ 0.958703f, 0.958812f, 0.958921f, 0.959030f, 0.959139f, 0.959247f, 0.959355f, 0.959463f,
+ 0.959572f, 0.959679f, 0.959787f, 0.959895f, 0.960002f, 0.960109f, 0.960217f, 0.960324f,
+ 0.960431f, 0.960537f, 0.960644f, 0.960750f, 0.960857f, 0.960963f, 0.961069f, 0.961175f,
+ 0.961280f, 0.961386f, 0.961492f, 0.961597f, 0.961702f, 0.961807f, 0.961912f, 0.962017f,
+ 0.962121f, 0.962226f, 0.962330f, 0.962434f, 0.962538f, 0.962642f, 0.962746f, 0.962850f,
+ 0.962953f, 0.963057f, 0.963160f, 0.963263f, 0.963366f, 0.963469f, 0.963571f, 0.963674f,
+ 0.963776f, 0.963878f, 0.963980f, 0.964082f, 0.964184f, 0.964286f, 0.964387f, 0.964489f,
+ 0.964590f, 0.964691f, 0.964792f, 0.964893f, 0.964993f, 0.965094f, 0.965194f, 0.965294f,
+ 0.965394f, 0.965494f, 0.965594f, 0.965694f, 0.965793f, 0.965893f, 0.965992f, 0.966091f,
+ 0.966190f, 0.966289f, 0.966387f, 0.966486f, 0.966584f, 0.966683f, 0.966781f, 0.966879f,
+ 0.966976f, 0.967074f, 0.967172f, 0.967269f, 0.967366f, 0.967463f, 0.967560f, 0.967657f,
+ 0.967754f, 0.967850f, 0.967947f, 0.968043f, 0.968139f, 0.968235f, 0.968331f, 0.968427f,
+ 0.968522f, 0.968617f, 0.968713f, 0.968808f, 0.968903f, 0.968998f, 0.969092f, 0.969187f,
+ 0.969281f, 0.969375f, 0.969470f, 0.969564f, 0.969657f, 0.969751f, 0.969845f, 0.969938f,
+ 0.970031f, 0.970124f, 0.970217f, 0.970310f, 0.970403f, 0.970495f, 0.970588f, 0.970680f,
+ 0.970772f, 0.970864f, 0.970956f, 0.971048f, 0.971139f, 0.971231f, 0.971322f, 0.971413f,
+ 0.971504f, 0.971595f, 0.971685f, 0.971776f, 0.971866f, 0.971957f, 0.972047f, 0.972137f,
+ 0.972227f, 0.972316f, 0.972406f, 0.972495f, 0.972584f, 0.972673f, 0.972762f, 0.972851f,
+ 0.972940f, 0.973028f, 0.973117f, 0.973205f, 0.973293f, 0.973381f, 0.973469f, 0.973557f,
+ 0.973644f, 0.973732f, 0.973819f, 0.973906f, 0.973993f, 0.974080f, 0.974166f, 0.974253f,
+ 0.974339f, 0.974426f, 0.974512f, 0.974598f, 0.974684f, 0.974769f, 0.974855f, 0.974940f,
+ 0.975025f, 0.975110f, 0.975195f, 0.975280f, 0.975365f, 0.975449f, 0.975534f, 0.975618f,
+ 0.975702f, 0.975786f, 0.975870f, 0.975954f, 0.976037f, 0.976120f, 0.976204f, 0.976287f,
+ 0.976370f, 0.976453f, 0.976535f, 0.976618f, 0.976700f, 0.976782f, 0.976864f, 0.976946f,
+ 0.977028f, 0.977110f, 0.977191f, 0.977273f, 0.977354f, 0.977435f, 0.977516f, 0.977597f,
+ 0.977677f, 0.977758f, 0.977838f, 0.977918f, 0.977998f, 0.978078f, 0.978158f, 0.978238f,
+ 0.978317f, 0.978397f, 0.978476f, 0.978555f, 0.978634f, 0.978713f, 0.978791f, 0.978870f,
+ 0.978948f, 0.979026f, 0.979104f, 0.979182f, 0.979260f, 0.979338f, 0.979415f, 0.979493f,
+ 0.979570f, 0.979647f, 0.979724f, 0.979800f, 0.979877f, 0.979954f, 0.980030f, 0.980106f,
+ 0.980182f, 0.980258f, 0.980334f, 0.980409f, 0.980485f, 0.980560f, 0.980635f, 0.980710f,
+ 0.980785f, 0.980860f, 0.980935f, 0.981009f, 0.981083f, 0.981158f, 0.981232f, 0.981305f,
+ 0.981379f, 0.981453f, 0.981526f, 0.981600f, 0.981673f, 0.981746f, 0.981819f, 0.981891f,
+ 0.981964f, 0.982036f, 0.982109f, 0.982181f, 0.982253f, 0.982325f, 0.982396f, 0.982468f,
+ 0.982539f, 0.982611f, 0.982682f, 0.982753f, 0.982824f, 0.982894f, 0.982965f, 0.983035f,
+ 0.983105f, 0.983176f, 0.983246f, 0.983315f, 0.983385f, 0.983455f, 0.983524f, 0.983593f,
+ 0.983662f, 0.983731f, 0.983800f, 0.983869f, 0.983937f, 0.984006f, 0.984074f, 0.984142f,
+ 0.984210f, 0.984278f, 0.984346f, 0.984413f, 0.984480f, 0.984548f, 0.984615f, 0.984682f,
+ 0.984748f, 0.984815f, 0.984882f, 0.984948f, 0.985014f, 0.985080f, 0.985146f, 0.985212f,
+ 0.985278f, 0.985343f, 0.985408f, 0.985474f, 0.985539f, 0.985604f, 0.985668f, 0.985733f,
+ 0.985798f, 0.985862f, 0.985926f, 0.985990f, 0.986054f, 0.986118f, 0.986181f, 0.986245f,
+ 0.986308f, 0.986371f, 0.986434f, 0.986497f, 0.986560f, 0.986623f, 0.986685f, 0.986747f,
+ 0.986809f, 0.986871f, 0.986933f, 0.986995f, 0.987057f, 0.987118f, 0.987179f, 0.987240f,
+ 0.987301f, 0.987362f, 0.987423f, 0.987484f, 0.987544f, 0.987604f, 0.987664f, 0.987724f,
+ 0.987784f, 0.987844f, 0.987903f, 0.987963f, 0.988022f, 0.988081f, 0.988140f, 0.988199f,
+ 0.988258f, 0.988316f, 0.988374f, 0.988433f, 0.988491f, 0.988549f, 0.988607f, 0.988664f,
+ 0.988722f, 0.988779f, 0.988836f, 0.988893f, 0.988950f, 0.989007f, 0.989064f, 0.989120f,
+ 0.989177f, 0.989233f, 0.989289f, 0.989345f, 0.989400f, 0.989456f, 0.989511f, 0.989567f,
+ 0.989622f, 0.989677f, 0.989732f, 0.989787f, 0.989841f, 0.989896f, 0.989950f, 0.990004f,
+ 0.990058f, 0.990112f, 0.990166f, 0.990219f, 0.990273f, 0.990326f, 0.990379f, 0.990432f,
+ 0.990485f, 0.990538f, 0.990590f, 0.990643f, 0.990695f, 0.990747f, 0.990799f, 0.990851f,
+ 0.990903f, 0.990954f, 0.991006f, 0.991057f, 0.991108f, 0.991159f, 0.991210f, 0.991260f,
+ 0.991311f, 0.991361f, 0.991411f, 0.991462f, 0.991511f, 0.991561f, 0.991611f, 0.991660f,
+ 0.991710f, 0.991759f, 0.991808f, 0.991857f, 0.991906f, 0.991954f, 0.992003f, 0.992051f,
+ 0.992099f, 0.992147f, 0.992195f, 0.992243f, 0.992291f, 0.992338f, 0.992385f, 0.992433f,
+ 0.992480f, 0.992526f, 0.992573f, 0.992620f, 0.992666f, 0.992712f, 0.992759f, 0.992805f,
+ 0.992850f, 0.992896f, 0.992942f, 0.992987f, 0.993032f, 0.993077f, 0.993122f, 0.993167f,
+ 0.993212f, 0.993257f, 0.993301f, 0.993345f, 0.993389f, 0.993433f, 0.993477f, 0.993521f,
+ 0.993564f, 0.993608f, 0.993651f, 0.993694f, 0.993737f, 0.993779f, 0.993822f, 0.993865f,
+ 0.993907f, 0.993949f, 0.993991f, 0.994033f, 0.994075f, 0.994116f, 0.994158f, 0.994199f,
+ 0.994240f, 0.994281f, 0.994322f, 0.994363f, 0.994404f, 0.994444f, 0.994484f, 0.994525f,
+ 0.994565f, 0.994604f, 0.994644f, 0.994684f, 0.994723f, 0.994762f, 0.994802f, 0.994841f,
+ 0.994879f, 0.994918f, 0.994957f, 0.994995f, 0.995033f, 0.995071f, 0.995109f, 0.995147f,
+ 0.995185f, 0.995222f, 0.995260f, 0.995297f, 0.995334f, 0.995371f, 0.995408f, 0.995444f,
+ 0.995481f, 0.995517f, 0.995553f, 0.995589f, 0.995625f, 0.995661f, 0.995697f, 0.995732f,
+ 0.995767f, 0.995803f, 0.995838f, 0.995872f, 0.995907f, 0.995942f, 0.995976f, 0.996011f,
+ 0.996045f, 0.996079f, 0.996113f, 0.996146f, 0.996180f, 0.996213f, 0.996247f, 0.996280f,
+ 0.996313f, 0.996345f, 0.996378f, 0.996411f, 0.996443f, 0.996475f, 0.996507f, 0.996539f,
+ 0.996571f, 0.996603f, 0.996634f, 0.996666f, 0.996697f, 0.996728f, 0.996759f, 0.996790f,
+ 0.996820f, 0.996851f, 0.996881f, 0.996911f, 0.996941f, 0.996971f, 0.997001f, 0.997031f,
+ 0.997060f, 0.997089f, 0.997119f, 0.997148f, 0.997176f, 0.997205f, 0.997234f, 0.997262f,
+ 0.997290f, 0.997319f, 0.997347f, 0.997374f, 0.997402f, 0.997430f, 0.997457f, 0.997484f,
+ 0.997511f, 0.997538f, 0.997565f, 0.997592f, 0.997618f, 0.997645f, 0.997671f, 0.997697f,
+ 0.997723f, 0.997749f, 0.997774f, 0.997800f, 0.997825f, 0.997851f, 0.997876f, 0.997901f,
+ 0.997925f, 0.997950f, 0.997974f, 0.997999f, 0.998023f, 0.998047f, 0.998071f, 0.998094f,
+ 0.998118f, 0.998142f, 0.998165f, 0.998188f, 0.998211f, 0.998234f, 0.998257f, 0.998279f,
+ 0.998302f, 0.998324f, 0.998346f, 0.998368f, 0.998390f, 0.998411f, 0.998433f, 0.998454f,
+ 0.998476f, 0.998497f, 0.998518f, 0.998538f, 0.998559f, 0.998580f, 0.998600f, 0.998620f,
+ 0.998640f, 0.998660f, 0.998680f, 0.998700f, 0.998719f, 0.998738f, 0.998758f, 0.998777f,
+ 0.998795f, 0.998814f, 0.998833f, 0.998851f, 0.998870f, 0.998888f, 0.998906f, 0.998924f,
+ 0.998941f, 0.998959f, 0.998976f, 0.998994f, 0.999011f, 0.999028f, 0.999044f, 0.999061f,
+ 0.999078f, 0.999094f, 0.999110f, 0.999126f, 0.999142f, 0.999158f, 0.999174f, 0.999189f,
+ 0.999205f, 0.999220f, 0.999235f, 0.999250f, 0.999265f, 0.999279f, 0.999294f, 0.999308f,
+ 0.999322f, 0.999336f, 0.999350f, 0.999364f, 0.999378f, 0.999391f, 0.999404f, 0.999418f,
+ 0.999431f, 0.999443f, 0.999456f, 0.999469f, 0.999481f, 0.999493f, 0.999506f, 0.999518f,
+ 0.999529f, 0.999541f, 0.999553f, 0.999564f, 0.999575f, 0.999586f, 0.999597f, 0.999608f,
+ 0.999619f, 0.999629f, 0.999640f, 0.999650f, 0.999660f, 0.999670f, 0.999680f, 0.999689f,
+ 0.999699f, 0.999708f, 0.999717f, 0.999726f, 0.999735f, 0.999744f, 0.999753f, 0.999761f,
+ 0.999769f, 0.999778f, 0.999786f, 0.999793f, 0.999801f, 0.999809f, 0.999816f, 0.999823f,
+ 0.999831f, 0.999838f, 0.999844f, 0.999851f, 0.999858f, 0.999864f, 0.999870f, 0.999876f,
+ 0.999882f, 0.999888f, 0.999894f, 0.999899f, 0.999905f, 0.999910f, 0.999915f, 0.999920f,
+ 0.999925f, 0.999929f, 0.999934f, 0.999938f, 0.999942f, 0.999946f, 0.999950f, 0.999954f,
+ 0.999958f, 0.999961f, 0.999964f, 0.999968f, 0.999971f, 0.999973f, 0.999976f, 0.999979f,
+ 0.999981f, 0.999983f, 0.999986f, 0.999988f, 0.999989f, 0.999991f, 0.999993f, 0.999994f,
+ 0.999995f, 0.999996f, 0.999997f, 0.999998f, 0.999999f, 0.999999f, 1.000000f, 1.000000
+};
+
+static const float cosTable32768[16384] = {
+ 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999999f, 0.999999f,
+ 0.999999f, 0.999999f, 0.999998f, 0.999998f, 0.999997f, 0.999997f, 0.999996f, 0.999996f,
+ 0.999995f, 0.999995f, 0.999994f, 0.999993f, 0.999993f, 0.999992f, 0.999991f, 0.999990f,
+ 0.999989f, 0.999988f, 0.999988f, 0.999987f, 0.999986f, 0.999985f, 0.999983f, 0.999982f,
+ 0.999981f, 0.999980f, 0.999979f, 0.999977f, 0.999976f, 0.999975f, 0.999973f, 0.999972f,
+ 0.999971f, 0.999969f, 0.999968f, 0.999966f, 0.999964f, 0.999963f, 0.999961f, 0.999959f,
+ 0.999958f, 0.999956f, 0.999954f, 0.999952f, 0.999950f, 0.999948f, 0.999946f, 0.999944f,
+ 0.999942f, 0.999940f, 0.999938f, 0.999936f, 0.999934f, 0.999932f, 0.999929f, 0.999927f,
+ 0.999925f, 0.999922f, 0.999920f, 0.999917f, 0.999915f, 0.999913f, 0.999910f, 0.999907f,
+ 0.999905f, 0.999902f, 0.999899f, 0.999897f, 0.999894f, 0.999891f, 0.999888f, 0.999885f,
+ 0.999882f, 0.999879f, 0.999876f, 0.999873f, 0.999870f, 0.999867f, 0.999864f, 0.999861f,
+ 0.999858f, 0.999854f, 0.999851f, 0.999848f, 0.999844f, 0.999841f, 0.999838f, 0.999834f,
+ 0.999831f, 0.999827f, 0.999823f, 0.999820f, 0.999816f, 0.999812f, 0.999809f, 0.999805f,
+ 0.999801f, 0.999797f, 0.999793f, 0.999790f, 0.999786f, 0.999782f, 0.999778f, 0.999774f,
+ 0.999769f, 0.999765f, 0.999761f, 0.999757f, 0.999753f, 0.999748f, 0.999744f, 0.999740f,
+ 0.999735f, 0.999731f, 0.999726f, 0.999722f, 0.999717f, 0.999713f, 0.999708f, 0.999704f,
+ 0.999699f, 0.999694f, 0.999689f, 0.999685f, 0.999680f, 0.999675f, 0.999670f, 0.999665f,
+ 0.999660f, 0.999655f, 0.999650f, 0.999645f, 0.999640f, 0.999635f, 0.999629f, 0.999624f,
+ 0.999619f, 0.999614f, 0.999608f, 0.999603f, 0.999597f, 0.999592f, 0.999586f, 0.999581f,
+ 0.999575f, 0.999570f, 0.999564f, 0.999558f, 0.999553f, 0.999547f, 0.999541f, 0.999535f,
+ 0.999529f, 0.999524f, 0.999518f, 0.999512f, 0.999506f, 0.999500f, 0.999493f, 0.999487f,
+ 0.999481f, 0.999475f, 0.999469f, 0.999462f, 0.999456f, 0.999450f, 0.999443f, 0.999437f,
+ 0.999431f, 0.999424f, 0.999418f, 0.999411f, 0.999404f, 0.999398f, 0.999391f, 0.999384f,
+ 0.999378f, 0.999371f, 0.999364f, 0.999357f, 0.999350f, 0.999343f, 0.999336f, 0.999329f,
+ 0.999322f, 0.999315f, 0.999308f, 0.999301f, 0.999294f, 0.999287f, 0.999279f, 0.999272f,
+ 0.999265f, 0.999257f, 0.999250f, 0.999243f, 0.999235f, 0.999228f, 0.999220f, 0.999212f,
+ 0.999205f, 0.999197f, 0.999189f, 0.999182f, 0.999174f, 0.999166f, 0.999158f, 0.999150f,
+ 0.999142f, 0.999134f, 0.999126f, 0.999118f, 0.999110f, 0.999102f, 0.999094f, 0.999086f,
+ 0.999078f, 0.999069f, 0.999061f, 0.999053f, 0.999044f, 0.999036f, 0.999028f, 0.999019f,
+ 0.999011f, 0.999002f, 0.998994f, 0.998985f, 0.998976f, 0.998968f, 0.998959f, 0.998950f,
+ 0.998941f, 0.998932f, 0.998924f, 0.998915f, 0.998906f, 0.998897f, 0.998888f, 0.998879f,
+ 0.998870f, 0.998860f, 0.998851f, 0.998842f, 0.998833f, 0.998824f, 0.998814f, 0.998805f,
+ 0.998795f, 0.998786f, 0.998777f, 0.998767f, 0.998758f, 0.998748f, 0.998738f, 0.998729f,
+ 0.998719f, 0.998709f, 0.998700f, 0.998690f, 0.998680f, 0.998670f, 0.998660f, 0.998650f,
+ 0.998640f, 0.998630f, 0.998620f, 0.998610f, 0.998600f, 0.998590f, 0.998580f, 0.998569f,
+ 0.998559f, 0.998549f, 0.998538f, 0.998528f, 0.998518f, 0.998507f, 0.998497f, 0.998486f,
+ 0.998476f, 0.998465f, 0.998454f, 0.998444f, 0.998433f, 0.998422f, 0.998411f, 0.998401f,
+ 0.998390f, 0.998379f, 0.998368f, 0.998357f, 0.998346f, 0.998335f, 0.998324f, 0.998313f,
+ 0.998302f, 0.998290f, 0.998279f, 0.998268f, 0.998257f, 0.998245f, 0.998234f, 0.998222f,
+ 0.998211f, 0.998200f, 0.998188f, 0.998176f, 0.998165f, 0.998153f, 0.998142f, 0.998130f,
+ 0.998118f, 0.998106f, 0.998094f, 0.998083f, 0.998071f, 0.998059f, 0.998047f, 0.998035f,
+ 0.998023f, 0.998011f, 0.997999f, 0.997987f, 0.997974f, 0.997962f, 0.997950f, 0.997938f,
+ 0.997925f, 0.997913f, 0.997901f, 0.997888f, 0.997876f, 0.997863f, 0.997851f, 0.997838f,
+ 0.997825f, 0.997813f, 0.997800f, 0.997787f, 0.997774f, 0.997762f, 0.997749f, 0.997736f,
+ 0.997723f, 0.997710f, 0.997697f, 0.997684f, 0.997671f, 0.997658f, 0.997645f, 0.997632f,
+ 0.997618f, 0.997605f, 0.997592f, 0.997579f, 0.997565f, 0.997552f, 0.997538f, 0.997525f,
+ 0.997511f, 0.997498f, 0.997484f, 0.997471f, 0.997457f, 0.997443f, 0.997430f, 0.997416f,
+ 0.997402f, 0.997388f, 0.997374f, 0.997361f, 0.997347f, 0.997333f, 0.997319f, 0.997305f,
+ 0.997290f, 0.997276f, 0.997262f, 0.997248f, 0.997234f, 0.997219f, 0.997205f, 0.997191f,
+ 0.997176f, 0.997162f, 0.997148f, 0.997133f, 0.997119f, 0.997104f, 0.997089f, 0.997075f,
+ 0.997060f, 0.997045f, 0.997031f, 0.997016f, 0.997001f, 0.996986f, 0.996971f, 0.996956f,
+ 0.996941f, 0.996926f, 0.996911f, 0.996896f, 0.996881f, 0.996866f, 0.996851f, 0.996836f,
+ 0.996820f, 0.996805f, 0.996790f, 0.996774f, 0.996759f, 0.996743f, 0.996728f, 0.996712f,
+ 0.996697f, 0.996681f, 0.996666f, 0.996650f, 0.996634f, 0.996619f, 0.996603f, 0.996587f,
+ 0.996571f, 0.996555f, 0.996539f, 0.996523f, 0.996507f, 0.996491f, 0.996475f, 0.996459f,
+ 0.996443f, 0.996427f, 0.996411f, 0.996394f, 0.996378f, 0.996362f, 0.996345f, 0.996329f,
+ 0.996313f, 0.996296f, 0.996280f, 0.996263f, 0.996247f, 0.996230f, 0.996213f, 0.996197f,
+ 0.996180f, 0.996163f, 0.996146f, 0.996129f, 0.996113f, 0.996096f, 0.996079f, 0.996062f,
+ 0.996045f, 0.996028f, 0.996011f, 0.995993f, 0.995976f, 0.995959f, 0.995942f, 0.995925f,
+ 0.995907f, 0.995890f, 0.995872f, 0.995855f, 0.995838f, 0.995820f, 0.995803f, 0.995785f,
+ 0.995767f, 0.995750f, 0.995732f, 0.995714f, 0.995697f, 0.995679f, 0.995661f, 0.995643f,
+ 0.995625f, 0.995607f, 0.995589f, 0.995571f, 0.995553f, 0.995535f, 0.995517f, 0.995499f,
+ 0.995481f, 0.995463f, 0.995444f, 0.995426f, 0.995408f, 0.995389f, 0.995371f, 0.995352f,
+ 0.995334f, 0.995315f, 0.995297f, 0.995278f, 0.995260f, 0.995241f, 0.995222f, 0.995203f,
+ 0.995185f, 0.995166f, 0.995147f, 0.995128f, 0.995109f, 0.995090f, 0.995071f, 0.995052f,
+ 0.995033f, 0.995014f, 0.994995f, 0.994976f, 0.994957f, 0.994937f, 0.994918f, 0.994899f,
+ 0.994879f, 0.994860f, 0.994841f, 0.994821f, 0.994802f, 0.994782f, 0.994762f, 0.994743f,
+ 0.994723f, 0.994703f, 0.994684f, 0.994664f, 0.994644f, 0.994624f, 0.994604f, 0.994585f,
+ 0.994565f, 0.994545f, 0.994525f, 0.994505f, 0.994484f, 0.994464f, 0.994444f, 0.994424f,
+ 0.994404f, 0.994383f, 0.994363f, 0.994343f, 0.994322f, 0.994302f, 0.994281f, 0.994261f,
+ 0.994240f, 0.994220f, 0.994199f, 0.994179f, 0.994158f, 0.994137f, 0.994116f, 0.994096f,
+ 0.994075f, 0.994054f, 0.994033f, 0.994012f, 0.993991f, 0.993970f, 0.993949f, 0.993928f,
+ 0.993907f, 0.993886f, 0.993865f, 0.993843f, 0.993822f, 0.993801f, 0.993779f, 0.993758f,
+ 0.993737f, 0.993715f, 0.993694f, 0.993672f, 0.993651f, 0.993629f, 0.993608f, 0.993586f,
+ 0.993564f, 0.993542f, 0.993521f, 0.993499f, 0.993477f, 0.993455f, 0.993433f, 0.993411f,
+ 0.993389f, 0.993367f, 0.993345f, 0.993323f, 0.993301f, 0.993279f, 0.993257f, 0.993234f,
+ 0.993212f, 0.993190f, 0.993167f, 0.993145f, 0.993122f, 0.993100f, 0.993077f, 0.993055f,
+ 0.993032f, 0.993010f, 0.992987f, 0.992964f, 0.992942f, 0.992919f, 0.992896f, 0.992873f,
+ 0.992850f, 0.992828f, 0.992805f, 0.992782f, 0.992759f, 0.992736f, 0.992712f, 0.992689f,
+ 0.992666f, 0.992643f, 0.992620f, 0.992596f, 0.992573f, 0.992550f, 0.992526f, 0.992503f,
+ 0.992480f, 0.992456f, 0.992433f, 0.992409f, 0.992385f, 0.992362f, 0.992338f, 0.992314f,
+ 0.992291f, 0.992267f, 0.992243f, 0.992219f, 0.992195f, 0.992171f, 0.992147f, 0.992123f,
+ 0.992099f, 0.992075f, 0.992051f, 0.992027f, 0.992003f, 0.991979f, 0.991954f, 0.991930f,
+ 0.991906f, 0.991881f, 0.991857f, 0.991832f, 0.991808f, 0.991783f, 0.991759f, 0.991734f,
+ 0.991710f, 0.991685f, 0.991660f, 0.991636f, 0.991611f, 0.991586f, 0.991561f, 0.991536f,
+ 0.991511f, 0.991487f, 0.991462f, 0.991437f, 0.991411f, 0.991386f, 0.991361f, 0.991336f,
+ 0.991311f, 0.991286f, 0.991260f, 0.991235f, 0.991210f, 0.991184f, 0.991159f, 0.991133f,
+ 0.991108f, 0.991082f, 0.991057f, 0.991031f, 0.991006f, 0.990980f, 0.990954f, 0.990928f,
+ 0.990903f, 0.990877f, 0.990851f, 0.990825f, 0.990799f, 0.990773f, 0.990747f, 0.990721f,
+ 0.990695f, 0.990669f, 0.990643f, 0.990617f, 0.990590f, 0.990564f, 0.990538f, 0.990511f,
+ 0.990485f, 0.990459f, 0.990432f, 0.990406f, 0.990379f, 0.990353f, 0.990326f, 0.990299f,
+ 0.990273f, 0.990246f, 0.990219f, 0.990193f, 0.990166f, 0.990139f, 0.990112f, 0.990085f,
+ 0.990058f, 0.990031f, 0.990004f, 0.989977f, 0.989950f, 0.989923f, 0.989896f, 0.989869f,
+ 0.989841f, 0.989814f, 0.989787f, 0.989759f, 0.989732f, 0.989704f, 0.989677f, 0.989650f,
+ 0.989622f, 0.989594f, 0.989567f, 0.989539f, 0.989511f, 0.989484f, 0.989456f, 0.989428f,
+ 0.989400f, 0.989373f, 0.989345f, 0.989317f, 0.989289f, 0.989261f, 0.989233f, 0.989205f,
+ 0.989177f, 0.989148f, 0.989120f, 0.989092f, 0.989064f, 0.989035f, 0.989007f, 0.988979f,
+ 0.988950f, 0.988922f, 0.988893f, 0.988865f, 0.988836f, 0.988808f, 0.988779f, 0.988750f,
+ 0.988722f, 0.988693f, 0.988664f, 0.988635f, 0.988607f, 0.988578f, 0.988549f, 0.988520f,
+ 0.988491f, 0.988462f, 0.988433f, 0.988404f, 0.988374f, 0.988345f, 0.988316f, 0.988287f,
+ 0.988258f, 0.988228f, 0.988199f, 0.988169f, 0.988140f, 0.988111f, 0.988081f, 0.988052f,
+ 0.988022f, 0.987992f, 0.987963f, 0.987933f, 0.987903f, 0.987874f, 0.987844f, 0.987814f,
+ 0.987784f, 0.987754f, 0.987724f, 0.987694f, 0.987664f, 0.987634f, 0.987604f, 0.987574f,
+ 0.987544f, 0.987514f, 0.987484f, 0.987453f, 0.987423f, 0.987393f, 0.987362f, 0.987332f,
+ 0.987301f, 0.987271f, 0.987240f, 0.987210f, 0.987179f, 0.987149f, 0.987118f, 0.987087f,
+ 0.987057f, 0.987026f, 0.986995f, 0.986964f, 0.986933f, 0.986902f, 0.986871f, 0.986840f,
+ 0.986809f, 0.986778f, 0.986747f, 0.986716f, 0.986685f, 0.986654f, 0.986623f, 0.986591f,
+ 0.986560f, 0.986529f, 0.986497f, 0.986466f, 0.986434f, 0.986403f, 0.986371f, 0.986340f,
+ 0.986308f, 0.986276f, 0.986245f, 0.986213f, 0.986181f, 0.986150f, 0.986118f, 0.986086f,
+ 0.986054f, 0.986022f, 0.985990f, 0.985958f, 0.985926f, 0.985894f, 0.985862f, 0.985830f,
+ 0.985798f, 0.985765f, 0.985733f, 0.985701f, 0.985668f, 0.985636f, 0.985604f, 0.985571f,
+ 0.985539f, 0.985506f, 0.985474f, 0.985441f, 0.985408f, 0.985376f, 0.985343f, 0.985310f,
+ 0.985278f, 0.985245f, 0.985212f, 0.985179f, 0.985146f, 0.985113f, 0.985080f, 0.985047f,
+ 0.985014f, 0.984981f, 0.984948f, 0.984915f, 0.984882f, 0.984848f, 0.984815f, 0.984782f,
+ 0.984748f, 0.984715f, 0.984682f, 0.984648f, 0.984615f, 0.984581f, 0.984548f, 0.984514f,
+ 0.984480f, 0.984447f, 0.984413f, 0.984379f, 0.984346f, 0.984312f, 0.984278f, 0.984244f,
+ 0.984210f, 0.984176f, 0.984142f, 0.984108f, 0.984074f, 0.984040f, 0.984006f, 0.983972f,
+ 0.983937f, 0.983903f, 0.983869f, 0.983835f, 0.983800f, 0.983766f, 0.983731f, 0.983697f,
+ 0.983662f, 0.983628f, 0.983593f, 0.983559f, 0.983524f, 0.983489f, 0.983455f, 0.983420f,
+ 0.983385f, 0.983350f, 0.983315f, 0.983281f, 0.983246f, 0.983211f, 0.983176f, 0.983141f,
+ 0.983105f, 0.983070f, 0.983035f, 0.983000f, 0.982965f, 0.982930f, 0.982894f, 0.982859f,
+ 0.982824f, 0.982788f, 0.982753f, 0.982717f, 0.982682f, 0.982646f, 0.982611f, 0.982575f,
+ 0.982539f, 0.982504f, 0.982468f, 0.982432f, 0.982396f, 0.982360f, 0.982325f, 0.982289f,
+ 0.982253f, 0.982217f, 0.982181f, 0.982145f, 0.982109f, 0.982072f, 0.982036f, 0.982000f,
+ 0.981964f, 0.981928f, 0.981891f, 0.981855f, 0.981819f, 0.981782f, 0.981746f, 0.981709f,
+ 0.981673f, 0.981636f, 0.981600f, 0.981563f, 0.981526f, 0.981490f, 0.981453f, 0.981416f,
+ 0.981379f, 0.981342f, 0.981305f, 0.981269f, 0.981232f, 0.981195f, 0.981158f, 0.981120f,
+ 0.981083f, 0.981046f, 0.981009f, 0.980972f, 0.980935f, 0.980897f, 0.980860f, 0.980823f,
+ 0.980785f, 0.980748f, 0.980710f, 0.980673f, 0.980635f, 0.980598f, 0.980560f, 0.980523f,
+ 0.980485f, 0.980447f, 0.980409f, 0.980372f, 0.980334f, 0.980296f, 0.980258f, 0.980220f,
+ 0.980182f, 0.980144f, 0.980106f, 0.980068f, 0.980030f, 0.979992f, 0.979954f, 0.979915f,
+ 0.979877f, 0.979839f, 0.979800f, 0.979762f, 0.979724f, 0.979685f, 0.979647f, 0.979608f,
+ 0.979570f, 0.979531f, 0.979493f, 0.979454f, 0.979415f, 0.979376f, 0.979338f, 0.979299f,
+ 0.979260f, 0.979221f, 0.979182f, 0.979143f, 0.979104f, 0.979065f, 0.979026f, 0.978987f,
+ 0.978948f, 0.978909f, 0.978870f, 0.978831f, 0.978791f, 0.978752f, 0.978713f, 0.978673f,
+ 0.978634f, 0.978594f, 0.978555f, 0.978516f, 0.978476f, 0.978436f, 0.978397f, 0.978357f,
+ 0.978317f, 0.978278f, 0.978238f, 0.978198f, 0.978158f, 0.978118f, 0.978078f, 0.978038f,
+ 0.977998f, 0.977959f, 0.977918f, 0.977878f, 0.977838f, 0.977798f, 0.977758f, 0.977718f,
+ 0.977677f, 0.977637f, 0.977597f, 0.977556f, 0.977516f, 0.977475f, 0.977435f, 0.977394f,
+ 0.977354f, 0.977313f, 0.977273f, 0.977232f, 0.977191f, 0.977151f, 0.977110f, 0.977069f,
+ 0.977028f, 0.976987f, 0.976946f, 0.976905f, 0.976864f, 0.976823f, 0.976782f, 0.976741f,
+ 0.976700f, 0.976659f, 0.976618f, 0.976576f, 0.976535f, 0.976494f, 0.976453f, 0.976411f,
+ 0.976370f, 0.976328f, 0.976287f, 0.976245f, 0.976204f, 0.976162f, 0.976120f, 0.976079f,
+ 0.976037f, 0.975995f, 0.975954f, 0.975912f, 0.975870f, 0.975828f, 0.975786f, 0.975744f,
+ 0.975702f, 0.975660f, 0.975618f, 0.975576f, 0.975534f, 0.975492f, 0.975449f, 0.975407f,
+ 0.975365f, 0.975323f, 0.975280f, 0.975238f, 0.975195f, 0.975153f, 0.975110f, 0.975068f,
+ 0.975025f, 0.974983f, 0.974940f, 0.974897f, 0.974855f, 0.974812f, 0.974769f, 0.974726f,
+ 0.974684f, 0.974641f, 0.974598f, 0.974555f, 0.974512f, 0.974469f, 0.974426f, 0.974383f,
+ 0.974339f, 0.974296f, 0.974253f, 0.974210f, 0.974166f, 0.974123f, 0.974080f, 0.974036f,
+ 0.973993f, 0.973949f, 0.973906f, 0.973862f, 0.973819f, 0.973775f, 0.973732f, 0.973688f,
+ 0.973644f, 0.973601f, 0.973557f, 0.973513f, 0.973469f, 0.973425f, 0.973381f, 0.973337f,
+ 0.973293f, 0.973249f, 0.973205f, 0.973161f, 0.973117f, 0.973073f, 0.973028f, 0.972984f,
+ 0.972940f, 0.972896f, 0.972851f, 0.972807f, 0.972762f, 0.972718f, 0.972673f, 0.972629f,
+ 0.972584f, 0.972540f, 0.972495f, 0.972450f, 0.972406f, 0.972361f, 0.972316f, 0.972271f,
+ 0.972227f, 0.972182f, 0.972137f, 0.972092f, 0.972047f, 0.972002f, 0.971957f, 0.971911f,
+ 0.971866f, 0.971821f, 0.971776f, 0.971731f, 0.971685f, 0.971640f, 0.971595f, 0.971549f,
+ 0.971504f, 0.971458f, 0.971413f, 0.971367f, 0.971322f, 0.971276f, 0.971231f, 0.971185f,
+ 0.971139f, 0.971093f, 0.971048f, 0.971002f, 0.970956f, 0.970910f, 0.970864f, 0.970818f,
+ 0.970772f, 0.970726f, 0.970680f, 0.970634f, 0.970588f, 0.970542f, 0.970495f, 0.970449f,
+ 0.970403f, 0.970357f, 0.970310f, 0.970264f, 0.970217f, 0.970171f, 0.970124f, 0.970078f,
+ 0.970031f, 0.969985f, 0.969938f, 0.969891f, 0.969845f, 0.969798f, 0.969751f, 0.969704f,
+ 0.969657f, 0.969611f, 0.969564f, 0.969517f, 0.969470f, 0.969423f, 0.969375f, 0.969328f,
+ 0.969281f, 0.969234f, 0.969187f, 0.969140f, 0.969092f, 0.969045f, 0.968998f, 0.968950f,
+ 0.968903f, 0.968855f, 0.968808f, 0.968760f, 0.968713f, 0.968665f, 0.968617f, 0.968570f,
+ 0.968522f, 0.968474f, 0.968427f, 0.968379f, 0.968331f, 0.968283f, 0.968235f, 0.968187f,
+ 0.968139f, 0.968091f, 0.968043f, 0.967995f, 0.967947f, 0.967899f, 0.967850f, 0.967802f,
+ 0.967754f, 0.967706f, 0.967657f, 0.967609f, 0.967560f, 0.967512f, 0.967463f, 0.967415f,
+ 0.967366f, 0.967318f, 0.967269f, 0.967220f, 0.967172f, 0.967123f, 0.967074f, 0.967025f,
+ 0.966976f, 0.966928f, 0.966879f, 0.966830f, 0.966781f, 0.966732f, 0.966683f, 0.966633f,
+ 0.966584f, 0.966535f, 0.966486f, 0.966437f, 0.966387f, 0.966338f, 0.966289f, 0.966239f,
+ 0.966190f, 0.966141f, 0.966091f, 0.966042f, 0.965992f, 0.965942f, 0.965893f, 0.965843f,
+ 0.965793f, 0.965744f, 0.965694f, 0.965644f, 0.965594f, 0.965544f, 0.965494f, 0.965444f,
+ 0.965394f, 0.965344f, 0.965294f, 0.965244f, 0.965194f, 0.965144f, 0.965094f, 0.965044f,
+ 0.964993f, 0.964943f, 0.964893f, 0.964842f, 0.964792f, 0.964741f, 0.964691f, 0.964640f,
+ 0.964590f, 0.964539f, 0.964489f, 0.964438f, 0.964387f, 0.964336f, 0.964286f, 0.964235f,
+ 0.964184f, 0.964133f, 0.964082f, 0.964031f, 0.963980f, 0.963929f, 0.963878f, 0.963827f,
+ 0.963776f, 0.963725f, 0.963674f, 0.963623f, 0.963571f, 0.963520f, 0.963469f, 0.963417f,
+ 0.963366f, 0.963314f, 0.963263f, 0.963211f, 0.963160f, 0.963108f, 0.963057f, 0.963005f,
+ 0.962953f, 0.962902f, 0.962850f, 0.962798f, 0.962746f, 0.962694f, 0.962642f, 0.962590f,
+ 0.962538f, 0.962486f, 0.962434f, 0.962382f, 0.962330f, 0.962278f, 0.962226f, 0.962174f,
+ 0.962121f, 0.962069f, 0.962017f, 0.961964f, 0.961912f, 0.961860f, 0.961807f, 0.961755f,
+ 0.961702f, 0.961649f, 0.961597f, 0.961544f, 0.961492f, 0.961439f, 0.961386f, 0.961333f,
+ 0.961280f, 0.961228f, 0.961175f, 0.961122f, 0.961069f, 0.961016f, 0.960963f, 0.960910f,
+ 0.960857f, 0.960804f, 0.960750f, 0.960697f, 0.960644f, 0.960591f, 0.960537f, 0.960484f,
+ 0.960431f, 0.960377f, 0.960324f, 0.960270f, 0.960217f, 0.960163f, 0.960109f, 0.960056f,
+ 0.960002f, 0.959948f, 0.959895f, 0.959841f, 0.959787f, 0.959733f, 0.959679f, 0.959625f,
+ 0.959572f, 0.959518f, 0.959463f, 0.959409f, 0.959355f, 0.959301f, 0.959247f, 0.959193f,
+ 0.959139f, 0.959084f, 0.959030f, 0.958976f, 0.958921f, 0.958867f, 0.958812f, 0.958758f,
+ 0.958703f, 0.958649f, 0.958594f, 0.958540f, 0.958485f, 0.958430f, 0.958376f, 0.958321f,
+ 0.958266f, 0.958211f, 0.958156f, 0.958101f, 0.958046f, 0.957992f, 0.957937f, 0.957882f,
+ 0.957826f, 0.957771f, 0.957716f, 0.957661f, 0.957606f, 0.957550f, 0.957495f, 0.957440f,
+ 0.957385f, 0.957329f, 0.957274f, 0.957218f, 0.957163f, 0.957107f, 0.957052f, 0.956996f,
+ 0.956940f, 0.956885f, 0.956829f, 0.956773f, 0.956717f, 0.956662f, 0.956606f, 0.956550f,
+ 0.956494f, 0.956438f, 0.956382f, 0.956326f, 0.956270f, 0.956214f, 0.956158f, 0.956101f,
+ 0.956045f, 0.955989f, 0.955933f, 0.955876f, 0.955820f, 0.955764f, 0.955707f, 0.955651f,
+ 0.955594f, 0.955538f, 0.955481f, 0.955425f, 0.955368f, 0.955311f, 0.955255f, 0.955198f,
+ 0.955141f, 0.955084f, 0.955028f, 0.954971f, 0.954914f, 0.954857f, 0.954800f, 0.954743f,
+ 0.954686f, 0.954629f, 0.954572f, 0.954514f, 0.954457f, 0.954400f, 0.954343f, 0.954285f,
+ 0.954228f, 0.954171f, 0.954113f, 0.954056f, 0.953998f, 0.953941f, 0.953883f, 0.953826f,
+ 0.953768f, 0.953711f, 0.953653f, 0.953595f, 0.953537f, 0.953480f, 0.953422f, 0.953364f,
+ 0.953306f, 0.953248f, 0.953190f, 0.953132f, 0.953074f, 0.953016f, 0.952958f, 0.952900f,
+ 0.952842f, 0.952783f, 0.952725f, 0.952667f, 0.952609f, 0.952550f, 0.952492f, 0.952433f,
+ 0.952375f, 0.952317f, 0.952258f, 0.952199f, 0.952141f, 0.952082f, 0.952024f, 0.951965f,
+ 0.951906f, 0.951847f, 0.951789f, 0.951730f, 0.951671f, 0.951612f, 0.951553f, 0.951494f,
+ 0.951435f, 0.951376f, 0.951317f, 0.951258f, 0.951199f, 0.951139f, 0.951080f, 0.951021f,
+ 0.950962f, 0.950902f, 0.950843f, 0.950784f, 0.950724f, 0.950665f, 0.950605f, 0.950546f,
+ 0.950486f, 0.950426f, 0.950367f, 0.950307f, 0.950247f, 0.950188f, 0.950128f, 0.950068f,
+ 0.950008f, 0.949948f, 0.949888f, 0.949829f, 0.949768f, 0.949708f, 0.949648f, 0.949588f,
+ 0.949528f, 0.949468f, 0.949408f, 0.949348f, 0.949287f, 0.949227f, 0.949167f, 0.949106f,
+ 0.949046f, 0.948985f, 0.948925f, 0.948864f, 0.948804f, 0.948743f, 0.948683f, 0.948622f,
+ 0.948561f, 0.948501f, 0.948440f, 0.948379f, 0.948318f, 0.948257f, 0.948196f, 0.948136f,
+ 0.948075f, 0.948014f, 0.947953f, 0.947891f, 0.947830f, 0.947769f, 0.947708f, 0.947647f,
+ 0.947586f, 0.947524f, 0.947463f, 0.947402f, 0.947340f, 0.947279f, 0.947217f, 0.947156f,
+ 0.947094f, 0.947033f, 0.946971f, 0.946910f, 0.946848f, 0.946786f, 0.946724f, 0.946663f,
+ 0.946601f, 0.946539f, 0.946477f, 0.946415f, 0.946353f, 0.946291f, 0.946229f, 0.946167f,
+ 0.946105f, 0.946043f, 0.945981f, 0.945919f, 0.945857f, 0.945794f, 0.945732f, 0.945670f,
+ 0.945607f, 0.945545f, 0.945482f, 0.945420f, 0.945358f, 0.945295f, 0.945232f, 0.945170f,
+ 0.945107f, 0.945045f, 0.944982f, 0.944919f, 0.944856f, 0.944793f, 0.944731f, 0.944668f,
+ 0.944605f, 0.944542f, 0.944479f, 0.944416f, 0.944353f, 0.944290f, 0.944227f, 0.944163f,
+ 0.944100f, 0.944037f, 0.943974f, 0.943910f, 0.943847f, 0.943784f, 0.943720f, 0.943657f,
+ 0.943593f, 0.943530f, 0.943466f, 0.943403f, 0.943339f, 0.943276f, 0.943212f, 0.943148f,
+ 0.943084f, 0.943021f, 0.942957f, 0.942893f, 0.942829f, 0.942765f, 0.942701f, 0.942637f,
+ 0.942573f, 0.942509f, 0.942445f, 0.942381f, 0.942317f, 0.942253f, 0.942188f, 0.942124f,
+ 0.942060f, 0.941995f, 0.941931f, 0.941867f, 0.941802f, 0.941738f, 0.941673f, 0.941609f,
+ 0.941544f, 0.941479f, 0.941415f, 0.941350f, 0.941285f, 0.941221f, 0.941156f, 0.941091f,
+ 0.941026f, 0.940961f, 0.940896f, 0.940831f, 0.940766f, 0.940701f, 0.940636f, 0.940571f,
+ 0.940506f, 0.940441f, 0.940376f, 0.940310f, 0.940245f, 0.940180f, 0.940115f, 0.940049f,
+ 0.939984f, 0.939918f, 0.939853f, 0.939787f, 0.939722f, 0.939656f, 0.939591f, 0.939525f,
+ 0.939459f, 0.939394f, 0.939328f, 0.939262f, 0.939196f, 0.939130f, 0.939064f, 0.938998f,
+ 0.938932f, 0.938866f, 0.938800f, 0.938734f, 0.938668f, 0.938602f, 0.938536f, 0.938470f,
+ 0.938404f, 0.938337f, 0.938271f, 0.938205f, 0.938138f, 0.938072f, 0.938005f, 0.937939f,
+ 0.937872f, 0.937806f, 0.937739f, 0.937673f, 0.937606f, 0.937539f, 0.937473f, 0.937406f,
+ 0.937339f, 0.937272f, 0.937205f, 0.937138f, 0.937072f, 0.937005f, 0.936938f, 0.936871f,
+ 0.936803f, 0.936736f, 0.936669f, 0.936602f, 0.936535f, 0.936468f, 0.936400f, 0.936333f,
+ 0.936266f, 0.936198f, 0.936131f, 0.936063f, 0.935996f, 0.935928f, 0.935861f, 0.935793f,
+ 0.935726f, 0.935658f, 0.935590f, 0.935523f, 0.935455f, 0.935387f, 0.935319f, 0.935251f,
+ 0.935184f, 0.935116f, 0.935048f, 0.934980f, 0.934912f, 0.934844f, 0.934775f, 0.934707f,
+ 0.934639f, 0.934571f, 0.934503f, 0.934434f, 0.934366f, 0.934298f, 0.934229f, 0.934161f,
+ 0.934093f, 0.934024f, 0.933956f, 0.933887f, 0.933818f, 0.933750f, 0.933681f, 0.933612f,
+ 0.933544f, 0.933475f, 0.933406f, 0.933337f, 0.933269f, 0.933200f, 0.933131f, 0.933062f,
+ 0.932993f, 0.932924f, 0.932855f, 0.932786f, 0.932716f, 0.932647f, 0.932578f, 0.932509f,
+ 0.932440f, 0.932370f, 0.932301f, 0.932232f, 0.932162f, 0.932093f, 0.932023f, 0.931954f,
+ 0.931884f, 0.931815f, 0.931745f, 0.931675f, 0.931606f, 0.931536f, 0.931466f, 0.931397f,
+ 0.931327f, 0.931257f, 0.931187f, 0.931117f, 0.931047f, 0.930977f, 0.930907f, 0.930837f,
+ 0.930767f, 0.930697f, 0.930627f, 0.930556f, 0.930486f, 0.930416f, 0.930346f, 0.930275f,
+ 0.930205f, 0.930135f, 0.930064f, 0.929994f, 0.929923f, 0.929853f, 0.929782f, 0.929712f,
+ 0.929641f, 0.929570f, 0.929500f, 0.929429f, 0.929358f, 0.929287f, 0.929216f, 0.929146f,
+ 0.929075f, 0.929004f, 0.928933f, 0.928862f, 0.928791f, 0.928720f, 0.928648f, 0.928577f,
+ 0.928506f, 0.928435f, 0.928364f, 0.928292f, 0.928221f, 0.928150f, 0.928078f, 0.928007f,
+ 0.927935f, 0.927864f, 0.927792f, 0.927721f, 0.927649f, 0.927578f, 0.927506f, 0.927434f,
+ 0.927363f, 0.927291f, 0.927219f, 0.927147f, 0.927075f, 0.927003f, 0.926931f, 0.926859f,
+ 0.926787f, 0.926715f, 0.926643f, 0.926571f, 0.926499f, 0.926427f, 0.926355f, 0.926283f,
+ 0.926210f, 0.926138f, 0.926066f, 0.925993f, 0.925921f, 0.925848f, 0.925776f, 0.925703f,
+ 0.925631f, 0.925558f, 0.925486f, 0.925413f, 0.925340f, 0.925268f, 0.925195f, 0.925122f,
+ 0.925049f, 0.924976f, 0.924904f, 0.924831f, 0.924758f, 0.924685f, 0.924612f, 0.924539f,
+ 0.924465f, 0.924392f, 0.924319f, 0.924246f, 0.924173f, 0.924100f, 0.924026f, 0.923953f,
+ 0.923880f, 0.923806f, 0.923733f, 0.923659f, 0.923586f, 0.923512f, 0.923439f, 0.923365f,
+ 0.923291f, 0.923218f, 0.923144f, 0.923070f, 0.922997f, 0.922923f, 0.922849f, 0.922775f,
+ 0.922701f, 0.922627f, 0.922553f, 0.922479f, 0.922405f, 0.922331f, 0.922257f, 0.922183f,
+ 0.922109f, 0.922034f, 0.921960f, 0.921886f, 0.921812f, 0.921737f, 0.921663f, 0.921588f,
+ 0.921514f, 0.921440f, 0.921365f, 0.921291f, 0.921216f, 0.921141f, 0.921067f, 0.920992f,
+ 0.920917f, 0.920842f, 0.920768f, 0.920693f, 0.920618f, 0.920543f, 0.920468f, 0.920393f,
+ 0.920318f, 0.920243f, 0.920168f, 0.920093f, 0.920018f, 0.919943f, 0.919868f, 0.919792f,
+ 0.919717f, 0.919642f, 0.919567f, 0.919491f, 0.919416f, 0.919340f, 0.919265f, 0.919189f,
+ 0.919114f, 0.919038f, 0.918963f, 0.918887f, 0.918811f, 0.918736f, 0.918660f, 0.918584f,
+ 0.918508f, 0.918433f, 0.918357f, 0.918281f, 0.918205f, 0.918129f, 0.918053f, 0.917977f,
+ 0.917901f, 0.917825f, 0.917749f, 0.917672f, 0.917596f, 0.917520f, 0.917444f, 0.917367f,
+ 0.917291f, 0.917215f, 0.917138f, 0.917062f, 0.916985f, 0.916909f, 0.916832f, 0.916756f,
+ 0.916679f, 0.916602f, 0.916526f, 0.916449f, 0.916372f, 0.916296f, 0.916219f, 0.916142f,
+ 0.916065f, 0.915988f, 0.915911f, 0.915834f, 0.915757f, 0.915680f, 0.915603f, 0.915526f,
+ 0.915449f, 0.915372f, 0.915294f, 0.915217f, 0.915140f, 0.915062f, 0.914985f, 0.914908f,
+ 0.914830f, 0.914753f, 0.914675f, 0.914598f, 0.914520f, 0.914443f, 0.914365f, 0.914287f,
+ 0.914210f, 0.914132f, 0.914054f, 0.913976f, 0.913899f, 0.913821f, 0.913743f, 0.913665f,
+ 0.913587f, 0.913509f, 0.913431f, 0.913353f, 0.913275f, 0.913197f, 0.913119f, 0.913040f,
+ 0.912962f, 0.912884f, 0.912806f, 0.912727f, 0.912649f, 0.912571f, 0.912492f, 0.912414f,
+ 0.912335f, 0.912257f, 0.912178f, 0.912099f, 0.912021f, 0.911942f, 0.911864f, 0.911785f,
+ 0.911706f, 0.911627f, 0.911548f, 0.911470f, 0.911391f, 0.911312f, 0.911233f, 0.911154f,
+ 0.911075f, 0.910996f, 0.910917f, 0.910837f, 0.910758f, 0.910679f, 0.910600f, 0.910521f,
+ 0.910441f, 0.910362f, 0.910283f, 0.910203f, 0.910124f, 0.910044f, 0.909965f, 0.909885f,
+ 0.909806f, 0.909726f, 0.909646f, 0.909567f, 0.909487f, 0.909407f, 0.909328f, 0.909248f,
+ 0.909168f, 0.909088f, 0.909008f, 0.908928f, 0.908848f, 0.908768f, 0.908688f, 0.908608f,
+ 0.908528f, 0.908448f, 0.908368f, 0.908288f, 0.908207f, 0.908127f, 0.908047f, 0.907966f,
+ 0.907886f, 0.907806f, 0.907725f, 0.907645f, 0.907564f, 0.907484f, 0.907403f, 0.907323f,
+ 0.907242f, 0.907161f, 0.907081f, 0.907000f, 0.906919f, 0.906838f, 0.906757f, 0.906677f,
+ 0.906596f, 0.906515f, 0.906434f, 0.906353f, 0.906272f, 0.906191f, 0.906110f, 0.906028f,
+ 0.905947f, 0.905866f, 0.905785f, 0.905704f, 0.905622f, 0.905541f, 0.905460f, 0.905378f,
+ 0.905297f, 0.905215f, 0.905134f, 0.905052f, 0.904971f, 0.904889f, 0.904807f, 0.904726f,
+ 0.904644f, 0.904562f, 0.904481f, 0.904399f, 0.904317f, 0.904235f, 0.904153f, 0.904071f,
+ 0.903989f, 0.903907f, 0.903825f, 0.903743f, 0.903661f, 0.903579f, 0.903497f, 0.903415f,
+ 0.903332f, 0.903250f, 0.903168f, 0.903085f, 0.903003f, 0.902921f, 0.902838f, 0.902756f,
+ 0.902673f, 0.902591f, 0.902508f, 0.902426f, 0.902343f, 0.902260f, 0.902178f, 0.902095f,
+ 0.902012f, 0.901929f, 0.901847f, 0.901764f, 0.901681f, 0.901598f, 0.901515f, 0.901432f,
+ 0.901349f, 0.901266f, 0.901183f, 0.901100f, 0.901016f, 0.900933f, 0.900850f, 0.900767f,
+ 0.900683f, 0.900600f, 0.900517f, 0.900433f, 0.900350f, 0.900266f, 0.900183f, 0.900099f,
+ 0.900016f, 0.899932f, 0.899849f, 0.899765f, 0.899681f, 0.899598f, 0.899514f, 0.899430f,
+ 0.899346f, 0.899262f, 0.899179f, 0.899095f, 0.899011f, 0.898927f, 0.898843f, 0.898759f,
+ 0.898674f, 0.898590f, 0.898506f, 0.898422f, 0.898338f, 0.898254f, 0.898169f, 0.898085f,
+ 0.898001f, 0.897916f, 0.897832f, 0.897747f, 0.897663f, 0.897578f, 0.897494f, 0.897409f,
+ 0.897325f, 0.897240f, 0.897155f, 0.897071f, 0.896986f, 0.896901f, 0.896816f, 0.896731f,
+ 0.896646f, 0.896562f, 0.896477f, 0.896392f, 0.896307f, 0.896222f, 0.896137f, 0.896051f,
+ 0.895966f, 0.895881f, 0.895796f, 0.895711f, 0.895625f, 0.895540f, 0.895455f, 0.895369f,
+ 0.895284f, 0.895198f, 0.895113f, 0.895028f, 0.894942f, 0.894856f, 0.894771f, 0.894685f,
+ 0.894599f, 0.894514f, 0.894428f, 0.894342f, 0.894256f, 0.894171f, 0.894085f, 0.893999f,
+ 0.893913f, 0.893827f, 0.893741f, 0.893655f, 0.893569f, 0.893483f, 0.893397f, 0.893310f,
+ 0.893224f, 0.893138f, 0.893052f, 0.892965f, 0.892879f, 0.892793f, 0.892706f, 0.892620f,
+ 0.892534f, 0.892447f, 0.892361f, 0.892274f, 0.892187f, 0.892101f, 0.892014f, 0.891927f,
+ 0.891841f, 0.891754f, 0.891667f, 0.891580f, 0.891493f, 0.891407f, 0.891320f, 0.891233f,
+ 0.891146f, 0.891059f, 0.890972f, 0.890885f, 0.890797f, 0.890710f, 0.890623f, 0.890536f,
+ 0.890449f, 0.890361f, 0.890274f, 0.890187f, 0.890099f, 0.890012f, 0.889925f, 0.889837f,
+ 0.889750f, 0.889662f, 0.889574f, 0.889487f, 0.889399f, 0.889312f, 0.889224f, 0.889136f,
+ 0.889048f, 0.888961f, 0.888873f, 0.888785f, 0.888697f, 0.888609f, 0.888521f, 0.888433f,
+ 0.888345f, 0.888257f, 0.888169f, 0.888081f, 0.887993f, 0.887904f, 0.887816f, 0.887728f,
+ 0.887640f, 0.887551f, 0.887463f, 0.887375f, 0.887286f, 0.887198f, 0.887109f, 0.887021f,
+ 0.886932f, 0.886844f, 0.886755f, 0.886666f, 0.886578f, 0.886489f, 0.886400f, 0.886311f,
+ 0.886223f, 0.886134f, 0.886045f, 0.885956f, 0.885867f, 0.885778f, 0.885689f, 0.885600f,
+ 0.885511f, 0.885422f, 0.885333f, 0.885243f, 0.885154f, 0.885065f, 0.884976f, 0.884886f,
+ 0.884797f, 0.884708f, 0.884618f, 0.884529f, 0.884439f, 0.884350f, 0.884260f, 0.884171f,
+ 0.884081f, 0.883992f, 0.883902f, 0.883812f, 0.883723f, 0.883633f, 0.883543f, 0.883453f,
+ 0.883363f, 0.883273f, 0.883184f, 0.883094f, 0.883004f, 0.882914f, 0.882824f, 0.882733f,
+ 0.882643f, 0.882553f, 0.882463f, 0.882373f, 0.882283f, 0.882192f, 0.882102f, 0.882012f,
+ 0.881921f, 0.881831f, 0.881740f, 0.881650f, 0.881559f, 0.881469f, 0.881378f, 0.881288f,
+ 0.881197f, 0.881106f, 0.881016f, 0.880925f, 0.880834f, 0.880743f, 0.880653f, 0.880562f,
+ 0.880471f, 0.880380f, 0.880289f, 0.880198f, 0.880107f, 0.880016f, 0.879925f, 0.879834f,
+ 0.879743f, 0.879651f, 0.879560f, 0.879469f, 0.879378f, 0.879286f, 0.879195f, 0.879104f,
+ 0.879012f, 0.878921f, 0.878829f, 0.878738f, 0.878646f, 0.878555f, 0.878463f, 0.878371f,
+ 0.878280f, 0.878188f, 0.878096f, 0.878005f, 0.877913f, 0.877821f, 0.877729f, 0.877637f,
+ 0.877545f, 0.877453f, 0.877361f, 0.877269f, 0.877177f, 0.877085f, 0.876993f, 0.876901f,
+ 0.876809f, 0.876716f, 0.876624f, 0.876532f, 0.876440f, 0.876347f, 0.876255f, 0.876163f,
+ 0.876070f, 0.875978f, 0.875885f, 0.875793f, 0.875700f, 0.875607f, 0.875515f, 0.875422f,
+ 0.875329f, 0.875237f, 0.875144f, 0.875051f, 0.874958f, 0.874865f, 0.874773f, 0.874680f,
+ 0.874587f, 0.874494f, 0.874401f, 0.874308f, 0.874215f, 0.874121f, 0.874028f, 0.873935f,
+ 0.873842f, 0.873749f, 0.873655f, 0.873562f, 0.873469f, 0.873375f, 0.873282f, 0.873188f,
+ 0.873095f, 0.873001f, 0.872908f, 0.872814f, 0.872721f, 0.872627f, 0.872534f, 0.872440f,
+ 0.872346f, 0.872252f, 0.872159f, 0.872065f, 0.871971f, 0.871877f, 0.871783f, 0.871689f,
+ 0.871595f, 0.871501f, 0.871407f, 0.871313f, 0.871219f, 0.871125f, 0.871031f, 0.870936f,
+ 0.870842f, 0.870748f, 0.870654f, 0.870559f, 0.870465f, 0.870370f, 0.870276f, 0.870182f,
+ 0.870087f, 0.869992f, 0.869898f, 0.869803f, 0.869709f, 0.869614f, 0.869519f, 0.869425f,
+ 0.869330f, 0.869235f, 0.869140f, 0.869045f, 0.868951f, 0.868856f, 0.868761f, 0.868666f,
+ 0.868571f, 0.868476f, 0.868381f, 0.868285f, 0.868190f, 0.868095f, 0.868000f, 0.867905f,
+ 0.867809f, 0.867714f, 0.867619f, 0.867523f, 0.867428f, 0.867333f, 0.867237f, 0.867142f,
+ 0.867046f, 0.866951f, 0.866855f, 0.866759f, 0.866664f, 0.866568f, 0.866472f, 0.866377f,
+ 0.866281f, 0.866185f, 0.866089f, 0.865993f, 0.865898f, 0.865802f, 0.865706f, 0.865610f,
+ 0.865514f, 0.865418f, 0.865321f, 0.865225f, 0.865129f, 0.865033f, 0.864937f, 0.864841f,
+ 0.864744f, 0.864648f, 0.864552f, 0.864455f, 0.864359f, 0.864262f, 0.864166f, 0.864069f,
+ 0.863973f, 0.863876f, 0.863780f, 0.863683f, 0.863586f, 0.863490f, 0.863393f, 0.863296f,
+ 0.863199f, 0.863103f, 0.863006f, 0.862909f, 0.862812f, 0.862715f, 0.862618f, 0.862521f,
+ 0.862424f, 0.862327f, 0.862230f, 0.862133f, 0.862035f, 0.861938f, 0.861841f, 0.861744f,
+ 0.861646f, 0.861549f, 0.861452f, 0.861354f, 0.861257f, 0.861160f, 0.861062f, 0.860964f,
+ 0.860867f, 0.860769f, 0.860672f, 0.860574f, 0.860476f, 0.860379f, 0.860281f, 0.860183f,
+ 0.860085f, 0.859988f, 0.859890f, 0.859792f, 0.859694f, 0.859596f, 0.859498f, 0.859400f,
+ 0.859302f, 0.859204f, 0.859106f, 0.859007f, 0.858909f, 0.858811f, 0.858713f, 0.858615f,
+ 0.858516f, 0.858418f, 0.858320f, 0.858221f, 0.858123f, 0.858024f, 0.857926f, 0.857827f,
+ 0.857729f, 0.857630f, 0.857531f, 0.857433f, 0.857334f, 0.857235f, 0.857137f, 0.857038f,
+ 0.856939f, 0.856840f, 0.856741f, 0.856642f, 0.856543f, 0.856444f, 0.856345f, 0.856246f,
+ 0.856147f, 0.856048f, 0.855949f, 0.855850f, 0.855751f, 0.855651f, 0.855552f, 0.855453f,
+ 0.855354f, 0.855254f, 0.855155f, 0.855056f, 0.854956f, 0.854857f, 0.854757f, 0.854658f,
+ 0.854558f, 0.854458f, 0.854359f, 0.854259f, 0.854159f, 0.854060f, 0.853960f, 0.853860f,
+ 0.853760f, 0.853660f, 0.853561f, 0.853461f, 0.853361f, 0.853261f, 0.853161f, 0.853061f,
+ 0.852961f, 0.852861f, 0.852760f, 0.852660f, 0.852560f, 0.852460f, 0.852360f, 0.852259f,
+ 0.852159f, 0.852059f, 0.851958f, 0.851858f, 0.851757f, 0.851657f, 0.851556f, 0.851456f,
+ 0.851355f, 0.851255f, 0.851154f, 0.851053f, 0.850953f, 0.850852f, 0.850751f, 0.850650f,
+ 0.850549f, 0.850449f, 0.850348f, 0.850247f, 0.850146f, 0.850045f, 0.849944f, 0.849843f,
+ 0.849742f, 0.849641f, 0.849540f, 0.849438f, 0.849337f, 0.849236f, 0.849135f, 0.849033f,
+ 0.848932f, 0.848831f, 0.848729f, 0.848628f, 0.848526f, 0.848425f, 0.848323f, 0.848222f,
+ 0.848120f, 0.848019f, 0.847917f, 0.847815f, 0.847714f, 0.847612f, 0.847510f, 0.847408f,
+ 0.847307f, 0.847205f, 0.847103f, 0.847001f, 0.846899f, 0.846797f, 0.846695f, 0.846593f,
+ 0.846491f, 0.846389f, 0.846287f, 0.846185f, 0.846082f, 0.845980f, 0.845878f, 0.845776f,
+ 0.845673f, 0.845571f, 0.845469f, 0.845366f, 0.845264f, 0.845161f, 0.845059f, 0.844956f,
+ 0.844854f, 0.844751f, 0.844648f, 0.844546f, 0.844443f, 0.844340f, 0.844238f, 0.844135f,
+ 0.844032f, 0.843929f, 0.843826f, 0.843723f, 0.843620f, 0.843517f, 0.843414f, 0.843311f,
+ 0.843208f, 0.843105f, 0.843002f, 0.842899f, 0.842796f, 0.842692f, 0.842589f, 0.842486f,
+ 0.842383f, 0.842279f, 0.842176f, 0.842072f, 0.841969f, 0.841866f, 0.841762f, 0.841659f,
+ 0.841555f, 0.841451f, 0.841348f, 0.841244f, 0.841140f, 0.841037f, 0.840933f, 0.840829f,
+ 0.840725f, 0.840622f, 0.840518f, 0.840414f, 0.840310f, 0.840206f, 0.840102f, 0.839998f,
+ 0.839894f, 0.839790f, 0.839686f, 0.839581f, 0.839477f, 0.839373f, 0.839269f, 0.839165f,
+ 0.839060f, 0.838956f, 0.838852f, 0.838747f, 0.838643f, 0.838538f, 0.838434f, 0.838329f,
+ 0.838225f, 0.838120f, 0.838015f, 0.837911f, 0.837806f, 0.837701f, 0.837597f, 0.837492f,
+ 0.837387f, 0.837282f, 0.837178f, 0.837073f, 0.836968f, 0.836863f, 0.836758f, 0.836653f,
+ 0.836548f, 0.836443f, 0.836338f, 0.836232f, 0.836127f, 0.836022f, 0.835917f, 0.835812f,
+ 0.835706f, 0.835601f, 0.835496f, 0.835390f, 0.835285f, 0.835179f, 0.835074f, 0.834968f,
+ 0.834863f, 0.834757f, 0.834652f, 0.834546f, 0.834440f, 0.834335f, 0.834229f, 0.834123f,
+ 0.834018f, 0.833912f, 0.833806f, 0.833700f, 0.833594f, 0.833488f, 0.833382f, 0.833276f,
+ 0.833170f, 0.833064f, 0.832958f, 0.832852f, 0.832746f, 0.832640f, 0.832533f, 0.832427f,
+ 0.832321f, 0.832215f, 0.832108f, 0.832002f, 0.831895f, 0.831789f, 0.831683f, 0.831576f,
+ 0.831470f, 0.831363f, 0.831257f, 0.831150f, 0.831043f, 0.830937f, 0.830830f, 0.830723f,
+ 0.830616f, 0.830510f, 0.830403f, 0.830296f, 0.830189f, 0.830082f, 0.829975f, 0.829868f,
+ 0.829761f, 0.829654f, 0.829547f, 0.829440f, 0.829333f, 0.829226f, 0.829119f, 0.829011f,
+ 0.828904f, 0.828797f, 0.828690f, 0.828582f, 0.828475f, 0.828367f, 0.828260f, 0.828153f,
+ 0.828045f, 0.827938f, 0.827830f, 0.827722f, 0.827615f, 0.827507f, 0.827399f, 0.827292f,
+ 0.827184f, 0.827076f, 0.826968f, 0.826861f, 0.826753f, 0.826645f, 0.826537f, 0.826429f,
+ 0.826321f, 0.826213f, 0.826105f, 0.825997f, 0.825889f, 0.825781f, 0.825673f, 0.825564f,
+ 0.825456f, 0.825348f, 0.825240f, 0.825131f, 0.825023f, 0.824915f, 0.824806f, 0.824698f,
+ 0.824589f, 0.824481f, 0.824372f, 0.824264f, 0.824155f, 0.824047f, 0.823938f, 0.823829f,
+ 0.823721f, 0.823612f, 0.823503f, 0.823394f, 0.823285f, 0.823177f, 0.823068f, 0.822959f,
+ 0.822850f, 0.822741f, 0.822632f, 0.822523f, 0.822414f, 0.822305f, 0.822195f, 0.822086f,
+ 0.821977f, 0.821868f, 0.821759f, 0.821649f, 0.821540f, 0.821431f, 0.821321f, 0.821212f,
+ 0.821102f, 0.820993f, 0.820884f, 0.820774f, 0.820664f, 0.820555f, 0.820445f, 0.820336f,
+ 0.820226f, 0.820116f, 0.820007f, 0.819897f, 0.819787f, 0.819677f, 0.819567f, 0.819457f,
+ 0.819348f, 0.819238f, 0.819128f, 0.819018f, 0.818908f, 0.818798f, 0.818687f, 0.818577f,
+ 0.818467f, 0.818357f, 0.818247f, 0.818137f, 0.818026f, 0.817916f, 0.817806f, 0.817695f,
+ 0.817585f, 0.817474f, 0.817364f, 0.817253f, 0.817143f, 0.817032f, 0.816922f, 0.816811f,
+ 0.816701f, 0.816590f, 0.816479f, 0.816368f, 0.816258f, 0.816147f, 0.816036f, 0.815925f,
+ 0.815814f, 0.815704f, 0.815593f, 0.815482f, 0.815371f, 0.815260f, 0.815149f, 0.815037f,
+ 0.814926f, 0.814815f, 0.814704f, 0.814593f, 0.814482f, 0.814370f, 0.814259f, 0.814148f,
+ 0.814036f, 0.813925f, 0.813814f, 0.813702f, 0.813591f, 0.813479f, 0.813368f, 0.813256f,
+ 0.813144f, 0.813033f, 0.812921f, 0.812809f, 0.812698f, 0.812586f, 0.812474f, 0.812362f,
+ 0.812251f, 0.812139f, 0.812027f, 0.811915f, 0.811803f, 0.811691f, 0.811579f, 0.811467f,
+ 0.811355f, 0.811243f, 0.811131f, 0.811018f, 0.810906f, 0.810794f, 0.810682f, 0.810570f,
+ 0.810457f, 0.810345f, 0.810232f, 0.810120f, 0.810008f, 0.809895f, 0.809783f, 0.809670f,
+ 0.809558f, 0.809445f, 0.809332f, 0.809220f, 0.809107f, 0.808994f, 0.808882f, 0.808769f,
+ 0.808656f, 0.808543f, 0.808430f, 0.808318f, 0.808205f, 0.808092f, 0.807979f, 0.807866f,
+ 0.807753f, 0.807640f, 0.807527f, 0.807414f, 0.807300f, 0.807187f, 0.807074f, 0.806961f,
+ 0.806848f, 0.806734f, 0.806621f, 0.806508f, 0.806394f, 0.806281f, 0.806167f, 0.806054f,
+ 0.805940f, 0.805827f, 0.805713f, 0.805600f, 0.805486f, 0.805372f, 0.805259f, 0.805145f,
+ 0.805031f, 0.804918f, 0.804804f, 0.804690f, 0.804576f, 0.804462f, 0.804348f, 0.804234f,
+ 0.804120f, 0.804006f, 0.803892f, 0.803778f, 0.803664f, 0.803550f, 0.803436f, 0.803322f,
+ 0.803208f, 0.803093f, 0.802979f, 0.802865f, 0.802750f, 0.802636f, 0.802522f, 0.802407f,
+ 0.802293f, 0.802178f, 0.802064f, 0.801949f, 0.801835f, 0.801720f, 0.801606f, 0.801491f,
+ 0.801376f, 0.801261f, 0.801147f, 0.801032f, 0.800917f, 0.800802f, 0.800687f, 0.800573f,
+ 0.800458f, 0.800343f, 0.800228f, 0.800113f, 0.799998f, 0.799883f, 0.799768f, 0.799652f,
+ 0.799537f, 0.799422f, 0.799307f, 0.799192f, 0.799076f, 0.798961f, 0.798846f, 0.798730f,
+ 0.798615f, 0.798500f, 0.798384f, 0.798269f, 0.798153f, 0.798038f, 0.797922f, 0.797806f,
+ 0.797691f, 0.797575f, 0.797459f, 0.797344f, 0.797228f, 0.797112f, 0.796996f, 0.796881f,
+ 0.796765f, 0.796649f, 0.796533f, 0.796417f, 0.796301f, 0.796185f, 0.796069f, 0.795953f,
+ 0.795837f, 0.795721f, 0.795605f, 0.795488f, 0.795372f, 0.795256f, 0.795140f, 0.795023f,
+ 0.794907f, 0.794791f, 0.794674f, 0.794558f, 0.794442f, 0.794325f, 0.794209f, 0.794092f,
+ 0.793975f, 0.793859f, 0.793742f, 0.793626f, 0.793509f, 0.793392f, 0.793276f, 0.793159f,
+ 0.793042f, 0.792925f, 0.792808f, 0.792691f, 0.792575f, 0.792458f, 0.792341f, 0.792224f,
+ 0.792107f, 0.791990f, 0.791872f, 0.791755f, 0.791638f, 0.791521f, 0.791404f, 0.791287f,
+ 0.791169f, 0.791052f, 0.790935f, 0.790817f, 0.790700f, 0.790583f, 0.790465f, 0.790348f,
+ 0.790230f, 0.790113f, 0.789995f, 0.789878f, 0.789760f, 0.789642f, 0.789525f, 0.789407f,
+ 0.789289f, 0.789172f, 0.789054f, 0.788936f, 0.788818f, 0.788700f, 0.788582f, 0.788464f,
+ 0.788346f, 0.788228f, 0.788110f, 0.787992f, 0.787874f, 0.787756f, 0.787638f, 0.787520f,
+ 0.787402f, 0.787284f, 0.787165f, 0.787047f, 0.786929f, 0.786810f, 0.786692f, 0.786574f,
+ 0.786455f, 0.786337f, 0.786218f, 0.786100f, 0.785981f, 0.785863f, 0.785744f, 0.785625f,
+ 0.785507f, 0.785388f, 0.785269f, 0.785151f, 0.785032f, 0.784913f, 0.784794f, 0.784675f,
+ 0.784557f, 0.784438f, 0.784319f, 0.784200f, 0.784081f, 0.783962f, 0.783843f, 0.783724f,
+ 0.783605f, 0.783485f, 0.783366f, 0.783247f, 0.783128f, 0.783009f, 0.782889f, 0.782770f,
+ 0.782651f, 0.782531f, 0.782412f, 0.782292f, 0.782173f, 0.782053f, 0.781934f, 0.781814f,
+ 0.781695f, 0.781575f, 0.781456f, 0.781336f, 0.781216f, 0.781097f, 0.780977f, 0.780857f,
+ 0.780737f, 0.780617f, 0.780498f, 0.780378f, 0.780258f, 0.780138f, 0.780018f, 0.779898f,
+ 0.779778f, 0.779658f, 0.779538f, 0.779418f, 0.779297f, 0.779177f, 0.779057f, 0.778937f,
+ 0.778817f, 0.778696f, 0.778576f, 0.778456f, 0.778335f, 0.778215f, 0.778094f, 0.777974f,
+ 0.777853f, 0.777733f, 0.777612f, 0.777492f, 0.777371f, 0.777251f, 0.777130f, 0.777009f,
+ 0.776888f, 0.776768f, 0.776647f, 0.776526f, 0.776405f, 0.776284f, 0.776164f, 0.776043f,
+ 0.775922f, 0.775801f, 0.775680f, 0.775559f, 0.775438f, 0.775317f, 0.775195f, 0.775074f,
+ 0.774953f, 0.774832f, 0.774711f, 0.774589f, 0.774468f, 0.774347f, 0.774225f, 0.774104f,
+ 0.773983f, 0.773861f, 0.773740f, 0.773618f, 0.773497f, 0.773375f, 0.773254f, 0.773132f,
+ 0.773010f, 0.772889f, 0.772767f, 0.772645f, 0.772524f, 0.772402f, 0.772280f, 0.772158f,
+ 0.772036f, 0.771915f, 0.771793f, 0.771671f, 0.771549f, 0.771427f, 0.771305f, 0.771183f,
+ 0.771061f, 0.770938f, 0.770816f, 0.770694f, 0.770572f, 0.770450f, 0.770327f, 0.770205f,
+ 0.770083f, 0.769961f, 0.769838f, 0.769716f, 0.769593f, 0.769471f, 0.769348f, 0.769226f,
+ 0.769103f, 0.768981f, 0.768858f, 0.768736f, 0.768613f, 0.768490f, 0.768368f, 0.768245f,
+ 0.768122f, 0.767999f, 0.767876f, 0.767754f, 0.767631f, 0.767508f, 0.767385f, 0.767262f,
+ 0.767139f, 0.767016f, 0.766893f, 0.766770f, 0.766647f, 0.766524f, 0.766400f, 0.766277f,
+ 0.766154f, 0.766031f, 0.765907f, 0.765784f, 0.765661f, 0.765538f, 0.765414f, 0.765291f,
+ 0.765167f, 0.765044f, 0.764920f, 0.764797f, 0.764673f, 0.764550f, 0.764426f, 0.764302f,
+ 0.764179f, 0.764055f, 0.763931f, 0.763808f, 0.763684f, 0.763560f, 0.763436f, 0.763312f,
+ 0.763188f, 0.763065f, 0.762941f, 0.762817f, 0.762693f, 0.762569f, 0.762444f, 0.762320f,
+ 0.762196f, 0.762072f, 0.761948f, 0.761824f, 0.761700f, 0.761575f, 0.761451f, 0.761327f,
+ 0.761202f, 0.761078f, 0.760954f, 0.760829f, 0.760705f, 0.760580f, 0.760456f, 0.760331f,
+ 0.760207f, 0.760082f, 0.759957f, 0.759833f, 0.759708f, 0.759583f, 0.759459f, 0.759334f,
+ 0.759209f, 0.759084f, 0.758960f, 0.758835f, 0.758710f, 0.758585f, 0.758460f, 0.758335f,
+ 0.758210f, 0.758085f, 0.757960f, 0.757835f, 0.757710f, 0.757584f, 0.757459f, 0.757334f,
+ 0.757209f, 0.757084f, 0.756958f, 0.756833f, 0.756708f, 0.756582f, 0.756457f, 0.756331f,
+ 0.756206f, 0.756081f, 0.755955f, 0.755829f, 0.755704f, 0.755578f, 0.755453f, 0.755327f,
+ 0.755201f, 0.755076f, 0.754950f, 0.754824f, 0.754698f, 0.754573f, 0.754447f, 0.754321f,
+ 0.754195f, 0.754069f, 0.753943f, 0.753817f, 0.753691f, 0.753565f, 0.753439f, 0.753313f,
+ 0.753187f, 0.753061f, 0.752934f, 0.752808f, 0.752682f, 0.752556f, 0.752429f, 0.752303f,
+ 0.752177f, 0.752050f, 0.751924f, 0.751798f, 0.751671f, 0.751545f, 0.751418f, 0.751292f,
+ 0.751165f, 0.751039f, 0.750912f, 0.750785f, 0.750659f, 0.750532f, 0.750405f, 0.750278f,
+ 0.750152f, 0.750025f, 0.749898f, 0.749771f, 0.749644f, 0.749517f, 0.749390f, 0.749263f,
+ 0.749136f, 0.749009f, 0.748882f, 0.748755f, 0.748628f, 0.748501f, 0.748374f, 0.748247f,
+ 0.748119f, 0.747992f, 0.747865f, 0.747738f, 0.747610f, 0.747483f, 0.747355f, 0.747228f,
+ 0.747101f, 0.746973f, 0.746846f, 0.746718f, 0.746591f, 0.746463f, 0.746335f, 0.746208f,
+ 0.746080f, 0.745952f, 0.745825f, 0.745697f, 0.745569f, 0.745441f, 0.745314f, 0.745186f,
+ 0.745058f, 0.744930f, 0.744802f, 0.744674f, 0.744546f, 0.744418f, 0.744290f, 0.744162f,
+ 0.744034f, 0.743906f, 0.743777f, 0.743649f, 0.743521f, 0.743393f, 0.743265f, 0.743136f,
+ 0.743008f, 0.742880f, 0.742751f, 0.742623f, 0.742494f, 0.742366f, 0.742237f, 0.742109f,
+ 0.741980f, 0.741852f, 0.741723f, 0.741595f, 0.741466f, 0.741337f, 0.741209f, 0.741080f,
+ 0.740951f, 0.740822f, 0.740694f, 0.740565f, 0.740436f, 0.740307f, 0.740178f, 0.740049f,
+ 0.739920f, 0.739791f, 0.739662f, 0.739533f, 0.739404f, 0.739275f, 0.739146f, 0.739017f,
+ 0.738887f, 0.738758f, 0.738629f, 0.738500f, 0.738370f, 0.738241f, 0.738112f, 0.737982f,
+ 0.737853f, 0.737723f, 0.737594f, 0.737464f, 0.737335f, 0.737205f, 0.737076f, 0.736946f,
+ 0.736817f, 0.736687f, 0.736557f, 0.736428f, 0.736298f, 0.736168f, 0.736038f, 0.735908f,
+ 0.735779f, 0.735649f, 0.735519f, 0.735389f, 0.735259f, 0.735129f, 0.734999f, 0.734869f,
+ 0.734739f, 0.734609f, 0.734479f, 0.734349f, 0.734218f, 0.734088f, 0.733958f, 0.733828f,
+ 0.733697f, 0.733567f, 0.733437f, 0.733306f, 0.733176f, 0.733046f, 0.732915f, 0.732785f,
+ 0.732654f, 0.732524f, 0.732393f, 0.732263f, 0.732132f, 0.732001f, 0.731871f, 0.731740f,
+ 0.731609f, 0.731479f, 0.731348f, 0.731217f, 0.731086f, 0.730955f, 0.730825f, 0.730694f,
+ 0.730563f, 0.730432f, 0.730301f, 0.730170f, 0.730039f, 0.729908f, 0.729777f, 0.729646f,
+ 0.729514f, 0.729383f, 0.729252f, 0.729121f, 0.728990f, 0.728858f, 0.728727f, 0.728596f,
+ 0.728464f, 0.728333f, 0.728202f, 0.728070f, 0.727939f, 0.727807f, 0.727676f, 0.727544f,
+ 0.727413f, 0.727281f, 0.727149f, 0.727018f, 0.726886f, 0.726754f, 0.726623f, 0.726491f,
+ 0.726359f, 0.726227f, 0.726095f, 0.725964f, 0.725832f, 0.725700f, 0.725568f, 0.725436f,
+ 0.725304f, 0.725172f, 0.725040f, 0.724908f, 0.724776f, 0.724644f, 0.724511f, 0.724379f,
+ 0.724247f, 0.724115f, 0.723983f, 0.723850f, 0.723718f, 0.723586f, 0.723453f, 0.723321f,
+ 0.723188f, 0.723056f, 0.722924f, 0.722791f, 0.722659f, 0.722526f, 0.722393f, 0.722261f,
+ 0.722128f, 0.721996f, 0.721863f, 0.721730f, 0.721597f, 0.721465f, 0.721332f, 0.721199f,
+ 0.721066f, 0.720933f, 0.720800f, 0.720668f, 0.720535f, 0.720402f, 0.720269f, 0.720136f,
+ 0.720003f, 0.719869f, 0.719736f, 0.719603f, 0.719470f, 0.719337f, 0.719204f, 0.719070f,
+ 0.718937f, 0.718804f, 0.718670f, 0.718537f, 0.718404f, 0.718270f, 0.718137f, 0.718004f,
+ 0.717870f, 0.717737f, 0.717603f, 0.717469f, 0.717336f, 0.717202f, 0.717069f, 0.716935f,
+ 0.716801f, 0.716668f, 0.716534f, 0.716400f, 0.716266f, 0.716132f, 0.715999f, 0.715865f,
+ 0.715731f, 0.715597f, 0.715463f, 0.715329f, 0.715195f, 0.715061f, 0.714927f, 0.714793f,
+ 0.714659f, 0.714525f, 0.714390f, 0.714256f, 0.714122f, 0.713988f, 0.713853f, 0.713719f,
+ 0.713585f, 0.713451f, 0.713316f, 0.713182f, 0.713047f, 0.712913f, 0.712778f, 0.712644f,
+ 0.712509f, 0.712375f, 0.712240f, 0.712106f, 0.711971f, 0.711836f, 0.711702f, 0.711567f,
+ 0.711432f, 0.711297f, 0.711163f, 0.711028f, 0.710893f, 0.710758f, 0.710623f, 0.710488f,
+ 0.710353f, 0.710218f, 0.710083f, 0.709948f, 0.709813f, 0.709678f, 0.709543f, 0.709408f,
+ 0.709273f, 0.709138f, 0.709002f, 0.708867f, 0.708732f, 0.708597f, 0.708461f, 0.708326f,
+ 0.708191f, 0.708055f, 0.707920f, 0.707784f, 0.707649f, 0.707513f, 0.707378f, 0.707242f,
+ 0.707107f, 0.706971f, 0.706836f, 0.706700f, 0.706564f, 0.706429f, 0.706293f, 0.706157f,
+ 0.706021f, 0.705885f, 0.705750f, 0.705614f, 0.705478f, 0.705342f, 0.705206f, 0.705070f,
+ 0.704934f, 0.704798f, 0.704662f, 0.704526f, 0.704390f, 0.704254f, 0.704118f, 0.703981f,
+ 0.703845f, 0.703709f, 0.703573f, 0.703436f, 0.703300f, 0.703164f, 0.703028f, 0.702891f,
+ 0.702755f, 0.702618f, 0.702482f, 0.702345f, 0.702209f, 0.702072f, 0.701936f, 0.701799f,
+ 0.701663f, 0.701526f, 0.701389f, 0.701253f, 0.701116f, 0.700979f, 0.700842f, 0.700706f,
+ 0.700569f, 0.700432f, 0.700295f, 0.700158f, 0.700021f, 0.699884f, 0.699747f, 0.699610f,
+ 0.699473f, 0.699336f, 0.699199f, 0.699062f, 0.698925f, 0.698788f, 0.698651f, 0.698513f,
+ 0.698376f, 0.698239f, 0.698102f, 0.697964f, 0.697827f, 0.697690f, 0.697552f, 0.697415f,
+ 0.697277f, 0.697140f, 0.697003f, 0.696865f, 0.696728f, 0.696590f, 0.696452f, 0.696315f,
+ 0.696177f, 0.696039f, 0.695902f, 0.695764f, 0.695626f, 0.695489f, 0.695351f, 0.695213f,
+ 0.695075f, 0.694937f, 0.694799f, 0.694661f, 0.694524f, 0.694386f, 0.694248f, 0.694109f,
+ 0.693971f, 0.693833f, 0.693695f, 0.693557f, 0.693419f, 0.693281f, 0.693143f, 0.693004f,
+ 0.692866f, 0.692728f, 0.692590f, 0.692451f, 0.692313f, 0.692175f, 0.692036f, 0.691898f,
+ 0.691759f, 0.691621f, 0.691482f, 0.691344f, 0.691205f, 0.691067f, 0.690928f, 0.690789f,
+ 0.690651f, 0.690512f, 0.690373f, 0.690235f, 0.690096f, 0.689957f, 0.689818f, 0.689679f,
+ 0.689541f, 0.689402f, 0.689263f, 0.689124f, 0.688985f, 0.688846f, 0.688707f, 0.688568f,
+ 0.688429f, 0.688290f, 0.688151f, 0.688011f, 0.687872f, 0.687733f, 0.687594f, 0.687455f,
+ 0.687315f, 0.687176f, 0.687037f, 0.686897f, 0.686758f, 0.686619f, 0.686479f, 0.686340f,
+ 0.686200f, 0.686061f, 0.685921f, 0.685782f, 0.685642f, 0.685503f, 0.685363f, 0.685223f,
+ 0.685084f, 0.684944f, 0.684804f, 0.684664f, 0.684525f, 0.684385f, 0.684245f, 0.684105f,
+ 0.683965f, 0.683825f, 0.683686f, 0.683546f, 0.683406f, 0.683266f, 0.683126f, 0.682986f,
+ 0.682846f, 0.682705f, 0.682565f, 0.682425f, 0.682285f, 0.682145f, 0.682005f, 0.681864f,
+ 0.681724f, 0.681584f, 0.681443f, 0.681303f, 0.681163f, 0.681022f, 0.680882f, 0.680741f,
+ 0.680601f, 0.680461f, 0.680320f, 0.680179f, 0.680039f, 0.679898f, 0.679758f, 0.679617f,
+ 0.679476f, 0.679336f, 0.679195f, 0.679054f, 0.678913f, 0.678773f, 0.678632f, 0.678491f,
+ 0.678350f, 0.678209f, 0.678068f, 0.677927f, 0.677786f, 0.677645f, 0.677504f, 0.677363f,
+ 0.677222f, 0.677081f, 0.676940f, 0.676799f, 0.676658f, 0.676516f, 0.676375f, 0.676234f,
+ 0.676093f, 0.675951f, 0.675810f, 0.675669f, 0.675527f, 0.675386f, 0.675245f, 0.675103f,
+ 0.674962f, 0.674820f, 0.674679f, 0.674537f, 0.674396f, 0.674254f, 0.674112f, 0.673971f,
+ 0.673829f, 0.673687f, 0.673546f, 0.673404f, 0.673262f, 0.673120f, 0.672978f, 0.672837f,
+ 0.672695f, 0.672553f, 0.672411f, 0.672269f, 0.672127f, 0.671985f, 0.671843f, 0.671701f,
+ 0.671559f, 0.671417f, 0.671275f, 0.671133f, 0.670990f, 0.670848f, 0.670706f, 0.670564f,
+ 0.670422f, 0.670279f, 0.670137f, 0.669995f, 0.669852f, 0.669710f, 0.669567f, 0.669425f,
+ 0.669283f, 0.669140f, 0.668998f, 0.668855f, 0.668712f, 0.668570f, 0.668427f, 0.668285f,
+ 0.668142f, 0.667999f, 0.667857f, 0.667714f, 0.667571f, 0.667428f, 0.667286f, 0.667143f,
+ 0.667000f, 0.666857f, 0.666714f, 0.666571f, 0.666428f, 0.666285f, 0.666142f, 0.665999f,
+ 0.665856f, 0.665713f, 0.665570f, 0.665427f, 0.665284f, 0.665141f, 0.664997f, 0.664854f,
+ 0.664711f, 0.664568f, 0.664424f, 0.664281f, 0.664138f, 0.663994f, 0.663851f, 0.663708f,
+ 0.663564f, 0.663421f, 0.663277f, 0.663134f, 0.662990f, 0.662847f, 0.662703f, 0.662559f,
+ 0.662416f, 0.662272f, 0.662128f, 0.661985f, 0.661841f, 0.661697f, 0.661553f, 0.661410f,
+ 0.661266f, 0.661122f, 0.660978f, 0.660834f, 0.660690f, 0.660546f, 0.660402f, 0.660258f,
+ 0.660114f, 0.659970f, 0.659826f, 0.659682f, 0.659538f, 0.659394f, 0.659250f, 0.659105f,
+ 0.658961f, 0.658817f, 0.658673f, 0.658529f, 0.658384f, 0.658240f, 0.658095f, 0.657951f,
+ 0.657807f, 0.657662f, 0.657518f, 0.657373f, 0.657229f, 0.657084f, 0.656940f, 0.656795f,
+ 0.656651f, 0.656506f, 0.656361f, 0.656217f, 0.656072f, 0.655927f, 0.655782f, 0.655638f,
+ 0.655493f, 0.655348f, 0.655203f, 0.655058f, 0.654913f, 0.654769f, 0.654624f, 0.654479f,
+ 0.654334f, 0.654189f, 0.654044f, 0.653899f, 0.653753f, 0.653608f, 0.653463f, 0.653318f,
+ 0.653173f, 0.653028f, 0.652882f, 0.652737f, 0.652592f, 0.652447f, 0.652301f, 0.652156f,
+ 0.652011f, 0.651865f, 0.651720f, 0.651574f, 0.651429f, 0.651283f, 0.651138f, 0.650992f,
+ 0.650847f, 0.650701f, 0.650555f, 0.650410f, 0.650264f, 0.650119f, 0.649973f, 0.649827f,
+ 0.649681f, 0.649536f, 0.649390f, 0.649244f, 0.649098f, 0.648952f, 0.648806f, 0.648660f,
+ 0.648514f, 0.648368f, 0.648222f, 0.648076f, 0.647930f, 0.647784f, 0.647638f, 0.647492f,
+ 0.647346f, 0.647200f, 0.647054f, 0.646907f, 0.646761f, 0.646615f, 0.646469f, 0.646322f,
+ 0.646176f, 0.646030f, 0.645883f, 0.645737f, 0.645590f, 0.645444f, 0.645298f, 0.645151f,
+ 0.645005f, 0.644858f, 0.644711f, 0.644565f, 0.644418f, 0.644272f, 0.644125f, 0.643978f,
+ 0.643832f, 0.643685f, 0.643538f, 0.643391f, 0.643245f, 0.643098f, 0.642951f, 0.642804f,
+ 0.642657f, 0.642510f, 0.642363f, 0.642216f, 0.642069f, 0.641922f, 0.641775f, 0.641628f,
+ 0.641481f, 0.641334f, 0.641187f, 0.641040f, 0.640892f, 0.640745f, 0.640598f, 0.640451f,
+ 0.640303f, 0.640156f, 0.640009f, 0.639862f, 0.639714f, 0.639567f, 0.639419f, 0.639272f,
+ 0.639124f, 0.638977f, 0.638829f, 0.638682f, 0.638534f, 0.638387f, 0.638239f, 0.638092f,
+ 0.637944f, 0.637796f, 0.637649f, 0.637501f, 0.637353f, 0.637205f, 0.637057f, 0.636910f,
+ 0.636762f, 0.636614f, 0.636466f, 0.636318f, 0.636170f, 0.636022f, 0.635874f, 0.635726f,
+ 0.635578f, 0.635430f, 0.635282f, 0.635134f, 0.634986f, 0.634838f, 0.634690f, 0.634542f,
+ 0.634393f, 0.634245f, 0.634097f, 0.633949f, 0.633800f, 0.633652f, 0.633504f, 0.633355f,
+ 0.633207f, 0.633058f, 0.632910f, 0.632761f, 0.632613f, 0.632464f, 0.632316f, 0.632167f,
+ 0.632019f, 0.631870f, 0.631721f, 0.631573f, 0.631424f, 0.631275f, 0.631127f, 0.630978f,
+ 0.630829f, 0.630680f, 0.630532f, 0.630383f, 0.630234f, 0.630085f, 0.629936f, 0.629787f,
+ 0.629638f, 0.629489f, 0.629340f, 0.629191f, 0.629042f, 0.628893f, 0.628744f, 0.628595f,
+ 0.628446f, 0.628297f, 0.628147f, 0.627998f, 0.627849f, 0.627700f, 0.627550f, 0.627401f,
+ 0.627252f, 0.627102f, 0.626953f, 0.626804f, 0.626654f, 0.626505f, 0.626355f, 0.626206f,
+ 0.626056f, 0.625907f, 0.625757f, 0.625608f, 0.625458f, 0.625309f, 0.625159f, 0.625009f,
+ 0.624860f, 0.624710f, 0.624560f, 0.624410f, 0.624260f, 0.624111f, 0.623961f, 0.623811f,
+ 0.623661f, 0.623511f, 0.623361f, 0.623211f, 0.623061f, 0.622911f, 0.622761f, 0.622611f,
+ 0.622461f, 0.622311f, 0.622161f, 0.622011f, 0.621861f, 0.621711f, 0.621560f, 0.621410f,
+ 0.621260f, 0.621110f, 0.620959f, 0.620809f, 0.620659f, 0.620508f, 0.620358f, 0.620208f,
+ 0.620057f, 0.619907f, 0.619756f, 0.619606f, 0.619455f, 0.619305f, 0.619154f, 0.619004f,
+ 0.618853f, 0.618702f, 0.618552f, 0.618401f, 0.618250f, 0.618100f, 0.617949f, 0.617798f,
+ 0.617647f, 0.617496f, 0.617346f, 0.617195f, 0.617044f, 0.616893f, 0.616742f, 0.616591f,
+ 0.616440f, 0.616289f, 0.616138f, 0.615987f, 0.615836f, 0.615685f, 0.615534f, 0.615383f,
+ 0.615232f, 0.615080f, 0.614929f, 0.614778f, 0.614627f, 0.614475f, 0.614324f, 0.614173f,
+ 0.614022f, 0.613870f, 0.613719f, 0.613567f, 0.613416f, 0.613265f, 0.613113f, 0.612962f,
+ 0.612810f, 0.612659f, 0.612507f, 0.612355f, 0.612204f, 0.612052f, 0.611901f, 0.611749f,
+ 0.611597f, 0.611445f, 0.611294f, 0.611142f, 0.610990f, 0.610838f, 0.610687f, 0.610535f,
+ 0.610383f, 0.610231f, 0.610079f, 0.609927f, 0.609775f, 0.609623f, 0.609471f, 0.609319f,
+ 0.609167f, 0.609015f, 0.608863f, 0.608711f, 0.608559f, 0.608406f, 0.608254f, 0.608102f,
+ 0.607950f, 0.607798f, 0.607645f, 0.607493f, 0.607341f, 0.607188f, 0.607036f, 0.606884f,
+ 0.606731f, 0.606579f, 0.606426f, 0.606274f, 0.606121f, 0.605969f, 0.605816f, 0.605664f,
+ 0.605511f, 0.605358f, 0.605206f, 0.605053f, 0.604900f, 0.604748f, 0.604595f, 0.604442f,
+ 0.604290f, 0.604137f, 0.603984f, 0.603831f, 0.603678f, 0.603525f, 0.603372f, 0.603220f,
+ 0.603067f, 0.602914f, 0.602761f, 0.602608f, 0.602455f, 0.602302f, 0.602148f, 0.601995f,
+ 0.601842f, 0.601689f, 0.601536f, 0.601383f, 0.601230f, 0.601076f, 0.600923f, 0.600770f,
+ 0.600616f, 0.600463f, 0.600310f, 0.600156f, 0.600003f, 0.599850f, 0.599696f, 0.599543f,
+ 0.599389f, 0.599236f, 0.599082f, 0.598929f, 0.598775f, 0.598622f, 0.598468f, 0.598314f,
+ 0.598161f, 0.598007f, 0.597853f, 0.597700f, 0.597546f, 0.597392f, 0.597238f, 0.597085f,
+ 0.596931f, 0.596777f, 0.596623f, 0.596469f, 0.596315f, 0.596161f, 0.596007f, 0.595853f,
+ 0.595699f, 0.595545f, 0.595391f, 0.595237f, 0.595083f, 0.594929f, 0.594775f, 0.594621f,
+ 0.594467f, 0.594312f, 0.594158f, 0.594004f, 0.593850f, 0.593695f, 0.593541f, 0.593387f,
+ 0.593232f, 0.593078f, 0.592924f, 0.592769f, 0.592615f, 0.592460f, 0.592306f, 0.592151f,
+ 0.591997f, 0.591842f, 0.591688f, 0.591533f, 0.591378f, 0.591224f, 0.591069f, 0.590914f,
+ 0.590760f, 0.590605f, 0.590450f, 0.590295f, 0.590141f, 0.589986f, 0.589831f, 0.589676f,
+ 0.589521f, 0.589366f, 0.589212f, 0.589057f, 0.588902f, 0.588747f, 0.588592f, 0.588437f,
+ 0.588282f, 0.588126f, 0.587971f, 0.587816f, 0.587661f, 0.587506f, 0.587351f, 0.587196f,
+ 0.587040f, 0.586885f, 0.586730f, 0.586575f, 0.586419f, 0.586264f, 0.586109f, 0.585953f,
+ 0.585798f, 0.585642f, 0.585487f, 0.585332f, 0.585176f, 0.585021f, 0.584865f, 0.584710f,
+ 0.584554f, 0.584398f, 0.584243f, 0.584087f, 0.583931f, 0.583776f, 0.583620f, 0.583464f,
+ 0.583309f, 0.583153f, 0.582997f, 0.582841f, 0.582685f, 0.582530f, 0.582374f, 0.582218f,
+ 0.582062f, 0.581906f, 0.581750f, 0.581594f, 0.581438f, 0.581282f, 0.581126f, 0.580970f,
+ 0.580814f, 0.580658f, 0.580502f, 0.580346f, 0.580189f, 0.580033f, 0.579877f, 0.579721f,
+ 0.579565f, 0.579408f, 0.579252f, 0.579096f, 0.578939f, 0.578783f, 0.578627f, 0.578470f,
+ 0.578314f, 0.578157f, 0.578001f, 0.577844f, 0.577688f, 0.577531f, 0.577375f, 0.577218f,
+ 0.577062f, 0.576905f, 0.576748f, 0.576592f, 0.576435f, 0.576278f, 0.576122f, 0.575965f,
+ 0.575808f, 0.575651f, 0.575495f, 0.575338f, 0.575181f, 0.575024f, 0.574867f, 0.574710f,
+ 0.574553f, 0.574396f, 0.574239f, 0.574082f, 0.573925f, 0.573768f, 0.573611f, 0.573454f,
+ 0.573297f, 0.573140f, 0.572983f, 0.572826f, 0.572669f, 0.572511f, 0.572354f, 0.572197f,
+ 0.572040f, 0.571882f, 0.571725f, 0.571568f, 0.571410f, 0.571253f, 0.571096f, 0.570938f,
+ 0.570781f, 0.570623f, 0.570466f, 0.570308f, 0.570151f, 0.569993f, 0.569836f, 0.569678f,
+ 0.569521f, 0.569363f, 0.569205f, 0.569048f, 0.568890f, 0.568732f, 0.568574f, 0.568417f,
+ 0.568259f, 0.568101f, 0.567943f, 0.567786f, 0.567628f, 0.567470f, 0.567312f, 0.567154f,
+ 0.566996f, 0.566838f, 0.566680f, 0.566522f, 0.566364f, 0.566206f, 0.566048f, 0.565890f,
+ 0.565732f, 0.565574f, 0.565416f, 0.565257f, 0.565099f, 0.564941f, 0.564783f, 0.564624f,
+ 0.564466f, 0.564308f, 0.564150f, 0.563991f, 0.563833f, 0.563675f, 0.563516f, 0.563358f,
+ 0.563199f, 0.563041f, 0.562882f, 0.562724f, 0.562565f, 0.562407f, 0.562248f, 0.562090f,
+ 0.561931f, 0.561773f, 0.561614f, 0.561455f, 0.561297f, 0.561138f, 0.560979f, 0.560820f,
+ 0.560662f, 0.560503f, 0.560344f, 0.560185f, 0.560026f, 0.559867f, 0.559709f, 0.559550f,
+ 0.559391f, 0.559232f, 0.559073f, 0.558914f, 0.558755f, 0.558596f, 0.558437f, 0.558278f,
+ 0.558119f, 0.557959f, 0.557800f, 0.557641f, 0.557482f, 0.557323f, 0.557164f, 0.557004f,
+ 0.556845f, 0.556686f, 0.556526f, 0.556367f, 0.556208f, 0.556048f, 0.555889f, 0.555730f,
+ 0.555570f, 0.555411f, 0.555251f, 0.555092f, 0.554932f, 0.554773f, 0.554613f, 0.554454f,
+ 0.554294f, 0.554134f, 0.553975f, 0.553815f, 0.553656f, 0.553496f, 0.553336f, 0.553176f,
+ 0.553017f, 0.552857f, 0.552697f, 0.552537f, 0.552378f, 0.552218f, 0.552058f, 0.551898f,
+ 0.551738f, 0.551578f, 0.551418f, 0.551258f, 0.551098f, 0.550938f, 0.550778f, 0.550618f,
+ 0.550458f, 0.550298f, 0.550138f, 0.549978f, 0.549818f, 0.549657f, 0.549497f, 0.549337f,
+ 0.549177f, 0.549016f, 0.548856f, 0.548696f, 0.548536f, 0.548375f, 0.548215f, 0.548054f,
+ 0.547894f, 0.547734f, 0.547573f, 0.547413f, 0.547252f, 0.547092f, 0.546931f, 0.546771f,
+ 0.546610f, 0.546450f, 0.546289f, 0.546128f, 0.545968f, 0.545807f, 0.545646f, 0.545486f,
+ 0.545325f, 0.545164f, 0.545003f, 0.544843f, 0.544682f, 0.544521f, 0.544360f, 0.544199f,
+ 0.544039f, 0.543878f, 0.543717f, 0.543556f, 0.543395f, 0.543234f, 0.543073f, 0.542912f,
+ 0.542751f, 0.542590f, 0.542429f, 0.542268f, 0.542106f, 0.541945f, 0.541784f, 0.541623f,
+ 0.541462f, 0.541301f, 0.541139f, 0.540978f, 0.540817f, 0.540655f, 0.540494f, 0.540333f,
+ 0.540171f, 0.540010f, 0.539849f, 0.539687f, 0.539526f, 0.539364f, 0.539203f, 0.539041f,
+ 0.538880f, 0.538718f, 0.538557f, 0.538395f, 0.538234f, 0.538072f, 0.537910f, 0.537749f,
+ 0.537587f, 0.537425f, 0.537264f, 0.537102f, 0.536940f, 0.536778f, 0.536617f, 0.536455f,
+ 0.536293f, 0.536131f, 0.535969f, 0.535807f, 0.535645f, 0.535484f, 0.535322f, 0.535160f,
+ 0.534998f, 0.534836f, 0.534674f, 0.534512f, 0.534349f, 0.534187f, 0.534025f, 0.533863f,
+ 0.533701f, 0.533539f, 0.533377f, 0.533214f, 0.533052f, 0.532890f, 0.532728f, 0.532565f,
+ 0.532403f, 0.532241f, 0.532078f, 0.531916f, 0.531754f, 0.531591f, 0.531429f, 0.531266f,
+ 0.531104f, 0.530942f, 0.530779f, 0.530617f, 0.530454f, 0.530291f, 0.530129f, 0.529966f,
+ 0.529804f, 0.529641f, 0.529478f, 0.529316f, 0.529153f, 0.528990f, 0.528828f, 0.528665f,
+ 0.528502f, 0.528339f, 0.528176f, 0.528014f, 0.527851f, 0.527688f, 0.527525f, 0.527362f,
+ 0.527199f, 0.527036f, 0.526873f, 0.526710f, 0.526547f, 0.526384f, 0.526221f, 0.526058f,
+ 0.525895f, 0.525732f, 0.525569f, 0.525406f, 0.525243f, 0.525079f, 0.524916f, 0.524753f,
+ 0.524590f, 0.524426f, 0.524263f, 0.524100f, 0.523937f, 0.523773f, 0.523610f, 0.523447f,
+ 0.523283f, 0.523120f, 0.522956f, 0.522793f, 0.522629f, 0.522466f, 0.522302f, 0.522139f,
+ 0.521975f, 0.521812f, 0.521648f, 0.521485f, 0.521321f, 0.521157f, 0.520994f, 0.520830f,
+ 0.520666f, 0.520503f, 0.520339f, 0.520175f, 0.520011f, 0.519848f, 0.519684f, 0.519520f,
+ 0.519356f, 0.519192f, 0.519028f, 0.518864f, 0.518700f, 0.518536f, 0.518372f, 0.518209f,
+ 0.518045f, 0.517880f, 0.517716f, 0.517552f, 0.517388f, 0.517224f, 0.517060f, 0.516896f,
+ 0.516732f, 0.516568f, 0.516403f, 0.516239f, 0.516075f, 0.515911f, 0.515746f, 0.515582f,
+ 0.515418f, 0.515254f, 0.515089f, 0.514925f, 0.514760f, 0.514596f, 0.514432f, 0.514267f,
+ 0.514103f, 0.513938f, 0.513774f, 0.513609f, 0.513445f, 0.513280f, 0.513116f, 0.512951f,
+ 0.512786f, 0.512622f, 0.512457f, 0.512292f, 0.512128f, 0.511963f, 0.511798f, 0.511634f,
+ 0.511469f, 0.511304f, 0.511139f, 0.510974f, 0.510810f, 0.510645f, 0.510480f, 0.510315f,
+ 0.510150f, 0.509985f, 0.509820f, 0.509655f, 0.509490f, 0.509325f, 0.509160f, 0.508995f,
+ 0.508830f, 0.508665f, 0.508500f, 0.508335f, 0.508170f, 0.508005f, 0.507839f, 0.507674f,
+ 0.507509f, 0.507344f, 0.507179f, 0.507013f, 0.506848f, 0.506683f, 0.506517f, 0.506352f,
+ 0.506187f, 0.506021f, 0.505856f, 0.505690f, 0.505525f, 0.505360f, 0.505194f, 0.505029f,
+ 0.504863f, 0.504698f, 0.504532f, 0.504366f, 0.504201f, 0.504035f, 0.503870f, 0.503704f,
+ 0.503538f, 0.503373f, 0.503207f, 0.503041f, 0.502876f, 0.502710f, 0.502544f, 0.502378f,
+ 0.502212f, 0.502047f, 0.501881f, 0.501715f, 0.501549f, 0.501383f, 0.501217f, 0.501051f,
+ 0.500885f, 0.500719f, 0.500553f, 0.500387f, 0.500221f, 0.500055f, 0.499889f, 0.499723f,
+ 0.499557f, 0.499391f, 0.499225f, 0.499059f, 0.498893f, 0.498726f, 0.498560f, 0.498394f,
+ 0.498228f, 0.498061f, 0.497895f, 0.497729f, 0.497562f, 0.497396f, 0.497230f, 0.497063f,
+ 0.496897f, 0.496731f, 0.496564f, 0.496398f, 0.496231f, 0.496065f, 0.495898f, 0.495732f,
+ 0.495565f, 0.495399f, 0.495232f, 0.495066f, 0.494899f, 0.494732f, 0.494566f, 0.494399f,
+ 0.494232f, 0.494066f, 0.493899f, 0.493732f, 0.493565f, 0.493399f, 0.493232f, 0.493065f,
+ 0.492898f, 0.492731f, 0.492564f, 0.492398f, 0.492231f, 0.492064f, 0.491897f, 0.491730f,
+ 0.491563f, 0.491396f, 0.491229f, 0.491062f, 0.490895f, 0.490728f, 0.490561f, 0.490394f,
+ 0.490226f, 0.490059f, 0.489892f, 0.489725f, 0.489558f, 0.489391f, 0.489223f, 0.489056f,
+ 0.488889f, 0.488722f, 0.488554f, 0.488387f, 0.488220f, 0.488052f, 0.487885f, 0.487718f,
+ 0.487550f, 0.487383f, 0.487215f, 0.487048f, 0.486880f, 0.486713f, 0.486545f, 0.486378f,
+ 0.486210f, 0.486043f, 0.485875f, 0.485708f, 0.485540f, 0.485372f, 0.485205f, 0.485037f,
+ 0.484869f, 0.484702f, 0.484534f, 0.484366f, 0.484198f, 0.484031f, 0.483863f, 0.483695f,
+ 0.483527f, 0.483359f, 0.483191f, 0.483023f, 0.482856f, 0.482688f, 0.482520f, 0.482352f,
+ 0.482184f, 0.482016f, 0.481848f, 0.481680f, 0.481512f, 0.481344f, 0.481176f, 0.481007f,
+ 0.480839f, 0.480671f, 0.480503f, 0.480335f, 0.480167f, 0.479998f, 0.479830f, 0.479662f,
+ 0.479494f, 0.479325f, 0.479157f, 0.478989f, 0.478821f, 0.478652f, 0.478484f, 0.478315f,
+ 0.478147f, 0.477979f, 0.477810f, 0.477642f, 0.477473f, 0.477305f, 0.477136f, 0.476968f,
+ 0.476799f, 0.476631f, 0.476462f, 0.476294f, 0.476125f, 0.475956f, 0.475788f, 0.475619f,
+ 0.475450f, 0.475282f, 0.475113f, 0.474944f, 0.474775f, 0.474607f, 0.474438f, 0.474269f,
+ 0.474100f, 0.473931f, 0.473763f, 0.473594f, 0.473425f, 0.473256f, 0.473087f, 0.472918f,
+ 0.472749f, 0.472580f, 0.472411f, 0.472242f, 0.472073f, 0.471904f, 0.471735f, 0.471566f,
+ 0.471397f, 0.471228f, 0.471058f, 0.470889f, 0.470720f, 0.470551f, 0.470382f, 0.470213f,
+ 0.470043f, 0.469874f, 0.469705f, 0.469536f, 0.469366f, 0.469197f, 0.469028f, 0.468858f,
+ 0.468689f, 0.468519f, 0.468350f, 0.468181f, 0.468011f, 0.467842f, 0.467672f, 0.467503f,
+ 0.467333f, 0.467164f, 0.466994f, 0.466825f, 0.466655f, 0.466485f, 0.466316f, 0.466146f,
+ 0.465977f, 0.465807f, 0.465637f, 0.465467f, 0.465298f, 0.465128f, 0.464958f, 0.464788f,
+ 0.464619f, 0.464449f, 0.464279f, 0.464109f, 0.463939f, 0.463769f, 0.463600f, 0.463430f,
+ 0.463260f, 0.463090f, 0.462920f, 0.462750f, 0.462580f, 0.462410f, 0.462240f, 0.462070f,
+ 0.461900f, 0.461730f, 0.461560f, 0.461390f, 0.461219f, 0.461049f, 0.460879f, 0.460709f,
+ 0.460539f, 0.460369f, 0.460198f, 0.460028f, 0.459858f, 0.459687f, 0.459517f, 0.459347f,
+ 0.459177f, 0.459006f, 0.458836f, 0.458665f, 0.458495f, 0.458325f, 0.458154f, 0.457984f,
+ 0.457813f, 0.457643f, 0.457472f, 0.457302f, 0.457131f, 0.456961f, 0.456790f, 0.456620f,
+ 0.456449f, 0.456278f, 0.456108f, 0.455937f, 0.455766f, 0.455596f, 0.455425f, 0.455254f,
+ 0.455084f, 0.454913f, 0.454742f, 0.454571f, 0.454400f, 0.454230f, 0.454059f, 0.453888f,
+ 0.453717f, 0.453546f, 0.453375f, 0.453204f, 0.453033f, 0.452863f, 0.452692f, 0.452521f,
+ 0.452350f, 0.452179f, 0.452008f, 0.451836f, 0.451665f, 0.451494f, 0.451323f, 0.451152f,
+ 0.450981f, 0.450810f, 0.450639f, 0.450467f, 0.450296f, 0.450125f, 0.449954f, 0.449783f,
+ 0.449611f, 0.449440f, 0.449269f, 0.449097f, 0.448926f, 0.448755f, 0.448583f, 0.448412f,
+ 0.448241f, 0.448069f, 0.447898f, 0.447726f, 0.447555f, 0.447383f, 0.447212f, 0.447040f,
+ 0.446869f, 0.446697f, 0.446526f, 0.446354f, 0.446183f, 0.446011f, 0.445839f, 0.445668f,
+ 0.445496f, 0.445324f, 0.445153f, 0.444981f, 0.444809f, 0.444637f, 0.444466f, 0.444294f,
+ 0.444122f, 0.443950f, 0.443779f, 0.443607f, 0.443435f, 0.443263f, 0.443091f, 0.442919f,
+ 0.442747f, 0.442575f, 0.442403f, 0.442231f, 0.442059f, 0.441887f, 0.441715f, 0.441543f,
+ 0.441371f, 0.441199f, 0.441027f, 0.440855f, 0.440683f, 0.440511f, 0.440339f, 0.440166f,
+ 0.439994f, 0.439822f, 0.439650f, 0.439478f, 0.439305f, 0.439133f, 0.438961f, 0.438789f,
+ 0.438616f, 0.438444f, 0.438272f, 0.438099f, 0.437927f, 0.437754f, 0.437582f, 0.437410f,
+ 0.437237f, 0.437065f, 0.436892f, 0.436720f, 0.436547f, 0.436375f, 0.436202f, 0.436030f,
+ 0.435857f, 0.435685f, 0.435512f, 0.435339f, 0.435167f, 0.434994f, 0.434821f, 0.434649f,
+ 0.434476f, 0.434303f, 0.434131f, 0.433958f, 0.433785f, 0.433612f, 0.433439f, 0.433267f,
+ 0.433094f, 0.432921f, 0.432748f, 0.432575f, 0.432402f, 0.432229f, 0.432057f, 0.431884f,
+ 0.431711f, 0.431538f, 0.431365f, 0.431192f, 0.431019f, 0.430846f, 0.430673f, 0.430500f,
+ 0.430326f, 0.430153f, 0.429980f, 0.429807f, 0.429634f, 0.429461f, 0.429288f, 0.429114f,
+ 0.428941f, 0.428768f, 0.428595f, 0.428422f, 0.428248f, 0.428075f, 0.427902f, 0.427728f,
+ 0.427555f, 0.427382f, 0.427208f, 0.427035f, 0.426862f, 0.426688f, 0.426515f, 0.426341f,
+ 0.426168f, 0.425994f, 0.425821f, 0.425647f, 0.425474f, 0.425300f, 0.425127f, 0.424953f,
+ 0.424780f, 0.424606f, 0.424432f, 0.424259f, 0.424085f, 0.423912f, 0.423738f, 0.423564f,
+ 0.423390f, 0.423217f, 0.423043f, 0.422869f, 0.422695f, 0.422522f, 0.422348f, 0.422174f,
+ 0.422000f, 0.421826f, 0.421653f, 0.421479f, 0.421305f, 0.421131f, 0.420957f, 0.420783f,
+ 0.420609f, 0.420435f, 0.420261f, 0.420087f, 0.419913f, 0.419739f, 0.419565f, 0.419391f,
+ 0.419217f, 0.419043f, 0.418869f, 0.418695f, 0.418520f, 0.418346f, 0.418172f, 0.417998f,
+ 0.417824f, 0.417650f, 0.417475f, 0.417301f, 0.417127f, 0.416952f, 0.416778f, 0.416604f,
+ 0.416430f, 0.416255f, 0.416081f, 0.415906f, 0.415732f, 0.415558f, 0.415383f, 0.415209f,
+ 0.415034f, 0.414860f, 0.414685f, 0.414511f, 0.414337f, 0.414162f, 0.413987f, 0.413813f,
+ 0.413638f, 0.413464f, 0.413289f, 0.413115f, 0.412940f, 0.412765f, 0.412591f, 0.412416f,
+ 0.412241f, 0.412067f, 0.411892f, 0.411717f, 0.411542f, 0.411368f, 0.411193f, 0.411018f,
+ 0.410843f, 0.410668f, 0.410493f, 0.410319f, 0.410144f, 0.409969f, 0.409794f, 0.409619f,
+ 0.409444f, 0.409269f, 0.409094f, 0.408919f, 0.408744f, 0.408569f, 0.408394f, 0.408219f,
+ 0.408044f, 0.407869f, 0.407694f, 0.407519f, 0.407344f, 0.407169f, 0.406994f, 0.406818f,
+ 0.406643f, 0.406468f, 0.406293f, 0.406118f, 0.405942f, 0.405767f, 0.405592f, 0.405417f,
+ 0.405241f, 0.405066f, 0.404891f, 0.404715f, 0.404540f, 0.404365f, 0.404189f, 0.404014f,
+ 0.403838f, 0.403663f, 0.403488f, 0.403312f, 0.403137f, 0.402961f, 0.402786f, 0.402610f,
+ 0.402435f, 0.402259f, 0.402084f, 0.401908f, 0.401732f, 0.401557f, 0.401381f, 0.401206f,
+ 0.401030f, 0.400854f, 0.400679f, 0.400503f, 0.400327f, 0.400151f, 0.399976f, 0.399800f,
+ 0.399624f, 0.399448f, 0.399273f, 0.399097f, 0.398921f, 0.398745f, 0.398569f, 0.398393f,
+ 0.398218f, 0.398042f, 0.397866f, 0.397690f, 0.397514f, 0.397338f, 0.397162f, 0.396986f,
+ 0.396810f, 0.396634f, 0.396458f, 0.396282f, 0.396106f, 0.395930f, 0.395754f, 0.395578f,
+ 0.395401f, 0.395225f, 0.395049f, 0.394873f, 0.394697f, 0.394521f, 0.394344f, 0.394168f,
+ 0.393992f, 0.393816f, 0.393640f, 0.393463f, 0.393287f, 0.393111f, 0.392934f, 0.392758f,
+ 0.392582f, 0.392405f, 0.392229f, 0.392053f, 0.391876f, 0.391700f, 0.391523f, 0.391347f,
+ 0.391170f, 0.390994f, 0.390817f, 0.390641f, 0.390464f, 0.390288f, 0.390111f, 0.389935f,
+ 0.389758f, 0.389582f, 0.389405f, 0.389228f, 0.389052f, 0.388875f, 0.388698f, 0.388522f,
+ 0.388345f, 0.388168f, 0.387992f, 0.387815f, 0.387638f, 0.387461f, 0.387285f, 0.387108f,
+ 0.386931f, 0.386754f, 0.386577f, 0.386400f, 0.386224f, 0.386047f, 0.385870f, 0.385693f,
+ 0.385516f, 0.385339f, 0.385162f, 0.384985f, 0.384808f, 0.384631f, 0.384454f, 0.384277f,
+ 0.384100f, 0.383923f, 0.383746f, 0.383569f, 0.383392f, 0.383215f, 0.383038f, 0.382861f,
+ 0.382683f, 0.382506f, 0.382329f, 0.382152f, 0.381975f, 0.381797f, 0.381620f, 0.381443f,
+ 0.381266f, 0.381088f, 0.380911f, 0.380734f, 0.380557f, 0.380379f, 0.380202f, 0.380025f,
+ 0.379847f, 0.379670f, 0.379492f, 0.379315f, 0.379138f, 0.378960f, 0.378783f, 0.378605f,
+ 0.378428f, 0.378250f, 0.378073f, 0.377895f, 0.377718f, 0.377540f, 0.377363f, 0.377185f,
+ 0.377007f, 0.376830f, 0.376652f, 0.376475f, 0.376297f, 0.376119f, 0.375942f, 0.375764f,
+ 0.375586f, 0.375408f, 0.375231f, 0.375053f, 0.374875f, 0.374697f, 0.374520f, 0.374342f,
+ 0.374164f, 0.373986f, 0.373808f, 0.373631f, 0.373453f, 0.373275f, 0.373097f, 0.372919f,
+ 0.372741f, 0.372563f, 0.372385f, 0.372207f, 0.372029f, 0.371851f, 0.371673f, 0.371495f,
+ 0.371317f, 0.371139f, 0.370961f, 0.370783f, 0.370605f, 0.370427f, 0.370249f, 0.370071f,
+ 0.369892f, 0.369714f, 0.369536f, 0.369358f, 0.369180f, 0.369002f, 0.368823f, 0.368645f,
+ 0.368467f, 0.368289f, 0.368110f, 0.367932f, 0.367754f, 0.367575f, 0.367397f, 0.367219f,
+ 0.367040f, 0.366862f, 0.366684f, 0.366505f, 0.366327f, 0.366148f, 0.365970f, 0.365791f,
+ 0.365613f, 0.365435f, 0.365256f, 0.365078f, 0.364899f, 0.364720f, 0.364542f, 0.364363f,
+ 0.364185f, 0.364006f, 0.363828f, 0.363649f, 0.363470f, 0.363292f, 0.363113f, 0.362934f,
+ 0.362756f, 0.362577f, 0.362398f, 0.362220f, 0.362041f, 0.361862f, 0.361683f, 0.361505f,
+ 0.361326f, 0.361147f, 0.360968f, 0.360789f, 0.360611f, 0.360432f, 0.360253f, 0.360074f,
+ 0.359895f, 0.359716f, 0.359537f, 0.359358f, 0.359179f, 0.359000f, 0.358821f, 0.358642f,
+ 0.358463f, 0.358284f, 0.358105f, 0.357926f, 0.357747f, 0.357568f, 0.357389f, 0.357210f,
+ 0.357031f, 0.356852f, 0.356673f, 0.356494f, 0.356314f, 0.356135f, 0.355956f, 0.355777f,
+ 0.355598f, 0.355418f, 0.355239f, 0.355060f, 0.354881f, 0.354701f, 0.354522f, 0.354343f,
+ 0.354164f, 0.353984f, 0.353805f, 0.353626f, 0.353446f, 0.353267f, 0.353087f, 0.352908f,
+ 0.352729f, 0.352549f, 0.352370f, 0.352190f, 0.352011f, 0.351831f, 0.351652f, 0.351472f,
+ 0.351293f, 0.351113f, 0.350934f, 0.350754f, 0.350575f, 0.350395f, 0.350215f, 0.350036f,
+ 0.349856f, 0.349676f, 0.349497f, 0.349317f, 0.349138f, 0.348958f, 0.348778f, 0.348598f,
+ 0.348419f, 0.348239f, 0.348059f, 0.347879f, 0.347700f, 0.347520f, 0.347340f, 0.347160f,
+ 0.346980f, 0.346801f, 0.346621f, 0.346441f, 0.346261f, 0.346081f, 0.345901f, 0.345721f,
+ 0.345541f, 0.345361f, 0.345181f, 0.345001f, 0.344821f, 0.344641f, 0.344461f, 0.344281f,
+ 0.344101f, 0.343921f, 0.343741f, 0.343561f, 0.343381f, 0.343201f, 0.343021f, 0.342841f,
+ 0.342661f, 0.342481f, 0.342300f, 0.342120f, 0.341940f, 0.341760f, 0.341580f, 0.341399f,
+ 0.341219f, 0.341039f, 0.340859f, 0.340678f, 0.340498f, 0.340318f, 0.340138f, 0.339957f,
+ 0.339777f, 0.339597f, 0.339416f, 0.339236f, 0.339055f, 0.338875f, 0.338695f, 0.338514f,
+ 0.338334f, 0.338153f, 0.337973f, 0.337792f, 0.337612f, 0.337431f, 0.337251f, 0.337070f,
+ 0.336890f, 0.336709f, 0.336529f, 0.336348f, 0.336168f, 0.335987f, 0.335806f, 0.335626f,
+ 0.335445f, 0.335265f, 0.335084f, 0.334903f, 0.334722f, 0.334542f, 0.334361f, 0.334180f,
+ 0.334000f, 0.333819f, 0.333638f, 0.333457f, 0.333277f, 0.333096f, 0.332915f, 0.332734f,
+ 0.332553f, 0.332373f, 0.332192f, 0.332011f, 0.331830f, 0.331649f, 0.331468f, 0.331287f,
+ 0.331106f, 0.330925f, 0.330744f, 0.330563f, 0.330382f, 0.330202f, 0.330020f, 0.329839f,
+ 0.329658f, 0.329477f, 0.329296f, 0.329115f, 0.328934f, 0.328753f, 0.328572f, 0.328391f,
+ 0.328210f, 0.328029f, 0.327848f, 0.327666f, 0.327485f, 0.327304f, 0.327123f, 0.326942f,
+ 0.326760f, 0.326579f, 0.326398f, 0.326217f, 0.326035f, 0.325854f, 0.325673f, 0.325492f,
+ 0.325310f, 0.325129f, 0.324948f, 0.324766f, 0.324585f, 0.324404f, 0.324222f, 0.324041f,
+ 0.323859f, 0.323678f, 0.323497f, 0.323315f, 0.323134f, 0.322952f, 0.322771f, 0.322589f,
+ 0.322408f, 0.322226f, 0.322045f, 0.321863f, 0.321682f, 0.321500f, 0.321318f, 0.321137f,
+ 0.320955f, 0.320774f, 0.320592f, 0.320410f, 0.320229f, 0.320047f, 0.319865f, 0.319684f,
+ 0.319502f, 0.319320f, 0.319139f, 0.318957f, 0.318775f, 0.318593f, 0.318412f, 0.318230f,
+ 0.318048f, 0.317866f, 0.317684f, 0.317503f, 0.317321f, 0.317139f, 0.316957f, 0.316775f,
+ 0.316593f, 0.316411f, 0.316230f, 0.316048f, 0.315866f, 0.315684f, 0.315502f, 0.315320f,
+ 0.315138f, 0.314956f, 0.314774f, 0.314592f, 0.314410f, 0.314228f, 0.314046f, 0.313864f,
+ 0.313682f, 0.313500f, 0.313318f, 0.313135f, 0.312953f, 0.312771f, 0.312589f, 0.312407f,
+ 0.312225f, 0.312043f, 0.311860f, 0.311678f, 0.311496f, 0.311314f, 0.311132f, 0.310949f,
+ 0.310767f, 0.310585f, 0.310403f, 0.310220f, 0.310038f, 0.309856f, 0.309673f, 0.309491f,
+ 0.309309f, 0.309126f, 0.308944f, 0.308762f, 0.308579f, 0.308397f, 0.308214f, 0.308032f,
+ 0.307850f, 0.307667f, 0.307485f, 0.307302f, 0.307120f, 0.306937f, 0.306755f, 0.306572f,
+ 0.306390f, 0.306207f, 0.306025f, 0.305842f, 0.305660f, 0.305477f, 0.305294f, 0.305112f,
+ 0.304929f, 0.304747f, 0.304564f, 0.304381f, 0.304199f, 0.304016f, 0.303833f, 0.303651f,
+ 0.303468f, 0.303285f, 0.303103f, 0.302920f, 0.302737f, 0.302554f, 0.302372f, 0.302189f,
+ 0.302006f, 0.301823f, 0.301640f, 0.301458f, 0.301275f, 0.301092f, 0.300909f, 0.300726f,
+ 0.300543f, 0.300360f, 0.300177f, 0.299995f, 0.299812f, 0.299629f, 0.299446f, 0.299263f,
+ 0.299080f, 0.298897f, 0.298714f, 0.298531f, 0.298348f, 0.298165f, 0.297982f, 0.297799f,
+ 0.297616f, 0.297433f, 0.297250f, 0.297066f, 0.296883f, 0.296700f, 0.296517f, 0.296334f,
+ 0.296151f, 0.295968f, 0.295785f, 0.295601f, 0.295418f, 0.295235f, 0.295052f, 0.294869f,
+ 0.294685f, 0.294502f, 0.294319f, 0.294136f, 0.293952f, 0.293769f, 0.293586f, 0.293402f,
+ 0.293219f, 0.293036f, 0.292852f, 0.292669f, 0.292486f, 0.292302f, 0.292119f, 0.291936f,
+ 0.291752f, 0.291569f, 0.291385f, 0.291202f, 0.291019f, 0.290835f, 0.290652f, 0.290468f,
+ 0.290285f, 0.290101f, 0.289918f, 0.289734f, 0.289551f, 0.289367f, 0.289184f, 0.289000f,
+ 0.288816f, 0.288633f, 0.288449f, 0.288266f, 0.288082f, 0.287898f, 0.287715f, 0.287531f,
+ 0.287347f, 0.287164f, 0.286980f, 0.286796f, 0.286613f, 0.286429f, 0.286245f, 0.286062f,
+ 0.285878f, 0.285694f, 0.285510f, 0.285327f, 0.285143f, 0.284959f, 0.284775f, 0.284591f,
+ 0.284408f, 0.284224f, 0.284040f, 0.283856f, 0.283672f, 0.283488f, 0.283304f, 0.283120f,
+ 0.282937f, 0.282753f, 0.282569f, 0.282385f, 0.282201f, 0.282017f, 0.281833f, 0.281649f,
+ 0.281465f, 0.281281f, 0.281097f, 0.280913f, 0.280729f, 0.280545f, 0.280361f, 0.280177f,
+ 0.279993f, 0.279809f, 0.279624f, 0.279440f, 0.279256f, 0.279072f, 0.278888f, 0.278704f,
+ 0.278520f, 0.278336f, 0.278151f, 0.277967f, 0.277783f, 0.277599f, 0.277415f, 0.277230f,
+ 0.277046f, 0.276862f, 0.276678f, 0.276493f, 0.276309f, 0.276125f, 0.275940f, 0.275756f,
+ 0.275572f, 0.275387f, 0.275203f, 0.275019f, 0.274834f, 0.274650f, 0.274466f, 0.274281f,
+ 0.274097f, 0.273912f, 0.273728f, 0.273544f, 0.273359f, 0.273175f, 0.272990f, 0.272806f,
+ 0.272621f, 0.272437f, 0.272252f, 0.272068f, 0.271883f, 0.271699f, 0.271514f, 0.271330f,
+ 0.271145f, 0.270961f, 0.270776f, 0.270591f, 0.270407f, 0.270222f, 0.270038f, 0.269853f,
+ 0.269668f, 0.269484f, 0.269299f, 0.269114f, 0.268930f, 0.268745f, 0.268560f, 0.268376f,
+ 0.268191f, 0.268006f, 0.267821f, 0.267637f, 0.267452f, 0.267267f, 0.267082f, 0.266898f,
+ 0.266713f, 0.266528f, 0.266343f, 0.266158f, 0.265973f, 0.265789f, 0.265604f, 0.265419f,
+ 0.265234f, 0.265049f, 0.264864f, 0.264679f, 0.264494f, 0.264309f, 0.264125f, 0.263940f,
+ 0.263755f, 0.263570f, 0.263385f, 0.263200f, 0.263015f, 0.262830f, 0.262645f, 0.262460f,
+ 0.262275f, 0.262090f, 0.261905f, 0.261720f, 0.261534f, 0.261349f, 0.261164f, 0.260979f,
+ 0.260794f, 0.260609f, 0.260424f, 0.260239f, 0.260054f, 0.259868f, 0.259683f, 0.259498f,
+ 0.259313f, 0.259128f, 0.258943f, 0.258757f, 0.258572f, 0.258387f, 0.258202f, 0.258016f,
+ 0.257831f, 0.257646f, 0.257461f, 0.257275f, 0.257090f, 0.256905f, 0.256719f, 0.256534f,
+ 0.256349f, 0.256163f, 0.255978f, 0.255793f, 0.255607f, 0.255422f, 0.255236f, 0.255051f,
+ 0.254866f, 0.254680f, 0.254495f, 0.254309f, 0.254124f, 0.253938f, 0.253753f, 0.253568f,
+ 0.253382f, 0.253197f, 0.253011f, 0.252826f, 0.252640f, 0.252454f, 0.252269f, 0.252083f,
+ 0.251898f, 0.251712f, 0.251527f, 0.251341f, 0.251155f, 0.250970f, 0.250784f, 0.250599f,
+ 0.250413f, 0.250227f, 0.250042f, 0.249856f, 0.249670f, 0.249485f, 0.249299f, 0.249113f,
+ 0.248928f, 0.248742f, 0.248556f, 0.248370f, 0.248185f, 0.247999f, 0.247813f, 0.247627f,
+ 0.247442f, 0.247256f, 0.247070f, 0.246884f, 0.246698f, 0.246513f, 0.246327f, 0.246141f,
+ 0.245955f, 0.245769f, 0.245583f, 0.245397f, 0.245212f, 0.245026f, 0.244840f, 0.244654f,
+ 0.244468f, 0.244282f, 0.244096f, 0.243910f, 0.243724f, 0.243538f, 0.243352f, 0.243166f,
+ 0.242980f, 0.242794f, 0.242608f, 0.242422f, 0.242236f, 0.242050f, 0.241864f, 0.241678f,
+ 0.241492f, 0.241306f, 0.241120f, 0.240934f, 0.240748f, 0.240561f, 0.240375f, 0.240189f,
+ 0.240003f, 0.239817f, 0.239631f, 0.239445f, 0.239258f, 0.239072f, 0.238886f, 0.238700f,
+ 0.238514f, 0.238327f, 0.238141f, 0.237955f, 0.237769f, 0.237582f, 0.237396f, 0.237210f,
+ 0.237024f, 0.236837f, 0.236651f, 0.236465f, 0.236278f, 0.236092f, 0.235906f, 0.235719f,
+ 0.235533f, 0.235347f, 0.235160f, 0.234974f, 0.234788f, 0.234601f, 0.234415f, 0.234228f,
+ 0.234042f, 0.233856f, 0.233669f, 0.233483f, 0.233296f, 0.233110f, 0.232923f, 0.232737f,
+ 0.232550f, 0.232364f, 0.232177f, 0.231991f, 0.231804f, 0.231618f, 0.231431f, 0.231245f,
+ 0.231058f, 0.230872f, 0.230685f, 0.230498f, 0.230312f, 0.230125f, 0.229939f, 0.229752f,
+ 0.229565f, 0.229379f, 0.229192f, 0.229005f, 0.228819f, 0.228632f, 0.228445f, 0.228259f,
+ 0.228072f, 0.227885f, 0.227699f, 0.227512f, 0.227325f, 0.227139f, 0.226952f, 0.226765f,
+ 0.226578f, 0.226391f, 0.226205f, 0.226018f, 0.225831f, 0.225644f, 0.225458f, 0.225271f,
+ 0.225084f, 0.224897f, 0.224710f, 0.224523f, 0.224337f, 0.224150f, 0.223963f, 0.223776f,
+ 0.223589f, 0.223402f, 0.223215f, 0.223028f, 0.222841f, 0.222654f, 0.222468f, 0.222281f,
+ 0.222094f, 0.221907f, 0.221720f, 0.221533f, 0.221346f, 0.221159f, 0.220972f, 0.220785f,
+ 0.220598f, 0.220411f, 0.220224f, 0.220037f, 0.219850f, 0.219662f, 0.219475f, 0.219288f,
+ 0.219101f, 0.218914f, 0.218727f, 0.218540f, 0.218353f, 0.218166f, 0.217979f, 0.217791f,
+ 0.217604f, 0.217417f, 0.217230f, 0.217043f, 0.216856f, 0.216668f, 0.216481f, 0.216294f,
+ 0.216107f, 0.215920f, 0.215732f, 0.215545f, 0.215358f, 0.215171f, 0.214983f, 0.214796f,
+ 0.214609f, 0.214422f, 0.214234f, 0.214047f, 0.213860f, 0.213672f, 0.213485f, 0.213298f,
+ 0.213110f, 0.212923f, 0.212736f, 0.212548f, 0.212361f, 0.212174f, 0.211986f, 0.211799f,
+ 0.211611f, 0.211424f, 0.211237f, 0.211049f, 0.210862f, 0.210674f, 0.210487f, 0.210299f,
+ 0.210112f, 0.209924f, 0.209737f, 0.209549f, 0.209362f, 0.209174f, 0.208987f, 0.208799f,
+ 0.208612f, 0.208424f, 0.208237f, 0.208049f, 0.207862f, 0.207674f, 0.207487f, 0.207299f,
+ 0.207111f, 0.206924f, 0.206736f, 0.206549f, 0.206361f, 0.206173f, 0.205986f, 0.205798f,
+ 0.205610f, 0.205423f, 0.205235f, 0.205047f, 0.204860f, 0.204672f, 0.204484f, 0.204297f,
+ 0.204109f, 0.203921f, 0.203734f, 0.203546f, 0.203358f, 0.203170f, 0.202983f, 0.202795f,
+ 0.202607f, 0.202419f, 0.202231f, 0.202044f, 0.201856f, 0.201668f, 0.201480f, 0.201292f,
+ 0.201105f, 0.200917f, 0.200729f, 0.200541f, 0.200353f, 0.200165f, 0.199978f, 0.199790f,
+ 0.199602f, 0.199414f, 0.199226f, 0.199038f, 0.198850f, 0.198662f, 0.198474f, 0.198286f,
+ 0.198098f, 0.197910f, 0.197722f, 0.197535f, 0.197347f, 0.197159f, 0.196971f, 0.196783f,
+ 0.196595f, 0.196407f, 0.196219f, 0.196031f, 0.195843f, 0.195654f, 0.195466f, 0.195278f,
+ 0.195090f, 0.194902f, 0.194714f, 0.194526f, 0.194338f, 0.194150f, 0.193962f, 0.193774f,
+ 0.193586f, 0.193397f, 0.193209f, 0.193021f, 0.192833f, 0.192645f, 0.192457f, 0.192269f,
+ 0.192080f, 0.191892f, 0.191704f, 0.191516f, 0.191328f, 0.191139f, 0.190951f, 0.190763f,
+ 0.190575f, 0.190387f, 0.190198f, 0.190010f, 0.189822f, 0.189634f, 0.189445f, 0.189257f,
+ 0.189069f, 0.188880f, 0.188692f, 0.188504f, 0.188315f, 0.188127f, 0.187939f, 0.187750f,
+ 0.187562f, 0.187374f, 0.187185f, 0.186997f, 0.186809f, 0.186620f, 0.186432f, 0.186244f,
+ 0.186055f, 0.185867f, 0.185678f, 0.185490f, 0.185301f, 0.185113f, 0.184925f, 0.184736f,
+ 0.184548f, 0.184359f, 0.184171f, 0.183982f, 0.183794f, 0.183605f, 0.183417f, 0.183228f,
+ 0.183040f, 0.182851f, 0.182663f, 0.182474f, 0.182286f, 0.182097f, 0.181909f, 0.181720f,
+ 0.181532f, 0.181343f, 0.181154f, 0.180966f, 0.180777f, 0.180589f, 0.180400f, 0.180212f,
+ 0.180023f, 0.179834f, 0.179646f, 0.179457f, 0.179268f, 0.179080f, 0.178891f, 0.178702f,
+ 0.178514f, 0.178325f, 0.178136f, 0.177948f, 0.177759f, 0.177570f, 0.177382f, 0.177193f,
+ 0.177004f, 0.176815f, 0.176627f, 0.176438f, 0.176249f, 0.176061f, 0.175872f, 0.175683f,
+ 0.175494f, 0.175305f, 0.175117f, 0.174928f, 0.174739f, 0.174550f, 0.174362f, 0.174173f,
+ 0.173984f, 0.173795f, 0.173606f, 0.173417f, 0.173229f, 0.173040f, 0.172851f, 0.172662f,
+ 0.172473f, 0.172284f, 0.172095f, 0.171906f, 0.171718f, 0.171529f, 0.171340f, 0.171151f,
+ 0.170962f, 0.170773f, 0.170584f, 0.170395f, 0.170206f, 0.170017f, 0.169828f, 0.169639f,
+ 0.169450f, 0.169261f, 0.169072f, 0.168883f, 0.168694f, 0.168505f, 0.168316f, 0.168127f,
+ 0.167938f, 0.167749f, 0.167560f, 0.167371f, 0.167182f, 0.166993f, 0.166804f, 0.166615f,
+ 0.166426f, 0.166237f, 0.166048f, 0.165859f, 0.165670f, 0.165480f, 0.165291f, 0.165102f,
+ 0.164913f, 0.164724f, 0.164535f, 0.164346f, 0.164157f, 0.163967f, 0.163778f, 0.163589f,
+ 0.163400f, 0.163211f, 0.163022f, 0.162832f, 0.162643f, 0.162454f, 0.162265f, 0.162076f,
+ 0.161886f, 0.161697f, 0.161508f, 0.161319f, 0.161129f, 0.160940f, 0.160751f, 0.160562f,
+ 0.160372f, 0.160183f, 0.159994f, 0.159805f, 0.159615f, 0.159426f, 0.159237f, 0.159047f,
+ 0.158858f, 0.158669f, 0.158480f, 0.158290f, 0.158101f, 0.157912f, 0.157722f, 0.157533f,
+ 0.157343f, 0.157154f, 0.156965f, 0.156775f, 0.156586f, 0.156397f, 0.156207f, 0.156018f,
+ 0.155828f, 0.155639f, 0.155450f, 0.155260f, 0.155071f, 0.154881f, 0.154692f, 0.154502f,
+ 0.154313f, 0.154124f, 0.153934f, 0.153745f, 0.153555f, 0.153366f, 0.153176f, 0.152987f,
+ 0.152797f, 0.152608f, 0.152418f, 0.152229f, 0.152039f, 0.151850f, 0.151660f, 0.151471f,
+ 0.151281f, 0.151092f, 0.150902f, 0.150712f, 0.150523f, 0.150333f, 0.150144f, 0.149954f,
+ 0.149765f, 0.149575f, 0.149385f, 0.149196f, 0.149006f, 0.148817f, 0.148627f, 0.148437f,
+ 0.148248f, 0.148058f, 0.147868f, 0.147679f, 0.147489f, 0.147299f, 0.147110f, 0.146920f,
+ 0.146730f, 0.146541f, 0.146351f, 0.146161f, 0.145972f, 0.145782f, 0.145592f, 0.145403f,
+ 0.145213f, 0.145023f, 0.144833f, 0.144644f, 0.144454f, 0.144264f, 0.144075f, 0.143885f,
+ 0.143695f, 0.143505f, 0.143316f, 0.143126f, 0.142936f, 0.142746f, 0.142556f, 0.142367f,
+ 0.142177f, 0.141987f, 0.141797f, 0.141607f, 0.141418f, 0.141228f, 0.141038f, 0.140848f,
+ 0.140658f, 0.140468f, 0.140279f, 0.140089f, 0.139899f, 0.139709f, 0.139519f, 0.139329f,
+ 0.139139f, 0.138949f, 0.138760f, 0.138570f, 0.138380f, 0.138190f, 0.138000f, 0.137810f,
+ 0.137620f, 0.137430f, 0.137240f, 0.137050f, 0.136860f, 0.136670f, 0.136480f, 0.136291f,
+ 0.136101f, 0.135911f, 0.135721f, 0.135531f, 0.135341f, 0.135151f, 0.134961f, 0.134771f,
+ 0.134581f, 0.134391f, 0.134201f, 0.134011f, 0.133821f, 0.133631f, 0.133441f, 0.133251f,
+ 0.133061f, 0.132870f, 0.132680f, 0.132490f, 0.132300f, 0.132110f, 0.131920f, 0.131730f,
+ 0.131540f, 0.131350f, 0.131160f, 0.130970f, 0.130780f, 0.130590f, 0.130399f, 0.130209f,
+ 0.130019f, 0.129829f, 0.129639f, 0.129449f, 0.129259f, 0.129069f, 0.128878f, 0.128688f,
+ 0.128498f, 0.128308f, 0.128118f, 0.127928f, 0.127737f, 0.127547f, 0.127357f, 0.127167f,
+ 0.126977f, 0.126787f, 0.126596f, 0.126406f, 0.126216f, 0.126026f, 0.125835f, 0.125645f,
+ 0.125455f, 0.125265f, 0.125075f, 0.124884f, 0.124694f, 0.124504f, 0.124314f, 0.124123f,
+ 0.123933f, 0.123743f, 0.123552f, 0.123362f, 0.123172f, 0.122982f, 0.122791f, 0.122601f,
+ 0.122411f, 0.122220f, 0.122030f, 0.121840f, 0.121649f, 0.121459f, 0.121269f, 0.121078f,
+ 0.120888f, 0.120698f, 0.120507f, 0.120317f, 0.120127f, 0.119936f, 0.119746f, 0.119556f,
+ 0.119365f, 0.119175f, 0.118984f, 0.118794f, 0.118604f, 0.118413f, 0.118223f, 0.118032f,
+ 0.117842f, 0.117652f, 0.117461f, 0.117271f, 0.117080f, 0.116890f, 0.116700f, 0.116509f,
+ 0.116319f, 0.116128f, 0.115938f, 0.115747f, 0.115557f, 0.115366f, 0.115176f, 0.114985f,
+ 0.114795f, 0.114604f, 0.114414f, 0.114223f, 0.114033f, 0.113842f, 0.113652f, 0.113461f,
+ 0.113271f, 0.113080f, 0.112890f, 0.112699f, 0.112509f, 0.112318f, 0.112128f, 0.111937f,
+ 0.111747f, 0.111556f, 0.111366f, 0.111175f, 0.110984f, 0.110794f, 0.110603f, 0.110413f,
+ 0.110222f, 0.110032f, 0.109841f, 0.109650f, 0.109460f, 0.109269f, 0.109079f, 0.108888f,
+ 0.108697f, 0.108507f, 0.108316f, 0.108126f, 0.107935f, 0.107744f, 0.107554f, 0.107363f,
+ 0.107172f, 0.106982f, 0.106791f, 0.106600f, 0.106410f, 0.106219f, 0.106028f, 0.105838f,
+ 0.105647f, 0.105456f, 0.105266f, 0.105075f, 0.104884f, 0.104694f, 0.104503f, 0.104312f,
+ 0.104122f, 0.103931f, 0.103740f, 0.103550f, 0.103359f, 0.103168f, 0.102977f, 0.102787f,
+ 0.102596f, 0.102405f, 0.102214f, 0.102024f, 0.101833f, 0.101642f, 0.101451f, 0.101261f,
+ 0.101070f, 0.100879f, 0.100688f, 0.100498f, 0.100307f, 0.100116f, 0.099925f, 0.099734f,
+ 0.099544f, 0.099353f, 0.099162f, 0.098971f, 0.098780f, 0.098590f, 0.098399f, 0.098208f,
+ 0.098017f, 0.097826f, 0.097635f, 0.097445f, 0.097254f, 0.097063f, 0.096872f, 0.096681f,
+ 0.096490f, 0.096300f, 0.096109f, 0.095918f, 0.095727f, 0.095536f, 0.095345f, 0.095154f,
+ 0.094963f, 0.094773f, 0.094582f, 0.094391f, 0.094200f, 0.094009f, 0.093818f, 0.093627f,
+ 0.093436f, 0.093245f, 0.093055f, 0.092864f, 0.092673f, 0.092482f, 0.092291f, 0.092100f,
+ 0.091909f, 0.091718f, 0.091527f, 0.091336f, 0.091145f, 0.090954f, 0.090763f, 0.090572f,
+ 0.090381f, 0.090190f, 0.089999f, 0.089808f, 0.089617f, 0.089427f, 0.089236f, 0.089045f,
+ 0.088854f, 0.088663f, 0.088472f, 0.088281f, 0.088090f, 0.087899f, 0.087708f, 0.087517f,
+ 0.087326f, 0.087135f, 0.086943f, 0.086752f, 0.086561f, 0.086370f, 0.086179f, 0.085988f,
+ 0.085797f, 0.085606f, 0.085415f, 0.085224f, 0.085033f, 0.084842f, 0.084651f, 0.084460f,
+ 0.084269f, 0.084078f, 0.083887f, 0.083696f, 0.083505f, 0.083314f, 0.083122f, 0.082931f,
+ 0.082740f, 0.082549f, 0.082358f, 0.082167f, 0.081976f, 0.081785f, 0.081594f, 0.081403f,
+ 0.081211f, 0.081020f, 0.080829f, 0.080638f, 0.080447f, 0.080256f, 0.080065f, 0.079874f,
+ 0.079682f, 0.079491f, 0.079300f, 0.079109f, 0.078918f, 0.078727f, 0.078536f, 0.078344f,
+ 0.078153f, 0.077962f, 0.077771f, 0.077580f, 0.077389f, 0.077197f, 0.077006f, 0.076815f,
+ 0.076624f, 0.076433f, 0.076241f, 0.076050f, 0.075859f, 0.075668f, 0.075477f, 0.075286f,
+ 0.075094f, 0.074903f, 0.074712f, 0.074521f, 0.074329f, 0.074138f, 0.073947f, 0.073756f,
+ 0.073565f, 0.073373f, 0.073182f, 0.072991f, 0.072800f, 0.072608f, 0.072417f, 0.072226f,
+ 0.072035f, 0.071843f, 0.071652f, 0.071461f, 0.071270f, 0.071078f, 0.070887f, 0.070696f,
+ 0.070505f, 0.070313f, 0.070122f, 0.069931f, 0.069739f, 0.069548f, 0.069357f, 0.069166f,
+ 0.068974f, 0.068783f, 0.068592f, 0.068400f, 0.068209f, 0.068018f, 0.067827f, 0.067635f,
+ 0.067444f, 0.067253f, 0.067061f, 0.066870f, 0.066679f, 0.066487f, 0.066296f, 0.066105f,
+ 0.065913f, 0.065722f, 0.065531f, 0.065339f, 0.065148f, 0.064957f, 0.064765f, 0.064574f,
+ 0.064383f, 0.064191f, 0.064000f, 0.063809f, 0.063617f, 0.063426f, 0.063234f, 0.063043f,
+ 0.062852f, 0.062660f, 0.062469f, 0.062278f, 0.062086f, 0.061895f, 0.061704f, 0.061512f,
+ 0.061321f, 0.061129f, 0.060938f, 0.060747f, 0.060555f, 0.060364f, 0.060172f, 0.059981f,
+ 0.059790f, 0.059598f, 0.059407f, 0.059215f, 0.059024f, 0.058833f, 0.058641f, 0.058450f,
+ 0.058258f, 0.058067f, 0.057875f, 0.057684f, 0.057493f, 0.057301f, 0.057110f, 0.056918f,
+ 0.056727f, 0.056535f, 0.056344f, 0.056152f, 0.055961f, 0.055770f, 0.055578f, 0.055387f,
+ 0.055195f, 0.055004f, 0.054812f, 0.054621f, 0.054429f, 0.054238f, 0.054046f, 0.053855f,
+ 0.053664f, 0.053472f, 0.053281f, 0.053089f, 0.052898f, 0.052706f, 0.052515f, 0.052323f,
+ 0.052132f, 0.051940f, 0.051749f, 0.051557f, 0.051366f, 0.051174f, 0.050983f, 0.050791f,
+ 0.050600f, 0.050408f, 0.050217f, 0.050025f, 0.049834f, 0.049642f, 0.049451f, 0.049259f,
+ 0.049068f, 0.048876f, 0.048685f, 0.048493f, 0.048302f, 0.048110f, 0.047919f, 0.047727f,
+ 0.047535f, 0.047344f, 0.047152f, 0.046961f, 0.046769f, 0.046578f, 0.046386f, 0.046195f,
+ 0.046003f, 0.045812f, 0.045620f, 0.045429f, 0.045237f, 0.045045f, 0.044854f, 0.044662f,
+ 0.044471f, 0.044279f, 0.044088f, 0.043896f, 0.043705f, 0.043513f, 0.043321f, 0.043130f,
+ 0.042938f, 0.042747f, 0.042555f, 0.042364f, 0.042172f, 0.041980f, 0.041789f, 0.041597f,
+ 0.041406f, 0.041214f, 0.041022f, 0.040831f, 0.040639f, 0.040448f, 0.040256f, 0.040065f,
+ 0.039873f, 0.039681f, 0.039490f, 0.039298f, 0.039107f, 0.038915f, 0.038723f, 0.038532f,
+ 0.038340f, 0.038149f, 0.037957f, 0.037765f, 0.037574f, 0.037382f, 0.037190f, 0.036999f,
+ 0.036807f, 0.036616f, 0.036424f, 0.036232f, 0.036041f, 0.035849f, 0.035657f, 0.035466f,
+ 0.035274f, 0.035083f, 0.034891f, 0.034699f, 0.034508f, 0.034316f, 0.034124f, 0.033933f,
+ 0.033741f, 0.033550f, 0.033358f, 0.033166f, 0.032975f, 0.032783f, 0.032591f, 0.032400f,
+ 0.032208f, 0.032016f, 0.031825f, 0.031633f, 0.031441f, 0.031250f, 0.031058f, 0.030866f,
+ 0.030675f, 0.030483f, 0.030291f, 0.030100f, 0.029908f, 0.029717f, 0.029525f, 0.029333f,
+ 0.029142f, 0.028950f, 0.028758f, 0.028567f, 0.028375f, 0.028183f, 0.027991f, 0.027800f,
+ 0.027608f, 0.027416f, 0.027225f, 0.027033f, 0.026841f, 0.026650f, 0.026458f, 0.026266f,
+ 0.026075f, 0.025883f, 0.025691f, 0.025500f, 0.025308f, 0.025116f, 0.024925f, 0.024733f,
+ 0.024541f, 0.024350f, 0.024158f, 0.023966f, 0.023774f, 0.023583f, 0.023391f, 0.023199f,
+ 0.023008f, 0.022816f, 0.022624f, 0.022433f, 0.022241f, 0.022049f, 0.021857f, 0.021666f,
+ 0.021474f, 0.021282f, 0.021091f, 0.020899f, 0.020707f, 0.020516f, 0.020324f, 0.020132f,
+ 0.019940f, 0.019749f, 0.019557f, 0.019365f, 0.019174f, 0.018982f, 0.018790f, 0.018598f,
+ 0.018407f, 0.018215f, 0.018023f, 0.017832f, 0.017640f, 0.017448f, 0.017256f, 0.017065f,
+ 0.016873f, 0.016681f, 0.016490f, 0.016298f, 0.016106f, 0.015914f, 0.015723f, 0.015531f,
+ 0.015339f, 0.015147f, 0.014956f, 0.014764f, 0.014572f, 0.014381f, 0.014189f, 0.013997f,
+ 0.013805f, 0.013614f, 0.013422f, 0.013230f, 0.013038f, 0.012847f, 0.012655f, 0.012463f,
+ 0.012272f, 0.012080f, 0.011888f, 0.011696f, 0.011505f, 0.011313f, 0.011121f, 0.010929f,
+ 0.010738f, 0.010546f, 0.010354f, 0.010162f, 0.009971f, 0.009779f, 0.009587f, 0.009395f,
+ 0.009204f, 0.009012f, 0.008820f, 0.008629f, 0.008437f, 0.008245f, 0.008053f, 0.007862f,
+ 0.007670f, 0.007478f, 0.007286f, 0.007095f, 0.006903f, 0.006711f, 0.006519f, 0.006328f,
+ 0.006136f, 0.005944f, 0.005752f, 0.005561f, 0.005369f, 0.005177f, 0.004985f, 0.004794f,
+ 0.004602f, 0.004410f, 0.004218f, 0.004027f, 0.003835f, 0.003643f, 0.003451f, 0.003260f,
+ 0.003068f, 0.002876f, 0.002684f, 0.002493f, 0.002301f, 0.002109f, 0.001917f, 0.001726f,
+ 0.001534f, 0.001342f, 0.001150f, 0.000959f, 0.000767f, 0.000575f, 0.000383f, 0.000192f,
+ 0.000000f, 0.000192f, 0.000383f, 0.000575f, 0.000767f, 0.000959f, 0.001150f, 0.001342f,
+ 0.001534f, 0.001726f, 0.001917f, 0.002109f, 0.002301f, 0.002493f, 0.002684f, 0.002876f,
+ 0.003068f, 0.003260f, 0.003451f, 0.003643f, 0.003835f, 0.004027f, 0.004218f, 0.004410f,
+ 0.004602f, 0.004794f, 0.004985f, 0.005177f, 0.005369f, 0.005561f, 0.005752f, 0.005944f,
+ 0.006136f, 0.006328f, 0.006519f, 0.006711f, 0.006903f, 0.007095f, 0.007286f, 0.007478f,
+ 0.007670f, 0.007862f, 0.008053f, 0.008245f, 0.008437f, 0.008629f, 0.008820f, 0.009012f,
+ 0.009204f, 0.009395f, 0.009587f, 0.009779f, 0.009971f, 0.010162f, 0.010354f, 0.010546f,
+ 0.010738f, 0.010929f, 0.011121f, 0.011313f, 0.011505f, 0.011696f, 0.011888f, 0.012080f,
+ 0.012272f, 0.012463f, 0.012655f, 0.012847f, 0.013038f, 0.013230f, 0.013422f, 0.013614f,
+ 0.013805f, 0.013997f, 0.014189f, 0.014381f, 0.014572f, 0.014764f, 0.014956f, 0.015147f,
+ 0.015339f, 0.015531f, 0.015723f, 0.015914f, 0.016106f, 0.016298f, 0.016490f, 0.016681f,
+ 0.016873f, 0.017065f, 0.017256f, 0.017448f, 0.017640f, 0.017832f, 0.018023f, 0.018215f,
+ 0.018407f, 0.018598f, 0.018790f, 0.018982f, 0.019174f, 0.019365f, 0.019557f, 0.019749f,
+ 0.019940f, 0.020132f, 0.020324f, 0.020516f, 0.020707f, 0.020899f, 0.021091f, 0.021282f,
+ 0.021474f, 0.021666f, 0.021857f, 0.022049f, 0.022241f, 0.022433f, 0.022624f, 0.022816f,
+ 0.023008f, 0.023199f, 0.023391f, 0.023583f, 0.023774f, 0.023966f, 0.024158f, 0.024350f,
+ 0.024541f, 0.024733f, 0.024925f, 0.025116f, 0.025308f, 0.025500f, 0.025691f, 0.025883f,
+ 0.026075f, 0.026266f, 0.026458f, 0.026650f, 0.026841f, 0.027033f, 0.027225f, 0.027416f,
+ 0.027608f, 0.027800f, 0.027991f, 0.028183f, 0.028375f, 0.028567f, 0.028758f, 0.028950f,
+ 0.029142f, 0.029333f, 0.029525f, 0.029717f, 0.029908f, 0.030100f, 0.030291f, 0.030483f,
+ 0.030675f, 0.030866f, 0.031058f, 0.031250f, 0.031441f, 0.031633f, 0.031825f, 0.032016f,
+ 0.032208f, 0.032400f, 0.032591f, 0.032783f, 0.032975f, 0.033166f, 0.033358f, 0.033550f,
+ 0.033741f, 0.033933f, 0.034124f, 0.034316f, 0.034508f, 0.034699f, 0.034891f, 0.035083f,
+ 0.035274f, 0.035466f, 0.035657f, 0.035849f, 0.036041f, 0.036232f, 0.036424f, 0.036616f,
+ 0.036807f, 0.036999f, 0.037190f, 0.037382f, 0.037574f, 0.037765f, 0.037957f, 0.038149f,
+ 0.038340f, 0.038532f, 0.038723f, 0.038915f, 0.039107f, 0.039298f, 0.039490f, 0.039681f,
+ 0.039873f, 0.040065f, 0.040256f, 0.040448f, 0.040639f, 0.040831f, 0.041022f, 0.041214f,
+ 0.041406f, 0.041597f, 0.041789f, 0.041980f, 0.042172f, 0.042364f, 0.042555f, 0.042747f,
+ 0.042938f, 0.043130f, 0.043321f, 0.043513f, 0.043705f, 0.043896f, 0.044088f, 0.044279f,
+ 0.044471f, 0.044662f, 0.044854f, 0.045045f, 0.045237f, 0.045429f, 0.045620f, 0.045812f,
+ 0.046003f, 0.046195f, 0.046386f, 0.046578f, 0.046769f, 0.046961f, 0.047152f, 0.047344f,
+ 0.047535f, 0.047727f, 0.047919f, 0.048110f, 0.048302f, 0.048493f, 0.048685f, 0.048876f,
+ 0.049068f, 0.049259f, 0.049451f, 0.049642f, 0.049834f, 0.050025f, 0.050217f, 0.050408f,
+ 0.050600f, 0.050791f, 0.050983f, 0.051174f, 0.051366f, 0.051557f, 0.051749f, 0.051940f,
+ 0.052132f, 0.052323f, 0.052515f, 0.052706f, 0.052898f, 0.053089f, 0.053281f, 0.053472f,
+ 0.053664f, 0.053855f, 0.054046f, 0.054238f, 0.054429f, 0.054621f, 0.054812f, 0.055004f,
+ 0.055195f, 0.055387f, 0.055578f, 0.055770f, 0.055961f, 0.056152f, 0.056344f, 0.056535f,
+ 0.056727f, 0.056918f, 0.057110f, 0.057301f, 0.057493f, 0.057684f, 0.057875f, 0.058067f,
+ 0.058258f, 0.058450f, 0.058641f, 0.058833f, 0.059024f, 0.059215f, 0.059407f, 0.059598f,
+ 0.059790f, 0.059981f, 0.060172f, 0.060364f, 0.060555f, 0.060747f, 0.060938f, 0.061129f,
+ 0.061321f, 0.061512f, 0.061704f, 0.061895f, 0.062086f, 0.062278f, 0.062469f, 0.062660f,
+ 0.062852f, 0.063043f, 0.063234f, 0.063426f, 0.063617f, 0.063809f, 0.064000f, 0.064191f,
+ 0.064383f, 0.064574f, 0.064765f, 0.064957f, 0.065148f, 0.065339f, 0.065531f, 0.065722f,
+ 0.065913f, 0.066105f, 0.066296f, 0.066487f, 0.066679f, 0.066870f, 0.067061f, 0.067253f,
+ 0.067444f, 0.067635f, 0.067827f, 0.068018f, 0.068209f, 0.068400f, 0.068592f, 0.068783f,
+ 0.068974f, 0.069166f, 0.069357f, 0.069548f, 0.069739f, 0.069931f, 0.070122f, 0.070313f,
+ 0.070505f, 0.070696f, 0.070887f, 0.071078f, 0.071270f, 0.071461f, 0.071652f, 0.071843f,
+ 0.072035f, 0.072226f, 0.072417f, 0.072608f, 0.072800f, 0.072991f, 0.073182f, 0.073373f,
+ 0.073565f, 0.073756f, 0.073947f, 0.074138f, 0.074329f, 0.074521f, 0.074712f, 0.074903f,
+ 0.075094f, 0.075286f, 0.075477f, 0.075668f, 0.075859f, 0.076050f, 0.076241f, 0.076433f,
+ 0.076624f, 0.076815f, 0.077006f, 0.077197f, 0.077389f, 0.077580f, 0.077771f, 0.077962f,
+ 0.078153f, 0.078344f, 0.078536f, 0.078727f, 0.078918f, 0.079109f, 0.079300f, 0.079491f,
+ 0.079682f, 0.079874f, 0.080065f, 0.080256f, 0.080447f, 0.080638f, 0.080829f, 0.081020f,
+ 0.081211f, 0.081403f, 0.081594f, 0.081785f, 0.081976f, 0.082167f, 0.082358f, 0.082549f,
+ 0.082740f, 0.082931f, 0.083122f, 0.083314f, 0.083505f, 0.083696f, 0.083887f, 0.084078f,
+ 0.084269f, 0.084460f, 0.084651f, 0.084842f, 0.085033f, 0.085224f, 0.085415f, 0.085606f,
+ 0.085797f, 0.085988f, 0.086179f, 0.086370f, 0.086561f, 0.086752f, 0.086943f, 0.087135f,
+ 0.087326f, 0.087517f, 0.087708f, 0.087899f, 0.088090f, 0.088281f, 0.088472f, 0.088663f,
+ 0.088854f, 0.089045f, 0.089236f, 0.089427f, 0.089617f, 0.089808f, 0.089999f, 0.090190f,
+ 0.090381f, 0.090572f, 0.090763f, 0.090954f, 0.091145f, 0.091336f, 0.091527f, 0.091718f,
+ 0.091909f, 0.092100f, 0.092291f, 0.092482f, 0.092673f, 0.092864f, 0.093055f, 0.093245f,
+ 0.093436f, 0.093627f, 0.093818f, 0.094009f, 0.094200f, 0.094391f, 0.094582f, 0.094773f,
+ 0.094963f, 0.095154f, 0.095345f, 0.095536f, 0.095727f, 0.095918f, 0.096109f, 0.096300f,
+ 0.096490f, 0.096681f, 0.096872f, 0.097063f, 0.097254f, 0.097445f, 0.097635f, 0.097826f,
+ 0.098017f, 0.098208f, 0.098399f, 0.098590f, 0.098780f, 0.098971f, 0.099162f, 0.099353f,
+ 0.099544f, 0.099734f, 0.099925f, 0.100116f, 0.100307f, 0.100498f, 0.100688f, 0.100879f,
+ 0.101070f, 0.101261f, 0.101451f, 0.101642f, 0.101833f, 0.102024f, 0.102214f, 0.102405f,
+ 0.102596f, 0.102787f, 0.102977f, 0.103168f, 0.103359f, 0.103550f, 0.103740f, 0.103931f,
+ 0.104122f, 0.104312f, 0.104503f, 0.104694f, 0.104884f, 0.105075f, 0.105266f, 0.105456f,
+ 0.105647f, 0.105838f, 0.106028f, 0.106219f, 0.106410f, 0.106600f, 0.106791f, 0.106982f,
+ 0.107172f, 0.107363f, 0.107554f, 0.107744f, 0.107935f, 0.108126f, 0.108316f, 0.108507f,
+ 0.108697f, 0.108888f, 0.109079f, 0.109269f, 0.109460f, 0.109650f, 0.109841f, 0.110032f,
+ 0.110222f, 0.110413f, 0.110603f, 0.110794f, 0.110984f, 0.111175f, 0.111366f, 0.111556f,
+ 0.111747f, 0.111937f, 0.112128f, 0.112318f, 0.112509f, 0.112699f, 0.112890f, 0.113080f,
+ 0.113271f, 0.113461f, 0.113652f, 0.113842f, 0.114033f, 0.114223f, 0.114414f, 0.114604f,
+ 0.114795f, 0.114985f, 0.115176f, 0.115366f, 0.115557f, 0.115747f, 0.115938f, 0.116128f,
+ 0.116319f, 0.116509f, 0.116700f, 0.116890f, 0.117080f, 0.117271f, 0.117461f, 0.117652f,
+ 0.117842f, 0.118032f, 0.118223f, 0.118413f, 0.118604f, 0.118794f, 0.118984f, 0.119175f,
+ 0.119365f, 0.119556f, 0.119746f, 0.119936f, 0.120127f, 0.120317f, 0.120507f, 0.120698f,
+ 0.120888f, 0.121078f, 0.121269f, 0.121459f, 0.121649f, 0.121840f, 0.122030f, 0.122220f,
+ 0.122411f, 0.122601f, 0.122791f, 0.122982f, 0.123172f, 0.123362f, 0.123552f, 0.123743f,
+ 0.123933f, 0.124123f, 0.124314f, 0.124504f, 0.124694f, 0.124884f, 0.125075f, 0.125265f,
+ 0.125455f, 0.125645f, 0.125835f, 0.126026f, 0.126216f, 0.126406f, 0.126596f, 0.126787f,
+ 0.126977f, 0.127167f, 0.127357f, 0.127547f, 0.127737f, 0.127928f, 0.128118f, 0.128308f,
+ 0.128498f, 0.128688f, 0.128878f, 0.129069f, 0.129259f, 0.129449f, 0.129639f, 0.129829f,
+ 0.130019f, 0.130209f, 0.130399f, 0.130590f, 0.130780f, 0.130970f, 0.131160f, 0.131350f,
+ 0.131540f, 0.131730f, 0.131920f, 0.132110f, 0.132300f, 0.132490f, 0.132680f, 0.132870f,
+ 0.133061f, 0.133251f, 0.133441f, 0.133631f, 0.133821f, 0.134011f, 0.134201f, 0.134391f,
+ 0.134581f, 0.134771f, 0.134961f, 0.135151f, 0.135341f, 0.135531f, 0.135721f, 0.135911f,
+ 0.136101f, 0.136291f, 0.136480f, 0.136670f, 0.136860f, 0.137050f, 0.137240f, 0.137430f,
+ 0.137620f, 0.137810f, 0.138000f, 0.138190f, 0.138380f, 0.138570f, 0.138760f, 0.138949f,
+ 0.139139f, 0.139329f, 0.139519f, 0.139709f, 0.139899f, 0.140089f, 0.140279f, 0.140468f,
+ 0.140658f, 0.140848f, 0.141038f, 0.141228f, 0.141418f, 0.141607f, 0.141797f, 0.141987f,
+ 0.142177f, 0.142367f, 0.142556f, 0.142746f, 0.142936f, 0.143126f, 0.143316f, 0.143505f,
+ 0.143695f, 0.143885f, 0.144075f, 0.144264f, 0.144454f, 0.144644f, 0.144833f, 0.145023f,
+ 0.145213f, 0.145403f, 0.145592f, 0.145782f, 0.145972f, 0.146161f, 0.146351f, 0.146541f,
+ 0.146730f, 0.146920f, 0.147110f, 0.147299f, 0.147489f, 0.147679f, 0.147868f, 0.148058f,
+ 0.148248f, 0.148437f, 0.148627f, 0.148817f, 0.149006f, 0.149196f, 0.149385f, 0.149575f,
+ 0.149765f, 0.149954f, 0.150144f, 0.150333f, 0.150523f, 0.150712f, 0.150902f, 0.151092f,
+ 0.151281f, 0.151471f, 0.151660f, 0.151850f, 0.152039f, 0.152229f, 0.152418f, 0.152608f,
+ 0.152797f, 0.152987f, 0.153176f, 0.153366f, 0.153555f, 0.153745f, 0.153934f, 0.154124f,
+ 0.154313f, 0.154502f, 0.154692f, 0.154881f, 0.155071f, 0.155260f, 0.155450f, 0.155639f,
+ 0.155828f, 0.156018f, 0.156207f, 0.156397f, 0.156586f, 0.156775f, 0.156965f, 0.157154f,
+ 0.157343f, 0.157533f, 0.157722f, 0.157912f, 0.158101f, 0.158290f, 0.158480f, 0.158669f,
+ 0.158858f, 0.159047f, 0.159237f, 0.159426f, 0.159615f, 0.159805f, 0.159994f, 0.160183f,
+ 0.160372f, 0.160562f, 0.160751f, 0.160940f, 0.161129f, 0.161319f, 0.161508f, 0.161697f,
+ 0.161886f, 0.162076f, 0.162265f, 0.162454f, 0.162643f, 0.162832f, 0.163022f, 0.163211f,
+ 0.163400f, 0.163589f, 0.163778f, 0.163967f, 0.164157f, 0.164346f, 0.164535f, 0.164724f,
+ 0.164913f, 0.165102f, 0.165291f, 0.165480f, 0.165670f, 0.165859f, 0.166048f, 0.166237f,
+ 0.166426f, 0.166615f, 0.166804f, 0.166993f, 0.167182f, 0.167371f, 0.167560f, 0.167749f,
+ 0.167938f, 0.168127f, 0.168316f, 0.168505f, 0.168694f, 0.168883f, 0.169072f, 0.169261f,
+ 0.169450f, 0.169639f, 0.169828f, 0.170017f, 0.170206f, 0.170395f, 0.170584f, 0.170773f,
+ 0.170962f, 0.171151f, 0.171340f, 0.171529f, 0.171718f, 0.171906f, 0.172095f, 0.172284f,
+ 0.172473f, 0.172662f, 0.172851f, 0.173040f, 0.173229f, 0.173417f, 0.173606f, 0.173795f,
+ 0.173984f, 0.174173f, 0.174362f, 0.174550f, 0.174739f, 0.174928f, 0.175117f, 0.175305f,
+ 0.175494f, 0.175683f, 0.175872f, 0.176061f, 0.176249f, 0.176438f, 0.176627f, 0.176815f,
+ 0.177004f, 0.177193f, 0.177382f, 0.177570f, 0.177759f, 0.177948f, 0.178136f, 0.178325f,
+ 0.178514f, 0.178702f, 0.178891f, 0.179080f, 0.179268f, 0.179457f, 0.179646f, 0.179834f,
+ 0.180023f, 0.180212f, 0.180400f, 0.180589f, 0.180777f, 0.180966f, 0.181154f, 0.181343f,
+ 0.181532f, 0.181720f, 0.181909f, 0.182097f, 0.182286f, 0.182474f, 0.182663f, 0.182851f,
+ 0.183040f, 0.183228f, 0.183417f, 0.183605f, 0.183794f, 0.183982f, 0.184171f, 0.184359f,
+ 0.184548f, 0.184736f, 0.184925f, 0.185113f, 0.185301f, 0.185490f, 0.185678f, 0.185867f,
+ 0.186055f, 0.186244f, 0.186432f, 0.186620f, 0.186809f, 0.186997f, 0.187185f, 0.187374f,
+ 0.187562f, 0.187750f, 0.187939f, 0.188127f, 0.188315f, 0.188504f, 0.188692f, 0.188880f,
+ 0.189069f, 0.189257f, 0.189445f, 0.189634f, 0.189822f, 0.190010f, 0.190198f, 0.190387f,
+ 0.190575f, 0.190763f, 0.190951f, 0.191139f, 0.191328f, 0.191516f, 0.191704f, 0.191892f,
+ 0.192080f, 0.192269f, 0.192457f, 0.192645f, 0.192833f, 0.193021f, 0.193209f, 0.193397f,
+ 0.193586f, 0.193774f, 0.193962f, 0.194150f, 0.194338f, 0.194526f, 0.194714f, 0.194902f,
+ 0.195090f, 0.195278f, 0.195466f, 0.195654f, 0.195843f, 0.196031f, 0.196219f, 0.196407f,
+ 0.196595f, 0.196783f, 0.196971f, 0.197159f, 0.197347f, 0.197535f, 0.197722f, 0.197910f,
+ 0.198098f, 0.198286f, 0.198474f, 0.198662f, 0.198850f, 0.199038f, 0.199226f, 0.199414f,
+ 0.199602f, 0.199790f, 0.199978f, 0.200165f, 0.200353f, 0.200541f, 0.200729f, 0.200917f,
+ 0.201105f, 0.201292f, 0.201480f, 0.201668f, 0.201856f, 0.202044f, 0.202231f, 0.202419f,
+ 0.202607f, 0.202795f, 0.202983f, 0.203170f, 0.203358f, 0.203546f, 0.203734f, 0.203921f,
+ 0.204109f, 0.204297f, 0.204484f, 0.204672f, 0.204860f, 0.205047f, 0.205235f, 0.205423f,
+ 0.205610f, 0.205798f, 0.205986f, 0.206173f, 0.206361f, 0.206549f, 0.206736f, 0.206924f,
+ 0.207111f, 0.207299f, 0.207487f, 0.207674f, 0.207862f, 0.208049f, 0.208237f, 0.208424f,
+ 0.208612f, 0.208799f, 0.208987f, 0.209174f, 0.209362f, 0.209549f, 0.209737f, 0.209924f,
+ 0.210112f, 0.210299f, 0.210487f, 0.210674f, 0.210862f, 0.211049f, 0.211237f, 0.211424f,
+ 0.211611f, 0.211799f, 0.211986f, 0.212174f, 0.212361f, 0.212548f, 0.212736f, 0.212923f,
+ 0.213110f, 0.213298f, 0.213485f, 0.213672f, 0.213860f, 0.214047f, 0.214234f, 0.214422f,
+ 0.214609f, 0.214796f, 0.214983f, 0.215171f, 0.215358f, 0.215545f, 0.215732f, 0.215920f,
+ 0.216107f, 0.216294f, 0.216481f, 0.216668f, 0.216856f, 0.217043f, 0.217230f, 0.217417f,
+ 0.217604f, 0.217791f, 0.217979f, 0.218166f, 0.218353f, 0.218540f, 0.218727f, 0.218914f,
+ 0.219101f, 0.219288f, 0.219475f, 0.219662f, 0.219850f, 0.220037f, 0.220224f, 0.220411f,
+ 0.220598f, 0.220785f, 0.220972f, 0.221159f, 0.221346f, 0.221533f, 0.221720f, 0.221907f,
+ 0.222094f, 0.222281f, 0.222468f, 0.222654f, 0.222841f, 0.223028f, 0.223215f, 0.223402f,
+ 0.223589f, 0.223776f, 0.223963f, 0.224150f, 0.224337f, 0.224523f, 0.224710f, 0.224897f,
+ 0.225084f, 0.225271f, 0.225458f, 0.225644f, 0.225831f, 0.226018f, 0.226205f, 0.226391f,
+ 0.226578f, 0.226765f, 0.226952f, 0.227139f, 0.227325f, 0.227512f, 0.227699f, 0.227885f,
+ 0.228072f, 0.228259f, 0.228445f, 0.228632f, 0.228819f, 0.229005f, 0.229192f, 0.229379f,
+ 0.229565f, 0.229752f, 0.229939f, 0.230125f, 0.230312f, 0.230498f, 0.230685f, 0.230872f,
+ 0.231058f, 0.231245f, 0.231431f, 0.231618f, 0.231804f, 0.231991f, 0.232177f, 0.232364f,
+ 0.232550f, 0.232737f, 0.232923f, 0.233110f, 0.233296f, 0.233483f, 0.233669f, 0.233856f,
+ 0.234042f, 0.234228f, 0.234415f, 0.234601f, 0.234788f, 0.234974f, 0.235160f, 0.235347f,
+ 0.235533f, 0.235719f, 0.235906f, 0.236092f, 0.236278f, 0.236465f, 0.236651f, 0.236837f,
+ 0.237024f, 0.237210f, 0.237396f, 0.237582f, 0.237769f, 0.237955f, 0.238141f, 0.238327f,
+ 0.238514f, 0.238700f, 0.238886f, 0.239072f, 0.239258f, 0.239445f, 0.239631f, 0.239817f,
+ 0.240003f, 0.240189f, 0.240375f, 0.240561f, 0.240748f, 0.240934f, 0.241120f, 0.241306f,
+ 0.241492f, 0.241678f, 0.241864f, 0.242050f, 0.242236f, 0.242422f, 0.242608f, 0.242794f,
+ 0.242980f, 0.243166f, 0.243352f, 0.243538f, 0.243724f, 0.243910f, 0.244096f, 0.244282f,
+ 0.244468f, 0.244654f, 0.244840f, 0.245026f, 0.245212f, 0.245397f, 0.245583f, 0.245769f,
+ 0.245955f, 0.246141f, 0.246327f, 0.246513f, 0.246698f, 0.246884f, 0.247070f, 0.247256f,
+ 0.247442f, 0.247627f, 0.247813f, 0.247999f, 0.248185f, 0.248370f, 0.248556f, 0.248742f,
+ 0.248928f, 0.249113f, 0.249299f, 0.249485f, 0.249670f, 0.249856f, 0.250042f, 0.250227f,
+ 0.250413f, 0.250599f, 0.250784f, 0.250970f, 0.251155f, 0.251341f, 0.251527f, 0.251712f,
+ 0.251898f, 0.252083f, 0.252269f, 0.252454f, 0.252640f, 0.252826f, 0.253011f, 0.253197f,
+ 0.253382f, 0.253568f, 0.253753f, 0.253938f, 0.254124f, 0.254309f, 0.254495f, 0.254680f,
+ 0.254866f, 0.255051f, 0.255236f, 0.255422f, 0.255607f, 0.255793f, 0.255978f, 0.256163f,
+ 0.256349f, 0.256534f, 0.256719f, 0.256905f, 0.257090f, 0.257275f, 0.257461f, 0.257646f,
+ 0.257831f, 0.258016f, 0.258202f, 0.258387f, 0.258572f, 0.258757f, 0.258943f, 0.259128f,
+ 0.259313f, 0.259498f, 0.259683f, 0.259868f, 0.260054f, 0.260239f, 0.260424f, 0.260609f,
+ 0.260794f, 0.260979f, 0.261164f, 0.261349f, 0.261534f, 0.261720f, 0.261905f, 0.262090f,
+ 0.262275f, 0.262460f, 0.262645f, 0.262830f, 0.263015f, 0.263200f, 0.263385f, 0.263570f,
+ 0.263755f, 0.263940f, 0.264125f, 0.264309f, 0.264494f, 0.264679f, 0.264864f, 0.265049f,
+ 0.265234f, 0.265419f, 0.265604f, 0.265789f, 0.265973f, 0.266158f, 0.266343f, 0.266528f,
+ 0.266713f, 0.266898f, 0.267082f, 0.267267f, 0.267452f, 0.267637f, 0.267821f, 0.268006f,
+ 0.268191f, 0.268376f, 0.268560f, 0.268745f, 0.268930f, 0.269114f, 0.269299f, 0.269484f,
+ 0.269668f, 0.269853f, 0.270038f, 0.270222f, 0.270407f, 0.270591f, 0.270776f, 0.270961f,
+ 0.271145f, 0.271330f, 0.271514f, 0.271699f, 0.271883f, 0.272068f, 0.272252f, 0.272437f,
+ 0.272621f, 0.272806f, 0.272990f, 0.273175f, 0.273359f, 0.273544f, 0.273728f, 0.273912f,
+ 0.274097f, 0.274281f, 0.274466f, 0.274650f, 0.274834f, 0.275019f, 0.275203f, 0.275387f,
+ 0.275572f, 0.275756f, 0.275940f, 0.276125f, 0.276309f, 0.276493f, 0.276678f, 0.276862f,
+ 0.277046f, 0.277230f, 0.277415f, 0.277599f, 0.277783f, 0.277967f, 0.278151f, 0.278336f,
+ 0.278520f, 0.278704f, 0.278888f, 0.279072f, 0.279256f, 0.279440f, 0.279624f, 0.279809f,
+ 0.279993f, 0.280177f, 0.280361f, 0.280545f, 0.280729f, 0.280913f, 0.281097f, 0.281281f,
+ 0.281465f, 0.281649f, 0.281833f, 0.282017f, 0.282201f, 0.282385f, 0.282569f, 0.282753f,
+ 0.282937f, 0.283120f, 0.283304f, 0.283488f, 0.283672f, 0.283856f, 0.284040f, 0.284224f,
+ 0.284408f, 0.284591f, 0.284775f, 0.284959f, 0.285143f, 0.285327f, 0.285510f, 0.285694f,
+ 0.285878f, 0.286062f, 0.286245f, 0.286429f, 0.286613f, 0.286796f, 0.286980f, 0.287164f,
+ 0.287347f, 0.287531f, 0.287715f, 0.287898f, 0.288082f, 0.288266f, 0.288449f, 0.288633f,
+ 0.288816f, 0.289000f, 0.289184f, 0.289367f, 0.289551f, 0.289734f, 0.289918f, 0.290101f,
+ 0.290285f, 0.290468f, 0.290652f, 0.290835f, 0.291019f, 0.291202f, 0.291385f, 0.291569f,
+ 0.291752f, 0.291936f, 0.292119f, 0.292302f, 0.292486f, 0.292669f, 0.292852f, 0.293036f,
+ 0.293219f, 0.293402f, 0.293586f, 0.293769f, 0.293952f, 0.294136f, 0.294319f, 0.294502f,
+ 0.294685f, 0.294869f, 0.295052f, 0.295235f, 0.295418f, 0.295601f, 0.295785f, 0.295968f,
+ 0.296151f, 0.296334f, 0.296517f, 0.296700f, 0.296883f, 0.297066f, 0.297250f, 0.297433f,
+ 0.297616f, 0.297799f, 0.297982f, 0.298165f, 0.298348f, 0.298531f, 0.298714f, 0.298897f,
+ 0.299080f, 0.299263f, 0.299446f, 0.299629f, 0.299812f, 0.299995f, 0.300177f, 0.300360f,
+ 0.300543f, 0.300726f, 0.300909f, 0.301092f, 0.301275f, 0.301458f, 0.301640f, 0.301823f,
+ 0.302006f, 0.302189f, 0.302372f, 0.302554f, 0.302737f, 0.302920f, 0.303103f, 0.303285f,
+ 0.303468f, 0.303651f, 0.303833f, 0.304016f, 0.304199f, 0.304381f, 0.304564f, 0.304747f,
+ 0.304929f, 0.305112f, 0.305294f, 0.305477f, 0.305660f, 0.305842f, 0.306025f, 0.306207f,
+ 0.306390f, 0.306572f, 0.306755f, 0.306937f, 0.307120f, 0.307302f, 0.307485f, 0.307667f,
+ 0.307850f, 0.308032f, 0.308214f, 0.308397f, 0.308579f, 0.308762f, 0.308944f, 0.309126f,
+ 0.309309f, 0.309491f, 0.309673f, 0.309856f, 0.310038f, 0.310220f, 0.310403f, 0.310585f,
+ 0.310767f, 0.310949f, 0.311132f, 0.311314f, 0.311496f, 0.311678f, 0.311860f, 0.312043f,
+ 0.312225f, 0.312407f, 0.312589f, 0.312771f, 0.312953f, 0.313135f, 0.313318f, 0.313500f,
+ 0.313682f, 0.313864f, 0.314046f, 0.314228f, 0.314410f, 0.314592f, 0.314774f, 0.314956f,
+ 0.315138f, 0.315320f, 0.315502f, 0.315684f, 0.315866f, 0.316048f, 0.316230f, 0.316411f,
+ 0.316593f, 0.316775f, 0.316957f, 0.317139f, 0.317321f, 0.317503f, 0.317684f, 0.317866f,
+ 0.318048f, 0.318230f, 0.318412f, 0.318593f, 0.318775f, 0.318957f, 0.319139f, 0.319320f,
+ 0.319502f, 0.319684f, 0.319865f, 0.320047f, 0.320229f, 0.320410f, 0.320592f, 0.320774f,
+ 0.320955f, 0.321137f, 0.321318f, 0.321500f, 0.321682f, 0.321863f, 0.322045f, 0.322226f,
+ 0.322408f, 0.322589f, 0.322771f, 0.322952f, 0.323134f, 0.323315f, 0.323497f, 0.323678f,
+ 0.323859f, 0.324041f, 0.324222f, 0.324404f, 0.324585f, 0.324766f, 0.324948f, 0.325129f,
+ 0.325310f, 0.325492f, 0.325673f, 0.325854f, 0.326035f, 0.326217f, 0.326398f, 0.326579f,
+ 0.326760f, 0.326942f, 0.327123f, 0.327304f, 0.327485f, 0.327666f, 0.327848f, 0.328029f,
+ 0.328210f, 0.328391f, 0.328572f, 0.328753f, 0.328934f, 0.329115f, 0.329296f, 0.329477f,
+ 0.329658f, 0.329839f, 0.330020f, 0.330202f, 0.330382f, 0.330563f, 0.330744f, 0.330925f,
+ 0.331106f, 0.331287f, 0.331468f, 0.331649f, 0.331830f, 0.332011f, 0.332192f, 0.332373f,
+ 0.332553f, 0.332734f, 0.332915f, 0.333096f, 0.333277f, 0.333457f, 0.333638f, 0.333819f,
+ 0.334000f, 0.334180f, 0.334361f, 0.334542f, 0.334722f, 0.334903f, 0.335084f, 0.335265f,
+ 0.335445f, 0.335626f, 0.335806f, 0.335987f, 0.336168f, 0.336348f, 0.336529f, 0.336709f,
+ 0.336890f, 0.337070f, 0.337251f, 0.337431f, 0.337612f, 0.337792f, 0.337973f, 0.338153f,
+ 0.338334f, 0.338514f, 0.338695f, 0.338875f, 0.339055f, 0.339236f, 0.339416f, 0.339597f,
+ 0.339777f, 0.339957f, 0.340138f, 0.340318f, 0.340498f, 0.340678f, 0.340859f, 0.341039f,
+ 0.341219f, 0.341399f, 0.341580f, 0.341760f, 0.341940f, 0.342120f, 0.342300f, 0.342481f,
+ 0.342661f, 0.342841f, 0.343021f, 0.343201f, 0.343381f, 0.343561f, 0.343741f, 0.343921f,
+ 0.344101f, 0.344281f, 0.344461f, 0.344641f, 0.344821f, 0.345001f, 0.345181f, 0.345361f,
+ 0.345541f, 0.345721f, 0.345901f, 0.346081f, 0.346261f, 0.346441f, 0.346621f, 0.346801f,
+ 0.346980f, 0.347160f, 0.347340f, 0.347520f, 0.347700f, 0.347879f, 0.348059f, 0.348239f,
+ 0.348419f, 0.348598f, 0.348778f, 0.348958f, 0.349138f, 0.349317f, 0.349497f, 0.349676f,
+ 0.349856f, 0.350036f, 0.350215f, 0.350395f, 0.350575f, 0.350754f, 0.350934f, 0.351113f,
+ 0.351293f, 0.351472f, 0.351652f, 0.351831f, 0.352011f, 0.352190f, 0.352370f, 0.352549f,
+ 0.352729f, 0.352908f, 0.353087f, 0.353267f, 0.353446f, 0.353626f, 0.353805f, 0.353984f,
+ 0.354164f, 0.354343f, 0.354522f, 0.354701f, 0.354881f, 0.355060f, 0.355239f, 0.355418f,
+ 0.355598f, 0.355777f, 0.355956f, 0.356135f, 0.356314f, 0.356494f, 0.356673f, 0.356852f,
+ 0.357031f, 0.357210f, 0.357389f, 0.357568f, 0.357747f, 0.357926f, 0.358105f, 0.358284f,
+ 0.358463f, 0.358642f, 0.358821f, 0.359000f, 0.359179f, 0.359358f, 0.359537f, 0.359716f,
+ 0.359895f, 0.360074f, 0.360253f, 0.360432f, 0.360611f, 0.360789f, 0.360968f, 0.361147f,
+ 0.361326f, 0.361505f, 0.361683f, 0.361862f, 0.362041f, 0.362220f, 0.362398f, 0.362577f,
+ 0.362756f, 0.362934f, 0.363113f, 0.363292f, 0.363470f, 0.363649f, 0.363828f, 0.364006f,
+ 0.364185f, 0.364363f, 0.364542f, 0.364720f, 0.364899f, 0.365078f, 0.365256f, 0.365435f,
+ 0.365613f, 0.365791f, 0.365970f, 0.366148f, 0.366327f, 0.366505f, 0.366684f, 0.366862f,
+ 0.367040f, 0.367219f, 0.367397f, 0.367575f, 0.367754f, 0.367932f, 0.368110f, 0.368289f,
+ 0.368467f, 0.368645f, 0.368823f, 0.369002f, 0.369180f, 0.369358f, 0.369536f, 0.369714f,
+ 0.369892f, 0.370071f, 0.370249f, 0.370427f, 0.370605f, 0.370783f, 0.370961f, 0.371139f,
+ 0.371317f, 0.371495f, 0.371673f, 0.371851f, 0.372029f, 0.372207f, 0.372385f, 0.372563f,
+ 0.372741f, 0.372919f, 0.373097f, 0.373275f, 0.373453f, 0.373631f, 0.373808f, 0.373986f,
+ 0.374164f, 0.374342f, 0.374520f, 0.374697f, 0.374875f, 0.375053f, 0.375231f, 0.375408f,
+ 0.375586f, 0.375764f, 0.375942f, 0.376119f, 0.376297f, 0.376475f, 0.376652f, 0.376830f,
+ 0.377007f, 0.377185f, 0.377363f, 0.377540f, 0.377718f, 0.377895f, 0.378073f, 0.378250f,
+ 0.378428f, 0.378605f, 0.378783f, 0.378960f, 0.379138f, 0.379315f, 0.379492f, 0.379670f,
+ 0.379847f, 0.380025f, 0.380202f, 0.380379f, 0.380557f, 0.380734f, 0.380911f, 0.381088f,
+ 0.381266f, 0.381443f, 0.381620f, 0.381797f, 0.381975f, 0.382152f, 0.382329f, 0.382506f,
+ 0.382683f, 0.382861f, 0.383038f, 0.383215f, 0.383392f, 0.383569f, 0.383746f, 0.383923f,
+ 0.384100f, 0.384277f, 0.384454f, 0.384631f, 0.384808f, 0.384985f, 0.385162f, 0.385339f,
+ 0.385516f, 0.385693f, 0.385870f, 0.386047f, 0.386224f, 0.386400f, 0.386577f, 0.386754f,
+ 0.386931f, 0.387108f, 0.387285f, 0.387461f, 0.387638f, 0.387815f, 0.387992f, 0.388168f,
+ 0.388345f, 0.388522f, 0.388698f, 0.388875f, 0.389052f, 0.389228f, 0.389405f, 0.389582f,
+ 0.389758f, 0.389935f, 0.390111f, 0.390288f, 0.390464f, 0.390641f, 0.390817f, 0.390994f,
+ 0.391170f, 0.391347f, 0.391523f, 0.391700f, 0.391876f, 0.392053f, 0.392229f, 0.392405f,
+ 0.392582f, 0.392758f, 0.392934f, 0.393111f, 0.393287f, 0.393463f, 0.393640f, 0.393816f,
+ 0.393992f, 0.394168f, 0.394344f, 0.394521f, 0.394697f, 0.394873f, 0.395049f, 0.395225f,
+ 0.395401f, 0.395578f, 0.395754f, 0.395930f, 0.396106f, 0.396282f, 0.396458f, 0.396634f,
+ 0.396810f, 0.396986f, 0.397162f, 0.397338f, 0.397514f, 0.397690f, 0.397866f, 0.398042f,
+ 0.398218f, 0.398393f, 0.398569f, 0.398745f, 0.398921f, 0.399097f, 0.399273f, 0.399448f,
+ 0.399624f, 0.399800f, 0.399976f, 0.400151f, 0.400327f, 0.400503f, 0.400679f, 0.400854f,
+ 0.401030f, 0.401206f, 0.401381f, 0.401557f, 0.401732f, 0.401908f, 0.402084f, 0.402259f,
+ 0.402435f, 0.402610f, 0.402786f, 0.402961f, 0.403137f, 0.403312f, 0.403488f, 0.403663f,
+ 0.403838f, 0.404014f, 0.404189f, 0.404365f, 0.404540f, 0.404715f, 0.404891f, 0.405066f,
+ 0.405241f, 0.405417f, 0.405592f, 0.405767f, 0.405942f, 0.406118f, 0.406293f, 0.406468f,
+ 0.406643f, 0.406818f, 0.406994f, 0.407169f, 0.407344f, 0.407519f, 0.407694f, 0.407869f,
+ 0.408044f, 0.408219f, 0.408394f, 0.408569f, 0.408744f, 0.408919f, 0.409094f, 0.409269f,
+ 0.409444f, 0.409619f, 0.409794f, 0.409969f, 0.410144f, 0.410319f, 0.410493f, 0.410668f,
+ 0.410843f, 0.411018f, 0.411193f, 0.411368f, 0.411542f, 0.411717f, 0.411892f, 0.412067f,
+ 0.412241f, 0.412416f, 0.412591f, 0.412765f, 0.412940f, 0.413115f, 0.413289f, 0.413464f,
+ 0.413638f, 0.413813f, 0.413987f, 0.414162f, 0.414337f, 0.414511f, 0.414685f, 0.414860f,
+ 0.415034f, 0.415209f, 0.415383f, 0.415558f, 0.415732f, 0.415906f, 0.416081f, 0.416255f,
+ 0.416430f, 0.416604f, 0.416778f, 0.416952f, 0.417127f, 0.417301f, 0.417475f, 0.417650f,
+ 0.417824f, 0.417998f, 0.418172f, 0.418346f, 0.418520f, 0.418695f, 0.418869f, 0.419043f,
+ 0.419217f, 0.419391f, 0.419565f, 0.419739f, 0.419913f, 0.420087f, 0.420261f, 0.420435f,
+ 0.420609f, 0.420783f, 0.420957f, 0.421131f, 0.421305f, 0.421479f, 0.421653f, 0.421826f,
+ 0.422000f, 0.422174f, 0.422348f, 0.422522f, 0.422695f, 0.422869f, 0.423043f, 0.423217f,
+ 0.423390f, 0.423564f, 0.423738f, 0.423912f, 0.424085f, 0.424259f, 0.424432f, 0.424606f,
+ 0.424780f, 0.424953f, 0.425127f, 0.425300f, 0.425474f, 0.425647f, 0.425821f, 0.425994f,
+ 0.426168f, 0.426341f, 0.426515f, 0.426688f, 0.426862f, 0.427035f, 0.427208f, 0.427382f,
+ 0.427555f, 0.427728f, 0.427902f, 0.428075f, 0.428248f, 0.428422f, 0.428595f, 0.428768f,
+ 0.428941f, 0.429114f, 0.429288f, 0.429461f, 0.429634f, 0.429807f, 0.429980f, 0.430153f,
+ 0.430326f, 0.430500f, 0.430673f, 0.430846f, 0.431019f, 0.431192f, 0.431365f, 0.431538f,
+ 0.431711f, 0.431884f, 0.432057f, 0.432229f, 0.432402f, 0.432575f, 0.432748f, 0.432921f,
+ 0.433094f, 0.433267f, 0.433439f, 0.433612f, 0.433785f, 0.433958f, 0.434131f, 0.434303f,
+ 0.434476f, 0.434649f, 0.434821f, 0.434994f, 0.435167f, 0.435339f, 0.435512f, 0.435685f,
+ 0.435857f, 0.436030f, 0.436202f, 0.436375f, 0.436547f, 0.436720f, 0.436892f, 0.437065f,
+ 0.437237f, 0.437410f, 0.437582f, 0.437754f, 0.437927f, 0.438099f, 0.438272f, 0.438444f,
+ 0.438616f, 0.438789f, 0.438961f, 0.439133f, 0.439305f, 0.439478f, 0.439650f, 0.439822f,
+ 0.439994f, 0.440166f, 0.440339f, 0.440511f, 0.440683f, 0.440855f, 0.441027f, 0.441199f,
+ 0.441371f, 0.441543f, 0.441715f, 0.441887f, 0.442059f, 0.442231f, 0.442403f, 0.442575f,
+ 0.442747f, 0.442919f, 0.443091f, 0.443263f, 0.443435f, 0.443607f, 0.443779f, 0.443950f,
+ 0.444122f, 0.444294f, 0.444466f, 0.444637f, 0.444809f, 0.444981f, 0.445153f, 0.445324f,
+ 0.445496f, 0.445668f, 0.445839f, 0.446011f, 0.446183f, 0.446354f, 0.446526f, 0.446697f,
+ 0.446869f, 0.447040f, 0.447212f, 0.447383f, 0.447555f, 0.447726f, 0.447898f, 0.448069f,
+ 0.448241f, 0.448412f, 0.448583f, 0.448755f, 0.448926f, 0.449097f, 0.449269f, 0.449440f,
+ 0.449611f, 0.449783f, 0.449954f, 0.450125f, 0.450296f, 0.450467f, 0.450639f, 0.450810f,
+ 0.450981f, 0.451152f, 0.451323f, 0.451494f, 0.451665f, 0.451836f, 0.452008f, 0.452179f,
+ 0.452350f, 0.452521f, 0.452692f, 0.452863f, 0.453033f, 0.453204f, 0.453375f, 0.453546f,
+ 0.453717f, 0.453888f, 0.454059f, 0.454230f, 0.454400f, 0.454571f, 0.454742f, 0.454913f,
+ 0.455084f, 0.455254f, 0.455425f, 0.455596f, 0.455766f, 0.455937f, 0.456108f, 0.456278f,
+ 0.456449f, 0.456620f, 0.456790f, 0.456961f, 0.457131f, 0.457302f, 0.457472f, 0.457643f,
+ 0.457813f, 0.457984f, 0.458154f, 0.458325f, 0.458495f, 0.458665f, 0.458836f, 0.459006f,
+ 0.459177f, 0.459347f, 0.459517f, 0.459687f, 0.459858f, 0.460028f, 0.460198f, 0.460369f,
+ 0.460539f, 0.460709f, 0.460879f, 0.461049f, 0.461219f, 0.461390f, 0.461560f, 0.461730f,
+ 0.461900f, 0.462070f, 0.462240f, 0.462410f, 0.462580f, 0.462750f, 0.462920f, 0.463090f,
+ 0.463260f, 0.463430f, 0.463600f, 0.463769f, 0.463939f, 0.464109f, 0.464279f, 0.464449f,
+ 0.464619f, 0.464788f, 0.464958f, 0.465128f, 0.465298f, 0.465467f, 0.465637f, 0.465807f,
+ 0.465977f, 0.466146f, 0.466316f, 0.466485f, 0.466655f, 0.466825f, 0.466994f, 0.467164f,
+ 0.467333f, 0.467503f, 0.467672f, 0.467842f, 0.468011f, 0.468181f, 0.468350f, 0.468519f,
+ 0.468689f, 0.468858f, 0.469028f, 0.469197f, 0.469366f, 0.469536f, 0.469705f, 0.469874f,
+ 0.470043f, 0.470213f, 0.470382f, 0.470551f, 0.470720f, 0.470889f, 0.471058f, 0.471228f,
+ 0.471397f, 0.471566f, 0.471735f, 0.471904f, 0.472073f, 0.472242f, 0.472411f, 0.472580f,
+ 0.472749f, 0.472918f, 0.473087f, 0.473256f, 0.473425f, 0.473594f, 0.473763f, 0.473931f,
+ 0.474100f, 0.474269f, 0.474438f, 0.474607f, 0.474775f, 0.474944f, 0.475113f, 0.475282f,
+ 0.475450f, 0.475619f, 0.475788f, 0.475956f, 0.476125f, 0.476294f, 0.476462f, 0.476631f,
+ 0.476799f, 0.476968f, 0.477136f, 0.477305f, 0.477473f, 0.477642f, 0.477810f, 0.477979f,
+ 0.478147f, 0.478315f, 0.478484f, 0.478652f, 0.478821f, 0.478989f, 0.479157f, 0.479325f,
+ 0.479494f, 0.479662f, 0.479830f, 0.479998f, 0.480167f, 0.480335f, 0.480503f, 0.480671f,
+ 0.480839f, 0.481007f, 0.481176f, 0.481344f, 0.481512f, 0.481680f, 0.481848f, 0.482016f,
+ 0.482184f, 0.482352f, 0.482520f, 0.482688f, 0.482856f, 0.483023f, 0.483191f, 0.483359f,
+ 0.483527f, 0.483695f, 0.483863f, 0.484031f, 0.484198f, 0.484366f, 0.484534f, 0.484702f,
+ 0.484869f, 0.485037f, 0.485205f, 0.485372f, 0.485540f, 0.485708f, 0.485875f, 0.486043f,
+ 0.486210f, 0.486378f, 0.486545f, 0.486713f, 0.486880f, 0.487048f, 0.487215f, 0.487383f,
+ 0.487550f, 0.487718f, 0.487885f, 0.488052f, 0.488220f, 0.488387f, 0.488554f, 0.488722f,
+ 0.488889f, 0.489056f, 0.489223f, 0.489391f, 0.489558f, 0.489725f, 0.489892f, 0.490059f,
+ 0.490226f, 0.490394f, 0.490561f, 0.490728f, 0.490895f, 0.491062f, 0.491229f, 0.491396f,
+ 0.491563f, 0.491730f, 0.491897f, 0.492064f, 0.492231f, 0.492398f, 0.492564f, 0.492731f,
+ 0.492898f, 0.493065f, 0.493232f, 0.493399f, 0.493565f, 0.493732f, 0.493899f, 0.494066f,
+ 0.494232f, 0.494399f, 0.494566f, 0.494732f, 0.494899f, 0.495066f, 0.495232f, 0.495399f,
+ 0.495565f, 0.495732f, 0.495898f, 0.496065f, 0.496231f, 0.496398f, 0.496564f, 0.496731f,
+ 0.496897f, 0.497063f, 0.497230f, 0.497396f, 0.497562f, 0.497729f, 0.497895f, 0.498061f,
+ 0.498228f, 0.498394f, 0.498560f, 0.498726f, 0.498893f, 0.499059f, 0.499225f, 0.499391f,
+ 0.499557f, 0.499723f, 0.499889f, 0.500055f, 0.500221f, 0.500387f, 0.500553f, 0.500719f,
+ 0.500885f, 0.501051f, 0.501217f, 0.501383f, 0.501549f, 0.501715f, 0.501881f, 0.502047f,
+ 0.502212f, 0.502378f, 0.502544f, 0.502710f, 0.502876f, 0.503041f, 0.503207f, 0.503373f,
+ 0.503538f, 0.503704f, 0.503870f, 0.504035f, 0.504201f, 0.504366f, 0.504532f, 0.504698f,
+ 0.504863f, 0.505029f, 0.505194f, 0.505360f, 0.505525f, 0.505690f, 0.505856f, 0.506021f,
+ 0.506187f, 0.506352f, 0.506517f, 0.506683f, 0.506848f, 0.507013f, 0.507179f, 0.507344f,
+ 0.507509f, 0.507674f, 0.507839f, 0.508005f, 0.508170f, 0.508335f, 0.508500f, 0.508665f,
+ 0.508830f, 0.508995f, 0.509160f, 0.509325f, 0.509490f, 0.509655f, 0.509820f, 0.509985f,
+ 0.510150f, 0.510315f, 0.510480f, 0.510645f, 0.510810f, 0.510974f, 0.511139f, 0.511304f,
+ 0.511469f, 0.511634f, 0.511798f, 0.511963f, 0.512128f, 0.512292f, 0.512457f, 0.512622f,
+ 0.512786f, 0.512951f, 0.513116f, 0.513280f, 0.513445f, 0.513609f, 0.513774f, 0.513938f,
+ 0.514103f, 0.514267f, 0.514432f, 0.514596f, 0.514760f, 0.514925f, 0.515089f, 0.515254f,
+ 0.515418f, 0.515582f, 0.515746f, 0.515911f, 0.516075f, 0.516239f, 0.516403f, 0.516568f,
+ 0.516732f, 0.516896f, 0.517060f, 0.517224f, 0.517388f, 0.517552f, 0.517716f, 0.517880f,
+ 0.518045f, 0.518209f, 0.518372f, 0.518536f, 0.518700f, 0.518864f, 0.519028f, 0.519192f,
+ 0.519356f, 0.519520f, 0.519684f, 0.519848f, 0.520011f, 0.520175f, 0.520339f, 0.520503f,
+ 0.520666f, 0.520830f, 0.520994f, 0.521157f, 0.521321f, 0.521485f, 0.521648f, 0.521812f,
+ 0.521975f, 0.522139f, 0.522302f, 0.522466f, 0.522629f, 0.522793f, 0.522956f, 0.523120f,
+ 0.523283f, 0.523447f, 0.523610f, 0.523773f, 0.523937f, 0.524100f, 0.524263f, 0.524426f,
+ 0.524590f, 0.524753f, 0.524916f, 0.525079f, 0.525243f, 0.525406f, 0.525569f, 0.525732f,
+ 0.525895f, 0.526058f, 0.526221f, 0.526384f, 0.526547f, 0.526710f, 0.526873f, 0.527036f,
+ 0.527199f, 0.527362f, 0.527525f, 0.527688f, 0.527851f, 0.528014f, 0.528176f, 0.528339f,
+ 0.528502f, 0.528665f, 0.528828f, 0.528990f, 0.529153f, 0.529316f, 0.529478f, 0.529641f,
+ 0.529804f, 0.529966f, 0.530129f, 0.530291f, 0.530454f, 0.530617f, 0.530779f, 0.530942f,
+ 0.531104f, 0.531266f, 0.531429f, 0.531591f, 0.531754f, 0.531916f, 0.532078f, 0.532241f,
+ 0.532403f, 0.532565f, 0.532728f, 0.532890f, 0.533052f, 0.533214f, 0.533377f, 0.533539f,
+ 0.533701f, 0.533863f, 0.534025f, 0.534187f, 0.534349f, 0.534512f, 0.534674f, 0.534836f,
+ 0.534998f, 0.535160f, 0.535322f, 0.535484f, 0.535645f, 0.535807f, 0.535969f, 0.536131f,
+ 0.536293f, 0.536455f, 0.536617f, 0.536778f, 0.536940f, 0.537102f, 0.537264f, 0.537425f,
+ 0.537587f, 0.537749f, 0.537910f, 0.538072f, 0.538234f, 0.538395f, 0.538557f, 0.538718f,
+ 0.538880f, 0.539041f, 0.539203f, 0.539364f, 0.539526f, 0.539687f, 0.539849f, 0.540010f,
+ 0.540171f, 0.540333f, 0.540494f, 0.540655f, 0.540817f, 0.540978f, 0.541139f, 0.541301f,
+ 0.541462f, 0.541623f, 0.541784f, 0.541945f, 0.542106f, 0.542268f, 0.542429f, 0.542590f,
+ 0.542751f, 0.542912f, 0.543073f, 0.543234f, 0.543395f, 0.543556f, 0.543717f, 0.543878f,
+ 0.544039f, 0.544199f, 0.544360f, 0.544521f, 0.544682f, 0.544843f, 0.545003f, 0.545164f,
+ 0.545325f, 0.545486f, 0.545646f, 0.545807f, 0.545968f, 0.546128f, 0.546289f, 0.546450f,
+ 0.546610f, 0.546771f, 0.546931f, 0.547092f, 0.547252f, 0.547413f, 0.547573f, 0.547734f,
+ 0.547894f, 0.548054f, 0.548215f, 0.548375f, 0.548536f, 0.548696f, 0.548856f, 0.549016f,
+ 0.549177f, 0.549337f, 0.549497f, 0.549657f, 0.549818f, 0.549978f, 0.550138f, 0.550298f,
+ 0.550458f, 0.550618f, 0.550778f, 0.550938f, 0.551098f, 0.551258f, 0.551418f, 0.551578f,
+ 0.551738f, 0.551898f, 0.552058f, 0.552218f, 0.552378f, 0.552537f, 0.552697f, 0.552857f,
+ 0.553017f, 0.553176f, 0.553336f, 0.553496f, 0.553656f, 0.553815f, 0.553975f, 0.554134f,
+ 0.554294f, 0.554454f, 0.554613f, 0.554773f, 0.554932f, 0.555092f, 0.555251f, 0.555411f,
+ 0.555570f, 0.555730f, 0.555889f, 0.556048f, 0.556208f, 0.556367f, 0.556526f, 0.556686f,
+ 0.556845f, 0.557004f, 0.557164f, 0.557323f, 0.557482f, 0.557641f, 0.557800f, 0.557959f,
+ 0.558119f, 0.558278f, 0.558437f, 0.558596f, 0.558755f, 0.558914f, 0.559073f, 0.559232f,
+ 0.559391f, 0.559550f, 0.559709f, 0.559867f, 0.560026f, 0.560185f, 0.560344f, 0.560503f,
+ 0.560662f, 0.560820f, 0.560979f, 0.561138f, 0.561297f, 0.561455f, 0.561614f, 0.561773f,
+ 0.561931f, 0.562090f, 0.562248f, 0.562407f, 0.562565f, 0.562724f, 0.562882f, 0.563041f,
+ 0.563199f, 0.563358f, 0.563516f, 0.563675f, 0.563833f, 0.563991f, 0.564150f, 0.564308f,
+ 0.564466f, 0.564624f, 0.564783f, 0.564941f, 0.565099f, 0.565257f, 0.565416f, 0.565574f,
+ 0.565732f, 0.565890f, 0.566048f, 0.566206f, 0.566364f, 0.566522f, 0.566680f, 0.566838f,
+ 0.566996f, 0.567154f, 0.567312f, 0.567470f, 0.567628f, 0.567786f, 0.567943f, 0.568101f,
+ 0.568259f, 0.568417f, 0.568574f, 0.568732f, 0.568890f, 0.569048f, 0.569205f, 0.569363f,
+ 0.569521f, 0.569678f, 0.569836f, 0.569993f, 0.570151f, 0.570308f, 0.570466f, 0.570623f,
+ 0.570781f, 0.570938f, 0.571096f, 0.571253f, 0.571410f, 0.571568f, 0.571725f, 0.571882f,
+ 0.572040f, 0.572197f, 0.572354f, 0.572511f, 0.572669f, 0.572826f, 0.572983f, 0.573140f,
+ 0.573297f, 0.573454f, 0.573611f, 0.573768f, 0.573925f, 0.574082f, 0.574239f, 0.574396f,
+ 0.574553f, 0.574710f, 0.574867f, 0.575024f, 0.575181f, 0.575338f, 0.575495f, 0.575651f,
+ 0.575808f, 0.575965f, 0.576122f, 0.576278f, 0.576435f, 0.576592f, 0.576748f, 0.576905f,
+ 0.577062f, 0.577218f, 0.577375f, 0.577531f, 0.577688f, 0.577844f, 0.578001f, 0.578157f,
+ 0.578314f, 0.578470f, 0.578627f, 0.578783f, 0.578939f, 0.579096f, 0.579252f, 0.579408f,
+ 0.579565f, 0.579721f, 0.579877f, 0.580033f, 0.580189f, 0.580346f, 0.580502f, 0.580658f,
+ 0.580814f, 0.580970f, 0.581126f, 0.581282f, 0.581438f, 0.581594f, 0.581750f, 0.581906f,
+ 0.582062f, 0.582218f, 0.582374f, 0.582530f, 0.582685f, 0.582841f, 0.582997f, 0.583153f,
+ 0.583309f, 0.583464f, 0.583620f, 0.583776f, 0.583931f, 0.584087f, 0.584243f, 0.584398f,
+ 0.584554f, 0.584710f, 0.584865f, 0.585021f, 0.585176f, 0.585332f, 0.585487f, 0.585642f,
+ 0.585798f, 0.585953f, 0.586109f, 0.586264f, 0.586419f, 0.586575f, 0.586730f, 0.586885f,
+ 0.587040f, 0.587196f, 0.587351f, 0.587506f, 0.587661f, 0.587816f, 0.587971f, 0.588126f,
+ 0.588282f, 0.588437f, 0.588592f, 0.588747f, 0.588902f, 0.589057f, 0.589212f, 0.589366f,
+ 0.589521f, 0.589676f, 0.589831f, 0.589986f, 0.590141f, 0.590295f, 0.590450f, 0.590605f,
+ 0.590760f, 0.590914f, 0.591069f, 0.591224f, 0.591378f, 0.591533f, 0.591688f, 0.591842f,
+ 0.591997f, 0.592151f, 0.592306f, 0.592460f, 0.592615f, 0.592769f, 0.592924f, 0.593078f,
+ 0.593232f, 0.593387f, 0.593541f, 0.593695f, 0.593850f, 0.594004f, 0.594158f, 0.594312f,
+ 0.594467f, 0.594621f, 0.594775f, 0.594929f, 0.595083f, 0.595237f, 0.595391f, 0.595545f,
+ 0.595699f, 0.595853f, 0.596007f, 0.596161f, 0.596315f, 0.596469f, 0.596623f, 0.596777f,
+ 0.596931f, 0.597085f, 0.597238f, 0.597392f, 0.597546f, 0.597700f, 0.597853f, 0.598007f,
+ 0.598161f, 0.598314f, 0.598468f, 0.598622f, 0.598775f, 0.598929f, 0.599082f, 0.599236f,
+ 0.599389f, 0.599543f, 0.599696f, 0.599850f, 0.600003f, 0.600156f, 0.600310f, 0.600463f,
+ 0.600616f, 0.600770f, 0.600923f, 0.601076f, 0.601230f, 0.601383f, 0.601536f, 0.601689f,
+ 0.601842f, 0.601995f, 0.602148f, 0.602302f, 0.602455f, 0.602608f, 0.602761f, 0.602914f,
+ 0.603067f, 0.603220f, 0.603372f, 0.603525f, 0.603678f, 0.603831f, 0.603984f, 0.604137f,
+ 0.604290f, 0.604442f, 0.604595f, 0.604748f, 0.604900f, 0.605053f, 0.605206f, 0.605358f,
+ 0.605511f, 0.605664f, 0.605816f, 0.605969f, 0.606121f, 0.606274f, 0.606426f, 0.606579f,
+ 0.606731f, 0.606884f, 0.607036f, 0.607188f, 0.607341f, 0.607493f, 0.607645f, 0.607798f,
+ 0.607950f, 0.608102f, 0.608254f, 0.608406f, 0.608559f, 0.608711f, 0.608863f, 0.609015f,
+ 0.609167f, 0.609319f, 0.609471f, 0.609623f, 0.609775f, 0.609927f, 0.610079f, 0.610231f,
+ 0.610383f, 0.610535f, 0.610687f, 0.610838f, 0.610990f, 0.611142f, 0.611294f, 0.611445f,
+ 0.611597f, 0.611749f, 0.611901f, 0.612052f, 0.612204f, 0.612355f, 0.612507f, 0.612659f,
+ 0.612810f, 0.612962f, 0.613113f, 0.613265f, 0.613416f, 0.613567f, 0.613719f, 0.613870f,
+ 0.614022f, 0.614173f, 0.614324f, 0.614475f, 0.614627f, 0.614778f, 0.614929f, 0.615080f,
+ 0.615232f, 0.615383f, 0.615534f, 0.615685f, 0.615836f, 0.615987f, 0.616138f, 0.616289f,
+ 0.616440f, 0.616591f, 0.616742f, 0.616893f, 0.617044f, 0.617195f, 0.617346f, 0.617496f,
+ 0.617647f, 0.617798f, 0.617949f, 0.618100f, 0.618250f, 0.618401f, 0.618552f, 0.618702f,
+ 0.618853f, 0.619004f, 0.619154f, 0.619305f, 0.619455f, 0.619606f, 0.619756f, 0.619907f,
+ 0.620057f, 0.620208f, 0.620358f, 0.620508f, 0.620659f, 0.620809f, 0.620959f, 0.621110f,
+ 0.621260f, 0.621410f, 0.621560f, 0.621711f, 0.621861f, 0.622011f, 0.622161f, 0.622311f,
+ 0.622461f, 0.622611f, 0.622761f, 0.622911f, 0.623061f, 0.623211f, 0.623361f, 0.623511f,
+ 0.623661f, 0.623811f, 0.623961f, 0.624111f, 0.624260f, 0.624410f, 0.624560f, 0.624710f,
+ 0.624860f, 0.625009f, 0.625159f, 0.625309f, 0.625458f, 0.625608f, 0.625757f, 0.625907f,
+ 0.626056f, 0.626206f, 0.626355f, 0.626505f, 0.626654f, 0.626804f, 0.626953f, 0.627102f,
+ 0.627252f, 0.627401f, 0.627550f, 0.627700f, 0.627849f, 0.627998f, 0.628147f, 0.628297f,
+ 0.628446f, 0.628595f, 0.628744f, 0.628893f, 0.629042f, 0.629191f, 0.629340f, 0.629489f,
+ 0.629638f, 0.629787f, 0.629936f, 0.630085f, 0.630234f, 0.630383f, 0.630532f, 0.630680f,
+ 0.630829f, 0.630978f, 0.631127f, 0.631275f, 0.631424f, 0.631573f, 0.631721f, 0.631870f,
+ 0.632019f, 0.632167f, 0.632316f, 0.632464f, 0.632613f, 0.632761f, 0.632910f, 0.633058f,
+ 0.633207f, 0.633355f, 0.633504f, 0.633652f, 0.633800f, 0.633949f, 0.634097f, 0.634245f,
+ 0.634393f, 0.634542f, 0.634690f, 0.634838f, 0.634986f, 0.635134f, 0.635282f, 0.635430f,
+ 0.635578f, 0.635726f, 0.635874f, 0.636022f, 0.636170f, 0.636318f, 0.636466f, 0.636614f,
+ 0.636762f, 0.636910f, 0.637057f, 0.637205f, 0.637353f, 0.637501f, 0.637649f, 0.637796f,
+ 0.637944f, 0.638092f, 0.638239f, 0.638387f, 0.638534f, 0.638682f, 0.638829f, 0.638977f,
+ 0.639124f, 0.639272f, 0.639419f, 0.639567f, 0.639714f, 0.639862f, 0.640009f, 0.640156f,
+ 0.640303f, 0.640451f, 0.640598f, 0.640745f, 0.640892f, 0.641040f, 0.641187f, 0.641334f,
+ 0.641481f, 0.641628f, 0.641775f, 0.641922f, 0.642069f, 0.642216f, 0.642363f, 0.642510f,
+ 0.642657f, 0.642804f, 0.642951f, 0.643098f, 0.643245f, 0.643391f, 0.643538f, 0.643685f,
+ 0.643832f, 0.643978f, 0.644125f, 0.644272f, 0.644418f, 0.644565f, 0.644711f, 0.644858f,
+ 0.645005f, 0.645151f, 0.645298f, 0.645444f, 0.645590f, 0.645737f, 0.645883f, 0.646030f,
+ 0.646176f, 0.646322f, 0.646469f, 0.646615f, 0.646761f, 0.646907f, 0.647054f, 0.647200f,
+ 0.647346f, 0.647492f, 0.647638f, 0.647784f, 0.647930f, 0.648076f, 0.648222f, 0.648368f,
+ 0.648514f, 0.648660f, 0.648806f, 0.648952f, 0.649098f, 0.649244f, 0.649390f, 0.649536f,
+ 0.649681f, 0.649827f, 0.649973f, 0.650119f, 0.650264f, 0.650410f, 0.650555f, 0.650701f,
+ 0.650847f, 0.650992f, 0.651138f, 0.651283f, 0.651429f, 0.651574f, 0.651720f, 0.651865f,
+ 0.652011f, 0.652156f, 0.652301f, 0.652447f, 0.652592f, 0.652737f, 0.652882f, 0.653028f,
+ 0.653173f, 0.653318f, 0.653463f, 0.653608f, 0.653753f, 0.653899f, 0.654044f, 0.654189f,
+ 0.654334f, 0.654479f, 0.654624f, 0.654769f, 0.654913f, 0.655058f, 0.655203f, 0.655348f,
+ 0.655493f, 0.655638f, 0.655782f, 0.655927f, 0.656072f, 0.656217f, 0.656361f, 0.656506f,
+ 0.656651f, 0.656795f, 0.656940f, 0.657084f, 0.657229f, 0.657373f, 0.657518f, 0.657662f,
+ 0.657807f, 0.657951f, 0.658095f, 0.658240f, 0.658384f, 0.658529f, 0.658673f, 0.658817f,
+ 0.658961f, 0.659105f, 0.659250f, 0.659394f, 0.659538f, 0.659682f, 0.659826f, 0.659970f,
+ 0.660114f, 0.660258f, 0.660402f, 0.660546f, 0.660690f, 0.660834f, 0.660978f, 0.661122f,
+ 0.661266f, 0.661410f, 0.661553f, 0.661697f, 0.661841f, 0.661985f, 0.662128f, 0.662272f,
+ 0.662416f, 0.662559f, 0.662703f, 0.662847f, 0.662990f, 0.663134f, 0.663277f, 0.663421f,
+ 0.663564f, 0.663708f, 0.663851f, 0.663994f, 0.664138f, 0.664281f, 0.664424f, 0.664568f,
+ 0.664711f, 0.664854f, 0.664997f, 0.665141f, 0.665284f, 0.665427f, 0.665570f, 0.665713f,
+ 0.665856f, 0.665999f, 0.666142f, 0.666285f, 0.666428f, 0.666571f, 0.666714f, 0.666857f,
+ 0.667000f, 0.667143f, 0.667286f, 0.667428f, 0.667571f, 0.667714f, 0.667857f, 0.667999f,
+ 0.668142f, 0.668285f, 0.668427f, 0.668570f, 0.668712f, 0.668855f, 0.668998f, 0.669140f,
+ 0.669283f, 0.669425f, 0.669567f, 0.669710f, 0.669852f, 0.669995f, 0.670137f, 0.670279f,
+ 0.670422f, 0.670564f, 0.670706f, 0.670848f, 0.670990f, 0.671133f, 0.671275f, 0.671417f,
+ 0.671559f, 0.671701f, 0.671843f, 0.671985f, 0.672127f, 0.672269f, 0.672411f, 0.672553f,
+ 0.672695f, 0.672837f, 0.672978f, 0.673120f, 0.673262f, 0.673404f, 0.673546f, 0.673687f,
+ 0.673829f, 0.673971f, 0.674112f, 0.674254f, 0.674396f, 0.674537f, 0.674679f, 0.674820f,
+ 0.674962f, 0.675103f, 0.675245f, 0.675386f, 0.675527f, 0.675669f, 0.675810f, 0.675951f,
+ 0.676093f, 0.676234f, 0.676375f, 0.676516f, 0.676658f, 0.676799f, 0.676940f, 0.677081f,
+ 0.677222f, 0.677363f, 0.677504f, 0.677645f, 0.677786f, 0.677927f, 0.678068f, 0.678209f,
+ 0.678350f, 0.678491f, 0.678632f, 0.678773f, 0.678913f, 0.679054f, 0.679195f, 0.679336f,
+ 0.679476f, 0.679617f, 0.679758f, 0.679898f, 0.680039f, 0.680179f, 0.680320f, 0.680461f,
+ 0.680601f, 0.680741f, 0.680882f, 0.681022f, 0.681163f, 0.681303f, 0.681443f, 0.681584f,
+ 0.681724f, 0.681864f, 0.682005f, 0.682145f, 0.682285f, 0.682425f, 0.682565f, 0.682705f,
+ 0.682846f, 0.682986f, 0.683126f, 0.683266f, 0.683406f, 0.683546f, 0.683686f, 0.683825f,
+ 0.683965f, 0.684105f, 0.684245f, 0.684385f, 0.684525f, 0.684664f, 0.684804f, 0.684944f,
+ 0.685084f, 0.685223f, 0.685363f, 0.685503f, 0.685642f, 0.685782f, 0.685921f, 0.686061f,
+ 0.686200f, 0.686340f, 0.686479f, 0.686619f, 0.686758f, 0.686897f, 0.687037f, 0.687176f,
+ 0.687315f, 0.687455f, 0.687594f, 0.687733f, 0.687872f, 0.688011f, 0.688151f, 0.688290f,
+ 0.688429f, 0.688568f, 0.688707f, 0.688846f, 0.688985f, 0.689124f, 0.689263f, 0.689402f,
+ 0.689541f, 0.689679f, 0.689818f, 0.689957f, 0.690096f, 0.690235f, 0.690373f, 0.690512f,
+ 0.690651f, 0.690789f, 0.690928f, 0.691067f, 0.691205f, 0.691344f, 0.691482f, 0.691621f,
+ 0.691759f, 0.691898f, 0.692036f, 0.692175f, 0.692313f, 0.692451f, 0.692590f, 0.692728f,
+ 0.692866f, 0.693004f, 0.693143f, 0.693281f, 0.693419f, 0.693557f, 0.693695f, 0.693833f,
+ 0.693971f, 0.694109f, 0.694248f, 0.694386f, 0.694524f, 0.694661f, 0.694799f, 0.694937f,
+ 0.695075f, 0.695213f, 0.695351f, 0.695489f, 0.695626f, 0.695764f, 0.695902f, 0.696039f,
+ 0.696177f, 0.696315f, 0.696452f, 0.696590f, 0.696728f, 0.696865f, 0.697003f, 0.697140f,
+ 0.697277f, 0.697415f, 0.697552f, 0.697690f, 0.697827f, 0.697964f, 0.698102f, 0.698239f,
+ 0.698376f, 0.698513f, 0.698651f, 0.698788f, 0.698925f, 0.699062f, 0.699199f, 0.699336f,
+ 0.699473f, 0.699610f, 0.699747f, 0.699884f, 0.700021f, 0.700158f, 0.700295f, 0.700432f,
+ 0.700569f, 0.700706f, 0.700842f, 0.700979f, 0.701116f, 0.701253f, 0.701389f, 0.701526f,
+ 0.701663f, 0.701799f, 0.701936f, 0.702072f, 0.702209f, 0.702345f, 0.702482f, 0.702618f,
+ 0.702755f, 0.702891f, 0.703028f, 0.703164f, 0.703300f, 0.703436f, 0.703573f, 0.703709f,
+ 0.703845f, 0.703981f, 0.704118f, 0.704254f, 0.704390f, 0.704526f, 0.704662f, 0.704798f,
+ 0.704934f, 0.705070f, 0.705206f, 0.705342f, 0.705478f, 0.705614f, 0.705750f, 0.705885f,
+ 0.706021f, 0.706157f, 0.706293f, 0.706429f, 0.706564f, 0.706700f, 0.706836f, 0.706971f,
+ 0.707107f, 0.707242f, 0.707378f, 0.707513f, 0.707649f, 0.707784f, 0.707920f, 0.708055f,
+ 0.708191f, 0.708326f, 0.708461f, 0.708597f, 0.708732f, 0.708867f, 0.709002f, 0.709138f,
+ 0.709273f, 0.709408f, 0.709543f, 0.709678f, 0.709813f, 0.709948f, 0.710083f, 0.710218f,
+ 0.710353f, 0.710488f, 0.710623f, 0.710758f, 0.710893f, 0.711028f, 0.711163f, 0.711297f,
+ 0.711432f, 0.711567f, 0.711702f, 0.711836f, 0.711971f, 0.712106f, 0.712240f, 0.712375f,
+ 0.712509f, 0.712644f, 0.712778f, 0.712913f, 0.713047f, 0.713182f, 0.713316f, 0.713451f,
+ 0.713585f, 0.713719f, 0.713853f, 0.713988f, 0.714122f, 0.714256f, 0.714390f, 0.714525f,
+ 0.714659f, 0.714793f, 0.714927f, 0.715061f, 0.715195f, 0.715329f, 0.715463f, 0.715597f,
+ 0.715731f, 0.715865f, 0.715999f, 0.716132f, 0.716266f, 0.716400f, 0.716534f, 0.716668f,
+ 0.716801f, 0.716935f, 0.717069f, 0.717202f, 0.717336f, 0.717469f, 0.717603f, 0.717737f,
+ 0.717870f, 0.718004f, 0.718137f, 0.718270f, 0.718404f, 0.718537f, 0.718670f, 0.718804f,
+ 0.718937f, 0.719070f, 0.719204f, 0.719337f, 0.719470f, 0.719603f, 0.719736f, 0.719869f,
+ 0.720003f, 0.720136f, 0.720269f, 0.720402f, 0.720535f, 0.720668f, 0.720800f, 0.720933f,
+ 0.721066f, 0.721199f, 0.721332f, 0.721465f, 0.721597f, 0.721730f, 0.721863f, 0.721996f,
+ 0.722128f, 0.722261f, 0.722393f, 0.722526f, 0.722659f, 0.722791f, 0.722924f, 0.723056f,
+ 0.723188f, 0.723321f, 0.723453f, 0.723586f, 0.723718f, 0.723850f, 0.723983f, 0.724115f,
+ 0.724247f, 0.724379f, 0.724511f, 0.724644f, 0.724776f, 0.724908f, 0.725040f, 0.725172f,
+ 0.725304f, 0.725436f, 0.725568f, 0.725700f, 0.725832f, 0.725964f, 0.726095f, 0.726227f,
+ 0.726359f, 0.726491f, 0.726623f, 0.726754f, 0.726886f, 0.727018f, 0.727149f, 0.727281f,
+ 0.727413f, 0.727544f, 0.727676f, 0.727807f, 0.727939f, 0.728070f, 0.728202f, 0.728333f,
+ 0.728464f, 0.728596f, 0.728727f, 0.728858f, 0.728990f, 0.729121f, 0.729252f, 0.729383f,
+ 0.729514f, 0.729646f, 0.729777f, 0.729908f, 0.730039f, 0.730170f, 0.730301f, 0.730432f,
+ 0.730563f, 0.730694f, 0.730825f, 0.730955f, 0.731086f, 0.731217f, 0.731348f, 0.731479f,
+ 0.731609f, 0.731740f, 0.731871f, 0.732001f, 0.732132f, 0.732263f, 0.732393f, 0.732524f,
+ 0.732654f, 0.732785f, 0.732915f, 0.733046f, 0.733176f, 0.733306f, 0.733437f, 0.733567f,
+ 0.733697f, 0.733828f, 0.733958f, 0.734088f, 0.734218f, 0.734349f, 0.734479f, 0.734609f,
+ 0.734739f, 0.734869f, 0.734999f, 0.735129f, 0.735259f, 0.735389f, 0.735519f, 0.735649f,
+ 0.735779f, 0.735908f, 0.736038f, 0.736168f, 0.736298f, 0.736428f, 0.736557f, 0.736687f,
+ 0.736817f, 0.736946f, 0.737076f, 0.737205f, 0.737335f, 0.737464f, 0.737594f, 0.737723f,
+ 0.737853f, 0.737982f, 0.738112f, 0.738241f, 0.738370f, 0.738500f, 0.738629f, 0.738758f,
+ 0.738887f, 0.739017f, 0.739146f, 0.739275f, 0.739404f, 0.739533f, 0.739662f, 0.739791f,
+ 0.739920f, 0.740049f, 0.740178f, 0.740307f, 0.740436f, 0.740565f, 0.740694f, 0.740822f,
+ 0.740951f, 0.741080f, 0.741209f, 0.741337f, 0.741466f, 0.741595f, 0.741723f, 0.741852f,
+ 0.741980f, 0.742109f, 0.742237f, 0.742366f, 0.742494f, 0.742623f, 0.742751f, 0.742880f,
+ 0.743008f, 0.743136f, 0.743265f, 0.743393f, 0.743521f, 0.743649f, 0.743777f, 0.743906f,
+ 0.744034f, 0.744162f, 0.744290f, 0.744418f, 0.744546f, 0.744674f, 0.744802f, 0.744930f,
+ 0.745058f, 0.745186f, 0.745314f, 0.745441f, 0.745569f, 0.745697f, 0.745825f, 0.745952f,
+ 0.746080f, 0.746208f, 0.746335f, 0.746463f, 0.746591f, 0.746718f, 0.746846f, 0.746973f,
+ 0.747101f, 0.747228f, 0.747355f, 0.747483f, 0.747610f, 0.747738f, 0.747865f, 0.747992f,
+ 0.748119f, 0.748247f, 0.748374f, 0.748501f, 0.748628f, 0.748755f, 0.748882f, 0.749009f,
+ 0.749136f, 0.749263f, 0.749390f, 0.749517f, 0.749644f, 0.749771f, 0.749898f, 0.750025f,
+ 0.750152f, 0.750278f, 0.750405f, 0.750532f, 0.750659f, 0.750785f, 0.750912f, 0.751039f,
+ 0.751165f, 0.751292f, 0.751418f, 0.751545f, 0.751671f, 0.751798f, 0.751924f, 0.752050f,
+ 0.752177f, 0.752303f, 0.752429f, 0.752556f, 0.752682f, 0.752808f, 0.752934f, 0.753061f,
+ 0.753187f, 0.753313f, 0.753439f, 0.753565f, 0.753691f, 0.753817f, 0.753943f, 0.754069f,
+ 0.754195f, 0.754321f, 0.754447f, 0.754573f, 0.754698f, 0.754824f, 0.754950f, 0.755076f,
+ 0.755201f, 0.755327f, 0.755453f, 0.755578f, 0.755704f, 0.755829f, 0.755955f, 0.756081f,
+ 0.756206f, 0.756331f, 0.756457f, 0.756582f, 0.756708f, 0.756833f, 0.756958f, 0.757084f,
+ 0.757209f, 0.757334f, 0.757459f, 0.757584f, 0.757710f, 0.757835f, 0.757960f, 0.758085f,
+ 0.758210f, 0.758335f, 0.758460f, 0.758585f, 0.758710f, 0.758835f, 0.758960f, 0.759084f,
+ 0.759209f, 0.759334f, 0.759459f, 0.759583f, 0.759708f, 0.759833f, 0.759957f, 0.760082f,
+ 0.760207f, 0.760331f, 0.760456f, 0.760580f, 0.760705f, 0.760829f, 0.760954f, 0.761078f,
+ 0.761202f, 0.761327f, 0.761451f, 0.761575f, 0.761700f, 0.761824f, 0.761948f, 0.762072f,
+ 0.762196f, 0.762320f, 0.762444f, 0.762569f, 0.762693f, 0.762817f, 0.762941f, 0.763065f,
+ 0.763188f, 0.763312f, 0.763436f, 0.763560f, 0.763684f, 0.763808f, 0.763931f, 0.764055f,
+ 0.764179f, 0.764302f, 0.764426f, 0.764550f, 0.764673f, 0.764797f, 0.764920f, 0.765044f,
+ 0.765167f, 0.765291f, 0.765414f, 0.765538f, 0.765661f, 0.765784f, 0.765907f, 0.766031f,
+ 0.766154f, 0.766277f, 0.766400f, 0.766524f, 0.766647f, 0.766770f, 0.766893f, 0.767016f,
+ 0.767139f, 0.767262f, 0.767385f, 0.767508f, 0.767631f, 0.767754f, 0.767876f, 0.767999f,
+ 0.768122f, 0.768245f, 0.768368f, 0.768490f, 0.768613f, 0.768736f, 0.768858f, 0.768981f,
+ 0.769103f, 0.769226f, 0.769348f, 0.769471f, 0.769593f, 0.769716f, 0.769838f, 0.769961f,
+ 0.770083f, 0.770205f, 0.770327f, 0.770450f, 0.770572f, 0.770694f, 0.770816f, 0.770938f,
+ 0.771061f, 0.771183f, 0.771305f, 0.771427f, 0.771549f, 0.771671f, 0.771793f, 0.771915f,
+ 0.772036f, 0.772158f, 0.772280f, 0.772402f, 0.772524f, 0.772645f, 0.772767f, 0.772889f,
+ 0.773010f, 0.773132f, 0.773254f, 0.773375f, 0.773497f, 0.773618f, 0.773740f, 0.773861f,
+ 0.773983f, 0.774104f, 0.774225f, 0.774347f, 0.774468f, 0.774589f, 0.774711f, 0.774832f,
+ 0.774953f, 0.775074f, 0.775195f, 0.775317f, 0.775438f, 0.775559f, 0.775680f, 0.775801f,
+ 0.775922f, 0.776043f, 0.776164f, 0.776284f, 0.776405f, 0.776526f, 0.776647f, 0.776768f,
+ 0.776888f, 0.777009f, 0.777130f, 0.777251f, 0.777371f, 0.777492f, 0.777612f, 0.777733f,
+ 0.777853f, 0.777974f, 0.778094f, 0.778215f, 0.778335f, 0.778456f, 0.778576f, 0.778696f,
+ 0.778817f, 0.778937f, 0.779057f, 0.779177f, 0.779297f, 0.779418f, 0.779538f, 0.779658f,
+ 0.779778f, 0.779898f, 0.780018f, 0.780138f, 0.780258f, 0.780378f, 0.780498f, 0.780617f,
+ 0.780737f, 0.780857f, 0.780977f, 0.781097f, 0.781216f, 0.781336f, 0.781456f, 0.781575f,
+ 0.781695f, 0.781814f, 0.781934f, 0.782053f, 0.782173f, 0.782292f, 0.782412f, 0.782531f,
+ 0.782651f, 0.782770f, 0.782889f, 0.783009f, 0.783128f, 0.783247f, 0.783366f, 0.783485f,
+ 0.783605f, 0.783724f, 0.783843f, 0.783962f, 0.784081f, 0.784200f, 0.784319f, 0.784438f,
+ 0.784557f, 0.784675f, 0.784794f, 0.784913f, 0.785032f, 0.785151f, 0.785269f, 0.785388f,
+ 0.785507f, 0.785625f, 0.785744f, 0.785863f, 0.785981f, 0.786100f, 0.786218f, 0.786337f,
+ 0.786455f, 0.786574f, 0.786692f, 0.786810f, 0.786929f, 0.787047f, 0.787165f, 0.787284f,
+ 0.787402f, 0.787520f, 0.787638f, 0.787756f, 0.787874f, 0.787992f, 0.788110f, 0.788228f,
+ 0.788346f, 0.788464f, 0.788582f, 0.788700f, 0.788818f, 0.788936f, 0.789054f, 0.789172f,
+ 0.789289f, 0.789407f, 0.789525f, 0.789642f, 0.789760f, 0.789878f, 0.789995f, 0.790113f,
+ 0.790230f, 0.790348f, 0.790465f, 0.790583f, 0.790700f, 0.790817f, 0.790935f, 0.791052f,
+ 0.791169f, 0.791287f, 0.791404f, 0.791521f, 0.791638f, 0.791755f, 0.791872f, 0.791990f,
+ 0.792107f, 0.792224f, 0.792341f, 0.792458f, 0.792575f, 0.792691f, 0.792808f, 0.792925f,
+ 0.793042f, 0.793159f, 0.793276f, 0.793392f, 0.793509f, 0.793626f, 0.793742f, 0.793859f,
+ 0.793975f, 0.794092f, 0.794209f, 0.794325f, 0.794442f, 0.794558f, 0.794674f, 0.794791f,
+ 0.794907f, 0.795023f, 0.795140f, 0.795256f, 0.795372f, 0.795488f, 0.795605f, 0.795721f,
+ 0.795837f, 0.795953f, 0.796069f, 0.796185f, 0.796301f, 0.796417f, 0.796533f, 0.796649f,
+ 0.796765f, 0.796881f, 0.796996f, 0.797112f, 0.797228f, 0.797344f, 0.797459f, 0.797575f,
+ 0.797691f, 0.797806f, 0.797922f, 0.798038f, 0.798153f, 0.798269f, 0.798384f, 0.798500f,
+ 0.798615f, 0.798730f, 0.798846f, 0.798961f, 0.799076f, 0.799192f, 0.799307f, 0.799422f,
+ 0.799537f, 0.799652f, 0.799768f, 0.799883f, 0.799998f, 0.800113f, 0.800228f, 0.800343f,
+ 0.800458f, 0.800573f, 0.800687f, 0.800802f, 0.800917f, 0.801032f, 0.801147f, 0.801261f,
+ 0.801376f, 0.801491f, 0.801606f, 0.801720f, 0.801835f, 0.801949f, 0.802064f, 0.802178f,
+ 0.802293f, 0.802407f, 0.802522f, 0.802636f, 0.802750f, 0.802865f, 0.802979f, 0.803093f,
+ 0.803208f, 0.803322f, 0.803436f, 0.803550f, 0.803664f, 0.803778f, 0.803892f, 0.804006f,
+ 0.804120f, 0.804234f, 0.804348f, 0.804462f, 0.804576f, 0.804690f, 0.804804f, 0.804918f,
+ 0.805031f, 0.805145f, 0.805259f, 0.805372f, 0.805486f, 0.805600f, 0.805713f, 0.805827f,
+ 0.805940f, 0.806054f, 0.806167f, 0.806281f, 0.806394f, 0.806508f, 0.806621f, 0.806734f,
+ 0.806848f, 0.806961f, 0.807074f, 0.807187f, 0.807300f, 0.807414f, 0.807527f, 0.807640f,
+ 0.807753f, 0.807866f, 0.807979f, 0.808092f, 0.808205f, 0.808318f, 0.808430f, 0.808543f,
+ 0.808656f, 0.808769f, 0.808882f, 0.808994f, 0.809107f, 0.809220f, 0.809332f, 0.809445f,
+ 0.809558f, 0.809670f, 0.809783f, 0.809895f, 0.810008f, 0.810120f, 0.810232f, 0.810345f,
+ 0.810457f, 0.810570f, 0.810682f, 0.810794f, 0.810906f, 0.811018f, 0.811131f, 0.811243f,
+ 0.811355f, 0.811467f, 0.811579f, 0.811691f, 0.811803f, 0.811915f, 0.812027f, 0.812139f,
+ 0.812251f, 0.812362f, 0.812474f, 0.812586f, 0.812698f, 0.812809f, 0.812921f, 0.813033f,
+ 0.813144f, 0.813256f, 0.813368f, 0.813479f, 0.813591f, 0.813702f, 0.813814f, 0.813925f,
+ 0.814036f, 0.814148f, 0.814259f, 0.814370f, 0.814482f, 0.814593f, 0.814704f, 0.814815f,
+ 0.814926f, 0.815037f, 0.815149f, 0.815260f, 0.815371f, 0.815482f, 0.815593f, 0.815704f,
+ 0.815814f, 0.815925f, 0.816036f, 0.816147f, 0.816258f, 0.816368f, 0.816479f, 0.816590f,
+ 0.816701f, 0.816811f, 0.816922f, 0.817032f, 0.817143f, 0.817253f, 0.817364f, 0.817474f,
+ 0.817585f, 0.817695f, 0.817806f, 0.817916f, 0.818026f, 0.818137f, 0.818247f, 0.818357f,
+ 0.818467f, 0.818577f, 0.818687f, 0.818798f, 0.818908f, 0.819018f, 0.819128f, 0.819238f,
+ 0.819348f, 0.819457f, 0.819567f, 0.819677f, 0.819787f, 0.819897f, 0.820007f, 0.820116f,
+ 0.820226f, 0.820336f, 0.820445f, 0.820555f, 0.820664f, 0.820774f, 0.820884f, 0.820993f,
+ 0.821102f, 0.821212f, 0.821321f, 0.821431f, 0.821540f, 0.821649f, 0.821759f, 0.821868f,
+ 0.821977f, 0.822086f, 0.822195f, 0.822305f, 0.822414f, 0.822523f, 0.822632f, 0.822741f,
+ 0.822850f, 0.822959f, 0.823068f, 0.823177f, 0.823285f, 0.823394f, 0.823503f, 0.823612f,
+ 0.823721f, 0.823829f, 0.823938f, 0.824047f, 0.824155f, 0.824264f, 0.824372f, 0.824481f,
+ 0.824589f, 0.824698f, 0.824806f, 0.824915f, 0.825023f, 0.825131f, 0.825240f, 0.825348f,
+ 0.825456f, 0.825564f, 0.825673f, 0.825781f, 0.825889f, 0.825997f, 0.826105f, 0.826213f,
+ 0.826321f, 0.826429f, 0.826537f, 0.826645f, 0.826753f, 0.826861f, 0.826968f, 0.827076f,
+ 0.827184f, 0.827292f, 0.827399f, 0.827507f, 0.827615f, 0.827722f, 0.827830f, 0.827938f,
+ 0.828045f, 0.828153f, 0.828260f, 0.828367f, 0.828475f, 0.828582f, 0.828690f, 0.828797f,
+ 0.828904f, 0.829011f, 0.829119f, 0.829226f, 0.829333f, 0.829440f, 0.829547f, 0.829654f,
+ 0.829761f, 0.829868f, 0.829975f, 0.830082f, 0.830189f, 0.830296f, 0.830403f, 0.830510f,
+ 0.830616f, 0.830723f, 0.830830f, 0.830937f, 0.831043f, 0.831150f, 0.831257f, 0.831363f,
+ 0.831470f, 0.831576f, 0.831683f, 0.831789f, 0.831895f, 0.832002f, 0.832108f, 0.832215f,
+ 0.832321f, 0.832427f, 0.832533f, 0.832640f, 0.832746f, 0.832852f, 0.832958f, 0.833064f,
+ 0.833170f, 0.833276f, 0.833382f, 0.833488f, 0.833594f, 0.833700f, 0.833806f, 0.833912f,
+ 0.834018f, 0.834123f, 0.834229f, 0.834335f, 0.834440f, 0.834546f, 0.834652f, 0.834757f,
+ 0.834863f, 0.834968f, 0.835074f, 0.835179f, 0.835285f, 0.835390f, 0.835496f, 0.835601f,
+ 0.835706f, 0.835812f, 0.835917f, 0.836022f, 0.836127f, 0.836232f, 0.836338f, 0.836443f,
+ 0.836548f, 0.836653f, 0.836758f, 0.836863f, 0.836968f, 0.837073f, 0.837178f, 0.837282f,
+ 0.837387f, 0.837492f, 0.837597f, 0.837701f, 0.837806f, 0.837911f, 0.838015f, 0.838120f,
+ 0.838225f, 0.838329f, 0.838434f, 0.838538f, 0.838643f, 0.838747f, 0.838852f, 0.838956f,
+ 0.839060f, 0.839165f, 0.839269f, 0.839373f, 0.839477f, 0.839581f, 0.839686f, 0.839790f,
+ 0.839894f, 0.839998f, 0.840102f, 0.840206f, 0.840310f, 0.840414f, 0.840518f, 0.840622f,
+ 0.840725f, 0.840829f, 0.840933f, 0.841037f, 0.841140f, 0.841244f, 0.841348f, 0.841451f,
+ 0.841555f, 0.841659f, 0.841762f, 0.841866f, 0.841969f, 0.842072f, 0.842176f, 0.842279f,
+ 0.842383f, 0.842486f, 0.842589f, 0.842692f, 0.842796f, 0.842899f, 0.843002f, 0.843105f,
+ 0.843208f, 0.843311f, 0.843414f, 0.843517f, 0.843620f, 0.843723f, 0.843826f, 0.843929f,
+ 0.844032f, 0.844135f, 0.844238f, 0.844340f, 0.844443f, 0.844546f, 0.844648f, 0.844751f,
+ 0.844854f, 0.844956f, 0.845059f, 0.845161f, 0.845264f, 0.845366f, 0.845469f, 0.845571f,
+ 0.845673f, 0.845776f, 0.845878f, 0.845980f, 0.846082f, 0.846185f, 0.846287f, 0.846389f,
+ 0.846491f, 0.846593f, 0.846695f, 0.846797f, 0.846899f, 0.847001f, 0.847103f, 0.847205f,
+ 0.847307f, 0.847408f, 0.847510f, 0.847612f, 0.847714f, 0.847815f, 0.847917f, 0.848019f,
+ 0.848120f, 0.848222f, 0.848323f, 0.848425f, 0.848526f, 0.848628f, 0.848729f, 0.848831f,
+ 0.848932f, 0.849033f, 0.849135f, 0.849236f, 0.849337f, 0.849438f, 0.849540f, 0.849641f,
+ 0.849742f, 0.849843f, 0.849944f, 0.850045f, 0.850146f, 0.850247f, 0.850348f, 0.850449f,
+ 0.850549f, 0.850650f, 0.850751f, 0.850852f, 0.850953f, 0.851053f, 0.851154f, 0.851255f,
+ 0.851355f, 0.851456f, 0.851556f, 0.851657f, 0.851757f, 0.851858f, 0.851958f, 0.852059f,
+ 0.852159f, 0.852259f, 0.852360f, 0.852460f, 0.852560f, 0.852660f, 0.852760f, 0.852861f,
+ 0.852961f, 0.853061f, 0.853161f, 0.853261f, 0.853361f, 0.853461f, 0.853561f, 0.853660f,
+ 0.853760f, 0.853860f, 0.853960f, 0.854060f, 0.854159f, 0.854259f, 0.854359f, 0.854458f,
+ 0.854558f, 0.854658f, 0.854757f, 0.854857f, 0.854956f, 0.855056f, 0.855155f, 0.855254f,
+ 0.855354f, 0.855453f, 0.855552f, 0.855651f, 0.855751f, 0.855850f, 0.855949f, 0.856048f,
+ 0.856147f, 0.856246f, 0.856345f, 0.856444f, 0.856543f, 0.856642f, 0.856741f, 0.856840f,
+ 0.856939f, 0.857038f, 0.857137f, 0.857235f, 0.857334f, 0.857433f, 0.857531f, 0.857630f,
+ 0.857729f, 0.857827f, 0.857926f, 0.858024f, 0.858123f, 0.858221f, 0.858320f, 0.858418f,
+ 0.858516f, 0.858615f, 0.858713f, 0.858811f, 0.858909f, 0.859007f, 0.859106f, 0.859204f,
+ 0.859302f, 0.859400f, 0.859498f, 0.859596f, 0.859694f, 0.859792f, 0.859890f, 0.859988f,
+ 0.860085f, 0.860183f, 0.860281f, 0.860379f, 0.860476f, 0.860574f, 0.860672f, 0.860769f,
+ 0.860867f, 0.860964f, 0.861062f, 0.861160f, 0.861257f, 0.861354f, 0.861452f, 0.861549f,
+ 0.861646f, 0.861744f, 0.861841f, 0.861938f, 0.862035f, 0.862133f, 0.862230f, 0.862327f,
+ 0.862424f, 0.862521f, 0.862618f, 0.862715f, 0.862812f, 0.862909f, 0.863006f, 0.863103f,
+ 0.863199f, 0.863296f, 0.863393f, 0.863490f, 0.863586f, 0.863683f, 0.863780f, 0.863876f,
+ 0.863973f, 0.864069f, 0.864166f, 0.864262f, 0.864359f, 0.864455f, 0.864552f, 0.864648f,
+ 0.864744f, 0.864841f, 0.864937f, 0.865033f, 0.865129f, 0.865225f, 0.865321f, 0.865418f,
+ 0.865514f, 0.865610f, 0.865706f, 0.865802f, 0.865898f, 0.865993f, 0.866089f, 0.866185f,
+ 0.866281f, 0.866377f, 0.866472f, 0.866568f, 0.866664f, 0.866759f, 0.866855f, 0.866951f,
+ 0.867046f, 0.867142f, 0.867237f, 0.867333f, 0.867428f, 0.867523f, 0.867619f, 0.867714f,
+ 0.867809f, 0.867905f, 0.868000f, 0.868095f, 0.868190f, 0.868285f, 0.868381f, 0.868476f,
+ 0.868571f, 0.868666f, 0.868761f, 0.868856f, 0.868951f, 0.869045f, 0.869140f, 0.869235f,
+ 0.869330f, 0.869425f, 0.869519f, 0.869614f, 0.869709f, 0.869803f, 0.869898f, 0.869992f,
+ 0.870087f, 0.870182f, 0.870276f, 0.870370f, 0.870465f, 0.870559f, 0.870654f, 0.870748f,
+ 0.870842f, 0.870936f, 0.871031f, 0.871125f, 0.871219f, 0.871313f, 0.871407f, 0.871501f,
+ 0.871595f, 0.871689f, 0.871783f, 0.871877f, 0.871971f, 0.872065f, 0.872159f, 0.872252f,
+ 0.872346f, 0.872440f, 0.872534f, 0.872627f, 0.872721f, 0.872814f, 0.872908f, 0.873001f,
+ 0.873095f, 0.873188f, 0.873282f, 0.873375f, 0.873469f, 0.873562f, 0.873655f, 0.873749f,
+ 0.873842f, 0.873935f, 0.874028f, 0.874121f, 0.874215f, 0.874308f, 0.874401f, 0.874494f,
+ 0.874587f, 0.874680f, 0.874773f, 0.874865f, 0.874958f, 0.875051f, 0.875144f, 0.875237f,
+ 0.875329f, 0.875422f, 0.875515f, 0.875607f, 0.875700f, 0.875793f, 0.875885f, 0.875978f,
+ 0.876070f, 0.876163f, 0.876255f, 0.876347f, 0.876440f, 0.876532f, 0.876624f, 0.876716f,
+ 0.876809f, 0.876901f, 0.876993f, 0.877085f, 0.877177f, 0.877269f, 0.877361f, 0.877453f,
+ 0.877545f, 0.877637f, 0.877729f, 0.877821f, 0.877913f, 0.878005f, 0.878096f, 0.878188f,
+ 0.878280f, 0.878371f, 0.878463f, 0.878555f, 0.878646f, 0.878738f, 0.878829f, 0.878921f,
+ 0.879012f, 0.879104f, 0.879195f, 0.879286f, 0.879378f, 0.879469f, 0.879560f, 0.879651f,
+ 0.879743f, 0.879834f, 0.879925f, 0.880016f, 0.880107f, 0.880198f, 0.880289f, 0.880380f,
+ 0.880471f, 0.880562f, 0.880653f, 0.880743f, 0.880834f, 0.880925f, 0.881016f, 0.881106f,
+ 0.881197f, 0.881288f, 0.881378f, 0.881469f, 0.881559f, 0.881650f, 0.881740f, 0.881831f,
+ 0.881921f, 0.882012f, 0.882102f, 0.882192f, 0.882283f, 0.882373f, 0.882463f, 0.882553f,
+ 0.882643f, 0.882733f, 0.882824f, 0.882914f, 0.883004f, 0.883094f, 0.883184f, 0.883273f,
+ 0.883363f, 0.883453f, 0.883543f, 0.883633f, 0.883723f, 0.883812f, 0.883902f, 0.883992f,
+ 0.884081f, 0.884171f, 0.884260f, 0.884350f, 0.884439f, 0.884529f, 0.884618f, 0.884708f,
+ 0.884797f, 0.884886f, 0.884976f, 0.885065f, 0.885154f, 0.885243f, 0.885333f, 0.885422f,
+ 0.885511f, 0.885600f, 0.885689f, 0.885778f, 0.885867f, 0.885956f, 0.886045f, 0.886134f,
+ 0.886223f, 0.886311f, 0.886400f, 0.886489f, 0.886578f, 0.886666f, 0.886755f, 0.886844f,
+ 0.886932f, 0.887021f, 0.887109f, 0.887198f, 0.887286f, 0.887375f, 0.887463f, 0.887551f,
+ 0.887640f, 0.887728f, 0.887816f, 0.887904f, 0.887993f, 0.888081f, 0.888169f, 0.888257f,
+ 0.888345f, 0.888433f, 0.888521f, 0.888609f, 0.888697f, 0.888785f, 0.888873f, 0.888961f,
+ 0.889048f, 0.889136f, 0.889224f, 0.889312f, 0.889399f, 0.889487f, 0.889574f, 0.889662f,
+ 0.889750f, 0.889837f, 0.889925f, 0.890012f, 0.890099f, 0.890187f, 0.890274f, 0.890361f,
+ 0.890449f, 0.890536f, 0.890623f, 0.890710f, 0.890797f, 0.890885f, 0.890972f, 0.891059f,
+ 0.891146f, 0.891233f, 0.891320f, 0.891407f, 0.891493f, 0.891580f, 0.891667f, 0.891754f,
+ 0.891841f, 0.891927f, 0.892014f, 0.892101f, 0.892187f, 0.892274f, 0.892361f, 0.892447f,
+ 0.892534f, 0.892620f, 0.892706f, 0.892793f, 0.892879f, 0.892965f, 0.893052f, 0.893138f,
+ 0.893224f, 0.893310f, 0.893397f, 0.893483f, 0.893569f, 0.893655f, 0.893741f, 0.893827f,
+ 0.893913f, 0.893999f, 0.894085f, 0.894171f, 0.894256f, 0.894342f, 0.894428f, 0.894514f,
+ 0.894599f, 0.894685f, 0.894771f, 0.894856f, 0.894942f, 0.895028f, 0.895113f, 0.895198f,
+ 0.895284f, 0.895369f, 0.895455f, 0.895540f, 0.895625f, 0.895711f, 0.895796f, 0.895881f,
+ 0.895966f, 0.896051f, 0.896137f, 0.896222f, 0.896307f, 0.896392f, 0.896477f, 0.896562f,
+ 0.896646f, 0.896731f, 0.896816f, 0.896901f, 0.896986f, 0.897071f, 0.897155f, 0.897240f,
+ 0.897325f, 0.897409f, 0.897494f, 0.897578f, 0.897663f, 0.897747f, 0.897832f, 0.897916f,
+ 0.898001f, 0.898085f, 0.898169f, 0.898254f, 0.898338f, 0.898422f, 0.898506f, 0.898590f,
+ 0.898674f, 0.898759f, 0.898843f, 0.898927f, 0.899011f, 0.899095f, 0.899179f, 0.899262f,
+ 0.899346f, 0.899430f, 0.899514f, 0.899598f, 0.899681f, 0.899765f, 0.899849f, 0.899932f,
+ 0.900016f, 0.900099f, 0.900183f, 0.900266f, 0.900350f, 0.900433f, 0.900517f, 0.900600f,
+ 0.900683f, 0.900767f, 0.900850f, 0.900933f, 0.901016f, 0.901100f, 0.901183f, 0.901266f,
+ 0.901349f, 0.901432f, 0.901515f, 0.901598f, 0.901681f, 0.901764f, 0.901847f, 0.901929f,
+ 0.902012f, 0.902095f, 0.902178f, 0.902260f, 0.902343f, 0.902426f, 0.902508f, 0.902591f,
+ 0.902673f, 0.902756f, 0.902838f, 0.902921f, 0.903003f, 0.903085f, 0.903168f, 0.903250f,
+ 0.903332f, 0.903415f, 0.903497f, 0.903579f, 0.903661f, 0.903743f, 0.903825f, 0.903907f,
+ 0.903989f, 0.904071f, 0.904153f, 0.904235f, 0.904317f, 0.904399f, 0.904481f, 0.904562f,
+ 0.904644f, 0.904726f, 0.904807f, 0.904889f, 0.904971f, 0.905052f, 0.905134f, 0.905215f,
+ 0.905297f, 0.905378f, 0.905460f, 0.905541f, 0.905622f, 0.905704f, 0.905785f, 0.905866f,
+ 0.905947f, 0.906028f, 0.906110f, 0.906191f, 0.906272f, 0.906353f, 0.906434f, 0.906515f,
+ 0.906596f, 0.906677f, 0.906757f, 0.906838f, 0.906919f, 0.907000f, 0.907081f, 0.907161f,
+ 0.907242f, 0.907323f, 0.907403f, 0.907484f, 0.907564f, 0.907645f, 0.907725f, 0.907806f,
+ 0.907886f, 0.907966f, 0.908047f, 0.908127f, 0.908207f, 0.908288f, 0.908368f, 0.908448f,
+ 0.908528f, 0.908608f, 0.908688f, 0.908768f, 0.908848f, 0.908928f, 0.909008f, 0.909088f,
+ 0.909168f, 0.909248f, 0.909328f, 0.909407f, 0.909487f, 0.909567f, 0.909646f, 0.909726f,
+ 0.909806f, 0.909885f, 0.909965f, 0.910044f, 0.910124f, 0.910203f, 0.910283f, 0.910362f,
+ 0.910441f, 0.910521f, 0.910600f, 0.910679f, 0.910758f, 0.910837f, 0.910917f, 0.910996f,
+ 0.911075f, 0.911154f, 0.911233f, 0.911312f, 0.911391f, 0.911470f, 0.911548f, 0.911627f,
+ 0.911706f, 0.911785f, 0.911864f, 0.911942f, 0.912021f, 0.912099f, 0.912178f, 0.912257f,
+ 0.912335f, 0.912414f, 0.912492f, 0.912571f, 0.912649f, 0.912727f, 0.912806f, 0.912884f,
+ 0.912962f, 0.913040f, 0.913119f, 0.913197f, 0.913275f, 0.913353f, 0.913431f, 0.913509f,
+ 0.913587f, 0.913665f, 0.913743f, 0.913821f, 0.913899f, 0.913976f, 0.914054f, 0.914132f,
+ 0.914210f, 0.914287f, 0.914365f, 0.914443f, 0.914520f, 0.914598f, 0.914675f, 0.914753f,
+ 0.914830f, 0.914908f, 0.914985f, 0.915062f, 0.915140f, 0.915217f, 0.915294f, 0.915372f,
+ 0.915449f, 0.915526f, 0.915603f, 0.915680f, 0.915757f, 0.915834f, 0.915911f, 0.915988f,
+ 0.916065f, 0.916142f, 0.916219f, 0.916296f, 0.916372f, 0.916449f, 0.916526f, 0.916602f,
+ 0.916679f, 0.916756f, 0.916832f, 0.916909f, 0.916985f, 0.917062f, 0.917138f, 0.917215f,
+ 0.917291f, 0.917367f, 0.917444f, 0.917520f, 0.917596f, 0.917672f, 0.917749f, 0.917825f,
+ 0.917901f, 0.917977f, 0.918053f, 0.918129f, 0.918205f, 0.918281f, 0.918357f, 0.918433f,
+ 0.918508f, 0.918584f, 0.918660f, 0.918736f, 0.918811f, 0.918887f, 0.918963f, 0.919038f,
+ 0.919114f, 0.919189f, 0.919265f, 0.919340f, 0.919416f, 0.919491f, 0.919567f, 0.919642f,
+ 0.919717f, 0.919792f, 0.919868f, 0.919943f, 0.920018f, 0.920093f, 0.920168f, 0.920243f,
+ 0.920318f, 0.920393f, 0.920468f, 0.920543f, 0.920618f, 0.920693f, 0.920768f, 0.920842f,
+ 0.920917f, 0.920992f, 0.921067f, 0.921141f, 0.921216f, 0.921291f, 0.921365f, 0.921440f,
+ 0.921514f, 0.921588f, 0.921663f, 0.921737f, 0.921812f, 0.921886f, 0.921960f, 0.922034f,
+ 0.922109f, 0.922183f, 0.922257f, 0.922331f, 0.922405f, 0.922479f, 0.922553f, 0.922627f,
+ 0.922701f, 0.922775f, 0.922849f, 0.922923f, 0.922997f, 0.923070f, 0.923144f, 0.923218f,
+ 0.923291f, 0.923365f, 0.923439f, 0.923512f, 0.923586f, 0.923659f, 0.923733f, 0.923806f,
+ 0.923880f, 0.923953f, 0.924026f, 0.924100f, 0.924173f, 0.924246f, 0.924319f, 0.924392f,
+ 0.924465f, 0.924539f, 0.924612f, 0.924685f, 0.924758f, 0.924831f, 0.924904f, 0.924976f,
+ 0.925049f, 0.925122f, 0.925195f, 0.925268f, 0.925340f, 0.925413f, 0.925486f, 0.925558f,
+ 0.925631f, 0.925703f, 0.925776f, 0.925848f, 0.925921f, 0.925993f, 0.926066f, 0.926138f,
+ 0.926210f, 0.926283f, 0.926355f, 0.926427f, 0.926499f, 0.926571f, 0.926643f, 0.926715f,
+ 0.926787f, 0.926859f, 0.926931f, 0.927003f, 0.927075f, 0.927147f, 0.927219f, 0.927291f,
+ 0.927363f, 0.927434f, 0.927506f, 0.927578f, 0.927649f, 0.927721f, 0.927792f, 0.927864f,
+ 0.927935f, 0.928007f, 0.928078f, 0.928150f, 0.928221f, 0.928292f, 0.928364f, 0.928435f,
+ 0.928506f, 0.928577f, 0.928648f, 0.928720f, 0.928791f, 0.928862f, 0.928933f, 0.929004f,
+ 0.929075f, 0.929146f, 0.929216f, 0.929287f, 0.929358f, 0.929429f, 0.929500f, 0.929570f,
+ 0.929641f, 0.929712f, 0.929782f, 0.929853f, 0.929923f, 0.929994f, 0.930064f, 0.930135f,
+ 0.930205f, 0.930275f, 0.930346f, 0.930416f, 0.930486f, 0.930556f, 0.930627f, 0.930697f,
+ 0.930767f, 0.930837f, 0.930907f, 0.930977f, 0.931047f, 0.931117f, 0.931187f, 0.931257f,
+ 0.931327f, 0.931397f, 0.931466f, 0.931536f, 0.931606f, 0.931675f, 0.931745f, 0.931815f,
+ 0.931884f, 0.931954f, 0.932023f, 0.932093f, 0.932162f, 0.932232f, 0.932301f, 0.932370f,
+ 0.932440f, 0.932509f, 0.932578f, 0.932647f, 0.932716f, 0.932786f, 0.932855f, 0.932924f,
+ 0.932993f, 0.933062f, 0.933131f, 0.933200f, 0.933269f, 0.933337f, 0.933406f, 0.933475f,
+ 0.933544f, 0.933612f, 0.933681f, 0.933750f, 0.933818f, 0.933887f, 0.933956f, 0.934024f,
+ 0.934093f, 0.934161f, 0.934229f, 0.934298f, 0.934366f, 0.934434f, 0.934503f, 0.934571f,
+ 0.934639f, 0.934707f, 0.934775f, 0.934844f, 0.934912f, 0.934980f, 0.935048f, 0.935116f,
+ 0.935184f, 0.935251f, 0.935319f, 0.935387f, 0.935455f, 0.935523f, 0.935590f, 0.935658f,
+ 0.935726f, 0.935793f, 0.935861f, 0.935928f, 0.935996f, 0.936063f, 0.936131f, 0.936198f,
+ 0.936266f, 0.936333f, 0.936400f, 0.936468f, 0.936535f, 0.936602f, 0.936669f, 0.936736f,
+ 0.936803f, 0.936871f, 0.936938f, 0.937005f, 0.937072f, 0.937138f, 0.937205f, 0.937272f,
+ 0.937339f, 0.937406f, 0.937473f, 0.937539f, 0.937606f, 0.937673f, 0.937739f, 0.937806f,
+ 0.937872f, 0.937939f, 0.938005f, 0.938072f, 0.938138f, 0.938205f, 0.938271f, 0.938337f,
+ 0.938404f, 0.938470f, 0.938536f, 0.938602f, 0.938668f, 0.938734f, 0.938800f, 0.938866f,
+ 0.938932f, 0.938998f, 0.939064f, 0.939130f, 0.939196f, 0.939262f, 0.939328f, 0.939394f,
+ 0.939459f, 0.939525f, 0.939591f, 0.939656f, 0.939722f, 0.939787f, 0.939853f, 0.939918f,
+ 0.939984f, 0.940049f, 0.940115f, 0.940180f, 0.940245f, 0.940310f, 0.940376f, 0.940441f,
+ 0.940506f, 0.940571f, 0.940636f, 0.940701f, 0.940766f, 0.940831f, 0.940896f, 0.940961f,
+ 0.941026f, 0.941091f, 0.941156f, 0.941221f, 0.941285f, 0.941350f, 0.941415f, 0.941479f,
+ 0.941544f, 0.941609f, 0.941673f, 0.941738f, 0.941802f, 0.941867f, 0.941931f, 0.941995f,
+ 0.942060f, 0.942124f, 0.942188f, 0.942253f, 0.942317f, 0.942381f, 0.942445f, 0.942509f,
+ 0.942573f, 0.942637f, 0.942701f, 0.942765f, 0.942829f, 0.942893f, 0.942957f, 0.943021f,
+ 0.943084f, 0.943148f, 0.943212f, 0.943276f, 0.943339f, 0.943403f, 0.943466f, 0.943530f,
+ 0.943593f, 0.943657f, 0.943720f, 0.943784f, 0.943847f, 0.943910f, 0.943974f, 0.944037f,
+ 0.944100f, 0.944163f, 0.944227f, 0.944290f, 0.944353f, 0.944416f, 0.944479f, 0.944542f,
+ 0.944605f, 0.944668f, 0.944731f, 0.944793f, 0.944856f, 0.944919f, 0.944982f, 0.945045f,
+ 0.945107f, 0.945170f, 0.945232f, 0.945295f, 0.945358f, 0.945420f, 0.945482f, 0.945545f,
+ 0.945607f, 0.945670f, 0.945732f, 0.945794f, 0.945857f, 0.945919f, 0.945981f, 0.946043f,
+ 0.946105f, 0.946167f, 0.946229f, 0.946291f, 0.946353f, 0.946415f, 0.946477f, 0.946539f,
+ 0.946601f, 0.946663f, 0.946724f, 0.946786f, 0.946848f, 0.946910f, 0.946971f, 0.947033f,
+ 0.947094f, 0.947156f, 0.947217f, 0.947279f, 0.947340f, 0.947402f, 0.947463f, 0.947524f,
+ 0.947586f, 0.947647f, 0.947708f, 0.947769f, 0.947830f, 0.947891f, 0.947953f, 0.948014f,
+ 0.948075f, 0.948136f, 0.948196f, 0.948257f, 0.948318f, 0.948379f, 0.948440f, 0.948501f,
+ 0.948561f, 0.948622f, 0.948683f, 0.948743f, 0.948804f, 0.948864f, 0.948925f, 0.948985f,
+ 0.949046f, 0.949106f, 0.949167f, 0.949227f, 0.949287f, 0.949348f, 0.949408f, 0.949468f,
+ 0.949528f, 0.949588f, 0.949648f, 0.949708f, 0.949768f, 0.949829f, 0.949888f, 0.949948f,
+ 0.950008f, 0.950068f, 0.950128f, 0.950188f, 0.950247f, 0.950307f, 0.950367f, 0.950426f,
+ 0.950486f, 0.950546f, 0.950605f, 0.950665f, 0.950724f, 0.950784f, 0.950843f, 0.950902f,
+ 0.950962f, 0.951021f, 0.951080f, 0.951139f, 0.951199f, 0.951258f, 0.951317f, 0.951376f,
+ 0.951435f, 0.951494f, 0.951553f, 0.951612f, 0.951671f, 0.951730f, 0.951789f, 0.951847f,
+ 0.951906f, 0.951965f, 0.952024f, 0.952082f, 0.952141f, 0.952199f, 0.952258f, 0.952317f,
+ 0.952375f, 0.952433f, 0.952492f, 0.952550f, 0.952609f, 0.952667f, 0.952725f, 0.952783f,
+ 0.952842f, 0.952900f, 0.952958f, 0.953016f, 0.953074f, 0.953132f, 0.953190f, 0.953248f,
+ 0.953306f, 0.953364f, 0.953422f, 0.953480f, 0.953537f, 0.953595f, 0.953653f, 0.953711f,
+ 0.953768f, 0.953826f, 0.953883f, 0.953941f, 0.953998f, 0.954056f, 0.954113f, 0.954171f,
+ 0.954228f, 0.954285f, 0.954343f, 0.954400f, 0.954457f, 0.954514f, 0.954572f, 0.954629f,
+ 0.954686f, 0.954743f, 0.954800f, 0.954857f, 0.954914f, 0.954971f, 0.955028f, 0.955084f,
+ 0.955141f, 0.955198f, 0.955255f, 0.955311f, 0.955368f, 0.955425f, 0.955481f, 0.955538f,
+ 0.955594f, 0.955651f, 0.955707f, 0.955764f, 0.955820f, 0.955876f, 0.955933f, 0.955989f,
+ 0.956045f, 0.956101f, 0.956158f, 0.956214f, 0.956270f, 0.956326f, 0.956382f, 0.956438f,
+ 0.956494f, 0.956550f, 0.956606f, 0.956662f, 0.956717f, 0.956773f, 0.956829f, 0.956885f,
+ 0.956940f, 0.956996f, 0.957052f, 0.957107f, 0.957163f, 0.957218f, 0.957274f, 0.957329f,
+ 0.957385f, 0.957440f, 0.957495f, 0.957550f, 0.957606f, 0.957661f, 0.957716f, 0.957771f,
+ 0.957826f, 0.957882f, 0.957937f, 0.957992f, 0.958046f, 0.958101f, 0.958156f, 0.958211f,
+ 0.958266f, 0.958321f, 0.958376f, 0.958430f, 0.958485f, 0.958540f, 0.958594f, 0.958649f,
+ 0.958703f, 0.958758f, 0.958812f, 0.958867f, 0.958921f, 0.958976f, 0.959030f, 0.959084f,
+ 0.959139f, 0.959193f, 0.959247f, 0.959301f, 0.959355f, 0.959409f, 0.959463f, 0.959518f,
+ 0.959572f, 0.959625f, 0.959679f, 0.959733f, 0.959787f, 0.959841f, 0.959895f, 0.959948f,
+ 0.960002f, 0.960056f, 0.960109f, 0.960163f, 0.960217f, 0.960270f, 0.960324f, 0.960377f,
+ 0.960431f, 0.960484f, 0.960537f, 0.960591f, 0.960644f, 0.960697f, 0.960750f, 0.960804f,
+ 0.960857f, 0.960910f, 0.960963f, 0.961016f, 0.961069f, 0.961122f, 0.961175f, 0.961228f,
+ 0.961280f, 0.961333f, 0.961386f, 0.961439f, 0.961492f, 0.961544f, 0.961597f, 0.961649f,
+ 0.961702f, 0.961755f, 0.961807f, 0.961860f, 0.961912f, 0.961964f, 0.962017f, 0.962069f,
+ 0.962121f, 0.962174f, 0.962226f, 0.962278f, 0.962330f, 0.962382f, 0.962434f, 0.962486f,
+ 0.962538f, 0.962590f, 0.962642f, 0.962694f, 0.962746f, 0.962798f, 0.962850f, 0.962902f,
+ 0.962953f, 0.963005f, 0.963057f, 0.963108f, 0.963160f, 0.963211f, 0.963263f, 0.963314f,
+ 0.963366f, 0.963417f, 0.963469f, 0.963520f, 0.963571f, 0.963623f, 0.963674f, 0.963725f,
+ 0.963776f, 0.963827f, 0.963878f, 0.963929f, 0.963980f, 0.964031f, 0.964082f, 0.964133f,
+ 0.964184f, 0.964235f, 0.964286f, 0.964336f, 0.964387f, 0.964438f, 0.964489f, 0.964539f,
+ 0.964590f, 0.964640f, 0.964691f, 0.964741f, 0.964792f, 0.964842f, 0.964893f, 0.964943f,
+ 0.964993f, 0.965044f, 0.965094f, 0.965144f, 0.965194f, 0.965244f, 0.965294f, 0.965344f,
+ 0.965394f, 0.965444f, 0.965494f, 0.965544f, 0.965594f, 0.965644f, 0.965694f, 0.965744f,
+ 0.965793f, 0.965843f, 0.965893f, 0.965942f, 0.965992f, 0.966042f, 0.966091f, 0.966141f,
+ 0.966190f, 0.966239f, 0.966289f, 0.966338f, 0.966387f, 0.966437f, 0.966486f, 0.966535f,
+ 0.966584f, 0.966633f, 0.966683f, 0.966732f, 0.966781f, 0.966830f, 0.966879f, 0.966928f,
+ 0.966976f, 0.967025f, 0.967074f, 0.967123f, 0.967172f, 0.967220f, 0.967269f, 0.967318f,
+ 0.967366f, 0.967415f, 0.967463f, 0.967512f, 0.967560f, 0.967609f, 0.967657f, 0.967706f,
+ 0.967754f, 0.967802f, 0.967850f, 0.967899f, 0.967947f, 0.967995f, 0.968043f, 0.968091f,
+ 0.968139f, 0.968187f, 0.968235f, 0.968283f, 0.968331f, 0.968379f, 0.968427f, 0.968474f,
+ 0.968522f, 0.968570f, 0.968617f, 0.968665f, 0.968713f, 0.968760f, 0.968808f, 0.968855f,
+ 0.968903f, 0.968950f, 0.968998f, 0.969045f, 0.969092f, 0.969140f, 0.969187f, 0.969234f,
+ 0.969281f, 0.969328f, 0.969375f, 0.969423f, 0.969470f, 0.969517f, 0.969564f, 0.969611f,
+ 0.969657f, 0.969704f, 0.969751f, 0.969798f, 0.969845f, 0.969891f, 0.969938f, 0.969985f,
+ 0.970031f, 0.970078f, 0.970124f, 0.970171f, 0.970217f, 0.970264f, 0.970310f, 0.970357f,
+ 0.970403f, 0.970449f, 0.970495f, 0.970542f, 0.970588f, 0.970634f, 0.970680f, 0.970726f,
+ 0.970772f, 0.970818f, 0.970864f, 0.970910f, 0.970956f, 0.971002f, 0.971048f, 0.971093f,
+ 0.971139f, 0.971185f, 0.971231f, 0.971276f, 0.971322f, 0.971367f, 0.971413f, 0.971458f,
+ 0.971504f, 0.971549f, 0.971595f, 0.971640f, 0.971685f, 0.971731f, 0.971776f, 0.971821f,
+ 0.971866f, 0.971911f, 0.971957f, 0.972002f, 0.972047f, 0.972092f, 0.972137f, 0.972182f,
+ 0.972227f, 0.972271f, 0.972316f, 0.972361f, 0.972406f, 0.972450f, 0.972495f, 0.972540f,
+ 0.972584f, 0.972629f, 0.972673f, 0.972718f, 0.972762f, 0.972807f, 0.972851f, 0.972896f,
+ 0.972940f, 0.972984f, 0.973028f, 0.973073f, 0.973117f, 0.973161f, 0.973205f, 0.973249f,
+ 0.973293f, 0.973337f, 0.973381f, 0.973425f, 0.973469f, 0.973513f, 0.973557f, 0.973601f,
+ 0.973644f, 0.973688f, 0.973732f, 0.973775f, 0.973819f, 0.973862f, 0.973906f, 0.973949f,
+ 0.973993f, 0.974036f, 0.974080f, 0.974123f, 0.974166f, 0.974210f, 0.974253f, 0.974296f,
+ 0.974339f, 0.974383f, 0.974426f, 0.974469f, 0.974512f, 0.974555f, 0.974598f, 0.974641f,
+ 0.974684f, 0.974726f, 0.974769f, 0.974812f, 0.974855f, 0.974897f, 0.974940f, 0.974983f,
+ 0.975025f, 0.975068f, 0.975110f, 0.975153f, 0.975195f, 0.975238f, 0.975280f, 0.975323f,
+ 0.975365f, 0.975407f, 0.975449f, 0.975492f, 0.975534f, 0.975576f, 0.975618f, 0.975660f,
+ 0.975702f, 0.975744f, 0.975786f, 0.975828f, 0.975870f, 0.975912f, 0.975954f, 0.975995f,
+ 0.976037f, 0.976079f, 0.976120f, 0.976162f, 0.976204f, 0.976245f, 0.976287f, 0.976328f,
+ 0.976370f, 0.976411f, 0.976453f, 0.976494f, 0.976535f, 0.976576f, 0.976618f, 0.976659f,
+ 0.976700f, 0.976741f, 0.976782f, 0.976823f, 0.976864f, 0.976905f, 0.976946f, 0.976987f,
+ 0.977028f, 0.977069f, 0.977110f, 0.977151f, 0.977191f, 0.977232f, 0.977273f, 0.977313f,
+ 0.977354f, 0.977394f, 0.977435f, 0.977475f, 0.977516f, 0.977556f, 0.977597f, 0.977637f,
+ 0.977677f, 0.977718f, 0.977758f, 0.977798f, 0.977838f, 0.977878f, 0.977918f, 0.977959f,
+ 0.977998f, 0.978038f, 0.978078f, 0.978118f, 0.978158f, 0.978198f, 0.978238f, 0.978278f,
+ 0.978317f, 0.978357f, 0.978397f, 0.978436f, 0.978476f, 0.978516f, 0.978555f, 0.978594f,
+ 0.978634f, 0.978673f, 0.978713f, 0.978752f, 0.978791f, 0.978831f, 0.978870f, 0.978909f,
+ 0.978948f, 0.978987f, 0.979026f, 0.979065f, 0.979104f, 0.979143f, 0.979182f, 0.979221f,
+ 0.979260f, 0.979299f, 0.979338f, 0.979376f, 0.979415f, 0.979454f, 0.979493f, 0.979531f,
+ 0.979570f, 0.979608f, 0.979647f, 0.979685f, 0.979724f, 0.979762f, 0.979800f, 0.979839f,
+ 0.979877f, 0.979915f, 0.979954f, 0.979992f, 0.980030f, 0.980068f, 0.980106f, 0.980144f,
+ 0.980182f, 0.980220f, 0.980258f, 0.980296f, 0.980334f, 0.980372f, 0.980409f, 0.980447f,
+ 0.980485f, 0.980523f, 0.980560f, 0.980598f, 0.980635f, 0.980673f, 0.980710f, 0.980748f,
+ 0.980785f, 0.980823f, 0.980860f, 0.980897f, 0.980935f, 0.980972f, 0.981009f, 0.981046f,
+ 0.981083f, 0.981120f, 0.981158f, 0.981195f, 0.981232f, 0.981269f, 0.981305f, 0.981342f,
+ 0.981379f, 0.981416f, 0.981453f, 0.981490f, 0.981526f, 0.981563f, 0.981600f, 0.981636f,
+ 0.981673f, 0.981709f, 0.981746f, 0.981782f, 0.981819f, 0.981855f, 0.981891f, 0.981928f,
+ 0.981964f, 0.982000f, 0.982036f, 0.982072f, 0.982109f, 0.982145f, 0.982181f, 0.982217f,
+ 0.982253f, 0.982289f, 0.982325f, 0.982360f, 0.982396f, 0.982432f, 0.982468f, 0.982504f,
+ 0.982539f, 0.982575f, 0.982611f, 0.982646f, 0.982682f, 0.982717f, 0.982753f, 0.982788f,
+ 0.982824f, 0.982859f, 0.982894f, 0.982930f, 0.982965f, 0.983000f, 0.983035f, 0.983070f,
+ 0.983105f, 0.983141f, 0.983176f, 0.983211f, 0.983246f, 0.983281f, 0.983315f, 0.983350f,
+ 0.983385f, 0.983420f, 0.983455f, 0.983489f, 0.983524f, 0.983559f, 0.983593f, 0.983628f,
+ 0.983662f, 0.983697f, 0.983731f, 0.983766f, 0.983800f, 0.983835f, 0.983869f, 0.983903f,
+ 0.983937f, 0.983972f, 0.984006f, 0.984040f, 0.984074f, 0.984108f, 0.984142f, 0.984176f,
+ 0.984210f, 0.984244f, 0.984278f, 0.984312f, 0.984346f, 0.984379f, 0.984413f, 0.984447f,
+ 0.984480f, 0.984514f, 0.984548f, 0.984581f, 0.984615f, 0.984648f, 0.984682f, 0.984715f,
+ 0.984748f, 0.984782f, 0.984815f, 0.984848f, 0.984882f, 0.984915f, 0.984948f, 0.984981f,
+ 0.985014f, 0.985047f, 0.985080f, 0.985113f, 0.985146f, 0.985179f, 0.985212f, 0.985245f,
+ 0.985278f, 0.985310f, 0.985343f, 0.985376f, 0.985408f, 0.985441f, 0.985474f, 0.985506f,
+ 0.985539f, 0.985571f, 0.985604f, 0.985636f, 0.985668f, 0.985701f, 0.985733f, 0.985765f,
+ 0.985798f, 0.985830f, 0.985862f, 0.985894f, 0.985926f, 0.985958f, 0.985990f, 0.986022f,
+ 0.986054f, 0.986086f, 0.986118f, 0.986150f, 0.986181f, 0.986213f, 0.986245f, 0.986276f,
+ 0.986308f, 0.986340f, 0.986371f, 0.986403f, 0.986434f, 0.986466f, 0.986497f, 0.986529f,
+ 0.986560f, 0.986591f, 0.986623f, 0.986654f, 0.986685f, 0.986716f, 0.986747f, 0.986778f,
+ 0.986809f, 0.986840f, 0.986871f, 0.986902f, 0.986933f, 0.986964f, 0.986995f, 0.987026f,
+ 0.987057f, 0.987087f, 0.987118f, 0.987149f, 0.987179f, 0.987210f, 0.987240f, 0.987271f,
+ 0.987301f, 0.987332f, 0.987362f, 0.987393f, 0.987423f, 0.987453f, 0.987484f, 0.987514f,
+ 0.987544f, 0.987574f, 0.987604f, 0.987634f, 0.987664f, 0.987694f, 0.987724f, 0.987754f,
+ 0.987784f, 0.987814f, 0.987844f, 0.987874f, 0.987903f, 0.987933f, 0.987963f, 0.987992f,
+ 0.988022f, 0.988052f, 0.988081f, 0.988111f, 0.988140f, 0.988169f, 0.988199f, 0.988228f,
+ 0.988258f, 0.988287f, 0.988316f, 0.988345f, 0.988374f, 0.988404f, 0.988433f, 0.988462f,
+ 0.988491f, 0.988520f, 0.988549f, 0.988578f, 0.988607f, 0.988635f, 0.988664f, 0.988693f,
+ 0.988722f, 0.988750f, 0.988779f, 0.988808f, 0.988836f, 0.988865f, 0.988893f, 0.988922f,
+ 0.988950f, 0.988979f, 0.989007f, 0.989035f, 0.989064f, 0.989092f, 0.989120f, 0.989148f,
+ 0.989177f, 0.989205f, 0.989233f, 0.989261f, 0.989289f, 0.989317f, 0.989345f, 0.989373f,
+ 0.989400f, 0.989428f, 0.989456f, 0.989484f, 0.989511f, 0.989539f, 0.989567f, 0.989594f,
+ 0.989622f, 0.989650f, 0.989677f, 0.989704f, 0.989732f, 0.989759f, 0.989787f, 0.989814f,
+ 0.989841f, 0.989869f, 0.989896f, 0.989923f, 0.989950f, 0.989977f, 0.990004f, 0.990031f,
+ 0.990058f, 0.990085f, 0.990112f, 0.990139f, 0.990166f, 0.990193f, 0.990219f, 0.990246f,
+ 0.990273f, 0.990299f, 0.990326f, 0.990353f, 0.990379f, 0.990406f, 0.990432f, 0.990459f,
+ 0.990485f, 0.990511f, 0.990538f, 0.990564f, 0.990590f, 0.990617f, 0.990643f, 0.990669f,
+ 0.990695f, 0.990721f, 0.990747f, 0.990773f, 0.990799f, 0.990825f, 0.990851f, 0.990877f,
+ 0.990903f, 0.990928f, 0.990954f, 0.990980f, 0.991006f, 0.991031f, 0.991057f, 0.991082f,
+ 0.991108f, 0.991133f, 0.991159f, 0.991184f, 0.991210f, 0.991235f, 0.991260f, 0.991286f,
+ 0.991311f, 0.991336f, 0.991361f, 0.991386f, 0.991411f, 0.991437f, 0.991462f, 0.991487f,
+ 0.991511f, 0.991536f, 0.991561f, 0.991586f, 0.991611f, 0.991636f, 0.991660f, 0.991685f,
+ 0.991710f, 0.991734f, 0.991759f, 0.991783f, 0.991808f, 0.991832f, 0.991857f, 0.991881f,
+ 0.991906f, 0.991930f, 0.991954f, 0.991979f, 0.992003f, 0.992027f, 0.992051f, 0.992075f,
+ 0.992099f, 0.992123f, 0.992147f, 0.992171f, 0.992195f, 0.992219f, 0.992243f, 0.992267f,
+ 0.992291f, 0.992314f, 0.992338f, 0.992362f, 0.992385f, 0.992409f, 0.992433f, 0.992456f,
+ 0.992480f, 0.992503f, 0.992526f, 0.992550f, 0.992573f, 0.992596f, 0.992620f, 0.992643f,
+ 0.992666f, 0.992689f, 0.992712f, 0.992736f, 0.992759f, 0.992782f, 0.992805f, 0.992828f,
+ 0.992850f, 0.992873f, 0.992896f, 0.992919f, 0.992942f, 0.992964f, 0.992987f, 0.993010f,
+ 0.993032f, 0.993055f, 0.993077f, 0.993100f, 0.993122f, 0.993145f, 0.993167f, 0.993190f,
+ 0.993212f, 0.993234f, 0.993257f, 0.993279f, 0.993301f, 0.993323f, 0.993345f, 0.993367f,
+ 0.993389f, 0.993411f, 0.993433f, 0.993455f, 0.993477f, 0.993499f, 0.993521f, 0.993542f,
+ 0.993564f, 0.993586f, 0.993608f, 0.993629f, 0.993651f, 0.993672f, 0.993694f, 0.993715f,
+ 0.993737f, 0.993758f, 0.993779f, 0.993801f, 0.993822f, 0.993843f, 0.993865f, 0.993886f,
+ 0.993907f, 0.993928f, 0.993949f, 0.993970f, 0.993991f, 0.994012f, 0.994033f, 0.994054f,
+ 0.994075f, 0.994096f, 0.994116f, 0.994137f, 0.994158f, 0.994179f, 0.994199f, 0.994220f,
+ 0.994240f, 0.994261f, 0.994281f, 0.994302f, 0.994322f, 0.994343f, 0.994363f, 0.994383f,
+ 0.994404f, 0.994424f, 0.994444f, 0.994464f, 0.994484f, 0.994505f, 0.994525f, 0.994545f,
+ 0.994565f, 0.994585f, 0.994604f, 0.994624f, 0.994644f, 0.994664f, 0.994684f, 0.994703f,
+ 0.994723f, 0.994743f, 0.994762f, 0.994782f, 0.994802f, 0.994821f, 0.994841f, 0.994860f,
+ 0.994879f, 0.994899f, 0.994918f, 0.994937f, 0.994957f, 0.994976f, 0.994995f, 0.995014f,
+ 0.995033f, 0.995052f, 0.995071f, 0.995090f, 0.995109f, 0.995128f, 0.995147f, 0.995166f,
+ 0.995185f, 0.995203f, 0.995222f, 0.995241f, 0.995260f, 0.995278f, 0.995297f, 0.995315f,
+ 0.995334f, 0.995352f, 0.995371f, 0.995389f, 0.995408f, 0.995426f, 0.995444f, 0.995463f,
+ 0.995481f, 0.995499f, 0.995517f, 0.995535f, 0.995553f, 0.995571f, 0.995589f, 0.995607f,
+ 0.995625f, 0.995643f, 0.995661f, 0.995679f, 0.995697f, 0.995714f, 0.995732f, 0.995750f,
+ 0.995767f, 0.995785f, 0.995803f, 0.995820f, 0.995838f, 0.995855f, 0.995872f, 0.995890f,
+ 0.995907f, 0.995925f, 0.995942f, 0.995959f, 0.995976f, 0.995993f, 0.996011f, 0.996028f,
+ 0.996045f, 0.996062f, 0.996079f, 0.996096f, 0.996113f, 0.996129f, 0.996146f, 0.996163f,
+ 0.996180f, 0.996197f, 0.996213f, 0.996230f, 0.996247f, 0.996263f, 0.996280f, 0.996296f,
+ 0.996313f, 0.996329f, 0.996345f, 0.996362f, 0.996378f, 0.996394f, 0.996411f, 0.996427f,
+ 0.996443f, 0.996459f, 0.996475f, 0.996491f, 0.996507f, 0.996523f, 0.996539f, 0.996555f,
+ 0.996571f, 0.996587f, 0.996603f, 0.996619f, 0.996634f, 0.996650f, 0.996666f, 0.996681f,
+ 0.996697f, 0.996712f, 0.996728f, 0.996743f, 0.996759f, 0.996774f, 0.996790f, 0.996805f,
+ 0.996820f, 0.996836f, 0.996851f, 0.996866f, 0.996881f, 0.996896f, 0.996911f, 0.996926f,
+ 0.996941f, 0.996956f, 0.996971f, 0.996986f, 0.997001f, 0.997016f, 0.997031f, 0.997045f,
+ 0.997060f, 0.997075f, 0.997089f, 0.997104f, 0.997119f, 0.997133f, 0.997148f, 0.997162f,
+ 0.997176f, 0.997191f, 0.997205f, 0.997219f, 0.997234f, 0.997248f, 0.997262f, 0.997276f,
+ 0.997290f, 0.997305f, 0.997319f, 0.997333f, 0.997347f, 0.997361f, 0.997374f, 0.997388f,
+ 0.997402f, 0.997416f, 0.997430f, 0.997443f, 0.997457f, 0.997471f, 0.997484f, 0.997498f,
+ 0.997511f, 0.997525f, 0.997538f, 0.997552f, 0.997565f, 0.997579f, 0.997592f, 0.997605f,
+ 0.997618f, 0.997632f, 0.997645f, 0.997658f, 0.997671f, 0.997684f, 0.997697f, 0.997710f,
+ 0.997723f, 0.997736f, 0.997749f, 0.997762f, 0.997774f, 0.997787f, 0.997800f, 0.997813f,
+ 0.997825f, 0.997838f, 0.997851f, 0.997863f, 0.997876f, 0.997888f, 0.997901f, 0.997913f,
+ 0.997925f, 0.997938f, 0.997950f, 0.997962f, 0.997974f, 0.997987f, 0.997999f, 0.998011f,
+ 0.998023f, 0.998035f, 0.998047f, 0.998059f, 0.998071f, 0.998083f, 0.998094f, 0.998106f,
+ 0.998118f, 0.998130f, 0.998142f, 0.998153f, 0.998165f, 0.998176f, 0.998188f, 0.998200f,
+ 0.998211f, 0.998222f, 0.998234f, 0.998245f, 0.998257f, 0.998268f, 0.998279f, 0.998290f,
+ 0.998302f, 0.998313f, 0.998324f, 0.998335f, 0.998346f, 0.998357f, 0.998368f, 0.998379f,
+ 0.998390f, 0.998401f, 0.998411f, 0.998422f, 0.998433f, 0.998444f, 0.998454f, 0.998465f,
+ 0.998476f, 0.998486f, 0.998497f, 0.998507f, 0.998518f, 0.998528f, 0.998538f, 0.998549f,
+ 0.998559f, 0.998569f, 0.998580f, 0.998590f, 0.998600f, 0.998610f, 0.998620f, 0.998630f,
+ 0.998640f, 0.998650f, 0.998660f, 0.998670f, 0.998680f, 0.998690f, 0.998700f, 0.998709f,
+ 0.998719f, 0.998729f, 0.998738f, 0.998748f, 0.998758f, 0.998767f, 0.998777f, 0.998786f,
+ 0.998795f, 0.998805f, 0.998814f, 0.998824f, 0.998833f, 0.998842f, 0.998851f, 0.998860f,
+ 0.998870f, 0.998879f, 0.998888f, 0.998897f, 0.998906f, 0.998915f, 0.998924f, 0.998932f,
+ 0.998941f, 0.998950f, 0.998959f, 0.998968f, 0.998976f, 0.998985f, 0.998994f, 0.999002f,
+ 0.999011f, 0.999019f, 0.999028f, 0.999036f, 0.999044f, 0.999053f, 0.999061f, 0.999069f,
+ 0.999078f, 0.999086f, 0.999094f, 0.999102f, 0.999110f, 0.999118f, 0.999126f, 0.999134f,
+ 0.999142f, 0.999150f, 0.999158f, 0.999166f, 0.999174f, 0.999182f, 0.999189f, 0.999197f,
+ 0.999205f, 0.999212f, 0.999220f, 0.999228f, 0.999235f, 0.999243f, 0.999250f, 0.999257f,
+ 0.999265f, 0.999272f, 0.999279f, 0.999287f, 0.999294f, 0.999301f, 0.999308f, 0.999315f,
+ 0.999322f, 0.999329f, 0.999336f, 0.999343f, 0.999350f, 0.999357f, 0.999364f, 0.999371f,
+ 0.999378f, 0.999384f, 0.999391f, 0.999398f, 0.999404f, 0.999411f, 0.999418f, 0.999424f,
+ 0.999431f, 0.999437f, 0.999443f, 0.999450f, 0.999456f, 0.999462f, 0.999469f, 0.999475f,
+ 0.999481f, 0.999487f, 0.999493f, 0.999500f, 0.999506f, 0.999512f, 0.999518f, 0.999524f,
+ 0.999529f, 0.999535f, 0.999541f, 0.999547f, 0.999553f, 0.999558f, 0.999564f, 0.999570f,
+ 0.999575f, 0.999581f, 0.999586f, 0.999592f, 0.999597f, 0.999603f, 0.999608f, 0.999614f,
+ 0.999619f, 0.999624f, 0.999629f, 0.999635f, 0.999640f, 0.999645f, 0.999650f, 0.999655f,
+ 0.999660f, 0.999665f, 0.999670f, 0.999675f, 0.999680f, 0.999685f, 0.999689f, 0.999694f,
+ 0.999699f, 0.999704f, 0.999708f, 0.999713f, 0.999717f, 0.999722f, 0.999726f, 0.999731f,
+ 0.999735f, 0.999740f, 0.999744f, 0.999748f, 0.999753f, 0.999757f, 0.999761f, 0.999765f,
+ 0.999769f, 0.999774f, 0.999778f, 0.999782f, 0.999786f, 0.999790f, 0.999793f, 0.999797f,
+ 0.999801f, 0.999805f, 0.999809f, 0.999812f, 0.999816f, 0.999820f, 0.999823f, 0.999827f,
+ 0.999831f, 0.999834f, 0.999838f, 0.999841f, 0.999844f, 0.999848f, 0.999851f, 0.999854f,
+ 0.999858f, 0.999861f, 0.999864f, 0.999867f, 0.999870f, 0.999873f, 0.999876f, 0.999879f,
+ 0.999882f, 0.999885f, 0.999888f, 0.999891f, 0.999894f, 0.999897f, 0.999899f, 0.999902f,
+ 0.999905f, 0.999907f, 0.999910f, 0.999913f, 0.999915f, 0.999917f, 0.999920f, 0.999922f,
+ 0.999925f, 0.999927f, 0.999929f, 0.999932f, 0.999934f, 0.999936f, 0.999938f, 0.999940f,
+ 0.999942f, 0.999944f, 0.999946f, 0.999948f, 0.999950f, 0.999952f, 0.999954f, 0.999956f,
+ 0.999958f, 0.999959f, 0.999961f, 0.999963f, 0.999964f, 0.999966f, 0.999968f, 0.999969f,
+ 0.999971f, 0.999972f, 0.999973f, 0.999975f, 0.999976f, 0.999977f, 0.999979f, 0.999980f,
+ 0.999981f, 0.999982f, 0.999983f, 0.999985f, 0.999986f, 0.999987f, 0.999988f, 0.999988f,
+ 0.999989f, 0.999990f, 0.999991f, 0.999992f, 0.999993f, 0.999993f, 0.999994f, 0.999995f,
+ 0.999995f, 0.999996f, 0.999996f, 0.999997f, 0.999997f, 0.999998f, 0.999998f, 0.999999f,
+ 0.999999f, 0.999999f, 0.999999f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f
+};
+
+static const float cosTable65536[32768] = {
+ 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
+ 1.000000f, 1.000000f, 1.000000f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f,
+ 0.999999f, 0.999999f, 0.999999f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999998f,
+ 0.999997f, 0.999997f, 0.999997f, 0.999997f, 0.999996f, 0.999996f, 0.999996f, 0.999996f,
+ 0.999995f, 0.999995f, 0.999995f, 0.999994f, 0.999994f, 0.999994f, 0.999993f, 0.999993f,
+ 0.999993f, 0.999992f, 0.999992f, 0.999991f, 0.999991f, 0.999991f, 0.999990f, 0.999990f,
+ 0.999989f, 0.999989f, 0.999988f, 0.999988f, 0.999988f, 0.999987f, 0.999987f, 0.999986f,
+ 0.999986f, 0.999985f, 0.999985f, 0.999984f, 0.999983f, 0.999983f, 0.999982f, 0.999982f,
+ 0.999981f, 0.999981f, 0.999980f, 0.999979f, 0.999979f, 0.999978f, 0.999977f, 0.999977f,
+ 0.999976f, 0.999976f, 0.999975f, 0.999974f, 0.999973f, 0.999973f, 0.999972f, 0.999971f,
+ 0.999971f, 0.999970f, 0.999969f, 0.999968f, 0.999968f, 0.999967f, 0.999966f, 0.999965f,
+ 0.999964f, 0.999964f, 0.999963f, 0.999962f, 0.999961f, 0.999960f, 0.999959f, 0.999959f,
+ 0.999958f, 0.999957f, 0.999956f, 0.999955f, 0.999954f, 0.999953f, 0.999952f, 0.999951f,
+ 0.999950f, 0.999949f, 0.999948f, 0.999947f, 0.999946f, 0.999945f, 0.999944f, 0.999943f,
+ 0.999942f, 0.999941f, 0.999940f, 0.999939f, 0.999938f, 0.999937f, 0.999936f, 0.999935f,
+ 0.999934f, 0.999933f, 0.999932f, 0.999930f, 0.999929f, 0.999928f, 0.999927f, 0.999926f,
+ 0.999925f, 0.999924f, 0.999922f, 0.999921f, 0.999920f, 0.999919f, 0.999917f, 0.999916f,
+ 0.999915f, 0.999914f, 0.999913f, 0.999911f, 0.999910f, 0.999909f, 0.999907f, 0.999906f,
+ 0.999905f, 0.999903f, 0.999902f, 0.999901f, 0.999899f, 0.999898f, 0.999897f, 0.999895f,
+ 0.999894f, 0.999892f, 0.999891f, 0.999890f, 0.999888f, 0.999887f, 0.999885f, 0.999884f,
+ 0.999882f, 0.999881f, 0.999879f, 0.999878f, 0.999876f, 0.999875f, 0.999873f, 0.999872f,
+ 0.999870f, 0.999869f, 0.999867f, 0.999866f, 0.999864f, 0.999862f, 0.999861f, 0.999859f,
+ 0.999858f, 0.999856f, 0.999854f, 0.999853f, 0.999851f, 0.999849f, 0.999848f, 0.999846f,
+ 0.999844f, 0.999843f, 0.999841f, 0.999839f, 0.999838f, 0.999836f, 0.999834f, 0.999832f,
+ 0.999831f, 0.999829f, 0.999827f, 0.999825f, 0.999823f, 0.999822f, 0.999820f, 0.999818f,
+ 0.999816f, 0.999814f, 0.999812f, 0.999811f, 0.999809f, 0.999807f, 0.999805f, 0.999803f,
+ 0.999801f, 0.999799f, 0.999797f, 0.999795f, 0.999793f, 0.999792f, 0.999790f, 0.999788f,
+ 0.999786f, 0.999784f, 0.999782f, 0.999780f, 0.999778f, 0.999776f, 0.999774f, 0.999771f,
+ 0.999769f, 0.999767f, 0.999765f, 0.999763f, 0.999761f, 0.999759f, 0.999757f, 0.999755f,
+ 0.999753f, 0.999750f, 0.999748f, 0.999746f, 0.999744f, 0.999742f, 0.999740f, 0.999738f,
+ 0.999735f, 0.999733f, 0.999731f, 0.999729f, 0.999726f, 0.999724f, 0.999722f, 0.999720f,
+ 0.999717f, 0.999715f, 0.999713f, 0.999710f, 0.999708f, 0.999706f, 0.999704f, 0.999701f,
+ 0.999699f, 0.999696f, 0.999694f, 0.999692f, 0.999689f, 0.999687f, 0.999685f, 0.999682f,
+ 0.999680f, 0.999677f, 0.999675f, 0.999672f, 0.999670f, 0.999667f, 0.999665f, 0.999663f,
+ 0.999660f, 0.999658f, 0.999655f, 0.999652f, 0.999650f, 0.999647f, 0.999645f, 0.999642f,
+ 0.999640f, 0.999637f, 0.999635f, 0.999632f, 0.999629f, 0.999627f, 0.999624f, 0.999621f,
+ 0.999619f, 0.999616f, 0.999614f, 0.999611f, 0.999608f, 0.999605f, 0.999603f, 0.999600f,
+ 0.999597f, 0.999595f, 0.999592f, 0.999589f, 0.999586f, 0.999584f, 0.999581f, 0.999578f,
+ 0.999575f, 0.999573f, 0.999570f, 0.999567f, 0.999564f, 0.999561f, 0.999558f, 0.999556f,
+ 0.999553f, 0.999550f, 0.999547f, 0.999544f, 0.999541f, 0.999538f, 0.999535f, 0.999532f,
+ 0.999529f, 0.999527f, 0.999524f, 0.999521f, 0.999518f, 0.999515f, 0.999512f, 0.999509f,
+ 0.999506f, 0.999503f, 0.999500f, 0.999497f, 0.999493f, 0.999490f, 0.999487f, 0.999484f,
+ 0.999481f, 0.999478f, 0.999475f, 0.999472f, 0.999469f, 0.999466f, 0.999462f, 0.999459f,
+ 0.999456f, 0.999453f, 0.999450f, 0.999447f, 0.999443f, 0.999440f, 0.999437f, 0.999434f,
+ 0.999431f, 0.999427f, 0.999424f, 0.999421f, 0.999418f, 0.999414f, 0.999411f, 0.999408f,
+ 0.999404f, 0.999401f, 0.999398f, 0.999394f, 0.999391f, 0.999388f, 0.999384f, 0.999381f,
+ 0.999378f, 0.999374f, 0.999371f, 0.999367f, 0.999364f, 0.999361f, 0.999357f, 0.999354f,
+ 0.999350f, 0.999347f, 0.999343f, 0.999340f, 0.999336f, 0.999333f, 0.999329f, 0.999326f,
+ 0.999322f, 0.999319f, 0.999315f, 0.999312f, 0.999308f, 0.999305f, 0.999301f, 0.999297f,
+ 0.999294f, 0.999290f, 0.999287f, 0.999283f, 0.999279f, 0.999276f, 0.999272f, 0.999268f,
+ 0.999265f, 0.999261f, 0.999257f, 0.999254f, 0.999250f, 0.999246f, 0.999243f, 0.999239f,
+ 0.999235f, 0.999231f, 0.999228f, 0.999224f, 0.999220f, 0.999216f, 0.999212f, 0.999209f,
+ 0.999205f, 0.999201f, 0.999197f, 0.999193f, 0.999189f, 0.999186f, 0.999182f, 0.999178f,
+ 0.999174f, 0.999170f, 0.999166f, 0.999162f, 0.999158f, 0.999154f, 0.999150f, 0.999146f,
+ 0.999142f, 0.999138f, 0.999134f, 0.999130f, 0.999126f, 0.999122f, 0.999118f, 0.999114f,
+ 0.999110f, 0.999106f, 0.999102f, 0.999098f, 0.999094f, 0.999090f, 0.999086f, 0.999082f,
+ 0.999078f, 0.999074f, 0.999069f, 0.999065f, 0.999061f, 0.999057f, 0.999053f, 0.999049f,
+ 0.999044f, 0.999040f, 0.999036f, 0.999032f, 0.999028f, 0.999023f, 0.999019f, 0.999015f,
+ 0.999011f, 0.999006f, 0.999002f, 0.998998f, 0.998994f, 0.998989f, 0.998985f, 0.998981f,
+ 0.998976f, 0.998972f, 0.998968f, 0.998963f, 0.998959f, 0.998954f, 0.998950f, 0.998946f,
+ 0.998941f, 0.998937f, 0.998932f, 0.998928f, 0.998924f, 0.998919f, 0.998915f, 0.998910f,
+ 0.998906f, 0.998901f, 0.998897f, 0.998892f, 0.998888f, 0.998883f, 0.998879f, 0.998874f,
+ 0.998870f, 0.998865f, 0.998860f, 0.998856f, 0.998851f, 0.998847f, 0.998842f, 0.998837f,
+ 0.998833f, 0.998828f, 0.998824f, 0.998819f, 0.998814f, 0.998810f, 0.998805f, 0.998800f,
+ 0.998795f, 0.998791f, 0.998786f, 0.998781f, 0.998777f, 0.998772f, 0.998767f, 0.998762f,
+ 0.998758f, 0.998753f, 0.998748f, 0.998743f, 0.998738f, 0.998734f, 0.998729f, 0.998724f,
+ 0.998719f, 0.998714f, 0.998709f, 0.998704f, 0.998700f, 0.998695f, 0.998690f, 0.998685f,
+ 0.998680f, 0.998675f, 0.998670f, 0.998665f, 0.998660f, 0.998655f, 0.998650f, 0.998645f,
+ 0.998640f, 0.998635f, 0.998630f, 0.998625f, 0.998620f, 0.998615f, 0.998610f, 0.998605f,
+ 0.998600f, 0.998595f, 0.998590f, 0.998585f, 0.998580f, 0.998574f, 0.998569f, 0.998564f,
+ 0.998559f, 0.998554f, 0.998549f, 0.998544f, 0.998538f, 0.998533f, 0.998528f, 0.998523f,
+ 0.998518f, 0.998512f, 0.998507f, 0.998502f, 0.998497f, 0.998491f, 0.998486f, 0.998481f,
+ 0.998476f, 0.998470f, 0.998465f, 0.998460f, 0.998454f, 0.998449f, 0.998444f, 0.998438f,
+ 0.998433f, 0.998428f, 0.998422f, 0.998417f, 0.998411f, 0.998406f, 0.998401f, 0.998395f,
+ 0.998390f, 0.998384f, 0.998379f, 0.998373f, 0.998368f, 0.998362f, 0.998357f, 0.998351f,
+ 0.998346f, 0.998340f, 0.998335f, 0.998329f, 0.998324f, 0.998318f, 0.998313f, 0.998307f,
+ 0.998302f, 0.998296f, 0.998290f, 0.998285f, 0.998279f, 0.998273f, 0.998268f, 0.998262f,
+ 0.998257f, 0.998251f, 0.998245f, 0.998240f, 0.998234f, 0.998228f, 0.998222f, 0.998217f,
+ 0.998211f, 0.998205f, 0.998200f, 0.998194f, 0.998188f, 0.998182f, 0.998176f, 0.998171f,
+ 0.998165f, 0.998159f, 0.998153f, 0.998147f, 0.998142f, 0.998136f, 0.998130f, 0.998124f,
+ 0.998118f, 0.998112f, 0.998106f, 0.998100f, 0.998094f, 0.998089f, 0.998083f, 0.998077f,
+ 0.998071f, 0.998065f, 0.998059f, 0.998053f, 0.998047f, 0.998041f, 0.998035f, 0.998029f,
+ 0.998023f, 0.998017f, 0.998011f, 0.998005f, 0.997999f, 0.997993f, 0.997987f, 0.997980f,
+ 0.997974f, 0.997968f, 0.997962f, 0.997956f, 0.997950f, 0.997944f, 0.997938f, 0.997931f,
+ 0.997925f, 0.997919f, 0.997913f, 0.997907f, 0.997901f, 0.997894f, 0.997888f, 0.997882f,
+ 0.997876f, 0.997869f, 0.997863f, 0.997857f, 0.997851f, 0.997844f, 0.997838f, 0.997832f,
+ 0.997825f, 0.997819f, 0.997813f, 0.997806f, 0.997800f, 0.997794f, 0.997787f, 0.997781f,
+ 0.997774f, 0.997768f, 0.997762f, 0.997755f, 0.997749f, 0.997742f, 0.997736f, 0.997730f,
+ 0.997723f, 0.997717f, 0.997710f, 0.997704f, 0.997697f, 0.997691f, 0.997684f, 0.997678f,
+ 0.997671f, 0.997665f, 0.997658f, 0.997651f, 0.997645f, 0.997638f, 0.997632f, 0.997625f,
+ 0.997618f, 0.997612f, 0.997605f, 0.997599f, 0.997592f, 0.997585f, 0.997579f, 0.997572f,
+ 0.997565f, 0.997559f, 0.997552f, 0.997545f, 0.997538f, 0.997532f, 0.997525f, 0.997518f,
+ 0.997511f, 0.997505f, 0.997498f, 0.997491f, 0.997484f, 0.997478f, 0.997471f, 0.997464f,
+ 0.997457f, 0.997450f, 0.997443f, 0.997437f, 0.997430f, 0.997423f, 0.997416f, 0.997409f,
+ 0.997402f, 0.997395f, 0.997388f, 0.997381f, 0.997374f, 0.997368f, 0.997361f, 0.997354f,
+ 0.997347f, 0.997340f, 0.997333f, 0.997326f, 0.997319f, 0.997312f, 0.997305f, 0.997298f,
+ 0.997290f, 0.997283f, 0.997276f, 0.997269f, 0.997262f, 0.997255f, 0.997248f, 0.997241f,
+ 0.997234f, 0.997227f, 0.997219f, 0.997212f, 0.997205f, 0.997198f, 0.997191f, 0.997184f,
+ 0.997176f, 0.997169f, 0.997162f, 0.997155f, 0.997148f, 0.997140f, 0.997133f, 0.997126f,
+ 0.997119f, 0.997111f, 0.997104f, 0.997097f, 0.997089f, 0.997082f, 0.997075f, 0.997067f,
+ 0.997060f, 0.997053f, 0.997045f, 0.997038f, 0.997031f, 0.997023f, 0.997016f, 0.997008f,
+ 0.997001f, 0.996994f, 0.996986f, 0.996979f, 0.996971f, 0.996964f, 0.996956f, 0.996949f,
+ 0.996941f, 0.996934f, 0.996926f, 0.996919f, 0.996911f, 0.996904f, 0.996896f, 0.996889f,
+ 0.996881f, 0.996874f, 0.996866f, 0.996858f, 0.996851f, 0.996843f, 0.996836f, 0.996828f,
+ 0.996820f, 0.996813f, 0.996805f, 0.996797f, 0.996790f, 0.996782f, 0.996774f, 0.996767f,
+ 0.996759f, 0.996751f, 0.996743f, 0.996736f, 0.996728f, 0.996720f, 0.996712f, 0.996705f,
+ 0.996697f, 0.996689f, 0.996681f, 0.996674f, 0.996666f, 0.996658f, 0.996650f, 0.996642f,
+ 0.996634f, 0.996626f, 0.996619f, 0.996611f, 0.996603f, 0.996595f, 0.996587f, 0.996579f,
+ 0.996571f, 0.996563f, 0.996555f, 0.996547f, 0.996539f, 0.996531f, 0.996523f, 0.996515f,
+ 0.996507f, 0.996499f, 0.996491f, 0.996483f, 0.996475f, 0.996467f, 0.996459f, 0.996451f,
+ 0.996443f, 0.996435f, 0.996427f, 0.996419f, 0.996411f, 0.996403f, 0.996394f, 0.996386f,
+ 0.996378f, 0.996370f, 0.996362f, 0.996354f, 0.996345f, 0.996337f, 0.996329f, 0.996321f,
+ 0.996313f, 0.996304f, 0.996296f, 0.996288f, 0.996280f, 0.996271f, 0.996263f, 0.996255f,
+ 0.996247f, 0.996238f, 0.996230f, 0.996222f, 0.996213f, 0.996205f, 0.996197f, 0.996188f,
+ 0.996180f, 0.996171f, 0.996163f, 0.996155f, 0.996146f, 0.996138f, 0.996129f, 0.996121f,
+ 0.996113f, 0.996104f, 0.996096f, 0.996087f, 0.996079f, 0.996070f, 0.996062f, 0.996053f,
+ 0.996045f, 0.996036f, 0.996028f, 0.996019f, 0.996011f, 0.996002f, 0.995993f, 0.995985f,
+ 0.995976f, 0.995968f, 0.995959f, 0.995950f, 0.995942f, 0.995933f, 0.995925f, 0.995916f,
+ 0.995907f, 0.995899f, 0.995890f, 0.995881f, 0.995872f, 0.995864f, 0.995855f, 0.995846f,
+ 0.995838f, 0.995829f, 0.995820f, 0.995811f, 0.995803f, 0.995794f, 0.995785f, 0.995776f,
+ 0.995767f, 0.995759f, 0.995750f, 0.995741f, 0.995732f, 0.995723f, 0.995714f, 0.995705f,
+ 0.995697f, 0.995688f, 0.995679f, 0.995670f, 0.995661f, 0.995652f, 0.995643f, 0.995634f,
+ 0.995625f, 0.995616f, 0.995607f, 0.995598f, 0.995589f, 0.995580f, 0.995571f, 0.995562f,
+ 0.995553f, 0.995544f, 0.995535f, 0.995526f, 0.995517f, 0.995508f, 0.995499f, 0.995490f,
+ 0.995481f, 0.995472f, 0.995463f, 0.995453f, 0.995444f, 0.995435f, 0.995426f, 0.995417f,
+ 0.995408f, 0.995398f, 0.995389f, 0.995380f, 0.995371f, 0.995362f, 0.995352f, 0.995343f,
+ 0.995334f, 0.995325f, 0.995315f, 0.995306f, 0.995297f, 0.995288f, 0.995278f, 0.995269f,
+ 0.995260f, 0.995250f, 0.995241f, 0.995232f, 0.995222f, 0.995213f, 0.995203f, 0.995194f,
+ 0.995185f, 0.995175f, 0.995166f, 0.995156f, 0.995147f, 0.995138f, 0.995128f, 0.995119f,
+ 0.995109f, 0.995100f, 0.995090f, 0.995081f, 0.995071f, 0.995062f, 0.995052f, 0.995043f,
+ 0.995033f, 0.995024f, 0.995014f, 0.995005f, 0.994995f, 0.994985f, 0.994976f, 0.994966f,
+ 0.994957f, 0.994947f, 0.994937f, 0.994928f, 0.994918f, 0.994908f, 0.994899f, 0.994889f,
+ 0.994879f, 0.994870f, 0.994860f, 0.994850f, 0.994841f, 0.994831f, 0.994821f, 0.994811f,
+ 0.994802f, 0.994792f, 0.994782f, 0.994772f, 0.994762f, 0.994753f, 0.994743f, 0.994733f,
+ 0.994723f, 0.994713f, 0.994703f, 0.994694f, 0.994684f, 0.994674f, 0.994664f, 0.994654f,
+ 0.994644f, 0.994634f, 0.994624f, 0.994614f, 0.994604f, 0.994594f, 0.994585f, 0.994575f,
+ 0.994565f, 0.994555f, 0.994545f, 0.994535f, 0.994525f, 0.994515f, 0.994505f, 0.994494f,
+ 0.994484f, 0.994474f, 0.994464f, 0.994454f, 0.994444f, 0.994434f, 0.994424f, 0.994414f,
+ 0.994404f, 0.994394f, 0.994383f, 0.994373f, 0.994363f, 0.994353f, 0.994343f, 0.994333f,
+ 0.994322f, 0.994312f, 0.994302f, 0.994292f, 0.994281f, 0.994271f, 0.994261f, 0.994251f,
+ 0.994240f, 0.994230f, 0.994220f, 0.994210f, 0.994199f, 0.994189f, 0.994179f, 0.994168f,
+ 0.994158f, 0.994148f, 0.994137f, 0.994127f, 0.994116f, 0.994106f, 0.994096f, 0.994085f,
+ 0.994075f, 0.994064f, 0.994054f, 0.994044f, 0.994033f, 0.994023f, 0.994012f, 0.994002f,
+ 0.993991f, 0.993981f, 0.993970f, 0.993960f, 0.993949f, 0.993939f, 0.993928f, 0.993918f,
+ 0.993907f, 0.993896f, 0.993886f, 0.993875f, 0.993865f, 0.993854f, 0.993843f, 0.993833f,
+ 0.993822f, 0.993811f, 0.993801f, 0.993790f, 0.993779f, 0.993769f, 0.993758f, 0.993747f,
+ 0.993737f, 0.993726f, 0.993715f, 0.993705f, 0.993694f, 0.993683f, 0.993672f, 0.993662f,
+ 0.993651f, 0.993640f, 0.993629f, 0.993618f, 0.993608f, 0.993597f, 0.993586f, 0.993575f,
+ 0.993564f, 0.993553f, 0.993542f, 0.993532f, 0.993521f, 0.993510f, 0.993499f, 0.993488f,
+ 0.993477f, 0.993466f, 0.993455f, 0.993444f, 0.993433f, 0.993422f, 0.993411f, 0.993400f,
+ 0.993389f, 0.993378f, 0.993367f, 0.993356f, 0.993345f, 0.993334f, 0.993323f, 0.993312f,
+ 0.993301f, 0.993290f, 0.993279f, 0.993268f, 0.993257f, 0.993245f, 0.993234f, 0.993223f,
+ 0.993212f, 0.993201f, 0.993190f, 0.993178f, 0.993167f, 0.993156f, 0.993145f, 0.993134f,
+ 0.993122f, 0.993111f, 0.993100f, 0.993089f, 0.993077f, 0.993066f, 0.993055f, 0.993044f,
+ 0.993032f, 0.993021f, 0.993010f, 0.992998f, 0.992987f, 0.992976f, 0.992964f, 0.992953f,
+ 0.992942f, 0.992930f, 0.992919f, 0.992908f, 0.992896f, 0.992885f, 0.992873f, 0.992862f,
+ 0.992850f, 0.992839f, 0.992828f, 0.992816f, 0.992805f, 0.992793f, 0.992782f, 0.992770f,
+ 0.992759f, 0.992747f, 0.992736f, 0.992724f, 0.992712f, 0.992701f, 0.992689f, 0.992678f,
+ 0.992666f, 0.992655f, 0.992643f, 0.992631f, 0.992620f, 0.992608f, 0.992596f, 0.992585f,
+ 0.992573f, 0.992561f, 0.992550f, 0.992538f, 0.992526f, 0.992515f, 0.992503f, 0.992491f,
+ 0.992480f, 0.992468f, 0.992456f, 0.992444f, 0.992433f, 0.992421f, 0.992409f, 0.992397f,
+ 0.992385f, 0.992374f, 0.992362f, 0.992350f, 0.992338f, 0.992326f, 0.992314f, 0.992302f,
+ 0.992291f, 0.992279f, 0.992267f, 0.992255f, 0.992243f, 0.992231f, 0.992219f, 0.992207f,
+ 0.992195f, 0.992183f, 0.992171f, 0.992159f, 0.992147f, 0.992135f, 0.992123f, 0.992111f,
+ 0.992099f, 0.992087f, 0.992075f, 0.992063f, 0.992051f, 0.992039f, 0.992027f, 0.992015f,
+ 0.992003f, 0.991991f, 0.991979f, 0.991966f, 0.991954f, 0.991942f, 0.991930f, 0.991918f,
+ 0.991906f, 0.991894f, 0.991881f, 0.991869f, 0.991857f, 0.991845f, 0.991832f, 0.991820f,
+ 0.991808f, 0.991796f, 0.991783f, 0.991771f, 0.991759f, 0.991747f, 0.991734f, 0.991722f,
+ 0.991710f, 0.991697f, 0.991685f, 0.991673f, 0.991660f, 0.991648f, 0.991636f, 0.991623f,
+ 0.991611f, 0.991598f, 0.991586f, 0.991574f, 0.991561f, 0.991549f, 0.991536f, 0.991524f,
+ 0.991511f, 0.991499f, 0.991487f, 0.991474f, 0.991462f, 0.991449f, 0.991437f, 0.991424f,
+ 0.991411f, 0.991399f, 0.991386f, 0.991374f, 0.991361f, 0.991349f, 0.991336f, 0.991323f,
+ 0.991311f, 0.991298f, 0.991286f, 0.991273f, 0.991260f, 0.991248f, 0.991235f, 0.991222f,
+ 0.991210f, 0.991197f, 0.991184f, 0.991172f, 0.991159f, 0.991146f, 0.991133f, 0.991121f,
+ 0.991108f, 0.991095f, 0.991082f, 0.991070f, 0.991057f, 0.991044f, 0.991031f, 0.991018f,
+ 0.991006f, 0.990993f, 0.990980f, 0.990967f, 0.990954f, 0.990941f, 0.990928f, 0.990916f,
+ 0.990903f, 0.990890f, 0.990877f, 0.990864f, 0.990851f, 0.990838f, 0.990825f, 0.990812f,
+ 0.990799f, 0.990786f, 0.990773f, 0.990760f, 0.990747f, 0.990734f, 0.990721f, 0.990708f,
+ 0.990695f, 0.990682f, 0.990669f, 0.990656f, 0.990643f, 0.990630f, 0.990617f, 0.990603f,
+ 0.990590f, 0.990577f, 0.990564f, 0.990551f, 0.990538f, 0.990525f, 0.990511f, 0.990498f,
+ 0.990485f, 0.990472f, 0.990459f, 0.990445f, 0.990432f, 0.990419f, 0.990406f, 0.990393f,
+ 0.990379f, 0.990366f, 0.990353f, 0.990339f, 0.990326f, 0.990313f, 0.990299f, 0.990286f,
+ 0.990273f, 0.990259f, 0.990246f, 0.990233f, 0.990219f, 0.990206f, 0.990193f, 0.990179f,
+ 0.990166f, 0.990152f, 0.990139f, 0.990126f, 0.990112f, 0.990099f, 0.990085f, 0.990072f,
+ 0.990058f, 0.990045f, 0.990031f, 0.990018f, 0.990004f, 0.989991f, 0.989977f, 0.989964f,
+ 0.989950f, 0.989936f, 0.989923f, 0.989909f, 0.989896f, 0.989882f, 0.989869f, 0.989855f,
+ 0.989841f, 0.989828f, 0.989814f, 0.989800f, 0.989787f, 0.989773f, 0.989759f, 0.989746f,
+ 0.989732f, 0.989718f, 0.989704f, 0.989691f, 0.989677f, 0.989663f, 0.989650f, 0.989636f,
+ 0.989622f, 0.989608f, 0.989594f, 0.989581f, 0.989567f, 0.989553f, 0.989539f, 0.989525f,
+ 0.989511f, 0.989498f, 0.989484f, 0.989470f, 0.989456f, 0.989442f, 0.989428f, 0.989414f,
+ 0.989400f, 0.989386f, 0.989373f, 0.989359f, 0.989345f, 0.989331f, 0.989317f, 0.989303f,
+ 0.989289f, 0.989275f, 0.989261f, 0.989247f, 0.989233f, 0.989219f, 0.989205f, 0.989191f,
+ 0.989177f, 0.989162f, 0.989148f, 0.989134f, 0.989120f, 0.989106f, 0.989092f, 0.989078f,
+ 0.989064f, 0.989050f, 0.989035f, 0.989021f, 0.989007f, 0.988993f, 0.988979f, 0.988964f,
+ 0.988950f, 0.988936f, 0.988922f, 0.988908f, 0.988893f, 0.988879f, 0.988865f, 0.988851f,
+ 0.988836f, 0.988822f, 0.988808f, 0.988793f, 0.988779f, 0.988765f, 0.988750f, 0.988736f,
+ 0.988722f, 0.988707f, 0.988693f, 0.988679f, 0.988664f, 0.988650f, 0.988635f, 0.988621f,
+ 0.988607f, 0.988592f, 0.988578f, 0.988563f, 0.988549f, 0.988534f, 0.988520f, 0.988505f,
+ 0.988491f, 0.988476f, 0.988462f, 0.988447f, 0.988433f, 0.988418f, 0.988404f, 0.988389f,
+ 0.988374f, 0.988360f, 0.988345f, 0.988331f, 0.988316f, 0.988301f, 0.988287f, 0.988272f,
+ 0.988258f, 0.988243f, 0.988228f, 0.988214f, 0.988199f, 0.988184f, 0.988169f, 0.988155f,
+ 0.988140f, 0.988125f, 0.988111f, 0.988096f, 0.988081f, 0.988066f, 0.988052f, 0.988037f,
+ 0.988022f, 0.988007f, 0.987992f, 0.987978f, 0.987963f, 0.987948f, 0.987933f, 0.987918f,
+ 0.987903f, 0.987889f, 0.987874f, 0.987859f, 0.987844f, 0.987829f, 0.987814f, 0.987799f,
+ 0.987784f, 0.987769f, 0.987754f, 0.987739f, 0.987724f, 0.987709f, 0.987694f, 0.987679f,
+ 0.987664f, 0.987649f, 0.987634f, 0.987619f, 0.987604f, 0.987589f, 0.987574f, 0.987559f,
+ 0.987544f, 0.987529f, 0.987514f, 0.987499f, 0.987484f, 0.987468f, 0.987453f, 0.987438f,
+ 0.987423f, 0.987408f, 0.987393f, 0.987377f, 0.987362f, 0.987347f, 0.987332f, 0.987317f,
+ 0.987301f, 0.987286f, 0.987271f, 0.987256f, 0.987240f, 0.987225f, 0.987210f, 0.987195f,
+ 0.987179f, 0.987164f, 0.987149f, 0.987133f, 0.987118f, 0.987103f, 0.987087f, 0.987072f,
+ 0.987057f, 0.987041f, 0.987026f, 0.987010f, 0.986995f, 0.986980f, 0.986964f, 0.986949f,
+ 0.986933f, 0.986918f, 0.986902f, 0.986887f, 0.986871f, 0.986856f, 0.986840f, 0.986825f,
+ 0.986809f, 0.986794f, 0.986778f, 0.986763f, 0.986747f, 0.986732f, 0.986716f, 0.986701f,
+ 0.986685f, 0.986669f, 0.986654f, 0.986638f, 0.986623f, 0.986607f, 0.986591f, 0.986576f,
+ 0.986560f, 0.986544f, 0.986529f, 0.986513f, 0.986497f, 0.986481f, 0.986466f, 0.986450f,
+ 0.986434f, 0.986419f, 0.986403f, 0.986387f, 0.986371f, 0.986355f, 0.986340f, 0.986324f,
+ 0.986308f, 0.986292f, 0.986276f, 0.986261f, 0.986245f, 0.986229f, 0.986213f, 0.986197f,
+ 0.986181f, 0.986165f, 0.986150f, 0.986134f, 0.986118f, 0.986102f, 0.986086f, 0.986070f,
+ 0.986054f, 0.986038f, 0.986022f, 0.986006f, 0.985990f, 0.985974f, 0.985958f, 0.985942f,
+ 0.985926f, 0.985910f, 0.985894f, 0.985878f, 0.985862f, 0.985846f, 0.985830f, 0.985814f,
+ 0.985798f, 0.985781f, 0.985765f, 0.985749f, 0.985733f, 0.985717f, 0.985701f, 0.985685f,
+ 0.985668f, 0.985652f, 0.985636f, 0.985620f, 0.985604f, 0.985587f, 0.985571f, 0.985555f,
+ 0.985539f, 0.985523f, 0.985506f, 0.985490f, 0.985474f, 0.985457f, 0.985441f, 0.985425f,
+ 0.985408f, 0.985392f, 0.985376f, 0.985359f, 0.985343f, 0.985327f, 0.985310f, 0.985294f,
+ 0.985278f, 0.985261f, 0.985245f, 0.985228f, 0.985212f, 0.985196f, 0.985179f, 0.985163f,
+ 0.985146f, 0.985130f, 0.985113f, 0.985097f, 0.985080f, 0.985064f, 0.985047f, 0.985031f,
+ 0.985014f, 0.984998f, 0.984981f, 0.984965f, 0.984948f, 0.984931f, 0.984915f, 0.984898f,
+ 0.984882f, 0.984865f, 0.984848f, 0.984832f, 0.984815f, 0.984798f, 0.984782f, 0.984765f,
+ 0.984748f, 0.984732f, 0.984715f, 0.984698f, 0.984682f, 0.984665f, 0.984648f, 0.984632f,
+ 0.984615f, 0.984598f, 0.984581f, 0.984564f, 0.984548f, 0.984531f, 0.984514f, 0.984497f,
+ 0.984480f, 0.984464f, 0.984447f, 0.984430f, 0.984413f, 0.984396f, 0.984379f, 0.984362f,
+ 0.984346f, 0.984329f, 0.984312f, 0.984295f, 0.984278f, 0.984261f, 0.984244f, 0.984227f,
+ 0.984210f, 0.984193f, 0.984176f, 0.984159f, 0.984142f, 0.984125f, 0.984108f, 0.984091f,
+ 0.984074f, 0.984057f, 0.984040f, 0.984023f, 0.984006f, 0.983989f, 0.983972f, 0.983955f,
+ 0.983937f, 0.983920f, 0.983903f, 0.983886f, 0.983869f, 0.983852f, 0.983835f, 0.983817f,
+ 0.983800f, 0.983783f, 0.983766f, 0.983749f, 0.983731f, 0.983714f, 0.983697f, 0.983680f,
+ 0.983662f, 0.983645f, 0.983628f, 0.983611f, 0.983593f, 0.983576f, 0.983559f, 0.983541f,
+ 0.983524f, 0.983507f, 0.983489f, 0.983472f, 0.983455f, 0.983437f, 0.983420f, 0.983402f,
+ 0.983385f, 0.983368f, 0.983350f, 0.983333f, 0.983315f, 0.983298f, 0.983281f, 0.983263f,
+ 0.983246f, 0.983228f, 0.983211f, 0.983193f, 0.983176f, 0.983158f, 0.983141f, 0.983123f,
+ 0.983105f, 0.983088f, 0.983070f, 0.983053f, 0.983035f, 0.983018f, 0.983000f, 0.982982f,
+ 0.982965f, 0.982947f, 0.982930f, 0.982912f, 0.982894f, 0.982877f, 0.982859f, 0.982841f,
+ 0.982824f, 0.982806f, 0.982788f, 0.982770f, 0.982753f, 0.982735f, 0.982717f, 0.982699f,
+ 0.982682f, 0.982664f, 0.982646f, 0.982628f, 0.982611f, 0.982593f, 0.982575f, 0.982557f,
+ 0.982539f, 0.982521f, 0.982504f, 0.982486f, 0.982468f, 0.982450f, 0.982432f, 0.982414f,
+ 0.982396f, 0.982378f, 0.982360f, 0.982343f, 0.982325f, 0.982307f, 0.982289f, 0.982271f,
+ 0.982253f, 0.982235f, 0.982217f, 0.982199f, 0.982181f, 0.982163f, 0.982145f, 0.982127f,
+ 0.982109f, 0.982091f, 0.982072f, 0.982054f, 0.982036f, 0.982018f, 0.982000f, 0.981982f,
+ 0.981964f, 0.981946f, 0.981928f, 0.981909f, 0.981891f, 0.981873f, 0.981855f, 0.981837f,
+ 0.981819f, 0.981800f, 0.981782f, 0.981764f, 0.981746f, 0.981727f, 0.981709f, 0.981691f,
+ 0.981673f, 0.981654f, 0.981636f, 0.981618f, 0.981600f, 0.981581f, 0.981563f, 0.981545f,
+ 0.981526f, 0.981508f, 0.981490f, 0.981471f, 0.981453f, 0.981434f, 0.981416f, 0.981398f,
+ 0.981379f, 0.981361f, 0.981342f, 0.981324f, 0.981305f, 0.981287f, 0.981269f, 0.981250f,
+ 0.981232f, 0.981213f, 0.981195f, 0.981176f, 0.981158f, 0.981139f, 0.981120f, 0.981102f,
+ 0.981083f, 0.981065f, 0.981046f, 0.981028f, 0.981009f, 0.980990f, 0.980972f, 0.980953f,
+ 0.980935f, 0.980916f, 0.980897f, 0.980879f, 0.980860f, 0.980841f, 0.980823f, 0.980804f,
+ 0.980785f, 0.980767f, 0.980748f, 0.980729f, 0.980710f, 0.980692f, 0.980673f, 0.980654f,
+ 0.980635f, 0.980617f, 0.980598f, 0.980579f, 0.980560f, 0.980541f, 0.980523f, 0.980504f,
+ 0.980485f, 0.980466f, 0.980447f, 0.980428f, 0.980409f, 0.980390f, 0.980372f, 0.980353f,
+ 0.980334f, 0.980315f, 0.980296f, 0.980277f, 0.980258f, 0.980239f, 0.980220f, 0.980201f,
+ 0.980182f, 0.980163f, 0.980144f, 0.980125f, 0.980106f, 0.980087f, 0.980068f, 0.980049f,
+ 0.980030f, 0.980011f, 0.979992f, 0.979973f, 0.979954f, 0.979934f, 0.979915f, 0.979896f,
+ 0.979877f, 0.979858f, 0.979839f, 0.979820f, 0.979800f, 0.979781f, 0.979762f, 0.979743f,
+ 0.979724f, 0.979704f, 0.979685f, 0.979666f, 0.979647f, 0.979628f, 0.979608f, 0.979589f,
+ 0.979570f, 0.979550f, 0.979531f, 0.979512f, 0.979493f, 0.979473f, 0.979454f, 0.979435f,
+ 0.979415f, 0.979396f, 0.979376f, 0.979357f, 0.979338f, 0.979318f, 0.979299f, 0.979280f,
+ 0.979260f, 0.979241f, 0.979221f, 0.979202f, 0.979182f, 0.979163f, 0.979143f, 0.979124f,
+ 0.979104f, 0.979085f, 0.979065f, 0.979046f, 0.979026f, 0.979007f, 0.978987f, 0.978968f,
+ 0.978948f, 0.978929f, 0.978909f, 0.978889f, 0.978870f, 0.978850f, 0.978831f, 0.978811f,
+ 0.978791f, 0.978772f, 0.978752f, 0.978732f, 0.978713f, 0.978693f, 0.978673f, 0.978654f,
+ 0.978634f, 0.978614f, 0.978594f, 0.978575f, 0.978555f, 0.978535f, 0.978516f, 0.978496f,
+ 0.978476f, 0.978456f, 0.978436f, 0.978417f, 0.978397f, 0.978377f, 0.978357f, 0.978337f,
+ 0.978317f, 0.978298f, 0.978278f, 0.978258f, 0.978238f, 0.978218f, 0.978198f, 0.978178f,
+ 0.978158f, 0.978138f, 0.978118f, 0.978098f, 0.978078f, 0.978058f, 0.978038f, 0.978019f,
+ 0.977998f, 0.977979f, 0.977959f, 0.977938f, 0.977918f, 0.977898f, 0.977878f, 0.977858f,
+ 0.977838f, 0.977818f, 0.977798f, 0.977778f, 0.977758f, 0.977738f, 0.977718f, 0.977697f,
+ 0.977677f, 0.977657f, 0.977637f, 0.977617f, 0.977597f, 0.977577f, 0.977556f, 0.977536f,
+ 0.977516f, 0.977496f, 0.977475f, 0.977455f, 0.977435f, 0.977415f, 0.977394f, 0.977374f,
+ 0.977354f, 0.977334f, 0.977313f, 0.977293f, 0.977273f, 0.977252f, 0.977232f, 0.977212f,
+ 0.977191f, 0.977171f, 0.977151f, 0.977130f, 0.977110f, 0.977089f, 0.977069f, 0.977049f,
+ 0.977028f, 0.977008f, 0.976987f, 0.976967f, 0.976946f, 0.976926f, 0.976905f, 0.976885f,
+ 0.976864f, 0.976844f, 0.976823f, 0.976803f, 0.976782f, 0.976762f, 0.976741f, 0.976721f,
+ 0.976700f, 0.976680f, 0.976659f, 0.976638f, 0.976618f, 0.976597f, 0.976576f, 0.976556f,
+ 0.976535f, 0.976515f, 0.976494f, 0.976473f, 0.976453f, 0.976432f, 0.976411f, 0.976390f,
+ 0.976370f, 0.976349f, 0.976328f, 0.976308f, 0.976287f, 0.976266f, 0.976245f, 0.976224f,
+ 0.976204f, 0.976183f, 0.976162f, 0.976141f, 0.976120f, 0.976100f, 0.976079f, 0.976058f,
+ 0.976037f, 0.976016f, 0.975995f, 0.975974f, 0.975954f, 0.975933f, 0.975912f, 0.975891f,
+ 0.975870f, 0.975849f, 0.975828f, 0.975807f, 0.975786f, 0.975765f, 0.975744f, 0.975723f,
+ 0.975702f, 0.975681f, 0.975660f, 0.975639f, 0.975618f, 0.975597f, 0.975576f, 0.975555f,
+ 0.975534f, 0.975513f, 0.975492f, 0.975471f, 0.975449f, 0.975428f, 0.975407f, 0.975386f,
+ 0.975365f, 0.975344f, 0.975323f, 0.975301f, 0.975280f, 0.975259f, 0.975238f, 0.975217f,
+ 0.975195f, 0.975174f, 0.975153f, 0.975132f, 0.975110f, 0.975089f, 0.975068f, 0.975047f,
+ 0.975025f, 0.975004f, 0.974983f, 0.974961f, 0.974940f, 0.974919f, 0.974897f, 0.974876f,
+ 0.974855f, 0.974833f, 0.974812f, 0.974791f, 0.974769f, 0.974748f, 0.974726f, 0.974705f,
+ 0.974684f, 0.974662f, 0.974641f, 0.974619f, 0.974598f, 0.974576f, 0.974555f, 0.974533f,
+ 0.974512f, 0.974490f, 0.974469f, 0.974447f, 0.974426f, 0.974404f, 0.974383f, 0.974361f,
+ 0.974339f, 0.974318f, 0.974296f, 0.974275f, 0.974253f, 0.974231f, 0.974210f, 0.974188f,
+ 0.974166f, 0.974145f, 0.974123f, 0.974101f, 0.974080f, 0.974058f, 0.974036f, 0.974015f,
+ 0.973993f, 0.973971f, 0.973949f, 0.973928f, 0.973906f, 0.973884f, 0.973862f, 0.973841f,
+ 0.973819f, 0.973797f, 0.973775f, 0.973753f, 0.973732f, 0.973710f, 0.973688f, 0.973666f,
+ 0.973644f, 0.973622f, 0.973601f, 0.973579f, 0.973557f, 0.973535f, 0.973513f, 0.973491f,
+ 0.973469f, 0.973447f, 0.973425f, 0.973403f, 0.973381f, 0.973359f, 0.973337f, 0.973315f,
+ 0.973293f, 0.973271f, 0.973249f, 0.973227f, 0.973205f, 0.973183f, 0.973161f, 0.973139f,
+ 0.973117f, 0.973095f, 0.973073f, 0.973051f, 0.973028f, 0.973006f, 0.972984f, 0.972962f,
+ 0.972940f, 0.972918f, 0.972896f, 0.972873f, 0.972851f, 0.972829f, 0.972807f, 0.972785f,
+ 0.972762f, 0.972740f, 0.972718f, 0.972696f, 0.972673f, 0.972651f, 0.972629f, 0.972607f,
+ 0.972584f, 0.972562f, 0.972540f, 0.972517f, 0.972495f, 0.972473f, 0.972450f, 0.972428f,
+ 0.972406f, 0.972383f, 0.972361f, 0.972339f, 0.972316f, 0.972294f, 0.972271f, 0.972249f,
+ 0.972227f, 0.972204f, 0.972182f, 0.972159f, 0.972137f, 0.972114f, 0.972092f, 0.972069f,
+ 0.972047f, 0.972024f, 0.972002f, 0.971979f, 0.971957f, 0.971934f, 0.971911f, 0.971889f,
+ 0.971866f, 0.971844f, 0.971821f, 0.971799f, 0.971776f, 0.971753f, 0.971731f, 0.971708f,
+ 0.971685f, 0.971663f, 0.971640f, 0.971617f, 0.971595f, 0.971572f, 0.971549f, 0.971527f,
+ 0.971504f, 0.971481f, 0.971458f, 0.971436f, 0.971413f, 0.971390f, 0.971367f, 0.971345f,
+ 0.971322f, 0.971299f, 0.971276f, 0.971253f, 0.971231f, 0.971208f, 0.971185f, 0.971162f,
+ 0.971139f, 0.971116f, 0.971093f, 0.971071f, 0.971048f, 0.971025f, 0.971002f, 0.970979f,
+ 0.970956f, 0.970933f, 0.970910f, 0.970887f, 0.970864f, 0.970841f, 0.970818f, 0.970795f,
+ 0.970772f, 0.970749f, 0.970726f, 0.970703f, 0.970680f, 0.970657f, 0.970634f, 0.970611f,
+ 0.970588f, 0.970565f, 0.970542f, 0.970518f, 0.970495f, 0.970472f, 0.970449f, 0.970426f,
+ 0.970403f, 0.970380f, 0.970357f, 0.970333f, 0.970310f, 0.970287f, 0.970264f, 0.970241f,
+ 0.970217f, 0.970194f, 0.970171f, 0.970148f, 0.970124f, 0.970101f, 0.970078f, 0.970055f,
+ 0.970031f, 0.970008f, 0.969985f, 0.969961f, 0.969938f, 0.969915f, 0.969891f, 0.969868f,
+ 0.969845f, 0.969821f, 0.969798f, 0.969774f, 0.969751f, 0.969728f, 0.969704f, 0.969681f,
+ 0.969657f, 0.969634f, 0.969611f, 0.969587f, 0.969564f, 0.969540f, 0.969517f, 0.969493f,
+ 0.969470f, 0.969446f, 0.969423f, 0.969399f, 0.969375f, 0.969352f, 0.969328f, 0.969305f,
+ 0.969281f, 0.969258f, 0.969234f, 0.969210f, 0.969187f, 0.969163f, 0.969140f, 0.969116f,
+ 0.969092f, 0.969069f, 0.969045f, 0.969021f, 0.968998f, 0.968974f, 0.968950f, 0.968927f,
+ 0.968903f, 0.968879f, 0.968855f, 0.968832f, 0.968808f, 0.968784f, 0.968760f, 0.968737f,
+ 0.968713f, 0.968689f, 0.968665f, 0.968641f, 0.968617f, 0.968594f, 0.968570f, 0.968546f,
+ 0.968522f, 0.968498f, 0.968474f, 0.968450f, 0.968427f, 0.968403f, 0.968379f, 0.968355f,
+ 0.968331f, 0.968307f, 0.968283f, 0.968259f, 0.968235f, 0.968211f, 0.968187f, 0.968163f,
+ 0.968139f, 0.968115f, 0.968091f, 0.968067f, 0.968043f, 0.968019f, 0.967995f, 0.967971f,
+ 0.967947f, 0.967923f, 0.967899f, 0.967874f, 0.967850f, 0.967826f, 0.967802f, 0.967778f,
+ 0.967754f, 0.967730f, 0.967706f, 0.967681f, 0.967657f, 0.967633f, 0.967609f, 0.967585f,
+ 0.967560f, 0.967536f, 0.967512f, 0.967488f, 0.967463f, 0.967439f, 0.967415f, 0.967391f,
+ 0.967366f, 0.967342f, 0.967318f, 0.967293f, 0.967269f, 0.967245f, 0.967220f, 0.967196f,
+ 0.967172f, 0.967147f, 0.967123f, 0.967099f, 0.967074f, 0.967050f, 0.967025f, 0.967001f,
+ 0.966976f, 0.966952f, 0.966928f, 0.966903f, 0.966879f, 0.966854f, 0.966830f, 0.966805f,
+ 0.966781f, 0.966756f, 0.966732f, 0.966707f, 0.966683f, 0.966658f, 0.966633f, 0.966609f,
+ 0.966584f, 0.966560f, 0.966535f, 0.966511f, 0.966486f, 0.966461f, 0.966437f, 0.966412f,
+ 0.966387f, 0.966363f, 0.966338f, 0.966313f, 0.966289f, 0.966264f, 0.966239f, 0.966215f,
+ 0.966190f, 0.966165f, 0.966141f, 0.966116f, 0.966091f, 0.966066f, 0.966042f, 0.966017f,
+ 0.965992f, 0.965967f, 0.965942f, 0.965918f, 0.965893f, 0.965868f, 0.965843f, 0.965818f,
+ 0.965793f, 0.965769f, 0.965744f, 0.965719f, 0.965694f, 0.965669f, 0.965644f, 0.965619f,
+ 0.965594f, 0.965569f, 0.965544f, 0.965519f, 0.965494f, 0.965469f, 0.965444f, 0.965419f,
+ 0.965394f, 0.965369f, 0.965344f, 0.965319f, 0.965294f, 0.965269f, 0.965244f, 0.965219f,
+ 0.965194f, 0.965169f, 0.965144f, 0.965119f, 0.965094f, 0.965069f, 0.965044f, 0.965018f,
+ 0.964993f, 0.964968f, 0.964943f, 0.964918f, 0.964893f, 0.964867f, 0.964842f, 0.964817f,
+ 0.964792f, 0.964767f, 0.964741f, 0.964716f, 0.964691f, 0.964666f, 0.964640f, 0.964615f,
+ 0.964590f, 0.964565f, 0.964539f, 0.964514f, 0.964489f, 0.964463f, 0.964438f, 0.964413f,
+ 0.964387f, 0.964362f, 0.964336f, 0.964311f, 0.964286f, 0.964260f, 0.964235f, 0.964209f,
+ 0.964184f, 0.964159f, 0.964133f, 0.964108f, 0.964082f, 0.964057f, 0.964031f, 0.964006f,
+ 0.963980f, 0.963955f, 0.963929f, 0.963904f, 0.963878f, 0.963853f, 0.963827f, 0.963802f,
+ 0.963776f, 0.963750f, 0.963725f, 0.963699f, 0.963674f, 0.963648f, 0.963623f, 0.963597f,
+ 0.963571f, 0.963546f, 0.963520f, 0.963494f, 0.963469f, 0.963443f, 0.963417f, 0.963391f,
+ 0.963366f, 0.963340f, 0.963314f, 0.963289f, 0.963263f, 0.963237f, 0.963211f, 0.963186f,
+ 0.963160f, 0.963134f, 0.963108f, 0.963082f, 0.963057f, 0.963031f, 0.963005f, 0.962979f,
+ 0.962953f, 0.962927f, 0.962902f, 0.962876f, 0.962850f, 0.962824f, 0.962798f, 0.962772f,
+ 0.962746f, 0.962720f, 0.962694f, 0.962668f, 0.962642f, 0.962616f, 0.962590f, 0.962564f,
+ 0.962538f, 0.962512f, 0.962486f, 0.962460f, 0.962434f, 0.962408f, 0.962382f, 0.962356f,
+ 0.962330f, 0.962304f, 0.962278f, 0.962252f, 0.962226f, 0.962200f, 0.962174f, 0.962148f,
+ 0.962121f, 0.962095f, 0.962069f, 0.962043f, 0.962017f, 0.961991f, 0.961964f, 0.961938f,
+ 0.961912f, 0.961886f, 0.961860f, 0.961833f, 0.961807f, 0.961781f, 0.961755f, 0.961728f,
+ 0.961702f, 0.961676f, 0.961649f, 0.961623f, 0.961597f, 0.961571f, 0.961544f, 0.961518f,
+ 0.961492f, 0.961465f, 0.961439f, 0.961412f, 0.961386f, 0.961360f, 0.961333f, 0.961307f,
+ 0.961280f, 0.961254f, 0.961228f, 0.961201f, 0.961175f, 0.961148f, 0.961122f, 0.961095f,
+ 0.961069f, 0.961042f, 0.961016f, 0.960989f, 0.960963f, 0.960936f, 0.960910f, 0.960883f,
+ 0.960857f, 0.960830f, 0.960804f, 0.960777f, 0.960750f, 0.960724f, 0.960697f, 0.960670f,
+ 0.960644f, 0.960617f, 0.960591f, 0.960564f, 0.960537f, 0.960511f, 0.960484f, 0.960457f,
+ 0.960431f, 0.960404f, 0.960377f, 0.960350f, 0.960324f, 0.960297f, 0.960270f, 0.960243f,
+ 0.960217f, 0.960190f, 0.960163f, 0.960136f, 0.960109f, 0.960083f, 0.960056f, 0.960029f,
+ 0.960002f, 0.959975f, 0.959948f, 0.959922f, 0.959895f, 0.959868f, 0.959841f, 0.959814f,
+ 0.959787f, 0.959760f, 0.959733f, 0.959706f, 0.959679f, 0.959652f, 0.959625f, 0.959598f,
+ 0.959572f, 0.959545f, 0.959518f, 0.959491f, 0.959463f, 0.959436f, 0.959409f, 0.959382f,
+ 0.959355f, 0.959328f, 0.959301f, 0.959274f, 0.959247f, 0.959220f, 0.959193f, 0.959166f,
+ 0.959139f, 0.959112f, 0.959084f, 0.959057f, 0.959030f, 0.959003f, 0.958976f, 0.958949f,
+ 0.958921f, 0.958894f, 0.958867f, 0.958840f, 0.958812f, 0.958785f, 0.958758f, 0.958731f,
+ 0.958703f, 0.958676f, 0.958649f, 0.958622f, 0.958594f, 0.958567f, 0.958540f, 0.958512f,
+ 0.958485f, 0.958458f, 0.958430f, 0.958403f, 0.958376f, 0.958348f, 0.958321f, 0.958293f,
+ 0.958266f, 0.958239f, 0.958211f, 0.958184f, 0.958156f, 0.958129f, 0.958101f, 0.958074f,
+ 0.958046f, 0.958019f, 0.957992f, 0.957964f, 0.957937f, 0.957909f, 0.957882f, 0.957854f,
+ 0.957826f, 0.957799f, 0.957771f, 0.957744f, 0.957716f, 0.957689f, 0.957661f, 0.957633f,
+ 0.957606f, 0.957578f, 0.957550f, 0.957523f, 0.957495f, 0.957468f, 0.957440f, 0.957412f,
+ 0.957385f, 0.957357f, 0.957329f, 0.957301f, 0.957274f, 0.957246f, 0.957218f, 0.957190f,
+ 0.957163f, 0.957135f, 0.957107f, 0.957079f, 0.957052f, 0.957024f, 0.956996f, 0.956968f,
+ 0.956940f, 0.956913f, 0.956885f, 0.956857f, 0.956829f, 0.956801f, 0.956773f, 0.956745f,
+ 0.956717f, 0.956689f, 0.956662f, 0.956634f, 0.956606f, 0.956578f, 0.956550f, 0.956522f,
+ 0.956494f, 0.956466f, 0.956438f, 0.956410f, 0.956382f, 0.956354f, 0.956326f, 0.956298f,
+ 0.956270f, 0.956242f, 0.956214f, 0.956186f, 0.956158f, 0.956130f, 0.956101f, 0.956073f,
+ 0.956045f, 0.956017f, 0.955989f, 0.955961f, 0.955933f, 0.955905f, 0.955876f, 0.955848f,
+ 0.955820f, 0.955792f, 0.955764f, 0.955736f, 0.955707f, 0.955679f, 0.955651f, 0.955623f,
+ 0.955594f, 0.955566f, 0.955538f, 0.955510f, 0.955481f, 0.955453f, 0.955425f, 0.955396f,
+ 0.955368f, 0.955340f, 0.955311f, 0.955283f, 0.955255f, 0.955226f, 0.955198f, 0.955170f,
+ 0.955141f, 0.955113f, 0.955084f, 0.955056f, 0.955028f, 0.954999f, 0.954971f, 0.954942f,
+ 0.954914f, 0.954885f, 0.954857f, 0.954828f, 0.954800f, 0.954771f, 0.954743f, 0.954714f,
+ 0.954686f, 0.954657f, 0.954629f, 0.954600f, 0.954572f, 0.954543f, 0.954514f, 0.954486f,
+ 0.954457f, 0.954429f, 0.954400f, 0.954371f, 0.954343f, 0.954314f, 0.954285f, 0.954257f,
+ 0.954228f, 0.954199f, 0.954171f, 0.954142f, 0.954113f, 0.954085f, 0.954056f, 0.954027f,
+ 0.953998f, 0.953970f, 0.953941f, 0.953912f, 0.953883f, 0.953855f, 0.953826f, 0.953797f,
+ 0.953768f, 0.953739f, 0.953711f, 0.953682f, 0.953653f, 0.953624f, 0.953595f, 0.953566f,
+ 0.953537f, 0.953508f, 0.953480f, 0.953451f, 0.953422f, 0.953393f, 0.953364f, 0.953335f,
+ 0.953306f, 0.953277f, 0.953248f, 0.953219f, 0.953190f, 0.953161f, 0.953132f, 0.953103f,
+ 0.953074f, 0.953045f, 0.953016f, 0.952987f, 0.952958f, 0.952929f, 0.952900f, 0.952871f,
+ 0.952842f, 0.952813f, 0.952783f, 0.952754f, 0.952725f, 0.952696f, 0.952667f, 0.952638f,
+ 0.952609f, 0.952579f, 0.952550f, 0.952521f, 0.952492f, 0.952463f, 0.952433f, 0.952404f,
+ 0.952375f, 0.952346f, 0.952317f, 0.952287f, 0.952258f, 0.952229f, 0.952199f, 0.952170f,
+ 0.952141f, 0.952112f, 0.952082f, 0.952053f, 0.952024f, 0.951994f, 0.951965f, 0.951936f,
+ 0.951906f, 0.951877f, 0.951847f, 0.951818f, 0.951789f, 0.951759f, 0.951730f, 0.951700f,
+ 0.951671f, 0.951641f, 0.951612f, 0.951582f, 0.951553f, 0.951524f, 0.951494f, 0.951465f,
+ 0.951435f, 0.951406f, 0.951376f, 0.951346f, 0.951317f, 0.951287f, 0.951258f, 0.951228f,
+ 0.951199f, 0.951169f, 0.951139f, 0.951110f, 0.951080f, 0.951051f, 0.951021f, 0.950991f,
+ 0.950962f, 0.950932f, 0.950902f, 0.950873f, 0.950843f, 0.950813f, 0.950784f, 0.950754f,
+ 0.950724f, 0.950694f, 0.950665f, 0.950635f, 0.950605f, 0.950575f, 0.950546f, 0.950516f,
+ 0.950486f, 0.950456f, 0.950426f, 0.950397f, 0.950367f, 0.950337f, 0.950307f, 0.950277f,
+ 0.950247f, 0.950218f, 0.950188f, 0.950158f, 0.950128f, 0.950098f, 0.950068f, 0.950038f,
+ 0.950008f, 0.949978f, 0.949948f, 0.949918f, 0.949888f, 0.949858f, 0.949829f, 0.949798f,
+ 0.949768f, 0.949739f, 0.949708f, 0.949678f, 0.949648f, 0.949618f, 0.949588f, 0.949558f,
+ 0.949528f, 0.949498f, 0.949468f, 0.949438f, 0.949408f, 0.949378f, 0.949348f, 0.949317f,
+ 0.949287f, 0.949257f, 0.949227f, 0.949197f, 0.949167f, 0.949136f, 0.949106f, 0.949076f,
+ 0.949046f, 0.949016f, 0.948985f, 0.948955f, 0.948925f, 0.948895f, 0.948864f, 0.948834f,
+ 0.948804f, 0.948774f, 0.948743f, 0.948713f, 0.948683f, 0.948652f, 0.948622f, 0.948592f,
+ 0.948561f, 0.948531f, 0.948501f, 0.948470f, 0.948440f, 0.948409f, 0.948379f, 0.948349f,
+ 0.948318f, 0.948288f, 0.948257f, 0.948227f, 0.948196f, 0.948166f, 0.948136f, 0.948105f,
+ 0.948075f, 0.948044f, 0.948014f, 0.947983f, 0.947953f, 0.947922f, 0.947891f, 0.947861f,
+ 0.947830f, 0.947800f, 0.947769f, 0.947739f, 0.947708f, 0.947677f, 0.947647f, 0.947616f,
+ 0.947586f, 0.947555f, 0.947524f, 0.947494f, 0.947463f, 0.947432f, 0.947402f, 0.947371f,
+ 0.947340f, 0.947310f, 0.947279f, 0.947248f, 0.947217f, 0.947187f, 0.947156f, 0.947125f,
+ 0.947094f, 0.947064f, 0.947033f, 0.947002f, 0.946971f, 0.946940f, 0.946910f, 0.946879f,
+ 0.946848f, 0.946817f, 0.946786f, 0.946755f, 0.946724f, 0.946694f, 0.946663f, 0.946632f,
+ 0.946601f, 0.946570f, 0.946539f, 0.946508f, 0.946477f, 0.946446f, 0.946415f, 0.946384f,
+ 0.946353f, 0.946322f, 0.946291f, 0.946260f, 0.946229f, 0.946198f, 0.946167f, 0.946136f,
+ 0.946105f, 0.946074f, 0.946043f, 0.946012f, 0.945981f, 0.945950f, 0.945919f, 0.945888f,
+ 0.945857f, 0.945825f, 0.945794f, 0.945763f, 0.945732f, 0.945701f, 0.945670f, 0.945639f,
+ 0.945607f, 0.945576f, 0.945545f, 0.945514f, 0.945482f, 0.945451f, 0.945420f, 0.945389f,
+ 0.945358f, 0.945326f, 0.945295f, 0.945264f, 0.945232f, 0.945201f, 0.945170f, 0.945139f,
+ 0.945107f, 0.945076f, 0.945045f, 0.945013f, 0.944982f, 0.944950f, 0.944919f, 0.944888f,
+ 0.944856f, 0.944825f, 0.944793f, 0.944762f, 0.944731f, 0.944699f, 0.944668f, 0.944636f,
+ 0.944605f, 0.944573f, 0.944542f, 0.944510f, 0.944479f, 0.944447f, 0.944416f, 0.944384f,
+ 0.944353f, 0.944321f, 0.944290f, 0.944258f, 0.944227f, 0.944195f, 0.944163f, 0.944132f,
+ 0.944100f, 0.944069f, 0.944037f, 0.944005f, 0.943974f, 0.943942f, 0.943910f, 0.943879f,
+ 0.943847f, 0.943815f, 0.943784f, 0.943752f, 0.943720f, 0.943689f, 0.943657f, 0.943625f,
+ 0.943593f, 0.943562f, 0.943530f, 0.943498f, 0.943466f, 0.943435f, 0.943403f, 0.943371f,
+ 0.943339f, 0.943307f, 0.943276f, 0.943244f, 0.943212f, 0.943180f, 0.943148f, 0.943116f,
+ 0.943084f, 0.943053f, 0.943021f, 0.942989f, 0.942957f, 0.942925f, 0.942893f, 0.942861f,
+ 0.942829f, 0.942797f, 0.942765f, 0.942733f, 0.942701f, 0.942669f, 0.942637f, 0.942605f,
+ 0.942573f, 0.942541f, 0.942509f, 0.942477f, 0.942445f, 0.942413f, 0.942381f, 0.942349f,
+ 0.942317f, 0.942285f, 0.942253f, 0.942220f, 0.942188f, 0.942156f, 0.942124f, 0.942092f,
+ 0.942060f, 0.942028f, 0.941995f, 0.941963f, 0.941931f, 0.941899f, 0.941867f, 0.941834f,
+ 0.941802f, 0.941770f, 0.941738f, 0.941705f, 0.941673f, 0.941641f, 0.941609f, 0.941576f,
+ 0.941544f, 0.941512f, 0.941479f, 0.941447f, 0.941415f, 0.941382f, 0.941350f, 0.941318f,
+ 0.941285f, 0.941253f, 0.941221f, 0.941188f, 0.941156f, 0.941123f, 0.941091f, 0.941059f,
+ 0.941026f, 0.940994f, 0.940961f, 0.940929f, 0.940896f, 0.940864f, 0.940831f, 0.940799f,
+ 0.940766f, 0.940734f, 0.940701f, 0.940669f, 0.940636f, 0.940604f, 0.940571f, 0.940539f,
+ 0.940506f, 0.940473f, 0.940441f, 0.940408f, 0.940376f, 0.940343f, 0.940310f, 0.940278f,
+ 0.940245f, 0.940213f, 0.940180f, 0.940147f, 0.940115f, 0.940082f, 0.940049f, 0.940016f,
+ 0.939984f, 0.939951f, 0.939918f, 0.939886f, 0.939853f, 0.939820f, 0.939787f, 0.939755f,
+ 0.939722f, 0.939689f, 0.939656f, 0.939623f, 0.939591f, 0.939558f, 0.939525f, 0.939492f,
+ 0.939459f, 0.939426f, 0.939394f, 0.939361f, 0.939328f, 0.939295f, 0.939262f, 0.939229f,
+ 0.939196f, 0.939163f, 0.939130f, 0.939097f, 0.939064f, 0.939031f, 0.938998f, 0.938965f,
+ 0.938932f, 0.938900f, 0.938866f, 0.938833f, 0.938800f, 0.938767f, 0.938734f, 0.938701f,
+ 0.938668f, 0.938635f, 0.938602f, 0.938569f, 0.938536f, 0.938503f, 0.938470f, 0.938437f,
+ 0.938404f, 0.938370f, 0.938337f, 0.938304f, 0.938271f, 0.938238f, 0.938205f, 0.938171f,
+ 0.938138f, 0.938105f, 0.938072f, 0.938039f, 0.938005f, 0.937972f, 0.937939f, 0.937906f,
+ 0.937872f, 0.937839f, 0.937806f, 0.937773f, 0.937739f, 0.937706f, 0.937673f, 0.937639f,
+ 0.937606f, 0.937573f, 0.937539f, 0.937506f, 0.937473f, 0.937439f, 0.937406f, 0.937372f,
+ 0.937339f, 0.937306f, 0.937272f, 0.937239f, 0.937205f, 0.937172f, 0.937138f, 0.937105f,
+ 0.937072f, 0.937038f, 0.937005f, 0.936971f, 0.936938f, 0.936904f, 0.936871f, 0.936837f,
+ 0.936803f, 0.936770f, 0.936736f, 0.936703f, 0.936669f, 0.936636f, 0.936602f, 0.936568f,
+ 0.936535f, 0.936501f, 0.936468f, 0.936434f, 0.936400f, 0.936367f, 0.936333f, 0.936299f,
+ 0.936266f, 0.936232f, 0.936198f, 0.936165f, 0.936131f, 0.936097f, 0.936063f, 0.936030f,
+ 0.935996f, 0.935962f, 0.935928f, 0.935895f, 0.935861f, 0.935827f, 0.935793f, 0.935759f,
+ 0.935726f, 0.935692f, 0.935658f, 0.935624f, 0.935590f, 0.935556f, 0.935523f, 0.935489f,
+ 0.935455f, 0.935421f, 0.935387f, 0.935353f, 0.935319f, 0.935285f, 0.935251f, 0.935217f,
+ 0.935184f, 0.935150f, 0.935116f, 0.935082f, 0.935048f, 0.935014f, 0.934980f, 0.934946f,
+ 0.934912f, 0.934878f, 0.934844f, 0.934810f, 0.934775f, 0.934741f, 0.934707f, 0.934673f,
+ 0.934639f, 0.934605f, 0.934571f, 0.934537f, 0.934503f, 0.934469f, 0.934434f, 0.934400f,
+ 0.934366f, 0.934332f, 0.934298f, 0.934264f, 0.934229f, 0.934195f, 0.934161f, 0.934127f,
+ 0.934093f, 0.934058f, 0.934024f, 0.933990f, 0.933956f, 0.933921f, 0.933887f, 0.933853f,
+ 0.933818f, 0.933784f, 0.933750f, 0.933716f, 0.933681f, 0.933647f, 0.933612f, 0.933578f,
+ 0.933544f, 0.933509f, 0.933475f, 0.933441f, 0.933406f, 0.933372f, 0.933337f, 0.933303f,
+ 0.933269f, 0.933234f, 0.933200f, 0.933165f, 0.933131f, 0.933096f, 0.933062f, 0.933027f,
+ 0.932993f, 0.932958f, 0.932924f, 0.932889f, 0.932855f, 0.932820f, 0.932786f, 0.932751f,
+ 0.932716f, 0.932682f, 0.932647f, 0.932613f, 0.932578f, 0.932544f, 0.932509f, 0.932474f,
+ 0.932440f, 0.932405f, 0.932370f, 0.932336f, 0.932301f, 0.932266f, 0.932232f, 0.932197f,
+ 0.932162f, 0.932128f, 0.932093f, 0.932058f, 0.932023f, 0.931989f, 0.931954f, 0.931919f,
+ 0.931884f, 0.931849f, 0.931815f, 0.931780f, 0.931745f, 0.931710f, 0.931675f, 0.931641f,
+ 0.931606f, 0.931571f, 0.931536f, 0.931501f, 0.931466f, 0.931431f, 0.931397f, 0.931362f,
+ 0.931327f, 0.931292f, 0.931257f, 0.931222f, 0.931187f, 0.931152f, 0.931117f, 0.931082f,
+ 0.931047f, 0.931012f, 0.930977f, 0.930942f, 0.930907f, 0.930872f, 0.930837f, 0.930802f,
+ 0.930767f, 0.930732f, 0.930697f, 0.930662f, 0.930627f, 0.930592f, 0.930556f, 0.930521f,
+ 0.930486f, 0.930451f, 0.930416f, 0.930381f, 0.930346f, 0.930311f, 0.930275f, 0.930240f,
+ 0.930205f, 0.930170f, 0.930135f, 0.930099f, 0.930064f, 0.930029f, 0.929994f, 0.929958f,
+ 0.929923f, 0.929888f, 0.929853f, 0.929817f, 0.929782f, 0.929747f, 0.929712f, 0.929676f,
+ 0.929641f, 0.929606f, 0.929570f, 0.929535f, 0.929500f, 0.929464f, 0.929429f, 0.929393f,
+ 0.929358f, 0.929323f, 0.929287f, 0.929252f, 0.929216f, 0.929181f, 0.929146f, 0.929110f,
+ 0.929075f, 0.929039f, 0.929004f, 0.928968f, 0.928933f, 0.928897f, 0.928862f, 0.928826f,
+ 0.928791f, 0.928755f, 0.928720f, 0.928684f, 0.928648f, 0.928613f, 0.928577f, 0.928542f,
+ 0.928506f, 0.928470f, 0.928435f, 0.928399f, 0.928364f, 0.928328f, 0.928292f, 0.928257f,
+ 0.928221f, 0.928185f, 0.928150f, 0.928114f, 0.928078f, 0.928043f, 0.928007f, 0.927971f,
+ 0.927935f, 0.927900f, 0.927864f, 0.927828f, 0.927792f, 0.927757f, 0.927721f, 0.927685f,
+ 0.927649f, 0.927613f, 0.927578f, 0.927542f, 0.927506f, 0.927470f, 0.927434f, 0.927398f,
+ 0.927363f, 0.927327f, 0.927291f, 0.927255f, 0.927219f, 0.927183f, 0.927147f, 0.927111f,
+ 0.927075f, 0.927039f, 0.927003f, 0.926967f, 0.926931f, 0.926895f, 0.926859f, 0.926823f,
+ 0.926787f, 0.926751f, 0.926715f, 0.926679f, 0.926643f, 0.926607f, 0.926571f, 0.926535f,
+ 0.926499f, 0.926463f, 0.926427f, 0.926391f, 0.926355f, 0.926319f, 0.926283f, 0.926246f,
+ 0.926210f, 0.926174f, 0.926138f, 0.926102f, 0.926066f, 0.926029f, 0.925993f, 0.925957f,
+ 0.925921f, 0.925885f, 0.925848f, 0.925812f, 0.925776f, 0.925740f, 0.925703f, 0.925667f,
+ 0.925631f, 0.925595f, 0.925558f, 0.925522f, 0.925486f, 0.925449f, 0.925413f, 0.925377f,
+ 0.925340f, 0.925304f, 0.925268f, 0.925231f, 0.925195f, 0.925158f, 0.925122f, 0.925086f,
+ 0.925049f, 0.925013f, 0.924976f, 0.924940f, 0.924904f, 0.924867f, 0.924831f, 0.924794f,
+ 0.924758f, 0.924721f, 0.924685f, 0.924648f, 0.924612f, 0.924575f, 0.924539f, 0.924502f,
+ 0.924465f, 0.924429f, 0.924392f, 0.924356f, 0.924319f, 0.924283f, 0.924246f, 0.924209f,
+ 0.924173f, 0.924136f, 0.924100f, 0.924063f, 0.924026f, 0.923990f, 0.923953f, 0.923916f,
+ 0.923880f, 0.923843f, 0.923806f, 0.923769f, 0.923733f, 0.923696f, 0.923659f, 0.923622f,
+ 0.923586f, 0.923549f, 0.923512f, 0.923475f, 0.923439f, 0.923402f, 0.923365f, 0.923328f,
+ 0.923291f, 0.923255f, 0.923218f, 0.923181f, 0.923144f, 0.923107f, 0.923070f, 0.923033f,
+ 0.922997f, 0.922960f, 0.922923f, 0.922886f, 0.922849f, 0.922812f, 0.922775f, 0.922738f,
+ 0.922701f, 0.922664f, 0.922627f, 0.922590f, 0.922553f, 0.922516f, 0.922479f, 0.922442f,
+ 0.922405f, 0.922368f, 0.922331f, 0.922294f, 0.922257f, 0.922220f, 0.922183f, 0.922146f,
+ 0.922109f, 0.922072f, 0.922034f, 0.921997f, 0.921960f, 0.921923f, 0.921886f, 0.921849f,
+ 0.921812f, 0.921774f, 0.921737f, 0.921700f, 0.921663f, 0.921626f, 0.921588f, 0.921551f,
+ 0.921514f, 0.921477f, 0.921440f, 0.921402f, 0.921365f, 0.921328f, 0.921291f, 0.921253f,
+ 0.921216f, 0.921179f, 0.921141f, 0.921104f, 0.921067f, 0.921029f, 0.920992f, 0.920955f,
+ 0.920917f, 0.920880f, 0.920842f, 0.920805f, 0.920768f, 0.920730f, 0.920693f, 0.920655f,
+ 0.920618f, 0.920581f, 0.920543f, 0.920506f, 0.920468f, 0.920431f, 0.920393f, 0.920356f,
+ 0.920318f, 0.920281f, 0.920243f, 0.920206f, 0.920168f, 0.920131f, 0.920093f, 0.920056f,
+ 0.920018f, 0.919980f, 0.919943f, 0.919905f, 0.919868f, 0.919830f, 0.919792f, 0.919755f,
+ 0.919717f, 0.919680f, 0.919642f, 0.919604f, 0.919567f, 0.919529f, 0.919491f, 0.919453f,
+ 0.919416f, 0.919378f, 0.919340f, 0.919303f, 0.919265f, 0.919227f, 0.919189f, 0.919152f,
+ 0.919114f, 0.919076f, 0.919038f, 0.919001f, 0.918963f, 0.918925f, 0.918887f, 0.918849f,
+ 0.918811f, 0.918774f, 0.918736f, 0.918698f, 0.918660f, 0.918622f, 0.918584f, 0.918546f,
+ 0.918508f, 0.918471f, 0.918433f, 0.918395f, 0.918357f, 0.918319f, 0.918281f, 0.918243f,
+ 0.918205f, 0.918167f, 0.918129f, 0.918091f, 0.918053f, 0.918015f, 0.917977f, 0.917939f,
+ 0.917901f, 0.917863f, 0.917825f, 0.917787f, 0.917749f, 0.917710f, 0.917672f, 0.917634f,
+ 0.917596f, 0.917558f, 0.917520f, 0.917482f, 0.917444f, 0.917405f, 0.917367f, 0.917329f,
+ 0.917291f, 0.917253f, 0.917215f, 0.917176f, 0.917138f, 0.917100f, 0.917062f, 0.917024f,
+ 0.916985f, 0.916947f, 0.916909f, 0.916871f, 0.916832f, 0.916794f, 0.916756f, 0.916717f,
+ 0.916679f, 0.916641f, 0.916602f, 0.916564f, 0.916526f, 0.916487f, 0.916449f, 0.916411f,
+ 0.916372f, 0.916334f, 0.916296f, 0.916257f, 0.916219f, 0.916180f, 0.916142f, 0.916103f,
+ 0.916065f, 0.916027f, 0.915988f, 0.915950f, 0.915911f, 0.915873f, 0.915834f, 0.915796f,
+ 0.915757f, 0.915719f, 0.915680f, 0.915642f, 0.915603f, 0.915564f, 0.915526f, 0.915487f,
+ 0.915449f, 0.915410f, 0.915372f, 0.915333f, 0.915294f, 0.915256f, 0.915217f, 0.915178f,
+ 0.915140f, 0.915101f, 0.915062f, 0.915024f, 0.914985f, 0.914946f, 0.914908f, 0.914869f,
+ 0.914830f, 0.914792f, 0.914753f, 0.914714f, 0.914675f, 0.914637f, 0.914598f, 0.914559f,
+ 0.914520f, 0.914482f, 0.914443f, 0.914404f, 0.914365f, 0.914326f, 0.914287f, 0.914249f,
+ 0.914210f, 0.914171f, 0.914132f, 0.914093f, 0.914054f, 0.914015f, 0.913976f, 0.913938f,
+ 0.913899f, 0.913860f, 0.913821f, 0.913782f, 0.913743f, 0.913704f, 0.913665f, 0.913626f,
+ 0.913587f, 0.913548f, 0.913509f, 0.913470f, 0.913431f, 0.913392f, 0.913353f, 0.913314f,
+ 0.913275f, 0.913236f, 0.913197f, 0.913158f, 0.913119f, 0.913080f, 0.913040f, 0.913001f,
+ 0.912962f, 0.912923f, 0.912884f, 0.912845f, 0.912806f, 0.912766f, 0.912727f, 0.912688f,
+ 0.912649f, 0.912610f, 0.912571f, 0.912531f, 0.912492f, 0.912453f, 0.912414f, 0.912374f,
+ 0.912335f, 0.912296f, 0.912257f, 0.912217f, 0.912178f, 0.912139f, 0.912099f, 0.912060f,
+ 0.912021f, 0.911982f, 0.911942f, 0.911903f, 0.911864f, 0.911824f, 0.911785f, 0.911745f,
+ 0.911706f, 0.911667f, 0.911627f, 0.911588f, 0.911548f, 0.911509f, 0.911470f, 0.911430f,
+ 0.911391f, 0.911351f, 0.911312f, 0.911272f, 0.911233f, 0.911193f, 0.911154f, 0.911114f,
+ 0.911075f, 0.911035f, 0.910996f, 0.910956f, 0.910917f, 0.910877f, 0.910837f, 0.910798f,
+ 0.910758f, 0.910719f, 0.910679f, 0.910639f, 0.910600f, 0.910560f, 0.910521f, 0.910481f,
+ 0.910441f, 0.910402f, 0.910362f, 0.910322f, 0.910283f, 0.910243f, 0.910203f, 0.910163f,
+ 0.910124f, 0.910084f, 0.910044f, 0.910005f, 0.909965f, 0.909925f, 0.909885f, 0.909845f,
+ 0.909806f, 0.909766f, 0.909726f, 0.909686f, 0.909646f, 0.909607f, 0.909567f, 0.909527f,
+ 0.909487f, 0.909447f, 0.909407f, 0.909368f, 0.909328f, 0.909288f, 0.909248f, 0.909208f,
+ 0.909168f, 0.909128f, 0.909088f, 0.909048f, 0.909008f, 0.908968f, 0.908928f, 0.908888f,
+ 0.908848f, 0.908808f, 0.908768f, 0.908728f, 0.908688f, 0.908648f, 0.908608f, 0.908568f,
+ 0.908528f, 0.908488f, 0.908448f, 0.908408f, 0.908368f, 0.908328f, 0.908288f, 0.908248f,
+ 0.908207f, 0.908167f, 0.908127f, 0.908087f, 0.908047f, 0.908007f, 0.907966f, 0.907926f,
+ 0.907886f, 0.907846f, 0.907806f, 0.907766f, 0.907725f, 0.907685f, 0.907645f, 0.907605f,
+ 0.907564f, 0.907524f, 0.907484f, 0.907444f, 0.907403f, 0.907363f, 0.907323f, 0.907282f,
+ 0.907242f, 0.907202f, 0.907161f, 0.907121f, 0.907081f, 0.907040f, 0.907000f, 0.906959f,
+ 0.906919f, 0.906879f, 0.906838f, 0.906798f, 0.906757f, 0.906717f, 0.906677f, 0.906636f,
+ 0.906596f, 0.906555f, 0.906515f, 0.906474f, 0.906434f, 0.906393f, 0.906353f, 0.906312f,
+ 0.906272f, 0.906231f, 0.906191f, 0.906150f, 0.906110f, 0.906069f, 0.906028f, 0.905988f,
+ 0.905947f, 0.905907f, 0.905866f, 0.905825f, 0.905785f, 0.905744f, 0.905704f, 0.905663f,
+ 0.905622f, 0.905582f, 0.905541f, 0.905500f, 0.905460f, 0.905419f, 0.905378f, 0.905337f,
+ 0.905297f, 0.905256f, 0.905215f, 0.905175f, 0.905134f, 0.905093f, 0.905052f, 0.905011f,
+ 0.904971f, 0.904930f, 0.904889f, 0.904848f, 0.904807f, 0.904767f, 0.904726f, 0.904685f,
+ 0.904644f, 0.904603f, 0.904562f, 0.904521f, 0.904481f, 0.904440f, 0.904399f, 0.904358f,
+ 0.904317f, 0.904276f, 0.904235f, 0.904194f, 0.904153f, 0.904112f, 0.904071f, 0.904030f,
+ 0.903989f, 0.903948f, 0.903907f, 0.903866f, 0.903825f, 0.903784f, 0.903743f, 0.903702f,
+ 0.903661f, 0.903620f, 0.903579f, 0.903538f, 0.903497f, 0.903456f, 0.903415f, 0.903373f,
+ 0.903332f, 0.903291f, 0.903250f, 0.903209f, 0.903168f, 0.903127f, 0.903085f, 0.903044f,
+ 0.903003f, 0.902962f, 0.902921f, 0.902879f, 0.902838f, 0.902797f, 0.902756f, 0.902715f,
+ 0.902673f, 0.902632f, 0.902591f, 0.902550f, 0.902508f, 0.902467f, 0.902426f, 0.902384f,
+ 0.902343f, 0.902302f, 0.902260f, 0.902219f, 0.902178f, 0.902136f, 0.902095f, 0.902054f,
+ 0.902012f, 0.901971f, 0.901929f, 0.901888f, 0.901847f, 0.901805f, 0.901764f, 0.901722f,
+ 0.901681f, 0.901639f, 0.901598f, 0.901556f, 0.901515f, 0.901473f, 0.901432f, 0.901390f,
+ 0.901349f, 0.901307f, 0.901266f, 0.901224f, 0.901183f, 0.901141f, 0.901100f, 0.901058f,
+ 0.901016f, 0.900975f, 0.900933f, 0.900892f, 0.900850f, 0.900808f, 0.900767f, 0.900725f,
+ 0.900683f, 0.900642f, 0.900600f, 0.900558f, 0.900517f, 0.900475f, 0.900433f, 0.900392f,
+ 0.900350f, 0.900308f, 0.900266f, 0.900225f, 0.900183f, 0.900141f, 0.900099f, 0.900058f,
+ 0.900016f, 0.899974f, 0.899932f, 0.899890f, 0.899849f, 0.899807f, 0.899765f, 0.899723f,
+ 0.899681f, 0.899639f, 0.899598f, 0.899556f, 0.899514f, 0.899472f, 0.899430f, 0.899388f,
+ 0.899346f, 0.899304f, 0.899262f, 0.899220f, 0.899179f, 0.899137f, 0.899095f, 0.899053f,
+ 0.899011f, 0.898969f, 0.898927f, 0.898885f, 0.898843f, 0.898801f, 0.898759f, 0.898717f,
+ 0.898674f, 0.898632f, 0.898590f, 0.898548f, 0.898506f, 0.898464f, 0.898422f, 0.898380f,
+ 0.898338f, 0.898296f, 0.898254f, 0.898211f, 0.898169f, 0.898127f, 0.898085f, 0.898043f,
+ 0.898001f, 0.897958f, 0.897916f, 0.897874f, 0.897832f, 0.897790f, 0.897747f, 0.897705f,
+ 0.897663f, 0.897621f, 0.897578f, 0.897536f, 0.897494f, 0.897452f, 0.897409f, 0.897367f,
+ 0.897325f, 0.897282f, 0.897240f, 0.897198f, 0.897155f, 0.897113f, 0.897071f, 0.897028f,
+ 0.896986f, 0.896943f, 0.896901f, 0.896859f, 0.896816f, 0.896774f, 0.896731f, 0.896689f,
+ 0.896646f, 0.896604f, 0.896562f, 0.896519f, 0.896477f, 0.896434f, 0.896392f, 0.896349f,
+ 0.896307f, 0.896264f, 0.896222f, 0.896179f, 0.896137f, 0.896094f, 0.896051f, 0.896009f,
+ 0.895966f, 0.895924f, 0.895881f, 0.895838f, 0.895796f, 0.895753f, 0.895711f, 0.895668f,
+ 0.895625f, 0.895583f, 0.895540f, 0.895497f, 0.895455f, 0.895412f, 0.895369f, 0.895327f,
+ 0.895284f, 0.895241f, 0.895198f, 0.895156f, 0.895113f, 0.895070f, 0.895028f, 0.894985f,
+ 0.894942f, 0.894899f, 0.894856f, 0.894814f, 0.894771f, 0.894728f, 0.894685f, 0.894642f,
+ 0.894599f, 0.894557f, 0.894514f, 0.894471f, 0.894428f, 0.894385f, 0.894342f, 0.894299f,
+ 0.894256f, 0.894214f, 0.894171f, 0.894128f, 0.894085f, 0.894042f, 0.893999f, 0.893956f,
+ 0.893913f, 0.893870f, 0.893827f, 0.893784f, 0.893741f, 0.893698f, 0.893655f, 0.893612f,
+ 0.893569f, 0.893526f, 0.893483f, 0.893440f, 0.893397f, 0.893354f, 0.893310f, 0.893267f,
+ 0.893224f, 0.893181f, 0.893138f, 0.893095f, 0.893052f, 0.893009f, 0.892965f, 0.892922f,
+ 0.892879f, 0.892836f, 0.892793f, 0.892750f, 0.892706f, 0.892663f, 0.892620f, 0.892577f,
+ 0.892534f, 0.892490f, 0.892447f, 0.892404f, 0.892361f, 0.892317f, 0.892274f, 0.892231f,
+ 0.892187f, 0.892144f, 0.892101f, 0.892057f, 0.892014f, 0.891971f, 0.891927f, 0.891884f,
+ 0.891841f, 0.891797f, 0.891754f, 0.891711f, 0.891667f, 0.891624f, 0.891580f, 0.891537f,
+ 0.891493f, 0.891450f, 0.891407f, 0.891363f, 0.891320f, 0.891276f, 0.891233f, 0.891189f,
+ 0.891146f, 0.891102f, 0.891059f, 0.891015f, 0.890972f, 0.890928f, 0.890885f, 0.890841f,
+ 0.890797f, 0.890754f, 0.890710f, 0.890667f, 0.890623f, 0.890580f, 0.890536f, 0.890492f,
+ 0.890449f, 0.890405f, 0.890361f, 0.890318f, 0.890274f, 0.890230f, 0.890187f, 0.890143f,
+ 0.890099f, 0.890056f, 0.890012f, 0.889968f, 0.889925f, 0.889881f, 0.889837f, 0.889793f,
+ 0.889750f, 0.889706f, 0.889662f, 0.889618f, 0.889574f, 0.889531f, 0.889487f, 0.889443f,
+ 0.889399f, 0.889355f, 0.889312f, 0.889268f, 0.889224f, 0.889180f, 0.889136f, 0.889092f,
+ 0.889048f, 0.889004f, 0.888961f, 0.888917f, 0.888873f, 0.888829f, 0.888785f, 0.888741f,
+ 0.888697f, 0.888653f, 0.888609f, 0.888565f, 0.888521f, 0.888477f, 0.888433f, 0.888389f,
+ 0.888345f, 0.888301f, 0.888257f, 0.888213f, 0.888169f, 0.888125f, 0.888081f, 0.888037f,
+ 0.887993f, 0.887949f, 0.887904f, 0.887860f, 0.887816f, 0.887772f, 0.887728f, 0.887684f,
+ 0.887640f, 0.887595f, 0.887551f, 0.887507f, 0.887463f, 0.887419f, 0.887375f, 0.887330f,
+ 0.887286f, 0.887242f, 0.887198f, 0.887153f, 0.887109f, 0.887065f, 0.887021f, 0.886976f,
+ 0.886932f, 0.886888f, 0.886844f, 0.886799f, 0.886755f, 0.886711f, 0.886666f, 0.886622f,
+ 0.886578f, 0.886533f, 0.886489f, 0.886445f, 0.886400f, 0.886356f, 0.886311f, 0.886267f,
+ 0.886223f, 0.886178f, 0.886134f, 0.886089f, 0.886045f, 0.886000f, 0.885956f, 0.885911f,
+ 0.885867f, 0.885822f, 0.885778f, 0.885733f, 0.885689f, 0.885644f, 0.885600f, 0.885555f,
+ 0.885511f, 0.885466f, 0.885422f, 0.885377f, 0.885333f, 0.885288f, 0.885243f, 0.885199f,
+ 0.885154f, 0.885110f, 0.885065f, 0.885020f, 0.884976f, 0.884931f, 0.884886f, 0.884842f,
+ 0.884797f, 0.884752f, 0.884708f, 0.884663f, 0.884618f, 0.884574f, 0.884529f, 0.884484f,
+ 0.884439f, 0.884395f, 0.884350f, 0.884305f, 0.884260f, 0.884216f, 0.884171f, 0.884126f,
+ 0.884081f, 0.884036f, 0.883992f, 0.883947f, 0.883902f, 0.883857f, 0.883812f, 0.883767f,
+ 0.883723f, 0.883678f, 0.883633f, 0.883588f, 0.883543f, 0.883498f, 0.883453f, 0.883408f,
+ 0.883363f, 0.883318f, 0.883273f, 0.883228f, 0.883184f, 0.883139f, 0.883094f, 0.883049f,
+ 0.883004f, 0.882959f, 0.882914f, 0.882869f, 0.882824f, 0.882779f, 0.882733f, 0.882688f,
+ 0.882643f, 0.882598f, 0.882553f, 0.882508f, 0.882463f, 0.882418f, 0.882373f, 0.882328f,
+ 0.882283f, 0.882237f, 0.882192f, 0.882147f, 0.882102f, 0.882057f, 0.882012f, 0.881966f,
+ 0.881921f, 0.881876f, 0.881831f, 0.881786f, 0.881740f, 0.881695f, 0.881650f, 0.881605f,
+ 0.881559f, 0.881514f, 0.881469f, 0.881424f, 0.881378f, 0.881333f, 0.881288f, 0.881242f,
+ 0.881197f, 0.881152f, 0.881106f, 0.881061f, 0.881016f, 0.880970f, 0.880925f, 0.880880f,
+ 0.880834f, 0.880789f, 0.880743f, 0.880698f, 0.880653f, 0.880607f, 0.880562f, 0.880516f,
+ 0.880471f, 0.880425f, 0.880380f, 0.880334f, 0.880289f, 0.880244f, 0.880198f, 0.880153f,
+ 0.880107f, 0.880061f, 0.880016f, 0.879970f, 0.879925f, 0.879879f, 0.879834f, 0.879788f,
+ 0.879743f, 0.879697f, 0.879651f, 0.879606f, 0.879560f, 0.879515f, 0.879469f, 0.879423f,
+ 0.879378f, 0.879332f, 0.879286f, 0.879241f, 0.879195f, 0.879149f, 0.879104f, 0.879058f,
+ 0.879012f, 0.878967f, 0.878921f, 0.878875f, 0.878829f, 0.878784f, 0.878738f, 0.878692f,
+ 0.878646f, 0.878600f, 0.878555f, 0.878509f, 0.878463f, 0.878417f, 0.878371f, 0.878326f,
+ 0.878280f, 0.878234f, 0.878188f, 0.878142f, 0.878096f, 0.878051f, 0.878005f, 0.877959f,
+ 0.877913f, 0.877867f, 0.877821f, 0.877775f, 0.877729f, 0.877683f, 0.877637f, 0.877591f,
+ 0.877545f, 0.877499f, 0.877453f, 0.877407f, 0.877361f, 0.877315f, 0.877269f, 0.877223f,
+ 0.877177f, 0.877131f, 0.877085f, 0.877039f, 0.876993f, 0.876947f, 0.876901f, 0.876855f,
+ 0.876809f, 0.876763f, 0.876716f, 0.876670f, 0.876624f, 0.876578f, 0.876532f, 0.876486f,
+ 0.876440f, 0.876393f, 0.876347f, 0.876301f, 0.876255f, 0.876209f, 0.876163f, 0.876116f,
+ 0.876070f, 0.876024f, 0.875978f, 0.875931f, 0.875885f, 0.875839f, 0.875793f, 0.875746f,
+ 0.875700f, 0.875654f, 0.875607f, 0.875561f, 0.875515f, 0.875468f, 0.875422f, 0.875376f,
+ 0.875329f, 0.875283f, 0.875237f, 0.875190f, 0.875144f, 0.875098f, 0.875051f, 0.875005f,
+ 0.874958f, 0.874912f, 0.874865f, 0.874819f, 0.874773f, 0.874726f, 0.874680f, 0.874633f,
+ 0.874587f, 0.874540f, 0.874494f, 0.874447f, 0.874401f, 0.874354f, 0.874308f, 0.874261f,
+ 0.874215f, 0.874168f, 0.874121f, 0.874075f, 0.874028f, 0.873982f, 0.873935f, 0.873888f,
+ 0.873842f, 0.873795f, 0.873749f, 0.873702f, 0.873655f, 0.873609f, 0.873562f, 0.873515f,
+ 0.873469f, 0.873422f, 0.873375f, 0.873329f, 0.873282f, 0.873235f, 0.873188f, 0.873142f,
+ 0.873095f, 0.873048f, 0.873001f, 0.872955f, 0.872908f, 0.872861f, 0.872814f, 0.872768f,
+ 0.872721f, 0.872674f, 0.872627f, 0.872580f, 0.872534f, 0.872487f, 0.872440f, 0.872393f,
+ 0.872346f, 0.872299f, 0.872252f, 0.872205f, 0.872159f, 0.872112f, 0.872065f, 0.872018f,
+ 0.871971f, 0.871924f, 0.871877f, 0.871830f, 0.871783f, 0.871736f, 0.871689f, 0.871642f,
+ 0.871595f, 0.871548f, 0.871501f, 0.871454f, 0.871407f, 0.871360f, 0.871313f, 0.871266f,
+ 0.871219f, 0.871172f, 0.871125f, 0.871078f, 0.871031f, 0.870983f, 0.870936f, 0.870889f,
+ 0.870842f, 0.870795f, 0.870748f, 0.870701f, 0.870654f, 0.870606f, 0.870559f, 0.870512f,
+ 0.870465f, 0.870418f, 0.870370f, 0.870323f, 0.870276f, 0.870229f, 0.870182f, 0.870134f,
+ 0.870087f, 0.870040f, 0.869992f, 0.869945f, 0.869898f, 0.869851f, 0.869803f, 0.869756f,
+ 0.869709f, 0.869661f, 0.869614f, 0.869567f, 0.869519f, 0.869472f, 0.869425f, 0.869377f,
+ 0.869330f, 0.869282f, 0.869235f, 0.869188f, 0.869140f, 0.869093f, 0.869045f, 0.868998f,
+ 0.868951f, 0.868903f, 0.868856f, 0.868808f, 0.868761f, 0.868713f, 0.868666f, 0.868618f,
+ 0.868571f, 0.868523f, 0.868476f, 0.868428f, 0.868381f, 0.868333f, 0.868285f, 0.868238f,
+ 0.868190f, 0.868143f, 0.868095f, 0.868048f, 0.868000f, 0.867952f, 0.867905f, 0.867857f,
+ 0.867809f, 0.867762f, 0.867714f, 0.867667f, 0.867619f, 0.867571f, 0.867523f, 0.867476f,
+ 0.867428f, 0.867380f, 0.867333f, 0.867285f, 0.867237f, 0.867190f, 0.867142f, 0.867094f,
+ 0.867046f, 0.866998f, 0.866951f, 0.866903f, 0.866855f, 0.866807f, 0.866759f, 0.866712f,
+ 0.866664f, 0.866616f, 0.866568f, 0.866520f, 0.866472f, 0.866425f, 0.866377f, 0.866329f,
+ 0.866281f, 0.866233f, 0.866185f, 0.866137f, 0.866089f, 0.866041f, 0.865993f, 0.865946f,
+ 0.865898f, 0.865850f, 0.865802f, 0.865754f, 0.865706f, 0.865658f, 0.865610f, 0.865562f,
+ 0.865514f, 0.865466f, 0.865418f, 0.865369f, 0.865321f, 0.865273f, 0.865225f, 0.865177f,
+ 0.865129f, 0.865081f, 0.865033f, 0.864985f, 0.864937f, 0.864889f, 0.864841f, 0.864792f,
+ 0.864744f, 0.864696f, 0.864648f, 0.864600f, 0.864552f, 0.864503f, 0.864455f, 0.864407f,
+ 0.864359f, 0.864311f, 0.864262f, 0.864214f, 0.864166f, 0.864118f, 0.864069f, 0.864021f,
+ 0.863973f, 0.863925f, 0.863876f, 0.863828f, 0.863780f, 0.863731f, 0.863683f, 0.863635f,
+ 0.863586f, 0.863538f, 0.863490f, 0.863441f, 0.863393f, 0.863345f, 0.863296f, 0.863248f,
+ 0.863199f, 0.863151f, 0.863103f, 0.863054f, 0.863006f, 0.862957f, 0.862909f, 0.862860f,
+ 0.862812f, 0.862763f, 0.862715f, 0.862666f, 0.862618f, 0.862570f, 0.862521f, 0.862472f,
+ 0.862424f, 0.862375f, 0.862327f, 0.862278f, 0.862230f, 0.862181f, 0.862133f, 0.862084f,
+ 0.862035f, 0.861987f, 0.861938f, 0.861890f, 0.861841f, 0.861792f, 0.861744f, 0.861695f,
+ 0.861646f, 0.861598f, 0.861549f, 0.861500f, 0.861452f, 0.861403f, 0.861354f, 0.861306f,
+ 0.861257f, 0.861208f, 0.861160f, 0.861111f, 0.861062f, 0.861013f, 0.860964f, 0.860916f,
+ 0.860867f, 0.860818f, 0.860769f, 0.860721f, 0.860672f, 0.860623f, 0.860574f, 0.860525f,
+ 0.860476f, 0.860428f, 0.860379f, 0.860330f, 0.860281f, 0.860232f, 0.860183f, 0.860134f,
+ 0.860085f, 0.860036f, 0.859988f, 0.859939f, 0.859890f, 0.859841f, 0.859792f, 0.859743f,
+ 0.859694f, 0.859645f, 0.859596f, 0.859547f, 0.859498f, 0.859449f, 0.859400f, 0.859351f,
+ 0.859302f, 0.859253f, 0.859204f, 0.859155f, 0.859106f, 0.859057f, 0.859007f, 0.858958f,
+ 0.858909f, 0.858860f, 0.858811f, 0.858762f, 0.858713f, 0.858664f, 0.858615f, 0.858565f,
+ 0.858516f, 0.858467f, 0.858418f, 0.858369f, 0.858320f, 0.858270f, 0.858221f, 0.858172f,
+ 0.858123f, 0.858073f, 0.858024f, 0.857975f, 0.857926f, 0.857876f, 0.857827f, 0.857778f,
+ 0.857729f, 0.857679f, 0.857630f, 0.857581f, 0.857531f, 0.857482f, 0.857433f, 0.857383f,
+ 0.857334f, 0.857285f, 0.857235f, 0.857186f, 0.857137f, 0.857087f, 0.857038f, 0.856988f,
+ 0.856939f, 0.856890f, 0.856840f, 0.856791f, 0.856741f, 0.856692f, 0.856642f, 0.856593f,
+ 0.856543f, 0.856494f, 0.856444f, 0.856395f, 0.856345f, 0.856296f, 0.856246f, 0.856197f,
+ 0.856147f, 0.856098f, 0.856048f, 0.855999f, 0.855949f, 0.855900f, 0.855850f, 0.855800f,
+ 0.855751f, 0.855701f, 0.855651f, 0.855602f, 0.855552f, 0.855503f, 0.855453f, 0.855403f,
+ 0.855354f, 0.855304f, 0.855254f, 0.855205f, 0.855155f, 0.855105f, 0.855056f, 0.855006f,
+ 0.854956f, 0.854906f, 0.854857f, 0.854807f, 0.854757f, 0.854707f, 0.854658f, 0.854608f,
+ 0.854558f, 0.854508f, 0.854458f, 0.854409f, 0.854359f, 0.854309f, 0.854259f, 0.854209f,
+ 0.854159f, 0.854110f, 0.854060f, 0.854010f, 0.853960f, 0.853910f, 0.853860f, 0.853810f,
+ 0.853760f, 0.853710f, 0.853660f, 0.853611f, 0.853561f, 0.853511f, 0.853461f, 0.853411f,
+ 0.853361f, 0.853311f, 0.853261f, 0.853211f, 0.853161f, 0.853111f, 0.853061f, 0.853011f,
+ 0.852961f, 0.852911f, 0.852861f, 0.852810f, 0.852760f, 0.852710f, 0.852660f, 0.852610f,
+ 0.852560f, 0.852510f, 0.852460f, 0.852410f, 0.852360f, 0.852309f, 0.852259f, 0.852209f,
+ 0.852159f, 0.852109f, 0.852059f, 0.852008f, 0.851958f, 0.851908f, 0.851858f, 0.851808f,
+ 0.851757f, 0.851707f, 0.851657f, 0.851607f, 0.851556f, 0.851506f, 0.851456f, 0.851406f,
+ 0.851355f, 0.851305f, 0.851255f, 0.851204f, 0.851154f, 0.851104f, 0.851053f, 0.851003f,
+ 0.850953f, 0.850902f, 0.850852f, 0.850801f, 0.850751f, 0.850701f, 0.850650f, 0.850600f,
+ 0.850549f, 0.850499f, 0.850449f, 0.850398f, 0.850348f, 0.850297f, 0.850247f, 0.850196f,
+ 0.850146f, 0.850095f, 0.850045f, 0.849994f, 0.849944f, 0.849893f, 0.849843f, 0.849792f,
+ 0.849742f, 0.849691f, 0.849641f, 0.849590f, 0.849540f, 0.849489f, 0.849438f, 0.849388f,
+ 0.849337f, 0.849287f, 0.849236f, 0.849185f, 0.849135f, 0.849084f, 0.849033f, 0.848983f,
+ 0.848932f, 0.848881f, 0.848831f, 0.848780f, 0.848729f, 0.848679f, 0.848628f, 0.848577f,
+ 0.848526f, 0.848476f, 0.848425f, 0.848374f, 0.848323f, 0.848273f, 0.848222f, 0.848171f,
+ 0.848120f, 0.848070f, 0.848019f, 0.847968f, 0.847917f, 0.847866f, 0.847815f, 0.847765f,
+ 0.847714f, 0.847663f, 0.847612f, 0.847561f, 0.847510f, 0.847459f, 0.847408f, 0.847358f,
+ 0.847307f, 0.847256f, 0.847205f, 0.847154f, 0.847103f, 0.847052f, 0.847001f, 0.846950f,
+ 0.846899f, 0.846848f, 0.846797f, 0.846746f, 0.846695f, 0.846644f, 0.846593f, 0.846542f,
+ 0.846491f, 0.846440f, 0.846389f, 0.846338f, 0.846287f, 0.846236f, 0.846185f, 0.846133f,
+ 0.846082f, 0.846031f, 0.845980f, 0.845929f, 0.845878f, 0.845827f, 0.845776f, 0.845724f,
+ 0.845673f, 0.845622f, 0.845571f, 0.845520f, 0.845469f, 0.845417f, 0.845366f, 0.845315f,
+ 0.845264f, 0.845212f, 0.845161f, 0.845110f, 0.845059f, 0.845007f, 0.844956f, 0.844905f,
+ 0.844854f, 0.844802f, 0.844751f, 0.844700f, 0.844648f, 0.844597f, 0.844546f, 0.844494f,
+ 0.844443f, 0.844392f, 0.844340f, 0.844289f, 0.844238f, 0.844186f, 0.844135f, 0.844083f,
+ 0.844032f, 0.843980f, 0.843929f, 0.843878f, 0.843826f, 0.843775f, 0.843723f, 0.843672f,
+ 0.843620f, 0.843569f, 0.843517f, 0.843466f, 0.843414f, 0.843363f, 0.843311f, 0.843260f,
+ 0.843208f, 0.843157f, 0.843105f, 0.843054f, 0.843002f, 0.842950f, 0.842899f, 0.842847f,
+ 0.842796f, 0.842744f, 0.842692f, 0.842641f, 0.842589f, 0.842538f, 0.842486f, 0.842434f,
+ 0.842383f, 0.842331f, 0.842279f, 0.842228f, 0.842176f, 0.842124f, 0.842072f, 0.842021f,
+ 0.841969f, 0.841917f, 0.841866f, 0.841814f, 0.841762f, 0.841710f, 0.841659f, 0.841607f,
+ 0.841555f, 0.841503f, 0.841451f, 0.841400f, 0.841348f, 0.841296f, 0.841244f, 0.841192f,
+ 0.841140f, 0.841089f, 0.841037f, 0.840985f, 0.840933f, 0.840881f, 0.840829f, 0.840777f,
+ 0.840725f, 0.840673f, 0.840622f, 0.840570f, 0.840518f, 0.840466f, 0.840414f, 0.840362f,
+ 0.840310f, 0.840258f, 0.840206f, 0.840154f, 0.840102f, 0.840050f, 0.839998f, 0.839946f,
+ 0.839894f, 0.839842f, 0.839790f, 0.839738f, 0.839686f, 0.839634f, 0.839581f, 0.839529f,
+ 0.839477f, 0.839425f, 0.839373f, 0.839321f, 0.839269f, 0.839217f, 0.839165f, 0.839112f,
+ 0.839060f, 0.839008f, 0.838956f, 0.838904f, 0.838852f, 0.838799f, 0.838747f, 0.838695f,
+ 0.838643f, 0.838591f, 0.838538f, 0.838486f, 0.838434f, 0.838382f, 0.838329f, 0.838277f,
+ 0.838225f, 0.838172f, 0.838120f, 0.838068f, 0.838015f, 0.837963f, 0.837911f, 0.837859f,
+ 0.837806f, 0.837754f, 0.837701f, 0.837649f, 0.837597f, 0.837544f, 0.837492f, 0.837440f,
+ 0.837387f, 0.837335f, 0.837282f, 0.837230f, 0.837178f, 0.837125f, 0.837073f, 0.837020f,
+ 0.836968f, 0.836915f, 0.836863f, 0.836810f, 0.836758f, 0.836705f, 0.836653f, 0.836600f,
+ 0.836548f, 0.836495f, 0.836443f, 0.836390f, 0.836338f, 0.836285f, 0.836232f, 0.836180f,
+ 0.836127f, 0.836075f, 0.836022f, 0.835969f, 0.835917f, 0.835864f, 0.835812f, 0.835759f,
+ 0.835706f, 0.835654f, 0.835601f, 0.835548f, 0.835496f, 0.835443f, 0.835390f, 0.835338f,
+ 0.835285f, 0.835232f, 0.835179f, 0.835127f, 0.835074f, 0.835021f, 0.834968f, 0.834916f,
+ 0.834863f, 0.834810f, 0.834757f, 0.834705f, 0.834652f, 0.834599f, 0.834546f, 0.834493f,
+ 0.834440f, 0.834388f, 0.834335f, 0.834282f, 0.834229f, 0.834176f, 0.834123f, 0.834070f,
+ 0.834018f, 0.833965f, 0.833912f, 0.833859f, 0.833806f, 0.833753f, 0.833700f, 0.833647f,
+ 0.833594f, 0.833541f, 0.833488f, 0.833435f, 0.833382f, 0.833329f, 0.833276f, 0.833223f,
+ 0.833170f, 0.833117f, 0.833064f, 0.833011f, 0.832958f, 0.832905f, 0.832852f, 0.832799f,
+ 0.832746f, 0.832693f, 0.832640f, 0.832586f, 0.832533f, 0.832480f, 0.832427f, 0.832374f,
+ 0.832321f, 0.832268f, 0.832215f, 0.832161f, 0.832108f, 0.832055f, 0.832002f, 0.831949f,
+ 0.831895f, 0.831842f, 0.831789f, 0.831736f, 0.831683f, 0.831629f, 0.831576f, 0.831523f,
+ 0.831470f, 0.831416f, 0.831363f, 0.831310f, 0.831257f, 0.831203f, 0.831150f, 0.831097f,
+ 0.831043f, 0.830990f, 0.830937f, 0.830883f, 0.830830f, 0.830777f, 0.830723f, 0.830670f,
+ 0.830616f, 0.830563f, 0.830510f, 0.830456f, 0.830403f, 0.830349f, 0.830296f, 0.830243f,
+ 0.830189f, 0.830136f, 0.830082f, 0.830029f, 0.829975f, 0.829922f, 0.829868f, 0.829815f,
+ 0.829761f, 0.829708f, 0.829654f, 0.829601f, 0.829547f, 0.829494f, 0.829440f, 0.829386f,
+ 0.829333f, 0.829279f, 0.829226f, 0.829172f, 0.829119f, 0.829065f, 0.829011f, 0.828958f,
+ 0.828904f, 0.828851f, 0.828797f, 0.828743f, 0.828690f, 0.828636f, 0.828582f, 0.828529f,
+ 0.828475f, 0.828421f, 0.828367f, 0.828314f, 0.828260f, 0.828206f, 0.828153f, 0.828099f,
+ 0.828045f, 0.827991f, 0.827938f, 0.827884f, 0.827830f, 0.827776f, 0.827722f, 0.827669f,
+ 0.827615f, 0.827561f, 0.827507f, 0.827453f, 0.827399f, 0.827346f, 0.827292f, 0.827238f,
+ 0.827184f, 0.827130f, 0.827076f, 0.827022f, 0.826968f, 0.826915f, 0.826861f, 0.826807f,
+ 0.826753f, 0.826699f, 0.826645f, 0.826591f, 0.826537f, 0.826483f, 0.826429f, 0.826375f,
+ 0.826321f, 0.826267f, 0.826213f, 0.826159f, 0.826105f, 0.826051f, 0.825997f, 0.825943f,
+ 0.825889f, 0.825835f, 0.825781f, 0.825727f, 0.825673f, 0.825618f, 0.825564f, 0.825510f,
+ 0.825456f, 0.825402f, 0.825348f, 0.825294f, 0.825240f, 0.825185f, 0.825131f, 0.825077f,
+ 0.825023f, 0.824969f, 0.824915f, 0.824860f, 0.824806f, 0.824752f, 0.824698f, 0.824644f,
+ 0.824589f, 0.824535f, 0.824481f, 0.824427f, 0.824372f, 0.824318f, 0.824264f, 0.824209f,
+ 0.824155f, 0.824101f, 0.824047f, 0.823992f, 0.823938f, 0.823884f, 0.823829f, 0.823775f,
+ 0.823721f, 0.823666f, 0.823612f, 0.823557f, 0.823503f, 0.823449f, 0.823394f, 0.823340f,
+ 0.823285f, 0.823231f, 0.823177f, 0.823122f, 0.823068f, 0.823013f, 0.822959f, 0.822904f,
+ 0.822850f, 0.822795f, 0.822741f, 0.822686f, 0.822632f, 0.822577f, 0.822523f, 0.822468f,
+ 0.822414f, 0.822359f, 0.822305f, 0.822250f, 0.822195f, 0.822141f, 0.822086f, 0.822032f,
+ 0.821977f, 0.821922f, 0.821868f, 0.821813f, 0.821759f, 0.821704f, 0.821649f, 0.821595f,
+ 0.821540f, 0.821485f, 0.821431f, 0.821376f, 0.821321f, 0.821267f, 0.821212f, 0.821157f,
+ 0.821102f, 0.821048f, 0.820993f, 0.820938f, 0.820884f, 0.820829f, 0.820774f, 0.820719f,
+ 0.820664f, 0.820610f, 0.820555f, 0.820500f, 0.820445f, 0.820390f, 0.820336f, 0.820281f,
+ 0.820226f, 0.820171f, 0.820116f, 0.820061f, 0.820007f, 0.819952f, 0.819897f, 0.819842f,
+ 0.819787f, 0.819732f, 0.819677f, 0.819622f, 0.819567f, 0.819512f, 0.819457f, 0.819402f,
+ 0.819348f, 0.819293f, 0.819238f, 0.819183f, 0.819128f, 0.819073f, 0.819018f, 0.818963f,
+ 0.818908f, 0.818853f, 0.818798f, 0.818742f, 0.818687f, 0.818632f, 0.818577f, 0.818522f,
+ 0.818467f, 0.818412f, 0.818357f, 0.818302f, 0.818247f, 0.818192f, 0.818137f, 0.818081f,
+ 0.818026f, 0.817971f, 0.817916f, 0.817861f, 0.817806f, 0.817750f, 0.817695f, 0.817640f,
+ 0.817585f, 0.817530f, 0.817474f, 0.817419f, 0.817364f, 0.817309f, 0.817253f, 0.817198f,
+ 0.817143f, 0.817088f, 0.817032f, 0.816977f, 0.816922f, 0.816867f, 0.816811f, 0.816756f,
+ 0.816701f, 0.816645f, 0.816590f, 0.816535f, 0.816479f, 0.816424f, 0.816368f, 0.816313f,
+ 0.816258f, 0.816202f, 0.816147f, 0.816092f, 0.816036f, 0.815981f, 0.815925f, 0.815870f,
+ 0.815814f, 0.815759f, 0.815704f, 0.815648f, 0.815593f, 0.815537f, 0.815482f, 0.815426f,
+ 0.815371f, 0.815315f, 0.815260f, 0.815204f, 0.815149f, 0.815093f, 0.815037f, 0.814982f,
+ 0.814926f, 0.814871f, 0.814815f, 0.814760f, 0.814704f, 0.814648f, 0.814593f, 0.814537f,
+ 0.814482f, 0.814426f, 0.814370f, 0.814315f, 0.814259f, 0.814203f, 0.814148f, 0.814092f,
+ 0.814036f, 0.813981f, 0.813925f, 0.813869f, 0.813814f, 0.813758f, 0.813702f, 0.813646f,
+ 0.813591f, 0.813535f, 0.813479f, 0.813423f, 0.813368f, 0.813312f, 0.813256f, 0.813200f,
+ 0.813144f, 0.813089f, 0.813033f, 0.812977f, 0.812921f, 0.812865f, 0.812809f, 0.812754f,
+ 0.812698f, 0.812642f, 0.812586f, 0.812530f, 0.812474f, 0.812418f, 0.812362f, 0.812307f,
+ 0.812251f, 0.812195f, 0.812139f, 0.812083f, 0.812027f, 0.811971f, 0.811915f, 0.811859f,
+ 0.811803f, 0.811747f, 0.811691f, 0.811635f, 0.811579f, 0.811523f, 0.811467f, 0.811411f,
+ 0.811355f, 0.811299f, 0.811243f, 0.811187f, 0.811131f, 0.811075f, 0.811018f, 0.810962f,
+ 0.810906f, 0.810850f, 0.810794f, 0.810738f, 0.810682f, 0.810626f, 0.810570f, 0.810513f,
+ 0.810457f, 0.810401f, 0.810345f, 0.810289f, 0.810232f, 0.810176f, 0.810120f, 0.810064f,
+ 0.810008f, 0.809951f, 0.809895f, 0.809839f, 0.809783f, 0.809726f, 0.809670f, 0.809614f,
+ 0.809558f, 0.809501f, 0.809445f, 0.809389f, 0.809332f, 0.809276f, 0.809220f, 0.809164f,
+ 0.809107f, 0.809051f, 0.808994f, 0.808938f, 0.808882f, 0.808825f, 0.808769f, 0.808713f,
+ 0.808656f, 0.808600f, 0.808543f, 0.808487f, 0.808430f, 0.808374f, 0.808318f, 0.808261f,
+ 0.808205f, 0.808148f, 0.808092f, 0.808035f, 0.807979f, 0.807922f, 0.807866f, 0.807809f,
+ 0.807753f, 0.807696f, 0.807640f, 0.807583f, 0.807527f, 0.807470f, 0.807414f, 0.807357f,
+ 0.807300f, 0.807244f, 0.807187f, 0.807131f, 0.807074f, 0.807017f, 0.806961f, 0.806904f,
+ 0.806848f, 0.806791f, 0.806734f, 0.806678f, 0.806621f, 0.806564f, 0.806508f, 0.806451f,
+ 0.806394f, 0.806338f, 0.806281f, 0.806224f, 0.806167f, 0.806111f, 0.806054f, 0.805997f,
+ 0.805940f, 0.805884f, 0.805827f, 0.805770f, 0.805713f, 0.805656f, 0.805600f, 0.805543f,
+ 0.805486f, 0.805429f, 0.805372f, 0.805316f, 0.805259f, 0.805202f, 0.805145f, 0.805088f,
+ 0.805031f, 0.804974f, 0.804918f, 0.804861f, 0.804804f, 0.804747f, 0.804690f, 0.804633f,
+ 0.804576f, 0.804519f, 0.804462f, 0.804405f, 0.804348f, 0.804291f, 0.804234f, 0.804177f,
+ 0.804120f, 0.804063f, 0.804006f, 0.803949f, 0.803892f, 0.803835f, 0.803778f, 0.803721f,
+ 0.803664f, 0.803607f, 0.803550f, 0.803493f, 0.803436f, 0.803379f, 0.803322f, 0.803265f,
+ 0.803208f, 0.803150f, 0.803093f, 0.803036f, 0.802979f, 0.802922f, 0.802865f, 0.802808f,
+ 0.802750f, 0.802693f, 0.802636f, 0.802579f, 0.802522f, 0.802464f, 0.802407f, 0.802350f,
+ 0.802293f, 0.802236f, 0.802178f, 0.802121f, 0.802064f, 0.802007f, 0.801949f, 0.801892f,
+ 0.801835f, 0.801777f, 0.801720f, 0.801663f, 0.801606f, 0.801548f, 0.801491f, 0.801434f,
+ 0.801376f, 0.801319f, 0.801261f, 0.801204f, 0.801147f, 0.801089f, 0.801032f, 0.800975f,
+ 0.800917f, 0.800860f, 0.800802f, 0.800745f, 0.800687f, 0.800630f, 0.800573f, 0.800515f,
+ 0.800458f, 0.800400f, 0.800343f, 0.800285f, 0.800228f, 0.800170f, 0.800113f, 0.800055f,
+ 0.799998f, 0.799940f, 0.799883f, 0.799825f, 0.799768f, 0.799710f, 0.799652f, 0.799595f,
+ 0.799537f, 0.799480f, 0.799422f, 0.799365f, 0.799307f, 0.799249f, 0.799192f, 0.799134f,
+ 0.799076f, 0.799019f, 0.798961f, 0.798903f, 0.798846f, 0.798788f, 0.798730f, 0.798673f,
+ 0.798615f, 0.798557f, 0.798500f, 0.798442f, 0.798384f, 0.798326f, 0.798269f, 0.798211f,
+ 0.798153f, 0.798095f, 0.798038f, 0.797980f, 0.797922f, 0.797864f, 0.797806f, 0.797749f,
+ 0.797691f, 0.797633f, 0.797575f, 0.797517f, 0.797459f, 0.797402f, 0.797344f, 0.797286f,
+ 0.797228f, 0.797170f, 0.797112f, 0.797054f, 0.796996f, 0.796939f, 0.796881f, 0.796823f,
+ 0.796765f, 0.796707f, 0.796649f, 0.796591f, 0.796533f, 0.796475f, 0.796417f, 0.796359f,
+ 0.796301f, 0.796243f, 0.796185f, 0.796127f, 0.796069f, 0.796011f, 0.795953f, 0.795895f,
+ 0.795837f, 0.795779f, 0.795721f, 0.795663f, 0.795605f, 0.795547f, 0.795488f, 0.795430f,
+ 0.795372f, 0.795314f, 0.795256f, 0.795198f, 0.795140f, 0.795082f, 0.795023f, 0.794965f,
+ 0.794907f, 0.794849f, 0.794791f, 0.794733f, 0.794674f, 0.794616f, 0.794558f, 0.794500f,
+ 0.794442f, 0.794383f, 0.794325f, 0.794267f, 0.794209f, 0.794150f, 0.794092f, 0.794034f,
+ 0.793975f, 0.793917f, 0.793859f, 0.793801f, 0.793742f, 0.793684f, 0.793626f, 0.793567f,
+ 0.793509f, 0.793451f, 0.793392f, 0.793334f, 0.793276f, 0.793217f, 0.793159f, 0.793100f,
+ 0.793042f, 0.792984f, 0.792925f, 0.792867f, 0.792808f, 0.792750f, 0.792691f, 0.792633f,
+ 0.792575f, 0.792516f, 0.792458f, 0.792399f, 0.792341f, 0.792282f, 0.792224f, 0.792165f,
+ 0.792107f, 0.792048f, 0.791990f, 0.791931f, 0.791872f, 0.791814f, 0.791755f, 0.791697f,
+ 0.791638f, 0.791580f, 0.791521f, 0.791462f, 0.791404f, 0.791345f, 0.791287f, 0.791228f,
+ 0.791169f, 0.791111f, 0.791052f, 0.790993f, 0.790935f, 0.790876f, 0.790817f, 0.790759f,
+ 0.790700f, 0.790641f, 0.790583f, 0.790524f, 0.790465f, 0.790406f, 0.790348f, 0.790289f,
+ 0.790230f, 0.790171f, 0.790113f, 0.790054f, 0.789995f, 0.789936f, 0.789878f, 0.789819f,
+ 0.789760f, 0.789701f, 0.789642f, 0.789584f, 0.789525f, 0.789466f, 0.789407f, 0.789348f,
+ 0.789289f, 0.789230f, 0.789172f, 0.789113f, 0.789054f, 0.788995f, 0.788936f, 0.788877f,
+ 0.788818f, 0.788759f, 0.788700f, 0.788641f, 0.788582f, 0.788523f, 0.788464f, 0.788405f,
+ 0.788346f, 0.788287f, 0.788228f, 0.788169f, 0.788110f, 0.788051f, 0.787992f, 0.787933f,
+ 0.787874f, 0.787815f, 0.787756f, 0.787697f, 0.787638f, 0.787579f, 0.787520f, 0.787461f,
+ 0.787402f, 0.787343f, 0.787284f, 0.787224f, 0.787165f, 0.787106f, 0.787047f, 0.786988f,
+ 0.786929f, 0.786870f, 0.786810f, 0.786751f, 0.786692f, 0.786633f, 0.786574f, 0.786514f,
+ 0.786455f, 0.786396f, 0.786337f, 0.786278f, 0.786218f, 0.786159f, 0.786100f, 0.786041f,
+ 0.785981f, 0.785922f, 0.785863f, 0.785803f, 0.785744f, 0.785685f, 0.785625f, 0.785566f,
+ 0.785507f, 0.785447f, 0.785388f, 0.785329f, 0.785269f, 0.785210f, 0.785151f, 0.785091f,
+ 0.785032f, 0.784973f, 0.784913f, 0.784854f, 0.784794f, 0.784735f, 0.784675f, 0.784616f,
+ 0.784557f, 0.784497f, 0.784438f, 0.784378f, 0.784319f, 0.784259f, 0.784200f, 0.784140f,
+ 0.784081f, 0.784021f, 0.783962f, 0.783902f, 0.783843f, 0.783783f, 0.783724f, 0.783664f,
+ 0.783605f, 0.783545f, 0.783485f, 0.783426f, 0.783366f, 0.783307f, 0.783247f, 0.783187f,
+ 0.783128f, 0.783068f, 0.783009f, 0.782949f, 0.782889f, 0.782830f, 0.782770f, 0.782710f,
+ 0.782651f, 0.782591f, 0.782531f, 0.782472f, 0.782412f, 0.782352f, 0.782292f, 0.782233f,
+ 0.782173f, 0.782113f, 0.782053f, 0.781994f, 0.781934f, 0.781874f, 0.781814f, 0.781755f,
+ 0.781695f, 0.781635f, 0.781575f, 0.781515f, 0.781456f, 0.781396f, 0.781336f, 0.781276f,
+ 0.781216f, 0.781156f, 0.781097f, 0.781037f, 0.780977f, 0.780917f, 0.780857f, 0.780797f,
+ 0.780737f, 0.780677f, 0.780617f, 0.780557f, 0.780498f, 0.780438f, 0.780378f, 0.780318f,
+ 0.780258f, 0.780198f, 0.780138f, 0.780078f, 0.780018f, 0.779958f, 0.779898f, 0.779838f,
+ 0.779778f, 0.779718f, 0.779658f, 0.779598f, 0.779538f, 0.779478f, 0.779418f, 0.779357f,
+ 0.779297f, 0.779237f, 0.779177f, 0.779117f, 0.779057f, 0.778997f, 0.778937f, 0.778877f,
+ 0.778817f, 0.778756f, 0.778696f, 0.778636f, 0.778576f, 0.778516f, 0.778456f, 0.778395f,
+ 0.778335f, 0.778275f, 0.778215f, 0.778155f, 0.778094f, 0.778034f, 0.777974f, 0.777914f,
+ 0.777853f, 0.777793f, 0.777733f, 0.777673f, 0.777612f, 0.777552f, 0.777492f, 0.777431f,
+ 0.777371f, 0.777311f, 0.777251f, 0.777190f, 0.777130f, 0.777070f, 0.777009f, 0.776949f,
+ 0.776888f, 0.776828f, 0.776768f, 0.776707f, 0.776647f, 0.776587f, 0.776526f, 0.776466f,
+ 0.776405f, 0.776345f, 0.776284f, 0.776224f, 0.776164f, 0.776103f, 0.776043f, 0.775982f,
+ 0.775922f, 0.775861f, 0.775801f, 0.775740f, 0.775680f, 0.775619f, 0.775559f, 0.775498f,
+ 0.775438f, 0.775377f, 0.775317f, 0.775256f, 0.775195f, 0.775135f, 0.775074f, 0.775014f,
+ 0.774953f, 0.774893f, 0.774832f, 0.774771f, 0.774711f, 0.774650f, 0.774589f, 0.774529f,
+ 0.774468f, 0.774407f, 0.774347f, 0.774286f, 0.774225f, 0.774165f, 0.774104f, 0.774043f,
+ 0.773983f, 0.773922f, 0.773861f, 0.773801f, 0.773740f, 0.773679f, 0.773618f, 0.773558f,
+ 0.773497f, 0.773436f, 0.773375f, 0.773314f, 0.773254f, 0.773193f, 0.773132f, 0.773071f,
+ 0.773010f, 0.772950f, 0.772889f, 0.772828f, 0.772767f, 0.772706f, 0.772645f, 0.772584f,
+ 0.772524f, 0.772463f, 0.772402f, 0.772341f, 0.772280f, 0.772219f, 0.772158f, 0.772097f,
+ 0.772036f, 0.771975f, 0.771915f, 0.771854f, 0.771793f, 0.771732f, 0.771671f, 0.771610f,
+ 0.771549f, 0.771488f, 0.771427f, 0.771366f, 0.771305f, 0.771244f, 0.771183f, 0.771122f,
+ 0.771061f, 0.770999f, 0.770938f, 0.770877f, 0.770816f, 0.770755f, 0.770694f, 0.770633f,
+ 0.770572f, 0.770511f, 0.770450f, 0.770389f, 0.770327f, 0.770266f, 0.770205f, 0.770144f,
+ 0.770083f, 0.770022f, 0.769961f, 0.769899f, 0.769838f, 0.769777f, 0.769716f, 0.769655f,
+ 0.769593f, 0.769532f, 0.769471f, 0.769410f, 0.769348f, 0.769287f, 0.769226f, 0.769165f,
+ 0.769103f, 0.769042f, 0.768981f, 0.768919f, 0.768858f, 0.768797f, 0.768736f, 0.768674f,
+ 0.768613f, 0.768552f, 0.768490f, 0.768429f, 0.768368f, 0.768306f, 0.768245f, 0.768183f,
+ 0.768122f, 0.768061f, 0.767999f, 0.767938f, 0.767876f, 0.767815f, 0.767754f, 0.767692f,
+ 0.767631f, 0.767569f, 0.767508f, 0.767446f, 0.767385f, 0.767323f, 0.767262f, 0.767200f,
+ 0.767139f, 0.767077f, 0.767016f, 0.766954f, 0.766893f, 0.766831f, 0.766770f, 0.766708f,
+ 0.766647f, 0.766585f, 0.766524f, 0.766462f, 0.766400f, 0.766339f, 0.766277f, 0.766216f,
+ 0.766154f, 0.766092f, 0.766031f, 0.765969f, 0.765907f, 0.765846f, 0.765784f, 0.765723f,
+ 0.765661f, 0.765599f, 0.765538f, 0.765476f, 0.765414f, 0.765352f, 0.765291f, 0.765229f,
+ 0.765167f, 0.765106f, 0.765044f, 0.764982f, 0.764920f, 0.764859f, 0.764797f, 0.764735f,
+ 0.764673f, 0.764611f, 0.764550f, 0.764488f, 0.764426f, 0.764364f, 0.764302f, 0.764241f,
+ 0.764179f, 0.764117f, 0.764055f, 0.763993f, 0.763931f, 0.763869f, 0.763808f, 0.763746f,
+ 0.763684f, 0.763622f, 0.763560f, 0.763498f, 0.763436f, 0.763374f, 0.763312f, 0.763250f,
+ 0.763188f, 0.763126f, 0.763065f, 0.763003f, 0.762941f, 0.762879f, 0.762817f, 0.762755f,
+ 0.762693f, 0.762631f, 0.762569f, 0.762507f, 0.762444f, 0.762382f, 0.762320f, 0.762258f,
+ 0.762196f, 0.762134f, 0.762072f, 0.762010f, 0.761948f, 0.761886f, 0.761824f, 0.761762f,
+ 0.761700f, 0.761637f, 0.761575f, 0.761513f, 0.761451f, 0.761389f, 0.761327f, 0.761265f,
+ 0.761202f, 0.761140f, 0.761078f, 0.761016f, 0.760954f, 0.760891f, 0.760829f, 0.760767f,
+ 0.760705f, 0.760643f, 0.760580f, 0.760518f, 0.760456f, 0.760394f, 0.760331f, 0.760269f,
+ 0.760207f, 0.760144f, 0.760082f, 0.760020f, 0.759957f, 0.759895f, 0.759833f, 0.759771f,
+ 0.759708f, 0.759646f, 0.759583f, 0.759521f, 0.759459f, 0.759396f, 0.759334f, 0.759272f,
+ 0.759209f, 0.759147f, 0.759084f, 0.759022f, 0.758960f, 0.758897f, 0.758835f, 0.758772f,
+ 0.758710f, 0.758647f, 0.758585f, 0.758522f, 0.758460f, 0.758397f, 0.758335f, 0.758272f,
+ 0.758210f, 0.758147f, 0.758085f, 0.758022f, 0.757960f, 0.757897f, 0.757835f, 0.757772f,
+ 0.757710f, 0.757647f, 0.757584f, 0.757522f, 0.757459f, 0.757397f, 0.757334f, 0.757271f,
+ 0.757209f, 0.757146f, 0.757084f, 0.757021f, 0.756958f, 0.756896f, 0.756833f, 0.756770f,
+ 0.756708f, 0.756645f, 0.756582f, 0.756520f, 0.756457f, 0.756394f, 0.756331f, 0.756269f,
+ 0.756206f, 0.756143f, 0.756081f, 0.756018f, 0.755955f, 0.755892f, 0.755829f, 0.755767f,
+ 0.755704f, 0.755641f, 0.755578f, 0.755516f, 0.755453f, 0.755390f, 0.755327f, 0.755264f,
+ 0.755201f, 0.755139f, 0.755076f, 0.755013f, 0.754950f, 0.754887f, 0.754824f, 0.754761f,
+ 0.754698f, 0.754636f, 0.754573f, 0.754510f, 0.754447f, 0.754384f, 0.754321f, 0.754258f,
+ 0.754195f, 0.754132f, 0.754069f, 0.754006f, 0.753943f, 0.753880f, 0.753817f, 0.753754f,
+ 0.753691f, 0.753628f, 0.753565f, 0.753502f, 0.753439f, 0.753376f, 0.753313f, 0.753250f,
+ 0.753187f, 0.753124f, 0.753061f, 0.752998f, 0.752934f, 0.752871f, 0.752808f, 0.752745f,
+ 0.752682f, 0.752619f, 0.752556f, 0.752493f, 0.752429f, 0.752366f, 0.752303f, 0.752240f,
+ 0.752177f, 0.752114f, 0.752050f, 0.751987f, 0.751924f, 0.751861f, 0.751798f, 0.751734f,
+ 0.751671f, 0.751608f, 0.751545f, 0.751481f, 0.751418f, 0.751355f, 0.751292f, 0.751228f,
+ 0.751165f, 0.751102f, 0.751039f, 0.750975f, 0.750912f, 0.750849f, 0.750785f, 0.750722f,
+ 0.750659f, 0.750595f, 0.750532f, 0.750469f, 0.750405f, 0.750342f, 0.750278f, 0.750215f,
+ 0.750152f, 0.750088f, 0.750025f, 0.749961f, 0.749898f, 0.749835f, 0.749771f, 0.749708f,
+ 0.749644f, 0.749581f, 0.749517f, 0.749454f, 0.749390f, 0.749327f, 0.749263f, 0.749200f,
+ 0.749136f, 0.749073f, 0.749009f, 0.748946f, 0.748882f, 0.748819f, 0.748755f, 0.748692f,
+ 0.748628f, 0.748565f, 0.748501f, 0.748437f, 0.748374f, 0.748310f, 0.748247f, 0.748183f,
+ 0.748119f, 0.748056f, 0.747992f, 0.747929f, 0.747865f, 0.747801f, 0.747738f, 0.747674f,
+ 0.747610f, 0.747547f, 0.747483f, 0.747419f, 0.747355f, 0.747292f, 0.747228f, 0.747164f,
+ 0.747101f, 0.747037f, 0.746973f, 0.746909f, 0.746846f, 0.746782f, 0.746718f, 0.746654f,
+ 0.746591f, 0.746527f, 0.746463f, 0.746399f, 0.746335f, 0.746272f, 0.746208f, 0.746144f,
+ 0.746080f, 0.746016f, 0.745952f, 0.745889f, 0.745825f, 0.745761f, 0.745697f, 0.745633f,
+ 0.745569f, 0.745505f, 0.745441f, 0.745377f, 0.745314f, 0.745250f, 0.745186f, 0.745122f,
+ 0.745058f, 0.744994f, 0.744930f, 0.744866f, 0.744802f, 0.744738f, 0.744674f, 0.744610f,
+ 0.744546f, 0.744482f, 0.744418f, 0.744354f, 0.744290f, 0.744226f, 0.744162f, 0.744098f,
+ 0.744034f, 0.743970f, 0.743906f, 0.743842f, 0.743777f, 0.743713f, 0.743649f, 0.743585f,
+ 0.743521f, 0.743457f, 0.743393f, 0.743329f, 0.743265f, 0.743200f, 0.743136f, 0.743072f,
+ 0.743008f, 0.742944f, 0.742880f, 0.742815f, 0.742751f, 0.742687f, 0.742623f, 0.742559f,
+ 0.742494f, 0.742430f, 0.742366f, 0.742302f, 0.742237f, 0.742173f, 0.742109f, 0.742045f,
+ 0.741980f, 0.741916f, 0.741852f, 0.741788f, 0.741723f, 0.741659f, 0.741595f, 0.741530f,
+ 0.741466f, 0.741402f, 0.741337f, 0.741273f, 0.741209f, 0.741144f, 0.741080f, 0.741015f,
+ 0.740951f, 0.740887f, 0.740822f, 0.740758f, 0.740694f, 0.740629f, 0.740565f, 0.740500f,
+ 0.740436f, 0.740371f, 0.740307f, 0.740242f, 0.740178f, 0.740114f, 0.740049f, 0.739985f,
+ 0.739920f, 0.739856f, 0.739791f, 0.739727f, 0.739662f, 0.739598f, 0.739533f, 0.739468f,
+ 0.739404f, 0.739339f, 0.739275f, 0.739210f, 0.739146f, 0.739081f, 0.739017f, 0.738952f,
+ 0.738887f, 0.738823f, 0.738758f, 0.738693f, 0.738629f, 0.738564f, 0.738500f, 0.738435f,
+ 0.738370f, 0.738306f, 0.738241f, 0.738176f, 0.738112f, 0.738047f, 0.737982f, 0.737918f,
+ 0.737853f, 0.737788f, 0.737723f, 0.737659f, 0.737594f, 0.737529f, 0.737464f, 0.737400f,
+ 0.737335f, 0.737270f, 0.737205f, 0.737141f, 0.737076f, 0.737011f, 0.736946f, 0.736881f,
+ 0.736817f, 0.736752f, 0.736687f, 0.736622f, 0.736557f, 0.736492f, 0.736428f, 0.736363f,
+ 0.736298f, 0.736233f, 0.736168f, 0.736103f, 0.736038f, 0.735973f, 0.735908f, 0.735844f,
+ 0.735779f, 0.735714f, 0.735649f, 0.735584f, 0.735519f, 0.735454f, 0.735389f, 0.735324f,
+ 0.735259f, 0.735194f, 0.735129f, 0.735064f, 0.734999f, 0.734934f, 0.734869f, 0.734804f,
+ 0.734739f, 0.734674f, 0.734609f, 0.734544f, 0.734479f, 0.734414f, 0.734349f, 0.734283f,
+ 0.734218f, 0.734153f, 0.734088f, 0.734023f, 0.733958f, 0.733893f, 0.733828f, 0.733763f,
+ 0.733697f, 0.733632f, 0.733567f, 0.733502f, 0.733437f, 0.733372f, 0.733306f, 0.733241f,
+ 0.733176f, 0.733111f, 0.733046f, 0.732980f, 0.732915f, 0.732850f, 0.732785f, 0.732720f,
+ 0.732654f, 0.732589f, 0.732524f, 0.732458f, 0.732393f, 0.732328f, 0.732263f, 0.732197f,
+ 0.732132f, 0.732067f, 0.732001f, 0.731936f, 0.731871f, 0.731805f, 0.731740f, 0.731675f,
+ 0.731609f, 0.731544f, 0.731479f, 0.731413f, 0.731348f, 0.731282f, 0.731217f, 0.731152f,
+ 0.731086f, 0.731021f, 0.730955f, 0.730890f, 0.730825f, 0.730759f, 0.730694f, 0.730628f,
+ 0.730563f, 0.730497f, 0.730432f, 0.730366f, 0.730301f, 0.730235f, 0.730170f, 0.730104f,
+ 0.730039f, 0.729973f, 0.729908f, 0.729842f, 0.729777f, 0.729711f, 0.729646f, 0.729580f,
+ 0.729514f, 0.729449f, 0.729383f, 0.729318f, 0.729252f, 0.729186f, 0.729121f, 0.729055f,
+ 0.728990f, 0.728924f, 0.728858f, 0.728793f, 0.728727f, 0.728661f, 0.728596f, 0.728530f,
+ 0.728464f, 0.728399f, 0.728333f, 0.728267f, 0.728202f, 0.728136f, 0.728070f, 0.728004f,
+ 0.727939f, 0.727873f, 0.727807f, 0.727741f, 0.727676f, 0.727610f, 0.727544f, 0.727478f,
+ 0.727413f, 0.727347f, 0.727281f, 0.727215f, 0.727149f, 0.727084f, 0.727018f, 0.726952f,
+ 0.726886f, 0.726820f, 0.726754f, 0.726689f, 0.726623f, 0.726557f, 0.726491f, 0.726425f,
+ 0.726359f, 0.726293f, 0.726227f, 0.726161f, 0.726095f, 0.726030f, 0.725964f, 0.725898f,
+ 0.725832f, 0.725766f, 0.725700f, 0.725634f, 0.725568f, 0.725502f, 0.725436f, 0.725370f,
+ 0.725304f, 0.725238f, 0.725172f, 0.725106f, 0.725040f, 0.724974f, 0.724908f, 0.724842f,
+ 0.724776f, 0.724710f, 0.724644f, 0.724578f, 0.724511f, 0.724445f, 0.724379f, 0.724313f,
+ 0.724247f, 0.724181f, 0.724115f, 0.724049f, 0.723983f, 0.723916f, 0.723850f, 0.723784f,
+ 0.723718f, 0.723652f, 0.723586f, 0.723520f, 0.723453f, 0.723387f, 0.723321f, 0.723255f,
+ 0.723188f, 0.723122f, 0.723056f, 0.722990f, 0.722924f, 0.722857f, 0.722791f, 0.722725f,
+ 0.722659f, 0.722592f, 0.722526f, 0.722460f, 0.722393f, 0.722327f, 0.722261f, 0.722194f,
+ 0.722128f, 0.722062f, 0.721996f, 0.721929f, 0.721863f, 0.721797f, 0.721730f, 0.721664f,
+ 0.721597f, 0.721531f, 0.721465f, 0.721398f, 0.721332f, 0.721265f, 0.721199f, 0.721133f,
+ 0.721066f, 0.721000f, 0.720933f, 0.720867f, 0.720800f, 0.720734f, 0.720668f, 0.720601f,
+ 0.720535f, 0.720468f, 0.720402f, 0.720335f, 0.720269f, 0.720202f, 0.720136f, 0.720069f,
+ 0.720003f, 0.719936f, 0.719869f, 0.719803f, 0.719736f, 0.719670f, 0.719603f, 0.719537f,
+ 0.719470f, 0.719403f, 0.719337f, 0.719270f, 0.719204f, 0.719137f, 0.719070f, 0.719004f,
+ 0.718937f, 0.718870f, 0.718804f, 0.718737f, 0.718670f, 0.718604f, 0.718537f, 0.718471f,
+ 0.718404f, 0.718337f, 0.718270f, 0.718204f, 0.718137f, 0.718070f, 0.718004f, 0.717937f,
+ 0.717870f, 0.717803f, 0.717737f, 0.717670f, 0.717603f, 0.717536f, 0.717469f, 0.717403f,
+ 0.717336f, 0.717269f, 0.717202f, 0.717135f, 0.717069f, 0.717002f, 0.716935f, 0.716868f,
+ 0.716801f, 0.716734f, 0.716668f, 0.716601f, 0.716534f, 0.716467f, 0.716400f, 0.716333f,
+ 0.716266f, 0.716199f, 0.716132f, 0.716066f, 0.715999f, 0.715932f, 0.715865f, 0.715798f,
+ 0.715731f, 0.715664f, 0.715597f, 0.715530f, 0.715463f, 0.715396f, 0.715329f, 0.715262f,
+ 0.715195f, 0.715128f, 0.715061f, 0.714994f, 0.714927f, 0.714860f, 0.714793f, 0.714726f,
+ 0.714659f, 0.714592f, 0.714525f, 0.714457f, 0.714390f, 0.714323f, 0.714256f, 0.714189f,
+ 0.714122f, 0.714055f, 0.713988f, 0.713921f, 0.713853f, 0.713786f, 0.713719f, 0.713652f,
+ 0.713585f, 0.713518f, 0.713451f, 0.713383f, 0.713316f, 0.713249f, 0.713182f, 0.713115f,
+ 0.713047f, 0.712980f, 0.712913f, 0.712846f, 0.712778f, 0.712711f, 0.712644f, 0.712577f,
+ 0.712509f, 0.712442f, 0.712375f, 0.712308f, 0.712240f, 0.712173f, 0.712106f, 0.712038f,
+ 0.711971f, 0.711904f, 0.711836f, 0.711769f, 0.711702f, 0.711634f, 0.711567f, 0.711500f,
+ 0.711432f, 0.711365f, 0.711297f, 0.711230f, 0.711163f, 0.711095f, 0.711028f, 0.710960f,
+ 0.710893f, 0.710826f, 0.710758f, 0.710691f, 0.710623f, 0.710556f, 0.710488f, 0.710421f,
+ 0.710353f, 0.710286f, 0.710218f, 0.710151f, 0.710083f, 0.710016f, 0.709948f, 0.709881f,
+ 0.709813f, 0.709746f, 0.709678f, 0.709611f, 0.709543f, 0.709476f, 0.709408f, 0.709340f,
+ 0.709273f, 0.709205f, 0.709138f, 0.709070f, 0.709002f, 0.708935f, 0.708867f, 0.708800f,
+ 0.708732f, 0.708664f, 0.708597f, 0.708529f, 0.708461f, 0.708394f, 0.708326f, 0.708258f,
+ 0.708191f, 0.708123f, 0.708055f, 0.707988f, 0.707920f, 0.707852f, 0.707784f, 0.707717f,
+ 0.707649f, 0.707581f, 0.707513f, 0.707446f, 0.707378f, 0.707310f, 0.707242f, 0.707175f,
+ 0.707107f, 0.707039f, 0.706971f, 0.706903f, 0.706836f, 0.706768f, 0.706700f, 0.706632f,
+ 0.706564f, 0.706496f, 0.706429f, 0.706361f, 0.706293f, 0.706225f, 0.706157f, 0.706089f,
+ 0.706021f, 0.705953f, 0.705885f, 0.705818f, 0.705750f, 0.705682f, 0.705614f, 0.705546f,
+ 0.705478f, 0.705410f, 0.705342f, 0.705274f, 0.705206f, 0.705138f, 0.705070f, 0.705002f,
+ 0.704934f, 0.704866f, 0.704798f, 0.704730f, 0.704662f, 0.704594f, 0.704526f, 0.704458f,
+ 0.704390f, 0.704322f, 0.704254f, 0.704186f, 0.704118f, 0.704050f, 0.703981f, 0.703913f,
+ 0.703845f, 0.703777f, 0.703709f, 0.703641f, 0.703573f, 0.703505f, 0.703436f, 0.703368f,
+ 0.703300f, 0.703232f, 0.703164f, 0.703096f, 0.703028f, 0.702959f, 0.702891f, 0.702823f,
+ 0.702755f, 0.702687f, 0.702618f, 0.702550f, 0.702482f, 0.702414f, 0.702345f, 0.702277f,
+ 0.702209f, 0.702141f, 0.702072f, 0.702004f, 0.701936f, 0.701868f, 0.701799f, 0.701731f,
+ 0.701663f, 0.701594f, 0.701526f, 0.701458f, 0.701389f, 0.701321f, 0.701253f, 0.701184f,
+ 0.701116f, 0.701048f, 0.700979f, 0.700911f, 0.700842f, 0.700774f, 0.700706f, 0.700637f,
+ 0.700569f, 0.700500f, 0.700432f, 0.700364f, 0.700295f, 0.700227f, 0.700158f, 0.700090f,
+ 0.700021f, 0.699953f, 0.699884f, 0.699816f, 0.699747f, 0.699679f, 0.699610f, 0.699542f,
+ 0.699473f, 0.699405f, 0.699336f, 0.699268f, 0.699199f, 0.699131f, 0.699062f, 0.698994f,
+ 0.698925f, 0.698856f, 0.698788f, 0.698719f, 0.698651f, 0.698582f, 0.698513f, 0.698445f,
+ 0.698376f, 0.698308f, 0.698239f, 0.698170f, 0.698102f, 0.698033f, 0.697964f, 0.697896f,
+ 0.697827f, 0.697758f, 0.697690f, 0.697621f, 0.697552f, 0.697484f, 0.697415f, 0.697346f,
+ 0.697277f, 0.697209f, 0.697140f, 0.697071f, 0.697003f, 0.696934f, 0.696865f, 0.696796f,
+ 0.696728f, 0.696659f, 0.696590f, 0.696521f, 0.696452f, 0.696384f, 0.696315f, 0.696246f,
+ 0.696177f, 0.696108f, 0.696039f, 0.695971f, 0.695902f, 0.695833f, 0.695764f, 0.695695f,
+ 0.695626f, 0.695557f, 0.695489f, 0.695420f, 0.695351f, 0.695282f, 0.695213f, 0.695144f,
+ 0.695075f, 0.695006f, 0.694937f, 0.694868f, 0.694799f, 0.694730f, 0.694661f, 0.694592f,
+ 0.694524f, 0.694454f, 0.694386f, 0.694317f, 0.694248f, 0.694179f, 0.694109f, 0.694040f,
+ 0.693971f, 0.693902f, 0.693833f, 0.693764f, 0.693695f, 0.693626f, 0.693557f, 0.693488f,
+ 0.693419f, 0.693350f, 0.693281f, 0.693212f, 0.693143f, 0.693074f, 0.693004f, 0.692935f,
+ 0.692866f, 0.692797f, 0.692728f, 0.692659f, 0.692590f, 0.692520f, 0.692451f, 0.692382f,
+ 0.692313f, 0.692244f, 0.692175f, 0.692105f, 0.692036f, 0.691967f, 0.691898f, 0.691828f,
+ 0.691759f, 0.691690f, 0.691621f, 0.691552f, 0.691482f, 0.691413f, 0.691344f, 0.691274f,
+ 0.691205f, 0.691136f, 0.691067f, 0.690997f, 0.690928f, 0.690859f, 0.690789f, 0.690720f,
+ 0.690651f, 0.690581f, 0.690512f, 0.690443f, 0.690373f, 0.690304f, 0.690235f, 0.690165f,
+ 0.690096f, 0.690026f, 0.689957f, 0.689888f, 0.689818f, 0.689749f, 0.689679f, 0.689610f,
+ 0.689541f, 0.689471f, 0.689402f, 0.689332f, 0.689263f, 0.689193f, 0.689124f, 0.689054f,
+ 0.688985f, 0.688915f, 0.688846f, 0.688776f, 0.688707f, 0.688637f, 0.688568f, 0.688498f,
+ 0.688429f, 0.688359f, 0.688290f, 0.688220f, 0.688151f, 0.688081f, 0.688011f, 0.687942f,
+ 0.687872f, 0.687803f, 0.687733f, 0.687663f, 0.687594f, 0.687524f, 0.687455f, 0.687385f,
+ 0.687315f, 0.687246f, 0.687176f, 0.687106f, 0.687037f, 0.686967f, 0.686897f, 0.686828f,
+ 0.686758f, 0.686688f, 0.686619f, 0.686549f, 0.686479f, 0.686409f, 0.686340f, 0.686270f,
+ 0.686200f, 0.686131f, 0.686061f, 0.685991f, 0.685921f, 0.685852f, 0.685782f, 0.685712f,
+ 0.685642f, 0.685572f, 0.685503f, 0.685433f, 0.685363f, 0.685293f, 0.685223f, 0.685153f,
+ 0.685084f, 0.685014f, 0.684944f, 0.684874f, 0.684804f, 0.684734f, 0.684664f, 0.684595f,
+ 0.684525f, 0.684455f, 0.684385f, 0.684315f, 0.684245f, 0.684175f, 0.684105f, 0.684035f,
+ 0.683965f, 0.683895f, 0.683825f, 0.683756f, 0.683686f, 0.683616f, 0.683546f, 0.683476f,
+ 0.683406f, 0.683336f, 0.683266f, 0.683196f, 0.683126f, 0.683056f, 0.682986f, 0.682916f,
+ 0.682846f, 0.682775f, 0.682705f, 0.682635f, 0.682565f, 0.682495f, 0.682425f, 0.682355f,
+ 0.682285f, 0.682215f, 0.682145f, 0.682075f, 0.682005f, 0.681934f, 0.681864f, 0.681794f,
+ 0.681724f, 0.681654f, 0.681584f, 0.681514f, 0.681443f, 0.681373f, 0.681303f, 0.681233f,
+ 0.681163f, 0.681093f, 0.681022f, 0.680952f, 0.680882f, 0.680812f, 0.680741f, 0.680671f,
+ 0.680601f, 0.680531f, 0.680461f, 0.680390f, 0.680320f, 0.680250f, 0.680179f, 0.680109f,
+ 0.680039f, 0.679969f, 0.679898f, 0.679828f, 0.679758f, 0.679687f, 0.679617f, 0.679547f,
+ 0.679476f, 0.679406f, 0.679336f, 0.679265f, 0.679195f, 0.679125f, 0.679054f, 0.678984f,
+ 0.678913f, 0.678843f, 0.678773f, 0.678702f, 0.678632f, 0.678561f, 0.678491f, 0.678420f,
+ 0.678350f, 0.678280f, 0.678209f, 0.678139f, 0.678068f, 0.677998f, 0.677927f, 0.677857f,
+ 0.677786f, 0.677716f, 0.677645f, 0.677575f, 0.677504f, 0.677434f, 0.677363f, 0.677293f,
+ 0.677222f, 0.677152f, 0.677081f, 0.677011f, 0.676940f, 0.676869f, 0.676799f, 0.676728f,
+ 0.676658f, 0.676587f, 0.676516f, 0.676446f, 0.676375f, 0.676305f, 0.676234f, 0.676163f,
+ 0.676093f, 0.676022f, 0.675951f, 0.675881f, 0.675810f, 0.675739f, 0.675669f, 0.675598f,
+ 0.675527f, 0.675457f, 0.675386f, 0.675315f, 0.675245f, 0.675174f, 0.675103f, 0.675032f,
+ 0.674962f, 0.674891f, 0.674820f, 0.674749f, 0.674679f, 0.674608f, 0.674537f, 0.674466f,
+ 0.674396f, 0.674325f, 0.674254f, 0.674183f, 0.674112f, 0.674042f, 0.673971f, 0.673900f,
+ 0.673829f, 0.673758f, 0.673687f, 0.673616f, 0.673546f, 0.673475f, 0.673404f, 0.673333f,
+ 0.673262f, 0.673191f, 0.673120f, 0.673049f, 0.672978f, 0.672908f, 0.672837f, 0.672766f,
+ 0.672695f, 0.672624f, 0.672553f, 0.672482f, 0.672411f, 0.672340f, 0.672269f, 0.672198f,
+ 0.672127f, 0.672056f, 0.671985f, 0.671914f, 0.671843f, 0.671772f, 0.671701f, 0.671630f,
+ 0.671559f, 0.671488f, 0.671417f, 0.671346f, 0.671275f, 0.671204f, 0.671133f, 0.671062f,
+ 0.670990f, 0.670919f, 0.670848f, 0.670777f, 0.670706f, 0.670635f, 0.670564f, 0.670493f,
+ 0.670422f, 0.670350f, 0.670279f, 0.670208f, 0.670137f, 0.670066f, 0.669995f, 0.669923f,
+ 0.669852f, 0.669781f, 0.669710f, 0.669639f, 0.669567f, 0.669496f, 0.669425f, 0.669354f,
+ 0.669283f, 0.669211f, 0.669140f, 0.669069f, 0.668998f, 0.668926f, 0.668855f, 0.668784f,
+ 0.668712f, 0.668641f, 0.668570f, 0.668499f, 0.668427f, 0.668356f, 0.668285f, 0.668213f,
+ 0.668142f, 0.668071f, 0.667999f, 0.667928f, 0.667857f, 0.667785f, 0.667714f, 0.667643f,
+ 0.667571f, 0.667500f, 0.667428f, 0.667357f, 0.667286f, 0.667214f, 0.667143f, 0.667071f,
+ 0.667000f, 0.666928f, 0.666857f, 0.666786f, 0.666714f, 0.666643f, 0.666571f, 0.666500f,
+ 0.666428f, 0.666357f, 0.666285f, 0.666214f, 0.666142f, 0.666071f, 0.665999f, 0.665928f,
+ 0.665856f, 0.665785f, 0.665713f, 0.665642f, 0.665570f, 0.665498f, 0.665427f, 0.665355f,
+ 0.665284f, 0.665212f, 0.665141f, 0.665069f, 0.664997f, 0.664926f, 0.664854f, 0.664783f,
+ 0.664711f, 0.664639f, 0.664568f, 0.664496f, 0.664424f, 0.664353f, 0.664281f, 0.664209f,
+ 0.664138f, 0.664066f, 0.663994f, 0.663923f, 0.663851f, 0.663779f, 0.663708f, 0.663636f,
+ 0.663564f, 0.663492f, 0.663421f, 0.663349f, 0.663277f, 0.663205f, 0.663134f, 0.663062f,
+ 0.662990f, 0.662918f, 0.662847f, 0.662775f, 0.662703f, 0.662631f, 0.662559f, 0.662488f,
+ 0.662416f, 0.662344f, 0.662272f, 0.662200f, 0.662128f, 0.662057f, 0.661985f, 0.661913f,
+ 0.661841f, 0.661769f, 0.661697f, 0.661625f, 0.661553f, 0.661482f, 0.661410f, 0.661338f,
+ 0.661266f, 0.661194f, 0.661122f, 0.661050f, 0.660978f, 0.660906f, 0.660834f, 0.660762f,
+ 0.660690f, 0.660618f, 0.660546f, 0.660474f, 0.660402f, 0.660330f, 0.660258f, 0.660186f,
+ 0.660114f, 0.660042f, 0.659970f, 0.659898f, 0.659826f, 0.659754f, 0.659682f, 0.659610f,
+ 0.659538f, 0.659466f, 0.659394f, 0.659322f, 0.659250f, 0.659178f, 0.659105f, 0.659033f,
+ 0.658961f, 0.658889f, 0.658817f, 0.658745f, 0.658673f, 0.658601f, 0.658529f, 0.658456f,
+ 0.658384f, 0.658312f, 0.658240f, 0.658168f, 0.658095f, 0.658023f, 0.657951f, 0.657879f,
+ 0.657807f, 0.657734f, 0.657662f, 0.657590f, 0.657518f, 0.657446f, 0.657373f, 0.657301f,
+ 0.657229f, 0.657157f, 0.657084f, 0.657012f, 0.656940f, 0.656867f, 0.656795f, 0.656723f,
+ 0.656651f, 0.656578f, 0.656506f, 0.656434f, 0.656361f, 0.656289f, 0.656217f, 0.656144f,
+ 0.656072f, 0.656000f, 0.655927f, 0.655855f, 0.655782f, 0.655710f, 0.655638f, 0.655565f,
+ 0.655493f, 0.655420f, 0.655348f, 0.655276f, 0.655203f, 0.655131f, 0.655058f, 0.654986f,
+ 0.654913f, 0.654841f, 0.654769f, 0.654696f, 0.654624f, 0.654551f, 0.654479f, 0.654406f,
+ 0.654334f, 0.654261f, 0.654189f, 0.654116f, 0.654044f, 0.653971f, 0.653899f, 0.653826f,
+ 0.653753f, 0.653681f, 0.653608f, 0.653536f, 0.653463f, 0.653391f, 0.653318f, 0.653245f,
+ 0.653173f, 0.653100f, 0.653028f, 0.652955f, 0.652882f, 0.652810f, 0.652737f, 0.652665f,
+ 0.652592f, 0.652519f, 0.652447f, 0.652374f, 0.652301f, 0.652229f, 0.652156f, 0.652083f,
+ 0.652011f, 0.651938f, 0.651865f, 0.651792f, 0.651720f, 0.651647f, 0.651574f, 0.651502f,
+ 0.651429f, 0.651356f, 0.651283f, 0.651211f, 0.651138f, 0.651065f, 0.650992f, 0.650919f,
+ 0.650847f, 0.650774f, 0.650701f, 0.650628f, 0.650555f, 0.650483f, 0.650410f, 0.650337f,
+ 0.650264f, 0.650191f, 0.650119f, 0.650046f, 0.649973f, 0.649900f, 0.649827f, 0.649754f,
+ 0.649681f, 0.649608f, 0.649536f, 0.649463f, 0.649390f, 0.649317f, 0.649244f, 0.649171f,
+ 0.649098f, 0.649025f, 0.648952f, 0.648879f, 0.648806f, 0.648733f, 0.648660f, 0.648587f,
+ 0.648514f, 0.648441f, 0.648368f, 0.648295f, 0.648222f, 0.648149f, 0.648076f, 0.648003f,
+ 0.647930f, 0.647857f, 0.647784f, 0.647711f, 0.647638f, 0.647565f, 0.647492f, 0.647419f,
+ 0.647346f, 0.647273f, 0.647200f, 0.647127f, 0.647054f, 0.646981f, 0.646907f, 0.646834f,
+ 0.646761f, 0.646688f, 0.646615f, 0.646542f, 0.646469f, 0.646396f, 0.646322f, 0.646249f,
+ 0.646176f, 0.646103f, 0.646030f, 0.645956f, 0.645883f, 0.645810f, 0.645737f, 0.645664f,
+ 0.645590f, 0.645517f, 0.645444f, 0.645371f, 0.645298f, 0.645224f, 0.645151f, 0.645078f,
+ 0.645005f, 0.644931f, 0.644858f, 0.644785f, 0.644711f, 0.644638f, 0.644565f, 0.644492f,
+ 0.644418f, 0.644345f, 0.644272f, 0.644198f, 0.644125f, 0.644052f, 0.643978f, 0.643905f,
+ 0.643832f, 0.643758f, 0.643685f, 0.643611f, 0.643538f, 0.643465f, 0.643391f, 0.643318f,
+ 0.643245f, 0.643171f, 0.643098f, 0.643024f, 0.642951f, 0.642877f, 0.642804f, 0.642730f,
+ 0.642657f, 0.642584f, 0.642510f, 0.642437f, 0.642363f, 0.642290f, 0.642216f, 0.642143f,
+ 0.642069f, 0.641996f, 0.641922f, 0.641849f, 0.641775f, 0.641702f, 0.641628f, 0.641555f,
+ 0.641481f, 0.641407f, 0.641334f, 0.641260f, 0.641187f, 0.641113f, 0.641040f, 0.640966f,
+ 0.640892f, 0.640819f, 0.640745f, 0.640672f, 0.640598f, 0.640524f, 0.640451f, 0.640377f,
+ 0.640303f, 0.640230f, 0.640156f, 0.640083f, 0.640009f, 0.639935f, 0.639862f, 0.639788f,
+ 0.639714f, 0.639640f, 0.639567f, 0.639493f, 0.639419f, 0.639346f, 0.639272f, 0.639198f,
+ 0.639124f, 0.639051f, 0.638977f, 0.638903f, 0.638829f, 0.638756f, 0.638682f, 0.638608f,
+ 0.638534f, 0.638461f, 0.638387f, 0.638313f, 0.638239f, 0.638165f, 0.638092f, 0.638018f,
+ 0.637944f, 0.637870f, 0.637796f, 0.637722f, 0.637649f, 0.637575f, 0.637501f, 0.637427f,
+ 0.637353f, 0.637279f, 0.637205f, 0.637131f, 0.637057f, 0.636984f, 0.636910f, 0.636836f,
+ 0.636762f, 0.636688f, 0.636614f, 0.636540f, 0.636466f, 0.636392f, 0.636318f, 0.636244f,
+ 0.636170f, 0.636096f, 0.636022f, 0.635948f, 0.635874f, 0.635800f, 0.635726f, 0.635652f,
+ 0.635578f, 0.635504f, 0.635430f, 0.635356f, 0.635282f, 0.635208f, 0.635134f, 0.635060f,
+ 0.634986f, 0.634912f, 0.634838f, 0.634764f, 0.634690f, 0.634616f, 0.634542f, 0.634467f,
+ 0.634393f, 0.634319f, 0.634245f, 0.634171f, 0.634097f, 0.634023f, 0.633949f, 0.633874f,
+ 0.633800f, 0.633726f, 0.633652f, 0.633578f, 0.633504f, 0.633429f, 0.633355f, 0.633281f,
+ 0.633207f, 0.633133f, 0.633058f, 0.632984f, 0.632910f, 0.632836f, 0.632761f, 0.632687f,
+ 0.632613f, 0.632539f, 0.632464f, 0.632390f, 0.632316f, 0.632242f, 0.632167f, 0.632093f,
+ 0.632019f, 0.631944f, 0.631870f, 0.631796f, 0.631721f, 0.631647f, 0.631573f, 0.631499f,
+ 0.631424f, 0.631350f, 0.631275f, 0.631201f, 0.631127f, 0.631052f, 0.630978f, 0.630904f,
+ 0.630829f, 0.630755f, 0.630680f, 0.630606f, 0.630532f, 0.630457f, 0.630383f, 0.630308f,
+ 0.630234f, 0.630159f, 0.630085f, 0.630011f, 0.629936f, 0.629862f, 0.629787f, 0.629713f,
+ 0.629638f, 0.629564f, 0.629489f, 0.629415f, 0.629340f, 0.629266f, 0.629191f, 0.629117f,
+ 0.629042f, 0.628968f, 0.628893f, 0.628819f, 0.628744f, 0.628669f, 0.628595f, 0.628520f,
+ 0.628446f, 0.628371f, 0.628297f, 0.628222f, 0.628147f, 0.628073f, 0.627998f, 0.627924f,
+ 0.627849f, 0.627774f, 0.627700f, 0.627625f, 0.627550f, 0.627476f, 0.627401f, 0.627326f,
+ 0.627252f, 0.627177f, 0.627102f, 0.627028f, 0.626953f, 0.626878f, 0.626804f, 0.626729f,
+ 0.626654f, 0.626580f, 0.626505f, 0.626430f, 0.626355f, 0.626281f, 0.626206f, 0.626131f,
+ 0.626056f, 0.625982f, 0.625907f, 0.625832f, 0.625757f, 0.625683f, 0.625608f, 0.625533f,
+ 0.625458f, 0.625383f, 0.625309f, 0.625234f, 0.625159f, 0.625084f, 0.625009f, 0.624934f,
+ 0.624860f, 0.624785f, 0.624710f, 0.624635f, 0.624560f, 0.624485f, 0.624410f, 0.624335f,
+ 0.624260f, 0.624186f, 0.624111f, 0.624036f, 0.623961f, 0.623886f, 0.623811f, 0.623736f,
+ 0.623661f, 0.623586f, 0.623511f, 0.623436f, 0.623361f, 0.623286f, 0.623211f, 0.623136f,
+ 0.623061f, 0.622986f, 0.622911f, 0.622836f, 0.622761f, 0.622686f, 0.622611f, 0.622536f,
+ 0.622461f, 0.622386f, 0.622311f, 0.622236f, 0.622161f, 0.622086f, 0.622011f, 0.621936f,
+ 0.621861f, 0.621786f, 0.621711f, 0.621636f, 0.621560f, 0.621485f, 0.621410f, 0.621335f,
+ 0.621260f, 0.621185f, 0.621110f, 0.621035f, 0.620959f, 0.620884f, 0.620809f, 0.620734f,
+ 0.620659f, 0.620584f, 0.620508f, 0.620433f, 0.620358f, 0.620283f, 0.620208f, 0.620132f,
+ 0.620057f, 0.619982f, 0.619907f, 0.619832f, 0.619756f, 0.619681f, 0.619606f, 0.619531f,
+ 0.619455f, 0.619380f, 0.619305f, 0.619229f, 0.619154f, 0.619079f, 0.619004f, 0.618928f,
+ 0.618853f, 0.618778f, 0.618702f, 0.618627f, 0.618552f, 0.618476f, 0.618401f, 0.618326f,
+ 0.618250f, 0.618175f, 0.618100f, 0.618024f, 0.617949f, 0.617873f, 0.617798f, 0.617723f,
+ 0.617647f, 0.617572f, 0.617496f, 0.617421f, 0.617346f, 0.617270f, 0.617195f, 0.617119f,
+ 0.617044f, 0.616968f, 0.616893f, 0.616818f, 0.616742f, 0.616667f, 0.616591f, 0.616516f,
+ 0.616440f, 0.616365f, 0.616289f, 0.616214f, 0.616138f, 0.616063f, 0.615987f, 0.615912f,
+ 0.615836f, 0.615761f, 0.615685f, 0.615609f, 0.615534f, 0.615458f, 0.615383f, 0.615307f,
+ 0.615232f, 0.615156f, 0.615080f, 0.615005f, 0.614929f, 0.614854f, 0.614778f, 0.614702f,
+ 0.614627f, 0.614551f, 0.614475f, 0.614400f, 0.614324f, 0.614249f, 0.614173f, 0.614097f,
+ 0.614022f, 0.613946f, 0.613870f, 0.613795f, 0.613719f, 0.613643f, 0.613567f, 0.613492f,
+ 0.613416f, 0.613340f, 0.613265f, 0.613189f, 0.613113f, 0.613037f, 0.612962f, 0.612886f,
+ 0.612810f, 0.612734f, 0.612659f, 0.612583f, 0.612507f, 0.612431f, 0.612355f, 0.612280f,
+ 0.612204f, 0.612128f, 0.612052f, 0.611976f, 0.611901f, 0.611825f, 0.611749f, 0.611673f,
+ 0.611597f, 0.611521f, 0.611445f, 0.611370f, 0.611294f, 0.611218f, 0.611142f, 0.611066f,
+ 0.610990f, 0.610914f, 0.610838f, 0.610762f, 0.610687f, 0.610611f, 0.610535f, 0.610459f,
+ 0.610383f, 0.610307f, 0.610231f, 0.610155f, 0.610079f, 0.610003f, 0.609927f, 0.609851f,
+ 0.609775f, 0.609699f, 0.609623f, 0.609547f, 0.609471f, 0.609395f, 0.609319f, 0.609243f,
+ 0.609167f, 0.609091f, 0.609015f, 0.608939f, 0.608863f, 0.608787f, 0.608711f, 0.608635f,
+ 0.608559f, 0.608482f, 0.608406f, 0.608330f, 0.608254f, 0.608178f, 0.608102f, 0.608026f,
+ 0.607950f, 0.607874f, 0.607798f, 0.607721f, 0.607645f, 0.607569f, 0.607493f, 0.607417f,
+ 0.607341f, 0.607264f, 0.607188f, 0.607112f, 0.607036f, 0.606960f, 0.606884f, 0.606807f,
+ 0.606731f, 0.606655f, 0.606579f, 0.606502f, 0.606426f, 0.606350f, 0.606274f, 0.606198f,
+ 0.606121f, 0.606045f, 0.605969f, 0.605892f, 0.605816f, 0.605740f, 0.605664f, 0.605587f,
+ 0.605511f, 0.605435f, 0.605358f, 0.605282f, 0.605206f, 0.605129f, 0.605053f, 0.604977f,
+ 0.604900f, 0.604824f, 0.604748f, 0.604671f, 0.604595f, 0.604519f, 0.604442f, 0.604366f,
+ 0.604290f, 0.604213f, 0.604137f, 0.604060f, 0.603984f, 0.603908f, 0.603831f, 0.603755f,
+ 0.603678f, 0.603602f, 0.603525f, 0.603449f, 0.603372f, 0.603296f, 0.603220f, 0.603143f,
+ 0.603067f, 0.602990f, 0.602914f, 0.602837f, 0.602761f, 0.602684f, 0.602608f, 0.602531f,
+ 0.602455f, 0.602378f, 0.602302f, 0.602225f, 0.602148f, 0.602072f, 0.601995f, 0.601919f,
+ 0.601842f, 0.601766f, 0.601689f, 0.601613f, 0.601536f, 0.601459f, 0.601383f, 0.601306f,
+ 0.601230f, 0.601153f, 0.601076f, 0.601000f, 0.600923f, 0.600846f, 0.600770f, 0.600693f,
+ 0.600616f, 0.600540f, 0.600463f, 0.600387f, 0.600310f, 0.600233f, 0.600156f, 0.600080f,
+ 0.600003f, 0.599926f, 0.599850f, 0.599773f, 0.599696f, 0.599620f, 0.599543f, 0.599466f,
+ 0.599389f, 0.599313f, 0.599236f, 0.599159f, 0.599082f, 0.599006f, 0.598929f, 0.598852f,
+ 0.598775f, 0.598698f, 0.598622f, 0.598545f, 0.598468f, 0.598391f, 0.598314f, 0.598238f,
+ 0.598161f, 0.598084f, 0.598007f, 0.597930f, 0.597853f, 0.597776f, 0.597700f, 0.597623f,
+ 0.597546f, 0.597469f, 0.597392f, 0.597315f, 0.597238f, 0.597161f, 0.597085f, 0.597008f,
+ 0.596931f, 0.596854f, 0.596777f, 0.596700f, 0.596623f, 0.596546f, 0.596469f, 0.596392f,
+ 0.596315f, 0.596238f, 0.596161f, 0.596084f, 0.596007f, 0.595930f, 0.595853f, 0.595776f,
+ 0.595699f, 0.595622f, 0.595545f, 0.595468f, 0.595391f, 0.595314f, 0.595237f, 0.595160f,
+ 0.595083f, 0.595006f, 0.594929f, 0.594852f, 0.594775f, 0.594698f, 0.594621f, 0.594544f,
+ 0.594467f, 0.594389f, 0.594312f, 0.594235f, 0.594158f, 0.594081f, 0.594004f, 0.593927f,
+ 0.593850f, 0.593772f, 0.593695f, 0.593618f, 0.593541f, 0.593464f, 0.593387f, 0.593309f,
+ 0.593232f, 0.593155f, 0.593078f, 0.593001f, 0.592924f, 0.592846f, 0.592769f, 0.592692f,
+ 0.592615f, 0.592537f, 0.592460f, 0.592383f, 0.592306f, 0.592228f, 0.592151f, 0.592074f,
+ 0.591997f, 0.591919f, 0.591842f, 0.591765f, 0.591688f, 0.591610f, 0.591533f, 0.591456f,
+ 0.591378f, 0.591301f, 0.591224f, 0.591146f, 0.591069f, 0.590992f, 0.590914f, 0.590837f,
+ 0.590760f, 0.590682f, 0.590605f, 0.590528f, 0.590450f, 0.590373f, 0.590295f, 0.590218f,
+ 0.590141f, 0.590063f, 0.589986f, 0.589908f, 0.589831f, 0.589754f, 0.589676f, 0.589599f,
+ 0.589521f, 0.589444f, 0.589366f, 0.589289f, 0.589212f, 0.589134f, 0.589057f, 0.588979f,
+ 0.588902f, 0.588824f, 0.588747f, 0.588669f, 0.588592f, 0.588514f, 0.588437f, 0.588359f,
+ 0.588282f, 0.588204f, 0.588126f, 0.588049f, 0.587971f, 0.587894f, 0.587816f, 0.587739f,
+ 0.587661f, 0.587584f, 0.587506f, 0.587428f, 0.587351f, 0.587273f, 0.587196f, 0.587118f,
+ 0.587040f, 0.586963f, 0.586885f, 0.586808f, 0.586730f, 0.586652f, 0.586575f, 0.586497f,
+ 0.586419f, 0.586342f, 0.586264f, 0.586186f, 0.586109f, 0.586031f, 0.585953f, 0.585876f,
+ 0.585798f, 0.585720f, 0.585642f, 0.585565f, 0.585487f, 0.585409f, 0.585332f, 0.585254f,
+ 0.585176f, 0.585098f, 0.585021f, 0.584943f, 0.584865f, 0.584787f, 0.584710f, 0.584632f,
+ 0.584554f, 0.584476f, 0.584398f, 0.584321f, 0.584243f, 0.584165f, 0.584087f, 0.584009f,
+ 0.583931f, 0.583854f, 0.583776f, 0.583698f, 0.583620f, 0.583542f, 0.583464f, 0.583387f,
+ 0.583309f, 0.583231f, 0.583153f, 0.583075f, 0.582997f, 0.582919f, 0.582841f, 0.582763f,
+ 0.582685f, 0.582608f, 0.582530f, 0.582452f, 0.582374f, 0.582296f, 0.582218f, 0.582140f,
+ 0.582062f, 0.581984f, 0.581906f, 0.581828f, 0.581750f, 0.581672f, 0.581594f, 0.581516f,
+ 0.581438f, 0.581360f, 0.581282f, 0.581204f, 0.581126f, 0.581048f, 0.580970f, 0.580892f,
+ 0.580814f, 0.580736f, 0.580658f, 0.580580f, 0.580502f, 0.580424f, 0.580346f, 0.580267f,
+ 0.580189f, 0.580111f, 0.580033f, 0.579955f, 0.579877f, 0.579799f, 0.579721f, 0.579643f,
+ 0.579565f, 0.579486f, 0.579408f, 0.579330f, 0.579252f, 0.579174f, 0.579096f, 0.579018f,
+ 0.578939f, 0.578861f, 0.578783f, 0.578705f, 0.578627f, 0.578548f, 0.578470f, 0.578392f,
+ 0.578314f, 0.578236f, 0.578157f, 0.578079f, 0.578001f, 0.577923f, 0.577844f, 0.577766f,
+ 0.577688f, 0.577610f, 0.577531f, 0.577453f, 0.577375f, 0.577297f, 0.577218f, 0.577140f,
+ 0.577062f, 0.576983f, 0.576905f, 0.576827f, 0.576748f, 0.576670f, 0.576592f, 0.576513f,
+ 0.576435f, 0.576357f, 0.576278f, 0.576200f, 0.576122f, 0.576043f, 0.575965f, 0.575887f,
+ 0.575808f, 0.575730f, 0.575651f, 0.575573f, 0.575495f, 0.575416f, 0.575338f, 0.575259f,
+ 0.575181f, 0.575103f, 0.575024f, 0.574946f, 0.574867f, 0.574789f, 0.574710f, 0.574632f,
+ 0.574553f, 0.574475f, 0.574396f, 0.574318f, 0.574239f, 0.574161f, 0.574082f, 0.574004f,
+ 0.573925f, 0.573847f, 0.573768f, 0.573690f, 0.573611f, 0.573533f, 0.573454f, 0.573376f,
+ 0.573297f, 0.573219f, 0.573140f, 0.573061f, 0.572983f, 0.572904f, 0.572826f, 0.572747f,
+ 0.572669f, 0.572590f, 0.572511f, 0.572433f, 0.572354f, 0.572276f, 0.572197f, 0.572118f,
+ 0.572040f, 0.571961f, 0.571882f, 0.571804f, 0.571725f, 0.571646f, 0.571568f, 0.571489f,
+ 0.571410f, 0.571332f, 0.571253f, 0.571174f, 0.571096f, 0.571017f, 0.570938f, 0.570859f,
+ 0.570781f, 0.570702f, 0.570623f, 0.570545f, 0.570466f, 0.570387f, 0.570308f, 0.570230f,
+ 0.570151f, 0.570072f, 0.569993f, 0.569914f, 0.569836f, 0.569757f, 0.569678f, 0.569599f,
+ 0.569521f, 0.569442f, 0.569363f, 0.569284f, 0.569205f, 0.569126f, 0.569048f, 0.568969f,
+ 0.568890f, 0.568811f, 0.568732f, 0.568653f, 0.568574f, 0.568496f, 0.568417f, 0.568338f,
+ 0.568259f, 0.568180f, 0.568101f, 0.568022f, 0.567943f, 0.567864f, 0.567786f, 0.567707f,
+ 0.567628f, 0.567549f, 0.567470f, 0.567391f, 0.567312f, 0.567233f, 0.567154f, 0.567075f,
+ 0.566996f, 0.566917f, 0.566838f, 0.566759f, 0.566680f, 0.566601f, 0.566522f, 0.566443f,
+ 0.566364f, 0.566285f, 0.566206f, 0.566127f, 0.566048f, 0.565969f, 0.565890f, 0.565811f,
+ 0.565732f, 0.565653f, 0.565574f, 0.565495f, 0.565416f, 0.565336f, 0.565257f, 0.565178f,
+ 0.565099f, 0.565020f, 0.564941f, 0.564862f, 0.564783f, 0.564704f, 0.564624f, 0.564545f,
+ 0.564466f, 0.564387f, 0.564308f, 0.564229f, 0.564150f, 0.564070f, 0.563991f, 0.563912f,
+ 0.563833f, 0.563754f, 0.563675f, 0.563595f, 0.563516f, 0.563437f, 0.563358f, 0.563279f,
+ 0.563199f, 0.563120f, 0.563041f, 0.562962f, 0.562882f, 0.562803f, 0.562724f, 0.562645f,
+ 0.562565f, 0.562486f, 0.562407f, 0.562328f, 0.562248f, 0.562169f, 0.562090f, 0.562010f,
+ 0.561931f, 0.561852f, 0.561773f, 0.561693f, 0.561614f, 0.561535f, 0.561455f, 0.561376f,
+ 0.561297f, 0.561217f, 0.561138f, 0.561058f, 0.560979f, 0.560900f, 0.560820f, 0.560741f,
+ 0.560662f, 0.560582f, 0.560503f, 0.560423f, 0.560344f, 0.560265f, 0.560185f, 0.560106f,
+ 0.560026f, 0.559947f, 0.559867f, 0.559788f, 0.559709f, 0.559629f, 0.559550f, 0.559470f,
+ 0.559391f, 0.559311f, 0.559232f, 0.559152f, 0.559073f, 0.558993f, 0.558914f, 0.558834f,
+ 0.558755f, 0.558675f, 0.558596f, 0.558516f, 0.558437f, 0.558357f, 0.558278f, 0.558198f,
+ 0.558119f, 0.558039f, 0.557959f, 0.557880f, 0.557800f, 0.557721f, 0.557641f, 0.557562f,
+ 0.557482f, 0.557402f, 0.557323f, 0.557243f, 0.557164f, 0.557084f, 0.557004f, 0.556925f,
+ 0.556845f, 0.556765f, 0.556686f, 0.556606f, 0.556526f, 0.556447f, 0.556367f, 0.556287f,
+ 0.556208f, 0.556128f, 0.556048f, 0.555969f, 0.555889f, 0.555809f, 0.555730f, 0.555650f,
+ 0.555570f, 0.555490f, 0.555411f, 0.555331f, 0.555251f, 0.555172f, 0.555092f, 0.555012f,
+ 0.554932f, 0.554853f, 0.554773f, 0.554693f, 0.554613f, 0.554533f, 0.554454f, 0.554374f,
+ 0.554294f, 0.554214f, 0.554134f, 0.554055f, 0.553975f, 0.553895f, 0.553815f, 0.553735f,
+ 0.553656f, 0.553576f, 0.553496f, 0.553416f, 0.553336f, 0.553256f, 0.553176f, 0.553097f,
+ 0.553017f, 0.552937f, 0.552857f, 0.552777f, 0.552697f, 0.552617f, 0.552537f, 0.552457f,
+ 0.552378f, 0.552298f, 0.552218f, 0.552138f, 0.552058f, 0.551978f, 0.551898f, 0.551818f,
+ 0.551738f, 0.551658f, 0.551578f, 0.551498f, 0.551418f, 0.551338f, 0.551258f, 0.551178f,
+ 0.551098f, 0.551018f, 0.550938f, 0.550858f, 0.550778f, 0.550698f, 0.550618f, 0.550538f,
+ 0.550458f, 0.550378f, 0.550298f, 0.550218f, 0.550138f, 0.550058f, 0.549978f, 0.549898f,
+ 0.549818f, 0.549737f, 0.549657f, 0.549577f, 0.549497f, 0.549417f, 0.549337f, 0.549257f,
+ 0.549177f, 0.549097f, 0.549016f, 0.548936f, 0.548856f, 0.548776f, 0.548696f, 0.548616f,
+ 0.548536f, 0.548455f, 0.548375f, 0.548295f, 0.548215f, 0.548135f, 0.548054f, 0.547974f,
+ 0.547894f, 0.547814f, 0.547734f, 0.547653f, 0.547573f, 0.547493f, 0.547413f, 0.547333f,
+ 0.547252f, 0.547172f, 0.547092f, 0.547011f, 0.546931f, 0.546851f, 0.546771f, 0.546690f,
+ 0.546610f, 0.546530f, 0.546450f, 0.546369f, 0.546289f, 0.546209f, 0.546128f, 0.546048f,
+ 0.545968f, 0.545887f, 0.545807f, 0.545727f, 0.545646f, 0.545566f, 0.545486f, 0.545405f,
+ 0.545325f, 0.545245f, 0.545164f, 0.545084f, 0.545003f, 0.544923f, 0.544843f, 0.544762f,
+ 0.544682f, 0.544602f, 0.544521f, 0.544441f, 0.544360f, 0.544280f, 0.544199f, 0.544119f,
+ 0.544039f, 0.543958f, 0.543878f, 0.543797f, 0.543717f, 0.543636f, 0.543556f, 0.543475f,
+ 0.543395f, 0.543314f, 0.543234f, 0.543153f, 0.543073f, 0.542992f, 0.542912f, 0.542831f,
+ 0.542751f, 0.542670f, 0.542590f, 0.542509f, 0.542429f, 0.542348f, 0.542268f, 0.542187f,
+ 0.542106f, 0.542026f, 0.541945f, 0.541865f, 0.541784f, 0.541704f, 0.541623f, 0.541542f,
+ 0.541462f, 0.541381f, 0.541301f, 0.541220f, 0.541139f, 0.541059f, 0.540978f, 0.540897f,
+ 0.540817f, 0.540736f, 0.540655f, 0.540575f, 0.540494f, 0.540413f, 0.540333f, 0.540252f,
+ 0.540171f, 0.540091f, 0.540010f, 0.539929f, 0.539849f, 0.539768f, 0.539687f, 0.539607f,
+ 0.539526f, 0.539445f, 0.539364f, 0.539284f, 0.539203f, 0.539122f, 0.539041f, 0.538961f,
+ 0.538880f, 0.538799f, 0.538718f, 0.538638f, 0.538557f, 0.538476f, 0.538395f, 0.538314f,
+ 0.538234f, 0.538153f, 0.538072f, 0.537991f, 0.537910f, 0.537830f, 0.537749f, 0.537668f,
+ 0.537587f, 0.537506f, 0.537425f, 0.537345f, 0.537264f, 0.537183f, 0.537102f, 0.537021f,
+ 0.536940f, 0.536859f, 0.536778f, 0.536698f, 0.536617f, 0.536536f, 0.536455f, 0.536374f,
+ 0.536293f, 0.536212f, 0.536131f, 0.536050f, 0.535969f, 0.535888f, 0.535807f, 0.535726f,
+ 0.535645f, 0.535564f, 0.535484f, 0.535403f, 0.535322f, 0.535241f, 0.535160f, 0.535079f,
+ 0.534998f, 0.534917f, 0.534836f, 0.534755f, 0.534674f, 0.534593f, 0.534512f, 0.534431f,
+ 0.534349f, 0.534268f, 0.534187f, 0.534106f, 0.534025f, 0.533944f, 0.533863f, 0.533782f,
+ 0.533701f, 0.533620f, 0.533539f, 0.533458f, 0.533377f, 0.533296f, 0.533214f, 0.533133f,
+ 0.533052f, 0.532971f, 0.532890f, 0.532809f, 0.532728f, 0.532647f, 0.532565f, 0.532484f,
+ 0.532403f, 0.532322f, 0.532241f, 0.532160f, 0.532078f, 0.531997f, 0.531916f, 0.531835f,
+ 0.531754f, 0.531673f, 0.531591f, 0.531510f, 0.531429f, 0.531348f, 0.531266f, 0.531185f,
+ 0.531104f, 0.531023f, 0.530942f, 0.530860f, 0.530779f, 0.530698f, 0.530617f, 0.530535f,
+ 0.530454f, 0.530373f, 0.530291f, 0.530210f, 0.530129f, 0.530048f, 0.529966f, 0.529885f,
+ 0.529804f, 0.529722f, 0.529641f, 0.529560f, 0.529478f, 0.529397f, 0.529316f, 0.529234f,
+ 0.529153f, 0.529072f, 0.528990f, 0.528909f, 0.528828f, 0.528746f, 0.528665f, 0.528583f,
+ 0.528502f, 0.528421f, 0.528339f, 0.528258f, 0.528176f, 0.528095f, 0.528014f, 0.527932f,
+ 0.527851f, 0.527769f, 0.527688f, 0.527606f, 0.527525f, 0.527444f, 0.527362f, 0.527281f,
+ 0.527199f, 0.527118f, 0.527036f, 0.526955f, 0.526873f, 0.526792f, 0.526710f, 0.526629f,
+ 0.526547f, 0.526466f, 0.526384f, 0.526303f, 0.526221f, 0.526140f, 0.526058f, 0.525977f,
+ 0.525895f, 0.525813f, 0.525732f, 0.525650f, 0.525569f, 0.525487f, 0.525406f, 0.525324f,
+ 0.525243f, 0.525161f, 0.525079f, 0.524998f, 0.524916f, 0.524835f, 0.524753f, 0.524671f,
+ 0.524590f, 0.524508f, 0.524426f, 0.524345f, 0.524263f, 0.524181f, 0.524100f, 0.524018f,
+ 0.523937f, 0.523855f, 0.523773f, 0.523692f, 0.523610f, 0.523528f, 0.523447f, 0.523365f,
+ 0.523283f, 0.523201f, 0.523120f, 0.523038f, 0.522956f, 0.522875f, 0.522793f, 0.522711f,
+ 0.522629f, 0.522548f, 0.522466f, 0.522384f, 0.522302f, 0.522221f, 0.522139f, 0.522057f,
+ 0.521975f, 0.521894f, 0.521812f, 0.521730f, 0.521648f, 0.521566f, 0.521485f, 0.521403f,
+ 0.521321f, 0.521239f, 0.521157f, 0.521075f, 0.520994f, 0.520912f, 0.520830f, 0.520748f,
+ 0.520666f, 0.520584f, 0.520503f, 0.520421f, 0.520339f, 0.520257f, 0.520175f, 0.520093f,
+ 0.520011f, 0.519929f, 0.519848f, 0.519766f, 0.519684f, 0.519602f, 0.519520f, 0.519438f,
+ 0.519356f, 0.519274f, 0.519192f, 0.519110f, 0.519028f, 0.518946f, 0.518864f, 0.518782f,
+ 0.518700f, 0.518618f, 0.518536f, 0.518454f, 0.518372f, 0.518291f, 0.518209f, 0.518126f,
+ 0.518045f, 0.517963f, 0.517880f, 0.517798f, 0.517716f, 0.517634f, 0.517552f, 0.517470f,
+ 0.517388f, 0.517306f, 0.517224f, 0.517142f, 0.517060f, 0.516978f, 0.516896f, 0.516814f,
+ 0.516732f, 0.516650f, 0.516568f, 0.516486f, 0.516403f, 0.516321f, 0.516239f, 0.516157f,
+ 0.516075f, 0.515993f, 0.515911f, 0.515829f, 0.515746f, 0.515664f, 0.515582f, 0.515500f,
+ 0.515418f, 0.515336f, 0.515254f, 0.515171f, 0.515089f, 0.515007f, 0.514925f, 0.514843f,
+ 0.514760f, 0.514678f, 0.514596f, 0.514514f, 0.514432f, 0.514349f, 0.514267f, 0.514185f,
+ 0.514103f, 0.514021f, 0.513938f, 0.513856f, 0.513774f, 0.513692f, 0.513609f, 0.513527f,
+ 0.513445f, 0.513362f, 0.513280f, 0.513198f, 0.513116f, 0.513033f, 0.512951f, 0.512869f,
+ 0.512786f, 0.512704f, 0.512622f, 0.512539f, 0.512457f, 0.512375f, 0.512292f, 0.512210f,
+ 0.512128f, 0.512045f, 0.511963f, 0.511881f, 0.511798f, 0.511716f, 0.511634f, 0.511551f,
+ 0.511469f, 0.511386f, 0.511304f, 0.511222f, 0.511139f, 0.511057f, 0.510974f, 0.510892f,
+ 0.510810f, 0.510727f, 0.510645f, 0.510562f, 0.510480f, 0.510397f, 0.510315f, 0.510233f,
+ 0.510150f, 0.510068f, 0.509985f, 0.509903f, 0.509820f, 0.509738f, 0.509655f, 0.509573f,
+ 0.509490f, 0.509408f, 0.509325f, 0.509243f, 0.509160f, 0.509078f, 0.508995f, 0.508913f,
+ 0.508830f, 0.508748f, 0.508665f, 0.508583f, 0.508500f, 0.508417f, 0.508335f, 0.508252f,
+ 0.508170f, 0.508087f, 0.508005f, 0.507922f, 0.507839f, 0.507757f, 0.507674f, 0.507592f,
+ 0.507509f, 0.507426f, 0.507344f, 0.507261f, 0.507179f, 0.507096f, 0.507013f, 0.506931f,
+ 0.506848f, 0.506765f, 0.506683f, 0.506600f, 0.506517f, 0.506435f, 0.506352f, 0.506269f,
+ 0.506187f, 0.506104f, 0.506021f, 0.505939f, 0.505856f, 0.505773f, 0.505690f, 0.505608f,
+ 0.505525f, 0.505442f, 0.505360f, 0.505277f, 0.505194f, 0.505111f, 0.505029f, 0.504946f,
+ 0.504863f, 0.504780f, 0.504698f, 0.504615f, 0.504532f, 0.504449f, 0.504366f, 0.504284f,
+ 0.504201f, 0.504118f, 0.504035f, 0.503953f, 0.503870f, 0.503787f, 0.503704f, 0.503621f,
+ 0.503538f, 0.503456f, 0.503373f, 0.503290f, 0.503207f, 0.503124f, 0.503041f, 0.502958f,
+ 0.502876f, 0.502793f, 0.502710f, 0.502627f, 0.502544f, 0.502461f, 0.502378f, 0.502295f,
+ 0.502212f, 0.502130f, 0.502047f, 0.501964f, 0.501881f, 0.501798f, 0.501715f, 0.501632f,
+ 0.501549f, 0.501466f, 0.501383f, 0.501300f, 0.501217f, 0.501134f, 0.501051f, 0.500968f,
+ 0.500885f, 0.500802f, 0.500719f, 0.500636f, 0.500553f, 0.500470f, 0.500387f, 0.500304f,
+ 0.500221f, 0.500138f, 0.500055f, 0.499972f, 0.499889f, 0.499806f, 0.499723f, 0.499640f,
+ 0.499557f, 0.499474f, 0.499391f, 0.499308f, 0.499225f, 0.499142f, 0.499059f, 0.498976f,
+ 0.498893f, 0.498809f, 0.498726f, 0.498643f, 0.498560f, 0.498477f, 0.498394f, 0.498311f,
+ 0.498228f, 0.498145f, 0.498061f, 0.497978f, 0.497895f, 0.497812f, 0.497729f, 0.497646f,
+ 0.497562f, 0.497479f, 0.497396f, 0.497313f, 0.497230f, 0.497147f, 0.497063f, 0.496980f,
+ 0.496897f, 0.496814f, 0.496731f, 0.496647f, 0.496564f, 0.496481f, 0.496398f, 0.496315f,
+ 0.496231f, 0.496148f, 0.496065f, 0.495982f, 0.495898f, 0.495815f, 0.495732f, 0.495649f,
+ 0.495565f, 0.495482f, 0.495399f, 0.495315f, 0.495232f, 0.495149f, 0.495066f, 0.494982f,
+ 0.494899f, 0.494816f, 0.494732f, 0.494649f, 0.494566f, 0.494482f, 0.494399f, 0.494316f,
+ 0.494232f, 0.494149f, 0.494066f, 0.493982f, 0.493899f, 0.493816f, 0.493732f, 0.493649f,
+ 0.493565f, 0.493482f, 0.493399f, 0.493315f, 0.493232f, 0.493148f, 0.493065f, 0.492982f,
+ 0.492898f, 0.492815f, 0.492731f, 0.492648f, 0.492564f, 0.492481f, 0.492398f, 0.492314f,
+ 0.492231f, 0.492147f, 0.492064f, 0.491980f, 0.491897f, 0.491813f, 0.491730f, 0.491646f,
+ 0.491563f, 0.491479f, 0.491396f, 0.491312f, 0.491229f, 0.491145f, 0.491062f, 0.490978f,
+ 0.490895f, 0.490811f, 0.490728f, 0.490644f, 0.490561f, 0.490477f, 0.490394f, 0.490310f,
+ 0.490226f, 0.490143f, 0.490059f, 0.489976f, 0.489892f, 0.489809f, 0.489725f, 0.489641f,
+ 0.489558f, 0.489474f, 0.489391f, 0.489307f, 0.489223f, 0.489140f, 0.489056f, 0.488973f,
+ 0.488889f, 0.488805f, 0.488722f, 0.488638f, 0.488554f, 0.488471f, 0.488387f, 0.488303f,
+ 0.488220f, 0.488136f, 0.488052f, 0.487969f, 0.487885f, 0.487801f, 0.487718f, 0.487634f,
+ 0.487550f, 0.487466f, 0.487383f, 0.487299f, 0.487215f, 0.487132f, 0.487048f, 0.486964f,
+ 0.486880f, 0.486797f, 0.486713f, 0.486629f, 0.486545f, 0.486462f, 0.486378f, 0.486294f,
+ 0.486210f, 0.486126f, 0.486043f, 0.485959f, 0.485875f, 0.485791f, 0.485708f, 0.485624f,
+ 0.485540f, 0.485456f, 0.485372f, 0.485288f, 0.485205f, 0.485121f, 0.485037f, 0.484953f,
+ 0.484869f, 0.484785f, 0.484702f, 0.484618f, 0.484534f, 0.484450f, 0.484366f, 0.484282f,
+ 0.484198f, 0.484114f, 0.484031f, 0.483947f, 0.483863f, 0.483779f, 0.483695f, 0.483611f,
+ 0.483527f, 0.483443f, 0.483359f, 0.483275f, 0.483191f, 0.483107f, 0.483023f, 0.482940f,
+ 0.482856f, 0.482772f, 0.482688f, 0.482604f, 0.482520f, 0.482436f, 0.482352f, 0.482268f,
+ 0.482184f, 0.482100f, 0.482016f, 0.481932f, 0.481848f, 0.481764f, 0.481680f, 0.481596f,
+ 0.481512f, 0.481428f, 0.481344f, 0.481260f, 0.481176f, 0.481091f, 0.481007f, 0.480923f,
+ 0.480839f, 0.480755f, 0.480671f, 0.480587f, 0.480503f, 0.480419f, 0.480335f, 0.480251f,
+ 0.480167f, 0.480083f, 0.479998f, 0.479914f, 0.479830f, 0.479746f, 0.479662f, 0.479578f,
+ 0.479494f, 0.479410f, 0.479325f, 0.479241f, 0.479157f, 0.479073f, 0.478989f, 0.478905f,
+ 0.478821f, 0.478736f, 0.478652f, 0.478568f, 0.478484f, 0.478400f, 0.478315f, 0.478231f,
+ 0.478147f, 0.478063f, 0.477979f, 0.477894f, 0.477810f, 0.477726f, 0.477642f, 0.477558f,
+ 0.477473f, 0.477389f, 0.477305f, 0.477221f, 0.477136f, 0.477052f, 0.476968f, 0.476884f,
+ 0.476799f, 0.476715f, 0.476631f, 0.476546f, 0.476462f, 0.476378f, 0.476294f, 0.476209f,
+ 0.476125f, 0.476041f, 0.475956f, 0.475872f, 0.475788f, 0.475703f, 0.475619f, 0.475535f,
+ 0.475450f, 0.475366f, 0.475282f, 0.475197f, 0.475113f, 0.475029f, 0.474944f, 0.474860f,
+ 0.474775f, 0.474691f, 0.474607f, 0.474522f, 0.474438f, 0.474353f, 0.474269f, 0.474185f,
+ 0.474100f, 0.474016f, 0.473931f, 0.473847f, 0.473763f, 0.473678f, 0.473594f, 0.473509f,
+ 0.473425f, 0.473340f, 0.473256f, 0.473171f, 0.473087f, 0.473002f, 0.472918f, 0.472834f,
+ 0.472749f, 0.472665f, 0.472580f, 0.472496f, 0.472411f, 0.472327f, 0.472242f, 0.472158f,
+ 0.472073f, 0.471988f, 0.471904f, 0.471819f, 0.471735f, 0.471650f, 0.471566f, 0.471481f,
+ 0.471397f, 0.471312f, 0.471228f, 0.471143f, 0.471058f, 0.470974f, 0.470889f, 0.470805f,
+ 0.470720f, 0.470636f, 0.470551f, 0.470466f, 0.470382f, 0.470297f, 0.470213f, 0.470128f,
+ 0.470043f, 0.469959f, 0.469874f, 0.469789f, 0.469705f, 0.469620f, 0.469536f, 0.469451f,
+ 0.469366f, 0.469282f, 0.469197f, 0.469112f, 0.469028f, 0.468943f, 0.468858f, 0.468774f,
+ 0.468689f, 0.468604f, 0.468519f, 0.468435f, 0.468350f, 0.468265f, 0.468181f, 0.468096f,
+ 0.468011f, 0.467926f, 0.467842f, 0.467757f, 0.467672f, 0.467587f, 0.467503f, 0.467418f,
+ 0.467333f, 0.467248f, 0.467164f, 0.467079f, 0.466994f, 0.466909f, 0.466825f, 0.466740f,
+ 0.466655f, 0.466570f, 0.466485f, 0.466401f, 0.466316f, 0.466231f, 0.466146f, 0.466061f,
+ 0.465977f, 0.465892f, 0.465807f, 0.465722f, 0.465637f, 0.465552f, 0.465467f, 0.465383f,
+ 0.465298f, 0.465213f, 0.465128f, 0.465043f, 0.464958f, 0.464873f, 0.464788f, 0.464704f,
+ 0.464619f, 0.464534f, 0.464449f, 0.464364f, 0.464279f, 0.464194f, 0.464109f, 0.464024f,
+ 0.463939f, 0.463854f, 0.463769f, 0.463685f, 0.463600f, 0.463515f, 0.463430f, 0.463345f,
+ 0.463260f, 0.463175f, 0.463090f, 0.463005f, 0.462920f, 0.462835f, 0.462750f, 0.462665f,
+ 0.462580f, 0.462495f, 0.462410f, 0.462325f, 0.462240f, 0.462155f, 0.462070f, 0.461985f,
+ 0.461900f, 0.461815f, 0.461730f, 0.461645f, 0.461560f, 0.461475f, 0.461390f, 0.461304f,
+ 0.461219f, 0.461134f, 0.461049f, 0.460964f, 0.460879f, 0.460794f, 0.460709f, 0.460624f,
+ 0.460539f, 0.460454f, 0.460369f, 0.460283f, 0.460198f, 0.460113f, 0.460028f, 0.459943f,
+ 0.459858f, 0.459773f, 0.459687f, 0.459602f, 0.459517f, 0.459432f, 0.459347f, 0.459262f,
+ 0.459177f, 0.459091f, 0.459006f, 0.458921f, 0.458836f, 0.458751f, 0.458665f, 0.458580f,
+ 0.458495f, 0.458410f, 0.458325f, 0.458239f, 0.458154f, 0.458069f, 0.457984f, 0.457899f,
+ 0.457813f, 0.457728f, 0.457643f, 0.457558f, 0.457472f, 0.457387f, 0.457302f, 0.457217f,
+ 0.457131f, 0.457046f, 0.456961f, 0.456875f, 0.456790f, 0.456705f, 0.456620f, 0.456534f,
+ 0.456449f, 0.456364f, 0.456278f, 0.456193f, 0.456108f, 0.456022f, 0.455937f, 0.455852f,
+ 0.455766f, 0.455681f, 0.455596f, 0.455510f, 0.455425f, 0.455340f, 0.455254f, 0.455169f,
+ 0.455084f, 0.454998f, 0.454913f, 0.454827f, 0.454742f, 0.454657f, 0.454571f, 0.454486f,
+ 0.454400f, 0.454315f, 0.454230f, 0.454144f, 0.454059f, 0.453973f, 0.453888f, 0.453803f,
+ 0.453717f, 0.453632f, 0.453546f, 0.453461f, 0.453375f, 0.453290f, 0.453204f, 0.453119f,
+ 0.453033f, 0.452948f, 0.452863f, 0.452777f, 0.452692f, 0.452606f, 0.452521f, 0.452435f,
+ 0.452350f, 0.452264f, 0.452179f, 0.452093f, 0.452008f, 0.451922f, 0.451836f, 0.451751f,
+ 0.451665f, 0.451580f, 0.451494f, 0.451409f, 0.451323f, 0.451238f, 0.451152f, 0.451067f,
+ 0.450981f, 0.450895f, 0.450810f, 0.450724f, 0.450639f, 0.450553f, 0.450467f, 0.450382f,
+ 0.450296f, 0.450211f, 0.450125f, 0.450039f, 0.449954f, 0.449868f, 0.449783f, 0.449697f,
+ 0.449611f, 0.449526f, 0.449440f, 0.449354f, 0.449269f, 0.449183f, 0.449097f, 0.449012f,
+ 0.448926f, 0.448840f, 0.448755f, 0.448669f, 0.448583f, 0.448498f, 0.448412f, 0.448326f,
+ 0.448241f, 0.448155f, 0.448069f, 0.447983f, 0.447898f, 0.447812f, 0.447726f, 0.447641f,
+ 0.447555f, 0.447469f, 0.447383f, 0.447298f, 0.447212f, 0.447126f, 0.447040f, 0.446955f,
+ 0.446869f, 0.446783f, 0.446697f, 0.446612f, 0.446526f, 0.446440f, 0.446354f, 0.446268f,
+ 0.446183f, 0.446097f, 0.446011f, 0.445925f, 0.445839f, 0.445754f, 0.445668f, 0.445582f,
+ 0.445496f, 0.445410f, 0.445324f, 0.445239f, 0.445153f, 0.445067f, 0.444981f, 0.444895f,
+ 0.444809f, 0.444723f, 0.444637f, 0.444552f, 0.444466f, 0.444380f, 0.444294f, 0.444208f,
+ 0.444122f, 0.444036f, 0.443950f, 0.443864f, 0.443779f, 0.443693f, 0.443607f, 0.443521f,
+ 0.443435f, 0.443349f, 0.443263f, 0.443177f, 0.443091f, 0.443005f, 0.442919f, 0.442833f,
+ 0.442747f, 0.442661f, 0.442575f, 0.442489f, 0.442403f, 0.442317f, 0.442231f, 0.442145f,
+ 0.442059f, 0.441973f, 0.441887f, 0.441801f, 0.441715f, 0.441629f, 0.441543f, 0.441457f,
+ 0.441371f, 0.441285f, 0.441199f, 0.441113f, 0.441027f, 0.440941f, 0.440855f, 0.440769f,
+ 0.440683f, 0.440597f, 0.440511f, 0.440425f, 0.440339f, 0.440253f, 0.440166f, 0.440080f,
+ 0.439994f, 0.439908f, 0.439822f, 0.439736f, 0.439650f, 0.439564f, 0.439478f, 0.439392f,
+ 0.439305f, 0.439219f, 0.439133f, 0.439047f, 0.438961f, 0.438875f, 0.438789f, 0.438702f,
+ 0.438616f, 0.438530f, 0.438444f, 0.438358f, 0.438272f, 0.438185f, 0.438099f, 0.438013f,
+ 0.437927f, 0.437841f, 0.437754f, 0.437668f, 0.437582f, 0.437496f, 0.437410f, 0.437323f,
+ 0.437237f, 0.437151f, 0.437065f, 0.436978f, 0.436892f, 0.436806f, 0.436720f, 0.436633f,
+ 0.436547f, 0.436461f, 0.436375f, 0.436288f, 0.436202f, 0.436116f, 0.436030f, 0.435943f,
+ 0.435857f, 0.435771f, 0.435685f, 0.435598f, 0.435512f, 0.435426f, 0.435339f, 0.435253f,
+ 0.435167f, 0.435080f, 0.434994f, 0.434908f, 0.434821f, 0.434735f, 0.434649f, 0.434562f,
+ 0.434476f, 0.434390f, 0.434303f, 0.434217f, 0.434131f, 0.434044f, 0.433958f, 0.433871f,
+ 0.433785f, 0.433699f, 0.433612f, 0.433526f, 0.433439f, 0.433353f, 0.433267f, 0.433180f,
+ 0.433094f, 0.433007f, 0.432921f, 0.432835f, 0.432748f, 0.432662f, 0.432575f, 0.432489f,
+ 0.432402f, 0.432316f, 0.432229f, 0.432143f, 0.432057f, 0.431970f, 0.431884f, 0.431797f,
+ 0.431711f, 0.431624f, 0.431538f, 0.431451f, 0.431365f, 0.431278f, 0.431192f, 0.431105f,
+ 0.431019f, 0.430932f, 0.430846f, 0.430759f, 0.430673f, 0.430586f, 0.430500f, 0.430413f,
+ 0.430326f, 0.430240f, 0.430153f, 0.430067f, 0.429980f, 0.429894f, 0.429807f, 0.429721f,
+ 0.429634f, 0.429547f, 0.429461f, 0.429374f, 0.429288f, 0.429201f, 0.429114f, 0.429028f,
+ 0.428941f, 0.428855f, 0.428768f, 0.428681f, 0.428595f, 0.428508f, 0.428422f, 0.428335f,
+ 0.428248f, 0.428162f, 0.428075f, 0.427988f, 0.427902f, 0.427815f, 0.427728f, 0.427642f,
+ 0.427555f, 0.427468f, 0.427382f, 0.427295f, 0.427208f, 0.427122f, 0.427035f, 0.426948f,
+ 0.426862f, 0.426775f, 0.426688f, 0.426601f, 0.426515f, 0.426428f, 0.426341f, 0.426255f,
+ 0.426168f, 0.426081f, 0.425994f, 0.425908f, 0.425821f, 0.425734f, 0.425647f, 0.425561f,
+ 0.425474f, 0.425387f, 0.425300f, 0.425214f, 0.425127f, 0.425040f, 0.424953f, 0.424866f,
+ 0.424780f, 0.424693f, 0.424606f, 0.424519f, 0.424432f, 0.424346f, 0.424259f, 0.424172f,
+ 0.424085f, 0.423998f, 0.423912f, 0.423825f, 0.423738f, 0.423651f, 0.423564f, 0.423477f,
+ 0.423390f, 0.423304f, 0.423217f, 0.423130f, 0.423043f, 0.422956f, 0.422869f, 0.422782f,
+ 0.422695f, 0.422609f, 0.422522f, 0.422435f, 0.422348f, 0.422261f, 0.422174f, 0.422087f,
+ 0.422000f, 0.421913f, 0.421826f, 0.421739f, 0.421653f, 0.421566f, 0.421479f, 0.421392f,
+ 0.421305f, 0.421218f, 0.421131f, 0.421044f, 0.420957f, 0.420870f, 0.420783f, 0.420696f,
+ 0.420609f, 0.420522f, 0.420435f, 0.420348f, 0.420261f, 0.420174f, 0.420087f, 0.420000f,
+ 0.419913f, 0.419826f, 0.419739f, 0.419652f, 0.419565f, 0.419478f, 0.419391f, 0.419304f,
+ 0.419217f, 0.419130f, 0.419043f, 0.418956f, 0.418869f, 0.418782f, 0.418695f, 0.418608f,
+ 0.418520f, 0.418433f, 0.418346f, 0.418259f, 0.418172f, 0.418085f, 0.417998f, 0.417911f,
+ 0.417824f, 0.417737f, 0.417650f, 0.417562f, 0.417475f, 0.417388f, 0.417301f, 0.417214f,
+ 0.417127f, 0.417040f, 0.416952f, 0.416865f, 0.416778f, 0.416691f, 0.416604f, 0.416517f,
+ 0.416430f, 0.416342f, 0.416255f, 0.416168f, 0.416081f, 0.415994f, 0.415906f, 0.415819f,
+ 0.415732f, 0.415645f, 0.415558f, 0.415471f, 0.415383f, 0.415296f, 0.415209f, 0.415122f,
+ 0.415034f, 0.414947f, 0.414860f, 0.414773f, 0.414685f, 0.414598f, 0.414511f, 0.414424f,
+ 0.414337f, 0.414249f, 0.414162f, 0.414075f, 0.413987f, 0.413900f, 0.413813f, 0.413726f,
+ 0.413638f, 0.413551f, 0.413464f, 0.413376f, 0.413289f, 0.413202f, 0.413115f, 0.413027f,
+ 0.412940f, 0.412853f, 0.412765f, 0.412678f, 0.412591f, 0.412503f, 0.412416f, 0.412329f,
+ 0.412241f, 0.412154f, 0.412067f, 0.411979f, 0.411892f, 0.411804f, 0.411717f, 0.411630f,
+ 0.411542f, 0.411455f, 0.411368f, 0.411280f, 0.411193f, 0.411105f, 0.411018f, 0.410931f,
+ 0.410843f, 0.410756f, 0.410668f, 0.410581f, 0.410493f, 0.410406f, 0.410319f, 0.410231f,
+ 0.410144f, 0.410056f, 0.409969f, 0.409881f, 0.409794f, 0.409707f, 0.409619f, 0.409532f,
+ 0.409444f, 0.409357f, 0.409269f, 0.409182f, 0.409094f, 0.409007f, 0.408919f, 0.408832f,
+ 0.408744f, 0.408657f, 0.408569f, 0.408482f, 0.408394f, 0.408307f, 0.408219f, 0.408132f,
+ 0.408044f, 0.407957f, 0.407869f, 0.407782f, 0.407694f, 0.407606f, 0.407519f, 0.407431f,
+ 0.407344f, 0.407256f, 0.407169f, 0.407081f, 0.406994f, 0.406906f, 0.406818f, 0.406731f,
+ 0.406643f, 0.406556f, 0.406468f, 0.406380f, 0.406293f, 0.406205f, 0.406118f, 0.406030f,
+ 0.405942f, 0.405855f, 0.405767f, 0.405680f, 0.405592f, 0.405504f, 0.405417f, 0.405329f,
+ 0.405241f, 0.405154f, 0.405066f, 0.404978f, 0.404891f, 0.404803f, 0.404715f, 0.404628f,
+ 0.404540f, 0.404452f, 0.404365f, 0.404277f, 0.404189f, 0.404102f, 0.404014f, 0.403926f,
+ 0.403838f, 0.403751f, 0.403663f, 0.403575f, 0.403488f, 0.403400f, 0.403312f, 0.403224f,
+ 0.403137f, 0.403049f, 0.402961f, 0.402873f, 0.402786f, 0.402698f, 0.402610f, 0.402522f,
+ 0.402435f, 0.402347f, 0.402259f, 0.402171f, 0.402084f, 0.401996f, 0.401908f, 0.401820f,
+ 0.401732f, 0.401645f, 0.401557f, 0.401469f, 0.401381f, 0.401293f, 0.401206f, 0.401118f,
+ 0.401030f, 0.400942f, 0.400854f, 0.400766f, 0.400679f, 0.400591f, 0.400503f, 0.400415f,
+ 0.400327f, 0.400239f, 0.400151f, 0.400064f, 0.399976f, 0.399888f, 0.399800f, 0.399712f,
+ 0.399624f, 0.399536f, 0.399448f, 0.399361f, 0.399273f, 0.399185f, 0.399097f, 0.399009f,
+ 0.398921f, 0.398833f, 0.398745f, 0.398657f, 0.398569f, 0.398481f, 0.398393f, 0.398306f,
+ 0.398218f, 0.398130f, 0.398042f, 0.397954f, 0.397866f, 0.397778f, 0.397690f, 0.397602f,
+ 0.397514f, 0.397426f, 0.397338f, 0.397250f, 0.397162f, 0.397074f, 0.396986f, 0.396898f,
+ 0.396810f, 0.396722f, 0.396634f, 0.396546f, 0.396458f, 0.396370f, 0.396282f, 0.396194f,
+ 0.396106f, 0.396018f, 0.395930f, 0.395842f, 0.395754f, 0.395666f, 0.395578f, 0.395490f,
+ 0.395401f, 0.395313f, 0.395225f, 0.395137f, 0.395049f, 0.394961f, 0.394873f, 0.394785f,
+ 0.394697f, 0.394609f, 0.394521f, 0.394433f, 0.394344f, 0.394256f, 0.394168f, 0.394080f,
+ 0.393992f, 0.393904f, 0.393816f, 0.393728f, 0.393640f, 0.393551f, 0.393463f, 0.393375f,
+ 0.393287f, 0.393199f, 0.393111f, 0.393023f, 0.392934f, 0.392846f, 0.392758f, 0.392670f,
+ 0.392582f, 0.392493f, 0.392405f, 0.392317f, 0.392229f, 0.392141f, 0.392053f, 0.391964f,
+ 0.391876f, 0.391788f, 0.391700f, 0.391612f, 0.391523f, 0.391435f, 0.391347f, 0.391259f,
+ 0.391170f, 0.391082f, 0.390994f, 0.390906f, 0.390817f, 0.390729f, 0.390641f, 0.390553f,
+ 0.390464f, 0.390376f, 0.390288f, 0.390200f, 0.390111f, 0.390023f, 0.389935f, 0.389846f,
+ 0.389758f, 0.389670f, 0.389582f, 0.389493f, 0.389405f, 0.389317f, 0.389228f, 0.389140f,
+ 0.389052f, 0.388963f, 0.388875f, 0.388787f, 0.388698f, 0.388610f, 0.388522f, 0.388433f,
+ 0.388345f, 0.388257f, 0.388168f, 0.388080f, 0.387992f, 0.387903f, 0.387815f, 0.387727f,
+ 0.387638f, 0.387550f, 0.387461f, 0.387373f, 0.387285f, 0.387196f, 0.387108f, 0.387019f,
+ 0.386931f, 0.386843f, 0.386754f, 0.386666f, 0.386577f, 0.386489f, 0.386400f, 0.386312f,
+ 0.386224f, 0.386135f, 0.386047f, 0.385958f, 0.385870f, 0.385781f, 0.385693f, 0.385605f,
+ 0.385516f, 0.385428f, 0.385339f, 0.385251f, 0.385162f, 0.385074f, 0.384985f, 0.384897f,
+ 0.384808f, 0.384720f, 0.384631f, 0.384543f, 0.384454f, 0.384366f, 0.384277f, 0.384189f,
+ 0.384100f, 0.384012f, 0.383923f, 0.383835f, 0.383746f, 0.383658f, 0.383569f, 0.383480f,
+ 0.383392f, 0.383303f, 0.383215f, 0.383126f, 0.383038f, 0.382949f, 0.382861f, 0.382772f,
+ 0.382683f, 0.382595f, 0.382506f, 0.382418f, 0.382329f, 0.382241f, 0.382152f, 0.382063f,
+ 0.381975f, 0.381886f, 0.381797f, 0.381709f, 0.381620f, 0.381532f, 0.381443f, 0.381354f,
+ 0.381266f, 0.381177f, 0.381088f, 0.381000f, 0.380911f, 0.380823f, 0.380734f, 0.380645f,
+ 0.380557f, 0.380468f, 0.380379f, 0.380291f, 0.380202f, 0.380113f, 0.380025f, 0.379936f,
+ 0.379847f, 0.379759f, 0.379670f, 0.379581f, 0.379492f, 0.379404f, 0.379315f, 0.379226f,
+ 0.379138f, 0.379049f, 0.378960f, 0.378871f, 0.378783f, 0.378694f, 0.378605f, 0.378516f,
+ 0.378428f, 0.378339f, 0.378250f, 0.378162f, 0.378073f, 0.377984f, 0.377895f, 0.377806f,
+ 0.377718f, 0.377629f, 0.377540f, 0.377451f, 0.377363f, 0.377274f, 0.377185f, 0.377096f,
+ 0.377007f, 0.376919f, 0.376830f, 0.376741f, 0.376652f, 0.376563f, 0.376475f, 0.376386f,
+ 0.376297f, 0.376208f, 0.376119f, 0.376030f, 0.375942f, 0.375853f, 0.375764f, 0.375675f,
+ 0.375586f, 0.375497f, 0.375408f, 0.375320f, 0.375231f, 0.375142f, 0.375053f, 0.374964f,
+ 0.374875f, 0.374786f, 0.374697f, 0.374609f, 0.374520f, 0.374431f, 0.374342f, 0.374253f,
+ 0.374164f, 0.374075f, 0.373986f, 0.373897f, 0.373808f, 0.373719f, 0.373631f, 0.373542f,
+ 0.373453f, 0.373364f, 0.373275f, 0.373186f, 0.373097f, 0.373008f, 0.372919f, 0.372830f,
+ 0.372741f, 0.372652f, 0.372563f, 0.372474f, 0.372385f, 0.372296f, 0.372207f, 0.372118f,
+ 0.372029f, 0.371940f, 0.371851f, 0.371762f, 0.371673f, 0.371584f, 0.371495f, 0.371406f,
+ 0.371317f, 0.371228f, 0.371139f, 0.371050f, 0.370961f, 0.370872f, 0.370783f, 0.370694f,
+ 0.370605f, 0.370516f, 0.370427f, 0.370338f, 0.370249f, 0.370160f, 0.370071f, 0.369982f,
+ 0.369892f, 0.369803f, 0.369714f, 0.369625f, 0.369536f, 0.369447f, 0.369358f, 0.369269f,
+ 0.369180f, 0.369091f, 0.369002f, 0.368912f, 0.368823f, 0.368734f, 0.368645f, 0.368556f,
+ 0.368467f, 0.368378f, 0.368289f, 0.368199f, 0.368110f, 0.368021f, 0.367932f, 0.367843f,
+ 0.367754f, 0.367665f, 0.367575f, 0.367486f, 0.367397f, 0.367308f, 0.367219f, 0.367130f,
+ 0.367040f, 0.366951f, 0.366862f, 0.366773f, 0.366684f, 0.366594f, 0.366505f, 0.366416f,
+ 0.366327f, 0.366238f, 0.366148f, 0.366059f, 0.365970f, 0.365881f, 0.365791f, 0.365702f,
+ 0.365613f, 0.365524f, 0.365435f, 0.365345f, 0.365256f, 0.365167f, 0.365078f, 0.364988f,
+ 0.364899f, 0.364810f, 0.364720f, 0.364631f, 0.364542f, 0.364453f, 0.364363f, 0.364274f,
+ 0.364185f, 0.364096f, 0.364006f, 0.363917f, 0.363828f, 0.363738f, 0.363649f, 0.363560f,
+ 0.363470f, 0.363381f, 0.363292f, 0.363202f, 0.363113f, 0.363024f, 0.362934f, 0.362845f,
+ 0.362756f, 0.362666f, 0.362577f, 0.362488f, 0.362398f, 0.362309f, 0.362220f, 0.362130f,
+ 0.362041f, 0.361952f, 0.361862f, 0.361773f, 0.361683f, 0.361594f, 0.361505f, 0.361415f,
+ 0.361326f, 0.361236f, 0.361147f, 0.361058f, 0.360968f, 0.360879f, 0.360789f, 0.360700f,
+ 0.360611f, 0.360521f, 0.360432f, 0.360342f, 0.360253f, 0.360163f, 0.360074f, 0.359984f,
+ 0.359895f, 0.359806f, 0.359716f, 0.359627f, 0.359537f, 0.359448f, 0.359358f, 0.359269f,
+ 0.359179f, 0.359090f, 0.359000f, 0.358911f, 0.358821f, 0.358732f, 0.358642f, 0.358553f,
+ 0.358463f, 0.358374f, 0.358284f, 0.358195f, 0.358105f, 0.358016f, 0.357926f, 0.357837f,
+ 0.357747f, 0.357658f, 0.357568f, 0.357479f, 0.357389f, 0.357300f, 0.357210f, 0.357121f,
+ 0.357031f, 0.356941f, 0.356852f, 0.356762f, 0.356673f, 0.356583f, 0.356494f, 0.356404f,
+ 0.356314f, 0.356225f, 0.356135f, 0.356046f, 0.355956f, 0.355866f, 0.355777f, 0.355687f,
+ 0.355598f, 0.355508f, 0.355418f, 0.355329f, 0.355239f, 0.355150f, 0.355060f, 0.354970f,
+ 0.354881f, 0.354791f, 0.354701f, 0.354612f, 0.354522f, 0.354432f, 0.354343f, 0.354253f,
+ 0.354164f, 0.354074f, 0.353984f, 0.353895f, 0.353805f, 0.353715f, 0.353626f, 0.353536f,
+ 0.353446f, 0.353356f, 0.353267f, 0.353177f, 0.353087f, 0.352998f, 0.352908f, 0.352818f,
+ 0.352729f, 0.352639f, 0.352549f, 0.352459f, 0.352370f, 0.352280f, 0.352190f, 0.352100f,
+ 0.352011f, 0.351921f, 0.351831f, 0.351742f, 0.351652f, 0.351562f, 0.351472f, 0.351383f,
+ 0.351293f, 0.351203f, 0.351113f, 0.351023f, 0.350934f, 0.350844f, 0.350754f, 0.350664f,
+ 0.350575f, 0.350485f, 0.350395f, 0.350305f, 0.350215f, 0.350126f, 0.350036f, 0.349946f,
+ 0.349856f, 0.349766f, 0.349676f, 0.349587f, 0.349497f, 0.349407f, 0.349317f, 0.349227f,
+ 0.349138f, 0.349048f, 0.348958f, 0.348868f, 0.348778f, 0.348688f, 0.348598f, 0.348509f,
+ 0.348419f, 0.348329f, 0.348239f, 0.348149f, 0.348059f, 0.347969f, 0.347879f, 0.347790f,
+ 0.347700f, 0.347610f, 0.347520f, 0.347430f, 0.347340f, 0.347250f, 0.347160f, 0.347070f,
+ 0.346980f, 0.346890f, 0.346801f, 0.346711f, 0.346621f, 0.346531f, 0.346441f, 0.346351f,
+ 0.346261f, 0.346171f, 0.346081f, 0.345991f, 0.345901f, 0.345811f, 0.345721f, 0.345631f,
+ 0.345541f, 0.345451f, 0.345361f, 0.345271f, 0.345181f, 0.345091f, 0.345001f, 0.344911f,
+ 0.344821f, 0.344731f, 0.344641f, 0.344551f, 0.344461f, 0.344371f, 0.344281f, 0.344191f,
+ 0.344101f, 0.344011f, 0.343921f, 0.343831f, 0.343741f, 0.343651f, 0.343561f, 0.343471f,
+ 0.343381f, 0.343291f, 0.343201f, 0.343111f, 0.343021f, 0.342931f, 0.342841f, 0.342751f,
+ 0.342661f, 0.342571f, 0.342481f, 0.342391f, 0.342300f, 0.342210f, 0.342120f, 0.342030f,
+ 0.341940f, 0.341850f, 0.341760f, 0.341670f, 0.341580f, 0.341490f, 0.341399f, 0.341309f,
+ 0.341219f, 0.341129f, 0.341039f, 0.340949f, 0.340859f, 0.340769f, 0.340678f, 0.340588f,
+ 0.340498f, 0.340408f, 0.340318f, 0.340228f, 0.340138f, 0.340047f, 0.339957f, 0.339867f,
+ 0.339777f, 0.339687f, 0.339597f, 0.339506f, 0.339416f, 0.339326f, 0.339236f, 0.339146f,
+ 0.339055f, 0.338965f, 0.338875f, 0.338785f, 0.338695f, 0.338604f, 0.338514f, 0.338424f,
+ 0.338334f, 0.338244f, 0.338153f, 0.338063f, 0.337973f, 0.337883f, 0.337792f, 0.337702f,
+ 0.337612f, 0.337522f, 0.337431f, 0.337341f, 0.337251f, 0.337161f, 0.337070f, 0.336980f,
+ 0.336890f, 0.336800f, 0.336709f, 0.336619f, 0.336529f, 0.336438f, 0.336348f, 0.336258f,
+ 0.336168f, 0.336077f, 0.335987f, 0.335897f, 0.335806f, 0.335716f, 0.335626f, 0.335535f,
+ 0.335445f, 0.335355f, 0.335265f, 0.335174f, 0.335084f, 0.334994f, 0.334903f, 0.334813f,
+ 0.334722f, 0.334632f, 0.334542f, 0.334451f, 0.334361f, 0.334271f, 0.334180f, 0.334090f,
+ 0.334000f, 0.333909f, 0.333819f, 0.333729f, 0.333638f, 0.333548f, 0.333457f, 0.333367f,
+ 0.333277f, 0.333186f, 0.333096f, 0.333005f, 0.332915f, 0.332825f, 0.332734f, 0.332644f,
+ 0.332553f, 0.332463f, 0.332373f, 0.332282f, 0.332192f, 0.332101f, 0.332011f, 0.331920f,
+ 0.331830f, 0.331739f, 0.331649f, 0.331559f, 0.331468f, 0.331378f, 0.331287f, 0.331197f,
+ 0.331106f, 0.331016f, 0.330925f, 0.330835f, 0.330744f, 0.330654f, 0.330563f, 0.330473f,
+ 0.330382f, 0.330292f, 0.330202f, 0.330111f, 0.330020f, 0.329930f, 0.329839f, 0.329749f,
+ 0.329658f, 0.329568f, 0.329477f, 0.329387f, 0.329296f, 0.329206f, 0.329115f, 0.329025f,
+ 0.328934f, 0.328844f, 0.328753f, 0.328663f, 0.328572f, 0.328482f, 0.328391f, 0.328300f,
+ 0.328210f, 0.328119f, 0.328029f, 0.327938f, 0.327848f, 0.327757f, 0.327666f, 0.327576f,
+ 0.327485f, 0.327395f, 0.327304f, 0.327213f, 0.327123f, 0.327032f, 0.326942f, 0.326851f,
+ 0.326760f, 0.326670f, 0.326579f, 0.326489f, 0.326398f, 0.326307f, 0.326217f, 0.326126f,
+ 0.326035f, 0.325945f, 0.325854f, 0.325764f, 0.325673f, 0.325582f, 0.325492f, 0.325401f,
+ 0.325310f, 0.325220f, 0.325129f, 0.325038f, 0.324948f, 0.324857f, 0.324766f, 0.324676f,
+ 0.324585f, 0.324494f, 0.324404f, 0.324313f, 0.324222f, 0.324131f, 0.324041f, 0.323950f,
+ 0.323859f, 0.323769f, 0.323678f, 0.323587f, 0.323497f, 0.323406f, 0.323315f, 0.323224f,
+ 0.323134f, 0.323043f, 0.322952f, 0.322861f, 0.322771f, 0.322680f, 0.322589f, 0.322498f,
+ 0.322408f, 0.322317f, 0.322226f, 0.322135f, 0.322045f, 0.321954f, 0.321863f, 0.321772f,
+ 0.321682f, 0.321591f, 0.321500f, 0.321409f, 0.321318f, 0.321228f, 0.321137f, 0.321046f,
+ 0.320955f, 0.320864f, 0.320774f, 0.320683f, 0.320592f, 0.320501f, 0.320410f, 0.320320f,
+ 0.320229f, 0.320138f, 0.320047f, 0.319956f, 0.319865f, 0.319775f, 0.319684f, 0.319593f,
+ 0.319502f, 0.319411f, 0.319320f, 0.319229f, 0.319139f, 0.319048f, 0.318957f, 0.318866f,
+ 0.318775f, 0.318684f, 0.318593f, 0.318503f, 0.318412f, 0.318321f, 0.318230f, 0.318139f,
+ 0.318048f, 0.317957f, 0.317866f, 0.317775f, 0.317684f, 0.317594f, 0.317503f, 0.317412f,
+ 0.317321f, 0.317230f, 0.317139f, 0.317048f, 0.316957f, 0.316866f, 0.316775f, 0.316684f,
+ 0.316593f, 0.316502f, 0.316411f, 0.316321f, 0.316230f, 0.316139f, 0.316048f, 0.315957f,
+ 0.315866f, 0.315775f, 0.315684f, 0.315593f, 0.315502f, 0.315411f, 0.315320f, 0.315229f,
+ 0.315138f, 0.315047f, 0.314956f, 0.314865f, 0.314774f, 0.314683f, 0.314592f, 0.314501f,
+ 0.314410f, 0.314319f, 0.314228f, 0.314137f, 0.314046f, 0.313955f, 0.313864f, 0.313773f,
+ 0.313682f, 0.313591f, 0.313500f, 0.313409f, 0.313318f, 0.313227f, 0.313135f, 0.313044f,
+ 0.312953f, 0.312862f, 0.312771f, 0.312680f, 0.312589f, 0.312498f, 0.312407f, 0.312316f,
+ 0.312225f, 0.312134f, 0.312043f, 0.311952f, 0.311860f, 0.311769f, 0.311678f, 0.311587f,
+ 0.311496f, 0.311405f, 0.311314f, 0.311223f, 0.311132f, 0.311041f, 0.310949f, 0.310858f,
+ 0.310767f, 0.310676f, 0.310585f, 0.310494f, 0.310403f, 0.310311f, 0.310220f, 0.310129f,
+ 0.310038f, 0.309947f, 0.309856f, 0.309765f, 0.309673f, 0.309582f, 0.309491f, 0.309400f,
+ 0.309309f, 0.309218f, 0.309126f, 0.309035f, 0.308944f, 0.308853f, 0.308762f, 0.308670f,
+ 0.308579f, 0.308488f, 0.308397f, 0.308306f, 0.308214f, 0.308123f, 0.308032f, 0.307941f,
+ 0.307850f, 0.307758f, 0.307667f, 0.307576f, 0.307485f, 0.307394f, 0.307302f, 0.307211f,
+ 0.307120f, 0.307029f, 0.306937f, 0.306846f, 0.306755f, 0.306664f, 0.306572f, 0.306481f,
+ 0.306390f, 0.306299f, 0.306207f, 0.306116f, 0.306025f, 0.305933f, 0.305842f, 0.305751f,
+ 0.305660f, 0.305568f, 0.305477f, 0.305386f, 0.305294f, 0.305203f, 0.305112f, 0.305021f,
+ 0.304929f, 0.304838f, 0.304747f, 0.304655f, 0.304564f, 0.304473f, 0.304381f, 0.304290f,
+ 0.304199f, 0.304107f, 0.304016f, 0.303925f, 0.303833f, 0.303742f, 0.303651f, 0.303559f,
+ 0.303468f, 0.303377f, 0.303285f, 0.303194f, 0.303103f, 0.303011f, 0.302920f, 0.302828f,
+ 0.302737f, 0.302646f, 0.302554f, 0.302463f, 0.302372f, 0.302280f, 0.302189f, 0.302097f,
+ 0.302006f, 0.301915f, 0.301823f, 0.301732f, 0.301640f, 0.301549f, 0.301458f, 0.301366f,
+ 0.301275f, 0.301183f, 0.301092f, 0.301000f, 0.300909f, 0.300818f, 0.300726f, 0.300635f,
+ 0.300543f, 0.300452f, 0.300360f, 0.300269f, 0.300177f, 0.300086f, 0.299995f, 0.299903f,
+ 0.299812f, 0.299720f, 0.299629f, 0.299537f, 0.299446f, 0.299354f, 0.299263f, 0.299171f,
+ 0.299080f, 0.298988f, 0.298897f, 0.298805f, 0.298714f, 0.298622f, 0.298531f, 0.298439f,
+ 0.298348f, 0.298256f, 0.298165f, 0.298073f, 0.297982f, 0.297890f, 0.297799f, 0.297707f,
+ 0.297616f, 0.297524f, 0.297433f, 0.297341f, 0.297250f, 0.297158f, 0.297066f, 0.296975f,
+ 0.296883f, 0.296792f, 0.296700f, 0.296609f, 0.296517f, 0.296426f, 0.296334f, 0.296242f,
+ 0.296151f, 0.296059f, 0.295968f, 0.295876f, 0.295785f, 0.295693f, 0.295601f, 0.295510f,
+ 0.295418f, 0.295327f, 0.295235f, 0.295143f, 0.295052f, 0.294960f, 0.294869f, 0.294777f,
+ 0.294685f, 0.294594f, 0.294502f, 0.294410f, 0.294319f, 0.294227f, 0.294136f, 0.294044f,
+ 0.293952f, 0.293861f, 0.293769f, 0.293677f, 0.293586f, 0.293494f, 0.293402f, 0.293311f,
+ 0.293219f, 0.293128f, 0.293036f, 0.292944f, 0.292852f, 0.292761f, 0.292669f, 0.292577f,
+ 0.292486f, 0.292394f, 0.292302f, 0.292211f, 0.292119f, 0.292027f, 0.291936f, 0.291844f,
+ 0.291752f, 0.291661f, 0.291569f, 0.291477f, 0.291385f, 0.291294f, 0.291202f, 0.291110f,
+ 0.291019f, 0.290927f, 0.290835f, 0.290743f, 0.290652f, 0.290560f, 0.290468f, 0.290376f,
+ 0.290285f, 0.290193f, 0.290101f, 0.290009f, 0.289918f, 0.289826f, 0.289734f, 0.289642f,
+ 0.289551f, 0.289459f, 0.289367f, 0.289275f, 0.289184f, 0.289092f, 0.289000f, 0.288908f,
+ 0.288816f, 0.288725f, 0.288633f, 0.288541f, 0.288449f, 0.288357f, 0.288266f, 0.288174f,
+ 0.288082f, 0.287990f, 0.287898f, 0.287807f, 0.287715f, 0.287623f, 0.287531f, 0.287439f,
+ 0.287347f, 0.287256f, 0.287164f, 0.287072f, 0.286980f, 0.286888f, 0.286796f, 0.286705f,
+ 0.286613f, 0.286521f, 0.286429f, 0.286337f, 0.286245f, 0.286153f, 0.286062f, 0.285970f,
+ 0.285878f, 0.285786f, 0.285694f, 0.285602f, 0.285510f, 0.285418f, 0.285327f, 0.285235f,
+ 0.285143f, 0.285051f, 0.284959f, 0.284867f, 0.284775f, 0.284683f, 0.284591f, 0.284499f,
+ 0.284408f, 0.284316f, 0.284224f, 0.284132f, 0.284040f, 0.283948f, 0.283856f, 0.283764f,
+ 0.283672f, 0.283580f, 0.283488f, 0.283396f, 0.283304f, 0.283212f, 0.283120f, 0.283029f,
+ 0.282937f, 0.282845f, 0.282753f, 0.282661f, 0.282569f, 0.282477f, 0.282385f, 0.282293f,
+ 0.282201f, 0.282109f, 0.282017f, 0.281925f, 0.281833f, 0.281741f, 0.281649f, 0.281557f,
+ 0.281465f, 0.281373f, 0.281281f, 0.281189f, 0.281097f, 0.281005f, 0.280913f, 0.280821f,
+ 0.280729f, 0.280637f, 0.280545f, 0.280453f, 0.280361f, 0.280269f, 0.280177f, 0.280085f,
+ 0.279993f, 0.279901f, 0.279809f, 0.279717f, 0.279624f, 0.279532f, 0.279440f, 0.279348f,
+ 0.279256f, 0.279164f, 0.279072f, 0.278980f, 0.278888f, 0.278796f, 0.278704f, 0.278612f,
+ 0.278520f, 0.278428f, 0.278336f, 0.278243f, 0.278151f, 0.278059f, 0.277967f, 0.277875f,
+ 0.277783f, 0.277691f, 0.277599f, 0.277507f, 0.277415f, 0.277322f, 0.277230f, 0.277138f,
+ 0.277046f, 0.276954f, 0.276862f, 0.276770f, 0.276678f, 0.276585f, 0.276493f, 0.276401f,
+ 0.276309f, 0.276217f, 0.276125f, 0.276033f, 0.275940f, 0.275848f, 0.275756f, 0.275664f,
+ 0.275572f, 0.275480f, 0.275387f, 0.275295f, 0.275203f, 0.275111f, 0.275019f, 0.274927f,
+ 0.274834f, 0.274742f, 0.274650f, 0.274558f, 0.274466f, 0.274374f, 0.274281f, 0.274189f,
+ 0.274097f, 0.274005f, 0.273912f, 0.273820f, 0.273728f, 0.273636f, 0.273544f, 0.273451f,
+ 0.273359f, 0.273267f, 0.273175f, 0.273083f, 0.272990f, 0.272898f, 0.272806f, 0.272714f,
+ 0.272621f, 0.272529f, 0.272437f, 0.272345f, 0.272252f, 0.272160f, 0.272068f, 0.271976f,
+ 0.271883f, 0.271791f, 0.271699f, 0.271607f, 0.271514f, 0.271422f, 0.271330f, 0.271237f,
+ 0.271145f, 0.271053f, 0.270961f, 0.270868f, 0.270776f, 0.270684f, 0.270591f, 0.270499f,
+ 0.270407f, 0.270315f, 0.270222f, 0.270130f, 0.270038f, 0.269945f, 0.269853f, 0.269761f,
+ 0.269668f, 0.269576f, 0.269484f, 0.269391f, 0.269299f, 0.269207f, 0.269114f, 0.269022f,
+ 0.268930f, 0.268837f, 0.268745f, 0.268653f, 0.268560f, 0.268468f, 0.268376f, 0.268283f,
+ 0.268191f, 0.268099f, 0.268006f, 0.267914f, 0.267821f, 0.267729f, 0.267637f, 0.267544f,
+ 0.267452f, 0.267359f, 0.267267f, 0.267175f, 0.267082f, 0.266990f, 0.266898f, 0.266805f,
+ 0.266713f, 0.266620f, 0.266528f, 0.266436f, 0.266343f, 0.266251f, 0.266158f, 0.266066f,
+ 0.265973f, 0.265881f, 0.265789f, 0.265696f, 0.265604f, 0.265511f, 0.265419f, 0.265326f,
+ 0.265234f, 0.265142f, 0.265049f, 0.264957f, 0.264864f, 0.264772f, 0.264679f, 0.264587f,
+ 0.264494f, 0.264402f, 0.264309f, 0.264217f, 0.264125f, 0.264032f, 0.263940f, 0.263847f,
+ 0.263755f, 0.263662f, 0.263570f, 0.263477f, 0.263385f, 0.263292f, 0.263200f, 0.263107f,
+ 0.263015f, 0.262922f, 0.262830f, 0.262737f, 0.262645f, 0.262552f, 0.262460f, 0.262367f,
+ 0.262275f, 0.262182f, 0.262090f, 0.261997f, 0.261905f, 0.261812f, 0.261720f, 0.261627f,
+ 0.261534f, 0.261442f, 0.261349f, 0.261257f, 0.261164f, 0.261072f, 0.260979f, 0.260887f,
+ 0.260794f, 0.260702f, 0.260609f, 0.260516f, 0.260424f, 0.260331f, 0.260239f, 0.260146f,
+ 0.260054f, 0.259961f, 0.259868f, 0.259776f, 0.259683f, 0.259591f, 0.259498f, 0.259405f,
+ 0.259313f, 0.259220f, 0.259128f, 0.259035f, 0.258943f, 0.258850f, 0.258757f, 0.258665f,
+ 0.258572f, 0.258479f, 0.258387f, 0.258294f, 0.258202f, 0.258109f, 0.258016f, 0.257924f,
+ 0.257831f, 0.257738f, 0.257646f, 0.257553f, 0.257461f, 0.257368f, 0.257275f, 0.257183f,
+ 0.257090f, 0.256997f, 0.256905f, 0.256812f, 0.256719f, 0.256627f, 0.256534f, 0.256441f,
+ 0.256349f, 0.256256f, 0.256163f, 0.256071f, 0.255978f, 0.255885f, 0.255793f, 0.255700f,
+ 0.255607f, 0.255515f, 0.255422f, 0.255329f, 0.255236f, 0.255144f, 0.255051f, 0.254958f,
+ 0.254866f, 0.254773f, 0.254680f, 0.254588f, 0.254495f, 0.254402f, 0.254309f, 0.254217f,
+ 0.254124f, 0.254031f, 0.253938f, 0.253846f, 0.253753f, 0.253660f, 0.253568f, 0.253475f,
+ 0.253382f, 0.253289f, 0.253197f, 0.253104f, 0.253011f, 0.252918f, 0.252826f, 0.252733f,
+ 0.252640f, 0.252547f, 0.252454f, 0.252362f, 0.252269f, 0.252176f, 0.252083f, 0.251991f,
+ 0.251898f, 0.251805f, 0.251712f, 0.251619f, 0.251527f, 0.251434f, 0.251341f, 0.251248f,
+ 0.251155f, 0.251063f, 0.250970f, 0.250877f, 0.250784f, 0.250691f, 0.250599f, 0.250506f,
+ 0.250413f, 0.250320f, 0.250227f, 0.250135f, 0.250042f, 0.249949f, 0.249856f, 0.249763f,
+ 0.249670f, 0.249578f, 0.249485f, 0.249392f, 0.249299f, 0.249206f, 0.249113f, 0.249020f,
+ 0.248928f, 0.248835f, 0.248742f, 0.248649f, 0.248556f, 0.248463f, 0.248370f, 0.248278f,
+ 0.248185f, 0.248092f, 0.247999f, 0.247906f, 0.247813f, 0.247720f, 0.247627f, 0.247535f,
+ 0.247442f, 0.247349f, 0.247256f, 0.247163f, 0.247070f, 0.246977f, 0.246884f, 0.246791f,
+ 0.246698f, 0.246606f, 0.246513f, 0.246420f, 0.246327f, 0.246234f, 0.246141f, 0.246048f,
+ 0.245955f, 0.245862f, 0.245769f, 0.245676f, 0.245583f, 0.245490f, 0.245397f, 0.245304f,
+ 0.245212f, 0.245119f, 0.245026f, 0.244933f, 0.244840f, 0.244747f, 0.244654f, 0.244561f,
+ 0.244468f, 0.244375f, 0.244282f, 0.244189f, 0.244096f, 0.244003f, 0.243910f, 0.243817f,
+ 0.243724f, 0.243631f, 0.243538f, 0.243445f, 0.243352f, 0.243259f, 0.243166f, 0.243073f,
+ 0.242980f, 0.242887f, 0.242794f, 0.242701f, 0.242608f, 0.242515f, 0.242422f, 0.242329f,
+ 0.242236f, 0.242143f, 0.242050f, 0.241957f, 0.241864f, 0.241771f, 0.241678f, 0.241585f,
+ 0.241492f, 0.241399f, 0.241306f, 0.241213f, 0.241120f, 0.241027f, 0.240934f, 0.240841f,
+ 0.240748f, 0.240654f, 0.240561f, 0.240468f, 0.240375f, 0.240282f, 0.240189f, 0.240096f,
+ 0.240003f, 0.239910f, 0.239817f, 0.239724f, 0.239631f, 0.239538f, 0.239445f, 0.239351f,
+ 0.239258f, 0.239165f, 0.239072f, 0.238979f, 0.238886f, 0.238793f, 0.238700f, 0.238607f,
+ 0.238514f, 0.238420f, 0.238327f, 0.238234f, 0.238141f, 0.238048f, 0.237955f, 0.237862f,
+ 0.237769f, 0.237676f, 0.237582f, 0.237489f, 0.237396f, 0.237303f, 0.237210f, 0.237117f,
+ 0.237024f, 0.236930f, 0.236837f, 0.236744f, 0.236651f, 0.236558f, 0.236465f, 0.236372f,
+ 0.236278f, 0.236185f, 0.236092f, 0.235999f, 0.235906f, 0.235813f, 0.235719f, 0.235626f,
+ 0.235533f, 0.235440f, 0.235347f, 0.235254f, 0.235160f, 0.235067f, 0.234974f, 0.234881f,
+ 0.234788f, 0.234694f, 0.234601f, 0.234508f, 0.234415f, 0.234322f, 0.234228f, 0.234135f,
+ 0.234042f, 0.233949f, 0.233856f, 0.233762f, 0.233669f, 0.233576f, 0.233483f, 0.233389f,
+ 0.233296f, 0.233203f, 0.233110f, 0.233017f, 0.232923f, 0.232830f, 0.232737f, 0.232644f,
+ 0.232550f, 0.232457f, 0.232364f, 0.232271f, 0.232177f, 0.232084f, 0.231991f, 0.231898f,
+ 0.231804f, 0.231711f, 0.231618f, 0.231524f, 0.231431f, 0.231338f, 0.231245f, 0.231151f,
+ 0.231058f, 0.230965f, 0.230872f, 0.230778f, 0.230685f, 0.230592f, 0.230498f, 0.230405f,
+ 0.230312f, 0.230218f, 0.230125f, 0.230032f, 0.229939f, 0.229845f, 0.229752f, 0.229659f,
+ 0.229565f, 0.229472f, 0.229379f, 0.229285f, 0.229192f, 0.229099f, 0.229005f, 0.228912f,
+ 0.228819f, 0.228725f, 0.228632f, 0.228539f, 0.228445f, 0.228352f, 0.228259f, 0.228165f,
+ 0.228072f, 0.227979f, 0.227885f, 0.227792f, 0.227699f, 0.227605f, 0.227512f, 0.227419f,
+ 0.227325f, 0.227232f, 0.227139f, 0.227045f, 0.226952f, 0.226858f, 0.226765f, 0.226672f,
+ 0.226578f, 0.226485f, 0.226391f, 0.226298f, 0.226205f, 0.226111f, 0.226018f, 0.225925f,
+ 0.225831f, 0.225738f, 0.225644f, 0.225551f, 0.225458f, 0.225364f, 0.225271f, 0.225177f,
+ 0.225084f, 0.224991f, 0.224897f, 0.224804f, 0.224710f, 0.224617f, 0.224523f, 0.224430f,
+ 0.224337f, 0.224243f, 0.224150f, 0.224056f, 0.223963f, 0.223869f, 0.223776f, 0.223682f,
+ 0.223589f, 0.223496f, 0.223402f, 0.223309f, 0.223215f, 0.223122f, 0.223028f, 0.222935f,
+ 0.222841f, 0.222748f, 0.222654f, 0.222561f, 0.222468f, 0.222374f, 0.222281f, 0.222187f,
+ 0.222094f, 0.222000f, 0.221907f, 0.221813f, 0.221720f, 0.221626f, 0.221533f, 0.221439f,
+ 0.221346f, 0.221252f, 0.221159f, 0.221065f, 0.220972f, 0.220878f, 0.220785f, 0.220691f,
+ 0.220598f, 0.220504f, 0.220411f, 0.220317f, 0.220224f, 0.220130f, 0.220037f, 0.219943f,
+ 0.219850f, 0.219756f, 0.219662f, 0.219569f, 0.219475f, 0.219382f, 0.219288f, 0.219195f,
+ 0.219101f, 0.219008f, 0.218914f, 0.218821f, 0.218727f, 0.218633f, 0.218540f, 0.218446f,
+ 0.218353f, 0.218259f, 0.218166f, 0.218072f, 0.217979f, 0.217885f, 0.217791f, 0.217698f,
+ 0.217604f, 0.217511f, 0.217417f, 0.217324f, 0.217230f, 0.217136f, 0.217043f, 0.216949f,
+ 0.216856f, 0.216762f, 0.216668f, 0.216575f, 0.216481f, 0.216388f, 0.216294f, 0.216200f,
+ 0.216107f, 0.216013f, 0.215920f, 0.215826f, 0.215732f, 0.215639f, 0.215545f, 0.215451f,
+ 0.215358f, 0.215264f, 0.215171f, 0.215077f, 0.214983f, 0.214890f, 0.214796f, 0.214702f,
+ 0.214609f, 0.214515f, 0.214422f, 0.214328f, 0.214234f, 0.214141f, 0.214047f, 0.213953f,
+ 0.213860f, 0.213766f, 0.213672f, 0.213579f, 0.213485f, 0.213391f, 0.213298f, 0.213204f,
+ 0.213110f, 0.213017f, 0.212923f, 0.212829f, 0.212736f, 0.212642f, 0.212548f, 0.212455f,
+ 0.212361f, 0.212267f, 0.212174f, 0.212080f, 0.211986f, 0.211892f, 0.211799f, 0.211705f,
+ 0.211611f, 0.211518f, 0.211424f, 0.211330f, 0.211237f, 0.211143f, 0.211049f, 0.210955f,
+ 0.210862f, 0.210768f, 0.210674f, 0.210580f, 0.210487f, 0.210393f, 0.210299f, 0.210206f,
+ 0.210112f, 0.210018f, 0.209924f, 0.209831f, 0.209737f, 0.209643f, 0.209549f, 0.209456f,
+ 0.209362f, 0.209268f, 0.209174f, 0.209081f, 0.208987f, 0.208893f, 0.208799f, 0.208706f,
+ 0.208612f, 0.208518f, 0.208424f, 0.208331f, 0.208237f, 0.208143f, 0.208049f, 0.207955f,
+ 0.207862f, 0.207768f, 0.207674f, 0.207580f, 0.207487f, 0.207393f, 0.207299f, 0.207205f,
+ 0.207111f, 0.207018f, 0.206924f, 0.206830f, 0.206736f, 0.206642f, 0.206549f, 0.206455f,
+ 0.206361f, 0.206267f, 0.206173f, 0.206080f, 0.205986f, 0.205892f, 0.205798f, 0.205704f,
+ 0.205610f, 0.205517f, 0.205423f, 0.205329f, 0.205235f, 0.205141f, 0.205047f, 0.204954f,
+ 0.204860f, 0.204766f, 0.204672f, 0.204578f, 0.204484f, 0.204391f, 0.204297f, 0.204203f,
+ 0.204109f, 0.204015f, 0.203921f, 0.203827f, 0.203734f, 0.203640f, 0.203546f, 0.203452f,
+ 0.203358f, 0.203264f, 0.203170f, 0.203076f, 0.202983f, 0.202889f, 0.202795f, 0.202701f,
+ 0.202607f, 0.202513f, 0.202419f, 0.202325f, 0.202231f, 0.202138f, 0.202044f, 0.201950f,
+ 0.201856f, 0.201762f, 0.201668f, 0.201574f, 0.201480f, 0.201386f, 0.201292f, 0.201199f,
+ 0.201105f, 0.201011f, 0.200917f, 0.200823f, 0.200729f, 0.200635f, 0.200541f, 0.200447f,
+ 0.200353f, 0.200259f, 0.200165f, 0.200071f, 0.199978f, 0.199884f, 0.199790f, 0.199696f,
+ 0.199602f, 0.199508f, 0.199414f, 0.199320f, 0.199226f, 0.199132f, 0.199038f, 0.198944f,
+ 0.198850f, 0.198756f, 0.198662f, 0.198568f, 0.198474f, 0.198380f, 0.198286f, 0.198192f,
+ 0.198098f, 0.198004f, 0.197910f, 0.197816f, 0.197722f, 0.197629f, 0.197535f, 0.197441f,
+ 0.197347f, 0.197253f, 0.197159f, 0.197065f, 0.196971f, 0.196877f, 0.196783f, 0.196689f,
+ 0.196595f, 0.196501f, 0.196407f, 0.196313f, 0.196219f, 0.196125f, 0.196031f, 0.195937f,
+ 0.195843f, 0.195748f, 0.195654f, 0.195560f, 0.195466f, 0.195372f, 0.195278f, 0.195184f,
+ 0.195090f, 0.194996f, 0.194902f, 0.194808f, 0.194714f, 0.194620f, 0.194526f, 0.194432f,
+ 0.194338f, 0.194244f, 0.194150f, 0.194056f, 0.193962f, 0.193868f, 0.193774f, 0.193680f,
+ 0.193586f, 0.193492f, 0.193397f, 0.193303f, 0.193209f, 0.193115f, 0.193021f, 0.192927f,
+ 0.192833f, 0.192739f, 0.192645f, 0.192551f, 0.192457f, 0.192363f, 0.192269f, 0.192174f,
+ 0.192080f, 0.191986f, 0.191892f, 0.191798f, 0.191704f, 0.191610f, 0.191516f, 0.191422f,
+ 0.191328f, 0.191234f, 0.191139f, 0.191045f, 0.190951f, 0.190857f, 0.190763f, 0.190669f,
+ 0.190575f, 0.190481f, 0.190387f, 0.190292f, 0.190198f, 0.190104f, 0.190010f, 0.189916f,
+ 0.189822f, 0.189728f, 0.189634f, 0.189539f, 0.189445f, 0.189351f, 0.189257f, 0.189163f,
+ 0.189069f, 0.188975f, 0.188880f, 0.188786f, 0.188692f, 0.188598f, 0.188504f, 0.188410f,
+ 0.188315f, 0.188221f, 0.188127f, 0.188033f, 0.187939f, 0.187845f, 0.187750f, 0.187656f,
+ 0.187562f, 0.187468f, 0.187374f, 0.187280f, 0.187185f, 0.187091f, 0.186997f, 0.186903f,
+ 0.186809f, 0.186715f, 0.186620f, 0.186526f, 0.186432f, 0.186338f, 0.186244f, 0.186149f,
+ 0.186055f, 0.185961f, 0.185867f, 0.185773f, 0.185678f, 0.185584f, 0.185490f, 0.185396f,
+ 0.185301f, 0.185207f, 0.185113f, 0.185019f, 0.184925f, 0.184830f, 0.184736f, 0.184642f,
+ 0.184548f, 0.184454f, 0.184359f, 0.184265f, 0.184171f, 0.184077f, 0.183982f, 0.183888f,
+ 0.183794f, 0.183700f, 0.183605f, 0.183511f, 0.183417f, 0.183323f, 0.183228f, 0.183134f,
+ 0.183040f, 0.182946f, 0.182851f, 0.182757f, 0.182663f, 0.182569f, 0.182474f, 0.182380f,
+ 0.182286f, 0.182192f, 0.182097f, 0.182003f, 0.181909f, 0.181814f, 0.181720f, 0.181626f,
+ 0.181532f, 0.181437f, 0.181343f, 0.181249f, 0.181154f, 0.181060f, 0.180966f, 0.180872f,
+ 0.180777f, 0.180683f, 0.180589f, 0.180494f, 0.180400f, 0.180306f, 0.180212f, 0.180117f,
+ 0.180023f, 0.179929f, 0.179834f, 0.179740f, 0.179646f, 0.179551f, 0.179457f, 0.179363f,
+ 0.179268f, 0.179174f, 0.179080f, 0.178985f, 0.178891f, 0.178797f, 0.178702f, 0.178608f,
+ 0.178514f, 0.178419f, 0.178325f, 0.178231f, 0.178136f, 0.178042f, 0.177948f, 0.177853f,
+ 0.177759f, 0.177665f, 0.177570f, 0.177476f, 0.177382f, 0.177287f, 0.177193f, 0.177099f,
+ 0.177004f, 0.176910f, 0.176815f, 0.176721f, 0.176627f, 0.176532f, 0.176438f, 0.176344f,
+ 0.176249f, 0.176155f, 0.176061f, 0.175966f, 0.175872f, 0.175777f, 0.175683f, 0.175589f,
+ 0.175494f, 0.175400f, 0.175305f, 0.175211f, 0.175117f, 0.175022f, 0.174928f, 0.174834f,
+ 0.174739f, 0.174645f, 0.174550f, 0.174456f, 0.174362f, 0.174267f, 0.174173f, 0.174078f,
+ 0.173984f, 0.173889f, 0.173795f, 0.173701f, 0.173606f, 0.173512f, 0.173417f, 0.173323f,
+ 0.173229f, 0.173134f, 0.173040f, 0.172945f, 0.172851f, 0.172756f, 0.172662f, 0.172568f,
+ 0.172473f, 0.172379f, 0.172284f, 0.172190f, 0.172095f, 0.172001f, 0.171906f, 0.171812f,
+ 0.171718f, 0.171623f, 0.171529f, 0.171434f, 0.171340f, 0.171245f, 0.171151f, 0.171056f,
+ 0.170962f, 0.170867f, 0.170773f, 0.170678f, 0.170584f, 0.170490f, 0.170395f, 0.170301f,
+ 0.170206f, 0.170112f, 0.170017f, 0.169923f, 0.169828f, 0.169734f, 0.169639f, 0.169545f,
+ 0.169450f, 0.169356f, 0.169261f, 0.169167f, 0.169072f, 0.168978f, 0.168883f, 0.168789f,
+ 0.168694f, 0.168600f, 0.168505f, 0.168411f, 0.168316f, 0.168222f, 0.168127f, 0.168033f,
+ 0.167938f, 0.167844f, 0.167749f, 0.167655f, 0.167560f, 0.167466f, 0.167371f, 0.167277f,
+ 0.167182f, 0.167088f, 0.166993f, 0.166899f, 0.166804f, 0.166710f, 0.166615f, 0.166520f,
+ 0.166426f, 0.166331f, 0.166237f, 0.166142f, 0.166048f, 0.165953f, 0.165859f, 0.165764f,
+ 0.165670f, 0.165575f, 0.165480f, 0.165386f, 0.165291f, 0.165197f, 0.165102f, 0.165008f,
+ 0.164913f, 0.164819f, 0.164724f, 0.164629f, 0.164535f, 0.164440f, 0.164346f, 0.164251f,
+ 0.164157f, 0.164062f, 0.163967f, 0.163873f, 0.163778f, 0.163684f, 0.163589f, 0.163495f,
+ 0.163400f, 0.163305f, 0.163211f, 0.163116f, 0.163022f, 0.162927f, 0.162832f, 0.162738f,
+ 0.162643f, 0.162549f, 0.162454f, 0.162359f, 0.162265f, 0.162170f, 0.162076f, 0.161981f,
+ 0.161886f, 0.161792f, 0.161697f, 0.161603f, 0.161508f, 0.161413f, 0.161319f, 0.161224f,
+ 0.161129f, 0.161035f, 0.160940f, 0.160846f, 0.160751f, 0.160656f, 0.160562f, 0.160467f,
+ 0.160372f, 0.160278f, 0.160183f, 0.160089f, 0.159994f, 0.159899f, 0.159805f, 0.159710f,
+ 0.159615f, 0.159521f, 0.159426f, 0.159331f, 0.159237f, 0.159142f, 0.159047f, 0.158953f,
+ 0.158858f, 0.158763f, 0.158669f, 0.158574f, 0.158480f, 0.158385f, 0.158290f, 0.158196f,
+ 0.158101f, 0.158006f, 0.157912f, 0.157817f, 0.157722f, 0.157627f, 0.157533f, 0.157438f,
+ 0.157343f, 0.157249f, 0.157154f, 0.157059f, 0.156965f, 0.156870f, 0.156775f, 0.156681f,
+ 0.156586f, 0.156491f, 0.156397f, 0.156302f, 0.156207f, 0.156112f, 0.156018f, 0.155923f,
+ 0.155828f, 0.155734f, 0.155639f, 0.155544f, 0.155450f, 0.155355f, 0.155260f, 0.155165f,
+ 0.155071f, 0.154976f, 0.154881f, 0.154787f, 0.154692f, 0.154597f, 0.154502f, 0.154408f,
+ 0.154313f, 0.154218f, 0.154124f, 0.154029f, 0.153934f, 0.153839f, 0.153745f, 0.153650f,
+ 0.153555f, 0.153460f, 0.153366f, 0.153271f, 0.153176f, 0.153081f, 0.152987f, 0.152892f,
+ 0.152797f, 0.152702f, 0.152608f, 0.152513f, 0.152418f, 0.152323f, 0.152229f, 0.152134f,
+ 0.152039f, 0.151944f, 0.151850f, 0.151755f, 0.151660f, 0.151565f, 0.151471f, 0.151376f,
+ 0.151281f, 0.151186f, 0.151092f, 0.150997f, 0.150902f, 0.150807f, 0.150712f, 0.150618f,
+ 0.150523f, 0.150428f, 0.150333f, 0.150238f, 0.150144f, 0.150049f, 0.149954f, 0.149859f,
+ 0.149765f, 0.149670f, 0.149575f, 0.149480f, 0.149385f, 0.149291f, 0.149196f, 0.149101f,
+ 0.149006f, 0.148911f, 0.148817f, 0.148722f, 0.148627f, 0.148532f, 0.148437f, 0.148342f,
+ 0.148248f, 0.148153f, 0.148058f, 0.147963f, 0.147868f, 0.147774f, 0.147679f, 0.147584f,
+ 0.147489f, 0.147394f, 0.147299f, 0.147205f, 0.147110f, 0.147015f, 0.146920f, 0.146825f,
+ 0.146730f, 0.146636f, 0.146541f, 0.146446f, 0.146351f, 0.146256f, 0.146161f, 0.146067f,
+ 0.145972f, 0.145877f, 0.145782f, 0.145687f, 0.145592f, 0.145497f, 0.145403f, 0.145308f,
+ 0.145213f, 0.145118f, 0.145023f, 0.144928f, 0.144833f, 0.144739f, 0.144644f, 0.144549f,
+ 0.144454f, 0.144359f, 0.144264f, 0.144169f, 0.144075f, 0.143980f, 0.143885f, 0.143790f,
+ 0.143695f, 0.143600f, 0.143505f, 0.143410f, 0.143316f, 0.143221f, 0.143126f, 0.143031f,
+ 0.142936f, 0.142841f, 0.142746f, 0.142651f, 0.142556f, 0.142461f, 0.142367f, 0.142272f,
+ 0.142177f, 0.142082f, 0.141987f, 0.141892f, 0.141797f, 0.141702f, 0.141607f, 0.141512f,
+ 0.141418f, 0.141323f, 0.141228f, 0.141133f, 0.141038f, 0.140943f, 0.140848f, 0.140753f,
+ 0.140658f, 0.140563f, 0.140468f, 0.140373f, 0.140279f, 0.140184f, 0.140089f, 0.139994f,
+ 0.139899f, 0.139804f, 0.139709f, 0.139614f, 0.139519f, 0.139424f, 0.139329f, 0.139234f,
+ 0.139139f, 0.139044f, 0.138949f, 0.138855f, 0.138760f, 0.138665f, 0.138570f, 0.138475f,
+ 0.138380f, 0.138285f, 0.138190f, 0.138095f, 0.138000f, 0.137905f, 0.137810f, 0.137715f,
+ 0.137620f, 0.137525f, 0.137430f, 0.137335f, 0.137240f, 0.137145f, 0.137050f, 0.136955f,
+ 0.136860f, 0.136765f, 0.136670f, 0.136575f, 0.136480f, 0.136386f, 0.136291f, 0.136196f,
+ 0.136101f, 0.136006f, 0.135911f, 0.135816f, 0.135721f, 0.135626f, 0.135531f, 0.135436f,
+ 0.135341f, 0.135246f, 0.135151f, 0.135056f, 0.134961f, 0.134866f, 0.134771f, 0.134676f,
+ 0.134581f, 0.134486f, 0.134391f, 0.134296f, 0.134201f, 0.134106f, 0.134011f, 0.133916f,
+ 0.133821f, 0.133726f, 0.133631f, 0.133536f, 0.133441f, 0.133346f, 0.133251f, 0.133156f,
+ 0.133061f, 0.132966f, 0.132870f, 0.132775f, 0.132680f, 0.132585f, 0.132490f, 0.132395f,
+ 0.132300f, 0.132205f, 0.132110f, 0.132015f, 0.131920f, 0.131825f, 0.131730f, 0.131635f,
+ 0.131540f, 0.131445f, 0.131350f, 0.131255f, 0.131160f, 0.131065f, 0.130970f, 0.130875f,
+ 0.130780f, 0.130685f, 0.130590f, 0.130495f, 0.130399f, 0.130304f, 0.130209f, 0.130114f,
+ 0.130019f, 0.129924f, 0.129829f, 0.129734f, 0.129639f, 0.129544f, 0.129449f, 0.129354f,
+ 0.129259f, 0.129164f, 0.129069f, 0.128973f, 0.128878f, 0.128783f, 0.128688f, 0.128593f,
+ 0.128498f, 0.128403f, 0.128308f, 0.128213f, 0.128118f, 0.128023f, 0.127928f, 0.127833f,
+ 0.127737f, 0.127642f, 0.127547f, 0.127452f, 0.127357f, 0.127262f, 0.127167f, 0.127072f,
+ 0.126977f, 0.126882f, 0.126787f, 0.126691f, 0.126596f, 0.126501f, 0.126406f, 0.126311f,
+ 0.126216f, 0.126121f, 0.126026f, 0.125931f, 0.125835f, 0.125740f, 0.125645f, 0.125550f,
+ 0.125455f, 0.125360f, 0.125265f, 0.125170f, 0.125075f, 0.124979f, 0.124884f, 0.124789f,
+ 0.124694f, 0.124599f, 0.124504f, 0.124409f, 0.124314f, 0.124218f, 0.124123f, 0.124028f,
+ 0.123933f, 0.123838f, 0.123743f, 0.123648f, 0.123552f, 0.123457f, 0.123362f, 0.123267f,
+ 0.123172f, 0.123077f, 0.122982f, 0.122886f, 0.122791f, 0.122696f, 0.122601f, 0.122506f,
+ 0.122411f, 0.122316f, 0.122220f, 0.122125f, 0.122030f, 0.121935f, 0.121840f, 0.121745f,
+ 0.121649f, 0.121554f, 0.121459f, 0.121364f, 0.121269f, 0.121174f, 0.121078f, 0.120983f,
+ 0.120888f, 0.120793f, 0.120698f, 0.120603f, 0.120507f, 0.120412f, 0.120317f, 0.120222f,
+ 0.120127f, 0.120032f, 0.119936f, 0.119841f, 0.119746f, 0.119651f, 0.119556f, 0.119460f,
+ 0.119365f, 0.119270f, 0.119175f, 0.119080f, 0.118984f, 0.118889f, 0.118794f, 0.118699f,
+ 0.118604f, 0.118508f, 0.118413f, 0.118318f, 0.118223f, 0.118128f, 0.118032f, 0.117937f,
+ 0.117842f, 0.117747f, 0.117652f, 0.117556f, 0.117461f, 0.117366f, 0.117271f, 0.117176f,
+ 0.117080f, 0.116985f, 0.116890f, 0.116795f, 0.116700f, 0.116604f, 0.116509f, 0.116414f,
+ 0.116319f, 0.116223f, 0.116128f, 0.116033f, 0.115938f, 0.115842f, 0.115747f, 0.115652f,
+ 0.115557f, 0.115462f, 0.115366f, 0.115271f, 0.115176f, 0.115081f, 0.114985f, 0.114890f,
+ 0.114795f, 0.114700f, 0.114604f, 0.114509f, 0.114414f, 0.114319f, 0.114223f, 0.114128f,
+ 0.114033f, 0.113938f, 0.113842f, 0.113747f, 0.113652f, 0.113557f, 0.113461f, 0.113366f,
+ 0.113271f, 0.113176f, 0.113080f, 0.112985f, 0.112890f, 0.112795f, 0.112699f, 0.112604f,
+ 0.112509f, 0.112414f, 0.112318f, 0.112223f, 0.112128f, 0.112033f, 0.111937f, 0.111842f,
+ 0.111747f, 0.111651f, 0.111556f, 0.111461f, 0.111366f, 0.111270f, 0.111175f, 0.111080f,
+ 0.110984f, 0.110889f, 0.110794f, 0.110699f, 0.110603f, 0.110508f, 0.110413f, 0.110317f,
+ 0.110222f, 0.110127f, 0.110032f, 0.109936f, 0.109841f, 0.109746f, 0.109650f, 0.109555f,
+ 0.109460f, 0.109365f, 0.109269f, 0.109174f, 0.109079f, 0.108983f, 0.108888f, 0.108793f,
+ 0.108697f, 0.108602f, 0.108507f, 0.108412f, 0.108316f, 0.108221f, 0.108126f, 0.108030f,
+ 0.107935f, 0.107840f, 0.107744f, 0.107649f, 0.107554f, 0.107458f, 0.107363f, 0.107268f,
+ 0.107172f, 0.107077f, 0.106982f, 0.106886f, 0.106791f, 0.106696f, 0.106600f, 0.106505f,
+ 0.106410f, 0.106314f, 0.106219f, 0.106124f, 0.106028f, 0.105933f, 0.105838f, 0.105742f,
+ 0.105647f, 0.105552f, 0.105456f, 0.105361f, 0.105266f, 0.105170f, 0.105075f, 0.104980f,
+ 0.104884f, 0.104789f, 0.104694f, 0.104598f, 0.104503f, 0.104408f, 0.104312f, 0.104217f,
+ 0.104122f, 0.104026f, 0.103931f, 0.103836f, 0.103740f, 0.103645f, 0.103550f, 0.103454f,
+ 0.103359f, 0.103263f, 0.103168f, 0.103073f, 0.102977f, 0.102882f, 0.102787f, 0.102691f,
+ 0.102596f, 0.102500f, 0.102405f, 0.102310f, 0.102214f, 0.102119f, 0.102024f, 0.101928f,
+ 0.101833f, 0.101738f, 0.101642f, 0.101547f, 0.101451f, 0.101356f, 0.101261f, 0.101165f,
+ 0.101070f, 0.100974f, 0.100879f, 0.100784f, 0.100688f, 0.100593f, 0.100498f, 0.100402f,
+ 0.100307f, 0.100211f, 0.100116f, 0.100021f, 0.099925f, 0.099830f, 0.099734f, 0.099639f,
+ 0.099544f, 0.099448f, 0.099353f, 0.099257f, 0.099162f, 0.099067f, 0.098971f, 0.098876f,
+ 0.098780f, 0.098685f, 0.098590f, 0.098494f, 0.098399f, 0.098303f, 0.098208f, 0.098113f,
+ 0.098017f, 0.097922f, 0.097826f, 0.097731f, 0.097635f, 0.097540f, 0.097445f, 0.097349f,
+ 0.097254f, 0.097158f, 0.097063f, 0.096968f, 0.096872f, 0.096777f, 0.096681f, 0.096586f,
+ 0.096490f, 0.096395f, 0.096300f, 0.096204f, 0.096109f, 0.096013f, 0.095918f, 0.095822f,
+ 0.095727f, 0.095632f, 0.095536f, 0.095441f, 0.095345f, 0.095250f, 0.095154f, 0.095059f,
+ 0.094963f, 0.094868f, 0.094773f, 0.094677f, 0.094582f, 0.094486f, 0.094391f, 0.094295f,
+ 0.094200f, 0.094104f, 0.094009f, 0.093914f, 0.093818f, 0.093723f, 0.093627f, 0.093532f,
+ 0.093436f, 0.093341f, 0.093245f, 0.093150f, 0.093055f, 0.092959f, 0.092864f, 0.092768f,
+ 0.092673f, 0.092577f, 0.092482f, 0.092386f, 0.092291f, 0.092195f, 0.092100f, 0.092004f,
+ 0.091909f, 0.091813f, 0.091718f, 0.091623f, 0.091527f, 0.091432f, 0.091336f, 0.091241f,
+ 0.091145f, 0.091050f, 0.090954f, 0.090859f, 0.090763f, 0.090668f, 0.090572f, 0.090477f,
+ 0.090381f, 0.090286f, 0.090190f, 0.090095f, 0.089999f, 0.089904f, 0.089808f, 0.089713f,
+ 0.089617f, 0.089522f, 0.089427f, 0.089331f, 0.089236f, 0.089140f, 0.089045f, 0.088949f,
+ 0.088854f, 0.088758f, 0.088663f, 0.088567f, 0.088472f, 0.088376f, 0.088281f, 0.088185f,
+ 0.088090f, 0.087994f, 0.087899f, 0.087803f, 0.087708f, 0.087612f, 0.087517f, 0.087421f,
+ 0.087326f, 0.087230f, 0.087135f, 0.087039f, 0.086943f, 0.086848f, 0.086752f, 0.086657f,
+ 0.086561f, 0.086466f, 0.086370f, 0.086275f, 0.086179f, 0.086084f, 0.085988f, 0.085893f,
+ 0.085797f, 0.085702f, 0.085606f, 0.085511f, 0.085415f, 0.085320f, 0.085224f, 0.085129f,
+ 0.085033f, 0.084938f, 0.084842f, 0.084747f, 0.084651f, 0.084555f, 0.084460f, 0.084364f,
+ 0.084269f, 0.084173f, 0.084078f, 0.083982f, 0.083887f, 0.083791f, 0.083696f, 0.083600f,
+ 0.083505f, 0.083409f, 0.083314f, 0.083218f, 0.083122f, 0.083027f, 0.082931f, 0.082836f,
+ 0.082740f, 0.082645f, 0.082549f, 0.082454f, 0.082358f, 0.082263f, 0.082167f, 0.082071f,
+ 0.081976f, 0.081880f, 0.081785f, 0.081689f, 0.081594f, 0.081498f, 0.081403f, 0.081307f,
+ 0.081211f, 0.081116f, 0.081020f, 0.080925f, 0.080829f, 0.080734f, 0.080638f, 0.080543f,
+ 0.080447f, 0.080351f, 0.080256f, 0.080160f, 0.080065f, 0.079969f, 0.079874f, 0.079778f,
+ 0.079682f, 0.079587f, 0.079491f, 0.079396f, 0.079300f, 0.079205f, 0.079109f, 0.079013f,
+ 0.078918f, 0.078822f, 0.078727f, 0.078631f, 0.078536f, 0.078440f, 0.078344f, 0.078249f,
+ 0.078153f, 0.078058f, 0.077962f, 0.077866f, 0.077771f, 0.077675f, 0.077580f, 0.077484f,
+ 0.077389f, 0.077293f, 0.077197f, 0.077102f, 0.077006f, 0.076911f, 0.076815f, 0.076719f,
+ 0.076624f, 0.076528f, 0.076433f, 0.076337f, 0.076241f, 0.076146f, 0.076050f, 0.075955f,
+ 0.075859f, 0.075764f, 0.075668f, 0.075572f, 0.075477f, 0.075381f, 0.075286f, 0.075190f,
+ 0.075094f, 0.074999f, 0.074903f, 0.074807f, 0.074712f, 0.074616f, 0.074521f, 0.074425f,
+ 0.074329f, 0.074234f, 0.074138f, 0.074043f, 0.073947f, 0.073851f, 0.073756f, 0.073660f,
+ 0.073565f, 0.073469f, 0.073373f, 0.073278f, 0.073182f, 0.073086f, 0.072991f, 0.072895f,
+ 0.072800f, 0.072704f, 0.072608f, 0.072513f, 0.072417f, 0.072322f, 0.072226f, 0.072130f,
+ 0.072035f, 0.071939f, 0.071843f, 0.071748f, 0.071652f, 0.071557f, 0.071461f, 0.071365f,
+ 0.071270f, 0.071174f, 0.071078f, 0.070983f, 0.070887f, 0.070791f, 0.070696f, 0.070600f,
+ 0.070505f, 0.070409f, 0.070313f, 0.070218f, 0.070122f, 0.070026f, 0.069931f, 0.069835f,
+ 0.069739f, 0.069644f, 0.069548f, 0.069453f, 0.069357f, 0.069261f, 0.069166f, 0.069070f,
+ 0.068974f, 0.068879f, 0.068783f, 0.068687f, 0.068592f, 0.068496f, 0.068400f, 0.068305f,
+ 0.068209f, 0.068113f, 0.068018f, 0.067922f, 0.067827f, 0.067731f, 0.067635f, 0.067540f,
+ 0.067444f, 0.067348f, 0.067253f, 0.067157f, 0.067061f, 0.066966f, 0.066870f, 0.066774f,
+ 0.066679f, 0.066583f, 0.066487f, 0.066392f, 0.066296f, 0.066200f, 0.066105f, 0.066009f,
+ 0.065913f, 0.065818f, 0.065722f, 0.065626f, 0.065531f, 0.065435f, 0.065339f, 0.065244f,
+ 0.065148f, 0.065052f, 0.064957f, 0.064861f, 0.064765f, 0.064670f, 0.064574f, 0.064478f,
+ 0.064383f, 0.064287f, 0.064191f, 0.064096f, 0.064000f, 0.063904f, 0.063809f, 0.063713f,
+ 0.063617f, 0.063522f, 0.063426f, 0.063330f, 0.063234f, 0.063139f, 0.063043f, 0.062947f,
+ 0.062852f, 0.062756f, 0.062660f, 0.062565f, 0.062469f, 0.062373f, 0.062278f, 0.062182f,
+ 0.062086f, 0.061991f, 0.061895f, 0.061799f, 0.061704f, 0.061608f, 0.061512f, 0.061416f,
+ 0.061321f, 0.061225f, 0.061129f, 0.061034f, 0.060938f, 0.060842f, 0.060747f, 0.060651f,
+ 0.060555f, 0.060459f, 0.060364f, 0.060268f, 0.060172f, 0.060077f, 0.059981f, 0.059885f,
+ 0.059790f, 0.059694f, 0.059598f, 0.059502f, 0.059407f, 0.059311f, 0.059215f, 0.059120f,
+ 0.059024f, 0.058928f, 0.058833f, 0.058737f, 0.058641f, 0.058545f, 0.058450f, 0.058354f,
+ 0.058258f, 0.058163f, 0.058067f, 0.057971f, 0.057875f, 0.057780f, 0.057684f, 0.057588f,
+ 0.057493f, 0.057397f, 0.057301f, 0.057205f, 0.057110f, 0.057014f, 0.056918f, 0.056823f,
+ 0.056727f, 0.056631f, 0.056535f, 0.056440f, 0.056344f, 0.056248f, 0.056152f, 0.056057f,
+ 0.055961f, 0.055865f, 0.055770f, 0.055674f, 0.055578f, 0.055482f, 0.055387f, 0.055291f,
+ 0.055195f, 0.055100f, 0.055004f, 0.054908f, 0.054812f, 0.054717f, 0.054621f, 0.054525f,
+ 0.054429f, 0.054334f, 0.054238f, 0.054142f, 0.054046f, 0.053951f, 0.053855f, 0.053759f,
+ 0.053664f, 0.053568f, 0.053472f, 0.053376f, 0.053281f, 0.053185f, 0.053089f, 0.052993f,
+ 0.052898f, 0.052802f, 0.052706f, 0.052610f, 0.052515f, 0.052419f, 0.052323f, 0.052227f,
+ 0.052132f, 0.052036f, 0.051940f, 0.051844f, 0.051749f, 0.051653f, 0.051557f, 0.051461f,
+ 0.051366f, 0.051270f, 0.051174f, 0.051078f, 0.050983f, 0.050887f, 0.050791f, 0.050696f,
+ 0.050600f, 0.050504f, 0.050408f, 0.050312f, 0.050217f, 0.050121f, 0.050025f, 0.049929f,
+ 0.049834f, 0.049738f, 0.049642f, 0.049546f, 0.049451f, 0.049355f, 0.049259f, 0.049163f,
+ 0.049068f, 0.048972f, 0.048876f, 0.048780f, 0.048685f, 0.048589f, 0.048493f, 0.048397f,
+ 0.048302f, 0.048206f, 0.048110f, 0.048014f, 0.047919f, 0.047823f, 0.047727f, 0.047631f,
+ 0.047535f, 0.047440f, 0.047344f, 0.047248f, 0.047152f, 0.047057f, 0.046961f, 0.046865f,
+ 0.046769f, 0.046674f, 0.046578f, 0.046482f, 0.046386f, 0.046290f, 0.046195f, 0.046099f,
+ 0.046003f, 0.045907f, 0.045812f, 0.045716f, 0.045620f, 0.045524f, 0.045429f, 0.045333f,
+ 0.045237f, 0.045141f, 0.045045f, 0.044950f, 0.044854f, 0.044758f, 0.044662f, 0.044567f,
+ 0.044471f, 0.044375f, 0.044279f, 0.044183f, 0.044088f, 0.043992f, 0.043896f, 0.043800f,
+ 0.043705f, 0.043609f, 0.043513f, 0.043417f, 0.043321f, 0.043226f, 0.043130f, 0.043034f,
+ 0.042938f, 0.042842f, 0.042747f, 0.042651f, 0.042555f, 0.042459f, 0.042364f, 0.042268f,
+ 0.042172f, 0.042076f, 0.041980f, 0.041885f, 0.041789f, 0.041693f, 0.041597f, 0.041501f,
+ 0.041406f, 0.041310f, 0.041214f, 0.041118f, 0.041022f, 0.040927f, 0.040831f, 0.040735f,
+ 0.040639f, 0.040544f, 0.040448f, 0.040352f, 0.040256f, 0.040160f, 0.040065f, 0.039969f,
+ 0.039873f, 0.039777f, 0.039681f, 0.039586f, 0.039490f, 0.039394f, 0.039298f, 0.039202f,
+ 0.039107f, 0.039011f, 0.038915f, 0.038819f, 0.038723f, 0.038628f, 0.038532f, 0.038436f,
+ 0.038340f, 0.038244f, 0.038149f, 0.038053f, 0.037957f, 0.037861f, 0.037765f, 0.037669f,
+ 0.037574f, 0.037478f, 0.037382f, 0.037286f, 0.037190f, 0.037095f, 0.036999f, 0.036903f,
+ 0.036807f, 0.036711f, 0.036616f, 0.036520f, 0.036424f, 0.036328f, 0.036232f, 0.036137f,
+ 0.036041f, 0.035945f, 0.035849f, 0.035753f, 0.035657f, 0.035562f, 0.035466f, 0.035370f,
+ 0.035274f, 0.035178f, 0.035083f, 0.034987f, 0.034891f, 0.034795f, 0.034699f, 0.034604f,
+ 0.034508f, 0.034412f, 0.034316f, 0.034220f, 0.034124f, 0.034029f, 0.033933f, 0.033837f,
+ 0.033741f, 0.033645f, 0.033550f, 0.033454f, 0.033358f, 0.033262f, 0.033166f, 0.033070f,
+ 0.032975f, 0.032879f, 0.032783f, 0.032687f, 0.032591f, 0.032495f, 0.032400f, 0.032304f,
+ 0.032208f, 0.032112f, 0.032016f, 0.031921f, 0.031825f, 0.031729f, 0.031633f, 0.031537f,
+ 0.031441f, 0.031346f, 0.031250f, 0.031154f, 0.031058f, 0.030962f, 0.030866f, 0.030771f,
+ 0.030675f, 0.030579f, 0.030483f, 0.030387f, 0.030291f, 0.030196f, 0.030100f, 0.030004f,
+ 0.029908f, 0.029812f, 0.029717f, 0.029621f, 0.029525f, 0.029429f, 0.029333f, 0.029237f,
+ 0.029142f, 0.029046f, 0.028950f, 0.028854f, 0.028758f, 0.028662f, 0.028567f, 0.028471f,
+ 0.028375f, 0.028279f, 0.028183f, 0.028087f, 0.027991f, 0.027896f, 0.027800f, 0.027704f,
+ 0.027608f, 0.027512f, 0.027416f, 0.027321f, 0.027225f, 0.027129f, 0.027033f, 0.026937f,
+ 0.026841f, 0.026746f, 0.026650f, 0.026554f, 0.026458f, 0.026362f, 0.026266f, 0.026171f,
+ 0.026075f, 0.025979f, 0.025883f, 0.025787f, 0.025691f, 0.025596f, 0.025500f, 0.025404f,
+ 0.025308f, 0.025212f, 0.025116f, 0.025020f, 0.024925f, 0.024829f, 0.024733f, 0.024637f,
+ 0.024541f, 0.024445f, 0.024350f, 0.024254f, 0.024158f, 0.024062f, 0.023966f, 0.023870f,
+ 0.023774f, 0.023679f, 0.023583f, 0.023487f, 0.023391f, 0.023295f, 0.023199f, 0.023104f,
+ 0.023008f, 0.022912f, 0.022816f, 0.022720f, 0.022624f, 0.022528f, 0.022433f, 0.022337f,
+ 0.022241f, 0.022145f, 0.022049f, 0.021953f, 0.021857f, 0.021762f, 0.021666f, 0.021570f,
+ 0.021474f, 0.021378f, 0.021282f, 0.021187f, 0.021091f, 0.020995f, 0.020899f, 0.020803f,
+ 0.020707f, 0.020611f, 0.020516f, 0.020420f, 0.020324f, 0.020228f, 0.020132f, 0.020036f,
+ 0.019940f, 0.019845f, 0.019749f, 0.019653f, 0.019557f, 0.019461f, 0.019365f, 0.019269f,
+ 0.019174f, 0.019078f, 0.018982f, 0.018886f, 0.018790f, 0.018694f, 0.018598f, 0.018503f,
+ 0.018407f, 0.018311f, 0.018215f, 0.018119f, 0.018023f, 0.017927f, 0.017832f, 0.017736f,
+ 0.017640f, 0.017544f, 0.017448f, 0.017352f, 0.017256f, 0.017161f, 0.017065f, 0.016969f,
+ 0.016873f, 0.016777f, 0.016681f, 0.016585f, 0.016490f, 0.016394f, 0.016298f, 0.016202f,
+ 0.016106f, 0.016010f, 0.015914f, 0.015819f, 0.015723f, 0.015627f, 0.015531f, 0.015435f,
+ 0.015339f, 0.015243f, 0.015147f, 0.015052f, 0.014956f, 0.014860f, 0.014764f, 0.014668f,
+ 0.014572f, 0.014476f, 0.014381f, 0.014285f, 0.014189f, 0.014093f, 0.013997f, 0.013901f,
+ 0.013805f, 0.013710f, 0.013614f, 0.013518f, 0.013422f, 0.013326f, 0.013230f, 0.013134f,
+ 0.013038f, 0.012943f, 0.012847f, 0.012751f, 0.012655f, 0.012559f, 0.012463f, 0.012367f,
+ 0.012272f, 0.012176f, 0.012080f, 0.011984f, 0.011888f, 0.011792f, 0.011696f, 0.011600f,
+ 0.011505f, 0.011409f, 0.011313f, 0.011217f, 0.011121f, 0.011025f, 0.010929f, 0.010834f,
+ 0.010738f, 0.010642f, 0.010546f, 0.010450f, 0.010354f, 0.010258f, 0.010162f, 0.010067f,
+ 0.009971f, 0.009875f, 0.009779f, 0.009683f, 0.009587f, 0.009491f, 0.009395f, 0.009300f,
+ 0.009204f, 0.009108f, 0.009012f, 0.008916f, 0.008820f, 0.008724f, 0.008629f, 0.008533f,
+ 0.008437f, 0.008341f, 0.008245f, 0.008149f, 0.008053f, 0.007957f, 0.007862f, 0.007766f,
+ 0.007670f, 0.007574f, 0.007478f, 0.007382f, 0.007286f, 0.007190f, 0.007095f, 0.006999f,
+ 0.006903f, 0.006807f, 0.006711f, 0.006615f, 0.006519f, 0.006424f, 0.006328f, 0.006232f,
+ 0.006136f, 0.006040f, 0.005944f, 0.005848f, 0.005752f, 0.005657f, 0.005561f, 0.005465f,
+ 0.005369f, 0.005273f, 0.005177f, 0.005081f, 0.004985f, 0.004890f, 0.004794f, 0.004698f,
+ 0.004602f, 0.004506f, 0.004410f, 0.004314f, 0.004218f, 0.004123f, 0.004027f, 0.003931f,
+ 0.003835f, 0.003739f, 0.003643f, 0.003547f, 0.003451f, 0.003356f, 0.003260f, 0.003164f,
+ 0.003068f, 0.002972f, 0.002876f, 0.002780f, 0.002684f, 0.002589f, 0.002493f, 0.002397f,
+ 0.002301f, 0.002205f, 0.002109f, 0.002013f, 0.001917f, 0.001822f, 0.001726f, 0.001630f,
+ 0.001534f, 0.001438f, 0.001342f, 0.001246f, 0.001150f, 0.001055f, 0.000959f, 0.000863f,
+ 0.000767f, 0.000671f, 0.000575f, 0.000479f, 0.000383f, 0.000288f, 0.000192f, 0.000096f,
+ 0.000000f, 0.000096f, 0.000192f, 0.000288f, 0.000383f, 0.000479f, 0.000575f, 0.000671f,
+ 0.000767f, 0.000863f, 0.000959f, 0.001055f, 0.001150f, 0.001246f, 0.001342f, 0.001438f,
+ 0.001534f, 0.001630f, 0.001726f, 0.001822f, 0.001917f, 0.002013f, 0.002109f, 0.002205f,
+ 0.002301f, 0.002397f, 0.002493f, 0.002589f, 0.002684f, 0.002780f, 0.002876f, 0.002972f,
+ 0.003068f, 0.003164f, 0.003260f, 0.003356f, 0.003451f, 0.003547f, 0.003643f, 0.003739f,
+ 0.003835f, 0.003931f, 0.004027f, 0.004123f, 0.004218f, 0.004314f, 0.004410f, 0.004506f,
+ 0.004602f, 0.004698f, 0.004794f, 0.004890f, 0.004985f, 0.005081f, 0.005177f, 0.005273f,
+ 0.005369f, 0.005465f, 0.005561f, 0.005657f, 0.005752f, 0.005848f, 0.005944f, 0.006040f,
+ 0.006136f, 0.006232f, 0.006328f, 0.006424f, 0.006519f, 0.006615f, 0.006711f, 0.006807f,
+ 0.006903f, 0.006999f, 0.007095f, 0.007190f, 0.007286f, 0.007382f, 0.007478f, 0.007574f,
+ 0.007670f, 0.007766f, 0.007862f, 0.007957f, 0.008053f, 0.008149f, 0.008245f, 0.008341f,
+ 0.008437f, 0.008533f, 0.008629f, 0.008724f, 0.008820f, 0.008916f, 0.009012f, 0.009108f,
+ 0.009204f, 0.009300f, 0.009395f, 0.009491f, 0.009587f, 0.009683f, 0.009779f, 0.009875f,
+ 0.009971f, 0.010067f, 0.010162f, 0.010258f, 0.010354f, 0.010450f, 0.010546f, 0.010642f,
+ 0.010738f, 0.010834f, 0.010929f, 0.011025f, 0.011121f, 0.011217f, 0.011313f, 0.011409f,
+ 0.011505f, 0.011600f, 0.011696f, 0.011792f, 0.011888f, 0.011984f, 0.012080f, 0.012176f,
+ 0.012272f, 0.012367f, 0.012463f, 0.012559f, 0.012655f, 0.012751f, 0.012847f, 0.012943f,
+ 0.013038f, 0.013134f, 0.013230f, 0.013326f, 0.013422f, 0.013518f, 0.013614f, 0.013710f,
+ 0.013805f, 0.013901f, 0.013997f, 0.014093f, 0.014189f, 0.014285f, 0.014381f, 0.014476f,
+ 0.014572f, 0.014668f, 0.014764f, 0.014860f, 0.014956f, 0.015052f, 0.015147f, 0.015243f,
+ 0.015339f, 0.015435f, 0.015531f, 0.015627f, 0.015723f, 0.015819f, 0.015914f, 0.016010f,
+ 0.016106f, 0.016202f, 0.016298f, 0.016394f, 0.016490f, 0.016585f, 0.016681f, 0.016777f,
+ 0.016873f, 0.016969f, 0.017065f, 0.017161f, 0.017256f, 0.017352f, 0.017448f, 0.017544f,
+ 0.017640f, 0.017736f, 0.017832f, 0.017927f, 0.018023f, 0.018119f, 0.018215f, 0.018311f,
+ 0.018407f, 0.018503f, 0.018598f, 0.018694f, 0.018790f, 0.018886f, 0.018982f, 0.019078f,
+ 0.019174f, 0.019269f, 0.019365f, 0.019461f, 0.019557f, 0.019653f, 0.019749f, 0.019845f,
+ 0.019940f, 0.020036f, 0.020132f, 0.020228f, 0.020324f, 0.020420f, 0.020516f, 0.020611f,
+ 0.020707f, 0.020803f, 0.020899f, 0.020995f, 0.021091f, 0.021187f, 0.021282f, 0.021378f,
+ 0.021474f, 0.021570f, 0.021666f, 0.021762f, 0.021857f, 0.021953f, 0.022049f, 0.022145f,
+ 0.022241f, 0.022337f, 0.022433f, 0.022528f, 0.022624f, 0.022720f, 0.022816f, 0.022912f,
+ 0.023008f, 0.023104f, 0.023199f, 0.023295f, 0.023391f, 0.023487f, 0.023583f, 0.023679f,
+ 0.023774f, 0.023870f, 0.023966f, 0.024062f, 0.024158f, 0.024254f, 0.024350f, 0.024445f,
+ 0.024541f, 0.024637f, 0.024733f, 0.024829f, 0.024925f, 0.025020f, 0.025116f, 0.025212f,
+ 0.025308f, 0.025404f, 0.025500f, 0.025596f, 0.025691f, 0.025787f, 0.025883f, 0.025979f,
+ 0.026075f, 0.026171f, 0.026266f, 0.026362f, 0.026458f, 0.026554f, 0.026650f, 0.026746f,
+ 0.026841f, 0.026937f, 0.027033f, 0.027129f, 0.027225f, 0.027321f, 0.027416f, 0.027512f,
+ 0.027608f, 0.027704f, 0.027800f, 0.027896f, 0.027991f, 0.028087f, 0.028183f, 0.028279f,
+ 0.028375f, 0.028471f, 0.028567f, 0.028662f, 0.028758f, 0.028854f, 0.028950f, 0.029046f,
+ 0.029142f, 0.029237f, 0.029333f, 0.029429f, 0.029525f, 0.029621f, 0.029717f, 0.029812f,
+ 0.029908f, 0.030004f, 0.030100f, 0.030196f, 0.030291f, 0.030387f, 0.030483f, 0.030579f,
+ 0.030675f, 0.030771f, 0.030866f, 0.030962f, 0.031058f, 0.031154f, 0.031250f, 0.031346f,
+ 0.031441f, 0.031537f, 0.031633f, 0.031729f, 0.031825f, 0.031921f, 0.032016f, 0.032112f,
+ 0.032208f, 0.032304f, 0.032400f, 0.032495f, 0.032591f, 0.032687f, 0.032783f, 0.032879f,
+ 0.032975f, 0.033070f, 0.033166f, 0.033262f, 0.033358f, 0.033454f, 0.033550f, 0.033645f,
+ 0.033741f, 0.033837f, 0.033933f, 0.034029f, 0.034124f, 0.034220f, 0.034316f, 0.034412f,
+ 0.034508f, 0.034604f, 0.034699f, 0.034795f, 0.034891f, 0.034987f, 0.035083f, 0.035178f,
+ 0.035274f, 0.035370f, 0.035466f, 0.035562f, 0.035657f, 0.035753f, 0.035849f, 0.035945f,
+ 0.036041f, 0.036137f, 0.036232f, 0.036328f, 0.036424f, 0.036520f, 0.036616f, 0.036711f,
+ 0.036807f, 0.036903f, 0.036999f, 0.037095f, 0.037190f, 0.037286f, 0.037382f, 0.037478f,
+ 0.037574f, 0.037669f, 0.037765f, 0.037861f, 0.037957f, 0.038053f, 0.038149f, 0.038244f,
+ 0.038340f, 0.038436f, 0.038532f, 0.038628f, 0.038723f, 0.038819f, 0.038915f, 0.039011f,
+ 0.039107f, 0.039202f, 0.039298f, 0.039394f, 0.039490f, 0.039586f, 0.039681f, 0.039777f,
+ 0.039873f, 0.039969f, 0.040065f, 0.040160f, 0.040256f, 0.040352f, 0.040448f, 0.040544f,
+ 0.040639f, 0.040735f, 0.040831f, 0.040927f, 0.041022f, 0.041118f, 0.041214f, 0.041310f,
+ 0.041406f, 0.041501f, 0.041597f, 0.041693f, 0.041789f, 0.041885f, 0.041980f, 0.042076f,
+ 0.042172f, 0.042268f, 0.042364f, 0.042459f, 0.042555f, 0.042651f, 0.042747f, 0.042842f,
+ 0.042938f, 0.043034f, 0.043130f, 0.043226f, 0.043321f, 0.043417f, 0.043513f, 0.043609f,
+ 0.043705f, 0.043800f, 0.043896f, 0.043992f, 0.044088f, 0.044183f, 0.044279f, 0.044375f,
+ 0.044471f, 0.044567f, 0.044662f, 0.044758f, 0.044854f, 0.044950f, 0.045045f, 0.045141f,
+ 0.045237f, 0.045333f, 0.045429f, 0.045524f, 0.045620f, 0.045716f, 0.045812f, 0.045907f,
+ 0.046003f, 0.046099f, 0.046195f, 0.046290f, 0.046386f, 0.046482f, 0.046578f, 0.046674f,
+ 0.046769f, 0.046865f, 0.046961f, 0.047057f, 0.047152f, 0.047248f, 0.047344f, 0.047440f,
+ 0.047535f, 0.047631f, 0.047727f, 0.047823f, 0.047919f, 0.048014f, 0.048110f, 0.048206f,
+ 0.048302f, 0.048397f, 0.048493f, 0.048589f, 0.048685f, 0.048780f, 0.048876f, 0.048972f,
+ 0.049068f, 0.049163f, 0.049259f, 0.049355f, 0.049451f, 0.049546f, 0.049642f, 0.049738f,
+ 0.049834f, 0.049929f, 0.050025f, 0.050121f, 0.050217f, 0.050312f, 0.050408f, 0.050504f,
+ 0.050600f, 0.050696f, 0.050791f, 0.050887f, 0.050983f, 0.051078f, 0.051174f, 0.051270f,
+ 0.051366f, 0.051461f, 0.051557f, 0.051653f, 0.051749f, 0.051844f, 0.051940f, 0.052036f,
+ 0.052132f, 0.052227f, 0.052323f, 0.052419f, 0.052515f, 0.052610f, 0.052706f, 0.052802f,
+ 0.052898f, 0.052993f, 0.053089f, 0.053185f, 0.053281f, 0.053376f, 0.053472f, 0.053568f,
+ 0.053664f, 0.053759f, 0.053855f, 0.053951f, 0.054046f, 0.054142f, 0.054238f, 0.054334f,
+ 0.054429f, 0.054525f, 0.054621f, 0.054717f, 0.054812f, 0.054908f, 0.055004f, 0.055100f,
+ 0.055195f, 0.055291f, 0.055387f, 0.055482f, 0.055578f, 0.055674f, 0.055770f, 0.055865f,
+ 0.055961f, 0.056057f, 0.056152f, 0.056248f, 0.056344f, 0.056440f, 0.056535f, 0.056631f,
+ 0.056727f, 0.056823f, 0.056918f, 0.057014f, 0.057110f, 0.057205f, 0.057301f, 0.057397f,
+ 0.057493f, 0.057588f, 0.057684f, 0.057780f, 0.057875f, 0.057971f, 0.058067f, 0.058163f,
+ 0.058258f, 0.058354f, 0.058450f, 0.058545f, 0.058641f, 0.058737f, 0.058833f, 0.058928f,
+ 0.059024f, 0.059120f, 0.059215f, 0.059311f, 0.059407f, 0.059502f, 0.059598f, 0.059694f,
+ 0.059790f, 0.059885f, 0.059981f, 0.060077f, 0.060172f, 0.060268f, 0.060364f, 0.060459f,
+ 0.060555f, 0.060651f, 0.060747f, 0.060842f, 0.060938f, 0.061034f, 0.061129f, 0.061225f,
+ 0.061321f, 0.061416f, 0.061512f, 0.061608f, 0.061704f, 0.061799f, 0.061895f, 0.061991f,
+ 0.062086f, 0.062182f, 0.062278f, 0.062373f, 0.062469f, 0.062565f, 0.062660f, 0.062756f,
+ 0.062852f, 0.062947f, 0.063043f, 0.063139f, 0.063234f, 0.063330f, 0.063426f, 0.063522f,
+ 0.063617f, 0.063713f, 0.063809f, 0.063904f, 0.064000f, 0.064096f, 0.064191f, 0.064287f,
+ 0.064383f, 0.064478f, 0.064574f, 0.064670f, 0.064765f, 0.064861f, 0.064957f, 0.065052f,
+ 0.065148f, 0.065244f, 0.065339f, 0.065435f, 0.065531f, 0.065626f, 0.065722f, 0.065818f,
+ 0.065913f, 0.066009f, 0.066105f, 0.066200f, 0.066296f, 0.066392f, 0.066487f, 0.066583f,
+ 0.066679f, 0.066774f, 0.066870f, 0.066966f, 0.067061f, 0.067157f, 0.067253f, 0.067348f,
+ 0.067444f, 0.067540f, 0.067635f, 0.067731f, 0.067827f, 0.067922f, 0.068018f, 0.068113f,
+ 0.068209f, 0.068305f, 0.068400f, 0.068496f, 0.068592f, 0.068687f, 0.068783f, 0.068879f,
+ 0.068974f, 0.069070f, 0.069166f, 0.069261f, 0.069357f, 0.069453f, 0.069548f, 0.069644f,
+ 0.069739f, 0.069835f, 0.069931f, 0.070026f, 0.070122f, 0.070218f, 0.070313f, 0.070409f,
+ 0.070505f, 0.070600f, 0.070696f, 0.070791f, 0.070887f, 0.070983f, 0.071078f, 0.071174f,
+ 0.071270f, 0.071365f, 0.071461f, 0.071557f, 0.071652f, 0.071748f, 0.071843f, 0.071939f,
+ 0.072035f, 0.072130f, 0.072226f, 0.072322f, 0.072417f, 0.072513f, 0.072608f, 0.072704f,
+ 0.072800f, 0.072895f, 0.072991f, 0.073086f, 0.073182f, 0.073278f, 0.073373f, 0.073469f,
+ 0.073565f, 0.073660f, 0.073756f, 0.073851f, 0.073947f, 0.074043f, 0.074138f, 0.074234f,
+ 0.074329f, 0.074425f, 0.074521f, 0.074616f, 0.074712f, 0.074807f, 0.074903f, 0.074999f,
+ 0.075094f, 0.075190f, 0.075286f, 0.075381f, 0.075477f, 0.075572f, 0.075668f, 0.075764f,
+ 0.075859f, 0.075955f, 0.076050f, 0.076146f, 0.076241f, 0.076337f, 0.076433f, 0.076528f,
+ 0.076624f, 0.076719f, 0.076815f, 0.076911f, 0.077006f, 0.077102f, 0.077197f, 0.077293f,
+ 0.077389f, 0.077484f, 0.077580f, 0.077675f, 0.077771f, 0.077866f, 0.077962f, 0.078058f,
+ 0.078153f, 0.078249f, 0.078344f, 0.078440f, 0.078536f, 0.078631f, 0.078727f, 0.078822f,
+ 0.078918f, 0.079013f, 0.079109f, 0.079205f, 0.079300f, 0.079396f, 0.079491f, 0.079587f,
+ 0.079682f, 0.079778f, 0.079874f, 0.079969f, 0.080065f, 0.080160f, 0.080256f, 0.080351f,
+ 0.080447f, 0.080543f, 0.080638f, 0.080734f, 0.080829f, 0.080925f, 0.081020f, 0.081116f,
+ 0.081211f, 0.081307f, 0.081403f, 0.081498f, 0.081594f, 0.081689f, 0.081785f, 0.081880f,
+ 0.081976f, 0.082071f, 0.082167f, 0.082263f, 0.082358f, 0.082454f, 0.082549f, 0.082645f,
+ 0.082740f, 0.082836f, 0.082931f, 0.083027f, 0.083122f, 0.083218f, 0.083314f, 0.083409f,
+ 0.083505f, 0.083600f, 0.083696f, 0.083791f, 0.083887f, 0.083982f, 0.084078f, 0.084173f,
+ 0.084269f, 0.084364f, 0.084460f, 0.084555f, 0.084651f, 0.084747f, 0.084842f, 0.084938f,
+ 0.085033f, 0.085129f, 0.085224f, 0.085320f, 0.085415f, 0.085511f, 0.085606f, 0.085702f,
+ 0.085797f, 0.085893f, 0.085988f, 0.086084f, 0.086179f, 0.086275f, 0.086370f, 0.086466f,
+ 0.086561f, 0.086657f, 0.086752f, 0.086848f, 0.086943f, 0.087039f, 0.087135f, 0.087230f,
+ 0.087326f, 0.087421f, 0.087517f, 0.087612f, 0.087708f, 0.087803f, 0.087899f, 0.087994f,
+ 0.088090f, 0.088185f, 0.088281f, 0.088376f, 0.088472f, 0.088567f, 0.088663f, 0.088758f,
+ 0.088854f, 0.088949f, 0.089045f, 0.089140f, 0.089236f, 0.089331f, 0.089427f, 0.089522f,
+ 0.089617f, 0.089713f, 0.089808f, 0.089904f, 0.089999f, 0.090095f, 0.090190f, 0.090286f,
+ 0.090381f, 0.090477f, 0.090572f, 0.090668f, 0.090763f, 0.090859f, 0.090954f, 0.091050f,
+ 0.091145f, 0.091241f, 0.091336f, 0.091432f, 0.091527f, 0.091623f, 0.091718f, 0.091813f,
+ 0.091909f, 0.092004f, 0.092100f, 0.092195f, 0.092291f, 0.092386f, 0.092482f, 0.092577f,
+ 0.092673f, 0.092768f, 0.092864f, 0.092959f, 0.093055f, 0.093150f, 0.093245f, 0.093341f,
+ 0.093436f, 0.093532f, 0.093627f, 0.093723f, 0.093818f, 0.093914f, 0.094009f, 0.094104f,
+ 0.094200f, 0.094295f, 0.094391f, 0.094486f, 0.094582f, 0.094677f, 0.094773f, 0.094868f,
+ 0.094963f, 0.095059f, 0.095154f, 0.095250f, 0.095345f, 0.095441f, 0.095536f, 0.095632f,
+ 0.095727f, 0.095822f, 0.095918f, 0.096013f, 0.096109f, 0.096204f, 0.096300f, 0.096395f,
+ 0.096490f, 0.096586f, 0.096681f, 0.096777f, 0.096872f, 0.096968f, 0.097063f, 0.097158f,
+ 0.097254f, 0.097349f, 0.097445f, 0.097540f, 0.097635f, 0.097731f, 0.097826f, 0.097922f,
+ 0.098017f, 0.098113f, 0.098208f, 0.098303f, 0.098399f, 0.098494f, 0.098590f, 0.098685f,
+ 0.098780f, 0.098876f, 0.098971f, 0.099067f, 0.099162f, 0.099257f, 0.099353f, 0.099448f,
+ 0.099544f, 0.099639f, 0.099734f, 0.099830f, 0.099925f, 0.100021f, 0.100116f, 0.100211f,
+ 0.100307f, 0.100402f, 0.100498f, 0.100593f, 0.100688f, 0.100784f, 0.100879f, 0.100974f,
+ 0.101070f, 0.101165f, 0.101261f, 0.101356f, 0.101451f, 0.101547f, 0.101642f, 0.101738f,
+ 0.101833f, 0.101928f, 0.102024f, 0.102119f, 0.102214f, 0.102310f, 0.102405f, 0.102500f,
+ 0.102596f, 0.102691f, 0.102787f, 0.102882f, 0.102977f, 0.103073f, 0.103168f, 0.103263f,
+ 0.103359f, 0.103454f, 0.103550f, 0.103645f, 0.103740f, 0.103836f, 0.103931f, 0.104026f,
+ 0.104122f, 0.104217f, 0.104312f, 0.104408f, 0.104503f, 0.104598f, 0.104694f, 0.104789f,
+ 0.104884f, 0.104980f, 0.105075f, 0.105170f, 0.105266f, 0.105361f, 0.105456f, 0.105552f,
+ 0.105647f, 0.105742f, 0.105838f, 0.105933f, 0.106028f, 0.106124f, 0.106219f, 0.106314f,
+ 0.106410f, 0.106505f, 0.106600f, 0.106696f, 0.106791f, 0.106886f, 0.106982f, 0.107077f,
+ 0.107172f, 0.107268f, 0.107363f, 0.107458f, 0.107554f, 0.107649f, 0.107744f, 0.107840f,
+ 0.107935f, 0.108030f, 0.108126f, 0.108221f, 0.108316f, 0.108412f, 0.108507f, 0.108602f,
+ 0.108697f, 0.108793f, 0.108888f, 0.108983f, 0.109079f, 0.109174f, 0.109269f, 0.109365f,
+ 0.109460f, 0.109555f, 0.109650f, 0.109746f, 0.109841f, 0.109936f, 0.110032f, 0.110127f,
+ 0.110222f, 0.110317f, 0.110413f, 0.110508f, 0.110603f, 0.110699f, 0.110794f, 0.110889f,
+ 0.110984f, 0.111080f, 0.111175f, 0.111270f, 0.111366f, 0.111461f, 0.111556f, 0.111651f,
+ 0.111747f, 0.111842f, 0.111937f, 0.112033f, 0.112128f, 0.112223f, 0.112318f, 0.112414f,
+ 0.112509f, 0.112604f, 0.112699f, 0.112795f, 0.112890f, 0.112985f, 0.113080f, 0.113176f,
+ 0.113271f, 0.113366f, 0.113461f, 0.113557f, 0.113652f, 0.113747f, 0.113842f, 0.113938f,
+ 0.114033f, 0.114128f, 0.114223f, 0.114319f, 0.114414f, 0.114509f, 0.114604f, 0.114700f,
+ 0.114795f, 0.114890f, 0.114985f, 0.115081f, 0.115176f, 0.115271f, 0.115366f, 0.115462f,
+ 0.115557f, 0.115652f, 0.115747f, 0.115842f, 0.115938f, 0.116033f, 0.116128f, 0.116223f,
+ 0.116319f, 0.116414f, 0.116509f, 0.116604f, 0.116700f, 0.116795f, 0.116890f, 0.116985f,
+ 0.117080f, 0.117176f, 0.117271f, 0.117366f, 0.117461f, 0.117556f, 0.117652f, 0.117747f,
+ 0.117842f, 0.117937f, 0.118032f, 0.118128f, 0.118223f, 0.118318f, 0.118413f, 0.118508f,
+ 0.118604f, 0.118699f, 0.118794f, 0.118889f, 0.118984f, 0.119080f, 0.119175f, 0.119270f,
+ 0.119365f, 0.119460f, 0.119556f, 0.119651f, 0.119746f, 0.119841f, 0.119936f, 0.120032f,
+ 0.120127f, 0.120222f, 0.120317f, 0.120412f, 0.120507f, 0.120603f, 0.120698f, 0.120793f,
+ 0.120888f, 0.120983f, 0.121078f, 0.121174f, 0.121269f, 0.121364f, 0.121459f, 0.121554f,
+ 0.121649f, 0.121745f, 0.121840f, 0.121935f, 0.122030f, 0.122125f, 0.122220f, 0.122316f,
+ 0.122411f, 0.122506f, 0.122601f, 0.122696f, 0.122791f, 0.122886f, 0.122982f, 0.123077f,
+ 0.123172f, 0.123267f, 0.123362f, 0.123457f, 0.123552f, 0.123648f, 0.123743f, 0.123838f,
+ 0.123933f, 0.124028f, 0.124123f, 0.124218f, 0.124314f, 0.124409f, 0.124504f, 0.124599f,
+ 0.124694f, 0.124789f, 0.124884f, 0.124979f, 0.125075f, 0.125170f, 0.125265f, 0.125360f,
+ 0.125455f, 0.125550f, 0.125645f, 0.125740f, 0.125835f, 0.125931f, 0.126026f, 0.126121f,
+ 0.126216f, 0.126311f, 0.126406f, 0.126501f, 0.126596f, 0.126691f, 0.126787f, 0.126882f,
+ 0.126977f, 0.127072f, 0.127167f, 0.127262f, 0.127357f, 0.127452f, 0.127547f, 0.127642f,
+ 0.127737f, 0.127833f, 0.127928f, 0.128023f, 0.128118f, 0.128213f, 0.128308f, 0.128403f,
+ 0.128498f, 0.128593f, 0.128688f, 0.128783f, 0.128878f, 0.128973f, 0.129069f, 0.129164f,
+ 0.129259f, 0.129354f, 0.129449f, 0.129544f, 0.129639f, 0.129734f, 0.129829f, 0.129924f,
+ 0.130019f, 0.130114f, 0.130209f, 0.130304f, 0.130399f, 0.130495f, 0.130590f, 0.130685f,
+ 0.130780f, 0.130875f, 0.130970f, 0.131065f, 0.131160f, 0.131255f, 0.131350f, 0.131445f,
+ 0.131540f, 0.131635f, 0.131730f, 0.131825f, 0.131920f, 0.132015f, 0.132110f, 0.132205f,
+ 0.132300f, 0.132395f, 0.132490f, 0.132585f, 0.132680f, 0.132775f, 0.132870f, 0.132966f,
+ 0.133061f, 0.133156f, 0.133251f, 0.133346f, 0.133441f, 0.133536f, 0.133631f, 0.133726f,
+ 0.133821f, 0.133916f, 0.134011f, 0.134106f, 0.134201f, 0.134296f, 0.134391f, 0.134486f,
+ 0.134581f, 0.134676f, 0.134771f, 0.134866f, 0.134961f, 0.135056f, 0.135151f, 0.135246f,
+ 0.135341f, 0.135436f, 0.135531f, 0.135626f, 0.135721f, 0.135816f, 0.135911f, 0.136006f,
+ 0.136101f, 0.136196f, 0.136291f, 0.136386f, 0.136480f, 0.136575f, 0.136670f, 0.136765f,
+ 0.136860f, 0.136955f, 0.137050f, 0.137145f, 0.137240f, 0.137335f, 0.137430f, 0.137525f,
+ 0.137620f, 0.137715f, 0.137810f, 0.137905f, 0.138000f, 0.138095f, 0.138190f, 0.138285f,
+ 0.138380f, 0.138475f, 0.138570f, 0.138665f, 0.138760f, 0.138855f, 0.138949f, 0.139044f,
+ 0.139139f, 0.139234f, 0.139329f, 0.139424f, 0.139519f, 0.139614f, 0.139709f, 0.139804f,
+ 0.139899f, 0.139994f, 0.140089f, 0.140184f, 0.140279f, 0.140373f, 0.140468f, 0.140563f,
+ 0.140658f, 0.140753f, 0.140848f, 0.140943f, 0.141038f, 0.141133f, 0.141228f, 0.141323f,
+ 0.141418f, 0.141512f, 0.141607f, 0.141702f, 0.141797f, 0.141892f, 0.141987f, 0.142082f,
+ 0.142177f, 0.142272f, 0.142367f, 0.142461f, 0.142556f, 0.142651f, 0.142746f, 0.142841f,
+ 0.142936f, 0.143031f, 0.143126f, 0.143221f, 0.143316f, 0.143410f, 0.143505f, 0.143600f,
+ 0.143695f, 0.143790f, 0.143885f, 0.143980f, 0.144075f, 0.144169f, 0.144264f, 0.144359f,
+ 0.144454f, 0.144549f, 0.144644f, 0.144739f, 0.144833f, 0.144928f, 0.145023f, 0.145118f,
+ 0.145213f, 0.145308f, 0.145403f, 0.145497f, 0.145592f, 0.145687f, 0.145782f, 0.145877f,
+ 0.145972f, 0.146067f, 0.146161f, 0.146256f, 0.146351f, 0.146446f, 0.146541f, 0.146636f,
+ 0.146730f, 0.146825f, 0.146920f, 0.147015f, 0.147110f, 0.147205f, 0.147299f, 0.147394f,
+ 0.147489f, 0.147584f, 0.147679f, 0.147774f, 0.147868f, 0.147963f, 0.148058f, 0.148153f,
+ 0.148248f, 0.148342f, 0.148437f, 0.148532f, 0.148627f, 0.148722f, 0.148817f, 0.148911f,
+ 0.149006f, 0.149101f, 0.149196f, 0.149291f, 0.149385f, 0.149480f, 0.149575f, 0.149670f,
+ 0.149765f, 0.149859f, 0.149954f, 0.150049f, 0.150144f, 0.150238f, 0.150333f, 0.150428f,
+ 0.150523f, 0.150618f, 0.150712f, 0.150807f, 0.150902f, 0.150997f, 0.151092f, 0.151186f,
+ 0.151281f, 0.151376f, 0.151471f, 0.151565f, 0.151660f, 0.151755f, 0.151850f, 0.151944f,
+ 0.152039f, 0.152134f, 0.152229f, 0.152323f, 0.152418f, 0.152513f, 0.152608f, 0.152702f,
+ 0.152797f, 0.152892f, 0.152987f, 0.153081f, 0.153176f, 0.153271f, 0.153366f, 0.153460f,
+ 0.153555f, 0.153650f, 0.153745f, 0.153839f, 0.153934f, 0.154029f, 0.154124f, 0.154218f,
+ 0.154313f, 0.154408f, 0.154502f, 0.154597f, 0.154692f, 0.154787f, 0.154881f, 0.154976f,
+ 0.155071f, 0.155165f, 0.155260f, 0.155355f, 0.155450f, 0.155544f, 0.155639f, 0.155734f,
+ 0.155828f, 0.155923f, 0.156018f, 0.156112f, 0.156207f, 0.156302f, 0.156397f, 0.156491f,
+ 0.156586f, 0.156681f, 0.156775f, 0.156870f, 0.156965f, 0.157059f, 0.157154f, 0.157249f,
+ 0.157343f, 0.157438f, 0.157533f, 0.157627f, 0.157722f, 0.157817f, 0.157912f, 0.158006f,
+ 0.158101f, 0.158196f, 0.158290f, 0.158385f, 0.158480f, 0.158574f, 0.158669f, 0.158763f,
+ 0.158858f, 0.158953f, 0.159047f, 0.159142f, 0.159237f, 0.159331f, 0.159426f, 0.159521f,
+ 0.159615f, 0.159710f, 0.159805f, 0.159899f, 0.159994f, 0.160089f, 0.160183f, 0.160278f,
+ 0.160372f, 0.160467f, 0.160562f, 0.160656f, 0.160751f, 0.160846f, 0.160940f, 0.161035f,
+ 0.161129f, 0.161224f, 0.161319f, 0.161413f, 0.161508f, 0.161603f, 0.161697f, 0.161792f,
+ 0.161886f, 0.161981f, 0.162076f, 0.162170f, 0.162265f, 0.162359f, 0.162454f, 0.162549f,
+ 0.162643f, 0.162738f, 0.162832f, 0.162927f, 0.163022f, 0.163116f, 0.163211f, 0.163305f,
+ 0.163400f, 0.163495f, 0.163589f, 0.163684f, 0.163778f, 0.163873f, 0.163967f, 0.164062f,
+ 0.164157f, 0.164251f, 0.164346f, 0.164440f, 0.164535f, 0.164629f, 0.164724f, 0.164819f,
+ 0.164913f, 0.165008f, 0.165102f, 0.165197f, 0.165291f, 0.165386f, 0.165480f, 0.165575f,
+ 0.165670f, 0.165764f, 0.165859f, 0.165953f, 0.166048f, 0.166142f, 0.166237f, 0.166331f,
+ 0.166426f, 0.166520f, 0.166615f, 0.166710f, 0.166804f, 0.166899f, 0.166993f, 0.167088f,
+ 0.167182f, 0.167277f, 0.167371f, 0.167466f, 0.167560f, 0.167655f, 0.167749f, 0.167844f,
+ 0.167938f, 0.168033f, 0.168127f, 0.168222f, 0.168316f, 0.168411f, 0.168505f, 0.168600f,
+ 0.168694f, 0.168789f, 0.168883f, 0.168978f, 0.169072f, 0.169167f, 0.169261f, 0.169356f,
+ 0.169450f, 0.169545f, 0.169639f, 0.169734f, 0.169828f, 0.169923f, 0.170017f, 0.170112f,
+ 0.170206f, 0.170301f, 0.170395f, 0.170490f, 0.170584f, 0.170678f, 0.170773f, 0.170867f,
+ 0.170962f, 0.171056f, 0.171151f, 0.171245f, 0.171340f, 0.171434f, 0.171529f, 0.171623f,
+ 0.171718f, 0.171812f, 0.171906f, 0.172001f, 0.172095f, 0.172190f, 0.172284f, 0.172379f,
+ 0.172473f, 0.172568f, 0.172662f, 0.172756f, 0.172851f, 0.172945f, 0.173040f, 0.173134f,
+ 0.173229f, 0.173323f, 0.173417f, 0.173512f, 0.173606f, 0.173701f, 0.173795f, 0.173889f,
+ 0.173984f, 0.174078f, 0.174173f, 0.174267f, 0.174362f, 0.174456f, 0.174550f, 0.174645f,
+ 0.174739f, 0.174834f, 0.174928f, 0.175022f, 0.175117f, 0.175211f, 0.175305f, 0.175400f,
+ 0.175494f, 0.175589f, 0.175683f, 0.175777f, 0.175872f, 0.175966f, 0.176061f, 0.176155f,
+ 0.176249f, 0.176344f, 0.176438f, 0.176532f, 0.176627f, 0.176721f, 0.176815f, 0.176910f,
+ 0.177004f, 0.177099f, 0.177193f, 0.177287f, 0.177382f, 0.177476f, 0.177570f, 0.177665f,
+ 0.177759f, 0.177853f, 0.177948f, 0.178042f, 0.178136f, 0.178231f, 0.178325f, 0.178419f,
+ 0.178514f, 0.178608f, 0.178702f, 0.178797f, 0.178891f, 0.178985f, 0.179080f, 0.179174f,
+ 0.179268f, 0.179363f, 0.179457f, 0.179551f, 0.179646f, 0.179740f, 0.179834f, 0.179929f,
+ 0.180023f, 0.180117f, 0.180212f, 0.180306f, 0.180400f, 0.180494f, 0.180589f, 0.180683f,
+ 0.180777f, 0.180872f, 0.180966f, 0.181060f, 0.181154f, 0.181249f, 0.181343f, 0.181437f,
+ 0.181532f, 0.181626f, 0.181720f, 0.181814f, 0.181909f, 0.182003f, 0.182097f, 0.182192f,
+ 0.182286f, 0.182380f, 0.182474f, 0.182569f, 0.182663f, 0.182757f, 0.182851f, 0.182946f,
+ 0.183040f, 0.183134f, 0.183228f, 0.183323f, 0.183417f, 0.183511f, 0.183605f, 0.183700f,
+ 0.183794f, 0.183888f, 0.183982f, 0.184077f, 0.184171f, 0.184265f, 0.184359f, 0.184454f,
+ 0.184548f, 0.184642f, 0.184736f, 0.184830f, 0.184925f, 0.185019f, 0.185113f, 0.185207f,
+ 0.185301f, 0.185396f, 0.185490f, 0.185584f, 0.185678f, 0.185773f, 0.185867f, 0.185961f,
+ 0.186055f, 0.186149f, 0.186244f, 0.186338f, 0.186432f, 0.186526f, 0.186620f, 0.186715f,
+ 0.186809f, 0.186903f, 0.186997f, 0.187091f, 0.187185f, 0.187280f, 0.187374f, 0.187468f,
+ 0.187562f, 0.187656f, 0.187750f, 0.187845f, 0.187939f, 0.188033f, 0.188127f, 0.188221f,
+ 0.188315f, 0.188410f, 0.188504f, 0.188598f, 0.188692f, 0.188786f, 0.188880f, 0.188975f,
+ 0.189069f, 0.189163f, 0.189257f, 0.189351f, 0.189445f, 0.189539f, 0.189634f, 0.189728f,
+ 0.189822f, 0.189916f, 0.190010f, 0.190104f, 0.190198f, 0.190292f, 0.190387f, 0.190481f,
+ 0.190575f, 0.190669f, 0.190763f, 0.190857f, 0.190951f, 0.191045f, 0.191139f, 0.191234f,
+ 0.191328f, 0.191422f, 0.191516f, 0.191610f, 0.191704f, 0.191798f, 0.191892f, 0.191986f,
+ 0.192080f, 0.192174f, 0.192269f, 0.192363f, 0.192457f, 0.192551f, 0.192645f, 0.192739f,
+ 0.192833f, 0.192927f, 0.193021f, 0.193115f, 0.193209f, 0.193303f, 0.193397f, 0.193492f,
+ 0.193586f, 0.193680f, 0.193774f, 0.193868f, 0.193962f, 0.194056f, 0.194150f, 0.194244f,
+ 0.194338f, 0.194432f, 0.194526f, 0.194620f, 0.194714f, 0.194808f, 0.194902f, 0.194996f,
+ 0.195090f, 0.195184f, 0.195278f, 0.195372f, 0.195466f, 0.195560f, 0.195654f, 0.195748f,
+ 0.195843f, 0.195937f, 0.196031f, 0.196125f, 0.196219f, 0.196313f, 0.196407f, 0.196501f,
+ 0.196595f, 0.196689f, 0.196783f, 0.196877f, 0.196971f, 0.197065f, 0.197159f, 0.197253f,
+ 0.197347f, 0.197441f, 0.197535f, 0.197629f, 0.197722f, 0.197816f, 0.197910f, 0.198004f,
+ 0.198098f, 0.198192f, 0.198286f, 0.198380f, 0.198474f, 0.198568f, 0.198662f, 0.198756f,
+ 0.198850f, 0.198944f, 0.199038f, 0.199132f, 0.199226f, 0.199320f, 0.199414f, 0.199508f,
+ 0.199602f, 0.199696f, 0.199790f, 0.199884f, 0.199978f, 0.200071f, 0.200165f, 0.200259f,
+ 0.200353f, 0.200447f, 0.200541f, 0.200635f, 0.200729f, 0.200823f, 0.200917f, 0.201011f,
+ 0.201105f, 0.201199f, 0.201292f, 0.201386f, 0.201480f, 0.201574f, 0.201668f, 0.201762f,
+ 0.201856f, 0.201950f, 0.202044f, 0.202138f, 0.202231f, 0.202325f, 0.202419f, 0.202513f,
+ 0.202607f, 0.202701f, 0.202795f, 0.202889f, 0.202983f, 0.203076f, 0.203170f, 0.203264f,
+ 0.203358f, 0.203452f, 0.203546f, 0.203640f, 0.203734f, 0.203827f, 0.203921f, 0.204015f,
+ 0.204109f, 0.204203f, 0.204297f, 0.204391f, 0.204484f, 0.204578f, 0.204672f, 0.204766f,
+ 0.204860f, 0.204954f, 0.205047f, 0.205141f, 0.205235f, 0.205329f, 0.205423f, 0.205517f,
+ 0.205610f, 0.205704f, 0.205798f, 0.205892f, 0.205986f, 0.206080f, 0.206173f, 0.206267f,
+ 0.206361f, 0.206455f, 0.206549f, 0.206642f, 0.206736f, 0.206830f, 0.206924f, 0.207018f,
+ 0.207111f, 0.207205f, 0.207299f, 0.207393f, 0.207487f, 0.207580f, 0.207674f, 0.207768f,
+ 0.207862f, 0.207955f, 0.208049f, 0.208143f, 0.208237f, 0.208331f, 0.208424f, 0.208518f,
+ 0.208612f, 0.208706f, 0.208799f, 0.208893f, 0.208987f, 0.209081f, 0.209174f, 0.209268f,
+ 0.209362f, 0.209456f, 0.209549f, 0.209643f, 0.209737f, 0.209831f, 0.209924f, 0.210018f,
+ 0.210112f, 0.210206f, 0.210299f, 0.210393f, 0.210487f, 0.210580f, 0.210674f, 0.210768f,
+ 0.210862f, 0.210955f, 0.211049f, 0.211143f, 0.211237f, 0.211330f, 0.211424f, 0.211518f,
+ 0.211611f, 0.211705f, 0.211799f, 0.211892f, 0.211986f, 0.212080f, 0.212174f, 0.212267f,
+ 0.212361f, 0.212455f, 0.212548f, 0.212642f, 0.212736f, 0.212829f, 0.212923f, 0.213017f,
+ 0.213110f, 0.213204f, 0.213298f, 0.213391f, 0.213485f, 0.213579f, 0.213672f, 0.213766f,
+ 0.213860f, 0.213953f, 0.214047f, 0.214141f, 0.214234f, 0.214328f, 0.214422f, 0.214515f,
+ 0.214609f, 0.214702f, 0.214796f, 0.214890f, 0.214983f, 0.215077f, 0.215171f, 0.215264f,
+ 0.215358f, 0.215451f, 0.215545f, 0.215639f, 0.215732f, 0.215826f, 0.215920f, 0.216013f,
+ 0.216107f, 0.216200f, 0.216294f, 0.216388f, 0.216481f, 0.216575f, 0.216668f, 0.216762f,
+ 0.216856f, 0.216949f, 0.217043f, 0.217136f, 0.217230f, 0.217324f, 0.217417f, 0.217511f,
+ 0.217604f, 0.217698f, 0.217791f, 0.217885f, 0.217979f, 0.218072f, 0.218166f, 0.218259f,
+ 0.218353f, 0.218446f, 0.218540f, 0.218633f, 0.218727f, 0.218821f, 0.218914f, 0.219008f,
+ 0.219101f, 0.219195f, 0.219288f, 0.219382f, 0.219475f, 0.219569f, 0.219662f, 0.219756f,
+ 0.219850f, 0.219943f, 0.220037f, 0.220130f, 0.220224f, 0.220317f, 0.220411f, 0.220504f,
+ 0.220598f, 0.220691f, 0.220785f, 0.220878f, 0.220972f, 0.221065f, 0.221159f, 0.221252f,
+ 0.221346f, 0.221439f, 0.221533f, 0.221626f, 0.221720f, 0.221813f, 0.221907f, 0.222000f,
+ 0.222094f, 0.222187f, 0.222281f, 0.222374f, 0.222468f, 0.222561f, 0.222654f, 0.222748f,
+ 0.222841f, 0.222935f, 0.223028f, 0.223122f, 0.223215f, 0.223309f, 0.223402f, 0.223496f,
+ 0.223589f, 0.223682f, 0.223776f, 0.223869f, 0.223963f, 0.224056f, 0.224150f, 0.224243f,
+ 0.224337f, 0.224430f, 0.224523f, 0.224617f, 0.224710f, 0.224804f, 0.224897f, 0.224991f,
+ 0.225084f, 0.225177f, 0.225271f, 0.225364f, 0.225458f, 0.225551f, 0.225644f, 0.225738f,
+ 0.225831f, 0.225925f, 0.226018f, 0.226111f, 0.226205f, 0.226298f, 0.226391f, 0.226485f,
+ 0.226578f, 0.226672f, 0.226765f, 0.226858f, 0.226952f, 0.227045f, 0.227139f, 0.227232f,
+ 0.227325f, 0.227419f, 0.227512f, 0.227605f, 0.227699f, 0.227792f, 0.227885f, 0.227979f,
+ 0.228072f, 0.228165f, 0.228259f, 0.228352f, 0.228445f, 0.228539f, 0.228632f, 0.228725f,
+ 0.228819f, 0.228912f, 0.229005f, 0.229099f, 0.229192f, 0.229285f, 0.229379f, 0.229472f,
+ 0.229565f, 0.229659f, 0.229752f, 0.229845f, 0.229939f, 0.230032f, 0.230125f, 0.230218f,
+ 0.230312f, 0.230405f, 0.230498f, 0.230592f, 0.230685f, 0.230778f, 0.230872f, 0.230965f,
+ 0.231058f, 0.231151f, 0.231245f, 0.231338f, 0.231431f, 0.231524f, 0.231618f, 0.231711f,
+ 0.231804f, 0.231898f, 0.231991f, 0.232084f, 0.232177f, 0.232271f, 0.232364f, 0.232457f,
+ 0.232550f, 0.232644f, 0.232737f, 0.232830f, 0.232923f, 0.233017f, 0.233110f, 0.233203f,
+ 0.233296f, 0.233389f, 0.233483f, 0.233576f, 0.233669f, 0.233762f, 0.233856f, 0.233949f,
+ 0.234042f, 0.234135f, 0.234228f, 0.234322f, 0.234415f, 0.234508f, 0.234601f, 0.234694f,
+ 0.234788f, 0.234881f, 0.234974f, 0.235067f, 0.235160f, 0.235254f, 0.235347f, 0.235440f,
+ 0.235533f, 0.235626f, 0.235719f, 0.235813f, 0.235906f, 0.235999f, 0.236092f, 0.236185f,
+ 0.236278f, 0.236372f, 0.236465f, 0.236558f, 0.236651f, 0.236744f, 0.236837f, 0.236930f,
+ 0.237024f, 0.237117f, 0.237210f, 0.237303f, 0.237396f, 0.237489f, 0.237582f, 0.237676f,
+ 0.237769f, 0.237862f, 0.237955f, 0.238048f, 0.238141f, 0.238234f, 0.238327f, 0.238420f,
+ 0.238514f, 0.238607f, 0.238700f, 0.238793f, 0.238886f, 0.238979f, 0.239072f, 0.239165f,
+ 0.239258f, 0.239351f, 0.239445f, 0.239538f, 0.239631f, 0.239724f, 0.239817f, 0.239910f,
+ 0.240003f, 0.240096f, 0.240189f, 0.240282f, 0.240375f, 0.240468f, 0.240561f, 0.240654f,
+ 0.240748f, 0.240841f, 0.240934f, 0.241027f, 0.241120f, 0.241213f, 0.241306f, 0.241399f,
+ 0.241492f, 0.241585f, 0.241678f, 0.241771f, 0.241864f, 0.241957f, 0.242050f, 0.242143f,
+ 0.242236f, 0.242329f, 0.242422f, 0.242515f, 0.242608f, 0.242701f, 0.242794f, 0.242887f,
+ 0.242980f, 0.243073f, 0.243166f, 0.243259f, 0.243352f, 0.243445f, 0.243538f, 0.243631f,
+ 0.243724f, 0.243817f, 0.243910f, 0.244003f, 0.244096f, 0.244189f, 0.244282f, 0.244375f,
+ 0.244468f, 0.244561f, 0.244654f, 0.244747f, 0.244840f, 0.244933f, 0.245026f, 0.245119f,
+ 0.245212f, 0.245304f, 0.245397f, 0.245490f, 0.245583f, 0.245676f, 0.245769f, 0.245862f,
+ 0.245955f, 0.246048f, 0.246141f, 0.246234f, 0.246327f, 0.246420f, 0.246513f, 0.246606f,
+ 0.246698f, 0.246791f, 0.246884f, 0.246977f, 0.247070f, 0.247163f, 0.247256f, 0.247349f,
+ 0.247442f, 0.247535f, 0.247627f, 0.247720f, 0.247813f, 0.247906f, 0.247999f, 0.248092f,
+ 0.248185f, 0.248278f, 0.248370f, 0.248463f, 0.248556f, 0.248649f, 0.248742f, 0.248835f,
+ 0.248928f, 0.249020f, 0.249113f, 0.249206f, 0.249299f, 0.249392f, 0.249485f, 0.249578f,
+ 0.249670f, 0.249763f, 0.249856f, 0.249949f, 0.250042f, 0.250135f, 0.250227f, 0.250320f,
+ 0.250413f, 0.250506f, 0.250599f, 0.250691f, 0.250784f, 0.250877f, 0.250970f, 0.251063f,
+ 0.251155f, 0.251248f, 0.251341f, 0.251434f, 0.251527f, 0.251619f, 0.251712f, 0.251805f,
+ 0.251898f, 0.251991f, 0.252083f, 0.252176f, 0.252269f, 0.252362f, 0.252454f, 0.252547f,
+ 0.252640f, 0.252733f, 0.252826f, 0.252918f, 0.253011f, 0.253104f, 0.253197f, 0.253289f,
+ 0.253382f, 0.253475f, 0.253568f, 0.253660f, 0.253753f, 0.253846f, 0.253938f, 0.254031f,
+ 0.254124f, 0.254217f, 0.254309f, 0.254402f, 0.254495f, 0.254588f, 0.254680f, 0.254773f,
+ 0.254866f, 0.254958f, 0.255051f, 0.255144f, 0.255236f, 0.255329f, 0.255422f, 0.255515f,
+ 0.255607f, 0.255700f, 0.255793f, 0.255885f, 0.255978f, 0.256071f, 0.256163f, 0.256256f,
+ 0.256349f, 0.256441f, 0.256534f, 0.256627f, 0.256719f, 0.256812f, 0.256905f, 0.256997f,
+ 0.257090f, 0.257183f, 0.257275f, 0.257368f, 0.257461f, 0.257553f, 0.257646f, 0.257738f,
+ 0.257831f, 0.257924f, 0.258016f, 0.258109f, 0.258202f, 0.258294f, 0.258387f, 0.258479f,
+ 0.258572f, 0.258665f, 0.258757f, 0.258850f, 0.258943f, 0.259035f, 0.259128f, 0.259220f,
+ 0.259313f, 0.259405f, 0.259498f, 0.259591f, 0.259683f, 0.259776f, 0.259868f, 0.259961f,
+ 0.260054f, 0.260146f, 0.260239f, 0.260331f, 0.260424f, 0.260516f, 0.260609f, 0.260702f,
+ 0.260794f, 0.260887f, 0.260979f, 0.261072f, 0.261164f, 0.261257f, 0.261349f, 0.261442f,
+ 0.261534f, 0.261627f, 0.261720f, 0.261812f, 0.261905f, 0.261997f, 0.262090f, 0.262182f,
+ 0.262275f, 0.262367f, 0.262460f, 0.262552f, 0.262645f, 0.262737f, 0.262830f, 0.262922f,
+ 0.263015f, 0.263107f, 0.263200f, 0.263292f, 0.263385f, 0.263477f, 0.263570f, 0.263662f,
+ 0.263755f, 0.263847f, 0.263940f, 0.264032f, 0.264125f, 0.264217f, 0.264309f, 0.264402f,
+ 0.264494f, 0.264587f, 0.264679f, 0.264772f, 0.264864f, 0.264957f, 0.265049f, 0.265142f,
+ 0.265234f, 0.265326f, 0.265419f, 0.265511f, 0.265604f, 0.265696f, 0.265789f, 0.265881f,
+ 0.265973f, 0.266066f, 0.266158f, 0.266251f, 0.266343f, 0.266436f, 0.266528f, 0.266620f,
+ 0.266713f, 0.266805f, 0.266898f, 0.266990f, 0.267082f, 0.267175f, 0.267267f, 0.267359f,
+ 0.267452f, 0.267544f, 0.267637f, 0.267729f, 0.267821f, 0.267914f, 0.268006f, 0.268099f,
+ 0.268191f, 0.268283f, 0.268376f, 0.268468f, 0.268560f, 0.268653f, 0.268745f, 0.268837f,
+ 0.268930f, 0.269022f, 0.269114f, 0.269207f, 0.269299f, 0.269391f, 0.269484f, 0.269576f,
+ 0.269668f, 0.269761f, 0.269853f, 0.269945f, 0.270038f, 0.270130f, 0.270222f, 0.270315f,
+ 0.270407f, 0.270499f, 0.270591f, 0.270684f, 0.270776f, 0.270868f, 0.270961f, 0.271053f,
+ 0.271145f, 0.271237f, 0.271330f, 0.271422f, 0.271514f, 0.271607f, 0.271699f, 0.271791f,
+ 0.271883f, 0.271976f, 0.272068f, 0.272160f, 0.272252f, 0.272345f, 0.272437f, 0.272529f,
+ 0.272621f, 0.272714f, 0.272806f, 0.272898f, 0.272990f, 0.273083f, 0.273175f, 0.273267f,
+ 0.273359f, 0.273451f, 0.273544f, 0.273636f, 0.273728f, 0.273820f, 0.273912f, 0.274005f,
+ 0.274097f, 0.274189f, 0.274281f, 0.274374f, 0.274466f, 0.274558f, 0.274650f, 0.274742f,
+ 0.274834f, 0.274927f, 0.275019f, 0.275111f, 0.275203f, 0.275295f, 0.275387f, 0.275480f,
+ 0.275572f, 0.275664f, 0.275756f, 0.275848f, 0.275940f, 0.276033f, 0.276125f, 0.276217f,
+ 0.276309f, 0.276401f, 0.276493f, 0.276585f, 0.276678f, 0.276770f, 0.276862f, 0.276954f,
+ 0.277046f, 0.277138f, 0.277230f, 0.277322f, 0.277415f, 0.277507f, 0.277599f, 0.277691f,
+ 0.277783f, 0.277875f, 0.277967f, 0.278059f, 0.278151f, 0.278243f, 0.278336f, 0.278428f,
+ 0.278520f, 0.278612f, 0.278704f, 0.278796f, 0.278888f, 0.278980f, 0.279072f, 0.279164f,
+ 0.279256f, 0.279348f, 0.279440f, 0.279532f, 0.279624f, 0.279717f, 0.279809f, 0.279901f,
+ 0.279993f, 0.280085f, 0.280177f, 0.280269f, 0.280361f, 0.280453f, 0.280545f, 0.280637f,
+ 0.280729f, 0.280821f, 0.280913f, 0.281005f, 0.281097f, 0.281189f, 0.281281f, 0.281373f,
+ 0.281465f, 0.281557f, 0.281649f, 0.281741f, 0.281833f, 0.281925f, 0.282017f, 0.282109f,
+ 0.282201f, 0.282293f, 0.282385f, 0.282477f, 0.282569f, 0.282661f, 0.282753f, 0.282845f,
+ 0.282937f, 0.283029f, 0.283120f, 0.283212f, 0.283304f, 0.283396f, 0.283488f, 0.283580f,
+ 0.283672f, 0.283764f, 0.283856f, 0.283948f, 0.284040f, 0.284132f, 0.284224f, 0.284316f,
+ 0.284408f, 0.284499f, 0.284591f, 0.284683f, 0.284775f, 0.284867f, 0.284959f, 0.285051f,
+ 0.285143f, 0.285235f, 0.285327f, 0.285418f, 0.285510f, 0.285602f, 0.285694f, 0.285786f,
+ 0.285878f, 0.285970f, 0.286062f, 0.286153f, 0.286245f, 0.286337f, 0.286429f, 0.286521f,
+ 0.286613f, 0.286705f, 0.286796f, 0.286888f, 0.286980f, 0.287072f, 0.287164f, 0.287256f,
+ 0.287347f, 0.287439f, 0.287531f, 0.287623f, 0.287715f, 0.287807f, 0.287898f, 0.287990f,
+ 0.288082f, 0.288174f, 0.288266f, 0.288357f, 0.288449f, 0.288541f, 0.288633f, 0.288725f,
+ 0.288816f, 0.288908f, 0.289000f, 0.289092f, 0.289184f, 0.289275f, 0.289367f, 0.289459f,
+ 0.289551f, 0.289642f, 0.289734f, 0.289826f, 0.289918f, 0.290009f, 0.290101f, 0.290193f,
+ 0.290285f, 0.290376f, 0.290468f, 0.290560f, 0.290652f, 0.290743f, 0.290835f, 0.290927f,
+ 0.291019f, 0.291110f, 0.291202f, 0.291294f, 0.291385f, 0.291477f, 0.291569f, 0.291661f,
+ 0.291752f, 0.291844f, 0.291936f, 0.292027f, 0.292119f, 0.292211f, 0.292302f, 0.292394f,
+ 0.292486f, 0.292577f, 0.292669f, 0.292761f, 0.292852f, 0.292944f, 0.293036f, 0.293128f,
+ 0.293219f, 0.293311f, 0.293402f, 0.293494f, 0.293586f, 0.293677f, 0.293769f, 0.293861f,
+ 0.293952f, 0.294044f, 0.294136f, 0.294227f, 0.294319f, 0.294410f, 0.294502f, 0.294594f,
+ 0.294685f, 0.294777f, 0.294869f, 0.294960f, 0.295052f, 0.295143f, 0.295235f, 0.295327f,
+ 0.295418f, 0.295510f, 0.295601f, 0.295693f, 0.295785f, 0.295876f, 0.295968f, 0.296059f,
+ 0.296151f, 0.296242f, 0.296334f, 0.296426f, 0.296517f, 0.296609f, 0.296700f, 0.296792f,
+ 0.296883f, 0.296975f, 0.297066f, 0.297158f, 0.297250f, 0.297341f, 0.297433f, 0.297524f,
+ 0.297616f, 0.297707f, 0.297799f, 0.297890f, 0.297982f, 0.298073f, 0.298165f, 0.298256f,
+ 0.298348f, 0.298439f, 0.298531f, 0.298622f, 0.298714f, 0.298805f, 0.298897f, 0.298988f,
+ 0.299080f, 0.299171f, 0.299263f, 0.299354f, 0.299446f, 0.299537f, 0.299629f, 0.299720f,
+ 0.299812f, 0.299903f, 0.299995f, 0.300086f, 0.300177f, 0.300269f, 0.300360f, 0.300452f,
+ 0.300543f, 0.300635f, 0.300726f, 0.300818f, 0.300909f, 0.301000f, 0.301092f, 0.301183f,
+ 0.301275f, 0.301366f, 0.301458f, 0.301549f, 0.301640f, 0.301732f, 0.301823f, 0.301915f,
+ 0.302006f, 0.302097f, 0.302189f, 0.302280f, 0.302372f, 0.302463f, 0.302554f, 0.302646f,
+ 0.302737f, 0.302828f, 0.302920f, 0.303011f, 0.303103f, 0.303194f, 0.303285f, 0.303377f,
+ 0.303468f, 0.303559f, 0.303651f, 0.303742f, 0.303833f, 0.303925f, 0.304016f, 0.304107f,
+ 0.304199f, 0.304290f, 0.304381f, 0.304473f, 0.304564f, 0.304655f, 0.304747f, 0.304838f,
+ 0.304929f, 0.305021f, 0.305112f, 0.305203f, 0.305294f, 0.305386f, 0.305477f, 0.305568f,
+ 0.305660f, 0.305751f, 0.305842f, 0.305933f, 0.306025f, 0.306116f, 0.306207f, 0.306299f,
+ 0.306390f, 0.306481f, 0.306572f, 0.306664f, 0.306755f, 0.306846f, 0.306937f, 0.307029f,
+ 0.307120f, 0.307211f, 0.307302f, 0.307394f, 0.307485f, 0.307576f, 0.307667f, 0.307758f,
+ 0.307850f, 0.307941f, 0.308032f, 0.308123f, 0.308214f, 0.308306f, 0.308397f, 0.308488f,
+ 0.308579f, 0.308670f, 0.308762f, 0.308853f, 0.308944f, 0.309035f, 0.309126f, 0.309218f,
+ 0.309309f, 0.309400f, 0.309491f, 0.309582f, 0.309673f, 0.309765f, 0.309856f, 0.309947f,
+ 0.310038f, 0.310129f, 0.310220f, 0.310311f, 0.310403f, 0.310494f, 0.310585f, 0.310676f,
+ 0.310767f, 0.310858f, 0.310949f, 0.311041f, 0.311132f, 0.311223f, 0.311314f, 0.311405f,
+ 0.311496f, 0.311587f, 0.311678f, 0.311769f, 0.311860f, 0.311952f, 0.312043f, 0.312134f,
+ 0.312225f, 0.312316f, 0.312407f, 0.312498f, 0.312589f, 0.312680f, 0.312771f, 0.312862f,
+ 0.312953f, 0.313044f, 0.313135f, 0.313227f, 0.313318f, 0.313409f, 0.313500f, 0.313591f,
+ 0.313682f, 0.313773f, 0.313864f, 0.313955f, 0.314046f, 0.314137f, 0.314228f, 0.314319f,
+ 0.314410f, 0.314501f, 0.314592f, 0.314683f, 0.314774f, 0.314865f, 0.314956f, 0.315047f,
+ 0.315138f, 0.315229f, 0.315320f, 0.315411f, 0.315502f, 0.315593f, 0.315684f, 0.315775f,
+ 0.315866f, 0.315957f, 0.316048f, 0.316139f, 0.316230f, 0.316321f, 0.316411f, 0.316502f,
+ 0.316593f, 0.316684f, 0.316775f, 0.316866f, 0.316957f, 0.317048f, 0.317139f, 0.317230f,
+ 0.317321f, 0.317412f, 0.317503f, 0.317594f, 0.317684f, 0.317775f, 0.317866f, 0.317957f,
+ 0.318048f, 0.318139f, 0.318230f, 0.318321f, 0.318412f, 0.318503f, 0.318593f, 0.318684f,
+ 0.318775f, 0.318866f, 0.318957f, 0.319048f, 0.319139f, 0.319229f, 0.319320f, 0.319411f,
+ 0.319502f, 0.319593f, 0.319684f, 0.319775f, 0.319865f, 0.319956f, 0.320047f, 0.320138f,
+ 0.320229f, 0.320320f, 0.320410f, 0.320501f, 0.320592f, 0.320683f, 0.320774f, 0.320864f,
+ 0.320955f, 0.321046f, 0.321137f, 0.321228f, 0.321318f, 0.321409f, 0.321500f, 0.321591f,
+ 0.321682f, 0.321772f, 0.321863f, 0.321954f, 0.322045f, 0.322135f, 0.322226f, 0.322317f,
+ 0.322408f, 0.322498f, 0.322589f, 0.322680f, 0.322771f, 0.322861f, 0.322952f, 0.323043f,
+ 0.323134f, 0.323224f, 0.323315f, 0.323406f, 0.323497f, 0.323587f, 0.323678f, 0.323769f,
+ 0.323859f, 0.323950f, 0.324041f, 0.324131f, 0.324222f, 0.324313f, 0.324404f, 0.324494f,
+ 0.324585f, 0.324676f, 0.324766f, 0.324857f, 0.324948f, 0.325038f, 0.325129f, 0.325220f,
+ 0.325310f, 0.325401f, 0.325492f, 0.325582f, 0.325673f, 0.325764f, 0.325854f, 0.325945f,
+ 0.326035f, 0.326126f, 0.326217f, 0.326307f, 0.326398f, 0.326489f, 0.326579f, 0.326670f,
+ 0.326760f, 0.326851f, 0.326942f, 0.327032f, 0.327123f, 0.327213f, 0.327304f, 0.327395f,
+ 0.327485f, 0.327576f, 0.327666f, 0.327757f, 0.327848f, 0.327938f, 0.328029f, 0.328119f,
+ 0.328210f, 0.328300f, 0.328391f, 0.328482f, 0.328572f, 0.328663f, 0.328753f, 0.328844f,
+ 0.328934f, 0.329025f, 0.329115f, 0.329206f, 0.329296f, 0.329387f, 0.329477f, 0.329568f,
+ 0.329658f, 0.329749f, 0.329839f, 0.329930f, 0.330020f, 0.330111f, 0.330202f, 0.330292f,
+ 0.330382f, 0.330473f, 0.330563f, 0.330654f, 0.330744f, 0.330835f, 0.330925f, 0.331016f,
+ 0.331106f, 0.331197f, 0.331287f, 0.331378f, 0.331468f, 0.331559f, 0.331649f, 0.331739f,
+ 0.331830f, 0.331920f, 0.332011f, 0.332101f, 0.332192f, 0.332282f, 0.332373f, 0.332463f,
+ 0.332553f, 0.332644f, 0.332734f, 0.332825f, 0.332915f, 0.333005f, 0.333096f, 0.333186f,
+ 0.333277f, 0.333367f, 0.333457f, 0.333548f, 0.333638f, 0.333729f, 0.333819f, 0.333909f,
+ 0.334000f, 0.334090f, 0.334180f, 0.334271f, 0.334361f, 0.334451f, 0.334542f, 0.334632f,
+ 0.334722f, 0.334813f, 0.334903f, 0.334994f, 0.335084f, 0.335174f, 0.335265f, 0.335355f,
+ 0.335445f, 0.335535f, 0.335626f, 0.335716f, 0.335806f, 0.335897f, 0.335987f, 0.336077f,
+ 0.336168f, 0.336258f, 0.336348f, 0.336438f, 0.336529f, 0.336619f, 0.336709f, 0.336800f,
+ 0.336890f, 0.336980f, 0.337070f, 0.337161f, 0.337251f, 0.337341f, 0.337431f, 0.337522f,
+ 0.337612f, 0.337702f, 0.337792f, 0.337883f, 0.337973f, 0.338063f, 0.338153f, 0.338244f,
+ 0.338334f, 0.338424f, 0.338514f, 0.338604f, 0.338695f, 0.338785f, 0.338875f, 0.338965f,
+ 0.339055f, 0.339146f, 0.339236f, 0.339326f, 0.339416f, 0.339506f, 0.339597f, 0.339687f,
+ 0.339777f, 0.339867f, 0.339957f, 0.340047f, 0.340138f, 0.340228f, 0.340318f, 0.340408f,
+ 0.340498f, 0.340588f, 0.340678f, 0.340769f, 0.340859f, 0.340949f, 0.341039f, 0.341129f,
+ 0.341219f, 0.341309f, 0.341399f, 0.341490f, 0.341580f, 0.341670f, 0.341760f, 0.341850f,
+ 0.341940f, 0.342030f, 0.342120f, 0.342210f, 0.342300f, 0.342391f, 0.342481f, 0.342571f,
+ 0.342661f, 0.342751f, 0.342841f, 0.342931f, 0.343021f, 0.343111f, 0.343201f, 0.343291f,
+ 0.343381f, 0.343471f, 0.343561f, 0.343651f, 0.343741f, 0.343831f, 0.343921f, 0.344011f,
+ 0.344101f, 0.344191f, 0.344281f, 0.344371f, 0.344461f, 0.344551f, 0.344641f, 0.344731f,
+ 0.344821f, 0.344911f, 0.345001f, 0.345091f, 0.345181f, 0.345271f, 0.345361f, 0.345451f,
+ 0.345541f, 0.345631f, 0.345721f, 0.345811f, 0.345901f, 0.345991f, 0.346081f, 0.346171f,
+ 0.346261f, 0.346351f, 0.346441f, 0.346531f, 0.346621f, 0.346711f, 0.346801f, 0.346890f,
+ 0.346980f, 0.347070f, 0.347160f, 0.347250f, 0.347340f, 0.347430f, 0.347520f, 0.347610f,
+ 0.347700f, 0.347790f, 0.347879f, 0.347969f, 0.348059f, 0.348149f, 0.348239f, 0.348329f,
+ 0.348419f, 0.348509f, 0.348598f, 0.348688f, 0.348778f, 0.348868f, 0.348958f, 0.349048f,
+ 0.349138f, 0.349227f, 0.349317f, 0.349407f, 0.349497f, 0.349587f, 0.349676f, 0.349766f,
+ 0.349856f, 0.349946f, 0.350036f, 0.350126f, 0.350215f, 0.350305f, 0.350395f, 0.350485f,
+ 0.350575f, 0.350664f, 0.350754f, 0.350844f, 0.350934f, 0.351023f, 0.351113f, 0.351203f,
+ 0.351293f, 0.351383f, 0.351472f, 0.351562f, 0.351652f, 0.351742f, 0.351831f, 0.351921f,
+ 0.352011f, 0.352100f, 0.352190f, 0.352280f, 0.352370f, 0.352459f, 0.352549f, 0.352639f,
+ 0.352729f, 0.352818f, 0.352908f, 0.352998f, 0.353087f, 0.353177f, 0.353267f, 0.353356f,
+ 0.353446f, 0.353536f, 0.353626f, 0.353715f, 0.353805f, 0.353895f, 0.353984f, 0.354074f,
+ 0.354164f, 0.354253f, 0.354343f, 0.354432f, 0.354522f, 0.354612f, 0.354701f, 0.354791f,
+ 0.354881f, 0.354970f, 0.355060f, 0.355150f, 0.355239f, 0.355329f, 0.355418f, 0.355508f,
+ 0.355598f, 0.355687f, 0.355777f, 0.355866f, 0.355956f, 0.356046f, 0.356135f, 0.356225f,
+ 0.356314f, 0.356404f, 0.356494f, 0.356583f, 0.356673f, 0.356762f, 0.356852f, 0.356941f,
+ 0.357031f, 0.357121f, 0.357210f, 0.357300f, 0.357389f, 0.357479f, 0.357568f, 0.357658f,
+ 0.357747f, 0.357837f, 0.357926f, 0.358016f, 0.358105f, 0.358195f, 0.358284f, 0.358374f,
+ 0.358463f, 0.358553f, 0.358642f, 0.358732f, 0.358821f, 0.358911f, 0.359000f, 0.359090f,
+ 0.359179f, 0.359269f, 0.359358f, 0.359448f, 0.359537f, 0.359627f, 0.359716f, 0.359806f,
+ 0.359895f, 0.359984f, 0.360074f, 0.360163f, 0.360253f, 0.360342f, 0.360432f, 0.360521f,
+ 0.360611f, 0.360700f, 0.360789f, 0.360879f, 0.360968f, 0.361058f, 0.361147f, 0.361236f,
+ 0.361326f, 0.361415f, 0.361505f, 0.361594f, 0.361683f, 0.361773f, 0.361862f, 0.361952f,
+ 0.362041f, 0.362130f, 0.362220f, 0.362309f, 0.362398f, 0.362488f, 0.362577f, 0.362666f,
+ 0.362756f, 0.362845f, 0.362934f, 0.363024f, 0.363113f, 0.363202f, 0.363292f, 0.363381f,
+ 0.363470f, 0.363560f, 0.363649f, 0.363738f, 0.363828f, 0.363917f, 0.364006f, 0.364096f,
+ 0.364185f, 0.364274f, 0.364363f, 0.364453f, 0.364542f, 0.364631f, 0.364720f, 0.364810f,
+ 0.364899f, 0.364988f, 0.365078f, 0.365167f, 0.365256f, 0.365345f, 0.365435f, 0.365524f,
+ 0.365613f, 0.365702f, 0.365791f, 0.365881f, 0.365970f, 0.366059f, 0.366148f, 0.366238f,
+ 0.366327f, 0.366416f, 0.366505f, 0.366594f, 0.366684f, 0.366773f, 0.366862f, 0.366951f,
+ 0.367040f, 0.367130f, 0.367219f, 0.367308f, 0.367397f, 0.367486f, 0.367575f, 0.367665f,
+ 0.367754f, 0.367843f, 0.367932f, 0.368021f, 0.368110f, 0.368199f, 0.368289f, 0.368378f,
+ 0.368467f, 0.368556f, 0.368645f, 0.368734f, 0.368823f, 0.368912f, 0.369002f, 0.369091f,
+ 0.369180f, 0.369269f, 0.369358f, 0.369447f, 0.369536f, 0.369625f, 0.369714f, 0.369803f,
+ 0.369892f, 0.369982f, 0.370071f, 0.370160f, 0.370249f, 0.370338f, 0.370427f, 0.370516f,
+ 0.370605f, 0.370694f, 0.370783f, 0.370872f, 0.370961f, 0.371050f, 0.371139f, 0.371228f,
+ 0.371317f, 0.371406f, 0.371495f, 0.371584f, 0.371673f, 0.371762f, 0.371851f, 0.371940f,
+ 0.372029f, 0.372118f, 0.372207f, 0.372296f, 0.372385f, 0.372474f, 0.372563f, 0.372652f,
+ 0.372741f, 0.372830f, 0.372919f, 0.373008f, 0.373097f, 0.373186f, 0.373275f, 0.373364f,
+ 0.373453f, 0.373542f, 0.373631f, 0.373719f, 0.373808f, 0.373897f, 0.373986f, 0.374075f,
+ 0.374164f, 0.374253f, 0.374342f, 0.374431f, 0.374520f, 0.374609f, 0.374697f, 0.374786f,
+ 0.374875f, 0.374964f, 0.375053f, 0.375142f, 0.375231f, 0.375320f, 0.375408f, 0.375497f,
+ 0.375586f, 0.375675f, 0.375764f, 0.375853f, 0.375942f, 0.376030f, 0.376119f, 0.376208f,
+ 0.376297f, 0.376386f, 0.376475f, 0.376563f, 0.376652f, 0.376741f, 0.376830f, 0.376919f,
+ 0.377007f, 0.377096f, 0.377185f, 0.377274f, 0.377363f, 0.377451f, 0.377540f, 0.377629f,
+ 0.377718f, 0.377806f, 0.377895f, 0.377984f, 0.378073f, 0.378162f, 0.378250f, 0.378339f,
+ 0.378428f, 0.378516f, 0.378605f, 0.378694f, 0.378783f, 0.378871f, 0.378960f, 0.379049f,
+ 0.379138f, 0.379226f, 0.379315f, 0.379404f, 0.379492f, 0.379581f, 0.379670f, 0.379759f,
+ 0.379847f, 0.379936f, 0.380025f, 0.380113f, 0.380202f, 0.380291f, 0.380379f, 0.380468f,
+ 0.380557f, 0.380645f, 0.380734f, 0.380823f, 0.380911f, 0.381000f, 0.381088f, 0.381177f,
+ 0.381266f, 0.381354f, 0.381443f, 0.381532f, 0.381620f, 0.381709f, 0.381797f, 0.381886f,
+ 0.381975f, 0.382063f, 0.382152f, 0.382241f, 0.382329f, 0.382418f, 0.382506f, 0.382595f,
+ 0.382683f, 0.382772f, 0.382861f, 0.382949f, 0.383038f, 0.383126f, 0.383215f, 0.383303f,
+ 0.383392f, 0.383480f, 0.383569f, 0.383658f, 0.383746f, 0.383835f, 0.383923f, 0.384012f,
+ 0.384100f, 0.384189f, 0.384277f, 0.384366f, 0.384454f, 0.384543f, 0.384631f, 0.384720f,
+ 0.384808f, 0.384897f, 0.384985f, 0.385074f, 0.385162f, 0.385251f, 0.385339f, 0.385428f,
+ 0.385516f, 0.385605f, 0.385693f, 0.385781f, 0.385870f, 0.385958f, 0.386047f, 0.386135f,
+ 0.386224f, 0.386312f, 0.386400f, 0.386489f, 0.386577f, 0.386666f, 0.386754f, 0.386843f,
+ 0.386931f, 0.387019f, 0.387108f, 0.387196f, 0.387285f, 0.387373f, 0.387461f, 0.387550f,
+ 0.387638f, 0.387727f, 0.387815f, 0.387903f, 0.387992f, 0.388080f, 0.388168f, 0.388257f,
+ 0.388345f, 0.388433f, 0.388522f, 0.388610f, 0.388698f, 0.388787f, 0.388875f, 0.388963f,
+ 0.389052f, 0.389140f, 0.389228f, 0.389317f, 0.389405f, 0.389493f, 0.389582f, 0.389670f,
+ 0.389758f, 0.389846f, 0.389935f, 0.390023f, 0.390111f, 0.390200f, 0.390288f, 0.390376f,
+ 0.390464f, 0.390553f, 0.390641f, 0.390729f, 0.390817f, 0.390906f, 0.390994f, 0.391082f,
+ 0.391170f, 0.391259f, 0.391347f, 0.391435f, 0.391523f, 0.391612f, 0.391700f, 0.391788f,
+ 0.391876f, 0.391964f, 0.392053f, 0.392141f, 0.392229f, 0.392317f, 0.392405f, 0.392493f,
+ 0.392582f, 0.392670f, 0.392758f, 0.392846f, 0.392934f, 0.393023f, 0.393111f, 0.393199f,
+ 0.393287f, 0.393375f, 0.393463f, 0.393551f, 0.393640f, 0.393728f, 0.393816f, 0.393904f,
+ 0.393992f, 0.394080f, 0.394168f, 0.394256f, 0.394344f, 0.394433f, 0.394521f, 0.394609f,
+ 0.394697f, 0.394785f, 0.394873f, 0.394961f, 0.395049f, 0.395137f, 0.395225f, 0.395313f,
+ 0.395401f, 0.395490f, 0.395578f, 0.395666f, 0.395754f, 0.395842f, 0.395930f, 0.396018f,
+ 0.396106f, 0.396194f, 0.396282f, 0.396370f, 0.396458f, 0.396546f, 0.396634f, 0.396722f,
+ 0.396810f, 0.396898f, 0.396986f, 0.397074f, 0.397162f, 0.397250f, 0.397338f, 0.397426f,
+ 0.397514f, 0.397602f, 0.397690f, 0.397778f, 0.397866f, 0.397954f, 0.398042f, 0.398130f,
+ 0.398218f, 0.398306f, 0.398393f, 0.398481f, 0.398569f, 0.398657f, 0.398745f, 0.398833f,
+ 0.398921f, 0.399009f, 0.399097f, 0.399185f, 0.399273f, 0.399361f, 0.399448f, 0.399536f,
+ 0.399624f, 0.399712f, 0.399800f, 0.399888f, 0.399976f, 0.400064f, 0.400151f, 0.400239f,
+ 0.400327f, 0.400415f, 0.400503f, 0.400591f, 0.400679f, 0.400766f, 0.400854f, 0.400942f,
+ 0.401030f, 0.401118f, 0.401206f, 0.401293f, 0.401381f, 0.401469f, 0.401557f, 0.401645f,
+ 0.401732f, 0.401820f, 0.401908f, 0.401996f, 0.402084f, 0.402171f, 0.402259f, 0.402347f,
+ 0.402435f, 0.402522f, 0.402610f, 0.402698f, 0.402786f, 0.402873f, 0.402961f, 0.403049f,
+ 0.403137f, 0.403224f, 0.403312f, 0.403400f, 0.403488f, 0.403575f, 0.403663f, 0.403751f,
+ 0.403838f, 0.403926f, 0.404014f, 0.404102f, 0.404189f, 0.404277f, 0.404365f, 0.404452f,
+ 0.404540f, 0.404628f, 0.404715f, 0.404803f, 0.404891f, 0.404978f, 0.405066f, 0.405154f,
+ 0.405241f, 0.405329f, 0.405417f, 0.405504f, 0.405592f, 0.405680f, 0.405767f, 0.405855f,
+ 0.405942f, 0.406030f, 0.406118f, 0.406205f, 0.406293f, 0.406380f, 0.406468f, 0.406556f,
+ 0.406643f, 0.406731f, 0.406818f, 0.406906f, 0.406994f, 0.407081f, 0.407169f, 0.407256f,
+ 0.407344f, 0.407431f, 0.407519f, 0.407606f, 0.407694f, 0.407782f, 0.407869f, 0.407957f,
+ 0.408044f, 0.408132f, 0.408219f, 0.408307f, 0.408394f, 0.408482f, 0.408569f, 0.408657f,
+ 0.408744f, 0.408832f, 0.408919f, 0.409007f, 0.409094f, 0.409182f, 0.409269f, 0.409357f,
+ 0.409444f, 0.409532f, 0.409619f, 0.409707f, 0.409794f, 0.409881f, 0.409969f, 0.410056f,
+ 0.410144f, 0.410231f, 0.410319f, 0.410406f, 0.410493f, 0.410581f, 0.410668f, 0.410756f,
+ 0.410843f, 0.410931f, 0.411018f, 0.411105f, 0.411193f, 0.411280f, 0.411368f, 0.411455f,
+ 0.411542f, 0.411630f, 0.411717f, 0.411804f, 0.411892f, 0.411979f, 0.412067f, 0.412154f,
+ 0.412241f, 0.412329f, 0.412416f, 0.412503f, 0.412591f, 0.412678f, 0.412765f, 0.412853f,
+ 0.412940f, 0.413027f, 0.413115f, 0.413202f, 0.413289f, 0.413376f, 0.413464f, 0.413551f,
+ 0.413638f, 0.413726f, 0.413813f, 0.413900f, 0.413987f, 0.414075f, 0.414162f, 0.414249f,
+ 0.414337f, 0.414424f, 0.414511f, 0.414598f, 0.414685f, 0.414773f, 0.414860f, 0.414947f,
+ 0.415034f, 0.415122f, 0.415209f, 0.415296f, 0.415383f, 0.415471f, 0.415558f, 0.415645f,
+ 0.415732f, 0.415819f, 0.415906f, 0.415994f, 0.416081f, 0.416168f, 0.416255f, 0.416342f,
+ 0.416430f, 0.416517f, 0.416604f, 0.416691f, 0.416778f, 0.416865f, 0.416952f, 0.417040f,
+ 0.417127f, 0.417214f, 0.417301f, 0.417388f, 0.417475f, 0.417562f, 0.417650f, 0.417737f,
+ 0.417824f, 0.417911f, 0.417998f, 0.418085f, 0.418172f, 0.418259f, 0.418346f, 0.418433f,
+ 0.418520f, 0.418608f, 0.418695f, 0.418782f, 0.418869f, 0.418956f, 0.419043f, 0.419130f,
+ 0.419217f, 0.419304f, 0.419391f, 0.419478f, 0.419565f, 0.419652f, 0.419739f, 0.419826f,
+ 0.419913f, 0.420000f, 0.420087f, 0.420174f, 0.420261f, 0.420348f, 0.420435f, 0.420522f,
+ 0.420609f, 0.420696f, 0.420783f, 0.420870f, 0.420957f, 0.421044f, 0.421131f, 0.421218f,
+ 0.421305f, 0.421392f, 0.421479f, 0.421566f, 0.421653f, 0.421739f, 0.421826f, 0.421913f,
+ 0.422000f, 0.422087f, 0.422174f, 0.422261f, 0.422348f, 0.422435f, 0.422522f, 0.422609f,
+ 0.422695f, 0.422782f, 0.422869f, 0.422956f, 0.423043f, 0.423130f, 0.423217f, 0.423304f,
+ 0.423390f, 0.423477f, 0.423564f, 0.423651f, 0.423738f, 0.423825f, 0.423912f, 0.423998f,
+ 0.424085f, 0.424172f, 0.424259f, 0.424346f, 0.424432f, 0.424519f, 0.424606f, 0.424693f,
+ 0.424780f, 0.424866f, 0.424953f, 0.425040f, 0.425127f, 0.425214f, 0.425300f, 0.425387f,
+ 0.425474f, 0.425561f, 0.425647f, 0.425734f, 0.425821f, 0.425908f, 0.425994f, 0.426081f,
+ 0.426168f, 0.426255f, 0.426341f, 0.426428f, 0.426515f, 0.426601f, 0.426688f, 0.426775f,
+ 0.426862f, 0.426948f, 0.427035f, 0.427122f, 0.427208f, 0.427295f, 0.427382f, 0.427468f,
+ 0.427555f, 0.427642f, 0.427728f, 0.427815f, 0.427902f, 0.427988f, 0.428075f, 0.428162f,
+ 0.428248f, 0.428335f, 0.428422f, 0.428508f, 0.428595f, 0.428681f, 0.428768f, 0.428855f,
+ 0.428941f, 0.429028f, 0.429114f, 0.429201f, 0.429288f, 0.429374f, 0.429461f, 0.429547f,
+ 0.429634f, 0.429721f, 0.429807f, 0.429894f, 0.429980f, 0.430067f, 0.430153f, 0.430240f,
+ 0.430326f, 0.430413f, 0.430500f, 0.430586f, 0.430673f, 0.430759f, 0.430846f, 0.430932f,
+ 0.431019f, 0.431105f, 0.431192f, 0.431278f, 0.431365f, 0.431451f, 0.431538f, 0.431624f,
+ 0.431711f, 0.431797f, 0.431884f, 0.431970f, 0.432057f, 0.432143f, 0.432229f, 0.432316f,
+ 0.432402f, 0.432489f, 0.432575f, 0.432662f, 0.432748f, 0.432835f, 0.432921f, 0.433007f,
+ 0.433094f, 0.433180f, 0.433267f, 0.433353f, 0.433439f, 0.433526f, 0.433612f, 0.433699f,
+ 0.433785f, 0.433871f, 0.433958f, 0.434044f, 0.434131f, 0.434217f, 0.434303f, 0.434390f,
+ 0.434476f, 0.434562f, 0.434649f, 0.434735f, 0.434821f, 0.434908f, 0.434994f, 0.435080f,
+ 0.435167f, 0.435253f, 0.435339f, 0.435426f, 0.435512f, 0.435598f, 0.435685f, 0.435771f,
+ 0.435857f, 0.435943f, 0.436030f, 0.436116f, 0.436202f, 0.436288f, 0.436375f, 0.436461f,
+ 0.436547f, 0.436633f, 0.436720f, 0.436806f, 0.436892f, 0.436978f, 0.437065f, 0.437151f,
+ 0.437237f, 0.437323f, 0.437410f, 0.437496f, 0.437582f, 0.437668f, 0.437754f, 0.437841f,
+ 0.437927f, 0.438013f, 0.438099f, 0.438185f, 0.438272f, 0.438358f, 0.438444f, 0.438530f,
+ 0.438616f, 0.438702f, 0.438789f, 0.438875f, 0.438961f, 0.439047f, 0.439133f, 0.439219f,
+ 0.439305f, 0.439392f, 0.439478f, 0.439564f, 0.439650f, 0.439736f, 0.439822f, 0.439908f,
+ 0.439994f, 0.440080f, 0.440166f, 0.440253f, 0.440339f, 0.440425f, 0.440511f, 0.440597f,
+ 0.440683f, 0.440769f, 0.440855f, 0.440941f, 0.441027f, 0.441113f, 0.441199f, 0.441285f,
+ 0.441371f, 0.441457f, 0.441543f, 0.441629f, 0.441715f, 0.441801f, 0.441887f, 0.441973f,
+ 0.442059f, 0.442145f, 0.442231f, 0.442317f, 0.442403f, 0.442489f, 0.442575f, 0.442661f,
+ 0.442747f, 0.442833f, 0.442919f, 0.443005f, 0.443091f, 0.443177f, 0.443263f, 0.443349f,
+ 0.443435f, 0.443521f, 0.443607f, 0.443693f, 0.443779f, 0.443864f, 0.443950f, 0.444036f,
+ 0.444122f, 0.444208f, 0.444294f, 0.444380f, 0.444466f, 0.444552f, 0.444637f, 0.444723f,
+ 0.444809f, 0.444895f, 0.444981f, 0.445067f, 0.445153f, 0.445239f, 0.445324f, 0.445410f,
+ 0.445496f, 0.445582f, 0.445668f, 0.445754f, 0.445839f, 0.445925f, 0.446011f, 0.446097f,
+ 0.446183f, 0.446268f, 0.446354f, 0.446440f, 0.446526f, 0.446612f, 0.446697f, 0.446783f,
+ 0.446869f, 0.446955f, 0.447040f, 0.447126f, 0.447212f, 0.447298f, 0.447383f, 0.447469f,
+ 0.447555f, 0.447641f, 0.447726f, 0.447812f, 0.447898f, 0.447983f, 0.448069f, 0.448155f,
+ 0.448241f, 0.448326f, 0.448412f, 0.448498f, 0.448583f, 0.448669f, 0.448755f, 0.448840f,
+ 0.448926f, 0.449012f, 0.449097f, 0.449183f, 0.449269f, 0.449354f, 0.449440f, 0.449526f,
+ 0.449611f, 0.449697f, 0.449783f, 0.449868f, 0.449954f, 0.450039f, 0.450125f, 0.450211f,
+ 0.450296f, 0.450382f, 0.450467f, 0.450553f, 0.450639f, 0.450724f, 0.450810f, 0.450895f,
+ 0.450981f, 0.451067f, 0.451152f, 0.451238f, 0.451323f, 0.451409f, 0.451494f, 0.451580f,
+ 0.451665f, 0.451751f, 0.451836f, 0.451922f, 0.452008f, 0.452093f, 0.452179f, 0.452264f,
+ 0.452350f, 0.452435f, 0.452521f, 0.452606f, 0.452692f, 0.452777f, 0.452863f, 0.452948f,
+ 0.453033f, 0.453119f, 0.453204f, 0.453290f, 0.453375f, 0.453461f, 0.453546f, 0.453632f,
+ 0.453717f, 0.453803f, 0.453888f, 0.453973f, 0.454059f, 0.454144f, 0.454230f, 0.454315f,
+ 0.454400f, 0.454486f, 0.454571f, 0.454657f, 0.454742f, 0.454827f, 0.454913f, 0.454998f,
+ 0.455084f, 0.455169f, 0.455254f, 0.455340f, 0.455425f, 0.455510f, 0.455596f, 0.455681f,
+ 0.455766f, 0.455852f, 0.455937f, 0.456022f, 0.456108f, 0.456193f, 0.456278f, 0.456364f,
+ 0.456449f, 0.456534f, 0.456620f, 0.456705f, 0.456790f, 0.456875f, 0.456961f, 0.457046f,
+ 0.457131f, 0.457217f, 0.457302f, 0.457387f, 0.457472f, 0.457558f, 0.457643f, 0.457728f,
+ 0.457813f, 0.457899f, 0.457984f, 0.458069f, 0.458154f, 0.458239f, 0.458325f, 0.458410f,
+ 0.458495f, 0.458580f, 0.458665f, 0.458751f, 0.458836f, 0.458921f, 0.459006f, 0.459091f,
+ 0.459177f, 0.459262f, 0.459347f, 0.459432f, 0.459517f, 0.459602f, 0.459687f, 0.459773f,
+ 0.459858f, 0.459943f, 0.460028f, 0.460113f, 0.460198f, 0.460283f, 0.460369f, 0.460454f,
+ 0.460539f, 0.460624f, 0.460709f, 0.460794f, 0.460879f, 0.460964f, 0.461049f, 0.461134f,
+ 0.461219f, 0.461304f, 0.461390f, 0.461475f, 0.461560f, 0.461645f, 0.461730f, 0.461815f,
+ 0.461900f, 0.461985f, 0.462070f, 0.462155f, 0.462240f, 0.462325f, 0.462410f, 0.462495f,
+ 0.462580f, 0.462665f, 0.462750f, 0.462835f, 0.462920f, 0.463005f, 0.463090f, 0.463175f,
+ 0.463260f, 0.463345f, 0.463430f, 0.463515f, 0.463600f, 0.463685f, 0.463769f, 0.463854f,
+ 0.463939f, 0.464024f, 0.464109f, 0.464194f, 0.464279f, 0.464364f, 0.464449f, 0.464534f,
+ 0.464619f, 0.464704f, 0.464788f, 0.464873f, 0.464958f, 0.465043f, 0.465128f, 0.465213f,
+ 0.465298f, 0.465383f, 0.465467f, 0.465552f, 0.465637f, 0.465722f, 0.465807f, 0.465892f,
+ 0.465977f, 0.466061f, 0.466146f, 0.466231f, 0.466316f, 0.466401f, 0.466485f, 0.466570f,
+ 0.466655f, 0.466740f, 0.466825f, 0.466909f, 0.466994f, 0.467079f, 0.467164f, 0.467248f,
+ 0.467333f, 0.467418f, 0.467503f, 0.467587f, 0.467672f, 0.467757f, 0.467842f, 0.467926f,
+ 0.468011f, 0.468096f, 0.468181f, 0.468265f, 0.468350f, 0.468435f, 0.468519f, 0.468604f,
+ 0.468689f, 0.468774f, 0.468858f, 0.468943f, 0.469028f, 0.469112f, 0.469197f, 0.469282f,
+ 0.469366f, 0.469451f, 0.469536f, 0.469620f, 0.469705f, 0.469789f, 0.469874f, 0.469959f,
+ 0.470043f, 0.470128f, 0.470213f, 0.470297f, 0.470382f, 0.470466f, 0.470551f, 0.470636f,
+ 0.470720f, 0.470805f, 0.470889f, 0.470974f, 0.471058f, 0.471143f, 0.471228f, 0.471312f,
+ 0.471397f, 0.471481f, 0.471566f, 0.471650f, 0.471735f, 0.471819f, 0.471904f, 0.471988f,
+ 0.472073f, 0.472158f, 0.472242f, 0.472327f, 0.472411f, 0.472496f, 0.472580f, 0.472665f,
+ 0.472749f, 0.472834f, 0.472918f, 0.473002f, 0.473087f, 0.473171f, 0.473256f, 0.473340f,
+ 0.473425f, 0.473509f, 0.473594f, 0.473678f, 0.473763f, 0.473847f, 0.473931f, 0.474016f,
+ 0.474100f, 0.474185f, 0.474269f, 0.474353f, 0.474438f, 0.474522f, 0.474607f, 0.474691f,
+ 0.474775f, 0.474860f, 0.474944f, 0.475029f, 0.475113f, 0.475197f, 0.475282f, 0.475366f,
+ 0.475450f, 0.475535f, 0.475619f, 0.475703f, 0.475788f, 0.475872f, 0.475956f, 0.476041f,
+ 0.476125f, 0.476209f, 0.476294f, 0.476378f, 0.476462f, 0.476546f, 0.476631f, 0.476715f,
+ 0.476799f, 0.476884f, 0.476968f, 0.477052f, 0.477136f, 0.477221f, 0.477305f, 0.477389f,
+ 0.477473f, 0.477558f, 0.477642f, 0.477726f, 0.477810f, 0.477894f, 0.477979f, 0.478063f,
+ 0.478147f, 0.478231f, 0.478315f, 0.478400f, 0.478484f, 0.478568f, 0.478652f, 0.478736f,
+ 0.478821f, 0.478905f, 0.478989f, 0.479073f, 0.479157f, 0.479241f, 0.479325f, 0.479410f,
+ 0.479494f, 0.479578f, 0.479662f, 0.479746f, 0.479830f, 0.479914f, 0.479998f, 0.480083f,
+ 0.480167f, 0.480251f, 0.480335f, 0.480419f, 0.480503f, 0.480587f, 0.480671f, 0.480755f,
+ 0.480839f, 0.480923f, 0.481007f, 0.481091f, 0.481176f, 0.481260f, 0.481344f, 0.481428f,
+ 0.481512f, 0.481596f, 0.481680f, 0.481764f, 0.481848f, 0.481932f, 0.482016f, 0.482100f,
+ 0.482184f, 0.482268f, 0.482352f, 0.482436f, 0.482520f, 0.482604f, 0.482688f, 0.482772f,
+ 0.482856f, 0.482940f, 0.483023f, 0.483107f, 0.483191f, 0.483275f, 0.483359f, 0.483443f,
+ 0.483527f, 0.483611f, 0.483695f, 0.483779f, 0.483863f, 0.483947f, 0.484031f, 0.484114f,
+ 0.484198f, 0.484282f, 0.484366f, 0.484450f, 0.484534f, 0.484618f, 0.484702f, 0.484785f,
+ 0.484869f, 0.484953f, 0.485037f, 0.485121f, 0.485205f, 0.485288f, 0.485372f, 0.485456f,
+ 0.485540f, 0.485624f, 0.485708f, 0.485791f, 0.485875f, 0.485959f, 0.486043f, 0.486126f,
+ 0.486210f, 0.486294f, 0.486378f, 0.486462f, 0.486545f, 0.486629f, 0.486713f, 0.486797f,
+ 0.486880f, 0.486964f, 0.487048f, 0.487132f, 0.487215f, 0.487299f, 0.487383f, 0.487466f,
+ 0.487550f, 0.487634f, 0.487718f, 0.487801f, 0.487885f, 0.487969f, 0.488052f, 0.488136f,
+ 0.488220f, 0.488303f, 0.488387f, 0.488471f, 0.488554f, 0.488638f, 0.488722f, 0.488805f,
+ 0.488889f, 0.488973f, 0.489056f, 0.489140f, 0.489223f, 0.489307f, 0.489391f, 0.489474f,
+ 0.489558f, 0.489641f, 0.489725f, 0.489809f, 0.489892f, 0.489976f, 0.490059f, 0.490143f,
+ 0.490226f, 0.490310f, 0.490394f, 0.490477f, 0.490561f, 0.490644f, 0.490728f, 0.490811f,
+ 0.490895f, 0.490978f, 0.491062f, 0.491145f, 0.491229f, 0.491312f, 0.491396f, 0.491479f,
+ 0.491563f, 0.491646f, 0.491730f, 0.491813f, 0.491897f, 0.491980f, 0.492064f, 0.492147f,
+ 0.492231f, 0.492314f, 0.492398f, 0.492481f, 0.492564f, 0.492648f, 0.492731f, 0.492815f,
+ 0.492898f, 0.492982f, 0.493065f, 0.493148f, 0.493232f, 0.493315f, 0.493399f, 0.493482f,
+ 0.493565f, 0.493649f, 0.493732f, 0.493816f, 0.493899f, 0.493982f, 0.494066f, 0.494149f,
+ 0.494232f, 0.494316f, 0.494399f, 0.494482f, 0.494566f, 0.494649f, 0.494732f, 0.494816f,
+ 0.494899f, 0.494982f, 0.495066f, 0.495149f, 0.495232f, 0.495315f, 0.495399f, 0.495482f,
+ 0.495565f, 0.495649f, 0.495732f, 0.495815f, 0.495898f, 0.495982f, 0.496065f, 0.496148f,
+ 0.496231f, 0.496315f, 0.496398f, 0.496481f, 0.496564f, 0.496647f, 0.496731f, 0.496814f,
+ 0.496897f, 0.496980f, 0.497063f, 0.497147f, 0.497230f, 0.497313f, 0.497396f, 0.497479f,
+ 0.497562f, 0.497646f, 0.497729f, 0.497812f, 0.497895f, 0.497978f, 0.498061f, 0.498145f,
+ 0.498228f, 0.498311f, 0.498394f, 0.498477f, 0.498560f, 0.498643f, 0.498726f, 0.498809f,
+ 0.498893f, 0.498976f, 0.499059f, 0.499142f, 0.499225f, 0.499308f, 0.499391f, 0.499474f,
+ 0.499557f, 0.499640f, 0.499723f, 0.499806f, 0.499889f, 0.499972f, 0.500055f, 0.500138f,
+ 0.500221f, 0.500304f, 0.500387f, 0.500470f, 0.500553f, 0.500636f, 0.500719f, 0.500802f,
+ 0.500885f, 0.500968f, 0.501051f, 0.501134f, 0.501217f, 0.501300f, 0.501383f, 0.501466f,
+ 0.501549f, 0.501632f, 0.501715f, 0.501798f, 0.501881f, 0.501964f, 0.502047f, 0.502130f,
+ 0.502212f, 0.502295f, 0.502378f, 0.502461f, 0.502544f, 0.502627f, 0.502710f, 0.502793f,
+ 0.502876f, 0.502958f, 0.503041f, 0.503124f, 0.503207f, 0.503290f, 0.503373f, 0.503456f,
+ 0.503538f, 0.503621f, 0.503704f, 0.503787f, 0.503870f, 0.503953f, 0.504035f, 0.504118f,
+ 0.504201f, 0.504284f, 0.504366f, 0.504449f, 0.504532f, 0.504615f, 0.504698f, 0.504780f,
+ 0.504863f, 0.504946f, 0.505029f, 0.505111f, 0.505194f, 0.505277f, 0.505360f, 0.505442f,
+ 0.505525f, 0.505608f, 0.505690f, 0.505773f, 0.505856f, 0.505939f, 0.506021f, 0.506104f,
+ 0.506187f, 0.506269f, 0.506352f, 0.506435f, 0.506517f, 0.506600f, 0.506683f, 0.506765f,
+ 0.506848f, 0.506931f, 0.507013f, 0.507096f, 0.507179f, 0.507261f, 0.507344f, 0.507426f,
+ 0.507509f, 0.507592f, 0.507674f, 0.507757f, 0.507839f, 0.507922f, 0.508005f, 0.508087f,
+ 0.508170f, 0.508252f, 0.508335f, 0.508417f, 0.508500f, 0.508583f, 0.508665f, 0.508748f,
+ 0.508830f, 0.508913f, 0.508995f, 0.509078f, 0.509160f, 0.509243f, 0.509325f, 0.509408f,
+ 0.509490f, 0.509573f, 0.509655f, 0.509738f, 0.509820f, 0.509903f, 0.509985f, 0.510068f,
+ 0.510150f, 0.510233f, 0.510315f, 0.510397f, 0.510480f, 0.510562f, 0.510645f, 0.510727f,
+ 0.510810f, 0.510892f, 0.510974f, 0.511057f, 0.511139f, 0.511222f, 0.511304f, 0.511386f,
+ 0.511469f, 0.511551f, 0.511634f, 0.511716f, 0.511798f, 0.511881f, 0.511963f, 0.512045f,
+ 0.512128f, 0.512210f, 0.512292f, 0.512375f, 0.512457f, 0.512539f, 0.512622f, 0.512704f,
+ 0.512786f, 0.512869f, 0.512951f, 0.513033f, 0.513116f, 0.513198f, 0.513280f, 0.513362f,
+ 0.513445f, 0.513527f, 0.513609f, 0.513692f, 0.513774f, 0.513856f, 0.513938f, 0.514021f,
+ 0.514103f, 0.514185f, 0.514267f, 0.514349f, 0.514432f, 0.514514f, 0.514596f, 0.514678f,
+ 0.514760f, 0.514843f, 0.514925f, 0.515007f, 0.515089f, 0.515171f, 0.515254f, 0.515336f,
+ 0.515418f, 0.515500f, 0.515582f, 0.515664f, 0.515746f, 0.515829f, 0.515911f, 0.515993f,
+ 0.516075f, 0.516157f, 0.516239f, 0.516321f, 0.516403f, 0.516486f, 0.516568f, 0.516650f,
+ 0.516732f, 0.516814f, 0.516896f, 0.516978f, 0.517060f, 0.517142f, 0.517224f, 0.517306f,
+ 0.517388f, 0.517470f, 0.517552f, 0.517634f, 0.517716f, 0.517798f, 0.517880f, 0.517963f,
+ 0.518045f, 0.518126f, 0.518209f, 0.518291f, 0.518372f, 0.518454f, 0.518536f, 0.518618f,
+ 0.518700f, 0.518782f, 0.518864f, 0.518946f, 0.519028f, 0.519110f, 0.519192f, 0.519274f,
+ 0.519356f, 0.519438f, 0.519520f, 0.519602f, 0.519684f, 0.519766f, 0.519848f, 0.519929f,
+ 0.520011f, 0.520093f, 0.520175f, 0.520257f, 0.520339f, 0.520421f, 0.520503f, 0.520584f,
+ 0.520666f, 0.520748f, 0.520830f, 0.520912f, 0.520994f, 0.521075f, 0.521157f, 0.521239f,
+ 0.521321f, 0.521403f, 0.521485f, 0.521566f, 0.521648f, 0.521730f, 0.521812f, 0.521894f,
+ 0.521975f, 0.522057f, 0.522139f, 0.522221f, 0.522302f, 0.522384f, 0.522466f, 0.522548f,
+ 0.522629f, 0.522711f, 0.522793f, 0.522875f, 0.522956f, 0.523038f, 0.523120f, 0.523201f,
+ 0.523283f, 0.523365f, 0.523447f, 0.523528f, 0.523610f, 0.523692f, 0.523773f, 0.523855f,
+ 0.523937f, 0.524018f, 0.524100f, 0.524181f, 0.524263f, 0.524345f, 0.524426f, 0.524508f,
+ 0.524590f, 0.524671f, 0.524753f, 0.524835f, 0.524916f, 0.524998f, 0.525079f, 0.525161f,
+ 0.525243f, 0.525324f, 0.525406f, 0.525487f, 0.525569f, 0.525650f, 0.525732f, 0.525813f,
+ 0.525895f, 0.525977f, 0.526058f, 0.526140f, 0.526221f, 0.526303f, 0.526384f, 0.526466f,
+ 0.526547f, 0.526629f, 0.526710f, 0.526792f, 0.526873f, 0.526955f, 0.527036f, 0.527118f,
+ 0.527199f, 0.527281f, 0.527362f, 0.527444f, 0.527525f, 0.527606f, 0.527688f, 0.527769f,
+ 0.527851f, 0.527932f, 0.528014f, 0.528095f, 0.528176f, 0.528258f, 0.528339f, 0.528421f,
+ 0.528502f, 0.528583f, 0.528665f, 0.528746f, 0.528828f, 0.528909f, 0.528990f, 0.529072f,
+ 0.529153f, 0.529234f, 0.529316f, 0.529397f, 0.529478f, 0.529560f, 0.529641f, 0.529722f,
+ 0.529804f, 0.529885f, 0.529966f, 0.530048f, 0.530129f, 0.530210f, 0.530291f, 0.530373f,
+ 0.530454f, 0.530535f, 0.530617f, 0.530698f, 0.530779f, 0.530860f, 0.530942f, 0.531023f,
+ 0.531104f, 0.531185f, 0.531266f, 0.531348f, 0.531429f, 0.531510f, 0.531591f, 0.531673f,
+ 0.531754f, 0.531835f, 0.531916f, 0.531997f, 0.532078f, 0.532160f, 0.532241f, 0.532322f,
+ 0.532403f, 0.532484f, 0.532565f, 0.532647f, 0.532728f, 0.532809f, 0.532890f, 0.532971f,
+ 0.533052f, 0.533133f, 0.533214f, 0.533296f, 0.533377f, 0.533458f, 0.533539f, 0.533620f,
+ 0.533701f, 0.533782f, 0.533863f, 0.533944f, 0.534025f, 0.534106f, 0.534187f, 0.534268f,
+ 0.534349f, 0.534431f, 0.534512f, 0.534593f, 0.534674f, 0.534755f, 0.534836f, 0.534917f,
+ 0.534998f, 0.535079f, 0.535160f, 0.535241f, 0.535322f, 0.535403f, 0.535484f, 0.535564f,
+ 0.535645f, 0.535726f, 0.535807f, 0.535888f, 0.535969f, 0.536050f, 0.536131f, 0.536212f,
+ 0.536293f, 0.536374f, 0.536455f, 0.536536f, 0.536617f, 0.536698f, 0.536778f, 0.536859f,
+ 0.536940f, 0.537021f, 0.537102f, 0.537183f, 0.537264f, 0.537345f, 0.537425f, 0.537506f,
+ 0.537587f, 0.537668f, 0.537749f, 0.537830f, 0.537910f, 0.537991f, 0.538072f, 0.538153f,
+ 0.538234f, 0.538314f, 0.538395f, 0.538476f, 0.538557f, 0.538638f, 0.538718f, 0.538799f,
+ 0.538880f, 0.538961f, 0.539041f, 0.539122f, 0.539203f, 0.539284f, 0.539364f, 0.539445f,
+ 0.539526f, 0.539607f, 0.539687f, 0.539768f, 0.539849f, 0.539929f, 0.540010f, 0.540091f,
+ 0.540171f, 0.540252f, 0.540333f, 0.540413f, 0.540494f, 0.540575f, 0.540655f, 0.540736f,
+ 0.540817f, 0.540897f, 0.540978f, 0.541059f, 0.541139f, 0.541220f, 0.541301f, 0.541381f,
+ 0.541462f, 0.541542f, 0.541623f, 0.541704f, 0.541784f, 0.541865f, 0.541945f, 0.542026f,
+ 0.542106f, 0.542187f, 0.542268f, 0.542348f, 0.542429f, 0.542509f, 0.542590f, 0.542670f,
+ 0.542751f, 0.542831f, 0.542912f, 0.542992f, 0.543073f, 0.543153f, 0.543234f, 0.543314f,
+ 0.543395f, 0.543475f, 0.543556f, 0.543636f, 0.543717f, 0.543797f, 0.543878f, 0.543958f,
+ 0.544039f, 0.544119f, 0.544199f, 0.544280f, 0.544360f, 0.544441f, 0.544521f, 0.544602f,
+ 0.544682f, 0.544762f, 0.544843f, 0.544923f, 0.545003f, 0.545084f, 0.545164f, 0.545245f,
+ 0.545325f, 0.545405f, 0.545486f, 0.545566f, 0.545646f, 0.545727f, 0.545807f, 0.545887f,
+ 0.545968f, 0.546048f, 0.546128f, 0.546209f, 0.546289f, 0.546369f, 0.546450f, 0.546530f,
+ 0.546610f, 0.546690f, 0.546771f, 0.546851f, 0.546931f, 0.547011f, 0.547092f, 0.547172f,
+ 0.547252f, 0.547333f, 0.547413f, 0.547493f, 0.547573f, 0.547653f, 0.547734f, 0.547814f,
+ 0.547894f, 0.547974f, 0.548054f, 0.548135f, 0.548215f, 0.548295f, 0.548375f, 0.548455f,
+ 0.548536f, 0.548616f, 0.548696f, 0.548776f, 0.548856f, 0.548936f, 0.549016f, 0.549097f,
+ 0.549177f, 0.549257f, 0.549337f, 0.549417f, 0.549497f, 0.549577f, 0.549657f, 0.549737f,
+ 0.549818f, 0.549898f, 0.549978f, 0.550058f, 0.550138f, 0.550218f, 0.550298f, 0.550378f,
+ 0.550458f, 0.550538f, 0.550618f, 0.550698f, 0.550778f, 0.550858f, 0.550938f, 0.551018f,
+ 0.551098f, 0.551178f, 0.551258f, 0.551338f, 0.551418f, 0.551498f, 0.551578f, 0.551658f,
+ 0.551738f, 0.551818f, 0.551898f, 0.551978f, 0.552058f, 0.552138f, 0.552218f, 0.552298f,
+ 0.552378f, 0.552457f, 0.552537f, 0.552617f, 0.552697f, 0.552777f, 0.552857f, 0.552937f,
+ 0.553017f, 0.553097f, 0.553176f, 0.553256f, 0.553336f, 0.553416f, 0.553496f, 0.553576f,
+ 0.553656f, 0.553735f, 0.553815f, 0.553895f, 0.553975f, 0.554055f, 0.554134f, 0.554214f,
+ 0.554294f, 0.554374f, 0.554454f, 0.554533f, 0.554613f, 0.554693f, 0.554773f, 0.554853f,
+ 0.554932f, 0.555012f, 0.555092f, 0.555172f, 0.555251f, 0.555331f, 0.555411f, 0.555490f,
+ 0.555570f, 0.555650f, 0.555730f, 0.555809f, 0.555889f, 0.555969f, 0.556048f, 0.556128f,
+ 0.556208f, 0.556287f, 0.556367f, 0.556447f, 0.556526f, 0.556606f, 0.556686f, 0.556765f,
+ 0.556845f, 0.556925f, 0.557004f, 0.557084f, 0.557164f, 0.557243f, 0.557323f, 0.557402f,
+ 0.557482f, 0.557562f, 0.557641f, 0.557721f, 0.557800f, 0.557880f, 0.557959f, 0.558039f,
+ 0.558119f, 0.558198f, 0.558278f, 0.558357f, 0.558437f, 0.558516f, 0.558596f, 0.558675f,
+ 0.558755f, 0.558834f, 0.558914f, 0.558993f, 0.559073f, 0.559152f, 0.559232f, 0.559311f,
+ 0.559391f, 0.559470f, 0.559550f, 0.559629f, 0.559709f, 0.559788f, 0.559867f, 0.559947f,
+ 0.560026f, 0.560106f, 0.560185f, 0.560265f, 0.560344f, 0.560423f, 0.560503f, 0.560582f,
+ 0.560662f, 0.560741f, 0.560820f, 0.560900f, 0.560979f, 0.561058f, 0.561138f, 0.561217f,
+ 0.561297f, 0.561376f, 0.561455f, 0.561535f, 0.561614f, 0.561693f, 0.561773f, 0.561852f,
+ 0.561931f, 0.562010f, 0.562090f, 0.562169f, 0.562248f, 0.562328f, 0.562407f, 0.562486f,
+ 0.562565f, 0.562645f, 0.562724f, 0.562803f, 0.562882f, 0.562962f, 0.563041f, 0.563120f,
+ 0.563199f, 0.563279f, 0.563358f, 0.563437f, 0.563516f, 0.563595f, 0.563675f, 0.563754f,
+ 0.563833f, 0.563912f, 0.563991f, 0.564070f, 0.564150f, 0.564229f, 0.564308f, 0.564387f,
+ 0.564466f, 0.564545f, 0.564624f, 0.564704f, 0.564783f, 0.564862f, 0.564941f, 0.565020f,
+ 0.565099f, 0.565178f, 0.565257f, 0.565336f, 0.565416f, 0.565495f, 0.565574f, 0.565653f,
+ 0.565732f, 0.565811f, 0.565890f, 0.565969f, 0.566048f, 0.566127f, 0.566206f, 0.566285f,
+ 0.566364f, 0.566443f, 0.566522f, 0.566601f, 0.566680f, 0.566759f, 0.566838f, 0.566917f,
+ 0.566996f, 0.567075f, 0.567154f, 0.567233f, 0.567312f, 0.567391f, 0.567470f, 0.567549f,
+ 0.567628f, 0.567707f, 0.567786f, 0.567864f, 0.567943f, 0.568022f, 0.568101f, 0.568180f,
+ 0.568259f, 0.568338f, 0.568417f, 0.568496f, 0.568574f, 0.568653f, 0.568732f, 0.568811f,
+ 0.568890f, 0.568969f, 0.569048f, 0.569126f, 0.569205f, 0.569284f, 0.569363f, 0.569442f,
+ 0.569521f, 0.569599f, 0.569678f, 0.569757f, 0.569836f, 0.569914f, 0.569993f, 0.570072f,
+ 0.570151f, 0.570230f, 0.570308f, 0.570387f, 0.570466f, 0.570545f, 0.570623f, 0.570702f,
+ 0.570781f, 0.570859f, 0.570938f, 0.571017f, 0.571096f, 0.571174f, 0.571253f, 0.571332f,
+ 0.571410f, 0.571489f, 0.571568f, 0.571646f, 0.571725f, 0.571804f, 0.571882f, 0.571961f,
+ 0.572040f, 0.572118f, 0.572197f, 0.572276f, 0.572354f, 0.572433f, 0.572511f, 0.572590f,
+ 0.572669f, 0.572747f, 0.572826f, 0.572904f, 0.572983f, 0.573061f, 0.573140f, 0.573219f,
+ 0.573297f, 0.573376f, 0.573454f, 0.573533f, 0.573611f, 0.573690f, 0.573768f, 0.573847f,
+ 0.573925f, 0.574004f, 0.574082f, 0.574161f, 0.574239f, 0.574318f, 0.574396f, 0.574475f,
+ 0.574553f, 0.574632f, 0.574710f, 0.574789f, 0.574867f, 0.574946f, 0.575024f, 0.575103f,
+ 0.575181f, 0.575259f, 0.575338f, 0.575416f, 0.575495f, 0.575573f, 0.575651f, 0.575730f,
+ 0.575808f, 0.575887f, 0.575965f, 0.576043f, 0.576122f, 0.576200f, 0.576278f, 0.576357f,
+ 0.576435f, 0.576513f, 0.576592f, 0.576670f, 0.576748f, 0.576827f, 0.576905f, 0.576983f,
+ 0.577062f, 0.577140f, 0.577218f, 0.577297f, 0.577375f, 0.577453f, 0.577531f, 0.577610f,
+ 0.577688f, 0.577766f, 0.577844f, 0.577923f, 0.578001f, 0.578079f, 0.578157f, 0.578236f,
+ 0.578314f, 0.578392f, 0.578470f, 0.578548f, 0.578627f, 0.578705f, 0.578783f, 0.578861f,
+ 0.578939f, 0.579018f, 0.579096f, 0.579174f, 0.579252f, 0.579330f, 0.579408f, 0.579486f,
+ 0.579565f, 0.579643f, 0.579721f, 0.579799f, 0.579877f, 0.579955f, 0.580033f, 0.580111f,
+ 0.580189f, 0.580267f, 0.580346f, 0.580424f, 0.580502f, 0.580580f, 0.580658f, 0.580736f,
+ 0.580814f, 0.580892f, 0.580970f, 0.581048f, 0.581126f, 0.581204f, 0.581282f, 0.581360f,
+ 0.581438f, 0.581516f, 0.581594f, 0.581672f, 0.581750f, 0.581828f, 0.581906f, 0.581984f,
+ 0.582062f, 0.582140f, 0.582218f, 0.582296f, 0.582374f, 0.582452f, 0.582530f, 0.582608f,
+ 0.582685f, 0.582763f, 0.582841f, 0.582919f, 0.582997f, 0.583075f, 0.583153f, 0.583231f,
+ 0.583309f, 0.583387f, 0.583464f, 0.583542f, 0.583620f, 0.583698f, 0.583776f, 0.583854f,
+ 0.583931f, 0.584009f, 0.584087f, 0.584165f, 0.584243f, 0.584321f, 0.584398f, 0.584476f,
+ 0.584554f, 0.584632f, 0.584710f, 0.584787f, 0.584865f, 0.584943f, 0.585021f, 0.585098f,
+ 0.585176f, 0.585254f, 0.585332f, 0.585409f, 0.585487f, 0.585565f, 0.585642f, 0.585720f,
+ 0.585798f, 0.585876f, 0.585953f, 0.586031f, 0.586109f, 0.586186f, 0.586264f, 0.586342f,
+ 0.586419f, 0.586497f, 0.586575f, 0.586652f, 0.586730f, 0.586808f, 0.586885f, 0.586963f,
+ 0.587040f, 0.587118f, 0.587196f, 0.587273f, 0.587351f, 0.587428f, 0.587506f, 0.587584f,
+ 0.587661f, 0.587739f, 0.587816f, 0.587894f, 0.587971f, 0.588049f, 0.588126f, 0.588204f,
+ 0.588282f, 0.588359f, 0.588437f, 0.588514f, 0.588592f, 0.588669f, 0.588747f, 0.588824f,
+ 0.588902f, 0.588979f, 0.589057f, 0.589134f, 0.589212f, 0.589289f, 0.589366f, 0.589444f,
+ 0.589521f, 0.589599f, 0.589676f, 0.589754f, 0.589831f, 0.589908f, 0.589986f, 0.590063f,
+ 0.590141f, 0.590218f, 0.590295f, 0.590373f, 0.590450f, 0.590528f, 0.590605f, 0.590682f,
+ 0.590760f, 0.590837f, 0.590914f, 0.590992f, 0.591069f, 0.591146f, 0.591224f, 0.591301f,
+ 0.591378f, 0.591456f, 0.591533f, 0.591610f, 0.591688f, 0.591765f, 0.591842f, 0.591919f,
+ 0.591997f, 0.592074f, 0.592151f, 0.592228f, 0.592306f, 0.592383f, 0.592460f, 0.592537f,
+ 0.592615f, 0.592692f, 0.592769f, 0.592846f, 0.592924f, 0.593001f, 0.593078f, 0.593155f,
+ 0.593232f, 0.593309f, 0.593387f, 0.593464f, 0.593541f, 0.593618f, 0.593695f, 0.593772f,
+ 0.593850f, 0.593927f, 0.594004f, 0.594081f, 0.594158f, 0.594235f, 0.594312f, 0.594389f,
+ 0.594467f, 0.594544f, 0.594621f, 0.594698f, 0.594775f, 0.594852f, 0.594929f, 0.595006f,
+ 0.595083f, 0.595160f, 0.595237f, 0.595314f, 0.595391f, 0.595468f, 0.595545f, 0.595622f,
+ 0.595699f, 0.595776f, 0.595853f, 0.595930f, 0.596007f, 0.596084f, 0.596161f, 0.596238f,
+ 0.596315f, 0.596392f, 0.596469f, 0.596546f, 0.596623f, 0.596700f, 0.596777f, 0.596854f,
+ 0.596931f, 0.597008f, 0.597085f, 0.597161f, 0.597238f, 0.597315f, 0.597392f, 0.597469f,
+ 0.597546f, 0.597623f, 0.597700f, 0.597776f, 0.597853f, 0.597930f, 0.598007f, 0.598084f,
+ 0.598161f, 0.598238f, 0.598314f, 0.598391f, 0.598468f, 0.598545f, 0.598622f, 0.598698f,
+ 0.598775f, 0.598852f, 0.598929f, 0.599006f, 0.599082f, 0.599159f, 0.599236f, 0.599313f,
+ 0.599389f, 0.599466f, 0.599543f, 0.599620f, 0.599696f, 0.599773f, 0.599850f, 0.599926f,
+ 0.600003f, 0.600080f, 0.600156f, 0.600233f, 0.600310f, 0.600387f, 0.600463f, 0.600540f,
+ 0.600616f, 0.600693f, 0.600770f, 0.600846f, 0.600923f, 0.601000f, 0.601076f, 0.601153f,
+ 0.601230f, 0.601306f, 0.601383f, 0.601459f, 0.601536f, 0.601613f, 0.601689f, 0.601766f,
+ 0.601842f, 0.601919f, 0.601995f, 0.602072f, 0.602148f, 0.602225f, 0.602302f, 0.602378f,
+ 0.602455f, 0.602531f, 0.602608f, 0.602684f, 0.602761f, 0.602837f, 0.602914f, 0.602990f,
+ 0.603067f, 0.603143f, 0.603220f, 0.603296f, 0.603372f, 0.603449f, 0.603525f, 0.603602f,
+ 0.603678f, 0.603755f, 0.603831f, 0.603908f, 0.603984f, 0.604060f, 0.604137f, 0.604213f,
+ 0.604290f, 0.604366f, 0.604442f, 0.604519f, 0.604595f, 0.604671f, 0.604748f, 0.604824f,
+ 0.604900f, 0.604977f, 0.605053f, 0.605129f, 0.605206f, 0.605282f, 0.605358f, 0.605435f,
+ 0.605511f, 0.605587f, 0.605664f, 0.605740f, 0.605816f, 0.605892f, 0.605969f, 0.606045f,
+ 0.606121f, 0.606198f, 0.606274f, 0.606350f, 0.606426f, 0.606502f, 0.606579f, 0.606655f,
+ 0.606731f, 0.606807f, 0.606884f, 0.606960f, 0.607036f, 0.607112f, 0.607188f, 0.607264f,
+ 0.607341f, 0.607417f, 0.607493f, 0.607569f, 0.607645f, 0.607721f, 0.607798f, 0.607874f,
+ 0.607950f, 0.608026f, 0.608102f, 0.608178f, 0.608254f, 0.608330f, 0.608406f, 0.608482f,
+ 0.608559f, 0.608635f, 0.608711f, 0.608787f, 0.608863f, 0.608939f, 0.609015f, 0.609091f,
+ 0.609167f, 0.609243f, 0.609319f, 0.609395f, 0.609471f, 0.609547f, 0.609623f, 0.609699f,
+ 0.609775f, 0.609851f, 0.609927f, 0.610003f, 0.610079f, 0.610155f, 0.610231f, 0.610307f,
+ 0.610383f, 0.610459f, 0.610535f, 0.610611f, 0.610687f, 0.610762f, 0.610838f, 0.610914f,
+ 0.610990f, 0.611066f, 0.611142f, 0.611218f, 0.611294f, 0.611370f, 0.611445f, 0.611521f,
+ 0.611597f, 0.611673f, 0.611749f, 0.611825f, 0.611901f, 0.611976f, 0.612052f, 0.612128f,
+ 0.612204f, 0.612280f, 0.612355f, 0.612431f, 0.612507f, 0.612583f, 0.612659f, 0.612734f,
+ 0.612810f, 0.612886f, 0.612962f, 0.613037f, 0.613113f, 0.613189f, 0.613265f, 0.613340f,
+ 0.613416f, 0.613492f, 0.613567f, 0.613643f, 0.613719f, 0.613795f, 0.613870f, 0.613946f,
+ 0.614022f, 0.614097f, 0.614173f, 0.614249f, 0.614324f, 0.614400f, 0.614475f, 0.614551f,
+ 0.614627f, 0.614702f, 0.614778f, 0.614854f, 0.614929f, 0.615005f, 0.615080f, 0.615156f,
+ 0.615232f, 0.615307f, 0.615383f, 0.615458f, 0.615534f, 0.615609f, 0.615685f, 0.615761f,
+ 0.615836f, 0.615912f, 0.615987f, 0.616063f, 0.616138f, 0.616214f, 0.616289f, 0.616365f,
+ 0.616440f, 0.616516f, 0.616591f, 0.616667f, 0.616742f, 0.616818f, 0.616893f, 0.616968f,
+ 0.617044f, 0.617119f, 0.617195f, 0.617270f, 0.617346f, 0.617421f, 0.617496f, 0.617572f,
+ 0.617647f, 0.617723f, 0.617798f, 0.617873f, 0.617949f, 0.618024f, 0.618100f, 0.618175f,
+ 0.618250f, 0.618326f, 0.618401f, 0.618476f, 0.618552f, 0.618627f, 0.618702f, 0.618778f,
+ 0.618853f, 0.618928f, 0.619004f, 0.619079f, 0.619154f, 0.619229f, 0.619305f, 0.619380f,
+ 0.619455f, 0.619531f, 0.619606f, 0.619681f, 0.619756f, 0.619832f, 0.619907f, 0.619982f,
+ 0.620057f, 0.620132f, 0.620208f, 0.620283f, 0.620358f, 0.620433f, 0.620508f, 0.620584f,
+ 0.620659f, 0.620734f, 0.620809f, 0.620884f, 0.620959f, 0.621035f, 0.621110f, 0.621185f,
+ 0.621260f, 0.621335f, 0.621410f, 0.621485f, 0.621560f, 0.621636f, 0.621711f, 0.621786f,
+ 0.621861f, 0.621936f, 0.622011f, 0.622086f, 0.622161f, 0.622236f, 0.622311f, 0.622386f,
+ 0.622461f, 0.622536f, 0.622611f, 0.622686f, 0.622761f, 0.622836f, 0.622911f, 0.622986f,
+ 0.623061f, 0.623136f, 0.623211f, 0.623286f, 0.623361f, 0.623436f, 0.623511f, 0.623586f,
+ 0.623661f, 0.623736f, 0.623811f, 0.623886f, 0.623961f, 0.624036f, 0.624111f, 0.624186f,
+ 0.624260f, 0.624335f, 0.624410f, 0.624485f, 0.624560f, 0.624635f, 0.624710f, 0.624785f,
+ 0.624860f, 0.624934f, 0.625009f, 0.625084f, 0.625159f, 0.625234f, 0.625309f, 0.625383f,
+ 0.625458f, 0.625533f, 0.625608f, 0.625683f, 0.625757f, 0.625832f, 0.625907f, 0.625982f,
+ 0.626056f, 0.626131f, 0.626206f, 0.626281f, 0.626355f, 0.626430f, 0.626505f, 0.626580f,
+ 0.626654f, 0.626729f, 0.626804f, 0.626878f, 0.626953f, 0.627028f, 0.627102f, 0.627177f,
+ 0.627252f, 0.627326f, 0.627401f, 0.627476f, 0.627550f, 0.627625f, 0.627700f, 0.627774f,
+ 0.627849f, 0.627924f, 0.627998f, 0.628073f, 0.628147f, 0.628222f, 0.628297f, 0.628371f,
+ 0.628446f, 0.628520f, 0.628595f, 0.628669f, 0.628744f, 0.628819f, 0.628893f, 0.628968f,
+ 0.629042f, 0.629117f, 0.629191f, 0.629266f, 0.629340f, 0.629415f, 0.629489f, 0.629564f,
+ 0.629638f, 0.629713f, 0.629787f, 0.629862f, 0.629936f, 0.630011f, 0.630085f, 0.630159f,
+ 0.630234f, 0.630308f, 0.630383f, 0.630457f, 0.630532f, 0.630606f, 0.630680f, 0.630755f,
+ 0.630829f, 0.630904f, 0.630978f, 0.631052f, 0.631127f, 0.631201f, 0.631275f, 0.631350f,
+ 0.631424f, 0.631499f, 0.631573f, 0.631647f, 0.631721f, 0.631796f, 0.631870f, 0.631944f,
+ 0.632019f, 0.632093f, 0.632167f, 0.632242f, 0.632316f, 0.632390f, 0.632464f, 0.632539f,
+ 0.632613f, 0.632687f, 0.632761f, 0.632836f, 0.632910f, 0.632984f, 0.633058f, 0.633133f,
+ 0.633207f, 0.633281f, 0.633355f, 0.633429f, 0.633504f, 0.633578f, 0.633652f, 0.633726f,
+ 0.633800f, 0.633874f, 0.633949f, 0.634023f, 0.634097f, 0.634171f, 0.634245f, 0.634319f,
+ 0.634393f, 0.634467f, 0.634542f, 0.634616f, 0.634690f, 0.634764f, 0.634838f, 0.634912f,
+ 0.634986f, 0.635060f, 0.635134f, 0.635208f, 0.635282f, 0.635356f, 0.635430f, 0.635504f,
+ 0.635578f, 0.635652f, 0.635726f, 0.635800f, 0.635874f, 0.635948f, 0.636022f, 0.636096f,
+ 0.636170f, 0.636244f, 0.636318f, 0.636392f, 0.636466f, 0.636540f, 0.636614f, 0.636688f,
+ 0.636762f, 0.636836f, 0.636910f, 0.636984f, 0.637057f, 0.637131f, 0.637205f, 0.637279f,
+ 0.637353f, 0.637427f, 0.637501f, 0.637575f, 0.637649f, 0.637722f, 0.637796f, 0.637870f,
+ 0.637944f, 0.638018f, 0.638092f, 0.638165f, 0.638239f, 0.638313f, 0.638387f, 0.638461f,
+ 0.638534f, 0.638608f, 0.638682f, 0.638756f, 0.638829f, 0.638903f, 0.638977f, 0.639051f,
+ 0.639124f, 0.639198f, 0.639272f, 0.639346f, 0.639419f, 0.639493f, 0.639567f, 0.639640f,
+ 0.639714f, 0.639788f, 0.639862f, 0.639935f, 0.640009f, 0.640083f, 0.640156f, 0.640230f,
+ 0.640303f, 0.640377f, 0.640451f, 0.640524f, 0.640598f, 0.640672f, 0.640745f, 0.640819f,
+ 0.640892f, 0.640966f, 0.641040f, 0.641113f, 0.641187f, 0.641260f, 0.641334f, 0.641407f,
+ 0.641481f, 0.641555f, 0.641628f, 0.641702f, 0.641775f, 0.641849f, 0.641922f, 0.641996f,
+ 0.642069f, 0.642143f, 0.642216f, 0.642290f, 0.642363f, 0.642437f, 0.642510f, 0.642584f,
+ 0.642657f, 0.642730f, 0.642804f, 0.642877f, 0.642951f, 0.643024f, 0.643098f, 0.643171f,
+ 0.643245f, 0.643318f, 0.643391f, 0.643465f, 0.643538f, 0.643611f, 0.643685f, 0.643758f,
+ 0.643832f, 0.643905f, 0.643978f, 0.644052f, 0.644125f, 0.644198f, 0.644272f, 0.644345f,
+ 0.644418f, 0.644492f, 0.644565f, 0.644638f, 0.644711f, 0.644785f, 0.644858f, 0.644931f,
+ 0.645005f, 0.645078f, 0.645151f, 0.645224f, 0.645298f, 0.645371f, 0.645444f, 0.645517f,
+ 0.645590f, 0.645664f, 0.645737f, 0.645810f, 0.645883f, 0.645956f, 0.646030f, 0.646103f,
+ 0.646176f, 0.646249f, 0.646322f, 0.646396f, 0.646469f, 0.646542f, 0.646615f, 0.646688f,
+ 0.646761f, 0.646834f, 0.646907f, 0.646981f, 0.647054f, 0.647127f, 0.647200f, 0.647273f,
+ 0.647346f, 0.647419f, 0.647492f, 0.647565f, 0.647638f, 0.647711f, 0.647784f, 0.647857f,
+ 0.647930f, 0.648003f, 0.648076f, 0.648149f, 0.648222f, 0.648295f, 0.648368f, 0.648441f,
+ 0.648514f, 0.648587f, 0.648660f, 0.648733f, 0.648806f, 0.648879f, 0.648952f, 0.649025f,
+ 0.649098f, 0.649171f, 0.649244f, 0.649317f, 0.649390f, 0.649463f, 0.649536f, 0.649608f,
+ 0.649681f, 0.649754f, 0.649827f, 0.649900f, 0.649973f, 0.650046f, 0.650119f, 0.650191f,
+ 0.650264f, 0.650337f, 0.650410f, 0.650483f, 0.650555f, 0.650628f, 0.650701f, 0.650774f,
+ 0.650847f, 0.650919f, 0.650992f, 0.651065f, 0.651138f, 0.651211f, 0.651283f, 0.651356f,
+ 0.651429f, 0.651502f, 0.651574f, 0.651647f, 0.651720f, 0.651792f, 0.651865f, 0.651938f,
+ 0.652011f, 0.652083f, 0.652156f, 0.652229f, 0.652301f, 0.652374f, 0.652447f, 0.652519f,
+ 0.652592f, 0.652665f, 0.652737f, 0.652810f, 0.652882f, 0.652955f, 0.653028f, 0.653100f,
+ 0.653173f, 0.653245f, 0.653318f, 0.653391f, 0.653463f, 0.653536f, 0.653608f, 0.653681f,
+ 0.653753f, 0.653826f, 0.653899f, 0.653971f, 0.654044f, 0.654116f, 0.654189f, 0.654261f,
+ 0.654334f, 0.654406f, 0.654479f, 0.654551f, 0.654624f, 0.654696f, 0.654769f, 0.654841f,
+ 0.654913f, 0.654986f, 0.655058f, 0.655131f, 0.655203f, 0.655276f, 0.655348f, 0.655420f,
+ 0.655493f, 0.655565f, 0.655638f, 0.655710f, 0.655782f, 0.655855f, 0.655927f, 0.656000f,
+ 0.656072f, 0.656144f, 0.656217f, 0.656289f, 0.656361f, 0.656434f, 0.656506f, 0.656578f,
+ 0.656651f, 0.656723f, 0.656795f, 0.656867f, 0.656940f, 0.657012f, 0.657084f, 0.657157f,
+ 0.657229f, 0.657301f, 0.657373f, 0.657446f, 0.657518f, 0.657590f, 0.657662f, 0.657734f,
+ 0.657807f, 0.657879f, 0.657951f, 0.658023f, 0.658095f, 0.658168f, 0.658240f, 0.658312f,
+ 0.658384f, 0.658456f, 0.658529f, 0.658601f, 0.658673f, 0.658745f, 0.658817f, 0.658889f,
+ 0.658961f, 0.659033f, 0.659105f, 0.659178f, 0.659250f, 0.659322f, 0.659394f, 0.659466f,
+ 0.659538f, 0.659610f, 0.659682f, 0.659754f, 0.659826f, 0.659898f, 0.659970f, 0.660042f,
+ 0.660114f, 0.660186f, 0.660258f, 0.660330f, 0.660402f, 0.660474f, 0.660546f, 0.660618f,
+ 0.660690f, 0.660762f, 0.660834f, 0.660906f, 0.660978f, 0.661050f, 0.661122f, 0.661194f,
+ 0.661266f, 0.661338f, 0.661410f, 0.661482f, 0.661553f, 0.661625f, 0.661697f, 0.661769f,
+ 0.661841f, 0.661913f, 0.661985f, 0.662057f, 0.662128f, 0.662200f, 0.662272f, 0.662344f,
+ 0.662416f, 0.662488f, 0.662559f, 0.662631f, 0.662703f, 0.662775f, 0.662847f, 0.662918f,
+ 0.662990f, 0.663062f, 0.663134f, 0.663205f, 0.663277f, 0.663349f, 0.663421f, 0.663492f,
+ 0.663564f, 0.663636f, 0.663708f, 0.663779f, 0.663851f, 0.663923f, 0.663994f, 0.664066f,
+ 0.664138f, 0.664209f, 0.664281f, 0.664353f, 0.664424f, 0.664496f, 0.664568f, 0.664639f,
+ 0.664711f, 0.664783f, 0.664854f, 0.664926f, 0.664997f, 0.665069f, 0.665141f, 0.665212f,
+ 0.665284f, 0.665355f, 0.665427f, 0.665498f, 0.665570f, 0.665642f, 0.665713f, 0.665785f,
+ 0.665856f, 0.665928f, 0.665999f, 0.666071f, 0.666142f, 0.666214f, 0.666285f, 0.666357f,
+ 0.666428f, 0.666500f, 0.666571f, 0.666643f, 0.666714f, 0.666786f, 0.666857f, 0.666928f,
+ 0.667000f, 0.667071f, 0.667143f, 0.667214f, 0.667286f, 0.667357f, 0.667428f, 0.667500f,
+ 0.667571f, 0.667643f, 0.667714f, 0.667785f, 0.667857f, 0.667928f, 0.667999f, 0.668071f,
+ 0.668142f, 0.668213f, 0.668285f, 0.668356f, 0.668427f, 0.668499f, 0.668570f, 0.668641f,
+ 0.668712f, 0.668784f, 0.668855f, 0.668926f, 0.668998f, 0.669069f, 0.669140f, 0.669211f,
+ 0.669283f, 0.669354f, 0.669425f, 0.669496f, 0.669567f, 0.669639f, 0.669710f, 0.669781f,
+ 0.669852f, 0.669923f, 0.669995f, 0.670066f, 0.670137f, 0.670208f, 0.670279f, 0.670350f,
+ 0.670422f, 0.670493f, 0.670564f, 0.670635f, 0.670706f, 0.670777f, 0.670848f, 0.670919f,
+ 0.670990f, 0.671062f, 0.671133f, 0.671204f, 0.671275f, 0.671346f, 0.671417f, 0.671488f,
+ 0.671559f, 0.671630f, 0.671701f, 0.671772f, 0.671843f, 0.671914f, 0.671985f, 0.672056f,
+ 0.672127f, 0.672198f, 0.672269f, 0.672340f, 0.672411f, 0.672482f, 0.672553f, 0.672624f,
+ 0.672695f, 0.672766f, 0.672837f, 0.672908f, 0.672978f, 0.673049f, 0.673120f, 0.673191f,
+ 0.673262f, 0.673333f, 0.673404f, 0.673475f, 0.673546f, 0.673616f, 0.673687f, 0.673758f,
+ 0.673829f, 0.673900f, 0.673971f, 0.674042f, 0.674112f, 0.674183f, 0.674254f, 0.674325f,
+ 0.674396f, 0.674466f, 0.674537f, 0.674608f, 0.674679f, 0.674749f, 0.674820f, 0.674891f,
+ 0.674962f, 0.675032f, 0.675103f, 0.675174f, 0.675245f, 0.675315f, 0.675386f, 0.675457f,
+ 0.675527f, 0.675598f, 0.675669f, 0.675739f, 0.675810f, 0.675881f, 0.675951f, 0.676022f,
+ 0.676093f, 0.676163f, 0.676234f, 0.676305f, 0.676375f, 0.676446f, 0.676516f, 0.676587f,
+ 0.676658f, 0.676728f, 0.676799f, 0.676869f, 0.676940f, 0.677011f, 0.677081f, 0.677152f,
+ 0.677222f, 0.677293f, 0.677363f, 0.677434f, 0.677504f, 0.677575f, 0.677645f, 0.677716f,
+ 0.677786f, 0.677857f, 0.677927f, 0.677998f, 0.678068f, 0.678139f, 0.678209f, 0.678280f,
+ 0.678350f, 0.678420f, 0.678491f, 0.678561f, 0.678632f, 0.678702f, 0.678773f, 0.678843f,
+ 0.678913f, 0.678984f, 0.679054f, 0.679125f, 0.679195f, 0.679265f, 0.679336f, 0.679406f,
+ 0.679476f, 0.679547f, 0.679617f, 0.679687f, 0.679758f, 0.679828f, 0.679898f, 0.679969f,
+ 0.680039f, 0.680109f, 0.680179f, 0.680250f, 0.680320f, 0.680390f, 0.680461f, 0.680531f,
+ 0.680601f, 0.680671f, 0.680741f, 0.680812f, 0.680882f, 0.680952f, 0.681022f, 0.681093f,
+ 0.681163f, 0.681233f, 0.681303f, 0.681373f, 0.681443f, 0.681514f, 0.681584f, 0.681654f,
+ 0.681724f, 0.681794f, 0.681864f, 0.681934f, 0.682005f, 0.682075f, 0.682145f, 0.682215f,
+ 0.682285f, 0.682355f, 0.682425f, 0.682495f, 0.682565f, 0.682635f, 0.682705f, 0.682775f,
+ 0.682846f, 0.682916f, 0.682986f, 0.683056f, 0.683126f, 0.683196f, 0.683266f, 0.683336f,
+ 0.683406f, 0.683476f, 0.683546f, 0.683616f, 0.683686f, 0.683756f, 0.683825f, 0.683895f,
+ 0.683965f, 0.684035f, 0.684105f, 0.684175f, 0.684245f, 0.684315f, 0.684385f, 0.684455f,
+ 0.684525f, 0.684595f, 0.684664f, 0.684734f, 0.684804f, 0.684874f, 0.684944f, 0.685014f,
+ 0.685084f, 0.685153f, 0.685223f, 0.685293f, 0.685363f, 0.685433f, 0.685503f, 0.685572f,
+ 0.685642f, 0.685712f, 0.685782f, 0.685852f, 0.685921f, 0.685991f, 0.686061f, 0.686131f,
+ 0.686200f, 0.686270f, 0.686340f, 0.686409f, 0.686479f, 0.686549f, 0.686619f, 0.686688f,
+ 0.686758f, 0.686828f, 0.686897f, 0.686967f, 0.687037f, 0.687106f, 0.687176f, 0.687246f,
+ 0.687315f, 0.687385f, 0.687455f, 0.687524f, 0.687594f, 0.687663f, 0.687733f, 0.687803f,
+ 0.687872f, 0.687942f, 0.688011f, 0.688081f, 0.688151f, 0.688220f, 0.688290f, 0.688359f,
+ 0.688429f, 0.688498f, 0.688568f, 0.688637f, 0.688707f, 0.688776f, 0.688846f, 0.688915f,
+ 0.688985f, 0.689054f, 0.689124f, 0.689193f, 0.689263f, 0.689332f, 0.689402f, 0.689471f,
+ 0.689541f, 0.689610f, 0.689679f, 0.689749f, 0.689818f, 0.689888f, 0.689957f, 0.690026f,
+ 0.690096f, 0.690165f, 0.690235f, 0.690304f, 0.690373f, 0.690443f, 0.690512f, 0.690581f,
+ 0.690651f, 0.690720f, 0.690789f, 0.690859f, 0.690928f, 0.690997f, 0.691067f, 0.691136f,
+ 0.691205f, 0.691274f, 0.691344f, 0.691413f, 0.691482f, 0.691552f, 0.691621f, 0.691690f,
+ 0.691759f, 0.691828f, 0.691898f, 0.691967f, 0.692036f, 0.692105f, 0.692175f, 0.692244f,
+ 0.692313f, 0.692382f, 0.692451f, 0.692520f, 0.692590f, 0.692659f, 0.692728f, 0.692797f,
+ 0.692866f, 0.692935f, 0.693004f, 0.693074f, 0.693143f, 0.693212f, 0.693281f, 0.693350f,
+ 0.693419f, 0.693488f, 0.693557f, 0.693626f, 0.693695f, 0.693764f, 0.693833f, 0.693902f,
+ 0.693971f, 0.694040f, 0.694109f, 0.694179f, 0.694248f, 0.694317f, 0.694386f, 0.694454f,
+ 0.694524f, 0.694592f, 0.694661f, 0.694730f, 0.694799f, 0.694868f, 0.694937f, 0.695006f,
+ 0.695075f, 0.695144f, 0.695213f, 0.695282f, 0.695351f, 0.695420f, 0.695489f, 0.695557f,
+ 0.695626f, 0.695695f, 0.695764f, 0.695833f, 0.695902f, 0.695971f, 0.696039f, 0.696108f,
+ 0.696177f, 0.696246f, 0.696315f, 0.696384f, 0.696452f, 0.696521f, 0.696590f, 0.696659f,
+ 0.696728f, 0.696796f, 0.696865f, 0.696934f, 0.697003f, 0.697071f, 0.697140f, 0.697209f,
+ 0.697277f, 0.697346f, 0.697415f, 0.697484f, 0.697552f, 0.697621f, 0.697690f, 0.697758f,
+ 0.697827f, 0.697896f, 0.697964f, 0.698033f, 0.698102f, 0.698170f, 0.698239f, 0.698308f,
+ 0.698376f, 0.698445f, 0.698513f, 0.698582f, 0.698651f, 0.698719f, 0.698788f, 0.698856f,
+ 0.698925f, 0.698994f, 0.699062f, 0.699131f, 0.699199f, 0.699268f, 0.699336f, 0.699405f,
+ 0.699473f, 0.699542f, 0.699610f, 0.699679f, 0.699747f, 0.699816f, 0.699884f, 0.699953f,
+ 0.700021f, 0.700090f, 0.700158f, 0.700227f, 0.700295f, 0.700364f, 0.700432f, 0.700500f,
+ 0.700569f, 0.700637f, 0.700706f, 0.700774f, 0.700842f, 0.700911f, 0.700979f, 0.701048f,
+ 0.701116f, 0.701184f, 0.701253f, 0.701321f, 0.701389f, 0.701458f, 0.701526f, 0.701594f,
+ 0.701663f, 0.701731f, 0.701799f, 0.701868f, 0.701936f, 0.702004f, 0.702072f, 0.702141f,
+ 0.702209f, 0.702277f, 0.702345f, 0.702414f, 0.702482f, 0.702550f, 0.702618f, 0.702687f,
+ 0.702755f, 0.702823f, 0.702891f, 0.702959f, 0.703028f, 0.703096f, 0.703164f, 0.703232f,
+ 0.703300f, 0.703368f, 0.703436f, 0.703505f, 0.703573f, 0.703641f, 0.703709f, 0.703777f,
+ 0.703845f, 0.703913f, 0.703981f, 0.704050f, 0.704118f, 0.704186f, 0.704254f, 0.704322f,
+ 0.704390f, 0.704458f, 0.704526f, 0.704594f, 0.704662f, 0.704730f, 0.704798f, 0.704866f,
+ 0.704934f, 0.705002f, 0.705070f, 0.705138f, 0.705206f, 0.705274f, 0.705342f, 0.705410f,
+ 0.705478f, 0.705546f, 0.705614f, 0.705682f, 0.705750f, 0.705818f, 0.705885f, 0.705953f,
+ 0.706021f, 0.706089f, 0.706157f, 0.706225f, 0.706293f, 0.706361f, 0.706429f, 0.706496f,
+ 0.706564f, 0.706632f, 0.706700f, 0.706768f, 0.706836f, 0.706903f, 0.706971f, 0.707039f,
+ 0.707107f, 0.707175f, 0.707242f, 0.707310f, 0.707378f, 0.707446f, 0.707513f, 0.707581f,
+ 0.707649f, 0.707717f, 0.707784f, 0.707852f, 0.707920f, 0.707988f, 0.708055f, 0.708123f,
+ 0.708191f, 0.708258f, 0.708326f, 0.708394f, 0.708461f, 0.708529f, 0.708597f, 0.708664f,
+ 0.708732f, 0.708800f, 0.708867f, 0.708935f, 0.709002f, 0.709070f, 0.709138f, 0.709205f,
+ 0.709273f, 0.709340f, 0.709408f, 0.709476f, 0.709543f, 0.709611f, 0.709678f, 0.709746f,
+ 0.709813f, 0.709881f, 0.709948f, 0.710016f, 0.710083f, 0.710151f, 0.710218f, 0.710286f,
+ 0.710353f, 0.710421f, 0.710488f, 0.710556f, 0.710623f, 0.710691f, 0.710758f, 0.710826f,
+ 0.710893f, 0.710960f, 0.711028f, 0.711095f, 0.711163f, 0.711230f, 0.711297f, 0.711365f,
+ 0.711432f, 0.711500f, 0.711567f, 0.711634f, 0.711702f, 0.711769f, 0.711836f, 0.711904f,
+ 0.711971f, 0.712038f, 0.712106f, 0.712173f, 0.712240f, 0.712308f, 0.712375f, 0.712442f,
+ 0.712509f, 0.712577f, 0.712644f, 0.712711f, 0.712778f, 0.712846f, 0.712913f, 0.712980f,
+ 0.713047f, 0.713115f, 0.713182f, 0.713249f, 0.713316f, 0.713383f, 0.713451f, 0.713518f,
+ 0.713585f, 0.713652f, 0.713719f, 0.713786f, 0.713853f, 0.713921f, 0.713988f, 0.714055f,
+ 0.714122f, 0.714189f, 0.714256f, 0.714323f, 0.714390f, 0.714457f, 0.714525f, 0.714592f,
+ 0.714659f, 0.714726f, 0.714793f, 0.714860f, 0.714927f, 0.714994f, 0.715061f, 0.715128f,
+ 0.715195f, 0.715262f, 0.715329f, 0.715396f, 0.715463f, 0.715530f, 0.715597f, 0.715664f,
+ 0.715731f, 0.715798f, 0.715865f, 0.715932f, 0.715999f, 0.716066f, 0.716132f, 0.716199f,
+ 0.716266f, 0.716333f, 0.716400f, 0.716467f, 0.716534f, 0.716601f, 0.716668f, 0.716734f,
+ 0.716801f, 0.716868f, 0.716935f, 0.717002f, 0.717069f, 0.717135f, 0.717202f, 0.717269f,
+ 0.717336f, 0.717403f, 0.717469f, 0.717536f, 0.717603f, 0.717670f, 0.717737f, 0.717803f,
+ 0.717870f, 0.717937f, 0.718004f, 0.718070f, 0.718137f, 0.718204f, 0.718270f, 0.718337f,
+ 0.718404f, 0.718471f, 0.718537f, 0.718604f, 0.718670f, 0.718737f, 0.718804f, 0.718870f,
+ 0.718937f, 0.719004f, 0.719070f, 0.719137f, 0.719204f, 0.719270f, 0.719337f, 0.719403f,
+ 0.719470f, 0.719537f, 0.719603f, 0.719670f, 0.719736f, 0.719803f, 0.719869f, 0.719936f,
+ 0.720003f, 0.720069f, 0.720136f, 0.720202f, 0.720269f, 0.720335f, 0.720402f, 0.720468f,
+ 0.720535f, 0.720601f, 0.720668f, 0.720734f, 0.720800f, 0.720867f, 0.720933f, 0.721000f,
+ 0.721066f, 0.721133f, 0.721199f, 0.721265f, 0.721332f, 0.721398f, 0.721465f, 0.721531f,
+ 0.721597f, 0.721664f, 0.721730f, 0.721797f, 0.721863f, 0.721929f, 0.721996f, 0.722062f,
+ 0.722128f, 0.722194f, 0.722261f, 0.722327f, 0.722393f, 0.722460f, 0.722526f, 0.722592f,
+ 0.722659f, 0.722725f, 0.722791f, 0.722857f, 0.722924f, 0.722990f, 0.723056f, 0.723122f,
+ 0.723188f, 0.723255f, 0.723321f, 0.723387f, 0.723453f, 0.723520f, 0.723586f, 0.723652f,
+ 0.723718f, 0.723784f, 0.723850f, 0.723916f, 0.723983f, 0.724049f, 0.724115f, 0.724181f,
+ 0.724247f, 0.724313f, 0.724379f, 0.724445f, 0.724511f, 0.724578f, 0.724644f, 0.724710f,
+ 0.724776f, 0.724842f, 0.724908f, 0.724974f, 0.725040f, 0.725106f, 0.725172f, 0.725238f,
+ 0.725304f, 0.725370f, 0.725436f, 0.725502f, 0.725568f, 0.725634f, 0.725700f, 0.725766f,
+ 0.725832f, 0.725898f, 0.725964f, 0.726030f, 0.726095f, 0.726161f, 0.726227f, 0.726293f,
+ 0.726359f, 0.726425f, 0.726491f, 0.726557f, 0.726623f, 0.726689f, 0.726754f, 0.726820f,
+ 0.726886f, 0.726952f, 0.727018f, 0.727084f, 0.727149f, 0.727215f, 0.727281f, 0.727347f,
+ 0.727413f, 0.727478f, 0.727544f, 0.727610f, 0.727676f, 0.727741f, 0.727807f, 0.727873f,
+ 0.727939f, 0.728004f, 0.728070f, 0.728136f, 0.728202f, 0.728267f, 0.728333f, 0.728399f,
+ 0.728464f, 0.728530f, 0.728596f, 0.728661f, 0.728727f, 0.728793f, 0.728858f, 0.728924f,
+ 0.728990f, 0.729055f, 0.729121f, 0.729186f, 0.729252f, 0.729318f, 0.729383f, 0.729449f,
+ 0.729514f, 0.729580f, 0.729646f, 0.729711f, 0.729777f, 0.729842f, 0.729908f, 0.729973f,
+ 0.730039f, 0.730104f, 0.730170f, 0.730235f, 0.730301f, 0.730366f, 0.730432f, 0.730497f,
+ 0.730563f, 0.730628f, 0.730694f, 0.730759f, 0.730825f, 0.730890f, 0.730955f, 0.731021f,
+ 0.731086f, 0.731152f, 0.731217f, 0.731282f, 0.731348f, 0.731413f, 0.731479f, 0.731544f,
+ 0.731609f, 0.731675f, 0.731740f, 0.731805f, 0.731871f, 0.731936f, 0.732001f, 0.732067f,
+ 0.732132f, 0.732197f, 0.732263f, 0.732328f, 0.732393f, 0.732458f, 0.732524f, 0.732589f,
+ 0.732654f, 0.732720f, 0.732785f, 0.732850f, 0.732915f, 0.732980f, 0.733046f, 0.733111f,
+ 0.733176f, 0.733241f, 0.733306f, 0.733372f, 0.733437f, 0.733502f, 0.733567f, 0.733632f,
+ 0.733697f, 0.733763f, 0.733828f, 0.733893f, 0.733958f, 0.734023f, 0.734088f, 0.734153f,
+ 0.734218f, 0.734283f, 0.734349f, 0.734414f, 0.734479f, 0.734544f, 0.734609f, 0.734674f,
+ 0.734739f, 0.734804f, 0.734869f, 0.734934f, 0.734999f, 0.735064f, 0.735129f, 0.735194f,
+ 0.735259f, 0.735324f, 0.735389f, 0.735454f, 0.735519f, 0.735584f, 0.735649f, 0.735714f,
+ 0.735779f, 0.735844f, 0.735908f, 0.735973f, 0.736038f, 0.736103f, 0.736168f, 0.736233f,
+ 0.736298f, 0.736363f, 0.736428f, 0.736492f, 0.736557f, 0.736622f, 0.736687f, 0.736752f,
+ 0.736817f, 0.736881f, 0.736946f, 0.737011f, 0.737076f, 0.737141f, 0.737205f, 0.737270f,
+ 0.737335f, 0.737400f, 0.737464f, 0.737529f, 0.737594f, 0.737659f, 0.737723f, 0.737788f,
+ 0.737853f, 0.737918f, 0.737982f, 0.738047f, 0.738112f, 0.738176f, 0.738241f, 0.738306f,
+ 0.738370f, 0.738435f, 0.738500f, 0.738564f, 0.738629f, 0.738693f, 0.738758f, 0.738823f,
+ 0.738887f, 0.738952f, 0.739017f, 0.739081f, 0.739146f, 0.739210f, 0.739275f, 0.739339f,
+ 0.739404f, 0.739468f, 0.739533f, 0.739598f, 0.739662f, 0.739727f, 0.739791f, 0.739856f,
+ 0.739920f, 0.739985f, 0.740049f, 0.740114f, 0.740178f, 0.740242f, 0.740307f, 0.740371f,
+ 0.740436f, 0.740500f, 0.740565f, 0.740629f, 0.740694f, 0.740758f, 0.740822f, 0.740887f,
+ 0.740951f, 0.741015f, 0.741080f, 0.741144f, 0.741209f, 0.741273f, 0.741337f, 0.741402f,
+ 0.741466f, 0.741530f, 0.741595f, 0.741659f, 0.741723f, 0.741788f, 0.741852f, 0.741916f,
+ 0.741980f, 0.742045f, 0.742109f, 0.742173f, 0.742237f, 0.742302f, 0.742366f, 0.742430f,
+ 0.742494f, 0.742559f, 0.742623f, 0.742687f, 0.742751f, 0.742815f, 0.742880f, 0.742944f,
+ 0.743008f, 0.743072f, 0.743136f, 0.743200f, 0.743265f, 0.743329f, 0.743393f, 0.743457f,
+ 0.743521f, 0.743585f, 0.743649f, 0.743713f, 0.743777f, 0.743842f, 0.743906f, 0.743970f,
+ 0.744034f, 0.744098f, 0.744162f, 0.744226f, 0.744290f, 0.744354f, 0.744418f, 0.744482f,
+ 0.744546f, 0.744610f, 0.744674f, 0.744738f, 0.744802f, 0.744866f, 0.744930f, 0.744994f,
+ 0.745058f, 0.745122f, 0.745186f, 0.745250f, 0.745314f, 0.745377f, 0.745441f, 0.745505f,
+ 0.745569f, 0.745633f, 0.745697f, 0.745761f, 0.745825f, 0.745889f, 0.745952f, 0.746016f,
+ 0.746080f, 0.746144f, 0.746208f, 0.746272f, 0.746335f, 0.746399f, 0.746463f, 0.746527f,
+ 0.746591f, 0.746654f, 0.746718f, 0.746782f, 0.746846f, 0.746909f, 0.746973f, 0.747037f,
+ 0.747101f, 0.747164f, 0.747228f, 0.747292f, 0.747355f, 0.747419f, 0.747483f, 0.747547f,
+ 0.747610f, 0.747674f, 0.747738f, 0.747801f, 0.747865f, 0.747929f, 0.747992f, 0.748056f,
+ 0.748119f, 0.748183f, 0.748247f, 0.748310f, 0.748374f, 0.748437f, 0.748501f, 0.748565f,
+ 0.748628f, 0.748692f, 0.748755f, 0.748819f, 0.748882f, 0.748946f, 0.749009f, 0.749073f,
+ 0.749136f, 0.749200f, 0.749263f, 0.749327f, 0.749390f, 0.749454f, 0.749517f, 0.749581f,
+ 0.749644f, 0.749708f, 0.749771f, 0.749835f, 0.749898f, 0.749961f, 0.750025f, 0.750088f,
+ 0.750152f, 0.750215f, 0.750278f, 0.750342f, 0.750405f, 0.750469f, 0.750532f, 0.750595f,
+ 0.750659f, 0.750722f, 0.750785f, 0.750849f, 0.750912f, 0.750975f, 0.751039f, 0.751102f,
+ 0.751165f, 0.751228f, 0.751292f, 0.751355f, 0.751418f, 0.751481f, 0.751545f, 0.751608f,
+ 0.751671f, 0.751734f, 0.751798f, 0.751861f, 0.751924f, 0.751987f, 0.752050f, 0.752114f,
+ 0.752177f, 0.752240f, 0.752303f, 0.752366f, 0.752429f, 0.752493f, 0.752556f, 0.752619f,
+ 0.752682f, 0.752745f, 0.752808f, 0.752871f, 0.752934f, 0.752998f, 0.753061f, 0.753124f,
+ 0.753187f, 0.753250f, 0.753313f, 0.753376f, 0.753439f, 0.753502f, 0.753565f, 0.753628f,
+ 0.753691f, 0.753754f, 0.753817f, 0.753880f, 0.753943f, 0.754006f, 0.754069f, 0.754132f,
+ 0.754195f, 0.754258f, 0.754321f, 0.754384f, 0.754447f, 0.754510f, 0.754573f, 0.754636f,
+ 0.754698f, 0.754761f, 0.754824f, 0.754887f, 0.754950f, 0.755013f, 0.755076f, 0.755139f,
+ 0.755201f, 0.755264f, 0.755327f, 0.755390f, 0.755453f, 0.755516f, 0.755578f, 0.755641f,
+ 0.755704f, 0.755767f, 0.755829f, 0.755892f, 0.755955f, 0.756018f, 0.756081f, 0.756143f,
+ 0.756206f, 0.756269f, 0.756331f, 0.756394f, 0.756457f, 0.756520f, 0.756582f, 0.756645f,
+ 0.756708f, 0.756770f, 0.756833f, 0.756896f, 0.756958f, 0.757021f, 0.757084f, 0.757146f,
+ 0.757209f, 0.757271f, 0.757334f, 0.757397f, 0.757459f, 0.757522f, 0.757584f, 0.757647f,
+ 0.757710f, 0.757772f, 0.757835f, 0.757897f, 0.757960f, 0.758022f, 0.758085f, 0.758147f,
+ 0.758210f, 0.758272f, 0.758335f, 0.758397f, 0.758460f, 0.758522f, 0.758585f, 0.758647f,
+ 0.758710f, 0.758772f, 0.758835f, 0.758897f, 0.758960f, 0.759022f, 0.759084f, 0.759147f,
+ 0.759209f, 0.759272f, 0.759334f, 0.759396f, 0.759459f, 0.759521f, 0.759583f, 0.759646f,
+ 0.759708f, 0.759771f, 0.759833f, 0.759895f, 0.759957f, 0.760020f, 0.760082f, 0.760144f,
+ 0.760207f, 0.760269f, 0.760331f, 0.760394f, 0.760456f, 0.760518f, 0.760580f, 0.760643f,
+ 0.760705f, 0.760767f, 0.760829f, 0.760891f, 0.760954f, 0.761016f, 0.761078f, 0.761140f,
+ 0.761202f, 0.761265f, 0.761327f, 0.761389f, 0.761451f, 0.761513f, 0.761575f, 0.761637f,
+ 0.761700f, 0.761762f, 0.761824f, 0.761886f, 0.761948f, 0.762010f, 0.762072f, 0.762134f,
+ 0.762196f, 0.762258f, 0.762320f, 0.762382f, 0.762444f, 0.762507f, 0.762569f, 0.762631f,
+ 0.762693f, 0.762755f, 0.762817f, 0.762879f, 0.762941f, 0.763003f, 0.763065f, 0.763126f,
+ 0.763188f, 0.763250f, 0.763312f, 0.763374f, 0.763436f, 0.763498f, 0.763560f, 0.763622f,
+ 0.763684f, 0.763746f, 0.763808f, 0.763869f, 0.763931f, 0.763993f, 0.764055f, 0.764117f,
+ 0.764179f, 0.764241f, 0.764302f, 0.764364f, 0.764426f, 0.764488f, 0.764550f, 0.764611f,
+ 0.764673f, 0.764735f, 0.764797f, 0.764859f, 0.764920f, 0.764982f, 0.765044f, 0.765106f,
+ 0.765167f, 0.765229f, 0.765291f, 0.765352f, 0.765414f, 0.765476f, 0.765538f, 0.765599f,
+ 0.765661f, 0.765723f, 0.765784f, 0.765846f, 0.765907f, 0.765969f, 0.766031f, 0.766092f,
+ 0.766154f, 0.766216f, 0.766277f, 0.766339f, 0.766400f, 0.766462f, 0.766524f, 0.766585f,
+ 0.766647f, 0.766708f, 0.766770f, 0.766831f, 0.766893f, 0.766954f, 0.767016f, 0.767077f,
+ 0.767139f, 0.767200f, 0.767262f, 0.767323f, 0.767385f, 0.767446f, 0.767508f, 0.767569f,
+ 0.767631f, 0.767692f, 0.767754f, 0.767815f, 0.767876f, 0.767938f, 0.767999f, 0.768061f,
+ 0.768122f, 0.768183f, 0.768245f, 0.768306f, 0.768368f, 0.768429f, 0.768490f, 0.768552f,
+ 0.768613f, 0.768674f, 0.768736f, 0.768797f, 0.768858f, 0.768919f, 0.768981f, 0.769042f,
+ 0.769103f, 0.769165f, 0.769226f, 0.769287f, 0.769348f, 0.769410f, 0.769471f, 0.769532f,
+ 0.769593f, 0.769655f, 0.769716f, 0.769777f, 0.769838f, 0.769899f, 0.769961f, 0.770022f,
+ 0.770083f, 0.770144f, 0.770205f, 0.770266f, 0.770327f, 0.770389f, 0.770450f, 0.770511f,
+ 0.770572f, 0.770633f, 0.770694f, 0.770755f, 0.770816f, 0.770877f, 0.770938f, 0.770999f,
+ 0.771061f, 0.771122f, 0.771183f, 0.771244f, 0.771305f, 0.771366f, 0.771427f, 0.771488f,
+ 0.771549f, 0.771610f, 0.771671f, 0.771732f, 0.771793f, 0.771854f, 0.771915f, 0.771975f,
+ 0.772036f, 0.772097f, 0.772158f, 0.772219f, 0.772280f, 0.772341f, 0.772402f, 0.772463f,
+ 0.772524f, 0.772584f, 0.772645f, 0.772706f, 0.772767f, 0.772828f, 0.772889f, 0.772950f,
+ 0.773010f, 0.773071f, 0.773132f, 0.773193f, 0.773254f, 0.773314f, 0.773375f, 0.773436f,
+ 0.773497f, 0.773558f, 0.773618f, 0.773679f, 0.773740f, 0.773801f, 0.773861f, 0.773922f,
+ 0.773983f, 0.774043f, 0.774104f, 0.774165f, 0.774225f, 0.774286f, 0.774347f, 0.774407f,
+ 0.774468f, 0.774529f, 0.774589f, 0.774650f, 0.774711f, 0.774771f, 0.774832f, 0.774893f,
+ 0.774953f, 0.775014f, 0.775074f, 0.775135f, 0.775195f, 0.775256f, 0.775317f, 0.775377f,
+ 0.775438f, 0.775498f, 0.775559f, 0.775619f, 0.775680f, 0.775740f, 0.775801f, 0.775861f,
+ 0.775922f, 0.775982f, 0.776043f, 0.776103f, 0.776164f, 0.776224f, 0.776284f, 0.776345f,
+ 0.776405f, 0.776466f, 0.776526f, 0.776587f, 0.776647f, 0.776707f, 0.776768f, 0.776828f,
+ 0.776888f, 0.776949f, 0.777009f, 0.777070f, 0.777130f, 0.777190f, 0.777251f, 0.777311f,
+ 0.777371f, 0.777431f, 0.777492f, 0.777552f, 0.777612f, 0.777673f, 0.777733f, 0.777793f,
+ 0.777853f, 0.777914f, 0.777974f, 0.778034f, 0.778094f, 0.778155f, 0.778215f, 0.778275f,
+ 0.778335f, 0.778395f, 0.778456f, 0.778516f, 0.778576f, 0.778636f, 0.778696f, 0.778756f,
+ 0.778817f, 0.778877f, 0.778937f, 0.778997f, 0.779057f, 0.779117f, 0.779177f, 0.779237f,
+ 0.779297f, 0.779357f, 0.779418f, 0.779478f, 0.779538f, 0.779598f, 0.779658f, 0.779718f,
+ 0.779778f, 0.779838f, 0.779898f, 0.779958f, 0.780018f, 0.780078f, 0.780138f, 0.780198f,
+ 0.780258f, 0.780318f, 0.780378f, 0.780438f, 0.780498f, 0.780557f, 0.780617f, 0.780677f,
+ 0.780737f, 0.780797f, 0.780857f, 0.780917f, 0.780977f, 0.781037f, 0.781097f, 0.781156f,
+ 0.781216f, 0.781276f, 0.781336f, 0.781396f, 0.781456f, 0.781515f, 0.781575f, 0.781635f,
+ 0.781695f, 0.781755f, 0.781814f, 0.781874f, 0.781934f, 0.781994f, 0.782053f, 0.782113f,
+ 0.782173f, 0.782233f, 0.782292f, 0.782352f, 0.782412f, 0.782472f, 0.782531f, 0.782591f,
+ 0.782651f, 0.782710f, 0.782770f, 0.782830f, 0.782889f, 0.782949f, 0.783009f, 0.783068f,
+ 0.783128f, 0.783187f, 0.783247f, 0.783307f, 0.783366f, 0.783426f, 0.783485f, 0.783545f,
+ 0.783605f, 0.783664f, 0.783724f, 0.783783f, 0.783843f, 0.783902f, 0.783962f, 0.784021f,
+ 0.784081f, 0.784140f, 0.784200f, 0.784259f, 0.784319f, 0.784378f, 0.784438f, 0.784497f,
+ 0.784557f, 0.784616f, 0.784675f, 0.784735f, 0.784794f, 0.784854f, 0.784913f, 0.784973f,
+ 0.785032f, 0.785091f, 0.785151f, 0.785210f, 0.785269f, 0.785329f, 0.785388f, 0.785447f,
+ 0.785507f, 0.785566f, 0.785625f, 0.785685f, 0.785744f, 0.785803f, 0.785863f, 0.785922f,
+ 0.785981f, 0.786041f, 0.786100f, 0.786159f, 0.786218f, 0.786278f, 0.786337f, 0.786396f,
+ 0.786455f, 0.786514f, 0.786574f, 0.786633f, 0.786692f, 0.786751f, 0.786810f, 0.786870f,
+ 0.786929f, 0.786988f, 0.787047f, 0.787106f, 0.787165f, 0.787224f, 0.787284f, 0.787343f,
+ 0.787402f, 0.787461f, 0.787520f, 0.787579f, 0.787638f, 0.787697f, 0.787756f, 0.787815f,
+ 0.787874f, 0.787933f, 0.787992f, 0.788051f, 0.788110f, 0.788169f, 0.788228f, 0.788287f,
+ 0.788346f, 0.788405f, 0.788464f, 0.788523f, 0.788582f, 0.788641f, 0.788700f, 0.788759f,
+ 0.788818f, 0.788877f, 0.788936f, 0.788995f, 0.789054f, 0.789113f, 0.789172f, 0.789230f,
+ 0.789289f, 0.789348f, 0.789407f, 0.789466f, 0.789525f, 0.789584f, 0.789642f, 0.789701f,
+ 0.789760f, 0.789819f, 0.789878f, 0.789936f, 0.789995f, 0.790054f, 0.790113f, 0.790171f,
+ 0.790230f, 0.790289f, 0.790348f, 0.790406f, 0.790465f, 0.790524f, 0.790583f, 0.790641f,
+ 0.790700f, 0.790759f, 0.790817f, 0.790876f, 0.790935f, 0.790993f, 0.791052f, 0.791111f,
+ 0.791169f, 0.791228f, 0.791287f, 0.791345f, 0.791404f, 0.791462f, 0.791521f, 0.791580f,
+ 0.791638f, 0.791697f, 0.791755f, 0.791814f, 0.791872f, 0.791931f, 0.791990f, 0.792048f,
+ 0.792107f, 0.792165f, 0.792224f, 0.792282f, 0.792341f, 0.792399f, 0.792458f, 0.792516f,
+ 0.792575f, 0.792633f, 0.792691f, 0.792750f, 0.792808f, 0.792867f, 0.792925f, 0.792984f,
+ 0.793042f, 0.793100f, 0.793159f, 0.793217f, 0.793276f, 0.793334f, 0.793392f, 0.793451f,
+ 0.793509f, 0.793567f, 0.793626f, 0.793684f, 0.793742f, 0.793801f, 0.793859f, 0.793917f,
+ 0.793975f, 0.794034f, 0.794092f, 0.794150f, 0.794209f, 0.794267f, 0.794325f, 0.794383f,
+ 0.794442f, 0.794500f, 0.794558f, 0.794616f, 0.794674f, 0.794733f, 0.794791f, 0.794849f,
+ 0.794907f, 0.794965f, 0.795023f, 0.795082f, 0.795140f, 0.795198f, 0.795256f, 0.795314f,
+ 0.795372f, 0.795430f, 0.795488f, 0.795547f, 0.795605f, 0.795663f, 0.795721f, 0.795779f,
+ 0.795837f, 0.795895f, 0.795953f, 0.796011f, 0.796069f, 0.796127f, 0.796185f, 0.796243f,
+ 0.796301f, 0.796359f, 0.796417f, 0.796475f, 0.796533f, 0.796591f, 0.796649f, 0.796707f,
+ 0.796765f, 0.796823f, 0.796881f, 0.796939f, 0.796996f, 0.797054f, 0.797112f, 0.797170f,
+ 0.797228f, 0.797286f, 0.797344f, 0.797402f, 0.797459f, 0.797517f, 0.797575f, 0.797633f,
+ 0.797691f, 0.797749f, 0.797806f, 0.797864f, 0.797922f, 0.797980f, 0.798038f, 0.798095f,
+ 0.798153f, 0.798211f, 0.798269f, 0.798326f, 0.798384f, 0.798442f, 0.798500f, 0.798557f,
+ 0.798615f, 0.798673f, 0.798730f, 0.798788f, 0.798846f, 0.798903f, 0.798961f, 0.799019f,
+ 0.799076f, 0.799134f, 0.799192f, 0.799249f, 0.799307f, 0.799365f, 0.799422f, 0.799480f,
+ 0.799537f, 0.799595f, 0.799652f, 0.799710f, 0.799768f, 0.799825f, 0.799883f, 0.799940f,
+ 0.799998f, 0.800055f, 0.800113f, 0.800170f, 0.800228f, 0.800285f, 0.800343f, 0.800400f,
+ 0.800458f, 0.800515f, 0.800573f, 0.800630f, 0.800687f, 0.800745f, 0.800802f, 0.800860f,
+ 0.800917f, 0.800975f, 0.801032f, 0.801089f, 0.801147f, 0.801204f, 0.801261f, 0.801319f,
+ 0.801376f, 0.801434f, 0.801491f, 0.801548f, 0.801606f, 0.801663f, 0.801720f, 0.801777f,
+ 0.801835f, 0.801892f, 0.801949f, 0.802007f, 0.802064f, 0.802121f, 0.802178f, 0.802236f,
+ 0.802293f, 0.802350f, 0.802407f, 0.802464f, 0.802522f, 0.802579f, 0.802636f, 0.802693f,
+ 0.802750f, 0.802808f, 0.802865f, 0.802922f, 0.802979f, 0.803036f, 0.803093f, 0.803150f,
+ 0.803208f, 0.803265f, 0.803322f, 0.803379f, 0.803436f, 0.803493f, 0.803550f, 0.803607f,
+ 0.803664f, 0.803721f, 0.803778f, 0.803835f, 0.803892f, 0.803949f, 0.804006f, 0.804063f,
+ 0.804120f, 0.804177f, 0.804234f, 0.804291f, 0.804348f, 0.804405f, 0.804462f, 0.804519f,
+ 0.804576f, 0.804633f, 0.804690f, 0.804747f, 0.804804f, 0.804861f, 0.804918f, 0.804974f,
+ 0.805031f, 0.805088f, 0.805145f, 0.805202f, 0.805259f, 0.805316f, 0.805372f, 0.805429f,
+ 0.805486f, 0.805543f, 0.805600f, 0.805656f, 0.805713f, 0.805770f, 0.805827f, 0.805884f,
+ 0.805940f, 0.805997f, 0.806054f, 0.806111f, 0.806167f, 0.806224f, 0.806281f, 0.806338f,
+ 0.806394f, 0.806451f, 0.806508f, 0.806564f, 0.806621f, 0.806678f, 0.806734f, 0.806791f,
+ 0.806848f, 0.806904f, 0.806961f, 0.807017f, 0.807074f, 0.807131f, 0.807187f, 0.807244f,
+ 0.807300f, 0.807357f, 0.807414f, 0.807470f, 0.807527f, 0.807583f, 0.807640f, 0.807696f,
+ 0.807753f, 0.807809f, 0.807866f, 0.807922f, 0.807979f, 0.808035f, 0.808092f, 0.808148f,
+ 0.808205f, 0.808261f, 0.808318f, 0.808374f, 0.808430f, 0.808487f, 0.808543f, 0.808600f,
+ 0.808656f, 0.808713f, 0.808769f, 0.808825f, 0.808882f, 0.808938f, 0.808994f, 0.809051f,
+ 0.809107f, 0.809164f, 0.809220f, 0.809276f, 0.809332f, 0.809389f, 0.809445f, 0.809501f,
+ 0.809558f, 0.809614f, 0.809670f, 0.809726f, 0.809783f, 0.809839f, 0.809895f, 0.809951f,
+ 0.810008f, 0.810064f, 0.810120f, 0.810176f, 0.810232f, 0.810289f, 0.810345f, 0.810401f,
+ 0.810457f, 0.810513f, 0.810570f, 0.810626f, 0.810682f, 0.810738f, 0.810794f, 0.810850f,
+ 0.810906f, 0.810962f, 0.811018f, 0.811075f, 0.811131f, 0.811187f, 0.811243f, 0.811299f,
+ 0.811355f, 0.811411f, 0.811467f, 0.811523f, 0.811579f, 0.811635f, 0.811691f, 0.811747f,
+ 0.811803f, 0.811859f, 0.811915f, 0.811971f, 0.812027f, 0.812083f, 0.812139f, 0.812195f,
+ 0.812251f, 0.812307f, 0.812362f, 0.812418f, 0.812474f, 0.812530f, 0.812586f, 0.812642f,
+ 0.812698f, 0.812754f, 0.812809f, 0.812865f, 0.812921f, 0.812977f, 0.813033f, 0.813089f,
+ 0.813144f, 0.813200f, 0.813256f, 0.813312f, 0.813368f, 0.813423f, 0.813479f, 0.813535f,
+ 0.813591f, 0.813646f, 0.813702f, 0.813758f, 0.813814f, 0.813869f, 0.813925f, 0.813981f,
+ 0.814036f, 0.814092f, 0.814148f, 0.814203f, 0.814259f, 0.814315f, 0.814370f, 0.814426f,
+ 0.814482f, 0.814537f, 0.814593f, 0.814648f, 0.814704f, 0.814760f, 0.814815f, 0.814871f,
+ 0.814926f, 0.814982f, 0.815037f, 0.815093f, 0.815149f, 0.815204f, 0.815260f, 0.815315f,
+ 0.815371f, 0.815426f, 0.815482f, 0.815537f, 0.815593f, 0.815648f, 0.815704f, 0.815759f,
+ 0.815814f, 0.815870f, 0.815925f, 0.815981f, 0.816036f, 0.816092f, 0.816147f, 0.816202f,
+ 0.816258f, 0.816313f, 0.816368f, 0.816424f, 0.816479f, 0.816535f, 0.816590f, 0.816645f,
+ 0.816701f, 0.816756f, 0.816811f, 0.816867f, 0.816922f, 0.816977f, 0.817032f, 0.817088f,
+ 0.817143f, 0.817198f, 0.817253f, 0.817309f, 0.817364f, 0.817419f, 0.817474f, 0.817530f,
+ 0.817585f, 0.817640f, 0.817695f, 0.817750f, 0.817806f, 0.817861f, 0.817916f, 0.817971f,
+ 0.818026f, 0.818081f, 0.818137f, 0.818192f, 0.818247f, 0.818302f, 0.818357f, 0.818412f,
+ 0.818467f, 0.818522f, 0.818577f, 0.818632f, 0.818687f, 0.818742f, 0.818798f, 0.818853f,
+ 0.818908f, 0.818963f, 0.819018f, 0.819073f, 0.819128f, 0.819183f, 0.819238f, 0.819293f,
+ 0.819348f, 0.819402f, 0.819457f, 0.819512f, 0.819567f, 0.819622f, 0.819677f, 0.819732f,
+ 0.819787f, 0.819842f, 0.819897f, 0.819952f, 0.820007f, 0.820061f, 0.820116f, 0.820171f,
+ 0.820226f, 0.820281f, 0.820336f, 0.820390f, 0.820445f, 0.820500f, 0.820555f, 0.820610f,
+ 0.820664f, 0.820719f, 0.820774f, 0.820829f, 0.820884f, 0.820938f, 0.820993f, 0.821048f,
+ 0.821102f, 0.821157f, 0.821212f, 0.821267f, 0.821321f, 0.821376f, 0.821431f, 0.821485f,
+ 0.821540f, 0.821595f, 0.821649f, 0.821704f, 0.821759f, 0.821813f, 0.821868f, 0.821922f,
+ 0.821977f, 0.822032f, 0.822086f, 0.822141f, 0.822195f, 0.822250f, 0.822305f, 0.822359f,
+ 0.822414f, 0.822468f, 0.822523f, 0.822577f, 0.822632f, 0.822686f, 0.822741f, 0.822795f,
+ 0.822850f, 0.822904f, 0.822959f, 0.823013f, 0.823068f, 0.823122f, 0.823177f, 0.823231f,
+ 0.823285f, 0.823340f, 0.823394f, 0.823449f, 0.823503f, 0.823557f, 0.823612f, 0.823666f,
+ 0.823721f, 0.823775f, 0.823829f, 0.823884f, 0.823938f, 0.823992f, 0.824047f, 0.824101f,
+ 0.824155f, 0.824209f, 0.824264f, 0.824318f, 0.824372f, 0.824427f, 0.824481f, 0.824535f,
+ 0.824589f, 0.824644f, 0.824698f, 0.824752f, 0.824806f, 0.824860f, 0.824915f, 0.824969f,
+ 0.825023f, 0.825077f, 0.825131f, 0.825185f, 0.825240f, 0.825294f, 0.825348f, 0.825402f,
+ 0.825456f, 0.825510f, 0.825564f, 0.825618f, 0.825673f, 0.825727f, 0.825781f, 0.825835f,
+ 0.825889f, 0.825943f, 0.825997f, 0.826051f, 0.826105f, 0.826159f, 0.826213f, 0.826267f,
+ 0.826321f, 0.826375f, 0.826429f, 0.826483f, 0.826537f, 0.826591f, 0.826645f, 0.826699f,
+ 0.826753f, 0.826807f, 0.826861f, 0.826915f, 0.826968f, 0.827022f, 0.827076f, 0.827130f,
+ 0.827184f, 0.827238f, 0.827292f, 0.827346f, 0.827399f, 0.827453f, 0.827507f, 0.827561f,
+ 0.827615f, 0.827669f, 0.827722f, 0.827776f, 0.827830f, 0.827884f, 0.827938f, 0.827991f,
+ 0.828045f, 0.828099f, 0.828153f, 0.828206f, 0.828260f, 0.828314f, 0.828367f, 0.828421f,
+ 0.828475f, 0.828529f, 0.828582f, 0.828636f, 0.828690f, 0.828743f, 0.828797f, 0.828851f,
+ 0.828904f, 0.828958f, 0.829011f, 0.829065f, 0.829119f, 0.829172f, 0.829226f, 0.829279f,
+ 0.829333f, 0.829386f, 0.829440f, 0.829494f, 0.829547f, 0.829601f, 0.829654f, 0.829708f,
+ 0.829761f, 0.829815f, 0.829868f, 0.829922f, 0.829975f, 0.830029f, 0.830082f, 0.830136f,
+ 0.830189f, 0.830243f, 0.830296f, 0.830349f, 0.830403f, 0.830456f, 0.830510f, 0.830563f,
+ 0.830616f, 0.830670f, 0.830723f, 0.830777f, 0.830830f, 0.830883f, 0.830937f, 0.830990f,
+ 0.831043f, 0.831097f, 0.831150f, 0.831203f, 0.831257f, 0.831310f, 0.831363f, 0.831416f,
+ 0.831470f, 0.831523f, 0.831576f, 0.831629f, 0.831683f, 0.831736f, 0.831789f, 0.831842f,
+ 0.831895f, 0.831949f, 0.832002f, 0.832055f, 0.832108f, 0.832161f, 0.832215f, 0.832268f,
+ 0.832321f, 0.832374f, 0.832427f, 0.832480f, 0.832533f, 0.832586f, 0.832640f, 0.832693f,
+ 0.832746f, 0.832799f, 0.832852f, 0.832905f, 0.832958f, 0.833011f, 0.833064f, 0.833117f,
+ 0.833170f, 0.833223f, 0.833276f, 0.833329f, 0.833382f, 0.833435f, 0.833488f, 0.833541f,
+ 0.833594f, 0.833647f, 0.833700f, 0.833753f, 0.833806f, 0.833859f, 0.833912f, 0.833965f,
+ 0.834018f, 0.834070f, 0.834123f, 0.834176f, 0.834229f, 0.834282f, 0.834335f, 0.834388f,
+ 0.834440f, 0.834493f, 0.834546f, 0.834599f, 0.834652f, 0.834705f, 0.834757f, 0.834810f,
+ 0.834863f, 0.834916f, 0.834968f, 0.835021f, 0.835074f, 0.835127f, 0.835179f, 0.835232f,
+ 0.835285f, 0.835338f, 0.835390f, 0.835443f, 0.835496f, 0.835548f, 0.835601f, 0.835654f,
+ 0.835706f, 0.835759f, 0.835812f, 0.835864f, 0.835917f, 0.835969f, 0.836022f, 0.836075f,
+ 0.836127f, 0.836180f, 0.836232f, 0.836285f, 0.836338f, 0.836390f, 0.836443f, 0.836495f,
+ 0.836548f, 0.836600f, 0.836653f, 0.836705f, 0.836758f, 0.836810f, 0.836863f, 0.836915f,
+ 0.836968f, 0.837020f, 0.837073f, 0.837125f, 0.837178f, 0.837230f, 0.837282f, 0.837335f,
+ 0.837387f, 0.837440f, 0.837492f, 0.837544f, 0.837597f, 0.837649f, 0.837701f, 0.837754f,
+ 0.837806f, 0.837859f, 0.837911f, 0.837963f, 0.838015f, 0.838068f, 0.838120f, 0.838172f,
+ 0.838225f, 0.838277f, 0.838329f, 0.838382f, 0.838434f, 0.838486f, 0.838538f, 0.838591f,
+ 0.838643f, 0.838695f, 0.838747f, 0.838799f, 0.838852f, 0.838904f, 0.838956f, 0.839008f,
+ 0.839060f, 0.839112f, 0.839165f, 0.839217f, 0.839269f, 0.839321f, 0.839373f, 0.839425f,
+ 0.839477f, 0.839529f, 0.839581f, 0.839634f, 0.839686f, 0.839738f, 0.839790f, 0.839842f,
+ 0.839894f, 0.839946f, 0.839998f, 0.840050f, 0.840102f, 0.840154f, 0.840206f, 0.840258f,
+ 0.840310f, 0.840362f, 0.840414f, 0.840466f, 0.840518f, 0.840570f, 0.840622f, 0.840673f,
+ 0.840725f, 0.840777f, 0.840829f, 0.840881f, 0.840933f, 0.840985f, 0.841037f, 0.841089f,
+ 0.841140f, 0.841192f, 0.841244f, 0.841296f, 0.841348f, 0.841400f, 0.841451f, 0.841503f,
+ 0.841555f, 0.841607f, 0.841659f, 0.841710f, 0.841762f, 0.841814f, 0.841866f, 0.841917f,
+ 0.841969f, 0.842021f, 0.842072f, 0.842124f, 0.842176f, 0.842228f, 0.842279f, 0.842331f,
+ 0.842383f, 0.842434f, 0.842486f, 0.842538f, 0.842589f, 0.842641f, 0.842692f, 0.842744f,
+ 0.842796f, 0.842847f, 0.842899f, 0.842950f, 0.843002f, 0.843054f, 0.843105f, 0.843157f,
+ 0.843208f, 0.843260f, 0.843311f, 0.843363f, 0.843414f, 0.843466f, 0.843517f, 0.843569f,
+ 0.843620f, 0.843672f, 0.843723f, 0.843775f, 0.843826f, 0.843878f, 0.843929f, 0.843980f,
+ 0.844032f, 0.844083f, 0.844135f, 0.844186f, 0.844238f, 0.844289f, 0.844340f, 0.844392f,
+ 0.844443f, 0.844494f, 0.844546f, 0.844597f, 0.844648f, 0.844700f, 0.844751f, 0.844802f,
+ 0.844854f, 0.844905f, 0.844956f, 0.845007f, 0.845059f, 0.845110f, 0.845161f, 0.845212f,
+ 0.845264f, 0.845315f, 0.845366f, 0.845417f, 0.845469f, 0.845520f, 0.845571f, 0.845622f,
+ 0.845673f, 0.845724f, 0.845776f, 0.845827f, 0.845878f, 0.845929f, 0.845980f, 0.846031f,
+ 0.846082f, 0.846133f, 0.846185f, 0.846236f, 0.846287f, 0.846338f, 0.846389f, 0.846440f,
+ 0.846491f, 0.846542f, 0.846593f, 0.846644f, 0.846695f, 0.846746f, 0.846797f, 0.846848f,
+ 0.846899f, 0.846950f, 0.847001f, 0.847052f, 0.847103f, 0.847154f, 0.847205f, 0.847256f,
+ 0.847307f, 0.847358f, 0.847408f, 0.847459f, 0.847510f, 0.847561f, 0.847612f, 0.847663f,
+ 0.847714f, 0.847765f, 0.847815f, 0.847866f, 0.847917f, 0.847968f, 0.848019f, 0.848070f,
+ 0.848120f, 0.848171f, 0.848222f, 0.848273f, 0.848323f, 0.848374f, 0.848425f, 0.848476f,
+ 0.848526f, 0.848577f, 0.848628f, 0.848679f, 0.848729f, 0.848780f, 0.848831f, 0.848881f,
+ 0.848932f, 0.848983f, 0.849033f, 0.849084f, 0.849135f, 0.849185f, 0.849236f, 0.849287f,
+ 0.849337f, 0.849388f, 0.849438f, 0.849489f, 0.849540f, 0.849590f, 0.849641f, 0.849691f,
+ 0.849742f, 0.849792f, 0.849843f, 0.849893f, 0.849944f, 0.849994f, 0.850045f, 0.850095f,
+ 0.850146f, 0.850196f, 0.850247f, 0.850297f, 0.850348f, 0.850398f, 0.850449f, 0.850499f,
+ 0.850549f, 0.850600f, 0.850650f, 0.850701f, 0.850751f, 0.850801f, 0.850852f, 0.850902f,
+ 0.850953f, 0.851003f, 0.851053f, 0.851104f, 0.851154f, 0.851204f, 0.851255f, 0.851305f,
+ 0.851355f, 0.851406f, 0.851456f, 0.851506f, 0.851556f, 0.851607f, 0.851657f, 0.851707f,
+ 0.851757f, 0.851808f, 0.851858f, 0.851908f, 0.851958f, 0.852008f, 0.852059f, 0.852109f,
+ 0.852159f, 0.852209f, 0.852259f, 0.852309f, 0.852360f, 0.852410f, 0.852460f, 0.852510f,
+ 0.852560f, 0.852610f, 0.852660f, 0.852710f, 0.852760f, 0.852810f, 0.852861f, 0.852911f,
+ 0.852961f, 0.853011f, 0.853061f, 0.853111f, 0.853161f, 0.853211f, 0.853261f, 0.853311f,
+ 0.853361f, 0.853411f, 0.853461f, 0.853511f, 0.853561f, 0.853611f, 0.853660f, 0.853710f,
+ 0.853760f, 0.853810f, 0.853860f, 0.853910f, 0.853960f, 0.854010f, 0.854060f, 0.854110f,
+ 0.854159f, 0.854209f, 0.854259f, 0.854309f, 0.854359f, 0.854409f, 0.854458f, 0.854508f,
+ 0.854558f, 0.854608f, 0.854658f, 0.854707f, 0.854757f, 0.854807f, 0.854857f, 0.854906f,
+ 0.854956f, 0.855006f, 0.855056f, 0.855105f, 0.855155f, 0.855205f, 0.855254f, 0.855304f,
+ 0.855354f, 0.855403f, 0.855453f, 0.855503f, 0.855552f, 0.855602f, 0.855651f, 0.855701f,
+ 0.855751f, 0.855800f, 0.855850f, 0.855900f, 0.855949f, 0.855999f, 0.856048f, 0.856098f,
+ 0.856147f, 0.856197f, 0.856246f, 0.856296f, 0.856345f, 0.856395f, 0.856444f, 0.856494f,
+ 0.856543f, 0.856593f, 0.856642f, 0.856692f, 0.856741f, 0.856791f, 0.856840f, 0.856890f,
+ 0.856939f, 0.856988f, 0.857038f, 0.857087f, 0.857137f, 0.857186f, 0.857235f, 0.857285f,
+ 0.857334f, 0.857383f, 0.857433f, 0.857482f, 0.857531f, 0.857581f, 0.857630f, 0.857679f,
+ 0.857729f, 0.857778f, 0.857827f, 0.857876f, 0.857926f, 0.857975f, 0.858024f, 0.858073f,
+ 0.858123f, 0.858172f, 0.858221f, 0.858270f, 0.858320f, 0.858369f, 0.858418f, 0.858467f,
+ 0.858516f, 0.858565f, 0.858615f, 0.858664f, 0.858713f, 0.858762f, 0.858811f, 0.858860f,
+ 0.858909f, 0.858958f, 0.859007f, 0.859057f, 0.859106f, 0.859155f, 0.859204f, 0.859253f,
+ 0.859302f, 0.859351f, 0.859400f, 0.859449f, 0.859498f, 0.859547f, 0.859596f, 0.859645f,
+ 0.859694f, 0.859743f, 0.859792f, 0.859841f, 0.859890f, 0.859939f, 0.859988f, 0.860036f,
+ 0.860085f, 0.860134f, 0.860183f, 0.860232f, 0.860281f, 0.860330f, 0.860379f, 0.860428f,
+ 0.860476f, 0.860525f, 0.860574f, 0.860623f, 0.860672f, 0.860721f, 0.860769f, 0.860818f,
+ 0.860867f, 0.860916f, 0.860964f, 0.861013f, 0.861062f, 0.861111f, 0.861160f, 0.861208f,
+ 0.861257f, 0.861306f, 0.861354f, 0.861403f, 0.861452f, 0.861500f, 0.861549f, 0.861598f,
+ 0.861646f, 0.861695f, 0.861744f, 0.861792f, 0.861841f, 0.861890f, 0.861938f, 0.861987f,
+ 0.862035f, 0.862084f, 0.862133f, 0.862181f, 0.862230f, 0.862278f, 0.862327f, 0.862375f,
+ 0.862424f, 0.862472f, 0.862521f, 0.862570f, 0.862618f, 0.862666f, 0.862715f, 0.862763f,
+ 0.862812f, 0.862860f, 0.862909f, 0.862957f, 0.863006f, 0.863054f, 0.863103f, 0.863151f,
+ 0.863199f, 0.863248f, 0.863296f, 0.863345f, 0.863393f, 0.863441f, 0.863490f, 0.863538f,
+ 0.863586f, 0.863635f, 0.863683f, 0.863731f, 0.863780f, 0.863828f, 0.863876f, 0.863925f,
+ 0.863973f, 0.864021f, 0.864069f, 0.864118f, 0.864166f, 0.864214f, 0.864262f, 0.864311f,
+ 0.864359f, 0.864407f, 0.864455f, 0.864503f, 0.864552f, 0.864600f, 0.864648f, 0.864696f,
+ 0.864744f, 0.864792f, 0.864841f, 0.864889f, 0.864937f, 0.864985f, 0.865033f, 0.865081f,
+ 0.865129f, 0.865177f, 0.865225f, 0.865273f, 0.865321f, 0.865369f, 0.865418f, 0.865466f,
+ 0.865514f, 0.865562f, 0.865610f, 0.865658f, 0.865706f, 0.865754f, 0.865802f, 0.865850f,
+ 0.865898f, 0.865946f, 0.865993f, 0.866041f, 0.866089f, 0.866137f, 0.866185f, 0.866233f,
+ 0.866281f, 0.866329f, 0.866377f, 0.866425f, 0.866472f, 0.866520f, 0.866568f, 0.866616f,
+ 0.866664f, 0.866712f, 0.866759f, 0.866807f, 0.866855f, 0.866903f, 0.866951f, 0.866998f,
+ 0.867046f, 0.867094f, 0.867142f, 0.867190f, 0.867237f, 0.867285f, 0.867333f, 0.867380f,
+ 0.867428f, 0.867476f, 0.867523f, 0.867571f, 0.867619f, 0.867667f, 0.867714f, 0.867762f,
+ 0.867809f, 0.867857f, 0.867905f, 0.867952f, 0.868000f, 0.868048f, 0.868095f, 0.868143f,
+ 0.868190f, 0.868238f, 0.868285f, 0.868333f, 0.868381f, 0.868428f, 0.868476f, 0.868523f,
+ 0.868571f, 0.868618f, 0.868666f, 0.868713f, 0.868761f, 0.868808f, 0.868856f, 0.868903f,
+ 0.868951f, 0.868998f, 0.869045f, 0.869093f, 0.869140f, 0.869188f, 0.869235f, 0.869282f,
+ 0.869330f, 0.869377f, 0.869425f, 0.869472f, 0.869519f, 0.869567f, 0.869614f, 0.869661f,
+ 0.869709f, 0.869756f, 0.869803f, 0.869851f, 0.869898f, 0.869945f, 0.869992f, 0.870040f,
+ 0.870087f, 0.870134f, 0.870182f, 0.870229f, 0.870276f, 0.870323f, 0.870370f, 0.870418f,
+ 0.870465f, 0.870512f, 0.870559f, 0.870606f, 0.870654f, 0.870701f, 0.870748f, 0.870795f,
+ 0.870842f, 0.870889f, 0.870936f, 0.870983f, 0.871031f, 0.871078f, 0.871125f, 0.871172f,
+ 0.871219f, 0.871266f, 0.871313f, 0.871360f, 0.871407f, 0.871454f, 0.871501f, 0.871548f,
+ 0.871595f, 0.871642f, 0.871689f, 0.871736f, 0.871783f, 0.871830f, 0.871877f, 0.871924f,
+ 0.871971f, 0.872018f, 0.872065f, 0.872112f, 0.872159f, 0.872205f, 0.872252f, 0.872299f,
+ 0.872346f, 0.872393f, 0.872440f, 0.872487f, 0.872534f, 0.872580f, 0.872627f, 0.872674f,
+ 0.872721f, 0.872768f, 0.872814f, 0.872861f, 0.872908f, 0.872955f, 0.873001f, 0.873048f,
+ 0.873095f, 0.873142f, 0.873188f, 0.873235f, 0.873282f, 0.873329f, 0.873375f, 0.873422f,
+ 0.873469f, 0.873515f, 0.873562f, 0.873609f, 0.873655f, 0.873702f, 0.873749f, 0.873795f,
+ 0.873842f, 0.873888f, 0.873935f, 0.873982f, 0.874028f, 0.874075f, 0.874121f, 0.874168f,
+ 0.874215f, 0.874261f, 0.874308f, 0.874354f, 0.874401f, 0.874447f, 0.874494f, 0.874540f,
+ 0.874587f, 0.874633f, 0.874680f, 0.874726f, 0.874773f, 0.874819f, 0.874865f, 0.874912f,
+ 0.874958f, 0.875005f, 0.875051f, 0.875098f, 0.875144f, 0.875190f, 0.875237f, 0.875283f,
+ 0.875329f, 0.875376f, 0.875422f, 0.875468f, 0.875515f, 0.875561f, 0.875607f, 0.875654f,
+ 0.875700f, 0.875746f, 0.875793f, 0.875839f, 0.875885f, 0.875931f, 0.875978f, 0.876024f,
+ 0.876070f, 0.876116f, 0.876163f, 0.876209f, 0.876255f, 0.876301f, 0.876347f, 0.876393f,
+ 0.876440f, 0.876486f, 0.876532f, 0.876578f, 0.876624f, 0.876670f, 0.876716f, 0.876763f,
+ 0.876809f, 0.876855f, 0.876901f, 0.876947f, 0.876993f, 0.877039f, 0.877085f, 0.877131f,
+ 0.877177f, 0.877223f, 0.877269f, 0.877315f, 0.877361f, 0.877407f, 0.877453f, 0.877499f,
+ 0.877545f, 0.877591f, 0.877637f, 0.877683f, 0.877729f, 0.877775f, 0.877821f, 0.877867f,
+ 0.877913f, 0.877959f, 0.878005f, 0.878051f, 0.878096f, 0.878142f, 0.878188f, 0.878234f,
+ 0.878280f, 0.878326f, 0.878371f, 0.878417f, 0.878463f, 0.878509f, 0.878555f, 0.878600f,
+ 0.878646f, 0.878692f, 0.878738f, 0.878784f, 0.878829f, 0.878875f, 0.878921f, 0.878967f,
+ 0.879012f, 0.879058f, 0.879104f, 0.879149f, 0.879195f, 0.879241f, 0.879286f, 0.879332f,
+ 0.879378f, 0.879423f, 0.879469f, 0.879515f, 0.879560f, 0.879606f, 0.879651f, 0.879697f,
+ 0.879743f, 0.879788f, 0.879834f, 0.879879f, 0.879925f, 0.879970f, 0.880016f, 0.880061f,
+ 0.880107f, 0.880153f, 0.880198f, 0.880244f, 0.880289f, 0.880334f, 0.880380f, 0.880425f,
+ 0.880471f, 0.880516f, 0.880562f, 0.880607f, 0.880653f, 0.880698f, 0.880743f, 0.880789f,
+ 0.880834f, 0.880880f, 0.880925f, 0.880970f, 0.881016f, 0.881061f, 0.881106f, 0.881152f,
+ 0.881197f, 0.881242f, 0.881288f, 0.881333f, 0.881378f, 0.881424f, 0.881469f, 0.881514f,
+ 0.881559f, 0.881605f, 0.881650f, 0.881695f, 0.881740f, 0.881786f, 0.881831f, 0.881876f,
+ 0.881921f, 0.881966f, 0.882012f, 0.882057f, 0.882102f, 0.882147f, 0.882192f, 0.882237f,
+ 0.882283f, 0.882328f, 0.882373f, 0.882418f, 0.882463f, 0.882508f, 0.882553f, 0.882598f,
+ 0.882643f, 0.882688f, 0.882733f, 0.882779f, 0.882824f, 0.882869f, 0.882914f, 0.882959f,
+ 0.883004f, 0.883049f, 0.883094f, 0.883139f, 0.883184f, 0.883228f, 0.883273f, 0.883318f,
+ 0.883363f, 0.883408f, 0.883453f, 0.883498f, 0.883543f, 0.883588f, 0.883633f, 0.883678f,
+ 0.883723f, 0.883767f, 0.883812f, 0.883857f, 0.883902f, 0.883947f, 0.883992f, 0.884036f,
+ 0.884081f, 0.884126f, 0.884171f, 0.884216f, 0.884260f, 0.884305f, 0.884350f, 0.884395f,
+ 0.884439f, 0.884484f, 0.884529f, 0.884574f, 0.884618f, 0.884663f, 0.884708f, 0.884752f,
+ 0.884797f, 0.884842f, 0.884886f, 0.884931f, 0.884976f, 0.885020f, 0.885065f, 0.885110f,
+ 0.885154f, 0.885199f, 0.885243f, 0.885288f, 0.885333f, 0.885377f, 0.885422f, 0.885466f,
+ 0.885511f, 0.885555f, 0.885600f, 0.885644f, 0.885689f, 0.885733f, 0.885778f, 0.885822f,
+ 0.885867f, 0.885911f, 0.885956f, 0.886000f, 0.886045f, 0.886089f, 0.886134f, 0.886178f,
+ 0.886223f, 0.886267f, 0.886311f, 0.886356f, 0.886400f, 0.886445f, 0.886489f, 0.886533f,
+ 0.886578f, 0.886622f, 0.886666f, 0.886711f, 0.886755f, 0.886799f, 0.886844f, 0.886888f,
+ 0.886932f, 0.886976f, 0.887021f, 0.887065f, 0.887109f, 0.887153f, 0.887198f, 0.887242f,
+ 0.887286f, 0.887330f, 0.887375f, 0.887419f, 0.887463f, 0.887507f, 0.887551f, 0.887595f,
+ 0.887640f, 0.887684f, 0.887728f, 0.887772f, 0.887816f, 0.887860f, 0.887904f, 0.887949f,
+ 0.887993f, 0.888037f, 0.888081f, 0.888125f, 0.888169f, 0.888213f, 0.888257f, 0.888301f,
+ 0.888345f, 0.888389f, 0.888433f, 0.888477f, 0.888521f, 0.888565f, 0.888609f, 0.888653f,
+ 0.888697f, 0.888741f, 0.888785f, 0.888829f, 0.888873f, 0.888917f, 0.888961f, 0.889004f,
+ 0.889048f, 0.889092f, 0.889136f, 0.889180f, 0.889224f, 0.889268f, 0.889312f, 0.889355f,
+ 0.889399f, 0.889443f, 0.889487f, 0.889531f, 0.889574f, 0.889618f, 0.889662f, 0.889706f,
+ 0.889750f, 0.889793f, 0.889837f, 0.889881f, 0.889925f, 0.889968f, 0.890012f, 0.890056f,
+ 0.890099f, 0.890143f, 0.890187f, 0.890230f, 0.890274f, 0.890318f, 0.890361f, 0.890405f,
+ 0.890449f, 0.890492f, 0.890536f, 0.890580f, 0.890623f, 0.890667f, 0.890710f, 0.890754f,
+ 0.890797f, 0.890841f, 0.890885f, 0.890928f, 0.890972f, 0.891015f, 0.891059f, 0.891102f,
+ 0.891146f, 0.891189f, 0.891233f, 0.891276f, 0.891320f, 0.891363f, 0.891407f, 0.891450f,
+ 0.891493f, 0.891537f, 0.891580f, 0.891624f, 0.891667f, 0.891711f, 0.891754f, 0.891797f,
+ 0.891841f, 0.891884f, 0.891927f, 0.891971f, 0.892014f, 0.892057f, 0.892101f, 0.892144f,
+ 0.892187f, 0.892231f, 0.892274f, 0.892317f, 0.892361f, 0.892404f, 0.892447f, 0.892490f,
+ 0.892534f, 0.892577f, 0.892620f, 0.892663f, 0.892706f, 0.892750f, 0.892793f, 0.892836f,
+ 0.892879f, 0.892922f, 0.892965f, 0.893009f, 0.893052f, 0.893095f, 0.893138f, 0.893181f,
+ 0.893224f, 0.893267f, 0.893310f, 0.893354f, 0.893397f, 0.893440f, 0.893483f, 0.893526f,
+ 0.893569f, 0.893612f, 0.893655f, 0.893698f, 0.893741f, 0.893784f, 0.893827f, 0.893870f,
+ 0.893913f, 0.893956f, 0.893999f, 0.894042f, 0.894085f, 0.894128f, 0.894171f, 0.894214f,
+ 0.894256f, 0.894299f, 0.894342f, 0.894385f, 0.894428f, 0.894471f, 0.894514f, 0.894557f,
+ 0.894599f, 0.894642f, 0.894685f, 0.894728f, 0.894771f, 0.894814f, 0.894856f, 0.894899f,
+ 0.894942f, 0.894985f, 0.895028f, 0.895070f, 0.895113f, 0.895156f, 0.895198f, 0.895241f,
+ 0.895284f, 0.895327f, 0.895369f, 0.895412f, 0.895455f, 0.895497f, 0.895540f, 0.895583f,
+ 0.895625f, 0.895668f, 0.895711f, 0.895753f, 0.895796f, 0.895838f, 0.895881f, 0.895924f,
+ 0.895966f, 0.896009f, 0.896051f, 0.896094f, 0.896137f, 0.896179f, 0.896222f, 0.896264f,
+ 0.896307f, 0.896349f, 0.896392f, 0.896434f, 0.896477f, 0.896519f, 0.896562f, 0.896604f,
+ 0.896646f, 0.896689f, 0.896731f, 0.896774f, 0.896816f, 0.896859f, 0.896901f, 0.896943f,
+ 0.896986f, 0.897028f, 0.897071f, 0.897113f, 0.897155f, 0.897198f, 0.897240f, 0.897282f,
+ 0.897325f, 0.897367f, 0.897409f, 0.897452f, 0.897494f, 0.897536f, 0.897578f, 0.897621f,
+ 0.897663f, 0.897705f, 0.897747f, 0.897790f, 0.897832f, 0.897874f, 0.897916f, 0.897958f,
+ 0.898001f, 0.898043f, 0.898085f, 0.898127f, 0.898169f, 0.898211f, 0.898254f, 0.898296f,
+ 0.898338f, 0.898380f, 0.898422f, 0.898464f, 0.898506f, 0.898548f, 0.898590f, 0.898632f,
+ 0.898674f, 0.898717f, 0.898759f, 0.898801f, 0.898843f, 0.898885f, 0.898927f, 0.898969f,
+ 0.899011f, 0.899053f, 0.899095f, 0.899137f, 0.899179f, 0.899220f, 0.899262f, 0.899304f,
+ 0.899346f, 0.899388f, 0.899430f, 0.899472f, 0.899514f, 0.899556f, 0.899598f, 0.899639f,
+ 0.899681f, 0.899723f, 0.899765f, 0.899807f, 0.899849f, 0.899890f, 0.899932f, 0.899974f,
+ 0.900016f, 0.900058f, 0.900099f, 0.900141f, 0.900183f, 0.900225f, 0.900266f, 0.900308f,
+ 0.900350f, 0.900392f, 0.900433f, 0.900475f, 0.900517f, 0.900558f, 0.900600f, 0.900642f,
+ 0.900683f, 0.900725f, 0.900767f, 0.900808f, 0.900850f, 0.900892f, 0.900933f, 0.900975f,
+ 0.901016f, 0.901058f, 0.901100f, 0.901141f, 0.901183f, 0.901224f, 0.901266f, 0.901307f,
+ 0.901349f, 0.901390f, 0.901432f, 0.901473f, 0.901515f, 0.901556f, 0.901598f, 0.901639f,
+ 0.901681f, 0.901722f, 0.901764f, 0.901805f, 0.901847f, 0.901888f, 0.901929f, 0.901971f,
+ 0.902012f, 0.902054f, 0.902095f, 0.902136f, 0.902178f, 0.902219f, 0.902260f, 0.902302f,
+ 0.902343f, 0.902384f, 0.902426f, 0.902467f, 0.902508f, 0.902550f, 0.902591f, 0.902632f,
+ 0.902673f, 0.902715f, 0.902756f, 0.902797f, 0.902838f, 0.902879f, 0.902921f, 0.902962f,
+ 0.903003f, 0.903044f, 0.903085f, 0.903127f, 0.903168f, 0.903209f, 0.903250f, 0.903291f,
+ 0.903332f, 0.903373f, 0.903415f, 0.903456f, 0.903497f, 0.903538f, 0.903579f, 0.903620f,
+ 0.903661f, 0.903702f, 0.903743f, 0.903784f, 0.903825f, 0.903866f, 0.903907f, 0.903948f,
+ 0.903989f, 0.904030f, 0.904071f, 0.904112f, 0.904153f, 0.904194f, 0.904235f, 0.904276f,
+ 0.904317f, 0.904358f, 0.904399f, 0.904440f, 0.904481f, 0.904521f, 0.904562f, 0.904603f,
+ 0.904644f, 0.904685f, 0.904726f, 0.904767f, 0.904807f, 0.904848f, 0.904889f, 0.904930f,
+ 0.904971f, 0.905011f, 0.905052f, 0.905093f, 0.905134f, 0.905175f, 0.905215f, 0.905256f,
+ 0.905297f, 0.905337f, 0.905378f, 0.905419f, 0.905460f, 0.905500f, 0.905541f, 0.905582f,
+ 0.905622f, 0.905663f, 0.905704f, 0.905744f, 0.905785f, 0.905825f, 0.905866f, 0.905907f,
+ 0.905947f, 0.905988f, 0.906028f, 0.906069f, 0.906110f, 0.906150f, 0.906191f, 0.906231f,
+ 0.906272f, 0.906312f, 0.906353f, 0.906393f, 0.906434f, 0.906474f, 0.906515f, 0.906555f,
+ 0.906596f, 0.906636f, 0.906677f, 0.906717f, 0.906757f, 0.906798f, 0.906838f, 0.906879f,
+ 0.906919f, 0.906959f, 0.907000f, 0.907040f, 0.907081f, 0.907121f, 0.907161f, 0.907202f,
+ 0.907242f, 0.907282f, 0.907323f, 0.907363f, 0.907403f, 0.907444f, 0.907484f, 0.907524f,
+ 0.907564f, 0.907605f, 0.907645f, 0.907685f, 0.907725f, 0.907766f, 0.907806f, 0.907846f,
+ 0.907886f, 0.907926f, 0.907966f, 0.908007f, 0.908047f, 0.908087f, 0.908127f, 0.908167f,
+ 0.908207f, 0.908248f, 0.908288f, 0.908328f, 0.908368f, 0.908408f, 0.908448f, 0.908488f,
+ 0.908528f, 0.908568f, 0.908608f, 0.908648f, 0.908688f, 0.908728f, 0.908768f, 0.908808f,
+ 0.908848f, 0.908888f, 0.908928f, 0.908968f, 0.909008f, 0.909048f, 0.909088f, 0.909128f,
+ 0.909168f, 0.909208f, 0.909248f, 0.909288f, 0.909328f, 0.909368f, 0.909407f, 0.909447f,
+ 0.909487f, 0.909527f, 0.909567f, 0.909607f, 0.909646f, 0.909686f, 0.909726f, 0.909766f,
+ 0.909806f, 0.909845f, 0.909885f, 0.909925f, 0.909965f, 0.910005f, 0.910044f, 0.910084f,
+ 0.910124f, 0.910163f, 0.910203f, 0.910243f, 0.910283f, 0.910322f, 0.910362f, 0.910402f,
+ 0.910441f, 0.910481f, 0.910521f, 0.910560f, 0.910600f, 0.910639f, 0.910679f, 0.910719f,
+ 0.910758f, 0.910798f, 0.910837f, 0.910877f, 0.910917f, 0.910956f, 0.910996f, 0.911035f,
+ 0.911075f, 0.911114f, 0.911154f, 0.911193f, 0.911233f, 0.911272f, 0.911312f, 0.911351f,
+ 0.911391f, 0.911430f, 0.911470f, 0.911509f, 0.911548f, 0.911588f, 0.911627f, 0.911667f,
+ 0.911706f, 0.911745f, 0.911785f, 0.911824f, 0.911864f, 0.911903f, 0.911942f, 0.911982f,
+ 0.912021f, 0.912060f, 0.912099f, 0.912139f, 0.912178f, 0.912217f, 0.912257f, 0.912296f,
+ 0.912335f, 0.912374f, 0.912414f, 0.912453f, 0.912492f, 0.912531f, 0.912571f, 0.912610f,
+ 0.912649f, 0.912688f, 0.912727f, 0.912766f, 0.912806f, 0.912845f, 0.912884f, 0.912923f,
+ 0.912962f, 0.913001f, 0.913040f, 0.913080f, 0.913119f, 0.913158f, 0.913197f, 0.913236f,
+ 0.913275f, 0.913314f, 0.913353f, 0.913392f, 0.913431f, 0.913470f, 0.913509f, 0.913548f,
+ 0.913587f, 0.913626f, 0.913665f, 0.913704f, 0.913743f, 0.913782f, 0.913821f, 0.913860f,
+ 0.913899f, 0.913938f, 0.913976f, 0.914015f, 0.914054f, 0.914093f, 0.914132f, 0.914171f,
+ 0.914210f, 0.914249f, 0.914287f, 0.914326f, 0.914365f, 0.914404f, 0.914443f, 0.914482f,
+ 0.914520f, 0.914559f, 0.914598f, 0.914637f, 0.914675f, 0.914714f, 0.914753f, 0.914792f,
+ 0.914830f, 0.914869f, 0.914908f, 0.914946f, 0.914985f, 0.915024f, 0.915062f, 0.915101f,
+ 0.915140f, 0.915178f, 0.915217f, 0.915256f, 0.915294f, 0.915333f, 0.915372f, 0.915410f,
+ 0.915449f, 0.915487f, 0.915526f, 0.915564f, 0.915603f, 0.915642f, 0.915680f, 0.915719f,
+ 0.915757f, 0.915796f, 0.915834f, 0.915873f, 0.915911f, 0.915950f, 0.915988f, 0.916027f,
+ 0.916065f, 0.916103f, 0.916142f, 0.916180f, 0.916219f, 0.916257f, 0.916296f, 0.916334f,
+ 0.916372f, 0.916411f, 0.916449f, 0.916487f, 0.916526f, 0.916564f, 0.916602f, 0.916641f,
+ 0.916679f, 0.916717f, 0.916756f, 0.916794f, 0.916832f, 0.916871f, 0.916909f, 0.916947f,
+ 0.916985f, 0.917024f, 0.917062f, 0.917100f, 0.917138f, 0.917176f, 0.917215f, 0.917253f,
+ 0.917291f, 0.917329f, 0.917367f, 0.917405f, 0.917444f, 0.917482f, 0.917520f, 0.917558f,
+ 0.917596f, 0.917634f, 0.917672f, 0.917710f, 0.917749f, 0.917787f, 0.917825f, 0.917863f,
+ 0.917901f, 0.917939f, 0.917977f, 0.918015f, 0.918053f, 0.918091f, 0.918129f, 0.918167f,
+ 0.918205f, 0.918243f, 0.918281f, 0.918319f, 0.918357f, 0.918395f, 0.918433f, 0.918471f,
+ 0.918508f, 0.918546f, 0.918584f, 0.918622f, 0.918660f, 0.918698f, 0.918736f, 0.918774f,
+ 0.918811f, 0.918849f, 0.918887f, 0.918925f, 0.918963f, 0.919001f, 0.919038f, 0.919076f,
+ 0.919114f, 0.919152f, 0.919189f, 0.919227f, 0.919265f, 0.919303f, 0.919340f, 0.919378f,
+ 0.919416f, 0.919453f, 0.919491f, 0.919529f, 0.919567f, 0.919604f, 0.919642f, 0.919680f,
+ 0.919717f, 0.919755f, 0.919792f, 0.919830f, 0.919868f, 0.919905f, 0.919943f, 0.919980f,
+ 0.920018f, 0.920056f, 0.920093f, 0.920131f, 0.920168f, 0.920206f, 0.920243f, 0.920281f,
+ 0.920318f, 0.920356f, 0.920393f, 0.920431f, 0.920468f, 0.920506f, 0.920543f, 0.920581f,
+ 0.920618f, 0.920655f, 0.920693f, 0.920730f, 0.920768f, 0.920805f, 0.920842f, 0.920880f,
+ 0.920917f, 0.920955f, 0.920992f, 0.921029f, 0.921067f, 0.921104f, 0.921141f, 0.921179f,
+ 0.921216f, 0.921253f, 0.921291f, 0.921328f, 0.921365f, 0.921402f, 0.921440f, 0.921477f,
+ 0.921514f, 0.921551f, 0.921588f, 0.921626f, 0.921663f, 0.921700f, 0.921737f, 0.921774f,
+ 0.921812f, 0.921849f, 0.921886f, 0.921923f, 0.921960f, 0.921997f, 0.922034f, 0.922072f,
+ 0.922109f, 0.922146f, 0.922183f, 0.922220f, 0.922257f, 0.922294f, 0.922331f, 0.922368f,
+ 0.922405f, 0.922442f, 0.922479f, 0.922516f, 0.922553f, 0.922590f, 0.922627f, 0.922664f,
+ 0.922701f, 0.922738f, 0.922775f, 0.922812f, 0.922849f, 0.922886f, 0.922923f, 0.922960f,
+ 0.922997f, 0.923033f, 0.923070f, 0.923107f, 0.923144f, 0.923181f, 0.923218f, 0.923255f,
+ 0.923291f, 0.923328f, 0.923365f, 0.923402f, 0.923439f, 0.923475f, 0.923512f, 0.923549f,
+ 0.923586f, 0.923622f, 0.923659f, 0.923696f, 0.923733f, 0.923769f, 0.923806f, 0.923843f,
+ 0.923880f, 0.923916f, 0.923953f, 0.923990f, 0.924026f, 0.924063f, 0.924100f, 0.924136f,
+ 0.924173f, 0.924209f, 0.924246f, 0.924283f, 0.924319f, 0.924356f, 0.924392f, 0.924429f,
+ 0.924465f, 0.924502f, 0.924539f, 0.924575f, 0.924612f, 0.924648f, 0.924685f, 0.924721f,
+ 0.924758f, 0.924794f, 0.924831f, 0.924867f, 0.924904f, 0.924940f, 0.924976f, 0.925013f,
+ 0.925049f, 0.925086f, 0.925122f, 0.925158f, 0.925195f, 0.925231f, 0.925268f, 0.925304f,
+ 0.925340f, 0.925377f, 0.925413f, 0.925449f, 0.925486f, 0.925522f, 0.925558f, 0.925595f,
+ 0.925631f, 0.925667f, 0.925703f, 0.925740f, 0.925776f, 0.925812f, 0.925848f, 0.925885f,
+ 0.925921f, 0.925957f, 0.925993f, 0.926029f, 0.926066f, 0.926102f, 0.926138f, 0.926174f,
+ 0.926210f, 0.926246f, 0.926283f, 0.926319f, 0.926355f, 0.926391f, 0.926427f, 0.926463f,
+ 0.926499f, 0.926535f, 0.926571f, 0.926607f, 0.926643f, 0.926679f, 0.926715f, 0.926751f,
+ 0.926787f, 0.926823f, 0.926859f, 0.926895f, 0.926931f, 0.926967f, 0.927003f, 0.927039f,
+ 0.927075f, 0.927111f, 0.927147f, 0.927183f, 0.927219f, 0.927255f, 0.927291f, 0.927327f,
+ 0.927363f, 0.927398f, 0.927434f, 0.927470f, 0.927506f, 0.927542f, 0.927578f, 0.927613f,
+ 0.927649f, 0.927685f, 0.927721f, 0.927757f, 0.927792f, 0.927828f, 0.927864f, 0.927900f,
+ 0.927935f, 0.927971f, 0.928007f, 0.928043f, 0.928078f, 0.928114f, 0.928150f, 0.928185f,
+ 0.928221f, 0.928257f, 0.928292f, 0.928328f, 0.928364f, 0.928399f, 0.928435f, 0.928470f,
+ 0.928506f, 0.928542f, 0.928577f, 0.928613f, 0.928648f, 0.928684f, 0.928720f, 0.928755f,
+ 0.928791f, 0.928826f, 0.928862f, 0.928897f, 0.928933f, 0.928968f, 0.929004f, 0.929039f,
+ 0.929075f, 0.929110f, 0.929146f, 0.929181f, 0.929216f, 0.929252f, 0.929287f, 0.929323f,
+ 0.929358f, 0.929393f, 0.929429f, 0.929464f, 0.929500f, 0.929535f, 0.929570f, 0.929606f,
+ 0.929641f, 0.929676f, 0.929712f, 0.929747f, 0.929782f, 0.929817f, 0.929853f, 0.929888f,
+ 0.929923f, 0.929958f, 0.929994f, 0.930029f, 0.930064f, 0.930099f, 0.930135f, 0.930170f,
+ 0.930205f, 0.930240f, 0.930275f, 0.930311f, 0.930346f, 0.930381f, 0.930416f, 0.930451f,
+ 0.930486f, 0.930521f, 0.930556f, 0.930592f, 0.930627f, 0.930662f, 0.930697f, 0.930732f,
+ 0.930767f, 0.930802f, 0.930837f, 0.930872f, 0.930907f, 0.930942f, 0.930977f, 0.931012f,
+ 0.931047f, 0.931082f, 0.931117f, 0.931152f, 0.931187f, 0.931222f, 0.931257f, 0.931292f,
+ 0.931327f, 0.931362f, 0.931397f, 0.931431f, 0.931466f, 0.931501f, 0.931536f, 0.931571f,
+ 0.931606f, 0.931641f, 0.931675f, 0.931710f, 0.931745f, 0.931780f, 0.931815f, 0.931849f,
+ 0.931884f, 0.931919f, 0.931954f, 0.931989f, 0.932023f, 0.932058f, 0.932093f, 0.932128f,
+ 0.932162f, 0.932197f, 0.932232f, 0.932266f, 0.932301f, 0.932336f, 0.932370f, 0.932405f,
+ 0.932440f, 0.932474f, 0.932509f, 0.932544f, 0.932578f, 0.932613f, 0.932647f, 0.932682f,
+ 0.932716f, 0.932751f, 0.932786f, 0.932820f, 0.932855f, 0.932889f, 0.932924f, 0.932958f,
+ 0.932993f, 0.933027f, 0.933062f, 0.933096f, 0.933131f, 0.933165f, 0.933200f, 0.933234f,
+ 0.933269f, 0.933303f, 0.933337f, 0.933372f, 0.933406f, 0.933441f, 0.933475f, 0.933509f,
+ 0.933544f, 0.933578f, 0.933612f, 0.933647f, 0.933681f, 0.933716f, 0.933750f, 0.933784f,
+ 0.933818f, 0.933853f, 0.933887f, 0.933921f, 0.933956f, 0.933990f, 0.934024f, 0.934058f,
+ 0.934093f, 0.934127f, 0.934161f, 0.934195f, 0.934229f, 0.934264f, 0.934298f, 0.934332f,
+ 0.934366f, 0.934400f, 0.934434f, 0.934469f, 0.934503f, 0.934537f, 0.934571f, 0.934605f,
+ 0.934639f, 0.934673f, 0.934707f, 0.934741f, 0.934775f, 0.934810f, 0.934844f, 0.934878f,
+ 0.934912f, 0.934946f, 0.934980f, 0.935014f, 0.935048f, 0.935082f, 0.935116f, 0.935150f,
+ 0.935184f, 0.935217f, 0.935251f, 0.935285f, 0.935319f, 0.935353f, 0.935387f, 0.935421f,
+ 0.935455f, 0.935489f, 0.935523f, 0.935556f, 0.935590f, 0.935624f, 0.935658f, 0.935692f,
+ 0.935726f, 0.935759f, 0.935793f, 0.935827f, 0.935861f, 0.935895f, 0.935928f, 0.935962f,
+ 0.935996f, 0.936030f, 0.936063f, 0.936097f, 0.936131f, 0.936165f, 0.936198f, 0.936232f,
+ 0.936266f, 0.936299f, 0.936333f, 0.936367f, 0.936400f, 0.936434f, 0.936468f, 0.936501f,
+ 0.936535f, 0.936568f, 0.936602f, 0.936636f, 0.936669f, 0.936703f, 0.936736f, 0.936770f,
+ 0.936803f, 0.936837f, 0.936871f, 0.936904f, 0.936938f, 0.936971f, 0.937005f, 0.937038f,
+ 0.937072f, 0.937105f, 0.937138f, 0.937172f, 0.937205f, 0.937239f, 0.937272f, 0.937306f,
+ 0.937339f, 0.937372f, 0.937406f, 0.937439f, 0.937473f, 0.937506f, 0.937539f, 0.937573f,
+ 0.937606f, 0.937639f, 0.937673f, 0.937706f, 0.937739f, 0.937773f, 0.937806f, 0.937839f,
+ 0.937872f, 0.937906f, 0.937939f, 0.937972f, 0.938005f, 0.938039f, 0.938072f, 0.938105f,
+ 0.938138f, 0.938171f, 0.938205f, 0.938238f, 0.938271f, 0.938304f, 0.938337f, 0.938370f,
+ 0.938404f, 0.938437f, 0.938470f, 0.938503f, 0.938536f, 0.938569f, 0.938602f, 0.938635f,
+ 0.938668f, 0.938701f, 0.938734f, 0.938767f, 0.938800f, 0.938833f, 0.938866f, 0.938900f,
+ 0.938932f, 0.938965f, 0.938998f, 0.939031f, 0.939064f, 0.939097f, 0.939130f, 0.939163f,
+ 0.939196f, 0.939229f, 0.939262f, 0.939295f, 0.939328f, 0.939361f, 0.939394f, 0.939426f,
+ 0.939459f, 0.939492f, 0.939525f, 0.939558f, 0.939591f, 0.939623f, 0.939656f, 0.939689f,
+ 0.939722f, 0.939755f, 0.939787f, 0.939820f, 0.939853f, 0.939886f, 0.939918f, 0.939951f,
+ 0.939984f, 0.940016f, 0.940049f, 0.940082f, 0.940115f, 0.940147f, 0.940180f, 0.940213f,
+ 0.940245f, 0.940278f, 0.940310f, 0.940343f, 0.940376f, 0.940408f, 0.940441f, 0.940473f,
+ 0.940506f, 0.940539f, 0.940571f, 0.940604f, 0.940636f, 0.940669f, 0.940701f, 0.940734f,
+ 0.940766f, 0.940799f, 0.940831f, 0.940864f, 0.940896f, 0.940929f, 0.940961f, 0.940994f,
+ 0.941026f, 0.941059f, 0.941091f, 0.941123f, 0.941156f, 0.941188f, 0.941221f, 0.941253f,
+ 0.941285f, 0.941318f, 0.941350f, 0.941382f, 0.941415f, 0.941447f, 0.941479f, 0.941512f,
+ 0.941544f, 0.941576f, 0.941609f, 0.941641f, 0.941673f, 0.941705f, 0.941738f, 0.941770f,
+ 0.941802f, 0.941834f, 0.941867f, 0.941899f, 0.941931f, 0.941963f, 0.941995f, 0.942028f,
+ 0.942060f, 0.942092f, 0.942124f, 0.942156f, 0.942188f, 0.942220f, 0.942253f, 0.942285f,
+ 0.942317f, 0.942349f, 0.942381f, 0.942413f, 0.942445f, 0.942477f, 0.942509f, 0.942541f,
+ 0.942573f, 0.942605f, 0.942637f, 0.942669f, 0.942701f, 0.942733f, 0.942765f, 0.942797f,
+ 0.942829f, 0.942861f, 0.942893f, 0.942925f, 0.942957f, 0.942989f, 0.943021f, 0.943053f,
+ 0.943084f, 0.943116f, 0.943148f, 0.943180f, 0.943212f, 0.943244f, 0.943276f, 0.943307f,
+ 0.943339f, 0.943371f, 0.943403f, 0.943435f, 0.943466f, 0.943498f, 0.943530f, 0.943562f,
+ 0.943593f, 0.943625f, 0.943657f, 0.943689f, 0.943720f, 0.943752f, 0.943784f, 0.943815f,
+ 0.943847f, 0.943879f, 0.943910f, 0.943942f, 0.943974f, 0.944005f, 0.944037f, 0.944069f,
+ 0.944100f, 0.944132f, 0.944163f, 0.944195f, 0.944227f, 0.944258f, 0.944290f, 0.944321f,
+ 0.944353f, 0.944384f, 0.944416f, 0.944447f, 0.944479f, 0.944510f, 0.944542f, 0.944573f,
+ 0.944605f, 0.944636f, 0.944668f, 0.944699f, 0.944731f, 0.944762f, 0.944793f, 0.944825f,
+ 0.944856f, 0.944888f, 0.944919f, 0.944950f, 0.944982f, 0.945013f, 0.945045f, 0.945076f,
+ 0.945107f, 0.945139f, 0.945170f, 0.945201f, 0.945232f, 0.945264f, 0.945295f, 0.945326f,
+ 0.945358f, 0.945389f, 0.945420f, 0.945451f, 0.945482f, 0.945514f, 0.945545f, 0.945576f,
+ 0.945607f, 0.945639f, 0.945670f, 0.945701f, 0.945732f, 0.945763f, 0.945794f, 0.945825f,
+ 0.945857f, 0.945888f, 0.945919f, 0.945950f, 0.945981f, 0.946012f, 0.946043f, 0.946074f,
+ 0.946105f, 0.946136f, 0.946167f, 0.946198f, 0.946229f, 0.946260f, 0.946291f, 0.946322f,
+ 0.946353f, 0.946384f, 0.946415f, 0.946446f, 0.946477f, 0.946508f, 0.946539f, 0.946570f,
+ 0.946601f, 0.946632f, 0.946663f, 0.946694f, 0.946724f, 0.946755f, 0.946786f, 0.946817f,
+ 0.946848f, 0.946879f, 0.946910f, 0.946940f, 0.946971f, 0.947002f, 0.947033f, 0.947064f,
+ 0.947094f, 0.947125f, 0.947156f, 0.947187f, 0.947217f, 0.947248f, 0.947279f, 0.947310f,
+ 0.947340f, 0.947371f, 0.947402f, 0.947432f, 0.947463f, 0.947494f, 0.947524f, 0.947555f,
+ 0.947586f, 0.947616f, 0.947647f, 0.947677f, 0.947708f, 0.947739f, 0.947769f, 0.947800f,
+ 0.947830f, 0.947861f, 0.947891f, 0.947922f, 0.947953f, 0.947983f, 0.948014f, 0.948044f,
+ 0.948075f, 0.948105f, 0.948136f, 0.948166f, 0.948196f, 0.948227f, 0.948257f, 0.948288f,
+ 0.948318f, 0.948349f, 0.948379f, 0.948409f, 0.948440f, 0.948470f, 0.948501f, 0.948531f,
+ 0.948561f, 0.948592f, 0.948622f, 0.948652f, 0.948683f, 0.948713f, 0.948743f, 0.948774f,
+ 0.948804f, 0.948834f, 0.948864f, 0.948895f, 0.948925f, 0.948955f, 0.948985f, 0.949016f,
+ 0.949046f, 0.949076f, 0.949106f, 0.949136f, 0.949167f, 0.949197f, 0.949227f, 0.949257f,
+ 0.949287f, 0.949317f, 0.949348f, 0.949378f, 0.949408f, 0.949438f, 0.949468f, 0.949498f,
+ 0.949528f, 0.949558f, 0.949588f, 0.949618f, 0.949648f, 0.949678f, 0.949708f, 0.949739f,
+ 0.949768f, 0.949798f, 0.949829f, 0.949858f, 0.949888f, 0.949918f, 0.949948f, 0.949978f,
+ 0.950008f, 0.950038f, 0.950068f, 0.950098f, 0.950128f, 0.950158f, 0.950188f, 0.950218f,
+ 0.950247f, 0.950277f, 0.950307f, 0.950337f, 0.950367f, 0.950397f, 0.950426f, 0.950456f,
+ 0.950486f, 0.950516f, 0.950546f, 0.950575f, 0.950605f, 0.950635f, 0.950665f, 0.950694f,
+ 0.950724f, 0.950754f, 0.950784f, 0.950813f, 0.950843f, 0.950873f, 0.950902f, 0.950932f,
+ 0.950962f, 0.950991f, 0.951021f, 0.951051f, 0.951080f, 0.951110f, 0.951139f, 0.951169f,
+ 0.951199f, 0.951228f, 0.951258f, 0.951287f, 0.951317f, 0.951346f, 0.951376f, 0.951406f,
+ 0.951435f, 0.951465f, 0.951494f, 0.951524f, 0.951553f, 0.951582f, 0.951612f, 0.951641f,
+ 0.951671f, 0.951700f, 0.951730f, 0.951759f, 0.951789f, 0.951818f, 0.951847f, 0.951877f,
+ 0.951906f, 0.951936f, 0.951965f, 0.951994f, 0.952024f, 0.952053f, 0.952082f, 0.952112f,
+ 0.952141f, 0.952170f, 0.952199f, 0.952229f, 0.952258f, 0.952287f, 0.952317f, 0.952346f,
+ 0.952375f, 0.952404f, 0.952433f, 0.952463f, 0.952492f, 0.952521f, 0.952550f, 0.952579f,
+ 0.952609f, 0.952638f, 0.952667f, 0.952696f, 0.952725f, 0.952754f, 0.952783f, 0.952813f,
+ 0.952842f, 0.952871f, 0.952900f, 0.952929f, 0.952958f, 0.952987f, 0.953016f, 0.953045f,
+ 0.953074f, 0.953103f, 0.953132f, 0.953161f, 0.953190f, 0.953219f, 0.953248f, 0.953277f,
+ 0.953306f, 0.953335f, 0.953364f, 0.953393f, 0.953422f, 0.953451f, 0.953480f, 0.953508f,
+ 0.953537f, 0.953566f, 0.953595f, 0.953624f, 0.953653f, 0.953682f, 0.953711f, 0.953739f,
+ 0.953768f, 0.953797f, 0.953826f, 0.953855f, 0.953883f, 0.953912f, 0.953941f, 0.953970f,
+ 0.953998f, 0.954027f, 0.954056f, 0.954085f, 0.954113f, 0.954142f, 0.954171f, 0.954199f,
+ 0.954228f, 0.954257f, 0.954285f, 0.954314f, 0.954343f, 0.954371f, 0.954400f, 0.954429f,
+ 0.954457f, 0.954486f, 0.954514f, 0.954543f, 0.954572f, 0.954600f, 0.954629f, 0.954657f,
+ 0.954686f, 0.954714f, 0.954743f, 0.954771f, 0.954800f, 0.954828f, 0.954857f, 0.954885f,
+ 0.954914f, 0.954942f, 0.954971f, 0.954999f, 0.955028f, 0.955056f, 0.955084f, 0.955113f,
+ 0.955141f, 0.955170f, 0.955198f, 0.955226f, 0.955255f, 0.955283f, 0.955311f, 0.955340f,
+ 0.955368f, 0.955396f, 0.955425f, 0.955453f, 0.955481f, 0.955510f, 0.955538f, 0.955566f,
+ 0.955594f, 0.955623f, 0.955651f, 0.955679f, 0.955707f, 0.955736f, 0.955764f, 0.955792f,
+ 0.955820f, 0.955848f, 0.955876f, 0.955905f, 0.955933f, 0.955961f, 0.955989f, 0.956017f,
+ 0.956045f, 0.956073f, 0.956101f, 0.956130f, 0.956158f, 0.956186f, 0.956214f, 0.956242f,
+ 0.956270f, 0.956298f, 0.956326f, 0.956354f, 0.956382f, 0.956410f, 0.956438f, 0.956466f,
+ 0.956494f, 0.956522f, 0.956550f, 0.956578f, 0.956606f, 0.956634f, 0.956662f, 0.956689f,
+ 0.956717f, 0.956745f, 0.956773f, 0.956801f, 0.956829f, 0.956857f, 0.956885f, 0.956913f,
+ 0.956940f, 0.956968f, 0.956996f, 0.957024f, 0.957052f, 0.957079f, 0.957107f, 0.957135f,
+ 0.957163f, 0.957190f, 0.957218f, 0.957246f, 0.957274f, 0.957301f, 0.957329f, 0.957357f,
+ 0.957385f, 0.957412f, 0.957440f, 0.957468f, 0.957495f, 0.957523f, 0.957550f, 0.957578f,
+ 0.957606f, 0.957633f, 0.957661f, 0.957689f, 0.957716f, 0.957744f, 0.957771f, 0.957799f,
+ 0.957826f, 0.957854f, 0.957882f, 0.957909f, 0.957937f, 0.957964f, 0.957992f, 0.958019f,
+ 0.958046f, 0.958074f, 0.958101f, 0.958129f, 0.958156f, 0.958184f, 0.958211f, 0.958239f,
+ 0.958266f, 0.958293f, 0.958321f, 0.958348f, 0.958376f, 0.958403f, 0.958430f, 0.958458f,
+ 0.958485f, 0.958512f, 0.958540f, 0.958567f, 0.958594f, 0.958622f, 0.958649f, 0.958676f,
+ 0.958703f, 0.958731f, 0.958758f, 0.958785f, 0.958812f, 0.958840f, 0.958867f, 0.958894f,
+ 0.958921f, 0.958949f, 0.958976f, 0.959003f, 0.959030f, 0.959057f, 0.959084f, 0.959112f,
+ 0.959139f, 0.959166f, 0.959193f, 0.959220f, 0.959247f, 0.959274f, 0.959301f, 0.959328f,
+ 0.959355f, 0.959382f, 0.959409f, 0.959436f, 0.959463f, 0.959491f, 0.959518f, 0.959545f,
+ 0.959572f, 0.959598f, 0.959625f, 0.959652f, 0.959679f, 0.959706f, 0.959733f, 0.959760f,
+ 0.959787f, 0.959814f, 0.959841f, 0.959868f, 0.959895f, 0.959922f, 0.959948f, 0.959975f,
+ 0.960002f, 0.960029f, 0.960056f, 0.960083f, 0.960109f, 0.960136f, 0.960163f, 0.960190f,
+ 0.960217f, 0.960243f, 0.960270f, 0.960297f, 0.960324f, 0.960350f, 0.960377f, 0.960404f,
+ 0.960431f, 0.960457f, 0.960484f, 0.960511f, 0.960537f, 0.960564f, 0.960591f, 0.960617f,
+ 0.960644f, 0.960670f, 0.960697f, 0.960724f, 0.960750f, 0.960777f, 0.960804f, 0.960830f,
+ 0.960857f, 0.960883f, 0.960910f, 0.960936f, 0.960963f, 0.960989f, 0.961016f, 0.961042f,
+ 0.961069f, 0.961095f, 0.961122f, 0.961148f, 0.961175f, 0.961201f, 0.961228f, 0.961254f,
+ 0.961280f, 0.961307f, 0.961333f, 0.961360f, 0.961386f, 0.961412f, 0.961439f, 0.961465f,
+ 0.961492f, 0.961518f, 0.961544f, 0.961571f, 0.961597f, 0.961623f, 0.961649f, 0.961676f,
+ 0.961702f, 0.961728f, 0.961755f, 0.961781f, 0.961807f, 0.961833f, 0.961860f, 0.961886f,
+ 0.961912f, 0.961938f, 0.961964f, 0.961991f, 0.962017f, 0.962043f, 0.962069f, 0.962095f,
+ 0.962121f, 0.962148f, 0.962174f, 0.962200f, 0.962226f, 0.962252f, 0.962278f, 0.962304f,
+ 0.962330f, 0.962356f, 0.962382f, 0.962408f, 0.962434f, 0.962460f, 0.962486f, 0.962512f,
+ 0.962538f, 0.962564f, 0.962590f, 0.962616f, 0.962642f, 0.962668f, 0.962694f, 0.962720f,
+ 0.962746f, 0.962772f, 0.962798f, 0.962824f, 0.962850f, 0.962876f, 0.962902f, 0.962927f,
+ 0.962953f, 0.962979f, 0.963005f, 0.963031f, 0.963057f, 0.963082f, 0.963108f, 0.963134f,
+ 0.963160f, 0.963186f, 0.963211f, 0.963237f, 0.963263f, 0.963289f, 0.963314f, 0.963340f,
+ 0.963366f, 0.963391f, 0.963417f, 0.963443f, 0.963469f, 0.963494f, 0.963520f, 0.963546f,
+ 0.963571f, 0.963597f, 0.963623f, 0.963648f, 0.963674f, 0.963699f, 0.963725f, 0.963750f,
+ 0.963776f, 0.963802f, 0.963827f, 0.963853f, 0.963878f, 0.963904f, 0.963929f, 0.963955f,
+ 0.963980f, 0.964006f, 0.964031f, 0.964057f, 0.964082f, 0.964108f, 0.964133f, 0.964159f,
+ 0.964184f, 0.964209f, 0.964235f, 0.964260f, 0.964286f, 0.964311f, 0.964336f, 0.964362f,
+ 0.964387f, 0.964413f, 0.964438f, 0.964463f, 0.964489f, 0.964514f, 0.964539f, 0.964565f,
+ 0.964590f, 0.964615f, 0.964640f, 0.964666f, 0.964691f, 0.964716f, 0.964741f, 0.964767f,
+ 0.964792f, 0.964817f, 0.964842f, 0.964867f, 0.964893f, 0.964918f, 0.964943f, 0.964968f,
+ 0.964993f, 0.965018f, 0.965044f, 0.965069f, 0.965094f, 0.965119f, 0.965144f, 0.965169f,
+ 0.965194f, 0.965219f, 0.965244f, 0.965269f, 0.965294f, 0.965319f, 0.965344f, 0.965369f,
+ 0.965394f, 0.965419f, 0.965444f, 0.965469f, 0.965494f, 0.965519f, 0.965544f, 0.965569f,
+ 0.965594f, 0.965619f, 0.965644f, 0.965669f, 0.965694f, 0.965719f, 0.965744f, 0.965769f,
+ 0.965793f, 0.965818f, 0.965843f, 0.965868f, 0.965893f, 0.965918f, 0.965942f, 0.965967f,
+ 0.965992f, 0.966017f, 0.966042f, 0.966066f, 0.966091f, 0.966116f, 0.966141f, 0.966165f,
+ 0.966190f, 0.966215f, 0.966239f, 0.966264f, 0.966289f, 0.966313f, 0.966338f, 0.966363f,
+ 0.966387f, 0.966412f, 0.966437f, 0.966461f, 0.966486f, 0.966511f, 0.966535f, 0.966560f,
+ 0.966584f, 0.966609f, 0.966633f, 0.966658f, 0.966683f, 0.966707f, 0.966732f, 0.966756f,
+ 0.966781f, 0.966805f, 0.966830f, 0.966854f, 0.966879f, 0.966903f, 0.966928f, 0.966952f,
+ 0.966976f, 0.967001f, 0.967025f, 0.967050f, 0.967074f, 0.967099f, 0.967123f, 0.967147f,
+ 0.967172f, 0.967196f, 0.967220f, 0.967245f, 0.967269f, 0.967293f, 0.967318f, 0.967342f,
+ 0.967366f, 0.967391f, 0.967415f, 0.967439f, 0.967463f, 0.967488f, 0.967512f, 0.967536f,
+ 0.967560f, 0.967585f, 0.967609f, 0.967633f, 0.967657f, 0.967681f, 0.967706f, 0.967730f,
+ 0.967754f, 0.967778f, 0.967802f, 0.967826f, 0.967850f, 0.967874f, 0.967899f, 0.967923f,
+ 0.967947f, 0.967971f, 0.967995f, 0.968019f, 0.968043f, 0.968067f, 0.968091f, 0.968115f,
+ 0.968139f, 0.968163f, 0.968187f, 0.968211f, 0.968235f, 0.968259f, 0.968283f, 0.968307f,
+ 0.968331f, 0.968355f, 0.968379f, 0.968403f, 0.968427f, 0.968450f, 0.968474f, 0.968498f,
+ 0.968522f, 0.968546f, 0.968570f, 0.968594f, 0.968617f, 0.968641f, 0.968665f, 0.968689f,
+ 0.968713f, 0.968737f, 0.968760f, 0.968784f, 0.968808f, 0.968832f, 0.968855f, 0.968879f,
+ 0.968903f, 0.968927f, 0.968950f, 0.968974f, 0.968998f, 0.969021f, 0.969045f, 0.969069f,
+ 0.969092f, 0.969116f, 0.969140f, 0.969163f, 0.969187f, 0.969210f, 0.969234f, 0.969258f,
+ 0.969281f, 0.969305f, 0.969328f, 0.969352f, 0.969375f, 0.969399f, 0.969423f, 0.969446f,
+ 0.969470f, 0.969493f, 0.969517f, 0.969540f, 0.969564f, 0.969587f, 0.969611f, 0.969634f,
+ 0.969657f, 0.969681f, 0.969704f, 0.969728f, 0.969751f, 0.969774f, 0.969798f, 0.969821f,
+ 0.969845f, 0.969868f, 0.969891f, 0.969915f, 0.969938f, 0.969961f, 0.969985f, 0.970008f,
+ 0.970031f, 0.970055f, 0.970078f, 0.970101f, 0.970124f, 0.970148f, 0.970171f, 0.970194f,
+ 0.970217f, 0.970241f, 0.970264f, 0.970287f, 0.970310f, 0.970333f, 0.970357f, 0.970380f,
+ 0.970403f, 0.970426f, 0.970449f, 0.970472f, 0.970495f, 0.970518f, 0.970542f, 0.970565f,
+ 0.970588f, 0.970611f, 0.970634f, 0.970657f, 0.970680f, 0.970703f, 0.970726f, 0.970749f,
+ 0.970772f, 0.970795f, 0.970818f, 0.970841f, 0.970864f, 0.970887f, 0.970910f, 0.970933f,
+ 0.970956f, 0.970979f, 0.971002f, 0.971025f, 0.971048f, 0.971071f, 0.971093f, 0.971116f,
+ 0.971139f, 0.971162f, 0.971185f, 0.971208f, 0.971231f, 0.971253f, 0.971276f, 0.971299f,
+ 0.971322f, 0.971345f, 0.971367f, 0.971390f, 0.971413f, 0.971436f, 0.971458f, 0.971481f,
+ 0.971504f, 0.971527f, 0.971549f, 0.971572f, 0.971595f, 0.971617f, 0.971640f, 0.971663f,
+ 0.971685f, 0.971708f, 0.971731f, 0.971753f, 0.971776f, 0.971799f, 0.971821f, 0.971844f,
+ 0.971866f, 0.971889f, 0.971911f, 0.971934f, 0.971957f, 0.971979f, 0.972002f, 0.972024f,
+ 0.972047f, 0.972069f, 0.972092f, 0.972114f, 0.972137f, 0.972159f, 0.972182f, 0.972204f,
+ 0.972227f, 0.972249f, 0.972271f, 0.972294f, 0.972316f, 0.972339f, 0.972361f, 0.972383f,
+ 0.972406f, 0.972428f, 0.972450f, 0.972473f, 0.972495f, 0.972517f, 0.972540f, 0.972562f,
+ 0.972584f, 0.972607f, 0.972629f, 0.972651f, 0.972673f, 0.972696f, 0.972718f, 0.972740f,
+ 0.972762f, 0.972785f, 0.972807f, 0.972829f, 0.972851f, 0.972873f, 0.972896f, 0.972918f,
+ 0.972940f, 0.972962f, 0.972984f, 0.973006f, 0.973028f, 0.973051f, 0.973073f, 0.973095f,
+ 0.973117f, 0.973139f, 0.973161f, 0.973183f, 0.973205f, 0.973227f, 0.973249f, 0.973271f,
+ 0.973293f, 0.973315f, 0.973337f, 0.973359f, 0.973381f, 0.973403f, 0.973425f, 0.973447f,
+ 0.973469f, 0.973491f, 0.973513f, 0.973535f, 0.973557f, 0.973579f, 0.973601f, 0.973622f,
+ 0.973644f, 0.973666f, 0.973688f, 0.973710f, 0.973732f, 0.973753f, 0.973775f, 0.973797f,
+ 0.973819f, 0.973841f, 0.973862f, 0.973884f, 0.973906f, 0.973928f, 0.973949f, 0.973971f,
+ 0.973993f, 0.974015f, 0.974036f, 0.974058f, 0.974080f, 0.974101f, 0.974123f, 0.974145f,
+ 0.974166f, 0.974188f, 0.974210f, 0.974231f, 0.974253f, 0.974275f, 0.974296f, 0.974318f,
+ 0.974339f, 0.974361f, 0.974383f, 0.974404f, 0.974426f, 0.974447f, 0.974469f, 0.974490f,
+ 0.974512f, 0.974533f, 0.974555f, 0.974576f, 0.974598f, 0.974619f, 0.974641f, 0.974662f,
+ 0.974684f, 0.974705f, 0.974726f, 0.974748f, 0.974769f, 0.974791f, 0.974812f, 0.974833f,
+ 0.974855f, 0.974876f, 0.974897f, 0.974919f, 0.974940f, 0.974961f, 0.974983f, 0.975004f,
+ 0.975025f, 0.975047f, 0.975068f, 0.975089f, 0.975110f, 0.975132f, 0.975153f, 0.975174f,
+ 0.975195f, 0.975217f, 0.975238f, 0.975259f, 0.975280f, 0.975301f, 0.975323f, 0.975344f,
+ 0.975365f, 0.975386f, 0.975407f, 0.975428f, 0.975449f, 0.975471f, 0.975492f, 0.975513f,
+ 0.975534f, 0.975555f, 0.975576f, 0.975597f, 0.975618f, 0.975639f, 0.975660f, 0.975681f,
+ 0.975702f, 0.975723f, 0.975744f, 0.975765f, 0.975786f, 0.975807f, 0.975828f, 0.975849f,
+ 0.975870f, 0.975891f, 0.975912f, 0.975933f, 0.975954f, 0.975974f, 0.975995f, 0.976016f,
+ 0.976037f, 0.976058f, 0.976079f, 0.976100f, 0.976120f, 0.976141f, 0.976162f, 0.976183f,
+ 0.976204f, 0.976224f, 0.976245f, 0.976266f, 0.976287f, 0.976308f, 0.976328f, 0.976349f,
+ 0.976370f, 0.976390f, 0.976411f, 0.976432f, 0.976453f, 0.976473f, 0.976494f, 0.976515f,
+ 0.976535f, 0.976556f, 0.976576f, 0.976597f, 0.976618f, 0.976638f, 0.976659f, 0.976680f,
+ 0.976700f, 0.976721f, 0.976741f, 0.976762f, 0.976782f, 0.976803f, 0.976823f, 0.976844f,
+ 0.976864f, 0.976885f, 0.976905f, 0.976926f, 0.976946f, 0.976967f, 0.976987f, 0.977008f,
+ 0.977028f, 0.977049f, 0.977069f, 0.977089f, 0.977110f, 0.977130f, 0.977151f, 0.977171f,
+ 0.977191f, 0.977212f, 0.977232f, 0.977252f, 0.977273f, 0.977293f, 0.977313f, 0.977334f,
+ 0.977354f, 0.977374f, 0.977394f, 0.977415f, 0.977435f, 0.977455f, 0.977475f, 0.977496f,
+ 0.977516f, 0.977536f, 0.977556f, 0.977577f, 0.977597f, 0.977617f, 0.977637f, 0.977657f,
+ 0.977677f, 0.977697f, 0.977718f, 0.977738f, 0.977758f, 0.977778f, 0.977798f, 0.977818f,
+ 0.977838f, 0.977858f, 0.977878f, 0.977898f, 0.977918f, 0.977938f, 0.977959f, 0.977979f,
+ 0.977998f, 0.978019f, 0.978038f, 0.978058f, 0.978078f, 0.978098f, 0.978118f, 0.978138f,
+ 0.978158f, 0.978178f, 0.978198f, 0.978218f, 0.978238f, 0.978258f, 0.978278f, 0.978298f,
+ 0.978317f, 0.978337f, 0.978357f, 0.978377f, 0.978397f, 0.978417f, 0.978436f, 0.978456f,
+ 0.978476f, 0.978496f, 0.978516f, 0.978535f, 0.978555f, 0.978575f, 0.978594f, 0.978614f,
+ 0.978634f, 0.978654f, 0.978673f, 0.978693f, 0.978713f, 0.978732f, 0.978752f, 0.978772f,
+ 0.978791f, 0.978811f, 0.978831f, 0.978850f, 0.978870f, 0.978889f, 0.978909f, 0.978929f,
+ 0.978948f, 0.978968f, 0.978987f, 0.979007f, 0.979026f, 0.979046f, 0.979065f, 0.979085f,
+ 0.979104f, 0.979124f, 0.979143f, 0.979163f, 0.979182f, 0.979202f, 0.979221f, 0.979241f,
+ 0.979260f, 0.979280f, 0.979299f, 0.979318f, 0.979338f, 0.979357f, 0.979376f, 0.979396f,
+ 0.979415f, 0.979435f, 0.979454f, 0.979473f, 0.979493f, 0.979512f, 0.979531f, 0.979550f,
+ 0.979570f, 0.979589f, 0.979608f, 0.979628f, 0.979647f, 0.979666f, 0.979685f, 0.979704f,
+ 0.979724f, 0.979743f, 0.979762f, 0.979781f, 0.979800f, 0.979820f, 0.979839f, 0.979858f,
+ 0.979877f, 0.979896f, 0.979915f, 0.979934f, 0.979954f, 0.979973f, 0.979992f, 0.980011f,
+ 0.980030f, 0.980049f, 0.980068f, 0.980087f, 0.980106f, 0.980125f, 0.980144f, 0.980163f,
+ 0.980182f, 0.980201f, 0.980220f, 0.980239f, 0.980258f, 0.980277f, 0.980296f, 0.980315f,
+ 0.980334f, 0.980353f, 0.980372f, 0.980390f, 0.980409f, 0.980428f, 0.980447f, 0.980466f,
+ 0.980485f, 0.980504f, 0.980523f, 0.980541f, 0.980560f, 0.980579f, 0.980598f, 0.980617f,
+ 0.980635f, 0.980654f, 0.980673f, 0.980692f, 0.980710f, 0.980729f, 0.980748f, 0.980767f,
+ 0.980785f, 0.980804f, 0.980823f, 0.980841f, 0.980860f, 0.980879f, 0.980897f, 0.980916f,
+ 0.980935f, 0.980953f, 0.980972f, 0.980990f, 0.981009f, 0.981028f, 0.981046f, 0.981065f,
+ 0.981083f, 0.981102f, 0.981120f, 0.981139f, 0.981158f, 0.981176f, 0.981195f, 0.981213f,
+ 0.981232f, 0.981250f, 0.981269f, 0.981287f, 0.981305f, 0.981324f, 0.981342f, 0.981361f,
+ 0.981379f, 0.981398f, 0.981416f, 0.981434f, 0.981453f, 0.981471f, 0.981490f, 0.981508f,
+ 0.981526f, 0.981545f, 0.981563f, 0.981581f, 0.981600f, 0.981618f, 0.981636f, 0.981654f,
+ 0.981673f, 0.981691f, 0.981709f, 0.981727f, 0.981746f, 0.981764f, 0.981782f, 0.981800f,
+ 0.981819f, 0.981837f, 0.981855f, 0.981873f, 0.981891f, 0.981909f, 0.981928f, 0.981946f,
+ 0.981964f, 0.981982f, 0.982000f, 0.982018f, 0.982036f, 0.982054f, 0.982072f, 0.982091f,
+ 0.982109f, 0.982127f, 0.982145f, 0.982163f, 0.982181f, 0.982199f, 0.982217f, 0.982235f,
+ 0.982253f, 0.982271f, 0.982289f, 0.982307f, 0.982325f, 0.982343f, 0.982360f, 0.982378f,
+ 0.982396f, 0.982414f, 0.982432f, 0.982450f, 0.982468f, 0.982486f, 0.982504f, 0.982521f,
+ 0.982539f, 0.982557f, 0.982575f, 0.982593f, 0.982611f, 0.982628f, 0.982646f, 0.982664f,
+ 0.982682f, 0.982699f, 0.982717f, 0.982735f, 0.982753f, 0.982770f, 0.982788f, 0.982806f,
+ 0.982824f, 0.982841f, 0.982859f, 0.982877f, 0.982894f, 0.982912f, 0.982930f, 0.982947f,
+ 0.982965f, 0.982982f, 0.983000f, 0.983018f, 0.983035f, 0.983053f, 0.983070f, 0.983088f,
+ 0.983105f, 0.983123f, 0.983141f, 0.983158f, 0.983176f, 0.983193f, 0.983211f, 0.983228f,
+ 0.983246f, 0.983263f, 0.983281f, 0.983298f, 0.983315f, 0.983333f, 0.983350f, 0.983368f,
+ 0.983385f, 0.983402f, 0.983420f, 0.983437f, 0.983455f, 0.983472f, 0.983489f, 0.983507f,
+ 0.983524f, 0.983541f, 0.983559f, 0.983576f, 0.983593f, 0.983611f, 0.983628f, 0.983645f,
+ 0.983662f, 0.983680f, 0.983697f, 0.983714f, 0.983731f, 0.983749f, 0.983766f, 0.983783f,
+ 0.983800f, 0.983817f, 0.983835f, 0.983852f, 0.983869f, 0.983886f, 0.983903f, 0.983920f,
+ 0.983937f, 0.983955f, 0.983972f, 0.983989f, 0.984006f, 0.984023f, 0.984040f, 0.984057f,
+ 0.984074f, 0.984091f, 0.984108f, 0.984125f, 0.984142f, 0.984159f, 0.984176f, 0.984193f,
+ 0.984210f, 0.984227f, 0.984244f, 0.984261f, 0.984278f, 0.984295f, 0.984312f, 0.984329f,
+ 0.984346f, 0.984362f, 0.984379f, 0.984396f, 0.984413f, 0.984430f, 0.984447f, 0.984464f,
+ 0.984480f, 0.984497f, 0.984514f, 0.984531f, 0.984548f, 0.984564f, 0.984581f, 0.984598f,
+ 0.984615f, 0.984632f, 0.984648f, 0.984665f, 0.984682f, 0.984698f, 0.984715f, 0.984732f,
+ 0.984748f, 0.984765f, 0.984782f, 0.984798f, 0.984815f, 0.984832f, 0.984848f, 0.984865f,
+ 0.984882f, 0.984898f, 0.984915f, 0.984931f, 0.984948f, 0.984965f, 0.984981f, 0.984998f,
+ 0.985014f, 0.985031f, 0.985047f, 0.985064f, 0.985080f, 0.985097f, 0.985113f, 0.985130f,
+ 0.985146f, 0.985163f, 0.985179f, 0.985196f, 0.985212f, 0.985228f, 0.985245f, 0.985261f,
+ 0.985278f, 0.985294f, 0.985310f, 0.985327f, 0.985343f, 0.985359f, 0.985376f, 0.985392f,
+ 0.985408f, 0.985425f, 0.985441f, 0.985457f, 0.985474f, 0.985490f, 0.985506f, 0.985523f,
+ 0.985539f, 0.985555f, 0.985571f, 0.985587f, 0.985604f, 0.985620f, 0.985636f, 0.985652f,
+ 0.985668f, 0.985685f, 0.985701f, 0.985717f, 0.985733f, 0.985749f, 0.985765f, 0.985781f,
+ 0.985798f, 0.985814f, 0.985830f, 0.985846f, 0.985862f, 0.985878f, 0.985894f, 0.985910f,
+ 0.985926f, 0.985942f, 0.985958f, 0.985974f, 0.985990f, 0.986006f, 0.986022f, 0.986038f,
+ 0.986054f, 0.986070f, 0.986086f, 0.986102f, 0.986118f, 0.986134f, 0.986150f, 0.986165f,
+ 0.986181f, 0.986197f, 0.986213f, 0.986229f, 0.986245f, 0.986261f, 0.986276f, 0.986292f,
+ 0.986308f, 0.986324f, 0.986340f, 0.986355f, 0.986371f, 0.986387f, 0.986403f, 0.986419f,
+ 0.986434f, 0.986450f, 0.986466f, 0.986481f, 0.986497f, 0.986513f, 0.986529f, 0.986544f,
+ 0.986560f, 0.986576f, 0.986591f, 0.986607f, 0.986623f, 0.986638f, 0.986654f, 0.986669f,
+ 0.986685f, 0.986701f, 0.986716f, 0.986732f, 0.986747f, 0.986763f, 0.986778f, 0.986794f,
+ 0.986809f, 0.986825f, 0.986840f, 0.986856f, 0.986871f, 0.986887f, 0.986902f, 0.986918f,
+ 0.986933f, 0.986949f, 0.986964f, 0.986980f, 0.986995f, 0.987010f, 0.987026f, 0.987041f,
+ 0.987057f, 0.987072f, 0.987087f, 0.987103f, 0.987118f, 0.987133f, 0.987149f, 0.987164f,
+ 0.987179f, 0.987195f, 0.987210f, 0.987225f, 0.987240f, 0.987256f, 0.987271f, 0.987286f,
+ 0.987301f, 0.987317f, 0.987332f, 0.987347f, 0.987362f, 0.987377f, 0.987393f, 0.987408f,
+ 0.987423f, 0.987438f, 0.987453f, 0.987468f, 0.987484f, 0.987499f, 0.987514f, 0.987529f,
+ 0.987544f, 0.987559f, 0.987574f, 0.987589f, 0.987604f, 0.987619f, 0.987634f, 0.987649f,
+ 0.987664f, 0.987679f, 0.987694f, 0.987709f, 0.987724f, 0.987739f, 0.987754f, 0.987769f,
+ 0.987784f, 0.987799f, 0.987814f, 0.987829f, 0.987844f, 0.987859f, 0.987874f, 0.987889f,
+ 0.987903f, 0.987918f, 0.987933f, 0.987948f, 0.987963f, 0.987978f, 0.987992f, 0.988007f,
+ 0.988022f, 0.988037f, 0.988052f, 0.988066f, 0.988081f, 0.988096f, 0.988111f, 0.988125f,
+ 0.988140f, 0.988155f, 0.988169f, 0.988184f, 0.988199f, 0.988214f, 0.988228f, 0.988243f,
+ 0.988258f, 0.988272f, 0.988287f, 0.988301f, 0.988316f, 0.988331f, 0.988345f, 0.988360f,
+ 0.988374f, 0.988389f, 0.988404f, 0.988418f, 0.988433f, 0.988447f, 0.988462f, 0.988476f,
+ 0.988491f, 0.988505f, 0.988520f, 0.988534f, 0.988549f, 0.988563f, 0.988578f, 0.988592f,
+ 0.988607f, 0.988621f, 0.988635f, 0.988650f, 0.988664f, 0.988679f, 0.988693f, 0.988707f,
+ 0.988722f, 0.988736f, 0.988750f, 0.988765f, 0.988779f, 0.988793f, 0.988808f, 0.988822f,
+ 0.988836f, 0.988851f, 0.988865f, 0.988879f, 0.988893f, 0.988908f, 0.988922f, 0.988936f,
+ 0.988950f, 0.988964f, 0.988979f, 0.988993f, 0.989007f, 0.989021f, 0.989035f, 0.989050f,
+ 0.989064f, 0.989078f, 0.989092f, 0.989106f, 0.989120f, 0.989134f, 0.989148f, 0.989162f,
+ 0.989177f, 0.989191f, 0.989205f, 0.989219f, 0.989233f, 0.989247f, 0.989261f, 0.989275f,
+ 0.989289f, 0.989303f, 0.989317f, 0.989331f, 0.989345f, 0.989359f, 0.989373f, 0.989386f,
+ 0.989400f, 0.989414f, 0.989428f, 0.989442f, 0.989456f, 0.989470f, 0.989484f, 0.989498f,
+ 0.989511f, 0.989525f, 0.989539f, 0.989553f, 0.989567f, 0.989581f, 0.989594f, 0.989608f,
+ 0.989622f, 0.989636f, 0.989650f, 0.989663f, 0.989677f, 0.989691f, 0.989704f, 0.989718f,
+ 0.989732f, 0.989746f, 0.989759f, 0.989773f, 0.989787f, 0.989800f, 0.989814f, 0.989828f,
+ 0.989841f, 0.989855f, 0.989869f, 0.989882f, 0.989896f, 0.989909f, 0.989923f, 0.989936f,
+ 0.989950f, 0.989964f, 0.989977f, 0.989991f, 0.990004f, 0.990018f, 0.990031f, 0.990045f,
+ 0.990058f, 0.990072f, 0.990085f, 0.990099f, 0.990112f, 0.990126f, 0.990139f, 0.990152f,
+ 0.990166f, 0.990179f, 0.990193f, 0.990206f, 0.990219f, 0.990233f, 0.990246f, 0.990259f,
+ 0.990273f, 0.990286f, 0.990299f, 0.990313f, 0.990326f, 0.990339f, 0.990353f, 0.990366f,
+ 0.990379f, 0.990393f, 0.990406f, 0.990419f, 0.990432f, 0.990445f, 0.990459f, 0.990472f,
+ 0.990485f, 0.990498f, 0.990511f, 0.990525f, 0.990538f, 0.990551f, 0.990564f, 0.990577f,
+ 0.990590f, 0.990603f, 0.990617f, 0.990630f, 0.990643f, 0.990656f, 0.990669f, 0.990682f,
+ 0.990695f, 0.990708f, 0.990721f, 0.990734f, 0.990747f, 0.990760f, 0.990773f, 0.990786f,
+ 0.990799f, 0.990812f, 0.990825f, 0.990838f, 0.990851f, 0.990864f, 0.990877f, 0.990890f,
+ 0.990903f, 0.990916f, 0.990928f, 0.990941f, 0.990954f, 0.990967f, 0.990980f, 0.990993f,
+ 0.991006f, 0.991018f, 0.991031f, 0.991044f, 0.991057f, 0.991070f, 0.991082f, 0.991095f,
+ 0.991108f, 0.991121f, 0.991133f, 0.991146f, 0.991159f, 0.991172f, 0.991184f, 0.991197f,
+ 0.991210f, 0.991222f, 0.991235f, 0.991248f, 0.991260f, 0.991273f, 0.991286f, 0.991298f,
+ 0.991311f, 0.991323f, 0.991336f, 0.991349f, 0.991361f, 0.991374f, 0.991386f, 0.991399f,
+ 0.991411f, 0.991424f, 0.991437f, 0.991449f, 0.991462f, 0.991474f, 0.991487f, 0.991499f,
+ 0.991511f, 0.991524f, 0.991536f, 0.991549f, 0.991561f, 0.991574f, 0.991586f, 0.991598f,
+ 0.991611f, 0.991623f, 0.991636f, 0.991648f, 0.991660f, 0.991673f, 0.991685f, 0.991697f,
+ 0.991710f, 0.991722f, 0.991734f, 0.991747f, 0.991759f, 0.991771f, 0.991783f, 0.991796f,
+ 0.991808f, 0.991820f, 0.991832f, 0.991845f, 0.991857f, 0.991869f, 0.991881f, 0.991894f,
+ 0.991906f, 0.991918f, 0.991930f, 0.991942f, 0.991954f, 0.991966f, 0.991979f, 0.991991f,
+ 0.992003f, 0.992015f, 0.992027f, 0.992039f, 0.992051f, 0.992063f, 0.992075f, 0.992087f,
+ 0.992099f, 0.992111f, 0.992123f, 0.992135f, 0.992147f, 0.992159f, 0.992171f, 0.992183f,
+ 0.992195f, 0.992207f, 0.992219f, 0.992231f, 0.992243f, 0.992255f, 0.992267f, 0.992279f,
+ 0.992291f, 0.992302f, 0.992314f, 0.992326f, 0.992338f, 0.992350f, 0.992362f, 0.992374f,
+ 0.992385f, 0.992397f, 0.992409f, 0.992421f, 0.992433f, 0.992444f, 0.992456f, 0.992468f,
+ 0.992480f, 0.992491f, 0.992503f, 0.992515f, 0.992526f, 0.992538f, 0.992550f, 0.992561f,
+ 0.992573f, 0.992585f, 0.992596f, 0.992608f, 0.992620f, 0.992631f, 0.992643f, 0.992655f,
+ 0.992666f, 0.992678f, 0.992689f, 0.992701f, 0.992712f, 0.992724f, 0.992736f, 0.992747f,
+ 0.992759f, 0.992770f, 0.992782f, 0.992793f, 0.992805f, 0.992816f, 0.992828f, 0.992839f,
+ 0.992850f, 0.992862f, 0.992873f, 0.992885f, 0.992896f, 0.992908f, 0.992919f, 0.992930f,
+ 0.992942f, 0.992953f, 0.992964f, 0.992976f, 0.992987f, 0.992998f, 0.993010f, 0.993021f,
+ 0.993032f, 0.993044f, 0.993055f, 0.993066f, 0.993077f, 0.993089f, 0.993100f, 0.993111f,
+ 0.993122f, 0.993134f, 0.993145f, 0.993156f, 0.993167f, 0.993178f, 0.993190f, 0.993201f,
+ 0.993212f, 0.993223f, 0.993234f, 0.993245f, 0.993257f, 0.993268f, 0.993279f, 0.993290f,
+ 0.993301f, 0.993312f, 0.993323f, 0.993334f, 0.993345f, 0.993356f, 0.993367f, 0.993378f,
+ 0.993389f, 0.993400f, 0.993411f, 0.993422f, 0.993433f, 0.993444f, 0.993455f, 0.993466f,
+ 0.993477f, 0.993488f, 0.993499f, 0.993510f, 0.993521f, 0.993532f, 0.993542f, 0.993553f,
+ 0.993564f, 0.993575f, 0.993586f, 0.993597f, 0.993608f, 0.993618f, 0.993629f, 0.993640f,
+ 0.993651f, 0.993662f, 0.993672f, 0.993683f, 0.993694f, 0.993705f, 0.993715f, 0.993726f,
+ 0.993737f, 0.993747f, 0.993758f, 0.993769f, 0.993779f, 0.993790f, 0.993801f, 0.993811f,
+ 0.993822f, 0.993833f, 0.993843f, 0.993854f, 0.993865f, 0.993875f, 0.993886f, 0.993896f,
+ 0.993907f, 0.993918f, 0.993928f, 0.993939f, 0.993949f, 0.993960f, 0.993970f, 0.993981f,
+ 0.993991f, 0.994002f, 0.994012f, 0.994023f, 0.994033f, 0.994044f, 0.994054f, 0.994064f,
+ 0.994075f, 0.994085f, 0.994096f, 0.994106f, 0.994116f, 0.994127f, 0.994137f, 0.994148f,
+ 0.994158f, 0.994168f, 0.994179f, 0.994189f, 0.994199f, 0.994210f, 0.994220f, 0.994230f,
+ 0.994240f, 0.994251f, 0.994261f, 0.994271f, 0.994281f, 0.994292f, 0.994302f, 0.994312f,
+ 0.994322f, 0.994333f, 0.994343f, 0.994353f, 0.994363f, 0.994373f, 0.994383f, 0.994394f,
+ 0.994404f, 0.994414f, 0.994424f, 0.994434f, 0.994444f, 0.994454f, 0.994464f, 0.994474f,
+ 0.994484f, 0.994494f, 0.994505f, 0.994515f, 0.994525f, 0.994535f, 0.994545f, 0.994555f,
+ 0.994565f, 0.994575f, 0.994585f, 0.994594f, 0.994604f, 0.994614f, 0.994624f, 0.994634f,
+ 0.994644f, 0.994654f, 0.994664f, 0.994674f, 0.994684f, 0.994694f, 0.994703f, 0.994713f,
+ 0.994723f, 0.994733f, 0.994743f, 0.994753f, 0.994762f, 0.994772f, 0.994782f, 0.994792f,
+ 0.994802f, 0.994811f, 0.994821f, 0.994831f, 0.994841f, 0.994850f, 0.994860f, 0.994870f,
+ 0.994879f, 0.994889f, 0.994899f, 0.994908f, 0.994918f, 0.994928f, 0.994937f, 0.994947f,
+ 0.994957f, 0.994966f, 0.994976f, 0.994985f, 0.994995f, 0.995005f, 0.995014f, 0.995024f,
+ 0.995033f, 0.995043f, 0.995052f, 0.995062f, 0.995071f, 0.995081f, 0.995090f, 0.995100f,
+ 0.995109f, 0.995119f, 0.995128f, 0.995138f, 0.995147f, 0.995156f, 0.995166f, 0.995175f,
+ 0.995185f, 0.995194f, 0.995203f, 0.995213f, 0.995222f, 0.995232f, 0.995241f, 0.995250f,
+ 0.995260f, 0.995269f, 0.995278f, 0.995288f, 0.995297f, 0.995306f, 0.995315f, 0.995325f,
+ 0.995334f, 0.995343f, 0.995352f, 0.995362f, 0.995371f, 0.995380f, 0.995389f, 0.995398f,
+ 0.995408f, 0.995417f, 0.995426f, 0.995435f, 0.995444f, 0.995453f, 0.995463f, 0.995472f,
+ 0.995481f, 0.995490f, 0.995499f, 0.995508f, 0.995517f, 0.995526f, 0.995535f, 0.995544f,
+ 0.995553f, 0.995562f, 0.995571f, 0.995580f, 0.995589f, 0.995598f, 0.995607f, 0.995616f,
+ 0.995625f, 0.995634f, 0.995643f, 0.995652f, 0.995661f, 0.995670f, 0.995679f, 0.995688f,
+ 0.995697f, 0.995705f, 0.995714f, 0.995723f, 0.995732f, 0.995741f, 0.995750f, 0.995759f,
+ 0.995767f, 0.995776f, 0.995785f, 0.995794f, 0.995803f, 0.995811f, 0.995820f, 0.995829f,
+ 0.995838f, 0.995846f, 0.995855f, 0.995864f, 0.995872f, 0.995881f, 0.995890f, 0.995899f,
+ 0.995907f, 0.995916f, 0.995925f, 0.995933f, 0.995942f, 0.995950f, 0.995959f, 0.995968f,
+ 0.995976f, 0.995985f, 0.995993f, 0.996002f, 0.996011f, 0.996019f, 0.996028f, 0.996036f,
+ 0.996045f, 0.996053f, 0.996062f, 0.996070f, 0.996079f, 0.996087f, 0.996096f, 0.996104f,
+ 0.996113f, 0.996121f, 0.996129f, 0.996138f, 0.996146f, 0.996155f, 0.996163f, 0.996171f,
+ 0.996180f, 0.996188f, 0.996197f, 0.996205f, 0.996213f, 0.996222f, 0.996230f, 0.996238f,
+ 0.996247f, 0.996255f, 0.996263f, 0.996271f, 0.996280f, 0.996288f, 0.996296f, 0.996304f,
+ 0.996313f, 0.996321f, 0.996329f, 0.996337f, 0.996345f, 0.996354f, 0.996362f, 0.996370f,
+ 0.996378f, 0.996386f, 0.996394f, 0.996403f, 0.996411f, 0.996419f, 0.996427f, 0.996435f,
+ 0.996443f, 0.996451f, 0.996459f, 0.996467f, 0.996475f, 0.996483f, 0.996491f, 0.996499f,
+ 0.996507f, 0.996515f, 0.996523f, 0.996531f, 0.996539f, 0.996547f, 0.996555f, 0.996563f,
+ 0.996571f, 0.996579f, 0.996587f, 0.996595f, 0.996603f, 0.996611f, 0.996619f, 0.996626f,
+ 0.996634f, 0.996642f, 0.996650f, 0.996658f, 0.996666f, 0.996674f, 0.996681f, 0.996689f,
+ 0.996697f, 0.996705f, 0.996712f, 0.996720f, 0.996728f, 0.996736f, 0.996743f, 0.996751f,
+ 0.996759f, 0.996767f, 0.996774f, 0.996782f, 0.996790f, 0.996797f, 0.996805f, 0.996813f,
+ 0.996820f, 0.996828f, 0.996836f, 0.996843f, 0.996851f, 0.996858f, 0.996866f, 0.996874f,
+ 0.996881f, 0.996889f, 0.996896f, 0.996904f, 0.996911f, 0.996919f, 0.996926f, 0.996934f,
+ 0.996941f, 0.996949f, 0.996956f, 0.996964f, 0.996971f, 0.996979f, 0.996986f, 0.996994f,
+ 0.997001f, 0.997008f, 0.997016f, 0.997023f, 0.997031f, 0.997038f, 0.997045f, 0.997053f,
+ 0.997060f, 0.997067f, 0.997075f, 0.997082f, 0.997089f, 0.997097f, 0.997104f, 0.997111f,
+ 0.997119f, 0.997126f, 0.997133f, 0.997140f, 0.997148f, 0.997155f, 0.997162f, 0.997169f,
+ 0.997176f, 0.997184f, 0.997191f, 0.997198f, 0.997205f, 0.997212f, 0.997219f, 0.997227f,
+ 0.997234f, 0.997241f, 0.997248f, 0.997255f, 0.997262f, 0.997269f, 0.997276f, 0.997283f,
+ 0.997290f, 0.997298f, 0.997305f, 0.997312f, 0.997319f, 0.997326f, 0.997333f, 0.997340f,
+ 0.997347f, 0.997354f, 0.997361f, 0.997368f, 0.997374f, 0.997381f, 0.997388f, 0.997395f,
+ 0.997402f, 0.997409f, 0.997416f, 0.997423f, 0.997430f, 0.997437f, 0.997443f, 0.997450f,
+ 0.997457f, 0.997464f, 0.997471f, 0.997478f, 0.997484f, 0.997491f, 0.997498f, 0.997505f,
+ 0.997511f, 0.997518f, 0.997525f, 0.997532f, 0.997538f, 0.997545f, 0.997552f, 0.997559f,
+ 0.997565f, 0.997572f, 0.997579f, 0.997585f, 0.997592f, 0.997599f, 0.997605f, 0.997612f,
+ 0.997618f, 0.997625f, 0.997632f, 0.997638f, 0.997645f, 0.997651f, 0.997658f, 0.997665f,
+ 0.997671f, 0.997678f, 0.997684f, 0.997691f, 0.997697f, 0.997704f, 0.997710f, 0.997717f,
+ 0.997723f, 0.997730f, 0.997736f, 0.997742f, 0.997749f, 0.997755f, 0.997762f, 0.997768f,
+ 0.997774f, 0.997781f, 0.997787f, 0.997794f, 0.997800f, 0.997806f, 0.997813f, 0.997819f,
+ 0.997825f, 0.997832f, 0.997838f, 0.997844f, 0.997851f, 0.997857f, 0.997863f, 0.997869f,
+ 0.997876f, 0.997882f, 0.997888f, 0.997894f, 0.997901f, 0.997907f, 0.997913f, 0.997919f,
+ 0.997925f, 0.997931f, 0.997938f, 0.997944f, 0.997950f, 0.997956f, 0.997962f, 0.997968f,
+ 0.997974f, 0.997980f, 0.997987f, 0.997993f, 0.997999f, 0.998005f, 0.998011f, 0.998017f,
+ 0.998023f, 0.998029f, 0.998035f, 0.998041f, 0.998047f, 0.998053f, 0.998059f, 0.998065f,
+ 0.998071f, 0.998077f, 0.998083f, 0.998089f, 0.998094f, 0.998100f, 0.998106f, 0.998112f,
+ 0.998118f, 0.998124f, 0.998130f, 0.998136f, 0.998142f, 0.998147f, 0.998153f, 0.998159f,
+ 0.998165f, 0.998171f, 0.998176f, 0.998182f, 0.998188f, 0.998194f, 0.998200f, 0.998205f,
+ 0.998211f, 0.998217f, 0.998222f, 0.998228f, 0.998234f, 0.998240f, 0.998245f, 0.998251f,
+ 0.998257f, 0.998262f, 0.998268f, 0.998273f, 0.998279f, 0.998285f, 0.998290f, 0.998296f,
+ 0.998302f, 0.998307f, 0.998313f, 0.998318f, 0.998324f, 0.998329f, 0.998335f, 0.998340f,
+ 0.998346f, 0.998351f, 0.998357f, 0.998362f, 0.998368f, 0.998373f, 0.998379f, 0.998384f,
+ 0.998390f, 0.998395f, 0.998401f, 0.998406f, 0.998411f, 0.998417f, 0.998422f, 0.998428f,
+ 0.998433f, 0.998438f, 0.998444f, 0.998449f, 0.998454f, 0.998460f, 0.998465f, 0.998470f,
+ 0.998476f, 0.998481f, 0.998486f, 0.998491f, 0.998497f, 0.998502f, 0.998507f, 0.998512f,
+ 0.998518f, 0.998523f, 0.998528f, 0.998533f, 0.998538f, 0.998544f, 0.998549f, 0.998554f,
+ 0.998559f, 0.998564f, 0.998569f, 0.998574f, 0.998580f, 0.998585f, 0.998590f, 0.998595f,
+ 0.998600f, 0.998605f, 0.998610f, 0.998615f, 0.998620f, 0.998625f, 0.998630f, 0.998635f,
+ 0.998640f, 0.998645f, 0.998650f, 0.998655f, 0.998660f, 0.998665f, 0.998670f, 0.998675f,
+ 0.998680f, 0.998685f, 0.998690f, 0.998695f, 0.998700f, 0.998704f, 0.998709f, 0.998714f,
+ 0.998719f, 0.998724f, 0.998729f, 0.998734f, 0.998738f, 0.998743f, 0.998748f, 0.998753f,
+ 0.998758f, 0.998762f, 0.998767f, 0.998772f, 0.998777f, 0.998781f, 0.998786f, 0.998791f,
+ 0.998795f, 0.998800f, 0.998805f, 0.998810f, 0.998814f, 0.998819f, 0.998824f, 0.998828f,
+ 0.998833f, 0.998837f, 0.998842f, 0.998847f, 0.998851f, 0.998856f, 0.998860f, 0.998865f,
+ 0.998870f, 0.998874f, 0.998879f, 0.998883f, 0.998888f, 0.998892f, 0.998897f, 0.998901f,
+ 0.998906f, 0.998910f, 0.998915f, 0.998919f, 0.998924f, 0.998928f, 0.998932f, 0.998937f,
+ 0.998941f, 0.998946f, 0.998950f, 0.998954f, 0.998959f, 0.998963f, 0.998968f, 0.998972f,
+ 0.998976f, 0.998981f, 0.998985f, 0.998989f, 0.998994f, 0.998998f, 0.999002f, 0.999006f,
+ 0.999011f, 0.999015f, 0.999019f, 0.999023f, 0.999028f, 0.999032f, 0.999036f, 0.999040f,
+ 0.999044f, 0.999049f, 0.999053f, 0.999057f, 0.999061f, 0.999065f, 0.999069f, 0.999074f,
+ 0.999078f, 0.999082f, 0.999086f, 0.999090f, 0.999094f, 0.999098f, 0.999102f, 0.999106f,
+ 0.999110f, 0.999114f, 0.999118f, 0.999122f, 0.999126f, 0.999130f, 0.999134f, 0.999138f,
+ 0.999142f, 0.999146f, 0.999150f, 0.999154f, 0.999158f, 0.999162f, 0.999166f, 0.999170f,
+ 0.999174f, 0.999178f, 0.999182f, 0.999186f, 0.999189f, 0.999193f, 0.999197f, 0.999201f,
+ 0.999205f, 0.999209f, 0.999212f, 0.999216f, 0.999220f, 0.999224f, 0.999228f, 0.999231f,
+ 0.999235f, 0.999239f, 0.999243f, 0.999246f, 0.999250f, 0.999254f, 0.999257f, 0.999261f,
+ 0.999265f, 0.999268f, 0.999272f, 0.999276f, 0.999279f, 0.999283f, 0.999287f, 0.999290f,
+ 0.999294f, 0.999297f, 0.999301f, 0.999305f, 0.999308f, 0.999312f, 0.999315f, 0.999319f,
+ 0.999322f, 0.999326f, 0.999329f, 0.999333f, 0.999336f, 0.999340f, 0.999343f, 0.999347f,
+ 0.999350f, 0.999354f, 0.999357f, 0.999361f, 0.999364f, 0.999367f, 0.999371f, 0.999374f,
+ 0.999378f, 0.999381f, 0.999384f, 0.999388f, 0.999391f, 0.999394f, 0.999398f, 0.999401f,
+ 0.999404f, 0.999408f, 0.999411f, 0.999414f, 0.999418f, 0.999421f, 0.999424f, 0.999427f,
+ 0.999431f, 0.999434f, 0.999437f, 0.999440f, 0.999443f, 0.999447f, 0.999450f, 0.999453f,
+ 0.999456f, 0.999459f, 0.999462f, 0.999466f, 0.999469f, 0.999472f, 0.999475f, 0.999478f,
+ 0.999481f, 0.999484f, 0.999487f, 0.999490f, 0.999493f, 0.999497f, 0.999500f, 0.999503f,
+ 0.999506f, 0.999509f, 0.999512f, 0.999515f, 0.999518f, 0.999521f, 0.999524f, 0.999527f,
+ 0.999529f, 0.999532f, 0.999535f, 0.999538f, 0.999541f, 0.999544f, 0.999547f, 0.999550f,
+ 0.999553f, 0.999556f, 0.999558f, 0.999561f, 0.999564f, 0.999567f, 0.999570f, 0.999573f,
+ 0.999575f, 0.999578f, 0.999581f, 0.999584f, 0.999586f, 0.999589f, 0.999592f, 0.999595f,
+ 0.999597f, 0.999600f, 0.999603f, 0.999605f, 0.999608f, 0.999611f, 0.999614f, 0.999616f,
+ 0.999619f, 0.999621f, 0.999624f, 0.999627f, 0.999629f, 0.999632f, 0.999635f, 0.999637f,
+ 0.999640f, 0.999642f, 0.999645f, 0.999647f, 0.999650f, 0.999652f, 0.999655f, 0.999658f,
+ 0.999660f, 0.999663f, 0.999665f, 0.999667f, 0.999670f, 0.999672f, 0.999675f, 0.999677f,
+ 0.999680f, 0.999682f, 0.999685f, 0.999687f, 0.999689f, 0.999692f, 0.999694f, 0.999696f,
+ 0.999699f, 0.999701f, 0.999704f, 0.999706f, 0.999708f, 0.999710f, 0.999713f, 0.999715f,
+ 0.999717f, 0.999720f, 0.999722f, 0.999724f, 0.999726f, 0.999729f, 0.999731f, 0.999733f,
+ 0.999735f, 0.999738f, 0.999740f, 0.999742f, 0.999744f, 0.999746f, 0.999748f, 0.999750f,
+ 0.999753f, 0.999755f, 0.999757f, 0.999759f, 0.999761f, 0.999763f, 0.999765f, 0.999767f,
+ 0.999769f, 0.999771f, 0.999774f, 0.999776f, 0.999778f, 0.999780f, 0.999782f, 0.999784f,
+ 0.999786f, 0.999788f, 0.999790f, 0.999792f, 0.999793f, 0.999795f, 0.999797f, 0.999799f,
+ 0.999801f, 0.999803f, 0.999805f, 0.999807f, 0.999809f, 0.999811f, 0.999812f, 0.999814f,
+ 0.999816f, 0.999818f, 0.999820f, 0.999822f, 0.999823f, 0.999825f, 0.999827f, 0.999829f,
+ 0.999831f, 0.999832f, 0.999834f, 0.999836f, 0.999838f, 0.999839f, 0.999841f, 0.999843f,
+ 0.999844f, 0.999846f, 0.999848f, 0.999849f, 0.999851f, 0.999853f, 0.999854f, 0.999856f,
+ 0.999858f, 0.999859f, 0.999861f, 0.999862f, 0.999864f, 0.999866f, 0.999867f, 0.999869f,
+ 0.999870f, 0.999872f, 0.999873f, 0.999875f, 0.999876f, 0.999878f, 0.999879f, 0.999881f,
+ 0.999882f, 0.999884f, 0.999885f, 0.999887f, 0.999888f, 0.999890f, 0.999891f, 0.999892f,
+ 0.999894f, 0.999895f, 0.999897f, 0.999898f, 0.999899f, 0.999901f, 0.999902f, 0.999903f,
+ 0.999905f, 0.999906f, 0.999907f, 0.999909f, 0.999910f, 0.999911f, 0.999913f, 0.999914f,
+ 0.999915f, 0.999916f, 0.999917f, 0.999919f, 0.999920f, 0.999921f, 0.999922f, 0.999924f,
+ 0.999925f, 0.999926f, 0.999927f, 0.999928f, 0.999929f, 0.999930f, 0.999932f, 0.999933f,
+ 0.999934f, 0.999935f, 0.999936f, 0.999937f, 0.999938f, 0.999939f, 0.999940f, 0.999941f,
+ 0.999942f, 0.999943f, 0.999944f, 0.999945f, 0.999946f, 0.999947f, 0.999948f, 0.999949f,
+ 0.999950f, 0.999951f, 0.999952f, 0.999953f, 0.999954f, 0.999955f, 0.999956f, 0.999957f,
+ 0.999958f, 0.999959f, 0.999959f, 0.999960f, 0.999961f, 0.999962f, 0.999963f, 0.999964f,
+ 0.999964f, 0.999965f, 0.999966f, 0.999967f, 0.999968f, 0.999968f, 0.999969f, 0.999970f,
+ 0.999971f, 0.999971f, 0.999972f, 0.999973f, 0.999973f, 0.999974f, 0.999975f, 0.999976f,
+ 0.999976f, 0.999977f, 0.999977f, 0.999978f, 0.999979f, 0.999979f, 0.999980f, 0.999981f,
+ 0.999981f, 0.999982f, 0.999982f, 0.999983f, 0.999983f, 0.999984f, 0.999985f, 0.999985f,
+ 0.999986f, 0.999986f, 0.999987f, 0.999987f, 0.999988f, 0.999988f, 0.999988f, 0.999989f,
+ 0.999989f, 0.999990f, 0.999990f, 0.999991f, 0.999991f, 0.999991f, 0.999992f, 0.999992f,
+ 0.999993f, 0.999993f, 0.999993f, 0.999994f, 0.999994f, 0.999994f, 0.999995f, 0.999995f,
+ 0.999995f, 0.999996f, 0.999996f, 0.999996f, 0.999996f, 0.999997f, 0.999997f, 0.999997f,
+ 0.999997f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999999f, 0.999999f,
+ 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 1.000000f, 1.000000f,
+ 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f
+};
+
+static const float *cosTables[17] = {
+ 0 , 0 , 0 , 0 ,
+ cosTable16 , cosTable32 , cosTable64 , cosTable128 ,
+ cosTable256 , cosTable512 , cosTable1024 , cosTable2048 ,
+ cosTable4096, cosTable8192, cosTable16384, cosTable32768,
+ cosTable65536
+};
+
+const float *getCosineTable(int bits) {
+ assert((bits >= 4) && (bits <= 16));
+
+ return cosTables[bits];
+}
+
+} // End of namespace Common
diff --git a/common/cosinetables.h b/common/cosinetables.h
new file mode 100644
index 0000000000..5744d21569
--- /dev/null
+++ b/common/cosinetables.h
@@ -0,0 +1,37 @@
+/* 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 COMMON_COSINETABLES_H
+#define COMMON_COSINETABLES_H
+
+namespace Common {
+
+/**
+ * Get a cosine table with the specified bit precision
+ *
+ * @param bits Precision of the table, which must be in range [4, 16]
+ */
+const float *getCosineTable(int bits);
+
+} // End of namespace Common
+
+#endif // COMMON_COSINETABLES_H
diff --git a/common/dcl.cpp b/common/dcl.cpp
index b75f7f3fa6..1879be992d 100644
--- a/common/dcl.cpp
+++ b/common/dcl.cpp
@@ -30,7 +30,7 @@ namespace Common {
class DecompressorDCL {
public:
- bool unpack(Common::ReadStream *src, byte *dest, uint32 nPacked, uint32 nUnpacked);
+ bool unpack(ReadStream *src, byte *dest, uint32 nPacked, uint32 nUnpacked);
protected:
/**
@@ -41,7 +41,7 @@ protected:
* @param nUnpacket size of unpacked data
* @return 0 on success, non-zero on error
*/
- void init(Common::ReadStream *src, byte *dest, uint32 nPacked, uint32 nUnpacked);
+ void init(ReadStream *src, byte *dest, uint32 nPacked, uint32 nUnpacked);
/**
* Get a number of bits from _src stream, starting with the least
@@ -73,12 +73,11 @@ protected:
uint32 _szUnpacked; ///< size of the decompressed data
uint32 _dwRead; ///< number of bytes read from _src
uint32 _dwWrote; ///< number of bytes written to _dest
- Common::ReadStream *_src;
+ ReadStream *_src;
byte *_dest;
};
-void DecompressorDCL::init(Common::ReadStream *src, byte *dest, uint32 nPacked,
- uint32 nUnpacked) {
+void DecompressorDCL::init(ReadStream *src, byte *dest, uint32 nPacked, uint32 nUnpacked) {
_src = src;
_dest = dest;
_szPacked = nPacked;
@@ -333,7 +332,7 @@ int DecompressorDCL::huffman_lookup(const int *tree) {
#define DCL_BINARY_MODE 0
#define DCL_ASCII_MODE 1
-bool DecompressorDCL::unpack(Common::ReadStream *src, byte *dest, uint32 nPacked, uint32 nUnpacked) {
+bool DecompressorDCL::unpack(ReadStream *src, byte *dest, uint32 nPacked, uint32 nUnpacked) {
init(src, dest, nPacked, nUnpacked);
int value;
diff --git a/common/dcl.h b/common/dcl.h
index 12c4e12772..78ffa631ed 100644
--- a/common/dcl.h
+++ b/common/dcl.h
@@ -52,4 +52,3 @@ SeekableReadStream *decompressDCL(ReadStream *src, uint32 packedSize, uint32 unp
} // End of namespace Common
#endif
-
diff --git a/common/dct.cpp b/common/dct.cpp
new file mode 100644
index 0000000000..6525c727ae
--- /dev/null
+++ b/common/dct.cpp
@@ -0,0 +1,208 @@
+/* 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.
+ *
+ */
+
+// Based on eos' (I)RDFT code which is in turn
+// Based upon the (I)DCT code in FFmpeg
+// Copyright (c) 2009 Peter Ross <pross@xvid.org>
+// Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
+// Copyright (c) 2010 Vitor Sessak
+
+#include "common/cosinetables.h"
+#include "common/dct.h"
+
+namespace Common {
+
+DCT::DCT(int bits, TransformType trans) : _bits(bits), _trans(trans), _rdft(0) {
+ int n = 1 << _bits;
+
+ _tCos = getCosineTable(_bits + 2);
+
+ _csc2 = new float[n / 2];
+
+ _rdft = new RDFT(_bits, (_trans == DCT_III) ? RDFT::IDFT_C2R : RDFT::DFT_R2C);
+
+ for (int i = 0; i < (n / 2); i++)
+ _csc2[i] = 0.5 / sin((M_PI / (2 * n) * (2 * i + 1)));
+}
+
+DCT::~DCT() {
+ delete _rdft;
+ delete[] _csc2;
+}
+
+void DCT::calc(float *data) {
+ switch (_trans) {
+ case DCT_I:
+ calcDCTI(data);
+ break;
+ case DCT_II:
+ calcDCTII(data);
+ break;
+ case DCT_III:
+ calcDCTIII(data);
+ break;
+ case DST_I:
+ calcDSTI(data);
+ break;
+ }
+}
+
+/* sin((M_PI * x / (2*n)) */
+#define SIN(n,x) (_tCos[(n) - (x)])
+/* cos((M_PI * x / (2*n)) */
+#define COS(n,x) (_tCos[x])
+
+void DCT::calcDCTI(float *data) {
+ int n = 1 << _bits;
+
+ float next = -0.5 * (data[0] - data[n]);
+
+ for (int i = 0; i < (n / 2); i++) {
+ float tmp1 = data[i ];
+ float tmp2 = data[n - i];
+
+ float s = SIN(n, 2 * i);
+ float c = COS(n, 2 * i);
+
+ c *= tmp1 - tmp2;
+ s *= tmp1 - tmp2;
+
+ next += c;
+
+ tmp1 = (tmp1 + tmp2) * 0.5;
+
+ data[i ] = tmp1 - s;
+ data[n - i] = tmp1 + s;
+ }
+
+ _rdft->calc(data);
+
+ data[n] = data[1];
+ data[1] = next;
+
+ for (int i = 3; i <= n; i += 2)
+ data[i] = data[i - 2] - data[i];
+}
+
+void DCT::calcDCTII(float *data) {
+ int n = 1 << _bits;
+
+ for (int i = 0; i < (n / 2); i++) {
+ float tmp1 = data[i ];
+ float tmp2 = data[n - i - 1];
+
+ float s = SIN(n, 2 * i + 1);
+
+ s *= tmp1 - tmp2;
+
+ tmp1 = (tmp1 + tmp2) * 0.5;
+
+ data[i ] = tmp1 + s;
+ data[n - i - 1] = tmp1 - s;
+ }
+
+ _rdft->calc(data);
+
+ float next = data[1] * 0.5;
+
+ data[1] *= -1;
+
+ for (int i = n - 2; i >= 0; i -= 2) {
+ float inr = data[i ];
+ float ini = data[i + 1];
+
+ float c = COS(n, i);
+ float s = SIN(n, i);
+
+ data[i ] = c * inr + s * ini;
+ data[i + 1] = next;
+
+ next += s * inr - c * ini;
+ }
+}
+
+void DCT::calcDCTIII(float *data) {
+ int n = 1 << _bits;
+
+ float next = data[n - 1];
+ float inv_n = 1.0 / n;
+
+ for (int i = n - 2; i >= 2; i -= 2) {
+ float val1 = data[i ];
+ float val2 = data[i - 1] - data[i + 1];
+
+ float c = COS(n, i);
+ float s = SIN(n, i);
+
+ data[i ] = c * val1 + s * val2;
+ data[i + 1] = s * val1 - c * val2;
+ }
+
+ data[1] = 2 * next;
+
+ _rdft->calc(data);
+
+ for (int i = 0; i < (n / 2); i++) {
+ float tmp1 = data[i ] * inv_n;
+ float tmp2 = data[n - i - 1] * inv_n;
+
+ float csc = _csc2[i] * (tmp1 - tmp2);
+
+ tmp1 += tmp2;
+
+ data[i ] = tmp1 + csc;
+ data[n - i - 1] = tmp1 - csc;
+ }
+}
+
+void DCT::calcDSTI(float *data) {
+ int n = 1 << _bits;
+
+ data[0] = 0;
+
+ for (int i = 1; i < (n / 2); i++) {
+ float tmp1 = data[i ];
+ float tmp2 = data[n - i];
+ float s = SIN(n, 2 * i);
+
+ s *= tmp1 + tmp2;
+ tmp1 = (tmp1 - tmp2) * 0.5;
+
+ data[i ] = s + tmp1;
+ data[n - i] = s - tmp1;
+ }
+
+ data[n / 2] *= 2;
+
+ _rdft->calc(data);
+
+ data[0] *= 0.5;
+
+ for (int i = 1; i < (n - 2); i += 2) {
+ data[i + 1] += data[i - 1];
+ data[i ] = -data[i + 2];
+ }
+
+ data[n - 1] = 0;
+}
+
+} // End of namespace Common
diff --git a/common/dct.h b/common/dct.h
new file mode 100644
index 0000000000..2c8c5129b8
--- /dev/null
+++ b/common/dct.h
@@ -0,0 +1,76 @@
+/* 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.
+ *
+ */
+
+// Based on eos' (I)RDFT code which is in turn
+// Based upon the (I)DCT code in FFmpeg
+// Copyright (c) 2009 Peter Ross <pross@xvid.org>
+// Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
+// Copyright (c) 2010 Vitor Sessak
+
+#ifndef COMMON_DCT_H
+#define COMMON_DCT_H
+
+#include "common/scummsys.h"
+#include "common/math.h"
+#include "common/rdft.h"
+
+namespace Common {
+
+/**
+ * (Inverse) Discrete Cosine Transforms.
+ *
+ * Used in engines:
+ * - scumm
+ */
+class DCT {
+public:
+ enum TransformType {
+ DCT_II,
+ DCT_III,
+ DCT_I,
+ DST_I
+ };
+
+ DCT(int bits, TransformType trans);
+ ~DCT();
+
+ void calc(float *data);
+
+private:
+ int _bits;
+ TransformType _trans;
+
+ const float *_tCos;
+
+ float *_csc2;
+
+ RDFT *_rdft;
+
+ void calcDCTI (float *data);
+ void calcDCTII (float *data);
+ void calcDCTIII(float *data);
+ void calcDSTI (float *data);
+};
+
+} // End of namespace Common
+
+#endif // COMMON_DCT_H
diff --git a/common/debug.cpp b/common/debug.cpp
index 0dae344bb2..9c3a93e5a6 100644
--- a/common/debug.cpp
+++ b/common/debug.cpp
@@ -23,16 +23,17 @@
#include "common/debug-channels.h"
#include "common/system.h"
#include "common/textconsole.h"
+#include "common/algorithm.h"
#include <stdarg.h> // For va_list etc.
// TODO: Move gDebugLevel into namespace Common.
int gDebugLevel = -1;
-DECLARE_SINGLETON(Common::DebugManager);
-
namespace Common {
+DECLARE_SINGLETON(DebugManager);
+
namespace {
struct DebugLevelComperator {
diff --git a/common/events.h b/common/events.h
index 371080c1b2..f5ace7481b 100644
--- a/common/events.h
+++ b/common/events.h
@@ -97,7 +97,7 @@ struct Event {
* Virtual screen coordinates means: the coordinate system of the
* screen area as defined by the most recent call to initSize().
*/
- Common::Point mouse;
+ Point mouse;
Event() : type(EVENT_INVALID), synthetic(false) {}
};
@@ -139,13 +139,13 @@ public:
*/
class ArtificialEventSource : public EventSource {
protected:
- Common::Queue<Common::Event> _artificialEventQueue;
+ Queue<Event> _artificialEventQueue;
public:
- void addEvent(const Common::Event &ev) {
+ void addEvent(const Event &ev) {
_artificialEventQueue.push(ev);
}
- bool pollEvent(Common::Event &ev) {
+ bool pollEvent(Event &ev) {
if (!_artificialEventQueue.empty()) {
ev = _artificialEventQueue.pop();
return true;
@@ -184,6 +184,14 @@ public:
* false otherwise.
*/
virtual bool notifyEvent(const Event &event) = 0;
+
+ /**
+ * Notifies the observer of pollEvent() query.
+ *
+ * @return true if the event should not be passed to other observers,
+ * false otherwise.
+ */
+ virtual bool notifyPoll() { return false; }
};
/**
@@ -255,8 +263,11 @@ public:
/**
* Registers a new EventObserver with the Dispatcher.
+ *
+ * @param listenPools if set, then all pollEvent() calls are passed to observer
+ * currently it is used by keyMapper
*/
- void registerObserver(EventObserver *obs, uint priority, bool autoFree);
+ void registerObserver(EventObserver *obs, uint priority, bool autoFree, bool listenPolls = false);
/**
* Unregisters a EventObserver.
@@ -275,16 +286,18 @@ private:
EventSource *source;
};
- Common::List<SourceEntry> _sources;
+ List<SourceEntry> _sources;
struct ObserverEntry : public Entry {
uint priority;
EventObserver *observer;
+ bool poll;
};
- Common::List<ObserverEntry> _observers;
+ List<ObserverEntry> _observers;
void dispatchEvent(const Event &event);
+ void dispatchPoll();
};
class Keymapper;
@@ -315,15 +328,15 @@ public:
* @param event point to an Event struct, which will be filled with the event data.
* @return true if an event was retrieved.
*/
- virtual bool pollEvent(Common::Event &event) = 0;
+ virtual bool pollEvent(Event &event) = 0;
/**
* Pushes a "fake" event into the event queue
*/
- virtual void pushEvent(const Common::Event &event) = 0;
+ virtual void pushEvent(const Event &event) = 0;
/** Return the current mouse position */
- virtual Common::Point getMousePos() const = 0;
+ virtual Point getMousePos() const = 0;
/**
* Return a bitmask with the button states:
@@ -362,7 +375,7 @@ public:
// TODO: Consider removing OSystem::getScreenChangeID and
// replacing it by a generic getScreenChangeID method here
#ifdef ENABLE_KEYMAPPER
- virtual Common::Keymapper *getKeymapper() = 0;
+ virtual Keymapper *getKeymapper() = 0;
#endif
enum {
@@ -370,7 +383,12 @@ public:
* Priority of the event manager, for now it's lowest since it eats
* *all* events, we might to change that in the future though.
*/
- kEventManPriority = 0
+ kEventManPriority = 0,
+ /**
+ * Priority of the event recorder. It has to go after event manager
+ * in order to record events generated by it
+ */
+ kEventRecorderPriority = 1
};
/**
diff --git a/common/fft.cpp b/common/fft.cpp
new file mode 100644
index 0000000000..5852698b61
--- /dev/null
+++ b/common/fft.cpp
@@ -0,0 +1,243 @@
+/* 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.
+ *
+ */
+
+// Based on eos' (I)FFT code which is in turn
+// Based upon the (I)FFT code in FFmpeg
+// Copyright (c) 2008 Loren Merritt
+// Copyright (c) 2002 Fabrice Bellard
+// Partly based on libdjbfft by D. J. Bernstein
+
+#include "common/cosinetables.h"
+#include "common/fft.h"
+#include "common/util.h"
+
+namespace Common {
+
+FFT::FFT(int bits, int inverse) : _bits(bits), _inverse(inverse) {
+ assert((_bits >= 2) && (_bits <= 16));
+
+ int n = 1 << bits;
+
+ _tmpBuf = new Complex[n];
+ _expTab = new Complex[n / 2];
+ _revTab = new uint16[n];
+
+ _splitRadix = 1;
+
+ for (int i = 0; i < n; i++)
+ _revTab[-splitRadixPermutation(i, n, _inverse) & (n - 1)] = i;
+}
+
+FFT::~FFT() {
+ delete[] _revTab;
+ delete[] _expTab;
+ delete[] _tmpBuf;
+}
+
+void FFT::permute(Complex *z) {
+ int np = 1 << _bits;
+
+ if (_tmpBuf) {
+ for (int j = 0; j < np; j++)
+ _tmpBuf[_revTab[j]] = z[j];
+
+ memcpy(z, _tmpBuf, np * sizeof(Complex));
+
+ return;
+ }
+
+ // Reverse
+ for (int j = 0; j < np; j++) {
+ int k = _revTab[j];
+
+ if (k < j)
+ SWAP(z[k], z[j]);
+ }
+}
+
+int FFT::splitRadixPermutation(int i, int n, int inverse) {
+ if (n <= 2)
+ return i & 1;
+
+ int m = n >> 1;
+
+ if (!(i & m))
+ return splitRadixPermutation(i, m, inverse) * 2;
+
+ m >>= 1;
+
+ if (inverse == !(i & m))
+ return splitRadixPermutation(i, m, inverse) * 4 + 1;
+
+ return splitRadixPermutation(i, m, inverse) * 4 - 1;
+}
+
+#define sqrthalf (float)M_SQRT1_2
+
+#define BF(x, y, a, b) { \
+ x = a - b; \
+ y = a + b; \
+}
+
+#define BUTTERFLIES(a0, a1, a2, a3) { \
+ BF(t3, t5, t5, t1); \
+ BF(a2.re, a0.re, a0.re, t5); \
+ BF(a3.im, a1.im, a1.im, t3); \
+ BF(t4, t6, t2, t6); \
+ BF(a3.re, a1.re, a1.re, t4); \
+ BF(a2.im, a0.im, a0.im, t6); \
+}
+
+// force loading all the inputs before storing any.
+// this is slightly slower for small data, but avoids store->load aliasing
+// for addresses separated by large powers of 2.
+#define BUTTERFLIES_BIG(a0, a1, a2, a3) { \
+ float r0 = a0.re, i0 = a0.im, r1 = a1.re, i1 = a1.im; \
+ BF(t3, t5, t5, t1); \
+ BF(a2.re, a0.re, r0, t5); \
+ BF(a3.im, a1.im, i1, t3); \
+ BF(t4, t6, t2, t6); \
+ BF(a3.re, a1.re, r1, t4); \
+ BF(a2.im, a0.im, i0, t6); \
+}
+
+#define TRANSFORM(a0, a1, a2, a3, wre, wim) { \
+ t1 = a2.re * wre + a2.im * wim; \
+ t2 = a2.im * wre - a2.re * wim; \
+ t5 = a3.re * wre - a3.im * wim; \
+ t6 = a3.im * wre + a3.re * wim; \
+ BUTTERFLIES(a0, a1, a2, a3) \
+}
+
+#define TRANSFORM_ZERO(a0, a1, a2, a3) { \
+ t1 = a2.re; \
+ t2 = a2.im; \
+ t5 = a3.re; \
+ t6 = a3.im; \
+ BUTTERFLIES(a0, a1, a2, a3) \
+}
+
+/* z[0...8n-1], w[1...2n-1] */
+#define PASS(name) \
+static void name(Complex *z, const float *wre, unsigned int n) { \
+ float t1, t2, t3, t4, t5, t6; \
+ int o1 = 2 * n; \
+ int o2 = 4 * n; \
+ int o3 = 6 * n; \
+ const float *wim = wre + o1; \
+ n--; \
+ \
+ TRANSFORM_ZERO(z[0], z[o1], z[o2], z[o3]); \
+ TRANSFORM(z[1], z[o1 + 1], z[o2 + 1], z[o3 + 1], wre[1], wim[-1]); \
+ do { \
+ z += 2; \
+ wre += 2; \
+ wim -= 2; \
+ TRANSFORM(z[0], z[o1], z[o2], z[o3], wre[0], wim[0]);\
+ TRANSFORM(z[1], z[o1 + 1], z[o2 + 1], z[o3 + 1], wre[1], wim[-1]);\
+ } while(--n);\
+}
+
+PASS(pass)
+#undef BUTTERFLIES
+#define BUTTERFLIES BUTTERFLIES_BIG
+PASS(pass_big)
+
+#define DECL_FFT(t, n, n2, n4) \
+static void fft##n(Complex *z) { \
+ fft##n2(z); \
+ fft##n4(z + n4 * 2); \
+ fft##n4(z + n4 * 3); \
+ pass(z, getCosineTable(t), n4 / 2);\
+}
+
+static void fft4(Complex *z) {
+ float t1, t2, t3, t4, t5, t6, t7, t8;
+
+ BF(t3, t1, z[0].re, z[1].re);
+ BF(t8, t6, z[3].re, z[2].re);
+ BF(z[2].re, z[0].re, t1, t6);
+ BF(t4, t2, z[0].im, z[1].im);
+ BF(t7, t5, z[2].im, z[3].im);
+ BF(z[3].im, z[1].im, t4, t8);
+ BF(z[3].re, z[1].re, t3, t7);
+ BF(z[2].im, z[0].im, t2, t5);
+}
+
+static void fft8(Complex *z) {
+ float t1, t2, t3, t4, t5, t6, t7, t8;
+
+ fft4(z);
+
+ BF(t1, z[5].re, z[4].re, -z[5].re);
+ BF(t2, z[5].im, z[4].im, -z[5].im);
+ BF(t3, z[7].re, z[6].re, -z[7].re);
+ BF(t4, z[7].im, z[6].im, -z[7].im);
+ BF(t8, t1, t3, t1);
+ BF(t7, t2, t2, t4);
+ BF(z[4].re, z[0].re, z[0].re, t1);
+ BF(z[4].im, z[0].im, z[0].im, t2);
+ BF(z[6].re, z[2].re, z[2].re, t7);
+ BF(z[6].im, z[2].im, z[2].im, t8);
+
+ TRANSFORM(z[1], z[3], z[5], z[7], sqrthalf, sqrthalf);
+}
+
+static void fft16(Complex *z) {
+ float t1, t2, t3, t4, t5, t6;
+
+ fft8(z);
+ fft4(z + 8);
+ fft4(z + 12);
+
+ const float * const cosTable = getCosineTable(4);
+
+ TRANSFORM_ZERO(z[0], z[4], z[8], z[12]);
+ TRANSFORM(z[2], z[6], z[10], z[14], sqrthalf, sqrthalf);
+ TRANSFORM(z[1], z[5], z[9], z[13], cosTable[1],cosTable[3]);
+ TRANSFORM(z[3], z[7], z[11], z[15], cosTable[3], cosTable[1]);
+}
+
+DECL_FFT(5, 32, 16, 8)
+DECL_FFT(6, 64, 32, 16)
+DECL_FFT(7, 128, 64, 32)
+DECL_FFT(8, 256, 128, 64)
+DECL_FFT(9, 512, 256, 128)
+#define pass pass_big
+DECL_FFT(10, 1024, 512, 256)
+DECL_FFT(11, 2048, 1024, 512)
+DECL_FFT(12, 4096, 2048, 1024)
+DECL_FFT(13, 8192, 4096, 2048)
+DECL_FFT(14, 16384, 8192, 4096)
+DECL_FFT(15, 32768, 16384, 8192)
+DECL_FFT(16, 65536, 32768, 16384)
+
+static void (* const fft_dispatch[])(Complex*) = {
+ fft4, fft8, fft16, fft32, fft64, fft128, fft256, fft512, fft1024,
+ fft2048, fft4096, fft8192, fft16384, fft32768, fft65536,
+};
+
+void FFT::calc(Complex *z) {
+ fft_dispatch[_bits - 2](z);
+}
+
+} // End of namespace Common
diff --git a/common/fft.h b/common/fft.h
new file mode 100644
index 0000000000..e77c53c2a7
--- /dev/null
+++ b/common/fft.h
@@ -0,0 +1,78 @@
+/* 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.
+ *
+ */
+
+// Based on eos' (I)FFT code which is in turn
+// based upon the (I)FFT code in FFmpeg
+// Copyright (c) 2008 Loren Merritt
+// Copyright (c) 2002 Fabrice Bellard
+// Partly based on libdjbfft by D. J. Bernstein
+
+#ifndef COMMON_FFT_H
+#define COMMON_FFT_H
+
+#include "common/scummsys.h"
+#include "common/math.h"
+
+namespace Common {
+
+/**
+ * (Inverse) Fast Fourier Transform.
+ *
+ * Used in engines:
+ * - scumm
+ */
+class FFT {
+public:
+ FFT(int bits, int inverse);
+ ~FFT();
+
+ /** Do the permutation needed BEFORE calling calc(). */
+ void permute(Complex *z);
+
+ /** Do a complex FFT.
+ *
+ * The input data must be permuted before.
+ * No 1.0/sqrt(n) normalization is done.
+ */
+ void calc(Complex *z);
+
+private:
+ int _bits;
+ int _inverse;
+
+ uint16 *_revTab;
+
+ Complex *_expTab;
+ Complex *_tmpBuf;
+
+ const float *_tSin;
+ const float *_tCos;
+
+ int _splitRadix;
+ int _permutation;
+
+ static int splitRadixPermutation(int i, int n, int inverse);
+};
+
+} // End of namespace Common
+
+#endif // COMMON_FFT_H
diff --git a/common/file.cpp b/common/file.cpp
index 381bf12ecf..12d73c9973 100644
--- a/common/file.cpp
+++ b/common/file.cpp
@@ -72,7 +72,7 @@ bool File::open(const FSNode &node) {
return open(stream, node.getPath());
}
-bool File::open(SeekableReadStream *stream, const Common::String &name) {
+bool File::open(SeekableReadStream *stream, const String &name) {
assert(!_handle);
if (stream) {
diff --git a/common/file.h b/common/file.h
index 86c67c077c..b6319dfc3c 100644
--- a/common/file.h
+++ b/common/file.h
@@ -97,7 +97,7 @@ public:
* @param name a string describing the 'file' corresponding to stream
* @return true if stream was non-zero, false otherwise
*/
- virtual bool open(SeekableReadStream *stream, const Common::String &name);
+ virtual bool open(SeekableReadStream *stream, const String &name);
/**
* Close the file, if open.
diff --git a/common/forbidden.h b/common/forbidden.h
index 9cba19cf5e..95c1a47d65 100644
--- a/common/forbidden.h
+++ b/common/forbidden.h
@@ -29,7 +29,7 @@
* infrastructure code do not make use of certain "forbidden" APIs, such
* as fopen(), setjmp(), etc.
* This is achieved by re-#defining various symbols to a "garbage"
- * string which then trigers a compiler error.
+ * string which then triggers a compiler error.
*
* Backend files may #define FORBIDDEN_SYMBOL_ALLOW_ALL if they
* have to access functions like fopen, fread etc.
@@ -203,6 +203,11 @@
#define exit(a) FORBIDDEN_SYMBOL_REPLACEMENT
#endif
+#ifndef FORBIDDEN_SYMBOL_EXCEPTION_abort
+#undef abort
+#define abort() FORBIDDEN_SYMBOL_REPLACEMENT
+#endif
+
#ifndef FORBIDDEN_SYMBOL_EXCEPTION_getenv
#undef getenv
#define getenv(a) FORBIDDEN_SYMBOL_REPLACEMENT
diff --git a/common/fs.cpp b/common/fs.cpp
index 3dc8c289aa..4b56cc4594 100644
--- a/common/fs.cpp
+++ b/common/fs.cpp
@@ -33,7 +33,7 @@ FSNode::FSNode(AbstractFSNode *realNode)
: _realNode(realNode) {
}
-FSNode::FSNode(const Common::String &p) {
+FSNode::FSNode(const String &p) {
assert(g_system);
FilesystemFactory *factory = g_system->getFilesystemFactory();
AbstractFSNode *tmp = 0;
@@ -42,7 +42,7 @@ FSNode::FSNode(const Common::String &p) {
tmp = factory->makeCurrentDirectoryFileNode();
else
tmp = factory->makeFileNodePath(p);
- _realNode = Common::SharedPtr<AbstractFSNode>(tmp);
+ _realNode = SharedPtr<AbstractFSNode>(tmp);
}
bool FSNode::operator<(const FSNode& node) const {
@@ -59,7 +59,7 @@ bool FSNode::exists() const {
return _realNode && _realNode->exists();
}
-FSNode FSNode::getChild(const Common::String &n) const {
+FSNode FSNode::getChild(const String &n) const {
// If this node is invalid or not a directory, return an invalid node
if (_realNode == 0 || !_realNode->isDirectory())
return FSNode();
@@ -85,12 +85,12 @@ bool FSNode::getChildren(FSList &fslist, ListMode mode, bool hidden) const {
return true;
}
-Common::String FSNode::getDisplayName() const {
+String FSNode::getDisplayName() const {
assert(_realNode);
return _realNode->getDisplayName();
}
-Common::String FSNode::getName() const {
+String FSNode::getName() const {
assert(_realNode);
return _realNode->getName();
}
@@ -107,7 +107,7 @@ FSNode FSNode::getParent() const {
}
}
-Common::String FSNode::getPath() const {
+String FSNode::getPath() const {
assert(_realNode);
return _realNode->getPath();
}
@@ -124,7 +124,7 @@ bool FSNode::isWritable() const {
return _realNode && _realNode->isWritable();
}
-Common::SeekableReadStream *FSNode::createReadStream() const {
+SeekableReadStream *FSNode::createReadStream() const {
if (_realNode == 0)
return 0;
@@ -139,7 +139,7 @@ Common::SeekableReadStream *FSNode::createReadStream() const {
return _realNode->createReadStream();
}
-Common::WriteStream *FSNode::createWriteStream() const {
+WriteStream *FSNode::createWriteStream() const {
if (_realNode == 0)
return 0;
@@ -256,7 +256,7 @@ void FSDirectory::cacheDirectoryRecursive(FSNode node, int depth, const String&
return;
FSList list;
- node.getChildren(list, FSNode::kListAll, false);
+ node.getChildren(list, FSNode::kListAll, true);
FSList::iterator it = list.begin();
for ( ; it != list.end(); ++it) {
diff --git a/common/func.h b/common/func.h
index e09ab1a438..db57d73668 100644
--- a/common/func.h
+++ b/common/func.h
@@ -424,7 +424,7 @@ private:
* are interesting for that matter.
*/
template<class Arg, class Res>
-struct Functor1 : public Common::UnaryFunction<Arg, Res> {
+struct Functor1 : public UnaryFunction<Arg, Res> {
virtual ~Functor1() {}
virtual bool isValid() const = 0;
@@ -460,7 +460,7 @@ private:
* @see Functor1
*/
template<class Arg1, class Arg2, class Res>
-struct Functor2 : public Common::BinaryFunction<Arg1, Arg2, Res> {
+struct Functor2 : public BinaryFunction<Arg1, Arg2, Res> {
virtual ~Functor2() {}
virtual bool isValid() const = 0;
@@ -538,4 +538,3 @@ GENERATE_TRIVIAL_HASH_FUNCTOR(unsigned long);
} // End of namespace Common
#endif
-
diff --git a/common/hashmap.h b/common/hashmap.h
index f2a4d843b8..347ac1fd25 100644
--- a/common/hashmap.h
+++ b/common/hashmap.h
@@ -106,8 +106,9 @@ private:
HASHMAP_MEMORYPOOL_SIZE = HASHMAP_MIN_CAPACITY * HASHMAP_LOADFACTOR_NUMERATOR / HASHMAP_LOADFACTOR_DENOMINATOR
};
-
+#ifdef USE_HASHMAP_MEMORY_POOL
ObjectPool<Node, HASHMAP_MEMORYPOOL_SIZE> _nodePool;
+#endif
Node **_storage; ///< hashtable of size arrsize.
uint _mask; ///< Capacity of the HashMap minus one; must be a power of two of minus one
@@ -128,12 +129,20 @@ private:
#endif
Node *allocNode(const Key &key) {
+#ifdef USE_HASHMAP_MEMORY_POOL
return new (_nodePool) Node(key);
+#else
+ return new Node(key);
+#endif
}
void freeNode(Node *node) {
if (node && node != HASHMAP_DUMMY_NODE)
+#ifdef USE_HASHMAP_MEMORY_POOL
_nodePool.deleteChunk(node);
+#else
+ delete node;
+#endif
}
void assign(const HM_t &map);
diff --git a/common/huffman.cpp b/common/huffman.cpp
new file mode 100644
index 0000000000..a8ebe4142a
--- /dev/null
+++ b/common/huffman.cpp
@@ -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.
+ *
+ */
+
+// Based on eos' Huffman code
+
+#include "common/huffman.h"
+#include "common/util.h"
+#include "common/textconsole.h"
+#include "common/bitstream.h"
+
+namespace Common {
+
+Huffman::Symbol::Symbol(uint32 c, uint32 s) : code(c), symbol(s) {
+}
+
+
+Huffman::Huffman(uint8 maxLength, uint32 codeCount, const uint32 *codes, const uint8 *lengths, const uint32 *symbols) {
+ assert(codeCount > 0);
+
+ assert(codes);
+ assert(lengths);
+
+ if (maxLength == 0)
+ for (uint32 i = 0; i < codeCount; i++)
+ maxLength = MAX(maxLength, lengths[i]);
+
+ assert(maxLength <= 32);
+
+ _codes.resize(maxLength);
+ _symbols.resize(codeCount);
+
+ for (uint32 i = 0; i < codeCount; i++) {
+ // The symbol. If none were specified, just assume it's identical to the code index
+ uint32 symbol = symbols ? symbols[i] : i;
+
+ // Put the code and symbol into the correct list
+ _codes[lengths[i] - 1].push_back(Symbol(codes[i], symbol));
+
+ // And put the pointer to the symbol/code struct into the symbol list.
+ _symbols[i] = &_codes[lengths[i] - 1].back();
+ }
+}
+
+Huffman::~Huffman() {
+}
+
+void Huffman::setSymbols(const uint32 *symbols) {
+ for (uint32 i = 0; i < _symbols.size(); i++)
+ _symbols[i]->symbol = symbols ? *symbols++ : i;
+}
+
+uint32 Huffman::getSymbol(BitStream &bits) const {
+ uint32 code = 0;
+
+ for (uint32 i = 0; i < _codes.size(); i++) {
+ bits.addBit(code, i);
+
+ for (CodeList::const_iterator cCode = _codes[i].begin(); cCode != _codes[i].end(); ++cCode)
+ if (code == cCode->code)
+ return cCode->symbol;
+ }
+
+ error("Unknown Huffman code");
+ return 0;
+}
+
+} // End of namespace Common
diff --git a/common/huffman.h b/common/huffman.h
new file mode 100644
index 0000000000..4175d0d309
--- /dev/null
+++ b/common/huffman.h
@@ -0,0 +1,82 @@
+/* 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.
+ *
+ */
+
+// Based on eos' Huffman code
+
+#ifndef COMMON_HUFFMAN_H
+#define COMMON_HUFFMAN_H
+
+#include "common/array.h"
+#include "common/list.h"
+#include "common/types.h"
+
+namespace Common {
+
+class BitStream;
+
+/**
+ * Huffman bitstream decoding
+ *
+ * Used in engines:
+ * - scumm
+ */
+class Huffman {
+public:
+ /** Construct a Huffman decoder.
+ *
+ * @param maxLength Maximal code length. If 0, it's searched for.
+ * @param codeCount Number of codes.
+ * @param codes The actual codes.
+ * @param lengths Lengths of the individual codes.
+ * @param symbols The symbols. If 0, assume they are identical to the code indices.
+ */
+ Huffman(uint8 maxLength, uint32 codeCount, const uint32 *codes, const uint8 *lengths, const uint32 *symbols = 0);
+ ~Huffman();
+
+ /** Modify the codes' symbols. */
+ void setSymbols(const uint32 *symbols = 0);
+
+ /** Return the next symbol in the bitstream. */
+ uint32 getSymbol(BitStream &bits) const;
+
+private:
+ struct Symbol {
+ uint32 code;
+ uint32 symbol;
+
+ Symbol(uint32 c, uint32 s);
+ };
+
+ typedef List<Symbol> CodeList;
+ typedef Array<CodeList> CodeLists;
+ typedef Array<Symbol*> SymbolList;
+
+ /** Lists of codes and their symbols, sorted by code length. */
+ CodeLists _codes;
+
+ /** Sorted list of pointers to the symbols. */
+ SymbolList _symbols;
+};
+
+} // End of namespace Common
+
+#endif // COMMON_HUFFMAN_H
diff --git a/common/iff_container.cpp b/common/iff_container.cpp
index 02b445ae05..7bcbf86e0f 100644
--- a/common/iff_container.cpp
+++ b/common/iff_container.cpp
@@ -25,7 +25,7 @@
namespace Common {
-IFFParser::IFFParser(Common::ReadStream *stream, bool disposeStream) : _stream(stream), _disposeStream(disposeStream) {
+IFFParser::IFFParser(ReadStream *stream, bool disposeStream) : _stream(stream), _disposeStream(disposeStream) {
setInputStream(stream);
}
@@ -36,7 +36,7 @@ IFFParser::~IFFParser() {
_stream = 0;
}
-void IFFParser::setInputStream(Common::ReadStream *stream) {
+void IFFParser::setInputStream(ReadStream *stream) {
assert(stream);
_formChunk.setInputStream(stream);
_chunk.setInputStream(stream);
@@ -63,7 +63,7 @@ void IFFParser::parse(IFFCallback &callback) {
_chunk.readHeader();
// invoke the callback
- Common::SubReadStream stream(&_chunk, _chunk.size);
+ SubReadStream stream(&_chunk, _chunk.size);
IFFChunk chunk(_chunk.id, _chunk.size, &stream);
stop = callback(chunk);
diff --git a/common/iff_container.h b/common/iff_container.h
index 1b12ef70e5..104ecf0f36 100644
--- a/common/iff_container.h
+++ b/common/iff_container.h
@@ -146,11 +146,11 @@ page 376) */
* Client code must *not* deallocate _stream when done.
*/
struct IFFChunk {
- Common::IFF_ID _type;
- uint32 _size;
- Common::ReadStream *_stream;
+ IFF_ID _type;
+ uint32 _size;
+ ReadStream *_stream;
- IFFChunk(Common::IFF_ID type, uint32 size, Common::ReadStream *stream) : _type(type), _size(size), _stream(stream) {
+ IFFChunk(IFF_ID type, uint32 size, ReadStream *stream) : _type(type), _size(size), _stream(stream) {
assert(_stream);
}
};
@@ -163,17 +163,17 @@ class IFFParser {
/**
* This private class implements IFF chunk navigation.
*/
- class IFFChunkNav : public Common::ReadStream {
+ class IFFChunkNav : public ReadStream {
protected:
- Common::ReadStream *_input;
+ ReadStream *_input;
uint32 _bytesRead;
public:
- Common::IFF_ID id;
+ IFF_ID id;
uint32 size;
IFFChunkNav() : _input(0) {
}
- void setInputStream(Common::ReadStream *input) {
+ void setInputStream(ReadStream *input) {
_input = input;
size = _bytesRead = 0;
}
@@ -199,7 +199,7 @@ class IFFParser {
readByte();
}
}
- // Common::ReadStream implementation
+ // ReadStream implementation
bool eos() const { return _input->eos(); }
bool err() const { return _input->err(); }
void clearErr() { _input->clearErr(); }
@@ -215,21 +215,21 @@ protected:
IFFChunkNav _chunk; ///< The current chunk.
uint32 _formSize;
- Common::IFF_ID _formType;
+ IFF_ID _formType;
- Common::ReadStream *_stream;
+ ReadStream *_stream;
bool _disposeStream;
- void setInputStream(Common::ReadStream *stream);
+ void setInputStream(ReadStream *stream);
public:
- IFFParser(Common::ReadStream *stream, bool disposeStream = false);
+ IFFParser(ReadStream *stream, bool disposeStream = false);
~IFFParser();
/**
* Callback type for the parser.
*/
- typedef Common::Functor1< IFFChunk&, bool > IFFCallback;
+ typedef Functor1< IFFChunk&, bool > IFFCallback;
/**
* Parse the IFF container, invoking the callback on each chunk encountered.
diff --git a/common/keyboard.h b/common/keyboard.h
index 74b8775a0f..bdd0a2d4af 100644
--- a/common/keyboard.h
+++ b/common/keyboard.h
@@ -291,7 +291,7 @@ struct KeyState {
return f == (flags & ~(KBD_NUM|KBD_CAPS|KBD_SCRL));
}
- bool operator ==(const KeyState &x) const {
+ bool operator==(const KeyState &x) const {
return keycode == x.keycode && ascii == x.ascii && flags == x.flags;
}
};
diff --git a/common/localization.cpp b/common/localization.cpp
new file mode 100644
index 0000000000..afd31b8d22
--- /dev/null
+++ b/common/localization.cpp
@@ -0,0 +1,66 @@
+/* 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.
+ */
+
+#include "common/localization.h"
+#include "common/translation.h"
+
+namespace Common {
+
+void getLanguageYesNo(Language id, KeyCode &keyYes, KeyCode &keyNo) {
+ // If all else fails, use English as fallback.
+ keyYes = KEYCODE_y;
+ keyNo = KEYCODE_n;
+
+ switch (id) {
+ case Common::RU_RUS:
+ break;
+ case Common::PL_POL:
+ keyYes = Common::KEYCODE_t;
+ break;
+ case Common::HE_ISR:
+ keyYes = Common::KEYCODE_f;
+ break;
+ case Common::ES_ESP:
+ keyYes = Common::KEYCODE_s;
+ break;
+ case Common::IT_ITA:
+ keyYes = Common::KEYCODE_s;
+ break;
+ case Common::FR_FRA:
+ keyYes = Common::KEYCODE_o;
+ break;
+ case Common::DE_DEU:
+ keyYes = Common::KEYCODE_j;
+ break;
+ default:
+ break;
+ }
+}
+
+void getLanguageYesNo(KeyCode &keyYes, KeyCode &keyNo) {
+#ifdef USE_TRANSLATION
+ getLanguageYesNo(Common::parseLanguageFromLocale(TransMan.getCurrentLanguage().c_str()), keyYes, keyNo);
+#else
+ getLanguageYesNo(Common::EN_ANY, keyYes, keyNo);
+#endif
+}
+
+} // End of namespace Common
diff --git a/common/localization.h b/common/localization.h
new file mode 100644
index 0000000000..3945cf5fab
--- /dev/null
+++ b/common/localization.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.
+ */
+
+#ifndef COMMON_LOCALIZATION_H
+#define COMMON_LOCALIZATION_H
+
+#include "common/util.h"
+#include "common/keyboard.h"
+
+namespace Common {
+
+/**
+ * Get localized equivalents for Y/N buttons of the specified language. In
+ * case there is no specialized keys for the given language it will fall back
+ * to the English keys.
+ *
+ * @param id Language id
+ * @param keyYes Key code for yes
+ * @param keyYes Key code for no
+ */
+void getLanguageYesNo(Language id, KeyCode &keyYes, KeyCode &keyNo);
+
+/**
+ * Get localized equivalents for Y/N buttons of the current translation
+ * language of the ScummVM GUI.
+ *
+ * @param keyYes Key code for yes
+ * @param keyYes Key code for no
+ */
+void getLanguageYesNo(KeyCode &keyYes, KeyCode &keyNo);
+
+} // End of namespace Common
+
+#endif
diff --git a/common/macresman.cpp b/common/macresman.cpp
index c1cab8b96a..2b9c68ade9 100644
--- a/common/macresman.cpp
+++ b/common/macresman.cpp
@@ -69,6 +69,7 @@ void MacResManager::close() {
delete[] _resLists; _resLists = 0;
delete[] _resTypes; _resTypes = 0;
delete _stream; _stream = 0;
+ _resMap.numTypes = 0;
}
bool MacResManager::hasDataFork() const {
diff --git a/common/math.h b/common/math.h
new file mode 100644
index 0000000000..f787b84fa6
--- /dev/null
+++ b/common/math.h
@@ -0,0 +1,128 @@
+/* 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.
+ *
+ */
+
+// Based on eos' math code
+
+#ifndef COMMON_MATH_H
+#define COMMON_MATH_H
+
+#include "common/scummsys.h"
+#ifdef _MSC_VER
+// HACK:
+// intrin.h on MSVC includes setjmp.h, which will fail compiling due to our
+// forbidden symbol colde. Since we also can not assure that defining
+// FORBIDDEN_SYMBOL_EXCEPTION_setjmp and FORBIDDEN_SYMBOL_EXCEPTION_longjmp
+// will actually allow the symbols, since forbidden.h might be included
+// earlier already we need to undefine them here...
+#undef setjmp
+#undef longjmp
+#include <intrin.h>
+// ...and redefine them here so no code can actually use it.
+// This could be resolved by including intrin.h on MSVC in scummsys.h before
+// the forbidden.h include. This might make sense, in case we use MSVC
+// extensions like _BitScanReverse in more places. But for now this hack should
+// be ok...
+#ifndef FORBIDDEN_SYMBOL_EXCEPTION_setjmp
+#undef setjmp
+#define setjmp(a) FORBIDDEN_SYMBOL_REPLACEMENT
+#endif
+
+#ifndef FORBIDDEN_SYMBOL_EXCEPTION_longjmp
+#undef longjmp
+#define longjmp(a,b) FORBIDDEN_SYMBOL_REPLACEMENT
+#endif
+#endif
+
+#ifndef M_SQRT1_2
+ #define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
+#endif
+
+#ifndef M_PI
+ #define M_PI 3.14159265358979323846
+#endif
+
+#ifndef FLT_MIN
+ #define FLT_MIN 1E-37
+#endif
+
+#ifndef FLT_MAX
+ #define FLT_MAX 1E+37
+#endif
+
+namespace Common {
+
+/** A complex number. */
+struct Complex {
+ float re, im;
+};
+
+#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+inline int intLog2(uint32 v) {
+ // This is a slightly optimized implementation of log2 for natural numbers
+ // targeting gcc. It also saves some binary size over our fallback
+ // implementation, since it does not need any table.
+ if (v == 0)
+ return -1;
+ else
+ // This is really "sizeof(unsigned int) * CHAR_BIT - 1" but using 8
+ // instead of CHAR_BIT is sane enough and it saves us from including
+ // limits.h
+ return (sizeof(unsigned int) * 8 - 1) - __builtin_clz(v);
+}
+#elif defined(_MSC_VER)
+inline int intLog2(uint32 v) {
+ unsigned long result = 0;
+ unsigned char nonZero = _BitScanReverse(&result, v);
+ // _BitScanReverse stores the position of the MSB set in case its result
+ // is non zero, thus we can just return it as is.
+ return nonZero ? result : -1;
+}
+#else
+// See http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup
+static const char LogTable256[256] = {
+#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n
+ -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6),
+ LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7)
+};
+
+inline int intLog2(uint32 v) {
+ register uint32 t, tt;
+
+ if ((tt = v >> 16))
+ return (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
+ else
+ return (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v];
+}
+#endif
+
+inline float rad2deg(float rad) {
+ return rad * 180.0 / M_PI;
+}
+
+inline float deg2rad(float deg) {
+ return deg * M_PI / 180.0;
+}
+
+} // End of namespace Common
+
+#endif // COMMON_MATH_H
diff --git a/common/memorypool.cpp b/common/memorypool.cpp
index 3a570ac50e..19adc54d00 100644
--- a/common/memorypool.cpp
+++ b/common/memorypool.cpp
@@ -180,4 +180,3 @@ void MemoryPool::freeUnusedPages() {
}
} // End of namespace Common
-
diff --git a/common/module.mk b/common/module.mk
index 5f6a529595..7434df7052 100644
--- a/common/module.mk
+++ b/common/module.mk
@@ -13,6 +13,7 @@ MODULE_OBJS := \
fs.o \
hashmap.o \
iff_container.o \
+ localization.o \
macresman.o \
memorypool.o \
md5.o \
@@ -35,5 +36,15 @@ MODULE_OBJS := \
xmlparser.o \
zlib.o
+ifdef USE_BINK
+MODULE_OBJS += \
+ cosinetables.o \
+ dct.o \
+ fft.o \
+ huffman.o \
+ rdft.o \
+ sinetables.o
+endif
+
# Include common rules
include $(srcdir)/rules.mk
diff --git a/common/ptr.h b/common/ptr.h
index fc272d3d41..2b0670caae 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -24,6 +24,7 @@
#include "common/scummsys.h"
#include "common/noncopyable.h"
+#include "common/types.h"
namespace Common {
@@ -185,12 +186,12 @@ public:
}
template<class T2>
- bool operator==(const Common::SharedPtr<T2> &r) const {
+ bool operator==(const SharedPtr<T2> &r) const {
return _pointer == r.get();
}
template<class T2>
- bool operator!=(const Common::SharedPtr<T2> &r) const {
+ bool operator!=(const SharedPtr<T2> &r) const {
return _pointer != r.get();
}
@@ -231,7 +232,6 @@ public:
ReferenceType operator*() const { return *_pointer; }
PointerType operator->() const { return _pointer; }
- operator PointerType() const { return _pointer; }
/**
* Implicit conversion operator to bool for convenience, to make
@@ -274,6 +274,41 @@ private:
PointerType _pointer;
};
+
+template<typename T>
+class DisposablePtr : NonCopyable {
+public:
+ typedef T ValueType;
+ typedef T *PointerType;
+ typedef T &ReferenceType;
+
+ explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose) {}
+
+ ~DisposablePtr() {
+ if (_dispose) delete _pointer;
+ }
+
+ ReferenceType operator*() const { return *_pointer; }
+ PointerType operator->() const { return _pointer; }
+
+ /**
+ * Implicit conversion operator to bool for convenience, to make
+ * checks like "if (scopedPtr) ..." possible.
+ */
+ operator bool() const { return _pointer; }
+
+ /**
+ * Returns the plain pointer value.
+ *
+ * @return the pointer the DisposablePtr manages
+ */
+ PointerType get() const { return _pointer; }
+
+private:
+ PointerType _pointer;
+ DisposeAfterUse::Flag _dispose;
+};
+
} // End of namespace Common
#endif
diff --git a/common/quicktime.cpp b/common/quicktime.cpp
index ee49b092a4..9ea8c229ea 100644
--- a/common/quicktime.cpp
+++ b/common/quicktime.cpp
@@ -8,19 +8,16 @@
* 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$
- *
*/
//
@@ -51,7 +48,7 @@ QuickTimeParser::QuickTimeParser() {
_fd = 0;
_scaleFactorX = 1;
_scaleFactorY = 1;
- _resFork = new Common::MacResManager();
+ _resFork = new MacResManager();
_disposeFileHandle = DisposeAfterUse::YES;
initParseTable();
@@ -62,7 +59,7 @@ QuickTimeParser::~QuickTimeParser() {
delete _resFork;
}
-bool QuickTimeParser::parseFile(const Common::String &filename) {
+bool QuickTimeParser::parseFile(const String &filename) {
if (!_resFork->open(filename) || !_resFork->hasDataFork())
return false;
@@ -73,7 +70,7 @@ bool QuickTimeParser::parseFile(const Common::String &filename) {
if (_resFork->hasResFork()) {
// Search for a 'moov' resource
- Common::MacResIDArray idArray = _resFork->getResIDArray(MKTAG('m', 'o', 'o', 'v'));
+ MacResIDArray idArray = _resFork->getResIDArray(MKTAG('m', 'o', 'o', 'v'));
if (!idArray.empty())
_fd = _resFork->getResource(MKTAG('m', 'o', 'o', 'v'), idArray[0]);
@@ -99,7 +96,7 @@ bool QuickTimeParser::parseFile(const Common::String &filename) {
return true;
}
-bool QuickTimeParser::parseStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) {
+bool QuickTimeParser::parseStream(SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) {
_fd = stream;
_foundMOOV = false;
_disposeFileHandle = disposeFileHandle;
@@ -277,7 +274,7 @@ int QuickTimeParser::readCMOV(Atom atom) {
// Uncompress the data
unsigned long dstLen = uncompressedSize;
- if (!Common::uncompress(uncompressedData, &dstLen, compressedData, compressedSize)) {
+ if (!uncompress(uncompressedData, &dstLen, compressedData, compressedSize)) {
warning ("Could not uncompress cmov chunk");
free(compressedData);
free(uncompressedData);
@@ -285,8 +282,8 @@ int QuickTimeParser::readCMOV(Atom atom) {
}
// Load data into a new MemoryReadStream and assign _fd to be that
- Common::SeekableReadStream *oldStream = _fd;
- _fd = new Common::MemoryReadStream(uncompressedData, uncompressedSize, DisposeAfterUse::YES);
+ SeekableReadStream *oldStream = _fd;
+ _fd = new MemoryReadStream(uncompressedData, uncompressedSize, DisposeAfterUse::YES);
// Read the contents of the uncompressed data
Atom a = { MKTAG('m', 'o', 'o', 'v'), 0, uncompressedSize };
@@ -336,8 +333,8 @@ int QuickTimeParser::readMVHD(Atom atom) {
uint32 yMod = _fd->readUint32BE();
_fd->skip(16);
- _scaleFactorX = Common::Rational(0x10000, xMod);
- _scaleFactorY = Common::Rational(0x10000, yMod);
+ _scaleFactorX = Rational(0x10000, xMod);
+ _scaleFactorY = Rational(0x10000, yMod);
_scaleFactorX.debugPrint(1, "readMVHD(): scaleFactorX =");
_scaleFactorY.debugPrint(1, "readMVHD(): scaleFactorY =");
@@ -406,8 +403,8 @@ int QuickTimeParser::readTKHD(Atom atom) {
uint32 yMod = _fd->readUint32BE();
_fd->skip(16);
- track->scaleFactorX = Common::Rational(0x10000, xMod);
- track->scaleFactorY = Common::Rational(0x10000, yMod);
+ track->scaleFactorX = Rational(0x10000, xMod);
+ track->scaleFactorY = Rational(0x10000, yMod);
track->scaleFactorX.debugPrint(1, "readTKHD(): scaleFactorX =");
track->scaleFactorY.debugPrint(1, "readTKHD(): scaleFactorY =");
@@ -434,7 +431,7 @@ int QuickTimeParser::readELST(Atom atom) {
for (uint32 i = 0; i < track->editCount; i++){
track->editList[i].trackDuration = _fd->readUint32BE();
track->editList[i].mediaTime = _fd->readSint32BE();
- track->editList[i].mediaRate = Common::Rational(_fd->readUint32BE(), 0x10000);
+ track->editList[i].mediaRate = Rational(_fd->readUint32BE(), 0x10000);
debugN(3, "\tDuration = %d, Media Time = %d, ", track->editList[i].trackDuration, track->editList[i].mediaTime);
track->editList[i].mediaRate.debugPrint(3, "Media Rate =");
}
@@ -698,7 +695,7 @@ enum {
kMP4DecSpecificDescTag = 5
};
-static int readMP4DescLength(Common::SeekableReadStream *stream) {
+static int readMP4DescLength(SeekableReadStream *stream) {
int length = 0;
int count = 4;
@@ -713,7 +710,7 @@ static int readMP4DescLength(Common::SeekableReadStream *stream) {
return length;
}
-static void readMP4Desc(Common::SeekableReadStream *stream, byte &tag, int &length) {
+static void readMP4Desc(SeekableReadStream *stream, byte &tag, int &length) {
tag = stream->readByte();
length = readMP4DescLength(stream);
}
diff --git a/common/quicktime.h b/common/quicktime.h
index cb2bed1202..e4c821e209 100644
--- a/common/quicktime.h
+++ b/common/quicktime.h
@@ -8,19 +8,16 @@
* 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$
- *
*/
//
@@ -59,14 +56,14 @@ public:
* Load a QuickTime file
* @param filename the filename to load
*/
- bool parseFile(const Common::String &filename);
+ bool parseFile(const String &filename);
/**
* Load a QuickTime file from a SeekableReadStream
* @param stream the stream to load
* @param disposeFileHandle whether to delete the stream after use
*/
- bool parseStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle = DisposeAfterUse::YES);
+ bool parseStream(SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle = DisposeAfterUse::YES);
/**
* Close a QuickTime file
@@ -84,7 +81,7 @@ public:
protected:
// This is the file handle from which data is read from. It can be the actual file handle or a decompressed stream.
- Common::SeekableReadStream *_fd;
+ SeekableReadStream *_fd;
DisposeAfterUse::Flag _disposeFileHandle;
@@ -113,7 +110,7 @@ protected:
struct EditListEntry {
uint32 trackDuration;
int32 mediaTime;
- Common::Rational mediaRate;
+ Rational mediaRate;
};
struct Track;
@@ -157,18 +154,18 @@ protected:
uint16 height;
CodecType codecType;
- Common::Array<SampleDesc *> sampleDescs;
+ Array<SampleDesc*> sampleDescs;
uint32 editCount;
EditListEntry *editList;
- Common::SeekableReadStream *extraData;
+ SeekableReadStream *extraData;
uint32 frameCount;
uint32 duration;
uint32 startTime;
- Common::Rational scaleFactorX;
- Common::Rational scaleFactorY;
+ Rational scaleFactorX;
+ Rational scaleFactorY;
byte objectTypeMP4;
};
@@ -179,11 +176,11 @@ protected:
bool _foundMOOV;
uint32 _timeScale;
uint32 _duration;
- Common::Rational _scaleFactorX;
- Common::Rational _scaleFactorY;
- Common::Array<Track *> _tracks;
+ Rational _scaleFactorX;
+ Rational _scaleFactorY;
+ Array<Track*> _tracks;
uint32 _beginOffset;
- Common::MacResManager *_resFork;
+ MacResManager *_resFork;
void initParseTable();
void init();
diff --git a/common/rational.cpp b/common/rational.cpp
index cb287869bb..f5495da3a9 100644
--- a/common/rational.cpp
+++ b/common/rational.cpp
@@ -107,8 +107,8 @@ Rational &Rational::operator-=(const Rational &right) {
Rational &Rational::operator*=(const Rational &right) {
// Cross-cancel to avoid unnecessary overflow;
// the result then is automatically normalized
- const int gcd1 = Common::gcd(_num, right._denom);
- const int gcd2 = Common::gcd(right._num, _denom);
+ const int gcd1 = gcd(_num, right._denom);
+ const int gcd2 = gcd(right._num, _denom);
_num = (_num / gcd1) * (right._num / gcd2);
_denom = (_denom / gcd2) * (right._denom / gcd1);
diff --git a/common/rdft.cpp b/common/rdft.cpp
new file mode 100644
index 0000000000..3f52a89cba
--- /dev/null
+++ b/common/rdft.cpp
@@ -0,0 +1,102 @@
+/* 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.
+ *
+ */
+
+// Based on eos' (I)RDFT code which is in turn
+// Based upon the (I)RDFT code in FFmpeg
+// Copyright (c) 2009 Alex Converse <alex dot converse at gmail dot com>
+
+#include "common/rdft.h"
+#include "common/cosinetables.h"
+#include "common/sinetables.h"
+
+namespace Common {
+
+RDFT::RDFT(int bits, TransformType trans) : _bits(bits), _fft(0) {
+ assert ((_bits >= 4) && (_bits <= 16));
+
+ _inverse = trans == IDFT_C2R || trans == DFT_C2R;
+ _signConvention = trans == IDFT_R2C || trans == DFT_C2R ? 1 : -1;
+
+ _fft = new FFT(bits - 1, trans == IDFT_C2R || trans == IDFT_R2C);
+
+ int n = 1 << bits;
+
+ _tSin = getSineTable(bits) + (trans == DFT_R2C || trans == DFT_C2R) * (n >> 2);
+ _tCos = getCosineTable(bits);
+}
+
+RDFT::~RDFT() {
+ delete _fft;
+}
+
+void RDFT::calc(float *data) {
+ const int n = 1 << _bits;
+
+ const float k1 = 0.5;
+ const float k2 = 0.5 - _inverse;
+
+ if (!_inverse) {
+ _fft->permute((Complex *) data);
+ _fft->calc ((Complex *) data);
+ }
+
+ Complex ev, od;
+
+ /* i=0 is a special case because of packing, the DC term is real, so we
+ are going to throw the N/2 term (also real) in with it. */
+
+ ev.re = data[0];
+
+ data[0] = ev.re + data[1];
+ data[1] = ev.re - data[1];
+
+ int i;
+ for (i = 1; i < (n >> 2); i++) {
+ int i1 = 2 * i;
+ int i2 = n - i1;
+
+ /* Separate even and odd FFTs */
+ ev.re = k1 * (data[i1 ] + data[i2 ]);
+ od.im = -k2 * (data[i1 ] - data[i2 ]);
+ ev.im = k1 * (data[i1 + 1] - data[i2 + 1]);
+ od.re = k2 * (data[i1 + 1] + data[i2 + 1]);
+
+ /* Apply twiddle factors to the odd FFT and add to the even FFT */
+ data[i1 ] = ev.re + od.re * _tCos[i] - od.im * _tSin[i];
+ data[i1 + 1] = ev.im + od.im * _tCos[i] + od.re * _tSin[i];
+ data[i2 ] = ev.re - od.re * _tCos[i] + od.im * _tSin[i];
+ data[i2 + 1] = -ev.im + od.im * _tCos[i] + od.re * _tSin[i];
+ }
+
+ data[2 * i + 1] = _signConvention * data[2 * i + 1];
+
+ if (_inverse) {
+ data[0] *= k1;
+ data[1] *= k1;
+
+ _fft->permute((Complex *) data);
+ _fft->calc ((Complex *) data);
+ }
+
+}
+
+} // End of namespace Common
diff --git a/common/rdft.h b/common/rdft.h
new file mode 100644
index 0000000000..68be0f4dac
--- /dev/null
+++ b/common/rdft.h
@@ -0,0 +1,70 @@
+/* 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.
+ *
+ */
+
+// Based on eos' (I)RDFT code which is in turn
+// Based upon the (I)RDFT code in FFmpeg
+// Copyright (c) 2009 Alex Converse <alex dot converse at gmail dot com>
+
+#ifndef COMMON_RDFT_H
+#define COMMON_RDFT_H
+
+#include "common/scummsys.h"
+#include "common/math.h"
+#include "common/fft.h"
+
+namespace Common {
+
+/**
+ * (Inverse) Real Discrete Fourier Transform.
+ *
+ * Used in engines:
+ * - scumm
+ */
+
+class RDFT {
+public:
+ enum TransformType {
+ DFT_R2C,
+ IDFT_C2R,
+ IDFT_R2C,
+ DFT_C2R
+ };
+
+ RDFT(int bits, TransformType trans);
+ ~RDFT();
+
+ void calc(float *data);
+
+private:
+ int _bits;
+ int _inverse;
+ int _signConvention;
+
+ const float *_tSin;
+ const float *_tCos;
+
+ FFT *_fft;
+};
+
+} // End of namespace Common
+
+#endif // COMMON_RDFT_H
diff --git a/common/scummsys.h b/common/scummsys.h
index 9d4b6a9677..fbd5bb5273 100644
--- a/common/scummsys.h
+++ b/common/scummsys.h
@@ -307,7 +307,7 @@
#define scumm_va_copy va_copy
#elif defined(__va_copy)
#define scumm_va_copy __va_copy
- #elif defined(_MSC_VER)
+ #elif defined(_MSC_VER) || defined (__SYMBIAN32__)
#define scumm_va_copy(dst, src) ((dst) = (src))
#else
#error scumm_va_copy undefined for this port
diff --git a/common/serializer.h b/common/serializer.h
index b874624d38..5b08a9a9fa 100644
--- a/common/serializer.h
+++ b/common/serializer.h
@@ -68,15 +68,15 @@ public:
static const Version kLastVersion = 0xFFFFFFFF;
protected:
- Common::SeekableReadStream *_loadStream;
- Common::WriteStream *_saveStream;
+ SeekableReadStream *_loadStream;
+ WriteStream *_saveStream;
uint _bytesSynced;
Version _version;
public:
- Serializer(Common::SeekableReadStream *in, Common::WriteStream *out)
+ Serializer(SeekableReadStream *in, WriteStream *out)
: _loadStream(in), _saveStream(out), _bytesSynced(0), _version(0) {
assert(in || out);
}
@@ -214,7 +214,7 @@ public:
* Sync a C-string, by treating it as a zero-terminated byte sequence.
* @todo Replace this method with a special Syncer class for Common::String
*/
- void syncString(Common::String &str, Version minVersion = 0, Version maxVersion = kLastVersion) {
+ void syncString(String &str, Version minVersion = 0, Version maxVersion = kLastVersion) {
if (_version < minVersion || _version > maxVersion)
return; // Ignore anything which is not supposed to be present in this save game version
diff --git a/common/sinetables.cpp b/common/sinetables.cpp
new file mode 100644
index 0000000000..79721ec401
--- /dev/null
+++ b/common/sinetables.cpp
@@ -0,0 +1,8274 @@
+/* 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.
+ *
+ */
+
+// Based on eos' sine tables
+
+#include "common/scummsys.h"
+#include "common/sinetables.h"
+
+namespace Common {
+
+static const float sinTable16[8] = {
+ 0.000000f, 0.382683f, 0.707107f, 0.923880f, 0.000000f, -0.382683f, -0.707107f, -0.923880f
+};
+
+static const float sinTable32[16] = {
+ 0.000000f, 0.195090f, 0.382683f, 0.555570f, 0.707107f, 0.831470f, 0.923880f, 0.980785f,
+ 0.000000f, -0.195090f, -0.382683f, -0.555570f, -0.707107f, -0.831470f, -0.923880f, -0.980785f
+};
+
+static const float sinTable64[32] = {
+ 0.000000f, 0.098017f, 0.195090f, 0.290285f, 0.382683f, 0.471397f, 0.555570f, 0.634393f,
+ 0.707107f, 0.773010f, 0.831470f, 0.881921f, 0.923880f, 0.956940f, 0.980785f, 0.995185f,
+ 0.000000f, -0.098017f, -0.195090f, -0.290285f, -0.382683f, -0.471397f, -0.555570f, -0.634393f,
+ -0.707107f, -0.773010f, -0.831470f, -0.881921f, -0.923880f, -0.956940f, -0.980785f, -0.995185f
+};
+
+static const float sinTable128[64] = {
+ 0.000000f, 0.049068f, 0.098017f, 0.146730f, 0.195090f, 0.242980f, 0.290285f, 0.336890f,
+ 0.382683f, 0.427555f, 0.471397f, 0.514103f, 0.555570f, 0.595699f, 0.634393f, 0.671559f,
+ 0.707107f, 0.740951f, 0.773010f, 0.803208f, 0.831470f, 0.857729f, 0.881921f, 0.903989f,
+ 0.923880f, 0.941544f, 0.956940f, 0.970031f, 0.980785f, 0.989177f, 0.995185f, 0.998795f,
+ 0.000000f, -0.049068f, -0.098017f, -0.146730f, -0.195090f, -0.242980f, -0.290285f, -0.336890f,
+ -0.382683f, -0.427555f, -0.471397f, -0.514103f, -0.555570f, -0.595699f, -0.634393f, -0.671559f,
+ -0.707107f, -0.740951f, -0.773010f, -0.803208f, -0.831470f, -0.857729f, -0.881921f, -0.903989f,
+ -0.923880f, -0.941544f, -0.956940f, -0.970031f, -0.980785f, -0.989177f, -0.995185f, -0.998795f
+};
+
+static const float sinTable256[128] = {
+ 0.000000f, 0.024541f, 0.049068f, 0.073565f, 0.098017f, 0.122411f, 0.146730f, 0.170962f,
+ 0.195090f, 0.219101f, 0.242980f, 0.266713f, 0.290285f, 0.313682f, 0.336890f, 0.359895f,
+ 0.382683f, 0.405241f, 0.427555f, 0.449611f, 0.471397f, 0.492898f, 0.514103f, 0.534998f,
+ 0.555570f, 0.575808f, 0.595699f, 0.615232f, 0.634393f, 0.653173f, 0.671559f, 0.689541f,
+ 0.707107f, 0.724247f, 0.740951f, 0.757209f, 0.773010f, 0.788346f, 0.803208f, 0.817585f,
+ 0.831470f, 0.844854f, 0.857729f, 0.870087f, 0.881921f, 0.893224f, 0.903989f, 0.914210f,
+ 0.923880f, 0.932993f, 0.941544f, 0.949528f, 0.956940f, 0.963776f, 0.970031f, 0.975702f,
+ 0.980785f, 0.985278f, 0.989177f, 0.992480f, 0.995185f, 0.997290f, 0.998795f, 0.999699f,
+ 0.000000f, -0.024541f, -0.049068f, -0.073565f, -0.098017f, -0.122411f, -0.146730f, -0.170962f,
+ -0.195090f, -0.219101f, -0.242980f, -0.266713f, -0.290285f, -0.313682f, -0.336890f, -0.359895f,
+ -0.382683f, -0.405241f, -0.427555f, -0.449611f, -0.471397f, -0.492898f, -0.514103f, -0.534998f,
+ -0.555570f, -0.575808f, -0.595699f, -0.615232f, -0.634393f, -0.653173f, -0.671559f, -0.689541f,
+ -0.707107f, -0.724247f, -0.740951f, -0.757209f, -0.773010f, -0.788346f, -0.803208f, -0.817585f,
+ -0.831470f, -0.844854f, -0.857729f, -0.870087f, -0.881921f, -0.893224f, -0.903989f, -0.914210f,
+ -0.923880f, -0.932993f, -0.941544f, -0.949528f, -0.956940f, -0.963776f, -0.970031f, -0.975702f,
+ -0.980785f, -0.985278f, -0.989177f, -0.992480f, -0.995185f, -0.997290f, -0.998795f, -0.999699f
+};
+
+static const float sinTable512[256] = {
+ 0.000000f, 0.012272f, 0.024541f, 0.036807f, 0.049068f, 0.061321f, 0.073565f, 0.085797f,
+ 0.098017f, 0.110222f, 0.122411f, 0.134581f, 0.146730f, 0.158858f, 0.170962f, 0.183040f,
+ 0.195090f, 0.207111f, 0.219101f, 0.231058f, 0.242980f, 0.254866f, 0.266713f, 0.278520f,
+ 0.290285f, 0.302006f, 0.313682f, 0.325310f, 0.336890f, 0.348419f, 0.359895f, 0.371317f,
+ 0.382683f, 0.393992f, 0.405241f, 0.416430f, 0.427555f, 0.438616f, 0.449611f, 0.460539f,
+ 0.471397f, 0.482184f, 0.492898f, 0.503538f, 0.514103f, 0.524590f, 0.534998f, 0.545325f,
+ 0.555570f, 0.565732f, 0.575808f, 0.585798f, 0.595699f, 0.605511f, 0.615232f, 0.624860f,
+ 0.634393f, 0.643832f, 0.653173f, 0.662416f, 0.671559f, 0.680601f, 0.689541f, 0.698376f,
+ 0.707107f, 0.715731f, 0.724247f, 0.732654f, 0.740951f, 0.749136f, 0.757209f, 0.765167f,
+ 0.773010f, 0.780737f, 0.788346f, 0.795837f, 0.803208f, 0.810457f, 0.817585f, 0.824589f,
+ 0.831470f, 0.838225f, 0.844854f, 0.851355f, 0.857729f, 0.863973f, 0.870087f, 0.876070f,
+ 0.881921f, 0.887640f, 0.893224f, 0.898674f, 0.903989f, 0.909168f, 0.914210f, 0.919114f,
+ 0.923880f, 0.928506f, 0.932993f, 0.937339f, 0.941544f, 0.945607f, 0.949528f, 0.953306f,
+ 0.956940f, 0.960431f, 0.963776f, 0.966976f, 0.970031f, 0.972940f, 0.975702f, 0.978317f,
+ 0.980785f, 0.983105f, 0.985278f, 0.987301f, 0.989177f, 0.990903f, 0.992480f, 0.993907f,
+ 0.995185f, 0.996313f, 0.997290f, 0.998118f, 0.998795f, 0.999322f, 0.999699f, 0.999925f,
+ 0.000000f, -0.012272f, -0.024541f, -0.036807f, -0.049068f, -0.061321f, -0.073565f, -0.085797f,
+ -0.098017f, -0.110222f, -0.122411f, -0.134581f, -0.146730f, -0.158858f, -0.170962f, -0.183040f,
+ -0.195090f, -0.207111f, -0.219101f, -0.231058f, -0.242980f, -0.254866f, -0.266713f, -0.278520f,
+ -0.290285f, -0.302006f, -0.313682f, -0.325310f, -0.336890f, -0.348419f, -0.359895f, -0.371317f,
+ -0.382683f, -0.393992f, -0.405241f, -0.416430f, -0.427555f, -0.438616f, -0.449611f, -0.460539f,
+ -0.471397f, -0.482184f, -0.492898f, -0.503538f, -0.514103f, -0.524590f, -0.534998f, -0.545325f,
+ -0.555570f, -0.565732f, -0.575808f, -0.585798f, -0.595699f, -0.605511f, -0.615232f, -0.624860f,
+ -0.634393f, -0.643832f, -0.653173f, -0.662416f, -0.671559f, -0.680601f, -0.689541f, -0.698376f,
+ -0.707107f, -0.715731f, -0.724247f, -0.732654f, -0.740951f, -0.749136f, -0.757209f, -0.765167f,
+ -0.773010f, -0.780737f, -0.788346f, -0.795837f, -0.803208f, -0.810457f, -0.817585f, -0.824589f,
+ -0.831470f, -0.838225f, -0.844854f, -0.851355f, -0.857729f, -0.863973f, -0.870087f, -0.876070f,
+ -0.881921f, -0.887640f, -0.893224f, -0.898674f, -0.903989f, -0.909168f, -0.914210f, -0.919114f,
+ -0.923880f, -0.928506f, -0.932993f, -0.937339f, -0.941544f, -0.945607f, -0.949528f, -0.953306f,
+ -0.956940f, -0.960431f, -0.963776f, -0.966976f, -0.970031f, -0.972940f, -0.975702f, -0.978317f,
+ -0.980785f, -0.983105f, -0.985278f, -0.987301f, -0.989177f, -0.990903f, -0.992480f, -0.993907f,
+ -0.995185f, -0.996313f, -0.997290f, -0.998118f, -0.998795f, -0.999322f, -0.999699f, -0.999925f
+};
+
+static const float sinTable1024[512] = {
+ 0.000000f, 0.006136f, 0.012272f, 0.018407f, 0.024541f, 0.030675f, 0.036807f, 0.042938f,
+ 0.049068f, 0.055195f, 0.061321f, 0.067444f, 0.073565f, 0.079682f, 0.085797f, 0.091909f,
+ 0.098017f, 0.104122f, 0.110222f, 0.116319f, 0.122411f, 0.128498f, 0.134581f, 0.140658f,
+ 0.146730f, 0.152797f, 0.158858f, 0.164913f, 0.170962f, 0.177004f, 0.183040f, 0.189069f,
+ 0.195090f, 0.201105f, 0.207111f, 0.213110f, 0.219101f, 0.225084f, 0.231058f, 0.237024f,
+ 0.242980f, 0.248928f, 0.254866f, 0.260794f, 0.266713f, 0.272621f, 0.278520f, 0.284408f,
+ 0.290285f, 0.296151f, 0.302006f, 0.307850f, 0.313682f, 0.319502f, 0.325310f, 0.331106f,
+ 0.336890f, 0.342661f, 0.348419f, 0.354164f, 0.359895f, 0.365613f, 0.371317f, 0.377007f,
+ 0.382683f, 0.388345f, 0.393992f, 0.399624f, 0.405241f, 0.410843f, 0.416430f, 0.422000f,
+ 0.427555f, 0.433094f, 0.438616f, 0.444122f, 0.449611f, 0.455084f, 0.460539f, 0.465977f,
+ 0.471397f, 0.476799f, 0.482184f, 0.487550f, 0.492898f, 0.498228f, 0.503538f, 0.508830f,
+ 0.514103f, 0.519356f, 0.524590f, 0.529804f, 0.534998f, 0.540171f, 0.545325f, 0.550458f,
+ 0.555570f, 0.560662f, 0.565732f, 0.570781f, 0.575808f, 0.580814f, 0.585798f, 0.590760f,
+ 0.595699f, 0.600616f, 0.605511f, 0.610383f, 0.615232f, 0.620057f, 0.624860f, 0.629638f,
+ 0.634393f, 0.639124f, 0.643832f, 0.648514f, 0.653173f, 0.657807f, 0.662416f, 0.667000f,
+ 0.671559f, 0.676093f, 0.680601f, 0.685084f, 0.689541f, 0.693971f, 0.698376f, 0.702755f,
+ 0.707107f, 0.711432f, 0.715731f, 0.720003f, 0.724247f, 0.728464f, 0.732654f, 0.736817f,
+ 0.740951f, 0.745058f, 0.749136f, 0.753187f, 0.757209f, 0.761202f, 0.765167f, 0.769103f,
+ 0.773010f, 0.776888f, 0.780737f, 0.784557f, 0.788346f, 0.792107f, 0.795837f, 0.799537f,
+ 0.803208f, 0.806848f, 0.810457f, 0.814036f, 0.817585f, 0.821102f, 0.824589f, 0.828045f,
+ 0.831470f, 0.834863f, 0.838225f, 0.841555f, 0.844854f, 0.848120f, 0.851355f, 0.854558f,
+ 0.857729f, 0.860867f, 0.863973f, 0.867046f, 0.870087f, 0.873095f, 0.876070f, 0.879012f,
+ 0.881921f, 0.884797f, 0.887640f, 0.890449f, 0.893224f, 0.895966f, 0.898674f, 0.901349f,
+ 0.903989f, 0.906596f, 0.909168f, 0.911706f, 0.914210f, 0.916679f, 0.919114f, 0.921514f,
+ 0.923880f, 0.926210f, 0.928506f, 0.930767f, 0.932993f, 0.935184f, 0.937339f, 0.939459f,
+ 0.941544f, 0.943593f, 0.945607f, 0.947586f, 0.949528f, 0.951435f, 0.953306f, 0.955141f,
+ 0.956940f, 0.958703f, 0.960431f, 0.962121f, 0.963776f, 0.965394f, 0.966976f, 0.968522f,
+ 0.970031f, 0.971504f, 0.972940f, 0.974339f, 0.975702f, 0.977028f, 0.978317f, 0.979570f,
+ 0.980785f, 0.981964f, 0.983105f, 0.984210f, 0.985278f, 0.986308f, 0.987301f, 0.988258f,
+ 0.989177f, 0.990058f, 0.990903f, 0.991710f, 0.992480f, 0.993212f, 0.993907f, 0.994565f,
+ 0.995185f, 0.995767f, 0.996313f, 0.996820f, 0.997290f, 0.997723f, 0.998118f, 0.998476f,
+ 0.998795f, 0.999078f, 0.999322f, 0.999529f, 0.999699f, 0.999831f, 0.999925f, 0.999981f,
+ 0.000000f, -0.006136f, -0.012272f, -0.018407f, -0.024541f, -0.030675f, -0.036807f, -0.042938f,
+ -0.049068f, -0.055195f, -0.061321f, -0.067444f, -0.073565f, -0.079682f, -0.085797f, -0.091909f,
+ -0.098017f, -0.104122f, -0.110222f, -0.116319f, -0.122411f, -0.128498f, -0.134581f, -0.140658f,
+ -0.146730f, -0.152797f, -0.158858f, -0.164913f, -0.170962f, -0.177004f, -0.183040f, -0.189069f,
+ -0.195090f, -0.201105f, -0.207111f, -0.213110f, -0.219101f, -0.225084f, -0.231058f, -0.237024f,
+ -0.242980f, -0.248928f, -0.254866f, -0.260794f, -0.266713f, -0.272621f, -0.278520f, -0.284408f,
+ -0.290285f, -0.296151f, -0.302006f, -0.307850f, -0.313682f, -0.319502f, -0.325310f, -0.331106f,
+ -0.336890f, -0.342661f, -0.348419f, -0.354164f, -0.359895f, -0.365613f, -0.371317f, -0.377007f,
+ -0.382683f, -0.388345f, -0.393992f, -0.399624f, -0.405241f, -0.410843f, -0.416430f, -0.422000f,
+ -0.427555f, -0.433094f, -0.438616f, -0.444122f, -0.449611f, -0.455084f, -0.460539f, -0.465977f,
+ -0.471397f, -0.476799f, -0.482184f, -0.487550f, -0.492898f, -0.498228f, -0.503538f, -0.508830f,
+ -0.514103f, -0.519356f, -0.524590f, -0.529804f, -0.534998f, -0.540171f, -0.545325f, -0.550458f,
+ -0.555570f, -0.560662f, -0.565732f, -0.570781f, -0.575808f, -0.580814f, -0.585798f, -0.590760f,
+ -0.595699f, -0.600616f, -0.605511f, -0.610383f, -0.615232f, -0.620057f, -0.624860f, -0.629638f,
+ -0.634393f, -0.639124f, -0.643832f, -0.648514f, -0.653173f, -0.657807f, -0.662416f, -0.667000f,
+ -0.671559f, -0.676093f, -0.680601f, -0.685084f, -0.689541f, -0.693971f, -0.698376f, -0.702755f,
+ -0.707107f, -0.711432f, -0.715731f, -0.720003f, -0.724247f, -0.728464f, -0.732654f, -0.736817f,
+ -0.740951f, -0.745058f, -0.749136f, -0.753187f, -0.757209f, -0.761202f, -0.765167f, -0.769103f,
+ -0.773010f, -0.776888f, -0.780737f, -0.784557f, -0.788346f, -0.792107f, -0.795837f, -0.799537f,
+ -0.803208f, -0.806848f, -0.810457f, -0.814036f, -0.817585f, -0.821102f, -0.824589f, -0.828045f,
+ -0.831470f, -0.834863f, -0.838225f, -0.841555f, -0.844854f, -0.848120f, -0.851355f, -0.854558f,
+ -0.857729f, -0.860867f, -0.863973f, -0.867046f, -0.870087f, -0.873095f, -0.876070f, -0.879012f,
+ -0.881921f, -0.884797f, -0.887640f, -0.890449f, -0.893224f, -0.895966f, -0.898674f, -0.901349f,
+ -0.903989f, -0.906596f, -0.909168f, -0.911706f, -0.914210f, -0.916679f, -0.919114f, -0.921514f,
+ -0.923880f, -0.926210f, -0.928506f, -0.930767f, -0.932993f, -0.935184f, -0.937339f, -0.939459f,
+ -0.941544f, -0.943593f, -0.945607f, -0.947586f, -0.949528f, -0.951435f, -0.953306f, -0.955141f,
+ -0.956940f, -0.958703f, -0.960431f, -0.962121f, -0.963776f, -0.965394f, -0.966976f, -0.968522f,
+ -0.970031f, -0.971504f, -0.972940f, -0.974339f, -0.975702f, -0.977028f, -0.978317f, -0.979570f,
+ -0.980785f, -0.981964f, -0.983105f, -0.984210f, -0.985278f, -0.986308f, -0.987301f, -0.988258f,
+ -0.989177f, -0.990058f, -0.990903f, -0.991710f, -0.992480f, -0.993212f, -0.993907f, -0.994565f,
+ -0.995185f, -0.995767f, -0.996313f, -0.996820f, -0.997290f, -0.997723f, -0.998118f, -0.998476f,
+ -0.998795f, -0.999078f, -0.999322f, -0.999529f, -0.999699f, -0.999831f, -0.999925f, -0.999981f
+};
+
+static const float sinTable2048[1024] = {
+ 0.000000f, 0.003068f, 0.006136f, 0.009204f, 0.012272f, 0.015339f, 0.018407f, 0.021474f,
+ 0.024541f, 0.027608f, 0.030675f, 0.033741f, 0.036807f, 0.039873f, 0.042938f, 0.046003f,
+ 0.049068f, 0.052132f, 0.055195f, 0.058258f, 0.061321f, 0.064383f, 0.067444f, 0.070505f,
+ 0.073565f, 0.076624f, 0.079682f, 0.082740f, 0.085797f, 0.088854f, 0.091909f, 0.094963f,
+ 0.098017f, 0.101070f, 0.104122f, 0.107172f, 0.110222f, 0.113271f, 0.116319f, 0.119365f,
+ 0.122411f, 0.125455f, 0.128498f, 0.131540f, 0.134581f, 0.137620f, 0.140658f, 0.143695f,
+ 0.146730f, 0.149765f, 0.152797f, 0.155828f, 0.158858f, 0.161886f, 0.164913f, 0.167938f,
+ 0.170962f, 0.173984f, 0.177004f, 0.180023f, 0.183040f, 0.186055f, 0.189069f, 0.192080f,
+ 0.195090f, 0.198098f, 0.201105f, 0.204109f, 0.207111f, 0.210112f, 0.213110f, 0.216107f,
+ 0.219101f, 0.222094f, 0.225084f, 0.228072f, 0.231058f, 0.234042f, 0.237024f, 0.240003f,
+ 0.242980f, 0.245955f, 0.248928f, 0.251898f, 0.254866f, 0.257831f, 0.260794f, 0.263755f,
+ 0.266713f, 0.269668f, 0.272621f, 0.275572f, 0.278520f, 0.281465f, 0.284408f, 0.287347f,
+ 0.290285f, 0.293219f, 0.296151f, 0.299080f, 0.302006f, 0.304929f, 0.307850f, 0.310767f,
+ 0.313682f, 0.316593f, 0.319502f, 0.322408f, 0.325310f, 0.328210f, 0.331106f, 0.334000f,
+ 0.336890f, 0.339777f, 0.342661f, 0.345541f, 0.348419f, 0.351293f, 0.354164f, 0.357031f,
+ 0.359895f, 0.362756f, 0.365613f, 0.368467f, 0.371317f, 0.374164f, 0.377007f, 0.379847f,
+ 0.382683f, 0.385516f, 0.388345f, 0.391170f, 0.393992f, 0.396810f, 0.399624f, 0.402435f,
+ 0.405241f, 0.408044f, 0.410843f, 0.413638f, 0.416430f, 0.419217f, 0.422000f, 0.424780f,
+ 0.427555f, 0.430326f, 0.433094f, 0.435857f, 0.438616f, 0.441371f, 0.444122f, 0.446869f,
+ 0.449611f, 0.452350f, 0.455084f, 0.457813f, 0.460539f, 0.463260f, 0.465977f, 0.468689f,
+ 0.471397f, 0.474100f, 0.476799f, 0.479494f, 0.482184f, 0.484869f, 0.487550f, 0.490226f,
+ 0.492898f, 0.495565f, 0.498228f, 0.500885f, 0.503538f, 0.506187f, 0.508830f, 0.511469f,
+ 0.514103f, 0.516732f, 0.519356f, 0.521975f, 0.524590f, 0.527199f, 0.529804f, 0.532403f,
+ 0.534998f, 0.537587f, 0.540171f, 0.542751f, 0.545325f, 0.547894f, 0.550458f, 0.553017f,
+ 0.555570f, 0.558119f, 0.560662f, 0.563199f, 0.565732f, 0.568259f, 0.570781f, 0.573297f,
+ 0.575808f, 0.578314f, 0.580814f, 0.583309f, 0.585798f, 0.588282f, 0.590760f, 0.593232f,
+ 0.595699f, 0.598161f, 0.600616f, 0.603067f, 0.605511f, 0.607950f, 0.610383f, 0.612810f,
+ 0.615232f, 0.617647f, 0.620057f, 0.622461f, 0.624860f, 0.627252f, 0.629638f, 0.632019f,
+ 0.634393f, 0.636762f, 0.639124f, 0.641481f, 0.643832f, 0.646176f, 0.648514f, 0.650847f,
+ 0.653173f, 0.655493f, 0.657807f, 0.660114f, 0.662416f, 0.664711f, 0.667000f, 0.669283f,
+ 0.671559f, 0.673829f, 0.676093f, 0.678350f, 0.680601f, 0.682846f, 0.685084f, 0.687315f,
+ 0.689541f, 0.691759f, 0.693971f, 0.696177f, 0.698376f, 0.700569f, 0.702755f, 0.704934f,
+ 0.707107f, 0.709273f, 0.711432f, 0.713585f, 0.715731f, 0.717870f, 0.720003f, 0.722128f,
+ 0.724247f, 0.726359f, 0.728464f, 0.730563f, 0.732654f, 0.734739f, 0.736817f, 0.738887f,
+ 0.740951f, 0.743008f, 0.745058f, 0.747101f, 0.749136f, 0.751165f, 0.753187f, 0.755201f,
+ 0.757209f, 0.759209f, 0.761202f, 0.763188f, 0.765167f, 0.767139f, 0.769103f, 0.771061f,
+ 0.773010f, 0.774953f, 0.776888f, 0.778817f, 0.780737f, 0.782651f, 0.784557f, 0.786455f,
+ 0.788346f, 0.790230f, 0.792107f, 0.793975f, 0.795837f, 0.797691f, 0.799537f, 0.801376f,
+ 0.803208f, 0.805031f, 0.806848f, 0.808656f, 0.810457f, 0.812251f, 0.814036f, 0.815814f,
+ 0.817585f, 0.819348f, 0.821102f, 0.822850f, 0.824589f, 0.826321f, 0.828045f, 0.829761f,
+ 0.831470f, 0.833170f, 0.834863f, 0.836548f, 0.838225f, 0.839894f, 0.841555f, 0.843208f,
+ 0.844854f, 0.846491f, 0.848120f, 0.849742f, 0.851355f, 0.852961f, 0.854558f, 0.856147f,
+ 0.857729f, 0.859302f, 0.860867f, 0.862424f, 0.863973f, 0.865514f, 0.867046f, 0.868571f,
+ 0.870087f, 0.871595f, 0.873095f, 0.874587f, 0.876070f, 0.877545f, 0.879012f, 0.880471f,
+ 0.881921f, 0.883363f, 0.884797f, 0.886223f, 0.887640f, 0.889048f, 0.890449f, 0.891841f,
+ 0.893224f, 0.894599f, 0.895966f, 0.897325f, 0.898674f, 0.900016f, 0.901349f, 0.902673f,
+ 0.903989f, 0.905297f, 0.906596f, 0.907886f, 0.909168f, 0.910441f, 0.911706f, 0.912962f,
+ 0.914210f, 0.915449f, 0.916679f, 0.917901f, 0.919114f, 0.920318f, 0.921514f, 0.922701f,
+ 0.923880f, 0.925049f, 0.926210f, 0.927363f, 0.928506f, 0.929641f, 0.930767f, 0.931884f,
+ 0.932993f, 0.934093f, 0.935184f, 0.936266f, 0.937339f, 0.938404f, 0.939459f, 0.940506f,
+ 0.941544f, 0.942573f, 0.943593f, 0.944605f, 0.945607f, 0.946601f, 0.947586f, 0.948561f,
+ 0.949528f, 0.950486f, 0.951435f, 0.952375f, 0.953306f, 0.954228f, 0.955141f, 0.956045f,
+ 0.956940f, 0.957826f, 0.958703f, 0.959572f, 0.960431f, 0.961280f, 0.962121f, 0.962953f,
+ 0.963776f, 0.964590f, 0.965394f, 0.966190f, 0.966976f, 0.967754f, 0.968522f, 0.969281f,
+ 0.970031f, 0.970772f, 0.971504f, 0.972227f, 0.972940f, 0.973644f, 0.974339f, 0.975025f,
+ 0.975702f, 0.976370f, 0.977028f, 0.977677f, 0.978317f, 0.978948f, 0.979570f, 0.980182f,
+ 0.980785f, 0.981379f, 0.981964f, 0.982539f, 0.983105f, 0.983662f, 0.984210f, 0.984748f,
+ 0.985278f, 0.985798f, 0.986308f, 0.986809f, 0.987301f, 0.987784f, 0.988258f, 0.988722f,
+ 0.989177f, 0.989622f, 0.990058f, 0.990485f, 0.990903f, 0.991311f, 0.991710f, 0.992099f,
+ 0.992480f, 0.992850f, 0.993212f, 0.993564f, 0.993907f, 0.994240f, 0.994565f, 0.994879f,
+ 0.995185f, 0.995481f, 0.995767f, 0.996045f, 0.996313f, 0.996571f, 0.996820f, 0.997060f,
+ 0.997290f, 0.997511f, 0.997723f, 0.997925f, 0.998118f, 0.998302f, 0.998476f, 0.998640f,
+ 0.998795f, 0.998941f, 0.999078f, 0.999205f, 0.999322f, 0.999431f, 0.999529f, 0.999619f,
+ 0.999699f, 0.999769f, 0.999831f, 0.999882f, 0.999925f, 0.999958f, 0.999981f, 0.999995f,
+ 0.000000f, -0.003068f, -0.006136f, -0.009204f, -0.012272f, -0.015339f, -0.018407f, -0.021474f,
+ -0.024541f, -0.027608f, -0.030675f, -0.033741f, -0.036807f, -0.039873f, -0.042938f, -0.046003f,
+ -0.049068f, -0.052132f, -0.055195f, -0.058258f, -0.061321f, -0.064383f, -0.067444f, -0.070505f,
+ -0.073565f, -0.076624f, -0.079682f, -0.082740f, -0.085797f, -0.088854f, -0.091909f, -0.094963f,
+ -0.098017f, -0.101070f, -0.104122f, -0.107172f, -0.110222f, -0.113271f, -0.116319f, -0.119365f,
+ -0.122411f, -0.125455f, -0.128498f, -0.131540f, -0.134581f, -0.137620f, -0.140658f, -0.143695f,
+ -0.146730f, -0.149765f, -0.152797f, -0.155828f, -0.158858f, -0.161886f, -0.164913f, -0.167938f,
+ -0.170962f, -0.173984f, -0.177004f, -0.180023f, -0.183040f, -0.186055f, -0.189069f, -0.192080f,
+ -0.195090f, -0.198098f, -0.201105f, -0.204109f, -0.207111f, -0.210112f, -0.213110f, -0.216107f,
+ -0.219101f, -0.222094f, -0.225084f, -0.228072f, -0.231058f, -0.234042f, -0.237024f, -0.240003f,
+ -0.242980f, -0.245955f, -0.248928f, -0.251898f, -0.254866f, -0.257831f, -0.260794f, -0.263755f,
+ -0.266713f, -0.269668f, -0.272621f, -0.275572f, -0.278520f, -0.281465f, -0.284408f, -0.287347f,
+ -0.290285f, -0.293219f, -0.296151f, -0.299080f, -0.302006f, -0.304929f, -0.307850f, -0.310767f,
+ -0.313682f, -0.316593f, -0.319502f, -0.322408f, -0.325310f, -0.328210f, -0.331106f, -0.334000f,
+ -0.336890f, -0.339777f, -0.342661f, -0.345541f, -0.348419f, -0.351293f, -0.354164f, -0.357031f,
+ -0.359895f, -0.362756f, -0.365613f, -0.368467f, -0.371317f, -0.374164f, -0.377007f, -0.379847f,
+ -0.382683f, -0.385516f, -0.388345f, -0.391170f, -0.393992f, -0.396810f, -0.399624f, -0.402435f,
+ -0.405241f, -0.408044f, -0.410843f, -0.413638f, -0.416430f, -0.419217f, -0.422000f, -0.424780f,
+ -0.427555f, -0.430326f, -0.433094f, -0.435857f, -0.438616f, -0.441371f, -0.444122f, -0.446869f,
+ -0.449611f, -0.452350f, -0.455084f, -0.457813f, -0.460539f, -0.463260f, -0.465977f, -0.468689f,
+ -0.471397f, -0.474100f, -0.476799f, -0.479494f, -0.482184f, -0.484869f, -0.487550f, -0.490226f,
+ -0.492898f, -0.495565f, -0.498228f, -0.500885f, -0.503538f, -0.506187f, -0.508830f, -0.511469f,
+ -0.514103f, -0.516732f, -0.519356f, -0.521975f, -0.524590f, -0.527199f, -0.529804f, -0.532403f,
+ -0.534998f, -0.537587f, -0.540171f, -0.542751f, -0.545325f, -0.547894f, -0.550458f, -0.553017f,
+ -0.555570f, -0.558119f, -0.560662f, -0.563199f, -0.565732f, -0.568259f, -0.570781f, -0.573297f,
+ -0.575808f, -0.578314f, -0.580814f, -0.583309f, -0.585798f, -0.588282f, -0.590760f, -0.593232f,
+ -0.595699f, -0.598161f, -0.600616f, -0.603067f, -0.605511f, -0.607950f, -0.610383f, -0.612810f,
+ -0.615232f, -0.617647f, -0.620057f, -0.622461f, -0.624860f, -0.627252f, -0.629638f, -0.632019f,
+ -0.634393f, -0.636762f, -0.639124f, -0.641481f, -0.643832f, -0.646176f, -0.648514f, -0.650847f,
+ -0.653173f, -0.655493f, -0.657807f, -0.660114f, -0.662416f, -0.664711f, -0.667000f, -0.669283f,
+ -0.671559f, -0.673829f, -0.676093f, -0.678350f, -0.680601f, -0.682846f, -0.685084f, -0.687315f,
+ -0.689541f, -0.691759f, -0.693971f, -0.696177f, -0.698376f, -0.700569f, -0.702755f, -0.704934f,
+ -0.707107f, -0.709273f, -0.711432f, -0.713585f, -0.715731f, -0.717870f, -0.720003f, -0.722128f,
+ -0.724247f, -0.726359f, -0.728464f, -0.730563f, -0.732654f, -0.734739f, -0.736817f, -0.738887f,
+ -0.740951f, -0.743008f, -0.745058f, -0.747101f, -0.749136f, -0.751165f, -0.753187f, -0.755201f,
+ -0.757209f, -0.759209f, -0.761202f, -0.763188f, -0.765167f, -0.767139f, -0.769103f, -0.771061f,
+ -0.773010f, -0.774953f, -0.776888f, -0.778817f, -0.780737f, -0.782651f, -0.784557f, -0.786455f,
+ -0.788346f, -0.790230f, -0.792107f, -0.793975f, -0.795837f, -0.797691f, -0.799537f, -0.801376f,
+ -0.803208f, -0.805031f, -0.806848f, -0.808656f, -0.810457f, -0.812251f, -0.814036f, -0.815814f,
+ -0.817585f, -0.819348f, -0.821102f, -0.822850f, -0.824589f, -0.826321f, -0.828045f, -0.829761f,
+ -0.831470f, -0.833170f, -0.834863f, -0.836548f, -0.838225f, -0.839894f, -0.841555f, -0.843208f,
+ -0.844854f, -0.846491f, -0.848120f, -0.849742f, -0.851355f, -0.852961f, -0.854558f, -0.856147f,
+ -0.857729f, -0.859302f, -0.860867f, -0.862424f, -0.863973f, -0.865514f, -0.867046f, -0.868571f,
+ -0.870087f, -0.871595f, -0.873095f, -0.874587f, -0.876070f, -0.877545f, -0.879012f, -0.880471f,
+ -0.881921f, -0.883363f, -0.884797f, -0.886223f, -0.887640f, -0.889048f, -0.890449f, -0.891841f,
+ -0.893224f, -0.894599f, -0.895966f, -0.897325f, -0.898674f, -0.900016f, -0.901349f, -0.902673f,
+ -0.903989f, -0.905297f, -0.906596f, -0.907886f, -0.909168f, -0.910441f, -0.911706f, -0.912962f,
+ -0.914210f, -0.915449f, -0.916679f, -0.917901f, -0.919114f, -0.920318f, -0.921514f, -0.922701f,
+ -0.923880f, -0.925049f, -0.926210f, -0.927363f, -0.928506f, -0.929641f, -0.930767f, -0.931884f,
+ -0.932993f, -0.934093f, -0.935184f, -0.936266f, -0.937339f, -0.938404f, -0.939459f, -0.940506f,
+ -0.941544f, -0.942573f, -0.943593f, -0.944605f, -0.945607f, -0.946601f, -0.947586f, -0.948561f,
+ -0.949528f, -0.950486f, -0.951435f, -0.952375f, -0.953306f, -0.954228f, -0.955141f, -0.956045f,
+ -0.956940f, -0.957826f, -0.958703f, -0.959572f, -0.960431f, -0.961280f, -0.962121f, -0.962953f,
+ -0.963776f, -0.964590f, -0.965394f, -0.966190f, -0.966976f, -0.967754f, -0.968522f, -0.969281f,
+ -0.970031f, -0.970772f, -0.971504f, -0.972227f, -0.972940f, -0.973644f, -0.974339f, -0.975025f,
+ -0.975702f, -0.976370f, -0.977028f, -0.977677f, -0.978317f, -0.978948f, -0.979570f, -0.980182f,
+ -0.980785f, -0.981379f, -0.981964f, -0.982539f, -0.983105f, -0.983662f, -0.984210f, -0.984748f,
+ -0.985278f, -0.985798f, -0.986308f, -0.986809f, -0.987301f, -0.987784f, -0.988258f, -0.988722f,
+ -0.989177f, -0.989622f, -0.990058f, -0.990485f, -0.990903f, -0.991311f, -0.991710f, -0.992099f,
+ -0.992480f, -0.992850f, -0.993212f, -0.993564f, -0.993907f, -0.994240f, -0.994565f, -0.994879f,
+ -0.995185f, -0.995481f, -0.995767f, -0.996045f, -0.996313f, -0.996571f, -0.996820f, -0.997060f,
+ -0.997290f, -0.997511f, -0.997723f, -0.997925f, -0.998118f, -0.998302f, -0.998476f, -0.998640f,
+ -0.998795f, -0.998941f, -0.999078f, -0.999205f, -0.999322f, -0.999431f, -0.999529f, -0.999619f,
+ -0.999699f, -0.999769f, -0.999831f, -0.999882f, -0.999925f, -0.999958f, -0.999981f, -0.999995f
+};
+
+static const float sinTable4096[2048] = {
+ 0.000000f, 0.001534f, 0.003068f, 0.004602f, 0.006136f, 0.007670f, 0.009204f, 0.010738f,
+ 0.012272f, 0.013805f, 0.015339f, 0.016873f, 0.018407f, 0.019940f, 0.021474f, 0.023008f,
+ 0.024541f, 0.026075f, 0.027608f, 0.029142f, 0.030675f, 0.032208f, 0.033741f, 0.035274f,
+ 0.036807f, 0.038340f, 0.039873f, 0.041406f, 0.042938f, 0.044471f, 0.046003f, 0.047535f,
+ 0.049068f, 0.050600f, 0.052132f, 0.053664f, 0.055195f, 0.056727f, 0.058258f, 0.059790f,
+ 0.061321f, 0.062852f, 0.064383f, 0.065913f, 0.067444f, 0.068974f, 0.070505f, 0.072035f,
+ 0.073565f, 0.075094f, 0.076624f, 0.078153f, 0.079682f, 0.081211f, 0.082740f, 0.084269f,
+ 0.085797f, 0.087326f, 0.088854f, 0.090381f, 0.091909f, 0.093436f, 0.094963f, 0.096490f,
+ 0.098017f, 0.099544f, 0.101070f, 0.102596f, 0.104122f, 0.105647f, 0.107172f, 0.108697f,
+ 0.110222f, 0.111747f, 0.113271f, 0.114795f, 0.116319f, 0.117842f, 0.119365f, 0.120888f,
+ 0.122411f, 0.123933f, 0.125455f, 0.126977f, 0.128498f, 0.130019f, 0.131540f, 0.133061f,
+ 0.134581f, 0.136101f, 0.137620f, 0.139139f, 0.140658f, 0.142177f, 0.143695f, 0.145213f,
+ 0.146730f, 0.148248f, 0.149765f, 0.151281f, 0.152797f, 0.154313f, 0.155828f, 0.157343f,
+ 0.158858f, 0.160372f, 0.161886f, 0.163400f, 0.164913f, 0.166426f, 0.167938f, 0.169450f,
+ 0.170962f, 0.172473f, 0.173984f, 0.175494f, 0.177004f, 0.178514f, 0.180023f, 0.181532f,
+ 0.183040f, 0.184548f, 0.186055f, 0.187562f, 0.189069f, 0.190575f, 0.192080f, 0.193586f,
+ 0.195090f, 0.196595f, 0.198098f, 0.199602f, 0.201105f, 0.202607f, 0.204109f, 0.205610f,
+ 0.207111f, 0.208612f, 0.210112f, 0.211611f, 0.213110f, 0.214609f, 0.216107f, 0.217604f,
+ 0.219101f, 0.220598f, 0.222094f, 0.223589f, 0.225084f, 0.226578f, 0.228072f, 0.229565f,
+ 0.231058f, 0.232550f, 0.234042f, 0.235533f, 0.237024f, 0.238514f, 0.240003f, 0.241492f,
+ 0.242980f, 0.244468f, 0.245955f, 0.247442f, 0.248928f, 0.250413f, 0.251898f, 0.253382f,
+ 0.254866f, 0.256349f, 0.257831f, 0.259313f, 0.260794f, 0.262275f, 0.263755f, 0.265234f,
+ 0.266713f, 0.268191f, 0.269668f, 0.271145f, 0.272621f, 0.274097f, 0.275572f, 0.277046f,
+ 0.278520f, 0.279993f, 0.281465f, 0.282937f, 0.284408f, 0.285878f, 0.287347f, 0.288816f,
+ 0.290285f, 0.291752f, 0.293219f, 0.294685f, 0.296151f, 0.297616f, 0.299080f, 0.300543f,
+ 0.302006f, 0.303468f, 0.304929f, 0.306390f, 0.307850f, 0.309309f, 0.310767f, 0.312225f,
+ 0.313682f, 0.315138f, 0.316593f, 0.318048f, 0.319502f, 0.320955f, 0.322408f, 0.323859f,
+ 0.325310f, 0.326760f, 0.328210f, 0.329658f, 0.331106f, 0.332553f, 0.334000f, 0.335445f,
+ 0.336890f, 0.338334f, 0.339777f, 0.341219f, 0.342661f, 0.344101f, 0.345541f, 0.346980f,
+ 0.348419f, 0.349856f, 0.351293f, 0.352729f, 0.354164f, 0.355598f, 0.357031f, 0.358463f,
+ 0.359895f, 0.361326f, 0.362756f, 0.364185f, 0.365613f, 0.367040f, 0.368467f, 0.369892f,
+ 0.371317f, 0.372741f, 0.374164f, 0.375586f, 0.377007f, 0.378428f, 0.379847f, 0.381266f,
+ 0.382683f, 0.384100f, 0.385516f, 0.386931f, 0.388345f, 0.389758f, 0.391170f, 0.392582f,
+ 0.393992f, 0.395401f, 0.396810f, 0.398218f, 0.399624f, 0.401030f, 0.402435f, 0.403838f,
+ 0.405241f, 0.406643f, 0.408044f, 0.409444f, 0.410843f, 0.412241f, 0.413638f, 0.415034f,
+ 0.416430f, 0.417824f, 0.419217f, 0.420609f, 0.422000f, 0.423390f, 0.424780f, 0.426168f,
+ 0.427555f, 0.428941f, 0.430326f, 0.431711f, 0.433094f, 0.434476f, 0.435857f, 0.437237f,
+ 0.438616f, 0.439994f, 0.441371f, 0.442747f, 0.444122f, 0.445496f, 0.446869f, 0.448241f,
+ 0.449611f, 0.450981f, 0.452350f, 0.453717f, 0.455084f, 0.456449f, 0.457813f, 0.459177f,
+ 0.460539f, 0.461900f, 0.463260f, 0.464619f, 0.465977f, 0.467333f, 0.468689f, 0.470043f,
+ 0.471397f, 0.472749f, 0.474100f, 0.475450f, 0.476799f, 0.478147f, 0.479494f, 0.480839f,
+ 0.482184f, 0.483527f, 0.484869f, 0.486210f, 0.487550f, 0.488889f, 0.490226f, 0.491563f,
+ 0.492898f, 0.494232f, 0.495565f, 0.496897f, 0.498228f, 0.499557f, 0.500885f, 0.502212f,
+ 0.503538f, 0.504863f, 0.506187f, 0.507509f, 0.508830f, 0.510150f, 0.511469f, 0.512786f,
+ 0.514103f, 0.515418f, 0.516732f, 0.518045f, 0.519356f, 0.520666f, 0.521975f, 0.523283f,
+ 0.524590f, 0.525895f, 0.527199f, 0.528502f, 0.529804f, 0.531104f, 0.532403f, 0.533701f,
+ 0.534998f, 0.536293f, 0.537587f, 0.538880f, 0.540171f, 0.541462f, 0.542751f, 0.544039f,
+ 0.545325f, 0.546610f, 0.547894f, 0.549177f, 0.550458f, 0.551738f, 0.553017f, 0.554294f,
+ 0.555570f, 0.556845f, 0.558119f, 0.559391f, 0.560662f, 0.561931f, 0.563199f, 0.564466f,
+ 0.565732f, 0.566996f, 0.568259f, 0.569521f, 0.570781f, 0.572040f, 0.573297f, 0.574553f,
+ 0.575808f, 0.577062f, 0.578314f, 0.579565f, 0.580814f, 0.582062f, 0.583309f, 0.584554f,
+ 0.585798f, 0.587040f, 0.588282f, 0.589521f, 0.590760f, 0.591997f, 0.593232f, 0.594467f,
+ 0.595699f, 0.596931f, 0.598161f, 0.599389f, 0.600616f, 0.601842f, 0.603067f, 0.604290f,
+ 0.605511f, 0.606731f, 0.607950f, 0.609167f, 0.610383f, 0.611597f, 0.612810f, 0.614022f,
+ 0.615232f, 0.616440f, 0.617647f, 0.618853f, 0.620057f, 0.621260f, 0.622461f, 0.623661f,
+ 0.624860f, 0.626056f, 0.627252f, 0.628446f, 0.629638f, 0.630829f, 0.632019f, 0.633207f,
+ 0.634393f, 0.635578f, 0.636762f, 0.637944f, 0.639124f, 0.640303f, 0.641481f, 0.642657f,
+ 0.643832f, 0.645005f, 0.646176f, 0.647346f, 0.648514f, 0.649681f, 0.650847f, 0.652011f,
+ 0.653173f, 0.654334f, 0.655493f, 0.656651f, 0.657807f, 0.658961f, 0.660114f, 0.661266f,
+ 0.662416f, 0.663564f, 0.664711f, 0.665856f, 0.667000f, 0.668142f, 0.669283f, 0.670422f,
+ 0.671559f, 0.672695f, 0.673829f, 0.674962f, 0.676093f, 0.677222f, 0.678350f, 0.679476f,
+ 0.680601f, 0.681724f, 0.682846f, 0.683965f, 0.685084f, 0.686200f, 0.687315f, 0.688429f,
+ 0.689541f, 0.690651f, 0.691759f, 0.692866f, 0.693971f, 0.695075f, 0.696177f, 0.697277f,
+ 0.698376f, 0.699473f, 0.700569f, 0.701663f, 0.702755f, 0.703845f, 0.704934f, 0.706021f,
+ 0.707107f, 0.708191f, 0.709273f, 0.710353f, 0.711432f, 0.712509f, 0.713585f, 0.714659f,
+ 0.715731f, 0.716801f, 0.717870f, 0.718937f, 0.720003f, 0.721066f, 0.722128f, 0.723188f,
+ 0.724247f, 0.725304f, 0.726359f, 0.727413f, 0.728464f, 0.729514f, 0.730563f, 0.731609f,
+ 0.732654f, 0.733697f, 0.734739f, 0.735779f, 0.736817f, 0.737853f, 0.738887f, 0.739920f,
+ 0.740951f, 0.741980f, 0.743008f, 0.744034f, 0.745058f, 0.746080f, 0.747101f, 0.748119f,
+ 0.749136f, 0.750152f, 0.751165f, 0.752177f, 0.753187f, 0.754195f, 0.755201f, 0.756206f,
+ 0.757209f, 0.758210f, 0.759209f, 0.760207f, 0.761202f, 0.762196f, 0.763188f, 0.764179f,
+ 0.765167f, 0.766154f, 0.767139f, 0.768122f, 0.769103f, 0.770083f, 0.771061f, 0.772036f,
+ 0.773010f, 0.773983f, 0.774953f, 0.775922f, 0.776888f, 0.777853f, 0.778817f, 0.779778f,
+ 0.780737f, 0.781695f, 0.782651f, 0.783605f, 0.784557f, 0.785507f, 0.786455f, 0.787402f,
+ 0.788346f, 0.789289f, 0.790230f, 0.791169f, 0.792107f, 0.793042f, 0.793975f, 0.794907f,
+ 0.795837f, 0.796765f, 0.797691f, 0.798615f, 0.799537f, 0.800458f, 0.801376f, 0.802293f,
+ 0.803208f, 0.804120f, 0.805031f, 0.805940f, 0.806848f, 0.807753f, 0.808656f, 0.809558f,
+ 0.810457f, 0.811355f, 0.812251f, 0.813144f, 0.814036f, 0.814926f, 0.815814f, 0.816701f,
+ 0.817585f, 0.818467f, 0.819348f, 0.820226f, 0.821102f, 0.821977f, 0.822850f, 0.823721f,
+ 0.824589f, 0.825456f, 0.826321f, 0.827184f, 0.828045f, 0.828904f, 0.829761f, 0.830616f,
+ 0.831470f, 0.832321f, 0.833170f, 0.834018f, 0.834863f, 0.835706f, 0.836548f, 0.837387f,
+ 0.838225f, 0.839060f, 0.839894f, 0.840725f, 0.841555f, 0.842383f, 0.843208f, 0.844032f,
+ 0.844854f, 0.845673f, 0.846491f, 0.847307f, 0.848120f, 0.848932f, 0.849742f, 0.850549f,
+ 0.851355f, 0.852159f, 0.852961f, 0.853760f, 0.854558f, 0.855354f, 0.856147f, 0.856939f,
+ 0.857729f, 0.858516f, 0.859302f, 0.860085f, 0.860867f, 0.861646f, 0.862424f, 0.863199f,
+ 0.863973f, 0.864744f, 0.865514f, 0.866281f, 0.867046f, 0.867809f, 0.868571f, 0.869330f,
+ 0.870087f, 0.870842f, 0.871595f, 0.872346f, 0.873095f, 0.873842f, 0.874587f, 0.875329f,
+ 0.876070f, 0.876809f, 0.877545f, 0.878280f, 0.879012f, 0.879743f, 0.880471f, 0.881197f,
+ 0.881921f, 0.882643f, 0.883363f, 0.884081f, 0.884797f, 0.885511f, 0.886223f, 0.886932f,
+ 0.887640f, 0.888345f, 0.889048f, 0.889750f, 0.890449f, 0.891146f, 0.891841f, 0.892534f,
+ 0.893224f, 0.893913f, 0.894599f, 0.895284f, 0.895966f, 0.896646f, 0.897325f, 0.898001f,
+ 0.898674f, 0.899346f, 0.900016f, 0.900683f, 0.901349f, 0.902012f, 0.902673f, 0.903332f,
+ 0.903989f, 0.904644f, 0.905297f, 0.905947f, 0.906596f, 0.907242f, 0.907886f, 0.908528f,
+ 0.909168f, 0.909806f, 0.910441f, 0.911075f, 0.911706f, 0.912335f, 0.912962f, 0.913587f,
+ 0.914210f, 0.914830f, 0.915449f, 0.916065f, 0.916679f, 0.917291f, 0.917901f, 0.918508f,
+ 0.919114f, 0.919717f, 0.920318f, 0.920917f, 0.921514f, 0.922109f, 0.922701f, 0.923291f,
+ 0.923880f, 0.924465f, 0.925049f, 0.925631f, 0.926210f, 0.926787f, 0.927363f, 0.927935f,
+ 0.928506f, 0.929075f, 0.929641f, 0.930205f, 0.930767f, 0.931327f, 0.931884f, 0.932440f,
+ 0.932993f, 0.933544f, 0.934093f, 0.934639f, 0.935184f, 0.935726f, 0.936266f, 0.936803f,
+ 0.937339f, 0.937872f, 0.938404f, 0.938932f, 0.939459f, 0.939984f, 0.940506f, 0.941026f,
+ 0.941544f, 0.942060f, 0.942573f, 0.943084f, 0.943593f, 0.944100f, 0.944605f, 0.945107f,
+ 0.945607f, 0.946105f, 0.946601f, 0.947094f, 0.947586f, 0.948075f, 0.948561f, 0.949046f,
+ 0.949528f, 0.950008f, 0.950486f, 0.950962f, 0.951435f, 0.951906f, 0.952375f, 0.952842f,
+ 0.953306f, 0.953768f, 0.954228f, 0.954686f, 0.955141f, 0.955594f, 0.956045f, 0.956494f,
+ 0.956940f, 0.957385f, 0.957826f, 0.958266f, 0.958703f, 0.959139f, 0.959572f, 0.960002f,
+ 0.960431f, 0.960857f, 0.961280f, 0.961702f, 0.962121f, 0.962538f, 0.962953f, 0.963366f,
+ 0.963776f, 0.964184f, 0.964590f, 0.964993f, 0.965394f, 0.965793f, 0.966190f, 0.966584f,
+ 0.966976f, 0.967366f, 0.967754f, 0.968139f, 0.968522f, 0.968903f, 0.969281f, 0.969657f,
+ 0.970031f, 0.970403f, 0.970772f, 0.971139f, 0.971504f, 0.971866f, 0.972227f, 0.972584f,
+ 0.972940f, 0.973293f, 0.973644f, 0.973993f, 0.974339f, 0.974684f, 0.975025f, 0.975365f,
+ 0.975702f, 0.976037f, 0.976370f, 0.976700f, 0.977028f, 0.977354f, 0.977677f, 0.977998f,
+ 0.978317f, 0.978634f, 0.978948f, 0.979260f, 0.979570f, 0.979877f, 0.980182f, 0.980485f,
+ 0.980785f, 0.981083f, 0.981379f, 0.981673f, 0.981964f, 0.982253f, 0.982539f, 0.982824f,
+ 0.983105f, 0.983385f, 0.983662f, 0.983937f, 0.984210f, 0.984480f, 0.984748f, 0.985014f,
+ 0.985278f, 0.985539f, 0.985798f, 0.986054f, 0.986308f, 0.986560f, 0.986809f, 0.987057f,
+ 0.987301f, 0.987544f, 0.987784f, 0.988022f, 0.988258f, 0.988491f, 0.988722f, 0.988950f,
+ 0.989177f, 0.989400f, 0.989622f, 0.989841f, 0.990058f, 0.990273f, 0.990485f, 0.990695f,
+ 0.990903f, 0.991108f, 0.991311f, 0.991511f, 0.991710f, 0.991906f, 0.992099f, 0.992291f,
+ 0.992480f, 0.992666f, 0.992850f, 0.993032f, 0.993212f, 0.993389f, 0.993564f, 0.993737f,
+ 0.993907f, 0.994075f, 0.994240f, 0.994404f, 0.994565f, 0.994723f, 0.994879f, 0.995033f,
+ 0.995185f, 0.995334f, 0.995481f, 0.995625f, 0.995767f, 0.995907f, 0.996045f, 0.996180f,
+ 0.996313f, 0.996443f, 0.996571f, 0.996697f, 0.996820f, 0.996941f, 0.997060f, 0.997176f,
+ 0.997290f, 0.997402f, 0.997511f, 0.997618f, 0.997723f, 0.997825f, 0.997925f, 0.998023f,
+ 0.998118f, 0.998211f, 0.998302f, 0.998390f, 0.998476f, 0.998559f, 0.998640f, 0.998719f,
+ 0.998795f, 0.998870f, 0.998941f, 0.999011f, 0.999078f, 0.999142f, 0.999205f, 0.999265f,
+ 0.999322f, 0.999378f, 0.999431f, 0.999481f, 0.999529f, 0.999575f, 0.999619f, 0.999660f,
+ 0.999699f, 0.999735f, 0.999769f, 0.999801f, 0.999831f, 0.999858f, 0.999882f, 0.999905f,
+ 0.999925f, 0.999942f, 0.999958f, 0.999971f, 0.999981f, 0.999989f, 0.999995f, 0.999999f,
+ 0.000000f, -0.001534f, -0.003068f, -0.004602f, -0.006136f, -0.007670f, -0.009204f, -0.010738f,
+ -0.012272f, -0.013805f, -0.015339f, -0.016873f, -0.018407f, -0.019940f, -0.021474f, -0.023008f,
+ -0.024541f, -0.026075f, -0.027608f, -0.029142f, -0.030675f, -0.032208f, -0.033741f, -0.035274f,
+ -0.036807f, -0.038340f, -0.039873f, -0.041406f, -0.042938f, -0.044471f, -0.046003f, -0.047535f,
+ -0.049068f, -0.050600f, -0.052132f, -0.053664f, -0.055195f, -0.056727f, -0.058258f, -0.059790f,
+ -0.061321f, -0.062852f, -0.064383f, -0.065913f, -0.067444f, -0.068974f, -0.070505f, -0.072035f,
+ -0.073565f, -0.075094f, -0.076624f, -0.078153f, -0.079682f, -0.081211f, -0.082740f, -0.084269f,
+ -0.085797f, -0.087326f, -0.088854f, -0.090381f, -0.091909f, -0.093436f, -0.094963f, -0.096490f,
+ -0.098017f, -0.099544f, -0.101070f, -0.102596f, -0.104122f, -0.105647f, -0.107172f, -0.108697f,
+ -0.110222f, -0.111747f, -0.113271f, -0.114795f, -0.116319f, -0.117842f, -0.119365f, -0.120888f,
+ -0.122411f, -0.123933f, -0.125455f, -0.126977f, -0.128498f, -0.130019f, -0.131540f, -0.133061f,
+ -0.134581f, -0.136101f, -0.137620f, -0.139139f, -0.140658f, -0.142177f, -0.143695f, -0.145213f,
+ -0.146730f, -0.148248f, -0.149765f, -0.151281f, -0.152797f, -0.154313f, -0.155828f, -0.157343f,
+ -0.158858f, -0.160372f, -0.161886f, -0.163400f, -0.164913f, -0.166426f, -0.167938f, -0.169450f,
+ -0.170962f, -0.172473f, -0.173984f, -0.175494f, -0.177004f, -0.178514f, -0.180023f, -0.181532f,
+ -0.183040f, -0.184548f, -0.186055f, -0.187562f, -0.189069f, -0.190575f, -0.192080f, -0.193586f,
+ -0.195090f, -0.196595f, -0.198098f, -0.199602f, -0.201105f, -0.202607f, -0.204109f, -0.205610f,
+ -0.207111f, -0.208612f, -0.210112f, -0.211611f, -0.213110f, -0.214609f, -0.216107f, -0.217604f,
+ -0.219101f, -0.220598f, -0.222094f, -0.223589f, -0.225084f, -0.226578f, -0.228072f, -0.229565f,
+ -0.231058f, -0.232550f, -0.234042f, -0.235533f, -0.237024f, -0.238514f, -0.240003f, -0.241492f,
+ -0.242980f, -0.244468f, -0.245955f, -0.247442f, -0.248928f, -0.250413f, -0.251898f, -0.253382f,
+ -0.254866f, -0.256349f, -0.257831f, -0.259313f, -0.260794f, -0.262275f, -0.263755f, -0.265234f,
+ -0.266713f, -0.268191f, -0.269668f, -0.271145f, -0.272621f, -0.274097f, -0.275572f, -0.277046f,
+ -0.278520f, -0.279993f, -0.281465f, -0.282937f, -0.284408f, -0.285878f, -0.287347f, -0.288816f,
+ -0.290285f, -0.291752f, -0.293219f, -0.294685f, -0.296151f, -0.297616f, -0.299080f, -0.300543f,
+ -0.302006f, -0.303468f, -0.304929f, -0.306390f, -0.307850f, -0.309309f, -0.310767f, -0.312225f,
+ -0.313682f, -0.315138f, -0.316593f, -0.318048f, -0.319502f, -0.320955f, -0.322408f, -0.323859f,
+ -0.325310f, -0.326760f, -0.328210f, -0.329658f, -0.331106f, -0.332553f, -0.334000f, -0.335445f,
+ -0.336890f, -0.338334f, -0.339777f, -0.341219f, -0.342661f, -0.344101f, -0.345541f, -0.346980f,
+ -0.348419f, -0.349856f, -0.351293f, -0.352729f, -0.354164f, -0.355598f, -0.357031f, -0.358463f,
+ -0.359895f, -0.361326f, -0.362756f, -0.364185f, -0.365613f, -0.367040f, -0.368467f, -0.369892f,
+ -0.371317f, -0.372741f, -0.374164f, -0.375586f, -0.377007f, -0.378428f, -0.379847f, -0.381266f,
+ -0.382683f, -0.384100f, -0.385516f, -0.386931f, -0.388345f, -0.389758f, -0.391170f, -0.392582f,
+ -0.393992f, -0.395401f, -0.396810f, -0.398218f, -0.399624f, -0.401030f, -0.402435f, -0.403838f,
+ -0.405241f, -0.406643f, -0.408044f, -0.409444f, -0.410843f, -0.412241f, -0.413638f, -0.415034f,
+ -0.416430f, -0.417824f, -0.419217f, -0.420609f, -0.422000f, -0.423390f, -0.424780f, -0.426168f,
+ -0.427555f, -0.428941f, -0.430326f, -0.431711f, -0.433094f, -0.434476f, -0.435857f, -0.437237f,
+ -0.438616f, -0.439994f, -0.441371f, -0.442747f, -0.444122f, -0.445496f, -0.446869f, -0.448241f,
+ -0.449611f, -0.450981f, -0.452350f, -0.453717f, -0.455084f, -0.456449f, -0.457813f, -0.459177f,
+ -0.460539f, -0.461900f, -0.463260f, -0.464619f, -0.465977f, -0.467333f, -0.468689f, -0.470043f,
+ -0.471397f, -0.472749f, -0.474100f, -0.475450f, -0.476799f, -0.478147f, -0.479494f, -0.480839f,
+ -0.482184f, -0.483527f, -0.484869f, -0.486210f, -0.487550f, -0.488889f, -0.490226f, -0.491563f,
+ -0.492898f, -0.494232f, -0.495565f, -0.496897f, -0.498228f, -0.499557f, -0.500885f, -0.502212f,
+ -0.503538f, -0.504863f, -0.506187f, -0.507509f, -0.508830f, -0.510150f, -0.511469f, -0.512786f,
+ -0.514103f, -0.515418f, -0.516732f, -0.518045f, -0.519356f, -0.520666f, -0.521975f, -0.523283f,
+ -0.524590f, -0.525895f, -0.527199f, -0.528502f, -0.529804f, -0.531104f, -0.532403f, -0.533701f,
+ -0.534998f, -0.536293f, -0.537587f, -0.538880f, -0.540171f, -0.541462f, -0.542751f, -0.544039f,
+ -0.545325f, -0.546610f, -0.547894f, -0.549177f, -0.550458f, -0.551738f, -0.553017f, -0.554294f,
+ -0.555570f, -0.556845f, -0.558119f, -0.559391f, -0.560662f, -0.561931f, -0.563199f, -0.564466f,
+ -0.565732f, -0.566996f, -0.568259f, -0.569521f, -0.570781f, -0.572040f, -0.573297f, -0.574553f,
+ -0.575808f, -0.577062f, -0.578314f, -0.579565f, -0.580814f, -0.582062f, -0.583309f, -0.584554f,
+ -0.585798f, -0.587040f, -0.588282f, -0.589521f, -0.590760f, -0.591997f, -0.593232f, -0.594467f,
+ -0.595699f, -0.596931f, -0.598161f, -0.599389f, -0.600616f, -0.601842f, -0.603067f, -0.604290f,
+ -0.605511f, -0.606731f, -0.607950f, -0.609167f, -0.610383f, -0.611597f, -0.612810f, -0.614022f,
+ -0.615232f, -0.616440f, -0.617647f, -0.618853f, -0.620057f, -0.621260f, -0.622461f, -0.623661f,
+ -0.624860f, -0.626056f, -0.627252f, -0.628446f, -0.629638f, -0.630829f, -0.632019f, -0.633207f,
+ -0.634393f, -0.635578f, -0.636762f, -0.637944f, -0.639124f, -0.640303f, -0.641481f, -0.642657f,
+ -0.643832f, -0.645005f, -0.646176f, -0.647346f, -0.648514f, -0.649681f, -0.650847f, -0.652011f,
+ -0.653173f, -0.654334f, -0.655493f, -0.656651f, -0.657807f, -0.658961f, -0.660114f, -0.661266f,
+ -0.662416f, -0.663564f, -0.664711f, -0.665856f, -0.667000f, -0.668142f, -0.669283f, -0.670422f,
+ -0.671559f, -0.672695f, -0.673829f, -0.674962f, -0.676093f, -0.677222f, -0.678350f, -0.679476f,
+ -0.680601f, -0.681724f, -0.682846f, -0.683965f, -0.685084f, -0.686200f, -0.687315f, -0.688429f,
+ -0.689541f, -0.690651f, -0.691759f, -0.692866f, -0.693971f, -0.695075f, -0.696177f, -0.697277f,
+ -0.698376f, -0.699473f, -0.700569f, -0.701663f, -0.702755f, -0.703845f, -0.704934f, -0.706021f,
+ -0.707107f, -0.708191f, -0.709273f, -0.710353f, -0.711432f, -0.712509f, -0.713585f, -0.714659f,
+ -0.715731f, -0.716801f, -0.717870f, -0.718937f, -0.720003f, -0.721066f, -0.722128f, -0.723188f,
+ -0.724247f, -0.725304f, -0.726359f, -0.727413f, -0.728464f, -0.729514f, -0.730563f, -0.731609f,
+ -0.732654f, -0.733697f, -0.734739f, -0.735779f, -0.736817f, -0.737853f, -0.738887f, -0.739920f,
+ -0.740951f, -0.741980f, -0.743008f, -0.744034f, -0.745058f, -0.746080f, -0.747101f, -0.748119f,
+ -0.749136f, -0.750152f, -0.751165f, -0.752177f, -0.753187f, -0.754195f, -0.755201f, -0.756206f,
+ -0.757209f, -0.758210f, -0.759209f, -0.760207f, -0.761202f, -0.762196f, -0.763188f, -0.764179f,
+ -0.765167f, -0.766154f, -0.767139f, -0.768122f, -0.769103f, -0.770083f, -0.771061f, -0.772036f,
+ -0.773010f, -0.773983f, -0.774953f, -0.775922f, -0.776888f, -0.777853f, -0.778817f, -0.779778f,
+ -0.780737f, -0.781695f, -0.782651f, -0.783605f, -0.784557f, -0.785507f, -0.786455f, -0.787402f,
+ -0.788346f, -0.789289f, -0.790230f, -0.791169f, -0.792107f, -0.793042f, -0.793975f, -0.794907f,
+ -0.795837f, -0.796765f, -0.797691f, -0.798615f, -0.799537f, -0.800458f, -0.801376f, -0.802293f,
+ -0.803208f, -0.804120f, -0.805031f, -0.805940f, -0.806848f, -0.807753f, -0.808656f, -0.809558f,
+ -0.810457f, -0.811355f, -0.812251f, -0.813144f, -0.814036f, -0.814926f, -0.815814f, -0.816701f,
+ -0.817585f, -0.818467f, -0.819348f, -0.820226f, -0.821102f, -0.821977f, -0.822850f, -0.823721f,
+ -0.824589f, -0.825456f, -0.826321f, -0.827184f, -0.828045f, -0.828904f, -0.829761f, -0.830616f,
+ -0.831470f, -0.832321f, -0.833170f, -0.834018f, -0.834863f, -0.835706f, -0.836548f, -0.837387f,
+ -0.838225f, -0.839060f, -0.839894f, -0.840725f, -0.841555f, -0.842383f, -0.843208f, -0.844032f,
+ -0.844854f, -0.845673f, -0.846491f, -0.847307f, -0.848120f, -0.848932f, -0.849742f, -0.850549f,
+ -0.851355f, -0.852159f, -0.852961f, -0.853760f, -0.854558f, -0.855354f, -0.856147f, -0.856939f,
+ -0.857729f, -0.858516f, -0.859302f, -0.860085f, -0.860867f, -0.861646f, -0.862424f, -0.863199f,
+ -0.863973f, -0.864744f, -0.865514f, -0.866281f, -0.867046f, -0.867809f, -0.868571f, -0.869330f,
+ -0.870087f, -0.870842f, -0.871595f, -0.872346f, -0.873095f, -0.873842f, -0.874587f, -0.875329f,
+ -0.876070f, -0.876809f, -0.877545f, -0.878280f, -0.879012f, -0.879743f, -0.880471f, -0.881197f,
+ -0.881921f, -0.882643f, -0.883363f, -0.884081f, -0.884797f, -0.885511f, -0.886223f, -0.886932f,
+ -0.887640f, -0.888345f, -0.889048f, -0.889750f, -0.890449f, -0.891146f, -0.891841f, -0.892534f,
+ -0.893224f, -0.893913f, -0.894599f, -0.895284f, -0.895966f, -0.896646f, -0.897325f, -0.898001f,
+ -0.898674f, -0.899346f, -0.900016f, -0.900683f, -0.901349f, -0.902012f, -0.902673f, -0.903332f,
+ -0.903989f, -0.904644f, -0.905297f, -0.905947f, -0.906596f, -0.907242f, -0.907886f, -0.908528f,
+ -0.909168f, -0.909806f, -0.910441f, -0.911075f, -0.911706f, -0.912335f, -0.912962f, -0.913587f,
+ -0.914210f, -0.914830f, -0.915449f, -0.916065f, -0.916679f, -0.917291f, -0.917901f, -0.918508f,
+ -0.919114f, -0.919717f, -0.920318f, -0.920917f, -0.921514f, -0.922109f, -0.922701f, -0.923291f,
+ -0.923880f, -0.924465f, -0.925049f, -0.925631f, -0.926210f, -0.926787f, -0.927363f, -0.927935f,
+ -0.928506f, -0.929075f, -0.929641f, -0.930205f, -0.930767f, -0.931327f, -0.931884f, -0.932440f,
+ -0.932993f, -0.933544f, -0.934093f, -0.934639f, -0.935184f, -0.935726f, -0.936266f, -0.936803f,
+ -0.937339f, -0.937872f, -0.938404f, -0.938932f, -0.939459f, -0.939984f, -0.940506f, -0.941026f,
+ -0.941544f, -0.942060f, -0.942573f, -0.943084f, -0.943593f, -0.944100f, -0.944605f, -0.945107f,
+ -0.945607f, -0.946105f, -0.946601f, -0.947094f, -0.947586f, -0.948075f, -0.948561f, -0.949046f,
+ -0.949528f, -0.950008f, -0.950486f, -0.950962f, -0.951435f, -0.951906f, -0.952375f, -0.952842f,
+ -0.953306f, -0.953768f, -0.954228f, -0.954686f, -0.955141f, -0.955594f, -0.956045f, -0.956494f,
+ -0.956940f, -0.957385f, -0.957826f, -0.958266f, -0.958703f, -0.959139f, -0.959572f, -0.960002f,
+ -0.960431f, -0.960857f, -0.961280f, -0.961702f, -0.962121f, -0.962538f, -0.962953f, -0.963366f,
+ -0.963776f, -0.964184f, -0.964590f, -0.964993f, -0.965394f, -0.965793f, -0.966190f, -0.966584f,
+ -0.966976f, -0.967366f, -0.967754f, -0.968139f, -0.968522f, -0.968903f, -0.969281f, -0.969657f,
+ -0.970031f, -0.970403f, -0.970772f, -0.971139f, -0.971504f, -0.971866f, -0.972227f, -0.972584f,
+ -0.972940f, -0.973293f, -0.973644f, -0.973993f, -0.974339f, -0.974684f, -0.975025f, -0.975365f,
+ -0.975702f, -0.976037f, -0.976370f, -0.976700f, -0.977028f, -0.977354f, -0.977677f, -0.977998f,
+ -0.978317f, -0.978634f, -0.978948f, -0.979260f, -0.979570f, -0.979877f, -0.980182f, -0.980485f,
+ -0.980785f, -0.981083f, -0.981379f, -0.981673f, -0.981964f, -0.982253f, -0.982539f, -0.982824f,
+ -0.983105f, -0.983385f, -0.983662f, -0.983937f, -0.984210f, -0.984480f, -0.984748f, -0.985014f,
+ -0.985278f, -0.985539f, -0.985798f, -0.986054f, -0.986308f, -0.986560f, -0.986809f, -0.987057f,
+ -0.987301f, -0.987544f, -0.987784f, -0.988022f, -0.988258f, -0.988491f, -0.988722f, -0.988950f,
+ -0.989177f, -0.989400f, -0.989622f, -0.989841f, -0.990058f, -0.990273f, -0.990485f, -0.990695f,
+ -0.990903f, -0.991108f, -0.991311f, -0.991511f, -0.991710f, -0.991906f, -0.992099f, -0.992291f,
+ -0.992480f, -0.992666f, -0.992850f, -0.993032f, -0.993212f, -0.993389f, -0.993564f, -0.993737f,
+ -0.993907f, -0.994075f, -0.994240f, -0.994404f, -0.994565f, -0.994723f, -0.994879f, -0.995033f,
+ -0.995185f, -0.995334f, -0.995481f, -0.995625f, -0.995767f, -0.995907f, -0.996045f, -0.996180f,
+ -0.996313f, -0.996443f, -0.996571f, -0.996697f, -0.996820f, -0.996941f, -0.997060f, -0.997176f,
+ -0.997290f, -0.997402f, -0.997511f, -0.997618f, -0.997723f, -0.997825f, -0.997925f, -0.998023f,
+ -0.998118f, -0.998211f, -0.998302f, -0.998390f, -0.998476f, -0.998559f, -0.998640f, -0.998719f,
+ -0.998795f, -0.998870f, -0.998941f, -0.999011f, -0.999078f, -0.999142f, -0.999205f, -0.999265f,
+ -0.999322f, -0.999378f, -0.999431f, -0.999481f, -0.999529f, -0.999575f, -0.999619f, -0.999660f,
+ -0.999699f, -0.999735f, -0.999769f, -0.999801f, -0.999831f, -0.999858f, -0.999882f, -0.999905f,
+ -0.999925f, -0.999942f, -0.999958f, -0.999971f, -0.999981f, -0.999989f, -0.999995f, -0.999999f
+};
+
+static const float sinTable8192[4096] = {
+ 0.000000f, 0.000767f, 0.001534f, 0.002301f, 0.003068f, 0.003835f, 0.004602f, 0.005369f,
+ 0.006136f, 0.006903f, 0.007670f, 0.008437f, 0.009204f, 0.009971f, 0.010738f, 0.011505f,
+ 0.012272f, 0.013038f, 0.013805f, 0.014572f, 0.015339f, 0.016106f, 0.016873f, 0.017640f,
+ 0.018407f, 0.019174f, 0.019940f, 0.020707f, 0.021474f, 0.022241f, 0.023008f, 0.023774f,
+ 0.024541f, 0.025308f, 0.026075f, 0.026841f, 0.027608f, 0.028375f, 0.029142f, 0.029908f,
+ 0.030675f, 0.031441f, 0.032208f, 0.032975f, 0.033741f, 0.034508f, 0.035274f, 0.036041f,
+ 0.036807f, 0.037574f, 0.038340f, 0.039107f, 0.039873f, 0.040639f, 0.041406f, 0.042172f,
+ 0.042938f, 0.043705f, 0.044471f, 0.045237f, 0.046003f, 0.046769f, 0.047535f, 0.048302f,
+ 0.049068f, 0.049834f, 0.050600f, 0.051366f, 0.052132f, 0.052898f, 0.053664f, 0.054429f,
+ 0.055195f, 0.055961f, 0.056727f, 0.057493f, 0.058258f, 0.059024f, 0.059790f, 0.060555f,
+ 0.061321f, 0.062086f, 0.062852f, 0.063617f, 0.064383f, 0.065148f, 0.065913f, 0.066679f,
+ 0.067444f, 0.068209f, 0.068974f, 0.069739f, 0.070505f, 0.071270f, 0.072035f, 0.072800f,
+ 0.073565f, 0.074329f, 0.075094f, 0.075859f, 0.076624f, 0.077389f, 0.078153f, 0.078918f,
+ 0.079682f, 0.080447f, 0.081211f, 0.081976f, 0.082740f, 0.083505f, 0.084269f, 0.085033f,
+ 0.085797f, 0.086561f, 0.087326f, 0.088090f, 0.088854f, 0.089617f, 0.090381f, 0.091145f,
+ 0.091909f, 0.092673f, 0.093436f, 0.094200f, 0.094963f, 0.095727f, 0.096490f, 0.097254f,
+ 0.098017f, 0.098780f, 0.099544f, 0.100307f, 0.101070f, 0.101833f, 0.102596f, 0.103359f,
+ 0.104122f, 0.104884f, 0.105647f, 0.106410f, 0.107172f, 0.107935f, 0.108697f, 0.109460f,
+ 0.110222f, 0.110984f, 0.111747f, 0.112509f, 0.113271f, 0.114033f, 0.114795f, 0.115557f,
+ 0.116319f, 0.117080f, 0.117842f, 0.118604f, 0.119365f, 0.120127f, 0.120888f, 0.121649f,
+ 0.122411f, 0.123172f, 0.123933f, 0.124694f, 0.125455f, 0.126216f, 0.126977f, 0.127737f,
+ 0.128498f, 0.129259f, 0.130019f, 0.130780f, 0.131540f, 0.132300f, 0.133061f, 0.133821f,
+ 0.134581f, 0.135341f, 0.136101f, 0.136860f, 0.137620f, 0.138380f, 0.139139f, 0.139899f,
+ 0.140658f, 0.141418f, 0.142177f, 0.142936f, 0.143695f, 0.144454f, 0.145213f, 0.145972f,
+ 0.146730f, 0.147489f, 0.148248f, 0.149006f, 0.149765f, 0.150523f, 0.151281f, 0.152039f,
+ 0.152797f, 0.153555f, 0.154313f, 0.155071f, 0.155828f, 0.156586f, 0.157343f, 0.158101f,
+ 0.158858f, 0.159615f, 0.160372f, 0.161129f, 0.161886f, 0.162643f, 0.163400f, 0.164157f,
+ 0.164913f, 0.165670f, 0.166426f, 0.167182f, 0.167938f, 0.168694f, 0.169450f, 0.170206f,
+ 0.170962f, 0.171718f, 0.172473f, 0.173229f, 0.173984f, 0.174739f, 0.175494f, 0.176249f,
+ 0.177004f, 0.177759f, 0.178514f, 0.179268f, 0.180023f, 0.180777f, 0.181532f, 0.182286f,
+ 0.183040f, 0.183794f, 0.184548f, 0.185301f, 0.186055f, 0.186809f, 0.187562f, 0.188315f,
+ 0.189069f, 0.189822f, 0.190575f, 0.191328f, 0.192080f, 0.192833f, 0.193586f, 0.194338f,
+ 0.195090f, 0.195843f, 0.196595f, 0.197347f, 0.198098f, 0.198850f, 0.199602f, 0.200353f,
+ 0.201105f, 0.201856f, 0.202607f, 0.203358f, 0.204109f, 0.204860f, 0.205610f, 0.206361f,
+ 0.207111f, 0.207862f, 0.208612f, 0.209362f, 0.210112f, 0.210862f, 0.211611f, 0.212361f,
+ 0.213110f, 0.213860f, 0.214609f, 0.215358f, 0.216107f, 0.216856f, 0.217604f, 0.218353f,
+ 0.219101f, 0.219850f, 0.220598f, 0.221346f, 0.222094f, 0.222841f, 0.223589f, 0.224337f,
+ 0.225084f, 0.225831f, 0.226578f, 0.227325f, 0.228072f, 0.228819f, 0.229565f, 0.230312f,
+ 0.231058f, 0.231804f, 0.232550f, 0.233296f, 0.234042f, 0.234788f, 0.235533f, 0.236278f,
+ 0.237024f, 0.237769f, 0.238514f, 0.239258f, 0.240003f, 0.240748f, 0.241492f, 0.242236f,
+ 0.242980f, 0.243724f, 0.244468f, 0.245212f, 0.245955f, 0.246698f, 0.247442f, 0.248185f,
+ 0.248928f, 0.249670f, 0.250413f, 0.251155f, 0.251898f, 0.252640f, 0.253382f, 0.254124f,
+ 0.254866f, 0.255607f, 0.256349f, 0.257090f, 0.257831f, 0.258572f, 0.259313f, 0.260054f,
+ 0.260794f, 0.261534f, 0.262275f, 0.263015f, 0.263755f, 0.264494f, 0.265234f, 0.265973f,
+ 0.266713f, 0.267452f, 0.268191f, 0.268930f, 0.269668f, 0.270407f, 0.271145f, 0.271883f,
+ 0.272621f, 0.273359f, 0.274097f, 0.274834f, 0.275572f, 0.276309f, 0.277046f, 0.277783f,
+ 0.278520f, 0.279256f, 0.279993f, 0.280729f, 0.281465f, 0.282201f, 0.282937f, 0.283672f,
+ 0.284408f, 0.285143f, 0.285878f, 0.286613f, 0.287347f, 0.288082f, 0.288816f, 0.289551f,
+ 0.290285f, 0.291019f, 0.291752f, 0.292486f, 0.293219f, 0.293952f, 0.294685f, 0.295418f,
+ 0.296151f, 0.296883f, 0.297616f, 0.298348f, 0.299080f, 0.299812f, 0.300543f, 0.301275f,
+ 0.302006f, 0.302737f, 0.303468f, 0.304199f, 0.304929f, 0.305660f, 0.306390f, 0.307120f,
+ 0.307850f, 0.308579f, 0.309309f, 0.310038f, 0.310767f, 0.311496f, 0.312225f, 0.312953f,
+ 0.313682f, 0.314410f, 0.315138f, 0.315866f, 0.316593f, 0.317321f, 0.318048f, 0.318775f,
+ 0.319502f, 0.320229f, 0.320955f, 0.321682f, 0.322408f, 0.323134f, 0.323859f, 0.324585f,
+ 0.325310f, 0.326035f, 0.326760f, 0.327485f, 0.328210f, 0.328934f, 0.329658f, 0.330382f,
+ 0.331106f, 0.331830f, 0.332553f, 0.333277f, 0.334000f, 0.334722f, 0.335445f, 0.336168f,
+ 0.336890f, 0.337612f, 0.338334f, 0.339055f, 0.339777f, 0.340498f, 0.341219f, 0.341940f,
+ 0.342661f, 0.343381f, 0.344101f, 0.344821f, 0.345541f, 0.346261f, 0.346980f, 0.347700f,
+ 0.348419f, 0.349138f, 0.349856f, 0.350575f, 0.351293f, 0.352011f, 0.352729f, 0.353446f,
+ 0.354164f, 0.354881f, 0.355598f, 0.356314f, 0.357031f, 0.357747f, 0.358463f, 0.359179f,
+ 0.359895f, 0.360611f, 0.361326f, 0.362041f, 0.362756f, 0.363470f, 0.364185f, 0.364899f,
+ 0.365613f, 0.366327f, 0.367040f, 0.367754f, 0.368467f, 0.369180f, 0.369892f, 0.370605f,
+ 0.371317f, 0.372029f, 0.372741f, 0.373453f, 0.374164f, 0.374875f, 0.375586f, 0.376297f,
+ 0.377007f, 0.377718f, 0.378428f, 0.379138f, 0.379847f, 0.380557f, 0.381266f, 0.381975f,
+ 0.382683f, 0.383392f, 0.384100f, 0.384808f, 0.385516f, 0.386224f, 0.386931f, 0.387638f,
+ 0.388345f, 0.389052f, 0.389758f, 0.390464f, 0.391170f, 0.391876f, 0.392582f, 0.393287f,
+ 0.393992f, 0.394697f, 0.395401f, 0.396106f, 0.396810f, 0.397514f, 0.398218f, 0.398921f,
+ 0.399624f, 0.400327f, 0.401030f, 0.401732f, 0.402435f, 0.403137f, 0.403838f, 0.404540f,
+ 0.405241f, 0.405942f, 0.406643f, 0.407344f, 0.408044f, 0.408744f, 0.409444f, 0.410144f,
+ 0.410843f, 0.411542f, 0.412241f, 0.412940f, 0.413638f, 0.414337f, 0.415034f, 0.415732f,
+ 0.416430f, 0.417127f, 0.417824f, 0.418520f, 0.419217f, 0.419913f, 0.420609f, 0.421305f,
+ 0.422000f, 0.422695f, 0.423390f, 0.424085f, 0.424780f, 0.425474f, 0.426168f, 0.426862f,
+ 0.427555f, 0.428248f, 0.428941f, 0.429634f, 0.430326f, 0.431019f, 0.431711f, 0.432402f,
+ 0.433094f, 0.433785f, 0.434476f, 0.435167f, 0.435857f, 0.436547f, 0.437237f, 0.437927f,
+ 0.438616f, 0.439305f, 0.439994f, 0.440683f, 0.441371f, 0.442059f, 0.442747f, 0.443435f,
+ 0.444122f, 0.444809f, 0.445496f, 0.446183f, 0.446869f, 0.447555f, 0.448241f, 0.448926f,
+ 0.449611f, 0.450296f, 0.450981f, 0.451665f, 0.452350f, 0.453033f, 0.453717f, 0.454400f,
+ 0.455084f, 0.455766f, 0.456449f, 0.457131f, 0.457813f, 0.458495f, 0.459177f, 0.459858f,
+ 0.460539f, 0.461219f, 0.461900f, 0.462580f, 0.463260f, 0.463939f, 0.464619f, 0.465298f,
+ 0.465977f, 0.466655f, 0.467333f, 0.468011f, 0.468689f, 0.469366f, 0.470043f, 0.470720f,
+ 0.471397f, 0.472073f, 0.472749f, 0.473425f, 0.474100f, 0.474775f, 0.475450f, 0.476125f,
+ 0.476799f, 0.477473f, 0.478147f, 0.478821f, 0.479494f, 0.480167f, 0.480839f, 0.481512f,
+ 0.482184f, 0.482856f, 0.483527f, 0.484198f, 0.484869f, 0.485540f, 0.486210f, 0.486880f,
+ 0.487550f, 0.488220f, 0.488889f, 0.489558f, 0.490226f, 0.490895f, 0.491563f, 0.492231f,
+ 0.492898f, 0.493565f, 0.494232f, 0.494899f, 0.495565f, 0.496231f, 0.496897f, 0.497562f,
+ 0.498228f, 0.498893f, 0.499557f, 0.500221f, 0.500885f, 0.501549f, 0.502212f, 0.502876f,
+ 0.503538f, 0.504201f, 0.504863f, 0.505525f, 0.506187f, 0.506848f, 0.507509f, 0.508170f,
+ 0.508830f, 0.509490f, 0.510150f, 0.510810f, 0.511469f, 0.512128f, 0.512786f, 0.513445f,
+ 0.514103f, 0.514760f, 0.515418f, 0.516075f, 0.516732f, 0.517388f, 0.518045f, 0.518700f,
+ 0.519356f, 0.520011f, 0.520666f, 0.521321f, 0.521975f, 0.522629f, 0.523283f, 0.523937f,
+ 0.524590f, 0.525243f, 0.525895f, 0.526547f, 0.527199f, 0.527851f, 0.528502f, 0.529153f,
+ 0.529804f, 0.530454f, 0.531104f, 0.531754f, 0.532403f, 0.533052f, 0.533701f, 0.534349f,
+ 0.534998f, 0.535645f, 0.536293f, 0.536940f, 0.537587f, 0.538234f, 0.538880f, 0.539526f,
+ 0.540171f, 0.540817f, 0.541462f, 0.542106f, 0.542751f, 0.543395f, 0.544039f, 0.544682f,
+ 0.545325f, 0.545968f, 0.546610f, 0.547252f, 0.547894f, 0.548536f, 0.549177f, 0.549818f,
+ 0.550458f, 0.551098f, 0.551738f, 0.552378f, 0.553017f, 0.553656f, 0.554294f, 0.554932f,
+ 0.555570f, 0.556208f, 0.556845f, 0.557482f, 0.558119f, 0.558755f, 0.559391f, 0.560026f,
+ 0.560662f, 0.561297f, 0.561931f, 0.562565f, 0.563199f, 0.563833f, 0.564466f, 0.565099f,
+ 0.565732f, 0.566364f, 0.566996f, 0.567628f, 0.568259f, 0.568890f, 0.569521f, 0.570151f,
+ 0.570781f, 0.571410f, 0.572040f, 0.572669f, 0.573297f, 0.573925f, 0.574553f, 0.575181f,
+ 0.575808f, 0.576435f, 0.577062f, 0.577688f, 0.578314f, 0.578939f, 0.579565f, 0.580189f,
+ 0.580814f, 0.581438f, 0.582062f, 0.582685f, 0.583309f, 0.583931f, 0.584554f, 0.585176f,
+ 0.585798f, 0.586419f, 0.587040f, 0.587661f, 0.588282f, 0.588902f, 0.589521f, 0.590141f,
+ 0.590760f, 0.591378f, 0.591997f, 0.592615f, 0.593232f, 0.593850f, 0.594467f, 0.595083f,
+ 0.595699f, 0.596315f, 0.596931f, 0.597546f, 0.598161f, 0.598775f, 0.599389f, 0.600003f,
+ 0.600616f, 0.601230f, 0.601842f, 0.602455f, 0.603067f, 0.603678f, 0.604290f, 0.604900f,
+ 0.605511f, 0.606121f, 0.606731f, 0.607341f, 0.607950f, 0.608559f, 0.609167f, 0.609775f,
+ 0.610383f, 0.610990f, 0.611597f, 0.612204f, 0.612810f, 0.613416f, 0.614022f, 0.614627f,
+ 0.615232f, 0.615836f, 0.616440f, 0.617044f, 0.617647f, 0.618250f, 0.618853f, 0.619455f,
+ 0.620057f, 0.620659f, 0.621260f, 0.621861f, 0.622461f, 0.623061f, 0.623661f, 0.624260f,
+ 0.624860f, 0.625458f, 0.626056f, 0.626654f, 0.627252f, 0.627849f, 0.628446f, 0.629042f,
+ 0.629638f, 0.630234f, 0.630829f, 0.631424f, 0.632019f, 0.632613f, 0.633207f, 0.633800f,
+ 0.634393f, 0.634986f, 0.635578f, 0.636170f, 0.636762f, 0.637353f, 0.637944f, 0.638534f,
+ 0.639124f, 0.639714f, 0.640303f, 0.640892f, 0.641481f, 0.642069f, 0.642657f, 0.643245f,
+ 0.643832f, 0.644418f, 0.645005f, 0.645590f, 0.646176f, 0.646761f, 0.647346f, 0.647930f,
+ 0.648514f, 0.649098f, 0.649681f, 0.650264f, 0.650847f, 0.651429f, 0.652011f, 0.652592f,
+ 0.653173f, 0.653753f, 0.654334f, 0.654913f, 0.655493f, 0.656072f, 0.656651f, 0.657229f,
+ 0.657807f, 0.658384f, 0.658961f, 0.659538f, 0.660114f, 0.660690f, 0.661266f, 0.661841f,
+ 0.662416f, 0.662990f, 0.663564f, 0.664138f, 0.664711f, 0.665284f, 0.665856f, 0.666428f,
+ 0.667000f, 0.667571f, 0.668142f, 0.668712f, 0.669283f, 0.669852f, 0.670422f, 0.670990f,
+ 0.671559f, 0.672127f, 0.672695f, 0.673262f, 0.673829f, 0.674396f, 0.674962f, 0.675527f,
+ 0.676093f, 0.676658f, 0.677222f, 0.677786f, 0.678350f, 0.678913f, 0.679476f, 0.680039f,
+ 0.680601f, 0.681163f, 0.681724f, 0.682285f, 0.682846f, 0.683406f, 0.683965f, 0.684525f,
+ 0.685084f, 0.685642f, 0.686200f, 0.686758f, 0.687315f, 0.687872f, 0.688429f, 0.688985f,
+ 0.689541f, 0.690096f, 0.690651f, 0.691205f, 0.691759f, 0.692313f, 0.692866f, 0.693419f,
+ 0.693971f, 0.694524f, 0.695075f, 0.695626f, 0.696177f, 0.696728f, 0.697277f, 0.697827f,
+ 0.698376f, 0.698925f, 0.699473f, 0.700021f, 0.700569f, 0.701116f, 0.701663f, 0.702209f,
+ 0.702755f, 0.703300f, 0.703845f, 0.704390f, 0.704934f, 0.705478f, 0.706021f, 0.706564f,
+ 0.707107f, 0.707649f, 0.708191f, 0.708732f, 0.709273f, 0.709813f, 0.710353f, 0.710893f,
+ 0.711432f, 0.711971f, 0.712509f, 0.713047f, 0.713585f, 0.714122f, 0.714659f, 0.715195f,
+ 0.715731f, 0.716266f, 0.716801f, 0.717336f, 0.717870f, 0.718404f, 0.718937f, 0.719470f,
+ 0.720003f, 0.720535f, 0.721066f, 0.721597f, 0.722128f, 0.722659f, 0.723188f, 0.723718f,
+ 0.724247f, 0.724776f, 0.725304f, 0.725832f, 0.726359f, 0.726886f, 0.727413f, 0.727939f,
+ 0.728464f, 0.728990f, 0.729514f, 0.730039f, 0.730563f, 0.731086f, 0.731609f, 0.732132f,
+ 0.732654f, 0.733176f, 0.733697f, 0.734218f, 0.734739f, 0.735259f, 0.735779f, 0.736298f,
+ 0.736817f, 0.737335f, 0.737853f, 0.738370f, 0.738887f, 0.739404f, 0.739920f, 0.740436f,
+ 0.740951f, 0.741466f, 0.741980f, 0.742494f, 0.743008f, 0.743521f, 0.744034f, 0.744546f,
+ 0.745058f, 0.745569f, 0.746080f, 0.746591f, 0.747101f, 0.747610f, 0.748119f, 0.748628f,
+ 0.749136f, 0.749644f, 0.750152f, 0.750659f, 0.751165f, 0.751671f, 0.752177f, 0.752682f,
+ 0.753187f, 0.753691f, 0.754195f, 0.754698f, 0.755201f, 0.755704f, 0.756206f, 0.756708f,
+ 0.757209f, 0.757710f, 0.758210f, 0.758710f, 0.759209f, 0.759708f, 0.760207f, 0.760705f,
+ 0.761202f, 0.761700f, 0.762196f, 0.762693f, 0.763188f, 0.763684f, 0.764179f, 0.764673f,
+ 0.765167f, 0.765661f, 0.766154f, 0.766647f, 0.767139f, 0.767631f, 0.768122f, 0.768613f,
+ 0.769103f, 0.769593f, 0.770083f, 0.770572f, 0.771061f, 0.771549f, 0.772036f, 0.772524f,
+ 0.773010f, 0.773497f, 0.773983f, 0.774468f, 0.774953f, 0.775438f, 0.775922f, 0.776405f,
+ 0.776888f, 0.777371f, 0.777853f, 0.778335f, 0.778817f, 0.779297f, 0.779778f, 0.780258f,
+ 0.780737f, 0.781216f, 0.781695f, 0.782173f, 0.782651f, 0.783128f, 0.783605f, 0.784081f,
+ 0.784557f, 0.785032f, 0.785507f, 0.785981f, 0.786455f, 0.786929f, 0.787402f, 0.787874f,
+ 0.788346f, 0.788818f, 0.789289f, 0.789760f, 0.790230f, 0.790700f, 0.791169f, 0.791638f,
+ 0.792107f, 0.792575f, 0.793042f, 0.793509f, 0.793975f, 0.794442f, 0.794907f, 0.795372f,
+ 0.795837f, 0.796301f, 0.796765f, 0.797228f, 0.797691f, 0.798153f, 0.798615f, 0.799076f,
+ 0.799537f, 0.799998f, 0.800458f, 0.800917f, 0.801376f, 0.801835f, 0.802293f, 0.802750f,
+ 0.803208f, 0.803664f, 0.804120f, 0.804576f, 0.805031f, 0.805486f, 0.805940f, 0.806394f,
+ 0.806848f, 0.807300f, 0.807753f, 0.808205f, 0.808656f, 0.809107f, 0.809558f, 0.810008f,
+ 0.810457f, 0.810906f, 0.811355f, 0.811803f, 0.812251f, 0.812698f, 0.813144f, 0.813591f,
+ 0.814036f, 0.814482f, 0.814926f, 0.815371f, 0.815814f, 0.816258f, 0.816701f, 0.817143f,
+ 0.817585f, 0.818026f, 0.818467f, 0.818908f, 0.819348f, 0.819787f, 0.820226f, 0.820664f,
+ 0.821102f, 0.821540f, 0.821977f, 0.822414f, 0.822850f, 0.823285f, 0.823721f, 0.824155f,
+ 0.824589f, 0.825023f, 0.825456f, 0.825889f, 0.826321f, 0.826753f, 0.827184f, 0.827615f,
+ 0.828045f, 0.828475f, 0.828904f, 0.829333f, 0.829761f, 0.830189f, 0.830616f, 0.831043f,
+ 0.831470f, 0.831895f, 0.832321f, 0.832746f, 0.833170f, 0.833594f, 0.834018f, 0.834440f,
+ 0.834863f, 0.835285f, 0.835706f, 0.836127f, 0.836548f, 0.836968f, 0.837387f, 0.837806f,
+ 0.838225f, 0.838643f, 0.839060f, 0.839477f, 0.839894f, 0.840310f, 0.840725f, 0.841140f,
+ 0.841555f, 0.841969f, 0.842383f, 0.842796f, 0.843208f, 0.843620f, 0.844032f, 0.844443f,
+ 0.844854f, 0.845264f, 0.845673f, 0.846082f, 0.846491f, 0.846899f, 0.847307f, 0.847714f,
+ 0.848120f, 0.848526f, 0.848932f, 0.849337f, 0.849742f, 0.850146f, 0.850549f, 0.850953f,
+ 0.851355f, 0.851757f, 0.852159f, 0.852560f, 0.852961f, 0.853361f, 0.853760f, 0.854159f,
+ 0.854558f, 0.854956f, 0.855354f, 0.855751f, 0.856147f, 0.856543f, 0.856939f, 0.857334f,
+ 0.857729f, 0.858123f, 0.858516f, 0.858909f, 0.859302f, 0.859694f, 0.860085f, 0.860476f,
+ 0.860867f, 0.861257f, 0.861646f, 0.862035f, 0.862424f, 0.862812f, 0.863199f, 0.863586f,
+ 0.863973f, 0.864359f, 0.864744f, 0.865129f, 0.865514f, 0.865898f, 0.866281f, 0.866664f,
+ 0.867046f, 0.867428f, 0.867809f, 0.868190f, 0.868571f, 0.868951f, 0.869330f, 0.869709f,
+ 0.870087f, 0.870465f, 0.870842f, 0.871219f, 0.871595f, 0.871971f, 0.872346f, 0.872721f,
+ 0.873095f, 0.873469f, 0.873842f, 0.874215f, 0.874587f, 0.874958f, 0.875329f, 0.875700f,
+ 0.876070f, 0.876440f, 0.876809f, 0.877177f, 0.877545f, 0.877913f, 0.878280f, 0.878646f,
+ 0.879012f, 0.879378f, 0.879743f, 0.880107f, 0.880471f, 0.880834f, 0.881197f, 0.881559f,
+ 0.881921f, 0.882283f, 0.882643f, 0.883004f, 0.883363f, 0.883723f, 0.884081f, 0.884439f,
+ 0.884797f, 0.885154f, 0.885511f, 0.885867f, 0.886223f, 0.886578f, 0.886932f, 0.887286f,
+ 0.887640f, 0.887993f, 0.888345f, 0.888697f, 0.889048f, 0.889399f, 0.889750f, 0.890099f,
+ 0.890449f, 0.890797f, 0.891146f, 0.891493f, 0.891841f, 0.892187f, 0.892534f, 0.892879f,
+ 0.893224f, 0.893569f, 0.893913f, 0.894256f, 0.894599f, 0.894942f, 0.895284f, 0.895625f,
+ 0.895966f, 0.896307f, 0.896646f, 0.896986f, 0.897325f, 0.897663f, 0.898001f, 0.898338f,
+ 0.898674f, 0.899011f, 0.899346f, 0.899681f, 0.900016f, 0.900350f, 0.900683f, 0.901016f,
+ 0.901349f, 0.901681f, 0.902012f, 0.902343f, 0.902673f, 0.903003f, 0.903332f, 0.903661f,
+ 0.903989f, 0.904317f, 0.904644f, 0.904971f, 0.905297f, 0.905622f, 0.905947f, 0.906272f,
+ 0.906596f, 0.906919f, 0.907242f, 0.907564f, 0.907886f, 0.908207f, 0.908528f, 0.908848f,
+ 0.909168f, 0.909487f, 0.909806f, 0.910124f, 0.910441f, 0.910758f, 0.911075f, 0.911391f,
+ 0.911706f, 0.912021f, 0.912335f, 0.912649f, 0.912962f, 0.913275f, 0.913587f, 0.913899f,
+ 0.914210f, 0.914520f, 0.914830f, 0.915140f, 0.915449f, 0.915757f, 0.916065f, 0.916372f,
+ 0.916679f, 0.916985f, 0.917291f, 0.917596f, 0.917901f, 0.918205f, 0.918508f, 0.918811f,
+ 0.919114f, 0.919416f, 0.919717f, 0.920018f, 0.920318f, 0.920618f, 0.920917f, 0.921216f,
+ 0.921514f, 0.921812f, 0.922109f, 0.922405f, 0.922701f, 0.922997f, 0.923291f, 0.923586f,
+ 0.923880f, 0.924173f, 0.924465f, 0.924758f, 0.925049f, 0.925340f, 0.925631f, 0.925921f,
+ 0.926210f, 0.926499f, 0.926787f, 0.927075f, 0.927363f, 0.927649f, 0.927935f, 0.928221f,
+ 0.928506f, 0.928791f, 0.929075f, 0.929358f, 0.929641f, 0.929923f, 0.930205f, 0.930486f,
+ 0.930767f, 0.931047f, 0.931327f, 0.931606f, 0.931884f, 0.932162f, 0.932440f, 0.932716f,
+ 0.932993f, 0.933269f, 0.933544f, 0.933818f, 0.934093f, 0.934366f, 0.934639f, 0.934912f,
+ 0.935184f, 0.935455f, 0.935726f, 0.935996f, 0.936266f, 0.936535f, 0.936803f, 0.937072f,
+ 0.937339f, 0.937606f, 0.937872f, 0.938138f, 0.938404f, 0.938668f, 0.938932f, 0.939196f,
+ 0.939459f, 0.939722f, 0.939984f, 0.940245f, 0.940506f, 0.940766f, 0.941026f, 0.941285f,
+ 0.941544f, 0.941802f, 0.942060f, 0.942317f, 0.942573f, 0.942829f, 0.943084f, 0.943339f,
+ 0.943593f, 0.943847f, 0.944100f, 0.944353f, 0.944605f, 0.944856f, 0.945107f, 0.945358f,
+ 0.945607f, 0.945857f, 0.946105f, 0.946353f, 0.946601f, 0.946848f, 0.947094f, 0.947340f,
+ 0.947586f, 0.947830f, 0.948075f, 0.948318f, 0.948561f, 0.948804f, 0.949046f, 0.949287f,
+ 0.949528f, 0.949768f, 0.950008f, 0.950247f, 0.950486f, 0.950724f, 0.950962f, 0.951199f,
+ 0.951435f, 0.951671f, 0.951906f, 0.952141f, 0.952375f, 0.952609f, 0.952842f, 0.953074f,
+ 0.953306f, 0.953537f, 0.953768f, 0.953998f, 0.954228f, 0.954457f, 0.954686f, 0.954914f,
+ 0.955141f, 0.955368f, 0.955594f, 0.955820f, 0.956045f, 0.956270f, 0.956494f, 0.956717f,
+ 0.956940f, 0.957163f, 0.957385f, 0.957606f, 0.957826f, 0.958046f, 0.958266f, 0.958485f,
+ 0.958703f, 0.958921f, 0.959139f, 0.959355f, 0.959572f, 0.959787f, 0.960002f, 0.960217f,
+ 0.960431f, 0.960644f, 0.960857f, 0.961069f, 0.961280f, 0.961492f, 0.961702f, 0.961912f,
+ 0.962121f, 0.962330f, 0.962538f, 0.962746f, 0.962953f, 0.963160f, 0.963366f, 0.963571f,
+ 0.963776f, 0.963980f, 0.964184f, 0.964387f, 0.964590f, 0.964792f, 0.964993f, 0.965194f,
+ 0.965394f, 0.965594f, 0.965793f, 0.965992f, 0.966190f, 0.966387f, 0.966584f, 0.966781f,
+ 0.966976f, 0.967172f, 0.967366f, 0.967560f, 0.967754f, 0.967947f, 0.968139f, 0.968331f,
+ 0.968522f, 0.968713f, 0.968903f, 0.969092f, 0.969281f, 0.969470f, 0.969657f, 0.969845f,
+ 0.970031f, 0.970217f, 0.970403f, 0.970588f, 0.970772f, 0.970956f, 0.971139f, 0.971322f,
+ 0.971504f, 0.971685f, 0.971866f, 0.972047f, 0.972227f, 0.972406f, 0.972584f, 0.972762f,
+ 0.972940f, 0.973117f, 0.973293f, 0.973469f, 0.973644f, 0.973819f, 0.973993f, 0.974166f,
+ 0.974339f, 0.974512f, 0.974684f, 0.974855f, 0.975025f, 0.975195f, 0.975365f, 0.975534f,
+ 0.975702f, 0.975870f, 0.976037f, 0.976204f, 0.976370f, 0.976535f, 0.976700f, 0.976864f,
+ 0.977028f, 0.977191f, 0.977354f, 0.977516f, 0.977677f, 0.977838f, 0.977998f, 0.978158f,
+ 0.978317f, 0.978476f, 0.978634f, 0.978791f, 0.978948f, 0.979104f, 0.979260f, 0.979415f,
+ 0.979570f, 0.979724f, 0.979877f, 0.980030f, 0.980182f, 0.980334f, 0.980485f, 0.980635f,
+ 0.980785f, 0.980935f, 0.981083f, 0.981232f, 0.981379f, 0.981526f, 0.981673f, 0.981819f,
+ 0.981964f, 0.982109f, 0.982253f, 0.982396f, 0.982539f, 0.982682f, 0.982824f, 0.982965f,
+ 0.983105f, 0.983246f, 0.983385f, 0.983524f, 0.983662f, 0.983800f, 0.983937f, 0.984074f,
+ 0.984210f, 0.984346f, 0.984480f, 0.984615f, 0.984748f, 0.984882f, 0.985014f, 0.985146f,
+ 0.985278f, 0.985408f, 0.985539f, 0.985668f, 0.985798f, 0.985926f, 0.986054f, 0.986181f,
+ 0.986308f, 0.986434f, 0.986560f, 0.986685f, 0.986809f, 0.986933f, 0.987057f, 0.987179f,
+ 0.987301f, 0.987423f, 0.987544f, 0.987664f, 0.987784f, 0.987903f, 0.988022f, 0.988140f,
+ 0.988258f, 0.988374f, 0.988491f, 0.988607f, 0.988722f, 0.988836f, 0.988950f, 0.989064f,
+ 0.989177f, 0.989289f, 0.989400f, 0.989511f, 0.989622f, 0.989732f, 0.989841f, 0.989950f,
+ 0.990058f, 0.990166f, 0.990273f, 0.990379f, 0.990485f, 0.990590f, 0.990695f, 0.990799f,
+ 0.990903f, 0.991006f, 0.991108f, 0.991210f, 0.991311f, 0.991411f, 0.991511f, 0.991611f,
+ 0.991710f, 0.991808f, 0.991906f, 0.992003f, 0.992099f, 0.992195f, 0.992291f, 0.992385f,
+ 0.992480f, 0.992573f, 0.992666f, 0.992759f, 0.992850f, 0.992942f, 0.993032f, 0.993122f,
+ 0.993212f, 0.993301f, 0.993389f, 0.993477f, 0.993564f, 0.993651f, 0.993737f, 0.993822f,
+ 0.993907f, 0.993991f, 0.994075f, 0.994158f, 0.994240f, 0.994322f, 0.994404f, 0.994484f,
+ 0.994565f, 0.994644f, 0.994723f, 0.994802f, 0.994879f, 0.994957f, 0.995033f, 0.995109f,
+ 0.995185f, 0.995260f, 0.995334f, 0.995408f, 0.995481f, 0.995553f, 0.995625f, 0.995697f,
+ 0.995767f, 0.995838f, 0.995907f, 0.995976f, 0.996045f, 0.996113f, 0.996180f, 0.996247f,
+ 0.996313f, 0.996378f, 0.996443f, 0.996507f, 0.996571f, 0.996634f, 0.996697f, 0.996759f,
+ 0.996820f, 0.996881f, 0.996941f, 0.997001f, 0.997060f, 0.997119f, 0.997176f, 0.997234f,
+ 0.997290f, 0.997347f, 0.997402f, 0.997457f, 0.997511f, 0.997565f, 0.997618f, 0.997671f,
+ 0.997723f, 0.997774f, 0.997825f, 0.997876f, 0.997925f, 0.997974f, 0.998023f, 0.998071f,
+ 0.998118f, 0.998165f, 0.998211f, 0.998257f, 0.998302f, 0.998346f, 0.998390f, 0.998433f,
+ 0.998476f, 0.998518f, 0.998559f, 0.998600f, 0.998640f, 0.998680f, 0.998719f, 0.998758f,
+ 0.998795f, 0.998833f, 0.998870f, 0.998906f, 0.998941f, 0.998976f, 0.999011f, 0.999044f,
+ 0.999078f, 0.999110f, 0.999142f, 0.999174f, 0.999205f, 0.999235f, 0.999265f, 0.999294f,
+ 0.999322f, 0.999350f, 0.999378f, 0.999404f, 0.999431f, 0.999456f, 0.999481f, 0.999506f,
+ 0.999529f, 0.999553f, 0.999575f, 0.999597f, 0.999619f, 0.999640f, 0.999660f, 0.999680f,
+ 0.999699f, 0.999717f, 0.999735f, 0.999753f, 0.999769f, 0.999786f, 0.999801f, 0.999816f,
+ 0.999831f, 0.999844f, 0.999858f, 0.999870f, 0.999882f, 0.999894f, 0.999905f, 0.999915f,
+ 0.999925f, 0.999934f, 0.999942f, 0.999950f, 0.999958f, 0.999964f, 0.999971f, 0.999976f,
+ 0.999981f, 0.999986f, 0.999989f, 0.999993f, 0.999995f, 0.999997f, 0.999999f, 1.000000f,
+ 0.000000f, -0.000767f, -0.001534f, -0.002301f, -0.003068f, -0.003835f, -0.004602f, -0.005369f,
+ -0.006136f, -0.006903f, -0.007670f, -0.008437f, -0.009204f, -0.009971f, -0.010738f, -0.011505f,
+ -0.012272f, -0.013038f, -0.013805f, -0.014572f, -0.015339f, -0.016106f, -0.016873f, -0.017640f,
+ -0.018407f, -0.019174f, -0.019940f, -0.020707f, -0.021474f, -0.022241f, -0.023008f, -0.023774f,
+ -0.024541f, -0.025308f, -0.026075f, -0.026841f, -0.027608f, -0.028375f, -0.029142f, -0.029908f,
+ -0.030675f, -0.031441f, -0.032208f, -0.032975f, -0.033741f, -0.034508f, -0.035274f, -0.036041f,
+ -0.036807f, -0.037574f, -0.038340f, -0.039107f, -0.039873f, -0.040639f, -0.041406f, -0.042172f,
+ -0.042938f, -0.043705f, -0.044471f, -0.045237f, -0.046003f, -0.046769f, -0.047535f, -0.048302f,
+ -0.049068f, -0.049834f, -0.050600f, -0.051366f, -0.052132f, -0.052898f, -0.053664f, -0.054429f,
+ -0.055195f, -0.055961f, -0.056727f, -0.057493f, -0.058258f, -0.059024f, -0.059790f, -0.060555f,
+ -0.061321f, -0.062086f, -0.062852f, -0.063617f, -0.064383f, -0.065148f, -0.065913f, -0.066679f,
+ -0.067444f, -0.068209f, -0.068974f, -0.069739f, -0.070505f, -0.071270f, -0.072035f, -0.072800f,
+ -0.073565f, -0.074329f, -0.075094f, -0.075859f, -0.076624f, -0.077389f, -0.078153f, -0.078918f,
+ -0.079682f, -0.080447f, -0.081211f, -0.081976f, -0.082740f, -0.083505f, -0.084269f, -0.085033f,
+ -0.085797f, -0.086561f, -0.087326f, -0.088090f, -0.088854f, -0.089617f, -0.090381f, -0.091145f,
+ -0.091909f, -0.092673f, -0.093436f, -0.094200f, -0.094963f, -0.095727f, -0.096490f, -0.097254f,
+ -0.098017f, -0.098780f, -0.099544f, -0.100307f, -0.101070f, -0.101833f, -0.102596f, -0.103359f,
+ -0.104122f, -0.104884f, -0.105647f, -0.106410f, -0.107172f, -0.107935f, -0.108697f, -0.109460f,
+ -0.110222f, -0.110984f, -0.111747f, -0.112509f, -0.113271f, -0.114033f, -0.114795f, -0.115557f,
+ -0.116319f, -0.117080f, -0.117842f, -0.118604f, -0.119365f, -0.120127f, -0.120888f, -0.121649f,
+ -0.122411f, -0.123172f, -0.123933f, -0.124694f, -0.125455f, -0.126216f, -0.126977f, -0.127737f,
+ -0.128498f, -0.129259f, -0.130019f, -0.130780f, -0.131540f, -0.132300f, -0.133061f, -0.133821f,
+ -0.134581f, -0.135341f, -0.136101f, -0.136860f, -0.137620f, -0.138380f, -0.139139f, -0.139899f,
+ -0.140658f, -0.141418f, -0.142177f, -0.142936f, -0.143695f, -0.144454f, -0.145213f, -0.145972f,
+ -0.146730f, -0.147489f, -0.148248f, -0.149006f, -0.149765f, -0.150523f, -0.151281f, -0.152039f,
+ -0.152797f, -0.153555f, -0.154313f, -0.155071f, -0.155828f, -0.156586f, -0.157343f, -0.158101f,
+ -0.158858f, -0.159615f, -0.160372f, -0.161129f, -0.161886f, -0.162643f, -0.163400f, -0.164157f,
+ -0.164913f, -0.165670f, -0.166426f, -0.167182f, -0.167938f, -0.168694f, -0.169450f, -0.170206f,
+ -0.170962f, -0.171718f, -0.172473f, -0.173229f, -0.173984f, -0.174739f, -0.175494f, -0.176249f,
+ -0.177004f, -0.177759f, -0.178514f, -0.179268f, -0.180023f, -0.180777f, -0.181532f, -0.182286f,
+ -0.183040f, -0.183794f, -0.184548f, -0.185301f, -0.186055f, -0.186809f, -0.187562f, -0.188315f,
+ -0.189069f, -0.189822f, -0.190575f, -0.191328f, -0.192080f, -0.192833f, -0.193586f, -0.194338f,
+ -0.195090f, -0.195843f, -0.196595f, -0.197347f, -0.198098f, -0.198850f, -0.199602f, -0.200353f,
+ -0.201105f, -0.201856f, -0.202607f, -0.203358f, -0.204109f, -0.204860f, -0.205610f, -0.206361f,
+ -0.207111f, -0.207862f, -0.208612f, -0.209362f, -0.210112f, -0.210862f, -0.211611f, -0.212361f,
+ -0.213110f, -0.213860f, -0.214609f, -0.215358f, -0.216107f, -0.216856f, -0.217604f, -0.218353f,
+ -0.219101f, -0.219850f, -0.220598f, -0.221346f, -0.222094f, -0.222841f, -0.223589f, -0.224337f,
+ -0.225084f, -0.225831f, -0.226578f, -0.227325f, -0.228072f, -0.228819f, -0.229565f, -0.230312f,
+ -0.231058f, -0.231804f, -0.232550f, -0.233296f, -0.234042f, -0.234788f, -0.235533f, -0.236278f,
+ -0.237024f, -0.237769f, -0.238514f, -0.239258f, -0.240003f, -0.240748f, -0.241492f, -0.242236f,
+ -0.242980f, -0.243724f, -0.244468f, -0.245212f, -0.245955f, -0.246698f, -0.247442f, -0.248185f,
+ -0.248928f, -0.249670f, -0.250413f, -0.251155f, -0.251898f, -0.252640f, -0.253382f, -0.254124f,
+ -0.254866f, -0.255607f, -0.256349f, -0.257090f, -0.257831f, -0.258572f, -0.259313f, -0.260054f,
+ -0.260794f, -0.261534f, -0.262275f, -0.263015f, -0.263755f, -0.264494f, -0.265234f, -0.265973f,
+ -0.266713f, -0.267452f, -0.268191f, -0.268930f, -0.269668f, -0.270407f, -0.271145f, -0.271883f,
+ -0.272621f, -0.273359f, -0.274097f, -0.274834f, -0.275572f, -0.276309f, -0.277046f, -0.277783f,
+ -0.278520f, -0.279256f, -0.279993f, -0.280729f, -0.281465f, -0.282201f, -0.282937f, -0.283672f,
+ -0.284408f, -0.285143f, -0.285878f, -0.286613f, -0.287347f, -0.288082f, -0.288816f, -0.289551f,
+ -0.290285f, -0.291019f, -0.291752f, -0.292486f, -0.293219f, -0.293952f, -0.294685f, -0.295418f,
+ -0.296151f, -0.296883f, -0.297616f, -0.298348f, -0.299080f, -0.299812f, -0.300543f, -0.301275f,
+ -0.302006f, -0.302737f, -0.303468f, -0.304199f, -0.304929f, -0.305660f, -0.306390f, -0.307120f,
+ -0.307850f, -0.308579f, -0.309309f, -0.310038f, -0.310767f, -0.311496f, -0.312225f, -0.312953f,
+ -0.313682f, -0.314410f, -0.315138f, -0.315866f, -0.316593f, -0.317321f, -0.318048f, -0.318775f,
+ -0.319502f, -0.320229f, -0.320955f, -0.321682f, -0.322408f, -0.323134f, -0.323859f, -0.324585f,
+ -0.325310f, -0.326035f, -0.326760f, -0.327485f, -0.328210f, -0.328934f, -0.329658f, -0.330382f,
+ -0.331106f, -0.331830f, -0.332553f, -0.333277f, -0.334000f, -0.334722f, -0.335445f, -0.336168f,
+ -0.336890f, -0.337612f, -0.338334f, -0.339055f, -0.339777f, -0.340498f, -0.341219f, -0.341940f,
+ -0.342661f, -0.343381f, -0.344101f, -0.344821f, -0.345541f, -0.346261f, -0.346980f, -0.347700f,
+ -0.348419f, -0.349138f, -0.349856f, -0.350575f, -0.351293f, -0.352011f, -0.352729f, -0.353446f,
+ -0.354164f, -0.354881f, -0.355598f, -0.356314f, -0.357031f, -0.357747f, -0.358463f, -0.359179f,
+ -0.359895f, -0.360611f, -0.361326f, -0.362041f, -0.362756f, -0.363470f, -0.364185f, -0.364899f,
+ -0.365613f, -0.366327f, -0.367040f, -0.367754f, -0.368467f, -0.369180f, -0.369892f, -0.370605f,
+ -0.371317f, -0.372029f, -0.372741f, -0.373453f, -0.374164f, -0.374875f, -0.375586f, -0.376297f,
+ -0.377007f, -0.377718f, -0.378428f, -0.379138f, -0.379847f, -0.380557f, -0.381266f, -0.381975f,
+ -0.382683f, -0.383392f, -0.384100f, -0.384808f, -0.385516f, -0.386224f, -0.386931f, -0.387638f,
+ -0.388345f, -0.389052f, -0.389758f, -0.390464f, -0.391170f, -0.391876f, -0.392582f, -0.393287f,
+ -0.393992f, -0.394697f, -0.395401f, -0.396106f, -0.396810f, -0.397514f, -0.398218f, -0.398921f,
+ -0.399624f, -0.400327f, -0.401030f, -0.401732f, -0.402435f, -0.403137f, -0.403838f, -0.404540f,
+ -0.405241f, -0.405942f, -0.406643f, -0.407344f, -0.408044f, -0.408744f, -0.409444f, -0.410144f,
+ -0.410843f, -0.411542f, -0.412241f, -0.412940f, -0.413638f, -0.414337f, -0.415034f, -0.415732f,
+ -0.416430f, -0.417127f, -0.417824f, -0.418520f, -0.419217f, -0.419913f, -0.420609f, -0.421305f,
+ -0.422000f, -0.422695f, -0.423390f, -0.424085f, -0.424780f, -0.425474f, -0.426168f, -0.426862f,
+ -0.427555f, -0.428248f, -0.428941f, -0.429634f, -0.430326f, -0.431019f, -0.431711f, -0.432402f,
+ -0.433094f, -0.433785f, -0.434476f, -0.435167f, -0.435857f, -0.436547f, -0.437237f, -0.437927f,
+ -0.438616f, -0.439305f, -0.439994f, -0.440683f, -0.441371f, -0.442059f, -0.442747f, -0.443435f,
+ -0.444122f, -0.444809f, -0.445496f, -0.446183f, -0.446869f, -0.447555f, -0.448241f, -0.448926f,
+ -0.449611f, -0.450296f, -0.450981f, -0.451665f, -0.452350f, -0.453033f, -0.453717f, -0.454400f,
+ -0.455084f, -0.455766f, -0.456449f, -0.457131f, -0.457813f, -0.458495f, -0.459177f, -0.459858f,
+ -0.460539f, -0.461219f, -0.461900f, -0.462580f, -0.463260f, -0.463939f, -0.464619f, -0.465298f,
+ -0.465977f, -0.466655f, -0.467333f, -0.468011f, -0.468689f, -0.469366f, -0.470043f, -0.470720f,
+ -0.471397f, -0.472073f, -0.472749f, -0.473425f, -0.474100f, -0.474775f, -0.475450f, -0.476125f,
+ -0.476799f, -0.477473f, -0.478147f, -0.478821f, -0.479494f, -0.480167f, -0.480839f, -0.481512f,
+ -0.482184f, -0.482856f, -0.483527f, -0.484198f, -0.484869f, -0.485540f, -0.486210f, -0.486880f,
+ -0.487550f, -0.488220f, -0.488889f, -0.489558f, -0.490226f, -0.490895f, -0.491563f, -0.492231f,
+ -0.492898f, -0.493565f, -0.494232f, -0.494899f, -0.495565f, -0.496231f, -0.496897f, -0.497562f,
+ -0.498228f, -0.498893f, -0.499557f, -0.500221f, -0.500885f, -0.501549f, -0.502212f, -0.502876f,
+ -0.503538f, -0.504201f, -0.504863f, -0.505525f, -0.506187f, -0.506848f, -0.507509f, -0.508170f,
+ -0.508830f, -0.509490f, -0.510150f, -0.510810f, -0.511469f, -0.512128f, -0.512786f, -0.513445f,
+ -0.514103f, -0.514760f, -0.515418f, -0.516075f, -0.516732f, -0.517388f, -0.518045f, -0.518700f,
+ -0.519356f, -0.520011f, -0.520666f, -0.521321f, -0.521975f, -0.522629f, -0.523283f, -0.523937f,
+ -0.524590f, -0.525243f, -0.525895f, -0.526547f, -0.527199f, -0.527851f, -0.528502f, -0.529153f,
+ -0.529804f, -0.530454f, -0.531104f, -0.531754f, -0.532403f, -0.533052f, -0.533701f, -0.534349f,
+ -0.534998f, -0.535645f, -0.536293f, -0.536940f, -0.537587f, -0.538234f, -0.538880f, -0.539526f,
+ -0.540171f, -0.540817f, -0.541462f, -0.542106f, -0.542751f, -0.543395f, -0.544039f, -0.544682f,
+ -0.545325f, -0.545968f, -0.546610f, -0.547252f, -0.547894f, -0.548536f, -0.549177f, -0.549818f,
+ -0.550458f, -0.551098f, -0.551738f, -0.552378f, -0.553017f, -0.553656f, -0.554294f, -0.554932f,
+ -0.555570f, -0.556208f, -0.556845f, -0.557482f, -0.558119f, -0.558755f, -0.559391f, -0.560026f,
+ -0.560662f, -0.561297f, -0.561931f, -0.562565f, -0.563199f, -0.563833f, -0.564466f, -0.565099f,
+ -0.565732f, -0.566364f, -0.566996f, -0.567628f, -0.568259f, -0.568890f, -0.569521f, -0.570151f,
+ -0.570781f, -0.571410f, -0.572040f, -0.572669f, -0.573297f, -0.573925f, -0.574553f, -0.575181f,
+ -0.575808f, -0.576435f, -0.577062f, -0.577688f, -0.578314f, -0.578939f, -0.579565f, -0.580189f,
+ -0.580814f, -0.581438f, -0.582062f, -0.582685f, -0.583309f, -0.583931f, -0.584554f, -0.585176f,
+ -0.585798f, -0.586419f, -0.587040f, -0.587661f, -0.588282f, -0.588902f, -0.589521f, -0.590141f,
+ -0.590760f, -0.591378f, -0.591997f, -0.592615f, -0.593232f, -0.593850f, -0.594467f, -0.595083f,
+ -0.595699f, -0.596315f, -0.596931f, -0.597546f, -0.598161f, -0.598775f, -0.599389f, -0.600003f,
+ -0.600616f, -0.601230f, -0.601842f, -0.602455f, -0.603067f, -0.603678f, -0.604290f, -0.604900f,
+ -0.605511f, -0.606121f, -0.606731f, -0.607341f, -0.607950f, -0.608559f, -0.609167f, -0.609775f,
+ -0.610383f, -0.610990f, -0.611597f, -0.612204f, -0.612810f, -0.613416f, -0.614022f, -0.614627f,
+ -0.615232f, -0.615836f, -0.616440f, -0.617044f, -0.617647f, -0.618250f, -0.618853f, -0.619455f,
+ -0.620057f, -0.620659f, -0.621260f, -0.621861f, -0.622461f, -0.623061f, -0.623661f, -0.624260f,
+ -0.624860f, -0.625458f, -0.626056f, -0.626654f, -0.627252f, -0.627849f, -0.628446f, -0.629042f,
+ -0.629638f, -0.630234f, -0.630829f, -0.631424f, -0.632019f, -0.632613f, -0.633207f, -0.633800f,
+ -0.634393f, -0.634986f, -0.635578f, -0.636170f, -0.636762f, -0.637353f, -0.637944f, -0.638534f,
+ -0.639124f, -0.639714f, -0.640303f, -0.640892f, -0.641481f, -0.642069f, -0.642657f, -0.643245f,
+ -0.643832f, -0.644418f, -0.645005f, -0.645590f, -0.646176f, -0.646761f, -0.647346f, -0.647930f,
+ -0.648514f, -0.649098f, -0.649681f, -0.650264f, -0.650847f, -0.651429f, -0.652011f, -0.652592f,
+ -0.653173f, -0.653753f, -0.654334f, -0.654913f, -0.655493f, -0.656072f, -0.656651f, -0.657229f,
+ -0.657807f, -0.658384f, -0.658961f, -0.659538f, -0.660114f, -0.660690f, -0.661266f, -0.661841f,
+ -0.662416f, -0.662990f, -0.663564f, -0.664138f, -0.664711f, -0.665284f, -0.665856f, -0.666428f,
+ -0.667000f, -0.667571f, -0.668142f, -0.668712f, -0.669283f, -0.669852f, -0.670422f, -0.670990f,
+ -0.671559f, -0.672127f, -0.672695f, -0.673262f, -0.673829f, -0.674396f, -0.674962f, -0.675527f,
+ -0.676093f, -0.676658f, -0.677222f, -0.677786f, -0.678350f, -0.678913f, -0.679476f, -0.680039f,
+ -0.680601f, -0.681163f, -0.681724f, -0.682285f, -0.682846f, -0.683406f, -0.683965f, -0.684525f,
+ -0.685084f, -0.685642f, -0.686200f, -0.686758f, -0.687315f, -0.687872f, -0.688429f, -0.688985f,
+ -0.689541f, -0.690096f, -0.690651f, -0.691205f, -0.691759f, -0.692313f, -0.692866f, -0.693419f,
+ -0.693971f, -0.694524f, -0.695075f, -0.695626f, -0.696177f, -0.696728f, -0.697277f, -0.697827f,
+ -0.698376f, -0.698925f, -0.699473f, -0.700021f, -0.700569f, -0.701116f, -0.701663f, -0.702209f,
+ -0.702755f, -0.703300f, -0.703845f, -0.704390f, -0.704934f, -0.705478f, -0.706021f, -0.706564f,
+ -0.707107f, -0.707649f, -0.708191f, -0.708732f, -0.709273f, -0.709813f, -0.710353f, -0.710893f,
+ -0.711432f, -0.711971f, -0.712509f, -0.713047f, -0.713585f, -0.714122f, -0.714659f, -0.715195f,
+ -0.715731f, -0.716266f, -0.716801f, -0.717336f, -0.717870f, -0.718404f, -0.718937f, -0.719470f,
+ -0.720003f, -0.720535f, -0.721066f, -0.721597f, -0.722128f, -0.722659f, -0.723188f, -0.723718f,
+ -0.724247f, -0.724776f, -0.725304f, -0.725832f, -0.726359f, -0.726886f, -0.727413f, -0.727939f,
+ -0.728464f, -0.728990f, -0.729514f, -0.730039f, -0.730563f, -0.731086f, -0.731609f, -0.732132f,
+ -0.732654f, -0.733176f, -0.733697f, -0.734218f, -0.734739f, -0.735259f, -0.735779f, -0.736298f,
+ -0.736817f, -0.737335f, -0.737853f, -0.738370f, -0.738887f, -0.739404f, -0.739920f, -0.740436f,
+ -0.740951f, -0.741466f, -0.741980f, -0.742494f, -0.743008f, -0.743521f, -0.744034f, -0.744546f,
+ -0.745058f, -0.745569f, -0.746080f, -0.746591f, -0.747101f, -0.747610f, -0.748119f, -0.748628f,
+ -0.749136f, -0.749644f, -0.750152f, -0.750659f, -0.751165f, -0.751671f, -0.752177f, -0.752682f,
+ -0.753187f, -0.753691f, -0.754195f, -0.754698f, -0.755201f, -0.755704f, -0.756206f, -0.756708f,
+ -0.757209f, -0.757710f, -0.758210f, -0.758710f, -0.759209f, -0.759708f, -0.760207f, -0.760705f,
+ -0.761202f, -0.761700f, -0.762196f, -0.762693f, -0.763188f, -0.763684f, -0.764179f, -0.764673f,
+ -0.765167f, -0.765661f, -0.766154f, -0.766647f, -0.767139f, -0.767631f, -0.768122f, -0.768613f,
+ -0.769103f, -0.769593f, -0.770083f, -0.770572f, -0.771061f, -0.771549f, -0.772036f, -0.772524f,
+ -0.773010f, -0.773497f, -0.773983f, -0.774468f, -0.774953f, -0.775438f, -0.775922f, -0.776405f,
+ -0.776888f, -0.777371f, -0.777853f, -0.778335f, -0.778817f, -0.779297f, -0.779778f, -0.780258f,
+ -0.780737f, -0.781216f, -0.781695f, -0.782173f, -0.782651f, -0.783128f, -0.783605f, -0.784081f,
+ -0.784557f, -0.785032f, -0.785507f, -0.785981f, -0.786455f, -0.786929f, -0.787402f, -0.787874f,
+ -0.788346f, -0.788818f, -0.789289f, -0.789760f, -0.790230f, -0.790700f, -0.791169f, -0.791638f,
+ -0.792107f, -0.792575f, -0.793042f, -0.793509f, -0.793975f, -0.794442f, -0.794907f, -0.795372f,
+ -0.795837f, -0.796301f, -0.796765f, -0.797228f, -0.797691f, -0.798153f, -0.798615f, -0.799076f,
+ -0.799537f, -0.799998f, -0.800458f, -0.800917f, -0.801376f, -0.801835f, -0.802293f, -0.802750f,
+ -0.803208f, -0.803664f, -0.804120f, -0.804576f, -0.805031f, -0.805486f, -0.805940f, -0.806394f,
+ -0.806848f, -0.807300f, -0.807753f, -0.808205f, -0.808656f, -0.809107f, -0.809558f, -0.810008f,
+ -0.810457f, -0.810906f, -0.811355f, -0.811803f, -0.812251f, -0.812698f, -0.813144f, -0.813591f,
+ -0.814036f, -0.814482f, -0.814926f, -0.815371f, -0.815814f, -0.816258f, -0.816701f, -0.817143f,
+ -0.817585f, -0.818026f, -0.818467f, -0.818908f, -0.819348f, -0.819787f, -0.820226f, -0.820664f,
+ -0.821102f, -0.821540f, -0.821977f, -0.822414f, -0.822850f, -0.823285f, -0.823721f, -0.824155f,
+ -0.824589f, -0.825023f, -0.825456f, -0.825889f, -0.826321f, -0.826753f, -0.827184f, -0.827615f,
+ -0.828045f, -0.828475f, -0.828904f, -0.829333f, -0.829761f, -0.830189f, -0.830616f, -0.831043f,
+ -0.831470f, -0.831895f, -0.832321f, -0.832746f, -0.833170f, -0.833594f, -0.834018f, -0.834440f,
+ -0.834863f, -0.835285f, -0.835706f, -0.836127f, -0.836548f, -0.836968f, -0.837387f, -0.837806f,
+ -0.838225f, -0.838643f, -0.839060f, -0.839477f, -0.839894f, -0.840310f, -0.840725f, -0.841140f,
+ -0.841555f, -0.841969f, -0.842383f, -0.842796f, -0.843208f, -0.843620f, -0.844032f, -0.844443f,
+ -0.844854f, -0.845264f, -0.845673f, -0.846082f, -0.846491f, -0.846899f, -0.847307f, -0.847714f,
+ -0.848120f, -0.848526f, -0.848932f, -0.849337f, -0.849742f, -0.850146f, -0.850549f, -0.850953f,
+ -0.851355f, -0.851757f, -0.852159f, -0.852560f, -0.852961f, -0.853361f, -0.853760f, -0.854159f,
+ -0.854558f, -0.854956f, -0.855354f, -0.855751f, -0.856147f, -0.856543f, -0.856939f, -0.857334f,
+ -0.857729f, -0.858123f, -0.858516f, -0.858909f, -0.859302f, -0.859694f, -0.860085f, -0.860476f,
+ -0.860867f, -0.861257f, -0.861646f, -0.862035f, -0.862424f, -0.862812f, -0.863199f, -0.863586f,
+ -0.863973f, -0.864359f, -0.864744f, -0.865129f, -0.865514f, -0.865898f, -0.866281f, -0.866664f,
+ -0.867046f, -0.867428f, -0.867809f, -0.868190f, -0.868571f, -0.868951f, -0.869330f, -0.869709f,
+ -0.870087f, -0.870465f, -0.870842f, -0.871219f, -0.871595f, -0.871971f, -0.872346f, -0.872721f,
+ -0.873095f, -0.873469f, -0.873842f, -0.874215f, -0.874587f, -0.874958f, -0.875329f, -0.875700f,
+ -0.876070f, -0.876440f, -0.876809f, -0.877177f, -0.877545f, -0.877913f, -0.878280f, -0.878646f,
+ -0.879012f, -0.879378f, -0.879743f, -0.880107f, -0.880471f, -0.880834f, -0.881197f, -0.881559f,
+ -0.881921f, -0.882283f, -0.882643f, -0.883004f, -0.883363f, -0.883723f, -0.884081f, -0.884439f,
+ -0.884797f, -0.885154f, -0.885511f, -0.885867f, -0.886223f, -0.886578f, -0.886932f, -0.887286f,
+ -0.887640f, -0.887993f, -0.888345f, -0.888697f, -0.889048f, -0.889399f, -0.889750f, -0.890099f,
+ -0.890449f, -0.890797f, -0.891146f, -0.891493f, -0.891841f, -0.892187f, -0.892534f, -0.892879f,
+ -0.893224f, -0.893569f, -0.893913f, -0.894256f, -0.894599f, -0.894942f, -0.895284f, -0.895625f,
+ -0.895966f, -0.896307f, -0.896646f, -0.896986f, -0.897325f, -0.897663f, -0.898001f, -0.898338f,
+ -0.898674f, -0.899011f, -0.899346f, -0.899681f, -0.900016f, -0.900350f, -0.900683f, -0.901016f,
+ -0.901349f, -0.901681f, -0.902012f, -0.902343f, -0.902673f, -0.903003f, -0.903332f, -0.903661f,
+ -0.903989f, -0.904317f, -0.904644f, -0.904971f, -0.905297f, -0.905622f, -0.905947f, -0.906272f,
+ -0.906596f, -0.906919f, -0.907242f, -0.907564f, -0.907886f, -0.908207f, -0.908528f, -0.908848f,
+ -0.909168f, -0.909487f, -0.909806f, -0.910124f, -0.910441f, -0.910758f, -0.911075f, -0.911391f,
+ -0.911706f, -0.912021f, -0.912335f, -0.912649f, -0.912962f, -0.913275f, -0.913587f, -0.913899f,
+ -0.914210f, -0.914520f, -0.914830f, -0.915140f, -0.915449f, -0.915757f, -0.916065f, -0.916372f,
+ -0.916679f, -0.916985f, -0.917291f, -0.917596f, -0.917901f, -0.918205f, -0.918508f, -0.918811f,
+ -0.919114f, -0.919416f, -0.919717f, -0.920018f, -0.920318f, -0.920618f, -0.920917f, -0.921216f,
+ -0.921514f, -0.921812f, -0.922109f, -0.922405f, -0.922701f, -0.922997f, -0.923291f, -0.923586f,
+ -0.923880f, -0.924173f, -0.924465f, -0.924758f, -0.925049f, -0.925340f, -0.925631f, -0.925921f,
+ -0.926210f, -0.926499f, -0.926787f, -0.927075f, -0.927363f, -0.927649f, -0.927935f, -0.928221f,
+ -0.928506f, -0.928791f, -0.929075f, -0.929358f, -0.929641f, -0.929923f, -0.930205f, -0.930486f,
+ -0.930767f, -0.931047f, -0.931327f, -0.931606f, -0.931884f, -0.932162f, -0.932440f, -0.932716f,
+ -0.932993f, -0.933269f, -0.933544f, -0.933818f, -0.934093f, -0.934366f, -0.934639f, -0.934912f,
+ -0.935184f, -0.935455f, -0.935726f, -0.935996f, -0.936266f, -0.936535f, -0.936803f, -0.937072f,
+ -0.937339f, -0.937606f, -0.937872f, -0.938138f, -0.938404f, -0.938668f, -0.938932f, -0.939196f,
+ -0.939459f, -0.939722f, -0.939984f, -0.940245f, -0.940506f, -0.940766f, -0.941026f, -0.941285f,
+ -0.941544f, -0.941802f, -0.942060f, -0.942317f, -0.942573f, -0.942829f, -0.943084f, -0.943339f,
+ -0.943593f, -0.943847f, -0.944100f, -0.944353f, -0.944605f, -0.944856f, -0.945107f, -0.945358f,
+ -0.945607f, -0.945857f, -0.946105f, -0.946353f, -0.946601f, -0.946848f, -0.947094f, -0.947340f,
+ -0.947586f, -0.947830f, -0.948075f, -0.948318f, -0.948561f, -0.948804f, -0.949046f, -0.949287f,
+ -0.949528f, -0.949768f, -0.950008f, -0.950247f, -0.950486f, -0.950724f, -0.950962f, -0.951199f,
+ -0.951435f, -0.951671f, -0.951906f, -0.952141f, -0.952375f, -0.952609f, -0.952842f, -0.953074f,
+ -0.953306f, -0.953537f, -0.953768f, -0.953998f, -0.954228f, -0.954457f, -0.954686f, -0.954914f,
+ -0.955141f, -0.955368f, -0.955594f, -0.955820f, -0.956045f, -0.956270f, -0.956494f, -0.956717f,
+ -0.956940f, -0.957163f, -0.957385f, -0.957606f, -0.957826f, -0.958046f, -0.958266f, -0.958485f,
+ -0.958703f, -0.958921f, -0.959139f, -0.959355f, -0.959572f, -0.959787f, -0.960002f, -0.960217f,
+ -0.960431f, -0.960644f, -0.960857f, -0.961069f, -0.961280f, -0.961492f, -0.961702f, -0.961912f,
+ -0.962121f, -0.962330f, -0.962538f, -0.962746f, -0.962953f, -0.963160f, -0.963366f, -0.963571f,
+ -0.963776f, -0.963980f, -0.964184f, -0.964387f, -0.964590f, -0.964792f, -0.964993f, -0.965194f,
+ -0.965394f, -0.965594f, -0.965793f, -0.965992f, -0.966190f, -0.966387f, -0.966584f, -0.966781f,
+ -0.966976f, -0.967172f, -0.967366f, -0.967560f, -0.967754f, -0.967947f, -0.968139f, -0.968331f,
+ -0.968522f, -0.968713f, -0.968903f, -0.969092f, -0.969281f, -0.969470f, -0.969657f, -0.969845f,
+ -0.970031f, -0.970217f, -0.970403f, -0.970588f, -0.970772f, -0.970956f, -0.971139f, -0.971322f,
+ -0.971504f, -0.971685f, -0.971866f, -0.972047f, -0.972227f, -0.972406f, -0.972584f, -0.972762f,
+ -0.972940f, -0.973117f, -0.973293f, -0.973469f, -0.973644f, -0.973819f, -0.973993f, -0.974166f,
+ -0.974339f, -0.974512f, -0.974684f, -0.974855f, -0.975025f, -0.975195f, -0.975365f, -0.975534f,
+ -0.975702f, -0.975870f, -0.976037f, -0.976204f, -0.976370f, -0.976535f, -0.976700f, -0.976864f,
+ -0.977028f, -0.977191f, -0.977354f, -0.977516f, -0.977677f, -0.977838f, -0.977998f, -0.978158f,
+ -0.978317f, -0.978476f, -0.978634f, -0.978791f, -0.978948f, -0.979104f, -0.979260f, -0.979415f,
+ -0.979570f, -0.979724f, -0.979877f, -0.980030f, -0.980182f, -0.980334f, -0.980485f, -0.980635f,
+ -0.980785f, -0.980935f, -0.981083f, -0.981232f, -0.981379f, -0.981526f, -0.981673f, -0.981819f,
+ -0.981964f, -0.982109f, -0.982253f, -0.982396f, -0.982539f, -0.982682f, -0.982824f, -0.982965f,
+ -0.983105f, -0.983246f, -0.983385f, -0.983524f, -0.983662f, -0.983800f, -0.983937f, -0.984074f,
+ -0.984210f, -0.984346f, -0.984480f, -0.984615f, -0.984748f, -0.984882f, -0.985014f, -0.985146f,
+ -0.985278f, -0.985408f, -0.985539f, -0.985668f, -0.985798f, -0.985926f, -0.986054f, -0.986181f,
+ -0.986308f, -0.986434f, -0.986560f, -0.986685f, -0.986809f, -0.986933f, -0.987057f, -0.987179f,
+ -0.987301f, -0.987423f, -0.987544f, -0.987664f, -0.987784f, -0.987903f, -0.988022f, -0.988140f,
+ -0.988258f, -0.988374f, -0.988491f, -0.988607f, -0.988722f, -0.988836f, -0.988950f, -0.989064f,
+ -0.989177f, -0.989289f, -0.989400f, -0.989511f, -0.989622f, -0.989732f, -0.989841f, -0.989950f,
+ -0.990058f, -0.990166f, -0.990273f, -0.990379f, -0.990485f, -0.990590f, -0.990695f, -0.990799f,
+ -0.990903f, -0.991006f, -0.991108f, -0.991210f, -0.991311f, -0.991411f, -0.991511f, -0.991611f,
+ -0.991710f, -0.991808f, -0.991906f, -0.992003f, -0.992099f, -0.992195f, -0.992291f, -0.992385f,
+ -0.992480f, -0.992573f, -0.992666f, -0.992759f, -0.992850f, -0.992942f, -0.993032f, -0.993122f,
+ -0.993212f, -0.993301f, -0.993389f, -0.993477f, -0.993564f, -0.993651f, -0.993737f, -0.993822f,
+ -0.993907f, -0.993991f, -0.994075f, -0.994158f, -0.994240f, -0.994322f, -0.994404f, -0.994484f,
+ -0.994565f, -0.994644f, -0.994723f, -0.994802f, -0.994879f, -0.994957f, -0.995033f, -0.995109f,
+ -0.995185f, -0.995260f, -0.995334f, -0.995408f, -0.995481f, -0.995553f, -0.995625f, -0.995697f,
+ -0.995767f, -0.995838f, -0.995907f, -0.995976f, -0.996045f, -0.996113f, -0.996180f, -0.996247f,
+ -0.996313f, -0.996378f, -0.996443f, -0.996507f, -0.996571f, -0.996634f, -0.996697f, -0.996759f,
+ -0.996820f, -0.996881f, -0.996941f, -0.997001f, -0.997060f, -0.997119f, -0.997176f, -0.997234f,
+ -0.997290f, -0.997347f, -0.997402f, -0.997457f, -0.997511f, -0.997565f, -0.997618f, -0.997671f,
+ -0.997723f, -0.997774f, -0.997825f, -0.997876f, -0.997925f, -0.997974f, -0.998023f, -0.998071f,
+ -0.998118f, -0.998165f, -0.998211f, -0.998257f, -0.998302f, -0.998346f, -0.998390f, -0.998433f,
+ -0.998476f, -0.998518f, -0.998559f, -0.998600f, -0.998640f, -0.998680f, -0.998719f, -0.998758f,
+ -0.998795f, -0.998833f, -0.998870f, -0.998906f, -0.998941f, -0.998976f, -0.999011f, -0.999044f,
+ -0.999078f, -0.999110f, -0.999142f, -0.999174f, -0.999205f, -0.999235f, -0.999265f, -0.999294f,
+ -0.999322f, -0.999350f, -0.999378f, -0.999404f, -0.999431f, -0.999456f, -0.999481f, -0.999506f,
+ -0.999529f, -0.999553f, -0.999575f, -0.999597f, -0.999619f, -0.999640f, -0.999660f, -0.999680f,
+ -0.999699f, -0.999717f, -0.999735f, -0.999753f, -0.999769f, -0.999786f, -0.999801f, -0.999816f,
+ -0.999831f, -0.999844f, -0.999858f, -0.999870f, -0.999882f, -0.999894f, -0.999905f, -0.999915f,
+ -0.999925f, -0.999934f, -0.999942f, -0.999950f, -0.999958f, -0.999964f, -0.999971f, -0.999976f,
+ -0.999981f, -0.999986f, -0.999989f, -0.999993f, -0.999995f, -0.999997f, -0.999999f, -1.000000
+};
+
+static const float sinTable16384[8192] = {
+ 0.000000f, 0.000383f, 0.000767f, 0.001150f, 0.001534f, 0.001917f, 0.002301f, 0.002684f,
+ 0.003068f, 0.003451f, 0.003835f, 0.004218f, 0.004602f, 0.004985f, 0.005369f, 0.005752f,
+ 0.006136f, 0.006519f, 0.006903f, 0.007286f, 0.007670f, 0.008053f, 0.008437f, 0.008820f,
+ 0.009204f, 0.009587f, 0.009971f, 0.010354f, 0.010738f, 0.011121f, 0.011505f, 0.011888f,
+ 0.012272f, 0.012655f, 0.013038f, 0.013422f, 0.013805f, 0.014189f, 0.014572f, 0.014956f,
+ 0.015339f, 0.015723f, 0.016106f, 0.016490f, 0.016873f, 0.017256f, 0.017640f, 0.018023f,
+ 0.018407f, 0.018790f, 0.019174f, 0.019557f, 0.019940f, 0.020324f, 0.020707f, 0.021091f,
+ 0.021474f, 0.021857f, 0.022241f, 0.022624f, 0.023008f, 0.023391f, 0.023774f, 0.024158f,
+ 0.024541f, 0.024925f, 0.025308f, 0.025691f, 0.026075f, 0.026458f, 0.026841f, 0.027225f,
+ 0.027608f, 0.027991f, 0.028375f, 0.028758f, 0.029142f, 0.029525f, 0.029908f, 0.030291f,
+ 0.030675f, 0.031058f, 0.031441f, 0.031825f, 0.032208f, 0.032591f, 0.032975f, 0.033358f,
+ 0.033741f, 0.034124f, 0.034508f, 0.034891f, 0.035274f, 0.035657f, 0.036041f, 0.036424f,
+ 0.036807f, 0.037190f, 0.037574f, 0.037957f, 0.038340f, 0.038723f, 0.039107f, 0.039490f,
+ 0.039873f, 0.040256f, 0.040639f, 0.041022f, 0.041406f, 0.041789f, 0.042172f, 0.042555f,
+ 0.042938f, 0.043321f, 0.043705f, 0.044088f, 0.044471f, 0.044854f, 0.045237f, 0.045620f,
+ 0.046003f, 0.046386f, 0.046769f, 0.047152f, 0.047535f, 0.047919f, 0.048302f, 0.048685f,
+ 0.049068f, 0.049451f, 0.049834f, 0.050217f, 0.050600f, 0.050983f, 0.051366f, 0.051749f,
+ 0.052132f, 0.052515f, 0.052898f, 0.053281f, 0.053664f, 0.054046f, 0.054429f, 0.054812f,
+ 0.055195f, 0.055578f, 0.055961f, 0.056344f, 0.056727f, 0.057110f, 0.057493f, 0.057875f,
+ 0.058258f, 0.058641f, 0.059024f, 0.059407f, 0.059790f, 0.060172f, 0.060555f, 0.060938f,
+ 0.061321f, 0.061704f, 0.062086f, 0.062469f, 0.062852f, 0.063234f, 0.063617f, 0.064000f,
+ 0.064383f, 0.064765f, 0.065148f, 0.065531f, 0.065913f, 0.066296f, 0.066679f, 0.067061f,
+ 0.067444f, 0.067827f, 0.068209f, 0.068592f, 0.068974f, 0.069357f, 0.069739f, 0.070122f,
+ 0.070505f, 0.070887f, 0.071270f, 0.071652f, 0.072035f, 0.072417f, 0.072800f, 0.073182f,
+ 0.073565f, 0.073947f, 0.074329f, 0.074712f, 0.075094f, 0.075477f, 0.075859f, 0.076241f,
+ 0.076624f, 0.077006f, 0.077389f, 0.077771f, 0.078153f, 0.078536f, 0.078918f, 0.079300f,
+ 0.079682f, 0.080065f, 0.080447f, 0.080829f, 0.081211f, 0.081594f, 0.081976f, 0.082358f,
+ 0.082740f, 0.083122f, 0.083505f, 0.083887f, 0.084269f, 0.084651f, 0.085033f, 0.085415f,
+ 0.085797f, 0.086179f, 0.086561f, 0.086943f, 0.087326f, 0.087708f, 0.088090f, 0.088472f,
+ 0.088854f, 0.089236f, 0.089617f, 0.089999f, 0.090381f, 0.090763f, 0.091145f, 0.091527f,
+ 0.091909f, 0.092291f, 0.092673f, 0.093055f, 0.093436f, 0.093818f, 0.094200f, 0.094582f,
+ 0.094963f, 0.095345f, 0.095727f, 0.096109f, 0.096490f, 0.096872f, 0.097254f, 0.097635f,
+ 0.098017f, 0.098399f, 0.098780f, 0.099162f, 0.099544f, 0.099925f, 0.100307f, 0.100688f,
+ 0.101070f, 0.101451f, 0.101833f, 0.102214f, 0.102596f, 0.102977f, 0.103359f, 0.103740f,
+ 0.104122f, 0.104503f, 0.104884f, 0.105266f, 0.105647f, 0.106028f, 0.106410f, 0.106791f,
+ 0.107172f, 0.107554f, 0.107935f, 0.108316f, 0.108697f, 0.109079f, 0.109460f, 0.109841f,
+ 0.110222f, 0.110603f, 0.110984f, 0.111366f, 0.111747f, 0.112128f, 0.112509f, 0.112890f,
+ 0.113271f, 0.113652f, 0.114033f, 0.114414f, 0.114795f, 0.115176f, 0.115557f, 0.115938f,
+ 0.116319f, 0.116700f, 0.117080f, 0.117461f, 0.117842f, 0.118223f, 0.118604f, 0.118984f,
+ 0.119365f, 0.119746f, 0.120127f, 0.120507f, 0.120888f, 0.121269f, 0.121649f, 0.122030f,
+ 0.122411f, 0.122791f, 0.123172f, 0.123552f, 0.123933f, 0.124314f, 0.124694f, 0.125075f,
+ 0.125455f, 0.125835f, 0.126216f, 0.126596f, 0.126977f, 0.127357f, 0.127737f, 0.128118f,
+ 0.128498f, 0.128878f, 0.129259f, 0.129639f, 0.130019f, 0.130399f, 0.130780f, 0.131160f,
+ 0.131540f, 0.131920f, 0.132300f, 0.132680f, 0.133061f, 0.133441f, 0.133821f, 0.134201f,
+ 0.134581f, 0.134961f, 0.135341f, 0.135721f, 0.136101f, 0.136480f, 0.136860f, 0.137240f,
+ 0.137620f, 0.138000f, 0.138380f, 0.138760f, 0.139139f, 0.139519f, 0.139899f, 0.140279f,
+ 0.140658f, 0.141038f, 0.141418f, 0.141797f, 0.142177f, 0.142556f, 0.142936f, 0.143316f,
+ 0.143695f, 0.144075f, 0.144454f, 0.144833f, 0.145213f, 0.145592f, 0.145972f, 0.146351f,
+ 0.146730f, 0.147110f, 0.147489f, 0.147868f, 0.148248f, 0.148627f, 0.149006f, 0.149385f,
+ 0.149765f, 0.150144f, 0.150523f, 0.150902f, 0.151281f, 0.151660f, 0.152039f, 0.152418f,
+ 0.152797f, 0.153176f, 0.153555f, 0.153934f, 0.154313f, 0.154692f, 0.155071f, 0.155450f,
+ 0.155828f, 0.156207f, 0.156586f, 0.156965f, 0.157343f, 0.157722f, 0.158101f, 0.158480f,
+ 0.158858f, 0.159237f, 0.159615f, 0.159994f, 0.160372f, 0.160751f, 0.161129f, 0.161508f,
+ 0.161886f, 0.162265f, 0.162643f, 0.163022f, 0.163400f, 0.163778f, 0.164157f, 0.164535f,
+ 0.164913f, 0.165291f, 0.165670f, 0.166048f, 0.166426f, 0.166804f, 0.167182f, 0.167560f,
+ 0.167938f, 0.168316f, 0.168694f, 0.169072f, 0.169450f, 0.169828f, 0.170206f, 0.170584f,
+ 0.170962f, 0.171340f, 0.171718f, 0.172095f, 0.172473f, 0.172851f, 0.173229f, 0.173606f,
+ 0.173984f, 0.174362f, 0.174739f, 0.175117f, 0.175494f, 0.175872f, 0.176249f, 0.176627f,
+ 0.177004f, 0.177382f, 0.177759f, 0.178136f, 0.178514f, 0.178891f, 0.179268f, 0.179646f,
+ 0.180023f, 0.180400f, 0.180777f, 0.181154f, 0.181532f, 0.181909f, 0.182286f, 0.182663f,
+ 0.183040f, 0.183417f, 0.183794f, 0.184171f, 0.184548f, 0.184925f, 0.185301f, 0.185678f,
+ 0.186055f, 0.186432f, 0.186809f, 0.187185f, 0.187562f, 0.187939f, 0.188315f, 0.188692f,
+ 0.189069f, 0.189445f, 0.189822f, 0.190198f, 0.190575f, 0.190951f, 0.191328f, 0.191704f,
+ 0.192080f, 0.192457f, 0.192833f, 0.193209f, 0.193586f, 0.193962f, 0.194338f, 0.194714f,
+ 0.195090f, 0.195466f, 0.195843f, 0.196219f, 0.196595f, 0.196971f, 0.197347f, 0.197722f,
+ 0.198098f, 0.198474f, 0.198850f, 0.199226f, 0.199602f, 0.199978f, 0.200353f, 0.200729f,
+ 0.201105f, 0.201480f, 0.201856f, 0.202231f, 0.202607f, 0.202983f, 0.203358f, 0.203734f,
+ 0.204109f, 0.204484f, 0.204860f, 0.205235f, 0.205610f, 0.205986f, 0.206361f, 0.206736f,
+ 0.207111f, 0.207487f, 0.207862f, 0.208237f, 0.208612f, 0.208987f, 0.209362f, 0.209737f,
+ 0.210112f, 0.210487f, 0.210862f, 0.211237f, 0.211611f, 0.211986f, 0.212361f, 0.212736f,
+ 0.213110f, 0.213485f, 0.213860f, 0.214234f, 0.214609f, 0.214983f, 0.215358f, 0.215732f,
+ 0.216107f, 0.216481f, 0.216856f, 0.217230f, 0.217604f, 0.217979f, 0.218353f, 0.218727f,
+ 0.219101f, 0.219475f, 0.219850f, 0.220224f, 0.220598f, 0.220972f, 0.221346f, 0.221720f,
+ 0.222094f, 0.222468f, 0.222841f, 0.223215f, 0.223589f, 0.223963f, 0.224337f, 0.224710f,
+ 0.225084f, 0.225458f, 0.225831f, 0.226205f, 0.226578f, 0.226952f, 0.227325f, 0.227699f,
+ 0.228072f, 0.228445f, 0.228819f, 0.229192f, 0.229565f, 0.229939f, 0.230312f, 0.230685f,
+ 0.231058f, 0.231431f, 0.231804f, 0.232177f, 0.232550f, 0.232923f, 0.233296f, 0.233669f,
+ 0.234042f, 0.234415f, 0.234788f, 0.235160f, 0.235533f, 0.235906f, 0.236278f, 0.236651f,
+ 0.237024f, 0.237396f, 0.237769f, 0.238141f, 0.238514f, 0.238886f, 0.239258f, 0.239631f,
+ 0.240003f, 0.240375f, 0.240748f, 0.241120f, 0.241492f, 0.241864f, 0.242236f, 0.242608f,
+ 0.242980f, 0.243352f, 0.243724f, 0.244096f, 0.244468f, 0.244840f, 0.245212f, 0.245583f,
+ 0.245955f, 0.246327f, 0.246698f, 0.247070f, 0.247442f, 0.247813f, 0.248185f, 0.248556f,
+ 0.248928f, 0.249299f, 0.249670f, 0.250042f, 0.250413f, 0.250784f, 0.251155f, 0.251527f,
+ 0.251898f, 0.252269f, 0.252640f, 0.253011f, 0.253382f, 0.253753f, 0.254124f, 0.254495f,
+ 0.254866f, 0.255236f, 0.255607f, 0.255978f, 0.256349f, 0.256719f, 0.257090f, 0.257461f,
+ 0.257831f, 0.258202f, 0.258572f, 0.258943f, 0.259313f, 0.259683f, 0.260054f, 0.260424f,
+ 0.260794f, 0.261164f, 0.261534f, 0.261905f, 0.262275f, 0.262645f, 0.263015f, 0.263385f,
+ 0.263755f, 0.264125f, 0.264494f, 0.264864f, 0.265234f, 0.265604f, 0.265973f, 0.266343f,
+ 0.266713f, 0.267082f, 0.267452f, 0.267821f, 0.268191f, 0.268560f, 0.268930f, 0.269299f,
+ 0.269668f, 0.270038f, 0.270407f, 0.270776f, 0.271145f, 0.271514f, 0.271883f, 0.272252f,
+ 0.272621f, 0.272990f, 0.273359f, 0.273728f, 0.274097f, 0.274466f, 0.274834f, 0.275203f,
+ 0.275572f, 0.275940f, 0.276309f, 0.276678f, 0.277046f, 0.277415f, 0.277783f, 0.278151f,
+ 0.278520f, 0.278888f, 0.279256f, 0.279624f, 0.279993f, 0.280361f, 0.280729f, 0.281097f,
+ 0.281465f, 0.281833f, 0.282201f, 0.282569f, 0.282937f, 0.283304f, 0.283672f, 0.284040f,
+ 0.284408f, 0.284775f, 0.285143f, 0.285510f, 0.285878f, 0.286245f, 0.286613f, 0.286980f,
+ 0.287347f, 0.287715f, 0.288082f, 0.288449f, 0.288816f, 0.289184f, 0.289551f, 0.289918f,
+ 0.290285f, 0.290652f, 0.291019f, 0.291385f, 0.291752f, 0.292119f, 0.292486f, 0.292852f,
+ 0.293219f, 0.293586f, 0.293952f, 0.294319f, 0.294685f, 0.295052f, 0.295418f, 0.295785f,
+ 0.296151f, 0.296517f, 0.296883f, 0.297250f, 0.297616f, 0.297982f, 0.298348f, 0.298714f,
+ 0.299080f, 0.299446f, 0.299812f, 0.300177f, 0.300543f, 0.300909f, 0.301275f, 0.301640f,
+ 0.302006f, 0.302372f, 0.302737f, 0.303103f, 0.303468f, 0.303833f, 0.304199f, 0.304564f,
+ 0.304929f, 0.305294f, 0.305660f, 0.306025f, 0.306390f, 0.306755f, 0.307120f, 0.307485f,
+ 0.307850f, 0.308214f, 0.308579f, 0.308944f, 0.309309f, 0.309673f, 0.310038f, 0.310403f,
+ 0.310767f, 0.311132f, 0.311496f, 0.311860f, 0.312225f, 0.312589f, 0.312953f, 0.313318f,
+ 0.313682f, 0.314046f, 0.314410f, 0.314774f, 0.315138f, 0.315502f, 0.315866f, 0.316230f,
+ 0.316593f, 0.316957f, 0.317321f, 0.317684f, 0.318048f, 0.318412f, 0.318775f, 0.319139f,
+ 0.319502f, 0.319865f, 0.320229f, 0.320592f, 0.320955f, 0.321318f, 0.321682f, 0.322045f,
+ 0.322408f, 0.322771f, 0.323134f, 0.323497f, 0.323859f, 0.324222f, 0.324585f, 0.324948f,
+ 0.325310f, 0.325673f, 0.326035f, 0.326398f, 0.326760f, 0.327123f, 0.327485f, 0.327848f,
+ 0.328210f, 0.328572f, 0.328934f, 0.329296f, 0.329658f, 0.330020f, 0.330382f, 0.330744f,
+ 0.331106f, 0.331468f, 0.331830f, 0.332192f, 0.332553f, 0.332915f, 0.333277f, 0.333638f,
+ 0.334000f, 0.334361f, 0.334722f, 0.335084f, 0.335445f, 0.335806f, 0.336168f, 0.336529f,
+ 0.336890f, 0.337251f, 0.337612f, 0.337973f, 0.338334f, 0.338695f, 0.339055f, 0.339416f,
+ 0.339777f, 0.340138f, 0.340498f, 0.340859f, 0.341219f, 0.341580f, 0.341940f, 0.342300f,
+ 0.342661f, 0.343021f, 0.343381f, 0.343741f, 0.344101f, 0.344461f, 0.344821f, 0.345181f,
+ 0.345541f, 0.345901f, 0.346261f, 0.346621f, 0.346980f, 0.347340f, 0.347700f, 0.348059f,
+ 0.348419f, 0.348778f, 0.349138f, 0.349497f, 0.349856f, 0.350215f, 0.350575f, 0.350934f,
+ 0.351293f, 0.351652f, 0.352011f, 0.352370f, 0.352729f, 0.353087f, 0.353446f, 0.353805f,
+ 0.354164f, 0.354522f, 0.354881f, 0.355239f, 0.355598f, 0.355956f, 0.356314f, 0.356673f,
+ 0.357031f, 0.357389f, 0.357747f, 0.358105f, 0.358463f, 0.358821f, 0.359179f, 0.359537f,
+ 0.359895f, 0.360253f, 0.360611f, 0.360968f, 0.361326f, 0.361683f, 0.362041f, 0.362398f,
+ 0.362756f, 0.363113f, 0.363470f, 0.363828f, 0.364185f, 0.364542f, 0.364899f, 0.365256f,
+ 0.365613f, 0.365970f, 0.366327f, 0.366684f, 0.367040f, 0.367397f, 0.367754f, 0.368110f,
+ 0.368467f, 0.368823f, 0.369180f, 0.369536f, 0.369892f, 0.370249f, 0.370605f, 0.370961f,
+ 0.371317f, 0.371673f, 0.372029f, 0.372385f, 0.372741f, 0.373097f, 0.373453f, 0.373808f,
+ 0.374164f, 0.374520f, 0.374875f, 0.375231f, 0.375586f, 0.375942f, 0.376297f, 0.376652f,
+ 0.377007f, 0.377363f, 0.377718f, 0.378073f, 0.378428f, 0.378783f, 0.379138f, 0.379492f,
+ 0.379847f, 0.380202f, 0.380557f, 0.380911f, 0.381266f, 0.381620f, 0.381975f, 0.382329f,
+ 0.382683f, 0.383038f, 0.383392f, 0.383746f, 0.384100f, 0.384454f, 0.384808f, 0.385162f,
+ 0.385516f, 0.385870f, 0.386224f, 0.386577f, 0.386931f, 0.387285f, 0.387638f, 0.387992f,
+ 0.388345f, 0.388698f, 0.389052f, 0.389405f, 0.389758f, 0.390111f, 0.390464f, 0.390817f,
+ 0.391170f, 0.391523f, 0.391876f, 0.392229f, 0.392582f, 0.392934f, 0.393287f, 0.393640f,
+ 0.393992f, 0.394344f, 0.394697f, 0.395049f, 0.395401f, 0.395754f, 0.396106f, 0.396458f,
+ 0.396810f, 0.397162f, 0.397514f, 0.397866f, 0.398218f, 0.398569f, 0.398921f, 0.399273f,
+ 0.399624f, 0.399976f, 0.400327f, 0.400679f, 0.401030f, 0.401381f, 0.401732f, 0.402084f,
+ 0.402435f, 0.402786f, 0.403137f, 0.403488f, 0.403838f, 0.404189f, 0.404540f, 0.404891f,
+ 0.405241f, 0.405592f, 0.405942f, 0.406293f, 0.406643f, 0.406994f, 0.407344f, 0.407694f,
+ 0.408044f, 0.408394f, 0.408744f, 0.409094f, 0.409444f, 0.409794f, 0.410144f, 0.410493f,
+ 0.410843f, 0.411193f, 0.411542f, 0.411892f, 0.412241f, 0.412591f, 0.412940f, 0.413289f,
+ 0.413638f, 0.413987f, 0.414337f, 0.414685f, 0.415034f, 0.415383f, 0.415732f, 0.416081f,
+ 0.416430f, 0.416778f, 0.417127f, 0.417475f, 0.417824f, 0.418172f, 0.418520f, 0.418869f,
+ 0.419217f, 0.419565f, 0.419913f, 0.420261f, 0.420609f, 0.420957f, 0.421305f, 0.421653f,
+ 0.422000f, 0.422348f, 0.422695f, 0.423043f, 0.423390f, 0.423738f, 0.424085f, 0.424432f,
+ 0.424780f, 0.425127f, 0.425474f, 0.425821f, 0.426168f, 0.426515f, 0.426862f, 0.427208f,
+ 0.427555f, 0.427902f, 0.428248f, 0.428595f, 0.428941f, 0.429288f, 0.429634f, 0.429980f,
+ 0.430326f, 0.430673f, 0.431019f, 0.431365f, 0.431711f, 0.432057f, 0.432402f, 0.432748f,
+ 0.433094f, 0.433439f, 0.433785f, 0.434131f, 0.434476f, 0.434821f, 0.435167f, 0.435512f,
+ 0.435857f, 0.436202f, 0.436547f, 0.436892f, 0.437237f, 0.437582f, 0.437927f, 0.438272f,
+ 0.438616f, 0.438961f, 0.439305f, 0.439650f, 0.439994f, 0.440339f, 0.440683f, 0.441027f,
+ 0.441371f, 0.441715f, 0.442059f, 0.442403f, 0.442747f, 0.443091f, 0.443435f, 0.443779f,
+ 0.444122f, 0.444466f, 0.444809f, 0.445153f, 0.445496f, 0.445839f, 0.446183f, 0.446526f,
+ 0.446869f, 0.447212f, 0.447555f, 0.447898f, 0.448241f, 0.448583f, 0.448926f, 0.449269f,
+ 0.449611f, 0.449954f, 0.450296f, 0.450639f, 0.450981f, 0.451323f, 0.451665f, 0.452008f,
+ 0.452350f, 0.452692f, 0.453033f, 0.453375f, 0.453717f, 0.454059f, 0.454400f, 0.454742f,
+ 0.455084f, 0.455425f, 0.455766f, 0.456108f, 0.456449f, 0.456790f, 0.457131f, 0.457472f,
+ 0.457813f, 0.458154f, 0.458495f, 0.458836f, 0.459177f, 0.459517f, 0.459858f, 0.460198f,
+ 0.460539f, 0.460879f, 0.461219f, 0.461560f, 0.461900f, 0.462240f, 0.462580f, 0.462920f,
+ 0.463260f, 0.463600f, 0.463939f, 0.464279f, 0.464619f, 0.464958f, 0.465298f, 0.465637f,
+ 0.465977f, 0.466316f, 0.466655f, 0.466994f, 0.467333f, 0.467672f, 0.468011f, 0.468350f,
+ 0.468689f, 0.469028f, 0.469366f, 0.469705f, 0.470043f, 0.470382f, 0.470720f, 0.471058f,
+ 0.471397f, 0.471735f, 0.472073f, 0.472411f, 0.472749f, 0.473087f, 0.473425f, 0.473763f,
+ 0.474100f, 0.474438f, 0.474775f, 0.475113f, 0.475450f, 0.475788f, 0.476125f, 0.476462f,
+ 0.476799f, 0.477136f, 0.477473f, 0.477810f, 0.478147f, 0.478484f, 0.478821f, 0.479157f,
+ 0.479494f, 0.479830f, 0.480167f, 0.480503f, 0.480839f, 0.481176f, 0.481512f, 0.481848f,
+ 0.482184f, 0.482520f, 0.482856f, 0.483191f, 0.483527f, 0.483863f, 0.484198f, 0.484534f,
+ 0.484869f, 0.485205f, 0.485540f, 0.485875f, 0.486210f, 0.486545f, 0.486880f, 0.487215f,
+ 0.487550f, 0.487885f, 0.488220f, 0.488554f, 0.488889f, 0.489223f, 0.489558f, 0.489892f,
+ 0.490226f, 0.490561f, 0.490895f, 0.491229f, 0.491563f, 0.491897f, 0.492231f, 0.492564f,
+ 0.492898f, 0.493232f, 0.493565f, 0.493899f, 0.494232f, 0.494566f, 0.494899f, 0.495232f,
+ 0.495565f, 0.495898f, 0.496231f, 0.496564f, 0.496897f, 0.497230f, 0.497562f, 0.497895f,
+ 0.498228f, 0.498560f, 0.498893f, 0.499225f, 0.499557f, 0.499889f, 0.500221f, 0.500553f,
+ 0.500885f, 0.501217f, 0.501549f, 0.501881f, 0.502212f, 0.502544f, 0.502876f, 0.503207f,
+ 0.503538f, 0.503870f, 0.504201f, 0.504532f, 0.504863f, 0.505194f, 0.505525f, 0.505856f,
+ 0.506187f, 0.506517f, 0.506848f, 0.507179f, 0.507509f, 0.507839f, 0.508170f, 0.508500f,
+ 0.508830f, 0.509160f, 0.509490f, 0.509820f, 0.510150f, 0.510480f, 0.510810f, 0.511139f,
+ 0.511469f, 0.511798f, 0.512128f, 0.512457f, 0.512786f, 0.513116f, 0.513445f, 0.513774f,
+ 0.514103f, 0.514432f, 0.514760f, 0.515089f, 0.515418f, 0.515746f, 0.516075f, 0.516403f,
+ 0.516732f, 0.517060f, 0.517388f, 0.517716f, 0.518045f, 0.518372f, 0.518700f, 0.519028f,
+ 0.519356f, 0.519684f, 0.520011f, 0.520339f, 0.520666f, 0.520994f, 0.521321f, 0.521648f,
+ 0.521975f, 0.522302f, 0.522629f, 0.522956f, 0.523283f, 0.523610f, 0.523937f, 0.524263f,
+ 0.524590f, 0.524916f, 0.525243f, 0.525569f, 0.525895f, 0.526221f, 0.526547f, 0.526873f,
+ 0.527199f, 0.527525f, 0.527851f, 0.528176f, 0.528502f, 0.528828f, 0.529153f, 0.529478f,
+ 0.529804f, 0.530129f, 0.530454f, 0.530779f, 0.531104f, 0.531429f, 0.531754f, 0.532078f,
+ 0.532403f, 0.532728f, 0.533052f, 0.533377f, 0.533701f, 0.534025f, 0.534349f, 0.534674f,
+ 0.534998f, 0.535322f, 0.535645f, 0.535969f, 0.536293f, 0.536617f, 0.536940f, 0.537264f,
+ 0.537587f, 0.537910f, 0.538234f, 0.538557f, 0.538880f, 0.539203f, 0.539526f, 0.539849f,
+ 0.540171f, 0.540494f, 0.540817f, 0.541139f, 0.541462f, 0.541784f, 0.542106f, 0.542429f,
+ 0.542751f, 0.543073f, 0.543395f, 0.543717f, 0.544039f, 0.544360f, 0.544682f, 0.545003f,
+ 0.545325f, 0.545646f, 0.545968f, 0.546289f, 0.546610f, 0.546931f, 0.547252f, 0.547573f,
+ 0.547894f, 0.548215f, 0.548536f, 0.548856f, 0.549177f, 0.549497f, 0.549818f, 0.550138f,
+ 0.550458f, 0.550778f, 0.551098f, 0.551418f, 0.551738f, 0.552058f, 0.552378f, 0.552697f,
+ 0.553017f, 0.553336f, 0.553656f, 0.553975f, 0.554294f, 0.554613f, 0.554932f, 0.555251f,
+ 0.555570f, 0.555889f, 0.556208f, 0.556526f, 0.556845f, 0.557164f, 0.557482f, 0.557800f,
+ 0.558119f, 0.558437f, 0.558755f, 0.559073f, 0.559391f, 0.559709f, 0.560026f, 0.560344f,
+ 0.560662f, 0.560979f, 0.561297f, 0.561614f, 0.561931f, 0.562248f, 0.562565f, 0.562882f,
+ 0.563199f, 0.563516f, 0.563833f, 0.564150f, 0.564466f, 0.564783f, 0.565099f, 0.565416f,
+ 0.565732f, 0.566048f, 0.566364f, 0.566680f, 0.566996f, 0.567312f, 0.567628f, 0.567943f,
+ 0.568259f, 0.568574f, 0.568890f, 0.569205f, 0.569521f, 0.569836f, 0.570151f, 0.570466f,
+ 0.570781f, 0.571096f, 0.571410f, 0.571725f, 0.572040f, 0.572354f, 0.572669f, 0.572983f,
+ 0.573297f, 0.573611f, 0.573925f, 0.574239f, 0.574553f, 0.574867f, 0.575181f, 0.575495f,
+ 0.575808f, 0.576122f, 0.576435f, 0.576748f, 0.577062f, 0.577375f, 0.577688f, 0.578001f,
+ 0.578314f, 0.578627f, 0.578939f, 0.579252f, 0.579565f, 0.579877f, 0.580189f, 0.580502f,
+ 0.580814f, 0.581126f, 0.581438f, 0.581750f, 0.582062f, 0.582374f, 0.582685f, 0.582997f,
+ 0.583309f, 0.583620f, 0.583931f, 0.584243f, 0.584554f, 0.584865f, 0.585176f, 0.585487f,
+ 0.585798f, 0.586109f, 0.586419f, 0.586730f, 0.587040f, 0.587351f, 0.587661f, 0.587971f,
+ 0.588282f, 0.588592f, 0.588902f, 0.589212f, 0.589521f, 0.589831f, 0.590141f, 0.590450f,
+ 0.590760f, 0.591069f, 0.591378f, 0.591688f, 0.591997f, 0.592306f, 0.592615f, 0.592924f,
+ 0.593232f, 0.593541f, 0.593850f, 0.594158f, 0.594467f, 0.594775f, 0.595083f, 0.595391f,
+ 0.595699f, 0.596007f, 0.596315f, 0.596623f, 0.596931f, 0.597238f, 0.597546f, 0.597853f,
+ 0.598161f, 0.598468f, 0.598775f, 0.599082f, 0.599389f, 0.599696f, 0.600003f, 0.600310f,
+ 0.600616f, 0.600923f, 0.601230f, 0.601536f, 0.601842f, 0.602148f, 0.602455f, 0.602761f,
+ 0.603067f, 0.603372f, 0.603678f, 0.603984f, 0.604290f, 0.604595f, 0.604900f, 0.605206f,
+ 0.605511f, 0.605816f, 0.606121f, 0.606426f, 0.606731f, 0.607036f, 0.607341f, 0.607645f,
+ 0.607950f, 0.608254f, 0.608559f, 0.608863f, 0.609167f, 0.609471f, 0.609775f, 0.610079f,
+ 0.610383f, 0.610687f, 0.610990f, 0.611294f, 0.611597f, 0.611901f, 0.612204f, 0.612507f,
+ 0.612810f, 0.613113f, 0.613416f, 0.613719f, 0.614022f, 0.614324f, 0.614627f, 0.614929f,
+ 0.615232f, 0.615534f, 0.615836f, 0.616138f, 0.616440f, 0.616742f, 0.617044f, 0.617346f,
+ 0.617647f, 0.617949f, 0.618250f, 0.618552f, 0.618853f, 0.619154f, 0.619455f, 0.619756f,
+ 0.620057f, 0.620358f, 0.620659f, 0.620959f, 0.621260f, 0.621560f, 0.621861f, 0.622161f,
+ 0.622461f, 0.622761f, 0.623061f, 0.623361f, 0.623661f, 0.623961f, 0.624260f, 0.624560f,
+ 0.624860f, 0.625159f, 0.625458f, 0.625757f, 0.626056f, 0.626355f, 0.626654f, 0.626953f,
+ 0.627252f, 0.627550f, 0.627849f, 0.628147f, 0.628446f, 0.628744f, 0.629042f, 0.629340f,
+ 0.629638f, 0.629936f, 0.630234f, 0.630532f, 0.630829f, 0.631127f, 0.631424f, 0.631721f,
+ 0.632019f, 0.632316f, 0.632613f, 0.632910f, 0.633207f, 0.633504f, 0.633800f, 0.634097f,
+ 0.634393f, 0.634690f, 0.634986f, 0.635282f, 0.635578f, 0.635874f, 0.636170f, 0.636466f,
+ 0.636762f, 0.637057f, 0.637353f, 0.637649f, 0.637944f, 0.638239f, 0.638534f, 0.638829f,
+ 0.639124f, 0.639419f, 0.639714f, 0.640009f, 0.640303f, 0.640598f, 0.640892f, 0.641187f,
+ 0.641481f, 0.641775f, 0.642069f, 0.642363f, 0.642657f, 0.642951f, 0.643245f, 0.643538f,
+ 0.643832f, 0.644125f, 0.644418f, 0.644711f, 0.645005f, 0.645298f, 0.645590f, 0.645883f,
+ 0.646176f, 0.646469f, 0.646761f, 0.647054f, 0.647346f, 0.647638f, 0.647930f, 0.648222f,
+ 0.648514f, 0.648806f, 0.649098f, 0.649390f, 0.649681f, 0.649973f, 0.650264f, 0.650555f,
+ 0.650847f, 0.651138f, 0.651429f, 0.651720f, 0.652011f, 0.652301f, 0.652592f, 0.652882f,
+ 0.653173f, 0.653463f, 0.653753f, 0.654044f, 0.654334f, 0.654624f, 0.654913f, 0.655203f,
+ 0.655493f, 0.655782f, 0.656072f, 0.656361f, 0.656651f, 0.656940f, 0.657229f, 0.657518f,
+ 0.657807f, 0.658095f, 0.658384f, 0.658673f, 0.658961f, 0.659250f, 0.659538f, 0.659826f,
+ 0.660114f, 0.660402f, 0.660690f, 0.660978f, 0.661266f, 0.661553f, 0.661841f, 0.662128f,
+ 0.662416f, 0.662703f, 0.662990f, 0.663277f, 0.663564f, 0.663851f, 0.664138f, 0.664424f,
+ 0.664711f, 0.664997f, 0.665284f, 0.665570f, 0.665856f, 0.666142f, 0.666428f, 0.666714f,
+ 0.667000f, 0.667286f, 0.667571f, 0.667857f, 0.668142f, 0.668427f, 0.668712f, 0.668998f,
+ 0.669283f, 0.669567f, 0.669852f, 0.670137f, 0.670422f, 0.670706f, 0.670990f, 0.671275f,
+ 0.671559f, 0.671843f, 0.672127f, 0.672411f, 0.672695f, 0.672978f, 0.673262f, 0.673546f,
+ 0.673829f, 0.674112f, 0.674396f, 0.674679f, 0.674962f, 0.675245f, 0.675527f, 0.675810f,
+ 0.676093f, 0.676375f, 0.676658f, 0.676940f, 0.677222f, 0.677504f, 0.677786f, 0.678068f,
+ 0.678350f, 0.678632f, 0.678913f, 0.679195f, 0.679476f, 0.679758f, 0.680039f, 0.680320f,
+ 0.680601f, 0.680882f, 0.681163f, 0.681443f, 0.681724f, 0.682005f, 0.682285f, 0.682565f,
+ 0.682846f, 0.683126f, 0.683406f, 0.683686f, 0.683965f, 0.684245f, 0.684525f, 0.684804f,
+ 0.685084f, 0.685363f, 0.685642f, 0.685921f, 0.686200f, 0.686479f, 0.686758f, 0.687037f,
+ 0.687315f, 0.687594f, 0.687872f, 0.688151f, 0.688429f, 0.688707f, 0.688985f, 0.689263f,
+ 0.689541f, 0.689818f, 0.690096f, 0.690373f, 0.690651f, 0.690928f, 0.691205f, 0.691482f,
+ 0.691759f, 0.692036f, 0.692313f, 0.692590f, 0.692866f, 0.693143f, 0.693419f, 0.693695f,
+ 0.693971f, 0.694248f, 0.694524f, 0.694799f, 0.695075f, 0.695351f, 0.695626f, 0.695902f,
+ 0.696177f, 0.696452f, 0.696728f, 0.697003f, 0.697277f, 0.697552f, 0.697827f, 0.698102f,
+ 0.698376f, 0.698651f, 0.698925f, 0.699199f, 0.699473f, 0.699747f, 0.700021f, 0.700295f,
+ 0.700569f, 0.700842f, 0.701116f, 0.701389f, 0.701663f, 0.701936f, 0.702209f, 0.702482f,
+ 0.702755f, 0.703028f, 0.703300f, 0.703573f, 0.703845f, 0.704118f, 0.704390f, 0.704662f,
+ 0.704934f, 0.705206f, 0.705478f, 0.705750f, 0.706021f, 0.706293f, 0.706564f, 0.706836f,
+ 0.707107f, 0.707378f, 0.707649f, 0.707920f, 0.708191f, 0.708461f, 0.708732f, 0.709002f,
+ 0.709273f, 0.709543f, 0.709813f, 0.710083f, 0.710353f, 0.710623f, 0.710893f, 0.711163f,
+ 0.711432f, 0.711702f, 0.711971f, 0.712240f, 0.712509f, 0.712778f, 0.713047f, 0.713316f,
+ 0.713585f, 0.713853f, 0.714122f, 0.714390f, 0.714659f, 0.714927f, 0.715195f, 0.715463f,
+ 0.715731f, 0.715999f, 0.716266f, 0.716534f, 0.716801f, 0.717069f, 0.717336f, 0.717603f,
+ 0.717870f, 0.718137f, 0.718404f, 0.718670f, 0.718937f, 0.719204f, 0.719470f, 0.719736f,
+ 0.720003f, 0.720269f, 0.720535f, 0.720800f, 0.721066f, 0.721332f, 0.721597f, 0.721863f,
+ 0.722128f, 0.722393f, 0.722659f, 0.722924f, 0.723188f, 0.723453f, 0.723718f, 0.723983f,
+ 0.724247f, 0.724511f, 0.724776f, 0.725040f, 0.725304f, 0.725568f, 0.725832f, 0.726095f,
+ 0.726359f, 0.726623f, 0.726886f, 0.727149f, 0.727413f, 0.727676f, 0.727939f, 0.728202f,
+ 0.728464f, 0.728727f, 0.728990f, 0.729252f, 0.729514f, 0.729777f, 0.730039f, 0.730301f,
+ 0.730563f, 0.730825f, 0.731086f, 0.731348f, 0.731609f, 0.731871f, 0.732132f, 0.732393f,
+ 0.732654f, 0.732915f, 0.733176f, 0.733437f, 0.733697f, 0.733958f, 0.734218f, 0.734479f,
+ 0.734739f, 0.734999f, 0.735259f, 0.735519f, 0.735779f, 0.736038f, 0.736298f, 0.736557f,
+ 0.736817f, 0.737076f, 0.737335f, 0.737594f, 0.737853f, 0.738112f, 0.738370f, 0.738629f,
+ 0.738887f, 0.739146f, 0.739404f, 0.739662f, 0.739920f, 0.740178f, 0.740436f, 0.740694f,
+ 0.740951f, 0.741209f, 0.741466f, 0.741723f, 0.741980f, 0.742237f, 0.742494f, 0.742751f,
+ 0.743008f, 0.743265f, 0.743521f, 0.743777f, 0.744034f, 0.744290f, 0.744546f, 0.744802f,
+ 0.745058f, 0.745314f, 0.745569f, 0.745825f, 0.746080f, 0.746335f, 0.746591f, 0.746846f,
+ 0.747101f, 0.747355f, 0.747610f, 0.747865f, 0.748119f, 0.748374f, 0.748628f, 0.748882f,
+ 0.749136f, 0.749390f, 0.749644f, 0.749898f, 0.750152f, 0.750405f, 0.750659f, 0.750912f,
+ 0.751165f, 0.751418f, 0.751671f, 0.751924f, 0.752177f, 0.752429f, 0.752682f, 0.752934f,
+ 0.753187f, 0.753439f, 0.753691f, 0.753943f, 0.754195f, 0.754447f, 0.754698f, 0.754950f,
+ 0.755201f, 0.755453f, 0.755704f, 0.755955f, 0.756206f, 0.756457f, 0.756708f, 0.756958f,
+ 0.757209f, 0.757459f, 0.757710f, 0.757960f, 0.758210f, 0.758460f, 0.758710f, 0.758960f,
+ 0.759209f, 0.759459f, 0.759708f, 0.759957f, 0.760207f, 0.760456f, 0.760705f, 0.760954f,
+ 0.761202f, 0.761451f, 0.761700f, 0.761948f, 0.762196f, 0.762444f, 0.762693f, 0.762941f,
+ 0.763188f, 0.763436f, 0.763684f, 0.763931f, 0.764179f, 0.764426f, 0.764673f, 0.764920f,
+ 0.765167f, 0.765414f, 0.765661f, 0.765907f, 0.766154f, 0.766400f, 0.766647f, 0.766893f,
+ 0.767139f, 0.767385f, 0.767631f, 0.767876f, 0.768122f, 0.768368f, 0.768613f, 0.768858f,
+ 0.769103f, 0.769348f, 0.769593f, 0.769838f, 0.770083f, 0.770327f, 0.770572f, 0.770816f,
+ 0.771061f, 0.771305f, 0.771549f, 0.771793f, 0.772036f, 0.772280f, 0.772524f, 0.772767f,
+ 0.773010f, 0.773254f, 0.773497f, 0.773740f, 0.773983f, 0.774225f, 0.774468f, 0.774711f,
+ 0.774953f, 0.775195f, 0.775438f, 0.775680f, 0.775922f, 0.776164f, 0.776405f, 0.776647f,
+ 0.776888f, 0.777130f, 0.777371f, 0.777612f, 0.777853f, 0.778094f, 0.778335f, 0.778576f,
+ 0.778817f, 0.779057f, 0.779297f, 0.779538f, 0.779778f, 0.780018f, 0.780258f, 0.780498f,
+ 0.780737f, 0.780977f, 0.781216f, 0.781456f, 0.781695f, 0.781934f, 0.782173f, 0.782412f,
+ 0.782651f, 0.782889f, 0.783128f, 0.783366f, 0.783605f, 0.783843f, 0.784081f, 0.784319f,
+ 0.784557f, 0.784794f, 0.785032f, 0.785269f, 0.785507f, 0.785744f, 0.785981f, 0.786218f,
+ 0.786455f, 0.786692f, 0.786929f, 0.787165f, 0.787402f, 0.787638f, 0.787874f, 0.788110f,
+ 0.788346f, 0.788582f, 0.788818f, 0.789054f, 0.789289f, 0.789525f, 0.789760f, 0.789995f,
+ 0.790230f, 0.790465f, 0.790700f, 0.790935f, 0.791169f, 0.791404f, 0.791638f, 0.791872f,
+ 0.792107f, 0.792341f, 0.792575f, 0.792808f, 0.793042f, 0.793276f, 0.793509f, 0.793742f,
+ 0.793975f, 0.794209f, 0.794442f, 0.794674f, 0.794907f, 0.795140f, 0.795372f, 0.795605f,
+ 0.795837f, 0.796069f, 0.796301f, 0.796533f, 0.796765f, 0.796996f, 0.797228f, 0.797459f,
+ 0.797691f, 0.797922f, 0.798153f, 0.798384f, 0.798615f, 0.798846f, 0.799076f, 0.799307f,
+ 0.799537f, 0.799768f, 0.799998f, 0.800228f, 0.800458f, 0.800687f, 0.800917f, 0.801147f,
+ 0.801376f, 0.801606f, 0.801835f, 0.802064f, 0.802293f, 0.802522f, 0.802750f, 0.802979f,
+ 0.803208f, 0.803436f, 0.803664f, 0.803892f, 0.804120f, 0.804348f, 0.804576f, 0.804804f,
+ 0.805031f, 0.805259f, 0.805486f, 0.805713f, 0.805940f, 0.806167f, 0.806394f, 0.806621f,
+ 0.806848f, 0.807074f, 0.807300f, 0.807527f, 0.807753f, 0.807979f, 0.808205f, 0.808430f,
+ 0.808656f, 0.808882f, 0.809107f, 0.809332f, 0.809558f, 0.809783f, 0.810008f, 0.810232f,
+ 0.810457f, 0.810682f, 0.810906f, 0.811131f, 0.811355f, 0.811579f, 0.811803f, 0.812027f,
+ 0.812251f, 0.812474f, 0.812698f, 0.812921f, 0.813144f, 0.813368f, 0.813591f, 0.813814f,
+ 0.814036f, 0.814259f, 0.814482f, 0.814704f, 0.814926f, 0.815149f, 0.815371f, 0.815593f,
+ 0.815814f, 0.816036f, 0.816258f, 0.816479f, 0.816701f, 0.816922f, 0.817143f, 0.817364f,
+ 0.817585f, 0.817806f, 0.818026f, 0.818247f, 0.818467f, 0.818687f, 0.818908f, 0.819128f,
+ 0.819348f, 0.819567f, 0.819787f, 0.820007f, 0.820226f, 0.820445f, 0.820664f, 0.820884f,
+ 0.821102f, 0.821321f, 0.821540f, 0.821759f, 0.821977f, 0.822195f, 0.822414f, 0.822632f,
+ 0.822850f, 0.823068f, 0.823285f, 0.823503f, 0.823721f, 0.823938f, 0.824155f, 0.824372f,
+ 0.824589f, 0.824806f, 0.825023f, 0.825240f, 0.825456f, 0.825673f, 0.825889f, 0.826105f,
+ 0.826321f, 0.826537f, 0.826753f, 0.826968f, 0.827184f, 0.827399f, 0.827615f, 0.827830f,
+ 0.828045f, 0.828260f, 0.828475f, 0.828690f, 0.828904f, 0.829119f, 0.829333f, 0.829547f,
+ 0.829761f, 0.829975f, 0.830189f, 0.830403f, 0.830616f, 0.830830f, 0.831043f, 0.831257f,
+ 0.831470f, 0.831683f, 0.831895f, 0.832108f, 0.832321f, 0.832533f, 0.832746f, 0.832958f,
+ 0.833170f, 0.833382f, 0.833594f, 0.833806f, 0.834018f, 0.834229f, 0.834440f, 0.834652f,
+ 0.834863f, 0.835074f, 0.835285f, 0.835496f, 0.835706f, 0.835917f, 0.836127f, 0.836338f,
+ 0.836548f, 0.836758f, 0.836968f, 0.837178f, 0.837387f, 0.837597f, 0.837806f, 0.838015f,
+ 0.838225f, 0.838434f, 0.838643f, 0.838852f, 0.839060f, 0.839269f, 0.839477f, 0.839686f,
+ 0.839894f, 0.840102f, 0.840310f, 0.840518f, 0.840725f, 0.840933f, 0.841140f, 0.841348f,
+ 0.841555f, 0.841762f, 0.841969f, 0.842176f, 0.842383f, 0.842589f, 0.842796f, 0.843002f,
+ 0.843208f, 0.843414f, 0.843620f, 0.843826f, 0.844032f, 0.844238f, 0.844443f, 0.844648f,
+ 0.844854f, 0.845059f, 0.845264f, 0.845469f, 0.845673f, 0.845878f, 0.846082f, 0.846287f,
+ 0.846491f, 0.846695f, 0.846899f, 0.847103f, 0.847307f, 0.847510f, 0.847714f, 0.847917f,
+ 0.848120f, 0.848323f, 0.848526f, 0.848729f, 0.848932f, 0.849135f, 0.849337f, 0.849540f,
+ 0.849742f, 0.849944f, 0.850146f, 0.850348f, 0.850549f, 0.850751f, 0.850953f, 0.851154f,
+ 0.851355f, 0.851556f, 0.851757f, 0.851958f, 0.852159f, 0.852360f, 0.852560f, 0.852760f,
+ 0.852961f, 0.853161f, 0.853361f, 0.853561f, 0.853760f, 0.853960f, 0.854159f, 0.854359f,
+ 0.854558f, 0.854757f, 0.854956f, 0.855155f, 0.855354f, 0.855552f, 0.855751f, 0.855949f,
+ 0.856147f, 0.856345f, 0.856543f, 0.856741f, 0.856939f, 0.857137f, 0.857334f, 0.857531f,
+ 0.857729f, 0.857926f, 0.858123f, 0.858320f, 0.858516f, 0.858713f, 0.858909f, 0.859106f,
+ 0.859302f, 0.859498f, 0.859694f, 0.859890f, 0.860085f, 0.860281f, 0.860476f, 0.860672f,
+ 0.860867f, 0.861062f, 0.861257f, 0.861452f, 0.861646f, 0.861841f, 0.862035f, 0.862230f,
+ 0.862424f, 0.862618f, 0.862812f, 0.863006f, 0.863199f, 0.863393f, 0.863586f, 0.863780f,
+ 0.863973f, 0.864166f, 0.864359f, 0.864552f, 0.864744f, 0.864937f, 0.865129f, 0.865321f,
+ 0.865514f, 0.865706f, 0.865898f, 0.866089f, 0.866281f, 0.866472f, 0.866664f, 0.866855f,
+ 0.867046f, 0.867237f, 0.867428f, 0.867619f, 0.867809f, 0.868000f, 0.868190f, 0.868381f,
+ 0.868571f, 0.868761f, 0.868951f, 0.869140f, 0.869330f, 0.869519f, 0.869709f, 0.869898f,
+ 0.870087f, 0.870276f, 0.870465f, 0.870654f, 0.870842f, 0.871031f, 0.871219f, 0.871407f,
+ 0.871595f, 0.871783f, 0.871971f, 0.872159f, 0.872346f, 0.872534f, 0.872721f, 0.872908f,
+ 0.873095f, 0.873282f, 0.873469f, 0.873655f, 0.873842f, 0.874028f, 0.874215f, 0.874401f,
+ 0.874587f, 0.874773f, 0.874958f, 0.875144f, 0.875329f, 0.875515f, 0.875700f, 0.875885f,
+ 0.876070f, 0.876255f, 0.876440f, 0.876624f, 0.876809f, 0.876993f, 0.877177f, 0.877361f,
+ 0.877545f, 0.877729f, 0.877913f, 0.878096f, 0.878280f, 0.878463f, 0.878646f, 0.878829f,
+ 0.879012f, 0.879195f, 0.879378f, 0.879560f, 0.879743f, 0.879925f, 0.880107f, 0.880289f,
+ 0.880471f, 0.880653f, 0.880834f, 0.881016f, 0.881197f, 0.881378f, 0.881559f, 0.881740f,
+ 0.881921f, 0.882102f, 0.882283f, 0.882463f, 0.882643f, 0.882824f, 0.883004f, 0.883184f,
+ 0.883363f, 0.883543f, 0.883723f, 0.883902f, 0.884081f, 0.884260f, 0.884439f, 0.884618f,
+ 0.884797f, 0.884976f, 0.885154f, 0.885333f, 0.885511f, 0.885689f, 0.885867f, 0.886045f,
+ 0.886223f, 0.886400f, 0.886578f, 0.886755f, 0.886932f, 0.887109f, 0.887286f, 0.887463f,
+ 0.887640f, 0.887816f, 0.887993f, 0.888169f, 0.888345f, 0.888521f, 0.888697f, 0.888873f,
+ 0.889048f, 0.889224f, 0.889399f, 0.889574f, 0.889750f, 0.889925f, 0.890099f, 0.890274f,
+ 0.890449f, 0.890623f, 0.890797f, 0.890972f, 0.891146f, 0.891320f, 0.891493f, 0.891667f,
+ 0.891841f, 0.892014f, 0.892187f, 0.892361f, 0.892534f, 0.892706f, 0.892879f, 0.893052f,
+ 0.893224f, 0.893397f, 0.893569f, 0.893741f, 0.893913f, 0.894085f, 0.894256f, 0.894428f,
+ 0.894599f, 0.894771f, 0.894942f, 0.895113f, 0.895284f, 0.895455f, 0.895625f, 0.895796f,
+ 0.895966f, 0.896137f, 0.896307f, 0.896477f, 0.896646f, 0.896816f, 0.896986f, 0.897155f,
+ 0.897325f, 0.897494f, 0.897663f, 0.897832f, 0.898001f, 0.898169f, 0.898338f, 0.898506f,
+ 0.898674f, 0.898843f, 0.899011f, 0.899179f, 0.899346f, 0.899514f, 0.899681f, 0.899849f,
+ 0.900016f, 0.900183f, 0.900350f, 0.900517f, 0.900683f, 0.900850f, 0.901016f, 0.901183f,
+ 0.901349f, 0.901515f, 0.901681f, 0.901847f, 0.902012f, 0.902178f, 0.902343f, 0.902508f,
+ 0.902673f, 0.902838f, 0.903003f, 0.903168f, 0.903332f, 0.903497f, 0.903661f, 0.903825f,
+ 0.903989f, 0.904153f, 0.904317f, 0.904481f, 0.904644f, 0.904807f, 0.904971f, 0.905134f,
+ 0.905297f, 0.905460f, 0.905622f, 0.905785f, 0.905947f, 0.906110f, 0.906272f, 0.906434f,
+ 0.906596f, 0.906757f, 0.906919f, 0.907081f, 0.907242f, 0.907403f, 0.907564f, 0.907725f,
+ 0.907886f, 0.908047f, 0.908207f, 0.908368f, 0.908528f, 0.908688f, 0.908848f, 0.909008f,
+ 0.909168f, 0.909328f, 0.909487f, 0.909646f, 0.909806f, 0.909965f, 0.910124f, 0.910283f,
+ 0.910441f, 0.910600f, 0.910758f, 0.910917f, 0.911075f, 0.911233f, 0.911391f, 0.911548f,
+ 0.911706f, 0.911864f, 0.912021f, 0.912178f, 0.912335f, 0.912492f, 0.912649f, 0.912806f,
+ 0.912962f, 0.913119f, 0.913275f, 0.913431f, 0.913587f, 0.913743f, 0.913899f, 0.914054f,
+ 0.914210f, 0.914365f, 0.914520f, 0.914675f, 0.914830f, 0.914985f, 0.915140f, 0.915294f,
+ 0.915449f, 0.915603f, 0.915757f, 0.915911f, 0.916065f, 0.916219f, 0.916372f, 0.916526f,
+ 0.916679f, 0.916832f, 0.916985f, 0.917138f, 0.917291f, 0.917444f, 0.917596f, 0.917749f,
+ 0.917901f, 0.918053f, 0.918205f, 0.918357f, 0.918508f, 0.918660f, 0.918811f, 0.918963f,
+ 0.919114f, 0.919265f, 0.919416f, 0.919567f, 0.919717f, 0.919868f, 0.920018f, 0.920168f,
+ 0.920318f, 0.920468f, 0.920618f, 0.920768f, 0.920917f, 0.921067f, 0.921216f, 0.921365f,
+ 0.921514f, 0.921663f, 0.921812f, 0.921960f, 0.922109f, 0.922257f, 0.922405f, 0.922553f,
+ 0.922701f, 0.922849f, 0.922997f, 0.923144f, 0.923291f, 0.923439f, 0.923586f, 0.923733f,
+ 0.923880f, 0.924026f, 0.924173f, 0.924319f, 0.924465f, 0.924612f, 0.924758f, 0.924904f,
+ 0.925049f, 0.925195f, 0.925340f, 0.925486f, 0.925631f, 0.925776f, 0.925921f, 0.926066f,
+ 0.926210f, 0.926355f, 0.926499f, 0.926643f, 0.926787f, 0.926931f, 0.927075f, 0.927219f,
+ 0.927363f, 0.927506f, 0.927649f, 0.927792f, 0.927935f, 0.928078f, 0.928221f, 0.928364f,
+ 0.928506f, 0.928648f, 0.928791f, 0.928933f, 0.929075f, 0.929216f, 0.929358f, 0.929500f,
+ 0.929641f, 0.929782f, 0.929923f, 0.930064f, 0.930205f, 0.930346f, 0.930486f, 0.930627f,
+ 0.930767f, 0.930907f, 0.931047f, 0.931187f, 0.931327f, 0.931466f, 0.931606f, 0.931745f,
+ 0.931884f, 0.932023f, 0.932162f, 0.932301f, 0.932440f, 0.932578f, 0.932716f, 0.932855f,
+ 0.932993f, 0.933131f, 0.933269f, 0.933406f, 0.933544f, 0.933681f, 0.933818f, 0.933956f,
+ 0.934093f, 0.934229f, 0.934366f, 0.934503f, 0.934639f, 0.934775f, 0.934912f, 0.935048f,
+ 0.935184f, 0.935319f, 0.935455f, 0.935590f, 0.935726f, 0.935861f, 0.935996f, 0.936131f,
+ 0.936266f, 0.936400f, 0.936535f, 0.936669f, 0.936803f, 0.936938f, 0.937072f, 0.937205f,
+ 0.937339f, 0.937473f, 0.937606f, 0.937739f, 0.937872f, 0.938005f, 0.938138f, 0.938271f,
+ 0.938404f, 0.938536f, 0.938668f, 0.938800f, 0.938932f, 0.939064f, 0.939196f, 0.939328f,
+ 0.939459f, 0.939591f, 0.939722f, 0.939853f, 0.939984f, 0.940115f, 0.940245f, 0.940376f,
+ 0.940506f, 0.940636f, 0.940766f, 0.940896f, 0.941026f, 0.941156f, 0.941285f, 0.941415f,
+ 0.941544f, 0.941673f, 0.941802f, 0.941931f, 0.942060f, 0.942188f, 0.942317f, 0.942445f,
+ 0.942573f, 0.942701f, 0.942829f, 0.942957f, 0.943084f, 0.943212f, 0.943339f, 0.943466f,
+ 0.943593f, 0.943720f, 0.943847f, 0.943974f, 0.944100f, 0.944227f, 0.944353f, 0.944479f,
+ 0.944605f, 0.944731f, 0.944856f, 0.944982f, 0.945107f, 0.945232f, 0.945358f, 0.945482f,
+ 0.945607f, 0.945732f, 0.945857f, 0.945981f, 0.946105f, 0.946229f, 0.946353f, 0.946477f,
+ 0.946601f, 0.946724f, 0.946848f, 0.946971f, 0.947094f, 0.947217f, 0.947340f, 0.947463f,
+ 0.947586f, 0.947708f, 0.947830f, 0.947953f, 0.948075f, 0.948196f, 0.948318f, 0.948440f,
+ 0.948561f, 0.948683f, 0.948804f, 0.948925f, 0.949046f, 0.949167f, 0.949287f, 0.949408f,
+ 0.949528f, 0.949648f, 0.949768f, 0.949888f, 0.950008f, 0.950128f, 0.950247f, 0.950367f,
+ 0.950486f, 0.950605f, 0.950724f, 0.950843f, 0.950962f, 0.951080f, 0.951199f, 0.951317f,
+ 0.951435f, 0.951553f, 0.951671f, 0.951789f, 0.951906f, 0.952024f, 0.952141f, 0.952258f,
+ 0.952375f, 0.952492f, 0.952609f, 0.952725f, 0.952842f, 0.952958f, 0.953074f, 0.953190f,
+ 0.953306f, 0.953422f, 0.953537f, 0.953653f, 0.953768f, 0.953883f, 0.953998f, 0.954113f,
+ 0.954228f, 0.954343f, 0.954457f, 0.954572f, 0.954686f, 0.954800f, 0.954914f, 0.955028f,
+ 0.955141f, 0.955255f, 0.955368f, 0.955481f, 0.955594f, 0.955707f, 0.955820f, 0.955933f,
+ 0.956045f, 0.956158f, 0.956270f, 0.956382f, 0.956494f, 0.956606f, 0.956717f, 0.956829f,
+ 0.956940f, 0.957052f, 0.957163f, 0.957274f, 0.957385f, 0.957495f, 0.957606f, 0.957716f,
+ 0.957826f, 0.957937f, 0.958046f, 0.958156f, 0.958266f, 0.958376f, 0.958485f, 0.958594f,
+ 0.958703f, 0.958812f, 0.958921f, 0.959030f, 0.959139f, 0.959247f, 0.959355f, 0.959463f,
+ 0.959572f, 0.959679f, 0.959787f, 0.959895f, 0.960002f, 0.960109f, 0.960217f, 0.960324f,
+ 0.960431f, 0.960537f, 0.960644f, 0.960750f, 0.960857f, 0.960963f, 0.961069f, 0.961175f,
+ 0.961280f, 0.961386f, 0.961492f, 0.961597f, 0.961702f, 0.961807f, 0.961912f, 0.962017f,
+ 0.962121f, 0.962226f, 0.962330f, 0.962434f, 0.962538f, 0.962642f, 0.962746f, 0.962850f,
+ 0.962953f, 0.963057f, 0.963160f, 0.963263f, 0.963366f, 0.963469f, 0.963571f, 0.963674f,
+ 0.963776f, 0.963878f, 0.963980f, 0.964082f, 0.964184f, 0.964286f, 0.964387f, 0.964489f,
+ 0.964590f, 0.964691f, 0.964792f, 0.964893f, 0.964993f, 0.965094f, 0.965194f, 0.965294f,
+ 0.965394f, 0.965494f, 0.965594f, 0.965694f, 0.965793f, 0.965893f, 0.965992f, 0.966091f,
+ 0.966190f, 0.966289f, 0.966387f, 0.966486f, 0.966584f, 0.966683f, 0.966781f, 0.966879f,
+ 0.966976f, 0.967074f, 0.967172f, 0.967269f, 0.967366f, 0.967463f, 0.967560f, 0.967657f,
+ 0.967754f, 0.967850f, 0.967947f, 0.968043f, 0.968139f, 0.968235f, 0.968331f, 0.968427f,
+ 0.968522f, 0.968617f, 0.968713f, 0.968808f, 0.968903f, 0.968998f, 0.969092f, 0.969187f,
+ 0.969281f, 0.969375f, 0.969470f, 0.969564f, 0.969657f, 0.969751f, 0.969845f, 0.969938f,
+ 0.970031f, 0.970124f, 0.970217f, 0.970310f, 0.970403f, 0.970495f, 0.970588f, 0.970680f,
+ 0.970772f, 0.970864f, 0.970956f, 0.971048f, 0.971139f, 0.971231f, 0.971322f, 0.971413f,
+ 0.971504f, 0.971595f, 0.971685f, 0.971776f, 0.971866f, 0.971957f, 0.972047f, 0.972137f,
+ 0.972227f, 0.972316f, 0.972406f, 0.972495f, 0.972584f, 0.972673f, 0.972762f, 0.972851f,
+ 0.972940f, 0.973028f, 0.973117f, 0.973205f, 0.973293f, 0.973381f, 0.973469f, 0.973557f,
+ 0.973644f, 0.973732f, 0.973819f, 0.973906f, 0.973993f, 0.974080f, 0.974166f, 0.974253f,
+ 0.974339f, 0.974426f, 0.974512f, 0.974598f, 0.974684f, 0.974769f, 0.974855f, 0.974940f,
+ 0.975025f, 0.975110f, 0.975195f, 0.975280f, 0.975365f, 0.975449f, 0.975534f, 0.975618f,
+ 0.975702f, 0.975786f, 0.975870f, 0.975954f, 0.976037f, 0.976120f, 0.976204f, 0.976287f,
+ 0.976370f, 0.976453f, 0.976535f, 0.976618f, 0.976700f, 0.976782f, 0.976864f, 0.976946f,
+ 0.977028f, 0.977110f, 0.977191f, 0.977273f, 0.977354f, 0.977435f, 0.977516f, 0.977597f,
+ 0.977677f, 0.977758f, 0.977838f, 0.977918f, 0.977998f, 0.978078f, 0.978158f, 0.978238f,
+ 0.978317f, 0.978397f, 0.978476f, 0.978555f, 0.978634f, 0.978713f, 0.978791f, 0.978870f,
+ 0.978948f, 0.979026f, 0.979104f, 0.979182f, 0.979260f, 0.979338f, 0.979415f, 0.979493f,
+ 0.979570f, 0.979647f, 0.979724f, 0.979800f, 0.979877f, 0.979954f, 0.980030f, 0.980106f,
+ 0.980182f, 0.980258f, 0.980334f, 0.980409f, 0.980485f, 0.980560f, 0.980635f, 0.980710f,
+ 0.980785f, 0.980860f, 0.980935f, 0.981009f, 0.981083f, 0.981158f, 0.981232f, 0.981305f,
+ 0.981379f, 0.981453f, 0.981526f, 0.981600f, 0.981673f, 0.981746f, 0.981819f, 0.981891f,
+ 0.981964f, 0.982036f, 0.982109f, 0.982181f, 0.982253f, 0.982325f, 0.982396f, 0.982468f,
+ 0.982539f, 0.982611f, 0.982682f, 0.982753f, 0.982824f, 0.982894f, 0.982965f, 0.983035f,
+ 0.983105f, 0.983176f, 0.983246f, 0.983315f, 0.983385f, 0.983455f, 0.983524f, 0.983593f,
+ 0.983662f, 0.983731f, 0.983800f, 0.983869f, 0.983937f, 0.984006f, 0.984074f, 0.984142f,
+ 0.984210f, 0.984278f, 0.984346f, 0.984413f, 0.984480f, 0.984548f, 0.984615f, 0.984682f,
+ 0.984748f, 0.984815f, 0.984882f, 0.984948f, 0.985014f, 0.985080f, 0.985146f, 0.985212f,
+ 0.985278f, 0.985343f, 0.985408f, 0.985474f, 0.985539f, 0.985604f, 0.985668f, 0.985733f,
+ 0.985798f, 0.985862f, 0.985926f, 0.985990f, 0.986054f, 0.986118f, 0.986181f, 0.986245f,
+ 0.986308f, 0.986371f, 0.986434f, 0.986497f, 0.986560f, 0.986623f, 0.986685f, 0.986747f,
+ 0.986809f, 0.986871f, 0.986933f, 0.986995f, 0.987057f, 0.987118f, 0.987179f, 0.987240f,
+ 0.987301f, 0.987362f, 0.987423f, 0.987484f, 0.987544f, 0.987604f, 0.987664f, 0.987724f,
+ 0.987784f, 0.987844f, 0.987903f, 0.987963f, 0.988022f, 0.988081f, 0.988140f, 0.988199f,
+ 0.988258f, 0.988316f, 0.988374f, 0.988433f, 0.988491f, 0.988549f, 0.988607f, 0.988664f,
+ 0.988722f, 0.988779f, 0.988836f, 0.988893f, 0.988950f, 0.989007f, 0.989064f, 0.989120f,
+ 0.989177f, 0.989233f, 0.989289f, 0.989345f, 0.989400f, 0.989456f, 0.989511f, 0.989567f,
+ 0.989622f, 0.989677f, 0.989732f, 0.989787f, 0.989841f, 0.989896f, 0.989950f, 0.990004f,
+ 0.990058f, 0.990112f, 0.990166f, 0.990219f, 0.990273f, 0.990326f, 0.990379f, 0.990432f,
+ 0.990485f, 0.990538f, 0.990590f, 0.990643f, 0.990695f, 0.990747f, 0.990799f, 0.990851f,
+ 0.990903f, 0.990954f, 0.991006f, 0.991057f, 0.991108f, 0.991159f, 0.991210f, 0.991260f,
+ 0.991311f, 0.991361f, 0.991411f, 0.991462f, 0.991511f, 0.991561f, 0.991611f, 0.991660f,
+ 0.991710f, 0.991759f, 0.991808f, 0.991857f, 0.991906f, 0.991954f, 0.992003f, 0.992051f,
+ 0.992099f, 0.992147f, 0.992195f, 0.992243f, 0.992291f, 0.992338f, 0.992385f, 0.992433f,
+ 0.992480f, 0.992526f, 0.992573f, 0.992620f, 0.992666f, 0.992712f, 0.992759f, 0.992805f,
+ 0.992850f, 0.992896f, 0.992942f, 0.992987f, 0.993032f, 0.993077f, 0.993122f, 0.993167f,
+ 0.993212f, 0.993257f, 0.993301f, 0.993345f, 0.993389f, 0.993433f, 0.993477f, 0.993521f,
+ 0.993564f, 0.993608f, 0.993651f, 0.993694f, 0.993737f, 0.993779f, 0.993822f, 0.993865f,
+ 0.993907f, 0.993949f, 0.993991f, 0.994033f, 0.994075f, 0.994116f, 0.994158f, 0.994199f,
+ 0.994240f, 0.994281f, 0.994322f, 0.994363f, 0.994404f, 0.994444f, 0.994484f, 0.994525f,
+ 0.994565f, 0.994604f, 0.994644f, 0.994684f, 0.994723f, 0.994762f, 0.994802f, 0.994841f,
+ 0.994879f, 0.994918f, 0.994957f, 0.994995f, 0.995033f, 0.995071f, 0.995109f, 0.995147f,
+ 0.995185f, 0.995222f, 0.995260f, 0.995297f, 0.995334f, 0.995371f, 0.995408f, 0.995444f,
+ 0.995481f, 0.995517f, 0.995553f, 0.995589f, 0.995625f, 0.995661f, 0.995697f, 0.995732f,
+ 0.995767f, 0.995803f, 0.995838f, 0.995872f, 0.995907f, 0.995942f, 0.995976f, 0.996011f,
+ 0.996045f, 0.996079f, 0.996113f, 0.996146f, 0.996180f, 0.996213f, 0.996247f, 0.996280f,
+ 0.996313f, 0.996345f, 0.996378f, 0.996411f, 0.996443f, 0.996475f, 0.996507f, 0.996539f,
+ 0.996571f, 0.996603f, 0.996634f, 0.996666f, 0.996697f, 0.996728f, 0.996759f, 0.996790f,
+ 0.996820f, 0.996851f, 0.996881f, 0.996911f, 0.996941f, 0.996971f, 0.997001f, 0.997031f,
+ 0.997060f, 0.997089f, 0.997119f, 0.997148f, 0.997176f, 0.997205f, 0.997234f, 0.997262f,
+ 0.997290f, 0.997319f, 0.997347f, 0.997374f, 0.997402f, 0.997430f, 0.997457f, 0.997484f,
+ 0.997511f, 0.997538f, 0.997565f, 0.997592f, 0.997618f, 0.997645f, 0.997671f, 0.997697f,
+ 0.997723f, 0.997749f, 0.997774f, 0.997800f, 0.997825f, 0.997851f, 0.997876f, 0.997901f,
+ 0.997925f, 0.997950f, 0.997974f, 0.997999f, 0.998023f, 0.998047f, 0.998071f, 0.998094f,
+ 0.998118f, 0.998142f, 0.998165f, 0.998188f, 0.998211f, 0.998234f, 0.998257f, 0.998279f,
+ 0.998302f, 0.998324f, 0.998346f, 0.998368f, 0.998390f, 0.998411f, 0.998433f, 0.998454f,
+ 0.998476f, 0.998497f, 0.998518f, 0.998538f, 0.998559f, 0.998580f, 0.998600f, 0.998620f,
+ 0.998640f, 0.998660f, 0.998680f, 0.998700f, 0.998719f, 0.998738f, 0.998758f, 0.998777f,
+ 0.998795f, 0.998814f, 0.998833f, 0.998851f, 0.998870f, 0.998888f, 0.998906f, 0.998924f,
+ 0.998941f, 0.998959f, 0.998976f, 0.998994f, 0.999011f, 0.999028f, 0.999044f, 0.999061f,
+ 0.999078f, 0.999094f, 0.999110f, 0.999126f, 0.999142f, 0.999158f, 0.999174f, 0.999189f,
+ 0.999205f, 0.999220f, 0.999235f, 0.999250f, 0.999265f, 0.999279f, 0.999294f, 0.999308f,
+ 0.999322f, 0.999336f, 0.999350f, 0.999364f, 0.999378f, 0.999391f, 0.999404f, 0.999418f,
+ 0.999431f, 0.999443f, 0.999456f, 0.999469f, 0.999481f, 0.999493f, 0.999506f, 0.999518f,
+ 0.999529f, 0.999541f, 0.999553f, 0.999564f, 0.999575f, 0.999586f, 0.999597f, 0.999608f,
+ 0.999619f, 0.999629f, 0.999640f, 0.999650f, 0.999660f, 0.999670f, 0.999680f, 0.999689f,
+ 0.999699f, 0.999708f, 0.999717f, 0.999726f, 0.999735f, 0.999744f, 0.999753f, 0.999761f,
+ 0.999769f, 0.999778f, 0.999786f, 0.999793f, 0.999801f, 0.999809f, 0.999816f, 0.999823f,
+ 0.999831f, 0.999838f, 0.999844f, 0.999851f, 0.999858f, 0.999864f, 0.999870f, 0.999876f,
+ 0.999882f, 0.999888f, 0.999894f, 0.999899f, 0.999905f, 0.999910f, 0.999915f, 0.999920f,
+ 0.999925f, 0.999929f, 0.999934f, 0.999938f, 0.999942f, 0.999946f, 0.999950f, 0.999954f,
+ 0.999958f, 0.999961f, 0.999964f, 0.999968f, 0.999971f, 0.999973f, 0.999976f, 0.999979f,
+ 0.999981f, 0.999983f, 0.999986f, 0.999988f, 0.999989f, 0.999991f, 0.999993f, 0.999994f,
+ 0.999995f, 0.999996f, 0.999997f, 0.999998f, 0.999999f, 0.999999f, 1.000000f, 1.000000f,
+ 0.000000f, -0.000383f, -0.000767f, -0.001150f, -0.001534f, -0.001917f, -0.002301f, -0.002684f,
+ -0.003068f, -0.003451f, -0.003835f, -0.004218f, -0.004602f, -0.004985f, -0.005369f, -0.005752f,
+ -0.006136f, -0.006519f, -0.006903f, -0.007286f, -0.007670f, -0.008053f, -0.008437f, -0.008820f,
+ -0.009204f, -0.009587f, -0.009971f, -0.010354f, -0.010738f, -0.011121f, -0.011505f, -0.011888f,
+ -0.012272f, -0.012655f, -0.013038f, -0.013422f, -0.013805f, -0.014189f, -0.014572f, -0.014956f,
+ -0.015339f, -0.015723f, -0.016106f, -0.016490f, -0.016873f, -0.017256f, -0.017640f, -0.018023f,
+ -0.018407f, -0.018790f, -0.019174f, -0.019557f, -0.019940f, -0.020324f, -0.020707f, -0.021091f,
+ -0.021474f, -0.021857f, -0.022241f, -0.022624f, -0.023008f, -0.023391f, -0.023774f, -0.024158f,
+ -0.024541f, -0.024925f, -0.025308f, -0.025691f, -0.026075f, -0.026458f, -0.026841f, -0.027225f,
+ -0.027608f, -0.027991f, -0.028375f, -0.028758f, -0.029142f, -0.029525f, -0.029908f, -0.030291f,
+ -0.030675f, -0.031058f, -0.031441f, -0.031825f, -0.032208f, -0.032591f, -0.032975f, -0.033358f,
+ -0.033741f, -0.034124f, -0.034508f, -0.034891f, -0.035274f, -0.035657f, -0.036041f, -0.036424f,
+ -0.036807f, -0.037190f, -0.037574f, -0.037957f, -0.038340f, -0.038723f, -0.039107f, -0.039490f,
+ -0.039873f, -0.040256f, -0.040639f, -0.041022f, -0.041406f, -0.041789f, -0.042172f, -0.042555f,
+ -0.042938f, -0.043321f, -0.043705f, -0.044088f, -0.044471f, -0.044854f, -0.045237f, -0.045620f,
+ -0.046003f, -0.046386f, -0.046769f, -0.047152f, -0.047535f, -0.047919f, -0.048302f, -0.048685f,
+ -0.049068f, -0.049451f, -0.049834f, -0.050217f, -0.050600f, -0.050983f, -0.051366f, -0.051749f,
+ -0.052132f, -0.052515f, -0.052898f, -0.053281f, -0.053664f, -0.054046f, -0.054429f, -0.054812f,
+ -0.055195f, -0.055578f, -0.055961f, -0.056344f, -0.056727f, -0.057110f, -0.057493f, -0.057875f,
+ -0.058258f, -0.058641f, -0.059024f, -0.059407f, -0.059790f, -0.060172f, -0.060555f, -0.060938f,
+ -0.061321f, -0.061704f, -0.062086f, -0.062469f, -0.062852f, -0.063234f, -0.063617f, -0.064000f,
+ -0.064383f, -0.064765f, -0.065148f, -0.065531f, -0.065913f, -0.066296f, -0.066679f, -0.067061f,
+ -0.067444f, -0.067827f, -0.068209f, -0.068592f, -0.068974f, -0.069357f, -0.069739f, -0.070122f,
+ -0.070505f, -0.070887f, -0.071270f, -0.071652f, -0.072035f, -0.072417f, -0.072800f, -0.073182f,
+ -0.073565f, -0.073947f, -0.074329f, -0.074712f, -0.075094f, -0.075477f, -0.075859f, -0.076241f,
+ -0.076624f, -0.077006f, -0.077389f, -0.077771f, -0.078153f, -0.078536f, -0.078918f, -0.079300f,
+ -0.079682f, -0.080065f, -0.080447f, -0.080829f, -0.081211f, -0.081594f, -0.081976f, -0.082358f,
+ -0.082740f, -0.083122f, -0.083505f, -0.083887f, -0.084269f, -0.084651f, -0.085033f, -0.085415f,
+ -0.085797f, -0.086179f, -0.086561f, -0.086943f, -0.087326f, -0.087708f, -0.088090f, -0.088472f,
+ -0.088854f, -0.089236f, -0.089617f, -0.089999f, -0.090381f, -0.090763f, -0.091145f, -0.091527f,
+ -0.091909f, -0.092291f, -0.092673f, -0.093055f, -0.093436f, -0.093818f, -0.094200f, -0.094582f,
+ -0.094963f, -0.095345f, -0.095727f, -0.096109f, -0.096490f, -0.096872f, -0.097254f, -0.097635f,
+ -0.098017f, -0.098399f, -0.098780f, -0.099162f, -0.099544f, -0.099925f, -0.100307f, -0.100688f,
+ -0.101070f, -0.101451f, -0.101833f, -0.102214f, -0.102596f, -0.102977f, -0.103359f, -0.103740f,
+ -0.104122f, -0.104503f, -0.104884f, -0.105266f, -0.105647f, -0.106028f, -0.106410f, -0.106791f,
+ -0.107172f, -0.107554f, -0.107935f, -0.108316f, -0.108697f, -0.109079f, -0.109460f, -0.109841f,
+ -0.110222f, -0.110603f, -0.110984f, -0.111366f, -0.111747f, -0.112128f, -0.112509f, -0.112890f,
+ -0.113271f, -0.113652f, -0.114033f, -0.114414f, -0.114795f, -0.115176f, -0.115557f, -0.115938f,
+ -0.116319f, -0.116700f, -0.117080f, -0.117461f, -0.117842f, -0.118223f, -0.118604f, -0.118984f,
+ -0.119365f, -0.119746f, -0.120127f, -0.120507f, -0.120888f, -0.121269f, -0.121649f, -0.122030f,
+ -0.122411f, -0.122791f, -0.123172f, -0.123552f, -0.123933f, -0.124314f, -0.124694f, -0.125075f,
+ -0.125455f, -0.125835f, -0.126216f, -0.126596f, -0.126977f, -0.127357f, -0.127737f, -0.128118f,
+ -0.128498f, -0.128878f, -0.129259f, -0.129639f, -0.130019f, -0.130399f, -0.130780f, -0.131160f,
+ -0.131540f, -0.131920f, -0.132300f, -0.132680f, -0.133061f, -0.133441f, -0.133821f, -0.134201f,
+ -0.134581f, -0.134961f, -0.135341f, -0.135721f, -0.136101f, -0.136480f, -0.136860f, -0.137240f,
+ -0.137620f, -0.138000f, -0.138380f, -0.138760f, -0.139139f, -0.139519f, -0.139899f, -0.140279f,
+ -0.140658f, -0.141038f, -0.141418f, -0.141797f, -0.142177f, -0.142556f, -0.142936f, -0.143316f,
+ -0.143695f, -0.144075f, -0.144454f, -0.144833f, -0.145213f, -0.145592f, -0.145972f, -0.146351f,
+ -0.146730f, -0.147110f, -0.147489f, -0.147868f, -0.148248f, -0.148627f, -0.149006f, -0.149385f,
+ -0.149765f, -0.150144f, -0.150523f, -0.150902f, -0.151281f, -0.151660f, -0.152039f, -0.152418f,
+ -0.152797f, -0.153176f, -0.153555f, -0.153934f, -0.154313f, -0.154692f, -0.155071f, -0.155450f,
+ -0.155828f, -0.156207f, -0.156586f, -0.156965f, -0.157343f, -0.157722f, -0.158101f, -0.158480f,
+ -0.158858f, -0.159237f, -0.159615f, -0.159994f, -0.160372f, -0.160751f, -0.161129f, -0.161508f,
+ -0.161886f, -0.162265f, -0.162643f, -0.163022f, -0.163400f, -0.163778f, -0.164157f, -0.164535f,
+ -0.164913f, -0.165291f, -0.165670f, -0.166048f, -0.166426f, -0.166804f, -0.167182f, -0.167560f,
+ -0.167938f, -0.168316f, -0.168694f, -0.169072f, -0.169450f, -0.169828f, -0.170206f, -0.170584f,
+ -0.170962f, -0.171340f, -0.171718f, -0.172095f, -0.172473f, -0.172851f, -0.173229f, -0.173606f,
+ -0.173984f, -0.174362f, -0.174739f, -0.175117f, -0.175494f, -0.175872f, -0.176249f, -0.176627f,
+ -0.177004f, -0.177382f, -0.177759f, -0.178136f, -0.178514f, -0.178891f, -0.179268f, -0.179646f,
+ -0.180023f, -0.180400f, -0.180777f, -0.181154f, -0.181532f, -0.181909f, -0.182286f, -0.182663f,
+ -0.183040f, -0.183417f, -0.183794f, -0.184171f, -0.184548f, -0.184925f, -0.185301f, -0.185678f,
+ -0.186055f, -0.186432f, -0.186809f, -0.187185f, -0.187562f, -0.187939f, -0.188315f, -0.188692f,
+ -0.189069f, -0.189445f, -0.189822f, -0.190198f, -0.190575f, -0.190951f, -0.191328f, -0.191704f,
+ -0.192080f, -0.192457f, -0.192833f, -0.193209f, -0.193586f, -0.193962f, -0.194338f, -0.194714f,
+ -0.195090f, -0.195466f, -0.195843f, -0.196219f, -0.196595f, -0.196971f, -0.197347f, -0.197722f,
+ -0.198098f, -0.198474f, -0.198850f, -0.199226f, -0.199602f, -0.199978f, -0.200353f, -0.200729f,
+ -0.201105f, -0.201480f, -0.201856f, -0.202231f, -0.202607f, -0.202983f, -0.203358f, -0.203734f,
+ -0.204109f, -0.204484f, -0.204860f, -0.205235f, -0.205610f, -0.205986f, -0.206361f, -0.206736f,
+ -0.207111f, -0.207487f, -0.207862f, -0.208237f, -0.208612f, -0.208987f, -0.209362f, -0.209737f,
+ -0.210112f, -0.210487f, -0.210862f, -0.211237f, -0.211611f, -0.211986f, -0.212361f, -0.212736f,
+ -0.213110f, -0.213485f, -0.213860f, -0.214234f, -0.214609f, -0.214983f, -0.215358f, -0.215732f,
+ -0.216107f, -0.216481f, -0.216856f, -0.217230f, -0.217604f, -0.217979f, -0.218353f, -0.218727f,
+ -0.219101f, -0.219475f, -0.219850f, -0.220224f, -0.220598f, -0.220972f, -0.221346f, -0.221720f,
+ -0.222094f, -0.222468f, -0.222841f, -0.223215f, -0.223589f, -0.223963f, -0.224337f, -0.224710f,
+ -0.225084f, -0.225458f, -0.225831f, -0.226205f, -0.226578f, -0.226952f, -0.227325f, -0.227699f,
+ -0.228072f, -0.228445f, -0.228819f, -0.229192f, -0.229565f, -0.229939f, -0.230312f, -0.230685f,
+ -0.231058f, -0.231431f, -0.231804f, -0.232177f, -0.232550f, -0.232923f, -0.233296f, -0.233669f,
+ -0.234042f, -0.234415f, -0.234788f, -0.235160f, -0.235533f, -0.235906f, -0.236278f, -0.236651f,
+ -0.237024f, -0.237396f, -0.237769f, -0.238141f, -0.238514f, -0.238886f, -0.239258f, -0.239631f,
+ -0.240003f, -0.240375f, -0.240748f, -0.241120f, -0.241492f, -0.241864f, -0.242236f, -0.242608f,
+ -0.242980f, -0.243352f, -0.243724f, -0.244096f, -0.244468f, -0.244840f, -0.245212f, -0.245583f,
+ -0.245955f, -0.246327f, -0.246698f, -0.247070f, -0.247442f, -0.247813f, -0.248185f, -0.248556f,
+ -0.248928f, -0.249299f, -0.249670f, -0.250042f, -0.250413f, -0.250784f, -0.251155f, -0.251527f,
+ -0.251898f, -0.252269f, -0.252640f, -0.253011f, -0.253382f, -0.253753f, -0.254124f, -0.254495f,
+ -0.254866f, -0.255236f, -0.255607f, -0.255978f, -0.256349f, -0.256719f, -0.257090f, -0.257461f,
+ -0.257831f, -0.258202f, -0.258572f, -0.258943f, -0.259313f, -0.259683f, -0.260054f, -0.260424f,
+ -0.260794f, -0.261164f, -0.261534f, -0.261905f, -0.262275f, -0.262645f, -0.263015f, -0.263385f,
+ -0.263755f, -0.264125f, -0.264494f, -0.264864f, -0.265234f, -0.265604f, -0.265973f, -0.266343f,
+ -0.266713f, -0.267082f, -0.267452f, -0.267821f, -0.268191f, -0.268560f, -0.268930f, -0.269299f,
+ -0.269668f, -0.270038f, -0.270407f, -0.270776f, -0.271145f, -0.271514f, -0.271883f, -0.272252f,
+ -0.272621f, -0.272990f, -0.273359f, -0.273728f, -0.274097f, -0.274466f, -0.274834f, -0.275203f,
+ -0.275572f, -0.275940f, -0.276309f, -0.276678f, -0.277046f, -0.277415f, -0.277783f, -0.278151f,
+ -0.278520f, -0.278888f, -0.279256f, -0.279624f, -0.279993f, -0.280361f, -0.280729f, -0.281097f,
+ -0.281465f, -0.281833f, -0.282201f, -0.282569f, -0.282937f, -0.283304f, -0.283672f, -0.284040f,
+ -0.284408f, -0.284775f, -0.285143f, -0.285510f, -0.285878f, -0.286245f, -0.286613f, -0.286980f,
+ -0.287347f, -0.287715f, -0.288082f, -0.288449f, -0.288816f, -0.289184f, -0.289551f, -0.289918f,
+ -0.290285f, -0.290652f, -0.291019f, -0.291385f, -0.291752f, -0.292119f, -0.292486f, -0.292852f,
+ -0.293219f, -0.293586f, -0.293952f, -0.294319f, -0.294685f, -0.295052f, -0.295418f, -0.295785f,
+ -0.296151f, -0.296517f, -0.296883f, -0.297250f, -0.297616f, -0.297982f, -0.298348f, -0.298714f,
+ -0.299080f, -0.299446f, -0.299812f, -0.300177f, -0.300543f, -0.300909f, -0.301275f, -0.301640f,
+ -0.302006f, -0.302372f, -0.302737f, -0.303103f, -0.303468f, -0.303833f, -0.304199f, -0.304564f,
+ -0.304929f, -0.305294f, -0.305660f, -0.306025f, -0.306390f, -0.306755f, -0.307120f, -0.307485f,
+ -0.307850f, -0.308214f, -0.308579f, -0.308944f, -0.309309f, -0.309673f, -0.310038f, -0.310403f,
+ -0.310767f, -0.311132f, -0.311496f, -0.311860f, -0.312225f, -0.312589f, -0.312953f, -0.313318f,
+ -0.313682f, -0.314046f, -0.314410f, -0.314774f, -0.315138f, -0.315502f, -0.315866f, -0.316230f,
+ -0.316593f, -0.316957f, -0.317321f, -0.317684f, -0.318048f, -0.318412f, -0.318775f, -0.319139f,
+ -0.319502f, -0.319865f, -0.320229f, -0.320592f, -0.320955f, -0.321318f, -0.321682f, -0.322045f,
+ -0.322408f, -0.322771f, -0.323134f, -0.323497f, -0.323859f, -0.324222f, -0.324585f, -0.324948f,
+ -0.325310f, -0.325673f, -0.326035f, -0.326398f, -0.326760f, -0.327123f, -0.327485f, -0.327848f,
+ -0.328210f, -0.328572f, -0.328934f, -0.329296f, -0.329658f, -0.330020f, -0.330382f, -0.330744f,
+ -0.331106f, -0.331468f, -0.331830f, -0.332192f, -0.332553f, -0.332915f, -0.333277f, -0.333638f,
+ -0.334000f, -0.334361f, -0.334722f, -0.335084f, -0.335445f, -0.335806f, -0.336168f, -0.336529f,
+ -0.336890f, -0.337251f, -0.337612f, -0.337973f, -0.338334f, -0.338695f, -0.339055f, -0.339416f,
+ -0.339777f, -0.340138f, -0.340498f, -0.340859f, -0.341219f, -0.341580f, -0.341940f, -0.342300f,
+ -0.342661f, -0.343021f, -0.343381f, -0.343741f, -0.344101f, -0.344461f, -0.344821f, -0.345181f,
+ -0.345541f, -0.345901f, -0.346261f, -0.346621f, -0.346980f, -0.347340f, -0.347700f, -0.348059f,
+ -0.348419f, -0.348778f, -0.349138f, -0.349497f, -0.349856f, -0.350215f, -0.350575f, -0.350934f,
+ -0.351293f, -0.351652f, -0.352011f, -0.352370f, -0.352729f, -0.353087f, -0.353446f, -0.353805f,
+ -0.354164f, -0.354522f, -0.354881f, -0.355239f, -0.355598f, -0.355956f, -0.356314f, -0.356673f,
+ -0.357031f, -0.357389f, -0.357747f, -0.358105f, -0.358463f, -0.358821f, -0.359179f, -0.359537f,
+ -0.359895f, -0.360253f, -0.360611f, -0.360968f, -0.361326f, -0.361683f, -0.362041f, -0.362398f,
+ -0.362756f, -0.363113f, -0.363470f, -0.363828f, -0.364185f, -0.364542f, -0.364899f, -0.365256f,
+ -0.365613f, -0.365970f, -0.366327f, -0.366684f, -0.367040f, -0.367397f, -0.367754f, -0.368110f,
+ -0.368467f, -0.368823f, -0.369180f, -0.369536f, -0.369892f, -0.370249f, -0.370605f, -0.370961f,
+ -0.371317f, -0.371673f, -0.372029f, -0.372385f, -0.372741f, -0.373097f, -0.373453f, -0.373808f,
+ -0.374164f, -0.374520f, -0.374875f, -0.375231f, -0.375586f, -0.375942f, -0.376297f, -0.376652f,
+ -0.377007f, -0.377363f, -0.377718f, -0.378073f, -0.378428f, -0.378783f, -0.379138f, -0.379492f,
+ -0.379847f, -0.380202f, -0.380557f, -0.380911f, -0.381266f, -0.381620f, -0.381975f, -0.382329f,
+ -0.382683f, -0.383038f, -0.383392f, -0.383746f, -0.384100f, -0.384454f, -0.384808f, -0.385162f,
+ -0.385516f, -0.385870f, -0.386224f, -0.386577f, -0.386931f, -0.387285f, -0.387638f, -0.387992f,
+ -0.388345f, -0.388698f, -0.389052f, -0.389405f, -0.389758f, -0.390111f, -0.390464f, -0.390817f,
+ -0.391170f, -0.391523f, -0.391876f, -0.392229f, -0.392582f, -0.392934f, -0.393287f, -0.393640f,
+ -0.393992f, -0.394344f, -0.394697f, -0.395049f, -0.395401f, -0.395754f, -0.396106f, -0.396458f,
+ -0.396810f, -0.397162f, -0.397514f, -0.397866f, -0.398218f, -0.398569f, -0.398921f, -0.399273f,
+ -0.399624f, -0.399976f, -0.400327f, -0.400679f, -0.401030f, -0.401381f, -0.401732f, -0.402084f,
+ -0.402435f, -0.402786f, -0.403137f, -0.403488f, -0.403838f, -0.404189f, -0.404540f, -0.404891f,
+ -0.405241f, -0.405592f, -0.405942f, -0.406293f, -0.406643f, -0.406994f, -0.407344f, -0.407694f,
+ -0.408044f, -0.408394f, -0.408744f, -0.409094f, -0.409444f, -0.409794f, -0.410144f, -0.410493f,
+ -0.410843f, -0.411193f, -0.411542f, -0.411892f, -0.412241f, -0.412591f, -0.412940f, -0.413289f,
+ -0.413638f, -0.413987f, -0.414337f, -0.414685f, -0.415034f, -0.415383f, -0.415732f, -0.416081f,
+ -0.416430f, -0.416778f, -0.417127f, -0.417475f, -0.417824f, -0.418172f, -0.418520f, -0.418869f,
+ -0.419217f, -0.419565f, -0.419913f, -0.420261f, -0.420609f, -0.420957f, -0.421305f, -0.421653f,
+ -0.422000f, -0.422348f, -0.422695f, -0.423043f, -0.423390f, -0.423738f, -0.424085f, -0.424432f,
+ -0.424780f, -0.425127f, -0.425474f, -0.425821f, -0.426168f, -0.426515f, -0.426862f, -0.427208f,
+ -0.427555f, -0.427902f, -0.428248f, -0.428595f, -0.428941f, -0.429288f, -0.429634f, -0.429980f,
+ -0.430326f, -0.430673f, -0.431019f, -0.431365f, -0.431711f, -0.432057f, -0.432402f, -0.432748f,
+ -0.433094f, -0.433439f, -0.433785f, -0.434131f, -0.434476f, -0.434821f, -0.435167f, -0.435512f,
+ -0.435857f, -0.436202f, -0.436547f, -0.436892f, -0.437237f, -0.437582f, -0.437927f, -0.438272f,
+ -0.438616f, -0.438961f, -0.439305f, -0.439650f, -0.439994f, -0.440339f, -0.440683f, -0.441027f,
+ -0.441371f, -0.441715f, -0.442059f, -0.442403f, -0.442747f, -0.443091f, -0.443435f, -0.443779f,
+ -0.444122f, -0.444466f, -0.444809f, -0.445153f, -0.445496f, -0.445839f, -0.446183f, -0.446526f,
+ -0.446869f, -0.447212f, -0.447555f, -0.447898f, -0.448241f, -0.448583f, -0.448926f, -0.449269f,
+ -0.449611f, -0.449954f, -0.450296f, -0.450639f, -0.450981f, -0.451323f, -0.451665f, -0.452008f,
+ -0.452350f, -0.452692f, -0.453033f, -0.453375f, -0.453717f, -0.454059f, -0.454400f, -0.454742f,
+ -0.455084f, -0.455425f, -0.455766f, -0.456108f, -0.456449f, -0.456790f, -0.457131f, -0.457472f,
+ -0.457813f, -0.458154f, -0.458495f, -0.458836f, -0.459177f, -0.459517f, -0.459858f, -0.460198f,
+ -0.460539f, -0.460879f, -0.461219f, -0.461560f, -0.461900f, -0.462240f, -0.462580f, -0.462920f,
+ -0.463260f, -0.463600f, -0.463939f, -0.464279f, -0.464619f, -0.464958f, -0.465298f, -0.465637f,
+ -0.465977f, -0.466316f, -0.466655f, -0.466994f, -0.467333f, -0.467672f, -0.468011f, -0.468350f,
+ -0.468689f, -0.469028f, -0.469366f, -0.469705f, -0.470043f, -0.470382f, -0.470720f, -0.471058f,
+ -0.471397f, -0.471735f, -0.472073f, -0.472411f, -0.472749f, -0.473087f, -0.473425f, -0.473763f,
+ -0.474100f, -0.474438f, -0.474775f, -0.475113f, -0.475450f, -0.475788f, -0.476125f, -0.476462f,
+ -0.476799f, -0.477136f, -0.477473f, -0.477810f, -0.478147f, -0.478484f, -0.478821f, -0.479157f,
+ -0.479494f, -0.479830f, -0.480167f, -0.480503f, -0.480839f, -0.481176f, -0.481512f, -0.481848f,
+ -0.482184f, -0.482520f, -0.482856f, -0.483191f, -0.483527f, -0.483863f, -0.484198f, -0.484534f,
+ -0.484869f, -0.485205f, -0.485540f, -0.485875f, -0.486210f, -0.486545f, -0.486880f, -0.487215f,
+ -0.487550f, -0.487885f, -0.488220f, -0.488554f, -0.488889f, -0.489223f, -0.489558f, -0.489892f,
+ -0.490226f, -0.490561f, -0.490895f, -0.491229f, -0.491563f, -0.491897f, -0.492231f, -0.492564f,
+ -0.492898f, -0.493232f, -0.493565f, -0.493899f, -0.494232f, -0.494566f, -0.494899f, -0.495232f,
+ -0.495565f, -0.495898f, -0.496231f, -0.496564f, -0.496897f, -0.497230f, -0.497562f, -0.497895f,
+ -0.498228f, -0.498560f, -0.498893f, -0.499225f, -0.499557f, -0.499889f, -0.500221f, -0.500553f,
+ -0.500885f, -0.501217f, -0.501549f, -0.501881f, -0.502212f, -0.502544f, -0.502876f, -0.503207f,
+ -0.503538f, -0.503870f, -0.504201f, -0.504532f, -0.504863f, -0.505194f, -0.505525f, -0.505856f,
+ -0.506187f, -0.506517f, -0.506848f, -0.507179f, -0.507509f, -0.507839f, -0.508170f, -0.508500f,
+ -0.508830f, -0.509160f, -0.509490f, -0.509820f, -0.510150f, -0.510480f, -0.510810f, -0.511139f,
+ -0.511469f, -0.511798f, -0.512128f, -0.512457f, -0.512786f, -0.513116f, -0.513445f, -0.513774f,
+ -0.514103f, -0.514432f, -0.514760f, -0.515089f, -0.515418f, -0.515746f, -0.516075f, -0.516403f,
+ -0.516732f, -0.517060f, -0.517388f, -0.517716f, -0.518045f, -0.518372f, -0.518700f, -0.519028f,
+ -0.519356f, -0.519684f, -0.520011f, -0.520339f, -0.520666f, -0.520994f, -0.521321f, -0.521648f,
+ -0.521975f, -0.522302f, -0.522629f, -0.522956f, -0.523283f, -0.523610f, -0.523937f, -0.524263f,
+ -0.524590f, -0.524916f, -0.525243f, -0.525569f, -0.525895f, -0.526221f, -0.526547f, -0.526873f,
+ -0.527199f, -0.527525f, -0.527851f, -0.528176f, -0.528502f, -0.528828f, -0.529153f, -0.529478f,
+ -0.529804f, -0.530129f, -0.530454f, -0.530779f, -0.531104f, -0.531429f, -0.531754f, -0.532078f,
+ -0.532403f, -0.532728f, -0.533052f, -0.533377f, -0.533701f, -0.534025f, -0.534349f, -0.534674f,
+ -0.534998f, -0.535322f, -0.535645f, -0.535969f, -0.536293f, -0.536617f, -0.536940f, -0.537264f,
+ -0.537587f, -0.537910f, -0.538234f, -0.538557f, -0.538880f, -0.539203f, -0.539526f, -0.539849f,
+ -0.540171f, -0.540494f, -0.540817f, -0.541139f, -0.541462f, -0.541784f, -0.542106f, -0.542429f,
+ -0.542751f, -0.543073f, -0.543395f, -0.543717f, -0.544039f, -0.544360f, -0.544682f, -0.545003f,
+ -0.545325f, -0.545646f, -0.545968f, -0.546289f, -0.546610f, -0.546931f, -0.547252f, -0.547573f,
+ -0.547894f, -0.548215f, -0.548536f, -0.548856f, -0.549177f, -0.549497f, -0.549818f, -0.550138f,
+ -0.550458f, -0.550778f, -0.551098f, -0.551418f, -0.551738f, -0.552058f, -0.552378f, -0.552697f,
+ -0.553017f, -0.553336f, -0.553656f, -0.553975f, -0.554294f, -0.554613f, -0.554932f, -0.555251f,
+ -0.555570f, -0.555889f, -0.556208f, -0.556526f, -0.556845f, -0.557164f, -0.557482f, -0.557800f,
+ -0.558119f, -0.558437f, -0.558755f, -0.559073f, -0.559391f, -0.559709f, -0.560026f, -0.560344f,
+ -0.560662f, -0.560979f, -0.561297f, -0.561614f, -0.561931f, -0.562248f, -0.562565f, -0.562882f,
+ -0.563199f, -0.563516f, -0.563833f, -0.564150f, -0.564466f, -0.564783f, -0.565099f, -0.565416f,
+ -0.565732f, -0.566048f, -0.566364f, -0.566680f, -0.566996f, -0.567312f, -0.567628f, -0.567943f,
+ -0.568259f, -0.568574f, -0.568890f, -0.569205f, -0.569521f, -0.569836f, -0.570151f, -0.570466f,
+ -0.570781f, -0.571096f, -0.571410f, -0.571725f, -0.572040f, -0.572354f, -0.572669f, -0.572983f,
+ -0.573297f, -0.573611f, -0.573925f, -0.574239f, -0.574553f, -0.574867f, -0.575181f, -0.575495f,
+ -0.575808f, -0.576122f, -0.576435f, -0.576748f, -0.577062f, -0.577375f, -0.577688f, -0.578001f,
+ -0.578314f, -0.578627f, -0.578939f, -0.579252f, -0.579565f, -0.579877f, -0.580189f, -0.580502f,
+ -0.580814f, -0.581126f, -0.581438f, -0.581750f, -0.582062f, -0.582374f, -0.582685f, -0.582997f,
+ -0.583309f, -0.583620f, -0.583931f, -0.584243f, -0.584554f, -0.584865f, -0.585176f, -0.585487f,
+ -0.585798f, -0.586109f, -0.586419f, -0.586730f, -0.587040f, -0.587351f, -0.587661f, -0.587971f,
+ -0.588282f, -0.588592f, -0.588902f, -0.589212f, -0.589521f, -0.589831f, -0.590141f, -0.590450f,
+ -0.590760f, -0.591069f, -0.591378f, -0.591688f, -0.591997f, -0.592306f, -0.592615f, -0.592924f,
+ -0.593232f, -0.593541f, -0.593850f, -0.594158f, -0.594467f, -0.594775f, -0.595083f, -0.595391f,
+ -0.595699f, -0.596007f, -0.596315f, -0.596623f, -0.596931f, -0.597238f, -0.597546f, -0.597853f,
+ -0.598161f, -0.598468f, -0.598775f, -0.599082f, -0.599389f, -0.599696f, -0.600003f, -0.600310f,
+ -0.600616f, -0.600923f, -0.601230f, -0.601536f, -0.601842f, -0.602148f, -0.602455f, -0.602761f,
+ -0.603067f, -0.603372f, -0.603678f, -0.603984f, -0.604290f, -0.604595f, -0.604900f, -0.605206f,
+ -0.605511f, -0.605816f, -0.606121f, -0.606426f, -0.606731f, -0.607036f, -0.607341f, -0.607645f,
+ -0.607950f, -0.608254f, -0.608559f, -0.608863f, -0.609167f, -0.609471f, -0.609775f, -0.610079f,
+ -0.610383f, -0.610687f, -0.610990f, -0.611294f, -0.611597f, -0.611901f, -0.612204f, -0.612507f,
+ -0.612810f, -0.613113f, -0.613416f, -0.613719f, -0.614022f, -0.614324f, -0.614627f, -0.614929f,
+ -0.615232f, -0.615534f, -0.615836f, -0.616138f, -0.616440f, -0.616742f, -0.617044f, -0.617346f,
+ -0.617647f, -0.617949f, -0.618250f, -0.618552f, -0.618853f, -0.619154f, -0.619455f, -0.619756f,
+ -0.620057f, -0.620358f, -0.620659f, -0.620959f, -0.621260f, -0.621560f, -0.621861f, -0.622161f,
+ -0.622461f, -0.622761f, -0.623061f, -0.623361f, -0.623661f, -0.623961f, -0.624260f, -0.624560f,
+ -0.624860f, -0.625159f, -0.625458f, -0.625757f, -0.626056f, -0.626355f, -0.626654f, -0.626953f,
+ -0.627252f, -0.627550f, -0.627849f, -0.628147f, -0.628446f, -0.628744f, -0.629042f, -0.629340f,
+ -0.629638f, -0.629936f, -0.630234f, -0.630532f, -0.630829f, -0.631127f, -0.631424f, -0.631721f,
+ -0.632019f, -0.632316f, -0.632613f, -0.632910f, -0.633207f, -0.633504f, -0.633800f, -0.634097f,
+ -0.634393f, -0.634690f, -0.634986f, -0.635282f, -0.635578f, -0.635874f, -0.636170f, -0.636466f,
+ -0.636762f, -0.637057f, -0.637353f, -0.637649f, -0.637944f, -0.638239f, -0.638534f, -0.638829f,
+ -0.639124f, -0.639419f, -0.639714f, -0.640009f, -0.640303f, -0.640598f, -0.640892f, -0.641187f,
+ -0.641481f, -0.641775f, -0.642069f, -0.642363f, -0.642657f, -0.642951f, -0.643245f, -0.643538f,
+ -0.643832f, -0.644125f, -0.644418f, -0.644711f, -0.645005f, -0.645298f, -0.645590f, -0.645883f,
+ -0.646176f, -0.646469f, -0.646761f, -0.647054f, -0.647346f, -0.647638f, -0.647930f, -0.648222f,
+ -0.648514f, -0.648806f, -0.649098f, -0.649390f, -0.649681f, -0.649973f, -0.650264f, -0.650555f,
+ -0.650847f, -0.651138f, -0.651429f, -0.651720f, -0.652011f, -0.652301f, -0.652592f, -0.652882f,
+ -0.653173f, -0.653463f, -0.653753f, -0.654044f, -0.654334f, -0.654624f, -0.654913f, -0.655203f,
+ -0.655493f, -0.655782f, -0.656072f, -0.656361f, -0.656651f, -0.656940f, -0.657229f, -0.657518f,
+ -0.657807f, -0.658095f, -0.658384f, -0.658673f, -0.658961f, -0.659250f, -0.659538f, -0.659826f,
+ -0.660114f, -0.660402f, -0.660690f, -0.660978f, -0.661266f, -0.661553f, -0.661841f, -0.662128f,
+ -0.662416f, -0.662703f, -0.662990f, -0.663277f, -0.663564f, -0.663851f, -0.664138f, -0.664424f,
+ -0.664711f, -0.664997f, -0.665284f, -0.665570f, -0.665856f, -0.666142f, -0.666428f, -0.666714f,
+ -0.667000f, -0.667286f, -0.667571f, -0.667857f, -0.668142f, -0.668427f, -0.668712f, -0.668998f,
+ -0.669283f, -0.669567f, -0.669852f, -0.670137f, -0.670422f, -0.670706f, -0.670990f, -0.671275f,
+ -0.671559f, -0.671843f, -0.672127f, -0.672411f, -0.672695f, -0.672978f, -0.673262f, -0.673546f,
+ -0.673829f, -0.674112f, -0.674396f, -0.674679f, -0.674962f, -0.675245f, -0.675527f, -0.675810f,
+ -0.676093f, -0.676375f, -0.676658f, -0.676940f, -0.677222f, -0.677504f, -0.677786f, -0.678068f,
+ -0.678350f, -0.678632f, -0.678913f, -0.679195f, -0.679476f, -0.679758f, -0.680039f, -0.680320f,
+ -0.680601f, -0.680882f, -0.681163f, -0.681443f, -0.681724f, -0.682005f, -0.682285f, -0.682565f,
+ -0.682846f, -0.683126f, -0.683406f, -0.683686f, -0.683965f, -0.684245f, -0.684525f, -0.684804f,
+ -0.685084f, -0.685363f, -0.685642f, -0.685921f, -0.686200f, -0.686479f, -0.686758f, -0.687037f,
+ -0.687315f, -0.687594f, -0.687872f, -0.688151f, -0.688429f, -0.688707f, -0.688985f, -0.689263f,
+ -0.689541f, -0.689818f, -0.690096f, -0.690373f, -0.690651f, -0.690928f, -0.691205f, -0.691482f,
+ -0.691759f, -0.692036f, -0.692313f, -0.692590f, -0.692866f, -0.693143f, -0.693419f, -0.693695f,
+ -0.693971f, -0.694248f, -0.694524f, -0.694799f, -0.695075f, -0.695351f, -0.695626f, -0.695902f,
+ -0.696177f, -0.696452f, -0.696728f, -0.697003f, -0.697277f, -0.697552f, -0.697827f, -0.698102f,
+ -0.698376f, -0.698651f, -0.698925f, -0.699199f, -0.699473f, -0.699747f, -0.700021f, -0.700295f,
+ -0.700569f, -0.700842f, -0.701116f, -0.701389f, -0.701663f, -0.701936f, -0.702209f, -0.702482f,
+ -0.702755f, -0.703028f, -0.703300f, -0.703573f, -0.703845f, -0.704118f, -0.704390f, -0.704662f,
+ -0.704934f, -0.705206f, -0.705478f, -0.705750f, -0.706021f, -0.706293f, -0.706564f, -0.706836f,
+ -0.707107f, -0.707378f, -0.707649f, -0.707920f, -0.708191f, -0.708461f, -0.708732f, -0.709002f,
+ -0.709273f, -0.709543f, -0.709813f, -0.710083f, -0.710353f, -0.710623f, -0.710893f, -0.711163f,
+ -0.711432f, -0.711702f, -0.711971f, -0.712240f, -0.712509f, -0.712778f, -0.713047f, -0.713316f,
+ -0.713585f, -0.713853f, -0.714122f, -0.714390f, -0.714659f, -0.714927f, -0.715195f, -0.715463f,
+ -0.715731f, -0.715999f, -0.716266f, -0.716534f, -0.716801f, -0.717069f, -0.717336f, -0.717603f,
+ -0.717870f, -0.718137f, -0.718404f, -0.718670f, -0.718937f, -0.719204f, -0.719470f, -0.719736f,
+ -0.720003f, -0.720269f, -0.720535f, -0.720800f, -0.721066f, -0.721332f, -0.721597f, -0.721863f,
+ -0.722128f, -0.722393f, -0.722659f, -0.722924f, -0.723188f, -0.723453f, -0.723718f, -0.723983f,
+ -0.724247f, -0.724511f, -0.724776f, -0.725040f, -0.725304f, -0.725568f, -0.725832f, -0.726095f,
+ -0.726359f, -0.726623f, -0.726886f, -0.727149f, -0.727413f, -0.727676f, -0.727939f, -0.728202f,
+ -0.728464f, -0.728727f, -0.728990f, -0.729252f, -0.729514f, -0.729777f, -0.730039f, -0.730301f,
+ -0.730563f, -0.730825f, -0.731086f, -0.731348f, -0.731609f, -0.731871f, -0.732132f, -0.732393f,
+ -0.732654f, -0.732915f, -0.733176f, -0.733437f, -0.733697f, -0.733958f, -0.734218f, -0.734479f,
+ -0.734739f, -0.734999f, -0.735259f, -0.735519f, -0.735779f, -0.736038f, -0.736298f, -0.736557f,
+ -0.736817f, -0.737076f, -0.737335f, -0.737594f, -0.737853f, -0.738112f, -0.738370f, -0.738629f,
+ -0.738887f, -0.739146f, -0.739404f, -0.739662f, -0.739920f, -0.740178f, -0.740436f, -0.740694f,
+ -0.740951f, -0.741209f, -0.741466f, -0.741723f, -0.741980f, -0.742237f, -0.742494f, -0.742751f,
+ -0.743008f, -0.743265f, -0.743521f, -0.743777f, -0.744034f, -0.744290f, -0.744546f, -0.744802f,
+ -0.745058f, -0.745314f, -0.745569f, -0.745825f, -0.746080f, -0.746335f, -0.746591f, -0.746846f,
+ -0.747101f, -0.747355f, -0.747610f, -0.747865f, -0.748119f, -0.748374f, -0.748628f, -0.748882f,
+ -0.749136f, -0.749390f, -0.749644f, -0.749898f, -0.750152f, -0.750405f, -0.750659f, -0.750912f,
+ -0.751165f, -0.751418f, -0.751671f, -0.751924f, -0.752177f, -0.752429f, -0.752682f, -0.752934f,
+ -0.753187f, -0.753439f, -0.753691f, -0.753943f, -0.754195f, -0.754447f, -0.754698f, -0.754950f,
+ -0.755201f, -0.755453f, -0.755704f, -0.755955f, -0.756206f, -0.756457f, -0.756708f, -0.756958f,
+ -0.757209f, -0.757459f, -0.757710f, -0.757960f, -0.758210f, -0.758460f, -0.758710f, -0.758960f,
+ -0.759209f, -0.759459f, -0.759708f, -0.759957f, -0.760207f, -0.760456f, -0.760705f, -0.760954f,
+ -0.761202f, -0.761451f, -0.761700f, -0.761948f, -0.762196f, -0.762444f, -0.762693f, -0.762941f,
+ -0.763188f, -0.763436f, -0.763684f, -0.763931f, -0.764179f, -0.764426f, -0.764673f, -0.764920f,
+ -0.765167f, -0.765414f, -0.765661f, -0.765907f, -0.766154f, -0.766400f, -0.766647f, -0.766893f,
+ -0.767139f, -0.767385f, -0.767631f, -0.767876f, -0.768122f, -0.768368f, -0.768613f, -0.768858f,
+ -0.769103f, -0.769348f, -0.769593f, -0.769838f, -0.770083f, -0.770327f, -0.770572f, -0.770816f,
+ -0.771061f, -0.771305f, -0.771549f, -0.771793f, -0.772036f, -0.772280f, -0.772524f, -0.772767f,
+ -0.773010f, -0.773254f, -0.773497f, -0.773740f, -0.773983f, -0.774225f, -0.774468f, -0.774711f,
+ -0.774953f, -0.775195f, -0.775438f, -0.775680f, -0.775922f, -0.776164f, -0.776405f, -0.776647f,
+ -0.776888f, -0.777130f, -0.777371f, -0.777612f, -0.777853f, -0.778094f, -0.778335f, -0.778576f,
+ -0.778817f, -0.779057f, -0.779297f, -0.779538f, -0.779778f, -0.780018f, -0.780258f, -0.780498f,
+ -0.780737f, -0.780977f, -0.781216f, -0.781456f, -0.781695f, -0.781934f, -0.782173f, -0.782412f,
+ -0.782651f, -0.782889f, -0.783128f, -0.783366f, -0.783605f, -0.783843f, -0.784081f, -0.784319f,
+ -0.784557f, -0.784794f, -0.785032f, -0.785269f, -0.785507f, -0.785744f, -0.785981f, -0.786218f,
+ -0.786455f, -0.786692f, -0.786929f, -0.787165f, -0.787402f, -0.787638f, -0.787874f, -0.788110f,
+ -0.788346f, -0.788582f, -0.788818f, -0.789054f, -0.789289f, -0.789525f, -0.789760f, -0.789995f,
+ -0.790230f, -0.790465f, -0.790700f, -0.790935f, -0.791169f, -0.791404f, -0.791638f, -0.791872f,
+ -0.792107f, -0.792341f, -0.792575f, -0.792808f, -0.793042f, -0.793276f, -0.793509f, -0.793742f,
+ -0.793975f, -0.794209f, -0.794442f, -0.794674f, -0.794907f, -0.795140f, -0.795372f, -0.795605f,
+ -0.795837f, -0.796069f, -0.796301f, -0.796533f, -0.796765f, -0.796996f, -0.797228f, -0.797459f,
+ -0.797691f, -0.797922f, -0.798153f, -0.798384f, -0.798615f, -0.798846f, -0.799076f, -0.799307f,
+ -0.799537f, -0.799768f, -0.799998f, -0.800228f, -0.800458f, -0.800687f, -0.800917f, -0.801147f,
+ -0.801376f, -0.801606f, -0.801835f, -0.802064f, -0.802293f, -0.802522f, -0.802750f, -0.802979f,
+ -0.803208f, -0.803436f, -0.803664f, -0.803892f, -0.804120f, -0.804348f, -0.804576f, -0.804804f,
+ -0.805031f, -0.805259f, -0.805486f, -0.805713f, -0.805940f, -0.806167f, -0.806394f, -0.806621f,
+ -0.806848f, -0.807074f, -0.807300f, -0.807527f, -0.807753f, -0.807979f, -0.808205f, -0.808430f,
+ -0.808656f, -0.808882f, -0.809107f, -0.809332f, -0.809558f, -0.809783f, -0.810008f, -0.810232f,
+ -0.810457f, -0.810682f, -0.810906f, -0.811131f, -0.811355f, -0.811579f, -0.811803f, -0.812027f,
+ -0.812251f, -0.812474f, -0.812698f, -0.812921f, -0.813144f, -0.813368f, -0.813591f, -0.813814f,
+ -0.814036f, -0.814259f, -0.814482f, -0.814704f, -0.814926f, -0.815149f, -0.815371f, -0.815593f,
+ -0.815814f, -0.816036f, -0.816258f, -0.816479f, -0.816701f, -0.816922f, -0.817143f, -0.817364f,
+ -0.817585f, -0.817806f, -0.818026f, -0.818247f, -0.818467f, -0.818687f, -0.818908f, -0.819128f,
+ -0.819348f, -0.819567f, -0.819787f, -0.820007f, -0.820226f, -0.820445f, -0.820664f, -0.820884f,
+ -0.821102f, -0.821321f, -0.821540f, -0.821759f, -0.821977f, -0.822195f, -0.822414f, -0.822632f,
+ -0.822850f, -0.823068f, -0.823285f, -0.823503f, -0.823721f, -0.823938f, -0.824155f, -0.824372f,
+ -0.824589f, -0.824806f, -0.825023f, -0.825240f, -0.825456f, -0.825673f, -0.825889f, -0.826105f,
+ -0.826321f, -0.826537f, -0.826753f, -0.826968f, -0.827184f, -0.827399f, -0.827615f, -0.827830f,
+ -0.828045f, -0.828260f, -0.828475f, -0.828690f, -0.828904f, -0.829119f, -0.829333f, -0.829547f,
+ -0.829761f, -0.829975f, -0.830189f, -0.830403f, -0.830616f, -0.830830f, -0.831043f, -0.831257f,
+ -0.831470f, -0.831683f, -0.831895f, -0.832108f, -0.832321f, -0.832533f, -0.832746f, -0.832958f,
+ -0.833170f, -0.833382f, -0.833594f, -0.833806f, -0.834018f, -0.834229f, -0.834440f, -0.834652f,
+ -0.834863f, -0.835074f, -0.835285f, -0.835496f, -0.835706f, -0.835917f, -0.836127f, -0.836338f,
+ -0.836548f, -0.836758f, -0.836968f, -0.837178f, -0.837387f, -0.837597f, -0.837806f, -0.838015f,
+ -0.838225f, -0.838434f, -0.838643f, -0.838852f, -0.839060f, -0.839269f, -0.839477f, -0.839686f,
+ -0.839894f, -0.840102f, -0.840310f, -0.840518f, -0.840725f, -0.840933f, -0.841140f, -0.841348f,
+ -0.841555f, -0.841762f, -0.841969f, -0.842176f, -0.842383f, -0.842589f, -0.842796f, -0.843002f,
+ -0.843208f, -0.843414f, -0.843620f, -0.843826f, -0.844032f, -0.844238f, -0.844443f, -0.844648f,
+ -0.844854f, -0.845059f, -0.845264f, -0.845469f, -0.845673f, -0.845878f, -0.846082f, -0.846287f,
+ -0.846491f, -0.846695f, -0.846899f, -0.847103f, -0.847307f, -0.847510f, -0.847714f, -0.847917f,
+ -0.848120f, -0.848323f, -0.848526f, -0.848729f, -0.848932f, -0.849135f, -0.849337f, -0.849540f,
+ -0.849742f, -0.849944f, -0.850146f, -0.850348f, -0.850549f, -0.850751f, -0.850953f, -0.851154f,
+ -0.851355f, -0.851556f, -0.851757f, -0.851958f, -0.852159f, -0.852360f, -0.852560f, -0.852760f,
+ -0.852961f, -0.853161f, -0.853361f, -0.853561f, -0.853760f, -0.853960f, -0.854159f, -0.854359f,
+ -0.854558f, -0.854757f, -0.854956f, -0.855155f, -0.855354f, -0.855552f, -0.855751f, -0.855949f,
+ -0.856147f, -0.856345f, -0.856543f, -0.856741f, -0.856939f, -0.857137f, -0.857334f, -0.857531f,
+ -0.857729f, -0.857926f, -0.858123f, -0.858320f, -0.858516f, -0.858713f, -0.858909f, -0.859106f,
+ -0.859302f, -0.859498f, -0.859694f, -0.859890f, -0.860085f, -0.860281f, -0.860476f, -0.860672f,
+ -0.860867f, -0.861062f, -0.861257f, -0.861452f, -0.861646f, -0.861841f, -0.862035f, -0.862230f,
+ -0.862424f, -0.862618f, -0.862812f, -0.863006f, -0.863199f, -0.863393f, -0.863586f, -0.863780f,
+ -0.863973f, -0.864166f, -0.864359f, -0.864552f, -0.864744f, -0.864937f, -0.865129f, -0.865321f,
+ -0.865514f, -0.865706f, -0.865898f, -0.866089f, -0.866281f, -0.866472f, -0.866664f, -0.866855f,
+ -0.867046f, -0.867237f, -0.867428f, -0.867619f, -0.867809f, -0.868000f, -0.868190f, -0.868381f,
+ -0.868571f, -0.868761f, -0.868951f, -0.869140f, -0.869330f, -0.869519f, -0.869709f, -0.869898f,
+ -0.870087f, -0.870276f, -0.870465f, -0.870654f, -0.870842f, -0.871031f, -0.871219f, -0.871407f,
+ -0.871595f, -0.871783f, -0.871971f, -0.872159f, -0.872346f, -0.872534f, -0.872721f, -0.872908f,
+ -0.873095f, -0.873282f, -0.873469f, -0.873655f, -0.873842f, -0.874028f, -0.874215f, -0.874401f,
+ -0.874587f, -0.874773f, -0.874958f, -0.875144f, -0.875329f, -0.875515f, -0.875700f, -0.875885f,
+ -0.876070f, -0.876255f, -0.876440f, -0.876624f, -0.876809f, -0.876993f, -0.877177f, -0.877361f,
+ -0.877545f, -0.877729f, -0.877913f, -0.878096f, -0.878280f, -0.878463f, -0.878646f, -0.878829f,
+ -0.879012f, -0.879195f, -0.879378f, -0.879560f, -0.879743f, -0.879925f, -0.880107f, -0.880289f,
+ -0.880471f, -0.880653f, -0.880834f, -0.881016f, -0.881197f, -0.881378f, -0.881559f, -0.881740f,
+ -0.881921f, -0.882102f, -0.882283f, -0.882463f, -0.882643f, -0.882824f, -0.883004f, -0.883184f,
+ -0.883363f, -0.883543f, -0.883723f, -0.883902f, -0.884081f, -0.884260f, -0.884439f, -0.884618f,
+ -0.884797f, -0.884976f, -0.885154f, -0.885333f, -0.885511f, -0.885689f, -0.885867f, -0.886045f,
+ -0.886223f, -0.886400f, -0.886578f, -0.886755f, -0.886932f, -0.887109f, -0.887286f, -0.887463f,
+ -0.887640f, -0.887816f, -0.887993f, -0.888169f, -0.888345f, -0.888521f, -0.888697f, -0.888873f,
+ -0.889048f, -0.889224f, -0.889399f, -0.889574f, -0.889750f, -0.889925f, -0.890099f, -0.890274f,
+ -0.890449f, -0.890623f, -0.890797f, -0.890972f, -0.891146f, -0.891320f, -0.891493f, -0.891667f,
+ -0.891841f, -0.892014f, -0.892187f, -0.892361f, -0.892534f, -0.892706f, -0.892879f, -0.893052f,
+ -0.893224f, -0.893397f, -0.893569f, -0.893741f, -0.893913f, -0.894085f, -0.894256f, -0.894428f,
+ -0.894599f, -0.894771f, -0.894942f, -0.895113f, -0.895284f, -0.895455f, -0.895625f, -0.895796f,
+ -0.895966f, -0.896137f, -0.896307f, -0.896477f, -0.896646f, -0.896816f, -0.896986f, -0.897155f,
+ -0.897325f, -0.897494f, -0.897663f, -0.897832f, -0.898001f, -0.898169f, -0.898338f, -0.898506f,
+ -0.898674f, -0.898843f, -0.899011f, -0.899179f, -0.899346f, -0.899514f, -0.899681f, -0.899849f,
+ -0.900016f, -0.900183f, -0.900350f, -0.900517f, -0.900683f, -0.900850f, -0.901016f, -0.901183f,
+ -0.901349f, -0.901515f, -0.901681f, -0.901847f, -0.902012f, -0.902178f, -0.902343f, -0.902508f,
+ -0.902673f, -0.902838f, -0.903003f, -0.903168f, -0.903332f, -0.903497f, -0.903661f, -0.903825f,
+ -0.903989f, -0.904153f, -0.904317f, -0.904481f, -0.904644f, -0.904807f, -0.904971f, -0.905134f,
+ -0.905297f, -0.905460f, -0.905622f, -0.905785f, -0.905947f, -0.906110f, -0.906272f, -0.906434f,
+ -0.906596f, -0.906757f, -0.906919f, -0.907081f, -0.907242f, -0.907403f, -0.907564f, -0.907725f,
+ -0.907886f, -0.908047f, -0.908207f, -0.908368f, -0.908528f, -0.908688f, -0.908848f, -0.909008f,
+ -0.909168f, -0.909328f, -0.909487f, -0.909646f, -0.909806f, -0.909965f, -0.910124f, -0.910283f,
+ -0.910441f, -0.910600f, -0.910758f, -0.910917f, -0.911075f, -0.911233f, -0.911391f, -0.911548f,
+ -0.911706f, -0.911864f, -0.912021f, -0.912178f, -0.912335f, -0.912492f, -0.912649f, -0.912806f,
+ -0.912962f, -0.913119f, -0.913275f, -0.913431f, -0.913587f, -0.913743f, -0.913899f, -0.914054f,
+ -0.914210f, -0.914365f, -0.914520f, -0.914675f, -0.914830f, -0.914985f, -0.915140f, -0.915294f,
+ -0.915449f, -0.915603f, -0.915757f, -0.915911f, -0.916065f, -0.916219f, -0.916372f, -0.916526f,
+ -0.916679f, -0.916832f, -0.916985f, -0.917138f, -0.917291f, -0.917444f, -0.917596f, -0.917749f,
+ -0.917901f, -0.918053f, -0.918205f, -0.918357f, -0.918508f, -0.918660f, -0.918811f, -0.918963f,
+ -0.919114f, -0.919265f, -0.919416f, -0.919567f, -0.919717f, -0.919868f, -0.920018f, -0.920168f,
+ -0.920318f, -0.920468f, -0.920618f, -0.920768f, -0.920917f, -0.921067f, -0.921216f, -0.921365f,
+ -0.921514f, -0.921663f, -0.921812f, -0.921960f, -0.922109f, -0.922257f, -0.922405f, -0.922553f,
+ -0.922701f, -0.922849f, -0.922997f, -0.923144f, -0.923291f, -0.923439f, -0.923586f, -0.923733f,
+ -0.923880f, -0.924026f, -0.924173f, -0.924319f, -0.924465f, -0.924612f, -0.924758f, -0.924904f,
+ -0.925049f, -0.925195f, -0.925340f, -0.925486f, -0.925631f, -0.925776f, -0.925921f, -0.926066f,
+ -0.926210f, -0.926355f, -0.926499f, -0.926643f, -0.926787f, -0.926931f, -0.927075f, -0.927219f,
+ -0.927363f, -0.927506f, -0.927649f, -0.927792f, -0.927935f, -0.928078f, -0.928221f, -0.928364f,
+ -0.928506f, -0.928648f, -0.928791f, -0.928933f, -0.929075f, -0.929216f, -0.929358f, -0.929500f,
+ -0.929641f, -0.929782f, -0.929923f, -0.930064f, -0.930205f, -0.930346f, -0.930486f, -0.930627f,
+ -0.930767f, -0.930907f, -0.931047f, -0.931187f, -0.931327f, -0.931466f, -0.931606f, -0.931745f,
+ -0.931884f, -0.932023f, -0.932162f, -0.932301f, -0.932440f, -0.932578f, -0.932716f, -0.932855f,
+ -0.932993f, -0.933131f, -0.933269f, -0.933406f, -0.933544f, -0.933681f, -0.933818f, -0.933956f,
+ -0.934093f, -0.934229f, -0.934366f, -0.934503f, -0.934639f, -0.934775f, -0.934912f, -0.935048f,
+ -0.935184f, -0.935319f, -0.935455f, -0.935590f, -0.935726f, -0.935861f, -0.935996f, -0.936131f,
+ -0.936266f, -0.936400f, -0.936535f, -0.936669f, -0.936803f, -0.936938f, -0.937072f, -0.937205f,
+ -0.937339f, -0.937473f, -0.937606f, -0.937739f, -0.937872f, -0.938005f, -0.938138f, -0.938271f,
+ -0.938404f, -0.938536f, -0.938668f, -0.938800f, -0.938932f, -0.939064f, -0.939196f, -0.939328f,
+ -0.939459f, -0.939591f, -0.939722f, -0.939853f, -0.939984f, -0.940115f, -0.940245f, -0.940376f,
+ -0.940506f, -0.940636f, -0.940766f, -0.940896f, -0.941026f, -0.941156f, -0.941285f, -0.941415f,
+ -0.941544f, -0.941673f, -0.941802f, -0.941931f, -0.942060f, -0.942188f, -0.942317f, -0.942445f,
+ -0.942573f, -0.942701f, -0.942829f, -0.942957f, -0.943084f, -0.943212f, -0.943339f, -0.943466f,
+ -0.943593f, -0.943720f, -0.943847f, -0.943974f, -0.944100f, -0.944227f, -0.944353f, -0.944479f,
+ -0.944605f, -0.944731f, -0.944856f, -0.944982f, -0.945107f, -0.945232f, -0.945358f, -0.945482f,
+ -0.945607f, -0.945732f, -0.945857f, -0.945981f, -0.946105f, -0.946229f, -0.946353f, -0.946477f,
+ -0.946601f, -0.946724f, -0.946848f, -0.946971f, -0.947094f, -0.947217f, -0.947340f, -0.947463f,
+ -0.947586f, -0.947708f, -0.947830f, -0.947953f, -0.948075f, -0.948196f, -0.948318f, -0.948440f,
+ -0.948561f, -0.948683f, -0.948804f, -0.948925f, -0.949046f, -0.949167f, -0.949287f, -0.949408f,
+ -0.949528f, -0.949648f, -0.949768f, -0.949888f, -0.950008f, -0.950128f, -0.950247f, -0.950367f,
+ -0.950486f, -0.950605f, -0.950724f, -0.950843f, -0.950962f, -0.951080f, -0.951199f, -0.951317f,
+ -0.951435f, -0.951553f, -0.951671f, -0.951789f, -0.951906f, -0.952024f, -0.952141f, -0.952258f,
+ -0.952375f, -0.952492f, -0.952609f, -0.952725f, -0.952842f, -0.952958f, -0.953074f, -0.953190f,
+ -0.953306f, -0.953422f, -0.953537f, -0.953653f, -0.953768f, -0.953883f, -0.953998f, -0.954113f,
+ -0.954228f, -0.954343f, -0.954457f, -0.954572f, -0.954686f, -0.954800f, -0.954914f, -0.955028f,
+ -0.955141f, -0.955255f, -0.955368f, -0.955481f, -0.955594f, -0.955707f, -0.955820f, -0.955933f,
+ -0.956045f, -0.956158f, -0.956270f, -0.956382f, -0.956494f, -0.956606f, -0.956717f, -0.956829f,
+ -0.956940f, -0.957052f, -0.957163f, -0.957274f, -0.957385f, -0.957495f, -0.957606f, -0.957716f,
+ -0.957826f, -0.957937f, -0.958046f, -0.958156f, -0.958266f, -0.958376f, -0.958485f, -0.958594f,
+ -0.958703f, -0.958812f, -0.958921f, -0.959030f, -0.959139f, -0.959247f, -0.959355f, -0.959463f,
+ -0.959572f, -0.959679f, -0.959787f, -0.959895f, -0.960002f, -0.960109f, -0.960217f, -0.960324f,
+ -0.960431f, -0.960537f, -0.960644f, -0.960750f, -0.960857f, -0.960963f, -0.961069f, -0.961175f,
+ -0.961280f, -0.961386f, -0.961492f, -0.961597f, -0.961702f, -0.961807f, -0.961912f, -0.962017f,
+ -0.962121f, -0.962226f, -0.962330f, -0.962434f, -0.962538f, -0.962642f, -0.962746f, -0.962850f,
+ -0.962953f, -0.963057f, -0.963160f, -0.963263f, -0.963366f, -0.963469f, -0.963571f, -0.963674f,
+ -0.963776f, -0.963878f, -0.963980f, -0.964082f, -0.964184f, -0.964286f, -0.964387f, -0.964489f,
+ -0.964590f, -0.964691f, -0.964792f, -0.964893f, -0.964993f, -0.965094f, -0.965194f, -0.965294f,
+ -0.965394f, -0.965494f, -0.965594f, -0.965694f, -0.965793f, -0.965893f, -0.965992f, -0.966091f,
+ -0.966190f, -0.966289f, -0.966387f, -0.966486f, -0.966584f, -0.966683f, -0.966781f, -0.966879f,
+ -0.966976f, -0.967074f, -0.967172f, -0.967269f, -0.967366f, -0.967463f, -0.967560f, -0.967657f,
+ -0.967754f, -0.967850f, -0.967947f, -0.968043f, -0.968139f, -0.968235f, -0.968331f, -0.968427f,
+ -0.968522f, -0.968617f, -0.968713f, -0.968808f, -0.968903f, -0.968998f, -0.969092f, -0.969187f,
+ -0.969281f, -0.969375f, -0.969470f, -0.969564f, -0.969657f, -0.969751f, -0.969845f, -0.969938f,
+ -0.970031f, -0.970124f, -0.970217f, -0.970310f, -0.970403f, -0.970495f, -0.970588f, -0.970680f,
+ -0.970772f, -0.970864f, -0.970956f, -0.971048f, -0.971139f, -0.971231f, -0.971322f, -0.971413f,
+ -0.971504f, -0.971595f, -0.971685f, -0.971776f, -0.971866f, -0.971957f, -0.972047f, -0.972137f,
+ -0.972227f, -0.972316f, -0.972406f, -0.972495f, -0.972584f, -0.972673f, -0.972762f, -0.972851f,
+ -0.972940f, -0.973028f, -0.973117f, -0.973205f, -0.973293f, -0.973381f, -0.973469f, -0.973557f,
+ -0.973644f, -0.973732f, -0.973819f, -0.973906f, -0.973993f, -0.974080f, -0.974166f, -0.974253f,
+ -0.974339f, -0.974426f, -0.974512f, -0.974598f, -0.974684f, -0.974769f, -0.974855f, -0.974940f,
+ -0.975025f, -0.975110f, -0.975195f, -0.975280f, -0.975365f, -0.975449f, -0.975534f, -0.975618f,
+ -0.975702f, -0.975786f, -0.975870f, -0.975954f, -0.976037f, -0.976120f, -0.976204f, -0.976287f,
+ -0.976370f, -0.976453f, -0.976535f, -0.976618f, -0.976700f, -0.976782f, -0.976864f, -0.976946f,
+ -0.977028f, -0.977110f, -0.977191f, -0.977273f, -0.977354f, -0.977435f, -0.977516f, -0.977597f,
+ -0.977677f, -0.977758f, -0.977838f, -0.977918f, -0.977998f, -0.978078f, -0.978158f, -0.978238f,
+ -0.978317f, -0.978397f, -0.978476f, -0.978555f, -0.978634f, -0.978713f, -0.978791f, -0.978870f,
+ -0.978948f, -0.979026f, -0.979104f, -0.979182f, -0.979260f, -0.979338f, -0.979415f, -0.979493f,
+ -0.979570f, -0.979647f, -0.979724f, -0.979800f, -0.979877f, -0.979954f, -0.980030f, -0.980106f,
+ -0.980182f, -0.980258f, -0.980334f, -0.980409f, -0.980485f, -0.980560f, -0.980635f, -0.980710f,
+ -0.980785f, -0.980860f, -0.980935f, -0.981009f, -0.981083f, -0.981158f, -0.981232f, -0.981305f,
+ -0.981379f, -0.981453f, -0.981526f, -0.981600f, -0.981673f, -0.981746f, -0.981819f, -0.981891f,
+ -0.981964f, -0.982036f, -0.982109f, -0.982181f, -0.982253f, -0.982325f, -0.982396f, -0.982468f,
+ -0.982539f, -0.982611f, -0.982682f, -0.982753f, -0.982824f, -0.982894f, -0.982965f, -0.983035f,
+ -0.983105f, -0.983176f, -0.983246f, -0.983315f, -0.983385f, -0.983455f, -0.983524f, -0.983593f,
+ -0.983662f, -0.983731f, -0.983800f, -0.983869f, -0.983937f, -0.984006f, -0.984074f, -0.984142f,
+ -0.984210f, -0.984278f, -0.984346f, -0.984413f, -0.984480f, -0.984548f, -0.984615f, -0.984682f,
+ -0.984748f, -0.984815f, -0.984882f, -0.984948f, -0.985014f, -0.985080f, -0.985146f, -0.985212f,
+ -0.985278f, -0.985343f, -0.985408f, -0.985474f, -0.985539f, -0.985604f, -0.985668f, -0.985733f,
+ -0.985798f, -0.985862f, -0.985926f, -0.985990f, -0.986054f, -0.986118f, -0.986181f, -0.986245f,
+ -0.986308f, -0.986371f, -0.986434f, -0.986497f, -0.986560f, -0.986623f, -0.986685f, -0.986747f,
+ -0.986809f, -0.986871f, -0.986933f, -0.986995f, -0.987057f, -0.987118f, -0.987179f, -0.987240f,
+ -0.987301f, -0.987362f, -0.987423f, -0.987484f, -0.987544f, -0.987604f, -0.987664f, -0.987724f,
+ -0.987784f, -0.987844f, -0.987903f, -0.987963f, -0.988022f, -0.988081f, -0.988140f, -0.988199f,
+ -0.988258f, -0.988316f, -0.988374f, -0.988433f, -0.988491f, -0.988549f, -0.988607f, -0.988664f,
+ -0.988722f, -0.988779f, -0.988836f, -0.988893f, -0.988950f, -0.989007f, -0.989064f, -0.989120f,
+ -0.989177f, -0.989233f, -0.989289f, -0.989345f, -0.989400f, -0.989456f, -0.989511f, -0.989567f,
+ -0.989622f, -0.989677f, -0.989732f, -0.989787f, -0.989841f, -0.989896f, -0.989950f, -0.990004f,
+ -0.990058f, -0.990112f, -0.990166f, -0.990219f, -0.990273f, -0.990326f, -0.990379f, -0.990432f,
+ -0.990485f, -0.990538f, -0.990590f, -0.990643f, -0.990695f, -0.990747f, -0.990799f, -0.990851f,
+ -0.990903f, -0.990954f, -0.991006f, -0.991057f, -0.991108f, -0.991159f, -0.991210f, -0.991260f,
+ -0.991311f, -0.991361f, -0.991411f, -0.991462f, -0.991511f, -0.991561f, -0.991611f, -0.991660f,
+ -0.991710f, -0.991759f, -0.991808f, -0.991857f, -0.991906f, -0.991954f, -0.992003f, -0.992051f,
+ -0.992099f, -0.992147f, -0.992195f, -0.992243f, -0.992291f, -0.992338f, -0.992385f, -0.992433f,
+ -0.992480f, -0.992526f, -0.992573f, -0.992620f, -0.992666f, -0.992712f, -0.992759f, -0.992805f,
+ -0.992850f, -0.992896f, -0.992942f, -0.992987f, -0.993032f, -0.993077f, -0.993122f, -0.993167f,
+ -0.993212f, -0.993257f, -0.993301f, -0.993345f, -0.993389f, -0.993433f, -0.993477f, -0.993521f,
+ -0.993564f, -0.993608f, -0.993651f, -0.993694f, -0.993737f, -0.993779f, -0.993822f, -0.993865f,
+ -0.993907f, -0.993949f, -0.993991f, -0.994033f, -0.994075f, -0.994116f, -0.994158f, -0.994199f,
+ -0.994240f, -0.994281f, -0.994322f, -0.994363f, -0.994404f, -0.994444f, -0.994484f, -0.994525f,
+ -0.994565f, -0.994604f, -0.994644f, -0.994684f, -0.994723f, -0.994762f, -0.994802f, -0.994841f,
+ -0.994879f, -0.994918f, -0.994957f, -0.994995f, -0.995033f, -0.995071f, -0.995109f, -0.995147f,
+ -0.995185f, -0.995222f, -0.995260f, -0.995297f, -0.995334f, -0.995371f, -0.995408f, -0.995444f,
+ -0.995481f, -0.995517f, -0.995553f, -0.995589f, -0.995625f, -0.995661f, -0.995697f, -0.995732f,
+ -0.995767f, -0.995803f, -0.995838f, -0.995872f, -0.995907f, -0.995942f, -0.995976f, -0.996011f,
+ -0.996045f, -0.996079f, -0.996113f, -0.996146f, -0.996180f, -0.996213f, -0.996247f, -0.996280f,
+ -0.996313f, -0.996345f, -0.996378f, -0.996411f, -0.996443f, -0.996475f, -0.996507f, -0.996539f,
+ -0.996571f, -0.996603f, -0.996634f, -0.996666f, -0.996697f, -0.996728f, -0.996759f, -0.996790f,
+ -0.996820f, -0.996851f, -0.996881f, -0.996911f, -0.996941f, -0.996971f, -0.997001f, -0.997031f,
+ -0.997060f, -0.997089f, -0.997119f, -0.997148f, -0.997176f, -0.997205f, -0.997234f, -0.997262f,
+ -0.997290f, -0.997319f, -0.997347f, -0.997374f, -0.997402f, -0.997430f, -0.997457f, -0.997484f,
+ -0.997511f, -0.997538f, -0.997565f, -0.997592f, -0.997618f, -0.997645f, -0.997671f, -0.997697f,
+ -0.997723f, -0.997749f, -0.997774f, -0.997800f, -0.997825f, -0.997851f, -0.997876f, -0.997901f,
+ -0.997925f, -0.997950f, -0.997974f, -0.997999f, -0.998023f, -0.998047f, -0.998071f, -0.998094f,
+ -0.998118f, -0.998142f, -0.998165f, -0.998188f, -0.998211f, -0.998234f, -0.998257f, -0.998279f,
+ -0.998302f, -0.998324f, -0.998346f, -0.998368f, -0.998390f, -0.998411f, -0.998433f, -0.998454f,
+ -0.998476f, -0.998497f, -0.998518f, -0.998538f, -0.998559f, -0.998580f, -0.998600f, -0.998620f,
+ -0.998640f, -0.998660f, -0.998680f, -0.998700f, -0.998719f, -0.998738f, -0.998758f, -0.998777f,
+ -0.998795f, -0.998814f, -0.998833f, -0.998851f, -0.998870f, -0.998888f, -0.998906f, -0.998924f,
+ -0.998941f, -0.998959f, -0.998976f, -0.998994f, -0.999011f, -0.999028f, -0.999044f, -0.999061f,
+ -0.999078f, -0.999094f, -0.999110f, -0.999126f, -0.999142f, -0.999158f, -0.999174f, -0.999189f,
+ -0.999205f, -0.999220f, -0.999235f, -0.999250f, -0.999265f, -0.999279f, -0.999294f, -0.999308f,
+ -0.999322f, -0.999336f, -0.999350f, -0.999364f, -0.999378f, -0.999391f, -0.999404f, -0.999418f,
+ -0.999431f, -0.999443f, -0.999456f, -0.999469f, -0.999481f, -0.999493f, -0.999506f, -0.999518f,
+ -0.999529f, -0.999541f, -0.999553f, -0.999564f, -0.999575f, -0.999586f, -0.999597f, -0.999608f,
+ -0.999619f, -0.999629f, -0.999640f, -0.999650f, -0.999660f, -0.999670f, -0.999680f, -0.999689f,
+ -0.999699f, -0.999708f, -0.999717f, -0.999726f, -0.999735f, -0.999744f, -0.999753f, -0.999761f,
+ -0.999769f, -0.999778f, -0.999786f, -0.999793f, -0.999801f, -0.999809f, -0.999816f, -0.999823f,
+ -0.999831f, -0.999838f, -0.999844f, -0.999851f, -0.999858f, -0.999864f, -0.999870f, -0.999876f,
+ -0.999882f, -0.999888f, -0.999894f, -0.999899f, -0.999905f, -0.999910f, -0.999915f, -0.999920f,
+ -0.999925f, -0.999929f, -0.999934f, -0.999938f, -0.999942f, -0.999946f, -0.999950f, -0.999954f,
+ -0.999958f, -0.999961f, -0.999964f, -0.999968f, -0.999971f, -0.999973f, -0.999976f, -0.999979f,
+ -0.999981f, -0.999983f, -0.999986f, -0.999988f, -0.999989f, -0.999991f, -0.999993f, -0.999994f,
+ -0.999995f, -0.999996f, -0.999997f, -0.999998f, -0.999999f, -0.999999f, -1.000000f, -1.000000
+};
+
+static const float sinTable32768[16384] = {
+ 0.000000f, 0.000192f, 0.000383f, 0.000575f, 0.000767f, 0.000959f, 0.001150f, 0.001342f,
+ 0.001534f, 0.001726f, 0.001917f, 0.002109f, 0.002301f, 0.002493f, 0.002684f, 0.002876f,
+ 0.003068f, 0.003260f, 0.003451f, 0.003643f, 0.003835f, 0.004027f, 0.004218f, 0.004410f,
+ 0.004602f, 0.004794f, 0.004985f, 0.005177f, 0.005369f, 0.005561f, 0.005752f, 0.005944f,
+ 0.006136f, 0.006328f, 0.006519f, 0.006711f, 0.006903f, 0.007095f, 0.007286f, 0.007478f,
+ 0.007670f, 0.007862f, 0.008053f, 0.008245f, 0.008437f, 0.008629f, 0.008820f, 0.009012f,
+ 0.009204f, 0.009395f, 0.009587f, 0.009779f, 0.009971f, 0.010162f, 0.010354f, 0.010546f,
+ 0.010738f, 0.010929f, 0.011121f, 0.011313f, 0.011505f, 0.011696f, 0.011888f, 0.012080f,
+ 0.012272f, 0.012463f, 0.012655f, 0.012847f, 0.013038f, 0.013230f, 0.013422f, 0.013614f,
+ 0.013805f, 0.013997f, 0.014189f, 0.014381f, 0.014572f, 0.014764f, 0.014956f, 0.015147f,
+ 0.015339f, 0.015531f, 0.015723f, 0.015914f, 0.016106f, 0.016298f, 0.016490f, 0.016681f,
+ 0.016873f, 0.017065f, 0.017256f, 0.017448f, 0.017640f, 0.017832f, 0.018023f, 0.018215f,
+ 0.018407f, 0.018598f, 0.018790f, 0.018982f, 0.019174f, 0.019365f, 0.019557f, 0.019749f,
+ 0.019940f, 0.020132f, 0.020324f, 0.020516f, 0.020707f, 0.020899f, 0.021091f, 0.021282f,
+ 0.021474f, 0.021666f, 0.021857f, 0.022049f, 0.022241f, 0.022433f, 0.022624f, 0.022816f,
+ 0.023008f, 0.023199f, 0.023391f, 0.023583f, 0.023774f, 0.023966f, 0.024158f, 0.024350f,
+ 0.024541f, 0.024733f, 0.024925f, 0.025116f, 0.025308f, 0.025500f, 0.025691f, 0.025883f,
+ 0.026075f, 0.026266f, 0.026458f, 0.026650f, 0.026841f, 0.027033f, 0.027225f, 0.027416f,
+ 0.027608f, 0.027800f, 0.027991f, 0.028183f, 0.028375f, 0.028567f, 0.028758f, 0.028950f,
+ 0.029142f, 0.029333f, 0.029525f, 0.029717f, 0.029908f, 0.030100f, 0.030291f, 0.030483f,
+ 0.030675f, 0.030866f, 0.031058f, 0.031250f, 0.031441f, 0.031633f, 0.031825f, 0.032016f,
+ 0.032208f, 0.032400f, 0.032591f, 0.032783f, 0.032975f, 0.033166f, 0.033358f, 0.033550f,
+ 0.033741f, 0.033933f, 0.034124f, 0.034316f, 0.034508f, 0.034699f, 0.034891f, 0.035083f,
+ 0.035274f, 0.035466f, 0.035657f, 0.035849f, 0.036041f, 0.036232f, 0.036424f, 0.036616f,
+ 0.036807f, 0.036999f, 0.037190f, 0.037382f, 0.037574f, 0.037765f, 0.037957f, 0.038149f,
+ 0.038340f, 0.038532f, 0.038723f, 0.038915f, 0.039107f, 0.039298f, 0.039490f, 0.039681f,
+ 0.039873f, 0.040065f, 0.040256f, 0.040448f, 0.040639f, 0.040831f, 0.041022f, 0.041214f,
+ 0.041406f, 0.041597f, 0.041789f, 0.041980f, 0.042172f, 0.042364f, 0.042555f, 0.042747f,
+ 0.042938f, 0.043130f, 0.043321f, 0.043513f, 0.043705f, 0.043896f, 0.044088f, 0.044279f,
+ 0.044471f, 0.044662f, 0.044854f, 0.045045f, 0.045237f, 0.045429f, 0.045620f, 0.045812f,
+ 0.046003f, 0.046195f, 0.046386f, 0.046578f, 0.046769f, 0.046961f, 0.047152f, 0.047344f,
+ 0.047535f, 0.047727f, 0.047919f, 0.048110f, 0.048302f, 0.048493f, 0.048685f, 0.048876f,
+ 0.049068f, 0.049259f, 0.049451f, 0.049642f, 0.049834f, 0.050025f, 0.050217f, 0.050408f,
+ 0.050600f, 0.050791f, 0.050983f, 0.051174f, 0.051366f, 0.051557f, 0.051749f, 0.051940f,
+ 0.052132f, 0.052323f, 0.052515f, 0.052706f, 0.052898f, 0.053089f, 0.053281f, 0.053472f,
+ 0.053664f, 0.053855f, 0.054046f, 0.054238f, 0.054429f, 0.054621f, 0.054812f, 0.055004f,
+ 0.055195f, 0.055387f, 0.055578f, 0.055770f, 0.055961f, 0.056152f, 0.056344f, 0.056535f,
+ 0.056727f, 0.056918f, 0.057110f, 0.057301f, 0.057493f, 0.057684f, 0.057875f, 0.058067f,
+ 0.058258f, 0.058450f, 0.058641f, 0.058833f, 0.059024f, 0.059215f, 0.059407f, 0.059598f,
+ 0.059790f, 0.059981f, 0.060172f, 0.060364f, 0.060555f, 0.060747f, 0.060938f, 0.061129f,
+ 0.061321f, 0.061512f, 0.061704f, 0.061895f, 0.062086f, 0.062278f, 0.062469f, 0.062660f,
+ 0.062852f, 0.063043f, 0.063234f, 0.063426f, 0.063617f, 0.063809f, 0.064000f, 0.064191f,
+ 0.064383f, 0.064574f, 0.064765f, 0.064957f, 0.065148f, 0.065339f, 0.065531f, 0.065722f,
+ 0.065913f, 0.066105f, 0.066296f, 0.066487f, 0.066679f, 0.066870f, 0.067061f, 0.067253f,
+ 0.067444f, 0.067635f, 0.067827f, 0.068018f, 0.068209f, 0.068400f, 0.068592f, 0.068783f,
+ 0.068974f, 0.069166f, 0.069357f, 0.069548f, 0.069739f, 0.069931f, 0.070122f, 0.070313f,
+ 0.070505f, 0.070696f, 0.070887f, 0.071078f, 0.071270f, 0.071461f, 0.071652f, 0.071843f,
+ 0.072035f, 0.072226f, 0.072417f, 0.072608f, 0.072800f, 0.072991f, 0.073182f, 0.073373f,
+ 0.073565f, 0.073756f, 0.073947f, 0.074138f, 0.074329f, 0.074521f, 0.074712f, 0.074903f,
+ 0.075094f, 0.075286f, 0.075477f, 0.075668f, 0.075859f, 0.076050f, 0.076241f, 0.076433f,
+ 0.076624f, 0.076815f, 0.077006f, 0.077197f, 0.077389f, 0.077580f, 0.077771f, 0.077962f,
+ 0.078153f, 0.078344f, 0.078536f, 0.078727f, 0.078918f, 0.079109f, 0.079300f, 0.079491f,
+ 0.079682f, 0.079874f, 0.080065f, 0.080256f, 0.080447f, 0.080638f, 0.080829f, 0.081020f,
+ 0.081211f, 0.081403f, 0.081594f, 0.081785f, 0.081976f, 0.082167f, 0.082358f, 0.082549f,
+ 0.082740f, 0.082931f, 0.083122f, 0.083314f, 0.083505f, 0.083696f, 0.083887f, 0.084078f,
+ 0.084269f, 0.084460f, 0.084651f, 0.084842f, 0.085033f, 0.085224f, 0.085415f, 0.085606f,
+ 0.085797f, 0.085988f, 0.086179f, 0.086370f, 0.086561f, 0.086752f, 0.086943f, 0.087135f,
+ 0.087326f, 0.087517f, 0.087708f, 0.087899f, 0.088090f, 0.088281f, 0.088472f, 0.088663f,
+ 0.088854f, 0.089045f, 0.089236f, 0.089427f, 0.089617f, 0.089808f, 0.089999f, 0.090190f,
+ 0.090381f, 0.090572f, 0.090763f, 0.090954f, 0.091145f, 0.091336f, 0.091527f, 0.091718f,
+ 0.091909f, 0.092100f, 0.092291f, 0.092482f, 0.092673f, 0.092864f, 0.093055f, 0.093245f,
+ 0.093436f, 0.093627f, 0.093818f, 0.094009f, 0.094200f, 0.094391f, 0.094582f, 0.094773f,
+ 0.094963f, 0.095154f, 0.095345f, 0.095536f, 0.095727f, 0.095918f, 0.096109f, 0.096300f,
+ 0.096490f, 0.096681f, 0.096872f, 0.097063f, 0.097254f, 0.097445f, 0.097635f, 0.097826f,
+ 0.098017f, 0.098208f, 0.098399f, 0.098590f, 0.098780f, 0.098971f, 0.099162f, 0.099353f,
+ 0.099544f, 0.099734f, 0.099925f, 0.100116f, 0.100307f, 0.100498f, 0.100688f, 0.100879f,
+ 0.101070f, 0.101261f, 0.101451f, 0.101642f, 0.101833f, 0.102024f, 0.102214f, 0.102405f,
+ 0.102596f, 0.102787f, 0.102977f, 0.103168f, 0.103359f, 0.103550f, 0.103740f, 0.103931f,
+ 0.104122f, 0.104312f, 0.104503f, 0.104694f, 0.104884f, 0.105075f, 0.105266f, 0.105456f,
+ 0.105647f, 0.105838f, 0.106028f, 0.106219f, 0.106410f, 0.106600f, 0.106791f, 0.106982f,
+ 0.107172f, 0.107363f, 0.107554f, 0.107744f, 0.107935f, 0.108126f, 0.108316f, 0.108507f,
+ 0.108697f, 0.108888f, 0.109079f, 0.109269f, 0.109460f, 0.109650f, 0.109841f, 0.110032f,
+ 0.110222f, 0.110413f, 0.110603f, 0.110794f, 0.110984f, 0.111175f, 0.111366f, 0.111556f,
+ 0.111747f, 0.111937f, 0.112128f, 0.112318f, 0.112509f, 0.112699f, 0.112890f, 0.113080f,
+ 0.113271f, 0.113461f, 0.113652f, 0.113842f, 0.114033f, 0.114223f, 0.114414f, 0.114604f,
+ 0.114795f, 0.114985f, 0.115176f, 0.115366f, 0.115557f, 0.115747f, 0.115938f, 0.116128f,
+ 0.116319f, 0.116509f, 0.116700f, 0.116890f, 0.117080f, 0.117271f, 0.117461f, 0.117652f,
+ 0.117842f, 0.118032f, 0.118223f, 0.118413f, 0.118604f, 0.118794f, 0.118984f, 0.119175f,
+ 0.119365f, 0.119556f, 0.119746f, 0.119936f, 0.120127f, 0.120317f, 0.120507f, 0.120698f,
+ 0.120888f, 0.121078f, 0.121269f, 0.121459f, 0.121649f, 0.121840f, 0.122030f, 0.122220f,
+ 0.122411f, 0.122601f, 0.122791f, 0.122982f, 0.123172f, 0.123362f, 0.123552f, 0.123743f,
+ 0.123933f, 0.124123f, 0.124314f, 0.124504f, 0.124694f, 0.124884f, 0.125075f, 0.125265f,
+ 0.125455f, 0.125645f, 0.125835f, 0.126026f, 0.126216f, 0.126406f, 0.126596f, 0.126787f,
+ 0.126977f, 0.127167f, 0.127357f, 0.127547f, 0.127737f, 0.127928f, 0.128118f, 0.128308f,
+ 0.128498f, 0.128688f, 0.128878f, 0.129069f, 0.129259f, 0.129449f, 0.129639f, 0.129829f,
+ 0.130019f, 0.130209f, 0.130399f, 0.130590f, 0.130780f, 0.130970f, 0.131160f, 0.131350f,
+ 0.131540f, 0.131730f, 0.131920f, 0.132110f, 0.132300f, 0.132490f, 0.132680f, 0.132870f,
+ 0.133061f, 0.133251f, 0.133441f, 0.133631f, 0.133821f, 0.134011f, 0.134201f, 0.134391f,
+ 0.134581f, 0.134771f, 0.134961f, 0.135151f, 0.135341f, 0.135531f, 0.135721f, 0.135911f,
+ 0.136101f, 0.136291f, 0.136480f, 0.136670f, 0.136860f, 0.137050f, 0.137240f, 0.137430f,
+ 0.137620f, 0.137810f, 0.138000f, 0.138190f, 0.138380f, 0.138570f, 0.138760f, 0.138949f,
+ 0.139139f, 0.139329f, 0.139519f, 0.139709f, 0.139899f, 0.140089f, 0.140279f, 0.140468f,
+ 0.140658f, 0.140848f, 0.141038f, 0.141228f, 0.141418f, 0.141607f, 0.141797f, 0.141987f,
+ 0.142177f, 0.142367f, 0.142556f, 0.142746f, 0.142936f, 0.143126f, 0.143316f, 0.143505f,
+ 0.143695f, 0.143885f, 0.144075f, 0.144264f, 0.144454f, 0.144644f, 0.144833f, 0.145023f,
+ 0.145213f, 0.145403f, 0.145592f, 0.145782f, 0.145972f, 0.146161f, 0.146351f, 0.146541f,
+ 0.146730f, 0.146920f, 0.147110f, 0.147299f, 0.147489f, 0.147679f, 0.147868f, 0.148058f,
+ 0.148248f, 0.148437f, 0.148627f, 0.148817f, 0.149006f, 0.149196f, 0.149385f, 0.149575f,
+ 0.149765f, 0.149954f, 0.150144f, 0.150333f, 0.150523f, 0.150712f, 0.150902f, 0.151092f,
+ 0.151281f, 0.151471f, 0.151660f, 0.151850f, 0.152039f, 0.152229f, 0.152418f, 0.152608f,
+ 0.152797f, 0.152987f, 0.153176f, 0.153366f, 0.153555f, 0.153745f, 0.153934f, 0.154124f,
+ 0.154313f, 0.154502f, 0.154692f, 0.154881f, 0.155071f, 0.155260f, 0.155450f, 0.155639f,
+ 0.155828f, 0.156018f, 0.156207f, 0.156397f, 0.156586f, 0.156775f, 0.156965f, 0.157154f,
+ 0.157343f, 0.157533f, 0.157722f, 0.157912f, 0.158101f, 0.158290f, 0.158480f, 0.158669f,
+ 0.158858f, 0.159047f, 0.159237f, 0.159426f, 0.159615f, 0.159805f, 0.159994f, 0.160183f,
+ 0.160372f, 0.160562f, 0.160751f, 0.160940f, 0.161129f, 0.161319f, 0.161508f, 0.161697f,
+ 0.161886f, 0.162076f, 0.162265f, 0.162454f, 0.162643f, 0.162832f, 0.163022f, 0.163211f,
+ 0.163400f, 0.163589f, 0.163778f, 0.163967f, 0.164157f, 0.164346f, 0.164535f, 0.164724f,
+ 0.164913f, 0.165102f, 0.165291f, 0.165480f, 0.165670f, 0.165859f, 0.166048f, 0.166237f,
+ 0.166426f, 0.166615f, 0.166804f, 0.166993f, 0.167182f, 0.167371f, 0.167560f, 0.167749f,
+ 0.167938f, 0.168127f, 0.168316f, 0.168505f, 0.168694f, 0.168883f, 0.169072f, 0.169261f,
+ 0.169450f, 0.169639f, 0.169828f, 0.170017f, 0.170206f, 0.170395f, 0.170584f, 0.170773f,
+ 0.170962f, 0.171151f, 0.171340f, 0.171529f, 0.171718f, 0.171906f, 0.172095f, 0.172284f,
+ 0.172473f, 0.172662f, 0.172851f, 0.173040f, 0.173229f, 0.173417f, 0.173606f, 0.173795f,
+ 0.173984f, 0.174173f, 0.174362f, 0.174550f, 0.174739f, 0.174928f, 0.175117f, 0.175305f,
+ 0.175494f, 0.175683f, 0.175872f, 0.176061f, 0.176249f, 0.176438f, 0.176627f, 0.176815f,
+ 0.177004f, 0.177193f, 0.177382f, 0.177570f, 0.177759f, 0.177948f, 0.178136f, 0.178325f,
+ 0.178514f, 0.178702f, 0.178891f, 0.179080f, 0.179268f, 0.179457f, 0.179646f, 0.179834f,
+ 0.180023f, 0.180212f, 0.180400f, 0.180589f, 0.180777f, 0.180966f, 0.181154f, 0.181343f,
+ 0.181532f, 0.181720f, 0.181909f, 0.182097f, 0.182286f, 0.182474f, 0.182663f, 0.182851f,
+ 0.183040f, 0.183228f, 0.183417f, 0.183605f, 0.183794f, 0.183982f, 0.184171f, 0.184359f,
+ 0.184548f, 0.184736f, 0.184925f, 0.185113f, 0.185301f, 0.185490f, 0.185678f, 0.185867f,
+ 0.186055f, 0.186244f, 0.186432f, 0.186620f, 0.186809f, 0.186997f, 0.187185f, 0.187374f,
+ 0.187562f, 0.187750f, 0.187939f, 0.188127f, 0.188315f, 0.188504f, 0.188692f, 0.188880f,
+ 0.189069f, 0.189257f, 0.189445f, 0.189634f, 0.189822f, 0.190010f, 0.190198f, 0.190387f,
+ 0.190575f, 0.190763f, 0.190951f, 0.191139f, 0.191328f, 0.191516f, 0.191704f, 0.191892f,
+ 0.192080f, 0.192269f, 0.192457f, 0.192645f, 0.192833f, 0.193021f, 0.193209f, 0.193397f,
+ 0.193586f, 0.193774f, 0.193962f, 0.194150f, 0.194338f, 0.194526f, 0.194714f, 0.194902f,
+ 0.195090f, 0.195278f, 0.195466f, 0.195654f, 0.195843f, 0.196031f, 0.196219f, 0.196407f,
+ 0.196595f, 0.196783f, 0.196971f, 0.197159f, 0.197347f, 0.197535f, 0.197722f, 0.197910f,
+ 0.198098f, 0.198286f, 0.198474f, 0.198662f, 0.198850f, 0.199038f, 0.199226f, 0.199414f,
+ 0.199602f, 0.199790f, 0.199978f, 0.200165f, 0.200353f, 0.200541f, 0.200729f, 0.200917f,
+ 0.201105f, 0.201292f, 0.201480f, 0.201668f, 0.201856f, 0.202044f, 0.202231f, 0.202419f,
+ 0.202607f, 0.202795f, 0.202983f, 0.203170f, 0.203358f, 0.203546f, 0.203734f, 0.203921f,
+ 0.204109f, 0.204297f, 0.204484f, 0.204672f, 0.204860f, 0.205047f, 0.205235f, 0.205423f,
+ 0.205610f, 0.205798f, 0.205986f, 0.206173f, 0.206361f, 0.206549f, 0.206736f, 0.206924f,
+ 0.207111f, 0.207299f, 0.207487f, 0.207674f, 0.207862f, 0.208049f, 0.208237f, 0.208424f,
+ 0.208612f, 0.208799f, 0.208987f, 0.209174f, 0.209362f, 0.209549f, 0.209737f, 0.209924f,
+ 0.210112f, 0.210299f, 0.210487f, 0.210674f, 0.210862f, 0.211049f, 0.211237f, 0.211424f,
+ 0.211611f, 0.211799f, 0.211986f, 0.212174f, 0.212361f, 0.212548f, 0.212736f, 0.212923f,
+ 0.213110f, 0.213298f, 0.213485f, 0.213672f, 0.213860f, 0.214047f, 0.214234f, 0.214422f,
+ 0.214609f, 0.214796f, 0.214983f, 0.215171f, 0.215358f, 0.215545f, 0.215732f, 0.215920f,
+ 0.216107f, 0.216294f, 0.216481f, 0.216668f, 0.216856f, 0.217043f, 0.217230f, 0.217417f,
+ 0.217604f, 0.217791f, 0.217979f, 0.218166f, 0.218353f, 0.218540f, 0.218727f, 0.218914f,
+ 0.219101f, 0.219288f, 0.219475f, 0.219662f, 0.219850f, 0.220037f, 0.220224f, 0.220411f,
+ 0.220598f, 0.220785f, 0.220972f, 0.221159f, 0.221346f, 0.221533f, 0.221720f, 0.221907f,
+ 0.222094f, 0.222281f, 0.222468f, 0.222654f, 0.222841f, 0.223028f, 0.223215f, 0.223402f,
+ 0.223589f, 0.223776f, 0.223963f, 0.224150f, 0.224337f, 0.224523f, 0.224710f, 0.224897f,
+ 0.225084f, 0.225271f, 0.225458f, 0.225644f, 0.225831f, 0.226018f, 0.226205f, 0.226391f,
+ 0.226578f, 0.226765f, 0.226952f, 0.227139f, 0.227325f, 0.227512f, 0.227699f, 0.227885f,
+ 0.228072f, 0.228259f, 0.228445f, 0.228632f, 0.228819f, 0.229005f, 0.229192f, 0.229379f,
+ 0.229565f, 0.229752f, 0.229939f, 0.230125f, 0.230312f, 0.230498f, 0.230685f, 0.230872f,
+ 0.231058f, 0.231245f, 0.231431f, 0.231618f, 0.231804f, 0.231991f, 0.232177f, 0.232364f,
+ 0.232550f, 0.232737f, 0.232923f, 0.233110f, 0.233296f, 0.233483f, 0.233669f, 0.233856f,
+ 0.234042f, 0.234228f, 0.234415f, 0.234601f, 0.234788f, 0.234974f, 0.235160f, 0.235347f,
+ 0.235533f, 0.235719f, 0.235906f, 0.236092f, 0.236278f, 0.236465f, 0.236651f, 0.236837f,
+ 0.237024f, 0.237210f, 0.237396f, 0.237582f, 0.237769f, 0.237955f, 0.238141f, 0.238327f,
+ 0.238514f, 0.238700f, 0.238886f, 0.239072f, 0.239258f, 0.239445f, 0.239631f, 0.239817f,
+ 0.240003f, 0.240189f, 0.240375f, 0.240561f, 0.240748f, 0.240934f, 0.241120f, 0.241306f,
+ 0.241492f, 0.241678f, 0.241864f, 0.242050f, 0.242236f, 0.242422f, 0.242608f, 0.242794f,
+ 0.242980f, 0.243166f, 0.243352f, 0.243538f, 0.243724f, 0.243910f, 0.244096f, 0.244282f,
+ 0.244468f, 0.244654f, 0.244840f, 0.245026f, 0.245212f, 0.245397f, 0.245583f, 0.245769f,
+ 0.245955f, 0.246141f, 0.246327f, 0.246513f, 0.246698f, 0.246884f, 0.247070f, 0.247256f,
+ 0.247442f, 0.247627f, 0.247813f, 0.247999f, 0.248185f, 0.248370f, 0.248556f, 0.248742f,
+ 0.248928f, 0.249113f, 0.249299f, 0.249485f, 0.249670f, 0.249856f, 0.250042f, 0.250227f,
+ 0.250413f, 0.250599f, 0.250784f, 0.250970f, 0.251155f, 0.251341f, 0.251527f, 0.251712f,
+ 0.251898f, 0.252083f, 0.252269f, 0.252454f, 0.252640f, 0.252826f, 0.253011f, 0.253197f,
+ 0.253382f, 0.253568f, 0.253753f, 0.253938f, 0.254124f, 0.254309f, 0.254495f, 0.254680f,
+ 0.254866f, 0.255051f, 0.255236f, 0.255422f, 0.255607f, 0.255793f, 0.255978f, 0.256163f,
+ 0.256349f, 0.256534f, 0.256719f, 0.256905f, 0.257090f, 0.257275f, 0.257461f, 0.257646f,
+ 0.257831f, 0.258016f, 0.258202f, 0.258387f, 0.258572f, 0.258757f, 0.258943f, 0.259128f,
+ 0.259313f, 0.259498f, 0.259683f, 0.259868f, 0.260054f, 0.260239f, 0.260424f, 0.260609f,
+ 0.260794f, 0.260979f, 0.261164f, 0.261349f, 0.261534f, 0.261720f, 0.261905f, 0.262090f,
+ 0.262275f, 0.262460f, 0.262645f, 0.262830f, 0.263015f, 0.263200f, 0.263385f, 0.263570f,
+ 0.263755f, 0.263940f, 0.264125f, 0.264309f, 0.264494f, 0.264679f, 0.264864f, 0.265049f,
+ 0.265234f, 0.265419f, 0.265604f, 0.265789f, 0.265973f, 0.266158f, 0.266343f, 0.266528f,
+ 0.266713f, 0.266898f, 0.267082f, 0.267267f, 0.267452f, 0.267637f, 0.267821f, 0.268006f,
+ 0.268191f, 0.268376f, 0.268560f, 0.268745f, 0.268930f, 0.269114f, 0.269299f, 0.269484f,
+ 0.269668f, 0.269853f, 0.270038f, 0.270222f, 0.270407f, 0.270591f, 0.270776f, 0.270961f,
+ 0.271145f, 0.271330f, 0.271514f, 0.271699f, 0.271883f, 0.272068f, 0.272252f, 0.272437f,
+ 0.272621f, 0.272806f, 0.272990f, 0.273175f, 0.273359f, 0.273544f, 0.273728f, 0.273912f,
+ 0.274097f, 0.274281f, 0.274466f, 0.274650f, 0.274834f, 0.275019f, 0.275203f, 0.275387f,
+ 0.275572f, 0.275756f, 0.275940f, 0.276125f, 0.276309f, 0.276493f, 0.276678f, 0.276862f,
+ 0.277046f, 0.277230f, 0.277415f, 0.277599f, 0.277783f, 0.277967f, 0.278151f, 0.278336f,
+ 0.278520f, 0.278704f, 0.278888f, 0.279072f, 0.279256f, 0.279440f, 0.279624f, 0.279809f,
+ 0.279993f, 0.280177f, 0.280361f, 0.280545f, 0.280729f, 0.280913f, 0.281097f, 0.281281f,
+ 0.281465f, 0.281649f, 0.281833f, 0.282017f, 0.282201f, 0.282385f, 0.282569f, 0.282753f,
+ 0.282937f, 0.283120f, 0.283304f, 0.283488f, 0.283672f, 0.283856f, 0.284040f, 0.284224f,
+ 0.284408f, 0.284591f, 0.284775f, 0.284959f, 0.285143f, 0.285327f, 0.285510f, 0.285694f,
+ 0.285878f, 0.286062f, 0.286245f, 0.286429f, 0.286613f, 0.286796f, 0.286980f, 0.287164f,
+ 0.287347f, 0.287531f, 0.287715f, 0.287898f, 0.288082f, 0.288266f, 0.288449f, 0.288633f,
+ 0.288816f, 0.289000f, 0.289184f, 0.289367f, 0.289551f, 0.289734f, 0.289918f, 0.290101f,
+ 0.290285f, 0.290468f, 0.290652f, 0.290835f, 0.291019f, 0.291202f, 0.291385f, 0.291569f,
+ 0.291752f, 0.291936f, 0.292119f, 0.292302f, 0.292486f, 0.292669f, 0.292852f, 0.293036f,
+ 0.293219f, 0.293402f, 0.293586f, 0.293769f, 0.293952f, 0.294136f, 0.294319f, 0.294502f,
+ 0.294685f, 0.294869f, 0.295052f, 0.295235f, 0.295418f, 0.295601f, 0.295785f, 0.295968f,
+ 0.296151f, 0.296334f, 0.296517f, 0.296700f, 0.296883f, 0.297066f, 0.297250f, 0.297433f,
+ 0.297616f, 0.297799f, 0.297982f, 0.298165f, 0.298348f, 0.298531f, 0.298714f, 0.298897f,
+ 0.299080f, 0.299263f, 0.299446f, 0.299629f, 0.299812f, 0.299995f, 0.300177f, 0.300360f,
+ 0.300543f, 0.300726f, 0.300909f, 0.301092f, 0.301275f, 0.301458f, 0.301640f, 0.301823f,
+ 0.302006f, 0.302189f, 0.302372f, 0.302554f, 0.302737f, 0.302920f, 0.303103f, 0.303285f,
+ 0.303468f, 0.303651f, 0.303833f, 0.304016f, 0.304199f, 0.304381f, 0.304564f, 0.304747f,
+ 0.304929f, 0.305112f, 0.305294f, 0.305477f, 0.305660f, 0.305842f, 0.306025f, 0.306207f,
+ 0.306390f, 0.306572f, 0.306755f, 0.306937f, 0.307120f, 0.307302f, 0.307485f, 0.307667f,
+ 0.307850f, 0.308032f, 0.308214f, 0.308397f, 0.308579f, 0.308762f, 0.308944f, 0.309126f,
+ 0.309309f, 0.309491f, 0.309673f, 0.309856f, 0.310038f, 0.310220f, 0.310403f, 0.310585f,
+ 0.310767f, 0.310949f, 0.311132f, 0.311314f, 0.311496f, 0.311678f, 0.311860f, 0.312043f,
+ 0.312225f, 0.312407f, 0.312589f, 0.312771f, 0.312953f, 0.313135f, 0.313318f, 0.313500f,
+ 0.313682f, 0.313864f, 0.314046f, 0.314228f, 0.314410f, 0.314592f, 0.314774f, 0.314956f,
+ 0.315138f, 0.315320f, 0.315502f, 0.315684f, 0.315866f, 0.316048f, 0.316230f, 0.316411f,
+ 0.316593f, 0.316775f, 0.316957f, 0.317139f, 0.317321f, 0.317503f, 0.317684f, 0.317866f,
+ 0.318048f, 0.318230f, 0.318412f, 0.318593f, 0.318775f, 0.318957f, 0.319139f, 0.319320f,
+ 0.319502f, 0.319684f, 0.319865f, 0.320047f, 0.320229f, 0.320410f, 0.320592f, 0.320774f,
+ 0.320955f, 0.321137f, 0.321318f, 0.321500f, 0.321682f, 0.321863f, 0.322045f, 0.322226f,
+ 0.322408f, 0.322589f, 0.322771f, 0.322952f, 0.323134f, 0.323315f, 0.323497f, 0.323678f,
+ 0.323859f, 0.324041f, 0.324222f, 0.324404f, 0.324585f, 0.324766f, 0.324948f, 0.325129f,
+ 0.325310f, 0.325492f, 0.325673f, 0.325854f, 0.326035f, 0.326217f, 0.326398f, 0.326579f,
+ 0.326760f, 0.326942f, 0.327123f, 0.327304f, 0.327485f, 0.327666f, 0.327848f, 0.328029f,
+ 0.328210f, 0.328391f, 0.328572f, 0.328753f, 0.328934f, 0.329115f, 0.329296f, 0.329477f,
+ 0.329658f, 0.329839f, 0.330020f, 0.330202f, 0.330382f, 0.330563f, 0.330744f, 0.330925f,
+ 0.331106f, 0.331287f, 0.331468f, 0.331649f, 0.331830f, 0.332011f, 0.332192f, 0.332373f,
+ 0.332553f, 0.332734f, 0.332915f, 0.333096f, 0.333277f, 0.333457f, 0.333638f, 0.333819f,
+ 0.334000f, 0.334180f, 0.334361f, 0.334542f, 0.334722f, 0.334903f, 0.335084f, 0.335265f,
+ 0.335445f, 0.335626f, 0.335806f, 0.335987f, 0.336168f, 0.336348f, 0.336529f, 0.336709f,
+ 0.336890f, 0.337070f, 0.337251f, 0.337431f, 0.337612f, 0.337792f, 0.337973f, 0.338153f,
+ 0.338334f, 0.338514f, 0.338695f, 0.338875f, 0.339055f, 0.339236f, 0.339416f, 0.339597f,
+ 0.339777f, 0.339957f, 0.340138f, 0.340318f, 0.340498f, 0.340678f, 0.340859f, 0.341039f,
+ 0.341219f, 0.341399f, 0.341580f, 0.341760f, 0.341940f, 0.342120f, 0.342300f, 0.342481f,
+ 0.342661f, 0.342841f, 0.343021f, 0.343201f, 0.343381f, 0.343561f, 0.343741f, 0.343921f,
+ 0.344101f, 0.344281f, 0.344461f, 0.344641f, 0.344821f, 0.345001f, 0.345181f, 0.345361f,
+ 0.345541f, 0.345721f, 0.345901f, 0.346081f, 0.346261f, 0.346441f, 0.346621f, 0.346801f,
+ 0.346980f, 0.347160f, 0.347340f, 0.347520f, 0.347700f, 0.347879f, 0.348059f, 0.348239f,
+ 0.348419f, 0.348598f, 0.348778f, 0.348958f, 0.349138f, 0.349317f, 0.349497f, 0.349676f,
+ 0.349856f, 0.350036f, 0.350215f, 0.350395f, 0.350575f, 0.350754f, 0.350934f, 0.351113f,
+ 0.351293f, 0.351472f, 0.351652f, 0.351831f, 0.352011f, 0.352190f, 0.352370f, 0.352549f,
+ 0.352729f, 0.352908f, 0.353087f, 0.353267f, 0.353446f, 0.353626f, 0.353805f, 0.353984f,
+ 0.354164f, 0.354343f, 0.354522f, 0.354701f, 0.354881f, 0.355060f, 0.355239f, 0.355418f,
+ 0.355598f, 0.355777f, 0.355956f, 0.356135f, 0.356314f, 0.356494f, 0.356673f, 0.356852f,
+ 0.357031f, 0.357210f, 0.357389f, 0.357568f, 0.357747f, 0.357926f, 0.358105f, 0.358284f,
+ 0.358463f, 0.358642f, 0.358821f, 0.359000f, 0.359179f, 0.359358f, 0.359537f, 0.359716f,
+ 0.359895f, 0.360074f, 0.360253f, 0.360432f, 0.360611f, 0.360789f, 0.360968f, 0.361147f,
+ 0.361326f, 0.361505f, 0.361683f, 0.361862f, 0.362041f, 0.362220f, 0.362398f, 0.362577f,
+ 0.362756f, 0.362934f, 0.363113f, 0.363292f, 0.363470f, 0.363649f, 0.363828f, 0.364006f,
+ 0.364185f, 0.364363f, 0.364542f, 0.364720f, 0.364899f, 0.365078f, 0.365256f, 0.365435f,
+ 0.365613f, 0.365791f, 0.365970f, 0.366148f, 0.366327f, 0.366505f, 0.366684f, 0.366862f,
+ 0.367040f, 0.367219f, 0.367397f, 0.367575f, 0.367754f, 0.367932f, 0.368110f, 0.368289f,
+ 0.368467f, 0.368645f, 0.368823f, 0.369002f, 0.369180f, 0.369358f, 0.369536f, 0.369714f,
+ 0.369892f, 0.370071f, 0.370249f, 0.370427f, 0.370605f, 0.370783f, 0.370961f, 0.371139f,
+ 0.371317f, 0.371495f, 0.371673f, 0.371851f, 0.372029f, 0.372207f, 0.372385f, 0.372563f,
+ 0.372741f, 0.372919f, 0.373097f, 0.373275f, 0.373453f, 0.373631f, 0.373808f, 0.373986f,
+ 0.374164f, 0.374342f, 0.374520f, 0.374697f, 0.374875f, 0.375053f, 0.375231f, 0.375408f,
+ 0.375586f, 0.375764f, 0.375942f, 0.376119f, 0.376297f, 0.376475f, 0.376652f, 0.376830f,
+ 0.377007f, 0.377185f, 0.377363f, 0.377540f, 0.377718f, 0.377895f, 0.378073f, 0.378250f,
+ 0.378428f, 0.378605f, 0.378783f, 0.378960f, 0.379138f, 0.379315f, 0.379492f, 0.379670f,
+ 0.379847f, 0.380025f, 0.380202f, 0.380379f, 0.380557f, 0.380734f, 0.380911f, 0.381088f,
+ 0.381266f, 0.381443f, 0.381620f, 0.381797f, 0.381975f, 0.382152f, 0.382329f, 0.382506f,
+ 0.382683f, 0.382861f, 0.383038f, 0.383215f, 0.383392f, 0.383569f, 0.383746f, 0.383923f,
+ 0.384100f, 0.384277f, 0.384454f, 0.384631f, 0.384808f, 0.384985f, 0.385162f, 0.385339f,
+ 0.385516f, 0.385693f, 0.385870f, 0.386047f, 0.386224f, 0.386400f, 0.386577f, 0.386754f,
+ 0.386931f, 0.387108f, 0.387285f, 0.387461f, 0.387638f, 0.387815f, 0.387992f, 0.388168f,
+ 0.388345f, 0.388522f, 0.388698f, 0.388875f, 0.389052f, 0.389228f, 0.389405f, 0.389582f,
+ 0.389758f, 0.389935f, 0.390111f, 0.390288f, 0.390464f, 0.390641f, 0.390817f, 0.390994f,
+ 0.391170f, 0.391347f, 0.391523f, 0.391700f, 0.391876f, 0.392053f, 0.392229f, 0.392405f,
+ 0.392582f, 0.392758f, 0.392934f, 0.393111f, 0.393287f, 0.393463f, 0.393640f, 0.393816f,
+ 0.393992f, 0.394168f, 0.394344f, 0.394521f, 0.394697f, 0.394873f, 0.395049f, 0.395225f,
+ 0.395401f, 0.395578f, 0.395754f, 0.395930f, 0.396106f, 0.396282f, 0.396458f, 0.396634f,
+ 0.396810f, 0.396986f, 0.397162f, 0.397338f, 0.397514f, 0.397690f, 0.397866f, 0.398042f,
+ 0.398218f, 0.398393f, 0.398569f, 0.398745f, 0.398921f, 0.399097f, 0.399273f, 0.399448f,
+ 0.399624f, 0.399800f, 0.399976f, 0.400151f, 0.400327f, 0.400503f, 0.400679f, 0.400854f,
+ 0.401030f, 0.401206f, 0.401381f, 0.401557f, 0.401732f, 0.401908f, 0.402084f, 0.402259f,
+ 0.402435f, 0.402610f, 0.402786f, 0.402961f, 0.403137f, 0.403312f, 0.403488f, 0.403663f,
+ 0.403838f, 0.404014f, 0.404189f, 0.404365f, 0.404540f, 0.404715f, 0.404891f, 0.405066f,
+ 0.405241f, 0.405417f, 0.405592f, 0.405767f, 0.405942f, 0.406118f, 0.406293f, 0.406468f,
+ 0.406643f, 0.406818f, 0.406994f, 0.407169f, 0.407344f, 0.407519f, 0.407694f, 0.407869f,
+ 0.408044f, 0.408219f, 0.408394f, 0.408569f, 0.408744f, 0.408919f, 0.409094f, 0.409269f,
+ 0.409444f, 0.409619f, 0.409794f, 0.409969f, 0.410144f, 0.410319f, 0.410493f, 0.410668f,
+ 0.410843f, 0.411018f, 0.411193f, 0.411368f, 0.411542f, 0.411717f, 0.411892f, 0.412067f,
+ 0.412241f, 0.412416f, 0.412591f, 0.412765f, 0.412940f, 0.413115f, 0.413289f, 0.413464f,
+ 0.413638f, 0.413813f, 0.413987f, 0.414162f, 0.414337f, 0.414511f, 0.414685f, 0.414860f,
+ 0.415034f, 0.415209f, 0.415383f, 0.415558f, 0.415732f, 0.415906f, 0.416081f, 0.416255f,
+ 0.416430f, 0.416604f, 0.416778f, 0.416952f, 0.417127f, 0.417301f, 0.417475f, 0.417650f,
+ 0.417824f, 0.417998f, 0.418172f, 0.418346f, 0.418520f, 0.418695f, 0.418869f, 0.419043f,
+ 0.419217f, 0.419391f, 0.419565f, 0.419739f, 0.419913f, 0.420087f, 0.420261f, 0.420435f,
+ 0.420609f, 0.420783f, 0.420957f, 0.421131f, 0.421305f, 0.421479f, 0.421653f, 0.421826f,
+ 0.422000f, 0.422174f, 0.422348f, 0.422522f, 0.422695f, 0.422869f, 0.423043f, 0.423217f,
+ 0.423390f, 0.423564f, 0.423738f, 0.423912f, 0.424085f, 0.424259f, 0.424432f, 0.424606f,
+ 0.424780f, 0.424953f, 0.425127f, 0.425300f, 0.425474f, 0.425647f, 0.425821f, 0.425994f,
+ 0.426168f, 0.426341f, 0.426515f, 0.426688f, 0.426862f, 0.427035f, 0.427208f, 0.427382f,
+ 0.427555f, 0.427728f, 0.427902f, 0.428075f, 0.428248f, 0.428422f, 0.428595f, 0.428768f,
+ 0.428941f, 0.429114f, 0.429288f, 0.429461f, 0.429634f, 0.429807f, 0.429980f, 0.430153f,
+ 0.430326f, 0.430500f, 0.430673f, 0.430846f, 0.431019f, 0.431192f, 0.431365f, 0.431538f,
+ 0.431711f, 0.431884f, 0.432057f, 0.432229f, 0.432402f, 0.432575f, 0.432748f, 0.432921f,
+ 0.433094f, 0.433267f, 0.433439f, 0.433612f, 0.433785f, 0.433958f, 0.434131f, 0.434303f,
+ 0.434476f, 0.434649f, 0.434821f, 0.434994f, 0.435167f, 0.435339f, 0.435512f, 0.435685f,
+ 0.435857f, 0.436030f, 0.436202f, 0.436375f, 0.436547f, 0.436720f, 0.436892f, 0.437065f,
+ 0.437237f, 0.437410f, 0.437582f, 0.437754f, 0.437927f, 0.438099f, 0.438272f, 0.438444f,
+ 0.438616f, 0.438789f, 0.438961f, 0.439133f, 0.439305f, 0.439478f, 0.439650f, 0.439822f,
+ 0.439994f, 0.440166f, 0.440339f, 0.440511f, 0.440683f, 0.440855f, 0.441027f, 0.441199f,
+ 0.441371f, 0.441543f, 0.441715f, 0.441887f, 0.442059f, 0.442231f, 0.442403f, 0.442575f,
+ 0.442747f, 0.442919f, 0.443091f, 0.443263f, 0.443435f, 0.443607f, 0.443779f, 0.443950f,
+ 0.444122f, 0.444294f, 0.444466f, 0.444637f, 0.444809f, 0.444981f, 0.445153f, 0.445324f,
+ 0.445496f, 0.445668f, 0.445839f, 0.446011f, 0.446183f, 0.446354f, 0.446526f, 0.446697f,
+ 0.446869f, 0.447040f, 0.447212f, 0.447383f, 0.447555f, 0.447726f, 0.447898f, 0.448069f,
+ 0.448241f, 0.448412f, 0.448583f, 0.448755f, 0.448926f, 0.449097f, 0.449269f, 0.449440f,
+ 0.449611f, 0.449783f, 0.449954f, 0.450125f, 0.450296f, 0.450467f, 0.450639f, 0.450810f,
+ 0.450981f, 0.451152f, 0.451323f, 0.451494f, 0.451665f, 0.451836f, 0.452008f, 0.452179f,
+ 0.452350f, 0.452521f, 0.452692f, 0.452863f, 0.453033f, 0.453204f, 0.453375f, 0.453546f,
+ 0.453717f, 0.453888f, 0.454059f, 0.454230f, 0.454400f, 0.454571f, 0.454742f, 0.454913f,
+ 0.455084f, 0.455254f, 0.455425f, 0.455596f, 0.455766f, 0.455937f, 0.456108f, 0.456278f,
+ 0.456449f, 0.456620f, 0.456790f, 0.456961f, 0.457131f, 0.457302f, 0.457472f, 0.457643f,
+ 0.457813f, 0.457984f, 0.458154f, 0.458325f, 0.458495f, 0.458665f, 0.458836f, 0.459006f,
+ 0.459177f, 0.459347f, 0.459517f, 0.459687f, 0.459858f, 0.460028f, 0.460198f, 0.460369f,
+ 0.460539f, 0.460709f, 0.460879f, 0.461049f, 0.461219f, 0.461390f, 0.461560f, 0.461730f,
+ 0.461900f, 0.462070f, 0.462240f, 0.462410f, 0.462580f, 0.462750f, 0.462920f, 0.463090f,
+ 0.463260f, 0.463430f, 0.463600f, 0.463769f, 0.463939f, 0.464109f, 0.464279f, 0.464449f,
+ 0.464619f, 0.464788f, 0.464958f, 0.465128f, 0.465298f, 0.465467f, 0.465637f, 0.465807f,
+ 0.465977f, 0.466146f, 0.466316f, 0.466485f, 0.466655f, 0.466825f, 0.466994f, 0.467164f,
+ 0.467333f, 0.467503f, 0.467672f, 0.467842f, 0.468011f, 0.468181f, 0.468350f, 0.468519f,
+ 0.468689f, 0.468858f, 0.469028f, 0.469197f, 0.469366f, 0.469536f, 0.469705f, 0.469874f,
+ 0.470043f, 0.470213f, 0.470382f, 0.470551f, 0.470720f, 0.470889f, 0.471058f, 0.471228f,
+ 0.471397f, 0.471566f, 0.471735f, 0.471904f, 0.472073f, 0.472242f, 0.472411f, 0.472580f,
+ 0.472749f, 0.472918f, 0.473087f, 0.473256f, 0.473425f, 0.473594f, 0.473763f, 0.473931f,
+ 0.474100f, 0.474269f, 0.474438f, 0.474607f, 0.474775f, 0.474944f, 0.475113f, 0.475282f,
+ 0.475450f, 0.475619f, 0.475788f, 0.475956f, 0.476125f, 0.476294f, 0.476462f, 0.476631f,
+ 0.476799f, 0.476968f, 0.477136f, 0.477305f, 0.477473f, 0.477642f, 0.477810f, 0.477979f,
+ 0.478147f, 0.478315f, 0.478484f, 0.478652f, 0.478821f, 0.478989f, 0.479157f, 0.479325f,
+ 0.479494f, 0.479662f, 0.479830f, 0.479998f, 0.480167f, 0.480335f, 0.480503f, 0.480671f,
+ 0.480839f, 0.481007f, 0.481176f, 0.481344f, 0.481512f, 0.481680f, 0.481848f, 0.482016f,
+ 0.482184f, 0.482352f, 0.482520f, 0.482688f, 0.482856f, 0.483023f, 0.483191f, 0.483359f,
+ 0.483527f, 0.483695f, 0.483863f, 0.484031f, 0.484198f, 0.484366f, 0.484534f, 0.484702f,
+ 0.484869f, 0.485037f, 0.485205f, 0.485372f, 0.485540f, 0.485708f, 0.485875f, 0.486043f,
+ 0.486210f, 0.486378f, 0.486545f, 0.486713f, 0.486880f, 0.487048f, 0.487215f, 0.487383f,
+ 0.487550f, 0.487718f, 0.487885f, 0.488052f, 0.488220f, 0.488387f, 0.488554f, 0.488722f,
+ 0.488889f, 0.489056f, 0.489223f, 0.489391f, 0.489558f, 0.489725f, 0.489892f, 0.490059f,
+ 0.490226f, 0.490394f, 0.490561f, 0.490728f, 0.490895f, 0.491062f, 0.491229f, 0.491396f,
+ 0.491563f, 0.491730f, 0.491897f, 0.492064f, 0.492231f, 0.492398f, 0.492564f, 0.492731f,
+ 0.492898f, 0.493065f, 0.493232f, 0.493399f, 0.493565f, 0.493732f, 0.493899f, 0.494066f,
+ 0.494232f, 0.494399f, 0.494566f, 0.494732f, 0.494899f, 0.495066f, 0.495232f, 0.495399f,
+ 0.495565f, 0.495732f, 0.495898f, 0.496065f, 0.496231f, 0.496398f, 0.496564f, 0.496731f,
+ 0.496897f, 0.497063f, 0.497230f, 0.497396f, 0.497562f, 0.497729f, 0.497895f, 0.498061f,
+ 0.498228f, 0.498394f, 0.498560f, 0.498726f, 0.498893f, 0.499059f, 0.499225f, 0.499391f,
+ 0.499557f, 0.499723f, 0.499889f, 0.500055f, 0.500221f, 0.500387f, 0.500553f, 0.500719f,
+ 0.500885f, 0.501051f, 0.501217f, 0.501383f, 0.501549f, 0.501715f, 0.501881f, 0.502047f,
+ 0.502212f, 0.502378f, 0.502544f, 0.502710f, 0.502876f, 0.503041f, 0.503207f, 0.503373f,
+ 0.503538f, 0.503704f, 0.503870f, 0.504035f, 0.504201f, 0.504366f, 0.504532f, 0.504698f,
+ 0.504863f, 0.505029f, 0.505194f, 0.505360f, 0.505525f, 0.505690f, 0.505856f, 0.506021f,
+ 0.506187f, 0.506352f, 0.506517f, 0.506683f, 0.506848f, 0.507013f, 0.507179f, 0.507344f,
+ 0.507509f, 0.507674f, 0.507839f, 0.508005f, 0.508170f, 0.508335f, 0.508500f, 0.508665f,
+ 0.508830f, 0.508995f, 0.509160f, 0.509325f, 0.509490f, 0.509655f, 0.509820f, 0.509985f,
+ 0.510150f, 0.510315f, 0.510480f, 0.510645f, 0.510810f, 0.510974f, 0.511139f, 0.511304f,
+ 0.511469f, 0.511634f, 0.511798f, 0.511963f, 0.512128f, 0.512292f, 0.512457f, 0.512622f,
+ 0.512786f, 0.512951f, 0.513116f, 0.513280f, 0.513445f, 0.513609f, 0.513774f, 0.513938f,
+ 0.514103f, 0.514267f, 0.514432f, 0.514596f, 0.514760f, 0.514925f, 0.515089f, 0.515254f,
+ 0.515418f, 0.515582f, 0.515746f, 0.515911f, 0.516075f, 0.516239f, 0.516403f, 0.516568f,
+ 0.516732f, 0.516896f, 0.517060f, 0.517224f, 0.517388f, 0.517552f, 0.517716f, 0.517880f,
+ 0.518045f, 0.518209f, 0.518372f, 0.518536f, 0.518700f, 0.518864f, 0.519028f, 0.519192f,
+ 0.519356f, 0.519520f, 0.519684f, 0.519848f, 0.520011f, 0.520175f, 0.520339f, 0.520503f,
+ 0.520666f, 0.520830f, 0.520994f, 0.521157f, 0.521321f, 0.521485f, 0.521648f, 0.521812f,
+ 0.521975f, 0.522139f, 0.522302f, 0.522466f, 0.522629f, 0.522793f, 0.522956f, 0.523120f,
+ 0.523283f, 0.523447f, 0.523610f, 0.523773f, 0.523937f, 0.524100f, 0.524263f, 0.524426f,
+ 0.524590f, 0.524753f, 0.524916f, 0.525079f, 0.525243f, 0.525406f, 0.525569f, 0.525732f,
+ 0.525895f, 0.526058f, 0.526221f, 0.526384f, 0.526547f, 0.526710f, 0.526873f, 0.527036f,
+ 0.527199f, 0.527362f, 0.527525f, 0.527688f, 0.527851f, 0.528014f, 0.528176f, 0.528339f,
+ 0.528502f, 0.528665f, 0.528828f, 0.528990f, 0.529153f, 0.529316f, 0.529478f, 0.529641f,
+ 0.529804f, 0.529966f, 0.530129f, 0.530291f, 0.530454f, 0.530617f, 0.530779f, 0.530942f,
+ 0.531104f, 0.531266f, 0.531429f, 0.531591f, 0.531754f, 0.531916f, 0.532078f, 0.532241f,
+ 0.532403f, 0.532565f, 0.532728f, 0.532890f, 0.533052f, 0.533214f, 0.533377f, 0.533539f,
+ 0.533701f, 0.533863f, 0.534025f, 0.534187f, 0.534349f, 0.534512f, 0.534674f, 0.534836f,
+ 0.534998f, 0.535160f, 0.535322f, 0.535484f, 0.535645f, 0.535807f, 0.535969f, 0.536131f,
+ 0.536293f, 0.536455f, 0.536617f, 0.536778f, 0.536940f, 0.537102f, 0.537264f, 0.537425f,
+ 0.537587f, 0.537749f, 0.537910f, 0.538072f, 0.538234f, 0.538395f, 0.538557f, 0.538718f,
+ 0.538880f, 0.539041f, 0.539203f, 0.539364f, 0.539526f, 0.539687f, 0.539849f, 0.540010f,
+ 0.540171f, 0.540333f, 0.540494f, 0.540655f, 0.540817f, 0.540978f, 0.541139f, 0.541301f,
+ 0.541462f, 0.541623f, 0.541784f, 0.541945f, 0.542106f, 0.542268f, 0.542429f, 0.542590f,
+ 0.542751f, 0.542912f, 0.543073f, 0.543234f, 0.543395f, 0.543556f, 0.543717f, 0.543878f,
+ 0.544039f, 0.544199f, 0.544360f, 0.544521f, 0.544682f, 0.544843f, 0.545003f, 0.545164f,
+ 0.545325f, 0.545486f, 0.545646f, 0.545807f, 0.545968f, 0.546128f, 0.546289f, 0.546450f,
+ 0.546610f, 0.546771f, 0.546931f, 0.547092f, 0.547252f, 0.547413f, 0.547573f, 0.547734f,
+ 0.547894f, 0.548054f, 0.548215f, 0.548375f, 0.548536f, 0.548696f, 0.548856f, 0.549016f,
+ 0.549177f, 0.549337f, 0.549497f, 0.549657f, 0.549818f, 0.549978f, 0.550138f, 0.550298f,
+ 0.550458f, 0.550618f, 0.550778f, 0.550938f, 0.551098f, 0.551258f, 0.551418f, 0.551578f,
+ 0.551738f, 0.551898f, 0.552058f, 0.552218f, 0.552378f, 0.552537f, 0.552697f, 0.552857f,
+ 0.553017f, 0.553176f, 0.553336f, 0.553496f, 0.553656f, 0.553815f, 0.553975f, 0.554134f,
+ 0.554294f, 0.554454f, 0.554613f, 0.554773f, 0.554932f, 0.555092f, 0.555251f, 0.555411f,
+ 0.555570f, 0.555730f, 0.555889f, 0.556048f, 0.556208f, 0.556367f, 0.556526f, 0.556686f,
+ 0.556845f, 0.557004f, 0.557164f, 0.557323f, 0.557482f, 0.557641f, 0.557800f, 0.557959f,
+ 0.558119f, 0.558278f, 0.558437f, 0.558596f, 0.558755f, 0.558914f, 0.559073f, 0.559232f,
+ 0.559391f, 0.559550f, 0.559709f, 0.559867f, 0.560026f, 0.560185f, 0.560344f, 0.560503f,
+ 0.560662f, 0.560820f, 0.560979f, 0.561138f, 0.561297f, 0.561455f, 0.561614f, 0.561773f,
+ 0.561931f, 0.562090f, 0.562248f, 0.562407f, 0.562565f, 0.562724f, 0.562882f, 0.563041f,
+ 0.563199f, 0.563358f, 0.563516f, 0.563675f, 0.563833f, 0.563991f, 0.564150f, 0.564308f,
+ 0.564466f, 0.564624f, 0.564783f, 0.564941f, 0.565099f, 0.565257f, 0.565416f, 0.565574f,
+ 0.565732f, 0.565890f, 0.566048f, 0.566206f, 0.566364f, 0.566522f, 0.566680f, 0.566838f,
+ 0.566996f, 0.567154f, 0.567312f, 0.567470f, 0.567628f, 0.567786f, 0.567943f, 0.568101f,
+ 0.568259f, 0.568417f, 0.568574f, 0.568732f, 0.568890f, 0.569048f, 0.569205f, 0.569363f,
+ 0.569521f, 0.569678f, 0.569836f, 0.569993f, 0.570151f, 0.570308f, 0.570466f, 0.570623f,
+ 0.570781f, 0.570938f, 0.571096f, 0.571253f, 0.571410f, 0.571568f, 0.571725f, 0.571882f,
+ 0.572040f, 0.572197f, 0.572354f, 0.572511f, 0.572669f, 0.572826f, 0.572983f, 0.573140f,
+ 0.573297f, 0.573454f, 0.573611f, 0.573768f, 0.573925f, 0.574082f, 0.574239f, 0.574396f,
+ 0.574553f, 0.574710f, 0.574867f, 0.575024f, 0.575181f, 0.575338f, 0.575495f, 0.575651f,
+ 0.575808f, 0.575965f, 0.576122f, 0.576278f, 0.576435f, 0.576592f, 0.576748f, 0.576905f,
+ 0.577062f, 0.577218f, 0.577375f, 0.577531f, 0.577688f, 0.577844f, 0.578001f, 0.578157f,
+ 0.578314f, 0.578470f, 0.578627f, 0.578783f, 0.578939f, 0.579096f, 0.579252f, 0.579408f,
+ 0.579565f, 0.579721f, 0.579877f, 0.580033f, 0.580189f, 0.580346f, 0.580502f, 0.580658f,
+ 0.580814f, 0.580970f, 0.581126f, 0.581282f, 0.581438f, 0.581594f, 0.581750f, 0.581906f,
+ 0.582062f, 0.582218f, 0.582374f, 0.582530f, 0.582685f, 0.582841f, 0.582997f, 0.583153f,
+ 0.583309f, 0.583464f, 0.583620f, 0.583776f, 0.583931f, 0.584087f, 0.584243f, 0.584398f,
+ 0.584554f, 0.584710f, 0.584865f, 0.585021f, 0.585176f, 0.585332f, 0.585487f, 0.585642f,
+ 0.585798f, 0.585953f, 0.586109f, 0.586264f, 0.586419f, 0.586575f, 0.586730f, 0.586885f,
+ 0.587040f, 0.587196f, 0.587351f, 0.587506f, 0.587661f, 0.587816f, 0.587971f, 0.588126f,
+ 0.588282f, 0.588437f, 0.588592f, 0.588747f, 0.588902f, 0.589057f, 0.589212f, 0.589366f,
+ 0.589521f, 0.589676f, 0.589831f, 0.589986f, 0.590141f, 0.590295f, 0.590450f, 0.590605f,
+ 0.590760f, 0.590914f, 0.591069f, 0.591224f, 0.591378f, 0.591533f, 0.591688f, 0.591842f,
+ 0.591997f, 0.592151f, 0.592306f, 0.592460f, 0.592615f, 0.592769f, 0.592924f, 0.593078f,
+ 0.593232f, 0.593387f, 0.593541f, 0.593695f, 0.593850f, 0.594004f, 0.594158f, 0.594312f,
+ 0.594467f, 0.594621f, 0.594775f, 0.594929f, 0.595083f, 0.595237f, 0.595391f, 0.595545f,
+ 0.595699f, 0.595853f, 0.596007f, 0.596161f, 0.596315f, 0.596469f, 0.596623f, 0.596777f,
+ 0.596931f, 0.597085f, 0.597238f, 0.597392f, 0.597546f, 0.597700f, 0.597853f, 0.598007f,
+ 0.598161f, 0.598314f, 0.598468f, 0.598622f, 0.598775f, 0.598929f, 0.599082f, 0.599236f,
+ 0.599389f, 0.599543f, 0.599696f, 0.599850f, 0.600003f, 0.600156f, 0.600310f, 0.600463f,
+ 0.600616f, 0.600770f, 0.600923f, 0.601076f, 0.601230f, 0.601383f, 0.601536f, 0.601689f,
+ 0.601842f, 0.601995f, 0.602148f, 0.602302f, 0.602455f, 0.602608f, 0.602761f, 0.602914f,
+ 0.603067f, 0.603220f, 0.603372f, 0.603525f, 0.603678f, 0.603831f, 0.603984f, 0.604137f,
+ 0.604290f, 0.604442f, 0.604595f, 0.604748f, 0.604900f, 0.605053f, 0.605206f, 0.605358f,
+ 0.605511f, 0.605664f, 0.605816f, 0.605969f, 0.606121f, 0.606274f, 0.606426f, 0.606579f,
+ 0.606731f, 0.606884f, 0.607036f, 0.607188f, 0.607341f, 0.607493f, 0.607645f, 0.607798f,
+ 0.607950f, 0.608102f, 0.608254f, 0.608406f, 0.608559f, 0.608711f, 0.608863f, 0.609015f,
+ 0.609167f, 0.609319f, 0.609471f, 0.609623f, 0.609775f, 0.609927f, 0.610079f, 0.610231f,
+ 0.610383f, 0.610535f, 0.610687f, 0.610838f, 0.610990f, 0.611142f, 0.611294f, 0.611445f,
+ 0.611597f, 0.611749f, 0.611901f, 0.612052f, 0.612204f, 0.612355f, 0.612507f, 0.612659f,
+ 0.612810f, 0.612962f, 0.613113f, 0.613265f, 0.613416f, 0.613567f, 0.613719f, 0.613870f,
+ 0.614022f, 0.614173f, 0.614324f, 0.614475f, 0.614627f, 0.614778f, 0.614929f, 0.615080f,
+ 0.615232f, 0.615383f, 0.615534f, 0.615685f, 0.615836f, 0.615987f, 0.616138f, 0.616289f,
+ 0.616440f, 0.616591f, 0.616742f, 0.616893f, 0.617044f, 0.617195f, 0.617346f, 0.617496f,
+ 0.617647f, 0.617798f, 0.617949f, 0.618100f, 0.618250f, 0.618401f, 0.618552f, 0.618702f,
+ 0.618853f, 0.619004f, 0.619154f, 0.619305f, 0.619455f, 0.619606f, 0.619756f, 0.619907f,
+ 0.620057f, 0.620208f, 0.620358f, 0.620508f, 0.620659f, 0.620809f, 0.620959f, 0.621110f,
+ 0.621260f, 0.621410f, 0.621560f, 0.621711f, 0.621861f, 0.622011f, 0.622161f, 0.622311f,
+ 0.622461f, 0.622611f, 0.622761f, 0.622911f, 0.623061f, 0.623211f, 0.623361f, 0.623511f,
+ 0.623661f, 0.623811f, 0.623961f, 0.624111f, 0.624260f, 0.624410f, 0.624560f, 0.624710f,
+ 0.624860f, 0.625009f, 0.625159f, 0.625309f, 0.625458f, 0.625608f, 0.625757f, 0.625907f,
+ 0.626056f, 0.626206f, 0.626355f, 0.626505f, 0.626654f, 0.626804f, 0.626953f, 0.627102f,
+ 0.627252f, 0.627401f, 0.627550f, 0.627700f, 0.627849f, 0.627998f, 0.628147f, 0.628297f,
+ 0.628446f, 0.628595f, 0.628744f, 0.628893f, 0.629042f, 0.629191f, 0.629340f, 0.629489f,
+ 0.629638f, 0.629787f, 0.629936f, 0.630085f, 0.630234f, 0.630383f, 0.630532f, 0.630680f,
+ 0.630829f, 0.630978f, 0.631127f, 0.631275f, 0.631424f, 0.631573f, 0.631721f, 0.631870f,
+ 0.632019f, 0.632167f, 0.632316f, 0.632464f, 0.632613f, 0.632761f, 0.632910f, 0.633058f,
+ 0.633207f, 0.633355f, 0.633504f, 0.633652f, 0.633800f, 0.633949f, 0.634097f, 0.634245f,
+ 0.634393f, 0.634542f, 0.634690f, 0.634838f, 0.634986f, 0.635134f, 0.635282f, 0.635430f,
+ 0.635578f, 0.635726f, 0.635874f, 0.636022f, 0.636170f, 0.636318f, 0.636466f, 0.636614f,
+ 0.636762f, 0.636910f, 0.637057f, 0.637205f, 0.637353f, 0.637501f, 0.637649f, 0.637796f,
+ 0.637944f, 0.638092f, 0.638239f, 0.638387f, 0.638534f, 0.638682f, 0.638829f, 0.638977f,
+ 0.639124f, 0.639272f, 0.639419f, 0.639567f, 0.639714f, 0.639862f, 0.640009f, 0.640156f,
+ 0.640303f, 0.640451f, 0.640598f, 0.640745f, 0.640892f, 0.641040f, 0.641187f, 0.641334f,
+ 0.641481f, 0.641628f, 0.641775f, 0.641922f, 0.642069f, 0.642216f, 0.642363f, 0.642510f,
+ 0.642657f, 0.642804f, 0.642951f, 0.643098f, 0.643245f, 0.643391f, 0.643538f, 0.643685f,
+ 0.643832f, 0.643978f, 0.644125f, 0.644272f, 0.644418f, 0.644565f, 0.644711f, 0.644858f,
+ 0.645005f, 0.645151f, 0.645298f, 0.645444f, 0.645590f, 0.645737f, 0.645883f, 0.646030f,
+ 0.646176f, 0.646322f, 0.646469f, 0.646615f, 0.646761f, 0.646907f, 0.647054f, 0.647200f,
+ 0.647346f, 0.647492f, 0.647638f, 0.647784f, 0.647930f, 0.648076f, 0.648222f, 0.648368f,
+ 0.648514f, 0.648660f, 0.648806f, 0.648952f, 0.649098f, 0.649244f, 0.649390f, 0.649536f,
+ 0.649681f, 0.649827f, 0.649973f, 0.650119f, 0.650264f, 0.650410f, 0.650555f, 0.650701f,
+ 0.650847f, 0.650992f, 0.651138f, 0.651283f, 0.651429f, 0.651574f, 0.651720f, 0.651865f,
+ 0.652011f, 0.652156f, 0.652301f, 0.652447f, 0.652592f, 0.652737f, 0.652882f, 0.653028f,
+ 0.653173f, 0.653318f, 0.653463f, 0.653608f, 0.653753f, 0.653899f, 0.654044f, 0.654189f,
+ 0.654334f, 0.654479f, 0.654624f, 0.654769f, 0.654913f, 0.655058f, 0.655203f, 0.655348f,
+ 0.655493f, 0.655638f, 0.655782f, 0.655927f, 0.656072f, 0.656217f, 0.656361f, 0.656506f,
+ 0.656651f, 0.656795f, 0.656940f, 0.657084f, 0.657229f, 0.657373f, 0.657518f, 0.657662f,
+ 0.657807f, 0.657951f, 0.658095f, 0.658240f, 0.658384f, 0.658529f, 0.658673f, 0.658817f,
+ 0.658961f, 0.659105f, 0.659250f, 0.659394f, 0.659538f, 0.659682f, 0.659826f, 0.659970f,
+ 0.660114f, 0.660258f, 0.660402f, 0.660546f, 0.660690f, 0.660834f, 0.660978f, 0.661122f,
+ 0.661266f, 0.661410f, 0.661553f, 0.661697f, 0.661841f, 0.661985f, 0.662128f, 0.662272f,
+ 0.662416f, 0.662559f, 0.662703f, 0.662847f, 0.662990f, 0.663134f, 0.663277f, 0.663421f,
+ 0.663564f, 0.663708f, 0.663851f, 0.663994f, 0.664138f, 0.664281f, 0.664424f, 0.664568f,
+ 0.664711f, 0.664854f, 0.664997f, 0.665141f, 0.665284f, 0.665427f, 0.665570f, 0.665713f,
+ 0.665856f, 0.665999f, 0.666142f, 0.666285f, 0.666428f, 0.666571f, 0.666714f, 0.666857f,
+ 0.667000f, 0.667143f, 0.667286f, 0.667428f, 0.667571f, 0.667714f, 0.667857f, 0.667999f,
+ 0.668142f, 0.668285f, 0.668427f, 0.668570f, 0.668712f, 0.668855f, 0.668998f, 0.669140f,
+ 0.669283f, 0.669425f, 0.669567f, 0.669710f, 0.669852f, 0.669995f, 0.670137f, 0.670279f,
+ 0.670422f, 0.670564f, 0.670706f, 0.670848f, 0.670990f, 0.671133f, 0.671275f, 0.671417f,
+ 0.671559f, 0.671701f, 0.671843f, 0.671985f, 0.672127f, 0.672269f, 0.672411f, 0.672553f,
+ 0.672695f, 0.672837f, 0.672978f, 0.673120f, 0.673262f, 0.673404f, 0.673546f, 0.673687f,
+ 0.673829f, 0.673971f, 0.674112f, 0.674254f, 0.674396f, 0.674537f, 0.674679f, 0.674820f,
+ 0.674962f, 0.675103f, 0.675245f, 0.675386f, 0.675527f, 0.675669f, 0.675810f, 0.675951f,
+ 0.676093f, 0.676234f, 0.676375f, 0.676516f, 0.676658f, 0.676799f, 0.676940f, 0.677081f,
+ 0.677222f, 0.677363f, 0.677504f, 0.677645f, 0.677786f, 0.677927f, 0.678068f, 0.678209f,
+ 0.678350f, 0.678491f, 0.678632f, 0.678773f, 0.678913f, 0.679054f, 0.679195f, 0.679336f,
+ 0.679476f, 0.679617f, 0.679758f, 0.679898f, 0.680039f, 0.680179f, 0.680320f, 0.680461f,
+ 0.680601f, 0.680741f, 0.680882f, 0.681022f, 0.681163f, 0.681303f, 0.681443f, 0.681584f,
+ 0.681724f, 0.681864f, 0.682005f, 0.682145f, 0.682285f, 0.682425f, 0.682565f, 0.682705f,
+ 0.682846f, 0.682986f, 0.683126f, 0.683266f, 0.683406f, 0.683546f, 0.683686f, 0.683825f,
+ 0.683965f, 0.684105f, 0.684245f, 0.684385f, 0.684525f, 0.684664f, 0.684804f, 0.684944f,
+ 0.685084f, 0.685223f, 0.685363f, 0.685503f, 0.685642f, 0.685782f, 0.685921f, 0.686061f,
+ 0.686200f, 0.686340f, 0.686479f, 0.686619f, 0.686758f, 0.686897f, 0.687037f, 0.687176f,
+ 0.687315f, 0.687455f, 0.687594f, 0.687733f, 0.687872f, 0.688011f, 0.688151f, 0.688290f,
+ 0.688429f, 0.688568f, 0.688707f, 0.688846f, 0.688985f, 0.689124f, 0.689263f, 0.689402f,
+ 0.689541f, 0.689679f, 0.689818f, 0.689957f, 0.690096f, 0.690235f, 0.690373f, 0.690512f,
+ 0.690651f, 0.690789f, 0.690928f, 0.691067f, 0.691205f, 0.691344f, 0.691482f, 0.691621f,
+ 0.691759f, 0.691898f, 0.692036f, 0.692175f, 0.692313f, 0.692451f, 0.692590f, 0.692728f,
+ 0.692866f, 0.693004f, 0.693143f, 0.693281f, 0.693419f, 0.693557f, 0.693695f, 0.693833f,
+ 0.693971f, 0.694109f, 0.694248f, 0.694386f, 0.694524f, 0.694661f, 0.694799f, 0.694937f,
+ 0.695075f, 0.695213f, 0.695351f, 0.695489f, 0.695626f, 0.695764f, 0.695902f, 0.696039f,
+ 0.696177f, 0.696315f, 0.696452f, 0.696590f, 0.696728f, 0.696865f, 0.697003f, 0.697140f,
+ 0.697277f, 0.697415f, 0.697552f, 0.697690f, 0.697827f, 0.697964f, 0.698102f, 0.698239f,
+ 0.698376f, 0.698513f, 0.698651f, 0.698788f, 0.698925f, 0.699062f, 0.699199f, 0.699336f,
+ 0.699473f, 0.699610f, 0.699747f, 0.699884f, 0.700021f, 0.700158f, 0.700295f, 0.700432f,
+ 0.700569f, 0.700706f, 0.700842f, 0.700979f, 0.701116f, 0.701253f, 0.701389f, 0.701526f,
+ 0.701663f, 0.701799f, 0.701936f, 0.702072f, 0.702209f, 0.702345f, 0.702482f, 0.702618f,
+ 0.702755f, 0.702891f, 0.703028f, 0.703164f, 0.703300f, 0.703436f, 0.703573f, 0.703709f,
+ 0.703845f, 0.703981f, 0.704118f, 0.704254f, 0.704390f, 0.704526f, 0.704662f, 0.704798f,
+ 0.704934f, 0.705070f, 0.705206f, 0.705342f, 0.705478f, 0.705614f, 0.705750f, 0.705885f,
+ 0.706021f, 0.706157f, 0.706293f, 0.706429f, 0.706564f, 0.706700f, 0.706836f, 0.706971f,
+ 0.707107f, 0.707242f, 0.707378f, 0.707513f, 0.707649f, 0.707784f, 0.707920f, 0.708055f,
+ 0.708191f, 0.708326f, 0.708461f, 0.708597f, 0.708732f, 0.708867f, 0.709002f, 0.709138f,
+ 0.709273f, 0.709408f, 0.709543f, 0.709678f, 0.709813f, 0.709948f, 0.710083f, 0.710218f,
+ 0.710353f, 0.710488f, 0.710623f, 0.710758f, 0.710893f, 0.711028f, 0.711163f, 0.711297f,
+ 0.711432f, 0.711567f, 0.711702f, 0.711836f, 0.711971f, 0.712106f, 0.712240f, 0.712375f,
+ 0.712509f, 0.712644f, 0.712778f, 0.712913f, 0.713047f, 0.713182f, 0.713316f, 0.713451f,
+ 0.713585f, 0.713719f, 0.713853f, 0.713988f, 0.714122f, 0.714256f, 0.714390f, 0.714525f,
+ 0.714659f, 0.714793f, 0.714927f, 0.715061f, 0.715195f, 0.715329f, 0.715463f, 0.715597f,
+ 0.715731f, 0.715865f, 0.715999f, 0.716132f, 0.716266f, 0.716400f, 0.716534f, 0.716668f,
+ 0.716801f, 0.716935f, 0.717069f, 0.717202f, 0.717336f, 0.717469f, 0.717603f, 0.717737f,
+ 0.717870f, 0.718004f, 0.718137f, 0.718270f, 0.718404f, 0.718537f, 0.718670f, 0.718804f,
+ 0.718937f, 0.719070f, 0.719204f, 0.719337f, 0.719470f, 0.719603f, 0.719736f, 0.719869f,
+ 0.720003f, 0.720136f, 0.720269f, 0.720402f, 0.720535f, 0.720668f, 0.720800f, 0.720933f,
+ 0.721066f, 0.721199f, 0.721332f, 0.721465f, 0.721597f, 0.721730f, 0.721863f, 0.721996f,
+ 0.722128f, 0.722261f, 0.722393f, 0.722526f, 0.722659f, 0.722791f, 0.722924f, 0.723056f,
+ 0.723188f, 0.723321f, 0.723453f, 0.723586f, 0.723718f, 0.723850f, 0.723983f, 0.724115f,
+ 0.724247f, 0.724379f, 0.724511f, 0.724644f, 0.724776f, 0.724908f, 0.725040f, 0.725172f,
+ 0.725304f, 0.725436f, 0.725568f, 0.725700f, 0.725832f, 0.725964f, 0.726095f, 0.726227f,
+ 0.726359f, 0.726491f, 0.726623f, 0.726754f, 0.726886f, 0.727018f, 0.727149f, 0.727281f,
+ 0.727413f, 0.727544f, 0.727676f, 0.727807f, 0.727939f, 0.728070f, 0.728202f, 0.728333f,
+ 0.728464f, 0.728596f, 0.728727f, 0.728858f, 0.728990f, 0.729121f, 0.729252f, 0.729383f,
+ 0.729514f, 0.729646f, 0.729777f, 0.729908f, 0.730039f, 0.730170f, 0.730301f, 0.730432f,
+ 0.730563f, 0.730694f, 0.730825f, 0.730955f, 0.731086f, 0.731217f, 0.731348f, 0.731479f,
+ 0.731609f, 0.731740f, 0.731871f, 0.732001f, 0.732132f, 0.732263f, 0.732393f, 0.732524f,
+ 0.732654f, 0.732785f, 0.732915f, 0.733046f, 0.733176f, 0.733306f, 0.733437f, 0.733567f,
+ 0.733697f, 0.733828f, 0.733958f, 0.734088f, 0.734218f, 0.734349f, 0.734479f, 0.734609f,
+ 0.734739f, 0.734869f, 0.734999f, 0.735129f, 0.735259f, 0.735389f, 0.735519f, 0.735649f,
+ 0.735779f, 0.735908f, 0.736038f, 0.736168f, 0.736298f, 0.736428f, 0.736557f, 0.736687f,
+ 0.736817f, 0.736946f, 0.737076f, 0.737205f, 0.737335f, 0.737464f, 0.737594f, 0.737723f,
+ 0.737853f, 0.737982f, 0.738112f, 0.738241f, 0.738370f, 0.738500f, 0.738629f, 0.738758f,
+ 0.738887f, 0.739017f, 0.739146f, 0.739275f, 0.739404f, 0.739533f, 0.739662f, 0.739791f,
+ 0.739920f, 0.740049f, 0.740178f, 0.740307f, 0.740436f, 0.740565f, 0.740694f, 0.740822f,
+ 0.740951f, 0.741080f, 0.741209f, 0.741337f, 0.741466f, 0.741595f, 0.741723f, 0.741852f,
+ 0.741980f, 0.742109f, 0.742237f, 0.742366f, 0.742494f, 0.742623f, 0.742751f, 0.742880f,
+ 0.743008f, 0.743136f, 0.743265f, 0.743393f, 0.743521f, 0.743649f, 0.743777f, 0.743906f,
+ 0.744034f, 0.744162f, 0.744290f, 0.744418f, 0.744546f, 0.744674f, 0.744802f, 0.744930f,
+ 0.745058f, 0.745186f, 0.745314f, 0.745441f, 0.745569f, 0.745697f, 0.745825f, 0.745952f,
+ 0.746080f, 0.746208f, 0.746335f, 0.746463f, 0.746591f, 0.746718f, 0.746846f, 0.746973f,
+ 0.747101f, 0.747228f, 0.747355f, 0.747483f, 0.747610f, 0.747738f, 0.747865f, 0.747992f,
+ 0.748119f, 0.748247f, 0.748374f, 0.748501f, 0.748628f, 0.748755f, 0.748882f, 0.749009f,
+ 0.749136f, 0.749263f, 0.749390f, 0.749517f, 0.749644f, 0.749771f, 0.749898f, 0.750025f,
+ 0.750152f, 0.750278f, 0.750405f, 0.750532f, 0.750659f, 0.750785f, 0.750912f, 0.751039f,
+ 0.751165f, 0.751292f, 0.751418f, 0.751545f, 0.751671f, 0.751798f, 0.751924f, 0.752050f,
+ 0.752177f, 0.752303f, 0.752429f, 0.752556f, 0.752682f, 0.752808f, 0.752934f, 0.753061f,
+ 0.753187f, 0.753313f, 0.753439f, 0.753565f, 0.753691f, 0.753817f, 0.753943f, 0.754069f,
+ 0.754195f, 0.754321f, 0.754447f, 0.754573f, 0.754698f, 0.754824f, 0.754950f, 0.755076f,
+ 0.755201f, 0.755327f, 0.755453f, 0.755578f, 0.755704f, 0.755829f, 0.755955f, 0.756081f,
+ 0.756206f, 0.756331f, 0.756457f, 0.756582f, 0.756708f, 0.756833f, 0.756958f, 0.757084f,
+ 0.757209f, 0.757334f, 0.757459f, 0.757584f, 0.757710f, 0.757835f, 0.757960f, 0.758085f,
+ 0.758210f, 0.758335f, 0.758460f, 0.758585f, 0.758710f, 0.758835f, 0.758960f, 0.759084f,
+ 0.759209f, 0.759334f, 0.759459f, 0.759583f, 0.759708f, 0.759833f, 0.759957f, 0.760082f,
+ 0.760207f, 0.760331f, 0.760456f, 0.760580f, 0.760705f, 0.760829f, 0.760954f, 0.761078f,
+ 0.761202f, 0.761327f, 0.761451f, 0.761575f, 0.761700f, 0.761824f, 0.761948f, 0.762072f,
+ 0.762196f, 0.762320f, 0.762444f, 0.762569f, 0.762693f, 0.762817f, 0.762941f, 0.763065f,
+ 0.763188f, 0.763312f, 0.763436f, 0.763560f, 0.763684f, 0.763808f, 0.763931f, 0.764055f,
+ 0.764179f, 0.764302f, 0.764426f, 0.764550f, 0.764673f, 0.764797f, 0.764920f, 0.765044f,
+ 0.765167f, 0.765291f, 0.765414f, 0.765538f, 0.765661f, 0.765784f, 0.765907f, 0.766031f,
+ 0.766154f, 0.766277f, 0.766400f, 0.766524f, 0.766647f, 0.766770f, 0.766893f, 0.767016f,
+ 0.767139f, 0.767262f, 0.767385f, 0.767508f, 0.767631f, 0.767754f, 0.767876f, 0.767999f,
+ 0.768122f, 0.768245f, 0.768368f, 0.768490f, 0.768613f, 0.768736f, 0.768858f, 0.768981f,
+ 0.769103f, 0.769226f, 0.769348f, 0.769471f, 0.769593f, 0.769716f, 0.769838f, 0.769961f,
+ 0.770083f, 0.770205f, 0.770327f, 0.770450f, 0.770572f, 0.770694f, 0.770816f, 0.770938f,
+ 0.771061f, 0.771183f, 0.771305f, 0.771427f, 0.771549f, 0.771671f, 0.771793f, 0.771915f,
+ 0.772036f, 0.772158f, 0.772280f, 0.772402f, 0.772524f, 0.772645f, 0.772767f, 0.772889f,
+ 0.773010f, 0.773132f, 0.773254f, 0.773375f, 0.773497f, 0.773618f, 0.773740f, 0.773861f,
+ 0.773983f, 0.774104f, 0.774225f, 0.774347f, 0.774468f, 0.774589f, 0.774711f, 0.774832f,
+ 0.774953f, 0.775074f, 0.775195f, 0.775317f, 0.775438f, 0.775559f, 0.775680f, 0.775801f,
+ 0.775922f, 0.776043f, 0.776164f, 0.776284f, 0.776405f, 0.776526f, 0.776647f, 0.776768f,
+ 0.776888f, 0.777009f, 0.777130f, 0.777251f, 0.777371f, 0.777492f, 0.777612f, 0.777733f,
+ 0.777853f, 0.777974f, 0.778094f, 0.778215f, 0.778335f, 0.778456f, 0.778576f, 0.778696f,
+ 0.778817f, 0.778937f, 0.779057f, 0.779177f, 0.779297f, 0.779418f, 0.779538f, 0.779658f,
+ 0.779778f, 0.779898f, 0.780018f, 0.780138f, 0.780258f, 0.780378f, 0.780498f, 0.780617f,
+ 0.780737f, 0.780857f, 0.780977f, 0.781097f, 0.781216f, 0.781336f, 0.781456f, 0.781575f,
+ 0.781695f, 0.781814f, 0.781934f, 0.782053f, 0.782173f, 0.782292f, 0.782412f, 0.782531f,
+ 0.782651f, 0.782770f, 0.782889f, 0.783009f, 0.783128f, 0.783247f, 0.783366f, 0.783485f,
+ 0.783605f, 0.783724f, 0.783843f, 0.783962f, 0.784081f, 0.784200f, 0.784319f, 0.784438f,
+ 0.784557f, 0.784675f, 0.784794f, 0.784913f, 0.785032f, 0.785151f, 0.785269f, 0.785388f,
+ 0.785507f, 0.785625f, 0.785744f, 0.785863f, 0.785981f, 0.786100f, 0.786218f, 0.786337f,
+ 0.786455f, 0.786574f, 0.786692f, 0.786810f, 0.786929f, 0.787047f, 0.787165f, 0.787284f,
+ 0.787402f, 0.787520f, 0.787638f, 0.787756f, 0.787874f, 0.787992f, 0.788110f, 0.788228f,
+ 0.788346f, 0.788464f, 0.788582f, 0.788700f, 0.788818f, 0.788936f, 0.789054f, 0.789172f,
+ 0.789289f, 0.789407f, 0.789525f, 0.789642f, 0.789760f, 0.789878f, 0.789995f, 0.790113f,
+ 0.790230f, 0.790348f, 0.790465f, 0.790583f, 0.790700f, 0.790817f, 0.790935f, 0.791052f,
+ 0.791169f, 0.791287f, 0.791404f, 0.791521f, 0.791638f, 0.791755f, 0.791872f, 0.791990f,
+ 0.792107f, 0.792224f, 0.792341f, 0.792458f, 0.792575f, 0.792691f, 0.792808f, 0.792925f,
+ 0.793042f, 0.793159f, 0.793276f, 0.793392f, 0.793509f, 0.793626f, 0.793742f, 0.793859f,
+ 0.793975f, 0.794092f, 0.794209f, 0.794325f, 0.794442f, 0.794558f, 0.794674f, 0.794791f,
+ 0.794907f, 0.795023f, 0.795140f, 0.795256f, 0.795372f, 0.795488f, 0.795605f, 0.795721f,
+ 0.795837f, 0.795953f, 0.796069f, 0.796185f, 0.796301f, 0.796417f, 0.796533f, 0.796649f,
+ 0.796765f, 0.796881f, 0.796996f, 0.797112f, 0.797228f, 0.797344f, 0.797459f, 0.797575f,
+ 0.797691f, 0.797806f, 0.797922f, 0.798038f, 0.798153f, 0.798269f, 0.798384f, 0.798500f,
+ 0.798615f, 0.798730f, 0.798846f, 0.798961f, 0.799076f, 0.799192f, 0.799307f, 0.799422f,
+ 0.799537f, 0.799652f, 0.799768f, 0.799883f, 0.799998f, 0.800113f, 0.800228f, 0.800343f,
+ 0.800458f, 0.800573f, 0.800687f, 0.800802f, 0.800917f, 0.801032f, 0.801147f, 0.801261f,
+ 0.801376f, 0.801491f, 0.801606f, 0.801720f, 0.801835f, 0.801949f, 0.802064f, 0.802178f,
+ 0.802293f, 0.802407f, 0.802522f, 0.802636f, 0.802750f, 0.802865f, 0.802979f, 0.803093f,
+ 0.803208f, 0.803322f, 0.803436f, 0.803550f, 0.803664f, 0.803778f, 0.803892f, 0.804006f,
+ 0.804120f, 0.804234f, 0.804348f, 0.804462f, 0.804576f, 0.804690f, 0.804804f, 0.804918f,
+ 0.805031f, 0.805145f, 0.805259f, 0.805372f, 0.805486f, 0.805600f, 0.805713f, 0.805827f,
+ 0.805940f, 0.806054f, 0.806167f, 0.806281f, 0.806394f, 0.806508f, 0.806621f, 0.806734f,
+ 0.806848f, 0.806961f, 0.807074f, 0.807187f, 0.807300f, 0.807414f, 0.807527f, 0.807640f,
+ 0.807753f, 0.807866f, 0.807979f, 0.808092f, 0.808205f, 0.808318f, 0.808430f, 0.808543f,
+ 0.808656f, 0.808769f, 0.808882f, 0.808994f, 0.809107f, 0.809220f, 0.809332f, 0.809445f,
+ 0.809558f, 0.809670f, 0.809783f, 0.809895f, 0.810008f, 0.810120f, 0.810232f, 0.810345f,
+ 0.810457f, 0.810570f, 0.810682f, 0.810794f, 0.810906f, 0.811018f, 0.811131f, 0.811243f,
+ 0.811355f, 0.811467f, 0.811579f, 0.811691f, 0.811803f, 0.811915f, 0.812027f, 0.812139f,
+ 0.812251f, 0.812362f, 0.812474f, 0.812586f, 0.812698f, 0.812809f, 0.812921f, 0.813033f,
+ 0.813144f, 0.813256f, 0.813368f, 0.813479f, 0.813591f, 0.813702f, 0.813814f, 0.813925f,
+ 0.814036f, 0.814148f, 0.814259f, 0.814370f, 0.814482f, 0.814593f, 0.814704f, 0.814815f,
+ 0.814926f, 0.815037f, 0.815149f, 0.815260f, 0.815371f, 0.815482f, 0.815593f, 0.815704f,
+ 0.815814f, 0.815925f, 0.816036f, 0.816147f, 0.816258f, 0.816368f, 0.816479f, 0.816590f,
+ 0.816701f, 0.816811f, 0.816922f, 0.817032f, 0.817143f, 0.817253f, 0.817364f, 0.817474f,
+ 0.817585f, 0.817695f, 0.817806f, 0.817916f, 0.818026f, 0.818137f, 0.818247f, 0.818357f,
+ 0.818467f, 0.818577f, 0.818687f, 0.818798f, 0.818908f, 0.819018f, 0.819128f, 0.819238f,
+ 0.819348f, 0.819457f, 0.819567f, 0.819677f, 0.819787f, 0.819897f, 0.820007f, 0.820116f,
+ 0.820226f, 0.820336f, 0.820445f, 0.820555f, 0.820664f, 0.820774f, 0.820884f, 0.820993f,
+ 0.821102f, 0.821212f, 0.821321f, 0.821431f, 0.821540f, 0.821649f, 0.821759f, 0.821868f,
+ 0.821977f, 0.822086f, 0.822195f, 0.822305f, 0.822414f, 0.822523f, 0.822632f, 0.822741f,
+ 0.822850f, 0.822959f, 0.823068f, 0.823177f, 0.823285f, 0.823394f, 0.823503f, 0.823612f,
+ 0.823721f, 0.823829f, 0.823938f, 0.824047f, 0.824155f, 0.824264f, 0.824372f, 0.824481f,
+ 0.824589f, 0.824698f, 0.824806f, 0.824915f, 0.825023f, 0.825131f, 0.825240f, 0.825348f,
+ 0.825456f, 0.825564f, 0.825673f, 0.825781f, 0.825889f, 0.825997f, 0.826105f, 0.826213f,
+ 0.826321f, 0.826429f, 0.826537f, 0.826645f, 0.826753f, 0.826861f, 0.826968f, 0.827076f,
+ 0.827184f, 0.827292f, 0.827399f, 0.827507f, 0.827615f, 0.827722f, 0.827830f, 0.827938f,
+ 0.828045f, 0.828153f, 0.828260f, 0.828367f, 0.828475f, 0.828582f, 0.828690f, 0.828797f,
+ 0.828904f, 0.829011f, 0.829119f, 0.829226f, 0.829333f, 0.829440f, 0.829547f, 0.829654f,
+ 0.829761f, 0.829868f, 0.829975f, 0.830082f, 0.830189f, 0.830296f, 0.830403f, 0.830510f,
+ 0.830616f, 0.830723f, 0.830830f, 0.830937f, 0.831043f, 0.831150f, 0.831257f, 0.831363f,
+ 0.831470f, 0.831576f, 0.831683f, 0.831789f, 0.831895f, 0.832002f, 0.832108f, 0.832215f,
+ 0.832321f, 0.832427f, 0.832533f, 0.832640f, 0.832746f, 0.832852f, 0.832958f, 0.833064f,
+ 0.833170f, 0.833276f, 0.833382f, 0.833488f, 0.833594f, 0.833700f, 0.833806f, 0.833912f,
+ 0.834018f, 0.834123f, 0.834229f, 0.834335f, 0.834440f, 0.834546f, 0.834652f, 0.834757f,
+ 0.834863f, 0.834968f, 0.835074f, 0.835179f, 0.835285f, 0.835390f, 0.835496f, 0.835601f,
+ 0.835706f, 0.835812f, 0.835917f, 0.836022f, 0.836127f, 0.836232f, 0.836338f, 0.836443f,
+ 0.836548f, 0.836653f, 0.836758f, 0.836863f, 0.836968f, 0.837073f, 0.837178f, 0.837282f,
+ 0.837387f, 0.837492f, 0.837597f, 0.837701f, 0.837806f, 0.837911f, 0.838015f, 0.838120f,
+ 0.838225f, 0.838329f, 0.838434f, 0.838538f, 0.838643f, 0.838747f, 0.838852f, 0.838956f,
+ 0.839060f, 0.839165f, 0.839269f, 0.839373f, 0.839477f, 0.839581f, 0.839686f, 0.839790f,
+ 0.839894f, 0.839998f, 0.840102f, 0.840206f, 0.840310f, 0.840414f, 0.840518f, 0.840622f,
+ 0.840725f, 0.840829f, 0.840933f, 0.841037f, 0.841140f, 0.841244f, 0.841348f, 0.841451f,
+ 0.841555f, 0.841659f, 0.841762f, 0.841866f, 0.841969f, 0.842072f, 0.842176f, 0.842279f,
+ 0.842383f, 0.842486f, 0.842589f, 0.842692f, 0.842796f, 0.842899f, 0.843002f, 0.843105f,
+ 0.843208f, 0.843311f, 0.843414f, 0.843517f, 0.843620f, 0.843723f, 0.843826f, 0.843929f,
+ 0.844032f, 0.844135f, 0.844238f, 0.844340f, 0.844443f, 0.844546f, 0.844648f, 0.844751f,
+ 0.844854f, 0.844956f, 0.845059f, 0.845161f, 0.845264f, 0.845366f, 0.845469f, 0.845571f,
+ 0.845673f, 0.845776f, 0.845878f, 0.845980f, 0.846082f, 0.846185f, 0.846287f, 0.846389f,
+ 0.846491f, 0.846593f, 0.846695f, 0.846797f, 0.846899f, 0.847001f, 0.847103f, 0.847205f,
+ 0.847307f, 0.847408f, 0.847510f, 0.847612f, 0.847714f, 0.847815f, 0.847917f, 0.848019f,
+ 0.848120f, 0.848222f, 0.848323f, 0.848425f, 0.848526f, 0.848628f, 0.848729f, 0.848831f,
+ 0.848932f, 0.849033f, 0.849135f, 0.849236f, 0.849337f, 0.849438f, 0.849540f, 0.849641f,
+ 0.849742f, 0.849843f, 0.849944f, 0.850045f, 0.850146f, 0.850247f, 0.850348f, 0.850449f,
+ 0.850549f, 0.850650f, 0.850751f, 0.850852f, 0.850953f, 0.851053f, 0.851154f, 0.851255f,
+ 0.851355f, 0.851456f, 0.851556f, 0.851657f, 0.851757f, 0.851858f, 0.851958f, 0.852059f,
+ 0.852159f, 0.852259f, 0.852360f, 0.852460f, 0.852560f, 0.852660f, 0.852760f, 0.852861f,
+ 0.852961f, 0.853061f, 0.853161f, 0.853261f, 0.853361f, 0.853461f, 0.853561f, 0.853660f,
+ 0.853760f, 0.853860f, 0.853960f, 0.854060f, 0.854159f, 0.854259f, 0.854359f, 0.854458f,
+ 0.854558f, 0.854658f, 0.854757f, 0.854857f, 0.854956f, 0.855056f, 0.855155f, 0.855254f,
+ 0.855354f, 0.855453f, 0.855552f, 0.855651f, 0.855751f, 0.855850f, 0.855949f, 0.856048f,
+ 0.856147f, 0.856246f, 0.856345f, 0.856444f, 0.856543f, 0.856642f, 0.856741f, 0.856840f,
+ 0.856939f, 0.857038f, 0.857137f, 0.857235f, 0.857334f, 0.857433f, 0.857531f, 0.857630f,
+ 0.857729f, 0.857827f, 0.857926f, 0.858024f, 0.858123f, 0.858221f, 0.858320f, 0.858418f,
+ 0.858516f, 0.858615f, 0.858713f, 0.858811f, 0.858909f, 0.859007f, 0.859106f, 0.859204f,
+ 0.859302f, 0.859400f, 0.859498f, 0.859596f, 0.859694f, 0.859792f, 0.859890f, 0.859988f,
+ 0.860085f, 0.860183f, 0.860281f, 0.860379f, 0.860476f, 0.860574f, 0.860672f, 0.860769f,
+ 0.860867f, 0.860964f, 0.861062f, 0.861160f, 0.861257f, 0.861354f, 0.861452f, 0.861549f,
+ 0.861646f, 0.861744f, 0.861841f, 0.861938f, 0.862035f, 0.862133f, 0.862230f, 0.862327f,
+ 0.862424f, 0.862521f, 0.862618f, 0.862715f, 0.862812f, 0.862909f, 0.863006f, 0.863103f,
+ 0.863199f, 0.863296f, 0.863393f, 0.863490f, 0.863586f, 0.863683f, 0.863780f, 0.863876f,
+ 0.863973f, 0.864069f, 0.864166f, 0.864262f, 0.864359f, 0.864455f, 0.864552f, 0.864648f,
+ 0.864744f, 0.864841f, 0.864937f, 0.865033f, 0.865129f, 0.865225f, 0.865321f, 0.865418f,
+ 0.865514f, 0.865610f, 0.865706f, 0.865802f, 0.865898f, 0.865993f, 0.866089f, 0.866185f,
+ 0.866281f, 0.866377f, 0.866472f, 0.866568f, 0.866664f, 0.866759f, 0.866855f, 0.866951f,
+ 0.867046f, 0.867142f, 0.867237f, 0.867333f, 0.867428f, 0.867523f, 0.867619f, 0.867714f,
+ 0.867809f, 0.867905f, 0.868000f, 0.868095f, 0.868190f, 0.868285f, 0.868381f, 0.868476f,
+ 0.868571f, 0.868666f, 0.868761f, 0.868856f, 0.868951f, 0.869045f, 0.869140f, 0.869235f,
+ 0.869330f, 0.869425f, 0.869519f, 0.869614f, 0.869709f, 0.869803f, 0.869898f, 0.869992f,
+ 0.870087f, 0.870182f, 0.870276f, 0.870370f, 0.870465f, 0.870559f, 0.870654f, 0.870748f,
+ 0.870842f, 0.870936f, 0.871031f, 0.871125f, 0.871219f, 0.871313f, 0.871407f, 0.871501f,
+ 0.871595f, 0.871689f, 0.871783f, 0.871877f, 0.871971f, 0.872065f, 0.872159f, 0.872252f,
+ 0.872346f, 0.872440f, 0.872534f, 0.872627f, 0.872721f, 0.872814f, 0.872908f, 0.873001f,
+ 0.873095f, 0.873188f, 0.873282f, 0.873375f, 0.873469f, 0.873562f, 0.873655f, 0.873749f,
+ 0.873842f, 0.873935f, 0.874028f, 0.874121f, 0.874215f, 0.874308f, 0.874401f, 0.874494f,
+ 0.874587f, 0.874680f, 0.874773f, 0.874865f, 0.874958f, 0.875051f, 0.875144f, 0.875237f,
+ 0.875329f, 0.875422f, 0.875515f, 0.875607f, 0.875700f, 0.875793f, 0.875885f, 0.875978f,
+ 0.876070f, 0.876163f, 0.876255f, 0.876347f, 0.876440f, 0.876532f, 0.876624f, 0.876716f,
+ 0.876809f, 0.876901f, 0.876993f, 0.877085f, 0.877177f, 0.877269f, 0.877361f, 0.877453f,
+ 0.877545f, 0.877637f, 0.877729f, 0.877821f, 0.877913f, 0.878005f, 0.878096f, 0.878188f,
+ 0.878280f, 0.878371f, 0.878463f, 0.878555f, 0.878646f, 0.878738f, 0.878829f, 0.878921f,
+ 0.879012f, 0.879104f, 0.879195f, 0.879286f, 0.879378f, 0.879469f, 0.879560f, 0.879651f,
+ 0.879743f, 0.879834f, 0.879925f, 0.880016f, 0.880107f, 0.880198f, 0.880289f, 0.880380f,
+ 0.880471f, 0.880562f, 0.880653f, 0.880743f, 0.880834f, 0.880925f, 0.881016f, 0.881106f,
+ 0.881197f, 0.881288f, 0.881378f, 0.881469f, 0.881559f, 0.881650f, 0.881740f, 0.881831f,
+ 0.881921f, 0.882012f, 0.882102f, 0.882192f, 0.882283f, 0.882373f, 0.882463f, 0.882553f,
+ 0.882643f, 0.882733f, 0.882824f, 0.882914f, 0.883004f, 0.883094f, 0.883184f, 0.883273f,
+ 0.883363f, 0.883453f, 0.883543f, 0.883633f, 0.883723f, 0.883812f, 0.883902f, 0.883992f,
+ 0.884081f, 0.884171f, 0.884260f, 0.884350f, 0.884439f, 0.884529f, 0.884618f, 0.884708f,
+ 0.884797f, 0.884886f, 0.884976f, 0.885065f, 0.885154f, 0.885243f, 0.885333f, 0.885422f,
+ 0.885511f, 0.885600f, 0.885689f, 0.885778f, 0.885867f, 0.885956f, 0.886045f, 0.886134f,
+ 0.886223f, 0.886311f, 0.886400f, 0.886489f, 0.886578f, 0.886666f, 0.886755f, 0.886844f,
+ 0.886932f, 0.887021f, 0.887109f, 0.887198f, 0.887286f, 0.887375f, 0.887463f, 0.887551f,
+ 0.887640f, 0.887728f, 0.887816f, 0.887904f, 0.887993f, 0.888081f, 0.888169f, 0.888257f,
+ 0.888345f, 0.888433f, 0.888521f, 0.888609f, 0.888697f, 0.888785f, 0.888873f, 0.888961f,
+ 0.889048f, 0.889136f, 0.889224f, 0.889312f, 0.889399f, 0.889487f, 0.889574f, 0.889662f,
+ 0.889750f, 0.889837f, 0.889925f, 0.890012f, 0.890099f, 0.890187f, 0.890274f, 0.890361f,
+ 0.890449f, 0.890536f, 0.890623f, 0.890710f, 0.890797f, 0.890885f, 0.890972f, 0.891059f,
+ 0.891146f, 0.891233f, 0.891320f, 0.891407f, 0.891493f, 0.891580f, 0.891667f, 0.891754f,
+ 0.891841f, 0.891927f, 0.892014f, 0.892101f, 0.892187f, 0.892274f, 0.892361f, 0.892447f,
+ 0.892534f, 0.892620f, 0.892706f, 0.892793f, 0.892879f, 0.892965f, 0.893052f, 0.893138f,
+ 0.893224f, 0.893310f, 0.893397f, 0.893483f, 0.893569f, 0.893655f, 0.893741f, 0.893827f,
+ 0.893913f, 0.893999f, 0.894085f, 0.894171f, 0.894256f, 0.894342f, 0.894428f, 0.894514f,
+ 0.894599f, 0.894685f, 0.894771f, 0.894856f, 0.894942f, 0.895028f, 0.895113f, 0.895198f,
+ 0.895284f, 0.895369f, 0.895455f, 0.895540f, 0.895625f, 0.895711f, 0.895796f, 0.895881f,
+ 0.895966f, 0.896051f, 0.896137f, 0.896222f, 0.896307f, 0.896392f, 0.896477f, 0.896562f,
+ 0.896646f, 0.896731f, 0.896816f, 0.896901f, 0.896986f, 0.897071f, 0.897155f, 0.897240f,
+ 0.897325f, 0.897409f, 0.897494f, 0.897578f, 0.897663f, 0.897747f, 0.897832f, 0.897916f,
+ 0.898001f, 0.898085f, 0.898169f, 0.898254f, 0.898338f, 0.898422f, 0.898506f, 0.898590f,
+ 0.898674f, 0.898759f, 0.898843f, 0.898927f, 0.899011f, 0.899095f, 0.899179f, 0.899262f,
+ 0.899346f, 0.899430f, 0.899514f, 0.899598f, 0.899681f, 0.899765f, 0.899849f, 0.899932f,
+ 0.900016f, 0.900099f, 0.900183f, 0.900266f, 0.900350f, 0.900433f, 0.900517f, 0.900600f,
+ 0.900683f, 0.900767f, 0.900850f, 0.900933f, 0.901016f, 0.901100f, 0.901183f, 0.901266f,
+ 0.901349f, 0.901432f, 0.901515f, 0.901598f, 0.901681f, 0.901764f, 0.901847f, 0.901929f,
+ 0.902012f, 0.902095f, 0.902178f, 0.902260f, 0.902343f, 0.902426f, 0.902508f, 0.902591f,
+ 0.902673f, 0.902756f, 0.902838f, 0.902921f, 0.903003f, 0.903085f, 0.903168f, 0.903250f,
+ 0.903332f, 0.903415f, 0.903497f, 0.903579f, 0.903661f, 0.903743f, 0.903825f, 0.903907f,
+ 0.903989f, 0.904071f, 0.904153f, 0.904235f, 0.904317f, 0.904399f, 0.904481f, 0.904562f,
+ 0.904644f, 0.904726f, 0.904807f, 0.904889f, 0.904971f, 0.905052f, 0.905134f, 0.905215f,
+ 0.905297f, 0.905378f, 0.905460f, 0.905541f, 0.905622f, 0.905704f, 0.905785f, 0.905866f,
+ 0.905947f, 0.906028f, 0.906110f, 0.906191f, 0.906272f, 0.906353f, 0.906434f, 0.906515f,
+ 0.906596f, 0.906677f, 0.906757f, 0.906838f, 0.906919f, 0.907000f, 0.907081f, 0.907161f,
+ 0.907242f, 0.907323f, 0.907403f, 0.907484f, 0.907564f, 0.907645f, 0.907725f, 0.907806f,
+ 0.907886f, 0.907966f, 0.908047f, 0.908127f, 0.908207f, 0.908288f, 0.908368f, 0.908448f,
+ 0.908528f, 0.908608f, 0.908688f, 0.908768f, 0.908848f, 0.908928f, 0.909008f, 0.909088f,
+ 0.909168f, 0.909248f, 0.909328f, 0.909407f, 0.909487f, 0.909567f, 0.909646f, 0.909726f,
+ 0.909806f, 0.909885f, 0.909965f, 0.910044f, 0.910124f, 0.910203f, 0.910283f, 0.910362f,
+ 0.910441f, 0.910521f, 0.910600f, 0.910679f, 0.910758f, 0.910837f, 0.910917f, 0.910996f,
+ 0.911075f, 0.911154f, 0.911233f, 0.911312f, 0.911391f, 0.911470f, 0.911548f, 0.911627f,
+ 0.911706f, 0.911785f, 0.911864f, 0.911942f, 0.912021f, 0.912099f, 0.912178f, 0.912257f,
+ 0.912335f, 0.912414f, 0.912492f, 0.912571f, 0.912649f, 0.912727f, 0.912806f, 0.912884f,
+ 0.912962f, 0.913040f, 0.913119f, 0.913197f, 0.913275f, 0.913353f, 0.913431f, 0.913509f,
+ 0.913587f, 0.913665f, 0.913743f, 0.913821f, 0.913899f, 0.913976f, 0.914054f, 0.914132f,
+ 0.914210f, 0.914287f, 0.914365f, 0.914443f, 0.914520f, 0.914598f, 0.914675f, 0.914753f,
+ 0.914830f, 0.914908f, 0.914985f, 0.915062f, 0.915140f, 0.915217f, 0.915294f, 0.915372f,
+ 0.915449f, 0.915526f, 0.915603f, 0.915680f, 0.915757f, 0.915834f, 0.915911f, 0.915988f,
+ 0.916065f, 0.916142f, 0.916219f, 0.916296f, 0.916372f, 0.916449f, 0.916526f, 0.916602f,
+ 0.916679f, 0.916756f, 0.916832f, 0.916909f, 0.916985f, 0.917062f, 0.917138f, 0.917215f,
+ 0.917291f, 0.917367f, 0.917444f, 0.917520f, 0.917596f, 0.917672f, 0.917749f, 0.917825f,
+ 0.917901f, 0.917977f, 0.918053f, 0.918129f, 0.918205f, 0.918281f, 0.918357f, 0.918433f,
+ 0.918508f, 0.918584f, 0.918660f, 0.918736f, 0.918811f, 0.918887f, 0.918963f, 0.919038f,
+ 0.919114f, 0.919189f, 0.919265f, 0.919340f, 0.919416f, 0.919491f, 0.919567f, 0.919642f,
+ 0.919717f, 0.919792f, 0.919868f, 0.919943f, 0.920018f, 0.920093f, 0.920168f, 0.920243f,
+ 0.920318f, 0.920393f, 0.920468f, 0.920543f, 0.920618f, 0.920693f, 0.920768f, 0.920842f,
+ 0.920917f, 0.920992f, 0.921067f, 0.921141f, 0.921216f, 0.921291f, 0.921365f, 0.921440f,
+ 0.921514f, 0.921588f, 0.921663f, 0.921737f, 0.921812f, 0.921886f, 0.921960f, 0.922034f,
+ 0.922109f, 0.922183f, 0.922257f, 0.922331f, 0.922405f, 0.922479f, 0.922553f, 0.922627f,
+ 0.922701f, 0.922775f, 0.922849f, 0.922923f, 0.922997f, 0.923070f, 0.923144f, 0.923218f,
+ 0.923291f, 0.923365f, 0.923439f, 0.923512f, 0.923586f, 0.923659f, 0.923733f, 0.923806f,
+ 0.923880f, 0.923953f, 0.924026f, 0.924100f, 0.924173f, 0.924246f, 0.924319f, 0.924392f,
+ 0.924465f, 0.924539f, 0.924612f, 0.924685f, 0.924758f, 0.924831f, 0.924904f, 0.924976f,
+ 0.925049f, 0.925122f, 0.925195f, 0.925268f, 0.925340f, 0.925413f, 0.925486f, 0.925558f,
+ 0.925631f, 0.925703f, 0.925776f, 0.925848f, 0.925921f, 0.925993f, 0.926066f, 0.926138f,
+ 0.926210f, 0.926283f, 0.926355f, 0.926427f, 0.926499f, 0.926571f, 0.926643f, 0.926715f,
+ 0.926787f, 0.926859f, 0.926931f, 0.927003f, 0.927075f, 0.927147f, 0.927219f, 0.927291f,
+ 0.927363f, 0.927434f, 0.927506f, 0.927578f, 0.927649f, 0.927721f, 0.927792f, 0.927864f,
+ 0.927935f, 0.928007f, 0.928078f, 0.928150f, 0.928221f, 0.928292f, 0.928364f, 0.928435f,
+ 0.928506f, 0.928577f, 0.928648f, 0.928720f, 0.928791f, 0.928862f, 0.928933f, 0.929004f,
+ 0.929075f, 0.929146f, 0.929216f, 0.929287f, 0.929358f, 0.929429f, 0.929500f, 0.929570f,
+ 0.929641f, 0.929712f, 0.929782f, 0.929853f, 0.929923f, 0.929994f, 0.930064f, 0.930135f,
+ 0.930205f, 0.930275f, 0.930346f, 0.930416f, 0.930486f, 0.930556f, 0.930627f, 0.930697f,
+ 0.930767f, 0.930837f, 0.930907f, 0.930977f, 0.931047f, 0.931117f, 0.931187f, 0.931257f,
+ 0.931327f, 0.931397f, 0.931466f, 0.931536f, 0.931606f, 0.931675f, 0.931745f, 0.931815f,
+ 0.931884f, 0.931954f, 0.932023f, 0.932093f, 0.932162f, 0.932232f, 0.932301f, 0.932370f,
+ 0.932440f, 0.932509f, 0.932578f, 0.932647f, 0.932716f, 0.932786f, 0.932855f, 0.932924f,
+ 0.932993f, 0.933062f, 0.933131f, 0.933200f, 0.933269f, 0.933337f, 0.933406f, 0.933475f,
+ 0.933544f, 0.933612f, 0.933681f, 0.933750f, 0.933818f, 0.933887f, 0.933956f, 0.934024f,
+ 0.934093f, 0.934161f, 0.934229f, 0.934298f, 0.934366f, 0.934434f, 0.934503f, 0.934571f,
+ 0.934639f, 0.934707f, 0.934775f, 0.934844f, 0.934912f, 0.934980f, 0.935048f, 0.935116f,
+ 0.935184f, 0.935251f, 0.935319f, 0.935387f, 0.935455f, 0.935523f, 0.935590f, 0.935658f,
+ 0.935726f, 0.935793f, 0.935861f, 0.935928f, 0.935996f, 0.936063f, 0.936131f, 0.936198f,
+ 0.936266f, 0.936333f, 0.936400f, 0.936468f, 0.936535f, 0.936602f, 0.936669f, 0.936736f,
+ 0.936803f, 0.936871f, 0.936938f, 0.937005f, 0.937072f, 0.937138f, 0.937205f, 0.937272f,
+ 0.937339f, 0.937406f, 0.937473f, 0.937539f, 0.937606f, 0.937673f, 0.937739f, 0.937806f,
+ 0.937872f, 0.937939f, 0.938005f, 0.938072f, 0.938138f, 0.938205f, 0.938271f, 0.938337f,
+ 0.938404f, 0.938470f, 0.938536f, 0.938602f, 0.938668f, 0.938734f, 0.938800f, 0.938866f,
+ 0.938932f, 0.938998f, 0.939064f, 0.939130f, 0.939196f, 0.939262f, 0.939328f, 0.939394f,
+ 0.939459f, 0.939525f, 0.939591f, 0.939656f, 0.939722f, 0.939787f, 0.939853f, 0.939918f,
+ 0.939984f, 0.940049f, 0.940115f, 0.940180f, 0.940245f, 0.940310f, 0.940376f, 0.940441f,
+ 0.940506f, 0.940571f, 0.940636f, 0.940701f, 0.940766f, 0.940831f, 0.940896f, 0.940961f,
+ 0.941026f, 0.941091f, 0.941156f, 0.941221f, 0.941285f, 0.941350f, 0.941415f, 0.941479f,
+ 0.941544f, 0.941609f, 0.941673f, 0.941738f, 0.941802f, 0.941867f, 0.941931f, 0.941995f,
+ 0.942060f, 0.942124f, 0.942188f, 0.942253f, 0.942317f, 0.942381f, 0.942445f, 0.942509f,
+ 0.942573f, 0.942637f, 0.942701f, 0.942765f, 0.942829f, 0.942893f, 0.942957f, 0.943021f,
+ 0.943084f, 0.943148f, 0.943212f, 0.943276f, 0.943339f, 0.943403f, 0.943466f, 0.943530f,
+ 0.943593f, 0.943657f, 0.943720f, 0.943784f, 0.943847f, 0.943910f, 0.943974f, 0.944037f,
+ 0.944100f, 0.944163f, 0.944227f, 0.944290f, 0.944353f, 0.944416f, 0.944479f, 0.944542f,
+ 0.944605f, 0.944668f, 0.944731f, 0.944793f, 0.944856f, 0.944919f, 0.944982f, 0.945045f,
+ 0.945107f, 0.945170f, 0.945232f, 0.945295f, 0.945358f, 0.945420f, 0.945482f, 0.945545f,
+ 0.945607f, 0.945670f, 0.945732f, 0.945794f, 0.945857f, 0.945919f, 0.945981f, 0.946043f,
+ 0.946105f, 0.946167f, 0.946229f, 0.946291f, 0.946353f, 0.946415f, 0.946477f, 0.946539f,
+ 0.946601f, 0.946663f, 0.946724f, 0.946786f, 0.946848f, 0.946910f, 0.946971f, 0.947033f,
+ 0.947094f, 0.947156f, 0.947217f, 0.947279f, 0.947340f, 0.947402f, 0.947463f, 0.947524f,
+ 0.947586f, 0.947647f, 0.947708f, 0.947769f, 0.947830f, 0.947891f, 0.947953f, 0.948014f,
+ 0.948075f, 0.948136f, 0.948196f, 0.948257f, 0.948318f, 0.948379f, 0.948440f, 0.948501f,
+ 0.948561f, 0.948622f, 0.948683f, 0.948743f, 0.948804f, 0.948864f, 0.948925f, 0.948985f,
+ 0.949046f, 0.949106f, 0.949167f, 0.949227f, 0.949287f, 0.949348f, 0.949408f, 0.949468f,
+ 0.949528f, 0.949588f, 0.949648f, 0.949708f, 0.949768f, 0.949829f, 0.949888f, 0.949948f,
+ 0.950008f, 0.950068f, 0.950128f, 0.950188f, 0.950247f, 0.950307f, 0.950367f, 0.950426f,
+ 0.950486f, 0.950546f, 0.950605f, 0.950665f, 0.950724f, 0.950784f, 0.950843f, 0.950902f,
+ 0.950962f, 0.951021f, 0.951080f, 0.951139f, 0.951199f, 0.951258f, 0.951317f, 0.951376f,
+ 0.951435f, 0.951494f, 0.951553f, 0.951612f, 0.951671f, 0.951730f, 0.951789f, 0.951847f,
+ 0.951906f, 0.951965f, 0.952024f, 0.952082f, 0.952141f, 0.952199f, 0.952258f, 0.952317f,
+ 0.952375f, 0.952433f, 0.952492f, 0.952550f, 0.952609f, 0.952667f, 0.952725f, 0.952783f,
+ 0.952842f, 0.952900f, 0.952958f, 0.953016f, 0.953074f, 0.953132f, 0.953190f, 0.953248f,
+ 0.953306f, 0.953364f, 0.953422f, 0.953480f, 0.953537f, 0.953595f, 0.953653f, 0.953711f,
+ 0.953768f, 0.953826f, 0.953883f, 0.953941f, 0.953998f, 0.954056f, 0.954113f, 0.954171f,
+ 0.954228f, 0.954285f, 0.954343f, 0.954400f, 0.954457f, 0.954514f, 0.954572f, 0.954629f,
+ 0.954686f, 0.954743f, 0.954800f, 0.954857f, 0.954914f, 0.954971f, 0.955028f, 0.955084f,
+ 0.955141f, 0.955198f, 0.955255f, 0.955311f, 0.955368f, 0.955425f, 0.955481f, 0.955538f,
+ 0.955594f, 0.955651f, 0.955707f, 0.955764f, 0.955820f, 0.955876f, 0.955933f, 0.955989f,
+ 0.956045f, 0.956101f, 0.956158f, 0.956214f, 0.956270f, 0.956326f, 0.956382f, 0.956438f,
+ 0.956494f, 0.956550f, 0.956606f, 0.956662f, 0.956717f, 0.956773f, 0.956829f, 0.956885f,
+ 0.956940f, 0.956996f, 0.957052f, 0.957107f, 0.957163f, 0.957218f, 0.957274f, 0.957329f,
+ 0.957385f, 0.957440f, 0.957495f, 0.957550f, 0.957606f, 0.957661f, 0.957716f, 0.957771f,
+ 0.957826f, 0.957882f, 0.957937f, 0.957992f, 0.958046f, 0.958101f, 0.958156f, 0.958211f,
+ 0.958266f, 0.958321f, 0.958376f, 0.958430f, 0.958485f, 0.958540f, 0.958594f, 0.958649f,
+ 0.958703f, 0.958758f, 0.958812f, 0.958867f, 0.958921f, 0.958976f, 0.959030f, 0.959084f,
+ 0.959139f, 0.959193f, 0.959247f, 0.959301f, 0.959355f, 0.959409f, 0.959463f, 0.959518f,
+ 0.959572f, 0.959625f, 0.959679f, 0.959733f, 0.959787f, 0.959841f, 0.959895f, 0.959948f,
+ 0.960002f, 0.960056f, 0.960109f, 0.960163f, 0.960217f, 0.960270f, 0.960324f, 0.960377f,
+ 0.960431f, 0.960484f, 0.960537f, 0.960591f, 0.960644f, 0.960697f, 0.960750f, 0.960804f,
+ 0.960857f, 0.960910f, 0.960963f, 0.961016f, 0.961069f, 0.961122f, 0.961175f, 0.961228f,
+ 0.961280f, 0.961333f, 0.961386f, 0.961439f, 0.961492f, 0.961544f, 0.961597f, 0.961649f,
+ 0.961702f, 0.961755f, 0.961807f, 0.961860f, 0.961912f, 0.961964f, 0.962017f, 0.962069f,
+ 0.962121f, 0.962174f, 0.962226f, 0.962278f, 0.962330f, 0.962382f, 0.962434f, 0.962486f,
+ 0.962538f, 0.962590f, 0.962642f, 0.962694f, 0.962746f, 0.962798f, 0.962850f, 0.962902f,
+ 0.962953f, 0.963005f, 0.963057f, 0.963108f, 0.963160f, 0.963211f, 0.963263f, 0.963314f,
+ 0.963366f, 0.963417f, 0.963469f, 0.963520f, 0.963571f, 0.963623f, 0.963674f, 0.963725f,
+ 0.963776f, 0.963827f, 0.963878f, 0.963929f, 0.963980f, 0.964031f, 0.964082f, 0.964133f,
+ 0.964184f, 0.964235f, 0.964286f, 0.964336f, 0.964387f, 0.964438f, 0.964489f, 0.964539f,
+ 0.964590f, 0.964640f, 0.964691f, 0.964741f, 0.964792f, 0.964842f, 0.964893f, 0.964943f,
+ 0.964993f, 0.965044f, 0.965094f, 0.965144f, 0.965194f, 0.965244f, 0.965294f, 0.965344f,
+ 0.965394f, 0.965444f, 0.965494f, 0.965544f, 0.965594f, 0.965644f, 0.965694f, 0.965744f,
+ 0.965793f, 0.965843f, 0.965893f, 0.965942f, 0.965992f, 0.966042f, 0.966091f, 0.966141f,
+ 0.966190f, 0.966239f, 0.966289f, 0.966338f, 0.966387f, 0.966437f, 0.966486f, 0.966535f,
+ 0.966584f, 0.966633f, 0.966683f, 0.966732f, 0.966781f, 0.966830f, 0.966879f, 0.966928f,
+ 0.966976f, 0.967025f, 0.967074f, 0.967123f, 0.967172f, 0.967220f, 0.967269f, 0.967318f,
+ 0.967366f, 0.967415f, 0.967463f, 0.967512f, 0.967560f, 0.967609f, 0.967657f, 0.967706f,
+ 0.967754f, 0.967802f, 0.967850f, 0.967899f, 0.967947f, 0.967995f, 0.968043f, 0.968091f,
+ 0.968139f, 0.968187f, 0.968235f, 0.968283f, 0.968331f, 0.968379f, 0.968427f, 0.968474f,
+ 0.968522f, 0.968570f, 0.968617f, 0.968665f, 0.968713f, 0.968760f, 0.968808f, 0.968855f,
+ 0.968903f, 0.968950f, 0.968998f, 0.969045f, 0.969092f, 0.969140f, 0.969187f, 0.969234f,
+ 0.969281f, 0.969328f, 0.969375f, 0.969423f, 0.969470f, 0.969517f, 0.969564f, 0.969611f,
+ 0.969657f, 0.969704f, 0.969751f, 0.969798f, 0.969845f, 0.969891f, 0.969938f, 0.969985f,
+ 0.970031f, 0.970078f, 0.970124f, 0.970171f, 0.970217f, 0.970264f, 0.970310f, 0.970357f,
+ 0.970403f, 0.970449f, 0.970495f, 0.970542f, 0.970588f, 0.970634f, 0.970680f, 0.970726f,
+ 0.970772f, 0.970818f, 0.970864f, 0.970910f, 0.970956f, 0.971002f, 0.971048f, 0.971093f,
+ 0.971139f, 0.971185f, 0.971231f, 0.971276f, 0.971322f, 0.971367f, 0.971413f, 0.971458f,
+ 0.971504f, 0.971549f, 0.971595f, 0.971640f, 0.971685f, 0.971731f, 0.971776f, 0.971821f,
+ 0.971866f, 0.971911f, 0.971957f, 0.972002f, 0.972047f, 0.972092f, 0.972137f, 0.972182f,
+ 0.972227f, 0.972271f, 0.972316f, 0.972361f, 0.972406f, 0.972450f, 0.972495f, 0.972540f,
+ 0.972584f, 0.972629f, 0.972673f, 0.972718f, 0.972762f, 0.972807f, 0.972851f, 0.972896f,
+ 0.972940f, 0.972984f, 0.973028f, 0.973073f, 0.973117f, 0.973161f, 0.973205f, 0.973249f,
+ 0.973293f, 0.973337f, 0.973381f, 0.973425f, 0.973469f, 0.973513f, 0.973557f, 0.973601f,
+ 0.973644f, 0.973688f, 0.973732f, 0.973775f, 0.973819f, 0.973862f, 0.973906f, 0.973949f,
+ 0.973993f, 0.974036f, 0.974080f, 0.974123f, 0.974166f, 0.974210f, 0.974253f, 0.974296f,
+ 0.974339f, 0.974383f, 0.974426f, 0.974469f, 0.974512f, 0.974555f, 0.974598f, 0.974641f,
+ 0.974684f, 0.974726f, 0.974769f, 0.974812f, 0.974855f, 0.974897f, 0.974940f, 0.974983f,
+ 0.975025f, 0.975068f, 0.975110f, 0.975153f, 0.975195f, 0.975238f, 0.975280f, 0.975323f,
+ 0.975365f, 0.975407f, 0.975449f, 0.975492f, 0.975534f, 0.975576f, 0.975618f, 0.975660f,
+ 0.975702f, 0.975744f, 0.975786f, 0.975828f, 0.975870f, 0.975912f, 0.975954f, 0.975995f,
+ 0.976037f, 0.976079f, 0.976120f, 0.976162f, 0.976204f, 0.976245f, 0.976287f, 0.976328f,
+ 0.976370f, 0.976411f, 0.976453f, 0.976494f, 0.976535f, 0.976576f, 0.976618f, 0.976659f,
+ 0.976700f, 0.976741f, 0.976782f, 0.976823f, 0.976864f, 0.976905f, 0.976946f, 0.976987f,
+ 0.977028f, 0.977069f, 0.977110f, 0.977151f, 0.977191f, 0.977232f, 0.977273f, 0.977313f,
+ 0.977354f, 0.977394f, 0.977435f, 0.977475f, 0.977516f, 0.977556f, 0.977597f, 0.977637f,
+ 0.977677f, 0.977718f, 0.977758f, 0.977798f, 0.977838f, 0.977878f, 0.977918f, 0.977959f,
+ 0.977998f, 0.978038f, 0.978078f, 0.978118f, 0.978158f, 0.978198f, 0.978238f, 0.978278f,
+ 0.978317f, 0.978357f, 0.978397f, 0.978436f, 0.978476f, 0.978516f, 0.978555f, 0.978594f,
+ 0.978634f, 0.978673f, 0.978713f, 0.978752f, 0.978791f, 0.978831f, 0.978870f, 0.978909f,
+ 0.978948f, 0.978987f, 0.979026f, 0.979065f, 0.979104f, 0.979143f, 0.979182f, 0.979221f,
+ 0.979260f, 0.979299f, 0.979338f, 0.979376f, 0.979415f, 0.979454f, 0.979493f, 0.979531f,
+ 0.979570f, 0.979608f, 0.979647f, 0.979685f, 0.979724f, 0.979762f, 0.979800f, 0.979839f,
+ 0.979877f, 0.979915f, 0.979954f, 0.979992f, 0.980030f, 0.980068f, 0.980106f, 0.980144f,
+ 0.980182f, 0.980220f, 0.980258f, 0.980296f, 0.980334f, 0.980372f, 0.980409f, 0.980447f,
+ 0.980485f, 0.980523f, 0.980560f, 0.980598f, 0.980635f, 0.980673f, 0.980710f, 0.980748f,
+ 0.980785f, 0.980823f, 0.980860f, 0.980897f, 0.980935f, 0.980972f, 0.981009f, 0.981046f,
+ 0.981083f, 0.981120f, 0.981158f, 0.981195f, 0.981232f, 0.981269f, 0.981305f, 0.981342f,
+ 0.981379f, 0.981416f, 0.981453f, 0.981490f, 0.981526f, 0.981563f, 0.981600f, 0.981636f,
+ 0.981673f, 0.981709f, 0.981746f, 0.981782f, 0.981819f, 0.981855f, 0.981891f, 0.981928f,
+ 0.981964f, 0.982000f, 0.982036f, 0.982072f, 0.982109f, 0.982145f, 0.982181f, 0.982217f,
+ 0.982253f, 0.982289f, 0.982325f, 0.982360f, 0.982396f, 0.982432f, 0.982468f, 0.982504f,
+ 0.982539f, 0.982575f, 0.982611f, 0.982646f, 0.982682f, 0.982717f, 0.982753f, 0.982788f,
+ 0.982824f, 0.982859f, 0.982894f, 0.982930f, 0.982965f, 0.983000f, 0.983035f, 0.983070f,
+ 0.983105f, 0.983141f, 0.983176f, 0.983211f, 0.983246f, 0.983281f, 0.983315f, 0.983350f,
+ 0.983385f, 0.983420f, 0.983455f, 0.983489f, 0.983524f, 0.983559f, 0.983593f, 0.983628f,
+ 0.983662f, 0.983697f, 0.983731f, 0.983766f, 0.983800f, 0.983835f, 0.983869f, 0.983903f,
+ 0.983937f, 0.983972f, 0.984006f, 0.984040f, 0.984074f, 0.984108f, 0.984142f, 0.984176f,
+ 0.984210f, 0.984244f, 0.984278f, 0.984312f, 0.984346f, 0.984379f, 0.984413f, 0.984447f,
+ 0.984480f, 0.984514f, 0.984548f, 0.984581f, 0.984615f, 0.984648f, 0.984682f, 0.984715f,
+ 0.984748f, 0.984782f, 0.984815f, 0.984848f, 0.984882f, 0.984915f, 0.984948f, 0.984981f,
+ 0.985014f, 0.985047f, 0.985080f, 0.985113f, 0.985146f, 0.985179f, 0.985212f, 0.985245f,
+ 0.985278f, 0.985310f, 0.985343f, 0.985376f, 0.985408f, 0.985441f, 0.985474f, 0.985506f,
+ 0.985539f, 0.985571f, 0.985604f, 0.985636f, 0.985668f, 0.985701f, 0.985733f, 0.985765f,
+ 0.985798f, 0.985830f, 0.985862f, 0.985894f, 0.985926f, 0.985958f, 0.985990f, 0.986022f,
+ 0.986054f, 0.986086f, 0.986118f, 0.986150f, 0.986181f, 0.986213f, 0.986245f, 0.986276f,
+ 0.986308f, 0.986340f, 0.986371f, 0.986403f, 0.986434f, 0.986466f, 0.986497f, 0.986529f,
+ 0.986560f, 0.986591f, 0.986623f, 0.986654f, 0.986685f, 0.986716f, 0.986747f, 0.986778f,
+ 0.986809f, 0.986840f, 0.986871f, 0.986902f, 0.986933f, 0.986964f, 0.986995f, 0.987026f,
+ 0.987057f, 0.987087f, 0.987118f, 0.987149f, 0.987179f, 0.987210f, 0.987240f, 0.987271f,
+ 0.987301f, 0.987332f, 0.987362f, 0.987393f, 0.987423f, 0.987453f, 0.987484f, 0.987514f,
+ 0.987544f, 0.987574f, 0.987604f, 0.987634f, 0.987664f, 0.987694f, 0.987724f, 0.987754f,
+ 0.987784f, 0.987814f, 0.987844f, 0.987874f, 0.987903f, 0.987933f, 0.987963f, 0.987992f,
+ 0.988022f, 0.988052f, 0.988081f, 0.988111f, 0.988140f, 0.988169f, 0.988199f, 0.988228f,
+ 0.988258f, 0.988287f, 0.988316f, 0.988345f, 0.988374f, 0.988404f, 0.988433f, 0.988462f,
+ 0.988491f, 0.988520f, 0.988549f, 0.988578f, 0.988607f, 0.988635f, 0.988664f, 0.988693f,
+ 0.988722f, 0.988750f, 0.988779f, 0.988808f, 0.988836f, 0.988865f, 0.988893f, 0.988922f,
+ 0.988950f, 0.988979f, 0.989007f, 0.989035f, 0.989064f, 0.989092f, 0.989120f, 0.989148f,
+ 0.989177f, 0.989205f, 0.989233f, 0.989261f, 0.989289f, 0.989317f, 0.989345f, 0.989373f,
+ 0.989400f, 0.989428f, 0.989456f, 0.989484f, 0.989511f, 0.989539f, 0.989567f, 0.989594f,
+ 0.989622f, 0.989650f, 0.989677f, 0.989704f, 0.989732f, 0.989759f, 0.989787f, 0.989814f,
+ 0.989841f, 0.989869f, 0.989896f, 0.989923f, 0.989950f, 0.989977f, 0.990004f, 0.990031f,
+ 0.990058f, 0.990085f, 0.990112f, 0.990139f, 0.990166f, 0.990193f, 0.990219f, 0.990246f,
+ 0.990273f, 0.990299f, 0.990326f, 0.990353f, 0.990379f, 0.990406f, 0.990432f, 0.990459f,
+ 0.990485f, 0.990511f, 0.990538f, 0.990564f, 0.990590f, 0.990617f, 0.990643f, 0.990669f,
+ 0.990695f, 0.990721f, 0.990747f, 0.990773f, 0.990799f, 0.990825f, 0.990851f, 0.990877f,
+ 0.990903f, 0.990928f, 0.990954f, 0.990980f, 0.991006f, 0.991031f, 0.991057f, 0.991082f,
+ 0.991108f, 0.991133f, 0.991159f, 0.991184f, 0.991210f, 0.991235f, 0.991260f, 0.991286f,
+ 0.991311f, 0.991336f, 0.991361f, 0.991386f, 0.991411f, 0.991437f, 0.991462f, 0.991487f,
+ 0.991511f, 0.991536f, 0.991561f, 0.991586f, 0.991611f, 0.991636f, 0.991660f, 0.991685f,
+ 0.991710f, 0.991734f, 0.991759f, 0.991783f, 0.991808f, 0.991832f, 0.991857f, 0.991881f,
+ 0.991906f, 0.991930f, 0.991954f, 0.991979f, 0.992003f, 0.992027f, 0.992051f, 0.992075f,
+ 0.992099f, 0.992123f, 0.992147f, 0.992171f, 0.992195f, 0.992219f, 0.992243f, 0.992267f,
+ 0.992291f, 0.992314f, 0.992338f, 0.992362f, 0.992385f, 0.992409f, 0.992433f, 0.992456f,
+ 0.992480f, 0.992503f, 0.992526f, 0.992550f, 0.992573f, 0.992596f, 0.992620f, 0.992643f,
+ 0.992666f, 0.992689f, 0.992712f, 0.992736f, 0.992759f, 0.992782f, 0.992805f, 0.992828f,
+ 0.992850f, 0.992873f, 0.992896f, 0.992919f, 0.992942f, 0.992964f, 0.992987f, 0.993010f,
+ 0.993032f, 0.993055f, 0.993077f, 0.993100f, 0.993122f, 0.993145f, 0.993167f, 0.993190f,
+ 0.993212f, 0.993234f, 0.993257f, 0.993279f, 0.993301f, 0.993323f, 0.993345f, 0.993367f,
+ 0.993389f, 0.993411f, 0.993433f, 0.993455f, 0.993477f, 0.993499f, 0.993521f, 0.993542f,
+ 0.993564f, 0.993586f, 0.993608f, 0.993629f, 0.993651f, 0.993672f, 0.993694f, 0.993715f,
+ 0.993737f, 0.993758f, 0.993779f, 0.993801f, 0.993822f, 0.993843f, 0.993865f, 0.993886f,
+ 0.993907f, 0.993928f, 0.993949f, 0.993970f, 0.993991f, 0.994012f, 0.994033f, 0.994054f,
+ 0.994075f, 0.994096f, 0.994116f, 0.994137f, 0.994158f, 0.994179f, 0.994199f, 0.994220f,
+ 0.994240f, 0.994261f, 0.994281f, 0.994302f, 0.994322f, 0.994343f, 0.994363f, 0.994383f,
+ 0.994404f, 0.994424f, 0.994444f, 0.994464f, 0.994484f, 0.994505f, 0.994525f, 0.994545f,
+ 0.994565f, 0.994585f, 0.994604f, 0.994624f, 0.994644f, 0.994664f, 0.994684f, 0.994703f,
+ 0.994723f, 0.994743f, 0.994762f, 0.994782f, 0.994802f, 0.994821f, 0.994841f, 0.994860f,
+ 0.994879f, 0.994899f, 0.994918f, 0.994937f, 0.994957f, 0.994976f, 0.994995f, 0.995014f,
+ 0.995033f, 0.995052f, 0.995071f, 0.995090f, 0.995109f, 0.995128f, 0.995147f, 0.995166f,
+ 0.995185f, 0.995203f, 0.995222f, 0.995241f, 0.995260f, 0.995278f, 0.995297f, 0.995315f,
+ 0.995334f, 0.995352f, 0.995371f, 0.995389f, 0.995408f, 0.995426f, 0.995444f, 0.995463f,
+ 0.995481f, 0.995499f, 0.995517f, 0.995535f, 0.995553f, 0.995571f, 0.995589f, 0.995607f,
+ 0.995625f, 0.995643f, 0.995661f, 0.995679f, 0.995697f, 0.995714f, 0.995732f, 0.995750f,
+ 0.995767f, 0.995785f, 0.995803f, 0.995820f, 0.995838f, 0.995855f, 0.995872f, 0.995890f,
+ 0.995907f, 0.995925f, 0.995942f, 0.995959f, 0.995976f, 0.995993f, 0.996011f, 0.996028f,
+ 0.996045f, 0.996062f, 0.996079f, 0.996096f, 0.996113f, 0.996129f, 0.996146f, 0.996163f,
+ 0.996180f, 0.996197f, 0.996213f, 0.996230f, 0.996247f, 0.996263f, 0.996280f, 0.996296f,
+ 0.996313f, 0.996329f, 0.996345f, 0.996362f, 0.996378f, 0.996394f, 0.996411f, 0.996427f,
+ 0.996443f, 0.996459f, 0.996475f, 0.996491f, 0.996507f, 0.996523f, 0.996539f, 0.996555f,
+ 0.996571f, 0.996587f, 0.996603f, 0.996619f, 0.996634f, 0.996650f, 0.996666f, 0.996681f,
+ 0.996697f, 0.996712f, 0.996728f, 0.996743f, 0.996759f, 0.996774f, 0.996790f, 0.996805f,
+ 0.996820f, 0.996836f, 0.996851f, 0.996866f, 0.996881f, 0.996896f, 0.996911f, 0.996926f,
+ 0.996941f, 0.996956f, 0.996971f, 0.996986f, 0.997001f, 0.997016f, 0.997031f, 0.997045f,
+ 0.997060f, 0.997075f, 0.997089f, 0.997104f, 0.997119f, 0.997133f, 0.997148f, 0.997162f,
+ 0.997176f, 0.997191f, 0.997205f, 0.997219f, 0.997234f, 0.997248f, 0.997262f, 0.997276f,
+ 0.997290f, 0.997305f, 0.997319f, 0.997333f, 0.997347f, 0.997361f, 0.997374f, 0.997388f,
+ 0.997402f, 0.997416f, 0.997430f, 0.997443f, 0.997457f, 0.997471f, 0.997484f, 0.997498f,
+ 0.997511f, 0.997525f, 0.997538f, 0.997552f, 0.997565f, 0.997579f, 0.997592f, 0.997605f,
+ 0.997618f, 0.997632f, 0.997645f, 0.997658f, 0.997671f, 0.997684f, 0.997697f, 0.997710f,
+ 0.997723f, 0.997736f, 0.997749f, 0.997762f, 0.997774f, 0.997787f, 0.997800f, 0.997813f,
+ 0.997825f, 0.997838f, 0.997851f, 0.997863f, 0.997876f, 0.997888f, 0.997901f, 0.997913f,
+ 0.997925f, 0.997938f, 0.997950f, 0.997962f, 0.997974f, 0.997987f, 0.997999f, 0.998011f,
+ 0.998023f, 0.998035f, 0.998047f, 0.998059f, 0.998071f, 0.998083f, 0.998094f, 0.998106f,
+ 0.998118f, 0.998130f, 0.998142f, 0.998153f, 0.998165f, 0.998176f, 0.998188f, 0.998200f,
+ 0.998211f, 0.998222f, 0.998234f, 0.998245f, 0.998257f, 0.998268f, 0.998279f, 0.998290f,
+ 0.998302f, 0.998313f, 0.998324f, 0.998335f, 0.998346f, 0.998357f, 0.998368f, 0.998379f,
+ 0.998390f, 0.998401f, 0.998411f, 0.998422f, 0.998433f, 0.998444f, 0.998454f, 0.998465f,
+ 0.998476f, 0.998486f, 0.998497f, 0.998507f, 0.998518f, 0.998528f, 0.998538f, 0.998549f,
+ 0.998559f, 0.998569f, 0.998580f, 0.998590f, 0.998600f, 0.998610f, 0.998620f, 0.998630f,
+ 0.998640f, 0.998650f, 0.998660f, 0.998670f, 0.998680f, 0.998690f, 0.998700f, 0.998709f,
+ 0.998719f, 0.998729f, 0.998738f, 0.998748f, 0.998758f, 0.998767f, 0.998777f, 0.998786f,
+ 0.998795f, 0.998805f, 0.998814f, 0.998824f, 0.998833f, 0.998842f, 0.998851f, 0.998860f,
+ 0.998870f, 0.998879f, 0.998888f, 0.998897f, 0.998906f, 0.998915f, 0.998924f, 0.998932f,
+ 0.998941f, 0.998950f, 0.998959f, 0.998968f, 0.998976f, 0.998985f, 0.998994f, 0.999002f,
+ 0.999011f, 0.999019f, 0.999028f, 0.999036f, 0.999044f, 0.999053f, 0.999061f, 0.999069f,
+ 0.999078f, 0.999086f, 0.999094f, 0.999102f, 0.999110f, 0.999118f, 0.999126f, 0.999134f,
+ 0.999142f, 0.999150f, 0.999158f, 0.999166f, 0.999174f, 0.999182f, 0.999189f, 0.999197f,
+ 0.999205f, 0.999212f, 0.999220f, 0.999228f, 0.999235f, 0.999243f, 0.999250f, 0.999257f,
+ 0.999265f, 0.999272f, 0.999279f, 0.999287f, 0.999294f, 0.999301f, 0.999308f, 0.999315f,
+ 0.999322f, 0.999329f, 0.999336f, 0.999343f, 0.999350f, 0.999357f, 0.999364f, 0.999371f,
+ 0.999378f, 0.999384f, 0.999391f, 0.999398f, 0.999404f, 0.999411f, 0.999418f, 0.999424f,
+ 0.999431f, 0.999437f, 0.999443f, 0.999450f, 0.999456f, 0.999462f, 0.999469f, 0.999475f,
+ 0.999481f, 0.999487f, 0.999493f, 0.999500f, 0.999506f, 0.999512f, 0.999518f, 0.999524f,
+ 0.999529f, 0.999535f, 0.999541f, 0.999547f, 0.999553f, 0.999558f, 0.999564f, 0.999570f,
+ 0.999575f, 0.999581f, 0.999586f, 0.999592f, 0.999597f, 0.999603f, 0.999608f, 0.999614f,
+ 0.999619f, 0.999624f, 0.999629f, 0.999635f, 0.999640f, 0.999645f, 0.999650f, 0.999655f,
+ 0.999660f, 0.999665f, 0.999670f, 0.999675f, 0.999680f, 0.999685f, 0.999689f, 0.999694f,
+ 0.999699f, 0.999704f, 0.999708f, 0.999713f, 0.999717f, 0.999722f, 0.999726f, 0.999731f,
+ 0.999735f, 0.999740f, 0.999744f, 0.999748f, 0.999753f, 0.999757f, 0.999761f, 0.999765f,
+ 0.999769f, 0.999774f, 0.999778f, 0.999782f, 0.999786f, 0.999790f, 0.999793f, 0.999797f,
+ 0.999801f, 0.999805f, 0.999809f, 0.999812f, 0.999816f, 0.999820f, 0.999823f, 0.999827f,
+ 0.999831f, 0.999834f, 0.999838f, 0.999841f, 0.999844f, 0.999848f, 0.999851f, 0.999854f,
+ 0.999858f, 0.999861f, 0.999864f, 0.999867f, 0.999870f, 0.999873f, 0.999876f, 0.999879f,
+ 0.999882f, 0.999885f, 0.999888f, 0.999891f, 0.999894f, 0.999897f, 0.999899f, 0.999902f,
+ 0.999905f, 0.999907f, 0.999910f, 0.999913f, 0.999915f, 0.999917f, 0.999920f, 0.999922f,
+ 0.999925f, 0.999927f, 0.999929f, 0.999932f, 0.999934f, 0.999936f, 0.999938f, 0.999940f,
+ 0.999942f, 0.999944f, 0.999946f, 0.999948f, 0.999950f, 0.999952f, 0.999954f, 0.999956f,
+ 0.999958f, 0.999959f, 0.999961f, 0.999963f, 0.999964f, 0.999966f, 0.999968f, 0.999969f,
+ 0.999971f, 0.999972f, 0.999973f, 0.999975f, 0.999976f, 0.999977f, 0.999979f, 0.999980f,
+ 0.999981f, 0.999982f, 0.999983f, 0.999985f, 0.999986f, 0.999987f, 0.999988f, 0.999988f,
+ 0.999989f, 0.999990f, 0.999991f, 0.999992f, 0.999993f, 0.999993f, 0.999994f, 0.999995f,
+ 0.999995f, 0.999996f, 0.999996f, 0.999997f, 0.999997f, 0.999998f, 0.999998f, 0.999999f,
+ 0.999999f, 0.999999f, 0.999999f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
+ 0.000000f, -0.000192f, -0.000383f, -0.000575f, -0.000767f, -0.000959f, -0.001150f, -0.001342f,
+ -0.001534f, -0.001726f, -0.001917f, -0.002109f, -0.002301f, -0.002493f, -0.002684f, -0.002876f,
+ -0.003068f, -0.003260f, -0.003451f, -0.003643f, -0.003835f, -0.004027f, -0.004218f, -0.004410f,
+ -0.004602f, -0.004794f, -0.004985f, -0.005177f, -0.005369f, -0.005561f, -0.005752f, -0.005944f,
+ -0.006136f, -0.006328f, -0.006519f, -0.006711f, -0.006903f, -0.007095f, -0.007286f, -0.007478f,
+ -0.007670f, -0.007862f, -0.008053f, -0.008245f, -0.008437f, -0.008629f, -0.008820f, -0.009012f,
+ -0.009204f, -0.009395f, -0.009587f, -0.009779f, -0.009971f, -0.010162f, -0.010354f, -0.010546f,
+ -0.010738f, -0.010929f, -0.011121f, -0.011313f, -0.011505f, -0.011696f, -0.011888f, -0.012080f,
+ -0.012272f, -0.012463f, -0.012655f, -0.012847f, -0.013038f, -0.013230f, -0.013422f, -0.013614f,
+ -0.013805f, -0.013997f, -0.014189f, -0.014381f, -0.014572f, -0.014764f, -0.014956f, -0.015147f,
+ -0.015339f, -0.015531f, -0.015723f, -0.015914f, -0.016106f, -0.016298f, -0.016490f, -0.016681f,
+ -0.016873f, -0.017065f, -0.017256f, -0.017448f, -0.017640f, -0.017832f, -0.018023f, -0.018215f,
+ -0.018407f, -0.018598f, -0.018790f, -0.018982f, -0.019174f, -0.019365f, -0.019557f, -0.019749f,
+ -0.019940f, -0.020132f, -0.020324f, -0.020516f, -0.020707f, -0.020899f, -0.021091f, -0.021282f,
+ -0.021474f, -0.021666f, -0.021857f, -0.022049f, -0.022241f, -0.022433f, -0.022624f, -0.022816f,
+ -0.023008f, -0.023199f, -0.023391f, -0.023583f, -0.023774f, -0.023966f, -0.024158f, -0.024350f,
+ -0.024541f, -0.024733f, -0.024925f, -0.025116f, -0.025308f, -0.025500f, -0.025691f, -0.025883f,
+ -0.026075f, -0.026266f, -0.026458f, -0.026650f, -0.026841f, -0.027033f, -0.027225f, -0.027416f,
+ -0.027608f, -0.027800f, -0.027991f, -0.028183f, -0.028375f, -0.028567f, -0.028758f, -0.028950f,
+ -0.029142f, -0.029333f, -0.029525f, -0.029717f, -0.029908f, -0.030100f, -0.030291f, -0.030483f,
+ -0.030675f, -0.030866f, -0.031058f, -0.031250f, -0.031441f, -0.031633f, -0.031825f, -0.032016f,
+ -0.032208f, -0.032400f, -0.032591f, -0.032783f, -0.032975f, -0.033166f, -0.033358f, -0.033550f,
+ -0.033741f, -0.033933f, -0.034124f, -0.034316f, -0.034508f, -0.034699f, -0.034891f, -0.035083f,
+ -0.035274f, -0.035466f, -0.035657f, -0.035849f, -0.036041f, -0.036232f, -0.036424f, -0.036616f,
+ -0.036807f, -0.036999f, -0.037190f, -0.037382f, -0.037574f, -0.037765f, -0.037957f, -0.038149f,
+ -0.038340f, -0.038532f, -0.038723f, -0.038915f, -0.039107f, -0.039298f, -0.039490f, -0.039681f,
+ -0.039873f, -0.040065f, -0.040256f, -0.040448f, -0.040639f, -0.040831f, -0.041022f, -0.041214f,
+ -0.041406f, -0.041597f, -0.041789f, -0.041980f, -0.042172f, -0.042364f, -0.042555f, -0.042747f,
+ -0.042938f, -0.043130f, -0.043321f, -0.043513f, -0.043705f, -0.043896f, -0.044088f, -0.044279f,
+ -0.044471f, -0.044662f, -0.044854f, -0.045045f, -0.045237f, -0.045429f, -0.045620f, -0.045812f,
+ -0.046003f, -0.046195f, -0.046386f, -0.046578f, -0.046769f, -0.046961f, -0.047152f, -0.047344f,
+ -0.047535f, -0.047727f, -0.047919f, -0.048110f, -0.048302f, -0.048493f, -0.048685f, -0.048876f,
+ -0.049068f, -0.049259f, -0.049451f, -0.049642f, -0.049834f, -0.050025f, -0.050217f, -0.050408f,
+ -0.050600f, -0.050791f, -0.050983f, -0.051174f, -0.051366f, -0.051557f, -0.051749f, -0.051940f,
+ -0.052132f, -0.052323f, -0.052515f, -0.052706f, -0.052898f, -0.053089f, -0.053281f, -0.053472f,
+ -0.053664f, -0.053855f, -0.054046f, -0.054238f, -0.054429f, -0.054621f, -0.054812f, -0.055004f,
+ -0.055195f, -0.055387f, -0.055578f, -0.055770f, -0.055961f, -0.056152f, -0.056344f, -0.056535f,
+ -0.056727f, -0.056918f, -0.057110f, -0.057301f, -0.057493f, -0.057684f, -0.057875f, -0.058067f,
+ -0.058258f, -0.058450f, -0.058641f, -0.058833f, -0.059024f, -0.059215f, -0.059407f, -0.059598f,
+ -0.059790f, -0.059981f, -0.060172f, -0.060364f, -0.060555f, -0.060747f, -0.060938f, -0.061129f,
+ -0.061321f, -0.061512f, -0.061704f, -0.061895f, -0.062086f, -0.062278f, -0.062469f, -0.062660f,
+ -0.062852f, -0.063043f, -0.063234f, -0.063426f, -0.063617f, -0.063809f, -0.064000f, -0.064191f,
+ -0.064383f, -0.064574f, -0.064765f, -0.064957f, -0.065148f, -0.065339f, -0.065531f, -0.065722f,
+ -0.065913f, -0.066105f, -0.066296f, -0.066487f, -0.066679f, -0.066870f, -0.067061f, -0.067253f,
+ -0.067444f, -0.067635f, -0.067827f, -0.068018f, -0.068209f, -0.068400f, -0.068592f, -0.068783f,
+ -0.068974f, -0.069166f, -0.069357f, -0.069548f, -0.069739f, -0.069931f, -0.070122f, -0.070313f,
+ -0.070505f, -0.070696f, -0.070887f, -0.071078f, -0.071270f, -0.071461f, -0.071652f, -0.071843f,
+ -0.072035f, -0.072226f, -0.072417f, -0.072608f, -0.072800f, -0.072991f, -0.073182f, -0.073373f,
+ -0.073565f, -0.073756f, -0.073947f, -0.074138f, -0.074329f, -0.074521f, -0.074712f, -0.074903f,
+ -0.075094f, -0.075286f, -0.075477f, -0.075668f, -0.075859f, -0.076050f, -0.076241f, -0.076433f,
+ -0.076624f, -0.076815f, -0.077006f, -0.077197f, -0.077389f, -0.077580f, -0.077771f, -0.077962f,
+ -0.078153f, -0.078344f, -0.078536f, -0.078727f, -0.078918f, -0.079109f, -0.079300f, -0.079491f,
+ -0.079682f, -0.079874f, -0.080065f, -0.080256f, -0.080447f, -0.080638f, -0.080829f, -0.081020f,
+ -0.081211f, -0.081403f, -0.081594f, -0.081785f, -0.081976f, -0.082167f, -0.082358f, -0.082549f,
+ -0.082740f, -0.082931f, -0.083122f, -0.083314f, -0.083505f, -0.083696f, -0.083887f, -0.084078f,
+ -0.084269f, -0.084460f, -0.084651f, -0.084842f, -0.085033f, -0.085224f, -0.085415f, -0.085606f,
+ -0.085797f, -0.085988f, -0.086179f, -0.086370f, -0.086561f, -0.086752f, -0.086943f, -0.087135f,
+ -0.087326f, -0.087517f, -0.087708f, -0.087899f, -0.088090f, -0.088281f, -0.088472f, -0.088663f,
+ -0.088854f, -0.089045f, -0.089236f, -0.089427f, -0.089617f, -0.089808f, -0.089999f, -0.090190f,
+ -0.090381f, -0.090572f, -0.090763f, -0.090954f, -0.091145f, -0.091336f, -0.091527f, -0.091718f,
+ -0.091909f, -0.092100f, -0.092291f, -0.092482f, -0.092673f, -0.092864f, -0.093055f, -0.093245f,
+ -0.093436f, -0.093627f, -0.093818f, -0.094009f, -0.094200f, -0.094391f, -0.094582f, -0.094773f,
+ -0.094963f, -0.095154f, -0.095345f, -0.095536f, -0.095727f, -0.095918f, -0.096109f, -0.096300f,
+ -0.096490f, -0.096681f, -0.096872f, -0.097063f, -0.097254f, -0.097445f, -0.097635f, -0.097826f,
+ -0.098017f, -0.098208f, -0.098399f, -0.098590f, -0.098780f, -0.098971f, -0.099162f, -0.099353f,
+ -0.099544f, -0.099734f, -0.099925f, -0.100116f, -0.100307f, -0.100498f, -0.100688f, -0.100879f,
+ -0.101070f, -0.101261f, -0.101451f, -0.101642f, -0.101833f, -0.102024f, -0.102214f, -0.102405f,
+ -0.102596f, -0.102787f, -0.102977f, -0.103168f, -0.103359f, -0.103550f, -0.103740f, -0.103931f,
+ -0.104122f, -0.104312f, -0.104503f, -0.104694f, -0.104884f, -0.105075f, -0.105266f, -0.105456f,
+ -0.105647f, -0.105838f, -0.106028f, -0.106219f, -0.106410f, -0.106600f, -0.106791f, -0.106982f,
+ -0.107172f, -0.107363f, -0.107554f, -0.107744f, -0.107935f, -0.108126f, -0.108316f, -0.108507f,
+ -0.108697f, -0.108888f, -0.109079f, -0.109269f, -0.109460f, -0.109650f, -0.109841f, -0.110032f,
+ -0.110222f, -0.110413f, -0.110603f, -0.110794f, -0.110984f, -0.111175f, -0.111366f, -0.111556f,
+ -0.111747f, -0.111937f, -0.112128f, -0.112318f, -0.112509f, -0.112699f, -0.112890f, -0.113080f,
+ -0.113271f, -0.113461f, -0.113652f, -0.113842f, -0.114033f, -0.114223f, -0.114414f, -0.114604f,
+ -0.114795f, -0.114985f, -0.115176f, -0.115366f, -0.115557f, -0.115747f, -0.115938f, -0.116128f,
+ -0.116319f, -0.116509f, -0.116700f, -0.116890f, -0.117080f, -0.117271f, -0.117461f, -0.117652f,
+ -0.117842f, -0.118032f, -0.118223f, -0.118413f, -0.118604f, -0.118794f, -0.118984f, -0.119175f,
+ -0.119365f, -0.119556f, -0.119746f, -0.119936f, -0.120127f, -0.120317f, -0.120507f, -0.120698f,
+ -0.120888f, -0.121078f, -0.121269f, -0.121459f, -0.121649f, -0.121840f, -0.122030f, -0.122220f,
+ -0.122411f, -0.122601f, -0.122791f, -0.122982f, -0.123172f, -0.123362f, -0.123552f, -0.123743f,
+ -0.123933f, -0.124123f, -0.124314f, -0.124504f, -0.124694f, -0.124884f, -0.125075f, -0.125265f,
+ -0.125455f, -0.125645f, -0.125835f, -0.126026f, -0.126216f, -0.126406f, -0.126596f, -0.126787f,
+ -0.126977f, -0.127167f, -0.127357f, -0.127547f, -0.127737f, -0.127928f, -0.128118f, -0.128308f,
+ -0.128498f, -0.128688f, -0.128878f, -0.129069f, -0.129259f, -0.129449f, -0.129639f, -0.129829f,
+ -0.130019f, -0.130209f, -0.130399f, -0.130590f, -0.130780f, -0.130970f, -0.131160f, -0.131350f,
+ -0.131540f, -0.131730f, -0.131920f, -0.132110f, -0.132300f, -0.132490f, -0.132680f, -0.132870f,
+ -0.133061f, -0.133251f, -0.133441f, -0.133631f, -0.133821f, -0.134011f, -0.134201f, -0.134391f,
+ -0.134581f, -0.134771f, -0.134961f, -0.135151f, -0.135341f, -0.135531f, -0.135721f, -0.135911f,
+ -0.136101f, -0.136291f, -0.136480f, -0.136670f, -0.136860f, -0.137050f, -0.137240f, -0.137430f,
+ -0.137620f, -0.137810f, -0.138000f, -0.138190f, -0.138380f, -0.138570f, -0.138760f, -0.138949f,
+ -0.139139f, -0.139329f, -0.139519f, -0.139709f, -0.139899f, -0.140089f, -0.140279f, -0.140468f,
+ -0.140658f, -0.140848f, -0.141038f, -0.141228f, -0.141418f, -0.141607f, -0.141797f, -0.141987f,
+ -0.142177f, -0.142367f, -0.142556f, -0.142746f, -0.142936f, -0.143126f, -0.143316f, -0.143505f,
+ -0.143695f, -0.143885f, -0.144075f, -0.144264f, -0.144454f, -0.144644f, -0.144833f, -0.145023f,
+ -0.145213f, -0.145403f, -0.145592f, -0.145782f, -0.145972f, -0.146161f, -0.146351f, -0.146541f,
+ -0.146730f, -0.146920f, -0.147110f, -0.147299f, -0.147489f, -0.147679f, -0.147868f, -0.148058f,
+ -0.148248f, -0.148437f, -0.148627f, -0.148817f, -0.149006f, -0.149196f, -0.149385f, -0.149575f,
+ -0.149765f, -0.149954f, -0.150144f, -0.150333f, -0.150523f, -0.150712f, -0.150902f, -0.151092f,
+ -0.151281f, -0.151471f, -0.151660f, -0.151850f, -0.152039f, -0.152229f, -0.152418f, -0.152608f,
+ -0.152797f, -0.152987f, -0.153176f, -0.153366f, -0.153555f, -0.153745f, -0.153934f, -0.154124f,
+ -0.154313f, -0.154502f, -0.154692f, -0.154881f, -0.155071f, -0.155260f, -0.155450f, -0.155639f,
+ -0.155828f, -0.156018f, -0.156207f, -0.156397f, -0.156586f, -0.156775f, -0.156965f, -0.157154f,
+ -0.157343f, -0.157533f, -0.157722f, -0.157912f, -0.158101f, -0.158290f, -0.158480f, -0.158669f,
+ -0.158858f, -0.159047f, -0.159237f, -0.159426f, -0.159615f, -0.159805f, -0.159994f, -0.160183f,
+ -0.160372f, -0.160562f, -0.160751f, -0.160940f, -0.161129f, -0.161319f, -0.161508f, -0.161697f,
+ -0.161886f, -0.162076f, -0.162265f, -0.162454f, -0.162643f, -0.162832f, -0.163022f, -0.163211f,
+ -0.163400f, -0.163589f, -0.163778f, -0.163967f, -0.164157f, -0.164346f, -0.164535f, -0.164724f,
+ -0.164913f, -0.165102f, -0.165291f, -0.165480f, -0.165670f, -0.165859f, -0.166048f, -0.166237f,
+ -0.166426f, -0.166615f, -0.166804f, -0.166993f, -0.167182f, -0.167371f, -0.167560f, -0.167749f,
+ -0.167938f, -0.168127f, -0.168316f, -0.168505f, -0.168694f, -0.168883f, -0.169072f, -0.169261f,
+ -0.169450f, -0.169639f, -0.169828f, -0.170017f, -0.170206f, -0.170395f, -0.170584f, -0.170773f,
+ -0.170962f, -0.171151f, -0.171340f, -0.171529f, -0.171718f, -0.171906f, -0.172095f, -0.172284f,
+ -0.172473f, -0.172662f, -0.172851f, -0.173040f, -0.173229f, -0.173417f, -0.173606f, -0.173795f,
+ -0.173984f, -0.174173f, -0.174362f, -0.174550f, -0.174739f, -0.174928f, -0.175117f, -0.175305f,
+ -0.175494f, -0.175683f, -0.175872f, -0.176061f, -0.176249f, -0.176438f, -0.176627f, -0.176815f,
+ -0.177004f, -0.177193f, -0.177382f, -0.177570f, -0.177759f, -0.177948f, -0.178136f, -0.178325f,
+ -0.178514f, -0.178702f, -0.178891f, -0.179080f, -0.179268f, -0.179457f, -0.179646f, -0.179834f,
+ -0.180023f, -0.180212f, -0.180400f, -0.180589f, -0.180777f, -0.180966f, -0.181154f, -0.181343f,
+ -0.181532f, -0.181720f, -0.181909f, -0.182097f, -0.182286f, -0.182474f, -0.182663f, -0.182851f,
+ -0.183040f, -0.183228f, -0.183417f, -0.183605f, -0.183794f, -0.183982f, -0.184171f, -0.184359f,
+ -0.184548f, -0.184736f, -0.184925f, -0.185113f, -0.185301f, -0.185490f, -0.185678f, -0.185867f,
+ -0.186055f, -0.186244f, -0.186432f, -0.186620f, -0.186809f, -0.186997f, -0.187185f, -0.187374f,
+ -0.187562f, -0.187750f, -0.187939f, -0.188127f, -0.188315f, -0.188504f, -0.188692f, -0.188880f,
+ -0.189069f, -0.189257f, -0.189445f, -0.189634f, -0.189822f, -0.190010f, -0.190198f, -0.190387f,
+ -0.190575f, -0.190763f, -0.190951f, -0.191139f, -0.191328f, -0.191516f, -0.191704f, -0.191892f,
+ -0.192080f, -0.192269f, -0.192457f, -0.192645f, -0.192833f, -0.193021f, -0.193209f, -0.193397f,
+ -0.193586f, -0.193774f, -0.193962f, -0.194150f, -0.194338f, -0.194526f, -0.194714f, -0.194902f,
+ -0.195090f, -0.195278f, -0.195466f, -0.195654f, -0.195843f, -0.196031f, -0.196219f, -0.196407f,
+ -0.196595f, -0.196783f, -0.196971f, -0.197159f, -0.197347f, -0.197535f, -0.197722f, -0.197910f,
+ -0.198098f, -0.198286f, -0.198474f, -0.198662f, -0.198850f, -0.199038f, -0.199226f, -0.199414f,
+ -0.199602f, -0.199790f, -0.199978f, -0.200165f, -0.200353f, -0.200541f, -0.200729f, -0.200917f,
+ -0.201105f, -0.201292f, -0.201480f, -0.201668f, -0.201856f, -0.202044f, -0.202231f, -0.202419f,
+ -0.202607f, -0.202795f, -0.202983f, -0.203170f, -0.203358f, -0.203546f, -0.203734f, -0.203921f,
+ -0.204109f, -0.204297f, -0.204484f, -0.204672f, -0.204860f, -0.205047f, -0.205235f, -0.205423f,
+ -0.205610f, -0.205798f, -0.205986f, -0.206173f, -0.206361f, -0.206549f, -0.206736f, -0.206924f,
+ -0.207111f, -0.207299f, -0.207487f, -0.207674f, -0.207862f, -0.208049f, -0.208237f, -0.208424f,
+ -0.208612f, -0.208799f, -0.208987f, -0.209174f, -0.209362f, -0.209549f, -0.209737f, -0.209924f,
+ -0.210112f, -0.210299f, -0.210487f, -0.210674f, -0.210862f, -0.211049f, -0.211237f, -0.211424f,
+ -0.211611f, -0.211799f, -0.211986f, -0.212174f, -0.212361f, -0.212548f, -0.212736f, -0.212923f,
+ -0.213110f, -0.213298f, -0.213485f, -0.213672f, -0.213860f, -0.214047f, -0.214234f, -0.214422f,
+ -0.214609f, -0.214796f, -0.214983f, -0.215171f, -0.215358f, -0.215545f, -0.215732f, -0.215920f,
+ -0.216107f, -0.216294f, -0.216481f, -0.216668f, -0.216856f, -0.217043f, -0.217230f, -0.217417f,
+ -0.217604f, -0.217791f, -0.217979f, -0.218166f, -0.218353f, -0.218540f, -0.218727f, -0.218914f,
+ -0.219101f, -0.219288f, -0.219475f, -0.219662f, -0.219850f, -0.220037f, -0.220224f, -0.220411f,
+ -0.220598f, -0.220785f, -0.220972f, -0.221159f, -0.221346f, -0.221533f, -0.221720f, -0.221907f,
+ -0.222094f, -0.222281f, -0.222468f, -0.222654f, -0.222841f, -0.223028f, -0.223215f, -0.223402f,
+ -0.223589f, -0.223776f, -0.223963f, -0.224150f, -0.224337f, -0.224523f, -0.224710f, -0.224897f,
+ -0.225084f, -0.225271f, -0.225458f, -0.225644f, -0.225831f, -0.226018f, -0.226205f, -0.226391f,
+ -0.226578f, -0.226765f, -0.226952f, -0.227139f, -0.227325f, -0.227512f, -0.227699f, -0.227885f,
+ -0.228072f, -0.228259f, -0.228445f, -0.228632f, -0.228819f, -0.229005f, -0.229192f, -0.229379f,
+ -0.229565f, -0.229752f, -0.229939f, -0.230125f, -0.230312f, -0.230498f, -0.230685f, -0.230872f,
+ -0.231058f, -0.231245f, -0.231431f, -0.231618f, -0.231804f, -0.231991f, -0.232177f, -0.232364f,
+ -0.232550f, -0.232737f, -0.232923f, -0.233110f, -0.233296f, -0.233483f, -0.233669f, -0.233856f,
+ -0.234042f, -0.234228f, -0.234415f, -0.234601f, -0.234788f, -0.234974f, -0.235160f, -0.235347f,
+ -0.235533f, -0.235719f, -0.235906f, -0.236092f, -0.236278f, -0.236465f, -0.236651f, -0.236837f,
+ -0.237024f, -0.237210f, -0.237396f, -0.237582f, -0.237769f, -0.237955f, -0.238141f, -0.238327f,
+ -0.238514f, -0.238700f, -0.238886f, -0.239072f, -0.239258f, -0.239445f, -0.239631f, -0.239817f,
+ -0.240003f, -0.240189f, -0.240375f, -0.240561f, -0.240748f, -0.240934f, -0.241120f, -0.241306f,
+ -0.241492f, -0.241678f, -0.241864f, -0.242050f, -0.242236f, -0.242422f, -0.242608f, -0.242794f,
+ -0.242980f, -0.243166f, -0.243352f, -0.243538f, -0.243724f, -0.243910f, -0.244096f, -0.244282f,
+ -0.244468f, -0.244654f, -0.244840f, -0.245026f, -0.245212f, -0.245397f, -0.245583f, -0.245769f,
+ -0.245955f, -0.246141f, -0.246327f, -0.246513f, -0.246698f, -0.246884f, -0.247070f, -0.247256f,
+ -0.247442f, -0.247627f, -0.247813f, -0.247999f, -0.248185f, -0.248370f, -0.248556f, -0.248742f,
+ -0.248928f, -0.249113f, -0.249299f, -0.249485f, -0.249670f, -0.249856f, -0.250042f, -0.250227f,
+ -0.250413f, -0.250599f, -0.250784f, -0.250970f, -0.251155f, -0.251341f, -0.251527f, -0.251712f,
+ -0.251898f, -0.252083f, -0.252269f, -0.252454f, -0.252640f, -0.252826f, -0.253011f, -0.253197f,
+ -0.253382f, -0.253568f, -0.253753f, -0.253938f, -0.254124f, -0.254309f, -0.254495f, -0.254680f,
+ -0.254866f, -0.255051f, -0.255236f, -0.255422f, -0.255607f, -0.255793f, -0.255978f, -0.256163f,
+ -0.256349f, -0.256534f, -0.256719f, -0.256905f, -0.257090f, -0.257275f, -0.257461f, -0.257646f,
+ -0.257831f, -0.258016f, -0.258202f, -0.258387f, -0.258572f, -0.258757f, -0.258943f, -0.259128f,
+ -0.259313f, -0.259498f, -0.259683f, -0.259868f, -0.260054f, -0.260239f, -0.260424f, -0.260609f,
+ -0.260794f, -0.260979f, -0.261164f, -0.261349f, -0.261534f, -0.261720f, -0.261905f, -0.262090f,
+ -0.262275f, -0.262460f, -0.262645f, -0.262830f, -0.263015f, -0.263200f, -0.263385f, -0.263570f,
+ -0.263755f, -0.263940f, -0.264125f, -0.264309f, -0.264494f, -0.264679f, -0.264864f, -0.265049f,
+ -0.265234f, -0.265419f, -0.265604f, -0.265789f, -0.265973f, -0.266158f, -0.266343f, -0.266528f,
+ -0.266713f, -0.266898f, -0.267082f, -0.267267f, -0.267452f, -0.267637f, -0.267821f, -0.268006f,
+ -0.268191f, -0.268376f, -0.268560f, -0.268745f, -0.268930f, -0.269114f, -0.269299f, -0.269484f,
+ -0.269668f, -0.269853f, -0.270038f, -0.270222f, -0.270407f, -0.270591f, -0.270776f, -0.270961f,
+ -0.271145f, -0.271330f, -0.271514f, -0.271699f, -0.271883f, -0.272068f, -0.272252f, -0.272437f,
+ -0.272621f, -0.272806f, -0.272990f, -0.273175f, -0.273359f, -0.273544f, -0.273728f, -0.273912f,
+ -0.274097f, -0.274281f, -0.274466f, -0.274650f, -0.274834f, -0.275019f, -0.275203f, -0.275387f,
+ -0.275572f, -0.275756f, -0.275940f, -0.276125f, -0.276309f, -0.276493f, -0.276678f, -0.276862f,
+ -0.277046f, -0.277230f, -0.277415f, -0.277599f, -0.277783f, -0.277967f, -0.278151f, -0.278336f,
+ -0.278520f, -0.278704f, -0.278888f, -0.279072f, -0.279256f, -0.279440f, -0.279624f, -0.279809f,
+ -0.279993f, -0.280177f, -0.280361f, -0.280545f, -0.280729f, -0.280913f, -0.281097f, -0.281281f,
+ -0.281465f, -0.281649f, -0.281833f, -0.282017f, -0.282201f, -0.282385f, -0.282569f, -0.282753f,
+ -0.282937f, -0.283120f, -0.283304f, -0.283488f, -0.283672f, -0.283856f, -0.284040f, -0.284224f,
+ -0.284408f, -0.284591f, -0.284775f, -0.284959f, -0.285143f, -0.285327f, -0.285510f, -0.285694f,
+ -0.285878f, -0.286062f, -0.286245f, -0.286429f, -0.286613f, -0.286796f, -0.286980f, -0.287164f,
+ -0.287347f, -0.287531f, -0.287715f, -0.287898f, -0.288082f, -0.288266f, -0.288449f, -0.288633f,
+ -0.288816f, -0.289000f, -0.289184f, -0.289367f, -0.289551f, -0.289734f, -0.289918f, -0.290101f,
+ -0.290285f, -0.290468f, -0.290652f, -0.290835f, -0.291019f, -0.291202f, -0.291385f, -0.291569f,
+ -0.291752f, -0.291936f, -0.292119f, -0.292302f, -0.292486f, -0.292669f, -0.292852f, -0.293036f,
+ -0.293219f, -0.293402f, -0.293586f, -0.293769f, -0.293952f, -0.294136f, -0.294319f, -0.294502f,
+ -0.294685f, -0.294869f, -0.295052f, -0.295235f, -0.295418f, -0.295601f, -0.295785f, -0.295968f,
+ -0.296151f, -0.296334f, -0.296517f, -0.296700f, -0.296883f, -0.297066f, -0.297250f, -0.297433f,
+ -0.297616f, -0.297799f, -0.297982f, -0.298165f, -0.298348f, -0.298531f, -0.298714f, -0.298897f,
+ -0.299080f, -0.299263f, -0.299446f, -0.299629f, -0.299812f, -0.299995f, -0.300177f, -0.300360f,
+ -0.300543f, -0.300726f, -0.300909f, -0.301092f, -0.301275f, -0.301458f, -0.301640f, -0.301823f,
+ -0.302006f, -0.302189f, -0.302372f, -0.302554f, -0.302737f, -0.302920f, -0.303103f, -0.303285f,
+ -0.303468f, -0.303651f, -0.303833f, -0.304016f, -0.304199f, -0.304381f, -0.304564f, -0.304747f,
+ -0.304929f, -0.305112f, -0.305294f, -0.305477f, -0.305660f, -0.305842f, -0.306025f, -0.306207f,
+ -0.306390f, -0.306572f, -0.306755f, -0.306937f, -0.307120f, -0.307302f, -0.307485f, -0.307667f,
+ -0.307850f, -0.308032f, -0.308214f, -0.308397f, -0.308579f, -0.308762f, -0.308944f, -0.309126f,
+ -0.309309f, -0.309491f, -0.309673f, -0.309856f, -0.310038f, -0.310220f, -0.310403f, -0.310585f,
+ -0.310767f, -0.310949f, -0.311132f, -0.311314f, -0.311496f, -0.311678f, -0.311860f, -0.312043f,
+ -0.312225f, -0.312407f, -0.312589f, -0.312771f, -0.312953f, -0.313135f, -0.313318f, -0.313500f,
+ -0.313682f, -0.313864f, -0.314046f, -0.314228f, -0.314410f, -0.314592f, -0.314774f, -0.314956f,
+ -0.315138f, -0.315320f, -0.315502f, -0.315684f, -0.315866f, -0.316048f, -0.316230f, -0.316411f,
+ -0.316593f, -0.316775f, -0.316957f, -0.317139f, -0.317321f, -0.317503f, -0.317684f, -0.317866f,
+ -0.318048f, -0.318230f, -0.318412f, -0.318593f, -0.318775f, -0.318957f, -0.319139f, -0.319320f,
+ -0.319502f, -0.319684f, -0.319865f, -0.320047f, -0.320229f, -0.320410f, -0.320592f, -0.320774f,
+ -0.320955f, -0.321137f, -0.321318f, -0.321500f, -0.321682f, -0.321863f, -0.322045f, -0.322226f,
+ -0.322408f, -0.322589f, -0.322771f, -0.322952f, -0.323134f, -0.323315f, -0.323497f, -0.323678f,
+ -0.323859f, -0.324041f, -0.324222f, -0.324404f, -0.324585f, -0.324766f, -0.324948f, -0.325129f,
+ -0.325310f, -0.325492f, -0.325673f, -0.325854f, -0.326035f, -0.326217f, -0.326398f, -0.326579f,
+ -0.326760f, -0.326942f, -0.327123f, -0.327304f, -0.327485f, -0.327666f, -0.327848f, -0.328029f,
+ -0.328210f, -0.328391f, -0.328572f, -0.328753f, -0.328934f, -0.329115f, -0.329296f, -0.329477f,
+ -0.329658f, -0.329839f, -0.330020f, -0.330202f, -0.330382f, -0.330563f, -0.330744f, -0.330925f,
+ -0.331106f, -0.331287f, -0.331468f, -0.331649f, -0.331830f, -0.332011f, -0.332192f, -0.332373f,
+ -0.332553f, -0.332734f, -0.332915f, -0.333096f, -0.333277f, -0.333457f, -0.333638f, -0.333819f,
+ -0.334000f, -0.334180f, -0.334361f, -0.334542f, -0.334722f, -0.334903f, -0.335084f, -0.335265f,
+ -0.335445f, -0.335626f, -0.335806f, -0.335987f, -0.336168f, -0.336348f, -0.336529f, -0.336709f,
+ -0.336890f, -0.337070f, -0.337251f, -0.337431f, -0.337612f, -0.337792f, -0.337973f, -0.338153f,
+ -0.338334f, -0.338514f, -0.338695f, -0.338875f, -0.339055f, -0.339236f, -0.339416f, -0.339597f,
+ -0.339777f, -0.339957f, -0.340138f, -0.340318f, -0.340498f, -0.340678f, -0.340859f, -0.341039f,
+ -0.341219f, -0.341399f, -0.341580f, -0.341760f, -0.341940f, -0.342120f, -0.342300f, -0.342481f,
+ -0.342661f, -0.342841f, -0.343021f, -0.343201f, -0.343381f, -0.343561f, -0.343741f, -0.343921f,
+ -0.344101f, -0.344281f, -0.344461f, -0.344641f, -0.344821f, -0.345001f, -0.345181f, -0.345361f,
+ -0.345541f, -0.345721f, -0.345901f, -0.346081f, -0.346261f, -0.346441f, -0.346621f, -0.346801f,
+ -0.346980f, -0.347160f, -0.347340f, -0.347520f, -0.347700f, -0.347879f, -0.348059f, -0.348239f,
+ -0.348419f, -0.348598f, -0.348778f, -0.348958f, -0.349138f, -0.349317f, -0.349497f, -0.349676f,
+ -0.349856f, -0.350036f, -0.350215f, -0.350395f, -0.350575f, -0.350754f, -0.350934f, -0.351113f,
+ -0.351293f, -0.351472f, -0.351652f, -0.351831f, -0.352011f, -0.352190f, -0.352370f, -0.352549f,
+ -0.352729f, -0.352908f, -0.353087f, -0.353267f, -0.353446f, -0.353626f, -0.353805f, -0.353984f,
+ -0.354164f, -0.354343f, -0.354522f, -0.354701f, -0.354881f, -0.355060f, -0.355239f, -0.355418f,
+ -0.355598f, -0.355777f, -0.355956f, -0.356135f, -0.356314f, -0.356494f, -0.356673f, -0.356852f,
+ -0.357031f, -0.357210f, -0.357389f, -0.357568f, -0.357747f, -0.357926f, -0.358105f, -0.358284f,
+ -0.358463f, -0.358642f, -0.358821f, -0.359000f, -0.359179f, -0.359358f, -0.359537f, -0.359716f,
+ -0.359895f, -0.360074f, -0.360253f, -0.360432f, -0.360611f, -0.360789f, -0.360968f, -0.361147f,
+ -0.361326f, -0.361505f, -0.361683f, -0.361862f, -0.362041f, -0.362220f, -0.362398f, -0.362577f,
+ -0.362756f, -0.362934f, -0.363113f, -0.363292f, -0.363470f, -0.363649f, -0.363828f, -0.364006f,
+ -0.364185f, -0.364363f, -0.364542f, -0.364720f, -0.364899f, -0.365078f, -0.365256f, -0.365435f,
+ -0.365613f, -0.365791f, -0.365970f, -0.366148f, -0.366327f, -0.366505f, -0.366684f, -0.366862f,
+ -0.367040f, -0.367219f, -0.367397f, -0.367575f, -0.367754f, -0.367932f, -0.368110f, -0.368289f,
+ -0.368467f, -0.368645f, -0.368823f, -0.369002f, -0.369180f, -0.369358f, -0.369536f, -0.369714f,
+ -0.369892f, -0.370071f, -0.370249f, -0.370427f, -0.370605f, -0.370783f, -0.370961f, -0.371139f,
+ -0.371317f, -0.371495f, -0.371673f, -0.371851f, -0.372029f, -0.372207f, -0.372385f, -0.372563f,
+ -0.372741f, -0.372919f, -0.373097f, -0.373275f, -0.373453f, -0.373631f, -0.373808f, -0.373986f,
+ -0.374164f, -0.374342f, -0.374520f, -0.374697f, -0.374875f, -0.375053f, -0.375231f, -0.375408f,
+ -0.375586f, -0.375764f, -0.375942f, -0.376119f, -0.376297f, -0.376475f, -0.376652f, -0.376830f,
+ -0.377007f, -0.377185f, -0.377363f, -0.377540f, -0.377718f, -0.377895f, -0.378073f, -0.378250f,
+ -0.378428f, -0.378605f, -0.378783f, -0.378960f, -0.379138f, -0.379315f, -0.379492f, -0.379670f,
+ -0.379847f, -0.380025f, -0.380202f, -0.380379f, -0.380557f, -0.380734f, -0.380911f, -0.381088f,
+ -0.381266f, -0.381443f, -0.381620f, -0.381797f, -0.381975f, -0.382152f, -0.382329f, -0.382506f,
+ -0.382683f, -0.382861f, -0.383038f, -0.383215f, -0.383392f, -0.383569f, -0.383746f, -0.383923f,
+ -0.384100f, -0.384277f, -0.384454f, -0.384631f, -0.384808f, -0.384985f, -0.385162f, -0.385339f,
+ -0.385516f, -0.385693f, -0.385870f, -0.386047f, -0.386224f, -0.386400f, -0.386577f, -0.386754f,
+ -0.386931f, -0.387108f, -0.387285f, -0.387461f, -0.387638f, -0.387815f, -0.387992f, -0.388168f,
+ -0.388345f, -0.388522f, -0.388698f, -0.388875f, -0.389052f, -0.389228f, -0.389405f, -0.389582f,
+ -0.389758f, -0.389935f, -0.390111f, -0.390288f, -0.390464f, -0.390641f, -0.390817f, -0.390994f,
+ -0.391170f, -0.391347f, -0.391523f, -0.391700f, -0.391876f, -0.392053f, -0.392229f, -0.392405f,
+ -0.392582f, -0.392758f, -0.392934f, -0.393111f, -0.393287f, -0.393463f, -0.393640f, -0.393816f,
+ -0.393992f, -0.394168f, -0.394344f, -0.394521f, -0.394697f, -0.394873f, -0.395049f, -0.395225f,
+ -0.395401f, -0.395578f, -0.395754f, -0.395930f, -0.396106f, -0.396282f, -0.396458f, -0.396634f,
+ -0.396810f, -0.396986f, -0.397162f, -0.397338f, -0.397514f, -0.397690f, -0.397866f, -0.398042f,
+ -0.398218f, -0.398393f, -0.398569f, -0.398745f, -0.398921f, -0.399097f, -0.399273f, -0.399448f,
+ -0.399624f, -0.399800f, -0.399976f, -0.400151f, -0.400327f, -0.400503f, -0.400679f, -0.400854f,
+ -0.401030f, -0.401206f, -0.401381f, -0.401557f, -0.401732f, -0.401908f, -0.402084f, -0.402259f,
+ -0.402435f, -0.402610f, -0.402786f, -0.402961f, -0.403137f, -0.403312f, -0.403488f, -0.403663f,
+ -0.403838f, -0.404014f, -0.404189f, -0.404365f, -0.404540f, -0.404715f, -0.404891f, -0.405066f,
+ -0.405241f, -0.405417f, -0.405592f, -0.405767f, -0.405942f, -0.406118f, -0.406293f, -0.406468f,
+ -0.406643f, -0.406818f, -0.406994f, -0.407169f, -0.407344f, -0.407519f, -0.407694f, -0.407869f,
+ -0.408044f, -0.408219f, -0.408394f, -0.408569f, -0.408744f, -0.408919f, -0.409094f, -0.409269f,
+ -0.409444f, -0.409619f, -0.409794f, -0.409969f, -0.410144f, -0.410319f, -0.410493f, -0.410668f,
+ -0.410843f, -0.411018f, -0.411193f, -0.411368f, -0.411542f, -0.411717f, -0.411892f, -0.412067f,
+ -0.412241f, -0.412416f, -0.412591f, -0.412765f, -0.412940f, -0.413115f, -0.413289f, -0.413464f,
+ -0.413638f, -0.413813f, -0.413987f, -0.414162f, -0.414337f, -0.414511f, -0.414685f, -0.414860f,
+ -0.415034f, -0.415209f, -0.415383f, -0.415558f, -0.415732f, -0.415906f, -0.416081f, -0.416255f,
+ -0.416430f, -0.416604f, -0.416778f, -0.416952f, -0.417127f, -0.417301f, -0.417475f, -0.417650f,
+ -0.417824f, -0.417998f, -0.418172f, -0.418346f, -0.418520f, -0.418695f, -0.418869f, -0.419043f,
+ -0.419217f, -0.419391f, -0.419565f, -0.419739f, -0.419913f, -0.420087f, -0.420261f, -0.420435f,
+ -0.420609f, -0.420783f, -0.420957f, -0.421131f, -0.421305f, -0.421479f, -0.421653f, -0.421826f,
+ -0.422000f, -0.422174f, -0.422348f, -0.422522f, -0.422695f, -0.422869f, -0.423043f, -0.423217f,
+ -0.423390f, -0.423564f, -0.423738f, -0.423912f, -0.424085f, -0.424259f, -0.424432f, -0.424606f,
+ -0.424780f, -0.424953f, -0.425127f, -0.425300f, -0.425474f, -0.425647f, -0.425821f, -0.425994f,
+ -0.426168f, -0.426341f, -0.426515f, -0.426688f, -0.426862f, -0.427035f, -0.427208f, -0.427382f,
+ -0.427555f, -0.427728f, -0.427902f, -0.428075f, -0.428248f, -0.428422f, -0.428595f, -0.428768f,
+ -0.428941f, -0.429114f, -0.429288f, -0.429461f, -0.429634f, -0.429807f, -0.429980f, -0.430153f,
+ -0.430326f, -0.430500f, -0.430673f, -0.430846f, -0.431019f, -0.431192f, -0.431365f, -0.431538f,
+ -0.431711f, -0.431884f, -0.432057f, -0.432229f, -0.432402f, -0.432575f, -0.432748f, -0.432921f,
+ -0.433094f, -0.433267f, -0.433439f, -0.433612f, -0.433785f, -0.433958f, -0.434131f, -0.434303f,
+ -0.434476f, -0.434649f, -0.434821f, -0.434994f, -0.435167f, -0.435339f, -0.435512f, -0.435685f,
+ -0.435857f, -0.436030f, -0.436202f, -0.436375f, -0.436547f, -0.436720f, -0.436892f, -0.437065f,
+ -0.437237f, -0.437410f, -0.437582f, -0.437754f, -0.437927f, -0.438099f, -0.438272f, -0.438444f,
+ -0.438616f, -0.438789f, -0.438961f, -0.439133f, -0.439305f, -0.439478f, -0.439650f, -0.439822f,
+ -0.439994f, -0.440166f, -0.440339f, -0.440511f, -0.440683f, -0.440855f, -0.441027f, -0.441199f,
+ -0.441371f, -0.441543f, -0.441715f, -0.441887f, -0.442059f, -0.442231f, -0.442403f, -0.442575f,
+ -0.442747f, -0.442919f, -0.443091f, -0.443263f, -0.443435f, -0.443607f, -0.443779f, -0.443950f,
+ -0.444122f, -0.444294f, -0.444466f, -0.444637f, -0.444809f, -0.444981f, -0.445153f, -0.445324f,
+ -0.445496f, -0.445668f, -0.445839f, -0.446011f, -0.446183f, -0.446354f, -0.446526f, -0.446697f,
+ -0.446869f, -0.447040f, -0.447212f, -0.447383f, -0.447555f, -0.447726f, -0.447898f, -0.448069f,
+ -0.448241f, -0.448412f, -0.448583f, -0.448755f, -0.448926f, -0.449097f, -0.449269f, -0.449440f,
+ -0.449611f, -0.449783f, -0.449954f, -0.450125f, -0.450296f, -0.450467f, -0.450639f, -0.450810f,
+ -0.450981f, -0.451152f, -0.451323f, -0.451494f, -0.451665f, -0.451836f, -0.452008f, -0.452179f,
+ -0.452350f, -0.452521f, -0.452692f, -0.452863f, -0.453033f, -0.453204f, -0.453375f, -0.453546f,
+ -0.453717f, -0.453888f, -0.454059f, -0.454230f, -0.454400f, -0.454571f, -0.454742f, -0.454913f,
+ -0.455084f, -0.455254f, -0.455425f, -0.455596f, -0.455766f, -0.455937f, -0.456108f, -0.456278f,
+ -0.456449f, -0.456620f, -0.456790f, -0.456961f, -0.457131f, -0.457302f, -0.457472f, -0.457643f,
+ -0.457813f, -0.457984f, -0.458154f, -0.458325f, -0.458495f, -0.458665f, -0.458836f, -0.459006f,
+ -0.459177f, -0.459347f, -0.459517f, -0.459687f, -0.459858f, -0.460028f, -0.460198f, -0.460369f,
+ -0.460539f, -0.460709f, -0.460879f, -0.461049f, -0.461219f, -0.461390f, -0.461560f, -0.461730f,
+ -0.461900f, -0.462070f, -0.462240f, -0.462410f, -0.462580f, -0.462750f, -0.462920f, -0.463090f,
+ -0.463260f, -0.463430f, -0.463600f, -0.463769f, -0.463939f, -0.464109f, -0.464279f, -0.464449f,
+ -0.464619f, -0.464788f, -0.464958f, -0.465128f, -0.465298f, -0.465467f, -0.465637f, -0.465807f,
+ -0.465977f, -0.466146f, -0.466316f, -0.466485f, -0.466655f, -0.466825f, -0.466994f, -0.467164f,
+ -0.467333f, -0.467503f, -0.467672f, -0.467842f, -0.468011f, -0.468181f, -0.468350f, -0.468519f,
+ -0.468689f, -0.468858f, -0.469028f, -0.469197f, -0.469366f, -0.469536f, -0.469705f, -0.469874f,
+ -0.470043f, -0.470213f, -0.470382f, -0.470551f, -0.470720f, -0.470889f, -0.471058f, -0.471228f,
+ -0.471397f, -0.471566f, -0.471735f, -0.471904f, -0.472073f, -0.472242f, -0.472411f, -0.472580f,
+ -0.472749f, -0.472918f, -0.473087f, -0.473256f, -0.473425f, -0.473594f, -0.473763f, -0.473931f,
+ -0.474100f, -0.474269f, -0.474438f, -0.474607f, -0.474775f, -0.474944f, -0.475113f, -0.475282f,
+ -0.475450f, -0.475619f, -0.475788f, -0.475956f, -0.476125f, -0.476294f, -0.476462f, -0.476631f,
+ -0.476799f, -0.476968f, -0.477136f, -0.477305f, -0.477473f, -0.477642f, -0.477810f, -0.477979f,
+ -0.478147f, -0.478315f, -0.478484f, -0.478652f, -0.478821f, -0.478989f, -0.479157f, -0.479325f,
+ -0.479494f, -0.479662f, -0.479830f, -0.479998f, -0.480167f, -0.480335f, -0.480503f, -0.480671f,
+ -0.480839f, -0.481007f, -0.481176f, -0.481344f, -0.481512f, -0.481680f, -0.481848f, -0.482016f,
+ -0.482184f, -0.482352f, -0.482520f, -0.482688f, -0.482856f, -0.483023f, -0.483191f, -0.483359f,
+ -0.483527f, -0.483695f, -0.483863f, -0.484031f, -0.484198f, -0.484366f, -0.484534f, -0.484702f,
+ -0.484869f, -0.485037f, -0.485205f, -0.485372f, -0.485540f, -0.485708f, -0.485875f, -0.486043f,
+ -0.486210f, -0.486378f, -0.486545f, -0.486713f, -0.486880f, -0.487048f, -0.487215f, -0.487383f,
+ -0.487550f, -0.487718f, -0.487885f, -0.488052f, -0.488220f, -0.488387f, -0.488554f, -0.488722f,
+ -0.488889f, -0.489056f, -0.489223f, -0.489391f, -0.489558f, -0.489725f, -0.489892f, -0.490059f,
+ -0.490226f, -0.490394f, -0.490561f, -0.490728f, -0.490895f, -0.491062f, -0.491229f, -0.491396f,
+ -0.491563f, -0.491730f, -0.491897f, -0.492064f, -0.492231f, -0.492398f, -0.492564f, -0.492731f,
+ -0.492898f, -0.493065f, -0.493232f, -0.493399f, -0.493565f, -0.493732f, -0.493899f, -0.494066f,
+ -0.494232f, -0.494399f, -0.494566f, -0.494732f, -0.494899f, -0.495066f, -0.495232f, -0.495399f,
+ -0.495565f, -0.495732f, -0.495898f, -0.496065f, -0.496231f, -0.496398f, -0.496564f, -0.496731f,
+ -0.496897f, -0.497063f, -0.497230f, -0.497396f, -0.497562f, -0.497729f, -0.497895f, -0.498061f,
+ -0.498228f, -0.498394f, -0.498560f, -0.498726f, -0.498893f, -0.499059f, -0.499225f, -0.499391f,
+ -0.499557f, -0.499723f, -0.499889f, -0.500055f, -0.500221f, -0.500387f, -0.500553f, -0.500719f,
+ -0.500885f, -0.501051f, -0.501217f, -0.501383f, -0.501549f, -0.501715f, -0.501881f, -0.502047f,
+ -0.502212f, -0.502378f, -0.502544f, -0.502710f, -0.502876f, -0.503041f, -0.503207f, -0.503373f,
+ -0.503538f, -0.503704f, -0.503870f, -0.504035f, -0.504201f, -0.504366f, -0.504532f, -0.504698f,
+ -0.504863f, -0.505029f, -0.505194f, -0.505360f, -0.505525f, -0.505690f, -0.505856f, -0.506021f,
+ -0.506187f, -0.506352f, -0.506517f, -0.506683f, -0.506848f, -0.507013f, -0.507179f, -0.507344f,
+ -0.507509f, -0.507674f, -0.507839f, -0.508005f, -0.508170f, -0.508335f, -0.508500f, -0.508665f,
+ -0.508830f, -0.508995f, -0.509160f, -0.509325f, -0.509490f, -0.509655f, -0.509820f, -0.509985f,
+ -0.510150f, -0.510315f, -0.510480f, -0.510645f, -0.510810f, -0.510974f, -0.511139f, -0.511304f,
+ -0.511469f, -0.511634f, -0.511798f, -0.511963f, -0.512128f, -0.512292f, -0.512457f, -0.512622f,
+ -0.512786f, -0.512951f, -0.513116f, -0.513280f, -0.513445f, -0.513609f, -0.513774f, -0.513938f,
+ -0.514103f, -0.514267f, -0.514432f, -0.514596f, -0.514760f, -0.514925f, -0.515089f, -0.515254f,
+ -0.515418f, -0.515582f, -0.515746f, -0.515911f, -0.516075f, -0.516239f, -0.516403f, -0.516568f,
+ -0.516732f, -0.516896f, -0.517060f, -0.517224f, -0.517388f, -0.517552f, -0.517716f, -0.517880f,
+ -0.518045f, -0.518209f, -0.518372f, -0.518536f, -0.518700f, -0.518864f, -0.519028f, -0.519192f,
+ -0.519356f, -0.519520f, -0.519684f, -0.519848f, -0.520011f, -0.520175f, -0.520339f, -0.520503f,
+ -0.520666f, -0.520830f, -0.520994f, -0.521157f, -0.521321f, -0.521485f, -0.521648f, -0.521812f,
+ -0.521975f, -0.522139f, -0.522302f, -0.522466f, -0.522629f, -0.522793f, -0.522956f, -0.523120f,
+ -0.523283f, -0.523447f, -0.523610f, -0.523773f, -0.523937f, -0.524100f, -0.524263f, -0.524426f,
+ -0.524590f, -0.524753f, -0.524916f, -0.525079f, -0.525243f, -0.525406f, -0.525569f, -0.525732f,
+ -0.525895f, -0.526058f, -0.526221f, -0.526384f, -0.526547f, -0.526710f, -0.526873f, -0.527036f,
+ -0.527199f, -0.527362f, -0.527525f, -0.527688f, -0.527851f, -0.528014f, -0.528176f, -0.528339f,
+ -0.528502f, -0.528665f, -0.528828f, -0.528990f, -0.529153f, -0.529316f, -0.529478f, -0.529641f,
+ -0.529804f, -0.529966f, -0.530129f, -0.530291f, -0.530454f, -0.530617f, -0.530779f, -0.530942f,
+ -0.531104f, -0.531266f, -0.531429f, -0.531591f, -0.531754f, -0.531916f, -0.532078f, -0.532241f,
+ -0.532403f, -0.532565f, -0.532728f, -0.532890f, -0.533052f, -0.533214f, -0.533377f, -0.533539f,
+ -0.533701f, -0.533863f, -0.534025f, -0.534187f, -0.534349f, -0.534512f, -0.534674f, -0.534836f,
+ -0.534998f, -0.535160f, -0.535322f, -0.535484f, -0.535645f, -0.535807f, -0.535969f, -0.536131f,
+ -0.536293f, -0.536455f, -0.536617f, -0.536778f, -0.536940f, -0.537102f, -0.537264f, -0.537425f,
+ -0.537587f, -0.537749f, -0.537910f, -0.538072f, -0.538234f, -0.538395f, -0.538557f, -0.538718f,
+ -0.538880f, -0.539041f, -0.539203f, -0.539364f, -0.539526f, -0.539687f, -0.539849f, -0.540010f,
+ -0.540171f, -0.540333f, -0.540494f, -0.540655f, -0.540817f, -0.540978f, -0.541139f, -0.541301f,
+ -0.541462f, -0.541623f, -0.541784f, -0.541945f, -0.542106f, -0.542268f, -0.542429f, -0.542590f,
+ -0.542751f, -0.542912f, -0.543073f, -0.543234f, -0.543395f, -0.543556f, -0.543717f, -0.543878f,
+ -0.544039f, -0.544199f, -0.544360f, -0.544521f, -0.544682f, -0.544843f, -0.545003f, -0.545164f,
+ -0.545325f, -0.545486f, -0.545646f, -0.545807f, -0.545968f, -0.546128f, -0.546289f, -0.546450f,
+ -0.546610f, -0.546771f, -0.546931f, -0.547092f, -0.547252f, -0.547413f, -0.547573f, -0.547734f,
+ -0.547894f, -0.548054f, -0.548215f, -0.548375f, -0.548536f, -0.548696f, -0.548856f, -0.549016f,
+ -0.549177f, -0.549337f, -0.549497f, -0.549657f, -0.549818f, -0.549978f, -0.550138f, -0.550298f,
+ -0.550458f, -0.550618f, -0.550778f, -0.550938f, -0.551098f, -0.551258f, -0.551418f, -0.551578f,
+ -0.551738f, -0.551898f, -0.552058f, -0.552218f, -0.552378f, -0.552537f, -0.552697f, -0.552857f,
+ -0.553017f, -0.553176f, -0.553336f, -0.553496f, -0.553656f, -0.553815f, -0.553975f, -0.554134f,
+ -0.554294f, -0.554454f, -0.554613f, -0.554773f, -0.554932f, -0.555092f, -0.555251f, -0.555411f,
+ -0.555570f, -0.555730f, -0.555889f, -0.556048f, -0.556208f, -0.556367f, -0.556526f, -0.556686f,
+ -0.556845f, -0.557004f, -0.557164f, -0.557323f, -0.557482f, -0.557641f, -0.557800f, -0.557959f,
+ -0.558119f, -0.558278f, -0.558437f, -0.558596f, -0.558755f, -0.558914f, -0.559073f, -0.559232f,
+ -0.559391f, -0.559550f, -0.559709f, -0.559867f, -0.560026f, -0.560185f, -0.560344f, -0.560503f,
+ -0.560662f, -0.560820f, -0.560979f, -0.561138f, -0.561297f, -0.561455f, -0.561614f, -0.561773f,
+ -0.561931f, -0.562090f, -0.562248f, -0.562407f, -0.562565f, -0.562724f, -0.562882f, -0.563041f,
+ -0.563199f, -0.563358f, -0.563516f, -0.563675f, -0.563833f, -0.563991f, -0.564150f, -0.564308f,
+ -0.564466f, -0.564624f, -0.564783f, -0.564941f, -0.565099f, -0.565257f, -0.565416f, -0.565574f,
+ -0.565732f, -0.565890f, -0.566048f, -0.566206f, -0.566364f, -0.566522f, -0.566680f, -0.566838f,
+ -0.566996f, -0.567154f, -0.567312f, -0.567470f, -0.567628f, -0.567786f, -0.567943f, -0.568101f,
+ -0.568259f, -0.568417f, -0.568574f, -0.568732f, -0.568890f, -0.569048f, -0.569205f, -0.569363f,
+ -0.569521f, -0.569678f, -0.569836f, -0.569993f, -0.570151f, -0.570308f, -0.570466f, -0.570623f,
+ -0.570781f, -0.570938f, -0.571096f, -0.571253f, -0.571410f, -0.571568f, -0.571725f, -0.571882f,
+ -0.572040f, -0.572197f, -0.572354f, -0.572511f, -0.572669f, -0.572826f, -0.572983f, -0.573140f,
+ -0.573297f, -0.573454f, -0.573611f, -0.573768f, -0.573925f, -0.574082f, -0.574239f, -0.574396f,
+ -0.574553f, -0.574710f, -0.574867f, -0.575024f, -0.575181f, -0.575338f, -0.575495f, -0.575651f,
+ -0.575808f, -0.575965f, -0.576122f, -0.576278f, -0.576435f, -0.576592f, -0.576748f, -0.576905f,
+ -0.577062f, -0.577218f, -0.577375f, -0.577531f, -0.577688f, -0.577844f, -0.578001f, -0.578157f,
+ -0.578314f, -0.578470f, -0.578627f, -0.578783f, -0.578939f, -0.579096f, -0.579252f, -0.579408f,
+ -0.579565f, -0.579721f, -0.579877f, -0.580033f, -0.580189f, -0.580346f, -0.580502f, -0.580658f,
+ -0.580814f, -0.580970f, -0.581126f, -0.581282f, -0.581438f, -0.581594f, -0.581750f, -0.581906f,
+ -0.582062f, -0.582218f, -0.582374f, -0.582530f, -0.582685f, -0.582841f, -0.582997f, -0.583153f,
+ -0.583309f, -0.583464f, -0.583620f, -0.583776f, -0.583931f, -0.584087f, -0.584243f, -0.584398f,
+ -0.584554f, -0.584710f, -0.584865f, -0.585021f, -0.585176f, -0.585332f, -0.585487f, -0.585642f,
+ -0.585798f, -0.585953f, -0.586109f, -0.586264f, -0.586419f, -0.586575f, -0.586730f, -0.586885f,
+ -0.587040f, -0.587196f, -0.587351f, -0.587506f, -0.587661f, -0.587816f, -0.587971f, -0.588126f,
+ -0.588282f, -0.588437f, -0.588592f, -0.588747f, -0.588902f, -0.589057f, -0.589212f, -0.589366f,
+ -0.589521f, -0.589676f, -0.589831f, -0.589986f, -0.590141f, -0.590295f, -0.590450f, -0.590605f,
+ -0.590760f, -0.590914f, -0.591069f, -0.591224f, -0.591378f, -0.591533f, -0.591688f, -0.591842f,
+ -0.591997f, -0.592151f, -0.592306f, -0.592460f, -0.592615f, -0.592769f, -0.592924f, -0.593078f,
+ -0.593232f, -0.593387f, -0.593541f, -0.593695f, -0.593850f, -0.594004f, -0.594158f, -0.594312f,
+ -0.594467f, -0.594621f, -0.594775f, -0.594929f, -0.595083f, -0.595237f, -0.595391f, -0.595545f,
+ -0.595699f, -0.595853f, -0.596007f, -0.596161f, -0.596315f, -0.596469f, -0.596623f, -0.596777f,
+ -0.596931f, -0.597085f, -0.597238f, -0.597392f, -0.597546f, -0.597700f, -0.597853f, -0.598007f,
+ -0.598161f, -0.598314f, -0.598468f, -0.598622f, -0.598775f, -0.598929f, -0.599082f, -0.599236f,
+ -0.599389f, -0.599543f, -0.599696f, -0.599850f, -0.600003f, -0.600156f, -0.600310f, -0.600463f,
+ -0.600616f, -0.600770f, -0.600923f, -0.601076f, -0.601230f, -0.601383f, -0.601536f, -0.601689f,
+ -0.601842f, -0.601995f, -0.602148f, -0.602302f, -0.602455f, -0.602608f, -0.602761f, -0.602914f,
+ -0.603067f, -0.603220f, -0.603372f, -0.603525f, -0.603678f, -0.603831f, -0.603984f, -0.604137f,
+ -0.604290f, -0.604442f, -0.604595f, -0.604748f, -0.604900f, -0.605053f, -0.605206f, -0.605358f,
+ -0.605511f, -0.605664f, -0.605816f, -0.605969f, -0.606121f, -0.606274f, -0.606426f, -0.606579f,
+ -0.606731f, -0.606884f, -0.607036f, -0.607188f, -0.607341f, -0.607493f, -0.607645f, -0.607798f,
+ -0.607950f, -0.608102f, -0.608254f, -0.608406f, -0.608559f, -0.608711f, -0.608863f, -0.609015f,
+ -0.609167f, -0.609319f, -0.609471f, -0.609623f, -0.609775f, -0.609927f, -0.610079f, -0.610231f,
+ -0.610383f, -0.610535f, -0.610687f, -0.610838f, -0.610990f, -0.611142f, -0.611294f, -0.611445f,
+ -0.611597f, -0.611749f, -0.611901f, -0.612052f, -0.612204f, -0.612355f, -0.612507f, -0.612659f,
+ -0.612810f, -0.612962f, -0.613113f, -0.613265f, -0.613416f, -0.613567f, -0.613719f, -0.613870f,
+ -0.614022f, -0.614173f, -0.614324f, -0.614475f, -0.614627f, -0.614778f, -0.614929f, -0.615080f,
+ -0.615232f, -0.615383f, -0.615534f, -0.615685f, -0.615836f, -0.615987f, -0.616138f, -0.616289f,
+ -0.616440f, -0.616591f, -0.616742f, -0.616893f, -0.617044f, -0.617195f, -0.617346f, -0.617496f,
+ -0.617647f, -0.617798f, -0.617949f, -0.618100f, -0.618250f, -0.618401f, -0.618552f, -0.618702f,
+ -0.618853f, -0.619004f, -0.619154f, -0.619305f, -0.619455f, -0.619606f, -0.619756f, -0.619907f,
+ -0.620057f, -0.620208f, -0.620358f, -0.620508f, -0.620659f, -0.620809f, -0.620959f, -0.621110f,
+ -0.621260f, -0.621410f, -0.621560f, -0.621711f, -0.621861f, -0.622011f, -0.622161f, -0.622311f,
+ -0.622461f, -0.622611f, -0.622761f, -0.622911f, -0.623061f, -0.623211f, -0.623361f, -0.623511f,
+ -0.623661f, -0.623811f, -0.623961f, -0.624111f, -0.624260f, -0.624410f, -0.624560f, -0.624710f,
+ -0.624860f, -0.625009f, -0.625159f, -0.625309f, -0.625458f, -0.625608f, -0.625757f, -0.625907f,
+ -0.626056f, -0.626206f, -0.626355f, -0.626505f, -0.626654f, -0.626804f, -0.626953f, -0.627102f,
+ -0.627252f, -0.627401f, -0.627550f, -0.627700f, -0.627849f, -0.627998f, -0.628147f, -0.628297f,
+ -0.628446f, -0.628595f, -0.628744f, -0.628893f, -0.629042f, -0.629191f, -0.629340f, -0.629489f,
+ -0.629638f, -0.629787f, -0.629936f, -0.630085f, -0.630234f, -0.630383f, -0.630532f, -0.630680f,
+ -0.630829f, -0.630978f, -0.631127f, -0.631275f, -0.631424f, -0.631573f, -0.631721f, -0.631870f,
+ -0.632019f, -0.632167f, -0.632316f, -0.632464f, -0.632613f, -0.632761f, -0.632910f, -0.633058f,
+ -0.633207f, -0.633355f, -0.633504f, -0.633652f, -0.633800f, -0.633949f, -0.634097f, -0.634245f,
+ -0.634393f, -0.634542f, -0.634690f, -0.634838f, -0.634986f, -0.635134f, -0.635282f, -0.635430f,
+ -0.635578f, -0.635726f, -0.635874f, -0.636022f, -0.636170f, -0.636318f, -0.636466f, -0.636614f,
+ -0.636762f, -0.636910f, -0.637057f, -0.637205f, -0.637353f, -0.637501f, -0.637649f, -0.637796f,
+ -0.637944f, -0.638092f, -0.638239f, -0.638387f, -0.638534f, -0.638682f, -0.638829f, -0.638977f,
+ -0.639124f, -0.639272f, -0.639419f, -0.639567f, -0.639714f, -0.639862f, -0.640009f, -0.640156f,
+ -0.640303f, -0.640451f, -0.640598f, -0.640745f, -0.640892f, -0.641040f, -0.641187f, -0.641334f,
+ -0.641481f, -0.641628f, -0.641775f, -0.641922f, -0.642069f, -0.642216f, -0.642363f, -0.642510f,
+ -0.642657f, -0.642804f, -0.642951f, -0.643098f, -0.643245f, -0.643391f, -0.643538f, -0.643685f,
+ -0.643832f, -0.643978f, -0.644125f, -0.644272f, -0.644418f, -0.644565f, -0.644711f, -0.644858f,
+ -0.645005f, -0.645151f, -0.645298f, -0.645444f, -0.645590f, -0.645737f, -0.645883f, -0.646030f,
+ -0.646176f, -0.646322f, -0.646469f, -0.646615f, -0.646761f, -0.646907f, -0.647054f, -0.647200f,
+ -0.647346f, -0.647492f, -0.647638f, -0.647784f, -0.647930f, -0.648076f, -0.648222f, -0.648368f,
+ -0.648514f, -0.648660f, -0.648806f, -0.648952f, -0.649098f, -0.649244f, -0.649390f, -0.649536f,
+ -0.649681f, -0.649827f, -0.649973f, -0.650119f, -0.650264f, -0.650410f, -0.650555f, -0.650701f,
+ -0.650847f, -0.650992f, -0.651138f, -0.651283f, -0.651429f, -0.651574f, -0.651720f, -0.651865f,
+ -0.652011f, -0.652156f, -0.652301f, -0.652447f, -0.652592f, -0.652737f, -0.652882f, -0.653028f,
+ -0.653173f, -0.653318f, -0.653463f, -0.653608f, -0.653753f, -0.653899f, -0.654044f, -0.654189f,
+ -0.654334f, -0.654479f, -0.654624f, -0.654769f, -0.654913f, -0.655058f, -0.655203f, -0.655348f,
+ -0.655493f, -0.655638f, -0.655782f, -0.655927f, -0.656072f, -0.656217f, -0.656361f, -0.656506f,
+ -0.656651f, -0.656795f, -0.656940f, -0.657084f, -0.657229f, -0.657373f, -0.657518f, -0.657662f,
+ -0.657807f, -0.657951f, -0.658095f, -0.658240f, -0.658384f, -0.658529f, -0.658673f, -0.658817f,
+ -0.658961f, -0.659105f, -0.659250f, -0.659394f, -0.659538f, -0.659682f, -0.659826f, -0.659970f,
+ -0.660114f, -0.660258f, -0.660402f, -0.660546f, -0.660690f, -0.660834f, -0.660978f, -0.661122f,
+ -0.661266f, -0.661410f, -0.661553f, -0.661697f, -0.661841f, -0.661985f, -0.662128f, -0.662272f,
+ -0.662416f, -0.662559f, -0.662703f, -0.662847f, -0.662990f, -0.663134f, -0.663277f, -0.663421f,
+ -0.663564f, -0.663708f, -0.663851f, -0.663994f, -0.664138f, -0.664281f, -0.664424f, -0.664568f,
+ -0.664711f, -0.664854f, -0.664997f, -0.665141f, -0.665284f, -0.665427f, -0.665570f, -0.665713f,
+ -0.665856f, -0.665999f, -0.666142f, -0.666285f, -0.666428f, -0.666571f, -0.666714f, -0.666857f,
+ -0.667000f, -0.667143f, -0.667286f, -0.667428f, -0.667571f, -0.667714f, -0.667857f, -0.667999f,
+ -0.668142f, -0.668285f, -0.668427f, -0.668570f, -0.668712f, -0.668855f, -0.668998f, -0.669140f,
+ -0.669283f, -0.669425f, -0.669567f, -0.669710f, -0.669852f, -0.669995f, -0.670137f, -0.670279f,
+ -0.670422f, -0.670564f, -0.670706f, -0.670848f, -0.670990f, -0.671133f, -0.671275f, -0.671417f,
+ -0.671559f, -0.671701f, -0.671843f, -0.671985f, -0.672127f, -0.672269f, -0.672411f, -0.672553f,
+ -0.672695f, -0.672837f, -0.672978f, -0.673120f, -0.673262f, -0.673404f, -0.673546f, -0.673687f,
+ -0.673829f, -0.673971f, -0.674112f, -0.674254f, -0.674396f, -0.674537f, -0.674679f, -0.674820f,
+ -0.674962f, -0.675103f, -0.675245f, -0.675386f, -0.675527f, -0.675669f, -0.675810f, -0.675951f,
+ -0.676093f, -0.676234f, -0.676375f, -0.676516f, -0.676658f, -0.676799f, -0.676940f, -0.677081f,
+ -0.677222f, -0.677363f, -0.677504f, -0.677645f, -0.677786f, -0.677927f, -0.678068f, -0.678209f,
+ -0.678350f, -0.678491f, -0.678632f, -0.678773f, -0.678913f, -0.679054f, -0.679195f, -0.679336f,
+ -0.679476f, -0.679617f, -0.679758f, -0.679898f, -0.680039f, -0.680179f, -0.680320f, -0.680461f,
+ -0.680601f, -0.680741f, -0.680882f, -0.681022f, -0.681163f, -0.681303f, -0.681443f, -0.681584f,
+ -0.681724f, -0.681864f, -0.682005f, -0.682145f, -0.682285f, -0.682425f, -0.682565f, -0.682705f,
+ -0.682846f, -0.682986f, -0.683126f, -0.683266f, -0.683406f, -0.683546f, -0.683686f, -0.683825f,
+ -0.683965f, -0.684105f, -0.684245f, -0.684385f, -0.684525f, -0.684664f, -0.684804f, -0.684944f,
+ -0.685084f, -0.685223f, -0.685363f, -0.685503f, -0.685642f, -0.685782f, -0.685921f, -0.686061f,
+ -0.686200f, -0.686340f, -0.686479f, -0.686619f, -0.686758f, -0.686897f, -0.687037f, -0.687176f,
+ -0.687315f, -0.687455f, -0.687594f, -0.687733f, -0.687872f, -0.688011f, -0.688151f, -0.688290f,
+ -0.688429f, -0.688568f, -0.688707f, -0.688846f, -0.688985f, -0.689124f, -0.689263f, -0.689402f,
+ -0.689541f, -0.689679f, -0.689818f, -0.689957f, -0.690096f, -0.690235f, -0.690373f, -0.690512f,
+ -0.690651f, -0.690789f, -0.690928f, -0.691067f, -0.691205f, -0.691344f, -0.691482f, -0.691621f,
+ -0.691759f, -0.691898f, -0.692036f, -0.692175f, -0.692313f, -0.692451f, -0.692590f, -0.692728f,
+ -0.692866f, -0.693004f, -0.693143f, -0.693281f, -0.693419f, -0.693557f, -0.693695f, -0.693833f,
+ -0.693971f, -0.694109f, -0.694248f, -0.694386f, -0.694524f, -0.694661f, -0.694799f, -0.694937f,
+ -0.695075f, -0.695213f, -0.695351f, -0.695489f, -0.695626f, -0.695764f, -0.695902f, -0.696039f,
+ -0.696177f, -0.696315f, -0.696452f, -0.696590f, -0.696728f, -0.696865f, -0.697003f, -0.697140f,
+ -0.697277f, -0.697415f, -0.697552f, -0.697690f, -0.697827f, -0.697964f, -0.698102f, -0.698239f,
+ -0.698376f, -0.698513f, -0.698651f, -0.698788f, -0.698925f, -0.699062f, -0.699199f, -0.699336f,
+ -0.699473f, -0.699610f, -0.699747f, -0.699884f, -0.700021f, -0.700158f, -0.700295f, -0.700432f,
+ -0.700569f, -0.700706f, -0.700842f, -0.700979f, -0.701116f, -0.701253f, -0.701389f, -0.701526f,
+ -0.701663f, -0.701799f, -0.701936f, -0.702072f, -0.702209f, -0.702345f, -0.702482f, -0.702618f,
+ -0.702755f, -0.702891f, -0.703028f, -0.703164f, -0.703300f, -0.703436f, -0.703573f, -0.703709f,
+ -0.703845f, -0.703981f, -0.704118f, -0.704254f, -0.704390f, -0.704526f, -0.704662f, -0.704798f,
+ -0.704934f, -0.705070f, -0.705206f, -0.705342f, -0.705478f, -0.705614f, -0.705750f, -0.705885f,
+ -0.706021f, -0.706157f, -0.706293f, -0.706429f, -0.706564f, -0.706700f, -0.706836f, -0.706971f,
+ -0.707107f, -0.707242f, -0.707378f, -0.707513f, -0.707649f, -0.707784f, -0.707920f, -0.708055f,
+ -0.708191f, -0.708326f, -0.708461f, -0.708597f, -0.708732f, -0.708867f, -0.709002f, -0.709138f,
+ -0.709273f, -0.709408f, -0.709543f, -0.709678f, -0.709813f, -0.709948f, -0.710083f, -0.710218f,
+ -0.710353f, -0.710488f, -0.710623f, -0.710758f, -0.710893f, -0.711028f, -0.711163f, -0.711297f,
+ -0.711432f, -0.711567f, -0.711702f, -0.711836f, -0.711971f, -0.712106f, -0.712240f, -0.712375f,
+ -0.712509f, -0.712644f, -0.712778f, -0.712913f, -0.713047f, -0.713182f, -0.713316f, -0.713451f,
+ -0.713585f, -0.713719f, -0.713853f, -0.713988f, -0.714122f, -0.714256f, -0.714390f, -0.714525f,
+ -0.714659f, -0.714793f, -0.714927f, -0.715061f, -0.715195f, -0.715329f, -0.715463f, -0.715597f,
+ -0.715731f, -0.715865f, -0.715999f, -0.716132f, -0.716266f, -0.716400f, -0.716534f, -0.716668f,
+ -0.716801f, -0.716935f, -0.717069f, -0.717202f, -0.717336f, -0.717469f, -0.717603f, -0.717737f,
+ -0.717870f, -0.718004f, -0.718137f, -0.718270f, -0.718404f, -0.718537f, -0.718670f, -0.718804f,
+ -0.718937f, -0.719070f, -0.719204f, -0.719337f, -0.719470f, -0.719603f, -0.719736f, -0.719869f,
+ -0.720003f, -0.720136f, -0.720269f, -0.720402f, -0.720535f, -0.720668f, -0.720800f, -0.720933f,
+ -0.721066f, -0.721199f, -0.721332f, -0.721465f, -0.721597f, -0.721730f, -0.721863f, -0.721996f,
+ -0.722128f, -0.722261f, -0.722393f, -0.722526f, -0.722659f, -0.722791f, -0.722924f, -0.723056f,
+ -0.723188f, -0.723321f, -0.723453f, -0.723586f, -0.723718f, -0.723850f, -0.723983f, -0.724115f,
+ -0.724247f, -0.724379f, -0.724511f, -0.724644f, -0.724776f, -0.724908f, -0.725040f, -0.725172f,
+ -0.725304f, -0.725436f, -0.725568f, -0.725700f, -0.725832f, -0.725964f, -0.726095f, -0.726227f,
+ -0.726359f, -0.726491f, -0.726623f, -0.726754f, -0.726886f, -0.727018f, -0.727149f, -0.727281f,
+ -0.727413f, -0.727544f, -0.727676f, -0.727807f, -0.727939f, -0.728070f, -0.728202f, -0.728333f,
+ -0.728464f, -0.728596f, -0.728727f, -0.728858f, -0.728990f, -0.729121f, -0.729252f, -0.729383f,
+ -0.729514f, -0.729646f, -0.729777f, -0.729908f, -0.730039f, -0.730170f, -0.730301f, -0.730432f,
+ -0.730563f, -0.730694f, -0.730825f, -0.730955f, -0.731086f, -0.731217f, -0.731348f, -0.731479f,
+ -0.731609f, -0.731740f, -0.731871f, -0.732001f, -0.732132f, -0.732263f, -0.732393f, -0.732524f,
+ -0.732654f, -0.732785f, -0.732915f, -0.733046f, -0.733176f, -0.733306f, -0.733437f, -0.733567f,
+ -0.733697f, -0.733828f, -0.733958f, -0.734088f, -0.734218f, -0.734349f, -0.734479f, -0.734609f,
+ -0.734739f, -0.734869f, -0.734999f, -0.735129f, -0.735259f, -0.735389f, -0.735519f, -0.735649f,
+ -0.735779f, -0.735908f, -0.736038f, -0.736168f, -0.736298f, -0.736428f, -0.736557f, -0.736687f,
+ -0.736817f, -0.736946f, -0.737076f, -0.737205f, -0.737335f, -0.737464f, -0.737594f, -0.737723f,
+ -0.737853f, -0.737982f, -0.738112f, -0.738241f, -0.738370f, -0.738500f, -0.738629f, -0.738758f,
+ -0.738887f, -0.739017f, -0.739146f, -0.739275f, -0.739404f, -0.739533f, -0.739662f, -0.739791f,
+ -0.739920f, -0.740049f, -0.740178f, -0.740307f, -0.740436f, -0.740565f, -0.740694f, -0.740822f,
+ -0.740951f, -0.741080f, -0.741209f, -0.741337f, -0.741466f, -0.741595f, -0.741723f, -0.741852f,
+ -0.741980f, -0.742109f, -0.742237f, -0.742366f, -0.742494f, -0.742623f, -0.742751f, -0.742880f,
+ -0.743008f, -0.743136f, -0.743265f, -0.743393f, -0.743521f, -0.743649f, -0.743777f, -0.743906f,
+ -0.744034f, -0.744162f, -0.744290f, -0.744418f, -0.744546f, -0.744674f, -0.744802f, -0.744930f,
+ -0.745058f, -0.745186f, -0.745314f, -0.745441f, -0.745569f, -0.745697f, -0.745825f, -0.745952f,
+ -0.746080f, -0.746208f, -0.746335f, -0.746463f, -0.746591f, -0.746718f, -0.746846f, -0.746973f,
+ -0.747101f, -0.747228f, -0.747355f, -0.747483f, -0.747610f, -0.747738f, -0.747865f, -0.747992f,
+ -0.748119f, -0.748247f, -0.748374f, -0.748501f, -0.748628f, -0.748755f, -0.748882f, -0.749009f,
+ -0.749136f, -0.749263f, -0.749390f, -0.749517f, -0.749644f, -0.749771f, -0.749898f, -0.750025f,
+ -0.750152f, -0.750278f, -0.750405f, -0.750532f, -0.750659f, -0.750785f, -0.750912f, -0.751039f,
+ -0.751165f, -0.751292f, -0.751418f, -0.751545f, -0.751671f, -0.751798f, -0.751924f, -0.752050f,
+ -0.752177f, -0.752303f, -0.752429f, -0.752556f, -0.752682f, -0.752808f, -0.752934f, -0.753061f,
+ -0.753187f, -0.753313f, -0.753439f, -0.753565f, -0.753691f, -0.753817f, -0.753943f, -0.754069f,
+ -0.754195f, -0.754321f, -0.754447f, -0.754573f, -0.754698f, -0.754824f, -0.754950f, -0.755076f,
+ -0.755201f, -0.755327f, -0.755453f, -0.755578f, -0.755704f, -0.755829f, -0.755955f, -0.756081f,
+ -0.756206f, -0.756331f, -0.756457f, -0.756582f, -0.756708f, -0.756833f, -0.756958f, -0.757084f,
+ -0.757209f, -0.757334f, -0.757459f, -0.757584f, -0.757710f, -0.757835f, -0.757960f, -0.758085f,
+ -0.758210f, -0.758335f, -0.758460f, -0.758585f, -0.758710f, -0.758835f, -0.758960f, -0.759084f,
+ -0.759209f, -0.759334f, -0.759459f, -0.759583f, -0.759708f, -0.759833f, -0.759957f, -0.760082f,
+ -0.760207f, -0.760331f, -0.760456f, -0.760580f, -0.760705f, -0.760829f, -0.760954f, -0.761078f,
+ -0.761202f, -0.761327f, -0.761451f, -0.761575f, -0.761700f, -0.761824f, -0.761948f, -0.762072f,
+ -0.762196f, -0.762320f, -0.762444f, -0.762569f, -0.762693f, -0.762817f, -0.762941f, -0.763065f,
+ -0.763188f, -0.763312f, -0.763436f, -0.763560f, -0.763684f, -0.763808f, -0.763931f, -0.764055f,
+ -0.764179f, -0.764302f, -0.764426f, -0.764550f, -0.764673f, -0.764797f, -0.764920f, -0.765044f,
+ -0.765167f, -0.765291f, -0.765414f, -0.765538f, -0.765661f, -0.765784f, -0.765907f, -0.766031f,
+ -0.766154f, -0.766277f, -0.766400f, -0.766524f, -0.766647f, -0.766770f, -0.766893f, -0.767016f,
+ -0.767139f, -0.767262f, -0.767385f, -0.767508f, -0.767631f, -0.767754f, -0.767876f, -0.767999f,
+ -0.768122f, -0.768245f, -0.768368f, -0.768490f, -0.768613f, -0.768736f, -0.768858f, -0.768981f,
+ -0.769103f, -0.769226f, -0.769348f, -0.769471f, -0.769593f, -0.769716f, -0.769838f, -0.769961f,
+ -0.770083f, -0.770205f, -0.770327f, -0.770450f, -0.770572f, -0.770694f, -0.770816f, -0.770938f,
+ -0.771061f, -0.771183f, -0.771305f, -0.771427f, -0.771549f, -0.771671f, -0.771793f, -0.771915f,
+ -0.772036f, -0.772158f, -0.772280f, -0.772402f, -0.772524f, -0.772645f, -0.772767f, -0.772889f,
+ -0.773010f, -0.773132f, -0.773254f, -0.773375f, -0.773497f, -0.773618f, -0.773740f, -0.773861f,
+ -0.773983f, -0.774104f, -0.774225f, -0.774347f, -0.774468f, -0.774589f, -0.774711f, -0.774832f,
+ -0.774953f, -0.775074f, -0.775195f, -0.775317f, -0.775438f, -0.775559f, -0.775680f, -0.775801f,
+ -0.775922f, -0.776043f, -0.776164f, -0.776284f, -0.776405f, -0.776526f, -0.776647f, -0.776768f,
+ -0.776888f, -0.777009f, -0.777130f, -0.777251f, -0.777371f, -0.777492f, -0.777612f, -0.777733f,
+ -0.777853f, -0.777974f, -0.778094f, -0.778215f, -0.778335f, -0.778456f, -0.778576f, -0.778696f,
+ -0.778817f, -0.778937f, -0.779057f, -0.779177f, -0.779297f, -0.779418f, -0.779538f, -0.779658f,
+ -0.779778f, -0.779898f, -0.780018f, -0.780138f, -0.780258f, -0.780378f, -0.780498f, -0.780617f,
+ -0.780737f, -0.780857f, -0.780977f, -0.781097f, -0.781216f, -0.781336f, -0.781456f, -0.781575f,
+ -0.781695f, -0.781814f, -0.781934f, -0.782053f, -0.782173f, -0.782292f, -0.782412f, -0.782531f,
+ -0.782651f, -0.782770f, -0.782889f, -0.783009f, -0.783128f, -0.783247f, -0.783366f, -0.783485f,
+ -0.783605f, -0.783724f, -0.783843f, -0.783962f, -0.784081f, -0.784200f, -0.784319f, -0.784438f,
+ -0.784557f, -0.784675f, -0.784794f, -0.784913f, -0.785032f, -0.785151f, -0.785269f, -0.785388f,
+ -0.785507f, -0.785625f, -0.785744f, -0.785863f, -0.785981f, -0.786100f, -0.786218f, -0.786337f,
+ -0.786455f, -0.786574f, -0.786692f, -0.786810f, -0.786929f, -0.787047f, -0.787165f, -0.787284f,
+ -0.787402f, -0.787520f, -0.787638f, -0.787756f, -0.787874f, -0.787992f, -0.788110f, -0.788228f,
+ -0.788346f, -0.788464f, -0.788582f, -0.788700f, -0.788818f, -0.788936f, -0.789054f, -0.789172f,
+ -0.789289f, -0.789407f, -0.789525f, -0.789642f, -0.789760f, -0.789878f, -0.789995f, -0.790113f,
+ -0.790230f, -0.790348f, -0.790465f, -0.790583f, -0.790700f, -0.790817f, -0.790935f, -0.791052f,
+ -0.791169f, -0.791287f, -0.791404f, -0.791521f, -0.791638f, -0.791755f, -0.791872f, -0.791990f,
+ -0.792107f, -0.792224f, -0.792341f, -0.792458f, -0.792575f, -0.792691f, -0.792808f, -0.792925f,
+ -0.793042f, -0.793159f, -0.793276f, -0.793392f, -0.793509f, -0.793626f, -0.793742f, -0.793859f,
+ -0.793975f, -0.794092f, -0.794209f, -0.794325f, -0.794442f, -0.794558f, -0.794674f, -0.794791f,
+ -0.794907f, -0.795023f, -0.795140f, -0.795256f, -0.795372f, -0.795488f, -0.795605f, -0.795721f,
+ -0.795837f, -0.795953f, -0.796069f, -0.796185f, -0.796301f, -0.796417f, -0.796533f, -0.796649f,
+ -0.796765f, -0.796881f, -0.796996f, -0.797112f, -0.797228f, -0.797344f, -0.797459f, -0.797575f,
+ -0.797691f, -0.797806f, -0.797922f, -0.798038f, -0.798153f, -0.798269f, -0.798384f, -0.798500f,
+ -0.798615f, -0.798730f, -0.798846f, -0.798961f, -0.799076f, -0.799192f, -0.799307f, -0.799422f,
+ -0.799537f, -0.799652f, -0.799768f, -0.799883f, -0.799998f, -0.800113f, -0.800228f, -0.800343f,
+ -0.800458f, -0.800573f, -0.800687f, -0.800802f, -0.800917f, -0.801032f, -0.801147f, -0.801261f,
+ -0.801376f, -0.801491f, -0.801606f, -0.801720f, -0.801835f, -0.801949f, -0.802064f, -0.802178f,
+ -0.802293f, -0.802407f, -0.802522f, -0.802636f, -0.802750f, -0.802865f, -0.802979f, -0.803093f,
+ -0.803208f, -0.803322f, -0.803436f, -0.803550f, -0.803664f, -0.803778f, -0.803892f, -0.804006f,
+ -0.804120f, -0.804234f, -0.804348f, -0.804462f, -0.804576f, -0.804690f, -0.804804f, -0.804918f,
+ -0.805031f, -0.805145f, -0.805259f, -0.805372f, -0.805486f, -0.805600f, -0.805713f, -0.805827f,
+ -0.805940f, -0.806054f, -0.806167f, -0.806281f, -0.806394f, -0.806508f, -0.806621f, -0.806734f,
+ -0.806848f, -0.806961f, -0.807074f, -0.807187f, -0.807300f, -0.807414f, -0.807527f, -0.807640f,
+ -0.807753f, -0.807866f, -0.807979f, -0.808092f, -0.808205f, -0.808318f, -0.808430f, -0.808543f,
+ -0.808656f, -0.808769f, -0.808882f, -0.808994f, -0.809107f, -0.809220f, -0.809332f, -0.809445f,
+ -0.809558f, -0.809670f, -0.809783f, -0.809895f, -0.810008f, -0.810120f, -0.810232f, -0.810345f,
+ -0.810457f, -0.810570f, -0.810682f, -0.810794f, -0.810906f, -0.811018f, -0.811131f, -0.811243f,
+ -0.811355f, -0.811467f, -0.811579f, -0.811691f, -0.811803f, -0.811915f, -0.812027f, -0.812139f,
+ -0.812251f, -0.812362f, -0.812474f, -0.812586f, -0.812698f, -0.812809f, -0.812921f, -0.813033f,
+ -0.813144f, -0.813256f, -0.813368f, -0.813479f, -0.813591f, -0.813702f, -0.813814f, -0.813925f,
+ -0.814036f, -0.814148f, -0.814259f, -0.814370f, -0.814482f, -0.814593f, -0.814704f, -0.814815f,
+ -0.814926f, -0.815037f, -0.815149f, -0.815260f, -0.815371f, -0.815482f, -0.815593f, -0.815704f,
+ -0.815814f, -0.815925f, -0.816036f, -0.816147f, -0.816258f, -0.816368f, -0.816479f, -0.816590f,
+ -0.816701f, -0.816811f, -0.816922f, -0.817032f, -0.817143f, -0.817253f, -0.817364f, -0.817474f,
+ -0.817585f, -0.817695f, -0.817806f, -0.817916f, -0.818026f, -0.818137f, -0.818247f, -0.818357f,
+ -0.818467f, -0.818577f, -0.818687f, -0.818798f, -0.818908f, -0.819018f, -0.819128f, -0.819238f,
+ -0.819348f, -0.819457f, -0.819567f, -0.819677f, -0.819787f, -0.819897f, -0.820007f, -0.820116f,
+ -0.820226f, -0.820336f, -0.820445f, -0.820555f, -0.820664f, -0.820774f, -0.820884f, -0.820993f,
+ -0.821102f, -0.821212f, -0.821321f, -0.821431f, -0.821540f, -0.821649f, -0.821759f, -0.821868f,
+ -0.821977f, -0.822086f, -0.822195f, -0.822305f, -0.822414f, -0.822523f, -0.822632f, -0.822741f,
+ -0.822850f, -0.822959f, -0.823068f, -0.823177f, -0.823285f, -0.823394f, -0.823503f, -0.823612f,
+ -0.823721f, -0.823829f, -0.823938f, -0.824047f, -0.824155f, -0.824264f, -0.824372f, -0.824481f,
+ -0.824589f, -0.824698f, -0.824806f, -0.824915f, -0.825023f, -0.825131f, -0.825240f, -0.825348f,
+ -0.825456f, -0.825564f, -0.825673f, -0.825781f, -0.825889f, -0.825997f, -0.826105f, -0.826213f,
+ -0.826321f, -0.826429f, -0.826537f, -0.826645f, -0.826753f, -0.826861f, -0.826968f, -0.827076f,
+ -0.827184f, -0.827292f, -0.827399f, -0.827507f, -0.827615f, -0.827722f, -0.827830f, -0.827938f,
+ -0.828045f, -0.828153f, -0.828260f, -0.828367f, -0.828475f, -0.828582f, -0.828690f, -0.828797f,
+ -0.828904f, -0.829011f, -0.829119f, -0.829226f, -0.829333f, -0.829440f, -0.829547f, -0.829654f,
+ -0.829761f, -0.829868f, -0.829975f, -0.830082f, -0.830189f, -0.830296f, -0.830403f, -0.830510f,
+ -0.830616f, -0.830723f, -0.830830f, -0.830937f, -0.831043f, -0.831150f, -0.831257f, -0.831363f,
+ -0.831470f, -0.831576f, -0.831683f, -0.831789f, -0.831895f, -0.832002f, -0.832108f, -0.832215f,
+ -0.832321f, -0.832427f, -0.832533f, -0.832640f, -0.832746f, -0.832852f, -0.832958f, -0.833064f,
+ -0.833170f, -0.833276f, -0.833382f, -0.833488f, -0.833594f, -0.833700f, -0.833806f, -0.833912f,
+ -0.834018f, -0.834123f, -0.834229f, -0.834335f, -0.834440f, -0.834546f, -0.834652f, -0.834757f,
+ -0.834863f, -0.834968f, -0.835074f, -0.835179f, -0.835285f, -0.835390f, -0.835496f, -0.835601f,
+ -0.835706f, -0.835812f, -0.835917f, -0.836022f, -0.836127f, -0.836232f, -0.836338f, -0.836443f,
+ -0.836548f, -0.836653f, -0.836758f, -0.836863f, -0.836968f, -0.837073f, -0.837178f, -0.837282f,
+ -0.837387f, -0.837492f, -0.837597f, -0.837701f, -0.837806f, -0.837911f, -0.838015f, -0.838120f,
+ -0.838225f, -0.838329f, -0.838434f, -0.838538f, -0.838643f, -0.838747f, -0.838852f, -0.838956f,
+ -0.839060f, -0.839165f, -0.839269f, -0.839373f, -0.839477f, -0.839581f, -0.839686f, -0.839790f,
+ -0.839894f, -0.839998f, -0.840102f, -0.840206f, -0.840310f, -0.840414f, -0.840518f, -0.840622f,
+ -0.840725f, -0.840829f, -0.840933f, -0.841037f, -0.841140f, -0.841244f, -0.841348f, -0.841451f,
+ -0.841555f, -0.841659f, -0.841762f, -0.841866f, -0.841969f, -0.842072f, -0.842176f, -0.842279f,
+ -0.842383f, -0.842486f, -0.842589f, -0.842692f, -0.842796f, -0.842899f, -0.843002f, -0.843105f,
+ -0.843208f, -0.843311f, -0.843414f, -0.843517f, -0.843620f, -0.843723f, -0.843826f, -0.843929f,
+ -0.844032f, -0.844135f, -0.844238f, -0.844340f, -0.844443f, -0.844546f, -0.844648f, -0.844751f,
+ -0.844854f, -0.844956f, -0.845059f, -0.845161f, -0.845264f, -0.845366f, -0.845469f, -0.845571f,
+ -0.845673f, -0.845776f, -0.845878f, -0.845980f, -0.846082f, -0.846185f, -0.846287f, -0.846389f,
+ -0.846491f, -0.846593f, -0.846695f, -0.846797f, -0.846899f, -0.847001f, -0.847103f, -0.847205f,
+ -0.847307f, -0.847408f, -0.847510f, -0.847612f, -0.847714f, -0.847815f, -0.847917f, -0.848019f,
+ -0.848120f, -0.848222f, -0.848323f, -0.848425f, -0.848526f, -0.848628f, -0.848729f, -0.848831f,
+ -0.848932f, -0.849033f, -0.849135f, -0.849236f, -0.849337f, -0.849438f, -0.849540f, -0.849641f,
+ -0.849742f, -0.849843f, -0.849944f, -0.850045f, -0.850146f, -0.850247f, -0.850348f, -0.850449f,
+ -0.850549f, -0.850650f, -0.850751f, -0.850852f, -0.850953f, -0.851053f, -0.851154f, -0.851255f,
+ -0.851355f, -0.851456f, -0.851556f, -0.851657f, -0.851757f, -0.851858f, -0.851958f, -0.852059f,
+ -0.852159f, -0.852259f, -0.852360f, -0.852460f, -0.852560f, -0.852660f, -0.852760f, -0.852861f,
+ -0.852961f, -0.853061f, -0.853161f, -0.853261f, -0.853361f, -0.853461f, -0.853561f, -0.853660f,
+ -0.853760f, -0.853860f, -0.853960f, -0.854060f, -0.854159f, -0.854259f, -0.854359f, -0.854458f,
+ -0.854558f, -0.854658f, -0.854757f, -0.854857f, -0.854956f, -0.855056f, -0.855155f, -0.855254f,
+ -0.855354f, -0.855453f, -0.855552f, -0.855651f, -0.855751f, -0.855850f, -0.855949f, -0.856048f,
+ -0.856147f, -0.856246f, -0.856345f, -0.856444f, -0.856543f, -0.856642f, -0.856741f, -0.856840f,
+ -0.856939f, -0.857038f, -0.857137f, -0.857235f, -0.857334f, -0.857433f, -0.857531f, -0.857630f,
+ -0.857729f, -0.857827f, -0.857926f, -0.858024f, -0.858123f, -0.858221f, -0.858320f, -0.858418f,
+ -0.858516f, -0.858615f, -0.858713f, -0.858811f, -0.858909f, -0.859007f, -0.859106f, -0.859204f,
+ -0.859302f, -0.859400f, -0.859498f, -0.859596f, -0.859694f, -0.859792f, -0.859890f, -0.859988f,
+ -0.860085f, -0.860183f, -0.860281f, -0.860379f, -0.860476f, -0.860574f, -0.860672f, -0.860769f,
+ -0.860867f, -0.860964f, -0.861062f, -0.861160f, -0.861257f, -0.861354f, -0.861452f, -0.861549f,
+ -0.861646f, -0.861744f, -0.861841f, -0.861938f, -0.862035f, -0.862133f, -0.862230f, -0.862327f,
+ -0.862424f, -0.862521f, -0.862618f, -0.862715f, -0.862812f, -0.862909f, -0.863006f, -0.863103f,
+ -0.863199f, -0.863296f, -0.863393f, -0.863490f, -0.863586f, -0.863683f, -0.863780f, -0.863876f,
+ -0.863973f, -0.864069f, -0.864166f, -0.864262f, -0.864359f, -0.864455f, -0.864552f, -0.864648f,
+ -0.864744f, -0.864841f, -0.864937f, -0.865033f, -0.865129f, -0.865225f, -0.865321f, -0.865418f,
+ -0.865514f, -0.865610f, -0.865706f, -0.865802f, -0.865898f, -0.865993f, -0.866089f, -0.866185f,
+ -0.866281f, -0.866377f, -0.866472f, -0.866568f, -0.866664f, -0.866759f, -0.866855f, -0.866951f,
+ -0.867046f, -0.867142f, -0.867237f, -0.867333f, -0.867428f, -0.867523f, -0.867619f, -0.867714f,
+ -0.867809f, -0.867905f, -0.868000f, -0.868095f, -0.868190f, -0.868285f, -0.868381f, -0.868476f,
+ -0.868571f, -0.868666f, -0.868761f, -0.868856f, -0.868951f, -0.869045f, -0.869140f, -0.869235f,
+ -0.869330f, -0.869425f, -0.869519f, -0.869614f, -0.869709f, -0.869803f, -0.869898f, -0.869992f,
+ -0.870087f, -0.870182f, -0.870276f, -0.870370f, -0.870465f, -0.870559f, -0.870654f, -0.870748f,
+ -0.870842f, -0.870936f, -0.871031f, -0.871125f, -0.871219f, -0.871313f, -0.871407f, -0.871501f,
+ -0.871595f, -0.871689f, -0.871783f, -0.871877f, -0.871971f, -0.872065f, -0.872159f, -0.872252f,
+ -0.872346f, -0.872440f, -0.872534f, -0.872627f, -0.872721f, -0.872814f, -0.872908f, -0.873001f,
+ -0.873095f, -0.873188f, -0.873282f, -0.873375f, -0.873469f, -0.873562f, -0.873655f, -0.873749f,
+ -0.873842f, -0.873935f, -0.874028f, -0.874121f, -0.874215f, -0.874308f, -0.874401f, -0.874494f,
+ -0.874587f, -0.874680f, -0.874773f, -0.874865f, -0.874958f, -0.875051f, -0.875144f, -0.875237f,
+ -0.875329f, -0.875422f, -0.875515f, -0.875607f, -0.875700f, -0.875793f, -0.875885f, -0.875978f,
+ -0.876070f, -0.876163f, -0.876255f, -0.876347f, -0.876440f, -0.876532f, -0.876624f, -0.876716f,
+ -0.876809f, -0.876901f, -0.876993f, -0.877085f, -0.877177f, -0.877269f, -0.877361f, -0.877453f,
+ -0.877545f, -0.877637f, -0.877729f, -0.877821f, -0.877913f, -0.878005f, -0.878096f, -0.878188f,
+ -0.878280f, -0.878371f, -0.878463f, -0.878555f, -0.878646f, -0.878738f, -0.878829f, -0.878921f,
+ -0.879012f, -0.879104f, -0.879195f, -0.879286f, -0.879378f, -0.879469f, -0.879560f, -0.879651f,
+ -0.879743f, -0.879834f, -0.879925f, -0.880016f, -0.880107f, -0.880198f, -0.880289f, -0.880380f,
+ -0.880471f, -0.880562f, -0.880653f, -0.880743f, -0.880834f, -0.880925f, -0.881016f, -0.881106f,
+ -0.881197f, -0.881288f, -0.881378f, -0.881469f, -0.881559f, -0.881650f, -0.881740f, -0.881831f,
+ -0.881921f, -0.882012f, -0.882102f, -0.882192f, -0.882283f, -0.882373f, -0.882463f, -0.882553f,
+ -0.882643f, -0.882733f, -0.882824f, -0.882914f, -0.883004f, -0.883094f, -0.883184f, -0.883273f,
+ -0.883363f, -0.883453f, -0.883543f, -0.883633f, -0.883723f, -0.883812f, -0.883902f, -0.883992f,
+ -0.884081f, -0.884171f, -0.884260f, -0.884350f, -0.884439f, -0.884529f, -0.884618f, -0.884708f,
+ -0.884797f, -0.884886f, -0.884976f, -0.885065f, -0.885154f, -0.885243f, -0.885333f, -0.885422f,
+ -0.885511f, -0.885600f, -0.885689f, -0.885778f, -0.885867f, -0.885956f, -0.886045f, -0.886134f,
+ -0.886223f, -0.886311f, -0.886400f, -0.886489f, -0.886578f, -0.886666f, -0.886755f, -0.886844f,
+ -0.886932f, -0.887021f, -0.887109f, -0.887198f, -0.887286f, -0.887375f, -0.887463f, -0.887551f,
+ -0.887640f, -0.887728f, -0.887816f, -0.887904f, -0.887993f, -0.888081f, -0.888169f, -0.888257f,
+ -0.888345f, -0.888433f, -0.888521f, -0.888609f, -0.888697f, -0.888785f, -0.888873f, -0.888961f,
+ -0.889048f, -0.889136f, -0.889224f, -0.889312f, -0.889399f, -0.889487f, -0.889574f, -0.889662f,
+ -0.889750f, -0.889837f, -0.889925f, -0.890012f, -0.890099f, -0.890187f, -0.890274f, -0.890361f,
+ -0.890449f, -0.890536f, -0.890623f, -0.890710f, -0.890797f, -0.890885f, -0.890972f, -0.891059f,
+ -0.891146f, -0.891233f, -0.891320f, -0.891407f, -0.891493f, -0.891580f, -0.891667f, -0.891754f,
+ -0.891841f, -0.891927f, -0.892014f, -0.892101f, -0.892187f, -0.892274f, -0.892361f, -0.892447f,
+ -0.892534f, -0.892620f, -0.892706f, -0.892793f, -0.892879f, -0.892965f, -0.893052f, -0.893138f,
+ -0.893224f, -0.893310f, -0.893397f, -0.893483f, -0.893569f, -0.893655f, -0.893741f, -0.893827f,
+ -0.893913f, -0.893999f, -0.894085f, -0.894171f, -0.894256f, -0.894342f, -0.894428f, -0.894514f,
+ -0.894599f, -0.894685f, -0.894771f, -0.894856f, -0.894942f, -0.895028f, -0.895113f, -0.895198f,
+ -0.895284f, -0.895369f, -0.895455f, -0.895540f, -0.895625f, -0.895711f, -0.895796f, -0.895881f,
+ -0.895966f, -0.896051f, -0.896137f, -0.896222f, -0.896307f, -0.896392f, -0.896477f, -0.896562f,
+ -0.896646f, -0.896731f, -0.896816f, -0.896901f, -0.896986f, -0.897071f, -0.897155f, -0.897240f,
+ -0.897325f, -0.897409f, -0.897494f, -0.897578f, -0.897663f, -0.897747f, -0.897832f, -0.897916f,
+ -0.898001f, -0.898085f, -0.898169f, -0.898254f, -0.898338f, -0.898422f, -0.898506f, -0.898590f,
+ -0.898674f, -0.898759f, -0.898843f, -0.898927f, -0.899011f, -0.899095f, -0.899179f, -0.899262f,
+ -0.899346f, -0.899430f, -0.899514f, -0.899598f, -0.899681f, -0.899765f, -0.899849f, -0.899932f,
+ -0.900016f, -0.900099f, -0.900183f, -0.900266f, -0.900350f, -0.900433f, -0.900517f, -0.900600f,
+ -0.900683f, -0.900767f, -0.900850f, -0.900933f, -0.901016f, -0.901100f, -0.901183f, -0.901266f,
+ -0.901349f, -0.901432f, -0.901515f, -0.901598f, -0.901681f, -0.901764f, -0.901847f, -0.901929f,
+ -0.902012f, -0.902095f, -0.902178f, -0.902260f, -0.902343f, -0.902426f, -0.902508f, -0.902591f,
+ -0.902673f, -0.902756f, -0.902838f, -0.902921f, -0.903003f, -0.903085f, -0.903168f, -0.903250f,
+ -0.903332f, -0.903415f, -0.903497f, -0.903579f, -0.903661f, -0.903743f, -0.903825f, -0.903907f,
+ -0.903989f, -0.904071f, -0.904153f, -0.904235f, -0.904317f, -0.904399f, -0.904481f, -0.904562f,
+ -0.904644f, -0.904726f, -0.904807f, -0.904889f, -0.904971f, -0.905052f, -0.905134f, -0.905215f,
+ -0.905297f, -0.905378f, -0.905460f, -0.905541f, -0.905622f, -0.905704f, -0.905785f, -0.905866f,
+ -0.905947f, -0.906028f, -0.906110f, -0.906191f, -0.906272f, -0.906353f, -0.906434f, -0.906515f,
+ -0.906596f, -0.906677f, -0.906757f, -0.906838f, -0.906919f, -0.907000f, -0.907081f, -0.907161f,
+ -0.907242f, -0.907323f, -0.907403f, -0.907484f, -0.907564f, -0.907645f, -0.907725f, -0.907806f,
+ -0.907886f, -0.907966f, -0.908047f, -0.908127f, -0.908207f, -0.908288f, -0.908368f, -0.908448f,
+ -0.908528f, -0.908608f, -0.908688f, -0.908768f, -0.908848f, -0.908928f, -0.909008f, -0.909088f,
+ -0.909168f, -0.909248f, -0.909328f, -0.909407f, -0.909487f, -0.909567f, -0.909646f, -0.909726f,
+ -0.909806f, -0.909885f, -0.909965f, -0.910044f, -0.910124f, -0.910203f, -0.910283f, -0.910362f,
+ -0.910441f, -0.910521f, -0.910600f, -0.910679f, -0.910758f, -0.910837f, -0.910917f, -0.910996f,
+ -0.911075f, -0.911154f, -0.911233f, -0.911312f, -0.911391f, -0.911470f, -0.911548f, -0.911627f,
+ -0.911706f, -0.911785f, -0.911864f, -0.911942f, -0.912021f, -0.912099f, -0.912178f, -0.912257f,
+ -0.912335f, -0.912414f, -0.912492f, -0.912571f, -0.912649f, -0.912727f, -0.912806f, -0.912884f,
+ -0.912962f, -0.913040f, -0.913119f, -0.913197f, -0.913275f, -0.913353f, -0.913431f, -0.913509f,
+ -0.913587f, -0.913665f, -0.913743f, -0.913821f, -0.913899f, -0.913976f, -0.914054f, -0.914132f,
+ -0.914210f, -0.914287f, -0.914365f, -0.914443f, -0.914520f, -0.914598f, -0.914675f, -0.914753f,
+ -0.914830f, -0.914908f, -0.914985f, -0.915062f, -0.915140f, -0.915217f, -0.915294f, -0.915372f,
+ -0.915449f, -0.915526f, -0.915603f, -0.915680f, -0.915757f, -0.915834f, -0.915911f, -0.915988f,
+ -0.916065f, -0.916142f, -0.916219f, -0.916296f, -0.916372f, -0.916449f, -0.916526f, -0.916602f,
+ -0.916679f, -0.916756f, -0.916832f, -0.916909f, -0.916985f, -0.917062f, -0.917138f, -0.917215f,
+ -0.917291f, -0.917367f, -0.917444f, -0.917520f, -0.917596f, -0.917672f, -0.917749f, -0.917825f,
+ -0.917901f, -0.917977f, -0.918053f, -0.918129f, -0.918205f, -0.918281f, -0.918357f, -0.918433f,
+ -0.918508f, -0.918584f, -0.918660f, -0.918736f, -0.918811f, -0.918887f, -0.918963f, -0.919038f,
+ -0.919114f, -0.919189f, -0.919265f, -0.919340f, -0.919416f, -0.919491f, -0.919567f, -0.919642f,
+ -0.919717f, -0.919792f, -0.919868f, -0.919943f, -0.920018f, -0.920093f, -0.920168f, -0.920243f,
+ -0.920318f, -0.920393f, -0.920468f, -0.920543f, -0.920618f, -0.920693f, -0.920768f, -0.920842f,
+ -0.920917f, -0.920992f, -0.921067f, -0.921141f, -0.921216f, -0.921291f, -0.921365f, -0.921440f,
+ -0.921514f, -0.921588f, -0.921663f, -0.921737f, -0.921812f, -0.921886f, -0.921960f, -0.922034f,
+ -0.922109f, -0.922183f, -0.922257f, -0.922331f, -0.922405f, -0.922479f, -0.922553f, -0.922627f,
+ -0.922701f, -0.922775f, -0.922849f, -0.922923f, -0.922997f, -0.923070f, -0.923144f, -0.923218f,
+ -0.923291f, -0.923365f, -0.923439f, -0.923512f, -0.923586f, -0.923659f, -0.923733f, -0.923806f,
+ -0.923880f, -0.923953f, -0.924026f, -0.924100f, -0.924173f, -0.924246f, -0.924319f, -0.924392f,
+ -0.924465f, -0.924539f, -0.924612f, -0.924685f, -0.924758f, -0.924831f, -0.924904f, -0.924976f,
+ -0.925049f, -0.925122f, -0.925195f, -0.925268f, -0.925340f, -0.925413f, -0.925486f, -0.925558f,
+ -0.925631f, -0.925703f, -0.925776f, -0.925848f, -0.925921f, -0.925993f, -0.926066f, -0.926138f,
+ -0.926210f, -0.926283f, -0.926355f, -0.926427f, -0.926499f, -0.926571f, -0.926643f, -0.926715f,
+ -0.926787f, -0.926859f, -0.926931f, -0.927003f, -0.927075f, -0.927147f, -0.927219f, -0.927291f,
+ -0.927363f, -0.927434f, -0.927506f, -0.927578f, -0.927649f, -0.927721f, -0.927792f, -0.927864f,
+ -0.927935f, -0.928007f, -0.928078f, -0.928150f, -0.928221f, -0.928292f, -0.928364f, -0.928435f,
+ -0.928506f, -0.928577f, -0.928648f, -0.928720f, -0.928791f, -0.928862f, -0.928933f, -0.929004f,
+ -0.929075f, -0.929146f, -0.929216f, -0.929287f, -0.929358f, -0.929429f, -0.929500f, -0.929570f,
+ -0.929641f, -0.929712f, -0.929782f, -0.929853f, -0.929923f, -0.929994f, -0.930064f, -0.930135f,
+ -0.930205f, -0.930275f, -0.930346f, -0.930416f, -0.930486f, -0.930556f, -0.930627f, -0.930697f,
+ -0.930767f, -0.930837f, -0.930907f, -0.930977f, -0.931047f, -0.931117f, -0.931187f, -0.931257f,
+ -0.931327f, -0.931397f, -0.931466f, -0.931536f, -0.931606f, -0.931675f, -0.931745f, -0.931815f,
+ -0.931884f, -0.931954f, -0.932023f, -0.932093f, -0.932162f, -0.932232f, -0.932301f, -0.932370f,
+ -0.932440f, -0.932509f, -0.932578f, -0.932647f, -0.932716f, -0.932786f, -0.932855f, -0.932924f,
+ -0.932993f, -0.933062f, -0.933131f, -0.933200f, -0.933269f, -0.933337f, -0.933406f, -0.933475f,
+ -0.933544f, -0.933612f, -0.933681f, -0.933750f, -0.933818f, -0.933887f, -0.933956f, -0.934024f,
+ -0.934093f, -0.934161f, -0.934229f, -0.934298f, -0.934366f, -0.934434f, -0.934503f, -0.934571f,
+ -0.934639f, -0.934707f, -0.934775f, -0.934844f, -0.934912f, -0.934980f, -0.935048f, -0.935116f,
+ -0.935184f, -0.935251f, -0.935319f, -0.935387f, -0.935455f, -0.935523f, -0.935590f, -0.935658f,
+ -0.935726f, -0.935793f, -0.935861f, -0.935928f, -0.935996f, -0.936063f, -0.936131f, -0.936198f,
+ -0.936266f, -0.936333f, -0.936400f, -0.936468f, -0.936535f, -0.936602f, -0.936669f, -0.936736f,
+ -0.936803f, -0.936871f, -0.936938f, -0.937005f, -0.937072f, -0.937138f, -0.937205f, -0.937272f,
+ -0.937339f, -0.937406f, -0.937473f, -0.937539f, -0.937606f, -0.937673f, -0.937739f, -0.937806f,
+ -0.937872f, -0.937939f, -0.938005f, -0.938072f, -0.938138f, -0.938205f, -0.938271f, -0.938337f,
+ -0.938404f, -0.938470f, -0.938536f, -0.938602f, -0.938668f, -0.938734f, -0.938800f, -0.938866f,
+ -0.938932f, -0.938998f, -0.939064f, -0.939130f, -0.939196f, -0.939262f, -0.939328f, -0.939394f,
+ -0.939459f, -0.939525f, -0.939591f, -0.939656f, -0.939722f, -0.939787f, -0.939853f, -0.939918f,
+ -0.939984f, -0.940049f, -0.940115f, -0.940180f, -0.940245f, -0.940310f, -0.940376f, -0.940441f,
+ -0.940506f, -0.940571f, -0.940636f, -0.940701f, -0.940766f, -0.940831f, -0.940896f, -0.940961f,
+ -0.941026f, -0.941091f, -0.941156f, -0.941221f, -0.941285f, -0.941350f, -0.941415f, -0.941479f,
+ -0.941544f, -0.941609f, -0.941673f, -0.941738f, -0.941802f, -0.941867f, -0.941931f, -0.941995f,
+ -0.942060f, -0.942124f, -0.942188f, -0.942253f, -0.942317f, -0.942381f, -0.942445f, -0.942509f,
+ -0.942573f, -0.942637f, -0.942701f, -0.942765f, -0.942829f, -0.942893f, -0.942957f, -0.943021f,
+ -0.943084f, -0.943148f, -0.943212f, -0.943276f, -0.943339f, -0.943403f, -0.943466f, -0.943530f,
+ -0.943593f, -0.943657f, -0.943720f, -0.943784f, -0.943847f, -0.943910f, -0.943974f, -0.944037f,
+ -0.944100f, -0.944163f, -0.944227f, -0.944290f, -0.944353f, -0.944416f, -0.944479f, -0.944542f,
+ -0.944605f, -0.944668f, -0.944731f, -0.944793f, -0.944856f, -0.944919f, -0.944982f, -0.945045f,
+ -0.945107f, -0.945170f, -0.945232f, -0.945295f, -0.945358f, -0.945420f, -0.945482f, -0.945545f,
+ -0.945607f, -0.945670f, -0.945732f, -0.945794f, -0.945857f, -0.945919f, -0.945981f, -0.946043f,
+ -0.946105f, -0.946167f, -0.946229f, -0.946291f, -0.946353f, -0.946415f, -0.946477f, -0.946539f,
+ -0.946601f, -0.946663f, -0.946724f, -0.946786f, -0.946848f, -0.946910f, -0.946971f, -0.947033f,
+ -0.947094f, -0.947156f, -0.947217f, -0.947279f, -0.947340f, -0.947402f, -0.947463f, -0.947524f,
+ -0.947586f, -0.947647f, -0.947708f, -0.947769f, -0.947830f, -0.947891f, -0.947953f, -0.948014f,
+ -0.948075f, -0.948136f, -0.948196f, -0.948257f, -0.948318f, -0.948379f, -0.948440f, -0.948501f,
+ -0.948561f, -0.948622f, -0.948683f, -0.948743f, -0.948804f, -0.948864f, -0.948925f, -0.948985f,
+ -0.949046f, -0.949106f, -0.949167f, -0.949227f, -0.949287f, -0.949348f, -0.949408f, -0.949468f,
+ -0.949528f, -0.949588f, -0.949648f, -0.949708f, -0.949768f, -0.949829f, -0.949888f, -0.949948f,
+ -0.950008f, -0.950068f, -0.950128f, -0.950188f, -0.950247f, -0.950307f, -0.950367f, -0.950426f,
+ -0.950486f, -0.950546f, -0.950605f, -0.950665f, -0.950724f, -0.950784f, -0.950843f, -0.950902f,
+ -0.950962f, -0.951021f, -0.951080f, -0.951139f, -0.951199f, -0.951258f, -0.951317f, -0.951376f,
+ -0.951435f, -0.951494f, -0.951553f, -0.951612f, -0.951671f, -0.951730f, -0.951789f, -0.951847f,
+ -0.951906f, -0.951965f, -0.952024f, -0.952082f, -0.952141f, -0.952199f, -0.952258f, -0.952317f,
+ -0.952375f, -0.952433f, -0.952492f, -0.952550f, -0.952609f, -0.952667f, -0.952725f, -0.952783f,
+ -0.952842f, -0.952900f, -0.952958f, -0.953016f, -0.953074f, -0.953132f, -0.953190f, -0.953248f,
+ -0.953306f, -0.953364f, -0.953422f, -0.953480f, -0.953537f, -0.953595f, -0.953653f, -0.953711f,
+ -0.953768f, -0.953826f, -0.953883f, -0.953941f, -0.953998f, -0.954056f, -0.954113f, -0.954171f,
+ -0.954228f, -0.954285f, -0.954343f, -0.954400f, -0.954457f, -0.954514f, -0.954572f, -0.954629f,
+ -0.954686f, -0.954743f, -0.954800f, -0.954857f, -0.954914f, -0.954971f, -0.955028f, -0.955084f,
+ -0.955141f, -0.955198f, -0.955255f, -0.955311f, -0.955368f, -0.955425f, -0.955481f, -0.955538f,
+ -0.955594f, -0.955651f, -0.955707f, -0.955764f, -0.955820f, -0.955876f, -0.955933f, -0.955989f,
+ -0.956045f, -0.956101f, -0.956158f, -0.956214f, -0.956270f, -0.956326f, -0.956382f, -0.956438f,
+ -0.956494f, -0.956550f, -0.956606f, -0.956662f, -0.956717f, -0.956773f, -0.956829f, -0.956885f,
+ -0.956940f, -0.956996f, -0.957052f, -0.957107f, -0.957163f, -0.957218f, -0.957274f, -0.957329f,
+ -0.957385f, -0.957440f, -0.957495f, -0.957550f, -0.957606f, -0.957661f, -0.957716f, -0.957771f,
+ -0.957826f, -0.957882f, -0.957937f, -0.957992f, -0.958046f, -0.958101f, -0.958156f, -0.958211f,
+ -0.958266f, -0.958321f, -0.958376f, -0.958430f, -0.958485f, -0.958540f, -0.958594f, -0.958649f,
+ -0.958703f, -0.958758f, -0.958812f, -0.958867f, -0.958921f, -0.958976f, -0.959030f, -0.959084f,
+ -0.959139f, -0.959193f, -0.959247f, -0.959301f, -0.959355f, -0.959409f, -0.959463f, -0.959518f,
+ -0.959572f, -0.959625f, -0.959679f, -0.959733f, -0.959787f, -0.959841f, -0.959895f, -0.959948f,
+ -0.960002f, -0.960056f, -0.960109f, -0.960163f, -0.960217f, -0.960270f, -0.960324f, -0.960377f,
+ -0.960431f, -0.960484f, -0.960537f, -0.960591f, -0.960644f, -0.960697f, -0.960750f, -0.960804f,
+ -0.960857f, -0.960910f, -0.960963f, -0.961016f, -0.961069f, -0.961122f, -0.961175f, -0.961228f,
+ -0.961280f, -0.961333f, -0.961386f, -0.961439f, -0.961492f, -0.961544f, -0.961597f, -0.961649f,
+ -0.961702f, -0.961755f, -0.961807f, -0.961860f, -0.961912f, -0.961964f, -0.962017f, -0.962069f,
+ -0.962121f, -0.962174f, -0.962226f, -0.962278f, -0.962330f, -0.962382f, -0.962434f, -0.962486f,
+ -0.962538f, -0.962590f, -0.962642f, -0.962694f, -0.962746f, -0.962798f, -0.962850f, -0.962902f,
+ -0.962953f, -0.963005f, -0.963057f, -0.963108f, -0.963160f, -0.963211f, -0.963263f, -0.963314f,
+ -0.963366f, -0.963417f, -0.963469f, -0.963520f, -0.963571f, -0.963623f, -0.963674f, -0.963725f,
+ -0.963776f, -0.963827f, -0.963878f, -0.963929f, -0.963980f, -0.964031f, -0.964082f, -0.964133f,
+ -0.964184f, -0.964235f, -0.964286f, -0.964336f, -0.964387f, -0.964438f, -0.964489f, -0.964539f,
+ -0.964590f, -0.964640f, -0.964691f, -0.964741f, -0.964792f, -0.964842f, -0.964893f, -0.964943f,
+ -0.964993f, -0.965044f, -0.965094f, -0.965144f, -0.965194f, -0.965244f, -0.965294f, -0.965344f,
+ -0.965394f, -0.965444f, -0.965494f, -0.965544f, -0.965594f, -0.965644f, -0.965694f, -0.965744f,
+ -0.965793f, -0.965843f, -0.965893f, -0.965942f, -0.965992f, -0.966042f, -0.966091f, -0.966141f,
+ -0.966190f, -0.966239f, -0.966289f, -0.966338f, -0.966387f, -0.966437f, -0.966486f, -0.966535f,
+ -0.966584f, -0.966633f, -0.966683f, -0.966732f, -0.966781f, -0.966830f, -0.966879f, -0.966928f,
+ -0.966976f, -0.967025f, -0.967074f, -0.967123f, -0.967172f, -0.967220f, -0.967269f, -0.967318f,
+ -0.967366f, -0.967415f, -0.967463f, -0.967512f, -0.967560f, -0.967609f, -0.967657f, -0.967706f,
+ -0.967754f, -0.967802f, -0.967850f, -0.967899f, -0.967947f, -0.967995f, -0.968043f, -0.968091f,
+ -0.968139f, -0.968187f, -0.968235f, -0.968283f, -0.968331f, -0.968379f, -0.968427f, -0.968474f,
+ -0.968522f, -0.968570f, -0.968617f, -0.968665f, -0.968713f, -0.968760f, -0.968808f, -0.968855f,
+ -0.968903f, -0.968950f, -0.968998f, -0.969045f, -0.969092f, -0.969140f, -0.969187f, -0.969234f,
+ -0.969281f, -0.969328f, -0.969375f, -0.969423f, -0.969470f, -0.969517f, -0.969564f, -0.969611f,
+ -0.969657f, -0.969704f, -0.969751f, -0.969798f, -0.969845f, -0.969891f, -0.969938f, -0.969985f,
+ -0.970031f, -0.970078f, -0.970124f, -0.970171f, -0.970217f, -0.970264f, -0.970310f, -0.970357f,
+ -0.970403f, -0.970449f, -0.970495f, -0.970542f, -0.970588f, -0.970634f, -0.970680f, -0.970726f,
+ -0.970772f, -0.970818f, -0.970864f, -0.970910f, -0.970956f, -0.971002f, -0.971048f, -0.971093f,
+ -0.971139f, -0.971185f, -0.971231f, -0.971276f, -0.971322f, -0.971367f, -0.971413f, -0.971458f,
+ -0.971504f, -0.971549f, -0.971595f, -0.971640f, -0.971685f, -0.971731f, -0.971776f, -0.971821f,
+ -0.971866f, -0.971911f, -0.971957f, -0.972002f, -0.972047f, -0.972092f, -0.972137f, -0.972182f,
+ -0.972227f, -0.972271f, -0.972316f, -0.972361f, -0.972406f, -0.972450f, -0.972495f, -0.972540f,
+ -0.972584f, -0.972629f, -0.972673f, -0.972718f, -0.972762f, -0.972807f, -0.972851f, -0.972896f,
+ -0.972940f, -0.972984f, -0.973028f, -0.973073f, -0.973117f, -0.973161f, -0.973205f, -0.973249f,
+ -0.973293f, -0.973337f, -0.973381f, -0.973425f, -0.973469f, -0.973513f, -0.973557f, -0.973601f,
+ -0.973644f, -0.973688f, -0.973732f, -0.973775f, -0.973819f, -0.973862f, -0.973906f, -0.973949f,
+ -0.973993f, -0.974036f, -0.974080f, -0.974123f, -0.974166f, -0.974210f, -0.974253f, -0.974296f,
+ -0.974339f, -0.974383f, -0.974426f, -0.974469f, -0.974512f, -0.974555f, -0.974598f, -0.974641f,
+ -0.974684f, -0.974726f, -0.974769f, -0.974812f, -0.974855f, -0.974897f, -0.974940f, -0.974983f,
+ -0.975025f, -0.975068f, -0.975110f, -0.975153f, -0.975195f, -0.975238f, -0.975280f, -0.975323f,
+ -0.975365f, -0.975407f, -0.975449f, -0.975492f, -0.975534f, -0.975576f, -0.975618f, -0.975660f,
+ -0.975702f, -0.975744f, -0.975786f, -0.975828f, -0.975870f, -0.975912f, -0.975954f, -0.975995f,
+ -0.976037f, -0.976079f, -0.976120f, -0.976162f, -0.976204f, -0.976245f, -0.976287f, -0.976328f,
+ -0.976370f, -0.976411f, -0.976453f, -0.976494f, -0.976535f, -0.976576f, -0.976618f, -0.976659f,
+ -0.976700f, -0.976741f, -0.976782f, -0.976823f, -0.976864f, -0.976905f, -0.976946f, -0.976987f,
+ -0.977028f, -0.977069f, -0.977110f, -0.977151f, -0.977191f, -0.977232f, -0.977273f, -0.977313f,
+ -0.977354f, -0.977394f, -0.977435f, -0.977475f, -0.977516f, -0.977556f, -0.977597f, -0.977637f,
+ -0.977677f, -0.977718f, -0.977758f, -0.977798f, -0.977838f, -0.977878f, -0.977918f, -0.977959f,
+ -0.977998f, -0.978038f, -0.978078f, -0.978118f, -0.978158f, -0.978198f, -0.978238f, -0.978278f,
+ -0.978317f, -0.978357f, -0.978397f, -0.978436f, -0.978476f, -0.978516f, -0.978555f, -0.978594f,
+ -0.978634f, -0.978673f, -0.978713f, -0.978752f, -0.978791f, -0.978831f, -0.978870f, -0.978909f,
+ -0.978948f, -0.978987f, -0.979026f, -0.979065f, -0.979104f, -0.979143f, -0.979182f, -0.979221f,
+ -0.979260f, -0.979299f, -0.979338f, -0.979376f, -0.979415f, -0.979454f, -0.979493f, -0.979531f,
+ -0.979570f, -0.979608f, -0.979647f, -0.979685f, -0.979724f, -0.979762f, -0.979800f, -0.979839f,
+ -0.979877f, -0.979915f, -0.979954f, -0.979992f, -0.980030f, -0.980068f, -0.980106f, -0.980144f,
+ -0.980182f, -0.980220f, -0.980258f, -0.980296f, -0.980334f, -0.980372f, -0.980409f, -0.980447f,
+ -0.980485f, -0.980523f, -0.980560f, -0.980598f, -0.980635f, -0.980673f, -0.980710f, -0.980748f,
+ -0.980785f, -0.980823f, -0.980860f, -0.980897f, -0.980935f, -0.980972f, -0.981009f, -0.981046f,
+ -0.981083f, -0.981120f, -0.981158f, -0.981195f, -0.981232f, -0.981269f, -0.981305f, -0.981342f,
+ -0.981379f, -0.981416f, -0.981453f, -0.981490f, -0.981526f, -0.981563f, -0.981600f, -0.981636f,
+ -0.981673f, -0.981709f, -0.981746f, -0.981782f, -0.981819f, -0.981855f, -0.981891f, -0.981928f,
+ -0.981964f, -0.982000f, -0.982036f, -0.982072f, -0.982109f, -0.982145f, -0.982181f, -0.982217f,
+ -0.982253f, -0.982289f, -0.982325f, -0.982360f, -0.982396f, -0.982432f, -0.982468f, -0.982504f,
+ -0.982539f, -0.982575f, -0.982611f, -0.982646f, -0.982682f, -0.982717f, -0.982753f, -0.982788f,
+ -0.982824f, -0.982859f, -0.982894f, -0.982930f, -0.982965f, -0.983000f, -0.983035f, -0.983070f,
+ -0.983105f, -0.983141f, -0.983176f, -0.983211f, -0.983246f, -0.983281f, -0.983315f, -0.983350f,
+ -0.983385f, -0.983420f, -0.983455f, -0.983489f, -0.983524f, -0.983559f, -0.983593f, -0.983628f,
+ -0.983662f, -0.983697f, -0.983731f, -0.983766f, -0.983800f, -0.983835f, -0.983869f, -0.983903f,
+ -0.983937f, -0.983972f, -0.984006f, -0.984040f, -0.984074f, -0.984108f, -0.984142f, -0.984176f,
+ -0.984210f, -0.984244f, -0.984278f, -0.984312f, -0.984346f, -0.984379f, -0.984413f, -0.984447f,
+ -0.984480f, -0.984514f, -0.984548f, -0.984581f, -0.984615f, -0.984648f, -0.984682f, -0.984715f,
+ -0.984748f, -0.984782f, -0.984815f, -0.984848f, -0.984882f, -0.984915f, -0.984948f, -0.984981f,
+ -0.985014f, -0.985047f, -0.985080f, -0.985113f, -0.985146f, -0.985179f, -0.985212f, -0.985245f,
+ -0.985278f, -0.985310f, -0.985343f, -0.985376f, -0.985408f, -0.985441f, -0.985474f, -0.985506f,
+ -0.985539f, -0.985571f, -0.985604f, -0.985636f, -0.985668f, -0.985701f, -0.985733f, -0.985765f,
+ -0.985798f, -0.985830f, -0.985862f, -0.985894f, -0.985926f, -0.985958f, -0.985990f, -0.986022f,
+ -0.986054f, -0.986086f, -0.986118f, -0.986150f, -0.986181f, -0.986213f, -0.986245f, -0.986276f,
+ -0.986308f, -0.986340f, -0.986371f, -0.986403f, -0.986434f, -0.986466f, -0.986497f, -0.986529f,
+ -0.986560f, -0.986591f, -0.986623f, -0.986654f, -0.986685f, -0.986716f, -0.986747f, -0.986778f,
+ -0.986809f, -0.986840f, -0.986871f, -0.986902f, -0.986933f, -0.986964f, -0.986995f, -0.987026f,
+ -0.987057f, -0.987087f, -0.987118f, -0.987149f, -0.987179f, -0.987210f, -0.987240f, -0.987271f,
+ -0.987301f, -0.987332f, -0.987362f, -0.987393f, -0.987423f, -0.987453f, -0.987484f, -0.987514f,
+ -0.987544f, -0.987574f, -0.987604f, -0.987634f, -0.987664f, -0.987694f, -0.987724f, -0.987754f,
+ -0.987784f, -0.987814f, -0.987844f, -0.987874f, -0.987903f, -0.987933f, -0.987963f, -0.987992f,
+ -0.988022f, -0.988052f, -0.988081f, -0.988111f, -0.988140f, -0.988169f, -0.988199f, -0.988228f,
+ -0.988258f, -0.988287f, -0.988316f, -0.988345f, -0.988374f, -0.988404f, -0.988433f, -0.988462f,
+ -0.988491f, -0.988520f, -0.988549f, -0.988578f, -0.988607f, -0.988635f, -0.988664f, -0.988693f,
+ -0.988722f, -0.988750f, -0.988779f, -0.988808f, -0.988836f, -0.988865f, -0.988893f, -0.988922f,
+ -0.988950f, -0.988979f, -0.989007f, -0.989035f, -0.989064f, -0.989092f, -0.989120f, -0.989148f,
+ -0.989177f, -0.989205f, -0.989233f, -0.989261f, -0.989289f, -0.989317f, -0.989345f, -0.989373f,
+ -0.989400f, -0.989428f, -0.989456f, -0.989484f, -0.989511f, -0.989539f, -0.989567f, -0.989594f,
+ -0.989622f, -0.989650f, -0.989677f, -0.989704f, -0.989732f, -0.989759f, -0.989787f, -0.989814f,
+ -0.989841f, -0.989869f, -0.989896f, -0.989923f, -0.989950f, -0.989977f, -0.990004f, -0.990031f,
+ -0.990058f, -0.990085f, -0.990112f, -0.990139f, -0.990166f, -0.990193f, -0.990219f, -0.990246f,
+ -0.990273f, -0.990299f, -0.990326f, -0.990353f, -0.990379f, -0.990406f, -0.990432f, -0.990459f,
+ -0.990485f, -0.990511f, -0.990538f, -0.990564f, -0.990590f, -0.990617f, -0.990643f, -0.990669f,
+ -0.990695f, -0.990721f, -0.990747f, -0.990773f, -0.990799f, -0.990825f, -0.990851f, -0.990877f,
+ -0.990903f, -0.990928f, -0.990954f, -0.990980f, -0.991006f, -0.991031f, -0.991057f, -0.991082f,
+ -0.991108f, -0.991133f, -0.991159f, -0.991184f, -0.991210f, -0.991235f, -0.991260f, -0.991286f,
+ -0.991311f, -0.991336f, -0.991361f, -0.991386f, -0.991411f, -0.991437f, -0.991462f, -0.991487f,
+ -0.991511f, -0.991536f, -0.991561f, -0.991586f, -0.991611f, -0.991636f, -0.991660f, -0.991685f,
+ -0.991710f, -0.991734f, -0.991759f, -0.991783f, -0.991808f, -0.991832f, -0.991857f, -0.991881f,
+ -0.991906f, -0.991930f, -0.991954f, -0.991979f, -0.992003f, -0.992027f, -0.992051f, -0.992075f,
+ -0.992099f, -0.992123f, -0.992147f, -0.992171f, -0.992195f, -0.992219f, -0.992243f, -0.992267f,
+ -0.992291f, -0.992314f, -0.992338f, -0.992362f, -0.992385f, -0.992409f, -0.992433f, -0.992456f,
+ -0.992480f, -0.992503f, -0.992526f, -0.992550f, -0.992573f, -0.992596f, -0.992620f, -0.992643f,
+ -0.992666f, -0.992689f, -0.992712f, -0.992736f, -0.992759f, -0.992782f, -0.992805f, -0.992828f,
+ -0.992850f, -0.992873f, -0.992896f, -0.992919f, -0.992942f, -0.992964f, -0.992987f, -0.993010f,
+ -0.993032f, -0.993055f, -0.993077f, -0.993100f, -0.993122f, -0.993145f, -0.993167f, -0.993190f,
+ -0.993212f, -0.993234f, -0.993257f, -0.993279f, -0.993301f, -0.993323f, -0.993345f, -0.993367f,
+ -0.993389f, -0.993411f, -0.993433f, -0.993455f, -0.993477f, -0.993499f, -0.993521f, -0.993542f,
+ -0.993564f, -0.993586f, -0.993608f, -0.993629f, -0.993651f, -0.993672f, -0.993694f, -0.993715f,
+ -0.993737f, -0.993758f, -0.993779f, -0.993801f, -0.993822f, -0.993843f, -0.993865f, -0.993886f,
+ -0.993907f, -0.993928f, -0.993949f, -0.993970f, -0.993991f, -0.994012f, -0.994033f, -0.994054f,
+ -0.994075f, -0.994096f, -0.994116f, -0.994137f, -0.994158f, -0.994179f, -0.994199f, -0.994220f,
+ -0.994240f, -0.994261f, -0.994281f, -0.994302f, -0.994322f, -0.994343f, -0.994363f, -0.994383f,
+ -0.994404f, -0.994424f, -0.994444f, -0.994464f, -0.994484f, -0.994505f, -0.994525f, -0.994545f,
+ -0.994565f, -0.994585f, -0.994604f, -0.994624f, -0.994644f, -0.994664f, -0.994684f, -0.994703f,
+ -0.994723f, -0.994743f, -0.994762f, -0.994782f, -0.994802f, -0.994821f, -0.994841f, -0.994860f,
+ -0.994879f, -0.994899f, -0.994918f, -0.994937f, -0.994957f, -0.994976f, -0.994995f, -0.995014f,
+ -0.995033f, -0.995052f, -0.995071f, -0.995090f, -0.995109f, -0.995128f, -0.995147f, -0.995166f,
+ -0.995185f, -0.995203f, -0.995222f, -0.995241f, -0.995260f, -0.995278f, -0.995297f, -0.995315f,
+ -0.995334f, -0.995352f, -0.995371f, -0.995389f, -0.995408f, -0.995426f, -0.995444f, -0.995463f,
+ -0.995481f, -0.995499f, -0.995517f, -0.995535f, -0.995553f, -0.995571f, -0.995589f, -0.995607f,
+ -0.995625f, -0.995643f, -0.995661f, -0.995679f, -0.995697f, -0.995714f, -0.995732f, -0.995750f,
+ -0.995767f, -0.995785f, -0.995803f, -0.995820f, -0.995838f, -0.995855f, -0.995872f, -0.995890f,
+ -0.995907f, -0.995925f, -0.995942f, -0.995959f, -0.995976f, -0.995993f, -0.996011f, -0.996028f,
+ -0.996045f, -0.996062f, -0.996079f, -0.996096f, -0.996113f, -0.996129f, -0.996146f, -0.996163f,
+ -0.996180f, -0.996197f, -0.996213f, -0.996230f, -0.996247f, -0.996263f, -0.996280f, -0.996296f,
+ -0.996313f, -0.996329f, -0.996345f, -0.996362f, -0.996378f, -0.996394f, -0.996411f, -0.996427f,
+ -0.996443f, -0.996459f, -0.996475f, -0.996491f, -0.996507f, -0.996523f, -0.996539f, -0.996555f,
+ -0.996571f, -0.996587f, -0.996603f, -0.996619f, -0.996634f, -0.996650f, -0.996666f, -0.996681f,
+ -0.996697f, -0.996712f, -0.996728f, -0.996743f, -0.996759f, -0.996774f, -0.996790f, -0.996805f,
+ -0.996820f, -0.996836f, -0.996851f, -0.996866f, -0.996881f, -0.996896f, -0.996911f, -0.996926f,
+ -0.996941f, -0.996956f, -0.996971f, -0.996986f, -0.997001f, -0.997016f, -0.997031f, -0.997045f,
+ -0.997060f, -0.997075f, -0.997089f, -0.997104f, -0.997119f, -0.997133f, -0.997148f, -0.997162f,
+ -0.997176f, -0.997191f, -0.997205f, -0.997219f, -0.997234f, -0.997248f, -0.997262f, -0.997276f,
+ -0.997290f, -0.997305f, -0.997319f, -0.997333f, -0.997347f, -0.997361f, -0.997374f, -0.997388f,
+ -0.997402f, -0.997416f, -0.997430f, -0.997443f, -0.997457f, -0.997471f, -0.997484f, -0.997498f,
+ -0.997511f, -0.997525f, -0.997538f, -0.997552f, -0.997565f, -0.997579f, -0.997592f, -0.997605f,
+ -0.997618f, -0.997632f, -0.997645f, -0.997658f, -0.997671f, -0.997684f, -0.997697f, -0.997710f,
+ -0.997723f, -0.997736f, -0.997749f, -0.997762f, -0.997774f, -0.997787f, -0.997800f, -0.997813f,
+ -0.997825f, -0.997838f, -0.997851f, -0.997863f, -0.997876f, -0.997888f, -0.997901f, -0.997913f,
+ -0.997925f, -0.997938f, -0.997950f, -0.997962f, -0.997974f, -0.997987f, -0.997999f, -0.998011f,
+ -0.998023f, -0.998035f, -0.998047f, -0.998059f, -0.998071f, -0.998083f, -0.998094f, -0.998106f,
+ -0.998118f, -0.998130f, -0.998142f, -0.998153f, -0.998165f, -0.998176f, -0.998188f, -0.998200f,
+ -0.998211f, -0.998222f, -0.998234f, -0.998245f, -0.998257f, -0.998268f, -0.998279f, -0.998290f,
+ -0.998302f, -0.998313f, -0.998324f, -0.998335f, -0.998346f, -0.998357f, -0.998368f, -0.998379f,
+ -0.998390f, -0.998401f, -0.998411f, -0.998422f, -0.998433f, -0.998444f, -0.998454f, -0.998465f,
+ -0.998476f, -0.998486f, -0.998497f, -0.998507f, -0.998518f, -0.998528f, -0.998538f, -0.998549f,
+ -0.998559f, -0.998569f, -0.998580f, -0.998590f, -0.998600f, -0.998610f, -0.998620f, -0.998630f,
+ -0.998640f, -0.998650f, -0.998660f, -0.998670f, -0.998680f, -0.998690f, -0.998700f, -0.998709f,
+ -0.998719f, -0.998729f, -0.998738f, -0.998748f, -0.998758f, -0.998767f, -0.998777f, -0.998786f,
+ -0.998795f, -0.998805f, -0.998814f, -0.998824f, -0.998833f, -0.998842f, -0.998851f, -0.998860f,
+ -0.998870f, -0.998879f, -0.998888f, -0.998897f, -0.998906f, -0.998915f, -0.998924f, -0.998932f,
+ -0.998941f, -0.998950f, -0.998959f, -0.998968f, -0.998976f, -0.998985f, -0.998994f, -0.999002f,
+ -0.999011f, -0.999019f, -0.999028f, -0.999036f, -0.999044f, -0.999053f, -0.999061f, -0.999069f,
+ -0.999078f, -0.999086f, -0.999094f, -0.999102f, -0.999110f, -0.999118f, -0.999126f, -0.999134f,
+ -0.999142f, -0.999150f, -0.999158f, -0.999166f, -0.999174f, -0.999182f, -0.999189f, -0.999197f,
+ -0.999205f, -0.999212f, -0.999220f, -0.999228f, -0.999235f, -0.999243f, -0.999250f, -0.999257f,
+ -0.999265f, -0.999272f, -0.999279f, -0.999287f, -0.999294f, -0.999301f, -0.999308f, -0.999315f,
+ -0.999322f, -0.999329f, -0.999336f, -0.999343f, -0.999350f, -0.999357f, -0.999364f, -0.999371f,
+ -0.999378f, -0.999384f, -0.999391f, -0.999398f, -0.999404f, -0.999411f, -0.999418f, -0.999424f,
+ -0.999431f, -0.999437f, -0.999443f, -0.999450f, -0.999456f, -0.999462f, -0.999469f, -0.999475f,
+ -0.999481f, -0.999487f, -0.999493f, -0.999500f, -0.999506f, -0.999512f, -0.999518f, -0.999524f,
+ -0.999529f, -0.999535f, -0.999541f, -0.999547f, -0.999553f, -0.999558f, -0.999564f, -0.999570f,
+ -0.999575f, -0.999581f, -0.999586f, -0.999592f, -0.999597f, -0.999603f, -0.999608f, -0.999614f,
+ -0.999619f, -0.999624f, -0.999629f, -0.999635f, -0.999640f, -0.999645f, -0.999650f, -0.999655f,
+ -0.999660f, -0.999665f, -0.999670f, -0.999675f, -0.999680f, -0.999685f, -0.999689f, -0.999694f,
+ -0.999699f, -0.999704f, -0.999708f, -0.999713f, -0.999717f, -0.999722f, -0.999726f, -0.999731f,
+ -0.999735f, -0.999740f, -0.999744f, -0.999748f, -0.999753f, -0.999757f, -0.999761f, -0.999765f,
+ -0.999769f, -0.999774f, -0.999778f, -0.999782f, -0.999786f, -0.999790f, -0.999793f, -0.999797f,
+ -0.999801f, -0.999805f, -0.999809f, -0.999812f, -0.999816f, -0.999820f, -0.999823f, -0.999827f,
+ -0.999831f, -0.999834f, -0.999838f, -0.999841f, -0.999844f, -0.999848f, -0.999851f, -0.999854f,
+ -0.999858f, -0.999861f, -0.999864f, -0.999867f, -0.999870f, -0.999873f, -0.999876f, -0.999879f,
+ -0.999882f, -0.999885f, -0.999888f, -0.999891f, -0.999894f, -0.999897f, -0.999899f, -0.999902f,
+ -0.999905f, -0.999907f, -0.999910f, -0.999913f, -0.999915f, -0.999917f, -0.999920f, -0.999922f,
+ -0.999925f, -0.999927f, -0.999929f, -0.999932f, -0.999934f, -0.999936f, -0.999938f, -0.999940f,
+ -0.999942f, -0.999944f, -0.999946f, -0.999948f, -0.999950f, -0.999952f, -0.999954f, -0.999956f,
+ -0.999958f, -0.999959f, -0.999961f, -0.999963f, -0.999964f, -0.999966f, -0.999968f, -0.999969f,
+ -0.999971f, -0.999972f, -0.999973f, -0.999975f, -0.999976f, -0.999977f, -0.999979f, -0.999980f,
+ -0.999981f, -0.999982f, -0.999983f, -0.999985f, -0.999986f, -0.999987f, -0.999988f, -0.999988f,
+ -0.999989f, -0.999990f, -0.999991f, -0.999992f, -0.999993f, -0.999993f, -0.999994f, -0.999995f,
+ -0.999995f, -0.999996f, -0.999996f, -0.999997f, -0.999997f, -0.999998f, -0.999998f, -0.999999f,
+ -0.999999f, -0.999999f, -0.999999f, -1.000000f, -1.000000f, -1.000000f, -1.000000f, -1.000000
+};
+
+static const float sinTable65536[32768] = {
+ 0.000000f, 0.000096f, 0.000192f, 0.000288f, 0.000383f, 0.000479f, 0.000575f, 0.000671f,
+ 0.000767f, 0.000863f, 0.000959f, 0.001055f, 0.001150f, 0.001246f, 0.001342f, 0.001438f,
+ 0.001534f, 0.001630f, 0.001726f, 0.001822f, 0.001917f, 0.002013f, 0.002109f, 0.002205f,
+ 0.002301f, 0.002397f, 0.002493f, 0.002589f, 0.002684f, 0.002780f, 0.002876f, 0.002972f,
+ 0.003068f, 0.003164f, 0.003260f, 0.003356f, 0.003451f, 0.003547f, 0.003643f, 0.003739f,
+ 0.003835f, 0.003931f, 0.004027f, 0.004123f, 0.004218f, 0.004314f, 0.004410f, 0.004506f,
+ 0.004602f, 0.004698f, 0.004794f, 0.004890f, 0.004985f, 0.005081f, 0.005177f, 0.005273f,
+ 0.005369f, 0.005465f, 0.005561f, 0.005657f, 0.005752f, 0.005848f, 0.005944f, 0.006040f,
+ 0.006136f, 0.006232f, 0.006328f, 0.006424f, 0.006519f, 0.006615f, 0.006711f, 0.006807f,
+ 0.006903f, 0.006999f, 0.007095f, 0.007190f, 0.007286f, 0.007382f, 0.007478f, 0.007574f,
+ 0.007670f, 0.007766f, 0.007862f, 0.007957f, 0.008053f, 0.008149f, 0.008245f, 0.008341f,
+ 0.008437f, 0.008533f, 0.008629f, 0.008724f, 0.008820f, 0.008916f, 0.009012f, 0.009108f,
+ 0.009204f, 0.009300f, 0.009395f, 0.009491f, 0.009587f, 0.009683f, 0.009779f, 0.009875f,
+ 0.009971f, 0.010067f, 0.010162f, 0.010258f, 0.010354f, 0.010450f, 0.010546f, 0.010642f,
+ 0.010738f, 0.010834f, 0.010929f, 0.011025f, 0.011121f, 0.011217f, 0.011313f, 0.011409f,
+ 0.011505f, 0.011600f, 0.011696f, 0.011792f, 0.011888f, 0.011984f, 0.012080f, 0.012176f,
+ 0.012272f, 0.012367f, 0.012463f, 0.012559f, 0.012655f, 0.012751f, 0.012847f, 0.012943f,
+ 0.013038f, 0.013134f, 0.013230f, 0.013326f, 0.013422f, 0.013518f, 0.013614f, 0.013710f,
+ 0.013805f, 0.013901f, 0.013997f, 0.014093f, 0.014189f, 0.014285f, 0.014381f, 0.014476f,
+ 0.014572f, 0.014668f, 0.014764f, 0.014860f, 0.014956f, 0.015052f, 0.015147f, 0.015243f,
+ 0.015339f, 0.015435f, 0.015531f, 0.015627f, 0.015723f, 0.015819f, 0.015914f, 0.016010f,
+ 0.016106f, 0.016202f, 0.016298f, 0.016394f, 0.016490f, 0.016585f, 0.016681f, 0.016777f,
+ 0.016873f, 0.016969f, 0.017065f, 0.017161f, 0.017256f, 0.017352f, 0.017448f, 0.017544f,
+ 0.017640f, 0.017736f, 0.017832f, 0.017927f, 0.018023f, 0.018119f, 0.018215f, 0.018311f,
+ 0.018407f, 0.018503f, 0.018598f, 0.018694f, 0.018790f, 0.018886f, 0.018982f, 0.019078f,
+ 0.019174f, 0.019269f, 0.019365f, 0.019461f, 0.019557f, 0.019653f, 0.019749f, 0.019845f,
+ 0.019940f, 0.020036f, 0.020132f, 0.020228f, 0.020324f, 0.020420f, 0.020516f, 0.020611f,
+ 0.020707f, 0.020803f, 0.020899f, 0.020995f, 0.021091f, 0.021187f, 0.021282f, 0.021378f,
+ 0.021474f, 0.021570f, 0.021666f, 0.021762f, 0.021857f, 0.021953f, 0.022049f, 0.022145f,
+ 0.022241f, 0.022337f, 0.022433f, 0.022528f, 0.022624f, 0.022720f, 0.022816f, 0.022912f,
+ 0.023008f, 0.023104f, 0.023199f, 0.023295f, 0.023391f, 0.023487f, 0.023583f, 0.023679f,
+ 0.023774f, 0.023870f, 0.023966f, 0.024062f, 0.024158f, 0.024254f, 0.024350f, 0.024445f,
+ 0.024541f, 0.024637f, 0.024733f, 0.024829f, 0.024925f, 0.025020f, 0.025116f, 0.025212f,
+ 0.025308f, 0.025404f, 0.025500f, 0.025596f, 0.025691f, 0.025787f, 0.025883f, 0.025979f,
+ 0.026075f, 0.026171f, 0.026266f, 0.026362f, 0.026458f, 0.026554f, 0.026650f, 0.026746f,
+ 0.026841f, 0.026937f, 0.027033f, 0.027129f, 0.027225f, 0.027321f, 0.027416f, 0.027512f,
+ 0.027608f, 0.027704f, 0.027800f, 0.027896f, 0.027991f, 0.028087f, 0.028183f, 0.028279f,
+ 0.028375f, 0.028471f, 0.028567f, 0.028662f, 0.028758f, 0.028854f, 0.028950f, 0.029046f,
+ 0.029142f, 0.029237f, 0.029333f, 0.029429f, 0.029525f, 0.029621f, 0.029717f, 0.029812f,
+ 0.029908f, 0.030004f, 0.030100f, 0.030196f, 0.030291f, 0.030387f, 0.030483f, 0.030579f,
+ 0.030675f, 0.030771f, 0.030866f, 0.030962f, 0.031058f, 0.031154f, 0.031250f, 0.031346f,
+ 0.031441f, 0.031537f, 0.031633f, 0.031729f, 0.031825f, 0.031921f, 0.032016f, 0.032112f,
+ 0.032208f, 0.032304f, 0.032400f, 0.032495f, 0.032591f, 0.032687f, 0.032783f, 0.032879f,
+ 0.032975f, 0.033070f, 0.033166f, 0.033262f, 0.033358f, 0.033454f, 0.033550f, 0.033645f,
+ 0.033741f, 0.033837f, 0.033933f, 0.034029f, 0.034124f, 0.034220f, 0.034316f, 0.034412f,
+ 0.034508f, 0.034604f, 0.034699f, 0.034795f, 0.034891f, 0.034987f, 0.035083f, 0.035178f,
+ 0.035274f, 0.035370f, 0.035466f, 0.035562f, 0.035657f, 0.035753f, 0.035849f, 0.035945f,
+ 0.036041f, 0.036137f, 0.036232f, 0.036328f, 0.036424f, 0.036520f, 0.036616f, 0.036711f,
+ 0.036807f, 0.036903f, 0.036999f, 0.037095f, 0.037190f, 0.037286f, 0.037382f, 0.037478f,
+ 0.037574f, 0.037669f, 0.037765f, 0.037861f, 0.037957f, 0.038053f, 0.038149f, 0.038244f,
+ 0.038340f, 0.038436f, 0.038532f, 0.038628f, 0.038723f, 0.038819f, 0.038915f, 0.039011f,
+ 0.039107f, 0.039202f, 0.039298f, 0.039394f, 0.039490f, 0.039586f, 0.039681f, 0.039777f,
+ 0.039873f, 0.039969f, 0.040065f, 0.040160f, 0.040256f, 0.040352f, 0.040448f, 0.040544f,
+ 0.040639f, 0.040735f, 0.040831f, 0.040927f, 0.041022f, 0.041118f, 0.041214f, 0.041310f,
+ 0.041406f, 0.041501f, 0.041597f, 0.041693f, 0.041789f, 0.041885f, 0.041980f, 0.042076f,
+ 0.042172f, 0.042268f, 0.042364f, 0.042459f, 0.042555f, 0.042651f, 0.042747f, 0.042842f,
+ 0.042938f, 0.043034f, 0.043130f, 0.043226f, 0.043321f, 0.043417f, 0.043513f, 0.043609f,
+ 0.043705f, 0.043800f, 0.043896f, 0.043992f, 0.044088f, 0.044183f, 0.044279f, 0.044375f,
+ 0.044471f, 0.044567f, 0.044662f, 0.044758f, 0.044854f, 0.044950f, 0.045045f, 0.045141f,
+ 0.045237f, 0.045333f, 0.045429f, 0.045524f, 0.045620f, 0.045716f, 0.045812f, 0.045907f,
+ 0.046003f, 0.046099f, 0.046195f, 0.046290f, 0.046386f, 0.046482f, 0.046578f, 0.046674f,
+ 0.046769f, 0.046865f, 0.046961f, 0.047057f, 0.047152f, 0.047248f, 0.047344f, 0.047440f,
+ 0.047535f, 0.047631f, 0.047727f, 0.047823f, 0.047919f, 0.048014f, 0.048110f, 0.048206f,
+ 0.048302f, 0.048397f, 0.048493f, 0.048589f, 0.048685f, 0.048780f, 0.048876f, 0.048972f,
+ 0.049068f, 0.049163f, 0.049259f, 0.049355f, 0.049451f, 0.049546f, 0.049642f, 0.049738f,
+ 0.049834f, 0.049929f, 0.050025f, 0.050121f, 0.050217f, 0.050312f, 0.050408f, 0.050504f,
+ 0.050600f, 0.050696f, 0.050791f, 0.050887f, 0.050983f, 0.051078f, 0.051174f, 0.051270f,
+ 0.051366f, 0.051461f, 0.051557f, 0.051653f, 0.051749f, 0.051844f, 0.051940f, 0.052036f,
+ 0.052132f, 0.052227f, 0.052323f, 0.052419f, 0.052515f, 0.052610f, 0.052706f, 0.052802f,
+ 0.052898f, 0.052993f, 0.053089f, 0.053185f, 0.053281f, 0.053376f, 0.053472f, 0.053568f,
+ 0.053664f, 0.053759f, 0.053855f, 0.053951f, 0.054046f, 0.054142f, 0.054238f, 0.054334f,
+ 0.054429f, 0.054525f, 0.054621f, 0.054717f, 0.054812f, 0.054908f, 0.055004f, 0.055100f,
+ 0.055195f, 0.055291f, 0.055387f, 0.055482f, 0.055578f, 0.055674f, 0.055770f, 0.055865f,
+ 0.055961f, 0.056057f, 0.056152f, 0.056248f, 0.056344f, 0.056440f, 0.056535f, 0.056631f,
+ 0.056727f, 0.056823f, 0.056918f, 0.057014f, 0.057110f, 0.057205f, 0.057301f, 0.057397f,
+ 0.057493f, 0.057588f, 0.057684f, 0.057780f, 0.057875f, 0.057971f, 0.058067f, 0.058163f,
+ 0.058258f, 0.058354f, 0.058450f, 0.058545f, 0.058641f, 0.058737f, 0.058833f, 0.058928f,
+ 0.059024f, 0.059120f, 0.059215f, 0.059311f, 0.059407f, 0.059502f, 0.059598f, 0.059694f,
+ 0.059790f, 0.059885f, 0.059981f, 0.060077f, 0.060172f, 0.060268f, 0.060364f, 0.060459f,
+ 0.060555f, 0.060651f, 0.060747f, 0.060842f, 0.060938f, 0.061034f, 0.061129f, 0.061225f,
+ 0.061321f, 0.061416f, 0.061512f, 0.061608f, 0.061704f, 0.061799f, 0.061895f, 0.061991f,
+ 0.062086f, 0.062182f, 0.062278f, 0.062373f, 0.062469f, 0.062565f, 0.062660f, 0.062756f,
+ 0.062852f, 0.062947f, 0.063043f, 0.063139f, 0.063234f, 0.063330f, 0.063426f, 0.063522f,
+ 0.063617f, 0.063713f, 0.063809f, 0.063904f, 0.064000f, 0.064096f, 0.064191f, 0.064287f,
+ 0.064383f, 0.064478f, 0.064574f, 0.064670f, 0.064765f, 0.064861f, 0.064957f, 0.065052f,
+ 0.065148f, 0.065244f, 0.065339f, 0.065435f, 0.065531f, 0.065626f, 0.065722f, 0.065818f,
+ 0.065913f, 0.066009f, 0.066105f, 0.066200f, 0.066296f, 0.066392f, 0.066487f, 0.066583f,
+ 0.066679f, 0.066774f, 0.066870f, 0.066966f, 0.067061f, 0.067157f, 0.067253f, 0.067348f,
+ 0.067444f, 0.067540f, 0.067635f, 0.067731f, 0.067827f, 0.067922f, 0.068018f, 0.068113f,
+ 0.068209f, 0.068305f, 0.068400f, 0.068496f, 0.068592f, 0.068687f, 0.068783f, 0.068879f,
+ 0.068974f, 0.069070f, 0.069166f, 0.069261f, 0.069357f, 0.069453f, 0.069548f, 0.069644f,
+ 0.069739f, 0.069835f, 0.069931f, 0.070026f, 0.070122f, 0.070218f, 0.070313f, 0.070409f,
+ 0.070505f, 0.070600f, 0.070696f, 0.070791f, 0.070887f, 0.070983f, 0.071078f, 0.071174f,
+ 0.071270f, 0.071365f, 0.071461f, 0.071557f, 0.071652f, 0.071748f, 0.071843f, 0.071939f,
+ 0.072035f, 0.072130f, 0.072226f, 0.072322f, 0.072417f, 0.072513f, 0.072608f, 0.072704f,
+ 0.072800f, 0.072895f, 0.072991f, 0.073086f, 0.073182f, 0.073278f, 0.073373f, 0.073469f,
+ 0.073565f, 0.073660f, 0.073756f, 0.073851f, 0.073947f, 0.074043f, 0.074138f, 0.074234f,
+ 0.074329f, 0.074425f, 0.074521f, 0.074616f, 0.074712f, 0.074807f, 0.074903f, 0.074999f,
+ 0.075094f, 0.075190f, 0.075286f, 0.075381f, 0.075477f, 0.075572f, 0.075668f, 0.075764f,
+ 0.075859f, 0.075955f, 0.076050f, 0.076146f, 0.076241f, 0.076337f, 0.076433f, 0.076528f,
+ 0.076624f, 0.076719f, 0.076815f, 0.076911f, 0.077006f, 0.077102f, 0.077197f, 0.077293f,
+ 0.077389f, 0.077484f, 0.077580f, 0.077675f, 0.077771f, 0.077866f, 0.077962f, 0.078058f,
+ 0.078153f, 0.078249f, 0.078344f, 0.078440f, 0.078536f, 0.078631f, 0.078727f, 0.078822f,
+ 0.078918f, 0.079013f, 0.079109f, 0.079205f, 0.079300f, 0.079396f, 0.079491f, 0.079587f,
+ 0.079682f, 0.079778f, 0.079874f, 0.079969f, 0.080065f, 0.080160f, 0.080256f, 0.080351f,
+ 0.080447f, 0.080543f, 0.080638f, 0.080734f, 0.080829f, 0.080925f, 0.081020f, 0.081116f,
+ 0.081211f, 0.081307f, 0.081403f, 0.081498f, 0.081594f, 0.081689f, 0.081785f, 0.081880f,
+ 0.081976f, 0.082071f, 0.082167f, 0.082263f, 0.082358f, 0.082454f, 0.082549f, 0.082645f,
+ 0.082740f, 0.082836f, 0.082931f, 0.083027f, 0.083122f, 0.083218f, 0.083314f, 0.083409f,
+ 0.083505f, 0.083600f, 0.083696f, 0.083791f, 0.083887f, 0.083982f, 0.084078f, 0.084173f,
+ 0.084269f, 0.084364f, 0.084460f, 0.084555f, 0.084651f, 0.084747f, 0.084842f, 0.084938f,
+ 0.085033f, 0.085129f, 0.085224f, 0.085320f, 0.085415f, 0.085511f, 0.085606f, 0.085702f,
+ 0.085797f, 0.085893f, 0.085988f, 0.086084f, 0.086179f, 0.086275f, 0.086370f, 0.086466f,
+ 0.086561f, 0.086657f, 0.086752f, 0.086848f, 0.086943f, 0.087039f, 0.087135f, 0.087230f,
+ 0.087326f, 0.087421f, 0.087517f, 0.087612f, 0.087708f, 0.087803f, 0.087899f, 0.087994f,
+ 0.088090f, 0.088185f, 0.088281f, 0.088376f, 0.088472f, 0.088567f, 0.088663f, 0.088758f,
+ 0.088854f, 0.088949f, 0.089045f, 0.089140f, 0.089236f, 0.089331f, 0.089427f, 0.089522f,
+ 0.089617f, 0.089713f, 0.089808f, 0.089904f, 0.089999f, 0.090095f, 0.090190f, 0.090286f,
+ 0.090381f, 0.090477f, 0.090572f, 0.090668f, 0.090763f, 0.090859f, 0.090954f, 0.091050f,
+ 0.091145f, 0.091241f, 0.091336f, 0.091432f, 0.091527f, 0.091623f, 0.091718f, 0.091813f,
+ 0.091909f, 0.092004f, 0.092100f, 0.092195f, 0.092291f, 0.092386f, 0.092482f, 0.092577f,
+ 0.092673f, 0.092768f, 0.092864f, 0.092959f, 0.093055f, 0.093150f, 0.093245f, 0.093341f,
+ 0.093436f, 0.093532f, 0.093627f, 0.093723f, 0.093818f, 0.093914f, 0.094009f, 0.094104f,
+ 0.094200f, 0.094295f, 0.094391f, 0.094486f, 0.094582f, 0.094677f, 0.094773f, 0.094868f,
+ 0.094963f, 0.095059f, 0.095154f, 0.095250f, 0.095345f, 0.095441f, 0.095536f, 0.095632f,
+ 0.095727f, 0.095822f, 0.095918f, 0.096013f, 0.096109f, 0.096204f, 0.096300f, 0.096395f,
+ 0.096490f, 0.096586f, 0.096681f, 0.096777f, 0.096872f, 0.096968f, 0.097063f, 0.097158f,
+ 0.097254f, 0.097349f, 0.097445f, 0.097540f, 0.097635f, 0.097731f, 0.097826f, 0.097922f,
+ 0.098017f, 0.098113f, 0.098208f, 0.098303f, 0.098399f, 0.098494f, 0.098590f, 0.098685f,
+ 0.098780f, 0.098876f, 0.098971f, 0.099067f, 0.099162f, 0.099257f, 0.099353f, 0.099448f,
+ 0.099544f, 0.099639f, 0.099734f, 0.099830f, 0.099925f, 0.100021f, 0.100116f, 0.100211f,
+ 0.100307f, 0.100402f, 0.100498f, 0.100593f, 0.100688f, 0.100784f, 0.100879f, 0.100974f,
+ 0.101070f, 0.101165f, 0.101261f, 0.101356f, 0.101451f, 0.101547f, 0.101642f, 0.101738f,
+ 0.101833f, 0.101928f, 0.102024f, 0.102119f, 0.102214f, 0.102310f, 0.102405f, 0.102500f,
+ 0.102596f, 0.102691f, 0.102787f, 0.102882f, 0.102977f, 0.103073f, 0.103168f, 0.103263f,
+ 0.103359f, 0.103454f, 0.103550f, 0.103645f, 0.103740f, 0.103836f, 0.103931f, 0.104026f,
+ 0.104122f, 0.104217f, 0.104312f, 0.104408f, 0.104503f, 0.104598f, 0.104694f, 0.104789f,
+ 0.104884f, 0.104980f, 0.105075f, 0.105170f, 0.105266f, 0.105361f, 0.105456f, 0.105552f,
+ 0.105647f, 0.105742f, 0.105838f, 0.105933f, 0.106028f, 0.106124f, 0.106219f, 0.106314f,
+ 0.106410f, 0.106505f, 0.106600f, 0.106696f, 0.106791f, 0.106886f, 0.106982f, 0.107077f,
+ 0.107172f, 0.107268f, 0.107363f, 0.107458f, 0.107554f, 0.107649f, 0.107744f, 0.107840f,
+ 0.107935f, 0.108030f, 0.108126f, 0.108221f, 0.108316f, 0.108412f, 0.108507f, 0.108602f,
+ 0.108697f, 0.108793f, 0.108888f, 0.108983f, 0.109079f, 0.109174f, 0.109269f, 0.109365f,
+ 0.109460f, 0.109555f, 0.109650f, 0.109746f, 0.109841f, 0.109936f, 0.110032f, 0.110127f,
+ 0.110222f, 0.110317f, 0.110413f, 0.110508f, 0.110603f, 0.110699f, 0.110794f, 0.110889f,
+ 0.110984f, 0.111080f, 0.111175f, 0.111270f, 0.111366f, 0.111461f, 0.111556f, 0.111651f,
+ 0.111747f, 0.111842f, 0.111937f, 0.112033f, 0.112128f, 0.112223f, 0.112318f, 0.112414f,
+ 0.112509f, 0.112604f, 0.112699f, 0.112795f, 0.112890f, 0.112985f, 0.113080f, 0.113176f,
+ 0.113271f, 0.113366f, 0.113461f, 0.113557f, 0.113652f, 0.113747f, 0.113842f, 0.113938f,
+ 0.114033f, 0.114128f, 0.114223f, 0.114319f, 0.114414f, 0.114509f, 0.114604f, 0.114700f,
+ 0.114795f, 0.114890f, 0.114985f, 0.115081f, 0.115176f, 0.115271f, 0.115366f, 0.115462f,
+ 0.115557f, 0.115652f, 0.115747f, 0.115842f, 0.115938f, 0.116033f, 0.116128f, 0.116223f,
+ 0.116319f, 0.116414f, 0.116509f, 0.116604f, 0.116700f, 0.116795f, 0.116890f, 0.116985f,
+ 0.117080f, 0.117176f, 0.117271f, 0.117366f, 0.117461f, 0.117556f, 0.117652f, 0.117747f,
+ 0.117842f, 0.117937f, 0.118032f, 0.118128f, 0.118223f, 0.118318f, 0.118413f, 0.118508f,
+ 0.118604f, 0.118699f, 0.118794f, 0.118889f, 0.118984f, 0.119080f, 0.119175f, 0.119270f,
+ 0.119365f, 0.119460f, 0.119556f, 0.119651f, 0.119746f, 0.119841f, 0.119936f, 0.120032f,
+ 0.120127f, 0.120222f, 0.120317f, 0.120412f, 0.120507f, 0.120603f, 0.120698f, 0.120793f,
+ 0.120888f, 0.120983f, 0.121078f, 0.121174f, 0.121269f, 0.121364f, 0.121459f, 0.121554f,
+ 0.121649f, 0.121745f, 0.121840f, 0.121935f, 0.122030f, 0.122125f, 0.122220f, 0.122316f,
+ 0.122411f, 0.122506f, 0.122601f, 0.122696f, 0.122791f, 0.122886f, 0.122982f, 0.123077f,
+ 0.123172f, 0.123267f, 0.123362f, 0.123457f, 0.123552f, 0.123648f, 0.123743f, 0.123838f,
+ 0.123933f, 0.124028f, 0.124123f, 0.124218f, 0.124314f, 0.124409f, 0.124504f, 0.124599f,
+ 0.124694f, 0.124789f, 0.124884f, 0.124979f, 0.125075f, 0.125170f, 0.125265f, 0.125360f,
+ 0.125455f, 0.125550f, 0.125645f, 0.125740f, 0.125835f, 0.125931f, 0.126026f, 0.126121f,
+ 0.126216f, 0.126311f, 0.126406f, 0.126501f, 0.126596f, 0.126691f, 0.126787f, 0.126882f,
+ 0.126977f, 0.127072f, 0.127167f, 0.127262f, 0.127357f, 0.127452f, 0.127547f, 0.127642f,
+ 0.127737f, 0.127833f, 0.127928f, 0.128023f, 0.128118f, 0.128213f, 0.128308f, 0.128403f,
+ 0.128498f, 0.128593f, 0.128688f, 0.128783f, 0.128878f, 0.128973f, 0.129069f, 0.129164f,
+ 0.129259f, 0.129354f, 0.129449f, 0.129544f, 0.129639f, 0.129734f, 0.129829f, 0.129924f,
+ 0.130019f, 0.130114f, 0.130209f, 0.130304f, 0.130399f, 0.130495f, 0.130590f, 0.130685f,
+ 0.130780f, 0.130875f, 0.130970f, 0.131065f, 0.131160f, 0.131255f, 0.131350f, 0.131445f,
+ 0.131540f, 0.131635f, 0.131730f, 0.131825f, 0.131920f, 0.132015f, 0.132110f, 0.132205f,
+ 0.132300f, 0.132395f, 0.132490f, 0.132585f, 0.132680f, 0.132775f, 0.132870f, 0.132966f,
+ 0.133061f, 0.133156f, 0.133251f, 0.133346f, 0.133441f, 0.133536f, 0.133631f, 0.133726f,
+ 0.133821f, 0.133916f, 0.134011f, 0.134106f, 0.134201f, 0.134296f, 0.134391f, 0.134486f,
+ 0.134581f, 0.134676f, 0.134771f, 0.134866f, 0.134961f, 0.135056f, 0.135151f, 0.135246f,
+ 0.135341f, 0.135436f, 0.135531f, 0.135626f, 0.135721f, 0.135816f, 0.135911f, 0.136006f,
+ 0.136101f, 0.136196f, 0.136291f, 0.136386f, 0.136480f, 0.136575f, 0.136670f, 0.136765f,
+ 0.136860f, 0.136955f, 0.137050f, 0.137145f, 0.137240f, 0.137335f, 0.137430f, 0.137525f,
+ 0.137620f, 0.137715f, 0.137810f, 0.137905f, 0.138000f, 0.138095f, 0.138190f, 0.138285f,
+ 0.138380f, 0.138475f, 0.138570f, 0.138665f, 0.138760f, 0.138855f, 0.138949f, 0.139044f,
+ 0.139139f, 0.139234f, 0.139329f, 0.139424f, 0.139519f, 0.139614f, 0.139709f, 0.139804f,
+ 0.139899f, 0.139994f, 0.140089f, 0.140184f, 0.140279f, 0.140373f, 0.140468f, 0.140563f,
+ 0.140658f, 0.140753f, 0.140848f, 0.140943f, 0.141038f, 0.141133f, 0.141228f, 0.141323f,
+ 0.141418f, 0.141512f, 0.141607f, 0.141702f, 0.141797f, 0.141892f, 0.141987f, 0.142082f,
+ 0.142177f, 0.142272f, 0.142367f, 0.142461f, 0.142556f, 0.142651f, 0.142746f, 0.142841f,
+ 0.142936f, 0.143031f, 0.143126f, 0.143221f, 0.143316f, 0.143410f, 0.143505f, 0.143600f,
+ 0.143695f, 0.143790f, 0.143885f, 0.143980f, 0.144075f, 0.144169f, 0.144264f, 0.144359f,
+ 0.144454f, 0.144549f, 0.144644f, 0.144739f, 0.144833f, 0.144928f, 0.145023f, 0.145118f,
+ 0.145213f, 0.145308f, 0.145403f, 0.145497f, 0.145592f, 0.145687f, 0.145782f, 0.145877f,
+ 0.145972f, 0.146067f, 0.146161f, 0.146256f, 0.146351f, 0.146446f, 0.146541f, 0.146636f,
+ 0.146730f, 0.146825f, 0.146920f, 0.147015f, 0.147110f, 0.147205f, 0.147299f, 0.147394f,
+ 0.147489f, 0.147584f, 0.147679f, 0.147774f, 0.147868f, 0.147963f, 0.148058f, 0.148153f,
+ 0.148248f, 0.148342f, 0.148437f, 0.148532f, 0.148627f, 0.148722f, 0.148817f, 0.148911f,
+ 0.149006f, 0.149101f, 0.149196f, 0.149291f, 0.149385f, 0.149480f, 0.149575f, 0.149670f,
+ 0.149765f, 0.149859f, 0.149954f, 0.150049f, 0.150144f, 0.150238f, 0.150333f, 0.150428f,
+ 0.150523f, 0.150618f, 0.150712f, 0.150807f, 0.150902f, 0.150997f, 0.151092f, 0.151186f,
+ 0.151281f, 0.151376f, 0.151471f, 0.151565f, 0.151660f, 0.151755f, 0.151850f, 0.151944f,
+ 0.152039f, 0.152134f, 0.152229f, 0.152323f, 0.152418f, 0.152513f, 0.152608f, 0.152702f,
+ 0.152797f, 0.152892f, 0.152987f, 0.153081f, 0.153176f, 0.153271f, 0.153366f, 0.153460f,
+ 0.153555f, 0.153650f, 0.153745f, 0.153839f, 0.153934f, 0.154029f, 0.154124f, 0.154218f,
+ 0.154313f, 0.154408f, 0.154502f, 0.154597f, 0.154692f, 0.154787f, 0.154881f, 0.154976f,
+ 0.155071f, 0.155165f, 0.155260f, 0.155355f, 0.155450f, 0.155544f, 0.155639f, 0.155734f,
+ 0.155828f, 0.155923f, 0.156018f, 0.156112f, 0.156207f, 0.156302f, 0.156397f, 0.156491f,
+ 0.156586f, 0.156681f, 0.156775f, 0.156870f, 0.156965f, 0.157059f, 0.157154f, 0.157249f,
+ 0.157343f, 0.157438f, 0.157533f, 0.157627f, 0.157722f, 0.157817f, 0.157912f, 0.158006f,
+ 0.158101f, 0.158196f, 0.158290f, 0.158385f, 0.158480f, 0.158574f, 0.158669f, 0.158763f,
+ 0.158858f, 0.158953f, 0.159047f, 0.159142f, 0.159237f, 0.159331f, 0.159426f, 0.159521f,
+ 0.159615f, 0.159710f, 0.159805f, 0.159899f, 0.159994f, 0.160089f, 0.160183f, 0.160278f,
+ 0.160372f, 0.160467f, 0.160562f, 0.160656f, 0.160751f, 0.160846f, 0.160940f, 0.161035f,
+ 0.161129f, 0.161224f, 0.161319f, 0.161413f, 0.161508f, 0.161603f, 0.161697f, 0.161792f,
+ 0.161886f, 0.161981f, 0.162076f, 0.162170f, 0.162265f, 0.162359f, 0.162454f, 0.162549f,
+ 0.162643f, 0.162738f, 0.162832f, 0.162927f, 0.163022f, 0.163116f, 0.163211f, 0.163305f,
+ 0.163400f, 0.163495f, 0.163589f, 0.163684f, 0.163778f, 0.163873f, 0.163967f, 0.164062f,
+ 0.164157f, 0.164251f, 0.164346f, 0.164440f, 0.164535f, 0.164629f, 0.164724f, 0.164819f,
+ 0.164913f, 0.165008f, 0.165102f, 0.165197f, 0.165291f, 0.165386f, 0.165480f, 0.165575f,
+ 0.165670f, 0.165764f, 0.165859f, 0.165953f, 0.166048f, 0.166142f, 0.166237f, 0.166331f,
+ 0.166426f, 0.166520f, 0.166615f, 0.166710f, 0.166804f, 0.166899f, 0.166993f, 0.167088f,
+ 0.167182f, 0.167277f, 0.167371f, 0.167466f, 0.167560f, 0.167655f, 0.167749f, 0.167844f,
+ 0.167938f, 0.168033f, 0.168127f, 0.168222f, 0.168316f, 0.168411f, 0.168505f, 0.168600f,
+ 0.168694f, 0.168789f, 0.168883f, 0.168978f, 0.169072f, 0.169167f, 0.169261f, 0.169356f,
+ 0.169450f, 0.169545f, 0.169639f, 0.169734f, 0.169828f, 0.169923f, 0.170017f, 0.170112f,
+ 0.170206f, 0.170301f, 0.170395f, 0.170490f, 0.170584f, 0.170678f, 0.170773f, 0.170867f,
+ 0.170962f, 0.171056f, 0.171151f, 0.171245f, 0.171340f, 0.171434f, 0.171529f, 0.171623f,
+ 0.171718f, 0.171812f, 0.171906f, 0.172001f, 0.172095f, 0.172190f, 0.172284f, 0.172379f,
+ 0.172473f, 0.172568f, 0.172662f, 0.172756f, 0.172851f, 0.172945f, 0.173040f, 0.173134f,
+ 0.173229f, 0.173323f, 0.173417f, 0.173512f, 0.173606f, 0.173701f, 0.173795f, 0.173889f,
+ 0.173984f, 0.174078f, 0.174173f, 0.174267f, 0.174362f, 0.174456f, 0.174550f, 0.174645f,
+ 0.174739f, 0.174834f, 0.174928f, 0.175022f, 0.175117f, 0.175211f, 0.175305f, 0.175400f,
+ 0.175494f, 0.175589f, 0.175683f, 0.175777f, 0.175872f, 0.175966f, 0.176061f, 0.176155f,
+ 0.176249f, 0.176344f, 0.176438f, 0.176532f, 0.176627f, 0.176721f, 0.176815f, 0.176910f,
+ 0.177004f, 0.177099f, 0.177193f, 0.177287f, 0.177382f, 0.177476f, 0.177570f, 0.177665f,
+ 0.177759f, 0.177853f, 0.177948f, 0.178042f, 0.178136f, 0.178231f, 0.178325f, 0.178419f,
+ 0.178514f, 0.178608f, 0.178702f, 0.178797f, 0.178891f, 0.178985f, 0.179080f, 0.179174f,
+ 0.179268f, 0.179363f, 0.179457f, 0.179551f, 0.179646f, 0.179740f, 0.179834f, 0.179929f,
+ 0.180023f, 0.180117f, 0.180212f, 0.180306f, 0.180400f, 0.180494f, 0.180589f, 0.180683f,
+ 0.180777f, 0.180872f, 0.180966f, 0.181060f, 0.181154f, 0.181249f, 0.181343f, 0.181437f,
+ 0.181532f, 0.181626f, 0.181720f, 0.181814f, 0.181909f, 0.182003f, 0.182097f, 0.182192f,
+ 0.182286f, 0.182380f, 0.182474f, 0.182569f, 0.182663f, 0.182757f, 0.182851f, 0.182946f,
+ 0.183040f, 0.183134f, 0.183228f, 0.183323f, 0.183417f, 0.183511f, 0.183605f, 0.183700f,
+ 0.183794f, 0.183888f, 0.183982f, 0.184077f, 0.184171f, 0.184265f, 0.184359f, 0.184454f,
+ 0.184548f, 0.184642f, 0.184736f, 0.184830f, 0.184925f, 0.185019f, 0.185113f, 0.185207f,
+ 0.185301f, 0.185396f, 0.185490f, 0.185584f, 0.185678f, 0.185773f, 0.185867f, 0.185961f,
+ 0.186055f, 0.186149f, 0.186244f, 0.186338f, 0.186432f, 0.186526f, 0.186620f, 0.186715f,
+ 0.186809f, 0.186903f, 0.186997f, 0.187091f, 0.187185f, 0.187280f, 0.187374f, 0.187468f,
+ 0.187562f, 0.187656f, 0.187750f, 0.187845f, 0.187939f, 0.188033f, 0.188127f, 0.188221f,
+ 0.188315f, 0.188410f, 0.188504f, 0.188598f, 0.188692f, 0.188786f, 0.188880f, 0.188975f,
+ 0.189069f, 0.189163f, 0.189257f, 0.189351f, 0.189445f, 0.189539f, 0.189634f, 0.189728f,
+ 0.189822f, 0.189916f, 0.190010f, 0.190104f, 0.190198f, 0.190292f, 0.190387f, 0.190481f,
+ 0.190575f, 0.190669f, 0.190763f, 0.190857f, 0.190951f, 0.191045f, 0.191139f, 0.191234f,
+ 0.191328f, 0.191422f, 0.191516f, 0.191610f, 0.191704f, 0.191798f, 0.191892f, 0.191986f,
+ 0.192080f, 0.192174f, 0.192269f, 0.192363f, 0.192457f, 0.192551f, 0.192645f, 0.192739f,
+ 0.192833f, 0.192927f, 0.193021f, 0.193115f, 0.193209f, 0.193303f, 0.193397f, 0.193492f,
+ 0.193586f, 0.193680f, 0.193774f, 0.193868f, 0.193962f, 0.194056f, 0.194150f, 0.194244f,
+ 0.194338f, 0.194432f, 0.194526f, 0.194620f, 0.194714f, 0.194808f, 0.194902f, 0.194996f,
+ 0.195090f, 0.195184f, 0.195278f, 0.195372f, 0.195466f, 0.195560f, 0.195654f, 0.195748f,
+ 0.195843f, 0.195937f, 0.196031f, 0.196125f, 0.196219f, 0.196313f, 0.196407f, 0.196501f,
+ 0.196595f, 0.196689f, 0.196783f, 0.196877f, 0.196971f, 0.197065f, 0.197159f, 0.197253f,
+ 0.197347f, 0.197441f, 0.197535f, 0.197629f, 0.197722f, 0.197816f, 0.197910f, 0.198004f,
+ 0.198098f, 0.198192f, 0.198286f, 0.198380f, 0.198474f, 0.198568f, 0.198662f, 0.198756f,
+ 0.198850f, 0.198944f, 0.199038f, 0.199132f, 0.199226f, 0.199320f, 0.199414f, 0.199508f,
+ 0.199602f, 0.199696f, 0.199790f, 0.199884f, 0.199978f, 0.200071f, 0.200165f, 0.200259f,
+ 0.200353f, 0.200447f, 0.200541f, 0.200635f, 0.200729f, 0.200823f, 0.200917f, 0.201011f,
+ 0.201105f, 0.201199f, 0.201292f, 0.201386f, 0.201480f, 0.201574f, 0.201668f, 0.201762f,
+ 0.201856f, 0.201950f, 0.202044f, 0.202138f, 0.202231f, 0.202325f, 0.202419f, 0.202513f,
+ 0.202607f, 0.202701f, 0.202795f, 0.202889f, 0.202983f, 0.203076f, 0.203170f, 0.203264f,
+ 0.203358f, 0.203452f, 0.203546f, 0.203640f, 0.203734f, 0.203827f, 0.203921f, 0.204015f,
+ 0.204109f, 0.204203f, 0.204297f, 0.204391f, 0.204484f, 0.204578f, 0.204672f, 0.204766f,
+ 0.204860f, 0.204954f, 0.205047f, 0.205141f, 0.205235f, 0.205329f, 0.205423f, 0.205517f,
+ 0.205610f, 0.205704f, 0.205798f, 0.205892f, 0.205986f, 0.206080f, 0.206173f, 0.206267f,
+ 0.206361f, 0.206455f, 0.206549f, 0.206642f, 0.206736f, 0.206830f, 0.206924f, 0.207018f,
+ 0.207111f, 0.207205f, 0.207299f, 0.207393f, 0.207487f, 0.207580f, 0.207674f, 0.207768f,
+ 0.207862f, 0.207955f, 0.208049f, 0.208143f, 0.208237f, 0.208331f, 0.208424f, 0.208518f,
+ 0.208612f, 0.208706f, 0.208799f, 0.208893f, 0.208987f, 0.209081f, 0.209174f, 0.209268f,
+ 0.209362f, 0.209456f, 0.209549f, 0.209643f, 0.209737f, 0.209831f, 0.209924f, 0.210018f,
+ 0.210112f, 0.210206f, 0.210299f, 0.210393f, 0.210487f, 0.210580f, 0.210674f, 0.210768f,
+ 0.210862f, 0.210955f, 0.211049f, 0.211143f, 0.211237f, 0.211330f, 0.211424f, 0.211518f,
+ 0.211611f, 0.211705f, 0.211799f, 0.211892f, 0.211986f, 0.212080f, 0.212174f, 0.212267f,
+ 0.212361f, 0.212455f, 0.212548f, 0.212642f, 0.212736f, 0.212829f, 0.212923f, 0.213017f,
+ 0.213110f, 0.213204f, 0.213298f, 0.213391f, 0.213485f, 0.213579f, 0.213672f, 0.213766f,
+ 0.213860f, 0.213953f, 0.214047f, 0.214141f, 0.214234f, 0.214328f, 0.214422f, 0.214515f,
+ 0.214609f, 0.214702f, 0.214796f, 0.214890f, 0.214983f, 0.215077f, 0.215171f, 0.215264f,
+ 0.215358f, 0.215451f, 0.215545f, 0.215639f, 0.215732f, 0.215826f, 0.215920f, 0.216013f,
+ 0.216107f, 0.216200f, 0.216294f, 0.216388f, 0.216481f, 0.216575f, 0.216668f, 0.216762f,
+ 0.216856f, 0.216949f, 0.217043f, 0.217136f, 0.217230f, 0.217324f, 0.217417f, 0.217511f,
+ 0.217604f, 0.217698f, 0.217791f, 0.217885f, 0.217979f, 0.218072f, 0.218166f, 0.218259f,
+ 0.218353f, 0.218446f, 0.218540f, 0.218633f, 0.218727f, 0.218821f, 0.218914f, 0.219008f,
+ 0.219101f, 0.219195f, 0.219288f, 0.219382f, 0.219475f, 0.219569f, 0.219662f, 0.219756f,
+ 0.219850f, 0.219943f, 0.220037f, 0.220130f, 0.220224f, 0.220317f, 0.220411f, 0.220504f,
+ 0.220598f, 0.220691f, 0.220785f, 0.220878f, 0.220972f, 0.221065f, 0.221159f, 0.221252f,
+ 0.221346f, 0.221439f, 0.221533f, 0.221626f, 0.221720f, 0.221813f, 0.221907f, 0.222000f,
+ 0.222094f, 0.222187f, 0.222281f, 0.222374f, 0.222468f, 0.222561f, 0.222654f, 0.222748f,
+ 0.222841f, 0.222935f, 0.223028f, 0.223122f, 0.223215f, 0.223309f, 0.223402f, 0.223496f,
+ 0.223589f, 0.223682f, 0.223776f, 0.223869f, 0.223963f, 0.224056f, 0.224150f, 0.224243f,
+ 0.224337f, 0.224430f, 0.224523f, 0.224617f, 0.224710f, 0.224804f, 0.224897f, 0.224991f,
+ 0.225084f, 0.225177f, 0.225271f, 0.225364f, 0.225458f, 0.225551f, 0.225644f, 0.225738f,
+ 0.225831f, 0.225925f, 0.226018f, 0.226111f, 0.226205f, 0.226298f, 0.226391f, 0.226485f,
+ 0.226578f, 0.226672f, 0.226765f, 0.226858f, 0.226952f, 0.227045f, 0.227139f, 0.227232f,
+ 0.227325f, 0.227419f, 0.227512f, 0.227605f, 0.227699f, 0.227792f, 0.227885f, 0.227979f,
+ 0.228072f, 0.228165f, 0.228259f, 0.228352f, 0.228445f, 0.228539f, 0.228632f, 0.228725f,
+ 0.228819f, 0.228912f, 0.229005f, 0.229099f, 0.229192f, 0.229285f, 0.229379f, 0.229472f,
+ 0.229565f, 0.229659f, 0.229752f, 0.229845f, 0.229939f, 0.230032f, 0.230125f, 0.230218f,
+ 0.230312f, 0.230405f, 0.230498f, 0.230592f, 0.230685f, 0.230778f, 0.230872f, 0.230965f,
+ 0.231058f, 0.231151f, 0.231245f, 0.231338f, 0.231431f, 0.231524f, 0.231618f, 0.231711f,
+ 0.231804f, 0.231898f, 0.231991f, 0.232084f, 0.232177f, 0.232271f, 0.232364f, 0.232457f,
+ 0.232550f, 0.232644f, 0.232737f, 0.232830f, 0.232923f, 0.233017f, 0.233110f, 0.233203f,
+ 0.233296f, 0.233389f, 0.233483f, 0.233576f, 0.233669f, 0.233762f, 0.233856f, 0.233949f,
+ 0.234042f, 0.234135f, 0.234228f, 0.234322f, 0.234415f, 0.234508f, 0.234601f, 0.234694f,
+ 0.234788f, 0.234881f, 0.234974f, 0.235067f, 0.235160f, 0.235254f, 0.235347f, 0.235440f,
+ 0.235533f, 0.235626f, 0.235719f, 0.235813f, 0.235906f, 0.235999f, 0.236092f, 0.236185f,
+ 0.236278f, 0.236372f, 0.236465f, 0.236558f, 0.236651f, 0.236744f, 0.236837f, 0.236930f,
+ 0.237024f, 0.237117f, 0.237210f, 0.237303f, 0.237396f, 0.237489f, 0.237582f, 0.237676f,
+ 0.237769f, 0.237862f, 0.237955f, 0.238048f, 0.238141f, 0.238234f, 0.238327f, 0.238420f,
+ 0.238514f, 0.238607f, 0.238700f, 0.238793f, 0.238886f, 0.238979f, 0.239072f, 0.239165f,
+ 0.239258f, 0.239351f, 0.239445f, 0.239538f, 0.239631f, 0.239724f, 0.239817f, 0.239910f,
+ 0.240003f, 0.240096f, 0.240189f, 0.240282f, 0.240375f, 0.240468f, 0.240561f, 0.240654f,
+ 0.240748f, 0.240841f, 0.240934f, 0.241027f, 0.241120f, 0.241213f, 0.241306f, 0.241399f,
+ 0.241492f, 0.241585f, 0.241678f, 0.241771f, 0.241864f, 0.241957f, 0.242050f, 0.242143f,
+ 0.242236f, 0.242329f, 0.242422f, 0.242515f, 0.242608f, 0.242701f, 0.242794f, 0.242887f,
+ 0.242980f, 0.243073f, 0.243166f, 0.243259f, 0.243352f, 0.243445f, 0.243538f, 0.243631f,
+ 0.243724f, 0.243817f, 0.243910f, 0.244003f, 0.244096f, 0.244189f, 0.244282f, 0.244375f,
+ 0.244468f, 0.244561f, 0.244654f, 0.244747f, 0.244840f, 0.244933f, 0.245026f, 0.245119f,
+ 0.245212f, 0.245304f, 0.245397f, 0.245490f, 0.245583f, 0.245676f, 0.245769f, 0.245862f,
+ 0.245955f, 0.246048f, 0.246141f, 0.246234f, 0.246327f, 0.246420f, 0.246513f, 0.246606f,
+ 0.246698f, 0.246791f, 0.246884f, 0.246977f, 0.247070f, 0.247163f, 0.247256f, 0.247349f,
+ 0.247442f, 0.247535f, 0.247627f, 0.247720f, 0.247813f, 0.247906f, 0.247999f, 0.248092f,
+ 0.248185f, 0.248278f, 0.248370f, 0.248463f, 0.248556f, 0.248649f, 0.248742f, 0.248835f,
+ 0.248928f, 0.249020f, 0.249113f, 0.249206f, 0.249299f, 0.249392f, 0.249485f, 0.249578f,
+ 0.249670f, 0.249763f, 0.249856f, 0.249949f, 0.250042f, 0.250135f, 0.250227f, 0.250320f,
+ 0.250413f, 0.250506f, 0.250599f, 0.250691f, 0.250784f, 0.250877f, 0.250970f, 0.251063f,
+ 0.251155f, 0.251248f, 0.251341f, 0.251434f, 0.251527f, 0.251619f, 0.251712f, 0.251805f,
+ 0.251898f, 0.251991f, 0.252083f, 0.252176f, 0.252269f, 0.252362f, 0.252454f, 0.252547f,
+ 0.252640f, 0.252733f, 0.252826f, 0.252918f, 0.253011f, 0.253104f, 0.253197f, 0.253289f,
+ 0.253382f, 0.253475f, 0.253568f, 0.253660f, 0.253753f, 0.253846f, 0.253938f, 0.254031f,
+ 0.254124f, 0.254217f, 0.254309f, 0.254402f, 0.254495f, 0.254588f, 0.254680f, 0.254773f,
+ 0.254866f, 0.254958f, 0.255051f, 0.255144f, 0.255236f, 0.255329f, 0.255422f, 0.255515f,
+ 0.255607f, 0.255700f, 0.255793f, 0.255885f, 0.255978f, 0.256071f, 0.256163f, 0.256256f,
+ 0.256349f, 0.256441f, 0.256534f, 0.256627f, 0.256719f, 0.256812f, 0.256905f, 0.256997f,
+ 0.257090f, 0.257183f, 0.257275f, 0.257368f, 0.257461f, 0.257553f, 0.257646f, 0.257738f,
+ 0.257831f, 0.257924f, 0.258016f, 0.258109f, 0.258202f, 0.258294f, 0.258387f, 0.258479f,
+ 0.258572f, 0.258665f, 0.258757f, 0.258850f, 0.258943f, 0.259035f, 0.259128f, 0.259220f,
+ 0.259313f, 0.259405f, 0.259498f, 0.259591f, 0.259683f, 0.259776f, 0.259868f, 0.259961f,
+ 0.260054f, 0.260146f, 0.260239f, 0.260331f, 0.260424f, 0.260516f, 0.260609f, 0.260702f,
+ 0.260794f, 0.260887f, 0.260979f, 0.261072f, 0.261164f, 0.261257f, 0.261349f, 0.261442f,
+ 0.261534f, 0.261627f, 0.261720f, 0.261812f, 0.261905f, 0.261997f, 0.262090f, 0.262182f,
+ 0.262275f, 0.262367f, 0.262460f, 0.262552f, 0.262645f, 0.262737f, 0.262830f, 0.262922f,
+ 0.263015f, 0.263107f, 0.263200f, 0.263292f, 0.263385f, 0.263477f, 0.263570f, 0.263662f,
+ 0.263755f, 0.263847f, 0.263940f, 0.264032f, 0.264125f, 0.264217f, 0.264309f, 0.264402f,
+ 0.264494f, 0.264587f, 0.264679f, 0.264772f, 0.264864f, 0.264957f, 0.265049f, 0.265142f,
+ 0.265234f, 0.265326f, 0.265419f, 0.265511f, 0.265604f, 0.265696f, 0.265789f, 0.265881f,
+ 0.265973f, 0.266066f, 0.266158f, 0.266251f, 0.266343f, 0.266436f, 0.266528f, 0.266620f,
+ 0.266713f, 0.266805f, 0.266898f, 0.266990f, 0.267082f, 0.267175f, 0.267267f, 0.267359f,
+ 0.267452f, 0.267544f, 0.267637f, 0.267729f, 0.267821f, 0.267914f, 0.268006f, 0.268099f,
+ 0.268191f, 0.268283f, 0.268376f, 0.268468f, 0.268560f, 0.268653f, 0.268745f, 0.268837f,
+ 0.268930f, 0.269022f, 0.269114f, 0.269207f, 0.269299f, 0.269391f, 0.269484f, 0.269576f,
+ 0.269668f, 0.269761f, 0.269853f, 0.269945f, 0.270038f, 0.270130f, 0.270222f, 0.270315f,
+ 0.270407f, 0.270499f, 0.270591f, 0.270684f, 0.270776f, 0.270868f, 0.270961f, 0.271053f,
+ 0.271145f, 0.271237f, 0.271330f, 0.271422f, 0.271514f, 0.271607f, 0.271699f, 0.271791f,
+ 0.271883f, 0.271976f, 0.272068f, 0.272160f, 0.272252f, 0.272345f, 0.272437f, 0.272529f,
+ 0.272621f, 0.272714f, 0.272806f, 0.272898f, 0.272990f, 0.273083f, 0.273175f, 0.273267f,
+ 0.273359f, 0.273451f, 0.273544f, 0.273636f, 0.273728f, 0.273820f, 0.273912f, 0.274005f,
+ 0.274097f, 0.274189f, 0.274281f, 0.274374f, 0.274466f, 0.274558f, 0.274650f, 0.274742f,
+ 0.274834f, 0.274927f, 0.275019f, 0.275111f, 0.275203f, 0.275295f, 0.275387f, 0.275480f,
+ 0.275572f, 0.275664f, 0.275756f, 0.275848f, 0.275940f, 0.276033f, 0.276125f, 0.276217f,
+ 0.276309f, 0.276401f, 0.276493f, 0.276585f, 0.276678f, 0.276770f, 0.276862f, 0.276954f,
+ 0.277046f, 0.277138f, 0.277230f, 0.277322f, 0.277415f, 0.277507f, 0.277599f, 0.277691f,
+ 0.277783f, 0.277875f, 0.277967f, 0.278059f, 0.278151f, 0.278243f, 0.278336f, 0.278428f,
+ 0.278520f, 0.278612f, 0.278704f, 0.278796f, 0.278888f, 0.278980f, 0.279072f, 0.279164f,
+ 0.279256f, 0.279348f, 0.279440f, 0.279532f, 0.279624f, 0.279717f, 0.279809f, 0.279901f,
+ 0.279993f, 0.280085f, 0.280177f, 0.280269f, 0.280361f, 0.280453f, 0.280545f, 0.280637f,
+ 0.280729f, 0.280821f, 0.280913f, 0.281005f, 0.281097f, 0.281189f, 0.281281f, 0.281373f,
+ 0.281465f, 0.281557f, 0.281649f, 0.281741f, 0.281833f, 0.281925f, 0.282017f, 0.282109f,
+ 0.282201f, 0.282293f, 0.282385f, 0.282477f, 0.282569f, 0.282661f, 0.282753f, 0.282845f,
+ 0.282937f, 0.283029f, 0.283120f, 0.283212f, 0.283304f, 0.283396f, 0.283488f, 0.283580f,
+ 0.283672f, 0.283764f, 0.283856f, 0.283948f, 0.284040f, 0.284132f, 0.284224f, 0.284316f,
+ 0.284408f, 0.284499f, 0.284591f, 0.284683f, 0.284775f, 0.284867f, 0.284959f, 0.285051f,
+ 0.285143f, 0.285235f, 0.285327f, 0.285418f, 0.285510f, 0.285602f, 0.285694f, 0.285786f,
+ 0.285878f, 0.285970f, 0.286062f, 0.286153f, 0.286245f, 0.286337f, 0.286429f, 0.286521f,
+ 0.286613f, 0.286705f, 0.286796f, 0.286888f, 0.286980f, 0.287072f, 0.287164f, 0.287256f,
+ 0.287347f, 0.287439f, 0.287531f, 0.287623f, 0.287715f, 0.287807f, 0.287898f, 0.287990f,
+ 0.288082f, 0.288174f, 0.288266f, 0.288357f, 0.288449f, 0.288541f, 0.288633f, 0.288725f,
+ 0.288816f, 0.288908f, 0.289000f, 0.289092f, 0.289184f, 0.289275f, 0.289367f, 0.289459f,
+ 0.289551f, 0.289642f, 0.289734f, 0.289826f, 0.289918f, 0.290009f, 0.290101f, 0.290193f,
+ 0.290285f, 0.290376f, 0.290468f, 0.290560f, 0.290652f, 0.290743f, 0.290835f, 0.290927f,
+ 0.291019f, 0.291110f, 0.291202f, 0.291294f, 0.291385f, 0.291477f, 0.291569f, 0.291661f,
+ 0.291752f, 0.291844f, 0.291936f, 0.292027f, 0.292119f, 0.292211f, 0.292302f, 0.292394f,
+ 0.292486f, 0.292577f, 0.292669f, 0.292761f, 0.292852f, 0.292944f, 0.293036f, 0.293128f,
+ 0.293219f, 0.293311f, 0.293402f, 0.293494f, 0.293586f, 0.293677f, 0.293769f, 0.293861f,
+ 0.293952f, 0.294044f, 0.294136f, 0.294227f, 0.294319f, 0.294410f, 0.294502f, 0.294594f,
+ 0.294685f, 0.294777f, 0.294869f, 0.294960f, 0.295052f, 0.295143f, 0.295235f, 0.295327f,
+ 0.295418f, 0.295510f, 0.295601f, 0.295693f, 0.295785f, 0.295876f, 0.295968f, 0.296059f,
+ 0.296151f, 0.296242f, 0.296334f, 0.296426f, 0.296517f, 0.296609f, 0.296700f, 0.296792f,
+ 0.296883f, 0.296975f, 0.297066f, 0.297158f, 0.297250f, 0.297341f, 0.297433f, 0.297524f,
+ 0.297616f, 0.297707f, 0.297799f, 0.297890f, 0.297982f, 0.298073f, 0.298165f, 0.298256f,
+ 0.298348f, 0.298439f, 0.298531f, 0.298622f, 0.298714f, 0.298805f, 0.298897f, 0.298988f,
+ 0.299080f, 0.299171f, 0.299263f, 0.299354f, 0.299446f, 0.299537f, 0.299629f, 0.299720f,
+ 0.299812f, 0.299903f, 0.299995f, 0.300086f, 0.300177f, 0.300269f, 0.300360f, 0.300452f,
+ 0.300543f, 0.300635f, 0.300726f, 0.300818f, 0.300909f, 0.301000f, 0.301092f, 0.301183f,
+ 0.301275f, 0.301366f, 0.301458f, 0.301549f, 0.301640f, 0.301732f, 0.301823f, 0.301915f,
+ 0.302006f, 0.302097f, 0.302189f, 0.302280f, 0.302372f, 0.302463f, 0.302554f, 0.302646f,
+ 0.302737f, 0.302828f, 0.302920f, 0.303011f, 0.303103f, 0.303194f, 0.303285f, 0.303377f,
+ 0.303468f, 0.303559f, 0.303651f, 0.303742f, 0.303833f, 0.303925f, 0.304016f, 0.304107f,
+ 0.304199f, 0.304290f, 0.304381f, 0.304473f, 0.304564f, 0.304655f, 0.304747f, 0.304838f,
+ 0.304929f, 0.305021f, 0.305112f, 0.305203f, 0.305294f, 0.305386f, 0.305477f, 0.305568f,
+ 0.305660f, 0.305751f, 0.305842f, 0.305933f, 0.306025f, 0.306116f, 0.306207f, 0.306299f,
+ 0.306390f, 0.306481f, 0.306572f, 0.306664f, 0.306755f, 0.306846f, 0.306937f, 0.307029f,
+ 0.307120f, 0.307211f, 0.307302f, 0.307394f, 0.307485f, 0.307576f, 0.307667f, 0.307758f,
+ 0.307850f, 0.307941f, 0.308032f, 0.308123f, 0.308214f, 0.308306f, 0.308397f, 0.308488f,
+ 0.308579f, 0.308670f, 0.308762f, 0.308853f, 0.308944f, 0.309035f, 0.309126f, 0.309218f,
+ 0.309309f, 0.309400f, 0.309491f, 0.309582f, 0.309673f, 0.309765f, 0.309856f, 0.309947f,
+ 0.310038f, 0.310129f, 0.310220f, 0.310311f, 0.310403f, 0.310494f, 0.310585f, 0.310676f,
+ 0.310767f, 0.310858f, 0.310949f, 0.311041f, 0.311132f, 0.311223f, 0.311314f, 0.311405f,
+ 0.311496f, 0.311587f, 0.311678f, 0.311769f, 0.311860f, 0.311952f, 0.312043f, 0.312134f,
+ 0.312225f, 0.312316f, 0.312407f, 0.312498f, 0.312589f, 0.312680f, 0.312771f, 0.312862f,
+ 0.312953f, 0.313044f, 0.313135f, 0.313227f, 0.313318f, 0.313409f, 0.313500f, 0.313591f,
+ 0.313682f, 0.313773f, 0.313864f, 0.313955f, 0.314046f, 0.314137f, 0.314228f, 0.314319f,
+ 0.314410f, 0.314501f, 0.314592f, 0.314683f, 0.314774f, 0.314865f, 0.314956f, 0.315047f,
+ 0.315138f, 0.315229f, 0.315320f, 0.315411f, 0.315502f, 0.315593f, 0.315684f, 0.315775f,
+ 0.315866f, 0.315957f, 0.316048f, 0.316139f, 0.316230f, 0.316321f, 0.316411f, 0.316502f,
+ 0.316593f, 0.316684f, 0.316775f, 0.316866f, 0.316957f, 0.317048f, 0.317139f, 0.317230f,
+ 0.317321f, 0.317412f, 0.317503f, 0.317594f, 0.317684f, 0.317775f, 0.317866f, 0.317957f,
+ 0.318048f, 0.318139f, 0.318230f, 0.318321f, 0.318412f, 0.318503f, 0.318593f, 0.318684f,
+ 0.318775f, 0.318866f, 0.318957f, 0.319048f, 0.319139f, 0.319229f, 0.319320f, 0.319411f,
+ 0.319502f, 0.319593f, 0.319684f, 0.319775f, 0.319865f, 0.319956f, 0.320047f, 0.320138f,
+ 0.320229f, 0.320320f, 0.320410f, 0.320501f, 0.320592f, 0.320683f, 0.320774f, 0.320864f,
+ 0.320955f, 0.321046f, 0.321137f, 0.321228f, 0.321318f, 0.321409f, 0.321500f, 0.321591f,
+ 0.321682f, 0.321772f, 0.321863f, 0.321954f, 0.322045f, 0.322135f, 0.322226f, 0.322317f,
+ 0.322408f, 0.322498f, 0.322589f, 0.322680f, 0.322771f, 0.322861f, 0.322952f, 0.323043f,
+ 0.323134f, 0.323224f, 0.323315f, 0.323406f, 0.323497f, 0.323587f, 0.323678f, 0.323769f,
+ 0.323859f, 0.323950f, 0.324041f, 0.324131f, 0.324222f, 0.324313f, 0.324404f, 0.324494f,
+ 0.324585f, 0.324676f, 0.324766f, 0.324857f, 0.324948f, 0.325038f, 0.325129f, 0.325220f,
+ 0.325310f, 0.325401f, 0.325492f, 0.325582f, 0.325673f, 0.325764f, 0.325854f, 0.325945f,
+ 0.326035f, 0.326126f, 0.326217f, 0.326307f, 0.326398f, 0.326489f, 0.326579f, 0.326670f,
+ 0.326760f, 0.326851f, 0.326942f, 0.327032f, 0.327123f, 0.327213f, 0.327304f, 0.327395f,
+ 0.327485f, 0.327576f, 0.327666f, 0.327757f, 0.327848f, 0.327938f, 0.328029f, 0.328119f,
+ 0.328210f, 0.328300f, 0.328391f, 0.328482f, 0.328572f, 0.328663f, 0.328753f, 0.328844f,
+ 0.328934f, 0.329025f, 0.329115f, 0.329206f, 0.329296f, 0.329387f, 0.329477f, 0.329568f,
+ 0.329658f, 0.329749f, 0.329839f, 0.329930f, 0.330020f, 0.330111f, 0.330202f, 0.330292f,
+ 0.330382f, 0.330473f, 0.330563f, 0.330654f, 0.330744f, 0.330835f, 0.330925f, 0.331016f,
+ 0.331106f, 0.331197f, 0.331287f, 0.331378f, 0.331468f, 0.331559f, 0.331649f, 0.331739f,
+ 0.331830f, 0.331920f, 0.332011f, 0.332101f, 0.332192f, 0.332282f, 0.332373f, 0.332463f,
+ 0.332553f, 0.332644f, 0.332734f, 0.332825f, 0.332915f, 0.333005f, 0.333096f, 0.333186f,
+ 0.333277f, 0.333367f, 0.333457f, 0.333548f, 0.333638f, 0.333729f, 0.333819f, 0.333909f,
+ 0.334000f, 0.334090f, 0.334180f, 0.334271f, 0.334361f, 0.334451f, 0.334542f, 0.334632f,
+ 0.334722f, 0.334813f, 0.334903f, 0.334994f, 0.335084f, 0.335174f, 0.335265f, 0.335355f,
+ 0.335445f, 0.335535f, 0.335626f, 0.335716f, 0.335806f, 0.335897f, 0.335987f, 0.336077f,
+ 0.336168f, 0.336258f, 0.336348f, 0.336438f, 0.336529f, 0.336619f, 0.336709f, 0.336800f,
+ 0.336890f, 0.336980f, 0.337070f, 0.337161f, 0.337251f, 0.337341f, 0.337431f, 0.337522f,
+ 0.337612f, 0.337702f, 0.337792f, 0.337883f, 0.337973f, 0.338063f, 0.338153f, 0.338244f,
+ 0.338334f, 0.338424f, 0.338514f, 0.338604f, 0.338695f, 0.338785f, 0.338875f, 0.338965f,
+ 0.339055f, 0.339146f, 0.339236f, 0.339326f, 0.339416f, 0.339506f, 0.339597f, 0.339687f,
+ 0.339777f, 0.339867f, 0.339957f, 0.340047f, 0.340138f, 0.340228f, 0.340318f, 0.340408f,
+ 0.340498f, 0.340588f, 0.340678f, 0.340769f, 0.340859f, 0.340949f, 0.341039f, 0.341129f,
+ 0.341219f, 0.341309f, 0.341399f, 0.341490f, 0.341580f, 0.341670f, 0.341760f, 0.341850f,
+ 0.341940f, 0.342030f, 0.342120f, 0.342210f, 0.342300f, 0.342391f, 0.342481f, 0.342571f,
+ 0.342661f, 0.342751f, 0.342841f, 0.342931f, 0.343021f, 0.343111f, 0.343201f, 0.343291f,
+ 0.343381f, 0.343471f, 0.343561f, 0.343651f, 0.343741f, 0.343831f, 0.343921f, 0.344011f,
+ 0.344101f, 0.344191f, 0.344281f, 0.344371f, 0.344461f, 0.344551f, 0.344641f, 0.344731f,
+ 0.344821f, 0.344911f, 0.345001f, 0.345091f, 0.345181f, 0.345271f, 0.345361f, 0.345451f,
+ 0.345541f, 0.345631f, 0.345721f, 0.345811f, 0.345901f, 0.345991f, 0.346081f, 0.346171f,
+ 0.346261f, 0.346351f, 0.346441f, 0.346531f, 0.346621f, 0.346711f, 0.346801f, 0.346890f,
+ 0.346980f, 0.347070f, 0.347160f, 0.347250f, 0.347340f, 0.347430f, 0.347520f, 0.347610f,
+ 0.347700f, 0.347790f, 0.347879f, 0.347969f, 0.348059f, 0.348149f, 0.348239f, 0.348329f,
+ 0.348419f, 0.348509f, 0.348598f, 0.348688f, 0.348778f, 0.348868f, 0.348958f, 0.349048f,
+ 0.349138f, 0.349227f, 0.349317f, 0.349407f, 0.349497f, 0.349587f, 0.349676f, 0.349766f,
+ 0.349856f, 0.349946f, 0.350036f, 0.350126f, 0.350215f, 0.350305f, 0.350395f, 0.350485f,
+ 0.350575f, 0.350664f, 0.350754f, 0.350844f, 0.350934f, 0.351023f, 0.351113f, 0.351203f,
+ 0.351293f, 0.351383f, 0.351472f, 0.351562f, 0.351652f, 0.351742f, 0.351831f, 0.351921f,
+ 0.352011f, 0.352100f, 0.352190f, 0.352280f, 0.352370f, 0.352459f, 0.352549f, 0.352639f,
+ 0.352729f, 0.352818f, 0.352908f, 0.352998f, 0.353087f, 0.353177f, 0.353267f, 0.353356f,
+ 0.353446f, 0.353536f, 0.353626f, 0.353715f, 0.353805f, 0.353895f, 0.353984f, 0.354074f,
+ 0.354164f, 0.354253f, 0.354343f, 0.354432f, 0.354522f, 0.354612f, 0.354701f, 0.354791f,
+ 0.354881f, 0.354970f, 0.355060f, 0.355150f, 0.355239f, 0.355329f, 0.355418f, 0.355508f,
+ 0.355598f, 0.355687f, 0.355777f, 0.355866f, 0.355956f, 0.356046f, 0.356135f, 0.356225f,
+ 0.356314f, 0.356404f, 0.356494f, 0.356583f, 0.356673f, 0.356762f, 0.356852f, 0.356941f,
+ 0.357031f, 0.357121f, 0.357210f, 0.357300f, 0.357389f, 0.357479f, 0.357568f, 0.357658f,
+ 0.357747f, 0.357837f, 0.357926f, 0.358016f, 0.358105f, 0.358195f, 0.358284f, 0.358374f,
+ 0.358463f, 0.358553f, 0.358642f, 0.358732f, 0.358821f, 0.358911f, 0.359000f, 0.359090f,
+ 0.359179f, 0.359269f, 0.359358f, 0.359448f, 0.359537f, 0.359627f, 0.359716f, 0.359806f,
+ 0.359895f, 0.359984f, 0.360074f, 0.360163f, 0.360253f, 0.360342f, 0.360432f, 0.360521f,
+ 0.360611f, 0.360700f, 0.360789f, 0.360879f, 0.360968f, 0.361058f, 0.361147f, 0.361236f,
+ 0.361326f, 0.361415f, 0.361505f, 0.361594f, 0.361683f, 0.361773f, 0.361862f, 0.361952f,
+ 0.362041f, 0.362130f, 0.362220f, 0.362309f, 0.362398f, 0.362488f, 0.362577f, 0.362666f,
+ 0.362756f, 0.362845f, 0.362934f, 0.363024f, 0.363113f, 0.363202f, 0.363292f, 0.363381f,
+ 0.363470f, 0.363560f, 0.363649f, 0.363738f, 0.363828f, 0.363917f, 0.364006f, 0.364096f,
+ 0.364185f, 0.364274f, 0.364363f, 0.364453f, 0.364542f, 0.364631f, 0.364720f, 0.364810f,
+ 0.364899f, 0.364988f, 0.365078f, 0.365167f, 0.365256f, 0.365345f, 0.365435f, 0.365524f,
+ 0.365613f, 0.365702f, 0.365791f, 0.365881f, 0.365970f, 0.366059f, 0.366148f, 0.366238f,
+ 0.366327f, 0.366416f, 0.366505f, 0.366594f, 0.366684f, 0.366773f, 0.366862f, 0.366951f,
+ 0.367040f, 0.367130f, 0.367219f, 0.367308f, 0.367397f, 0.367486f, 0.367575f, 0.367665f,
+ 0.367754f, 0.367843f, 0.367932f, 0.368021f, 0.368110f, 0.368199f, 0.368289f, 0.368378f,
+ 0.368467f, 0.368556f, 0.368645f, 0.368734f, 0.368823f, 0.368912f, 0.369002f, 0.369091f,
+ 0.369180f, 0.369269f, 0.369358f, 0.369447f, 0.369536f, 0.369625f, 0.369714f, 0.369803f,
+ 0.369892f, 0.369982f, 0.370071f, 0.370160f, 0.370249f, 0.370338f, 0.370427f, 0.370516f,
+ 0.370605f, 0.370694f, 0.370783f, 0.370872f, 0.370961f, 0.371050f, 0.371139f, 0.371228f,
+ 0.371317f, 0.371406f, 0.371495f, 0.371584f, 0.371673f, 0.371762f, 0.371851f, 0.371940f,
+ 0.372029f, 0.372118f, 0.372207f, 0.372296f, 0.372385f, 0.372474f, 0.372563f, 0.372652f,
+ 0.372741f, 0.372830f, 0.372919f, 0.373008f, 0.373097f, 0.373186f, 0.373275f, 0.373364f,
+ 0.373453f, 0.373542f, 0.373631f, 0.373719f, 0.373808f, 0.373897f, 0.373986f, 0.374075f,
+ 0.374164f, 0.374253f, 0.374342f, 0.374431f, 0.374520f, 0.374609f, 0.374697f, 0.374786f,
+ 0.374875f, 0.374964f, 0.375053f, 0.375142f, 0.375231f, 0.375320f, 0.375408f, 0.375497f,
+ 0.375586f, 0.375675f, 0.375764f, 0.375853f, 0.375942f, 0.376030f, 0.376119f, 0.376208f,
+ 0.376297f, 0.376386f, 0.376475f, 0.376563f, 0.376652f, 0.376741f, 0.376830f, 0.376919f,
+ 0.377007f, 0.377096f, 0.377185f, 0.377274f, 0.377363f, 0.377451f, 0.377540f, 0.377629f,
+ 0.377718f, 0.377806f, 0.377895f, 0.377984f, 0.378073f, 0.378162f, 0.378250f, 0.378339f,
+ 0.378428f, 0.378516f, 0.378605f, 0.378694f, 0.378783f, 0.378871f, 0.378960f, 0.379049f,
+ 0.379138f, 0.379226f, 0.379315f, 0.379404f, 0.379492f, 0.379581f, 0.379670f, 0.379759f,
+ 0.379847f, 0.379936f, 0.380025f, 0.380113f, 0.380202f, 0.380291f, 0.380379f, 0.380468f,
+ 0.380557f, 0.380645f, 0.380734f, 0.380823f, 0.380911f, 0.381000f, 0.381088f, 0.381177f,
+ 0.381266f, 0.381354f, 0.381443f, 0.381532f, 0.381620f, 0.381709f, 0.381797f, 0.381886f,
+ 0.381975f, 0.382063f, 0.382152f, 0.382241f, 0.382329f, 0.382418f, 0.382506f, 0.382595f,
+ 0.382683f, 0.382772f, 0.382861f, 0.382949f, 0.383038f, 0.383126f, 0.383215f, 0.383303f,
+ 0.383392f, 0.383480f, 0.383569f, 0.383658f, 0.383746f, 0.383835f, 0.383923f, 0.384012f,
+ 0.384100f, 0.384189f, 0.384277f, 0.384366f, 0.384454f, 0.384543f, 0.384631f, 0.384720f,
+ 0.384808f, 0.384897f, 0.384985f, 0.385074f, 0.385162f, 0.385251f, 0.385339f, 0.385428f,
+ 0.385516f, 0.385605f, 0.385693f, 0.385781f, 0.385870f, 0.385958f, 0.386047f, 0.386135f,
+ 0.386224f, 0.386312f, 0.386400f, 0.386489f, 0.386577f, 0.386666f, 0.386754f, 0.386843f,
+ 0.386931f, 0.387019f, 0.387108f, 0.387196f, 0.387285f, 0.387373f, 0.387461f, 0.387550f,
+ 0.387638f, 0.387727f, 0.387815f, 0.387903f, 0.387992f, 0.388080f, 0.388168f, 0.388257f,
+ 0.388345f, 0.388433f, 0.388522f, 0.388610f, 0.388698f, 0.388787f, 0.388875f, 0.388963f,
+ 0.389052f, 0.389140f, 0.389228f, 0.389317f, 0.389405f, 0.389493f, 0.389582f, 0.389670f,
+ 0.389758f, 0.389846f, 0.389935f, 0.390023f, 0.390111f, 0.390200f, 0.390288f, 0.390376f,
+ 0.390464f, 0.390553f, 0.390641f, 0.390729f, 0.390817f, 0.390906f, 0.390994f, 0.391082f,
+ 0.391170f, 0.391259f, 0.391347f, 0.391435f, 0.391523f, 0.391612f, 0.391700f, 0.391788f,
+ 0.391876f, 0.391964f, 0.392053f, 0.392141f, 0.392229f, 0.392317f, 0.392405f, 0.392493f,
+ 0.392582f, 0.392670f, 0.392758f, 0.392846f, 0.392934f, 0.393023f, 0.393111f, 0.393199f,
+ 0.393287f, 0.393375f, 0.393463f, 0.393551f, 0.393640f, 0.393728f, 0.393816f, 0.393904f,
+ 0.393992f, 0.394080f, 0.394168f, 0.394256f, 0.394344f, 0.394433f, 0.394521f, 0.394609f,
+ 0.394697f, 0.394785f, 0.394873f, 0.394961f, 0.395049f, 0.395137f, 0.395225f, 0.395313f,
+ 0.395401f, 0.395490f, 0.395578f, 0.395666f, 0.395754f, 0.395842f, 0.395930f, 0.396018f,
+ 0.396106f, 0.396194f, 0.396282f, 0.396370f, 0.396458f, 0.396546f, 0.396634f, 0.396722f,
+ 0.396810f, 0.396898f, 0.396986f, 0.397074f, 0.397162f, 0.397250f, 0.397338f, 0.397426f,
+ 0.397514f, 0.397602f, 0.397690f, 0.397778f, 0.397866f, 0.397954f, 0.398042f, 0.398130f,
+ 0.398218f, 0.398306f, 0.398393f, 0.398481f, 0.398569f, 0.398657f, 0.398745f, 0.398833f,
+ 0.398921f, 0.399009f, 0.399097f, 0.399185f, 0.399273f, 0.399361f, 0.399448f, 0.399536f,
+ 0.399624f, 0.399712f, 0.399800f, 0.399888f, 0.399976f, 0.400064f, 0.400151f, 0.400239f,
+ 0.400327f, 0.400415f, 0.400503f, 0.400591f, 0.400679f, 0.400766f, 0.400854f, 0.400942f,
+ 0.401030f, 0.401118f, 0.401206f, 0.401293f, 0.401381f, 0.401469f, 0.401557f, 0.401645f,
+ 0.401732f, 0.401820f, 0.401908f, 0.401996f, 0.402084f, 0.402171f, 0.402259f, 0.402347f,
+ 0.402435f, 0.402522f, 0.402610f, 0.402698f, 0.402786f, 0.402873f, 0.402961f, 0.403049f,
+ 0.403137f, 0.403224f, 0.403312f, 0.403400f, 0.403488f, 0.403575f, 0.403663f, 0.403751f,
+ 0.403838f, 0.403926f, 0.404014f, 0.404102f, 0.404189f, 0.404277f, 0.404365f, 0.404452f,
+ 0.404540f, 0.404628f, 0.404715f, 0.404803f, 0.404891f, 0.404978f, 0.405066f, 0.405154f,
+ 0.405241f, 0.405329f, 0.405417f, 0.405504f, 0.405592f, 0.405680f, 0.405767f, 0.405855f,
+ 0.405942f, 0.406030f, 0.406118f, 0.406205f, 0.406293f, 0.406380f, 0.406468f, 0.406556f,
+ 0.406643f, 0.406731f, 0.406818f, 0.406906f, 0.406994f, 0.407081f, 0.407169f, 0.407256f,
+ 0.407344f, 0.407431f, 0.407519f, 0.407606f, 0.407694f, 0.407782f, 0.407869f, 0.407957f,
+ 0.408044f, 0.408132f, 0.408219f, 0.408307f, 0.408394f, 0.408482f, 0.408569f, 0.408657f,
+ 0.408744f, 0.408832f, 0.408919f, 0.409007f, 0.409094f, 0.409182f, 0.409269f, 0.409357f,
+ 0.409444f, 0.409532f, 0.409619f, 0.409707f, 0.409794f, 0.409881f, 0.409969f, 0.410056f,
+ 0.410144f, 0.410231f, 0.410319f, 0.410406f, 0.410493f, 0.410581f, 0.410668f, 0.410756f,
+ 0.410843f, 0.410931f, 0.411018f, 0.411105f, 0.411193f, 0.411280f, 0.411368f, 0.411455f,
+ 0.411542f, 0.411630f, 0.411717f, 0.411804f, 0.411892f, 0.411979f, 0.412067f, 0.412154f,
+ 0.412241f, 0.412329f, 0.412416f, 0.412503f, 0.412591f, 0.412678f, 0.412765f, 0.412853f,
+ 0.412940f, 0.413027f, 0.413115f, 0.413202f, 0.413289f, 0.413376f, 0.413464f, 0.413551f,
+ 0.413638f, 0.413726f, 0.413813f, 0.413900f, 0.413987f, 0.414075f, 0.414162f, 0.414249f,
+ 0.414337f, 0.414424f, 0.414511f, 0.414598f, 0.414685f, 0.414773f, 0.414860f, 0.414947f,
+ 0.415034f, 0.415122f, 0.415209f, 0.415296f, 0.415383f, 0.415471f, 0.415558f, 0.415645f,
+ 0.415732f, 0.415819f, 0.415906f, 0.415994f, 0.416081f, 0.416168f, 0.416255f, 0.416342f,
+ 0.416430f, 0.416517f, 0.416604f, 0.416691f, 0.416778f, 0.416865f, 0.416952f, 0.417040f,
+ 0.417127f, 0.417214f, 0.417301f, 0.417388f, 0.417475f, 0.417562f, 0.417650f, 0.417737f,
+ 0.417824f, 0.417911f, 0.417998f, 0.418085f, 0.418172f, 0.418259f, 0.418346f, 0.418433f,
+ 0.418520f, 0.418608f, 0.418695f, 0.418782f, 0.418869f, 0.418956f, 0.419043f, 0.419130f,
+ 0.419217f, 0.419304f, 0.419391f, 0.419478f, 0.419565f, 0.419652f, 0.419739f, 0.419826f,
+ 0.419913f, 0.420000f, 0.420087f, 0.420174f, 0.420261f, 0.420348f, 0.420435f, 0.420522f,
+ 0.420609f, 0.420696f, 0.420783f, 0.420870f, 0.420957f, 0.421044f, 0.421131f, 0.421218f,
+ 0.421305f, 0.421392f, 0.421479f, 0.421566f, 0.421653f, 0.421739f, 0.421826f, 0.421913f,
+ 0.422000f, 0.422087f, 0.422174f, 0.422261f, 0.422348f, 0.422435f, 0.422522f, 0.422609f,
+ 0.422695f, 0.422782f, 0.422869f, 0.422956f, 0.423043f, 0.423130f, 0.423217f, 0.423304f,
+ 0.423390f, 0.423477f, 0.423564f, 0.423651f, 0.423738f, 0.423825f, 0.423912f, 0.423998f,
+ 0.424085f, 0.424172f, 0.424259f, 0.424346f, 0.424432f, 0.424519f, 0.424606f, 0.424693f,
+ 0.424780f, 0.424866f, 0.424953f, 0.425040f, 0.425127f, 0.425214f, 0.425300f, 0.425387f,
+ 0.425474f, 0.425561f, 0.425647f, 0.425734f, 0.425821f, 0.425908f, 0.425994f, 0.426081f,
+ 0.426168f, 0.426255f, 0.426341f, 0.426428f, 0.426515f, 0.426601f, 0.426688f, 0.426775f,
+ 0.426862f, 0.426948f, 0.427035f, 0.427122f, 0.427208f, 0.427295f, 0.427382f, 0.427468f,
+ 0.427555f, 0.427642f, 0.427728f, 0.427815f, 0.427902f, 0.427988f, 0.428075f, 0.428162f,
+ 0.428248f, 0.428335f, 0.428422f, 0.428508f, 0.428595f, 0.428681f, 0.428768f, 0.428855f,
+ 0.428941f, 0.429028f, 0.429114f, 0.429201f, 0.429288f, 0.429374f, 0.429461f, 0.429547f,
+ 0.429634f, 0.429721f, 0.429807f, 0.429894f, 0.429980f, 0.430067f, 0.430153f, 0.430240f,
+ 0.430326f, 0.430413f, 0.430500f, 0.430586f, 0.430673f, 0.430759f, 0.430846f, 0.430932f,
+ 0.431019f, 0.431105f, 0.431192f, 0.431278f, 0.431365f, 0.431451f, 0.431538f, 0.431624f,
+ 0.431711f, 0.431797f, 0.431884f, 0.431970f, 0.432057f, 0.432143f, 0.432229f, 0.432316f,
+ 0.432402f, 0.432489f, 0.432575f, 0.432662f, 0.432748f, 0.432835f, 0.432921f, 0.433007f,
+ 0.433094f, 0.433180f, 0.433267f, 0.433353f, 0.433439f, 0.433526f, 0.433612f, 0.433699f,
+ 0.433785f, 0.433871f, 0.433958f, 0.434044f, 0.434131f, 0.434217f, 0.434303f, 0.434390f,
+ 0.434476f, 0.434562f, 0.434649f, 0.434735f, 0.434821f, 0.434908f, 0.434994f, 0.435080f,
+ 0.435167f, 0.435253f, 0.435339f, 0.435426f, 0.435512f, 0.435598f, 0.435685f, 0.435771f,
+ 0.435857f, 0.435943f, 0.436030f, 0.436116f, 0.436202f, 0.436288f, 0.436375f, 0.436461f,
+ 0.436547f, 0.436633f, 0.436720f, 0.436806f, 0.436892f, 0.436978f, 0.437065f, 0.437151f,
+ 0.437237f, 0.437323f, 0.437410f, 0.437496f, 0.437582f, 0.437668f, 0.437754f, 0.437841f,
+ 0.437927f, 0.438013f, 0.438099f, 0.438185f, 0.438272f, 0.438358f, 0.438444f, 0.438530f,
+ 0.438616f, 0.438702f, 0.438789f, 0.438875f, 0.438961f, 0.439047f, 0.439133f, 0.439219f,
+ 0.439305f, 0.439392f, 0.439478f, 0.439564f, 0.439650f, 0.439736f, 0.439822f, 0.439908f,
+ 0.439994f, 0.440080f, 0.440166f, 0.440253f, 0.440339f, 0.440425f, 0.440511f, 0.440597f,
+ 0.440683f, 0.440769f, 0.440855f, 0.440941f, 0.441027f, 0.441113f, 0.441199f, 0.441285f,
+ 0.441371f, 0.441457f, 0.441543f, 0.441629f, 0.441715f, 0.441801f, 0.441887f, 0.441973f,
+ 0.442059f, 0.442145f, 0.442231f, 0.442317f, 0.442403f, 0.442489f, 0.442575f, 0.442661f,
+ 0.442747f, 0.442833f, 0.442919f, 0.443005f, 0.443091f, 0.443177f, 0.443263f, 0.443349f,
+ 0.443435f, 0.443521f, 0.443607f, 0.443693f, 0.443779f, 0.443864f, 0.443950f, 0.444036f,
+ 0.444122f, 0.444208f, 0.444294f, 0.444380f, 0.444466f, 0.444552f, 0.444637f, 0.444723f,
+ 0.444809f, 0.444895f, 0.444981f, 0.445067f, 0.445153f, 0.445239f, 0.445324f, 0.445410f,
+ 0.445496f, 0.445582f, 0.445668f, 0.445754f, 0.445839f, 0.445925f, 0.446011f, 0.446097f,
+ 0.446183f, 0.446268f, 0.446354f, 0.446440f, 0.446526f, 0.446612f, 0.446697f, 0.446783f,
+ 0.446869f, 0.446955f, 0.447040f, 0.447126f, 0.447212f, 0.447298f, 0.447383f, 0.447469f,
+ 0.447555f, 0.447641f, 0.447726f, 0.447812f, 0.447898f, 0.447983f, 0.448069f, 0.448155f,
+ 0.448241f, 0.448326f, 0.448412f, 0.448498f, 0.448583f, 0.448669f, 0.448755f, 0.448840f,
+ 0.448926f, 0.449012f, 0.449097f, 0.449183f, 0.449269f, 0.449354f, 0.449440f, 0.449526f,
+ 0.449611f, 0.449697f, 0.449783f, 0.449868f, 0.449954f, 0.450039f, 0.450125f, 0.450211f,
+ 0.450296f, 0.450382f, 0.450467f, 0.450553f, 0.450639f, 0.450724f, 0.450810f, 0.450895f,
+ 0.450981f, 0.451067f, 0.451152f, 0.451238f, 0.451323f, 0.451409f, 0.451494f, 0.451580f,
+ 0.451665f, 0.451751f, 0.451836f, 0.451922f, 0.452008f, 0.452093f, 0.452179f, 0.452264f,
+ 0.452350f, 0.452435f, 0.452521f, 0.452606f, 0.452692f, 0.452777f, 0.452863f, 0.452948f,
+ 0.453033f, 0.453119f, 0.453204f, 0.453290f, 0.453375f, 0.453461f, 0.453546f, 0.453632f,
+ 0.453717f, 0.453803f, 0.453888f, 0.453973f, 0.454059f, 0.454144f, 0.454230f, 0.454315f,
+ 0.454400f, 0.454486f, 0.454571f, 0.454657f, 0.454742f, 0.454827f, 0.454913f, 0.454998f,
+ 0.455084f, 0.455169f, 0.455254f, 0.455340f, 0.455425f, 0.455510f, 0.455596f, 0.455681f,
+ 0.455766f, 0.455852f, 0.455937f, 0.456022f, 0.456108f, 0.456193f, 0.456278f, 0.456364f,
+ 0.456449f, 0.456534f, 0.456620f, 0.456705f, 0.456790f, 0.456875f, 0.456961f, 0.457046f,
+ 0.457131f, 0.457217f, 0.457302f, 0.457387f, 0.457472f, 0.457558f, 0.457643f, 0.457728f,
+ 0.457813f, 0.457899f, 0.457984f, 0.458069f, 0.458154f, 0.458239f, 0.458325f, 0.458410f,
+ 0.458495f, 0.458580f, 0.458665f, 0.458751f, 0.458836f, 0.458921f, 0.459006f, 0.459091f,
+ 0.459177f, 0.459262f, 0.459347f, 0.459432f, 0.459517f, 0.459602f, 0.459687f, 0.459773f,
+ 0.459858f, 0.459943f, 0.460028f, 0.460113f, 0.460198f, 0.460283f, 0.460369f, 0.460454f,
+ 0.460539f, 0.460624f, 0.460709f, 0.460794f, 0.460879f, 0.460964f, 0.461049f, 0.461134f,
+ 0.461219f, 0.461304f, 0.461390f, 0.461475f, 0.461560f, 0.461645f, 0.461730f, 0.461815f,
+ 0.461900f, 0.461985f, 0.462070f, 0.462155f, 0.462240f, 0.462325f, 0.462410f, 0.462495f,
+ 0.462580f, 0.462665f, 0.462750f, 0.462835f, 0.462920f, 0.463005f, 0.463090f, 0.463175f,
+ 0.463260f, 0.463345f, 0.463430f, 0.463515f, 0.463600f, 0.463685f, 0.463769f, 0.463854f,
+ 0.463939f, 0.464024f, 0.464109f, 0.464194f, 0.464279f, 0.464364f, 0.464449f, 0.464534f,
+ 0.464619f, 0.464704f, 0.464788f, 0.464873f, 0.464958f, 0.465043f, 0.465128f, 0.465213f,
+ 0.465298f, 0.465383f, 0.465467f, 0.465552f, 0.465637f, 0.465722f, 0.465807f, 0.465892f,
+ 0.465977f, 0.466061f, 0.466146f, 0.466231f, 0.466316f, 0.466401f, 0.466485f, 0.466570f,
+ 0.466655f, 0.466740f, 0.466825f, 0.466909f, 0.466994f, 0.467079f, 0.467164f, 0.467248f,
+ 0.467333f, 0.467418f, 0.467503f, 0.467587f, 0.467672f, 0.467757f, 0.467842f, 0.467926f,
+ 0.468011f, 0.468096f, 0.468181f, 0.468265f, 0.468350f, 0.468435f, 0.468519f, 0.468604f,
+ 0.468689f, 0.468774f, 0.468858f, 0.468943f, 0.469028f, 0.469112f, 0.469197f, 0.469282f,
+ 0.469366f, 0.469451f, 0.469536f, 0.469620f, 0.469705f, 0.469789f, 0.469874f, 0.469959f,
+ 0.470043f, 0.470128f, 0.470213f, 0.470297f, 0.470382f, 0.470466f, 0.470551f, 0.470636f,
+ 0.470720f, 0.470805f, 0.470889f, 0.470974f, 0.471058f, 0.471143f, 0.471228f, 0.471312f,
+ 0.471397f, 0.471481f, 0.471566f, 0.471650f, 0.471735f, 0.471819f, 0.471904f, 0.471988f,
+ 0.472073f, 0.472158f, 0.472242f, 0.472327f, 0.472411f, 0.472496f, 0.472580f, 0.472665f,
+ 0.472749f, 0.472834f, 0.472918f, 0.473002f, 0.473087f, 0.473171f, 0.473256f, 0.473340f,
+ 0.473425f, 0.473509f, 0.473594f, 0.473678f, 0.473763f, 0.473847f, 0.473931f, 0.474016f,
+ 0.474100f, 0.474185f, 0.474269f, 0.474353f, 0.474438f, 0.474522f, 0.474607f, 0.474691f,
+ 0.474775f, 0.474860f, 0.474944f, 0.475029f, 0.475113f, 0.475197f, 0.475282f, 0.475366f,
+ 0.475450f, 0.475535f, 0.475619f, 0.475703f, 0.475788f, 0.475872f, 0.475956f, 0.476041f,
+ 0.476125f, 0.476209f, 0.476294f, 0.476378f, 0.476462f, 0.476546f, 0.476631f, 0.476715f,
+ 0.476799f, 0.476884f, 0.476968f, 0.477052f, 0.477136f, 0.477221f, 0.477305f, 0.477389f,
+ 0.477473f, 0.477558f, 0.477642f, 0.477726f, 0.477810f, 0.477894f, 0.477979f, 0.478063f,
+ 0.478147f, 0.478231f, 0.478315f, 0.478400f, 0.478484f, 0.478568f, 0.478652f, 0.478736f,
+ 0.478821f, 0.478905f, 0.478989f, 0.479073f, 0.479157f, 0.479241f, 0.479325f, 0.479410f,
+ 0.479494f, 0.479578f, 0.479662f, 0.479746f, 0.479830f, 0.479914f, 0.479998f, 0.480083f,
+ 0.480167f, 0.480251f, 0.480335f, 0.480419f, 0.480503f, 0.480587f, 0.480671f, 0.480755f,
+ 0.480839f, 0.480923f, 0.481007f, 0.481091f, 0.481176f, 0.481260f, 0.481344f, 0.481428f,
+ 0.481512f, 0.481596f, 0.481680f, 0.481764f, 0.481848f, 0.481932f, 0.482016f, 0.482100f,
+ 0.482184f, 0.482268f, 0.482352f, 0.482436f, 0.482520f, 0.482604f, 0.482688f, 0.482772f,
+ 0.482856f, 0.482940f, 0.483023f, 0.483107f, 0.483191f, 0.483275f, 0.483359f, 0.483443f,
+ 0.483527f, 0.483611f, 0.483695f, 0.483779f, 0.483863f, 0.483947f, 0.484031f, 0.484114f,
+ 0.484198f, 0.484282f, 0.484366f, 0.484450f, 0.484534f, 0.484618f, 0.484702f, 0.484785f,
+ 0.484869f, 0.484953f, 0.485037f, 0.485121f, 0.485205f, 0.485288f, 0.485372f, 0.485456f,
+ 0.485540f, 0.485624f, 0.485708f, 0.485791f, 0.485875f, 0.485959f, 0.486043f, 0.486126f,
+ 0.486210f, 0.486294f, 0.486378f, 0.486462f, 0.486545f, 0.486629f, 0.486713f, 0.486797f,
+ 0.486880f, 0.486964f, 0.487048f, 0.487132f, 0.487215f, 0.487299f, 0.487383f, 0.487466f,
+ 0.487550f, 0.487634f, 0.487718f, 0.487801f, 0.487885f, 0.487969f, 0.488052f, 0.488136f,
+ 0.488220f, 0.488303f, 0.488387f, 0.488471f, 0.488554f, 0.488638f, 0.488722f, 0.488805f,
+ 0.488889f, 0.488973f, 0.489056f, 0.489140f, 0.489223f, 0.489307f, 0.489391f, 0.489474f,
+ 0.489558f, 0.489641f, 0.489725f, 0.489809f, 0.489892f, 0.489976f, 0.490059f, 0.490143f,
+ 0.490226f, 0.490310f, 0.490394f, 0.490477f, 0.490561f, 0.490644f, 0.490728f, 0.490811f,
+ 0.490895f, 0.490978f, 0.491062f, 0.491145f, 0.491229f, 0.491312f, 0.491396f, 0.491479f,
+ 0.491563f, 0.491646f, 0.491730f, 0.491813f, 0.491897f, 0.491980f, 0.492064f, 0.492147f,
+ 0.492231f, 0.492314f, 0.492398f, 0.492481f, 0.492564f, 0.492648f, 0.492731f, 0.492815f,
+ 0.492898f, 0.492982f, 0.493065f, 0.493148f, 0.493232f, 0.493315f, 0.493399f, 0.493482f,
+ 0.493565f, 0.493649f, 0.493732f, 0.493816f, 0.493899f, 0.493982f, 0.494066f, 0.494149f,
+ 0.494232f, 0.494316f, 0.494399f, 0.494482f, 0.494566f, 0.494649f, 0.494732f, 0.494816f,
+ 0.494899f, 0.494982f, 0.495066f, 0.495149f, 0.495232f, 0.495315f, 0.495399f, 0.495482f,
+ 0.495565f, 0.495649f, 0.495732f, 0.495815f, 0.495898f, 0.495982f, 0.496065f, 0.496148f,
+ 0.496231f, 0.496315f, 0.496398f, 0.496481f, 0.496564f, 0.496647f, 0.496731f, 0.496814f,
+ 0.496897f, 0.496980f, 0.497063f, 0.497147f, 0.497230f, 0.497313f, 0.497396f, 0.497479f,
+ 0.497562f, 0.497646f, 0.497729f, 0.497812f, 0.497895f, 0.497978f, 0.498061f, 0.498145f,
+ 0.498228f, 0.498311f, 0.498394f, 0.498477f, 0.498560f, 0.498643f, 0.498726f, 0.498809f,
+ 0.498893f, 0.498976f, 0.499059f, 0.499142f, 0.499225f, 0.499308f, 0.499391f, 0.499474f,
+ 0.499557f, 0.499640f, 0.499723f, 0.499806f, 0.499889f, 0.499972f, 0.500055f, 0.500138f,
+ 0.500221f, 0.500304f, 0.500387f, 0.500470f, 0.500553f, 0.500636f, 0.500719f, 0.500802f,
+ 0.500885f, 0.500968f, 0.501051f, 0.501134f, 0.501217f, 0.501300f, 0.501383f, 0.501466f,
+ 0.501549f, 0.501632f, 0.501715f, 0.501798f, 0.501881f, 0.501964f, 0.502047f, 0.502130f,
+ 0.502212f, 0.502295f, 0.502378f, 0.502461f, 0.502544f, 0.502627f, 0.502710f, 0.502793f,
+ 0.502876f, 0.502958f, 0.503041f, 0.503124f, 0.503207f, 0.503290f, 0.503373f, 0.503456f,
+ 0.503538f, 0.503621f, 0.503704f, 0.503787f, 0.503870f, 0.503953f, 0.504035f, 0.504118f,
+ 0.504201f, 0.504284f, 0.504366f, 0.504449f, 0.504532f, 0.504615f, 0.504698f, 0.504780f,
+ 0.504863f, 0.504946f, 0.505029f, 0.505111f, 0.505194f, 0.505277f, 0.505360f, 0.505442f,
+ 0.505525f, 0.505608f, 0.505690f, 0.505773f, 0.505856f, 0.505939f, 0.506021f, 0.506104f,
+ 0.506187f, 0.506269f, 0.506352f, 0.506435f, 0.506517f, 0.506600f, 0.506683f, 0.506765f,
+ 0.506848f, 0.506931f, 0.507013f, 0.507096f, 0.507179f, 0.507261f, 0.507344f, 0.507426f,
+ 0.507509f, 0.507592f, 0.507674f, 0.507757f, 0.507839f, 0.507922f, 0.508005f, 0.508087f,
+ 0.508170f, 0.508252f, 0.508335f, 0.508417f, 0.508500f, 0.508583f, 0.508665f, 0.508748f,
+ 0.508830f, 0.508913f, 0.508995f, 0.509078f, 0.509160f, 0.509243f, 0.509325f, 0.509408f,
+ 0.509490f, 0.509573f, 0.509655f, 0.509738f, 0.509820f, 0.509903f, 0.509985f, 0.510068f,
+ 0.510150f, 0.510233f, 0.510315f, 0.510397f, 0.510480f, 0.510562f, 0.510645f, 0.510727f,
+ 0.510810f, 0.510892f, 0.510974f, 0.511057f, 0.511139f, 0.511222f, 0.511304f, 0.511386f,
+ 0.511469f, 0.511551f, 0.511634f, 0.511716f, 0.511798f, 0.511881f, 0.511963f, 0.512045f,
+ 0.512128f, 0.512210f, 0.512292f, 0.512375f, 0.512457f, 0.512539f, 0.512622f, 0.512704f,
+ 0.512786f, 0.512869f, 0.512951f, 0.513033f, 0.513116f, 0.513198f, 0.513280f, 0.513362f,
+ 0.513445f, 0.513527f, 0.513609f, 0.513692f, 0.513774f, 0.513856f, 0.513938f, 0.514021f,
+ 0.514103f, 0.514185f, 0.514267f, 0.514349f, 0.514432f, 0.514514f, 0.514596f, 0.514678f,
+ 0.514760f, 0.514843f, 0.514925f, 0.515007f, 0.515089f, 0.515171f, 0.515254f, 0.515336f,
+ 0.515418f, 0.515500f, 0.515582f, 0.515664f, 0.515746f, 0.515829f, 0.515911f, 0.515993f,
+ 0.516075f, 0.516157f, 0.516239f, 0.516321f, 0.516403f, 0.516486f, 0.516568f, 0.516650f,
+ 0.516732f, 0.516814f, 0.516896f, 0.516978f, 0.517060f, 0.517142f, 0.517224f, 0.517306f,
+ 0.517388f, 0.517470f, 0.517552f, 0.517634f, 0.517716f, 0.517798f, 0.517880f, 0.517963f,
+ 0.518045f, 0.518126f, 0.518209f, 0.518291f, 0.518372f, 0.518454f, 0.518536f, 0.518618f,
+ 0.518700f, 0.518782f, 0.518864f, 0.518946f, 0.519028f, 0.519110f, 0.519192f, 0.519274f,
+ 0.519356f, 0.519438f, 0.519520f, 0.519602f, 0.519684f, 0.519766f, 0.519848f, 0.519929f,
+ 0.520011f, 0.520093f, 0.520175f, 0.520257f, 0.520339f, 0.520421f, 0.520503f, 0.520584f,
+ 0.520666f, 0.520748f, 0.520830f, 0.520912f, 0.520994f, 0.521075f, 0.521157f, 0.521239f,
+ 0.521321f, 0.521403f, 0.521485f, 0.521566f, 0.521648f, 0.521730f, 0.521812f, 0.521894f,
+ 0.521975f, 0.522057f, 0.522139f, 0.522221f, 0.522302f, 0.522384f, 0.522466f, 0.522548f,
+ 0.522629f, 0.522711f, 0.522793f, 0.522875f, 0.522956f, 0.523038f, 0.523120f, 0.523201f,
+ 0.523283f, 0.523365f, 0.523447f, 0.523528f, 0.523610f, 0.523692f, 0.523773f, 0.523855f,
+ 0.523937f, 0.524018f, 0.524100f, 0.524181f, 0.524263f, 0.524345f, 0.524426f, 0.524508f,
+ 0.524590f, 0.524671f, 0.524753f, 0.524835f, 0.524916f, 0.524998f, 0.525079f, 0.525161f,
+ 0.525243f, 0.525324f, 0.525406f, 0.525487f, 0.525569f, 0.525650f, 0.525732f, 0.525813f,
+ 0.525895f, 0.525977f, 0.526058f, 0.526140f, 0.526221f, 0.526303f, 0.526384f, 0.526466f,
+ 0.526547f, 0.526629f, 0.526710f, 0.526792f, 0.526873f, 0.526955f, 0.527036f, 0.527118f,
+ 0.527199f, 0.527281f, 0.527362f, 0.527444f, 0.527525f, 0.527606f, 0.527688f, 0.527769f,
+ 0.527851f, 0.527932f, 0.528014f, 0.528095f, 0.528176f, 0.528258f, 0.528339f, 0.528421f,
+ 0.528502f, 0.528583f, 0.528665f, 0.528746f, 0.528828f, 0.528909f, 0.528990f, 0.529072f,
+ 0.529153f, 0.529234f, 0.529316f, 0.529397f, 0.529478f, 0.529560f, 0.529641f, 0.529722f,
+ 0.529804f, 0.529885f, 0.529966f, 0.530048f, 0.530129f, 0.530210f, 0.530291f, 0.530373f,
+ 0.530454f, 0.530535f, 0.530617f, 0.530698f, 0.530779f, 0.530860f, 0.530942f, 0.531023f,
+ 0.531104f, 0.531185f, 0.531266f, 0.531348f, 0.531429f, 0.531510f, 0.531591f, 0.531673f,
+ 0.531754f, 0.531835f, 0.531916f, 0.531997f, 0.532078f, 0.532160f, 0.532241f, 0.532322f,
+ 0.532403f, 0.532484f, 0.532565f, 0.532647f, 0.532728f, 0.532809f, 0.532890f, 0.532971f,
+ 0.533052f, 0.533133f, 0.533214f, 0.533296f, 0.533377f, 0.533458f, 0.533539f, 0.533620f,
+ 0.533701f, 0.533782f, 0.533863f, 0.533944f, 0.534025f, 0.534106f, 0.534187f, 0.534268f,
+ 0.534349f, 0.534431f, 0.534512f, 0.534593f, 0.534674f, 0.534755f, 0.534836f, 0.534917f,
+ 0.534998f, 0.535079f, 0.535160f, 0.535241f, 0.535322f, 0.535403f, 0.535484f, 0.535564f,
+ 0.535645f, 0.535726f, 0.535807f, 0.535888f, 0.535969f, 0.536050f, 0.536131f, 0.536212f,
+ 0.536293f, 0.536374f, 0.536455f, 0.536536f, 0.536617f, 0.536698f, 0.536778f, 0.536859f,
+ 0.536940f, 0.537021f, 0.537102f, 0.537183f, 0.537264f, 0.537345f, 0.537425f, 0.537506f,
+ 0.537587f, 0.537668f, 0.537749f, 0.537830f, 0.537910f, 0.537991f, 0.538072f, 0.538153f,
+ 0.538234f, 0.538314f, 0.538395f, 0.538476f, 0.538557f, 0.538638f, 0.538718f, 0.538799f,
+ 0.538880f, 0.538961f, 0.539041f, 0.539122f, 0.539203f, 0.539284f, 0.539364f, 0.539445f,
+ 0.539526f, 0.539607f, 0.539687f, 0.539768f, 0.539849f, 0.539929f, 0.540010f, 0.540091f,
+ 0.540171f, 0.540252f, 0.540333f, 0.540413f, 0.540494f, 0.540575f, 0.540655f, 0.540736f,
+ 0.540817f, 0.540897f, 0.540978f, 0.541059f, 0.541139f, 0.541220f, 0.541301f, 0.541381f,
+ 0.541462f, 0.541542f, 0.541623f, 0.541704f, 0.541784f, 0.541865f, 0.541945f, 0.542026f,
+ 0.542106f, 0.542187f, 0.542268f, 0.542348f, 0.542429f, 0.542509f, 0.542590f, 0.542670f,
+ 0.542751f, 0.542831f, 0.542912f, 0.542992f, 0.543073f, 0.543153f, 0.543234f, 0.543314f,
+ 0.543395f, 0.543475f, 0.543556f, 0.543636f, 0.543717f, 0.543797f, 0.543878f, 0.543958f,
+ 0.544039f, 0.544119f, 0.544199f, 0.544280f, 0.544360f, 0.544441f, 0.544521f, 0.544602f,
+ 0.544682f, 0.544762f, 0.544843f, 0.544923f, 0.545003f, 0.545084f, 0.545164f, 0.545245f,
+ 0.545325f, 0.545405f, 0.545486f, 0.545566f, 0.545646f, 0.545727f, 0.545807f, 0.545887f,
+ 0.545968f, 0.546048f, 0.546128f, 0.546209f, 0.546289f, 0.546369f, 0.546450f, 0.546530f,
+ 0.546610f, 0.546690f, 0.546771f, 0.546851f, 0.546931f, 0.547011f, 0.547092f, 0.547172f,
+ 0.547252f, 0.547333f, 0.547413f, 0.547493f, 0.547573f, 0.547653f, 0.547734f, 0.547814f,
+ 0.547894f, 0.547974f, 0.548054f, 0.548135f, 0.548215f, 0.548295f, 0.548375f, 0.548455f,
+ 0.548536f, 0.548616f, 0.548696f, 0.548776f, 0.548856f, 0.548936f, 0.549016f, 0.549097f,
+ 0.549177f, 0.549257f, 0.549337f, 0.549417f, 0.549497f, 0.549577f, 0.549657f, 0.549737f,
+ 0.549818f, 0.549898f, 0.549978f, 0.550058f, 0.550138f, 0.550218f, 0.550298f, 0.550378f,
+ 0.550458f, 0.550538f, 0.550618f, 0.550698f, 0.550778f, 0.550858f, 0.550938f, 0.551018f,
+ 0.551098f, 0.551178f, 0.551258f, 0.551338f, 0.551418f, 0.551498f, 0.551578f, 0.551658f,
+ 0.551738f, 0.551818f, 0.551898f, 0.551978f, 0.552058f, 0.552138f, 0.552218f, 0.552298f,
+ 0.552378f, 0.552457f, 0.552537f, 0.552617f, 0.552697f, 0.552777f, 0.552857f, 0.552937f,
+ 0.553017f, 0.553097f, 0.553176f, 0.553256f, 0.553336f, 0.553416f, 0.553496f, 0.553576f,
+ 0.553656f, 0.553735f, 0.553815f, 0.553895f, 0.553975f, 0.554055f, 0.554134f, 0.554214f,
+ 0.554294f, 0.554374f, 0.554454f, 0.554533f, 0.554613f, 0.554693f, 0.554773f, 0.554853f,
+ 0.554932f, 0.555012f, 0.555092f, 0.555172f, 0.555251f, 0.555331f, 0.555411f, 0.555490f,
+ 0.555570f, 0.555650f, 0.555730f, 0.555809f, 0.555889f, 0.555969f, 0.556048f, 0.556128f,
+ 0.556208f, 0.556287f, 0.556367f, 0.556447f, 0.556526f, 0.556606f, 0.556686f, 0.556765f,
+ 0.556845f, 0.556925f, 0.557004f, 0.557084f, 0.557164f, 0.557243f, 0.557323f, 0.557402f,
+ 0.557482f, 0.557562f, 0.557641f, 0.557721f, 0.557800f, 0.557880f, 0.557959f, 0.558039f,
+ 0.558119f, 0.558198f, 0.558278f, 0.558357f, 0.558437f, 0.558516f, 0.558596f, 0.558675f,
+ 0.558755f, 0.558834f, 0.558914f, 0.558993f, 0.559073f, 0.559152f, 0.559232f, 0.559311f,
+ 0.559391f, 0.559470f, 0.559550f, 0.559629f, 0.559709f, 0.559788f, 0.559867f, 0.559947f,
+ 0.560026f, 0.560106f, 0.560185f, 0.560265f, 0.560344f, 0.560423f, 0.560503f, 0.560582f,
+ 0.560662f, 0.560741f, 0.560820f, 0.560900f, 0.560979f, 0.561058f, 0.561138f, 0.561217f,
+ 0.561297f, 0.561376f, 0.561455f, 0.561535f, 0.561614f, 0.561693f, 0.561773f, 0.561852f,
+ 0.561931f, 0.562010f, 0.562090f, 0.562169f, 0.562248f, 0.562328f, 0.562407f, 0.562486f,
+ 0.562565f, 0.562645f, 0.562724f, 0.562803f, 0.562882f, 0.562962f, 0.563041f, 0.563120f,
+ 0.563199f, 0.563279f, 0.563358f, 0.563437f, 0.563516f, 0.563595f, 0.563675f, 0.563754f,
+ 0.563833f, 0.563912f, 0.563991f, 0.564070f, 0.564150f, 0.564229f, 0.564308f, 0.564387f,
+ 0.564466f, 0.564545f, 0.564624f, 0.564704f, 0.564783f, 0.564862f, 0.564941f, 0.565020f,
+ 0.565099f, 0.565178f, 0.565257f, 0.565336f, 0.565416f, 0.565495f, 0.565574f, 0.565653f,
+ 0.565732f, 0.565811f, 0.565890f, 0.565969f, 0.566048f, 0.566127f, 0.566206f, 0.566285f,
+ 0.566364f, 0.566443f, 0.566522f, 0.566601f, 0.566680f, 0.566759f, 0.566838f, 0.566917f,
+ 0.566996f, 0.567075f, 0.567154f, 0.567233f, 0.567312f, 0.567391f, 0.567470f, 0.567549f,
+ 0.567628f, 0.567707f, 0.567786f, 0.567864f, 0.567943f, 0.568022f, 0.568101f, 0.568180f,
+ 0.568259f, 0.568338f, 0.568417f, 0.568496f, 0.568574f, 0.568653f, 0.568732f, 0.568811f,
+ 0.568890f, 0.568969f, 0.569048f, 0.569126f, 0.569205f, 0.569284f, 0.569363f, 0.569442f,
+ 0.569521f, 0.569599f, 0.569678f, 0.569757f, 0.569836f, 0.569914f, 0.569993f, 0.570072f,
+ 0.570151f, 0.570230f, 0.570308f, 0.570387f, 0.570466f, 0.570545f, 0.570623f, 0.570702f,
+ 0.570781f, 0.570859f, 0.570938f, 0.571017f, 0.571096f, 0.571174f, 0.571253f, 0.571332f,
+ 0.571410f, 0.571489f, 0.571568f, 0.571646f, 0.571725f, 0.571804f, 0.571882f, 0.571961f,
+ 0.572040f, 0.572118f, 0.572197f, 0.572276f, 0.572354f, 0.572433f, 0.572511f, 0.572590f,
+ 0.572669f, 0.572747f, 0.572826f, 0.572904f, 0.572983f, 0.573061f, 0.573140f, 0.573219f,
+ 0.573297f, 0.573376f, 0.573454f, 0.573533f, 0.573611f, 0.573690f, 0.573768f, 0.573847f,
+ 0.573925f, 0.574004f, 0.574082f, 0.574161f, 0.574239f, 0.574318f, 0.574396f, 0.574475f,
+ 0.574553f, 0.574632f, 0.574710f, 0.574789f, 0.574867f, 0.574946f, 0.575024f, 0.575103f,
+ 0.575181f, 0.575259f, 0.575338f, 0.575416f, 0.575495f, 0.575573f, 0.575651f, 0.575730f,
+ 0.575808f, 0.575887f, 0.575965f, 0.576043f, 0.576122f, 0.576200f, 0.576278f, 0.576357f,
+ 0.576435f, 0.576513f, 0.576592f, 0.576670f, 0.576748f, 0.576827f, 0.576905f, 0.576983f,
+ 0.577062f, 0.577140f, 0.577218f, 0.577297f, 0.577375f, 0.577453f, 0.577531f, 0.577610f,
+ 0.577688f, 0.577766f, 0.577844f, 0.577923f, 0.578001f, 0.578079f, 0.578157f, 0.578236f,
+ 0.578314f, 0.578392f, 0.578470f, 0.578548f, 0.578627f, 0.578705f, 0.578783f, 0.578861f,
+ 0.578939f, 0.579018f, 0.579096f, 0.579174f, 0.579252f, 0.579330f, 0.579408f, 0.579486f,
+ 0.579565f, 0.579643f, 0.579721f, 0.579799f, 0.579877f, 0.579955f, 0.580033f, 0.580111f,
+ 0.580189f, 0.580267f, 0.580346f, 0.580424f, 0.580502f, 0.580580f, 0.580658f, 0.580736f,
+ 0.580814f, 0.580892f, 0.580970f, 0.581048f, 0.581126f, 0.581204f, 0.581282f, 0.581360f,
+ 0.581438f, 0.581516f, 0.581594f, 0.581672f, 0.581750f, 0.581828f, 0.581906f, 0.581984f,
+ 0.582062f, 0.582140f, 0.582218f, 0.582296f, 0.582374f, 0.582452f, 0.582530f, 0.582608f,
+ 0.582685f, 0.582763f, 0.582841f, 0.582919f, 0.582997f, 0.583075f, 0.583153f, 0.583231f,
+ 0.583309f, 0.583387f, 0.583464f, 0.583542f, 0.583620f, 0.583698f, 0.583776f, 0.583854f,
+ 0.583931f, 0.584009f, 0.584087f, 0.584165f, 0.584243f, 0.584321f, 0.584398f, 0.584476f,
+ 0.584554f, 0.584632f, 0.584710f, 0.584787f, 0.584865f, 0.584943f, 0.585021f, 0.585098f,
+ 0.585176f, 0.585254f, 0.585332f, 0.585409f, 0.585487f, 0.585565f, 0.585642f, 0.585720f,
+ 0.585798f, 0.585876f, 0.585953f, 0.586031f, 0.586109f, 0.586186f, 0.586264f, 0.586342f,
+ 0.586419f, 0.586497f, 0.586575f, 0.586652f, 0.586730f, 0.586808f, 0.586885f, 0.586963f,
+ 0.587040f, 0.587118f, 0.587196f, 0.587273f, 0.587351f, 0.587428f, 0.587506f, 0.587584f,
+ 0.587661f, 0.587739f, 0.587816f, 0.587894f, 0.587971f, 0.588049f, 0.588126f, 0.588204f,
+ 0.588282f, 0.588359f, 0.588437f, 0.588514f, 0.588592f, 0.588669f, 0.588747f, 0.588824f,
+ 0.588902f, 0.588979f, 0.589057f, 0.589134f, 0.589212f, 0.589289f, 0.589366f, 0.589444f,
+ 0.589521f, 0.589599f, 0.589676f, 0.589754f, 0.589831f, 0.589908f, 0.589986f, 0.590063f,
+ 0.590141f, 0.590218f, 0.590295f, 0.590373f, 0.590450f, 0.590528f, 0.590605f, 0.590682f,
+ 0.590760f, 0.590837f, 0.590914f, 0.590992f, 0.591069f, 0.591146f, 0.591224f, 0.591301f,
+ 0.591378f, 0.591456f, 0.591533f, 0.591610f, 0.591688f, 0.591765f, 0.591842f, 0.591919f,
+ 0.591997f, 0.592074f, 0.592151f, 0.592228f, 0.592306f, 0.592383f, 0.592460f, 0.592537f,
+ 0.592615f, 0.592692f, 0.592769f, 0.592846f, 0.592924f, 0.593001f, 0.593078f, 0.593155f,
+ 0.593232f, 0.593309f, 0.593387f, 0.593464f, 0.593541f, 0.593618f, 0.593695f, 0.593772f,
+ 0.593850f, 0.593927f, 0.594004f, 0.594081f, 0.594158f, 0.594235f, 0.594312f, 0.594389f,
+ 0.594467f, 0.594544f, 0.594621f, 0.594698f, 0.594775f, 0.594852f, 0.594929f, 0.595006f,
+ 0.595083f, 0.595160f, 0.595237f, 0.595314f, 0.595391f, 0.595468f, 0.595545f, 0.595622f,
+ 0.595699f, 0.595776f, 0.595853f, 0.595930f, 0.596007f, 0.596084f, 0.596161f, 0.596238f,
+ 0.596315f, 0.596392f, 0.596469f, 0.596546f, 0.596623f, 0.596700f, 0.596777f, 0.596854f,
+ 0.596931f, 0.597008f, 0.597085f, 0.597161f, 0.597238f, 0.597315f, 0.597392f, 0.597469f,
+ 0.597546f, 0.597623f, 0.597700f, 0.597776f, 0.597853f, 0.597930f, 0.598007f, 0.598084f,
+ 0.598161f, 0.598238f, 0.598314f, 0.598391f, 0.598468f, 0.598545f, 0.598622f, 0.598698f,
+ 0.598775f, 0.598852f, 0.598929f, 0.599006f, 0.599082f, 0.599159f, 0.599236f, 0.599313f,
+ 0.599389f, 0.599466f, 0.599543f, 0.599620f, 0.599696f, 0.599773f, 0.599850f, 0.599926f,
+ 0.600003f, 0.600080f, 0.600156f, 0.600233f, 0.600310f, 0.600387f, 0.600463f, 0.600540f,
+ 0.600616f, 0.600693f, 0.600770f, 0.600846f, 0.600923f, 0.601000f, 0.601076f, 0.601153f,
+ 0.601230f, 0.601306f, 0.601383f, 0.601459f, 0.601536f, 0.601613f, 0.601689f, 0.601766f,
+ 0.601842f, 0.601919f, 0.601995f, 0.602072f, 0.602148f, 0.602225f, 0.602302f, 0.602378f,
+ 0.602455f, 0.602531f, 0.602608f, 0.602684f, 0.602761f, 0.602837f, 0.602914f, 0.602990f,
+ 0.603067f, 0.603143f, 0.603220f, 0.603296f, 0.603372f, 0.603449f, 0.603525f, 0.603602f,
+ 0.603678f, 0.603755f, 0.603831f, 0.603908f, 0.603984f, 0.604060f, 0.604137f, 0.604213f,
+ 0.604290f, 0.604366f, 0.604442f, 0.604519f, 0.604595f, 0.604671f, 0.604748f, 0.604824f,
+ 0.604900f, 0.604977f, 0.605053f, 0.605129f, 0.605206f, 0.605282f, 0.605358f, 0.605435f,
+ 0.605511f, 0.605587f, 0.605664f, 0.605740f, 0.605816f, 0.605892f, 0.605969f, 0.606045f,
+ 0.606121f, 0.606198f, 0.606274f, 0.606350f, 0.606426f, 0.606502f, 0.606579f, 0.606655f,
+ 0.606731f, 0.606807f, 0.606884f, 0.606960f, 0.607036f, 0.607112f, 0.607188f, 0.607264f,
+ 0.607341f, 0.607417f, 0.607493f, 0.607569f, 0.607645f, 0.607721f, 0.607798f, 0.607874f,
+ 0.607950f, 0.608026f, 0.608102f, 0.608178f, 0.608254f, 0.608330f, 0.608406f, 0.608482f,
+ 0.608559f, 0.608635f, 0.608711f, 0.608787f, 0.608863f, 0.608939f, 0.609015f, 0.609091f,
+ 0.609167f, 0.609243f, 0.609319f, 0.609395f, 0.609471f, 0.609547f, 0.609623f, 0.609699f,
+ 0.609775f, 0.609851f, 0.609927f, 0.610003f, 0.610079f, 0.610155f, 0.610231f, 0.610307f,
+ 0.610383f, 0.610459f, 0.610535f, 0.610611f, 0.610687f, 0.610762f, 0.610838f, 0.610914f,
+ 0.610990f, 0.611066f, 0.611142f, 0.611218f, 0.611294f, 0.611370f, 0.611445f, 0.611521f,
+ 0.611597f, 0.611673f, 0.611749f, 0.611825f, 0.611901f, 0.611976f, 0.612052f, 0.612128f,
+ 0.612204f, 0.612280f, 0.612355f, 0.612431f, 0.612507f, 0.612583f, 0.612659f, 0.612734f,
+ 0.612810f, 0.612886f, 0.612962f, 0.613037f, 0.613113f, 0.613189f, 0.613265f, 0.613340f,
+ 0.613416f, 0.613492f, 0.613567f, 0.613643f, 0.613719f, 0.613795f, 0.613870f, 0.613946f,
+ 0.614022f, 0.614097f, 0.614173f, 0.614249f, 0.614324f, 0.614400f, 0.614475f, 0.614551f,
+ 0.614627f, 0.614702f, 0.614778f, 0.614854f, 0.614929f, 0.615005f, 0.615080f, 0.615156f,
+ 0.615232f, 0.615307f, 0.615383f, 0.615458f, 0.615534f, 0.615609f, 0.615685f, 0.615761f,
+ 0.615836f, 0.615912f, 0.615987f, 0.616063f, 0.616138f, 0.616214f, 0.616289f, 0.616365f,
+ 0.616440f, 0.616516f, 0.616591f, 0.616667f, 0.616742f, 0.616818f, 0.616893f, 0.616968f,
+ 0.617044f, 0.617119f, 0.617195f, 0.617270f, 0.617346f, 0.617421f, 0.617496f, 0.617572f,
+ 0.617647f, 0.617723f, 0.617798f, 0.617873f, 0.617949f, 0.618024f, 0.618100f, 0.618175f,
+ 0.618250f, 0.618326f, 0.618401f, 0.618476f, 0.618552f, 0.618627f, 0.618702f, 0.618778f,
+ 0.618853f, 0.618928f, 0.619004f, 0.619079f, 0.619154f, 0.619229f, 0.619305f, 0.619380f,
+ 0.619455f, 0.619531f, 0.619606f, 0.619681f, 0.619756f, 0.619832f, 0.619907f, 0.619982f,
+ 0.620057f, 0.620132f, 0.620208f, 0.620283f, 0.620358f, 0.620433f, 0.620508f, 0.620584f,
+ 0.620659f, 0.620734f, 0.620809f, 0.620884f, 0.620959f, 0.621035f, 0.621110f, 0.621185f,
+ 0.621260f, 0.621335f, 0.621410f, 0.621485f, 0.621560f, 0.621636f, 0.621711f, 0.621786f,
+ 0.621861f, 0.621936f, 0.622011f, 0.622086f, 0.622161f, 0.622236f, 0.622311f, 0.622386f,
+ 0.622461f, 0.622536f, 0.622611f, 0.622686f, 0.622761f, 0.622836f, 0.622911f, 0.622986f,
+ 0.623061f, 0.623136f, 0.623211f, 0.623286f, 0.623361f, 0.623436f, 0.623511f, 0.623586f,
+ 0.623661f, 0.623736f, 0.623811f, 0.623886f, 0.623961f, 0.624036f, 0.624111f, 0.624186f,
+ 0.624260f, 0.624335f, 0.624410f, 0.624485f, 0.624560f, 0.624635f, 0.624710f, 0.624785f,
+ 0.624860f, 0.624934f, 0.625009f, 0.625084f, 0.625159f, 0.625234f, 0.625309f, 0.625383f,
+ 0.625458f, 0.625533f, 0.625608f, 0.625683f, 0.625757f, 0.625832f, 0.625907f, 0.625982f,
+ 0.626056f, 0.626131f, 0.626206f, 0.626281f, 0.626355f, 0.626430f, 0.626505f, 0.626580f,
+ 0.626654f, 0.626729f, 0.626804f, 0.626878f, 0.626953f, 0.627028f, 0.627102f, 0.627177f,
+ 0.627252f, 0.627326f, 0.627401f, 0.627476f, 0.627550f, 0.627625f, 0.627700f, 0.627774f,
+ 0.627849f, 0.627924f, 0.627998f, 0.628073f, 0.628147f, 0.628222f, 0.628297f, 0.628371f,
+ 0.628446f, 0.628520f, 0.628595f, 0.628669f, 0.628744f, 0.628819f, 0.628893f, 0.628968f,
+ 0.629042f, 0.629117f, 0.629191f, 0.629266f, 0.629340f, 0.629415f, 0.629489f, 0.629564f,
+ 0.629638f, 0.629713f, 0.629787f, 0.629862f, 0.629936f, 0.630011f, 0.630085f, 0.630159f,
+ 0.630234f, 0.630308f, 0.630383f, 0.630457f, 0.630532f, 0.630606f, 0.630680f, 0.630755f,
+ 0.630829f, 0.630904f, 0.630978f, 0.631052f, 0.631127f, 0.631201f, 0.631275f, 0.631350f,
+ 0.631424f, 0.631499f, 0.631573f, 0.631647f, 0.631721f, 0.631796f, 0.631870f, 0.631944f,
+ 0.632019f, 0.632093f, 0.632167f, 0.632242f, 0.632316f, 0.632390f, 0.632464f, 0.632539f,
+ 0.632613f, 0.632687f, 0.632761f, 0.632836f, 0.632910f, 0.632984f, 0.633058f, 0.633133f,
+ 0.633207f, 0.633281f, 0.633355f, 0.633429f, 0.633504f, 0.633578f, 0.633652f, 0.633726f,
+ 0.633800f, 0.633874f, 0.633949f, 0.634023f, 0.634097f, 0.634171f, 0.634245f, 0.634319f,
+ 0.634393f, 0.634467f, 0.634542f, 0.634616f, 0.634690f, 0.634764f, 0.634838f, 0.634912f,
+ 0.634986f, 0.635060f, 0.635134f, 0.635208f, 0.635282f, 0.635356f, 0.635430f, 0.635504f,
+ 0.635578f, 0.635652f, 0.635726f, 0.635800f, 0.635874f, 0.635948f, 0.636022f, 0.636096f,
+ 0.636170f, 0.636244f, 0.636318f, 0.636392f, 0.636466f, 0.636540f, 0.636614f, 0.636688f,
+ 0.636762f, 0.636836f, 0.636910f, 0.636984f, 0.637057f, 0.637131f, 0.637205f, 0.637279f,
+ 0.637353f, 0.637427f, 0.637501f, 0.637575f, 0.637649f, 0.637722f, 0.637796f, 0.637870f,
+ 0.637944f, 0.638018f, 0.638092f, 0.638165f, 0.638239f, 0.638313f, 0.638387f, 0.638461f,
+ 0.638534f, 0.638608f, 0.638682f, 0.638756f, 0.638829f, 0.638903f, 0.638977f, 0.639051f,
+ 0.639124f, 0.639198f, 0.639272f, 0.639346f, 0.639419f, 0.639493f, 0.639567f, 0.639640f,
+ 0.639714f, 0.639788f, 0.639862f, 0.639935f, 0.640009f, 0.640083f, 0.640156f, 0.640230f,
+ 0.640303f, 0.640377f, 0.640451f, 0.640524f, 0.640598f, 0.640672f, 0.640745f, 0.640819f,
+ 0.640892f, 0.640966f, 0.641040f, 0.641113f, 0.641187f, 0.641260f, 0.641334f, 0.641407f,
+ 0.641481f, 0.641555f, 0.641628f, 0.641702f, 0.641775f, 0.641849f, 0.641922f, 0.641996f,
+ 0.642069f, 0.642143f, 0.642216f, 0.642290f, 0.642363f, 0.642437f, 0.642510f, 0.642584f,
+ 0.642657f, 0.642730f, 0.642804f, 0.642877f, 0.642951f, 0.643024f, 0.643098f, 0.643171f,
+ 0.643245f, 0.643318f, 0.643391f, 0.643465f, 0.643538f, 0.643611f, 0.643685f, 0.643758f,
+ 0.643832f, 0.643905f, 0.643978f, 0.644052f, 0.644125f, 0.644198f, 0.644272f, 0.644345f,
+ 0.644418f, 0.644492f, 0.644565f, 0.644638f, 0.644711f, 0.644785f, 0.644858f, 0.644931f,
+ 0.645005f, 0.645078f, 0.645151f, 0.645224f, 0.645298f, 0.645371f, 0.645444f, 0.645517f,
+ 0.645590f, 0.645664f, 0.645737f, 0.645810f, 0.645883f, 0.645956f, 0.646030f, 0.646103f,
+ 0.646176f, 0.646249f, 0.646322f, 0.646396f, 0.646469f, 0.646542f, 0.646615f, 0.646688f,
+ 0.646761f, 0.646834f, 0.646907f, 0.646981f, 0.647054f, 0.647127f, 0.647200f, 0.647273f,
+ 0.647346f, 0.647419f, 0.647492f, 0.647565f, 0.647638f, 0.647711f, 0.647784f, 0.647857f,
+ 0.647930f, 0.648003f, 0.648076f, 0.648149f, 0.648222f, 0.648295f, 0.648368f, 0.648441f,
+ 0.648514f, 0.648587f, 0.648660f, 0.648733f, 0.648806f, 0.648879f, 0.648952f, 0.649025f,
+ 0.649098f, 0.649171f, 0.649244f, 0.649317f, 0.649390f, 0.649463f, 0.649536f, 0.649608f,
+ 0.649681f, 0.649754f, 0.649827f, 0.649900f, 0.649973f, 0.650046f, 0.650119f, 0.650191f,
+ 0.650264f, 0.650337f, 0.650410f, 0.650483f, 0.650555f, 0.650628f, 0.650701f, 0.650774f,
+ 0.650847f, 0.650919f, 0.650992f, 0.651065f, 0.651138f, 0.651211f, 0.651283f, 0.651356f,
+ 0.651429f, 0.651502f, 0.651574f, 0.651647f, 0.651720f, 0.651792f, 0.651865f, 0.651938f,
+ 0.652011f, 0.652083f, 0.652156f, 0.652229f, 0.652301f, 0.652374f, 0.652447f, 0.652519f,
+ 0.652592f, 0.652665f, 0.652737f, 0.652810f, 0.652882f, 0.652955f, 0.653028f, 0.653100f,
+ 0.653173f, 0.653245f, 0.653318f, 0.653391f, 0.653463f, 0.653536f, 0.653608f, 0.653681f,
+ 0.653753f, 0.653826f, 0.653899f, 0.653971f, 0.654044f, 0.654116f, 0.654189f, 0.654261f,
+ 0.654334f, 0.654406f, 0.654479f, 0.654551f, 0.654624f, 0.654696f, 0.654769f, 0.654841f,
+ 0.654913f, 0.654986f, 0.655058f, 0.655131f, 0.655203f, 0.655276f, 0.655348f, 0.655420f,
+ 0.655493f, 0.655565f, 0.655638f, 0.655710f, 0.655782f, 0.655855f, 0.655927f, 0.656000f,
+ 0.656072f, 0.656144f, 0.656217f, 0.656289f, 0.656361f, 0.656434f, 0.656506f, 0.656578f,
+ 0.656651f, 0.656723f, 0.656795f, 0.656867f, 0.656940f, 0.657012f, 0.657084f, 0.657157f,
+ 0.657229f, 0.657301f, 0.657373f, 0.657446f, 0.657518f, 0.657590f, 0.657662f, 0.657734f,
+ 0.657807f, 0.657879f, 0.657951f, 0.658023f, 0.658095f, 0.658168f, 0.658240f, 0.658312f,
+ 0.658384f, 0.658456f, 0.658529f, 0.658601f, 0.658673f, 0.658745f, 0.658817f, 0.658889f,
+ 0.658961f, 0.659033f, 0.659105f, 0.659178f, 0.659250f, 0.659322f, 0.659394f, 0.659466f,
+ 0.659538f, 0.659610f, 0.659682f, 0.659754f, 0.659826f, 0.659898f, 0.659970f, 0.660042f,
+ 0.660114f, 0.660186f, 0.660258f, 0.660330f, 0.660402f, 0.660474f, 0.660546f, 0.660618f,
+ 0.660690f, 0.660762f, 0.660834f, 0.660906f, 0.660978f, 0.661050f, 0.661122f, 0.661194f,
+ 0.661266f, 0.661338f, 0.661410f, 0.661482f, 0.661553f, 0.661625f, 0.661697f, 0.661769f,
+ 0.661841f, 0.661913f, 0.661985f, 0.662057f, 0.662128f, 0.662200f, 0.662272f, 0.662344f,
+ 0.662416f, 0.662488f, 0.662559f, 0.662631f, 0.662703f, 0.662775f, 0.662847f, 0.662918f,
+ 0.662990f, 0.663062f, 0.663134f, 0.663205f, 0.663277f, 0.663349f, 0.663421f, 0.663492f,
+ 0.663564f, 0.663636f, 0.663708f, 0.663779f, 0.663851f, 0.663923f, 0.663994f, 0.664066f,
+ 0.664138f, 0.664209f, 0.664281f, 0.664353f, 0.664424f, 0.664496f, 0.664568f, 0.664639f,
+ 0.664711f, 0.664783f, 0.664854f, 0.664926f, 0.664997f, 0.665069f, 0.665141f, 0.665212f,
+ 0.665284f, 0.665355f, 0.665427f, 0.665498f, 0.665570f, 0.665642f, 0.665713f, 0.665785f,
+ 0.665856f, 0.665928f, 0.665999f, 0.666071f, 0.666142f, 0.666214f, 0.666285f, 0.666357f,
+ 0.666428f, 0.666500f, 0.666571f, 0.666643f, 0.666714f, 0.666786f, 0.666857f, 0.666928f,
+ 0.667000f, 0.667071f, 0.667143f, 0.667214f, 0.667286f, 0.667357f, 0.667428f, 0.667500f,
+ 0.667571f, 0.667643f, 0.667714f, 0.667785f, 0.667857f, 0.667928f, 0.667999f, 0.668071f,
+ 0.668142f, 0.668213f, 0.668285f, 0.668356f, 0.668427f, 0.668499f, 0.668570f, 0.668641f,
+ 0.668712f, 0.668784f, 0.668855f, 0.668926f, 0.668998f, 0.669069f, 0.669140f, 0.669211f,
+ 0.669283f, 0.669354f, 0.669425f, 0.669496f, 0.669567f, 0.669639f, 0.669710f, 0.669781f,
+ 0.669852f, 0.669923f, 0.669995f, 0.670066f, 0.670137f, 0.670208f, 0.670279f, 0.670350f,
+ 0.670422f, 0.670493f, 0.670564f, 0.670635f, 0.670706f, 0.670777f, 0.670848f, 0.670919f,
+ 0.670990f, 0.671062f, 0.671133f, 0.671204f, 0.671275f, 0.671346f, 0.671417f, 0.671488f,
+ 0.671559f, 0.671630f, 0.671701f, 0.671772f, 0.671843f, 0.671914f, 0.671985f, 0.672056f,
+ 0.672127f, 0.672198f, 0.672269f, 0.672340f, 0.672411f, 0.672482f, 0.672553f, 0.672624f,
+ 0.672695f, 0.672766f, 0.672837f, 0.672908f, 0.672978f, 0.673049f, 0.673120f, 0.673191f,
+ 0.673262f, 0.673333f, 0.673404f, 0.673475f, 0.673546f, 0.673616f, 0.673687f, 0.673758f,
+ 0.673829f, 0.673900f, 0.673971f, 0.674042f, 0.674112f, 0.674183f, 0.674254f, 0.674325f,
+ 0.674396f, 0.674466f, 0.674537f, 0.674608f, 0.674679f, 0.674749f, 0.674820f, 0.674891f,
+ 0.674962f, 0.675032f, 0.675103f, 0.675174f, 0.675245f, 0.675315f, 0.675386f, 0.675457f,
+ 0.675527f, 0.675598f, 0.675669f, 0.675739f, 0.675810f, 0.675881f, 0.675951f, 0.676022f,
+ 0.676093f, 0.676163f, 0.676234f, 0.676305f, 0.676375f, 0.676446f, 0.676516f, 0.676587f,
+ 0.676658f, 0.676728f, 0.676799f, 0.676869f, 0.676940f, 0.677011f, 0.677081f, 0.677152f,
+ 0.677222f, 0.677293f, 0.677363f, 0.677434f, 0.677504f, 0.677575f, 0.677645f, 0.677716f,
+ 0.677786f, 0.677857f, 0.677927f, 0.677998f, 0.678068f, 0.678139f, 0.678209f, 0.678280f,
+ 0.678350f, 0.678420f, 0.678491f, 0.678561f, 0.678632f, 0.678702f, 0.678773f, 0.678843f,
+ 0.678913f, 0.678984f, 0.679054f, 0.679125f, 0.679195f, 0.679265f, 0.679336f, 0.679406f,
+ 0.679476f, 0.679547f, 0.679617f, 0.679687f, 0.679758f, 0.679828f, 0.679898f, 0.679969f,
+ 0.680039f, 0.680109f, 0.680179f, 0.680250f, 0.680320f, 0.680390f, 0.680461f, 0.680531f,
+ 0.680601f, 0.680671f, 0.680741f, 0.680812f, 0.680882f, 0.680952f, 0.681022f, 0.681093f,
+ 0.681163f, 0.681233f, 0.681303f, 0.681373f, 0.681443f, 0.681514f, 0.681584f, 0.681654f,
+ 0.681724f, 0.681794f, 0.681864f, 0.681934f, 0.682005f, 0.682075f, 0.682145f, 0.682215f,
+ 0.682285f, 0.682355f, 0.682425f, 0.682495f, 0.682565f, 0.682635f, 0.682705f, 0.682775f,
+ 0.682846f, 0.682916f, 0.682986f, 0.683056f, 0.683126f, 0.683196f, 0.683266f, 0.683336f,
+ 0.683406f, 0.683476f, 0.683546f, 0.683616f, 0.683686f, 0.683756f, 0.683825f, 0.683895f,
+ 0.683965f, 0.684035f, 0.684105f, 0.684175f, 0.684245f, 0.684315f, 0.684385f, 0.684455f,
+ 0.684525f, 0.684595f, 0.684664f, 0.684734f, 0.684804f, 0.684874f, 0.684944f, 0.685014f,
+ 0.685084f, 0.685153f, 0.685223f, 0.685293f, 0.685363f, 0.685433f, 0.685503f, 0.685572f,
+ 0.685642f, 0.685712f, 0.685782f, 0.685852f, 0.685921f, 0.685991f, 0.686061f, 0.686131f,
+ 0.686200f, 0.686270f, 0.686340f, 0.686409f, 0.686479f, 0.686549f, 0.686619f, 0.686688f,
+ 0.686758f, 0.686828f, 0.686897f, 0.686967f, 0.687037f, 0.687106f, 0.687176f, 0.687246f,
+ 0.687315f, 0.687385f, 0.687455f, 0.687524f, 0.687594f, 0.687663f, 0.687733f, 0.687803f,
+ 0.687872f, 0.687942f, 0.688011f, 0.688081f, 0.688151f, 0.688220f, 0.688290f, 0.688359f,
+ 0.688429f, 0.688498f, 0.688568f, 0.688637f, 0.688707f, 0.688776f, 0.688846f, 0.688915f,
+ 0.688985f, 0.689054f, 0.689124f, 0.689193f, 0.689263f, 0.689332f, 0.689402f, 0.689471f,
+ 0.689541f, 0.689610f, 0.689679f, 0.689749f, 0.689818f, 0.689888f, 0.689957f, 0.690026f,
+ 0.690096f, 0.690165f, 0.690235f, 0.690304f, 0.690373f, 0.690443f, 0.690512f, 0.690581f,
+ 0.690651f, 0.690720f, 0.690789f, 0.690859f, 0.690928f, 0.690997f, 0.691067f, 0.691136f,
+ 0.691205f, 0.691274f, 0.691344f, 0.691413f, 0.691482f, 0.691552f, 0.691621f, 0.691690f,
+ 0.691759f, 0.691828f, 0.691898f, 0.691967f, 0.692036f, 0.692105f, 0.692175f, 0.692244f,
+ 0.692313f, 0.692382f, 0.692451f, 0.692520f, 0.692590f, 0.692659f, 0.692728f, 0.692797f,
+ 0.692866f, 0.692935f, 0.693004f, 0.693074f, 0.693143f, 0.693212f, 0.693281f, 0.693350f,
+ 0.693419f, 0.693488f, 0.693557f, 0.693626f, 0.693695f, 0.693764f, 0.693833f, 0.693902f,
+ 0.693971f, 0.694040f, 0.694109f, 0.694179f, 0.694248f, 0.694317f, 0.694386f, 0.694454f,
+ 0.694524f, 0.694592f, 0.694661f, 0.694730f, 0.694799f, 0.694868f, 0.694937f, 0.695006f,
+ 0.695075f, 0.695144f, 0.695213f, 0.695282f, 0.695351f, 0.695420f, 0.695489f, 0.695557f,
+ 0.695626f, 0.695695f, 0.695764f, 0.695833f, 0.695902f, 0.695971f, 0.696039f, 0.696108f,
+ 0.696177f, 0.696246f, 0.696315f, 0.696384f, 0.696452f, 0.696521f, 0.696590f, 0.696659f,
+ 0.696728f, 0.696796f, 0.696865f, 0.696934f, 0.697003f, 0.697071f, 0.697140f, 0.697209f,
+ 0.697277f, 0.697346f, 0.697415f, 0.697484f, 0.697552f, 0.697621f, 0.697690f, 0.697758f,
+ 0.697827f, 0.697896f, 0.697964f, 0.698033f, 0.698102f, 0.698170f, 0.698239f, 0.698308f,
+ 0.698376f, 0.698445f, 0.698513f, 0.698582f, 0.698651f, 0.698719f, 0.698788f, 0.698856f,
+ 0.698925f, 0.698994f, 0.699062f, 0.699131f, 0.699199f, 0.699268f, 0.699336f, 0.699405f,
+ 0.699473f, 0.699542f, 0.699610f, 0.699679f, 0.699747f, 0.699816f, 0.699884f, 0.699953f,
+ 0.700021f, 0.700090f, 0.700158f, 0.700227f, 0.700295f, 0.700364f, 0.700432f, 0.700500f,
+ 0.700569f, 0.700637f, 0.700706f, 0.700774f, 0.700842f, 0.700911f, 0.700979f, 0.701048f,
+ 0.701116f, 0.701184f, 0.701253f, 0.701321f, 0.701389f, 0.701458f, 0.701526f, 0.701594f,
+ 0.701663f, 0.701731f, 0.701799f, 0.701868f, 0.701936f, 0.702004f, 0.702072f, 0.702141f,
+ 0.702209f, 0.702277f, 0.702345f, 0.702414f, 0.702482f, 0.702550f, 0.702618f, 0.702687f,
+ 0.702755f, 0.702823f, 0.702891f, 0.702959f, 0.703028f, 0.703096f, 0.703164f, 0.703232f,
+ 0.703300f, 0.703368f, 0.703436f, 0.703505f, 0.703573f, 0.703641f, 0.703709f, 0.703777f,
+ 0.703845f, 0.703913f, 0.703981f, 0.704050f, 0.704118f, 0.704186f, 0.704254f, 0.704322f,
+ 0.704390f, 0.704458f, 0.704526f, 0.704594f, 0.704662f, 0.704730f, 0.704798f, 0.704866f,
+ 0.704934f, 0.705002f, 0.705070f, 0.705138f, 0.705206f, 0.705274f, 0.705342f, 0.705410f,
+ 0.705478f, 0.705546f, 0.705614f, 0.705682f, 0.705750f, 0.705818f, 0.705885f, 0.705953f,
+ 0.706021f, 0.706089f, 0.706157f, 0.706225f, 0.706293f, 0.706361f, 0.706429f, 0.706496f,
+ 0.706564f, 0.706632f, 0.706700f, 0.706768f, 0.706836f, 0.706903f, 0.706971f, 0.707039f,
+ 0.707107f, 0.707175f, 0.707242f, 0.707310f, 0.707378f, 0.707446f, 0.707513f, 0.707581f,
+ 0.707649f, 0.707717f, 0.707784f, 0.707852f, 0.707920f, 0.707988f, 0.708055f, 0.708123f,
+ 0.708191f, 0.708258f, 0.708326f, 0.708394f, 0.708461f, 0.708529f, 0.708597f, 0.708664f,
+ 0.708732f, 0.708800f, 0.708867f, 0.708935f, 0.709002f, 0.709070f, 0.709138f, 0.709205f,
+ 0.709273f, 0.709340f, 0.709408f, 0.709476f, 0.709543f, 0.709611f, 0.709678f, 0.709746f,
+ 0.709813f, 0.709881f, 0.709948f, 0.710016f, 0.710083f, 0.710151f, 0.710218f, 0.710286f,
+ 0.710353f, 0.710421f, 0.710488f, 0.710556f, 0.710623f, 0.710691f, 0.710758f, 0.710826f,
+ 0.710893f, 0.710960f, 0.711028f, 0.711095f, 0.711163f, 0.711230f, 0.711297f, 0.711365f,
+ 0.711432f, 0.711500f, 0.711567f, 0.711634f, 0.711702f, 0.711769f, 0.711836f, 0.711904f,
+ 0.711971f, 0.712038f, 0.712106f, 0.712173f, 0.712240f, 0.712308f, 0.712375f, 0.712442f,
+ 0.712509f, 0.712577f, 0.712644f, 0.712711f, 0.712778f, 0.712846f, 0.712913f, 0.712980f,
+ 0.713047f, 0.713115f, 0.713182f, 0.713249f, 0.713316f, 0.713383f, 0.713451f, 0.713518f,
+ 0.713585f, 0.713652f, 0.713719f, 0.713786f, 0.713853f, 0.713921f, 0.713988f, 0.714055f,
+ 0.714122f, 0.714189f, 0.714256f, 0.714323f, 0.714390f, 0.714457f, 0.714525f, 0.714592f,
+ 0.714659f, 0.714726f, 0.714793f, 0.714860f, 0.714927f, 0.714994f, 0.715061f, 0.715128f,
+ 0.715195f, 0.715262f, 0.715329f, 0.715396f, 0.715463f, 0.715530f, 0.715597f, 0.715664f,
+ 0.715731f, 0.715798f, 0.715865f, 0.715932f, 0.715999f, 0.716066f, 0.716132f, 0.716199f,
+ 0.716266f, 0.716333f, 0.716400f, 0.716467f, 0.716534f, 0.716601f, 0.716668f, 0.716734f,
+ 0.716801f, 0.716868f, 0.716935f, 0.717002f, 0.717069f, 0.717135f, 0.717202f, 0.717269f,
+ 0.717336f, 0.717403f, 0.717469f, 0.717536f, 0.717603f, 0.717670f, 0.717737f, 0.717803f,
+ 0.717870f, 0.717937f, 0.718004f, 0.718070f, 0.718137f, 0.718204f, 0.718270f, 0.718337f,
+ 0.718404f, 0.718471f, 0.718537f, 0.718604f, 0.718670f, 0.718737f, 0.718804f, 0.718870f,
+ 0.718937f, 0.719004f, 0.719070f, 0.719137f, 0.719204f, 0.719270f, 0.719337f, 0.719403f,
+ 0.719470f, 0.719537f, 0.719603f, 0.719670f, 0.719736f, 0.719803f, 0.719869f, 0.719936f,
+ 0.720003f, 0.720069f, 0.720136f, 0.720202f, 0.720269f, 0.720335f, 0.720402f, 0.720468f,
+ 0.720535f, 0.720601f, 0.720668f, 0.720734f, 0.720800f, 0.720867f, 0.720933f, 0.721000f,
+ 0.721066f, 0.721133f, 0.721199f, 0.721265f, 0.721332f, 0.721398f, 0.721465f, 0.721531f,
+ 0.721597f, 0.721664f, 0.721730f, 0.721797f, 0.721863f, 0.721929f, 0.721996f, 0.722062f,
+ 0.722128f, 0.722194f, 0.722261f, 0.722327f, 0.722393f, 0.722460f, 0.722526f, 0.722592f,
+ 0.722659f, 0.722725f, 0.722791f, 0.722857f, 0.722924f, 0.722990f, 0.723056f, 0.723122f,
+ 0.723188f, 0.723255f, 0.723321f, 0.723387f, 0.723453f, 0.723520f, 0.723586f, 0.723652f,
+ 0.723718f, 0.723784f, 0.723850f, 0.723916f, 0.723983f, 0.724049f, 0.724115f, 0.724181f,
+ 0.724247f, 0.724313f, 0.724379f, 0.724445f, 0.724511f, 0.724578f, 0.724644f, 0.724710f,
+ 0.724776f, 0.724842f, 0.724908f, 0.724974f, 0.725040f, 0.725106f, 0.725172f, 0.725238f,
+ 0.725304f, 0.725370f, 0.725436f, 0.725502f, 0.725568f, 0.725634f, 0.725700f, 0.725766f,
+ 0.725832f, 0.725898f, 0.725964f, 0.726030f, 0.726095f, 0.726161f, 0.726227f, 0.726293f,
+ 0.726359f, 0.726425f, 0.726491f, 0.726557f, 0.726623f, 0.726689f, 0.726754f, 0.726820f,
+ 0.726886f, 0.726952f, 0.727018f, 0.727084f, 0.727149f, 0.727215f, 0.727281f, 0.727347f,
+ 0.727413f, 0.727478f, 0.727544f, 0.727610f, 0.727676f, 0.727741f, 0.727807f, 0.727873f,
+ 0.727939f, 0.728004f, 0.728070f, 0.728136f, 0.728202f, 0.728267f, 0.728333f, 0.728399f,
+ 0.728464f, 0.728530f, 0.728596f, 0.728661f, 0.728727f, 0.728793f, 0.728858f, 0.728924f,
+ 0.728990f, 0.729055f, 0.729121f, 0.729186f, 0.729252f, 0.729318f, 0.729383f, 0.729449f,
+ 0.729514f, 0.729580f, 0.729646f, 0.729711f, 0.729777f, 0.729842f, 0.729908f, 0.729973f,
+ 0.730039f, 0.730104f, 0.730170f, 0.730235f, 0.730301f, 0.730366f, 0.730432f, 0.730497f,
+ 0.730563f, 0.730628f, 0.730694f, 0.730759f, 0.730825f, 0.730890f, 0.730955f, 0.731021f,
+ 0.731086f, 0.731152f, 0.731217f, 0.731282f, 0.731348f, 0.731413f, 0.731479f, 0.731544f,
+ 0.731609f, 0.731675f, 0.731740f, 0.731805f, 0.731871f, 0.731936f, 0.732001f, 0.732067f,
+ 0.732132f, 0.732197f, 0.732263f, 0.732328f, 0.732393f, 0.732458f, 0.732524f, 0.732589f,
+ 0.732654f, 0.732720f, 0.732785f, 0.732850f, 0.732915f, 0.732980f, 0.733046f, 0.733111f,
+ 0.733176f, 0.733241f, 0.733306f, 0.733372f, 0.733437f, 0.733502f, 0.733567f, 0.733632f,
+ 0.733697f, 0.733763f, 0.733828f, 0.733893f, 0.733958f, 0.734023f, 0.734088f, 0.734153f,
+ 0.734218f, 0.734283f, 0.734349f, 0.734414f, 0.734479f, 0.734544f, 0.734609f, 0.734674f,
+ 0.734739f, 0.734804f, 0.734869f, 0.734934f, 0.734999f, 0.735064f, 0.735129f, 0.735194f,
+ 0.735259f, 0.735324f, 0.735389f, 0.735454f, 0.735519f, 0.735584f, 0.735649f, 0.735714f,
+ 0.735779f, 0.735844f, 0.735908f, 0.735973f, 0.736038f, 0.736103f, 0.736168f, 0.736233f,
+ 0.736298f, 0.736363f, 0.736428f, 0.736492f, 0.736557f, 0.736622f, 0.736687f, 0.736752f,
+ 0.736817f, 0.736881f, 0.736946f, 0.737011f, 0.737076f, 0.737141f, 0.737205f, 0.737270f,
+ 0.737335f, 0.737400f, 0.737464f, 0.737529f, 0.737594f, 0.737659f, 0.737723f, 0.737788f,
+ 0.737853f, 0.737918f, 0.737982f, 0.738047f, 0.738112f, 0.738176f, 0.738241f, 0.738306f,
+ 0.738370f, 0.738435f, 0.738500f, 0.738564f, 0.738629f, 0.738693f, 0.738758f, 0.738823f,
+ 0.738887f, 0.738952f, 0.739017f, 0.739081f, 0.739146f, 0.739210f, 0.739275f, 0.739339f,
+ 0.739404f, 0.739468f, 0.739533f, 0.739598f, 0.739662f, 0.739727f, 0.739791f, 0.739856f,
+ 0.739920f, 0.739985f, 0.740049f, 0.740114f, 0.740178f, 0.740242f, 0.740307f, 0.740371f,
+ 0.740436f, 0.740500f, 0.740565f, 0.740629f, 0.740694f, 0.740758f, 0.740822f, 0.740887f,
+ 0.740951f, 0.741015f, 0.741080f, 0.741144f, 0.741209f, 0.741273f, 0.741337f, 0.741402f,
+ 0.741466f, 0.741530f, 0.741595f, 0.741659f, 0.741723f, 0.741788f, 0.741852f, 0.741916f,
+ 0.741980f, 0.742045f, 0.742109f, 0.742173f, 0.742237f, 0.742302f, 0.742366f, 0.742430f,
+ 0.742494f, 0.742559f, 0.742623f, 0.742687f, 0.742751f, 0.742815f, 0.742880f, 0.742944f,
+ 0.743008f, 0.743072f, 0.743136f, 0.743200f, 0.743265f, 0.743329f, 0.743393f, 0.743457f,
+ 0.743521f, 0.743585f, 0.743649f, 0.743713f, 0.743777f, 0.743842f, 0.743906f, 0.743970f,
+ 0.744034f, 0.744098f, 0.744162f, 0.744226f, 0.744290f, 0.744354f, 0.744418f, 0.744482f,
+ 0.744546f, 0.744610f, 0.744674f, 0.744738f, 0.744802f, 0.744866f, 0.744930f, 0.744994f,
+ 0.745058f, 0.745122f, 0.745186f, 0.745250f, 0.745314f, 0.745377f, 0.745441f, 0.745505f,
+ 0.745569f, 0.745633f, 0.745697f, 0.745761f, 0.745825f, 0.745889f, 0.745952f, 0.746016f,
+ 0.746080f, 0.746144f, 0.746208f, 0.746272f, 0.746335f, 0.746399f, 0.746463f, 0.746527f,
+ 0.746591f, 0.746654f, 0.746718f, 0.746782f, 0.746846f, 0.746909f, 0.746973f, 0.747037f,
+ 0.747101f, 0.747164f, 0.747228f, 0.747292f, 0.747355f, 0.747419f, 0.747483f, 0.747547f,
+ 0.747610f, 0.747674f, 0.747738f, 0.747801f, 0.747865f, 0.747929f, 0.747992f, 0.748056f,
+ 0.748119f, 0.748183f, 0.748247f, 0.748310f, 0.748374f, 0.748437f, 0.748501f, 0.748565f,
+ 0.748628f, 0.748692f, 0.748755f, 0.748819f, 0.748882f, 0.748946f, 0.749009f, 0.749073f,
+ 0.749136f, 0.749200f, 0.749263f, 0.749327f, 0.749390f, 0.749454f, 0.749517f, 0.749581f,
+ 0.749644f, 0.749708f, 0.749771f, 0.749835f, 0.749898f, 0.749961f, 0.750025f, 0.750088f,
+ 0.750152f, 0.750215f, 0.750278f, 0.750342f, 0.750405f, 0.750469f, 0.750532f, 0.750595f,
+ 0.750659f, 0.750722f, 0.750785f, 0.750849f, 0.750912f, 0.750975f, 0.751039f, 0.751102f,
+ 0.751165f, 0.751228f, 0.751292f, 0.751355f, 0.751418f, 0.751481f, 0.751545f, 0.751608f,
+ 0.751671f, 0.751734f, 0.751798f, 0.751861f, 0.751924f, 0.751987f, 0.752050f, 0.752114f,
+ 0.752177f, 0.752240f, 0.752303f, 0.752366f, 0.752429f, 0.752493f, 0.752556f, 0.752619f,
+ 0.752682f, 0.752745f, 0.752808f, 0.752871f, 0.752934f, 0.752998f, 0.753061f, 0.753124f,
+ 0.753187f, 0.753250f, 0.753313f, 0.753376f, 0.753439f, 0.753502f, 0.753565f, 0.753628f,
+ 0.753691f, 0.753754f, 0.753817f, 0.753880f, 0.753943f, 0.754006f, 0.754069f, 0.754132f,
+ 0.754195f, 0.754258f, 0.754321f, 0.754384f, 0.754447f, 0.754510f, 0.754573f, 0.754636f,
+ 0.754698f, 0.754761f, 0.754824f, 0.754887f, 0.754950f, 0.755013f, 0.755076f, 0.755139f,
+ 0.755201f, 0.755264f, 0.755327f, 0.755390f, 0.755453f, 0.755516f, 0.755578f, 0.755641f,
+ 0.755704f, 0.755767f, 0.755829f, 0.755892f, 0.755955f, 0.756018f, 0.756081f, 0.756143f,
+ 0.756206f, 0.756269f, 0.756331f, 0.756394f, 0.756457f, 0.756520f, 0.756582f, 0.756645f,
+ 0.756708f, 0.756770f, 0.756833f, 0.756896f, 0.756958f, 0.757021f, 0.757084f, 0.757146f,
+ 0.757209f, 0.757271f, 0.757334f, 0.757397f, 0.757459f, 0.757522f, 0.757584f, 0.757647f,
+ 0.757710f, 0.757772f, 0.757835f, 0.757897f, 0.757960f, 0.758022f, 0.758085f, 0.758147f,
+ 0.758210f, 0.758272f, 0.758335f, 0.758397f, 0.758460f, 0.758522f, 0.758585f, 0.758647f,
+ 0.758710f, 0.758772f, 0.758835f, 0.758897f, 0.758960f, 0.759022f, 0.759084f, 0.759147f,
+ 0.759209f, 0.759272f, 0.759334f, 0.759396f, 0.759459f, 0.759521f, 0.759583f, 0.759646f,
+ 0.759708f, 0.759771f, 0.759833f, 0.759895f, 0.759957f, 0.760020f, 0.760082f, 0.760144f,
+ 0.760207f, 0.760269f, 0.760331f, 0.760394f, 0.760456f, 0.760518f, 0.760580f, 0.760643f,
+ 0.760705f, 0.760767f, 0.760829f, 0.760891f, 0.760954f, 0.761016f, 0.761078f, 0.761140f,
+ 0.761202f, 0.761265f, 0.761327f, 0.761389f, 0.761451f, 0.761513f, 0.761575f, 0.761637f,
+ 0.761700f, 0.761762f, 0.761824f, 0.761886f, 0.761948f, 0.762010f, 0.762072f, 0.762134f,
+ 0.762196f, 0.762258f, 0.762320f, 0.762382f, 0.762444f, 0.762507f, 0.762569f, 0.762631f,
+ 0.762693f, 0.762755f, 0.762817f, 0.762879f, 0.762941f, 0.763003f, 0.763065f, 0.763126f,
+ 0.763188f, 0.763250f, 0.763312f, 0.763374f, 0.763436f, 0.763498f, 0.763560f, 0.763622f,
+ 0.763684f, 0.763746f, 0.763808f, 0.763869f, 0.763931f, 0.763993f, 0.764055f, 0.764117f,
+ 0.764179f, 0.764241f, 0.764302f, 0.764364f, 0.764426f, 0.764488f, 0.764550f, 0.764611f,
+ 0.764673f, 0.764735f, 0.764797f, 0.764859f, 0.764920f, 0.764982f, 0.765044f, 0.765106f,
+ 0.765167f, 0.765229f, 0.765291f, 0.765352f, 0.765414f, 0.765476f, 0.765538f, 0.765599f,
+ 0.765661f, 0.765723f, 0.765784f, 0.765846f, 0.765907f, 0.765969f, 0.766031f, 0.766092f,
+ 0.766154f, 0.766216f, 0.766277f, 0.766339f, 0.766400f, 0.766462f, 0.766524f, 0.766585f,
+ 0.766647f, 0.766708f, 0.766770f, 0.766831f, 0.766893f, 0.766954f, 0.767016f, 0.767077f,
+ 0.767139f, 0.767200f, 0.767262f, 0.767323f, 0.767385f, 0.767446f, 0.767508f, 0.767569f,
+ 0.767631f, 0.767692f, 0.767754f, 0.767815f, 0.767876f, 0.767938f, 0.767999f, 0.768061f,
+ 0.768122f, 0.768183f, 0.768245f, 0.768306f, 0.768368f, 0.768429f, 0.768490f, 0.768552f,
+ 0.768613f, 0.768674f, 0.768736f, 0.768797f, 0.768858f, 0.768919f, 0.768981f, 0.769042f,
+ 0.769103f, 0.769165f, 0.769226f, 0.769287f, 0.769348f, 0.769410f, 0.769471f, 0.769532f,
+ 0.769593f, 0.769655f, 0.769716f, 0.769777f, 0.769838f, 0.769899f, 0.769961f, 0.770022f,
+ 0.770083f, 0.770144f, 0.770205f, 0.770266f, 0.770327f, 0.770389f, 0.770450f, 0.770511f,
+ 0.770572f, 0.770633f, 0.770694f, 0.770755f, 0.770816f, 0.770877f, 0.770938f, 0.770999f,
+ 0.771061f, 0.771122f, 0.771183f, 0.771244f, 0.771305f, 0.771366f, 0.771427f, 0.771488f,
+ 0.771549f, 0.771610f, 0.771671f, 0.771732f, 0.771793f, 0.771854f, 0.771915f, 0.771975f,
+ 0.772036f, 0.772097f, 0.772158f, 0.772219f, 0.772280f, 0.772341f, 0.772402f, 0.772463f,
+ 0.772524f, 0.772584f, 0.772645f, 0.772706f, 0.772767f, 0.772828f, 0.772889f, 0.772950f,
+ 0.773010f, 0.773071f, 0.773132f, 0.773193f, 0.773254f, 0.773314f, 0.773375f, 0.773436f,
+ 0.773497f, 0.773558f, 0.773618f, 0.773679f, 0.773740f, 0.773801f, 0.773861f, 0.773922f,
+ 0.773983f, 0.774043f, 0.774104f, 0.774165f, 0.774225f, 0.774286f, 0.774347f, 0.774407f,
+ 0.774468f, 0.774529f, 0.774589f, 0.774650f, 0.774711f, 0.774771f, 0.774832f, 0.774893f,
+ 0.774953f, 0.775014f, 0.775074f, 0.775135f, 0.775195f, 0.775256f, 0.775317f, 0.775377f,
+ 0.775438f, 0.775498f, 0.775559f, 0.775619f, 0.775680f, 0.775740f, 0.775801f, 0.775861f,
+ 0.775922f, 0.775982f, 0.776043f, 0.776103f, 0.776164f, 0.776224f, 0.776284f, 0.776345f,
+ 0.776405f, 0.776466f, 0.776526f, 0.776587f, 0.776647f, 0.776707f, 0.776768f, 0.776828f,
+ 0.776888f, 0.776949f, 0.777009f, 0.777070f, 0.777130f, 0.777190f, 0.777251f, 0.777311f,
+ 0.777371f, 0.777431f, 0.777492f, 0.777552f, 0.777612f, 0.777673f, 0.777733f, 0.777793f,
+ 0.777853f, 0.777914f, 0.777974f, 0.778034f, 0.778094f, 0.778155f, 0.778215f, 0.778275f,
+ 0.778335f, 0.778395f, 0.778456f, 0.778516f, 0.778576f, 0.778636f, 0.778696f, 0.778756f,
+ 0.778817f, 0.778877f, 0.778937f, 0.778997f, 0.779057f, 0.779117f, 0.779177f, 0.779237f,
+ 0.779297f, 0.779357f, 0.779418f, 0.779478f, 0.779538f, 0.779598f, 0.779658f, 0.779718f,
+ 0.779778f, 0.779838f, 0.779898f, 0.779958f, 0.780018f, 0.780078f, 0.780138f, 0.780198f,
+ 0.780258f, 0.780318f, 0.780378f, 0.780438f, 0.780498f, 0.780557f, 0.780617f, 0.780677f,
+ 0.780737f, 0.780797f, 0.780857f, 0.780917f, 0.780977f, 0.781037f, 0.781097f, 0.781156f,
+ 0.781216f, 0.781276f, 0.781336f, 0.781396f, 0.781456f, 0.781515f, 0.781575f, 0.781635f,
+ 0.781695f, 0.781755f, 0.781814f, 0.781874f, 0.781934f, 0.781994f, 0.782053f, 0.782113f,
+ 0.782173f, 0.782233f, 0.782292f, 0.782352f, 0.782412f, 0.782472f, 0.782531f, 0.782591f,
+ 0.782651f, 0.782710f, 0.782770f, 0.782830f, 0.782889f, 0.782949f, 0.783009f, 0.783068f,
+ 0.783128f, 0.783187f, 0.783247f, 0.783307f, 0.783366f, 0.783426f, 0.783485f, 0.783545f,
+ 0.783605f, 0.783664f, 0.783724f, 0.783783f, 0.783843f, 0.783902f, 0.783962f, 0.784021f,
+ 0.784081f, 0.784140f, 0.784200f, 0.784259f, 0.784319f, 0.784378f, 0.784438f, 0.784497f,
+ 0.784557f, 0.784616f, 0.784675f, 0.784735f, 0.784794f, 0.784854f, 0.784913f, 0.784973f,
+ 0.785032f, 0.785091f, 0.785151f, 0.785210f, 0.785269f, 0.785329f, 0.785388f, 0.785447f,
+ 0.785507f, 0.785566f, 0.785625f, 0.785685f, 0.785744f, 0.785803f, 0.785863f, 0.785922f,
+ 0.785981f, 0.786041f, 0.786100f, 0.786159f, 0.786218f, 0.786278f, 0.786337f, 0.786396f,
+ 0.786455f, 0.786514f, 0.786574f, 0.786633f, 0.786692f, 0.786751f, 0.786810f, 0.786870f,
+ 0.786929f, 0.786988f, 0.787047f, 0.787106f, 0.787165f, 0.787224f, 0.787284f, 0.787343f,
+ 0.787402f, 0.787461f, 0.787520f, 0.787579f, 0.787638f, 0.787697f, 0.787756f, 0.787815f,
+ 0.787874f, 0.787933f, 0.787992f, 0.788051f, 0.788110f, 0.788169f, 0.788228f, 0.788287f,
+ 0.788346f, 0.788405f, 0.788464f, 0.788523f, 0.788582f, 0.788641f, 0.788700f, 0.788759f,
+ 0.788818f, 0.788877f, 0.788936f, 0.788995f, 0.789054f, 0.789113f, 0.789172f, 0.789230f,
+ 0.789289f, 0.789348f, 0.789407f, 0.789466f, 0.789525f, 0.789584f, 0.789642f, 0.789701f,
+ 0.789760f, 0.789819f, 0.789878f, 0.789936f, 0.789995f, 0.790054f, 0.790113f, 0.790171f,
+ 0.790230f, 0.790289f, 0.790348f, 0.790406f, 0.790465f, 0.790524f, 0.790583f, 0.790641f,
+ 0.790700f, 0.790759f, 0.790817f, 0.790876f, 0.790935f, 0.790993f, 0.791052f, 0.791111f,
+ 0.791169f, 0.791228f, 0.791287f, 0.791345f, 0.791404f, 0.791462f, 0.791521f, 0.791580f,
+ 0.791638f, 0.791697f, 0.791755f, 0.791814f, 0.791872f, 0.791931f, 0.791990f, 0.792048f,
+ 0.792107f, 0.792165f, 0.792224f, 0.792282f, 0.792341f, 0.792399f, 0.792458f, 0.792516f,
+ 0.792575f, 0.792633f, 0.792691f, 0.792750f, 0.792808f, 0.792867f, 0.792925f, 0.792984f,
+ 0.793042f, 0.793100f, 0.793159f, 0.793217f, 0.793276f, 0.793334f, 0.793392f, 0.793451f,
+ 0.793509f, 0.793567f, 0.793626f, 0.793684f, 0.793742f, 0.793801f, 0.793859f, 0.793917f,
+ 0.793975f, 0.794034f, 0.794092f, 0.794150f, 0.794209f, 0.794267f, 0.794325f, 0.794383f,
+ 0.794442f, 0.794500f, 0.794558f, 0.794616f, 0.794674f, 0.794733f, 0.794791f, 0.794849f,
+ 0.794907f, 0.794965f, 0.795023f, 0.795082f, 0.795140f, 0.795198f, 0.795256f, 0.795314f,
+ 0.795372f, 0.795430f, 0.795488f, 0.795547f, 0.795605f, 0.795663f, 0.795721f, 0.795779f,
+ 0.795837f, 0.795895f, 0.795953f, 0.796011f, 0.796069f, 0.796127f, 0.796185f, 0.796243f,
+ 0.796301f, 0.796359f, 0.796417f, 0.796475f, 0.796533f, 0.796591f, 0.796649f, 0.796707f,
+ 0.796765f, 0.796823f, 0.796881f, 0.796939f, 0.796996f, 0.797054f, 0.797112f, 0.797170f,
+ 0.797228f, 0.797286f, 0.797344f, 0.797402f, 0.797459f, 0.797517f, 0.797575f, 0.797633f,
+ 0.797691f, 0.797749f, 0.797806f, 0.797864f, 0.797922f, 0.797980f, 0.798038f, 0.798095f,
+ 0.798153f, 0.798211f, 0.798269f, 0.798326f, 0.798384f, 0.798442f, 0.798500f, 0.798557f,
+ 0.798615f, 0.798673f, 0.798730f, 0.798788f, 0.798846f, 0.798903f, 0.798961f, 0.799019f,
+ 0.799076f, 0.799134f, 0.799192f, 0.799249f, 0.799307f, 0.799365f, 0.799422f, 0.799480f,
+ 0.799537f, 0.799595f, 0.799652f, 0.799710f, 0.799768f, 0.799825f, 0.799883f, 0.799940f,
+ 0.799998f, 0.800055f, 0.800113f, 0.800170f, 0.800228f, 0.800285f, 0.800343f, 0.800400f,
+ 0.800458f, 0.800515f, 0.800573f, 0.800630f, 0.800687f, 0.800745f, 0.800802f, 0.800860f,
+ 0.800917f, 0.800975f, 0.801032f, 0.801089f, 0.801147f, 0.801204f, 0.801261f, 0.801319f,
+ 0.801376f, 0.801434f, 0.801491f, 0.801548f, 0.801606f, 0.801663f, 0.801720f, 0.801777f,
+ 0.801835f, 0.801892f, 0.801949f, 0.802007f, 0.802064f, 0.802121f, 0.802178f, 0.802236f,
+ 0.802293f, 0.802350f, 0.802407f, 0.802464f, 0.802522f, 0.802579f, 0.802636f, 0.802693f,
+ 0.802750f, 0.802808f, 0.802865f, 0.802922f, 0.802979f, 0.803036f, 0.803093f, 0.803150f,
+ 0.803208f, 0.803265f, 0.803322f, 0.803379f, 0.803436f, 0.803493f, 0.803550f, 0.803607f,
+ 0.803664f, 0.803721f, 0.803778f, 0.803835f, 0.803892f, 0.803949f, 0.804006f, 0.804063f,
+ 0.804120f, 0.804177f, 0.804234f, 0.804291f, 0.804348f, 0.804405f, 0.804462f, 0.804519f,
+ 0.804576f, 0.804633f, 0.804690f, 0.804747f, 0.804804f, 0.804861f, 0.804918f, 0.804974f,
+ 0.805031f, 0.805088f, 0.805145f, 0.805202f, 0.805259f, 0.805316f, 0.805372f, 0.805429f,
+ 0.805486f, 0.805543f, 0.805600f, 0.805656f, 0.805713f, 0.805770f, 0.805827f, 0.805884f,
+ 0.805940f, 0.805997f, 0.806054f, 0.806111f, 0.806167f, 0.806224f, 0.806281f, 0.806338f,
+ 0.806394f, 0.806451f, 0.806508f, 0.806564f, 0.806621f, 0.806678f, 0.806734f, 0.806791f,
+ 0.806848f, 0.806904f, 0.806961f, 0.807017f, 0.807074f, 0.807131f, 0.807187f, 0.807244f,
+ 0.807300f, 0.807357f, 0.807414f, 0.807470f, 0.807527f, 0.807583f, 0.807640f, 0.807696f,
+ 0.807753f, 0.807809f, 0.807866f, 0.807922f, 0.807979f, 0.808035f, 0.808092f, 0.808148f,
+ 0.808205f, 0.808261f, 0.808318f, 0.808374f, 0.808430f, 0.808487f, 0.808543f, 0.808600f,
+ 0.808656f, 0.808713f, 0.808769f, 0.808825f, 0.808882f, 0.808938f, 0.808994f, 0.809051f,
+ 0.809107f, 0.809164f, 0.809220f, 0.809276f, 0.809332f, 0.809389f, 0.809445f, 0.809501f,
+ 0.809558f, 0.809614f, 0.809670f, 0.809726f, 0.809783f, 0.809839f, 0.809895f, 0.809951f,
+ 0.810008f, 0.810064f, 0.810120f, 0.810176f, 0.810232f, 0.810289f, 0.810345f, 0.810401f,
+ 0.810457f, 0.810513f, 0.810570f, 0.810626f, 0.810682f, 0.810738f, 0.810794f, 0.810850f,
+ 0.810906f, 0.810962f, 0.811018f, 0.811075f, 0.811131f, 0.811187f, 0.811243f, 0.811299f,
+ 0.811355f, 0.811411f, 0.811467f, 0.811523f, 0.811579f, 0.811635f, 0.811691f, 0.811747f,
+ 0.811803f, 0.811859f, 0.811915f, 0.811971f, 0.812027f, 0.812083f, 0.812139f, 0.812195f,
+ 0.812251f, 0.812307f, 0.812362f, 0.812418f, 0.812474f, 0.812530f, 0.812586f, 0.812642f,
+ 0.812698f, 0.812754f, 0.812809f, 0.812865f, 0.812921f, 0.812977f, 0.813033f, 0.813089f,
+ 0.813144f, 0.813200f, 0.813256f, 0.813312f, 0.813368f, 0.813423f, 0.813479f, 0.813535f,
+ 0.813591f, 0.813646f, 0.813702f, 0.813758f, 0.813814f, 0.813869f, 0.813925f, 0.813981f,
+ 0.814036f, 0.814092f, 0.814148f, 0.814203f, 0.814259f, 0.814315f, 0.814370f, 0.814426f,
+ 0.814482f, 0.814537f, 0.814593f, 0.814648f, 0.814704f, 0.814760f, 0.814815f, 0.814871f,
+ 0.814926f, 0.814982f, 0.815037f, 0.815093f, 0.815149f, 0.815204f, 0.815260f, 0.815315f,
+ 0.815371f, 0.815426f, 0.815482f, 0.815537f, 0.815593f, 0.815648f, 0.815704f, 0.815759f,
+ 0.815814f, 0.815870f, 0.815925f, 0.815981f, 0.816036f, 0.816092f, 0.816147f, 0.816202f,
+ 0.816258f, 0.816313f, 0.816368f, 0.816424f, 0.816479f, 0.816535f, 0.816590f, 0.816645f,
+ 0.816701f, 0.816756f, 0.816811f, 0.816867f, 0.816922f, 0.816977f, 0.817032f, 0.817088f,
+ 0.817143f, 0.817198f, 0.817253f, 0.817309f, 0.817364f, 0.817419f, 0.817474f, 0.817530f,
+ 0.817585f, 0.817640f, 0.817695f, 0.817750f, 0.817806f, 0.817861f, 0.817916f, 0.817971f,
+ 0.818026f, 0.818081f, 0.818137f, 0.818192f, 0.818247f, 0.818302f, 0.818357f, 0.818412f,
+ 0.818467f, 0.818522f, 0.818577f, 0.818632f, 0.818687f, 0.818742f, 0.818798f, 0.818853f,
+ 0.818908f, 0.818963f, 0.819018f, 0.819073f, 0.819128f, 0.819183f, 0.819238f, 0.819293f,
+ 0.819348f, 0.819402f, 0.819457f, 0.819512f, 0.819567f, 0.819622f, 0.819677f, 0.819732f,
+ 0.819787f, 0.819842f, 0.819897f, 0.819952f, 0.820007f, 0.820061f, 0.820116f, 0.820171f,
+ 0.820226f, 0.820281f, 0.820336f, 0.820390f, 0.820445f, 0.820500f, 0.820555f, 0.820610f,
+ 0.820664f, 0.820719f, 0.820774f, 0.820829f, 0.820884f, 0.820938f, 0.820993f, 0.821048f,
+ 0.821102f, 0.821157f, 0.821212f, 0.821267f, 0.821321f, 0.821376f, 0.821431f, 0.821485f,
+ 0.821540f, 0.821595f, 0.821649f, 0.821704f, 0.821759f, 0.821813f, 0.821868f, 0.821922f,
+ 0.821977f, 0.822032f, 0.822086f, 0.822141f, 0.822195f, 0.822250f, 0.822305f, 0.822359f,
+ 0.822414f, 0.822468f, 0.822523f, 0.822577f, 0.822632f, 0.822686f, 0.822741f, 0.822795f,
+ 0.822850f, 0.822904f, 0.822959f, 0.823013f, 0.823068f, 0.823122f, 0.823177f, 0.823231f,
+ 0.823285f, 0.823340f, 0.823394f, 0.823449f, 0.823503f, 0.823557f, 0.823612f, 0.823666f,
+ 0.823721f, 0.823775f, 0.823829f, 0.823884f, 0.823938f, 0.823992f, 0.824047f, 0.824101f,
+ 0.824155f, 0.824209f, 0.824264f, 0.824318f, 0.824372f, 0.824427f, 0.824481f, 0.824535f,
+ 0.824589f, 0.824644f, 0.824698f, 0.824752f, 0.824806f, 0.824860f, 0.824915f, 0.824969f,
+ 0.825023f, 0.825077f, 0.825131f, 0.825185f, 0.825240f, 0.825294f, 0.825348f, 0.825402f,
+ 0.825456f, 0.825510f, 0.825564f, 0.825618f, 0.825673f, 0.825727f, 0.825781f, 0.825835f,
+ 0.825889f, 0.825943f, 0.825997f, 0.826051f, 0.826105f, 0.826159f, 0.826213f, 0.826267f,
+ 0.826321f, 0.826375f, 0.826429f, 0.826483f, 0.826537f, 0.826591f, 0.826645f, 0.826699f,
+ 0.826753f, 0.826807f, 0.826861f, 0.826915f, 0.826968f, 0.827022f, 0.827076f, 0.827130f,
+ 0.827184f, 0.827238f, 0.827292f, 0.827346f, 0.827399f, 0.827453f, 0.827507f, 0.827561f,
+ 0.827615f, 0.827669f, 0.827722f, 0.827776f, 0.827830f, 0.827884f, 0.827938f, 0.827991f,
+ 0.828045f, 0.828099f, 0.828153f, 0.828206f, 0.828260f, 0.828314f, 0.828367f, 0.828421f,
+ 0.828475f, 0.828529f, 0.828582f, 0.828636f, 0.828690f, 0.828743f, 0.828797f, 0.828851f,
+ 0.828904f, 0.828958f, 0.829011f, 0.829065f, 0.829119f, 0.829172f, 0.829226f, 0.829279f,
+ 0.829333f, 0.829386f, 0.829440f, 0.829494f, 0.829547f, 0.829601f, 0.829654f, 0.829708f,
+ 0.829761f, 0.829815f, 0.829868f, 0.829922f, 0.829975f, 0.830029f, 0.830082f, 0.830136f,
+ 0.830189f, 0.830243f, 0.830296f, 0.830349f, 0.830403f, 0.830456f, 0.830510f, 0.830563f,
+ 0.830616f, 0.830670f, 0.830723f, 0.830777f, 0.830830f, 0.830883f, 0.830937f, 0.830990f,
+ 0.831043f, 0.831097f, 0.831150f, 0.831203f, 0.831257f, 0.831310f, 0.831363f, 0.831416f,
+ 0.831470f, 0.831523f, 0.831576f, 0.831629f, 0.831683f, 0.831736f, 0.831789f, 0.831842f,
+ 0.831895f, 0.831949f, 0.832002f, 0.832055f, 0.832108f, 0.832161f, 0.832215f, 0.832268f,
+ 0.832321f, 0.832374f, 0.832427f, 0.832480f, 0.832533f, 0.832586f, 0.832640f, 0.832693f,
+ 0.832746f, 0.832799f, 0.832852f, 0.832905f, 0.832958f, 0.833011f, 0.833064f, 0.833117f,
+ 0.833170f, 0.833223f, 0.833276f, 0.833329f, 0.833382f, 0.833435f, 0.833488f, 0.833541f,
+ 0.833594f, 0.833647f, 0.833700f, 0.833753f, 0.833806f, 0.833859f, 0.833912f, 0.833965f,
+ 0.834018f, 0.834070f, 0.834123f, 0.834176f, 0.834229f, 0.834282f, 0.834335f, 0.834388f,
+ 0.834440f, 0.834493f, 0.834546f, 0.834599f, 0.834652f, 0.834705f, 0.834757f, 0.834810f,
+ 0.834863f, 0.834916f, 0.834968f, 0.835021f, 0.835074f, 0.835127f, 0.835179f, 0.835232f,
+ 0.835285f, 0.835338f, 0.835390f, 0.835443f, 0.835496f, 0.835548f, 0.835601f, 0.835654f,
+ 0.835706f, 0.835759f, 0.835812f, 0.835864f, 0.835917f, 0.835969f, 0.836022f, 0.836075f,
+ 0.836127f, 0.836180f, 0.836232f, 0.836285f, 0.836338f, 0.836390f, 0.836443f, 0.836495f,
+ 0.836548f, 0.836600f, 0.836653f, 0.836705f, 0.836758f, 0.836810f, 0.836863f, 0.836915f,
+ 0.836968f, 0.837020f, 0.837073f, 0.837125f, 0.837178f, 0.837230f, 0.837282f, 0.837335f,
+ 0.837387f, 0.837440f, 0.837492f, 0.837544f, 0.837597f, 0.837649f, 0.837701f, 0.837754f,
+ 0.837806f, 0.837859f, 0.837911f, 0.837963f, 0.838015f, 0.838068f, 0.838120f, 0.838172f,
+ 0.838225f, 0.838277f, 0.838329f, 0.838382f, 0.838434f, 0.838486f, 0.838538f, 0.838591f,
+ 0.838643f, 0.838695f, 0.838747f, 0.838799f, 0.838852f, 0.838904f, 0.838956f, 0.839008f,
+ 0.839060f, 0.839112f, 0.839165f, 0.839217f, 0.839269f, 0.839321f, 0.839373f, 0.839425f,
+ 0.839477f, 0.839529f, 0.839581f, 0.839634f, 0.839686f, 0.839738f, 0.839790f, 0.839842f,
+ 0.839894f, 0.839946f, 0.839998f, 0.840050f, 0.840102f, 0.840154f, 0.840206f, 0.840258f,
+ 0.840310f, 0.840362f, 0.840414f, 0.840466f, 0.840518f, 0.840570f, 0.840622f, 0.840673f,
+ 0.840725f, 0.840777f, 0.840829f, 0.840881f, 0.840933f, 0.840985f, 0.841037f, 0.841089f,
+ 0.841140f, 0.841192f, 0.841244f, 0.841296f, 0.841348f, 0.841400f, 0.841451f, 0.841503f,
+ 0.841555f, 0.841607f, 0.841659f, 0.841710f, 0.841762f, 0.841814f, 0.841866f, 0.841917f,
+ 0.841969f, 0.842021f, 0.842072f, 0.842124f, 0.842176f, 0.842228f, 0.842279f, 0.842331f,
+ 0.842383f, 0.842434f, 0.842486f, 0.842538f, 0.842589f, 0.842641f, 0.842692f, 0.842744f,
+ 0.842796f, 0.842847f, 0.842899f, 0.842950f, 0.843002f, 0.843054f, 0.843105f, 0.843157f,
+ 0.843208f, 0.843260f, 0.843311f, 0.843363f, 0.843414f, 0.843466f, 0.843517f, 0.843569f,
+ 0.843620f, 0.843672f, 0.843723f, 0.843775f, 0.843826f, 0.843878f, 0.843929f, 0.843980f,
+ 0.844032f, 0.844083f, 0.844135f, 0.844186f, 0.844238f, 0.844289f, 0.844340f, 0.844392f,
+ 0.844443f, 0.844494f, 0.844546f, 0.844597f, 0.844648f, 0.844700f, 0.844751f, 0.844802f,
+ 0.844854f, 0.844905f, 0.844956f, 0.845007f, 0.845059f, 0.845110f, 0.845161f, 0.845212f,
+ 0.845264f, 0.845315f, 0.845366f, 0.845417f, 0.845469f, 0.845520f, 0.845571f, 0.845622f,
+ 0.845673f, 0.845724f, 0.845776f, 0.845827f, 0.845878f, 0.845929f, 0.845980f, 0.846031f,
+ 0.846082f, 0.846133f, 0.846185f, 0.846236f, 0.846287f, 0.846338f, 0.846389f, 0.846440f,
+ 0.846491f, 0.846542f, 0.846593f, 0.846644f, 0.846695f, 0.846746f, 0.846797f, 0.846848f,
+ 0.846899f, 0.846950f, 0.847001f, 0.847052f, 0.847103f, 0.847154f, 0.847205f, 0.847256f,
+ 0.847307f, 0.847358f, 0.847408f, 0.847459f, 0.847510f, 0.847561f, 0.847612f, 0.847663f,
+ 0.847714f, 0.847765f, 0.847815f, 0.847866f, 0.847917f, 0.847968f, 0.848019f, 0.848070f,
+ 0.848120f, 0.848171f, 0.848222f, 0.848273f, 0.848323f, 0.848374f, 0.848425f, 0.848476f,
+ 0.848526f, 0.848577f, 0.848628f, 0.848679f, 0.848729f, 0.848780f, 0.848831f, 0.848881f,
+ 0.848932f, 0.848983f, 0.849033f, 0.849084f, 0.849135f, 0.849185f, 0.849236f, 0.849287f,
+ 0.849337f, 0.849388f, 0.849438f, 0.849489f, 0.849540f, 0.849590f, 0.849641f, 0.849691f,
+ 0.849742f, 0.849792f, 0.849843f, 0.849893f, 0.849944f, 0.849994f, 0.850045f, 0.850095f,
+ 0.850146f, 0.850196f, 0.850247f, 0.850297f, 0.850348f, 0.850398f, 0.850449f, 0.850499f,
+ 0.850549f, 0.850600f, 0.850650f, 0.850701f, 0.850751f, 0.850801f, 0.850852f, 0.850902f,
+ 0.850953f, 0.851003f, 0.851053f, 0.851104f, 0.851154f, 0.851204f, 0.851255f, 0.851305f,
+ 0.851355f, 0.851406f, 0.851456f, 0.851506f, 0.851556f, 0.851607f, 0.851657f, 0.851707f,
+ 0.851757f, 0.851808f, 0.851858f, 0.851908f, 0.851958f, 0.852008f, 0.852059f, 0.852109f,
+ 0.852159f, 0.852209f, 0.852259f, 0.852309f, 0.852360f, 0.852410f, 0.852460f, 0.852510f,
+ 0.852560f, 0.852610f, 0.852660f, 0.852710f, 0.852760f, 0.852810f, 0.852861f, 0.852911f,
+ 0.852961f, 0.853011f, 0.853061f, 0.853111f, 0.853161f, 0.853211f, 0.853261f, 0.853311f,
+ 0.853361f, 0.853411f, 0.853461f, 0.853511f, 0.853561f, 0.853611f, 0.853660f, 0.853710f,
+ 0.853760f, 0.853810f, 0.853860f, 0.853910f, 0.853960f, 0.854010f, 0.854060f, 0.854110f,
+ 0.854159f, 0.854209f, 0.854259f, 0.854309f, 0.854359f, 0.854409f, 0.854458f, 0.854508f,
+ 0.854558f, 0.854608f, 0.854658f, 0.854707f, 0.854757f, 0.854807f, 0.854857f, 0.854906f,
+ 0.854956f, 0.855006f, 0.855056f, 0.855105f, 0.855155f, 0.855205f, 0.855254f, 0.855304f,
+ 0.855354f, 0.855403f, 0.855453f, 0.855503f, 0.855552f, 0.855602f, 0.855651f, 0.855701f,
+ 0.855751f, 0.855800f, 0.855850f, 0.855900f, 0.855949f, 0.855999f, 0.856048f, 0.856098f,
+ 0.856147f, 0.856197f, 0.856246f, 0.856296f, 0.856345f, 0.856395f, 0.856444f, 0.856494f,
+ 0.856543f, 0.856593f, 0.856642f, 0.856692f, 0.856741f, 0.856791f, 0.856840f, 0.856890f,
+ 0.856939f, 0.856988f, 0.857038f, 0.857087f, 0.857137f, 0.857186f, 0.857235f, 0.857285f,
+ 0.857334f, 0.857383f, 0.857433f, 0.857482f, 0.857531f, 0.857581f, 0.857630f, 0.857679f,
+ 0.857729f, 0.857778f, 0.857827f, 0.857876f, 0.857926f, 0.857975f, 0.858024f, 0.858073f,
+ 0.858123f, 0.858172f, 0.858221f, 0.858270f, 0.858320f, 0.858369f, 0.858418f, 0.858467f,
+ 0.858516f, 0.858565f, 0.858615f, 0.858664f, 0.858713f, 0.858762f, 0.858811f, 0.858860f,
+ 0.858909f, 0.858958f, 0.859007f, 0.859057f, 0.859106f, 0.859155f, 0.859204f, 0.859253f,
+ 0.859302f, 0.859351f, 0.859400f, 0.859449f, 0.859498f, 0.859547f, 0.859596f, 0.859645f,
+ 0.859694f, 0.859743f, 0.859792f, 0.859841f, 0.859890f, 0.859939f, 0.859988f, 0.860036f,
+ 0.860085f, 0.860134f, 0.860183f, 0.860232f, 0.860281f, 0.860330f, 0.860379f, 0.860428f,
+ 0.860476f, 0.860525f, 0.860574f, 0.860623f, 0.860672f, 0.860721f, 0.860769f, 0.860818f,
+ 0.860867f, 0.860916f, 0.860964f, 0.861013f, 0.861062f, 0.861111f, 0.861160f, 0.861208f,
+ 0.861257f, 0.861306f, 0.861354f, 0.861403f, 0.861452f, 0.861500f, 0.861549f, 0.861598f,
+ 0.861646f, 0.861695f, 0.861744f, 0.861792f, 0.861841f, 0.861890f, 0.861938f, 0.861987f,
+ 0.862035f, 0.862084f, 0.862133f, 0.862181f, 0.862230f, 0.862278f, 0.862327f, 0.862375f,
+ 0.862424f, 0.862472f, 0.862521f, 0.862570f, 0.862618f, 0.862666f, 0.862715f, 0.862763f,
+ 0.862812f, 0.862860f, 0.862909f, 0.862957f, 0.863006f, 0.863054f, 0.863103f, 0.863151f,
+ 0.863199f, 0.863248f, 0.863296f, 0.863345f, 0.863393f, 0.863441f, 0.863490f, 0.863538f,
+ 0.863586f, 0.863635f, 0.863683f, 0.863731f, 0.863780f, 0.863828f, 0.863876f, 0.863925f,
+ 0.863973f, 0.864021f, 0.864069f, 0.864118f, 0.864166f, 0.864214f, 0.864262f, 0.864311f,
+ 0.864359f, 0.864407f, 0.864455f, 0.864503f, 0.864552f, 0.864600f, 0.864648f, 0.864696f,
+ 0.864744f, 0.864792f, 0.864841f, 0.864889f, 0.864937f, 0.864985f, 0.865033f, 0.865081f,
+ 0.865129f, 0.865177f, 0.865225f, 0.865273f, 0.865321f, 0.865369f, 0.865418f, 0.865466f,
+ 0.865514f, 0.865562f, 0.865610f, 0.865658f, 0.865706f, 0.865754f, 0.865802f, 0.865850f,
+ 0.865898f, 0.865946f, 0.865993f, 0.866041f, 0.866089f, 0.866137f, 0.866185f, 0.866233f,
+ 0.866281f, 0.866329f, 0.866377f, 0.866425f, 0.866472f, 0.866520f, 0.866568f, 0.866616f,
+ 0.866664f, 0.866712f, 0.866759f, 0.866807f, 0.866855f, 0.866903f, 0.866951f, 0.866998f,
+ 0.867046f, 0.867094f, 0.867142f, 0.867190f, 0.867237f, 0.867285f, 0.867333f, 0.867380f,
+ 0.867428f, 0.867476f, 0.867523f, 0.867571f, 0.867619f, 0.867667f, 0.867714f, 0.867762f,
+ 0.867809f, 0.867857f, 0.867905f, 0.867952f, 0.868000f, 0.868048f, 0.868095f, 0.868143f,
+ 0.868190f, 0.868238f, 0.868285f, 0.868333f, 0.868381f, 0.868428f, 0.868476f, 0.868523f,
+ 0.868571f, 0.868618f, 0.868666f, 0.868713f, 0.868761f, 0.868808f, 0.868856f, 0.868903f,
+ 0.868951f, 0.868998f, 0.869045f, 0.869093f, 0.869140f, 0.869188f, 0.869235f, 0.869282f,
+ 0.869330f, 0.869377f, 0.869425f, 0.869472f, 0.869519f, 0.869567f, 0.869614f, 0.869661f,
+ 0.869709f, 0.869756f, 0.869803f, 0.869851f, 0.869898f, 0.869945f, 0.869992f, 0.870040f,
+ 0.870087f, 0.870134f, 0.870182f, 0.870229f, 0.870276f, 0.870323f, 0.870370f, 0.870418f,
+ 0.870465f, 0.870512f, 0.870559f, 0.870606f, 0.870654f, 0.870701f, 0.870748f, 0.870795f,
+ 0.870842f, 0.870889f, 0.870936f, 0.870983f, 0.871031f, 0.871078f, 0.871125f, 0.871172f,
+ 0.871219f, 0.871266f, 0.871313f, 0.871360f, 0.871407f, 0.871454f, 0.871501f, 0.871548f,
+ 0.871595f, 0.871642f, 0.871689f, 0.871736f, 0.871783f, 0.871830f, 0.871877f, 0.871924f,
+ 0.871971f, 0.872018f, 0.872065f, 0.872112f, 0.872159f, 0.872205f, 0.872252f, 0.872299f,
+ 0.872346f, 0.872393f, 0.872440f, 0.872487f, 0.872534f, 0.872580f, 0.872627f, 0.872674f,
+ 0.872721f, 0.872768f, 0.872814f, 0.872861f, 0.872908f, 0.872955f, 0.873001f, 0.873048f,
+ 0.873095f, 0.873142f, 0.873188f, 0.873235f, 0.873282f, 0.873329f, 0.873375f, 0.873422f,
+ 0.873469f, 0.873515f, 0.873562f, 0.873609f, 0.873655f, 0.873702f, 0.873749f, 0.873795f,
+ 0.873842f, 0.873888f, 0.873935f, 0.873982f, 0.874028f, 0.874075f, 0.874121f, 0.874168f,
+ 0.874215f, 0.874261f, 0.874308f, 0.874354f, 0.874401f, 0.874447f, 0.874494f, 0.874540f,
+ 0.874587f, 0.874633f, 0.874680f, 0.874726f, 0.874773f, 0.874819f, 0.874865f, 0.874912f,
+ 0.874958f, 0.875005f, 0.875051f, 0.875098f, 0.875144f, 0.875190f, 0.875237f, 0.875283f,
+ 0.875329f, 0.875376f, 0.875422f, 0.875468f, 0.875515f, 0.875561f, 0.875607f, 0.875654f,
+ 0.875700f, 0.875746f, 0.875793f, 0.875839f, 0.875885f, 0.875931f, 0.875978f, 0.876024f,
+ 0.876070f, 0.876116f, 0.876163f, 0.876209f, 0.876255f, 0.876301f, 0.876347f, 0.876393f,
+ 0.876440f, 0.876486f, 0.876532f, 0.876578f, 0.876624f, 0.876670f, 0.876716f, 0.876763f,
+ 0.876809f, 0.876855f, 0.876901f, 0.876947f, 0.876993f, 0.877039f, 0.877085f, 0.877131f,
+ 0.877177f, 0.877223f, 0.877269f, 0.877315f, 0.877361f, 0.877407f, 0.877453f, 0.877499f,
+ 0.877545f, 0.877591f, 0.877637f, 0.877683f, 0.877729f, 0.877775f, 0.877821f, 0.877867f,
+ 0.877913f, 0.877959f, 0.878005f, 0.878051f, 0.878096f, 0.878142f, 0.878188f, 0.878234f,
+ 0.878280f, 0.878326f, 0.878371f, 0.878417f, 0.878463f, 0.878509f, 0.878555f, 0.878600f,
+ 0.878646f, 0.878692f, 0.878738f, 0.878784f, 0.878829f, 0.878875f, 0.878921f, 0.878967f,
+ 0.879012f, 0.879058f, 0.879104f, 0.879149f, 0.879195f, 0.879241f, 0.879286f, 0.879332f,
+ 0.879378f, 0.879423f, 0.879469f, 0.879515f, 0.879560f, 0.879606f, 0.879651f, 0.879697f,
+ 0.879743f, 0.879788f, 0.879834f, 0.879879f, 0.879925f, 0.879970f, 0.880016f, 0.880061f,
+ 0.880107f, 0.880153f, 0.880198f, 0.880244f, 0.880289f, 0.880334f, 0.880380f, 0.880425f,
+ 0.880471f, 0.880516f, 0.880562f, 0.880607f, 0.880653f, 0.880698f, 0.880743f, 0.880789f,
+ 0.880834f, 0.880880f, 0.880925f, 0.880970f, 0.881016f, 0.881061f, 0.881106f, 0.881152f,
+ 0.881197f, 0.881242f, 0.881288f, 0.881333f, 0.881378f, 0.881424f, 0.881469f, 0.881514f,
+ 0.881559f, 0.881605f, 0.881650f, 0.881695f, 0.881740f, 0.881786f, 0.881831f, 0.881876f,
+ 0.881921f, 0.881966f, 0.882012f, 0.882057f, 0.882102f, 0.882147f, 0.882192f, 0.882237f,
+ 0.882283f, 0.882328f, 0.882373f, 0.882418f, 0.882463f, 0.882508f, 0.882553f, 0.882598f,
+ 0.882643f, 0.882688f, 0.882733f, 0.882779f, 0.882824f, 0.882869f, 0.882914f, 0.882959f,
+ 0.883004f, 0.883049f, 0.883094f, 0.883139f, 0.883184f, 0.883228f, 0.883273f, 0.883318f,
+ 0.883363f, 0.883408f, 0.883453f, 0.883498f, 0.883543f, 0.883588f, 0.883633f, 0.883678f,
+ 0.883723f, 0.883767f, 0.883812f, 0.883857f, 0.883902f, 0.883947f, 0.883992f, 0.884036f,
+ 0.884081f, 0.884126f, 0.884171f, 0.884216f, 0.884260f, 0.884305f, 0.884350f, 0.884395f,
+ 0.884439f, 0.884484f, 0.884529f, 0.884574f, 0.884618f, 0.884663f, 0.884708f, 0.884752f,
+ 0.884797f, 0.884842f, 0.884886f, 0.884931f, 0.884976f, 0.885020f, 0.885065f, 0.885110f,
+ 0.885154f, 0.885199f, 0.885243f, 0.885288f, 0.885333f, 0.885377f, 0.885422f, 0.885466f,
+ 0.885511f, 0.885555f, 0.885600f, 0.885644f, 0.885689f, 0.885733f, 0.885778f, 0.885822f,
+ 0.885867f, 0.885911f, 0.885956f, 0.886000f, 0.886045f, 0.886089f, 0.886134f, 0.886178f,
+ 0.886223f, 0.886267f, 0.886311f, 0.886356f, 0.886400f, 0.886445f, 0.886489f, 0.886533f,
+ 0.886578f, 0.886622f, 0.886666f, 0.886711f, 0.886755f, 0.886799f, 0.886844f, 0.886888f,
+ 0.886932f, 0.886976f, 0.887021f, 0.887065f, 0.887109f, 0.887153f, 0.887198f, 0.887242f,
+ 0.887286f, 0.887330f, 0.887375f, 0.887419f, 0.887463f, 0.887507f, 0.887551f, 0.887595f,
+ 0.887640f, 0.887684f, 0.887728f, 0.887772f, 0.887816f, 0.887860f, 0.887904f, 0.887949f,
+ 0.887993f, 0.888037f, 0.888081f, 0.888125f, 0.888169f, 0.888213f, 0.888257f, 0.888301f,
+ 0.888345f, 0.888389f, 0.888433f, 0.888477f, 0.888521f, 0.888565f, 0.888609f, 0.888653f,
+ 0.888697f, 0.888741f, 0.888785f, 0.888829f, 0.888873f, 0.888917f, 0.888961f, 0.889004f,
+ 0.889048f, 0.889092f, 0.889136f, 0.889180f, 0.889224f, 0.889268f, 0.889312f, 0.889355f,
+ 0.889399f, 0.889443f, 0.889487f, 0.889531f, 0.889574f, 0.889618f, 0.889662f, 0.889706f,
+ 0.889750f, 0.889793f, 0.889837f, 0.889881f, 0.889925f, 0.889968f, 0.890012f, 0.890056f,
+ 0.890099f, 0.890143f, 0.890187f, 0.890230f, 0.890274f, 0.890318f, 0.890361f, 0.890405f,
+ 0.890449f, 0.890492f, 0.890536f, 0.890580f, 0.890623f, 0.890667f, 0.890710f, 0.890754f,
+ 0.890797f, 0.890841f, 0.890885f, 0.890928f, 0.890972f, 0.891015f, 0.891059f, 0.891102f,
+ 0.891146f, 0.891189f, 0.891233f, 0.891276f, 0.891320f, 0.891363f, 0.891407f, 0.891450f,
+ 0.891493f, 0.891537f, 0.891580f, 0.891624f, 0.891667f, 0.891711f, 0.891754f, 0.891797f,
+ 0.891841f, 0.891884f, 0.891927f, 0.891971f, 0.892014f, 0.892057f, 0.892101f, 0.892144f,
+ 0.892187f, 0.892231f, 0.892274f, 0.892317f, 0.892361f, 0.892404f, 0.892447f, 0.892490f,
+ 0.892534f, 0.892577f, 0.892620f, 0.892663f, 0.892706f, 0.892750f, 0.892793f, 0.892836f,
+ 0.892879f, 0.892922f, 0.892965f, 0.893009f, 0.893052f, 0.893095f, 0.893138f, 0.893181f,
+ 0.893224f, 0.893267f, 0.893310f, 0.893354f, 0.893397f, 0.893440f, 0.893483f, 0.893526f,
+ 0.893569f, 0.893612f, 0.893655f, 0.893698f, 0.893741f, 0.893784f, 0.893827f, 0.893870f,
+ 0.893913f, 0.893956f, 0.893999f, 0.894042f, 0.894085f, 0.894128f, 0.894171f, 0.894214f,
+ 0.894256f, 0.894299f, 0.894342f, 0.894385f, 0.894428f, 0.894471f, 0.894514f, 0.894557f,
+ 0.894599f, 0.894642f, 0.894685f, 0.894728f, 0.894771f, 0.894814f, 0.894856f, 0.894899f,
+ 0.894942f, 0.894985f, 0.895028f, 0.895070f, 0.895113f, 0.895156f, 0.895198f, 0.895241f,
+ 0.895284f, 0.895327f, 0.895369f, 0.895412f, 0.895455f, 0.895497f, 0.895540f, 0.895583f,
+ 0.895625f, 0.895668f, 0.895711f, 0.895753f, 0.895796f, 0.895838f, 0.895881f, 0.895924f,
+ 0.895966f, 0.896009f, 0.896051f, 0.896094f, 0.896137f, 0.896179f, 0.896222f, 0.896264f,
+ 0.896307f, 0.896349f, 0.896392f, 0.896434f, 0.896477f, 0.896519f, 0.896562f, 0.896604f,
+ 0.896646f, 0.896689f, 0.896731f, 0.896774f, 0.896816f, 0.896859f, 0.896901f, 0.896943f,
+ 0.896986f, 0.897028f, 0.897071f, 0.897113f, 0.897155f, 0.897198f, 0.897240f, 0.897282f,
+ 0.897325f, 0.897367f, 0.897409f, 0.897452f, 0.897494f, 0.897536f, 0.897578f, 0.897621f,
+ 0.897663f, 0.897705f, 0.897747f, 0.897790f, 0.897832f, 0.897874f, 0.897916f, 0.897958f,
+ 0.898001f, 0.898043f, 0.898085f, 0.898127f, 0.898169f, 0.898211f, 0.898254f, 0.898296f,
+ 0.898338f, 0.898380f, 0.898422f, 0.898464f, 0.898506f, 0.898548f, 0.898590f, 0.898632f,
+ 0.898674f, 0.898717f, 0.898759f, 0.898801f, 0.898843f, 0.898885f, 0.898927f, 0.898969f,
+ 0.899011f, 0.899053f, 0.899095f, 0.899137f, 0.899179f, 0.899220f, 0.899262f, 0.899304f,
+ 0.899346f, 0.899388f, 0.899430f, 0.899472f, 0.899514f, 0.899556f, 0.899598f, 0.899639f,
+ 0.899681f, 0.899723f, 0.899765f, 0.899807f, 0.899849f, 0.899890f, 0.899932f, 0.899974f,
+ 0.900016f, 0.900058f, 0.900099f, 0.900141f, 0.900183f, 0.900225f, 0.900266f, 0.900308f,
+ 0.900350f, 0.900392f, 0.900433f, 0.900475f, 0.900517f, 0.900558f, 0.900600f, 0.900642f,
+ 0.900683f, 0.900725f, 0.900767f, 0.900808f, 0.900850f, 0.900892f, 0.900933f, 0.900975f,
+ 0.901016f, 0.901058f, 0.901100f, 0.901141f, 0.901183f, 0.901224f, 0.901266f, 0.901307f,
+ 0.901349f, 0.901390f, 0.901432f, 0.901473f, 0.901515f, 0.901556f, 0.901598f, 0.901639f,
+ 0.901681f, 0.901722f, 0.901764f, 0.901805f, 0.901847f, 0.901888f, 0.901929f, 0.901971f,
+ 0.902012f, 0.902054f, 0.902095f, 0.902136f, 0.902178f, 0.902219f, 0.902260f, 0.902302f,
+ 0.902343f, 0.902384f, 0.902426f, 0.902467f, 0.902508f, 0.902550f, 0.902591f, 0.902632f,
+ 0.902673f, 0.902715f, 0.902756f, 0.902797f, 0.902838f, 0.902879f, 0.902921f, 0.902962f,
+ 0.903003f, 0.903044f, 0.903085f, 0.903127f, 0.903168f, 0.903209f, 0.903250f, 0.903291f,
+ 0.903332f, 0.903373f, 0.903415f, 0.903456f, 0.903497f, 0.903538f, 0.903579f, 0.903620f,
+ 0.903661f, 0.903702f, 0.903743f, 0.903784f, 0.903825f, 0.903866f, 0.903907f, 0.903948f,
+ 0.903989f, 0.904030f, 0.904071f, 0.904112f, 0.904153f, 0.904194f, 0.904235f, 0.904276f,
+ 0.904317f, 0.904358f, 0.904399f, 0.904440f, 0.904481f, 0.904521f, 0.904562f, 0.904603f,
+ 0.904644f, 0.904685f, 0.904726f, 0.904767f, 0.904807f, 0.904848f, 0.904889f, 0.904930f,
+ 0.904971f, 0.905011f, 0.905052f, 0.905093f, 0.905134f, 0.905175f, 0.905215f, 0.905256f,
+ 0.905297f, 0.905337f, 0.905378f, 0.905419f, 0.905460f, 0.905500f, 0.905541f, 0.905582f,
+ 0.905622f, 0.905663f, 0.905704f, 0.905744f, 0.905785f, 0.905825f, 0.905866f, 0.905907f,
+ 0.905947f, 0.905988f, 0.906028f, 0.906069f, 0.906110f, 0.906150f, 0.906191f, 0.906231f,
+ 0.906272f, 0.906312f, 0.906353f, 0.906393f, 0.906434f, 0.906474f, 0.906515f, 0.906555f,
+ 0.906596f, 0.906636f, 0.906677f, 0.906717f, 0.906757f, 0.906798f, 0.906838f, 0.906879f,
+ 0.906919f, 0.906959f, 0.907000f, 0.907040f, 0.907081f, 0.907121f, 0.907161f, 0.907202f,
+ 0.907242f, 0.907282f, 0.907323f, 0.907363f, 0.907403f, 0.907444f, 0.907484f, 0.907524f,
+ 0.907564f, 0.907605f, 0.907645f, 0.907685f, 0.907725f, 0.907766f, 0.907806f, 0.907846f,
+ 0.907886f, 0.907926f, 0.907966f, 0.908007f, 0.908047f, 0.908087f, 0.908127f, 0.908167f,
+ 0.908207f, 0.908248f, 0.908288f, 0.908328f, 0.908368f, 0.908408f, 0.908448f, 0.908488f,
+ 0.908528f, 0.908568f, 0.908608f, 0.908648f, 0.908688f, 0.908728f, 0.908768f, 0.908808f,
+ 0.908848f, 0.908888f, 0.908928f, 0.908968f, 0.909008f, 0.909048f, 0.909088f, 0.909128f,
+ 0.909168f, 0.909208f, 0.909248f, 0.909288f, 0.909328f, 0.909368f, 0.909407f, 0.909447f,
+ 0.909487f, 0.909527f, 0.909567f, 0.909607f, 0.909646f, 0.909686f, 0.909726f, 0.909766f,
+ 0.909806f, 0.909845f, 0.909885f, 0.909925f, 0.909965f, 0.910005f, 0.910044f, 0.910084f,
+ 0.910124f, 0.910163f, 0.910203f, 0.910243f, 0.910283f, 0.910322f, 0.910362f, 0.910402f,
+ 0.910441f, 0.910481f, 0.910521f, 0.910560f, 0.910600f, 0.910639f, 0.910679f, 0.910719f,
+ 0.910758f, 0.910798f, 0.910837f, 0.910877f, 0.910917f, 0.910956f, 0.910996f, 0.911035f,
+ 0.911075f, 0.911114f, 0.911154f, 0.911193f, 0.911233f, 0.911272f, 0.911312f, 0.911351f,
+ 0.911391f, 0.911430f, 0.911470f, 0.911509f, 0.911548f, 0.911588f, 0.911627f, 0.911667f,
+ 0.911706f, 0.911745f, 0.911785f, 0.911824f, 0.911864f, 0.911903f, 0.911942f, 0.911982f,
+ 0.912021f, 0.912060f, 0.912099f, 0.912139f, 0.912178f, 0.912217f, 0.912257f, 0.912296f,
+ 0.912335f, 0.912374f, 0.912414f, 0.912453f, 0.912492f, 0.912531f, 0.912571f, 0.912610f,
+ 0.912649f, 0.912688f, 0.912727f, 0.912766f, 0.912806f, 0.912845f, 0.912884f, 0.912923f,
+ 0.912962f, 0.913001f, 0.913040f, 0.913080f, 0.913119f, 0.913158f, 0.913197f, 0.913236f,
+ 0.913275f, 0.913314f, 0.913353f, 0.913392f, 0.913431f, 0.913470f, 0.913509f, 0.913548f,
+ 0.913587f, 0.913626f, 0.913665f, 0.913704f, 0.913743f, 0.913782f, 0.913821f, 0.913860f,
+ 0.913899f, 0.913938f, 0.913976f, 0.914015f, 0.914054f, 0.914093f, 0.914132f, 0.914171f,
+ 0.914210f, 0.914249f, 0.914287f, 0.914326f, 0.914365f, 0.914404f, 0.914443f, 0.914482f,
+ 0.914520f, 0.914559f, 0.914598f, 0.914637f, 0.914675f, 0.914714f, 0.914753f, 0.914792f,
+ 0.914830f, 0.914869f, 0.914908f, 0.914946f, 0.914985f, 0.915024f, 0.915062f, 0.915101f,
+ 0.915140f, 0.915178f, 0.915217f, 0.915256f, 0.915294f, 0.915333f, 0.915372f, 0.915410f,
+ 0.915449f, 0.915487f, 0.915526f, 0.915564f, 0.915603f, 0.915642f, 0.915680f, 0.915719f,
+ 0.915757f, 0.915796f, 0.915834f, 0.915873f, 0.915911f, 0.915950f, 0.915988f, 0.916027f,
+ 0.916065f, 0.916103f, 0.916142f, 0.916180f, 0.916219f, 0.916257f, 0.916296f, 0.916334f,
+ 0.916372f, 0.916411f, 0.916449f, 0.916487f, 0.916526f, 0.916564f, 0.916602f, 0.916641f,
+ 0.916679f, 0.916717f, 0.916756f, 0.916794f, 0.916832f, 0.916871f, 0.916909f, 0.916947f,
+ 0.916985f, 0.917024f, 0.917062f, 0.917100f, 0.917138f, 0.917176f, 0.917215f, 0.917253f,
+ 0.917291f, 0.917329f, 0.917367f, 0.917405f, 0.917444f, 0.917482f, 0.917520f, 0.917558f,
+ 0.917596f, 0.917634f, 0.917672f, 0.917710f, 0.917749f, 0.917787f, 0.917825f, 0.917863f,
+ 0.917901f, 0.917939f, 0.917977f, 0.918015f, 0.918053f, 0.918091f, 0.918129f, 0.918167f,
+ 0.918205f, 0.918243f, 0.918281f, 0.918319f, 0.918357f, 0.918395f, 0.918433f, 0.918471f,
+ 0.918508f, 0.918546f, 0.918584f, 0.918622f, 0.918660f, 0.918698f, 0.918736f, 0.918774f,
+ 0.918811f, 0.918849f, 0.918887f, 0.918925f, 0.918963f, 0.919001f, 0.919038f, 0.919076f,
+ 0.919114f, 0.919152f, 0.919189f, 0.919227f, 0.919265f, 0.919303f, 0.919340f, 0.919378f,
+ 0.919416f, 0.919453f, 0.919491f, 0.919529f, 0.919567f, 0.919604f, 0.919642f, 0.919680f,
+ 0.919717f, 0.919755f, 0.919792f, 0.919830f, 0.919868f, 0.919905f, 0.919943f, 0.919980f,
+ 0.920018f, 0.920056f, 0.920093f, 0.920131f, 0.920168f, 0.920206f, 0.920243f, 0.920281f,
+ 0.920318f, 0.920356f, 0.920393f, 0.920431f, 0.920468f, 0.920506f, 0.920543f, 0.920581f,
+ 0.920618f, 0.920655f, 0.920693f, 0.920730f, 0.920768f, 0.920805f, 0.920842f, 0.920880f,
+ 0.920917f, 0.920955f, 0.920992f, 0.921029f, 0.921067f, 0.921104f, 0.921141f, 0.921179f,
+ 0.921216f, 0.921253f, 0.921291f, 0.921328f, 0.921365f, 0.921402f, 0.921440f, 0.921477f,
+ 0.921514f, 0.921551f, 0.921588f, 0.921626f, 0.921663f, 0.921700f, 0.921737f, 0.921774f,
+ 0.921812f, 0.921849f, 0.921886f, 0.921923f, 0.921960f, 0.921997f, 0.922034f, 0.922072f,
+ 0.922109f, 0.922146f, 0.922183f, 0.922220f, 0.922257f, 0.922294f, 0.922331f, 0.922368f,
+ 0.922405f, 0.922442f, 0.922479f, 0.922516f, 0.922553f, 0.922590f, 0.922627f, 0.922664f,
+ 0.922701f, 0.922738f, 0.922775f, 0.922812f, 0.922849f, 0.922886f, 0.922923f, 0.922960f,
+ 0.922997f, 0.923033f, 0.923070f, 0.923107f, 0.923144f, 0.923181f, 0.923218f, 0.923255f,
+ 0.923291f, 0.923328f, 0.923365f, 0.923402f, 0.923439f, 0.923475f, 0.923512f, 0.923549f,
+ 0.923586f, 0.923622f, 0.923659f, 0.923696f, 0.923733f, 0.923769f, 0.923806f, 0.923843f,
+ 0.923880f, 0.923916f, 0.923953f, 0.923990f, 0.924026f, 0.924063f, 0.924100f, 0.924136f,
+ 0.924173f, 0.924209f, 0.924246f, 0.924283f, 0.924319f, 0.924356f, 0.924392f, 0.924429f,
+ 0.924465f, 0.924502f, 0.924539f, 0.924575f, 0.924612f, 0.924648f, 0.924685f, 0.924721f,
+ 0.924758f, 0.924794f, 0.924831f, 0.924867f, 0.924904f, 0.924940f, 0.924976f, 0.925013f,
+ 0.925049f, 0.925086f, 0.925122f, 0.925158f, 0.925195f, 0.925231f, 0.925268f, 0.925304f,
+ 0.925340f, 0.925377f, 0.925413f, 0.925449f, 0.925486f, 0.925522f, 0.925558f, 0.925595f,
+ 0.925631f, 0.925667f, 0.925703f, 0.925740f, 0.925776f, 0.925812f, 0.925848f, 0.925885f,
+ 0.925921f, 0.925957f, 0.925993f, 0.926029f, 0.926066f, 0.926102f, 0.926138f, 0.926174f,
+ 0.926210f, 0.926246f, 0.926283f, 0.926319f, 0.926355f, 0.926391f, 0.926427f, 0.926463f,
+ 0.926499f, 0.926535f, 0.926571f, 0.926607f, 0.926643f, 0.926679f, 0.926715f, 0.926751f,
+ 0.926787f, 0.926823f, 0.926859f, 0.926895f, 0.926931f, 0.926967f, 0.927003f, 0.927039f,
+ 0.927075f, 0.927111f, 0.927147f, 0.927183f, 0.927219f, 0.927255f, 0.927291f, 0.927327f,
+ 0.927363f, 0.927398f, 0.927434f, 0.927470f, 0.927506f, 0.927542f, 0.927578f, 0.927613f,
+ 0.927649f, 0.927685f, 0.927721f, 0.927757f, 0.927792f, 0.927828f, 0.927864f, 0.927900f,
+ 0.927935f, 0.927971f, 0.928007f, 0.928043f, 0.928078f, 0.928114f, 0.928150f, 0.928185f,
+ 0.928221f, 0.928257f, 0.928292f, 0.928328f, 0.928364f, 0.928399f, 0.928435f, 0.928470f,
+ 0.928506f, 0.928542f, 0.928577f, 0.928613f, 0.928648f, 0.928684f, 0.928720f, 0.928755f,
+ 0.928791f, 0.928826f, 0.928862f, 0.928897f, 0.928933f, 0.928968f, 0.929004f, 0.929039f,
+ 0.929075f, 0.929110f, 0.929146f, 0.929181f, 0.929216f, 0.929252f, 0.929287f, 0.929323f,
+ 0.929358f, 0.929393f, 0.929429f, 0.929464f, 0.929500f, 0.929535f, 0.929570f, 0.929606f,
+ 0.929641f, 0.929676f, 0.929712f, 0.929747f, 0.929782f, 0.929817f, 0.929853f, 0.929888f,
+ 0.929923f, 0.929958f, 0.929994f, 0.930029f, 0.930064f, 0.930099f, 0.930135f, 0.930170f,
+ 0.930205f, 0.930240f, 0.930275f, 0.930311f, 0.930346f, 0.930381f, 0.930416f, 0.930451f,
+ 0.930486f, 0.930521f, 0.930556f, 0.930592f, 0.930627f, 0.930662f, 0.930697f, 0.930732f,
+ 0.930767f, 0.930802f, 0.930837f, 0.930872f, 0.930907f, 0.930942f, 0.930977f, 0.931012f,
+ 0.931047f, 0.931082f, 0.931117f, 0.931152f, 0.931187f, 0.931222f, 0.931257f, 0.931292f,
+ 0.931327f, 0.931362f, 0.931397f, 0.931431f, 0.931466f, 0.931501f, 0.931536f, 0.931571f,
+ 0.931606f, 0.931641f, 0.931675f, 0.931710f, 0.931745f, 0.931780f, 0.931815f, 0.931849f,
+ 0.931884f, 0.931919f, 0.931954f, 0.931989f, 0.932023f, 0.932058f, 0.932093f, 0.932128f,
+ 0.932162f, 0.932197f, 0.932232f, 0.932266f, 0.932301f, 0.932336f, 0.932370f, 0.932405f,
+ 0.932440f, 0.932474f, 0.932509f, 0.932544f, 0.932578f, 0.932613f, 0.932647f, 0.932682f,
+ 0.932716f, 0.932751f, 0.932786f, 0.932820f, 0.932855f, 0.932889f, 0.932924f, 0.932958f,
+ 0.932993f, 0.933027f, 0.933062f, 0.933096f, 0.933131f, 0.933165f, 0.933200f, 0.933234f,
+ 0.933269f, 0.933303f, 0.933337f, 0.933372f, 0.933406f, 0.933441f, 0.933475f, 0.933509f,
+ 0.933544f, 0.933578f, 0.933612f, 0.933647f, 0.933681f, 0.933716f, 0.933750f, 0.933784f,
+ 0.933818f, 0.933853f, 0.933887f, 0.933921f, 0.933956f, 0.933990f, 0.934024f, 0.934058f,
+ 0.934093f, 0.934127f, 0.934161f, 0.934195f, 0.934229f, 0.934264f, 0.934298f, 0.934332f,
+ 0.934366f, 0.934400f, 0.934434f, 0.934469f, 0.934503f, 0.934537f, 0.934571f, 0.934605f,
+ 0.934639f, 0.934673f, 0.934707f, 0.934741f, 0.934775f, 0.934810f, 0.934844f, 0.934878f,
+ 0.934912f, 0.934946f, 0.934980f, 0.935014f, 0.935048f, 0.935082f, 0.935116f, 0.935150f,
+ 0.935184f, 0.935217f, 0.935251f, 0.935285f, 0.935319f, 0.935353f, 0.935387f, 0.935421f,
+ 0.935455f, 0.935489f, 0.935523f, 0.935556f, 0.935590f, 0.935624f, 0.935658f, 0.935692f,
+ 0.935726f, 0.935759f, 0.935793f, 0.935827f, 0.935861f, 0.935895f, 0.935928f, 0.935962f,
+ 0.935996f, 0.936030f, 0.936063f, 0.936097f, 0.936131f, 0.936165f, 0.936198f, 0.936232f,
+ 0.936266f, 0.936299f, 0.936333f, 0.936367f, 0.936400f, 0.936434f, 0.936468f, 0.936501f,
+ 0.936535f, 0.936568f, 0.936602f, 0.936636f, 0.936669f, 0.936703f, 0.936736f, 0.936770f,
+ 0.936803f, 0.936837f, 0.936871f, 0.936904f, 0.936938f, 0.936971f, 0.937005f, 0.937038f,
+ 0.937072f, 0.937105f, 0.937138f, 0.937172f, 0.937205f, 0.937239f, 0.937272f, 0.937306f,
+ 0.937339f, 0.937372f, 0.937406f, 0.937439f, 0.937473f, 0.937506f, 0.937539f, 0.937573f,
+ 0.937606f, 0.937639f, 0.937673f, 0.937706f, 0.937739f, 0.937773f, 0.937806f, 0.937839f,
+ 0.937872f, 0.937906f, 0.937939f, 0.937972f, 0.938005f, 0.938039f, 0.938072f, 0.938105f,
+ 0.938138f, 0.938171f, 0.938205f, 0.938238f, 0.938271f, 0.938304f, 0.938337f, 0.938370f,
+ 0.938404f, 0.938437f, 0.938470f, 0.938503f, 0.938536f, 0.938569f, 0.938602f, 0.938635f,
+ 0.938668f, 0.938701f, 0.938734f, 0.938767f, 0.938800f, 0.938833f, 0.938866f, 0.938900f,
+ 0.938932f, 0.938965f, 0.938998f, 0.939031f, 0.939064f, 0.939097f, 0.939130f, 0.939163f,
+ 0.939196f, 0.939229f, 0.939262f, 0.939295f, 0.939328f, 0.939361f, 0.939394f, 0.939426f,
+ 0.939459f, 0.939492f, 0.939525f, 0.939558f, 0.939591f, 0.939623f, 0.939656f, 0.939689f,
+ 0.939722f, 0.939755f, 0.939787f, 0.939820f, 0.939853f, 0.939886f, 0.939918f, 0.939951f,
+ 0.939984f, 0.940016f, 0.940049f, 0.940082f, 0.940115f, 0.940147f, 0.940180f, 0.940213f,
+ 0.940245f, 0.940278f, 0.940310f, 0.940343f, 0.940376f, 0.940408f, 0.940441f, 0.940473f,
+ 0.940506f, 0.940539f, 0.940571f, 0.940604f, 0.940636f, 0.940669f, 0.940701f, 0.940734f,
+ 0.940766f, 0.940799f, 0.940831f, 0.940864f, 0.940896f, 0.940929f, 0.940961f, 0.940994f,
+ 0.941026f, 0.941059f, 0.941091f, 0.941123f, 0.941156f, 0.941188f, 0.941221f, 0.941253f,
+ 0.941285f, 0.941318f, 0.941350f, 0.941382f, 0.941415f, 0.941447f, 0.941479f, 0.941512f,
+ 0.941544f, 0.941576f, 0.941609f, 0.941641f, 0.941673f, 0.941705f, 0.941738f, 0.941770f,
+ 0.941802f, 0.941834f, 0.941867f, 0.941899f, 0.941931f, 0.941963f, 0.941995f, 0.942028f,
+ 0.942060f, 0.942092f, 0.942124f, 0.942156f, 0.942188f, 0.942220f, 0.942253f, 0.942285f,
+ 0.942317f, 0.942349f, 0.942381f, 0.942413f, 0.942445f, 0.942477f, 0.942509f, 0.942541f,
+ 0.942573f, 0.942605f, 0.942637f, 0.942669f, 0.942701f, 0.942733f, 0.942765f, 0.942797f,
+ 0.942829f, 0.942861f, 0.942893f, 0.942925f, 0.942957f, 0.942989f, 0.943021f, 0.943053f,
+ 0.943084f, 0.943116f, 0.943148f, 0.943180f, 0.943212f, 0.943244f, 0.943276f, 0.943307f,
+ 0.943339f, 0.943371f, 0.943403f, 0.943435f, 0.943466f, 0.943498f, 0.943530f, 0.943562f,
+ 0.943593f, 0.943625f, 0.943657f, 0.943689f, 0.943720f, 0.943752f, 0.943784f, 0.943815f,
+ 0.943847f, 0.943879f, 0.943910f, 0.943942f, 0.943974f, 0.944005f, 0.944037f, 0.944069f,
+ 0.944100f, 0.944132f, 0.944163f, 0.944195f, 0.944227f, 0.944258f, 0.944290f, 0.944321f,
+ 0.944353f, 0.944384f, 0.944416f, 0.944447f, 0.944479f, 0.944510f, 0.944542f, 0.944573f,
+ 0.944605f, 0.944636f, 0.944668f, 0.944699f, 0.944731f, 0.944762f, 0.944793f, 0.944825f,
+ 0.944856f, 0.944888f, 0.944919f, 0.944950f, 0.944982f, 0.945013f, 0.945045f, 0.945076f,
+ 0.945107f, 0.945139f, 0.945170f, 0.945201f, 0.945232f, 0.945264f, 0.945295f, 0.945326f,
+ 0.945358f, 0.945389f, 0.945420f, 0.945451f, 0.945482f, 0.945514f, 0.945545f, 0.945576f,
+ 0.945607f, 0.945639f, 0.945670f, 0.945701f, 0.945732f, 0.945763f, 0.945794f, 0.945825f,
+ 0.945857f, 0.945888f, 0.945919f, 0.945950f, 0.945981f, 0.946012f, 0.946043f, 0.946074f,
+ 0.946105f, 0.946136f, 0.946167f, 0.946198f, 0.946229f, 0.946260f, 0.946291f, 0.946322f,
+ 0.946353f, 0.946384f, 0.946415f, 0.946446f, 0.946477f, 0.946508f, 0.946539f, 0.946570f,
+ 0.946601f, 0.946632f, 0.946663f, 0.946694f, 0.946724f, 0.946755f, 0.946786f, 0.946817f,
+ 0.946848f, 0.946879f, 0.946910f, 0.946940f, 0.946971f, 0.947002f, 0.947033f, 0.947064f,
+ 0.947094f, 0.947125f, 0.947156f, 0.947187f, 0.947217f, 0.947248f, 0.947279f, 0.947310f,
+ 0.947340f, 0.947371f, 0.947402f, 0.947432f, 0.947463f, 0.947494f, 0.947524f, 0.947555f,
+ 0.947586f, 0.947616f, 0.947647f, 0.947677f, 0.947708f, 0.947739f, 0.947769f, 0.947800f,
+ 0.947830f, 0.947861f, 0.947891f, 0.947922f, 0.947953f, 0.947983f, 0.948014f, 0.948044f,
+ 0.948075f, 0.948105f, 0.948136f, 0.948166f, 0.948196f, 0.948227f, 0.948257f, 0.948288f,
+ 0.948318f, 0.948349f, 0.948379f, 0.948409f, 0.948440f, 0.948470f, 0.948501f, 0.948531f,
+ 0.948561f, 0.948592f, 0.948622f, 0.948652f, 0.948683f, 0.948713f, 0.948743f, 0.948774f,
+ 0.948804f, 0.948834f, 0.948864f, 0.948895f, 0.948925f, 0.948955f, 0.948985f, 0.949016f,
+ 0.949046f, 0.949076f, 0.949106f, 0.949136f, 0.949167f, 0.949197f, 0.949227f, 0.949257f,
+ 0.949287f, 0.949317f, 0.949348f, 0.949378f, 0.949408f, 0.949438f, 0.949468f, 0.949498f,
+ 0.949528f, 0.949558f, 0.949588f, 0.949618f, 0.949648f, 0.949678f, 0.949708f, 0.949739f,
+ 0.949768f, 0.949798f, 0.949829f, 0.949858f, 0.949888f, 0.949918f, 0.949948f, 0.949978f,
+ 0.950008f, 0.950038f, 0.950068f, 0.950098f, 0.950128f, 0.950158f, 0.950188f, 0.950218f,
+ 0.950247f, 0.950277f, 0.950307f, 0.950337f, 0.950367f, 0.950397f, 0.950426f, 0.950456f,
+ 0.950486f, 0.950516f, 0.950546f, 0.950575f, 0.950605f, 0.950635f, 0.950665f, 0.950694f,
+ 0.950724f, 0.950754f, 0.950784f, 0.950813f, 0.950843f, 0.950873f, 0.950902f, 0.950932f,
+ 0.950962f, 0.950991f, 0.951021f, 0.951051f, 0.951080f, 0.951110f, 0.951139f, 0.951169f,
+ 0.951199f, 0.951228f, 0.951258f, 0.951287f, 0.951317f, 0.951346f, 0.951376f, 0.951406f,
+ 0.951435f, 0.951465f, 0.951494f, 0.951524f, 0.951553f, 0.951582f, 0.951612f, 0.951641f,
+ 0.951671f, 0.951700f, 0.951730f, 0.951759f, 0.951789f, 0.951818f, 0.951847f, 0.951877f,
+ 0.951906f, 0.951936f, 0.951965f, 0.951994f, 0.952024f, 0.952053f, 0.952082f, 0.952112f,
+ 0.952141f, 0.952170f, 0.952199f, 0.952229f, 0.952258f, 0.952287f, 0.952317f, 0.952346f,
+ 0.952375f, 0.952404f, 0.952433f, 0.952463f, 0.952492f, 0.952521f, 0.952550f, 0.952579f,
+ 0.952609f, 0.952638f, 0.952667f, 0.952696f, 0.952725f, 0.952754f, 0.952783f, 0.952813f,
+ 0.952842f, 0.952871f, 0.952900f, 0.952929f, 0.952958f, 0.952987f, 0.953016f, 0.953045f,
+ 0.953074f, 0.953103f, 0.953132f, 0.953161f, 0.953190f, 0.953219f, 0.953248f, 0.953277f,
+ 0.953306f, 0.953335f, 0.953364f, 0.953393f, 0.953422f, 0.953451f, 0.953480f, 0.953508f,
+ 0.953537f, 0.953566f, 0.953595f, 0.953624f, 0.953653f, 0.953682f, 0.953711f, 0.953739f,
+ 0.953768f, 0.953797f, 0.953826f, 0.953855f, 0.953883f, 0.953912f, 0.953941f, 0.953970f,
+ 0.953998f, 0.954027f, 0.954056f, 0.954085f, 0.954113f, 0.954142f, 0.954171f, 0.954199f,
+ 0.954228f, 0.954257f, 0.954285f, 0.954314f, 0.954343f, 0.954371f, 0.954400f, 0.954429f,
+ 0.954457f, 0.954486f, 0.954514f, 0.954543f, 0.954572f, 0.954600f, 0.954629f, 0.954657f,
+ 0.954686f, 0.954714f, 0.954743f, 0.954771f, 0.954800f, 0.954828f, 0.954857f, 0.954885f,
+ 0.954914f, 0.954942f, 0.954971f, 0.954999f, 0.955028f, 0.955056f, 0.955084f, 0.955113f,
+ 0.955141f, 0.955170f, 0.955198f, 0.955226f, 0.955255f, 0.955283f, 0.955311f, 0.955340f,
+ 0.955368f, 0.955396f, 0.955425f, 0.955453f, 0.955481f, 0.955510f, 0.955538f, 0.955566f,
+ 0.955594f, 0.955623f, 0.955651f, 0.955679f, 0.955707f, 0.955736f, 0.955764f, 0.955792f,
+ 0.955820f, 0.955848f, 0.955876f, 0.955905f, 0.955933f, 0.955961f, 0.955989f, 0.956017f,
+ 0.956045f, 0.956073f, 0.956101f, 0.956130f, 0.956158f, 0.956186f, 0.956214f, 0.956242f,
+ 0.956270f, 0.956298f, 0.956326f, 0.956354f, 0.956382f, 0.956410f, 0.956438f, 0.956466f,
+ 0.956494f, 0.956522f, 0.956550f, 0.956578f, 0.956606f, 0.956634f, 0.956662f, 0.956689f,
+ 0.956717f, 0.956745f, 0.956773f, 0.956801f, 0.956829f, 0.956857f, 0.956885f, 0.956913f,
+ 0.956940f, 0.956968f, 0.956996f, 0.957024f, 0.957052f, 0.957079f, 0.957107f, 0.957135f,
+ 0.957163f, 0.957190f, 0.957218f, 0.957246f, 0.957274f, 0.957301f, 0.957329f, 0.957357f,
+ 0.957385f, 0.957412f, 0.957440f, 0.957468f, 0.957495f, 0.957523f, 0.957550f, 0.957578f,
+ 0.957606f, 0.957633f, 0.957661f, 0.957689f, 0.957716f, 0.957744f, 0.957771f, 0.957799f,
+ 0.957826f, 0.957854f, 0.957882f, 0.957909f, 0.957937f, 0.957964f, 0.957992f, 0.958019f,
+ 0.958046f, 0.958074f, 0.958101f, 0.958129f, 0.958156f, 0.958184f, 0.958211f, 0.958239f,
+ 0.958266f, 0.958293f, 0.958321f, 0.958348f, 0.958376f, 0.958403f, 0.958430f, 0.958458f,
+ 0.958485f, 0.958512f, 0.958540f, 0.958567f, 0.958594f, 0.958622f, 0.958649f, 0.958676f,
+ 0.958703f, 0.958731f, 0.958758f, 0.958785f, 0.958812f, 0.958840f, 0.958867f, 0.958894f,
+ 0.958921f, 0.958949f, 0.958976f, 0.959003f, 0.959030f, 0.959057f, 0.959084f, 0.959112f,
+ 0.959139f, 0.959166f, 0.959193f, 0.959220f, 0.959247f, 0.959274f, 0.959301f, 0.959328f,
+ 0.959355f, 0.959382f, 0.959409f, 0.959436f, 0.959463f, 0.959491f, 0.959518f, 0.959545f,
+ 0.959572f, 0.959598f, 0.959625f, 0.959652f, 0.959679f, 0.959706f, 0.959733f, 0.959760f,
+ 0.959787f, 0.959814f, 0.959841f, 0.959868f, 0.959895f, 0.959922f, 0.959948f, 0.959975f,
+ 0.960002f, 0.960029f, 0.960056f, 0.960083f, 0.960109f, 0.960136f, 0.960163f, 0.960190f,
+ 0.960217f, 0.960243f, 0.960270f, 0.960297f, 0.960324f, 0.960350f, 0.960377f, 0.960404f,
+ 0.960431f, 0.960457f, 0.960484f, 0.960511f, 0.960537f, 0.960564f, 0.960591f, 0.960617f,
+ 0.960644f, 0.960670f, 0.960697f, 0.960724f, 0.960750f, 0.960777f, 0.960804f, 0.960830f,
+ 0.960857f, 0.960883f, 0.960910f, 0.960936f, 0.960963f, 0.960989f, 0.961016f, 0.961042f,
+ 0.961069f, 0.961095f, 0.961122f, 0.961148f, 0.961175f, 0.961201f, 0.961228f, 0.961254f,
+ 0.961280f, 0.961307f, 0.961333f, 0.961360f, 0.961386f, 0.961412f, 0.961439f, 0.961465f,
+ 0.961492f, 0.961518f, 0.961544f, 0.961571f, 0.961597f, 0.961623f, 0.961649f, 0.961676f,
+ 0.961702f, 0.961728f, 0.961755f, 0.961781f, 0.961807f, 0.961833f, 0.961860f, 0.961886f,
+ 0.961912f, 0.961938f, 0.961964f, 0.961991f, 0.962017f, 0.962043f, 0.962069f, 0.962095f,
+ 0.962121f, 0.962148f, 0.962174f, 0.962200f, 0.962226f, 0.962252f, 0.962278f, 0.962304f,
+ 0.962330f, 0.962356f, 0.962382f, 0.962408f, 0.962434f, 0.962460f, 0.962486f, 0.962512f,
+ 0.962538f, 0.962564f, 0.962590f, 0.962616f, 0.962642f, 0.962668f, 0.962694f, 0.962720f,
+ 0.962746f, 0.962772f, 0.962798f, 0.962824f, 0.962850f, 0.962876f, 0.962902f, 0.962927f,
+ 0.962953f, 0.962979f, 0.963005f, 0.963031f, 0.963057f, 0.963082f, 0.963108f, 0.963134f,
+ 0.963160f, 0.963186f, 0.963211f, 0.963237f, 0.963263f, 0.963289f, 0.963314f, 0.963340f,
+ 0.963366f, 0.963391f, 0.963417f, 0.963443f, 0.963469f, 0.963494f, 0.963520f, 0.963546f,
+ 0.963571f, 0.963597f, 0.963623f, 0.963648f, 0.963674f, 0.963699f, 0.963725f, 0.963750f,
+ 0.963776f, 0.963802f, 0.963827f, 0.963853f, 0.963878f, 0.963904f, 0.963929f, 0.963955f,
+ 0.963980f, 0.964006f, 0.964031f, 0.964057f, 0.964082f, 0.964108f, 0.964133f, 0.964159f,
+ 0.964184f, 0.964209f, 0.964235f, 0.964260f, 0.964286f, 0.964311f, 0.964336f, 0.964362f,
+ 0.964387f, 0.964413f, 0.964438f, 0.964463f, 0.964489f, 0.964514f, 0.964539f, 0.964565f,
+ 0.964590f, 0.964615f, 0.964640f, 0.964666f, 0.964691f, 0.964716f, 0.964741f, 0.964767f,
+ 0.964792f, 0.964817f, 0.964842f, 0.964867f, 0.964893f, 0.964918f, 0.964943f, 0.964968f,
+ 0.964993f, 0.965018f, 0.965044f, 0.965069f, 0.965094f, 0.965119f, 0.965144f, 0.965169f,
+ 0.965194f, 0.965219f, 0.965244f, 0.965269f, 0.965294f, 0.965319f, 0.965344f, 0.965369f,
+ 0.965394f, 0.965419f, 0.965444f, 0.965469f, 0.965494f, 0.965519f, 0.965544f, 0.965569f,
+ 0.965594f, 0.965619f, 0.965644f, 0.965669f, 0.965694f, 0.965719f, 0.965744f, 0.965769f,
+ 0.965793f, 0.965818f, 0.965843f, 0.965868f, 0.965893f, 0.965918f, 0.965942f, 0.965967f,
+ 0.965992f, 0.966017f, 0.966042f, 0.966066f, 0.966091f, 0.966116f, 0.966141f, 0.966165f,
+ 0.966190f, 0.966215f, 0.966239f, 0.966264f, 0.966289f, 0.966313f, 0.966338f, 0.966363f,
+ 0.966387f, 0.966412f, 0.966437f, 0.966461f, 0.966486f, 0.966511f, 0.966535f, 0.966560f,
+ 0.966584f, 0.966609f, 0.966633f, 0.966658f, 0.966683f, 0.966707f, 0.966732f, 0.966756f,
+ 0.966781f, 0.966805f, 0.966830f, 0.966854f, 0.966879f, 0.966903f, 0.966928f, 0.966952f,
+ 0.966976f, 0.967001f, 0.967025f, 0.967050f, 0.967074f, 0.967099f, 0.967123f, 0.967147f,
+ 0.967172f, 0.967196f, 0.967220f, 0.967245f, 0.967269f, 0.967293f, 0.967318f, 0.967342f,
+ 0.967366f, 0.967391f, 0.967415f, 0.967439f, 0.967463f, 0.967488f, 0.967512f, 0.967536f,
+ 0.967560f, 0.967585f, 0.967609f, 0.967633f, 0.967657f, 0.967681f, 0.967706f, 0.967730f,
+ 0.967754f, 0.967778f, 0.967802f, 0.967826f, 0.967850f, 0.967874f, 0.967899f, 0.967923f,
+ 0.967947f, 0.967971f, 0.967995f, 0.968019f, 0.968043f, 0.968067f, 0.968091f, 0.968115f,
+ 0.968139f, 0.968163f, 0.968187f, 0.968211f, 0.968235f, 0.968259f, 0.968283f, 0.968307f,
+ 0.968331f, 0.968355f, 0.968379f, 0.968403f, 0.968427f, 0.968450f, 0.968474f, 0.968498f,
+ 0.968522f, 0.968546f, 0.968570f, 0.968594f, 0.968617f, 0.968641f, 0.968665f, 0.968689f,
+ 0.968713f, 0.968737f, 0.968760f, 0.968784f, 0.968808f, 0.968832f, 0.968855f, 0.968879f,
+ 0.968903f, 0.968927f, 0.968950f, 0.968974f, 0.968998f, 0.969021f, 0.969045f, 0.969069f,
+ 0.969092f, 0.969116f, 0.969140f, 0.969163f, 0.969187f, 0.969210f, 0.969234f, 0.969258f,
+ 0.969281f, 0.969305f, 0.969328f, 0.969352f, 0.969375f, 0.969399f, 0.969423f, 0.969446f,
+ 0.969470f, 0.969493f, 0.969517f, 0.969540f, 0.969564f, 0.969587f, 0.969611f, 0.969634f,
+ 0.969657f, 0.969681f, 0.969704f, 0.969728f, 0.969751f, 0.969774f, 0.969798f, 0.969821f,
+ 0.969845f, 0.969868f, 0.969891f, 0.969915f, 0.969938f, 0.969961f, 0.969985f, 0.970008f,
+ 0.970031f, 0.970055f, 0.970078f, 0.970101f, 0.970124f, 0.970148f, 0.970171f, 0.970194f,
+ 0.970217f, 0.970241f, 0.970264f, 0.970287f, 0.970310f, 0.970333f, 0.970357f, 0.970380f,
+ 0.970403f, 0.970426f, 0.970449f, 0.970472f, 0.970495f, 0.970518f, 0.970542f, 0.970565f,
+ 0.970588f, 0.970611f, 0.970634f, 0.970657f, 0.970680f, 0.970703f, 0.970726f, 0.970749f,
+ 0.970772f, 0.970795f, 0.970818f, 0.970841f, 0.970864f, 0.970887f, 0.970910f, 0.970933f,
+ 0.970956f, 0.970979f, 0.971002f, 0.971025f, 0.971048f, 0.971071f, 0.971093f, 0.971116f,
+ 0.971139f, 0.971162f, 0.971185f, 0.971208f, 0.971231f, 0.971253f, 0.971276f, 0.971299f,
+ 0.971322f, 0.971345f, 0.971367f, 0.971390f, 0.971413f, 0.971436f, 0.971458f, 0.971481f,
+ 0.971504f, 0.971527f, 0.971549f, 0.971572f, 0.971595f, 0.971617f, 0.971640f, 0.971663f,
+ 0.971685f, 0.971708f, 0.971731f, 0.971753f, 0.971776f, 0.971799f, 0.971821f, 0.971844f,
+ 0.971866f, 0.971889f, 0.971911f, 0.971934f, 0.971957f, 0.971979f, 0.972002f, 0.972024f,
+ 0.972047f, 0.972069f, 0.972092f, 0.972114f, 0.972137f, 0.972159f, 0.972182f, 0.972204f,
+ 0.972227f, 0.972249f, 0.972271f, 0.972294f, 0.972316f, 0.972339f, 0.972361f, 0.972383f,
+ 0.972406f, 0.972428f, 0.972450f, 0.972473f, 0.972495f, 0.972517f, 0.972540f, 0.972562f,
+ 0.972584f, 0.972607f, 0.972629f, 0.972651f, 0.972673f, 0.972696f, 0.972718f, 0.972740f,
+ 0.972762f, 0.972785f, 0.972807f, 0.972829f, 0.972851f, 0.972873f, 0.972896f, 0.972918f,
+ 0.972940f, 0.972962f, 0.972984f, 0.973006f, 0.973028f, 0.973051f, 0.973073f, 0.973095f,
+ 0.973117f, 0.973139f, 0.973161f, 0.973183f, 0.973205f, 0.973227f, 0.973249f, 0.973271f,
+ 0.973293f, 0.973315f, 0.973337f, 0.973359f, 0.973381f, 0.973403f, 0.973425f, 0.973447f,
+ 0.973469f, 0.973491f, 0.973513f, 0.973535f, 0.973557f, 0.973579f, 0.973601f, 0.973622f,
+ 0.973644f, 0.973666f, 0.973688f, 0.973710f, 0.973732f, 0.973753f, 0.973775f, 0.973797f,
+ 0.973819f, 0.973841f, 0.973862f, 0.973884f, 0.973906f, 0.973928f, 0.973949f, 0.973971f,
+ 0.973993f, 0.974015f, 0.974036f, 0.974058f, 0.974080f, 0.974101f, 0.974123f, 0.974145f,
+ 0.974166f, 0.974188f, 0.974210f, 0.974231f, 0.974253f, 0.974275f, 0.974296f, 0.974318f,
+ 0.974339f, 0.974361f, 0.974383f, 0.974404f, 0.974426f, 0.974447f, 0.974469f, 0.974490f,
+ 0.974512f, 0.974533f, 0.974555f, 0.974576f, 0.974598f, 0.974619f, 0.974641f, 0.974662f,
+ 0.974684f, 0.974705f, 0.974726f, 0.974748f, 0.974769f, 0.974791f, 0.974812f, 0.974833f,
+ 0.974855f, 0.974876f, 0.974897f, 0.974919f, 0.974940f, 0.974961f, 0.974983f, 0.975004f,
+ 0.975025f, 0.975047f, 0.975068f, 0.975089f, 0.975110f, 0.975132f, 0.975153f, 0.975174f,
+ 0.975195f, 0.975217f, 0.975238f, 0.975259f, 0.975280f, 0.975301f, 0.975323f, 0.975344f,
+ 0.975365f, 0.975386f, 0.975407f, 0.975428f, 0.975449f, 0.975471f, 0.975492f, 0.975513f,
+ 0.975534f, 0.975555f, 0.975576f, 0.975597f, 0.975618f, 0.975639f, 0.975660f, 0.975681f,
+ 0.975702f, 0.975723f, 0.975744f, 0.975765f, 0.975786f, 0.975807f, 0.975828f, 0.975849f,
+ 0.975870f, 0.975891f, 0.975912f, 0.975933f, 0.975954f, 0.975974f, 0.975995f, 0.976016f,
+ 0.976037f, 0.976058f, 0.976079f, 0.976100f, 0.976120f, 0.976141f, 0.976162f, 0.976183f,
+ 0.976204f, 0.976224f, 0.976245f, 0.976266f, 0.976287f, 0.976308f, 0.976328f, 0.976349f,
+ 0.976370f, 0.976390f, 0.976411f, 0.976432f, 0.976453f, 0.976473f, 0.976494f, 0.976515f,
+ 0.976535f, 0.976556f, 0.976576f, 0.976597f, 0.976618f, 0.976638f, 0.976659f, 0.976680f,
+ 0.976700f, 0.976721f, 0.976741f, 0.976762f, 0.976782f, 0.976803f, 0.976823f, 0.976844f,
+ 0.976864f, 0.976885f, 0.976905f, 0.976926f, 0.976946f, 0.976967f, 0.976987f, 0.977008f,
+ 0.977028f, 0.977049f, 0.977069f, 0.977089f, 0.977110f, 0.977130f, 0.977151f, 0.977171f,
+ 0.977191f, 0.977212f, 0.977232f, 0.977252f, 0.977273f, 0.977293f, 0.977313f, 0.977334f,
+ 0.977354f, 0.977374f, 0.977394f, 0.977415f, 0.977435f, 0.977455f, 0.977475f, 0.977496f,
+ 0.977516f, 0.977536f, 0.977556f, 0.977577f, 0.977597f, 0.977617f, 0.977637f, 0.977657f,
+ 0.977677f, 0.977697f, 0.977718f, 0.977738f, 0.977758f, 0.977778f, 0.977798f, 0.977818f,
+ 0.977838f, 0.977858f, 0.977878f, 0.977898f, 0.977918f, 0.977938f, 0.977959f, 0.977979f,
+ 0.977998f, 0.978019f, 0.978038f, 0.978058f, 0.978078f, 0.978098f, 0.978118f, 0.978138f,
+ 0.978158f, 0.978178f, 0.978198f, 0.978218f, 0.978238f, 0.978258f, 0.978278f, 0.978298f,
+ 0.978317f, 0.978337f, 0.978357f, 0.978377f, 0.978397f, 0.978417f, 0.978436f, 0.978456f,
+ 0.978476f, 0.978496f, 0.978516f, 0.978535f, 0.978555f, 0.978575f, 0.978594f, 0.978614f,
+ 0.978634f, 0.978654f, 0.978673f, 0.978693f, 0.978713f, 0.978732f, 0.978752f, 0.978772f,
+ 0.978791f, 0.978811f, 0.978831f, 0.978850f, 0.978870f, 0.978889f, 0.978909f, 0.978929f,
+ 0.978948f, 0.978968f, 0.978987f, 0.979007f, 0.979026f, 0.979046f, 0.979065f, 0.979085f,
+ 0.979104f, 0.979124f, 0.979143f, 0.979163f, 0.979182f, 0.979202f, 0.979221f, 0.979241f,
+ 0.979260f, 0.979280f, 0.979299f, 0.979318f, 0.979338f, 0.979357f, 0.979376f, 0.979396f,
+ 0.979415f, 0.979435f, 0.979454f, 0.979473f, 0.979493f, 0.979512f, 0.979531f, 0.979550f,
+ 0.979570f, 0.979589f, 0.979608f, 0.979628f, 0.979647f, 0.979666f, 0.979685f, 0.979704f,
+ 0.979724f, 0.979743f, 0.979762f, 0.979781f, 0.979800f, 0.979820f, 0.979839f, 0.979858f,
+ 0.979877f, 0.979896f, 0.979915f, 0.979934f, 0.979954f, 0.979973f, 0.979992f, 0.980011f,
+ 0.980030f, 0.980049f, 0.980068f, 0.980087f, 0.980106f, 0.980125f, 0.980144f, 0.980163f,
+ 0.980182f, 0.980201f, 0.980220f, 0.980239f, 0.980258f, 0.980277f, 0.980296f, 0.980315f,
+ 0.980334f, 0.980353f, 0.980372f, 0.980390f, 0.980409f, 0.980428f, 0.980447f, 0.980466f,
+ 0.980485f, 0.980504f, 0.980523f, 0.980541f, 0.980560f, 0.980579f, 0.980598f, 0.980617f,
+ 0.980635f, 0.980654f, 0.980673f, 0.980692f, 0.980710f, 0.980729f, 0.980748f, 0.980767f,
+ 0.980785f, 0.980804f, 0.980823f, 0.980841f, 0.980860f, 0.980879f, 0.980897f, 0.980916f,
+ 0.980935f, 0.980953f, 0.980972f, 0.980990f, 0.981009f, 0.981028f, 0.981046f, 0.981065f,
+ 0.981083f, 0.981102f, 0.981120f, 0.981139f, 0.981158f, 0.981176f, 0.981195f, 0.981213f,
+ 0.981232f, 0.981250f, 0.981269f, 0.981287f, 0.981305f, 0.981324f, 0.981342f, 0.981361f,
+ 0.981379f, 0.981398f, 0.981416f, 0.981434f, 0.981453f, 0.981471f, 0.981490f, 0.981508f,
+ 0.981526f, 0.981545f, 0.981563f, 0.981581f, 0.981600f, 0.981618f, 0.981636f, 0.981654f,
+ 0.981673f, 0.981691f, 0.981709f, 0.981727f, 0.981746f, 0.981764f, 0.981782f, 0.981800f,
+ 0.981819f, 0.981837f, 0.981855f, 0.981873f, 0.981891f, 0.981909f, 0.981928f, 0.981946f,
+ 0.981964f, 0.981982f, 0.982000f, 0.982018f, 0.982036f, 0.982054f, 0.982072f, 0.982091f,
+ 0.982109f, 0.982127f, 0.982145f, 0.982163f, 0.982181f, 0.982199f, 0.982217f, 0.982235f,
+ 0.982253f, 0.982271f, 0.982289f, 0.982307f, 0.982325f, 0.982343f, 0.982360f, 0.982378f,
+ 0.982396f, 0.982414f, 0.982432f, 0.982450f, 0.982468f, 0.982486f, 0.982504f, 0.982521f,
+ 0.982539f, 0.982557f, 0.982575f, 0.982593f, 0.982611f, 0.982628f, 0.982646f, 0.982664f,
+ 0.982682f, 0.982699f, 0.982717f, 0.982735f, 0.982753f, 0.982770f, 0.982788f, 0.982806f,
+ 0.982824f, 0.982841f, 0.982859f, 0.982877f, 0.982894f, 0.982912f, 0.982930f, 0.982947f,
+ 0.982965f, 0.982982f, 0.983000f, 0.983018f, 0.983035f, 0.983053f, 0.983070f, 0.983088f,
+ 0.983105f, 0.983123f, 0.983141f, 0.983158f, 0.983176f, 0.983193f, 0.983211f, 0.983228f,
+ 0.983246f, 0.983263f, 0.983281f, 0.983298f, 0.983315f, 0.983333f, 0.983350f, 0.983368f,
+ 0.983385f, 0.983402f, 0.983420f, 0.983437f, 0.983455f, 0.983472f, 0.983489f, 0.983507f,
+ 0.983524f, 0.983541f, 0.983559f, 0.983576f, 0.983593f, 0.983611f, 0.983628f, 0.983645f,
+ 0.983662f, 0.983680f, 0.983697f, 0.983714f, 0.983731f, 0.983749f, 0.983766f, 0.983783f,
+ 0.983800f, 0.983817f, 0.983835f, 0.983852f, 0.983869f, 0.983886f, 0.983903f, 0.983920f,
+ 0.983937f, 0.983955f, 0.983972f, 0.983989f, 0.984006f, 0.984023f, 0.984040f, 0.984057f,
+ 0.984074f, 0.984091f, 0.984108f, 0.984125f, 0.984142f, 0.984159f, 0.984176f, 0.984193f,
+ 0.984210f, 0.984227f, 0.984244f, 0.984261f, 0.984278f, 0.984295f, 0.984312f, 0.984329f,
+ 0.984346f, 0.984362f, 0.984379f, 0.984396f, 0.984413f, 0.984430f, 0.984447f, 0.984464f,
+ 0.984480f, 0.984497f, 0.984514f, 0.984531f, 0.984548f, 0.984564f, 0.984581f, 0.984598f,
+ 0.984615f, 0.984632f, 0.984648f, 0.984665f, 0.984682f, 0.984698f, 0.984715f, 0.984732f,
+ 0.984748f, 0.984765f, 0.984782f, 0.984798f, 0.984815f, 0.984832f, 0.984848f, 0.984865f,
+ 0.984882f, 0.984898f, 0.984915f, 0.984931f, 0.984948f, 0.984965f, 0.984981f, 0.984998f,
+ 0.985014f, 0.985031f, 0.985047f, 0.985064f, 0.985080f, 0.985097f, 0.985113f, 0.985130f,
+ 0.985146f, 0.985163f, 0.985179f, 0.985196f, 0.985212f, 0.985228f, 0.985245f, 0.985261f,
+ 0.985278f, 0.985294f, 0.985310f, 0.985327f, 0.985343f, 0.985359f, 0.985376f, 0.985392f,
+ 0.985408f, 0.985425f, 0.985441f, 0.985457f, 0.985474f, 0.985490f, 0.985506f, 0.985523f,
+ 0.985539f, 0.985555f, 0.985571f, 0.985587f, 0.985604f, 0.985620f, 0.985636f, 0.985652f,
+ 0.985668f, 0.985685f, 0.985701f, 0.985717f, 0.985733f, 0.985749f, 0.985765f, 0.985781f,
+ 0.985798f, 0.985814f, 0.985830f, 0.985846f, 0.985862f, 0.985878f, 0.985894f, 0.985910f,
+ 0.985926f, 0.985942f, 0.985958f, 0.985974f, 0.985990f, 0.986006f, 0.986022f, 0.986038f,
+ 0.986054f, 0.986070f, 0.986086f, 0.986102f, 0.986118f, 0.986134f, 0.986150f, 0.986165f,
+ 0.986181f, 0.986197f, 0.986213f, 0.986229f, 0.986245f, 0.986261f, 0.986276f, 0.986292f,
+ 0.986308f, 0.986324f, 0.986340f, 0.986355f, 0.986371f, 0.986387f, 0.986403f, 0.986419f,
+ 0.986434f, 0.986450f, 0.986466f, 0.986481f, 0.986497f, 0.986513f, 0.986529f, 0.986544f,
+ 0.986560f, 0.986576f, 0.986591f, 0.986607f, 0.986623f, 0.986638f, 0.986654f, 0.986669f,
+ 0.986685f, 0.986701f, 0.986716f, 0.986732f, 0.986747f, 0.986763f, 0.986778f, 0.986794f,
+ 0.986809f, 0.986825f, 0.986840f, 0.986856f, 0.986871f, 0.986887f, 0.986902f, 0.986918f,
+ 0.986933f, 0.986949f, 0.986964f, 0.986980f, 0.986995f, 0.987010f, 0.987026f, 0.987041f,
+ 0.987057f, 0.987072f, 0.987087f, 0.987103f, 0.987118f, 0.987133f, 0.987149f, 0.987164f,
+ 0.987179f, 0.987195f, 0.987210f, 0.987225f, 0.987240f, 0.987256f, 0.987271f, 0.987286f,
+ 0.987301f, 0.987317f, 0.987332f, 0.987347f, 0.987362f, 0.987377f, 0.987393f, 0.987408f,
+ 0.987423f, 0.987438f, 0.987453f, 0.987468f, 0.987484f, 0.987499f, 0.987514f, 0.987529f,
+ 0.987544f, 0.987559f, 0.987574f, 0.987589f, 0.987604f, 0.987619f, 0.987634f, 0.987649f,
+ 0.987664f, 0.987679f, 0.987694f, 0.987709f, 0.987724f, 0.987739f, 0.987754f, 0.987769f,
+ 0.987784f, 0.987799f, 0.987814f, 0.987829f, 0.987844f, 0.987859f, 0.987874f, 0.987889f,
+ 0.987903f, 0.987918f, 0.987933f, 0.987948f, 0.987963f, 0.987978f, 0.987992f, 0.988007f,
+ 0.988022f, 0.988037f, 0.988052f, 0.988066f, 0.988081f, 0.988096f, 0.988111f, 0.988125f,
+ 0.988140f, 0.988155f, 0.988169f, 0.988184f, 0.988199f, 0.988214f, 0.988228f, 0.988243f,
+ 0.988258f, 0.988272f, 0.988287f, 0.988301f, 0.988316f, 0.988331f, 0.988345f, 0.988360f,
+ 0.988374f, 0.988389f, 0.988404f, 0.988418f, 0.988433f, 0.988447f, 0.988462f, 0.988476f,
+ 0.988491f, 0.988505f, 0.988520f, 0.988534f, 0.988549f, 0.988563f, 0.988578f, 0.988592f,
+ 0.988607f, 0.988621f, 0.988635f, 0.988650f, 0.988664f, 0.988679f, 0.988693f, 0.988707f,
+ 0.988722f, 0.988736f, 0.988750f, 0.988765f, 0.988779f, 0.988793f, 0.988808f, 0.988822f,
+ 0.988836f, 0.988851f, 0.988865f, 0.988879f, 0.988893f, 0.988908f, 0.988922f, 0.988936f,
+ 0.988950f, 0.988964f, 0.988979f, 0.988993f, 0.989007f, 0.989021f, 0.989035f, 0.989050f,
+ 0.989064f, 0.989078f, 0.989092f, 0.989106f, 0.989120f, 0.989134f, 0.989148f, 0.989162f,
+ 0.989177f, 0.989191f, 0.989205f, 0.989219f, 0.989233f, 0.989247f, 0.989261f, 0.989275f,
+ 0.989289f, 0.989303f, 0.989317f, 0.989331f, 0.989345f, 0.989359f, 0.989373f, 0.989386f,
+ 0.989400f, 0.989414f, 0.989428f, 0.989442f, 0.989456f, 0.989470f, 0.989484f, 0.989498f,
+ 0.989511f, 0.989525f, 0.989539f, 0.989553f, 0.989567f, 0.989581f, 0.989594f, 0.989608f,
+ 0.989622f, 0.989636f, 0.989650f, 0.989663f, 0.989677f, 0.989691f, 0.989704f, 0.989718f,
+ 0.989732f, 0.989746f, 0.989759f, 0.989773f, 0.989787f, 0.989800f, 0.989814f, 0.989828f,
+ 0.989841f, 0.989855f, 0.989869f, 0.989882f, 0.989896f, 0.989909f, 0.989923f, 0.989936f,
+ 0.989950f, 0.989964f, 0.989977f, 0.989991f, 0.990004f, 0.990018f, 0.990031f, 0.990045f,
+ 0.990058f, 0.990072f, 0.990085f, 0.990099f, 0.990112f, 0.990126f, 0.990139f, 0.990152f,
+ 0.990166f, 0.990179f, 0.990193f, 0.990206f, 0.990219f, 0.990233f, 0.990246f, 0.990259f,
+ 0.990273f, 0.990286f, 0.990299f, 0.990313f, 0.990326f, 0.990339f, 0.990353f, 0.990366f,
+ 0.990379f, 0.990393f, 0.990406f, 0.990419f, 0.990432f, 0.990445f, 0.990459f, 0.990472f,
+ 0.990485f, 0.990498f, 0.990511f, 0.990525f, 0.990538f, 0.990551f, 0.990564f, 0.990577f,
+ 0.990590f, 0.990603f, 0.990617f, 0.990630f, 0.990643f, 0.990656f, 0.990669f, 0.990682f,
+ 0.990695f, 0.990708f, 0.990721f, 0.990734f, 0.990747f, 0.990760f, 0.990773f, 0.990786f,
+ 0.990799f, 0.990812f, 0.990825f, 0.990838f, 0.990851f, 0.990864f, 0.990877f, 0.990890f,
+ 0.990903f, 0.990916f, 0.990928f, 0.990941f, 0.990954f, 0.990967f, 0.990980f, 0.990993f,
+ 0.991006f, 0.991018f, 0.991031f, 0.991044f, 0.991057f, 0.991070f, 0.991082f, 0.991095f,
+ 0.991108f, 0.991121f, 0.991133f, 0.991146f, 0.991159f, 0.991172f, 0.991184f, 0.991197f,
+ 0.991210f, 0.991222f, 0.991235f, 0.991248f, 0.991260f, 0.991273f, 0.991286f, 0.991298f,
+ 0.991311f, 0.991323f, 0.991336f, 0.991349f, 0.991361f, 0.991374f, 0.991386f, 0.991399f,
+ 0.991411f, 0.991424f, 0.991437f, 0.991449f, 0.991462f, 0.991474f, 0.991487f, 0.991499f,
+ 0.991511f, 0.991524f, 0.991536f, 0.991549f, 0.991561f, 0.991574f, 0.991586f, 0.991598f,
+ 0.991611f, 0.991623f, 0.991636f, 0.991648f, 0.991660f, 0.991673f, 0.991685f, 0.991697f,
+ 0.991710f, 0.991722f, 0.991734f, 0.991747f, 0.991759f, 0.991771f, 0.991783f, 0.991796f,
+ 0.991808f, 0.991820f, 0.991832f, 0.991845f, 0.991857f, 0.991869f, 0.991881f, 0.991894f,
+ 0.991906f, 0.991918f, 0.991930f, 0.991942f, 0.991954f, 0.991966f, 0.991979f, 0.991991f,
+ 0.992003f, 0.992015f, 0.992027f, 0.992039f, 0.992051f, 0.992063f, 0.992075f, 0.992087f,
+ 0.992099f, 0.992111f, 0.992123f, 0.992135f, 0.992147f, 0.992159f, 0.992171f, 0.992183f,
+ 0.992195f, 0.992207f, 0.992219f, 0.992231f, 0.992243f, 0.992255f, 0.992267f, 0.992279f,
+ 0.992291f, 0.992302f, 0.992314f, 0.992326f, 0.992338f, 0.992350f, 0.992362f, 0.992374f,
+ 0.992385f, 0.992397f, 0.992409f, 0.992421f, 0.992433f, 0.992444f, 0.992456f, 0.992468f,
+ 0.992480f, 0.992491f, 0.992503f, 0.992515f, 0.992526f, 0.992538f, 0.992550f, 0.992561f,
+ 0.992573f, 0.992585f, 0.992596f, 0.992608f, 0.992620f, 0.992631f, 0.992643f, 0.992655f,
+ 0.992666f, 0.992678f, 0.992689f, 0.992701f, 0.992712f, 0.992724f, 0.992736f, 0.992747f,
+ 0.992759f, 0.992770f, 0.992782f, 0.992793f, 0.992805f, 0.992816f, 0.992828f, 0.992839f,
+ 0.992850f, 0.992862f, 0.992873f, 0.992885f, 0.992896f, 0.992908f, 0.992919f, 0.992930f,
+ 0.992942f, 0.992953f, 0.992964f, 0.992976f, 0.992987f, 0.992998f, 0.993010f, 0.993021f,
+ 0.993032f, 0.993044f, 0.993055f, 0.993066f, 0.993077f, 0.993089f, 0.993100f, 0.993111f,
+ 0.993122f, 0.993134f, 0.993145f, 0.993156f, 0.993167f, 0.993178f, 0.993190f, 0.993201f,
+ 0.993212f, 0.993223f, 0.993234f, 0.993245f, 0.993257f, 0.993268f, 0.993279f, 0.993290f,
+ 0.993301f, 0.993312f, 0.993323f, 0.993334f, 0.993345f, 0.993356f, 0.993367f, 0.993378f,
+ 0.993389f, 0.993400f, 0.993411f, 0.993422f, 0.993433f, 0.993444f, 0.993455f, 0.993466f,
+ 0.993477f, 0.993488f, 0.993499f, 0.993510f, 0.993521f, 0.993532f, 0.993542f, 0.993553f,
+ 0.993564f, 0.993575f, 0.993586f, 0.993597f, 0.993608f, 0.993618f, 0.993629f, 0.993640f,
+ 0.993651f, 0.993662f, 0.993672f, 0.993683f, 0.993694f, 0.993705f, 0.993715f, 0.993726f,
+ 0.993737f, 0.993747f, 0.993758f, 0.993769f, 0.993779f, 0.993790f, 0.993801f, 0.993811f,
+ 0.993822f, 0.993833f, 0.993843f, 0.993854f, 0.993865f, 0.993875f, 0.993886f, 0.993896f,
+ 0.993907f, 0.993918f, 0.993928f, 0.993939f, 0.993949f, 0.993960f, 0.993970f, 0.993981f,
+ 0.993991f, 0.994002f, 0.994012f, 0.994023f, 0.994033f, 0.994044f, 0.994054f, 0.994064f,
+ 0.994075f, 0.994085f, 0.994096f, 0.994106f, 0.994116f, 0.994127f, 0.994137f, 0.994148f,
+ 0.994158f, 0.994168f, 0.994179f, 0.994189f, 0.994199f, 0.994210f, 0.994220f, 0.994230f,
+ 0.994240f, 0.994251f, 0.994261f, 0.994271f, 0.994281f, 0.994292f, 0.994302f, 0.994312f,
+ 0.994322f, 0.994333f, 0.994343f, 0.994353f, 0.994363f, 0.994373f, 0.994383f, 0.994394f,
+ 0.994404f, 0.994414f, 0.994424f, 0.994434f, 0.994444f, 0.994454f, 0.994464f, 0.994474f,
+ 0.994484f, 0.994494f, 0.994505f, 0.994515f, 0.994525f, 0.994535f, 0.994545f, 0.994555f,
+ 0.994565f, 0.994575f, 0.994585f, 0.994594f, 0.994604f, 0.994614f, 0.994624f, 0.994634f,
+ 0.994644f, 0.994654f, 0.994664f, 0.994674f, 0.994684f, 0.994694f, 0.994703f, 0.994713f,
+ 0.994723f, 0.994733f, 0.994743f, 0.994753f, 0.994762f, 0.994772f, 0.994782f, 0.994792f,
+ 0.994802f, 0.994811f, 0.994821f, 0.994831f, 0.994841f, 0.994850f, 0.994860f, 0.994870f,
+ 0.994879f, 0.994889f, 0.994899f, 0.994908f, 0.994918f, 0.994928f, 0.994937f, 0.994947f,
+ 0.994957f, 0.994966f, 0.994976f, 0.994985f, 0.994995f, 0.995005f, 0.995014f, 0.995024f,
+ 0.995033f, 0.995043f, 0.995052f, 0.995062f, 0.995071f, 0.995081f, 0.995090f, 0.995100f,
+ 0.995109f, 0.995119f, 0.995128f, 0.995138f, 0.995147f, 0.995156f, 0.995166f, 0.995175f,
+ 0.995185f, 0.995194f, 0.995203f, 0.995213f, 0.995222f, 0.995232f, 0.995241f, 0.995250f,
+ 0.995260f, 0.995269f, 0.995278f, 0.995288f, 0.995297f, 0.995306f, 0.995315f, 0.995325f,
+ 0.995334f, 0.995343f, 0.995352f, 0.995362f, 0.995371f, 0.995380f, 0.995389f, 0.995398f,
+ 0.995408f, 0.995417f, 0.995426f, 0.995435f, 0.995444f, 0.995453f, 0.995463f, 0.995472f,
+ 0.995481f, 0.995490f, 0.995499f, 0.995508f, 0.995517f, 0.995526f, 0.995535f, 0.995544f,
+ 0.995553f, 0.995562f, 0.995571f, 0.995580f, 0.995589f, 0.995598f, 0.995607f, 0.995616f,
+ 0.995625f, 0.995634f, 0.995643f, 0.995652f, 0.995661f, 0.995670f, 0.995679f, 0.995688f,
+ 0.995697f, 0.995705f, 0.995714f, 0.995723f, 0.995732f, 0.995741f, 0.995750f, 0.995759f,
+ 0.995767f, 0.995776f, 0.995785f, 0.995794f, 0.995803f, 0.995811f, 0.995820f, 0.995829f,
+ 0.995838f, 0.995846f, 0.995855f, 0.995864f, 0.995872f, 0.995881f, 0.995890f, 0.995899f,
+ 0.995907f, 0.995916f, 0.995925f, 0.995933f, 0.995942f, 0.995950f, 0.995959f, 0.995968f,
+ 0.995976f, 0.995985f, 0.995993f, 0.996002f, 0.996011f, 0.996019f, 0.996028f, 0.996036f,
+ 0.996045f, 0.996053f, 0.996062f, 0.996070f, 0.996079f, 0.996087f, 0.996096f, 0.996104f,
+ 0.996113f, 0.996121f, 0.996129f, 0.996138f, 0.996146f, 0.996155f, 0.996163f, 0.996171f,
+ 0.996180f, 0.996188f, 0.996197f, 0.996205f, 0.996213f, 0.996222f, 0.996230f, 0.996238f,
+ 0.996247f, 0.996255f, 0.996263f, 0.996271f, 0.996280f, 0.996288f, 0.996296f, 0.996304f,
+ 0.996313f, 0.996321f, 0.996329f, 0.996337f, 0.996345f, 0.996354f, 0.996362f, 0.996370f,
+ 0.996378f, 0.996386f, 0.996394f, 0.996403f, 0.996411f, 0.996419f, 0.996427f, 0.996435f,
+ 0.996443f, 0.996451f, 0.996459f, 0.996467f, 0.996475f, 0.996483f, 0.996491f, 0.996499f,
+ 0.996507f, 0.996515f, 0.996523f, 0.996531f, 0.996539f, 0.996547f, 0.996555f, 0.996563f,
+ 0.996571f, 0.996579f, 0.996587f, 0.996595f, 0.996603f, 0.996611f, 0.996619f, 0.996626f,
+ 0.996634f, 0.996642f, 0.996650f, 0.996658f, 0.996666f, 0.996674f, 0.996681f, 0.996689f,
+ 0.996697f, 0.996705f, 0.996712f, 0.996720f, 0.996728f, 0.996736f, 0.996743f, 0.996751f,
+ 0.996759f, 0.996767f, 0.996774f, 0.996782f, 0.996790f, 0.996797f, 0.996805f, 0.996813f,
+ 0.996820f, 0.996828f, 0.996836f, 0.996843f, 0.996851f, 0.996858f, 0.996866f, 0.996874f,
+ 0.996881f, 0.996889f, 0.996896f, 0.996904f, 0.996911f, 0.996919f, 0.996926f, 0.996934f,
+ 0.996941f, 0.996949f, 0.996956f, 0.996964f, 0.996971f, 0.996979f, 0.996986f, 0.996994f,
+ 0.997001f, 0.997008f, 0.997016f, 0.997023f, 0.997031f, 0.997038f, 0.997045f, 0.997053f,
+ 0.997060f, 0.997067f, 0.997075f, 0.997082f, 0.997089f, 0.997097f, 0.997104f, 0.997111f,
+ 0.997119f, 0.997126f, 0.997133f, 0.997140f, 0.997148f, 0.997155f, 0.997162f, 0.997169f,
+ 0.997176f, 0.997184f, 0.997191f, 0.997198f, 0.997205f, 0.997212f, 0.997219f, 0.997227f,
+ 0.997234f, 0.997241f, 0.997248f, 0.997255f, 0.997262f, 0.997269f, 0.997276f, 0.997283f,
+ 0.997290f, 0.997298f, 0.997305f, 0.997312f, 0.997319f, 0.997326f, 0.997333f, 0.997340f,
+ 0.997347f, 0.997354f, 0.997361f, 0.997368f, 0.997374f, 0.997381f, 0.997388f, 0.997395f,
+ 0.997402f, 0.997409f, 0.997416f, 0.997423f, 0.997430f, 0.997437f, 0.997443f, 0.997450f,
+ 0.997457f, 0.997464f, 0.997471f, 0.997478f, 0.997484f, 0.997491f, 0.997498f, 0.997505f,
+ 0.997511f, 0.997518f, 0.997525f, 0.997532f, 0.997538f, 0.997545f, 0.997552f, 0.997559f,
+ 0.997565f, 0.997572f, 0.997579f, 0.997585f, 0.997592f, 0.997599f, 0.997605f, 0.997612f,
+ 0.997618f, 0.997625f, 0.997632f, 0.997638f, 0.997645f, 0.997651f, 0.997658f, 0.997665f,
+ 0.997671f, 0.997678f, 0.997684f, 0.997691f, 0.997697f, 0.997704f, 0.997710f, 0.997717f,
+ 0.997723f, 0.997730f, 0.997736f, 0.997742f, 0.997749f, 0.997755f, 0.997762f, 0.997768f,
+ 0.997774f, 0.997781f, 0.997787f, 0.997794f, 0.997800f, 0.997806f, 0.997813f, 0.997819f,
+ 0.997825f, 0.997832f, 0.997838f, 0.997844f, 0.997851f, 0.997857f, 0.997863f, 0.997869f,
+ 0.997876f, 0.997882f, 0.997888f, 0.997894f, 0.997901f, 0.997907f, 0.997913f, 0.997919f,
+ 0.997925f, 0.997931f, 0.997938f, 0.997944f, 0.997950f, 0.997956f, 0.997962f, 0.997968f,
+ 0.997974f, 0.997980f, 0.997987f, 0.997993f, 0.997999f, 0.998005f, 0.998011f, 0.998017f,
+ 0.998023f, 0.998029f, 0.998035f, 0.998041f, 0.998047f, 0.998053f, 0.998059f, 0.998065f,
+ 0.998071f, 0.998077f, 0.998083f, 0.998089f, 0.998094f, 0.998100f, 0.998106f, 0.998112f,
+ 0.998118f, 0.998124f, 0.998130f, 0.998136f, 0.998142f, 0.998147f, 0.998153f, 0.998159f,
+ 0.998165f, 0.998171f, 0.998176f, 0.998182f, 0.998188f, 0.998194f, 0.998200f, 0.998205f,
+ 0.998211f, 0.998217f, 0.998222f, 0.998228f, 0.998234f, 0.998240f, 0.998245f, 0.998251f,
+ 0.998257f, 0.998262f, 0.998268f, 0.998273f, 0.998279f, 0.998285f, 0.998290f, 0.998296f,
+ 0.998302f, 0.998307f, 0.998313f, 0.998318f, 0.998324f, 0.998329f, 0.998335f, 0.998340f,
+ 0.998346f, 0.998351f, 0.998357f, 0.998362f, 0.998368f, 0.998373f, 0.998379f, 0.998384f,
+ 0.998390f, 0.998395f, 0.998401f, 0.998406f, 0.998411f, 0.998417f, 0.998422f, 0.998428f,
+ 0.998433f, 0.998438f, 0.998444f, 0.998449f, 0.998454f, 0.998460f, 0.998465f, 0.998470f,
+ 0.998476f, 0.998481f, 0.998486f, 0.998491f, 0.998497f, 0.998502f, 0.998507f, 0.998512f,
+ 0.998518f, 0.998523f, 0.998528f, 0.998533f, 0.998538f, 0.998544f, 0.998549f, 0.998554f,
+ 0.998559f, 0.998564f, 0.998569f, 0.998574f, 0.998580f, 0.998585f, 0.998590f, 0.998595f,
+ 0.998600f, 0.998605f, 0.998610f, 0.998615f, 0.998620f, 0.998625f, 0.998630f, 0.998635f,
+ 0.998640f, 0.998645f, 0.998650f, 0.998655f, 0.998660f, 0.998665f, 0.998670f, 0.998675f,
+ 0.998680f, 0.998685f, 0.998690f, 0.998695f, 0.998700f, 0.998704f, 0.998709f, 0.998714f,
+ 0.998719f, 0.998724f, 0.998729f, 0.998734f, 0.998738f, 0.998743f, 0.998748f, 0.998753f,
+ 0.998758f, 0.998762f, 0.998767f, 0.998772f, 0.998777f, 0.998781f, 0.998786f, 0.998791f,
+ 0.998795f, 0.998800f, 0.998805f, 0.998810f, 0.998814f, 0.998819f, 0.998824f, 0.998828f,
+ 0.998833f, 0.998837f, 0.998842f, 0.998847f, 0.998851f, 0.998856f, 0.998860f, 0.998865f,
+ 0.998870f, 0.998874f, 0.998879f, 0.998883f, 0.998888f, 0.998892f, 0.998897f, 0.998901f,
+ 0.998906f, 0.998910f, 0.998915f, 0.998919f, 0.998924f, 0.998928f, 0.998932f, 0.998937f,
+ 0.998941f, 0.998946f, 0.998950f, 0.998954f, 0.998959f, 0.998963f, 0.998968f, 0.998972f,
+ 0.998976f, 0.998981f, 0.998985f, 0.998989f, 0.998994f, 0.998998f, 0.999002f, 0.999006f,
+ 0.999011f, 0.999015f, 0.999019f, 0.999023f, 0.999028f, 0.999032f, 0.999036f, 0.999040f,
+ 0.999044f, 0.999049f, 0.999053f, 0.999057f, 0.999061f, 0.999065f, 0.999069f, 0.999074f,
+ 0.999078f, 0.999082f, 0.999086f, 0.999090f, 0.999094f, 0.999098f, 0.999102f, 0.999106f,
+ 0.999110f, 0.999114f, 0.999118f, 0.999122f, 0.999126f, 0.999130f, 0.999134f, 0.999138f,
+ 0.999142f, 0.999146f, 0.999150f, 0.999154f, 0.999158f, 0.999162f, 0.999166f, 0.999170f,
+ 0.999174f, 0.999178f, 0.999182f, 0.999186f, 0.999189f, 0.999193f, 0.999197f, 0.999201f,
+ 0.999205f, 0.999209f, 0.999212f, 0.999216f, 0.999220f, 0.999224f, 0.999228f, 0.999231f,
+ 0.999235f, 0.999239f, 0.999243f, 0.999246f, 0.999250f, 0.999254f, 0.999257f, 0.999261f,
+ 0.999265f, 0.999268f, 0.999272f, 0.999276f, 0.999279f, 0.999283f, 0.999287f, 0.999290f,
+ 0.999294f, 0.999297f, 0.999301f, 0.999305f, 0.999308f, 0.999312f, 0.999315f, 0.999319f,
+ 0.999322f, 0.999326f, 0.999329f, 0.999333f, 0.999336f, 0.999340f, 0.999343f, 0.999347f,
+ 0.999350f, 0.999354f, 0.999357f, 0.999361f, 0.999364f, 0.999367f, 0.999371f, 0.999374f,
+ 0.999378f, 0.999381f, 0.999384f, 0.999388f, 0.999391f, 0.999394f, 0.999398f, 0.999401f,
+ 0.999404f, 0.999408f, 0.999411f, 0.999414f, 0.999418f, 0.999421f, 0.999424f, 0.999427f,
+ 0.999431f, 0.999434f, 0.999437f, 0.999440f, 0.999443f, 0.999447f, 0.999450f, 0.999453f,
+ 0.999456f, 0.999459f, 0.999462f, 0.999466f, 0.999469f, 0.999472f, 0.999475f, 0.999478f,
+ 0.999481f, 0.999484f, 0.999487f, 0.999490f, 0.999493f, 0.999497f, 0.999500f, 0.999503f,
+ 0.999506f, 0.999509f, 0.999512f, 0.999515f, 0.999518f, 0.999521f, 0.999524f, 0.999527f,
+ 0.999529f, 0.999532f, 0.999535f, 0.999538f, 0.999541f, 0.999544f, 0.999547f, 0.999550f,
+ 0.999553f, 0.999556f, 0.999558f, 0.999561f, 0.999564f, 0.999567f, 0.999570f, 0.999573f,
+ 0.999575f, 0.999578f, 0.999581f, 0.999584f, 0.999586f, 0.999589f, 0.999592f, 0.999595f,
+ 0.999597f, 0.999600f, 0.999603f, 0.999605f, 0.999608f, 0.999611f, 0.999614f, 0.999616f,
+ 0.999619f, 0.999621f, 0.999624f, 0.999627f, 0.999629f, 0.999632f, 0.999635f, 0.999637f,
+ 0.999640f, 0.999642f, 0.999645f, 0.999647f, 0.999650f, 0.999652f, 0.999655f, 0.999658f,
+ 0.999660f, 0.999663f, 0.999665f, 0.999667f, 0.999670f, 0.999672f, 0.999675f, 0.999677f,
+ 0.999680f, 0.999682f, 0.999685f, 0.999687f, 0.999689f, 0.999692f, 0.999694f, 0.999696f,
+ 0.999699f, 0.999701f, 0.999704f, 0.999706f, 0.999708f, 0.999710f, 0.999713f, 0.999715f,
+ 0.999717f, 0.999720f, 0.999722f, 0.999724f, 0.999726f, 0.999729f, 0.999731f, 0.999733f,
+ 0.999735f, 0.999738f, 0.999740f, 0.999742f, 0.999744f, 0.999746f, 0.999748f, 0.999750f,
+ 0.999753f, 0.999755f, 0.999757f, 0.999759f, 0.999761f, 0.999763f, 0.999765f, 0.999767f,
+ 0.999769f, 0.999771f, 0.999774f, 0.999776f, 0.999778f, 0.999780f, 0.999782f, 0.999784f,
+ 0.999786f, 0.999788f, 0.999790f, 0.999792f, 0.999793f, 0.999795f, 0.999797f, 0.999799f,
+ 0.999801f, 0.999803f, 0.999805f, 0.999807f, 0.999809f, 0.999811f, 0.999812f, 0.999814f,
+ 0.999816f, 0.999818f, 0.999820f, 0.999822f, 0.999823f, 0.999825f, 0.999827f, 0.999829f,
+ 0.999831f, 0.999832f, 0.999834f, 0.999836f, 0.999838f, 0.999839f, 0.999841f, 0.999843f,
+ 0.999844f, 0.999846f, 0.999848f, 0.999849f, 0.999851f, 0.999853f, 0.999854f, 0.999856f,
+ 0.999858f, 0.999859f, 0.999861f, 0.999862f, 0.999864f, 0.999866f, 0.999867f, 0.999869f,
+ 0.999870f, 0.999872f, 0.999873f, 0.999875f, 0.999876f, 0.999878f, 0.999879f, 0.999881f,
+ 0.999882f, 0.999884f, 0.999885f, 0.999887f, 0.999888f, 0.999890f, 0.999891f, 0.999892f,
+ 0.999894f, 0.999895f, 0.999897f, 0.999898f, 0.999899f, 0.999901f, 0.999902f, 0.999903f,
+ 0.999905f, 0.999906f, 0.999907f, 0.999909f, 0.999910f, 0.999911f, 0.999913f, 0.999914f,
+ 0.999915f, 0.999916f, 0.999917f, 0.999919f, 0.999920f, 0.999921f, 0.999922f, 0.999924f,
+ 0.999925f, 0.999926f, 0.999927f, 0.999928f, 0.999929f, 0.999930f, 0.999932f, 0.999933f,
+ 0.999934f, 0.999935f, 0.999936f, 0.999937f, 0.999938f, 0.999939f, 0.999940f, 0.999941f,
+ 0.999942f, 0.999943f, 0.999944f, 0.999945f, 0.999946f, 0.999947f, 0.999948f, 0.999949f,
+ 0.999950f, 0.999951f, 0.999952f, 0.999953f, 0.999954f, 0.999955f, 0.999956f, 0.999957f,
+ 0.999958f, 0.999959f, 0.999959f, 0.999960f, 0.999961f, 0.999962f, 0.999963f, 0.999964f,
+ 0.999964f, 0.999965f, 0.999966f, 0.999967f, 0.999968f, 0.999968f, 0.999969f, 0.999970f,
+ 0.999971f, 0.999971f, 0.999972f, 0.999973f, 0.999973f, 0.999974f, 0.999975f, 0.999976f,
+ 0.999976f, 0.999977f, 0.999977f, 0.999978f, 0.999979f, 0.999979f, 0.999980f, 0.999981f,
+ 0.999981f, 0.999982f, 0.999982f, 0.999983f, 0.999983f, 0.999984f, 0.999985f, 0.999985f,
+ 0.999986f, 0.999986f, 0.999987f, 0.999987f, 0.999988f, 0.999988f, 0.999988f, 0.999989f,
+ 0.999989f, 0.999990f, 0.999990f, 0.999991f, 0.999991f, 0.999991f, 0.999992f, 0.999992f,
+ 0.999993f, 0.999993f, 0.999993f, 0.999994f, 0.999994f, 0.999994f, 0.999995f, 0.999995f,
+ 0.999995f, 0.999996f, 0.999996f, 0.999996f, 0.999996f, 0.999997f, 0.999997f, 0.999997f,
+ 0.999997f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999999f, 0.999999f,
+ 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 1.000000f, 1.000000f,
+ 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
+ 0.000000f, -0.000096f, -0.000192f, -0.000288f, -0.000383f, -0.000479f, -0.000575f, -0.000671f,
+ -0.000767f, -0.000863f, -0.000959f, -0.001055f, -0.001150f, -0.001246f, -0.001342f, -0.001438f,
+ -0.001534f, -0.001630f, -0.001726f, -0.001822f, -0.001917f, -0.002013f, -0.002109f, -0.002205f,
+ -0.002301f, -0.002397f, -0.002493f, -0.002589f, -0.002684f, -0.002780f, -0.002876f, -0.002972f,
+ -0.003068f, -0.003164f, -0.003260f, -0.003356f, -0.003451f, -0.003547f, -0.003643f, -0.003739f,
+ -0.003835f, -0.003931f, -0.004027f, -0.004123f, -0.004218f, -0.004314f, -0.004410f, -0.004506f,
+ -0.004602f, -0.004698f, -0.004794f, -0.004890f, -0.004985f, -0.005081f, -0.005177f, -0.005273f,
+ -0.005369f, -0.005465f, -0.005561f, -0.005657f, -0.005752f, -0.005848f, -0.005944f, -0.006040f,
+ -0.006136f, -0.006232f, -0.006328f, -0.006424f, -0.006519f, -0.006615f, -0.006711f, -0.006807f,
+ -0.006903f, -0.006999f, -0.007095f, -0.007190f, -0.007286f, -0.007382f, -0.007478f, -0.007574f,
+ -0.007670f, -0.007766f, -0.007862f, -0.007957f, -0.008053f, -0.008149f, -0.008245f, -0.008341f,
+ -0.008437f, -0.008533f, -0.008629f, -0.008724f, -0.008820f, -0.008916f, -0.009012f, -0.009108f,
+ -0.009204f, -0.009300f, -0.009395f, -0.009491f, -0.009587f, -0.009683f, -0.009779f, -0.009875f,
+ -0.009971f, -0.010067f, -0.010162f, -0.010258f, -0.010354f, -0.010450f, -0.010546f, -0.010642f,
+ -0.010738f, -0.010834f, -0.010929f, -0.011025f, -0.011121f, -0.011217f, -0.011313f, -0.011409f,
+ -0.011505f, -0.011600f, -0.011696f, -0.011792f, -0.011888f, -0.011984f, -0.012080f, -0.012176f,
+ -0.012272f, -0.012367f, -0.012463f, -0.012559f, -0.012655f, -0.012751f, -0.012847f, -0.012943f,
+ -0.013038f, -0.013134f, -0.013230f, -0.013326f, -0.013422f, -0.013518f, -0.013614f, -0.013710f,
+ -0.013805f, -0.013901f, -0.013997f, -0.014093f, -0.014189f, -0.014285f, -0.014381f, -0.014476f,
+ -0.014572f, -0.014668f, -0.014764f, -0.014860f, -0.014956f, -0.015052f, -0.015147f, -0.015243f,
+ -0.015339f, -0.015435f, -0.015531f, -0.015627f, -0.015723f, -0.015819f, -0.015914f, -0.016010f,
+ -0.016106f, -0.016202f, -0.016298f, -0.016394f, -0.016490f, -0.016585f, -0.016681f, -0.016777f,
+ -0.016873f, -0.016969f, -0.017065f, -0.017161f, -0.017256f, -0.017352f, -0.017448f, -0.017544f,
+ -0.017640f, -0.017736f, -0.017832f, -0.017927f, -0.018023f, -0.018119f, -0.018215f, -0.018311f,
+ -0.018407f, -0.018503f, -0.018598f, -0.018694f, -0.018790f, -0.018886f, -0.018982f, -0.019078f,
+ -0.019174f, -0.019269f, -0.019365f, -0.019461f, -0.019557f, -0.019653f, -0.019749f, -0.019845f,
+ -0.019940f, -0.020036f, -0.020132f, -0.020228f, -0.020324f, -0.020420f, -0.020516f, -0.020611f,
+ -0.020707f, -0.020803f, -0.020899f, -0.020995f, -0.021091f, -0.021187f, -0.021282f, -0.021378f,
+ -0.021474f, -0.021570f, -0.021666f, -0.021762f, -0.021857f, -0.021953f, -0.022049f, -0.022145f,
+ -0.022241f, -0.022337f, -0.022433f, -0.022528f, -0.022624f, -0.022720f, -0.022816f, -0.022912f,
+ -0.023008f, -0.023104f, -0.023199f, -0.023295f, -0.023391f, -0.023487f, -0.023583f, -0.023679f,
+ -0.023774f, -0.023870f, -0.023966f, -0.024062f, -0.024158f, -0.024254f, -0.024350f, -0.024445f,
+ -0.024541f, -0.024637f, -0.024733f, -0.024829f, -0.024925f, -0.025020f, -0.025116f, -0.025212f,
+ -0.025308f, -0.025404f, -0.025500f, -0.025596f, -0.025691f, -0.025787f, -0.025883f, -0.025979f,
+ -0.026075f, -0.026171f, -0.026266f, -0.026362f, -0.026458f, -0.026554f, -0.026650f, -0.026746f,
+ -0.026841f, -0.026937f, -0.027033f, -0.027129f, -0.027225f, -0.027321f, -0.027416f, -0.027512f,
+ -0.027608f, -0.027704f, -0.027800f, -0.027896f, -0.027991f, -0.028087f, -0.028183f, -0.028279f,
+ -0.028375f, -0.028471f, -0.028567f, -0.028662f, -0.028758f, -0.028854f, -0.028950f, -0.029046f,
+ -0.029142f, -0.029237f, -0.029333f, -0.029429f, -0.029525f, -0.029621f, -0.029717f, -0.029812f,
+ -0.029908f, -0.030004f, -0.030100f, -0.030196f, -0.030291f, -0.030387f, -0.030483f, -0.030579f,
+ -0.030675f, -0.030771f, -0.030866f, -0.030962f, -0.031058f, -0.031154f, -0.031250f, -0.031346f,
+ -0.031441f, -0.031537f, -0.031633f, -0.031729f, -0.031825f, -0.031921f, -0.032016f, -0.032112f,
+ -0.032208f, -0.032304f, -0.032400f, -0.032495f, -0.032591f, -0.032687f, -0.032783f, -0.032879f,
+ -0.032975f, -0.033070f, -0.033166f, -0.033262f, -0.033358f, -0.033454f, -0.033550f, -0.033645f,
+ -0.033741f, -0.033837f, -0.033933f, -0.034029f, -0.034124f, -0.034220f, -0.034316f, -0.034412f,
+ -0.034508f, -0.034604f, -0.034699f, -0.034795f, -0.034891f, -0.034987f, -0.035083f, -0.035178f,
+ -0.035274f, -0.035370f, -0.035466f, -0.035562f, -0.035657f, -0.035753f, -0.035849f, -0.035945f,
+ -0.036041f, -0.036137f, -0.036232f, -0.036328f, -0.036424f, -0.036520f, -0.036616f, -0.036711f,
+ -0.036807f, -0.036903f, -0.036999f, -0.037095f, -0.037190f, -0.037286f, -0.037382f, -0.037478f,
+ -0.037574f, -0.037669f, -0.037765f, -0.037861f, -0.037957f, -0.038053f, -0.038149f, -0.038244f,
+ -0.038340f, -0.038436f, -0.038532f, -0.038628f, -0.038723f, -0.038819f, -0.038915f, -0.039011f,
+ -0.039107f, -0.039202f, -0.039298f, -0.039394f, -0.039490f, -0.039586f, -0.039681f, -0.039777f,
+ -0.039873f, -0.039969f, -0.040065f, -0.040160f, -0.040256f, -0.040352f, -0.040448f, -0.040544f,
+ -0.040639f, -0.040735f, -0.040831f, -0.040927f, -0.041022f, -0.041118f, -0.041214f, -0.041310f,
+ -0.041406f, -0.041501f, -0.041597f, -0.041693f, -0.041789f, -0.041885f, -0.041980f, -0.042076f,
+ -0.042172f, -0.042268f, -0.042364f, -0.042459f, -0.042555f, -0.042651f, -0.042747f, -0.042842f,
+ -0.042938f, -0.043034f, -0.043130f, -0.043226f, -0.043321f, -0.043417f, -0.043513f, -0.043609f,
+ -0.043705f, -0.043800f, -0.043896f, -0.043992f, -0.044088f, -0.044183f, -0.044279f, -0.044375f,
+ -0.044471f, -0.044567f, -0.044662f, -0.044758f, -0.044854f, -0.044950f, -0.045045f, -0.045141f,
+ -0.045237f, -0.045333f, -0.045429f, -0.045524f, -0.045620f, -0.045716f, -0.045812f, -0.045907f,
+ -0.046003f, -0.046099f, -0.046195f, -0.046290f, -0.046386f, -0.046482f, -0.046578f, -0.046674f,
+ -0.046769f, -0.046865f, -0.046961f, -0.047057f, -0.047152f, -0.047248f, -0.047344f, -0.047440f,
+ -0.047535f, -0.047631f, -0.047727f, -0.047823f, -0.047919f, -0.048014f, -0.048110f, -0.048206f,
+ -0.048302f, -0.048397f, -0.048493f, -0.048589f, -0.048685f, -0.048780f, -0.048876f, -0.048972f,
+ -0.049068f, -0.049163f, -0.049259f, -0.049355f, -0.049451f, -0.049546f, -0.049642f, -0.049738f,
+ -0.049834f, -0.049929f, -0.050025f, -0.050121f, -0.050217f, -0.050312f, -0.050408f, -0.050504f,
+ -0.050600f, -0.050696f, -0.050791f, -0.050887f, -0.050983f, -0.051078f, -0.051174f, -0.051270f,
+ -0.051366f, -0.051461f, -0.051557f, -0.051653f, -0.051749f, -0.051844f, -0.051940f, -0.052036f,
+ -0.052132f, -0.052227f, -0.052323f, -0.052419f, -0.052515f, -0.052610f, -0.052706f, -0.052802f,
+ -0.052898f, -0.052993f, -0.053089f, -0.053185f, -0.053281f, -0.053376f, -0.053472f, -0.053568f,
+ -0.053664f, -0.053759f, -0.053855f, -0.053951f, -0.054046f, -0.054142f, -0.054238f, -0.054334f,
+ -0.054429f, -0.054525f, -0.054621f, -0.054717f, -0.054812f, -0.054908f, -0.055004f, -0.055100f,
+ -0.055195f, -0.055291f, -0.055387f, -0.055482f, -0.055578f, -0.055674f, -0.055770f, -0.055865f,
+ -0.055961f, -0.056057f, -0.056152f, -0.056248f, -0.056344f, -0.056440f, -0.056535f, -0.056631f,
+ -0.056727f, -0.056823f, -0.056918f, -0.057014f, -0.057110f, -0.057205f, -0.057301f, -0.057397f,
+ -0.057493f, -0.057588f, -0.057684f, -0.057780f, -0.057875f, -0.057971f, -0.058067f, -0.058163f,
+ -0.058258f, -0.058354f, -0.058450f, -0.058545f, -0.058641f, -0.058737f, -0.058833f, -0.058928f,
+ -0.059024f, -0.059120f, -0.059215f, -0.059311f, -0.059407f, -0.059502f, -0.059598f, -0.059694f,
+ -0.059790f, -0.059885f, -0.059981f, -0.060077f, -0.060172f, -0.060268f, -0.060364f, -0.060459f,
+ -0.060555f, -0.060651f, -0.060747f, -0.060842f, -0.060938f, -0.061034f, -0.061129f, -0.061225f,
+ -0.061321f, -0.061416f, -0.061512f, -0.061608f, -0.061704f, -0.061799f, -0.061895f, -0.061991f,
+ -0.062086f, -0.062182f, -0.062278f, -0.062373f, -0.062469f, -0.062565f, -0.062660f, -0.062756f,
+ -0.062852f, -0.062947f, -0.063043f, -0.063139f, -0.063234f, -0.063330f, -0.063426f, -0.063522f,
+ -0.063617f, -0.063713f, -0.063809f, -0.063904f, -0.064000f, -0.064096f, -0.064191f, -0.064287f,
+ -0.064383f, -0.064478f, -0.064574f, -0.064670f, -0.064765f, -0.064861f, -0.064957f, -0.065052f,
+ -0.065148f, -0.065244f, -0.065339f, -0.065435f, -0.065531f, -0.065626f, -0.065722f, -0.065818f,
+ -0.065913f, -0.066009f, -0.066105f, -0.066200f, -0.066296f, -0.066392f, -0.066487f, -0.066583f,
+ -0.066679f, -0.066774f, -0.066870f, -0.066966f, -0.067061f, -0.067157f, -0.067253f, -0.067348f,
+ -0.067444f, -0.067540f, -0.067635f, -0.067731f, -0.067827f, -0.067922f, -0.068018f, -0.068113f,
+ -0.068209f, -0.068305f, -0.068400f, -0.068496f, -0.068592f, -0.068687f, -0.068783f, -0.068879f,
+ -0.068974f, -0.069070f, -0.069166f, -0.069261f, -0.069357f, -0.069453f, -0.069548f, -0.069644f,
+ -0.069739f, -0.069835f, -0.069931f, -0.070026f, -0.070122f, -0.070218f, -0.070313f, -0.070409f,
+ -0.070505f, -0.070600f, -0.070696f, -0.070791f, -0.070887f, -0.070983f, -0.071078f, -0.071174f,
+ -0.071270f, -0.071365f, -0.071461f, -0.071557f, -0.071652f, -0.071748f, -0.071843f, -0.071939f,
+ -0.072035f, -0.072130f, -0.072226f, -0.072322f, -0.072417f, -0.072513f, -0.072608f, -0.072704f,
+ -0.072800f, -0.072895f, -0.072991f, -0.073086f, -0.073182f, -0.073278f, -0.073373f, -0.073469f,
+ -0.073565f, -0.073660f, -0.073756f, -0.073851f, -0.073947f, -0.074043f, -0.074138f, -0.074234f,
+ -0.074329f, -0.074425f, -0.074521f, -0.074616f, -0.074712f, -0.074807f, -0.074903f, -0.074999f,
+ -0.075094f, -0.075190f, -0.075286f, -0.075381f, -0.075477f, -0.075572f, -0.075668f, -0.075764f,
+ -0.075859f, -0.075955f, -0.076050f, -0.076146f, -0.076241f, -0.076337f, -0.076433f, -0.076528f,
+ -0.076624f, -0.076719f, -0.076815f, -0.076911f, -0.077006f, -0.077102f, -0.077197f, -0.077293f,
+ -0.077389f, -0.077484f, -0.077580f, -0.077675f, -0.077771f, -0.077866f, -0.077962f, -0.078058f,
+ -0.078153f, -0.078249f, -0.078344f, -0.078440f, -0.078536f, -0.078631f, -0.078727f, -0.078822f,
+ -0.078918f, -0.079013f, -0.079109f, -0.079205f, -0.079300f, -0.079396f, -0.079491f, -0.079587f,
+ -0.079682f, -0.079778f, -0.079874f, -0.079969f, -0.080065f, -0.080160f, -0.080256f, -0.080351f,
+ -0.080447f, -0.080543f, -0.080638f, -0.080734f, -0.080829f, -0.080925f, -0.081020f, -0.081116f,
+ -0.081211f, -0.081307f, -0.081403f, -0.081498f, -0.081594f, -0.081689f, -0.081785f, -0.081880f,
+ -0.081976f, -0.082071f, -0.082167f, -0.082263f, -0.082358f, -0.082454f, -0.082549f, -0.082645f,
+ -0.082740f, -0.082836f, -0.082931f, -0.083027f, -0.083122f, -0.083218f, -0.083314f, -0.083409f,
+ -0.083505f, -0.083600f, -0.083696f, -0.083791f, -0.083887f, -0.083982f, -0.084078f, -0.084173f,
+ -0.084269f, -0.084364f, -0.084460f, -0.084555f, -0.084651f, -0.084747f, -0.084842f, -0.084938f,
+ -0.085033f, -0.085129f, -0.085224f, -0.085320f, -0.085415f, -0.085511f, -0.085606f, -0.085702f,
+ -0.085797f, -0.085893f, -0.085988f, -0.086084f, -0.086179f, -0.086275f, -0.086370f, -0.086466f,
+ -0.086561f, -0.086657f, -0.086752f, -0.086848f, -0.086943f, -0.087039f, -0.087135f, -0.087230f,
+ -0.087326f, -0.087421f, -0.087517f, -0.087612f, -0.087708f, -0.087803f, -0.087899f, -0.087994f,
+ -0.088090f, -0.088185f, -0.088281f, -0.088376f, -0.088472f, -0.088567f, -0.088663f, -0.088758f,
+ -0.088854f, -0.088949f, -0.089045f, -0.089140f, -0.089236f, -0.089331f, -0.089427f, -0.089522f,
+ -0.089617f, -0.089713f, -0.089808f, -0.089904f, -0.089999f, -0.090095f, -0.090190f, -0.090286f,
+ -0.090381f, -0.090477f, -0.090572f, -0.090668f, -0.090763f, -0.090859f, -0.090954f, -0.091050f,
+ -0.091145f, -0.091241f, -0.091336f, -0.091432f, -0.091527f, -0.091623f, -0.091718f, -0.091813f,
+ -0.091909f, -0.092004f, -0.092100f, -0.092195f, -0.092291f, -0.092386f, -0.092482f, -0.092577f,
+ -0.092673f, -0.092768f, -0.092864f, -0.092959f, -0.093055f, -0.093150f, -0.093245f, -0.093341f,
+ -0.093436f, -0.093532f, -0.093627f, -0.093723f, -0.093818f, -0.093914f, -0.094009f, -0.094104f,
+ -0.094200f, -0.094295f, -0.094391f, -0.094486f, -0.094582f, -0.094677f, -0.094773f, -0.094868f,
+ -0.094963f, -0.095059f, -0.095154f, -0.095250f, -0.095345f, -0.095441f, -0.095536f, -0.095632f,
+ -0.095727f, -0.095822f, -0.095918f, -0.096013f, -0.096109f, -0.096204f, -0.096300f, -0.096395f,
+ -0.096490f, -0.096586f, -0.096681f, -0.096777f, -0.096872f, -0.096968f, -0.097063f, -0.097158f,
+ -0.097254f, -0.097349f, -0.097445f, -0.097540f, -0.097635f, -0.097731f, -0.097826f, -0.097922f,
+ -0.098017f, -0.098113f, -0.098208f, -0.098303f, -0.098399f, -0.098494f, -0.098590f, -0.098685f,
+ -0.098780f, -0.098876f, -0.098971f, -0.099067f, -0.099162f, -0.099257f, -0.099353f, -0.099448f,
+ -0.099544f, -0.099639f, -0.099734f, -0.099830f, -0.099925f, -0.100021f, -0.100116f, -0.100211f,
+ -0.100307f, -0.100402f, -0.100498f, -0.100593f, -0.100688f, -0.100784f, -0.100879f, -0.100974f,
+ -0.101070f, -0.101165f, -0.101261f, -0.101356f, -0.101451f, -0.101547f, -0.101642f, -0.101738f,
+ -0.101833f, -0.101928f, -0.102024f, -0.102119f, -0.102214f, -0.102310f, -0.102405f, -0.102500f,
+ -0.102596f, -0.102691f, -0.102787f, -0.102882f, -0.102977f, -0.103073f, -0.103168f, -0.103263f,
+ -0.103359f, -0.103454f, -0.103550f, -0.103645f, -0.103740f, -0.103836f, -0.103931f, -0.104026f,
+ -0.104122f, -0.104217f, -0.104312f, -0.104408f, -0.104503f, -0.104598f, -0.104694f, -0.104789f,
+ -0.104884f, -0.104980f, -0.105075f, -0.105170f, -0.105266f, -0.105361f, -0.105456f, -0.105552f,
+ -0.105647f, -0.105742f, -0.105838f, -0.105933f, -0.106028f, -0.106124f, -0.106219f, -0.106314f,
+ -0.106410f, -0.106505f, -0.106600f, -0.106696f, -0.106791f, -0.106886f, -0.106982f, -0.107077f,
+ -0.107172f, -0.107268f, -0.107363f, -0.107458f, -0.107554f, -0.107649f, -0.107744f, -0.107840f,
+ -0.107935f, -0.108030f, -0.108126f, -0.108221f, -0.108316f, -0.108412f, -0.108507f, -0.108602f,
+ -0.108697f, -0.108793f, -0.108888f, -0.108983f, -0.109079f, -0.109174f, -0.109269f, -0.109365f,
+ -0.109460f, -0.109555f, -0.109650f, -0.109746f, -0.109841f, -0.109936f, -0.110032f, -0.110127f,
+ -0.110222f, -0.110317f, -0.110413f, -0.110508f, -0.110603f, -0.110699f, -0.110794f, -0.110889f,
+ -0.110984f, -0.111080f, -0.111175f, -0.111270f, -0.111366f, -0.111461f, -0.111556f, -0.111651f,
+ -0.111747f, -0.111842f, -0.111937f, -0.112033f, -0.112128f, -0.112223f, -0.112318f, -0.112414f,
+ -0.112509f, -0.112604f, -0.112699f, -0.112795f, -0.112890f, -0.112985f, -0.113080f, -0.113176f,
+ -0.113271f, -0.113366f, -0.113461f, -0.113557f, -0.113652f, -0.113747f, -0.113842f, -0.113938f,
+ -0.114033f, -0.114128f, -0.114223f, -0.114319f, -0.114414f, -0.114509f, -0.114604f, -0.114700f,
+ -0.114795f, -0.114890f, -0.114985f, -0.115081f, -0.115176f, -0.115271f, -0.115366f, -0.115462f,
+ -0.115557f, -0.115652f, -0.115747f, -0.115842f, -0.115938f, -0.116033f, -0.116128f, -0.116223f,
+ -0.116319f, -0.116414f, -0.116509f, -0.116604f, -0.116700f, -0.116795f, -0.116890f, -0.116985f,
+ -0.117080f, -0.117176f, -0.117271f, -0.117366f, -0.117461f, -0.117556f, -0.117652f, -0.117747f,
+ -0.117842f, -0.117937f, -0.118032f, -0.118128f, -0.118223f, -0.118318f, -0.118413f, -0.118508f,
+ -0.118604f, -0.118699f, -0.118794f, -0.118889f, -0.118984f, -0.119080f, -0.119175f, -0.119270f,
+ -0.119365f, -0.119460f, -0.119556f, -0.119651f, -0.119746f, -0.119841f, -0.119936f, -0.120032f,
+ -0.120127f, -0.120222f, -0.120317f, -0.120412f, -0.120507f, -0.120603f, -0.120698f, -0.120793f,
+ -0.120888f, -0.120983f, -0.121078f, -0.121174f, -0.121269f, -0.121364f, -0.121459f, -0.121554f,
+ -0.121649f, -0.121745f, -0.121840f, -0.121935f, -0.122030f, -0.122125f, -0.122220f, -0.122316f,
+ -0.122411f, -0.122506f, -0.122601f, -0.122696f, -0.122791f, -0.122886f, -0.122982f, -0.123077f,
+ -0.123172f, -0.123267f, -0.123362f, -0.123457f, -0.123552f, -0.123648f, -0.123743f, -0.123838f,
+ -0.123933f, -0.124028f, -0.124123f, -0.124218f, -0.124314f, -0.124409f, -0.124504f, -0.124599f,
+ -0.124694f, -0.124789f, -0.124884f, -0.124979f, -0.125075f, -0.125170f, -0.125265f, -0.125360f,
+ -0.125455f, -0.125550f, -0.125645f, -0.125740f, -0.125835f, -0.125931f, -0.126026f, -0.126121f,
+ -0.126216f, -0.126311f, -0.126406f, -0.126501f, -0.126596f, -0.126691f, -0.126787f, -0.126882f,
+ -0.126977f, -0.127072f, -0.127167f, -0.127262f, -0.127357f, -0.127452f, -0.127547f, -0.127642f,
+ -0.127737f, -0.127833f, -0.127928f, -0.128023f, -0.128118f, -0.128213f, -0.128308f, -0.128403f,
+ -0.128498f, -0.128593f, -0.128688f, -0.128783f, -0.128878f, -0.128973f, -0.129069f, -0.129164f,
+ -0.129259f, -0.129354f, -0.129449f, -0.129544f, -0.129639f, -0.129734f, -0.129829f, -0.129924f,
+ -0.130019f, -0.130114f, -0.130209f, -0.130304f, -0.130399f, -0.130495f, -0.130590f, -0.130685f,
+ -0.130780f, -0.130875f, -0.130970f, -0.131065f, -0.131160f, -0.131255f, -0.131350f, -0.131445f,
+ -0.131540f, -0.131635f, -0.131730f, -0.131825f, -0.131920f, -0.132015f, -0.132110f, -0.132205f,
+ -0.132300f, -0.132395f, -0.132490f, -0.132585f, -0.132680f, -0.132775f, -0.132870f, -0.132966f,
+ -0.133061f, -0.133156f, -0.133251f, -0.133346f, -0.133441f, -0.133536f, -0.133631f, -0.133726f,
+ -0.133821f, -0.133916f, -0.134011f, -0.134106f, -0.134201f, -0.134296f, -0.134391f, -0.134486f,
+ -0.134581f, -0.134676f, -0.134771f, -0.134866f, -0.134961f, -0.135056f, -0.135151f, -0.135246f,
+ -0.135341f, -0.135436f, -0.135531f, -0.135626f, -0.135721f, -0.135816f, -0.135911f, -0.136006f,
+ -0.136101f, -0.136196f, -0.136291f, -0.136386f, -0.136480f, -0.136575f, -0.136670f, -0.136765f,
+ -0.136860f, -0.136955f, -0.137050f, -0.137145f, -0.137240f, -0.137335f, -0.137430f, -0.137525f,
+ -0.137620f, -0.137715f, -0.137810f, -0.137905f, -0.138000f, -0.138095f, -0.138190f, -0.138285f,
+ -0.138380f, -0.138475f, -0.138570f, -0.138665f, -0.138760f, -0.138855f, -0.138949f, -0.139044f,
+ -0.139139f, -0.139234f, -0.139329f, -0.139424f, -0.139519f, -0.139614f, -0.139709f, -0.139804f,
+ -0.139899f, -0.139994f, -0.140089f, -0.140184f, -0.140279f, -0.140373f, -0.140468f, -0.140563f,
+ -0.140658f, -0.140753f, -0.140848f, -0.140943f, -0.141038f, -0.141133f, -0.141228f, -0.141323f,
+ -0.141418f, -0.141512f, -0.141607f, -0.141702f, -0.141797f, -0.141892f, -0.141987f, -0.142082f,
+ -0.142177f, -0.142272f, -0.142367f, -0.142461f, -0.142556f, -0.142651f, -0.142746f, -0.142841f,
+ -0.142936f, -0.143031f, -0.143126f, -0.143221f, -0.143316f, -0.143410f, -0.143505f, -0.143600f,
+ -0.143695f, -0.143790f, -0.143885f, -0.143980f, -0.144075f, -0.144169f, -0.144264f, -0.144359f,
+ -0.144454f, -0.144549f, -0.144644f, -0.144739f, -0.144833f, -0.144928f, -0.145023f, -0.145118f,
+ -0.145213f, -0.145308f, -0.145403f, -0.145497f, -0.145592f, -0.145687f, -0.145782f, -0.145877f,
+ -0.145972f, -0.146067f, -0.146161f, -0.146256f, -0.146351f, -0.146446f, -0.146541f, -0.146636f,
+ -0.146730f, -0.146825f, -0.146920f, -0.147015f, -0.147110f, -0.147205f, -0.147299f, -0.147394f,
+ -0.147489f, -0.147584f, -0.147679f, -0.147774f, -0.147868f, -0.147963f, -0.148058f, -0.148153f,
+ -0.148248f, -0.148342f, -0.148437f, -0.148532f, -0.148627f, -0.148722f, -0.148817f, -0.148911f,
+ -0.149006f, -0.149101f, -0.149196f, -0.149291f, -0.149385f, -0.149480f, -0.149575f, -0.149670f,
+ -0.149765f, -0.149859f, -0.149954f, -0.150049f, -0.150144f, -0.150238f, -0.150333f, -0.150428f,
+ -0.150523f, -0.150618f, -0.150712f, -0.150807f, -0.150902f, -0.150997f, -0.151092f, -0.151186f,
+ -0.151281f, -0.151376f, -0.151471f, -0.151565f, -0.151660f, -0.151755f, -0.151850f, -0.151944f,
+ -0.152039f, -0.152134f, -0.152229f, -0.152323f, -0.152418f, -0.152513f, -0.152608f, -0.152702f,
+ -0.152797f, -0.152892f, -0.152987f, -0.153081f, -0.153176f, -0.153271f, -0.153366f, -0.153460f,
+ -0.153555f, -0.153650f, -0.153745f, -0.153839f, -0.153934f, -0.154029f, -0.154124f, -0.154218f,
+ -0.154313f, -0.154408f, -0.154502f, -0.154597f, -0.154692f, -0.154787f, -0.154881f, -0.154976f,
+ -0.155071f, -0.155165f, -0.155260f, -0.155355f, -0.155450f, -0.155544f, -0.155639f, -0.155734f,
+ -0.155828f, -0.155923f, -0.156018f, -0.156112f, -0.156207f, -0.156302f, -0.156397f, -0.156491f,
+ -0.156586f, -0.156681f, -0.156775f, -0.156870f, -0.156965f, -0.157059f, -0.157154f, -0.157249f,
+ -0.157343f, -0.157438f, -0.157533f, -0.157627f, -0.157722f, -0.157817f, -0.157912f, -0.158006f,
+ -0.158101f, -0.158196f, -0.158290f, -0.158385f, -0.158480f, -0.158574f, -0.158669f, -0.158763f,
+ -0.158858f, -0.158953f, -0.159047f, -0.159142f, -0.159237f, -0.159331f, -0.159426f, -0.159521f,
+ -0.159615f, -0.159710f, -0.159805f, -0.159899f, -0.159994f, -0.160089f, -0.160183f, -0.160278f,
+ -0.160372f, -0.160467f, -0.160562f, -0.160656f, -0.160751f, -0.160846f, -0.160940f, -0.161035f,
+ -0.161129f, -0.161224f, -0.161319f, -0.161413f, -0.161508f, -0.161603f, -0.161697f, -0.161792f,
+ -0.161886f, -0.161981f, -0.162076f, -0.162170f, -0.162265f, -0.162359f, -0.162454f, -0.162549f,
+ -0.162643f, -0.162738f, -0.162832f, -0.162927f, -0.163022f, -0.163116f, -0.163211f, -0.163305f,
+ -0.163400f, -0.163495f, -0.163589f, -0.163684f, -0.163778f, -0.163873f, -0.163967f, -0.164062f,
+ -0.164157f, -0.164251f, -0.164346f, -0.164440f, -0.164535f, -0.164629f, -0.164724f, -0.164819f,
+ -0.164913f, -0.165008f, -0.165102f, -0.165197f, -0.165291f, -0.165386f, -0.165480f, -0.165575f,
+ -0.165670f, -0.165764f, -0.165859f, -0.165953f, -0.166048f, -0.166142f, -0.166237f, -0.166331f,
+ -0.166426f, -0.166520f, -0.166615f, -0.166710f, -0.166804f, -0.166899f, -0.166993f, -0.167088f,
+ -0.167182f, -0.167277f, -0.167371f, -0.167466f, -0.167560f, -0.167655f, -0.167749f, -0.167844f,
+ -0.167938f, -0.168033f, -0.168127f, -0.168222f, -0.168316f, -0.168411f, -0.168505f, -0.168600f,
+ -0.168694f, -0.168789f, -0.168883f, -0.168978f, -0.169072f, -0.169167f, -0.169261f, -0.169356f,
+ -0.169450f, -0.169545f, -0.169639f, -0.169734f, -0.169828f, -0.169923f, -0.170017f, -0.170112f,
+ -0.170206f, -0.170301f, -0.170395f, -0.170490f, -0.170584f, -0.170678f, -0.170773f, -0.170867f,
+ -0.170962f, -0.171056f, -0.171151f, -0.171245f, -0.171340f, -0.171434f, -0.171529f, -0.171623f,
+ -0.171718f, -0.171812f, -0.171906f, -0.172001f, -0.172095f, -0.172190f, -0.172284f, -0.172379f,
+ -0.172473f, -0.172568f, -0.172662f, -0.172756f, -0.172851f, -0.172945f, -0.173040f, -0.173134f,
+ -0.173229f, -0.173323f, -0.173417f, -0.173512f, -0.173606f, -0.173701f, -0.173795f, -0.173889f,
+ -0.173984f, -0.174078f, -0.174173f, -0.174267f, -0.174362f, -0.174456f, -0.174550f, -0.174645f,
+ -0.174739f, -0.174834f, -0.174928f, -0.175022f, -0.175117f, -0.175211f, -0.175305f, -0.175400f,
+ -0.175494f, -0.175589f, -0.175683f, -0.175777f, -0.175872f, -0.175966f, -0.176061f, -0.176155f,
+ -0.176249f, -0.176344f, -0.176438f, -0.176532f, -0.176627f, -0.176721f, -0.176815f, -0.176910f,
+ -0.177004f, -0.177099f, -0.177193f, -0.177287f, -0.177382f, -0.177476f, -0.177570f, -0.177665f,
+ -0.177759f, -0.177853f, -0.177948f, -0.178042f, -0.178136f, -0.178231f, -0.178325f, -0.178419f,
+ -0.178514f, -0.178608f, -0.178702f, -0.178797f, -0.178891f, -0.178985f, -0.179080f, -0.179174f,
+ -0.179268f, -0.179363f, -0.179457f, -0.179551f, -0.179646f, -0.179740f, -0.179834f, -0.179929f,
+ -0.180023f, -0.180117f, -0.180212f, -0.180306f, -0.180400f, -0.180494f, -0.180589f, -0.180683f,
+ -0.180777f, -0.180872f, -0.180966f, -0.181060f, -0.181154f, -0.181249f, -0.181343f, -0.181437f,
+ -0.181532f, -0.181626f, -0.181720f, -0.181814f, -0.181909f, -0.182003f, -0.182097f, -0.182192f,
+ -0.182286f, -0.182380f, -0.182474f, -0.182569f, -0.182663f, -0.182757f, -0.182851f, -0.182946f,
+ -0.183040f, -0.183134f, -0.183228f, -0.183323f, -0.183417f, -0.183511f, -0.183605f, -0.183700f,
+ -0.183794f, -0.183888f, -0.183982f, -0.184077f, -0.184171f, -0.184265f, -0.184359f, -0.184454f,
+ -0.184548f, -0.184642f, -0.184736f, -0.184830f, -0.184925f, -0.185019f, -0.185113f, -0.185207f,
+ -0.185301f, -0.185396f, -0.185490f, -0.185584f, -0.185678f, -0.185773f, -0.185867f, -0.185961f,
+ -0.186055f, -0.186149f, -0.186244f, -0.186338f, -0.186432f, -0.186526f, -0.186620f, -0.186715f,
+ -0.186809f, -0.186903f, -0.186997f, -0.187091f, -0.187185f, -0.187280f, -0.187374f, -0.187468f,
+ -0.187562f, -0.187656f, -0.187750f, -0.187845f, -0.187939f, -0.188033f, -0.188127f, -0.188221f,
+ -0.188315f, -0.188410f, -0.188504f, -0.188598f, -0.188692f, -0.188786f, -0.188880f, -0.188975f,
+ -0.189069f, -0.189163f, -0.189257f, -0.189351f, -0.189445f, -0.189539f, -0.189634f, -0.189728f,
+ -0.189822f, -0.189916f, -0.190010f, -0.190104f, -0.190198f, -0.190292f, -0.190387f, -0.190481f,
+ -0.190575f, -0.190669f, -0.190763f, -0.190857f, -0.190951f, -0.191045f, -0.191139f, -0.191234f,
+ -0.191328f, -0.191422f, -0.191516f, -0.191610f, -0.191704f, -0.191798f, -0.191892f, -0.191986f,
+ -0.192080f, -0.192174f, -0.192269f, -0.192363f, -0.192457f, -0.192551f, -0.192645f, -0.192739f,
+ -0.192833f, -0.192927f, -0.193021f, -0.193115f, -0.193209f, -0.193303f, -0.193397f, -0.193492f,
+ -0.193586f, -0.193680f, -0.193774f, -0.193868f, -0.193962f, -0.194056f, -0.194150f, -0.194244f,
+ -0.194338f, -0.194432f, -0.194526f, -0.194620f, -0.194714f, -0.194808f, -0.194902f, -0.194996f,
+ -0.195090f, -0.195184f, -0.195278f, -0.195372f, -0.195466f, -0.195560f, -0.195654f, -0.195748f,
+ -0.195843f, -0.195937f, -0.196031f, -0.196125f, -0.196219f, -0.196313f, -0.196407f, -0.196501f,
+ -0.196595f, -0.196689f, -0.196783f, -0.196877f, -0.196971f, -0.197065f, -0.197159f, -0.197253f,
+ -0.197347f, -0.197441f, -0.197535f, -0.197629f, -0.197722f, -0.197816f, -0.197910f, -0.198004f,
+ -0.198098f, -0.198192f, -0.198286f, -0.198380f, -0.198474f, -0.198568f, -0.198662f, -0.198756f,
+ -0.198850f, -0.198944f, -0.199038f, -0.199132f, -0.199226f, -0.199320f, -0.199414f, -0.199508f,
+ -0.199602f, -0.199696f, -0.199790f, -0.199884f, -0.199978f, -0.200071f, -0.200165f, -0.200259f,
+ -0.200353f, -0.200447f, -0.200541f, -0.200635f, -0.200729f, -0.200823f, -0.200917f, -0.201011f,
+ -0.201105f, -0.201199f, -0.201292f, -0.201386f, -0.201480f, -0.201574f, -0.201668f, -0.201762f,
+ -0.201856f, -0.201950f, -0.202044f, -0.202138f, -0.202231f, -0.202325f, -0.202419f, -0.202513f,
+ -0.202607f, -0.202701f, -0.202795f, -0.202889f, -0.202983f, -0.203076f, -0.203170f, -0.203264f,
+ -0.203358f, -0.203452f, -0.203546f, -0.203640f, -0.203734f, -0.203827f, -0.203921f, -0.204015f,
+ -0.204109f, -0.204203f, -0.204297f, -0.204391f, -0.204484f, -0.204578f, -0.204672f, -0.204766f,
+ -0.204860f, -0.204954f, -0.205047f, -0.205141f, -0.205235f, -0.205329f, -0.205423f, -0.205517f,
+ -0.205610f, -0.205704f, -0.205798f, -0.205892f, -0.205986f, -0.206080f, -0.206173f, -0.206267f,
+ -0.206361f, -0.206455f, -0.206549f, -0.206642f, -0.206736f, -0.206830f, -0.206924f, -0.207018f,
+ -0.207111f, -0.207205f, -0.207299f, -0.207393f, -0.207487f, -0.207580f, -0.207674f, -0.207768f,
+ -0.207862f, -0.207955f, -0.208049f, -0.208143f, -0.208237f, -0.208331f, -0.208424f, -0.208518f,
+ -0.208612f, -0.208706f, -0.208799f, -0.208893f, -0.208987f, -0.209081f, -0.209174f, -0.209268f,
+ -0.209362f, -0.209456f, -0.209549f, -0.209643f, -0.209737f, -0.209831f, -0.209924f, -0.210018f,
+ -0.210112f, -0.210206f, -0.210299f, -0.210393f, -0.210487f, -0.210580f, -0.210674f, -0.210768f,
+ -0.210862f, -0.210955f, -0.211049f, -0.211143f, -0.211237f, -0.211330f, -0.211424f, -0.211518f,
+ -0.211611f, -0.211705f, -0.211799f, -0.211892f, -0.211986f, -0.212080f, -0.212174f, -0.212267f,
+ -0.212361f, -0.212455f, -0.212548f, -0.212642f, -0.212736f, -0.212829f, -0.212923f, -0.213017f,
+ -0.213110f, -0.213204f, -0.213298f, -0.213391f, -0.213485f, -0.213579f, -0.213672f, -0.213766f,
+ -0.213860f, -0.213953f, -0.214047f, -0.214141f, -0.214234f, -0.214328f, -0.214422f, -0.214515f,
+ -0.214609f, -0.214702f, -0.214796f, -0.214890f, -0.214983f, -0.215077f, -0.215171f, -0.215264f,
+ -0.215358f, -0.215451f, -0.215545f, -0.215639f, -0.215732f, -0.215826f, -0.215920f, -0.216013f,
+ -0.216107f, -0.216200f, -0.216294f, -0.216388f, -0.216481f, -0.216575f, -0.216668f, -0.216762f,
+ -0.216856f, -0.216949f, -0.217043f, -0.217136f, -0.217230f, -0.217324f, -0.217417f, -0.217511f,
+ -0.217604f, -0.217698f, -0.217791f, -0.217885f, -0.217979f, -0.218072f, -0.218166f, -0.218259f,
+ -0.218353f, -0.218446f, -0.218540f, -0.218633f, -0.218727f, -0.218821f, -0.218914f, -0.219008f,
+ -0.219101f, -0.219195f, -0.219288f, -0.219382f, -0.219475f, -0.219569f, -0.219662f, -0.219756f,
+ -0.219850f, -0.219943f, -0.220037f, -0.220130f, -0.220224f, -0.220317f, -0.220411f, -0.220504f,
+ -0.220598f, -0.220691f, -0.220785f, -0.220878f, -0.220972f, -0.221065f, -0.221159f, -0.221252f,
+ -0.221346f, -0.221439f, -0.221533f, -0.221626f, -0.221720f, -0.221813f, -0.221907f, -0.222000f,
+ -0.222094f, -0.222187f, -0.222281f, -0.222374f, -0.222468f, -0.222561f, -0.222654f, -0.222748f,
+ -0.222841f, -0.222935f, -0.223028f, -0.223122f, -0.223215f, -0.223309f, -0.223402f, -0.223496f,
+ -0.223589f, -0.223682f, -0.223776f, -0.223869f, -0.223963f, -0.224056f, -0.224150f, -0.224243f,
+ -0.224337f, -0.224430f, -0.224523f, -0.224617f, -0.224710f, -0.224804f, -0.224897f, -0.224991f,
+ -0.225084f, -0.225177f, -0.225271f, -0.225364f, -0.225458f, -0.225551f, -0.225644f, -0.225738f,
+ -0.225831f, -0.225925f, -0.226018f, -0.226111f, -0.226205f, -0.226298f, -0.226391f, -0.226485f,
+ -0.226578f, -0.226672f, -0.226765f, -0.226858f, -0.226952f, -0.227045f, -0.227139f, -0.227232f,
+ -0.227325f, -0.227419f, -0.227512f, -0.227605f, -0.227699f, -0.227792f, -0.227885f, -0.227979f,
+ -0.228072f, -0.228165f, -0.228259f, -0.228352f, -0.228445f, -0.228539f, -0.228632f, -0.228725f,
+ -0.228819f, -0.228912f, -0.229005f, -0.229099f, -0.229192f, -0.229285f, -0.229379f, -0.229472f,
+ -0.229565f, -0.229659f, -0.229752f, -0.229845f, -0.229939f, -0.230032f, -0.230125f, -0.230218f,
+ -0.230312f, -0.230405f, -0.230498f, -0.230592f, -0.230685f, -0.230778f, -0.230872f, -0.230965f,
+ -0.231058f, -0.231151f, -0.231245f, -0.231338f, -0.231431f, -0.231524f, -0.231618f, -0.231711f,
+ -0.231804f, -0.231898f, -0.231991f, -0.232084f, -0.232177f, -0.232271f, -0.232364f, -0.232457f,
+ -0.232550f, -0.232644f, -0.232737f, -0.232830f, -0.232923f, -0.233017f, -0.233110f, -0.233203f,
+ -0.233296f, -0.233389f, -0.233483f, -0.233576f, -0.233669f, -0.233762f, -0.233856f, -0.233949f,
+ -0.234042f, -0.234135f, -0.234228f, -0.234322f, -0.234415f, -0.234508f, -0.234601f, -0.234694f,
+ -0.234788f, -0.234881f, -0.234974f, -0.235067f, -0.235160f, -0.235254f, -0.235347f, -0.235440f,
+ -0.235533f, -0.235626f, -0.235719f, -0.235813f, -0.235906f, -0.235999f, -0.236092f, -0.236185f,
+ -0.236278f, -0.236372f, -0.236465f, -0.236558f, -0.236651f, -0.236744f, -0.236837f, -0.236930f,
+ -0.237024f, -0.237117f, -0.237210f, -0.237303f, -0.237396f, -0.237489f, -0.237582f, -0.237676f,
+ -0.237769f, -0.237862f, -0.237955f, -0.238048f, -0.238141f, -0.238234f, -0.238327f, -0.238420f,
+ -0.238514f, -0.238607f, -0.238700f, -0.238793f, -0.238886f, -0.238979f, -0.239072f, -0.239165f,
+ -0.239258f, -0.239351f, -0.239445f, -0.239538f, -0.239631f, -0.239724f, -0.239817f, -0.239910f,
+ -0.240003f, -0.240096f, -0.240189f, -0.240282f, -0.240375f, -0.240468f, -0.240561f, -0.240654f,
+ -0.240748f, -0.240841f, -0.240934f, -0.241027f, -0.241120f, -0.241213f, -0.241306f, -0.241399f,
+ -0.241492f, -0.241585f, -0.241678f, -0.241771f, -0.241864f, -0.241957f, -0.242050f, -0.242143f,
+ -0.242236f, -0.242329f, -0.242422f, -0.242515f, -0.242608f, -0.242701f, -0.242794f, -0.242887f,
+ -0.242980f, -0.243073f, -0.243166f, -0.243259f, -0.243352f, -0.243445f, -0.243538f, -0.243631f,
+ -0.243724f, -0.243817f, -0.243910f, -0.244003f, -0.244096f, -0.244189f, -0.244282f, -0.244375f,
+ -0.244468f, -0.244561f, -0.244654f, -0.244747f, -0.244840f, -0.244933f, -0.245026f, -0.245119f,
+ -0.245212f, -0.245304f, -0.245397f, -0.245490f, -0.245583f, -0.245676f, -0.245769f, -0.245862f,
+ -0.245955f, -0.246048f, -0.246141f, -0.246234f, -0.246327f, -0.246420f, -0.246513f, -0.246606f,
+ -0.246698f, -0.246791f, -0.246884f, -0.246977f, -0.247070f, -0.247163f, -0.247256f, -0.247349f,
+ -0.247442f, -0.247535f, -0.247627f, -0.247720f, -0.247813f, -0.247906f, -0.247999f, -0.248092f,
+ -0.248185f, -0.248278f, -0.248370f, -0.248463f, -0.248556f, -0.248649f, -0.248742f, -0.248835f,
+ -0.248928f, -0.249020f, -0.249113f, -0.249206f, -0.249299f, -0.249392f, -0.249485f, -0.249578f,
+ -0.249670f, -0.249763f, -0.249856f, -0.249949f, -0.250042f, -0.250135f, -0.250227f, -0.250320f,
+ -0.250413f, -0.250506f, -0.250599f, -0.250691f, -0.250784f, -0.250877f, -0.250970f, -0.251063f,
+ -0.251155f, -0.251248f, -0.251341f, -0.251434f, -0.251527f, -0.251619f, -0.251712f, -0.251805f,
+ -0.251898f, -0.251991f, -0.252083f, -0.252176f, -0.252269f, -0.252362f, -0.252454f, -0.252547f,
+ -0.252640f, -0.252733f, -0.252826f, -0.252918f, -0.253011f, -0.253104f, -0.253197f, -0.253289f,
+ -0.253382f, -0.253475f, -0.253568f, -0.253660f, -0.253753f, -0.253846f, -0.253938f, -0.254031f,
+ -0.254124f, -0.254217f, -0.254309f, -0.254402f, -0.254495f, -0.254588f, -0.254680f, -0.254773f,
+ -0.254866f, -0.254958f, -0.255051f, -0.255144f, -0.255236f, -0.255329f, -0.255422f, -0.255515f,
+ -0.255607f, -0.255700f, -0.255793f, -0.255885f, -0.255978f, -0.256071f, -0.256163f, -0.256256f,
+ -0.256349f, -0.256441f, -0.256534f, -0.256627f, -0.256719f, -0.256812f, -0.256905f, -0.256997f,
+ -0.257090f, -0.257183f, -0.257275f, -0.257368f, -0.257461f, -0.257553f, -0.257646f, -0.257738f,
+ -0.257831f, -0.257924f, -0.258016f, -0.258109f, -0.258202f, -0.258294f, -0.258387f, -0.258479f,
+ -0.258572f, -0.258665f, -0.258757f, -0.258850f, -0.258943f, -0.259035f, -0.259128f, -0.259220f,
+ -0.259313f, -0.259405f, -0.259498f, -0.259591f, -0.259683f, -0.259776f, -0.259868f, -0.259961f,
+ -0.260054f, -0.260146f, -0.260239f, -0.260331f, -0.260424f, -0.260516f, -0.260609f, -0.260702f,
+ -0.260794f, -0.260887f, -0.260979f, -0.261072f, -0.261164f, -0.261257f, -0.261349f, -0.261442f,
+ -0.261534f, -0.261627f, -0.261720f, -0.261812f, -0.261905f, -0.261997f, -0.262090f, -0.262182f,
+ -0.262275f, -0.262367f, -0.262460f, -0.262552f, -0.262645f, -0.262737f, -0.262830f, -0.262922f,
+ -0.263015f, -0.263107f, -0.263200f, -0.263292f, -0.263385f, -0.263477f, -0.263570f, -0.263662f,
+ -0.263755f, -0.263847f, -0.263940f, -0.264032f, -0.264125f, -0.264217f, -0.264309f, -0.264402f,
+ -0.264494f, -0.264587f, -0.264679f, -0.264772f, -0.264864f, -0.264957f, -0.265049f, -0.265142f,
+ -0.265234f, -0.265326f, -0.265419f, -0.265511f, -0.265604f, -0.265696f, -0.265789f, -0.265881f,
+ -0.265973f, -0.266066f, -0.266158f, -0.266251f, -0.266343f, -0.266436f, -0.266528f, -0.266620f,
+ -0.266713f, -0.266805f, -0.266898f, -0.266990f, -0.267082f, -0.267175f, -0.267267f, -0.267359f,
+ -0.267452f, -0.267544f, -0.267637f, -0.267729f, -0.267821f, -0.267914f, -0.268006f, -0.268099f,
+ -0.268191f, -0.268283f, -0.268376f, -0.268468f, -0.268560f, -0.268653f, -0.268745f, -0.268837f,
+ -0.268930f, -0.269022f, -0.269114f, -0.269207f, -0.269299f, -0.269391f, -0.269484f, -0.269576f,
+ -0.269668f, -0.269761f, -0.269853f, -0.269945f, -0.270038f, -0.270130f, -0.270222f, -0.270315f,
+ -0.270407f, -0.270499f, -0.270591f, -0.270684f, -0.270776f, -0.270868f, -0.270961f, -0.271053f,
+ -0.271145f, -0.271237f, -0.271330f, -0.271422f, -0.271514f, -0.271607f, -0.271699f, -0.271791f,
+ -0.271883f, -0.271976f, -0.272068f, -0.272160f, -0.272252f, -0.272345f, -0.272437f, -0.272529f,
+ -0.272621f, -0.272714f, -0.272806f, -0.272898f, -0.272990f, -0.273083f, -0.273175f, -0.273267f,
+ -0.273359f, -0.273451f, -0.273544f, -0.273636f, -0.273728f, -0.273820f, -0.273912f, -0.274005f,
+ -0.274097f, -0.274189f, -0.274281f, -0.274374f, -0.274466f, -0.274558f, -0.274650f, -0.274742f,
+ -0.274834f, -0.274927f, -0.275019f, -0.275111f, -0.275203f, -0.275295f, -0.275387f, -0.275480f,
+ -0.275572f, -0.275664f, -0.275756f, -0.275848f, -0.275940f, -0.276033f, -0.276125f, -0.276217f,
+ -0.276309f, -0.276401f, -0.276493f, -0.276585f, -0.276678f, -0.276770f, -0.276862f, -0.276954f,
+ -0.277046f, -0.277138f, -0.277230f, -0.277322f, -0.277415f, -0.277507f, -0.277599f, -0.277691f,
+ -0.277783f, -0.277875f, -0.277967f, -0.278059f, -0.278151f, -0.278243f, -0.278336f, -0.278428f,
+ -0.278520f, -0.278612f, -0.278704f, -0.278796f, -0.278888f, -0.278980f, -0.279072f, -0.279164f,
+ -0.279256f, -0.279348f, -0.279440f, -0.279532f, -0.279624f, -0.279717f, -0.279809f, -0.279901f,
+ -0.279993f, -0.280085f, -0.280177f, -0.280269f, -0.280361f, -0.280453f, -0.280545f, -0.280637f,
+ -0.280729f, -0.280821f, -0.280913f, -0.281005f, -0.281097f, -0.281189f, -0.281281f, -0.281373f,
+ -0.281465f, -0.281557f, -0.281649f, -0.281741f, -0.281833f, -0.281925f, -0.282017f, -0.282109f,
+ -0.282201f, -0.282293f, -0.282385f, -0.282477f, -0.282569f, -0.282661f, -0.282753f, -0.282845f,
+ -0.282937f, -0.283029f, -0.283120f, -0.283212f, -0.283304f, -0.283396f, -0.283488f, -0.283580f,
+ -0.283672f, -0.283764f, -0.283856f, -0.283948f, -0.284040f, -0.284132f, -0.284224f, -0.284316f,
+ -0.284408f, -0.284499f, -0.284591f, -0.284683f, -0.284775f, -0.284867f, -0.284959f, -0.285051f,
+ -0.285143f, -0.285235f, -0.285327f, -0.285418f, -0.285510f, -0.285602f, -0.285694f, -0.285786f,
+ -0.285878f, -0.285970f, -0.286062f, -0.286153f, -0.286245f, -0.286337f, -0.286429f, -0.286521f,
+ -0.286613f, -0.286705f, -0.286796f, -0.286888f, -0.286980f, -0.287072f, -0.287164f, -0.287256f,
+ -0.287347f, -0.287439f, -0.287531f, -0.287623f, -0.287715f, -0.287807f, -0.287898f, -0.287990f,
+ -0.288082f, -0.288174f, -0.288266f, -0.288357f, -0.288449f, -0.288541f, -0.288633f, -0.288725f,
+ -0.288816f, -0.288908f, -0.289000f, -0.289092f, -0.289184f, -0.289275f, -0.289367f, -0.289459f,
+ -0.289551f, -0.289642f, -0.289734f, -0.289826f, -0.289918f, -0.290009f, -0.290101f, -0.290193f,
+ -0.290285f, -0.290376f, -0.290468f, -0.290560f, -0.290652f, -0.290743f, -0.290835f, -0.290927f,
+ -0.291019f, -0.291110f, -0.291202f, -0.291294f, -0.291385f, -0.291477f, -0.291569f, -0.291661f,
+ -0.291752f, -0.291844f, -0.291936f, -0.292027f, -0.292119f, -0.292211f, -0.292302f, -0.292394f,
+ -0.292486f, -0.292577f, -0.292669f, -0.292761f, -0.292852f, -0.292944f, -0.293036f, -0.293128f,
+ -0.293219f, -0.293311f, -0.293402f, -0.293494f, -0.293586f, -0.293677f, -0.293769f, -0.293861f,
+ -0.293952f, -0.294044f, -0.294136f, -0.294227f, -0.294319f, -0.294410f, -0.294502f, -0.294594f,
+ -0.294685f, -0.294777f, -0.294869f, -0.294960f, -0.295052f, -0.295143f, -0.295235f, -0.295327f,
+ -0.295418f, -0.295510f, -0.295601f, -0.295693f, -0.295785f, -0.295876f, -0.295968f, -0.296059f,
+ -0.296151f, -0.296242f, -0.296334f, -0.296426f, -0.296517f, -0.296609f, -0.296700f, -0.296792f,
+ -0.296883f, -0.296975f, -0.297066f, -0.297158f, -0.297250f, -0.297341f, -0.297433f, -0.297524f,
+ -0.297616f, -0.297707f, -0.297799f, -0.297890f, -0.297982f, -0.298073f, -0.298165f, -0.298256f,
+ -0.298348f, -0.298439f, -0.298531f, -0.298622f, -0.298714f, -0.298805f, -0.298897f, -0.298988f,
+ -0.299080f, -0.299171f, -0.299263f, -0.299354f, -0.299446f, -0.299537f, -0.299629f, -0.299720f,
+ -0.299812f, -0.299903f, -0.299995f, -0.300086f, -0.300177f, -0.300269f, -0.300360f, -0.300452f,
+ -0.300543f, -0.300635f, -0.300726f, -0.300818f, -0.300909f, -0.301000f, -0.301092f, -0.301183f,
+ -0.301275f, -0.301366f, -0.301458f, -0.301549f, -0.301640f, -0.301732f, -0.301823f, -0.301915f,
+ -0.302006f, -0.302097f, -0.302189f, -0.302280f, -0.302372f, -0.302463f, -0.302554f, -0.302646f,
+ -0.302737f, -0.302828f, -0.302920f, -0.303011f, -0.303103f, -0.303194f, -0.303285f, -0.303377f,
+ -0.303468f, -0.303559f, -0.303651f, -0.303742f, -0.303833f, -0.303925f, -0.304016f, -0.304107f,
+ -0.304199f, -0.304290f, -0.304381f, -0.304473f, -0.304564f, -0.304655f, -0.304747f, -0.304838f,
+ -0.304929f, -0.305021f, -0.305112f, -0.305203f, -0.305294f, -0.305386f, -0.305477f, -0.305568f,
+ -0.305660f, -0.305751f, -0.305842f, -0.305933f, -0.306025f, -0.306116f, -0.306207f, -0.306299f,
+ -0.306390f, -0.306481f, -0.306572f, -0.306664f, -0.306755f, -0.306846f, -0.306937f, -0.307029f,
+ -0.307120f, -0.307211f, -0.307302f, -0.307394f, -0.307485f, -0.307576f, -0.307667f, -0.307758f,
+ -0.307850f, -0.307941f, -0.308032f, -0.308123f, -0.308214f, -0.308306f, -0.308397f, -0.308488f,
+ -0.308579f, -0.308670f, -0.308762f, -0.308853f, -0.308944f, -0.309035f, -0.309126f, -0.309218f,
+ -0.309309f, -0.309400f, -0.309491f, -0.309582f, -0.309673f, -0.309765f, -0.309856f, -0.309947f,
+ -0.310038f, -0.310129f, -0.310220f, -0.310311f, -0.310403f, -0.310494f, -0.310585f, -0.310676f,
+ -0.310767f, -0.310858f, -0.310949f, -0.311041f, -0.311132f, -0.311223f, -0.311314f, -0.311405f,
+ -0.311496f, -0.311587f, -0.311678f, -0.311769f, -0.311860f, -0.311952f, -0.312043f, -0.312134f,
+ -0.312225f, -0.312316f, -0.312407f, -0.312498f, -0.312589f, -0.312680f, -0.312771f, -0.312862f,
+ -0.312953f, -0.313044f, -0.313135f, -0.313227f, -0.313318f, -0.313409f, -0.313500f, -0.313591f,
+ -0.313682f, -0.313773f, -0.313864f, -0.313955f, -0.314046f, -0.314137f, -0.314228f, -0.314319f,
+ -0.314410f, -0.314501f, -0.314592f, -0.314683f, -0.314774f, -0.314865f, -0.314956f, -0.315047f,
+ -0.315138f, -0.315229f, -0.315320f, -0.315411f, -0.315502f, -0.315593f, -0.315684f, -0.315775f,
+ -0.315866f, -0.315957f, -0.316048f, -0.316139f, -0.316230f, -0.316321f, -0.316411f, -0.316502f,
+ -0.316593f, -0.316684f, -0.316775f, -0.316866f, -0.316957f, -0.317048f, -0.317139f, -0.317230f,
+ -0.317321f, -0.317412f, -0.317503f, -0.317594f, -0.317684f, -0.317775f, -0.317866f, -0.317957f,
+ -0.318048f, -0.318139f, -0.318230f, -0.318321f, -0.318412f, -0.318503f, -0.318593f, -0.318684f,
+ -0.318775f, -0.318866f, -0.318957f, -0.319048f, -0.319139f, -0.319229f, -0.319320f, -0.319411f,
+ -0.319502f, -0.319593f, -0.319684f, -0.319775f, -0.319865f, -0.319956f, -0.320047f, -0.320138f,
+ -0.320229f, -0.320320f, -0.320410f, -0.320501f, -0.320592f, -0.320683f, -0.320774f, -0.320864f,
+ -0.320955f, -0.321046f, -0.321137f, -0.321228f, -0.321318f, -0.321409f, -0.321500f, -0.321591f,
+ -0.321682f, -0.321772f, -0.321863f, -0.321954f, -0.322045f, -0.322135f, -0.322226f, -0.322317f,
+ -0.322408f, -0.322498f, -0.322589f, -0.322680f, -0.322771f, -0.322861f, -0.322952f, -0.323043f,
+ -0.323134f, -0.323224f, -0.323315f, -0.323406f, -0.323497f, -0.323587f, -0.323678f, -0.323769f,
+ -0.323859f, -0.323950f, -0.324041f, -0.324131f, -0.324222f, -0.324313f, -0.324404f, -0.324494f,
+ -0.324585f, -0.324676f, -0.324766f, -0.324857f, -0.324948f, -0.325038f, -0.325129f, -0.325220f,
+ -0.325310f, -0.325401f, -0.325492f, -0.325582f, -0.325673f, -0.325764f, -0.325854f, -0.325945f,
+ -0.326035f, -0.326126f, -0.326217f, -0.326307f, -0.326398f, -0.326489f, -0.326579f, -0.326670f,
+ -0.326760f, -0.326851f, -0.326942f, -0.327032f, -0.327123f, -0.327213f, -0.327304f, -0.327395f,
+ -0.327485f, -0.327576f, -0.327666f, -0.327757f, -0.327848f, -0.327938f, -0.328029f, -0.328119f,
+ -0.328210f, -0.328300f, -0.328391f, -0.328482f, -0.328572f, -0.328663f, -0.328753f, -0.328844f,
+ -0.328934f, -0.329025f, -0.329115f, -0.329206f, -0.329296f, -0.329387f, -0.329477f, -0.329568f,
+ -0.329658f, -0.329749f, -0.329839f, -0.329930f, -0.330020f, -0.330111f, -0.330202f, -0.330292f,
+ -0.330382f, -0.330473f, -0.330563f, -0.330654f, -0.330744f, -0.330835f, -0.330925f, -0.331016f,
+ -0.331106f, -0.331197f, -0.331287f, -0.331378f, -0.331468f, -0.331559f, -0.331649f, -0.331739f,
+ -0.331830f, -0.331920f, -0.332011f, -0.332101f, -0.332192f, -0.332282f, -0.332373f, -0.332463f,
+ -0.332553f, -0.332644f, -0.332734f, -0.332825f, -0.332915f, -0.333005f, -0.333096f, -0.333186f,
+ -0.333277f, -0.333367f, -0.333457f, -0.333548f, -0.333638f, -0.333729f, -0.333819f, -0.333909f,
+ -0.334000f, -0.334090f, -0.334180f, -0.334271f, -0.334361f, -0.334451f, -0.334542f, -0.334632f,
+ -0.334722f, -0.334813f, -0.334903f, -0.334994f, -0.335084f, -0.335174f, -0.335265f, -0.335355f,
+ -0.335445f, -0.335535f, -0.335626f, -0.335716f, -0.335806f, -0.335897f, -0.335987f, -0.336077f,
+ -0.336168f, -0.336258f, -0.336348f, -0.336438f, -0.336529f, -0.336619f, -0.336709f, -0.336800f,
+ -0.336890f, -0.336980f, -0.337070f, -0.337161f, -0.337251f, -0.337341f, -0.337431f, -0.337522f,
+ -0.337612f, -0.337702f, -0.337792f, -0.337883f, -0.337973f, -0.338063f, -0.338153f, -0.338244f,
+ -0.338334f, -0.338424f, -0.338514f, -0.338604f, -0.338695f, -0.338785f, -0.338875f, -0.338965f,
+ -0.339055f, -0.339146f, -0.339236f, -0.339326f, -0.339416f, -0.339506f, -0.339597f, -0.339687f,
+ -0.339777f, -0.339867f, -0.339957f, -0.340047f, -0.340138f, -0.340228f, -0.340318f, -0.340408f,
+ -0.340498f, -0.340588f, -0.340678f, -0.340769f, -0.340859f, -0.340949f, -0.341039f, -0.341129f,
+ -0.341219f, -0.341309f, -0.341399f, -0.341490f, -0.341580f, -0.341670f, -0.341760f, -0.341850f,
+ -0.341940f, -0.342030f, -0.342120f, -0.342210f, -0.342300f, -0.342391f, -0.342481f, -0.342571f,
+ -0.342661f, -0.342751f, -0.342841f, -0.342931f, -0.343021f, -0.343111f, -0.343201f, -0.343291f,
+ -0.343381f, -0.343471f, -0.343561f, -0.343651f, -0.343741f, -0.343831f, -0.343921f, -0.344011f,
+ -0.344101f, -0.344191f, -0.344281f, -0.344371f, -0.344461f, -0.344551f, -0.344641f, -0.344731f,
+ -0.344821f, -0.344911f, -0.345001f, -0.345091f, -0.345181f, -0.345271f, -0.345361f, -0.345451f,
+ -0.345541f, -0.345631f, -0.345721f, -0.345811f, -0.345901f, -0.345991f, -0.346081f, -0.346171f,
+ -0.346261f, -0.346351f, -0.346441f, -0.346531f, -0.346621f, -0.346711f, -0.346801f, -0.346890f,
+ -0.346980f, -0.347070f, -0.347160f, -0.347250f, -0.347340f, -0.347430f, -0.347520f, -0.347610f,
+ -0.347700f, -0.347790f, -0.347879f, -0.347969f, -0.348059f, -0.348149f, -0.348239f, -0.348329f,
+ -0.348419f, -0.348509f, -0.348598f, -0.348688f, -0.348778f, -0.348868f, -0.348958f, -0.349048f,
+ -0.349138f, -0.349227f, -0.349317f, -0.349407f, -0.349497f, -0.349587f, -0.349676f, -0.349766f,
+ -0.349856f, -0.349946f, -0.350036f, -0.350126f, -0.350215f, -0.350305f, -0.350395f, -0.350485f,
+ -0.350575f, -0.350664f, -0.350754f, -0.350844f, -0.350934f, -0.351023f, -0.351113f, -0.351203f,
+ -0.351293f, -0.351383f, -0.351472f, -0.351562f, -0.351652f, -0.351742f, -0.351831f, -0.351921f,
+ -0.352011f, -0.352100f, -0.352190f, -0.352280f, -0.352370f, -0.352459f, -0.352549f, -0.352639f,
+ -0.352729f, -0.352818f, -0.352908f, -0.352998f, -0.353087f, -0.353177f, -0.353267f, -0.353356f,
+ -0.353446f, -0.353536f, -0.353626f, -0.353715f, -0.353805f, -0.353895f, -0.353984f, -0.354074f,
+ -0.354164f, -0.354253f, -0.354343f, -0.354432f, -0.354522f, -0.354612f, -0.354701f, -0.354791f,
+ -0.354881f, -0.354970f, -0.355060f, -0.355150f, -0.355239f, -0.355329f, -0.355418f, -0.355508f,
+ -0.355598f, -0.355687f, -0.355777f, -0.355866f, -0.355956f, -0.356046f, -0.356135f, -0.356225f,
+ -0.356314f, -0.356404f, -0.356494f, -0.356583f, -0.356673f, -0.356762f, -0.356852f, -0.356941f,
+ -0.357031f, -0.357121f, -0.357210f, -0.357300f, -0.357389f, -0.357479f, -0.357568f, -0.357658f,
+ -0.357747f, -0.357837f, -0.357926f, -0.358016f, -0.358105f, -0.358195f, -0.358284f, -0.358374f,
+ -0.358463f, -0.358553f, -0.358642f, -0.358732f, -0.358821f, -0.358911f, -0.359000f, -0.359090f,
+ -0.359179f, -0.359269f, -0.359358f, -0.359448f, -0.359537f, -0.359627f, -0.359716f, -0.359806f,
+ -0.359895f, -0.359984f, -0.360074f, -0.360163f, -0.360253f, -0.360342f, -0.360432f, -0.360521f,
+ -0.360611f, -0.360700f, -0.360789f, -0.360879f, -0.360968f, -0.361058f, -0.361147f, -0.361236f,
+ -0.361326f, -0.361415f, -0.361505f, -0.361594f, -0.361683f, -0.361773f, -0.361862f, -0.361952f,
+ -0.362041f, -0.362130f, -0.362220f, -0.362309f, -0.362398f, -0.362488f, -0.362577f, -0.362666f,
+ -0.362756f, -0.362845f, -0.362934f, -0.363024f, -0.363113f, -0.363202f, -0.363292f, -0.363381f,
+ -0.363470f, -0.363560f, -0.363649f, -0.363738f, -0.363828f, -0.363917f, -0.364006f, -0.364096f,
+ -0.364185f, -0.364274f, -0.364363f, -0.364453f, -0.364542f, -0.364631f, -0.364720f, -0.364810f,
+ -0.364899f, -0.364988f, -0.365078f, -0.365167f, -0.365256f, -0.365345f, -0.365435f, -0.365524f,
+ -0.365613f, -0.365702f, -0.365791f, -0.365881f, -0.365970f, -0.366059f, -0.366148f, -0.366238f,
+ -0.366327f, -0.366416f, -0.366505f, -0.366594f, -0.366684f, -0.366773f, -0.366862f, -0.366951f,
+ -0.367040f, -0.367130f, -0.367219f, -0.367308f, -0.367397f, -0.367486f, -0.367575f, -0.367665f,
+ -0.367754f, -0.367843f, -0.367932f, -0.368021f, -0.368110f, -0.368199f, -0.368289f, -0.368378f,
+ -0.368467f, -0.368556f, -0.368645f, -0.368734f, -0.368823f, -0.368912f, -0.369002f, -0.369091f,
+ -0.369180f, -0.369269f, -0.369358f, -0.369447f, -0.369536f, -0.369625f, -0.369714f, -0.369803f,
+ -0.369892f, -0.369982f, -0.370071f, -0.370160f, -0.370249f, -0.370338f, -0.370427f, -0.370516f,
+ -0.370605f, -0.370694f, -0.370783f, -0.370872f, -0.370961f, -0.371050f, -0.371139f, -0.371228f,
+ -0.371317f, -0.371406f, -0.371495f, -0.371584f, -0.371673f, -0.371762f, -0.371851f, -0.371940f,
+ -0.372029f, -0.372118f, -0.372207f, -0.372296f, -0.372385f, -0.372474f, -0.372563f, -0.372652f,
+ -0.372741f, -0.372830f, -0.372919f, -0.373008f, -0.373097f, -0.373186f, -0.373275f, -0.373364f,
+ -0.373453f, -0.373542f, -0.373631f, -0.373719f, -0.373808f, -0.373897f, -0.373986f, -0.374075f,
+ -0.374164f, -0.374253f, -0.374342f, -0.374431f, -0.374520f, -0.374609f, -0.374697f, -0.374786f,
+ -0.374875f, -0.374964f, -0.375053f, -0.375142f, -0.375231f, -0.375320f, -0.375408f, -0.375497f,
+ -0.375586f, -0.375675f, -0.375764f, -0.375853f, -0.375942f, -0.376030f, -0.376119f, -0.376208f,
+ -0.376297f, -0.376386f, -0.376475f, -0.376563f, -0.376652f, -0.376741f, -0.376830f, -0.376919f,
+ -0.377007f, -0.377096f, -0.377185f, -0.377274f, -0.377363f, -0.377451f, -0.377540f, -0.377629f,
+ -0.377718f, -0.377806f, -0.377895f, -0.377984f, -0.378073f, -0.378162f, -0.378250f, -0.378339f,
+ -0.378428f, -0.378516f, -0.378605f, -0.378694f, -0.378783f, -0.378871f, -0.378960f, -0.379049f,
+ -0.379138f, -0.379226f, -0.379315f, -0.379404f, -0.379492f, -0.379581f, -0.379670f, -0.379759f,
+ -0.379847f, -0.379936f, -0.380025f, -0.380113f, -0.380202f, -0.380291f, -0.380379f, -0.380468f,
+ -0.380557f, -0.380645f, -0.380734f, -0.380823f, -0.380911f, -0.381000f, -0.381088f, -0.381177f,
+ -0.381266f, -0.381354f, -0.381443f, -0.381532f, -0.381620f, -0.381709f, -0.381797f, -0.381886f,
+ -0.381975f, -0.382063f, -0.382152f, -0.382241f, -0.382329f, -0.382418f, -0.382506f, -0.382595f,
+ -0.382683f, -0.382772f, -0.382861f, -0.382949f, -0.383038f, -0.383126f, -0.383215f, -0.383303f,
+ -0.383392f, -0.383480f, -0.383569f, -0.383658f, -0.383746f, -0.383835f, -0.383923f, -0.384012f,
+ -0.384100f, -0.384189f, -0.384277f, -0.384366f, -0.384454f, -0.384543f, -0.384631f, -0.384720f,
+ -0.384808f, -0.384897f, -0.384985f, -0.385074f, -0.385162f, -0.385251f, -0.385339f, -0.385428f,
+ -0.385516f, -0.385605f, -0.385693f, -0.385781f, -0.385870f, -0.385958f, -0.386047f, -0.386135f,
+ -0.386224f, -0.386312f, -0.386400f, -0.386489f, -0.386577f, -0.386666f, -0.386754f, -0.386843f,
+ -0.386931f, -0.387019f, -0.387108f, -0.387196f, -0.387285f, -0.387373f, -0.387461f, -0.387550f,
+ -0.387638f, -0.387727f, -0.387815f, -0.387903f, -0.387992f, -0.388080f, -0.388168f, -0.388257f,
+ -0.388345f, -0.388433f, -0.388522f, -0.388610f, -0.388698f, -0.388787f, -0.388875f, -0.388963f,
+ -0.389052f, -0.389140f, -0.389228f, -0.389317f, -0.389405f, -0.389493f, -0.389582f, -0.389670f,
+ -0.389758f, -0.389846f, -0.389935f, -0.390023f, -0.390111f, -0.390200f, -0.390288f, -0.390376f,
+ -0.390464f, -0.390553f, -0.390641f, -0.390729f, -0.390817f, -0.390906f, -0.390994f, -0.391082f,
+ -0.391170f, -0.391259f, -0.391347f, -0.391435f, -0.391523f, -0.391612f, -0.391700f, -0.391788f,
+ -0.391876f, -0.391964f, -0.392053f, -0.392141f, -0.392229f, -0.392317f, -0.392405f, -0.392493f,
+ -0.392582f, -0.392670f, -0.392758f, -0.392846f, -0.392934f, -0.393023f, -0.393111f, -0.393199f,
+ -0.393287f, -0.393375f, -0.393463f, -0.393551f, -0.393640f, -0.393728f, -0.393816f, -0.393904f,
+ -0.393992f, -0.394080f, -0.394168f, -0.394256f, -0.394344f, -0.394433f, -0.394521f, -0.394609f,
+ -0.394697f, -0.394785f, -0.394873f, -0.394961f, -0.395049f, -0.395137f, -0.395225f, -0.395313f,
+ -0.395401f, -0.395490f, -0.395578f, -0.395666f, -0.395754f, -0.395842f, -0.395930f, -0.396018f,
+ -0.396106f, -0.396194f, -0.396282f, -0.396370f, -0.396458f, -0.396546f, -0.396634f, -0.396722f,
+ -0.396810f, -0.396898f, -0.396986f, -0.397074f, -0.397162f, -0.397250f, -0.397338f, -0.397426f,
+ -0.397514f, -0.397602f, -0.397690f, -0.397778f, -0.397866f, -0.397954f, -0.398042f, -0.398130f,
+ -0.398218f, -0.398306f, -0.398393f, -0.398481f, -0.398569f, -0.398657f, -0.398745f, -0.398833f,
+ -0.398921f, -0.399009f, -0.399097f, -0.399185f, -0.399273f, -0.399361f, -0.399448f, -0.399536f,
+ -0.399624f, -0.399712f, -0.399800f, -0.399888f, -0.399976f, -0.400064f, -0.400151f, -0.400239f,
+ -0.400327f, -0.400415f, -0.400503f, -0.400591f, -0.400679f, -0.400766f, -0.400854f, -0.400942f,
+ -0.401030f, -0.401118f, -0.401206f, -0.401293f, -0.401381f, -0.401469f, -0.401557f, -0.401645f,
+ -0.401732f, -0.401820f, -0.401908f, -0.401996f, -0.402084f, -0.402171f, -0.402259f, -0.402347f,
+ -0.402435f, -0.402522f, -0.402610f, -0.402698f, -0.402786f, -0.402873f, -0.402961f, -0.403049f,
+ -0.403137f, -0.403224f, -0.403312f, -0.403400f, -0.403488f, -0.403575f, -0.403663f, -0.403751f,
+ -0.403838f, -0.403926f, -0.404014f, -0.404102f, -0.404189f, -0.404277f, -0.404365f, -0.404452f,
+ -0.404540f, -0.404628f, -0.404715f, -0.404803f, -0.404891f, -0.404978f, -0.405066f, -0.405154f,
+ -0.405241f, -0.405329f, -0.405417f, -0.405504f, -0.405592f, -0.405680f, -0.405767f, -0.405855f,
+ -0.405942f, -0.406030f, -0.406118f, -0.406205f, -0.406293f, -0.406380f, -0.406468f, -0.406556f,
+ -0.406643f, -0.406731f, -0.406818f, -0.406906f, -0.406994f, -0.407081f, -0.407169f, -0.407256f,
+ -0.407344f, -0.407431f, -0.407519f, -0.407606f, -0.407694f, -0.407782f, -0.407869f, -0.407957f,
+ -0.408044f, -0.408132f, -0.408219f, -0.408307f, -0.408394f, -0.408482f, -0.408569f, -0.408657f,
+ -0.408744f, -0.408832f, -0.408919f, -0.409007f, -0.409094f, -0.409182f, -0.409269f, -0.409357f,
+ -0.409444f, -0.409532f, -0.409619f, -0.409707f, -0.409794f, -0.409881f, -0.409969f, -0.410056f,
+ -0.410144f, -0.410231f, -0.410319f, -0.410406f, -0.410493f, -0.410581f, -0.410668f, -0.410756f,
+ -0.410843f, -0.410931f, -0.411018f, -0.411105f, -0.411193f, -0.411280f, -0.411368f, -0.411455f,
+ -0.411542f, -0.411630f, -0.411717f, -0.411804f, -0.411892f, -0.411979f, -0.412067f, -0.412154f,
+ -0.412241f, -0.412329f, -0.412416f, -0.412503f, -0.412591f, -0.412678f, -0.412765f, -0.412853f,
+ -0.412940f, -0.413027f, -0.413115f, -0.413202f, -0.413289f, -0.413376f, -0.413464f, -0.413551f,
+ -0.413638f, -0.413726f, -0.413813f, -0.413900f, -0.413987f, -0.414075f, -0.414162f, -0.414249f,
+ -0.414337f, -0.414424f, -0.414511f, -0.414598f, -0.414685f, -0.414773f, -0.414860f, -0.414947f,
+ -0.415034f, -0.415122f, -0.415209f, -0.415296f, -0.415383f, -0.415471f, -0.415558f, -0.415645f,
+ -0.415732f, -0.415819f, -0.415906f, -0.415994f, -0.416081f, -0.416168f, -0.416255f, -0.416342f,
+ -0.416430f, -0.416517f, -0.416604f, -0.416691f, -0.416778f, -0.416865f, -0.416952f, -0.417040f,
+ -0.417127f, -0.417214f, -0.417301f, -0.417388f, -0.417475f, -0.417562f, -0.417650f, -0.417737f,
+ -0.417824f, -0.417911f, -0.417998f, -0.418085f, -0.418172f, -0.418259f, -0.418346f, -0.418433f,
+ -0.418520f, -0.418608f, -0.418695f, -0.418782f, -0.418869f, -0.418956f, -0.419043f, -0.419130f,
+ -0.419217f, -0.419304f, -0.419391f, -0.419478f, -0.419565f, -0.419652f, -0.419739f, -0.419826f,
+ -0.419913f, -0.420000f, -0.420087f, -0.420174f, -0.420261f, -0.420348f, -0.420435f, -0.420522f,
+ -0.420609f, -0.420696f, -0.420783f, -0.420870f, -0.420957f, -0.421044f, -0.421131f, -0.421218f,
+ -0.421305f, -0.421392f, -0.421479f, -0.421566f, -0.421653f, -0.421739f, -0.421826f, -0.421913f,
+ -0.422000f, -0.422087f, -0.422174f, -0.422261f, -0.422348f, -0.422435f, -0.422522f, -0.422609f,
+ -0.422695f, -0.422782f, -0.422869f, -0.422956f, -0.423043f, -0.423130f, -0.423217f, -0.423304f,
+ -0.423390f, -0.423477f, -0.423564f, -0.423651f, -0.423738f, -0.423825f, -0.423912f, -0.423998f,
+ -0.424085f, -0.424172f, -0.424259f, -0.424346f, -0.424432f, -0.424519f, -0.424606f, -0.424693f,
+ -0.424780f, -0.424866f, -0.424953f, -0.425040f, -0.425127f, -0.425214f, -0.425300f, -0.425387f,
+ -0.425474f, -0.425561f, -0.425647f, -0.425734f, -0.425821f, -0.425908f, -0.425994f, -0.426081f,
+ -0.426168f, -0.426255f, -0.426341f, -0.426428f, -0.426515f, -0.426601f, -0.426688f, -0.426775f,
+ -0.426862f, -0.426948f, -0.427035f, -0.427122f, -0.427208f, -0.427295f, -0.427382f, -0.427468f,
+ -0.427555f, -0.427642f, -0.427728f, -0.427815f, -0.427902f, -0.427988f, -0.428075f, -0.428162f,
+ -0.428248f, -0.428335f, -0.428422f, -0.428508f, -0.428595f, -0.428681f, -0.428768f, -0.428855f,
+ -0.428941f, -0.429028f, -0.429114f, -0.429201f, -0.429288f, -0.429374f, -0.429461f, -0.429547f,
+ -0.429634f, -0.429721f, -0.429807f, -0.429894f, -0.429980f, -0.430067f, -0.430153f, -0.430240f,
+ -0.430326f, -0.430413f, -0.430500f, -0.430586f, -0.430673f, -0.430759f, -0.430846f, -0.430932f,
+ -0.431019f, -0.431105f, -0.431192f, -0.431278f, -0.431365f, -0.431451f, -0.431538f, -0.431624f,
+ -0.431711f, -0.431797f, -0.431884f, -0.431970f, -0.432057f, -0.432143f, -0.432229f, -0.432316f,
+ -0.432402f, -0.432489f, -0.432575f, -0.432662f, -0.432748f, -0.432835f, -0.432921f, -0.433007f,
+ -0.433094f, -0.433180f, -0.433267f, -0.433353f, -0.433439f, -0.433526f, -0.433612f, -0.433699f,
+ -0.433785f, -0.433871f, -0.433958f, -0.434044f, -0.434131f, -0.434217f, -0.434303f, -0.434390f,
+ -0.434476f, -0.434562f, -0.434649f, -0.434735f, -0.434821f, -0.434908f, -0.434994f, -0.435080f,
+ -0.435167f, -0.435253f, -0.435339f, -0.435426f, -0.435512f, -0.435598f, -0.435685f, -0.435771f,
+ -0.435857f, -0.435943f, -0.436030f, -0.436116f, -0.436202f, -0.436288f, -0.436375f, -0.436461f,
+ -0.436547f, -0.436633f, -0.436720f, -0.436806f, -0.436892f, -0.436978f, -0.437065f, -0.437151f,
+ -0.437237f, -0.437323f, -0.437410f, -0.437496f, -0.437582f, -0.437668f, -0.437754f, -0.437841f,
+ -0.437927f, -0.438013f, -0.438099f, -0.438185f, -0.438272f, -0.438358f, -0.438444f, -0.438530f,
+ -0.438616f, -0.438702f, -0.438789f, -0.438875f, -0.438961f, -0.439047f, -0.439133f, -0.439219f,
+ -0.439305f, -0.439392f, -0.439478f, -0.439564f, -0.439650f, -0.439736f, -0.439822f, -0.439908f,
+ -0.439994f, -0.440080f, -0.440166f, -0.440253f, -0.440339f, -0.440425f, -0.440511f, -0.440597f,
+ -0.440683f, -0.440769f, -0.440855f, -0.440941f, -0.441027f, -0.441113f, -0.441199f, -0.441285f,
+ -0.441371f, -0.441457f, -0.441543f, -0.441629f, -0.441715f, -0.441801f, -0.441887f, -0.441973f,
+ -0.442059f, -0.442145f, -0.442231f, -0.442317f, -0.442403f, -0.442489f, -0.442575f, -0.442661f,
+ -0.442747f, -0.442833f, -0.442919f, -0.443005f, -0.443091f, -0.443177f, -0.443263f, -0.443349f,
+ -0.443435f, -0.443521f, -0.443607f, -0.443693f, -0.443779f, -0.443864f, -0.443950f, -0.444036f,
+ -0.444122f, -0.444208f, -0.444294f, -0.444380f, -0.444466f, -0.444552f, -0.444637f, -0.444723f,
+ -0.444809f, -0.444895f, -0.444981f, -0.445067f, -0.445153f, -0.445239f, -0.445324f, -0.445410f,
+ -0.445496f, -0.445582f, -0.445668f, -0.445754f, -0.445839f, -0.445925f, -0.446011f, -0.446097f,
+ -0.446183f, -0.446268f, -0.446354f, -0.446440f, -0.446526f, -0.446612f, -0.446697f, -0.446783f,
+ -0.446869f, -0.446955f, -0.447040f, -0.447126f, -0.447212f, -0.447298f, -0.447383f, -0.447469f,
+ -0.447555f, -0.447641f, -0.447726f, -0.447812f, -0.447898f, -0.447983f, -0.448069f, -0.448155f,
+ -0.448241f, -0.448326f, -0.448412f, -0.448498f, -0.448583f, -0.448669f, -0.448755f, -0.448840f,
+ -0.448926f, -0.449012f, -0.449097f, -0.449183f, -0.449269f, -0.449354f, -0.449440f, -0.449526f,
+ -0.449611f, -0.449697f, -0.449783f, -0.449868f, -0.449954f, -0.450039f, -0.450125f, -0.450211f,
+ -0.450296f, -0.450382f, -0.450467f, -0.450553f, -0.450639f, -0.450724f, -0.450810f, -0.450895f,
+ -0.450981f, -0.451067f, -0.451152f, -0.451238f, -0.451323f, -0.451409f, -0.451494f, -0.451580f,
+ -0.451665f, -0.451751f, -0.451836f, -0.451922f, -0.452008f, -0.452093f, -0.452179f, -0.452264f,
+ -0.452350f, -0.452435f, -0.452521f, -0.452606f, -0.452692f, -0.452777f, -0.452863f, -0.452948f,
+ -0.453033f, -0.453119f, -0.453204f, -0.453290f, -0.453375f, -0.453461f, -0.453546f, -0.453632f,
+ -0.453717f, -0.453803f, -0.453888f, -0.453973f, -0.454059f, -0.454144f, -0.454230f, -0.454315f,
+ -0.454400f, -0.454486f, -0.454571f, -0.454657f, -0.454742f, -0.454827f, -0.454913f, -0.454998f,
+ -0.455084f, -0.455169f, -0.455254f, -0.455340f, -0.455425f, -0.455510f, -0.455596f, -0.455681f,
+ -0.455766f, -0.455852f, -0.455937f, -0.456022f, -0.456108f, -0.456193f, -0.456278f, -0.456364f,
+ -0.456449f, -0.456534f, -0.456620f, -0.456705f, -0.456790f, -0.456875f, -0.456961f, -0.457046f,
+ -0.457131f, -0.457217f, -0.457302f, -0.457387f, -0.457472f, -0.457558f, -0.457643f, -0.457728f,
+ -0.457813f, -0.457899f, -0.457984f, -0.458069f, -0.458154f, -0.458239f, -0.458325f, -0.458410f,
+ -0.458495f, -0.458580f, -0.458665f, -0.458751f, -0.458836f, -0.458921f, -0.459006f, -0.459091f,
+ -0.459177f, -0.459262f, -0.459347f, -0.459432f, -0.459517f, -0.459602f, -0.459687f, -0.459773f,
+ -0.459858f, -0.459943f, -0.460028f, -0.460113f, -0.460198f, -0.460283f, -0.460369f, -0.460454f,
+ -0.460539f, -0.460624f, -0.460709f, -0.460794f, -0.460879f, -0.460964f, -0.461049f, -0.461134f,
+ -0.461219f, -0.461304f, -0.461390f, -0.461475f, -0.461560f, -0.461645f, -0.461730f, -0.461815f,
+ -0.461900f, -0.461985f, -0.462070f, -0.462155f, -0.462240f, -0.462325f, -0.462410f, -0.462495f,
+ -0.462580f, -0.462665f, -0.462750f, -0.462835f, -0.462920f, -0.463005f, -0.463090f, -0.463175f,
+ -0.463260f, -0.463345f, -0.463430f, -0.463515f, -0.463600f, -0.463685f, -0.463769f, -0.463854f,
+ -0.463939f, -0.464024f, -0.464109f, -0.464194f, -0.464279f, -0.464364f, -0.464449f, -0.464534f,
+ -0.464619f, -0.464704f, -0.464788f, -0.464873f, -0.464958f, -0.465043f, -0.465128f, -0.465213f,
+ -0.465298f, -0.465383f, -0.465467f, -0.465552f, -0.465637f, -0.465722f, -0.465807f, -0.465892f,
+ -0.465977f, -0.466061f, -0.466146f, -0.466231f, -0.466316f, -0.466401f, -0.466485f, -0.466570f,
+ -0.466655f, -0.466740f, -0.466825f, -0.466909f, -0.466994f, -0.467079f, -0.467164f, -0.467248f,
+ -0.467333f, -0.467418f, -0.467503f, -0.467587f, -0.467672f, -0.467757f, -0.467842f, -0.467926f,
+ -0.468011f, -0.468096f, -0.468181f, -0.468265f, -0.468350f, -0.468435f, -0.468519f, -0.468604f,
+ -0.468689f, -0.468774f, -0.468858f, -0.468943f, -0.469028f, -0.469112f, -0.469197f, -0.469282f,
+ -0.469366f, -0.469451f, -0.469536f, -0.469620f, -0.469705f, -0.469789f, -0.469874f, -0.469959f,
+ -0.470043f, -0.470128f, -0.470213f, -0.470297f, -0.470382f, -0.470466f, -0.470551f, -0.470636f,
+ -0.470720f, -0.470805f, -0.470889f, -0.470974f, -0.471058f, -0.471143f, -0.471228f, -0.471312f,
+ -0.471397f, -0.471481f, -0.471566f, -0.471650f, -0.471735f, -0.471819f, -0.471904f, -0.471988f,
+ -0.472073f, -0.472158f, -0.472242f, -0.472327f, -0.472411f, -0.472496f, -0.472580f, -0.472665f,
+ -0.472749f, -0.472834f, -0.472918f, -0.473002f, -0.473087f, -0.473171f, -0.473256f, -0.473340f,
+ -0.473425f, -0.473509f, -0.473594f, -0.473678f, -0.473763f, -0.473847f, -0.473931f, -0.474016f,
+ -0.474100f, -0.474185f, -0.474269f, -0.474353f, -0.474438f, -0.474522f, -0.474607f, -0.474691f,
+ -0.474775f, -0.474860f, -0.474944f, -0.475029f, -0.475113f, -0.475197f, -0.475282f, -0.475366f,
+ -0.475450f, -0.475535f, -0.475619f, -0.475703f, -0.475788f, -0.475872f, -0.475956f, -0.476041f,
+ -0.476125f, -0.476209f, -0.476294f, -0.476378f, -0.476462f, -0.476546f, -0.476631f, -0.476715f,
+ -0.476799f, -0.476884f, -0.476968f, -0.477052f, -0.477136f, -0.477221f, -0.477305f, -0.477389f,
+ -0.477473f, -0.477558f, -0.477642f, -0.477726f, -0.477810f, -0.477894f, -0.477979f, -0.478063f,
+ -0.478147f, -0.478231f, -0.478315f, -0.478400f, -0.478484f, -0.478568f, -0.478652f, -0.478736f,
+ -0.478821f, -0.478905f, -0.478989f, -0.479073f, -0.479157f, -0.479241f, -0.479325f, -0.479410f,
+ -0.479494f, -0.479578f, -0.479662f, -0.479746f, -0.479830f, -0.479914f, -0.479998f, -0.480083f,
+ -0.480167f, -0.480251f, -0.480335f, -0.480419f, -0.480503f, -0.480587f, -0.480671f, -0.480755f,
+ -0.480839f, -0.480923f, -0.481007f, -0.481091f, -0.481176f, -0.481260f, -0.481344f, -0.481428f,
+ -0.481512f, -0.481596f, -0.481680f, -0.481764f, -0.481848f, -0.481932f, -0.482016f, -0.482100f,
+ -0.482184f, -0.482268f, -0.482352f, -0.482436f, -0.482520f, -0.482604f, -0.482688f, -0.482772f,
+ -0.482856f, -0.482940f, -0.483023f, -0.483107f, -0.483191f, -0.483275f, -0.483359f, -0.483443f,
+ -0.483527f, -0.483611f, -0.483695f, -0.483779f, -0.483863f, -0.483947f, -0.484031f, -0.484114f,
+ -0.484198f, -0.484282f, -0.484366f, -0.484450f, -0.484534f, -0.484618f, -0.484702f, -0.484785f,
+ -0.484869f, -0.484953f, -0.485037f, -0.485121f, -0.485205f, -0.485288f, -0.485372f, -0.485456f,
+ -0.485540f, -0.485624f, -0.485708f, -0.485791f, -0.485875f, -0.485959f, -0.486043f, -0.486126f,
+ -0.486210f, -0.486294f, -0.486378f, -0.486462f, -0.486545f, -0.486629f, -0.486713f, -0.486797f,
+ -0.486880f, -0.486964f, -0.487048f, -0.487132f, -0.487215f, -0.487299f, -0.487383f, -0.487466f,
+ -0.487550f, -0.487634f, -0.487718f, -0.487801f, -0.487885f, -0.487969f, -0.488052f, -0.488136f,
+ -0.488220f, -0.488303f, -0.488387f, -0.488471f, -0.488554f, -0.488638f, -0.488722f, -0.488805f,
+ -0.488889f, -0.488973f, -0.489056f, -0.489140f, -0.489223f, -0.489307f, -0.489391f, -0.489474f,
+ -0.489558f, -0.489641f, -0.489725f, -0.489809f, -0.489892f, -0.489976f, -0.490059f, -0.490143f,
+ -0.490226f, -0.490310f, -0.490394f, -0.490477f, -0.490561f, -0.490644f, -0.490728f, -0.490811f,
+ -0.490895f, -0.490978f, -0.491062f, -0.491145f, -0.491229f, -0.491312f, -0.491396f, -0.491479f,
+ -0.491563f, -0.491646f, -0.491730f, -0.491813f, -0.491897f, -0.491980f, -0.492064f, -0.492147f,
+ -0.492231f, -0.492314f, -0.492398f, -0.492481f, -0.492564f, -0.492648f, -0.492731f, -0.492815f,
+ -0.492898f, -0.492982f, -0.493065f, -0.493148f, -0.493232f, -0.493315f, -0.493399f, -0.493482f,
+ -0.493565f, -0.493649f, -0.493732f, -0.493816f, -0.493899f, -0.493982f, -0.494066f, -0.494149f,
+ -0.494232f, -0.494316f, -0.494399f, -0.494482f, -0.494566f, -0.494649f, -0.494732f, -0.494816f,
+ -0.494899f, -0.494982f, -0.495066f, -0.495149f, -0.495232f, -0.495315f, -0.495399f, -0.495482f,
+ -0.495565f, -0.495649f, -0.495732f, -0.495815f, -0.495898f, -0.495982f, -0.496065f, -0.496148f,
+ -0.496231f, -0.496315f, -0.496398f, -0.496481f, -0.496564f, -0.496647f, -0.496731f, -0.496814f,
+ -0.496897f, -0.496980f, -0.497063f, -0.497147f, -0.497230f, -0.497313f, -0.497396f, -0.497479f,
+ -0.497562f, -0.497646f, -0.497729f, -0.497812f, -0.497895f, -0.497978f, -0.498061f, -0.498145f,
+ -0.498228f, -0.498311f, -0.498394f, -0.498477f, -0.498560f, -0.498643f, -0.498726f, -0.498809f,
+ -0.498893f, -0.498976f, -0.499059f, -0.499142f, -0.499225f, -0.499308f, -0.499391f, -0.499474f,
+ -0.499557f, -0.499640f, -0.499723f, -0.499806f, -0.499889f, -0.499972f, -0.500055f, -0.500138f,
+ -0.500221f, -0.500304f, -0.500387f, -0.500470f, -0.500553f, -0.500636f, -0.500719f, -0.500802f,
+ -0.500885f, -0.500968f, -0.501051f, -0.501134f, -0.501217f, -0.501300f, -0.501383f, -0.501466f,
+ -0.501549f, -0.501632f, -0.501715f, -0.501798f, -0.501881f, -0.501964f, -0.502047f, -0.502130f,
+ -0.502212f, -0.502295f, -0.502378f, -0.502461f, -0.502544f, -0.502627f, -0.502710f, -0.502793f,
+ -0.502876f, -0.502958f, -0.503041f, -0.503124f, -0.503207f, -0.503290f, -0.503373f, -0.503456f,
+ -0.503538f, -0.503621f, -0.503704f, -0.503787f, -0.503870f, -0.503953f, -0.504035f, -0.504118f,
+ -0.504201f, -0.504284f, -0.504366f, -0.504449f, -0.504532f, -0.504615f, -0.504698f, -0.504780f,
+ -0.504863f, -0.504946f, -0.505029f, -0.505111f, -0.505194f, -0.505277f, -0.505360f, -0.505442f,
+ -0.505525f, -0.505608f, -0.505690f, -0.505773f, -0.505856f, -0.505939f, -0.506021f, -0.506104f,
+ -0.506187f, -0.506269f, -0.506352f, -0.506435f, -0.506517f, -0.506600f, -0.506683f, -0.506765f,
+ -0.506848f, -0.506931f, -0.507013f, -0.507096f, -0.507179f, -0.507261f, -0.507344f, -0.507426f,
+ -0.507509f, -0.507592f, -0.507674f, -0.507757f, -0.507839f, -0.507922f, -0.508005f, -0.508087f,
+ -0.508170f, -0.508252f, -0.508335f, -0.508417f, -0.508500f, -0.508583f, -0.508665f, -0.508748f,
+ -0.508830f, -0.508913f, -0.508995f, -0.509078f, -0.509160f, -0.509243f, -0.509325f, -0.509408f,
+ -0.509490f, -0.509573f, -0.509655f, -0.509738f, -0.509820f, -0.509903f, -0.509985f, -0.510068f,
+ -0.510150f, -0.510233f, -0.510315f, -0.510397f, -0.510480f, -0.510562f, -0.510645f, -0.510727f,
+ -0.510810f, -0.510892f, -0.510974f, -0.511057f, -0.511139f, -0.511222f, -0.511304f, -0.511386f,
+ -0.511469f, -0.511551f, -0.511634f, -0.511716f, -0.511798f, -0.511881f, -0.511963f, -0.512045f,
+ -0.512128f, -0.512210f, -0.512292f, -0.512375f, -0.512457f, -0.512539f, -0.512622f, -0.512704f,
+ -0.512786f, -0.512869f, -0.512951f, -0.513033f, -0.513116f, -0.513198f, -0.513280f, -0.513362f,
+ -0.513445f, -0.513527f, -0.513609f, -0.513692f, -0.513774f, -0.513856f, -0.513938f, -0.514021f,
+ -0.514103f, -0.514185f, -0.514267f, -0.514349f, -0.514432f, -0.514514f, -0.514596f, -0.514678f,
+ -0.514760f, -0.514843f, -0.514925f, -0.515007f, -0.515089f, -0.515171f, -0.515254f, -0.515336f,
+ -0.515418f, -0.515500f, -0.515582f, -0.515664f, -0.515746f, -0.515829f, -0.515911f, -0.515993f,
+ -0.516075f, -0.516157f, -0.516239f, -0.516321f, -0.516403f, -0.516486f, -0.516568f, -0.516650f,
+ -0.516732f, -0.516814f, -0.516896f, -0.516978f, -0.517060f, -0.517142f, -0.517224f, -0.517306f,
+ -0.517388f, -0.517470f, -0.517552f, -0.517634f, -0.517716f, -0.517798f, -0.517880f, -0.517963f,
+ -0.518045f, -0.518126f, -0.518209f, -0.518291f, -0.518372f, -0.518454f, -0.518536f, -0.518618f,
+ -0.518700f, -0.518782f, -0.518864f, -0.518946f, -0.519028f, -0.519110f, -0.519192f, -0.519274f,
+ -0.519356f, -0.519438f, -0.519520f, -0.519602f, -0.519684f, -0.519766f, -0.519848f, -0.519929f,
+ -0.520011f, -0.520093f, -0.520175f, -0.520257f, -0.520339f, -0.520421f, -0.520503f, -0.520584f,
+ -0.520666f, -0.520748f, -0.520830f, -0.520912f, -0.520994f, -0.521075f, -0.521157f, -0.521239f,
+ -0.521321f, -0.521403f, -0.521485f, -0.521566f, -0.521648f, -0.521730f, -0.521812f, -0.521894f,
+ -0.521975f, -0.522057f, -0.522139f, -0.522221f, -0.522302f, -0.522384f, -0.522466f, -0.522548f,
+ -0.522629f, -0.522711f, -0.522793f, -0.522875f, -0.522956f, -0.523038f, -0.523120f, -0.523201f,
+ -0.523283f, -0.523365f, -0.523447f, -0.523528f, -0.523610f, -0.523692f, -0.523773f, -0.523855f,
+ -0.523937f, -0.524018f, -0.524100f, -0.524181f, -0.524263f, -0.524345f, -0.524426f, -0.524508f,
+ -0.524590f, -0.524671f, -0.524753f, -0.524835f, -0.524916f, -0.524998f, -0.525079f, -0.525161f,
+ -0.525243f, -0.525324f, -0.525406f, -0.525487f, -0.525569f, -0.525650f, -0.525732f, -0.525813f,
+ -0.525895f, -0.525977f, -0.526058f, -0.526140f, -0.526221f, -0.526303f, -0.526384f, -0.526466f,
+ -0.526547f, -0.526629f, -0.526710f, -0.526792f, -0.526873f, -0.526955f, -0.527036f, -0.527118f,
+ -0.527199f, -0.527281f, -0.527362f, -0.527444f, -0.527525f, -0.527606f, -0.527688f, -0.527769f,
+ -0.527851f, -0.527932f, -0.528014f, -0.528095f, -0.528176f, -0.528258f, -0.528339f, -0.528421f,
+ -0.528502f, -0.528583f, -0.528665f, -0.528746f, -0.528828f, -0.528909f, -0.528990f, -0.529072f,
+ -0.529153f, -0.529234f, -0.529316f, -0.529397f, -0.529478f, -0.529560f, -0.529641f, -0.529722f,
+ -0.529804f, -0.529885f, -0.529966f, -0.530048f, -0.530129f, -0.530210f, -0.530291f, -0.530373f,
+ -0.530454f, -0.530535f, -0.530617f, -0.530698f, -0.530779f, -0.530860f, -0.530942f, -0.531023f,
+ -0.531104f, -0.531185f, -0.531266f, -0.531348f, -0.531429f, -0.531510f, -0.531591f, -0.531673f,
+ -0.531754f, -0.531835f, -0.531916f, -0.531997f, -0.532078f, -0.532160f, -0.532241f, -0.532322f,
+ -0.532403f, -0.532484f, -0.532565f, -0.532647f, -0.532728f, -0.532809f, -0.532890f, -0.532971f,
+ -0.533052f, -0.533133f, -0.533214f, -0.533296f, -0.533377f, -0.533458f, -0.533539f, -0.533620f,
+ -0.533701f, -0.533782f, -0.533863f, -0.533944f, -0.534025f, -0.534106f, -0.534187f, -0.534268f,
+ -0.534349f, -0.534431f, -0.534512f, -0.534593f, -0.534674f, -0.534755f, -0.534836f, -0.534917f,
+ -0.534998f, -0.535079f, -0.535160f, -0.535241f, -0.535322f, -0.535403f, -0.535484f, -0.535564f,
+ -0.535645f, -0.535726f, -0.535807f, -0.535888f, -0.535969f, -0.536050f, -0.536131f, -0.536212f,
+ -0.536293f, -0.536374f, -0.536455f, -0.536536f, -0.536617f, -0.536698f, -0.536778f, -0.536859f,
+ -0.536940f, -0.537021f, -0.537102f, -0.537183f, -0.537264f, -0.537345f, -0.537425f, -0.537506f,
+ -0.537587f, -0.537668f, -0.537749f, -0.537830f, -0.537910f, -0.537991f, -0.538072f, -0.538153f,
+ -0.538234f, -0.538314f, -0.538395f, -0.538476f, -0.538557f, -0.538638f, -0.538718f, -0.538799f,
+ -0.538880f, -0.538961f, -0.539041f, -0.539122f, -0.539203f, -0.539284f, -0.539364f, -0.539445f,
+ -0.539526f, -0.539607f, -0.539687f, -0.539768f, -0.539849f, -0.539929f, -0.540010f, -0.540091f,
+ -0.540171f, -0.540252f, -0.540333f, -0.540413f, -0.540494f, -0.540575f, -0.540655f, -0.540736f,
+ -0.540817f, -0.540897f, -0.540978f, -0.541059f, -0.541139f, -0.541220f, -0.541301f, -0.541381f,
+ -0.541462f, -0.541542f, -0.541623f, -0.541704f, -0.541784f, -0.541865f, -0.541945f, -0.542026f,
+ -0.542106f, -0.542187f, -0.542268f, -0.542348f, -0.542429f, -0.542509f, -0.542590f, -0.542670f,
+ -0.542751f, -0.542831f, -0.542912f, -0.542992f, -0.543073f, -0.543153f, -0.543234f, -0.543314f,
+ -0.543395f, -0.543475f, -0.543556f, -0.543636f, -0.543717f, -0.543797f, -0.543878f, -0.543958f,
+ -0.544039f, -0.544119f, -0.544199f, -0.544280f, -0.544360f, -0.544441f, -0.544521f, -0.544602f,
+ -0.544682f, -0.544762f, -0.544843f, -0.544923f, -0.545003f, -0.545084f, -0.545164f, -0.545245f,
+ -0.545325f, -0.545405f, -0.545486f, -0.545566f, -0.545646f, -0.545727f, -0.545807f, -0.545887f,
+ -0.545968f, -0.546048f, -0.546128f, -0.546209f, -0.546289f, -0.546369f, -0.546450f, -0.546530f,
+ -0.546610f, -0.546690f, -0.546771f, -0.546851f, -0.546931f, -0.547011f, -0.547092f, -0.547172f,
+ -0.547252f, -0.547333f, -0.547413f, -0.547493f, -0.547573f, -0.547653f, -0.547734f, -0.547814f,
+ -0.547894f, -0.547974f, -0.548054f, -0.548135f, -0.548215f, -0.548295f, -0.548375f, -0.548455f,
+ -0.548536f, -0.548616f, -0.548696f, -0.548776f, -0.548856f, -0.548936f, -0.549016f, -0.549097f,
+ -0.549177f, -0.549257f, -0.549337f, -0.549417f, -0.549497f, -0.549577f, -0.549657f, -0.549737f,
+ -0.549818f, -0.549898f, -0.549978f, -0.550058f, -0.550138f, -0.550218f, -0.550298f, -0.550378f,
+ -0.550458f, -0.550538f, -0.550618f, -0.550698f, -0.550778f, -0.550858f, -0.550938f, -0.551018f,
+ -0.551098f, -0.551178f, -0.551258f, -0.551338f, -0.551418f, -0.551498f, -0.551578f, -0.551658f,
+ -0.551738f, -0.551818f, -0.551898f, -0.551978f, -0.552058f, -0.552138f, -0.552218f, -0.552298f,
+ -0.552378f, -0.552457f, -0.552537f, -0.552617f, -0.552697f, -0.552777f, -0.552857f, -0.552937f,
+ -0.553017f, -0.553097f, -0.553176f, -0.553256f, -0.553336f, -0.553416f, -0.553496f, -0.553576f,
+ -0.553656f, -0.553735f, -0.553815f, -0.553895f, -0.553975f, -0.554055f, -0.554134f, -0.554214f,
+ -0.554294f, -0.554374f, -0.554454f, -0.554533f, -0.554613f, -0.554693f, -0.554773f, -0.554853f,
+ -0.554932f, -0.555012f, -0.555092f, -0.555172f, -0.555251f, -0.555331f, -0.555411f, -0.555490f,
+ -0.555570f, -0.555650f, -0.555730f, -0.555809f, -0.555889f, -0.555969f, -0.556048f, -0.556128f,
+ -0.556208f, -0.556287f, -0.556367f, -0.556447f, -0.556526f, -0.556606f, -0.556686f, -0.556765f,
+ -0.556845f, -0.556925f, -0.557004f, -0.557084f, -0.557164f, -0.557243f, -0.557323f, -0.557402f,
+ -0.557482f, -0.557562f, -0.557641f, -0.557721f, -0.557800f, -0.557880f, -0.557959f, -0.558039f,
+ -0.558119f, -0.558198f, -0.558278f, -0.558357f, -0.558437f, -0.558516f, -0.558596f, -0.558675f,
+ -0.558755f, -0.558834f, -0.558914f, -0.558993f, -0.559073f, -0.559152f, -0.559232f, -0.559311f,
+ -0.559391f, -0.559470f, -0.559550f, -0.559629f, -0.559709f, -0.559788f, -0.559867f, -0.559947f,
+ -0.560026f, -0.560106f, -0.560185f, -0.560265f, -0.560344f, -0.560423f, -0.560503f, -0.560582f,
+ -0.560662f, -0.560741f, -0.560820f, -0.560900f, -0.560979f, -0.561058f, -0.561138f, -0.561217f,
+ -0.561297f, -0.561376f, -0.561455f, -0.561535f, -0.561614f, -0.561693f, -0.561773f, -0.561852f,
+ -0.561931f, -0.562010f, -0.562090f, -0.562169f, -0.562248f, -0.562328f, -0.562407f, -0.562486f,
+ -0.562565f, -0.562645f, -0.562724f, -0.562803f, -0.562882f, -0.562962f, -0.563041f, -0.563120f,
+ -0.563199f, -0.563279f, -0.563358f, -0.563437f, -0.563516f, -0.563595f, -0.563675f, -0.563754f,
+ -0.563833f, -0.563912f, -0.563991f, -0.564070f, -0.564150f, -0.564229f, -0.564308f, -0.564387f,
+ -0.564466f, -0.564545f, -0.564624f, -0.564704f, -0.564783f, -0.564862f, -0.564941f, -0.565020f,
+ -0.565099f, -0.565178f, -0.565257f, -0.565336f, -0.565416f, -0.565495f, -0.565574f, -0.565653f,
+ -0.565732f, -0.565811f, -0.565890f, -0.565969f, -0.566048f, -0.566127f, -0.566206f, -0.566285f,
+ -0.566364f, -0.566443f, -0.566522f, -0.566601f, -0.566680f, -0.566759f, -0.566838f, -0.566917f,
+ -0.566996f, -0.567075f, -0.567154f, -0.567233f, -0.567312f, -0.567391f, -0.567470f, -0.567549f,
+ -0.567628f, -0.567707f, -0.567786f, -0.567864f, -0.567943f, -0.568022f, -0.568101f, -0.568180f,
+ -0.568259f, -0.568338f, -0.568417f, -0.568496f, -0.568574f, -0.568653f, -0.568732f, -0.568811f,
+ -0.568890f, -0.568969f, -0.569048f, -0.569126f, -0.569205f, -0.569284f, -0.569363f, -0.569442f,
+ -0.569521f, -0.569599f, -0.569678f, -0.569757f, -0.569836f, -0.569914f, -0.569993f, -0.570072f,
+ -0.570151f, -0.570230f, -0.570308f, -0.570387f, -0.570466f, -0.570545f, -0.570623f, -0.570702f,
+ -0.570781f, -0.570859f, -0.570938f, -0.571017f, -0.571096f, -0.571174f, -0.571253f, -0.571332f,
+ -0.571410f, -0.571489f, -0.571568f, -0.571646f, -0.571725f, -0.571804f, -0.571882f, -0.571961f,
+ -0.572040f, -0.572118f, -0.572197f, -0.572276f, -0.572354f, -0.572433f, -0.572511f, -0.572590f,
+ -0.572669f, -0.572747f, -0.572826f, -0.572904f, -0.572983f, -0.573061f, -0.573140f, -0.573219f,
+ -0.573297f, -0.573376f, -0.573454f, -0.573533f, -0.573611f, -0.573690f, -0.573768f, -0.573847f,
+ -0.573925f, -0.574004f, -0.574082f, -0.574161f, -0.574239f, -0.574318f, -0.574396f, -0.574475f,
+ -0.574553f, -0.574632f, -0.574710f, -0.574789f, -0.574867f, -0.574946f, -0.575024f, -0.575103f,
+ -0.575181f, -0.575259f, -0.575338f, -0.575416f, -0.575495f, -0.575573f, -0.575651f, -0.575730f,
+ -0.575808f, -0.575887f, -0.575965f, -0.576043f, -0.576122f, -0.576200f, -0.576278f, -0.576357f,
+ -0.576435f, -0.576513f, -0.576592f, -0.576670f, -0.576748f, -0.576827f, -0.576905f, -0.576983f,
+ -0.577062f, -0.577140f, -0.577218f, -0.577297f, -0.577375f, -0.577453f, -0.577531f, -0.577610f,
+ -0.577688f, -0.577766f, -0.577844f, -0.577923f, -0.578001f, -0.578079f, -0.578157f, -0.578236f,
+ -0.578314f, -0.578392f, -0.578470f, -0.578548f, -0.578627f, -0.578705f, -0.578783f, -0.578861f,
+ -0.578939f, -0.579018f, -0.579096f, -0.579174f, -0.579252f, -0.579330f, -0.579408f, -0.579486f,
+ -0.579565f, -0.579643f, -0.579721f, -0.579799f, -0.579877f, -0.579955f, -0.580033f, -0.580111f,
+ -0.580189f, -0.580267f, -0.580346f, -0.580424f, -0.580502f, -0.580580f, -0.580658f, -0.580736f,
+ -0.580814f, -0.580892f, -0.580970f, -0.581048f, -0.581126f, -0.581204f, -0.581282f, -0.581360f,
+ -0.581438f, -0.581516f, -0.581594f, -0.581672f, -0.581750f, -0.581828f, -0.581906f, -0.581984f,
+ -0.582062f, -0.582140f, -0.582218f, -0.582296f, -0.582374f, -0.582452f, -0.582530f, -0.582608f,
+ -0.582685f, -0.582763f, -0.582841f, -0.582919f, -0.582997f, -0.583075f, -0.583153f, -0.583231f,
+ -0.583309f, -0.583387f, -0.583464f, -0.583542f, -0.583620f, -0.583698f, -0.583776f, -0.583854f,
+ -0.583931f, -0.584009f, -0.584087f, -0.584165f, -0.584243f, -0.584321f, -0.584398f, -0.584476f,
+ -0.584554f, -0.584632f, -0.584710f, -0.584787f, -0.584865f, -0.584943f, -0.585021f, -0.585098f,
+ -0.585176f, -0.585254f, -0.585332f, -0.585409f, -0.585487f, -0.585565f, -0.585642f, -0.585720f,
+ -0.585798f, -0.585876f, -0.585953f, -0.586031f, -0.586109f, -0.586186f, -0.586264f, -0.586342f,
+ -0.586419f, -0.586497f, -0.586575f, -0.586652f, -0.586730f, -0.586808f, -0.586885f, -0.586963f,
+ -0.587040f, -0.587118f, -0.587196f, -0.587273f, -0.587351f, -0.587428f, -0.587506f, -0.587584f,
+ -0.587661f, -0.587739f, -0.587816f, -0.587894f, -0.587971f, -0.588049f, -0.588126f, -0.588204f,
+ -0.588282f, -0.588359f, -0.588437f, -0.588514f, -0.588592f, -0.588669f, -0.588747f, -0.588824f,
+ -0.588902f, -0.588979f, -0.589057f, -0.589134f, -0.589212f, -0.589289f, -0.589366f, -0.589444f,
+ -0.589521f, -0.589599f, -0.589676f, -0.589754f, -0.589831f, -0.589908f, -0.589986f, -0.590063f,
+ -0.590141f, -0.590218f, -0.590295f, -0.590373f, -0.590450f, -0.590528f, -0.590605f, -0.590682f,
+ -0.590760f, -0.590837f, -0.590914f, -0.590992f, -0.591069f, -0.591146f, -0.591224f, -0.591301f,
+ -0.591378f, -0.591456f, -0.591533f, -0.591610f, -0.591688f, -0.591765f, -0.591842f, -0.591919f,
+ -0.591997f, -0.592074f, -0.592151f, -0.592228f, -0.592306f, -0.592383f, -0.592460f, -0.592537f,
+ -0.592615f, -0.592692f, -0.592769f, -0.592846f, -0.592924f, -0.593001f, -0.593078f, -0.593155f,
+ -0.593232f, -0.593309f, -0.593387f, -0.593464f, -0.593541f, -0.593618f, -0.593695f, -0.593772f,
+ -0.593850f, -0.593927f, -0.594004f, -0.594081f, -0.594158f, -0.594235f, -0.594312f, -0.594389f,
+ -0.594467f, -0.594544f, -0.594621f, -0.594698f, -0.594775f, -0.594852f, -0.594929f, -0.595006f,
+ -0.595083f, -0.595160f, -0.595237f, -0.595314f, -0.595391f, -0.595468f, -0.595545f, -0.595622f,
+ -0.595699f, -0.595776f, -0.595853f, -0.595930f, -0.596007f, -0.596084f, -0.596161f, -0.596238f,
+ -0.596315f, -0.596392f, -0.596469f, -0.596546f, -0.596623f, -0.596700f, -0.596777f, -0.596854f,
+ -0.596931f, -0.597008f, -0.597085f, -0.597161f, -0.597238f, -0.597315f, -0.597392f, -0.597469f,
+ -0.597546f, -0.597623f, -0.597700f, -0.597776f, -0.597853f, -0.597930f, -0.598007f, -0.598084f,
+ -0.598161f, -0.598238f, -0.598314f, -0.598391f, -0.598468f, -0.598545f, -0.598622f, -0.598698f,
+ -0.598775f, -0.598852f, -0.598929f, -0.599006f, -0.599082f, -0.599159f, -0.599236f, -0.599313f,
+ -0.599389f, -0.599466f, -0.599543f, -0.599620f, -0.599696f, -0.599773f, -0.599850f, -0.599926f,
+ -0.600003f, -0.600080f, -0.600156f, -0.600233f, -0.600310f, -0.600387f, -0.600463f, -0.600540f,
+ -0.600616f, -0.600693f, -0.600770f, -0.600846f, -0.600923f, -0.601000f, -0.601076f, -0.601153f,
+ -0.601230f, -0.601306f, -0.601383f, -0.601459f, -0.601536f, -0.601613f, -0.601689f, -0.601766f,
+ -0.601842f, -0.601919f, -0.601995f, -0.602072f, -0.602148f, -0.602225f, -0.602302f, -0.602378f,
+ -0.602455f, -0.602531f, -0.602608f, -0.602684f, -0.602761f, -0.602837f, -0.602914f, -0.602990f,
+ -0.603067f, -0.603143f, -0.603220f, -0.603296f, -0.603372f, -0.603449f, -0.603525f, -0.603602f,
+ -0.603678f, -0.603755f, -0.603831f, -0.603908f, -0.603984f, -0.604060f, -0.604137f, -0.604213f,
+ -0.604290f, -0.604366f, -0.604442f, -0.604519f, -0.604595f, -0.604671f, -0.604748f, -0.604824f,
+ -0.604900f, -0.604977f, -0.605053f, -0.605129f, -0.605206f, -0.605282f, -0.605358f, -0.605435f,
+ -0.605511f, -0.605587f, -0.605664f, -0.605740f, -0.605816f, -0.605892f, -0.605969f, -0.606045f,
+ -0.606121f, -0.606198f, -0.606274f, -0.606350f, -0.606426f, -0.606502f, -0.606579f, -0.606655f,
+ -0.606731f, -0.606807f, -0.606884f, -0.606960f, -0.607036f, -0.607112f, -0.607188f, -0.607264f,
+ -0.607341f, -0.607417f, -0.607493f, -0.607569f, -0.607645f, -0.607721f, -0.607798f, -0.607874f,
+ -0.607950f, -0.608026f, -0.608102f, -0.608178f, -0.608254f, -0.608330f, -0.608406f, -0.608482f,
+ -0.608559f, -0.608635f, -0.608711f, -0.608787f, -0.608863f, -0.608939f, -0.609015f, -0.609091f,
+ -0.609167f, -0.609243f, -0.609319f, -0.609395f, -0.609471f, -0.609547f, -0.609623f, -0.609699f,
+ -0.609775f, -0.609851f, -0.609927f, -0.610003f, -0.610079f, -0.610155f, -0.610231f, -0.610307f,
+ -0.610383f, -0.610459f, -0.610535f, -0.610611f, -0.610687f, -0.610762f, -0.610838f, -0.610914f,
+ -0.610990f, -0.611066f, -0.611142f, -0.611218f, -0.611294f, -0.611370f, -0.611445f, -0.611521f,
+ -0.611597f, -0.611673f, -0.611749f, -0.611825f, -0.611901f, -0.611976f, -0.612052f, -0.612128f,
+ -0.612204f, -0.612280f, -0.612355f, -0.612431f, -0.612507f, -0.612583f, -0.612659f, -0.612734f,
+ -0.612810f, -0.612886f, -0.612962f, -0.613037f, -0.613113f, -0.613189f, -0.613265f, -0.613340f,
+ -0.613416f, -0.613492f, -0.613567f, -0.613643f, -0.613719f, -0.613795f, -0.613870f, -0.613946f,
+ -0.614022f, -0.614097f, -0.614173f, -0.614249f, -0.614324f, -0.614400f, -0.614475f, -0.614551f,
+ -0.614627f, -0.614702f, -0.614778f, -0.614854f, -0.614929f, -0.615005f, -0.615080f, -0.615156f,
+ -0.615232f, -0.615307f, -0.615383f, -0.615458f, -0.615534f, -0.615609f, -0.615685f, -0.615761f,
+ -0.615836f, -0.615912f, -0.615987f, -0.616063f, -0.616138f, -0.616214f, -0.616289f, -0.616365f,
+ -0.616440f, -0.616516f, -0.616591f, -0.616667f, -0.616742f, -0.616818f, -0.616893f, -0.616968f,
+ -0.617044f, -0.617119f, -0.617195f, -0.617270f, -0.617346f, -0.617421f, -0.617496f, -0.617572f,
+ -0.617647f, -0.617723f, -0.617798f, -0.617873f, -0.617949f, -0.618024f, -0.618100f, -0.618175f,
+ -0.618250f, -0.618326f, -0.618401f, -0.618476f, -0.618552f, -0.618627f, -0.618702f, -0.618778f,
+ -0.618853f, -0.618928f, -0.619004f, -0.619079f, -0.619154f, -0.619229f, -0.619305f, -0.619380f,
+ -0.619455f, -0.619531f, -0.619606f, -0.619681f, -0.619756f, -0.619832f, -0.619907f, -0.619982f,
+ -0.620057f, -0.620132f, -0.620208f, -0.620283f, -0.620358f, -0.620433f, -0.620508f, -0.620584f,
+ -0.620659f, -0.620734f, -0.620809f, -0.620884f, -0.620959f, -0.621035f, -0.621110f, -0.621185f,
+ -0.621260f, -0.621335f, -0.621410f, -0.621485f, -0.621560f, -0.621636f, -0.621711f, -0.621786f,
+ -0.621861f, -0.621936f, -0.622011f, -0.622086f, -0.622161f, -0.622236f, -0.622311f, -0.622386f,
+ -0.622461f, -0.622536f, -0.622611f, -0.622686f, -0.622761f, -0.622836f, -0.622911f, -0.622986f,
+ -0.623061f, -0.623136f, -0.623211f, -0.623286f, -0.623361f, -0.623436f, -0.623511f, -0.623586f,
+ -0.623661f, -0.623736f, -0.623811f, -0.623886f, -0.623961f, -0.624036f, -0.624111f, -0.624186f,
+ -0.624260f, -0.624335f, -0.624410f, -0.624485f, -0.624560f, -0.624635f, -0.624710f, -0.624785f,
+ -0.624860f, -0.624934f, -0.625009f, -0.625084f, -0.625159f, -0.625234f, -0.625309f, -0.625383f,
+ -0.625458f, -0.625533f, -0.625608f, -0.625683f, -0.625757f, -0.625832f, -0.625907f, -0.625982f,
+ -0.626056f, -0.626131f, -0.626206f, -0.626281f, -0.626355f, -0.626430f, -0.626505f, -0.626580f,
+ -0.626654f, -0.626729f, -0.626804f, -0.626878f, -0.626953f, -0.627028f, -0.627102f, -0.627177f,
+ -0.627252f, -0.627326f, -0.627401f, -0.627476f, -0.627550f, -0.627625f, -0.627700f, -0.627774f,
+ -0.627849f, -0.627924f, -0.627998f, -0.628073f, -0.628147f, -0.628222f, -0.628297f, -0.628371f,
+ -0.628446f, -0.628520f, -0.628595f, -0.628669f, -0.628744f, -0.628819f, -0.628893f, -0.628968f,
+ -0.629042f, -0.629117f, -0.629191f, -0.629266f, -0.629340f, -0.629415f, -0.629489f, -0.629564f,
+ -0.629638f, -0.629713f, -0.629787f, -0.629862f, -0.629936f, -0.630011f, -0.630085f, -0.630159f,
+ -0.630234f, -0.630308f, -0.630383f, -0.630457f, -0.630532f, -0.630606f, -0.630680f, -0.630755f,
+ -0.630829f, -0.630904f, -0.630978f, -0.631052f, -0.631127f, -0.631201f, -0.631275f, -0.631350f,
+ -0.631424f, -0.631499f, -0.631573f, -0.631647f, -0.631721f, -0.631796f, -0.631870f, -0.631944f,
+ -0.632019f, -0.632093f, -0.632167f, -0.632242f, -0.632316f, -0.632390f, -0.632464f, -0.632539f,
+ -0.632613f, -0.632687f, -0.632761f, -0.632836f, -0.632910f, -0.632984f, -0.633058f, -0.633133f,
+ -0.633207f, -0.633281f, -0.633355f, -0.633429f, -0.633504f, -0.633578f, -0.633652f, -0.633726f,
+ -0.633800f, -0.633874f, -0.633949f, -0.634023f, -0.634097f, -0.634171f, -0.634245f, -0.634319f,
+ -0.634393f, -0.634467f, -0.634542f, -0.634616f, -0.634690f, -0.634764f, -0.634838f, -0.634912f,
+ -0.634986f, -0.635060f, -0.635134f, -0.635208f, -0.635282f, -0.635356f, -0.635430f, -0.635504f,
+ -0.635578f, -0.635652f, -0.635726f, -0.635800f, -0.635874f, -0.635948f, -0.636022f, -0.636096f,
+ -0.636170f, -0.636244f, -0.636318f, -0.636392f, -0.636466f, -0.636540f, -0.636614f, -0.636688f,
+ -0.636762f, -0.636836f, -0.636910f, -0.636984f, -0.637057f, -0.637131f, -0.637205f, -0.637279f,
+ -0.637353f, -0.637427f, -0.637501f, -0.637575f, -0.637649f, -0.637722f, -0.637796f, -0.637870f,
+ -0.637944f, -0.638018f, -0.638092f, -0.638165f, -0.638239f, -0.638313f, -0.638387f, -0.638461f,
+ -0.638534f, -0.638608f, -0.638682f, -0.638756f, -0.638829f, -0.638903f, -0.638977f, -0.639051f,
+ -0.639124f, -0.639198f, -0.639272f, -0.639346f, -0.639419f, -0.639493f, -0.639567f, -0.639640f,
+ -0.639714f, -0.639788f, -0.639862f, -0.639935f, -0.640009f, -0.640083f, -0.640156f, -0.640230f,
+ -0.640303f, -0.640377f, -0.640451f, -0.640524f, -0.640598f, -0.640672f, -0.640745f, -0.640819f,
+ -0.640892f, -0.640966f, -0.641040f, -0.641113f, -0.641187f, -0.641260f, -0.641334f, -0.641407f,
+ -0.641481f, -0.641555f, -0.641628f, -0.641702f, -0.641775f, -0.641849f, -0.641922f, -0.641996f,
+ -0.642069f, -0.642143f, -0.642216f, -0.642290f, -0.642363f, -0.642437f, -0.642510f, -0.642584f,
+ -0.642657f, -0.642730f, -0.642804f, -0.642877f, -0.642951f, -0.643024f, -0.643098f, -0.643171f,
+ -0.643245f, -0.643318f, -0.643391f, -0.643465f, -0.643538f, -0.643611f, -0.643685f, -0.643758f,
+ -0.643832f, -0.643905f, -0.643978f, -0.644052f, -0.644125f, -0.644198f, -0.644272f, -0.644345f,
+ -0.644418f, -0.644492f, -0.644565f, -0.644638f, -0.644711f, -0.644785f, -0.644858f, -0.644931f,
+ -0.645005f, -0.645078f, -0.645151f, -0.645224f, -0.645298f, -0.645371f, -0.645444f, -0.645517f,
+ -0.645590f, -0.645664f, -0.645737f, -0.645810f, -0.645883f, -0.645956f, -0.646030f, -0.646103f,
+ -0.646176f, -0.646249f, -0.646322f, -0.646396f, -0.646469f, -0.646542f, -0.646615f, -0.646688f,
+ -0.646761f, -0.646834f, -0.646907f, -0.646981f, -0.647054f, -0.647127f, -0.647200f, -0.647273f,
+ -0.647346f, -0.647419f, -0.647492f, -0.647565f, -0.647638f, -0.647711f, -0.647784f, -0.647857f,
+ -0.647930f, -0.648003f, -0.648076f, -0.648149f, -0.648222f, -0.648295f, -0.648368f, -0.648441f,
+ -0.648514f, -0.648587f, -0.648660f, -0.648733f, -0.648806f, -0.648879f, -0.648952f, -0.649025f,
+ -0.649098f, -0.649171f, -0.649244f, -0.649317f, -0.649390f, -0.649463f, -0.649536f, -0.649608f,
+ -0.649681f, -0.649754f, -0.649827f, -0.649900f, -0.649973f, -0.650046f, -0.650119f, -0.650191f,
+ -0.650264f, -0.650337f, -0.650410f, -0.650483f, -0.650555f, -0.650628f, -0.650701f, -0.650774f,
+ -0.650847f, -0.650919f, -0.650992f, -0.651065f, -0.651138f, -0.651211f, -0.651283f, -0.651356f,
+ -0.651429f, -0.651502f, -0.651574f, -0.651647f, -0.651720f, -0.651792f, -0.651865f, -0.651938f,
+ -0.652011f, -0.652083f, -0.652156f, -0.652229f, -0.652301f, -0.652374f, -0.652447f, -0.652519f,
+ -0.652592f, -0.652665f, -0.652737f, -0.652810f, -0.652882f, -0.652955f, -0.653028f, -0.653100f,
+ -0.653173f, -0.653245f, -0.653318f, -0.653391f, -0.653463f, -0.653536f, -0.653608f, -0.653681f,
+ -0.653753f, -0.653826f, -0.653899f, -0.653971f, -0.654044f, -0.654116f, -0.654189f, -0.654261f,
+ -0.654334f, -0.654406f, -0.654479f, -0.654551f, -0.654624f, -0.654696f, -0.654769f, -0.654841f,
+ -0.654913f, -0.654986f, -0.655058f, -0.655131f, -0.655203f, -0.655276f, -0.655348f, -0.655420f,
+ -0.655493f, -0.655565f, -0.655638f, -0.655710f, -0.655782f, -0.655855f, -0.655927f, -0.656000f,
+ -0.656072f, -0.656144f, -0.656217f, -0.656289f, -0.656361f, -0.656434f, -0.656506f, -0.656578f,
+ -0.656651f, -0.656723f, -0.656795f, -0.656867f, -0.656940f, -0.657012f, -0.657084f, -0.657157f,
+ -0.657229f, -0.657301f, -0.657373f, -0.657446f, -0.657518f, -0.657590f, -0.657662f, -0.657734f,
+ -0.657807f, -0.657879f, -0.657951f, -0.658023f, -0.658095f, -0.658168f, -0.658240f, -0.658312f,
+ -0.658384f, -0.658456f, -0.658529f, -0.658601f, -0.658673f, -0.658745f, -0.658817f, -0.658889f,
+ -0.658961f, -0.659033f, -0.659105f, -0.659178f, -0.659250f, -0.659322f, -0.659394f, -0.659466f,
+ -0.659538f, -0.659610f, -0.659682f, -0.659754f, -0.659826f, -0.659898f, -0.659970f, -0.660042f,
+ -0.660114f, -0.660186f, -0.660258f, -0.660330f, -0.660402f, -0.660474f, -0.660546f, -0.660618f,
+ -0.660690f, -0.660762f, -0.660834f, -0.660906f, -0.660978f, -0.661050f, -0.661122f, -0.661194f,
+ -0.661266f, -0.661338f, -0.661410f, -0.661482f, -0.661553f, -0.661625f, -0.661697f, -0.661769f,
+ -0.661841f, -0.661913f, -0.661985f, -0.662057f, -0.662128f, -0.662200f, -0.662272f, -0.662344f,
+ -0.662416f, -0.662488f, -0.662559f, -0.662631f, -0.662703f, -0.662775f, -0.662847f, -0.662918f,
+ -0.662990f, -0.663062f, -0.663134f, -0.663205f, -0.663277f, -0.663349f, -0.663421f, -0.663492f,
+ -0.663564f, -0.663636f, -0.663708f, -0.663779f, -0.663851f, -0.663923f, -0.663994f, -0.664066f,
+ -0.664138f, -0.664209f, -0.664281f, -0.664353f, -0.664424f, -0.664496f, -0.664568f, -0.664639f,
+ -0.664711f, -0.664783f, -0.664854f, -0.664926f, -0.664997f, -0.665069f, -0.665141f, -0.665212f,
+ -0.665284f, -0.665355f, -0.665427f, -0.665498f, -0.665570f, -0.665642f, -0.665713f, -0.665785f,
+ -0.665856f, -0.665928f, -0.665999f, -0.666071f, -0.666142f, -0.666214f, -0.666285f, -0.666357f,
+ -0.666428f, -0.666500f, -0.666571f, -0.666643f, -0.666714f, -0.666786f, -0.666857f, -0.666928f,
+ -0.667000f, -0.667071f, -0.667143f, -0.667214f, -0.667286f, -0.667357f, -0.667428f, -0.667500f,
+ -0.667571f, -0.667643f, -0.667714f, -0.667785f, -0.667857f, -0.667928f, -0.667999f, -0.668071f,
+ -0.668142f, -0.668213f, -0.668285f, -0.668356f, -0.668427f, -0.668499f, -0.668570f, -0.668641f,
+ -0.668712f, -0.668784f, -0.668855f, -0.668926f, -0.668998f, -0.669069f, -0.669140f, -0.669211f,
+ -0.669283f, -0.669354f, -0.669425f, -0.669496f, -0.669567f, -0.669639f, -0.669710f, -0.669781f,
+ -0.669852f, -0.669923f, -0.669995f, -0.670066f, -0.670137f, -0.670208f, -0.670279f, -0.670350f,
+ -0.670422f, -0.670493f, -0.670564f, -0.670635f, -0.670706f, -0.670777f, -0.670848f, -0.670919f,
+ -0.670990f, -0.671062f, -0.671133f, -0.671204f, -0.671275f, -0.671346f, -0.671417f, -0.671488f,
+ -0.671559f, -0.671630f, -0.671701f, -0.671772f, -0.671843f, -0.671914f, -0.671985f, -0.672056f,
+ -0.672127f, -0.672198f, -0.672269f, -0.672340f, -0.672411f, -0.672482f, -0.672553f, -0.672624f,
+ -0.672695f, -0.672766f, -0.672837f, -0.672908f, -0.672978f, -0.673049f, -0.673120f, -0.673191f,
+ -0.673262f, -0.673333f, -0.673404f, -0.673475f, -0.673546f, -0.673616f, -0.673687f, -0.673758f,
+ -0.673829f, -0.673900f, -0.673971f, -0.674042f, -0.674112f, -0.674183f, -0.674254f, -0.674325f,
+ -0.674396f, -0.674466f, -0.674537f, -0.674608f, -0.674679f, -0.674749f, -0.674820f, -0.674891f,
+ -0.674962f, -0.675032f, -0.675103f, -0.675174f, -0.675245f, -0.675315f, -0.675386f, -0.675457f,
+ -0.675527f, -0.675598f, -0.675669f, -0.675739f, -0.675810f, -0.675881f, -0.675951f, -0.676022f,
+ -0.676093f, -0.676163f, -0.676234f, -0.676305f, -0.676375f, -0.676446f, -0.676516f, -0.676587f,
+ -0.676658f, -0.676728f, -0.676799f, -0.676869f, -0.676940f, -0.677011f, -0.677081f, -0.677152f,
+ -0.677222f, -0.677293f, -0.677363f, -0.677434f, -0.677504f, -0.677575f, -0.677645f, -0.677716f,
+ -0.677786f, -0.677857f, -0.677927f, -0.677998f, -0.678068f, -0.678139f, -0.678209f, -0.678280f,
+ -0.678350f, -0.678420f, -0.678491f, -0.678561f, -0.678632f, -0.678702f, -0.678773f, -0.678843f,
+ -0.678913f, -0.678984f, -0.679054f, -0.679125f, -0.679195f, -0.679265f, -0.679336f, -0.679406f,
+ -0.679476f, -0.679547f, -0.679617f, -0.679687f, -0.679758f, -0.679828f, -0.679898f, -0.679969f,
+ -0.680039f, -0.680109f, -0.680179f, -0.680250f, -0.680320f, -0.680390f, -0.680461f, -0.680531f,
+ -0.680601f, -0.680671f, -0.680741f, -0.680812f, -0.680882f, -0.680952f, -0.681022f, -0.681093f,
+ -0.681163f, -0.681233f, -0.681303f, -0.681373f, -0.681443f, -0.681514f, -0.681584f, -0.681654f,
+ -0.681724f, -0.681794f, -0.681864f, -0.681934f, -0.682005f, -0.682075f, -0.682145f, -0.682215f,
+ -0.682285f, -0.682355f, -0.682425f, -0.682495f, -0.682565f, -0.682635f, -0.682705f, -0.682775f,
+ -0.682846f, -0.682916f, -0.682986f, -0.683056f, -0.683126f, -0.683196f, -0.683266f, -0.683336f,
+ -0.683406f, -0.683476f, -0.683546f, -0.683616f, -0.683686f, -0.683756f, -0.683825f, -0.683895f,
+ -0.683965f, -0.684035f, -0.684105f, -0.684175f, -0.684245f, -0.684315f, -0.684385f, -0.684455f,
+ -0.684525f, -0.684595f, -0.684664f, -0.684734f, -0.684804f, -0.684874f, -0.684944f, -0.685014f,
+ -0.685084f, -0.685153f, -0.685223f, -0.685293f, -0.685363f, -0.685433f, -0.685503f, -0.685572f,
+ -0.685642f, -0.685712f, -0.685782f, -0.685852f, -0.685921f, -0.685991f, -0.686061f, -0.686131f,
+ -0.686200f, -0.686270f, -0.686340f, -0.686409f, -0.686479f, -0.686549f, -0.686619f, -0.686688f,
+ -0.686758f, -0.686828f, -0.686897f, -0.686967f, -0.687037f, -0.687106f, -0.687176f, -0.687246f,
+ -0.687315f, -0.687385f, -0.687455f, -0.687524f, -0.687594f, -0.687663f, -0.687733f, -0.687803f,
+ -0.687872f, -0.687942f, -0.688011f, -0.688081f, -0.688151f, -0.688220f, -0.688290f, -0.688359f,
+ -0.688429f, -0.688498f, -0.688568f, -0.688637f, -0.688707f, -0.688776f, -0.688846f, -0.688915f,
+ -0.688985f, -0.689054f, -0.689124f, -0.689193f, -0.689263f, -0.689332f, -0.689402f, -0.689471f,
+ -0.689541f, -0.689610f, -0.689679f, -0.689749f, -0.689818f, -0.689888f, -0.689957f, -0.690026f,
+ -0.690096f, -0.690165f, -0.690235f, -0.690304f, -0.690373f, -0.690443f, -0.690512f, -0.690581f,
+ -0.690651f, -0.690720f, -0.690789f, -0.690859f, -0.690928f, -0.690997f, -0.691067f, -0.691136f,
+ -0.691205f, -0.691274f, -0.691344f, -0.691413f, -0.691482f, -0.691552f, -0.691621f, -0.691690f,
+ -0.691759f, -0.691828f, -0.691898f, -0.691967f, -0.692036f, -0.692105f, -0.692175f, -0.692244f,
+ -0.692313f, -0.692382f, -0.692451f, -0.692520f, -0.692590f, -0.692659f, -0.692728f, -0.692797f,
+ -0.692866f, -0.692935f, -0.693004f, -0.693074f, -0.693143f, -0.693212f, -0.693281f, -0.693350f,
+ -0.693419f, -0.693488f, -0.693557f, -0.693626f, -0.693695f, -0.693764f, -0.693833f, -0.693902f,
+ -0.693971f, -0.694040f, -0.694109f, -0.694179f, -0.694248f, -0.694317f, -0.694386f, -0.694454f,
+ -0.694524f, -0.694592f, -0.694661f, -0.694730f, -0.694799f, -0.694868f, -0.694937f, -0.695006f,
+ -0.695075f, -0.695144f, -0.695213f, -0.695282f, -0.695351f, -0.695420f, -0.695489f, -0.695557f,
+ -0.695626f, -0.695695f, -0.695764f, -0.695833f, -0.695902f, -0.695971f, -0.696039f, -0.696108f,
+ -0.696177f, -0.696246f, -0.696315f, -0.696384f, -0.696452f, -0.696521f, -0.696590f, -0.696659f,
+ -0.696728f, -0.696796f, -0.696865f, -0.696934f, -0.697003f, -0.697071f, -0.697140f, -0.697209f,
+ -0.697277f, -0.697346f, -0.697415f, -0.697484f, -0.697552f, -0.697621f, -0.697690f, -0.697758f,
+ -0.697827f, -0.697896f, -0.697964f, -0.698033f, -0.698102f, -0.698170f, -0.698239f, -0.698308f,
+ -0.698376f, -0.698445f, -0.698513f, -0.698582f, -0.698651f, -0.698719f, -0.698788f, -0.698856f,
+ -0.698925f, -0.698994f, -0.699062f, -0.699131f, -0.699199f, -0.699268f, -0.699336f, -0.699405f,
+ -0.699473f, -0.699542f, -0.699610f, -0.699679f, -0.699747f, -0.699816f, -0.699884f, -0.699953f,
+ -0.700021f, -0.700090f, -0.700158f, -0.700227f, -0.700295f, -0.700364f, -0.700432f, -0.700500f,
+ -0.700569f, -0.700637f, -0.700706f, -0.700774f, -0.700842f, -0.700911f, -0.700979f, -0.701048f,
+ -0.701116f, -0.701184f, -0.701253f, -0.701321f, -0.701389f, -0.701458f, -0.701526f, -0.701594f,
+ -0.701663f, -0.701731f, -0.701799f, -0.701868f, -0.701936f, -0.702004f, -0.702072f, -0.702141f,
+ -0.702209f, -0.702277f, -0.702345f, -0.702414f, -0.702482f, -0.702550f, -0.702618f, -0.702687f,
+ -0.702755f, -0.702823f, -0.702891f, -0.702959f, -0.703028f, -0.703096f, -0.703164f, -0.703232f,
+ -0.703300f, -0.703368f, -0.703436f, -0.703505f, -0.703573f, -0.703641f, -0.703709f, -0.703777f,
+ -0.703845f, -0.703913f, -0.703981f, -0.704050f, -0.704118f, -0.704186f, -0.704254f, -0.704322f,
+ -0.704390f, -0.704458f, -0.704526f, -0.704594f, -0.704662f, -0.704730f, -0.704798f, -0.704866f,
+ -0.704934f, -0.705002f, -0.705070f, -0.705138f, -0.705206f, -0.705274f, -0.705342f, -0.705410f,
+ -0.705478f, -0.705546f, -0.705614f, -0.705682f, -0.705750f, -0.705818f, -0.705885f, -0.705953f,
+ -0.706021f, -0.706089f, -0.706157f, -0.706225f, -0.706293f, -0.706361f, -0.706429f, -0.706496f,
+ -0.706564f, -0.706632f, -0.706700f, -0.706768f, -0.706836f, -0.706903f, -0.706971f, -0.707039f,
+ -0.707107f, -0.707175f, -0.707242f, -0.707310f, -0.707378f, -0.707446f, -0.707513f, -0.707581f,
+ -0.707649f, -0.707717f, -0.707784f, -0.707852f, -0.707920f, -0.707988f, -0.708055f, -0.708123f,
+ -0.708191f, -0.708258f, -0.708326f, -0.708394f, -0.708461f, -0.708529f, -0.708597f, -0.708664f,
+ -0.708732f, -0.708800f, -0.708867f, -0.708935f, -0.709002f, -0.709070f, -0.709138f, -0.709205f,
+ -0.709273f, -0.709340f, -0.709408f, -0.709476f, -0.709543f, -0.709611f, -0.709678f, -0.709746f,
+ -0.709813f, -0.709881f, -0.709948f, -0.710016f, -0.710083f, -0.710151f, -0.710218f, -0.710286f,
+ -0.710353f, -0.710421f, -0.710488f, -0.710556f, -0.710623f, -0.710691f, -0.710758f, -0.710826f,
+ -0.710893f, -0.710960f, -0.711028f, -0.711095f, -0.711163f, -0.711230f, -0.711297f, -0.711365f,
+ -0.711432f, -0.711500f, -0.711567f, -0.711634f, -0.711702f, -0.711769f, -0.711836f, -0.711904f,
+ -0.711971f, -0.712038f, -0.712106f, -0.712173f, -0.712240f, -0.712308f, -0.712375f, -0.712442f,
+ -0.712509f, -0.712577f, -0.712644f, -0.712711f, -0.712778f, -0.712846f, -0.712913f, -0.712980f,
+ -0.713047f, -0.713115f, -0.713182f, -0.713249f, -0.713316f, -0.713383f, -0.713451f, -0.713518f,
+ -0.713585f, -0.713652f, -0.713719f, -0.713786f, -0.713853f, -0.713921f, -0.713988f, -0.714055f,
+ -0.714122f, -0.714189f, -0.714256f, -0.714323f, -0.714390f, -0.714457f, -0.714525f, -0.714592f,
+ -0.714659f, -0.714726f, -0.714793f, -0.714860f, -0.714927f, -0.714994f, -0.715061f, -0.715128f,
+ -0.715195f, -0.715262f, -0.715329f, -0.715396f, -0.715463f, -0.715530f, -0.715597f, -0.715664f,
+ -0.715731f, -0.715798f, -0.715865f, -0.715932f, -0.715999f, -0.716066f, -0.716132f, -0.716199f,
+ -0.716266f, -0.716333f, -0.716400f, -0.716467f, -0.716534f, -0.716601f, -0.716668f, -0.716734f,
+ -0.716801f, -0.716868f, -0.716935f, -0.717002f, -0.717069f, -0.717135f, -0.717202f, -0.717269f,
+ -0.717336f, -0.717403f, -0.717469f, -0.717536f, -0.717603f, -0.717670f, -0.717737f, -0.717803f,
+ -0.717870f, -0.717937f, -0.718004f, -0.718070f, -0.718137f, -0.718204f, -0.718270f, -0.718337f,
+ -0.718404f, -0.718471f, -0.718537f, -0.718604f, -0.718670f, -0.718737f, -0.718804f, -0.718870f,
+ -0.718937f, -0.719004f, -0.719070f, -0.719137f, -0.719204f, -0.719270f, -0.719337f, -0.719403f,
+ -0.719470f, -0.719537f, -0.719603f, -0.719670f, -0.719736f, -0.719803f, -0.719869f, -0.719936f,
+ -0.720003f, -0.720069f, -0.720136f, -0.720202f, -0.720269f, -0.720335f, -0.720402f, -0.720468f,
+ -0.720535f, -0.720601f, -0.720668f, -0.720734f, -0.720800f, -0.720867f, -0.720933f, -0.721000f,
+ -0.721066f, -0.721133f, -0.721199f, -0.721265f, -0.721332f, -0.721398f, -0.721465f, -0.721531f,
+ -0.721597f, -0.721664f, -0.721730f, -0.721797f, -0.721863f, -0.721929f, -0.721996f, -0.722062f,
+ -0.722128f, -0.722194f, -0.722261f, -0.722327f, -0.722393f, -0.722460f, -0.722526f, -0.722592f,
+ -0.722659f, -0.722725f, -0.722791f, -0.722857f, -0.722924f, -0.722990f, -0.723056f, -0.723122f,
+ -0.723188f, -0.723255f, -0.723321f, -0.723387f, -0.723453f, -0.723520f, -0.723586f, -0.723652f,
+ -0.723718f, -0.723784f, -0.723850f, -0.723916f, -0.723983f, -0.724049f, -0.724115f, -0.724181f,
+ -0.724247f, -0.724313f, -0.724379f, -0.724445f, -0.724511f, -0.724578f, -0.724644f, -0.724710f,
+ -0.724776f, -0.724842f, -0.724908f, -0.724974f, -0.725040f, -0.725106f, -0.725172f, -0.725238f,
+ -0.725304f, -0.725370f, -0.725436f, -0.725502f, -0.725568f, -0.725634f, -0.725700f, -0.725766f,
+ -0.725832f, -0.725898f, -0.725964f, -0.726030f, -0.726095f, -0.726161f, -0.726227f, -0.726293f,
+ -0.726359f, -0.726425f, -0.726491f, -0.726557f, -0.726623f, -0.726689f, -0.726754f, -0.726820f,
+ -0.726886f, -0.726952f, -0.727018f, -0.727084f, -0.727149f, -0.727215f, -0.727281f, -0.727347f,
+ -0.727413f, -0.727478f, -0.727544f, -0.727610f, -0.727676f, -0.727741f, -0.727807f, -0.727873f,
+ -0.727939f, -0.728004f, -0.728070f, -0.728136f, -0.728202f, -0.728267f, -0.728333f, -0.728399f,
+ -0.728464f, -0.728530f, -0.728596f, -0.728661f, -0.728727f, -0.728793f, -0.728858f, -0.728924f,
+ -0.728990f, -0.729055f, -0.729121f, -0.729186f, -0.729252f, -0.729318f, -0.729383f, -0.729449f,
+ -0.729514f, -0.729580f, -0.729646f, -0.729711f, -0.729777f, -0.729842f, -0.729908f, -0.729973f,
+ -0.730039f, -0.730104f, -0.730170f, -0.730235f, -0.730301f, -0.730366f, -0.730432f, -0.730497f,
+ -0.730563f, -0.730628f, -0.730694f, -0.730759f, -0.730825f, -0.730890f, -0.730955f, -0.731021f,
+ -0.731086f, -0.731152f, -0.731217f, -0.731282f, -0.731348f, -0.731413f, -0.731479f, -0.731544f,
+ -0.731609f, -0.731675f, -0.731740f, -0.731805f, -0.731871f, -0.731936f, -0.732001f, -0.732067f,
+ -0.732132f, -0.732197f, -0.732263f, -0.732328f, -0.732393f, -0.732458f, -0.732524f, -0.732589f,
+ -0.732654f, -0.732720f, -0.732785f, -0.732850f, -0.732915f, -0.732980f, -0.733046f, -0.733111f,
+ -0.733176f, -0.733241f, -0.733306f, -0.733372f, -0.733437f, -0.733502f, -0.733567f, -0.733632f,
+ -0.733697f, -0.733763f, -0.733828f, -0.733893f, -0.733958f, -0.734023f, -0.734088f, -0.734153f,
+ -0.734218f, -0.734283f, -0.734349f, -0.734414f, -0.734479f, -0.734544f, -0.734609f, -0.734674f,
+ -0.734739f, -0.734804f, -0.734869f, -0.734934f, -0.734999f, -0.735064f, -0.735129f, -0.735194f,
+ -0.735259f, -0.735324f, -0.735389f, -0.735454f, -0.735519f, -0.735584f, -0.735649f, -0.735714f,
+ -0.735779f, -0.735844f, -0.735908f, -0.735973f, -0.736038f, -0.736103f, -0.736168f, -0.736233f,
+ -0.736298f, -0.736363f, -0.736428f, -0.736492f, -0.736557f, -0.736622f, -0.736687f, -0.736752f,
+ -0.736817f, -0.736881f, -0.736946f, -0.737011f, -0.737076f, -0.737141f, -0.737205f, -0.737270f,
+ -0.737335f, -0.737400f, -0.737464f, -0.737529f, -0.737594f, -0.737659f, -0.737723f, -0.737788f,
+ -0.737853f, -0.737918f, -0.737982f, -0.738047f, -0.738112f, -0.738176f, -0.738241f, -0.738306f,
+ -0.738370f, -0.738435f, -0.738500f, -0.738564f, -0.738629f, -0.738693f, -0.738758f, -0.738823f,
+ -0.738887f, -0.738952f, -0.739017f, -0.739081f, -0.739146f, -0.739210f, -0.739275f, -0.739339f,
+ -0.739404f, -0.739468f, -0.739533f, -0.739598f, -0.739662f, -0.739727f, -0.739791f, -0.739856f,
+ -0.739920f, -0.739985f, -0.740049f, -0.740114f, -0.740178f, -0.740242f, -0.740307f, -0.740371f,
+ -0.740436f, -0.740500f, -0.740565f, -0.740629f, -0.740694f, -0.740758f, -0.740822f, -0.740887f,
+ -0.740951f, -0.741015f, -0.741080f, -0.741144f, -0.741209f, -0.741273f, -0.741337f, -0.741402f,
+ -0.741466f, -0.741530f, -0.741595f, -0.741659f, -0.741723f, -0.741788f, -0.741852f, -0.741916f,
+ -0.741980f, -0.742045f, -0.742109f, -0.742173f, -0.742237f, -0.742302f, -0.742366f, -0.742430f,
+ -0.742494f, -0.742559f, -0.742623f, -0.742687f, -0.742751f, -0.742815f, -0.742880f, -0.742944f,
+ -0.743008f, -0.743072f, -0.743136f, -0.743200f, -0.743265f, -0.743329f, -0.743393f, -0.743457f,
+ -0.743521f, -0.743585f, -0.743649f, -0.743713f, -0.743777f, -0.743842f, -0.743906f, -0.743970f,
+ -0.744034f, -0.744098f, -0.744162f, -0.744226f, -0.744290f, -0.744354f, -0.744418f, -0.744482f,
+ -0.744546f, -0.744610f, -0.744674f, -0.744738f, -0.744802f, -0.744866f, -0.744930f, -0.744994f,
+ -0.745058f, -0.745122f, -0.745186f, -0.745250f, -0.745314f, -0.745377f, -0.745441f, -0.745505f,
+ -0.745569f, -0.745633f, -0.745697f, -0.745761f, -0.745825f, -0.745889f, -0.745952f, -0.746016f,
+ -0.746080f, -0.746144f, -0.746208f, -0.746272f, -0.746335f, -0.746399f, -0.746463f, -0.746527f,
+ -0.746591f, -0.746654f, -0.746718f, -0.746782f, -0.746846f, -0.746909f, -0.746973f, -0.747037f,
+ -0.747101f, -0.747164f, -0.747228f, -0.747292f, -0.747355f, -0.747419f, -0.747483f, -0.747547f,
+ -0.747610f, -0.747674f, -0.747738f, -0.747801f, -0.747865f, -0.747929f, -0.747992f, -0.748056f,
+ -0.748119f, -0.748183f, -0.748247f, -0.748310f, -0.748374f, -0.748437f, -0.748501f, -0.748565f,
+ -0.748628f, -0.748692f, -0.748755f, -0.748819f, -0.748882f, -0.748946f, -0.749009f, -0.749073f,
+ -0.749136f, -0.749200f, -0.749263f, -0.749327f, -0.749390f, -0.749454f, -0.749517f, -0.749581f,
+ -0.749644f, -0.749708f, -0.749771f, -0.749835f, -0.749898f, -0.749961f, -0.750025f, -0.750088f,
+ -0.750152f, -0.750215f, -0.750278f, -0.750342f, -0.750405f, -0.750469f, -0.750532f, -0.750595f,
+ -0.750659f, -0.750722f, -0.750785f, -0.750849f, -0.750912f, -0.750975f, -0.751039f, -0.751102f,
+ -0.751165f, -0.751228f, -0.751292f, -0.751355f, -0.751418f, -0.751481f, -0.751545f, -0.751608f,
+ -0.751671f, -0.751734f, -0.751798f, -0.751861f, -0.751924f, -0.751987f, -0.752050f, -0.752114f,
+ -0.752177f, -0.752240f, -0.752303f, -0.752366f, -0.752429f, -0.752493f, -0.752556f, -0.752619f,
+ -0.752682f, -0.752745f, -0.752808f, -0.752871f, -0.752934f, -0.752998f, -0.753061f, -0.753124f,
+ -0.753187f, -0.753250f, -0.753313f, -0.753376f, -0.753439f, -0.753502f, -0.753565f, -0.753628f,
+ -0.753691f, -0.753754f, -0.753817f, -0.753880f, -0.753943f, -0.754006f, -0.754069f, -0.754132f,
+ -0.754195f, -0.754258f, -0.754321f, -0.754384f, -0.754447f, -0.754510f, -0.754573f, -0.754636f,
+ -0.754698f, -0.754761f, -0.754824f, -0.754887f, -0.754950f, -0.755013f, -0.755076f, -0.755139f,
+ -0.755201f, -0.755264f, -0.755327f, -0.755390f, -0.755453f, -0.755516f, -0.755578f, -0.755641f,
+ -0.755704f, -0.755767f, -0.755829f, -0.755892f, -0.755955f, -0.756018f, -0.756081f, -0.756143f,
+ -0.756206f, -0.756269f, -0.756331f, -0.756394f, -0.756457f, -0.756520f, -0.756582f, -0.756645f,
+ -0.756708f, -0.756770f, -0.756833f, -0.756896f, -0.756958f, -0.757021f, -0.757084f, -0.757146f,
+ -0.757209f, -0.757271f, -0.757334f, -0.757397f, -0.757459f, -0.757522f, -0.757584f, -0.757647f,
+ -0.757710f, -0.757772f, -0.757835f, -0.757897f, -0.757960f, -0.758022f, -0.758085f, -0.758147f,
+ -0.758210f, -0.758272f, -0.758335f, -0.758397f, -0.758460f, -0.758522f, -0.758585f, -0.758647f,
+ -0.758710f, -0.758772f, -0.758835f, -0.758897f, -0.758960f, -0.759022f, -0.759084f, -0.759147f,
+ -0.759209f, -0.759272f, -0.759334f, -0.759396f, -0.759459f, -0.759521f, -0.759583f, -0.759646f,
+ -0.759708f, -0.759771f, -0.759833f, -0.759895f, -0.759957f, -0.760020f, -0.760082f, -0.760144f,
+ -0.760207f, -0.760269f, -0.760331f, -0.760394f, -0.760456f, -0.760518f, -0.760580f, -0.760643f,
+ -0.760705f, -0.760767f, -0.760829f, -0.760891f, -0.760954f, -0.761016f, -0.761078f, -0.761140f,
+ -0.761202f, -0.761265f, -0.761327f, -0.761389f, -0.761451f, -0.761513f, -0.761575f, -0.761637f,
+ -0.761700f, -0.761762f, -0.761824f, -0.761886f, -0.761948f, -0.762010f, -0.762072f, -0.762134f,
+ -0.762196f, -0.762258f, -0.762320f, -0.762382f, -0.762444f, -0.762507f, -0.762569f, -0.762631f,
+ -0.762693f, -0.762755f, -0.762817f, -0.762879f, -0.762941f, -0.763003f, -0.763065f, -0.763126f,
+ -0.763188f, -0.763250f, -0.763312f, -0.763374f, -0.763436f, -0.763498f, -0.763560f, -0.763622f,
+ -0.763684f, -0.763746f, -0.763808f, -0.763869f, -0.763931f, -0.763993f, -0.764055f, -0.764117f,
+ -0.764179f, -0.764241f, -0.764302f, -0.764364f, -0.764426f, -0.764488f, -0.764550f, -0.764611f,
+ -0.764673f, -0.764735f, -0.764797f, -0.764859f, -0.764920f, -0.764982f, -0.765044f, -0.765106f,
+ -0.765167f, -0.765229f, -0.765291f, -0.765352f, -0.765414f, -0.765476f, -0.765538f, -0.765599f,
+ -0.765661f, -0.765723f, -0.765784f, -0.765846f, -0.765907f, -0.765969f, -0.766031f, -0.766092f,
+ -0.766154f, -0.766216f, -0.766277f, -0.766339f, -0.766400f, -0.766462f, -0.766524f, -0.766585f,
+ -0.766647f, -0.766708f, -0.766770f, -0.766831f, -0.766893f, -0.766954f, -0.767016f, -0.767077f,
+ -0.767139f, -0.767200f, -0.767262f, -0.767323f, -0.767385f, -0.767446f, -0.767508f, -0.767569f,
+ -0.767631f, -0.767692f, -0.767754f, -0.767815f, -0.767876f, -0.767938f, -0.767999f, -0.768061f,
+ -0.768122f, -0.768183f, -0.768245f, -0.768306f, -0.768368f, -0.768429f, -0.768490f, -0.768552f,
+ -0.768613f, -0.768674f, -0.768736f, -0.768797f, -0.768858f, -0.768919f, -0.768981f, -0.769042f,
+ -0.769103f, -0.769165f, -0.769226f, -0.769287f, -0.769348f, -0.769410f, -0.769471f, -0.769532f,
+ -0.769593f, -0.769655f, -0.769716f, -0.769777f, -0.769838f, -0.769899f, -0.769961f, -0.770022f,
+ -0.770083f, -0.770144f, -0.770205f, -0.770266f, -0.770327f, -0.770389f, -0.770450f, -0.770511f,
+ -0.770572f, -0.770633f, -0.770694f, -0.770755f, -0.770816f, -0.770877f, -0.770938f, -0.770999f,
+ -0.771061f, -0.771122f, -0.771183f, -0.771244f, -0.771305f, -0.771366f, -0.771427f, -0.771488f,
+ -0.771549f, -0.771610f, -0.771671f, -0.771732f, -0.771793f, -0.771854f, -0.771915f, -0.771975f,
+ -0.772036f, -0.772097f, -0.772158f, -0.772219f, -0.772280f, -0.772341f, -0.772402f, -0.772463f,
+ -0.772524f, -0.772584f, -0.772645f, -0.772706f, -0.772767f, -0.772828f, -0.772889f, -0.772950f,
+ -0.773010f, -0.773071f, -0.773132f, -0.773193f, -0.773254f, -0.773314f, -0.773375f, -0.773436f,
+ -0.773497f, -0.773558f, -0.773618f, -0.773679f, -0.773740f, -0.773801f, -0.773861f, -0.773922f,
+ -0.773983f, -0.774043f, -0.774104f, -0.774165f, -0.774225f, -0.774286f, -0.774347f, -0.774407f,
+ -0.774468f, -0.774529f, -0.774589f, -0.774650f, -0.774711f, -0.774771f, -0.774832f, -0.774893f,
+ -0.774953f, -0.775014f, -0.775074f, -0.775135f, -0.775195f, -0.775256f, -0.775317f, -0.775377f,
+ -0.775438f, -0.775498f, -0.775559f, -0.775619f, -0.775680f, -0.775740f, -0.775801f, -0.775861f,
+ -0.775922f, -0.775982f, -0.776043f, -0.776103f, -0.776164f, -0.776224f, -0.776284f, -0.776345f,
+ -0.776405f, -0.776466f, -0.776526f, -0.776587f, -0.776647f, -0.776707f, -0.776768f, -0.776828f,
+ -0.776888f, -0.776949f, -0.777009f, -0.777070f, -0.777130f, -0.777190f, -0.777251f, -0.777311f,
+ -0.777371f, -0.777431f, -0.777492f, -0.777552f, -0.777612f, -0.777673f, -0.777733f, -0.777793f,
+ -0.777853f, -0.777914f, -0.777974f, -0.778034f, -0.778094f, -0.778155f, -0.778215f, -0.778275f,
+ -0.778335f, -0.778395f, -0.778456f, -0.778516f, -0.778576f, -0.778636f, -0.778696f, -0.778756f,
+ -0.778817f, -0.778877f, -0.778937f, -0.778997f, -0.779057f, -0.779117f, -0.779177f, -0.779237f,
+ -0.779297f, -0.779357f, -0.779418f, -0.779478f, -0.779538f, -0.779598f, -0.779658f, -0.779718f,
+ -0.779778f, -0.779838f, -0.779898f, -0.779958f, -0.780018f, -0.780078f, -0.780138f, -0.780198f,
+ -0.780258f, -0.780318f, -0.780378f, -0.780438f, -0.780498f, -0.780557f, -0.780617f, -0.780677f,
+ -0.780737f, -0.780797f, -0.780857f, -0.780917f, -0.780977f, -0.781037f, -0.781097f, -0.781156f,
+ -0.781216f, -0.781276f, -0.781336f, -0.781396f, -0.781456f, -0.781515f, -0.781575f, -0.781635f,
+ -0.781695f, -0.781755f, -0.781814f, -0.781874f, -0.781934f, -0.781994f, -0.782053f, -0.782113f,
+ -0.782173f, -0.782233f, -0.782292f, -0.782352f, -0.782412f, -0.782472f, -0.782531f, -0.782591f,
+ -0.782651f, -0.782710f, -0.782770f, -0.782830f, -0.782889f, -0.782949f, -0.783009f, -0.783068f,
+ -0.783128f, -0.783187f, -0.783247f, -0.783307f, -0.783366f, -0.783426f, -0.783485f, -0.783545f,
+ -0.783605f, -0.783664f, -0.783724f, -0.783783f, -0.783843f, -0.783902f, -0.783962f, -0.784021f,
+ -0.784081f, -0.784140f, -0.784200f, -0.784259f, -0.784319f, -0.784378f, -0.784438f, -0.784497f,
+ -0.784557f, -0.784616f, -0.784675f, -0.784735f, -0.784794f, -0.784854f, -0.784913f, -0.784973f,
+ -0.785032f, -0.785091f, -0.785151f, -0.785210f, -0.785269f, -0.785329f, -0.785388f, -0.785447f,
+ -0.785507f, -0.785566f, -0.785625f, -0.785685f, -0.785744f, -0.785803f, -0.785863f, -0.785922f,
+ -0.785981f, -0.786041f, -0.786100f, -0.786159f, -0.786218f, -0.786278f, -0.786337f, -0.786396f,
+ -0.786455f, -0.786514f, -0.786574f, -0.786633f, -0.786692f, -0.786751f, -0.786810f, -0.786870f,
+ -0.786929f, -0.786988f, -0.787047f, -0.787106f, -0.787165f, -0.787224f, -0.787284f, -0.787343f,
+ -0.787402f, -0.787461f, -0.787520f, -0.787579f, -0.787638f, -0.787697f, -0.787756f, -0.787815f,
+ -0.787874f, -0.787933f, -0.787992f, -0.788051f, -0.788110f, -0.788169f, -0.788228f, -0.788287f,
+ -0.788346f, -0.788405f, -0.788464f, -0.788523f, -0.788582f, -0.788641f, -0.788700f, -0.788759f,
+ -0.788818f, -0.788877f, -0.788936f, -0.788995f, -0.789054f, -0.789113f, -0.789172f, -0.789230f,
+ -0.789289f, -0.789348f, -0.789407f, -0.789466f, -0.789525f, -0.789584f, -0.789642f, -0.789701f,
+ -0.789760f, -0.789819f, -0.789878f, -0.789936f, -0.789995f, -0.790054f, -0.790113f, -0.790171f,
+ -0.790230f, -0.790289f, -0.790348f, -0.790406f, -0.790465f, -0.790524f, -0.790583f, -0.790641f,
+ -0.790700f, -0.790759f, -0.790817f, -0.790876f, -0.790935f, -0.790993f, -0.791052f, -0.791111f,
+ -0.791169f, -0.791228f, -0.791287f, -0.791345f, -0.791404f, -0.791462f, -0.791521f, -0.791580f,
+ -0.791638f, -0.791697f, -0.791755f, -0.791814f, -0.791872f, -0.791931f, -0.791990f, -0.792048f,
+ -0.792107f, -0.792165f, -0.792224f, -0.792282f, -0.792341f, -0.792399f, -0.792458f, -0.792516f,
+ -0.792575f, -0.792633f, -0.792691f, -0.792750f, -0.792808f, -0.792867f, -0.792925f, -0.792984f,
+ -0.793042f, -0.793100f, -0.793159f, -0.793217f, -0.793276f, -0.793334f, -0.793392f, -0.793451f,
+ -0.793509f, -0.793567f, -0.793626f, -0.793684f, -0.793742f, -0.793801f, -0.793859f, -0.793917f,
+ -0.793975f, -0.794034f, -0.794092f, -0.794150f, -0.794209f, -0.794267f, -0.794325f, -0.794383f,
+ -0.794442f, -0.794500f, -0.794558f, -0.794616f, -0.794674f, -0.794733f, -0.794791f, -0.794849f,
+ -0.794907f, -0.794965f, -0.795023f, -0.795082f, -0.795140f, -0.795198f, -0.795256f, -0.795314f,
+ -0.795372f, -0.795430f, -0.795488f, -0.795547f, -0.795605f, -0.795663f, -0.795721f, -0.795779f,
+ -0.795837f, -0.795895f, -0.795953f, -0.796011f, -0.796069f, -0.796127f, -0.796185f, -0.796243f,
+ -0.796301f, -0.796359f, -0.796417f, -0.796475f, -0.796533f, -0.796591f, -0.796649f, -0.796707f,
+ -0.796765f, -0.796823f, -0.796881f, -0.796939f, -0.796996f, -0.797054f, -0.797112f, -0.797170f,
+ -0.797228f, -0.797286f, -0.797344f, -0.797402f, -0.797459f, -0.797517f, -0.797575f, -0.797633f,
+ -0.797691f, -0.797749f, -0.797806f, -0.797864f, -0.797922f, -0.797980f, -0.798038f, -0.798095f,
+ -0.798153f, -0.798211f, -0.798269f, -0.798326f, -0.798384f, -0.798442f, -0.798500f, -0.798557f,
+ -0.798615f, -0.798673f, -0.798730f, -0.798788f, -0.798846f, -0.798903f, -0.798961f, -0.799019f,
+ -0.799076f, -0.799134f, -0.799192f, -0.799249f, -0.799307f, -0.799365f, -0.799422f, -0.799480f,
+ -0.799537f, -0.799595f, -0.799652f, -0.799710f, -0.799768f, -0.799825f, -0.799883f, -0.799940f,
+ -0.799998f, -0.800055f, -0.800113f, -0.800170f, -0.800228f, -0.800285f, -0.800343f, -0.800400f,
+ -0.800458f, -0.800515f, -0.800573f, -0.800630f, -0.800687f, -0.800745f, -0.800802f, -0.800860f,
+ -0.800917f, -0.800975f, -0.801032f, -0.801089f, -0.801147f, -0.801204f, -0.801261f, -0.801319f,
+ -0.801376f, -0.801434f, -0.801491f, -0.801548f, -0.801606f, -0.801663f, -0.801720f, -0.801777f,
+ -0.801835f, -0.801892f, -0.801949f, -0.802007f, -0.802064f, -0.802121f, -0.802178f, -0.802236f,
+ -0.802293f, -0.802350f, -0.802407f, -0.802464f, -0.802522f, -0.802579f, -0.802636f, -0.802693f,
+ -0.802750f, -0.802808f, -0.802865f, -0.802922f, -0.802979f, -0.803036f, -0.803093f, -0.803150f,
+ -0.803208f, -0.803265f, -0.803322f, -0.803379f, -0.803436f, -0.803493f, -0.803550f, -0.803607f,
+ -0.803664f, -0.803721f, -0.803778f, -0.803835f, -0.803892f, -0.803949f, -0.804006f, -0.804063f,
+ -0.804120f, -0.804177f, -0.804234f, -0.804291f, -0.804348f, -0.804405f, -0.804462f, -0.804519f,
+ -0.804576f, -0.804633f, -0.804690f, -0.804747f, -0.804804f, -0.804861f, -0.804918f, -0.804974f,
+ -0.805031f, -0.805088f, -0.805145f, -0.805202f, -0.805259f, -0.805316f, -0.805372f, -0.805429f,
+ -0.805486f, -0.805543f, -0.805600f, -0.805656f, -0.805713f, -0.805770f, -0.805827f, -0.805884f,
+ -0.805940f, -0.805997f, -0.806054f, -0.806111f, -0.806167f, -0.806224f, -0.806281f, -0.806338f,
+ -0.806394f, -0.806451f, -0.806508f, -0.806564f, -0.806621f, -0.806678f, -0.806734f, -0.806791f,
+ -0.806848f, -0.806904f, -0.806961f, -0.807017f, -0.807074f, -0.807131f, -0.807187f, -0.807244f,
+ -0.807300f, -0.807357f, -0.807414f, -0.807470f, -0.807527f, -0.807583f, -0.807640f, -0.807696f,
+ -0.807753f, -0.807809f, -0.807866f, -0.807922f, -0.807979f, -0.808035f, -0.808092f, -0.808148f,
+ -0.808205f, -0.808261f, -0.808318f, -0.808374f, -0.808430f, -0.808487f, -0.808543f, -0.808600f,
+ -0.808656f, -0.808713f, -0.808769f, -0.808825f, -0.808882f, -0.808938f, -0.808994f, -0.809051f,
+ -0.809107f, -0.809164f, -0.809220f, -0.809276f, -0.809332f, -0.809389f, -0.809445f, -0.809501f,
+ -0.809558f, -0.809614f, -0.809670f, -0.809726f, -0.809783f, -0.809839f, -0.809895f, -0.809951f,
+ -0.810008f, -0.810064f, -0.810120f, -0.810176f, -0.810232f, -0.810289f, -0.810345f, -0.810401f,
+ -0.810457f, -0.810513f, -0.810570f, -0.810626f, -0.810682f, -0.810738f, -0.810794f, -0.810850f,
+ -0.810906f, -0.810962f, -0.811018f, -0.811075f, -0.811131f, -0.811187f, -0.811243f, -0.811299f,
+ -0.811355f, -0.811411f, -0.811467f, -0.811523f, -0.811579f, -0.811635f, -0.811691f, -0.811747f,
+ -0.811803f, -0.811859f, -0.811915f, -0.811971f, -0.812027f, -0.812083f, -0.812139f, -0.812195f,
+ -0.812251f, -0.812307f, -0.812362f, -0.812418f, -0.812474f, -0.812530f, -0.812586f, -0.812642f,
+ -0.812698f, -0.812754f, -0.812809f, -0.812865f, -0.812921f, -0.812977f, -0.813033f, -0.813089f,
+ -0.813144f, -0.813200f, -0.813256f, -0.813312f, -0.813368f, -0.813423f, -0.813479f, -0.813535f,
+ -0.813591f, -0.813646f, -0.813702f, -0.813758f, -0.813814f, -0.813869f, -0.813925f, -0.813981f,
+ -0.814036f, -0.814092f, -0.814148f, -0.814203f, -0.814259f, -0.814315f, -0.814370f, -0.814426f,
+ -0.814482f, -0.814537f, -0.814593f, -0.814648f, -0.814704f, -0.814760f, -0.814815f, -0.814871f,
+ -0.814926f, -0.814982f, -0.815037f, -0.815093f, -0.815149f, -0.815204f, -0.815260f, -0.815315f,
+ -0.815371f, -0.815426f, -0.815482f, -0.815537f, -0.815593f, -0.815648f, -0.815704f, -0.815759f,
+ -0.815814f, -0.815870f, -0.815925f, -0.815981f, -0.816036f, -0.816092f, -0.816147f, -0.816202f,
+ -0.816258f, -0.816313f, -0.816368f, -0.816424f, -0.816479f, -0.816535f, -0.816590f, -0.816645f,
+ -0.816701f, -0.816756f, -0.816811f, -0.816867f, -0.816922f, -0.816977f, -0.817032f, -0.817088f,
+ -0.817143f, -0.817198f, -0.817253f, -0.817309f, -0.817364f, -0.817419f, -0.817474f, -0.817530f,
+ -0.817585f, -0.817640f, -0.817695f, -0.817750f, -0.817806f, -0.817861f, -0.817916f, -0.817971f,
+ -0.818026f, -0.818081f, -0.818137f, -0.818192f, -0.818247f, -0.818302f, -0.818357f, -0.818412f,
+ -0.818467f, -0.818522f, -0.818577f, -0.818632f, -0.818687f, -0.818742f, -0.818798f, -0.818853f,
+ -0.818908f, -0.818963f, -0.819018f, -0.819073f, -0.819128f, -0.819183f, -0.819238f, -0.819293f,
+ -0.819348f, -0.819402f, -0.819457f, -0.819512f, -0.819567f, -0.819622f, -0.819677f, -0.819732f,
+ -0.819787f, -0.819842f, -0.819897f, -0.819952f, -0.820007f, -0.820061f, -0.820116f, -0.820171f,
+ -0.820226f, -0.820281f, -0.820336f, -0.820390f, -0.820445f, -0.820500f, -0.820555f, -0.820610f,
+ -0.820664f, -0.820719f, -0.820774f, -0.820829f, -0.820884f, -0.820938f, -0.820993f, -0.821048f,
+ -0.821102f, -0.821157f, -0.821212f, -0.821267f, -0.821321f, -0.821376f, -0.821431f, -0.821485f,
+ -0.821540f, -0.821595f, -0.821649f, -0.821704f, -0.821759f, -0.821813f, -0.821868f, -0.821922f,
+ -0.821977f, -0.822032f, -0.822086f, -0.822141f, -0.822195f, -0.822250f, -0.822305f, -0.822359f,
+ -0.822414f, -0.822468f, -0.822523f, -0.822577f, -0.822632f, -0.822686f, -0.822741f, -0.822795f,
+ -0.822850f, -0.822904f, -0.822959f, -0.823013f, -0.823068f, -0.823122f, -0.823177f, -0.823231f,
+ -0.823285f, -0.823340f, -0.823394f, -0.823449f, -0.823503f, -0.823557f, -0.823612f, -0.823666f,
+ -0.823721f, -0.823775f, -0.823829f, -0.823884f, -0.823938f, -0.823992f, -0.824047f, -0.824101f,
+ -0.824155f, -0.824209f, -0.824264f, -0.824318f, -0.824372f, -0.824427f, -0.824481f, -0.824535f,
+ -0.824589f, -0.824644f, -0.824698f, -0.824752f, -0.824806f, -0.824860f, -0.824915f, -0.824969f,
+ -0.825023f, -0.825077f, -0.825131f, -0.825185f, -0.825240f, -0.825294f, -0.825348f, -0.825402f,
+ -0.825456f, -0.825510f, -0.825564f, -0.825618f, -0.825673f, -0.825727f, -0.825781f, -0.825835f,
+ -0.825889f, -0.825943f, -0.825997f, -0.826051f, -0.826105f, -0.826159f, -0.826213f, -0.826267f,
+ -0.826321f, -0.826375f, -0.826429f, -0.826483f, -0.826537f, -0.826591f, -0.826645f, -0.826699f,
+ -0.826753f, -0.826807f, -0.826861f, -0.826915f, -0.826968f, -0.827022f, -0.827076f, -0.827130f,
+ -0.827184f, -0.827238f, -0.827292f, -0.827346f, -0.827399f, -0.827453f, -0.827507f, -0.827561f,
+ -0.827615f, -0.827669f, -0.827722f, -0.827776f, -0.827830f, -0.827884f, -0.827938f, -0.827991f,
+ -0.828045f, -0.828099f, -0.828153f, -0.828206f, -0.828260f, -0.828314f, -0.828367f, -0.828421f,
+ -0.828475f, -0.828529f, -0.828582f, -0.828636f, -0.828690f, -0.828743f, -0.828797f, -0.828851f,
+ -0.828904f, -0.828958f, -0.829011f, -0.829065f, -0.829119f, -0.829172f, -0.829226f, -0.829279f,
+ -0.829333f, -0.829386f, -0.829440f, -0.829494f, -0.829547f, -0.829601f, -0.829654f, -0.829708f,
+ -0.829761f, -0.829815f, -0.829868f, -0.829922f, -0.829975f, -0.830029f, -0.830082f, -0.830136f,
+ -0.830189f, -0.830243f, -0.830296f, -0.830349f, -0.830403f, -0.830456f, -0.830510f, -0.830563f,
+ -0.830616f, -0.830670f, -0.830723f, -0.830777f, -0.830830f, -0.830883f, -0.830937f, -0.830990f,
+ -0.831043f, -0.831097f, -0.831150f, -0.831203f, -0.831257f, -0.831310f, -0.831363f, -0.831416f,
+ -0.831470f, -0.831523f, -0.831576f, -0.831629f, -0.831683f, -0.831736f, -0.831789f, -0.831842f,
+ -0.831895f, -0.831949f, -0.832002f, -0.832055f, -0.832108f, -0.832161f, -0.832215f, -0.832268f,
+ -0.832321f, -0.832374f, -0.832427f, -0.832480f, -0.832533f, -0.832586f, -0.832640f, -0.832693f,
+ -0.832746f, -0.832799f, -0.832852f, -0.832905f, -0.832958f, -0.833011f, -0.833064f, -0.833117f,
+ -0.833170f, -0.833223f, -0.833276f, -0.833329f, -0.833382f, -0.833435f, -0.833488f, -0.833541f,
+ -0.833594f, -0.833647f, -0.833700f, -0.833753f, -0.833806f, -0.833859f, -0.833912f, -0.833965f,
+ -0.834018f, -0.834070f, -0.834123f, -0.834176f, -0.834229f, -0.834282f, -0.834335f, -0.834388f,
+ -0.834440f, -0.834493f, -0.834546f, -0.834599f, -0.834652f, -0.834705f, -0.834757f, -0.834810f,
+ -0.834863f, -0.834916f, -0.834968f, -0.835021f, -0.835074f, -0.835127f, -0.835179f, -0.835232f,
+ -0.835285f, -0.835338f, -0.835390f, -0.835443f, -0.835496f, -0.835548f, -0.835601f, -0.835654f,
+ -0.835706f, -0.835759f, -0.835812f, -0.835864f, -0.835917f, -0.835969f, -0.836022f, -0.836075f,
+ -0.836127f, -0.836180f, -0.836232f, -0.836285f, -0.836338f, -0.836390f, -0.836443f, -0.836495f,
+ -0.836548f, -0.836600f, -0.836653f, -0.836705f, -0.836758f, -0.836810f, -0.836863f, -0.836915f,
+ -0.836968f, -0.837020f, -0.837073f, -0.837125f, -0.837178f, -0.837230f, -0.837282f, -0.837335f,
+ -0.837387f, -0.837440f, -0.837492f, -0.837544f, -0.837597f, -0.837649f, -0.837701f, -0.837754f,
+ -0.837806f, -0.837859f, -0.837911f, -0.837963f, -0.838015f, -0.838068f, -0.838120f, -0.838172f,
+ -0.838225f, -0.838277f, -0.838329f, -0.838382f, -0.838434f, -0.838486f, -0.838538f, -0.838591f,
+ -0.838643f, -0.838695f, -0.838747f, -0.838799f, -0.838852f, -0.838904f, -0.838956f, -0.839008f,
+ -0.839060f, -0.839112f, -0.839165f, -0.839217f, -0.839269f, -0.839321f, -0.839373f, -0.839425f,
+ -0.839477f, -0.839529f, -0.839581f, -0.839634f, -0.839686f, -0.839738f, -0.839790f, -0.839842f,
+ -0.839894f, -0.839946f, -0.839998f, -0.840050f, -0.840102f, -0.840154f, -0.840206f, -0.840258f,
+ -0.840310f, -0.840362f, -0.840414f, -0.840466f, -0.840518f, -0.840570f, -0.840622f, -0.840673f,
+ -0.840725f, -0.840777f, -0.840829f, -0.840881f, -0.840933f, -0.840985f, -0.841037f, -0.841089f,
+ -0.841140f, -0.841192f, -0.841244f, -0.841296f, -0.841348f, -0.841400f, -0.841451f, -0.841503f,
+ -0.841555f, -0.841607f, -0.841659f, -0.841710f, -0.841762f, -0.841814f, -0.841866f, -0.841917f,
+ -0.841969f, -0.842021f, -0.842072f, -0.842124f, -0.842176f, -0.842228f, -0.842279f, -0.842331f,
+ -0.842383f, -0.842434f, -0.842486f, -0.842538f, -0.842589f, -0.842641f, -0.842692f, -0.842744f,
+ -0.842796f, -0.842847f, -0.842899f, -0.842950f, -0.843002f, -0.843054f, -0.843105f, -0.843157f,
+ -0.843208f, -0.843260f, -0.843311f, -0.843363f, -0.843414f, -0.843466f, -0.843517f, -0.843569f,
+ -0.843620f, -0.843672f, -0.843723f, -0.843775f, -0.843826f, -0.843878f, -0.843929f, -0.843980f,
+ -0.844032f, -0.844083f, -0.844135f, -0.844186f, -0.844238f, -0.844289f, -0.844340f, -0.844392f,
+ -0.844443f, -0.844494f, -0.844546f, -0.844597f, -0.844648f, -0.844700f, -0.844751f, -0.844802f,
+ -0.844854f, -0.844905f, -0.844956f, -0.845007f, -0.845059f, -0.845110f, -0.845161f, -0.845212f,
+ -0.845264f, -0.845315f, -0.845366f, -0.845417f, -0.845469f, -0.845520f, -0.845571f, -0.845622f,
+ -0.845673f, -0.845724f, -0.845776f, -0.845827f, -0.845878f, -0.845929f, -0.845980f, -0.846031f,
+ -0.846082f, -0.846133f, -0.846185f, -0.846236f, -0.846287f, -0.846338f, -0.846389f, -0.846440f,
+ -0.846491f, -0.846542f, -0.846593f, -0.846644f, -0.846695f, -0.846746f, -0.846797f, -0.846848f,
+ -0.846899f, -0.846950f, -0.847001f, -0.847052f, -0.847103f, -0.847154f, -0.847205f, -0.847256f,
+ -0.847307f, -0.847358f, -0.847408f, -0.847459f, -0.847510f, -0.847561f, -0.847612f, -0.847663f,
+ -0.847714f, -0.847765f, -0.847815f, -0.847866f, -0.847917f, -0.847968f, -0.848019f, -0.848070f,
+ -0.848120f, -0.848171f, -0.848222f, -0.848273f, -0.848323f, -0.848374f, -0.848425f, -0.848476f,
+ -0.848526f, -0.848577f, -0.848628f, -0.848679f, -0.848729f, -0.848780f, -0.848831f, -0.848881f,
+ -0.848932f, -0.848983f, -0.849033f, -0.849084f, -0.849135f, -0.849185f, -0.849236f, -0.849287f,
+ -0.849337f, -0.849388f, -0.849438f, -0.849489f, -0.849540f, -0.849590f, -0.849641f, -0.849691f,
+ -0.849742f, -0.849792f, -0.849843f, -0.849893f, -0.849944f, -0.849994f, -0.850045f, -0.850095f,
+ -0.850146f, -0.850196f, -0.850247f, -0.850297f, -0.850348f, -0.850398f, -0.850449f, -0.850499f,
+ -0.850549f, -0.850600f, -0.850650f, -0.850701f, -0.850751f, -0.850801f, -0.850852f, -0.850902f,
+ -0.850953f, -0.851003f, -0.851053f, -0.851104f, -0.851154f, -0.851204f, -0.851255f, -0.851305f,
+ -0.851355f, -0.851406f, -0.851456f, -0.851506f, -0.851556f, -0.851607f, -0.851657f, -0.851707f,
+ -0.851757f, -0.851808f, -0.851858f, -0.851908f, -0.851958f, -0.852008f, -0.852059f, -0.852109f,
+ -0.852159f, -0.852209f, -0.852259f, -0.852309f, -0.852360f, -0.852410f, -0.852460f, -0.852510f,
+ -0.852560f, -0.852610f, -0.852660f, -0.852710f, -0.852760f, -0.852810f, -0.852861f, -0.852911f,
+ -0.852961f, -0.853011f, -0.853061f, -0.853111f, -0.853161f, -0.853211f, -0.853261f, -0.853311f,
+ -0.853361f, -0.853411f, -0.853461f, -0.853511f, -0.853561f, -0.853611f, -0.853660f, -0.853710f,
+ -0.853760f, -0.853810f, -0.853860f, -0.853910f, -0.853960f, -0.854010f, -0.854060f, -0.854110f,
+ -0.854159f, -0.854209f, -0.854259f, -0.854309f, -0.854359f, -0.854409f, -0.854458f, -0.854508f,
+ -0.854558f, -0.854608f, -0.854658f, -0.854707f, -0.854757f, -0.854807f, -0.854857f, -0.854906f,
+ -0.854956f, -0.855006f, -0.855056f, -0.855105f, -0.855155f, -0.855205f, -0.855254f, -0.855304f,
+ -0.855354f, -0.855403f, -0.855453f, -0.855503f, -0.855552f, -0.855602f, -0.855651f, -0.855701f,
+ -0.855751f, -0.855800f, -0.855850f, -0.855900f, -0.855949f, -0.855999f, -0.856048f, -0.856098f,
+ -0.856147f, -0.856197f, -0.856246f, -0.856296f, -0.856345f, -0.856395f, -0.856444f, -0.856494f,
+ -0.856543f, -0.856593f, -0.856642f, -0.856692f, -0.856741f, -0.856791f, -0.856840f, -0.856890f,
+ -0.856939f, -0.856988f, -0.857038f, -0.857087f, -0.857137f, -0.857186f, -0.857235f, -0.857285f,
+ -0.857334f, -0.857383f, -0.857433f, -0.857482f, -0.857531f, -0.857581f, -0.857630f, -0.857679f,
+ -0.857729f, -0.857778f, -0.857827f, -0.857876f, -0.857926f, -0.857975f, -0.858024f, -0.858073f,
+ -0.858123f, -0.858172f, -0.858221f, -0.858270f, -0.858320f, -0.858369f, -0.858418f, -0.858467f,
+ -0.858516f, -0.858565f, -0.858615f, -0.858664f, -0.858713f, -0.858762f, -0.858811f, -0.858860f,
+ -0.858909f, -0.858958f, -0.859007f, -0.859057f, -0.859106f, -0.859155f, -0.859204f, -0.859253f,
+ -0.859302f, -0.859351f, -0.859400f, -0.859449f, -0.859498f, -0.859547f, -0.859596f, -0.859645f,
+ -0.859694f, -0.859743f, -0.859792f, -0.859841f, -0.859890f, -0.859939f, -0.859988f, -0.860036f,
+ -0.860085f, -0.860134f, -0.860183f, -0.860232f, -0.860281f, -0.860330f, -0.860379f, -0.860428f,
+ -0.860476f, -0.860525f, -0.860574f, -0.860623f, -0.860672f, -0.860721f, -0.860769f, -0.860818f,
+ -0.860867f, -0.860916f, -0.860964f, -0.861013f, -0.861062f, -0.861111f, -0.861160f, -0.861208f,
+ -0.861257f, -0.861306f, -0.861354f, -0.861403f, -0.861452f, -0.861500f, -0.861549f, -0.861598f,
+ -0.861646f, -0.861695f, -0.861744f, -0.861792f, -0.861841f, -0.861890f, -0.861938f, -0.861987f,
+ -0.862035f, -0.862084f, -0.862133f, -0.862181f, -0.862230f, -0.862278f, -0.862327f, -0.862375f,
+ -0.862424f, -0.862472f, -0.862521f, -0.862570f, -0.862618f, -0.862666f, -0.862715f, -0.862763f,
+ -0.862812f, -0.862860f, -0.862909f, -0.862957f, -0.863006f, -0.863054f, -0.863103f, -0.863151f,
+ -0.863199f, -0.863248f, -0.863296f, -0.863345f, -0.863393f, -0.863441f, -0.863490f, -0.863538f,
+ -0.863586f, -0.863635f, -0.863683f, -0.863731f, -0.863780f, -0.863828f, -0.863876f, -0.863925f,
+ -0.863973f, -0.864021f, -0.864069f, -0.864118f, -0.864166f, -0.864214f, -0.864262f, -0.864311f,
+ -0.864359f, -0.864407f, -0.864455f, -0.864503f, -0.864552f, -0.864600f, -0.864648f, -0.864696f,
+ -0.864744f, -0.864792f, -0.864841f, -0.864889f, -0.864937f, -0.864985f, -0.865033f, -0.865081f,
+ -0.865129f, -0.865177f, -0.865225f, -0.865273f, -0.865321f, -0.865369f, -0.865418f, -0.865466f,
+ -0.865514f, -0.865562f, -0.865610f, -0.865658f, -0.865706f, -0.865754f, -0.865802f, -0.865850f,
+ -0.865898f, -0.865946f, -0.865993f, -0.866041f, -0.866089f, -0.866137f, -0.866185f, -0.866233f,
+ -0.866281f, -0.866329f, -0.866377f, -0.866425f, -0.866472f, -0.866520f, -0.866568f, -0.866616f,
+ -0.866664f, -0.866712f, -0.866759f, -0.866807f, -0.866855f, -0.866903f, -0.866951f, -0.866998f,
+ -0.867046f, -0.867094f, -0.867142f, -0.867190f, -0.867237f, -0.867285f, -0.867333f, -0.867380f,
+ -0.867428f, -0.867476f, -0.867523f, -0.867571f, -0.867619f, -0.867667f, -0.867714f, -0.867762f,
+ -0.867809f, -0.867857f, -0.867905f, -0.867952f, -0.868000f, -0.868048f, -0.868095f, -0.868143f,
+ -0.868190f, -0.868238f, -0.868285f, -0.868333f, -0.868381f, -0.868428f, -0.868476f, -0.868523f,
+ -0.868571f, -0.868618f, -0.868666f, -0.868713f, -0.868761f, -0.868808f, -0.868856f, -0.868903f,
+ -0.868951f, -0.868998f, -0.869045f, -0.869093f, -0.869140f, -0.869188f, -0.869235f, -0.869282f,
+ -0.869330f, -0.869377f, -0.869425f, -0.869472f, -0.869519f, -0.869567f, -0.869614f, -0.869661f,
+ -0.869709f, -0.869756f, -0.869803f, -0.869851f, -0.869898f, -0.869945f, -0.869992f, -0.870040f,
+ -0.870087f, -0.870134f, -0.870182f, -0.870229f, -0.870276f, -0.870323f, -0.870370f, -0.870418f,
+ -0.870465f, -0.870512f, -0.870559f, -0.870606f, -0.870654f, -0.870701f, -0.870748f, -0.870795f,
+ -0.870842f, -0.870889f, -0.870936f, -0.870983f, -0.871031f, -0.871078f, -0.871125f, -0.871172f,
+ -0.871219f, -0.871266f, -0.871313f, -0.871360f, -0.871407f, -0.871454f, -0.871501f, -0.871548f,
+ -0.871595f, -0.871642f, -0.871689f, -0.871736f, -0.871783f, -0.871830f, -0.871877f, -0.871924f,
+ -0.871971f, -0.872018f, -0.872065f, -0.872112f, -0.872159f, -0.872205f, -0.872252f, -0.872299f,
+ -0.872346f, -0.872393f, -0.872440f, -0.872487f, -0.872534f, -0.872580f, -0.872627f, -0.872674f,
+ -0.872721f, -0.872768f, -0.872814f, -0.872861f, -0.872908f, -0.872955f, -0.873001f, -0.873048f,
+ -0.873095f, -0.873142f, -0.873188f, -0.873235f, -0.873282f, -0.873329f, -0.873375f, -0.873422f,
+ -0.873469f, -0.873515f, -0.873562f, -0.873609f, -0.873655f, -0.873702f, -0.873749f, -0.873795f,
+ -0.873842f, -0.873888f, -0.873935f, -0.873982f, -0.874028f, -0.874075f, -0.874121f, -0.874168f,
+ -0.874215f, -0.874261f, -0.874308f, -0.874354f, -0.874401f, -0.874447f, -0.874494f, -0.874540f,
+ -0.874587f, -0.874633f, -0.874680f, -0.874726f, -0.874773f, -0.874819f, -0.874865f, -0.874912f,
+ -0.874958f, -0.875005f, -0.875051f, -0.875098f, -0.875144f, -0.875190f, -0.875237f, -0.875283f,
+ -0.875329f, -0.875376f, -0.875422f, -0.875468f, -0.875515f, -0.875561f, -0.875607f, -0.875654f,
+ -0.875700f, -0.875746f, -0.875793f, -0.875839f, -0.875885f, -0.875931f, -0.875978f, -0.876024f,
+ -0.876070f, -0.876116f, -0.876163f, -0.876209f, -0.876255f, -0.876301f, -0.876347f, -0.876393f,
+ -0.876440f, -0.876486f, -0.876532f, -0.876578f, -0.876624f, -0.876670f, -0.876716f, -0.876763f,
+ -0.876809f, -0.876855f, -0.876901f, -0.876947f, -0.876993f, -0.877039f, -0.877085f, -0.877131f,
+ -0.877177f, -0.877223f, -0.877269f, -0.877315f, -0.877361f, -0.877407f, -0.877453f, -0.877499f,
+ -0.877545f, -0.877591f, -0.877637f, -0.877683f, -0.877729f, -0.877775f, -0.877821f, -0.877867f,
+ -0.877913f, -0.877959f, -0.878005f, -0.878051f, -0.878096f, -0.878142f, -0.878188f, -0.878234f,
+ -0.878280f, -0.878326f, -0.878371f, -0.878417f, -0.878463f, -0.878509f, -0.878555f, -0.878600f,
+ -0.878646f, -0.878692f, -0.878738f, -0.878784f, -0.878829f, -0.878875f, -0.878921f, -0.878967f,
+ -0.879012f, -0.879058f, -0.879104f, -0.879149f, -0.879195f, -0.879241f, -0.879286f, -0.879332f,
+ -0.879378f, -0.879423f, -0.879469f, -0.879515f, -0.879560f, -0.879606f, -0.879651f, -0.879697f,
+ -0.879743f, -0.879788f, -0.879834f, -0.879879f, -0.879925f, -0.879970f, -0.880016f, -0.880061f,
+ -0.880107f, -0.880153f, -0.880198f, -0.880244f, -0.880289f, -0.880334f, -0.880380f, -0.880425f,
+ -0.880471f, -0.880516f, -0.880562f, -0.880607f, -0.880653f, -0.880698f, -0.880743f, -0.880789f,
+ -0.880834f, -0.880880f, -0.880925f, -0.880970f, -0.881016f, -0.881061f, -0.881106f, -0.881152f,
+ -0.881197f, -0.881242f, -0.881288f, -0.881333f, -0.881378f, -0.881424f, -0.881469f, -0.881514f,
+ -0.881559f, -0.881605f, -0.881650f, -0.881695f, -0.881740f, -0.881786f, -0.881831f, -0.881876f,
+ -0.881921f, -0.881966f, -0.882012f, -0.882057f, -0.882102f, -0.882147f, -0.882192f, -0.882237f,
+ -0.882283f, -0.882328f, -0.882373f, -0.882418f, -0.882463f, -0.882508f, -0.882553f, -0.882598f,
+ -0.882643f, -0.882688f, -0.882733f, -0.882779f, -0.882824f, -0.882869f, -0.882914f, -0.882959f,
+ -0.883004f, -0.883049f, -0.883094f, -0.883139f, -0.883184f, -0.883228f, -0.883273f, -0.883318f,
+ -0.883363f, -0.883408f, -0.883453f, -0.883498f, -0.883543f, -0.883588f, -0.883633f, -0.883678f,
+ -0.883723f, -0.883767f, -0.883812f, -0.883857f, -0.883902f, -0.883947f, -0.883992f, -0.884036f,
+ -0.884081f, -0.884126f, -0.884171f, -0.884216f, -0.884260f, -0.884305f, -0.884350f, -0.884395f,
+ -0.884439f, -0.884484f, -0.884529f, -0.884574f, -0.884618f, -0.884663f, -0.884708f, -0.884752f,
+ -0.884797f, -0.884842f, -0.884886f, -0.884931f, -0.884976f, -0.885020f, -0.885065f, -0.885110f,
+ -0.885154f, -0.885199f, -0.885243f, -0.885288f, -0.885333f, -0.885377f, -0.885422f, -0.885466f,
+ -0.885511f, -0.885555f, -0.885600f, -0.885644f, -0.885689f, -0.885733f, -0.885778f, -0.885822f,
+ -0.885867f, -0.885911f, -0.885956f, -0.886000f, -0.886045f, -0.886089f, -0.886134f, -0.886178f,
+ -0.886223f, -0.886267f, -0.886311f, -0.886356f, -0.886400f, -0.886445f, -0.886489f, -0.886533f,
+ -0.886578f, -0.886622f, -0.886666f, -0.886711f, -0.886755f, -0.886799f, -0.886844f, -0.886888f,
+ -0.886932f, -0.886976f, -0.887021f, -0.887065f, -0.887109f, -0.887153f, -0.887198f, -0.887242f,
+ -0.887286f, -0.887330f, -0.887375f, -0.887419f, -0.887463f, -0.887507f, -0.887551f, -0.887595f,
+ -0.887640f, -0.887684f, -0.887728f, -0.887772f, -0.887816f, -0.887860f, -0.887904f, -0.887949f,
+ -0.887993f, -0.888037f, -0.888081f, -0.888125f, -0.888169f, -0.888213f, -0.888257f, -0.888301f,
+ -0.888345f, -0.888389f, -0.888433f, -0.888477f, -0.888521f, -0.888565f, -0.888609f, -0.888653f,
+ -0.888697f, -0.888741f, -0.888785f, -0.888829f, -0.888873f, -0.888917f, -0.888961f, -0.889004f,
+ -0.889048f, -0.889092f, -0.889136f, -0.889180f, -0.889224f, -0.889268f, -0.889312f, -0.889355f,
+ -0.889399f, -0.889443f, -0.889487f, -0.889531f, -0.889574f, -0.889618f, -0.889662f, -0.889706f,
+ -0.889750f, -0.889793f, -0.889837f, -0.889881f, -0.889925f, -0.889968f, -0.890012f, -0.890056f,
+ -0.890099f, -0.890143f, -0.890187f, -0.890230f, -0.890274f, -0.890318f, -0.890361f, -0.890405f,
+ -0.890449f, -0.890492f, -0.890536f, -0.890580f, -0.890623f, -0.890667f, -0.890710f, -0.890754f,
+ -0.890797f, -0.890841f, -0.890885f, -0.890928f, -0.890972f, -0.891015f, -0.891059f, -0.891102f,
+ -0.891146f, -0.891189f, -0.891233f, -0.891276f, -0.891320f, -0.891363f, -0.891407f, -0.891450f,
+ -0.891493f, -0.891537f, -0.891580f, -0.891624f, -0.891667f, -0.891711f, -0.891754f, -0.891797f,
+ -0.891841f, -0.891884f, -0.891927f, -0.891971f, -0.892014f, -0.892057f, -0.892101f, -0.892144f,
+ -0.892187f, -0.892231f, -0.892274f, -0.892317f, -0.892361f, -0.892404f, -0.892447f, -0.892490f,
+ -0.892534f, -0.892577f, -0.892620f, -0.892663f, -0.892706f, -0.892750f, -0.892793f, -0.892836f,
+ -0.892879f, -0.892922f, -0.892965f, -0.893009f, -0.893052f, -0.893095f, -0.893138f, -0.893181f,
+ -0.893224f, -0.893267f, -0.893310f, -0.893354f, -0.893397f, -0.893440f, -0.893483f, -0.893526f,
+ -0.893569f, -0.893612f, -0.893655f, -0.893698f, -0.893741f, -0.893784f, -0.893827f, -0.893870f,
+ -0.893913f, -0.893956f, -0.893999f, -0.894042f, -0.894085f, -0.894128f, -0.894171f, -0.894214f,
+ -0.894256f, -0.894299f, -0.894342f, -0.894385f, -0.894428f, -0.894471f, -0.894514f, -0.894557f,
+ -0.894599f, -0.894642f, -0.894685f, -0.894728f, -0.894771f, -0.894814f, -0.894856f, -0.894899f,
+ -0.894942f, -0.894985f, -0.895028f, -0.895070f, -0.895113f, -0.895156f, -0.895198f, -0.895241f,
+ -0.895284f, -0.895327f, -0.895369f, -0.895412f, -0.895455f, -0.895497f, -0.895540f, -0.895583f,
+ -0.895625f, -0.895668f, -0.895711f, -0.895753f, -0.895796f, -0.895838f, -0.895881f, -0.895924f,
+ -0.895966f, -0.896009f, -0.896051f, -0.896094f, -0.896137f, -0.896179f, -0.896222f, -0.896264f,
+ -0.896307f, -0.896349f, -0.896392f, -0.896434f, -0.896477f, -0.896519f, -0.896562f, -0.896604f,
+ -0.896646f, -0.896689f, -0.896731f, -0.896774f, -0.896816f, -0.896859f, -0.896901f, -0.896943f,
+ -0.896986f, -0.897028f, -0.897071f, -0.897113f, -0.897155f, -0.897198f, -0.897240f, -0.897282f,
+ -0.897325f, -0.897367f, -0.897409f, -0.897452f, -0.897494f, -0.897536f, -0.897578f, -0.897621f,
+ -0.897663f, -0.897705f, -0.897747f, -0.897790f, -0.897832f, -0.897874f, -0.897916f, -0.897958f,
+ -0.898001f, -0.898043f, -0.898085f, -0.898127f, -0.898169f, -0.898211f, -0.898254f, -0.898296f,
+ -0.898338f, -0.898380f, -0.898422f, -0.898464f, -0.898506f, -0.898548f, -0.898590f, -0.898632f,
+ -0.898674f, -0.898717f, -0.898759f, -0.898801f, -0.898843f, -0.898885f, -0.898927f, -0.898969f,
+ -0.899011f, -0.899053f, -0.899095f, -0.899137f, -0.899179f, -0.899220f, -0.899262f, -0.899304f,
+ -0.899346f, -0.899388f, -0.899430f, -0.899472f, -0.899514f, -0.899556f, -0.899598f, -0.899639f,
+ -0.899681f, -0.899723f, -0.899765f, -0.899807f, -0.899849f, -0.899890f, -0.899932f, -0.899974f,
+ -0.900016f, -0.900058f, -0.900099f, -0.900141f, -0.900183f, -0.900225f, -0.900266f, -0.900308f,
+ -0.900350f, -0.900392f, -0.900433f, -0.900475f, -0.900517f, -0.900558f, -0.900600f, -0.900642f,
+ -0.900683f, -0.900725f, -0.900767f, -0.900808f, -0.900850f, -0.900892f, -0.900933f, -0.900975f,
+ -0.901016f, -0.901058f, -0.901100f, -0.901141f, -0.901183f, -0.901224f, -0.901266f, -0.901307f,
+ -0.901349f, -0.901390f, -0.901432f, -0.901473f, -0.901515f, -0.901556f, -0.901598f, -0.901639f,
+ -0.901681f, -0.901722f, -0.901764f, -0.901805f, -0.901847f, -0.901888f, -0.901929f, -0.901971f,
+ -0.902012f, -0.902054f, -0.902095f, -0.902136f, -0.902178f, -0.902219f, -0.902260f, -0.902302f,
+ -0.902343f, -0.902384f, -0.902426f, -0.902467f, -0.902508f, -0.902550f, -0.902591f, -0.902632f,
+ -0.902673f, -0.902715f, -0.902756f, -0.902797f, -0.902838f, -0.902879f, -0.902921f, -0.902962f,
+ -0.903003f, -0.903044f, -0.903085f, -0.903127f, -0.903168f, -0.903209f, -0.903250f, -0.903291f,
+ -0.903332f, -0.903373f, -0.903415f, -0.903456f, -0.903497f, -0.903538f, -0.903579f, -0.903620f,
+ -0.903661f, -0.903702f, -0.903743f, -0.903784f, -0.903825f, -0.903866f, -0.903907f, -0.903948f,
+ -0.903989f, -0.904030f, -0.904071f, -0.904112f, -0.904153f, -0.904194f, -0.904235f, -0.904276f,
+ -0.904317f, -0.904358f, -0.904399f, -0.904440f, -0.904481f, -0.904521f, -0.904562f, -0.904603f,
+ -0.904644f, -0.904685f, -0.904726f, -0.904767f, -0.904807f, -0.904848f, -0.904889f, -0.904930f,
+ -0.904971f, -0.905011f, -0.905052f, -0.905093f, -0.905134f, -0.905175f, -0.905215f, -0.905256f,
+ -0.905297f, -0.905337f, -0.905378f, -0.905419f, -0.905460f, -0.905500f, -0.905541f, -0.905582f,
+ -0.905622f, -0.905663f, -0.905704f, -0.905744f, -0.905785f, -0.905825f, -0.905866f, -0.905907f,
+ -0.905947f, -0.905988f, -0.906028f, -0.906069f, -0.906110f, -0.906150f, -0.906191f, -0.906231f,
+ -0.906272f, -0.906312f, -0.906353f, -0.906393f, -0.906434f, -0.906474f, -0.906515f, -0.906555f,
+ -0.906596f, -0.906636f, -0.906677f, -0.906717f, -0.906757f, -0.906798f, -0.906838f, -0.906879f,
+ -0.906919f, -0.906959f, -0.907000f, -0.907040f, -0.907081f, -0.907121f, -0.907161f, -0.907202f,
+ -0.907242f, -0.907282f, -0.907323f, -0.907363f, -0.907403f, -0.907444f, -0.907484f, -0.907524f,
+ -0.907564f, -0.907605f, -0.907645f, -0.907685f, -0.907725f, -0.907766f, -0.907806f, -0.907846f,
+ -0.907886f, -0.907926f, -0.907966f, -0.908007f, -0.908047f, -0.908087f, -0.908127f, -0.908167f,
+ -0.908207f, -0.908248f, -0.908288f, -0.908328f, -0.908368f, -0.908408f, -0.908448f, -0.908488f,
+ -0.908528f, -0.908568f, -0.908608f, -0.908648f, -0.908688f, -0.908728f, -0.908768f, -0.908808f,
+ -0.908848f, -0.908888f, -0.908928f, -0.908968f, -0.909008f, -0.909048f, -0.909088f, -0.909128f,
+ -0.909168f, -0.909208f, -0.909248f, -0.909288f, -0.909328f, -0.909368f, -0.909407f, -0.909447f,
+ -0.909487f, -0.909527f, -0.909567f, -0.909607f, -0.909646f, -0.909686f, -0.909726f, -0.909766f,
+ -0.909806f, -0.909845f, -0.909885f, -0.909925f, -0.909965f, -0.910005f, -0.910044f, -0.910084f,
+ -0.910124f, -0.910163f, -0.910203f, -0.910243f, -0.910283f, -0.910322f, -0.910362f, -0.910402f,
+ -0.910441f, -0.910481f, -0.910521f, -0.910560f, -0.910600f, -0.910639f, -0.910679f, -0.910719f,
+ -0.910758f, -0.910798f, -0.910837f, -0.910877f, -0.910917f, -0.910956f, -0.910996f, -0.911035f,
+ -0.911075f, -0.911114f, -0.911154f, -0.911193f, -0.911233f, -0.911272f, -0.911312f, -0.911351f,
+ -0.911391f, -0.911430f, -0.911470f, -0.911509f, -0.911548f, -0.911588f, -0.911627f, -0.911667f,
+ -0.911706f, -0.911745f, -0.911785f, -0.911824f, -0.911864f, -0.911903f, -0.911942f, -0.911982f,
+ -0.912021f, -0.912060f, -0.912099f, -0.912139f, -0.912178f, -0.912217f, -0.912257f, -0.912296f,
+ -0.912335f, -0.912374f, -0.912414f, -0.912453f, -0.912492f, -0.912531f, -0.912571f, -0.912610f,
+ -0.912649f, -0.912688f, -0.912727f, -0.912766f, -0.912806f, -0.912845f, -0.912884f, -0.912923f,
+ -0.912962f, -0.913001f, -0.913040f, -0.913080f, -0.913119f, -0.913158f, -0.913197f, -0.913236f,
+ -0.913275f, -0.913314f, -0.913353f, -0.913392f, -0.913431f, -0.913470f, -0.913509f, -0.913548f,
+ -0.913587f, -0.913626f, -0.913665f, -0.913704f, -0.913743f, -0.913782f, -0.913821f, -0.913860f,
+ -0.913899f, -0.913938f, -0.913976f, -0.914015f, -0.914054f, -0.914093f, -0.914132f, -0.914171f,
+ -0.914210f, -0.914249f, -0.914287f, -0.914326f, -0.914365f, -0.914404f, -0.914443f, -0.914482f,
+ -0.914520f, -0.914559f, -0.914598f, -0.914637f, -0.914675f, -0.914714f, -0.914753f, -0.914792f,
+ -0.914830f, -0.914869f, -0.914908f, -0.914946f, -0.914985f, -0.915024f, -0.915062f, -0.915101f,
+ -0.915140f, -0.915178f, -0.915217f, -0.915256f, -0.915294f, -0.915333f, -0.915372f, -0.915410f,
+ -0.915449f, -0.915487f, -0.915526f, -0.915564f, -0.915603f, -0.915642f, -0.915680f, -0.915719f,
+ -0.915757f, -0.915796f, -0.915834f, -0.915873f, -0.915911f, -0.915950f, -0.915988f, -0.916027f,
+ -0.916065f, -0.916103f, -0.916142f, -0.916180f, -0.916219f, -0.916257f, -0.916296f, -0.916334f,
+ -0.916372f, -0.916411f, -0.916449f, -0.916487f, -0.916526f, -0.916564f, -0.916602f, -0.916641f,
+ -0.916679f, -0.916717f, -0.916756f, -0.916794f, -0.916832f, -0.916871f, -0.916909f, -0.916947f,
+ -0.916985f, -0.917024f, -0.917062f, -0.917100f, -0.917138f, -0.917176f, -0.917215f, -0.917253f,
+ -0.917291f, -0.917329f, -0.917367f, -0.917405f, -0.917444f, -0.917482f, -0.917520f, -0.917558f,
+ -0.917596f, -0.917634f, -0.917672f, -0.917710f, -0.917749f, -0.917787f, -0.917825f, -0.917863f,
+ -0.917901f, -0.917939f, -0.917977f, -0.918015f, -0.918053f, -0.918091f, -0.918129f, -0.918167f,
+ -0.918205f, -0.918243f, -0.918281f, -0.918319f, -0.918357f, -0.918395f, -0.918433f, -0.918471f,
+ -0.918508f, -0.918546f, -0.918584f, -0.918622f, -0.918660f, -0.918698f, -0.918736f, -0.918774f,
+ -0.918811f, -0.918849f, -0.918887f, -0.918925f, -0.918963f, -0.919001f, -0.919038f, -0.919076f,
+ -0.919114f, -0.919152f, -0.919189f, -0.919227f, -0.919265f, -0.919303f, -0.919340f, -0.919378f,
+ -0.919416f, -0.919453f, -0.919491f, -0.919529f, -0.919567f, -0.919604f, -0.919642f, -0.919680f,
+ -0.919717f, -0.919755f, -0.919792f, -0.919830f, -0.919868f, -0.919905f, -0.919943f, -0.919980f,
+ -0.920018f, -0.920056f, -0.920093f, -0.920131f, -0.920168f, -0.920206f, -0.920243f, -0.920281f,
+ -0.920318f, -0.920356f, -0.920393f, -0.920431f, -0.920468f, -0.920506f, -0.920543f, -0.920581f,
+ -0.920618f, -0.920655f, -0.920693f, -0.920730f, -0.920768f, -0.920805f, -0.920842f, -0.920880f,
+ -0.920917f, -0.920955f, -0.920992f, -0.921029f, -0.921067f, -0.921104f, -0.921141f, -0.921179f,
+ -0.921216f, -0.921253f, -0.921291f, -0.921328f, -0.921365f, -0.921402f, -0.921440f, -0.921477f,
+ -0.921514f, -0.921551f, -0.921588f, -0.921626f, -0.921663f, -0.921700f, -0.921737f, -0.921774f,
+ -0.921812f, -0.921849f, -0.921886f, -0.921923f, -0.921960f, -0.921997f, -0.922034f, -0.922072f,
+ -0.922109f, -0.922146f, -0.922183f, -0.922220f, -0.922257f, -0.922294f, -0.922331f, -0.922368f,
+ -0.922405f, -0.922442f, -0.922479f, -0.922516f, -0.922553f, -0.922590f, -0.922627f, -0.922664f,
+ -0.922701f, -0.922738f, -0.922775f, -0.922812f, -0.922849f, -0.922886f, -0.922923f, -0.922960f,
+ -0.922997f, -0.923033f, -0.923070f, -0.923107f, -0.923144f, -0.923181f, -0.923218f, -0.923255f,
+ -0.923291f, -0.923328f, -0.923365f, -0.923402f, -0.923439f, -0.923475f, -0.923512f, -0.923549f,
+ -0.923586f, -0.923622f, -0.923659f, -0.923696f, -0.923733f, -0.923769f, -0.923806f, -0.923843f,
+ -0.923880f, -0.923916f, -0.923953f, -0.923990f, -0.924026f, -0.924063f, -0.924100f, -0.924136f,
+ -0.924173f, -0.924209f, -0.924246f, -0.924283f, -0.924319f, -0.924356f, -0.924392f, -0.924429f,
+ -0.924465f, -0.924502f, -0.924539f, -0.924575f, -0.924612f, -0.924648f, -0.924685f, -0.924721f,
+ -0.924758f, -0.924794f, -0.924831f, -0.924867f, -0.924904f, -0.924940f, -0.924976f, -0.925013f,
+ -0.925049f, -0.925086f, -0.925122f, -0.925158f, -0.925195f, -0.925231f, -0.925268f, -0.925304f,
+ -0.925340f, -0.925377f, -0.925413f, -0.925449f, -0.925486f, -0.925522f, -0.925558f, -0.925595f,
+ -0.925631f, -0.925667f, -0.925703f, -0.925740f, -0.925776f, -0.925812f, -0.925848f, -0.925885f,
+ -0.925921f, -0.925957f, -0.925993f, -0.926029f, -0.926066f, -0.926102f, -0.926138f, -0.926174f,
+ -0.926210f, -0.926246f, -0.926283f, -0.926319f, -0.926355f, -0.926391f, -0.926427f, -0.926463f,
+ -0.926499f, -0.926535f, -0.926571f, -0.926607f, -0.926643f, -0.926679f, -0.926715f, -0.926751f,
+ -0.926787f, -0.926823f, -0.926859f, -0.926895f, -0.926931f, -0.926967f, -0.927003f, -0.927039f,
+ -0.927075f, -0.927111f, -0.927147f, -0.927183f, -0.927219f, -0.927255f, -0.927291f, -0.927327f,
+ -0.927363f, -0.927398f, -0.927434f, -0.927470f, -0.927506f, -0.927542f, -0.927578f, -0.927613f,
+ -0.927649f, -0.927685f, -0.927721f, -0.927757f, -0.927792f, -0.927828f, -0.927864f, -0.927900f,
+ -0.927935f, -0.927971f, -0.928007f, -0.928043f, -0.928078f, -0.928114f, -0.928150f, -0.928185f,
+ -0.928221f, -0.928257f, -0.928292f, -0.928328f, -0.928364f, -0.928399f, -0.928435f, -0.928470f,
+ -0.928506f, -0.928542f, -0.928577f, -0.928613f, -0.928648f, -0.928684f, -0.928720f, -0.928755f,
+ -0.928791f, -0.928826f, -0.928862f, -0.928897f, -0.928933f, -0.928968f, -0.929004f, -0.929039f,
+ -0.929075f, -0.929110f, -0.929146f, -0.929181f, -0.929216f, -0.929252f, -0.929287f, -0.929323f,
+ -0.929358f, -0.929393f, -0.929429f, -0.929464f, -0.929500f, -0.929535f, -0.929570f, -0.929606f,
+ -0.929641f, -0.929676f, -0.929712f, -0.929747f, -0.929782f, -0.929817f, -0.929853f, -0.929888f,
+ -0.929923f, -0.929958f, -0.929994f, -0.930029f, -0.930064f, -0.930099f, -0.930135f, -0.930170f,
+ -0.930205f, -0.930240f, -0.930275f, -0.930311f, -0.930346f, -0.930381f, -0.930416f, -0.930451f,
+ -0.930486f, -0.930521f, -0.930556f, -0.930592f, -0.930627f, -0.930662f, -0.930697f, -0.930732f,
+ -0.930767f, -0.930802f, -0.930837f, -0.930872f, -0.930907f, -0.930942f, -0.930977f, -0.931012f,
+ -0.931047f, -0.931082f, -0.931117f, -0.931152f, -0.931187f, -0.931222f, -0.931257f, -0.931292f,
+ -0.931327f, -0.931362f, -0.931397f, -0.931431f, -0.931466f, -0.931501f, -0.931536f, -0.931571f,
+ -0.931606f, -0.931641f, -0.931675f, -0.931710f, -0.931745f, -0.931780f, -0.931815f, -0.931849f,
+ -0.931884f, -0.931919f, -0.931954f, -0.931989f, -0.932023f, -0.932058f, -0.932093f, -0.932128f,
+ -0.932162f, -0.932197f, -0.932232f, -0.932266f, -0.932301f, -0.932336f, -0.932370f, -0.932405f,
+ -0.932440f, -0.932474f, -0.932509f, -0.932544f, -0.932578f, -0.932613f, -0.932647f, -0.932682f,
+ -0.932716f, -0.932751f, -0.932786f, -0.932820f, -0.932855f, -0.932889f, -0.932924f, -0.932958f,
+ -0.932993f, -0.933027f, -0.933062f, -0.933096f, -0.933131f, -0.933165f, -0.933200f, -0.933234f,
+ -0.933269f, -0.933303f, -0.933337f, -0.933372f, -0.933406f, -0.933441f, -0.933475f, -0.933509f,
+ -0.933544f, -0.933578f, -0.933612f, -0.933647f, -0.933681f, -0.933716f, -0.933750f, -0.933784f,
+ -0.933818f, -0.933853f, -0.933887f, -0.933921f, -0.933956f, -0.933990f, -0.934024f, -0.934058f,
+ -0.934093f, -0.934127f, -0.934161f, -0.934195f, -0.934229f, -0.934264f, -0.934298f, -0.934332f,
+ -0.934366f, -0.934400f, -0.934434f, -0.934469f, -0.934503f, -0.934537f, -0.934571f, -0.934605f,
+ -0.934639f, -0.934673f, -0.934707f, -0.934741f, -0.934775f, -0.934810f, -0.934844f, -0.934878f,
+ -0.934912f, -0.934946f, -0.934980f, -0.935014f, -0.935048f, -0.935082f, -0.935116f, -0.935150f,
+ -0.935184f, -0.935217f, -0.935251f, -0.935285f, -0.935319f, -0.935353f, -0.935387f, -0.935421f,
+ -0.935455f, -0.935489f, -0.935523f, -0.935556f, -0.935590f, -0.935624f, -0.935658f, -0.935692f,
+ -0.935726f, -0.935759f, -0.935793f, -0.935827f, -0.935861f, -0.935895f, -0.935928f, -0.935962f,
+ -0.935996f, -0.936030f, -0.936063f, -0.936097f, -0.936131f, -0.936165f, -0.936198f, -0.936232f,
+ -0.936266f, -0.936299f, -0.936333f, -0.936367f, -0.936400f, -0.936434f, -0.936468f, -0.936501f,
+ -0.936535f, -0.936568f, -0.936602f, -0.936636f, -0.936669f, -0.936703f, -0.936736f, -0.936770f,
+ -0.936803f, -0.936837f, -0.936871f, -0.936904f, -0.936938f, -0.936971f, -0.937005f, -0.937038f,
+ -0.937072f, -0.937105f, -0.937138f, -0.937172f, -0.937205f, -0.937239f, -0.937272f, -0.937306f,
+ -0.937339f, -0.937372f, -0.937406f, -0.937439f, -0.937473f, -0.937506f, -0.937539f, -0.937573f,
+ -0.937606f, -0.937639f, -0.937673f, -0.937706f, -0.937739f, -0.937773f, -0.937806f, -0.937839f,
+ -0.937872f, -0.937906f, -0.937939f, -0.937972f, -0.938005f, -0.938039f, -0.938072f, -0.938105f,
+ -0.938138f, -0.938171f, -0.938205f, -0.938238f, -0.938271f, -0.938304f, -0.938337f, -0.938370f,
+ -0.938404f, -0.938437f, -0.938470f, -0.938503f, -0.938536f, -0.938569f, -0.938602f, -0.938635f,
+ -0.938668f, -0.938701f, -0.938734f, -0.938767f, -0.938800f, -0.938833f, -0.938866f, -0.938900f,
+ -0.938932f, -0.938965f, -0.938998f, -0.939031f, -0.939064f, -0.939097f, -0.939130f, -0.939163f,
+ -0.939196f, -0.939229f, -0.939262f, -0.939295f, -0.939328f, -0.939361f, -0.939394f, -0.939426f,
+ -0.939459f, -0.939492f, -0.939525f, -0.939558f, -0.939591f, -0.939623f, -0.939656f, -0.939689f,
+ -0.939722f, -0.939755f, -0.939787f, -0.939820f, -0.939853f, -0.939886f, -0.939918f, -0.939951f,
+ -0.939984f, -0.940016f, -0.940049f, -0.940082f, -0.940115f, -0.940147f, -0.940180f, -0.940213f,
+ -0.940245f, -0.940278f, -0.940310f, -0.940343f, -0.940376f, -0.940408f, -0.940441f, -0.940473f,
+ -0.940506f, -0.940539f, -0.940571f, -0.940604f, -0.940636f, -0.940669f, -0.940701f, -0.940734f,
+ -0.940766f, -0.940799f, -0.940831f, -0.940864f, -0.940896f, -0.940929f, -0.940961f, -0.940994f,
+ -0.941026f, -0.941059f, -0.941091f, -0.941123f, -0.941156f, -0.941188f, -0.941221f, -0.941253f,
+ -0.941285f, -0.941318f, -0.941350f, -0.941382f, -0.941415f, -0.941447f, -0.941479f, -0.941512f,
+ -0.941544f, -0.941576f, -0.941609f, -0.941641f, -0.941673f, -0.941705f, -0.941738f, -0.941770f,
+ -0.941802f, -0.941834f, -0.941867f, -0.941899f, -0.941931f, -0.941963f, -0.941995f, -0.942028f,
+ -0.942060f, -0.942092f, -0.942124f, -0.942156f, -0.942188f, -0.942220f, -0.942253f, -0.942285f,
+ -0.942317f, -0.942349f, -0.942381f, -0.942413f, -0.942445f, -0.942477f, -0.942509f, -0.942541f,
+ -0.942573f, -0.942605f, -0.942637f, -0.942669f, -0.942701f, -0.942733f, -0.942765f, -0.942797f,
+ -0.942829f, -0.942861f, -0.942893f, -0.942925f, -0.942957f, -0.942989f, -0.943021f, -0.943053f,
+ -0.943084f, -0.943116f, -0.943148f, -0.943180f, -0.943212f, -0.943244f, -0.943276f, -0.943307f,
+ -0.943339f, -0.943371f, -0.943403f, -0.943435f, -0.943466f, -0.943498f, -0.943530f, -0.943562f,
+ -0.943593f, -0.943625f, -0.943657f, -0.943689f, -0.943720f, -0.943752f, -0.943784f, -0.943815f,
+ -0.943847f, -0.943879f, -0.943910f, -0.943942f, -0.943974f, -0.944005f, -0.944037f, -0.944069f,
+ -0.944100f, -0.944132f, -0.944163f, -0.944195f, -0.944227f, -0.944258f, -0.944290f, -0.944321f,
+ -0.944353f, -0.944384f, -0.944416f, -0.944447f, -0.944479f, -0.944510f, -0.944542f, -0.944573f,
+ -0.944605f, -0.944636f, -0.944668f, -0.944699f, -0.944731f, -0.944762f, -0.944793f, -0.944825f,
+ -0.944856f, -0.944888f, -0.944919f, -0.944950f, -0.944982f, -0.945013f, -0.945045f, -0.945076f,
+ -0.945107f, -0.945139f, -0.945170f, -0.945201f, -0.945232f, -0.945264f, -0.945295f, -0.945326f,
+ -0.945358f, -0.945389f, -0.945420f, -0.945451f, -0.945482f, -0.945514f, -0.945545f, -0.945576f,
+ -0.945607f, -0.945639f, -0.945670f, -0.945701f, -0.945732f, -0.945763f, -0.945794f, -0.945825f,
+ -0.945857f, -0.945888f, -0.945919f, -0.945950f, -0.945981f, -0.946012f, -0.946043f, -0.946074f,
+ -0.946105f, -0.946136f, -0.946167f, -0.946198f, -0.946229f, -0.946260f, -0.946291f, -0.946322f,
+ -0.946353f, -0.946384f, -0.946415f, -0.946446f, -0.946477f, -0.946508f, -0.946539f, -0.946570f,
+ -0.946601f, -0.946632f, -0.946663f, -0.946694f, -0.946724f, -0.946755f, -0.946786f, -0.946817f,
+ -0.946848f, -0.946879f, -0.946910f, -0.946940f, -0.946971f, -0.947002f, -0.947033f, -0.947064f,
+ -0.947094f, -0.947125f, -0.947156f, -0.947187f, -0.947217f, -0.947248f, -0.947279f, -0.947310f,
+ -0.947340f, -0.947371f, -0.947402f, -0.947432f, -0.947463f, -0.947494f, -0.947524f, -0.947555f,
+ -0.947586f, -0.947616f, -0.947647f, -0.947677f, -0.947708f, -0.947739f, -0.947769f, -0.947800f,
+ -0.947830f, -0.947861f, -0.947891f, -0.947922f, -0.947953f, -0.947983f, -0.948014f, -0.948044f,
+ -0.948075f, -0.948105f, -0.948136f, -0.948166f, -0.948196f, -0.948227f, -0.948257f, -0.948288f,
+ -0.948318f, -0.948349f, -0.948379f, -0.948409f, -0.948440f, -0.948470f, -0.948501f, -0.948531f,
+ -0.948561f, -0.948592f, -0.948622f, -0.948652f, -0.948683f, -0.948713f, -0.948743f, -0.948774f,
+ -0.948804f, -0.948834f, -0.948864f, -0.948895f, -0.948925f, -0.948955f, -0.948985f, -0.949016f,
+ -0.949046f, -0.949076f, -0.949106f, -0.949136f, -0.949167f, -0.949197f, -0.949227f, -0.949257f,
+ -0.949287f, -0.949317f, -0.949348f, -0.949378f, -0.949408f, -0.949438f, -0.949468f, -0.949498f,
+ -0.949528f, -0.949558f, -0.949588f, -0.949618f, -0.949648f, -0.949678f, -0.949708f, -0.949739f,
+ -0.949768f, -0.949798f, -0.949829f, -0.949858f, -0.949888f, -0.949918f, -0.949948f, -0.949978f,
+ -0.950008f, -0.950038f, -0.950068f, -0.950098f, -0.950128f, -0.950158f, -0.950188f, -0.950218f,
+ -0.950247f, -0.950277f, -0.950307f, -0.950337f, -0.950367f, -0.950397f, -0.950426f, -0.950456f,
+ -0.950486f, -0.950516f, -0.950546f, -0.950575f, -0.950605f, -0.950635f, -0.950665f, -0.950694f,
+ -0.950724f, -0.950754f, -0.950784f, -0.950813f, -0.950843f, -0.950873f, -0.950902f, -0.950932f,
+ -0.950962f, -0.950991f, -0.951021f, -0.951051f, -0.951080f, -0.951110f, -0.951139f, -0.951169f,
+ -0.951199f, -0.951228f, -0.951258f, -0.951287f, -0.951317f, -0.951346f, -0.951376f, -0.951406f,
+ -0.951435f, -0.951465f, -0.951494f, -0.951524f, -0.951553f, -0.951582f, -0.951612f, -0.951641f,
+ -0.951671f, -0.951700f, -0.951730f, -0.951759f, -0.951789f, -0.951818f, -0.951847f, -0.951877f,
+ -0.951906f, -0.951936f, -0.951965f, -0.951994f, -0.952024f, -0.952053f, -0.952082f, -0.952112f,
+ -0.952141f, -0.952170f, -0.952199f, -0.952229f, -0.952258f, -0.952287f, -0.952317f, -0.952346f,
+ -0.952375f, -0.952404f, -0.952433f, -0.952463f, -0.952492f, -0.952521f, -0.952550f, -0.952579f,
+ -0.952609f, -0.952638f, -0.952667f, -0.952696f, -0.952725f, -0.952754f, -0.952783f, -0.952813f,
+ -0.952842f, -0.952871f, -0.952900f, -0.952929f, -0.952958f, -0.952987f, -0.953016f, -0.953045f,
+ -0.953074f, -0.953103f, -0.953132f, -0.953161f, -0.953190f, -0.953219f, -0.953248f, -0.953277f,
+ -0.953306f, -0.953335f, -0.953364f, -0.953393f, -0.953422f, -0.953451f, -0.953480f, -0.953508f,
+ -0.953537f, -0.953566f, -0.953595f, -0.953624f, -0.953653f, -0.953682f, -0.953711f, -0.953739f,
+ -0.953768f, -0.953797f, -0.953826f, -0.953855f, -0.953883f, -0.953912f, -0.953941f, -0.953970f,
+ -0.953998f, -0.954027f, -0.954056f, -0.954085f, -0.954113f, -0.954142f, -0.954171f, -0.954199f,
+ -0.954228f, -0.954257f, -0.954285f, -0.954314f, -0.954343f, -0.954371f, -0.954400f, -0.954429f,
+ -0.954457f, -0.954486f, -0.954514f, -0.954543f, -0.954572f, -0.954600f, -0.954629f, -0.954657f,
+ -0.954686f, -0.954714f, -0.954743f, -0.954771f, -0.954800f, -0.954828f, -0.954857f, -0.954885f,
+ -0.954914f, -0.954942f, -0.954971f, -0.954999f, -0.955028f, -0.955056f, -0.955084f, -0.955113f,
+ -0.955141f, -0.955170f, -0.955198f, -0.955226f, -0.955255f, -0.955283f, -0.955311f, -0.955340f,
+ -0.955368f, -0.955396f, -0.955425f, -0.955453f, -0.955481f, -0.955510f, -0.955538f, -0.955566f,
+ -0.955594f, -0.955623f, -0.955651f, -0.955679f, -0.955707f, -0.955736f, -0.955764f, -0.955792f,
+ -0.955820f, -0.955848f, -0.955876f, -0.955905f, -0.955933f, -0.955961f, -0.955989f, -0.956017f,
+ -0.956045f, -0.956073f, -0.956101f, -0.956130f, -0.956158f, -0.956186f, -0.956214f, -0.956242f,
+ -0.956270f, -0.956298f, -0.956326f, -0.956354f, -0.956382f, -0.956410f, -0.956438f, -0.956466f,
+ -0.956494f, -0.956522f, -0.956550f, -0.956578f, -0.956606f, -0.956634f, -0.956662f, -0.956689f,
+ -0.956717f, -0.956745f, -0.956773f, -0.956801f, -0.956829f, -0.956857f, -0.956885f, -0.956913f,
+ -0.956940f, -0.956968f, -0.956996f, -0.957024f, -0.957052f, -0.957079f, -0.957107f, -0.957135f,
+ -0.957163f, -0.957190f, -0.957218f, -0.957246f, -0.957274f, -0.957301f, -0.957329f, -0.957357f,
+ -0.957385f, -0.957412f, -0.957440f, -0.957468f, -0.957495f, -0.957523f, -0.957550f, -0.957578f,
+ -0.957606f, -0.957633f, -0.957661f, -0.957689f, -0.957716f, -0.957744f, -0.957771f, -0.957799f,
+ -0.957826f, -0.957854f, -0.957882f, -0.957909f, -0.957937f, -0.957964f, -0.957992f, -0.958019f,
+ -0.958046f, -0.958074f, -0.958101f, -0.958129f, -0.958156f, -0.958184f, -0.958211f, -0.958239f,
+ -0.958266f, -0.958293f, -0.958321f, -0.958348f, -0.958376f, -0.958403f, -0.958430f, -0.958458f,
+ -0.958485f, -0.958512f, -0.958540f, -0.958567f, -0.958594f, -0.958622f, -0.958649f, -0.958676f,
+ -0.958703f, -0.958731f, -0.958758f, -0.958785f, -0.958812f, -0.958840f, -0.958867f, -0.958894f,
+ -0.958921f, -0.958949f, -0.958976f, -0.959003f, -0.959030f, -0.959057f, -0.959084f, -0.959112f,
+ -0.959139f, -0.959166f, -0.959193f, -0.959220f, -0.959247f, -0.959274f, -0.959301f, -0.959328f,
+ -0.959355f, -0.959382f, -0.959409f, -0.959436f, -0.959463f, -0.959491f, -0.959518f, -0.959545f,
+ -0.959572f, -0.959598f, -0.959625f, -0.959652f, -0.959679f, -0.959706f, -0.959733f, -0.959760f,
+ -0.959787f, -0.959814f, -0.959841f, -0.959868f, -0.959895f, -0.959922f, -0.959948f, -0.959975f,
+ -0.960002f, -0.960029f, -0.960056f, -0.960083f, -0.960109f, -0.960136f, -0.960163f, -0.960190f,
+ -0.960217f, -0.960243f, -0.960270f, -0.960297f, -0.960324f, -0.960350f, -0.960377f, -0.960404f,
+ -0.960431f, -0.960457f, -0.960484f, -0.960511f, -0.960537f, -0.960564f, -0.960591f, -0.960617f,
+ -0.960644f, -0.960670f, -0.960697f, -0.960724f, -0.960750f, -0.960777f, -0.960804f, -0.960830f,
+ -0.960857f, -0.960883f, -0.960910f, -0.960936f, -0.960963f, -0.960989f, -0.961016f, -0.961042f,
+ -0.961069f, -0.961095f, -0.961122f, -0.961148f, -0.961175f, -0.961201f, -0.961228f, -0.961254f,
+ -0.961280f, -0.961307f, -0.961333f, -0.961360f, -0.961386f, -0.961412f, -0.961439f, -0.961465f,
+ -0.961492f, -0.961518f, -0.961544f, -0.961571f, -0.961597f, -0.961623f, -0.961649f, -0.961676f,
+ -0.961702f, -0.961728f, -0.961755f, -0.961781f, -0.961807f, -0.961833f, -0.961860f, -0.961886f,
+ -0.961912f, -0.961938f, -0.961964f, -0.961991f, -0.962017f, -0.962043f, -0.962069f, -0.962095f,
+ -0.962121f, -0.962148f, -0.962174f, -0.962200f, -0.962226f, -0.962252f, -0.962278f, -0.962304f,
+ -0.962330f, -0.962356f, -0.962382f, -0.962408f, -0.962434f, -0.962460f, -0.962486f, -0.962512f,
+ -0.962538f, -0.962564f, -0.962590f, -0.962616f, -0.962642f, -0.962668f, -0.962694f, -0.962720f,
+ -0.962746f, -0.962772f, -0.962798f, -0.962824f, -0.962850f, -0.962876f, -0.962902f, -0.962927f,
+ -0.962953f, -0.962979f, -0.963005f, -0.963031f, -0.963057f, -0.963082f, -0.963108f, -0.963134f,
+ -0.963160f, -0.963186f, -0.963211f, -0.963237f, -0.963263f, -0.963289f, -0.963314f, -0.963340f,
+ -0.963366f, -0.963391f, -0.963417f, -0.963443f, -0.963469f, -0.963494f, -0.963520f, -0.963546f,
+ -0.963571f, -0.963597f, -0.963623f, -0.963648f, -0.963674f, -0.963699f, -0.963725f, -0.963750f,
+ -0.963776f, -0.963802f, -0.963827f, -0.963853f, -0.963878f, -0.963904f, -0.963929f, -0.963955f,
+ -0.963980f, -0.964006f, -0.964031f, -0.964057f, -0.964082f, -0.964108f, -0.964133f, -0.964159f,
+ -0.964184f, -0.964209f, -0.964235f, -0.964260f, -0.964286f, -0.964311f, -0.964336f, -0.964362f,
+ -0.964387f, -0.964413f, -0.964438f, -0.964463f, -0.964489f, -0.964514f, -0.964539f, -0.964565f,
+ -0.964590f, -0.964615f, -0.964640f, -0.964666f, -0.964691f, -0.964716f, -0.964741f, -0.964767f,
+ -0.964792f, -0.964817f, -0.964842f, -0.964867f, -0.964893f, -0.964918f, -0.964943f, -0.964968f,
+ -0.964993f, -0.965018f, -0.965044f, -0.965069f, -0.965094f, -0.965119f, -0.965144f, -0.965169f,
+ -0.965194f, -0.965219f, -0.965244f, -0.965269f, -0.965294f, -0.965319f, -0.965344f, -0.965369f,
+ -0.965394f, -0.965419f, -0.965444f, -0.965469f, -0.965494f, -0.965519f, -0.965544f, -0.965569f,
+ -0.965594f, -0.965619f, -0.965644f, -0.965669f, -0.965694f, -0.965719f, -0.965744f, -0.965769f,
+ -0.965793f, -0.965818f, -0.965843f, -0.965868f, -0.965893f, -0.965918f, -0.965942f, -0.965967f,
+ -0.965992f, -0.966017f, -0.966042f, -0.966066f, -0.966091f, -0.966116f, -0.966141f, -0.966165f,
+ -0.966190f, -0.966215f, -0.966239f, -0.966264f, -0.966289f, -0.966313f, -0.966338f, -0.966363f,
+ -0.966387f, -0.966412f, -0.966437f, -0.966461f, -0.966486f, -0.966511f, -0.966535f, -0.966560f,
+ -0.966584f, -0.966609f, -0.966633f, -0.966658f, -0.966683f, -0.966707f, -0.966732f, -0.966756f,
+ -0.966781f, -0.966805f, -0.966830f, -0.966854f, -0.966879f, -0.966903f, -0.966928f, -0.966952f,
+ -0.966976f, -0.967001f, -0.967025f, -0.967050f, -0.967074f, -0.967099f, -0.967123f, -0.967147f,
+ -0.967172f, -0.967196f, -0.967220f, -0.967245f, -0.967269f, -0.967293f, -0.967318f, -0.967342f,
+ -0.967366f, -0.967391f, -0.967415f, -0.967439f, -0.967463f, -0.967488f, -0.967512f, -0.967536f,
+ -0.967560f, -0.967585f, -0.967609f, -0.967633f, -0.967657f, -0.967681f, -0.967706f, -0.967730f,
+ -0.967754f, -0.967778f, -0.967802f, -0.967826f, -0.967850f, -0.967874f, -0.967899f, -0.967923f,
+ -0.967947f, -0.967971f, -0.967995f, -0.968019f, -0.968043f, -0.968067f, -0.968091f, -0.968115f,
+ -0.968139f, -0.968163f, -0.968187f, -0.968211f, -0.968235f, -0.968259f, -0.968283f, -0.968307f,
+ -0.968331f, -0.968355f, -0.968379f, -0.968403f, -0.968427f, -0.968450f, -0.968474f, -0.968498f,
+ -0.968522f, -0.968546f, -0.968570f, -0.968594f, -0.968617f, -0.968641f, -0.968665f, -0.968689f,
+ -0.968713f, -0.968737f, -0.968760f, -0.968784f, -0.968808f, -0.968832f, -0.968855f, -0.968879f,
+ -0.968903f, -0.968927f, -0.968950f, -0.968974f, -0.968998f, -0.969021f, -0.969045f, -0.969069f,
+ -0.969092f, -0.969116f, -0.969140f, -0.969163f, -0.969187f, -0.969210f, -0.969234f, -0.969258f,
+ -0.969281f, -0.969305f, -0.969328f, -0.969352f, -0.969375f, -0.969399f, -0.969423f, -0.969446f,
+ -0.969470f, -0.969493f, -0.969517f, -0.969540f, -0.969564f, -0.969587f, -0.969611f, -0.969634f,
+ -0.969657f, -0.969681f, -0.969704f, -0.969728f, -0.969751f, -0.969774f, -0.969798f, -0.969821f,
+ -0.969845f, -0.969868f, -0.969891f, -0.969915f, -0.969938f, -0.969961f, -0.969985f, -0.970008f,
+ -0.970031f, -0.970055f, -0.970078f, -0.970101f, -0.970124f, -0.970148f, -0.970171f, -0.970194f,
+ -0.970217f, -0.970241f, -0.970264f, -0.970287f, -0.970310f, -0.970333f, -0.970357f, -0.970380f,
+ -0.970403f, -0.970426f, -0.970449f, -0.970472f, -0.970495f, -0.970518f, -0.970542f, -0.970565f,
+ -0.970588f, -0.970611f, -0.970634f, -0.970657f, -0.970680f, -0.970703f, -0.970726f, -0.970749f,
+ -0.970772f, -0.970795f, -0.970818f, -0.970841f, -0.970864f, -0.970887f, -0.970910f, -0.970933f,
+ -0.970956f, -0.970979f, -0.971002f, -0.971025f, -0.971048f, -0.971071f, -0.971093f, -0.971116f,
+ -0.971139f, -0.971162f, -0.971185f, -0.971208f, -0.971231f, -0.971253f, -0.971276f, -0.971299f,
+ -0.971322f, -0.971345f, -0.971367f, -0.971390f, -0.971413f, -0.971436f, -0.971458f, -0.971481f,
+ -0.971504f, -0.971527f, -0.971549f, -0.971572f, -0.971595f, -0.971617f, -0.971640f, -0.971663f,
+ -0.971685f, -0.971708f, -0.971731f, -0.971753f, -0.971776f, -0.971799f, -0.971821f, -0.971844f,
+ -0.971866f, -0.971889f, -0.971911f, -0.971934f, -0.971957f, -0.971979f, -0.972002f, -0.972024f,
+ -0.972047f, -0.972069f, -0.972092f, -0.972114f, -0.972137f, -0.972159f, -0.972182f, -0.972204f,
+ -0.972227f, -0.972249f, -0.972271f, -0.972294f, -0.972316f, -0.972339f, -0.972361f, -0.972383f,
+ -0.972406f, -0.972428f, -0.972450f, -0.972473f, -0.972495f, -0.972517f, -0.972540f, -0.972562f,
+ -0.972584f, -0.972607f, -0.972629f, -0.972651f, -0.972673f, -0.972696f, -0.972718f, -0.972740f,
+ -0.972762f, -0.972785f, -0.972807f, -0.972829f, -0.972851f, -0.972873f, -0.972896f, -0.972918f,
+ -0.972940f, -0.972962f, -0.972984f, -0.973006f, -0.973028f, -0.973051f, -0.973073f, -0.973095f,
+ -0.973117f, -0.973139f, -0.973161f, -0.973183f, -0.973205f, -0.973227f, -0.973249f, -0.973271f,
+ -0.973293f, -0.973315f, -0.973337f, -0.973359f, -0.973381f, -0.973403f, -0.973425f, -0.973447f,
+ -0.973469f, -0.973491f, -0.973513f, -0.973535f, -0.973557f, -0.973579f, -0.973601f, -0.973622f,
+ -0.973644f, -0.973666f, -0.973688f, -0.973710f, -0.973732f, -0.973753f, -0.973775f, -0.973797f,
+ -0.973819f, -0.973841f, -0.973862f, -0.973884f, -0.973906f, -0.973928f, -0.973949f, -0.973971f,
+ -0.973993f, -0.974015f, -0.974036f, -0.974058f, -0.974080f, -0.974101f, -0.974123f, -0.974145f,
+ -0.974166f, -0.974188f, -0.974210f, -0.974231f, -0.974253f, -0.974275f, -0.974296f, -0.974318f,
+ -0.974339f, -0.974361f, -0.974383f, -0.974404f, -0.974426f, -0.974447f, -0.974469f, -0.974490f,
+ -0.974512f, -0.974533f, -0.974555f, -0.974576f, -0.974598f, -0.974619f, -0.974641f, -0.974662f,
+ -0.974684f, -0.974705f, -0.974726f, -0.974748f, -0.974769f, -0.974791f, -0.974812f, -0.974833f,
+ -0.974855f, -0.974876f, -0.974897f, -0.974919f, -0.974940f, -0.974961f, -0.974983f, -0.975004f,
+ -0.975025f, -0.975047f, -0.975068f, -0.975089f, -0.975110f, -0.975132f, -0.975153f, -0.975174f,
+ -0.975195f, -0.975217f, -0.975238f, -0.975259f, -0.975280f, -0.975301f, -0.975323f, -0.975344f,
+ -0.975365f, -0.975386f, -0.975407f, -0.975428f, -0.975449f, -0.975471f, -0.975492f, -0.975513f,
+ -0.975534f, -0.975555f, -0.975576f, -0.975597f, -0.975618f, -0.975639f, -0.975660f, -0.975681f,
+ -0.975702f, -0.975723f, -0.975744f, -0.975765f, -0.975786f, -0.975807f, -0.975828f, -0.975849f,
+ -0.975870f, -0.975891f, -0.975912f, -0.975933f, -0.975954f, -0.975974f, -0.975995f, -0.976016f,
+ -0.976037f, -0.976058f, -0.976079f, -0.976100f, -0.976120f, -0.976141f, -0.976162f, -0.976183f,
+ -0.976204f, -0.976224f, -0.976245f, -0.976266f, -0.976287f, -0.976308f, -0.976328f, -0.976349f,
+ -0.976370f, -0.976390f, -0.976411f, -0.976432f, -0.976453f, -0.976473f, -0.976494f, -0.976515f,
+ -0.976535f, -0.976556f, -0.976576f, -0.976597f, -0.976618f, -0.976638f, -0.976659f, -0.976680f,
+ -0.976700f, -0.976721f, -0.976741f, -0.976762f, -0.976782f, -0.976803f, -0.976823f, -0.976844f,
+ -0.976864f, -0.976885f, -0.976905f, -0.976926f, -0.976946f, -0.976967f, -0.976987f, -0.977008f,
+ -0.977028f, -0.977049f, -0.977069f, -0.977089f, -0.977110f, -0.977130f, -0.977151f, -0.977171f,
+ -0.977191f, -0.977212f, -0.977232f, -0.977252f, -0.977273f, -0.977293f, -0.977313f, -0.977334f,
+ -0.977354f, -0.977374f, -0.977394f, -0.977415f, -0.977435f, -0.977455f, -0.977475f, -0.977496f,
+ -0.977516f, -0.977536f, -0.977556f, -0.977577f, -0.977597f, -0.977617f, -0.977637f, -0.977657f,
+ -0.977677f, -0.977697f, -0.977718f, -0.977738f, -0.977758f, -0.977778f, -0.977798f, -0.977818f,
+ -0.977838f, -0.977858f, -0.977878f, -0.977898f, -0.977918f, -0.977938f, -0.977959f, -0.977979f,
+ -0.977998f, -0.978019f, -0.978038f, -0.978058f, -0.978078f, -0.978098f, -0.978118f, -0.978138f,
+ -0.978158f, -0.978178f, -0.978198f, -0.978218f, -0.978238f, -0.978258f, -0.978278f, -0.978298f,
+ -0.978317f, -0.978337f, -0.978357f, -0.978377f, -0.978397f, -0.978417f, -0.978436f, -0.978456f,
+ -0.978476f, -0.978496f, -0.978516f, -0.978535f, -0.978555f, -0.978575f, -0.978594f, -0.978614f,
+ -0.978634f, -0.978654f, -0.978673f, -0.978693f, -0.978713f, -0.978732f, -0.978752f, -0.978772f,
+ -0.978791f, -0.978811f, -0.978831f, -0.978850f, -0.978870f, -0.978889f, -0.978909f, -0.978929f,
+ -0.978948f, -0.978968f, -0.978987f, -0.979007f, -0.979026f, -0.979046f, -0.979065f, -0.979085f,
+ -0.979104f, -0.979124f, -0.979143f, -0.979163f, -0.979182f, -0.979202f, -0.979221f, -0.979241f,
+ -0.979260f, -0.979280f, -0.979299f, -0.979318f, -0.979338f, -0.979357f, -0.979376f, -0.979396f,
+ -0.979415f, -0.979435f, -0.979454f, -0.979473f, -0.979493f, -0.979512f, -0.979531f, -0.979550f,
+ -0.979570f, -0.979589f, -0.979608f, -0.979628f, -0.979647f, -0.979666f, -0.979685f, -0.979704f,
+ -0.979724f, -0.979743f, -0.979762f, -0.979781f, -0.979800f, -0.979820f, -0.979839f, -0.979858f,
+ -0.979877f, -0.979896f, -0.979915f, -0.979934f, -0.979954f, -0.979973f, -0.979992f, -0.980011f,
+ -0.980030f, -0.980049f, -0.980068f, -0.980087f, -0.980106f, -0.980125f, -0.980144f, -0.980163f,
+ -0.980182f, -0.980201f, -0.980220f, -0.980239f, -0.980258f, -0.980277f, -0.980296f, -0.980315f,
+ -0.980334f, -0.980353f, -0.980372f, -0.980390f, -0.980409f, -0.980428f, -0.980447f, -0.980466f,
+ -0.980485f, -0.980504f, -0.980523f, -0.980541f, -0.980560f, -0.980579f, -0.980598f, -0.980617f,
+ -0.980635f, -0.980654f, -0.980673f, -0.980692f, -0.980710f, -0.980729f, -0.980748f, -0.980767f,
+ -0.980785f, -0.980804f, -0.980823f, -0.980841f, -0.980860f, -0.980879f, -0.980897f, -0.980916f,
+ -0.980935f, -0.980953f, -0.980972f, -0.980990f, -0.981009f, -0.981028f, -0.981046f, -0.981065f,
+ -0.981083f, -0.981102f, -0.981120f, -0.981139f, -0.981158f, -0.981176f, -0.981195f, -0.981213f,
+ -0.981232f, -0.981250f, -0.981269f, -0.981287f, -0.981305f, -0.981324f, -0.981342f, -0.981361f,
+ -0.981379f, -0.981398f, -0.981416f, -0.981434f, -0.981453f, -0.981471f, -0.981490f, -0.981508f,
+ -0.981526f, -0.981545f, -0.981563f, -0.981581f, -0.981600f, -0.981618f, -0.981636f, -0.981654f,
+ -0.981673f, -0.981691f, -0.981709f, -0.981727f, -0.981746f, -0.981764f, -0.981782f, -0.981800f,
+ -0.981819f, -0.981837f, -0.981855f, -0.981873f, -0.981891f, -0.981909f, -0.981928f, -0.981946f,
+ -0.981964f, -0.981982f, -0.982000f, -0.982018f, -0.982036f, -0.982054f, -0.982072f, -0.982091f,
+ -0.982109f, -0.982127f, -0.982145f, -0.982163f, -0.982181f, -0.982199f, -0.982217f, -0.982235f,
+ -0.982253f, -0.982271f, -0.982289f, -0.982307f, -0.982325f, -0.982343f, -0.982360f, -0.982378f,
+ -0.982396f, -0.982414f, -0.982432f, -0.982450f, -0.982468f, -0.982486f, -0.982504f, -0.982521f,
+ -0.982539f, -0.982557f, -0.982575f, -0.982593f, -0.982611f, -0.982628f, -0.982646f, -0.982664f,
+ -0.982682f, -0.982699f, -0.982717f, -0.982735f, -0.982753f, -0.982770f, -0.982788f, -0.982806f,
+ -0.982824f, -0.982841f, -0.982859f, -0.982877f, -0.982894f, -0.982912f, -0.982930f, -0.982947f,
+ -0.982965f, -0.982982f, -0.983000f, -0.983018f, -0.983035f, -0.983053f, -0.983070f, -0.983088f,
+ -0.983105f, -0.983123f, -0.983141f, -0.983158f, -0.983176f, -0.983193f, -0.983211f, -0.983228f,
+ -0.983246f, -0.983263f, -0.983281f, -0.983298f, -0.983315f, -0.983333f, -0.983350f, -0.983368f,
+ -0.983385f, -0.983402f, -0.983420f, -0.983437f, -0.983455f, -0.983472f, -0.983489f, -0.983507f,
+ -0.983524f, -0.983541f, -0.983559f, -0.983576f, -0.983593f, -0.983611f, -0.983628f, -0.983645f,
+ -0.983662f, -0.983680f, -0.983697f, -0.983714f, -0.983731f, -0.983749f, -0.983766f, -0.983783f,
+ -0.983800f, -0.983817f, -0.983835f, -0.983852f, -0.983869f, -0.983886f, -0.983903f, -0.983920f,
+ -0.983937f, -0.983955f, -0.983972f, -0.983989f, -0.984006f, -0.984023f, -0.984040f, -0.984057f,
+ -0.984074f, -0.984091f, -0.984108f, -0.984125f, -0.984142f, -0.984159f, -0.984176f, -0.984193f,
+ -0.984210f, -0.984227f, -0.984244f, -0.984261f, -0.984278f, -0.984295f, -0.984312f, -0.984329f,
+ -0.984346f, -0.984362f, -0.984379f, -0.984396f, -0.984413f, -0.984430f, -0.984447f, -0.984464f,
+ -0.984480f, -0.984497f, -0.984514f, -0.984531f, -0.984548f, -0.984564f, -0.984581f, -0.984598f,
+ -0.984615f, -0.984632f, -0.984648f, -0.984665f, -0.984682f, -0.984698f, -0.984715f, -0.984732f,
+ -0.984748f, -0.984765f, -0.984782f, -0.984798f, -0.984815f, -0.984832f, -0.984848f, -0.984865f,
+ -0.984882f, -0.984898f, -0.984915f, -0.984931f, -0.984948f, -0.984965f, -0.984981f, -0.984998f,
+ -0.985014f, -0.985031f, -0.985047f, -0.985064f, -0.985080f, -0.985097f, -0.985113f, -0.985130f,
+ -0.985146f, -0.985163f, -0.985179f, -0.985196f, -0.985212f, -0.985228f, -0.985245f, -0.985261f,
+ -0.985278f, -0.985294f, -0.985310f, -0.985327f, -0.985343f, -0.985359f, -0.985376f, -0.985392f,
+ -0.985408f, -0.985425f, -0.985441f, -0.985457f, -0.985474f, -0.985490f, -0.985506f, -0.985523f,
+ -0.985539f, -0.985555f, -0.985571f, -0.985587f, -0.985604f, -0.985620f, -0.985636f, -0.985652f,
+ -0.985668f, -0.985685f, -0.985701f, -0.985717f, -0.985733f, -0.985749f, -0.985765f, -0.985781f,
+ -0.985798f, -0.985814f, -0.985830f, -0.985846f, -0.985862f, -0.985878f, -0.985894f, -0.985910f,
+ -0.985926f, -0.985942f, -0.985958f, -0.985974f, -0.985990f, -0.986006f, -0.986022f, -0.986038f,
+ -0.986054f, -0.986070f, -0.986086f, -0.986102f, -0.986118f, -0.986134f, -0.986150f, -0.986165f,
+ -0.986181f, -0.986197f, -0.986213f, -0.986229f, -0.986245f, -0.986261f, -0.986276f, -0.986292f,
+ -0.986308f, -0.986324f, -0.986340f, -0.986355f, -0.986371f, -0.986387f, -0.986403f, -0.986419f,
+ -0.986434f, -0.986450f, -0.986466f, -0.986481f, -0.986497f, -0.986513f, -0.986529f, -0.986544f,
+ -0.986560f, -0.986576f, -0.986591f, -0.986607f, -0.986623f, -0.986638f, -0.986654f, -0.986669f,
+ -0.986685f, -0.986701f, -0.986716f, -0.986732f, -0.986747f, -0.986763f, -0.986778f, -0.986794f,
+ -0.986809f, -0.986825f, -0.986840f, -0.986856f, -0.986871f, -0.986887f, -0.986902f, -0.986918f,
+ -0.986933f, -0.986949f, -0.986964f, -0.986980f, -0.986995f, -0.987010f, -0.987026f, -0.987041f,
+ -0.987057f, -0.987072f, -0.987087f, -0.987103f, -0.987118f, -0.987133f, -0.987149f, -0.987164f,
+ -0.987179f, -0.987195f, -0.987210f, -0.987225f, -0.987240f, -0.987256f, -0.987271f, -0.987286f,
+ -0.987301f, -0.987317f, -0.987332f, -0.987347f, -0.987362f, -0.987377f, -0.987393f, -0.987408f,
+ -0.987423f, -0.987438f, -0.987453f, -0.987468f, -0.987484f, -0.987499f, -0.987514f, -0.987529f,
+ -0.987544f, -0.987559f, -0.987574f, -0.987589f, -0.987604f, -0.987619f, -0.987634f, -0.987649f,
+ -0.987664f, -0.987679f, -0.987694f, -0.987709f, -0.987724f, -0.987739f, -0.987754f, -0.987769f,
+ -0.987784f, -0.987799f, -0.987814f, -0.987829f, -0.987844f, -0.987859f, -0.987874f, -0.987889f,
+ -0.987903f, -0.987918f, -0.987933f, -0.987948f, -0.987963f, -0.987978f, -0.987992f, -0.988007f,
+ -0.988022f, -0.988037f, -0.988052f, -0.988066f, -0.988081f, -0.988096f, -0.988111f, -0.988125f,
+ -0.988140f, -0.988155f, -0.988169f, -0.988184f, -0.988199f, -0.988214f, -0.988228f, -0.988243f,
+ -0.988258f, -0.988272f, -0.988287f, -0.988301f, -0.988316f, -0.988331f, -0.988345f, -0.988360f,
+ -0.988374f, -0.988389f, -0.988404f, -0.988418f, -0.988433f, -0.988447f, -0.988462f, -0.988476f,
+ -0.988491f, -0.988505f, -0.988520f, -0.988534f, -0.988549f, -0.988563f, -0.988578f, -0.988592f,
+ -0.988607f, -0.988621f, -0.988635f, -0.988650f, -0.988664f, -0.988679f, -0.988693f, -0.988707f,
+ -0.988722f, -0.988736f, -0.988750f, -0.988765f, -0.988779f, -0.988793f, -0.988808f, -0.988822f,
+ -0.988836f, -0.988851f, -0.988865f, -0.988879f, -0.988893f, -0.988908f, -0.988922f, -0.988936f,
+ -0.988950f, -0.988964f, -0.988979f, -0.988993f, -0.989007f, -0.989021f, -0.989035f, -0.989050f,
+ -0.989064f, -0.989078f, -0.989092f, -0.989106f, -0.989120f, -0.989134f, -0.989148f, -0.989162f,
+ -0.989177f, -0.989191f, -0.989205f, -0.989219f, -0.989233f, -0.989247f, -0.989261f, -0.989275f,
+ -0.989289f, -0.989303f, -0.989317f, -0.989331f, -0.989345f, -0.989359f, -0.989373f, -0.989386f,
+ -0.989400f, -0.989414f, -0.989428f, -0.989442f, -0.989456f, -0.989470f, -0.989484f, -0.989498f,
+ -0.989511f, -0.989525f, -0.989539f, -0.989553f, -0.989567f, -0.989581f, -0.989594f, -0.989608f,
+ -0.989622f, -0.989636f, -0.989650f, -0.989663f, -0.989677f, -0.989691f, -0.989704f, -0.989718f,
+ -0.989732f, -0.989746f, -0.989759f, -0.989773f, -0.989787f, -0.989800f, -0.989814f, -0.989828f,
+ -0.989841f, -0.989855f, -0.989869f, -0.989882f, -0.989896f, -0.989909f, -0.989923f, -0.989936f,
+ -0.989950f, -0.989964f, -0.989977f, -0.989991f, -0.990004f, -0.990018f, -0.990031f, -0.990045f,
+ -0.990058f, -0.990072f, -0.990085f, -0.990099f, -0.990112f, -0.990126f, -0.990139f, -0.990152f,
+ -0.990166f, -0.990179f, -0.990193f, -0.990206f, -0.990219f, -0.990233f, -0.990246f, -0.990259f,
+ -0.990273f, -0.990286f, -0.990299f, -0.990313f, -0.990326f, -0.990339f, -0.990353f, -0.990366f,
+ -0.990379f, -0.990393f, -0.990406f, -0.990419f, -0.990432f, -0.990445f, -0.990459f, -0.990472f,
+ -0.990485f, -0.990498f, -0.990511f, -0.990525f, -0.990538f, -0.990551f, -0.990564f, -0.990577f,
+ -0.990590f, -0.990603f, -0.990617f, -0.990630f, -0.990643f, -0.990656f, -0.990669f, -0.990682f,
+ -0.990695f, -0.990708f, -0.990721f, -0.990734f, -0.990747f, -0.990760f, -0.990773f, -0.990786f,
+ -0.990799f, -0.990812f, -0.990825f, -0.990838f, -0.990851f, -0.990864f, -0.990877f, -0.990890f,
+ -0.990903f, -0.990916f, -0.990928f, -0.990941f, -0.990954f, -0.990967f, -0.990980f, -0.990993f,
+ -0.991006f, -0.991018f, -0.991031f, -0.991044f, -0.991057f, -0.991070f, -0.991082f, -0.991095f,
+ -0.991108f, -0.991121f, -0.991133f, -0.991146f, -0.991159f, -0.991172f, -0.991184f, -0.991197f,
+ -0.991210f, -0.991222f, -0.991235f, -0.991248f, -0.991260f, -0.991273f, -0.991286f, -0.991298f,
+ -0.991311f, -0.991323f, -0.991336f, -0.991349f, -0.991361f, -0.991374f, -0.991386f, -0.991399f,
+ -0.991411f, -0.991424f, -0.991437f, -0.991449f, -0.991462f, -0.991474f, -0.991487f, -0.991499f,
+ -0.991511f, -0.991524f, -0.991536f, -0.991549f, -0.991561f, -0.991574f, -0.991586f, -0.991598f,
+ -0.991611f, -0.991623f, -0.991636f, -0.991648f, -0.991660f, -0.991673f, -0.991685f, -0.991697f,
+ -0.991710f, -0.991722f, -0.991734f, -0.991747f, -0.991759f, -0.991771f, -0.991783f, -0.991796f,
+ -0.991808f, -0.991820f, -0.991832f, -0.991845f, -0.991857f, -0.991869f, -0.991881f, -0.991894f,
+ -0.991906f, -0.991918f, -0.991930f, -0.991942f, -0.991954f, -0.991966f, -0.991979f, -0.991991f,
+ -0.992003f, -0.992015f, -0.992027f, -0.992039f, -0.992051f, -0.992063f, -0.992075f, -0.992087f,
+ -0.992099f, -0.992111f, -0.992123f, -0.992135f, -0.992147f, -0.992159f, -0.992171f, -0.992183f,
+ -0.992195f, -0.992207f, -0.992219f, -0.992231f, -0.992243f, -0.992255f, -0.992267f, -0.992279f,
+ -0.992291f, -0.992302f, -0.992314f, -0.992326f, -0.992338f, -0.992350f, -0.992362f, -0.992374f,
+ -0.992385f, -0.992397f, -0.992409f, -0.992421f, -0.992433f, -0.992444f, -0.992456f, -0.992468f,
+ -0.992480f, -0.992491f, -0.992503f, -0.992515f, -0.992526f, -0.992538f, -0.992550f, -0.992561f,
+ -0.992573f, -0.992585f, -0.992596f, -0.992608f, -0.992620f, -0.992631f, -0.992643f, -0.992655f,
+ -0.992666f, -0.992678f, -0.992689f, -0.992701f, -0.992712f, -0.992724f, -0.992736f, -0.992747f,
+ -0.992759f, -0.992770f, -0.992782f, -0.992793f, -0.992805f, -0.992816f, -0.992828f, -0.992839f,
+ -0.992850f, -0.992862f, -0.992873f, -0.992885f, -0.992896f, -0.992908f, -0.992919f, -0.992930f,
+ -0.992942f, -0.992953f, -0.992964f, -0.992976f, -0.992987f, -0.992998f, -0.993010f, -0.993021f,
+ -0.993032f, -0.993044f, -0.993055f, -0.993066f, -0.993077f, -0.993089f, -0.993100f, -0.993111f,
+ -0.993122f, -0.993134f, -0.993145f, -0.993156f, -0.993167f, -0.993178f, -0.993190f, -0.993201f,
+ -0.993212f, -0.993223f, -0.993234f, -0.993245f, -0.993257f, -0.993268f, -0.993279f, -0.993290f,
+ -0.993301f, -0.993312f, -0.993323f, -0.993334f, -0.993345f, -0.993356f, -0.993367f, -0.993378f,
+ -0.993389f, -0.993400f, -0.993411f, -0.993422f, -0.993433f, -0.993444f, -0.993455f, -0.993466f,
+ -0.993477f, -0.993488f, -0.993499f, -0.993510f, -0.993521f, -0.993532f, -0.993542f, -0.993553f,
+ -0.993564f, -0.993575f, -0.993586f, -0.993597f, -0.993608f, -0.993618f, -0.993629f, -0.993640f,
+ -0.993651f, -0.993662f, -0.993672f, -0.993683f, -0.993694f, -0.993705f, -0.993715f, -0.993726f,
+ -0.993737f, -0.993747f, -0.993758f, -0.993769f, -0.993779f, -0.993790f, -0.993801f, -0.993811f,
+ -0.993822f, -0.993833f, -0.993843f, -0.993854f, -0.993865f, -0.993875f, -0.993886f, -0.993896f,
+ -0.993907f, -0.993918f, -0.993928f, -0.993939f, -0.993949f, -0.993960f, -0.993970f, -0.993981f,
+ -0.993991f, -0.994002f, -0.994012f, -0.994023f, -0.994033f, -0.994044f, -0.994054f, -0.994064f,
+ -0.994075f, -0.994085f, -0.994096f, -0.994106f, -0.994116f, -0.994127f, -0.994137f, -0.994148f,
+ -0.994158f, -0.994168f, -0.994179f, -0.994189f, -0.994199f, -0.994210f, -0.994220f, -0.994230f,
+ -0.994240f, -0.994251f, -0.994261f, -0.994271f, -0.994281f, -0.994292f, -0.994302f, -0.994312f,
+ -0.994322f, -0.994333f, -0.994343f, -0.994353f, -0.994363f, -0.994373f, -0.994383f, -0.994394f,
+ -0.994404f, -0.994414f, -0.994424f, -0.994434f, -0.994444f, -0.994454f, -0.994464f, -0.994474f,
+ -0.994484f, -0.994494f, -0.994505f, -0.994515f, -0.994525f, -0.994535f, -0.994545f, -0.994555f,
+ -0.994565f, -0.994575f, -0.994585f, -0.994594f, -0.994604f, -0.994614f, -0.994624f, -0.994634f,
+ -0.994644f, -0.994654f, -0.994664f, -0.994674f, -0.994684f, -0.994694f, -0.994703f, -0.994713f,
+ -0.994723f, -0.994733f, -0.994743f, -0.994753f, -0.994762f, -0.994772f, -0.994782f, -0.994792f,
+ -0.994802f, -0.994811f, -0.994821f, -0.994831f, -0.994841f, -0.994850f, -0.994860f, -0.994870f,
+ -0.994879f, -0.994889f, -0.994899f, -0.994908f, -0.994918f, -0.994928f, -0.994937f, -0.994947f,
+ -0.994957f, -0.994966f, -0.994976f, -0.994985f, -0.994995f, -0.995005f, -0.995014f, -0.995024f,
+ -0.995033f, -0.995043f, -0.995052f, -0.995062f, -0.995071f, -0.995081f, -0.995090f, -0.995100f,
+ -0.995109f, -0.995119f, -0.995128f, -0.995138f, -0.995147f, -0.995156f, -0.995166f, -0.995175f,
+ -0.995185f, -0.995194f, -0.995203f, -0.995213f, -0.995222f, -0.995232f, -0.995241f, -0.995250f,
+ -0.995260f, -0.995269f, -0.995278f, -0.995288f, -0.995297f, -0.995306f, -0.995315f, -0.995325f,
+ -0.995334f, -0.995343f, -0.995352f, -0.995362f, -0.995371f, -0.995380f, -0.995389f, -0.995398f,
+ -0.995408f, -0.995417f, -0.995426f, -0.995435f, -0.995444f, -0.995453f, -0.995463f, -0.995472f,
+ -0.995481f, -0.995490f, -0.995499f, -0.995508f, -0.995517f, -0.995526f, -0.995535f, -0.995544f,
+ -0.995553f, -0.995562f, -0.995571f, -0.995580f, -0.995589f, -0.995598f, -0.995607f, -0.995616f,
+ -0.995625f, -0.995634f, -0.995643f, -0.995652f, -0.995661f, -0.995670f, -0.995679f, -0.995688f,
+ -0.995697f, -0.995705f, -0.995714f, -0.995723f, -0.995732f, -0.995741f, -0.995750f, -0.995759f,
+ -0.995767f, -0.995776f, -0.995785f, -0.995794f, -0.995803f, -0.995811f, -0.995820f, -0.995829f,
+ -0.995838f, -0.995846f, -0.995855f, -0.995864f, -0.995872f, -0.995881f, -0.995890f, -0.995899f,
+ -0.995907f, -0.995916f, -0.995925f, -0.995933f, -0.995942f, -0.995950f, -0.995959f, -0.995968f,
+ -0.995976f, -0.995985f, -0.995993f, -0.996002f, -0.996011f, -0.996019f, -0.996028f, -0.996036f,
+ -0.996045f, -0.996053f, -0.996062f, -0.996070f, -0.996079f, -0.996087f, -0.996096f, -0.996104f,
+ -0.996113f, -0.996121f, -0.996129f, -0.996138f, -0.996146f, -0.996155f, -0.996163f, -0.996171f,
+ -0.996180f, -0.996188f, -0.996197f, -0.996205f, -0.996213f, -0.996222f, -0.996230f, -0.996238f,
+ -0.996247f, -0.996255f, -0.996263f, -0.996271f, -0.996280f, -0.996288f, -0.996296f, -0.996304f,
+ -0.996313f, -0.996321f, -0.996329f, -0.996337f, -0.996345f, -0.996354f, -0.996362f, -0.996370f,
+ -0.996378f, -0.996386f, -0.996394f, -0.996403f, -0.996411f, -0.996419f, -0.996427f, -0.996435f,
+ -0.996443f, -0.996451f, -0.996459f, -0.996467f, -0.996475f, -0.996483f, -0.996491f, -0.996499f,
+ -0.996507f, -0.996515f, -0.996523f, -0.996531f, -0.996539f, -0.996547f, -0.996555f, -0.996563f,
+ -0.996571f, -0.996579f, -0.996587f, -0.996595f, -0.996603f, -0.996611f, -0.996619f, -0.996626f,
+ -0.996634f, -0.996642f, -0.996650f, -0.996658f, -0.996666f, -0.996674f, -0.996681f, -0.996689f,
+ -0.996697f, -0.996705f, -0.996712f, -0.996720f, -0.996728f, -0.996736f, -0.996743f, -0.996751f,
+ -0.996759f, -0.996767f, -0.996774f, -0.996782f, -0.996790f, -0.996797f, -0.996805f, -0.996813f,
+ -0.996820f, -0.996828f, -0.996836f, -0.996843f, -0.996851f, -0.996858f, -0.996866f, -0.996874f,
+ -0.996881f, -0.996889f, -0.996896f, -0.996904f, -0.996911f, -0.996919f, -0.996926f, -0.996934f,
+ -0.996941f, -0.996949f, -0.996956f, -0.996964f, -0.996971f, -0.996979f, -0.996986f, -0.996994f,
+ -0.997001f, -0.997008f, -0.997016f, -0.997023f, -0.997031f, -0.997038f, -0.997045f, -0.997053f,
+ -0.997060f, -0.997067f, -0.997075f, -0.997082f, -0.997089f, -0.997097f, -0.997104f, -0.997111f,
+ -0.997119f, -0.997126f, -0.997133f, -0.997140f, -0.997148f, -0.997155f, -0.997162f, -0.997169f,
+ -0.997176f, -0.997184f, -0.997191f, -0.997198f, -0.997205f, -0.997212f, -0.997219f, -0.997227f,
+ -0.997234f, -0.997241f, -0.997248f, -0.997255f, -0.997262f, -0.997269f, -0.997276f, -0.997283f,
+ -0.997290f, -0.997298f, -0.997305f, -0.997312f, -0.997319f, -0.997326f, -0.997333f, -0.997340f,
+ -0.997347f, -0.997354f, -0.997361f, -0.997368f, -0.997374f, -0.997381f, -0.997388f, -0.997395f,
+ -0.997402f, -0.997409f, -0.997416f, -0.997423f, -0.997430f, -0.997437f, -0.997443f, -0.997450f,
+ -0.997457f, -0.997464f, -0.997471f, -0.997478f, -0.997484f, -0.997491f, -0.997498f, -0.997505f,
+ -0.997511f, -0.997518f, -0.997525f, -0.997532f, -0.997538f, -0.997545f, -0.997552f, -0.997559f,
+ -0.997565f, -0.997572f, -0.997579f, -0.997585f, -0.997592f, -0.997599f, -0.997605f, -0.997612f,
+ -0.997618f, -0.997625f, -0.997632f, -0.997638f, -0.997645f, -0.997651f, -0.997658f, -0.997665f,
+ -0.997671f, -0.997678f, -0.997684f, -0.997691f, -0.997697f, -0.997704f, -0.997710f, -0.997717f,
+ -0.997723f, -0.997730f, -0.997736f, -0.997742f, -0.997749f, -0.997755f, -0.997762f, -0.997768f,
+ -0.997774f, -0.997781f, -0.997787f, -0.997794f, -0.997800f, -0.997806f, -0.997813f, -0.997819f,
+ -0.997825f, -0.997832f, -0.997838f, -0.997844f, -0.997851f, -0.997857f, -0.997863f, -0.997869f,
+ -0.997876f, -0.997882f, -0.997888f, -0.997894f, -0.997901f, -0.997907f, -0.997913f, -0.997919f,
+ -0.997925f, -0.997931f, -0.997938f, -0.997944f, -0.997950f, -0.997956f, -0.997962f, -0.997968f,
+ -0.997974f, -0.997980f, -0.997987f, -0.997993f, -0.997999f, -0.998005f, -0.998011f, -0.998017f,
+ -0.998023f, -0.998029f, -0.998035f, -0.998041f, -0.998047f, -0.998053f, -0.998059f, -0.998065f,
+ -0.998071f, -0.998077f, -0.998083f, -0.998089f, -0.998094f, -0.998100f, -0.998106f, -0.998112f,
+ -0.998118f, -0.998124f, -0.998130f, -0.998136f, -0.998142f, -0.998147f, -0.998153f, -0.998159f,
+ -0.998165f, -0.998171f, -0.998176f, -0.998182f, -0.998188f, -0.998194f, -0.998200f, -0.998205f,
+ -0.998211f, -0.998217f, -0.998222f, -0.998228f, -0.998234f, -0.998240f, -0.998245f, -0.998251f,
+ -0.998257f, -0.998262f, -0.998268f, -0.998273f, -0.998279f, -0.998285f, -0.998290f, -0.998296f,
+ -0.998302f, -0.998307f, -0.998313f, -0.998318f, -0.998324f, -0.998329f, -0.998335f, -0.998340f,
+ -0.998346f, -0.998351f, -0.998357f, -0.998362f, -0.998368f, -0.998373f, -0.998379f, -0.998384f,
+ -0.998390f, -0.998395f, -0.998401f, -0.998406f, -0.998411f, -0.998417f, -0.998422f, -0.998428f,
+ -0.998433f, -0.998438f, -0.998444f, -0.998449f, -0.998454f, -0.998460f, -0.998465f, -0.998470f,
+ -0.998476f, -0.998481f, -0.998486f, -0.998491f, -0.998497f, -0.998502f, -0.998507f, -0.998512f,
+ -0.998518f, -0.998523f, -0.998528f, -0.998533f, -0.998538f, -0.998544f, -0.998549f, -0.998554f,
+ -0.998559f, -0.998564f, -0.998569f, -0.998574f, -0.998580f, -0.998585f, -0.998590f, -0.998595f,
+ -0.998600f, -0.998605f, -0.998610f, -0.998615f, -0.998620f, -0.998625f, -0.998630f, -0.998635f,
+ -0.998640f, -0.998645f, -0.998650f, -0.998655f, -0.998660f, -0.998665f, -0.998670f, -0.998675f,
+ -0.998680f, -0.998685f, -0.998690f, -0.998695f, -0.998700f, -0.998704f, -0.998709f, -0.998714f,
+ -0.998719f, -0.998724f, -0.998729f, -0.998734f, -0.998738f, -0.998743f, -0.998748f, -0.998753f,
+ -0.998758f, -0.998762f, -0.998767f, -0.998772f, -0.998777f, -0.998781f, -0.998786f, -0.998791f,
+ -0.998795f, -0.998800f, -0.998805f, -0.998810f, -0.998814f, -0.998819f, -0.998824f, -0.998828f,
+ -0.998833f, -0.998837f, -0.998842f, -0.998847f, -0.998851f, -0.998856f, -0.998860f, -0.998865f,
+ -0.998870f, -0.998874f, -0.998879f, -0.998883f, -0.998888f, -0.998892f, -0.998897f, -0.998901f,
+ -0.998906f, -0.998910f, -0.998915f, -0.998919f, -0.998924f, -0.998928f, -0.998932f, -0.998937f,
+ -0.998941f, -0.998946f, -0.998950f, -0.998954f, -0.998959f, -0.998963f, -0.998968f, -0.998972f,
+ -0.998976f, -0.998981f, -0.998985f, -0.998989f, -0.998994f, -0.998998f, -0.999002f, -0.999006f,
+ -0.999011f, -0.999015f, -0.999019f, -0.999023f, -0.999028f, -0.999032f, -0.999036f, -0.999040f,
+ -0.999044f, -0.999049f, -0.999053f, -0.999057f, -0.999061f, -0.999065f, -0.999069f, -0.999074f,
+ -0.999078f, -0.999082f, -0.999086f, -0.999090f, -0.999094f, -0.999098f, -0.999102f, -0.999106f,
+ -0.999110f, -0.999114f, -0.999118f, -0.999122f, -0.999126f, -0.999130f, -0.999134f, -0.999138f,
+ -0.999142f, -0.999146f, -0.999150f, -0.999154f, -0.999158f, -0.999162f, -0.999166f, -0.999170f,
+ -0.999174f, -0.999178f, -0.999182f, -0.999186f, -0.999189f, -0.999193f, -0.999197f, -0.999201f,
+ -0.999205f, -0.999209f, -0.999212f, -0.999216f, -0.999220f, -0.999224f, -0.999228f, -0.999231f,
+ -0.999235f, -0.999239f, -0.999243f, -0.999246f, -0.999250f, -0.999254f, -0.999257f, -0.999261f,
+ -0.999265f, -0.999268f, -0.999272f, -0.999276f, -0.999279f, -0.999283f, -0.999287f, -0.999290f,
+ -0.999294f, -0.999297f, -0.999301f, -0.999305f, -0.999308f, -0.999312f, -0.999315f, -0.999319f,
+ -0.999322f, -0.999326f, -0.999329f, -0.999333f, -0.999336f, -0.999340f, -0.999343f, -0.999347f,
+ -0.999350f, -0.999354f, -0.999357f, -0.999361f, -0.999364f, -0.999367f, -0.999371f, -0.999374f,
+ -0.999378f, -0.999381f, -0.999384f, -0.999388f, -0.999391f, -0.999394f, -0.999398f, -0.999401f,
+ -0.999404f, -0.999408f, -0.999411f, -0.999414f, -0.999418f, -0.999421f, -0.999424f, -0.999427f,
+ -0.999431f, -0.999434f, -0.999437f, -0.999440f, -0.999443f, -0.999447f, -0.999450f, -0.999453f,
+ -0.999456f, -0.999459f, -0.999462f, -0.999466f, -0.999469f, -0.999472f, -0.999475f, -0.999478f,
+ -0.999481f, -0.999484f, -0.999487f, -0.999490f, -0.999493f, -0.999497f, -0.999500f, -0.999503f,
+ -0.999506f, -0.999509f, -0.999512f, -0.999515f, -0.999518f, -0.999521f, -0.999524f, -0.999527f,
+ -0.999529f, -0.999532f, -0.999535f, -0.999538f, -0.999541f, -0.999544f, -0.999547f, -0.999550f,
+ -0.999553f, -0.999556f, -0.999558f, -0.999561f, -0.999564f, -0.999567f, -0.999570f, -0.999573f,
+ -0.999575f, -0.999578f, -0.999581f, -0.999584f, -0.999586f, -0.999589f, -0.999592f, -0.999595f,
+ -0.999597f, -0.999600f, -0.999603f, -0.999605f, -0.999608f, -0.999611f, -0.999614f, -0.999616f,
+ -0.999619f, -0.999621f, -0.999624f, -0.999627f, -0.999629f, -0.999632f, -0.999635f, -0.999637f,
+ -0.999640f, -0.999642f, -0.999645f, -0.999647f, -0.999650f, -0.999652f, -0.999655f, -0.999658f,
+ -0.999660f, -0.999663f, -0.999665f, -0.999667f, -0.999670f, -0.999672f, -0.999675f, -0.999677f,
+ -0.999680f, -0.999682f, -0.999685f, -0.999687f, -0.999689f, -0.999692f, -0.999694f, -0.999696f,
+ -0.999699f, -0.999701f, -0.999704f, -0.999706f, -0.999708f, -0.999710f, -0.999713f, -0.999715f,
+ -0.999717f, -0.999720f, -0.999722f, -0.999724f, -0.999726f, -0.999729f, -0.999731f, -0.999733f,
+ -0.999735f, -0.999738f, -0.999740f, -0.999742f, -0.999744f, -0.999746f, -0.999748f, -0.999750f,
+ -0.999753f, -0.999755f, -0.999757f, -0.999759f, -0.999761f, -0.999763f, -0.999765f, -0.999767f,
+ -0.999769f, -0.999771f, -0.999774f, -0.999776f, -0.999778f, -0.999780f, -0.999782f, -0.999784f,
+ -0.999786f, -0.999788f, -0.999790f, -0.999792f, -0.999793f, -0.999795f, -0.999797f, -0.999799f,
+ -0.999801f, -0.999803f, -0.999805f, -0.999807f, -0.999809f, -0.999811f, -0.999812f, -0.999814f,
+ -0.999816f, -0.999818f, -0.999820f, -0.999822f, -0.999823f, -0.999825f, -0.999827f, -0.999829f,
+ -0.999831f, -0.999832f, -0.999834f, -0.999836f, -0.999838f, -0.999839f, -0.999841f, -0.999843f,
+ -0.999844f, -0.999846f, -0.999848f, -0.999849f, -0.999851f, -0.999853f, -0.999854f, -0.999856f,
+ -0.999858f, -0.999859f, -0.999861f, -0.999862f, -0.999864f, -0.999866f, -0.999867f, -0.999869f,
+ -0.999870f, -0.999872f, -0.999873f, -0.999875f, -0.999876f, -0.999878f, -0.999879f, -0.999881f,
+ -0.999882f, -0.999884f, -0.999885f, -0.999887f, -0.999888f, -0.999890f, -0.999891f, -0.999892f,
+ -0.999894f, -0.999895f, -0.999897f, -0.999898f, -0.999899f, -0.999901f, -0.999902f, -0.999903f,
+ -0.999905f, -0.999906f, -0.999907f, -0.999909f, -0.999910f, -0.999911f, -0.999913f, -0.999914f,
+ -0.999915f, -0.999916f, -0.999917f, -0.999919f, -0.999920f, -0.999921f, -0.999922f, -0.999924f,
+ -0.999925f, -0.999926f, -0.999927f, -0.999928f, -0.999929f, -0.999930f, -0.999932f, -0.999933f,
+ -0.999934f, -0.999935f, -0.999936f, -0.999937f, -0.999938f, -0.999939f, -0.999940f, -0.999941f,
+ -0.999942f, -0.999943f, -0.999944f, -0.999945f, -0.999946f, -0.999947f, -0.999948f, -0.999949f,
+ -0.999950f, -0.999951f, -0.999952f, -0.999953f, -0.999954f, -0.999955f, -0.999956f, -0.999957f,
+ -0.999958f, -0.999959f, -0.999959f, -0.999960f, -0.999961f, -0.999962f, -0.999963f, -0.999964f,
+ -0.999964f, -0.999965f, -0.999966f, -0.999967f, -0.999968f, -0.999968f, -0.999969f, -0.999970f,
+ -0.999971f, -0.999971f, -0.999972f, -0.999973f, -0.999973f, -0.999974f, -0.999975f, -0.999976f,
+ -0.999976f, -0.999977f, -0.999977f, -0.999978f, -0.999979f, -0.999979f, -0.999980f, -0.999981f,
+ -0.999981f, -0.999982f, -0.999982f, -0.999983f, -0.999983f, -0.999984f, -0.999985f, -0.999985f,
+ -0.999986f, -0.999986f, -0.999987f, -0.999987f, -0.999988f, -0.999988f, -0.999988f, -0.999989f,
+ -0.999989f, -0.999990f, -0.999990f, -0.999991f, -0.999991f, -0.999991f, -0.999992f, -0.999992f,
+ -0.999993f, -0.999993f, -0.999993f, -0.999994f, -0.999994f, -0.999994f, -0.999995f, -0.999995f,
+ -0.999995f, -0.999996f, -0.999996f, -0.999996f, -0.999996f, -0.999997f, -0.999997f, -0.999997f,
+ -0.999997f, -0.999998f, -0.999998f, -0.999998f, -0.999998f, -0.999998f, -0.999999f, -0.999999f,
+ -0.999999f, -0.999999f, -0.999999f, -0.999999f, -0.999999f, -0.999999f, -1.000000f, -1.000000f,
+ -1.000000f, -1.000000f, -1.000000f, -1.000000f, -1.000000f, -1.000000f, -1.000000f, -1.000000f
+};
+
+static const float *sinTables[17] = {
+ 0 , 0 , 0 , 0 ,
+ sinTable16 , sinTable32 , sinTable64 , sinTable128 ,
+ sinTable256 , sinTable512 , sinTable1024 , sinTable2048 ,
+ sinTable4096, sinTable8192, sinTable16384, sinTable32768,
+ sinTable65536
+};
+
+const float *getSineTable(int bits) {
+ assert((bits >= 4) && (bits <= 16));
+
+ return sinTables[bits];
+}
+
+} // End of namespace Common
diff --git a/common/sinetables.h b/common/sinetables.h
new file mode 100644
index 0000000000..28918838f4
--- /dev/null
+++ b/common/sinetables.h
@@ -0,0 +1,37 @@
+/* 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 COMMON_SINETABLES_H
+#define COMMON_SINETABLES_H
+
+namespace Common {
+
+/**
+ * Get a sine table with the specified bit precision
+ *
+ * @param bits Precision of the table, which must be in range [4, 16]
+ */
+const float *getSineTable(int bits);
+
+} // End of namespace Common
+
+#endif // COMMON_SINETABLES_H
diff --git a/common/singleton.h b/common/singleton.h
index 2f5fa41877..43f1c0c4d0 100644
--- a/common/singleton.h
+++ b/common/singleton.h
@@ -89,15 +89,13 @@ protected:
};
/**
- * Note that you need to use this macro from the global namespace.
+ * Note that you need to use this macro from the Common namespace.
*
* This is because C++ requires initial explicit specialization
* to be placed in the same namespace as the template.
- * It has to be put in the global namespace to assure the correct
- * namespace Common is referenced.
*/
#define DECLARE_SINGLETON(T) \
- template<> T *Common::Singleton<T>::_singleton = 0
+ template<> T *Singleton<T>::_singleton = 0
} // End of namespace Common
diff --git a/common/str.cpp b/common/str.cpp
index a2cd4a0193..32f4b44e79 100644
--- a/common/str.cpp
+++ b/common/str.cpp
@@ -405,7 +405,7 @@ void String::trim() {
makeUnique();
// Trim trailing whitespace
- while (_size >= 1 && isspace(_str[_size - 1]))
+ while (_size >= 1 && isspace(static_cast<unsigned char>(_str[_size - 1])))
--_size;
_str[_size] = 0;
@@ -606,14 +606,14 @@ String operator+(const String &x, char y) {
}
char *ltrim(char *t) {
- while (isspace(*t))
+ while (isspace(static_cast<unsigned char>(*t)))
t++;
return t;
}
char *rtrim(char *t) {
int l = strlen(t) - 1;
- while (l >= 0 && isspace(t[l]))
+ while (l >= 0 && isspace(static_cast<unsigned char>(t[l])))
t[l--] = 0;
return t;
}
diff --git a/common/str.h b/common/str.h
index 8e07b6233d..5039130707 100644
--- a/common/str.h
+++ b/common/str.h
@@ -219,14 +219,14 @@ public:
* except that it stores the result in (variably sized) String
* instead of a fixed size buffer.
*/
- static Common::String format(const char *fmt, ...) GCC_PRINTF(1,2);
+ static String format(const char *fmt, ...) GCC_PRINTF(1,2);
/**
* Print formatted data into a String object. Similar to vsprintf,
* except that it stores the result in (variably sized) String
* instead of a fixed size buffer.
*/
- static Common::String vformat(const char *fmt, va_list args);
+ static String vformat(const char *fmt, va_list args);
public:
typedef char * iterator;
@@ -293,7 +293,7 @@ extern char *trim(char *t);
* @param sep character used to separate path components
* @return The last component of the path.
*/
-Common::String lastPathComponent(const Common::String &path, const char sep);
+String lastPathComponent(const String &path, const char sep);
/**
* Normalize a given path to a canonical form. In particular:
@@ -307,7 +307,7 @@ Common::String lastPathComponent(const Common::String &path, const char sep);
* @param sep the separator token (usually '/' on Unix-style systems, or '\\' on Windows based stuff)
* @return the normalized path
*/
-Common::String normalizePath(const Common::String &path, const char sep);
+String normalizePath(const String &path, const char sep);
/**
diff --git a/common/stream.cpp b/common/stream.cpp
index 60b40d0df2..30b3bca497 100644
--- a/common/stream.cpp
+++ b/common/stream.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/memstream.h"
#include "common/substream.h"
@@ -258,8 +259,7 @@ namespace {
*/
class BufferedReadStream : virtual public ReadStream {
protected:
- ReadStream *_parentStream;
- DisposeAfterUse::Flag _disposeParentStream;
+ DisposablePtr<ReadStream> _parentStream;
byte *_buf;
uint32 _pos;
bool _eos; // end of stream
@@ -278,8 +278,7 @@ public:
};
BufferedReadStream::BufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream)
- : _parentStream(parentStream),
- _disposeParentStream(disposeParentStream),
+ : _parentStream(parentStream, disposeParentStream),
_pos(0),
_eos(false),
_bufSize(0),
@@ -291,8 +290,6 @@ BufferedReadStream::BufferedReadStream(ReadStream *parentStream, uint32 bufSize,
}
BufferedReadStream::~BufferedReadStream() {
- if (_disposeParentStream)
- delete _parentStream;
delete[] _buf;
}
diff --git a/common/substream.h b/common/substream.h
index f4f79ff02f..7e67389da1 100644
--- a/common/substream.h
+++ b/common/substream.h
@@ -23,6 +23,7 @@
#ifndef COMMON_SUBSTREAM_H
#define COMMON_SUBSTREAM_H
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/types.h"
@@ -38,24 +39,18 @@ namespace Common {
*/
class SubReadStream : virtual public ReadStream {
protected:
- ReadStream *_parentStream;
- DisposeAfterUse::Flag _disposeParentStream;
+ DisposablePtr<ReadStream> _parentStream;
uint32 _pos;
uint32 _end;
bool _eos;
public:
SubReadStream(ReadStream *parentStream, uint32 end, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO)
- : _parentStream(parentStream),
- _disposeParentStream(disposeParentStream),
+ : _parentStream(parentStream, disposeParentStream),
_pos(0),
_end(end),
_eos(false) {
assert(parentStream);
}
- ~SubReadStream() {
- if (_disposeParentStream)
- delete _parentStream;
- }
virtual bool eos() const { return _eos | _parentStream->eos(); }
virtual bool err() const { return _parentStream->err(); }
diff --git a/common/system.cpp b/common/system.cpp
index 8d5bfd39cd..59210544ab 100644
--- a/common/system.cpp
+++ b/common/system.cpp
@@ -28,6 +28,7 @@
#include "common/savefile.h"
#include "common/str.h"
#include "common/taskbar.h"
+#include "common/updates.h"
#include "common/textconsole.h"
#include "backends/audiocd/default/default-audiocd.h"
@@ -44,6 +45,9 @@ OSystem::OSystem() {
#if defined(USE_TASKBAR)
_taskbarManager = 0;
#endif
+#if defined(USE_UPDATES)
+ _updateManager = 0;
+#endif
_fsFactory = 0;
}
@@ -62,6 +66,11 @@ OSystem::~OSystem() {
_taskbarManager = 0;
#endif
+#if defined(USE_UPDATES)
+ delete _updateManager;
+ _updateManager = 0;
+#endif
+
delete _savefileManager;
_savefileManager = 0;
diff --git a/common/system.h b/common/system.h
index 15fbe386b1..413fe326a7 100644
--- a/common/system.h
+++ b/common/system.h
@@ -45,6 +45,9 @@ class String;
#if defined(USE_TASKBAR)
class TaskbarManager;
#endif
+#if defined(USE_UPDATES)
+class UpdateManager;
+#endif
class TimerManager;
class SeekableReadStream;
class WriteStream;
@@ -154,13 +157,22 @@ protected:
#if defined(USE_TASKBAR)
/**
- * No default value is provided for _savefileManager by OSystem.
+ * No default value is provided for _taskbarManager by OSystem.
*
- * @note _savefileManager is deleted by the OSystem destructor.
+ * @note _taskbarManager is deleted by the OSystem destructor.
*/
Common::TaskbarManager *_taskbarManager;
#endif
+#if defined(USE_UPDATES)
+ /**
+ * No default value is provided for _updateManager by OSystem.
+ *
+ * @note _updateManager is deleted by the OSystem destructor.
+ */
+ Common::UpdateManager *_updateManager;
+#endif
+
/**
* No default value is provided for _fsFactory by OSystem.
*
@@ -391,6 +403,11 @@ public:
* factor 2x, too, just like the game graphics. But if it has a
* cursorTargetScale of 2, then it shouldn't be scaled again by
* the game graphics scaler.
+ *
+ * On a note for OSystem users here. We do not require our graphics
+ * to be thread safe and in fact most/all backends using OpenGL are
+ * not. So do *not* try to call any of these functions from a timer
+ * and/or audio callback (like readBuffer of AudioStreams).
*/
//@{
@@ -1071,6 +1088,18 @@ public:
}
#endif
+#if defined(USE_UPDATES)
+ /**
+ * Returns the UpdateManager, used to handle auto-updating,
+ * and updating of ScummVM in general.
+ *
+ * @return the UpdateManager for the current architecture
+ */
+ virtual Common::UpdateManager *getUpdateManager() {
+ return _updateManager;
+ }
+#endif
+
/**
* Returns the FilesystemFactory object, depending on the current architecture.
*
diff --git a/common/taskbar.h b/common/taskbar.h
index 023227e5e0..ba99d4e487 100644
--- a/common/taskbar.h
+++ b/common/taskbar.h
@@ -18,8 +18,6 @@
* 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 COMMON_TASKBAR_MANAGER_H
@@ -124,6 +122,18 @@ public:
*/
virtual void addRecent(const String &name, const String &description) {}
+ /**
+ * Notifies the user an error occured through the taskbar icon
+ *
+ * This will for example show the taskbar icon as red (using progress of 100% and an error state)
+ * on Windows, and set the launcher icon in the urgent state on Unity
+ */
+ virtual void notifyError() {}
+
+ /**
+ * Clears the error notification
+ */
+ virtual void clearError() {}
};
} // End of namespace Common
diff --git a/common/timer.h b/common/timer.h
index 40438f078c..3db32df76a 100644
--- a/common/timer.h
+++ b/common/timer.h
@@ -23,6 +23,7 @@
#define COMMON_TIMER_H
#include "common/scummsys.h"
+#include "common/str.h"
#include "common/noncopyable.h"
namespace Common {
@@ -43,9 +44,10 @@ public:
* @param proc the callback
* @param interval the interval in which the timer shall be invoked (in microseconds)
* @param refCon an arbitrary void pointer; will be passed to the timer callback
+ * @param id unique string id of the installed timer. Used by the event recorder
* @return true if the timer was installed successfully, false otherwise
*/
- virtual bool installTimerProc(TimerProc proc, int32 interval, void *refCon) = 0;
+ virtual bool installTimerProc(TimerProc proc, int32 interval, void *refCon, const Common::String &id) = 0;
/**
* Remove the given timer callback. It will not be invoked anymore,
diff --git a/common/tokenizer.cpp b/common/tokenizer.cpp
index 395ff0767a..46ba7a8d8b 100644
--- a/common/tokenizer.cpp
+++ b/common/tokenizer.cpp
@@ -53,4 +53,3 @@ String StringTokenizer::nextToken() {
}
} // End of namespace Common
-
diff --git a/common/translation.cpp b/common/translation.cpp
index 59488c2dd5..3570e8c5ae 100644
--- a/common/translation.cpp
+++ b/common/translation.cpp
@@ -19,7 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#ifdef WIN32
+#if defined(WIN32)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h
@@ -37,10 +37,10 @@
#ifdef USE_TRANSLATION
-DECLARE_SINGLETON(Common::TranslationManager);
-
namespace Common {
+DECLARE_SINGLETON(TranslationManager);
+
bool operator<(const TLanguage &l, const TLanguage &r) {
return strcmp(l.name, r.name) < 0;
}
@@ -223,7 +223,11 @@ String TranslationManager::getLangById(int id) const {
}
bool TranslationManager::openTranslationsFile(File& inFile) {
- // First try to open it using the SearchMan.
+ // First look in the Themepath if we can find the file.
+ if (ConfMan.hasKey("themepath") && openTranslationsFile(FSNode(ConfMan.get("themepath")), inFile))
+ return true;
+
+ // Then try to open it using the SearchMan.
ArchiveMemberList fileList;
SearchMan.listMatchingMembers(fileList, "translations.dat");
for (ArchiveMemberList::iterator it = fileList.begin(); it != fileList.end(); ++it) {
@@ -235,10 +239,6 @@ bool TranslationManager::openTranslationsFile(File& inFile) {
}
}
- // Then look in the Themepath if we can find the file.
- if (ConfMan.hasKey("themepath"))
- return openTranslationsFile(FSNode(ConfMan.get("themepath")), inFile);
-
return false;
}
diff --git a/common/unarj.cpp b/common/unarj.cpp
index f45dddaa38..cccc330bb5 100644
--- a/common/unarj.cpp
+++ b/common/unarj.cpp
@@ -293,8 +293,8 @@ ArjHeader *readHeader(SeekableReadStream &stream) {
return NULL;
}
- Common::strlcpy(header.filename, (const char *)&headData[header.firstHdrSize], ARJ_FILENAME_MAX);
- Common::strlcpy(header.comment, (const char *)&headData[header.firstHdrSize + strlen(header.filename) + 1], ARJ_COMMENT_MAX);
+ strlcpy(header.filename, (const char *)&headData[header.firstHdrSize], ARJ_FILENAME_MAX);
+ strlcpy(header.comment, (const char *)&headData[header.firstHdrSize + strlen(header.filename) + 1], ARJ_COMMENT_MAX);
// Process extended headers, if any
uint16 extHeaderSize;
@@ -692,15 +692,15 @@ void ArjDecoder::decode_f(int32 origsize) {
typedef HashMap<String, ArjHeader*, IgnoreCase_Hash, IgnoreCase_EqualTo> ArjHeadersMap;
-class ArjArchive : public Common::Archive {
+class ArjArchive : public Archive {
ArjHeadersMap _headers;
- Common::String _arjFilename;
+ String _arjFilename;
public:
ArjArchive(const String &name);
virtual ~ArjArchive();
- // Common::Archive implementation
+ // Archive implementation
virtual bool hasFile(const String &name);
virtual int listMembers(ArchiveMemberList &list);
virtual ArchiveMemberPtr getMember(const String &name);
@@ -708,7 +708,7 @@ public:
};
ArjArchive::ArjArchive(const String &filename) : _arjFilename(filename) {
- Common::File arjFile;
+ File arjFile;
if (!arjFile.open(_arjFilename)) {
warning("ArjArchive::ArjArchive(): Could not find the archive file");
@@ -775,7 +775,7 @@ SeekableReadStream *ArjArchive::createReadStreamForMember(const String &name) co
ArjHeader *hdr = _headers[name];
- Common::File archiveFile;
+ File archiveFile;
archiveFile.open(_arjFilename);
archiveFile.seek(hdr->pos, SEEK_SET);
@@ -794,8 +794,8 @@ SeekableReadStream *ArjArchive::createReadStreamForMember(const String &name) co
// If reading from archiveFile directly is too slow to be usable,
// maybe the filesystem code should instead wrap its files
// in a BufferedReadStream.
- decoder->_compressed = Common::wrapBufferedReadStream(&archiveFile, 4096, DisposeAfterUse::NO);
- decoder->_outstream = new Common::MemoryWriteStream(uncompressedData, hdr->origSize);
+ decoder->_compressed = wrapBufferedReadStream(&archiveFile, 4096, DisposeAfterUse::NO);
+ decoder->_outstream = new MemoryWriteStream(uncompressedData, hdr->origSize);
if (hdr->method == 1 || hdr->method == 2 || hdr->method == 3)
decoder->decode(hdr->origSize);
@@ -805,7 +805,7 @@ SeekableReadStream *ArjArchive::createReadStreamForMember(const String &name) co
delete decoder;
}
- return new Common::MemoryReadStream(uncompressedData, hdr->origSize, DisposeAfterUse::YES);
+ return new MemoryReadStream(uncompressedData, hdr->origSize, DisposeAfterUse::YES);
}
Archive *makeArjArchive(const String &name) {
diff --git a/common/unzip.cpp b/common/unzip.cpp
index 91f352f40a..8650c91866 100644
--- a/common/unzip.cpp
+++ b/common/unzip.cpp
@@ -1458,11 +1458,11 @@ ZipArchive::~ZipArchive() {
unzClose(_zipFile);
}
-bool ZipArchive::hasFile(const Common::String &name) {
+bool ZipArchive::hasFile(const String &name) {
return (unzLocateFile(_zipFile, name.c_str(), 2) == UNZ_OK);
}
-int ZipArchive::listMembers(Common::ArchiveMemberList &list) {
+int ZipArchive::listMembers(ArchiveMemberList &list) {
int matches = 0;
int err = unzGoToFirstFile(_zipFile);
@@ -1488,7 +1488,7 @@ ArchiveMemberPtr ZipArchive::getMember(const String &name) {
return ArchiveMemberPtr(new GenericArchiveMember(name, this));
}
-Common::SeekableReadStream *ZipArchive::createReadStreamForMember(const Common::String &name) const {
+SeekableReadStream *ZipArchive::createReadStreamForMember(const String &name) const {
if (unzLocateFile(_zipFile, name.c_str(), 2) != UNZ_OK)
return 0;
@@ -1512,7 +1512,7 @@ Common::SeekableReadStream *ZipArchive::createReadStreamForMember(const Common::
return 0;
}
- return new Common::MemoryReadStream(buffer, fileInfo.uncompressed_size, DisposeAfterUse::YES);
+ return new MemoryReadStream(buffer, fileInfo.uncompressed_size, DisposeAfterUse::YES);
// FIXME: instead of reading all into a memory stream, we could
// instead create a new ZipStream class. But then we have to be
diff --git a/common/updates.h b/common/updates.h
new file mode 100644
index 0000000000..1e0babdf6d
--- /dev/null
+++ b/common/updates.h
@@ -0,0 +1,102 @@
+/* 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 BACKENDS_UPDATES_ABSTRACT_H
+#define BACKENDS_UPDATES_ABSTRACT_H
+
+#if defined(USE_UPDATES)
+
+namespace Common {
+
+/**
+ * The UpdateManager allows configuring of the automatic update checking
+ * for systems that support it:
+ * - using Sparkle on MacOSX
+ * - using WinSparkle on Windows
+ *
+ * Most of the update checking is completely automated and this class only
+ * gives access to basic settings. It is mostly used by the GUI to set
+ * widgets state on the update page and for manually checking for updates
+ *
+ */
+class UpdateManager {
+public:
+ enum UpdateState {
+ kUpdateStateDisabled = 0,
+ kUpdateStateEnabled = 1,
+ kUpdateStateNotSupported = 2
+ };
+
+ enum UpdateInterval {
+ kUpdateIntervalNotSupported = 0,
+ kUpdateIntervalOneDay = 86400,
+ kUpdateIntervalOneWeek = 604800,
+ kUpdateIntervalOneMonth = 2628000 // average seconds per month (60*60*24*365)/12
+ };
+
+ UpdateManager() {}
+ virtual ~UpdateManager() {}
+
+ /**
+ * Checks manually if an update is available, showing progress UI to the user.
+ *
+ * By default, update checks are done silently on start.
+ * This allows to manually start an update check.
+ */
+ virtual void checkForUpdates() {}
+
+ /**
+ * Sets the automatic update checking state
+ *
+ * @param state The state.
+ */
+ virtual void setAutomaticallyChecksForUpdates(UpdateState state) {}
+
+ /**
+ * Gets the automatic update checking state
+ *
+ * @return kUpdateStateDisabled if automatic update checking is disabled,
+ * kUpdateStateEnabled if automatic update checking is enabled,
+ * kUpdateStateNotSupported if automatic update checking is not available
+ */
+ virtual UpdateState getAutomaticallyChecksForUpdates() { return kUpdateStateNotSupported; }
+
+ /**
+ * Sets the update checking interval.
+ *
+ * @param interval The interval.
+ */
+ virtual void setUpdateCheckInterval(UpdateInterval interval) {}
+
+ /**
+ * Gets the update check interval.
+ *
+ * @return the update check interval.
+ */
+ virtual UpdateInterval getUpdateCheckInterval() { return kUpdateIntervalNotSupported; }
+};
+
+} // End of namespace Common
+
+#endif
+
+#endif // BACKENDS_UPDATES_ABSTRACT_H
diff --git a/common/util.cpp b/common/util.cpp
index a7ec1a9de7..bd2ebc4937 100644
--- a/common/util.cpp
+++ b/common/util.cpp
@@ -82,7 +82,7 @@ void hexdump(const byte *data, int len, int bytesPerLine, int startOffset) {
#pragma mark -
-bool parseBool(const Common::String &val, bool &valAsBool) {
+bool parseBool(const String &val, bool &valAsBool) {
if (val.equalsIgnoreCase("true") ||
val.equalsIgnoreCase("yes") ||
val.equals("1")) {
@@ -104,29 +104,29 @@ bool parseBool(const Common::String &val, bool &valAsBool) {
const LanguageDescription g_languages[] = {
- { "zh-cn"/*, "zh_CN"*/, "Chinese (China)", ZH_CNA },
- { "zh"/*, "zh_TW"*/, "Chinese (Taiwan)", ZH_TWN },
- { "cz"/*, "cs_CZ"*/, "Czech", CZ_CZE },
- { "nl"/*, "nl_NL"*/, "Dutch", NL_NLD },
- { "en"/*, "en"*/, "English", EN_ANY }, // Generic English (when only one game version exist)
- { "gb"/*, "en_GB"*/, "English (GB)", EN_GRB },
- { "us"/*, "en_US"*/, "English (US)", EN_USA },
- { "fr"/*, "fr_FR"*/, "French", FR_FRA },
- { "de"/*, "de_DE"*/, "German", DE_DEU },
- { "gr"/*, "el_GR"*/, "Greek", GR_GRE },
- { "he"/*, "he_IL"*/, "Hebrew", HE_ISR },
- { "hb"/*, "he_IL"*/, "Hebrew", HE_ISR }, // Deprecated
- { "hu"/*, "hu_HU"*/, "Hungarian", HU_HUN },
- { "it"/*, "it_IT"*/, "Italian", IT_ITA },
- { "jp"/*, "ja_JP"*/, "Japanese", JA_JPN },
- { "kr"/*, "ko_KR"*/, "Korean", KO_KOR },
- { "nb"/*, "nb_NO"*/, "Norwegian Bokm\xE5l", NB_NOR }, // TODO Someone should verify the unix locale
- { "pl"/*, "pl_PL"*/, "Polish", PL_POL },
- { "br"/*, "pt_BR"*/, "Portuguese", PT_BRA },
- { "ru"/*, "ru_RU"*/, "Russian", RU_RUS },
- { "es"/*, "es_ES"*/, "Spanish", ES_ESP },
- { "se"/*, "sv_SE"*/, "Swedish", SE_SWE },
- { 0/*, 0*/, 0, UNK_LANG }
+ { "zh-cn", "zh_CN", "Chinese (China)", ZH_CNA },
+ { "zh", "zh_TW", "Chinese (Taiwan)", ZH_TWN },
+ { "cz", "cs_CZ", "Czech", CZ_CZE },
+ { "nl", "nl_NL", "Dutch", NL_NLD },
+ { "en", "en", "English", EN_ANY }, // Generic English (when only one game version exist)
+ { "gb", "en_GB", "English (GB)", EN_GRB },
+ { "us", "en_US", "English (US)", EN_USA },
+ { "fr", "fr_FR", "French", FR_FRA },
+ { "de", "de_DE", "German", DE_DEU },
+ { "gr", "el_GR", "Greek", GR_GRE },
+ { "he", "he_IL", "Hebrew", HE_ISR },
+ { "hb", "he_IL", "Hebrew", HE_ISR }, // Deprecated
+ { "hu", "hu_HU", "Hungarian", HU_HUN },
+ { "it", "it_IT", "Italian", IT_ITA },
+ { "jp", "ja_JP", "Japanese", JA_JPN },
+ { "kr", "ko_KR", "Korean", KO_KOR },
+ { "nb", "nb_NO", "Norwegian Bokm\xE5l", NB_NOR }, // TODO Someone should verify the unix locale
+ { "pl", "pl_PL", "Polish", PL_POL },
+ { "br", "pt_BR", "Portuguese", PT_BRA },
+ { "ru", "ru_RU", "Russian", RU_RUS },
+ { "es", "es_ES", "Spanish", ES_ESP },
+ { "se", "sv_SE", "Swedish", SE_SWE },
+ { 0, 0, 0, UNK_LANG }
};
Language parseLanguage(const String &str) {
@@ -142,7 +142,7 @@ Language parseLanguage(const String &str) {
return UNK_LANG;
}
-/*Language parseLanguageFromLocale(const char *locale) {
+Language parseLanguageFromLocale(const char *locale) {
if (!locale || !*locale)
return UNK_LANG;
@@ -153,7 +153,7 @@ Language parseLanguage(const String &str) {
}
return UNK_LANG;
-}*/
+}
const char *getLanguageCode(Language id) {
const LanguageDescription *l = g_languages;
@@ -164,14 +164,14 @@ const char *getLanguageCode(Language id) {
return 0;
}
-/*const char *getLanguageLocale(Language id) {
+const char *getLanguageLocale(Language id) {
const LanguageDescription *l = g_languages;
for (; l->code; ++l) {
if (l->id == id)
return l->unixLocale;
}
return 0;
-}*/
+}
const char *getLanguageDescription(Language id) {
const LanguageDescription *l = g_languages;
@@ -271,6 +271,7 @@ const char *getPlatformDescription(Platform id) {
const RenderModeDescription g_renderModes[] = {
+ // I18N: Hercules is graphics card name
{ "hercGreen", _s("Hercules Green"), kRenderHercG },
{ "hercAmber", _s("Hercules Amber"), kRenderHercA },
{ "cga", "CGA", kRenderCGA },
@@ -314,7 +315,7 @@ const char *getRenderModeDescription(RenderMode id) {
}
const struct GameOpt {
- uint32 option;
+ const char *option;
const char *desc;
} g_gameOptions[] = {
{ GUIO_NOSUBTITLES, "sndNoSubs" },
@@ -340,9 +341,9 @@ const struct GameOpt {
{ GUIO_NONE, 0 }
};
-bool checkGameGUIOption(GameGUIOption option, const String &str) {
+bool checkGameGUIOption(const String &option, const String &str) {
for (int i = 0; g_gameOptions[i].desc; i++) {
- if (g_gameOptions[i].option & option) {
+ if (option.contains(g_gameOptions[i].option)) {
if (str.contains(g_gameOptions[i].desc))
return true;
else
@@ -369,21 +370,21 @@ const String getGameGUIOptionsDescriptionLanguage(Language lang) {
return String(String("lang_") + getLanguageDescription(lang));
}
-uint32 parseGameGUIOptions(const String &str) {
- uint32 res = 0;
+String parseGameGUIOptions(const String &str) {
+ Common::String res;
for (int i = 0; g_gameOptions[i].desc; i++)
if (str.contains(g_gameOptions[i].desc))
- res |= g_gameOptions[i].option;
+ res += g_gameOptions[i].option;
return res;
}
-const String getGameGUIOptionsDescription(uint32 options) {
+const String getGameGUIOptionsDescription(const String &options) {
String res = "";
for (int i = 0; g_gameOptions[i].desc; i++)
- if (options & g_gameOptions[i].option)
+ if (options.contains(g_gameOptions[i].option[0]))
res += String(g_gameOptions[i].desc) + " ";
res.trim();
@@ -391,10 +392,10 @@ const String getGameGUIOptionsDescription(uint32 options) {
return res;
}
-void updateGameGUIOptions(const uint32 options, const String &langOption) {
+void updateGameGUIOptions(const String &options, const String &langOption) {
const String newOptionString = getGameGUIOptionsDescription(options) + " " + langOption;
- if ((options && !ConfMan.hasKey("guioptions")) ||
+ if ((!options.empty() && !ConfMan.hasKey("guioptions")) ||
(ConfMan.hasKey("guioptions") && ConfMan.get("guioptions") != newOptionString)) {
ConfMan.set("guioptions", newOptionString);
ConfMan.flushToDisk();
@@ -402,4 +403,3 @@ void updateGameGUIOptions(const uint32 options, const String &langOption) {
}
} // End of namespace Common
-
diff --git a/common/util.h b/common/util.h
index cd890c970f..bad07d4cb2 100644
--- a/common/util.h
+++ b/common/util.h
@@ -58,6 +58,11 @@ template<typename T> inline void SWAP(T &a, T &b) { T tmp = a; a = b; b = tmp; }
*/
#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0])))
+/**
+ * Compute a pointer to one past the last element of an array.
+ */
+#define ARRAYEND(x) ((x) + ARRAYSIZE((x)))
+
/**
* @def SCUMMVM_CURRENT_FUNCTION
@@ -73,6 +78,32 @@ template<typename T> inline void SWAP(T &a, T &b) { T tmp = a; a = b; b = tmp; }
# define SCUMMVM_CURRENT_FUNCTION "<unknown>"
#endif
+#define GUIO_NONE "\000"
+#define GUIO_NOSUBTITLES "\001"
+#define GUIO_NOMUSIC "\002"
+#define GUIO_NOSPEECH "\003"
+#define GUIO_NOSFX "\003"
+#define GUIO_NOMIDI "\004"
+#define GUIO_NOLAUNCHLOAD "\005"
+
+#define GUIO_MIDIPCSPK "\006"
+#define GUIO_MIDICMS "\007"
+#define GUIO_MIDIPCJR "\010"
+#define GUIO_MIDIADLIB "\011"
+#define GUIO_MIDIC64 "\012"
+#define GUIO_MIDIAMIGA "\013"
+#define GUIO_MIDIAPPLEIIGS "\014"
+#define GUIO_MIDITOWNS "\015"
+#define GUIO_MIDIPC98 "\016"
+#define GUIO_MIDIMT32 "\017"
+#define GUIO_MIDIGM "\020"
+
+#define GUIO1(a) (a)
+#define GUIO2(a,b) (a b)
+#define GUIO3(a,b,c) (a b c)
+#define GUIO4(a,b,c,d) (a b c d)
+#define GUIO5(a,b,c,d,e) (a b c d e)
+
namespace Common {
/**
@@ -96,7 +127,7 @@ extern void hexdump(const byte * data, int len, int bytesPerLine = 16, int start
* @param[out] valAsBool the parsing result
* @return true if the string parsed correctly, false if an error occurred.
*/
-bool parseBool(const Common::String &val, bool &valAsBool);
+bool parseBool(const String &val, bool &valAsBool);
/**
* List of game language.
@@ -129,9 +160,9 @@ enum Language {
struct LanguageDescription {
const char *code;
- //const char *unixLocale;
+ const char *unixLocale;
const char *description;
- Common::Language id;
+ Language id;
};
extern const LanguageDescription g_languages[];
@@ -139,13 +170,11 @@ extern const LanguageDescription g_languages[];
/** Convert a string containing a language name into a Language enum value. */
extern Language parseLanguage(const String &str);
+extern Language parseLanguageFromLocale(const char *locale);
extern const char *getLanguageCode(Language id);
+extern const char *getLanguageLocale(Language id);
extern const char *getLanguageDescription(Language id);
-// locale <-> Language conversion is disabled, since it is not used currently
-/*extern const char *getLanguageLocale(Language id);
-extern Language parseLanguageFromLocale(const char *locale);*/
-
/**
* List of game platforms. Specifying a platform for a target can be used to
* give the game engines a hint for which platform the game data file are.
@@ -182,7 +211,7 @@ struct PlatformDescription {
const char *code2;
const char *abbrev;
const char *description;
- Common::Platform id;
+ Platform id;
};
extern const PlatformDescription g_platforms[];
@@ -211,7 +240,7 @@ enum RenderMode {
struct RenderModeDescription {
const char *code;
const char *description;
- Common::RenderMode id;
+ RenderMode id;
};
extern const RenderModeDescription g_renderModes[];
@@ -221,32 +250,10 @@ extern RenderMode parseRenderMode(const String &str);
extern const char *getRenderModeCode(RenderMode id);
extern const char *getRenderModeDescription(RenderMode id);
-enum GameGUIOption {
- GUIO_NONE = 0,
- GUIO_NOSUBTITLES = (1 << 0),
- GUIO_NOMUSIC = (1 << 1),
- GUIO_NOSPEECH = (1 << 2),
- GUIO_NOSFX = (1 << 3),
- GUIO_NOMIDI = (1 << 4),
- GUIO_NOLAUNCHLOAD = (1 << 5),
-
- GUIO_MIDIPCSPK = (1 << 6),
- GUIO_MIDICMS = (1 << 7),
- GUIO_MIDIPCJR = (1 << 8),
- GUIO_MIDIADLIB = (1 << 9),
- 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);
+bool checkGameGUIOption(const String &option, const String &str);
bool checkGameGUIOptionLanguage(Language lang, const String &str);
-uint32 parseGameGUIOptions(const String &str);
-const String getGameGUIOptionsDescription(uint32 options);
+String parseGameGUIOptions(const String &str);
+const String getGameGUIOptionsDescription(const String &options);
const String getGameGUIOptionsDescriptionLanguage(Language lang);
/**
@@ -254,7 +261,7 @@ const String getGameGUIOptionsDescriptionLanguage(Language lang);
* domain, when they differ to the ones passed as
* parameter.
*/
-void updateGameGUIOptions(const uint32 options, const String &langOption);
+void updateGameGUIOptions(const String &options, const String &langOption);
} // End of namespace Common
diff --git a/common/winexe_pe.cpp b/common/winexe_pe.cpp
index e5f6a24bcd..6c0f9c9962 100644
--- a/common/winexe_pe.cpp
+++ b/common/winexe_pe.cpp
@@ -133,7 +133,7 @@ void PEResources::parseResourceLevel(Section &section, uint32 offset, int level)
_exe->seek(section.offset + (value & 0x7fffffff));
// Read in the name, truncating from unicode to ascii
- Common::String name;
+ String name;
uint16 nameLength = _exe->readUint16LE();
while (nameLength--)
name += (char)(_exe->readUint16LE() & 0xff);
diff --git a/common/xmlparser.cpp b/common/xmlparser.cpp
index 5217c4e82c..f768e44382 100644
--- a/common/xmlparser.cpp
+++ b/common/xmlparser.cpp
@@ -81,7 +81,7 @@ void XMLParser::close() {
_stream = 0;
}
-bool XMLParser::parserError(const Common::String &errStr) {
+bool XMLParser::parserError(const String &errStr) {
_state = kParserError;
const int startPosition = _stream->pos();
@@ -263,7 +263,7 @@ bool XMLParser::vparseIntegerKey(const char *key, int count, va_list args) {
int *num_ptr;
while (count--) {
- while (isspace(*key))
+ while (isspace(static_cast<unsigned char>(*key)))
key++;
num_ptr = va_arg(args, int*);
@@ -271,7 +271,7 @@ bool XMLParser::vparseIntegerKey(const char *key, int count, va_list args) {
key = parseEnd;
- while (isspace(*key))
+ while (isspace(static_cast<unsigned char>(*key)))
key++;
if (count && *key++ != ',')
@@ -463,10 +463,10 @@ bool XMLParser::parse() {
}
bool XMLParser::skipSpaces() {
- if (!isspace(_char))
+ if (!isspace(static_cast<unsigned char>(_char)))
return false;
- while (_char && isspace(_char))
+ while (_char && isspace(static_cast<unsigned char>(_char)))
_char = _stream->readByte();
return true;
@@ -516,7 +516,7 @@ bool XMLParser::parseToken() {
_char = _stream->readByte();
}
- return isspace(_char) != 0 || _char == '>' || _char == '=' || _char == '/';
+ return isspace(static_cast<unsigned char>(_char)) != 0 || _char == '>' || _char == '=' || _char == '/';
}
} // End of namespace Common
diff --git a/common/xmlparser.h b/common/xmlparser.h
index 7923e43a37..93433b7132 100644
--- a/common/xmlparser.h
+++ b/common/xmlparser.h
@@ -31,6 +31,7 @@
#include "common/hashmap.h"
#include "common/hash-str.h"
#include "common/stack.h"
+#include "common/memorypool.h"
namespace Common {
@@ -274,7 +275,7 @@ protected:
* Parser error always returns "false" so we can pass the return value
* directly and break down the parsing.
*/
- bool parserError(const Common::String &errStr);
+ bool parserError(const String &errStr);
/**
* Skips spaces/whitelines etc.
@@ -294,7 +295,7 @@ protected:
* in their name.
*/
virtual inline bool isValidNameChar(char c) {
- return isalnum(c) || c == '_';
+ return isalnum(static_cast<unsigned char>(c)) || c == '_';
}
/**
diff --git a/common/zlib.cpp b/common/zlib.cpp
index b047586af0..70133fea30 100644
--- a/common/zlib.cpp
+++ b/common/zlib.cpp
@@ -24,6 +24,7 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "common/zlib.h"
+#include "common/ptr.h"
#include "common/util.h"
#include "common/stream.h"
@@ -48,12 +49,41 @@ bool uncompress(byte *dst, unsigned long *dstLen, const byte *src, unsigned long
return Z_OK == ::uncompress(dst, dstLen, src, srcLen);
}
+bool inflateZlibHeaderless(byte *dst, uint dstLen, const byte *src, uint srcLen) {
+ if (!dst || !dstLen || !src || !srcLen)
+ return false;
+
+ // Initialize zlib
+ z_stream stream;
+ stream.next_in = const_cast<byte *>(src);
+ stream.avail_in = srcLen;
+ stream.next_out = dst;
+ stream.avail_out = dstLen;
+ stream.zalloc = Z_NULL;
+ stream.zfree = Z_NULL;
+ stream.opaque = Z_NULL;
+
+ // Negative MAX_WBITS tells zlib there's no zlib header
+ int err = inflateInit2(&stream, -MAX_WBITS);
+ if (err != Z_OK)
+ return false;
+
+ err = inflate(&stream, Z_SYNC_FLUSH);
+ if (err != Z_OK && err != Z_STREAM_END) {
+ inflateEnd(&stream);
+ return false;
+ }
+
+ inflateEnd(&stream);
+ return true;
+}
+
/**
* A simple wrapper class which can be used to wrap around an arbitrary
* other SeekableReadStream and will then provide on-the-fly decompression support.
* Assumes the compressed data to be in gzip format.
*/
-class GZipReadStream : public Common::SeekableReadStream {
+class GZipReadStream : public SeekableReadStream {
protected:
enum {
BUFSIZE = 16384 // 1 << MAX_WBITS
@@ -61,7 +91,7 @@ protected:
byte _buf[BUFSIZE];
- Common::SeekableReadStream *_wrapped;
+ ScopedPtr<SeekableReadStream> _wrapped;
z_stream _stream;
int _zlibErr;
uint32 _pos;
@@ -70,13 +100,9 @@ protected:
public:
- GZipReadStream(Common::SeekableReadStream *w) : _wrapped(w) {
+ GZipReadStream(SeekableReadStream *w) : _wrapped(w), _stream() {
assert(w != 0);
- _stream.zalloc = Z_NULL;
- _stream.zfree = Z_NULL;
- _stream.opaque = Z_NULL;
-
// Verify file header is correct
w->seek(0, SEEK_SET);
uint16 header = w->readUint16BE();
@@ -111,7 +137,6 @@ public:
~GZipReadStream() {
inflateEnd(&_stream);
- delete _wrapped;
}
bool err() const { return (_zlibErr != Z_OK) && (_zlibErr != Z_STREAM_END); }
@@ -201,14 +226,14 @@ public:
* other WriteStream and will then provide on-the-fly compression support.
* The compressed data is written in the gzip format.
*/
-class GZipWriteStream : public Common::WriteStream {
+class GZipWriteStream : public WriteStream {
protected:
enum {
BUFSIZE = 16384 // 1 << MAX_WBITS
};
byte _buf[BUFSIZE];
- Common::WriteStream *_wrapped;
+ ScopedPtr<WriteStream> _wrapped;
z_stream _stream;
int _zlibErr;
@@ -228,11 +253,8 @@ protected:
}
public:
- GZipWriteStream(Common::WriteStream *w) : _wrapped(w) {
+ GZipWriteStream(WriteStream *w) : _wrapped(w), _stream() {
assert(w != 0);
- _stream.zalloc = Z_NULL;
- _stream.zfree = Z_NULL;
- _stream.opaque = Z_NULL;
// Adding 16 to windowBits indicates to zlib that it is supposed to
// write gzip headers. This feature was added in zlib 1.2.0.4,
@@ -255,7 +277,6 @@ public:
~GZipWriteStream() {
finalize();
deflateEnd(&_stream);
- delete _wrapped;
}
bool err() const {
@@ -308,7 +329,7 @@ public:
#endif // USE_ZLIB
-Common::SeekableReadStream *wrapCompressedReadStream(Common::SeekableReadStream *toBeWrapped) {
+SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped) {
#if defined(USE_ZLIB)
if (toBeWrapped) {
uint16 header = toBeWrapped->readUint16BE();
@@ -323,7 +344,7 @@ Common::SeekableReadStream *wrapCompressedReadStream(Common::SeekableReadStream
return toBeWrapped;
}
-Common::WriteStream *wrapCompressedWriteStream(Common::WriteStream *toBeWrapped) {
+WriteStream *wrapCompressedWriteStream(WriteStream *toBeWrapped) {
#if defined(USE_ZLIB)
if (toBeWrapped)
return new GZipWriteStream(toBeWrapped);
diff --git a/common/zlib.h b/common/zlib.h
index 1925034310..7af7df0da8 100644
--- a/common/zlib.h
+++ b/common/zlib.h
@@ -41,6 +41,15 @@ class WriteStream;
*/
bool uncompress(byte *dst, unsigned long *dstLen, const byte *src, unsigned long srcLen);
+/**
+ * Wrapper around zlib's inflate functions. This function will call the
+ * necessary inflate functions to uncompress data compressed with deflate
+ * but *not* with the standard zlib header.
+ *
+ * @return true on success (Z_OK or Z_STREAM_END), false otherwise
+ */
+bool inflateZlibHeaderless(byte *dst, uint dstLen, const byte *src, uint srcLen);
+
#endif
/**
diff --git a/configure b/configure
index fb3e86927e..bacaea1f2f 100755
--- a/configure
+++ b/configure
@@ -83,7 +83,9 @@ add_engine he "HE71+ games" yes
add_engine agi "AGI" yes
add_engine agos "AGOS" yes "agos2"
add_engine agos2 "AGOS 2 games" yes
+add_engine cge "CGE" no
add_engine cine "Cinematique evo 1" yes
+add_engine composer "Magic Composer" no
add_engine cruise "Cinematique evo 2" yes
add_engine draci "Dragon History" yes
add_engine drascula "Drascula: The Vampire Strikes Back" yes
@@ -119,10 +121,9 @@ add_engine testbed "TestBed: the Testing framework" no
add_engine tinsel "Tinsel" yes
add_engine toon "Toonstruck" yes
add_engine touche "Touche: The Adventures of the Fifth Musketeer" yes
-add_engine tsage "Ringworld: Revenge Of The Patriarch" no
+add_engine tsage "Ringworld: Revenge Of The Patriarch" yes
add_engine tucker "Bud Tucker in Double Trouble" yes
-
#
# Default settings
#
@@ -136,6 +137,7 @@ _alsa=auto
_seq_midi=auto
_timidity=auto
_zlib=auto
+_sparkle=auto
_png=auto
_theoradec=auto
_faad=auto
@@ -144,10 +146,12 @@ _opengl=auto
_opengles=auto
_readline=auto
_taskbar=yes
+_updates=no
_libunity=auto
# Default option behaviour yes/no
_debug_build=auto
_release_build=auto
+_optimizations=auto
_verbose_build=no
_text_console=no
_mt32emu=yes
@@ -155,6 +159,7 @@ _build_scalers=yes
_build_hq_scalers=yes
_enable_prof=no
_global_constructors=no
+_bink=yes
# Default vkeybd/keymapper options
_vkeybd=no
_keymapper=no
@@ -163,19 +168,23 @@ _translation=yes
# Default platform settings
_backend=sdl
_16bit=auto
+_savegame_timestamp=auto
_dynamic_modules=no
_elf_loader=no
_plugins_default=static
_plugin_prefix=
_plugin_suffix=
_nasm=auto
+_optimization_level=
+_default_optimization_level=-O2
# Default commands
_ranlib=ranlib
_strip=strip
_ar="ar cru"
_as="as"
_windres=windres
-_win32path="build/x86"
+_stagingpath="staging"
+_win32path="c:/scummvm"
_aos4path="Games:ScummVM"
_staticlibpath=/sw
_sdlconfig=sdl-config
@@ -190,7 +199,6 @@ _posix=no
_endian=unknown
_need_memalign=yes
_have_x86=no
-_arm_asm=no
@@ -703,7 +711,7 @@ Usage: $0 [OPTIONS]...
Configuration:
-h, --help display this help and exit
- --backend=BACKEND backend to build (android, dc, dingux, ds, gp2x, gph,
+ --backend=BACKEND backend to build (android, bada, dc, dingux, ds, gp2x, gph,
iphone, linuxmoto, maemo, n64, null, openpandora, ps2,
psp, samsungtv, sdl, webos, wii, wince) [sdl]
@@ -732,6 +740,7 @@ Fine tuning of the installation directories:
Special configuration feature:
--host=HOST cross-compile to target HOST (arm-linux, ...)
special targets: android for Android
+ bada for Samsung BADA
caanoo for Caanoo
dingux for Dingux
dreamcast for Sega Dreamcast
@@ -741,11 +750,13 @@ Special configuration feature:
gp2xwiz for GP2X Wiz
iphone for Apple iPhone
linupy for Yopy PDA
+ maemo for Nokia Maemo
motoezx for MotoEZX
motomagx for MotoMAGX
n64 for Nintendo 64
openpandora for OpenPandora
ps2 for PlayStation 2
+ ps3 for PlayStation 3
psp for PlayStation Portable
samsungtv for Samsung TV
webos for HP Palm WebOS
@@ -762,18 +773,23 @@ Optional Features:
--enable-Werror treat warnings as errors
--enable-release enable building in release mode (this activates
optimizations)
+ --enable-release-mode enable building in release mode (without optimizations)
+ --enable-optimizations enable optimizations
--enable-profiling enable profiling
--enable-plugins enable the support for dynamic plugins
--default-dynamic make plugins dynamic by default
--disable-mt32emu don't enable the integrated MT-32 emulator
--disable-16bit don't enable 16bit color support
+ --disable-savegame-timestamp don't use timestamps for blank savegame descriptions
--disable-scalers exclude scalers
--disable-hq-scalers exclude HQ2x and HQ3x scalers
--disable-translation don't build support for translated messages
--disable-taskbar don't build support for taskbar and launcher integration
+ --enable-updates build support for updates
--enable-text-console use text console instead of graphical console
--enable-verbose-build enable regular echoing of commands during build
process
+ --disable-bink don't build with Bink video support
Optional Libraries:
--with-alsa-prefix=DIR Prefix where alsa is installed (optional)
@@ -811,6 +827,9 @@ Optional Libraries:
installed (optional)
--disable-fluidsynth disable fluidsynth MIDI driver [autodetect]
+ --with-sparkle-prefix=DIR Prefix where sparkle is installed (MacOSX only - optional)
+ --disable-sparkle disable sparkle automatic update support [MacOSX only - autodetect]
+
--with-sdl-prefix=DIR Prefix where the sdl-config script is
installed (optional)
@@ -841,6 +860,7 @@ done # for parm in ...
for ac_option in $@; do
case "$ac_option" in
--disable-16bit) _16bit=no ;;
+ --disable-savegame-timestamp) _savegame_timestamp=no ;;
--disable-scalers) _build_scalers=no ;;
--disable-hq-scalers) _build_hq_scalers=no ;;
--enable-alsa) _alsa=yes ;;
@@ -859,6 +879,8 @@ for ac_option in $@; do
--disable-mad) _mad=no ;;
--enable-zlib) _zlib=yes ;;
--disable-zlib) _zlib=no ;;
+ --enable-sparkle) _sparkle=yes ;;
+ --disable-sparkle) _sparkle=no ;;
--enable-nasm) _nasm=yes ;;
--disable-nasm) _nasm=no ;;
--disable-png) _png=no ;;
@@ -872,10 +894,14 @@ for ac_option in $@; do
--disable-readline) _readline=no ;;
--enable-taskbar) _taskbar=yes ;;
--disable-taskbar) _taskbar=no ;;
+ --enable-updates) _updates=yes ;;
+ --disable-updates) _updates=no ;;
--enable-libunity) _libunity=yes ;;
--disable-libunity) _libunity=no ;;
--enable-opengl) _opengl=yes ;;
--disable-opengl) _opengl=no ;;
+ --enable-bink) _bink=yes ;;
+ --disable-bink) _bink=no ;;
--enable-verbose-build) _verbose_build=yes ;;
--enable-plugins) _dynamic_modules=yes ;;
--default-dynamic) _plugins_default=dynamic ;;
@@ -944,6 +970,11 @@ for ac_option in $@; do
ZLIB_CFLAGS="-I$arg/include"
ZLIB_LIBS="-L$arg/lib"
;;
+ --with-sparkle-prefix=*)
+ arg=`echo $ac_option | cut -d '=' -f 2`
+ SPARKLE_CFLAGS="-F$arg"
+ SPARKLE_LIBS="-F$arg"
+ ;;
--with-readline-prefix=*)
arg=`echo $ac_option | cut -d '=' -f 2`
READLINE_CFLAGS="-I$arg/include"
@@ -971,11 +1002,25 @@ for ac_option in $@; do
--enable-Werror)
CXXFLAGS="$CXXFLAGS -Werror"
;;
+ --enable-release-mode)
+ _release_build=yes
+ ;;
+ --disable-release-mode)
+ _release_build=no
+ ;;
--enable-release)
_release_build=yes
+ _optimizations=yes
;;
--disable-release)
_release_build=no
+ _optimizations=no
+ ;;
+ --enable-optimizations)
+ _optimizations=yes
+ ;;
+ --disable-optimizations)
+ _optimizations=no
;;
--enable-profiling)
_enable_prof=yes
@@ -1050,6 +1095,16 @@ arm-riscos)
_host_os=riscos
_host_cpu=arm
;;
+bada)
+ _host_os=bada
+ if test "$_debug_build" = yes; then
+ _host_cpu=i686
+ _host_alias=i686-mingw32
+ else
+ _host_cpu=arm
+ _host_alias=arm-samsung-nucleuseabi
+ fi
+ ;;
caanoo)
_host_os=gph-linux
_host_cpu=arm
@@ -1100,6 +1155,22 @@ linupy)
_host_os=linux
_host_cpu=arm
;;
+maemo)
+ _host_os=maemo
+ _host_cpu=arm
+ _host_alias=arm-linux
+
+ # The prefix is always the same on Maemo so we hardcode the default
+ # here. It is still possible to define a custom prefix which is
+ # needed when packaging the app with a user-specific app ID.
+ test "x$prefix" = xNONE && prefix=/opt/scummvm
+ # Maemo apps are installed into app-specific directories. The
+ # default directory structure of ScummVM makes no sense here so we
+ # hardcode Maemo specific directories here.
+ datarootdir='${prefix}/share'
+ datadir=/opt/scummvm/share
+ docdir='${datarootdir}/doc/scummvm'
+ ;;
motoezx)
_host_os=linux
_host_cpu=arm
@@ -1133,6 +1204,22 @@ ps2)
_host_cpu=mips64r5900el
_host_alias=ee
;;
+ps3)
+ _host_os=ps3
+ _host_cpu=ppc
+ _host_alias=powerpc64-ps3-elf
+
+ # The prefix is always the same on PS3 so we hardcode the default
+ # here. It is still possible to define a custom prefix which is
+ # needed when packaging the app with a user-specific app ID.
+ test "x$prefix" = xNONE && prefix=/dev_hdd0/game/SCUM12000/USRDIR
+ # PS3 apps are installed into app-specific directories. The
+ # default directory structure of ScummVM makes no sense here so we
+ # hardcode PS3 specific directories here.
+ datarootdir='${prefix}/data'
+ datadir='${datarootdir}'
+ docdir='${prefix}/doc'
+ ;;
psp)
_host_os=psp
_host_cpu=mipsallegrexel
@@ -1151,7 +1238,7 @@ webos)
# here. It is still possible to define a custom prefix which is
# needed when packaging the app with a user-specific app ID.
test "x$prefix" = xNONE && prefix=/media/cryptofs/apps/usr/palm/applications/org.scummvm.scummvm
- # WebOS apps are installed into app-specific directories. The
+ # WebOS apps are installed into app-specific directories. The
# default directory structure of ScummVM makes no sense here so we
# hardcode WebOS specific directories here.
datarootdir='${prefix}/data'
@@ -1204,6 +1291,11 @@ caanoo | gp2x | gp2xwiz | openpandora | ps2)
# Enable release build by default.
_release_build=yes
fi
+
+ if test "$_optimizations" = auto; then
+ # Enable optimizations by default.
+ _optimizations=yes
+ fi
;;
esac
@@ -1213,12 +1305,8 @@ if test "$_debug_build" != no; then
fi
if test "$_release_build" = yes; then
- # Release mode enabled: enable optimizations. This also
- # makes it possible to use -Wuninitialized, so let's do that.
- # We will also add a define, which indicates we are doing
+ # Add a define, which indicates we are doing
# an build for a release version.
- CXXFLAGS="$CXXFLAGS -O2"
- CXXFLAGS="$CXXFLAGS -Wuninitialized"
DEFINES="$DEFINES -DRELEASE_BUILD"
fi
@@ -1256,6 +1344,12 @@ android)
exit 1
fi
;;
+bada)
+ if test -z "$BADA_SDK"; then
+ echo "Please set BADA_SDK in your environment. export BADA_SDK=<path to Bada SDK>"
+ exit 1
+ fi
+ ;;
ds | gamecube | wii)
if test -z "$DEVKITPRO"; then
echo "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to devkitPRO>"
@@ -1274,6 +1368,12 @@ ps2)
exit 1
fi
;;
+ps3)
+ if test -z "$PS3DEV"; then
+ echo "Please set PS3DEV in your environment. export PS3DEV=<path to ps3 toolchain>"
+ exit 1
+ fi
+ ;;
psp)
if test -z "$PSPDEV"; then
PSPDEV=`psp-config --pspdev-path`
@@ -1466,7 +1566,7 @@ if test "$have_gcc" = yes ; then
case $_host_os in
# newlib-based system include files suppress non-C89 function
# declarations under __STRICT_ANSI__
- amigaos* | android | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | wii | wince )
+ amigaos* | android | bada | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | ps3 | wii | wince )
;;
*)
CXXFLAGS="$CXXFLAGS -ansi"
@@ -1644,38 +1744,40 @@ echo "$_need_memalign"
define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT'
#
-# Check whether we can use x86 asm routines
+# Check the CPU architecture
#
-echo_n "Compiling for x86... "
+echo_n "Checking host CPU architecture... "
case $_host_cpu in
- i386|i486|i586|i686)
+ arm*)
+ echo "ARM"
+ define_in_config_if_yes yes 'USE_ARM_SCALER_ASM'
+ define_in_config_if_yes yes 'USE_ARM_SOUND_ASM'
+ define_in_config_if_yes yes 'USE_ARM_SMUSH_ASM'
+ define_in_config_if_yes yes 'USE_ARM_GFX_ASM'
+ define_in_config_if_yes yes 'USE_ARM_COSTUME_ASM'
+
+ DEFINES="$DEFINES -DARM_TARGET"
+ ;;
+ i[3-6]86)
+ echo "x86"
_have_x86=yes
+ define_in_config_h_if_yes $_have_x86 'HAVE_X86'
;;
- *)
- _have_x86=no
+ mips*)
+ echo "MIPS"
+ DEFINES="$DEFINES -DMIPS_TARGET"
;;
-esac
-echo "$_have_x86"
-define_in_config_h_if_yes $_have_x86 'HAVE_X86'
-
-#
-# Check whether to use optimized ARM asm
-#
-echo_n "Compiling for ARM... "
-case $_host_cpu in
- arm*)
- _arm_asm=yes
+ ppc*)
+ echo "PowerPC"
+ DEFINES="$DEFINES -DPPC_TARGET"
+ ;;
+ x86_64)
+ echo "x86_64"
;;
*)
- _arm_asm=no
+ echo "unknown ($_host_cpu)"
;;
esac
-echo "$_arm_asm"
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_SCALER_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_SOUND_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_SMUSH_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_GFX_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_COSTUME_ASM'
#
@@ -1718,7 +1820,7 @@ case $_host_os in
CXXFLAGS="$CXXFLAGS -fstrict-aliasing"
fi
CXXFLAGS="$CXXFLAGS -finline-limit=300"
- CXXFLAGS="$CXXFLAGS -Os"
+ _optimization_level=-Os
CXXFLAGS="$CXXFLAGS -mthumb-interwork"
# FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this.
CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5__"
@@ -1732,6 +1834,16 @@ case $_host_os in
add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK"
_seq_midi=no
;;
+ bada)
+ BADA_SDK_ROOT="`cygpath -m ${BADA_SDK}`"
+ add_line_to_config_mk "BADA_SDK = $BADA_SDK"
+ add_line_to_config_mk "BADA_SDK_ROOT = $BADA_SDK_ROOT"
+
+ # assume dependencies have been installed in cygwin's /usr/local
+ CYGWIN_USR_LOCAL="`cygpath -m /usr/local`"
+ LDFLAGS="$LDFLAGS -L${CYGWIN_USR_LOCAL}/lib"
+ CXXFLAGS="$CXXFLAGS -I${CYGWIN_USR_LOCAL}/include"
+ ;;
beos*)
DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE"
# Needs -lbind -lsocket for the timidity MIDI driver
@@ -1749,6 +1861,28 @@ case $_host_os in
DEFINES="$DEFINES -DMACOSX"
LIBS="$LIBS -framework AudioUnit -framework AudioToolbox -framework Carbon -framework CoreMIDI"
add_line_to_config_mk 'MACOSX = 1'
+
+ # Now we may have MacPorts or Fink installed
+ # Which put libraries and headers in non-standard places
+ # Checking them here
+
+ # MacPorts
+ # There is no way to get the prefix, so implementing a hack here
+ macport_version=`port version 2>/dev/null`
+ if test "$?" -eq 0; then
+ macport_version="`echo "${macport_version}" | sed -ne 's/Version: \([0-9]\.[0-9]\.[0-9]\)/\1/gp'`"
+ echo_n "You seem to be running MacPorts version ${macport_version}..."
+
+ macport_prefix=`which port`
+ # strip off /bin/port from /opt/local/bin/port
+ macport_prefix=`dirname ${macport_prefix}`
+ macport_prefix=`dirname ${macport_prefix}`
+
+ echo "adding ${macport_prefix} to paths"
+
+ LDFLAGS="-L${macport_prefix}/lib $LDFLAGS"
+ CXXFLAGS="-I${macport_prefix}/include $CXXFLAGS"
+ fi
;;
dreamcast)
DEFINES="$DEFINES -D__DC__"
@@ -1789,7 +1923,7 @@ case $_host_os in
CXXFLAGS="$CXXFLAGS -I/usr/local/include"
;;
gamecube)
- CXXFLAGS="$CXXFLAGS -Os"
+ _optimization_level=-Os
CXXFLAGS="$CXXFLAGS -mogc"
CXXFLAGS="$CXXFLAGS -mcpu=750"
CXXFLAGS="$CXXFLAGS -meabi"
@@ -1828,10 +1962,14 @@ case $_host_os in
CXXFLAGS="$CXXFLAGS $(getconf LFS_CFLAGS 2>/dev/null)"
fi
;;
+ maemo)
+ DEFINES="$DEFINES -DMAEMO"
+ ;;
mingw*)
DEFINES="$DEFINES -DWIN32"
DEFINES="$DEFINES -D__USE_MINGW_ANSI_STDIO=0"
- LIBS="$LIBS -lmingw32 -lwinmm"
+ LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++"
+ LIBS="$LIBS -lmingw32 -lwinmm -lgdi32"
OBJS="$OBJS scummvmwinres.o"
add_line_to_config_mk 'WIN32 = 1'
;;
@@ -1855,13 +1993,23 @@ case $_host_os in
DEFINES="$DEFINES -D_EE"
DEFINES="$DEFINES -D__PLAYSTATION2__"
;;
+ ps3)
+ # Force use of SDL from the ps3 toolchain
+ _sdlpath="$PS3DEV/portlibs/ppu:$PS3DEV/portlibs/ppu/bin"
+
+ DEFINES="$DEFINES -DPLAYSTATION3"
+ CXXFLAGS="$CXXFLAGS -mcpu=cell -mminimal-toc -I$PS3DEV/psl1ght/ppu/include -I$PS3DEV/portlibs/ppu/include"
+ LDFLAGS="$LDFLAGS -L$PS3DEV/psl1ght/ppu/lib -L$PS3DEV/portlibs/ppu/lib"
+ add_line_to_config_mk 'PLAYSTATION3 = 1'
+ add_line_to_config_h "#define PREFIX \"${prefix}\""
+ ;;
psp)
if test -d "$PSPDEV/psp/lib"; then
LDFLAGS="$LDFLAGS -L$PSPDEV/psp/lib"
fi
LDFLAGS="$LDFLAGS -L$PSPSDK/lib"
LDFLAGS="$LDFLAGS -specs=$_srcdir/backends/platform/psp/psp.spec"
- CXXFLAGS="$CXXFLAGS -O3"
+ _optimization_level=-O3
CXXFLAGS="$CXXFLAGS -I$PSPSDK/include"
# FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this.
CXXFLAGS="$CXXFLAGS -D_PSP_FW_VERSION=150"
@@ -1888,7 +2036,7 @@ case $_host_os in
_seq_midi=no
;;
wii)
- CXXFLAGS="$CXXFLAGS -Os"
+ _optimization_level=-Os
CXXFLAGS="$CXXFLAGS -mrvl"
CXXFLAGS="$CXXFLAGS -mcpu=750"
CXXFLAGS="$CXXFLAGS -meabi"
@@ -1909,7 +2057,7 @@ case $_host_os in
fi
;;
wince)
- CXXFLAGS="$CXXFLAGS -O3"
+ _optimization_level=-O3
CXXFLAGS="$CXXFLAGS -fno-inline-functions"
CXXFLAGS="$CXXFLAGS -march=armv4"
CXXFLAGS="$CXXFLAGS -mtune=xscale"
@@ -1919,9 +2067,11 @@ case $_host_os in
DEFINES="$DEFINES -DUNICODE"
DEFINES="$DEFINES -DFPM_DEFAULT"
DEFINES="$DEFINES -DNONSTANDARD_PORT"
+ DEFINES="$DEFINES -DWRAP_MALLOC"
DEFINES="$DEFINES -DWIN32"
DEFINES="$DEFINES -Dcdecl="
DEFINES="$DEFINES -D__cdecl__="
+ add_line_to_config_mk "WRAP_MALLOC = 1"
;;
esac
@@ -1947,6 +2097,22 @@ if test -n "$_host"; then
arm-riscos|linupy)
DEFINES="$DEFINES -DLINUPY"
;;
+ bada)
+ _unix=yes
+ _backend="bada"
+ _port_mk="backends/platform/bada/bada.mk"
+ if test "$_debug_build" = yes; then
+ _arm_asm=no
+ else
+ _arm_asm=yes
+ fi
+ _taskbar=no
+ _build_scalers=no
+ _seq_midi=no
+ _mt32emu=no
+ _timidity=no
+ _vkeybd=yes
+ ;;
bfin*)
;;
caanoo)
@@ -1958,13 +2124,14 @@ if test -n "$_host"; then
DEFINES="$DEFINES -DGPH_DEBUG"
else
# Use -O3 on the Caanoo for non-debug builds.
- CXXFLAGS="$CXXFLAGS -O3"
+ _optimization_level=-O3
fi
CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s"
CXXFLAGS="$CXXFLAGS -mtune=arm926ej-s"
ASFLAGS="$ASFLAGS"
_backend="gph"
_build_hq_scalers=no
+ _savegame_timestamp=no
_vkeybd=yes
_seq_midi=no
_mt32emu=no
@@ -2000,7 +2167,7 @@ if test -n "$_host"; then
if test "$_release_build" = yes; then
DEFINES="$DEFINES -DNOSERIAL"
fi
- CXXFLAGS="$CXXFLAGS -O3"
+ _optimization_level=-O3
CXXFLAGS="$CXXFLAGS -funroll-loops"
CXXFLAGS="$CXXFLAGS -fschedule-insns2"
CXXFLAGS="$CXXFLAGS -fomit-frame-pointer"
@@ -2031,6 +2198,7 @@ if test -n "$_host"; then
gamecube)
_backend="wii"
_build_scalers=no
+ _vkeybd=yes
_mt32emu=no
_port_mk="backends/platform/wii/wii.mk"
add_line_to_config_mk 'GAMECUBE = 1'
@@ -2043,7 +2211,7 @@ if test -n "$_host"; then
;;
gp2x)
# This uses the GPH backend.
- DEFINES="$DEFINES -DGPH_DEVICE"
+ DEFINES="$DEFINES -DGPH_DEVICE"
DEFINES="$DEFINES -DGP2X"
DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE"
if test "$_debug_build" = yes; then
@@ -2054,6 +2222,7 @@ if test -n "$_host"; then
LDFLAGS="$LDFLAGS -static"
_backend="gph"
_build_hq_scalers=no
+ _savegame_timestamp=no
_vkeybd=yes
_seq_midi=no
_mt32emu=no
@@ -2073,6 +2242,7 @@ if test -n "$_host"; then
ASFLAGS="$ASFLAGS -mfloat-abi=soft"
_backend="gph"
_build_hq_scalers=no
+ _savegame_timestamp=no
_vkeybd=yes
_seq_midi=no
_mt32emu=no
@@ -2091,6 +2261,23 @@ if test -n "$_host"; then
_ar="m68k-atari-mint-ar cru"
_seq_midi=no
;;
+ maemo)
+ _optimization_level=-Os
+ CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s"
+ CXXFLAGS="$CXXFLAGS -fomit-frame-pointer"
+ INCLUDES="$INCLUDES -I/usr/X11R6/include"
+ LIBS="$LIBS -lpthread"
+ LIBS="$LIBS -L/usr/lib"
+
+ _backend="maemo"
+ _vkeybd=yes
+ _build_hq_scalers=no
+ _mt32emu=no
+ _alsa=no
+ _mad=yes
+ _tremor=yes
+ _zlib=yes
+ ;;
*mingw32*)
_sdlconfig=$_host-sdl-config
_windres=$_host-windres
@@ -2139,6 +2326,7 @@ if test -n "$_host"; then
_backend="n64"
_mt32emu=no
_build_scalers=no
+ _savegame_timestamp=no
_translation=no
_keymapper=no
_text_console=no
@@ -2164,7 +2352,7 @@ if test -n "$_host"; then
DEFINES="$DEFINES -DOP_DEBUG"
else
# Use -O3 on the OpenPandora for non-debug builds.
- CXXFLAGS="$CXXFLAGS -O3"
+ _optimization_level=-O3
fi
CXXFLAGS="$CXXFLAGS -march=armv7-a"
CXXFLAGS="$CXXFLAGS -mtune=cortex-a8"
@@ -2212,6 +2400,11 @@ if test -n "$_host"; then
CXXFLAGS="$CXXFLAGS -s"
fi
;;
+ ps3)
+ _mt32emu=no
+ _timidity=no
+ _vkeybd=yes
+ ;;
psp)
_backend="psp"
_build_scalers=no
@@ -2230,16 +2423,19 @@ if test -n "$_host"; then
webos)
_backend="webos"
_port_mk="backends/platform/webos/webos.mk"
- _build_scalers=no
+ _build_scalers=yes
+ _build_hq_scalers=no
_timidity=no
_mt32emu=no
_seq_midi=no
_vkeybd=no
_keymapper=yes
+ add_line_to_config_mk "HOST_COMPILER = `uname`"
;;
wii)
_backend="wii"
_build_scalers=no
+ _vkeybd=yes
_port_mk="backends/platform/wii/wii.mk"
add_line_to_config_mk 'GAMECUBE = 0'
add_line_to_config_h '#define AUDIO_REVERSE_STEREO'
@@ -2273,6 +2469,34 @@ case $_backend in
CXXFLAGS="$CXXFLAGS -Wa,--noexecstack"
LDFLAGS="$LDFLAGS -Wl,-z,noexecstack"
;;
+ bada)
+ # dirent.h not available. NONSTANDARD_PORT==ensure portdefs.h is included
+ DEFINES="$DEFINES -DBADA -DDISABLE_STDIO_FILESTREAM -DNONSTANDARD_PORT"
+ DEFINES="$DEFINES -DNO_STDERR_STDOUT"
+ DEFINES="$DEFINES -DDISABLE_COMMAND_LINE"
+ INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/bada '
+ INCLUDES="$INCLUDES "'-I$(BADA_SDK)/include'
+ INCLUDES="$INCLUDES "'-I$(BADA_SDK_ROOT)/Include'
+ if test "$_debug_build" = yes; then
+ # debug using with the simulator
+ CXXFLAGS="$CXXFLAGS -D_DEBUG -DSHP -DBUILD_DLL -fmessage-length=0"
+ else
+ # created a shared library for inclusion via the eclipse build
+ CXXFLAGS="$CXXFLAGS -DSHP"
+ CXXFLAGS="$CXXFLAGS -fpic"
+ CXXFLAGS="$CXXFLAGS -fshort-wchar"
+ CXXFLAGS="$CXXFLAGS -mcpu=cortex-a8"
+ CXXFLAGS="$CXXFLAGS -mfpu=vfpv3"
+ CXXFLAGS="$CXXFLAGS -mfloat-abi=hard"
+ CXXFLAGS="$CXXFLAGS -mlittle-endian"
+ CXXFLAGS="$CXXFLAGS -mthumb-interwork"
+ CXXFLAGS="$CXXFLAGS -Wno-psabi"
+ CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"
+ CXXFLAGS="$CXXFLAGS -fno-short-enums"
+ fi
+ HOSTEXEPRE=lib
+ HOSTEXEEXT=.a
+ ;;
dc)
INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/dc'
INCLUDES="$INCLUDES "'-isystem $(ronindir)/include'
@@ -2307,6 +2531,9 @@ case $_backend in
linuxmoto)
DEFINES="$DEFINES -DLINUXMOTO"
;;
+ maemo)
+ DEFINES="$DEFINES -DMAEMO"
+ ;;
n64)
INCLUDES="$INCLUDES "'-I$(N64SDK)/include'
INCLUDES="$INCLUDES "'-I$(N64SDK)/mips64/include'
@@ -2350,7 +2577,8 @@ case $_backend in
;;
webos)
# There is no sdl-config in the WebOS PDK so we don't use find_sdlconfig here.
- LIBS="$LIBS -lSDL"
+ # The PDL library acts as the WebOS device toolchain, and is required to control the virtual keyboard among other OS-level events.
+ LIBS="$LIBS -lSDL -lpdl"
DEFINES="$DEFINES -DWEBOS"
DEFINES="$DEFINES -DSDL_BACKEND"
add_line_to_config_mk "SDL_BACKEND = 1"
@@ -2389,12 +2617,21 @@ MODULES="$MODULES backends/platform/$_backend"
# Setup SDL specifics for SDL based backends
#
case $_backend in
- dingux | gp2x | gph | linuxmoto | openpandora | samsungtv | sdl)
+ dingux | gp2x | gph | linuxmoto | maemo | openpandora | samsungtv | sdl)
find_sdlconfig
INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`"
LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`"
DEFINES="$DEFINES -DSDL_BACKEND"
add_line_to_config_mk "SDL_BACKEND = 1"
+
+ _sdlversion=`$_sdlconfig --version`
+ case $_sdlversion in
+ 1.3.*)
+ add_line_to_config_mk "USE_SDL13 = 1"
+ ;;
+ *)
+ ;;
+ esac
;;
esac
@@ -2403,7 +2640,7 @@ esac
# Enable 16bit support only for backends which support it
#
case $_backend in
- android | dingux | dreamcast | gph | openpandora | psp | samsungtv | sdl | webos | wii)
+ android | bada | dingux | dreamcast | gph | maemo | openpandora | psp | samsungtv | sdl | webos | wii)
if test "$_16bit" = auto ; then
_16bit=yes
else
@@ -2415,6 +2652,26 @@ case $_backend in
;;
esac
+#
+# Disable savegame timestamp support for backends which don't have a reliable real time clock
+#
+case $_backend in
+ gph | n64)
+ if test "$_savegame_timestamp" = auto ; then
+ _savegame_timestamp=no
+ else
+ _savegame_timestamp=yes
+ fi
+ ;;
+ *)
+ if test "$_savegame_timestamp" = auto ; then
+ _savegame_timestamp=yes
+ else
+ _savegame_timestamp=no
+ fi
+ ;;
+esac
+
#
# Determine whether host is POSIX compliant, or at least POSIX
@@ -2426,10 +2683,10 @@ esac
#
echo_n "Checking if host is POSIX compliant... "
case $_host_os in
- amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | psp | wii | wince)
+ amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | ps3 | psp | wii | wince)
_posix=no
;;
- android | beos* | bsd* | darwin* | freebsd* | gph-linux | haiku* | hpux* | iphone | irix* | linux* | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos)
+ android | beos* | bsd* | darwin* | freebsd* | gph-linux | haiku* | hpux* | iphone | irix* | linux* | maemo | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos)
_posix=yes
;;
os2-emx*)
@@ -2458,6 +2715,29 @@ echo_n "Checking whether to have a verbose build... "
echo "$_verbose_build"
add_to_config_mk_if_yes "$_verbose_build" 'VERBOSE_BUILD = 1'
+
+#
+# If a specific optimization level was requested, enable optimizations
+#
+if test -n "$_optimization_level" ; then
+ # Ports will specify an optimization level and expect that to be enabled
+ if test "$_optimizations" != no ; then
+ _optimizations=yes
+ fi
+else
+ _optimization_level=$_default_optimization_level
+fi
+
+#
+# Check whether to enable optimizations
+#
+if test "$_optimizations" = yes ; then
+ # Enable optimizations. This also
+ # makes it possible to use -Wuninitialized, so let's do that.
+ CXXFLAGS="$CXXFLAGS $_optimization_level"
+ CXXFLAGS="$CXXFLAGS -Wuninitialized"
+fi
+
#
# Check whether plugin support is requested and possible
#
@@ -2511,7 +2791,9 @@ POST_OBJS_FLAGS := -Wl,--no-whole-archive
;;
ds)
_elf_loader=yes
- DEFINES="$DEFINES -DARM_TARGET -DELF_LOADER_CXA_ATEXIT -DUNCACHED_PLUGINS -DELF_NO_MEM_MANAGER"
+ DEFINES="$DEFINES -DELF_LOADER_CXA_ATEXIT"
+ DEFINES="$DEFINES -DUNCACHED_PLUGINS"
+ DEFINES="$DEFINES -DELF_NO_MEM_MANAGER"
_mak_plugins='
PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/ds/plugin.ld -mthumb-interwork -mno-fpu
'
@@ -2529,7 +2811,8 @@ POST_OBJS_FLAGS := -Wl,-no-whole-archive
;;
gamecube | wii)
_elf_loader=yes
- DEFINES="$DEFINES -DPPC_TARGET -DELF_LOADER_CXA_ATEXIT -DUNCACHED_PLUGINS"
+ DEFINES="$DEFINES -DELF_LOADER_CXA_ATEXIT"
+ DEFINES="$DEFINES -DUNCACHED_PLUGINS"
_mak_plugins='
PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/wii/plugin.ld
'
@@ -2546,6 +2829,19 @@ PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive
POST_OBJS_FLAGS := -Wl,-no-whole-archive
'
;;
+ irix*)
+ _plugin_prefix="lib"
+ _plugin_suffix=".so"
+ CXXFLAGS="$CXXFLAGS -fpic"
+ LIBS="$LIBS -ldl"
+_mak_plugins='
+PLUGIN_EXTRA_DEPS =
+PLUGIN_LDFLAGS += -shared -static-libgcc
+PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive
+POST_OBJS_FLAGS := -Wl,-no-whole-archive
+'
+ ;;
+
linux*)
_plugin_prefix="lib"
_plugin_suffix=".so"
@@ -2582,7 +2878,6 @@ POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-im
;;
ps2)
_elf_loader=yes
- DEFINES="$DEFINES -DMIPS_TARGET"
_mak_plugins='
LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/main_prog.ld
PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/plugin.ld -lstdc++ -lc
@@ -2590,7 +2885,7 @@ PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backend
;;
psp)
_elf_loader=yes
- DEFINES="$DEFINES -DMIPS_TARGET -DUNCACHED_PLUGINS"
+ DEFINES="$DEFINES -DUNCACHED_PLUGINS"
_mak_plugins='
LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/main_prog.ld
PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/plugin.ld -lstdc++ -lc
@@ -2656,6 +2951,11 @@ define_in_config_if_yes "$_mt32emu" 'USE_MT32EMU'
define_in_config_if_yes "$_16bit" 'USE_RGB_COLOR'
#
+# Check whether save games use the current time as default description
+#
+define_in_config_if_yes "$_savegame_timestamp" 'USE_SAVEGAME_TIMESTAMP'
+
+#
# Check whether to enable the (hq) scalers
#
if test "$_build_scalers" = no ; then
@@ -2918,6 +3218,30 @@ if test `get_engine_build sword25` = yes && test ! "$_zlib" = yes ; then
fi
#
+# Check for Sparkle if updates support is enabled
+#
+echocheck "Sparkle"
+if test "$_updates" = no; then
+ _sparkle=no
+else
+if test "$_sparkle" = auto ; then
+ _sparkle=no
+ cat > $TMPC << EOF
+#include <Cocoa/Cocoa.h>
+#include <Sparkle/Sparkle.h>
+int main(void) { SUUpdater *updater = [SUUpdater sharedUpdater]; return 0; }
+EOF
+ cc_check $SPARKLE_CFLAGS $SPARKLE_LIBS -framework Sparkle -ObjC++ -lobjc && _sparkle=yes
+fi
+if test "$_sparkle" = yes ; then
+ LIBS="$LIBS $SPARKLE_LIBS -framework Sparkle"
+ INCLUDES="$INCLUDES $SPARKLE_CFLAGS"
+fi
+define_in_config_if_yes "$_sparkle" 'USE_SPARKLE'
+fi
+echo "$_sparkle"
+
+#
# Check for libfluidsynth
#
echocheck "libfluidsynth"
@@ -2996,8 +3320,8 @@ if test "$_libunity" = auto ; then
;;
*)
# Unity has a lots of dependencies, update the libs and cflags var with them
- LIBUNITY_LIBS="$LIBUNITY_LIBS $(pkg-config --libs unity = 3.8.4)"
- LIBUNITY_CFLAGS="$LIBUNITY_CFLAGS $(pkg-config --cflags unity = 3.8.4)"
+ LIBUNITY_LIBS="$LIBUNITY_LIBS $(pkg-config --libs unity = 3.8.4 2>> "$TMPLOG")"
+ LIBUNITY_CFLAGS="$LIBUNITY_CFLAGS $(pkg-config --cflags unity = 3.8.4 2>> "$TMPLOG")"
_libunity=no
cat > $TMPC << EOF
#include <unity.h>
@@ -3006,12 +3330,12 @@ int main(void) {
return 0;
}
EOF
- cc_check $LIBUNITY_CFLAGS $LIBUNITY_LIBS -lunity && _libunity=yes
+ cc_check $LIBUNITY_CFLAGS $LIBUNITY_LIBS && _libunity=yes
;;
esac
fi
if test "$_libunity" = yes ; then
- LIBS="$LIBS $LIBUNITY_LIBS -lunity"
+ LIBS="$LIBS $LIBUNITY_LIBS"
INCLUDES="$INCLUDES $LIBUNITY_CFLAGS"
fi
define_in_config_h_if_yes "$_libunity" 'USE_TASKBAR_UNITY'
@@ -3093,6 +3417,14 @@ EOF
fi
fi
+case $_host_os in
+ bada)
+ # components live in non-standard locations so just assume sane SDK
+ _opengl=yes
+ _opengles=yes
+ ;;
+esac
+
if test "$_opengles" = "yes" ; then
echo "yes (OpenGL ES)"
else
@@ -3205,7 +3537,7 @@ if test "$_taskbar" = yes; then
echo "win32"
;;
*)
- if test "$_unity" = yes; then
+ if test "$_libunity" = yes; then
echo "unity"
else
echo "$_taskbar"
@@ -3217,6 +3549,28 @@ else
fi
#
+# Check whether to build Bink video support
+#
+echo_n "Building Bink video support... "
+define_in_config_if_yes $_bink 'USE_BINK'
+echo "$_bink"
+
+#
+# Check whether to build updates support
+#
+echo_n "Building updates support... "
+define_in_config_if_yes $_updates 'USE_UPDATES'
+if test "$_updates" = yes; then
+ if test "$_sparkle" = yes; then
+ echo "Sparkle"
+ else
+ echo "$_updates"
+ fi
+else
+ echo "$_updates"
+fi
+
+#
# Figure out installation directories
#
test "x$prefix" = xNONE && prefix=/usr/local
@@ -3229,8 +3583,8 @@ case $_backend in
# Add ../plugins as a path so plugins can be found when running from a .PND.
DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"../plugins\\\""
;;
- webos)
- # The WebOS app wants the plugins in the "lib" directory
+ maemo | webos)
+ # The WebOS and Maemo apps want the plugins in the "lib" directory
# without a scummvm sub directory.
DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"$libdir\\\""
;;
@@ -3252,6 +3606,10 @@ fi
echo_n "Backend... "
echo_n "$_backend"
+if test "$_backend" = "sdl" -a -n "$_sdlversion"; then
+ echo_n " ($_sdlversion)"
+fi
+
if test "$_nasm" = yes ; then
echo_n ", assembly routines"
fi
@@ -3260,6 +3618,10 @@ if test "$_16bit" = yes ; then
echo_n ", 16bit color"
fi
+if test "$_savegame_timestamp" = yes ; then
+ echo_n ", savegame timestamp"
+fi
+
if test "$_build_scalers" = yes ; then
if test "$_build_hq_scalers" = yes ; then
echo_n ", HQ scalers"
@@ -3318,7 +3680,7 @@ case $_backend in
LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM"
;;
n64)
- # Move some libs down here, otherwise some symbols requires by libvorbis aren't found
+ # Move some libs down here, otherwise some symbols requires by libvorbis aren't found
# during linking stage
LIBS="$LIBS -lc -lgcc -lnosys"
;;
@@ -3332,6 +3694,15 @@ _engines_built_static=""
_engines_built_dynamic=""
_engines_skipped=""
+# Show a message if looping over engines takes longer than 5 secs
+sh -c "
+ touch config.gnomes
+ sleep 5
+ if test -f config.gnomes; then
+ printf 'Employing little gnomes...'
+ rm -f config.gnomes
+ fi" 2>/dev/null &
+
for engine in $_engines; do
if test "`get_engine_sub $engine`" = "no" ; then
# It's a main engine
@@ -3385,17 +3756,21 @@ done
for engine in $_engines; do
engine_build=`get_engine_build $engine`
engine_build_default=`get_engine_build_default $engine`
- engine_wip=false
if test $engine_build != no -a $engine_build_default = no ; then
- engine_wip=true
set_var _tainted_build "yes"
fi
- engine_wip_defname="ENGINE_WIP_`echo $engine | tr '[a-z]' '[A-Z]'`"
- add_line_to_config_h "#define $engine_wip_defname $engine_wip"
done
add_to_config_h_if_yes `get_var _tainted_build` '#define TAINTED_BUILD'
+# Complete the message on slow systems
+if test -f config.gnomes ; then
+ # Kill does not work well here as it produces nasty 'Killed' message
+ rm -rf config.gnomes
+else
+ echo " work is done"
+fi
+
#
# Show which engines ("frontends") are to be built
#
@@ -3467,6 +3842,7 @@ AS := $_as
ASFLAGS := $ASFLAGS
WINDRES := $_windres
WINDRESFLAGS := $WINDRESFLAGS
+STAGINGPATH=$_stagingpath
WIN32PATH=$_win32path
AOS4PATH=$_aos4path
STATICLIBPATH=$_staticlibpath
diff --git a/devtools/convbdf.c b/devtools/convbdf.c
index 4b1640dba7..e465b77a9c 100644
--- a/devtools/convbdf.c
+++ b/devtools/convbdf.c
@@ -721,7 +721,7 @@ int gen_c_source(struct font* pf, char *path) {
char bbuf[256];
char hdr1[] = {
"/* Generated by convbdf on %s. */\n"
- "#include \"graphics/font.h\"\n"
+ "#include \"graphics/fonts/bdf.h\"\n"
"\n"
"/* Font information:\n"
" name: %s\n"
@@ -890,7 +890,7 @@ int gen_c_source(struct font* pf, char *path) {
fprintf(ofp,
"/* Exported structure definition. */\n"
- "static const FontDesc desc = {\n"
+ "static const BdfFontDesc desc = {\n"
"\t" "\"%s\",\n"
"\t" "%d,\n"
"\t" "%d,\n"
@@ -917,7 +917,7 @@ int gen_c_source(struct font* pf, char *path) {
pf->defaultchar);
fprintf(ofp, "\n" "#if !(defined(__GP32__))\n");
- fprintf(ofp, "extern const NewFont g_sysfont(desc);\n");
+ fprintf(ofp, "extern const BdfFont g_sysfont(desc);\n");
fprintf(ofp, "#else\n");
fprintf(ofp, "DEFINE_FONT(g_sysfont)\n");
fprintf(ofp, "#endif\n");
diff --git a/devtools/create_drascula/Makefile b/devtools/create_drascula/Makefile
deleted file mode 100644
index 3052436b55..0000000000
--- a/devtools/create_drascula/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-# $Id$
-
-all:
- g++ -I../.. create_drascula.cpp -o create_drascula
diff --git a/devtools/create_drascula/dists/msvc8/create_drascula.sln b/devtools/create_drascula/dists/msvc8/create_drascula.sln
deleted file mode 100644
index dc7428bb80..0000000000
--- a/devtools/create_drascula/dists/msvc8/create_drascula.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_drascula", "create_drascula.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/devtools/create_drascula/dists/msvc8/create_drascula.vcproj b/devtools/create_drascula/dists/msvc8/create_drascula.vcproj
deleted file mode 100644
index 3b26261a76..0000000000
--- a/devtools/create_drascula/dists/msvc8/create_drascula.vcproj
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="create_drascula"
- ProjectGUID="{5F280130-349D-11DD-AE16-0800200C9A66}"
- RootNamespace="create_drascula"
- Keyword="Win32Proj"
- >
- <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"
- 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_drascula.exe"
- LinkIncremental="2"
- IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/create_drascula.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="VCWebDeploymentTool"
- />
- <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_drascula.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="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\create_drascula.cpp"
- >
- </File>
- <File
- RelativePath="..\..\create_drascula.h"
- >
- </File>
- <File
- RelativePath="..\..\staticdata.h"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/create_drascula/dists/msvc8_to_msvc9.bat b/devtools/create_drascula/dists/msvc8_to_msvc9.bat
deleted file mode 100644
index 54820b34d0..0000000000
--- a/devtools/create_drascula/dists/msvc8_to_msvc9.bat
+++ /dev/null
@@ -1,32 +0,0 @@
-@echo off
-rem This batch file is used to convert MSVC8 (Visual Studio 2005) project files to MSVC9 (Visual Studio 2008) ones
-rem You need the Windows version of GNU rpl
-rem Get it here:
-rem http://gnuwin32.sourceforge.net/packages/rpl.htm
-rem Place rpl.exe from the bin folder inside the archive in the folder where
-rem this batch file resides
-
-if not exist rpl.exe goto no_rpl
-
-echo Creating MSVC9 project files from the MSVC8 ones
-copy /y msvc8\*.vcproj msvc9\
-copy /y msvc8\*.sln msvc9\
-rpl -e -q "Version=\"8.00\"" "Version=\"9.00\"" msvc9\*.vcproj
-rpl -e -q "Version=\"8,00\"" "Version=\"9,00\"" msvc9\*.vcproj
-rpl -e -q "Keyword=\"Win32Proj\"" "Keyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"131072\"" msvc9\*.vcproj
-rpl -e -q "EntryPointSymbol=\"WinMainCRTStartup\"" "EntryPointSymbol=\"WinMainCRTStartup\"\n\t\t\t\tRandomizedBaseAddress=\"1\"\n\t\t\t\tDataExecutionPrevention=\"0\"" msvc9\*.vcproj
-rpl -e -q "Format Version 9.00" "Format Version 10.00" msvc9\*.sln
-rpl -e -q "Format Version 9,00" "Format Version 10,00" msvc9\*.sln
-rpl -e -q "# Visual C++ Express 2005" "# Visual C++ Express 2008" msvc9\*.sln
-rpl -e -q "# Visual Studio 2005" "# Visual Studio 2008" msvc9\*.sln
-goto the_end
-
-:no_rpl
-echo You need the Windows version of GNU rpl
-echo Get it here:
-echo http://gnuwin32.sourceforge.net/packages/rpl.htm
-echo Place rpl.exe from the bin folder inside the archive in the folder where
-echo this batch file resides
-
-:the_end
-pause
diff --git a/devtools/create_drascula/dists/msvc9/create_drascula.sln b/devtools/create_drascula/dists/msvc9/create_drascula.sln
deleted file mode 100644
index 4a39bdbe42..0000000000
--- a/devtools/create_drascula/dists/msvc9/create_drascula.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_drascula", "create_drascula.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/devtools/create_drascula/dists/msvc9/create_drascula.vcproj b/devtools/create_drascula/dists/msvc9/create_drascula.vcproj
deleted file mode 100644
index f30d6a114b..0000000000
--- a/devtools/create_drascula/dists/msvc9/create_drascula.vcproj
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="create_drascula"
- ProjectGUID="{5F280130-349D-11DD-AE16-0800200C9A66}"
- RootNamespace="create_drascula"
- 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"
- 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_drascula.exe"
- LinkIncremental="2"
- IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/create_drascula.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="VCWebDeploymentTool"
- />
- <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_drascula.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="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\create_drascula.cpp"
- >
- </File>
- <File
- RelativePath="..\..\create_drascula.h"
- >
- </File>
- <File
- RelativePath="..\..\staticdata.h"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/create_drascula/dists/msvc9_to_msvc8.bat b/devtools/create_drascula/dists/msvc9_to_msvc8.bat
deleted file mode 100644
index c87a524f77..0000000000
--- a/devtools/create_drascula/dists/msvc9_to_msvc8.bat
+++ /dev/null
@@ -1,33 +0,0 @@
-@echo off
-rem This batch file is used to convert MSVC9 (Visual Studio 2008) project files to MSVC8 (Visual Studio 2005) ones
-rem You need the Windows version of GNU rpl
-rem Get it here:
-rem http://gnuwin32.sourceforge.net/packages/rpl.htm
-rem Place rpl.exe from the bin folder inside the archive in the folder where
-rem this batch file resides
-
-if not exist rpl.exe goto no_rpl
-
-echo Creating MSVC8 project files from the MSVC9 ones
-copy /y msvc9\*.vcproj msvc8\
-copy /y msvc9\*.sln msvc8\
-rpl -e -q "Version=\"9.00\"" "Version=\"8.00\"" msvc8\*.vcproj
-rpl -e -q "Version=\"9,00\"" "Version=\"8,00\"" msvc8\*.vcproj
-rpl -e -q "\tTargetFrameworkVersion=\"131072\"\n" "" msvc8\*.vcproj
-rpl -e -q "\t\t\t\tRandomizedBaseAddress=\"1\"\n" "" msvc8\*.vcproj
-rpl -e -q "\t\t\t\tDataExecutionPrevention=\"0\"\n" "" msvc8\*.vcproj
-rpl -e -q "Format Version 10.00" "Format Version 9.00" msvc8\*.sln
-rpl -e -q "Format Version 10,00" "Format Version 9,00" msvc8\*.sln
-rpl -e -q "# Visual C++ Express 2008" "# Visual C++ Express 2005" msvc8\*.sln
-rpl -e -q "# Visual Studio 2008" "# Visual Studio 2005" msvc8\*.sln
-goto the_end
-
-:no_rpl
-echo You need the Windows version of GNU rpl
-echo Get it here:
-echo http://gnuwin32.sourceforge.net/packages/rpl.htm
-echo Place rpl.exe from the bin folder inside the archive in the folder where
-echo this batch file resides
-
-:the_end
-pause
diff --git a/devtools/create_hugo/README b/devtools/create_hugo/README
index 42bdd22c36..0d57d5eae5 100644
--- a/devtools/create_hugo/README
+++ b/devtools/create_hugo/README
@@ -4,4 +4,3 @@ is used by the engine depending on the version of the game started.
In order to work properly, the content of the DATA sub-directory has to be
copy next to the executable.
-
diff --git a/devtools/create_hugo/dists/msvc10/create_hugo.sln b/devtools/create_hugo/dists/msvc10/create_hugo.sln
deleted file mode 100644
index a6f87198f6..0000000000
--- a/devtools/create_hugo/dists/msvc10/create_hugo.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_hugo", "create_hugo.vcxproj", "{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/devtools/create_hugo/dists/msvc10/create_hugo.vcxproj b/devtools/create_hugo/dists/msvc10/create_hugo.vcxproj
deleted file mode 100644
index eae5fbc55c..0000000000
--- a/devtools/create_hugo/dists/msvc10/create_hugo.vcxproj
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{5F280130-349D-11DD-AE16-0800200C9A66}</ProjectGuid>
- <RootNamespace>create_hugo</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
- <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
- <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
- <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
- <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
- <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>true</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)create_hugo.exe</OutputFile>
- <IgnoreSpecificDefaultLibraries>libc.lib;libcmt.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(OutDir)create_hugo.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
- <Optimization>Full</Optimization>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)create_hugo.exe</OutputFile>
- <IgnoreSpecificDefaultLibraries>libc.lib;libcmt.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\..\create_hugo.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\create_hugo.h" />
- <ClInclude Include="..\..\enums.h" />
- <ClInclude Include="..\..\staticdata.h" />
- <ClInclude Include="..\..\staticdisplay.h" />
- <ClInclude Include="..\..\staticengine.h" />
- <ClInclude Include="..\..\staticfont.h" />
- <ClInclude Include="..\..\staticintro.h" />
- <ClInclude Include="..\..\staticmouse.h" />
- <ClInclude Include="..\..\staticparser.h" />
- <ClInclude Include="..\..\staticutil.h" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/devtools/create_hugo/dists/msvc9/create_hugo.sln b/devtools/create_hugo/dists/msvc9/create_hugo.sln
deleted file mode 100644
index 2d86ae4f19..0000000000
--- a/devtools/create_hugo/dists/msvc9/create_hugo.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-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/devtools/create_hugo/dists/msvc9/create_hugo.vcproj b/devtools/create_hugo/dists/msvc9/create_hugo.vcproj
deleted file mode 100644
index 473d89e43c..0000000000
--- a/devtools/create_hugo/dists/msvc9/create_hugo.vcproj
+++ /dev/null
@@ -1,219 +0,0 @@
-<?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="..\..\staticfont.h"
- >
- </File>
- <File
- RelativePath="..\..\staticintro.h"
- >
- </File>
- <File
- RelativePath="..\..\staticmouse.h"
- >
- </File>
- <File
- RelativePath="..\..\staticparser.h"
- >
- </File>
- <File
- RelativePath="..\..\staticutil.h"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/create_hugo/staticdata.h b/devtools/create_hugo/staticdata.h
index 582d5aaa8e..612e044982 100644
--- a/devtools/create_hugo/staticdata.h
+++ b/devtools/create_hugo/staticdata.h
@@ -11682,4 +11682,3 @@ int16 def_tunes_2d[] = {-1};
int16 def_tunes_3d[] = {-1};
#endif
-
diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp
index e4686cc66c..627b517c62 100644
--- a/devtools/create_kyradat/create_kyradat.cpp
+++ b/devtools/create_kyradat/create_kyradat.cpp
@@ -45,7 +45,7 @@
#include <map>
enum {
- kKyraDatVersion = 74
+ kKyraDatVersion = 78
};
const ExtractFilename extractFilenames[] = {
@@ -119,6 +119,7 @@ const ExtractFilename extractFilenames[] = {
// AUDIO filename table
{ k1AudioTracks, kTypeStringList, false },
+ { k1AudioTracks2, kTypeStringList, false },
{ k1AudioTracksIntro, kTypeStringList, false },
// AMULET anim
@@ -219,7 +220,7 @@ const ExtractFilename extractFilenames[] = {
// Ingame
{ kLolIngamePakFiles, kTypeStringList, false },
- { kLolCharacterDefs, kLolTypeCharData, false },
+ { kLolCharacterDefs, kLolTypeCharData, true },
{ kLolIngameSfxFiles, k2TypeSfxList, false },
{ kLolIngameSfxIndex, kTypeRawData, false },
{ kLolMusicTrackMap, kTypeRawData, false },
@@ -330,7 +331,7 @@ const TypeTable gameTable[] = {
};
byte getGameID(int game) {
- return std::find(gameTable, gameTable + ARRAYSIZE(gameTable) - 1, game)->value;
+ return std::find(gameTable, ARRAYEND(gameTable) - 1, game)->value;
}
const TypeTable languageTable[] = {
@@ -341,11 +342,12 @@ const TypeTable languageTable[] = {
{ ES_ESP, 4 },
{ IT_ITA, 5 },
{ JA_JPN, 6 },
+ { RU_RUS, 7 },
{ -1, -1 }
};
byte getLanguageID(int lang) {
- return std::find(languageTable, languageTable + ARRAYSIZE(languageTable) - 1, lang)->value;
+ return std::find(languageTable, ARRAYEND(languageTable) - 1, lang)->value;
}
const TypeTable platformTable[] = {
@@ -358,7 +360,7 @@ const TypeTable platformTable[] = {
};
byte getPlatformID(int platform) {
- return std::find(platformTable, platformTable + ARRAYSIZE(platformTable) - 1, platform)->value;
+ return std::find(platformTable, ARRAYEND(platformTable) - 1, platform)->value;
}
const TypeTable specialTable[] = {
@@ -366,11 +368,12 @@ const TypeTable specialTable[] = {
{ kTalkieVersion, 1 },
{ kDemoVersion, 2 },
{ kTalkieDemoVersion, 3 },
+ { kOldFloppy, 4 },
{ -1, -1 }
};
byte getSpecialID(int special) {
- return std::find(specialTable, specialTable + ARRAYSIZE(specialTable) - 1, special)->value;
+ return std::find(specialTable, ARRAYEND(specialTable) - 1, special)->value;
}
// filename processing
@@ -767,6 +770,8 @@ const char *getIdString(const int id) {
return "k1CharacterImageFilenames";
case k1AudioTracks:
return "k1AudioTracks";
+ case k1AudioTracks2:
+ return "k1AudioTracks2";
case k1AudioTracksIntro:
return "k1AudioTracksIntro";
case k1ItemNames:
@@ -1433,4 +1438,3 @@ bool getExtractionData(const Game *g, Search &search, ExtractMap &map) {
return result;
}
-
diff --git a/devtools/create_kyradat/create_kyradat.h b/devtools/create_kyradat/create_kyradat.h
index 22a6db4b39..cabf65706f 100644
--- a/devtools/create_kyradat/create_kyradat.h
+++ b/devtools/create_kyradat/create_kyradat.h
@@ -131,6 +131,7 @@ enum kExtractID {
k1ConfigStrings,
k1AudioTracks,
+ k1AudioTracks2,
k1AudioTracksIntro,
k1CreditsStrings,
@@ -275,7 +276,8 @@ enum kSpecial {
kNoSpecial = 0,
kTalkieVersion,
kDemoVersion,
- kTalkieDemoVersion
+ kTalkieDemoVersion,
+ kOldFloppy
};
enum kGame {
diff --git a/devtools/create_kyradat/extract.cpp b/devtools/create_kyradat/extract.cpp
index 5581dacec0..371f2f4e2b 100644
--- a/devtools/create_kyradat/extract.cpp
+++ b/devtools/create_kyradat/extract.cpp
@@ -127,7 +127,7 @@ const ExtractType *findExtractType(const int type) {
}
byte getTypeID(int type) {
- return std::find(typeTable, typeTable + ARRAYSIZE(typeTable) - 1, type)->value;
+ return std::find(typeTable, ARRAYEND(typeTable) - 1, type)->value;
}
// Extractor implementation
@@ -142,19 +142,56 @@ bool extractRaw(PAKFile &out, const ExtractInformation *info, const byte *data,
}
bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int fmtPatch = 0;
+ // Skip tables for skipping English string left-overs in the hacky Russian fan translations
+ static const uint8 rusFanSkip_k2SeqplayStrings[] = { 1, 3, 5, 8, 10, 11, 13, 15, 17, 20, 22, 25, 26, 30, 33, 38, 40, 41, 44, 49, 51, 55, 104, 119, 121, 123 };
+ static const uint8 rusFanSkip_k1IntroStrings[] = { 3, 5, 9, 11, 13, 16, 18, 21, 24, 32, 34, 36, 38, 41, 44, 49, 52, 55, 57, 59, 61, 64, 66, 69, 72, 75 };
+ static const uint8 rusFanSkip_k1ThePoisonStrings[] = { 1, 4 };
+ static const uint8 rusFanSkip_k1FullFlaskStrings[] = { 1, 2, 4, 5, 7 };
+ static const uint8 rusFanSkip_k1WispJewelStrings[] = { 2 };
+ static const uint8 rusFanSkip_k1GUIStrings[] = { 1, 3, 6, 8, 11, 13, 18 };
+ uint32 rusFanSkipIdLen = 0;
+ const uint8 *rusFanSkipId = 0;
+ int rusFanEmptyId = 10000;
+ uint32 skipCount = 0;
+
+ int patch = 0;
// FM Towns files that need addional patches
if (info->platform == kPlatformFMTowns) {
if (id == k1TakenStrings || id == k1NoDropStrings || id == k1PoisonGoneString ||
id == k1ThePoisonStrings || id == k1FluteStrings || id == k1WispJewelStrings)
- fmtPatch = 1;
+ patch = 1;
else if (id == k1IntroStrings)
- fmtPatch = 2;
+ patch = 2;
else if (id == k2SeqplayStrings)
- fmtPatch = 3;
+ patch = 3;
} else if (info->platform == kPlatformPC) {
if (id == k2IngamePakFiles)
- fmtPatch = 4;
+ patch = 4;
+
+ if (info->lang == Common::RU_RUS) {
+ patch = 5;
+ if (id == k2SeqplayStrings) {
+ rusFanSkipId = rusFanSkip_k2SeqplayStrings;
+ rusFanSkipIdLen = ARRAYSIZE(rusFanSkip_k2SeqplayStrings);
+ rusFanEmptyId = 81;
+ } else if (id == k1IntroStrings) {
+ rusFanSkipId = rusFanSkip_k1IntroStrings;
+ rusFanSkipIdLen = ARRAYSIZE(rusFanSkip_k1IntroStrings);
+ rusFanEmptyId = 30;
+ } else if (id == k1ThePoisonStrings) {
+ rusFanSkipId = rusFanSkip_k1ThePoisonStrings;
+ rusFanSkipIdLen = ARRAYSIZE(rusFanSkip_k1ThePoisonStrings);
+ } else if (id == k1FullFlaskString) {
+ rusFanSkipId = rusFanSkip_k1FullFlaskStrings;
+ rusFanSkipIdLen = ARRAYSIZE(rusFanSkip_k1FullFlaskStrings);
+ } else if (id == k1GUIStrings) {
+ rusFanSkipId = rusFanSkip_k1GUIStrings;
+ rusFanSkipIdLen = ARRAYSIZE(rusFanSkip_k1GUIStrings);
+ } else if (id == k1WispJewelStrings) {
+ rusFanSkipId = rusFanSkip_k1WispJewelStrings;
+ rusFanSkipIdLen = ARRAYSIZE(rusFanSkip_k1WispJewelStrings);
+ }
+ }
// HACK
if (id == k2SeqplayIntroTracks && info->game == kLol)
@@ -183,7 +220,7 @@ bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *da
break;
targetsize--;
}
- if (fmtPatch == 1) {
+ if (patch == 1) {
// Here is the first step of the extra treatment for all FM-TOWNS string arrays that
// contain more than one string and which the original code
// addresses via stringname[boolJapanese].
@@ -201,11 +238,38 @@ bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *da
targetsize--;
}
}
+ } else if (patch == 5) {
+ ++skipCount;
+ while (!data[i + 1]) {
+ if (skipCount == rusFanEmptyId) {
+ ++skipCount;
+ ++entries;
+ break;
+ }
+ if (++i == size)
+ break;
+ targetsize--;
+ }
+
+ // Skip English string left-overs in the hacky Russian fan translation
+ for (uint32 ii = 0; ii < rusFanSkipIdLen; ++ii) {
+ if (skipCount == rusFanSkipId[ii]) {
+ ++skipCount;
+ uint32 len = strlen((const char*) data + i);
+ i += len;
+ targetsize = targetsize - 1 - len;
+ while (!data[i + 1]) {
+ if (++i == len)
+ break;
+ targetsize--;
+ }
+ }
+ }
}
}
}
- if (fmtPatch == 2) {
+ if (patch == 2) {
if (info->lang == EN_ANY) {
targetsize--;
entries += 1;
@@ -215,12 +279,12 @@ bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *da
}
}
- if (fmtPatch == 3) {
+ if (patch == 3) {
entries++;
targetsize++;
}
- if (fmtPatch == 4) {
+ if (patch == 4) {
targetsize -= 9;
}
@@ -229,12 +293,13 @@ bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *da
memset(buffer, 0, targetsize);
uint8 *output = buffer;
const uint8 *input = (const uint8*) data;
+ skipCount = 0;
WRITE_BE_UINT32(output, entries); output += 4;
if (info->platform == kPlatformFMTowns) {
const byte *c = data + size;
do {
- if (fmtPatch == 2 && input - data == 0x3C0 && input[0x10] == 0x32) {
+ if (patch == 2 && input - data == 0x3C0 && input[0x10] == 0x32) {
memcpy(output, input, 0x0F);
input += 0x11; output += 0x0F;
}
@@ -245,14 +310,14 @@ bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *da
// skip empty entries
while (!*input) {
// Write one empty string into intro strings file
- if (fmtPatch == 2) {
+ if (patch == 2) {
if ((info->lang == EN_ANY && input - data == 0x260) ||
(info->lang == JA_JPN && (input - data == 0x2BD || input - data == 0x2BE)))
*output++ = *input;
}
// insert one dummy string at hof sequence strings position 59
- if (fmtPatch == 3) {
+ if (patch == 3) {
if ((info->lang == EN_ANY && input - data == 0x695) ||
(info->lang == JA_JPN && input - data == 0x598))
*output++ = *input;
@@ -262,7 +327,7 @@ bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *da
break;
}
- if (fmtPatch == 1) {
+ if (patch == 1) {
// Here is the extra treatment for all FM-TOWNS string arrays that
// contain more than one string and which the original code
// addresses via stringname[boolJapanese].
@@ -292,9 +357,38 @@ bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *da
++dstPos;
}
targetsize = dstPos + 4;
+ } else if (patch == 5) {
+ const byte *c = data + size;
+ do {
+ strcpy((char*) output, (const char*) input);
+ uint32 stringsize = strlen((const char*)output) + 1;
+ input += stringsize; output += stringsize;
+
+ ++skipCount;
+ while (!*input) {
+ if (skipCount == rusFanEmptyId) {
+ *output++ = *input;
+ ++skipCount;
+ }
+ if (++input == c)
+ break;
+ }
+ // Skip English string left-overs in the hacky Russian fan translation
+ for (uint32 ii = 0; ii < rusFanSkipIdLen; ++ii) {
+ if (skipCount == rusFanSkipId[ii]) {
+ ++skipCount;
+ input += strlen((const char*)input);
+ while (!*input) {
+ if (++input == c)
+ break;
+ }
+ }
+ }
+
+ } while (input < c);
} else {
uint32 copySize = size;
- if (fmtPatch == 4) {
+ if (patch == 4) {
memcpy(output, data, 44);
output += 44;
data += 44;
@@ -981,4 +1075,3 @@ bool extractMrShapeAnimData(PAKFile &out, const ExtractInformation *info, const
}
} // end of anonymous namespace
-
diff --git a/devtools/create_kyradat/extract.h b/devtools/create_kyradat/extract.h
index fc473b33d1..a44927427f 100644
--- a/devtools/create_kyradat/extract.h
+++ b/devtools/create_kyradat/extract.h
@@ -72,4 +72,3 @@ const ExtractType *findExtractType(const int type);
byte getTypeID(int type);
#endif
-
diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp
index 76d5d70186..86f3535f10 100644
--- a/devtools/create_kyradat/games.cpp
+++ b/devtools/create_kyradat/games.cpp
@@ -44,6 +44,7 @@ const Game kyra1Games[] = {
{ kKyra1, { FR_FRA, -1, -1 }, kPlatformPC, kNoSpecial, { "aa9d6d78d8b199deaf48efeca6d19af2", 0 } },
{ kKyra1, { IT_ITA, -1, -1 }, kPlatformPC, kNoSpecial, { "5d7550306b369a3492f9f3402702477c", 0 } },
{ kKyra1, { ES_ESP, -1, -1 }, kPlatformPC, kNoSpecial, { "9ff130d2558bcd674d4074849d93c362", 0 } },
+ { kKyra1, { RU_RUS, -1, -1 }, kPlatformPC, kOldFloppy, { "3b4719e1f8a4d67813b7ada29774aead", 0 } },
// Talkie
{ kKyra1, { EN_ANY, -1, -1 }, kPlatformPC, kTalkieVersion, { "1ebc18f3e7fbb72474a55cb0fa089ed4", 0 } },
@@ -71,6 +72,7 @@ const Game kyra2Games[] = {
{ kKyra2, { FR_FRA, -1, -1 }, kPlatformPC, kNoSpecial, { "df31cc9e37e1cf68df2fdc75ddf2d87b", "fc2c6782778e6c6d5a553d1cb73c98ad" } },
{ kKyra2, { DE_DEU, -1, -1 }, kPlatformPC, kNoSpecial, { "0ca4f9a1438264a4c63c3218e064ed3b", "0d9b0eb7b0ad889ec942d74d80dde1bf" } },
{ kKyra2, { IT_ITA, -1, -1 }, kPlatformPC, kNoSpecial, { "178d3ab913f61bfba21d2fb196405e8c", "3a61ed6b7c00ddae383a0361799e2ba6" } },
+ { kKyra2, { RU_RUS, -1, -1 }, kPlatformPC, kNoSpecial, { "fd6a388c01de9a578e24e3bbeacd8012", "3a61ed6b7c00ddae383a0361799e2ba6" } },
// talkie games
{ kKyra2, { EN_ANY, FR_FRA, DE_DEU }, kPlatformPC, kTalkieVersion, { "85bbc1cc6c4cef6ad31fc6ee79518efb", "e20d0d2e500f01e399ec588247a7e213" } },
@@ -98,8 +100,9 @@ const Game lolGames[] = {
// DOS demo
{ kLol, { EN_ANY, -1, -1 }, kPlatformPC, kDemoVersion, { "30bb5af87d38adb47d3e6ce06b1cb042", 0 } },
- // DOS floppy (no language specifc strings)
+ // DOS floppy (no language specifc strings except character presets)
{ kLol, { EN_ANY, -1, -1 }, kPlatformPC, kNoSpecial, { "0cc764a204f7ba8cefe1a5f14c479619", 0 } },
+ { kLol, { RU_RUS, -1, -1 }, kPlatformPC, kNoSpecial, { "80a9f9bf243bc6ed36d98584fc6988c4", 0 } },
{ kLol, { DE_DEU, -1, -1 }, kPlatformPC, kNoSpecial, { "6b843869772c1b779e1386be868c15dd", 0 } },
// PC98 (no language specifc strings)
@@ -108,6 +111,7 @@ const Game lolGames[] = {
// DOS CD (multi language version, with no language specific strings)
{ kLol, { EN_ANY, FR_FRA, DE_DEU }, kPlatformPC, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "263998ec600afca1cc7b935c473df670" } },
{ kLol, { IT_ITA, FR_FRA, DE_DEU }, kPlatformPC, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "f2af366e00f79dbf832fa19701d71ed9" } }, // Italian fan translation
+ { kLol, { EN_ANY, FR_FRA, RU_RUS }, kPlatformPC, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "5b33478718968676343803911dd5e3e4" } }, // Russian fan translation
GAME_DUMMY_ENTRY
};
@@ -208,6 +212,93 @@ const int kyra1FloppyNeed[] = {
k1NewGameString,
k1ConfigStrings,
k1AudioTracks,
+ k1AudioTracks2,
+ k1AudioTracksIntro,
+ -1
+};
+
+const int kyra1FloppyOldNeed[] = {
+ k1KallakWritingSeq,
+ k1MalcolmTreeSeq,
+ k1WestwoodLogoSeq,
+ k1KyrandiaLogoSeq,
+ k1KallakMalcolmSeq,
+ k1ForestSeq,
+ k1IntroCPSStrings,
+ k1IntroCOLStrings,
+ k1IntroWSAStrings,
+ k1IntroStrings,
+ k1RoomList,
+ k1RoomFilenames,
+ k1CharacterImageFilenames,
+ k1DefaultShapes,
+ k1ItemNames,
+ k1TakenStrings,
+ k1PlacedStrings,
+ k1DroppedStrings,
+ k1AmuleteAnimSeq,
+ k1SpecialPalette1,
+ k1SpecialPalette2,
+ k1SpecialPalette3,
+ k1SpecialPalette4,
+ k1SpecialPalette5,
+ k1SpecialPalette6,
+ k1SpecialPalette7,
+ k1SpecialPalette8,
+ k1SpecialPalette9,
+ k1SpecialPalette10,
+ k1SpecialPalette11,
+ k1SpecialPalette12,
+ k1SpecialPalette13,
+ k1SpecialPalette14,
+ k1SpecialPalette15,
+ k1SpecialPalette16,
+ k1SpecialPalette17,
+ k1SpecialPalette18,
+ k1SpecialPalette19,
+ k1SpecialPalette20,
+ k1SpecialPalette21,
+ k1SpecialPalette22,
+ k1SpecialPalette23,
+ k1SpecialPalette24,
+ k1SpecialPalette25,
+ k1SpecialPalette26,
+ k1SpecialPalette27,
+ k1SpecialPalette28,
+ k1SpecialPalette29,
+ k1SpecialPalette30,
+ k1SpecialPalette31,
+ k1SpecialPalette32,
+ k1PutDownString,
+ k1WaitAmuletString,
+ k1BlackJewelString,
+ k1HealingTipString,
+ k1PoisonGoneString,
+ k1Healing1Shapes,
+ k1Healing2Shapes,
+ k1ThePoisonStrings,
+ k1FluteStrings,
+ k1PoisonDeathShapes,
+ k1FluteShapes,
+ k1Winter1Shapes,
+ k1Winter2Shapes,
+ k1Winter3Shapes,
+ k1DrinkShapes,
+ k1WispShapes,
+ k1MagicAnimShapes,
+ k1BranStoneShapes,
+ k1WispJewelStrings,
+ k1MagicJewelStrings,
+ k1FlaskFullString,
+ k1FullFlaskString,
+ k1OutroReunionSeq,
+ k1OutroHomeString,
+ k1VeryCleverString,
+ k1GUIStrings,
+ k1NewGameString,
+ k1ConfigStrings,
+ k1AudioTracks,
+ k1AudioTracks2,
k1AudioTracksIntro,
-1
};
@@ -295,6 +386,7 @@ const int kyra1CDNeed[] = {
k1NewGameString,
k1ConfigStrings,
k1AudioTracks,
+ k1AudioTracks2,
k1AudioTracksIntro,
-1
};
@@ -938,6 +1030,7 @@ struct GameNeed {
const GameNeed gameNeedTable[] = {
{ kKyra1, kPlatformPC, kNoSpecial, kyra1FloppyNeed },
+ { kKyra1, kPlatformPC, kOldFloppy, kyra1FloppyOldNeed },
{ kKyra1, kPlatformAmiga, kNoSpecial, kyra1AmigaNeed },
{ kKyra1, kPlatformPC, kTalkieVersion, kyra1CDNeed },
@@ -984,4 +1077,3 @@ const int *getNeedList(const Game *g) {
return 0;
}
-
diff --git a/devtools/create_kyradat/search.cpp b/devtools/create_kyradat/search.cpp
index 36b59d948c..b861ff0f5a 100644
--- a/devtools/create_kyradat/search.cpp
+++ b/devtools/create_kyradat/search.cpp
@@ -213,4 +213,3 @@ bool Search::search(ResultList &res) {
return !res.empty();
}
-
diff --git a/devtools/create_kyradat/search.h b/devtools/create_kyradat/search.h
index bd6aa0355b..a9e8ee2726 100644
--- a/devtools/create_kyradat/search.h
+++ b/devtools/create_kyradat/search.h
@@ -114,4 +114,3 @@ private:
};
#endif
-
diff --git a/devtools/create_kyradat/tables.cpp b/devtools/create_kyradat/tables.cpp
index 090b32debc..8042dcac71 100644
--- a/devtools/create_kyradat/tables.cpp
+++ b/devtools/create_kyradat/tables.cpp
@@ -68,6 +68,7 @@ const ExtractEntrySearchData k1KyrandiaLogoSeqProvider[] = {
const ExtractEntrySearchData k1KallakMalcolmSeqProvider[] = {
{ UNK_LANG, kPlatformPC, { 0x0000026B, 0x00002132, { { 0x51, 0x07, 0x32, 0xA2, 0x09, 0x47, 0x97, 0x02, 0x85, 0x31, 0x39, 0x93, 0x3A, 0x53, 0x47, 0xA5 } } } }, // floppy
+ { UNK_LANG, kPlatformPC, { 0x00000267, 0x00002100, { { 0xD9, 0x5E, 0x59, 0xF0, 0x7B, 0xC8, 0xF1, 0x40, 0x4F, 0x68, 0x6F, 0xEC, 0xB5, 0xE8, 0x88, 0xE2 } } } }, // floppy
{ UNK_LANG, kPlatformUnknown, { 0x0000027B, 0x0000220A, { { 0xB7, 0xC1, 0x57, 0x04, 0x9B, 0x67, 0x82, 0x7B, 0x6E, 0xFD, 0x59, 0xF2, 0x10, 0x93, 0x89, 0x12 } } } }, // CD + Amiga
{ UNK_LANG, kPlatformUnknown, { 0x000002B8, 0x0000280B, { { 0x98, 0xC8, 0x36, 0x8C, 0xF8, 0x92, 0xC2, 0xB9, 0x1B, 0x71, 0x6B, 0x4C, 0xA4, 0x6C, 0xF6, 0x30 } } } }, // Amiga + CD demo
@@ -134,8 +135,9 @@ const ExtractEntrySearchData k1AmuleteAnimSeqProvider[] = {
const ExtractEntrySearchData k1OutroReunionSeqProvider[] = {
{ UNK_LANG, kPlatformPC, { 0x00000547, 0x0000781C, { { 0xCF, 0xD6, 0x1D, 0x3D, 0x14, 0x40, 0x88, 0x35, 0x36, 0x4F, 0x0B, 0x1F, 0x9A, 0x1C, 0x3D, 0xAC } } } }, // floppy
+ { UNK_LANG, kPlatformPC, { 0x00000547, 0x000077E0, { { 0x80, 0xC4, 0xFC, 0xD5, 0xEB, 0xAA, 0xA5, 0x87, 0x58, 0x5E, 0xAA, 0xE7, 0x01, 0x8F, 0x59, 0x3F } } } }, // floppy
{ UNK_LANG, kPlatformPC, { 0x000005E5, 0x00008918, { { 0x6A, 0x33, 0x8C, 0xB0, 0x16, 0x57, 0x2D, 0xEB, 0xB2, 0xE1, 0x64, 0x80, 0x98, 0x99, 0x98, 0x19 } } } }, // CD
-
+
{ UNK_LANG, kPlatformAmiga, { 0x0000054A, 0x0000785F, { { 0x55, 0xEA, 0xB8, 0x7F, 0x3A, 0x86, 0xCD, 0xA6, 0xBC, 0xA7, 0x9A, 0x39, 0xED, 0xF5, 0x30, 0x0A } } } },
{ UNK_LANG, kPlatformUnknown, { 0x00000547, 0x00007876, { { 0x7A, 0xC7, 0x80, 0x34, 0x7A, 0x1B, 0xAB, 0xF8, 0xA7, 0x2F, 0x63, 0x3C, 0xDA, 0x89, 0x3F, 0x82 } } } }, // some floppy DOS + FM-TOWNS
@@ -150,6 +152,7 @@ const ExtractEntrySearchData k1IntroCPSStringsProvider[] = {
{ UNK_LANG, kPlatformUnknown, { 0x00000014, 0x0000071D, { { 0xBA, 0xB6, 0x58, 0xB3, 0x28, 0x5E, 0x9F, 0x77, 0x69, 0x9D, 0x77, 0x53, 0x9D, 0x0D, 0xB0, 0x29 } } } }, // floppy + PC98
{ UNK_LANG, kPlatformPC, { 0x00000015, 0x00000786, { { 0xCF, 0x09, 0xE1, 0xD9, 0x8E, 0x34, 0x5D, 0xEA, 0xBC, 0xAC, 0xC4, 0xF4, 0x4A, 0xEC, 0xFF, 0xC1 } } } }, // CD
+ { UNK_LANG, kPlatformPC, { 0x00000019, 0x000008DB, { { 0x3A, 0xDC, 0x1D, 0xAD, 0xF4, 0x5E, 0xC9, 0x19, 0xE9, 0x84, 0xD1, 0x31, 0x89, 0x6B, 0x6C, 0xF7 } } } }, // Old floppy
{ UNK_LANG, kPlatformPC, { 0x0000000C, 0x00000413, { { 0xA1, 0xE3, 0x06, 0x53, 0x23, 0x9A, 0xE0, 0xF1, 0xE4, 0xFD, 0xD9, 0x05, 0x22, 0xA6, 0x28, 0x46 } } } }, // demo
{ UNK_LANG, kPlatformAmiga, { 0x00000016, 0x0000070A, { { 0xD9, 0xDB, 0x91, 0xCD, 0x93, 0x81, 0xC4, 0x3F, 0x14, 0xF1, 0xC5, 0x02, 0xE7, 0x3F, 0x3A, 0x6C } } } },
@@ -194,6 +197,8 @@ const ExtractEntrySearchData k1IntroStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x000005CF, 0x00020415, { { 0xCC, 0xE5, 0x9F, 0xB8, 0xCA, 0xFA, 0x2D, 0x05, 0xB8, 0xAF, 0x9F, 0x1F, 0x8A, 0xA8, 0x56, 0xDE } } } },
+ { RU_RUS, kPlatformPC, { 0x000004F6, 0x000131C6, { { 0x77, 0x76, 0x12, 0xB1, 0xDA, 0x9C, 0xA9, 0xB5, 0x21, 0x1E, 0x49, 0x08, 0x46, 0xB3, 0xE4, 0x61 } } } },
+
{ EN_ANY, kPlatformAmiga, { 0x0000050A, 0x0001A7B1, { { 0x1B, 0x74, 0x71, 0x4C, 0xAB, 0x81, 0x10, 0x59, 0x8A, 0x21, 0x50, 0xBB, 0xFE, 0x6F, 0xD0, 0xE8 } } } },
{ DE_DEU, kPlatformAmiga, { 0x00000626, 0x00021319, { { 0x80, 0x55, 0x54, 0x14, 0x5D, 0x6F, 0x49, 0x04, 0x4A, 0xEF, 0x92, 0xB8, 0x5B, 0x01, 0x0F, 0x97 } } } },
@@ -219,6 +224,8 @@ const ExtractEntrySearchData k1OutroHomeStringProvider[] = {
{ IT_ITA, kPlatformPC, { 0x00000007, 0x000001B8, { { 0x17, 0x95, 0x5B, 0x4F, 0xE2, 0x07, 0x5A, 0x49, 0xFA, 0xCE, 0x53, 0x8B, 0xE7, 0x46, 0x69, 0xC7 } } } }, // (fan) CD
+ { RU_RUS, kPlatformPC, { 0x00000005, 0x000000EF, { { 0xA0, 0xB4, 0xF2, 0x11, 0x16, 0x92, 0xC8, 0xEB, 0xF2, 0x0C, 0xFE, 0x43, 0xFE, 0x18, 0xF6, 0xBB } } } },
+
EXTRACT_END_ENTRY
};
@@ -235,6 +242,7 @@ const ExtractEntrySearchData k1RoomListProvider[] = {
{ UNK_LANG, kPlatformFMTowns, { 0x000064E8, 0x0010312B, { { 0x94, 0x5C, 0x87, 0x35, 0x35, 0x6B, 0x3E, 0xBF, 0x55, 0x3D, 0xDB, 0xD9, 0xFB, 0x97, 0x27, 0x5D } } } },
{ UNK_LANG, kPlatformUnknown, { 0x00004DD6, 0x0010312B, { { 0xC6, 0xF0, 0xC4, 0x2C, 0x5A, 0xD7, 0x48, 0xE4, 0x41, 0x23, 0x65, 0x6D, 0xC8, 0xC7, 0xCE, 0xF5 } } } }, // DOS + PC98
+ { UNK_LANG, kPlatformUnknown, { 0x00004DD6, 0x0010315D, { { 0x4A, 0x1B, 0xA2, 0x35, 0xE1, 0x22, 0xD3, 0x7A, 0xE9, 0x69, 0x12, 0x3A, 0x9C, 0x92, 0x6F, 0x5C } } } }, // Old DOS floppy
{ UNK_LANG, kPlatformAmiga, { 0x00004ECC, 0x0010312B, { { 0x9A, 0x91, 0xF1, 0x9C, 0x8A, 0x96, 0x1C, 0x7B, 0xB7, 0xE4, 0xF1, 0xE9, 0x7D, 0xEF, 0x40, 0xBF } } } },
@@ -252,13 +260,19 @@ const ExtractEntrySearchData k1CharacterImageFilenamesProvider[] = {
};
const ExtractEntrySearchData k1AudioTracksProvider[] = {
- { UNK_LANG, kPlatformPC, { 0x00000041, 0x00000FBF, { { 0xB5, 0xA2, 0x90, 0xE9, 0x73, 0x83, 0x47, 0x5A, 0xB3, 0x3E, 0x04, 0xBB, 0xAA, 0xC8, 0x84, 0x53 } } } },
+ { UNK_LANG, kPlatformPC, { 0x00000038, 0x00000D5C, { { 0x65, 0x35, 0x2F, 0xA3, 0x93, 0x22, 0x15, 0xA0, 0xC6, 0x2B, 0x73, 0x7C, 0x3E, 0xB8, 0x7A, 0xB5 } } } },
{ UNK_LANG, kPlatformFMTowns, { 0x0000005D, 0x0000154E, { { 0xA7, 0x7E, 0x03, 0x0A, 0x81, 0x54, 0xD2, 0x5D, 0x7B, 0x33, 0x07, 0xBF, 0x70, 0x01, 0x4B, 0x79 } } } },
EXTRACT_END_ENTRY
};
+const ExtractEntrySearchData k1AudioTracks2Provider[] = {
+ { UNK_LANG, kPlatformPC, { 0x00000009, 0x00000363, { { 0x16, 0xA2, 0x68, 0x21, 0x04, 0xA8, 0x39, 0x7E, 0xA1, 0x7D, 0x70, 0xFD, 0x86, 0xC7, 0x69, 0x28 } } } },
+
+ EXTRACT_END_ENTRY
+};
+
const ExtractEntrySearchData k1AudioTracksIntroProvider[] = {
{ UNK_LANG, kPlatformUnknown, { 0x00000006, 0x0000022C, { { 0x5F, 0xC9, 0xE1, 0x4B, 0x34, 0x52, 0xB9, 0xF8, 0xFF, 0x37, 0x8B, 0xF4, 0xEF, 0x5E, 0xC5, 0xDA } } } }, // floppy + demo
{ UNK_LANG, kPlatformUnknown, { 0x0000000C, 0x00000458, { { 0xEB, 0xB3, 0x96, 0xA5, 0x07, 0xE6, 0x11, 0x58, 0xDB, 0x3F, 0x34, 0x30, 0xFB, 0x7B, 0x92, 0xC8 } } } }, // CD
@@ -278,6 +292,8 @@ const ExtractEntrySearchData k1ItemNamesProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000530, 0x0001D90A, { { 0x52, 0xFB, 0xA8, 0x3F, 0xA3, 0x6F, 0xC2, 0x67, 0x55, 0x9F, 0x66, 0x9F, 0xFD, 0x79, 0x44, 0xDF } } } },
+ { RU_RUS, kPlatformPC, { 0x000004AE, 0x00011888, { { 0x6F, 0x4D, 0xBE, 0xC8, 0xAE, 0x7C, 0x12, 0x3E, 0x69, 0x0B, 0x39, 0xCB, 0x4D, 0x4B, 0xA8, 0x3A } } } }, // floppy
+
{ EN_ANY, kPlatformAmiga, { 0x00000380, 0x00012960, { { 0x2D, 0x81, 0xCF, 0x7A, 0x9D, 0x71, 0x83, 0xB7, 0xE5, 0x00, 0xB0, 0x6E, 0x25, 0x94, 0xCB, 0xA4 } } } },
{ DE_DEU, kPlatformAmiga, { 0x000003E5, 0x0001607D, { { 0x6D, 0xBE, 0xAD, 0xE5, 0xD1, 0x41, 0x6C, 0x42, 0x71, 0x79, 0x9C, 0x78, 0x93, 0x84, 0xC8, 0x11 } } } },
@@ -302,6 +318,8 @@ const ExtractEntrySearchData k1TakenStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000014, 0x000005D8, { { 0xD6, 0x00, 0x90, 0x6A, 0x75, 0x3B, 0xF1, 0xFE, 0xF4, 0x3E, 0x0E, 0x1D, 0x39, 0xEB, 0x2D, 0xC8 } } } },
+ { RU_RUS, kPlatformPC, { 0x00000010, 0x00000262, { { 0x1E, 0x90, 0x20, 0xC8, 0xD3, 0x08, 0x53, 0x4F, 0x28, 0x95, 0x6A, 0xA4, 0x14, 0x37, 0x05, 0xF0 } } } },
+
{ EN_ANY, kPlatformAmiga, { 0x00000008, 0x00000261, { { 0x93, 0x5B, 0x79, 0xE8, 0x89, 0x8E, 0xB5, 0x37, 0x39, 0x2A, 0xB0, 0x04, 0x98, 0x80, 0x5A, 0x4E } } } },
{ DE_DEU, kPlatformAmiga, { 0x0000000E, 0x000004E0, { { 0x52, 0x4D, 0x74, 0x91, 0x70, 0x0D, 0x4C, 0x40, 0x5C, 0x7E, 0xBA, 0xDA, 0x24, 0x49, 0xF3, 0x1A } } } },
@@ -324,8 +342,10 @@ const ExtractEntrySearchData k1PlacedStringsProvider[] = {
{ IT_ITA, kPlatformPC, { 0x0000000D, 0x0000040D, { { 0x9C, 0x71, 0x53, 0x35, 0xC3, 0xE8, 0x46, 0xB9, 0xD2, 0xFA, 0x1C, 0x8C, 0xC3, 0xFF, 0xBC, 0x1F } } } }, // floppy
{ IT_ITA, kPlatformPC, { 0x00000011, 0x000003B8, { { 0xC8, 0xA6, 0xE4, 0x8A, 0xF7, 0x4C, 0x3F, 0xA6, 0x24, 0x7F, 0xEF, 0xE4, 0x63, 0x8B, 0x72, 0xF3 } } } }, // (fan) CD
-
+
{ ES_ESP, kPlatformPC, { 0x0000000D, 0x00000439, { { 0x57, 0xAE, 0x1C, 0xC1, 0xF5, 0xE8, 0x5B, 0x9E, 0x90, 0x02, 0xB9, 0x8D, 0x86, 0x38, 0xFB, 0xA8 } } } },
+
+ { RU_RUS, kPlatformPC, { 0x00000009, 0x00000203, { { 0x7D, 0xAE, 0x67, 0x94, 0x8E, 0x73, 0x35, 0xC1, 0x11, 0xB4, 0x55, 0x6E, 0x92, 0x25, 0x39, 0xE4 } } } },
EXTRACT_END_ENTRY
};
@@ -344,6 +364,8 @@ const ExtractEntrySearchData k1DroppedStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000008, 0x00000261, { { 0x1D, 0xB5, 0xFB, 0x23, 0x94, 0xA7, 0x86, 0x7A, 0xAC, 0x53, 0xDA, 0x6F, 0xCC, 0x41, 0x0F, 0xD7 } } } },
+ { RU_RUS, kPlatformPC, { 0x0000000A, 0x000001F5, { { 0xAA, 0x21, 0x88, 0x6D, 0xD0, 0xAB, 0x5C, 0x15, 0x7F, 0xAD, 0x0E, 0x3B, 0x2F, 0x17, 0xBF, 0xAD } } } },
+
EXTRACT_END_ENTRY
};
@@ -384,6 +406,8 @@ const ExtractEntrySearchData k1PutDownStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x0000002D, 0x00001052, { { 0x12, 0x0A, 0x23, 0x11, 0xDF, 0x8A, 0x59, 0xD4, 0xF2, 0xCA, 0xA5, 0xA7, 0x76, 0x1B, 0x54, 0xB6 } } } },
+ { RU_RUS, kPlatformPC, { 0x00000024, 0x0000099F, { { 0x05, 0xD7, 0xB8, 0x32, 0x95, 0x93, 0x29, 0x5F, 0xF3, 0x1A, 0xF0, 0x2E, 0xBA, 0x3A, 0x0D, 0x27 } } } },
+
EXTRACT_END_ENTRY
};
@@ -401,6 +425,8 @@ const ExtractEntrySearchData k1WaitAmuletStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000042, 0x000017FD, { { 0x0A, 0x8A, 0x7E, 0x9A, 0x5F, 0x4A, 0x35, 0x06, 0x4D, 0x6B, 0xBF, 0x29, 0x1B, 0xAD, 0xD8, 0x37 } } } },
+ { RU_RUS, kPlatformPC, { 0x0000003C, 0x00000EF1, { { 0xC1, 0x0A, 0xFA, 0xBB, 0x65, 0xC3, 0x31, 0xC9, 0x80, 0x9B, 0x0C, 0x16, 0xED, 0xBF, 0x47, 0xFA } } } },
+
{ EN_ANY, kPlatformUnknown, { 0x0000003E, 0x0000150D, { { 0xA8, 0xBF, 0x99, 0x9B, 0xC1, 0x36, 0x21, 0x47, 0x6D, 0x99, 0x4F, 0x34, 0xE6, 0x61, 0x47, 0xFD } } } }, // Amiga + FM-TOWNS
EXTRACT_END_ENTRY
@@ -420,6 +446,8 @@ const ExtractEntrySearchData k1BlackJewelStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000025, 0x00000CF6, { { 0x4B, 0x13, 0x39, 0xCB, 0x3F, 0x44, 0x18, 0x46, 0x43, 0xDB, 0x94, 0xC5, 0x3E, 0x6B, 0xC4, 0x74 } } } },
+ { RU_RUS, kPlatformPC, { 0x00000021, 0x000007FF, { { 0x3F, 0x26, 0xB4, 0xB4, 0x11, 0x0C, 0xEF, 0xC0, 0x6A, 0xD1, 0xCC, 0x0E, 0x68, 0x7D, 0xA5, 0x1A } } } },
+
{ EN_ANY, kPlatformUnknown, { 0x00000024, 0x00000B73, { { 0x8D, 0x57, 0x5F, 0x93, 0x85, 0x75, 0xF2, 0xD8, 0x36, 0xC2, 0x7C, 0x0E, 0x3B, 0xEA, 0xE0, 0x0A } } } }, // Amiga + FM-TOWNS
EXTRACT_END_ENTRY
@@ -438,6 +466,8 @@ const ExtractEntrySearchData k1PoisonGoneStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000033, 0x0000127E, { { 0x67, 0xEB, 0xD3, 0x00, 0xF8, 0x4F, 0xF1, 0x79, 0x48, 0xE6, 0x9C, 0xB2, 0xA7, 0xCF, 0x76, 0x07 } } } },
+ { RU_RUS, kPlatformPC, { 0x00000027, 0x00000952, { { 0x36, 0x64, 0x30, 0x1C, 0x5A, 0xC0, 0x0D, 0x73, 0xE5, 0xA6, 0x2F, 0xD8, 0x64, 0x98, 0x81, 0x56 } } } },
+
{ EN_ANY, kPlatformAmiga, { 0x0000002E, 0x00000F59, { { 0xAD, 0x95, 0xF3, 0xA7, 0xBB, 0x04, 0x08, 0x77, 0xD0, 0x71, 0xFC, 0x8B, 0x33, 0x2A, 0x6D, 0xD3 } } } },
{ DE_DEU, kPlatformAmiga, { 0x00000037, 0x00001324, { { 0xB3, 0xE6, 0x0A, 0x49, 0x37, 0x73, 0x3C, 0xAF, 0x78, 0x9E, 0x7D, 0x13, 0x75, 0xAE, 0xA8, 0x89 } } } },
@@ -463,6 +493,8 @@ const ExtractEntrySearchData k1HealingTipStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000028, 0x00000E0F, { { 0x3E, 0x40, 0xCA, 0x2A, 0x5F, 0xFE, 0x74, 0x30, 0x8C, 0x31, 0x41, 0x09, 0xBD, 0xFD, 0xA3, 0x7E } } } },
+ { RU_RUS, kPlatformPC, { 0x00000026, 0x000008EE, { { 0x7C, 0xC0, 0x62, 0x39, 0x66, 0x9E, 0x63, 0xCD, 0x21, 0x3D, 0x72, 0x91, 0xB8, 0xB9, 0xB6, 0x92 } } } },
+
{ EN_ANY, kPlatformUnknown, { 0x0000002E, 0x00000F04, { { 0x95, 0x39, 0x36, 0x89, 0xC4, 0x60, 0x7C, 0x0C, 0xDC, 0x06, 0xF7, 0x86, 0x1A, 0xF7, 0x93, 0x2B } } } }, // Amiga + FM-TOWNS
EXTRACT_END_ENTRY
@@ -483,6 +515,9 @@ const ExtractEntrySearchData k1WispJewelStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x0000005F, 0x0000211E, { { 0xE7, 0x0A, 0x85, 0x25, 0x44, 0x41, 0x47, 0x3B, 0x7A, 0xA6, 0x62, 0xAE, 0xAE, 0xD5, 0x92, 0x45 } } } },
+ // only one of two strings translated in the fan translation
+ { RU_RUS, kPlatformPC, { 0x00000053, 0x0000191F, { { 0x14, 0xEB, 0x38, 0x54, 0x40, 0x40, 0x04, 0xA6, 0xA0, 0xFE, 0xDB, 0xD0, 0x8C, 0xA6, 0x1F, 0x55 } } } },
+
{ EN_ANY, kPlatformAmiga, { 0x00000056, 0x00001C62, { { 0x43, 0x28, 0x3C, 0x0F, 0x78, 0x52, 0xE7, 0x2A, 0x77, 0xF3, 0x21, 0x5A, 0xF0, 0xFC, 0x9E, 0xF8 } } } },
{ DE_DEU, kPlatformAmiga, { 0x00000063, 0x00002184, { { 0x6B, 0xDC, 0x6B, 0xCF, 0xD4, 0xC7, 0x2A, 0x9A, 0x2E, 0x34, 0x71, 0x4E, 0xB7, 0xF6, 0xAF, 0xDA } } } },
@@ -508,6 +543,8 @@ const ExtractEntrySearchData k1MagicJewelStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000011, 0x000005CD, { { 0x32, 0x2A, 0xFF, 0x9F, 0x10, 0x75, 0x6B, 0xD6, 0x46, 0xAE, 0x55, 0xD3, 0x68, 0x4F, 0xBB, 0x5A } } } },
+ { RU_RUS, kPlatformPC, { 0x00000012, 0x0000047D, { { 0xB1, 0xC3, 0x66, 0xBC, 0x42, 0xAD, 0x5B, 0xD8, 0xF5, 0x3D, 0xB9, 0x50, 0x77, 0x32, 0xA7, 0x15 } } } },
+
{ EN_ANY, kPlatformUnknown, { 0x00000014, 0x0000069E, { { 0x6A, 0x1C, 0x9B, 0x85, 0x61, 0xC7, 0x28, 0xA9, 0xA3, 0xF4, 0xFA, 0x47, 0x90, 0x8F, 0x06, 0xB4 } } } }, // Amiga + FM-TOWNS
EXTRACT_END_ENTRY
@@ -525,6 +562,8 @@ const ExtractEntrySearchData k1ThePoisonStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000059, 0x00001DF7, { { 0x16, 0x7B, 0x5F, 0x91, 0x06, 0x5B, 0xFC, 0x9C, 0x88, 0x61, 0xCC, 0x1B, 0x52, 0x4F, 0x91, 0xC5 } } } },
+ { RU_RUS, kPlatformPC, { 0x00000052, 0x0000136F, { { 0xEF, 0xD2, 0xA0, 0x5F, 0xD5, 0xE6, 0x77, 0x96, 0xFA, 0xC5, 0x60, 0x7C, 0xB7, 0xA8, 0x7C, 0x7A } } } },
+
{ EN_ANY, kPlatformAmiga, { 0x00000058, 0x00001C24, { { 0xBA, 0x1F, 0xBD, 0x5C, 0x85, 0x3D, 0x3C, 0x92, 0xD1, 0x13, 0xF3, 0x40, 0x2E, 0xBB, 0x1C, 0xE2 } } } },
{ DE_DEU, kPlatformAmiga, { 0x00000073, 0x00002690, { { 0x44, 0xAE, 0xC9, 0xFD, 0x9F, 0x8E, 0x1B, 0xDD, 0x3F, 0xE4, 0x4D, 0x4B, 0x5A, 0x13, 0xE5, 0x99 } } } },
@@ -549,6 +588,9 @@ const ExtractEntrySearchData k1FluteStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000052, 0x00001D8E, { { 0x9D, 0xA5, 0xF1, 0x42, 0xD1, 0x48, 0xEB, 0x8F, 0x4B, 0xDC, 0xD9, 0x10, 0x55, 0xBD, 0x12, 0xBB } } } },
+ // not translated in the fan translation
+ { RU_RUS, kPlatformPC, { 0x0000003C, 0x00001599, { { 0x96, 0x72, 0x5A, 0x8A, 0xA0, 0xEE, 0xA2, 0xCE, 0x4D, 0x21, 0x01, 0x6C, 0xC5, 0x1A, 0xEB, 0x21 } } } },
+
{ EN_ANY, kPlatformFMTowns, { 0x0000005A, 0x000024F9, { { 0xCA, 0x1F, 0x62, 0x23, 0x22, 0x25, 0x4A, 0x94, 0x8A, 0x50, 0x59, 0xD5, 0xB4, 0x4E, 0xF1, 0xA6 } } } },
{ JA_JPN, kPlatformFMTowns, { 0x00000053, 0x00002745, { { 0x7A, 0xBB, 0xFC, 0x30, 0xB6, 0xCE, 0x61, 0xD4, 0xDB, 0xB0, 0xE6, 0xB2, 0xF4, 0x4D, 0x81, 0x35 } } } },
@@ -571,6 +613,8 @@ const ExtractEntrySearchData k1FlaskFullStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x0000001B, 0x0000099D, { { 0x13, 0x23, 0x5D, 0x38, 0x9B, 0xFB, 0x00, 0x5C, 0xA1, 0x3A, 0x22, 0xD6, 0xCD, 0x5C, 0x09, 0xAE } } } },
+ { RU_RUS, kPlatformPC, { 0x0000001A, 0x0000066E, { { 0x36, 0x43, 0xB6, 0xB2, 0xED, 0xBA, 0x21, 0x0C, 0x16, 0x54, 0x99, 0xF9, 0x2E, 0x6E, 0x0A, 0x28 } } } },
+
EXTRACT_END_ENTRY
};
@@ -586,6 +630,8 @@ const ExtractEntrySearchData k1FullFlaskStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x0000009A, 0x0000363B, { { 0x38, 0x25, 0xE6, 0xB5, 0xCB, 0x78, 0x5E, 0xAD, 0x2D, 0xD4, 0x2E, 0x8B, 0x89, 0x20, 0xB1, 0x95 } } } },
+ { RU_RUS, kPlatformPC, { 0x00000094, 0x0000232B, { { 0xBF, 0x68, 0xF9, 0x8F, 0x82, 0xE9, 0xE7, 0x69, 0x33, 0xD6, 0x41, 0x15, 0x2C, 0xFE, 0x72, 0xAB } } } },
+
{ EN_ANY, kPlatformAmiga, { 0x0000009A, 0x00003521, { { 0x26, 0xE5, 0xC8, 0x6D, 0x14, 0x81, 0x9F, 0x90, 0x38, 0x3C, 0x00, 0x9D, 0x8E, 0x72, 0xB1, 0x83 } } } },
{ DE_DEU, kPlatformAmiga, { 0x000000B0, 0x00003E38, { { 0x8A, 0x6D, 0x42, 0x36, 0x29, 0x06, 0xB2, 0xCE, 0xA3, 0x41, 0x14, 0xE8, 0xB1, 0xEF, 0x6E, 0x3B } } } },
@@ -611,6 +657,9 @@ const ExtractEntrySearchData k1VeryCleverStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x00000036, 0x000013F8, { { 0x2D, 0x9B, 0x7D, 0x58, 0xD1, 0x94, 0x04, 0x45, 0x6E, 0x81, 0xCC, 0x1E, 0x2F, 0xC5, 0xC9, 0xEA } } } },
+ // not translated in the fan translation
+ { RU_RUS, kPlatformPC, { 0x00000032, 0x0000118D, { { 0x4B, 0x6D, 0xD4, 0xDC, 0x3E, 0xA2, 0x2D, 0x6D, 0x2C, 0x5A, 0xF7, 0x67, 0x4B, 0x6D, 0x40, 0xEF } } } },
+
EXTRACT_END_ENTRY
};
@@ -628,6 +677,8 @@ const ExtractEntrySearchData k1NewGameStringProvider[] = {
{ ES_ESP, kPlatformPC, { 0x0000001B, 0x00000701, { { 0x2B, 0x87, 0xC3, 0x82, 0x68, 0xA5, 0xFC, 0xC5, 0x64, 0x9E, 0xAB, 0xD2, 0x8A, 0x07, 0x9C, 0x1E } } } },
+ { RU_RUS, kPlatformPC, { 0x00000015, 0x0000035F, { { 0x7E, 0x49, 0xC1, 0xCB, 0x2D, 0x61, 0xA7, 0x4C, 0x20, 0xAC, 0xEC, 0x54, 0x80, 0x14, 0x6A, 0xCA } } } },
+
EXTRACT_END_ENTRY
};
@@ -654,7 +705,7 @@ const ExtractEntrySearchData k1Healing2ShapesProvider[] = {
const ExtractEntrySearchData k1PoisonDeathShapesProvider[] = {
{ UNK_LANG, kPlatformUnknown, { 0x0000008C, 0x00002E90, { { 0xBC, 0x44, 0xFB, 0x98, 0xE7, 0x42, 0xF6, 0xC8, 0x87, 0xDD, 0x00, 0x42, 0x85, 0xD8, 0x1E, 0x81 } } } },
-
+ { UNK_LANG, kPlatformUnknown, { 0x0000008C, 0x00002E7C, { { 0xA5, 0xD7, 0x13, 0xFC, 0x43, 0x22, 0x13, 0xBC, 0x5F, 0x3F, 0xC8, 0x28, 0xDA, 0x04, 0xB0, 0xDD } } } }, // Old Dos Floppy
EXTRACT_END_ENTRY
};
@@ -931,6 +982,8 @@ const ExtractEntrySearchData k1GUIStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x0000023A, 0x0000C3BD, { { 0xED, 0x0D, 0xE7, 0x5B, 0xDC, 0x21, 0x41, 0x54, 0x68, 0x7D, 0x8E, 0x97, 0x1A, 0xB1, 0xA1, 0x4A } } } }, // floppy
+ { RU_RUS, kPlatformPC, { 0x000001B1, 0x000065E8, { { 0x91, 0x22, 0x61, 0x8B, 0xCD, 0x7C, 0x0E, 0xD4, 0x32, 0x00, 0xC3, 0x6E, 0x50, 0x7F, 0x3C, 0x82 } } } }, // floppy
+
{ EN_ANY, kPlatformAmiga, { 0x000001DF, 0x00009042, { { 0x0D, 0xD3, 0x1A, 0x92, 0x8D, 0x9C, 0x72, 0x55, 0xEF, 0xFB, 0x81, 0x21, 0x3B, 0x43, 0xA7, 0xE8 } } } },
{ DE_DEU, kPlatformAmiga, { 0x00000237, 0x0000BAF7, { { 0xD7, 0x1A, 0x8E, 0xCC, 0x6D, 0x3E, 0xA9, 0xDD, 0x9A, 0x6B, 0x71, 0xFE, 0xD4, 0x50, 0x30, 0x6E } } } },
@@ -957,6 +1010,9 @@ const ExtractEntrySearchData k1ConfigStringsProvider[] = {
{ ES_ESP, kPlatformPC, { 0x0000004A, 0x00001B7B, { { 0x6B, 0x69, 0x50, 0x92, 0x9B, 0x35, 0x58, 0xE1, 0xEA, 0xBF, 0x42, 0x0B, 0xEB, 0x88, 0x41, 0x8D } } } }, // floppy
+ // not translated in the fan translation
+ { RU_RUS, kPlatformPC, { 0x0000003F, 0x00000B0D, { { 0x0E, 0x60, 0x0F, 0x4A, 0xA9, 0xF0, 0x1B, 0x76, 0xBB, 0x33, 0xB2, 0x4B, 0x5C, 0xB5, 0x4A, 0x97 } } } }, // floppy
+
{ EN_ANY, kPlatformAmiga, { 0x0000002E, 0x00000FA1, { { 0x5E, 0xFF, 0xFF, 0x3D, 0xF8, 0x11, 0x6F, 0x3B, 0xC5, 0x39, 0x8F, 0x25, 0x8F, 0x0F, 0xE9, 0x2B } } } },
{ DE_DEU, kPlatformAmiga, { 0x00000043, 0x00001783, { { 0xB2, 0x2B, 0xAB, 0x27, 0x06, 0x9A, 0x1E, 0x4B, 0xA7, 0xD3, 0xFF, 0xEB, 0xFD, 0x12, 0xDC, 0x94 } } } },
@@ -1057,6 +1113,8 @@ const ExtractEntrySearchData k2SeqplayStringsProvider[] = {
{ IT_ITA, kPlatformPC, { 0x00000916, 0x0003188F, { { 0xDC, 0x46, 0x06, 0xE1, 0xB0, 0x66, 0xBC, 0x18, 0x2E, 0x6E, 0x9E, 0xC9, 0xA4, 0x14, 0x8D, 0x08 } } } }, // floppy
{ IT_ITA, kPlatformPC, { 0x000008C8, 0x00030947, { { 0x7F, 0x75, 0x5F, 0x99, 0x94, 0xFE, 0xA1, 0xE6, 0xEF, 0xB8, 0x93, 0x71, 0x83, 0x1B, 0xAC, 0x4A } } } }, // (fan) CD
+ { RU_RUS, kPlatformPC, { 0x000008C8, 0x00028639, { { 0xF9, 0x1D, 0x6A, 0x85, 0x23, 0x5E, 0x2A, 0x64, 0xBC, 0x45, 0xB2, 0x48, 0x13, 0x49, 0xD4, 0xF7 } } } }, // (fan) floppy
+
{ EN_ANY, kPlatformFMTowns, { 0x00000990, 0x00030C61, { { 0x60, 0x51, 0x11, 0x83, 0x3F, 0x06, 0xC3, 0xA3, 0xE0, 0xC0, 0x2F, 0x41, 0x29, 0xDE, 0x65, 0xB1 } } } },
{ JA_JPN, kPlatformFMTowns, { 0x000008A8, 0x00036831, { { 0x56, 0x5B, 0x23, 0x61, 0xE8, 0x3B, 0xE1, 0x36, 0xD6, 0x62, 0xD0, 0x84, 0x00, 0x04, 0x05, 0xAD } } } },
@@ -1281,10 +1339,15 @@ const ExtractEntrySearchData kLolIngamePakFilesProvider[] = {
};
const ExtractEntrySearchData kLolCharacterDefsProvider[] = {
- { UNK_LANG, kPlatformPC, { 0x00000492, 0x000046B0, { { 0x7A, 0x94, 0x8B, 0xC6, 0xF7, 0xF1, 0x2F, 0xF3, 0xBC, 0x1B, 0x0B, 0x4E, 0x00, 0xC9, 0x44, 0x58 } } } }, // floppy
- { UNK_LANG, kPlatformPC, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy
- { UNK_LANG, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
- { UNK_LANG, kPlatformPC98, { 0x00000492, 0x00005893, { { 0x7C, 0x7E, 0xFB, 0x80, 0xD9, 0xB6, 0x16, 0x87, 0x80, 0xB7, 0x46, 0x9B, 0x96, 0x1A, 0x6A, 0xBE } } } },
+ { RU_RUS, kPlatformPC, { 0x00000492, 0x000052BA, { { 0x52, 0x29, 0x0D, 0x49, 0xFD, 0x17, 0xD7, 0x70, 0x6D, 0xCA, 0xEB, 0xB6, 0x7E, 0xFA, 0xBE, 0x08 } } } }, // floppy
+ { EN_ANY, kPlatformPC, { 0x00000492, 0x000046B0, { { 0x7A, 0x94, 0x8B, 0xC6, 0xF7, 0xF1, 0x2F, 0xF3, 0xBC, 0x1B, 0x0B, 0x4E, 0x00, 0xC9, 0x44, 0x58 } } } }, // floppy
+ { DE_DEU, kPlatformPC, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy
+ { EN_ANY, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
+ { DE_DEU, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
+ { FR_FRA, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
+ { RU_RUS, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
+ { IT_ITA, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
+ { JA_JPN, kPlatformPC98, { 0x00000492, 0x00005893, { { 0x7C, 0x7E, 0xFB, 0x80, 0xD9, 0xB6, 0x16, 0x87, 0x80, 0xB7, 0x46, 0x9B, 0x96, 0x1A, 0x6A, 0xBE } } } },
EXTRACT_END_ENTRY
};
@@ -1766,6 +1829,7 @@ const ExtractEntry extractProviders[] = {
{ k1RoomList, k1RoomListProvider },
{ k1CharacterImageFilenames, k1CharacterImageFilenamesProvider },
{ k1AudioTracks, k1AudioTracksProvider },
+ { k1AudioTracks2, k1AudioTracks2Provider },
{ k1AudioTracksIntro, k1AudioTracksIntroProvider },
{ k1ItemNames, k1ItemNamesProvider },
{ k1TakenStrings, k1TakenStringsProvider },
@@ -1962,4 +2026,3 @@ ExtractEntryList getProvidersForId(int id) {
return list;
}
-
diff --git a/devtools/create_kyradat/tables.h b/devtools/create_kyradat/tables.h
index b9687a5949..833c70a4fe 100644
--- a/devtools/create_kyradat/tables.h
+++ b/devtools/create_kyradat/tables.h
@@ -39,4 +39,3 @@ typedef std::list<ExtractEntrySearchData> ExtractEntryList;
ExtractEntryList getProvidersForId(int id);
#endif
-
diff --git a/devtools/create_kyradat/util.cpp b/devtools/create_kyradat/util.cpp
index 3b9f621949..2420f44168 100644
--- a/devtools/create_kyradat/util.cpp
+++ b/devtools/create_kyradat/util.cpp
@@ -137,4 +137,3 @@ uint32 fileSize(FILE *fp) {
fseek(fp, pos, SEEK_SET);
return sz;
}
-
diff --git a/devtools/create_lure/Makefile b/devtools/create_lure/Makefile
deleted file mode 100644
index 1ed33b594c..0000000000
--- a/devtools/create_lure/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-# $Id$
-
-all:
- g++ -I../.. create_lure_dat.cpp process_actions.cpp -o create_lure
diff --git a/devtools/create_lure/dists/msvc8/create_lure.sln b/devtools/create_lure/dists/msvc8/create_lure.sln
deleted file mode 100644
index 8d74988d8c..0000000000
--- a/devtools/create_lure/dists/msvc8/create_lure.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_lure", "create_lure.vcproj", "{63E18A70-17D2-11DE-8C30-0800200C9A66}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/devtools/create_lure/dists/msvc8/create_lure.vcproj b/devtools/create_lure/dists/msvc8/create_lure.vcproj
deleted file mode 100644
index 177466a29f..0000000000
--- a/devtools/create_lure/dists/msvc8/create_lure.vcproj
+++ /dev/null
@@ -1,222 +0,0 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="create_lure"
- ProjectGUID="{63E18A70-17D2-11DE-8C30-0800200C9A66}"
- RootNamespace="create_lure"
- Keyword="Win32Proj"
- >
- <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_lure.exe"
- LinkIncremental="2"
- IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/create_lure.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_lure.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>
- <Filter
- Name="common"
- >
- <File
- RelativePath="..\..\..\..\common\hashmap.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\hashmap.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\memorypool.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\memorypool.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\scummsys.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\str.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\str.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\util.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\..\create_lure_dat.cpp"
- >
- </File>
- <File
- RelativePath="..\..\create_lure_dat.h"
- >
- </File>
- <File
- RelativePath="..\..\process_actions.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/create_lure/dists/msvc8_to_msvc9.bat b/devtools/create_lure/dists/msvc8_to_msvc9.bat
deleted file mode 100644
index 54820b34d0..0000000000
--- a/devtools/create_lure/dists/msvc8_to_msvc9.bat
+++ /dev/null
@@ -1,32 +0,0 @@
-@echo off
-rem This batch file is used to convert MSVC8 (Visual Studio 2005) project files to MSVC9 (Visual Studio 2008) ones
-rem You need the Windows version of GNU rpl
-rem Get it here:
-rem http://gnuwin32.sourceforge.net/packages/rpl.htm
-rem Place rpl.exe from the bin folder inside the archive in the folder where
-rem this batch file resides
-
-if not exist rpl.exe goto no_rpl
-
-echo Creating MSVC9 project files from the MSVC8 ones
-copy /y msvc8\*.vcproj msvc9\
-copy /y msvc8\*.sln msvc9\
-rpl -e -q "Version=\"8.00\"" "Version=\"9.00\"" msvc9\*.vcproj
-rpl -e -q "Version=\"8,00\"" "Version=\"9,00\"" msvc9\*.vcproj
-rpl -e -q "Keyword=\"Win32Proj\"" "Keyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"131072\"" msvc9\*.vcproj
-rpl -e -q "EntryPointSymbol=\"WinMainCRTStartup\"" "EntryPointSymbol=\"WinMainCRTStartup\"\n\t\t\t\tRandomizedBaseAddress=\"1\"\n\t\t\t\tDataExecutionPrevention=\"0\"" msvc9\*.vcproj
-rpl -e -q "Format Version 9.00" "Format Version 10.00" msvc9\*.sln
-rpl -e -q "Format Version 9,00" "Format Version 10,00" msvc9\*.sln
-rpl -e -q "# Visual C++ Express 2005" "# Visual C++ Express 2008" msvc9\*.sln
-rpl -e -q "# Visual Studio 2005" "# Visual Studio 2008" msvc9\*.sln
-goto the_end
-
-:no_rpl
-echo You need the Windows version of GNU rpl
-echo Get it here:
-echo http://gnuwin32.sourceforge.net/packages/rpl.htm
-echo Place rpl.exe from the bin folder inside the archive in the folder where
-echo this batch file resides
-
-:the_end
-pause
diff --git a/devtools/create_lure/dists/msvc9/create_lure.sln b/devtools/create_lure/dists/msvc9/create_lure.sln
deleted file mode 100644
index 4f55924eea..0000000000
--- a/devtools/create_lure/dists/msvc9/create_lure.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_lure", "create_lure.vcproj", "{63E18A70-17D2-11DE-8C30-0800200C9A66}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
- {63E18A70-17D2-11DE-8C30-0800200C9A66}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/devtools/create_lure/dists/msvc9/create_lure.vcproj b/devtools/create_lure/dists/msvc9/create_lure.vcproj
deleted file mode 100644
index a611db31fa..0000000000
--- a/devtools/create_lure/dists/msvc9/create_lure.vcproj
+++ /dev/null
@@ -1,223 +0,0 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="create_lure"
- ProjectGUID="{63E18A70-17D2-11DE-8C30-0800200C9A66}"
- RootNamespace="create_lure"
- 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_lure.exe"
- LinkIncremental="2"
- IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/create_lure.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_lure.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>
- <Filter
- Name="common"
- >
- <File
- RelativePath="..\..\..\..\common\hashmap.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\hashmap.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\memorypool.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\memorypool.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\scummsys.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\str.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\str.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\common\util.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\..\create_lure_dat.cpp"
- >
- </File>
- <File
- RelativePath="..\..\create_lure_dat.h"
- >
- </File>
- <File
- RelativePath="..\..\process_actions.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/create_lure/dists/msvc9_to_msvc8.bat b/devtools/create_lure/dists/msvc9_to_msvc8.bat
deleted file mode 100644
index c87a524f77..0000000000
--- a/devtools/create_lure/dists/msvc9_to_msvc8.bat
+++ /dev/null
@@ -1,33 +0,0 @@
-@echo off
-rem This batch file is used to convert MSVC9 (Visual Studio 2008) project files to MSVC8 (Visual Studio 2005) ones
-rem You need the Windows version of GNU rpl
-rem Get it here:
-rem http://gnuwin32.sourceforge.net/packages/rpl.htm
-rem Place rpl.exe from the bin folder inside the archive in the folder where
-rem this batch file resides
-
-if not exist rpl.exe goto no_rpl
-
-echo Creating MSVC8 project files from the MSVC9 ones
-copy /y msvc9\*.vcproj msvc8\
-copy /y msvc9\*.sln msvc8\
-rpl -e -q "Version=\"9.00\"" "Version=\"8.00\"" msvc8\*.vcproj
-rpl -e -q "Version=\"9,00\"" "Version=\"8,00\"" msvc8\*.vcproj
-rpl -e -q "\tTargetFrameworkVersion=\"131072\"\n" "" msvc8\*.vcproj
-rpl -e -q "\t\t\t\tRandomizedBaseAddress=\"1\"\n" "" msvc8\*.vcproj
-rpl -e -q "\t\t\t\tDataExecutionPrevention=\"0\"\n" "" msvc8\*.vcproj
-rpl -e -q "Format Version 10.00" "Format Version 9.00" msvc8\*.sln
-rpl -e -q "Format Version 10,00" "Format Version 9,00" msvc8\*.sln
-rpl -e -q "# Visual C++ Express 2008" "# Visual C++ Express 2005" msvc8\*.sln
-rpl -e -q "# Visual Studio 2008" "# Visual Studio 2005" msvc8\*.sln
-goto the_end
-
-:no_rpl
-echo You need the Windows version of GNU rpl
-echo Get it here:
-echo http://gnuwin32.sourceforge.net/packages/rpl.htm
-echo Place rpl.exe from the bin folder inside the archive in the folder where
-echo this batch file resides
-
-:the_end
-pause
diff --git a/devtools/create_mads/Makefile b/devtools/create_mads/Makefile
deleted file mode 100644
index c2776f5d17..0000000000
--- a/devtools/create_mads/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-# $Id$
-
-all:
- g++ -I../.. main.cpp parser.cpp -o create_mads
diff --git a/devtools/create_mads/dists/msvc9/create_mads.sln b/devtools/create_mads/dists/msvc9/create_mads.sln
deleted file mode 100644
index 5ddd18cffe..0000000000
--- a/devtools/create_mads/dists/msvc9/create_mads.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual C++ Express 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_mads", "create_mads.vcproj", "{0332F6FD-D511-4AF6-ABCC-24A85F1489A4}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {0332F6FD-D511-4AF6-ABCC-24A85F1489A4}.Debug|Win32.ActiveCfg = Debug|Win32
- {0332F6FD-D511-4AF6-ABCC-24A85F1489A4}.Debug|Win32.Build.0 = Debug|Win32
- {0332F6FD-D511-4AF6-ABCC-24A85F1489A4}.Release|Win32.ActiveCfg = Release|Win32
- {0332F6FD-D511-4AF6-ABCC-24A85F1489A4}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/devtools/create_mads/dists/msvc9/create_mads.vcproj b/devtools/create_mads/dists/msvc9/create_mads.vcproj
deleted file mode 100644
index 1f33faa418..0000000000
--- a/devtools/create_mads/dists/msvc9/create_mads.vcproj
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="create_mads"
- ProjectGUID="{0332F6FD-D511-4AF6-ABCC-24A85F1489A4}"
- RootNamespace="create_mads"
- 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_mads.exe"
- LinkIncremental="2"
- IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/create_mads.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_mads.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="..\..\main.cpp"
- >
- </File>
- <File
- RelativePath="..\..\parser.cpp"
- >
- </File>
- <File
- RelativePath="..\..\parser.h"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/create_mads/main.cpp b/devtools/create_mads/main.cpp
index aec9e45b8b..b4de34d832 100644
--- a/devtools/create_mads/main.cpp
+++ b/devtools/create_mads/main.cpp
@@ -124,4 +124,4 @@ int main(int argc, char *argv[]) {
}
return 0;
-} \ No newline at end of file
+}
diff --git a/devtools/create_mads/scripts/rex_nebular.txt b/devtools/create_mads/scripts/rex_nebular.txt
index f177720398..f33a574813 100644
--- a/devtools/create_mads/scripts/rex_nebular.txt
+++ b/devtools/create_mads/scripts/rex_nebular.txt
@@ -2239,5 +2239,3 @@ sub scene101_actions
@2f6ba:
RET
end
-
-
diff --git a/devtools/create_project/codeblocks.cpp b/devtools/create_project/codeblocks.cpp
index e73dc11089..3458ca5a19 100644
--- a/devtools/create_project/codeblocks.cpp
+++ b/devtools/create_project/codeblocks.cpp
@@ -32,20 +32,20 @@ CodeBlocksProvider::CodeBlocksProvider(StringList &global_warnings, std::map<std
}
void CodeBlocksProvider::createWorkspace(const BuildSetup &setup) {
- std::ofstream workspace((setup.outputDir + '/' + PROJECT_NAME + ".workspace").c_str());
+ std::ofstream workspace((setup.outputDir + '/' + setup.projectName + ".workspace").c_str());
if (!workspace)
- error("Could not open \"" + setup.outputDir + '/' + PROJECT_NAME + ".workspace\" for writing");
+ error("Could not open \"" + setup.outputDir + '/' + setup.projectName + ".workspace\" for writing");
workspace << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n"
"<CodeBlocks_workspace_file>\n";
- workspace << "\t<Workspace title=\"" << PROJECT_DESCRIPTION << "\">\n";
+ workspace << "\t<Workspace title=\"" << setup.projectDescription << "\">\n";
- writeReferences(workspace);
+ writeReferences(setup, workspace);
// Note we assume that the UUID map only includes UUIDs for enabled engines!
for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
- if (i->first == PROJECT_NAME)
+ if (i->first == setup.projectName)
continue;
workspace << "\t\t<Project filename=\"" << i->first << ".cbp\" />\n";
@@ -88,15 +88,15 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s
"\t\t<Option compiler=\"gcc\" />\n"
"\t\t<Build>\n";
- if (name == PROJECT_NAME) {
+ if (name == setup.projectName) {
std::string libraries;
for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i)
libraries += processLibraryName(*i) + ".a;";
project << "\t\t\t<Target title=\"default\">\n"
- "\t\t\t\t<Option output=\"" << PROJECT_NAME << "\\" << PROJECT_NAME << "\" prefix_auto=\"1\" extension_auto=\"1\" />\n"
- "\t\t\t\t<Option object_output=\"" << PROJECT_NAME << "\" />\n"
+ "\t\t\t\t<Option output=\"" << setup.projectName << "\\" << setup.projectName << "\" prefix_auto=\"1\" extension_auto=\"1\" />\n"
+ "\t\t\t\t<Option object_output=\"" << setup.projectName << "\" />\n"
"\t\t\t\t<Option external_deps=\"" << libraries /* + list of engines engines\name\name.a */ << "\" />\n"
"\t\t\t\t<Option type=\"1\" />\n"
"\t\t\t\t<Option compiler=\"gcc\" />\n"
@@ -125,10 +125,10 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s
project << "\t\t\t\t\t<Add library=\"" << processLibraryName(*i) << "\" />\n";
for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
- if (i->first == PROJECT_NAME)
+ if (i->first == setup.projectName)
continue;
- project << "\t\t\t\t\t<Add library=\"" << PROJECT_NAME << "\\engines\\" << i->first << "\\lib" << i->first << ".a\" />\n";
+ project << "\t\t\t\t\t<Add library=\"" << setup.projectName << "\\engines\\" << i->first << "\\lib" << i->first << ".a\" />\n";
}
project << "\t\t\t\t\t<Add directory=\"$(" << LIBS_DEFINE << ")lib\\mingw\" />\n"
@@ -139,7 +139,7 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s
// Resource compiler
project << "\t\t\t\t<ResourceCompiler>\n"
"\t\t\t\t\t<Add directory=\"..\\..\\dists\" />\n"
- "\t\t\t\t\t<Add directory=\"..\\..\\..\\" << PROJECT_NAME << "\" />\n"
+ "\t\t\t\t\t<Add directory=\"..\\..\\..\\" << setup.projectName << "\" />\n"
"\t\t\t\t</ResourceCompiler>\n"
"\t\t\t</Target>\n"
"\t\t</Build>\n";
@@ -148,9 +148,9 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s
} else {
project << "\t\t\t<Target title=\"default\">\n"
- "\t\t\t\t<Option output=\"" << PROJECT_NAME << "\\engines\\" << name << "\\lib" << name << "\" prefix_auto=\"1\" extension_auto=\"1\" />\n"
+ "\t\t\t\t<Option output=\"" << setup.projectName << "\\engines\\" << name << "\\lib" << name << "\" prefix_auto=\"1\" extension_auto=\"1\" />\n"
"\t\t\t\t<Option working_dir=\"\" />\n"
- "\t\t\t\t<Option object_output=\"" << PROJECT_NAME << "\" />\n"
+ "\t\t\t\t<Option object_output=\"" << setup.projectName << "\" />\n"
"\t\t\t\t<Option type=\"2\" />\n"
"\t\t\t\t<Option compiler=\"gcc\" />\n"
"\t\t\t\t<Option createDefFile=\"1\" />\n"
@@ -161,7 +161,7 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s
project << "\t\t\t\t\t<Add option=\"-g\" />\n"
"\t\t\t\t\t<Add directory=\"..\\..\\engines\" />\n"
- "\t\t\t\t\t<Add directory=\"..\\..\\..\\" << PROJECT_NAME << "\" />\n";
+ "\t\t\t\t\t<Add directory=\"..\\..\\..\\" << setup.projectName << "\" />\n";
// Sword2.5 engine needs theora and vorbis includes
if (name == "sword25")
@@ -240,8 +240,8 @@ void CodeBlocksProvider::writeFileListToProject(const FileNode &dir, std::ofstre
}
}
-void CodeBlocksProvider::writeReferences(std::ofstream &output) {
- output << "\t\t<Project filename=\"" << PROJECT_NAME << ".cbp\" active=\"1\">\n";
+void CodeBlocksProvider::writeReferences(const BuildSetup &setup, std::ofstream &output) {
+ output << "\t\t<Project filename=\"" << setup.projectName << ".cbp\" active=\"1\">\n";
for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
if (i->first == " << PROJECT_NAME << ")
diff --git a/devtools/create_project/codeblocks.h b/devtools/create_project/codeblocks.h
index 8d35eb068e..f65604d925 100644
--- a/devtools/create_project/codeblocks.h
+++ b/devtools/create_project/codeblocks.h
@@ -43,7 +43,7 @@ protected:
void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation,
const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix);
- void writeReferences(std::ofstream &output);
+ void writeReferences(const BuildSetup &setup, std::ofstream &output);
const char *getProjectExtension();
diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp
index 35d08561bf..084641608a 100644
--- a/devtools/create_project/create_project.cpp
+++ b/devtools/create_project/create_project.cpp
@@ -20,6 +20,8 @@
*
*/
+//#define ENABLE_XCODE
+
// HACK to allow building with the SDL backend on MinGW
// see bug #1800764 "TOOLS: MinGW tools building broken"
#ifdef main
@@ -177,6 +179,7 @@ int main(int argc, char *argv[]) {
projectType = kProjectMSVC;
+#ifdef ENABLE_XCODE
} else if (!std::strcmp(argv[i], "--xcode")) {
if (projectType != kProjectNone) {
std::cerr << "ERROR: You cannot pass more than one project type!\n";
@@ -184,6 +187,7 @@ int main(int argc, char *argv[]) {
}
projectType = kProjectXcode;
+#endif
} else if (!std::strcmp(argv[i], "--msvc-version")) {
if (i + 1 >= argc) {
@@ -255,6 +259,8 @@ int main(int argc, char *argv[]) {
} else if (!std::strcmp(argv[i], "--installer")) {
setup.runBuildEvents = true;
setup.createInstaller = true;
+ } else if (!std::strcmp(argv[i], "--tools")) {
+ setup.devTools = true;
} else {
std::cerr << "ERROR: Unknown parameter \"" << argv[i] << "\"\n";
return -1;
@@ -323,6 +329,11 @@ int main(int argc, char *argv[]) {
return -1;
case kProjectCodeBlocks:
+ if (setup.devTools) {
+ std::cerr << "ERROR: Building tools is not supported for the CodeBlocks project type!\n";
+ return -1;
+ }
+
////////////////////////////////////////////////////////////////////////////
// Code::Blocks is using GCC behind the scenes, so we need to pass a list
// of options to enable or disable warnings
@@ -480,6 +491,11 @@ int main(int argc, char *argv[]) {
break;
case kProjectXcode:
+ if (setup.devTools) {
+ std::cerr << "ERROR: Building tools is not supported for the XCode project type!\n";
+ return -1;
+ }
+
////////////////////////////////////////////////////////////////////////////
// Xcode is also using GCC behind the scenes. See Code::Blocks comment
// for info on all warnings
@@ -506,6 +522,15 @@ int main(int argc, char *argv[]) {
break;
}
+ // Setup project name and description
+ setup.projectName = PROJECT_NAME;
+ setup.projectDescription = PROJECT_DESCRIPTION;
+
+ if (setup.devTools) {
+ setup.projectName += "-tools";
+ setup.projectDescription += "Tools";
+ }
+
provider->createProject(setup);
delete provider;
@@ -560,6 +585,9 @@ void displayHelp(const char *exe) {
" (default: false)\n"
" --installer Create NSIS installer after the build (implies --build-events)\n"
" (default: false)\n"
+ " --tools Create project files for the devtools\n"
+ " (ignores --build-events and --installer, as well as engine settings)\n"
+ " (default: false)\n"
"\n"
"Engines settings:\n"
" --list-engines list all available engines and their default state\n"
@@ -773,6 +801,7 @@ const Feature s_features[] = {
{ "theora", "USE_THEORADEC", "libtheora_static", true, "Theora decoding support" },
// Feature flags
+ { "bink", "USE_BINK", "", true, "Bink video support" },
{ "scalers", "USE_SCALERS", "", true, "Scalers" },
{ "hqscalers", "USE_HQ_SCALERS", "", true, "HQ scalers" },
{ "16bit", "USE_RGB_COLOR", "", true, "16bit color support" },
@@ -785,6 +814,18 @@ const Feature s_features[] = {
{ "langdetect", "USE_DETECTLANG", "", true, "System language detection support" } // This feature actually depends on "translation", there
// is just no current way of properly detecting this...
};
+
+const Tool s_tools[] = {
+ { "create_drascula", true},
+ { "create_hugo", true},
+ { "create_kyradat", true},
+ { "create_lure", true},
+ { "create_mads", true},
+ { "create_teenagent", true},
+ { "create_toon", true},
+ { "create_translations", true},
+ { "qtable", true}
+};
} // End of anonymous namespace
FeatureList getAllFeatures() {
@@ -831,6 +872,16 @@ bool setFeatureBuildState(const std::string &name, FeatureList &features, bool e
}
}
+ToolList getAllTools() {
+ const size_t toolCount = sizeof(s_tools) / sizeof(s_tools[0]);
+
+ ToolList tools;
+ for (size_t i = 0; i < toolCount; ++i)
+ tools.push_back(s_tools[i]);
+
+ return tools;
+}
+
namespace CreateProjectTool {
//////////////////////////////////////////////////////////////////////////
@@ -1056,63 +1107,90 @@ ProjectProvider::ProjectProvider(StringList &global_warnings, std::map<std::stri
}
void ProjectProvider::createProject(const BuildSetup &setup) {
- _uuidMap = createUUIDMap(setup);
+ if (setup.devTools) {
+ _uuidMap = createToolsUUIDMap();
- // We also need to add the UUID of the main project file.
- const std::string svmUUID = _uuidMap[PROJECT_NAME] = createUUID();
+ // We also need to add the UUID of the main project file.
+ const std::string svmUUID = _uuidMap[setup.projectName] = createUUID();
- // Create Solution/Workspace file
- createWorkspace(setup);
+ createWorkspace(setup);
- StringList in, ex;
+ StringList in, ex;
- // Create engine project files
- for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
- if (i->first == PROJECT_NAME)
- continue;
+ // Create tools project files
+ for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
+ if (i->first == setup.projectName)
+ continue;
- in.clear(); ex.clear();
- const std::string moduleDir = setup.srcDir + "/engines/" + i->first;
+ in.clear(); ex.clear();
+ const std::string moduleDir = setup.srcDir + "/devtools/" + i->first;
- createModuleList(moduleDir, setup.defines, in, ex);
- createProjectFile(i->first, i->second, setup, moduleDir, in, ex);
- }
+ createModuleList(moduleDir, setup.defines, in, ex);
+ createProjectFile(i->first, i->second, setup, moduleDir, in, ex);
+ }
+
+ // Create other misc. build files
+ createOtherBuildFiles(setup);
- // Last but not least create the main project file.
- in.clear(); ex.clear();
-
- // File list for the Project file
- createModuleList(setup.srcDir + "/backends", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/backends/platform/sdl", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/base", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/common", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/engines", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/graphics", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/gui", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/audio", setup.defines, in, ex);
- createModuleList(setup.srcDir + "/audio/softsynth/mt32", setup.defines, in, ex);
+ } else {
+ _uuidMap = createUUIDMap(setup);
+
+ // We also need to add the UUID of the main project file.
+ const std::string svmUUID = _uuidMap[setup.projectName] = createUUID();
+
+ // Create Solution/Workspace file
+ createWorkspace(setup);
+
+ StringList in, ex;
+
+ // Create engine project files
+ for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
+ if (i->first == setup.projectName)
+ continue;
+
+ in.clear(); ex.clear();
+ const std::string moduleDir = setup.srcDir + "/engines/" + i->first;
+
+ createModuleList(moduleDir, setup.defines, in, ex);
+ createProjectFile(i->first, i->second, setup, moduleDir, in, ex);
+ }
+
+ // Last but not least create the main project file.
+ in.clear(); ex.clear();
+
+ // File list for the Project file
+ createModuleList(setup.srcDir + "/backends", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/backends/platform/sdl", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/base", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/common", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/engines", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/graphics", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/gui", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/audio", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/audio/softsynth/mt32", setup.defines, in, ex);
#if HAS_VIDEO_FOLDER
- createModuleList(setup.srcDir + "/video", setup.defines, in, ex);
+ createModuleList(setup.srcDir + "/video", setup.defines, in, ex);
#endif
- // Resource files
- in.push_back(setup.srcDir + "/icons/" + PROJECT_NAME + ".ico");
- in.push_back(setup.srcDir + "/dists/" + PROJECT_NAME + ".rc");
+ // Resource files
+ in.push_back(setup.srcDir + "/icons/" + setup.projectName + ".ico");
+ in.push_back(setup.srcDir + "/dists/" + setup.projectName + ".rc");
- // Various text files
- in.push_back(setup.srcDir + "/AUTHORS");
- in.push_back(setup.srcDir + "/COPYING");
- in.push_back(setup.srcDir + "/COPYING.LGPL");
- in.push_back(setup.srcDir + "/COPYRIGHT");
- in.push_back(setup.srcDir + "/NEWS");
- in.push_back(setup.srcDir + "/README");
- in.push_back(setup.srcDir + "/TODO");
+ // Various text files
+ in.push_back(setup.srcDir + "/AUTHORS");
+ in.push_back(setup.srcDir + "/COPYING");
+ in.push_back(setup.srcDir + "/COPYING.LGPL");
+ in.push_back(setup.srcDir + "/COPYRIGHT");
+ in.push_back(setup.srcDir + "/NEWS");
+ in.push_back(setup.srcDir + "/README");
+ in.push_back(setup.srcDir + "/TODO");
- // Create the main project file.
- createProjectFile(PROJECT_NAME, svmUUID, setup, setup.srcDir, in, ex);
+ // Create the main project file.
+ createProjectFile(setup.projectName, svmUUID, setup, setup.srcDir, in, ex);
- // Create other misc. build files
- createOtherBuildFiles(setup);
+ // Create other misc. build files
+ createOtherBuildFiles(setup);
+ }
}
ProjectProvider::UUIDMap ProjectProvider::createUUIDMap(const BuildSetup &setup) const {
@@ -1128,6 +1206,20 @@ ProjectProvider::UUIDMap ProjectProvider::createUUIDMap(const BuildSetup &setup)
return result;
}
+ProjectProvider::UUIDMap ProjectProvider::createToolsUUIDMap() const {
+ UUIDMap result;
+
+ ToolList tools = getAllTools();
+ for (ToolList::const_iterator i = tools.begin(); i != tools.end(); ++i) {
+ if (!i->enable)
+ continue;
+
+ result[i->name] = createUUID();
+ }
+
+ return result;
+}
+
std::string ProjectProvider::createUUID() const {
#ifdef USE_WIN32_API
UUID uuid;
diff --git a/devtools/create_project/create_project.h b/devtools/create_project/create_project.h
index 9b9e4cfd1b..55e04be4ec 100644
--- a/devtools/create_project/create_project.h
+++ b/devtools/create_project/create_project.h
@@ -137,6 +137,12 @@ struct Feature {
};
typedef std::list<Feature> FeatureList;
+struct Tool {
+ const char *name; ///< Name of the tools
+ bool enable; ///< Whether the tools is enabled or not
+};
+typedef std::list<Tool> ToolList;
+
/**
* Creates a list of all features available for MSVC.
*
@@ -179,6 +185,9 @@ bool setFeatureBuildState(const std::string &name, FeatureList &features, bool e
* It also contains the path to the project source root.
*/
struct BuildSetup {
+ std::string projectName; ///< Project name
+ std::string projectDescription; ///< Project description
+
std::string srcDir; ///< Path to the sources.
std::string filePrefix; ///< Prefix for the relative path arguments in the project files.
std::string outputDir; ///< Path where to put the MSVC project files.
@@ -189,10 +198,12 @@ struct BuildSetup {
StringList defines; ///< List of all defines for the build.
StringList libraries; ///< List of all external libraries required for the build.
+ bool devTools; ///< Generate project files for the tools
bool runBuildEvents; ///< Run build events as part of the build (generate revision number and copy engine/theme data & needed files to the build folder
bool createInstaller; ///< Create NSIS installer after the build
BuildSetup() {
+ devTools = false;
runBuildEvents = false;
createInstaller = false;
}
@@ -360,7 +371,7 @@ protected:
*
* @param output File stream to write to.
*/
- virtual void writeReferences(std::ofstream &) {};
+ virtual void writeReferences(const BuildSetup &, std::ofstream &) {};
/**
* Get the file extension for project files
@@ -402,6 +413,14 @@ protected:
UUIDMap createUUIDMap(const BuildSetup &setup) const;
/**
+ * Creates an UUID for every enabled tool of the
+ * passed build description.
+ *
+ * @return A map, which includes UUIDs for all enabled engines.
+ */
+ UUIDMap createToolsUUIDMap() const;
+
+ /**
* Creates an UUID and returns it in string representation.
*
* @return A new UUID as string.
diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp
index bdbc0a4074..f8768ecc73 100644
--- a/devtools/create_project/msbuild.cpp
+++ b/devtools/create_project/msbuild.cpp
@@ -58,9 +58,9 @@ inline void outputConfiguration(std::ostream &project, const std::string &config
"\t\t</ProjectConfiguration>\n";
}
-inline void outputConfigurationType(std::ostream &project, const std::string &name, const std::string &config) {
+inline void outputConfigurationType(const BuildSetup &setup, std::ostream &project, const std::string &name, const std::string &config) {
project << "\t<PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='" << config << "'\" Label=\"Configuration\">\n"
- "\t\t<ConfigurationType>" << (name == PROJECT_NAME ? "Application" : "StaticLibrary") << "</ConfigurationType>\n"
+ "\t\t<ConfigurationType>" << ((name == setup.projectName || setup.devTools) ? "Application" : "StaticLibrary") << "</ConfigurationType>\n"
"\t</PropertyGroup>\n";
}
@@ -103,23 +103,23 @@ void MSBuildProvider::createProjectFile(const std::string &name, const std::stri
// Shared configuration
project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n";
- outputConfigurationType(project, name, "Release|Win32");
- outputConfigurationType(project, name, "Analysis|Win32");
- outputConfigurationType(project, name, "Debug|Win32");
- outputConfigurationType(project, name, "Release|x64");
- outputConfigurationType(project, name, "Analysis|x64");
- outputConfigurationType(project, name, "Debug|x64");
+ outputConfigurationType(setup, project, name, "Release|Win32");
+ outputConfigurationType(setup, project, name, "Analysis|Win32");
+ outputConfigurationType(setup, project, name, "Debug|Win32");
+ outputConfigurationType(setup, project, name, "Release|x64");
+ outputConfigurationType(setup, project, name, "Analysis|x64");
+ outputConfigurationType(setup, project, name, "Debug|x64");
project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n"
"\t<ImportGroup Label=\"ExtensionSettings\">\n"
"\t</ImportGroup>\n";
- outputProperties(project, "Release|Win32", PROJECT_DESCRIPTION "_Release.props");
- outputProperties(project, "Analysis|Win32", PROJECT_DESCRIPTION "_Analysis.props");
- outputProperties(project, "Debug|Win32", PROJECT_DESCRIPTION "_Debug.props");
- outputProperties(project, "Release|x64", PROJECT_DESCRIPTION "_Release64.props");
- outputProperties(project, "Analysis|x64", PROJECT_DESCRIPTION "_Analysis64.props");
- outputProperties(project, "Debug|x64", PROJECT_DESCRIPTION "_Debug64.props");
+ outputProperties(project, "Release|Win32", setup.projectDescription + "_Release.props");
+ outputProperties(project, "Analysis|Win32", setup.projectDescription + "_Analysis.props");
+ outputProperties(project, "Debug|Win32", setup.projectDescription + "_Debug.props");
+ outputProperties(project, "Release|x64", setup.projectDescription + "_Release64.props");
+ outputProperties(project, "Analysis|x64", setup.projectDescription + "_Analysis64.props");
+ outputProperties(project, "Debug|x64", setup.projectDescription + "_Debug64.props");
project << "\t<PropertyGroup Label=\"UserMacros\" />\n";
@@ -145,8 +145,8 @@ void MSBuildProvider::createProjectFile(const std::string &name, const std::stri
addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix);
// Output references for the main project
- if (name == PROJECT_NAME)
- writeReferences(project);
+ if (name == setup.projectName)
+ writeReferences(setup, project);
project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n"
"\t<ImportGroup Label=\"ExtensionTargets\">\n"
@@ -213,11 +213,11 @@ void MSBuildProvider::outputFilter(std::ostream &filters, const FileEntries &fil
}
}
-void MSBuildProvider::writeReferences(std::ofstream &output) {
+void MSBuildProvider::writeReferences(const BuildSetup &setup, std::ofstream &output) {
output << "\t<ItemGroup>\n";
for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
- if (i->first == PROJECT_NAME)
+ if (i->first == setup.projectName)
continue;
output << "\t<ProjectReference Include=\"" << i->first << ".vcxproj\">\n"
@@ -235,7 +235,7 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s
std::map<std::string, StringList>::iterator warningsIterator = _projectWarnings.find(name);
// Nothing to add here, move along!
- if (name != PROJECT_NAME && name != "sword25" && name != "tinsel" && name != "grim" && warningsIterator == _projectWarnings.end())
+ if (!setup.devTools && name != setup.projectName && name != "sword25" && name != "tinsel" && name != "grim" && warningsIterator == _projectWarnings.end())
return;
std::string warnings = "";
@@ -247,7 +247,7 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s
"\t\t<ClCompile>\n";
// Compile configuration
- if (name == PROJECT_NAME || name == "sword25" || name == "grim") {
+ if (setup.devTools || name == setup.projectName || name == "sword25" || name == "grim") {
project << "\t\t\t<DisableLanguageExtensions>false</DisableLanguageExtensions>\n";
} else {
if (name == "tinsel" && !isRelease)
@@ -260,18 +260,18 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s
project << "\t\t</ClCompile>\n";
// Link configuration for main project
- if (name == PROJECT_NAME) {
+ if (name == setup.projectName || setup.devTools) {
std::string libraries;
for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i)
libraries += *i + ".lib;";
project << "\t\t<Link>\n"
- "\t\t\t<OutputFile>$(OutDir)" << PROJECT_NAME << ".exe</OutputFile>\n"
+ "\t\t\t<OutputFile>$(OutDir)" << (setup.devTools ? name : setup.projectName) << ".exe</OutputFile>\n"
"\t\t\t<AdditionalDependencies>" << libraries << "%(AdditionalDependencies)</AdditionalDependencies>\n"
"\t\t</Link>\n";
- if (setup.runBuildEvents) {
+ if (!setup.devTools && setup.runBuildEvents) {
project << "\t\t<PreBuildEvent>\n"
"\t\t\t<Message>Generate revision</Message>\n"
"\t\t\t<Command>" << getPreBuildEvent() << "</Command>\n"
@@ -288,7 +288,7 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s
project << "\t</ItemDefinitionGroup>\n";
}
-void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) {
+void MSBuildProvider::outputGlobalPropFile(const BuildSetup &setup, std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) {
std::string warnings;
for (StringList::const_iterator i = _globalWarnings.begin(); i != _globalWarnings.end(); ++i)
@@ -306,7 +306,7 @@ void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits,
"<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"
"\t<PropertyGroup>\n"
"\t\t<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n"
- "\t\t<_PropertySheetDisplayName>" << PROJECT_DESCRIPTION << "_Global</_PropertySheetDisplayName>\n"
+ "\t\t<_PropertySheetDisplayName>" << setup.projectDescription << "_Global</_PropertySheetDisplayName>\n"
"\t\t<ExecutablePath>$(" << LIBS_DEFINE << ")\\bin;$(ExecutablePath)</ExecutablePath>\n"
"\t\t<LibraryPath>$(" << LIBS_DEFINE << ")\\lib\\" << (bits == 32 ? "x86" : "x64") << ";$(LibraryPath)</LibraryPath>\n"
"\t\t<IncludePath>$(" << LIBS_DEFINE << ")\\include;$(IncludePath)</IncludePath>\n"
@@ -319,7 +319,7 @@ void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits,
"\t\t\t<DisableSpecificWarnings>" << warnings << ";%(DisableSpecificWarnings)</DisableSpecificWarnings>\n"
"\t\t\t<AdditionalIncludeDirectories>$(" << LIBS_DEFINE << ")\\include;" << prefix << ";" << prefix << "\\engines;$(TargetDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n"
"\t\t\t<PreprocessorDefinitions>" << definesList << "%(PreprocessorDefinitions)</PreprocessorDefinitions>\n"
- "\t\t\t<ExceptionHandling></ExceptionHandling>\n";
+ "\t\t\t<ExceptionHandling>" << (setup.devTools ? "Sync" : "") << "</ExceptionHandling>\n";
#if NEEDS_RTTI
properties << "\t\t\t<RuntimeTypeInfo>true</RuntimeTypeInfo>\n";
@@ -333,9 +333,12 @@ void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits,
"\t\t</ClCompile>\n"
"\t\t<Link>\n"
"\t\t\t<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\n"
- "\t\t\t<SubSystem>Console</SubSystem>\n"
- "\t\t\t<EntryPointSymbol>WinMainCRTStartup</EntryPointSymbol>\n"
- "\t\t</Link>\n"
+ "\t\t\t<SubSystem>Console</SubSystem>\n";
+
+ if (!setup.devTools)
+ properties << "\t\t\t<EntryPointSymbol>WinMainCRTStartup</EntryPointSymbol>\n";
+
+ properties << "\t\t</Link>\n"
"\t\t<ResourceCompile>\n"
"\t\t\t<AdditionalIncludeDirectories>" << prefix << ";%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n"
"\t\t</ResourceCompile>\n"
@@ -349,18 +352,18 @@ void MSBuildProvider::createBuildProp(const BuildSetup &setup, bool isRelease, b
const std::string outputType = (enableAnalysis ? "Analysis" : (isRelease ? "Release" : "Debug"));
const std::string outputBitness = (isWin32 ? "32" : "64");
- std::ofstream properties((setup.outputDir + '/' + PROJECT_DESCRIPTION "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension()).c_str());
+ std::ofstream properties((setup.outputDir + '/' + setup.projectDescription + "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension()).c_str());
if (!properties)
- error("Could not open \"" + setup.outputDir + '/' + PROJECT_DESCRIPTION "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension() + "\" for writing");
+ error("Could not open \"" + setup.outputDir + '/' + setup.projectDescription + "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension() + "\" for writing");
properties << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"
"\t<ImportGroup Label=\"PropertySheets\">\n"
- "\t\t<Import Project=\"" << PROJECT_DESCRIPTION << "_Global" << (isWin32 ? "" : "64") << ".props\" />\n"
+ "\t\t<Import Project=\"" << setup.projectDescription << "_Global" << (isWin32 ? "" : "64") << ".props\" />\n"
"\t</ImportGroup>\n"
"\t<PropertyGroup>\n"
"\t\t<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n"
- "\t\t<_PropertySheetDisplayName>" << PROJECT_DESCRIPTION << "_" << outputType << outputBitness << "</_PropertySheetDisplayName>\n"
+ "\t\t<_PropertySheetDisplayName>" << setup.projectDescription << "_" << outputType << outputBitness << "</_PropertySheetDisplayName>\n"
"\t\t<LinkIncremental>" << (isRelease ? "false" : "true") << "</LinkIncremental>\n"
"\t</PropertyGroup>\n"
"\t<ItemDefinitionGroup>\n"
diff --git a/devtools/create_project/msbuild.h b/devtools/create_project/msbuild.h
index 681c893d95..fa6667741a 100644
--- a/devtools/create_project/msbuild.h
+++ b/devtools/create_project/msbuild.h
@@ -40,9 +40,9 @@ protected:
void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation,
const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix);
- void writeReferences(std::ofstream &output);
+ void writeReferences(const BuildSetup &setup, std::ofstream &output);
- void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents);
+ void outputGlobalPropFile(const BuildSetup &setup, std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents);
void createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis);
diff --git a/devtools/create_project/msvc.cpp b/devtools/create_project/msvc.cpp
index aa347b1081..96eaf643d1 100644
--- a/devtools/create_project/msvc.cpp
+++ b/devtools/create_project/msvc.cpp
@@ -36,33 +36,36 @@ MSVCProvider::MSVCProvider(StringList &global_warnings, std::map<std::string, St
}
void MSVCProvider::createWorkspace(const BuildSetup &setup) {
- UUIDMap::const_iterator svmUUID = _uuidMap.find(PROJECT_NAME);
+ UUIDMap::const_iterator svmUUID = _uuidMap.find(setup.projectName);
if (svmUUID == _uuidMap.end())
- error("No UUID for \"" PROJECT_NAME "\" project created");
+ error("No UUID for \"" + setup.projectName + "\" project created");
const std::string svmProjectUUID = svmUUID->second;
assert(!svmProjectUUID.empty());
std::string solutionUUID = createUUID();
- std::ofstream solution((setup.outputDir + '/' + PROJECT_NAME ".sln").c_str());
+ std::ofstream solution((setup.outputDir + '/' + setup.projectName + ".sln").c_str());
if (!solution)
- error("Could not open \"" + setup.outputDir + '/' + PROJECT_NAME ".sln\" for writing");
+ error("Could not open \"" + setup.outputDir + '/' + setup.projectName + ".sln\" for writing");
solution << "Microsoft Visual Studio Solution File, Format Version " << _version + 1 << ".00\n";
solution << "# Visual Studio " << getVisualStudioVersion() << "\n";
- solution << "Project(\"{" << solutionUUID << "}\") = \"" << PROJECT_NAME << "\", \"" << PROJECT_NAME << getProjectExtension() << "\", \"{" << svmProjectUUID << "}\"\n";
+ // Write main project
+ if (!setup.devTools) {
+ solution << "Project(\"{" << solutionUUID << "}\") = \"" << setup.projectName << "\", \"" << setup.projectName << getProjectExtension() << "\", \"{" << svmProjectUUID << "}\"\n";
- // Project dependencies are moved to vcxproj files in Visual Studio 2010
- if (_version < 10)
- writeReferences(solution);
+ // Project dependencies are moved to vcxproj files in Visual Studio 2010
+ if (_version < 10)
+ writeReferences(setup, solution);
- solution << "EndProject\n";
+ solution << "EndProject\n";
+ }
// Note we assume that the UUID map only includes UUIDs for enabled engines!
for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
- if (i->first == PROJECT_NAME)
+ if (i->first == setup.projectName)
continue;
solution << "Project(\"{" << solutionUUID << "}\") = \"" << i->first << "\", \"" << i->first << getProjectExtension() << "\", \"{" << i->second << "}\"\n"
@@ -117,16 +120,16 @@ void MSVCProvider::createOtherBuildFiles(const BuildSetup &setup) {
}
void MSVCProvider::createGlobalProp(const BuildSetup &setup) {
- std::ofstream properties((setup.outputDir + '/' + PROJECT_DESCRIPTION "_Global" + getPropertiesExtension()).c_str());
+ std::ofstream properties((setup.outputDir + '/' + setup.projectDescription + "_Global" + getPropertiesExtension()).c_str());
if (!properties)
- error("Could not open \"" + setup.outputDir + '/' + PROJECT_DESCRIPTION "_Global" + getPropertiesExtension() + "\" for writing");
+ error("Could not open \"" + setup.outputDir + '/' + setup.projectDescription + "_Global" + getPropertiesExtension() + "\" for writing");
- outputGlobalPropFile(properties, 32, setup.defines, convertPathToWin(setup.filePrefix), setup.runBuildEvents);
+ outputGlobalPropFile(setup, properties, 32, setup.defines, convertPathToWin(setup.filePrefix), setup.runBuildEvents);
properties.close();
- properties.open((setup.outputDir + '/' + PROJECT_DESCRIPTION "_Global64" + getPropertiesExtension()).c_str());
+ properties.open((setup.outputDir + '/' + setup.projectDescription + "_Global64" + getPropertiesExtension()).c_str());
if (!properties)
- error("Could not open \"" + setup.outputDir + '/' + PROJECT_DESCRIPTION "_Global64" + getPropertiesExtension() + "\" for writing");
+ error("Could not open \"" + setup.outputDir + '/' + setup.projectDescription + "_Global64" + getPropertiesExtension() + "\" for writing");
// HACK: We must disable the "nasm" feature for x64. To achieve that we must duplicate the feature list and
// recreate a define list.
@@ -140,7 +143,7 @@ void MSVCProvider::createGlobalProp(const BuildSetup &setup) {
x64Defines.push_back("WIN32");
x64Defines.push_back("SDL_BACKEND");
- outputGlobalPropFile(properties, 64, x64Defines, convertPathToWin(setup.filePrefix), setup.runBuildEvents);
+ outputGlobalPropFile(setup, properties, 64, x64Defines, convertPathToWin(setup.filePrefix), setup.runBuildEvents);
}
std::string MSVCProvider::getPreBuildEvent() const {
diff --git a/devtools/create_project/msvc.h b/devtools/create_project/msvc.h
index ead4bf949a..0a994667fa 100644
--- a/devtools/create_project/msvc.h
+++ b/devtools/create_project/msvc.h
@@ -58,7 +58,7 @@ protected:
* @param prefix File prefix, used to add additional include paths.
* @param runBuildEvents true if generating a revision number, false otherwise
*/
- virtual void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) = 0;
+ virtual void outputGlobalPropFile(const BuildSetup &setup, std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) = 0;
/**
* Generates the project properties for debug and release settings.
diff --git a/devtools/create_project/msvc10/create_project.vcxproj b/devtools/create_project/msvc10/create_project.vcxproj
index 3d7f8fdd3d..40c515f26b 100644
--- a/devtools/create_project/msvc10/create_project.vcxproj
+++ b/devtools/create_project/msvc10/create_project.vcxproj
@@ -59,11 +59,11 @@
</Link>
<PostBuildEvent>
<Command>@echo off
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc10\
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc9\
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc8\
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\codeblocks\
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\iphone\</Command>
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -84,10 +84,12 @@ xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\iphone\</Command>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<PostBuildEvent>
- <Command>xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc10\
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc9\
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc8\
-xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\codeblocks\</Command>
+ <Command>@echo off
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\"
+xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
</PostBuildEvent>
<PreBuildEvent>
<Command>
@@ -120,4 +122,4 @@ xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\codeblocks\</Command>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/devtools/create_project/msvc10/create_project.vcxproj.filters b/devtools/create_project/msvc10/create_project.vcxproj.filters
index 5ecd6c3dde..b4f0b18774 100644
--- a/devtools/create_project/msvc10/create_project.vcxproj.filters
+++ b/devtools/create_project/msvc10/create_project.vcxproj.filters
@@ -68,4 +68,4 @@
<Filter>scripts</Filter>
</None>
</ItemGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/devtools/create_project/scripts/installer.vbs b/devtools/create_project/scripts/installer.vbs
index d752355acd..19b4eee49b 100644
--- a/devtools/create_project/scripts/installer.vbs
+++ b/devtools/create_project/scripts/installer.vbs
@@ -72,10 +72,9 @@ Sub CreateInstaller()
' Build command line
Dim commandLine : commandLine = """" & nsisPath & "\makensis.exe"" /V2" & _
" /Dtop_srcdir=""" & rootFolder & """" & _
- " /Dbuild_dir=""" & targetFolder & """" & _
- " /Dtext_dir=""" & rootFolder & """" & _
+ " /Dstaging_dir=""" & targetFolder & """" & _
" /DARCH=""" & arch & """" & _
- " """ & rootFolder & "\dists\nsis\scummvm.nsi"""
+ " """ & rootFolder & "\dists\win32\scummvm.nsi"""
Dim oExec: Set oExec = WshShell.Exec(commandline)
If Err.Number <> 0 Then
diff --git a/devtools/create_project/scripts/postbuild.cmd b/devtools/create_project/scripts/postbuild.cmd
index a5051d8228..dd52c0217c 100644
--- a/devtools/create_project/scripts/postbuild.cmd
+++ b/devtools/create_project/scripts/postbuild.cmd
@@ -23,23 +23,7 @@ if "%~5"=="" goto error_installer
echo Copying data files
echo.
-REM xcopy /F /Y "%~1/AUTHORS" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/COPYING.GPL" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/COPYING" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/COPYING.LGPL" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/COPYRIGHT" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/NEWS" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/README" %~2 1>NUL 2>&1
-
-REM xcopy /F /Y "%~1/dists/engine-data/*.dat" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/dists/engine-data/*.tbl" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/dists/engine-data/*.cpt" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/gui/themes/*.zip" %~2 1>NUL 2>&1
-REM xcopy /F /Y "%~1/gui/themes/translations.dat" %~2 1>NUL 2>&1
-
-xcopy /F /Y "%~4/lib/%~3/SDL.dll" "%~2" 1>NUL 2>&1
-xcopy /F /Y "%~4/README-SDL" "%~2" 1>NUL 2>&1
-
+xcopy /F /Y "%~4/lib/%~3/SDL.dll" "%~2" 1>NUL 2>&1
xcopy /F /Y "%~1/backends/vkeybd/packs/vkeybd_default.zip" "%~2" 1>NUL 2>&1
if "%~5"=="0" goto done
diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp
index b4c2b46ba4..a0fd239db4 100644
--- a/devtools/create_project/visualstudio.cpp
+++ b/devtools/create_project/visualstudio.cpp
@@ -83,7 +83,7 @@ void VisualStudioProvider::createProjectFile(const std::string &name, const std:
// Check for project-specific warnings:
std::map< std::string, std::list<std::string> >::iterator warningsIterator = _projectWarnings.find(name);
- if (name == PROJECT_NAME) {
+ if (setup.devTools || name == setup.projectName) {
std::string libraries;
for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i)
@@ -115,12 +115,12 @@ void VisualStudioProvider::createProjectFile(const std::string &name, const std:
toolConfig += (name == "grim" ? "DisableLanguageExtensions=\"false\" " : "");
// Win32
- outputConfiguration(project, toolConfig, "Debug", "Win32", "");
- outputConfiguration(project, toolConfig, "Analysis", "Win32", "");
- outputConfiguration(project, toolConfig, "Release", "Win32", "");
- outputConfiguration(project, toolConfig, "Debug", "x64", "64");
- outputConfiguration(project, toolConfig, "Analysis", "x64", "64");
- outputConfiguration(project, toolConfig, "Release", "x64", "64");
+ outputConfiguration(setup, project, toolConfig, "Debug", "Win32", "");
+ outputConfiguration(setup, project, toolConfig, "Analysis", "Win32", "");
+ outputConfiguration(setup, project, toolConfig, "Release", "Win32", "");
+ outputConfiguration(setup, project, toolConfig, "Debug", "x64", "64");
+ outputConfiguration(setup, project, toolConfig, "Analysis", "x64", "64");
+ outputConfiguration(setup, project, toolConfig, "Release", "x64", "64");
}
project << "\t</Configurations>\n"
@@ -143,23 +143,23 @@ void VisualStudioProvider::createProjectFile(const std::string &name, const std:
}
void VisualStudioProvider::outputConfiguration(std::ostream &project, const BuildSetup &setup, const std::string &libraries, const std::string &config, const std::string &platform, const std::string &props, const bool isWin32) {
- project << "\t\t<Configuration Name=\"" << config << "|" << platform << "\" ConfigurationType=\"1\" InheritedPropertySheets=\".\\" << PROJECT_DESCRIPTION << "_" << config << props << ".vsprops\">\n"
+ project << "\t\t<Configuration Name=\"" << config << "|" << platform << "\" ConfigurationType=\"1\" InheritedPropertySheets=\".\\" << setup.projectDescription << "_" << config << props << ".vsprops\">\n"
"\t\t\t<Tool\tName=\"VCCLCompilerTool\" DisableLanguageExtensions=\"false\" />\n"
- "\t\t\t<Tool\tName=\"VCLinkerTool\" OutputFile=\"$(OutDir)/" << PROJECT_NAME << ".exe\"\n"
+ "\t\t\t<Tool\tName=\"VCLinkerTool\" OutputFile=\"$(OutDir)/" << setup.projectName << ".exe\"\n"
"\t\t\t\tAdditionalDependencies=\"" << libraries << "\"\n"
"\t\t\t/>\n";
outputBuildEvents(project, setup, isWin32);
project << "\t\t</Configuration>\n";
}
-void VisualStudioProvider::outputConfiguration(std::ostream &project, const std::string &toolConfig, const std::string &config, const std::string &platform, const std::string &props) {
- project << "\t\t<Configuration Name=\"" << config << "|" << platform << "\" ConfigurationType=\"4\" InheritedPropertySheets=\".\\" << PROJECT_DESCRIPTION << "_" << config << props << ".vsprops\">\n"
+void VisualStudioProvider::outputConfiguration(const BuildSetup &setup, std::ostream &project, const std::string &toolConfig, const std::string &config, const std::string &platform, const std::string &props) {
+ project << "\t\t<Configuration Name=\"" << config << "|" << platform << "\" ConfigurationType=\"4\" InheritedPropertySheets=\".\\" << setup.projectDescription << "_" << config << props << ".vsprops\">\n"
"\t\t\t<Tool Name=\"VCCLCompilerTool\" "<< toolConfig << "/>\n"
"\t\t</Configuration>\n";
}
void VisualStudioProvider::outputBuildEvents(std::ostream &project, const BuildSetup &setup, const bool isWin32) {
- if (setup.runBuildEvents) {
+ if (!setup.devTools && setup.runBuildEvents) {
project << "\t\t\t<Tool\tName=\"VCPreBuildEventTool\"\n"
"\t\t\t\tCommandLine=\"" << getPreBuildEvent() << "\"\n"
"\t\t\t/>\n"
@@ -169,11 +169,11 @@ void VisualStudioProvider::outputBuildEvents(std::ostream &project, const BuildS
}
}
-void VisualStudioProvider::writeReferences(std::ofstream &output) {
+void VisualStudioProvider::writeReferences(const BuildSetup &setup, std::ofstream &output) {
output << "\tProjectSection(ProjectDependencies) = postProject\n";
for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
- if (i->first == PROJECT_NAME)
+ if (i->first == setup.projectName)
continue;
output << "\t\t{" << i->second << "} = {" << i->second << "}\n";
@@ -182,7 +182,7 @@ void VisualStudioProvider::writeReferences(std::ofstream &output) {
output << "\tEndProjectSection\n";
}
-void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) {
+void VisualStudioProvider::outputGlobalPropFile(const BuildSetup &setup, std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) {
std::string warnings;
for (StringList::const_iterator i = _globalWarnings.begin(); i != _globalWarnings.end(); ++i)
warnings += *i + ';';
@@ -202,17 +202,17 @@ void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int b
"<VisualStudioPropertySheet\n"
"\tProjectType=\"Visual C++\"\n"
"\tVersion=\"8.00\"\n"
- "\tName=\"" << PROJECT_DESCRIPTION << "_Global\"\n"
+ "\tName=\"" << setup.projectDescription << "_Global\"\n"
"\tOutputDirectory=\"$(ConfigurationName)" << bits << "\"\n"
"\tIntermediateDirectory=\"$(ConfigurationName)" << bits << "/$(ProjectName)\"\n"
"\t>\n"
"\t<Tool\n"
"\t\tName=\"VCCLCompilerTool\"\n"
- "\t\tDisableLanguageExtensions=\"true\"\n"
+ "\t\tDisableLanguageExtensions=\"" << (setup.devTools ? "false" : "true") << "\"\n"
"\t\tDisableSpecificWarnings=\"" << warnings << "\"\n"
"\t\tAdditionalIncludeDirectories=\"" << prefix << ";" << prefix << "\\engines;$(" << LIBS_DEFINE << ")\\include;$(TargetDir)\"\n"
"\t\tPreprocessorDefinitions=\"" << definesList << "\"\n"
- "\t\tExceptionHandling=\"0\"\n";
+ "\t\tExceptionHandling=\"" << (setup.devTools ? "1" : "0") << "\"\n";
#if NEEDS_RTTI
properties << "\t\tRuntimeTypeInfo=\"true\"\n";
@@ -231,9 +231,12 @@ void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int b
"\t<Tool\n"
"\t\tName=\"VCLinkerTool\"\n"
"\t\tIgnoreDefaultLibraryNames=\"\"\n"
- "\t\tSubSystem=\"1\"\n"
- "\t\tEntryPointSymbol=\"WinMainCRTStartup\"\n"
- "\t\tAdditionalLibraryDirectories=\"$(" << LIBS_DEFINE << ")\\lib\\" << ((bits == 32) ? "x86" : "x64") << "\"\n"
+ "\t\tSubSystem=\"1\"\n";
+
+ if (!setup.devTools)
+ properties << "\t\tEntryPointSymbol=\"WinMainCRTStartup\"\n";
+
+ properties << "\t\tAdditionalLibraryDirectories=\"$(" << LIBS_DEFINE << ")\\lib\\" << ((bits == 32) ? "x86" : "x64") << "\"\n"
"\t/>\n"
"\t<Tool\n"
"\t\tName=\"VCResourceCompilerTool\"\n"
@@ -248,16 +251,16 @@ void VisualStudioProvider::createBuildProp(const BuildSetup &setup, bool isRelea
const std::string outputType = (enableAnalysis ? "Analysis" : (isRelease ? "Release" : "Debug"));
const std::string outputBitness = (isWin32 ? "32" : "64");
- std::ofstream properties((setup.outputDir + '/' + PROJECT_DESCRIPTION "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension()).c_str());
+ std::ofstream properties((setup.outputDir + '/' + setup.projectDescription + "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension()).c_str());
if (!properties)
- error("Could not open \"" + setup.outputDir + '/' + PROJECT_DESCRIPTION "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension() + "\" for writing");
+ error("Could not open \"" + setup.outputDir + '/' + setup.projectDescription + "_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension() + "\" for writing");
properties << "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n"
"<VisualStudioPropertySheet\n"
"\tProjectType=\"Visual C++\"\n"
"\tVersion=\"8.00\"\n"
- "\tName=\"" << PROJECT_DESCRIPTION << "_" << outputType << outputBitness << "\"\n"
- "\tInheritedPropertySheets=\".\\" << PROJECT_DESCRIPTION << "_Global" << (isWin32 ? "" : "64") << ".vsprops\"\n"
+ "\tName=\"" << setup.projectDescription << "_" << outputType << outputBitness << "\"\n"
+ "\tInheritedPropertySheets=\".\\" << setup.projectDescription << "_Global" << (isWin32 ? "" : "64") << ".vsprops\"\n"
"\t>\n"
"\t<Tool\n"
"\t\tName=\"VCCLCompilerTool\"\n";
diff --git a/devtools/create_project/visualstudio.h b/devtools/create_project/visualstudio.h
index dad923e49c..845550139c 100644
--- a/devtools/create_project/visualstudio.h
+++ b/devtools/create_project/visualstudio.h
@@ -38,9 +38,9 @@ protected:
void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation,
const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix);
- void writeReferences(std::ofstream &output);
+ void writeReferences(const BuildSetup &setup, std::ofstream &output);
- void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents);
+ void outputGlobalPropFile(const BuildSetup &setup, std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents);
void createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis);
@@ -49,7 +49,7 @@ protected:
int getVisualStudioVersion();
void outputConfiguration(std::ostream &project, const BuildSetup &setup, const std::string &libraries, const std::string &config, const std::string &platform, const std::string &props, const bool isWin32);
- void outputConfiguration(std::ostream &project, const std::string &toolConfig, const std::string &config, const std::string &platform, const std::string &props);
+ void outputConfiguration(const BuildSetup &setup, std::ostream &project, const std::string &toolConfig, const std::string &config, const std::string &platform, const std::string &props);
void outputBuildEvents(std::ostream &project, const BuildSetup &setup, const bool isWin32);
};
diff --git a/devtools/create_toon/create_toon.cpp b/devtools/create_toon/create_toon.cpp
index bdd57be7df..2cf8895d4b 100644
--- a/devtools/create_toon/create_toon.cpp
+++ b/devtools/create_toon/create_toon.cpp
@@ -77,8 +77,8 @@ int main(int argc, char *argv[]) {
writeByte(outFile, TOON_DAT_VER_MAJ);
writeByte(outFile, TOON_DAT_VER_MIN);
- // game versions/variantes
- writeUint16BE(outFile, NUM_VARIANTE);
+ // game versions/variants
+ writeUint16BE(outFile, NUM_VARIANTS);
// Write locationDirNotVisited
nbrElem = sizeof(locationDirNotVisited_EN) / sizeof(char *);
@@ -128,7 +128,7 @@ int main(int argc, char *argv[]) {
nbrElem = sizeof(specialInfoLine_SP) / sizeof(char *);
writeTextArray(outFile, specialInfoLine_SP, nbrElem);
-// Not yet handled : miscTexts, endingLine and exitLine. Are they useful?
+ // Not yet handled: miscTexts, endingLine and exitLine. Are they useful?
fclose(outFile);
return 0;
@@ -160,4 +160,3 @@ void writeTextArray(FILE *outFile, const char *textArray[], int nbrText) {
fwrite(padBuf, pad, 1, outFile);
}
}
-
diff --git a/devtools/create_toon/create_toon.h b/devtools/create_toon/create_toon.h
index 60b33013f4..b047959215 100644
--- a/devtools/create_toon/create_toon.h
+++ b/devtools/create_toon/create_toon.h
@@ -30,9 +30,9 @@
#define TOON_DAT_VER_MAJ 0 // 1 byte
#define TOON_DAT_VER_MIN 3 // 1 byte
-// Number of Variante of the game. For the moment, it's the same
-// than the number of languages
-#define NUM_VARIANTE 5
+// Number of variants of the game. For the moment, it's the same
+// as the number of languages
+#define NUM_VARIANTS 5
typedef unsigned char uint8;
typedef unsigned char byte;
diff --git a/devtools/create_toon/dists/msvc9/create_toon.sln b/devtools/create_toon/dists/msvc9/create_toon.sln
deleted file mode 100644
index e9c3750590..0000000000
--- a/devtools/create_toon/dists/msvc9/create_toon.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_toon", "create_toon.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/devtools/create_toon/dists/msvc9/create_toon.vcproj b/devtools/create_toon/dists/msvc9/create_toon.vcproj
deleted file mode 100644
index f860b8b201..0000000000
--- a/devtools/create_toon/dists/msvc9/create_toon.vcproj
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="create_toon"
- ProjectGUID="{5F280130-349D-11DD-AE16-0800200C9A66}"
- RootNamespace="create_toon"
- 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_toon.exe"
- LinkIncremental="2"
- IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(OutDir)/create_toon.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_toon.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_toon.cpp"
- >
- </File>
- <File
- RelativePath="..\..\create_toon.h"
- >
- </File>
- <File
- RelativePath="..\..\staticdata.h"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/create_toon/staticdata.h b/devtools/create_toon/staticdata.h
index 2164512337..bc49c7adaf 100644
--- a/devtools/create_toon/staticdata.h
+++ b/devtools/create_toon/staticdata.h
@@ -318,4 +318,3 @@ const char *exitLine_RU = "Hope you enjoyed playing ToonStruck!!";
const char* exitLine_SP = "\255\255Esperamos que te diviertas jugando a ToonStruck!!";
#endif
-
diff --git a/devtools/credits.pl b/devtools/credits.pl
index 48ce5e28e7..5daf232b2b 100755
--- a/devtools/credits.pl
+++ b/devtools/credits.pl
@@ -444,657 +444,684 @@ sub add_paragraph {
#
begin_credits("Credits");
- begin_section("ScummVM Team");
- begin_section("Project Leaders");
- begin_persons();
- add_person("Eugene Sandulenko", "sev", "");
- end_persons();
- end_section();
-
- begin_section("Retired Project Leaders");
- begin_persons();
- add_person("James Brown", "ender", "");
- add_person("Vincent Hamm", "yaz0r", "ScummVM co-founder, Original Cruise/CinE author");
- add_person("Max Horn", "Fingolfin", "");
- add_person("Ludvig Strigeus", "ludde", "Original ScummVM and SimonVM author");
- end_persons();
- end_section();
-
- begin_section("Engine Teams");
- begin_section("SCUMM");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- add_person("James Brown", "ender", "(retired)");
- add_person("Jonathan Gray", "khalek", "(retired)");
- add_person("Vincent Hamm", "yaz0r", "(retired)");
- add_person("Max Horn", "Fingolfin", "(retired)");
- add_person("Travis Howell", "Kirben", "(retired)");
- add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "Codecs, iMUSE, Smush, etc.");
- add_person("Gregory Montoir", "cyx", "");
- add_person("Eugene Sandulenko", "sev", "FT INSANE, MM NES, MM C64, game detection, Herc/CGA");
- add_person("Ludvig Strigeus", "ludde", "(retired)");
- end_section();
-
- begin_section("HE");
- add_person("Jonathan Gray", "khalek", "(retired)");
- add_person("Travis Howell", "Kirben", "(retired)");
- add_person("Gregory Montoir", "cyx", "");
- add_person("Eugene Sandulenko", "sev", "");
- end_section();
-
- begin_section("AGI");
- add_person("Stuart George", "darkfiber", "");
- add_person("Matthew Hoops", "clone2727", "");
- add_person("Filippos Karapetis", "[md5]", "");
- add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "");
- add_person("Walter van Niftrik", "waltervn", "");
- add_person("Kari Salminen", "Buddha^", "");
- add_person("Eugene Sandulenko", "sev", "");
- add_person("David Symonds", "dsymonds", "(retired)");
- end_section();
-
- begin_section("AGOS");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- add_person("Paul Gilbert", "dreammaster", "");
- add_person("Travis Howell", "Kirben", "(retired)");
- add_person("Oliver Kiehl", "olki", "(retired)");
- add_person("Ludvig Strigeus", "ludde", "(retired)");
- end_section();
-
- begin_section("Cine");
- add_person("Vincent Hamm", "yaz0r", "(retired)");
- add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "");
- add_person("Gregory Montoir", "cyx", "");
- add_person("Kari Salminen", "Buddha^", "");
- add_person("Eugene Sandulenko", "sev", "");
- end_section();
-
- begin_section("CruisE");
- add_person("Paul Gilbert", "dreammaster", "");
- add_person("Vincent Hamm", "yaz0r", "(retired)");
- end_section();
-
- begin_section("Draci");
- add_person("Denis Kasak", "dkasak13", "");
- add_person("Robert &Scaron;palek", "spalek", "");
- end_section();
-
- begin_section("Drascula");
- add_person("Filippos Karapetis", "[md5]", "");
- add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "");
- end_section();
-
- begin_section("DreamWeb");
- add_person("Vladimir Menshakov", "whoozle", "");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- end_section();
-
- begin_section("Gob");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
- add_person("Sven Hesse", "DrMcCoy", "");
- add_person("Eugene Sandulenko", "sev", "");
- end_section();
-
- begin_section("Groovie");
- add_person("Henry Bush", "spookypeanut", "");
- add_person("Scott Thomas", "ST", "");
- add_person("Jordi Vilalta Prat", "jvprat", "");
- end_section();
-
- begin_section("Hugo");
- add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
- add_person("Oystein Eftevaag", "vinterstum", "");
- add_person("Eugene Sandulenko", "sev", "");
- end_section();
-
- begin_section("Kyra");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "VQA Player");
- add_person("Oystein Eftevaag", "vinterstum", "");
- add_person("Florian Kagerer", "athrxx", "");
- add_person("Gregory Montoir", "cyx", "");
- add_person("Johannes Schickel", "LordHoto", "");
- end_section();
-
- begin_section("Lastexpress");
- add_person("Matthew Hoops", "clone2727", "");
- add_person("Jordi Vilalta Prat", "jvprat", "");
- add_person("Julien Templier", "littleboy", "");
- end_section();
+ begin_section("ScummVM Team");
+ begin_section("Project Leader");
+ begin_persons();
+ add_person("Eugene Sandulenko", "sev", "");
+ end_persons();
+ end_section();
- begin_section("Lure");
- add_person("Paul Gilbert", "dreammaster", "");
- end_section();
-
- begin_section("M4");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- add_person("Paul Gilbert", "dreammaster", "");
- add_person("Benjamin Haisch", "john_doe", "");
- add_person("Filippos Karapetis", "[md5]", "");
- end_section();
-
- begin_section("MADE");
- add_person("Benjamin Haisch", "john_doe", "");
- add_person("Filippos Karapetis", "[md5]", "");
- end_section();
-
- begin_section("Mohawk");
- add_person("Bastien Bouclet", "bgk", "");
- add_person("Matthew Hoops", "clone2727", "");
- add_person("Filippos Karapetis", "[md5]", "");
- add_person("Alyssa Milburn", "fuzzie", "");
- add_person("Eugene Sandulenko", "sev", "");
- add_person("David Turner", "digitall", "");
- end_section();
-
- begin_section("Parallaction");
- add_person("", "peres", "");
- end_section();
-
- begin_section("Queen");
- add_person("David Eriksson", "twogood", "(retired)");
- add_person("Gregory Montoir", "cyx", "");
- add_person("Joost Peters", "joostp", "");
- end_section();
-
- begin_section("SAGA");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- add_person("Filippos Karapetis", "[md5]", "");
- add_person("Andrew Kurushin", "ajax16384", "");
- add_person("Eugene Sandulenko", "sev", "");
- end_section();
-
- begin_section("SCI");
- add_person("Greg Frieger", "_FRG_", "");
- add_person("Paul Gilbert", "dreammaster", "");
- add_person("Max Horn", "Fingolfin", "(retired)");
- add_person("Filippos Karapetis", "[md5]", "");
- add_person("Martin Kiewitz", "m_kiewitz", "");
- add_person("Walter van Niftrik", "waltervn", "");
- add_person("Willem Jan Palenstijn", "wjp", "");
- add_person("Jordi Vilalta Prat", "jvprat", "");
- add_person("Lars Skovlund", "lskovlun", "");
- end_section();
-
- begin_section("Sky");
- add_person("Robert G&ouml;ffringmann", "lavosspawn", "(retired)");
- add_person("Oliver Kiehl", "olki", "(retired)");
- add_person("Joost Peters", "joostp", "");
- end_section();
-
- begin_section("Sword1");
- add_person("Fabio Battaglia", "Hkz", "PSX version support");
- add_person("Thierry Crozat", "criezy", "Mac version support");
- add_person("Robert G&ouml;ffringmann", "lavosspawn", "(retired)");
- end_section();
-
- begin_section("Sword2");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- add_person("Fabio Battaglia", "Hkz", "PSX version support");
- add_person("Jonathan Gray", "khalek", "(retired)");
- end_section();
-
- begin_section("Sword25");
- add_person("Eugene Sandulenko", "sev", "");
- add_person("Filippos Karapetis", "[md5]", "");
- add_person("Max Horn", "Fingolfin", "(retired)");
- add_person("Paul Gilbert", "dreammaster", "");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- end_section();
-
- begin_section("TeenAgent");
- add_person("Robert Megone", "sanguine", "Help with callback rewriting");
- add_person("Vladimir Menshakov", "whoozle", "");
- end_section();
-
-
- begin_section("Tinsel");
- add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
- add_person("Fabio Battaglia", "Hkz", "PSX version support");
- add_person("Paul Gilbert", "dreammaster", "");
- add_person("Sven Hesse", "DrMcCoy", "");
- add_person("Max Horn", "Fingolfin", "(retired)");
- add_person("Filippos Karapetis", "[md5]", "");
- add_person("Joost Peters", "joostp", "");
- end_section();
-
- begin_section("Toon");
- add_person("Sylvain Dupont", "SylvainTV", "");
- end_section();
-
- begin_section("Touch&eacute;");
- add_person("Gregory Montoir", "cyx", "");
- end_section();
-
- begin_section("TsAGE");
- add_person("Paul Gilbert", "dreammaster", "");
- add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
- end_section();
-
- begin_section("Tucker");
- add_person("Gregory Montoir", "cyx", "");
- end_section();
-
- end_section();
-
-
- begin_section("Backend Teams");
- begin_section("Android");
- add_person("Andre Heider", "dhewg", "");
- add_person("Angus Lees", "Gus", "");
- end_section();
-
- begin_section("Dreamcast");
- add_person("Marcus Comstedt", "", "");
- end_section();
-
- begin_section("GPH Devices (GP2X, GP2XWiz &amp; Caanoo)");
- add_person("John Willis", "DJWillis", "");
- end_section();
-
- begin_section("iPhone");
- add_person("Oystein Eftevaag", "vinterstum", "");
- end_section();
-
- begin_section("LinuxMoto");
- add_person("Lubomyr Lisen", "", "");
- end_section();
-
- begin_section("Maemo");
- add_person("Frantisek Dufka", "fanoush", "");
- end_section();
-
- begin_section("Nintendo 64");
- add_person("Fabio Battaglia", "Hkz", "");
- end_section();
-
- begin_section("Nintendo DS");
- add_person("Neil Millstone", "agent-q", "");
- end_section();
-
- begin_section("OpenPandora");
- add_person("John Willis", "DJWillis", "");
- end_section();
-
- begin_section("PocketPC / WinCE");
- add_person("Nicolas Bacca", "arisme", "(retired)");
- add_person("Ismail Khatib", "CeRiAl", "");
- add_person("Kostas Nakos", "Jubanka", "(retired)");
- end_section();
-
- begin_section("PlayStation 2");
- add_person("Robert G&ouml;ffringmann", "lavosspawn", "(retired)");
- add_person("Max Lingua", "sunmax", "");
- end_section();
-
- begin_section("PSP (PlayStation Portable)");
- add_person("Joost Peters", "joostp", "");
- add_person("Yotam Barnoy", "bluddy", "");
- end_section();
-
- begin_section("SDL (Win/Linux/OS X/etc.)");
- add_person("Max Horn", "Fingolfin", "(retired)");
- add_person("Eugene Sandulenko", "sev", "Asm routines, GFX layers");
- end_section();
-
- begin_section("SymbianOS");
- add_person("Jurgen Braam", "SumthinWicked", "");
- add_person("Lars Persson", "AnotherGuest", "");
- end_section();
-
- begin_section("WebOS");
- add_person("Klaus Reimer", "kayahr", "");
- end_section();
-
- begin_section("Wii");
- add_person("Andre Heider", "dhewg", "");
- end_section();
-
- end_section();
-
- begin_section("Other subsystems");
- begin_section("Infrastructure");
- add_person("Max Horn", "Fingolfin", "Backend &amp; Engine APIs, file API, sound mixer, audiostreams, data structures, etc. (retired)");
- add_person("Eugene Sandulenko", "sev", "");
- add_person("Johannes Schickel", "LordHoto", "");
- end_section();
-
- begin_section("GUI");
- add_person("Vicent Marti", "tanoku", "");
- add_person("Eugene Sandulenko", "sev", "");
- add_person("Johannes Schickel", "LordHoto", "");
- end_section();
-
- begin_section("Miscellaneous");
- add_person("David Corrales-Lopez", "david_corrales", "Filesystem access improvements (GSoC 2007 task) (retired)");
- add_person("Jerome Fisher", "KingGuppy", "MT-32 emulator");
- add_person("Benjamin Haisch", "john_doe", "Heavily improved de-/encoder for DXA videos");
- add_person("Jochen Hoenicke", "hoenicke", "Speaker &amp; PCjr sound support, AdLib work (retired)");
- add_person("Chris Page", "cp88", "Return to launcher, savestate improvements, leak fixes, ... (GSoC 2008 task) (retired)");
- add_person("Robin Watts", "robinwatts", "ARM assembly routines for nice speedups on several ports; improvements to the sound mixer");
- end_section();
- end_section();
-
- begin_section("Website (code)");
- begin_persons();
- add_person("Fredrik Wendel", "", "(retired)");
- end_persons();
- end_section();
-
- begin_section("Website (maintenance)");
- begin_persons();
- add_person("James Brown", "Ender", "IRC Logs maintainer");
- add_person("Thierry Crozat", "criezy", "Wiki maintainer");
- add_person("Andre Heider", "dhewg", "Buildbot maintainer");
- add_person("Joost Peters", "JoostP", "Doxygen Project Documentation maintainer");
- add_person("Jordi Vilalta Prat", "jvprat", "Wiki maintainer");
- add_person("Eugene Sandulenko", "sev", "Forum, IRC channel, Screen Shots and Mailing list maintainer");
- add_person("John Willis", "DJWillis", "");
- end_persons();
- end_section();
-
- begin_section("Website (content)");
- add_paragraph("All active team members");
- end_section();
-
- begin_section("Documentation");
- begin_persons();
- add_person("Thierry Crozat", "criezy", "Numerous contributions to documentation");
- add_person("Joachim Eberhard", "joachimeberhard", "Numerous contributions to documentation (retired)");
- add_person("Matthew Hoops", "clone2727", "Wiki editor");
- end_persons();
- end_section();
-
- begin_section("Retired Team Members");
- begin_persons();
- add_person("Chris Apers", "chrilith ", "Former PalmOS porter");
- add_person("Ralph Brorsen", "painelf", "Help with GUI implementation");
- add_person("Jamieson Christian", "jamieson630", "iMUSE, MIDI, all things musical");
- add_person("Felix Jakschitsch", "yot", "Zak256 reverse engineering");
- add_person("Mutwin Kraus", "mutle", "Original MacOS porter");
- add_person("Peter Moraliyski", "ph0x", "Port: GP32");
- add_person("Jeremy Newman", "laxdragon", "Former webmaster");
- add_person("Lionel Ulmer", "bbrox", "Port: X11");
- add_person("Won Star", "wonst719", "Former GP32 porter");
- end_persons();
- end_section();
- end_section();
-
-
- begin_section("Other contributions");
-
- begin_section("Packages");
- begin_section("AmigaOS 4");
- add_person("Hans-J&ouml;rg Frieden", "", "(retired)");
- add_person("Hubert Maier", "Raziel_AOne", "");
- add_person("Juha Niemim&auml;ki", "", "(retired)");
- end_section();
-
- begin_section("Atari/FreeMiNT");
- add_person("Keith Scroggins", "KeithS", "");
- end_section();
-
- begin_section("BeOS");
- add_person("Stefan Parviainen", "", "");
- add_person("Luc Schrijvers", "Begasus", "");
- end_section();
-
- begin_section("Debian GNU/Linux");
- add_person("Tore Anderson", "tore", "(retired)");
- add_person("David Weinehall", "tao", "");
- end_section();
-
- begin_section("Fedora / RedHat");
- add_person("Willem Jan Palenstijn", "wjp", "");
- end_section();
-
- begin_section("Mac OS X");
- add_person("Max Horn", "Fingolfin", "(retired)");
- add_person("Oystein Eftevaag", "vinterstum", "");
- end_section();
-
- begin_section("Mandriva");
- add_person("Dominik Scherer", "", "(retired)");
- end_section();
-
- begin_section("MorphOS");
- add_person("Fabien Coeurjoly", "fab1", "");
- add_person("R&uuml;diger Hanke", "", "(retired)");
- end_section();
-
- begin_section("OS/2");
- add_person("Paul Smedley", "Creeping", "");
- end_section();
-
- begin_section("SlackWare");
- add_person("Robert Kelsen", "", "");
- end_section();
-
- begin_section("Solaris x86");
- add_person("Laurent Blume", "laurent", "");
- end_section();
-
- begin_section("Solaris SPARC");
- add_person("Markus Strangl", "WooShell", "");
- end_section();
-
- begin_section("Win32");
- add_person("Travis Howell", "Kirben", "(retired)");
- end_section();
-
- begin_section("Win64");
- add_person("Chris Gray", "Psychoid", "(retired)");
- add_person("Johannes Schickel", "LordHoto", "");
- end_section();
- end_section();
+ begin_section("PR Office");
+ begin_persons();
+ add_person("Arnaud Boutonn&eacute;", "Strangerke", "Public Relations Officer, Project Administrator");
+ add_person("Eugene Sandulenko", "sev", "Project Leader");
+ end_persons();
+ end_section();
- begin_section("Translations");
- begin_persons();
- add_person("Thierry Crozat", "criezy", "Translation Lead");
- end_persons();
- begin_section("Catalan");
- add_person("Jordi Vilalta Prat", "jvprat", "");
+ begin_section("Core Team");
+ begin_persons();
+ add_person("Willem Jan Palenstijn", "wjp", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ add_person("Johannes Schickel", "LordHoto", "");
+ end_persons();
end_section();
- begin_section("Czech");
- add_person("Zbyn&igrave;k Schwarz", "", "");
+
+ begin_section("Retired Project Leaders");
+ begin_persons();
+ add_person("James Brown", "ender", "");
+ add_person("Vincent Hamm", "yaz0r", "ScummVM co-founder, Original Cruise/CinE author");
+ add_person("Max Horn", "Fingolfin", "");
+ add_person("Ludvig Strigeus", "ludde", "Original ScummVM and SimonVM author");
+ end_persons();
end_section();
- begin_section("Danish");
- add_person("Steffen Nyeland", "", "");
+
+ begin_section("Engine Teams");
+ begin_section("SCUMM");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("James Brown", "ender", "(retired)");
+ add_person("Jonathan Gray", "khalek", "(retired)");
+ add_person("Vincent Hamm", "yaz0r", "(retired)");
+ add_person("Max Horn", "Fingolfin", "(retired)");
+ add_person("Travis Howell", "Kirben", "");
+ add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "Codecs, iMUSE, Smush, etc.");
+ add_person("Gregory Montoir", "cyx", "");
+ add_person("Eugene Sandulenko", "sev", "FT INSANE, MM NES, MM C64, game detection, Herc/CGA");
+ add_person("Ludvig Strigeus", "ludde", "(retired)");
+ end_section();
+
+ begin_section("HE");
+ add_person("Jonathan Gray", "khalek", "(retired)");
+ add_person("Travis Howell", "Kirben", "");
+ add_person("Gregory Montoir", "cyx", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ end_section();
+
+ begin_section("AGI");
+ add_person("Stuart George", "darkfiber", "");
+ add_person("Matthew Hoops", "clone2727", "");
+ add_person("Filippos Karapetis", "[md5]", "");
+ add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "");
+ add_person("Walter van Niftrik", "waltervn", "(retired)");
+ add_person("Kari Salminen", "Buddha^", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ add_person("David Symonds", "dsymonds", "(retired)");
+ end_section();
+
+ begin_section("AGOS");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ add_person("Travis Howell", "Kirben", "");
+ add_person("Oliver Kiehl", "olki", "(retired)");
+ add_person("Ludvig Strigeus", "ludde", "(retired)");
+ end_section();
+
+ begin_section("CGE");
+ add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ end_section();
+
+ begin_section("Cine");
+ add_person("Vincent Hamm", "yaz0r", "(retired)");
+ add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "");
+ add_person("Gregory Montoir", "cyx", "");
+ add_person("Kari Salminen", "Buddha^", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ end_section();
+
+ begin_section("CruisE");
+ add_person("Paul Gilbert", "dreammaster", "");
+ add_person("Vincent Hamm", "yaz0r", "(retired)");
+ end_section();
+
+ begin_section("Draci");
+ add_person("Denis Kasak", "dkasak13", "");
+ add_person("Robert &Scaron;palek", "spalek", "");
+ end_section();
+
+ begin_section("Drascula");
+ add_person("Filippos Karapetis", "[md5]", "");
+ add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "");
+ end_section();
+
+ begin_section("DreamWeb");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Bertrand Augereau", "Tramb", "");
+ add_person("Vladimir Menshakov", "whoozle", "");
+ end_section();
+
+ begin_section("Gob");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
+ add_person("Sven Hesse", "DrMcCoy", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ end_section();
+
+ begin_section("Groovie");
+ add_person("Henry Bush", "spookypeanut", "");
+ add_person("Scott Thomas", "ST", "");
+ add_person("Jordi Vilalta Prat", "jvprat", "");
+ end_section();
+
+ begin_section("Hugo");
+ add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
+ add_person("Oystein Eftevaag", "vinterstum", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ end_section();
+
+ begin_section("Kyra");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "VQA Player");
+ add_person("Oystein Eftevaag", "vinterstum", "");
+ add_person("Florian Kagerer", "athrxx", "");
+ add_person("Gregory Montoir", "cyx", "");
+ add_person("Johannes Schickel", "LordHoto", "");
+ end_section();
+
+ begin_section("Lastexpress");
+ add_person("Matthew Hoops", "clone2727", "");
+ add_person("Jordi Vilalta Prat", "jvprat", "");
+ add_person("Julien Templier", "littleboy", "");
+ end_section();
+
+ begin_section("Lure");
+ add_person("Paul Gilbert", "dreammaster", "");
+ end_section();
+
+ begin_section("M4");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ add_person("Benjamin Haisch", "john_doe", "");
+ add_person("Filippos Karapetis", "[md5]", "");
+ end_section();
+
+ begin_section("MADE");
+ add_person("Benjamin Haisch", "john_doe", "");
+ add_person("Filippos Karapetis", "[md5]", "");
+ end_section();
+
+ begin_section("Mohawk");
+ add_person("Bastien Bouclet", "bgk", "");
+ add_person("Matthew Hoops", "clone2727", "");
+ add_person("Filippos Karapetis", "[md5]", "");
+ add_person("Alyssa Milburn", "fuzzie", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ add_person("David Turner", "digitall", "");
+ end_section();
+
+ begin_section("Parallaction");
+ add_person("", "peres", "");
+ end_section();
+
+ begin_section("Queen");
+ add_person("David Eriksson", "twogood", "(retired)");
+ add_person("Gregory Montoir", "cyx", "");
+ add_person("Joost Peters", "joostp", "");
+ end_section();
+
+ begin_section("SAGA");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Filippos Karapetis", "[md5]", "");
+ add_person("Andrew Kurushin", "ajax16384", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ end_section();
+
+ begin_section("SCI");
+ add_person("Greg Frieger", "_FRG_", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ add_person("Max Horn", "Fingolfin", "(retired)");
+ add_person("Filippos Karapetis", "[md5]", "");
+ add_person("Martin Kiewitz", "m_kiewitz", "");
+ add_person("Walter van Niftrik", "waltervn", "(retired)");
+ add_person("Willem Jan Palenstijn", "wjp", "");
+ add_person("Jordi Vilalta Prat", "jvprat", "");
+ add_person("Lars Skovlund", "lskovlun", "");
+ end_section();
+
+ begin_section("Sky");
+ add_person("Robert G&ouml;ffringmann", "lavosspawn", "(retired)");
+ add_person("Oliver Kiehl", "olki", "(retired)");
+ add_person("Joost Peters", "joostp", "");
+ end_section();
+
+ begin_section("Sword1");
+ add_person("Fabio Battaglia", "Hkz", "PSX version support");
+ add_person("Thierry Crozat", "criezy", "Mac version support");
+ add_person("Robert G&ouml;ffringmann", "lavosspawn", "(retired)");
+ end_section();
+
+ begin_section("Sword2");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Fabio Battaglia", "Hkz", "PSX version support");
+ add_person("Jonathan Gray", "khalek", "(retired)");
+ end_section();
+
+ begin_section("Sword25");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ add_person("Max Horn", "Fingolfin", "(retired)");
+ add_person("Filippos Karapetis", "[md5]", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ end_section();
+
+ begin_section("TeenAgent");
+ add_person("Robert Megone", "sanguine", "Help with callback rewriting");
+ add_person("Vladimir Menshakov", "whoozle", "");
+ end_section();
+
+ begin_section("Tinsel");
+ add_person("Torbj&ouml;rn Andersson", "eriktorbjorn", "");
+ add_person("Fabio Battaglia", "Hkz", "PSX version support");
+ add_person("Paul Gilbert", "dreammaster", "");
+ add_person("Sven Hesse", "DrMcCoy", "");
+ add_person("Max Horn", "Fingolfin", "(retired)");
+ add_person("Filippos Karapetis", "[md5]", "");
+ add_person("Joost Peters", "joostp", "");
+ end_section();
+
+ begin_section("Toon");
+ add_person("Sylvain Dupont", "SylvainTV", "");
+ end_section();
+
+ begin_section("Touch&eacute;");
+ add_person("Gregory Montoir", "cyx", "");
+ end_section();
+
+ begin_section("TsAGE");
+ add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ end_section();
+
+ begin_section("Tucker");
+ add_person("Gregory Montoir", "cyx", "");
+ end_section();
+
end_section();
- begin_section("French");
- add_person("Thierry Crozat", "criezy", "");
+
+
+ begin_section("Backend Teams");
+ begin_section("Android");
+ add_person("Andre Heider", "dhewg", "");
+ add_person("Angus Lees", "Gus", "");
+ end_section();
+
+ begin_section("BADA");
+ add_person("Chris Warren-Smith", "", "");
+ end_section();
+
+ begin_section("Dreamcast");
+ add_person("Marcus Comstedt", "", "");
+ end_section();
+
+ begin_section("GPH Devices (GP2X, GP2XWiz &amp; Caanoo)");
+ add_person("John Willis", "DJWillis", "");
+ end_section();
+
+ begin_section("iPhone");
+ add_person("Oystein Eftevaag", "vinterstum", "");
+ end_section();
+
+ begin_section("LinuxMoto");
+ add_person("Lubomyr Lisen", "", "");
+ end_section();
+
+ begin_section("Maemo");
+ add_person("Frantisek Dufka", "fanoush", "(retired)");
+ add_person("Tarek Soliman", "tsoliman", "");
+ end_section();
+
+ begin_section("Nintendo 64");
+ add_person("Fabio Battaglia", "Hkz", "");
+ end_section();
+
+ begin_section("Nintendo DS");
+ add_person("Bertrand Augereau", "Tramb", "HQ software scaler");
+ add_person("Neil Millstone", "agent-q", "");
+ end_section();
+
+ begin_section("OpenPandora");
+ add_person("John Willis", "DJWillis", "");
+ end_section();
+
+ begin_section("PocketPC / WinCE");
+ add_person("Nicolas Bacca", "arisme", "(retired)");
+ add_person("Ismail Khatib", "CeRiAl", "");
+ add_person("Kostas Nakos", "Jubanka", "(retired)");
+ end_section();
+
+ begin_section("PlayStation 2");
+ add_person("Robert G&ouml;ffringmann", "lavosspawn", "(retired)");
+ add_person("Max Lingua", "sunmax", "");
+ end_section();
+
+ begin_section("PSP (PlayStation Portable)");
+ add_person("Yotam Barnoy", "bluddy", "");
+ add_person("Joost Peters", "joostp", "");
+ end_section();
+
+ begin_section("SDL (Win/Linux/OS X/etc.)");
+ add_person("Max Horn", "Fingolfin", "(retired)");
+ add_person("Eugene Sandulenko", "sev", "Asm routines, GFX layers");
+ end_section();
+
+ begin_section("SymbianOS");
+ add_person("Jurgen Braam", "SumthinWicked", "");
+ add_person("Lars Persson", "AnotherGuest", "");
+ end_section();
+
+ begin_section("WebOS");
+ add_person("Klaus Reimer", "kayahr", "");
+ end_section();
+
+ begin_section("Wii");
+ add_person("Andre Heider", "dhewg", "");
+ end_section();
+
end_section();
- begin_section("German");
- add_person("Simon Sawatzki", "SimSaw", "");
- add_person("Lothar Serra Mari", "Lothar93", "");
+
+ begin_section("Other subsystems");
+ begin_section("Infrastructure");
+ add_person("Max Horn", "Fingolfin", "Backend &amp; Engine APIs, file API, sound mixer, audiostreams, data structures, etc. (retired)");
+ add_person("Eugene Sandulenko", "sev", "");
+ add_person("Johannes Schickel", "LordHoto", "");
+ end_section();
+
+ begin_section("GUI");
+ add_person("Vicent Marti", "tanoku", "");
+ add_person("Eugene Sandulenko", "sev", "");
+ add_person("Johannes Schickel", "LordHoto", "");
+ end_section();
+
+ begin_section("Miscellaneous");
+ add_person("David Corrales-Lopez", "david_corrales", "Filesystem access improvements (GSoC 2007 task) (retired)");
+ add_person("Jerome Fisher", "KingGuppy", "MT-32 emulator");
+ add_person("Benjamin Haisch", "john_doe", "Heavily improved de-/encoder for DXA videos");
+ add_person("Jochen Hoenicke", "hoenicke", "Speaker &amp; PCjr sound support, AdLib work (retired)");
+ add_person("Chris Page", "cp88", "Return to launcher, savestate improvements, leak fixes, ... (GSoC 2008 task) (retired)");
+ add_person("Robin Watts", "robinwatts", "ARM assembly routines for nice speedups on several ports; improvements to the sound mixer");
+ end_section();
end_section();
- begin_section("Hungarian");
- add_person("Alex Bevilacqua", "", "");
- add_person("George Kormendi", "GoodOldGeorg", "");
+
+ begin_section("Website (code)");
+ begin_persons();
+ add_person("Fredrik Wendel", "", "(retired)");
+ end_persons();
end_section();
- begin_section("Italian");
- add_person("Matteo Angelino", "Maff", "");
+
+ begin_section("Website (maintenance)");
+ begin_persons();
+ add_person("James Brown", "Ender", "IRC Logs maintainer");
+ add_person("Thierry Crozat", "criezy", "Wiki maintainer");
+ add_person("Andre Heider", "dhewg", "Buildbot maintainer");
+ add_person("Joost Peters", "JoostP", "Doxygen Project Documentation maintainer");
+ add_person("Jordi Vilalta Prat", "jvprat", "Wiki maintainer");
+ add_person("Eugene Sandulenko", "sev", "Forum, IRC channel, Screen Shots and Mailing list maintainer");
+ add_person("John Willis", "DJWillis", "");
+ end_persons();
end_section();
- begin_section("Norwegian (Bokm&aring;l)");
- add_person("Einar Johan T. S&oslash;m&aring;en", "", "");
+
+ begin_section("Website (content)");
+ add_paragraph("All active team members");
end_section();
- begin_section("Norwegian (Nynorsk)");
- add_person("Einar Johan T. S&oslash;m&aring;en", "", "");
+
+ begin_section("Documentation");
+ begin_persons();
+ add_person("Thierry Crozat", "criezy", "Numerous contributions to documentation");
+ add_person("Joachim Eberhard", "joachimeberhard", "Numerous contributions to documentation (retired)");
+ add_person("Matthew Hoops", "clone2727", "Wiki editor");
+ end_persons();
end_section();
- begin_section("Polish");
- add_person("GrajPoPolsku.pl Team", "", "");
+
+ begin_section("Retired Team Members");
+ begin_persons();
+ add_person("Chris Apers", "chrilith ", "Former PalmOS porter");
+ add_person("Ralph Brorsen", "painelf", "Help with GUI implementation");
+ add_person("Jamieson Christian", "jamieson630", "iMUSE, MIDI, all things musical");
+ add_person("Felix Jakschitsch", "yot", "Zak256 reverse engineering");
+ add_person("Mutwin Kraus", "mutle", "Original MacOS porter");
+ add_person("Peter Moraliyski", "ph0x", "Port: GP32");
+ add_person("Jeremy Newman", "laxdragon", "Former webmaster");
+ add_person("Lionel Ulmer", "bbrox", "Port: X11");
+ add_person("Won Star", "wonst719", "Former GP32 porter");
+ end_persons();
end_section();
- begin_section("Brazilian Portuguese");
- add_person("ScummBR Team", "", "");
+ end_section();
+
+
+ begin_section("Other contributions");
+
+ begin_section("Packages");
+ begin_section("AmigaOS 4");
+ add_person("Hans-J&ouml;rg Frieden", "", "(retired)");
+ add_person("Hubert Maier", "Raziel_AOne", "");
+ add_person("Juha Niemim&auml;ki", "", "(retired)");
+ end_section();
+
+ begin_section("Atari/FreeMiNT");
+ add_person("Keith Scroggins", "KeithS", "");
+ end_section();
+
+ begin_section("BeOS");
+ add_person("Stefan Parviainen", "", "");
+ add_person("Luc Schrijvers", "Begasus", "");
+ end_section();
+
+ begin_section("Debian GNU/Linux");
+ add_person("Tore Anderson", "tore", "(retired)");
+ add_person("David Weinehall", "tao", "");
+ end_section();
+
+ begin_section("Fedora / RedHat");
+ add_person("Willem Jan Palenstijn", "wjp", "");
+ end_section();
+
+ begin_section("Mac OS X");
+ add_person("Max Horn", "Fingolfin", "(retired)");
+ add_person("Oystein Eftevaag", "vinterstum", "");
+ end_section();
+
+ begin_section("Mandriva");
+ add_person("Dominik Scherer", "", "(retired)");
+ end_section();
+
+ begin_section("MorphOS");
+ add_person("Fabien Coeurjoly", "fab1", "");
+ add_person("R&uuml;diger Hanke", "", "(retired)");
+ end_section();
+
+ begin_section("OS/2");
+ add_person("Paul Smedley", "Creeping", "");
+ end_section();
+
+ begin_section("SlackWare");
+ add_person("Robert Kelsen", "", "");
+ end_section();
+
+ begin_section("Solaris x86");
+ add_person("Laurent Blume", "laurent", "");
+ end_section();
+
+ begin_section("Solaris SPARC");
+ add_person("Markus Strangl", "WooShell", "");
+ end_section();
+
+ begin_section("Win32");
+ add_person("Travis Howell", "Kirben", "");
+ end_section();
+
+ begin_section("Win64");
+ add_person("Chris Gray", "Psychoid", "(retired)");
+ add_person("Johannes Schickel", "LordHoto", "");
+ end_section();
end_section();
- begin_section("Russian");
- add_person("Eugene Sandulenko", "sev", "");
+
+ begin_section("Translations");
+ begin_persons();
+ add_person("Thierry Crozat", "criezy", "Translation Lead");
+ end_persons();
+ begin_section("Catalan");
+ add_person("Jordi Vilalta Prat", "jvprat", "");
+ end_section();
+ begin_section("Czech");
+ add_person("Zbyn&igrave;k Schwarz", "", "");
+ end_section();
+ begin_section("Danish");
+ add_person("Steffen Nyeland", "", "");
+ end_section();
+ begin_section("French");
+ add_person("Thierry Crozat", "criezy", "");
+ end_section();
+ begin_section("German");
+ add_person("Simon Sawatzki", "SimSaw", "");
+ add_person("Lothar Serra Mari", "Lothar93", "");
+ end_section();
+ begin_section("Hungarian");
+ add_person("Alex Bevilacqua", "", "");
+ add_person("George Kormendi", "GoodOldGeorg", "");
+ end_section();
+ begin_section("Italian");
+ add_person("Matteo Angelino", "Maff", "");
+ end_section();
+ begin_section("Norwegian (Bokm&aring;l)");
+ add_person("Einar Johan T. S&oslash;m&aring;en", "", "");
+ end_section();
+ begin_section("Norwegian (Nynorsk)");
+ add_person("Einar Johan T. S&oslash;m&aring;en", "", "");
+ end_section();
+ begin_section("Polish");
+ add_person("GrajPoPolsku.pl Team", "", "");
+ end_section();
+ begin_section("Brazilian Portuguese");
+ add_person("ScummBR Team", "", "");
+ end_section();
+ begin_section("Russian");
+ add_person("Eugene Sandulenko", "sev", "");
+ end_section();
+ begin_section("Spanish");
+ add_person("Tom&aacute;s Maidagan", "", "");
+ add_person("Jordi Vilalta Prat", "jvprat", "");
+ end_section();
+ begin_section("Swedish");
+ add_person("Hampus Flink", "", "");
+ end_section();
+ begin_section("Ukrainian");
+ add_person("Lubomyr Lisen", "", "");
+ end_section();
end_section();
- begin_section("Spanish");
- add_person("Tom&aacute;s Maidagan", "", "");
+
+ begin_section("Websites (design)");
+ begin_persons();
+ add_person("Dob&oacute; Bal&aacute;zs", "draven", "Website design");
+ add_person("William Claydon", "billwashere", "Skins for doxygen, buildbot and wiki");
+ add_person("Yaroslav Fedevych", "jafd", "HTML/CSS for the website");
+ add_person("Jean Marc Gimenez", "", "ScummVM logo");
+ add_person("David Jensen", "Tyst", "SVG logo conversion");
+ add_person("", "Raina", "ScummVM forum buttons");
+ end_persons();
end_section();
- begin_section("Swedish");
- add_person("Hampus Flink", "", "");
+
+ begin_section("Code contributions");
+ begin_persons();
+ add_person("Ori Avtalion", "salty-horse", "Subtitle control options in the GUI; BASS GUI fixes");
+ add_person("Stuart Caie", "", "Decoders for Amiga and AtariST data files (AGOS engine)");
+ add_person("Paolo Costabel", "", "PSP port contributions");
+ add_person("Martin Doucha", "next_ghost", "CinE engine objectification");
+ add_person("Thomas Fach-Pedersen", "madmoose", "ProTracker module player, Smacker video decoder");
+ add_person("Tobias Gunkel", "hennymcc", "Sound support for C64 version of MM/Zak, Loom PCE support");
+ add_person("Janne Huttunen", "", "V3 actor mask support, Dig/FT SMUSH audio");
+ add_person("Kov&aacute;cs Endre J&aacute;nos", "", "Several fixes for Simon1");
+ add_person("Jeroen Janssen", "japj", "Numerous readability and bugfix patches");
+ add_person("Andreas Karlsson", "Sprawl", "Initial port for SymbianOS");
+ add_person("Claudio Matsuoka", "", "Daily Linux builds");
+ add_person("Thomas Mayer", "", "PSP port contributions");
+ add_person("Sean Murray", "lightcast", "ScummVM tools GUI application (GSoC 2007 task)");
+ add_person("", "n0p", "Windows CE port aspect ratio correction scaler and right click input method");
+ add_person("Mikesch Nepomuk", "mnepomuk", "MI1 VGA floppy patches");
+ add_person("Nicolas Noble", "pixels", "Config file and ALSA support");
+ add_person("Tim Phillips", "realmz", "Initial MI1 CD music support");
+ add_person("", "Quietust", "Sound support for Amiga SCUMM V2/V3 games, MM NES support");
+ add_person("Robert Crossfield", "segra", "Improved support for Apple II/C64 versions of MM");
+ add_person("Andreas R&ouml;ver", "", "Broken Sword I &amp; II MPEG2 cutscene support");
+ add_person("Edward Rudd", "urkle", "Fixes for playing MP3 versions of MI1/Loom audio");
+ add_person("Daniel Schepler", "dschepler", "Final MI1 CD music support, initial Ogg Vorbis support");
+ add_person("Andr&eacute; Souza", "luke_br", "SDL-based OpenGL renderer");
+ end_persons();
end_section();
- begin_section("Ukrainian");
- add_person("Lubomyr Lisen", "", "");
+
+ begin_section("FreeSCI Contributors");
+ begin_persons();
+ add_person("Francois-R Boyer", "", "MT-32 information and mapping code");
+ add_person("Rainer Canavan", "", "IRIX MIDI driver and bug fixes");
+ add_person("Xiaojun Chen", "", "");
+ add_person("Paul David Doherty", "", "Game version information");
+ add_person("Vyacheslav Dikonov", "", "Config script improvements");
+ add_person("Ruediger Hanke", "", "Port to the MorphOS platform");
+ add_person("Matt Hargett", "", "Clean-ups, bugfixes, Hardcore QA, Win32");
+ add_person("Max Horn", "", "SetJump implementation");
+ add_person("Ravi I.", "", "SCI0 sound resource specification");
+ add_person("Emmanuel Jeandel", "", "Bugfixes and bug reports");
+ add_person("Dmitry Jemerov", "", "Port to the Win32 platform, numerous bugfixes");
+ add_person("Chris Kehler", "", "Makefile enhancements");
+ add_person("Christopher T. Lansdown", "", "Original CVS maintainer, Alpha compatibility fixes");
+ add_person("Sergey Lapin", "", "Port of Carl's type 2 decompression code");
+ add_person("Rickard Lind", "", "MT-32->GM MIDI mapping magic, sound research");
+ add_person("Hubert Maier", "", "AmigaOS 4 port");
+ add_person("Johannes Manhave", "", "Document format translation");
+ add_person("Claudio Matsuoka", "", "CVS snapshots, daily builds, BeOS and cygwin ports");
+ add_person("Dark Minister", "", "SCI research (bytecode and parser)");
+ add_person("Carl Muckenhoupt", "", "Sources to the SCI resource viewer tools that started it all");
+ add_person("Anders Baden Nielsen", "", "PPC testing");
+ add_person("Walter van Niftrik", "", "Ports to the Dreamcast and GP32 platforms");
+ add_person("Rune Orsval", "", "Configuration file editor");
+ add_person("Solomon Peachy", "", "SDL ports and much of the sound subsystem");
+ add_person("Robey Pointer", "", "Bug tracking system hosting");
+ add_person("Magnus Reftel", "", "Heap implementation, Python class viewer, bugfixes");
+ add_person("Christoph Reichenbach", "", "UN*X code, VM/Graphics/Sound/other infrastructure");
+ add_person("George Reid", "", "FreeBSD package management");
+ add_person("Lars Skovlund", "", "Project maintenance, most documentation, bugfixes, SCI1 support");
+ add_person("Rink Springer", "", "Port to the DOS platform, several bug fixes");
+ add_person("Rainer De Temple", "", "SCI research");
+ add_person("Sean Terrell", "", "");
+ add_person("Hugues Valois", "", "Game selection menu");
+ add_person("Jordi Vilalta", "", "Numerous code and website clean-up patches");
+ add_person("Petr Vyhnak", "", "The DCL-INFLATE algorithm, many Win32 improvements");
+ add_person("Bas Zoetekouw", "", "Man pages, debian package management, CVS maintenance");
+ end_persons();
+ add_paragraph("Special thanks to Prof. Dr. Gary Nutt ".
+ "for allowing the FreeSCI VM extension as a ".
+ "course project in his Advanced OS course.");
+ add_paragraph("Special thanks to Bob Heitman and Corey Cole for their support of FreeSCI.");
end_section();
- end_section();
- begin_section("Websites (design)");
- begin_persons();
- add_person("Dob&oacute; Bal&aacute;zs", "draven", "Website design");
- add_person("Yaroslav Fedevych", "jafd", "HTML/CSS for the website");
- add_person("David Jensen", "Tyst", "SVG logo conversion");
- add_person("Jean Marc Gimenez", "", "ScummVM logo");
- add_person("", "Raina", "ScummVM forum buttons");
- add_person("William Claydon", "billwashere", "Skins for doxygen, buildbot and wiki");
- end_persons();
- end_section();
+ add_paragraph("And to all the contributors, users, and beta testers we've missed. Thanks!");
- begin_section("Code contributions");
- begin_persons();
- add_person("Ori Avtalion", "salty-horse", "Subtitle control options in the GUI; BASS GUI fixes");
- add_person("Stuart Caie", "", "Decoders for Amiga and AtariST data files (AGOS engine)");
- add_person("Paolo Costabel", "", "PSP port contributions");
- add_person("Martin Doucha", "next_ghost", "CinE engine objectification");
- add_person("Thomas Fach-Pedersen", "madmoose", "ProTracker module player, Smacker video decoder");
- add_person("Tobias Gunkel", "hennymcc", "Sound support for C64 version of MM/Zak, Loom PCE support");
- add_person("Janne Huttunen", "", "V3 actor mask support, Dig/FT SMUSH audio");
- add_person("Kov&aacute;cs Endre J&aacute;nos", "", "Several fixes for Simon1");
- add_person("Jeroen Janssen", "japj", "Numerous readability and bugfix patches");
- add_person("Andreas Karlsson", "Sprawl", "Initial port for SymbianOS");
- add_person("Claudio Matsuoka", "", "Daily Linux builds");
- add_person("Thomas Mayer", "", "PSP port contributions");
- add_person("Sean Murray", "lightcast", "ScummVM tools GUI application (GSoC 2007 task)");
- add_person("", "n0p", "Windows CE port aspect ratio correction scaler and right click input method");
- add_person("Mikesch Nepomuk", "mnepomuk", "MI1 VGA floppy patches");
- add_person("Nicolas Noble", "pixels", "Config file and ALSA support");
- add_person("Tim Phillips", "realmz", "Initial MI1 CD music support");
- add_person("", "Quietust", "Sound support for Amiga SCUMM V2/V3 games, MM NES support");
- add_person("", "segra", "Improved support for Apple II/C64 versions of MM");
- add_person("Andreas R&ouml;ver", "", "Broken Sword I &amp; II MPEG2 cutscene support");
- add_person("Edward Rudd", "urkle", "Fixes for playing MP3 versions of MI1/Loom audio");
- add_person("Daniel Schepler", "dschepler", "Final MI1 CD music support, initial Ogg Vorbis support");
- add_person("Andr&eacute; Souza", "luke_br", "SDL-based OpenGL renderer");
- end_persons();
end_section();
- begin_section("FreeSCI Contributors");
- begin_persons();
- add_person("Anders Baden Nielsen", "", "PPC testing");
- add_person("Bas Zoetekouw", "", "Man pages, debian package management, CVS maintenance");
- add_person("Carl Muckenhoupt", "", "Sources to the SCI resource viewer tools that started it all");
- add_person("Chris Kehler", "", "Makefile enhancements");
- add_person("Christoph Reichenbach", "", "UN*X code, VM/Graphics/Sound/other infrastructure");
- add_person("Christopher T. Lansdown", "", "Original CVS maintainer, Alpha compatibility fixes");
- add_person("Claudio Matsuoka", "", "CVS snapshots, daily builds, BeOS and cygwin ports");
- add_person("Dark Minister", "", "SCI research (bytecode and parser)");
- add_person("Dmitry Jemerov", "", "Port to the Win32 platform, numerous bugfixes");
- add_person("Emmanuel Jeandel", "", "Bugfixes and bug reports");
- add_person("Francois-R Boyer", "", "MT-32 information and mapping code");
- add_person("George Reid", "", "FreeBSD package management");
- add_person("Hubert Maier", "", "AmigaOS 4 port");
- add_person("Hugues Valois", "", "Game selection menu");
- add_person("Johannes Manhave", "", "Document format translation");
- add_person("Jordi Vilalta", "", "Numerous code and website clean-up patches");
- add_person("Lars Skovlund", "", "Project maintenance, most documentation, bugfixes, SCI1 support");
- add_person("Magnus Reftel", "", "Heap implementation, Python class viewer, bugfixes");
- add_person("Matt Hargett", "", "Clean-ups, bugfixes, Hardcore QA, Win32");
- add_person("Max Horn", "", "SetJump implementation");
- add_person("Paul David Doherty", "", "Game version information");
- add_person("Petr Vyhnak", "", "The DCL-INFLATE algorithm, many Win32 improvements");
- add_person("Rainer Canavan", "", "IRIX MIDI driver and bug fixes");
- add_person("Rainer De Temple", "", "SCI research");
- add_person("Ravi I.", "", "SCI0 sound resource specification");
- add_person("Ruediger Hanke", "", "Port to the MorphOS platform");
- add_person("Rune Orsval", "", "Configuration file editor");
- add_person("Rickard Lind", "", "MT-32->GM MIDI mapping magic, sound research");
- add_person("Rink Springer", "", "Port to the DOS platform, several bug fixes");
- add_person("Robey Pointer", "", "Bug tracking system hosting");
- add_person("Sergey Lapin", "", "Port of Carl's type 2 decompression code");
- add_person("Solomon Peachy", "", "SDL ports and much of the sound subsystem");
- add_person("Vyacheslav Dikonov", "", "Config script improvements");
- add_person("Walter van Niftrik", "", "Ports to the Dreamcast and GP32 platforms");
- add_person("Xiaojun Chen", "", "");
- add_person("Sean Terrell", "", "");
- end_persons();
- add_paragraph("Special thanks to Prof. Dr. Gary Nutt ".
- "for allowing the FreeSCI VM extension as a ".
- "course project in his Advanced OS course.");
- add_paragraph("Special thanks to Bob Heitman and Corey Cole for their support of FreeSCI.");
- end_section();
- add_paragraph("And to all the contributors, users, and beta testers we've missed. Thanks!");
-
- end_section();
-
-
- # HACK!
- $max_name_width = 16;
-
- begin_section("Special thanks to");
- begin_persons();
- add_person("Sander Buskens", "", "For his work on the initial reversing of Monkey2");
- add_person("", "Canadacow", "For the original MT-32 emulator");
- add_person("Kevin Carnes", "", "For Scumm16, the basis of ScummVM's older gfx codecs");
- add_person("Curt Coder", "", "For the original TrollVM (preAGI) code");
- add_person("Patrick Combet", "Dorian Gray", "For the original Gobliiins ADL player");
- add_person("Ivan Dubrov", "", "For contributing the initial version of the Gobliiins engine");
- add_person("Henrik Engqvist", "qvist", "For generously providing hosting for our buildbot, SVN repository, planet and doxygen sites as well as tons of HD space");
- add_person("DOSBox Team", "", "For their awesome OPL2 and OPL3 emulator");
- add_person("Till Kresslein", "Krest", "For design of modern ScummVM GUI");
- add_person("", "Jezar", "For his freeverb filter implementation");
- add_person("Jim Leiterman", "", "Various info on his FM-TOWNS/Marty SCUMM ports");
- add_person("", "lloyd", "For deep tech details about C64 Zak &amp; MM");
- add_person("Sarien Team", "", "Original AGI engine code");
- add_person("Jimmi Th&oslash;gersen", "", "For ScummRev, and much obscure code/documentation");
- add_person("", "Tristan", "For additional work on the original MT-32 emulator");
- add_person("James Woodcock", "", "Soundtrack enhancements");
- end_persons();
-
- add_paragraph(
- "Tony Warriner and everyone at Revolution Software Ltd. for sharing ".
- "with us the source of some of their brilliant games, allowing us to ".
- "release Beneath a Steel Sky as freeware... and generally being ".
- "supportive above and beyond the call of duty.");
-
- add_paragraph(
- "John Passfield and Steve Stamatiadis for sharing the source of their ".
- "classic title, Flight of the Amazon Queen and also being incredibly ".
- "supportive.");
-
- add_paragraph(
- "Joe Pearce from The Wyrmkeep Entertainment Co. for sharing the source ".
- "of their famous title Inherit the Earth and always prompt replies to ".
- "our questions.");
-
- add_paragraph(
- "Aric Wilmunder, Ron Gilbert, David Fox, Vince Lee, and all those at ".
- "LucasFilm/LucasArts who made SCUMM the insane mess to reimplement ".
- "that it is today. Feel free to drop us a line and tell us what you ".
- "think, guys!");
-
- add_paragraph(
- "Alan Bridgman, Simon Woodroffe and everyone at Adventure Soft for ".
- "sharing the source code of some of their games with us.");
-
- add_paragraph(
- "John Young, Colin Smythe and especially Terry Pratchett himself for ".
- "sharing the source code of Discworld I &amp; II with us.");
-
- add_paragraph(
- "Emilio de Paz Arag&oacute;n from Alcachofa Soft for sharing the source code ".
- "of Drascula: The Vampire Strikes Back with us and his generosity with ".
- "freewaring the game.");
-
- add_paragraph(
- "David P. Gray from Gray Design Associates for sharing the source code ".
- "of the Hugo trilogy.");
-
- add_paragraph(
- "Broken Sword 2.5 team for providing sources of their engine and their great ".
- "support.");
-
- end_section();
+ # HACK!
+ $max_name_width = 16;
+
+ begin_section("Special thanks to");
+ begin_persons();
+ add_person("Sander Buskens", "", "For his work on the initial reversing of Monkey2");
+ add_person("", "Canadacow", "For the original MT-32 emulator");
+ add_person("Kevin Carnes", "", "For Scumm16, the basis of ScummVM's older gfx codecs");
+ add_person("Curt Coder", "", "For the original TrollVM (preAGI) code");
+ add_person("Patrick Combet", "Dorian Gray", "For the original Gobliiins ADL player");
+ add_person("Ivan Dubrov", "", "For contributing the initial version of the Gobliiins engine");
+ add_person("Henrik Engqvist", "qvist", "For generously providing hosting for our buildbot, SVN repository, planet and doxygen sites as well as tons of HD space");
+ add_person("DOSBox Team", "", "For their awesome OPL2 and OPL3 emulator");
+ add_person("Till Kresslein", "Krest", "For design of modern ScummVM GUI");
+ add_person("", "Jezar", "For his freeverb filter implementation");
+ add_person("Jim Leiterman", "", "Various info on his FM-TOWNS/Marty SCUMM ports");
+ add_person("", "lloyd", "For deep tech details about C64 Zak &amp; MM");
+ add_person("Sarien Team", "", "Original AGI engine code");
+ add_person("Jimmi Th&oslash;gersen", "", "For ScummRev, and much obscure code/documentation");
+ add_person("", "Tristan", "For additional work on the original MT-32 emulator");
+ add_person("James Woodcock", "", "Soundtrack enhancements");
+ end_persons();
+
+ add_paragraph(
+ "Tony Warriner and everyone at Revolution Software Ltd. for sharing ".
+ "with us the source of some of their brilliant games, allowing us to ".
+ "release Beneath a Steel Sky as freeware... and generally being ".
+ "supportive above and beyond the call of duty.");
+
+ add_paragraph(
+ "John Passfield and Steve Stamatiadis for sharing the source of their ".
+ "classic title, Flight of the Amazon Queen and also being incredibly ".
+ "supportive.");
+
+ add_paragraph(
+ "Joe Pearce from The Wyrmkeep Entertainment Co. for sharing the source ".
+ "of their famous title Inherit the Earth and always prompt replies to ".
+ "our questions.");
+
+ add_paragraph(
+ "Aric Wilmunder, Ron Gilbert, David Fox, Vince Lee, and all those at ".
+ "LucasFilm/LucasArts who made SCUMM the insane mess to reimplement ".
+ "that it is today. Feel free to drop us a line and tell us what you ".
+ "think, guys!");
+
+ add_paragraph(
+ "Alan Bridgman, Simon Woodroffe and everyone at Adventure Soft for ".
+ "sharing the source code of some of their games with us.");
+
+ add_paragraph(
+ "John Young, Colin Smythe and especially Terry Pratchett himself for ".
+ "sharing the source code of Discworld I &amp; II with us.");
+
+ add_paragraph(
+ "Emilio de Paz Arag&oacute;n from Alcachofa Soft for sharing the source code ".
+ "of Drascula: The Vampire Strikes Back with us and his generosity with ".
+ "freewaring the game.");
+
+ add_paragraph(
+ "David P. Gray from Gray Design Associates for sharing the source code ".
+ "of the Hugo trilogy.");
+
+ add_paragraph(
+ "Broken Sword 2.5 team for providing sources of their engine and their great ".
+ "support.");
+
+ end_section();
end_credits();
diff --git a/devtools/sci/musicplayer.cpp b/devtools/sci/musicplayer.cpp
index e4d0779848..d225195f71 100644
--- a/devtools/sci/musicplayer.cpp
+++ b/devtools/sci/musicplayer.cpp
@@ -96,5 +96,3 @@ int main(int argc, char** argv) {
scir_free_resource_manager(resmgr);
return 0;
}
-
-
diff --git a/devtools/sci/scitrace.asm b/devtools/sci/scitrace.asm
index 2e541326f2..2c5d2cc4cc 100644
--- a/devtools/sci/scitrace.asm
+++ b/devtools/sci/scitrace.asm
@@ -130,4 +130,3 @@ NowInstallTSR:
code_seg ends
end scitrace
-
diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index e9e155925e..53e3f38a2c 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -433,8 +433,8 @@ arttime Blue's Art Time Activities
d00ffc8c32d17e575fd985d435d2eb88 -1 en All - Demo - Kirben
BluesBirthday Blue's Birthday Adventure
- 99128b6a5bdd9831d9682fb8b5cbf8d4 -1 en All - Yellow - knifethrower
- 1ff5997c78fbd0a841a75ef15a05d9d5 -1 en Windows - Red - Mathew
+ 99128b6a5bdd9831d9682fb8b5cbf8d4 -1 en All Yellow Yellow - knifethrower
+ 1ff5997c78fbd0a841a75ef15a05d9d5 -1 en All Red Red - Mathew
2d4acbdcfd8e374c9da8c2e7303a5cd0 -1 en All - Demo - Kirben
cc0c4111449054f1692bb3c0c5e04629 -1 en All - Demo - George Kormend
@@ -472,7 +472,6 @@ fbpack Fatty Bear's Fun Pack
freddi Freddi Fish 1: The Case of the Missing Kelp Seeds
d4cccb5af88f3e77f370896e9ba8c5f9 -1 All Windows HE 71 - - sev
c0039ad982999c92d0de81910d640fa0 -1 nl Windows HE 71 - - adutchguy
- e63a0b9249b5ca4cc4d3ac34305ae360 -1 nb Windows HE 71 - - Karl Ove Hufthammer
68530d2e15f339fbbf3150b78b4d2ffb -1 en Mac HE 73 - - satz
6d1baa1065ac5f7b210be8ebe4235e49 -1 nl Mac HE 73 - - daniel9
c782fbbe74a987c3df8ac73cd3e289ed -1 se Mac HE 73 - - Torbjörn Andersson
@@ -485,6 +484,7 @@ freddi Freddi Fish 1: The Case of the Missing Kelp Seeds
746e88c172a5b7a1ae89ac0ee3ee681a -1 ru Windows HE 90 Updated - sev
a197a87ae77f3b3333f09a7a2c448fe2 -1 en Windows HE 99 Updated - Jonathan
af2bd1a43b50b55915d87994e093203d 34829 de Windows HE 99 Updated - Lightkey
+ e63a0b9249b5ca4cc4d3ac34305ae360 -1 nb Windows HE 99 - - Karl Ove Hufthammer
57a5cfec9ef231a007043cc1917e8988 -1 en Wii HE 100 - - sanguinehearts
56b5922751be7ffd771b38dda56b028b 34837 nl Wii HE 100 - - George Kormendi
3ae7f002d9256b8bdf76aaf8a3a069f8 34837 gb Wii HE 100 - - George Kormendi
diff --git a/devtools/skycpt/AsciiCptCompile.sln b/devtools/skycpt/AsciiCptCompile.sln
deleted file mode 100644
index 93de755bf3..0000000000
--- a/devtools/skycpt/AsciiCptCompile.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AsciiCptCompile", "AsciiCptCompile.vcproj", "{BDAC73AF-42DE-45E7-95A8-C1D906AD19EF}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {BDAC73AF-42DE-45E7-95A8-C1D906AD19EF}.Debug.ActiveCfg = Debug|Win32
- {BDAC73AF-42DE-45E7-95A8-C1D906AD19EF}.Debug.Build.0 = Debug|Win32
- {BDAC73AF-42DE-45E7-95A8-C1D906AD19EF}.Release.ActiveCfg = Release|Win32
- {BDAC73AF-42DE-45E7-95A8-C1D906AD19EF}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/devtools/skycpt/AsciiCptCompile.vcproj b/devtools/skycpt/AsciiCptCompile.vcproj
deleted file mode 100644
index e6a5def316..0000000000
--- a/devtools/skycpt/AsciiCptCompile.vcproj
+++ /dev/null
@@ -1,402 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="AsciiCptCompile"
- ProjectGUID="{BDAC73AF-42DE-45E7-95A8-C1D906AD19EF}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="Debug"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="5"
- UsePrecompiledHeader="3"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/AsciiCptCompile.exe"
- LinkIncremental="2"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/AsciiCptCompile.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="Release"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="4"
- UsePrecompiledHeader="3"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/AsciiCptCompile.exe"
- LinkIncremental="1"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Quelldateien"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath=".\AsciiCptCompile.cpp">
- </File>
- <File
- RelativePath=".\cptcompiler.cpp">
- </File>
- <File
- RelativePath=".\cpthelp.cpp">
- </File>
- <File
- RelativePath=".\idFinder.cpp">
- </File>
- <File
- RelativePath=".\KmpSearch.cpp">
- </File>
- <File
- RelativePath=".\stdafx.cpp">
- <FileConfiguration
- Name="Debug|Win32">
- <Tool
- Name="VCCLCompilerTool"
- UsePrecompiledHeader="1"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32">
- <Tool
- Name="VCCLCompilerTool"
- UsePrecompiledHeader="1"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath=".\TextFile.cpp">
- </File>
- </Filter>
- <Filter
- Name="Headerdateien"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File
- RelativePath=".\cpthelp.h">
- </File>
- <File
- RelativePath=".\KmpSearch.h">
- </File>
- <File
- RelativePath=".\stdafx.h">
- </File>
- <File
- RelativePath=".\TextFile.h">
- </File>
- </Filter>
- <Filter
- Name="Ressourcendateien"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File
- RelativePath=".\asmSrc\0compact.inc">
- </File>
- <File
- RelativePath=".\asmSrc\101comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\102comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\10comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\11comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\12comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\13comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\14comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\15comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\16comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\17comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\18comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\19comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\1compact.inc">
- </File>
- <File
- RelativePath=".\asmSrc\20comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\21comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\22comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\23comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\24comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\25comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\26comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\27comp.inc">
- </File>
- <File
- RelativePath=".\288diff.txt">
- </File>
- <File
- RelativePath=".\asmSrc\28comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\29comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\2compact.inc">
- </File>
- <File
- RelativePath=".\asmSrc\30comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\31comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\32comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\33comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\34comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\36comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\37comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\38comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\39comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\3compact.inc">
- </File>
- <File
- RelativePath=".\asmSrc\40comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\41comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\42comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\44comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\45comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\46comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\47comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\48comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\4compact.inc">
- </File>
- <File
- RelativePath=".\asmSrc\5compact.inc">
- </File>
- <File
- RelativePath=".\asmSrc\65comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\66comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\67comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\68comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\69comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\70comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\71comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\72comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\73comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\74comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\75comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\76comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\77comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\78comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\79comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\80comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\81comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\82comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\85comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\90comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\91comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\92comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\93comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\94comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\95comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\96comp.inc">
- </File>
- <File
- RelativePath=".\asmSrc\9compact.inc">
- </File>
- <File
- RelativePath=".\COMPACT.TXT">
- </File>
- <File
- RelativePath=".\savedata.txt">
- </File>
- </Filter>
- <File
- RelativePath=".\ReadMe.txt">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/devtools/skycpt/KmpSearch.h b/devtools/skycpt/KmpSearch.h
index f39b993bd2..7bec5f07a8 100644
--- a/devtools/skycpt/KmpSearch.h
+++ b/devtools/skycpt/KmpSearch.h
@@ -32,5 +32,3 @@ private:
};
#endif //__KmpSearch__
-
-
diff --git a/devtools/skycpt/skycpt-engine.patch b/devtools/skycpt/skycpt-engine.patch
index 16388a3221..d7ead35c9b 100644
--- a/devtools/skycpt/skycpt-engine.patch
+++ b/devtools/skycpt/skycpt-engine.patch
@@ -64,4 +64,3 @@ Index: engines/sky/logic.cpp
+ _skyControl->doLoadSavePanel();
return true;
}
-
diff --git a/devtools/tasmrecover/.gitignore b/devtools/tasmrecover/.gitignore
index f2bff8e8d9..69ae325082 100644
--- a/devtools/tasmrecover/.gitignore
+++ b/devtools/tasmrecover/.gitignore
@@ -1,4 +1,3 @@
*.pyc
dreamgen.*
_stubs*
-
diff --git a/devtools/tasmrecover/dreamweb/backdrop.asm b/devtools/tasmrecover/dreamweb/backdrop.asm
index 5dfe20bf5d..ec0e4959b3 100644
--- a/devtools/tasmrecover/dreamweb/backdrop.asm
+++ b/devtools/tasmrecover/dreamweb/backdrop.asm
@@ -850,27 +850,3 @@ over147: mov ch,0
ret
endp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/dreamweb.asm b/devtools/tasmrecover/dreamweb/dreamweb.asm
index d357c5cd73..8a52435b0c 100644
--- a/devtools/tasmrecover/dreamweb/dreamweb.asm
+++ b/devtools/tasmrecover/dreamweb/dreamweb.asm
@@ -50,7 +50,7 @@ debuglevel1 equ 0 ;memory debug on
debuglevel2 equ 0 ;debug keys on+shouts
demo equ 0
CD equ 1
-Foreign equ 0
+Foreign equ 1
Spanish equ 0
German equ 0
@@ -4225,9 +4225,10 @@ Undertextline proc near
mov di,textaddressx
mov bx,textaddressy
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub bx,3
- endif
+$1:
mov ds,buffers
mov si,textunder
mov cl,undertextsizex
@@ -4248,9 +4249,10 @@ Deltextline proc near
mov di,textaddressx
mov bx,textaddressy
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub bx,3
- endif
+$1:
mov ds,buffers
mov si,textunder
mov cl,undertextsizex
@@ -4271,9 +4273,10 @@ Dumptextline proc near
mov newtextline,0
mov di,textaddressx
mov bx,textaddressy
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub bx,3
- endif
+$1:
mov cl,undertextsizex
mov ch,undertextsizey
call multidump
@@ -6237,6 +6240,8 @@ savefiles db "DREAMWEB.D00",0
Recname db "DREAMWEB.DEM",0
Quitrequested db 0
+Subtitles db 0
+ForeignRelease db 0
;-------------------------------------------------------End of code segment----
@@ -6259,20 +6264,3 @@ STACKSPACE ends
;-----------------------------------------------------------End of all code----
end Dreamweb
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/keypad.asm b/devtools/tasmrecover/dreamweb/keypad.asm
index 8ac38524aa..6eee2fa11c 100644
--- a/devtools/tasmrecover/dreamweb/keypad.asm
+++ b/devtools/tasmrecover/dreamweb/keypad.asm
@@ -18,10 +18,15 @@ Entercode proc near
mov presspointer,0
mov getback,0
-keypadloop: call delpointer
+keypadloop:
+ cmp quitrequested, 0
+ jnz numberright
+
+ call delpointer
call readmouse
call showkeypad
call showpointer
+ call vsync
cmp presscount,0
jz nopresses
dec presscount
@@ -1754,4 +1759,3 @@ Findtext1 proc near
ret
endp
-
diff --git a/devtools/tasmrecover/dreamweb/look.asm b/devtools/tasmrecover/dreamweb/look.asm
index 399e1f16fd..a5a8b8055e 100644
--- a/devtools/tasmrecover/dreamweb/look.asm
+++ b/devtools/tasmrecover/dreamweb/look.asm
@@ -158,9 +158,3 @@ dogetback: mov getback,1
ret
endp
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/monitor.asm b/devtools/tasmrecover/dreamweb/monitor.asm
index 247ba10f2b..5354e9f7d5 100644
--- a/devtools/tasmrecover/dreamweb/monitor.asm
+++ b/devtools/tasmrecover/dreamweb/monitor.asm
@@ -1425,10 +1425,11 @@ Printcurs proc near
mov bx,curslocy
mov cl,6
mov ch,8
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub bx,3
mov ch,11
- endif
+$1:
mov ds,buffers
mov si,textunder
push di bx
@@ -1449,11 +1450,11 @@ Printcurs proc near
flashcurs: pop di bx
sub di,6
mov cl,12
- if foreign
- mov ch,11
- else
mov ch,8
- endif
+ cmp foreignrelease, 0
+ jz $2
+ mov ch,11
+$2:
call multidump
pop es bx dx ds di si
@@ -1473,10 +1474,11 @@ Delcurs proc near
mov bx,curslocy
mov cl,6
mov ch,8
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub bx,3
mov ch,11
- endif
+$1:
push di bx cx
mov ds,buffers
mov si,textunder
@@ -1488,8 +1490,3 @@ finishcurdel:
ret
endp
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/newplace.asm b/devtools/tasmrecover/dreamweb/newplace.asm
index ac703f6b11..b06a351f5f 100644
--- a/devtools/tasmrecover/dreamweb/newplace.asm
+++ b/devtools/tasmrecover/dreamweb/newplace.asm
@@ -158,13 +158,14 @@ alreadyinfo: mov ax,mousebutton
mov di,60
mov bx,72+55
call showframe
- if foreign
+ cmp foreignrelease, 0
+ jz $1
mov al,4
mov ah,0
mov di,60
mov bx,72+55+21
call showframe
- endif
+$1:
pop bx
mov bh,0
@@ -175,11 +176,11 @@ alreadyinfo: mov ax,mousebutton
call findnextcolon
mov di,63
- if foreign
- mov bx,84+4
- else
mov bx,84
- endif
+ cmp foreignrelease, 0
+ jz $2
+ mov bx,84+4
+$2:
mov dl,191
mov al,0
mov ah,0
@@ -576,8 +577,3 @@ Readcitypic proc near
ret
endp
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/object.asm b/devtools/tasmrecover/dreamweb/object.asm
index bdd043d588..807a100052 100644
--- a/devtools/tasmrecover/dreamweb/object.asm
+++ b/devtools/tasmrecover/dreamweb/object.asm
@@ -336,11 +336,16 @@ waitexam: ;call delpointer
jz notuseinv
mov bx,offset cs:withlist1
notuseinv: call checkcoords
+
+ cmp quitrequested, 0
+ jnz stopwaiting
+
cmp examagain,0
jz norex
jmp examineagain
norex: cmp getback,0
jz waitexam
+stopwaiting:
mov pickup,0
cmp watchingtime,0
@@ -670,11 +675,13 @@ Describeob proc near
mov di,33
mov bx,92
- if foreign
+
+ cmp foreignrelease, 0
+ jz notsetd
cmp objecttype,1
jnz notsetd
mov bx,82
-notsetd: endif
+notsetd:
mov dl,241
mov ah,16
mov charshift,91+91
@@ -682,11 +689,12 @@ notsetd: endif
mov charshift,0
mov di,36
mov bx,104
- if foreign
+ cmp foreignrelease, 0
+ jz notsetd2
cmp objecttype,1
jnz notsetd2
mov bx,94
-notsetd2: endif
+notsetd2:
mov dl,241
mov ah,0
call printdirect
@@ -2583,10 +2591,8 @@ findlenextext: mov cl,[es:si]
sub bx,extext
push bx ax
sub cx,bx
- cmp cx, 0xffff; BIG FIXME! Find out why this is happening
- jz $1
rep movsb
-$1: pop bx
+ pop bx
sub extextpos,bx
pop si
@@ -2602,8 +2608,3 @@ beforethistext: mov [es:di],ax
ret
endp
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/print.asm b/devtools/tasmrecover/dreamweb/print.asm
index a2052285f0..7cbb45c08b 100644
--- a/devtools/tasmrecover/dreamweb/print.asm
+++ b/devtools/tasmrecover/dreamweb/print.asm
@@ -6,9 +6,10 @@ Printchar proc near
cmp al,255
jz ignoreit
push si bx di
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub bx,3
- endif
+$1:
push ax
sub al,32 ;"A"
mov ah,0
diff --git a/devtools/tasmrecover/dreamweb/saveload.asm b/devtools/tasmrecover/dreamweb/saveload.asm
index 369e799d53..6c98774a0f 100644
--- a/devtools/tasmrecover/dreamweb/saveload.asm
+++ b/devtools/tasmrecover/dreamweb/saveload.asm
@@ -1502,6 +1502,7 @@ Loadold proc near
alreadyloadold: mov ax,mousebutton
and ax,1
jz noloadold
+ mov ax,0ffffh
call doload
cmp getback,4
jz noloadold
@@ -1513,7 +1514,3 @@ alreadyloadold: mov ax,mousebutton
noloadold: ret
endp
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/sblaster.asm b/devtools/tasmrecover/dreamweb/sblaster.asm
index 46eb8e2366..7a271e9c90 100644
--- a/devtools/tasmrecover/dreamweb/sblaster.asm
+++ b/devtools/tasmrecover/dreamweb/sblaster.asm
@@ -1260,33 +1260,3 @@ nopitflip: cli
iret
endp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/sprite.asm b/devtools/tasmrecover/dreamweb/sprite.asm
index fadea3b790..06b06c76e3 100644
--- a/devtools/tasmrecover/dreamweb/sprite.asm
+++ b/devtools/tasmrecover/dreamweb/sprite.asm
@@ -4226,7 +4226,7 @@ botofdoor2: sub ah,ch
opendoor2: cmp throughdoor,1
jz mustbeopen
cmp lockstatus,1
- jz shutdoor
+ jz shutdoor2
mustbeopen: mov cl,[es:bx+19]
cmp cl,1
jnz notdoorsound4
@@ -4785,12 +4785,12 @@ Reconstruct proc near
call drawfloor
call spriteupdate
call printsprites
- if foreign
+ cmp foreignrelease, 0
+ jz notfudge
cmp reallocation,20
jnz notfudge
call undertextline
notfudge:
- endif
mov havedoneobs,0
noneedtorecon: ret
@@ -5017,17 +5017,3 @@ dumpevery2: mov ax,[es:bx]
finishevery2: ret
endp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/talk.asm b/devtools/tasmrecover/dreamweb/talk.asm
index 6bee4409b7..4d6b381881 100644
--- a/devtools/tasmrecover/dreamweb/talk.asm
+++ b/devtools/tasmrecover/dreamweb/talk.asm
@@ -28,6 +28,8 @@ waittalk: call delpointer
mov getback,0
mov bx,offset cs:talklist
call checkcoords
+ cmp quitrequested, 0
+ jnz finishtalk
cmp getback,0
jz waittalk
finishtalk: mov bx,persondata
@@ -490,6 +492,8 @@ hangloopq: push cx bx
pop bx cx
cmp getback,1
jz quitconv
+ cmp quitrequested, 0
+ jnz quitconv
cmp speechloaded,1
jnz notspeaking
cmp ch1playing,255
@@ -559,21 +563,3 @@ doredes: call delpointer
ret
endp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/titles.asm b/devtools/tasmrecover/dreamweb/titles.asm
index 8f2b46e3f4..52f58867ed 100644
--- a/devtools/tasmrecover/dreamweb/titles.asm
+++ b/devtools/tasmrecover/dreamweb/titles.asm
@@ -570,16 +570,3 @@ realcreditsearly:
ret
endp
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/use.asm b/devtools/tasmrecover/dreamweb/use.asm
index 508e8bd4c1..78917d50f4 100644
--- a/devtools/tasmrecover/dreamweb/use.asm
+++ b/devtools/tasmrecover/dreamweb/use.asm
@@ -1879,11 +1879,11 @@ Usecashcard proc near
call showman
mov di,114
- if foreign
- mov bx,120-3
- else
mov bx,120
- endif
+ cmp foreignrelease, 0
+ jz $1
+ mov bx,120-3
+$1:
mov ds,tempgraphics
mov al,39
mov ah,0
@@ -3189,9 +3189,10 @@ notinlouiss: ret
Getundertimed proc near
mov al,timedy
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub al,3
- endif
+$1:
mov ah,0
mov bx,ax
mov al,timedx
@@ -3212,9 +3213,10 @@ Getundertimed proc near
Putundertimed proc near
mov al,timedy
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub al,3
- endif
+$1:
mov ah,0
mov bx,ax
mov al,timedx
@@ -3239,9 +3241,10 @@ Dumptimedtext proc near
cmp needtodumptimed,1
jnz nodumptimed
mov al,timedy
- if foreign
+ cmp foreignrelease, 0
+ jz $1
sub al,3
- endif
+$1:
mov ah,0
mov bx,ax
mov al,timedx
@@ -3293,18 +3296,34 @@ Setuptimedtemp proc near
if cd
cmp ah,0
jz notloadspeech3
+ push ax
+ push bx
+ push cx
+ push dx
mov dl,"T"
mov dh,ah
- mov cl,"T"
+ mov cl,"T"
mov ah,0
call loadspeech
cmp speechloaded,1
- jnz notloadspeech3
+ jnz $1
mov al,50+12
call playchannel1
+$1:
+ pop dx
+ pop cx
+ pop bx
+ pop ax
+
+ cmp speechloaded,1
+ jnz notloadspeech3 ; failed to load speech
+ cmp subtitles, 1
+ jz notloadspeech3
ret
+
notloadspeech3:
- endif
+ endif ;if cd
+
cmp timecount,0
jnz cantsetup2
mov timedy,bh
@@ -3796,14 +3815,3 @@ nowinch: call showfirstuse
ret
endp
-
-
-
-
-
-
-
-
-
-
-
diff --git a/devtools/tasmrecover/dreamweb/vars.asm b/devtools/tasmrecover/dreamweb/vars.asm
index 8646697e52..6d34074528 100644
--- a/devtools/tasmrecover/dreamweb/vars.asm
+++ b/devtools/tasmrecover/dreamweb/vars.asm
@@ -273,7 +273,7 @@ savesource dw 0
savex db 0
savey db 0
currentob db 0
-priority db 0
+priorityDep db 0 ; dep for deprecated, I leave a byte here to minimize changes to the generated code
destpos db 0
@@ -560,4 +560,3 @@ roomssample db 0
gameerror db 0
howmuchalloc dw 0
-
diff --git a/devtools/tasmrecover/dreamweb/vgafades.asm b/devtools/tasmrecover/dreamweb/vgafades.asm
index 06cc9d6a44..a1043d9cf5 100644
--- a/devtools/tasmrecover/dreamweb/vgafades.asm
+++ b/devtools/tasmrecover/dreamweb/vgafades.asm
@@ -862,5 +862,3 @@ Initialmoncols proc near
ret
endp
-
-
diff --git a/devtools/tasmrecover/dreamweb/vgagrafx.asm b/devtools/tasmrecover/dreamweb/vgagrafx.asm
index 110fc95ee0..4ba1b16ba1 100644
--- a/devtools/tasmrecover/dreamweb/vgagrafx.asm
+++ b/devtools/tasmrecover/dreamweb/vgagrafx.asm
@@ -1758,5 +1758,3 @@ Title6graphics db "DREAMWEB.I06",0
Title7graphics db "DREAMWEB.I07",0
Palettescreen db "DREAMWEB.PAL",0
-
-
diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover
index d6c6a2523f..2066ae9b3d 100755
--- a/devtools/tasmrecover/tasm-recover
+++ b/devtools/tasmrecover/tasm-recover
@@ -1,5 +1,26 @@
#!/usr/bin/python
+# 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.
+#
+
from tasm.parser import parser
from tasm.cpp import cpp
@@ -8,6 +29,7 @@ p.strip_path = 3
context = p.parse('dreamweb/dreamweb.asm')
p.link()
generator = cpp(context, "DreamGen", blacklist = [
+ # These functions are not processed
'randomnumber',
'quickquit',
'quickquit2',
@@ -15,14 +37,178 @@ generator = cpp(context, "DreamGen", blacklist = [
'multiget',
'multiput',
'multidump',
- 'frameoutnm',
- 'cls',
+ 'frameoutnm',
+ 'frameoutbh',
+ 'frameoutfx',
+ 'cls',
+ 'clearwork',
'printundermon',
+ 'kernchars',
+ 'getnextword',
+ 'getnumber',
+ 'dumptextline',
+ 'printboth',
+ 'printchar',
+ 'printdirect',
+ 'printslow',
+ 'printmessage',
+ 'usetimedtext',
+ 'dumptimedtext',
+ 'setuptimedtemp',
+ 'putundertimed',
+ 'getundertimed',
'worktoscreen',
'width160',
'convertkey',
'readabyte',
'readoneblock',
- 'frameoutv'
+ 'printsprites',
+ 'printasprite',
+ 'eraseoldobs',
+ 'clearsprites',
+ 'makesprite',
+ 'showframe',
+ 'initman',
+ 'aboutturn',
+ 'readheader',
+ 'fillspace',
+ 'getroomdata',
+ 'startloading',
+ 'showreelframe',
+ 'showgamereel',
+ 'getreelframeax',
+ 'findsource',
+ 'walking',
+ 'autosetwalk',
+ 'checkdest',
+ 'spriteupdate',
+ 'dodoor',
+ 'lockeddoorway',
+ 'liftsprite',
+ 'frameoutv',
+ 'modifychar',
+ 'allocatework',
+ 'lockmon',
+ 'cancelch0',
+ 'cancelch1',
+ 'getroomspaths',
+ 'makebackob',
+ 'dealwithspecial',
+ 'plotreel',
+ 'facerightway',
+ 'zoom',
+ 'crosshair',
+ 'showrain',
+ 'domix',
+ 'channel0tran',
+ 'makenextblock',
+ 'loopchannel0',
+ 'parseblaster',
+ 'deltextline',
+ 'doblocks',
+ 'checkifperson',
+ 'checkiffree',
+ 'checkifex',
+ 'getreelstart',
+ 'findobname',
+ 'copyname',
+ 'commandwithob',
+ 'showpanel',
+ 'updatepeople',
+ 'madmantext',
+ 'madmode',
+ 'movemap',
+ 'doorway',
+ 'widedoor',
+ 'showallobs',
+ 'addalong',
+ 'addlength',
+ 'getdimension',
+ 'getxad',
+ 'getyad',
+ 'getmapad',
+ 'calcmapad',
+ 'calcfrframe',
+ 'finalframe',
+ 'commandonly',
+ 'makename',
+ 'findlen',
+ 'blocknametext',
+ 'walktotext',
+ 'personnametext',
+ 'findxyfrompath',
+ 'findormake',
+ 'setallchanges',
+ 'dochange',
+ 'deletetaken',
+ 'placesetobject',
+ 'removesetobject',
+ 'showallfree',
+ 'showallex',
+ 'adjustlen',
+ 'finishedwalking',
+ 'checkone',
+ 'getblockofpixel',
+ 'getflagunderp',
+ 'walkandexamine',
+ 'obname',
+ 'delpointer',
+ 'showblink',
+ 'dumpblink',
+ 'dumppointer',
+ 'showpointer',
+ 'animpointer',
+ 'checkcoords',
+ 'readmouse',
+ 'readmouse1',
+ 'readmouse2',
+ 'readmouse3',
+ 'readmouse4',
+ 'waitframes',
+ 'drawflags',
+ 'addtopeoplelist',
+ 'getexpos',
+ 'paneltomap',
+ 'maptopanel',
+ 'dumpmap',
+ 'obpicture',
+ 'delthisone',
+ 'transferinv',
+ 'obicons',
+ 'compare',
+ 'pixelcheckset',
+ 'turnpathon',
+ 'turnpathoff',
+ 'turnanypathon',
+ 'turnanypathoff',
+ 'isitdescribed',
+ 'checkifset',
+ 'checkifpathison',
+ 'delsprite',
+ 'dumpeverything',
+ 'isitworn',
+ 'makeworn',
+ 'obtoinv',
+ 'showryanpage',
+ 'findallryan',
+ 'fillryan',
+ 'useroutine',
+ 'hangon',
+ 'hangonp',
+ 'findnextcolon',
+ 'usetext',
+ 'bresenhams',
+ 'examineobtext',
+ 'wornerror',
+ ], skip_output = [
+ # These functions are processed but not output
+ 'dreamweb',
+ 'backobject',
+ 'mainman',
+ 'madman',
+ 'loadgame',
+ 'savegame',
+ 'zoomonoff',
+ 'doload'
])
generator.generate('dreamweb') #start routine
diff --git a/devtools/tasmrecover/tasm/cpp.py b/devtools/tasmrecover/tasm/cpp.py
index 0196e5b45c..61edb41fb2 100644
--- a/devtools/tasmrecover/tasm/cpp.py
+++ b/devtools/tasmrecover/tasm/cpp.py
@@ -1,3 +1,24 @@
+# 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.
+#
+
import op, traceback, re, proc
from copy import copy
proc_module = proc
@@ -12,11 +33,35 @@ def parse_bin(s):
return v
class cpp:
- def __init__(self, context, namespace, skip_first = 0, blacklist = []):
+ def __init__(self, context, namespace, skip_first = 0, blacklist = [], skip_output = []):
self.namespace = namespace
fname = namespace.lower() + ".cpp"
header = namespace.lower() + ".h"
- banner = "/* PLEASE DO NOT MODIFY THIS FILE. ALL CHANGES WILL BE LOST! LOOK FOR README FOR DETAILS */"
+ banner = """/* PLEASE DO NOT MODIFY THIS FILE. ALL CHANGES WILL BE LOST! LOOK FOR README FOR DETAILS */
+
+/* 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.
+ *
+ */
+
+"""
self.fd = open(fname, "wt")
self.hd = open(header, "wt")
hid = "TASMRECOVER_%s_STUBS_H__" %namespace.upper()
@@ -34,8 +79,10 @@ class cpp:
self.proc_done = []
self.blacklist = blacklist
self.failed = list(blacklist)
+ self.skip_output = skip_output
self.translated = []
self.proc_addr = []
+ self.used_data_offsets = set()
self.methods = []
self.fd.write("""%s
@@ -53,11 +100,13 @@ namespace %s {
if self.indirection == -1:
try:
offset,p,p = self.context.get_offset(name)
- print "OFFSET = %d" %offset
- self.indirection = 0
- return str(offset)
except:
pass
+ else:
+ print "OFFSET = %d" %offset
+ self.indirection = 0
+ self.used_data_offsets.add((name,offset))
+ return "offset_%s" % (name,)
g = self.context.get_global(name)
if isinstance(g, op.const):
@@ -466,7 +515,9 @@ namespace %s {
self.resolve_label(s.label)
#adding statements
+ #BIG FIXME: this is quite ugly to handle code analysis from the code generation. rewrite me!
for label, proc, offset in self.unbounded:
+ self.body += "\treturn;\n" #we need to return before calling code from the other proc
self.body += "/*continuing to unbounded code: %s from %s:%d-%d*/\n" %(label, proc.name, offset, len(proc.stmts))
start = len(self.proc.stmts)
self.proc.add_label(label)
@@ -480,7 +531,8 @@ namespace %s {
self.proc.optimize(keep_labels=[label])
self.proc.visit(self, start)
self.body += "}\n";
- self.translated.insert(0, self.body)
+ if name not in self.skip_output:
+ self.translated.insert(0, self.body)
self.proc = None
if self.temps_count > 0:
raise Exception("temps count == %d at the exit of proc" %self.temps_count);
@@ -532,24 +584,39 @@ namespace %s {
data_bin = self.data_seg
data_impl = "\n\tstatic const uint8 src[] = {\n\t\t"
n = 0
+ comment = str()
for v in data_bin:
data_impl += "0x%02x, " %v
n += 1
+
+ comment += chr(v) if (v >= 0x20 and v < 0x7f and v != ord('\\')) else "."
if (n & 0xf) == 0:
- data_impl += "\n\t\t"
+ data_impl += "\n\t\t//0x%04x: %s\n\t\t" %(n - 16, comment)
+ comment = str()
+ elif (n & 0x3) == 0:
+ comment += " "
data_impl += "};\n\tds.assign(src, src + sizeof(src));\n"
self.hd.write(
"""\n#include "dreamweb/runtime.h"
namespace %s {
-
+#include "structs.h"
class %sContext : public Context {
public:
void __start();
void __dispatch_call(uint16 addr);
+#include "stubs.h" // Allow hand-reversed functions to have a signature different than void f()
"""
%(self.namespace, self.namespace))
+
+ for name,addr in self.proc_addr:
+ self.hd.write("\tstatic const uint16 addr_%s = 0x%04x;\n" %(name, addr))
+
+
+ for name,addr in self.used_data_offsets:
+ self.hd.write("\tstatic const uint16 offset_%s = 0x%04x;\n" %(name, addr))
+
offsets = []
for k, v in self.context.get_globals().items():
if isinstance(v, op.var):
@@ -559,10 +626,13 @@ public:
offsets = sorted(offsets, key=lambda t: t[1])
for o in offsets:
- self.hd.write("\tconst static uint16 k%s = %s;\n" %o)
+ self.hd.write("\tstatic const uint16 k%s = %s;\n" %o)
self.hd.write("\n")
for p in set(self.methods):
- self.hd.write("\tvoid %s();\n" %p)
+ if p in self.blacklist:
+ self.hd.write("\t//void %s();\n" %p)
+ else:
+ self.hd.write("\tvoid %s();\n" %p)
self.hd.write("};\n}\n\n#endif\n")
self.hd.close()
@@ -572,7 +642,7 @@ public:
self.fd.write("\nvoid %sContext::__dispatch_call(uint16 addr) {\n\tswitch(addr) {\n" %self.namespace)
self.proc_addr.sort(cmp = lambda x, y: x[1] - y[1])
for name,addr in self.proc_addr:
- self.fd.write("\t\tcase 0x%04x: %s(); break;\n" %(addr, name))
+ self.fd.write("\t\tcase addr_%s: %s(); break;\n" %(name, name))
self.fd.write("\t\tdefault: ::error(\"invalid call to %04x dispatched\", (uint16)ax);")
self.fd.write("\n\t}\n}\n\n} /*namespace*/\n")
diff --git a/devtools/tasmrecover/tasm/lex.py b/devtools/tasmrecover/tasm/lex.py
index cf7e6e19bf..9728c149ca 100644
--- a/devtools/tasmrecover/tasm/lex.py
+++ b/devtools/tasmrecover/tasm/lex.py
@@ -1,3 +1,24 @@
+# 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.
+#
+
def parse_args(text):
#print "parsing: [%s]" %text
escape = False
diff --git a/devtools/tasmrecover/tasm/op.py b/devtools/tasmrecover/tasm/op.py
index 10fdd8a568..30852bcb58 100644
--- a/devtools/tasmrecover/tasm/op.py
+++ b/devtools/tasmrecover/tasm/op.py
@@ -1,3 +1,24 @@
+# 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.
+#
+
import re
import lex
@@ -407,4 +428,3 @@ class label(baseop):
self.name = name
def visit(self, visitor):
visitor._label(self.name)
-
diff --git a/devtools/tasmrecover/tasm/parser.py b/devtools/tasmrecover/tasm/parser.py
index 4cea496722..ebbd714cf4 100644
--- a/devtools/tasmrecover/tasm/parser.py
+++ b/devtools/tasmrecover/tasm/parser.py
@@ -1,3 +1,24 @@
+# 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.
+#
+
import os, re
from proc import proc
import lex
diff --git a/devtools/tasmrecover/tasm/proc.py b/devtools/tasmrecover/tasm/proc.py
index ed7053df89..50a394413f 100644
--- a/devtools/tasmrecover/tasm/proc.py
+++ b/devtools/tasmrecover/tasm/proc.py
@@ -1,3 +1,24 @@
+# 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.
+#
+
import re
import op
diff --git a/devtools/themeparser.py b/devtools/themeparser.py
index a3524461a0..5c6f89897b 100644
--- a/devtools/themeparser.py
+++ b/devtools/themeparser.py
@@ -616,4 +616,3 @@ class STXBinaryFile(object):
if __name__ == '__main__':
bin = STXBinaryFile('../gui/themes/scummclassic', True, True)
bin.parse()
-
diff --git a/devtools/update-version.pl b/devtools/update-version.pl
index 788cbc7e40..169fba7788 100755
--- a/devtools/update-version.pl
+++ b/devtools/update-version.pl
@@ -39,7 +39,7 @@ my @subs_files = qw(
dists/macosx/Info.plist
dists/iphone/Info.plist
dists/irix/scummvm.spec
- dists/nsis/scummvm.nsi
+ dists/win32/scummvm.nsi
dists/wii/meta.xml
dists/android/AndroidManifest.xml
dists/android/plugin-manifest.xml
diff --git a/dists/android/AndroidManifest.xml b/dists/android/AndroidManifest.xml
index 1bc784cc4c..a25048fe28 100644
--- a/dists/android/AndroidManifest.xml
+++ b/dists/android/AndroidManifest.xml
@@ -4,8 +4,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.inodes.gus.scummvm"
android:versionCode="@ANDROID_VERSIONCODE@"
- android:versionName="1.4.0git"
- android:installLocation="preferExternal">
+ android:versionName="1.5.0git"
+ android:installLocation="preferExternal"
+ android:sharedUserId="org.inodes.gus.scummvm">
<!-- This version works on Android 1.5 (SDK 3) and newer, but we
want Android 2.2 (SDK 8) defaults and features. -->
@@ -58,4 +59,3 @@
<uses-configuration android:reqTouchScreen="stylus"
android:reqKeyboardType="qwerty"/>
</manifest>
-
diff --git a/dists/android/AndroidManifest.xml.in b/dists/android/AndroidManifest.xml.in
index a8d40bdddc..32444a03f0 100644
--- a/dists/android/AndroidManifest.xml.in
+++ b/dists/android/AndroidManifest.xml.in
@@ -5,7 +5,8 @@
package="org.inodes.gus.scummvm"
android:versionCode="@ANDROID_VERSIONCODE@"
android:versionName="@VERSION@"
- android:installLocation="preferExternal">
+ android:installLocation="preferExternal"
+ android:sharedUserId="org.inodes.gus.scummvm">
<!-- This version works on Android 1.5 (SDK 3) and newer, but we
want Android 2.2 (SDK 8) defaults and features. -->
@@ -58,4 +59,3 @@
<uses-configuration android:reqTouchScreen="stylus"
android:reqKeyboardType="qwerty"/>
</manifest>
-
diff --git a/dists/android/README.Android b/dists/android/README.Android
index 550b73bdfa..7fa8c08371 100644
--- a/dists/android/README.Android
+++ b/dists/android/README.Android
@@ -53,4 +53,3 @@ CONTROLS
Menu button: ScummVM menu
Menu button held for 0.5s: Toggle virtual keyboard
Camera or Search button: Right mouse button click
-
diff --git a/dists/android/mkplugin.sh b/dists/android/mkplugin.sh
index f4643132cf..1811fc0475 100755
--- a/dists/android/mkplugin.sh
+++ b/dists/android/mkplugin.sh
@@ -14,4 +14,3 @@ TARGET=$5
PLUGIN_DESC=`sed -n s/add_engine\s$PLUGIN_NAME\s\"\(.\+\)\"\s.*/\1/p` < $CONFIGURE
sed "s|@PLUGIN_NAME@|$PLUGIN_NAME|;s|@PLUGIN_VERSION_CODE@|$PLUGIN_VERSION_CODE|;s|@PLUGIN_DESC@|$PLUGIN_DESC|" < $TEMPLATE > $TARGET
-
diff --git a/dists/android/plugin-manifest.xml b/dists/android/plugin-manifest.xml
index 3fd9e393d0..728beb1de3 100644
--- a/dists/android/plugin-manifest.xml
+++ b/dists/android/plugin-manifest.xml
@@ -3,8 +3,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.inodes.gus.scummvm.plugin.@PLUGIN_NAME@"
android:versionCode="@PLUGIN_VERSION_CODE@"
- android:versionName="1.4.0git"
- android:installLocation="preferExternal">
+ android:versionName="1.5.0git"
+ android:installLocation="preferExternal"
+ android:sharedUserId="org.inodes.gus.scummvm">
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />
@@ -32,4 +33,3 @@
<uses-configuration android:reqTouchScreen="stylus"
android:reqKeyboardType="qwerty"/>
</manifest>
-
diff --git a/dists/android/plugin-manifest.xml.in b/dists/android/plugin-manifest.xml.in
index c941b2f48c..ab0a63a0cf 100644
--- a/dists/android/plugin-manifest.xml.in
+++ b/dists/android/plugin-manifest.xml.in
@@ -4,7 +4,8 @@
package="org.inodes.gus.scummvm.plugin.@PLUGIN_NAME@"
android:versionCode="@PLUGIN_VERSION_CODE@"
android:versionName="@VERSION@"
- android:installLocation="preferExternal">
+ android:installLocation="preferExternal"
+ android:sharedUserId="org.inodes.gus.scummvm">
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />
@@ -32,4 +33,3 @@
<uses-configuration android:reqTouchScreen="stylus"
android:reqKeyboardType="qwerty"/>
</manifest>
-
diff --git a/dists/android/plugin-strings.xml b/dists/android/plugin-strings.xml
index 363503f8d8..ade37e0aca 100644
--- a/dists/android/plugin-strings.xml
+++ b/dists/android/plugin-strings.xml
@@ -4,4 +4,3 @@
<string name="app_name">ScummVM plugin: "@PLUGIN_NAME@"</string>
<string name="app_desc">Game engine for: @PLUGIN_DESC@</string>
</resources>
-
diff --git a/dists/android/res/layout/main.xml b/dists/android/res/layout/main.xml
index b6164edc96..7b633c416d 100644
--- a/dists/android/res/layout/main.xml
+++ b/dists/android/res/layout/main.xml
@@ -10,4 +10,3 @@
android:focusable="true"
android:focusableInTouchMode="true"
/>
-
diff --git a/dists/bada/Icons/mainMenu1.png b/dists/bada/Icons/mainMenu1.png
new file mode 100644
index 0000000000..fe016776ca
--- /dev/null
+++ b/dists/bada/Icons/mainMenu1.png
Binary files differ
diff --git a/dists/bada/Icons/mainMenu2.png b/dists/bada/Icons/mainMenu2.png
new file mode 100644
index 0000000000..1b6c99027b
--- /dev/null
+++ b/dists/bada/Icons/mainMenu2.png
Binary files differ
diff --git a/dists/bada/Icons/splash1.png b/dists/bada/Icons/splash1.png
new file mode 100644
index 0000000000..fa135fe0a1
--- /dev/null
+++ b/dists/bada/Icons/splash1.png
Binary files differ
diff --git a/dists/bada/Icons/splash2.png b/dists/bada/Icons/splash2.png
new file mode 100644
index 0000000000..ad27b535b7
--- /dev/null
+++ b/dists/bada/Icons/splash2.png
Binary files differ
diff --git a/dists/bada/Res/scummmobile/THEMERC b/dists/bada/Res/scummmobile/THEMERC
new file mode 100644
index 0000000000..61fccdb996
--- /dev/null
+++ b/dists/bada/Res/scummmobile/THEMERC
@@ -0,0 +1 @@
+[SCUMMVM_STX0.8.3:ScummVM Mobile Theme:No Author]
diff --git a/dists/bada/Res/scummmobile/checkbox.bmp b/dists/bada/Res/scummmobile/checkbox.bmp
new file mode 100644
index 0000000000..a0b91b569f
--- /dev/null
+++ b/dists/bada/Res/scummmobile/checkbox.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/checkbox_empty.bmp b/dists/bada/Res/scummmobile/checkbox_empty.bmp
new file mode 100644
index 0000000000..89ebdcbf41
--- /dev/null
+++ b/dists/bada/Res/scummmobile/checkbox_empty.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/clR6x12-iso-8859-2.fcc b/dists/bada/Res/scummmobile/clR6x12-iso-8859-2.fcc
new file mode 100644
index 0000000000..042bc5b24d
--- /dev/null
+++ b/dists/bada/Res/scummmobile/clR6x12-iso-8859-2.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/clR6x12-iso-8859-5.fcc b/dists/bada/Res/scummmobile/clR6x12-iso-8859-5.fcc
new file mode 100644
index 0000000000..d8e614211d
--- /dev/null
+++ b/dists/bada/Res/scummmobile/clR6x12-iso-8859-5.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/cursor.bmp b/dists/bada/Res/scummmobile/cursor.bmp
new file mode 100644
index 0000000000..e7bdb60cad
--- /dev/null
+++ b/dists/bada/Res/scummmobile/cursor.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/cursor_small.bmp b/dists/bada/Res/scummmobile/cursor_small.bmp
new file mode 100644
index 0000000000..024a6d0b9b
--- /dev/null
+++ b/dists/bada/Res/scummmobile/cursor_small.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/fixed5x8-iso-8859-2.fcc b/dists/bada/Res/scummmobile/fixed5x8-iso-8859-2.fcc
new file mode 100644
index 0000000000..73bb5fff2d
--- /dev/null
+++ b/dists/bada/Res/scummmobile/fixed5x8-iso-8859-2.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/fixed5x8-iso-8859-5.fcc b/dists/bada/Res/scummmobile/fixed5x8-iso-8859-5.fcc
new file mode 100644
index 0000000000..e70388dd93
--- /dev/null
+++ b/dists/bada/Res/scummmobile/fixed5x8-iso-8859-5.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/helvB14-ASCII.fcc b/dists/bada/Res/scummmobile/helvB14-ASCII.fcc
new file mode 100644
index 0000000000..9e9c97f0a8
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvB14-ASCII.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/helvB14.bdf b/dists/bada/Res/scummmobile/helvB14.bdf
new file mode 100644
index 0000000000..1374758bcc
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvB14.bdf
@@ -0,0 +1,16308 @@
+STARTFONT 2.1
+FONT -Adobe-Helvetica-Bold-R-Normal--20-140-100-100-P-105-ISO10646-1
+SIZE 14 100 100
+FONTBOUNDINGBOX 22 29 -2 -7
+COMMENT ISO10646-1 extension by Markus Kuhn <mkuhn@acm.org>, 2001-03-20
+COMMENT
+COMMENT +
+COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated.
+COMMENT Copyright 1988, 1994 Digital Equipment Corporation.
+COMMENT
+COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be
+COMMENT registered in certain jurisdictions.
+COMMENT Permission to use these trademarks is hereby granted only in
+COMMENT association with the images described in this file.
+COMMENT
+COMMENT Permission to use, copy, modify, distribute and sell this software
+COMMENT and its documentation for any purpose and without fee is hereby
+COMMENT granted, provided that the above copyright notices appear in all
+COMMENT copies and that both those copyright notices and this permission
+COMMENT notice appear in supporting documentation, and that the names of
+COMMENT Adobe Systems and Digital Equipment Corporation not be used in
+COMMENT advertising or publicity pertaining to distribution of the software
+COMMENT without specific, written prior permission. Adobe Systems and
+COMMENT Digital Equipment Corporation make no representations about the
+COMMENT suitability of this software for any purpose. It is provided "as
+COMMENT is" without express or implied warranty.
+COMMENT -
+STARTPROPERTIES 26
+FOUNDRY "Adobe"
+FAMILY_NAME "Helvetica"
+WEIGHT_NAME "Bold"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 20
+POINT_SIZE 140
+RESOLUTION_X 100
+RESOLUTION_Y 100
+SPACING "P"
+AVERAGE_WIDTH 105
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+CAP_HEIGHT 14
+X_HEIGHT 10
+FONT_ASCENT 16
+FONT_DESCENT 5
+FACE_NAME "Helvetica Bold"
+COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved."
+NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. "
+_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold"
+DEFAULT_CHAR 0
+RELATIVE_SETWIDTH 50
+RELATIVE_WEIGHT 70
+FULL_NAME "Helvetica Bold"
+ENDPROPERTIES
+CHARS 756
+STARTCHAR char0
+ENCODING 0
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 11 13 1 0
+BITMAP
+AAA0
+0000
+8020
+0000
+8020
+0000
+8020
+0000
+8020
+0000
+8020
+0000
+AAA0
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 3 14 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+C0
+C0
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 474 0
+DWIDTH 7 0
+BBX 5 5 1 9
+BITMAP
+D8
+D8
+D8
+D8
+90
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+0D80
+0D80
+0D80
+7FE0
+7FE0
+1B00
+1B00
+1B00
+FFC0
+FFC0
+3600
+3600
+3600
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 10 16 0 -2
+BITMAP
+0400
+3F00
+7F80
+E580
+E400
+E400
+7C00
+3F00
+0F80
+09C0
+E9C0
+E9C0
+7F80
+3F00
+0800
+0800
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 889 0
+DWIDTH 16 0
+BBX 13 13 1 0
+BITMAP
+7860
+FC60
+CCC0
+CC80
+FD80
+7B00
+0200
+06F0
+0DF8
+0998
+1998
+31F8
+30F0
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 14 1 0
+BITMAP
+1E00
+3F00
+7380
+6180
+7300
+3E00
+1C60
+7E60
+E7E0
+C3C0
+C1C0
+E3E0
+7F70
+3E38
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 238 0
+DWIDTH 4 0
+BBX 2 5 1 9
+BITMAP
+C0
+C0
+C0
+C0
+80
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 18 1 -4
+BITMAP
+1C
+38
+30
+70
+60
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+60
+70
+30
+38
+1C
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 18 0 -4
+BITMAP
+E0
+70
+30
+38
+18
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+18
+38
+30
+70
+E0
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 389 0
+DWIDTH 9 0
+BBX 7 6 1 8
+BITMAP
+10
+D6
+7C
+38
+6C
+44
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 8 8 1 1
+BITMAP
+18
+18
+18
+FF
+FF
+18
+18
+18
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 6 1 -3
+BITMAP
+E0
+E0
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 5 3 0 4
+BITMAP
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 3 1 0
+BITMAP
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 14 0 0
+BITMAP
+18
+18
+18
+38
+30
+30
+30
+70
+60
+60
+E0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+1C00
+7F00
+7700
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+7700
+7F00
+1C00
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 6 13 1 0
+BITMAP
+1C
+3C
+FC
+FC
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+3E00
+7F00
+E380
+E380
+0380
+0700
+1F00
+3E00
+7800
+7000
+E000
+FF80
+FF80
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+3E00
+7F00
+E700
+E300
+0700
+1E00
+1F00
+0780
+0380
+E380
+E780
+7F00
+3E00
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+0700
+0F00
+1F00
+3F00
+3700
+7700
+6700
+E700
+FF80
+FF80
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+FF00
+FF00
+E000
+E000
+FE00
+FF00
+E780
+0380
+0380
+E380
+E780
+FF00
+7E00
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+3F00
+7F80
+7180
+E000
+EE00
+FF00
+F380
+E180
+E180
+E180
+F380
+7F00
+3E00
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+FF80
+FF80
+0380
+0700
+0E00
+0E00
+1C00
+1C00
+3800
+3800
+7000
+7000
+7000
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+3E00
+7F00
+E380
+E380
+E380
+7F00
+3E00
+7700
+E380
+E380
+E380
+7F00
+3E00
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+3E00
+7F00
+E780
+C380
+C380
+C380
+E780
+7F80
+3B80
+0380
+C700
+FF00
+7E00
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 3 10 1 0
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 3 13 1 -3
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+E0
+E0
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 9 1 0
+BITMAP
+0380
+0F80
+3E00
+7800
+E000
+7800
+3E00
+0F80
+0380
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 5 1 3
+BITMAP
+FF80
+FF80
+0000
+FF80
+FF80
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 9 1 0
+BITMAP
+E000
+F800
+3E00
+0F00
+0380
+0F00
+3E00
+F800
+E000
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 611 0
+DWIDTH 10 0
+BBX 8 14 1 0
+BITMAP
+7E
+FF
+E7
+E7
+0E
+1E
+1C
+38
+38
+38
+00
+38
+38
+38
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 975 0
+DWIDTH 18 0
+BBX 16 17 1 -3
+BITMAP
+07F0
+1FFC
+3C1E
+7006
+63B7
+E7F3
+C663
+CC63
+CCC3
+CCC6
+CCC6
+EFFC
+E7B8
+7000
+3C00
+1FF0
+07F0
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 11 14 2 0
+BITMAP
+FE00
+FF80
+E3C0
+E1C0
+E1C0
+E380
+FF80
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E000
+E000
+F070
+7070
+78E0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E070
+E070
+E070
+E070
+E070
+E070
+E0E0
+E1E0
+FFC0
+FF00
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 14 2 0
+BITMAP
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 14 1 0
+BITMAP
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 14 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 14 0 0
+BITMAP
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+E380
+E380
+F780
+7F00
+3E00
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 14 1 0
+BITMAP
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 833 0
+DWIDTH 16 0
+BBX 14 14 1 0
+BITMAP
+E01C
+E01C
+F03C
+F03C
+F87C
+F87C
+F87C
+ECDC
+ECDC
+ECDC
+E79C
+E79C
+E31C
+E31C
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 14 1 0
+BITMAP
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 15 1 -1
+BITMAP
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F378
+73F0
+79F0
+3FE0
+0FF0
+0030
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 14 0 0
+BITMAP
+E038
+E038
+7070
+7070
+3060
+38E0
+38E0
+1DC0
+1DC0
+0D80
+0F80
+0F80
+0700
+0700
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 14 1 0
+BITMAP
+E38E
+E38E
+E38E
+E38E
+739C
+739C
+739C
+76DC
+36D8
+36D8
+3EF8
+1C70
+1C70
+1C70
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 667 0
+DWIDTH 12 0
+BBX 12 14 0 0
+BITMAP
+E070
+E070
+70E0
+79E0
+1980
+1F80
+0F00
+1F80
+1980
+39C0
+70E0
+70E0
+E070
+E070
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 14 0 0
+BITMAP
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+FFC0
+FFC0
+01C0
+0380
+0700
+0700
+0E00
+1C00
+3800
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 5 18 1 -4
+BITMAP
+F8
+F8
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+F8
+F8
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 14 0 0
+BITMAP
+C0
+C0
+C0
+E0
+60
+60
+60
+70
+30
+30
+38
+18
+18
+18
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 5 18 0 -4
+BITMAP
+F8
+F8
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+F8
+F8
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 584 0
+DWIDTH 10 0
+BBX 10 7 0 6
+BITMAP
+0C00
+1E00
+1E00
+3300
+7380
+6180
+E1C0
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 10 2 0 -4
+BITMAP
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 5 3 0 11
+BITMAP
+E0
+70
+38
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 10 1 0
+BITMAP
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+1E00
+7F80
+7380
+E000
+E000
+E000
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+01C0
+01C0
+01C0
+01C0
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 14 0 0
+BITMAP
+1E
+3E
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 -4
+BITMAP
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 14 1 0
+BITMAP
+E0
+E0
+E0
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 18 -1 -4
+BITMAP
+38
+38
+38
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+F8
+F0
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 14 1 0
+BITMAP
+E000
+E000
+E000
+E000
+E700
+EE00
+FC00
+F800
+F800
+FC00
+EE00
+E700
+E780
+E380
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 14 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 889 0
+DWIDTH 17 0
+BBX 15 10 1 0
+BITMAP
+EF3C
+FFFE
+F3CE
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 10 1 0
+BITMAP
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 -4
+BITMAP
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 -4
+BITMAP
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+01C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+EC
+FC
+FC
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 13 0 0
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 556 0
+DWIDTH 9 0
+BBX 9 10 0 0
+BITMAP
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 10 0 0
+BITMAP
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+E380
+E380
+7700
+3E00
+1C00
+3E00
+7700
+7700
+E380
+E380
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 10 1 0
+BITMAP
+FF
+FF
+07
+0E
+1C
+38
+70
+E0
+FF
+FF
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 389 0
+DWIDTH 8 0
+BBX 7 18 1 -4
+BITMAP
+0E
+1C
+38
+38
+38
+38
+38
+70
+E0
+70
+38
+38
+38
+38
+38
+38
+1C
+0E
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 280 0
+DWIDTH 5 0
+BBX 2 18 1 -4
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 389 0
+DWIDTH 8 0
+BBX 7 18 0 -4
+BITMAP
+E0
+70
+38
+38
+38
+38
+38
+1C
+0E
+1C
+38
+38
+38
+38
+38
+38
+70
+E0
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 3 1 4
+BITMAP
+7980
+FF80
+CF00
+ENDCHAR
+STARTCHAR space
+ENCODING 160
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 3 14 2 -4
+BITMAP
+E0
+E0
+E0
+00
+60
+60
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 8 14 1 -2
+BITMAP
+02
+02
+3E
+7F
+E7
+C8
+C8
+D0
+D0
+E3
+7F
+7E
+40
+40
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 13 0 0
+BITMAP
+1F00
+3FC0
+71C0
+7000
+7000
+3800
+7F00
+1C00
+1C00
+3800
+70C0
+FFC0
+EF80
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 8 1 2
+BITMAP
+C180
+FF80
+7700
+6300
+6300
+7700
+FF80
+C180
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+E380
+E380
+E380
+7700
+7700
+3E00
+FF80
+1C00
+FF80
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 280 0
+DWIDTH 5 0
+BBX 2 18 1 -4
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 18 0 -4
+BITMAP
+3E00
+7F00
+E380
+E380
+F000
+7C00
+FE00
+C700
+C380
+E180
+7180
+3F80
+0F00
+0780
+E380
+E380
+7F00
+3E00
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 5 2 1 12
+BITMAP
+D8
+D8
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 737 0
+DWIDTH 15 0
+BBX 14 14 1 0
+BITMAP
+0FC0
+3870
+6018
+C78C
+CFCC
+98C4
+9804
+9804
+9844
+CFCC
+C78C
+6018
+3870
+0FC0
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 370 0
+DWIDTH 8 0
+BBX 6 9 1 5
+BITMAP
+78
+8C
+7C
+CC
+CC
+74
+00
+FC
+FC
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 8 0 1
+BITMAP
+1DC0
+3B80
+7700
+EE00
+EE00
+7700
+3B80
+1DC0
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 5 1 3
+BITMAP
+FF80
+FF80
+0180
+0180
+0180
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 173
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 5 3 0 4
+BITMAP
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 737 0
+DWIDTH 15 0
+BBX 13 14 1 0
+BITMAP
+0F80
+3060
+6010
+5F90
+99C8
+98C8
+99C8
+9F08
+9988
+9988
+58D0
+6030
+38E0
+0F80
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 5 2 1 12
+BITMAP
+F8
+F8
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 400 0
+DWIDTH 7 0
+BBX 6 6 0 7
+BITMAP
+78
+FC
+CC
+CC
+FC
+78
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 9 1 0
+BITMAP
+1C00
+1C00
+FF80
+FF80
+1C00
+1C00
+0000
+FF80
+FF80
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 8 0 5
+BITMAP
+78
+FC
+CC
+1C
+78
+E0
+FC
+FC
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 8 0 5
+BITMAP
+78
+FC
+CC
+38
+3C
+CC
+FC
+78
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 5 3 0 11
+BITMAP
+38
+70
+E0
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+FB80
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 18 0 -4
+BITMAP
+3F80
+7B00
+FB00
+FB00
+FB00
+FB00
+FB00
+7B00
+3B00
+1B00
+1B00
+1B00
+1B00
+1B00
+1B00
+1B00
+1B00
+1B00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 2 2 1 6
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 5 5 1 -5
+BITMAP
+60
+70
+18
+F8
+F0
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 4 8 0 5
+BITMAP
+30
+F0
+F0
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 365 0
+DWIDTH 8 0
+BBX 6 9 1 5
+BITMAP
+78
+CC
+CC
+CC
+CC
+78
+00
+FC
+FC
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 8 0 1
+BITMAP
+EE00
+7700
+3B80
+1DC0
+1DC0
+3B80
+7700
+EE00
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 834 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+3060
+F060
+F0C0
+30C0
+3180
+3198
+3338
+3638
+0678
+0CD8
+0CFC
+1818
+1818
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 834 0
+DWIDTH 15 0
+BBX 15 13 0 0
+BITMAP
+3060
+F060
+F0C0
+30C0
+3180
+31BC
+337E
+3666
+060E
+0C3C
+0C70
+187E
+187E
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 834 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+7830
+FC30
+CC60
+3860
+3CC0
+CCD8
+FDB8
+7B38
+0378
+06D8
+06FC
+0C18
+0C18
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 611 0
+DWIDTH 10 0
+BBX 8 14 1 -4
+BITMAP
+1C
+1C
+1C
+00
+1C
+1C
+1C
+38
+78
+70
+E7
+E7
+FF
+7E
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+3800
+1C00
+0600
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+01C0
+0380
+0600
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0E20
+1FC0
+2380
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1980
+1980
+1980
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0F00
+1980
+1980
+0F00
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 1000 0
+DWIDTH 18 0
+BBX 16 14 1 0
+BITMAP
+0FFF
+0FFF
+1F80
+1B80
+3B80
+3B80
+33FE
+73FE
+7380
+7F80
+FF80
+E380
+E3FF
+E3FF
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E000
+E000
+F070
+7070
+78E0
+3FE0
+0F80
+0C00
+0E00
+0300
+1F00
+1E00
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+3800
+1C00
+0600
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+0380
+0700
+0C00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+0E00
+1F00
+3B80
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+3300
+3300
+3300
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 18 -1 0
+BITMAP
+E0
+70
+18
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 18 1 0
+BITMAP
+38
+70
+C0
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 0
+BITMAP
+38
+7C
+EE
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 6 18 0 0
+BITMAP
+CC
+CC
+CC
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 14 -1 0
+BITMAP
+3FC0
+3FF0
+3878
+3838
+381C
+381C
+FF1C
+FF1C
+381C
+381C
+3838
+3878
+3FF0
+3FC0
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0E20
+1FC0
+2380
+0000
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+1C00
+0E00
+0300
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+01C0
+0380
+0600
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+0710
+0FE0
+11C0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+0CC0
+0CC0
+0CC0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 10 8 0 1
+BITMAP
+E1C0
+7380
+3F00
+1E00
+1E00
+3F00
+7380
+E1C0
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 14 0 0
+BITMAP
+07C6
+1FFC
+3C38
+3878
+78DC
+719C
+711C
+731C
+761C
+7C3C
+3838
+3C78
+7FF0
+C7C0
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1C00
+0E00
+0300
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+01C0
+0380
+0600
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1980
+1980
+1980
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 18 0 0
+BITMAP
+01C0
+0380
+0600
+0000
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+E000
+E000
+E000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 611 0
+DWIDTH 10 0
+BBX 8 14 1 0
+BITMAP
+3C
+7E
+E7
+E7
+E7
+E7
+EE
+EE
+E7
+E7
+E7
+E7
+EF
+EE
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+7000
+3800
+0C00
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+0380
+0700
+0C00
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+1C00
+3E00
+7700
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+3300
+3300
+3300
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+3C00
+6600
+6600
+3C00
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 889 0
+DWIDTH 16 0
+BBX 14 10 1 0
+BITMAP
+3DF0
+7FF8
+671C
+0F1C
+3FFC
+7700
+E700
+EF9C
+FFFC
+79F0
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 15 1 -5
+BITMAP
+1E00
+7F80
+7380
+E000
+E000
+E000
+E000
+7380
+7F80
+1E00
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+7000
+3800
+0C00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0380
+0700
+0C00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+1C00
+3E00
+7700
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3300
+3300
+3300
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 14 -1 0
+BITMAP
+E0
+70
+18
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 14 1 0
+BITMAP
+38
+70
+C0
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 14 -1 0
+BITMAP
+38
+7C
+EE
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 14 0 0
+BITMAP
+D8
+D8
+D8
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+6000
+3700
+3C00
+6600
+1F00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+7000
+3800
+0C00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+0380
+0700
+0C00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+1C00
+3E00
+7700
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+3300
+3300
+3300
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 8 1 1
+BITMAP
+1C00
+1C00
+0000
+FF80
+FF80
+0000
+1C00
+1C00
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 12 10 0 0
+BITMAP
+0F30
+3FE0
+39C0
+73E0
+77E0
+7EE0
+7CE0
+39C0
+7FC0
+CF00
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+7000
+3800
+0C00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0380
+0700
+0C00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+1C00
+3E00
+7700
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3300
+3300
+3300
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 -4
+BITMAP
+0700
+0E00
+1800
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -4
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 -4
+BITMAP
+3300
+3300
+3300
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0F80
+0F80
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+3E00
+3E00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+18C0
+1DC0
+0F80
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+6300
+7700
+3E00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+0700
+0E00
+1C00
+1F80
+0F00
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 15 1 -5
+BITMAP
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+0E00
+1C00
+3800
+3F00
+1E00
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E000
+E000
+F070
+7070
+78E0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+1E00
+7F80
+7380
+E000
+E000
+E000
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E000
+E000
+F070
+7070
+78E0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+1C00
+3E00
+7700
+0000
+1E00
+7F80
+7380
+E000
+E000
+E000
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0600
+0600
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E000
+E000
+F070
+7070
+78E0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+0C00
+0C00
+0000
+1E00
+7F80
+7380
+E000
+E000
+E000
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1DC0
+0F80
+0700
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E000
+E000
+F070
+7070
+78E0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+7700
+3E00
+1C00
+0000
+1E00
+7F80
+7380
+E000
+E000
+E000
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+3B80
+1F00
+0E00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E070
+E070
+E070
+E070
+E070
+E070
+E0E0
+E1E0
+FFC0
+FF00
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 858 0
+DWIDTH 16 0
+BBX 14 14 1 0
+BITMAP
+01DC
+01DC
+01CC
+01CC
+3DD8
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+ENDCHAR
+STARTCHAR Dcroat
+ENCODING 272
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 14 -1 0
+BITMAP
+3FC0
+3FF0
+3878
+3838
+381C
+381C
+FF1C
+FF1C
+381C
+381C
+3838
+3878
+3FF0
+3FC0
+ENDCHAR
+STARTCHAR dcroat
+ENCODING 273
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+01C0
+01C0
+03C0
+03C0
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 17 2 0
+BITMAP
+3E00
+3E00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+3E00
+3E00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+6300
+7700
+3E00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+6300
+7700
+3E00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 17 2 0
+BITMAP
+1800
+1800
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+0C00
+0C00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 19 2 -5
+BITMAP
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+1C00
+3800
+7000
+7E00
+3C00
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 15 1 -5
+BITMAP
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+0E00
+1C00
+3800
+3F00
+1E00
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+7700
+3E00
+1C00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+7700
+3E00
+1C00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 18 1 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -4
+BITMAP
+0E00
+1F00
+3B80
+0000
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 18 1 0
+BITMAP
+18C0
+1DC0
+0F80
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -4
+BITMAP
+3180
+3B80
+1F00
+0000
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 17 1 0
+BITMAP
+0600
+0600
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -4
+BITMAP
+0C00
+0C00
+0000
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 21 1 -7
+BITMAP
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+0000
+0700
+0700
+0700
+0300
+0600
+0400
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 20 1 -4
+BITMAP
+0600
+0C00
+0C00
+0E00
+0E00
+0000
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 10 18 0 0
+BITMAP
+3800
+7C00
+EE00
+0000
+7000
+7000
+7000
+7000
+7780
+7FC0
+79C0
+71C0
+71C0
+71C0
+71C0
+71C0
+71C0
+71C0
+ENDCHAR
+STARTCHAR Hbar
+ENCODING 294
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR hbar
+ENCODING 295
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+E000
+E000
+F000
+F000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 0
+BITMAP
+76
+FE
+DC
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 14 -1 0
+BITMAP
+76
+FE
+DC
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 17 0 0
+BITMAP
+F8
+F8
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 13 0 0
+BITMAP
+F8
+F8
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 0
+BITMAP
+C6
+EE
+7C
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 14 -1 0
+BITMAP
+C6
+EE
+7C
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 6 19 0 -5
+BITMAP
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+38
+70
+E0
+FC
+78
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 6 19 0 -5
+BITMAP
+70
+70
+70
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+38
+70
+E0
+FC
+78
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 17 1 0
+BITMAP
+60
+60
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 10 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 820 0
+DWIDTH 15 0
+BBX 13 14 1 0
+BITMAP
+E038
+E038
+E038
+E038
+E038
+E038
+E038
+E038
+E038
+EE38
+EE38
+EF78
+E7F0
+E3E0
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 542 0
+DWIDTH 10 0
+BBX 8 18 1 -4
+BITMAP
+E7
+E7
+E7
+00
+E7
+E7
+E7
+E7
+E7
+E7
+E7
+E7
+E7
+E7
+07
+07
+1F
+1E
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 10 18 0 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+E380
+E380
+F780
+7F00
+3E00
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 -4
+BITMAP
+38
+7C
+EE
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+F8
+F0
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 21 1 -7
+BITMAP
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+0000
+0700
+0700
+0700
+0300
+0600
+0400
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 21 1 -7
+BITMAP
+E000
+E000
+E000
+E000
+E700
+EE00
+FC00
+F800
+F800
+FC00
+EE00
+E700
+E780
+E380
+0000
+1C00
+1C00
+1C00
+0C00
+1800
+1000
+ENDCHAR
+STARTCHAR kgreenlandic
+ENCODING 312
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 10 1 0
+BITMAP
+E700
+EE00
+FC00
+F800
+F800
+FC00
+EE00
+E700
+E780
+E380
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+1C00
+3800
+7000
+0000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 18 1 0
+BITMAP
+38
+70
+E0
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 21 1 -7
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+0000
+1C00
+1C00
+1C00
+0C00
+1800
+1000
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 21 1 -7
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+E0
+E0
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 858 0
+DWIDTH 15 0
+BBX 13 14 1 0
+BITMAP
+E038
+E038
+E018
+E018
+E030
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 542 0
+DWIDTH 10 0
+BBX 8 14 1 0
+BITMAP
+E7
+E7
+E3
+E3
+E6
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 858 0
+DWIDTH 15 0
+BBX 12 14 1 0
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E030
+E030
+E000
+E000
+E000
+E000
+FF80
+FF80
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 542 0
+DWIDTH 10 0
+BBX 7 14 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E6
+E6
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+7000
+7000
+7000
+7000
+7600
+7E00
+F800
+F000
+7000
+7000
+7000
+7000
+7FC0
+7FC0
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 14 0 0
+BITMAP
+70
+70
+70
+70
+70
+78
+F8
+F0
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 21 1 -7
+BITMAP
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+0000
+0700
+0700
+0700
+0300
+0600
+0400
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 -7
+BITMAP
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0000
+1C00
+1C00
+1C00
+0C00
+1800
+1000
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+3B80
+1F00
+0E00
+0000
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+7700
+3E00
+1C00
+0000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 875 0
+DWIDTH 16 0
+BBX 14 14 1 0
+BITMAP
+E000
+E000
+6000
+6000
+C778
+07FC
+079C
+071C
+071C
+071C
+071C
+071C
+071C
+071C
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 -4
+BITMAP
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+0070
+0070
+01F0
+01E0
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0380
+0380
+0F80
+0F00
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 17 1 0
+BITMAP
+0F80
+0F80
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 13 1 0
+BITMAP
+1F00
+1F00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+18C0
+1DC0
+0F80
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+3180
+3B80
+1F00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+0360
+06C0
+0D80
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+0D80
+1B00
+3600
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 1000 0
+DWIDTH 19 0
+BBX 17 14 1 0
+BITMAP
+0FFF80
+3FFF80
+79E000
+70E000
+F0E000
+E0E000
+E0FF00
+E0FF00
+E0E000
+F0E000
+70E000
+79E000
+3FFF80
+0FFF80
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 944 0
+DWIDTH 18 0
+BBX 16 10 1 0
+BITMAP
+3F7C
+7FFE
+73C7
+E1C7
+E1FF
+E1C0
+E1C0
+73E7
+7FFF
+3F7C
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+1C
+38
+70
+00
+EC
+FC
+FC
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 21 1 -7
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+0000
+0E00
+0E00
+0E00
+0600
+0C00
+0800
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 17 1 -7
+BITMAP
+EC
+FC
+FC
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+70
+70
+70
+30
+60
+40
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+3B80
+1F00
+0E00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 7 14 0 0
+BITMAP
+EE
+7C
+38
+00
+76
+7E
+7E
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 18 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 18 1 0
+BITMAP
+0E00
+1F00
+3B80
+0000
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+1C00
+3E00
+7700
+0000
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 19 1 -5
+BITMAP
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0C00
+0E00
+0300
+1F00
+1E00
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 15 1 -5
+BITMAP
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 667 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+7700
+3E00
+1C00
+0000
+3F00
+7F80
+E380
+F800
+7E00
+1F80
+E3C0
+F3C0
+7F80
+3F00
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 8 14 1 0
+BITMAP
+77
+3E
+1C
+00
+1E
+7F
+E7
+E0
+FE
+3F
+07
+E7
+FE
+78
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 354
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 19 0 -5
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0C00
+0E00
+0300
+1F00
+1E00
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 355
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 18 0 -5
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+30
+38
+0C
+7C
+78
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 18 0 0
+BITMAP
+3B80
+1F00
+0E00
+0000
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 594 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+01C0
+71C0
+70C0
+70C0
+FD80
+FC00
+7000
+7000
+7000
+7000
+7000
+7000
+7C00
+3C00
+ENDCHAR
+STARTCHAR Tbar
+ENCODING 358
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR tbar
+ENCODING 359
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 13 0 0
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+78
+78
+70
+70
+7C
+3C
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0F80
+0F80
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+3E00
+3E00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+18C0
+1DC0
+0F80
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+6300
+7700
+3E00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0F00
+1980
+1980
+0F00
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 15 1 0
+BITMAP
+1E00
+3300
+3300
+1E00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+06C0
+0D80
+1B00
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0D80
+1B00
+3600
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+0700
+0E00
+1C00
+1F80
+0F00
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 15 1 -5
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+0E00
+1C00
+3800
+3F00
+1E00
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 18 1 0
+BITMAP
+0380
+07C0
+0EE0
+0000
+E38E
+E38E
+E38E
+E38E
+739C
+739C
+739C
+76DC
+36D8
+36D8
+3EF8
+1C70
+1C70
+1C70
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 14 0 0
+BITMAP
+0380
+07C0
+0EE0
+0000
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 18 0 0
+BITMAP
+0700
+0F80
+1DC0
+0000
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 -4
+BITMAP
+1C00
+3E00
+7700
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 13 1 0
+BITMAP
+1B00
+1B00
+0000
+E0E0
+60C0
+71C0
+3180
+1B00
+1F00
+0E00
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+FFC0
+FFC0
+01C0
+0380
+0700
+0700
+0E00
+1C00
+3800
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 14 1 0
+BITMAP
+0E
+1C
+38
+00
+FF
+FF
+07
+0E
+1C
+38
+70
+E0
+FF
+FF
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+0C00
+0C00
+0000
+FFC0
+FFC0
+01C0
+0380
+0700
+0700
+0E00
+1C00
+3800
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 13 1 0
+BITMAP
+18
+18
+00
+FF
+FF
+07
+0E
+1C
+38
+70
+E0
+FF
+FF
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+7700
+3E00
+1C00
+0000
+FF80
+FF80
+0700
+0E00
+1C00
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 14 1 0
+BITMAP
+EE
+7C
+38
+00
+FF
+FF
+07
+0E
+1C
+38
+70
+E0
+FF
+FF
+ENDCHAR
+STARTCHAR uni0186
+ENCODING 390
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+1F00
+7FC0
+71E0
+E0E0
+E0F0
+0070
+0070
+0070
+0070
+E0F0
+E0E0
+71E0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR uni0189
+ENCODING 393
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 14 -1 0
+BITMAP
+3FC0
+3FF0
+3878
+3838
+381C
+381C
+FF1C
+FF1C
+381C
+381C
+3838
+3878
+3FF0
+3FC0
+ENDCHAR
+STARTCHAR uni018E
+ENCODING 398
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 14 2 0
+BITMAP
+FFC0
+FFC0
+01C0
+01C0
+01C0
+01C0
+7FC0
+7FC0
+01C0
+01C0
+01C0
+01C0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR florin
+ENCODING 402
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 10 17 -1 -4
+BITMAP
+03C0
+07C0
+0E00
+0E00
+7F80
+7F80
+1C00
+1C00
+1C00
+1C00
+1C00
+3800
+3800
+3800
+3800
+F000
+E000
+ENDCHAR
+STARTCHAR uni0197
+ENCODING 407
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 14 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni019A
+ENCODING 410
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 14 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni019D
+ENCODING 413
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 18 -1 -4
+BITMAP
+381C
+3C1C
+3C1C
+3E1C
+3F1C
+3B1C
+3B9C
+399C
+39DC
+38DC
+387C
+387C
+383C
+381C
+3800
+3800
+F800
+F000
+ENDCHAR
+STARTCHAR uni019F
+ENCODING 415
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 14 1 0
+BITMAP
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+FFF8
+FFF8
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Ohorn
+ENCODING 416
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 14 1 0
+BITMAP
+0F8E
+3FEE
+78F6
+7076
+F07C
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR ohorn
+ENCODING 417
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 12 10 1 0
+BITMAP
+1E70
+7FF0
+73B0
+E1F0
+E1E0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni01A7
+ENCODING 423
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+3F80
+7FC0
+F1E0
+E0E0
+01E0
+0FC0
+3F80
+7E00
+F000
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR uni01A8
+ENCODING 424
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+7E00
+FF00
+E380
+0380
+7F80
+FE00
+E000
+E380
+7F80
+3F00
+ENDCHAR
+STARTCHAR uni01AE
+ENCODING 430
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 18 0 -4
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0F80
+0780
+ENDCHAR
+STARTCHAR Uhorn
+ENCODING 431
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 14 1 0
+BITMAP
+E07C
+E07C
+E07C
+E07C
+E078
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uhorn
+ENCODING 432
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 10 1 0
+BITMAP
+E3E0
+E3E0
+E3E0
+E3E0
+E3C0
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni01B5
+ENCODING 437
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+FFC0
+FFC0
+01C0
+0380
+0700
+0700
+0E00
+1E00
+3800
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni01B6
+ENCODING 438
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 10 1 0
+BITMAP
+FF
+FF
+07
+0E
+1C
+3C
+70
+E0
+FF
+FF
+ENDCHAR
+STARTCHAR uni01BB
+ENCODING 443
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+3E00
+7F00
+E380
+E380
+0380
+FF80
+FF80
+3E00
+7800
+7000
+E000
+FF80
+FF80
+ENDCHAR
+STARTCHAR uni01BC
+ENCODING 444
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 13 0 0
+BITMAP
+FF00
+FF00
+E000
+E000
+FE00
+FF00
+E780
+0380
+0380
+E380
+E780
+FF00
+7E00
+ENDCHAR
+STARTCHAR uni01C0
+ENCODING 448
+SWIDTH 280 0
+DWIDTH 5 0
+BBX 2 18 1 -4
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni01C2
+ENCODING 450
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 18 1 -3
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+FF80
+FF80
+0C00
+FF80
+FF80
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni01C3
+ENCODING 451
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 3 14 1 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+C0
+C0
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni01CD
+ENCODING 461
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1DC0
+0F80
+0700
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni01CE
+ENCODING 462
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+7700
+3E00
+1C00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni01CF
+ENCODING 463
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 0
+BITMAP
+EE
+7C
+38
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni01D0
+ENCODING 464
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 14 -1 0
+BITMAP
+EE
+7C
+38
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni01D1
+ENCODING 465
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+1DC0
+0F80
+0700
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni01D2
+ENCODING 466
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+3B80
+1F00
+0E00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni01D3
+ENCODING 467
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1DC0
+0F80
+0700
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni01D4
+ENCODING 468
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+7700
+3E00
+1C00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni01D5
+ENCODING 469
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 21 1 0
+BITMAP
+0F80
+0F80
+0000
+1980
+1980
+1980
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni01D6
+ENCODING 470
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 0
+BITMAP
+3E00
+3E00
+0000
+3300
+3300
+3300
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni01D7
+ENCODING 471
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+1980
+1980
+1980
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni01D8
+ENCODING 472
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+3300
+3300
+3300
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni01D9
+ENCODING 473
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+1DC0
+0F80
+0700
+0000
+1980
+1980
+1980
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni01DA
+ENCODING 474
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+7700
+3E00
+1C00
+0000
+3300
+3300
+3300
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni01DB
+ENCODING 475
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+1980
+1980
+1980
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni01DC
+ENCODING 476
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+3800
+1C00
+0E00
+0000
+3300
+3300
+3300
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni01DD
+ENCODING 477
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+3C00
+FF00
+E700
+0380
+FF80
+FF80
+C380
+E700
+7F00
+3C00
+ENDCHAR
+STARTCHAR uni01DE
+ENCODING 478
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 21 1 0
+BITMAP
+0F80
+0F80
+0000
+1980
+1980
+1980
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni01DF
+ENCODING 479
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 17 1 0
+BITMAP
+1F00
+1F00
+0000
+3300
+3300
+3300
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni01E0
+ENCODING 480
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 20 1 0
+BITMAP
+0F80
+0F80
+0000
+0600
+0600
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni01E1
+ENCODING 481
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 16 1 0
+BITMAP
+3E00
+3E00
+0000
+0C00
+0C00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni01E2
+ENCODING 482
+SWIDTH 1000 0
+DWIDTH 18 0
+BBX 16 17 1 0
+BITMAP
+03E0
+03E0
+0000
+0FFF
+0FFF
+1F80
+1B80
+3B80
+3B80
+33FE
+73FE
+7380
+7F80
+FF80
+E380
+E3FF
+E3FF
+ENDCHAR
+STARTCHAR uni01E3
+ENCODING 483
+SWIDTH 889 0
+DWIDTH 16 0
+BBX 14 13 1 0
+BITMAP
+07C0
+07C0
+0000
+3DF0
+7FF8
+671C
+0F1C
+3FFC
+7700
+E700
+EF9C
+FFFC
+79F0
+ENDCHAR
+STARTCHAR uni01E4
+ENCODING 484
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 14 1 0
+BITMAP
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR uni01E5
+ENCODING 485
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 -4
+BITMAP
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+FFC0
+FFC0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR Gcaron
+ENCODING 486
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 18 1 0
+BITMAP
+1DC0
+0F80
+0700
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR gcaron
+ENCODING 487
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -4
+BITMAP
+3B80
+1F00
+0E00
+0000
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni01E8
+ENCODING 488
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 18 1 0
+BITMAP
+3B80
+1F00
+0E00
+0000
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+ENDCHAR
+STARTCHAR uni01E9
+ENCODING 489
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 10 18 0 0
+BITMAP
+EE00
+7C00
+3800
+0000
+7000
+7000
+7000
+7000
+7380
+7700
+7E00
+7C00
+7C00
+7E00
+7700
+7380
+73C0
+71C0
+ENDCHAR
+STARTCHAR uni01EA
+ENCODING 490
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 19 1 -5
+BITMAP
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+0380
+0700
+0E00
+0FC0
+0780
+ENDCHAR
+STARTCHAR uni01EB
+ENCODING 491
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 15 1 -5
+BITMAP
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+0E00
+1C00
+3800
+3F00
+1E00
+ENDCHAR
+STARTCHAR uni01EC
+ENCODING 492
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 22 1 -5
+BITMAP
+0F80
+0F80
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+0380
+0700
+0E00
+0FC0
+0780
+ENDCHAR
+STARTCHAR uni01ED
+ENCODING 493
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -5
+BITMAP
+1F00
+1F00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+0E00
+1C00
+3800
+3F00
+1E00
+ENDCHAR
+STARTCHAR uni01F0
+ENCODING 496
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 -4
+BITMAP
+EE
+7C
+38
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+F8
+F0
+ENDCHAR
+STARTCHAR uni01F4
+ENCODING 500
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 18 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR uni01F5
+ENCODING 501
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -4
+BITMAP
+0380
+0700
+0E00
+0000
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni01F8
+ENCODING 504
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+ENDCHAR
+STARTCHAR uni01F9
+ENCODING 505
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+7000
+3800
+1C00
+0000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR Aringacute
+ENCODING 506
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+0F00
+1980
+1980
+0F00
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR aringacute
+ENCODING 507
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+3C00
+6600
+6600
+3C00
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR AEacute
+ENCODING 508
+SWIDTH 1000 0
+DWIDTH 18 0
+BBX 16 18 1 0
+BITMAP
+0070
+00E0
+01C0
+0000
+0FFF
+0FFF
+1F80
+1B80
+3B80
+3B80
+33FE
+73FE
+7380
+7F80
+FF80
+E380
+E3FF
+E3FF
+ENDCHAR
+STARTCHAR aeacute
+ENCODING 509
+SWIDTH 889 0
+DWIDTH 16 0
+BBX 14 14 1 0
+BITMAP
+01C0
+0380
+0700
+0000
+3DF0
+7FF8
+671C
+0F1C
+3FFC
+7700
+E700
+EF9C
+FFFC
+79F0
+ENDCHAR
+STARTCHAR Oslashacute
+ENCODING 510
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 18 0 0
+BITMAP
+00E0
+01C0
+0380
+0000
+07C6
+1FFC
+3C38
+3878
+78DC
+719C
+711C
+731C
+761C
+7C3C
+3838
+3C78
+7FF0
+C7C0
+ENDCHAR
+STARTCHAR oslashacute
+ENCODING 511
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 12 14 0 0
+BITMAP
+01C0
+0380
+0700
+0000
+0F30
+3FE0
+39C0
+73E0
+77E0
+7EE0
+7CE0
+39C0
+7FC0
+CF00
+ENDCHAR
+STARTCHAR uni0200
+ENCODING 512
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+3600
+1B00
+0D80
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni0201
+ENCODING 513
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+6C00
+3600
+1B00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni0202
+ENCODING 514
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0F80
+1DC0
+18C0
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni0203
+ENCODING 515
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 14 1 0
+BITMAP
+3E00
+7700
+6300
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni0204
+ENCODING 516
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+D800
+6C00
+3600
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni0205
+ENCODING 517
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+6C00
+3600
+1B00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni0206
+ENCODING 518
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+3E00
+7700
+6300
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni0207
+ENCODING 519
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3E00
+7700
+6300
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni0208
+ENCODING 520
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -2 0
+BITMAP
+D8
+6C
+36
+00
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+ENDCHAR
+STARTCHAR uni0209
+ENCODING 521
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 14 -2 0
+BITMAP
+D8
+6C
+36
+00
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+ENDCHAR
+STARTCHAR uni020A
+ENCODING 522
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 0
+BITMAP
+7C
+EE
+C6
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni020B
+ENCODING 523
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 14 -1 0
+BITMAP
+7C
+EE
+C6
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni020C
+ENCODING 524
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+3600
+1B00
+0D80
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni020D
+ENCODING 525
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+6C00
+3600
+1B00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni020E
+ENCODING 526
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 18 1 0
+BITMAP
+0F80
+1DC0
+18C0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni020F
+ENCODING 527
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+1F00
+3B80
+3180
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni0210
+ENCODING 528
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+6C00
+3600
+1B00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+ENDCHAR
+STARTCHAR uni0211
+ENCODING 529
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 7 14 0 0
+BITMAP
+D8
+6C
+36
+00
+76
+7E
+7E
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR uni0212
+ENCODING 530
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1F00
+3B80
+3180
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+ENDCHAR
+STARTCHAR uni0213
+ENCODING 531
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 7 14 0 0
+BITMAP
+7C
+EE
+C6
+00
+76
+7E
+7E
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR uni0214
+ENCODING 532
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+3600
+1B00
+0D80
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni0215
+ENCODING 533
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+D800
+6C00
+3600
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni0216
+ENCODING 534
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0F80
+1DC0
+18C0
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni0217
+ENCODING 535
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3E00
+7700
+6300
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR Scommaaccent
+ENCODING 536
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 21 1 -7
+BITMAP
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0000
+0E00
+0E00
+0E00
+0600
+0C00
+0800
+ENDCHAR
+STARTCHAR scommaaccent
+ENCODING 537
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 -7
+BITMAP
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+0000
+1C00
+1C00
+1C00
+0C00
+1800
+1000
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 538
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 21 0 -7
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0000
+0E00
+0E00
+0E00
+0600
+0C00
+0800
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 539
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 20 0 -7
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+00
+38
+38
+38
+18
+30
+20
+ENDCHAR
+STARTCHAR uni021E
+ENCODING 542
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1DC0
+0F80
+0700
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni021F
+ENCODING 543
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 10 18 0 0
+BITMAP
+EE00
+7C00
+3800
+0000
+7000
+7000
+7000
+7000
+7780
+7FC0
+79C0
+71C0
+71C0
+71C0
+71C0
+71C0
+71C0
+71C0
+ENDCHAR
+STARTCHAR uni0226
+ENCODING 550
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0600
+0600
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni0227
+ENCODING 551
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+0C00
+0C00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni0228
+ENCODING 552
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 19 2 -5
+BITMAP
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni0229
+ENCODING 553
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 15 1 -5
+BITMAP
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni022A
+ENCODING 554
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 21 1 0
+BITMAP
+0F80
+0F80
+0000
+0CC0
+0CC0
+0CC0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni022B
+ENCODING 555
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+1F00
+1F00
+0000
+3300
+3300
+3300
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni022C
+ENCODING 556
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 21 1 0
+BITMAP
+07C0
+07C0
+0000
+0710
+0FE0
+11C0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni022D
+ENCODING 557
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+3E00
+3E00
+0000
+3B00
+7F00
+6E00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni022E
+ENCODING 558
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 17 1 0
+BITMAP
+0300
+0300
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni022F
+ENCODING 559
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 13 1 0
+BITMAP
+0C00
+0C00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni0230
+ENCODING 560
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 20 1 0
+BITMAP
+0F80
+0F80
+0000
+0300
+0300
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni0231
+ENCODING 561
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1F00
+1F00
+0000
+0C00
+0C00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni0232
+ENCODING 562
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 17 0 0
+BITMAP
+0F80
+0F80
+0000
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR uni0233
+ENCODING 563
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 -4
+BITMAP
+3E00
+3E00
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR uni0250
+ENCODING 592
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 10 1 0
+BITMAP
+F780
+77C0
+79C0
+71C0
+7780
+7F00
+7800
+7180
+3F80
+1F00
+ENDCHAR
+STARTCHAR uni0254
+ENCODING 596
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+3C00
+FF00
+E700
+0380
+0380
+0380
+0380
+E700
+FF00
+3C00
+ENDCHAR
+STARTCHAR uni0258
+ENCODING 600
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+3C00
+7F00
+E700
+C380
+FF80
+FF80
+0380
+E700
+FF00
+3C00
+ENDCHAR
+STARTCHAR uni0259
+ENCODING 601
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+3C00
+FF00
+E700
+0380
+FF80
+FF80
+C380
+E700
+7F00
+3C00
+ENDCHAR
+STARTCHAR uni025F
+ENCODING 607
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 14 0 -4
+BITMAP
+38
+38
+38
+38
+38
+38
+38
+38
+FE
+FE
+38
+38
+F8
+F0
+ENDCHAR
+STARTCHAR uni0265
+ENCODING 613
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR uni0275
+ENCODING 629
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 10 1 0
+BITMAP
+1E00
+7F80
+7380
+E1C0
+FFC0
+FFC0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni0279
+ENCODING 633
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+FC
+FC
+DC
+ENDCHAR
+STARTCHAR uni0287
+ENCODING 647
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 13 0 0
+BITMAP
+F0
+F8
+38
+38
+38
+38
+38
+38
+FC
+FC
+38
+38
+38
+ENDCHAR
+STARTCHAR uni0288
+ENCODING 648
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 17 0 -4
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+7C
+3C
+ENDCHAR
+STARTCHAR uni0289
+ENCODING 649
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 10 1 0
+BITMAP
+E380
+E380
+E380
+E380
+FF80
+FF80
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni028C
+ENCODING 652
+SWIDTH 556 0
+DWIDTH 9 0
+BBX 9 10 0 0
+BITMAP
+1C00
+1C00
+3E00
+3E00
+7700
+7700
+7700
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR uni028D
+ENCODING 653
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 10 0 0
+BITMAP
+1C70
+1C70
+3C78
+3EF8
+76DC
+77DC
+739C
+E38E
+E38E
+E38E
+ENDCHAR
+STARTCHAR uni028E
+ENCODING 654
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0700
+0F00
+0C00
+1C00
+1C00
+1C00
+3E00
+3E00
+7700
+7700
+7700
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR uni029E
+ENCODING 670
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 14 1 -4
+BITMAP
+E380
+F380
+7380
+3B80
+1F80
+0F80
+0F80
+1F80
+3B80
+7380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR uni02BB
+ENCODING 699
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 5 1 9
+BITMAP
+60
+C0
+C0
+E0
+E0
+ENDCHAR
+STARTCHAR afii57929
+ENCODING 700
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 5 1 9
+BITMAP
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR afii64937
+ENCODING 701
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 5 1 9
+BITMAP
+E0
+E0
+C0
+C0
+60
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 710
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 3 0 11
+BITMAP
+38
+7C
+EE
+ENDCHAR
+STARTCHAR caron
+ENCODING 711
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 3 0 11
+BITMAP
+EE
+7C
+38
+ENDCHAR
+STARTCHAR uni02C8
+ENCODING 712
+SWIDTH 238 0
+DWIDTH 4 0
+BBX 2 5 1 9
+BITMAP
+C0
+C0
+C0
+C0
+80
+ENDCHAR
+STARTCHAR macron
+ENCODING 713
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 5 2 1 12
+BITMAP
+F8
+F8
+ENDCHAR
+STARTCHAR uni02CA
+ENCODING 714
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 5 3 0 11
+BITMAP
+38
+70
+E0
+ENDCHAR
+STARTCHAR uni02CB
+ENCODING 715
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 5 3 0 11
+BITMAP
+E0
+70
+38
+ENDCHAR
+STARTCHAR uni02CD
+ENCODING 717
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 5 2 1 -3
+BITMAP
+F8
+F8
+ENDCHAR
+STARTCHAR uni02CE
+ENCODING 718
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 5 3 0 -4
+BITMAP
+E0
+70
+38
+ENDCHAR
+STARTCHAR uni02CF
+ENCODING 719
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 5 3 0 -4
+BITMAP
+38
+70
+E0
+ENDCHAR
+STARTCHAR breve
+ENCODING 728
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 3 0 11
+BITMAP
+C6
+EE
+7C
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 729
+SWIDTH 333 0
+DWIDTH 4 0
+BBX 2 2 1 12
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR ring
+ENCODING 730
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 4 0 10
+BITMAP
+78
+CC
+CC
+78
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 731
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 5 0 -5
+BITMAP
+38
+70
+E0
+FC
+78
+ENDCHAR
+STARTCHAR tilde
+ENCODING 732
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 3 0 11
+BITMAP
+76
+FE
+DC
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 733
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 3 0 11
+BITMAP
+36
+6C
+D8
+ENDCHAR
+STARTCHAR uni02EE
+ENCODING 750
+SWIDTH 500 0
+DWIDTH 9 0
+BBX 7 5 1 9
+BITMAP
+EE
+EE
+66
+66
+CC
+ENDCHAR
+STARTCHAR uni037E
+ENCODING 894
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 3 13 1 -3
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+E0
+E0
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR tonos
+ENCODING 900
+SWIDTH 333 0
+DWIDTH 5 0
+BBX 5 3 0 11
+BITMAP
+38
+70
+E0
+ENDCHAR
+STARTCHAR dieresistonos
+ENCODING 901
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 6 1 12
+BITMAP
+1C
+38
+70
+00
+D8
+D8
+ENDCHAR
+STARTCHAR anoteleia
+ENCODING 903
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 2 2 1 6
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR mu
+ENCODING 956
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+FB80
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E00
+ENCODING 7680
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+0000
+0F00
+1980
+1980
+0F00
+ENDCHAR
+STARTCHAR uni1E01
+ENCODING 7681
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 15 1 -5
+BITMAP
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+0000
+1E00
+3300
+3300
+1E00
+ENDCHAR
+STARTCHAR uni1E02
+ENCODING 7682
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 11 17 2 0
+BITMAP
+0C00
+0C00
+0000
+FE00
+FF80
+E3C0
+E1C0
+E1C0
+E380
+FF80
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+ENDCHAR
+STARTCHAR uni1E03
+ENCODING 7683
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+3000
+3000
+0000
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+ENDCHAR
+STARTCHAR uni1E04
+ENCODING 7684
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 11 17 2 -3
+BITMAP
+FE00
+FF80
+E3C0
+E1C0
+E1C0
+E380
+FF80
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1E05
+ENCODING 7685
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1E06
+ENCODING 7686
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 11 17 2 -3
+BITMAP
+FE00
+FF80
+E3C0
+E1C0
+E1C0
+E380
+FF80
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+0000
+1F00
+1F00
+ENDCHAR
+STARTCHAR uni1E07
+ENCODING 7687
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+0000
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni1E08
+ENCODING 7688
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 23 1 -5
+BITMAP
+0380
+0700
+0E00
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E000
+E000
+F070
+7070
+78E0
+3FE0
+0F80
+0C00
+0E00
+0300
+1F00
+1E00
+ENDCHAR
+STARTCHAR uni1E09
+ENCODING 7689
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 19 1 -5
+BITMAP
+0700
+0E00
+1C00
+0000
+1E00
+7F80
+7380
+E000
+E000
+E000
+E000
+7380
+7F80
+1E00
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni1E0A
+ENCODING 7690
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0C00
+0C00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E070
+E070
+E070
+E070
+E070
+E070
+E0E0
+E1E0
+FFC0
+FF00
+ENDCHAR
+STARTCHAR uni1E0B
+ENCODING 7691
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+0300
+0300
+0000
+01C0
+01C0
+01C0
+01C0
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+ENDCHAR
+STARTCHAR uni1E0C
+ENCODING 7692
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E070
+E070
+E070
+E070
+E070
+E070
+E0E0
+E1E0
+FFC0
+FF00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1E0D
+ENCODING 7693
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -3
+BITMAP
+01C0
+01C0
+01C0
+01C0
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1E0E
+ENCODING 7694
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E070
+E070
+E070
+E070
+E070
+E070
+E0E0
+E1E0
+FFC0
+FF00
+0000
+1F00
+1F00
+ENDCHAR
+STARTCHAR uni1E0F
+ENCODING 7695
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -3
+BITMAP
+01C0
+01C0
+01C0
+01C0
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+0000
+1F00
+1F00
+ENDCHAR
+STARTCHAR uni1E10
+ENCODING 7696
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E070
+E070
+E070
+E070
+E070
+E070
+E0E0
+E1E0
+FFC0
+FF00
+0C00
+0E00
+0300
+1F00
+1E00
+ENDCHAR
+STARTCHAR uni1E11
+ENCODING 7697
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 19 1 -5
+BITMAP
+01C0
+01C0
+01C0
+01C0
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+0C00
+0E00
+0300
+1F00
+1E00
+ENDCHAR
+STARTCHAR uni1E12
+ENCODING 7698
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 -4
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E070
+E070
+E070
+E070
+E070
+E070
+E0E0
+E1E0
+FFC0
+FF00
+0000
+0E00
+1F00
+3B80
+ENDCHAR
+STARTCHAR uni1E13
+ENCODING 7699
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -4
+BITMAP
+01C0
+01C0
+01C0
+01C0
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+0000
+0E00
+1F00
+3B80
+ENDCHAR
+STARTCHAR uni1E14
+ENCODING 7700
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 21 2 0
+BITMAP
+3800
+1C00
+0E00
+0000
+3E00
+3E00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1E15
+ENCODING 7701
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 0
+BITMAP
+7000
+3800
+1C00
+0000
+3E00
+3E00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1E16
+ENCODING 7702
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 21 2 0
+BITMAP
+0700
+0E00
+1C00
+0000
+3E00
+3E00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1E17
+ENCODING 7703
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+3E00
+3E00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1E18
+ENCODING 7704
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 -4
+BITMAP
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+0000
+1C00
+3E00
+7700
+ENDCHAR
+STARTCHAR uni1E19
+ENCODING 7705
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+0000
+1C00
+3E00
+7700
+ENDCHAR
+STARTCHAR uni1E1A
+ENCODING 7706
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 -4
+BITMAP
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+0000
+3B00
+7F00
+6E00
+ENDCHAR
+STARTCHAR uni1E1B
+ENCODING 7707
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+0000
+3B00
+7F00
+6E00
+ENDCHAR
+STARTCHAR uni1E1C
+ENCODING 7708
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 23 2 -5
+BITMAP
+6300
+7700
+3E00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni1E1D
+ENCODING 7709
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 19 1 -5
+BITMAP
+6300
+7700
+3E00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni1E1E
+ENCODING 7710
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+1800
+1800
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E1F
+ENCODING 7711
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 7 17 0 0
+BITMAP
+18
+18
+00
+1E
+3E
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni1E20
+ENCODING 7712
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 12 17 1 0
+BITMAP
+0F80
+0F80
+0000
+0F80
+3FE0
+78E0
+7070
+F070
+E000
+E000
+E3F0
+E3F0
+F070
+7070
+78F0
+3FF0
+1FB0
+ENDCHAR
+STARTCHAR uni1E21
+ENCODING 7713
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -4
+BITMAP
+1F00
+1F00
+0000
+3DC0
+7FC0
+73C0
+E1C0
+E1C0
+E1C0
+E1C0
+73C0
+7FC0
+3DC0
+01C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1E22
+ENCODING 7714
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0600
+0600
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1E23
+ENCODING 7715
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 0
+BITMAP
+3000
+3000
+0000
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR uni1E24
+ENCODING 7716
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E25
+ENCODING 7717
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1E26
+ENCODING 7718
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0D80
+0D80
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1E27
+ENCODING 7719
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 0
+BITMAP
+D800
+D800
+0000
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR uni1E28
+ENCODING 7720
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+0600
+0700
+0180
+0F80
+0F00
+ENDCHAR
+STARTCHAR uni1E29
+ENCODING 7721
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 19 1 -5
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+1800
+1C00
+0600
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni1E2A
+ENCODING 7722
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 -4
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+E070
+E070
+E070
+E070
+0000
+18C0
+1DC0
+0F80
+ENDCHAR
+STARTCHAR uni1E2B
+ENCODING 7723
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 18 1 -4
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0000
+6300
+7700
+3E00
+ENDCHAR
+STARTCHAR uni1E2C
+ENCODING 7724
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 -4
+BITMAP
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+00
+76
+FE
+DC
+ENDCHAR
+STARTCHAR uni1E2D
+ENCODING 7725
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 -4
+BITMAP
+38
+38
+38
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+00
+76
+FE
+DC
+ENDCHAR
+STARTCHAR uni1E2E
+ENCODING 7726
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 6 22 0 0
+BITMAP
+1C
+38
+70
+00
+CC
+CC
+CC
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR uni1E2F
+ENCODING 7727
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 6 18 0 0
+BITMAP
+1C
+38
+70
+00
+D8
+D8
+D8
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR uni1E30
+ENCODING 7728
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 18 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+ENDCHAR
+STARTCHAR uni1E31
+ENCODING 7729
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 18 1 0
+BITMAP
+1C00
+3800
+7000
+0000
+E000
+E000
+E000
+E000
+E700
+EE00
+FC00
+F800
+F800
+FC00
+EE00
+E700
+E780
+E380
+ENDCHAR
+STARTCHAR uni1E32
+ENCODING 7730
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 17 1 -3
+BITMAP
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E33
+ENCODING 7731
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+E700
+EE00
+FC00
+F800
+F800
+FC00
+EE00
+E700
+E780
+E380
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1E34
+ENCODING 7732
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 17 1 -3
+BITMAP
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+0000
+0F80
+0F80
+ENDCHAR
+STARTCHAR uni1E35
+ENCODING 7733
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+E700
+EE00
+FC00
+F800
+F800
+FC00
+EE00
+E700
+E780
+E380
+0000
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni1E36
+ENCODING 7734
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1E37
+ENCODING 7735
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 17 1 -3
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+60
+60
+ENDCHAR
+STARTCHAR uni1E38
+ENCODING 7736
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 20 1 -3
+BITMAP
+F800
+F800
+0000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1E39
+ENCODING 7737
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 20 0 -3
+BITMAP
+F8
+F8
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+00
+30
+30
+ENDCHAR
+STARTCHAR uni1E3A
+ENCODING 7738
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+0000
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni1E3B
+ENCODING 7739
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 5 17 0 -3
+BITMAP
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+00
+F8
+F8
+ENDCHAR
+STARTCHAR uni1E3C
+ENCODING 7740
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 18 1 -4
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FF80
+FF80
+0000
+1C00
+3E00
+7700
+ENDCHAR
+STARTCHAR uni1E3D
+ENCODING 7741
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 7 18 -1 -4
+BITMAP
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+00
+38
+7C
+EE
+ENDCHAR
+STARTCHAR uni1E3E
+ENCODING 7742
+SWIDTH 833 0
+DWIDTH 16 0
+BBX 14 18 1 0
+BITMAP
+01C0
+0380
+0700
+0000
+E01C
+E01C
+F03C
+F03C
+F87C
+F87C
+F87C
+ECDC
+ECDC
+ECDC
+E79C
+E79C
+E31C
+E31C
+ENDCHAR
+STARTCHAR uni1E3F
+ENCODING 7743
+SWIDTH 889 0
+DWIDTH 17 0
+BBX 15 14 1 0
+BITMAP
+00E0
+01C0
+0380
+0000
+EF3C
+FFFE
+F3CE
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+ENDCHAR
+STARTCHAR uni1E40
+ENCODING 7744
+SWIDTH 833 0
+DWIDTH 16 0
+BBX 14 17 1 0
+BITMAP
+0300
+0300
+0000
+E01C
+E01C
+F03C
+F03C
+F87C
+F87C
+F87C
+ECDC
+ECDC
+ECDC
+E79C
+E79C
+E31C
+E31C
+ENDCHAR
+STARTCHAR uni1E41
+ENCODING 7745
+SWIDTH 889 0
+DWIDTH 17 0
+BBX 15 13 1 0
+BITMAP
+0300
+0300
+0000
+EF3C
+FFFE
+F3CE
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+ENDCHAR
+STARTCHAR uni1E42
+ENCODING 7746
+SWIDTH 833 0
+DWIDTH 16 0
+BBX 14 17 1 -3
+BITMAP
+E01C
+E01C
+F03C
+F03C
+F87C
+F87C
+F87C
+ECDC
+ECDC
+ECDC
+E79C
+E79C
+E31C
+E31C
+0000
+0300
+0300
+ENDCHAR
+STARTCHAR uni1E43
+ENCODING 7747
+SWIDTH 889 0
+DWIDTH 17 0
+BBX 15 13 1 -3
+BITMAP
+EF3C
+FFFE
+F3CE
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+E38E
+0000
+0180
+0180
+ENDCHAR
+STARTCHAR uni1E44
+ENCODING 7748
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0600
+0600
+0000
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+ENDCHAR
+STARTCHAR uni1E45
+ENCODING 7749
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+1800
+1800
+0000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+ENDCHAR
+STARTCHAR uni1E46
+ENCODING 7750
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E47
+ENCODING 7751
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 13 1 -3
+BITMAP
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1E48
+ENCODING 7752
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+0000
+0F80
+0F80
+ENDCHAR
+STARTCHAR uni1E49
+ENCODING 7753
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 13 1 -3
+BITMAP
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0000
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni1E4A
+ENCODING 7754
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 -4
+BITMAP
+E070
+F070
+F070
+F870
+FC70
+EC70
+EE70
+E670
+E770
+E370
+E1F0
+E1F0
+E0F0
+E070
+0000
+0700
+0F80
+1DC0
+ENDCHAR
+STARTCHAR uni1E4B
+ENCODING 7755
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0000
+1C00
+3E00
+7700
+ENDCHAR
+STARTCHAR uni1E4C
+ENCODING 7756
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 22 1 0
+BITMAP
+01C0
+0380
+0700
+0000
+0710
+0FE0
+11C0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1E4D
+ENCODING 7757
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+3B00
+7F00
+6E00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1E4E
+ENCODING 7758
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 21 1 0
+BITMAP
+06C0
+06C0
+0000
+0710
+0FE0
+11C0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1E4F
+ENCODING 7759
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+3600
+3600
+0000
+3B00
+7F00
+6E00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1E50
+ENCODING 7760
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 21 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+0F80
+0F80
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1E51
+ENCODING 7761
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+3800
+1C00
+0E00
+0000
+1F00
+1F00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1E52
+ENCODING 7762
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 21 1 0
+BITMAP
+01C0
+0380
+0700
+0000
+0F80
+0F80
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1E53
+ENCODING 7763
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+1F00
+1F00
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1E54
+ENCODING 7764
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E55
+ENCODING 7765
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 -4
+BITMAP
+0700
+0E00
+1C00
+0000
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E56
+ENCODING 7766
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 17 1 0
+BITMAP
+0C00
+0C00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF00
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E57
+ENCODING 7767
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -4
+BITMAP
+0C00
+0C00
+0000
+EF00
+FF80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+F380
+FF80
+EF00
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E58
+ENCODING 7768
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0C00
+0C00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+ENDCHAR
+STARTCHAR uni1E59
+ENCODING 7769
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 13 1 0
+BITMAP
+30
+30
+00
+EC
+FC
+FC
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni1E5A
+ENCODING 7770
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E5B
+ENCODING 7771
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 13 1 -3
+BITMAP
+EC
+FC
+FC
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+60
+60
+ENDCHAR
+STARTCHAR uni1E5C
+ENCODING 7772
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 20 1 -3
+BITMAP
+1F00
+1F00
+0000
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E5D
+ENCODING 7773
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 16 1 -3
+BITMAP
+F8
+F8
+00
+EC
+FC
+FC
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+60
+60
+ENDCHAR
+STARTCHAR uni1E5E
+ENCODING 7774
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+FF00
+FFC0
+E1E0
+E0E0
+E0E0
+E1E0
+FFC0
+FF80
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0F0
+0000
+1F00
+1F00
+ENDCHAR
+STARTCHAR uni1E5F
+ENCODING 7775
+SWIDTH 389 0
+DWIDTH 7 0
+BBX 6 13 1 -3
+BITMAP
+EC
+FC
+FC
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+F8
+F8
+ENDCHAR
+STARTCHAR uni1E60
+ENCODING 7776
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 17 1 0
+BITMAP
+0600
+0600
+0000
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR uni1E61
+ENCODING 7777
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+0C00
+0C00
+0000
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+ENDCHAR
+STARTCHAR uni1E62
+ENCODING 7778
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 17 1 -3
+BITMAP
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E63
+ENCODING 7779
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 -3
+BITMAP
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1E64
+ENCODING 7780
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 21 1 0
+BITMAP
+0600
+0600
+0000
+0380
+0700
+0E00
+0000
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR uni1E65
+ENCODING 7781
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 0
+BITMAP
+0C00
+0C00
+0000
+0700
+0E00
+1C00
+0000
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+ENDCHAR
+STARTCHAR uni1E66
+ENCODING 7782
+SWIDTH 667 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+0C00
+0C00
+0000
+7700
+3E00
+1C00
+0000
+3F00
+7F80
+E380
+F800
+7E00
+1F80
+E3C0
+F3C0
+7F80
+3F00
+ENDCHAR
+STARTCHAR uni1E67
+ENCODING 7783
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 8 17 1 0
+BITMAP
+18
+18
+00
+77
+3E
+1C
+00
+1E
+7F
+E7
+E0
+FE
+3F
+07
+E7
+FE
+78
+ENDCHAR
+STARTCHAR uni1E68
+ENCODING 7784
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 11 20 1 -3
+BITMAP
+0C00
+0C00
+0000
+3F80
+7FC0
+F1E0
+E0E0
+F000
+7E00
+3F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E69
+ENCODING 7785
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 16 1 -3
+BITMAP
+1800
+1800
+0000
+3F00
+7F80
+E380
+E000
+FF00
+3F80
+0380
+E380
+FF00
+7E00
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1E6A
+ENCODING 7786
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 17 0 0
+BITMAP
+0600
+0600
+0000
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E6B
+ENCODING 7787
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 16 0 0
+BITMAP
+30
+30
+00
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+ENDCHAR
+STARTCHAR uni1E6C
+ENCODING 7788
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 17 0 -3
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1E6D
+ENCODING 7789
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 16 0 -3
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+00
+30
+30
+ENDCHAR
+STARTCHAR uni1E6E
+ENCODING 7790
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 17 0 -3
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0000
+1F00
+1F00
+ENDCHAR
+STARTCHAR uni1E6F
+ENCODING 7791
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 16 0 -3
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+00
+7C
+7C
+ENDCHAR
+STARTCHAR uni1E70
+ENCODING 7792
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 18 0 -4
+BITMAP
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0000
+0E00
+1F00
+3B80
+ENDCHAR
+STARTCHAR uni1E71
+ENCODING 7793
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 7 17 0 -4
+BITMAP
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+00
+38
+7C
+EE
+ENDCHAR
+STARTCHAR uni1E72
+ENCODING 7794
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+0000
+0D80
+0D80
+ENDCHAR
+STARTCHAR uni1E73
+ENCODING 7795
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 13 1 -3
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+0000
+3600
+3600
+ENDCHAR
+STARTCHAR uni1E74
+ENCODING 7796
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 -4
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+0000
+1D80
+3F80
+3700
+ENDCHAR
+STARTCHAR uni1E75
+ENCODING 7797
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+0000
+3B00
+7F00
+6E00
+ENDCHAR
+STARTCHAR uni1E76
+ENCODING 7798
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 -4
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+0000
+0700
+0F80
+1DC0
+ENDCHAR
+STARTCHAR uni1E77
+ENCODING 7799
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+0000
+1C00
+3E00
+7700
+ENDCHAR
+STARTCHAR uni1E78
+ENCODING 7800
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+0EC0
+1FC0
+1B80
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni1E79
+ENCODING 7801
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+3B00
+7F00
+6E00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni1E7A
+ENCODING 7802
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 20 1 0
+BITMAP
+0D80
+0D80
+0000
+0F80
+0F80
+0000
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni1E7B
+ENCODING 7803
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+3600
+3600
+0000
+3E00
+3E00
+0000
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni1E7C
+ENCODING 7804
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 18 0 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+E038
+E038
+7070
+7070
+3060
+38E0
+38E0
+1DC0
+1DC0
+0D80
+0F80
+0F80
+0700
+0700
+ENDCHAR
+STARTCHAR uni1E7D
+ENCODING 7805
+SWIDTH 556 0
+DWIDTH 9 0
+BBX 9 14 0 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+ENDCHAR
+STARTCHAR uni1E7E
+ENCODING 7806
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 17 0 -3
+BITMAP
+E038
+E038
+7070
+7070
+3060
+38E0
+38E0
+1DC0
+1DC0
+0D80
+0F80
+0F80
+0700
+0700
+0000
+0300
+0300
+ENDCHAR
+STARTCHAR uni1E7F
+ENCODING 7807
+SWIDTH 556 0
+DWIDTH 9 0
+BBX 9 13 0 -3
+BITMAP
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR Wgrave
+ENCODING 7808
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 18 1 0
+BITMAP
+0E00
+0700
+0380
+0000
+E38E
+E38E
+E38E
+E38E
+739C
+739C
+739C
+76DC
+36D8
+36D8
+3EF8
+1C70
+1C70
+1C70
+ENDCHAR
+STARTCHAR wgrave
+ENCODING 7809
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 14 0 0
+BITMAP
+0E00
+0700
+0380
+0000
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+ENDCHAR
+STARTCHAR Wacute
+ENCODING 7810
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 18 1 0
+BITMAP
+00E0
+01C0
+0380
+0000
+E38E
+E38E
+E38E
+E38E
+739C
+739C
+739C
+76DC
+36D8
+36D8
+3EF8
+1C70
+1C70
+1C70
+ENDCHAR
+STARTCHAR wacute
+ENCODING 7811
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 14 0 0
+BITMAP
+00E0
+01C0
+0380
+0000
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+ENDCHAR
+STARTCHAR Wdieresis
+ENCODING 7812
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 17 1 0
+BITMAP
+06C0
+06C0
+0000
+E38E
+E38E
+E38E
+E38E
+739C
+739C
+739C
+76DC
+36D8
+36D8
+3EF8
+1C70
+1C70
+1C70
+ENDCHAR
+STARTCHAR wdieresis
+ENCODING 7813
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 13 0 0
+BITMAP
+06C0
+06C0
+0000
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+ENDCHAR
+STARTCHAR uni1E86
+ENCODING 7814
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 17 1 0
+BITMAP
+0180
+0180
+0000
+E38E
+E38E
+E38E
+E38E
+739C
+739C
+739C
+76DC
+36D8
+36D8
+3EF8
+1C70
+1C70
+1C70
+ENDCHAR
+STARTCHAR uni1E87
+ENCODING 7815
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 13 0 0
+BITMAP
+0180
+0180
+0000
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+ENDCHAR
+STARTCHAR uni1E88
+ENCODING 7816
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 17 1 -3
+BITMAP
+E38E
+E38E
+E38E
+E38E
+739C
+739C
+739C
+76DC
+36D8
+36D8
+3EF8
+1C70
+1C70
+1C70
+0000
+0180
+0180
+ENDCHAR
+STARTCHAR uni1E89
+ENCODING 7817
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 13 0 -3
+BITMAP
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+0000
+0180
+0180
+ENDCHAR
+STARTCHAR uni1E8A
+ENCODING 7818
+SWIDTH 667 0
+DWIDTH 12 0
+BBX 12 17 0 0
+BITMAP
+0600
+0600
+0000
+E070
+E070
+70E0
+79E0
+1980
+1F80
+0F00
+1F80
+1980
+39C0
+70E0
+70E0
+E070
+E070
+ENDCHAR
+STARTCHAR uni1E8B
+ENCODING 7819
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+0C00
+0C00
+0000
+E380
+E380
+7700
+3E00
+1C00
+3E00
+7700
+7700
+E380
+E380
+ENDCHAR
+STARTCHAR uni1E8C
+ENCODING 7820
+SWIDTH 667 0
+DWIDTH 12 0
+BBX 12 17 0 0
+BITMAP
+0D80
+0D80
+0000
+E070
+E070
+70E0
+79E0
+1980
+1F80
+0F00
+1F80
+1980
+39C0
+70E0
+70E0
+E070
+E070
+ENDCHAR
+STARTCHAR uni1E8D
+ENCODING 7821
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 0
+BITMAP
+3600
+3600
+0000
+E380
+E380
+7700
+3E00
+1C00
+3E00
+7700
+7700
+E380
+E380
+ENDCHAR
+STARTCHAR uni1E8E
+ENCODING 7822
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 17 0 0
+BITMAP
+0300
+0300
+0000
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR uni1E8F
+ENCODING 7823
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 -4
+BITMAP
+0C00
+0C00
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR uni1E90
+ENCODING 7824
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+0E00
+1F00
+3B80
+0000
+FFC0
+FFC0
+01C0
+0380
+0700
+0700
+0E00
+1C00
+3800
+3800
+7000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1E91
+ENCODING 7825
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 14 1 0
+BITMAP
+1C
+3E
+77
+00
+FF
+FF
+07
+0E
+1C
+38
+70
+E0
+FF
+FF
+ENDCHAR
+STARTCHAR uni1E92
+ENCODING 7826
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -3
+BITMAP
+FFC0
+FFC0
+01C0
+0380
+0700
+0700
+0E00
+1C00
+3800
+3800
+7000
+E000
+FFC0
+FFC0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1E93
+ENCODING 7827
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 13 1 -3
+BITMAP
+FF
+FF
+07
+0E
+1C
+38
+70
+E0
+FF
+FF
+00
+18
+18
+ENDCHAR
+STARTCHAR uni1E94
+ENCODING 7828
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -3
+BITMAP
+FFC0
+FFC0
+01C0
+0380
+0700
+0700
+0E00
+1C00
+3800
+3800
+7000
+E000
+FFC0
+FFC0
+0000
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni1E95
+ENCODING 7829
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 8 13 1 -3
+BITMAP
+FF
+FF
+07
+0E
+1C
+38
+70
+E0
+FF
+FF
+00
+7C
+7C
+ENDCHAR
+STARTCHAR uni1E96
+ENCODING 7830
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 17 1 -3
+BITMAP
+E000
+E000
+E000
+E000
+EF00
+FF80
+F380
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+0000
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni1E97
+ENCODING 7831
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 16 0 0
+BITMAP
+D8
+D8
+00
+70
+70
+70
+FC
+FC
+70
+70
+70
+70
+70
+70
+7C
+3C
+ENDCHAR
+STARTCHAR uni1E98
+ENCODING 7832
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 15 0 0
+BITMAP
+03C0
+0660
+0660
+03C0
+0000
+E38E
+E38E
+E38E
+739C
+77DC
+76DC
+3EF8
+3C78
+1C70
+1C70
+ENDCHAR
+STARTCHAR uni1E99
+ENCODING 7833
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 19 1 -4
+BITMAP
+1E00
+3300
+3300
+1E00
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR uni1EA0
+ENCODING 7840
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1EA1
+ENCODING 7841
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 13 1 -3
+BITMAP
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1EA4
+ENCODING 7844
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+0700
+0F80
+1DC0
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1EA5
+ENCODING 7845
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+1C00
+3E00
+7700
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni1EA6
+ENCODING 7846
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+0700
+0F80
+1DC0
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1EA7
+ENCODING 7847
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 18 1 0
+BITMAP
+3800
+1C00
+0E00
+0000
+1C00
+3E00
+7700
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni1EAA
+ENCODING 7850
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+0700
+0F80
+1DC0
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1EAB
+ENCODING 7851
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 18 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+1C00
+3E00
+7700
+0000
+3E00
+7F00
+7380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni1EAC
+ENCODING 7852
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 21 1 -3
+BITMAP
+0700
+0F80
+1DC0
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1EAD
+ENCODING 7853
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 17 1 -3
+BITMAP
+0E00
+1F00
+3B80
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1EAE
+ENCODING 7854
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+18C0
+1DC0
+0F80
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1EAF
+ENCODING 7855
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+6300
+7700
+3E00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni1EB0
+ENCODING 7856
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+18C0
+1DC0
+0F80
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1EB1
+ENCODING 7857
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 18 1 0
+BITMAP
+3800
+1C00
+0E00
+0000
+6300
+7700
+3E00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni1EB4
+ENCODING 7860
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+18C0
+1DC0
+0F80
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni1EB5
+ENCODING 7861
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 18 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+6300
+7700
+3E00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+ENDCHAR
+STARTCHAR uni1EB6
+ENCODING 7862
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 21 1 -3
+BITMAP
+18C0
+1DC0
+0F80
+0000
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1EB7
+ENCODING 7863
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 10 17 1 -3
+BITMAP
+3180
+3B80
+1F00
+0000
+3E00
+7F00
+6380
+0780
+3F80
+7B80
+E380
+E780
+FB80
+7BC0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1EB8
+ENCODING 7864
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 17 2 -3
+BITMAP
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1EB9
+ENCODING 7865
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 13 1 -3
+BITMAP
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1EBC
+ENCODING 7868
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1EBD
+ENCODING 7869
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1EBE
+ENCODING 7870
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 22 2 0
+BITMAP
+0700
+0E00
+1C00
+0000
+0E00
+1F00
+3B80
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1EBF
+ENCODING 7871
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+1C00
+3E00
+7700
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1EC0
+ENCODING 7872
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 22 2 0
+BITMAP
+3800
+1C00
+0E00
+0000
+0E00
+1F00
+3B80
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1EC1
+ENCODING 7873
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+7000
+3800
+1C00
+0000
+1C00
+3E00
+7700
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1EC4
+ENCODING 7876
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 22 2 0
+BITMAP
+1D80
+3F80
+3700
+0000
+0E00
+1F00
+3B80
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1EC5
+ENCODING 7877
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+1C00
+3E00
+7700
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1EC6
+ENCODING 7878
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 21 2 -3
+BITMAP
+1C00
+3E00
+7700
+0000
+FFC0
+FFC0
+E000
+E000
+E000
+E000
+FF80
+FF80
+E000
+E000
+E000
+E000
+FFC0
+FFC0
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1EC7
+ENCODING 7879
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 -3
+BITMAP
+1C00
+3E00
+7700
+0000
+1E00
+7F00
+7380
+E180
+FF80
+FF80
+E000
+7380
+7F80
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1ECA
+ENCODING 7882
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 17 1 -3
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+60
+60
+ENDCHAR
+STARTCHAR uni1ECB
+ENCODING 7883
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 17 1 -3
+BITMAP
+E0
+E0
+E0
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+60
+60
+ENDCHAR
+STARTCHAR uni1ECC
+ENCODING 7884
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 17 1 -3
+BITMAP
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+0000
+0300
+0300
+ENDCHAR
+STARTCHAR uni1ECD
+ENCODING 7885
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 13 1 -3
+BITMAP
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1ED0
+ENCODING 7888
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 22 1 0
+BITMAP
+01C0
+0380
+0700
+0000
+0700
+0F80
+1DC0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1ED1
+ENCODING 7889
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+0700
+0E00
+1C00
+0000
+1C00
+3E00
+7700
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1ED2
+ENCODING 7890
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 22 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+0700
+0F80
+1DC0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1ED3
+ENCODING 7891
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+3800
+1C00
+0E00
+0000
+1C00
+3E00
+7700
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1ED6
+ENCODING 7894
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 22 1 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+0700
+0F80
+1DC0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1ED7
+ENCODING 7895
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+3B00
+7F00
+6E00
+0000
+1C00
+3E00
+7700
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1ED8
+ENCODING 7896
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 13 21 1 -3
+BITMAP
+0700
+0F80
+1DC0
+0000
+0F80
+3FE0
+78F0
+7070
+F078
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+0000
+0300
+0300
+ENDCHAR
+STARTCHAR uni1ED9
+ENCODING 7897
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 17 1 -3
+BITMAP
+0E00
+1F00
+3B80
+0000
+1E00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1EDA
+ENCODING 7898
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 18 1 0
+BITMAP
+00E0
+01C0
+0380
+0000
+0F8E
+3FEE
+78F6
+7076
+F07C
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1EDB
+ENCODING 7899
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 12 14 1 0
+BITMAP
+01C0
+0380
+0700
+0000
+1E70
+7FF0
+73B0
+E1F0
+E1E0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1EDC
+ENCODING 7900
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 18 1 0
+BITMAP
+0700
+0380
+01C0
+0000
+0F8E
+3FEE
+78F6
+7076
+F07C
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1EDD
+ENCODING 7901
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 12 14 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+1E70
+7FF0
+73B0
+E1F0
+E1E0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1EE0
+ENCODING 7904
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 18 1 0
+BITMAP
+03B0
+07F0
+06E0
+0000
+0F8E
+3FEE
+78F6
+7076
+F07C
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1EE1
+ENCODING 7905
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 12 14 1 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+1E70
+7FF0
+73B0
+E1F0
+E1E0
+E1C0
+E1C0
+7380
+7F80
+1E00
+ENDCHAR
+STARTCHAR uni1EE2
+ENCODING 7906
+SWIDTH 778 0
+DWIDTH 15 0
+BBX 15 17 1 -3
+BITMAP
+0F8E
+3FEE
+78F6
+7076
+F07C
+E038
+E038
+E038
+E038
+F078
+7070
+78F0
+3FE0
+0F80
+0000
+0300
+0300
+ENDCHAR
+STARTCHAR uni1EE3
+ENCODING 7907
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 12 13 1 -3
+BITMAP
+1E70
+7FF0
+73B0
+E1F0
+E1E0
+E1C0
+E1C0
+7380
+7F80
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1EE4
+ENCODING 7908
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1EE5
+ENCODING 7909
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 9 13 1 -3
+BITMAP
+E380
+E380
+E380
+E380
+E380
+E380
+E380
+E780
+FF80
+7B80
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni1EE8
+ENCODING 7912
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 18 1 0
+BITMAP
+00E0
+01C0
+0380
+0000
+E07C
+E07C
+E07C
+E07C
+E078
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni1EE9
+ENCODING 7913
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 14 1 0
+BITMAP
+0380
+0700
+0E00
+0000
+E3E0
+E3E0
+E3E0
+E3E0
+E3C0
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni1EEA
+ENCODING 7914
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 18 1 0
+BITMAP
+0E00
+0700
+0380
+0000
+E07C
+E07C
+E07C
+E07C
+E078
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni1EEB
+ENCODING 7915
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 14 1 0
+BITMAP
+1C00
+0E00
+0700
+0000
+E3E0
+E3E0
+E3E0
+E3E0
+E3C0
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni1EEE
+ENCODING 7918
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 18 1 0
+BITMAP
+0760
+0FE0
+0DC0
+0000
+E07C
+E07C
+E07C
+E07C
+E078
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni1EEF
+ENCODING 7919
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 14 1 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+E3E0
+E3E0
+E3E0
+E3E0
+E3C0
+E380
+E380
+E780
+FF80
+7B80
+ENDCHAR
+STARTCHAR uni1EF0
+ENCODING 7920
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 17 1 -3
+BITMAP
+E07C
+E07C
+E07C
+E07C
+E078
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR uni1EF1
+ENCODING 7921
+SWIDTH 611 0
+DWIDTH 11 0
+BBX 11 13 1 -3
+BITMAP
+E3E0
+E3E0
+E3E0
+E3E0
+E3C0
+E380
+E380
+E780
+FF80
+7B80
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR Ygrave
+ENCODING 7922
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 18 0 0
+BITMAP
+1C00
+0E00
+0700
+0000
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR ygrave
+ENCODING 7923
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 -4
+BITMAP
+7000
+3800
+1C00
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR uni1EF4
+ENCODING 7924
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 17 0 -3
+BITMAP
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+0000
+0300
+0300
+ENDCHAR
+STARTCHAR uni1EF5
+ENCODING 7925
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 17 1 -7
+BITMAP
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR uni1EF8
+ENCODING 7928
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 13 18 0 0
+BITMAP
+0EC0
+1FC0
+1B80
+0000
+E038
+E038
+7070
+38E0
+38E0
+1DC0
+1DC0
+0F80
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR uni1EF9
+ENCODING 7929
+SWIDTH 556 0
+DWIDTH 11 0
+BBX 9 18 1 -4
+BITMAP
+3B00
+7F00
+6E00
+0000
+E380
+E380
+E380
+7700
+7700
+7700
+3E00
+3E00
+1C00
+1C00
+1C00
+1800
+7800
+7000
+ENDCHAR
+STARTCHAR uni2000
+ENCODING 8192
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2001
+ENCODING 8193
+SWIDTH 1000 0
+DWIDTH 19 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2002
+ENCODING 8194
+SWIDTH 500 0
+DWIDTH 10 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2003
+ENCODING 8195
+SWIDTH 1000 0
+DWIDTH 19 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2004
+ENCODING 8196
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2005
+ENCODING 8197
+SWIDTH 250 0
+DWIDTH 5 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2006
+ENCODING 8198
+SWIDTH 167 0
+DWIDTH 3 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2007
+ENCODING 8199
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2008
+ENCODING 8200
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2009
+ENCODING 8201
+SWIDTH 200 0
+DWIDTH 4 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni200A
+ENCODING 8202
+SWIDTH 100 0
+DWIDTH 2 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni200B
+ENCODING 8203
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2010
+ENCODING 8208
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 5 3 0 4
+BITMAP
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2011
+ENCODING 8209
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 5 3 0 4
+BITMAP
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 10 2 0 4
+BITMAP
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 10 2 0 4
+BITMAP
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 1000 0
+DWIDTH 18 0
+BBX 18 2 0 4
+BITMAP
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 1000 0
+DWIDTH 18 0
+BBX 18 2 0 4
+BITMAP
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 5 1 9
+BITMAP
+60
+C0
+C0
+E0
+E0
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 5 1 9
+BITMAP
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 8218
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 5 1 -3
+BITMAP
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 3 5 1 9
+BITMAP
+E0
+E0
+C0
+C0
+60
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 500 0
+DWIDTH 9 0
+BBX 7 5 1 9
+BITMAP
+66
+CC
+CC
+EE
+EE
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 500 0
+DWIDTH 9 0
+BBX 7 5 1 9
+BITMAP
+EE
+EE
+66
+66
+CC
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 8222
+SWIDTH 500 0
+DWIDTH 9 0
+BBX 7 5 1 -3
+BITMAP
+EE
+EE
+66
+66
+CC
+ENDCHAR
+STARTCHAR uni201F
+ENCODING 8223
+SWIDTH 500 0
+DWIDTH 9 0
+BBX 7 5 1 9
+BITMAP
+EE
+EE
+CC
+CC
+66
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 18 0 -4
+BITMAP
+1C00
+1C00
+1C00
+1C00
+FF80
+FF80
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 556 0
+DWIDTH 10 0
+BBX 9 18 0 -4
+BITMAP
+1C00
+1C00
+1C00
+1C00
+FF80
+FF80
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+FF80
+FF80
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 350 0
+DWIDTH 7 0
+BBX 5 5 1 4
+BITMAP
+70
+F8
+F8
+F8
+70
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 1000 0
+DWIDTH 18 0
+BBX 14 2 2 0
+BITMAP
+C30C
+C30C
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 8240
+SWIDTH 1000 0
+DWIDTH 20 0
+BBX 19 13 0 0
+BITMAP
+706000
+F86000
+D8C000
+D88000
+F98000
+730000
+020000
+0671C0
+0CFBE0
+08DB60
+18DB60
+30FBE0
+3071C0
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 8 0 1
+BITMAP
+1C
+38
+70
+E0
+E0
+70
+38
+1C
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 8 0 1
+BITMAP
+E0
+70
+38
+1C
+1C
+38
+70
+E0
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8260
+SWIDTH 167 0
+DWIDTH 6 0
+BBX 8 13 -1 0
+BITMAP
+03
+03
+06
+06
+0C
+0C
+18
+30
+30
+60
+60
+C0
+C0
+ENDCHAR
+STARTCHAR oneinferior
+ENCODING 8321
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 4 8 0 -5
+BITMAP
+30
+F0
+F0
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR twoinferior
+ENCODING 8322
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 8 0 -5
+BITMAP
+78
+FC
+CC
+1C
+78
+E0
+FC
+FC
+ENDCHAR
+STARTCHAR threeinferior
+ENCODING 8323
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 6 8 0 -5
+BITMAP
+78
+FC
+CC
+38
+3C
+CC
+FC
+78
+ENDCHAR
+STARTCHAR uni20A5
+ENCODING 8357
+SWIDTH 889 0
+DWIDTH 17 0
+BBX 15 14 1 -2
+BITMAP
+00C0
+00C0
+EFFC
+FFFE
+F3CE
+E38E
+E38E
+E38E
+E38E
+E38E
+E78E
+E78E
+0600
+0600
+ENDCHAR
+STARTCHAR uni20A6
+ENCODING 8358
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E070
+F070
+F070
+F870
+FFF0
+FFF0
+EE70
+FFF0
+FFF0
+E370
+E1F0
+E1F0
+E0F0
+E070
+ENDCHAR
+STARTCHAR uni20A9
+ENCODING 8361
+SWIDTH 944 0
+DWIDTH 17 0
+BBX 15 14 1 0
+BITMAP
+E38E
+E38E
+E38E
+E38E
+7FFC
+7FFC
+739C
+7FFC
+3FF8
+36D8
+3EF8
+1C70
+1C70
+1C70
+ENDCHAR
+STARTCHAR Euro
+ENCODING 8364
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 14 14 -1 0
+BITMAP
+03E0
+0FF8
+1E38
+1C1C
+FF9C
+FF80
+3800
+FF80
+FF80
+3C1C
+1C1C
+1E38
+0FF8
+03E0
+ENDCHAR
+STARTCHAR uni20AD
+ENCODING 8365
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 14 1 0
+BITMAP
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FFF8
+FFF8
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+ENDCHAR
+STARTCHAR uni2103
+ENCODING 8451
+SWIDTH 1102 0
+DWIDTH 21 0
+BBX 20 14 0 0
+BITMAP
+000F80
+783FE0
+FC78E0
+CC7070
+CCF070
+FCE000
+78E000
+00E000
+00E000
+00F070
+007070
+0078E0
+003FE0
+000F80
+ENDCHAR
+STARTCHAR uni2109
+ENCODING 8457
+SWIDTH 991 0
+DWIDTH 19 0
+BBX 18 14 0 0
+BITMAP
+00FFC0
+78FFC0
+FCE000
+CCE000
+CCE000
+FCE000
+78FF80
+00FF80
+00E000
+00E000
+00E000
+00E000
+00E000
+00E000
+ENDCHAR
+STARTCHAR trademark
+ENCODING 8482
+SWIDTH 1000 0
+DWIDTH 17 0
+BBX 15 7 1 6
+BITMAP
+FEC6
+10C6
+10AA
+10AA
+10BA
+1092
+1092
+ENDCHAR
+STARTCHAR uni212A
+ENCODING 8490
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 13 14 1 0
+BITMAP
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E780
+E3C0
+E1E0
+E0F0
+E078
+ENDCHAR
+STARTCHAR uni212B
+ENCODING 8491
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0F00
+1980
+1980
+0F00
+0F00
+0F00
+1F80
+1980
+1980
+39C0
+39C0
+30C0
+70E0
+7FE0
+7FE0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni2132
+ENCODING 8498
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+01C0
+01C0
+01C0
+01C0
+01C0
+01C0
+7FC0
+7FC0
+01C0
+01C0
+01C0
+01C0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR universal
+ENCODING 8704
+SWIDTH 722 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E070
+E070
+E070
+7FE0
+7FE0
+70E0
+30C0
+39C0
+39C0
+1980
+1980
+1F80
+0F00
+0F00
+ENDCHAR
+STARTCHAR existential
+ENCODING 8707
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 14 2 0
+BITMAP
+FFC0
+FFC0
+01C0
+01C0
+01C0
+01C0
+7FC0
+7FC0
+01C0
+01C0
+01C0
+01C0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni2204
+ENCODING 8708
+SWIDTH 667 0
+DWIDTH 13 0
+BBX 10 14 2 0
+BITMAP
+FFC0
+FFC0
+03C0
+07C0
+07C0
+07C0
+7FC0
+7FC0
+0DC0
+0DC0
+1DC0
+19C0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 2 1 4
+BITMAP
+FF80
+FF80
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8725
+SWIDTH 167 0
+DWIDTH 6 0
+BBX 8 13 -1 0
+BITMAP
+03
+03
+06
+06
+0C
+0C
+18
+30
+30
+60
+60
+C0
+C0
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 8729
+SWIDTH 278 0
+DWIDTH 5 0
+BBX 2 2 1 6
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR uni2236
+ENCODING 8758
+SWIDTH 333 0
+DWIDTH 6 0
+BBX 3 10 1 0
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni2259
+ENCODING 8793
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 9 1 3
+BITMAP
+1C00
+3E00
+7700
+0000
+FF80
+FF80
+0000
+FF80
+FF80
+ENDCHAR
+STARTCHAR uni225A
+ENCODING 8794
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 9 1 3
+BITMAP
+7700
+3E00
+1C00
+0000
+FF80
+FF80
+0000
+FF80
+FF80
+ENDCHAR
+STARTCHAR notequal
+ENCODING 8800
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 14 1 -1
+BITMAP
+0600
+0600
+0600
+0E00
+0C00
+FF80
+FF80
+1C00
+FF80
+FF80
+3800
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR equivalence
+ENCODING 8801
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 8 0 1
+BITMAP
+FF80
+FF80
+0000
+FF80
+FF80
+0000
+FF80
+FF80
+ENDCHAR
+STARTCHAR uni2262
+ENCODING 8802
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 14 0 -2
+BITMAP
+0600
+0600
+0600
+FF80
+FF80
+0C00
+FF80
+FF80
+1800
+FF80
+FF80
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR lessequal
+ENCODING 8804
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 12 1 -3
+BITMAP
+0380
+0F80
+3E00
+7800
+E000
+7800
+3E00
+0F80
+0380
+0000
+FF80
+FF80
+ENDCHAR
+STARTCHAR greaterequal
+ENCODING 8805
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 12 1 -3
+BITMAP
+E000
+F800
+3E00
+0F00
+0380
+0F00
+3E00
+F800
+E000
+0000
+FF80
+FF80
+ENDCHAR
+STARTCHAR uni226E
+ENCODING 8814
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 14 1 -2
+BITMAP
+0600
+0600
+0600
+0F80
+0F80
+3E00
+7C00
+FC00
+7800
+3E00
+3F80
+3380
+3000
+3000
+ENDCHAR
+STARTCHAR uni226F
+ENCODING 8815
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 14 1 -2
+BITMAP
+0600
+0600
+0600
+EE00
+FC00
+3E00
+0F00
+1F80
+1F00
+3E00
+F800
+F000
+3000
+3000
+ENDCHAR
+STARTCHAR uni2270
+ENCODING 8816
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+0600
+0780
+0F80
+3E00
+7C00
+EC00
+7C00
+3E00
+1F80
+1B80
+3800
+FF80
+FF80
+3000
+ENDCHAR
+STARTCHAR uni2271
+ENCODING 8817
+SWIDTH 584 0
+DWIDTH 11 0
+BBX 9 14 1 -4
+BITMAP
+0600
+E600
+FE00
+3E00
+0F00
+0F80
+0F00
+3E00
+F800
+F800
+3800
+FF80
+FF80
+3000
+ENDCHAR
+STARTCHAR fi
+ENCODING -1
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1EE0
+3EE0
+3800
+3800
+FEE0
+FEE0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+ENDCHAR
+STARTCHAR fl
+ENCODING -1
+SWIDTH 611 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1EE0
+3EE0
+38E0
+38E0
+FEE0
+FEE0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+ENDCHAR
+ENDFONT
diff --git a/dists/bada/Res/scummmobile/helvB18-ASCII.fcc b/dists/bada/Res/scummmobile/helvB18-ASCII.fcc
new file mode 100644
index 0000000000..343ac39e8e
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvB18-ASCII.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/helvB18.bdf b/dists/bada/Res/scummmobile/helvB18.bdf
new file mode 100644
index 0000000000..1d14b6ef4d
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvB18.bdf
@@ -0,0 +1,19752 @@
+STARTFONT 2.1
+FONT -Adobe-Helvetica-Bold-R-Normal--25-180-100-100-P-138-ISO10646-1
+SIZE 18 100 100
+FONTBOUNDINGBOX 28 37 -2 -8
+COMMENT ISO10646-1 extension by Markus Kuhn <mkuhn@acm.org>, 2001-03-20
+COMMENT
+COMMENT +
+COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated.
+COMMENT Copyright 1988, 1994 Digital Equipment Corporation.
+COMMENT
+COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be
+COMMENT registered in certain jurisdictions.
+COMMENT Permission to use these trademarks is hereby granted only in
+COMMENT association with the images described in this file.
+COMMENT
+COMMENT Permission to use, copy, modify, distribute and sell this software
+COMMENT and its documentation for any purpose and without fee is hereby
+COMMENT granted, provided that the above copyright notices appear in all
+COMMENT copies and that both those copyright notices and this permission
+COMMENT notice appear in supporting documentation, and that the names of
+COMMENT Adobe Systems and Digital Equipment Corporation not be used in
+COMMENT advertising or publicity pertaining to distribution of the software
+COMMENT without specific, written prior permission. Adobe Systems and
+COMMENT Digital Equipment Corporation make no representations about the
+COMMENT suitability of this software for any purpose. It is provided "as
+COMMENT is" without express or implied warranty.
+COMMENT -
+STARTPROPERTIES 26
+FOUNDRY "Adobe"
+FAMILY_NAME "Helvetica"
+WEIGHT_NAME "Bold"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 25
+POINT_SIZE 180
+RESOLUTION_X 100
+RESOLUTION_Y 100
+SPACING "P"
+AVERAGE_WIDTH 138
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+CAP_HEIGHT 19
+X_HEIGHT 14
+FONT_ASCENT 22
+FONT_DESCENT 5
+FACE_NAME "Helvetica Bold"
+COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved."
+NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. "
+_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold"
+DEFAULT_CHAR 0
+RELATIVE_SETWIDTH 50
+RELATIVE_WEIGHT 70
+FULL_NAME "Helvetica Bold"
+ENDPROPERTIES
+CHARS 756
+STARTCHAR char0
+ENCODING 0
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 19 2 0
+BITMAP
+AAAA
+0000
+8002
+0000
+8002
+0000
+8002
+0000
+8002
+0000
+8002
+0000
+8002
+0000
+8002
+0000
+8002
+0000
+AAAA
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 278 0
+DWIDTH 6 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 19 2 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+C0
+C0
+C0
+00
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 474 0
+DWIDTH 9 0
+BBX 5 6 2 13
+BITMAP
+D8
+D8
+D8
+D8
+D8
+90
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+7FF0
+7FF0
+1980
+1980
+1980
+1980
+FFE0
+FFE0
+3300
+3300
+3300
+3300
+3300
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 21 0 -2
+BITMAP
+0600
+3F80
+7FE0
+F6E0
+E670
+E670
+F600
+7E00
+3E00
+0F00
+07C0
+07E0
+06F0
+E670
+E670
+E670
+F6F0
+7FE0
+1FC0
+0600
+0600
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 889 0
+DWIDTH 22 0
+BBX 21 18 0 0
+BITMAP
+000700
+3E0700
+7F0E00
+E38E00
+C19C00
+C19C00
+E3B800
+7F3800
+3E7000
+007000
+00E3E0
+00E7F0
+01CE38
+01CC18
+038C18
+038E38
+0707F0
+0703E0
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 18 1 0
+BITMAP
+0F80
+1FC0
+3DE0
+38E0
+38E0
+38E0
+1DC0
+0F80
+1F00
+3F9C
+7BDC
+71FC
+E0F8
+E070
+E0F8
+F1FC
+7FCE
+1F87
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 238 0
+DWIDTH 6 0
+BBX 2 6 2 13
+BITMAP
+C0
+C0
+C0
+C0
+C0
+80
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 24 1 -5
+BITMAP
+0C
+1C
+38
+38
+70
+70
+60
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+60
+70
+70
+38
+38
+1C
+0C
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 24 1 -5
+BITMAP
+C0
+E0
+70
+70
+38
+38
+18
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+18
+38
+38
+70
+70
+E0
+C0
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 8 7 1 12
+BITMAP
+18
+18
+DB
+FF
+3C
+66
+66
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 12 12 1 1
+BITMAP
+0600
+0600
+0600
+0600
+0600
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 6 2 -3
+BITMAP
+E0
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 7 3 0 6
+BITMAP
+FE
+FE
+FE
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 3 2 0
+BITMAP
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 278 0
+DWIDTH 8 0
+BBX 7 19 1 0
+BITMAP
+06
+06
+06
+0C
+0C
+0C
+18
+18
+18
+18
+30
+30
+30
+60
+60
+60
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+1F80
+3FC0
+79E0
+70E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 7 18 2 0
+BITMAP
+0E
+0E
+1E
+FE
+FE
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+1F00
+7FC0
+71E0
+E0E0
+E070
+E070
+0070
+00E0
+01E0
+03C0
+0780
+1F00
+3C00
+7800
+F000
+E000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+1F00
+7FC0
+71C0
+E0E0
+E0E0
+E0E0
+00E0
+01C0
+0F80
+0FE0
+00E0
+0070
+0070
+E070
+E0F0
+71E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+01C0
+03C0
+03C0
+07C0
+07C0
+0DC0
+1DC0
+19C0
+31C0
+71C0
+61C0
+E1C0
+FFF0
+FFF0
+01C0
+01C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+7FE0
+7FE0
+7000
+7000
+7000
+7000
+7F80
+7FC0
+71E0
+00E0
+0070
+0070
+0070
+E070
+E0F0
+F1E0
+7FC0
+1F80
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+0F80
+3FE0
+78E0
+7070
+E070
+E000
+E000
+EF00
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+FFF0
+FFF0
+00F0
+00E0
+01C0
+01C0
+0380
+0380
+0700
+0700
+0E00
+0E00
+1E00
+1C00
+1C00
+3C00
+3800
+3800
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+0F00
+3FC0
+39C0
+70E0
+70E0
+70E0
+70E0
+39C0
+1F80
+3FC0
+70E0
+E070
+E070
+E070
+E070
+70E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+1F80
+7FC0
+79E0
+F0E0
+E070
+E070
+E070
+E070
+F0F0
+79F0
+7FF0
+1F70
+0070
+0070
+E0E0
+F3E0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 14 2 0
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+00
+00
+00
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 17 2 -3
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+00
+00
+00
+00
+E0
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 13 12 0 1
+BITMAP
+0038
+00F8
+03E0
+0F80
+3E00
+F000
+F000
+3E00
+0F80
+03E0
+00F8
+0038
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 10 5 2 5
+BITMAP
+FFC0
+FFC0
+0000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 13 12 1 1
+BITMAP
+E000
+F800
+3E00
+0F80
+03E0
+0078
+0078
+03E0
+0F80
+3E00
+F800
+E000
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+1F80
+7FC0
+79E0
+F0E0
+E0E0
+E1E0
+01C0
+03C0
+0780
+0700
+0E00
+0E00
+0E00
+0E00
+0000
+0000
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 975 0
+DWIDTH 24 0
+BBX 22 22 1 -4
+BITMAP
+01FF00
+07FFC0
+0F81F0
+1E0078
+3C0038
+787D9C
+70FF9C
+F1C71C
+E3871C
+E30E1C
+E70E38
+E70C38
+E71C70
+E71C70
+E39DE0
+F3FFC0
+71F700
+780000
+3C0000
+1F0700
+0FFF00
+03FC00
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 19 1 0
+BITMAP
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 15 19 2 0
+BITMAP
+FFE0
+FFF8
+E078
+E01C
+E01C
+E01C
+E01C
+E038
+FFF0
+FFF8
+E01C
+E00E
+E00E
+E00E
+E00E
+E01E
+E07C
+FFF8
+FFE0
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 19 1 0
+BITMAP
+07F0
+1FFC
+3E3E
+780F
+7007
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+F007
+7007
+780F
+3E3E
+1FFC
+07F0
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 16 19 2 0
+BITMAP
+FFE0
+FFF8
+E07C
+E01E
+E00E
+E00F
+E007
+E007
+E007
+E007
+E007
+E007
+E007
+E00F
+E00E
+E01E
+E07C
+FFF8
+FFE0
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 19 2 0
+BITMAP
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 2 0
+BITMAP
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 19 1 0
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 19 2 0
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 19 2 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 19 1 0
+BITMAP
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+E0E0
+E0E0
+E0E0
+E0E0
+71E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 19 2 0
+BITMAP
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FE00
+FF00
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 2 0
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 833 0
+DWIDTH 23 0
+BBX 19 19 2 0
+BITMAP
+E000E0
+F001E0
+F001E0
+F803E0
+F803E0
+FC07E0
+EC06E0
+EE0EE0
+E60CE0
+E71CE0
+E71CE0
+E318E0
+E3B8E0
+E3B8E0
+E1F0E0
+E1F0E0
+E0E0E0
+E0E0E0
+E0E0E0
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 19 2 0
+BITMAP
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 19 1 0
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 19 2 0
+BITMAP
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 20 1 -1
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F02780
+707700
+783F00
+3E1E00
+1FFE00
+07F700
+000200
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 19 2 0
+BITMAP
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 19 2 0
+BITMAP
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 19 0 0
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 19 2 0
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 667 0
+DWIDTH 18 0
+BBX 16 19 1 0
+BITMAP
+E007
+E007
+F00F
+700E
+781E
+381C
+381C
+3C3C
+1C38
+1C38
+1E78
+0E70
+0E70
+0E70
+07E0
+07E0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 19 1 0
+BITMAP
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+71DC70
+31DC60
+39DCE0
+398CE0
+3B8EE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 667 0
+DWIDTH 18 0
+BBX 16 19 1 0
+BITMAP
+E007
+F00F
+781E
+381C
+1C38
+0E70
+0FF0
+07E0
+03C0
+03C0
+07E0
+0FF0
+0E70
+1C38
+3C3C
+381C
+700E
+F00F
+E007
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 19 1 0
+BITMAP
+E00E
+F00E
+701C
+781C
+3838
+3C38
+1C70
+1C70
+0EE0
+0EE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 19 1 0
+BITMAP
+FFFC
+FFFC
+003C
+0078
+00F0
+01E0
+01E0
+03C0
+0780
+0780
+0F00
+1E00
+1E00
+3C00
+3800
+7800
+F000
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 5 24 1 -5
+BITMAP
+F8
+F8
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+F8
+F8
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 278 0
+DWIDTH 8 0
+BBX 7 19 0 0
+BITMAP
+C0
+C0
+C0
+60
+60
+60
+30
+30
+30
+30
+18
+18
+18
+0C
+0C
+0C
+06
+06
+06
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 5 24 2 -5
+BITMAP
+F8
+F8
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+F8
+F8
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 11 9 1 10
+BITMAP
+0E00
+0E00
+1F00
+1B00
+3B80
+71C0
+71C0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 14 2 0 -5
+BITMAP
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 4 1 15
+BITMAP
+E0
+70
+38
+1C
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 2 0
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+1F80
+3FC0
+79E0
+70E0
+E000
+E000
+E000
+E000
+E000
+E000
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 1 0
+BITMAP
+0070
+0070
+0070
+0070
+0070
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 19 1 0
+BITMAP
+1E
+3E
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 1 -5
+BITMAP
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF00
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 19 2 0
+BITMAP
+E0
+E0
+E0
+00
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 5 24 0 -5
+BITMAP
+38
+38
+38
+00
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+F8
+F0
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 19 2 0
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E1C0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E700
+E780
+E3C0
+E1C0
+E1E0
+E0E0
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 19 2 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 889 0
+DWIDTH 21 0
+BBX 17 14 2 0
+BITMAP
+EF3E00
+FFFF00
+F3E780
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 14 2 0
+BITMAP
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 2 -5
+BITMAP
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 1 -5
+BITMAP
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+0070
+0070
+0070
+0070
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 14 2 0
+BITMAP
+EE
+FE
+FE
+F0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 18 1 0
+BITMAP
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 14 2 0
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E070
+E070
+E070
+70E0
+70E0
+70E0
+39C0
+39C0
+39C0
+1F80
+1F80
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 14 0 0
+BITMAP
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+E0E0
+F1E0
+71C0
+3B80
+3F80
+1F00
+0E00
+1F00
+1F00
+3B80
+7BC0
+71C0
+F1E0
+E0E0
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 19 1 -5
+BITMAP
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 24 1 -5
+BITMAP
+0E
+1C
+38
+38
+38
+38
+38
+38
+38
+38
+70
+E0
+E0
+70
+38
+38
+38
+38
+38
+38
+38
+38
+1C
+0E
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 280 0
+DWIDTH 7 0
+BBX 2 24 3 -5
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 24 2 -5
+BITMAP
+E0
+70
+38
+38
+38
+38
+38
+38
+38
+38
+1C
+0E
+0E
+1C
+38
+38
+38
+38
+38
+38
+38
+38
+70
+E0
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 11 4 1 5
+BITMAP
+78E0
+FEE0
+EFE0
+E3C0
+ENDCHAR
+STARTCHAR space
+ENCODING 160
+SWIDTH 278 0
+DWIDTH 6 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 19 2 -5
+BITMAP
+E0
+E0
+E0
+00
+00
+60
+60
+60
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 18 1 -2
+BITMAP
+0180
+0180
+1F80
+3FC0
+7BE0
+7360
+E300
+E600
+E600
+E600
+E600
+EC00
+ECE0
+7DE0
+7FC0
+3F80
+1800
+1800
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 13 18 1 0
+BITMAP
+1F80
+3FC0
+70E0
+70E0
+7000
+7800
+3800
+1C00
+FFC0
+FFC0
+1C00
+1C00
+1C00
+3800
+3800
+7F38
+FFF8
+F1F0
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 12 1 3
+BITMAP
+C030
+EF70
+7FE0
+39C0
+70E0
+70E0
+70E0
+70E0
+39C0
+7FE0
+EF70
+C030
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 13 18 0 0
+BITMAP
+E038
+E038
+7070
+7070
+38E0
+38E0
+1DC0
+1DC0
+7FF0
+7FF0
+0700
+7FF0
+7FF0
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 280 0
+DWIDTH 7 0
+BBX 2 24 3 -5
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+00
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 -5
+BITMAP
+1F80
+3FC0
+79E0
+70E0
+78E0
+3C00
+1E00
+7F00
+F780
+E3C0
+E1E0
+E0E0
+7070
+7870
+3C70
+1EE0
+0FC0
+0780
+03C0
+71E0
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 2 1 16
+BITMAP
+EE
+EE
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 737 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+01F000
+0FFE00
+1E0F00
+380380
+7001C0
+61F0C0
+E3B8E0
+C60C60
+C60060
+C60060
+C60060
+C60C60
+E3B8E0
+61F0C0
+7001C0
+380380
+1E0F00
+0FFE00
+01F000
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 370 0
+DWIDTH 10 0
+BBX 8 12 1 7
+BITMAP
+7C
+FE
+C6
+1E
+7E
+E6
+C6
+FF
+7B
+00
+FF
+FF
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 10 8 1 3
+BITMAP
+1DC0
+3B80
+7700
+EE00
+EE00
+7700
+3B80
+1DC0
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 12 7 1 4
+BITMAP
+FFF0
+FFF0
+0030
+0030
+0030
+0030
+0030
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 173
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 7 3 0 6
+BITMAP
+FE
+FE
+FE
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 737 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+03F800
+0FFE00
+1C0F00
+380380
+73F9C0
+631CC0
+E30CE0
+C30C60
+C31860
+C3F060
+C33060
+C31860
+E31860
+630CE0
+7000C0
+3801C0
+1E0380
+0FFE00
+03F800
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 2 1 17
+BITMAP
+FE
+FE
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 400 0
+DWIDTH 9 0
+BBX 8 7 0 11
+BITMAP
+3C
+66
+C3
+C3
+C3
+66
+3C
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 11 13 2 0
+BITMAP
+0E00
+0E00
+0E00
+0E00
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 10 0 8
+BITMAP
+78
+FC
+CC
+0C
+1C
+78
+E0
+C0
+FC
+FC
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 10 0 8
+BITMAP
+78
+FC
+CC
+0C
+38
+38
+0C
+CC
+FC
+78
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 4 1 15
+BITMAP
+1C
+38
+70
+E0
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+F3E0
+FEE0
+ECE0
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 24 1 -5
+BITMAP
+0FE0
+3FE0
+7CC0
+7CC0
+FCC0
+FCC0
+FCC0
+FCC0
+FCC0
+7CC0
+7CC0
+3CC0
+1CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 3 2 6
+BITMAP
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 6 1 -5
+BITMAP
+70
+78
+1C
+1C
+FC
+78
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 4 10 1 8
+BITMAP
+30
+30
+F0
+F0
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 365 0
+DWIDTH 10 0
+BBX 8 12 1 7
+BITMAP
+3C
+7E
+E7
+C3
+C3
+C3
+E7
+7E
+3C
+00
+FF
+FF
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 10 8 1 3
+BITMAP
+EE00
+7700
+3B80
+1DC0
+1DC0
+3B80
+7700
+EE00
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 834 0
+DWIDTH 19 0
+BBX 17 18 1 0
+BITMAP
+301800
+301800
+F03000
+F03000
+306000
+306000
+30C000
+30C000
+318600
+318E00
+031E00
+031E00
+063600
+066600
+0C7F80
+0C7F80
+180600
+180600
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 834 0
+DWIDTH 19 0
+BBX 16 18 1 0
+BITMAP
+3018
+3018
+F030
+F030
+3060
+3060
+30C0
+30C0
+319E
+31BF
+0333
+0303
+0607
+061E
+0C38
+0C30
+183F
+183F
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 834 0
+DWIDTH 19 0
+BBX 17 18 1 0
+BITMAP
+781800
+FC1800
+CC3000
+0C3000
+386000
+386000
+0CC000
+CCC000
+FD8600
+798E00
+031E00
+031E00
+063600
+066600
+0C7F80
+0C7F80
+180600
+180600
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+0E00
+0E00
+0E00
+0000
+0000
+0E00
+0E00
+0E00
+0E00
+1C00
+3C00
+7800
+7000
+F0E0
+E0E0
+E1E0
+F3C0
+7FC0
+3F00
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0E00
+0700
+0380
+01C0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0070
+00E0
+01C0
+0380
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+01C0
+03E0
+0770
+0E38
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 23 1 0
+BITMAP
+0798
+0FF8
+0CF0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 23 1 0
+BITMAP
+0E70
+0E70
+0000
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+03C0
+0660
+0420
+0660
+03C0
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 1000 0
+DWIDTH 24 0
+BBX 22 19 1 0
+BITMAP
+03FFF8
+03FFF8
+077000
+077000
+0E7000
+0E7000
+0E7000
+1C7000
+1C7FF0
+1C7FF0
+387000
+387000
+3FF000
+7FF000
+707000
+707000
+E07000
+E07FFC
+E07FFC
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 -5
+BITMAP
+07F0
+1FFC
+3E3E
+780F
+7007
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+F007
+7007
+780F
+3E3E
+1FFC
+07F0
+03C0
+00E0
+00E0
+07E0
+03C0
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 0
+BITMAP
+3800
+1C00
+0E00
+0700
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 0
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 23 2 0
+BITMAP
+38E0
+38E0
+0000
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 6 24 0 0
+BITMAP
+E0
+70
+38
+1C
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 6 24 1 0
+BITMAP
+1C
+38
+70
+E0
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 24 -1 0
+BITMAP
+1C00
+3E00
+7700
+E380
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 23 0 0
+BITMAP
+EE
+EE
+00
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 19 19 -1 0
+BITMAP
+1FFC00
+1FFF00
+1C0F80
+1C03C0
+1C01C0
+1C01E0
+1C00E0
+1C00E0
+FFC0E0
+FFC0E0
+1C00E0
+1C00E0
+1C00E0
+1C01E0
+1C01C0
+1C03C0
+1C0F80
+1FFF00
+1FFC00
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 23 2 0
+BITMAP
+0F30
+1FF0
+19E0
+0000
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+0E0000
+070000
+038000
+01C000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+003800
+007000
+00E000
+01C000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+01C000
+03E000
+077000
+0E3800
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 23 1 0
+BITMAP
+079800
+0FF800
+0CF000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 23 1 0
+BITMAP
+0E3800
+0E3800
+000000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 12 12 1 1
+BITMAP
+4020
+E070
+70E0
+39C0
+1F80
+0F00
+0F00
+1F80
+39C0
+70E0
+E070
+4020
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+03F860
+0FFEE0
+1F1FC0
+3C0380
+380780
+780FC0
+701DC0
+7039C0
+7071C0
+70E1C0
+71C1C0
+7381C0
+7701C0
+7E03C0
+3C0380
+3C0780
+7F1F00
+EFFE00
+C3F800
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+0E00
+0700
+0380
+01C0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+0070
+00E0
+01C0
+0380
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+0380
+07C0
+0EE0
+1C70
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 23 2 0
+BITMAP
+1C70
+1C70
+0000
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 24 1 0
+BITMAP
+0070
+00E0
+01C0
+0380
+0000
+E00E
+F01E
+701C
+783C
+3838
+3C78
+1C70
+1EF0
+0EE0
+0FE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 19 2 0
+BITMAP
+E000
+E000
+E000
+E000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 11 19 2 0
+BITMAP
+1E00
+7F80
+F380
+E1C0
+E1C0
+E1C0
+E1C0
+E380
+EF00
+EF80
+E3C0
+E1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E1C0
+EFC0
+EF80
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+3CC0
+7FC0
+6780
+0000
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+39C0
+39C0
+0000
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0700
+0D80
+0880
+0D80
+0700
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 889 0
+DWIDTH 22 0
+BBX 20 14 1 0
+BITMAP
+1F8F00
+3FFFC0
+71F9E0
+70F0E0
+00E070
+07E070
+3FFFF0
+7CFFF0
+F0E000
+E0E000
+E1F070
+F3F8F0
+7F3FE0
+3E0F80
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 -5
+BITMAP
+1F80
+3FC0
+79E0
+70E0
+E000
+E000
+E000
+E000
+E000
+E000
+70E0
+79E0
+3FC0
+1F80
+1E00
+0700
+0700
+3F00
+1E00
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+39C0
+39C0
+0000
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 6 19 0 0
+BITMAP
+E0
+70
+38
+1C
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 6 19 1 0
+BITMAP
+1C
+38
+70
+E0
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 19 -1 0
+BITMAP
+1C00
+3E00
+7700
+E380
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 18 0 0
+BITMAP
+EE
+EE
+00
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+7000
+1DC0
+0700
+1F00
+6180
+0FC0
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+3CC0
+7FC0
+6780
+0000
+0000
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0E00
+1F00
+3B80
+71C0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+3CC0
+7FC0
+6780
+0000
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+39C0
+39C0
+0000
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 11 12 2 1
+BITMAP
+0E00
+0E00
+0E00
+0000
+0000
+FFE0
+FFE0
+0000
+0000
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 14 14 0 0
+BITMAP
+078C
+1FFC
+3CF8
+3870
+70F8
+71F8
+73B8
+7738
+7E38
+7C38
+3870
+7CF0
+FFE0
+C780
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+3800
+1C00
+0E00
+0700
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+0E00
+1F00
+3B80
+71C0
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 18 2 0
+BITMAP
+39C0
+39C0
+0000
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 24 1 -5
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 2 -5
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 23 1 -5
+BITMAP
+1CE0
+1CE0
+0000
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 22 1 0
+BITMAP
+0FE0
+0FE0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+1FC0
+1FC0
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+1830
+1C70
+0FE0
+07C0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+3060
+38E0
+1FC0
+0F80
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 -5
+BITMAP
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E1E7
+0380
+0700
+0700
+07E0
+03C0
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3FF0
+0E00
+1C00
+1C00
+1F80
+0F00
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0070
+00E0
+01C0
+0380
+0000
+07F0
+1FFC
+3E3E
+780F
+7007
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+F007
+7007
+780F
+3E3E
+1FFC
+07F0
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+1F80
+3FC0
+79E0
+70E0
+E000
+E000
+E000
+E000
+E000
+E000
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+01C0
+03E0
+0770
+0E38
+0000
+07F0
+1FFC
+3E3E
+780F
+7007
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+F007
+7007
+780F
+3E3E
+1FFC
+07F0
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+0E00
+1F00
+3B80
+71C0
+0000
+1F80
+3FC0
+79E0
+70E0
+E000
+E000
+E000
+E000
+E000
+E000
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 22 1 0
+BITMAP
+01C0
+01C0
+0000
+07F0
+1FFC
+3E3E
+780F
+7007
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+F007
+7007
+780F
+3E3E
+1FFC
+07F0
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 17 1 0
+BITMAP
+0E00
+0E00
+0000
+1F80
+3FC0
+79E0
+70E0
+E000
+E000
+E000
+E000
+E000
+E000
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0E38
+0770
+03E0
+01C0
+0000
+07F0
+1FFC
+3E3E
+780F
+7007
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+F007
+7007
+780F
+3E3E
+1FFC
+07F0
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+1F80
+3FC0
+79E0
+70E0
+E000
+E000
+E000
+E000
+E000
+E000
+70E0
+79E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 16 24 2 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+FFE0
+FFF8
+E07C
+E01E
+E00E
+E00F
+E007
+E007
+E007
+E007
+E007
+E007
+E007
+E00F
+E00E
+E01E
+E07C
+FFF8
+FFE0
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 858 0
+DWIDTH 21 0
+BBX 18 19 1 0
+BITMAP
+0071C0
+0071C0
+0071C0
+0070C0
+0070C0
+1F7180
+3FF000
+79F000
+70F000
+E07000
+E07000
+E07000
+E07000
+E07000
+E07000
+70F000
+79F000
+3FF000
+1F7000
+ENDCHAR
+STARTCHAR Dcroat
+ENCODING 272
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 19 19 -1 0
+BITMAP
+1FFC00
+1FFF00
+1C0F80
+1C03C0
+1C01C0
+1C01E0
+1C00E0
+1C00E0
+FFC0E0
+FFC0E0
+1C00E0
+1C00E0
+1C00E0
+1C01E0
+1C01C0
+1C03C0
+1C0F80
+1FFF00
+1FFC00
+ENDCHAR
+STARTCHAR dcroat
+ENCODING 273
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 1 0
+BITMAP
+0070
+0070
+0070
+00F0
+00F0
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 22 2 0
+BITMAP
+3F80
+3F80
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+1FC0
+1FC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 0
+BITMAP
+60C0
+71C0
+3F80
+1F00
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+3060
+38E0
+1FC0
+0F80
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 22 2 0
+BITMAP
+0E00
+0E00
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0700
+0700
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 -5
+BITMAP
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+1C00
+3800
+3800
+3F00
+1E00
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+0E00
+1C00
+1C00
+1F80
+0F00
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 0
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+38E0
+1DC0
+0F80
+0700
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+01C000
+03E000
+077000
+0E3800
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 1 -5
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+0C1800
+0E3800
+07F000
+03E000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 1 -5
+BITMAP
+3060
+38E0
+1FC0
+0F80
+0000
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 22 1 0
+BITMAP
+01C000
+01C000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 1 -5
+BITMAP
+0700
+0700
+0000
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 26 1 -7
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+000000
+00E000
+00E000
+00E000
+006000
+006000
+00C000
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 26 1 -5
+BITMAP
+0300
+0600
+0600
+0700
+0700
+0700
+0000
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+0380
+07C0
+0EE0
+1C70
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 13 24 0 0
+BITMAP
+1C00
+3E00
+7700
+E380
+0000
+3800
+3800
+3800
+3800
+3800
+3BC0
+3FF0
+3C70
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+ENDCHAR
+STARTCHAR Hbar
+ENCODING 294
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 19 2 0
+BITMAP
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+ENDCHAR
+STARTCHAR hbar
+ENCODING 295
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+E000
+E000
+E000
+F800
+F800
+EF00
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 23 -1 0
+BITMAP
+7980
+FF80
+CF00
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 18 -1 0
+BITMAP
+7980
+FF80
+CF00
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 22 0 0
+BITMAP
+FE
+FE
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 17 0 0
+BITMAP
+FE
+FE
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 24 -1 0
+BITMAP
+C180
+E380
+7F00
+3E00
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 19 -1 0
+BITMAP
+C180
+E380
+7F00
+3E00
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 6 24 0 -5
+BITMAP
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3C
+70
+E0
+E0
+FC
+78
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 6 24 0 -5
+BITMAP
+38
+38
+38
+00
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3C
+70
+E0
+E0
+FC
+78
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 22 2 0
+BITMAP
+E0
+E0
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 14 2 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 820 0
+DWIDTH 21 0
+BBX 17 19 2 0
+BITMAP
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E38380
+E38380
+E38380
+E38380
+E1C780
+E1FF00
+E0FE00
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 542 0
+DWIDTH 14 0
+BBX 10 24 2 -5
+BITMAP
+E1C0
+E1C0
+E1C0
+0000
+0000
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+01C0
+01C0
+01C0
+07C0
+0780
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 13 24 1 0
+BITMAP
+01C0
+03E0
+0770
+0E38
+0000
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+E0E0
+E0E0
+E0E0
+E0E0
+71E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 24 -1 -5
+BITMAP
+1C00
+3E00
+7700
+E380
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+7C00
+7800
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 26 2 -7
+BITMAP
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FE00
+FF00
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+0000
+0700
+0700
+0700
+0300
+0300
+0600
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 26 2 -7
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E1C0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E700
+E780
+E3C0
+E1C0
+E1E0
+E0E0
+0000
+0E00
+0E00
+0E00
+0600
+0600
+0C00
+ENDCHAR
+STARTCHAR kgreenlandic
+ENCODING 312
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 14 2 0
+BITMAP
+E1C0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E700
+E780
+E3C0
+E1C0
+E1E0
+E0E0
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 2 0
+BITMAP
+0E00
+1C00
+3800
+7000
+0000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 6 24 1 0
+BITMAP
+1C
+38
+70
+E0
+00
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 26 2 -7
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF0
+FFF0
+0000
+0E00
+0E00
+0E00
+0600
+0600
+0C00
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 26 2 -7
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+E0
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 858 0
+DWIDTH 21 0
+BBX 17 19 2 0
+BITMAP
+E00380
+E00380
+E00380
+E00180
+E00180
+E00300
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+FFF000
+FFF000
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 542 0
+DWIDTH 14 0
+BBX 10 19 2 0
+BITMAP
+E1C0
+E1C0
+E1C0
+E0C0
+E0C0
+E180
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 858 0
+DWIDTH 21 0
+BBX 17 19 2 0
+BITMAP
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00000
+E00380
+E00380
+E00380
+E00000
+E00000
+E00000
+E00000
+FFF000
+FFF000
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 542 0
+DWIDTH 14 0
+BBX 10 19 2 0
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E1C0
+E1C0
+E1C0
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 14 19 0 0
+BITMAP
+3800
+3800
+3800
+3800
+3800
+3800
+3B00
+3E00
+3C00
+7800
+F800
+3800
+3800
+3800
+3800
+3800
+3800
+3FFC
+3FFC
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 19 0 0
+BITMAP
+38
+38
+38
+38
+38
+38
+38
+3E
+3C
+78
+F8
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 26 2 -7
+BITMAP
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+0000
+0380
+0380
+0380
+0180
+0180
+0300
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 21 2 -7
+BITMAP
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+0000
+0E00
+0E00
+0E00
+0600
+0600
+0C00
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 875 0
+DWIDTH 22 0
+BBX 18 19 2 0
+BITMAP
+E00000
+E00000
+E00000
+600000
+600000
+C1DF00
+01FF80
+01E380
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+01C1C0
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 -5
+BITMAP
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+000E
+000E
+000E
+003E
+003C
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+00E0
+00E0
+00E0
+03E0
+03C0
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 22 1 0
+BITMAP
+07F000
+07F000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+1FC0
+1FC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+0C1800
+0E3800
+07F000
+03E000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+3060
+38E0
+1FC0
+0F80
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 23 1 0
+BITMAP
+01DC00
+03B800
+077000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+0EE0
+1DC0
+3B80
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 1000 0
+DWIDTH 26 0
+BBX 24 19 1 0
+BITMAP
+0FDFFE
+1FFFFE
+3C7C00
+703C00
+701C00
+E01C00
+E01C00
+E01C00
+E01FFC
+E01FFC
+E01C00
+E01C00
+E01C00
+E01C00
+701C00
+703C00
+3C7C00
+1FFFFF
+07DFFF
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 14 1 0
+BITMAP
+0F0780
+3FDFE0
+79FCF0
+70F870
+E07038
+E07038
+E07FF8
+E07FF8
+E07000
+E07000
+70F838
+79FC78
+3FDFF0
+0F07C0
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 24 2 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 19 2 0
+BITMAP
+0E
+1C
+38
+70
+00
+EE
+FE
+FE
+F0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 26 2 -7
+BITMAP
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+0000
+0380
+0380
+0380
+0180
+0180
+0300
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 21 2 -7
+BITMAP
+EE
+FE
+FE
+F0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+70
+70
+70
+30
+30
+60
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 24 2 0
+BITMAP
+38E0
+1DC0
+0F80
+0700
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 9 19 1 0
+BITMAP
+E380
+7700
+3E00
+1C00
+0000
+7700
+7F00
+7F00
+7800
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 24 2 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 24 2 0
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+0E00
+1F00
+3B80
+71C0
+0000
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 24 2 -5
+BITMAP
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+0780
+01C0
+01C0
+0FC0
+0780
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 -5
+BITMAP
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0F00
+0380
+0380
+1F80
+0F00
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 19 1 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+0FC0
+3FF0
+7878
+7038
+7800
+7FC0
+3FF0
+0FFC
+003C
+E01C
+E01C
+787C
+3FF8
+1FE0
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 354
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 24 0 -5
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+03C0
+00E0
+00E0
+07E0
+03C0
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 355
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 23 1 -5
+BITMAP
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+3E
+3C
+0E
+0E
+7E
+3C
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 24 0 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 594 0
+DWIDTH 16 0
+BBX 13 19 1 0
+BITMAP
+0038
+3838
+3838
+3818
+3818
+FE30
+FE00
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+3E00
+1E00
+ENDCHAR
+STARTCHAR Tbar
+ENCODING 358
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 19 0 0
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR tbar
+ENCODING 359
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 18 1 0
+BITMAP
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 23 2 0
+BITMAP
+0F30
+1FF0
+19E0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 18 2 0
+BITMAP
+3CC0
+7FC0
+6780
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 0
+BITMAP
+0FE0
+0FE0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 17 2 0
+BITMAP
+3F80
+3F80
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+1830
+1C70
+0FE0
+07C0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+60C0
+71C0
+3F80
+1F00
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 25 2 0
+BITMAP
+0380
+07C0
+06C0
+07C0
+0380
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 20 2 0
+BITMAP
+0E00
+1F00
+1B00
+1F00
+0E00
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 23 2 0
+BITMAP
+03B8
+0770
+0EE0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 18 2 0
+BITMAP
+0EE0
+1DC0
+3B80
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 -5
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+0700
+0E00
+0E00
+0FC0
+0780
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1FE0
+0E00
+1C00
+1C00
+1F80
+0F00
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 24 1 0
+BITMAP
+007000
+00F800
+01DC00
+038E00
+000000
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+71DC70
+31DC60
+39DCE0
+398CE0
+3B8EE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+00E000
+01F000
+03B800
+071C00
+000000
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 24 1 0
+BITMAP
+0380
+07C0
+0EE0
+1C70
+0000
+E00E
+F00E
+701C
+781C
+3838
+3C38
+1C70
+1C70
+0EE0
+0EE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 24 1 -5
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 18 1 0
+BITMAP
+0EE0
+0EE0
+0000
+0000
+E00E
+E00E
+701C
+3838
+1830
+1C70
+0EE0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 24 1 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+FFFC
+FFFC
+003C
+0078
+00F0
+01E0
+01E0
+03C0
+0780
+0780
+0F00
+1E00
+1E00
+3C00
+3800
+7800
+F000
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 22 1 0
+BITMAP
+0380
+0380
+0000
+FFFC
+FFFC
+003C
+0078
+00F0
+01E0
+01E0
+03C0
+0780
+0780
+0F00
+1E00
+1E00
+3C00
+3800
+7800
+F000
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 17 1 0
+BITMAP
+0E00
+0E00
+0000
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 19 1 0
+BITMAP
+38E0
+1DC0
+0F80
+0700
+0000
+FFF8
+FFF8
+0078
+00F0
+01E0
+03C0
+0780
+0F00
+1E00
+3C00
+7800
+F000
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR uni0186
+ENCODING 390
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 19 1 0
+BITMAP
+0FE0
+3FF8
+7C7C
+F01E
+E00E
+E00F
+0007
+0007
+0007
+0007
+0007
+0007
+0007
+000F
+E00E
+F01E
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni0189
+ENCODING 393
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 19 19 -1 0
+BITMAP
+1FFC00
+1FFF00
+1C0F80
+1C03C0
+1C01C0
+1C01E0
+1C00E0
+1C00E0
+FFC0E0
+FFC0E0
+1C00E0
+1C00E0
+1C00E0
+1C01E0
+1C01C0
+1C03C0
+1C0F80
+1FFF00
+1FFC00
+ENDCHAR
+STARTCHAR uni018E
+ENCODING 398
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 19 2 0
+BITMAP
+FFF8
+FFF8
+0038
+0038
+0038
+0038
+0038
+0038
+0038
+3FF8
+3FF8
+0038
+0038
+0038
+0038
+0038
+0038
+7FF8
+7FF8
+ENDCHAR
+STARTCHAR florin
+ENCODING 402
+SWIDTH 556 0
+DWIDTH 12 0
+BBX 13 23 -2 -5
+BITMAP
+00F8
+01F8
+03C0
+0380
+0380
+0380
+1FF0
+1FF0
+0700
+0700
+0700
+0700
+0700
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0C00
+1C00
+F800
+F000
+ENDCHAR
+STARTCHAR uni0197
+ENCODING 407
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 19 2 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni019A
+ENCODING 410
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 19 2 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni019D
+ENCODING 413
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 17 24 0 -5
+BITMAP
+380380
+3C0380
+3C0380
+3E0380
+3E0380
+3F0380
+3B8380
+3B8380
+39C380
+38E380
+38E380
+387380
+383380
+383B80
+381F80
+380F80
+380F80
+380780
+380380
+380000
+380000
+380000
+F80000
+F00000
+ENDCHAR
+STARTCHAR uni019F
+ENCODING 415
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 19 1 0
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+FFFF80
+FFFF80
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR Ohorn
+ENCODING 416
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 18 19 1 0
+BITMAP
+07F1C0
+1FFDC0
+3E3FC0
+780FC0
+7007C0
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR ohorn
+ENCODING 417
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 14 14 1 0
+BITMAP
+0F1C
+3FDC
+79FC
+70EC
+E07C
+E078
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni01A7
+ENCODING 423
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 19 2 0
+BITMAP
+0FC0
+3FF0
+7C78
+703C
+701C
+001C
+003C
+00F8
+0FF0
+3F80
+7C00
+F000
+E000
+E01C
+E01C
+F01C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni01A8
+ENCODING 424
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+1F80
+3FC0
+79E0
+70E0
+00E0
+07E0
+3FC0
+7E00
+F000
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR uni01AE
+ENCODING 430
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 24 0 -5
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+03E0
+01E0
+ENDCHAR
+STARTCHAR Uhorn
+ENCODING 431
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 17 19 2 0
+BITMAP
+E00F80
+E00F80
+E00F80
+E00F80
+E00F80
+E00F00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+F01E00
+701C00
+7C7C00
+3FF800
+0FE000
+ENDCHAR
+STARTCHAR uhorn
+ENCODING 432
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 13 14 2 0
+BITMAP
+E0F8
+E0F8
+E0F8
+E0F8
+E0F8
+E0F0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni01B5
+ENCODING 437
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 19 1 0
+BITMAP
+FFFC
+FFFC
+003C
+0078
+00F0
+01E0
+01E0
+03C0
+0780
+0780
+0F00
+1E00
+1E00
+3C00
+3800
+7800
+F000
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR uni01B6
+ENCODING 438
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR uni01BB
+ENCODING 443
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+1F00
+7FC0
+71E0
+E0E0
+E070
+E070
+0070
+00E0
+FFF0
+FFF0
+0780
+1F00
+3C00
+7800
+F000
+E000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR uni01BC
+ENCODING 444
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 12 18 0 0
+BITMAP
+7FE0
+7FE0
+7000
+7000
+7000
+7000
+7F80
+7FC0
+71E0
+00E0
+0070
+0070
+0070
+E070
+E0F0
+F1E0
+7FC0
+1F80
+ENDCHAR
+STARTCHAR uni01C0
+ENCODING 448
+SWIDTH 280 0
+DWIDTH 7 0
+BBX 2 24 3 -5
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni01C2
+ENCODING 450
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 10 24 2 -4
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+FFC0
+FFC0
+0C00
+FFC0
+FFC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni01C3
+ENCODING 451
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 19 2 0
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+C0
+C0
+C0
+00
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni01CD
+ENCODING 461
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni01CE
+ENCODING 462
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+38E0
+1DC0
+0F80
+0700
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni01CF
+ENCODING 463
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 24 -1 0
+BITMAP
+E380
+7700
+3E00
+1C00
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR uni01D0
+ENCODING 464
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 19 -1 0
+BITMAP
+E380
+7700
+3E00
+1C00
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR uni01D1
+ENCODING 465
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+0E3800
+077000
+03E000
+01C000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni01D2
+ENCODING 466
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+38E0
+1DC0
+0F80
+0700
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni01D3
+ENCODING 467
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni01D4
+ENCODING 468
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni01D5
+ENCODING 469
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 26 2 0
+BITMAP
+0FE0
+0FE0
+0000
+1C70
+1C70
+0000
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni01D6
+ENCODING 470
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 21 2 0
+BITMAP
+3F80
+3F80
+0000
+39C0
+39C0
+0000
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni01D7
+ENCODING 471
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 28 2 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+1C70
+1C70
+0000
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni01D8
+ENCODING 472
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 23 2 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+39C0
+39C0
+0000
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni01D9
+ENCODING 473
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 28 2 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+1C70
+1C70
+0000
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni01DA
+ENCODING 474
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 23 2 0
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+39C0
+39C0
+0000
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni01DB
+ENCODING 475
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 28 2 0
+BITMAP
+0E00
+0700
+0380
+01C0
+0000
+1C70
+1C70
+0000
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni01DC
+ENCODING 476
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 23 2 0
+BITMAP
+3800
+1C00
+0E00
+0700
+0000
+39C0
+39C0
+0000
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni01DD
+ENCODING 477
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+1F00
+7FC0
+F1E0
+E0E0
+0070
+0070
+FFF0
+FFF0
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni01DE
+ENCODING 478
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 26 1 0
+BITMAP
+07F0
+07F0
+0000
+0E70
+0E70
+0000
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni01DF
+ENCODING 479
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 21 1 0
+BITMAP
+1FC0
+1FC0
+0000
+39C0
+39C0
+0000
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni01E0
+ENCODING 480
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 25 1 0
+BITMAP
+0FE0
+0FE0
+0000
+0380
+0380
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni01E1
+ENCODING 481
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 20 1 0
+BITMAP
+1FC0
+1FC0
+0000
+0700
+0700
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni01E2
+ENCODING 482
+SWIDTH 1000 0
+DWIDTH 24 0
+BBX 22 22 1 0
+BITMAP
+00FE00
+00FE00
+000000
+03FFF8
+03FFF8
+077000
+077000
+0E7000
+0E7000
+0E7000
+1C7000
+1C7FF0
+1C7FF0
+387000
+387000
+3FF000
+7FF000
+707000
+707000
+E07000
+E07FFC
+E07FFC
+ENDCHAR
+STARTCHAR uni01E3
+ENCODING 483
+SWIDTH 889 0
+DWIDTH 22 0
+BBX 20 17 1 0
+BITMAP
+03F800
+03F800
+000000
+1F8F00
+3FFFC0
+71F9E0
+70F0E0
+00E070
+07E070
+3FFFF0
+7CFFF0
+F0E000
+E0E000
+E1F070
+F3F8F0
+7F3FE0
+3E0F80
+ENDCHAR
+STARTCHAR uni01E4
+ENCODING 484
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 19 1 0
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00780
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR uni01E5
+ENCODING 485
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 1 -5
+BITMAP
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+FFF0
+FFF0
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR Gcaron
+ENCODING 486
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+0E3800
+077000
+03E000
+01C000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR gcaron
+ENCODING 487
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 1 -5
+BITMAP
+38E0
+1DC0
+0F80
+0700
+0000
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni01E8
+ENCODING 488
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 24 2 0
+BITMAP
+38E0
+1DC0
+0F80
+0700
+0000
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FE00
+FF00
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+ENDCHAR
+STARTCHAR uni01E9
+ENCODING 489
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 13 24 0 0
+BITMAP
+E380
+7700
+3E00
+1C00
+0000
+3800
+3800
+3800
+3800
+3800
+3870
+38F0
+39E0
+3BC0
+3F80
+3F00
+3F80
+3BC0
+39C0
+39E0
+38F0
+3870
+3878
+3838
+ENDCHAR
+STARTCHAR uni01EA
+ENCODING 490
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 -5
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+038000
+070000
+070000
+07E000
+03C000
+ENDCHAR
+STARTCHAR uni01EB
+ENCODING 491
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F80
+0E00
+1C00
+1C00
+1F80
+0F00
+ENDCHAR
+STARTCHAR uni01EC
+ENCODING 492
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 27 1 -5
+BITMAP
+07F000
+07F000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+038000
+070000
+070000
+07E000
+03C000
+ENDCHAR
+STARTCHAR uni01ED
+ENCODING 493
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 22 1 -5
+BITMAP
+1FC0
+1FC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F80
+0E00
+1C00
+1C00
+1F80
+0F00
+ENDCHAR
+STARTCHAR uni01F0
+ENCODING 496
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 24 -1 -5
+BITMAP
+E380
+7700
+3E00
+1C00
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+7C00
+7800
+ENDCHAR
+STARTCHAR uni01F4
+ENCODING 500
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+007000
+00E000
+01C000
+038000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR uni01F5
+ENCODING 501
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 1 -5
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni01F8
+ENCODING 504
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+ENDCHAR
+STARTCHAR uni01F9
+ENCODING 505
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+7000
+3800
+1C00
+0E00
+0000
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR Aringacute
+ENCODING 506
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 29 1 0
+BITMAP
+0070
+00E0
+01C0
+0380
+0000
+03C0
+0660
+0420
+0660
+03C0
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR aringacute
+ENCODING 507
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+0700
+0D80
+0880
+0D80
+0700
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR AEacute
+ENCODING 508
+SWIDTH 1000 0
+DWIDTH 24 0
+BBX 22 24 1 0
+BITMAP
+000E00
+001C00
+003800
+007000
+000000
+03FFF8
+03FFF8
+077000
+077000
+0E7000
+0E7000
+0E7000
+1C7000
+1C7FF0
+1C7FF0
+387000
+387000
+3FF000
+7FF000
+707000
+707000
+E07000
+E07FFC
+E07FFC
+ENDCHAR
+STARTCHAR aeacute
+ENCODING 509
+SWIDTH 889 0
+DWIDTH 22 0
+BBX 20 19 1 0
+BITMAP
+001C00
+003800
+007000
+00E000
+000000
+1F8F00
+3FFFC0
+71F9E0
+70F0E0
+00E070
+07E070
+3FFFF0
+7CFFF0
+F0E000
+E0E000
+E1F070
+F3F8F0
+7F3FE0
+3E0F80
+ENDCHAR
+STARTCHAR Oslashacute
+ENCODING 510
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 24 0 0
+BITMAP
+001C00
+003800
+007000
+00E000
+000000
+03F860
+0FFEE0
+1F1FC0
+3C0380
+380780
+780FC0
+701DC0
+7039C0
+7071C0
+70E1C0
+71C1C0
+7381C0
+7701C0
+7E03C0
+3C0380
+3C0780
+7F1F00
+EFFE00
+C3F800
+ENDCHAR
+STARTCHAR oslashacute
+ENCODING 511
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 14 19 0 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+078C
+1FFC
+3CF8
+3870
+70F8
+71F8
+73B8
+7738
+7E38
+7C38
+3870
+7CF0
+FFE0
+C780
+ENDCHAR
+STARTCHAR uni0200
+ENCODING 512
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 23 1 0
+BITMAP
+1DC0
+0EE0
+0770
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni0201
+ENCODING 513
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+7700
+3B80
+1DC0
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni0202
+ENCODING 514
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+07C0
+0FE0
+1C70
+1830
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni0203
+ENCODING 515
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0F80
+1FC0
+38E0
+3060
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni0204
+ENCODING 516
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 23 2 0
+BITMAP
+EE00
+7700
+3B80
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni0205
+ENCODING 517
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+7700
+3B80
+1DC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni0206
+ENCODING 518
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 0
+BITMAP
+1F00
+3F80
+71C0
+60C0
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni0207
+ENCODING 519
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0F80
+1FC0
+38E0
+3060
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni0208
+ENCODING 520
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 23 -2 0
+BITMAP
+EE00
+7700
+3B80
+0000
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni0209
+ENCODING 521
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 18 -2 0
+BITMAP
+EE00
+7700
+3B80
+0000
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni020A
+ENCODING 522
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 24 -1 0
+BITMAP
+3E00
+7F00
+E380
+C180
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR uni020B
+ENCODING 523
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 19 -1 0
+BITMAP
+3E00
+7F00
+E380
+C180
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+ENDCHAR
+STARTCHAR uni020C
+ENCODING 524
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 23 1 0
+BITMAP
+1DC000
+0EE000
+077000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni020D
+ENCODING 525
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+7700
+3B80
+1DC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni020E
+ENCODING 526
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 24 1 0
+BITMAP
+03E000
+07F000
+0E3800
+0C1800
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni020F
+ENCODING 527
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 19 1 0
+BITMAP
+0F80
+1FC0
+38E0
+3060
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni0210
+ENCODING 528
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 23 2 0
+BITMAP
+7700
+3B80
+1DC0
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+ENDCHAR
+STARTCHAR uni0211
+ENCODING 529
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 9 18 0 0
+BITMAP
+EE00
+7700
+3B80
+0000
+3B80
+3F80
+3F80
+3C00
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+3800
+ENDCHAR
+STARTCHAR uni0212
+ENCODING 530
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 24 2 0
+BITMAP
+0F80
+1FC0
+38E0
+3060
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+ENDCHAR
+STARTCHAR uni0213
+ENCODING 531
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 9 19 1 0
+BITMAP
+3E00
+7F00
+E380
+C180
+0000
+7700
+7F00
+7F00
+7800
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+7000
+ENDCHAR
+STARTCHAR uni0214
+ENCODING 532
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 23 2 0
+BITMAP
+3B80
+1DC0
+0EE0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni0215
+ENCODING 533
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 18 2 0
+BITMAP
+EE00
+7700
+3B80
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni0216
+ENCODING 534
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+07C0
+0FE0
+1C70
+1830
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni0217
+ENCODING 535
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 0
+BITMAP
+1F00
+3F80
+71C0
+60C0
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR Scommaaccent
+ENCODING 536
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 26 2 -7
+BITMAP
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+0000
+0700
+0700
+0700
+0300
+0300
+0600
+ENDCHAR
+STARTCHAR scommaaccent
+ENCODING 537
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 21 1 -7
+BITMAP
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0000
+0E00
+0E00
+0E00
+0600
+0600
+0C00
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 538
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 26 0 -7
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0000
+0380
+0380
+0380
+0180
+0180
+0300
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 539
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 25 1 -7
+BITMAP
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+00
+38
+38
+38
+18
+18
+30
+ENDCHAR
+STARTCHAR uni021E
+ENCODING 542
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 0
+BITMAP
+1C70
+0EE0
+07C0
+0380
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+ENDCHAR
+STARTCHAR uni021F
+ENCODING 543
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 13 24 0 0
+BITMAP
+E380
+7700
+3E00
+1C00
+0000
+3800
+3800
+3800
+3800
+3800
+3BC0
+3FF0
+3C70
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+3838
+ENDCHAR
+STARTCHAR uni0226
+ENCODING 550
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 22 1 0
+BITMAP
+0380
+0380
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni0227
+ENCODING 551
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0700
+0700
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni0228
+ENCODING 552
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 -5
+BITMAP
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+0F00
+0380
+0380
+1F80
+0F00
+ENDCHAR
+STARTCHAR uni0229
+ENCODING 553
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+0F00
+0380
+0380
+1F80
+0F00
+ENDCHAR
+STARTCHAR uni022A
+ENCODING 554
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 26 1 0
+BITMAP
+07F000
+07F000
+000000
+0E3800
+0E3800
+000000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni022B
+ENCODING 555
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 21 1 0
+BITMAP
+1FC0
+1FC0
+0000
+39C0
+39C0
+0000
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni022C
+ENCODING 556
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 26 1 0
+BITMAP
+07F000
+07F000
+000000
+079800
+0FF800
+0CF000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni022D
+ENCODING 557
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+3F80
+3F80
+0000
+3CC0
+7FC0
+6780
+0000
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni022E
+ENCODING 558
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 22 1 0
+BITMAP
+01C000
+01C000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni022F
+ENCODING 559
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 17 1 0
+BITMAP
+0700
+0700
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni0230
+ENCODING 560
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 25 1 0
+BITMAP
+07F000
+07F000
+000000
+01C000
+01C000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni0231
+ENCODING 561
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 20 1 0
+BITMAP
+1FC0
+1FC0
+0000
+0700
+0700
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni0232
+ENCODING 562
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 22 1 0
+BITMAP
+0FE0
+0FE0
+0000
+E00E
+F00E
+701C
+781C
+3838
+3C38
+1C70
+1C70
+0EE0
+0EE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR uni0233
+ENCODING 563
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 22 1 -5
+BITMAP
+1FC0
+1FC0
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni0250
+ENCODING 592
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+E7C0
+FFE0
+7CF0
+7870
+7070
+70F0
+73E0
+7FC0
+7E00
+7000
+70E0
+78E0
+3FC0
+1F80
+ENDCHAR
+STARTCHAR uni0254
+ENCODING 596
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 14 1 0
+BITMAP
+3F00
+7F80
+F3C0
+E1C0
+00E0
+00E0
+00E0
+00E0
+00E0
+00E0
+E1C0
+F3C0
+7F80
+3F00
+ENDCHAR
+STARTCHAR uni0258
+ENCODING 600
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+0070
+0070
+E0E0
+F1E0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR uni0259
+ENCODING 601
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+1F00
+7FC0
+F1E0
+E0E0
+0070
+0070
+FFF0
+FFF0
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni025F
+ENCODING 607
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 19 1 -5
+BITMAP
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+F8
+F0
+ENDCHAR
+STARTCHAR uni0265
+ENCODING 613
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+71E0
+7FE0
+1EE0
+00E0
+00E0
+00E0
+00E0
+00E0
+ENDCHAR
+STARTCHAR uni0275
+ENCODING 629
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni0279
+ENCODING 633
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 14 2 0
+BITMAP
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+0E
+1E
+FE
+FE
+EE
+ENDCHAR
+STARTCHAR uni0287
+ENCODING 647
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 18 1 0
+BITMAP
+F0
+F8
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni0288
+ENCODING 648
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 23 1 -5
+BITMAP
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+ENDCHAR
+STARTCHAR uni0289
+ENCODING 649
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 14 2 0
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+FFE0
+FFE0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni028C
+ENCODING 652
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 14 1 0
+BITMAP
+0F00
+0F00
+0F00
+1F80
+1F80
+39C0
+39C0
+39C0
+70E0
+70E0
+70E0
+E070
+E070
+E070
+ENDCHAR
+STARTCHAR uni028D
+ENCODING 653
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 14 0 0
+BITMAP
+0E0E00
+0E0E00
+0E0E00
+1F1F00
+1F1F00
+1B1B00
+3BBB80
+33B980
+31B180
+71F1C0
+71F1C0
+60E0C0
+E0E0E0
+E0E0E0
+ENDCHAR
+STARTCHAR uni028E
+ENCODING 654
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 19 1 0
+BITMAP
+01E0
+03E0
+0380
+0700
+0700
+0E00
+0E00
+0F00
+1F00
+1F80
+1F80
+39C0
+39C0
+79E0
+70E0
+70F0
+E070
+E038
+E038
+ENDCHAR
+STARTCHAR uni029E
+ENCODING 670
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 19 2 -5
+BITMAP
+E0E0
+F0E0
+70E0
+78E0
+3CE0
+1CE0
+1EE0
+0FE0
+07E0
+0FE0
+1EE0
+3CE0
+78E0
+70E0
+00E0
+00E0
+00E0
+00E0
+00E0
+ENDCHAR
+STARTCHAR uni02BB
+ENCODING 699
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 6 2 13
+BITMAP
+60
+C0
+C0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR afii57929
+ENCODING 700
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 6 2 13
+BITMAP
+E0
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR afii64937
+ENCODING 701
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 6 2 13
+BITMAP
+E0
+E0
+E0
+C0
+C0
+60
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 710
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 9 4 0 15
+BITMAP
+1C00
+3E00
+7700
+E380
+ENDCHAR
+STARTCHAR caron
+ENCODING 711
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 9 4 0 15
+BITMAP
+E380
+7700
+3E00
+1C00
+ENDCHAR
+STARTCHAR uni02C8
+ENCODING 712
+SWIDTH 238 0
+DWIDTH 6 0
+BBX 2 6 2 13
+BITMAP
+C0
+C0
+C0
+C0
+C0
+80
+ENDCHAR
+STARTCHAR macron
+ENCODING 713
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 2 1 17
+BITMAP
+FE
+FE
+ENDCHAR
+STARTCHAR uni02CA
+ENCODING 714
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 4 1 15
+BITMAP
+1C
+38
+70
+E0
+ENDCHAR
+STARTCHAR uni02CB
+ENCODING 715
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 4 1 15
+BITMAP
+E0
+70
+38
+1C
+ENDCHAR
+STARTCHAR uni02CD
+ENCODING 717
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 2 1 -3
+BITMAP
+FE
+FE
+ENDCHAR
+STARTCHAR uni02CE
+ENCODING 718
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 4 1 -5
+BITMAP
+E0
+70
+38
+1C
+ENDCHAR
+STARTCHAR uni02CF
+ENCODING 719
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 4 1 -5
+BITMAP
+1C
+38
+70
+E0
+ENDCHAR
+STARTCHAR breve
+ENCODING 728
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 9 4 0 15
+BITMAP
+C180
+E380
+7F00
+3E00
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 729
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 2 2 16
+BITMAP
+E0
+E0
+ENDCHAR
+STARTCHAR ring
+ENCODING 730
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 5 5 1 14
+BITMAP
+70
+F8
+D8
+F8
+70
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 731
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 6 1 -5
+BITMAP
+3C
+70
+E0
+E0
+FC
+78
+ENDCHAR
+STARTCHAR tilde
+ENCODING 732
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 9 3 0 16
+BITMAP
+7980
+FF80
+CF00
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 733
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 9 3 0 16
+BITMAP
+3B80
+7700
+EE00
+ENDCHAR
+STARTCHAR uni02EE
+ENCODING 750
+SWIDTH 500 0
+DWIDTH 12 0
+BBX 8 6 2 13
+BITMAP
+E7
+E7
+E7
+63
+63
+C6
+ENDCHAR
+STARTCHAR uni037E
+ENCODING 894
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 17 2 -3
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+00
+00
+00
+00
+E0
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR tonos
+ENCODING 900
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 4 1 15
+BITMAP
+1C
+38
+70
+E0
+ENDCHAR
+STARTCHAR dieresistonos
+ENCODING 901
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 7 1 16
+BITMAP
+0E
+1C
+38
+70
+00
+EE
+EE
+ENDCHAR
+STARTCHAR anoteleia
+ENCODING 903
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 3 2 6
+BITMAP
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR mu
+ENCODING 956
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+F3E0
+FEE0
+ECE0
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E00
+ENCODING 7680
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 25 1 -6
+BITMAP
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+0000
+01C0
+03E0
+0360
+03E0
+01C0
+ENDCHAR
+STARTCHAR uni1E01
+ENCODING 7681
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 20 1 -6
+BITMAP
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+0000
+0700
+0F80
+0D80
+0F80
+0700
+ENDCHAR
+STARTCHAR uni1E02
+ENCODING 7682
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 15 22 2 0
+BITMAP
+0700
+0700
+0000
+FFE0
+FFF8
+E078
+E01C
+E01C
+E01C
+E01C
+E038
+FFF0
+FFF8
+E01C
+E00E
+E00E
+E00E
+E00E
+E01E
+E07C
+FFF8
+FFE0
+ENDCHAR
+STARTCHAR uni1E03
+ENCODING 7683
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 2 0
+BITMAP
+3800
+3800
+0000
+E000
+E000
+E000
+E000
+E000
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+ENDCHAR
+STARTCHAR uni1E04
+ENCODING 7684
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 15 22 2 -3
+BITMAP
+FFE0
+FFF8
+E078
+E01C
+E01C
+E01C
+E01C
+E038
+FFF0
+FFF8
+E01C
+E00E
+E00E
+E00E
+E00E
+E01E
+E07C
+FFF8
+FFE0
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E05
+ENCODING 7685
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E06
+ENCODING 7686
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 15 22 2 -3
+BITMAP
+FFE0
+FFF8
+E078
+E01C
+E01C
+E01C
+E01C
+E038
+FFF0
+FFF8
+E01C
+E00E
+E00E
+E00E
+E00E
+E01E
+E07C
+FFF8
+FFE0
+0000
+0FE0
+0FE0
+ENDCHAR
+STARTCHAR uni1E07
+ENCODING 7687
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+0000
+3F80
+3F80
+ENDCHAR
+STARTCHAR uni1E08
+ENCODING 7688
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 29 1 -5
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+07F0
+1FFC
+3E3E
+780F
+7007
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+F007
+7007
+780F
+3E3E
+1FFC
+07F0
+03C0
+00E0
+00E0
+07E0
+03C0
+ENDCHAR
+STARTCHAR uni1E09
+ENCODING 7689
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 24 1 -5
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+1F80
+3FC0
+79E0
+70E0
+E000
+E000
+E000
+E000
+E000
+E000
+70E0
+79E0
+3FC0
+1F80
+1E00
+0700
+0700
+3F00
+1E00
+ENDCHAR
+STARTCHAR uni1E0A
+ENCODING 7690
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 16 22 2 0
+BITMAP
+0380
+0380
+0000
+FFE0
+FFF8
+E07C
+E01E
+E00E
+E00F
+E007
+E007
+E007
+E007
+E007
+E007
+E007
+E00F
+E00E
+E01E
+E07C
+FFF8
+FFE0
+ENDCHAR
+STARTCHAR uni1E0B
+ENCODING 7691
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 1 0
+BITMAP
+00E0
+00E0
+0000
+0070
+0070
+0070
+0070
+0070
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+ENDCHAR
+STARTCHAR uni1E0C
+ENCODING 7692
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 16 22 2 -3
+BITMAP
+FFE0
+FFF8
+E07C
+E01E
+E00E
+E00F
+E007
+E007
+E007
+E007
+E007
+E007
+E007
+E00F
+E00E
+E01E
+E07C
+FFF8
+FFE0
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E0D
+ENCODING 7693
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 1 -3
+BITMAP
+0070
+0070
+0070
+0070
+0070
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1E0E
+ENCODING 7694
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 16 22 2 -3
+BITMAP
+FFE0
+FFF8
+E07C
+E01E
+E00E
+E00F
+E007
+E007
+E007
+E007
+E007
+E007
+E007
+E00F
+E00E
+E01E
+E07C
+FFF8
+FFE0
+0000
+0FE0
+0FE0
+ENDCHAR
+STARTCHAR uni1E0F
+ENCODING 7695
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 1 -3
+BITMAP
+0070
+0070
+0070
+0070
+0070
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0000
+1FC0
+1FC0
+ENDCHAR
+STARTCHAR uni1E10
+ENCODING 7696
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 16 24 2 -5
+BITMAP
+FFE0
+FFF8
+E07C
+E01E
+E00E
+E00F
+E007
+E007
+E007
+E007
+E007
+E007
+E007
+E00F
+E00E
+E01E
+E07C
+FFF8
+FFE0
+0780
+01C0
+01C0
+0FC0
+0780
+ENDCHAR
+STARTCHAR uni1E11
+ENCODING 7697
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 1 -5
+BITMAP
+0070
+0070
+0070
+0070
+0070
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0780
+01C0
+01C0
+0FC0
+0780
+ENDCHAR
+STARTCHAR uni1E12
+ENCODING 7698
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 16 24 2 -5
+BITMAP
+FFE0
+FFF8
+E07C
+E01E
+E00E
+E00F
+E007
+E007
+E007
+E007
+E007
+E007
+E007
+E00F
+E00E
+E01E
+E07C
+FFF8
+FFE0
+0000
+0380
+07C0
+0EE0
+1C70
+ENDCHAR
+STARTCHAR uni1E13
+ENCODING 7699
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 1 -5
+BITMAP
+0070
+0070
+0070
+0070
+0070
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0000
+0700
+0F80
+1DC0
+38E0
+ENDCHAR
+STARTCHAR uni1E14
+ENCODING 7700
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 27 2 0
+BITMAP
+3800
+1C00
+0E00
+0700
+0000
+3F80
+3F80
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni1E15
+ENCODING 7701
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+1FC0
+1FC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1E16
+ENCODING 7702
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 27 2 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+3F80
+3F80
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni1E17
+ENCODING 7703
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+1FC0
+1FC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1E18
+ENCODING 7704
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 24 2 -5
+BITMAP
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+0000
+0E00
+1F00
+3B80
+71C0
+ENDCHAR
+STARTCHAR uni1E19
+ENCODING 7705
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 19 1 -5
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+0000
+0700
+0F80
+1DC0
+38E0
+ENDCHAR
+STARTCHAR uni1E1A
+ENCODING 7706
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 23 2 -4
+BITMAP
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+0000
+3CC0
+7FC0
+6780
+ENDCHAR
+STARTCHAR uni1E1B
+ENCODING 7707
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 -4
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+0000
+1E60
+3FE0
+33C0
+ENDCHAR
+STARTCHAR uni1E1C
+ENCODING 7708
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 29 2 -5
+BITMAP
+60C0
+71C0
+3F80
+1F00
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+0F00
+0380
+0380
+1F80
+0F00
+ENDCHAR
+STARTCHAR uni1E1D
+ENCODING 7709
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 -5
+BITMAP
+3060
+38E0
+1FC0
+0F80
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+0F00
+0380
+0380
+1F80
+0F00
+ENDCHAR
+STARTCHAR uni1E1E
+ENCODING 7710
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 2 0
+BITMAP
+0E00
+0E00
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E1F
+ENCODING 7711
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 22 1 0
+BITMAP
+38
+38
+00
+1E
+3E
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni1E20
+ENCODING 7712
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 22 1 0
+BITMAP
+07F000
+07F000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00000
+E00000
+E00000
+E00000
+E07F80
+E07F80
+E00380
+E00380
+F00380
+700780
+780F80
+3E3F80
+1FFB80
+07F380
+ENDCHAR
+STARTCHAR uni1E21
+ENCODING 7713
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 1 -5
+BITMAP
+1FC0
+1FC0
+0000
+1F70
+3FF0
+79F0
+70F0
+E070
+E070
+E070
+E070
+E070
+E070
+70F0
+79F0
+3FF0
+1F70
+0070
+E070
+F0E0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR uni1E22
+ENCODING 7714
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 0
+BITMAP
+0380
+0380
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+ENDCHAR
+STARTCHAR uni1E23
+ENCODING 7715
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 22 2 0
+BITMAP
+7000
+7000
+0000
+E000
+E000
+E000
+E000
+E000
+EF00
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR uni1E24
+ENCODING 7716
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 -3
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E25
+ENCODING 7717
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF00
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E26
+ENCODING 7718
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 0
+BITMAP
+0EE0
+0EE0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+ENDCHAR
+STARTCHAR uni1E27
+ENCODING 7719
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 1 0
+BITMAP
+EE00
+EE00
+0000
+7000
+7000
+7000
+7000
+7000
+7780
+7FE0
+78E0
+7070
+7070
+7070
+7070
+7070
+7070
+7070
+7070
+7070
+7070
+7070
+ENDCHAR
+STARTCHAR uni1E28
+ENCODING 7720
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 -5
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E38E
+03C0
+00E0
+00E0
+07E0
+03C0
+ENDCHAR
+STARTCHAR uni1E29
+ENCODING 7721
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 24 2 -5
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF00
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+EEE0
+0F00
+0380
+0380
+1F80
+0F00
+ENDCHAR
+STARTCHAR uni1E2A
+ENCODING 7722
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 -5
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+FFFE
+FFFE
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+0000
+1830
+1C70
+0FE0
+07C0
+ENDCHAR
+STARTCHAR uni1E2B
+ENCODING 7723
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 24 2 -5
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF00
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+0000
+60C0
+71C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR uni1E2C
+ENCODING 7724
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 23 -1 -4
+BITMAP
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+0000
+7980
+FF80
+CF00
+ENDCHAR
+STARTCHAR uni1E2D
+ENCODING 7725
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 23 -1 -4
+BITMAP
+1C00
+1C00
+1C00
+0000
+0000
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+0000
+7980
+FF80
+CF00
+ENDCHAR
+STARTCHAR uni1E2E
+ENCODING 7726
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 28 0 0
+BITMAP
+0E
+1C
+38
+70
+00
+EE
+EE
+00
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni1E2F
+ENCODING 7727
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 23 0 0
+BITMAP
+0E
+1C
+38
+70
+00
+EE
+EE
+00
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+ENDCHAR
+STARTCHAR uni1E30
+ENCODING 7728
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 24 2 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FE00
+FF00
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+ENDCHAR
+STARTCHAR uni1E31
+ENCODING 7729
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 24 2 0
+BITMAP
+0E00
+1C00
+3800
+7000
+0000
+E000
+E000
+E000
+E000
+E000
+E1C0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E700
+E780
+E3C0
+E1C0
+E1E0
+E0E0
+ENDCHAR
+STARTCHAR uni1E32
+ENCODING 7730
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 22 2 -3
+BITMAP
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FE00
+FF00
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1E33
+ENCODING 7731
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E1C0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E700
+E780
+E3C0
+E1C0
+E1E0
+E0E0
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E34
+ENCODING 7732
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 22 2 -3
+BITMAP
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FE00
+FF00
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+0000
+1FC0
+1FC0
+ENDCHAR
+STARTCHAR uni1E35
+ENCODING 7733
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 11 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E1C0
+E3C0
+E780
+EF00
+FE00
+FC00
+FE00
+EF00
+E700
+E780
+E3C0
+E1C0
+E1E0
+E0E0
+0000
+3F80
+3F80
+ENDCHAR
+STARTCHAR uni1E36
+ENCODING 7734
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF0
+FFF0
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E37
+ENCODING 7735
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 22 2 -3
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+E0
+E0
+ENDCHAR
+STARTCHAR uni1E38
+ENCODING 7736
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 25 2 -3
+BITMAP
+FE00
+FE00
+0000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF0
+FFF0
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E39
+ENCODING 7737
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 25 0 -3
+BITMAP
+FE
+FE
+00
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+00
+38
+38
+ENDCHAR
+STARTCHAR uni1E3A
+ENCODING 7738
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF0
+FFF0
+0000
+3F80
+3F80
+ENDCHAR
+STARTCHAR uni1E3B
+ENCODING 7739
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 7 22 0 -3
+BITMAP
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+00
+FE
+FE
+ENDCHAR
+STARTCHAR uni1E3C
+ENCODING 7740
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 2 -5
+BITMAP
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF0
+FFF0
+0000
+0E00
+1F00
+3B80
+71C0
+ENDCHAR
+STARTCHAR uni1E3D
+ENCODING 7741
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 9 24 -1 -5
+BITMAP
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+0000
+1C00
+3E00
+7700
+E380
+ENDCHAR
+STARTCHAR uni1E3E
+ENCODING 7742
+SWIDTH 833 0
+DWIDTH 23 0
+BBX 19 24 2 0
+BITMAP
+003800
+007000
+00E000
+01C000
+000000
+E000E0
+F001E0
+F001E0
+F803E0
+F803E0
+FC07E0
+EC06E0
+EE0EE0
+E60CE0
+E71CE0
+E71CE0
+E318E0
+E3B8E0
+E3B8E0
+E1F0E0
+E1F0E0
+E0E0E0
+E0E0E0
+E0E0E0
+ENDCHAR
+STARTCHAR uni1E3F
+ENCODING 7743
+SWIDTH 889 0
+DWIDTH 21 0
+BBX 17 19 2 0
+BITMAP
+007000
+00E000
+01C000
+038000
+000000
+EF3E00
+FFFF00
+F3E780
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+ENDCHAR
+STARTCHAR uni1E40
+ENCODING 7744
+SWIDTH 833 0
+DWIDTH 23 0
+BBX 19 22 2 0
+BITMAP
+00E000
+00E000
+000000
+E000E0
+F001E0
+F001E0
+F803E0
+F803E0
+FC07E0
+EC06E0
+EE0EE0
+E60CE0
+E71CE0
+E71CE0
+E318E0
+E3B8E0
+E3B8E0
+E1F0E0
+E1F0E0
+E0E0E0
+E0E0E0
+E0E0E0
+ENDCHAR
+STARTCHAR uni1E41
+ENCODING 7745
+SWIDTH 889 0
+DWIDTH 21 0
+BBX 17 17 2 0
+BITMAP
+01C000
+01C000
+000000
+EF3E00
+FFFF00
+F3E780
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+ENDCHAR
+STARTCHAR uni1E42
+ENCODING 7746
+SWIDTH 833 0
+DWIDTH 23 0
+BBX 19 22 2 -3
+BITMAP
+E000E0
+F001E0
+F001E0
+F803E0
+F803E0
+FC07E0
+EC06E0
+EE0EE0
+E60CE0
+E71CE0
+E71CE0
+E318E0
+E3B8E0
+E3B8E0
+E1F0E0
+E1F0E0
+E0E0E0
+E0E0E0
+E0E0E0
+000000
+00E000
+00E000
+ENDCHAR
+STARTCHAR uni1E43
+ENCODING 7747
+SWIDTH 889 0
+DWIDTH 21 0
+BBX 17 17 2 -3
+BITMAP
+EF3E00
+FFFF00
+F3E780
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+000000
+01C000
+01C000
+ENDCHAR
+STARTCHAR uni1E44
+ENCODING 7748
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 0
+BITMAP
+0380
+0380
+0000
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+ENDCHAR
+STARTCHAR uni1E45
+ENCODING 7749
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 17 2 0
+BITMAP
+0E00
+0E00
+0000
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+ENDCHAR
+STARTCHAR uni1E46
+ENCODING 7750
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 -3
+BITMAP
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E47
+ENCODING 7751
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 17 2 -3
+BITMAP
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E48
+ENCODING 7752
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 -3
+BITMAP
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+0000
+0FE0
+0FE0
+ENDCHAR
+STARTCHAR uni1E49
+ENCODING 7753
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 17 2 -3
+BITMAP
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+0000
+3F80
+3F80
+ENDCHAR
+STARTCHAR uni1E4A
+ENCODING 7754
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 -5
+BITMAP
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+EE0E
+E70E
+E38E
+E38E
+E1CE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+0000
+0380
+07C0
+0EE0
+1C70
+ENDCHAR
+STARTCHAR uni1E4B
+ENCODING 7755
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+EF80
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+0000
+0E00
+1F00
+3B80
+71C0
+ENDCHAR
+STARTCHAR uni1E4C
+ENCODING 7756
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 28 1 0
+BITMAP
+007000
+00E000
+01C000
+038000
+000000
+079800
+0FF800
+0CF000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E4D
+ENCODING 7757
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+3CC0
+7FC0
+6780
+0000
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1E4E
+ENCODING 7758
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 26 1 0
+BITMAP
+077000
+077000
+000000
+079800
+0FF800
+0CF000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E4F
+ENCODING 7759
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+3B80
+3B80
+0000
+3CC0
+7FC0
+6780
+0000
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1E50
+ENCODING 7760
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 27 1 0
+BITMAP
+070000
+038000
+01C000
+00E000
+000000
+07F000
+07F000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E51
+ENCODING 7761
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+1FC0
+1FC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1E52
+ENCODING 7762
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 27 1 0
+BITMAP
+007000
+00E000
+01C000
+038000
+000000
+07F000
+07F000
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E53
+ENCODING 7763
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 22 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+1FC0
+1FC0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1E54
+ENCODING 7764
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 24 2 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E55
+ENCODING 7765
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 24 2 -5
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E56
+ENCODING 7766
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 22 2 0
+BITMAP
+0700
+0700
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E57
+ENCODING 7767
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 22 2 -5
+BITMAP
+0E00
+0E00
+0000
+EF80
+FFC0
+F9E0
+F0E0
+E070
+E070
+E070
+E070
+E070
+E070
+F0E0
+F9E0
+FFC0
+EF80
+E000
+E000
+E000
+E000
+E000
+ENDCHAR
+STARTCHAR uni1E58
+ENCODING 7768
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 22 2 0
+BITMAP
+0700
+0700
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+ENDCHAR
+STARTCHAR uni1E59
+ENCODING 7769
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 17 2 0
+BITMAP
+38
+38
+00
+EE
+FE
+FE
+F0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni1E5A
+ENCODING 7770
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 22 2 -3
+BITMAP
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E5B
+ENCODING 7771
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 17 2 -3
+BITMAP
+EE
+FE
+FE
+F0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+70
+70
+ENDCHAR
+STARTCHAR uni1E5C
+ENCODING 7772
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 25 2 -3
+BITMAP
+1FC0
+1FC0
+0000
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E5D
+ENCODING 7773
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 7 20 2 -3
+BITMAP
+FE
+FE
+00
+EE
+FE
+FE
+F0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+70
+70
+ENDCHAR
+STARTCHAR uni1E5E
+ENCODING 7774
+SWIDTH 722 0
+DWIDTH 17 0
+BBX 14 22 2 -3
+BITMAP
+FFE0
+FFF8
+E038
+E01C
+E01C
+E01C
+E01C
+E038
+FFF8
+FFF0
+E078
+E038
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+E01C
+0000
+0FE0
+0FE0
+ENDCHAR
+STARTCHAR uni1E5F
+ENCODING 7775
+SWIDTH 389 0
+DWIDTH 10 0
+BBX 8 17 1 -3
+BITMAP
+77
+7F
+7F
+78
+70
+70
+70
+70
+70
+70
+70
+70
+70
+70
+00
+FE
+FE
+ENDCHAR
+STARTCHAR uni1E60
+ENCODING 7776
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 22 2 0
+BITMAP
+0700
+0700
+0000
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+ENDCHAR
+STARTCHAR uni1E61
+ENCODING 7777
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 17 1 0
+BITMAP
+0E00
+0E00
+0000
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR uni1E62
+ENCODING 7778
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 22 2 -3
+BITMAP
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1E63
+ENCODING 7779
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 17 1 -3
+BITMAP
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E64
+ENCODING 7780
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 27 2 0
+BITMAP
+0380
+0380
+0000
+00E0
+01C0
+0380
+0700
+0000
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+ENDCHAR
+STARTCHAR uni1E65
+ENCODING 7781
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 22 1 0
+BITMAP
+0E00
+0E00
+0000
+0380
+0700
+0E00
+1C00
+0000
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR uni1E66
+ENCODING 7782
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 22 1 0
+BITMAP
+0380
+0380
+0000
+1C70
+0EE0
+07C0
+0380
+0000
+0FC0
+3FF0
+7878
+7038
+7800
+7FC0
+3FF0
+0FFC
+003C
+E01C
+E01C
+787C
+3FF8
+1FE0
+ENDCHAR
+STARTCHAR uni1E67
+ENCODING 7783
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 22 1 0
+BITMAP
+0E00
+0E00
+0000
+71C0
+3B80
+1F00
+0E00
+0000
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+ENDCHAR
+STARTCHAR uni1E68
+ENCODING 7784
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 14 25 2 -3
+BITMAP
+0700
+0700
+0000
+0FC0
+3FF0
+78F8
+F038
+E038
+E000
+F000
+7C00
+3FC0
+07F0
+00F8
+003C
+001C
+E01C
+E01C
+E03C
+F8F8
+7FF0
+1FC0
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1E69
+ENCODING 7785
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 20 1 -3
+BITMAP
+1C00
+1C00
+0000
+3F00
+7F80
+F3C0
+E1C0
+E000
+FC00
+7F80
+0FC0
+01E0
+E0E0
+E0E0
+F1E0
+7FC0
+3F80
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1E6A
+ENCODING 7786
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 22 0 0
+BITMAP
+0380
+0380
+0000
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E6B
+ENCODING 7787
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 21 1 0
+BITMAP
+38
+38
+00
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+ENDCHAR
+STARTCHAR uni1E6C
+ENCODING 7788
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 22 0 -3
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E6D
+ENCODING 7789
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 21 1 -3
+BITMAP
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+00
+38
+38
+ENDCHAR
+STARTCHAR uni1E6E
+ENCODING 7790
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 22 0 -3
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0000
+0FE0
+0FE0
+ENDCHAR
+STARTCHAR uni1E6F
+ENCODING 7791
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 21 1 -3
+BITMAP
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+00
+FE
+FE
+ENDCHAR
+STARTCHAR uni1E70
+ENCODING 7792
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 15 24 0 -5
+BITMAP
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0000
+0380
+07C0
+0EE0
+1C70
+ENDCHAR
+STARTCHAR uni1E71
+ENCODING 7793
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 9 23 0 -5
+BITMAP
+1C00
+1C00
+1C00
+1C00
+7F00
+7F00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1C00
+1F00
+0F00
+0000
+1C00
+3E00
+7700
+E380
+ENDCHAR
+STARTCHAR uni1E72
+ENCODING 7794
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 -3
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+0000
+0EE0
+0EE0
+ENDCHAR
+STARTCHAR uni1E73
+ENCODING 7795
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 17 2 -3
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+0000
+3B80
+3B80
+ENDCHAR
+STARTCHAR uni1E74
+ENCODING 7796
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 23 2 -4
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+0000
+0F30
+1FF0
+19E0
+ENDCHAR
+STARTCHAR uni1E75
+ENCODING 7797
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 18 2 -4
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+0000
+3CC0
+7FC0
+6780
+ENDCHAR
+STARTCHAR uni1E76
+ENCODING 7798
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 24 2 -5
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+0000
+0380
+07C0
+0EE0
+1C70
+ENDCHAR
+STARTCHAR uni1E77
+ENCODING 7799
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 19 2 -5
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+0000
+0E00
+1F00
+3B80
+71C0
+ENDCHAR
+STARTCHAR uni1E78
+ENCODING 7800
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 28 2 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+0F30
+1FF0
+19E0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni1E79
+ENCODING 7801
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 23 2 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+3CC0
+7FC0
+6780
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni1E7A
+ENCODING 7802
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 25 2 0
+BITMAP
+0EE0
+0EE0
+0000
+0FE0
+0FE0
+0000
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR uni1E7B
+ENCODING 7803
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 20 2 0
+BITMAP
+3B80
+3B80
+0000
+3F80
+3F80
+0000
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni1E7C
+ENCODING 7804
+SWIDTH 667 0
+DWIDTH 18 0
+BBX 16 23 1 0
+BITMAP
+0798
+0FF8
+0CF0
+0000
+E007
+E007
+F00F
+700E
+781E
+381C
+381C
+3C3C
+1C38
+1C38
+1E78
+0E70
+0E70
+0E70
+07E0
+07E0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1E7D
+ENCODING 7805
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1E60
+3FE0
+33C0
+0000
+E070
+E070
+E070
+70E0
+70E0
+70E0
+39C0
+39C0
+39C0
+1F80
+1F80
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR uni1E7E
+ENCODING 7806
+SWIDTH 667 0
+DWIDTH 18 0
+BBX 16 22 1 -3
+BITMAP
+E007
+E007
+F00F
+700E
+781E
+381C
+381C
+3C3C
+1C38
+1C38
+1E78
+0E70
+0E70
+0E70
+07E0
+07E0
+03C0
+03C0
+03C0
+0000
+01C0
+01C0
+ENDCHAR
+STARTCHAR uni1E7F
+ENCODING 7807
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+E070
+E070
+E070
+70E0
+70E0
+70E0
+39C0
+39C0
+39C0
+1F80
+1F80
+0F00
+0F00
+0F00
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR Wgrave
+ENCODING 7808
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 24 1 0
+BITMAP
+01C000
+00E000
+007000
+003800
+000000
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+71DC70
+31DC60
+39DCE0
+398CE0
+3B8EE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR wgrave
+ENCODING 7809
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+038000
+01C000
+00E000
+007000
+000000
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+ENDCHAR
+STARTCHAR Wacute
+ENCODING 7810
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 24 1 0
+BITMAP
+001C00
+003800
+007000
+00E000
+000000
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+71DC70
+31DC60
+39DCE0
+398CE0
+3B8EE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR wacute
+ENCODING 7811
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+003800
+007000
+00E000
+01C000
+000000
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+ENDCHAR
+STARTCHAR Wdieresis
+ENCODING 7812
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 22 1 0
+BITMAP
+01DC00
+01DC00
+000000
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+71DC70
+31DC60
+39DCE0
+398CE0
+3B8EE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR wdieresis
+ENCODING 7813
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 17 0 0
+BITMAP
+03B800
+03B800
+000000
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+ENDCHAR
+STARTCHAR uni1E86
+ENCODING 7814
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 22 1 0
+BITMAP
+007000
+007000
+000000
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+71DC70
+31DC60
+39DCE0
+398CE0
+3B8EE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR uni1E87
+ENCODING 7815
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 17 0 0
+BITMAP
+00E000
+00E000
+000000
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+ENDCHAR
+STARTCHAR uni1E88
+ENCODING 7816
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 22 1 -3
+BITMAP
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+71DC70
+31DC60
+39DCE0
+398CE0
+3B8EE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+000000
+007000
+007000
+ENDCHAR
+STARTCHAR uni1E89
+ENCODING 7817
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 17 0 -3
+BITMAP
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+000000
+00E000
+00E000
+ENDCHAR
+STARTCHAR uni1E8A
+ENCODING 7818
+SWIDTH 667 0
+DWIDTH 18 0
+BBX 16 22 1 0
+BITMAP
+01C0
+01C0
+0000
+E007
+F00F
+781E
+381C
+1C38
+0E70
+0FF0
+07E0
+03C0
+03C0
+07E0
+0FF0
+0E70
+1C38
+3C3C
+381C
+700E
+F00F
+E007
+ENDCHAR
+STARTCHAR uni1E8B
+ENCODING 7819
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 17 1 0
+BITMAP
+0E00
+0E00
+0000
+E0E0
+F1E0
+71C0
+3B80
+3F80
+1F00
+0E00
+1F00
+1F00
+3B80
+7BC0
+71C0
+F1E0
+E0E0
+ENDCHAR
+STARTCHAR uni1E8C
+ENCODING 7820
+SWIDTH 667 0
+DWIDTH 18 0
+BBX 16 22 1 0
+BITMAP
+0770
+0770
+0000
+E007
+F00F
+781E
+381C
+1C38
+0E70
+0FF0
+07E0
+03C0
+03C0
+07E0
+0FF0
+0E70
+1C38
+3C3C
+381C
+700E
+F00F
+E007
+ENDCHAR
+STARTCHAR uni1E8D
+ENCODING 7821
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 11 17 1 0
+BITMAP
+3B80
+3B80
+0000
+E0E0
+F1E0
+71C0
+3B80
+3F80
+1F00
+0E00
+1F00
+1F00
+3B80
+7BC0
+71C0
+F1E0
+E0E0
+ENDCHAR
+STARTCHAR uni1E8E
+ENCODING 7822
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 22 1 0
+BITMAP
+0380
+0380
+0000
+E00E
+F00E
+701C
+781C
+3838
+3C38
+1C70
+1C70
+0EE0
+0EE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR uni1E8F
+ENCODING 7823
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 22 1 -5
+BITMAP
+0700
+0700
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni1E90
+ENCODING 7824
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 24 1 0
+BITMAP
+0380
+07C0
+0EE0
+1C70
+0000
+FFFC
+FFFC
+003C
+0078
+00F0
+01E0
+01E0
+03C0
+0780
+0780
+0F00
+1E00
+1E00
+3C00
+3800
+7800
+F000
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR uni1E91
+ENCODING 7825
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 19 1 0
+BITMAP
+0E00
+1F00
+3B80
+71C0
+0000
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR uni1E92
+ENCODING 7826
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 22 1 -3
+BITMAP
+FFFC
+FFFC
+003C
+0078
+00F0
+01E0
+01E0
+03C0
+0780
+0780
+0F00
+1E00
+1E00
+3C00
+3800
+7800
+F000
+FFFC
+FFFC
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1E93
+ENCODING 7827
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 17 1 -3
+BITMAP
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+0000
+1C00
+1C00
+ENDCHAR
+STARTCHAR uni1E94
+ENCODING 7828
+SWIDTH 611 0
+DWIDTH 16 0
+BBX 14 22 1 -3
+BITMAP
+FFFC
+FFFC
+003C
+0078
+00F0
+01E0
+01E0
+03C0
+0780
+0780
+0F00
+1E00
+1E00
+3C00
+3800
+7800
+F000
+FFFC
+FFFC
+0000
+1FC0
+1FC0
+ENDCHAR
+STARTCHAR uni1E95
+ENCODING 7829
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 11 17 1 -3
+BITMAP
+FFE0
+FFE0
+01C0
+0380
+0780
+0F00
+0E00
+1E00
+3C00
+3800
+7000
+F000
+FFE0
+FFE0
+0000
+7F00
+7F00
+ENDCHAR
+STARTCHAR uni1E96
+ENCODING 7830
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 22 2 -3
+BITMAP
+E000
+E000
+E000
+E000
+E000
+EF00
+FFC0
+F1C0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+0000
+3F80
+3F80
+ENDCHAR
+STARTCHAR uni1E97
+ENCODING 7831
+SWIDTH 333 0
+DWIDTH 9 0
+BBX 7 21 1 0
+BITMAP
+EE
+EE
+00
+38
+38
+38
+38
+FE
+FE
+38
+38
+38
+38
+38
+38
+38
+38
+38
+38
+3E
+1E
+ENDCHAR
+STARTCHAR uni1E98
+ENCODING 7832
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 19 20 0 0
+BITMAP
+00E000
+01F000
+01B000
+01F000
+00E000
+000000
+E0E0E0
+E0E0E0
+60E0C0
+71F1C0
+71F1C0
+31B180
+33B980
+3BBB80
+1B1B00
+1F1F00
+1F1F00
+0E0E00
+0E0E00
+0E0E00
+ENDCHAR
+STARTCHAR uni1E99
+ENCODING 7833
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 25 1 -5
+BITMAP
+0700
+0F80
+0D80
+0F80
+0700
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni1EA0
+ENCODING 7840
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 22 1 -3
+BITMAP
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+0000
+01C0
+01C0
+ENDCHAR
+STARTCHAR uni1EA1
+ENCODING 7841
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1EA4
+ENCODING 7844
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 29 1 0
+BITMAP
+0070
+00E0
+01C0
+0380
+0000
+01C0
+03E0
+0770
+0E38
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni1EA5
+ENCODING 7845
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni1EA6
+ENCODING 7846
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 29 1 0
+BITMAP
+0700
+0380
+01C0
+00E0
+0000
+01C0
+03E0
+0770
+0E38
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni1EA7
+ENCODING 7847
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni1EAA
+ENCODING 7850
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 28 1 0
+BITMAP
+0798
+0FF8
+0CF0
+0000
+01C0
+03E0
+0770
+0E38
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni1EAB
+ENCODING 7851
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 23 1 0
+BITMAP
+1E60
+3FE0
+33C0
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni1EAC
+ENCODING 7852
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 27 1 -3
+BITMAP
+0380
+07C0
+0EE0
+1C70
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+0000
+01C0
+01C0
+ENDCHAR
+STARTCHAR uni1EAD
+ENCODING 7853
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 22 1 -3
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1EAE
+ENCODING 7854
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 29 1 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+1830
+1C70
+0FE0
+07C0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni1EAF
+ENCODING 7855
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+3060
+38E0
+1FC0
+0F80
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni1EB0
+ENCODING 7856
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 29 1 0
+BITMAP
+0E00
+0700
+0380
+01C0
+0000
+1830
+1C70
+0FE0
+07C0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni1EB1
+ENCODING 7857
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+3060
+38E0
+1FC0
+0F80
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni1EB4
+ENCODING 7860
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 28 1 0
+BITMAP
+0F30
+1FF0
+19E0
+0000
+1830
+1C70
+0FE0
+07C0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni1EB5
+ENCODING 7861
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 23 1 0
+BITMAP
+1E60
+3FE0
+33C0
+0000
+3060
+38E0
+1FC0
+0F80
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+ENDCHAR
+STARTCHAR uni1EB6
+ENCODING 7862
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 27 1 -3
+BITMAP
+1830
+1C70
+0FE0
+07C0
+0000
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+0000
+01C0
+01C0
+ENDCHAR
+STARTCHAR uni1EB7
+ENCODING 7863
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 22 1 -3
+BITMAP
+3060
+38E0
+1FC0
+0F80
+0000
+1F80
+3FC0
+71E0
+70E0
+00E0
+07E0
+3FE0
+7CE0
+F0E0
+E0E0
+E1E0
+F3E0
+7FF0
+3E70
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1EB8
+ENCODING 7864
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 22 2 -3
+BITMAP
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1EB9
+ENCODING 7865
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1EBC
+ENCODING 7868
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 23 2 0
+BITMAP
+3CC0
+7FC0
+6780
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni1EBD
+ENCODING 7869
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 18 1 0
+BITMAP
+1E60
+3FE0
+33C0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1EBE
+ENCODING 7870
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 29 2 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni1EBF
+ENCODING 7871
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+01C0
+0380
+0700
+0E00
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1EC0
+ENCODING 7872
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 29 2 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni1EC1
+ENCODING 7873
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1EC4
+ENCODING 7876
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 28 2 0
+BITMAP
+1E60
+3FE0
+33C0
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni1EC5
+ENCODING 7877
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 23 1 0
+BITMAP
+1E60
+3FE0
+33C0
+0000
+0700
+0F80
+1DC0
+38E0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+ENDCHAR
+STARTCHAR uni1EC6
+ENCODING 7878
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 27 2 -3
+BITMAP
+0E00
+1F00
+3B80
+71C0
+0000
+FFF0
+FFF0
+E000
+E000
+E000
+E000
+E000
+E000
+FFE0
+FFE0
+E000
+E000
+E000
+E000
+E000
+E000
+E000
+FFF8
+FFF8
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1EC7
+ENCODING 7879
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 12 22 1 -3
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+FFF0
+FFF0
+E000
+E000
+7070
+78F0
+3FE0
+0F80
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1ECA
+ENCODING 7882
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 22 2 -3
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+E0
+E0
+ENDCHAR
+STARTCHAR uni1ECB
+ENCODING 7883
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 22 2 -3
+BITMAP
+E0
+E0
+E0
+00
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+E0
+E0
+ENDCHAR
+STARTCHAR uni1ECC
+ENCODING 7884
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 22 1 -3
+BITMAP
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+000000
+01C000
+01C000
+ENDCHAR
+STARTCHAR uni1ECD
+ENCODING 7885
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 17 1 -3
+BITMAP
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1ED0
+ENCODING 7888
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 29 1 0
+BITMAP
+007000
+00E000
+01C000
+038000
+000000
+01C000
+03E000
+077000
+0E3800
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1ED1
+ENCODING 7889
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+0380
+0700
+0E00
+1C00
+0000
+0E00
+1F00
+3B80
+71C0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1ED2
+ENCODING 7890
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 29 1 0
+BITMAP
+070000
+038000
+01C000
+00E000
+000000
+01C000
+03E000
+077000
+0E3800
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1ED3
+ENCODING 7891
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 24 1 0
+BITMAP
+3800
+1C00
+0E00
+0700
+0000
+0E00
+1F00
+3B80
+71C0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1ED6
+ENCODING 7894
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 28 1 0
+BITMAP
+079800
+0FF800
+0CF000
+000000
+01C000
+03E000
+077000
+0E3800
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1ED7
+ENCODING 7895
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 23 1 0
+BITMAP
+3CC0
+7FC0
+6780
+0000
+0E00
+1F00
+3B80
+71C0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1ED8
+ENCODING 7896
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 17 27 1 -3
+BITMAP
+01C000
+03E000
+077000
+0E3800
+000000
+07F000
+1FFC00
+3E3E00
+780F00
+700700
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+000000
+01C000
+01C000
+ENDCHAR
+STARTCHAR uni1ED9
+ENCODING 7897
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 12 22 1 -3
+BITMAP
+0700
+0F80
+1DC0
+38E0
+0000
+0F00
+3FC0
+79E0
+70E0
+E070
+E070
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1EDA
+ENCODING 7898
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 18 24 1 0
+BITMAP
+001C00
+003800
+007000
+00E000
+000000
+07F1C0
+1FFDC0
+3E3FC0
+780FC0
+7007C0
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1EDB
+ENCODING 7899
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 14 19 1 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+0F1C
+3FDC
+79FC
+70EC
+E07C
+E078
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1EDC
+ENCODING 7900
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 18 24 1 0
+BITMAP
+038000
+01C000
+00E000
+007000
+000000
+07F1C0
+1FFDC0
+3E3FC0
+780FC0
+7007C0
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1EDD
+ENCODING 7901
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 14 19 1 0
+BITMAP
+0E00
+0700
+0380
+01C0
+0000
+0F1C
+3FDC
+79FC
+70EC
+E07C
+E078
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1EE0
+ENCODING 7904
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 18 23 1 0
+BITMAP
+01E600
+03FE00
+033C00
+000000
+07F1C0
+1FFDC0
+3E3FC0
+780FC0
+7007C0
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1EE1
+ENCODING 7905
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 14 18 1 0
+BITMAP
+0F30
+1FF0
+19E0
+0000
+0F1C
+3FDC
+79FC
+70EC
+E07C
+E078
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+ENDCHAR
+STARTCHAR uni1EE2
+ENCODING 7906
+SWIDTH 778 0
+DWIDTH 19 0
+BBX 18 22 1 -3
+BITMAP
+07F1C0
+1FFDC0
+3E3FC0
+780FC0
+7007C0
+F00780
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+E00380
+F00780
+700700
+780F00
+3E3E00
+1FFC00
+07F000
+000000
+01C000
+01C000
+ENDCHAR
+STARTCHAR uni1EE3
+ENCODING 7907
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 14 17 1 -3
+BITMAP
+0F1C
+3FDC
+79FC
+70EC
+E07C
+E078
+E070
+E070
+E070
+E070
+70E0
+79E0
+3FC0
+0F00
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR uni1EE4
+ENCODING 7908
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 22 2 -3
+BITMAP
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+E00E
+F01E
+701C
+7C7C
+3FF8
+0FE0
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1EE5
+ENCODING 7909
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 11 17 2 -3
+BITMAP
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1EE8
+ENCODING 7912
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 17 24 2 0
+BITMAP
+003800
+007000
+00E000
+01C000
+000000
+E00F80
+E00F80
+E00F80
+E00F80
+E00F80
+E00F00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+F01E00
+701C00
+7C7C00
+3FF800
+0FE000
+ENDCHAR
+STARTCHAR uni1EE9
+ENCODING 7913
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 13 19 2 0
+BITMAP
+00E0
+01C0
+0380
+0700
+0000
+E0F8
+E0F8
+E0F8
+E0F8
+E0F8
+E0F0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni1EEA
+ENCODING 7914
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 17 24 2 0
+BITMAP
+038000
+01C000
+00E000
+007000
+000000
+E00F80
+E00F80
+E00F80
+E00F80
+E00F80
+E00F00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+F01E00
+701C00
+7C7C00
+3FF800
+0FE000
+ENDCHAR
+STARTCHAR uni1EEB
+ENCODING 7915
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 13 19 2 0
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+E0F8
+E0F8
+E0F8
+E0F8
+E0F8
+E0F0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni1EEE
+ENCODING 7918
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 17 23 2 0
+BITMAP
+03CC00
+07FC00
+067800
+000000
+E00F80
+E00F80
+E00F80
+E00F80
+E00F80
+E00F00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+F01E00
+701C00
+7C7C00
+3FF800
+0FE000
+ENDCHAR
+STARTCHAR uni1EEF
+ENCODING 7919
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 13 18 2 0
+BITMAP
+0F30
+1FF0
+19E0
+0000
+E0F8
+E0F8
+E0F8
+E0F8
+E0F8
+E0F0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+ENDCHAR
+STARTCHAR uni1EF0
+ENCODING 7920
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 17 22 2 -3
+BITMAP
+E00F80
+E00F80
+E00F80
+E00F80
+E00F80
+E00F00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+E00E00
+F01E00
+701C00
+7C7C00
+3FF800
+0FE000
+000000
+038000
+038000
+ENDCHAR
+STARTCHAR uni1EF1
+ENCODING 7921
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 13 17 2 -3
+BITMAP
+E0F8
+E0F8
+E0F8
+E0F8
+E0F8
+E0F0
+E0E0
+E0E0
+E0E0
+E0E0
+E1E0
+73E0
+7EE0
+1CE0
+0000
+0700
+0700
+ENDCHAR
+STARTCHAR Ygrave
+ENCODING 7922
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 24 1 0
+BITMAP
+0E00
+0700
+0380
+01C0
+0000
+E00E
+F00E
+701C
+781C
+3838
+3C38
+1C70
+1C70
+0EE0
+0EE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR ygrave
+ENCODING 7923
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 24 1 -5
+BITMAP
+1C00
+0E00
+0700
+0380
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni1EF4
+ENCODING 7924
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 22 1 -3
+BITMAP
+E00E
+F00E
+701C
+781C
+3838
+3C38
+1C70
+1C70
+0EE0
+0EE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0000
+0380
+0380
+ENDCHAR
+STARTCHAR uni1EF5
+ENCODING 7925
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 22 1 -8
+BITMAP
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+0000
+0E00
+0E00
+ENDCHAR
+STARTCHAR uni1EF8
+ENCODING 7928
+SWIDTH 667 0
+DWIDTH 17 0
+BBX 15 23 1 0
+BITMAP
+0F30
+1FF0
+19E0
+0000
+E00E
+F00E
+701C
+781C
+3838
+3C38
+1C70
+1C70
+0EE0
+0EE0
+07C0
+07C0
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR uni1EF9
+ENCODING 7929
+SWIDTH 556 0
+DWIDTH 15 0
+BBX 13 23 1 -5
+BITMAP
+1E60
+3FE0
+33C0
+0000
+E038
+E038
+7038
+7870
+3870
+3CF0
+1CE0
+1CE0
+0FC0
+0FC0
+07C0
+0780
+0380
+0380
+0700
+0700
+0E00
+3E00
+3C00
+ENDCHAR
+STARTCHAR uni2000
+ENCODING 8192
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2001
+ENCODING 8193
+SWIDTH 1000 0
+DWIDTH 25 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2002
+ENCODING 8194
+SWIDTH 500 0
+DWIDTH 13 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2003
+ENCODING 8195
+SWIDTH 1000 0
+DWIDTH 25 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2004
+ENCODING 8196
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2005
+ENCODING 8197
+SWIDTH 250 0
+DWIDTH 6 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2006
+ENCODING 8198
+SWIDTH 167 0
+DWIDTH 4 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2007
+ENCODING 8199
+SWIDTH 556 0
+DWIDTH 13 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2008
+ENCODING 8200
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2009
+ENCODING 8201
+SWIDTH 200 0
+DWIDTH 5 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni200A
+ENCODING 8202
+SWIDTH 100 0
+DWIDTH 3 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni200B
+ENCODING 8203
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2010
+ENCODING 8208
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 7 3 0 6
+BITMAP
+FE
+FE
+FE
+ENDCHAR
+STARTCHAR uni2011
+ENCODING 8209
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 7 3 0 6
+BITMAP
+FE
+FE
+FE
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 14 2 0 6
+BITMAP
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 14 2 0 6
+BITMAP
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 1000 0
+DWIDTH 25 0
+BBX 25 2 0 6
+BITMAP
+FFFFFF80
+FFFFFF80
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 1000 0
+DWIDTH 25 0
+BBX 25 2 0 6
+BITMAP
+FFFFFF80
+FFFFFF80
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 6 2 13
+BITMAP
+60
+C0
+C0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 6 2 13
+BITMAP
+E0
+E0
+E0
+60
+60
+C0
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 8218
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 4 6 1 -3
+BITMAP
+70
+70
+70
+30
+30
+E0
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 6 2 13
+BITMAP
+E0
+E0
+E0
+C0
+C0
+60
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 500 0
+DWIDTH 12 0
+BBX 8 6 2 13
+BITMAP
+63
+C6
+C6
+E7
+E7
+E7
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 500 0
+DWIDTH 12 0
+BBX 8 6 2 13
+BITMAP
+E7
+E7
+E7
+63
+63
+C6
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 8222
+SWIDTH 500 0
+DWIDTH 12 0
+BBX 9 6 1 -3
+BITMAP
+7380
+7380
+7380
+3180
+3180
+E300
+ENDCHAR
+STARTCHAR uni201F
+ENCODING 8223
+SWIDTH 500 0
+DWIDTH 12 0
+BBX 8 6 2 13
+BITMAP
+E7
+E7
+E7
+C6
+C6
+63
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 13 24 0 -5
+BITMAP
+0700
+0700
+0700
+0700
+0700
+FFF8
+FFF8
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 556 0
+DWIDTH 14 0
+BBX 13 24 0 -5
+BITMAP
+0700
+0700
+0700
+0700
+0700
+FFF8
+FFF8
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+0700
+FFF8
+FFF8
+0700
+0700
+0700
+0700
+0700
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 350 0
+DWIDTH 9 0
+BBX 5 5 2 5
+BITMAP
+70
+F8
+F8
+F8
+70
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 1000 0
+DWIDTH 25 0
+BBX 19 3 3 0
+BITMAP
+E0E0E0
+E0E0E0
+E0E0E0
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 8240
+SWIDTH 1000 0
+DWIDTH 25 0
+BBX 24 18 0 0
+BITMAP
+001C00
+381C00
+7C3800
+EE3800
+C67000
+C67000
+EEE000
+7CE000
+39C000
+01C000
+039C1C
+03BE3E
+077777
+076363
+0E6363
+0E7777
+1C3E3E
+1C1C1C
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 8 1 3
+BITMAP
+1C
+38
+70
+E0
+E0
+70
+38
+1C
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 333 0
+DWIDTH 8 0
+BBX 6 8 1 3
+BITMAP
+E0
+70
+38
+1C
+1C
+38
+70
+E0
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8260
+SWIDTH 167 0
+DWIDTH 8 0
+BBX 10 18 -1 0
+BITMAP
+00C0
+00C0
+0180
+0180
+0300
+0300
+0600
+0600
+0C00
+0C00
+1800
+1800
+3000
+3000
+6000
+6000
+C000
+C000
+ENDCHAR
+STARTCHAR oneinferior
+ENCODING 8321
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 4 10 1 -5
+BITMAP
+30
+30
+F0
+F0
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR twoinferior
+ENCODING 8322
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 10 0 -5
+BITMAP
+78
+FC
+CC
+0C
+1C
+78
+E0
+C0
+FC
+FC
+ENDCHAR
+STARTCHAR threeinferior
+ENCODING 8323
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 6 10 0 -5
+BITMAP
+78
+FC
+CC
+0C
+38
+38
+0C
+CC
+FC
+78
+ENDCHAR
+STARTCHAR uni20A5
+ENCODING 8357
+SWIDTH 889 0
+DWIDTH 21 0
+BBX 17 19 2 -2
+BITMAP
+003000
+003000
+003000
+EF7E00
+FFFF00
+F3E780
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E1C380
+E3C380
+E3C380
+E3C380
+E7C380
+060000
+060000
+ENDCHAR
+STARTCHAR uni20A6
+ENCODING 8358
+SWIDTH 722 0
+DWIDTH 19 0
+BBX 15 19 2 0
+BITMAP
+E00E
+F00E
+F00E
+F80E
+F80E
+FC0E
+EE0E
+FFFE
+FFFE
+E38E
+FFFE
+FFFE
+E0CE
+E0EE
+E07E
+E03E
+E03E
+E01E
+E00E
+ENDCHAR
+STARTCHAR uni20A9
+ENCODING 8361
+SWIDTH 944 0
+DWIDTH 23 0
+BBX 21 19 1 0
+BITMAP
+E07038
+E07038
+E07038
+E07038
+70F870
+70F870
+70D870
+73FF70
+33FF60
+39DCE0
+3BFFE0
+3BFFE0
+1B8EC0
+1B8EC0
+1F07C0
+1F07C0
+0E0380
+0E0380
+0E0380
+ENDCHAR
+STARTCHAR Euro
+ENCODING 8364
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 18 19 -1 0
+BITMAP
+01FC00
+07FF00
+0F8F80
+1E03C0
+1C01C0
+3C0000
+380000
+FFC000
+FFC000
+380000
+FFC000
+FFC000
+380000
+3C01C0
+1C01C0
+1E03C0
+0F8F80
+07FF00
+01FC00
+ENDCHAR
+STARTCHAR uni20AD
+ENCODING 8365
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 19 2 0
+BITMAP
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FFFC
+FFFC
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+ENDCHAR
+STARTCHAR uni2103
+ENCODING 8451
+SWIDTH 1102 0
+DWIDTH 27 0
+BBX 26 19 0 0
+BITMAP
+0001FC00
+3C07FF00
+660F8F80
+C31E03C0
+C31C01C0
+C33C0000
+66380000
+3C380000
+00380000
+00380000
+00380000
+00380000
+00380000
+003C01C0
+001C01C0
+001E03C0
+000F8F80
+0007FF00
+0001FC00
+ENDCHAR
+STARTCHAR uni2109
+ENCODING 8457
+SWIDTH 991 0
+DWIDTH 24 0
+BBX 23 19 0 0
+BITMAP
+001FFE
+3C1FFE
+661C00
+C31C00
+C31C00
+C31C00
+661C00
+3C1C00
+001FFC
+001FFC
+001C00
+001C00
+001C00
+001C00
+001C00
+001C00
+001C00
+001C00
+001C00
+ENDCHAR
+STARTCHAR trademark
+ENCODING 8482
+SWIDTH 1000 0
+DWIDTH 23 0
+BBX 21 10 1 7
+BITMAP
+FF3838
+FF3838
+183C78
+183458
+1836D8
+1836D8
+1836D8
+183398
+183398
+183398
+ENDCHAR
+STARTCHAR uni212A
+ENCODING 8490
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 14 19 2 0
+BITMAP
+E03C
+E078
+E0F0
+E1E0
+E3C0
+E780
+EF00
+FE00
+FE00
+FF00
+F780
+E380
+E1C0
+E1E0
+E0E0
+E070
+E078
+E038
+E03C
+ENDCHAR
+STARTCHAR uni212B
+ENCODING 8491
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+03C0
+0660
+0420
+0660
+03C0
+03C0
+03C0
+07E0
+07E0
+0E60
+0E70
+0E70
+1C38
+1C38
+1C38
+381C
+381C
+3FFC
+7FFE
+700E
+700E
+E007
+E007
+E007
+ENDCHAR
+STARTCHAR uni2132
+ENCODING 8498
+SWIDTH 611 0
+DWIDTH 15 0
+BBX 12 19 2 0
+BITMAP
+0070
+0070
+0070
+0070
+0070
+0070
+0070
+0070
+0070
+7FF0
+7FF0
+0070
+0070
+0070
+0070
+0070
+0070
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR universal
+ENCODING 8704
+SWIDTH 722 0
+DWIDTH 18 0
+BBX 16 19 1 0
+BITMAP
+E007
+E007
+E007
+700E
+700E
+7FFE
+3FFC
+381C
+381C
+1C38
+1C38
+1C38
+0E70
+0E70
+0E60
+07E0
+07E0
+03C0
+03C0
+ENDCHAR
+STARTCHAR existential
+ENCODING 8707
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 19 2 0
+BITMAP
+7FF8
+7FF8
+0038
+0038
+0038
+0038
+0038
+0038
+3FF8
+3FF8
+0038
+0038
+0038
+0038
+0038
+0038
+0038
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni2204
+ENCODING 8708
+SWIDTH 667 0
+DWIDTH 16 0
+BBX 13 19 2 0
+BITMAP
+7FF8
+7FF8
+00F8
+01B8
+01B8
+01B8
+0338
+0338
+3FF8
+3FF8
+0638
+0638
+0638
+0C38
+0C38
+0C38
+1838
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 12 2 1 6
+BITMAP
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8725
+SWIDTH 167 0
+DWIDTH 8 0
+BBX 10 18 -1 0
+BITMAP
+00C0
+00C0
+0180
+0180
+0300
+0300
+0600
+0600
+0C00
+0C00
+1800
+1800
+3000
+3000
+6000
+6000
+C000
+C000
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 8729
+SWIDTH 278 0
+DWIDTH 7 0
+BBX 3 3 2 6
+BITMAP
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni2236
+ENCODING 8758
+SWIDTH 333 0
+DWIDTH 7 0
+BBX 3 14 2 0
+BITMAP
+E0
+E0
+E0
+00
+00
+00
+00
+00
+00
+00
+00
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni2259
+ENCODING 8793
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 10 10 2 5
+BITMAP
+0E00
+1F00
+3B80
+71C0
+0000
+FFC0
+FFC0
+0000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni225A
+ENCODING 8794
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 10 10 2 5
+BITMAP
+71C0
+3B80
+1F00
+0E00
+0000
+FFC0
+FFC0
+0000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR notequal
+ENCODING 8800
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 10 19 2 -2
+BITMAP
+0180
+0180
+0180
+0300
+0300
+0300
+0600
+FFC0
+FFC0
+0600
+FFC0
+FFC0
+0C00
+1800
+1800
+1800
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR equivalence
+ENCODING 8801
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 10 8 0 3
+BITMAP
+FFC0
+FFC0
+0000
+FFC0
+FFC0
+0000
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni2262
+ENCODING 8802
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 10 19 0 -2
+BITMAP
+0180
+0180
+0180
+0300
+0300
+0300
+FFC0
+FFC0
+0600
+FFC0
+FFC0
+0C00
+FFC0
+FFC0
+1800
+1800
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR lessequal
+ENCODING 8804
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 13 15 0 -2
+BITMAP
+0038
+00F8
+03E0
+0F80
+3E00
+F000
+F000
+3E00
+0F80
+03E0
+00F8
+0038
+0000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR greaterequal
+ENCODING 8805
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 13 15 1 -2
+BITMAP
+E000
+F800
+3E00
+0F80
+03E0
+0078
+0078
+03E0
+0F80
+3E00
+F800
+E000
+0000
+FFF8
+FFF8
+ENDCHAR
+STARTCHAR uni226E
+ENCODING 8814
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 13 19 0 -2
+BITMAP
+00C0
+00C0
+00C0
+0180
+01B8
+01F8
+03E0
+0F80
+3F00
+F300
+F600
+3E00
+0F80
+0FE0
+0CF8
+0C38
+1800
+1800
+1800
+ENDCHAR
+STARTCHAR uni226F
+ENCODING 8815
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 13 19 1 -2
+BITMAP
+00C0
+00C0
+00C0
+0180
+E180
+F980
+3F00
+0F80
+03E0
+0378
+0678
+07E0
+0F80
+3E00
+FC00
+EC00
+1800
+1800
+1800
+ENDCHAR
+STARTCHAR uni2270
+ENCODING 8816
+SWIDTH 584 0
+DWIDTH 15 0
+BBX 13 19 0 -4
+BITMAP
+00C0
+00C0
+00F8
+01F8
+03E0
+0F80
+3F00
+F300
+F300
+3F00
+0F80
+07E0
+06F8
+0C38
+0C00
+FFF8
+FFF8
+1800
+1800
+ENDCHAR
+STARTCHAR uni2271
+ENCODING 8817
+SWIDTH 584 0
+DWIDTH 14 0
+BBX 13 19 1 -4
+BITMAP
+00C0
+00C0
+E0C0
+F980
+3F80
+0F80
+03E0
+0378
+0378
+03E0
+0F80
+3E00
+FE00
+EC00
+0C00
+FFF8
+FFF8
+1800
+1800
+ENDCHAR
+STARTCHAR fi
+ENCODING -1
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 11 19 1 0
+BITMAP
+1EE0
+3EE0
+38E0
+3800
+3800
+FEE0
+FEE0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+ENDCHAR
+STARTCHAR fl
+ENCODING -1
+SWIDTH 611 0
+DWIDTH 14 0
+BBX 11 19 1 0
+BITMAP
+1EE0
+3EE0
+38E0
+38E0
+38E0
+FEE0
+FEE0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+38E0
+ENDCHAR
+ENDFONT
diff --git a/dists/bada/Res/scummmobile/helvB24-ASCII.fcc b/dists/bada/Res/scummmobile/helvB24-ASCII.fcc
new file mode 100644
index 0000000000..48fa5ca92d
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvB24-ASCII.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/helvB24.bdf b/dists/bada/Res/scummmobile/helvB24.bdf
new file mode 100644
index 0000000000..d7f71ae129
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvB24.bdf
@@ -0,0 +1,24371 @@
+STARTFONT 2.1
+FONT -Adobe-Helvetica-Bold-R-Normal--34-240-100-100-P-182-ISO10646-1
+SIZE 24 100 100
+FONTBOUNDINGBOX 40 49 -6 -12
+COMMENT ISO10646-1 extension by Markus Kuhn <mkuhn@acm.org>, 2001-03-20
+COMMENT
+COMMENT +
+COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated.
+COMMENT Copyright 1988, 1994 Digital Equipment Corporation.
+COMMENT
+COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be
+COMMENT registered in certain jurisdictions.
+COMMENT Permission to use these trademarks is hereby granted only in
+COMMENT association with the images described in this file.
+COMMENT
+COMMENT Permission to use, copy, modify, distribute and sell this software
+COMMENT and its documentation for any purpose and without fee is hereby
+COMMENT granted, provided that the above copyright notices appear in all
+COMMENT copies and that both those copyright notices and this permission
+COMMENT notice appear in supporting documentation, and that the names of
+COMMENT Adobe Systems and Digital Equipment Corporation not be used in
+COMMENT advertising or publicity pertaining to distribution of the software
+COMMENT without specific, written prior permission. Adobe Systems and
+COMMENT Digital Equipment Corporation make no representations about the
+COMMENT suitability of this software for any purpose. It is provided "as
+COMMENT is" without express or implied warranty.
+COMMENT -
+STARTPROPERTIES 26
+FOUNDRY "Adobe"
+FAMILY_NAME "Helvetica"
+WEIGHT_NAME "Bold"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 34
+POINT_SIZE 240
+RESOLUTION_X 100
+RESOLUTION_Y 100
+SPACING "P"
+AVERAGE_WIDTH 182
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+CAP_HEIGHT 25
+X_HEIGHT 18
+FONT_ASCENT 28
+FONT_DESCENT 7
+FACE_NAME "Helvetica Bold"
+COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved."
+NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. "
+_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold"
+DEFAULT_CHAR 0
+RELATIVE_SETWIDTH 50
+RELATIVE_WEIGHT 70
+FULL_NAME "Helvetica Bold"
+ENDPROPERTIES
+CHARS 756
+STARTCHAR char0
+ENCODING 0
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 25 2 0
+BITMAP
+AAAAA0
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+800020
+000000
+AAAAA0
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 25 3 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+70
+70
+70
+70
+70
+70
+70
+00
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 474 0
+DWIDTH 16 0
+BBX 11 9 2 16
+BITMAP
+F1E0
+F1E0
+F1E0
+F1E0
+F1E0
+F1E0
+F1E0
+60C0
+60C0
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 18 25 0 -1
+BITMAP
+03C700
+03C700
+038F00
+038F00
+078F00
+078E00
+078E00
+7FFFC0
+7FFFC0
+7FFFC0
+7FFFC0
+0F1C00
+0E1C00
+0E1C00
+0E3C00
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+1C7800
+3C7800
+3C7000
+3C7000
+38F000
+38F000
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 28 1 -3
+BITMAP
+0180
+0180
+0FF0
+3FFC
+7FFE
+FDBE
+F99F
+F19F
+F18F
+F980
+FF80
+7FC0
+3FF0
+0FFC
+01FE
+01FF
+019F
+018F
+F18F
+F19F
+F99F
+7FFE
+7FFE
+3FF8
+07E0
+0180
+0180
+0180
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 889 0
+DWIDTH 29 0
+BBX 26 23 1 0
+BITMAP
+0E003000
+3F807000
+7FC06000
+71C0E000
+E0E0C000
+E0E1C000
+E0E38000
+E0E38000
+71C70000
+7FC60000
+3F8E0000
+0E0C1C00
+001C7F00
+0018FF80
+0038E380
+0031C1C0
+0071C1C0
+0061C1C0
+00E1C1C0
+01C0E380
+01C0FF80
+03807F00
+03001C00
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 25 2 0
+BITMAP
+03E000
+0FF800
+1FFC00
+1FFC00
+1E3C00
+3E3C00
+3E3C00
+1F3C00
+1FF800
+0FF800
+0FF000
+0FE000
+3FF1E0
+7FF1E0
+7CF9C0
+F8FFC0
+F07FC0
+F03F80
+F01F00
+F80F80
+FC3FC0
+7FFFE0
+7FFBE0
+1FF1F0
+07C000
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 238 0
+DWIDTH 8 0
+BBX 4 9 2 16
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 8 31 1 -6
+BITMAP
+07
+0F
+1E
+1E
+3C
+3C
+38
+78
+78
+78
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F8
+78
+78
+78
+78
+3C
+3C
+1C
+1E
+0E
+0F
+07
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 8 31 1 -6
+BITMAP
+E0
+F0
+78
+78
+3C
+3C
+1C
+1E
+1E
+1E
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+1F
+1E
+1E
+1E
+1C
+3C
+3C
+38
+78
+70
+F0
+E0
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 11 1 13
+BITMAP
+0C00
+0C00
+4C80
+EDC0
+FFC0
+7F80
+1E00
+3F00
+7F80
+7380
+2100
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 16 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+FFFF
+FFFF
+FFFF
+FFFF
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 11 2 -6
+BITMAP
+F8
+F8
+F8
+F8
+F8
+18
+18
+38
+70
+E0
+80
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 5 1 7
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 5 2 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 8 25 0 0
+BITMAP
+03
+03
+03
+03
+06
+06
+06
+0E
+0C
+0C
+0C
+1C
+18
+18
+18
+30
+30
+30
+70
+60
+60
+60
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+0FE0
+1FF0
+3FF8
+7FFC
+7C7C
+F83E
+F83E
+F83E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F83E
+F83E
+7C7C
+7FFC
+3FF8
+1FF0
+0FE0
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 10 23 2 0
+BITMAP
+01C0
+03C0
+07C0
+1FC0
+FFC0
+FFC0
+FFC0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0FE0
+3FF8
+7FFC
+7FFE
+FC7E
+F83F
+F81F
+F01F
+F01F
+003F
+003E
+007E
+00FC
+01F8
+07F0
+0FE0
+1F80
+3F00
+7E00
+FC00
+FFFF
+FFFF
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0FE0
+3FF8
+7FFC
+7FFC
+F83E
+F03E
+F01E
+F01E
+003E
+007C
+03F8
+03F0
+03FC
+007E
+003F
+001F
+F01F
+F01F
+F03F
+F83E
+7FFE
+7FFC
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+00F8
+00F8
+01F8
+03F8
+03F8
+07F8
+0F78
+0E78
+1E78
+1C78
+3C78
+7878
+7078
+F078
+E078
+FFFF
+FFFF
+FFFF
+FFFF
+0078
+0078
+0078
+0078
+0078
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+3FFC
+3FFC
+3FFC
+3FFC
+3800
+7800
+7800
+7800
+7BE0
+7FF8
+7FFC
+7FFC
+787E
+003E
+003E
+001E
+001E
+F03E
+F03E
+F87C
+7FFC
+7FF8
+3FF0
+0FC0
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+07E0
+1FF8
+3FFC
+3FFE
+7C3E
+781E
+F000
+F000
+F3E0
+F7F8
+FFFC
+FFFC
+FC7E
+F83E
+F01E
+F01E
+F01E
+F01E
+F83E
+7C7C
+7FFC
+3FF8
+1FF0
+07C0
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+FFFF
+FFFF
+FFFF
+FFFF
+001E
+003E
+003C
+0078
+00F8
+00F0
+01F0
+01E0
+03E0
+03C0
+07C0
+07C0
+0780
+0F80
+0F80
+0F80
+1F00
+1F00
+1F00
+1F00
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 17 24 0 0
+BITMAP
+07F000
+1FFC00
+3FFE00
+3E3E00
+7C1F00
+780F00
+780F00
+780F00
+7C1F00
+3E3E00
+1FFC00
+1FFC00
+3FFE00
+7C1F00
+F80F80
+F00780
+F00780
+F00780
+F80F80
+7E3F00
+7FFE00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+07C0
+1FF0
+3FF8
+7FFC
+7C7C
+F83E
+F01E
+F01E
+F01E
+F01E
+F83E
+FC7E
+7FFE
+7FFE
+3FDE
+079E
+001E
+001E
+F03C
+F87C
+7FF8
+7FF8
+1FF0
+07C0
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 17 3 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+00
+00
+00
+00
+00
+00
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 23 3 -6
+BITMAP
+F8
+F8
+F8
+F8
+F8
+00
+00
+00
+00
+00
+00
+00
+F8
+F8
+F8
+F8
+F8
+18
+18
+38
+70
+E0
+80
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 16 1 0
+BITMAP
+0003
+001F
+007F
+03FF
+0FFE
+7FF8
+FFC0
+FE00
+FE00
+FFC0
+7FF0
+0FFE
+03FF
+007F
+001F
+0003
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 12 2 2
+BITMAP
+FFFE
+FFFE
+FFFE
+FFFE
+0000
+0000
+0000
+0000
+FFFE
+FFFE
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 16 1 0
+BITMAP
+C000
+F000
+FE00
+FFC0
+7FF0
+1FFE
+03FF
+007F
+007F
+03FF
+1FFE
+7FF0
+FFC0
+FE00
+F000
+C000
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 2 0
+BITMAP
+0FE0
+3FF8
+7FFC
+7FFE
+FC7E
+F83F
+F81F
+F01F
+F01F
+003F
+007E
+00FE
+01FC
+01F8
+03E0
+03C0
+07C0
+07C0
+0000
+0000
+07C0
+07C0
+07C0
+07C0
+07C0
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 975 0
+DWIDTH 33 0
+BBX 29 30 1 -5
+BITMAP
+000FE000
+007FFC00
+01FFFE00
+03F03F80
+07C007C0
+0F0003C0
+1E0001E0
+1C0000F0
+3C07DC70
+381FFC70
+703CFC38
+70787838
+F0F03838
+E0E03838
+E1E03838
+E1C07078
+E1C07070
+E1C07070
+E1E0F0E0
+F1E1F1E0
+70FFFFC0
+787F3F80
+383E1E00
+3C000000
+1E000000
+0F800000
+0FF03C00
+03FFFC00
+01FFFC00
+007FE000
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 25 0 0
+BITMAP
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 25 3 0
+BITMAP
+FFFC00
+FFFF00
+FFFF80
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80F80
+FFFF00
+FFFF00
+FFFF80
+FFFFC0
+F807C0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807E0
+FFFFC0
+FFFFC0
+FFFF80
+FFFE00
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 25 1 0
+BITMAP
+01FE00
+07FF80
+0FFFC0
+1FFFE0
+3F87F0
+3E01F0
+7C01F8
+7C00F8
+7C00F8
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+7C00F8
+7C00F8
+7E01F8
+3E01F0
+3F87F0
+1FFFE0
+0FFFC0
+07FF80
+01FE00
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 25 2 0
+BITMAP
+FFF800
+FFFF00
+FFFF80
+FFFFC0
+F80FE0
+F803E0
+F803F0
+F801F0
+F801F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F801F8
+F801F0
+F803F0
+F803E0
+F80FE0
+FFFFC0
+FFFF80
+FFFF00
+FFF800
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 25 2 0
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 2 0
+BITMAP
+FFFF
+FFFF
+FFFF
+FFFF
+F800
+F800
+F800
+F800
+F800
+F800
+FFFE
+FFFE
+FFFE
+FFFE
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 25 1 0
+BITMAP
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 25 2 0
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 25 2 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 0
+BITMAP
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+F83E
+F83E
+F83E
+F83E
+F83E
+FC7E
+FFFC
+7FFC
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 25 2 0
+BITMAP
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFE000
+FFF000
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 2 0
+BITMAP
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+FFFF
+FFFF
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 833 0
+DWIDTH 27 0
+BBX 23 25 2 0
+BITMAP
+FE00FE
+FE00FE
+FF01FE
+FF01FE
+FF01FE
+FF01FE
+FF83FE
+FF83FE
+FB83BE
+FB83BE
+FBC7BE
+FBC7BE
+FBC7BE
+F9C73E
+F9EF3E
+F9EF3E
+F9EF3E
+F9EF3E
+F8EE3E
+F8FE3E
+F8FE3E
+F8FE3E
+F87C3E
+F87C3E
+F87C3E
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 25 2 0
+BITMAP
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 25 1 0
+BITMAP
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 25 2 0
+BITMAP
+FFF800
+FFFE00
+FFFF00
+FFFF80
+F81F80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80FC0
+F81F80
+FFFF80
+FFFF00
+FFFC00
+FFF000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 23 26 1 -1
+BITMAP
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+FC007E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8023E
+FC073E
+7C0FBC
+7E0FFC
+3F07F8
+3FC3F0
+1FFFF8
+0FFFFC
+07FFFE
+01FF3C
+000018
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 25 2 0
+BITMAP
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 25 1 0
+BITMAP
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 25 0 0
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 25 2 0
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 25 1 0
+BITMAP
+F801F0
+F801F0
+7C03E0
+7C03E0
+7C03E0
+3C03C0
+3E07C0
+3E07C0
+1E0780
+1F0F80
+1F0F80
+0F0F00
+0F0F00
+0F0F00
+079E00
+079E00
+079E00
+07FE00
+03FC00
+03FC00
+03FC00
+01F800
+01F800
+01F800
+00F000
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 25 1 0
+BITMAP
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7C3FC3E0
+7C3FC3E0
+3C3FC3E0
+3C39C3C0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1E70E780
+1E70E780
+0FF0FF00
+0FF0FF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 25 1 0
+BITMAP
+FC03E0
+7E07E0
+7E07C0
+3F0FC0
+1F0F80
+1F9F00
+0F9F00
+0FBE00
+07FE00
+07FC00
+03FC00
+03F800
+01F800
+03F800
+03FC00
+07FC00
+07FE00
+0FBF00
+1F9F00
+1F1F80
+3F0F80
+3E0FC0
+7E07C0
+FC07E0
+FC03F0
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 25 1 0
+BITMAP
+FC03F0
+FC03E0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 1 0
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000F80
+001F80
+003F00
+007E00
+007C00
+00FC00
+01F800
+03F000
+03F000
+07E000
+0FC000
+0F8000
+1F8000
+3F0000
+7E0000
+7E0000
+FC0000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 8 31 2 -6
+BITMAP
+FF
+FF
+FF
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+FF
+FF
+FF
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 9 25 0 0
+BITMAP
+C000
+C000
+E000
+6000
+6000
+7000
+7000
+3000
+3800
+3800
+1800
+1C00
+1C00
+0C00
+0C00
+0E00
+0E00
+0600
+0700
+0700
+0300
+0380
+0380
+0180
+0180
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 8 31 0 -6
+BITMAP
+FF
+FF
+FF
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+0F
+FF
+FF
+FF
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 14 14 2 9
+BITMAP
+0780
+0FC0
+0FC0
+0FC0
+1FE0
+1FE0
+3CF0
+3CF0
+3870
+7878
+7878
+703C
+F03C
+F03C
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 18 2 0 -6
+BITMAP
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 5 2 20
+BITMAP
+E0
+F0
+70
+78
+38
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 18 1 0
+BITMAP
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 2 0
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F3F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81F
+F01F
+F00F
+F00F
+F00F
+F00F
+F01F
+F01F
+F83E
+FFFE
+FFFC
+F7F8
+F1F0
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 18 1 0
+BITMAP
+07E0
+1FF8
+3FFC
+3FFC
+7C3E
+783E
+F01E
+F000
+F000
+F000
+F000
+F01E
+F81E
+7C3E
+7FFC
+3FF8
+1FF8
+07E0
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 1 0
+BITMAP
+000F
+000F
+000F
+000F
+000F
+000F
+000F
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FEF
+1FEF
+0F8F
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 18 1 0
+BITMAP
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 25 0 0
+BITMAP
+07C0
+0FC0
+1FC0
+1F00
+1E00
+1E00
+1E00
+FFC0
+FFC0
+FFC0
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 1 -7
+BITMAP
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 0
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F1E0
+F7F8
+FFFC
+FFFC
+FC3E
+F81E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 25 2 0
+BITMAP
+F0
+F0
+F0
+F0
+00
+00
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 6 32 0 -7
+BITMAP
+3C
+3C
+3C
+3C
+00
+00
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+FC
+FC
+F8
+F8
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 15 25 2 0
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F03E
+F07C
+F0F8
+F1F0
+F3E0
+F7C0
+FF80
+FFC0
+FFC0
+FFE0
+FFE0
+F9F0
+F1F0
+F0F8
+F078
+F07C
+F03E
+F03E
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 25 2 0
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 889 0
+DWIDTH 30 0
+BBX 24 18 2 0
+BITMAP
+F1E0F8
+F7FBFE
+FFFFFE
+FFFFFF
+FC7F1F
+F83E0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 18 2 0
+BITMAP
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 18 1 0
+BITMAP
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 2 -7
+BITMAP
+F1F0
+F7F8
+FFFC
+FFFE
+FC3E
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+FC3E
+FFFE
+FFFC
+F7F8
+F1F0
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 1 -7
+BITMAP
+07CF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FFF
+3FEF
+0FCF
+000F
+000F
+000F
+000F
+000F
+000F
+000F
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 18 1 0
+BITMAP
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 22 1 0
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 18 2 0
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 17 18 0 0
+BITMAP
+F80F80
+F80F80
+7C1F00
+7C1F00
+3C1E00
+3C1E00
+3E3E00
+1E3C00
+1E3C00
+1E3C00
+0F7800
+0F7800
+0F7800
+07F000
+07F000
+07F000
+03E000
+03E000
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 18 0 0
+BITMAP
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 18 1 0
+BITMAP
+F81F
+FC3F
+7C3E
+3E7C
+3E78
+1FF8
+0FF0
+07E0
+03C0
+07E0
+0FE0
+0FF0
+1FF8
+3E78
+3E7C
+7C3E
+FC3F
+F81F
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 25 1 -7
+BITMAP
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 18 1 0
+BITMAP
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1F80
+1F00
+3E00
+7C00
+F800
+FFFC
+FFFC
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 9 32 2 -7
+BITMAP
+0F80
+1F80
+3F80
+3E00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+7C00
+7800
+E000
+7800
+7C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+1F80
+0F80
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 280 0
+DWIDTH 9 0
+BBX 3 31 3 -6
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 9 32 2 -7
+BITMAP
+F800
+FC00
+FE00
+3E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1F00
+0F00
+0380
+0F00
+1F00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+FE00
+FC00
+F800
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 14 6 2 5
+BITMAP
+3800
+7E0C
+FF9C
+E7FC
+C1F8
+0070
+ENDCHAR
+STARTCHAR space
+ENCODING 160
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 24 2 -6
+BITMAP
+F8
+F8
+F8
+F8
+F8
+00
+00
+70
+70
+70
+70
+70
+70
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 -3
+BITMAP
+0020
+0020
+0060
+07F0
+1FF8
+3FFC
+7FFC
+7CBE
+F89E
+F99E
+F180
+F180
+F300
+F300
+F31E
+FA1E
+7E3E
+7FFC
+3FF8
+1FF0
+0FC0
+0C00
+0800
+0800
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 17 24 0 0
+BITMAP
+03F000
+1FFC00
+3FFE00
+3FFF00
+7E1F00
+7C0F80
+7C0F80
+7C0780
+7C0000
+7E0000
+3E0000
+FFF000
+FFF000
+1F0000
+0F0000
+0F0000
+0F0000
+1F0000
+1E0000
+3DE300
+7FFF80
+FFFF80
+FFFF00
+607E00
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 15 1 4
+BITMAP
+E00E
+F7DE
+FFFE
+7FFC
+3C78
+783C
+701C
+701C
+701C
+783C
+3C78
+7FFC
+FFFE
+F7DE
+E00E
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 18 24 0 0
+BITMAP
+F807C0
+F807C0
+7C0F80
+3C0F00
+1E1E00
+1E1E00
+0F3C00
+0F3C00
+07F800
+07F800
+03F000
+01E000
+3FFF00
+3FFF00
+01E000
+01E000
+3FFF00
+3FFF00
+01E000
+01E000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 280 0
+DWIDTH 9 0
+BBX 3 31 3 -6
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+00
+00
+00
+00
+00
+00
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 32 1 -7
+BITMAP
+0FF0
+1FF8
+3FF8
+7E7C
+7C3C
+7C3C
+7E00
+7F00
+3FC0
+1FE0
+3FF8
+7FFC
+71FE
+F0FF
+F03F
+F81F
+FC0F
+7F0F
+7F9F
+3FFE
+1FF8
+07FC
+01FE
+007E
+003E
+781E
+781E
+7C3E
+3FFC
+3FFC
+1FF8
+07E0
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 4 0 21
+BITMAP
+F3C0
+F3C0
+F3C0
+F3C0
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 737 0
+DWIDTH 24 0
+BBX 26 25 0 0
+BITMAP
+007F8000
+03FFE000
+0780F800
+1F003C00
+1C000E00
+38000700
+703F0300
+707F8380
+E0F3C180
+E1C0E1C0
+C1C0E0C0
+C38000C0
+C38000C0
+C38000C0
+C38000C0
+C1C0E0C0
+E1C0E1C0
+E0F3C380
+607F8380
+703F0700
+38000E00
+1E003C00
+0F80F800
+07FFE000
+01FF8000
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 370 0
+DWIDTH 12 0
+BBX 9 16 1 9
+BITMAP
+3E00
+7F00
+E380
+C380
+1F80
+7F80
+F380
+E380
+E380
+FF80
+7B80
+0000
+0000
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 12 13 3 2
+BITMAP
+0810
+1830
+3870
+78F0
+F1E0
+E1C0
+E1C0
+F1E0
+F9F0
+78F0
+3870
+1830
+0810
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 10 1 4
+BITMAP
+FFFF
+FFFF
+FFFF
+FFFF
+000F
+000F
+000F
+000F
+000F
+000F
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 173
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 5 1 7
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 737 0
+DWIDTH 24 0
+BBX 26 25 0 0
+BITMAP
+00FF8000
+03FFE000
+0780F800
+1E003C00
+1C000E00
+38FF8700
+70FFC300
+70E1E380
+E0E0E180
+E0E0E180
+C0E0E1C0
+C0E1C1C0
+C0FF81C0
+C0FF01C0
+C0E381C0
+C0E3C1C0
+E0E1C180
+E0E0E380
+70E0F380
+70E07700
+38000E00
+1E001C00
+0F807800
+07FFE000
+01FF8000
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 3 0 21
+BITMAP
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 400 0
+DWIDTH 13 0
+BBX 9 10 2 14
+BITMAP
+3E00
+7F00
+6300
+C180
+C180
+C180
+C180
+6300
+7F00
+3E00
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 22 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+FFFF
+FFFF
+FFFF
+FFFF
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+0000
+0000
+FFFF
+FFFF
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 15 0 9
+BITMAP
+3F00
+7F80
+F3C0
+E1C0
+E1C0
+01C0
+03C0
+0780
+0F00
+3E00
+7800
+7000
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 15 0 9
+BITMAP
+1E00
+7F80
+F3C0
+E1C0
+E1C0
+03C0
+0F80
+0F80
+03C0
+01C0
+E1C0
+E1C0
+F3C0
+7F80
+3E00
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 6 5 4 20
+BITMAP
+3C
+78
+70
+E0
+E0
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 -7
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+FFFE
+FFDE
+F79E
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 17 31 0 -6
+BITMAP
+0FFF80
+1FFF80
+3F8C00
+7F8C00
+7F8C00
+FF8C00
+FF8C00
+FF8C00
+FF8C00
+FF8C00
+7F8C00
+7F8C00
+3F8C00
+3F8C00
+0F8C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+018C00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 5 2 11
+BITMAP
+60
+F0
+F0
+F0
+60
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 7 8 2 -7
+BITMAP
+30
+30
+30
+7C
+1E
+0E
+FC
+F8
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 6 15 2 9
+BITMAP
+1C
+3C
+FC
+FC
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 365 0
+DWIDTH 12 0
+BBX 10 16 1 9
+BITMAP
+3F00
+7F80
+7380
+E1C0
+E1C0
+E1C0
+E1C0
+E1C0
+7380
+7F80
+3F00
+0000
+0000
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 12 12 3 3
+BITMAP
+8100
+C180
+E1C0
+F1E0
+78F0
+3870
+3870
+78F0
+F1E0
+E1C0
+C180
+8100
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 834 0
+DWIDTH 28 0
+BBX 26 24 0 0
+BITMAP
+00003800
+06007000
+1E007000
+FE00E000
+FE01C000
+0E01C000
+0E038000
+0E038000
+0E070000
+0E070000
+0E0E0700
+0E1C0F00
+0E1C1F00
+0E381F00
+00383700
+00706700
+0070E700
+00E0C700
+01C18700
+01C1FFC0
+0381FFC0
+03800700
+07000700
+07000700
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 834 0
+DWIDTH 28 0
+BBX 25 24 1 0
+BITMAP
+0000E000
+0C01C000
+1C01C000
+FC038000
+FC038000
+1C070000
+1C0E0000
+1C0E0000
+1C1C0000
+1C1C0000
+1C387E00
+1C30FF00
+1C71E780
+1CE1C380
+00E1C380
+01C00780
+01C00F00
+03801E00
+07003C00
+07007800
+0E00F000
+0E01FF80
+1C01FF80
+1C01FF80
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 834 0
+DWIDTH 27 0
+BBX 25 24 1 0
+BITMAP
+3F001C00
+7F803800
+F3C03800
+E1C07000
+E1C0E000
+03C0E000
+0F81C000
+0F81C000
+0FC38000
+01C70000
+E1C70E00
+E1CE1E00
+F3CE1E00
+7F9C3E00
+3F1C7E00
+0038EE00
+0070CE00
+00718E00
+00E38E00
+00E3FF80
+01C3FF80
+01C00E00
+03800E00
+03800E00
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 24 1 -6
+BITMAP
+03E0
+03E0
+03E0
+03E0
+0000
+0000
+03C0
+03C0
+03C0
+07C0
+1F80
+3F80
+7F00
+7E00
+FC00
+F80F
+F80F
+F80F
+FC1F
+7E7F
+7FFE
+3FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+03C000
+01E000
+00F000
+007800
+003C00
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+000F00
+001E00
+003C00
+007800
+00F000
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+003000
+007800
+00FC00
+01CE00
+038700
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 30 0 0
+BITMAP
+00F180
+01FF80
+03FF00
+031E00
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+03CF00
+03CF00
+03CF00
+03CF00
+000000
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+007800
+00CC00
+008400
+008400
+00CC00
+007800
+000000
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 31 25 0 0
+BITMAP
+00FFFFFC
+00FFFFFC
+00FFFFFC
+01FFFFFC
+01F3C000
+01E3C000
+03E3C000
+03E3C000
+03C3C000
+07C3C000
+07C3C000
+07C3FFF8
+0F83FFF8
+0F83FFF8
+0F83FFF8
+1F03C000
+1FFFC000
+1FFFC000
+3FFFC000
+3FFFC000
+3E03C000
+7C03FFFE
+7C03FFFE
+F803FFFE
+F803FFFE
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 21 32 1 -7
+BITMAP
+01FE00
+07FF80
+0FFFC0
+1FFFE0
+3F87F0
+3E01F0
+7C01F0
+7C00F8
+7C00F8
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+7C00F8
+7C00F8
+7E01F8
+3E01F0
+3F87F0
+1FFFE0
+0FFFC0
+07FF80
+01FC00
+006000
+006000
+00F800
+001C00
+001C00
+01F800
+01F000
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+1E0000
+0F0000
+078000
+03C000
+01E000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+007800
+00F000
+01E000
+03C000
+078000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+1E3C00
+1E3C00
+1E3C00
+1E3C00
+000000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 8 31 0 0
+BITMAP
+F0
+78
+3C
+1E
+0F
+00
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+3E
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 8 31 2 0
+BITMAP
+0F
+1E
+3C
+78
+F0
+00
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 31 0 0
+BITMAP
+0C00
+1E00
+3F00
+7380
+E1C0
+0000
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 31 0 0
+BITMAP
+F3C0
+F3C0
+F3C0
+F3C0
+0000
+0000
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 23 25 -1 0
+BITMAP
+1FFF80
+1FFFE0
+1FFFF0
+1FFFF8
+1F07F8
+1F00FC
+1F00FC
+1F007C
+1F007E
+1F003E
+1F003E
+FFF03E
+FFF03E
+FFF03E
+1F003E
+1F003E
+1F007C
+1F007C
+1F007C
+1F00F8
+1F03F8
+1FFFF0
+1FFFF0
+1FFFC0
+1FFF80
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 0
+BITMAP
+03C600
+07FE00
+0FFC00
+0C7800
+000000
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+01E000
+00F000
+007800
+003C00
+001E00
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+000780
+000F00
+001E00
+003C00
+007800
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+001800
+003C00
+007E00
+00E700
+01C380
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 30 1 0
+BITMAP
+0078C0
+00FFC0
+01FF80
+018F00
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+01E780
+01E780
+01E780
+01E780
+000000
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 16 2 0
+BITMAP
+2008
+701C
+F83E
+FC7E
+7EFC
+3FF8
+1FF0
+0FE0
+0FE0
+1FF0
+3FF8
+7EFC
+FC7E
+F83E
+701C
+2008
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 24 25 1 0
+BITMAP
+01FF07
+07FFCE
+0FFFFC
+1FFFF8
+3FC7F8
+3F00F8
+7E01FC
+7C03FC
+7C07BC
+F8073E
+F80E3E
+F81C3E
+F8383E
+F8703E
+F8E03E
+F8E03E
+7DC07C
+7F807C
+7F00FC
+3F01F8
+3FC7F8
+3FFFF0
+3FFFE0
+77FFC0
+E1FF00
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+078000
+03C000
+01E000
+00F000
+007800
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+001E00
+003C00
+007800
+00F000
+01E000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+006000
+00F000
+01F800
+039C00
+070E00
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+0F1E00
+0F1E00
+0F1E00
+0F1E00
+000000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 31 1 0
+BITMAP
+001E00
+003C00
+007800
+00F000
+01E000
+000000
+FC03F0
+FC03F0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 25 2 0
+BITMAP
+F80000
+F80000
+F80000
+FFF800
+FFFE00
+FFFF00
+FFFF80
+F81F80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80FC0
+F81F80
+FFFF80
+FFFF00
+FFFE00
+FFFC00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 2 0
+BITMAP
+0FC000
+3FF000
+7FFC00
+FFFC00
+F87E00
+F83E00
+F03E00
+F03E00
+F07C00
+F0FC00
+F1F800
+F1FC00
+F1FE00
+F07F00
+F01F00
+F01F80
+F00F80
+F00F80
+F00F80
+F01F80
+F03F00
+F1FF00
+F1FE00
+F1FC00
+F1F000
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 0
+BITMAP
+0F00
+0780
+0380
+01C0
+00E0
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 0
+BITMAP
+0078
+00F0
+00E0
+01C0
+0380
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 0
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+078C
+0FFC
+1FF8
+18F0
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+1E78
+1E78
+1E78
+1E78
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 0
+BITMAP
+03C0
+0660
+0420
+0420
+0660
+03C0
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 889 0
+DWIDTH 29 0
+BBX 26 19 1 0
+BITMAP
+07E0F800
+1FFBFE00
+3FFFFF00
+3FFFFF00
+7C3F0F80
+781E0780
+781E07C0
+003E07C0
+07FFFFC0
+3FFFFFC0
+7FFFFFC0
+7C1E0000
+F81E0000
+F81E07C0
+FC3F0FC0
+FFFFFF80
+7FF7FF00
+3FE3FE00
+0F81F800
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 -7
+BITMAP
+07E0
+1FF8
+3FFC
+3FFC
+7C3E
+781E
+F81E
+F000
+F000
+F000
+F000
+F81E
+F81E
+7C3E
+7FFC
+3FF8
+1FF8
+07E0
+0300
+0300
+07C0
+00E0
+00E0
+0FC0
+0F80
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 25 1 0
+BITMAP
+0F00
+0780
+0380
+01C0
+00E0
+0000
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81E
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFE
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 25 1 0
+BITMAP
+0078
+00F0
+00E0
+01C0
+0380
+0000
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81E
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFE
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 25 1 0
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81E
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFE
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+1E78
+1E78
+1E78
+1E78
+0000
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81E
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFE
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 7 25 1 0
+BITMAP
+F0
+78
+38
+1C
+0E
+00
+00
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+1E
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 6 25 2 0
+BITMAP
+3C
+38
+70
+70
+E0
+00
+00
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 25 -1 0
+BITMAP
+0C00
+1E00
+3F00
+7380
+E1C0
+0000
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 24 -1 0
+BITMAP
+F3C0
+F3C0
+F3C0
+F3C0
+0000
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 26 1 0
+BITMAP
+300000
+782000
+7CF000
+3FE000
+1FC000
+3FE000
+73F000
+21F800
+07FC00
+1FFE00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F80F80
+F80F80
+FC1F80
+7E3F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+0F18
+1FF8
+3FF0
+31E0
+0000
+0000
+F3F0
+F7F8
+FFFC
+FFFE
+FC3E
+F83E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 1 0
+BITMAP
+078000
+03C000
+01C000
+01E000
+00F000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 1 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+03C000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 1 0
+BITMAP
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 24 1 0
+BITMAP
+078C00
+0FFC00
+1FF800
+18F000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 24 1 0
+BITMAP
+1E3C00
+1E3C00
+1E3C00
+1E3C00
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 16 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+0000
+FFFF
+FFFF
+FFFF
+FFFF
+0000
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 21 18 -1 0
+BITMAP
+01FC38
+07FF70
+0FFFE0
+1FFFC0
+1F8FC0
+3E07E0
+3E0FE0
+3C1DE0
+3C39E0
+3C71E0
+3EE3E0
+3F83E0
+3F07E0
+1F8FC0
+1FFFC0
+3FFF80
+77FF00
+E1FC00
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 0
+BITMAP
+1E00
+0F00
+0700
+0380
+01C0
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0700
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 0
+BITMAP
+0300
+0780
+0FC0
+1CE0
+3870
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 0
+BITMAP
+3C78
+3C78
+3C78
+3C78
+0000
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 32 1 -7
+BITMAP
+0078
+00F0
+01E0
+01C0
+0380
+0000
+0000
+F81F
+F81F
+F81F
+781E
+7C3E
+7C3C
+3C3C
+3C3C
+3E78
+3E78
+1E78
+1FF0
+1FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 32 2 -7
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F3F0
+F7FC
+FFFE
+FFFE
+FC3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+FC3E
+FFFE
+FFFC
+F7F8
+F1F0
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 31 1 -7
+BITMAP
+1E78
+1E78
+1E78
+1E78
+0000
+0000
+F81F
+F81F
+F81F
+783E
+7C3E
+7C3C
+7C3C
+3E7C
+3E78
+3E78
+1E78
+1FF0
+1FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 29 0 0
+BITMAP
+03FF00
+03FF00
+03FF00
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 22 1 0
+BITMAP
+1FF8
+1FF8
+1FF8
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+010100
+018300
+00FE00
+00FE00
+003800
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+1010
+1830
+0FE0
+0FE0
+0380
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 32 0 -7
+BITMAP
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8387C
+003000
+007000
+007000
+007000
+007F00
+003F00
+001E00
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 -7
+BITMAP
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F9E
+0300
+0700
+0700
+0700
+07F0
+03F0
+01E0
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 31 1 0
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+01FE00
+07FF80
+0FFFC0
+1FFFE0
+3F87F0
+3E01F0
+7C01F8
+7C00F8
+7C00F8
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+7C00F8
+7C00F8
+7E01F8
+3E01F0
+3F87F0
+1FFFE0
+0FFFC0
+07FF80
+01FE00
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+07E0
+1FF8
+3FFC
+3FFC
+7C3E
+783E
+F01E
+F000
+F000
+F000
+F000
+F01E
+F81E
+7C3E
+7FFC
+3FF8
+1FF8
+07E0
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 31 1 0
+BITMAP
+003000
+007800
+00FC00
+01CE00
+038700
+000000
+01FE00
+07FF80
+0FFFC0
+1FFFE0
+3F87F0
+3E01F0
+7C01F8
+7C00F8
+7C00F8
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+7C00F8
+7C00F8
+7E01F8
+3E01F0
+3F87F0
+1FFFE0
+0FFFC0
+07FF80
+01FE00
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+07E0
+1FF8
+3FFC
+3FFC
+7C3E
+783E
+F01E
+F000
+F000
+F000
+F000
+F01E
+F81E
+7C3E
+7FFC
+3FF8
+1FF8
+07E0
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 30 1 0
+BITMAP
+007800
+007800
+007800
+007800
+000000
+01FE00
+07FF80
+0FFFC0
+1FFFE0
+3F87F0
+3E01F0
+7C01F8
+7C00F8
+7C00F8
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+7C00F8
+7C00F8
+7E01F8
+3E01F0
+3F87F0
+1FFFE0
+0FFFC0
+07FF80
+01FE00
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 23 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+07E0
+1FF8
+3FFC
+3FFC
+7C3E
+783E
+F01E
+F000
+F000
+F000
+F000
+F01E
+F81E
+7C3E
+7FFC
+3FF8
+1FF8
+07E0
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 31 1 0
+BITMAP
+038700
+01CE00
+00FC00
+007800
+003000
+000000
+01FE00
+07FF80
+0FFFC0
+1FFFE0
+3F87F0
+3E01F0
+7C01F8
+7C00F8
+7C00F8
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+7C00F8
+7C00F8
+7E01F8
+3E01F0
+3F87F0
+1FFFE0
+0FFFC0
+07FF80
+01FE00
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+07E0
+1FF8
+3FFC
+3FFC
+7C3E
+783E
+F01E
+F000
+F000
+F000
+F000
+F01E
+F81E
+7C3E
+7FFC
+3FF8
+1FF8
+07E0
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 31 2 0
+BITMAP
+0E1C00
+073800
+03F000
+01E000
+00C000
+000000
+FFF800
+FFFF00
+FFFF80
+FFFFC0
+F80FE0
+F803E0
+F803F0
+F801F0
+F801F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F801F8
+F801F0
+F803F0
+F803E0
+F80FE0
+FFFFC0
+FFFF80
+FFFF00
+FFF800
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 858 0
+DWIDTH 28 0
+BBX 24 25 1 0
+BITMAP
+000F0F
+000F0F
+000F0F
+000F0F
+000F03
+000F03
+000F03
+0FCF06
+1FEF0C
+3FFF00
+7FFF00
+7C3F00
+F81F00
+F00F00
+F00F00
+F00F00
+F00F00
+F00F00
+F00F00
+F81F00
+7C3F00
+7FFF00
+3FEF00
+1FEF00
+0F8F00
+ENDCHAR
+STARTCHAR Dcroat
+ENCODING 272
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 23 25 -1 0
+BITMAP
+1FFF80
+1FFFE0
+1FFFF0
+1FFFF8
+1F07F8
+1F00FC
+1F00FC
+1F007C
+1F007E
+1F003E
+1F003E
+FFF03E
+FFF03E
+FFF03E
+1F003E
+1F003E
+1F007C
+1F007C
+1F007C
+1F00F8
+1F03F8
+1FFFF0
+1FFFF0
+1FFFC0
+1FFF80
+ENDCHAR
+STARTCHAR dcroat
+ENCODING 273
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 1 0
+BITMAP
+000F
+000F
+000F
+000F
+000F
+003F
+003F
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FEF
+1FEF
+0F8F
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 29 2 0
+BITMAP
+1FF800
+1FF800
+1FF800
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 22 1 0
+BITMAP
+1FF8
+1FF8
+1FF8
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+101000
+183000
+0FE000
+0FE000
+038000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0808
+0C18
+07F0
+07F0
+01C0
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 30 2 0
+BITMAP
+03C000
+03C000
+03C000
+03C000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 23 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 32 2 -7
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+018000
+038000
+038000
+038000
+03F800
+01F800
+00F000
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 25 1 -7
+BITMAP
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+0300
+0700
+0700
+0700
+07F0
+03F0
+01E0
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+1C3800
+0E7000
+07E000
+03C000
+018000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 31 1 0
+BITMAP
+003000
+007800
+00FC00
+01CE00
+038700
+000000
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 1 -7
+BITMAP
+00C0
+01E0
+03F0
+0738
+0E1C
+0000
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 31 1 0
+BITMAP
+010100
+018300
+00FE00
+00FE00
+003800
+000000
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 1 -7
+BITMAP
+0808
+0C18
+07F0
+07F0
+01C0
+0000
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 30 1 0
+BITMAP
+007800
+007800
+007800
+007800
+000000
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 1 -7
+BITMAP
+01E0
+01E0
+01E0
+01E0
+0000
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 37 1 -12
+BITMAP
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+000000
+007C00
+007C00
+007C00
+007C00
+007C00
+000C00
+000C00
+001C00
+003800
+007000
+004000
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 35 1 -7
+BITMAP
+0060
+00C0
+0180
+0180
+0180
+01E0
+01E0
+01E0
+01E0
+0000
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 31 2 0
+BITMAP
+006000
+00F000
+01F800
+039C00
+070E00
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 1 0
+BITMAP
+0C00
+1E00
+3F00
+7380
+E1C0
+0000
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+78F0
+7BFC
+7FFE
+7FFE
+7E1F
+7C0F
+7C0F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+ENDCHAR
+STARTCHAR Hbar
+ENCODING 294
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 25 2 0
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+ENDCHAR
+STARTCHAR hbar
+ENCODING 295
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 0
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FE00
+FE00
+F1E0
+F7F8
+FFFC
+FFFC
+FC3E
+F81E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 11 30 -1 0
+BITMAP
+3C60
+7FE0
+FFC0
+C780
+0000
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 11 23 -1 0
+BITMAP
+3C60
+7FE0
+FFC0
+C780
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 29 0 0
+BITMAP
+FFC0
+FFC0
+FFC0
+0000
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 22 -1 0
+BITMAP
+FFC0
+FFC0
+FFC0
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 9 31 0 0
+BITMAP
+8080
+C180
+7F00
+7F00
+1C00
+0000
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 9 24 0 0
+BITMAP
+8080
+C180
+7F00
+7F00
+1C00
+0000
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 7 32 2 -7
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+60
+E0
+E0
+E0
+FE
+7E
+3C
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 7 32 2 -7
+BITMAP
+F0
+F0
+F0
+F0
+00
+00
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+60
+E0
+E0
+E0
+FE
+7E
+3C
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 30 2 0
+BITMAP
+78
+78
+78
+78
+00
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 18 2 0
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 820 0
+DWIDTH 27 0
+BBX 23 25 2 0
+BITMAP
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8F83E
+F8F83E
+F8F83E
+F8F83E
+F8F83E
+F8FC7E
+F8FFFC
+F87FFC
+F83FF8
+F80FE0
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 542 0
+DWIDTH 18 0
+BBX 13 32 2 -7
+BITMAP
+F078
+F078
+F078
+F078
+0000
+0000
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+F078
+0078
+0078
+0078
+01F8
+01F8
+01F0
+01F0
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 31 1 0
+BITMAP
+0030
+0078
+00FC
+01CE
+0387
+0000
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+003E
+F83E
+F83E
+F83E
+F83E
+F83E
+FC7E
+FFFC
+7FFC
+3FF8
+0FE0
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 32 -1 -7
+BITMAP
+0C00
+1E00
+3F00
+7380
+E1C0
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+7E00
+7E00
+7C00
+7C00
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 37 2 -12
+BITMAP
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFE000
+FFF000
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+000000
+01F000
+01F000
+01F000
+01F000
+01F000
+003000
+003000
+007000
+00E000
+01C000
+010000
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 15 37 2 -12
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F03E
+F07C
+F0F8
+F1F0
+F3E0
+F7C0
+FF80
+FFC0
+FFC0
+FFE0
+FFE0
+F9F0
+F1F0
+F0F8
+F078
+F07C
+F03E
+F03E
+0000
+07C0
+07C0
+07C0
+07C0
+07C0
+00C0
+00C0
+01C0
+0380
+0700
+0400
+ENDCHAR
+STARTCHAR kgreenlandic
+ENCODING 312
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 15 18 2 0
+BITMAP
+F03E
+F07C
+F0F8
+F1F0
+F3E0
+F7C0
+FF80
+FFC0
+FFC0
+FFE0
+FFE0
+F9F0
+F1F0
+F0F8
+F078
+F07C
+F03E
+F03E
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 2 0
+BITMAP
+0F00
+1E00
+1C00
+3800
+3800
+0000
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+FFFF
+FFFF
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 6 31 2 0
+BITMAP
+3C
+78
+70
+E0
+E0
+00
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 37 2 -12
+BITMAP
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+FFFF
+FFFF
+FFFF
+FFFF
+0000
+07C0
+07C0
+07C0
+07C0
+07C0
+00C0
+00C0
+01C0
+0380
+0700
+0400
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 37 2 -12
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+00
+F8
+F8
+F8
+F8
+F8
+18
+18
+38
+70
+E0
+80
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 858 0
+DWIDTH 28 0
+BBX 23 25 2 0
+BITMAP
+F8001E
+F8001E
+F8001E
+F8001E
+F80006
+F80006
+F80006
+F8000C
+F80018
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 542 0
+DWIDTH 18 0
+BBX 13 25 2 0
+BITMAP
+F078
+F078
+F078
+F078
+F018
+F018
+F018
+F030
+F060
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 858 0
+DWIDTH 28 0
+BBX 23 25 2 0
+BITMAP
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F8000C
+F8001E
+F8001E
+F8001E
+F8000C
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 542 0
+DWIDTH 18 0
+BBX 13 25 2 0
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F030
+F078
+F078
+F078
+F030
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 25 0 0
+BITMAP
+1F0000
+1F0000
+1F0000
+1F0000
+1F0000
+1F0000
+1F0000
+1F2000
+1FE000
+1FE000
+1FC000
+1F0000
+3F0000
+FF0000
+FF0000
+DF0000
+1F0000
+1F0000
+1F0000
+1F0000
+1F0000
+1FFFE0
+1FFFE0
+1FFFE0
+1FFFE0
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 8 25 0 0
+BITMAP
+3C
+3C
+3C
+3C
+3C
+3C
+3D
+3F
+3F
+3E
+3C
+3C
+7C
+FC
+FC
+BC
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+3C
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+01E0
+03C0
+0380
+0700
+0700
+0000
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 37 2 -12
+BITMAP
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+000000
+01F000
+01F000
+01F000
+01F000
+01F000
+003000
+003000
+007000
+00E000
+01C000
+010000
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 30 2 -12
+BITMAP
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+0000
+07C0
+07C0
+07C0
+07C0
+07C0
+00C0
+00C0
+01C0
+0380
+0700
+0400
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+0E1C00
+073800
+03F000
+01E000
+00C000
+000000
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+3870
+1CE0
+0FC0
+0780
+0300
+0000
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 875 0
+DWIDTH 29 0
+BBX 24 25 2 0
+BITMAP
+F00000
+F00000
+F00000
+F00000
+300000
+300000
+300000
+6078F8
+C07BFE
+007FFE
+007FFF
+007E1F
+007C0F
+00780F
+00780F
+00780F
+00780F
+00780F
+00780F
+00780F
+00780F
+00780F
+00780F
+00780F
+00780F
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 32 2 -7
+BITMAP
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+0001E0
+0001E0
+0001E0
+0007E0
+0007E0
+0007C0
+0007C0
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 -7
+BITMAP
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+001E
+001E
+001E
+007E
+007E
+007C
+007C
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 29 1 0
+BITMAP
+01FF80
+01FF80
+01FF80
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 22 1 0
+BITMAP
+0FFC00
+0FFC00
+0FFC00
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+010100
+018300
+00FE00
+00FE00
+003800
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 24 1 0
+BITMAP
+080800
+0C1800
+07F000
+07F000
+01C000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+0071C0
+00F3C0
+00E380
+01C700
+018600
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 24 1 0
+BITMAP
+038E00
+079E00
+071C00
+0E3800
+0C3000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 29 25 1 0
+BITMAP
+03FBFFF8
+07FFFFF8
+0FFFFFF8
+1FFFFFF8
+3F8FFFF8
+3F07E000
+7E03E000
+7C03E000
+7C03E000
+F803E000
+F803E000
+F803FFF0
+F803FFF0
+F803FFF0
+F803FFF0
+F803E000
+7803E000
+7C03E000
+7C03E000
+7E03E000
+3F0FE000
+3FFFFFF8
+1FFFFFF8
+0FFFFFF8
+03FBFFF8
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 28 19 1 0
+BITMAP
+07E03E00
+1FF8FF80
+3FFDFFC0
+3FFFFFE0
+7E7FE3E0
+7C1FC1F0
+F81F80F0
+F80F80F0
+F00FFFF0
+F00FFFF0
+F00FFFF0
+F00F8000
+F81F8000
+F81FC1F0
+7C3FC1F0
+7FFFFFE0
+3FFDFFC0
+1FF8FF80
+07E03E00
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 24 2 0
+BITMAP
+0780
+0F00
+0E00
+1C00
+1C00
+0000
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 37 2 -12
+BITMAP
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+000000
+01F000
+01F000
+01F000
+01F000
+01F000
+003000
+003000
+007000
+00E000
+01C000
+010000
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 30 2 -12
+BITMAP
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+7C00
+7C00
+7C00
+7C00
+7C00
+0C00
+0C00
+1C00
+3800
+7000
+4000
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+0E1C00
+073800
+03F000
+01E000
+00C000
+000000
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 24 2 0
+BITMAP
+E1C0
+7380
+3F00
+1E00
+0C00
+0000
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 31 1 0
+BITMAP
+003C00
+007800
+007000
+00E000
+00E000
+000000
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 24 1 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 31 1 0
+BITMAP
+006000
+00F000
+01F800
+039C00
+070E00
+000000
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 24 1 0
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 32 1 -7
+BITMAP
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+006000
+006000
+00F800
+003C00
+001C00
+01F800
+01F000
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 25 1 -7
+BITMAP
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+0180
+0180
+03E0
+00F0
+0070
+07E0
+07C0
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 27 2 0
+BITMAP
+1C3800
+0E7000
+07E000
+03C000
+018000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+FC3F00
+F80F00
+FE0000
+7FC000
+7FFC00
+1FFF00
+01FF80
+001FC0
+F007C0
+F007C0
+F807C0
+FC1F80
+7FFF80
+3FFF00
+1FFE00
+07F000
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 25 1 0
+BITMAP
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+0000
+0FF0
+1FFC
+3FFE
+7E7E
+781E
+781E
+7F00
+7FF0
+3FFC
+1FFE
+03FF
+003F
+F81F
+F81F
+7F3E
+7FFE
+3FFC
+0FF8
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 354
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 32 0 -7
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+00C000
+00C000
+01F000
+007800
+003800
+03F000
+03E000
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 355
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 29 1 -7
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+0C00
+0C00
+1F00
+0780
+0380
+3F00
+3E00
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 31 0 0
+BITMAP
+070E00
+039C00
+01F800
+00F000
+006000
+000000
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 594 0
+DWIDTH 19 0
+BBX 15 25 1 0
+BITMAP
+001E
+001E
+001E
+3C1E
+3C06
+3C06
+3C06
+FF8C
+FF98
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+ENDCHAR
+STARTCHAR Tbar
+ENCODING 358
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 25 0 0
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR tbar
+ENCODING 359
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 22 1 0
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3E00
+3E00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 0
+BITMAP
+03C600
+07FE00
+0FFC00
+0C7800
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 23 2 0
+BITMAP
+0F18
+1FF8
+3FF0
+31E0
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 29 2 0
+BITMAP
+07FE00
+07FE00
+07FE00
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 22 2 0
+BITMAP
+1FF8
+1FF8
+1FF8
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+040400
+060C00
+03F800
+03F800
+00E000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+1010
+1830
+0FE0
+0FE0
+0380
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 32 2 0
+BITMAP
+00E000
+01B000
+011000
+011000
+01B000
+00E000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 0
+BITMAP
+0380
+06C0
+0440
+0440
+06C0
+0380
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+01C700
+03CF00
+038E00
+071C00
+061800
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+071C
+0F3C
+0E38
+1C70
+1860
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 32 2 -7
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+00C000
+01C000
+01C000
+01C000
+01FC00
+00FC00
+007800
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 -7
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F9E
+0300
+0700
+0700
+0700
+07F0
+03F0
+01E0
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 31 1 0
+BITMAP
+00030000
+00078000
+000FC000
+001CE000
+00387000
+00000000
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7C3FC3E0
+7C3FC3E0
+3C3FC3E0
+3C39C3C0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1E70E780
+1E70E780
+0FF0FF00
+0FF0FF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 24 0 0
+BITMAP
+000C0000
+001E0000
+003F0000
+00738000
+00E1C000
+00000000
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 31 1 0
+BITMAP
+006000
+00F000
+01F800
+039C00
+070E00
+000000
+FC03F0
+FC03E0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 31 1 -7
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 27 1 0
+BITMAP
+0F3C00
+0F3C00
+0F3C00
+0F3C00
+000000
+000000
+000000
+F001E0
+F803E0
+7C07C0
+3E0F80
+1F1F00
+0FBE00
+07FC00
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 31 1 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000F80
+001F80
+003F00
+007E00
+007C00
+00FC00
+01F800
+03F000
+03F000
+07E000
+0FC000
+0F8000
+1F8000
+3F0000
+7E0000
+7E0000
+FC0000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 24 1 0
+BITMAP
+01E0
+03C0
+0380
+0700
+0700
+0000
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1F80
+1F00
+3E00
+7C00
+F800
+FFFC
+FFFC
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 30 1 0
+BITMAP
+01E000
+01E000
+01E000
+01E000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000F80
+001F80
+003F00
+007E00
+007C00
+00FC00
+01F800
+03F000
+03F000
+07E000
+0FC000
+0F8000
+1F8000
+3F0000
+7E0000
+7E0000
+FC0000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 23 1 0
+BITMAP
+0780
+0780
+0780
+0780
+0000
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1F80
+1F00
+3E00
+7C00
+F800
+FFFC
+FFFC
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 27 1 0
+BITMAP
+1C3800
+0E7000
+07E000
+03C000
+018000
+000000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+003F00
+007E00
+00FC00
+01F800
+03F000
+07E000
+0FC000
+1F8000
+3F0000
+7E0000
+FC0000
+F80000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 25 1 0
+BITMAP
+3870
+1CE0
+0FC0
+0780
+0300
+0000
+0000
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1F80
+1F00
+3E00
+7E00
+FC00
+FFFC
+FFFC
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR uni0186
+ENCODING 390
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 25 1 0
+BITMAP
+03FC00
+0FFF00
+1FFF80
+3FFFC0
+7F0FE0
+7C03E0
+FC03F0
+F801F0
+F801F0
+0000F8
+0000F8
+0000F8
+0000F8
+0000F8
+0000F8
+0000F8
+F801F0
+F801F0
+FC01F0
+7C03E0
+7F0FE0
+3FFFC0
+1FFF80
+0FFF00
+03FC00
+ENDCHAR
+STARTCHAR uni0189
+ENCODING 393
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 23 25 -1 0
+BITMAP
+1FFF80
+1FFFE0
+1FFFF0
+1FFFF8
+1F07F8
+1F00FC
+1F00FC
+1F007C
+1F007E
+1F003E
+1F003E
+FFF03E
+FFF03E
+FFF03E
+1F003E
+1F003E
+1F007C
+1F007C
+1F007C
+1F00F8
+1F03F8
+1FFFF0
+1FFFF0
+1FFFC0
+1FFF80
+ENDCHAR
+STARTCHAR uni018E
+ENCODING 398
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 25 2 0
+BITMAP
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+3FFFC0
+3FFFC0
+3FFFC0
+3FFFC0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+7FFFC0
+7FFFC0
+7FFFC0
+7FFFC0
+ENDCHAR
+STARTCHAR florin
+ENCODING 402
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 32 1 -7
+BITMAP
+003F
+007F
+007F
+00FF
+00F0
+01F0
+01F0
+01E0
+01E0
+3FFE
+3FFE
+3FFE
+03E0
+03C0
+03C0
+07C0
+07C0
+07C0
+07C0
+07C0
+0780
+0780
+0F80
+0F80
+0F80
+0F80
+0F00
+1F00
+FF00
+FE00
+FC00
+F800
+ENDCHAR
+STARTCHAR uni0197
+ENCODING 407
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 25 2 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni019A
+ENCODING 410
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 25 2 0
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F8
+F8
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR uni019D
+ENCODING 413
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 32 0 -7
+BITMAP
+3E00F8
+3F00F8
+3F00F8
+3F80F8
+3F80F8
+3FC0F8
+3FC0F8
+3FE0F8
+3FF0F8
+3EF0F8
+3EF8F8
+3E78F8
+3E7CF8
+3E3CF8
+3E3EF8
+3E1EF8
+3E0FF8
+3E0FF8
+3C07F8
+3C07F8
+3C03F8
+3C03F8
+3C01F8
+3C01F8
+3C00F8
+3C0000
+3C0000
+3C0000
+FC0000
+FC0000
+F80000
+F80000
+ENDCHAR
+STARTCHAR uni019F
+ENCODING 415
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 25 1 0
+BITMAP
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+FFFFFE
+FFFFFE
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR Ohorn
+ENCODING 416
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 25 25 1 0
+BITMAP
+01FF0780
+07FFC780
+0FFFE780
+1FFFF780
+3FC7F980
+3F01F980
+7E00FD80
+7C007F00
+7C007E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+7C007C00
+7C007C00
+7E00FC00
+3F01F800
+3FC7F800
+1FFFF000
+0FFFE000
+07FFC000
+01FF0000
+ENDCHAR
+STARTCHAR ohorn
+ENCODING 417
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 18 1 0
+BITMAP
+07F1E0
+1FFDE0
+3FFFE0
+7FFFE0
+7C1F60
+F80FE0
+F80FE0
+F007C0
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni01A7
+ENCODING 423
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 25 1 0
+BITMAP
+03F800
+0FFE00
+1FFF00
+3FFF80
+3F0F80
+7C07C0
+7C03C0
+7803C0
+0007C0
+001FC0
+01FF80
+0FFF80
+3FFF00
+7FF800
+7F8000
+FC0000
+F80000
+F803E0
+F803E0
+F807C0
+7E0FC0
+7FFF80
+3FFF00
+1FFE00
+03F800
+ENDCHAR
+STARTCHAR uni01A8
+ENCODING 424
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 18 1 0
+BITMAP
+0FE0
+3FF8
+7FFC
+7C3E
+F81E
+F81E
+003E
+03FE
+1FFC
+7FF0
+FFC0
+FC00
+F01F
+F01F
+F83E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR uni01AE
+ENCODING 430
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 32 0 -7
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+00F000
+00F000
+00F000
+00F000
+00F000
+00F000
+00F000
+00F000
+00F000
+00F000
+00FC00
+00FC00
+007C00
+007C00
+ENDCHAR
+STARTCHAR Uhorn
+ENCODING 431
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 25 2 0
+BITMAP
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uhorn
+ENCODING 432
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 18 18 2 0
+BITMAP
+F01FC0
+F01FC0
+F01FC0
+F01FC0
+F01EC0
+F01EC0
+F01EC0
+F01F80
+F01F00
+F01E00
+F01E00
+F01E00
+F83E00
+F87E00
+FFFE00
+7FFE00
+7FDE00
+1F1E00
+ENDCHAR
+STARTCHAR uni01B5
+ENCODING 437
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 1 0
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000F80
+001F80
+003F00
+007E00
+007C00
+00FC00
+01F800
+03F000
+03F000
+07E000
+0FC000
+0F8000
+1F8000
+3F0000
+7E0000
+7E0000
+FC0000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+ENDCHAR
+STARTCHAR uni01B6
+ENCODING 438
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 18 1 0
+BITMAP
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1FC0
+1F00
+3E00
+7C00
+F800
+FFFC
+FFFC
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR uni01BB
+ENCODING 443
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+0FE0
+3FF8
+7FFC
+7FFE
+FC7E
+F83F
+F81F
+F01F
+F01F
+003F
+003E
+FFFF
+FFFF
+01F8
+07F0
+0FE0
+1F80
+3F00
+7E00
+FC00
+FFFF
+FFFF
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR uni01BC
+ENCODING 444
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+3FFC
+3FFC
+3FFC
+3FFC
+3800
+7800
+7800
+7800
+7BE0
+7FF8
+7FFC
+7FFC
+787E
+003E
+003E
+001E
+001E
+F03E
+F03E
+F87C
+7FFC
+7FF8
+3FF0
+0FC0
+ENDCHAR
+STARTCHAR uni01C0
+ENCODING 448
+SWIDTH 280 0
+DWIDTH 9 0
+BBX 3 31 3 -6
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni01C2
+ENCODING 450
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 31 2 -7
+BITMAP
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+FFFE
+FFFE
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+FFFE
+FFFE
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR uni01C3
+ENCODING 451
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 25 3 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+70
+70
+70
+70
+70
+70
+70
+00
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni01CD
+ENCODING 461
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+038700
+01CE00
+00FC00
+007800
+003000
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni01CE
+ENCODING 462
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni01CF
+ENCODING 463
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 31 0 0
+BITMAP
+E1C0
+7380
+3F00
+1E00
+0C00
+0000
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni01D0
+ENCODING 464
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 24 -1 0
+BITMAP
+E1C0
+7380
+3F00
+1E00
+0C00
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR uni01D1
+ENCODING 465
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+01C380
+00E700
+007E00
+003C00
+001800
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni01D2
+ENCODING 466
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 24 1 0
+BITMAP
+0E1C00
+073800
+03F000
+01E000
+00C000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni01D3
+ENCODING 467
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+070E00
+039C00
+01F800
+00F000
+006000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni01D4
+ENCODING 468
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni01D5
+ENCODING 469
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 35 2 0
+BITMAP
+07FE00
+07FE00
+07FE00
+000000
+0F1E00
+0F1E00
+0F1E00
+0F1E00
+000000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni01D6
+ENCODING 470
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 29 2 0
+BITMAP
+1FF8
+1FF8
+1FF8
+0000
+3C78
+3C78
+3C78
+3C78
+0000
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni01D7
+ENCODING 471
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 37 2 0
+BITMAP
+003C00
+007800
+007000
+00E000
+00E000
+000000
+0F1E00
+0F1E00
+0F1E00
+0F1E00
+000000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni01D8
+ENCODING 472
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 31 2 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+3C78
+3C78
+3C78
+3C78
+0000
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni01D9
+ENCODING 473
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 37 2 0
+BITMAP
+070E00
+039C00
+01F800
+00F000
+006000
+000000
+0F1E00
+0F1E00
+0F1E00
+0F1E00
+000000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni01DA
+ENCODING 474
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 31 2 0
+BITMAP
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+3C78
+3C78
+3C78
+3C78
+0000
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni01DB
+ENCODING 475
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 37 2 0
+BITMAP
+01C000
+01E000
+00E000
+00F000
+007000
+000000
+0F1E00
+0F1E00
+0F1E00
+0F1E00
+000000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni01DC
+ENCODING 476
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 31 2 0
+BITMAP
+0700
+0780
+0380
+03C0
+01C0
+0000
+3C78
+3C78
+3C78
+3C78
+0000
+0000
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni01DD
+ENCODING 477
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 18 1 0
+BITMAP
+03E0
+0FF8
+3FFC
+3FFE
+7C3E
+781F
+000F
+000F
+FFFF
+FFFF
+FFFF
+F80F
+F81F
+7C3E
+7FFE
+3FFC
+1FF8
+07E0
+ENDCHAR
+STARTCHAR uni01DE
+ENCODING 478
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 35 0 0
+BITMAP
+03FF00
+03FF00
+03FF00
+000000
+03CF00
+03CF00
+03CF00
+03CF00
+000000
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni01DF
+ENCODING 479
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 28 1 0
+BITMAP
+1FF8
+1FF8
+1FF8
+0000
+1E78
+1E78
+1E78
+1E78
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni01E0
+ENCODING 480
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 34 0 0
+BITMAP
+03FF00
+03FF00
+03FF00
+000000
+007800
+007800
+007800
+007800
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni01E1
+ENCODING 481
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 27 1 0
+BITMAP
+1FF8
+1FF8
+1FF8
+0000
+03C0
+03C0
+03C0
+03C0
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni01E2
+ENCODING 482
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 31 29 0 0
+BITMAP
+000FFC00
+000FFC00
+000FFC00
+00000000
+00FFFFFC
+00FFFFFC
+00FFFFFC
+01FFFFFC
+01F3C000
+01E3C000
+03E3C000
+03E3C000
+03C3C000
+07C3C000
+07C3C000
+07C3FFF8
+0F83FFF8
+0F83FFF8
+0F83FFF8
+1F03C000
+1FFFC000
+1FFFC000
+3FFFC000
+3FFFC000
+3E03C000
+7C03FFFE
+7C03FFFE
+F803FFFE
+F803FFFE
+ENDCHAR
+STARTCHAR uni01E3
+ENCODING 483
+SWIDTH 889 0
+DWIDTH 29 0
+BBX 26 23 1 0
+BITMAP
+00FFC000
+00FFC000
+00FFC000
+00000000
+07E0F800
+1FFBFE00
+3FFFFF00
+3FFFFF00
+7C3F0F80
+781E0780
+781E07C0
+003E07C0
+07FFFFC0
+3FFFFFC0
+7FFFFFC0
+7C1E0000
+F81E0000
+F81E07C0
+FC3F0FC0
+FFFFFF80
+7FF7FF00
+3FE3FE00
+0F81F800
+ENDCHAR
+STARTCHAR uni01E4
+ENCODING 484
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 25 1 0
+BITMAP
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR uni01E5
+ENCODING 485
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 1 -7
+BITMAP
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+FFFF
+FFFF
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR Gcaron
+ENCODING 486
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 31 1 0
+BITMAP
+038700
+01CE00
+00FC00
+007800
+003000
+000000
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR gcaron
+ENCODING 487
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 1 -7
+BITMAP
+0E1C
+0738
+03F0
+01E0
+00C0
+0000
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR uni01E8
+ENCODING 488
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 31 2 0
+BITMAP
+0E1C00
+073800
+03F000
+01E000
+00C000
+000000
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFE000
+FFF000
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+ENDCHAR
+STARTCHAR uni01E9
+ENCODING 489
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 31 1 0
+BITMAP
+E1C0
+7380
+3F00
+1E00
+0C00
+0000
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+781F
+783E
+787C
+78F8
+79F0
+7BE0
+7FC0
+7FE0
+7FE0
+7FF0
+7FF0
+7CF8
+78F8
+787C
+783C
+783E
+781F
+781F
+ENDCHAR
+STARTCHAR uni01EA
+ENCODING 490
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 32 1 -7
+BITMAP
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+003000
+007000
+007000
+007000
+007F00
+003F00
+001E00
+ENDCHAR
+STARTCHAR uni01EB
+ENCODING 491
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 1 -7
+BITMAP
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+018000
+038000
+038000
+038000
+03F800
+01F800
+00F000
+ENDCHAR
+STARTCHAR uni01EC
+ENCODING 492
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 36 1 -7
+BITMAP
+01FF80
+01FF80
+01FF80
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+003000
+007000
+007000
+007000
+007F00
+003F00
+001E00
+ENDCHAR
+STARTCHAR uni01ED
+ENCODING 493
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 29 1 -7
+BITMAP
+0FFC00
+0FFC00
+0FFC00
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+018000
+038000
+038000
+038000
+03F800
+01F800
+00F000
+ENDCHAR
+STARTCHAR uni01F0
+ENCODING 496
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 32 -1 -7
+BITMAP
+E1C0
+7380
+3F00
+1E00
+0C00
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+7E00
+7E00
+7C00
+7C00
+ENDCHAR
+STARTCHAR uni01F4
+ENCODING 500
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 31 1 0
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR uni01F5
+ENCODING 501
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 1 -7
+BITMAP
+0078
+00F0
+00E0
+01C0
+01C0
+0000
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR uni01F8
+ENCODING 504
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+038000
+03C000
+01C000
+01E000
+00E000
+000000
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR uni01F9
+ENCODING 505
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+0E00
+0F00
+0700
+0780
+0380
+0000
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR Aringacute
+ENCODING 506
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 37 0 0
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+007800
+00CC00
+008400
+008400
+00CC00
+007800
+000000
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR aringacute
+ENCODING 507
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 31 1 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+03C0
+0660
+0420
+0420
+0660
+03C0
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR AEacute
+ENCODING 508
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 31 31 0 0
+BITMAP
+00007800
+0000F000
+0000E000
+0001C000
+0001C000
+00000000
+00FFFFFC
+00FFFFFC
+00FFFFFC
+01FFFFFC
+01F3C000
+01E3C000
+03E3C000
+03E3C000
+03C3C000
+07C3C000
+07C3C000
+07C3FFF8
+0F83FFF8
+0F83FFF8
+0F83FFF8
+1F03C000
+1FFFC000
+1FFFC000
+3FFFC000
+3FFFC000
+3E03C000
+7C03FFFE
+7C03FFFE
+F803FFFE
+F803FFFE
+ENDCHAR
+STARTCHAR aeacute
+ENCODING 509
+SWIDTH 889 0
+DWIDTH 29 0
+BBX 26 25 1 0
+BITMAP
+00078000
+000F0000
+000E0000
+001C0000
+001C0000
+00000000
+07E0F800
+1FFBFE00
+3FFFFF00
+3FFFFF00
+7C3F0F80
+781E0780
+781E07C0
+003E07C0
+07FFFFC0
+3FFFFFC0
+7FFFFFC0
+7C1E0000
+F81E0000
+F81E07C0
+FC3F0FC0
+FFFFFF80
+7FF7FF00
+3FE3FE00
+0F81F800
+ENDCHAR
+STARTCHAR Oslashacute
+ENCODING 510
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 24 31 1 0
+BITMAP
+000F00
+001E00
+001C00
+003800
+003800
+000000
+01FF07
+07FFCE
+0FFFFC
+1FFFF8
+3FC7F8
+3F00F8
+7E01FC
+7C03FC
+7C07BC
+F8073E
+F80E3E
+F81C3E
+F8383E
+F8703E
+F8E03E
+F8E03E
+7DC07C
+7F807C
+7F00FC
+3F01F8
+3FC7F8
+3FFFF0
+3FFFE0
+77FFC0
+E1FF00
+ENDCHAR
+STARTCHAR oslashacute
+ENCODING 511
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 21 24 -1 0
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+01FC38
+07FF70
+0FFFE0
+1FFFC0
+1F8FC0
+3E07E0
+3E0FE0
+3C1DE0
+3C39E0
+3C71E0
+3EE3E0
+3F83E0
+3F07E0
+1F8FC0
+1FFFC0
+3FFF80
+77FF00
+E1FC00
+ENDCHAR
+STARTCHAR uni0200
+ENCODING 512
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+071C00
+079E00
+038E00
+01C700
+00C300
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni0201
+ENCODING 513
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+71C0
+79E0
+38E0
+1C70
+0C30
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni0202
+ENCODING 514
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+003800
+00FE00
+00FE00
+018300
+010100
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni0203
+ENCODING 515
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 24 1 0
+BITMAP
+0380
+0FE0
+0FE0
+1830
+1010
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni0204
+ENCODING 516
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+38E000
+3CF000
+1C7000
+0E3800
+061800
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni0205
+ENCODING 517
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+38E0
+3CF0
+1C70
+0E38
+0618
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni0206
+ENCODING 518
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+038000
+0FE000
+0FE000
+183000
+101000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni0207
+ENCODING 519
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 0
+BITMAP
+01C0
+07F0
+07F0
+0C18
+0808
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni0208
+ENCODING 520
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 11 31 -2 0
+BITMAP
+E380
+F3C0
+71C0
+38E0
+1860
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR uni0209
+ENCODING 521
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 11 24 -2 0
+BITMAP
+E380
+F3C0
+71C0
+38E0
+1860
+0000
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR uni020A
+ENCODING 522
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 9 31 0 0
+BITMAP
+1C00
+7F00
+7F00
+C180
+8080
+0000
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni020B
+ENCODING 523
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 9 24 0 0
+BITMAP
+1C00
+7F00
+7F00
+C180
+8080
+0000
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+ENDCHAR
+STARTCHAR uni020C
+ENCODING 524
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+071C00
+079E00
+038E00
+01C700
+00C300
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni020D
+ENCODING 525
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 24 1 0
+BITMAP
+38E000
+3CF000
+1C7000
+0E3800
+061800
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni020E
+ENCODING 526
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 31 1 0
+BITMAP
+003800
+00FE00
+00FE00
+018300
+010100
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni020F
+ENCODING 527
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 24 1 0
+BITMAP
+01C000
+07F000
+07F000
+0C1800
+080800
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni0210
+ENCODING 528
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+1C7000
+1E7800
+0E3800
+071C00
+030C00
+000000
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR uni0211
+ENCODING 529
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 11 24 1 0
+BITMAP
+E380
+F3C0
+71C0
+38E0
+1860
+0000
+7860
+79E0
+7BE0
+7FE0
+7FE0
+7E00
+7C00
+7C00
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+ENDCHAR
+STARTCHAR uni0212
+ENCODING 530
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+00E000
+03F800
+03F800
+060C00
+040400
+000000
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR uni0213
+ENCODING 531
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 24 2 0
+BITMAP
+1C00
+7F00
+7F00
+C180
+8080
+0000
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR uni0214
+ENCODING 532
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+1C7000
+1E7800
+0E3800
+071C00
+030C00
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni0215
+ENCODING 533
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+71C0
+79E0
+38E0
+1C70
+0C30
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni0216
+ENCODING 534
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 0
+BITMAP
+00E000
+03F800
+03F800
+060C00
+040400
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni0217
+ENCODING 535
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 0
+BITMAP
+0380
+0FE0
+0FE0
+1830
+1010
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR Scommaaccent
+ENCODING 536
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 37 1 -12
+BITMAP
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+000000
+01F000
+01F000
+01F000
+01F000
+01F000
+003000
+003000
+007000
+00E000
+01C000
+010000
+ENDCHAR
+STARTCHAR scommaaccent
+ENCODING 537
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 30 1 -12
+BITMAP
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+0000
+03E0
+03E0
+03E0
+03E0
+03E0
+0060
+0060
+00E0
+01C0
+0380
+0200
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 538
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 37 0 -12
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+000000
+01F000
+01F000
+01F000
+01F000
+01F000
+003000
+003000
+007000
+00E000
+01C000
+010000
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 539
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 34 1 -12
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+0000
+1F00
+1F00
+1F00
+1F00
+1F00
+0300
+0300
+0700
+0E00
+1C00
+1000
+ENDCHAR
+STARTCHAR uni021E
+ENCODING 542
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 31 2 0
+BITMAP
+070E00
+039C00
+01F800
+00F000
+006000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+ENDCHAR
+STARTCHAR uni021F
+ENCODING 543
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 1 0
+BITMAP
+E1C0
+7380
+3F00
+1E00
+0C00
+0000
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+78F0
+7BFC
+7FFE
+7FFE
+7E1F
+7C0F
+7C0F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+ENDCHAR
+STARTCHAR uni0226
+ENCODING 550
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 30 0 0
+BITMAP
+007800
+007800
+007800
+007800
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni0227
+ENCODING 551
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 23 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni0228
+ENCODING 552
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 32 2 -7
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+018000
+018000
+03E000
+00F000
+007000
+07E000
+07C000
+ENDCHAR
+STARTCHAR uni0229
+ENCODING 553
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 25 1 -7
+BITMAP
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+0180
+0180
+03E0
+00F0
+0070
+07E0
+07C0
+ENDCHAR
+STARTCHAR uni022A
+ENCODING 554
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 35 1 0
+BITMAP
+01FF80
+01FF80
+01FF80
+000000
+01E780
+01E780
+01E780
+01E780
+000000
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni022B
+ENCODING 555
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 28 1 0
+BITMAP
+0FFC00
+0FFC00
+0FFC00
+000000
+1E3C00
+1E3C00
+1E3C00
+1E3C00
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni022C
+ENCODING 556
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 34 1 0
+BITMAP
+01FF80
+01FF80
+01FF80
+000000
+0078C0
+00FFC0
+01FF80
+018F00
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni022D
+ENCODING 557
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 28 1 0
+BITMAP
+0FFC00
+0FFC00
+0FFC00
+000000
+078C00
+0FFC00
+1FF800
+18F000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni022E
+ENCODING 558
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 30 1 0
+BITMAP
+003C00
+003C00
+003C00
+003C00
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni022F
+ENCODING 559
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 23 1 0
+BITMAP
+01E000
+01E000
+01E000
+01E000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni0230
+ENCODING 560
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 34 1 0
+BITMAP
+01FF80
+01FF80
+01FF80
+000000
+003C00
+003C00
+003C00
+003C00
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni0231
+ENCODING 561
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 27 1 0
+BITMAP
+0FFC00
+0FFC00
+0FFC00
+000000
+01E000
+01E000
+01E000
+01E000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni0232
+ENCODING 562
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 29 1 0
+BITMAP
+07FE00
+07FE00
+07FE00
+000000
+FC03F0
+FC03E0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR uni0233
+ENCODING 563
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 29 1 -7
+BITMAP
+1FF8
+1FF8
+1FF8
+0000
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR uni0250
+ENCODING 592
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 18 1 0
+BITMAP
+F1F8
+F7FC
+FFFE
+FFFE
+FC3E
+F81E
+F03E
+F03E
+F1FC
+FFF8
+FFE0
+FE00
+F03E
+F03E
+F87C
+7FFC
+7FF8
+1FE0
+ENDCHAR
+STARTCHAR uni0254
+ENCODING 596
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 18 1 0
+BITMAP
+0FC0
+3FF0
+7FF8
+7FF8
+F87C
+F83C
+F01E
+001E
+001E
+001E
+001E
+F01E
+F03E
+F87C
+7FFC
+3FF8
+3FF0
+0FC0
+ENDCHAR
+STARTCHAR uni0258
+ENCODING 600
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 18 1 0
+BITMAP
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F80F
+FFFF
+FFFF
+FFFF
+000F
+000F
+781F
+7C3E
+3FFE
+3FFC
+0FF8
+03E0
+ENDCHAR
+STARTCHAR uni0259
+ENCODING 601
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 18 1 0
+BITMAP
+03E0
+0FF8
+3FFC
+3FFE
+7C3E
+781F
+000F
+000F
+FFFF
+FFFF
+FFFF
+F80F
+F81F
+7C3E
+7FFE
+3FFC
+1FF8
+07E0
+ENDCHAR
+STARTCHAR uni025F
+ENCODING 607
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 25 0 -7
+BITMAP
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+FFC0
+FFC0
+FFC0
+1E00
+1E00
+1E00
+3E00
+FE00
+FC00
+F800
+ENDCHAR
+STARTCHAR uni0265
+ENCODING 613
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 -7
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F03E
+F03E
+F87E
+7FFE
+7FFE
+3FDE
+0F1E
+001E
+001E
+001E
+001E
+001E
+001E
+001E
+ENDCHAR
+STARTCHAR uni0275
+ENCODING 629
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 18 1 0
+BITMAP
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+FFFF80
+FFFF80
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni0279
+ENCODING 633
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 18 2 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+07C0
+07C0
+0FC0
+FFC0
+FFC0
+FBC0
+F3C0
+C3C0
+ENDCHAR
+STARTCHAR uni0287
+ENCODING 647
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 22 1 0
+BITMAP
+F800
+FC00
+FE00
+FE00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+FF80
+FF80
+FF80
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR uni0288
+ENCODING 648
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 29 1 -7
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F00
+3F00
+1F00
+1F00
+ENDCHAR
+STARTCHAR uni0289
+ENCODING 649
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 18 2 0
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+FFFE
+FFFE
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni028C
+ENCODING 652
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 17 18 0 0
+BITMAP
+03E000
+03E000
+07F000
+07F000
+07F000
+0F7800
+0F7800
+0F7800
+1E3C00
+1E3C00
+1E3C00
+3E3E00
+3C1E00
+3C1E00
+7C1F00
+7C1F00
+F80F80
+F80F80
+ENDCHAR
+STARTCHAR uni028D
+ENCODING 653
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 18 0 0
+BITMAP
+0780F000
+0780F000
+0FC1F800
+0FC1F800
+0FC1F800
+1FE3FC00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+3CF79E00
+3C771E00
+3C7F1E00
+3C7F1E00
+7C7F1F00
+7C3E1F00
+783E0F00
+F83E0F80
+F83E0F80
+ENDCHAR
+STARTCHAR uni028E
+ENCODING 654
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 25 1 0
+BITMAP
+003C
+00FC
+00FC
+01FC
+01F0
+03E0
+03E0
+03E0
+07E0
+07E0
+07F0
+0FF0
+0FF0
+0FF8
+1E78
+1E78
+1E7C
+3E7C
+3C3C
+3C3E
+7C3E
+7C1E
+781F
+F81F
+F81F
+ENDCHAR
+STARTCHAR uni029E
+ENCODING 670
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 15 25 2 -7
+BITMAP
+F81E
+F81E
+7C1E
+3C1E
+3E1E
+1F1E
+1F3E
+0FFE
+0FFE
+07FE
+07FE
+03FE
+07DE
+0F9E
+1F1E
+3E1E
+7C1E
+F81E
+001E
+001E
+001E
+001E
+001E
+001E
+001E
+ENDCHAR
+STARTCHAR uni02BB
+ENCODING 699
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 9 2 16
+BITMAP
+30
+60
+C0
+C0
+C0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR afii57929
+ENCODING 700
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 9 2 16
+BITMAP
+F0
+F0
+F0
+F0
+30
+30
+30
+60
+C0
+ENDCHAR
+STARTCHAR afii64937
+ENCODING 701
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 9 2 16
+BITMAP
+F0
+F0
+F0
+F0
+C0
+C0
+C0
+60
+30
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 710
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 5 0 20
+BITMAP
+0C00
+1E00
+3F00
+7380
+E1C0
+ENDCHAR
+STARTCHAR caron
+ENCODING 711
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 5 0 20
+BITMAP
+E1C0
+7380
+3F00
+1E00
+0C00
+ENDCHAR
+STARTCHAR uni02C8
+ENCODING 712
+SWIDTH 238 0
+DWIDTH 8 0
+BBX 4 9 2 16
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR macron
+ENCODING 713
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 3 0 21
+BITMAP
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni02CA
+ENCODING 714
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 6 5 4 20
+BITMAP
+3C
+78
+70
+E0
+E0
+ENDCHAR
+STARTCHAR uni02CB
+ENCODING 715
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 5 2 20
+BITMAP
+E0
+F0
+70
+78
+38
+ENDCHAR
+STARTCHAR uni02CD
+ENCODING 717
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 3 0 -4
+BITMAP
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni02CE
+ENCODING 718
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 5 2 -6
+BITMAP
+E0
+F0
+70
+78
+38
+ENDCHAR
+STARTCHAR uni02CF
+ENCODING 719
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 6 5 4 -6
+BITMAP
+3C
+78
+70
+E0
+E0
+ENDCHAR
+STARTCHAR breve
+ENCODING 728
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 5 1 20
+BITMAP
+8080
+C180
+7F00
+7F00
+1C00
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 729
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 4 4 3 21
+BITMAP
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR ring
+ENCODING 730
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 6 3 19
+BITMAP
+70
+D8
+88
+88
+D8
+70
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 731
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 7 8 1 -7
+BITMAP
+70
+60
+E0
+E0
+E0
+FE
+7E
+3C
+ENDCHAR
+STARTCHAR tilde
+ENCODING 732
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 11 4 0 20
+BITMAP
+3C60
+7FE0
+FFC0
+C780
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 733
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 11 5 -1 20
+BITMAP
+38E0
+79E0
+71C0
+E380
+C300
+ENDCHAR
+STARTCHAR uni02EE
+ENCODING 750
+SWIDTH 500 0
+DWIDTH 16 0
+BBX 12 8 2 17
+BITMAP
+F0F0
+F0F0
+F0F0
+F0F0
+3030
+3030
+6060
+E0C0
+ENDCHAR
+STARTCHAR uni037E
+ENCODING 894
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 23 3 -6
+BITMAP
+F8
+F8
+F8
+F8
+F8
+00
+00
+00
+00
+00
+00
+00
+F8
+F8
+F8
+F8
+F8
+18
+18
+38
+70
+E0
+80
+ENDCHAR
+STARTCHAR tonos
+ENCODING 900
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 6 5 4 20
+BITMAP
+3C
+78
+70
+E0
+E0
+ENDCHAR
+STARTCHAR dieresistonos
+ENCODING 901
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 10 0 21
+BITMAP
+0780
+0F00
+0E00
+1C00
+1C00
+0000
+F3C0
+F3C0
+F3C0
+F3C0
+ENDCHAR
+STARTCHAR anoteleia
+ENCODING 903
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 5 2 11
+BITMAP
+60
+F0
+F0
+F0
+60
+ENDCHAR
+STARTCHAR mu
+ENCODING 956
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 25 2 -7
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+FFFE
+FFDE
+F79E
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR uni1E00
+ENCODING 7680
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 32 0 -7
+BITMAP
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+000000
+003800
+006C00
+004400
+004400
+006C00
+003800
+ENDCHAR
+STARTCHAR uni1E01
+ENCODING 7681
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 25 1 -7
+BITMAP
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+0000
+0380
+06C0
+0440
+0440
+06C0
+0380
+ENDCHAR
+STARTCHAR uni1E02
+ENCODING 7682
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 3 0
+BITMAP
+01E000
+01E000
+01E000
+01E000
+000000
+FFFC00
+FFFF00
+FFFF80
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80F80
+FFFF00
+FFFF00
+FFFF80
+FFFFC0
+F807C0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807E0
+FFFFC0
+FFFFC0
+FFFF80
+FFFE00
+ENDCHAR
+STARTCHAR uni1E03
+ENCODING 7683
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 2 0
+BITMAP
+3C00
+3C00
+3C00
+3C00
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F3F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81F
+F01F
+F00F
+F00F
+F00F
+F00F
+F01F
+F01F
+F83E
+FFFE
+FFFC
+F7F8
+F1F0
+ENDCHAR
+STARTCHAR uni1E04
+ENCODING 7684
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 3 -5
+BITMAP
+FFFC00
+FFFF00
+FFFF80
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80F80
+FFFF00
+FFFF00
+FFFF80
+FFFFC0
+F807C0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807E0
+FFFFC0
+FFFFC0
+FFFF80
+FFFE00
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR uni1E05
+ENCODING 7685
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 2 -5
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F3F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81F
+F01F
+F00F
+F00F
+F00F
+F00F
+F01F
+F01F
+F83E
+FFFE
+FFFC
+F7F8
+F1F0
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1E06
+ENCODING 7686
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 29 3 -4
+BITMAP
+FFFC00
+FFFF00
+FFFF80
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80F80
+FFFF00
+FFFF00
+FFFF80
+FFFFC0
+F807C0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807E0
+FFFFC0
+FFFFC0
+FFFF80
+FFFE00
+000000
+0FFC00
+0FFC00
+0FFC00
+ENDCHAR
+STARTCHAR uni1E07
+ENCODING 7687
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 29 2 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F3F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81F
+F01F
+F00F
+F00F
+F00F
+F00F
+F01F
+F01F
+F83E
+FFFE
+FFFC
+F7F8
+F1F0
+0000
+1FF8
+1FF8
+1FF8
+ENDCHAR
+STARTCHAR uni1E08
+ENCODING 7688
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 21 38 1 -7
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+01FE00
+07FF80
+0FFFC0
+1FFFE0
+3F87F0
+3E01F0
+7C01F0
+7C00F8
+7C00F8
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+7C00F8
+7C00F8
+7E01F8
+3E01F0
+3F87F0
+1FFFE0
+0FFFC0
+07FF80
+01FC00
+006000
+006000
+00F800
+001C00
+001C00
+01F800
+01F000
+ENDCHAR
+STARTCHAR uni1E09
+ENCODING 7689
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 31 1 -7
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+07E0
+1FF8
+3FFC
+3FFC
+7C3E
+781E
+F81E
+F000
+F000
+F000
+F000
+F81E
+F81E
+7C3E
+7FFC
+3FF8
+1FF8
+07E0
+0300
+0300
+07C0
+00E0
+00E0
+0FC0
+0F80
+ENDCHAR
+STARTCHAR uni1E0A
+ENCODING 7690
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 30 2 0
+BITMAP
+01E000
+01E000
+01E000
+01E000
+000000
+FFF800
+FFFF00
+FFFF80
+FFFFC0
+F80FE0
+F803E0
+F803F0
+F801F0
+F801F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F801F8
+F801F0
+F803F0
+F803E0
+F80FE0
+FFFFC0
+FFFF80
+FFFF00
+FFF800
+ENDCHAR
+STARTCHAR uni1E0B
+ENCODING 7691
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 1 0
+BITMAP
+003C
+003C
+003C
+003C
+0000
+000F
+000F
+000F
+000F
+000F
+000F
+000F
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FEF
+1FEF
+0F8F
+ENDCHAR
+STARTCHAR uni1E0C
+ENCODING 7692
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 30 2 -5
+BITMAP
+FFF800
+FFFF00
+FFFF80
+FFFFC0
+F80FE0
+F803E0
+F803F0
+F801F0
+F801F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F801F8
+F801F0
+F803F0
+F803E0
+F80FE0
+FFFFC0
+FFFF80
+FFFF00
+FFF800
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR uni1E0D
+ENCODING 7693
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 1 -5
+BITMAP
+000F
+000F
+000F
+000F
+000F
+000F
+000F
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FEF
+1FEF
+0F8F
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1E0E
+ENCODING 7694
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 29 2 -4
+BITMAP
+FFF800
+FFFF00
+FFFF80
+FFFFC0
+F80FE0
+F803E0
+F803F0
+F801F0
+F801F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F801F8
+F801F0
+F803F0
+F803E0
+F80FE0
+FFFFC0
+FFFF80
+FFFF00
+FFF800
+000000
+0FFC00
+0FFC00
+0FFC00
+ENDCHAR
+STARTCHAR uni1E0F
+ENCODING 7695
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 29 1 -4
+BITMAP
+000F
+000F
+000F
+000F
+000F
+000F
+000F
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FEF
+1FEF
+0F8F
+0000
+1FF8
+1FF8
+1FF8
+ENDCHAR
+STARTCHAR uni1E10
+ENCODING 7696
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 32 2 -7
+BITMAP
+FFF800
+FFFF00
+FFFF80
+FFFFC0
+F80FE0
+F803E0
+F803F0
+F801F0
+F801F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F801F8
+F801F0
+F803F0
+F803E0
+F80FE0
+FFFFC0
+FFFF80
+FFFF00
+FFF800
+00C000
+00C000
+01F000
+007800
+003800
+03F000
+03E000
+ENDCHAR
+STARTCHAR uni1E11
+ENCODING 7697
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 32 1 -7
+BITMAP
+000F
+000F
+000F
+000F
+000F
+000F
+000F
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FEF
+1FEF
+0F8F
+0180
+0180
+03E0
+00F0
+0070
+07E0
+07C0
+ENDCHAR
+STARTCHAR uni1E12
+ENCODING 7698
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 31 2 -6
+BITMAP
+FFF800
+FFFF00
+FFFF80
+FFFFC0
+F80FE0
+F803E0
+F803F0
+F801F0
+F801F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F800F8
+F801F8
+F801F0
+F803F0
+F803E0
+F80FE0
+FFFFC0
+FFFF80
+FFFF00
+FFF800
+000000
+00C000
+01E000
+03F000
+073800
+0E1C00
+ENDCHAR
+STARTCHAR uni1E13
+ENCODING 7699
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 1 -6
+BITMAP
+000F
+000F
+000F
+000F
+000F
+000F
+000F
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F00F
+F00F
+F00F
+F00F
+F00F
+F00F
+F81F
+7C3F
+7FFF
+3FEF
+1FEF
+0F8F
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+ENDCHAR
+STARTCHAR uni1E14
+ENCODING 7700
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 35 2 0
+BITMAP
+038000
+03C000
+01C000
+01E000
+00E000
+000000
+1FF800
+1FF800
+1FF800
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni1E15
+ENCODING 7701
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 28 1 0
+BITMAP
+0700
+0780
+0380
+03C0
+01C0
+0000
+1FF8
+1FF8
+1FF8
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni1E16
+ENCODING 7702
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 35 2 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+1FF800
+1FF800
+1FF800
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni1E17
+ENCODING 7703
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 28 1 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+1FF8
+1FF8
+1FF8
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni1E18
+ENCODING 7704
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 -6
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+000000
+018000
+03C000
+07E000
+0E7000
+1C3800
+ENDCHAR
+STARTCHAR uni1E19
+ENCODING 7705
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 24 1 -6
+BITMAP
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+ENDCHAR
+STARTCHAR uni1E1A
+ENCODING 7706
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 30 2 -5
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+000000
+0F1800
+1FF800
+3FF000
+31E000
+ENDCHAR
+STARTCHAR uni1E1B
+ENCODING 7707
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 23 1 -5
+BITMAP
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+0000
+0F18
+1FF8
+3FF0
+31E0
+ENDCHAR
+STARTCHAR uni1E1C
+ENCODING 7708
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 38 2 -7
+BITMAP
+101000
+183000
+0FE000
+0FE000
+038000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+018000
+018000
+03E000
+00F000
+007000
+07E000
+07C000
+ENDCHAR
+STARTCHAR uni1E1D
+ENCODING 7709
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 31 1 -7
+BITMAP
+0808
+0C18
+07F0
+07F0
+01C0
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+0180
+0180
+03E0
+00F0
+0070
+07E0
+07C0
+ENDCHAR
+STARTCHAR uni1E1E
+ENCODING 7710
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 2 0
+BITMAP
+0780
+0780
+0780
+0780
+0000
+FFFF
+FFFF
+FFFF
+FFFF
+F800
+F800
+F800
+F800
+F800
+F800
+FFFE
+FFFE
+FFFE
+FFFE
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+ENDCHAR
+STARTCHAR uni1E1F
+ENCODING 7711
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 30 0 0
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0000
+07C0
+0FC0
+1FC0
+1F00
+1E00
+1E00
+1E00
+FFC0
+FFC0
+FFC0
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR uni1E20
+ENCODING 7712
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 22 29 1 0
+BITMAP
+03FF00
+03FF00
+03FF00
+000000
+00FF00
+03FFC0
+0FFFE0
+1FFFF0
+1FC3F8
+3F00F8
+7E007C
+7C007C
+FC0000
+F80000
+F80000
+F80000
+F80FFC
+F80FFC
+F80FFC
+F80FFC
+FC007C
+7C007C
+7E007C
+7E00FC
+3F83FC
+3FFFFC
+1FFFDC
+07FF9C
+03FE1C
+ENDCHAR
+STARTCHAR uni1E21
+ENCODING 7713
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 29 1 -7
+BITMAP
+0FFC
+0FFC
+0FFC
+0000
+0FCF
+1FEF
+3FFF
+7FFF
+7C3F
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+7C3F
+7FFF
+3FFF
+1FEF
+0FCF
+000F
+F81F
+F81F
+7E7E
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR uni1E22
+ENCODING 7714
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 30 2 0
+BITMAP
+00F000
+00F000
+00F000
+00F000
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+ENDCHAR
+STARTCHAR uni1E23
+ENCODING 7715
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 30 2 0
+BITMAP
+3C00
+3C00
+3C00
+3C00
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F1E0
+F7F8
+FFFC
+FFFC
+FC3E
+F81E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR uni1E24
+ENCODING 7716
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 30 2 -5
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1E25
+ENCODING 7717
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 30 2 -5
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F1E0
+F7F8
+FFFC
+FFFC
+FC3E
+F81E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1E26
+ENCODING 7718
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 30 2 0
+BITMAP
+079E00
+079E00
+079E00
+079E00
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+ENDCHAR
+STARTCHAR uni1E27
+ENCODING 7719
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 1 0
+BITMAP
+F3C0
+F3C0
+F3C0
+F3C0
+0000
+7800
+7800
+7800
+7800
+7800
+7800
+7800
+78F0
+7BFC
+7FFE
+7FFE
+7E1F
+7C0F
+7C0F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+780F
+ENDCHAR
+STARTCHAR uni1E28
+ENCODING 7720
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 32 2 -7
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F8C3E0
+00C000
+00C000
+01F000
+007800
+003800
+03F000
+03E000
+ENDCHAR
+STARTCHAR uni1E29
+ENCODING 7721
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 32 2 -7
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F1E0
+F7F8
+FFFC
+FFFC
+FC3E
+F81E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F31E
+0300
+0300
+07C0
+01E0
+00E0
+0FC0
+0F80
+ENDCHAR
+STARTCHAR uni1E2A
+ENCODING 7722
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 19 31 2 -6
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+000000
+040400
+060C00
+03F800
+03F800
+00E000
+ENDCHAR
+STARTCHAR uni1E2B
+ENCODING 7723
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 31 2 -6
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F1E0
+F7F8
+FFFC
+FFFC
+FC3E
+F81E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+0000
+1010
+1830
+0FE0
+0FE0
+0380
+ENDCHAR
+STARTCHAR uni1E2C
+ENCODING 7724
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 11 30 -1 -5
+BITMAP
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+1F00
+0000
+3C60
+7FE0
+FFC0
+C780
+ENDCHAR
+STARTCHAR uni1E2D
+ENCODING 7725
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 11 30 -2 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0000
+0000
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0000
+3C60
+7FE0
+FFC0
+C780
+ENDCHAR
+STARTCHAR uni1E2E
+ENCODING 7726
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 37 0 0
+BITMAP
+0780
+0F00
+0E00
+1C00
+1C00
+0000
+F3C0
+F3C0
+F3C0
+F3C0
+0000
+0000
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+3E00
+ENDCHAR
+STARTCHAR uni1E2F
+ENCODING 7727
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 30 -1 0
+BITMAP
+0780
+0F00
+0E00
+1C00
+1C00
+0000
+F3C0
+F3C0
+F3C0
+F3C0
+0000
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR uni1E30
+ENCODING 7728
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 31 2 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFE000
+FFF000
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+ENDCHAR
+STARTCHAR uni1E31
+ENCODING 7729
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 15 31 2 0
+BITMAP
+0F00
+1E00
+1C00
+3800
+3800
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F03E
+F07C
+F0F8
+F1F0
+F3E0
+F7C0
+FF80
+FFC0
+FFC0
+FFE0
+FFE0
+F9F0
+F1F0
+F0F8
+F078
+F07C
+F03E
+F03E
+ENDCHAR
+STARTCHAR uni1E32
+ENCODING 7730
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 30 2 -5
+BITMAP
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFE000
+FFF000
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1E33
+ENCODING 7731
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 15 30 2 -5
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F03E
+F07C
+F0F8
+F1F0
+F3E0
+F7C0
+FF80
+FFC0
+FFC0
+FFE0
+FFE0
+F9F0
+F1F0
+F0F8
+F078
+F07C
+F03E
+F03E
+0000
+0780
+0780
+0780
+0780
+ENDCHAR
+STARTCHAR uni1E34
+ENCODING 7732
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 29 2 -4
+BITMAP
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFE000
+FFF000
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+000000
+07FE00
+07FE00
+07FE00
+ENDCHAR
+STARTCHAR uni1E35
+ENCODING 7733
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 15 29 2 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F03E
+F07C
+F0F8
+F1F0
+F3E0
+F7C0
+FF80
+FFC0
+FFC0
+FFE0
+FFE0
+F9F0
+F1F0
+F0F8
+F078
+F07C
+F03E
+F03E
+0000
+3FF0
+3FF0
+3FF0
+ENDCHAR
+STARTCHAR uni1E36
+ENCODING 7734
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 2 -5
+BITMAP
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+FFFF
+FFFF
+FFFF
+FFFF
+0000
+0780
+0780
+0780
+0780
+ENDCHAR
+STARTCHAR uni1E37
+ENCODING 7735
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 30 2 -5
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+00
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR uni1E38
+ENCODING 7736
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 34 1 -5
+BITMAP
+FFC000
+FFC000
+FFC000
+000000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7C0000
+7FFF80
+7FFF80
+7FFF80
+7FFF80
+000000
+03C000
+03C000
+03C000
+03C000
+ENDCHAR
+STARTCHAR uni1E39
+ENCODING 7737
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 34 -1 -5
+BITMAP
+FFC0
+FFC0
+FFC0
+0000
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+0000
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR uni1E3A
+ENCODING 7738
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 29 2 -4
+BITMAP
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+FFFF
+FFFF
+FFFF
+FFFF
+0000
+3FF0
+3FF0
+3FF0
+ENDCHAR
+STARTCHAR uni1E3B
+ENCODING 7739
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 29 -1 -4
+BITMAP
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+0000
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1E3C
+ENCODING 7740
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 2 -6
+BITMAP
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+F800
+FFFF
+FFFF
+FFFF
+FFFF
+0000
+0300
+0780
+0FC0
+1CE0
+3870
+ENDCHAR
+STARTCHAR uni1E3D
+ENCODING 7741
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 10 31 -1 -6
+BITMAP
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+0000
+0C00
+1E00
+3F00
+7380
+E1C0
+ENDCHAR
+STARTCHAR uni1E3E
+ENCODING 7742
+SWIDTH 833 0
+DWIDTH 27 0
+BBX 23 31 2 0
+BITMAP
+000F00
+001E00
+001C00
+003800
+003800
+000000
+FE00FE
+FE00FE
+FF01FE
+FF01FE
+FF01FE
+FF01FE
+FF83FE
+FF83FE
+FB83BE
+FB83BE
+FBC7BE
+FBC7BE
+FBC7BE
+F9C73E
+F9EF3E
+F9EF3E
+F9EF3E
+F9EF3E
+F8EE3E
+F8FE3E
+F8FE3E
+F8FE3E
+F87C3E
+F87C3E
+F87C3E
+ENDCHAR
+STARTCHAR uni1E3F
+ENCODING 7743
+SWIDTH 889 0
+DWIDTH 30 0
+BBX 24 24 2 0
+BITMAP
+000F00
+001E00
+001C00
+003800
+003800
+000000
+F1E0F8
+F7FBFE
+FFFFFE
+FFFFFF
+FC7F1F
+F83E0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+ENDCHAR
+STARTCHAR uni1E40
+ENCODING 7744
+SWIDTH 833 0
+DWIDTH 27 0
+BBX 23 30 2 0
+BITMAP
+003C00
+003C00
+003C00
+003C00
+000000
+FE00FE
+FE00FE
+FF01FE
+FF01FE
+FF01FE
+FF01FE
+FF83FE
+FF83FE
+FB83BE
+FB83BE
+FBC7BE
+FBC7BE
+FBC7BE
+F9C73E
+F9EF3E
+F9EF3E
+F9EF3E
+F9EF3E
+F8EE3E
+F8FE3E
+F8FE3E
+F8FE3E
+F87C3E
+F87C3E
+F87C3E
+ENDCHAR
+STARTCHAR uni1E41
+ENCODING 7745
+SWIDTH 889 0
+DWIDTH 30 0
+BBX 24 23 2 0
+BITMAP
+003C00
+003C00
+003C00
+003C00
+000000
+F1E0F8
+F7FBFE
+FFFFFE
+FFFFFF
+FC7F1F
+F83E0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+ENDCHAR
+STARTCHAR uni1E42
+ENCODING 7746
+SWIDTH 833 0
+DWIDTH 27 0
+BBX 23 30 2 -5
+BITMAP
+FE00FE
+FE00FE
+FF01FE
+FF01FE
+FF01FE
+FF01FE
+FF83FE
+FF83FE
+FB83BE
+FB83BE
+FBC7BE
+FBC7BE
+FBC7BE
+F9C73E
+F9EF3E
+F9EF3E
+F9EF3E
+F9EF3E
+F8EE3E
+F8FE3E
+F8FE3E
+F8FE3E
+F87C3E
+F87C3E
+F87C3E
+000000
+003C00
+003C00
+003C00
+003C00
+ENDCHAR
+STARTCHAR uni1E43
+ENCODING 7747
+SWIDTH 889 0
+DWIDTH 30 0
+BBX 24 23 2 -5
+BITMAP
+F1E0F8
+F7FBFE
+FFFFFE
+FFFFFF
+FC7F1F
+F83E0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+000000
+003C00
+003C00
+003C00
+003C00
+ENDCHAR
+STARTCHAR uni1E44
+ENCODING 7748
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 0
+BITMAP
+01E000
+01E000
+01E000
+01E000
+000000
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR uni1E45
+ENCODING 7749
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 23 2 0
+BITMAP
+0780
+0780
+0780
+0780
+0000
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+ENDCHAR
+STARTCHAR uni1E46
+ENCODING 7750
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 -5
+BITMAP
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1E47
+ENCODING 7751
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 23 2 -5
+BITMAP
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1E48
+ENCODING 7752
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 29 2 -4
+BITMAP
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+000000
+07FE00
+07FE00
+07FE00
+ENDCHAR
+STARTCHAR uni1E49
+ENCODING 7753
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 22 2 -4
+BITMAP
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+0000
+1FF8
+1FF8
+1FF8
+ENDCHAR
+STARTCHAR uni1E4A
+ENCODING 7754
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 -6
+BITMAP
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FF03E0
+FF83E0
+FFC3E0
+FBC3E0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+F8FBE0
+F87BE0
+F83FE0
+F83FE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+000000
+006000
+00F000
+01F800
+039C00
+070E00
+ENDCHAR
+STARTCHAR uni1E4B
+ENCODING 7755
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 -6
+BITMAP
+F1F0
+F7FC
+FFFC
+FFFE
+FC3E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+ENDCHAR
+STARTCHAR uni1E4C
+ENCODING 7756
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 36 1 0
+BITMAP
+000F00
+001E00
+001C00
+003800
+003800
+000000
+0078C0
+00FFC0
+01FF80
+018F00
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni1E4D
+ENCODING 7757
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 30 1 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+078C00
+0FFC00
+1FF800
+18F000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E4E
+ENCODING 7758
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 35 1 0
+BITMAP
+01E780
+01E780
+01E780
+01E780
+000000
+0078C0
+00FFC0
+01FF80
+018F00
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni1E4F
+ENCODING 7759
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 29 1 0
+BITMAP
+0F3C00
+0F3C00
+0F3C00
+0F3C00
+000000
+078C00
+0FFC00
+1FF800
+18F000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E50
+ENCODING 7760
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 35 1 0
+BITMAP
+007000
+007800
+003800
+003C00
+001C00
+000000
+01FF80
+01FF80
+01FF80
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni1E51
+ENCODING 7761
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 28 1 0
+BITMAP
+038000
+03C000
+01C000
+01E000
+00E000
+000000
+0FFC00
+0FFC00
+0FFC00
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E52
+ENCODING 7762
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 35 1 0
+BITMAP
+000F00
+001E00
+001C00
+003800
+003800
+000000
+01FF80
+01FF80
+01FF80
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni1E53
+ENCODING 7763
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 28 1 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+0FFC00
+0FFC00
+0FFC00
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1E54
+ENCODING 7764
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 31 2 0
+BITMAP
+00F000
+01E000
+01C000
+038000
+038000
+000000
+FFF800
+FFFE00
+FFFF00
+FFFF80
+F81F80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80FC0
+F81F80
+FFFF80
+FFFF00
+FFFC00
+FFF000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+ENDCHAR
+STARTCHAR uni1E55
+ENCODING 7765
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 31 2 -7
+BITMAP
+01E0
+03C0
+0380
+0700
+0700
+0000
+F1F0
+F7F8
+FFFC
+FFFE
+FC3E
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+FC3E
+FFFE
+FFFC
+F7F8
+F1F0
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR uni1E56
+ENCODING 7766
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 30 2 0
+BITMAP
+03C000
+03C000
+03C000
+03C000
+000000
+FFF800
+FFFE00
+FFFF00
+FFFF80
+F81F80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F80FC0
+F81F80
+FFFF80
+FFFF00
+FFFC00
+FFF000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+ENDCHAR
+STARTCHAR uni1E57
+ENCODING 7767
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 30 2 -7
+BITMAP
+0780
+0780
+0780
+0780
+0000
+F1F0
+F7F8
+FFFC
+FFFE
+FC3E
+F81F
+F81F
+F00F
+F00F
+F00F
+F00F
+F81F
+F81F
+FC3E
+FFFE
+FFFC
+F7F8
+F1F0
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR uni1E58
+ENCODING 7768
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 0
+BITMAP
+01E000
+01E000
+01E000
+01E000
+000000
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR uni1E59
+ENCODING 7769
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 23 2 0
+BITMAP
+1E00
+1E00
+1E00
+1E00
+0000
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR uni1E5A
+ENCODING 7770
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 -5
+BITMAP
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR uni1E5B
+ENCODING 7771
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 23 2 -5
+BITMAP
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+7800
+7800
+7800
+7800
+ENDCHAR
+STARTCHAR uni1E5C
+ENCODING 7772
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 34 2 -5
+BITMAP
+0FFC00
+0FFC00
+0FFC00
+000000
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR uni1E5D
+ENCODING 7773
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 10 27 2 -5
+BITMAP
+FFC0
+FFC0
+FFC0
+0000
+F0C0
+F3C0
+F7C0
+FFC0
+FFC0
+FC00
+F800
+F800
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+7800
+7800
+7800
+7800
+ENDCHAR
+STARTCHAR uni1E5E
+ENCODING 7774
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 29 2 -4
+BITMAP
+FFFE00
+FFFF80
+FFFFC0
+FFFFC0
+F807E0
+F803E0
+F803E0
+F803E0
+F803E0
+F807C0
+F80FC0
+FFFF80
+FFFF00
+FFFF00
+FFFF80
+F80FC0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807C0
+F807E0
+F803E0
+000000
+0FFC00
+0FFC00
+0FFC00
+ENDCHAR
+STARTCHAR uni1E5F
+ENCODING 7775
+SWIDTH 389 0
+DWIDTH 13 0
+BBX 12 22 0 -4
+BITMAP
+3C30
+3CF0
+3DF0
+3FF0
+3FF0
+3F00
+3E00
+3E00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+0000
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1E60
+ENCODING 7776
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 30 1 0
+BITMAP
+00F000
+00F000
+00F000
+00F000
+000000
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+ENDCHAR
+STARTCHAR uni1E61
+ENCODING 7777
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 23 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR uni1E62
+ENCODING 7778
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 30 1 -5
+BITMAP
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1E63
+ENCODING 7779
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 23 1 -5
+BITMAP
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1E64
+ENCODING 7780
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 36 1 0
+BITMAP
+00F000
+00F000
+00F000
+00F000
+000000
+003C00
+007800
+007000
+00E000
+00E000
+000000
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+ENDCHAR
+STARTCHAR uni1E65
+ENCODING 7781
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 29 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+00F0
+01E0
+01C0
+0380
+0380
+0000
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+ENDCHAR
+STARTCHAR uni1E66
+ENCODING 7782
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 32 2 0
+BITMAP
+03C000
+03C000
+03C000
+03C000
+000000
+1C3800
+0E7000
+07E000
+03C000
+018000
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+FC3F00
+F80F00
+FE0000
+7FC000
+7FFC00
+1FFF00
+01FF80
+001FC0
+F007C0
+F007C0
+F807C0
+FC1F80
+7FFF80
+3FFF00
+1FFE00
+07F000
+ENDCHAR
+STARTCHAR uni1E67
+ENCODING 7783
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 30 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+0000
+0FF0
+1FFC
+3FFE
+7E7E
+781E
+781E
+7F00
+7FF0
+3FFC
+1FFE
+03FF
+003F
+F81F
+F81F
+7F3E
+7FFE
+3FFC
+0FF8
+ENDCHAR
+STARTCHAR uni1E68
+ENCODING 7784
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 19 35 1 -5
+BITMAP
+00F000
+00F000
+00F000
+00F000
+000000
+03F800
+0FFE00
+1FFF00
+3FFF80
+3E1F80
+7C07C0
+7807C0
+7803C0
+7C0000
+7F0000
+3FF000
+3FFE00
+1FFF80
+03FFC0
+003FC0
+0007E0
+0003E0
+F803E0
+F803E0
+7C03E0
+7E0FC0
+3FFFC0
+1FFF80
+0FFF00
+03F800
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1E69
+ENCODING 7785
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 28 1 -5
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+07F0
+1FFC
+3FFE
+7C3E
+781F
+781F
+7C00
+7FC0
+3FF8
+0FFE
+03FF
+003F
+F80F
+F80F
+7C1F
+7FFE
+3FFC
+0FF0
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1E6A
+ENCODING 7786
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 30 0 0
+BITMAP
+00F000
+00F000
+00F000
+00F000
+000000
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR uni1E6B
+ENCODING 7787
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 27 1 0
+BITMAP
+3C00
+3C00
+3C00
+3C00
+0000
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+ENDCHAR
+STARTCHAR uni1E6C
+ENCODING 7788
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 30 0 -5
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1E6D
+ENCODING 7789
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 27 1 -5
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+0000
+1E00
+1E00
+1E00
+1E00
+ENDCHAR
+STARTCHAR uni1E6E
+ENCODING 7790
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 29 0 -4
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+000000
+07FE00
+07FE00
+07FE00
+ENDCHAR
+STARTCHAR uni1E6F
+ENCODING 7791
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 26 1 -4
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+0000
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR uni1E70
+ENCODING 7792
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 31 0 -6
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+000000
+006000
+00F000
+01F800
+039C00
+070E00
+ENDCHAR
+STARTCHAR uni1E71
+ENCODING 7793
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 28 1 -6
+BITMAP
+3C00
+3C00
+3C00
+3C00
+FF80
+FF80
+FF80
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3C00
+3F80
+3F80
+1F80
+0F80
+0000
+0C00
+1E00
+3F00
+7380
+E1C0
+ENDCHAR
+STARTCHAR uni1E72
+ENCODING 7794
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 -5
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+000000
+079E00
+079E00
+079E00
+079E00
+ENDCHAR
+STARTCHAR uni1E73
+ENCODING 7795
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 23 2 -5
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+0000
+1E78
+1E78
+1E78
+1E78
+ENDCHAR
+STARTCHAR uni1E74
+ENCODING 7796
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 -5
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+000000
+03C600
+07FE00
+0FFC00
+0C7800
+ENDCHAR
+STARTCHAR uni1E75
+ENCODING 7797
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 23 2 -5
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+0000
+0F18
+1FF8
+3FF0
+31E0
+ENDCHAR
+STARTCHAR uni1E76
+ENCODING 7798
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 31 2 -6
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+000000
+006000
+00F000
+01F800
+039C00
+070E00
+ENDCHAR
+STARTCHAR uni1E77
+ENCODING 7799
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 24 2 -6
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+ENDCHAR
+STARTCHAR uni1E78
+ENCODING 7800
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 36 2 0
+BITMAP
+003C00
+007800
+007000
+00E000
+00E000
+000000
+03C600
+07FE00
+0FFC00
+0C7800
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni1E79
+ENCODING 7801
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 29 2 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+0F18
+1FF8
+3FF0
+31E0
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni1E7A
+ENCODING 7802
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 34 2 0
+BITMAP
+079E00
+079E00
+079E00
+079E00
+000000
+07FE00
+07FE00
+07FE00
+000000
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni1E7B
+ENCODING 7803
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 27 2 0
+BITMAP
+1E78
+1E78
+1E78
+1E78
+0000
+1FF8
+1FF8
+1FF8
+0000
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+ENDCHAR
+STARTCHAR uni1E7C
+ENCODING 7804
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 30 1 0
+BITMAP
+01E300
+03FF00
+07FE00
+063C00
+000000
+F801F0
+F801F0
+7C03E0
+7C03E0
+7C03E0
+3C03C0
+3E07C0
+3E07C0
+1E0780
+1F0F80
+1F0F80
+0F0F00
+0F0F00
+0F0F00
+079E00
+079E00
+079E00
+07FE00
+03FC00
+03FC00
+03FC00
+01F800
+01F800
+01F800
+00F000
+ENDCHAR
+STARTCHAR uni1E7D
+ENCODING 7805
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 17 23 0 0
+BITMAP
+078C00
+0FFC00
+1FF800
+18F000
+000000
+F80F80
+F80F80
+7C1F00
+7C1F00
+3C1E00
+3C1E00
+3E3E00
+1E3C00
+1E3C00
+1E3C00
+0F7800
+0F7800
+0F7800
+07F000
+07F000
+07F000
+03E000
+03E000
+ENDCHAR
+STARTCHAR uni1E7E
+ENCODING 7806
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 30 1 -5
+BITMAP
+F801F0
+F801F0
+7C03E0
+7C03E0
+7C03E0
+3C03C0
+3E07C0
+3E07C0
+1E0780
+1F0F80
+1F0F80
+0F0F00
+0F0F00
+0F0F00
+079E00
+079E00
+079E00
+07FE00
+03FC00
+03FC00
+03FC00
+01F800
+01F800
+01F800
+00F000
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1E7F
+ENCODING 7807
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 17 23 0 -5
+BITMAP
+F80F80
+F80F80
+7C1F00
+7C1F00
+3C1E00
+3C1E00
+3E3E00
+1E3C00
+1E3C00
+1E3C00
+0F7800
+0F7800
+0F7800
+07F000
+07F000
+07F000
+03E000
+03E000
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR Wgrave
+ENCODING 7808
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 31 1 0
+BITMAP
+000E0000
+000F0000
+00070000
+00078000
+00038000
+00000000
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7C3FC3E0
+7C3FC3E0
+3C3FC3E0
+3C39C3C0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1E70E780
+1E70E780
+0FF0FF00
+0FF0FF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+ENDCHAR
+STARTCHAR wgrave
+ENCODING 7809
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 24 0 0
+BITMAP
+00380000
+003C0000
+001C0000
+001E0000
+000E0000
+00000000
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+ENDCHAR
+STARTCHAR Wacute
+ENCODING 7810
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 31 1 0
+BITMAP
+0001E000
+0003C000
+00038000
+00070000
+00070000
+00000000
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7C3FC3E0
+7C3FC3E0
+3C3FC3E0
+3C39C3C0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1E70E780
+1E70E780
+0FF0FF00
+0FF0FF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+ENDCHAR
+STARTCHAR wacute
+ENCODING 7811
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 24 0 0
+BITMAP
+00078000
+000F0000
+000E0000
+001C0000
+001C0000
+00000000
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+ENDCHAR
+STARTCHAR Wdieresis
+ENCODING 7812
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 30 1 0
+BITMAP
+003CF000
+003CF000
+003CF000
+003CF000
+00000000
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7C3FC3E0
+7C3FC3E0
+3C3FC3E0
+3C39C3C0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1E70E780
+1E70E780
+0FF0FF00
+0FF0FF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+ENDCHAR
+STARTCHAR wdieresis
+ENCODING 7813
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 23 0 0
+BITMAP
+00F3C000
+00F3C000
+00F3C000
+00F3C000
+00000000
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+ENDCHAR
+STARTCHAR uni1E86
+ENCODING 7814
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 30 1 0
+BITMAP
+00078000
+00078000
+00078000
+00078000
+00000000
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7C3FC3E0
+7C3FC3E0
+3C3FC3E0
+3C39C3C0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1E70E780
+1E70E780
+0FF0FF00
+0FF0FF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+ENDCHAR
+STARTCHAR uni1E87
+ENCODING 7815
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 23 0 0
+BITMAP
+001E0000
+001E0000
+001E0000
+001E0000
+00000000
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+ENDCHAR
+STARTCHAR uni1E88
+ENCODING 7816
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 30 1 -5
+BITMAP
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7C3FC3E0
+7C3FC3E0
+3C3FC3E0
+3C39C3C0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1E70E780
+1E70E780
+0FF0FF00
+0FF0FF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+00000000
+000F0000
+000F0000
+000F0000
+000F0000
+ENDCHAR
+STARTCHAR uni1E89
+ENCODING 7817
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 23 0 -5
+BITMAP
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+00000000
+001E0000
+001E0000
+001E0000
+001E0000
+ENDCHAR
+STARTCHAR uni1E8A
+ENCODING 7818
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 30 1 0
+BITMAP
+00F000
+00F000
+00F000
+00F000
+000000
+FC03E0
+7E07E0
+7E07C0
+3F0FC0
+1F0F80
+1F9F00
+0F9F00
+0FBE00
+07FE00
+07FC00
+03FC00
+03F800
+01F800
+03F800
+03FC00
+07FC00
+07FE00
+0FBF00
+1F9F00
+1F1F80
+3F0F80
+3E0FC0
+7E07C0
+FC07E0
+FC03F0
+ENDCHAR
+STARTCHAR uni1E8B
+ENCODING 7819
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 23 1 0
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+F81F
+FC3F
+7C3E
+3E7C
+3E78
+1FF8
+0FF0
+07E0
+03C0
+07E0
+0FE0
+0FF0
+1FF8
+3E78
+3E7C
+7C3E
+FC3F
+F81F
+ENDCHAR
+STARTCHAR uni1E8C
+ENCODING 7820
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 30 1 0
+BITMAP
+079E00
+079E00
+079E00
+079E00
+000000
+FC03E0
+7E07E0
+7E07C0
+3F0FC0
+1F0F80
+1F9F00
+0F9F00
+0FBE00
+07FE00
+07FC00
+03FC00
+03F800
+01F800
+03F800
+03FC00
+07FC00
+07FE00
+0FBF00
+1F9F00
+1F1F80
+3F0F80
+3E0FC0
+7E07C0
+FC07E0
+FC03F0
+ENDCHAR
+STARTCHAR uni1E8D
+ENCODING 7821
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 23 1 0
+BITMAP
+1E78
+1E78
+1E78
+1E78
+0000
+F81F
+FC3F
+7C3E
+3E7C
+3E78
+1FF8
+0FF0
+07E0
+03C0
+07E0
+0FE0
+0FF0
+1FF8
+3E78
+3E7C
+7C3E
+FC3F
+F81F
+ENDCHAR
+STARTCHAR uni1E8E
+ENCODING 7822
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 30 1 0
+BITMAP
+00F000
+00F000
+00F000
+00F000
+000000
+FC03F0
+FC03E0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR uni1E8F
+ENCODING 7823
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 30 1 -7
+BITMAP
+03C0
+03C0
+03C0
+03C0
+0000
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR uni1E90
+ENCODING 7824
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 31 1 0
+BITMAP
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000F80
+001F80
+003F00
+007E00
+007C00
+00FC00
+01F800
+03F000
+03F000
+07E000
+0FC000
+0F8000
+1F8000
+3F0000
+7E0000
+7E0000
+FC0000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+ENDCHAR
+STARTCHAR uni1E91
+ENCODING 7825
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 24 1 0
+BITMAP
+0300
+0780
+0FC0
+1CE0
+3870
+0000
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1F80
+1F00
+3E00
+7C00
+F800
+FFFC
+FFFC
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR uni1E92
+ENCODING 7826
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 30 1 -5
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000F80
+001F80
+003F00
+007E00
+007C00
+00FC00
+01F800
+03F000
+03F000
+07E000
+0FC000
+0F8000
+1F8000
+3F0000
+7E0000
+7E0000
+FC0000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000000
+03C000
+03C000
+03C000
+03C000
+ENDCHAR
+STARTCHAR uni1E93
+ENCODING 7827
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 23 1 -5
+BITMAP
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1F80
+1F00
+3E00
+7C00
+F800
+FFFC
+FFFC
+FFFC
+FFFC
+0000
+0780
+0780
+0780
+0780
+ENDCHAR
+STARTCHAR uni1E94
+ENCODING 7828
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 29 1 -4
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000F80
+001F80
+003F00
+007E00
+007C00
+00FC00
+01F800
+03F000
+03F000
+07E000
+0FC000
+0F8000
+1F8000
+3F0000
+7E0000
+7E0000
+FC0000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+000000
+1FF800
+1FF800
+1FF800
+ENDCHAR
+STARTCHAR uni1E95
+ENCODING 7829
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 14 22 1 -4
+BITMAP
+FFFC
+FFFC
+FFFC
+FFFC
+00F8
+01F0
+03F0
+07E0
+0FC0
+1F80
+1F00
+3E00
+7C00
+F800
+FFFC
+FFFC
+FFFC
+FFFC
+0000
+3FF0
+3FF0
+3FF0
+ENDCHAR
+STARTCHAR uni1E96
+ENCODING 7830
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 29 2 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F1E0
+F7F8
+FFFC
+FFFC
+FC3E
+F81E
+F81E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+0000
+1FF8
+1FF8
+1FF8
+ENDCHAR
+STARTCHAR uni1E97
+ENCODING 7831
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 27 0 0
+BITMAP
+F3C0
+F3C0
+F3C0
+F3C0
+0000
+1E00
+1E00
+1E00
+1E00
+7FC0
+7FC0
+7FC0
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1E00
+1FC0
+1FC0
+0FC0
+07C0
+ENDCHAR
+STARTCHAR uni1E98
+ENCODING 7832
+SWIDTH 778 0
+DWIDTH 26 0
+BBX 25 25 0 0
+BITMAP
+001C0000
+00360000
+00220000
+00220000
+00360000
+001C0000
+00000000
+F83E0F80
+F83E0F80
+783E0F00
+7C3E1F00
+7C7F1F00
+3C7F1E00
+3C7F1E00
+3C771E00
+3CF79E00
+1EE3BC00
+1EE3BC00
+1EE3BC00
+1FE3FC00
+0FC1F800
+0FC1F800
+0FC1F800
+0780F000
+0780F000
+ENDCHAR
+STARTCHAR uni1E99
+ENCODING 7833
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 32 1 -7
+BITMAP
+0380
+06C0
+0440
+0440
+06C0
+0380
+0000
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR uni1EA0
+ENCODING 7840
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 30 0 -5
+BITMAP
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+000000
+007800
+007800
+007800
+007800
+ENDCHAR
+STARTCHAR uni1EA1
+ENCODING 7841
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 23 1 -5
+BITMAP
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1EA4
+ENCODING 7844
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 37 0 0
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+003000
+007800
+00FC00
+01CE00
+038700
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni1EA5
+ENCODING 7845
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 31 1 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni1EA6
+ENCODING 7846
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 37 0 0
+BITMAP
+00E000
+00F000
+007000
+007800
+003800
+000000
+003000
+007800
+00FC00
+01CE00
+038700
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni1EA7
+ENCODING 7847
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 31 1 0
+BITMAP
+0700
+0780
+0380
+03C0
+01C0
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni1EAA
+ENCODING 7850
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 36 0 0
+BITMAP
+00F180
+01FF80
+03FF00
+031E00
+000000
+003000
+007800
+00FC00
+01CE00
+038700
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni1EAB
+ENCODING 7851
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 30 1 0
+BITMAP
+078C
+0FFC
+1FF8
+18F0
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+01FE
+0FFE
+3FFE
+7F1E
+F81E
+F01E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni1EAC
+ENCODING 7852
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 36 0 -5
+BITMAP
+003000
+007800
+00FC00
+01CE00
+038700
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+000000
+007800
+007800
+007800
+007800
+ENDCHAR
+STARTCHAR uni1EAD
+ENCODING 7853
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 29 1 -5
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1EAE
+ENCODING 7854
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 37 0 0
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+010100
+018300
+00FE00
+00FE00
+003800
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni1EAF
+ENCODING 7855
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 30 1 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+1010
+1830
+0FE0
+0FE0
+0380
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni1EB0
+ENCODING 7856
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 37 0 0
+BITMAP
+00E000
+00F000
+007000
+007800
+003800
+000000
+010100
+018300
+00FE00
+00FE00
+003800
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni1EB1
+ENCODING 7857
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 30 1 0
+BITMAP
+0700
+0780
+0380
+03C0
+01C0
+0000
+1010
+1830
+0FE0
+0FE0
+0380
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni1EB4
+ENCODING 7860
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 36 0 0
+BITMAP
+00F180
+01FF80
+03FF00
+031E00
+000000
+010100
+018300
+00FE00
+00FE00
+003800
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni1EB5
+ENCODING 7861
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 29 1 0
+BITMAP
+0F18
+1FF8
+3FF0
+31E0
+0000
+1010
+1830
+0FE0
+0FE0
+0380
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+ENDCHAR
+STARTCHAR uni1EB6
+ENCODING 7862
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 36 0 -5
+BITMAP
+010100
+018300
+00FE00
+00FE00
+003800
+000000
+00FC00
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+000000
+007800
+007800
+007800
+007800
+ENDCHAR
+STARTCHAR uni1EB7
+ENCODING 7863
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 15 29 1 -5
+BITMAP
+1010
+1830
+0FE0
+0FE0
+0380
+0000
+0FF0
+3FFC
+7FFC
+7C3E
+F81E
+F81E
+00FE
+0FFE
+3FFE
+7F1E
+F81E
+F81E
+F03E
+F87E
+FFFE
+FFFE
+7FDE
+3F1E
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1EB8
+ENCODING 7864
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 30 2 -5
+BITMAP
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+000000
+03C000
+03C000
+03C000
+03C000
+ENDCHAR
+STARTCHAR uni1EB9
+ENCODING 7865
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 23 1 -5
+BITMAP
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1EBC
+ENCODING 7868
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 30 2 0
+BITMAP
+078C00
+0FFC00
+1FF800
+18F000
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni1EBD
+ENCODING 7869
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 23 1 0
+BITMAP
+078C
+0FFC
+1FF8
+18F0
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni1EBE
+ENCODING 7870
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 37 2 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni1EBF
+ENCODING 7871
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 31 1 0
+BITMAP
+00F0
+01E0
+01C0
+0380
+0380
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81E
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFE
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni1EC0
+ENCODING 7872
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 37 2 0
+BITMAP
+038000
+03C000
+01C000
+01E000
+00E000
+000000
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni1EC1
+ENCODING 7873
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 31 1 0
+BITMAP
+0700
+0780
+0380
+03C0
+01C0
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81E
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFE
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni1EC4
+ENCODING 7876
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 36 2 0
+BITMAP
+03C600
+07FE00
+0FFC00
+0C7800
+000000
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni1EC5
+ENCODING 7877
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 30 1 0
+BITMAP
+078C
+0FFC
+1FF8
+18F0
+0000
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81E
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFE
+3FFC
+1FF0
+07C0
+ENDCHAR
+STARTCHAR uni1EC6
+ENCODING 7878
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 36 2 -5
+BITMAP
+018000
+03C000
+07E000
+0E7000
+1C3800
+000000
+FFFF80
+FFFF80
+FFFF80
+FFFF80
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFF00
+FFFF00
+FFFF00
+FFFF00
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+F80000
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+000000
+03C000
+03C000
+03C000
+03C000
+ENDCHAR
+STARTCHAR uni1EC7
+ENCODING 7879
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 29 1 -5
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+07E0
+1FF8
+3FFC
+7FFE
+7C3E
+F81F
+F01F
+FFFF
+FFFF
+FFFF
+F000
+F000
+F81E
+7C3E
+7FFC
+3FFC
+1FF0
+07C0
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1ECA
+ENCODING 7882
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 5 30 2 -5
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+00
+78
+78
+78
+78
+ENDCHAR
+STARTCHAR uni1ECB
+ENCODING 7883
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 30 2 -5
+BITMAP
+F0
+F0
+F0
+F0
+00
+00
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+F0
+00
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR uni1ECC
+ENCODING 7884
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 30 1 -5
+BITMAP
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+000000
+003C00
+003C00
+003C00
+003C00
+ENDCHAR
+STARTCHAR uni1ECD
+ENCODING 7885
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 23 1 -5
+BITMAP
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR uni1ED0
+ENCODING 7888
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 37 1 0
+BITMAP
+000F00
+001E00
+001C00
+003800
+003800
+000000
+001800
+003C00
+007E00
+00E700
+01C380
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni1ED1
+ENCODING 7889
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 31 1 0
+BITMAP
+007800
+00F000
+00E000
+01C000
+01C000
+000000
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1ED2
+ENCODING 7890
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 37 1 0
+BITMAP
+007000
+007800
+003800
+003C00
+001C00
+000000
+001800
+003C00
+007E00
+00E700
+01C380
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni1ED3
+ENCODING 7891
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 31 1 0
+BITMAP
+038000
+03C000
+01C000
+01E000
+00E000
+000000
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1ED6
+ENCODING 7894
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 36 1 0
+BITMAP
+0078C0
+00FFC0
+01FF80
+018F00
+000000
+001800
+003C00
+007E00
+00E700
+01C380
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+ENDCHAR
+STARTCHAR uni1ED7
+ENCODING 7895
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 30 1 0
+BITMAP
+03C600
+07FE00
+0FFC00
+0C7800
+000000
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1ED8
+ENCODING 7896
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 23 36 1 -5
+BITMAP
+001800
+003C00
+007E00
+00E700
+01C380
+000000
+01FF00
+07FFC0
+0FFFE0
+1FFFF0
+3FC7F8
+3F01F8
+7E00FC
+7C007C
+7C007C
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+F8003E
+7C007C
+7C007C
+7E00FC
+3F01F8
+3FC7F8
+1FFFF0
+0FFFE0
+07FFC0
+01FF00
+000000
+003C00
+003C00
+003C00
+003C00
+ENDCHAR
+STARTCHAR uni1ED9
+ENCODING 7897
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 29 1 -5
+BITMAP
+00C000
+01E000
+03F000
+073800
+0E1C00
+000000
+07F000
+1FFC00
+3FFE00
+7FFF00
+7C1F00
+F80F80
+F80F80
+F00780
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR uni1EDA
+ENCODING 7898
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 25 31 1 0
+BITMAP
+00078000
+000F0000
+000E0000
+001C0000
+001C0000
+00000000
+01FF0780
+07FFC780
+0FFFE780
+1FFFF780
+3FC7F980
+3F01F980
+7E00FD80
+7C007F00
+7C007E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+7C007C00
+7C007C00
+7E00FC00
+3F01F800
+3FC7F800
+1FFFF000
+0FFFE000
+07FFC000
+01FF0000
+ENDCHAR
+STARTCHAR uni1EDB
+ENCODING 7899
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 24 1 0
+BITMAP
+003C00
+007800
+007000
+00E000
+00E000
+000000
+07F1E0
+1FFDE0
+3FFFE0
+7FFFE0
+7C1F60
+F80FE0
+F80FE0
+F007C0
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1EDC
+ENCODING 7900
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 25 31 1 0
+BITMAP
+00380000
+003C0000
+001C0000
+001E0000
+000E0000
+00000000
+01FF0780
+07FFC780
+0FFFE780
+1FFFF780
+3FC7F980
+3F01F980
+7E00FD80
+7C007F00
+7C007E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+7C007C00
+7C007C00
+7E00FC00
+3F01F800
+3FC7F800
+1FFFF000
+0FFFE000
+07FFC000
+01FF0000
+ENDCHAR
+STARTCHAR uni1EDD
+ENCODING 7901
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 24 1 0
+BITMAP
+01C000
+01E000
+00E000
+00F000
+007000
+000000
+07F1E0
+1FFDE0
+3FFFE0
+7FFFE0
+7C1F60
+F80FE0
+F80FE0
+F007C0
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1EE0
+ENCODING 7904
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 25 30 1 0
+BITMAP
+003C6000
+007FE000
+00FFC000
+00C78000
+00000000
+01FF0780
+07FFC780
+0FFFE780
+1FFFF780
+3FC7F980
+3F01F980
+7E00FD80
+7C007F00
+7C007E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+7C007C00
+7C007C00
+7E00FC00
+3F01F800
+3FC7F800
+1FFFF000
+0FFFE000
+07FFC000
+01FF0000
+ENDCHAR
+STARTCHAR uni1EE1
+ENCODING 7905
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 23 1 0
+BITMAP
+01E300
+03FF00
+07FE00
+063C00
+000000
+07F1E0
+1FFDE0
+3FFFE0
+7FFFE0
+7C1F60
+F80FE0
+F80FE0
+F007C0
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+ENDCHAR
+STARTCHAR uni1EE2
+ENCODING 7906
+SWIDTH 778 0
+DWIDTH 25 0
+BBX 25 30 1 -5
+BITMAP
+01FF0780
+07FFC780
+0FFFE780
+1FFFF780
+3FC7F980
+3F01F980
+7E00FD80
+7C007F00
+7C007E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+F8003E00
+7C007C00
+7C007C00
+7E00FC00
+3F01F800
+3FC7F800
+1FFFF000
+0FFFE000
+07FFC000
+01FF0000
+00000000
+003C0000
+003C0000
+003C0000
+003C0000
+ENDCHAR
+STARTCHAR uni1EE3
+ENCODING 7907
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 19 23 1 -5
+BITMAP
+07F1E0
+1FFDE0
+3FFFE0
+7FFFE0
+7C1F60
+F80FE0
+F80FE0
+F007C0
+F00780
+F00780
+F00780
+F80F80
+F80F80
+7C1F00
+7FFF00
+3FFE00
+1FFC00
+07F000
+000000
+01E000
+01E000
+01E000
+01E000
+ENDCHAR
+STARTCHAR uni1EE4
+ENCODING 7908
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 30 2 -5
+BITMAP
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1EE5
+ENCODING 7909
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 15 23 2 -5
+BITMAP
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F01E
+F83E
+F87E
+FFFE
+7FFE
+7FDE
+1F1E
+0000
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR uni1EE8
+ENCODING 7912
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 31 2 0
+BITMAP
+001E00
+003C00
+003800
+007000
+007000
+000000
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni1EE9
+ENCODING 7913
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 18 24 2 0
+BITMAP
+003C00
+007800
+007000
+00E000
+00E000
+000000
+F01FC0
+F01FC0
+F01FC0
+F01FC0
+F01EC0
+F01EC0
+F01EC0
+F01F80
+F01F00
+F01E00
+F01E00
+F01E00
+F83E00
+F87E00
+FFFE00
+7FFE00
+7FDE00
+1F1E00
+ENDCHAR
+STARTCHAR uni1EEA
+ENCODING 7914
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 31 2 0
+BITMAP
+00E000
+00F000
+007000
+007800
+003800
+000000
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni1EEB
+ENCODING 7915
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 18 24 2 0
+BITMAP
+01C000
+01E000
+00E000
+00F000
+007000
+000000
+F01FC0
+F01FC0
+F01FC0
+F01FC0
+F01EC0
+F01EC0
+F01EC0
+F01F80
+F01F00
+F01E00
+F01E00
+F01E00
+F83E00
+F87E00
+FFFE00
+7FFE00
+7FDE00
+1F1E00
+ENDCHAR
+STARTCHAR uni1EEE
+ENCODING 7918
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 30 2 0
+BITMAP
+00F180
+01FF80
+03FF00
+031E00
+000000
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+ENDCHAR
+STARTCHAR uni1EEF
+ENCODING 7919
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 18 23 2 0
+BITMAP
+03C600
+07FE00
+0FFC00
+0C7800
+000000
+F01FC0
+F01FC0
+F01FC0
+F01FC0
+F01EC0
+F01EC0
+F01EC0
+F01F80
+F01F00
+F01E00
+F01E00
+F01E00
+F83E00
+F87E00
+FFFE00
+7FFE00
+7FDE00
+1F1E00
+ENDCHAR
+STARTCHAR uni1EF0
+ENCODING 7920
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 21 30 2 -5
+BITMAP
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F8
+F803F0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+F803E0
+FC07E0
+7F1FC0
+7FFFC0
+3FFF80
+1FFF00
+07FC00
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1EF1
+ENCODING 7921
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 18 23 2 -5
+BITMAP
+F01FC0
+F01FC0
+F01FC0
+F01FC0
+F01EC0
+F01EC0
+F01EC0
+F01F80
+F01F00
+F01E00
+F01E00
+F01E00
+F83E00
+F87E00
+FFFE00
+7FFE00
+7FDE00
+1F1E00
+000000
+03C000
+03C000
+03C000
+03C000
+ENDCHAR
+STARTCHAR Ygrave
+ENCODING 7922
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 31 1 0
+BITMAP
+01C000
+01E000
+00E000
+00F000
+007000
+000000
+FC03F0
+FC03E0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR ygrave
+ENCODING 7923
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 31 1 -7
+BITMAP
+0700
+0780
+0380
+03C0
+01C0
+0000
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR uni1EF4
+ENCODING 7924
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 30 1 -5
+BITMAP
+FC03F0
+FC03E0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+000000
+00F000
+00F000
+00F000
+00F000
+ENDCHAR
+STARTCHAR uni1EF5
+ENCODING 7925
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 30 1 -12
+BITMAP
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+0000
+0780
+0780
+0780
+0780
+ENDCHAR
+STARTCHAR uni1EF8
+ENCODING 7928
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 20 30 1 0
+BITMAP
+01E300
+03FF00
+07FE00
+063C00
+000000
+FC03F0
+FC03E0
+7E07E0
+3E07C0
+3F0FC0
+3F0F80
+1F0F80
+1F9F00
+0F9F00
+0FFE00
+07FE00
+07FC00
+03FC00
+03F800
+03F800
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+01F000
+ENDCHAR
+STARTCHAR uni1EF9
+ENCODING 7929
+SWIDTH 556 0
+DWIDTH 19 0
+BBX 16 30 1 -7
+BITMAP
+078C
+0FFC
+1FF8
+18F0
+0000
+F81F
+F81F
+F81E
+783E
+7C3E
+7C3C
+3C3C
+3E7C
+3E78
+1E78
+1E78
+1FF0
+0FF0
+0FF0
+0FE0
+07E0
+07E0
+07C0
+07C0
+07C0
+0F80
+3F80
+3F00
+3F00
+3C00
+ENDCHAR
+STARTCHAR uni2000
+ENCODING 8192
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2001
+ENCODING 8193
+SWIDTH 1000 0
+DWIDTH 33 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2002
+ENCODING 8194
+SWIDTH 500 0
+DWIDTH 17 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2003
+ENCODING 8195
+SWIDTH 1000 0
+DWIDTH 33 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2004
+ENCODING 8196
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2005
+ENCODING 8197
+SWIDTH 250 0
+DWIDTH 8 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2006
+ENCODING 8198
+SWIDTH 167 0
+DWIDTH 6 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2007
+ENCODING 8199
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2008
+ENCODING 8200
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2009
+ENCODING 8201
+SWIDTH 200 0
+DWIDTH 7 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni200A
+ENCODING 8202
+SWIDTH 100 0
+DWIDTH 3 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni200B
+ENCODING 8203
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 1 0 0
+BITMAP
+00
+ENDCHAR
+STARTCHAR uni2010
+ENCODING 8208
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 5 1 7
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR uni2011
+ENCODING 8209
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 9 5 1 7
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 18 3 0 7
+BITMAP
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 18 3 0 7
+BITMAP
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 32 3 0 7
+BITMAP
+FFFFFFFF
+FFFFFFFF
+FFFFFFFF
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 32 3 0 7
+BITMAP
+FFFFFFFF
+FFFFFFFF
+FFFFFFFF
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 9 2 16
+BITMAP
+30
+60
+C0
+C0
+C0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 9 2 16
+BITMAP
+F0
+F0
+F0
+F0
+30
+30
+30
+60
+C0
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 8218
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 8 2 -4
+BITMAP
+F0
+F0
+F0
+F0
+30
+30
+60
+E0
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 9 2 16
+BITMAP
+F0
+F0
+F0
+F0
+C0
+C0
+C0
+60
+30
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 500 0
+DWIDTH 16 0
+BBX 12 8 2 16
+BITMAP
+3070
+60E0
+C0C0
+C0C0
+F0F0
+F0F0
+F0F0
+F0F0
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 500 0
+DWIDTH 16 0
+BBX 12 8 2 17
+BITMAP
+F0F0
+F0F0
+F0F0
+F0F0
+3030
+3030
+6060
+E0C0
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 8222
+SWIDTH 500 0
+DWIDTH 16 0
+BBX 12 10 2 -5
+BITMAP
+F0F0
+F0F0
+F0F0
+F0F0
+F0F0
+3030
+3030
+3030
+E0E0
+C0C0
+ENDCHAR
+STARTCHAR uni201F
+ENCODING 8223
+SWIDTH 500 0
+DWIDTH 16 0
+BBX 12 8 2 17
+BITMAP
+F0F0
+F0F0
+F0F0
+F0F0
+C0C0
+C0C0
+6060
+3070
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 30 1 -7
+BITMAP
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+FFFF
+FFFF
+FFFF
+FFFF
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 556 0
+DWIDTH 18 0
+BBX 16 30 1 -7
+BITMAP
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+FFFF
+FFFF
+FFFF
+FFFF
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+FFFF
+FFFF
+FFFF
+FFFF
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+03C0
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 350 0
+DWIDTH 12 0
+BBX 8 8 2 6
+BITMAP
+3C
+7E
+FF
+FF
+FF
+FF
+7E
+3C
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 1000 0
+DWIDTH 33 0
+BBX 27 5 3 0
+BITMAP
+F81F03E0
+F81F03E0
+F81F03E0
+F81F03E0
+F81F03E0
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 8240
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 32 25 0 0
+BITMAP
+1E00C000
+3F018000
+7F838000
+E1C30000
+E1C70000
+E1C60000
+E1CE0000
+7F8C0000
+3F1C0000
+1E180000
+00300000
+00700000
+00600000
+00E00000
+00C00000
+01C00000
+01878078
+039FE1FE
+031FE1FE
+06387387
+06387387
+0C387387
+1C1FE1FE
+181FE1FE
+18078078
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 12 3 3
+BITMAP
+08
+18
+38
+F8
+F0
+E0
+E0
+F0
+F8
+78
+18
+08
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 12 3 3
+BITMAP
+80
+C0
+F0
+F8
+78
+38
+38
+78
+F8
+E0
+C0
+80
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8260
+SWIDTH 167 0
+DWIDTH 6 0
+BBX 16 24 -6 0
+BITMAP
+0007
+0007
+000E
+001C
+001C
+0038
+0038
+0070
+0070
+00E0
+00C0
+01C0
+0380
+0380
+0700
+0700
+0E00
+0E00
+1C00
+1800
+3800
+7000
+7000
+E000
+ENDCHAR
+STARTCHAR oneinferior
+ENCODING 8321
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 6 15 2 -7
+BITMAP
+1C
+3C
+FC
+FC
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+1C
+ENDCHAR
+STARTCHAR twoinferior
+ENCODING 8322
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 15 0 -7
+BITMAP
+3F00
+7F80
+F3C0
+E1C0
+E1C0
+01C0
+03C0
+0780
+0F00
+3E00
+7800
+7000
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR threeinferior
+ENCODING 8323
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 10 15 0 -7
+BITMAP
+1E00
+7F80
+F3C0
+E1C0
+E1C0
+03C0
+0F80
+0F80
+03C0
+01C0
+E1C0
+E1C0
+F3C0
+7F80
+3E00
+ENDCHAR
+STARTCHAR uni20A5
+ENCODING 8357
+SWIDTH 889 0
+DWIDTH 30 0
+BBX 24 25 2 -3
+BITMAP
+000300
+000300
+000300
+000300
+F1E6F8
+F7FFFE
+FFFFFE
+FFFFFF
+FC7F1F
+F83E0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F03C0F
+F07C0F
+F07C0F
+F07C0F
+F07C0F
+00C000
+00C000
+00C000
+ENDCHAR
+STARTCHAR uni20A6
+ENCODING 8358
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 19 25 2 0
+BITMAP
+F803E0
+FC03E0
+FC03E0
+FE03E0
+FE03E0
+FF03E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+FBE3E0
+F9E3E0
+F9F3E0
+F8F3E0
+FFFFE0
+FFFFE0
+FFFFE0
+FFFFE0
+F81FE0
+F81FE0
+F80FE0
+F80FE0
+F807E0
+F807E0
+F803E0
+ENDCHAR
+STARTCHAR uni20A9
+ENCODING 8361
+SWIDTH 944 0
+DWIDTH 31 0
+BBX 29 25 1 0
+BITMAP
+F81F81F8
+F81F81F8
+781F81F0
+781F81F0
+781F81F0
+7C3FC3E0
+7DFFFFE0
+7DFFFFE0
+3DFFFFE0
+3DFFFFC0
+3E79E3C0
+3E79E7C0
+1E79E7C0
+1E79E780
+1FFFFF80
+1FFFFF80
+0FFFFF00
+0FFFFF00
+0FF0FF00
+0FE07F00
+07E07E00
+07E07E00
+07E07E00
+03C03C00
+03C03C00
+ENDCHAR
+STARTCHAR Euro
+ENCODING 8364
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 24 25 -2 0
+BITMAP
+003FC0
+00FFF0
+01FFF8
+03FFFC
+07F0FE
+07C03E
+FFFE3F
+FFFE1F
+FFFE1F
+FFFE00
+1F0000
+1F0000
+1F0000
+1F0000
+FFFE00
+FFFE00
+FFFE1F
+FFFE1F
+0FC03F
+07C03E
+07F0FE
+03FFFC
+01FFF8
+00FFF0
+003FC0
+ENDCHAR
+STARTCHAR uni20AD
+ENCODING 8365
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 25 2 0
+BITMAP
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFFFF0
+FFFFF0
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+ENDCHAR
+STARTCHAR uni2103
+ENCODING 8451
+SWIDTH 1102 0
+DWIDTH 36 0
+BBX 32 25 2 0
+BITMAP
+00003FC0
+3E00FFF0
+7F01FFF8
+6303FFFC
+C187F0FE
+C187C03E
+C18F803F
+C18F801F
+630F801F
+7F1F0000
+3E1F0000
+001F0000
+001F0000
+001F0000
+001F0000
+001F0000
+000F801F
+000F801F
+000FC03F
+0007C03E
+0007F0FE
+0003FFFC
+0001FFF8
+0000FFF0
+00003FC0
+ENDCHAR
+STARTCHAR uni2109
+ENCODING 8457
+SWIDTH 991 0
+DWIDTH 32 0
+BBX 28 25 2 0
+BITMAP
+000FFFF0
+3E0FFFF0
+7F0FFFF0
+630FFFF0
+C18F8000
+C18F8000
+C18F8000
+C18F8000
+630F8000
+7F0F8000
+3E0FFFE0
+000FFFE0
+000FFFE0
+000FFFE0
+000F8000
+000F8000
+000F8000
+000F8000
+000F8000
+000F8000
+000F8000
+000F8000
+000F8000
+000F8000
+000F8000
+ENDCHAR
+STARTCHAR trademark
+ENCODING 8482
+SWIDTH 1000 0
+DWIDTH 32 0
+BBX 28 14 2 11
+BITMAP
+FFE7C1F0
+FFE7C1F0
+FFE7E3F0
+0E07E3F0
+0E07E3F0
+0E077770
+0E077770
+0E077770
+0E073E70
+0E073E70
+0E073E70
+0E071C70
+0E071C70
+0E070870
+ENDCHAR
+STARTCHAR uni212A
+ENCODING 8490
+SWIDTH 722 0
+DWIDTH 24 0
+BBX 20 25 2 0
+BITMAP
+F807E0
+F807E0
+F80FC0
+F81F80
+F83F00
+F87E00
+F8FC00
+F8F800
+F9F800
+FBF000
+FFE000
+FFE000
+FFF000
+FFF000
+FFF800
+FCFC00
+F87E00
+F87E00
+F83F00
+F81F80
+F80F80
+F80FC0
+F807E0
+F803F0
+F803F0
+ENDCHAR
+STARTCHAR uni212B
+ENCODING 8491
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 31 0 0
+BITMAP
+007800
+00CC00
+008400
+008400
+00CC00
+007800
+000000
+00FC00
+01FE00
+01FE00
+01FE00
+03FF00
+03FF00
+03FF00
+07CF80
+07CF80
+07CF80
+0F8780
+0F87C0
+0F87C0
+1F03C0
+1F03E0
+1FFFE0
+1FFFE0
+3FFFF0
+3FFFF0
+3E01F0
+7C00F8
+7C00F8
+FC00FC
+F8007C
+ENDCHAR
+STARTCHAR uni2132
+ENCODING 8498
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 16 25 2 0
+BITMAP
+001F
+001F
+001F
+001F
+001F
+001F
+001F
+001F
+001F
+001F
+001F
+7FFF
+7FFF
+7FFF
+7FFF
+001F
+001F
+001F
+001F
+001F
+001F
+FFFF
+FFFF
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR universal
+ENCODING 8704
+SWIDTH 722 0
+DWIDTH 23 0
+BBX 22 25 0 0
+BITMAP
+F8007C
+FC00FC
+7C00F8
+7C00F8
+3E01F0
+3FFFF0
+3FFFF0
+1FFFE0
+1FFFE0
+1F03E0
+1F03C0
+0F87C0
+0F87C0
+0F8780
+07CF80
+07CF80
+07CF80
+03FF00
+03FF00
+03FF00
+01FE00
+01FE00
+01FE00
+00FC00
+00FC00
+ENDCHAR
+STARTCHAR existential
+ENCODING 8707
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 25 2 0
+BITMAP
+7FFFC0
+7FFFC0
+7FFFC0
+7FFFC0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+3FFFC0
+3FFFC0
+3FFFC0
+3FFFC0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+0007C0
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR uni2204
+ENCODING 8708
+SWIDTH 667 0
+DWIDTH 22 0
+BBX 18 25 2 0
+BITMAP
+7FFFC0
+7FFFC0
+7FFFC0
+7FFFC0
+0037C0
+0037C0
+0037C0
+0077C0
+0067C0
+0067C0
+3FFFC0
+3FFFC0
+3FFFC0
+3FFFC0
+00C7C0
+0187C0
+0187C0
+0187C0
+0387C0
+0307C0
+0307C0
+FFFFC0
+FFFFC0
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 4 1 6
+BITMAP
+FFFF
+FFFF
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8725
+SWIDTH 167 0
+DWIDTH 6 0
+BBX 16 24 -6 0
+BITMAP
+0007
+0007
+000E
+001C
+001C
+0038
+0038
+0070
+0070
+00E0
+00C0
+01C0
+0380
+0380
+0700
+0700
+0E00
+0E00
+1C00
+1800
+3800
+7000
+7000
+E000
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 8729
+SWIDTH 278 0
+DWIDTH 9 0
+BBX 4 5 2 11
+BITMAP
+60
+F0
+F0
+F0
+60
+ENDCHAR
+STARTCHAR uni2236
+ENCODING 8758
+SWIDTH 333 0
+DWIDTH 11 0
+BBX 5 17 3 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+00
+00
+00
+00
+00
+00
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2259
+ENCODING 8793
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 18 2 2
+BITMAP
+0180
+03C0
+07E0
+0E70
+1C38
+0000
+FFFE
+FFFE
+FFFE
+FFFE
+0000
+0000
+0000
+0000
+FFFE
+FFFE
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR uni225A
+ENCODING 8794
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 18 2 2
+BITMAP
+1C38
+0E70
+07E0
+03C0
+0180
+0000
+FFFE
+FFFE
+FFFE
+FFFE
+0000
+0000
+0000
+0000
+FFFE
+FFFE
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR notequal
+ENCODING 8800
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 25 2 -4
+BITMAP
+0030
+0030
+0030
+0030
+0060
+0060
+0060
+FFFE
+FFFE
+FFFE
+FFFE
+01C0
+0180
+0180
+0180
+FFFE
+FFFE
+FFFE
+FFFE
+0600
+0600
+0600
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR equivalence
+ENCODING 8801
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 8 0 4
+BITMAP
+FFFE
+FFFE
+0000
+FFFE
+FFFE
+0000
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR uni2262
+ENCODING 8802
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 15 25 0 -4
+BITMAP
+0030
+0030
+0030
+0030
+0060
+0060
+0060
+00E0
+00C0
+FFFE
+FFFE
+01C0
+FFFE
+FFFE
+0180
+FFFE
+FFFE
+0300
+0700
+0600
+0600
+0600
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR lessequal
+ENCODING 8804
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 19 1 -3
+BITMAP
+0003
+001F
+007F
+03FF
+0FFE
+7FF8
+FFC0
+FE00
+FE00
+FFC0
+7FF0
+0FFE
+03FF
+007F
+001F
+0003
+0000
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR greaterequal
+ENCODING 8805
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 19 1 -3
+BITMAP
+C000
+F000
+FE00
+FFC0
+7FF0
+1FFE
+03FF
+007F
+007F
+03FF
+1FFE
+7FF0
+FFC0
+FE00
+F000
+C000
+0000
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR uni226E
+ENCODING 8814
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 25 1 -4
+BITMAP
+0030
+0030
+0030
+0030
+0060
+0063
+007F
+00FF
+03FF
+0FFE
+7FF8
+FFC0
+FF80
+FF80
+FFC0
+7FF0
+0FFE
+03FF
+077F
+061F
+0603
+0600
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni226F
+ENCODING 8815
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 25 1 -4
+BITMAP
+0030
+0030
+0030
+0030
+0060
+C060
+F060
+FEE0
+FFC0
+7FF0
+1FFE
+03FF
+01FF
+01FF
+03FF
+1FFE
+7FF0
+FFC0
+FF00
+F600
+C600
+0600
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni2270
+ENCODING 8816
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 25 1 -6
+BITMAP
+0030
+0030
+0030
+0033
+007F
+007F
+03FF
+0FFE
+7FF8
+FFC0
+FEC0
+FFC0
+FFC0
+7FF0
+0FFE
+03FF
+037F
+031F
+0703
+0600
+FFFF
+FFFF
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR uni2271
+ENCODING 8817
+SWIDTH 584 0
+DWIDTH 19 0
+BBX 16 25 1 -6
+BITMAP
+0030
+0030
+0030
+C030
+F060
+FE60
+FFE0
+7FF0
+1FFE
+03FF
+00FF
+01FF
+03FF
+1FFE
+7FF0
+FFC0
+FF00
+F300
+C700
+0600
+FFFF
+FFFF
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR fi
+ENCODING -1
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 0 0
+BITMAP
+0FC780
+1FC780
+1FC780
+1F0780
+1E0000
+1E0000
+1E0780
+FFC780
+FFC780
+FFC780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+ENDCHAR
+STARTCHAR fl
+ENCODING -1
+SWIDTH 611 0
+DWIDTH 20 0
+BBX 17 25 0 0
+BITMAP
+0FC780
+1FC780
+1FC780
+1F0780
+1E0780
+1E0780
+1E0780
+FFC780
+FFC780
+FFC780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+1E0780
+ENDCHAR
+ENDFONT
diff --git a/dists/bada/Res/scummmobile/helvb12-iso-8859-1.fcc b/dists/bada/Res/scummmobile/helvb12-iso-8859-1.fcc
new file mode 100644
index 0000000000..651a25934a
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvb12-iso-8859-1.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/helvb12-iso-8859-2.fcc b/dists/bada/Res/scummmobile/helvb12-iso-8859-2.fcc
new file mode 100644
index 0000000000..2117b6b9e6
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvb12-iso-8859-2.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/helvb12-iso-8859-5.fcc b/dists/bada/Res/scummmobile/helvb12-iso-8859-5.fcc
new file mode 100644
index 0000000000..8ad8f0eb22
--- /dev/null
+++ b/dists/bada/Res/scummmobile/helvb12-iso-8859-5.fcc
Binary files differ
diff --git a/dists/bada/Res/scummmobile/logo.bmp b/dists/bada/Res/scummmobile/logo.bmp
new file mode 100644
index 0000000000..a3ca0ea618
--- /dev/null
+++ b/dists/bada/Res/scummmobile/logo.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/logo_small.bmp b/dists/bada/Res/scummmobile/logo_small.bmp
new file mode 100644
index 0000000000..79934f2f56
--- /dev/null
+++ b/dists/bada/Res/scummmobile/logo_small.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/radiobutton.bmp b/dists/bada/Res/scummmobile/radiobutton.bmp
new file mode 100644
index 0000000000..d3ba468321
--- /dev/null
+++ b/dists/bada/Res/scummmobile/radiobutton.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/radiobutton_empty.bmp b/dists/bada/Res/scummmobile/radiobutton_empty.bmp
new file mode 100644
index 0000000000..06b9f9bb70
--- /dev/null
+++ b/dists/bada/Res/scummmobile/radiobutton_empty.bmp
Binary files differ
diff --git a/dists/bada/Res/scummmobile/scummmobile_gfx.stx b/dists/bada/Res/scummmobile/scummmobile_gfx.stx
new file mode 100644
index 0000000000..4b9a035536
--- /dev/null
+++ b/dists/bada/Res/scummmobile/scummmobile_gfx.stx
@@ -0,0 +1,671 @@
+<?xml version = "1.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.
+ -
+ -->
+<render_info>
+ <palette>
+ <!-- Main background colors -->
+ <color name = 'darkorange'
+ rgb = '210, 114, 10'
+ />
+ <color name = 'brightorange'
+ rgb = '239, 196, 24'
+ />
+
+ <!-- Idle button/slider -->
+ <color name = 'darkred'
+ rgb = '169, 42, 12'
+ />
+ <color name = 'brightred'
+ rgb = '203, 126, 107'
+ />
+
+ <!-- Disabled button/slider -->
+ <color name = 'darkeneddarkred'
+ rgb = '120, 28, 0'
+ />
+ <color name = 'darkenedbrightred'
+ rgb = '144, 84, 72'
+ />
+
+ <!-- Highlighted button/slider -->
+ <color name = 'brightpink'
+ rgb = '255, 210, 200'
+ />
+ <color name = 'darkpink'
+ rgb = '200, 70, 50'
+ />
+
+ <!-- Dialog background -->
+ <color name = 'xtrabrightred'
+ rgb = '251, 241, 206'
+ />
+ <color name = 'blandyellow'
+ rgb = '248, 228, 152'
+ />
+
+ <!-- Others -->
+ <color name = 'bgreen'
+ rgb = '100, 162, 8'
+ />
+ <color name = 'black'
+ rgb = '0, 0, 0'
+ />
+ <color name = 'white'
+ rgb = '255, 255, 255'
+ />
+ <color name = 'shadowcolor'
+ rgb = '63, 60, 17'
+ />
+ <color name = 'darkgray'
+ rgb = '176, 168, 144'
+ />
+ <color name = 'lightgray'
+ rgb = '210, 200, 170'
+ />
+ <color name = 'lightgray2'
+ rgb = '231, 223, 189'
+ />
+ <color name = 'paleyellow'
+ rgb = '247, 228, 166'
+ />
+ </palette>
+
+ <bitmaps>
+ <bitmap filename = 'logo.bmp'/>
+ <bitmap filename = 'cursor.bmp'/>
+ <bitmap filename = 'cursor_small.bmp'/>
+ <bitmap filename = 'checkbox.bmp'/>
+ <bitmap filename = 'checkbox_empty.bmp'/>
+ <bitmap filename = 'radiobutton.bmp'/>
+ <bitmap filename = 'radiobutton_empty.bmp'/>
+ <bitmap filename = 'logo_small.bmp'/>
+ <bitmap filename = 'search.bmp'/>
+ </bitmaps>
+
+ <fonts>
+ <font id = 'text_default'
+ file = 'helvB14.bdf'
+ />
+ <font id = 'text_button'
+ file = 'helvB14.bdf'
+ />
+ <font id = 'text_normal'
+ file = 'helvB12.bdf'
+ />
+ <font id = 'tooltip_normal'
+ file = 'fixed5x8.bdf'
+ />
+
+ <text_color id = 'color_normal'
+ color = 'black'
+ />
+
+ <text_color id = 'color_normal_inverted'
+ color = 'black'
+ />
+
+ <text_color id = 'color_normal_hover'
+ color = 'bgreen'
+ />
+
+ <text_color id = 'color_normal_disabled'
+ color = '192, 192, 192'
+ />
+
+ <text_color id = 'color_alternative'
+ color = '128, 128, 128'
+ />
+
+ <text_color id = 'color_alternative_inverted'
+ color = 'white'
+ />
+
+ <text_color id = 'color_alternative_hover'
+ color = 'darkgray'
+ />
+
+ <text_color id = 'color_alternative_disabled'
+ color = '192, 192, 192'
+ />
+
+ <text_color id = 'color_button'
+ color = 'white'
+ />
+
+ <text_color id = 'color_button_hover'
+ color = '255, 214, 84'
+ />
+
+ <text_color id = 'color_button_disabled'
+ color = '192, 192, 192'
+ />
+ </fonts>
+
+ <!-- <defaults fill = 'gradient' fg_color = 'white'/> -->
+
+ <cursor file = 'cursor.bmp' hotspot = '0, 0' scale = '3'/>
+ <cursor resolution = 'y<400' file = 'cursor_small.bmp' hotspot = '0, 0' scale = '3'/>
+
+ <!-- Selection (text or list items) -->
+ <drawdata id = 'text_selection' cache = 'false'>
+ <drawstep func = 'square'
+ fill = 'foreground'
+ fg_color = 'darkgray'
+ />
+ </drawdata>
+
+ <drawdata id = 'text_selection_focus' cache = 'false'>
+ <drawstep func = 'square'
+ fill = 'foreground'
+ fg_color = 'bgreen'
+ />
+ </drawdata>
+
+ <!-- Main background -->
+ <drawdata id = 'mainmenu_bg' cache = 'false'>
+ <drawstep func = 'fill'
+ fill = 'gradient'
+ gradient_start = 'darkorange'
+ gradient_end = 'brightorange'
+ />
+ </drawdata>
+
+ <!-- Load screen -->
+ <drawdata id = 'special_bg' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '5'
+ fill = 'gradient'
+ stroke = '0'
+ gradient_start = 'darkorange'
+ gradient_end = 'brightorange'
+ shadow = '3'
+ gradient_factor = '3'
+ />
+ </drawdata>
+
+ <!-- Separator in popup lists -->
+ <drawdata id = 'separator' cache = 'false'>
+ <drawstep func = 'square'
+ fill = 'foreground'
+ height = '1'
+ ypos = 'center'
+ fg_color = 'black'
+ />
+ </drawdata>
+
+ <!-- Background of the scrollbar -->
+ <drawdata id = 'scrollbar_base' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '1'
+ radius = '10'
+ fill = 'background'
+ fg_color = 'darkgray'
+ bg_color = 'paleyellow'
+ />
+ </drawdata>
+
+ <!-- Handle of the scrollbar -->
+ <drawdata id = 'scrollbar_handle_hover' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '1'
+ radius = '10'
+ fill = 'gradient'
+ fg_color = 'blandyellow'
+ gradient_start = 'brightpink'
+ gradient_end = 'darkpink'
+ />
+ </drawdata>
+
+ <drawdata id = 'scrollbar_handle_idle' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '1'
+ radius = '10'
+ fill = 'gradient'
+ fg_color = 'blandyellow'
+ gradient_start = 'brightred'
+ gradient_end = 'darkred'
+ />
+ </drawdata>
+
+ <!-- Buttons at the top and bottom of the scrollbar -->
+ <drawdata id = 'scrollbar_button_idle' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '10'
+ fill = 'none'
+ fg_color = 'darkgray'
+ stroke = '1'
+ />
+ <drawstep func = 'triangle'
+ fg_color = 'shadowcolor'
+ fill = 'foreground'
+ width = 'auto'
+ height = 'auto'
+ xpos = 'center'
+ ypos = 'center'
+ orientation = 'top'
+ />
+ </drawdata>
+
+ <drawdata id = 'scrollbar_button_hover' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '10'
+ fill = 'gradient'
+ gradient_start = 'brightpink'
+ gradient_end = 'darkpink'
+ stroke = '1'
+ fg_color = 'darkred'
+ bevel = '1'
+ bevel_color = 'brightred'
+ />
+ <drawstep func = 'triangle'
+ fg_color = 'shadowcolor'
+ fill = 'foreground'
+ width = 'auto'
+ height = 'auto'
+ xpos = 'center'
+ ypos = 'center'
+ orientation = 'top'
+ />
+ </drawdata>
+
+ <!-- Active tab in the tabs list -->
+ <drawdata id = 'tab_active' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal'
+ vertical_align = 'center'
+ horizontal_align = 'center'
+ />
+ <!-- Custom color to match the tab content's gradient: -->
+ <drawstep func = 'tab'
+ radius = '4'
+ stroke = '0'
+ fill = 'background'
+ bg_color = '248, 232, 168'
+ shadow = '3'
+ />
+ </drawdata>
+
+ <!-- Inactive tab in the tabs list -->
+ <drawdata id = 'tab_inactive' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal'
+ vertical_align = 'center'
+ horizontal_align = 'center'
+ />
+ <drawstep func = 'tab'
+ radius = '4'
+ stroke = '0'
+ fill = 'background'
+ bg_color = '239, 202, 109'
+ shadow = '3'
+ />
+ </drawdata>
+
+ <!-- Background of the tabs list -->
+ <drawdata id = 'tab_background' cache = 'false'>
+ <drawstep func = 'tab'
+ radius = '6'
+ stroke = '0'
+ fill = 'foreground'
+ fg_color = '232, 180, 80'
+ shadow = '3'
+ />
+ </drawdata>
+
+ <!-- Background of the slider widget -->
+ <drawdata id = 'widget_slider' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '0'
+ radius = '5'
+ fill = 'foreground'
+ fg_color = 'paleyellow'
+ bevel = '1'
+ bevel_color = 'shadowcolor'
+ />
+ </drawdata>
+
+ <!-- Full part of the slider widget -->
+ <drawdata id = 'slider_full' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '1'
+ radius = '5'
+ fill = 'gradient'
+ fg_color = '123, 112, 56'
+ gradient_start = 'brightred'
+ gradient_end = 'darkred'
+ />
+ </drawdata>
+
+ <!-- Hovered full part of the slider widget -->
+ <drawdata id = 'slider_hover' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '1'
+ radius = '5'
+ fill = 'gradient'
+ fg_color = '123, 112, 56'
+ gradient_start = 'brightpink'
+ gradient_end = 'darkpink'
+ />
+ </drawdata>
+
+ <!-- Disabled slider widget -->
+ <drawdata id = 'slider_disabled' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '1'
+ radius = '5'
+ fill = 'gradient'
+ fg_color = '123, 112, 56'
+ gradient_start = 'darkenedbrightred'
+ gradient_end = 'darkeneddarkred'
+ />
+ </drawdata>
+
+ <!-- Idle popup -->
+ <drawdata id = 'popup_idle' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '5'
+ stroke = '1'
+ fg_color = 'lightgray2'
+ fill = 'background'
+ bg_color = 'xtrabrightred'
+ shadow = '2'
+ />
+ <drawstep func = 'triangle'
+ bg_color = 'shadowcolor'
+ fill = 'background'
+ width = 'height'
+ height = 'auto'
+ xpos = 'right'
+ ypos = 'center'
+ orientation = 'bottom'
+ />
+ <text font = 'text_default'
+ text_color = 'color_normal'
+ vertical_align = 'center'
+ horizontal_align = 'left'
+ />
+ </drawdata>
+
+ <!-- Disabled popup -->
+ <drawdata id = 'popup_disabled' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '5'
+ fill = 'foreground'
+ fg_color = 'darkgray'
+ shadow = '2'
+ />
+ <drawstep func = 'triangle'
+ fg_color = 'shadowcolor'
+ fill = 'foreground'
+ width = 'height'
+ height = 'auto'
+ xpos = 'right'
+ ypos = 'center'
+ orientation = 'bottom'
+ />
+ <text font = 'text_default'
+ text_color = 'color_normal_disabled'
+ vertical_align = 'center'
+ horizontal_align = 'left'
+ />
+ </drawdata>
+
+ <!-- Hovered popup -->
+ <drawdata id = 'popup_hover' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ stroke = '1'
+ fg_color = 'lightgray'
+ radius = '5'
+ fill = 'gradient'
+ gradient_start = 'blandyellow'
+ gradient_end = 'xtrabrightred'
+ shadow = '0'
+ />
+ <drawstep func = 'triangle'
+ fg_color = 'shadowcolor'
+ fill = 'foreground'
+ width = 'height'
+ height = 'auto'
+ xpos = 'right'
+ ypos = 'center'
+ orientation = 'bottom'
+ />
+ <text font = 'text_default'
+ text_color = 'color_normal_hover'
+ vertical_align = 'center'
+ horizontal_align = 'left'
+ />
+ </drawdata>
+
+ <!-- Background of the textedit widget -->
+ <drawdata id = 'widget_textedit' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ fill = 'foreground'
+ radius = '5'
+ fg_color = 'paleyellow'
+ shadow = '0'
+ bevel = '1'
+ bevel_color = 'shadowcolor'
+ />
+ </drawdata>
+
+ <!-- Background of the chooser dialogs (file chooser, theme browser, ...) -->
+ <drawdata id = 'plain_bg' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '6'
+ stroke = '0'
+ gradient_start = 'blandyellow'
+ gradient_end = 'xtrabrightred'
+ fill = 'gradient'
+ shadow = '3'
+ />
+ </drawdata>
+
+ <!-- Cursor in the text edit widget -->
+ <drawdata id = 'caret' cache = 'false'>
+ <drawstep func = 'square'
+ fill = 'foreground'
+ fg_color = 'black'
+ />
+ </drawdata>
+
+ <!-- Tab contents and game picker background -->
+ <drawdata id = 'default_bg' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '6'
+ stroke = '0'
+ fill = 'gradient'
+ gradient_start = 'blandyellow'
+ gradient_end = 'xtrabrightred'
+ gradient_factor = '4'
+ shadow = '3'
+ />
+ </drawdata>
+
+ <!-- Tooltip -->
+ <drawdata id = 'tooltip_bg' cache = 'false'>
+ <drawstep func = 'square'
+ fill = 'foreground'
+ fg_color = 'blandyellow'
+ shadow = '3'
+ />
+ </drawdata>
+
+ <!-- Idle button -->
+ <drawdata id = 'button_idle' cache = 'false'>
+ <text font = 'text_button'
+ text_color = 'color_button'
+ vertical_align = 'center'
+ horizontal_align = 'center'
+ />
+ <drawstep func = 'roundedsq'
+ radius = '5'
+ stroke = '1'
+ fill = 'gradient'
+ shadow = '0'
+ fg_color = 'shadowcolor'
+ gradient_start = 'brightred'
+ gradient_end = 'darkred'
+ bevel = '1'
+ bevel_color = '237, 169, 72'
+ />
+ </drawdata>
+
+ <!-- Hovered button -->
+ <drawdata id = 'button_hover' cache = 'false'>
+ <text font = 'text_button'
+ text_color = 'color_button_hover'
+ vertical_align = 'center'
+ horizontal_align = 'center'
+ />
+ <drawstep func = 'roundedsq'
+ radius = '5'
+ stroke = '1'
+ fill = 'gradient'
+ shadow = '0'
+ fg_color = 'shadowcolor'
+ gradient_start = 'brightpink'
+ gradient_end = 'darkpink'
+ bevel = '1'
+ bevel_color = 'xtrabrightred'
+ />
+ </drawdata>
+
+ <!-- Disabled button -->
+ <drawdata id = 'button_disabled' cache = 'false'>
+ <text font = 'text_button'
+ text_color = 'color_button_disabled'
+ vertical_align = 'center'
+ horizontal_align = 'center'
+ />
+ <drawstep func = 'roundedsq'
+ radius = '5'
+ stroke = '1'
+ fill = 'gradient'
+ shadow = '0'
+ fg_color = 'shadowcolor'
+ gradient_start = 'darkenedbrightred'
+ gradient_end = 'darkeneddarkred'
+ bevel = '1'
+ bevel_color = 'darkgray'
+ />
+ </drawdata>
+
+ <!-- Disabled checkbox -->
+ <drawdata id = 'checkbox_disabled' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal_disabled'
+ vertical_align = 'top'
+ horizontal_align = 'left'
+ />
+ <drawstep func = 'bitmap'
+ file = 'checkbox_empty.bmp'
+ />
+ </drawdata>
+
+ <!-- Selected checkbox -->
+ <drawdata id = 'checkbox_selected' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal'
+ vertical_align = 'top'
+ horizontal_align = 'left'
+ />
+ <drawstep func = 'bitmap'
+ file = 'checkbox.bmp'
+ />
+ </drawdata>
+
+ <!-- Idle checkbox -->
+ <drawdata id = 'checkbox_default' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal'
+ vertical_align = 'top'
+ horizontal_align = 'left'
+ />
+ <drawstep func = 'bitmap'
+ file = 'checkbox_empty.bmp'
+ />
+ </drawdata>
+
+ <!-- Idle radiobutton -->
+ <drawdata id = 'radiobutton_default' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal'
+ vertical_align = 'center'
+ horizontal_align = 'left'
+ />
+ <drawstep func = 'bitmap'
+ file = 'radiobutton_empty.bmp'
+ />
+ </drawdata>
+
+ <!-- Selected radiobutton -->
+ <drawdata id = 'radiobutton_selected' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal'
+ vertical_align = 'center'
+ horizontal_align = 'left'
+ />
+ <drawstep func = 'bitmap'
+ file = 'radiobutton.bmp'
+ />
+ </drawdata>
+
+ <!-- Disabled radiobutton -->
+ <drawdata id = 'radiobutton_disabled' cache = 'false'>
+ <text font = 'text_default'
+ text_color = 'color_normal_disabled'
+ vertical_align = 'center'
+ horizontal_align = 'left'
+ />
+ <drawstep func = 'bitmap'
+ file = 'radiobutton_empty.bmp'
+ />
+ </drawdata>
+
+ <!-- Background of the list widget (the games list and the list in the choosers) -->
+ <!-- TODO: Have separate options for the games list (with gradient background) and the list in the choosers (without gradient) -->
+ <drawdata id = 'widget_default' cache = 'false'>
+ <drawstep func = 'roundedsq'
+ radius = '6'
+ stroke = '1'
+ fg_color = 'lightgray'
+ gradient_start = 'blandyellow'
+ gradient_end = 'xtrabrightred'
+ gradient_factor = '6'
+ fill = 'gradient'
+ bg_color = 'xtrabrightred'
+ shadow = '3'
+ />
+ </drawdata>
+
+ <drawdata id = 'widget_small' cache = 'false'>
+ <drawstep func = 'square'
+ stroke = '0'
+ gradient_start = 'blandyellow'
+ gradient_end = 'xtrabrightred'
+ gradient_factor = '6'
+ fill = 'gradient'
+ shadow = '3'
+ />
+ </drawdata>
+</render_info>
diff --git a/dists/bada/Res/scummmobile/scummmobile_layout.stx b/dists/bada/Res/scummmobile/scummmobile_layout.stx
new file mode 100644
index 0000000000..c2fdfc612d
--- /dev/null
+++ b/dists/bada/Res/scummmobile/scummmobile_layout.stx
@@ -0,0 +1,861 @@
+<?xml version = "1.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.
+ -
+ -->
+<layout_info resolution = 'y>399'>
+ <globals>
+ <def var = 'Line.Height' value = '16' />
+ <def var = 'Font.Height' value = '16' />
+
+ <def var = 'Padding.Bottom' value = '16' />
+ <def var = 'Padding.Left' value = '16' />
+ <def var = 'Padding.Right' value = '16' />
+ <def var = 'Padding.Top' value = '16' />
+
+ <def var = 'About.OuterBorder' value = '80'/>
+
+ <def var = 'ListWidget.hlLeftPadding' value = '0'/>
+ <def var = 'ListWidget.hlRightPadding' value = '0'/>
+
+ <def var = 'ShowLauncherLogo' value = '1'/>
+ <def var = 'ShowGlobalMenuLogo' value = '1'/>
+ <def var = 'ShowSearchPic' value = '1'/>
+
+ <def var = 'SaveLoadChooser.ExtInfo.Visible' value = '1'/>
+
+ <def var = 'KeyMapper.Spacing' value = '10'/>
+ <def var = 'KeyMapper.LabelWidth' value = '100'/>
+ <def var = 'KeyMapper.ButtonWidth' value = '80'/>
+
+ <def var = 'Tooltip.MaxWidth' value = '200'/>
+ <def var = 'Tooltip.XDelta' value = '24'/> <!-- basically cursor size -->
+ <def var = 'Tooltip.YDelta' value = '32'/>
+
+ <widget name = 'OptionsLabel'
+ size = '180, Globals.Line.Height'
+ textalign = 'right'
+ />
+ <widget name = 'SmallLabel'
+ size = '42, Globals.Line.Height'
+ />
+
+ <widget name = 'Button'
+ size = '148, 24'
+ />
+
+ <widget name = 'Slider'
+ size = '128, 18'
+ />
+ <widget name = 'PopUp'
+ size = '-1, 19'
+ />
+ <widget name = 'Checkbox'
+ size = '-1, Globals.Line.Height'
+ />
+ <widget name = 'Radiobutton'
+ size = '-1, Globals.Line.Height'
+ />
+ <widget name = 'ListWidget'
+ padding = '5, 0, 8, 0'
+ />
+ <widget name = 'PopUpWidget'
+ padding = '7, 5, 0, 0'
+ />
+ <widget name = 'EditTextWidget'
+ padding = '5, 5, 0, 0'
+ />
+ <widget name = 'Console'
+ padding = '7, 5, 5, 5'
+ />
+ <widget name = 'Scrollbar'
+ size = '15, 0'
+ />
+ <widget name = 'TabWidget.Tab'
+ size = '82, 27'
+ padding = '0, 0, 8, 0'
+ />
+
+ <widget name = 'TabWidget.Body'
+ padding = '0, 0, 0, 0'
+ />
+
+ <widget name = 'TabWidget.NavButton'
+ size = '15, 18'
+ padding = '0, 3, 4, 0'
+ />
+ </globals>
+
+ <dialog name = 'Launcher' overlays = 'screen'>
+ <layout type = 'vertical' center = 'true' padding = '23, 23, 8, 23'>
+ <widget name = 'Logo'
+ width = '287'
+ height = '80'
+ />
+ <layout type = 'horizontal' spacing = '5' padding = '10, 0, 0, 0'>
+ <widget name = 'SearchPic'
+ width = '16'
+ height = '17'
+ />
+ <widget name = 'Search'
+ width = '150'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'SearchClearButton'
+ height = 'Globals.Line.Height'
+ width = 'Globals.Line.Height'
+ />
+ <space />
+ <widget name = 'Version'
+ width = '400'
+ height = 'Globals.Line.Height'
+ textalign = 'center'
+ />
+ <space />
+ <space />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0'>
+ <widget name = 'GameList'/>
+ <layout type = 'vertical' padding = '10, 0, 0, 0'>
+ <widget name = 'StartButton'
+ type = 'Button'
+ />
+ <widget name = 'LoadGameButton'
+ type = 'Button'
+ />
+ <space size = '10' />
+ <widget name = 'AddGameButton'
+ type = 'Button'
+ />
+ <widget name = 'EditGameButton'
+ type = 'Button'
+ />
+ <widget name = 'RemoveGameButton'
+ type = 'Button'
+ />
+ <space size = '10' />
+ <widget name = 'OptionsButton'
+ type = 'Button'
+ />
+ <widget name = 'AboutButton'
+ type = 'Button'
+ />
+ <space size = '10' />
+ <widget name = 'QuitButton'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'Browser' overlays = 'Dialog.Launcher.GameList' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8'>
+ <widget name = 'Headline'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'Path'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'List'/>
+ <layout type = 'horizontal' padding = '0, 0, 16, 0'>
+ <widget name = 'Up'
+ type = 'Button'
+ />
+ <space/>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'Choose'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions' overlays = 'screen' shading = 'dim'>
+ <layout type = 'vertical' padding = '0, 0, 0, 0'>
+ <widget name = 'TabWidget'/>
+ <layout type = 'horizontal' padding = '16, 16, 16, 16'>
+ <space/>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'Ok'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions_Graphics' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'grModePopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'grModePopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'grRenderPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'grRenderPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <widget name = 'grAspectCheckbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'grFullscreenCheckbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'grDisableDitheringCheckbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'auMidiPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'auMidiPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'auOPLPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'auOPLPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'auSampleRatePopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'auSampleRatePopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
+ <widget name = 'subToggleDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'subToggleSpeechOnly'
+ type = 'Radiobutton'
+ />
+ <widget name = 'subToggleSubOnly'
+ type = 'Radiobutton'
+ />
+ <widget name = 'subToggleSubBoth'
+ type = 'Radiobutton'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
+ <widget name = 'subSubtitleSpeedDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'subSubtitleSpeedSlider'
+ type = 'Slider'
+ />
+ <widget name = 'subSubtitleSpeedLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions_Volume' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'horizontal' padding = '16, 16, 16, 16' spacing = '8'>
+ <layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'vcMusicText'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'vcMusicSlider'
+ type = 'Slider'
+ />
+ <widget name = 'vcMusicLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'vcSfxText'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'vcSfxSlider'
+ type = 'Slider'
+ />
+ <widget name = 'vcSfxLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'vcSpeechText'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'vcSpeechSlider'
+ type = 'Slider'
+ />
+ <widget name = 'vcSpeechLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ </layout>
+ <layout type = 'vertical' padding = '24, 0, 24, 0' center = 'true'>
+ <widget name = 'vcMuteCheckbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions_MIDI' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'auPrefGmPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'auPrefGmPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'mcFontButton'
+ type = 'Button'
+ />
+ <widget name = 'mcFontPath'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'mcFontClearButton'
+ height = 'Globals.Line.Height'
+ width = 'Globals.Line.Height'
+ />
+ </layout>
+ <widget name = 'mcMixedCheckbox'
+ type = 'Checkbox'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'mcMidiGainText'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'mcMidiGainSlider'
+ type = 'Slider'
+ />
+ <widget name = 'mcMidiGainLabel'
+ width = '42'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions_MT32' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'auPrefMt32PopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'auPrefMt32Popup'
+ type = 'PopUp'
+ />
+ </layout>
+ <widget name = 'mcMt32Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'mcGSCheckbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions_Paths' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'SaveButton'
+ type = 'Button'
+ />
+ <widget name = 'SavePath'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'ThemeButton'
+ type = 'Button'
+ />
+ <widget name = 'ThemePath'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'ExtraButton'
+ type = 'Button'
+ />
+ <widget name = 'ExtraPath'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'PluginsButton'
+ type = 'Button'
+ />
+ <widget name = 'PluginsPath'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalOptions_Misc' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'ThemeButton'
+ type = 'Button'
+ />
+ <widget name = 'CurTheme'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'RendererPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'RendererPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'AutosavePeriodPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'AutosavePeriodPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'GuiLanguagePopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'GuiLanguagePopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <widget name='KeysButton'
+ type='Button'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name='KeysDialog' overlays='Dialog.GlobalOptions' shading='dim'>
+ <layout type='vertical' padding='8,8,8,8' center='true'>
+ <widget name='Action'
+ height='Globals.Line.Height'
+ />
+ <widget name='List'/>
+ <widget name='Mapping'
+ height='Globals.Line.Height'
+ />
+ <space size='Globals.Line.Height'/>
+ <layout type='horizontal'>
+ <widget name='Map'
+ type='Button'
+ />
+ <space/>
+ <widget name='Cancel'
+ type='Button'
+ />
+ <widget name='Ok'
+ type='Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions' overlays = 'screen' shading = 'dim'>
+ <layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '16'>
+ <widget name = 'TabWidget'/>
+ <layout type = 'horizontal' padding = '16, 16, 16, 4'>
+ <space/>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'Ok'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions_Graphics' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <widget name = 'EnableTabCheckbox'
+ type = 'Checkbox'
+ />
+ <import layout = 'Dialog.GlobalOptions_Graphics' />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <widget name = 'EnableTabCheckbox'
+ type = 'Checkbox'
+ />
+ <import layout = 'Dialog.GlobalOptions_Audio' />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions_MIDI' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <widget name = 'EnableTabCheckbox'
+ type = 'Checkbox'
+ />
+ <import layout = 'Dialog.GlobalOptions_MIDI' />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions_MT32' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <widget name = 'EnableTabCheckbox'
+ type = 'Checkbox'
+ />
+ <import layout = 'Dialog.GlobalOptions_MT32' />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions_Volume' overlays = 'Dialog.GlobalOptions.TabWidget'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
+ <widget name = 'EnableTabCheckbox'
+ type = 'Checkbox'
+ />
+ <import layout = 'Dialog.GlobalOptions_Volume' />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions_Game' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16'>
+ <layout type = 'horizontal' padding = '4, 4, 4, 4' spacing = '10' center = 'true'>
+ <widget name = 'Id'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'Domain'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '4, 4, 4, 4' spacing = '10' center = 'true'>
+ <widget name = 'Name'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'Desc'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '4, 4, 4, 4' spacing = '10' center = 'true'>
+ <widget name = 'LangPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'LangPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '4, 4, 4, 4' spacing = '10' center = 'true'>
+ <widget name = 'PlatformPopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'PlatformPopup'
+ type = 'PopUp'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GameOptions_Paths' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '16' center = 'true'>
+ <widget name = 'Savepath'
+ type = 'Button'
+ />
+ <widget name = 'SavepathText'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '16' center = 'true'>
+ <widget name = 'Extrapath'
+ type = 'Button'
+ />
+ <widget name = 'ExtrapathText'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '16' center = 'true'>
+ <widget name = 'Gamepath'
+ type = 'Button'
+ />
+ <widget name = 'GamepathText'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalMenu' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16' center = 'true'>
+ <widget name = 'Logo'
+ width = '240'
+ height = '40'
+ />
+ <widget name = 'Version'
+ width = '240'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'Resume'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ <space size = '10'/>
+ <widget name = 'Load'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'Save'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ <space size = '10'/>
+ <widget name = 'Options'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'Help'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'About'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ <space size = '10'/>
+ <widget name = 'RTL'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'Quit'
+ width = '190'
+ height = 'Globals.Button.Height'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name = 'GlobalConfig' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '8'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0'>
+ <layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '8' center = 'true'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'vcMusicText'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'vcMusicSlider'
+ type = 'Slider'
+ />
+ <widget name = 'vcMusicLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'vcSfxText'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'vcSfxSlider'
+ type = 'Slider'
+ />
+ <widget name = 'vcSfxLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'vcSpeechText'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'vcSpeechSlider'
+ type = 'Slider'
+ />
+ <widget name = 'vcSpeechLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ </layout>
+
+ <layout type = 'vertical' padding = '24, 24, 24, 24' center = 'true'>
+ <widget name = 'vcMuteCheckbox'
+ type = 'Checkbox'
+ width = '120' <!-- FIXME: Why this is needed? -->
+ />
+ </layout>
+ </layout>
+ <space size = '8' />
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
+ <widget name = 'subToggleDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'subToggleSpeechOnly'
+ type = 'Radiobutton'
+ width = '100'
+ />
+ <widget name = 'subToggleSubOnly'
+ type = 'Radiobutton'
+ width = '100'
+ />
+ <widget name = 'subToggleSubBoth'
+ type = 'Radiobutton'
+ width = '100'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
+ <widget name = 'subSubtitleSpeedDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'subSubtitleSpeedSlider'
+ type = 'Slider'
+ />
+ <widget name = 'subSubtitleSpeedLabel'
+ type = 'SmallLabel'
+ />
+ </layout>
+ <space size = '60'/>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
+ <widget name='Keys'
+ type='Button'
+ />
+ <space size = 'Globals.Button.Width' />
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'Ok'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'SaveLoadChooser' overlays = 'screen' inset = '8' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 32' center = 'true'>
+ <widget name = 'Title'
+ height = 'Globals.Line.Height'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 0, 16' spacing = '16'>
+ <widget name = 'List' />
+ <widget name = 'Thumbnail'
+ width = '180'
+ height = '200'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0'>
+ <space/>
+ <widget name = 'Delete'
+ type = 'Button'
+ />
+ <space size = '32'/>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'Choose'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'ScummHelp' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'>
+ <widget name = 'Title'
+ width = '320'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'HelpText'
+ height = '220'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 16, 0'>
+ <widget name = 'Prev'
+ type = 'Button'
+ />
+ <widget name = 'Next'
+ type = 'Button'
+ />
+ <space size = '32'/>
+ <widget name = 'Close'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'MassAdd' overlays = 'screen_center' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 32, 8' center = 'true'>
+ <widget name = 'DirProgressText'
+ width = '480'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'GameProgressText'
+ width = '480'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'GameList'
+ width = '480'
+ height = '250'
+ />
+ <layout type = 'horizontal' padding = '8, 8, 8, 8'>
+ <widget name = 'Ok'
+ type = 'Button'
+ />
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'KeyMapper' overlays = 'screen_center' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 32, 8' spacing = '10' center = 'true'>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'PopupDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'Popup'
+ type = 'PopUp'
+ width = '400'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
+ <widget name = 'KeymapArea'
+ width = '600'
+ height = '280'
+ />
+ <widget name = 'Close'
+ type = 'Button'
+ />
+ </layout>
+ </dialog>
+</layout_info>
diff --git a/dists/bada/Res/scummmobile/search.bmp b/dists/bada/Res/scummmobile/search.bmp
new file mode 100644
index 0000000000..fa963f8f16
--- /dev/null
+++ b/dists/bada/Res/scummmobile/search.bmp
Binary files differ
diff --git a/dists/bada/Res/vkeybd_bada/lowercase-symbols800x399.bmp b/dists/bada/Res/vkeybd_bada/lowercase-symbols800x399.bmp
new file mode 100644
index 0000000000..a6ad7c486d
--- /dev/null
+++ b/dists/bada/Res/vkeybd_bada/lowercase-symbols800x399.bmp
Binary files differ
diff --git a/dists/bada/Res/vkeybd_bada/lowercase800x399.bmp b/dists/bada/Res/vkeybd_bada/lowercase800x399.bmp
new file mode 100644
index 0000000000..b63061bff7
--- /dev/null
+++ b/dists/bada/Res/vkeybd_bada/lowercase800x399.bmp
Binary files differ
diff --git a/dists/bada/Res/vkeybd_bada/uppercase-symbols800x399.bmp b/dists/bada/Res/vkeybd_bada/uppercase-symbols800x399.bmp
new file mode 100644
index 0000000000..2d250a0335
--- /dev/null
+++ b/dists/bada/Res/vkeybd_bada/uppercase-symbols800x399.bmp
Binary files differ
diff --git a/dists/bada/Res/vkeybd_bada/uppercase800x399.bmp b/dists/bada/Res/vkeybd_bada/uppercase800x399.bmp
new file mode 100644
index 0000000000..0170321324
--- /dev/null
+++ b/dists/bada/Res/vkeybd_bada/uppercase800x399.bmp
Binary files differ
diff --git a/dists/bada/Res/vkeybd_bada/vkeybd_bada.xml b/dists/bada/Res/vkeybd_bada/vkeybd_bada.xml
new file mode 100644
index 0000000000..77d6bdb8a2
--- /dev/null
+++ b/dists/bada/Res/vkeybd_bada/vkeybd_bada.xml
@@ -0,0 +1,637 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<keyboard initial_mode="lowercase" v_align="bottom" h_align="center">
+ <!-- coords key = "start x, start y, end x, end y" -->
+ <!-- Lowercase -->
+ <mode name="lowercase" resolutions="800x399">
+ <layout resolution="800x399" bitmap="lowercase800x399.bmp" transparent_color="255,0,255">
+ <map>
+ <area shape="rect" coords="25,24,775,53" target="display_area"/>
+ <area shape="rect" coords="22,64,65,110" target="esc" />
+ <area shape="rect" coords="72,64,118,110" target="f1" />
+ <area shape="rect" coords="124,64,169,110" target="f2" />
+ <area shape="rect" coords="175,64,220,110" target="f3" />
+ <area shape="rect" coords="227,64,272,110" target="f4" />
+ <area shape="rect" coords="278,64,324,110" target="f5" />
+ <area shape="rect" coords="331,64,376,110" target="f6" />
+ <area shape="rect" coords="382,64,428,110" target="f7" />
+ <area shape="rect" coords="434,64,479,110" target="f8" />
+ <area shape="rect" coords="486,64,531,110" target="f9" />
+ <area shape="rect" coords="537,64,582,110" target="f10" />
+ <area shape="rect" coords="588,64,633,110" target="f11" />
+ <area shape="rect" coords="640,64,685,110" target="f12" />
+ <area shape="rect" coords="691,64,777,110" target="delete" />
+ <area shape="rect" coords="22,117,66,162" target="|" />
+ <area shape="rect" coords="71,117,117,162" target="1" />
+ <area shape="rect" coords="123,117,169,162" target="2" />
+ <area shape="rect" coords="174,117,220,162" target="3" />
+ <area shape="rect" coords="227,117,272,162" target="4" />
+ <area shape="rect" coords="278,117,323,162" target="5" />
+ <area shape="rect" coords="331,117,376,162" target="6" />
+ <area shape="rect" coords="382,117,428,162" target="7" />
+ <area shape="rect" coords="434,117,479,162" target="8" />
+ <area shape="rect" coords="486,117,531,162" target="9" />
+ <area shape="rect" coords="537,117,583,162" target="0" />
+ <area shape="rect" coords="588,117,633,162" target="-" />
+ <area shape="rect" coords="639,117,685,162" target="=" />
+ <area shape="rect" coords="691,117,746,162" target="backspace" />
+ <area shape="rect" coords="752,117,777,162" target="del" />
+ <area shape="rect" coords="22,170,86,215" target="tab" />
+ <area shape="rect" coords="92,170,138,215" target="q" />
+ <area shape="rect" coords="143,170,189,215" target="w" />
+ <area shape="rect" coords="196,170,241,215" target="e" />
+ <area shape="rect" coords="247,170,292,215" target="r" />
+ <area shape="rect" coords="300,170,345,215" target="t" />
+ <area shape="rect" coords="352,170,397,215" target="y" />
+ <area shape="rect" coords="403,170,448,215" target="u" />
+ <area shape="rect" coords="454,170,500,215" target="i" />
+ <area shape="rect" coords="507,170,552,215" target="o" />
+ <area shape="rect" coords="558,170,603,215" target="p" />
+ <area shape="rect" coords="610,170,655,215" target="[" />
+ <area shape="rect" coords="662,170,707,215" target="]" />
+ <area shape="rect" coords="713,170,777,215" target="#" />
+ <area shape="rect" coords="22,222,105,267" target="caps" />
+ <area shape="rect" coords="113,222,158,267" target="a" />
+ <area shape="rect" coords="165,222,210,267" target="s" />
+ <area shape="rect" coords="216,222,261,267" target="d" />
+ <area shape="rect" coords="268,222,314,267" target="f" />
+ <area shape="rect" coords="319,222,364,267" target="g" />
+ <area shape="rect" coords="372,222,417,267" target="h" />
+ <area shape="rect" coords="423,222,469,267" target="j" />
+ <area shape="rect" coords="476,222,521,267" target="k" />
+ <area shape="rect" coords="527,222,572,267" target="l" />
+ <area shape="rect" coords="579,222,624,267" target=";" />
+ <area shape="rect" coords="629,222,675,267" target="’" />
+ <area shape="rect" coords="681,222,777,267" target="enter" />
+ <area shape="rect" coords="22,275,125,320" target="shift" />
+ <area shape="rect" coords="146,274,192,320" target="z" />
+ <area shape="rect" coords="198,274,243,320" target="x" />
+ <area shape="rect" coords="250,274,295,320" target="c" />
+ <area shape="rect" coords="301,274,346,320" target="v" />
+ <area shape="rect" coords="353,274,397,320" target="b" />
+ <area shape="rect" coords="405,274,450,320" target="n" />
+ <area shape="rect" coords="456,274,501,320" target="m" />
+ <area shape="rect" coords="508,274,553,320" target="," />
+ <area shape="rect" coords="560,274,604,320" target="." />
+ <area shape="rect" coords="611,274,656,320" target="/" />
+ <area shape="rect" coords="677,275,777,320" target="symbols" />
+ <area shape="rect" coords="21,326,86,372" target="ctrl" />
+ <area shape="rect" coords="96,326,157,372" target="alt" />
+ <area shape="rect" coords="168,326,655,372" target="space" />
+ <area shape="rect" coords="671,326,719,372" target="ok" />
+ <area shape="rect" coords="731,326,778,372" target="cancel" />
+ </map>
+ </layout>
+ <event name="esc" type="key" code="27" ascii="27" modifiers="" />
+ <event name="f1" type="key" code="282" ascii="315" modifiers="" />
+ <event name="f2" type="key" code="283" ascii="316" modifiers="" />
+ <event name="f3" type="key" code="284" ascii="317" modifiers="" />
+ <event name="f4" type="key" code="285" ascii="318" modifiers="" />
+ <event name="f5" type="key" code="286" ascii="319" modifiers="" />
+ <event name="f6" type="key" code="287" ascii="320" modifiers="" />
+ <event name="f7" type="key" code="288" ascii="321" modifiers="" />
+ <event name="f8" type="key" code="289" ascii="322" modifiers="" />
+ <event name="f9" type="key" code="290" ascii="323" modifiers="" />
+ <event name="f10" type="key" code="291" ascii="324" modifiers="" />
+ <event name="f11" type="key" code="292" ascii="325" modifiers="" />
+ <event name="f12" type="key" code="293" ascii="326" modifiers="" />
+ <event name="del" type="key" code="127" ascii="0" modifiers="" />
+ <event name="ctrl" type="modifier" modifiers="ctrl" />
+ <event name="alt" type="modifier" modifiers="alt" />
+ <event name="shift" type="modifier" modifiers="shift" />
+ <event name="caps" type="switch_mode" mode="uppercase" />
+ <event name="symbols" type="switch_mode" mode="lowercasesymbols" />
+ <event name="backspace" type="key" code="8" ascii="8" modifiers="" />
+ <event name="enter" type="key" code="13" ascii="13" modifiers="" />
+ <event name="|" type="key" code="124" ascii="124" modifiers="" />
+ <event name="-" type="key" code="45" ascii="45" modifiers="" />
+ <event name="=" type="key" code="61" ascii="61" modifiers="" />
+ <event name="[" type="key" code="91" ascii="91" modifiers="" />
+ <event name="]" type="key" code="93" ascii="93" modifiers="" />
+ <event name="#" type="key" code="35" ascii="35" modifiers="" />
+ <event name=";" type="key" code="59" ascii="59" modifiers="" />
+ <event name="’" type="key" code="39" ascii="39" modifiers="" />
+ <event name="," type="key" code="44" ascii="44" modifiers="" />
+ <event name="." type="key" code="46" ascii="46" modifiers="" />
+ <event name="/" type="key" code="47" ascii="47" modifiers="" />
+ <event name="space" type="key" code="32" ascii="32" modifiers="" />
+ <event name="tab" type="key" code="9" ascii="9" modifiers="" />
+ <event name="a" type="key" code="97" ascii="97" modifiers="" />
+ <event name="b" type="key" code="98" ascii="98" modifiers="" />
+ <event name="c" type="key" code="99" ascii="99" modifiers="" />
+ <event name="d" type="key" code="100" ascii="100" modifiers="" />
+ <event name="e" type="key" code="101" ascii="101" modifiers="" />
+ <event name="f" type="key" code="102" ascii="102" modifiers="" />
+ <event name="g" type="key" code="103" ascii="103" modifiers="" />
+ <event name="h" type="key" code="104" ascii="104" modifiers="" />
+ <event name="i" type="key" code="105" ascii="105" modifiers="" />
+ <event name="j" type="key" code="106" ascii="106" modifiers="" />
+ <event name="k" type="key" code="107" ascii="107" modifiers="" />
+ <event name="l" type="key" code="108" ascii="108" modifiers="" />
+ <event name="m" type="key" code="109" ascii="109" modifiers="" />
+ <event name="n" type="key" code="110" ascii="110" modifiers="" />
+ <event name="o" type="key" code="111" ascii="111" modifiers="" />
+ <event name="p" type="key" code="112" ascii="112" modifiers="" />
+ <event name="q" type="key" code="113" ascii="113" modifiers="" />
+ <event name="r" type="key" code="114" ascii="114" modifiers="" />
+ <event name="s" type="key" code="115" ascii="115" modifiers="" />
+ <event name="t" type="key" code="116" ascii="116" modifiers="" />
+ <event name="u" type="key" code="117" ascii="117" modifiers="" />
+ <event name="v" type="key" code="118" ascii="118" modifiers="" />
+ <event name="w" type="key" code="119" ascii="119" modifiers="" />
+ <event name="x" type="key" code="120" ascii="120" modifiers="" />
+ <event name="y" type="key" code="121" ascii="121" modifiers="" />
+ <event name="z" type="key" code="122" ascii="122" modifiers="" />
+ <event name="0" type="key" code="48" ascii="48" modifiers="" />
+ <event name="1" type="key" code="49" ascii="49" modifiers="" />
+ <event name="2" type="key" code="50" ascii="50" modifiers="" />
+ <event name="3" type="key" code="51" ascii="51" modifiers="" />
+ <event name="4" type="key" code="52" ascii="52" modifiers="" />
+ <event name="5" type="key" code="53" ascii="53" modifiers="" />
+ <event name="6" type="key" code="54" ascii="54" modifiers="" />
+ <event name="7" type="key" code="55" ascii="55" modifiers="" />
+ <event name="8" type="key" code="56" ascii="56" modifiers="" />
+ <event name="9" type="key" code="57" ascii="57" modifiers="" />
+ <event name="ok" type="submit" />
+ <event name="cancel" type="cancel" />
+ <event name="quit" type="submit" />
+ <event name="delete" type="delete" />
+ </mode>
+
+ <!-- Uppercase -->
+ <mode name="uppercase" resolutions="800x399">
+ <layout resolution="800x399" bitmap="uppercase800x399.bmp" transparent_color="255,0,255">
+ <map>
+ <area shape="rect" coords="25,24,775,53" target="display_area"/>
+ <area shape="rect" coords="22,64,65,110" target="esc" />
+ <area shape="rect" coords="72,64,118,110" target="f1" />
+ <area shape="rect" coords="124,64,169,110" target="f2" />
+ <area shape="rect" coords="175,64,220,110" target="f3" />
+ <area shape="rect" coords="227,64,272,110" target="f4" />
+ <area shape="rect" coords="278,64,324,110" target="f5" />
+ <area shape="rect" coords="331,64,376,110" target="f6" />
+ <area shape="rect" coords="382,64,428,110" target="f7" />
+ <area shape="rect" coords="434,64,479,110" target="f8" />
+ <area shape="rect" coords="486,64,531,110" target="f9" />
+ <area shape="rect" coords="537,64,582,110" target="f10" />
+ <area shape="rect" coords="588,64,633,110" target="f11" />
+ <area shape="rect" coords="640,64,685,110" target="f12" />
+ <area shape="rect" coords="691,64,777,110" target="delete" />
+ <area shape="rect" coords="22,117,66,162" target="|" />
+ <area shape="rect" coords="71,117,117,162" target="1" />
+ <area shape="rect" coords="123,117,169,162" target="2" />
+ <area shape="rect" coords="174,117,220,162" target="3" />
+ <area shape="rect" coords="227,117,272,162" target="4" />
+ <area shape="rect" coords="278,117,323,162" target="5" />
+ <area shape="rect" coords="331,117,376,162" target="6" />
+ <area shape="rect" coords="382,117,428,162" target="7" />
+ <area shape="rect" coords="434,117,479,162" target="8" />
+ <area shape="rect" coords="486,117,531,162" target="9" />
+ <area shape="rect" coords="537,117,583,162" target="0" />
+ <area shape="rect" coords="588,117,633,162" target="-" />
+ <area shape="rect" coords="639,117,685,162" target="=" />
+ <area shape="rect" coords="691,117,746,162" target="backspace" />
+ <area shape="rect" coords="752,117,777,162" target="del" />
+ <area shape="rect" coords="22,170,86,215" target="tab" />
+ <area shape="rect" coords="92,170,138,215" target="Q" />
+ <area shape="rect" coords="143,170,189,215" target="W" />
+ <area shape="rect" coords="196,170,241,215" target="E" />
+ <area shape="rect" coords="247,170,292,215" target="R" />
+ <area shape="rect" coords="300,170,345,215" target="T" />
+ <area shape="rect" coords="352,170,397,215" target="Y" />
+ <area shape="rect" coords="403,170,448,215" target="U" />
+ <area shape="rect" coords="454,170,500,215" target="I" />
+ <area shape="rect" coords="507,170,552,215" target="O" />
+ <area shape="rect" coords="558,170,603,215" target="P" />
+ <area shape="rect" coords="610,170,655,215" target="[" />
+ <area shape="rect" coords="662,170,707,215" target="]" />
+ <area shape="rect" coords="713,170,777,215" target="#" />
+ <area shape="rect" coords="22,222,105,267" target="caps" />
+ <area shape="rect" coords="113,222,158,267" target="A" />
+ <area shape="rect" coords="165,222,210,267" target="S" />
+ <area shape="rect" coords="216,222,261,267" target="D" />
+ <area shape="rect" coords="268,222,314,267" target="F" />
+ <area shape="rect" coords="319,222,364,267" target="G" />
+ <area shape="rect" coords="372,222,417,267" target="H" />
+ <area shape="rect" coords="423,222,469,267" target="J" />
+ <area shape="rect" coords="476,222,521,267" target="K" />
+ <area shape="rect" coords="527,222,572,267" target="L" />
+ <area shape="rect" coords="579,222,624,267" target=";" />
+ <area shape="rect" coords="629,222,675,267" target="’" />
+ <area shape="rect" coords="681,222,777,267" target="enter" />
+ <area shape="rect" coords="22,275,125,320" target="shift" />
+ <area shape="rect" coords="146,274,192,320" target="Z" />
+ <area shape="rect" coords="198,274,243,320" target="X" />
+ <area shape="rect" coords="250,274,295,320" target="C" />
+ <area shape="rect" coords="301,274,346,320" target="V" />
+ <area shape="rect" coords="353,274,397,320" target="B" />
+ <area shape="rect" coords="405,274,450,320" target="N" />
+ <area shape="rect" coords="456,274,501,320" target="M" />
+ <area shape="rect" coords="508,274,553,320" target="," />
+ <area shape="rect" coords="560,274,604,320" target="." />
+ <area shape="rect" coords="611,274,656,320" target="/" />
+ <area shape="rect" coords="677,275,777,320" target="symbols" />
+ <area shape="rect" coords="21,326,86,372" target="ctrl" />
+ <area shape="rect" coords="96,326,157,372" target="alt" />
+ <area shape="rect" coords="168,326,655,372" target="space" />
+ <area shape="rect" coords="671,326,719,372" target="ok" />
+ <area shape="rect" coords="731,326,778,372" target="cancel" />
+ </map>
+ </layout>
+ <event name="esc" type="key" code="27" ascii="27" modifiers="" />
+ <event name="f1" type="key" code="282" ascii="315" modifiers="" />
+ <event name="f2" type="key" code="283" ascii="316" modifiers="" />
+ <event name="f3" type="key" code="284" ascii="317" modifiers="" />
+ <event name="f4" type="key" code="285" ascii="318" modifiers="" />
+ <event name="f5" type="key" code="286" ascii="319" modifiers="" />
+ <event name="f6" type="key" code="287" ascii="320" modifiers="" />
+ <event name="f7" type="key" code="288" ascii="321" modifiers="" />
+ <event name="f8" type="key" code="289" ascii="322" modifiers="" />
+ <event name="f9" type="key" code="290" ascii="323" modifiers="" />
+ <event name="f10" type="key" code="291" ascii="324" modifiers="" />
+ <event name="f11" type="key" code="292" ascii="325" modifiers="" />
+ <event name="f12" type="key" code="293" ascii="326" modifiers="" />
+ <event name="del" type="key" code="127" ascii="0" modifiers="" />
+ <event name="ctrl" type="modifier" modifiers="ctrl" />
+ <event name="alt" type="modifier" modifiers="alt" />
+ <event name="shift" type="modifier" modifiers="shift" />
+ <event name="caps" type="switch_mode" mode="lowercase" />
+ <event name="symbols" type="switch_mode" mode="uppercasesymbols" />
+ <event name="backspace" type="key" code="8" ascii="8" modifiers="" />
+ <event name="enter" type="key" code="13" ascii="13" modifiers="" />
+ <event name="|" type="key" code="124" ascii="124" modifiers="" />
+ <event name="-" type="key" code="45" ascii="45" modifiers="" />
+ <event name="=" type="key" code="61" ascii="61" modifiers="" />
+ <event name="[" type="key" code="91" ascii="91" modifiers="" />
+ <event name="]" type="key" code="93" ascii="93" modifiers="" />
+ <event name="#" type="key" code="35" ascii="35" modifiers="" />
+ <event name=";" type="key" code="59" ascii="59" modifiers="" />
+ <event name="’" type="key" code="39" ascii="39" modifiers="" />
+ <event name="," type="key" code="44" ascii="44" modifiers="" />
+ <event name="." type="key" code="46" ascii="46" modifiers="" />
+ <event name="/" type="key" code="47" ascii="47" modifiers="" />
+ <event name="space" type="key" code="32" ascii="32" modifiers="" />
+ <event name="tab" type="key" code="9" ascii="9" modifiers="" />
+ <event name="A" type="key" code="97" ascii="65" modifiers="shift" />
+ <event name="B" type="key" code="98" ascii="66" modifiers="shift" />
+ <event name="C" type="key" code="99" ascii="67" modifiers="shift" />
+ <event name="D" type="key" code="100" ascii="68" modifiers="shift" />
+ <event name="E" type="key" code="101" ascii="69" modifiers="shift" />
+ <event name="F" type="key" code="102" ascii="70" modifiers="shift" />
+ <event name="G" type="key" code="103" ascii="71" modifiers="shift" />
+ <event name="H" type="key" code="104" ascii="72" modifiers="shift" />
+ <event name="I" type="key" code="105" ascii="73" modifiers="shift" />
+ <event name="J" type="key" code="106" ascii="74" modifiers="shift" />
+ <event name="K" type="key" code="107" ascii="75" modifiers="shift" />
+ <event name="L" type="key" code="108" ascii="76" modifiers="shift" />
+ <event name="M" type="key" code="109" ascii="77" modifiers="shift" />
+ <event name="N" type="key" code="110" ascii="78" modifiers="shift" />
+ <event name="O" type="key" code="111" ascii="79" modifiers="shift" />
+ <event name="P" type="key" code="112" ascii="80" modifiers="shift" />
+ <event name="Q" type="key" code="113" ascii="81" modifiers="shift" />
+ <event name="R" type="key" code="114" ascii="82" modifiers="shift" />
+ <event name="S" type="key" code="115" ascii="83" modifiers="shift" />
+ <event name="T" type="key" code="116" ascii="84" modifiers="shift" />
+ <event name="U" type="key" code="117" ascii="85" modifiers="shift" />
+ <event name="V" type="key" code="118" ascii="86" modifiers="shift" />
+ <event name="W" type="key" code="119" ascii="87" modifiers="shift" />
+ <event name="X" type="key" code="120" ascii="88" modifiers="shift" />
+ <event name="Y" type="key" code="121" ascii="89" modifiers="shift" />
+ <event name="Z" type="key" code="122" ascii="90" modifiers="shift" />
+ <event name="0" type="key" code="48" ascii="48" modifiers="" />
+ <event name="1" type="key" code="49" ascii="49" modifiers="" />
+ <event name="2" type="key" code="50" ascii="50" modifiers="" />
+ <event name="3" type="key" code="51" ascii="51" modifiers="" />
+ <event name="4" type="key" code="52" ascii="52" modifiers="" />
+ <event name="5" type="key" code="53" ascii="53" modifiers="" />
+ <event name="6" type="key" code="54" ascii="54" modifiers="" />
+ <event name="7" type="key" code="55" ascii="55" modifiers="" />
+ <event name="8" type="key" code="56" ascii="56" modifiers="" />
+ <event name="9" type="key" code="57" ascii="57" modifiers="" />
+ <event name="ok" type="submit" />
+ <event name="cancel" type="cancel" />
+ <event name="quit" type="submit" />
+ <event name="delete" type="delete" />
+ </mode>
+
+ <!-- Lowercase Symbols -->
+ <mode name="lowercasesymbols" resolutions="800x399">
+ <layout resolution="800x399" bitmap="lowercase-symbols800x399.bmp" transparent_color="255,0,255">
+ <map>
+ <area shape="rect" coords="25,24,775,53" target="display_area"/>
+ <area shape="rect" coords="22,64,65,110" target="esc" />
+ <area shape="rect" coords="72,64,118,110" target="f1" />
+ <area shape="rect" coords="124,64,169,110" target="f2" />
+ <area shape="rect" coords="175,64,220,110" target="f3" />
+ <area shape="rect" coords="227,64,272,110" target="f4" />
+ <area shape="rect" coords="278,64,324,110" target="f5" />
+ <area shape="rect" coords="331,64,376,110" target="f6" />
+ <area shape="rect" coords="382,64,428,110" target="f7" />
+ <area shape="rect" coords="434,64,479,110" target="f8" />
+ <area shape="rect" coords="486,64,531,110" target="f9" />
+ <area shape="rect" coords="537,64,582,110" target="f10" />
+ <area shape="rect" coords="588,64,633,110" target="f11" />
+ <area shape="rect" coords="640,64,685,110" target="f12" />
+ <area shape="rect" coords="691,64,777,110" target="delete" />
+ <area shape="rect" coords="22,117,66,162" target="¬" />
+ <area shape="rect" coords="71,117,117,162" target="!" />
+ <area shape="rect" coords="123,117,169,162" target="quote" />
+ <area shape="rect" coords="174,117,220,162" target="£" />
+ <area shape="rect" coords="227,117,272,162" target="$" />
+ <area shape="rect" coords="278,117,323,162" target="%" />
+ <area shape="rect" coords="331,117,376,162" target="^" />
+ <area shape="rect" coords="382,117,428,162" target="&amp;" />
+ <area shape="rect" coords="434,117,479,162" target="*" />
+ <area shape="rect" coords="486,117,531,162" target="(" />
+ <area shape="rect" coords="537,117,583,162" target=")" />
+ <area shape="rect" coords="588,117,633,162" target="_" />
+ <area shape="rect" coords="639,117,685,162" target="+" />
+ <area shape="rect" coords="691,117,746,162" target="backspace" />
+ <area shape="rect" coords="752,117,777,162" target="del" />
+ <area shape="rect" coords="22,170,86,215" target="tab" />
+ <area shape="rect" coords="92,170,138,215" target="q" />
+ <area shape="rect" coords="143,170,189,215" target="w" />
+ <area shape="rect" coords="196,170,241,215" target="e" />
+ <area shape="rect" coords="247,170,292,215" target="r" />
+ <area shape="rect" coords="300,170,345,215" target="t" />
+ <area shape="rect" coords="352,170,397,215" target="y" />
+ <area shape="rect" coords="403,170,448,215" target="u" />
+ <area shape="rect" coords="454,170,500,215" target="i" />
+ <area shape="rect" coords="507,170,552,215" target="o" />
+ <area shape="rect" coords="558,170,603,215" target="p" />
+ <area shape="rect" coords="610,170,655,215" target="{" />
+ <area shape="rect" coords="662,170,707,215" target="}" />
+ <area shape="rect" coords="713,170,777,215" target="~" />
+ <area shape="rect" coords="22,222,105,267" target="caps" />
+ <area shape="rect" coords="113,222,158,267" target="a" />
+ <area shape="rect" coords="165,222,210,267" target="s" />
+ <area shape="rect" coords="216,222,261,267" target="d" />
+ <area shape="rect" coords="268,222,314,267" target="f" />
+ <area shape="rect" coords="319,222,364,267" target="g" />
+ <area shape="rect" coords="372,222,417,267" target="h" />
+ <area shape="rect" coords="423,222,469,267" target="j" />
+ <area shape="rect" coords="476,222,521,267" target="k" />
+ <area shape="rect" coords="527,222,572,267" target="l" />
+ <area shape="rect" coords="579,222,624,267" target=":" />
+ <area shape="rect" coords="629,222,675,267" target="@" />
+ <area shape="rect" coords="681,222,777,267" target="enter" />
+ <area shape="rect" coords="22,275,125,320" target="shift" />
+ <area shape="rect" coords="146,274,192,320" target="z" />
+ <area shape="rect" coords="198,274,243,320" target="x" />
+ <area shape="rect" coords="250,274,295,320" target="c" />
+ <area shape="rect" coords="301,274,346,320" target="v" />
+ <area shape="rect" coords="353,274,397,320" target="b" />
+ <area shape="rect" coords="405,274,450,320" target="n" />
+ <area shape="rect" coords="456,274,501,320" target="m" />
+ <area shape="rect" coords="508,274,553,320" target="&lt;" />
+ <area shape="rect" coords="560,274,604,320" target="&gt;" />
+ <area shape="rect" coords="611,274,656,320" target="?" />
+ <area shape="rect" coords="677,275,777,320" target="symbols" />
+ <area shape="rect" coords="21,326,86,372" target="ctrl" />
+ <area shape="rect" coords="96,326,157,372" target="alt" />
+ <area shape="rect" coords="168,326,655,372" target="space" />
+ <area shape="rect" coords="671,326,719,372" target="ok" />
+ <area shape="rect" coords="731,326,778,372" target="cancel" />
+ </map>
+ </layout>
+ <event name="esc" type="key" code="27" ascii="27" modifiers="" />
+ <event name="f1" type="key" code="282" ascii="315" modifiers="" />
+ <event name="f2" type="key" code="283" ascii="316" modifiers="" />
+ <event name="f3" type="key" code="284" ascii="317" modifiers="" />
+ <event name="f4" type="key" code="285" ascii="318" modifiers="" />
+ <event name="f5" type="key" code="286" ascii="319" modifiers="" />
+ <event name="f6" type="key" code="287" ascii="320" modifiers="" />
+ <event name="f7" type="key" code="288" ascii="321" modifiers="" />
+ <event name="f8" type="key" code="289" ascii="322" modifiers="" />
+ <event name="f9" type="key" code="290" ascii="323" modifiers="" />
+ <event name="f10" type="key" code="291" ascii="324" modifiers="" />
+ <event name="f11" type="key" code="292" ascii="325" modifiers="" />
+ <event name="f12" type="key" code="293" ascii="326" modifiers="" />
+ <event name="del" type="key" code="127" ascii="0" modifiers="" />
+ <event name="ctrl" type="modifier" modifiers="ctrl" />
+ <event name="alt" type="modifier" modifiers="alt" />
+ <event name="shift" type="modifier" modifiers="shift" />
+ <event name="symbols" type="switch_mode" mode="lowercase" />
+ <event name="caps" type="switch_mode" mode="uppercasesymbols" />
+ <event name="backspace" type="key" code="8" ascii="8" modifiers="" />
+ <event name="enter" type="key" code="13" ascii="13" modifiers="" />
+ <event name="quote" type="key" code="34" ascii="34" modifiers="" />
+ <event name="£" type="key" code="163" ascii="163" modifiers="" />
+ <event name="$" type="key" code="36" ascii="36" modifiers="" />
+ <event name="%" type="key" code="37" ascii="37" modifiers="" />
+ <event name="^" type="key" code="94" ascii="94" modifiers="" />
+ <event name="&amp;" type="key" code="38" ascii="38" modifiers="" />
+ <event name="*" type="key" code="42" ascii="42" modifiers="" />
+ <event name="(" type="key" code="40" ascii="40" modifiers="" />
+ <event name=")" type="key" code="41" ascii="41" modifiers="" />
+ <event name="_" type="key" code="95" ascii="95" modifiers="" />
+ <event name="+" type="key" code="43" ascii="43" modifiers="" />
+ <event name="¬" type="key" code="172" ascii="172" modifiers="" />
+ <event name="!" type="key" code="33" ascii="33" modifiers="" />
+ <event name="{" type="key" code="123" ascii="123" modifiers="" />
+ <event name="}" type="key" code="125" ascii="125" modifiers="" />
+ <event name="~" type="key" code="126" ascii="126" modifiers="" />
+ <event name=":" type="key" code="58" ascii="58" modifiers="" />
+ <event name="@" type="key" code="64" ascii="64" modifiers="" />
+ <event name="&lt;" type="key" code="60" ascii="60" modifiers="" />
+ <event name="&gt;" type="key" code="62" ascii="62" modifiers="" />
+ <event name="?" type="key" code="63" ascii="63" modifiers="" />
+ <event name="space" type="key" code="32" ascii="32" modifiers="" />
+ <event name="tab" type="key" code="9" ascii="9" modifiers="" />
+ <event name="a" type="key" code="97" ascii="97" modifiers="" />
+ <event name="b" type="key" code="98" ascii="98" modifiers="" />
+ <event name="c" type="key" code="99" ascii="99" modifiers="" />
+ <event name="d" type="key" code="100" ascii="100" modifiers="" />
+ <event name="e" type="key" code="101" ascii="101" modifiers="" />
+ <event name="f" type="key" code="102" ascii="102" modifiers="" />
+ <event name="g" type="key" code="103" ascii="103" modifiers="" />
+ <event name="h" type="key" code="104" ascii="104" modifiers="" />
+ <event name="i" type="key" code="105" ascii="105" modifiers="" />
+ <event name="j" type="key" code="106" ascii="106" modifiers="" />
+ <event name="k" type="key" code="107" ascii="107" modifiers="" />
+ <event name="l" type="key" code="108" ascii="108" modifiers="" />
+ <event name="m" type="key" code="109" ascii="109" modifiers="" />
+ <event name="n" type="key" code="110" ascii="110" modifiers="" />
+ <event name="o" type="key" code="111" ascii="111" modifiers="" />
+ <event name="p" type="key" code="112" ascii="112" modifiers="" />
+ <event name="q" type="key" code="113" ascii="113" modifiers="" />
+ <event name="r" type="key" code="114" ascii="114" modifiers="" />
+ <event name="s" type="key" code="115" ascii="115" modifiers="" />
+ <event name="t" type="key" code="116" ascii="116" modifiers="" />
+ <event name="u" type="key" code="117" ascii="117" modifiers="" />
+ <event name="v" type="key" code="118" ascii="118" modifiers="" />
+ <event name="w" type="key" code="119" ascii="119" modifiers="" />
+ <event name="x" type="key" code="120" ascii="120" modifiers="" />
+ <event name="y" type="key" code="121" ascii="121" modifiers="" />
+ <event name="z" type="key" code="122" ascii="122" modifiers="" />
+ <event name="ok" type="submit" />
+ <event name="cancel" type="cancel" />
+ <event name="quit" type="submit" />
+ <event name="delete" type="delete" />
+ </mode>
+
+ <!-- Uppercase Symbols -->
+ <mode name="uppercasesymbols" resolutions="800x399">
+ <layout resolution="800x399" bitmap="uppercase-symbols800x399.bmp" transparent_color="255,0,255">
+ <map>
+ <area shape="rect" coords="25,24,775,53" target="display_area"/>
+ <area shape="rect" coords="22,64,65,110" target="esc" />
+ <area shape="rect" coords="72,64,118,110" target="f1" />
+ <area shape="rect" coords="124,64,169,110" target="f2" />
+ <area shape="rect" coords="175,64,220,110" target="f3" />
+ <area shape="rect" coords="227,64,272,110" target="f4" />
+ <area shape="rect" coords="278,64,324,110" target="f5" />
+ <area shape="rect" coords="331,64,376,110" target="f6" />
+ <area shape="rect" coords="382,64,428,110" target="f7" />
+ <area shape="rect" coords="434,64,479,110" target="f8" />
+ <area shape="rect" coords="486,64,531,110" target="f9" />
+ <area shape="rect" coords="537,64,582,110" target="f10" />
+ <area shape="rect" coords="588,64,633,110" target="f11" />
+ <area shape="rect" coords="640,64,685,110" target="f12" />
+ <area shape="rect" coords="691,64,777,110" target="delete" />
+ <area shape="rect" coords="22,117,66,162" target="¬" />
+ <area shape="rect" coords="71,117,117,162" target="!" />
+ <area shape="rect" coords="123,117,169,162" target="quote" />
+ <area shape="rect" coords="174,117,220,162" target="£" />
+ <area shape="rect" coords="227,117,272,162" target="$" />
+ <area shape="rect" coords="278,117,323,162" target="%" />
+ <area shape="rect" coords="331,117,376,162" target="^" />
+ <area shape="rect" coords="382,117,428,162" target="&amp;" />
+ <area shape="rect" coords="434,117,479,162" target="*" />
+ <area shape="rect" coords="486,117,531,162" target="(" />
+ <area shape="rect" coords="537,117,583,162" target=")" />
+ <area shape="rect" coords="588,117,633,162" target="_" />
+ <area shape="rect" coords="639,117,685,162" target="+" />
+ <area shape="rect" coords="691,117,746,162" target="backspace" />
+ <area shape="rect" coords="752,117,777,162" target="del" />
+ <area shape="rect" coords="22,170,86,215" target="tab" />
+ <area shape="rect" coords="92,170,138,215" target="Q" />
+ <area shape="rect" coords="143,170,189,215" target="W" />
+ <area shape="rect" coords="196,170,241,215" target="E" />
+ <area shape="rect" coords="247,170,292,215" target="R" />
+ <area shape="rect" coords="300,170,345,215" target="T" />
+ <area shape="rect" coords="352,170,397,215" target="Y" />
+ <area shape="rect" coords="403,170,448,215" target="U" />
+ <area shape="rect" coords="454,170,500,215" target="I" />
+ <area shape="rect" coords="507,170,552,215" target="O" />
+ <area shape="rect" coords="558,170,603,215" target="P" />
+ <area shape="rect" coords="610,170,655,215" target="{" />
+ <area shape="rect" coords="662,170,707,215" target="}" />
+ <area shape="rect" coords="713,170,777,215" target="~" />
+ <area shape="rect" coords="22,222,105,267" target="caps" />
+ <area shape="rect" coords="113,222,158,267" target="A" />
+ <area shape="rect" coords="165,222,210,267" target="S" />
+ <area shape="rect" coords="216,222,261,267" target="D" />
+ <area shape="rect" coords="268,222,314,267" target="F" />
+ <area shape="rect" coords="319,222,364,267" target="G" />
+ <area shape="rect" coords="372,222,417,267" target="H" />
+ <area shape="rect" coords="423,222,469,267" target="J" />
+ <area shape="rect" coords="476,222,521,267" target="K" />
+ <area shape="rect" coords="527,222,572,267" target="L" />
+ <area shape="rect" coords="579,222,624,267" target=":" />
+ <area shape="rect" coords="629,222,675,267" target="@" />
+ <area shape="rect" coords="681,222,777,267" target="enter" />
+ <area shape="rect" coords="22,275,125,320" target="shift" />
+ <area shape="rect" coords="146,274,192,320" target="Z" />
+ <area shape="rect" coords="198,274,243,320" target="X" />
+ <area shape="rect" coords="250,274,295,320" target="C" />
+ <area shape="rect" coords="301,274,346,320" target="V" />
+ <area shape="rect" coords="353,274,397,320" target="B" />
+ <area shape="rect" coords="405,274,450,320" target="N" />
+ <area shape="rect" coords="456,274,501,320" target="M" />
+ <area shape="rect" coords="508,274,553,320" target="&lt;" />
+ <area shape="rect" coords="560,274,604,320" target="&gt;" />
+ <area shape="rect" coords="611,274,656,320" target="?" />
+ <area shape="rect" coords="677,275,777,320" target="symbols" />
+ <area shape="rect" coords="21,326,86,372" target="ctrl" />
+ <area shape="rect" coords="96,326,157,372" target="alt" />
+ <area shape="rect" coords="168,326,655,372" target="space" />
+ <area shape="rect" coords="671,326,719,372" target="ok" />
+ <area shape="rect" coords="731,326,778,372" target="cancel" />
+ </map>
+ </layout>
+ <event name="esc" type="key" code="27" ascii="27" modifiers="" />
+ <event name="f1" type="key" code="282" ascii="315" modifiers="" />
+ <event name="f2" type="key" code="283" ascii="316" modifiers="" />
+ <event name="f3" type="key" code="284" ascii="317" modifiers="" />
+ <event name="f4" type="key" code="285" ascii="318" modifiers="" />
+ <event name="f5" type="key" code="286" ascii="319" modifiers="" />
+ <event name="f6" type="key" code="287" ascii="320" modifiers="" />
+ <event name="f7" type="key" code="288" ascii="321" modifiers="" />
+ <event name="f8" type="key" code="289" ascii="322" modifiers="" />
+ <event name="f9" type="key" code="290" ascii="323" modifiers="" />
+ <event name="f10" type="key" code="291" ascii="324" modifiers="" />
+ <event name="f11" type="key" code="292" ascii="325" modifiers="" />
+ <event name="f12" type="key" code="293" ascii="326" modifiers="" />
+ <event name="del" type="key" code="127" ascii="0" modifiers="" />
+ <event name="ctrl" type="modifier" modifiers="ctrl" />
+ <event name="alt" type="modifier" modifiers="alt" />
+ <event name="shift" type="switch_mode" mode="shiftlowercase" />
+ <event name="caps" type="switch_mode" mode="lowercasesymbols" />
+ <event name="symbols" type="switch_mode" mode="uppercase" />
+ <event name="backspace" type="key" code="8" ascii="8" modifiers="" />
+ <event name="enter" type="key" code="13" ascii="13" modifiers="" />
+ <event name="quote" type="key" code="34" ascii="34" modifiers="" />
+ <event name="£" type="key" code="163" ascii="163" modifiers="" />
+ <event name="$" type="key" code="36" ascii="36" modifiers="" />
+ <event name="%" type="key" code="37" ascii="37" modifiers="" />
+ <event name="^" type="key" code="94" ascii="94" modifiers="" />
+ <event name="&amp;" type="key" code="38" ascii="38" modifiers="" />
+ <event name="*" type="key" code="42" ascii="42" modifiers="" />
+ <event name="(" type="key" code="40" ascii="40" modifiers="" />
+ <event name=")" type="key" code="41" ascii="41" modifiers="" />
+ <event name="_" type="key" code="95" ascii="95" modifiers="" />
+ <event name="+" type="key" code="43" ascii="43" modifiers="" />
+ <event name="¬" type="key" code="172" ascii="172" modifiers="" />
+ <event name="!" type="key" code="33" ascii="33" modifiers="" />
+ <event name="{" type="key" code="123" ascii="123" modifiers="" />
+ <event name="}" type="key" code="125" ascii="125" modifiers="" />
+ <event name="~" type="key" code="126" ascii="126" modifiers="" />
+ <event name=":" type="key" code="58" ascii="58" modifiers="" />
+ <event name="@" type="key" code="64" ascii="64" modifiers="" />
+ <event name="&lt;" type="key" code="60" ascii="60" modifiers="" />
+ <event name="&gt;" type="key" code="62" ascii="62" modifiers="" />
+ <event name="?" type="key" code="63" ascii="63" modifiers="" />
+ <event name="space" type="key" code="32" ascii="32" modifiers="" />
+ <event name="tab" type="key" code="9" ascii="9" modifiers="" />
+ <event name="A" type="key" code="97" ascii="65" modifiers="shift" />
+ <event name="B" type="key" code="98" ascii="66" modifiers="shift" />
+ <event name="C" type="key" code="99" ascii="67" modifiers="shift" />
+ <event name="D" type="key" code="100" ascii="68" modifiers="shift" />
+ <event name="E" type="key" code="101" ascii="69" modifiers="shift" />
+ <event name="F" type="key" code="102" ascii="70" modifiers="shift" />
+ <event name="G" type="key" code="103" ascii="71" modifiers="shift" />
+ <event name="H" type="key" code="104" ascii="72" modifiers="shift" />
+ <event name="I" type="key" code="105" ascii="73" modifiers="shift" />
+ <event name="J" type="key" code="106" ascii="74" modifiers="shift" />
+ <event name="K" type="key" code="107" ascii="75" modifiers="shift" />
+ <event name="L" type="key" code="108" ascii="76" modifiers="shift" />
+ <event name="M" type="key" code="109" ascii="77" modifiers="shift" />
+ <event name="N" type="key" code="110" ascii="78" modifiers="shift" />
+ <event name="O" type="key" code="111" ascii="79" modifiers="shift" />
+ <event name="P" type="key" code="112" ascii="80" modifiers="shift" />
+ <event name="Q" type="key" code="113" ascii="81" modifiers="shift" />
+ <event name="R" type="key" code="114" ascii="82" modifiers="shift" />
+ <event name="S" type="key" code="115" ascii="83" modifiers="shift" />
+ <event name="T" type="key" code="116" ascii="84" modifiers="shift" />
+ <event name="U" type="key" code="117" ascii="85" modifiers="shift" />
+ <event name="V" type="key" code="118" ascii="86" modifiers="shift" />
+ <event name="W" type="key" code="119" ascii="87" modifiers="shift" />
+ <event name="X" type="key" code="120" ascii="88" modifiers="shift" />
+ <event name="Y" type="key" code="121" ascii="89" modifiers="shift" />
+ <event name="Z" type="key" code="122" ascii="90" modifiers="shift" />
+ <event name="0" type="key" code="48" ascii="48" modifiers="" />
+ <event name="1" type="key" code="49" ascii="49" modifiers="" />
+ <event name="2" type="key" code="50" ascii="50" modifiers="" />
+ <event name="3" type="key" code="51" ascii="51" modifiers="" />
+ <event name="4" type="key" code="52" ascii="52" modifiers="" />
+ <event name="5" type="key" code="53" ascii="53" modifiers="" />
+ <event name="6" type="key" code="54" ascii="54" modifiers="" />
+ <event name="7" type="key" code="55" ascii="55" modifiers="" />
+ <event name="8" type="key" code="56" ascii="56" modifiers="" />
+ <event name="9" type="key" code="57" ascii="57" modifiers="" />
+ <event name="ok" type="submit" />
+ <event name="cancel" type="cancel" />
+ <event name="quit" type="submit" />
+ <event name="delete" type="delete" />
+ </mode>
+</keyboard>
diff --git a/dists/engine-data/README b/dists/engine-data/README
index 7ccc52e5c8..ce74d590d9 100644
--- a/dists/engine-data/README
+++ b/dists/engine-data/README
@@ -21,4 +21,4 @@ sky.cpt:
TODO
toon.dat:
-'toon.dat' contains all the strings hardcoded in the original executables. \ No newline at end of file
+'toon.dat' contains all the strings hardcoded in the original executables.
diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat
index 1d79ceddfd..902d55c457 100644
--- a/dists/engine-data/kyra.dat
+++ b/dists/engine-data/kyra.dat
Binary files differ
diff --git a/dists/iphone/Info.plist b/dists/iphone/Info.plist
index e57989a7c3..e25cee51ea 100644
--- a/dists/iphone/Info.plist
+++ b/dists/iphone/Info.plist
@@ -15,11 +15,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
- <string>1.4.0git</string>
+ <string>1.5.0git</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
- <string>1.4.0git</string>
+ <string>1.5.0git</string>
<key>CFBundleIconFile</key>
<string>icon.png</string>
<key>CFBundleIconFiles</key>
diff --git a/dists/irix/scummvm.spec b/dists/irix/scummvm.spec
index 141d37070f..2e099d94a8 100644
--- a/dists/irix/scummvm.spec
+++ b/dists/irix/scummvm.spec
@@ -1,5 +1,5 @@
product scummvm
- id "ScummVM 1.4.0git"
+ id "ScummVM 1.5.0git"
image sw
id "software"
version 18
diff --git a/dists/macosx/Info.plist b/dists/macosx/Info.plist
index 20081ccc80..a355ec1e62 100644
--- a/dists/macosx/Info.plist
+++ b/dists/macosx/Info.plist
@@ -4,12 +4,31 @@
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
+ <key>CFBundleLocalizations</key>
+ <array>
+ <string>en</string>
+ <string>ca</string>
+ <string>cs</string>
+ <string>da</string>
+ <string>de</string>
+ <string>es</string>
+ <string>fr</string>
+ <string>hu</string>
+ <string>it</string>
+ <string>nb</string>
+ <string>nn</string>
+ <string>pl</string>
+ <string>pt</string>
+ <string>ru</string>
+ <string>se</string>
+ <string>uk</string>
+ </array>
<key>CFBundleDisplayName</key>
<string>ScummVM</string>
<key>CFBundleExecutable</key>
<string>scummvm</string>
<key>CFBundleGetInfoString</key>
- <string>1.4.0git, Copyright 2001-2011 The ScummVM team</string>
+ <string>1.5.0git, Copyright 2001-2011 The ScummVM team</string>
<key>CFBundleIconFile</key>
<string>scummvm.icns</string>
<key>CFBundleIdentifier</key>
@@ -21,12 +40,16 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
- <string>1.4.0git</string>
+ <string>1.5.0git</string>
<key>CFBundleVersion</key>
- <string>1.4.0git</string>
+ <string>1.5.0git</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright 2001-2011 The ScummVM team</string>
+ <key>SUFeedURL</key>
+ <string>http://www.scummvm.org/appcasts/macosx/release.xml</string>
+ <key>SUPublicDSAKeyFile</key>
+ <string>dsa_pub.pem</string>
</dict>
</plist>
diff --git a/dists/macosx/Info.plist.in b/dists/macosx/Info.plist.in
index 3ba5a080f0..b251f32509 100644
--- a/dists/macosx/Info.plist.in
+++ b/dists/macosx/Info.plist.in
@@ -4,6 +4,25 @@
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
+ <key>CFBundleLocalizations</key>
+ <array>
+ <string>en</string>
+ <string>ca</string>
+ <string>cs</string>
+ <string>da</string>
+ <string>de</string>
+ <string>es</string>
+ <string>fr</string>
+ <string>hu</string>
+ <string>it</string>
+ <string>nb</string>
+ <string>nn</string>
+ <string>pl</string>
+ <string>pt</string>
+ <string>ru</string>
+ <string>se</string>
+ <string>uk</string>
+ </array>
<key>CFBundleDisplayName</key>
<string>ScummVM</string>
<key>CFBundleExecutable</key>
@@ -28,5 +47,9 @@
<string>NSApplication</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright 2001-2011 The ScummVM team</string>
+ <key>SUFeedURL</key>
+ <string>http://www.scummvm.org/appcasts/macosx/release.xml</string>
+ <key>SUPublicDSAKeyFile</key>
+ <string>dsa_pub.pem</string>
</dict>
</plist>
diff --git a/dists/macosx/scummvm_osx_appcast.xml b/dists/macosx/scummvm_osx_appcast.xml
new file mode 100755
index 0000000000..455b062b6b
--- /dev/null
+++ b/dists/macosx/scummvm_osx_appcast.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <channel>
+ <title>ScummVM Changelog</title>
+ <link>http://scummvm.org/scummvm_appcast.xml</link>
+ <description>Most recent changes with links to updates.</description>
+ <language>en</language>
+ <item>
+ <title>Version 1.2.1 (3 bugs fixed; 2 new features)</title>
+ <sparkle:releaseNotesLink>
+ http://sourceforge.net/projects/scummvm/files/scummvm/1.2.1/ReleaseNotes/view
+ </sparkle:releaseNotesLink>
+ <pubDate>Sun, 19 Dec 2010 12:20:11 +0000</pubDate>
+ <enclosure url="http://scummvm.org/ScummVM 1.2.1-Test.zip" sparkle:version="1.2.1" length="1472893" type="application/octet-stream" sparkle:dsaSignature="234818feCa1JyW30nbkBwainOzrN6EQuAh" />
+ </item>
+ <item>
+ <title>Version 1.2.0</title>
+ <sparkle:releaseNotesLink>
+ http://sourceforge.net/projects/scummvm/files/scummvm/1.2.0/ReleaseNotes/view
+ </sparkle:releaseNotesLink>
+ <pubDate>Fri, 15 Oct 2010 12:20:11 +0000</pubDate>
+ <enclosure url="http://scummvm.org/ScummVM 1.2.0-Test.zip" sparkle:version="1.2.0" length="1472893" type="application/octet-stream" sparkle:dsaSignature="234818feCa1JyW30nbkBwainOzrN6EQuAh" />
+ </item>
+ </channel>
+</rss>
diff --git a/dists/maemo/scummvm.servicewrapper b/dists/maemo/scummvm.servicewrapper
index 04909d03f9..733f6db6f3 100644
--- a/dists/maemo/scummvm.servicewrapper
+++ b/dists/maemo/scummvm.servicewrapper
@@ -9,4 +9,3 @@ export SCUMMVM_MAEMO_DEVICE=$(awk '/^product/ { print $2;}' /proc/component_vers
[ -x ${0}.bin ] && ${0}.bin "$@"
# optified binary
[ -x /opt/scummvm/bin/scummvm ] && /opt/scummvm/bin/scummvm "$@"
-
diff --git a/dists/motomagx/mgx/readme-motomagx-mgx.txt b/dists/motomagx/mgx/readme-motomagx-mgx.txt
index 16f18bb632..9659e00552 100644
--- a/dists/motomagx/mgx/readme-motomagx-mgx.txt
+++ b/dists/motomagx/mgx/readme-motomagx-mgx.txt
@@ -57,4 +57,3 @@ keymap_global_MENU=ESCAPE
keymap_global_SKLI=ASTERISK
keymap_gui_VIRT=TAB
keymap_gui_REMP=CLEAR
-
diff --git a/dists/motomagx/mgx/scummvm.cfg b/dists/motomagx/mgx/scummvm.cfg
index 91567e8020..8780ba2115 100644
--- a/dists/motomagx/mgx/scummvm.cfg
+++ b/dists/motomagx/mgx/scummvm.cfg
@@ -3,4 +3,4 @@ Exec = scummvm.lin
Icon = icon.png
Author = ScummVM Team
Version = trunk
-Comment = ScummVM \ No newline at end of file
+Comment = ScummVM
diff --git a/dists/motomagx/pep/description.ini b/dists/motomagx/pep/description.ini
index 634214e5ac..8daa626ea7 100644
--- a/dists/motomagx/pep/description.ini
+++ b/dists/motomagx/pep/description.ini
@@ -17,4 +17,3 @@ Icon= scummvm_small_usr.png
[AddAppToMenu]
ParentFolder= root
-
diff --git a/dists/msvc10/create_msvc10.bat b/dists/msvc10/create_msvc10.bat
index f915d5d366..5616c2cc8b 100644
--- a/dists/msvc10/create_msvc10.bat
+++ b/dists/msvc10/create_msvc10.bat
@@ -8,6 +8,8 @@ if "%~1"=="/stable" goto stable
if "%~1"=="/STABLE" goto stable
if "%~1"=="/all" goto all
if "%~1"=="/ALL" goto all
+if "%~1"=="/tools" goto tools
+if "%~1"=="/TOOLS" goto tools
if "%~1"=="/clean" goto clean_check
if "%~1"=="/CLEAN" goto clean_check
if "%~1"=="/help" goto command_help
@@ -23,6 +25,7 @@ echo.
echo Valid command parameters are:
echo stable Generated stable engines project files
echo all Generate all engines project files
+echo tools Generate project files for the devtools
echo clean Clean generated project files
echo help Show help message
goto done
@@ -60,6 +63,13 @@ echo.
create_project ..\.. --msvc --msvc-version 10
goto done
+:tools
+echo.
+echo Creating tools project files
+echo.
+create_project ..\.. --tools --msvc --msvc-version 10
+goto done
+
:clean_check
echo.
set cleananswer=N
@@ -77,6 +87,7 @@ del /Q *.vcxproj* > NUL 2>&1
del /Q *.props > NUL 2>&1
del /Q *.sln* > NUL 2>&1
del /Q scummvm* > NUL 2>&1
+del /Q devtools* > NUL 2>&1
goto done
:done
diff --git a/dists/msvc8/create_msvc8.bat b/dists/msvc8/create_msvc8.bat
index beb2eaf0d7..2261c9bcec 100644
--- a/dists/msvc8/create_msvc8.bat
+++ b/dists/msvc8/create_msvc8.bat
@@ -8,6 +8,8 @@ if "%~1"=="/stable" goto stable
if "%~1"=="/STABLE" goto stable
if "%~1"=="/all" goto all
if "%~1"=="/ALL" goto all
+if "%~1"=="/tools" goto tools
+if "%~1"=="/TOOLS" goto tools
if "%~1"=="/clean" goto clean_check
if "%~1"=="/CLEAN" goto clean_check
if "%~1"=="/help" goto command_help
@@ -23,6 +25,7 @@ echo.
echo Valid command parameters are:
echo stable Generated stable engines project files
echo all Generate all engines project files
+echo tools Generate project files for the devtools
echo clean Clean generated project files
echo help Show help message
goto done
@@ -60,6 +63,13 @@ echo.
create_project ..\.. --msvc --msvc-version 8
goto done
+:tools
+echo.
+echo Creating tools project files
+echo.
+create_project ..\.. --tools --msvc --msvc-version 8
+goto done
+
:clean_check
echo.
set cleananswer=N
@@ -77,6 +87,7 @@ del /Q *.vcproj* > NUL 2>&1
del /Q *.vsprops > NUL 2>&1
del /Q *.sln* > NUL 2>&1
del /Q scummvm* > NUL 2>&1
+del /Q devtools* > NUL 2>&1
goto done
:done
diff --git a/dists/msvc9/create_msvc9.bat b/dists/msvc9/create_msvc9.bat
index 880af95312..1622cd9037 100644
--- a/dists/msvc9/create_msvc9.bat
+++ b/dists/msvc9/create_msvc9.bat
@@ -8,6 +8,8 @@ if "%~1"=="/stable" goto stable
if "%~1"=="/STABLE" goto stable
if "%~1"=="/all" goto all
if "%~1"=="/ALL" goto all
+if "%~1"=="/tools" goto tools
+if "%~1"=="/TOOLS" goto tools
if "%~1"=="/clean" goto clean_check
if "%~1"=="/CLEAN" goto clean_check
if "%~1"=="/help" goto command_help
@@ -23,6 +25,7 @@ echo.
echo Valid command parameters are:
echo stable Generated stable engines project files
echo all Generate all engines project files
+echo tools Generate project files for the devtools
echo clean Clean generated project files
echo help Show help message
goto done
@@ -60,6 +63,13 @@ echo.
create_project ..\.. --msvc --msvc-version 9
goto done
+:tools
+echo.
+echo Creating tools project files
+echo.
+create_project ..\.. --tools --msvc --msvc-version 9
+goto done
+
:clean_check
echo.
set cleananswer=N
@@ -77,6 +87,7 @@ del /Q *.vcproj* > NUL 2>&1
del /Q *.vsprops > NUL 2>&1
del /Q *.sln* > NUL 2>&1
del /Q scummvm* > NUL 2>&1
+del /Q devtools* > NUL 2>&1
goto done
:done
diff --git a/dists/nsis/graphics/scummvm-install.ico b/dists/nsis/graphics/scummvm-install.ico
deleted file mode 100644
index b8b118c7bd..0000000000
--- a/dists/nsis/graphics/scummvm-install.ico
+++ /dev/null
Binary files differ
diff --git a/dists/os2/readme.os2 b/dists/os2/readme.os2
index a753323f4a..e0a058a708 100644
--- a/dists/os2/readme.os2
+++ b/dists/os2/readme.os2
@@ -10,4 +10,4 @@ All feedback is appreciated!
Thanks!
Paul Smedley
-5th May, 2010 \ No newline at end of file
+5th May, 2010
diff --git a/dists/ps3/ICON0.PNG b/dists/ps3/ICON0.PNG
new file mode 100644
index 0000000000..e0dc9d7847
--- /dev/null
+++ b/dists/ps3/ICON0.PNG
Binary files differ
diff --git a/dists/ps3/PIC1.PNG b/dists/ps3/PIC1.PNG
new file mode 100644
index 0000000000..1fcdeb71fc
--- /dev/null
+++ b/dists/ps3/PIC1.PNG
Binary files differ
diff --git a/dists/ps3/readme-ps3.md b/dists/ps3/readme-ps3.md
new file mode 100644
index 0000000000..2fb393b4fb
--- /dev/null
+++ b/dists/ps3/readme-ps3.md
@@ -0,0 +1,49 @@
+Prerequisites
+=============
+- A homebrew enabled PlayStation 3 console. As of now that mostly means having a custom firmware installed. Obtaining and installing such a software is out of the scope of this document. Sorry, but you're on your own for that one.
+- At least one ScummVM supported game. The list of compatible games can be seen here: http://www.scummvm.org/compatibility/
+The page http://wiki.scummvm.org/index.php/Where_to_get_the_games references some places where those games can be bought. Demonstration versions for most of the supported games are downloadable on http://scummvm.org/demos/
+- An USB drive.
+
+Installing
+==========
+From a computer, download the installable package of the PS3 port from ScummVM's main site. It should be a .pkg file. Copy it to an USB drive.
+After having plugged the USB drive to you PS3, the installation package should appear in the XMB under the "Games > Install Package" menu. Installing it copies ScummVM and its dependencies to your PS3's hard drive. It also adds the "Games > PlayStation 3 > ScummVM" XMB entry which is to be used to launch ScummVM.
+
+Configuring and playing games
+=============================
+The user manual describes how to add games to ScummVM and launch them : http://wiki.scummvm.org/index.php/User_Manual
+
+PlayStation 3 Specifics
+=======================
+Games can be launched either from an USB drive or from the internal hard drive. The internal hard drive has better performance though.
+Savegames are wrote in the /hdd0/game/SCUM12000/saves folder.
+
+Joypad button mapping
+=====================
+- Left stick => Mouse
+- Cross => Left mouse button
+- Circle => Right mouse button
+- Triangle => Game menu (F5)
+- Square => Escape
+- Start => ScummVM's in global game menu
+- Select => Toggle virtual keyboard
+- L1 => AGI predictive input dialog
+
+Disclaimer
+==========
+Unauthorized distribution of an installable package with non freeware games included is a violation of the copyright law and is as such forbidden.
+
+Building from source
+====================
+This port of ScummVM to the PS3 is based on SDL. It uses the open source SDK PSL1GHT.
+
+The dependencies needed to build it are :
+
+- The toolchain from https://github.com/ps3dev/ps3toolchain
+- SDL from https://github.com/zeldin/SDL_PSL1GHT
+- ScummVM from https://github.com/scummvm/scummvm
+
+Once all the dependencies are correctly setup, an installable package can be obtained from source by issuing the following command :
+
+./configure --host=ps3 && make ps3pkg
diff --git a/dists/ps3/sfo.xml b/dists/ps3/sfo.xml
new file mode 100644
index 0000000000..657e1c1410
--- /dev/null
+++ b/dists/ps3/sfo.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" ?>
+<sfo>
+ <value name="ATTRIBUTE" type="integer">
+ 0
+ </value>
+ <value name="BOOTABLE" type="integer">
+ 1
+ </value>
+ <value name="CATEGORY" type="string">
+ HG
+ </value>
+ <value name="PARENTAL_LEVEL" type="integer">
+ 0
+ </value>
+ <value name="PS3_SYSTEM_VER" type="string">
+ 01.8000
+ </value>
+ <value name="RESOLUTION" type="integer">
+ 63
+ </value>
+ <value name="SOUND_FORMAT" type="integer">
+ 279
+ </value>
+ <value name="TITLE" type="string">
+ ScummVM
+ </value>
+ <value name="TITLE_ID" type="string">
+ SCUM12000
+ </value>
+ <value name="VERSION" type="string">
+ 01.00
+ </value>
+</sfo>
diff --git a/dists/redhat/scummvm-tools.spec b/dists/redhat/scummvm-tools.spec
index 72b1ac701f..99add8ba85 100644
--- a/dists/redhat/scummvm-tools.spec
+++ b/dists/redhat/scummvm-tools.spec
@@ -7,7 +7,7 @@
# Prologue information
#------------------------------------------------------------------------------
Name : scummvm-tools
-Version : 1.4.0git
+Version : 1.5.0git
Release : 1
Summary : ScummVM-related tools
Group : Interpreters
diff --git a/dists/redhat/scummvm.spec b/dists/redhat/scummvm.spec
index 777e0afc8a..7457ddd195 100644
--- a/dists/redhat/scummvm.spec
+++ b/dists/redhat/scummvm.spec
@@ -7,7 +7,7 @@
# Prologue information
#------------------------------------------------------------------------------
Name : scummvm
-Version : 1.4.0git
+Version : 1.5.0git
Release : 1
Summary : Graphic adventure game interpreter
Group : Interpreters
@@ -68,6 +68,8 @@ install -m644 -D dists/engine-data/queen.tbl %{buildroot}%{_datadir}/scummvm/que
install -m644 -D dists/engine-data/sky.cpt %{buildroot}%{_datadir}/scummvm/sky.cpt
install -m644 -D dists/engine-data/drascula.dat %{buildroot}%{_datadir}/scummvm/drascula.dat
install -m644 -D dists/engine-data/teenagent.dat %{buildroot}%{_datadir}/scummvm/teenagent.dat
+install -m644 -D dists/engine-data/hugo.dat %{buildroot}%{_datadir}/scummvm/hugo.dat
+install -m644 -D dists/engine-data/toon.dat %{buildroot}%{_datadir}/scummvm/toon.dat
desktop-file-install --vendor scummvm --dir=%{buildroot}/%{_datadir}/applications dists/scummvm.desktop
%clean
@@ -105,6 +107,8 @@ fi
%{_datadir}/scummvm/lure.dat
%{_datadir}/scummvm/drascula.dat
%{_datadir}/scummvm/teenagent.dat
+%{_datadir}/scummvm/hugo.dat
+%{_datadir}/scummvm/toon.dat
%{_mandir}/man6/scummvm.6*
#------------------------------------------------------------------------------
@@ -195,4 +199,3 @@ fi
- save & load support
* Mon Oct 8 2001 (0.0.1)
- initial version
-
diff --git a/dists/redhat/scummvm.spec.in b/dists/redhat/scummvm.spec.in
index 13ce600d02..56e165c979 100644
--- a/dists/redhat/scummvm.spec.in
+++ b/dists/redhat/scummvm.spec.in
@@ -68,6 +68,8 @@ install -m644 -D dists/engine-data/queen.tbl %{buildroot}%{_datadir}/scummvm/que
install -m644 -D dists/engine-data/sky.cpt %{buildroot}%{_datadir}/scummvm/sky.cpt
install -m644 -D dists/engine-data/drascula.dat %{buildroot}%{_datadir}/scummvm/drascula.dat
install -m644 -D dists/engine-data/teenagent.dat %{buildroot}%{_datadir}/scummvm/teenagent.dat
+install -m644 -D dists/engine-data/hugo.dat %{buildroot}%{_datadir}/scummvm/hugo.dat
+install -m644 -D dists/engine-data/toon.dat %{buildroot}%{_datadir}/scummvm/toon.dat
desktop-file-install --vendor scummvm --dir=%{buildroot}/%{_datadir}/applications dists/scummvm.desktop
%clean
@@ -105,6 +107,8 @@ fi
%{_datadir}/scummvm/lure.dat
%{_datadir}/scummvm/drascula.dat
%{_datadir}/scummvm/teenagent.dat
+%{_datadir}/scummvm/hugo.dat
+%{_datadir}/scummvm/toon.dat
%{_mandir}/man6/scummvm.6*
#------------------------------------------------------------------------------
@@ -195,4 +199,3 @@ fi
- save & load support
* Mon Oct 8 2001 (0.0.1)
- initial version
-
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 109437305c..ce287cdd42 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -5,8 +5,14 @@
#endif
#define FILE 256
+#define IDI_ICON 1001
+#define IDI_COUNT 1002
+#define ID_GDF_XML __GDF_XML
IDI_ICON ICON DISCARDABLE "icons/scummvm.ico"
+IDI_COUNT ICON DISCARDABLE "icons/count.ico"
+
+ID_GDF_XML DATA "dists/win32/scummvm.gdf.xml"
scummmodern.zip FILE "gui/themes/scummmodern.zip"
#ifdef USE_TRANSLATION
@@ -45,8 +51,8 @@ pred.dic FILE "dists/pred.dic"
#endif
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,4,0,0
- PRODUCTVERSION 1,4,0,0
+ FILEVERSION 1,5,0,0
+ PRODUCTVERSION 1,5,0,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
#ifdef _DEBUG
FILEFLAGS VS_FF_DEBUG
@@ -63,13 +69,13 @@ BEGIN
BEGIN
VALUE "Comments", "Look! A three headed monkey (TM)! .. Nice use of the TM!\0"
VALUE "FileDescription", "http://www.scummvm.org/\0"
- VALUE "FileVersion", "1.4.0git\0"
+ VALUE "FileVersion", "1.5.0git\0"
VALUE "InternalName", "scummvm\0"
VALUE "LegalCopyright", "Copyright © 2001-2011 The ScummVM Team\0"
VALUE "LegalTrademarks", "'SCUMM', and all SCUMM games are a TM of LucasArts. Simon The Sorcerer is a TM of AdventureSoft. Beneath a Steel Sky and Broken Sword are a TM of Revolution. Flight of the Amazon Queen is a TM of John Passfield and Steve Stamatiadis. \0"
VALUE "OriginalFilename", "scummvm.exe\0"
VALUE "ProductName", "ScummVM\0"
- VALUE "ProductVersion", "1.4.0git\0"
+ VALUE "ProductVersion", "1.5.0git\0"
END
END
diff --git a/dists/scummvm.rc.in b/dists/scummvm.rc.in
index c043ce1644..b91e7ebb0c 100644
--- a/dists/scummvm.rc.in
+++ b/dists/scummvm.rc.in
@@ -5,8 +5,14 @@
#endif
#define FILE 256
+#define IDI_ICON 1001
+#define IDI_COUNT 1002
+#define ID_GDF_XML __GDF_XML
IDI_ICON ICON DISCARDABLE "icons/scummvm.ico"
+IDI_COUNT ICON DISCARDABLE "icons/count.ico"
+
+ID_GDF_XML DATA "dists/win32/scummvm.gdf.xml"
scummmodern.zip FILE "gui/themes/scummmodern.zip"
#ifdef USE_TRANSLATION
diff --git a/dists/slackware/scummvm.SlackBuild b/dists/slackware/scummvm.SlackBuild
index 71f4818e7e..4ccc2a8995 100755
--- a/dists/slackware/scummvm.SlackBuild
+++ b/dists/slackware/scummvm.SlackBuild
@@ -9,7 +9,7 @@ if [ "$TMP" = "" ]; then
fi
PKG=$TMP/package-scummvm
-VERSION=1.4.0git
+VERSION=1.5.0git
ARCH=i486
BUILD=1
diff --git a/dists/wii/READMII b/dists/wii/READMII
index 66b00f6871..bd2a6cfa80 100644
--- a/dists/wii/READMII
+++ b/dists/wii/READMII
@@ -106,4 +106,3 @@ THANKS
shagkur and WinterMute, for devkitppc/libogc and the coorperation
svpe, for fixing the libfat feof/thread bugs on the last minute
para, for making wiiuse available in libogc
-
diff --git a/dists/wii/meta.xml b/dists/wii/meta.xml
index 68460c4721..e843d36e79 100644
--- a/dists/wii/meta.xml
+++ b/dists/wii/meta.xml
@@ -2,7 +2,7 @@
<app version="1">
<name>ScummVM</name>
<coder>The ScummVM Team</coder>
- <version>1.4.0git@REVISION@</version>
+ <version>1.5.0git@REVISION@</version>
<release_date>@TIMESTAMP@</release_date>
<short_description>Point &amp; Click Adventures</short_description>
<long_description>ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed!
@@ -10,4 +10,3 @@
Some of the adventures ScummVM supports include Adventure Soft's Simon the Sorcerer 1 and 2; Revolution's Beneath A Steel Sky and Broken Sword I &amp; II; Flight of the Amazon Queen; Wyrmkeep's Inherit the Earth; Coktel Vision's Gobliiins; Westwood Studios' The Legend of Kyrandia and games based on LucasArts' SCUMM (Script Creation Utility for Maniac Mansion) system such as Monkey Island, Day of the Tentacle, Sam and Max and more.</long_description>
<no_ios_reload/>
</app>
-
diff --git a/dists/wii/meta.xml.in b/dists/wii/meta.xml.in
index 970ae7d54b..356b054731 100644
--- a/dists/wii/meta.xml.in
+++ b/dists/wii/meta.xml.in
@@ -10,4 +10,3 @@
Some of the adventures ScummVM supports include Adventure Soft's Simon the Sorcerer 1 and 2; Revolution's Beneath A Steel Sky and Broken Sword I &amp; II; Flight of the Amazon Queen; Wyrmkeep's Inherit the Earth; Coktel Vision's Gobliiins; Westwood Studios' The Legend of Kyrandia and games based on LucasArts' SCUMM (Script Creation Utility for Maniac Mansion) system such as Monkey Island, Day of the Tentacle, Sam and Max and more.</long_description>
<no_ios_reload/>
</app>
-
diff --git a/dists/win32/ScummVM.iss b/dists/win32/ScummVM.iss
index 00f4868e60..852597fb69 100644
--- a/dists/win32/ScummVM.iss
+++ b/dists/win32/ScummVM.iss
@@ -1,8 +1,12 @@
[Setup]
-DefaultDirName={pf}\ScummVM
AppCopyright=2011
AppName=ScummVM
AppVerName=ScummVM Git
+AppPublisher=The ScummVM Team
+AppPublisherURL=http://www.scummvm.org/
+AppSupportURL=http://www.scummvm.org/
+AppUpdatesURL=http://www.scummvm.org/
+DefaultDirName={pf}\ScummVM
DefaultGroupName=ScummVM
AllowNoIcons=true
AlwaysUsePersonalGroup=false
@@ -14,45 +18,51 @@ DisableStartupPrompt=true
AppendDefaultDirName=false
SolidCompression=true
DirExistsWarning=no
-SetupIconFile=scummvm.ico
+SetupIconFile=graphics\scummvm-install.ico
+WizardImageFile=graphics\left.bmp
ShowLanguageDialog=yes
LanguageDetectionMethod=uilanguage
[Languages]
Name: en; MessagesFile: compiler:Default.isl
-Name: eu; MessagesFile: compiler:Languages\Basque.isl
Name: br; MessagesFile: compiler:Languages\BrazilianPortuguese.isl
Name: ca; MessagesFile: compiler:Languages\Catalan.isl
Name: cz; MessagesFile: compiler:Languages\Czech.isl
Name: da; MessagesFile: compiler:Languages\Danish.isl
-Name: nl; MessagesFile: compiler:Languages\Dutch.isl
-Name: fi; MessagesFile: compiler:Languages\Finnish.isl
Name: fr; MessagesFile: compiler:Languages\French.isl
Name: de; MessagesFile: compiler:Languages\German.isl
-Name: he; MessagesFile: compiler:Languages\Hebrew.isl
Name: hu; MessagesFile: compiler:Languages\Hungarian.isl
Name: it; MessagesFile: compiler:Languages\Italian.isl
-Name: ja; MessagesFile: compiler:Languages\Japanese.isl
Name: nb; MessagesFile: compiler:Languages\Norwegian.isl
Name: pl; MessagesFile: compiler:Languages\Polish.isl
-Name: pt; MessagesFile: compiler:Languages\Portuguese.isl
Name: ru; MessagesFile: compiler:Languages\Russian.isl
-Name: sk; MessagesFile: compiler:Languages\Slovak.isl
-Name: sl; MessagesFile: compiler:Languages\Slovenian.isl
Name: es; MessagesFile: compiler:Languages\Spanish.isl
[Icons]
Name: {group}\{cm:UninstallProgram, ScummVM}; Filename: {uninstallexe}
Name: {group}\ScummVM; Filename: {app}\scummvm.exe; WorkingDir: {app}; Comment: scummvm; Flags: createonlyiffileexists; IconIndex: 0
+Name: {group}\ScummVM (noconsole); Filename: {app}\scummvm.exe; Parameters: "--no-console"; WorkingDir: {app}; Comment: scummvm; Flags: createonlyiffileexists; IconIndex: 0
Name: {group}\Authors; Filename: {app}\AUTHORS.txt; WorkingDir: {app}; Comment: AUTHORS; Flags: createonlyiffileexists
Name: {group}\Copying; Filename: {app}\COPYING.txt; WorkingDir: {app}; Comment: COPYING; Flags: createonlyiffileexists
Name: {group}\Copying.LGPL; Filename: {app}\COPYING.LGPL.txt; WorkingDir: {app}; Comment: COPYING.LGPL; Flags: createonlyiffileexists
Name: {group}\Copyright; Filename: {app}\COPYRIGHT.txt; WorkingDir: {app}; Comment: COPYRIGHT; Flags: createonlyiffileexists
-Name: {group}\Readme; Filename: {app}\README.txt; WorkingDir: {app}; Comment: README; Flags: createonlyiffileexists
-Name: {group}\News; Filename: {app}\NEWS.txt; WorkingDir: {app}; Comment: NEWS; Flags: createonlyiffileexists
+;NEWS
+Name: {group}\News; Filename: {app}\NEWS.txt; WorkingDir: {app}; Comment: NEWS; Flags: createonlyiffileexists; Languages: not de
+Name: {group}\Neues; Filename: {app}\Neues.txt; WorkingDir: {app}; Comment: Neues; Flags: createonlyiffileexists; Languages: de
+;QUICKSTART
+Name: {group}\QuickStart; Filename: {app}\QUICKSTART.txt; WorkingDir: {app}; Comment: QUICKSTART; Flags: createonlyiffileexists; Languages: not (de or es or fr or it or nb)
+Name: {group}\Schnellstart; Filename: {app}\Schnellstart.txt; WorkingDir: {app}; Comment: Schnellstart; Flags: createonlyiffileexists; Languages: de
+Name: {group}\Inicio Rápido; Filename: {app}\Inicio Rápido.txt; WorkingDir: {app}; Comment: Inicio Rápido; Flags: createonlyiffileexists; Languages: es
+Name: {group}\DemarrageRapide; Filename: {app}\DemarrageRapide.txt; WorkingDir: {app}; Comment: DemarrageRapide; Flags: createonlyiffileexists; Languages: fr
+Name: {group}\GuidaRapida; Filename: {app}\GuidaRapida.txt; WorkingDir: {app}; Comment: GuidaRapida; Flags: createonlyiffileexists; Languages: it
+Name: {group}\HurtigStart; Filename: {app}\HurtigStart.txt; WorkingDir: {app}; Comment: HurtigStart; Flags: createonlyiffileexists; Languages: nb
+;README
+Name: {group}\Readme; Filename: {app}\README.txt; WorkingDir: {app}; Comment: README; Flags: createonlyiffileexists; Languages: not (cz or de)
+Name: {group}\PrectiMe; Filename: {app}\PrectiMe.txt; WorkingDir: {app}; Comment: PrectiMe; Flags: createonlyiffileexists; Languages: cz
+Name: {group}\Liesmich; Filename: {app}\Liesmich.txt; WorkingDir: {app}; Comment: Liesmich; Flags: createonlyiffileexists; Languages: de
[Run]
-Filename: {app}\scummvm.exe; Flags: nowait skipifdoesntexist postinstall skipifsilent; Description: Launch ScummVM
+Filename: {app}\ScummVM.exe; Flags: nowait skipifdoesntexist postinstall skipifsilent
[UninstallDelete]
Type: files; Name: {app}\ISTool.url
@@ -62,8 +72,20 @@ Source: AUTHORS.txt; DestDir: {app}; Flags: ignoreversion
Source: COPYING.txt; DestDir: {app}; Flags: ignoreversion
Source: COPYING.LGPL.txt; DestDir: {app}; Flags: ignoreversion
Source: COPYRIGHT.txt; DestDir: {app}; Flags: ignoreversion
-Source: NEWS.txt; DestDir: {app}; Flags: ignoreversion
-Source: README.txt; DestDir: {app}; Flags: ignoreversion isreadme
+;NEWS
+Source: NEWS.txt; DestDir: {app}; Flags: ignoreversion; Languages: not de
+Source: doc/de/Neues.txt; DestDir: {app}; Flags: ignoreversion; Languages: de
+;QUICKSTART
+Source: doc/QUICKSTART.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: not (de or es or fr or it or nb)
+Source: doc/de/Schnellstart.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: de
+Source: doc/es/Inicio Rápido.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: es
+Source: doc/fr/DemarrageRapide.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: fr
+Source: doc/it/GuidaRapida.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: it
+Source: doc/no-nb/HurtigStart.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: nb
+;README
+Source: README.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: not (cz or de)
+Source: doc/cz/PrectiMe.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: cz
+Source: doc/de/Liesmich.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: de
Source: README-SDL.txt; DestDir: {app}; Flags: ignoreversion
Source: scummvm.exe; DestDir: {app}; Flags: ignoreversion
Source: SDL.dll; DestDir: {app}
diff --git a/dists/nsis/graphics/left.bmp b/dists/win32/graphics/left.bmp
index 8b31d7d09a..8b31d7d09a 100644
--- a/dists/nsis/graphics/left.bmp
+++ b/dists/win32/graphics/left.bmp
Binary files differ
diff --git a/dists/win32/graphics/scummvm-install.ico b/dists/win32/graphics/scummvm-install.ico
new file mode 100644
index 0000000000..6312959509
--- /dev/null
+++ b/dists/win32/graphics/scummvm-install.ico
Binary files differ
diff --git a/dists/win32/plugins/Games.dll b/dists/win32/plugins/Games.dll
new file mode 100644
index 0000000000..3a378b7064
--- /dev/null
+++ b/dists/win32/plugins/Games.dll
Binary files differ
diff --git a/dists/win32/scummvm.gdf.xml b/dists/win32/scummvm.gdf.xml
new file mode 100644
index 0000000000..4a0c067b05
--- /dev/null
+++ b/dists/win32/scummvm.gdf.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<GameDefinitionFile xmlns:baseTypes="urn:schemas-microsoft-com:GamesExplorerBaseTypes.v1" xmlns="urn:schemas-microsoft-com:GameDescription.v1">
+ <GameDefinition gameID="{F2475C5C-EA7C-41F0-A56D-1ABF7CFEA389}">
+ <Name>ScummVM</Name>
+ <Description>ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed!</Description>
+ <ReleaseDate>2011-09-30</ReleaseDate>
+ <Genres>
+ <Genre>Adventure</Genre>
+ </Genres>
+ <Version>
+ <VersionFile path="scummvm.exe" />
+ </Version>
+ <WindowsSystemPerformanceRating minimum="1.0" recommended="2.0" />
+ <Developers>
+ <Developer URI="http://www.scummvm.org">The ScummVM Team</Developer>
+ </Developers>
+ <Publishers>
+ <Publisher URI="http://www.scummvm.org">The ScummVM Team</Publisher>
+ </Publishers>
+ <GameExecutables>
+ <GameExecutable path="scummvm.exe" />
+ </GameExecutables>
+ <ExtendedProperties>
+ <GameTasks>
+ <Play>
+ <Primary>
+ <FileTask path="scummvm.exe" arguments="--no-console" />
+ </Primary>
+ <Task index="1" name="Play (console)">
+ <FileTask path="scummvm.exe" arguments="" />
+ </Task>
+ </Play>
+ <Support>
+ <Task index="0" name="View README">
+ <FileTask path="README.txt" arguments="" />
+ </Task>
+ <Task index="1" name="ScummVM Website">
+ <URLTask Link="http://www.scummvm.org" />
+ </Task>
+ </Support>
+ </GameTasks>
+ </ExtendedProperties>
+ </GameDefinition>
+</GameDefinitionFile>
diff --git a/dists/nsis/scummvm.nsi b/dists/win32/scummvm.nsi
index 50ccadaf74..23a3abcfd4 100644
--- a/dists/nsis/scummvm.nsi
+++ b/dists/win32/scummvm.nsi
@@ -20,19 +20,26 @@
#!define _DEBUG
#!define _INCLUDE_DATA_FILES
+!define _ENABLE_GAME_EXPLORER
+#!define _LOG_BUILD
+!define _CONVERT_TEXT
Name ScummVM
# Included files
!include MUI2.nsh
+# Plugins
+!ifdef _ENABLE_GAME_EXPLORER
+!AddPluginDir "./plugins"
+!endif
+
#########################################################################################
# Command line options
#########################################################################################
#!define top_srcdir ""
-#!define build_dir ""
-#!define text_dir ""
+#!define staging_dir ""
#!define ARCH "" ;(optional, defaults to win32)
# Check parameters
@@ -40,17 +47,19 @@ Name ScummVM
!error "Top source folder has not been passed to command line!"
!endif
-!ifndef build_dir
- !error "Build folder has not been passed to command line (this folder should contain the executable and linked DLLs)!"
-!endif
-
-!ifndef text_dir
- !error "Text folder has not been passed to command line (this folder should contain all the text files used by the installer)!"
+!ifndef staging_dir
+ !error "Staging folder has not been passed to command line (this folder should contain the executable and linked DLLs)!"
!endif
!ifndef ARCH
!warning "ARCH has not been defined, defaulting to 'win32'"
!define ARCH "win32"
+!else
+ !if "${ARCH}" == ""
+ !warning "ARCH was empty, defaulting to 'win32'"
+ !undef ARCH
+ !define ARCH "win32"
+ !endif
!endif
#########################################################################################
@@ -63,7 +72,7 @@ Name ScummVM
# General Symbol Definitions
#########################################################################################
!define REGKEY "Software\$(^Name)\$(^Name)"
-!define VERSION "1.4.0git"
+!define VERSION "1.5.0git"
!define COMPANY "ScummVM Team"
!define URL "http://scummvm.org/"
!define DESCRIPTION "ScummVM Installer. Look! A three headed monkey (TM)!"
@@ -72,7 +81,7 @@ Name ScummVM
#########################################################################################
# Installer configuration
#########################################################################################
-OutFile ${build_dir}\scummvm-${VERSION}-${ARCH}.exe
+OutFile ${staging_dir}\scummvm-${VERSION}-${ARCH}.exe
InstallDir $PROGRAMFILES\ScummVM ; Default installation folder
InstallDirRegKey HKCU "Software\ScummVM\ScummVM" "InstallPath" ; Get installation folder from registry if available
; The application name needs to be refered directly instead of through ${REGKEY}
@@ -83,7 +92,7 @@ XPStyle on
#TargetMinimalOS 5.0 ; Minimal version of windows for installer: Windows 2000 or more recent
; (will build unicode installer with NSIS 2.50+)
-VIProductVersion 1.4.0.0
+VIProductVersion 1.5.0.0
VIAddVersionKey ProductName $(^Name)
VIAddVersionKey ProductVersion "${VERSION}"
VIAddVersionKey CompanyName "${COMPANY}"
@@ -220,17 +229,35 @@ Var StartMenuGroup
# Installer sections
#########################################################################################
Section "ScummVM" SecMain
+!ifdef _LOG_BUILD
+ LogSet on
+!endif
SetOutPath $INSTDIR
SetOverwrite on
# Text files
- File /oname=AUTHORS.txt "${text_dir}\AUTHORS"
- File /oname=COPYING.LGPL.txt "${text_dir}\COPYING.LGPL"
- File /oname=COPYING.txt "${text_dir}\COPYING"
- File /oname=COPYRIGHT.txt "${text_dir}\COPYRIGHT"
- File /oname=NEWS.txt "${text_dir}\NEWS"
- File /oname=README.txt "${text_dir}\README"
- File /oname=README-SDL.txt "${build_dir}\README-SDL"
+ File /oname=AUTHORS.txt "${top_srcdir}\AUTHORS"
+ File /oname=COPYING.LGPL.txt "${top_srcdir}\COPYING.LGPL"
+ File /oname=COPYING.txt "${top_srcdir}\COPYING"
+ File /oname=COPYRIGHT.txt "${top_srcdir}\COPYRIGHT"
+ File /oname=NEWS.txt "${top_srcdir}\NEWS"
+ File /oname=README.txt "${top_srcdir}\README"
+
+!ifdef _CONVERT_TEXT
+ # Convert line endings
+ Push "$INSTDIR\AUTHORS.txt"
+ Call unix2dos
+ Push "$INSTDIR\COPYING.LGPL.txt"
+ Call unix2dos
+ Push "$INSTDIR\COPYING.txt"
+ Call unix2dos
+ Push "$INSTDIR\COPYRIGHT.txt"
+ Call unix2dos
+ Push "$INSTDIR\NEWS.txt"
+ Call unix2dos
+ Push "$INSTDIR\README.txt"
+ Call unix2dos
+!endif
!ifdef _INCLUDE_DATA_FILES
# Engine data
@@ -253,10 +280,27 @@ Section "ScummVM" SecMain
!endif
# Main exe and dlls
- File "${build_dir}\scummvm.exe"
- File "${build_dir}\SDL.dll"
+ File "${staging_dir}\scummvm.exe"
+ File "${staging_dir}\SDL.dll"
WriteRegStr HKCU "${REGKEY}" InstallPath "$INSTDIR" ; Store installation folder
+
+ #Register with game explorer
+!ifdef _ENABLE_GAME_EXPLORER
+ Games::registerGame "$INSTDIR\scummvm.exe"
+ pop $0
+ # This is for Vista only, for 7 the tasks are defined in the gdf xml
+ ${If} $0 != "0"
+ ${AndIf} $0 != ""
+ ${AndIf} $0 != "$INSTDIR\scummvm.exe"
+ CreateDirectory "$0\PlayTasks\0"
+ CreateShortcut "$0\PlayTasks\0\Play.lnk" "$INSTDIR\scummvm.exe" "--no-console"
+ CreateDirectory "$0\PlayTasks\1"
+ CreateShortcut "$0\PlayTasks\1\Play (console).lnk" "$INSTDIR\scummvm.exe"
+ CreateDirectory "$0\SupportTasks\0"
+ CreateShortcut "$0\SupportTasks\0\Home Page.lnk" "${URL}"
+ ${EndIf}
+!endif
SectionEnd
# Write Start menu entries and uninstaller
@@ -266,7 +310,8 @@ Section -post SecMainPost
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext all ; Create shortcuts in the all-users folder
CreateDirectory "$SMPROGRAMS\$StartMenuGroup"
- CreateShortCut "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" $INSTDIR\$(^Name).exe "" "$INSTDIR\$(^Name).exe" 0 ; Create shortcut with icon
+ CreateShortCut "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" $INSTDIR\$(^Name).exe "" "$INSTDIR\$(^Name).exe" 0 ; Create shortcut with icon
+ CreateShortCut "$SMPROGRAMS\$StartMenuGroup\$(^Name) (No console).lnk" $INSTDIR\$(^Name).exe "--no-console" "$INSTDIR\$(^Name).exe" 0
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Readme.lnk" $INSTDIR\README.txt
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_END
@@ -320,6 +365,10 @@ Section -un.Main SecUninstall
Delete /REBOOTOK $INSTDIR\translations.dat
!endif
+!ifdef _ENABLE_GAME_EXPLORER
+ Games::unregisterGame "$INSTDIR\scummvm.exe"
+!endif
+
Delete /REBOOTOK $INSTDIR\scummvm.exe
Delete /REBOOTOK $INSTDIR\SDL.dll
SectionEnd
@@ -354,3 +403,63 @@ Function un.onInit
ReadRegStr $INSTDIR HKCU "${REGKEY}" InstallPath
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup
FunctionEnd
+
+
+#########################################################################################
+# Helper functions
+#########################################################################################
+
+!ifdef _CONVERT_TEXT
+;-------------------------------------------------------------------------------
+; strips all CRs and then converts all LFs into CRLFs
+; (this is roughly equivalent to "cat file | dos2unix | unix2dos")
+;
+; Usage:
+; Push "infile"
+; Call unix2dos
+;
+; Note: this function destroys $0 $1 $2
+Function unix2dos
+ ClearErrors
+
+ Pop $2
+ Rename $2 $2.U2D
+ FileOpen $1 $2 w
+
+ FileOpen $0 $2.U2D r
+
+ Push $2 ; save name for deleting
+
+ IfErrors unix2dos_done
+
+ ; $0 = file input (opened for reading)
+ ; $1 = file output (opened for writing)
+
+unix2dos_loop:
+ ; read a byte (stored in $2)
+ FileReadByte $0 $2
+ IfErrors unix2dos_done ; EOL
+ ; skip CR
+ StrCmp $2 13 unix2dos_loop
+ ; if LF write an extra CR
+ StrCmp $2 10 unix2dos_cr unix2dos_write
+
+unix2dos_cr:
+ FileWriteByte $1 13
+
+unix2dos_write:
+ ; write byte
+ FileWriteByte $1 $2
+ ; read next byte
+ Goto unix2dos_loop
+
+unix2dos_done:
+ ; close files
+ FileClose $0
+ FileClose $1
+
+ ; delete original
+ Pop $0
+ Delete $0.U2D
+FunctionEnd
+!endif
diff --git a/dists/nsis/scummvm.nsi.in b/dists/win32/scummvm.nsi.in
index c94e5943f7..cba1e81e33 100644
--- a/dists/nsis/scummvm.nsi.in
+++ b/dists/win32/scummvm.nsi.in
@@ -20,19 +20,26 @@
#!define _DEBUG
#!define _INCLUDE_DATA_FILES
+!define _ENABLE_GAME_EXPLORER
+#!define _LOG_BUILD
+!define _CONVERT_TEXT
Name ScummVM
# Included files
!include MUI2.nsh
+# Plugins
+!ifdef _ENABLE_GAME_EXPLORER
+!AddPluginDir "./plugins"
+!endif
+
#########################################################################################
# Command line options
#########################################################################################
#!define top_srcdir ""
-#!define build_dir ""
-#!define text_dir ""
+#!define staging_dir ""
#!define ARCH "" ;(optional, defaults to win32)
# Check parameters
@@ -40,17 +47,19 @@ Name ScummVM
!error "Top source folder has not been passed to command line!"
!endif
-!ifndef build_dir
- !error "Build folder has not been passed to command line (this folder should contain the executable and linked DLLs)!"
-!endif
-
-!ifndef text_dir
- !error "Text folder has not been passed to command line (this folder should contain all the text files used by the installer)!"
+!ifndef staging_dir
+ !error "Staging folder has not been passed to command line (this folder should contain the executable and linked DLLs)!"
!endif
!ifndef ARCH
!warning "ARCH has not been defined, defaulting to 'win32'"
!define ARCH "win32"
+!else
+ !if "${ARCH}" == ""
+ !warning "ARCH was empty, defaulting to 'win32'"
+ !undef ARCH
+ !define ARCH "win32"
+ !endif
!endif
#########################################################################################
@@ -72,7 +81,7 @@ Name ScummVM
#########################################################################################
# Installer configuration
#########################################################################################
-OutFile ${build_dir}\scummvm-${VERSION}-${ARCH}.exe
+OutFile ${staging_dir}\scummvm-${VERSION}-${ARCH}.exe
InstallDir $PROGRAMFILES\ScummVM ; Default installation folder
InstallDirRegKey HKCU "Software\ScummVM\ScummVM" "InstallPath" ; Get installation folder from registry if available
; The application name needs to be refered directly instead of through ${REGKEY}
@@ -220,17 +229,35 @@ Var StartMenuGroup
# Installer sections
#########################################################################################
Section "ScummVM" SecMain
+!ifdef _LOG_BUILD
+ LogSet on
+!endif
SetOutPath $INSTDIR
SetOverwrite on
# Text files
- File /oname=AUTHORS.txt "${text_dir}\AUTHORS"
- File /oname=COPYING.LGPL.txt "${text_dir}\COPYING.LGPL"
- File /oname=COPYING.txt "${text_dir}\COPYING"
- File /oname=COPYRIGHT.txt "${text_dir}\COPYRIGHT"
- File /oname=NEWS.txt "${text_dir}\NEWS"
- File /oname=README.txt "${text_dir}\README"
- File /oname=README-SDL.txt "${build_dir}\README-SDL"
+ File /oname=AUTHORS.txt "${top_srcdir}\AUTHORS"
+ File /oname=COPYING.LGPL.txt "${top_srcdir}\COPYING.LGPL"
+ File /oname=COPYING.txt "${top_srcdir}\COPYING"
+ File /oname=COPYRIGHT.txt "${top_srcdir}\COPYRIGHT"
+ File /oname=NEWS.txt "${top_srcdir}\NEWS"
+ File /oname=README.txt "${top_srcdir}\README"
+
+!ifdef _CONVERT_TEXT
+ # Convert line endings
+ Push "$INSTDIR\AUTHORS.txt"
+ Call unix2dos
+ Push "$INSTDIR\COPYING.LGPL.txt"
+ Call unix2dos
+ Push "$INSTDIR\COPYING.txt"
+ Call unix2dos
+ Push "$INSTDIR\COPYRIGHT.txt"
+ Call unix2dos
+ Push "$INSTDIR\NEWS.txt"
+ Call unix2dos
+ Push "$INSTDIR\README.txt"
+ Call unix2dos
+!endif
!ifdef _INCLUDE_DATA_FILES
# Engine data
@@ -253,10 +280,27 @@ Section "ScummVM" SecMain
!endif
# Main exe and dlls
- File "${build_dir}\scummvm.exe"
- File "${build_dir}\SDL.dll"
+ File "${staging_dir}\scummvm.exe"
+ File "${staging_dir}\SDL.dll"
WriteRegStr HKCU "${REGKEY}" InstallPath "$INSTDIR" ; Store installation folder
+
+ #Register with game explorer
+!ifdef _ENABLE_GAME_EXPLORER
+ Games::registerGame "$INSTDIR\scummvm.exe"
+ pop $0
+ # This is for Vista only, for 7 the tasks are defined in the gdf xml
+ ${If} $0 != "0"
+ ${AndIf} $0 != ""
+ ${AndIf} $0 != "$INSTDIR\scummvm.exe"
+ CreateDirectory "$0\PlayTasks\0"
+ CreateShortcut "$0\PlayTasks\0\Play.lnk" "$INSTDIR\scummvm.exe" "--no-console"
+ CreateDirectory "$0\PlayTasks\1"
+ CreateShortcut "$0\PlayTasks\1\Play (console).lnk" "$INSTDIR\scummvm.exe"
+ CreateDirectory "$0\SupportTasks\0"
+ CreateShortcut "$0\SupportTasks\0\Home Page.lnk" "${URL}"
+ ${EndIf}
+!endif
SectionEnd
# Write Start menu entries and uninstaller
@@ -266,7 +310,8 @@ Section -post SecMainPost
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext all ; Create shortcuts in the all-users folder
CreateDirectory "$SMPROGRAMS\$StartMenuGroup"
- CreateShortCut "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" $INSTDIR\$(^Name).exe "" "$INSTDIR\$(^Name).exe" 0 ; Create shortcut with icon
+ CreateShortCut "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" $INSTDIR\$(^Name).exe "" "$INSTDIR\$(^Name).exe" 0 ; Create shortcut with icon
+ CreateShortCut "$SMPROGRAMS\$StartMenuGroup\$(^Name) (No console).lnk" $INSTDIR\$(^Name).exe "--no-console" "$INSTDIR\$(^Name).exe" 0
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Readme.lnk" $INSTDIR\README.txt
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_END
@@ -320,6 +365,10 @@ Section -un.Main SecUninstall
Delete /REBOOTOK $INSTDIR\translations.dat
!endif
+!ifdef _ENABLE_GAME_EXPLORER
+ Games::unregisterGame "$INSTDIR\scummvm.exe"
+!endif
+
Delete /REBOOTOK $INSTDIR\scummvm.exe
Delete /REBOOTOK $INSTDIR\SDL.dll
SectionEnd
@@ -354,3 +403,63 @@ Function un.onInit
ReadRegStr $INSTDIR HKCU "${REGKEY}" InstallPath
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup
FunctionEnd
+
+
+#########################################################################################
+# Helper functions
+#########################################################################################
+
+!ifdef _CONVERT_TEXT
+;-------------------------------------------------------------------------------
+; strips all CRs and then converts all LFs into CRLFs
+; (this is roughly equivalent to "cat file | dos2unix | unix2dos")
+;
+; Usage:
+; Push "infile"
+; Call unix2dos
+;
+; Note: this function destroys $0 $1 $2
+Function unix2dos
+ ClearErrors
+
+ Pop $2
+ Rename $2 $2.U2D
+ FileOpen $1 $2 w
+
+ FileOpen $0 $2.U2D r
+
+ Push $2 ; save name for deleting
+
+ IfErrors unix2dos_done
+
+ ; $0 = file input (opened for reading)
+ ; $1 = file output (opened for writing)
+
+unix2dos_loop:
+ ; read a byte (stored in $2)
+ FileReadByte $0 $2
+ IfErrors unix2dos_done ; EOL
+ ; skip CR
+ StrCmp $2 13 unix2dos_loop
+ ; if LF write an extra CR
+ StrCmp $2 10 unix2dos_cr unix2dos_write
+
+unix2dos_cr:
+ FileWriteByte $1 13
+
+unix2dos_write:
+ ; write byte
+ FileWriteByte $1 $2
+ ; read next byte
+ Goto unix2dos_loop
+
+unix2dos_done:
+ ; close files
+ FileClose $0
+ FileClose $1
+
+ ; delete original
+ Pop $0
+ Delete $0.U2D
+FunctionEnd
+!endif
diff --git a/doc/translations/README-translation_template.txt b/doc/QuickStart
index ec43ebef60..82c723a197 100755..100644
--- a/doc/translations/README-translation_template.txt
+++ b/doc/QuickStart
@@ -130,7 +130,7 @@ English and no other languages should be used.
---- ---------------
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.
+reproducible, and still occurs in the latest git/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:
@@ -141,7 +141,7 @@ completeable in the 'Supported Games' section, or compatibility list. We
-know- those games have bugs.
Please include the following information:
- - ScummVM version (PLEASE test the latest SVN/Daily build)
+ - ScummVM version (PLEASE test the latest git/Daily build)
- Bug details, including instructions on reproducing
- Language of game (English, German, ...)
- Version of game (talkie, floppy, ...)
@@ -155,4 +155,3 @@ Finally, please report each issue separately; do not file multiple
issues on the same ticket. (Otherwise, it gets difficult to track the
status of each individual bug). Please keep also in mind that all the
bug reports must be written in English.
-
diff --git a/doc/cz/PrectiMe b/doc/cz/PrectiMe
new file mode 100644
index 0000000000..cf5cd53986
--- /dev/null
+++ b/doc/cz/PrectiMe
@@ -0,0 +1,1576 @@
+PŘEČTIMĚ ScummVM
+Poslední aktualizace: $Date$
+------------------------------------------------------------------------
+
+Pro více informací, seznamy kompatibility, podrobnosti o dotacích, nejnovější verze, novinky o vývoji a další, prosím navštivte domovskou stránku ScummVM na: http://www.scummvm.org/
+
+
+Obsah:
+------
+1.0) Úvod
+ * 1.1 O ScummVM
+ * 1.2 Rychlý návod
+2.0) Kontakt
+ * 2.1 Hlášení chyb
+3.0) Podporované hry
+ * 3.1 Ochrana proti kopírování
+ * 3.2 Poznámky ke hrám Commodore64
+ * 3.3 Poznámky k Maniac Mansion NES
+ * 3.4 Poznámky ke hrám Macintosh
+ * 3.5 Poznámky ke hrám Multi-CD
+ * 3.6 Poznámky k The Curse of Monkey Island
+ * 3.7 Poznámky ke hrám Broken Sword
+ * 3.8 Poznámky k Beneath a Steel Sky
+ * 3.9 Poznámky k Flight of the Amazon Queen
+ * 3.10 Poznámky ke Gobliiins
+ * 3.11 Poznámky k Inherit the Earth: Quest for the Orb
+ * 3.12 Poznámky k Simon the Sorcerer
+ * 3.13 Poznámky k The Feeble Files
+ * 3.14 Poznámky k The Legend of Kyrandia
+ * 3.15 Poznámky k Předvídavému Vstupnímu Dialogu her Sierra AGI
+ * 3.16 Poznámky k Mickey's Space Adventure
+ * 3.17 Poznámky k Winnie the Pooh
+ * 3.18 Poznámky k Troll's Tale
+ * 3.19 Poznámky k DraÄí Historie
+ * 3.20 Známé problémy
+4.0) Podporované platformy
+5.0) Spuštění ScummVM
+ * 5.1 Možnosti příkazového řádku
+ * 5.2 Volby jazyka
+ * 5.3 Grafické filtry
+ * 5.4 Globální menu
+ * 5.5 Klávesové zkratky
+6.0) Uložené hry
+ * 6.1 Automatické ukládání
+ * 6.2 Převod uložených her
+ * 6.3 Zobrazení/NaÄtení uložených her z příkazového řádku
+7.0) Hudba a zvuk
+ * 7.1 Emulace AdLib
+ * 7.2 Emulace FluidSynth MIDI
+ * 7.3 Emulace MT-32
+ * 7.4 Emulace MIDI
+ * 7.5 Přirozená podpora MIDI
+ * 7.6 Podpora nativního UNIX, ALSA a sekvencéru dmedia
+ * 7.7 Podpora MIDI serveru TiMidity++
+ * 7.8 Použití komprimovaných zvukových souborů (MP3, Ogg Vorbis, Flac)
+ * 7.9 Výstupní vzorkovací kmitoÄet
+8.0) Soubor s nastavením
+9.0) Sestavení
+
+
+1.0) Úvod:
+---- -----
+
+1.1) O ScummVM:
+---- ----------
+ScummVM je program, který Vám umožňuje spouÅ¡tÄ›t urÄité klasické grafické point-and-click adventury, za pÅ™edpokladu, že již máte jejich datové soubory. A teÄ ta chytrá Äást: ScummVM jenom nahrazuje spouÅ¡tÄ›Äe, které jsou dodávány se hrou, což Vám umožňuje hrát hry v systémech, pro které nikdy nebyly navrženy!
+
+Původně byl navržen pro spouštění her SCUMM od LucasArts SCUMM, jako např. Maniac Mansion, Monkey Island, Day of the Tentacle nebo Sam and Max. SCUMM znamená 'Nástroj pro Vytváření Skriptu pro Maniac Mansion', což byla první hra, pro kterou LucasArts tento systém navrhl. A mnohem později dal své jméno ScummVM ('VM' znamená Virtuální Stroj).
+
+Postupem Äasu byla pÅ™idána podpora pro spoustu her mimo SCUMM a
+ScummVM nyní také podporuje mnoho AGI a SCI her od Sierra (např. King's
+Quest 1-6, Space Quest 1-5, ...), Discworld 1 a 2, Simon the Sorcerer 1 and 2, Beneath A Steel Sky, Lure of the Temptress, Broken Sword I a II, Flight of the Amazon Queen, Gobliiins 1-3, série The Legend of Kyrandia, mnoho ze SCUMM her pro dÄ›ti od Humongous Entertainment (vÄetnÄ› her Freddi Fish a Putt Putt) a mnoho dalších. Na stránce kompatibility můžete najít úplný seznam s podrobnostmi, které adventury jsou podporovány a jak dobÅ™e. ScummVM je neustále zlepÅ¡ován a proto navÅ¡tÄ›vujte naÅ¡e stránky Äasto.
+
+Mezi systémy, na kterých můžete tyto hrát, jsou běžné stolní poÄítaÄe (mající Windows, Linux, Mac OS X, ...), herní konzole
+(Dreamcast, Nintendo DS a Wii, PS2, PSP, ...), chytré telefony (Android,
+iPhone, PocketPC, Symbian ...) a další.
+
+V souÄasnosti je ScummVM stále velkou Äástí ve vývoji. Nezapomeňte, že i když se snažíme zajistit, aby mnoho her bylo možno dokonÄit pouze s pár vážnými chybami, pády programu mohou nastat a my neposkytujeme žádné záruky. PÅ™es to vÅ¡echno, nÄ›které hry byly podporovány po dlouhou dobu
+A měly by fungovat v pořádku se všemi novějšími stabilními verzemi. Jak dobře bude hra ve ScummVM fungovat můžete zjistit prohlédnutím stránky kompatibility.
+VlastnÄ›, pokud troÅ¡iÄku zahledáte, můžete zjistit, že ScummVM je používán i komerÄnÄ› pro znovu vydání nÄ›kterých podporovaných her na moderních platformách. To ukazuje, že i nÄ›kolik spoleÄností je spokojeno s kvalitou softwaru a jako moc dobÅ™e může nÄ›které hry spouÅ¡tÄ›t.
+
+Pokud máte ScummVM rádi, můžete ho podpoÅ™it dotací pomocí tlaÄítka PayPal na stránce ScummVM. To nám pomůže zakoupit nástroje potÅ™ebné ke snadnÄ›jšímu a rychlejšímu vývoji ScummVM. Pokud nemůžete podpoÅ™it dotací, pomozte a pÅ™ispÄ›jte záplatou!
+
+1.2) Rychlý návod:
+---- -------------
+Pro ty netrpělivé z Vás je tu návod, jak ScummVM spustit v několika krocích.
+
+1. Stáhněte si ScummVM z <http://www.scummvm.org/downloads.php> a nainstalujte ho.
+
+2. Na Vašem pevném disku vytvořte složku a zkopírujte datové soubory z původního média do této složky. Zopakujte pro všechny hry, které chcete hrát
+
+3. Spusťte ScummVM, zvolte 'Přidat hru', zvolte adresář s datovými soubory hry (nesnažte se volit datové soubory samotné!) a stiskněte
+'Zvolit'.
+
+4. MÄ›lo by se objevit dialogové okno umožňující Vám pozmÄ›nit různá nastavení, pokud tak chcete (i když by mÄ›lo být v pořádku vÅ¡echno nechat ve výchozím nastavení). Dialogové okno potvrÄte.
+
+5. V seznamu vyberte hru, kterou chcete hrát a stiskněte 'Spustit'.
+
+V budoucnu byste mÄ›li být schopni pÅ™eskoÄit na krok 5, pokud nechcete pÅ™idat další hry.
+
+Rada: Pokud chcete pÅ™idat více her najednou, zkuste stisknout a držet klávesu shift pÅ™edtím, než kliknete na 'PÅ™idat hru' – tlaÄítko se zmÄ›ní na 'Hromadné PÅ™idání' a pokud ho stisknÄ›te, jste znovu požádáni o zvolení složky, ale tentokrát ScummVM prohledá vÅ¡echny podsložky pro podporované hry.
+
+
+2.0) Kontakt:
+---- --------
+Nejjednodušším způsobem, jak kontaktovat tým ScummVM je předložením hlášení o chybě (viz oddíl 2.1) nebo použitím našich fór na http://forums.scummvm.org .
+Můžete se také pÅ™ipojit a odesílat a e-maily na korespondenÄní seznam scummvm-devel, nebo s námi chatovat na IRC (#scummvm na irc.freenode.net) Nežádejte nás, prosím, o podporu nefungující hry – nejdříve si pÅ™eÄtÄ›te nejÄastÄ›jší otázky na naší stránce
+
+2.1) Hlášení chyb:
+---- -------------
+Abyste mohli nahlásit chybu, nejdříve si, prosíme, vytvoÅ™te si úÄet na SourceForge a kliknÄ›te na odkaz "Bug Tracker" na naší stránce. UjistÄ›te se, prosím, že se chyba dá znovu zjistit a stále se objevuje v nejnovÄ›jší verzi git/denního sestavení. Také na naší stránce zkontrolujte seznam známých problémů (níže) a seznam kompatibility pro tuto hru, abyste se ujistili, že problém již není znám:
+
+ http://www.scummvm.org/compatibility
+
+Prosíme, nenahlaÅ¡ujte chyby ve hrách, které nejsou v seznamu v sekci 'Supported Games' nebo seznamu kompatibility uvedeny jako dokonÄitelné. My –víme-, že tyto hry mají chyby.
+
+Zahrňte, prosím, následující informace:
+ - Verzi ScummVM (PROSÃME, vyzkouÅ¡ejte nejnovÄ›jší sestavení git/Daily)
+ - Podrobnosti o chybÄ›, vÄetnÄ› postupu na její znovu opakování
+ - Jazyk hry (angliÄtina, nÄ›mÄina, ...)
+ - Verze hry (s Å™eÄí, z diskety, ...)
+ - Platforma a kompilátor (Win32, Linux, FreeBSD, ...)
+ - Pokud možno, přiložte uloženou hru
+ - Pokud se tato chyba objevila pouze nedávno, poznamenejte si poslední verzi bez chyby a první verzi s touto chybou. Takto ji můžeme rychle spravit tím, že se podíváme na provedené změny.
+
+Nakonec prosíme, abyste každou chybu nahlašovali samostatně; neohlašujte několik chyb v jednom hlášení. (Jinak bude obtížné sledovat stav každé jednotlivé chyby).
+
+
+3.0) Podporované hry:
+---- ----------------
+V tuto chvíli je o následujících hrách známo, že fungují a měly by být hratelné až dokonce:
+
+Hry SCUMM od LucasArts:
+ Maniac Mansion [maniac]
+ Zak McKracken and the Alien Mindbenders [zak]
+ Indiana Jones and the Last Crusade [indy3]
+ Loom [loom]
+ The Secret of Monkey Island [monkey]
+ Monkey Island 2: LeChuck's Revenge [monkey2]
+ Indiana Jones and the Fate of Atlantis [atlantis]
+ Day of the Tentacle [tentacle]
+ Sam & Max Hit the Road [samnmax]
+ Full Throttle [ft]
+ The Dig [dig]
+ The Curse of Monkey Island [comi]
+
+Hry AGI od Sierra:
+ The Black Cauldron [bc]
+ Gold Rush! [goldrush]
+ King's Quest I [kq1]
+ King's Quest II [kq2]
+ King's Quest III [kq3]
+ King's Quest IV [kq4]
+ Leisure Suit Larry in the Land of the
+ Lounge Lizards [lsl1]
+ Mixed-Up Mother Goose [mixedup]
+ Manhunter 1: New York [mh1]
+ Manhunter 2: San Francisco [mh2]
+ Police Quest I: In Pursuit of the Death
+ Angel [pq1]
+ Space Quest I: The Sarien Encounter [sq1]
+ Space Quest II: Vohaul's Revenge [sq2]
+ Fanmade Games [agi-fanmade]
+
+Hry AGOS od Adventuresoft/Horrorsoft:
+ Elvira - Mistress of the Dark [elvira1]
+ Elvira II - The Jaws of Cerberus [elvira2]
+ Personal Nightmare [pn]
+ Waxworks [waxworks]
+ Simon the Sorcerer 1 [simon1]
+ Simon the Sorcerer 2 [simon2]
+ Simon the Sorcerer's Puzzle Pack
+ - Demon In My Pocket [dimp]
+ Simon the Sorcerer's Puzzle Pack
+ - Jumble [jumble]
+ Simon the Sorcerer's Puzzle Pack
+ - NoPatience [puzzle]
+ Simon the Sorcerer's Puzzle Pack
+ - Swampy Adventures [swampy]
+ The Feeble Files [feeble]
+
+Hry GOB od Coktel Vision:
+ Bargon Attack [bargon]
+ Gobliiins [gob1]
+ Gobliins 2 [gob2]
+ Goblins 3 [gob3]
+ Lost in Time [lostintime]
+ The Bizarre Adventures of Woodruff
+ and the Schnibble [woodruff]
+ Ween: The Prophecy [ween]
+
+Hry MADE od Activision:
+ Leather Goddesses of Phobos 2 [lgop2]
+ Return to Zork [rtz]
+ Rodney's Funscreen [rodney]
+ The Manhole [manhole]
+
+Další hry:
+ Beneath a Steel Sky [sky]
+ Broken Sword: The Shadow of the Templars [sword1]
+ Broken Sword II: The Smoking Mirror [sword2]
+ Cruise for a Corpse [cruise]
+ Discworld [dw]
+ Discworld 2: Missing Presumed ...!? [dw2]
+ Dragon History [draci]
+ Drascula: The Vampire Strikes Back [drascula]
+ Flight of the Amazon Queen [queen]
+ Future Wars [fw]
+ Inherit the Earth: Quest for the Orb [ite]
+ Nippon Safes Inc. [nippon]
+ The Legend of Kyrandia [kyra1]
+ The Legend of Kyrandia: The Hand of Fate [kyra2]
+ The Legend of Kyrandia: Malcolm's Revenge [kyra3]
+ Touche: The Adventures of the Fifth
+ Musketeer [touche]
+
+Hry SCUMM od Humongous Entertainment:
+ Backyard Baseball [baseball]
+ Backyard Baseball 2001 [baseball2001]
+ Backyard Football [football]
+ Big Thinkers First Grade [thinker1]
+ Big Thinkers Kindergarten [thinkerk]
+ Blue's 123 Time Activities [Blues123Time]
+ Blue's ABC Time Activities [BluesABCTime]
+ Blue's Art Time Activities [arttime]
+ Blue's Birthday Adventure [BluesBirthday]
+ Blue's Reading Time Activities [readtime]
+ Fatty Bear's Birthday Surprise [fbear]
+ Fatty Bear's Fun Pack [fbpack]
+ Freddi Fish 1: The Case of the Missing
+ Kelp Seeds [freddi]
+ Freddi Fish 2: The Case of the Haunted
+ Schoolhouse [freddi2]
+ Freddi Fish 3: The Case of the Stolen
+ Conch Shell [freddi3]
+ Freddi Fish 4: The Case of the Hogfish
+ Rustlers of Briny Gulch [freddi4]
+ Freddi Fish 5: The Case of the Creature
+ of Coral Cove [freddicove]
+ Freddi Fish and Luther's Maze Madness [maze]
+ Freddi Fish and Luther's Water Worries [water]
+ Let's Explore the Airport with Buzzy [airport]
+ Let's Explore the Farm with Buzzy [farm]
+ Let's Explore the Jungle with Buzzy [jungle]
+ Pajama Sam 1: No Need to Hide When It's
+ Dark Outside [pajama]
+ Pajama Sam 2: Thunder and Lightning
+ Aren't so Frightening [pajama2]
+ Pajama Sam 3: You Are What You Eat
+ From Your Head to Your Feet [pajama3]
+ Pajama Sam's Lost & Found [lost]
+ Pajama Sam's Sock Works [socks]
+ Putt-Putt Joins the Parade [puttputt]
+ Putt-Putt Goes to the Moon [puttmoon]
+ Putt-Putt Saves the Zoo [puttzoo]
+ Putt-Putt Travels Through Time [putttime]
+ Putt-Putt Enters the Race [puttrace]
+ Putt-Putt Joins the Circus [puttcircus]
+ Putt-Putt and Pep's Balloon-O-Rama [balloon]
+ Putt-Putt and Pep's Dog on a Stick [dog]
+ Putt-Putt & Fatty Bear's Activity Pack [activity]
+ Putt-Putt's Fun Pack [funpack]
+ SPY Fox 1: Dry Cereal [spyfox]
+ SPY Fox 2: Some Assembly Required [spyfox2]
+ SPY Fox 3: Operation Ozone [spyozon]
+ SPY Fox in Cheese Chase [chase]
+ SPY Fox in Hold the Mustard [mustard]
+
+Hry Living Books:
+ Aesop's Fables: The Tortoise and the Hare [tortoise]
+ Arthur's Birthday [arthurbday]
+ Arthur's Teacher Trouble [arthur]
+ Dr. Seuss's ABC [seussabc]
+ Green Eggs and Ham [greeneggs]
+ Harry and the Haunted House [harryhh]
+ Just Grandma and Me [grandma]
+ Little Monster at School [lilmonster]
+ Ruff's Bone [ruff]
+ Sheila Rae, the Brave [sheila]
+ Stellaluna [stellaluna]
+ The Berenstain Bears Get in a Fight [bearfight]
+ The Berenstain Bears in the Dark [beardark]
+ The New Kid on the Block [newkid]
+
+Následující hry by měly jít spustit, ale zatím nejsou úplně hratelné. Hrajte je pouze na vlastní riziko a prosíme, abyste pro tyto hry nenahlašovali chyby.
+Pokud chcete mít nejnovější zprávy o kompatibilitách her, navštivte naší stránku a prohlédněte si tabulku kompatibilit.
+
+ Backyard Baseball 2003 [baseball2003]
+ Backyard Football 2002 [football2002]
+ Backyard Soccer [soccer]
+ Backyard Soccer MLS [soccermls]
+ Backyard Soccer 2004 [soccer2004]
+ Blue's Treasure Hunt [BluesTreasureHunt]
+ Pajama Sam: Games to Play on Any Day [pjgames]
+
+Následující hry jsou odvozeny od jádra SCUMM, ale ScummVM je nepodporuje (zatím):
+
+ Ostatní hry od Humongous Entertainment
+
+Nezapomeňte, prosím, že jádra mohou obsahovat chyby a nezavedené funkce, které nÄ›kdy zabrání hru dokonÄit. Ukládejte Äasto a nahlaste chyby, prosím (instrukce pro hlášení chyb jsou výše), pokud na takovou chybu narazíte v 'podporované' hÅ™e.
+
+
+3.1) Ochrana proti kopírování:
+---- -------------------------
+Tým ScummVM nepodporuje pirátství. NicménÄ› existují případy, kdy herní spoleÄnosti (jako LucasArts) sami ve svých hrách poskytují 'cracknuté'
+spouÅ¡tÄ›Äe – v tÄ›chto případech datové soubory obsahují skripty pro ochranu proti kopírování, ale pÅ™evadÄ›Ä je obejde (toto může podobnÄ› provádÄ›t nelegálnÄ› cracknutá verze, s tím rozdílem, že zde toto provedl výrobce hry. Neexistuje žádný způsob, jak můžeme rozliÅ¡it legitimní a pirátské datové soubory, takže v hrách, o kterých víme, že byla nÄ›kdy prodávána cracknutá verze původního pÅ™evadÄ›Äe bude ScummVM muset vždy ochranu pÅ™eskoÄit.
+
+V nÄ›kterých případech ScummVM pÅ™esto zobrazí obrazovku ochrany proti kopírování. Zkuste zadat jakoukoli odpovÄ›Ä. Je tu možnost, že toto bude fungovat.
+
+ScummVM přeskakuje ochranu v následujících hrách:
+
+ * Maniac Mansion
+ * Zak McKracken and the Alien Mindbenders
+ * Loom (EGA)
+ * The Secret of Monkey Island (VGA)
+ * Monkey Island 2: LeChuck's Revenge
+ * Beneath a Steel Sky
+ -- potlaÄeno s laskavým svolením Revolution Software.
+ * Inherit the Earth: Quest for the Orb (Floppy version)
+ -- potlaÄeno s laskavým svolením Wyrmkeep Entertainment,
+ protože byla potlaÄena ve vÅ¡ech vydáních hry na CD.
+ * Simon the Sorcerer 1 (Floppy version)
+ * Simon the Sorcerer 2 (Floppy version)
+ -- potlaÄeno s laskavým svolením from Adventure Soft,
+ protože byla potlaÄena ve vÅ¡ech vydáních hry na CD.
+ * Waxworks
+
+
+3.2) Poznámky ke hrám Commodore64:
+---- -----------------------------
+Jak Maniac Mansion tak Zak McKracken mohou být spuštěny, ale Maniac Mansion není ještě hratelný. Jednoduše pojmenujte disky D64 jako
+"maniac1.d64" a "maniac2.d64" nebo "zak1.d64" a "zak2.d64", pak by měl ScummVM automaticky hru zjistit, pokud ho odkážete na správnou složku.
+
+Nebo můžete použít 'extract_mm_c64' z balíÄku nástrojů pro extrahování datových souborů. Pak ale ScummVM hru řádnÄ› automaticky nezjistí ScummVM, a musíte se ujistit, že platforma je nastavena na Commodore64. DoporuÄujeme použít mnohem jednodušší postup popsaný v pÅ™edchozím odstavci.
+
+
+3.3) Poznámky ke Maniac Mansion NES:
+---- -------------------------
+Podporované verze jsou Britská angliÄtina (E), FrancouzÅ¡tina (F), NÄ›mÄina (G), ItalÅ¡tina (I), Å védÅ¡tina (SW) a Americká angliÄtina (U). ScummVM pro spuÅ¡tÄ›ní vyžaduje pouze Äást PRG a ne celý ROM.
+
+Abyste mohli hru spustit, musíte vyjmout prvních 16 bajtů z ROM, s kterým pracujete. Jakýkoli hex editor bude fungovat, pokud můžete kopírovat/vkládat. Poté. Co ROM otevÅ™ete pomocí hex editoru, zkopírujte vÅ¡echno z druhého řádku (17. bajt) na konec. Poté, co toto provedete, vložte ho do nového hex souboru. Pojmenujte ho "Maniac Mansion (XX).prg" kde XX znamená verzi, se kterou pracujete (E, F, G, I, SW, nebo U). KoneÄná velikost by mÄ›la být pÅ™esnÄ› 262144 bajtů.
+
+Pokud hru pÅ™idáváte ruÄnÄ›, ujistÄ›te se, že platforma je nastavena na NES.
+
+Nejběžnější chyby, které zabraňují spuštění hry:
+
+ * Špatný soubor
+ * ROM byl extrahován pomocí nástrojů z verze 0.7.0
+ * Snažíte se do ScummVM vkládat CELà ROM a ne jenom PRG Äást.
+
+Je také možno extrahovat oddÄ›lené soubory LFL z PRG Äásti. Pro toto použijte nástroj 'extract_mm_nes' z balíÄku nástrojů.
+
+
+3.4) Poznámky ke hrám Macintosh:
+---- ---------------------------
+VÅ¡echny adventury LucasArts založené na SCUMM, kromÄ› COMI, také existují ve verzích pro in Macintosh. ScummVM může vÄ›tÅ¡inu (vÅ¡echny?) použít, nicménÄ›, v nÄ›kterých případech je nutná dodateÄná práce. Nejdříve, pokud pro toto nepoužíváte Macintosh, přístup k datům na CD/disketÄ› může být obtížný. Důvodem je to, že Mac používá zvláštní formát disku nazvaný HFS, který ostatní systémy vÄ›tÅ¡inou nepodporují. NicménÄ› existuje, nÄ›kolik nástrojů, které jsou zadarmo a umožňují Äíst takovéto svazky HFS. Například "HFVExplorer" pro Windows a "hfsutils" pro Linux a ostatní Unixové operaÄní systémy.
+
+VÄ›tÅ¡ina novÄ›jších her na Macintosh je dodávána pouze s jedním datovým souborem (v nÄ›kterých případech byl tento soubor uÄinÄ›n neviditelným, takže možná budete potÅ™ebovat dodateÄné nástroje, abyste ho mohli zkopírovat). ScummVM je schopen takovýto soubor použít přímo; jednoduÅ¡e odkažte ScummVM na složku obsahující tento soubor a mÄ›lo by to fungovat (tak jako s každou podporovanou hrou).
+
+V balíÄku nástrojů také poskytujeme nástroj nazvaný 'extract_scumm_mac', který extrahuje data z tÄ›chto datových souborů, ale toto není ani potÅ™eba, ani doporuÄeno.
+
+Pro další informace o kopírování herních souborů Macintosh na Váš pevný disk si prohlédněte:
+
+ http://wiki.scummvm.org/index.php/HOWTO-Mac_Games
+
+
+3.5) Poznámky ke hrám Multi-CD:
+---- --------------------------
+ObecnÄ› ScummVM moc dobÅ™e nefunguje s hrami na Multi-CD. To je proto, že ScummVM pÅ™edpokládá, že vÅ¡echno o hÅ™e může být nalezeno v jedné složce. I když ScummVM má schopnost požádat uživatele, aby vymÄ›nil CD, původní spouÅ¡tÄ›Ä souboru vÄ›tÅ¡inou nainstaluje malé množství souborů na pevný disk. Pokud tyto soubory nelze najít na vÅ¡ech CD, ScummVM bude mít potíže.
+
+Naštěstí může ScummVM hry bez problémů spouštět přímo z pevného disku, pokud vytvoříte složku se správnou kombinací souborů. Většinou, když se soubor objeví na více, než jednom CD můžete vybrat jeden z nich.
+
+
+3.6) Poznámky k The Curse of Monkey Island:
+---- --------------------------------------
+Pro tuto hru budete potřebovat soubory comi.la0, comi.la1 a comi.la2.
+Soubor comi.la0 můžete nalézt na všech CD hry, ale protože jsou stejné, můžete použít kterýkoli z nich.
+
+Dále potřebujete vytvořit podsložku "resource" obsahující všechny soubory z –obou- podsložek "resource" na dvou CD. Některé soubory se objevují na obou CD, ale znovu jsou stejné.
+
+
+3.7) Poznámky ke hrám Broken Sword:
+---- ------------------------------
+Pokyny pro hry Broken Sword jsou pro verze od Sold-Out Software, kde každá hra je na dvou CD, protože tyto verze byly nejdostupnÄ›jší v dobÄ›, kdy je ScummVM zaÄal podporovat. Doufáme, že jsou dostateÄnÄ› obecné pro použití i v jiných vydáních her.
+
+
+3.7.1) Videa z her Broken Sword:
+------ -------------------------
+Videa pro hry Broken Sword mají v sobÄ› trochu historie (viz další oddíl, pokud jste zvÄ›daví), ale obecnÄ› jediné, co potÅ™ebujete udÄ›lat, je zkopírovat soubory .SMK ze složek "SMACKS" nebo "SMACKSHI" na CD do stejné složky jako ostatní datové soubory hry. (Broken Sword má také složku "SMACKSLO" se stejnými videi, ale ty jsou nižší kvality.) Můžete je umístit do podsložky s názvem "video", pokud Vám to pÅ™ijde hezÄí.
+
+Některá vydání hry, a také verze pro PlayStation, Smacker videa nemají. Revolution Software nám laskavě dovolilo poskytovat přeformátovaná videa ke stažení na naší stránce:
+
+ http://www.scummvm.org/downloads.php
+
+Tato videa jsou poskytována ve formátu DXA se zvukem ve formátu FLAC. Jejich kvalita se rovná originálu díky použití bezztrátové komprese. Zobrazení těchto videí vyžaduje, aby verze ScummVM byla sestavena s podporou FLAC i zlib.
+
+Pro systémy, které jsou příliš pomalé, aby zvládli dekódovat formát FLAC byl zvuk videí také poskytnut odděleně ve formátu OGG Vorbis audio. Toto vyžaduje, aby verze ScummVM byla sestavena s podporou libVorbis a zlib.
+
+Pro Broken Sword také poskytujeme přídavek pro titulky. Jednoduše ho rozbalte a následujte pokyny v souboru readme.txt. (Broken Sword II již titulky má; není třeba další práce pro jejich přidání.)
+
+
+3.7.2) Videa her Broken Sword ve zpětném pohledu:
+------ ------------------------------------------
+Původní vydání her Broken Sword používalo formát Smackerâ„¢ od RAD Game Tools. Protože spoleÄnost RAD nebyla ochotna nám otevřít starší zastaralé verze tohoto formátu a požádala, abychom neprovádÄ›li jeho zpÄ›tnou analýzu, museli jsme nalézt jiné Å™eÅ¡ení.
+
+V Broken Sword II bylo možné pÅ™ehrát Å™eÄ, aniž by se muselo pÅ™ehrávat video. To zůstalo jako nouzové Å™eÅ¡ení až do ScummVM 1.0.0, ale pro vÅ¡echny stabilní verze to nikdy nebylo jediné Å™eÅ¡ení.
+
+Ve ScummVM 0.6.0 jsme používali MPEG, což zajistilo rozumný kompromis mezi velikostí a kvalitou. Ve ScummVM 0.10.0 bylo toto nahrazeno DXA
+(původně přidáno pro "The Feeble Files" od AdventureSoft). To nám dalo možnost zajistit videa ve stejné kvalitě jako původní, za cenu větší velikosti.
+
+Nakonec na zaÄátku roku 2006 byl formát Smacker zpÄ›tnÄ› analyzován pro projekt FFmpeg. Díky jejich tvrdé práci ScummVM 1.0.0 nyní podporuje původní videa. Zároveň byla ukonÄena podpora MPEG. Z technického hlediska je toto dobÅ™e, protože pÅ™ehrávání videí MPEG bylo velmi složité a stejnÄ› nevypadaly tak dobÅ™e jako verze ve formátu DXA a Smacker.
+
+
+3.7.3) Broken Sword:
+------ -------------
+Pro tuto hru budete potřebovat všechny soubory ze seskupení složek na obou CD. Pro verze Windows a Macintosh budete také potřebovat soubory speech.clu ze složek speech, ale protože soubory nejsou stejné, budete je muset přejmenovat na speech1.clu a speech2.clu z CD 1 a 2 v tomto pořadí. Verze na PlayStation vyžaduje speech.tab, speech.dat, speech.lis, a speech.inf.
+
+Dále verze pro Windows a Macintosh vyžadují podsložku music se vÅ¡emi soubory z podsložek music na obou CD. NÄ›které z tÄ›chto souborů se objevují na obou CD, ale v tÄ›chto případech jsou buÄ stejné, nebo, v jednom případÄ›, je téměř stejný, že to nemá žádný význam. Verze pro PlayStation vYžaduje tunes.dat a tunes.tab.
+
+
+3.7.4) Broken Sword II:
+------ ----------------
+Pro tuto hru budete potřebovat všechny soubory ze seskupení složek na obou CD. (Abych pravdu řekl, pár z nich nemusí být nezbytně nutné, ale ty, o kterých nemám jistotu, jsou velmi malé.)
+Je také třeba přejmenovat soubory speech.clu a music.clu na speech1.clu,
+speech2.clu, music1.clu a music2.clu, aby ScummVM mohl zjistit, které jsou z CD 1 a které z CD 2. Všechny ostatní soubory, které jsou umístěny v seskupení složek, jsou stejné. Použijte kterékoli soubory chcete.
+
+Kromě toho budete potřebovat soubory cd.inf a, případně, startup.inf ze složky sword2 na CD 1.
+
+
+3.8) Poznámky k Beneath a Steel Sky:
+---- -------------------------------
+Od ScummVM 0.8.0 potÅ™ebujete dodateÄný soubor 'SKY.CPT', abyste mohli Beneath a Steel Sky spustit.
+
+Tento soubor je dostupný na stránce 'Downloads' domovské stránky ScummVM.
+Můžete ho umístit buÄ do složky obsahující ostatní datové soubory (SKY.DNR, SKY.DSK), na VaÅ¡i dodateÄnou cestu, nebo do složky. Kde se nachází spouÅ¡tÄ›cí soubor ScummVM.
+
+
+3.9) Poznámky k Flight of the Amazon Queen:
+---- --------------------------------------
+Abyste mohli použít tu verzi, která není volně šiřitelná
+(z původního CD), musíte mít soubor 'queen.tbl'
+(dostupný ze stránky 'Downloads' naší domovské stránky) a umístit ho buÄ do složky obsahující soubor hry 'queen.1', na VaÅ¡i dodateÄnou cestu, nebo do složky. Kde se nachází spouÅ¡tÄ›cí soubor ScummVM.
+
+Také můžete použít nástroj 'compress_queen' z balíÄku nástrojů pro 'znovu sestavení' VaÅ¡eho datového souboru FOTAQ pro zahrnutí tabulky pro tuto konkrétní verzi, Äímž odstraníte závislost na soubor 'queen.tbl' pÅ™i spuÅ¡tÄ›ní. Tento nástroj Vám také umožňuje komprimovat Å™eÄ a zvukové efekty do formátu MP3, OGG nebo FLAC.
+
+
+3.10) Poznámky ke Gobliiins:
+----- ----------------------
+CD verze série Gobliiins obsahuje jednu velkou zvukovou stopu, kterou potÅ™ebujete vyjmout (viz oddíl o použití komprimovaných zvukových souborů) a zkopírovat ji do herní složky, pokud chcete ve hÅ™e hudbu, aniž byste museli CD mít stále v jednotce. V této stopÄ› jsou také Å™eÄ a její hlasitost se tedy také mÄ›ní podle hlasitosti hudby.
+
+
+3.11) Poznámky k Inherit the Earth: Quest for the Orb
+:
+----- ------------------------------------------------
+Abyste mohli spustit verzi pro Mac OS X od Wyrmkeep musíte data zkopírovat z CD na Váš pevný disk. Pokud používáte PC, pak se podívejte na:
+
+ http://wiki.scummvm.org/index.php/HOWTO-Mac_Games
+
+I když se v tomto Älánku píše hlavnÄ› o hrách SCUMM, je zde také zmínÄ›n nástroj "HFVExplorer", který potÅ™ebujete k extrakci souborů. Nezapomeňte, že data Å™eÄi "Inherit the Earth Voices" musíte umístit do stejného adresáře, kde jsou uložena data hry:
+
+ Inherit the Earth.app/Contents/Resources
+
+Ve staré verzi pro Mac OS 9 potřebujete soubory zkopírovat ve formátu MacBinary, protože by měli obsahovat jak zdrojové, tak datové vidlice. Zkopírujte všechny soubory 'ITE *'.
+
+
+3.12) Poznámky k Simon the Sorcerer 1 a 2:
+----- ------------------------------------
+Pokud máte dvojitou verzi Simon the Sorcerer 1 nebo 2 na CD, verzi pro Windows naleznete v hlavní složce na CD a verzi pro DOS ve složce DOS na CD.
+
+
+3.13) Poznámky k The Feeble Files:
+----- ----------------------------
+Pokud máte verzi pro Windows, je třeba si uvědomit pár věcí.
+
+Mnoho souborů, které hra vyžaduje, je uloženo v souboru InstallShield s názvem data1.cab, který ScummVM nemůže rozbalit. Budete muset použít původní instalátor, nebo i5comp pro rozbalení obsahu tohoto souboru. Nástroj pro dekomprimaci i5comp může být nalezen při hledání na internetu.
+
+Abyste mohli použít soubory s řeÄí ve ScummVM, musí být pÅ™ejmenovány následovnÄ›:
+Přejmenovat voices.wav na CD1 na voices1.wav
+Přejmenovat voices.wav na CD2 na voices2.wav
+Přejmenovat voices.wav na CD3 na voices3.wav
+Přejmenovat voices.wav na CD4 na voices4.wav
+
+3.14) Poznámky k The Legend of Kyrandia:
+----- ----------------------------------
+Abyste mohli spustit The Legend of Kyrandia ve ScummVM potřebujete soubor 'kyra.dat', který můžete najít na stránce 'Downloads' domovské stránky ScummVM.
+
+
+3.15) Poznámky k Předvídavému Vstupnímu Dialogu her Sierra AGI:
+----- ---------------------------------------------------------
+Předvídavý Vstupní Dialog je pomůcka ScummVM pro spouštění her používající jádro AGI (který je znám, že vyžaduje vstup z příkazové řádky) na zařízeních s omezenou podporou klávesnice. V těchto situacích, kdy zadávání pomocí emulované klávesnice je dosti únavné, můžou být příkazy rychle a snadno zadány pomocí Předvídavého Vstupního Dialogu.
+
+Abyste zapnuli pÅ™edvídavý vstup v hrách AGI, potÅ™ebujete zkopírovat soubor pred.dic do dodateÄné složky ScummVM nebo do složky hry, kterou chcete hrát. Tento slovník byl vytvoÅ™en analýzou vÅ¡ech známých her AGI a obsahuje maximální sadu běžných slov.
+
+Pokud je slovník zjiÅ¡tÄ›n je PÅ™edvídavý Vstupní Dialog zobrazen buÄ pÅ™i klinutí na oblast příkazového řádku (kdykoliv je požadován vstup klávesnice, i v rámeÄcích dialogových oken), nebo v nÄ›kterých verzích pro jiné systémy stisknutím urÄené klávesové zkratky.
+
+PÅ™edvídavý Vstupní Dialog pracuje ve tÅ™ech režimech, které jsou pÅ™epínány tlaÄítkem (*)Pre/123/Abc. Hlavní vstupní metodou je pÅ™edvídavý režim
+(Pre), který připomíná "rychlé zadávání" v mobilních telefonech.
+Abeceda je rozdÄ›lena do 9 sad, které pÅ™irozenÄ› odpovídají 9 klávesám Äíselné klávesnice (0 je mezera). Pro psaní slova zmáÄknÄ›te jednou Äíslo sady, která obsahuje písmeno slova, které chcete napsat, pak pokraÄujete k dalšímu. Například, pokud chcete napsat příkaz 'look', mÄ›li byste zmáÄknout 5665. Jak postupnÄ› píšete Äíselný kód zamýšleného slova, je slovník prohledáván pro známá slova, která se shodují s Vaším vstupem až do tohoto bodu. Jak maÄkáte více kláves, slovník se pÅ™iblíží ke správnému slovu. To je důvod, proÄ vypsané slovo se může náhle zmÄ›nit mezi stisky kláves. NÄ›kdy se ale vyskytnou případy, kdy více než jedno slovo má stejné Äíselné zastoupení. Například slova 'quit' a 'suit' odpovídají stejným Äíslům, a to 7848. V tÄ›chto případech se rozsvítí tlaÄítko další
+(#). Jeho stisknutím můžete procházet seznam slov, která sdílejí stejný kód a nakonec pÅ™ijmout to správné stisknutím (0)mezera nebo tlaÄítka Ok.
+
+Druhou vstupní metodou (123) je Äíselný vstup: Každou klávesu, kterou stisknÄ›te, je doslova zadána jako Äíslo.
+
+TÅ™etí vstupní metodou (Abc) je vstupní režim Alfa/opakovaného stisknutí tlaÄítka. Tento režim je urÄen pro zadávání textu bez pomoci od slovníku pÅ™edvídavého režimu (Pre). Text je zadáván po jednotlivých písmenech. Pro každé písmeno nejdříve stisknÄ›te Äíslo sady, které obsahuje písmeno, které chcete, pak použijte tlaÄítko další (#) pro procházení písmeny a opakujte s dalším Äíslem. Například, pro zadání slova 'look' musíte stisknout následující: 5##6##6##5#
+
+Dialogové okno je plnÄ› použitelné pomocí myÅ¡i, ale v nÄ›kterých verzích ScummVM pro jiné platformy, je použití dialogu pohodlnÄ›jší pomocí Äíselné klávesnice. NÄ›která tlaÄítka dialogu mohou být také používána pomocí Å¡ipkových kláves a enter.
+
+
+3.16) Poznámky k Mickey's Space Adventure:
+----- ------------------------------------
+Abyste mohli Mickey's Space Adventure hrát ve ScummVM, potÅ™ebujete spolu s datovými soubory hry také původní spouÅ¡tÄ›Ä executable (mickey.exe).
+
+Pro tuto hru ve ScummVM, existuje rozšířená podpora myÅ¡i, i když v původní hÅ™e takováto podpora nebyla. Položky menu mohou být vybrány pomocí myÅ¡i a je také možné se myší pÅ™esunout do jiných míst. Když se kurzor myÅ¡i nachází na okraji obrazovky, zÄervená, pokud je možné jít v tomto smÄ›ru. HrÃ¡Ä pak může jednoduÅ¡e kliknout na okraje herní obrazovky pro zmÄ›nu místa, podobnÄ› jako mnoho adventur, což je jednodušší a přímoÄaÅ™ejší než pohyb pomocí menu.
+
+
+3.17) Winnie the Pooh notes:
+----- ----------------------
+Je možné importovat uložené hry z původní hry do ScummVM.
+
+Pro tuto hru ve ScummVM, existuje rozšířená podpora myÅ¡i, i když v původní hÅ™e takováto podpora nebyla. Položky menu mohou být vybrány pomocí myÅ¡i a je také možné se myší pÅ™esunout do jiných míst. Když se kurzor myÅ¡i nachází na okraji obrazovky, zÄervená, pokud je možné jít v tomto smÄ›ru. HrÃ¡Ä pak může jednoduÅ¡e kliknout na okraje herní obrazovky pro zmÄ›nu místa, podobnÄ› jako mnoho adventur, což je jednodušší a přímoÄaÅ™ejší než pohyb pomocí menu.
+
+
+3.18) Poznámky k Troll's Tale:
+----- ------------------------
+Původní hra vycházela na zaváděcím disku PC, proto je nutné vypsat obsah tohoto disku jako obraz disku a přejmenovat ho na "troll.img", abyste tuho hru mohli hrát ve ScummVM.
+
+
+3.19) Poznámky k DraÄí Historie:
+----- --------------------------
+Existují 4 jazykové varianty této hry: Äeská, anglická, polská a
+nÄ›mecká. Každá je umístÄ›na v oddÄ›leném archivu. Jediná oficiální verze je Äeská, a anglická, polská a nÄ›mecká byly vždycky nedokonÄené práce a nikdy nebyly oficiálnÄ› vydány. I když texty byly zcela pÅ™eloženy, je známo, že nÄ›které z nich obsahují pÅ™eklepy.
+
+Pro tuto hru existuje nepovinný Äeský dabing. Z důvodu velikosti si ho můžete dodateÄnÄ› stáhnout a pak ho rozbalit do adresáře hry. Můžete také Äeský dabing poslouchat se vÅ¡emi jazykovými varianty hry, zatímco Ätete titulky.
+
+Všechny herní soubory a návody můžou být stáhnuty z
+http://www.ucw.cz/draci-historie/index-en.html
+
+
+3.20) Známé Problémy:
+----- ---------------
+Toto vydání má následující známé problémy. Není tÅ™eba je ohlaÅ¡ovat, i když záplaty pro jejich opravu jsou vítány. Pokud objevíte chybu, která není zde v seznamu, ani není v seznamu kompatibility na internetové stránce, prohlédnÄ›te si, prosím, Äást o hlášení chyb.
+
+ Hry CD Audio:
+- PÅ™i hraní her, které používají CD Audio (hry FM-TOWNS, Loom CD, atd) může u uživatelů Microsoft Windows 2000/XP docházet k náhodným pádům. To je díky dlouhotrvající chybÄ› Windows, která má za následek poÅ¡kozené soubory pÅ™i Ätení z CD. Abyste se tomuto vyhnuli, zkopírujte, prosím, soubory na pevný disk
+
+ Verze FM-TOWNS:
+- Verze Kandži vyžaduje ROM písma FM-TOWNS Font
+- ScummVM bude náhodně padat v následujících hrách při použití ROM písma FM-TOWNS pro Kandži:
+The Secret of Monkey Island, Monkey Island 2: LeChuck's Revenge
+a Indiana Jones and the Fate of Atlantis
+
+ Loom:
+- Vypnutí titulků pomocí souboru nastavení je nevypne spolehlivě, protože skripty Loom je znovu automaticky zapnou
+- Podpora MIDI ve verzi EGA vyžaduje aktualizaci Roland LucasArts
+- Verze Kandži na PC-Engine vyžaduje rom systémové karty
+
+ The Secret of Monkey Island:
+- Podpora MIDI ve verzi EGA vyžaduje aktualizaci Roland LucasArts
+
+ Beneath a Steel Sky:
+- Verze pro Amiga nejsou podporovány
+- Demoverze z diskety nejsou podporovány
+- Není chyba: Ve verzi na CD chybí v jistých dialozích Å™eÄ, to je normální.
+
+ Elvira - Mistress of the Dark
+- Ve verzi pro Atari ST nefunguje hudba
+
+ Elvira II - The Jaws of Cerberus
+- Ve verzi pro Atari ST nefunguje hudba
+
+- Ve verzi pro PC nefungují zvukové efekty
+- Ve verzi pro Atari ST jsou problémy s paletou
+
+ Inherit the Earth: Quest for the Orb
+- Verze pro Amiga nejsou podporovány
+
+ Simon the Sorcerer 1:
+- V anglických a německých verzích na CD nejsou titulky dostupné, protože jim většina titulků chybí.
+
+ Simon the Sorcerer 2:
+- Kombinace Å™eÄi a titulků Äasto způsobí, že Å™eÄ je pÅ™eruÅ¡ena brzo, toto je omezení původní hry.
+- Ve verzích pro Amiga a Macintosh je podporován pouze výchozí jazyk datových souborů (angliÄtina).
+
+ Simon the Sorcerer's Puzzle Pack:
+- Žádná podpora pro zobrazování, zadávání, ukládání, Äi naÄítání nejvyšších skóre.
+- Žádná podpora pro zobrazování názvů položek, když na ně najedete myší ve Swampy Adventures.
+
+ The Feeble Files:
+- Titulky jsou Äasto nedokonÄené. V původní hÅ™e byly vždy zakázány.
+
+ The Legend of Kyrandia:
+- Ve verzích na disketě pro Mac není žádná hudba ani zvukové efekty.
+- CD Macintosh používá zahrnutou hudbu a zvukové efekty z DOS.
+- Verze pro PC-9821 nemá podporu zvukových efektů.
+
+ Hry Humongous Entertainment:
+ - Pouze původní rozhraní pro uložení a naÄtení mohou být použity.
+ - Žádná podpora pro hru více hráÄů nebo tisknutí obrázků
+
+4.0) Podporované Platformy:
+---- ----------------------
+ScummVM byl vytvoÅ™en tak, aby mohl fungovat na mnoha platformách a operaÄních systémech.
+Odkazy na tyto verze můžou být nalezeny buÄ na stránkách ScummVM nebo vyhledáváním na internetu. Mnoho díků naÅ¡im programátorům za jejich úsilí. Pokud máte verzi ScummVM pro jinou platformu/systém a chcete ho odevzdat do hlavního úložiÅ¡tÄ›, neváhejte nás kontaktovat!
+
+Podporované platformy zahrnují (mimo jiné):
+
+ UNIX (Linux, Solaris, IRIX, *BSD, ...)
+ Windows
+ Windows CE a Windows Mobile (vÄetnÄ› Smartphonů a PocketPCs)
+ Mac OS X
+ AmigaOS
+ Android
+ BeOS
+ Dreamcast
+ GP2x
+ iPhone (vÄetnÄ› iPod Touch a iPad)
+ Maemo (Nokia Internet tablet N810)
+ Nintendo 64
+ Nintendo DS
+ Nintendo GameCube
+ Nintendo Wii
+ OS/2
+ PlayStation 2
+ PlayStation Portable
+ Symbian
+ WebOS
+
+Verze pro Dreamcast nepodporuje The Curse of Monkey Island, ani The Dig. Verze pro Nintendo DS nepodporuje Full Throttle, The Dig, nebo The Curse of Monkey Island.
+Pro další omezení v závislosti na platformě se, prosím, podívejte na naší Wiki:
+ http://wiki.scummvm.org/index.php/Platforms
+
+Ve verzi pro Macintosh je stisknutí pravého tlaÄítka myÅ¡i emulováno pomocí Cmd-kliknutí (to je, že stisknete tlaÄítko myÅ¡i pÅ™i držení klávesy
+Command/Apple/Vrtule).
+
+Také existují neoficiální verze pro různé platformy, vÄetnÄ› PlayStation 3, Xbox, a Xbox 360. Nezapomeňte, že my jsme tyto verze nevytvoÅ™ili, takže je nemůžeme ani schválit ani podporovat. Používejte na vlastní riziko!
+
+
+5.0) Spuštění ScummVM:
+---- -----------------
+VÅ¡imnÄ›te si prosím, že ScummVM bude uložené hry standardnÄ› ukládat do složky z které je spuÅ¡tÄ›n, takže byste se mÄ›li vyhnout jeho spouÅ¡tÄ›ní z více umístÄ›ní. Další informace, vÄetnÄ› jak urÄit složku pro uložené hry pro zamezení tohoto problému, najdete v oddílu 6.0.
+
+ScummVM může být také spuÅ¡tÄ›n přímo pomocí spouÅ¡tÄ›cího souboru. V tomto případÄ› bude aktivován zabudovaný spouÅ¡tÄ›Ä. OdsuÄ můžete pÅ™idat hry
+(klikněte na 'Přidat hru'), nebo spustit ty, co už jsou nastaveny.
+Hry mohou být také přidány ve velkém množství. Stisknutím shift + 'Přidat
+Hru' (VÅ¡imnÄ›te si, že se tlaÄítko zmÄ›ní na 'Hromadné PÅ™idání'), můžete zvolit složku, v které zaÄít, a ScummVM se poté pokusí zjistit hry ve vÅ¡ech podsložkách této složky.
+
+ScummVM může také hru spustit přímo pomocí argumentů příkazové řádky -- viz další Äást.
+
+
+5.1) Možnosti příkazového řádku:
+---- ---------------------------
+
+ Použití: scummvm [MOŽNOSTI]... [HRA]
+
+ [HRA] Krátké jméno hry pro naÄtení. Například 'monkey'pro Monkey Island. To může být buÄ id hry, nebo uživatelem urÄený cíl.
+ -v, --version Zobrazí informace o verzi ScummVM a ukonÄí se
+ -h, --help Zobrazí struÄnou nápovÄ›du a ukonÄí se
+ -z, --list-games Zobrazí seznam podporovaných her a ukonÄí se
+ -t, --list-targets Zobrazí seznam nastavených cílů a ukonÄí se
+ --list-saves=CÃL Zobrazí seznam ulož. her pro urÄenou hru (CÃL)
+ --console Povolí okno konzole (výchozí: zapnuto) (Pouze pro Windows)
+ -c, --config=Nastavení Použije jiný soubor s nastavením
+ -p, --path=CESTA Cesta, kde je hra nainstalována
+ -x, --save-slot[=ÄŒÃSLO] Pozice uložené hry pro naÄtení (výchozí: automatická)
+ -f, --fullscreen Vynutit režim celé obrazovky
+ -F, --no-fullscreen Vynutit režim do okna
+ -g, --gfx-mode=REŽIM Vybere režim obrazu (viz také Äást 5.3)
+ --gui-theme=VZHLED Vybere vzhled rozhraní (výchozí, moderní, klasický)
+ --themepath=CESTA Cesta kde jsou vzhledy rozhraní uloženy
+ --list-themes Zobrazí seznam všech použitelných vzhledů
+ -e, --music-driver=REŽIM Vybere ovladaÄ hudby (viz také Äást 7.0)
+ -q, --language=JAZYK Vybere jazyk hry (viz také Äást 5.2)
+ -m, --music-volume=Č. Nastaví hlasitost hudby, 0-255 (výchozí: 192)
+ -s, --sfx-volume=Č. Nastaví hlasitost zvuků, 0-255 (výchozí: 192)
+ -r, --speech-volume=Č. Nastaví hlasitost hlasů, 0-255 (výchozí: 192)
+ --midi-gain=ÄŒ. Nastaví zvýšení pro pÅ™ehrávání MIDI, 0-1000 (výchozí: 100) (podporováno pouze nÄ›kterými ovladaÄi MIDI)
+ -n, --subtitles Zapne titulky (použijte v hrách s Å™eÄí)
+ -b, --boot-param=ÄŒ. PÅ™edá Äíslo zavádÄ›jícímu skriptu (parametr zavedení)
+ -d, --debuglevel=Č. Nastaví úroveň podrobností ladění
+ --debugflags=PŘÃZNAKY Povolí urÄité příznaky ladÄ›ní jádra (oddÄ›lené Äárkami)
+ -u, --dump-scripts Povolí výpis skriptu, pokud složka s názvem 'dumps' existuje v souÄasné složce
+ --cdrom=ÄŒÃSLO Jednotka CD z které pÅ™ehrávat CD audio (výchozí: 0 = první jednotka)
+ --joystick[=ÄŒÃSLO] Povolí vstup z joysticku (výchozí: 0 = první joystick)
+ --platform=SLOVO UrÄí platformu hry (povolené hodnoty: 2gs, 3do, acorn, amiga, atari, c64, fmtowns, mac, nes, pc, pce, segacd, windows)
+ --savepath=CESTA Cesta, kde jsou umístěny uložené hry
+ --extrapath=CESTA DodateÄná cesta pro další data hry
+ --soundfont=SOUBOR Vybere SoundFont pro pÅ™ehrávání MIDI (Podporováno pouze nÄ›kterými ovladaÄi MIDI)
+ --multi-midi Povolí kombinaci AdLib a přirozeného MIDI
+ --native-mt32 Pravý Roland MT-32 (zakáže emulaci GM)
+ --enable-gs Povolí režim Roland GS pro přehrávání MIDI
+ --output-rate=FREKVENCE Výstupní vzorkovací kmitoÄet v Hz (napÅ™. 22050)
+ --opl-driver=OVLADAČ Vybere emulátor AdLib (OPL) (db, mame)
+ --aspect-ratio Povolí korekci poměru stran
+ --render-mode=REŽIM Povolí dodateÄné režimy vykreslení (cga, ega, hercGreen, hercAmber, amiga)
+ --alt-intro Použije alternativní intro pro CD verze Beneath a Steel Sky a Flight of the Amazon Queen
+ --copy-protection Povolí ochranu proti kopírování v hrách, když ji ScummVM standardně zakazuje.
+ --talkspeed=ÄŒÃSLO Nastaví zdržení mluvení v hrách SCUMM, nebo rychlost mluvení v jiných hrách (výchozí: 60)
+ --demo-mode Spustí režim dema v Maniac Mansion (Klasická verze)
+ --tempo=NUM Nastaví rychlost hudby (v procentech, 50-200) pro hry SCUMM (výchozí: 100)
+
+
+Význam vÅ¡ech dlouhých možností (to jsou ty, které zaÄínají dvojitou pomlÄkou) může být pÅ™evrácen, když pÅ™ed nÄ› pÅ™idáte "no-". Například,
+--no-aspect-ratio vypne korekci pomÄ›ru stran. To je užiteÄné, když chcete potlaÄit nastavení v souboru.
+
+Krátké jméno hry ('cíl hry'), který vidíte na konci příkazového řádku, urÄuje, která hra je spuÅ¡tÄ›na. BuÄ odpovídá libovolnému cíli urÄeného uživatelem (ze souboru s nastavením), nebo zabudovanému id hry. Krátký seznam zabudovaných id může být nalezen v Äásti list 3.0.
+
+Příklady:
+ * Win32:
+ Spuštění Monkey Island, celá obrazovka, z pevného disku:
+ C:\Games\LucasArts\scummvm.exe -f -pC:\Games\LucasArts\monkey\ monkey
+ Spuštění Full Throttle z CD, celá obrazovka a se zapnutými titulky:
+ C:\Games\LucasArts\scummvm.exe -f -n -pD:\resource\ ft
+
+ * Unix:
+ Spuštění Monkey Island, celá obrazovka, z pevného disku:
+
+ /path/to/scummvm -f -p/games/LucasArts/monkey/ monkey
+ Spuštění Full Throttle z CD, celá obrazovka a se zapnutými titulky:
+ /path/to/scummvm -f -n -p/cdrom/resource/ ft
+
+
+5.2) Volby jazyka:
+---- -------------
+ScummVM obsahuje volby jazyka pro Maniac Mansion, Zak McKracken,
+The Dig, The Curse of Monkey Island, Beneath a Steel Sky a
+Broken Sword.
+
+Nezapomeňte, že kromě Beneath a Steel Sky, Broken Sword, mnohajazykové verze her Goblins a Nippon Safes Inc., použití této možnosti *nezmění* jazyk hry (který je většinou pevně zakódován), ale spíše je použita pro vybrání správného písma (např. pro německou verzi obsahující přehlásky).
+
+Výjimky jsou The Dig a The Curse of Monkey Island -- neanglické
+Verze mohou být nastaveny na 'English'. NicménÄ› toto ovlivňuje pouze titulky; Å™eÄ ve hÅ™e zůstane stejná.
+
+Maniac Mansion a Zak McKracken
+ en - AngliÄtina (výchozí)
+ de - NÄ›mÄina
+ fr - Francouzština
+ it - Italština
+ es - Španělština
+
+The Dig
+ jp - Japonština
+ zh - Čínština
+ kr - Korejština
+
+The Curse of Monkey Island
+ en - AngliÄtina (výchozí)
+ de - NÄ›mÄina
+ fr - Francouzština
+ it - Italština
+ pt - Portugalština
+ es - Španělština
+ jp - Japonština
+ zh - Čínština
+ kr - Korejština
+
+Beneath a Steel Sky
+ gb - AngliÄtina (Velká Británie) (výchozí)
+ en - AngliÄtina (USA)
+ de - NÄ›mÄina
+ fr - Francouzština
+ it - Italština
+ pt - Portugalština
+ es - Španělština
+ se - Švédština
+
+Broken Sword
+ en - AngliÄtina (výchozí)
+ de - NÄ›mÄina
+ fr - Francouzština
+ it - Italština
+ pt - Portugalština
+ es - Španělština
+ cz - Čeština
+
+
+5.3) Grafické filtry:
+---- ----------------
+ScummVM nabízí nÄ›kolik filtrů vyhlazujících hrany jako pokus o zlepÅ¡ení obrazové kvality. Jsou to stejné filtry, které používá i mnoho jiných emulátorů, jako MAME. Tyto filtry vezmou původní grafiku hry a zvÄ›tší ji o urÄitou pevnou hodnotu (vÄ›tÅ¡inou 2x nebo 3x) než ji Vám zobrazí. Takže například, pokud hra původnÄ› pracovala v rozliÅ¡ení 320x200 (typické pro vÄ›tÅ¡inu her SCUMM), pak použitím filtru s faktorem zvÄ›tÅ¡ení 2x, ve skuteÄnosti dostanete rozliÅ¡ení 640x400. PodobnÄ› s filtrem 3x dostanete 960x600.
+
+Jsou to:
+ 1x - Bez filtrování, bez zvětšení. Nejrychlejší.
+ 2x - Bez filtrování, zvětšení 2x (výchozí pro hry 640x480).
+ 3x - Bez filtrování, zvětšení 3x.
+ 2xsai - Filtr 2xSAI, zvětšení 2x.
+ super2xsai – Vylepšené filtrování 2xSAI, zvětšení 2x.
+ supereagle – Méně rozostřený než 2xSAI, ale pomalejší. Zvětšení 2x.
+ advmame2x - Nespoléhá na rozostření jako 2xSAI, rychlé. Zvětšení 2x.
+ advmame3x - Nespoléhá na rozostření jako 2xSAI, rychlé. Zvětšení 3x.
+ hq2x - Velmi hezká vysoká kvalita, ale pomalý. Zvětšení 2x.
+ hq3x - Velmi hezká vysoká kvalita, ale pomalý. Zvětšení 3x.
+ tv2x - Filtr prokládání, snaží se emulovat TV. Zvětšení 2x.
+ dotmatrix - Efekt bodové matice. Zvětšení 2x.
+
+Abyste filtr vybrali, zvolte ho ve spouÅ¡tÄ›Äi, nebo pÅ™edejte scummvm jeho jméno pomocí možnosti '-g', například:
+
+ scummvm -gadvmame2x monkey2
+
+Poznámka #1: Ne všechny jádra podporují všechny (nebo dokonce žádné) z filtrů vypsaných výše; některé mohou podporovat i další. Filtry vypsané výše jsou ty podporované standardním jádrem SDL.
+
+Poznámka #2: Filtry mohou být velmi pomalé, když je ScummVM sestaven v nastavení pro ladění bez optimalizací. Použití jakékoliv formy vyhlazení hran/lineárního filtrování bude mít vždycky dopad na rychlost.
+
+Poznámka #3: Verze FM-TOWNS hry Zak McKracken má původní rozlišení 320x240, což znamená, že filtry v této hře budou zvětšovat na 640x480
+nebo 960x720. Obdobně hry, které mají původní rozlišení 640x480 (jako
+Curse of Monkey Island nebo Broken Sword) budou zvětšeny na 1280x960 a
+1920x1440.
+
+
+5.4) Globální menu:
+---- --------------
+Globální Menu je obecné menu, které je dostupné vÅ¡em jádrům her stisknutím Ctrl-F5. Z tohoto menu jsou dostupné následující tlaÄítka: PokraÄovat, Volby, O programu, Návrat do SpouÅ¡tÄ›Äe, a UkonÄit. VýbÄ›rem
+'Volby' bude zobrazeno dialogové okno, kde můžou být upravena základní nastavení zvuku, jako hladiny hlasitosti. VýbÄ›rem 'Návrat do SpouÅ¡tÄ›Äe' souÄasnou hru ukonÄí a uživatele navrátí do spouÅ¡tÄ›Äe ScummVM, kde může být vybrána další hra ke hraní.
+
+Poznámka: Návrat do SpouÅ¡tÄ›Äe není podporován vÅ¡emi jádry a tlaÄítko nebude v Globálním Menu funkÄní, pokud není podporováno.
+
+Jádra, která v souÄasnosti podporují návrat do spouÅ¡tÄ›Äe, jsou:
+
+ AGI
+ AGOS
+ CINE
+ DRACI
+ GOB
+ GROOVIE
+ KYRA
+ LURE
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TOUCHE
+ TUCKER
+
+
+5.5) Klávesové zkratky:
+---- ------------------
+ScummVM podporuje různé zkratky ve hře. Liší se mezi různými hrami SCUMM a jinými hrami.
+
+ SpoleÄné:
+ Ctrl-F5 - Zobrazí Globální Menu
+ Cmd-q - UkonÄit (Mac OS X)
+ Ctrl-q - UkonÄit (další unixy vÄetnÄ› Linux)
+ Ctrl-z OR Alt-x - Quit (další platformy)
+ Ctrl-u - Zeslabí všechny zvuky
+ Ctrl-m - Přepínat zachycení myši
+ Ctrl-Alt 1-8 - Přepínat mezi grafickými filtry
+ Ctrl-Alt + and - - Zvětšit/Zmenšit faktor zvětšení
+Ctrl-Alt a - Přepínat korekci poměru stran. Většina her používá rozlišení 320x200 pixelů, což může na většině novějších monitorů vypadat splácle. Korekce poměru stran obraz roztáhne, aby místo toho použil 320x240, nebo jeho násobky
+ Alt-Enter - Přepíná celou obrazovku/do okna
+ Alt-s - Vytvořit snímek obrazovky (pouze jádro SDL)
+
+ SCUMM:
+ Ctrl 0-9 and Alt 0-9 - Nahrát a uložit stav hry
+ Ctrl-d - Spustit ladění
+ Ctrl-f - Zapnout rychlý režim
+ Ctrl-g - Přepnout do velmi VELMI rychlého režimu
+ Ctrl-t - PÅ™epínat mezi 'Pouze Å™eÄ',
+ 'ŘeÄ a Titulky' a 'Pouze titulky'
+ Tilda (~) - Zobrazit/skrýt konzoli ladění
+ [ and ] - Hlasitost hudby, zvýšit/snížit
+ - and + - Rychlost textu, pomalejší/rychlejší
+ F5 - Zobrazí rámeÄek pro uložení/naÄtení
+ Alt-F5 - Zobrazí původní rámeÄek pro uložení/naÄtení, pokud hra nÄ›jaký má. Zde můžete hru naÄíst i uložit, nicménÄ› pro tento úÄel není urÄen a v nÄ›kterých hrách může způsobit pád ScummVM.
+ i - Zobrazí IQ body (Indiana Jones and the Last Crusade a Indiana Jones and the Fate of Atlantis)
+ Mezerník - Pozastavení
+ TeÄka (.) - V nÄ›kterých hrách pÅ™eskoÄí souÄasný řádek textu
+ Enter - Simulovat stisknutí levého tlaÄítka myÅ¡i
+ Tab - Simulovat stisknutí pravého tlaÄítka myÅ¡i
+
+ Beneath a Steel Sky:
+ Ctrl-d - Spustí ladění
+ Ctrl-f - Zapnout rychlý režim
+ Ctrl-g - Přepnout do velmi VELMI rychlého režimu
+ F5 - Zobrazí rámeÄek pro uložení/naÄtení
+ Escape - PÅ™eskoÄí úvod hry
+ Period (.) - PÅ™eskoÄí souÄasný řádek textu
+
+ Broken Sword:
+ F5 nebo Escape - Zobrazí rámeÄek pro uložení/naÄtení
+
+ Broken Sword II:
+ Ctrl-d - Spustit ladění
+ Ctrl-f - Zapnout rychlý režim
+ p - Pozastavení
+
+ DraÄí Historie:
+ F5 - Zobrazí Globální Menu
+ Levé klinutí - Jít, zkoumat
+ Pravé klinutí - Použít, mluvit
+ Posun myši nahoru, i - Inventář
+ Posun myši dolů, m - Mapa
+ Escape - PÅ™eskoÄí úvod, odejde z mapy/inventáře
+ Jakékoliv kliknutí - PÅ™eskoÄí souÄasnÄ› dabovanou vÄ›tu
+ q - Zapnutí/vypnutí rychlého chození
+
+ Flight of the Amazon Queen:
+ Ctrl-d - Spustit ladění
+ Ctrl-f - Zapnout rychlý režim
+ F1 - Použít Deník (ukládání/naÄítání)
+ F11 - Rychlé naÄtení
+ F12 - Rychlé ukládání
+ Escape - PÅ™eskoÄí video
+ Mezerník - PÅ™eskoÄí souÄasný řádek textu
+
+ Future Wars
+ F1 - Prozkoumat
+ F2 - Vzít
+ F3 - Inventář
+ F4 - Použít
+ F5 - Aktivovat
+ F6 - Mluvit
+ F9 - Menu "Aktivovat"
+ F10 - Menu "Použít"
+ Escape - Zobrazit menu příkazů
+
+ Nippon Safes
+ Ctrl-d - Spustit ladění
+ l - NaÄíst hru
+ s - Uložit hru
+
+ Simon the Sorcerer 1 a 2:
+ Ctrl 0-9 a Alt 0-9 - NaÄíst a uložit stav hry
+ Ctrl-d - Spustit ladění
+ Ctrl-f - Zapnout rychlý režim
+ F1 - F3 - Rychlost textu, rychlejší - pomalejší
+ F10 - Zobrazí všechny postavy a objekty s kterými můžete něco dělat
+ Escape - PÅ™eskoÄit videa
+ - a + - Hlasitost hudby, snížit/zvýšit
+ m - Hudba vypnout/zapnout
+ s - Zvukové efekty zapnout/vypnout
+ b - Zvuky pozadí zapnout/vypnout [Pouze Simon the Sorcerer 2]
+ Pause - Pozastavení
+ t - PÅ™epínat mezi Å™eÄí a kombinací Å™eÄi a titulků [Simon the Sorcerer 1 CD (jiné než angliÄtina a nÄ›mÄina) a Simon the Sorcerer 2 CD (vÅ¡echny jazyky)]
+ v - PÅ™epínat mezi titulky a kombinací Å™eÄi a titulků [Pouze Simon the Sorcerer 2 CD]
+
+ Simon the Sorcerer's Puzzle Pack
+ Ctrl-d - Spustit ladění
+ Ctrl-f - Zapnout rychlý režim
+ F12 - Zapnout/vypnout režim rychle rychlosti ve Swampy Adventures
+ - a + - Hlasitost hudby, snížit/zvýšit
+ m - Hudba vypnout/zapnout
+ s - Zvukové efekty zapnout/vypnout
+ Pause - Pozastavení
+
+ The Feeble Files
+ Ctrl-d - Spustit ladění
+ Ctrl-f - Zapnout rychlý režim
+ F7 - Vyměnit postavy
+ F9 - Zapnout/vypnout jména hitboxů
+ s - Zvukové efekty zapnout/vypnout
+ Pause - Pozastavení
+ t - PÅ™epínat mezi Å™eÄí a kombinací Å™eÄi a titulků
+ v - PÅ™epínat mezi titulky a kombinací Å™eÄi a titulků
+
+ The Legend of Kyrandia:
+ Ctrl 0-9 and Alt 0-9 - NaÄíst a uložit stav hry
+
+ Ctrl-d - Spustit ladění
+
+ TeenAgent
+ F5 - Zobrazí Globální Menu
+
+ Touche: The Adventures of the Fifth Musketeer:
+ Ctrl-f - Zapnout rychlý režim
+ F5 - Zobrazit možnosti
+ F9 - Zapnout režim rychlé chůze
+ F10 - Vypnout režim rychlé chůze
+ Escape - UkonÄit
+ Mezerník - PÅ™eskoÄí souÄasný řádek textu
+ t - PÅ™epnout mezi 'Pouze ŘeÄ',
+ 'ŘeÄ a Text' a ' Pouze Text'
+
+Nezapomeňte, že používání Ctrl-f nebo Ctrl-g není doporuÄeno: hry mohou spadnout, když běží rychlostí vyšší než jejich normální, protože skripty ztratí synchronizaci.
+
+Poznámka pro uživatele WinCE: Kvůli omezenému vstupu z klávesnice ve vÄ›tÅ¡inÄ› zařízení je malé množství klávesových zkratek podporováno pomocí znovu mapování a/nebo Äinností panelů. Prosím pÅ™eÄtÄ›te si soubor README-WinCE.txt.
+
+
+6.0) Uložené hry:
+---- ------------
+Uložené hry jsou na nÄ›kterých platformách standardnÄ› umístÄ›ny do souÄasné složky a v jiných do pÅ™ednastavené složky. To můžete urÄit v souboru s nastavení nastavením parametru savepath. Podívejte se na vzorový soubor s nastavením dále v tomto souboru.
+
+Platformy, které v souÄasnosti mají jiné výchozí složky jsou:
+ Mac OS X: $HOME/Documents/ScummVM Savegames/
+ Jiné unixy: $HOME/.scummvm/
+
+6.1) 6.1 Automatické ukládání:
+---- -------------------------
+V některých hrách, (a to "Beneath a Steel Sky", "Flight of the Amazon
+Queen", vÅ¡echny hry AGI, and vÅ¡echny hry SCUMM), bude ScummVM standardnÄ› automaticky ukládat souÄasný stav každých pÅ¡t minut (upravitelné pomocí nastavení "autoukládání"). Pro jádra AGI a SCUMM, je bude ukládat do pozice 0. V jádru SCUMM může být tento uložený stav znovu naÄten pomocí Ctrl-0 nebo menu F5.
+
+
+6.2) Převod uložených her:
+---- ---------------------
+Použití uložených her z původních verzí není podporováno všemi jádry. Pouze následující hry mohou použít původní verze.
+
+ Elvira 1
+ - PÅ™idejte 8 bajtů (název uložené hry) na zaÄátek souboru uložené hry
+ - Přejmenujte ho na 'elvira1.xxx'
+
+ Elvira 2
+ - PÅ™idejte 8 bajtů (název uložené hry) na zaÄátek souboru uložené hry
+ - Přejmenujte ho na 'elvira2-pc.xxx' (verze DOS) nebo 'elvira2.xxx' (Jiné verze)
+
+ Waxworks
+ - PÅ™idejte 8 bajtů (název uložené hry) na zaÄátek souboru uložené hry
+ - Přejmenujte ho na 'waxworks-pc.xxx' (verze DOS) nebo 'waxworks.xxx' (Jiné verze)
+
+ Simon the Sorcerer 1
+ - Přejmenuje soubor uložené hry na 'simon1.xxx'
+
+ Simon the Sorcerer 2
+ - Přejmenuje soubor uložené hry na 'simon2.xxx'
+
+ The Feeble Files
+ - Přejmenuje soubor uložené hry na 'feeble.xxx'
+
+Kde 'xxx' je Äíslo pozice uložené hry (tj. 001) ve ScummVM
+
+
+6.3) Zobrazení/NaÄtení uložených her z příkazového řádku:
+---- ----------------------------------------------------
+
+--list-saves:
+
+ Tento pÅ™epínaÄ může být použit k zobrazení seznamu souÄasných uložených her urÄené cílové hry a její odpovídající pozice.
+
+ Použití: --list-saves=[CÃL], kde [CÃL] je cílová hra.
+
+ Jádra, která v souÄasnosti podporují --list-saves jsou:
+
+ AGI
+ AGOS
+ CINE
+ DRACI
+ GROOVIE
+ KYRA
+ LURE
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TINSEL
+ TOUCHE
+ TUCKER
+
+--save-slot/-x:
+
+ Tento pÅ™epínaÄ může být použit k naÄtení uložené hry přímo z příkazového řádku.
+
+ Použití: --save-slot[POZICE] nebo -x[POZICE], kde [POZICE] je Äíslo uložené pozice.
+
+ Jádra, která v souÄasnosti podporují--save-slot/-x jsou:
+
+ AGI
+ CINE
+ DRACI
+ GROOVIE
+ KYRA
+ LURE
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TINSEL
+ TOUCHE
+
+
+7.0) Hudba a Zvuk:
+---- -------------
+Ve vÄ›tÅ¡inÄ› operaÄních systémů a pro vÄ›tÅ¡inu her bude ScummVM standardnÄ› používat MT-32 nebo emulaci AdLib pro pÅ™ehrávání hudby. MIDI nemusí být
+Dostupné ve vÅ¡ech operaÄních systémech, nebo potÅ™ebuje ruÄní nastavení. Pokud chcete MIDI použít, máte nÄ›kolik různých voleb pro výstup, v závislosti na VaÅ¡em operaÄním systému a nastavení.
+
+ null - Prázdný výstup. Nepřehrávat žádnou hudbu.
+ adlib - Vnitřní emulace AdLib
+ fluidsynth – Emulace FluidSynth MIDI
+ mt32 - Vnitřní emulace MT-32
+ pcjr - Vnitřní emulace PCjr (použitelné pouze ve hrách SCUMM)
+ pcspk - Vnitřní emulace reproduktoru PC
+ towns - Vnitřní emulace FM-TOWNS YM2612
+ (použitelné pouze v hrách SCUMM FM-TOWNS)
+ alsa - Výstup pomocí zařízení sekvencéru ALSA. Viz níže.
+ core - Zvuk CoreAudio, pro uživatele Mac OS X.
+ coremidi - Zvuk CoreMIDI, pro uživatele Mac OS X. Používejte pouze, pokud máte hardwarový syntetizátor MIDI.
+ seq - Použití /dev/sequencer pro MIDI v systému *nix. Viz níže
+ timidity - Připojení k MIDI serveru TiMidity++. Viz níže.
+ windows - Windows MIDI. Použije zabudovaný sekvencér, pro Windows
+
+Abyste vybrali ovladaÄ zvuku, zvolte ho ve spouÅ¡tÄ›Äi, nebo pÅ™edejte jeho jméno ScummVM pomocí možnosti '-e', například:
+
+ scummvm -eadlib monkey2
+
+
+7.1) Přehrávání zvuku pomocí emulace AdLib:
+---- --------------------------------------
+Standardně bude karta AdLib emulována a ScummVM hudbu přehrává jako vzorkované vlny. To je výchozí režim pro většinu her a nabízí nejlepší kompatibilitu mezi stroji a hrami.
+
+
+7.2) Přehrávání zvuku pomocí emulace FluidSynth MIDI:
+---- ------------------------------------------------
+Pokud byl ScummVM sestaven s podporou libfluidsynth bude schopen pÅ™ehrávat hudbu MIDI pomocí ovladaÄe FluidSynth. Budete muset ale urÄit, který SoundFont použít.
+
+Protože výchozí hlasitost výstupu od FluidSynth může být velmi nízká,
+ScummVM standardnÄ› nastaví zvýšení, aby dostal silnÄ›jší signál. To může být dále upaveno použitím možnosti příkazového řádku --midi-gain, nebo nastavením "midi_gain" v konfiguraÄním souboru.
+
+Nastavení může nabývat hodnoty od 0 po 1000 a výchozí je 100. (Toto odpovídá nastavení zvýšení FluidSynth's 0.0 až 10.0, což je pravděpodobně měřeno v decibelech.)
+
+POZNÃMKA: Požadavky na procesor pro FluidSynth můžou být v nÄ›kterých případech dosti vysoké. Je doporuÄeno mít rychlé CPU.
+
+
+7.3) Přehrávání zvuku pomocí emulace MT-32:
+---- --------------------------------------
+NÄ›které hry, které obsahují hudební data MIDI, také mají vylepÅ¡ené stopuy urÄené pro zvukový modul MT-32. ScummVM může toto zařízení nyní emulovat, nicménÄ› aby toto zařízení fungovalo, musíte mít původní ROMy MT-32:
+
+MT32_PCM.ROM - IC21 (512KB)
+MT32_CONTROL.ROM - IC26 (32KB) a IC27 (32KB), prokládané podle bajtu
+
+Tyto ROMy umístÄ›te do herního adresáře, ve Vaší dodateÄné cestÄ›, nebo v adresáři, kde je umístÄ›n spouÅ¡tÄ›Ä ScummVM.
+
+S tímto ovladaÄem nemusíte zadávat --native-mt32, protože je automaticky zapnut.
+
+POZNÃMKA: Požadavky na procesor pro emulátor jsou velmi vysoké; rychlé
+CPU je velmi doporuÄeno.
+
+
+7.4) Přehrávání zvuku pomocí emulace MIDI:
+---- -------------------------------------
+NÄ›které hry (jako Sam & Max) obsahují pouze hudební data MIDI. Toto bránilo, aby hudba v tÄ›chto hrách fungovala na platformách, které MIDI nepodporují, nebo na zvukových kartách, které neposkytují ovladaÄe MIDI (napÅ™. mnoho zvukových karet nebude v Linuxu MIDI pÅ™ehrávat). ScummVM nyní může MIDI emulovat pomocí vzorkovaných vln a AdLib, emulaci MIDI FluidSynth nebo emulace MT-32 pomocí možností -eadlib, -efluidsynth nebo -emt32 v tomto poÅ™adí. NicménÄ› pokud máte možnost použít pÅ™irozené MIDI, doporuÄujeme použít jeden z režimů MIDI níže pro nejlepší zvuk.
+
+
+7.5) Přehrávání zvuku pomocí emulace Přirozeného MIDI:
+---- -------------------------------------------------
+Použijte vhodnou možnosti příkazového řádku -e<režim> ze seznamu výše pro vybrání VaÅ¡eho upÅ™ednostňovaného zařízení MIDI. Například pokud chcete použít ovladaÄ Windows MIDI, použijte možnost -ewindows.
+
+
+7.5.1) Použití možností MIDI k přizpůsobení výstupu přirozené MIDI:
+------ ------------------------------------------------------------
+ScummVM podporuje různé režimy MIDI v závislosti na schopnostech Vašeho zařízení MIDI.
+
+Pokud je zadáno --native-mt32, ScummVM se k VaÅ¡emu zařízení bude chovat jako ke skuteÄné MT-32. Protože mapování instrumentů a výhradní systémové příkazy MT-32 se liší od zařízení General MIDI, tuto možnost byste mÄ›li povolit, pouze když používáte skuteÄné Roland MT-32, LAPC-I,CM-64, CM-32L, CM-500, nebo zařízení GS s mapou MT-32.
+
+Pokud je zadáno --enable-gs, ScummVM zavede VaÅ¡e zařízení kompatibilní s GS pomocí nastavení, která napodobují nastavení dozvuku MT-32, (nedostatek) chóru, citlivost ohýbaní tónu, atd. Pokud je toto spoleÄnÄ› použito s --native-mt32, ScummVM vybere mapu kompatibilní s MT-32 a bicí soupravu na VaÅ¡em zařízení GS. Toto nastavení funguje lépe než standardní emulace GM nebo GS ve hrách, které nemají vlastní mapování instrumentů (Loom a Monkey1). ObÄ› nastavení byste mÄ›li použít pouze tehdy, pokud máte zařízení GS, které má mapu MT-32, jako SC-55, SC-88, SC-88 Pro, SC-8820, SC-8850, atd. Nezapomeňte, že --enable-gs je automaticky zakázáno v DOTT a Samnmax, protože samostatnÄ› používají General MIDI.
+
+Pokud není ani jedna z možností výše povolena, ScummVM Vaše zařízení zavede v režimu General MIDI a použije emulaci GM v hrách se zvukovým doprovodem MT-32.
+
+Některé hry obsahují zvukové efekty pouze v AdLib. Pro tyto hry, byste měli zadat --multi-midi, abyste zkombinovali hudbu MIDI se zvukovými efekty AdLib.
+
+
+7.6) Přehrávání zvuku pomocí Sekvencéru MIDI: [POUZE UNIX]
+---- ----------------------------------------
+Pokud Váš ovladaÄ podporuje sekvencér, můžete nastavit promÄ›nnou prostÅ™edí "SCUMMVM_MIDI" na VaÅ¡em zařízení sekvencéru – například na /dev/sequencer
+
+Pokud máte problém se zvukem v tomto nastavení, možná budete muset nastavit proměnnou prostředí "SCUMMVM_MIDIPORT" na 1 nebo 2. Toto vybere port, který bude použit ve zvoleném sekvencéru. Pak spusťte scummvm s parametrem -eseq. To by mělo fungovat pro několik karet a může nabízet lepší výkon a kvalitu, než emulace AdLib. Nicméně pro systémy, kde podpora sekvencéru nefunguje, můžete vždycky přejít na emulaci AdLib.
+
+
+7.6.1) Přehrávání zvuku pomocí Sekvencéru ALSA: [POUZE UNIX]
+------ ----------------------------------------
+Pokud Máte nainstalován ovladaÄ ALSA s podporou sekvencéru, pak můžete nastavit promÄ›nnou prostÅ™edí "SCUMMVM_PORT" nebo promÄ›nnou souboru s nastavením "alsa_port" pro urÄení portu VaÅ¡eho sekvencéru. Pokud ani jedno není nastaveno, jsou standardnÄ› vyzkouÅ¡eny oba porty "65:0" a "17:0".
+
+Zde je krátký návod, jak sekvencér použít s Vaší zvukovou kartou. Ve všech případech, pro získání seznamu všech portů sekvencéru, zkuste příkaz "aconnect -o -l". To by mělo mít výstup podobný tomuto:
+
+client 14: 'Midi Through' [type=kernel]
+ 0 'Midi Through Port-0'
+client 16: 'SBLive! Value [CT4832]' [type=kernel]
+ 0 'EMU10K1 MPU-401 (UART)'
+client 17: 'Emu10k1 WaveTable' [type=kernel]
+ 0 'Emu10k1 Port 0 '
+ 1 'Emu10k1 Port 1 '
+ 2 'Emu10k1 Port 2 '
+ 3 'Emu10k1 Port 3 '
+client 128: 'TiMidity' [type=user]
+ 0 'TiMidity port 0 '
+ 1 'TiMidity port 1 '
+ 2 'TiMidity port 2 '
+ 3 'TiMidity port 3 '
+
+NejdůležitÄ›jší Äást zde je, že existují ÄtyÅ™i výstupy WaveTable MIDI umístÄ›né na 17:0, 17:1, 17:2 a 17:3, a ÄtyÅ™i porty TiMidity umístÄ›né na 128:0, 128:1, 128:2 a 128:3.
+
+Pokud na Vaší kartÄ› máte Äip FM FM, jako tÅ™eba SB16, pak musíte naÄíst SoundFonts pomocí softwaru sbiload. Například:
+
+ sbiload -p 17:0 /etc/std.o3 /etc/drums.o3
+
+Pokud je VaÅ¡e karta schopná používat WaveTable, musíte naÄíst SoundFont sbk nebo sf2 pomocí softwaru sfxload nebo asfxload. Například:
+
+ sfxload /cesta/k/8mbgmsfx.sf2
+
+Pokud VaÅ¡e karta neumí s MIDI pracovat, existují dvÄ› možnosti: FluidSynth a TiMidity. DoporuÄujeme FluidSynth, protože v mnoha systémech bude TiMidity 'zaostávat' za hudbou. To je velmi znatelné v hrách používající
+iMUSE, který používá rychlé a dynamické přechody hudby.
+SpuÅ¡tÄ›ním TiMidity jako root mu umožní nastavit prioritu v reálném Äase, což může zaostávání snížit.
+
+Příkaz pro TiMidity, aby se stal sekvencérem ALSA:
+
+ timidity -iAqqq -B2,8 -Os1S -s 44100 &
+
+(Pokud s tímto nastavením dostáváte zkreslený výstup, můžete zkusit vynechat -B2,8 nebo změnit hodnotu.)
+
+Příkaz pro TiMidity, aby se stal sekvencérem ALSA (použitím SoundFonts):
+
+ fluidsynth -m alsa_seq /cesta/k/8mbgmsfx.sf2
+
+Jakmile je TiMidity nebo FluidSynth spuÅ¡tÄ›n, použijte příkaz 'aconnect -o -l' jak je pospáno výše v této Äásti.
+
+
+7.6.2) Přehrávání zvuku pomocí Sekvencéru IRIX dmedia: [POUZE UNIX]
+------ -----------------------------------------------
+Pokud používáte IRIX a ovladaÄ dmedia s podporou sekvencéru, můžete nastavit promÄ›nnou prostÅ™edí "SCUMMVM_MIDIPORT" nebo promÄ›nnou souboru s nastavením "dmedia_port" pro urÄení portu VaÅ¡eho sekvencéru. StandardnÄ› je použit první port.
+
+Abyste získali seznam nastavených rozhraní midi ve Vašem systému, spusťte příkaz "startmidi" bez parametrů. Vzorový výstup:
+
+ 2 MIDI interfaces configured:
+ Serial Port 2
+ Software Synth
+
+V tomto případě můžete ScummVM nastavit, aby použil "Software Synth" místo standardního "Serial Port 2" přidáním řádku
+
+ dmedia_port=Software Synth
+
+do VaÅ¡eho souboru s nastavením v Äásti [scummvm], nebo nastavením SCUMMVM_PORT=Software Synth ve VaÅ¡em prostÅ™edí.
+
+
+7.7) Použití MIDI serveru TiMidity++:
+---- --------------------------------
+Pokud na Vašem systému chybí jakýkoliv sekvencér MIDI, ale přesto chcete lepší kvalitu MIDI, než kterou může nabídnout standardní emulace AdLib, můžete zkusit MIDI server TiMidity++. Prohlédněte si http://timidity.sourceforge.net/ pro stažení a pokyny k instalaci.
+
+Nejdříve musíte spustit daemona:
+
+ timidity -ir 7777
+
+Nyní můžete spustit ScummVM a zkusit vybrat TiMidity jako výstup pro hudbu. StandardnÄ› se pÅ™ipojí k localhost:7777, ale hostitele/port můžete zmÄ›nit pomocí promÄ›nné prostÅ™edí "TIMIDITY_HOST". Můžete také urÄit
+"Äíslo zařízení" použitím promÄ›nné "SCUMMVM_MIDIPORT".
+
+
+7.8) Použití komprimovaných zvukových souborů
+---- ----------------------------------------
+
+7.8.0) Použití souborů MP3 pro CD audio:
+------ ---------------------------------
+Použijte LAME nebo jiný kodér MP3 pro vyjmutí stop cd audio do souborů.
+Soubory pojmenujte track1.mp3 track2.mp3 atd. ScummVM musí být sestaven s podporou MAD pro použití této možnosti. Soubory budete muset z CD vyjmout ve formátu WAV, pak je převést do formátu MP3 v konstantní přenosové rychlosti. To může být provedeno pomocí následujícího příkazového řádku:
+
+ lame -t -q 0 -b 96 track1.wav track1.mp3
+
+
+7.8.1) Použití souborů Ogg Vorbis pro CD audio:
+------ ----------------------------------------
+Použijte oggenc nebo jiný kodér vorbis k pÅ™evedení zvukových stop do souborů. Pojmenujte je track1.ogg track2.ogg atd. ScummVM musí být sestaven s podporou vorbis pro použití této možnosti. Soubory budete muset z CD vyjmout ve formátu WAV, pak je pÅ™evést do formátu vorbis. To může být provedeno pomocí následujícího příkazového řádku pro oggenc, kde hodnota po q urÄuje požadovanou kvalitu od 0 do 10:
+
+ oggenc -q 5 track1.wav
+
+
+7.8.2) Použití souborů Flac pro CD audio:
+------ ----------------------------------
+Použijte flac nebo jiný kodér flac k převedení zvukových stop do souborů.
+Pojmenujte je track1.flac track2.flac atd. Pokud Váš souborový systém podporuje přípony pouze se třemi písmeny, pojmenujte je track1.fla track2.fla atd. ScummVM musí být sestaven s podporou flac pro použití této možnosti. Soubory budete muset z CD vyjmout ve formátu WAV, pak je převést do formátu flac. To může být provedeno pomocí následujícího příkazového řádku pro flac:
+
+ flac --best track1.wav
+
+Nezapomeňte, že kvalita bude vždy stejná, různé možnosti kodéru ovlivňují dobu kódování a výslednou velikost souboru.
+
+
+7.8.3) Komprimování MONSTER.SOU pomocí MP3:
+------ ------------------------------------
+PotÅ™ebujete LAME a náš nástroj 'compress_scumm_sou' z balíÄku
+scummvm-tools, abyste toto mohli provést a ScummVM musí být sestaven s podporou MAD.
+
+ compress_scumm_sou monster.sou
+
+Nakonec dostanete mnohem menší soubor monster.so3, tento soubor zkopírujte do Vaší složky hry. Pak můžete soubor monster.sou odstranit.
+
+
+7.8.4) Komprimování MONSTER.SOU pomocí Ogg Vorbis:
+------ -------------------------------------------
+Tak jako výše, ale ScummVM musí být sestaven s podporou OGG. Spusťte:
+
+ compress_scumm_sou --vorbis monster.sou
+
+To by mělo vytvořit menší soubor monster.sog file, který byste měli zkopírovat do složky hry. Kódování Ogg může trvat mnohem déle než u MP3, takže mějte po ruce dobrou knížku.
+
+
+7.8.5) Komprimování MONSTER.SOU pomocí Flac:
+------ -------------------------------------
+Tak jako výše, ale ScummVM musí být sestaven s podporou Flac. Spusťte:
+
+ compress_scumm_sou --flac monster.sou
+
+To by mÄ›lo vytvoÅ™it menší soubor monster.sof, který byste mÄ›li zkopírovat do složky hry. Nezapomeňte, že kvalita bude vždy stejná, různé možnosti kodéru ovlivňují dobu kódování a výslednou velikost souboru. ZmÄ›na velikosti bloku (-b <hodnota>), má nejvÄ›tší vliv na výslednou velikost souboru -- 1152 se zdá být dobrá hodnota pro tento druh zvukových souborů. PÅ™eÄtÄ›te si dokumentaci kodéru pÅ™edtím, než použijete další hodnoty.
+
+
+7.8.6) Komprimování hudby/zvuku/hlasu v hrách AGOS:
+------ --------------------------------------------
+Pro tento úkol použijte náš nástroj 'compress_agos' z balíÄku scummvm-tools. Můžete volit mezi nÄ›kolika cílovými formáty, ale nezapomeňte, že je můžete použít pouze tehdy, když ScummVM byl sestaven se zapnutou podporou konkrétního dekodéru.
+
+ compress_agos effects (Pro CD verzi Simon 1 od Acorn)
+ compress_agos simon (Pro CD verzi Simon 1 od Acorn)
+ compress_agos effects.voc (Pro DOS CD verzi Simon 1)
+ compress_agos simon.voc (Pro DOS CD verzi Simon 1)
+ compress_agos simon.wav (Pro Windows CD verzi Simon 1)
+ compress_agos simon2.voc (Pro DOS CD verzi Simon 2)
+ compress_agos simon2.wav (Pro Windows CD verzi Simon 2)
+ compress_agos mac (Pro Macintosh verzi Simon 2)
+
+ compress_agos voices1.wav (Pro Windows verzi Feeble na 2CD/4CD)
+ compress_agos voices2.wav (Pro Windows verzi Feeble na 2CD/4CD)
+ compress_agos voices3.wav (Pro Windows verzi Feeble na 4CD)
+ compress_agos voices4.wav (Pro Windows verzi Feeble na 4CD)
+
+ compress_agos Music (Pro Windows verzi Puzzle Pack)
+
+Pro Ogg Vorbis přidejte k volbám --vorbis, tj.
+
+ compress_agos --vorbis
+
+Pro Flac pÅ™idejte k volbám --flac a dodateÄné parametry, tj.
+
+ compress_agos --flac
+
+Nakonec dostanete mnohem menší soubor *.mp3, *.ogg nebo *.fla, zkopírujte ho do Vaší složky hry. Starý soubor můžete bezpeÄné odebrat.
+
+
+7.8.7) Komprimování Å™eÄi/hudby v Broken Sword:
+------ ---------------------------------------
+Nástroj 'compress_sword1' z balíÄku scummvm-tools může pÅ™evést hudbu a Å™eÄ do MP3, Ogg Vorbis a také Flac. NejsnadnÄ›jším způsobem, jak soubory pÅ™evést, je prosté zkopírování spouÅ¡tÄ›Äe do Vaší složky BS1 (spolu s kodérem lame) a pak ho odsud spustit. Tak bude vÅ¡echno automaticky pÅ™evedeno na MP3. Poté, můžete ruÄnÄ› odstranit soubory SPEECH?.CLU a hudební soubory wave.
+
+Spuštěním "compress_sword1 --vorbis" soubory zkomprimuje pomocí Ogg Vorbis místo MP3.
+
+Spuštěním "compress_sword1 --flac" soubory zkomprimuje pomocí Flac
+místo MP3.
+
+Použijte "compress_sword1 --help", abyste dostali úplný seznam možností.
+
+
+7.8.8) Komprimování Å™eÄi/hudby v Broken Sword II:
+------ ------------------------------------------
+Pro tento úkol použijte náš nástroj 'compress_sword2'. Můžete volit mezi několika cílovými formáty, ale nezapomeňte, že je můžete použít pouze tehdy, když ScummVM byl sestaven se zapnutou podporou konkrétního dekodéru.
+
+ compress_sword2 speech1.clu
+ compress_sword2 music1.clu
+
+Pro Ogg Vorbis přidejte --vorbis k možnostem, tj.
+
+ compress_sword2 --vorbis
+
+Nakonec budete mít mnohem menší soubor *.cl3 nebo *.clg, tento soubor zkopírujte do složky hry. Starý soubor můžete bezpeÄné odstranit.
+
+Je možné použít Flac pro komprimaci pÅ™idáním možnosti by --flac. NicménÄ› výsledný soubor *.clf je ve skuteÄnosti vÄ›tší než původní.
+
+Nezapomeňte, prosím, že compress_sword2 bude fungovat pouze se ÄtyÅ™mi soubory Å™eÄi/hudby v Broken Sword II. Nebude fungovat s dalšími soubory *.clu, ani nebude fungovat se soubory Å™eÄi z Broken Sword.
+
+
+7.9) Výstupní vzorkovací kmitoÄet:
+---- -----------------------------
+Výstupní vzorkovací kmitoÄet říká ScummVM, kolik vzorků zvuku má hrát v kanálu za sekundu. Je toho hodnÄ›, co by se dalo říct o tomto tématu, ale vÄ›tÅ¡ina toho je zde nepodstatné. Krátká verze je, že vÄ›tÅ¡inÄ› her staÄí 22050 Hz, ale v nÄ›kterých případech je lepší 44100 Hz. Na extrémnÄ› pomalých systémech byste radÄ›ji mÄ›li použít 11025 Hz, ale je nepravdÄ›podobnÄ›, že byste se s tímto museli zabývat.
+
+Abychom to rozvedli, vÄ›tÅ¡ina zvuků, které ScummVM musí pÅ™ehrát, byla vzorkována buÄ na 22050 Hz, nebo 11025 Hz. Použitím vyššího kmitoÄtu jako kouzlem nezvýší kvalitu tÄ›chto zvuků. Proto je 22050 Hz v pořádku.
+
+NÄ›které hry používají CD audio. Pokud pro toto používáte komprimované soubory, jsou pravdÄ›podobnÄ› vzorkovaný na kmitoÄtu 44100 Hz, takže pro tyto hry je toto pravdÄ›podobnÄ› lepší volba kmitoÄtu.
+
+PÅ™i použití ovladaÄů hudby AdLib, FM Towns, PC Speaker nebo IBM PCjr je
+ScummVM zodpovÄ›dný za vytváření vzorků. VÄ›tÅ¡inou bude 22050 Hz staÄit, ale existuje alespoň jedna stopa hudby AdLib Beneath a Steel Sky, která zní lépe pÅ™i 44100 Hz.
+
+Použití kmitoÄtů mezi není doporuÄeno. Za prvé VaÅ¡e zvuková karta ho nemusí podporovat. Teoreticky by se ScummVM mÄ›l vrátit k rozumnému kmitoÄtu, ale nespoléhejte na to. DůležitÄ›jší je ale to, že ScummVM musí pÅ™evzorkovat vÅ¡echny zvuky na jejich výstupní kmitoÄet. To je mnohem snadnÄ›jší k provedení, když výstupní kmitoÄet je násobkem původního.
+
+
+8.0) Soubor s nastavením:
+---- --------------------
+StandardnÄ› je soubor s nastavením uložen a naÄítán:
+
+ Windows Vista:
+ \Users\jméno uživatele\AppData\Roaming\ScummVM\scummvm.ini,
+
+ Windows 2000/XP:
+ \Documents and Settings\jméno už\Application Data\ScummVM\scummvm.ini
+
+ Windows NT4:
+ <složkawin>\Profiles\jméno už\Application Data\ScummVM\scummvm.ini,
+
+ Windows 95/98/ME:
+ <složkawin>\scummvm.ini,
+
+ Pokud ve Windows nainstalována dřívější verze ScummVM bude ponecháno dřívější umístění '<složkawin>\scummvm.ini'.
+
+ Unix:
+ ~/.scummvmrc
+
+ Mac OS X:
+ ~/Library/Preferences/ScummVM Preferences
+ (zde ~ oznaÄuje VaÅ¡i domovskou složku)
+
+ Další:
+ scummvm.ini v souÄasné složce
+
+Vzorový soubor s nastavením vypadá takto:
+
+ [scummvm]
+ gfx_mode=supereagle
+ fullscreen=true
+ savepath=C:\saves\
+
+ [sky]
+ path=C:\games\SteelSky\
+
+ [germansky]
+ gameid=sky
+ language=de
+ path=C:\games\SteelSky\
+ description=Beneath a Steel Sky w/ German subtitles
+
+ [germandott]
+ gameid=tentacle
+ path=C:\german\tentacle\
+ description=German version of DOTT
+
+ [tentacle]
+ path=C:\tentacle\
+ subtitles=true
+ music_volume=40
+ sfx_volume=255
+
+ [loomcd]
+ cdrom=1
+ path=C:\loom\
+ talkspeed=5
+ savepath=C:\loom\saves\
+
+ [monkey2]
+ path=C:\amiga_mi2\
+ music_driver=windows
+
+Jsou rozpoznávána následující klíÄová slova:
+
+ path řetězec Cesta, kde jsou umístěny datové soubory hry
+ autosave_period Äíslo VteÅ™iny mezi autoukládáním (výchozí: 300)
+ save_slot Äíslo Číslo uložené, které pÅ™i spuÅ¡tÄ›ní naÄíst.
+ savepath řetězec Cesta, kde hra bude ukládat uložené hry.
+ versioninfo řetězec Verze ScummVM, která vytvořila soubor.
+ gameid Å™etÄ›zec SkuteÄné id hry. UžiteÄné, pokud máte nÄ›kolik verzí stejné hry a chcete pro nÄ› různé pÅ™ezdívky. Viz příklad.
+ description Å™etÄ›zec Popis hry jak se zobrazí ve spouÅ¡tÄ›Äi.
+ language Å™etÄ›zec UrÄí jazyk (en, us, de, fr, it, pt, es,
+ jp, zh, kr, se, gb, hb, cz, ru)
+ speech_mute boolean Pokud true, Å™eÄ je ztlumena
+ subtitles boolean Pokud true jsou titulky zapnuty.
+ talkspeed Äíslo ZpoždÄ›ní textu v hrách SCUMM, nebo rychlost textu v jiných hrách.
+ fullscreen boolean Režim celé obrazovky
+ aspect_ratio boolean Povolit korekci poměru stran
+ disable_dithering boolean Odstranit artefakty chvění v některých hrách EGA
+ gfx_mode řetězec Grafický režim (normální, 2x, 3x, 2xsai, super2xsai, supereagle, advmame2x, advmame3x,hq2x, hq3x, tv2x, dotmatrix)
+ confirm_exit boolean Zeptat se uživatele na potvrzení pÅ™ed ukonÄením (pouze jádro SDL).
+ console boolean Povolit okno konzole (výchozí: zapnuto) (pouze Windows).
+ cdrom Äíslo Číslo jednotky CD-ROM, kterou použít pro zvuk. Pokud je záporné, k pokusu o přístup k CD-ROM nedojde.
+ joystick_num Äíslo Číslo zařízení joysticku, které použít pro vstup
+ music_driver řetězec Které hudební jádro použít.
+ opl_driver řetězec Který emulátor AdLib (OPL) použít.
+ output_rate Äíslo Který výstupní vzorkovací kmitoÄet použít v Hz. Rozumné hodnoty jsou 11025, 22050 a 44100.
+ alsa_port Å™etÄ›zec Který port použít pro výstup pÅ™i použití hudebního ovladaÄe ALSA.
+ music_volume Äíslo Nastavení hlasitosti hudby (0-255)
+ multi_midi boolean Pokud true, je povoleno smíšený AdLib a přirozený MIDI.
+ soundfont Å™etÄ›zec Který SoundFont použít pro pÅ™ehrávání MIDI. (Podporováno pouze nÄ›kterými ovladaÄi MIDI.)
+ native_mt32 boolean Pokud true, zakáže emulaci GM a předpokládá, že je dostupný pravý Roland MT-32.
+ enable_gs boolean Pokud true, povolí funkce urÄené pro Roland GS ke zlepÅ¡ení emulace GM. Pokud je native_mt32 také nastaven na true, zařízení GS zvolí mapu MT-32 pro pÅ™ehrávání správných instrumentů.
+ sfx_volume Äíslo Nastavení hlasitosti zvuku (0-255)
+ tempo Äíslo Rychlost hudby (50-200) (výchozí: 100)
+ speech_volume Äíslo Nastavení hlasitosti Å™eÄi (0-255)
+ midi_gain Äíslo Zvýšení MIDI (0-1000) (výchozí: 100) (Podporováno pouze nÄ›kterými ovladaÄi MIDI.)
+ copy_protection boolean Povolí ochranu proti kopírování v urÄitých hrách, kde by ji ScummVM standardnÄ› zakázal.
+ demo_mode boolean Spustit demoverzi v Maniac Mansion
+ alt_intro boolean Použít alternativní úvod pro CD verze Beneath a Steel Sky a Flight of the Amazon Queen
+ boot_param Äíslo PÅ™edá toto Äíslo zavádÄ›címu skriptu
+
+Broken Sword II pÅ™idává následující nestandardní klíÄová slova:
+
+ gfx_details Äíslo Nastavení grafických detailů (0-3)
+ music_mute boolean Pokud true, hudba je ztlumena
+ object_labels boolean Pokud true, popisky objektů jsou povoleny
+ reverse_stereo boolean Pokud true, kanály stereo jsou obráceny
+ sfx_mute boolean Pokud true, zvukové efekty jsou ztlumeny
+
+Flight of the Amazon Queen pÅ™idává následující nestandardní klíÄová slova
+
+ music_mute boolean Pokud true, hudba je ztlumena
+ sfx_mute boolean Pokud true, zvukové efekty jsou ztlumeny
+
+King's Quest VI Windows pÅ™idává následující nestandardní klíÄová slova:
+
+ windows_cursors boolean Pokud true, jsou použity původní Äernobílé kurzory místo kurzorů z DOS. Pokud false, jsou ve verzi Windows použity kurzory DOS, zvÄ›tÅ¡ené, aby se shodovaly se zbytkem zvÄ›tÅ¡ené grafiky
+
+Simon the Sorcerer 1 a 2 pÅ™idává následující nestandardní klíÄová slova:
+
+ music_mute boolean Pokud true, hudba je ztlumena
+ sfx_mute boolean Pokud true, zvukové efekty jsou ztlumeny
+
+The Legend of Kyrandia pÅ™idává následující nestandardní klíÄová slova:
+
+ walkspeed celé Äíslo Rychlost chůze (0-4)
+
+
+9.0) Sestavení:
+---- ----------
+Pro aktuální přehled o tom, jak ScummVM sestavit pro různé platformy, prohlédněte si, prosím, naší Wiki, zvláště tuto stránku:
+
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM
+
+Pokud sestavujete ve Windows, Linux nebo Mac OS X, potřebujete SDL-1.2.2
+Nebo novÄ›jší (starší verze mohou fungovat, ale nejsou podporovány) a podporovaný kompilátor. VÄ›tÅ¡ina kompilátorů, vÄetnÄ› GCC, mingw a novÄ›jších verzí Microsoft Visual C++ jsou podporovány. Pokud chcete použít stopy CD komprimované do MP3 nebo soubory .SOU, musíte nainstalovat knihovnu MAD; podobnÄ› potÅ™ebujete vhodné knihovny pro komprimovaný zvuk pomocí Ogg Vorbis a FLAC. Pro komprimované uložené stavy je potÅ™eba mít zlib.
+
+NÄ›které Äásti ScummVM, zvláštÄ› zvÄ›tÅ¡ovaÄe, mají vysoce optimalizované verze napsané v assembleru. Pokud si pÅ™ejete tuto možnost použít, potÅ™ebuje mít nainstalován assembler nasm (viz http://nasm.sf.net). Nezapomeňte, že v souÄasnosti máme pouze verze optimalizované pro x86 MMX, a nebudou sestaveny pro jiné procesory.
+
+Na Win9x/NT/XP můžete urÄit USE_WINDBG a pÅ™ipojit WinDbg pro procházení ladících zpráv (viz http://www.sysinternals.com/ntw2k/freeware/debugview.shtml).
+
+ GCC a MinGW32:
+ * Zadejte "./configure"
+ * Zadejte "make" (nebo "gmake", Äi "gnumake", v závislosti na tom, jak je GNU make ve VaÅ¡em systému nazván) a ScummVM snad bude pro Vás sestaven.
+ * Pro další informace si prohlédněte:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/GCC
+ Äi
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW
+
+ Microsoft Visual C++ 8/9/10:
+ * PÅ™eÄtÄ›te si, jak vytvoÅ™it soubory projektu ve "dists\msvc8",
+ "dists\msvc9" příslušně "dists\msvc10".
+ * Otevřete výsledný soubor projektu.
+ * Zadejte cestu k potÅ™ebným knihovnám a hlsiÄkovým souborům v
+ Tools|Options|Projects and Solutions|VC++ Directories".
+ * TeÄ by program mÄ›l být úspěšnÄ› sestaven.
+ * Pro další informace si prohlédněte:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/VS2005
+
+ Windows Mobile:
+ * PÅ™eÄtÄ›te si prosím:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/Windows_CE
+
+ Debian GNU/Linux:
+ * VeVaÅ¡em systému nainstalujte balíÄky 'build-essential', 'fakeroot', 'debhelper' a 'libsdl1.2-dev'.
+ * Instalujte jakýkoli z tÄ›chto balíÄků (nepovinné): 'libvorbis-dev' (pro podporu Ogg Vorbis), 'libasound2-dev' (pro podporu sekvencéru ALSA), 'libmad0-dev' (pro podporu MAD MP3), 'zlib1g-dev' (pro podporu komprimovaných uložených pozic).
+ * Spusťte 'make deb'.
+ * Nakonec spusťte 'dpkg -i ../scummvm-cvs*deb', a máte hotovo.
+
+ Mac OS X:
+ * Ujistěte se, že máte nainstalovány nástroje pro vývojáře.
+ * BalíÄek SDL pro vývojáře na OS X, který je dostupný na stránce SDL _není_ vhodný. Spíše potÅ™ebujete sestavení v unixovém stylu. Jeden takový způsob, jak ho nainstalovat je pomocí Fink
+ (http://fink.sf.net). Také můžete SDL sestavit ruÄnÄ› ze zdrojového kódu pomocí systému sestavení pro unix (configure a make).
+ * Ve složce ScummVM zadejte "./configure".
+ * Nyní můžete zadat 'make' pro vytvoÅ™ení spouÅ¡tÄ›Äe příkazového řádku.
+ * Abyste získali verzi, kterou můžete spustit z Finder, zadejte 'make bundle' což vytvoří ScummVM.app (to funguje pouze, když máte SDL nainstalován do /sw, což se při instalaci Fink provede). Pokud jste SDL nainstalovali jiným způsobem, budete muset upravit ports.mk).
+ * Pro další informace si prohlédněte:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/MacOS_X_Crosscompiling
+
+ AmigaOS 4 (Křížová kompilace pomocí Cygwin):
+ * Ujistěte se, že máte nainstalován SDL, můžete také potřebovat
+ libogg, libvorbis, libvorbisfile, zlib, libmad.
+ * Zadejte ./configure --host=ppc-amigaos
+ * Pokud dostanete chybu o sdl-config, použijte parametr --with-sdl-prefix pro nastavení cesty.
+ * Zkontrolujte soubor 'config.mk' a pokud je vše v pořádku:
+ * Spusťte 'make'.
+ * Křížová kompilace pomocí Linux může být také tak lehká.
+
+ iPhone:
+ * PÅ™eÄtÄ›te si prosím:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/iPhone
+
+ Maemo:
+ * Nainstalujte Maemo SDK s rootstrap 4.1.2
+ * Nainstalujte libmad, Tremor, FLAC ze zdroje
+ * Spusťte 'ln -s backends/platform/maemo/debian'
+ * Aktualizujte debian/changelog
+ * Spusťte 'sb2 dpkg-buildpackage -b'
+
+------------------------------------------------------------------------
+Hodně Štěstí a Šťastné Adventurování!
+Tým ScummVM.
+http://www.scummvm.org/
+------------------------------------------------------------------------
diff --git a/doc/de/Liesmich b/doc/de/Liesmich
new file mode 100644
index 0000000000..b446250189
--- /dev/null
+++ b/doc/de/Liesmich
@@ -0,0 +1,2307 @@
+ScummVM - Liesmich-Datei
+------------------------------------------------------------------------
+
+Für weitere Informationen, Kompatibilitätslisten, Einzelheiten zu Spenden, die
+neusten veröffentlichten Versionen, Fortschrittsberichte und mehr besuchen Sie
+bitte die ScummVM-Website unter der Adresse: http://www.scummvm.org/
+
+
+Inhaltsverzeichnis:
+-------------------
+1.0) Einführung
+ * 1.1 Ãœber ScummVM
+ * 1.2 Schnellstart
+2.0) Kontakt
+ * 2.1 Fehler berichten
+3.0) Unterstützte Spiele
+ * 3.1 Kopierschutz
+ * 3.2 Hinweise zu Commodore64-Spielen
+ * 3.3 Hinweise zu Maniac Mansion NES
+ * 3.4 Hinweise zu Macintosh-Spielen
+ * 3.5 Hinweise zu Spielen auf mehren CDs
+ * 3.6 Hinweise zu The Curse of Monkey Island
+ * 3.7 Hinweise zu Baphomets Fluch I und II
+ * 3.8 Hinweise zu Beneath a Steel Sky
+ * 3.9 Hinweise zu Flight of the Amazon Queen
+ * 3.10 Hinweise zu Gobliiins
+ * 3.11 Hinweise zu Inherit the Earth: Quest for the Orb (Macintosh)
+ * 3.12 Hinweise zu Simon the Sorcerer 1 und 2
+ * 3.13 Hinweise zu Floyd - Es gibt noch Helden
+ * 3.14 Hinweise zu The Legend of Kyrandia
+ * 3.15 Hinweise zum vorhersagenden Eingabedialog bei Sierras AGI-Spielen
+ * 3.16 Hinweise zu Mickey's Space Adventure
+ * 3.17 Hinweise zu Winnie the Pooh
+ * 3.18 Hinweise zu Troll's Tale
+ * 3.19 Hinweise zu DraÄi Historie
+ * 3.20 Bekannte Probleme
+4.0) Unterstützte Plattformen
+5.0) ScummVM verwenden
+ * 5.1 Kommandozeilenoptionen
+ * 5.2 Sprachoptionen
+ * 5.3 Grafikfilter
+ * 5.4 Globales Menü
+ * 5.5 Tastenkürzel
+6.0) Spielstände
+ * 6.1 Automatische Spielstände
+ * 6.2 Spielstände umwandeln
+ * 6.3 Spielstände von Kommandozeile aus anzeigen/laden
+7.0) Musik und Sound
+ * 7.1 AdLib-Emulation
+ * 7.2 FluidSynth-MIDI-Emulation
+ * 7.3 MT-32-Emulation
+ * 7.4 MIDI-Emulation
+ * 7.5 Native MIDI-Unterstützung
+ * 7.6 UNIX-eigene, ALSA- und IRIX' Sequenzer-Unterstützung
+ * 7.7 TiMidity++-MIDI-Server-Unterstützung
+ * 7.8 Komprimierte Audio-Dateien verwenden (MP3, Ogg Vorbis, FLAC)
+ * 7.9 Ausgabefrequenzen
+8.0) Konfigurationsdatei
+9.0) Kompilierung
+
+
+1.0) Einführung:
+---- -----------
+
+1.1) Ãœber ScummVM:
+---- -------------
+ScummVM ist ein Programm, welches es Ihnen ermöglicht, bestimmte klassische
+Grafik-Adventure (unter anderem aus dem Point-and-Click-Bereich) zu spielen,
+vorausgesetzt, Sie sind im Besitz der Dateien des Spiels. Der Trick dabei ist:
+ScummVM ersetzt lediglich die Funktion der ausführbaren Dateien, die mit den
+Spielen kamen, was ermöglicht, diese Spiele auf Systemen zu spielen, für welche
+sie nie erstellt wurden!
+
+Ursprünglich wurde dieses Programm dafür entwickelt, um SCUMM-Spiele von
+LucasArts auszuführen, wie beispielsweise Maniac Mansion, Monkey Island, Day of
+the Tentacle oder Sam & Max. SCUMM steht als Abkürzung für „Script Creation
+Utility for Maniac Mansion“ (deutsch etwa: Skripterstellungsdienstprogramm für
+Maniac Mansion), was das erste Spiel von LucasArts war, für welches LucasArts
+dieses System entworfen hatte. Und viel später verlieh es seinen Namen an
+ScummVM (wobei „VM“ für „Virtuelle Maschine“ steht).
+
+Mit der Zeit wurde Unterstützung für viele Nicht-SCUMM-Spiele hinzugefügt und
+ScummVM unterstützt nun auch viele AGI- und SCI-Spiele von Sierra (wie
+beispielsweise King's Quest 1-6, Space Quest 1-5, ...), Discworld 1 und 2, Simon
+the Sorcerer 1 und 2, Beneath A Steel Sky, Lure of the Temptress, Baphomets
+Fluch I und II, Flight of the Amazon Queen, Gobliiins 1-3, die Adventure-Reihe
+The Legend of Kyrandia, viele der SCUMM-Spiele für Kinder von Humongous
+Entertainment (einschließlich der Spiele von Fritzi Fisch und Töff-Töff) und
+viele mehr. Sie können eine vollständige Liste mit Einzelheiten einsehen, welche
+Auskunft darüber gibt, welche Spiele unterstützt werden und wie gut. Gehen Sie
+hierfür auf die Kompatibilitätsseite. ScummVM wird fortlaufend verbessert, also
+schauen Sie öfter einmal vorbei.
+
+Unter den Systemen, mit denen Sie diese Spiele spielen können, befinden sich
+normale Schreibtisch-Computer (mit den Betriebssystemen Windows, Linux,
+Mac OS X, ...), Spielekonsolen (Dreamcast, Nintendo DS & Wii, PS2, PSP, ...),
+Smartphones (Android, iPhone, PocketPC, Symbian ...) und einige weitere.
+
+Zurzeit befindet sich ScummVM immer noch stark in der Entwicklung. Seien Sie
+sich bewusst, dass wir zwar versuchen, dass viele Spiele mit wenigen erheblichen
+Fehlern durchgespielt werden können, aber es dennoch zu Abstürzen kommen kann
+und wir keine Gewähr übernehmen. Davon abgesehen: Einige Spiele werden seit
+längerer Zeit unterstützt und sollten in jeder neusten stabilen veröffentlichten
+Version ohne größere Probleme laufen. Sie können sich einen Eindruck davon
+verschaffen, wie gut jedes Spiel unter ScummVM läuft, indem Sie auf die
+Kompatibilitätsseite schauen. Wenn Sie sich ein wenig im Internet umsehen,
+können Sie feststellen, dass ScummVM sogar kommerziell genutzt wird, um einige
+der unterstützen Spiele für moderne Plattformen wiederzuveröffentlichen. Dies
+zeigt, dass mehrere Firmen mit der Qualität der Software zufrieden sind und wie
+gut einige der Spiele mit Hilfe des Programms laufen.
+
+Wenn Ihnen ScummVM gefällt, können Sie uns gerne Geld spenden, indem Sie auf die
+PayPal-Schaltfläche auf der ScummVM-Website klicken. Dies hilft uns dabei,
+notwendige Dienstprogramme zu kaufen, um ScummVM einfacher und schneller zu
+entwickeln. Wenn Sie nicht spenden können, dürfen Sie auch gerne einen Patch
+beisteuern.
+
+1.2) Schnellstart:
+---- -------------
+WICHTIG: In dieser kurzen Anleitung wird davon ausgegangen, dass Sie ScummVM auf
+Deutsch benutzen. Standardmäßig wird ScummVM die Sprache Ihres Betriebssystems
+verwenden. Wenn Sie ScummVM lieber auf Englisch verwenden möchten, benutzen Sie
+bitte die Anleitung in der englischen README-Datei.
+
+Für die ungeduldigen unter den Anwendern ist hier in fünf einfachen Schritten
+kurz beschrieben, wie man ScummVM lauffähig macht und das Programm verwendet.
+
+1. Laden Sie ScummVM unter der Adresse http://www.scummvm.org/downloads.php
+herunter und installieren Sie es.
+
+2. Erstellen Sie ein Verzeichnis auf Ihrer Festplatte und kopieren Sie die
+Dateien des Spiels vom Original-Datenträger in dieses Verzeichnis. Wiederholen
+Sie diesen Vorgang für jedes Spiel, das Sie spielen möchten (es ist besser, für
+jedes Spiel ein eigenes Verzeichnis zu verwenden).
+
+3. Starten Sie ScummVM.
+
+Sollte an diesem Punkt ScummVM auf Englisch statt auf Deutsch erscheinen, gehen
+Sie wie folgt vor, um die Spracheinstellung zu ändern:
+-Klicken Sie auf „Options“.
+-Klicken Sie auf den rechten Pfeil in der Reiterleiste und wählen den Reiter
+ „Misc“ aus.
+-Wählen Sie im Feld „GUI Language“ „Deutsch“ aus und klicken auf „OK“.
+-Bestätigen Sie die erscheinende Nachricht, klicken auf „Quit“, um ScummVM zu
+ beenden, und starten dann das Programm erneut.
+
+Nun klicken Sie auf „Spiel hinzufügen“, wählen das Verzeichnis mit den Dateien
+des Spiels aus (versuchen Sie nicht, die Dateien des Spiels selbst auszuwählen!)
+und klicken Sie auf „Auswählen“.
+
+4. Ein Dialog sollte erscheinen, der Ihnen ermöglicht, verschiedene
+Einstellungen vorzunehmen, sollten Sie dies wünschen (es sollte jedoch in
+Ordnung sein, alles voreingestellt zu belassen). Bestätigen Sie diesen Dialog.
+
+5. Wählen Sie das Spiel aus der Liste aus, welches Sie spielen möchten, und
+klicken Sie auf „Starten“.
+
+ScummVM behält die Spiele in der Liste, die Sie hinzufügen. Wenn Sie also
+ScummVM schließen, werden beim nächsten Start alle Spiele, die Sie zuvor
+hinzugefügt haben, in der Liste angezeigt. Sie können somit direkt zu Schritt 5
+übergehen, außer Sie wollen noch mehr Spiele hinzufügen.
+
+Tipp: Wenn Sie mehrere Spiele auf einmal hinzufügen möchten, drücken Sie die
+Umschalt-Taste (Shift), bevor Sie auf „Spiel hinzufügen“ klicken. Diese
+Schaltfläche wird somit ihren Text zu „Durchsuchen“ umändern und wenn Sie dann
+auf diese klicken, werden Sie auch dazu aufgefordert, ein Verzeichnis
+auszuwählen, nur dieses Mal wird ScummVM alle Unterverzeichnisse automatisch
+nach unterstützen Spielen durchsuchen.
+
+
+2.0) Kontakt:
+---- --------
+Der einfachste Weg, um mit dem ScummVM-Team in Verbindung zu treten, ist,
+Fehlerberichte einzusenden (siehe Abschnitt 2.1) oder durch Verwendung des
+Forums unter der Adresse http://forums.scummvm.org .
+Sie können ebenso der Mailing-Liste scummvm-devel beitreten und an diese E-Mails
+versenden oder mit uns im IRC chatten (#scummvm unter irc.freenode.net). Bitte
+fordern Sie uns nicht dazu auf, ein nicht unterstütztes Spiel zu unterstützen.
+Lesen Sie zuerst die Seite FAQ (Häufig gestellte Fragen) auf unserer Website.
+Bitte beachten Sie, dass die offizielle Sprache des Forums, der Mailing-Liste
+und des Chats Englisch ist und keine andere Sprache dort verwendet werden
+sollte.
+
+
+2.1) Fehler berichten:
+---- -----------------
+Um einen Fehler zu berichten, erstellen Sie bitte ein SourceForge-Konto und
+folgen Sie dem Link „Bug Tracker“ auf der ScummVM-Website. Bitte stellen Sie
+sicher, dass sich der Bug wiedererzeugen lässt und immer noch in der neusten
+Version von Git oder des Daily Builds auftritt. Bitte sehen Sie auch auf der
+Kompatibilitätsliste der ScummVM-Website für dieses Spiel nach, um
+sicherzustellen, dass das Problem nicht bereits bekannt ist:
+
+ http://www.scummvm.org/compatibility_stable.php
+
+Bitte berichten Sie keine Fehler zu Spielen, die nicht als durchspielbar im
+Bereich „Supported Games“ oder der Kompatibilitätsliste aufgelistet sind.
+Wir -wissen-, dass diese Spiele Fehler aufweisen.
+
+Bitte liefern Sie folgende Informationen:
+ - ScummVM-Version (BITTE mit neuster Version von Git oder des Daily Builds
+ testen)
+ - Einzelheiten zum Fehler, einschließlich Anweisungen, um den Fehler
+ hervorzurufen
+ - Sprache des Spiels (Deutsch, Englisch ...)
+ - Version des Spiels (Version mit Sprachausgabe [Talkie],
+ Diskettenversion, ...)
+ - Plattform und gegebenenfalls Compiler (Win32, Linux, FreeBSD, ...)
+ - Fügen Sie - wenn möglich - einen Speicherstand hinzu.
+ - Wenn dieser Fehler erst seit kurzem Auftritt, teilen Sie bitte die letzte
+ Version ohne den Fehler mit und die erste Version mit diesem Fehler.
+ Auf diese Weise können wir diesen schneller beseitigen, indem wir die
+ vorgenommen Veränderungen einsehen.
+
+Zum Schluss möchten wir Sie noch bitten, jeden Punkt einzeln zu berichten. Bitte
+senden Sie nicht mehrere Punkte mit demselben Ticket ein, ansonsten wird es
+schwierig, den Status jedes einzelnen Fehlers zu verfolgen. Denken Sie bitte
+auch daran, dass alle Fehlerberichte in Englisch verfasst sein müssen.
+
+
+3.0) Unterstützte Spiele:
+---- --------------------
+Im Moment gelten folgende Spiele als funktionsfähig gemeldet und sollten bis zum
+Ende spielbar sein:
+
+SCUMM-Spiele von LucasArts:
+ Maniac Mansion [maniac]
+ Zak McKracken and the Alien Mindbenders [zak]
+ Indiana Jones and the Last Crusade [indy3]
+ Loom [loom]
+ The Secret of Monkey Island [monkey]
+ Monkey Island 2: LeChuck's Revenge [monkey2]
+ Indiana Jones and the Fate of Atlantis [atlantis]
+ Day of the Tentacle [tentacle]
+ Sam & Max Hit the Road [samnmax]
+ Vollgas [ft]
+ The Dig [dig]
+ The Curse of Monkey Island [comi]
+
+AGI-Spiele von Sierra:
+ The Black Cauldron [bc]
+ Gold Rush! [goldrush]
+ King's Quest I [kq1]
+ King's Quest II [kq2]
+ King's Quest III [kq3]
+ King's Quest IV [kq4]
+ Leisure Suit Larry in the Land of the
+ Lounge Lizards [lsl1]
+ Mixed-Up Mother Goose [mixedup]
+ Manhunter 1: New York [mh1]
+ Manhunter 2: San Francisco [mh2]
+ Police Quest I: In Pursuit of the Death
+ Angel [pq1]
+ Space Quest I: The Sarien Encounter [sq1]
+ Space Quest II: Vohaul's Revenge [sq2]
+ Erstellte Spiele von Fans [agi-fanmade]
+
+AGOS-Spiele von Adventuresoft/Horrorsoft:
+ Elvira - Mistress of the Dark [elvira1]
+ Elvira II - The Jaws of Cerberus [elvira2]
+ Personal Nightmare [pn]
+ Waxworks [waxworks]
+ Simon the Sorcerer 1 [simon1]
+ Simon the Sorcerer 2 [simon2]
+ Simon the Sorcerer's Game Pack
+ - Dämonen in meinem PC [dimp]
+ Simon the Sorcerer's Game Pack
+ - Jumble [jumble]
+ Simon the Sorcerer's Game Pack
+ - NoPatience [puzzle]
+ Simon the Sorcerer's Game Pack
+ - Swampy Adventures [swampy]
+ Floyd - Es gibt noch Helden [feeble]
+
+GOB-Spiele von Coktel Vision:
+ Bargon Attack [bargon]
+ Gobliiins [gob1]
+ Gobliins 2 [gob2]
+ Goblins 3 [gob3]
+ Lost in Time [lostintime]
+ Woodruff and the Schnibble of Azimuth [woodruff]
+ Ween: The Prophecy [ween]
+
+MADE-Spiele von Activision:
+ Leather Goddesses of Phobos 2 [lgop2]
+ Return to Zork [rtz]
+ Rodney's Funscreen [rodney]
+ The Manhole [manhole]
+
+Andere Spiele:
+ Beneath a Steel Sky [sky]
+ Baphomets Fluch [sword1]
+ Baphomets Fluch II:
+ Die Spiegel der Finsternis [sword2]
+ Cruise for a Corpse [cruise]
+ Discworld [dw]
+ Discworld 2: Vermutlich vermisst [dw2]
+ DraÄi Historie [draci]
+ Drascula: The Vampire Strikes Back [drascula]
+ Flight of the Amazon Queen [queen]
+ Future Wars [fw]
+ Erben der Erde: Die große Suche [ite]
+ Nippon Safes Inc. [nippon]
+ The Legend of Kyrandia [kyra1]
+ The Legend of Kyrandia: The Hand of Fate [kyra2]
+ The Legend of Kyrandia: Malcolm's Revenge [kyra3]
+ Touché: Die Abenteuer des fünften
+ Musketiers [touche]
+
+SCUMM-Spiele von Humongous Entertainment:
+ Backyard Baseball [baseball]
+ Backyard Baseball 2001 [baseball2001]
+ Backyard Football [football]
+ Big Thinkers First Grade [thinker1]
+ Big Thinkers Kindergarten [thinkerk]
+ Blue's 123 Time Activities [Blues123Time]
+ Blue's ABC Time Activities [BluesABCTime]
+ Blue's Art Time Activities [arttime]
+ Blue's Birthday Adventure [BluesBirthday]
+ Blue's Reading Time Activities [readtime]
+ Fatty Bear's Birthday Surprise [fbear]
+ Fatty Bear's Fun Pack [fbpack]
+ Fritzi Fisch und der verschwundene Schatz [freddi]
+ Fritzi Fisch und das Flossengespenst [freddi2]
+ Fritzi Fisch und der Fall der gestohlenen
+ Trompetenschnecke [freddi3]
+ Freddi Fisch und das Geheimnis
+ der Salzwasserschlucht [freddi4]
+ Freddi Fisch und das Rätsel
+ der Korallenbucht [freddicove]
+ Freddi Fish and Luther's Maze Madness [maze]
+ Freddi Fish and Luther's Water Worries [water]
+ Let's Explore the Airport with Buzzy [airport]
+ Let's Explore the Farm with Buzzy [farm]
+ Let's Explore the Jungle with Buzzy [jungle]
+ Pyjama Pit: Keine Angst im Dunkeln [pajama]
+ Pyjama Sam: Donner und Blitz
+ machen mir nix [pajama2]
+ Pyjama Sam 3: Süßigkeiten kriegen Saures [pajama3]
+ Pajama Sam's Lost & Found [lost]
+ Pajama Sam's Sock Works [socks]
+ Putt-Putt Joins the Parade [puttputt]
+ Putt-Putt Goes to the Moon [puttmoon]
+ Töff-Töff rettet den Zoo [puttzoo]
+ Töff-Töff reist durch die Zeit [putttime]
+ Töff-Töff und das große Rennen [puttrace]
+ Töff-Töff geht zum Zirkus [puttcircus]
+ Putt-Putt and Pep's Balloon-O-Rama [balloon]
+ Putt-Putt and Pep's Dog on a Stick [dog]
+ Putt-Putt & Fatty Bear's Activity Pack [activity]
+ Putt-Putt's Fun Pack [funpack]
+ SPY Fox: Das Milchkartell [spyfox]
+ SPY Fox: Operation Robohund [spyfox2]
+ SPY Fox: Alarm im Weltall [spyozon]
+ SPY Fox in Cheese Chase [chase]
+ SPY Fox in Hold the Mustard [mustard]
+
+Spiele von Living Books:
+ Aesop's Fables: The Tortoise and the Hare [tortoise]
+ Arthur's Birthday [arthurbday]
+ Arthur's Teacher Trouble [arthur]
+ Dr. Seuss's ABC [seussabc]
+ Green Eggs and Ham [greeneggs]
+ Harry and the Haunted House [harryhh]
+ Just Grandma and Me [grandma]
+ Little Monster at School [lilmonster]
+ Ruff's Bone [ruff]
+ Sheila Rae, the Brave [sheila]
+ Stellaluna [stellaluna]
+ The Berenstain Bears Get in a Fight [bearfight]
+ The Berenstain Bears in the Dark [beardark]
+ The New Kid on the Block [newkid]
+
+Die folgenden Spiele sollten geladen werden, sind aber noch nicht vollständig
+spielbar. Spielen erfolgt auf eigenes Risiko. Bitte reichen Sie für diese Spiele
+keine Fehlerberichte ein.
+Wenn Sie über den neusten Stand bezüglich der Kompatibilität des Spiels erfahren
+möchten, besuchen Sie unsere Website und schauen Sie in der Kompatibilitätsliste
+nach.
+
+ Backyard Baseball 2003 [baseball2003]
+ Backyard Football 2002 [football2002]
+ Backyard Soccer [soccer]
+ Backyard Soccer MLS [soccermls]
+ Backyard Soccer 2004 [soccer2004]
+ Blue's Treasure Hunt [BluesTreasureHunt]
+ Pajama Sam: Games to Play on Any Day [pjgames]
+
+Die folgenden Spiele basieren auf der SCUMM-Engine, werden aber (noch) nicht von
+ScummVM unterstützt:
+
+ Andere Spiele von Humongous Entertainment
+
+Seien Sie sich bitte bewusst, dass die Engines („Motoren“ der Spiele) Fehler
+enthalten können und manche Funktionen möglicherweise fehlen, was es unmöglich
+macht, das Spiel zu Ende zu spielen. Speichern Sie oft und bitte schicken Sie
+englische Fehlerberichte ein (Anweisungen zum Senden von Fehlerberichten finden
+Sie oben), wenn Sie einen solchen Fehler in einem „unterstützten“ Spiel
+vorfinden.
+
+
+3.1) Kopierschutz:
+---- -------------
+Das ScummVM-Team duldet keine Spielepiraterie. Es gibt jedoch Fälle, in denen
+die Spielefirmen (wie beispielsweise LucasArts) selbst „gecrackte“
+Ausführdateien in ihre Spiele gepackt haben -- in diesen Fällen beinhalten die
+Dateien des Spiels immer noch die Kopierschutzskripte, aber der Interpreter
+umgeht sie (ähnlich wie illegale gecrackte Versionen es tun können, nur dass es
+hier der Spielehersteller getan hat). Es gibt für uns keinerlei Möglichkeit, den
+Unterschied zwischen einer legitimen und einer illegalen Spieldatei zu erkennen,
+also wird ScummVM bei Spielen, von denen wir wissen, dass eine gecrackte Version
+des Orginalinterpreters zu irgendeinem Zeitpunkt verkauft wurde, immer den
+Kopierschutz umgehen müssen.
+
+In einigen Fällen wird ScummVM immer noch den Kopierschutzbildschirm anzeigen.
+Versuchen Sie, irgendeine Antwort einzugeben. Die Chancen stehen gut, dass sie
+akzeptiert wird.
+
+ScummVM wird den Kopierschutz in folgenden Spielen überspringen:
+
+ * Maniac Mansion
+ * Zak McKracken and the Alien Mindbenders
+ * Loom (EGA)
+ * The Secret of Monkey Island (VGA)
+ * Monkey Island 2: LeChuck's Revenge
+ * Beneath a Steel Sky
+ -- umgangen mit freundlicher Genehmigung von Revolution Software.
+ * Erben der Erde: Die große Suche (Diskettenversion)
+ -- umgangen mit freundlicher Genehmigung von Wyrmkeep Entertainment,
+ da er in allen CD-Versionen des Spiels umgangen wurde.
+ * Simon the Sorcerer 1 (Diskettenversion)
+ * Simon the Sorcerer 2 (Diskettenversion)
+ -- umgangen mit freundlicher Genehmigung von Adventure Soft,
+ da er in allen CD-Versionen des Spiels umgangen wurde.
+ * Waxworks
+
+3.2) Hinweise zu Commodore64-Spielen:
+---- --------------------------------
+Sowohl Maniac Mansion als auch Zak McKracken laufen, aber Maniac Mansion ist
+noch nicht spielbar. Benennen Sie einfach die D64-Datenträger um in
+„maniac1.d64“ und „maniac2.d64“ und entsprechend „zak1.d64“ und „zak2.d64“, dann
+sollte ScummVM in der Lage sein, das Spiel automatisch zu erkennen, wenn Sie auf
+das richtige Verzeichnis zeigen.
+
+Alternativ können Sie „extract_mm_c64“ aus dem Tools-Paket verwenden, um die
+Spieldateien zu extrahieren. Dann wird das Spiel jedoch nicht einwandfrei von
+ScummVM automatisch erkannt und Sie müssen sicherstellen, dass Commodore64 als
+Plattform eingestellt ist. Wir empfehlen, auf die viel einfachere Methode
+zurückzugreifen, die im vorherigen Absatz beschrieben ist.
+
+
+3.3) Hinweise zu Maniac Mansion NES:
+---- -------------------------------
+Unterstützte Versionen sind Deutsch (G) [G=German], Englisch GB (E), Französisch
+(F), Italienisch (I), Schwedisch (SW) und Englisch US (U). ScummVM benötigt nur
+den PRG-Bereich und nicht die gesamte ROM-Datei, um das Spiel laufen zu lassen.
+
+Damit das Spiel funktioniert, müssen Sie die ersten 16 Bytes aus der ROM-Datei
+entfernen, die Sie verwenden wollen. Das klappt mit jedem Hexeditor, solange Sie
+mit diesem kopieren und einfügen können. Nachdem Sie die ROM-Datei mit dem
+Hexeditor geöffnet haben, kopieren Sie alles von der zweiten Reihe (17. Byte)
+bis zum Ende. Danach fügen Sie den kopierten Inhalt in eine neue Hexdatei ein.
+Speichern Sie die neue Datei unter dem Namen „Maniac Mansion (XX).prg“, wobei XX
+für die Sprachversion steht, die Sie verwenden wollen (G, E, F, I, SW oder U).
+Die Größe der neuen Datei sollte genau 262144 Bytes betragen.
+
+Wenn Sie das Spiel manuell hinzufügen, stellen Sie sicher, dass die Plattform
+auf NES eingestellt ist.
+
+Die häufigsten Fehler, die verhindern, dass das Spiel läuft:
+
+ * Fehlerhafte Datei
+ * ROM extrahiert mit den Tools der Version 0.7.0
+ * Sie versuchen, in ScummVM die VOLLE ROM-DATEI zu laden und nicht nur den
+ PRG-Bereich.
+
+Es ist auch möglich, die einzelnen LFL-Dateien aus dem PRG-Bereich zu
+extrahieren. Um dies zu tun, verwenden Sie das Dienstprogramm „extract_mm_nes“
+aus dem Tools-Paket.
+
+
+3.4) Hinweise zu Macintosh-Spielen:
+---- ------------------------------
+Alle auf SCUMM basierenden Adventures von Lucasarts, mit Ausnahme von COMI,
+existieren auch als Versionen für den Macintosh. ScummVM kann die meisten
+(alle?) von diesen verwenden, jedoch ist in manchen Fällen zusätzliche Arbeit
+erforderlich. Zuallererst: Wenn Sie keinen Macintosh dafür verwenden, könnte es
+kompliziert werden, auf die CD- oder Diskettendaten zuzugreifen. Der Grund
+hierfür ist, dass der Mac ein spezielles Datenträgerformat nutzt, welches sich
+HFS nennt, und das andere Systeme normalerweise nicht unterstützen. Es gibt
+jedoch zahlreiche kostenlose Tools, die es ermöglichen, einen solchen
+HFS-Datenträger zu lesen. Z. B. „HFVExplorer“ für Windows und „hfsutils“ für
+Linux und andere Betriebssysteme, die Unix ähnlich sind.
+
+Die meisten neueren Spiele für den Macintosh wurden nur mit einer einzigen
+Spieldatei ausgeliefert (beachten Sie, dass in manchen Fällen diese Spieldatei
+unsichtbar gemacht wurde und Sie somit zusätzliche Tools benötigen, um diese zu
+kopieren). ScummVM ist in der Lage, eine solche Spieldatei direkt zu verwenden;
+verweisen Sie ScummVM einfach auf das Verzeichnis, welches diese enthält und es
+sollte klappen (so wie mit jedem anderen unterstützten Spiel).
+
+Wir stellen außerdem ein Tool mit dem Namen „extract_scumm_mac“ im Tools-Paket
+zur Verfügung, um die Daten aus diesen Spieldateien zu extrahieren, aber dies
+ist weder erforderlich, noch wird es empfohlen.
+
+Für weitere Informationen dazu, wie Sie Macintosh-Spieldateien auf Ihre
+Festplatte kopieren können, lesen Sie:
+
+ http://wiki.scummvm.org/index.php/HOWTO-Mac_Games
+
+
+3.5) Hinweise zu Spielen auf mehren CDs:
+---- -----------------------------------
+Allgemein kann ScummVM nicht sehr gut mit Spielen auf mehreren CDs umgehen. Das
+liegt daran, dass ScummVM annimmt, alles von einem Spiel in einem Verzeichnis
+vorzufinden. Selbst wenn ScummVM einige Fälle berücksichtigt und den Anwender
+dazu auffordert, die CD zu wechseln, so installierten die ursprünglichen
+ausführbaren Dateien des Spiels normalerweise eine kleine Anzahl an Dateien auf
+die Festplatte. Sofern diese Dateien nicht auf allen CDs vorgefunden werden
+können, wird ScummVM Schwierigkeiten haben.
+
+Glücklicherweise hat ScummVM keine Probleme damit, die Spiele komplett von der
+Festplatte aus laufen zu lassen, wenn Sie ein Verzeichnis mit der richtigen
+Kombination der Dateien erstellen. Wenn eine Datei auf mehr als einer CD
+vorkommt, ist es normalerweise egal, welche sie in das Verzeichnis
+hineinkopieren.
+
+
+3.6) Hinweise zu The Curse of Monkey Island:
+---- ---------------------------------------
+Für dieses Spiel benötigen Sie die Dateien comi.la0, comi.la1 und comi.la2. Die
+Datei comi.la0 kann auf beiden CDs vorgefunden werden, ist aber auf beiden
+identisch, womit es egal ist, welche der beiden Sie verwenden.
+
+Zusätzlich müssen Sie ein Unterverzeichnis namens „resource“ erstellen, das alle
+Dateien des Unterverzeichnisses „resource“ auf -beiden- CDs beinhaltet. Einige
+dieser Dateien lassen sich auf beiden CDs vorfinden, jedoch sind sie auch in
+diesem Fall identisch.
+
+
+3.7) Hinweise zu Baphomets Fluch I und II:
+---- -------------------------------------
+Die Anweisungen für die Spiele Baphomets Fluch I und II sind für die
+ausverkauften Software-Versionen, bei welchen sich jedes Spiel auf je zwei CDs
+befindet, da diese am leichtesten erhältlich waren, als ScummVM Unterstützung
+für diese Spiele erlangte. Wir hoffen, dass sie allgemein ausreichend
+ausführlich sind, um für andere Ausgaben genauso hilfreich zu sein.
+
+
+3.7.1) Zwischensequenzen von Baphomets Fluch I und II:
+------ -----------------------------------------------
+Die Zwischensequenzen für Baphomets Fluch I und II haben eine kleine Geschichte
+(schauen Sie im nächsten Abschnitt, wenn Sie interessiert sind), aber im Großen
+und Ganzen müssen Sie nur die .SMK-Dateien aus den „SMACKS“- oder „SMACKSHI“-
+Verzeichnissen auf den CDs in dasselbe Verzeichnis wie die anderen Spieldateien
+kopieren. (Baphomets Fluch hat ein „SMACKSLO“-Verzeichnis mit denselben
+Zwischensequenzen, aber diese sind von niedrigerer Qualität.) Sie können sie
+auch in einem Unterverzeichnis namens „video“ ablegen, wenn Ihnen das lieber
+ist.
+
+Einige Neuausgaben der Spiele, wie beispielsweise die PlayStation-Version, haben
+keine Smacker-Videos. Revolution Software hat uns freundlicherweise erlaubt, die
+Zwischensequenzen umgewandelt auf unserer Website als Download zur Verfügung zu
+stellen. Siehe hierfür:
+
+ http://www.scummvm.org/downloads.php
+
+Diese Zwischensequenzen werden im DXA-Format mit FLAC-Audio zur Verfügung
+gestellt. Ihre Qualität ist durch die Verwendung verlustfreier Kompression
+gleich wie im Originalspiel. Um diese Zwischensequenzen abspielen zu können, ist
+eine Version von ScummVM erforderlich, die sowohl mit Unterstützung von FLAC als
+auch zlib kompiliert wurde.
+
+Für Systeme, die zu langsam sind, um die Entschlüsselung von FLAC-Audio zu
+handhaben, wird die Tonspur für diese Zwischensequenzen gesondert auch mit
+Ogg-Vorbis-Audio angeboten. Um diese Zwischensequenzen mit Ogg-Vorbis-Audio
+abspielen zu können, ist eine Version von ScummVM erforderlich, die sowohl mit
+Unterstützung von libVorbis als auch zlib kompiliert wurde.
+
+Für Baphomets Fluch bieten wir auch ein Untertitel-Paket an. Entpacken Sie es
+einfach und folgen Sie den Anweisungen in der liesmich.txt. (Baphomets Fluch II
+hat bereits Untertitel; für diese ist keine zusätzliche Arbeit notwendig.)
+
+
+3.7.2) Zwischensequenzen von Baphomets Fluch I und II im Rückblick:
+------ ------------------------------------------------------------
+Die Originalausgaben von Baphomets Fluch I und II verwendeten das
+Smacker™-Format der RAD Game Tools. Da RAD uns nicht die ältere Ur-Version
+dieses Formats offenlegen wollte und uns aufforderte, es nicht mittels Reverse
+Engineering zu rekonstruieren, musste eine alternative Lösung gefunden werden.
+
+In Baphomets Fluch II war es möglich, die Sprachausgabe ohne das Video
+wiederzugeben. Dies blieb bis ScummVM 1.0.0 eine Ausweichmöglichkeit, war aber
+nie die alleinige Lösung für eine stabile Veröffentlichung.
+
+In ScummVM 0.6.0 verwendeten wir MPEG, das einen zumutbaren Kompromiss zwischen
+Größe und Qualität bot. In ScummVM 0.10.0 wurde dies durch DXA abgelöst (das
+ursprünglich für Adventure Softs „Floyd - Es gibt noch Helden“ hinzugefügt
+wurde). Dies gab uns die Möglichkeit, die Zwischensequenzen mit genau derselben
+Qualität wie im Original anzubieten, zu dem Preis, dass die Dateien größer
+waren.
+
+Schließlich wurde Anfang 2006 das Smacker-Format für das FFmpeg-Projekt mittels
+Reverse Engineering rekonstruiert. Dank der harten Arbeit in diesem Projekt
+unterstützt ScummVM nun die originalen Zwischensequenzen. Zur selben Zeit wurde
+die MPEG-Unterstützung eingestellt. Vom technischen Standpunkt war das eine gute
+Sache, da das Entschlüsseln von MPEG-Filmen mit vielen Schwierigkeiten verbunden
+war und diese ohnehin nicht so gut aussahen wie Smacker- und DXA-Versionen.
+
+
+3.7.3) Baphomets Fluch:
+------ ----------------
+Für dieses Spiel benötigen Sie die Dateien aus dem Verzeichnis clusters von
+beiden CDs. Für die Windows- und Macintosh-Versionen benötigen Sie auch die
+Datei speech.clu aus dem Verzeichnis speech von beiden CDs. Da diese jedoch
+nicht identisch sind, müssen Sie diese in speech1.clu und speech2.clu für CD 1
+und 2 entsprechend umbenennen. Die PlayStation-Version erfordert die Dateien
+speech.tab, speech.dat, speech.lis, und speech.inf.
+
+Zusätzlich benötigen die Windows- und Macintosh-Versionen das Unterverzeichnis
+„music“ mit allen Dateien der „music“-Unterverzeichnisse auf beiden CDs. Einige
+dieser Dateien tauchen auf beiden CDs auf, aber in diesen Fällen sind sie
+entweder identisch oder in einem Fall nahezu so identisch, dass es wenig
+Unterschied macht. Die PlayStation-Version erfordert die Dateien tunes.dat und
+tunes.tab.
+
+
+3.7.4) Baphomets Fluch II:
+------ -------------------
+Für dieses Spiel benötigen Sie die Dateien aus dem Verzeichnis clusters von
+beiden CDs. (Ein paar von ihnen sind streng genommen eigentlich nicht notwendig,
+aber diejenigen, über die Unsicherheit besteht, sind alle ziemlich klein.)
+Sie müssen die Dateien speech.clu und music.clu umbenennen, und zwar in
+speech1.clu, speech2.clu, music1.clu und music2.clu, sodass ScummVM weiß, welche
+dieser Dateien von CD 1 und welche von CD 2 sind. Alle anderen Dateien, die in
+beiden „clusters“-Verzeichnissen auftauchen, sind identisch. Verwenden Sie in
+diesen Fällen die Datei, die Sie möchten.
+
+Zusätzlich brauchen Sie die Datei cd.inf und optional die Datei startup.inf aus
+dem Verzeichnis sword2 von CD 1.
+
+
+3.8) Hinweise zu Beneath a Steel Sky:
+---- --------------------------------
+Beginnend mit ScummVM 0.8.0 benötigen Sie die zusätzliche Datei „SKY.CPT“, um
+Beneath a Steel Sky laufen lassen.
+
+Diese Datei ist auf der Seite „Downloads“ der ScummVM-Website verfügbar. Sie
+können sie entweder im Verzeichnis mit den anderen Spieldateien (SKY.DNR,
+SKY.DSK) ablegen, in einem Extrapfad oder im Verzeichnis, in dem sich Ihre
+ausführbare ScummVM-Datei befindet.
+
+
+3.9) Hinweise zu Flight of the Amazon Queen:
+---- ---------------------------------------
+Um eine Nicht-Freeware-Version von Flight of the Amazon Queen zu verwenden (von
+einer Original-CD), müssen Sie die Datei „queen.tbl“ (erhältlich von der Seite
+„Downloads“ auf unserer Website) entweder im Verzeichnis mit der Spieldatei
+„queen.1“ ablegen, in einem Extrapfad oder im Verzeichnis, in dem sich Ihre
+ausführbare ScummVM-Datei befindet.
+
+Alternativ können Sie das Tool „compress_queen“ aus dem Tools-Paket verwenden,
+um Ihre FOTAQ-Spieldatei neu „zusammenzubauen“, um die Tabellendatei für diese
+spezielle Version miteinzubeziehen und somit die Laufzeit-Abhängigkeit von der
+Datei „queen.tbl“ zu lösen. Dieses Tool kann auch die Sprachausgabe und
+Sound-Effekte mittels MP3, Ogg Vorbis oder FLAC komprimieren.
+
+
+3.10) Hinweise zu Gobliiins:
+----- ----------------------
+Die CD-Versionen der Gobliiins-Serie enthalten einen großen Audio-Titel, den Sie
+extrahieren müssen (siehe Abschnitt über die Verwendung komprimierter
+Audio-Dateien) sowie ins Spielverzeichnis kopieren, wenn Sie Musik im Spiel
+hören möchten, ohne die CD die ganze Zeit im Laufwerk haben zu müssen. Die
+Sprachausgabe ist auch in diesem Titel und ihre Lautstärke wird deshalb ebenso
+über die Musiklautstärke-Regelung geändert.
+
+
+3.11) Hinweise zu Inherit the Earth: Quest for the Orb (Macintosh):
+----- -------------------------------------------------------------
+Um die Neuausgabe des Spiels für Mac OS X von Wyrmkeep laufen zu lassen, müssen
+Sie die Daten von der CD auf die Festplatte kopieren. Wenn Sie an einem PC
+arbeiten, lesen Sie hierfür:
+
+ http://wiki.scummvm.org/index.php/HOWTO-Mac_Games
+
+Obwohl hier in erster Linie über SCUMM-Spiele gesprochen wird, findet das
+Dienstprogramm „HFVExplorer“ Erwähnung, welches Sie benötigen, um die Dateien zu
+extrahieren. Beachten Sie, dass Sie die Sprachausgabedaten aus „Inherit the
+Earth Voices“ im selben Verzeichnis ablegen müssen wie die Spieldaten, die sich
+an folgendem Ort befinden:
+
+ Inherit the Earth.app/Contents/Resources
+
+Bei der alten Ausgabe für Mac OS 9 müssen Sie die Dateien im MacBinary-Format
+kopieren, da sie sowohl Ressourcen- als auch Datenverzweigungen beinhalten
+sollten. Kopieren Sie alle „ITE *“-Dateien.
+
+
+3.12) Hinweise zu Simon the Sorcerer 1 und 2:
+----- ---------------------------------------
+Wenn Sie die Doppel-Version von Simon the Sorcerer 1 oder 2 auf CD haben, finden
+Sie die Windows-Version im Hauptverzeichnis der CD und die DOS-Version im
+DOS-Verzeichnis der CD.
+
+
+3.13) Hinweise zu Floyd - Es gibt noch Helden:
+----- ----------------------------------------
+Wenn Sie die Windows-Version von Floyd - Es gibt noch Helden haben, sind einige
+Dinge zu beachten.
+
+Viele notwendige Dateien für das Spiel sind in einer InstallShield-Datei namens
+data1.cab gespeichert, die ScummVM nicht entpacken kann. Sie müssen das
+Original-Installationsprogramm oder i5comp verwenden, um die Inhalte dieser
+Datei zu entpacken. Das Tool i5comp für die Dekompression kann durch Suchen im
+Internet gefunden werden.
+
+Um die Sprachdateien in ScummVM zu verwenden, müssen sie nach dem Kopiervorgang
+wie folgt umbenannt werden:
+voices.wav von CD1 in voices1.wav
+voices.wav von CD2 in voices2.wav
+voices.wav von CD3 in voices3.wav
+voices.wav von CD4 in voices4.wav
+
+
+3.14) Hinweise zu The Legend of Kyrandia:
+----- -----------------------------------
+Um The Legend of Kyrandia unter ScummVM laufen zu lassen, benötigen Sie die
+Datei „kyra.dat“, welche auf der Seite „Downloads“ der ScummVM-Website gefunden
+werden kann.
+
+
+3.15) Hinweise zum vorhersagenden Eingabedialog bei Sierras AGI-Spielen:
+----- ------------------------------------------------------------------
+Der vorhersagende Eingabedialog ist ein ScummVM-Hilfsmittel, um die englischen
+Spiele der AGI-Engine (die offensichtlich Kommandozeilen-Eingabe erfordern) auf
+Geräten laufen zu lassen, die eingeschränkte Tastatur-Unterstützung haben. Da es
+mühsam ist, mit emulierten Tastaturen zu tippen, können in solchen Fällen
+Befehle schnell und einfach über den vorhersagenden Eingabedialog eingegeben
+werden.
+
+Um die vorhersagende Eingabe in AGI-Spielen zu aktivieren, müssen Sie die Datei
+pred.dic in den Extrapfad von ScummVM oder in das Verzeichnis des Spiels
+kopieren, das Sie spielen möchten. Dieses Wörterbuch wurde erstellt, indem alle
+bekannten AGI-Spiele analysiert wurden, und enthält den maximalen Satz
+gebräuchlicher Wörter.
+
+Wenn das Wörterbuch erkannt wurde, wird der vorhersagende Eingabedialog entweder
+durch Klicken auf den Kommandozeilenbereich angezeigt (dort, wo auch immer eine
+Tastatureingabe erforderlich ist, auch in Dialogfeldern) oder in einigen Ports
+durch Drücken eines bestimmten Tastenkürzels.
+
+Der vorhersagende Eingabedialog funktioniert in drei Modi, zwischen denen mit
+der Schaltfläche (*)Pre/123/Abc gewechselt werden kann. Die primäre
+Eingabemethode ist der vorhersagende Modus (Pre), welcher der Worterkennung bei
+„schnellem Tippen“ auf Mobilfunktelefonen ähnelt. Das Alphabet ist in neun
+Gruppen unterteilt, die naturgemäß den neun Ziffern auf dem Ziffernblock
+zugeteilt sind (0 ist die Leertaste). Um ein Wort einzugeben, drücken Sie einmal
+die Ziffer der Gruppe, die den Buchstaben des Worts enthält, den Sie tippen
+möchten, dann gehen Sie zum nächsten Buchstaben über. Um z. B. den Befehl „look“
+einzugeben, sollten Sie 5665 drücken. Während Sie schrittweise die Ziffernfolge
+des beabsichtigten Wortes eingeben, wird auf das Wörterbuch zugegriffen, um
+bekannte Wörter, die mit Ihrer Eingabe bis zu diesem Punkt übereinstimmen, zu
+finden. Während Sie mehr und mehr Tasten drücken, läuft die Vorhersage auf das
+richtige Wort zu. Das ist der Grund, warum das angezeigte Wort sich zwischen
+einem Tastendruck drastisch verändern kann. Es gibt jedoch Fälle, in denen mehr
+als ein Wort dieselbe Zahlenkombination teilen. Z. B. haben die Worte „quit“ und
+„suit“ dieselbe Nummer, nämlich 7848. In diesen Fällen hilft die Schaltfläche
+(#)next weiter. Durch ihre Betätigung können Sie durch die Liste der Wörter
+schalten, welche denselben Zahlencode haben und schließlich das richtige Wort
+akzeptieren, indem Sie die (0) für Leertaste oder OK drücken.
+
+Die zweite Eingabemethode (123) ist die numerische Eingabe: Jede Taste, die Sie
+drücken, wird als tatsächliche Ziffer eingegeben.
+
+Die dritte Eingabemethode (Abc) ist die Multi-Tipp-Alpha-Eingabemthode. Dieser
+Modus ist dazu gedacht, um freien Text einzugeben, ohne die Hilfe des
+Wörterbuchschemas des vorhersagenden Modus (Pre). Der Text wird Buchstabe für
+Buchstabe eingegeben. Für jeden Buchstaben drücken Sie zuerst die Ziffer der
+Gruppe, die den Buchstaben beinhaltet, den Sie tippen wollen, dann verwenden Sie
+die Schaltfläche (#)next, um durch die Buchstaben zu schalten, bis der richtige
+erscheint, und wiederholen dies mit der nächsten Ziffer. Um z. B. das Wort
+„look“ einzugeben, müssen Sie Folgendes drücken: 5##6##6##5#
+
+Der Dialog kann vollständig mit der Maus verwendet werden, aber ein paar
+Maßnahmen wurden getroffen, um dessen Verwendung bei einigen ScummVM-Ports
+komfortabler zu gestalten, indem naturgemäß dessen Funktionsweise dem
+Ziffernblock zugewiesen wurde. Ebenso können die Schaltflächen mittels der
+Pfeiltasten und der Eingabetaste gesteuert werden.
+
+
+3.16) Hinweise zu Mickey's Space Adventure:
+----- -------------------------------------
+Um Mickey's Space Adventure unter ScummVM laufen zu lassen, benötigen Sie die
+originale EXE-Datei des Spiels (mickey.exe) sowie die Spieldateien.
+
+Für das Spiel gibt es unter ScummVM umfangreiche Mausunterstützung, obwohl es im
+Originalspiel überhaupt keine Mausunterstützung gab. Menüpunkte können mit der
+Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orten zu
+wechseln. Wenn die Maus über die Kanten des Bildschirms bewegt wird, ändert sich
+die Farbe des Zeigers in Rot, wenn es möglich ist, in diese Richtung zu gehen.
+Der Spieler kann dann einfach auf die Kanten des Spielbildschirms klicken, um
+den Ort zu wechseln, ähnlich wie in vielen Adventures, was einfacher und viel
+unkomplizierter ist, als sich mit dem Menü umherzubewegen.
+
+
+3.17) Hinweise zu Winnie the Pooh:
+----- ----------------------------
+Es ist möglich, Spielstände vom Original-Interpreter des Spiels in ScummVM zu
+importieren.
+
+Für das Spiel gibt es unter ScummVM umfangreiche Mausunterstützung, obwohl es im
+Originalspiel überhaupt keine Mausunterstützung gab. Menüpunkte können mit der
+Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orten zu
+wechseln. Wenn die Maus über die Kanten des Bildschirms bewegt wird, ändert sich
+die Farbe des Zeigers in Rot, wenn es möglich ist, in diese Richtung zu gehen.
+Der Spieler kann dann einfach auf die Kanten des Spielbildschirms klicken, um
+den Ort zu wechseln, ähnlich wie in vielen Adventures, was einfacher und viel
+unkomplizierter ist, als sich mit dem Menü umherzubewegen.
+
+
+3.18) Hinweise zu Troll's Tale:
+----- -------------------------
+Das Originalspiel wurde auf einer PC-Boot-Diskette ausgeliefert, weshalb es
+notwendig ist, die Inhalte dieser Diskette in einer Abbild-Datei auszugeben und
+diese „troll.img“ zu nennen, um das Spiel unter ScummVM spielen zu können.
+
+
+3.19) Hinweise zu DraÄi Historie:
+----- ---------------------------
+Es gibt vier Sprachvarianten des Spiels: Tschechisch, Deutsch, Englisch und
+Polnisch. Jede von ihnen wird in einem gesonderten Archiv bereitgestellt. Die
+einzige offizielle Version ist die tschechische, während die deutsche, englische
+und polnische immer in Bearbeitung waren und nie offiziell veröffentlicht
+wurden. Obwohl alle Texte vollständig übersetzt sind, ist bekannt, dass einige
+von ihnen Fehler enthalten.
+
+Es existiert optionale tschechische Sprachausgabe für das Spiel. Aus Gründen der
+Bandbreite können Sie diese in einem gesonderten Archiv herunterladen und dann
+im Verzeichnis des Spiels entpacken. Sie können mit allen Sprachvarianten die
+tschechische Sprachausgabe hören, während Sie Untertitel lesen.
+
+Alle Spieldateien und die Komplettlösung können von der folgenden Website
+heruntergeladen werden: http://www.ucw.cz/draci-historie/index-en.html
+
+
+3.20) Bekannte Probleme:
+----- ------------------
+Diese veröffentlichte Version hat die unten folgenden bekannten Probleme. Es ist
+nicht notwendig, diese zu berichten, jedoch sind Patches, um diese zu beheben,
+willkommen. Wenn Sie einen Fehler entdecken, der weder hier noch auf der
+Kompatibilitätsseite der Website aufgeführt ist, sehen Sie bitte im Abschnitt
+„Fehler berichten“ nach, wenn Sie ihn melden möchten.
+
+ Spiele mit Ton von CD:
+ - Bei Spielen, die auf Audio von CD zurückgreifen (FM-TOWNS-Spiele,
+ Loom-CD-Version usw.), ist es möglich, dass Anwender von Microsoft Windows
+ 2000/XP zufällige Abstürze erleben. Das liegt an einem lange bestehenden
+ Windows-Fehler, der dazu führt, dass fehlerhafte Spieldaten von der CD
+ ausgelesen werden. Bitte kopieren Sie die Spieldaten in ein Verzeichnis
+ Ihrer Festplatte, um dies zu vermeiden.
+
+ FM-TOWNS-Versionen:
+ - Die Kanji-Versionen erfordern die Schriftart-ROM-Datei von FM-TOWNS.
+ - ScummVM stürzt bei Kanji-Versionen der folgenden Spielen zufällig ab, wenn
+ die Schriftart-ROM-Datei von FM-TOWNS verwendet wird:
+ The Secret of Monkey Island, Monkey Island 2: LeChuck's Revenge
+ und Indiana Jones and the Fate of Atlantis
+
+ Loom:
+ - Das Abschalten der Untertitel über die Spieleinstellungen funktioniert
+ nicht zuverlässig, da die Loom-Skripte diese wieder einschalten.
+ - MIDI-Unterstützung in der EGA-Version erfordert das Roland-Update von
+ LucasArts.
+ - Die Kanji-Version der PC-Engine erfordert die Systemkarten-ROM-Datei.
+
+ The Secret of Monkey Island:
+ - MIDI-Unterstützung in der EGA-Version erfordert das Roland-Update von
+ LucasArts.
+
+ Beneath a Steel Sky:
+ - Amiga-Versionen werden nicht unterstützt.
+ - Disketten-Demos werden nicht unterstützt.
+ - Kein Fehler: In der CD-Version fehlt in einigen Dialogen Sprachausgabe;
+ das ist normal.
+
+ Elvira - Mistress of the Dark
+ - Keine Musik in der Atari-ST-Version
+
+ Elvira II - The Jaws of Cerberus
+ - Keine Musik in der Atari-ST-Version
+ - Keine Sound-Effekte in der PC-Version
+ - Palettenprobleme in der Atari-ST-Version
+
+ Inherit the Earth: Quest for the Orb
+ - Amiga-Versionen werden nicht unterstützt.
+
+ Simon the Sorcerer 1:
+ - Untertitel sind in den deutschen und englischen CD-Versionen nicht
+ verfügbar, da bei diesen der überwiegende Teil der Untertiteltexte fehlt.
+
+ Simon the Sorcerer 2:
+ - Sprache und Untertitel zusammen führen manchmal dazu, dass die
+ Sprachausgabe vorzeitig abgeschnitten wird. Dies ist eine Beschränkung des
+ Originalspiels.
+ - Nur die Standardsprache (Englisch) der Spieldaten wird bei den Amiga- und
+ Macintosh-Versionen unterstützt.
+
+ Simon the Sorcerer's Game Pack:
+ - Keine Unterstützung für das Anzeigen, Anlegen, Laden oder Speichern von
+ Highscores.
+ - Keine Unterstützung in Swampy Adventures für das Anzeigen von Namen von
+ Gegenständen, wenn man über diese mit der Maus fährt
+
+ Floyd - Es gibt noch Helden:
+ - Untertitel sind oft unvollständig und nur in Englisch, da sie im
+ Originalspiel immer ausgeschaltet waren.
+
+ The Legend of Kyrandia:
+ - Keine Musik oder Sound-Effekte in der Macintosh-Diskettenversion
+ - Die Macintosh-CD-Version verwendet eingebundene DOS-Musik und
+ DOS-Sound-Effekte.
+ - PC-9821-Versionen fehlt Unterstützung für Sound-Effekte.
+
+ Spiele von Humongous Entertainment:
+ - Nur die Originaloberfläche kann zum Laden und Speichern verwendet werden.
+ - Keine Unterstützung für den Mehrspielermodus und das Ausdrucken von
+ Bildern
+
+
+4.0) Unterstützte Plattformen:
+---- -------------------------
+ScummVM wurde portiert, um auf vielen Plattformen und Betriebssystemen lauffähig
+zu sein. Links zu diesen Ports können entweder auf der ScummVM-Website oder
+durch Suchen mit einer Suchmaschine gefunden werden. Vielen Dank an unsere
+Porter für ihre Bemühungen. Wenn Sie eine Portierung für ScummVM haben und diese
+zum Entwicklungsbereich (master Git) beisteuern möchten, können Sie uns gerne
+kontaktieren!
+
+Die unterstützten Plattformen beinhalten (aber beschränken sich nicht auf):
+
+ UNIX (Linux, Solaris, IRIX, *BSD, ...)
+ Windows
+ Windows CE und Windows Mobile (einschließlich Smartphones und PocketPCs)
+ Mac OS X
+ AmigaOS
+ Android
+ BeOS
+ Dreamcast
+ GP2x
+ iPhone (einschließlich iPod Touch und iPad)
+ Maemo (Nokia-Internet-Tablet N810)
+ Nintendo 64
+ Nintendo DS
+ Nintendo GameCube
+ Nintendo Wii
+ OS/2
+ PlayStation 2
+ PlayStation Portable
+ Symbian
+ WebOS
+
+Die Portierung von Dreamcast unterstützt weder The Curse of Monkey Island noch
+The Dig. Der Portierung von Nintendo DS fehlt Unterstützung für Vollgas, The Dig
+und The Curse of Monkey Island.
+Für weitere plattformabhängige Beschränkungen verweisen wir auf unser Wiki:
+ http://wiki.scummvm.org/index.php/Platforms
+
+In der Portierung von Macintosh wird die rechte Maustaste über den Cmd-Klick
+emuliert (d. h. Sie klicken die Maustaste, während Sie die
+Command-/Apple-/Propeller-Taste gedrückt halten).
+
+Es gibt inoffizielle Portierungen für eine Vielzahl von Plattformen,
+einschließlich PlayStation 3, Xbox und Xbox 360. Bitte beachten Sie, dass diese
+nicht von uns hergestellt werden, weshalb wir diese weder befürworten noch
+unterstützen können. Benutzung erfolgt auf eigene Gefahr!
+
+
+5.0) ScummVM verwenden:
+---- ------------------
+Bitte beachten Sie, dass ScummVM standardmäßig Spielstände in dem Verzeichnis
+speichert, in welchem es ausgeführt wird, also sollten Sie davon absehen, es von
+mehr als einem Ort aus zu verwenden. Weitere Informationen, einschließlich
+darüber, wie man einen Pfad für Spielstände bestimmt, um diesen Sachverhalt zu
+vermeiden, befinden sich im Abschnitt 6.0.
+
+ScummVM kann direkt durch Aufruf der ausführbaren Datei gestartet werden. In
+diesem Fall wird das eingebaute Startmenü aktiviert. Hier können Sie Spiele
+hinzufügen, (klicken Sie auf „Spiel hinzufügen“) oder Spiele starten, die
+bereits konfiguriert wurden. Es können auch mehrere Spiele auf einmal
+hinzugefügt werden. Indem Sie die Umschalttaste (Shift) gedrückt halten und auf
+„Spiel hinzufügen“ klicken (beachten Sie, dass sich die Beschreibung in
+„Durchsuchen“ ändert), können Sie ein Verzeichnis bestimmen, wodurch ScummVM
+versuchen wird, in allen Unterverzeichnissen dieses Verzeichnisses Spiele zu
+erkennen.
+
+ScummVM kann mittels Argumenten in der Kommandozeile auch direkt in ein Spiel
+gestartet werden -- siehe nächster Abschnitt.
+
+
+5.1) Kommandozeilenoptionen:
+---- -----------------------
+
+ Verwendung: scummvm [OPTIONEN]... [SPIEL]
+
+ [SPIEL] Kurzer Name des zu ladenden Spiels. Z. B. „monkey“
+ für Monkey Island. Dies kann entweder eine
+ vorbestimmte Kennung eines Spiels sein oder ein
+ benutzerkonfiguriertes Ziel.
+
+ -v, --version Zeigt ScummVM-Versionsinformation und beendet.
+ -h, --help Zeigt kurzen Hilfetext und beendet.
+ -z, --list-games Zeigt Liste unterstützter Spiele und beendet.
+ -t, --list-targets Zeigt Liste konfigurierter Ziele und beendet.
+ --list-saves=ZIEL Zeigt Liste von Spielständen für das festgelegte
+ Spiel (ZIEL)
+ --console Aktiviert das Konsolenfenster
+ (standardmäßig aktiviert) (nur Windows)
+
+ -c, --config=KONFIGURATIONSDATEI
+ Verwendet alternative Konfigurationsdatei.
+ -p, --path=PFAD Pfad zum installierten Spiel
+ -x, --save-slot[=ZAHL] Zu ladender Speicherplatz
+ (Standard: automatischer Spielstand)
+ -f, --fullscreen Erzwingt Vollbildmodus.
+ -F, --no-fullscreen Erzwingt Fenstermodus.
+ -g, --gfx-mode=MODUS Wählt Grafikwandler (siehe auch Abschnitt 5.3).
+ --gui-theme=THEMA Wählt Oberflächenthema (default, modern, classic).
+ --themepath=PFAD Pfad zu gespeicherten Oberflächenthemen
+ --list-themes Zeigt Liste aller verwendbaren Oberflächenthemen.
+ -e, --music-driver=MODUS
+ Wählt Musiktreiber (siehe auch Abschnitt 7.0).
+ -q, --language=SPRACHE Wählt Spielsprache (siehe auch Abschnitt 5.2).
+ -m, --music-volume=ZAHL Wählt Musiklautstärke, 0-255 (Standard: 192).
+ -s, --sfx-volume=ZAHL Wählt Effektlautstärke, 0-255 (Standard: 192).
+ -r, --speech-volume=ZAHL
+ Wählt Sprachlautstärke, 0-255 (Standard: 192).
+ --midi-gain=ZAHL Wählt MIDI-Lautstärke, 0-1000 (Standard: 100)
+ (wird nur von einigen MIDI-Treibern unterstützt).
+ -n, --subtitles Aktiviert Untertitel (in Spielen mit Sprachausgabe).
+ -b, --boot-param=ZAHL Ruft Boot-Skript (Boot-Parameter) mit dieser Nummer
+ auf.
+ -d, --debuglevel=ZAHL Legt Debug-Ausführlichkeit fest.
+ --debugflags=FLAGGEN Aktiviert für Engine spezifische Debug-Flaggen
+ (getrennt durch Kommas).
+ -u, --dump-scripts Aktiviert die Skriptausgabe, wenn ein Verzeichnis
+ namens 'dumps' im aktuellen Verzeichnis existiert.
+
+ --cdrom=ZAHL CD-Laufwerk, von dem CD-Titel wiedergegeben werden
+ sollen (Standard: 0 = erstes Laufwerk)
+ --joystick[=ZAHL] Aktiviert Joystick (Standard: 0 = erster Joystick).
+ --platform=WORT Bestimmt Spielplattform (erlaubte Werte: 2gs, 3do,
+ acorn, amiga, atari, c64, fmtowns, mac, nes, pc,
+ pce, segacd, windows).
+ --savepath=PFAD Pfad zu gespeicherten Spielständen
+ --extrapath=PFAD Extrapfad zu zusätzlichen Spieldaten
+ --soundfont=DATEI Wählt SoundFont für MIDI-Wiedergabe (wird nur
+ von einigen MIDI-Treibern unterstützt).
+ --multi-midi Aktiviert Kombinierung von AdLib und MIDI.
+ --native-mt32 Echte Roland-MT-32-Emulation
+ (GM-Emulation deaktiviert)
+ --enable-gs Aktiviert Roland-GS-Modus für MIDI-Wiedergabe.
+ --output-rate=FREQUENZ Wählt Ausgabefrequenz in Hz (z. B. 22050).
+ --opl-driver=TREIBER Wählt AdLib-(OPL-)Emulator (db, mame).
+ --aspect-ratio Aktiviert Seitenverhältniskorrektur.
+ --render-mode=MODUS Aktiviert zusätzlichen Render-Modus (cga, ega,
+ hercGreen, hercAmber, amiga).
+
+ --alt-intro Verwendet alternativen Vorspann in CD-Versionen von
+ Beneath a Steel Sky und Flight of the Amazon Queen.
+ --copy-protection Aktiviert Kopierschutz in Spielen, für welche ihn
+ ScummVM standardmäßig deaktiviert.
+ --talkspeed=ZAHL Wählt Textverzögerung bei SCUMM-Spielen oder
+ Texttempo bei anderen Spielen (Standard: 60).
+ --demo-mode Startet Maniac Mansion im Demo-Modus
+ (klassische Version).
+ --tempo=ZAHL Wählt Musiktempo (in Prozent, 50-200) für
+ SCUMM-Spiele (Standard: 100).
+
+
+Die Bedeutung der meisten langen Optionen (d. h. diejenigen Optionen, die mit
+einem Doppelstrich beginnen) kann durch Anhängen der Vorsilbe „no-“ umgekehrt
+werden. Z. B. wird --no-aspect-ratio die Seitenverhältniskorrektur ausschalten.
+Das ist nützlich, falls man eine Einstellung in der Konfigurationsdatei
+übergehen möchte.
+
+Ein kurzer Spielname („Spielziel“), den Sie am Ende der Kommandozeile sehen,
+legt fest, welches Spiel gestartet wird. Dieser bezieht sich entweder auf ein
+willkürlich vom Anwender definiertes Ziel (aus der Konfigurationsdatei) oder auf
+eine vorbestimmte Spielkennung. Eine kurze Liste von Letzterem ist in
+Abschnitt 3.0 zu finden.
+
+Beispiele:
+ * Win32:
+ Startet Monkey Island im Vollbildmodus von Festplatte:
+ C:\Spiele\LucasArts\scummvm.exe -f -pC:\Spiele\LucasArts\monkey\ monkey
+ Startet Vollgas von CD, im Vollbildmodus und mit aktivierten Untertiteln:
+ C:\Spiele\LucasArts\scummvm.exe -f -n -pD:\resource\ ft
+
+* Unix:
+ Startet Monkey Island im Vollbildmodus von Festplatte:
+ /Pfad/zu/scummvm -f -p/Spiele/LucasArts/monkey/ monkey
+ Startet Vollgas von CD, im Vollbildmodus und mit aktivierten Untertiteln:
+ /Pfad/zu/scummvm -f -n -p/cdrom/resource/ ft
+
+
+5.2) Sprachoptionen:
+---- ---------------
+ScummVM beinhaltet Sprachoptionen für Maniac Mansion, Zak McKracken,
+The Dig, The Curse of Monkey Island, Beneath a Steel Sky und Baphomets Fluch.
+
+Beachten Sie, dass mit Ausnahme von Beneath a Steel Sky, Baphomets Fluch,
+mehrsprachigen Versionen der Goblins-Spiele und Nippon Safes Inc. die Verwendung
+dieser Option nicht die Sprache des Spiels ändert (die normalerweise fest
+programmiert ist), sondern nur dazu verwendet wird, um die passende Schriftart
+zu wählen (z. B. für eine deutsche Version eines Spiels, in der Umlaute
+enthalten sind).
+
+Eine Ausnahme bilden The Dig und The Curse of Monkey Island -- nicht-englische
+Versionen dieser Spiele können auf Englisch eingestellt werden. Dies hat
+allerdings nur Auswirkungen auf die Untertitel; die Sprachausgabe bleibt
+dieselbe.
+
+Maniac Mansion und Zak McKracken
+ en - Englisch (Standard)
+ de - Deutsch
+ fr - Französisch
+ it - Italienisch
+ es - Spanisch
+
+The Dig
+ jp - Japanisch
+ zh - Chinesisch
+ kr - Koreanisch
+
+The Curse of Monkey Island
+ en - Englisch (Standard)
+ de - Deutsch
+ fr - Französisch
+ it - Italienisch
+ pt - Portugiesisch
+ es - Spanisch
+ jp - Japanisch
+ zh - Chinesisch
+ kr - Koreanisch
+
+Beneath a Steel Sky
+ gb - Englisch (Großbritannien) (Standard)
+ en - Englisch (USA)
+ de - Deutsch
+ fr - Französisch
+ it - Italienisch
+ pt - Portugiesisch
+ es - Spanisch
+ se - Schwedisch
+
+Baphomets Fluch
+ en - Englisch (Standard)
+ de - Deutsch
+ fr - Französisch
+ it - Italienisch
+ es - Spanisch
+ pt - Portugiesisch
+ cz - Tschechisch
+
+
+5.3) Grafikfilter:
+---- -------------
+ScummVM bietet mehrere Kantenglättungsfilter, um zu versuchen, die bildliche
+Qualität zu verbessern. Dies sind die gleichen Filter, die in vielen anderen
+Emulatoren verwendet werden, wie beispielsweise MAME. Diese Filter nehmen die
+Originalgrafik und skalieren sie um einen bestimmten festen Faktor
+(normalerweise zwei- oder dreifach), bevor sie Ihnen diese anzeigen. Wenn somit
+z. B. ein Spiel ursprünglich in der Auflösung 320x200 läuft (typisch für die
+meisten SCUMM-Spiele), wird ein Filter mit zweifacher Skalierung die Grafiken
+mit der Auflösung 640x400 ausgeben. Gleichermaßen werden Sie durch die
+Verwendung eines 3x-Filters die Auflösung 960x600 erhalten.
+
+Die einzelnen Grafikoptionen im Ãœberblick:
+ 1x - Kein Filter, keine Skalierung. Am schnellsten.
+ 2x - Kein Filter, Faktor 2 (Standard für Spiele, die nicht in der
+ Auflösung 640x480 laufen).
+ 3x - Kein Filter, Faktor 3.
+ 2xsai - 2xSAI-Filter, Faktor 2.
+ super2xsai - Verbesserter 2xSAI-Filter, Faktor 2.
+ supereagle - Weniger verschwommen als 2xSAI, aber langsamer. Faktor 2.
+ advmame2x - Basiert nicht auf Verwischen wie 2xSAI, schnell. Faktor 2.
+ advmame3x - Basiert nicht auf Verwischen wie 2xSAI, schnell. Faktor 3.
+ hq2x - Sehr hochwertiger, qualitativer Filter, aber langsam. Faktor 2.
+ hq3x - Sehr hochwertiger, qualitativer Filter, aber langsam. Faktor 3.
+ tv2x - Zeilensprungfilter, emuliert Fernsehgerät. Faktor 2.
+ dotmatrix - Punktraster-Effekt. Faktor 2.
+
+Um einen Grafikfilter auszuwählen, stellen Sie diesen im Startmenü ein oder
+übergeben Sie dessen Namen über die Option „-g“ an scummvm, z. B. mit der
+Eingabe:
+
+ scummvm -gadvmame2x monkey2
+
+Hinweis 1: Nicht alle Systeme unterstützen alle (oder überhaupt welche) der oben
+aufgeführten Filter; einige unterstützen womöglich zusätzliche. Die Filter, die
+oben aufgeführt sind, werden standardmäßig vom SDL-System unterstützt.
+
+Hinweis 2: Filter können sehr langsam sein, wenn ScummVM mit einer
+Debug-Konfiguration ohne Optimierungen kompiliert wurde. Auch hat es immer
+Geschwindigkeitsauswirkungen, wenn eine Form der Kantenglättungs- oder linearen
+Filterung verwendet wird.
+
+Hinweis 3: Die FM-TOWNS-Version von Zak McKracken verwendet ursprünglich die
+Auflösung 320x240, daher werden skalierende Grafikfilter das Bild auf 640x480
+oder 960x720 skalieren. Gleichermaßen werden Spiele, die ursprünglich die
+Auflösung 640x480 verwendet haben (wie beispielsweise The Curse of Monkey Island
+oder Baphomets Fluch), auf 1280x960 und 1920x1440 skaliert.
+
+
+5.4) Globales Menü:
+---- --------------
+Das globale Menü ist ein allgemeines Menü, das in allen Spiel-Engines verfügbar
+ist und mit Strg+F5 aufgerufen werden kann. In diesem Menü befinden sich
+folgende Schaltflächen: „Fortsetzen“, „Optionen“, „Über“, „Zur Spieleliste
+zurück“ und „Beenden“. Wenn Sie „Optionen“ auswählen, wird ein Dialog angezeigt,
+in welchem einfache Audio-Einstellungen, wie beispielsweise Lautstärkepegel,
+festgelegt werden können. Wenn Sie „Zurück zur Spieleliste“ wählen, wird das
+momentane Spiel beendet und das Programm kehrt zur Spieleliste zurück, von der
+aus ein anderes Spiel gestartet werden kann.
+
+Hinweis: Das Zurückkehren zur Spieleliste wird nicht von allen Engines
+unterstützt, weshalb die Schaltfläche im globalen Menü deaktiviert wird, wenn
+diese Funktion nicht verfügbar ist.
+
+Die Engines, die momentan das Zurückkehren zur Spieleliste unterstützen, sind:
+
+ AGI
+ AGOS
+ CINE
+ DRACI
+ GOB
+ GROOVIE
+ KYRA
+ LURE
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TOUCHE
+ TUCKER
+
+
+5.5) Tastenkürzel:
+---- -------------
+ScummVM unterstützt zahlreiche Tastenkürzel in Spielen. Sie unterscheiden sich
+zwischen SCUMM-Spielen und anderen Spielen.
+
+ Allgemein:
+ Strg+F5 - Zeigt globales Menü.
+ Cmd+q - Beenden (Mac OS X)
+ Strg+q - Beenden (andere UNIX-Systeme einschließlich Linux)
+ Strg+z ODER Alt+x - Beenden (andere Plattformen)
+ Strg+u - Allen Ton abschalten - EIN/AUS
+ Strg+m - Mausbegrenzung in Fenster EIN/AUS
+ Strg+Alt 1-8 - Wechselt zwischen Grafikfiltern.
+ Strg+Alt + oder - - Skalierungsfaktor höher/niedriger
+ Strg+Alt+a - Seitenverhältniskorrektur EIN/AUS
+ Die meisten Spiele verwenden die Auflösung
+ 320x200 Pixel, was auf modernen Monitoren
+ zusammengequetscht aussehen kann. Die
+ Seitenverhältniskorrektur streckt das Bild
+ stattdessen auf 320x240 Pixel oder um ein
+ Vielfaches davon.
+ Alt+Enter - Wechselt zwischen Vollbild- und Fenstermodus.
+ Alt+s - Macht Bildschirmfoto (nur für SDL-System).
+
+ SCUMM:
+ Strg 0-9 und Alt 0-9 - Lädt und speichert entsprechenden Speicherstand.
+ Strg+d - Startet den Debugger.
+ Strg+f - Schneller Modus EIN/AUS
+ Strg+g - SEHR schneller Modus EIN/AUS
+ Strg+t - Wechselt zwischen „Nur Sprachausgabe“,
+ „Sprachausgabe und Untertitel“ und
+ „Nur Untertitel“.
+ Tilde (~) - Zeigt/verbirgt Debugging-Konsole.
+ [ und ] - Musiklautstärke, leiser/lauter
+ - und + - Texttempo, langsamer/schneller
+ F5 - Ruft Menü zum Speichern und Laden auf.
+ Alt+F5 - Ruft das Original-Menü zum Speichern und Laden auf,
+ sofern eines im Spiel enthalten ist. Sie können mit
+ diesem Spiele speichern und laden, jedoch ist es
+ für diesen Zweck nicht vorgesehen und kann in
+ einigen Spielen ScummVM zum Absturz führen.
+ i - Zeigt IQ-Punkte an (Indiana Jones and the Last
+ Crusade sowie Indiana Jones and the Fate of
+ Atlantis).
+ Leertaste - Spielpause
+ Punkt (.) - Ãœberspringt aktuelle Textzeile in machen Spielen.
+ Enter - Simuliert Klick mit linker Maustaste.
+ Tabulator - Simuliert Klick mit rechter Maustaste.
+
+ Beneath a Steel Sky:
+ Strg+d - Startet den Debugger.
+ Strg+f - Schneller Modus EIN/AUS
+ Strg+g - SEHR schneller Modus EIN/AUS
+ F5 - Ruft Menü zum Speichern und Laden auf.
+ Escape - Ãœberspringt den Vorspann des Spiels.
+ Punkt (.) - Ãœberspringt aktuelle Textzeile.
+
+ Baphomets Fluch:
+ F5 oder Escape - Ruft Menü zum Speichern und Laden auf.
+
+ Baphomets Fluch II:
+ Strg+d - Startet den Debugger.
+ Strg+f - Schneller Modus EIN/AUS
+ p - Spielpause
+
+ DraÄi Historie:
+ F5 - Zeigt globales Menü.
+ Linksklick - Laufen, untersuchen
+ Rechtsklick - Verwenden, reden
+ Maus nach oben, i - Inventar
+ Maus nach unten, m - Karte
+ Escape - Vorspann überspringen, Karte/Inventar schließen
+ beliebiger Klick - Ãœberspringt aktuellen Satz.
+ q - Schnelles Laufen EIN/AUS
+
+ Flight of the Amazon Queen:
+ Strg+d - Startet den Debugger.
+ Strg+f - Schneller Modus EIN/AUS
+ F1 - Tagebuch benutzen (speichern/laden)
+ F11 - Schnelles Speichern
+ F12 - Schnelles Laden
+ Escape - Ãœberspringt Zwischensequenzen.
+ Leertaste - Ãœberspringt aktuelle Textzeile.
+
+ Future Wars
+ F1 - Untersuchen
+ F2 - Nehmen
+ F3 - Inventar
+ F4 - Verwenden
+ F5 - Aktivieren
+ F6 - Sprechen
+ F9 - „Aktivieren“-Menü
+ F10 - „Verwenden“-Menü
+ Escape - Befehlsmenü aufrufen
+
+ Nippon Safes
+ Strg+d - Startet den Debugger.
+ l - Spiel laden
+ s - Spiel speichern
+
+
+ Simon the Sorcerer 1 und 2:
+ Strg 0-9 und Alt 0-9 - Lädt und speichert entsprechenden Speicherstand.
+ Strg+d - Startet den Debugger.
+ Strg+f - Schneller Modus EIN/AUS
+ F1-F3 - Texttempo, schneller - langsamer
+ F10 - Zeigt alle Figuren und Objekte, die näher
+ betrachtet werden können.
+ Escape - Ãœberspringt Zwischensequenzen.
+ - und + - Musiklautstärke, leiser/lauter
+ m - Musik EIN/AUS
+ s - Sound-Effekte EIN/AUS
+ b - Hintergrundgeräusche EIN/AUS
+ [nur in Simon the Sorcerer 2 möglich]
+ Pause - Spielpause
+ t - Wechselt zwischen Sprachausgabe allein und
+ Sprachausgabe und Untertiteln zusammen
+ [Simon the Sorcerer 1 CD (außer Deutsch und
+ Englisch) und Simon the Sorcerer 2 CD
+ (alle Sprachen)].
+ v - Wechselt zwischen Untertiteln allein und
+ Sprachausgabe und Untertiteln zusammen
+ [nur Simon the Sorcerer 2 CD].
+
+ Simon the Sorcerer's Game Pack
+ Strg-d - Startet den Debugger.
+ Strg-f - Schneller Modus EIN/AUS
+ F12 - Hohes Tempo in Swampy Adventures EIN/AUS
+ - und + - Musiklautstärke, leiser/lauter
+ m - Musik EIN/AUS
+ s - Sound-Effekte EIN/AUS
+ Pause - Spielpause
+
+ Floyd - Es gibt noch Helden
+ Strg+d - Startet den Debugger.
+ Strg+f - Schneller Modus EIN/AUS
+ F7 - Wechselt Figuren.
+ F9 - Objektnamen-Anzeige EIN/AUS
+ s - Sound-Effekte EIN/AUS
+ Pause - Spielpause
+ t - Wechselt zwischen Sprachausgabe allein und
+ Sprachausgabe und Untertiteln zusammen.
+ v - Wechselt zwischen Untertiteln allein und
+ Sprachausgabe und Untertiteln zusammen.
+
+ The Legend of Kyrandia:
+ Strg 0-9 und Alt 0-9 - Lädt und speichert entsprechenden Speicherstand.
+ Strg-d - Startet den Debugger.
+
+ TeenAgent
+ F5 - Zeigt globales Menü.
+
+ Touché: Die Abenteuer des fünften Musketiers:
+ Strg-f - Schneller Modus EIN/AUS
+ F5 - Zeigt Optionen.
+ F9 - Schnelles Gehen EIN
+ F10 - Schnelles Gehen AUS
+ Escape - Beenden
+ Leertaste - Ãœberspringt aktuelle Textzeile.
+ t - Wechselt zwischen „Nur Sprachausgabe“,
+ „Sprachausgabe und Text“ und „Nur Text“.
+
+Beachten Sie, dass von der Verwendung von Strg+f oder Strg+g abgeraten wird:
+Spiele können abstürzen, wenn sie schneller als mit ihrer normalen
+Geschwindigkeit laufen, da Skripte aus dem Takt kommen.
+
+Hinweis für WinCE-Anwender: Wegen der beschränkten Tastatureingabe-Möglichkeiten
+bei den meisten Geräten wird ein kleiner Teil dieser Tastenkürzel über die
+Neutastenzuweisung und/oder Konsolenaktionen unterstützt. Näheres ist in der
+Datei README-WinCE.txt nachzulesen.
+
+
+6.0) Spielstände:
+---- ------------
+Spielstände werden bei einigen Plattformen standardmäßig im aktuellen
+Verzeichnis gespeichert und bei anderen in voreingestellten Verzeichnissen.
+Sehen Sie sich das Beispiel weiter unten in dieser Liesmich-Datei an.
+
+Die folgenden Plattformen haben ein anderes Standardverzeichnis:
+ Mac OS X: $HOME/Documents/ScummVM Savegames/
+ Andere UNIX-Systeme: $HOME/.scummvm/
+
+
+6.1) Automatische Spielstände:
+---- -------------------------
+Bei einigen Spielen (nämlich „Beneath a Steel Sky“, „Flight of the Amazon
+Queen“, allen AGI-Spielen und allen SCUMM-Spielen) wird ScummVM standardmäßig
+automatisch alle fünf Minuten den momentanen Spielstand speichern (über die
+Konfigurationseinstellung „autosave_period“ [Zeitspanne für automatisches
+Speichern] kann dies geändert werden). Bei AGI- und SCUMM-Spielen werden diese
+automatischen Spielstände auf Platz 0 abgelegt. Bei der SCUMM-Engine kann dieser
+Speicherstand über die Tastenkombination Strg+0 oder über das F5-Menü geladen
+werden.
+
+
+6.2) Spielstände umwandeln:
+---- ----------------------
+Die Verwendung von Spielständen aus den Originalversionen wird nicht von allen
+Spiel-Engines unterstützt. Nur bei den folgenden Spielen können Spielstände aus
+den Originalversionen verwendet werden.
+
+ Elvira 1
+ - Fügen Sie 8 Bytes (Name für Spielstand) am Anfang der Spielstanddatei
+ hinzu.
+ - Benennen Sie die Spielstanddatei in „elvira1.xxx“ um.
+
+ Elvira 2
+ - Fügen Sie 8 Bytes (Name für Spielstand) am Anfang der Spielstanddatei
+ hinzu.
+ - Benennen Sie die Spielstanddatei in „elvira2-pc.xxx“ (DOS-Versionen) oder
+ „elvira2.xxx“ (andere Versionen) um.
+
+ Waxworks
+ - Fügen Sie 8 Bytes (Name für Spielstand) am Anfang der Spielstanddatei
+ hinzu.
+ - Benennen Sie die Spielstanddatei in „waxworks-pc.xxx“ (DOS-Versionen) oder
+ „waxworks.xxx“ (andere Versionen) um.
+
+ Simon the Sorcerer 1
+ - Benennen Sie die Spielstanddatei in „simon1.xxx“ um.
+
+ Simon the Sorcerer 2
+ - Benennen Sie die Spielstanddatei in „simon2.xxx“ um.
+
+ Floyd - Es gibt noch Helden
+ - Benennen Sie die Spielstanddatei in „feeble.xxx“ um.
+
+Hierbei steht „xxx“ für den genauen Speicherplatz (z. B. 001), auf welchem sich
+der Spielstand unter ScummVM befinden soll.
+
+
+6.3) Spielstände von Kommandozeile aus anzeigen/laden:
+---- -------------------------------------------------
+
+--list-saves:
+
+ Dieser Schalter kann verwendet werden, um eine Liste der momentanen
+ Spielstände des festgelegten Zielspiels und der entsprechenden Speicherplätze
+ anzuzeigen.
+
+ Verwendung: --list-saves=[ZIEL], wobei [ZIEL] das Zielspiel ist
+
+ Die Engines, die momentan --list-saves unterstützen, sind:
+
+ AGI
+ AGOS
+ CINE
+ DRACI
+ GROOVIE
+ KYRA
+ LURE
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TINSEL
+ TOUCHE
+ TUCKER
+
+--save-slot/-x:
+
+ Dieser Schalter kann verwendet werden, um einen Spielstand direkt von der
+ Kommandozeile aus zu laden.
+
+ Verwendung: --save-slot[SPEICHERPLATZ] oder -x[SPEICHERPLATZ], wobei
+ [SPEICHERPLATZ] die Nummer des Speicherplatzes ist
+
+ Die Engines, die momentan --save-slot/-x unterstützen, sind:
+
+ AGI
+ CINE
+ DRACI
+ GROOVIE
+ KYRA
+ LURE
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TINSEL
+ TOUCHE
+
+
+7.0) Musik und Sound:
+---- ----------------
+Bei den meisten Betriebssystemen und Spielen wird ScummVM standardmäßig MT-32-
+oder AdLib-Emulation für die Musikwiedergabe verwenden. MIDI ist nicht bei allen
+Betriebssystemen verfügbar oder muss womöglich manuell konfiguriert werden. Wenn
+Sie MIDI verwenden möchten, haben Sie mehrere unterschiedliche
+Ausgabemöglichkeiten, was von Ihrem Betriebssystem und dessen Konfiguration
+abhängt.
+
+ null - Keine Ausgabe. Spielt keinerlei Musik ab.
+
+ adlib - Interne AdLib-Emulation
+ fluidsynth - FluidSynth-MIDI-Emulation
+ mt32 - Interne MT-32-Emulation
+ pcjr - Interne PCjr-Emulation (nur in SCUMM-Spielen verwendbar)
+ pcspk - Interne PC-Lautsprecher-Emulation
+ towns - Interne FM-TOWNS-YM2612-Emulation
+ (nur in SCUMM-FM-TOWNS-Spielen verwendbar)
+
+ alsa - Ausgabe mittels ALSA-Sequenzer-Gerät. Siehe unten.
+ core - CoreAudio-Sound, für Mac-OS-X-Anwender.
+ coremidi - CoreMIDI-Sound, für Mac-OS-X-Anwender. Verwenden Sie diese
+ Option nur, wenn Sie einen Hardware-MIDI-Synthesizer haben.
+ seq - Verwendet /dev/sequencer für MIDI-Ausgabe, *nix-Anwender.
+ Siehe unten.
+ timidity - Verbindet zu TiMidity++-MIDI-Server. Siehe unten.
+ windows - Windows MIDI. Verwendet eingebauten Sequenzer, für
+ Windows-Anwender.
+
+Um einen Sound-Treiber auszuwählen, stellen Sie diesen im Startmenü ein oder
+übergeben Sie dessen Namen über die Option „-e“ an scummvm, z. B. mit der
+Eingabe:
+
+ scummvm -eadlib monkey2
+
+
+7.1) Sound-Wiedergabe mittels AdLib-Emulation:
+---- -----------------------------------------
+Standardmäßig wird eine AdLib-Soundkarte emuliert und ScummVM wird die Musik als
+abgetastete Wellen ausgeben. Das ist die Standard-Methode für die einige Spiele
+und bietet die beste Kompatibilität zwischen Maschinen und Spielen.
+
+
+7.2) Sound-Wiedergabe mittels FluidSynth-MIDI-Emulation:
+---- ---------------------------------------------------
+Wenn ScummVM mit Unterstützung von libfluidsynth kompiliert wurde, wird das
+Programm in der Lage sein, MIDI-Musik durch den FluidSynth-Treiber
+wiederzugeben. Hierfür müssen Sie jedoch eine zu verwendende SoundFont-Datenbank
+festlegen.
+
+Da die standardmäßige Ausgabelautstärke von FluidSynth ziemlich leise sein kann,
+wird ScummVM standardmäßig das Signal verstärken. Dies kann mit der
+Kommandozeilenoption --midi-gain weiter geregelt werden oder mittels der
+Einstellung „midi_gain“ in der Konfigurationsdatei.
+
+Die Einstellung kann jeden Wert zwischen 0 und 1000 annehmen, wobei der
+Standard-Wert 100 ist (dies entspricht der FluidSynth-Verstärkung von 0,0 bis
+10,0, die vermutlich in Dezibel bemessen wird).
+
+HINWEIS: Die Prozessorvoraussetzungen für FluidSynth können in einigen Fällen
+ziemlich hoch sein. Ein schneller Hauptprozessor (CPU) wird empfohlen.
+
+
+7.3) Sound-Wiedergabe mittels MT-32-Emulation:
+---- -----------------------------------------
+Einige Spiele, die MIDI-Musikdaten beinhalten, haben auch verbesserte Versionen
+der Musikstücke für das MT-32-Soundmodul. ScummVM kann nun dieses Gerät
+emulieren, jedoch müssen Sie originale MT-32-ROM-Dateien verwenden, damit es
+funktioniert:
+
+MT32_PCM.ROM - IC21 (512 KB)
+MT32_CONTROL.ROM - IC26 (32 KB) und IC27 (32 KB), Byte-weise verschachtelt
+
+Legen Sie diese ROM-Dateien entweder im Spielverzeichnis ab, im Extrapfad oder
+im Verzeichnis, in dem sich Ihre ausführbare ScummVM-Datei befindet.
+
+Bei diesem Treiber müssen Sie nicht --native-mt32 mittels Kommandozeile
+festlegen, da er automatisch aktiviert wird.
+
+HINWEIS: Die Prozessorvoraussetzungen für diesen Emulator sind ziemlich hoch;
+ein schneller Hauptprozessor (CPU) wird dringend empfohlen.
+
+
+7.4) Sound-Wiedergabe mittels MIDI-Emulation:
+---- ----------------------------------------
+Einige Spiele (wie beispielsweise Sam & Max) beinhalten nur MIDI-Musikdaten.
+Einst hat dies verhindert, Musik in diesen Spielen auf Plattformen
+wiederzugeben, auf welchen MIDI nicht unterstützt wird oder auf Soundkarten, die
+keine MIDI-Treiber bereitstellen (z. B. können viele Soundkarten MIDI unter
+Linux nicht abspielen). ScummVM kann nun den MIDI-Modus emulieren mittels
+abgetasteter Wellen und AdLib, FluidSynth-MIDI-Emulation oder MT-32-Emulation
+entsprechend über die Option -eadlib, -efluidsynth oder -emt32. Wenn Sie jedoch
+in der Lage sind, natives MIDI zu verwenden, empfehlen wir zur Erzielung von
+bestmöglichem Klang, eine der unten stehenden MIDI-Methoden zu verwenden.
+
+
+7.5) Sound-Wiedergabe mittels nativem MIDI:
+---- --------------------------------------
+Verwenden Sie die geeignete Kommandozeilenoption -e<Modus> aus der oberen
+Aufzählung, um Ihr bevorzugtes MIDI-Gerät auszuwählen. Wenn Sie beispielsweise
+den Windows-MIDI-Treiber benutzen möchten, verwenden Sie die Option -ewindows.
+
+
+7.5.1) Verwendung von MIDI-Optionen zur Anpassung der nativen MIDI-Ausgabe:
+------ --------------------------------------------------------------------
+ScummVM unterstützt eine Vielzahl von MIDI-Methoden, was von den Fähigkeiten des
+MIDI-Geräts abhängt.
+
+Wenn --native-mt32 festgelegt ist, wird ScummVM Ihr Gerät als echtes MT-32-Modul
+behandeln. Da die Instrumentenzuweisung und exklusiven Systembefehle von MT-32
+sich von denen der General-MIDI-Geräte unterscheiden, sollten Sie diese Option
+nur aktivieren, wenn Sie tatsächlich Roland MT-32, LAPC-I, CM-64, CM-32L, CM-500
+oder ein GS-Gerät mit MT-32-Zuweisung verwenden.
+
+Wenn --enable-gs festgelegt ist, wird ScummVM Ihr GS-kompatibles Gerät mit
+Voreinstellungen belegen, die den Hall von MT-32 nachahmen, (das Fehlen von)
+Chorus, die Empfindlichkeit der gleitenden Tonhöhenverschiebung usw. Wenn dies
+in Verbindung mit --native-mt32 festgelegt ist, wird ScummVM die
+MT-32-kompatible Zuweisung und das Schlagzeug auf Ihrem GS-Gerät auswählen.
+Diese Einstellung funktioniert besser als standardmäßige GM- oder GS-Emulation
+in Spielen, die keine spezifische Instrumentenzuweisung haben (Loom und
+Monkey1). Sie sollten nur beide Einstellungen festlegen, wenn Sie ein GS-Gerät
+verwenden, das eine MT-32-Zuweisung hat, wie beispielsweise SC-55, SC-88,
+SC-88 Pro, SC-8820, SC-8850, usw. Bitte beachten Sie, dass --enable-gs sowohl
+für DOTT als auch Sam & Max nicht verfügbar ist, da diese Spiele nativ General
+MIDI verwenden.
+
+Wenn keine der oberen Einstellungen aktiviert ist, wird ScummVM Ihr Gerät im
+General-MIDI-Modus initialisieren und GM-Emulation in Spielen mit
+MT-32-Soundtrack verwenden.
+
+Einige Spiele beinhalten Sound-Effekte, die exklusiv für den AdLib-Soundtrack
+vorgesehen sind. Für diese Spiele sollten Sie --multi-midi festlegen, um
+MIDI-Musik mit AdLib-Sound-Effekten zu kombinieren.
+
+
+7.6) Sound-Wiedergabe mittels MIDI-Sequenzer: [NUR IN UNIX]
+---- ----------------------------------------
+Wenn Ihr Soundkartentreiber einen Sequenzer unterstützt, können Sie mit der
+Umgebungsvariable „SCUMMVM_MIDI“ auf Ihr Sequenzergerät zeigen -- z. B auf
+/dev/sequencer
+
+Wenn Sie bei dieser Einstellung das Problem haben, dass Sie keinen Ton hören,
+müssen Sie womöglich die Umgebungsvariable „SCUMMVM_MIDIPORT“ mit dem Wert 1
+oder 2 belegen. Dies wählt den Port auf dem zu verwendenden ausgewählten
+Sequenzer aus. Starten Sie dann scummvm mit dem Parameter -eseq. Das sollte bei
+verschiedenen Soundkarten funktionieren und bietet womöglich bessere Leistung
+und Qualität als AdLib-Emulation. Bei Systemen, bei welchen die
+Sequenzer-Unterstützung jedoch nicht funktioniert, können Sie immer auf die
+AdLib-Emulation zurückgreifen.
+
+
+7.6.1) Sound-Wiedergabe mittels ALSA-Sequenzer: [NUR IN UNIX]
+------ ----------------------------------------
+Wenn Sie den ALSA-Treiber mit Sequenzer-Unterstützung installiert haben, können
+Sie bei der Umgebungsvariable „SCUMMVM_PORT“ oder der Variable „alsa_port“ in
+der Konfigurationsdatei den Sequenzer-Port festlegen. Wenn der Port in keiner
+der beiden Variablen festgelegt ist, werden standardmäßig die Ports „65:0“ und
+„17:0“ probiert.
+
+Hier ist eine kurze Anleitung, um den ALSA-Sequenzer mit Ihrer Soundkarte zu
+verwenden. In allen Fällen können Sie eine Liste aller Sequenzer-Ports, die Sie
+haben, mit dem Befehl „aconnect -o -l“ erhalten. Hierdurch sollte etwas
+Ähnliches wie folgt ausgegeben werden:
+
+client 14: 'Midi Through' [type=kernel]
+ 0 'Midi Through Port-0'
+client 16: 'SBLive! Value [CT4832]' [type=kernel]
+ 0 'EMU10K1 MPU-401 (UART)'
+client 17: 'Emu10k1 WaveTable' [type=kernel]
+ 0 'Emu10k1 Port 0 '
+ 1 'Emu10k1 Port 1 '
+ 2 'Emu10k1 Port 2 '
+ 3 'Emu10k1 Port 3 '
+client 128: 'TiMidity' [type=user]
+ 0 'TiMidity port 0 '
+ 1 'TiMidity port 1 '
+ 2 'TiMidity port 2 '
+ 3 'TiMidity port 3 '
+
+Das Wichtigste hieraus ist, dass es vier WaveTable-MIDI-Ausgänge gibt, die sich
+bei 17:0, 17:1, 17:2 und 17:3 befinden, sowie vier TiMidity-Ports, die sich bei
+128:0, 128:1, 128:2 und 128:3 befinden.
+
+Wenn Sie einen FM-Chip auf Ihrer Soundkarte haben, wie beispielsweise die
+Sound Blaster 16, dann müssen Sie die SoundsFonts über das Programm sbiload
+laden. Beispiel:
+
+ sbiload -p 17:0 /etc/std.o3 /etc/drums.o3
+
+Wenn Sie eine WaveTable-fähige Soundkarte haben, müssen Sie eine SBK- oder
+SF2-SoundFont-Datenbank über das Programm asfxload laden. Beispiel:
+
+ sfxload /Pfad/zu/8mbgmsfx.sf2
+
+Wenn Sie keine MIDI-fähige Soundkarte haben, gibt es zwei Alternativen:
+FluidSynth und TiMidity. Wir empfehlen FluidSynth, da TiMidity auf vielen
+Systemen bei der Musik „nachhinkt“. Das ist in Spielen mit iMUSE sehr auffällig,
+die schnelle und dynamische Musikübergänge verwenden. Wenn Sie „TiMidity“ unter
+„root“ laufen lassen, ermöglicht dies die Einstellung von Echtzeitpriorität, was
+das Nachziehen der Musik reduzieren kann.
+
+Wie folgt weisen Sie TiMidity an, ein ALSA-Sequenzer zu werden:
+
+ timidity -iAqqq -B2,8 -Os1S -s 44100 &
+
+(Wenn Sie mit diesen Parametern eine unleserliche Ausgabemeldung erhalten,
+können Sie -B2,8 weglassen oder den Wert ändern.)
+
+Wie folgt weisen Sie FluidSynth an, ein ALSA-Sequenzer zu werden (mittels
+SoundFonts):
+
+ fluidsynth -m alsa_seq /Pfad/zu/8mbgmsfx.sf2
+
+Wenn einmal TiMidity oder FluidSynth laufen, verwenden Sie den Befehl
+„aconnect -o -l“, der bereits in diesem Abschnitt beschrieben wurde.
+
+
+7.6.2) Sound-Wiedergabe mittels IRIX-dmedia-Sequenzer: [NUR IN UNIX]
+------ -----------------------------------------------
+Wenn Sie IRIX und den Treiber dmedia mit Sequenzer-Unterstützung verwenden,
+können Sie bei der Umgebungsvariable „SCUMMVM_MIDIPORT“ oder der Variable
+„dmedia_port“ in der Konfigurationsdatei den Sequenzer-Port festlegen.
+Standardmäßig wird der erste Port verwendet.
+
+Um eine Liste der konfigurierten MIDIs auf Ihrem System zu erhalten, rufen Sie
+„startmidi“ ohne Parameter auf. Beispiel-Ausgabemeldung:
+
+ 2 MIDI interfaces configured:
+ Serial Port 2
+ Software Synth
+
+In diesem Beispiel können Sie in ScummVM konfigurieren, dass der
+„Software Synth“ anstatt des standardmäßigen „Serial Port 2“ verwendet wird,
+indem Sie die Zeile
+
+ dmedia_port=Software Synth
+
+in Ihrer Konfigurationsdatei im Abschnitt [scummvm] einfügen oder bei den
+Umgebungsvariablen „SCUMMVM_PORT=Software Synth“ festlegen.
+
+
+7.7) TiMidity++-MIDI-Server verwenden:
+---- ---------------------------------
+Wenn Ihrem Betriebssystem jeglicher MIDI-Sequenzer fehlt, aber Sie trotzdem eine
+bessere MIDI-Qualität haben wollen, als die standardmäßige AdLib-Emulation
+bieten kann, können Sie es mit dem TiMidity++-MIDI-Server versuchen. Schauen Sie
+auf der Website http://timidity.sourceforge.net/ bezüglich Download- und
+Installationsanweisungen nach.
+
+Zuerst benötigen Sie einen Dämonen (ein im Hintergrund laufendes
+Dienstprogramm):
+
+ timidity -ir 7777
+
+Nun können Sie ScummVM starten und TiMidity für Musikausgabe auswählen.
+Standardmäßig wird das Programm mit dem localhost:7777 verbunden, aber Sie
+können Host und Port über die Umgebungsvariable „TIMIDITY_HOST“ ändern. Sie
+können auch eine „Gerätenummer“ über die Umgebungsvariable „SCUMMVM_MIDIPORT“
+festlegen.
+
+
+7.8) Komprimierte Audio-Dateien verwenden
+---- ------------------------------------
+
+7.8.0) MP3-Dateien für Audio von CD verwenden:
+------ ---------------------------------------
+Verwenden Sie LAME oder einen anderen MP3-Kodierer, um die CD-Audio-Titel in
+Dateien zu extrahieren. Benennen Sie die Dateien in track1.mp3, track2.mp3 usw.
+um. Sie müssen die Dateien zuerst von der CD als WAV-Datei extrahieren und dann
+in eine MP3-Datei mit konstanter Bitrate umwandeln. Das kann durch folgenden
+LAME-Befehl in der Kommandozeile geschehen:
+
+ lame -t -q 0 -b 96 track1.wav track1.mp3
+
+
+7.8.1) Ogg-Vorbis-Dateien für Audio von CD verwenden:
+------ ----------------------------------------------
+Verwenden Sie oggenc oder einen anderen Vorbis-Kodierer, um die CD-Audio-Titel
+in Dateien umzuwandeln. Benennen Sie die Dateien in track1.ogg, track2.ogg usw.
+um. ScummVM muss mit Unterstützung für Ogg Vorbis kompiliert sein, um diese
+Option nutzen zu können. Sie müssen die Dateien zuerst von der CD als WAV-Datei
+extrahieren und dann in eine Vorbis-Datei umwandeln. Das kann mit folgendem
+Befehl in oggenc in der Kommandozeile geschehen, wobei der Wert nach q die
+gewünschte Qualität zwischen 0 und 10 festlegt:
+
+ oggenc -q 5 track1.wav
+
+
+7.8.2) FLAC-Dateien für Audio von CD verwenden:
+------ ----------------------------------------
+Verwenden Sie flac oder einen anderen FLAC-Kodierer, um die CD-Audio-Titel in
+Dateien umzuwandeln. Benennen Sie die Dateien in track1.flac, track2.flac usw.
+um. Wenn Ihr Dateisystem nur drei Buchstaben für die Dateiendung erlaubt,
+benennen Sie die Dateien in track1.fla, track2.fla usw. um. ScummVM muss mit
+Unterstützung für FLAC kompiliert sein, um diese Option nutzen zu können. Sie
+müssen die Dateien zuerst von der CD als WAV-Datei extrahieren und dann in eine
+FLAC-Datei umwandeln. Das kann mit folgendem FLAC-Befehl in der Kommandozeile
+geschehen:
+
+ flac --best track1.wav
+
+Denken Sie daran, dass die Qualität immer dieselbe ist und die abweichenden
+Kodieroptionen nur Auswirkungen auf die Kodierzeit und letztendliche Dateigröße
+haben.
+
+
+7.8.3) MONSTER.SOU mittels MP3 komprimieren:
+------ -------------------------------------
+Sie benötigen LAME und unser Dienstprogramm „compress_scumm_sou“ aus dem
+ScummVM-Tools-Paket, um diese Aufgabe zu verrichten, und ScummVM muss mit
+MAD-Unterstützung kompiliert sein.
+
+ compress_scumm_sou monster.sou
+
+Am Ende werden Sie die viel kleinere Datei monster.so3 haben. Kopieren Sie diese
+Datei ins Verzeichnis des Spiels. Sie können unbesorgt die Datei monster.sou
+hieraus entfernen.
+
+
+7.8.4) MONSTER.SOU mittels Ogg Vorbis komprimieren:
+------ --------------------------------------------
+Ähnlich wie oben muss ScummVM mit Ogg-Unterstützung kompiliert sein. Rufen Sie
+auf:
+
+ compress_scumm_sou --vorbis monster.sou
+
+Dadurch sollte die kleinere Datei monster.sog erzeugt werden, welche Sie ins
+Verzeichnis des Spiels kopieren sollten. Die Umwandlung in Ogg kann beträchtlich
+länger dauern als bei MP3, also sollten Sie ein gutes Buch zur Hand haben.
+
+
+7.8.5) MONSTER.SOU mittels FLAC komprimieren:
+------ --------------------------------------
+Ähnlich wie oben muss ScummVM mit FLAC-Unterstützung kompiliert sein. Rufen Sie
+auf:
+
+ compress_scumm_sou --flac monster.sou
+
+Dadurch sollte die kleinere Datei monster.sof erzeugt werden, welche Sie ins
+Verzeichnis des Spiels kopieren sollten. Denken Sie daran, dass die Qualität
+immer dieselbe ist und die abweichenden Kodieroptionen nur Auswirkungen auf die
+Kodierzeit und letztendliche Dateigröße haben. Die Veränderung der Blockgröße
+(-b <Wert>) hat den größten Einfluss auf die letztendliche Dateigröße --
+1152 scheint ein guter Wert für diese Art von Sound-Dateien zu sein. Lesen Sie
+auf jeden Fall die Dokumentation des Kodierers, bevor Sie einen anderen Wert
+verwenden.
+
+
+7.8.6) Musik/Sound/Sprachausgabe in AGOS-Spielen komprimieren:
+------ -------------------------------------------------------
+Verwenden Sie unser Dienstprogramm „compress_agos“ aus dem ScummVM-Tools-Paket,
+um diese Aufgabe zu verrichten. Sie können zwischen mehreren Zielformaten
+auswählen, aber beachten Sie, dass Sie diese nur verwenden können, wenn ScummVM
+mit entsprechender Dekodierer-Unterstützung kompiliert wurde.
+
+ compress_agos effects (Für Acorn-CD-Version von Simon 1)
+ compress_agos simon (Für Acorn-CD-Version von Simon 1)
+ compress_agos effects.voc (Für DOS-CD-Version von Simon 1)
+ compress_agos simon.voc (Für DOS-CD-Version von Simon 1)
+ compress_agos simon.wav (Für Windows-CD-Version von Simon 1)
+ compress_agos simon2.voc (Für DOS-CD-Version von Simon 2)
+ compress_agos simon2.wav (Für Windows-CD-Version von Simon 2)
+ compress_agos mac (Für Macintosh-Version von Simon 2)
+
+ compress_agos voices1.wav (Für Windows-2CD/4CD-Version von Floyd)
+ compress_agos voices2.wav (Für Windows-2CD/4CD-Version von Floyd)
+ compress_agos voices3.wav (Für Windows-4CD-Version von Floyd)
+ compress_agos voices4.wav (Für Windows-4CD-Version von Floyd)
+
+ compress_agos Music (Für Windows-Version von Game Pack)
+
+Für Ogg Vorbis fügen Sie den Parameter --vorbis den Optionen hinzu. Beispiel:
+
+ compress_agos --vorbis
+
+Für FLAC fügen Sie den Parameter --flac und optionale Unterparameter hinzu.
+Beispiel:
+
+ compress_agos --flac
+
+Am Ende werden Sie die viel kleinere Datei *.mp3, *.ogg oder *.fla haben.
+Kopieren Sie diese Datei ins Verzeichnis des Spiels. Sie können unbesorgt die
+alte Datei hieraus entfernen.
+
+
+7.8.7) Sprachausgabe/Musik in Baphomets Fluch komprimieren:
+------ ----------------------------------------------------
+Das Tool „compress_sword1“ aus dem ScummVM-Tools-Paket kann Musik und
+Sprachausgabe des Spiels sowohl in MP3, Ogg Vorbis als auch FLAC kodieren. Die
+einfachste Möglichkeit, die Dateien umzuwandeln, ist, die ausführbare Datei des
+Tools in das Verzeichnis des Spiels zu kopieren (zusammen mit dem LAME-Kodierer)
+und sie von dort aus aufzurufen. Auf diese Weise wird automatisch alles in MP3
+umgewandelt. Hinterher können Sie manuell die Dateien SPEECH?.CLU und die
+WAVE-Musik-Dateien entfernen.
+
+Wenn Sie „compress_sword1 --vorbis“ aufrufen, werden die Dateien in Ogg Vorbis
+anstatt MP3 umgewandelt.
+
+Wenn Sie „compress_sword1 --flac“ aufrufen, werden die Dateien in FLAC anstatt
+MP3 umgewandelt.
+
+Rufen Sie „compress_sword1 --help“ auf, um eine komplette Liste der Optionen
+angezeigt zu bekommen.
+
+
+7.8.8) Sprachausgabe/Musik in Baphomets Fluch II komprimieren:
+------ -------------------------------------------------------
+Verwenden Sie unser Dienstprogramm „compress_sword2“ aus dem
+ScummVM-Tools-Paket, um diese Aufgabe zu verrichten. Sie können zwischen
+mehreren Zielformaten auswählen, aber beachten Sie, dass Sie diese nur verwenden
+können, wenn ScummVM mit entsprechender Dekodierer-Unterstützung kompiliert
+wurde.
+
+ compress_sword2 speech1.clu
+ compress_sword2 music1.clu
+
+Für Ogg Vorbis fügen Sie den Parameter --vorbis den Optionen hinzu. Beispiel:
+
+ compress_sword2 --vorbis
+
+Am Ende werden Sie die viel kleinere Datei *.cl3 oder *.clg haben. Kopieren Sie
+diese Datei ins Verzeichnis des Spiels. Sie können unbesorgt die alte Datei
+hieraus entfernen.
+
+Es ist möglich, die FLAC-Komprimierung zu verwenden, indem Sie den Parameter
+--flac den Optionen hinzufügen. Jedoch wird die letztendliche Datei sogar größer
+sein als die Originaldatei.
+
+Bitte beachten Sie, dass compress_sword2 nur mit den vier
+Sprachausgabe-/Musikdateien aus Baphomets Fluch II funktioniert. Das Programm
+funktioniert mit keiner der anderen *.clu-Dateien noch mit den
+Sprachausgabe-Dateien aus Baphomets Fluch I.
+
+
+7.9) Ausgabefrequenzen:
+---- ------------------
+Die Ausgabefrequenz teilt ScummVM mit, wie viele Sound-Abtastungen je Kanal pro
+Sekunde abgespielt werden sollen. Es gibt viel, was über dieses Thema gesagt
+werden könnte, aber das Meiste wäre hier unerheblich. Die Kurzfassung ist, dass
+für die meisten Spiele 22050 Hz genügen, aber in einigen Fällen 44100 Hz
+vorzuziehen sind. Auf äußerst alten, langsamen Systemen möchten Sie womöglich
+11025 Hz verwenden, aber es ist unwahrscheinlich, dass Sie sich darum Sorgen
+machen müssen.
+
+Zur Erklärung: Die meisten Sounds, die ScummVM wiedergeben muss, wurden entweder
+mit der Frequenz 22050 Hz oder 11025 Hz abgetastet. Durch die Verwendung einer
+höheren Abtastfrequenz wird die Qualität der Sounds nicht magisch verbessert.
+Deswegen genügen 22050 Hz.
+
+Einige Spiele verwenden Audio von CD. Wenn Sie komprimierte Dateien hierfür
+verwenden, haben diese wahrscheinlich die Abtastfrequenz 44100 Hz, womit dies
+für solche Spiele die bessere Wahl für die Abtastfrequenz ist.
+
+Bei Verwendung von AdLib, FM Towns, des PC-Lautsprecher oder des
+PCjr-Musiktreibers ist ScummVM für die Erzeugung der Abtastungen zuständig.
+Normalerweise sind 22050 Hz hierfür eine Menge, aber in Beneath a Steel Sky gibt
+es mindestens ein AdLib-Musikstück, das mit 44100 Hz viel besser klingt.
+
+Die Verwendung von Frequenzen dazwischen wird nicht empfohlen. Einerseits könnte
+Ihre Soundkarte diese nicht unterstützen. In der Theorie sollte ScummVM in
+diesem Fall auf eine sinnvollere Frequenz zurückgreifen, aber verlassen Sie sich
+nicht darauf. Ein noch wichtigerer Grund ist, dass ScummVM alle Sounds zu ihrer
+Ausgabefrequenz umwandeln muss. Das funktioniert viel einfacher, wenn die
+Ausgabefrequenz ein Vielfaches der Originalfrequenz ist.
+
+
+8.0) Konfigurationsdatei:
+---- --------------------
+Standardmäßig wird die Konfigurationsdatei hier gespeichert und geladen:
+
+ Windows Vista:
+ \Users\Benutzername\AppData\Roaming\ScummVM\scummvm.ini
+
+ Windows 2000/XP:
+ \Dokumente und Einstellungen\Benutzername\Anwendungsdaten\
+ ScummVM\scummvm.ini
+
+ Windows NT4:
+ <Windows-Verzeichnis>\Profiles\Benutzername\
+ Application Data\ScummVM\scummvm.ini
+
+ Windows 95/98/ME:
+ <Windows-Verzeichnis>\scummvm.ini
+
+ Wenn eine ältere Version von ScummVM unter Windows installiert wurde, wird
+ der frühere Standard-Ort „<Windows-Verzeichnis>\scummvm.ini“ beibehalten.
+
+ Unix:
+ ~/.scummvmrc
+
+ Mac OS X:
+ ~/Library/Preferences/ScummVM Preferences
+ (Hierbei bezieht sich ~ auf das Benutzerverzeichnis.)
+
+ Sonstige:
+ scummvm.ini im aktuellen Verzeichnis
+
+Eine beispielhafte Konfigurationsdatei sieht wie folgt aus:
+
+ [scummvm]
+ gfx_mode=supereagle
+ fullscreen=true
+ savepath=C:\Spielstaende\
+
+ [sky]
+ path=C:\Spiele\SteelSky\
+
+ [sky-Deutsch]
+ gameid=sky
+ language=de
+ path=C:\Spiele\SteelSky\
+ description=Beneath a Steel Sky mit deutschen Untertiteln
+
+ [dott-Deutsch]
+ gameid=tentacle
+ path=C:\Deutsch\tentacle\
+ description=Deutsche Version von DOTT
+
+ [tentacle]
+ path=C:\tentacle\
+ subtitles=true
+ music_volume=40
+ sfx_volume=255
+
+ [loomcd]
+ cdrom=1
+ path=C:\loom\
+ talkspeed=5
+ savepath=C:\loom\Spielstaende\
+
+ [monkey2]
+ path=C:\amiga_mi2\
+ music_driver=windows
+
+Erklärung zu nachfolgender Liste: In der nachfolgenden Liste mit
+Schlüsselwörtern werden rechts das Schlüsselwort, in der Mitte der Typ der
+erwarteten Zuweisung und rechts die Erklärung angezeigt. Der Typ „Bool“ bedeutet
+Wahrheitswert. Er kann entweder „true“ (wahr) oder „false“ (falsch) sein.
+
+Die folgenden Schlüsselwörter werden erkannt:
+
+ path Text Verzeichnis mit Spieldaten
+ autosave_period Zahl Sekunden zwischen automatischem Speichern
+ (Standard: 300)
+ save_slot Zahl Nummer des Spielstands, der zu Spielbeginn
+ geladen werden soll
+ savepath Text Verzeichnis für Spielstände des Spiels
+ versioninfo Text Die Version von ScummVM, welche diese
+ Konfigurationsdatei erstellt hat
+
+ gameid Text Die echte Spielkennung. Hilfreich, wenn Sie
+ mehrere Versionen des gleichen Spiels haben und
+ verschiedene Einträge für diese wollen.
+ Siehe Beispiel.
+ description Text Die Spielbeschreibung wie sie in der Spieleliste
+ erscheinen wird
+
+ language Text Legt Sprache fest (de, en, us, fr, it, pt, es,
+ jp, zh, kr, se, gb, hb, cz, ru).
+ speech_mute Bool Falls „true“, wird Sprachausgabe unterdrückt.
+ subtitles Bool Belegung mit „true“ aktiviert Untertitel.
+ talkspeed Zahl Textverzögerung in SCUMM-Spielen oder Texttempo
+ in anderen Spielen
+
+ fullscreen Bool Vollbildmodus
+ aspect_ratio Bool Seitenverhältniskorrektur
+ disable_dithering Bool Entfernung von Fehlerdiffusionsartefakten in
+ EGA-Spielen
+ gfx_mode Text Grafikmodus (normal, 2x, 3x, 2xsai,
+ super2xsai, supereagle, advmame2x, advmame3x,
+ hq2x, hq3x, tv2x, dotmatrix)
+
+ confirm_exit Bool Fragt Anwender vor Beenden nach Bestätigung
+ (nur SDL-System).
+ console Bool Konsolenfenster (Standard: aktiv) (nur Windows)
+ cdrom Zahl Nummer von CD-ROM-Laufwerk für das Auslesen von
+ Audio. Falls negaitv, wird erst gar nicht
+ versucht, auf CD-ROM-Laufwerk zuzugreifen.
+ joystick_num Zahl Nummer von Joystick für Verwendung als
+ Eingabegerät
+ music_driver Text Zu verwendender Musiktreiber
+ opl_driver Text Verwendung von AdLib-(OPL-)Emulator
+ output_rate Zahl Zu verwendende Ausgabefrequenz in Hz. Sinnvolle
+ Werte sind 11025, 22050 und 44100.
+ alsa_port Text Zu verwendender Port für Ausgabe mittels
+ ALSA-Musiktreiber
+ music_volume Zahl Musiklautstärke-Einstellung (0-255)
+ multi_midi Bool Falls „true“, werden AdLib und natives MIDI
+ kombiniert.
+ soundfont Text Zu verwendende SoundFont-Datenbank für
+ MIDI-Wiedergabe (wird nur von einigen
+ MIDI-Treibern unterstützt)
+ native_mt32 Bool Falls „true“, wird GM-Emulation deaktiviert und
+ angenommen, dass ein echtes Roland-MT-32-Modul
+ verfügbar ist.
+ enable_gs Bool Falls „true“, werden GS-spezifische Funktionen
+ aktiviert, um GM-Emulation zu verbessern. Falls
+ native_mt32 auch „true“ ist, wird das GS-Gerät
+ eine MT-32-Zuweisung auswählen, um die korrekten
+ Instrumente wiederzugeben.
+ sfx_volume Zahl Effektlautstärke-Einstellung (0-255)
+ tempo Zahl Musiktempo (50-200) (Standard: 100)
+ speech_volume Zahl Sprachlautstärke-Einstellung (0-255)
+ midi_gain Zahl MIDI-Lautstärke (0-1000) (Standard: 100)
+ (wird nur von einigen MIDI-Treibern unterstützt)
+
+ copy_protection Bool Kopierschutz in bestimmten Spielen, für welche
+ ScummVM ihn standardmäßig ausschaltet
+ demo_mode Bool Startet Demo in Maniac Mansion.
+ alt_intro Bool Verwendet alternativen Vorspann bei CD-Versionen
+ von Beneath a Steel Sky und Flight of the Amazon
+ Queen.
+
+ boot_param Zahl Ruft Boot-Skript mit dieser Nummer auf.
+
+Baphomets Fluch II verfügt zusätzlich über folgende nicht standardmäßige
+Schlüsselwörter:
+
+ gfx_details Zahl Grafikqualitätseinstellung (0-3)
+ music_mute Bool Falls „true“, wird Musik unterdrückt.
+ object_labels Bool Falls „true“, werden Objektnamen angezeigt.
+ reverse_stereo Bool Falls „true“, werden Stereokanäle umgekehrt.
+ sfx_mute Bool Falls „true“, werden Geräusche unterdrückt.
+
+Flight of the Amazon Queen verfügt zusätzlich über folgende nicht standardmäßige
+Schlüsselwörter:
+
+ music_mute Bool Falls „true“, wird Musik unterdrückt.
+ sfx_mute Bool Falls „true“, werden Geräusche unterdrückt.
+
+Die Windows-Version von King's Quest VI verfügt zusätzlich über folgendes nicht
+standardmäßiges Schlüsselwort:
+
+ windows_cursors Bool Falls „true“, werden die originalen
+ unskalierten, schwarz-weißen Windows-Zeiger
+ anstatt der von DOS verwendet. Wenn „false“,
+ werden die DOS-Zeiger in der Windows-Version
+ verwendet - hochskaliert, um zum Rest der
+ hochskalierten Grafiken zu passen.
+
+Simon the Sorcerer 1 und 2 verfügen zusätzlich über folgende nicht
+standardmäßige Schlüsselwörter:
+
+ music_mute Bool Falls „true“, wird Musik unterdrückt.
+ sfx_mute Bool Falls „true“, werden Geräusche unterdrückt.
+
+The Legend of Kyrandia verfügt zusätzlich über folgendes nicht standardmäßiges
+Schlüsselwort:
+
+ walkspeed Zahl Bewegungsgeschwindigkeit (0-4)
+
+
+9.0) Kompilierung:
+---- -------------
+Für eine aktuelle Übersicht dazu, wie man ScummVM für unterschiedliche
+Plattformen kompiliert, schauen Sie bitte in unserem Wiki nach, insbesondere auf
+dieser Seite:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM
+
+Wenn Sie für Windows, Linux oder Mac OS X kompilieren, benötigen Sie SDL-1.2.2
+oder höher (ältere Versionen funktionieren möglicherweise, haben aber keinen
+Support) und einen unterstützten Kompilierer. Mehrere Kompilierer,
+einschließlich GCC, mingw und neue Versionen von Microsoft Visual C++ werden
+unterstützt. Wenn Sie mit MP3 komprimierte CD-Titel oder .SOU-Dateien verwenden
+möchten, müssen Sie die MAD-Bibliothek installieren; ebenso benötigen Sie die
+geeigneten Bibliotheken für Sound-Dateien, die mit Ogg Vorbis und FLAC
+komprimiert wurden. Für komprimierte Speicherstände ist zlib erforderlich.
+
+Von einigen Teilen in ScummVM, insbesondere Grafikwandlern, gibt es stark
+optimierte Versionen, die in Assembler geschrieben sind. Wenn Sie diese
+verwenden möchten, müssen Sie den Assembler nasm installieren
+(siehe http://nasm.sf.net). Beachten Sie, dass wir momentan nur für x86 MMX
+optimierte Versionen haben und diese auf keinem anderen Prozessor kompiliert
+werden.
+
+Bei Win9x/NT/XP können Sie USE_WINDBG definieren und WinDbg anhängen, um
+Debug-Nachrichten zu durchsuchen
+(siehe http://www.sysinternals.com/ntw2k/freeware/debugview.shtml).
+
+ GCC und MinGW32:
+ * Geben Sie „./configure“ ein.
+ * Geben Sie „make“ ein (oder „gmake“ bzw. „gnumake“, abhängig davon, auf
+ welchem GNU der Befehl „make“ auf Ihrem System aufgerufen wird) und mit
+ etwas Glück wird ScummVM für Sie kompiliert.
+ * Weitere Information finden Sie hier:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/GCC
+ entsprechend
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW
+
+ Microsoft Visual C++ 8/9/10:
+ * Lesen Sie nach, wie man die Projektmappendatei in „dists\msvc8“ bzw.
+ entsprechend in „dists\msvc9“ oder „dists\msvc10“ erstellt.
+ * Öffnen Sie die erstellte Projektmappendatei.
+ * Geben Sie die Pfade zu den benötigten Bibliotheksdateien
+ und Includedateien unter
+ „Extras|Optionen|Projekte und Projektmappen|VC++-Verzeichnisse“ ein.
+ * Jetzt sollte das Programm erfolgreich kompiliert werden können.
+ * Weitere Information finden Sie hier:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/VS2005
+
+ Windows Mobile:
+ * Bitte lesen Sie:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/Windows_CE
+
+ Debian GNU/Linux:
+ * Installieren Sie die Pakete „build-essential“, „fakeroot“, „debhelper“,
+ und „libsdl1.2-dev“ auf Ihrem Betriebssystem.
+ * Installieren Sie beliebig viele der folgenden Pakete (optional):
+ „libvorbis-dev“ (für Ogg-Vorbis-Unterstützung), „libasound2-dev“ (für
+ ALSA-Sequenzer-Unterstützung), „libmad0-dev“ (für MAD-MP3-Unterstützung),
+ „zlib1g-dev“ (für Unterstützung von komprimierten Spielständen)
+ * Rufen Sie „make deb“ auf.
+ * Rufen Sie zum Schluss „dpkg -i ../scummvm-cvs*deb“ auf und
+ Sie sind fertig.
+
+ Mac OS X:
+ * Stellen Sie sicher, dass Sie die „Developer“-Tools installiert haben.
+ * Das „Developer“-Paket von SDL für OS X, das auf der SDL-Website
+ zur Verfügung steht, ist _nicht_ geeignet. Sie benötigen stattdessen eine
+ SDL-Zusammenstellung im UNIX-Stil. Eine Möglichkeit, diese zu erhalten,
+ ist, SDL über Fink zu installieren (http://fink.sf.net). Alternativ können
+ Sie SDL mittels Quellcode manuell kompilieren, indem Sie dessen
+ UNIX-Zusammenstellungssystem verwenden (configure && make).
+ * Geben Sie „./configure“ im ScummVM-Verzeichnis ein.
+ * Sie können nun „make“ eingeben, um eine von der Kommandozeile aus
+ aufrufbare Binärdatei zu erstellen.
+ * Um eine Version zu erhalten, die Sie vom Finder aus aufrufen können, geben
+ Sie „make bundle“ ein, wodurch ScummVM.app erstellt wird (das funktioniert
+ nur dann auf Anhieb, wenn Sie SDL in das Verzeichnis /sw installiert haben
+ [wie es bei der Verwendung von Fink getan wird].
+ Wenn Sie SDL auf andere Weise installiert haben, müssen Sie
+ die Datei ports.mk von ScummVM bearbeiten.
+ * Weitere Information finden Sie hier:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/MacOS_X_Crosscompiling
+
+ AmigaOS 4 (Cross-Kompilation mit Cygwin):
+ * Stellen Sie sicher, dass Sie SDL installiert haben. Sie benötigen
+ womöglich auch libogg, libvorbis, libvorbisfile, zlib und libmad.
+ * Geben Sie „./configure --host=ppc-amigaos“ ein.
+ * Wenn Sie einen Fehler wegen sdl-config erhalten, verwenden Sie den
+ Parameter „--with-sdl-prefix“, um den Pfad zu bestimmen.
+ * Überprüfen Sie die Datei „config.mk“ und wenn alles in Ordnung
+ zu sein scheint:
+ * Rufen Sie „make“ auf.
+ * Cross-Kompilation mit Linux ist womöglich genauso einfach.
+
+ iPhone:
+ * Bitte lesen Sie:
+ http://wiki.scummvm.org/index.php/Compiling_ScummVM/iPhone
+
+ Maemo:
+ * Installieren Sie Maemo SDK mit rootstrap 4.1.2.
+ * Installieren Sie libmad, Tremor und FLAC mittels Quellcode.
+ * Rufen Sie „ln -s backends/platform/maemo/debian“ auf.
+ * Aktualisieren Sie debian/changelog.
+ * Rufen Sie „sb2 dpkg-buildpackage -b“ auf.
+
+------------------------------------------------------------------------
+Viel Glück und viel Spaß beim Spielen wünscht
+das ScummVM-Team.
+http://www.scummvm.org/
+------------------------------------------------------------------------
+
+
+(Deutscher Text basiert auf README mit SHA1-ID:
+264240eb5da43b8b1fbe309bbafb00aff7e1b51b)
diff --git a/doc/de/Neues b/doc/de/Neues
new file mode 100644
index 0000000000..efd79b87e0
--- /dev/null
+++ b/doc/de/Neues
@@ -0,0 +1,1610 @@
+Umfangreichere Änderungsaufzeichnungen des neusten experimentellen Codes finden
+Sie auf Englisch unter:
+ https://github.com/scummvm/scummvm/commits/
+
+1.4.0 (??.??.????)
+ Neue Spiele:
+ - Unterstützung für Lands of Lore: The Throne of Chaos hinzugefügt.
+ - Unterstützung für Blue's Birthday Adventure hinzugefügt.
+ - Unterstützung für Ringworld: Revenge Of The Patriarch hinzugefügt.
+ - Unterstützung für die Amiga-Version von Conquests of the Longbow
+ hinzugefügt.
+
+ Neue Portierungen:
+ - Portierung für PlayStation 3 hinzugefügt.
+
+ AGI:
+ - Sound-Unterstützung für die DOS-Version von Winnie the Pooh in the
+ Hundred Acre Wood integriert.
+
+ AGOS:
+ - Unterstützung integriert für direktes Laden von Dateien aus
+ InstallShield-Archiven für Floyd - Es gibt noch Helden und
+ Simon the Sorcerer's Game Pack.
+ - Laden und Speichern in der PC-Version von Waxworks repariert.
+ - Musik in den PC-Versionen von Elvira 1 und 2 sowie Waxworks korrigiert.
+
+ Groovie:
+ - Unterstützung für die iOS-Version von The 7th Guest hinzugefügt.
+
+ Lure:
+ - Absturz beseitigt, wenn man versucht, gleichzeitig zu sprechen und etwas zu
+ fragen.
+
+ SCI:
+ - Bessere Handhabung der Auswahl zwischen digitalen und synthetisierten
+ Sound-Effekten hinzugefügt. Wenn das Kontrollkästchen „AdLib-/MIDI-Modus“
+ markiert ist, wird die Engine digitale Sound-Effekte bevorzugen, ansonsten
+ werden stattdessen deren synthetisierten Gegenstücke bevorzugt, wenn beide
+ Versionen des gleichen Effekts existieren.
+
+ SCUMM:
+ - PC-Lautsprecher-Unterstützung für V5-Spiele integriert.
+ - Prioritätsfehler in iMuse beseitigt. Dadurch sollte AdLib-Musik besser
+ klingen, da wichtige Noten nicht mehr unterbrochen werden.
+ - CMS-Unterstützung integriert für Loom, The Secret of Monkey Island und
+ Indiana Jones and the Last Crusade.
+ - Palettenhandhabung in der Amiga-Version von Indiana Jones and the
+ Fate of Atlantis verbessert.
+
+
+ SDL-Portierungen:
+ - Unterstützung für OpenGL hinzugefügt. (GSoC-Aufgabe)
+
+ Tinsel:
+ - Löschen von Spielständen aus der Liste der Speicherstände korrigiert (im
+ Startmenü und im ScummVM-Menü innerhalb des Spiels).
+ - Die US-Version von Discworld II zeigt nun den korrekten Titelbildschirm und
+ die richtige Sprachenflagge.
+
+1.3.1 (12.07.2011)
+ Allgemein:
+ - Audiogeräte-Erkennung und Zurückgreifen auf Alternativen verbessert.
+ Es sollten keine stillen Fehler mehr aufgrund ungültiger Audiogeräte
+ auftreten. Stattdessen sollte ScummVM eine geeignete Alternative auswählen.
+
+ Mohawk:
+ - Erkennungseinträge für weitere Varianten einiger Spiele aus der Reihe
+ Living Books hinzugefügt.
+
+ Tinsel:
+ - Rückschrittsfehler beseitigt, der Discworld undurchspielbar machte.
+
+ SAGA:
+ - Rückschrittsfehler im Fortbewegungscode des Drachen in Erben der Erde
+ beseitigt, der dort zu Abstürzen führte.
+ - Rückschrittsfehler beseitigt, der zu unterschiedlichen Abstürzen in
+ I Have No Mouth, and I Must Scream führte.
+
+ SCI:
+ - Erkennungseinträge für einige Macintosh-Versionen von Spielen hinzugefügt.
+ - Audio-Einstellungen werden nun für die CD-Version von EcoQuest 1 korrekt
+ gespeichert.
+
+ SCUMM:
+ - Grafikfehler in FM-TOWNS-Versionen von Spielen auf ARM-Geräten beseitigt
+ (Android, iPhone, usw.).
+
+1.3.0 (28.05.2011)
+ Neue Spiele:
+ - Unterstützung für Backyard Baseball hinzugefügt.
+ - Unterstützung für Backyard Baseball 2001 hinzugefügt.
+ - Unterstützung für Urban Runner hinzugefügt.
+ - Unterstützung für Playtoons: Bambou le Sauveur de la Jungle hinzugefügt.
+ - Unterstützung für Toonstruck hinzugefügt.
+ - Unterstützung für V1- und V2-Spiele aus der Reihe Living Books hinzugefügt.
+ - Unterstützung für Hugo's House of Horrors, Hugo 2: Whodunit?
+ und Hugo 3: Jungle of Doom hinzugefügt.
+ - Unterstützung für Amiga-SCI-Spiele hinzugefügt (außer Conquests of the
+ Longbow).
+ - Unterstützung für Macintosh-SCI1-Spiele hinzugefügt.
+
+ Neue Portierungen:
+ - Portierung für WebOS hinzugefügt.
+
+ Allgemein:
+ - Unterstützung für ladbare Module auf Plattformen ohne dynamischen Lader
+ hinzugefügt. (GSoC-Aufgabe)
+ - Dänische Übersetzung hinzugefügt.
+ - Norwegische Bokmål-Übersetzung hinzugefügt.
+ - Norwegische Nynorsk-Übersetzung hinzugefügt.
+ - Schwedische Übersetzung hinzugefügt.
+ - Debug-Konsole zu Cine-, Draci-, Gob-, MADE-, Sword1-, Touche- und
+ Tucker-Engine hinzugefügt.
+ - Bedeutende Speicherlecks geschlossen. Rückkehr zur Spieleliste sollte nun
+ brauchbarer sein.
+
+ AGOS:
+ - Speicherlecks in Simon 2 und Floyd geschlossen.
+
+ Cine:
+ - Speicherlecks und ungültige Speicherzugriffe beseitigt.
+ - Future Wars sollte stabiler laufen.
+ - Operation Stealth ist nun komplett durchspielbar, auch wenn noch erhebliche
+ grafische Störungen vorhanden sind, weshalb das Spiel nicht offiziell
+ unterstützt wird.
+
+ Drascula:
+ - Deutsche und französische Untertitel zur Zwischensequenz mit Von Braun
+ hinzugefügt (3069981: Keine Untertitel in Szene mit “Von Braun“).
+ - Französische Übersetzung des Spiels verbessert.
+ - Unterstützung für Rückkehr zur Spieleliste hinzugefügt.
+
+ Gob:
+ - Einige Fehler beseitigt, bei denen ein Goblin bei erneutem Laden in
+ Gobliiins feststeckte.
+
+ Kyra:
+ - Speicherlecks geschlossen.
+
+ Parallaction:
+ - Problem behoben, das zu Abstürzen bei Verlassen der Engine führen konnte.
+ - Speicherlecks in Amiga-Version von Nippon Safes geschlossen.
+
+ SCI:
+ - Einen CMS-Musiktreiber für Spiele von SCI1 bis SCI1.1 hinzugefügt.
+ - Option zum Ein- und Ausschalten der Antifehlerdiffusion in
+ ScummVM-Oberfläche hinzugefügt.
+ - Mehrere vorher fehlende Teile des Spielzustands zu Speicherständen
+ hinzugefügt, wie beispielsweise die gespielte Zeit, skripterzeugte Fenster,
+ der Skript-Zeichenketten-Freispeicher und Informationen im Zusammenhang mit
+ dem Textparser in alten EGA-Spielen.
+ - Unterstützung für die Vergrößerungsmauszeiger in SCI1.1 hinzugefügt.
+ - Unterstützung für die Tasten + und - auf dem Ziffernblock hinzugefügt.
+ - Unterstützung für alternative General-MIDI-Titel in den
+ Windows-CD-Versionen von Eco Quest, Jones in the Fast Lane, King's Quest 5
+ und Space Quest 4 hinzugefügt.
+ - Unterstützung für alternative Windows-Mauszeiger in der Windows-Version von
+ King's Quest 6 hinzugefügt.
+ - Unterstützung für gleichzeitige Sprachausgabe und Untertitel in den
+ CD-Versionen von Space Quest 4 und Freddy Pharkas hinzugefügt.
+ - Lecks beim Laden von Ressourcen beseitigt.
+ - Einige Probleme in den Räumen von Skate-O-Rama in Space Quest 4 behoben.
+ - Einige Probleme in Hoyle Classic Card Games behoben.
+ - Einige Grafikstörungen beseitigt (wie z. B. dass einige Teile des
+ Bildschirms in manch seltenen Fällen nicht ordnungsgemäß gelöscht wurden).
+ - Mehrere Skriptfehler beseitigt.
+ - Mehrere Probleme im Zusammenhang mit dem Finden des Wegs und Aufhängen des
+ Spiels behoben (z. B. hing sich das Spiel in der Duschszene von
+ Laura Bow 1 auf und es gab Schwierigkeiten beim Finden des Wegs in einigen
+ Bildschirmen während der Verfolgungssequenz in Laura Bow 2).
+ - Mehrere Probleme im Zusammenhang mit Musik und möglichem Aufhängen
+ behoben (z. B. hatte sich in seltenen Fällen die Musik aufgehängt,
+ wenn man einen Spielstand außerhalb des Palastes in Quest for Glory 3
+ geladen hatte).
+ - Mögliche Probleme und mögliches Aufhängen bei Bildschirmen zur Importierung
+ von Figuren für Quest for Glory 2 und 3 behoben.
+ - Fehler beseitigt, der in der SCI1-CD-Version von Mixed Up Mother Goose das
+ Spiel dazu brachte, sich nach Tommy Tuckers Lied aufzuhängen.
+ - Skriptfehler in der CD-Version von King's Quest 5 beseitigt, der das Spiel
+ unter gewissen Umständen zum Aufhängen brachte, wenn man im dunklen Wald
+ aus dem Haus der Hexe ging.
+ - Funktionstasten funktionieren nun richtig, wenn der Ziffernblock
+ aktiviert ist.
+ - Unterstützung für Skripte in Fan-Spielen verbessert.
+ - Unterstützung für nicht-englische Versionen von Spielen verbessert.
+ - Viele Verbesserungen und Fehlerbeseitigungen im Zusammenhang mit
+ MT-32-Musik eingebracht (z. B. Hall).
+ - Musik ist nicht mehr verstimmt, wenn man einen Spielstand lädt.
+
+ SCUMM:
+ - Unterstützung für FM-TOWNS-Versionen von Spielen verbessert.
+
+ Sky:
+ - Abstürze während Zwischensequenzen bei mehreren Portierungen beseitigt
+ (Android, OpenGL, ...).
+
+ Teenagent:
+ - Speicherlecks geschlossen.
+
+ Tinsel:
+ - Speicherlecks in Nebenroutinen geschlossen.
+ - Unterstützung für verbesserte Musik für die deutsche
+ CD-Wiederveröffentlichung namens „Neon Edition“ von Discworld 1
+ hinzugefügt.
+
+ Touche:
+ - Speicherlecks beseitigt und kleinere Probleme behoben.
+
+ Tucker:
+ - Umgehungen für mehrere im Originalspiel vorhandene Probleme hinzugefügt.
+
+ SDL-Portierungen:
+ - Speicherlecks bei Mausoberflächen geschlossen.
+
+ Android-Portierung:
+ - Wechsel zu offizieller NDK-Tool-Kette für Zusammenstellung
+ - Grafikausgabe für verschiedene Geräte korrigiert.
+ - Mehrere Abstürze beseitigt.
+ - Wechsel zu nativer Bildschirmauflösung, um Textlesbarkeit zu verbessern
+ - Unterstützung für Pausieren/Fortsetzen hinzugefügt.
+ - Unterstützung für Spiele, die 16-Bit-Grafik verwenden, hinzugefügt.
+ - Leistung erheblich verbessert.
+ - Unterstützung für „Vollbildmodus“-Option hinzugefügt. Entfernt man dort das
+ Häkchen, bleibt das Seitenverhältnis beibehalten.
+ - Neuen Grafikmodus für lineare Filterung hinzugefügt.
+ - Eingabesystem wurde überholt (siehe README.Android).
+ - MIDI-Treiber basierend auf SONiVOX' Embedded Audio Synthesis (EAS)
+ hinzugefügt.
+
+ Nintendo-DS-Portierung:
+ - Unterstützung für ladbare Module hinzugefügt.
+
+ PSP-Portierung:
+ - Unterstützung für ladbare Module hinzugefügt.
+ - Bildbetrachter hinzugefügt.
+
+ PS2-Portierung:
+ - Unterstützung für ladbare Module hinzugefügt.
+
+ Portierung für Wii/GameCube:
+ - Unterstützung für ladbare Module hinzugefügt.
+ - 16-Bit-Mauszeiger in HE-Spielen korrigiert.
+
+1.2.1 (19.12.2010)
+ Allgemein:
+ - Ungarische Übersetzung hinzugefügt.
+ - Brasilianisch-portugiesische Übersetzung hinzugefügt.
+
+ Cruise:
+ - Problem behoben, dass Raoul beim Untersuchen des Buchs erschien.
+
+ Groovie:
+ - Rückschrittsfehler beseitigt, der die russische Version von T7G abstürzen
+ ließ.
+
+ Lure:
+ - Mehrere Bewegungsfehler bei Nicht-Spielern beseitigt.
+
+1.2.0 (15.10.2010)
+ Neue Spiele:
+ - Unterstützung für Fascination hinzugefügt.
+
+ Neue Spiele (Sierra SCI0 - SCI1.1):
+ - Unterstützung für Codename: ICEMAN hinzugefügt.
+ - Unterstützung für Conquests of Camelot hinzugefügt.
+ - Unterstützung für Conquests of the Longbow (EGA und VGA) hinzugefügt.
+ - Unterstützung für Das Schloß von Dr. Brain (EGA und VGA) hinzugefügt.
+ - Unterstützung für EcoQuest: Die Suche nach Cetus hinzugefügt.
+ - Unterstützung für EcoQuest 2: Lost Secret of the Rainforest hinzugefügt.
+ - Unterstützung für Freddy Pharkas: Cowboy-Apotheker hinzugefügt.
+ - Unterstützung für Hoyle's Book of Games 1 hinzugefügt.
+ - Unterstützung für Hoyle's Book of Games 2 hinzugefügt.
+ - Unterstützung für Hoyle's Book of Games 3 (EGA und VGA) hinzugefügt.
+ - Unterstützung für Hoyle Classic Card Games hinzugefügt.
+ - Unterstützung für Jones in the Fast Lane hinzugefügt.
+ - Unterstützung für King's Quest I (SCI-Remake) hinzugefügt.
+ - Unterstützung für King's Quest IV (SCI-Version) hinzugefügt.
+ - Unterstützung für King's Quest V (EGA und VGA) hinzugefügt.
+ - Unterstützung für King's Quest VI (hohe und niedrige Auflösung)
+ hinzugefügt.
+ - Unterstützung für Laura Bow: The Colonel's Bequest hinzugefügt.
+ - Unterstützung für Laura Bow 2: The Dagger of Amon Ra hinzugefügt.
+ - Unterstützung für Leisure Suit Larry 1 (SCI-Remake) (EGA und VGA)
+ hinzugefügt.
+ - Unterstützung für Leisure Suit Larry 2 hinzugefügt.
+ - Unterstützung für Leisure Suit Larry 3 hinzugefügt.
+ - Unterstützung für Leisure Suit Larry 5 (EGA und VGA) hinzugefügt.
+ - Unterstützung für Leisure Suit Larry 6 (niedrige Auflösung) hinzugefügt.
+ - Unterstützung für Mixed-up Fairy Tales hinzugefügt.
+ - Unterstützung für Mixed-up Mother Goose hinzugefügt.
+ - Unterstützung für Pepper's Adventures in Time hinzugefügt.
+ - Unterstützung für Police Quest I (SCI-Remake) hinzugefügt.
+ - Unterstützung für Police Quest II hinzugefügt.
+ - Unterstützung für Police Quest III (EGA und VGA) hinzugefügt.
+ - Unterstützung für Quest for Glory I/Hero's Quest hinzugefügt.
+ - Unterstützung für VGA-Remake von Quest for Glory I hinzugefügt.
+ - Unterstützung für Quest for Glory II hinzugefügt.
+ - Unterstützung für Quest for Glory III hinzugefügt.
+ - Unterstützung für Slater & Charlie Go Camping hinzugefügt.
+ - Unterstützung für Space Quest I (SCI-Remake) (EGA und VGA) hinzugefügt.
+ - Unterstützung für Space Quest III hinzugefügt.
+ - Unterstützung für Space Quest IV (EGA und VGA) hinzugefügt.
+ - Unterstützung für Space Quest V hinzugefügt.
+ - Unterstützung für The Island of Dr. Brain hinzugefügt.
+
+ Neue Portierungen:
+ - Portierung für Android hinzugefügt.
+ - Portierung für Dingux hinzugefügt.
+ - Portierung für Caanoo hinzugefügt (basierend auf Portierung von GP2XWiz).
+ - Portierung für OpenPandora hinzugefügt.
+
+ Allgemein:
+ - Veraltete PalmOS-Portierung entfernt.
+ - Wechsel zum „schnellen“ DOSBox-OPL-Emulator
+ - Absturz in Rjp1-Abspiel-Code beseitigt, der die Amiga-Version von FOTAQ
+ betraf.
+ - Unterstützung bei weiteren Spielen für Dateienanordnung des originalen
+ Datenträgermediums hinzugefügt.
+ - Unterstützung für Benutzeroberflächen-Lokalisationen hinzugefügt (darunter
+ auch Deutsch).
+ - Benutzeroberfläche verbessert, indem Tipps und Optionsschaltflächen
+ hinzugefügt wurden.
+ - Benutzerfreundlichkeit der Oberfläche verbessert, indem weitere belanglose
+ Optionen bei bestimmten Spielen verborgen wurden, von denen sie nicht
+ unterstützt werden.
+
+ AGI:
+ - Gewisse Anzahl an Grafikstörungen beseitigt.
+ - PIC zeichnet nun kodiertes Bild perfekt.
+ - Unterstützung für MIDI-Geräte hinzugefügt.
+ - Unterstützung für präzise Tandy-Sound-Emulation hinzugefügt. Diese ist nun
+ standardmäßig festgelegt.
+
+ Baphomets Fluch 2:
+ - Problem behoben, durch das in manchen Zwischensequenzen Sprachausgabe
+ fehlte.
+ - Speicherleck beseitigt, das irgendwann das Spiel zum Aufhängen brachte
+ (2976008 - BS2: Spiel friert in britischem Museum ein).
+
+ Drascula:
+ - Gewisse Anzahl an Grafikstörungen beseitigt.
+ - Viele Zwischensequenzen feiner gemacht.
+ - Verhalten des Befehlmenüs verändert. Jetzt wird es angezeigt, wenn man
+ die Maus nach oben bewegt.
+
+ Groovie:
+ - Unterstützung für Macintosh-Version von The 7th Guest hinzugefügt.
+ - Unterstützung für spielspezifische MT-32-Instrumentänderungen hinzugefügt.
+
+ KYRA:
+ - Einige kleinere Grafikstörungen beseitigt.
+ - Vorher fehlende Neuplatzierung einiger Gegenstände im Spiel integriert.
+ - Unterstützung für das Spielen von Kyrandia 3 mit originaler Anordnung der
+ CD-Dateien hinzugefügt.
+
+ LURE:
+ - Fehler beseitigt, bei dem Goewin im Wehrtor stecken bleiben konnte.
+ - Problem mit Ratpouch beseitigt, bei dem er wiederholt zwischen zwei Räumen
+ hin- und herlief.
+ - Fehler beseitigt, dass Goewin nach der Drachenhöhle aus dem Zeitplan kam.
+ - Fehler beseitigt, bei dem der Spieler im Ausgangsraum des Abflusses
+ stecken bleiben konnte.
+
+ Parallaction:
+ - Erster Teil von The Big Red Adventure ist nun komplett durchspielbar.
+
+ SAGA:
+ - Grafikstörungen in mehreren Szenen beseitigt.
+
+ SCUMM:
+ - Mehrere Verbesserungen in Maniac Mansion NES
+
+ PSP-Portierung:
+ - Neue Systemgestaltung: Kleinere Grafikprobleme behoben und
+ 16-Bit-Unterstützung ermöglicht.
+ - Wiedergabe von MP3-Dateien mittels Media Engine ermöglicht. Das bedeutet,
+ dass die Portierung für MP3-Dateien (entgegengesetzt zu Ogg) optimiert ist.
+ - Viele Optimierungen vorgenommen. Alles sollte schneller laufen.
+
+ Wii-Portierung:
+ - Unterstützung für USB2-Massenspeichergeräte hinzugefügt (erfordert
+ The Homebrew Channel >= v1.0.8 mit IOS58).
+
+ GameCube-Portierung:
+ - Unterstützung für DVDs mit ISO9660-Dateisystem hinzugefügt.
+
+ GP2X-Portierung:
+ - Unterstützung für dynamische Engine-Plugins hinzugefügt (experimentell).
+ - Kontrollsystem überarbeitet und Touchscreen-Unterstützung verbessert.
+
+ GP2XWiz/Caanoo-Portierung:
+ - Code für Herunterskalierung verbessert, um „Verschiebungsfehler“ im Bild
+ (Tearing) zu minimieren.
+ - Kontrollsystem überarbeitet und Touchscreen-Unterstützung verbessert.
+ - System von GP2XWIZ in GPH umbenannt, um die Bandbreite der unterstützten
+ Geräte besser wiederzuspiegeln.
+
+1.1.1 (02.05.2010)
+ Neue Portierungen:
+ - Portierung für Nintendo 64 hinzugefügt. (Eigentlich schon in 1.1.0
+ hinzugefügt, aber es wurde vergessen, dies zu erwähnen.)
+
+ Allgemein:
+ - Hier und da einige kleinere Fehler beseitigt.
+
+ Drascula:
+ - Rückschrittsfehler beseitigt, der dazu führte, dass einige Texte immer in
+ Englisch waren, selbst wenn eine andere Sprache eingestellt war.
+ (2970211 - DRASCULA: Fehlende deutsche Ãœbersetzung)
+
+ KYRA:
+ - Fehler beseitigt, der DOS-Versionen vor dem Anzeigen der Mitwirkendenliste
+ abstürzen ließ, wenn AdLib-Musik ausgewählt war.
+
+ LURE:
+ - Mehrere Speicherlecks beseitigt.
+ - Probleme bei Handhabung von mitlaufenden Figuren beseitigt, wenn sie
+ an der Ausführung von Aktionen durch geschlossene Türen zwischen Räumen
+ gehindert werden.
+ - Problem von Goewin behoben, dass sie dem Spieler nicht immer genau aus den
+ Höhlen gefolgt ist.
+
+ Tinsel:
+ - Rückschrittsfehler bei Video-Wiedergabe in Discworld 2 beseitigt.
+
+ Parallaction:
+ - Mehrere Abstürze und weitere Rückschrittsfehler in Nippon Safes beseitigt,
+ einschließlich der Fehler 2969211, 2969232, 2969234, 2969257, 2970141.
+
+ Portierung für Wii/GameCube (Erwähnung bei 1.1.0 ebenfalls vergessen):
+ - Unterstützung für Spiele, die 16-Bit-Grafik verwenden, hinzugefügt.
+ - Vollständige Grafiküberholung (neue Bildschirm-Modi, bessere Leistung,
+ Bildglättung, Einstellungen für feinkörnige Übertastung)
+ - Neuen Optionsdialog für spezifische Einstellungen für Wii/Gamecube
+ hinzugefügt.
+ - Grafikstörung bei kleinen Vorschaubildern von Spielständen beseitigt.
+ - Unterstützung für SMB-Einhängepunkte hinzugefügt (öffentliche Verzeichnisse
+ von Samba/Windows).
+ - Bildschirm-Konsole hinzugefügt, welche angezeigt wird, wenn ScummVM
+ ungewöhnlich beendet wurde.
+ - Einige Abstürze beseitigt, wenn mit Ogg Vorbis komprimierte Sound-Dateien
+ verwendet werden. Lesen Sie die beiliegende Datei READMII.txt für weitere
+ Informationen.
+
+ PSP-Portierung (Erwähnung bei 1.1.0 ebenfalls vergessen):
+ - Plugin-Unterstützung hinzugefügt, was es auf der PSP Phat ermöglicht, jedes
+ Spiel laufen zu lassen.
+ - Neue virtuelle Tastatur hinzugefügt, die für schnelle D-Pad-Eingabe
+ optimiert ist.
+
+1.1.0 (04.04.2010)
+ Neue Spiele:
+ - Unterstützung für Blue's Art Time Activities hinzugefügt.
+ - Unterstützung für Blue's Reading Time Activities hinzugefügt.
+ - Unterstützung für Freddi Fisch und das Rätsel der Korallenbucht
+ hinzugefügt.
+ - Unterstützung für Pajama Sam: Games to Play on Any Day hinzugefügt.
+ - Unterstützung für SPY Fox: Alarm im Weltall hinzugefügt.
+ - Unterstützung für DraÄi Historie hinzugefügt.
+ - Unterstützung für TeenAgent hinzugefügt.
+
+ Allgemein:
+ - Unterstützung für eine benutzerdefinierte SJIS-Schriftart für FM-TOWNS- und
+ PC98-Spiele hinzugefügt.
+ - Unterstützung für 16-Bit-Grafik hinzugefügt. (GSoC-Aufgabe)
+ - MIDI-System von QuickTime bei Mac OS X entfernt; es war fehlerhaft und ließ
+ sich auf modernen Systemen nicht kompilieren.
+
+ CinE:
+ - Unterstützung für Menüs im Amiga-Stil für Amiga-Versionen von Future Wars
+ hinzugefügt.
+
+ KYRA:
+ - Unterstützung für die Amiga-Version von The Legend of Kyrandia hinzugefügt.
+ (Sound-Unterstützung kam im Rahmen einer GSoC-Aufgabe dazu.)
+ - KYRA angepasst, um die benutzerdefinierte SJIS-Schriftart zu unterstützen.
+
+ SCUMM:
+ - Unterstützung für die PC-Engine-Version von Loom hinzugefügt.
+ - Unterstützung für Musik und Klang-Effekte in der Amiga-Version von
+ The Secret of Monkey Island hinzugefügt. (GSoC-Aufgabe)
+ - Einige weitere Fehler im Zusammenhang mit Amiga-Versionen von Spielen
+ beseitigt.
+ - Unterstützung für originalen Dialog zum Speichern und Laden in MM NES
+ hinzugefügt.
+ - Unterstützung hinzugefügt für Speicherpunkt-Codes für Sega CD MI1 über den
+ Debugger-Befehl „passcode“.
+ - Unterstützung für Kanji-Renderung in japanischer Version von
+ Monkey Island Sega CD hinzugefügt.
+
+1.0.0 (15.11.2009)
+ Neue Portierungen:
+ - Portierung für MotoEZX und MotoMAGX hinzugefügt.
+
+ Allgemein:
+ - Einige Fehler in grafischer Benutzeroberfläche beseitigt.
+ - Projektlogo und -symbole aktualisiert.
+ - Lizenz für mehrere PS2-Portierungsdateien verdeutlicht.
+
+ AGI:
+ - Absturz bei Spielbeendigung beseitigt.
+ - Absturz bei Erkennung einiger Spiele beseitigt.
+
+ AGOS:
+ - Code für das Speichern und Laden für PC-Version von Waxworks korrigiert.
+ - Undo-Funktion für Rückgängigmachen des letzten Spielzugs bei Spielen aus
+ Game Pack korrigiert.
+
+ Baphomets Fluch 1:
+ - Problem behoben, durch das in manchen Räumen Hintergrundgeräusche fehlten.
+
+ CinE:
+ - Abstürze in den Demos von Future Wars und Operation Stealth beseitigt.
+
+ Cruise:
+ - Aufhängen bei Spielpause beseitigt.
+
+ Gob:
+ - Grafikstörung bei Lost in Time beseitigt.
+ - Rückschrittsfehler im Zusammenhang mit Klickbereichen in Gob2 beseitigt.
+ - Mehrere Rückschrittsfehler in Gob3 beseitigt.
+ - Absturz im Vorspann von Bargon Attack beseitigt.
+ - Animationsabläufe in Win3.1-Version von Gob3 korrigiert.
+
+ Groovie:
+ - Video-Leistung bei PSP korrigiert.
+ - Fehler mit leerem Menü in einigen Instanzen beseitigt.
+
+ Kyra:
+ - Mögliche Zerstörung des Neustart-Spielstands in Kyrandia 1 beseitigt.
+ - Grafikstörung bei kaputter Brücke beseitigt.
+ - Beseitigung eines Fehlers, durch den Brandon in einigen Situationen in
+ Kyrandia 1 unsichtbar wurde
+
+ MADE:
+ - Leistung bei NDS korrigiert.
+ - Absturz in Demo von Return to Zork beseitigt.
+
+ Parallaction:
+ - Mehrere Rückschrittsfehler in Nippon Safes beseitigt.
+ - Musik in Sushi-Bar in Nippon Safes korrigiert.
+
+ SCUMM:
+ - Absturz in Macintosh-Versionen von Putt-Putt Joins the Parade und Fatty
+ Bear's Birthday Surprise beseitigt.
+ - Speichern des Spielstands in Macintosh-Versionen von HE-Spielen korrigiert.
+ - Standardmäßigen Spielstandpfad für spätere HE-Spiele korrigiert.
+ - Palette in NES-Version von Maniac Mansion korrigiert.
+ - Palette in Amiga-Version von The Secret of Monkey Island korrigiert.
+ - Fehler beseitigt, bei dem in The Dig die Musik nicht aufhörte, wenn man
+ während Zwischensequenzen Esc drückte.
+ - Lippensynchronisation in Fatty Bear korrigiert.
+ - Absturz in Vollgas beseitigt, wenn man ins Inventar geht.
+
+ Tinsel:
+ - Absturz in Palast beseitigt.
+ - Absturz beseitigt, wenn man mit älterer Dame spricht.
+ - Teilweise Fehler beseitigt, bei dem Text in DW1 außerhalb des Bildschirms
+ angezeigt wurde.
+
+ NDS-Portierung:
+ - Mauspad unterhalb von Bildschirmtastatur hinzugefügt.
+ - Möglichkeit zum Scrollen hinzugefügt, wenn Mauszeiger eine Kante des
+ Bildschirms erreicht (im Mauspad-Modus).
+ - Audio-Dateien beginnend von track01.wav werden nun genauso gelesen wie
+ track1.wav.
+ - Fehler beseitigt, wenn Modus bei aktiver Tastatur gewechselt wird.
+
+ PSP-Portierung:
+ - Video-Flimmern und -Streckung in einigen Situationen beseitigt.
+ - Unterstützung für Unterbrechen/Fortsetzen verbessert.
+
+ WinCE-Portierung:
+ - Kompatibilität mit VGA-Geräten verbessert.
+
+1.0.0rc1 (31.08.2009)
+ Neue Spiele:
+ - Unterstützung für Discworld hinzugefügt.
+ - Unterstützung für Discworld 2 - Vermutlich vermisst hinzugefügt.
+ - Unterstützung für Return to Zork hinzugefügt.
+ - Unterstützung für Leather Goddesses of Phobos 2 hinzugefügt.
+ - Unterstützung für The Manhole hinzugefügt.
+ - Unterstützung für Rodney's Funscreen hinzugefügt.
+ - Unterstützung für Cruise for a Corpse hinzugefügt.
+
+ Allgemein:
+ - Experimentellen AdLib-Emulator aus DOSBox hinzugefügt.
+ - Schnelle Eintragssuche zu Startmenü hinzugefügt.
+ - Aussehen von moderner Themenoberfläche verbessert.
+ - Verschiedene Oberflächenoptionen für jedes Spiel einstellbar
+ - „Durchsuchen“-Dialog verbessert.
+
+ Neue Portierungen:
+ - Portierung für GP2X Wiz hinzugefügt.
+
+ AGI:
+ - Kompatibilität für Sierra-Spiele erhöht.
+ - Alle „unbekannten“ Befehle integriert.
+
+ Beneath a Steel Sky:
+ - Spielgeschwindigkeit geändert, um der des Originalspiels zu entsprechen
+ (lief vorher zu schnell).
+
+ Baphomets Fluch 1:
+ - Unterstützung für Original-Zwischensequenzen hinzugefügt.
+ - Unterstützung für die nun hinfälligen MPEG2-Zwischensequenzen eingestellt.
+ - Unterstützung für die PlayStation-Version hinzugefügt.
+
+ Baphomets Fluch 2:
+ - Unterstützung für Original-Zwischensequenzen hinzugefügt.
+ - Unterstützung für die nun hinfälligen MPEG2-Zwischensequenzen eingestellt.
+ - Unterstützung für das Abspielen von Ton aus Zwischensequenzen ohne Video
+ eingestellt.
+ - Unterstützung für die PlayStation-Version hinzugefügt.
+
+ Gob:
+ - Neues Spielstandsformat eingeführt, um eine schwerwiegende Schwachstelle
+ des alten Formats zu beseitigen, wodurch die Kompatibilität mit alten
+ Spielständen, die auf Big-Endian-Systemen erstellt wurden, aufhört.
+
+ Groovie:
+ - Schwierigkeitsgrad von Mikroskop-Puzzle erhöht, um dem des Originalspiels
+ zu entsprechen.
+
+ KYRA:
+ - Unterstützung für auf PC-Lautsprecher basierende Musik und Klang-Effekte
+ hinzugefügt.
+ - Unterstützung für 16-Farben-Fehlerdiffusion in Kyrandia PC-9801
+ hinzugefügt.
+
+ PSP-Portierung:
+ - Unterstützung für Ruhe-Modus (unterbrechen/fortsetzen) hinzugefügt.
+
+ WinCE-Portierung:
+ - Geschwindigkeitsoptimierte Versionen von niedrig auflösendem Smartphone und
+ niedrig auflösenden 2x-Grafikwandlern
+ - Neuer Grafikwandler für Seitenverhältniskorrektur für VGA-Geräte (oder
+ Geräte mit höherer Farbentiefe)
+ - Unterstützung für MPEG-2 und FLAC eingestellt.
+
+0.13.1 (27.04.2009)
+ AGOS:
+ - Absturz nach Wiedergabe von OmniTV-Video in Floyd - Es gibt noch Helden
+ beseitigt.
+ - Absturz bei Erforschung der Jack-the-Ripper-Szene in der PC-Version von
+ Waxworks beseitigt.
+ - Palettenstörung in der AtariST-Version von Elvria 2 beseitigt.
+ - Geräusch beseitigt, dass vorkommen konnte, wenn man die Pyramiden-Szene in
+ Waxworks erforscht.
+
+ Gob:
+ - Absturz in der italienischen Version von Woodruff beseitigt.
+
+ Groovie:
+ - Einige Probleme mit der Musik in The 7th Guest behoben.
+
+ Parallaction:
+ - Fehler bei Sarkophag-Rätsel in Nippon Safes beseitigt.
+
+ SAGA:
+ - Absturz in Erben der Erde beseitigt.
+ - Störungen im Dialog für das Speichern und Laden beseitigt.
+
+ Sword2:
+ - Zufällige Sound-Missbildung beseitigt, wenn originale Sound-Dateien
+ verwendet werden.
+
+ Startmenü:
+ - Fall korrigiert, in dem Speicherinformationen unverwertbar werden
+ konnten.
+ - Kleinen Mauszeiger im modernen Thema korrigiert.
+ - Fehler in Themen-Engine beseitigt, welcher Abstürze verursachen konnte.
+ - Pfadauswahldialog in 1x-Modus vergrößert.
+
+ Portierung für iPhone:
+ - Handhabung der Rücktaste auf der iPhoneSoft-Tastatur korrigiert.
+
+ DS-Portierung:
+ - Unterstützung für die Funktion des globalen Hauptmenüs hinzugefügt.
+
+ PS2-Portierung:
+ - Zu neuer grafischer Benutzeroberfläche und neuem Themen-Code gewechselt.
+ - Bei allen möglichen Geräten wird nun das Ablegen, Spielen und Speichern von
+ Spielständen unterstützt (CD, Festplatte, USB, MC und Fernzugriffspunkt).
+ - Speicherverwaltung/Vorauslesen für jedes Medium verbessert.
+ - Unterstützung für den Wechsel „Zurück zur Spieleliste“ hinzugefügt.
+
+ Symbian-Portierung:
+ - Bluetooth-Mausunterstützung hinzugefügt.
+ - Unterstützung für den Wechsel „Zurück zur Spieleliste“ hinzugefügt.
+
+ WinCE-Portierung:
+ - Problem behoben, das bei VGA-Geräten zu zufälligen Abstürzen führen konnte.
+
+0.13.0 (28.02.2009)
+ Allgemein:
+ - MIDI-Treiber für Atari ST / FreeMint hinzugefügt.
+ - „Laden“-Schaltfläche zu Startmenü hinzugefügt (nicht von allen Engines
+ unterstützt). (GSoC-Aufgabe)
+ - Dialog für neues globales Hauptmenü hinzugefügt, das von allen Engines
+ verwendet werden kann. (GSoC-Aufgabe)
+ - Funktion hinzugefügt, um von laufenden Spielen aus zur Spieleliste
+ zurückzukehren (über globales Hauptmenü). (GSoC-Aufgabe)
+ - Oberflächen-Renderung umgeschrieben, um einen vektorbasierten Ansatz zu
+ verwenden. (GSoC-Aufgabe)
+ - Oberflächenkonfiguration umgeschrieben, um XML zu verwenden. (GSoC-Aufgabe)
+
+ Neue Spiele:
+ - Unterstützung für Blue's 123 Time Activities hinzugefügt.
+ - Unterstützung für Blue's ABC Time Activities hinzugefügt.
+ - Unterstützung für Bud Tucker in Double Trouble hinzugefügt.
+ - Unterstützung für The 7th Guest hinzugefügt.
+
+ AGOS:
+ - Unterstützung für Original-Zwischensequenzen von Floyd - Es gibt
+ noch Helden hinzugefügt.
+ - Unterstützung für Textkompression in der AtariST-Version von Elvira 1
+ hinzugefügt.
+ - Fehler beim Kombinieren von Gegenständen in Waxworks beseitigt.
+ - Fehler bei Anzeige von Zauberspruch-Beschreibungen in Elvira 2 beseitigt.
+
+ KYRA:
+ - Unterstützung für automatisches Speichern hinzugefügt.
+ - Unterstützung für MIDI-Musik hinzugefügt.
+
+ Parallaction:
+ - Mitwirkendenliste in der Amiga-Demo von Nippon Safes wird nun richtig
+ angezeigt.
+
+ SCUMM:
+ - Funkspruch-Effekt in The Dig integriert.
+
+0.12.0 (31.08.2008)
+ Neue Spiele:
+ - Unterstützung für The Legend of Kyrandia: Book Two: Hand of Fate
+ hinzugefügt.
+ - Unterstützung für The Legend of Kyrandia: Book Three: Malcolm's Revenge
+ hinzugefügt.
+ - Unterstützung für Lost in Time hinzugefügt.
+ - Unterstützung für Woodruff and the Schnibble of Azimuth hinzugefügt.
+ - Unterstützung für die PC-Version von Waxworks hinzugefügt.
+ - Unterstützung für die Macintosh-Version von I Have No Mouth, and I
+ Must Scream hinzugefügt.
+ - Unterstützung für Drascula: The Vampire Strikes Back hinzugefügt.
+
+ Allgemein:
+ - CAMD-MIDI-Treiber für AmigaOS4 hinzugefügt.
+ - PS2-Portierung wiederbelebt (war sie schon in 0.11.1, aber es wurde
+ in den Veröffentlichungshinweisen vergessen).
+ - Zahlreiche Speicherlecks in allen Engines gestopft (Teil der Aufgaben des
+ GSoC '08).
+ - Doppelte Audio-Pufferung zu SDL-System hinzugefügt, was die Probleme mit
+ dem MT-32-Emulator in Mac OS X behebt (vorerst nur bei Mac OS X
+ aktiviert).
+
+ AGOS:
+ - Abstürze während bestimmter Musikstücke in Amiga-Versionen von Elvira 1 und
+ Simon the Sorcerer 1 beseitigt.
+ - Palettenprobleme in Amiga-Versionen von Simon the Sorcerer 1 behoben.
+
+ Queen:
+ - Sprachausgabe wird nun mit richtiger Abtastfrequenz wiedergegeben. (Vorher
+ war die Wiedergabegeschwindigkeit etwas zu niedrig.)
+
+ SCUMM:
+ - Teile von Digital iMUSE umgeschrieben, was einige Fehler beseitigt.
+ - Code für interne Zeitplanung umgeschrieben, was einige
+ Geschwindigkeitsprobleme behebt, beispielsweise in COMI.
+ - Unterstützung für Klang-Effekte in Amiga-Versionen von Zak McKracken
+ verbessert.
+ - Unterstützung für AdLib-MIDI-Kombination in Monkey Island 1
+ (Diskettenversion) hinzugefügt.
+
+0.11.1 (29.02.2008)
+ SCUMM:
+ - Verbesserungen für Untersystem von Digital iMUSE. Dies behebt verschiedene
+ Störungen in The Curse of Monkey Island.
+ - Fehlerbeseitigungen für verschiedene Mauszeiger in HE-Spielen
+
+ AGI:
+ - Fehlerbeseitigung für Grabgestalten in King's Quest 4
+ - Fehlerbeseitigung für Palettenwechsel in von Fans erstellten Spielen
+ mittels AGIPAL
+
+ Lure:
+ - Einige Abstürze bei Gesprächen in der deutschen Version beseitigt.
+ - Funktionsweise des optionalen Kopierschutzdialogs in der deutschen Version
+ korrigiert.
+ - Speicherung von Gesprächsflaggen hinzugefügt, um festzustellen, ob eine
+ bestimmte Gesprächsoption zuvor ausgewählt wurde oder nicht.
+ - Störung beseitigt, die dazu führen konnte, dass Verwandlungsglitzern ein
+ zweites Mal vorkam.
+ - Verhalten von Goewin korrigiert, wenn man sich nach der Begegnung mit dem
+ Drachen ihr wieder anschließt.
+
+ SAGA:
+ - Fehler bei Rattenlabyrinth in Erben der Erde beseitigt, der das Spiel
+ undurchspielbar machte.
+ - Fehlerbeseitigungen für Spielstart von Erben der Erde und I Have No Mouth
+ bei einer gewissen Anzahl von Plattformen
+ - Anzahl gleichzeitig geöffneter Dateien in I Have No Mouth reduziert, um zu
+ ermöglichen, dass das Spiel auf Plattformen läuft, welche nur eine
+ begrenzte Anzahl Dateien geöffnet haben können (z. B. auf der PSP).
+ - Grafikstörung in Erben der Erde bei überlappender Sprachausgabe beseitigt.
+ - Palettenstörung in Erben der Erde beseitigt, wenn man die Karte anschaut,
+ während man sich am Dock befindet.
+
+0.11.0 (15.01.2008)
+ Neue Spiele:
+ - Unterstützung für Elvira: Mistress of the Dark hinzugefügt.
+ - Unterstützung für Elvira 2: The Jaws of Cerberus hinzugefügt.
+ - Unterstützung für I Have No Mouth, and I Must Scream (Demo und Vollversion)
+ hinzugefügt.
+ - Unterstützung für PreAGI-Spiel Mickey's Space Adventure hinzugefügt.
+ - Unterstützung für PreAGI-Spiel Troll's Tale hinzugefügt.
+ - Unterstützung für PreAGI-Spiel Winnie the Pooh in the Hundred Acre Wood
+ hinzugefügt.
+ - Unterstützung für Amiga-Version von Waxworks hinzugefügt.
+ - Unterstützung für Lure of the Temptress hinzugefügt.
+
+ Neue Portierungen:
+ - Portierung für iPhone hinzugefügt.
+ - Maemo-Portierung für Nokia-Internet-Tablets hinzugefügt.
+
+ Allgemein:
+ - ARM-Assembler-Routinen für Code im Soundmixer und bei Video-Wiedergabe in
+ SCUMM hinzugefügt, was zu manch guten Beschleunigungen bei einigen
+ Portierungen führt.
+ - Art und Weise der internen Handhabung von Tastatureingaben verbessert, was
+ ein paar seltsame Macken in einigen Spiel-/Port-Kombinationen beseitigt.
+ - Optionalen Dialog zum Bestätigen des Beendens zu SDL-System hinzugefügt.
+ - Dmedia-MIDI-Treiber für IRIX hinzugefügt.
+ - Erkennung neuer Spielvarianten und lokalisierter Versionen verbessert.
+ - Interner Zugriff auf Dateien vollständig überarbeitet. (GSoC-Aufgabe)
+ - Option hinzugefügt, um Spiele durch Drücken der Entf-Taste von der Liste zu
+ entfernen.
+ - Unterstützung für die Ersetzung des Präfixes „~/“ durch „$HOME“ in Pfaden
+ auf POSIX-Systemen (Linux, Mac OS X usw.) hinzugefügt.
+
+ AGI:
+ - Unterstützung für AGI256- und AGI256-2-Hacks hinzugefügt. (GSoC-Aufgabe)
+ - Unterstützung für Amiga-Menüs und -Paletten hinzugefügt. (GSoC-Aufgabe)
+ - Bessere Unterstützung für frühe AGI-Titel von Sierra
+
+ AGOS:
+ - Abstürze im Zusammenhang mit OmniTV-Wiedergabe in
+ Floyd - Es gibt noch Helden beseitigt.
+ - Verbesserte Funktionalität auf 64-Bit-Systemen
+
+ Baphomets Fluch 1:
+ - Unterstützung für mit FLAC komprimierte Musik hinzugefügt.
+
+ Kyrandia:
+ - Unterstützung für Macintosh-Version hinzugefügt.
+
+ Parallaction:
+ - Unterstützung für Amiga-Version von Nippon Safes, Inc. hinzugefügt.
+ - Viele Fehler beseitigt.
+
+ Queen:
+ - Unterstützung für AdLib-Musik hinzugefügt.
+ - Wiedergabe von fehlenden Musikschemas in Amiga-Version hinzugefügt.
+
+ SCUMM:
+ - Überspringen von Untertiteln (über „.“-Taste) für ältere Spiele
+ hinzugefügt, welche diese Funktion bisher nicht hatten (z. B. Zak, MM,
+ Indy3, Loom).
+ - Unterstützung für chinesische Version von COMI hinzugefügt.
+ - Bessere Unterstützung für östliche Versionen von Spielen
+ - Verschiedene Fehlerbeseitigungen für COMI und andere Spiele
+ - Unterstützung für originale Spielstandmenüs hinzugefügt (nur zum
+ Durchschauen). Verwenden Sie Alt+F5, um auf diese Funktion zuzugreifen.
+ - Unterstützung für spanische NES-Version von Maniac Mansion hinzugefügt.
+ - Bessere Unterstützung für deutsche C64-Version von Maniac Mansion
+ - Fehler mit Mauszeigern in Windows-Versionen von Spielen von Humongous
+ Entertainment beseitigt.
+
+ SAGA:
+ - Unterstützung für komprimierte Geräusch-Effekte, Sprachausgabe und Musik
+ hinzugefügt.
+
+ Touche:
+ - Umgehungen von einigen Störungen/Problemen im Originalspiel hinzugefügt.
+
+ WinCE-Portierung:
+ - Compiler erneut gewechselt. Nun wird cegcc verwendet
+ (http://cegcc.sourceforge.net/).
+ - Plugins werden nun für WinCE unterstützt (aber in dieser Veröffentlichung
+ nicht verwendet).
+ - Aktion „Freie Ansicht“ umgestaltet, hauptsächlich für die Anforderungen der
+ Lure-Engine.
+ - Kleinere Optimierungseinstellung, um dem Wachstum der ausführbaren Datei
+ entgegenzuwirken.
+ - Verschiedene Fehler beseitigt.
+
+ GP2X-Portierung:
+ - Unterstützung für F200-Touchscreen
+ - Verschiedene Fehler in Eingabe-Code beseitigt.
+
+0.10.0 (20.06.2007)
+ Neue Spiele:
+ - Engine Cinematique evo 1 hinzugefügt. Momentan wird nur Future Wars
+ unterstützt.
+ - Engine für Touché: Die Abenteuer des fünften Musketiers hinzugefügt.
+ - Unterstützung für Gobliins 2 hinzugefügt.
+ - Unterstützung für Simon the Sorcerer's Game Pack hinzugefügt.
+ - Unterstützung für Ween: The Prophecy hinzugefügt.
+ - Unterstützung für Bargon Attack hinzugefügt.
+ - Sierras AGI-Engine hinzugefügt.
+ - Unterstützung für Goblins 3 hinzugefügt.
+ - Parallaction-Engine hinzugefügt. Momentan wird nur Nippon Safes Inc.
+ unterstützt.
+
+ Allgemein:
+ - Dialog hinzugefügt, der es ermöglicht, das Oberflächenthema zur Laufzeit
+ auszuwählen.
+ - „Durchsuchen“-Funktion zum Startmenü hinzugefügt, die es ermöglicht, nach
+ allen bekannten Spielen in allen Unterverzeichnissen eines angegebenen
+ Verzeichnisses zu suchen (um dies zu verwenden, halten Sie die
+ Umschalttaste [Shift] gedrückt und klicken auf „Spiel hinzufügen“).
+ - Die Art und Weise verbessert, auf welche die automatische Erkennung die
+ Zielnamen generiert. Nun werden die Variante des Spiels, dessen Sprache und
+ Plattform miteinbezogen.
+ - Wiederholtes Tastendrücken wird nun auf zentralisierte Weise gehandhabt
+ anstatt auf einer Einzelfallbasis. (Einfach ausgedrückt: Alle Engines
+ handhaben nun wiederholtes Tastendrücken.)
+
+ Baphomets Fluch 1:
+ - Unterstützung für DXA-Zwischensequenzen hinzugefügt.
+ - Unterstützung für Macintosh-Version hinzugefügt.
+
+ Baphomets Fluch 2:
+ - Unterstützung für DXA-Zwischensequenzen hinzugefügt.
+ - „Schnellmodus“ hinzugefügt (verwenden Sie Strg+f, um diesen ein- und
+ auszuschalten).
+
+ Queen:
+ - Unterstützung für Amiga-Versionen hinzugefügt.
+ - Einige Soundstörungen beseitigt.
+
+ SCUMM:
+ - Unterstützung für nicht-interaktive Demos von HE-Spielen hinzugefügt (CUP).
+ - Synchronisierung von Bild und Ton in SMUSH-Videos verbessert (betrifft
+ The Dig, Vollgas, COMI).
+ - Geschwindigkeit von NES-Sound-Code verbessert.
+ - Viele (manchmal ernsthafte) Laufprobleme von Figuren behoben, insbesondere
+ in Zak McKracken und Maniac Mansion, indem für diese Spiele der Code für
+ das Laufen umgeschrieben wurde.
+ - Einige andere Probleme behoben.
+ - Unterstützung für die Wiedergabe von DXA-Filmen in HE-Spielen hinzugefügt.
+
+ Simon:
+ - Simon-Engine in AGOS umbenannt.
+
+ Kyrandia:
+ - Unterstützung für FM-TOWNS-Version hinzugefügt (sowohl für Englisch als
+ auch Japanisch).
+
+ BASS:
+ - Lange bestehenden Schriftarten-Fehler beseitigt. Wir haben die Schriftart
+ der Steuerungskonsole für den LINC-Bereich und Terminals verwendet, und die
+ LINC-Schriftart in der Steuerungskonsole. Dies verursachte viele
+ Buchstaben-Probleme (von denen wir einige umgangen haben) im
+ LINC-Bereich und bei Terminals, insbesondere bei nicht-englischen Sprachen.
+
+ Nintendo-DS-Portierung:
+ - Neue unterstützte Engines: AGI, CINE und SAGA
+ - Option, um den Mauszeiger anzuzeigen
+ - Wortvervollständigung bei Tastatur für AGI-Spiele
+ - Viele Optimierungen
+
+ Symbian-Portierung:
+ - Unterstützung für MP3 bei S60v3- und UIQ3-Versionen hinzugefügt.
+ - Umstieg auf SDL 1.2.11 für Fehlerbeseitigungen und Verbesserungen
+ - Verbesserte Leistung für S60v3 und UIQ3 mittels ARM Target.
+ - Eingeschränkte Unterstützung für Geräte von Symbian OS9 bedingt durch
+ Compiler-Probleme
+ - Handhabung der Tastenzuweisung aktualisiert.
+
+ WinCE-Portierung:
+ - Wechsel zur Verwendung einer GCC-Tool-Kette zur Zusammensetzung
+ - Größere Aktualisierung zur SDL-Bibliothek - besser, schneller,
+ kompatibler :-)
+ Die enthaltenen Fehlerbeseitigungen sind zu zahlreich, um sie hier
+ aufzuführen. Die meisten Aktualisierungen in dieser Version konzentrierten
+ sich auf die Infrastruktur. Diese führen zu schnellerer Ausführung,
+ bedeutend erhöhter Kompatibilität und Betriebssystemfreundlichkeit -
+ insbesondere für die Handhabung der Tastatur-/Maus-Eingabe und Anzeige
+ (z. B. keine plötzlich auftauchenden Aufklappelemente mehr während des
+ Spielens).
+
+ Windows-Portierung:
+ - Der standardmäßige Speicherort der Konfigurationsdatei wurde geändert, um
+ Systeme mit mehreren Benutzern zu unterstützen.
+
+ PalmOS-Portierung:
+ - PalmOS Porting SDK wird nun verwendet, was die Verwendung der
+ Standardbibliotheken der Programmiersprache C ermöglicht.
+
+0.9.1 (29.10.2006)
+ Neue Portierungen:
+ - Portierung für Nintendo DS hinzugefügt.
+ - Portierung für GP2X hinzugefügt.
+ - Portierung für GP32 hinzugefügt.
+
+ Allgemein:
+ - Potenzielle Ausschussdaten und/oder Absturz in Debug-Konsole beseitigt.
+ - Einschränkung bei 27 Spielen durch Spielkennung aufgehoben, wenn diese über
+ das Startmenü hinzugefügt werden.
+
+ SCUMM:
+ - Unterstützung für internationale Versionen von HE-Spielen verbessert.
+ - Seltene Figurzeichnungsstörung beseitigt.
+ - Fehler beim Finden des Wegs während Smart Star Challenge in
+ Big Thinkers 1st Grade beseitigt.
+ - Grafikstörungen in Magenumgebung von Pyjama Sam 3 beseitigt.
+ - Grafikstörungen in HE80-Version von Töff-Töff reist durch die Zeit
+ beseitigt.
+ - Fehler beseitigt, dass sich FM-TOWNS-Version von Indy3 bei Amiga-Portierung
+ nicht starten ließ.
+ - Es ist nun möglich, während SMUSH-Zwischensequenzen die Untertitel
+ ein- und auszuschalten.
+
+ Simon:
+ - Unterstützung für internationale Versionen von The Feeble Files
+ (Floyd - Es gibt noch Helden) verbessert.
+ - Undefiniertes Verhalten beim Laden von Musik korrigiert.
+ - Absturz bei der Anzeige mancher Untertitel in Floyd - Es gibt noch Helden
+ beseitigt.
+ - Knackender Sound in Mac-Versionen von Floyd - Es gibt noch Helden
+ beseitigt.
+
+ BASS:
+ - Leerzeichenabstand in LINC-Terminals bei Diskettenversion v0.0303
+ korrigiert.
+ - Rückschrittsfehler beseitigt, der zu falscher AdLib-Musik-Emulation führte.
+
+ Baphomets Fluch 1:
+ - Abstürze im Zusammenhang mit Sprachausgabe beseitigt.
+
+ Baphomets Fluch 2:
+ - Stabilere Handhabung der optionalen Datei startup.inf
+
+ Kyrandia:
+ - Scrollen im Vorspann von Kyrandia benötigt nun weniger Rechenleistung,
+ läuft dafür jedoch nicht mehr so glatt ab wie vorher.
+ - Winzige Grafikstörung im Vorspann von Kyrandia beseitigt.
+ - Handhabung der Bildschirmaktualisierung verbessert; beschleunigt die
+ Darstellung auf kleinen Geräten.
+ - Laden der Ressourcen verbessert; schnellerer Spielstart.
+
+ PSP-Portierung:
+ - Abstürze während scrollender Szenen in bestimmten SCUMM-Spielen beseitigt.
+ - Speicherung von kleinen Vorschaubildern in SCUMM-Spielständen hinzugefügt.
+
+ PS2-Portierung:
+ - Überlagerung verwendet nun höhere Auflösung.
+ - Es kann nun auch von USB, Festplatte usw. hochgefahren werden.
+
+ WinCE-Portierung:
+ - Mehrere Fehler beseitigt.
+ - Unterstützung für 2002-basierende Geräte wieder hinzugefügt.
+
+0.9.0 (25.06.2006)
+ Neue Spiele:
+ - Kyra-Engine hinzugefügt (für die Kyrandia-Reihe). Momentan wird nur der
+ erste Teil der Reihe unterstützt.
+ - Unterstützung für Floyd - Es gibt noch Helden hinzugefügt.
+
+ Allgemein:
+ - Von CVS zu Subversion gewechselt.
+ - Teilweise Restrukturierung unseres Quellcode-Baumes
+ - Fehler beseitigt, der verhinderte, dass die Einstellung des Grafikwandlers
+ für Spiele mit der Auflösung 640*480 durch die Kommandozeile übergangen
+ werden konnte.
+ - Untertitelsteuerungen zu Optionen-Dialog im Startmenü hinzugefügt.
+ - Grafische Benutzeroberfläche wurde vollständig neu gestaltet und es können
+ nun verschiedene Stil-Themen verwendet werden.
+
+ SCUMM:
+ - Spielerkennungscode umgeschrieben, für verbesserte Genauigkeit und bessere
+ Unterstützung von Fan-Übersetzungen. Die Erkennung sollte nun viel besser
+ mit Spielen funktionieren, deren MD5-Prüfsumme unbekannt ist.
+ - Untertitelsteuerungen zu Optionen-Dialog hinzugefügt.
+ - Grafische Störungen in einigen HE-Spielen beseitigt.
+ - Palettenstörungen in Big Thinkers 1st Grade beseitigt.
+ - Fehler bei Lied in der Küche von Pyjama Pit (1) beseitigt.
+
+ SAGA:
+ - Sound-Verzerrung in der Demo von Inherit the Earth beseitigt.
+
+ Simon:
+ - Verbesserte Unterstützung für Hebräisch
+ - Viele längst überfällige Säuberungen und Restrukturierungen wurden
+ vorgenommen, um mit Floyd - Es gibt noch Helden im Einklang zu sein.
+ - Seltenen MIDI-Fehler beseitigt, der dazu führte, dass ein Kanal die
+ Lautstärke änderte, ohne diese an die Hauptlautstärke anzugleichen.
+ - Verzögerung nach Vorspann in der Demo von Simon the Sorcerer 1
+ (englisch, mit Sprachausgabe) beseitigt.
+ - Musiktempo in DOS-Versionen von Simon the Sorcerer 1 korrigiert.
+
+ Baphomets Fluch 1:
+ - Unterstützung für die Option --save-slot hinzugefügt.
+
+ Baphomets Fluch 2:
+ - Handhabung des Zugriffs auf Spielressourcen im Speicher umgeschrieben. Dies
+ sollte Angleichungsprobleme beheben, die bezüglich einiger Plattformen
+ berichtet wurden.
+ - Fehlende Spieldaten werden großzügiger behandelt.
+
+ WinCE-Portierung:
+ - Hinzugefügt: PocketPC: Vertikale Überabtastungsskalierung 320x200=>320x240,
+ wenn Konsole nicht gezeigt wird
+ - Hinzugefügt: PocketPC: Rechtsklick bei doppeltem Antippen (n0p)
+ - Behoben: Überall: Probleme in einigen Fällen beim Abschneiden von
+ Grafiken
+ - Hinzugefügt: PocketPC: Mausemulation durch Tasten
+ - Hinzugefügt: Smartphones: Aufklappen virtueller Tastatur
+ - Beseitigt: Smartphones: Fehler bei Bildschirmspeicher-Transfer bei
+ SDL-Portierung
+ - Hinzugefügt: Überall: Mauszeiger auf Konsole sichtbar bei Verwendung
+ einer emulierten Maus
+ - Hinzugefügt: Überall: Modus für umgekehrtes Querformat
+ - Beseitigt: PocketPC: Dialoge abgeschnitten/nicht neu gezeichnet
+
+0.8.2 (08.02.2006)
+ Allgemein:
+ - Zusammensetzen von OS-X-Paket bei Verwendung von GCC 3.3 repariert.
+
+ SCUMM:
+ - Unterstützung für das Drehen und Skalieren von Grafikobjekten in HE-Spielen
+ hinzugefügt.
+
+ Sword2:
+ - Im letzten Moment Absturz beseitigt, der bei der Wiedergabe von
+ Geräusch-Effekten auftrat.
+
+ WinCE-Portierung:
+ - Seltsame Abstürze mit DOTT-Briefmarke und in FOA sollten beseitigt sein
+ (Fehlerberichte mit Kennung 1399830 und 1392815).
+ - Fehler beseitigt, bei dem Monkey Island auf Smartphones die Tastaturkonsole
+ blockierte (danke, Knakos).
+ - QVGA-Smartphone-Erkennung repariert (diesmal wirklich :p).
+ - Problem mit Doppelrechtsklick bei Smartphone behoben.
+
+0.8.1 (31.01.2006)
+ Allgemein:
+ - Kompilierung mit GCC 2.95 repariert.
+ - LaTex-Dokumentation repariert.
+ - Zu neuem, verbesserten Logo gewechselt, das zum neuen Seiten-Design passt.
+ - Aussagekräftigere Spieletitel in allen Engines
+ - Absturz beseitigt, wenn versucht wurde, Seitenverhältniskorrektur in
+ Spielen zu verwenden, in welchen dies nicht möglich ist.
+ - Potenzielle Sicherheitsschwachstelle mit übergroßen Pfadumgebungsvariablen
+ beseitigt.
+ - Standardmäßige Verstärkung für FluidSynth-Musiktreiber gemindert und sie
+ konfigurierbar gemacht.
+
+ SCUMM:
+ - Optimierungen für das Scrollen in COMI, sodass es weniger Rechenleistung
+ benötigt
+ - Unterstützung für deutsche Maniac-Mansion-NES-Version hinzugefügt.
+ - Fehler mit Maustastenzuständen in COMI beseitigt.
+ - Überlauf beseitigt, wenn man Bedienungskonsole für Roboter in The Dig
+ verwendet.
+ - Unterstützung für Sound-Code hinzugefügt, der von Liedern in HE-Spielen
+ verwendet wird.
+ - Schatten in späteren HE-Spielen verbessert.
+ - Untertitelstörungen in HE-Spielen beseitigt.
+ - Musik/Sound für HE-Spiele verbessert.
+ - Unterstützung für internationale Versionen von HE-Spielen verbessert.
+ - Unterstützung für Macintosh-Versionen von Spielen verbessert.
+ - Mehrere kleine Fehler beseitigt.
+
+ BASS:
+ - Absturz beseitigt, wenn Geschwindigkeits- bzw. Lautstärkeregler angeklickt
+ und dann aus dem ScummVM-Fenster gezogen wurden.
+
+ Gob:
+ - Verschwinden von Mauszeiger korrigiert, wenn Level-Passwort eingegeben
+ wird.
+ - Anwender wird gewarnt, falls er versucht, die CD-Version unter Windows
+ direkt von CD zu spielen.
+
+ Queen:
+ - Buchstabensatz für spanische Version korrigiert.
+
+ SAGA:
+ - Digitale Musikwiedergabe unter BE-Systemen repariert.
+
+ Simon:
+ - Präzisere MD5-basierte Spielerkennung integriert.
+ - Unterstützung für polnische Version von Simon the Sorcerer 2 hinzugefügt.
+ - Ausblenden während Ritt zu Goblinlager in Simon the Sorcerer 2 korrigiert.
+ - Palettenverzögerung am Ende von Simon the Sorcerer 1 korrigiert.
+ - Geräusch-Schleifen in Windows-Version von Simon the Sorcerer 2 korrigiert.
+
+ Sword1:
+ - Fehler beseitigt, bei dem Geräusch-Schleifen während Zwischensequenzen
+ oder angezeigten Steuerungsdialogen weiterhin abgespielt wurden.
+ - Speicherdialog behauptete irrtümlicherweise, ein Eingabe-/Ausgabe-Fehler
+ sei aufgetreten, wenn die Liste der Spielstände unbenutzte Plätze hatte und
+ Spielstände komprimiert waren.
+ - Fehler beim Scrollen beseitigt, der dazu führte, dass Endsequenz falsch
+ angezeigt wurde.
+
+ Sword2:
+ - Fehlerbeseitigungen und Säuberungen bei Abspann. Der deutsche Abspann
+ funktioniert nun.
+ - Fehler mit fehlender Sprachausgabe/Musik in zweiter Hälfte des Spiels
+ beseitigt, was, wie berichtet wurde, in einigen Versionen des Spiels
+ vorkam.
+
+ PS2-Portierung:
+ - Vollständig umgeschrieben und wird nun richtig offiziell.
+
+ PSP-Portierung:
+ - Fehler beseitigt, der Baphomets Fluch 1 zum Abstürzen brachte und dazu
+ führte, dass Spiele, die extrahierte CDDA-Titel verwenden (insbesondere die
+ CD-Version von Monkey Island 1), nach einer Weile nicht mehr einwandfrei
+ funktionierten.
+
+ WinCE-Portierung:
+ - Lesen Sie die Datei backends/wince/README-WinCE, um die neusten
+ Veränderungen zu erfahren.
+ - Fehler beseitigt, bei dem die Konsole verschwand, wenn ein Listen-Widget in
+ der grafischen Benutzeroberfläche geöffnet wurde.
+ - Patches von Knakos (Fehlerbeseitigung bei QVGA-Smartphones, einfachere
+ Tastenzuweisung und vereinfachter Konsolenwechsel)
+
+0.8.0 (30.10.2005)
+ Neue Spiele:
+ - SAGA-Engine hinzugefügt (für die Spiele „I Have No Mouth, and I Must
+ Scream“ und „Erben der Erde“).
+ - Gob-Engine hinzugefügt (für die Spielreihe Goblins). Momentan wird nur das
+ erste Goblins-Spiel unterstützt.
+
+ Neue Portierungen:
+ - Portierung für PlayStation 2 hinzugefügt.
+ - Portierung für PlayStation Portable (PSP) hinzugefügt.
+ - Portierung für AmigaOS 4 hinzugefügt.
+ - Portierung für EPOC/SymbianOS hinzugefügt.
+ - Fehler in OS/2-Portierung beseitigt.
+
+ Allgemein:
+ - Mauszeiger-Handhabung im SDL-System überarbeitet. Nun können Zeiger eine
+ eigene Palette und Skalierung haben. Dies wird jetzt für Spiele von
+ Humongous Entertainment verwendet.
+ - FluidSynth-MIDI-Treiber hinzugefügt.
+ - Grafische Benutzeroberfläche für SoundFont-Einstellungen hinzugefügt
+ (werden momentan nur von CoreAudio und FluidSynth-MIDI-Treibern
+ verwendet).
+ - Der MPEG-Spieler konnte aussetzen, wenn der Ton vorzeitig endet.
+ - Automatische Skalierung der Benutzeroberfläche verbessert, um den vollen
+ Vorteil des Bildschirms auszunutzen.
+ - Fehlerbeseitigungen für GCC 4
+
+ SCUMM:
+ - Unterstützung für Titel von Humongous Entertainment für Mac hinzugefügt.
+ - Unterstützung hinzugefügt für mehrere Dateinamen/Versionen bei der
+ Verwendung eines einzelnen Ziels.
+ - Render-Modi CGA und Hercules für frühe LEC-Titel hinzugefügt.
+ - Dialoge hinzugefügt, die angezeigt werden, wenn man die Textgeschwindigkeit
+ oder Musiklautstärke über Tastenkürzel verändert.
+ - Unterstützung für die NES-Version von Maniac Mansion hinzugefügt.
+ - Unterstützung für kleine Vorschaubilder bei Speicherständen hinzugefügt.
+ - Kompatibilität mit HE-Spielständen aufgehört (nur HE v71 und höher).
+ - Möglichkeit hinzugefügt, die Einbeziehung der Engines HE und SCUMM v7 & v8
+ bei der Kompilierung zu deaktivieren.
+ - Die letzten wenigen bekannten Musikstörungen bei Sam & Max beseitigt.
+ (Es gibt - wahrscheinlich - jedoch immer noch geringfügig fehlende
+ Funktionen.)
+ - Unterstützung für Comodore64-Version von Zak McKracken hinzugefügt.
+ - Alle Demoziele und plattformspezifische Ziele entfernt. Konfigurationsdatei
+ wird automatisch aktualisiert.
+
+ Sword2:
+ - Ressourcen-Manager dazu gebracht, Ressourcen intelligenter auslaufen zu
+ lassen.
+ - Leistung verbessert, wenn Spiel von CD anstatt Festplatte gespielt wird.
+ - Handhabung von Geräusch-Effekten vereinfacht - wieder einmal.
+ - Code-Säuberungen und -Restrukturierungen.
+ - Lange bestehenden Fehler bei der Dekompression von Sound aus den
+ CLU-Dateien für Sprachausgabe und Musik beseitigt. Es wurde eine Abtastung
+ zuviel erzeugt, was als leichtes Knackgeräusch am Ende einiger Sounds
+ wahrgenommen werden konnte. Dateien, die mit älteren Versionen von
+ compress_sword2 komprimiert wurden, werden natürlich immer noch denselben
+ Fehler haben. Möglicherweise wollen Sie diese neu erzeugen.
+
+0.7.1 (27.03.2005)
+ Allgemein:
+ - MT-32-Emulator hinzugefügt [er wurde eigentlich schon in Version 0.7.0
+ hinzugefügt, aber wir haben vergessen, ihn in dieser Datei zu
+ erwähnen :-) ].
+ - MPEG-Filmwiedergabe für Baphomets Fluch 1 & 2 nun weniger speicherhungrig
+
+ SCUMM:
+ - Falsche Figurenanimation in INSANE von Vollgas beseitigt.
+
+ Windows-Mobile-Portierung (PocketPC / Smartphone):
+ - FOTAQ-Absturz auf allen Plattformen WIEDER beseitigt, wenn man Hotel
+ verlässt.
+ - Bessere Emulation niedriger Qualität von AdLib für FOTAQ
+ - Zufällig defekte Option zum Verstecken der Werkzeugleiste repariert
+ (danke, iKi).
+ - Erste Hardware-Tastenzuweisung repariert (wurde vorher nicht angezeigt).
+ - Kurze Aussetzer in BASS & Simon beim Smartphone beseitigt, wenn
+ Tastenkürzel zum Überspringen von Sätzen verwendet wird.
+ - Zonentastenaktion beim Smartphone repariert (nun der Taste 9 zugewiesen).
+ - Experimentelle Fehlerbeseitigung Dritter für VGA-Modus (SE-VGA)
+ - Tastenzuweisungsoption im Startmenü hinzugefügt
+ (ab Version 1.2.0 in deutscher Lokalisation zu finden unter:
+ Optionen / Sonstiges / Tasten).
+ - Abhängigkeit von AYGSHELL.DLL beseitigt, um auf Plattformen mit CE .Net zu
+ funktionieren.
+ - Probleme mit Tastenzuweisung behoben, die sich in 0.7.0 eingeschlichen
+ haben.
+ - Interaktive Action-Sequenz in Vollgas sollte spielbarer sein.
+ - Neue Tastenzuweisungsoption „FT Cheat“, um alle Action-Sequenzen in Vollgas
+ zu gewinnen
+ - Beenden von Simon-Spiel bei Smartphones mit Aktionstaste
+
+ Sword2:
+ - Absturz beseitigt, der aufgetreten ist, wenn versucht wurde, Musik von CD 1
+ und CD 2 gleichzeitig wiederzugeben.
+ - Absturz bei Zwischensequenz-Abspieler beseitigt, wenn Sprachdatei fehlt.
+
+ BASS:
+ - Absturz beseitigt, wenn man mit spanischem Text in Diskettenversion mit dem
+ Gärtner redet.
+
+0.7.0 (24.12.2004)
+ Neue Spiele:
+ - 26 Titel von Humongous Entertainment hinzugefügt; nur wenige sind
+ durchspielbar.
+
+ Allgemein:
+ - Unterstützung für mit FLAC (verlustfrei) komprimierte Audio-Dateien
+ hinzugefügt.
+ - Bildschirmanzeige zu SDL-System hinzugefügt.
+ - Teilweise API-System umgeschrieben.
+ - Kommentare und die Reihenfolge der Abschnitte in der Konfigurationsdatei
+ werden nun beibehalten.
+ - Grafikwandler AdvMame auf Grundlage von scale2x 2.0 aktualisiert -
+ AdvMame3x sieht nun schöner aus und AdvMame 2x wird durch MMX beschleunigt.
+ - MMX-i386-Assembler-Versionen von HQ2x- und HQ3x-Grafikwandlern hinzugefügt.
+ - Option für „Extrapfad“ hinzugefügt, der die Einbindung von Spieldateien in
+ einem zusätzlichen Verzeichnis erlaubt (z. B. für umgewandelte
+ Zwischensequenzen oder Ähnliches).
+ - Tastenkombinationen Alt+x und Strg+z für das Beenden auf Systemen der Marke
+ Unix (wie z. B. Linux) deaktiviert - zugunsten von Strg+q
+ (Ausnahme: Mac OS X verwendet nach wie vor Cmd+q).
+ - Gesonderte kleinere Schriftart für die Konsole, wodurch mehr Informationen
+ auf einen Blick sichtbar werden, z. B. im SCUMM-Debugger
+ - Unterstützung für das Einstellen der Ausgabefrequenz zur Laufzeit
+ hinzugefügt, auch wenn es hierfür noch keine Option in der
+ Benutzeroberfläche gibt.
+ - Anstatt des aktuellen Verzeichnisses wird nun folgendes Standardverzeichnis
+ auf folgenden Plattformen für Spielstände verwendet:
+ Mac OS X: $HOME/Documents/ScummVM Savegames/
+ Andere UNIX-Systeme: $HOME/.scummvm/
+ - Neuen „Über“-Dialog mit rollender Liste aller Mitwirkenden hinzugefügt.
+
+ SCUMM:
+ - Das alte Ziel zak256 entfernt; zakTowns wird nun stattdessen verwendet.
+ - Native Unterstützung für Macintosh-Versionen durch Verwendung einer
+ speziellen Container-Datei hinzugefügt.
+ - Glatter horizontaler Bildlauf für The Dig, Vollgas und COMI hinzugefügt
+ (mit der originalen Engine übereinstimmend).
+ - Teilweise Text-Engine umgeschrieben, was verschiedene Fehler beseitigt,
+ besonders in neueren Spielen (The Dig, COMI).
+ - Zeichnungsstörungen bei Figuren in V1 von Maniac und Zak beseitigt.
+ - Schiff-zu-Schiff-Grafikstörungen in COMI beseitigt.
+ - Palettenstörungen in COMI beseitigt.
+
+ Queen:
+ - Einige Probleme bei Dreamcast-System behoben.
+
+ Sword1:
+ - Unterstützung für komprimierte Sprachausgabe und Musik hinzugefügt.
+ - Unterstützung für die Demo hinzugefügt.
+ - Bessere Unterstützung für tschechische Version
+ - Umgehungslösungen für in einigen Spielversionen vorhandene Skript- und
+ Untertitel-Fehler hinzugefügt.
+
+ Sword2:
+ - Speicher-/Ressourcen-Verwaltung vereinfacht.
+ - Handhabung von Geräusch-Effekten vereinfacht.
+ - Unterstützung für komprimierte Sprachausgabe und Musik hinzugefügt.
+ - Verschiedene kleinere Fehler beseitigt.
+
+ BASS:
+ - Umgehungslösungen für einige seltene Skriptfehler hinzugefügt, durch deren
+ Auftreten man das Spiel nicht mehr gewinnen konnte.
+
+0.6.1b (03.08.2004)
+ Allgemein:
+ - Fehler bei Kopieren und Einfügen im Startmenü beseitigt, der den
+ Speicherpfad beschädigen konnte.
+ - Abstürze bei 64-Bit-Architekturen beseitigt.
+
+ SCUMM:
+ - Durch VOC verursachten Absturz in der DOTT-Diskettenversion beseitigt.
+ - Palettenprobleme in Amiga-Version von MI2 behoben.
+
+ Simon:
+ - Durch VOC verursachten Absturz beseitigt.
+
+0.6.1 (25.07.2004)
+ Allgemein:
+ - Sound-Störung beseitigt, wenn zwei oder mehr Ogg-Vorbis-Sounds als
+ Datenstrom aus demselben Datei-Handle ausgegeben werden, z. B. im Vorspann
+ von Sam & Max bei Verwendung der Datei monster.sog.
+
+ SCUMM:
+ - Wie gewöhnlich: viele Fehlerbeseitigungen für Spiele der SCUMM-Engine
+ - Grafikdekodierer für 3DO-Spiele von Humongous Entertainment hinzugefügt.
+ - Zahlreiche Fehlerbeseitigungen für Spiele von Humongous Entertainment
+ - Fehler in Vollgas beseitigt, sodass Schwierigkeitsgrad im Kampf dem des
+ Originals entspricht.
+ - Digital iMuse verbessert.
+
+ Sword1:
+ - ScummVM warnt nun den Anwender, wenn Speichern fehlschlägt, anstatt
+ abzustürzen.
+ - Leicht anwenderfreundlicherer Dialog zum Speichern/Laden
+ - Bildmaskenfehler vor Nicos Wohnung beseitigt.
+
+ Simon:
+ - Abstürze in einigen internationalen Versionen beseitigt.
+
+0.6.0 (14.03.2004)
+ Neue Spiele:
+ - Engine für Baphomets Fluch 1 hinzugefügt.
+ - Engine für Baphomets Fluch 2 hinzugefügt.
+ - Engine für Flight of the Amazon Queen hinzugefügt.
+ - Unterstützung für die V1-SCUMM-Spiele Maniac Mansion und Zak McKracken
+ hinzugefügt.
+ - SCUMM-Spiel Vollgas wird nun unterstützt.
+
+ Allgemein:
+ - Untertitel sind nun standardmäßig ausgeschaltet. Kommandozeilen-Option „-n“
+ aktiviert die Untertitel von jetzt an.
+ - Grafikwandler HQ2x und HQ3x hinzugefügt.
+ - Sound-Code für mehr Flexibilität und Effizienz umgeschrieben.
+ - Native MT-32-Unterstützung verbessert.
+ - AdLib-GM-Emulationstabelle so umgestaltet, dass sie genaueres Software-MIDI
+ bietet.
+ - Standardmäßige Datei Makefile verwendet nun Konfigurationsskript.
+ - Startmenü und Optionsdialoge erheblich verbessert (in Bearbeitung).
+ - Viele weitere Verbesserungen „unter der Motorhaube“ wie z. B. die neue
+ Konfigurationshandhabung und Plugin-Fähigkeiten
+
+ Simon:
+ - Spieldateien-Dekodierer für Amiga-Diskettenversionen hinzugefügt.
+ - Unterstützung für Inventargrafiken in Amiga-Versionen hinzugefügt.
+ - Verschiedene Vorfälle kurzer Aussetzer im Spiel beseitigt.
+ - Kleinere Störungen im Dialog Laden/Speichern in nicht-englischen Versionen
+ beseitigt.
+ - Problem mit fehlenden Inventarpfeilen in einigen Versionen von
+ Simon the Sorcerer 1 wurde behoben.
+
+ SCUMM:
+ - Viele, viele, viele Fehlerbeseitigungen für die SCUMM-Engine. Wirklich
+ viele. Und das ist eine ganze Menge.
+ - INSANE-Unterstützung für die „Action-Sequenzen“ von Vollgas hinzugefügt.
+ - Option zur Auswahl zwischen AdLib, PCjr und PC-Lautsprecher für frühere
+ Spiele hinzugefügt.
+ - AdLib-Unterstützung für indy3ega und loom (EGA) hinzugefügt.
+ - MIDI-Unterstützung für loom (EGA), monkeyega und monkeyvga hinzugefügt.
+ - Unterstützung für Klang-Effekte für indy3/monkeyega/monkeyvga/pass
+ hinzugefügt.
+ - FM-TOWNS-Ziele für Loom und Indy3 hinzugefügt.
+ - Menü im Spiel (aufrufbar mit F5) umgeschrieben, um einfachere Verwendung zu
+ ermöglichen.
+ - Verbesserte Unterstützung für Sound in FM-TOWNS (YM2612-Emulation,
+ Geräusch-Schleifen).
+ - Klassische SCUMM-V1-Varianten von Maniac Mansion und Zak McKracken werden
+ nun unterstützt und sind durchspielbar.
+ - Musiksystem Digital iMUSE umgeschrieben.
+ - Mehrere Fehler im Musiksystem Analog iMUSE beseitigt.
+ - Musik und Sound für verschiedene Amiga-Versionen verbessert.
+ - Kompression für Audio-Dateien von Fate of Atlantis und Simon the Sorcerer 2
+ verbessert.
+ - Tastaturkampf funktioniert nun in Fate of Atlantis.
+ - Tastaturunterstützung für Kanonenkampf in Curse of Monkey Island
+ - Tastaturunterstützung für Rennfahr-Szene in Vollgas
+
+0.5.1 (06.08.2003)
+- Programm-Code für Spielstände von Beneath a Steel Sky umgeschrieben (siehe
+ Hinweis in README unter „Known Bugs“).
+- Beseitigung von Fehlern beim Ãœberspringen von Dialogen sowie bei der
+ Musiklautstärke und von mehreren Abstürzen/Ursachen für das Aufhängen in
+ Beneath a Steel Sky
+- Fehler beim Ãœberspringen von Dialogen in V7-SCUMM-Spielen beseitigt.
+- Störung beim Beenden von ScummVM im Vollbildmodus unter Mac OS X
+ beseitigt.
+- Mehrere COMI-Fehler beseitigt im Zusammenhang mit der Platzierung/Skalierung
+ von Figuren.
+- Vollständige Hebräisch-Unterstützung für Simon the Sorcerer 1 und 2
+ hinzugefügt.
+- Mehrere Fehlerbeseitigungen für MorphOS- und Dreamcast-Portierung
+- Auf Dreamcast laufen nun Simon the Sorcerer 1 & 2.
+- Vollbildschirmmodus-Problem unter Mac OS X behoben, bei welchem man die Maus
+ nicht im oberen Teil des Bildschirms verwenden konnte, indem zu einer
+ fehlerbereinigten Version von SDL verlinkt wurde.
+
+0.5.0 (02.08.2003)
+- Verbesserte Versionen von Maniac Mansion und Zak McKracken werden nun
+ unterstützt und sind komplett durchspielbar.
+- Unterstützung für Amiga-Version von Monkey Island 1 hinzugefügt.
+- Erste Unterstützung (nicht spielbar) für V1-Variante von Maniac Mansion/
+ Zak McKracken
+- Unterstützung zum Spielen von Curse of Monkey Island von CD unter Mac OS X
+ verbessert.
+- Um Spielstände für CD 2 zu laden, wird nicht mehr zuerst die CD 1 benötigt.
+- Engine von iMuse umgeschrieben und viele Musikfehler beseitigt (besonders bei
+ Monkey Island 2).
+- Unterstützung für Musik in DOS-Versionen von Spielen von Humongous
+ Entertainment und Simon the Sorcerer 2 (XMIDI-Format)
+- Vollständige Musikunterstützung für Simon the Sorcerer 2.
+- Musik- und Sound-Unterstützung in Zak256 verbessert.
+- Option für Seitenverhältniskorrektur hinzugefügt.
+- Viele weitere Fehlerbeseitigungen, Verbesserungen und Optimierungen
+
+0.4.1 (25.05.2003)
+- Filter AdvMame3x hinzugefügt.
+- Absturz in Curse of Monkey Island (und wahrscheinlich auch anderen Spielen)
+ beseitigt.
+- Flughafentüren in Zak256 korrigiert.
+- Absturz in SDL-System beseitigt.
+- Mehrere Fehler bei iMuse beseitigt.
+
+0.4.0 (11.05.2003)
+- Unterstützung für Curse of Monkey Island (experimentell)
+- Unterstützung für EGA-Versionen von Loom, Monkey Island und Indy3 hinzugefügt.
+- Verbesserte Musikunterstützung in Indy3 und Diskettenversionen von
+ Monkey Island
+- Viele Verbesserungen und Fehlerbeseitigungen für Simon the Sorcerer 1 & 2
+- Programm-Code im sehr frühen Entwicklungsstadium für Beneath a Steel Sky.
+ Bitte nicht erwarten, dass er irgendetwas tut.
+- Noch mehr Unterstützung im frühen Entwicklungsstadium für V2-SCUMM-Spiele
+ (Maniac Mansion und Zak)
+- Vorbereitende Unterstützung für frühe Titel von Humongous Entertainment (sehr
+ experimentell)
+- Neue Debug-Konsole und mehrere Verbesserungen bei Benutzeroberfläche und
+ Startmenü mit Spieleliste
+- Neuer Programm-Code für das Speichern und Laden (einfacher zu erweitern,
+ während Kompatibilität erhalten wird)
+- Dreamcast-Portierung funktioniert nun mit neuen Spielen, für welche die
+ Unterstützung in Version 0.3.0b hinzukam.
+- Neue offizieller PalmOS-Portierung
+- Verschiedene kleine und nicht so kleine Fehlerbeseitigungen für SCUMM-Spiele
+- Großes Speicherleck bei The Dig/ComI beseitigt.
+- SMUSH-Code optimiert, Auslassen von Bildern für langsamere Maschinen
+ hinzugefügt.
+- Programm-Code-Säuberungen
+
+0.3.0b (08.12.2002)
+- Massive Säuberungsarbeiten bei iMUSE. Die Musik in Sam & Max wird nun korrekt
+ abgespielt.
+- Viele Fehlerbeseitigungen für Zak256 + Unterstützung für Sound und Musik
+- Musikunterstützung für Simon the Sorcerer auf Plattformen mit echtem MIDI
+- Experimentelle Unterstützung für Indy3 (VGA) - Indiana Jones and the
+ Last Crusade
+- Vervollständigte Unterstützung für Monkey1-VGA-Diskette, The Dig
+- Implementierung von akos16 durchgeführt für Costumes (Grafikdateien von
+ Figuren) in The Dig und Vollgas.
+- Implementierung von Digital iMuse für Musik in The Dig und Vollgas
+- Synchronisation von Sprachausgabe und Musik bei Loom-CD erheblich verbessert.
+- MIDI-Emulation durch AdLib hinzugefügt, für Plattformen ohne Sequencer-
+ Unterstützung.
+- Programm-Code-Trennung verschiedener Engine-Teile in einzelne Bibliotheken
+- Mehrere Fehler beseitigt, um Abstürzen und Aufhängen in Simon the Sorcerer
+ zu verhindern.
+- Hunderte Fehlerbeseitigungen für viele andere Spiele
+- Neue SMUSH-Video-Engine, für Vollgas und The Dig
+- Neue Benutzeroberfläche im Spiel
+- Startmenü mit Spieleliste
+
+0.2.0 (14.04.2002)
+- Engine-Kern umgeschrieben.
+- Verbesserte Benutzeroberfläche im Spiel, einschließlich
+ Optionen-/Lautstärke-Einstellungen
+- Funktion für automatisches Speichern
+- Weitere Kommandozeilenoptionen und Konfigurationsdatei hinzugefügt.
+- Neue Portierungen und Plattformen (MorphOS, Macintosh, Dreamcast, Solaris,
+ IRIX, usw.)
+- Grafikfilter hinzugefügt (2xSAI, Super2xSAI, SuperEagle, AdvMame2x).
+- Unterstützung für mit MAD MP3 komprimierte Audio-Dateien
+- Unterstützung für erste Nicht-SCUMM-Spiele (Simon the Sorcerer)
+- Unterstützung für V4-SCUMM-Spiele (Loom-CD)
+- Verbesserte Unterstützung von V6-SCUMM-Spielen (Sam & Max ist nun komplett
+ durchspielbar)
+- Experimentelle Unterstützung für V7-SCUMM-Spiele (Vollgas/The Dig)
+- Experimentelle Unterstützung für V3-SCUMM-Spiele (Zak256/Indy3)
+
+0.1.0 (13.01.2002)
+- Eine Menge Änderungen
+
+0.0.2 (12.10.2001)
+- Fehlerbeseitigungen
+- Unterstützung für Laden & Speichern
+
+0.0.1 (08.10.2001)
+- Erste Version
+
+
+(Deutscher Text basiert auf NEWS mit SHA1-ID:
+744f8507d714da5710c020bf56aa49dd0662acf6)
diff --git a/doc/de/Schnellstart b/doc/de/Schnellstart
new file mode 100644
index 0000000000..6340a3bee4
--- /dev/null
+++ b/doc/de/Schnellstart
@@ -0,0 +1,176 @@
+Dieses Dokument ist eine auszugsweise Ãœbersetzung der englischen README-Datei.
+Das Original-Dokument enthält viel mehr Informationen. Sollten Sie hier also
+nicht das finden, was Sie benötigen und ein wenig Englisch können, sollten Sie
+sich die englische README-Datei ansehen.
+
+Für weitere Informationen, Kompatibilitätslisten, Einzelheiten zu Spenden, die
+neusten veröffentlichten Versionen, Fortschrittsberichte und mehr besuchen Sie
+bitte die ScummVM-Website unter der Adresse: http://www.scummvm.org/
+
+
+Inhaltsverzeichnis:
+------------------
+1.0) Einführung
+ * 1.1 Ãœber ScummVM
+ * 1.2 Schnellstart
+2.0) Kontakt
+ * 2.1 Fehler berichten
+
+
+1.0) Einführung:
+---- -------------
+
+1.1) Ãœber ScummVM:
+---- -------------
+ScummVM ist ein Programm, welches es Ihnen ermöglicht, bestimmte klassische
+Grafik-Adventure (unter anderem aus dem Point-and-Click-Bereich) zu spielen,
+vorausgesetzt, Sie sind im Besitz der Dateien des Spiels. Der Trick dabei ist:
+ScummVM ersetzt lediglich die Funktion der ausführbaren Dateien, die mit den
+Spielen kamen, was ermöglicht, diese Spiele auf Systemen zu spielen, für welche
+sie nie erstellt wurden!
+
+Ursprünglich wurde dieses Programm dafür entwickelt, um SCUMM-Spiele von
+LucasArts auszuführen, wie beispielsweise Maniac Mansion, Monkey Island, Day of
+the Tentacle oder Sam & Max. SCUMM steht als Abkürzung für „Script Creation
+Utility for Maniac Mansion“ (deutsch etwa: Skripterstellungsdienstprogramm für
+Maniac Mansion), was das erste Spiel von LucasArts war, für welches LucasArts
+dieses System entworfen hatte. Und viel später verlieh es seinen Namen an
+ScummVM (wobei „VM“ für „Virtuelle Maschine“ steht).
+
+Mit der Zeit wurde Unterstützung für viele Nicht-SCUMM-Spiele hinzugefügt und
+ScummVM unterstützt nun auch viele AGI- und SCI-Spiele von Sierra (wie
+beispielsweise King's Quest 1-6, Space Quest 1-5, ...), Discworld 1 und 2, Simon
+the Sorcerer 1 und 2, Beneath A Steel Sky, Lure of the Temptress, Baphomets
+Fluch I und II, Flight of the Amazon Queen, Gobliiins 1-3, die Adventure-Reihe
+The Legend of Kyrandia, viele der SCUMM-Spiele für Kinder von Humongous
+Entertainment (einschließlich der Spiele von Fritzi Fisch und Töff-Töff) und
+viele mehr. Sie können eine vollständige Liste mit Einzelheiten einsehen, welche
+Auskunft darüber gibt, welche Spiele unterstützt werden und wie gut. Gehen Sie
+hierfür auf die Kompatibilitätsseite. ScummVM wird fortlaufend verbessert, also
+schauen Sie öfter einmal vorbei.
+
+Unter den Systemen, mit denen Sie diese Spiele spielen können, befinden sich
+normale Schreibtisch-Computer (mit den Betriebssystemen Windows, Linux,
+Mac OS X, ...), Spielekonsolen (Dreamcast, Nintendo DS & Wii, PS2, PSP, ...),
+Smartphones (Android, iPhone, PocketPC, Symbian ...) und einige weitere.
+
+Zurzeit befindet sich ScummVM immer noch stark in der Entwicklung. Seien Sie
+sich bewusst, dass wir zwar versuchen, dass viele Spiele mit wenigen erheblichen
+Fehlern durchgespielt werden können, aber es dennoch zu Abstürzen kommen kann
+und wir keine Gewähr übernehmen. Davon abgesehen: Einige Spiele werden seit
+längerer Zeit unterstützt und sollten in jeder neusten stabilen veröffentlichten
+Version ohne größere Probleme laufen. Sie können sich einen Eindruck davon
+verschaffen, wie gut jedes Spiel unter ScummVM läuft, indem Sie auf die
+Kompatibilitätsseite schauen. Wenn Sie sich ein wenig im Internet umsehen,
+können Sie feststellen, dass ScummVM sogar kommerziell genutzt wird, um einige
+der unterstützen Spiele für moderne Plattformen wiederzuveröffentlichen. Dies
+zeigt, dass mehrere Firmen mit der Qualität der Software zufrieden sind und wie
+gut einige der Spiele mit Hilfe des Programms laufen.
+
+Wenn Ihnen ScummVM gefällt, können Sie uns gerne Geld spenden, indem Sie auf die
+PayPal-Schaltfläche auf der ScummVM-Website klicken. Dies hilft uns dabei,
+notwendige Dienstprogramme zu kaufen, um ScummVM einfacher und schneller zu
+entwickeln. Wenn Sie nicht spenden können, dürfen Sie auch gerne einen Patch
+beisteuern.
+
+1.2) Schnellstart:
+---- -------------
+WICHTIG: In dieser kurzen Anleitung wird davon ausgegangen, dass Sie ScummVM auf
+Deutsch benutzen. Standardmäßig wird ScummVM die Sprache Ihres Betriebssystems
+verwenden. Wenn Sie ScummVM lieber auf Englisch verwenden möchten, benutzen Sie
+bitte die Anleitung in der englischen README-Datei.
+
+Für die ungeduldigen unter den Anwendern ist hier in fünf einfachen Schritten
+kurz beschrieben, wie man ScummVM lauffähig macht und das Programm verwendet.
+
+1. Laden Sie ScummVM unter der Adresse http://www.scummvm.org/downloads.php
+herunter und installieren Sie es.
+
+2. Erstellen Sie ein Verzeichnis auf Ihrer Festplatte und kopieren Sie die
+Dateien des Spiels vom Original-Datenträger in dieses Verzeichnis. Wiederholen
+Sie diesen Vorgang für jedes Spiel, das Sie spielen möchten (es ist besser, für
+jedes Spiel ein eigenes Verzeichnis zu verwenden).
+
+3. Starten Sie ScummVM.
+
+Sollte an diesem Punkt ScummVM auf Englisch statt auf Deutsch erscheinen, gehen
+Sie wie folgt vor, um die Spracheinstellung zu ändern:
+-Klicken Sie auf „Options“.
+-Klicken Sie auf den rechten Pfeil in der Reiterleiste und wählen den Reiter
+ „Misc“ aus.
+-Wählen Sie im Feld „GUI Language“ „Deutsch“ aus und klicken auf „OK“.
+-Bestätigen Sie die erscheinende Nachricht, klicken auf „Quit“, um ScummVM zu
+ beenden, und starten dann das Programm erneut.
+
+Nun klicken Sie auf „Spiel hinzufügen“, wählen das Verzeichnis mit den Dateien
+des Spiels aus (versuchen Sie nicht, die Dateien des Spiels selbst auszuwählen!)
+und klicken Sie auf „Auswählen“.
+
+4. Ein Dialog sollte erscheinen, der Ihnen ermöglicht, verschiedene
+Einstellungen vorzunehmen, sollten Sie dies wünschen (es sollte jedoch in
+Ordnung sein, alles voreingestellt zu belassen). Bestätigen Sie diesen Dialog.
+
+5. Wählen Sie das Spiel aus der Liste aus, welches Sie spielen möchten, und
+klicken Sie auf „Starten“.
+
+ScummVM behält die Spiele in der Liste, die Sie hinzufügen. Wenn Sie also
+ScummVM schließen, werden beim nächsten Start alle Spiele, die Sie zuvor
+hinzugefügt haben, in der Liste angezeigt. Sie können somit direkt zu Schritt 5
+übergehen, außer Sie wollen noch mehr Spiele hinzufügen.
+
+Tipp: Wenn Sie mehrere Spiele auf einmal hinzufügen möchten, drücken Sie die
+Umschalt-Taste (Shift), bevor Sie auf „Spiel hinzufügen“ klicken. Diese
+Schaltfläche wird somit ihren Text zu „Durchsuchen“ umändern und wenn Sie dann
+auf diese klicken, werden Sie auch dazu aufgefordert, ein Verzeichnis
+auszuwählen, nur dieses Mal wird ScummVM alle Unterverzeichnisse automatisch
+nach unterstützen Spielen durchsuchen.
+
+
+2.0) Kontakt:
+---- --------
+Der einfachste Weg, um mit dem ScummVM-Team in Verbindung zu treten, ist,
+Fehlerberichte einzusenden (siehe Abschnitt 2.1) oder durch Verwendung des
+Forums unter der Adresse http://forums.scummvm.org .
+Sie können ebenso der Mailing-Liste scummvm-devel beitreten und an diese E-Mails
+versenden oder mit uns im IRC chatten (#scummvm unter irc.freenode.net). Bitte
+fordern Sie uns nicht dazu auf, ein nicht unterstütztes Spiel zu unterstützen.
+Lesen Sie zuerst die Seite FAQ (Häufig gestellte Fragen) auf unserer Website.
+Bitte beachten Sie, dass die offizielle Sprache des Forums, der Mailing-Liste
+und des Chats Englisch ist und keine andere Sprache dort verwendet werden
+sollte.
+
+
+2.1) Fehler berichten:
+---- -----------------
+Um einen Fehler zu berichten, erstellen Sie bitte ein SourceForge-Konto und
+folgen Sie dem Link „Bug Tracker“ auf der ScummVM-Website. Bitte stellen Sie
+sicher, dass sich der Bug wiedererzeugen lässt und immer noch in der neusten
+Version von git oder des Daily Builds auftritt. Bitte sehen Sie auch auf der
+Kompatibilitätsliste der ScummVM-Website für dieses Spiel nach, um
+sicherzustellen, dass das Problem nicht bereits bekannt ist:
+
+ http://www.scummvm.org/compatibility_stable.php
+
+Bitte berichten Sie keine Fehler zu Spielen, die nicht als durchspielbar im
+Bereich „Supported Games“ oder der Kompatibilitätsliste aufgelistet sind.
+Wir -wissen-, dass diese Spiele Fehler aufweisen.
+
+Bitte liefern Sie folgende Informationen:
+ - ScummVM-Version (BITTE mit neuster Version von git oder des Daily Builds
+ testen)
+ - Einzelheiten zum Fehler, einschließlich Anweisungen, um den Fehler
+ hervorzurufen
+ - Sprache des Spiels (Deutsch, Englisch ...)
+ - Version des Spiels (Version mit Sprachausgabe [Talkie],
+ Diskettenversion, ...)
+ - Plattform und gegebenenfalls Compiler (Win32, Linux, FreeBSD, ...)
+ - Fügen Sie - wenn möglich - einen Speicherstand hinzu.
+ - Wenn dieser Fehler erst seit kurzem Auftritt, teilen Sie bitte die letzte
+ Version ohne den Fehler mit und die erste Version mit diesem Fehler.
+ Auf diese Weise können wir diesen schneller beseitigen, indem wir die
+ vorgenommen Veränderungen einsehen.
+
+Zum Schluss möchten wir Sie noch bitten, jeden Punkt einzeln zu berichten. Bitte
+senden Sie nicht mehrere Punkte mit demselben Ticket ein, ansonsten wird es
+schwierig, den Status jedes einzelnen Fehlers zu verfolgen. Denken Sie bitte
+auch daran, dass alle Fehlerberichte in Englisch verfasst sein müssen.
diff --git a/doc/es/Inicio rápido b/doc/es/Inicio rápido
new file mode 100644
index 0000000000..3848b049f1
--- /dev/null
+++ b/doc/es/Inicio rápido
@@ -0,0 +1,161 @@
+Este documento es una traducción parcial del archivo README inglés. El
+documento original tiene mucha más información, así que si aquí no
+encuentras lo que necesitas, y entiendes algo de inglés, intenta
+buscar en el README original.
+
+Para conseguir más información, listas de compatibilidad, instrucciones para
+colaborar económicamente, la última actualización, informes de progreso,
+etcétera, por favor, visita la página oficial de ScummVM: http://www.scummvm.org/
+
+Contenidos:
+------------------
+1.0) Introducción
+ * 1.1 Sobre ScummVM
+ * 1.2 Inicio rápido
+2.0) Contactar
+ * 2.1 Informar de fallos
+
+1.0) Introducción:
+---- -------------
+
+1.1) Sobre ScummVM:
+---- --------------
+ScummVM es un programa que permite ejecutar ciertas aventuras gráficas
+clásicas, siempre y cuando tengas los archivos originales. Lo interesante
+es que ScummVM reemplaza los ejecutables que traen los juegos, así que
+puedes jugarlos en sistemas para los que no fueron diseñados.
+
+En sus inicios, fue creado para ejecutar los juegos SCUMM de LucasArts,
+como Maniac Mansion, Monkey Island, Day of the Tentacle o Sam & Max.
+SCUMM viene de 'Script Creation Utility for Maniac Mansion', que fue
+el primer juego de LucasArts que utilizó este sistema, y más adelante
+daría nombre a ScummVM ('VM' viene de Virtual Machine o Máquina Virtual).
+
+Con el tiempo se ha añadido compatibilidad con otros juegos que no
+utilizan SCUMM, así que ScummVM ahora puede ejecutar muchos de los
+juegos AGI y SCI de Sierra (como King's Quest 1-6, Space Quest 1-5...),
+Mundodisco 1 y 2, Simon the Sorcerer 1 y 2, Beneath a Steel Sky, Lure
+of the Temptress, Broken Sword I y II, Flight of the Amazon Queen,
+Gobliiins 1-3, la saga The Legend of Kyrandia, muchos de los juegos
+SCUMM para niños de Humongous Entertainment (como los juegos de
+Freddi Fish y Putt Putt), y varios más. Puedes encontrar una lista
+completa de los títulos compatibles en la página de compatibilidad.
+ScummVM mejora continuamente, así que consúltala a menudo.
+
+Estos juegos se pueden ejecutar en ordenadores de sobremesa (con
+Windows, Linux, Mac OS X...), videoconsolas (Dreamcast, Nintendo DS
+y Wii, Ps2, PSP...), y smartphones (Android, iPhone, PocketPC,
+Symbian...), entre otros sistemas.
+
+ScummVM sigue en pleno desarrollo. Recuerda que, aunque procuramos que
+los juegos se puedan completar sin errores graves, es posible que
+se produzcan cuelgues, y no ofrecemos garantía. En cualquier caso,
+algunos de los juegos llevan mucho tiempo siendo compatibles, y
+deberían funcionar correctamente con cualquier versión estable reciente.
+Puedes hacerte una idea de qué tal funciona cada uno consultando
+la página de compatibilidad. Y si navegas un poco por Internet puede que
+compruebes que ScummVM se utiliza comercialmente para reeditar, en
+plataformas modernas, algunos de los juegos compatibles. Esto demuestra
+que varias compañías están satisfechas con la calidad del programa, y lo
+bien que se ejecutan muchos de los títulos.
+
+Si te gusta ScummVM, puedes hacer una donación utilizando el botón de
+PayPal en la página de ScummVM. Esto nos ayudará a la hora de adquirir
+herramientas para desarrollar el programa con más facilidad y rapidez.
+Si no puedes donar, también puedes colaborar con un parche.
+
+1.2) Inicio rápido:
+---- ------------
+IMPORTANTE: Esta guía da por hecho que estás utilizando ScummVM en
+español. Por defecto, ScummVM utiliza el idioma de tu sistema
+operativo. Si prefieres usarlo en inglés, quizás también
+prefieras seguir la guía del archivo README inglés.
+
+Para los impacientes, estos son los cinco pasos básicos para
+hacer funcionar ScummVM:
+
+1. Descarga ScummVM desde <http://www.scummvm.org/downloads.php> e
+instálalo.
+
+2. Crea una carpeta en tu disco duro y copia los archivos originales
+del juego. Repite esto para cada juego que quieras ejecutar (es mejor
+utilizar carpetas diferentes para cada uno).
+
+3. Ejecuta ScummVM.
+
+Si ScummVM se ejecuta en inglés en vez de español, haz lo siguiente
+para cambiar el idioma:
+- Haz clic en 'Options'.
+- Haz clic en la flecha derecha en la barra de pestañas y selecciona la
+pestaña 'Misc'.
+- Selecciona 'Español' en la casilla 'GUI Language' y haz clic en 'OK'.
+- Cierra el mensaje que aparece, haz clic en 'Quit' para cerrar ScummVM
+y reinicia el programa.
+
+Ahora haz clic en 'Añadir juego', selecciona el directorio en el que se
+encuentran los archivos del juego (no intentes seleccionar los
+archivos en sí) y pulsa 'Aceptar'.
+
+4. Debería aparecer una ventana que permite configurar varias
+opciones (aunque no tendría que haber problemas si dejas todo tal
+y como está). Pulsa 'Aceptar'.
+
+5. Selecciona el juego que quieres ejecutar en la lista, y pulsa 'Jugar'.
+
+ScummVM recuerda los juegos que has añadido, así que, si cierras el
+programa, la próxima vez que lo abras la lista seguirá mostrando todos
+los juegos que hayas añadido. Por lo tanto, puedes ir directamente al
+paso 5, salvo que quieras añadir más.
+
+Consejo: si quieres añadir varios juegos a la vez, mantén pulsada
+la tecla Mayúsculas antes de hacer clic en 'Añadir juego'. El
+botón cambiará a 'Añadir varios', y si lo pulsas podrás seleccionar
+de nuevo un directorio, pero en esta ocasión ScummVM buscará juegos
+compatibles en todos los subdirectorios.
+
+
+2.0) Contacto:
+---- --------
+La forma más fácil de contactar con el equipo de ScummVM es enviando
+un informe de fallos (consulta la sección 2.1) o utilizando nuestros
+foros en http://forums.scummvm.org . También puedes unirte a la lista
+de correo scummvm-devel y enviar un e-mail, o chatear con nosotros en
+IRC (#scummvm en irc.freenode.net). Por favor, no nos pidas que añadamos
+compatibilidad para un juego no compatible; lee primero la sección de
+preguntas frecuentes en nuestra página. Recuerda que el idioma oficial
+del foro, la lista de correo y el chat es el inglés, y no se debe
+utilizar otro.
+
+
+2.1) Informar de fallos:
+---- ---------------
+Para informar de un fallo, regístrate en SourceForge y haz clic
+en el enlace "Bug Tracker" de nuestra página web. Por favor,
+asegúrate de que el fallo es reproducible y de que sigue
+ocurriendo en la última actualización diaria (git). Comprueba
+también la lista de problemas conocidos (más abajo), y la lista
+de compatibilidad de ese juego concreto, para confirmar que
+no se trata de un fallo ya conocido:
+
+ http://www.scummvm.org/compatibility_stable.php
+
+Por favor, no informes de fallos en juegos que no aparezcan como
+completables en la sección de juegos compatibles. Ya sabemos que
+esos tienen fallos.
+
+Debes incluir la siguiente información:
+ - Versión de ScummVM (por favor, prueba la última versión diaria o git).
+ - Detalles sobre el fallo, e instrucciones sobre cómo reproducirlo.
+ - Idioma del juego (inglés, alemán...).
+ - Versión del juego (doblada, disquete...).
+ - Plataforma y compilador (Win32, Linux, FreeBSD...).
+ - Adjunta una partida guardada si es posible.
+ - Si el fallo ha aparecido recientemente, comenta cuál fue la última
+ versión en la que no ocurría y cuál es la versión en la que empezó
+ a ocurrir. De este modo, podemos ver los cambios que se han hecho
+ para arreglarlo con más rapidez.
+
+Por último, informa de cada fallo por separado; no juntes varios
+fallos en el mismo informe, ya que resulta difícil seguir el
+estado de cada uno. Y, por favor, recuerda que todos los informes
+de fallos deben escribirse en inglés.
diff --git a/doc/translations/README-fr.txt b/doc/fr/DemarrageRapide
index 186f0cd24d..bf8ddf28e0 100755..100644
--- a/doc/translations/README-fr.txt
+++ b/doc/fr/DemarrageRapide
@@ -4,7 +4,7 @@ trouvez pas ce que vous cherchez dans ce document et que vous comprenez
un peu l'anglais, jetez un coup d'oeil au fichier README anglais.
Pour plus d'informations, liste des jeux compatibles, détails pour
-donner de l'argent, la dernière version disponibles et bien plus encore,
+faire un don, la dernière version disponibles et bien plus encore,
visitez le site web de ScummVM à l'adresse http://www.scummvm.org/
Table des matières:
@@ -34,7 +34,7 @@ for Maniac Mansion', qui a été le premier jeu pour lequel LucasArts a
conçu ce système. Et beaucoup plus tard, il donna son nom à ScummVM
('VM' signifiant Virtual Machine).
-Au cours du temps de nombreux jeux non-SCUMM ont été ajouté, et ScummVM
+Au cours du temps de nombreux jeux non-SCUMM ont été ajoutés, et ScummVM
prend désormais en charge de nombreux jeux Sierra AGI et SCI (tels que
King's Quest 1-6, Space Quest 1-5, ...), Discworld 1 et 2, Simon the
Sorcerer 1 et 2, Beneath A Steel Sky, Lure of the Temptress, Les
@@ -75,7 +75,7 @@ aussi proposer des patches!
IMPORTANT: Les instructions ci-dessous supposent que vous utilisez
ScummVM en Français. Par défaut, ScummVM utilise la langue de votre
système d'exploitation. Si vous préférez utiliser ScummVM en Anglais,
-vous pouvez plutôt utiliser le guide du fichier README Anglais.
+il est sans doute préférable de lire le fichier README Anglais.
Pour les plus impatients, voici comment obtenir ScummVM en cinq étapes
@@ -121,13 +121,13 @@ Astuce: Si vous souhaitez ajouter plusieurs jeux d'un coup, essayez
d'appuyer et de maintenir la touche Maj (Shift) tout en cliquant sur
'Ajouter...' - son texte changera en 'Ajout Massif…'. Vous serez alors
invitez à sélectioner un répertoire dans lequel ScummVM parcourra tous
-les sous-répertoire à la recherche de jeux supportés.
+les sous-répertoires à la recherche de jeux supportés.
2.0) Contact:
---- --------
-La meilleure façon de contacter l'équipe de ScummVM est en soumettant
-des rapports de bogues (voir section 2.1) ou en utilisant nos forums
+La meilleure façon de contacter l'équipe de ScummVM est de soumettre
+des rapports de bogues (voir section 2.1) ou d'utiliser nos forums
http://forums.scummvm.org. Vous pouvez également envoyer un e-mail sur
la liste de diffusion scummvm-devel, ou discuter avec nous sur IRC
(#scummvm sur irc.freenode.net). S'il vous plaît ne nous demandez pas de
@@ -169,4 +169,3 @@ Enfin, veuillez signaler chaque problème séparément, sinon, il devient
difficile de suivre l'état de chaque problème individuel. S'il vous
plaît gardez à l'esprit également que tous les rapports de bogue doivent
être rédigés en anglais.
-
diff --git a/doc/he/bink-md5s.txt b/doc/he/bink-md5s.txt
deleted file mode 100644
index 5cfcc1c4af..0000000000
--- a/doc/he/bink-md5s.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-(soccer2004 russian cd) // uses bink but just for external three files
-sev
-F:\HEdev\scummsys\SPUTM\Src\SrcPWin\*.cpp
-2808c81e388743998b3c7331501cc4dd Soccer2004.(a)
-7e358891079c9f366184211d14707a70 Soccer2004.(b)
-c4ffae9fac495475d6bc3343ccc8faf9 Soccer2004.HE0
-b6eae47432b9545d33d4d867cef0b4ae Soccer2004.he3
-c83971b2f2020bf68724df52c9ae70a8 soccer2004.he2
-212776c1a2dc3d44a393afc4611afbc3 soccer2004.he4
-8f70113f7c01f7bfe9f83f02749d449d soccer2004.he9
-5fba7c0899429399f944a0353307863c DATA/helogo.da2
-56ed9865373c4fe63e8986989ef75999 DATA/infogrames.da2
-678dc9831679dd3f09933d0e568f6d3c DATA/intro.da2
-
-(soccer2004 cd) // uses bink but just for external three files
-sev
-F:\HEdev\scummsys\SPUTM\Src\SrcPWin\*.cpp
-e10cb34c774852175134fe166a602012 Soccer2004.(a)
-8acec50e5cd48830121a3b22a8bfaa46 Soccer2004.(b)
-c4ffae9fac495475d6bc3343ccc8faf9 Soccer2004.HE0
-b6eae47432b9545d33d4d867cef0b4ae Soccer2004.he3
-c83971b2f2020bf68724df52c9ae70a8 soccer2004.he2
-212776c1a2dc3d44a393afc4611afbc3 soccer2004.he4
-8f70113f7c01f7bfe9f83f02749d449d soccer2004.he9
-5fba7c0899429399f944a0353307863c DATA/helogo.da2
-56ed9865373c4fe63e8986989ef75999 DATA/infogrames.da2
-678dc9831679dd3f09933d0e568f6d3c DATA/intro.da2
-
diff --git a/doc/he/md5s.txt b/doc/he/md5s.txt
deleted file mode 100644
index 5007298b26..0000000000
--- a/doc/he/md5s.txt
+++ /dev/null
@@ -1,2861 +0,0 @@
-$Id$
-
-TODO khalek
-* hfs data on puttputt
-* hfs data on spyfox
-* extract & md5sum from farm cd hfs
- - Fatty Bear Demo.sea
- - Putt-Putt Moon Demo.sea
- - Putt-Putt's Demo.sea
-* misc other bits
-
-TODO sev
-* hfs data on all CDs
-
-(baseball cd hfs)
-Joachim
-5494820d943b126282b31a7d00645400 BaseBall
-cf8d13446ec6cb6222287a925fd47c1d BaseBall (0)
-a37e1eb72b969d1461075b7f3d9dd323 BaseBall (1)
-c37abed5add924975fad0df9417a8885 BaseBall (2)
-cb029eb006c1758aa992e28af7e036db BaseBall (4)
-91b6158bc7ec68da700f90e0fabab4b8 BaseBall (9)
-d41d8cd98f00b204e9800998ecf8427e BaseBall (r)
-
-(baseball cd)
-sev, Joachim
-D:\Scummsys.90\sputm.90\*.c
-
-c0c0934580cde95879bef0b6a5a49c29 BASEBALL.D32
-58843bf6425883bbe143b96d11d56582 BASEBALL.EXE
-cf8d13446ec6cb6222287a925fd47c1d BASEBALL.HE0
-a37e1eb72b969d1461075b7f3d9dd323 BASEBALL.HE1
-c37abed5add924975fad0df9417a8885 BASEBALL.HE2
-cb029eb006c1758aa992e28af7e036db BASEBALL.HE4
-91b6158bc7ec68da700f90e0fabab4b8 BASEBALL.HE9
-7989c98adce2b84cd710818c950616ac BASEBALL.W32
-57a68828de21e1afa208d0a5ea2fdf92 BASEBALL.X32
-
-
-(baseball2001 cd hfs)
-kirben
-???
-
-(baseball2001 cd)
-kirben
-???
-
-(bb2demo cd hfs)
-khalek, sev
-???
-
-(humongous ftp)
-2000-05-01 16:09 bb2demo.W32
-khalek, sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-0b38fda342fdaa5e206b2a82c8ab6b9b bb2demo.(a)
-a194f15f51ee62badab74b9e7da97693 bb2demo.HE0
-04862d3b91c49585400f1021bdb9faa1 bb2demo.he2
-0b3a9ff634f2fabb695358aa591154b3 bb2demo.he4
-17255b19a57a1ba0c35802b1b01792f7 BB2demo.HE9
-04770d822d0e78cf13bbf1870de3528b bb2demo.W32
-
-(baseball2003 cd hfs)
-sev
-???
-
-(baseball2003 cd)
-sev
-c:\Build\SRC\SPUTM\Src\SrcPWin\*.cpp
-e0ea75ae94e527652ebd56b26140998c baseball2003.(a)
-324f57a63fd20746195810b61a82b711 baseball2003.(b)
-ba5635a315af707462b7681189287832 Baseball2003.exe
-efe0a04a703e765ebebe92b6c8aa6b86 baseball2003.HE0
-c47186351316e17552532e6c31bf951a baseball2003.he2
-63d581c9548045ee8bc90633f4d123da baseball2003.he3
-fe816c17a87ed5420f1440c85e34f72e baseball2003.he4
-7f06715731111bfe639cde435ec3b650 baseball2003.he9
-b2e1d0e25ed9dbe0ea47ef1a5204ac4a DATA/infogrames.da2
-755a5cf5515610e30370a0afb7d1bc7b DATA/intro.da2
-
-(football cd hfs)
-Joachim
-b1376bcd9c9addb7ffec43455f41f9db Football
-7fc6cdb46b4c9d384c52327f4bca6416 FootBall (0)
-6c33bde70c28c2eac78de8b9f3add1b4 FootBall (2)
-8d02e9002b8033c00bbaf3d71bb695cc FootBall (4)
-435ae8ebf6998b1ea395a5989457985f FootBall (a)
-7df3c5eb3575aef947729213d6c3a877 FootBall (b)
-7c44b542163266658a6110fd03973e6c Football (i)
-d41d8cd98f00b204e9800998ecf8427e FootBall (r)
-c9ca805103de1888a331a98f98bab22a football (u)
-
-(football cd)
-sev, Joachim
-C:\Dev\Project\SPUTM\Src\*.cpp
-
-435ae8ebf6998b1ea395a5989457985f FOOTBALL.(A)
-7df3c5eb3575aef947729213d6c3a877 FOOTBALL.(B)
-ccca9a823d117afb1a882fd707586bf0 FOOTBALL.D32
-b9e149d859b6b4ab1906ea670c4c7449 football.esk
-af00c36fe744362cb60349f61db78e16 Football.exe
-7fc6cdb46b4c9d384c52327f4bca6416 FOOTBALL.HE0
-6c33bde70c28c2eac78de8b9f3add1b4 FOOTBALL.HE2
-8d02e9002b8033c00bbaf3d71bb695cc football.he4
-a7e708342776af913fb70c842310379f football.mmz
-e03725ba7069e7a94c28168b70dc99c4 FOOTBALL.R32
-07656b959c7febb6359c8de5fd6b6f76 FOOTBALL.U32
-1671f9302d4eca3bfcccc7d68d75d42a FOOTBALL.W32
-
-
-(pajama3 hfs)
-Joachim
-51c909630d8ca434c6e1dfe070a15792 Football Demo
-425205754fa749f4f0b0dd9d09fa45fd FootBall Demo (0)
-bf65bf5fbfd26a63f7bd32437a960667 FootBall Demo (2)
-9e53fbcf1061636d3d192c786c4e3b7b FootBall Demo (4)
-b79809888128b1d31080664487c8fc5e FootBall Demo (a)
-d41d8cd98f00b204e9800998ecf8427e Football Demo (i)
-d41d8cd98f00b204e9800998ecf8427e FootBall Demo (r)
-c9ca805103de1888a331a98f98bab22a Football Demo (u)
-
-(pajama3 cd)
-Joachim
-b79809888128b1d31080664487c8fc5e footdemo.(a)
-ccca9a823d117afb1a882fd707586bf0 footdemo.d32
-afd8621bd60d686ebc97ef259a6f0fe0 footdemo.exe
-425205754fa749f4f0b0dd9d09fa45fd footdemo.HE0
-bf65bf5fbfd26a63f7bd32437a960667 footdemo.he2
-9e53fbcf1061636d3d192c786c4e3b7b footdemo.he4
-07656b959c7febb6359c8de5fd6b6f76 FOOTDEMO.U32
-
-(puttsfunshop hfs/samsfunshop hfs/freddisfunshop hfs/freddicove hfs)
-Joachim
-51c909630d8ca434c6e1dfe070a15792 Football Demo
-5bd335265a61caa3d78956ad9f88ba23 FootBall Demo (0)
-bf65bf5fbfd26a63f7bd32437a960667 FootBall Demo (2)
-9e53fbcf1061636d3d192c786c4e3b7b FootBall Demo (4)
-bb6ec9a3a2a016b239367c2b26d9ee3b FootBall Demo (a)
-d41d8cd98f00b204e9800998ecf8427e Football Demo (i)
-d41d8cd98f00b204e9800998ecf8427e FootBall Demo (r)
-c9ca805103de1888a331a98f98bab22a Football Demo (u)
-
-(putsfunshop cd/pajama3 cd/spyozon cd/freddicove cd/freddisfunshop cd/samsfunshop cd/pajama win cd)
-sev, Joachim (Comment by Joachim: this version is not on the pajama3 cd for me, see above)
-C:\Dev\Project\SPUTM\Src\*.cpp
-bb6ec9a3a2a016b239367c2b26d9ee3b FOOTDEMO.(A)
-ccca9a823d117afb1a882fd707586bf0 footdemo.d32
-afd8621bd60d686ebc97ef259a6f0fe0 footdemo.exe
-5bd335265a61caa3d78956ad9f88ba23 FOOTDEMO.HE0
-bf65bf5fbfd26a63f7bd32437a960667 footdemo.he2
-9e53fbcf1061636d3d192c786c4e3b7b footdemo.he4
-07656b959c7febb6359c8de5fd6b6f76 FOOTDEMO.U32
-
-(football demo hfs)
-khalek
-???
-
-(football demo)
-khalek
-???
-
-(football2002 cd hfs) // uses Bink as external files. 137 files
-Joachim
-4bfe515242f8ee4cc01b9fc4cf52b29a Football 2002
-d0549508a06bbb9f99ed19c9e97891f3 Football 2002 (0)
-7c6f5da8f9d223942ff387c3b3b1262a Football 2002 (2)
-eded7062b612284a62df6be9e37e8d9e Football 2002 (3)
-5f22d1edf87e08f151c93726684d47a5 Football 2002 (4)
-b81d20adb6371ed620fedcc0156c6fb7 Football 2002 (a)
-1e45c754359ca021d50cc6776f3240a6 Football 2002 (b)
-4017d76fa35c60e64011d333443dfa9c Football 2002 (i)
-932e34469fd78234fff755a22960114d football 2002 (u)
-
-(football2002 cd) // uses Bink as external files. 137 files
-c:\SRC_RELEASE\SPUTM\Src\SrcPWin\*.cpp
-Joachim
-b81d20adb6371ed620fedcc0156c6fb7 Football2002.(a)
-1e45c754359ca021d50cc6776f3240a6 Football2002.(b)
-7894dd82c874b535dc8acadef0950be4 Football2002.exe
-d0549508a06bbb9f99ed19c9e97891f3 Football2002.HE0
-7c6f5da8f9d223942ff387c3b3b1262a Football2002.HE2
-eded7062b612284a62df6be9e37e8d9e Football2002.HE3
-5f22d1edf87e08f151c93726684d47a5 Football2002.HE4
-
-(football2002 cd hfs)
-???
-
-(football2002 cd) // uses Bink as external files. 137 files
-2001-09-11 14:22 football2002.exe
-khalek (Comment by Joachim: I completed the deatils with details from above, I hope this is right)
-C:\SRC_RELEASE\SPUTM\Src\SrcPWin\*.cpp
-b81d20adb6371ed620fedcc0156c6fb7 Football2002.(a)
-20aca400df5f580e4d3c019c3386d361 Football2002.(b)
-2234bbc4d12a09fadf8540343eb1c00e football2002.exe
-2e85f7aa054930c692a5b1bed1dfc295 Football2002.HE0
-7c6f5da8f9d223942ff387c3b3b1262a Football2002.HE2
-eded7062b612284a62df6be9e37e8d9e Football2002.HE3
-5f22d1edf87e08f151c93726684d47a5 Football2002.HE4
-
-(soccer cd hfs)
-Joachim
-462a01a55236b1dc5aa3ea543bbfc904 Soccer
-701246819d1a70573f41bf33fc19214f Soccer (0)
-6b8840d83784dbceb44f9d8694fce9d4 Soccer (2)
-b50ac4df3a13b7ccc73e68dae5851d36 Soccer (4)
-6a89ce2925a36a1d9e0d9e9f7060c533 Soccer (9)
-a70431a271fd64eb958bab0a75b9db5b Soccer (A)
-d41d8cd98f00b204e9800998ecf8427e Soccer (r)
-8605a367b4d66e756ccc00c8b6a22e0b Soccer (u)
-
-(soccer cd)
-sev, Joachim
-D:\scummsys.98\sputm.98\*.c
-a70431a271fd64eb958bab0a75b9db5b SOCCER.(A)
-ccca9a823d117afb1a882fd707586bf0 soccer.d32
-431076c63ffa5b0caf66dbe03c1eef30 SOCCER.EXE
-701246819d1a70573f41bf33fc19214f SOCCER.HE0
-6b8840d83784dbceb44f9d8694fce9d4 SOCCER.HE2
-b50ac4df3a13b7ccc73e68dae5851d36 SOCCER.HE4
-6a89ce2925a36a1d9e0d9e9f7060c533 SOCCER.HE9
-ed64133f8cdfca57fb3cd09057def978 SOCCER.U32
-db16386ae24902866ec908c31f58dd6c Soccer.w32
-
-
-(soccerMLS cd hfs)
-???
-
-(soccerMLS cd)
-sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-bda62f35e0ce1f910d63f0713b3426cb SoccerMLS.(a)
-9705d481fd818835e68bb3ac3ddaf787 SoccerMLS.exe
-bfdf584b01503f0762baded581f6a0a2 SoccerMLS.he0
-b44275bf54bfa7e01548eec5b7101ed9 SoccerMLS.he2
-a8fa25dc67dee77f009fe5fb59b1961a SoccerMLS.he4
-6a89ce2925a36a1d9e0d9e9f7060c533 SoccerMLS.he9
-
-(soccer2004 cd) // uses bink but just for external three files
-sev
-F:\HEdev\scummsys\SPUTM\Src\SrcPWin\*.cpp
-e10cb34c774852175134fe166a602012 Soccer2004.(a)
-8acec50e5cd48830121a3b22a8bfaa46 Soccer2004.(b)
-c4ffae9fac495475d6bc3343ccc8faf9 Soccer2004.HE0
-b6eae47432b9545d33d4d867cef0b4ae Soccer2004.he3
-c83971b2f2020bf68724df52c9ae70a8 soccer2004.he2
-212776c1a2dc3d44a393afc4611afbc3 soccer2004.he4
-8f70113f7c01f7bfe9f83f02749d449d soccer2004.he9
-5fba7c0899429399f944a0353307863c DATA/helogo.da2
-56ed9865373c4fe63e8986989ef75999 DATA/infogrames.da2
-678dc9831679dd3f09933d0e568f6d3c DATA/intro.da2
-
-(soccer2004 cd russian) // uses bink but just for external three files
-sev
-F:\HEdev\scummsys\SPUTM\Src\SrcPWin\*.cpp
-2808c81e388743998b3c7331501cc4dd Soccer2004.(a)
-7e358891079c9f366184211d14707a70 Soccer2004.(b)
-c4ffae9fac495475d6bc3343ccc8faf9 Soccer2004.HE0
-b6eae47432b9545d33d4d867cef0b4ae Soccer2004.he3
-c83971b2f2020bf68724df52c9ae70a8 soccer2004.he2
-212776c1a2dc3d44a393afc4611afbc3 soccer2004.he4
-8f70113f7c01f7bfe9f83f02749d449d soccer2004.he9
-5fba7c0899429399f944a0353307863c DATA/helogo.da2
-56ed9865373c4fe63e8986989ef75999 DATA/infogrames.da2
-678dc9831679dd3f09933d0e568f6d3c DATA/intro.da2
-
-(thinkerk cd hfs)
-Joachim
-0c8f2ebce5116dc8a4fd7cd971cab19b ThinkerK
-92fc0073a4cf259ff36070ecb8628ba8 ThinkerK (0)
-2b06d67c5332c84d389fa681961920da ThinkerK (1)
-61b858cb5e97fc2960e74b18297be540 ThinkerK (2)
-06a5613cf59c7fdb5d5b888142d6d8b4 ThinkerK (4)
-d41d8cd98f00b204e9800998ecf8427e ThinkerK (r)
-
-(thinkerk cd)
-kirben, Joachim
-c0c0934580cde95879bef0b6a5a49c29 THINKERK.D32
-37b4a8ce5bc28bc958c2c2548a453d31 THINKERK.EXE
-92fc0073a4cf259ff36070ecb8628ba8 THINKERK.HE0
-2b06d67c5332c84d389fa681961920da THINKERK.HE1
-61b858cb5e97fc2960e74b18297be540 THINKERK.HE2
-06a5613cf59c7fdb5d5b888142d6d8b4 THINKERK.HE4
-b10981a0805c37cda1420f29745d6537 THINKERK.W32
-
-(freddi cd hfs)
-khalek
-1997-12-09 19:59 Kinddemo
-9c445edf28ee4a2a7b3ff36ea1f75c05 Kinddemo
-695fe0b3963333b7e15b37514db3c745 Kinddemo (0)
-d3af0fb2011b158a28c43480fb59c588 Kinddemo (1)
-e5da782a19575d12ff98feb74f7602e3 Kinddemo (2)
-ba7a9148040e2421c4129b1d32c40627 Kinddemo (4)
-d41d8cd98f00b204e9800998ecf8427e Kinddemo (r)
-
-(ftp/pajama2 cd/puttrace cd/freddi3 cd/soccer cd)
-1997-09-03 18:32 kinddemo.w32
-khalek, sev, Joachim
-D:\Scummsys.90\sputm.90\*.c
-c0c0934580cde95879bef0b6a5a49c29 KINDDEMO.D32
-37b4a8ce5bc28bc958c2c2548a453d31 KINDDEMO.EXE
-695fe0b3963333b7e15b37514db3c745 KINDDEMO.HE0
-d3af0fb2011b158a28c43480fb59c588 KINDDEMO.HE1
-e5da782a19575d12ff98feb74f7602e3 KINDDEMO.HE2
-ba7a9148040e2421c4129b1d32c40627 KINDDEMO.HE4
-b10981a0805c37cda1420f29745d6537 KINDDEMO.W32
-
-(thinker1 cd hfs)
-Joachim
-cd7d15788407e42cb2d25e91bcb5649f Thinker1
-5c21fc49aee8f46e58fef21579e614a1 Thinker1 (0)
-d208e601cbeda1082aae9959bc80d736 Thinker1 (1)
-2e3a3f3cf83a6125a9bc0637dcd3daec Thinker1 (2)
-70d4c5fcba615fca984a3cb4bc42fb6a Thinker1 (4)
-d41d8cd98f00b204e9800998ecf8427e Thinker1 (r)
-
-(thinker1 cd)
-Joachim
-c0c0934580cde95879bef0b6a5a49c29 THINKER1.D32
-ac403714308c2a6200bbffd4cd49c77c THINKER1.EXE
-5c21fc49aee8f46e58fef21579e614a1 THINKER1.HE0
-d208e601cbeda1082aae9959bc80d736 THINKER1.HE1
-2e3a3f3cf83a6125a9bc0637dcd3daec THINKER1.HE2
-70d4c5fcba615fca984a3cb4bc42fb6a THINKER1.HE4
-dafbd5699d72d4b985f1f6c46ae9a556 THINKER1.W32
-
-(1grademo hfs)
-???
-
-1997-09-03 14:21 1grademo.w32
-khalek
-D:\Scummsys.90\sputm.90\*.c
-0f5935bd5e88ba6f09e558d64459746d 1grademo.he0
-e41b3ba697f00251fdefd7d64a8cf125 1grademo.he1
-007961d43ada4cca6f15b2dcedcb695e 1grademo.he2
-ae77dc6ff68d6fdfb23e5f792f91ab2d 1grademo.he4
-5d4a7c36dee1a11ed50d260f8413c27a 1grademo.w32
-
-(puttsfunshop cd hfs/puttcircus cd hfs/freddisfunshop cd hfs/samsfunshop cd hfs)
-Joachim
-fcd508025e1963a619b2aec191907f22 BluesABCTimeDemo
-7ddeaf52c8b9a50551ce0aa2ac811d07 BluesABCTimeDemo (0)
-e4a7e95b00feb1a3e13b542c164c7ff3 BluesABCTimeDemo (2)
-de94e921f02e3b4c6e061aab0f4cc339 BluesABCTimeDemo (4)
-06fee308ab288ece9b2ab18f9c7b9f41 BluesABCTimeDemo (a)
-d41d8cd98f00b204e9800998ecf8427e BluesABCTimeDemo (r)
-
-
-(puttsfunshop cd/pajama3 cd/puttcircus cd/freddisfunshop cd/samsfunshop cd)
-1998-07-26 13:36 BLUESABCTIMEDEMO.W32
-khalek, sev, Joachim
-D:\scummsys.98\sputm.98\*.c
-06fee308ab288ece9b2ab18f9c7b9f41 BluesABCTimeDemo.(a)
-ccca9a823d117afb1a882fd707586bf0 BluesABCTimeDemo.d32
-f67221ca7890906f29ab38aedafb0802 BluesABCTimeDemo.exe
-7ddeaf52c8b9a50551ce0aa2ac811d07 BluesABCTimeDemo.HE0
-e4a7e95b00feb1a3e13b542c164c7ff3 BluesABCTimeDemo.he2
-de94e921f02e3b4c6e061aab0f4cc339 BluesABCTimeDemo.he4
-
-(puttrace cd hfs/freddi4 cd hfs/puttzoo cd hfs/pajama3 cd hfs)
-Joachim
-fcd508025e1963a619b2aec191907f22 BluesABCTimeDemo
-810a9da887aefa597b0cf3c77d262897 BluesABCTimeDemo (0)
-5800ab15c53341fa4b4470cd20c2affa BluesABCTimeDemo (2)
-de94e921f02e3b4c6e061aab0f4cc339 BluesABCTimeDemo (4)
-860eb5a38ce8edef04f614bb50489aab BluesABCTimeDemo (a)
-d41d8cd98f00b204e9800998ecf8427e BluesABCTimeDemo (r)
-
-(puttrace cd/freddi4 cd/puttzoo cd)
-sev, Joachim
-D:\scummsys.98\sputm.98\*.c
-860eb5a38ce8edef04f614bb50489aab BluesABCTimeDemo.(a)
-ccca9a823d117afb1a882fd707586bf0 BluesABCTimeDemo.d32
-f67221ca7890906f29ab38aedafb0802 BluesABCTimeDemo.exe
-810a9da887aefa597b0cf3c77d262897 BluesABCTimeDemo.HE0
-5800ab15c53341fa4b4470cd20c2affa BluesABCTimeDemo.he2
-de94e921f02e3b4c6e061aab0f4cc339 BluesABCTimeDemo.he4
-
-(freddi5 cd hfs) // uses smacker videos
-Joachim
-181b98beb756fe07650608b0357fa934 Blues-ArtTime Demo
-d00ffc8c32d17e575fd985d435d2eb88 Blues-ArtTime Demo (0)
-58c91c3f750b227b136e96b410b0e7cc Blues-ArtTime Demo (2)
-47f0573a8a629c6e7f8b9236112fe10e Blues-ArtTime Demo (4)
-548fcedaa9cee84443a5a9acfff4cb04 Blues-ArtTime Demo (a)
-5272e8074130bdcc431d6ce325e3f0ab Blues-ArtTime Demo (i)
-2f1a08df8aa13924959905fc5dc34a9b Data/intr_at_in_01.dat
-f7841f8a37394805fc0699999898bcca Data/intr_at_in_02.dat
-6a2f8c39d2ce07d422bae9f9bf416839 Data/intr_at_in_20_b.dat
-
-(freddi5 cd) // uses smacker videos
-sev, Joachim
-C:\Dev\Project\SPUTM\Src\SrcPWin\*.cpp
-548fcedaa9cee84443a5a9acfff4cb04 artdemo.(a)
-e856bf226130de0d84bcaaa7ecfb5a3a artdemo.D32
-840be04790ddb035725978e70f7c78f8 ARTDEMO.EXE
-d00ffc8c32d17e575fd985d435d2eb88 artdemo.HE0
-58c91c3f750b227b136e96b410b0e7cc artdemo.he2
-47f0573a8a629c6e7f8b9236112fe10e artdemo.he4
-7e98a8e45cbac83e65d98f3c133ae34d artdemo.w32
-2f1a08df8aa13924959905fc5dc34a9b Data/intr_at_in_01.dat
-f7841f8a37394805fc0699999898bcca Data/intr_at_in_02.dat
-6a2f8c39d2ce07d422bae9f9bf416839 Data/intr_at_in_20_b.dat
-
-(puttsfunshop cd hfs/freddisfunshop cd hfs/samsfunshop cd hfs/pajama3 cd hfs/puttcircus cd hfs) // uses smacker videos
-Joachim
-30ea41602894a180aac747198388bc5e BluesBirthdayDemo
-dbf4d59d70b826733f379f998354d350 BluesBirthdayDemo (0)
-60cc055b47b53cb53eaa89e1f974c888 BluesBirthdayDemo (2)
-0794110b085ee91c2aa4a5fc844ff2f4 BluesBirthdayDemo (4)
-44e5c3d256fe45c334ac772fa2dd23e2 BluesBirthdayDemo (+)
-6ddf8b026cfb9410b560f91f353dc0f4 BluesBirthdayDemo (a)
-409a570e46466aef89c3cd3a30992543 BluesBirthdayDemo (b)
-b46f3aa845f11020d8420d624c120120 BluesBirthdayDemo (i)
-d41d8cd98f00b204e9800998ecf8427e BluesBirthdayDemo (r)
-
-(puttsfunshop cd/freddisfunshop cd/samsfunshop cd/pajama3 cd/puttcircus cd) // uses smacker videos
-sev, Joachim
-D:\scummsys.98\sputm.98\*.c
-6ddf8b026cfb9410b560f91f353dc0f4 BluesBirthdayDemo.(a)
-409a570e46466aef89c3cd3a30992543 BluesBirthdayDemo.(b)
-e07a222d121f7e8b04266bf4d7809cb4 BluesBirthdayDemo.a32
-ccca9a823d117afb1a882fd707586bf0 BluesBirthdayDemo.d32
-6d283612076435baad21d5cc5f40fba3 BluesBirthdayDemo.exe
-dbf4d59d70b826733f379f998354d350 BluesBirthdayDemo.HE0
-60cc055b47b53cb53eaa89e1f974c888 BluesBirthdayDemo.he2
-0794110b085ee91c2aa4a5fc844ff2f4 BluesBirthdayDemo.he4
-
-(puttrace cd hfs) // uses smacker videos
-Joachim
-30ea41602894a180aac747198388bc5e BluesBirthdayDemo
-2d4acbdcfd8e374c9da8c2e7303a5cd0 BluesBirthdayDemo (0)
-dc5e63ecf2672d4a3a0458fe32902a4e BluesBirthdayDemo (2)
-0794110b085ee91c2aa4a5fc844ff2f4 BluesBirthdayDemo (4)
-44e5c3d256fe45c334ac772fa2dd23e2 BluesBirthdayDemo (+)
-18ee74255c93da057c92effbd39ebd9a BluesBirthdayDemo (a)
-409a570e46466aef89c3cd3a30992543 BluesBirthdayDemo (b)
-b46f3aa845f11020d8420d624c120120 BluesBirthdayDemo (i)
-d41d8cd98f00b204e9800998ecf8427e BluesBirthdayDemo (r)
-
-(puttrace cd) // uses smacker videos
-sev, Joachim
-D:\scummsys.98\sputm.98\*.c
-18ee74255c93da057c92effbd39ebd9a BluesBirthdayDemo.(a)
-409a570e46466aef89c3cd3a30992543 BluesBirthdayDemo.(b)
-e07a222d121f7e8b04266bf4d7809cb4 BluesBirthdayDemo.a32
-ccca9a823d117afb1a882fd707586bf0 BluesBirthdayDemo.d32
-e478bdc989beeeaec7e2528a11c88729 BluesBirthdayDemo.exe
-2d4acbdcfd8e374c9da8c2e7303a5cd0 BluesBirthdayDemo.HE0
-dc5e63ecf2672d4a3a0458fe32902a4e BluesBirthdayDemo.he2
-0794110b085ee91c2aa4a5fc844ff2f4 BluesBirthdayDemo.he4
-
-
-(freddi5 cd hfs) // uses smacker videos
-Joachim
-853c41736ce7e4c5d6b3431dd550ea3f Blues-ReadingTime Demo
-95818b178d473c989ac753574e8892aa Blues-ReadingTime Demo (0)
-7c64b87e454e642e36a83c79341007b0 Blues-ReadingTime Demo (2)
-4f307cf26e46f765298cc8f92f02db49 Blues-ReadingTime Demo (4)
-f536221cc5d8da02009278523eda6bd5 Blues-ReadingTime Demo (a)
-5272e8074130bdcc431d6ce325e3f0ab Blues-ReadingTime Demo (i)
-45a973a322b177ee4b36bea81981462d Data/INT_RT_IN_01.DAT
-9e0c144bf1b7f0cc8ba3edae6135e313 Data/INT_RT_IN_03.DAT
-8d150f9d9e12e485da50c4560135b4ef Data/INT_RT_IN_04.DAT
-8cde496829546daaaa28084c49f3f4f7 Data/INT_RT_IN_05.DAT
-c784fa970208b5bd49fff568ca0036ec Data/INT_RT_IN_06.DAT
-
-(freddi5 cd) // uses smacker videos
-sev, Joachim
-C:\Dev\Project\SPUTM\Src\SrcPWin\*.cpp
-f536221cc5d8da02009278523eda6bd5 readdemo.(a)
-e856bf226130de0d84bcaaa7ecfb5a3a readDemo.D32
-2be2b18bf04dcd9d9dc6b16e88b8f811 READDEMO.EXE
-95818b178d473c989ac753574e8892aa readdemo.HE0
-7c64b87e454e642e36a83c79341007b0 readDemo.he2
-4f307cf26e46f765298cc8f92f02db49 readdemo.he4
-eac7453b1dca87447974ef54137470f9 readDemo.w32
-45a973a322b177ee4b36bea81981462d Data/INT_RT_IN_01.DAT
-9e0c144bf1b7f0cc8ba3edae6135e313 Data/INT_RT_IN_03.DAT
-8d150f9d9e12e485da50c4560135b4ef Data/INT_RT_IN_04.DAT
-8cde496829546daaaa28084c49f3f4f7 Data/INT_RT_IN_05.DAT
-c784fa970208b5bd49fff568ca0036ec Data/INT_RT_IN_06.DAT
-
-(fbear cd 3do)
-???
-
-(he classics cd)
-khalek, sev
-6.1.1 (Jun 23 1993 15:31:14)
-9f5ada54fef54f1602bb1b642d0fe412 FBEAR.EXE
-3824e60cdf639d22f6df92a03dc4b131 FBEAR.HE0
-c75f511786a4e0c474660d074c9a421a FBEAR.HE1
-d05d89374e5e459067603cd075dd3134 FBEAR.SNG
-c542564fc561aca36626259455738126 FBEAR.TLK
-
-(fbear cd)
-Joachim
-9f5ada54fef54f1602bb1b642d0fe412 FBEAR.EXE
-3824e60cdf639d22f6df92a03dc4b131 FBEAR.HE0
-c75f511786a4e0c474660d074c9a421a FBEAR.HE1
-d05d89374e5e459067603cd075dd3134 FBEAR.SNG
-0f19cfc74cbeb0a255b289772acad687 FBEAR.TLK
-
-(fbear cd hebrew)
-???
-
-(he classics cd hfs)
-khalek
-3df6ead57930488bc61e6e41901d0e97 Fatty Bear 0
-93cdebdbf8f1ec8c3f05dff0c8fedc82 Fatty Bear 1
-fc3885128832fcb876ccd79124ba36fe Fatty Bear 2
-d05d89374e5e459067603cd075dd3134 Fatty Bear Songs
-
-(fbear cd hfs)
-Joachim
-d41d8cd98f00b204e9800998ecf8427e Fatty Bear
-3df6ead57930488bc61e6e41901d0e97 Fatty Bear 0
-93cdebdbf8f1ec8c3f05dff0c8fedc82 Fatty Bear 1
-110890cbcbbdacdd3a02159cbde20889 Fatty Bear 2
-d05d89374e5e459067603cd075dd3134 Fatty Bear Songs
-
-(he classics cd)
-khalek, sev
-7.0.0 (Feb 7 1995 13:27:40)
-179879b6e35c1ead0d93aab26db0951b FBEAR.HE0
-7f733155adcb049e887fef942e81602a FBEAR.HE1
-fc3885128832fcb876ccd79124ba36fe FBEAR.HE2
-58dfc09f344a9dec565bb914920800d3 FBEAR.HE3
-a6b0d9c55f747f906142ed60c7d780e8 FBEAR.HE4
-d05d89374e5e459067603cd075dd3134 FBEAR.SNG
-564d213162f0375b62a8fc5a3a9ef94d FBEAR.W32
-
-(fbear cd)
-Joachim
-333714828ec2e0bd97a189882bf4e49e FBEAR.EXE
-179879b6e35c1ead0d93aab26db0951b FBEAR.HE0
-7f733155adcb049e887fef942e81602a FBEAR.HE1
-110890cbcbbdacdd3a02159cbde20889 FBEAR.HE2
-58dfc09f344a9dec565bb914920800d3 FBEAR.HE3
-a6b0d9c55f747f906142ed60c7d780e8 FBEAR.HE4
-d05d89374e5e459067603cd075dd3134 FBEAR.SNG
-564d213162f0375b62a8fc5a3a9ef94d FBEAR.W32
-
-6.1.1 (Apr 6 1993 20:48:56)
-khalek
-59c820951585b7dfb0307992bbb275c7 fbdemo.exe
-47e75b1bdcb44c78cb94883d1731ccf8 fbdemo.he0
-7c61c90ec5ceb812698d40b29f356559 fbdemo.he1
-f054dd0158bafd59570794397727c882 fbdemo.tlk
-
-(puttmoon cd hfs/airport cd hfs/jungle cd hfs)
-Joachim
-d41d8cd98f00b204e9800998ecf8427e Fatty Bear Demo
-6df20c50c1ab19799de9be7ae7716881 Fatty Bear Demo 0
-d9e4a20226b6120d2a3d8d3a9a643a86 Fatty Bear Demo 1
-0d95ea172d9c94f4c90b9f542a824ced Fatty Bear Demo 2
-
-(puttputt cd/he classics cd/fbear cd/puttmoon cd)
-khalek, sev, Joachim
-7.0.0 (Feb 7 1995 13:27:40)
-9b44bf1f45abc809cf81fde9ff80e5a7 FBDEMO.EXE
-22c9eb04455440131ffc157aeb8d40a8 FBDEMO.HE0
-5293d81516126086766540ab12a9c499 FBDEMO.HE1
-f054dd0158bafd59570794397727c882 FBDEMO.HE2
-58dfc09f344a9dec565bb914920800d3 FBDEMO.HE3
-76954add1f2c5bd9d967746ab4137d3a FBDEMO.HE4
-564d213162f0375b62a8fc5a3a9ef94d FBDEMO.W32
-
-(freddi cd hfs)
-khalek
-1998-02-18 16:06 Freddi Fish
-560da18bc11f6cf7b068a96dd928ae7e Freddi Fish
-df047cc4792150f601290357566d36a6 Freddi Fish (0)
-d30fb13dd3baa94a4cabe4cc1a6228d1 Freddi Fish (1)
-f2f1e70bd9388c98c0ef38b1ef286ae2 Freddi Fish (2)
-cb0fb189e08144bbc713b8df739ba9fc Freddi Fish (4)
-d41d8cd98f00b204e9800998ecf8427e Freddi Fish (r)
-
-(freddi cd)
-khalek, Joachim
-1998-01-21 02:13 freddi.w32
-D:\Scummsys.90\sputm.90\*.c
-c0c0934580cde95879bef0b6a5a49c29 FREDDI.D32
-2e0253f624f34b56cf888e557d931a3b FREDDI.EXE
-df047cc4792150f601290357566d36a6 FREDDI.HE0
-d30fb13dd3baa94a4cabe4cc1a6228d1 FREDDI.HE1
-f2f1e70bd9388c98c0ef38b1ef286ae2 FREDDI.HE2
-cb0fb189e08144bbc713b8df739ba9fc FREDDI.HE4
-0d6f0f65403bd23afb78c143587d11a8 FREDDI.W32
-
-(freddi cd russian)
-sev
-7.0.0 (Jun 23 1995 09:58:48)
-d4cccb5af88f3e77f370896e9ba8c5f9 FREDDI.HE0
-1705aa5c12a2959f1b69abc1fd145f01 FREDDI.HE1
-199c5c38798ddacce5cfbfe7b31267cf FREDDI.HE2
-6daf76c1fe724ce6bf2e4c5175f39352 FREDDI.HE3
-a176fababbf7944a1d4b5d6521b20f4d FREDDI.HE4
-2085ef0c1d1cc64db1ec52901b4856b9 FREDDI.HE5
-8be6d657bcbda8b4926448e530528d6a FREDDI.W32
-
-(freddi cd dutch)
-adutchguy
-???
-
-(freddi cd german)
-oncer, Joachim
-fc00ad009697e2c9a50dd222f8f40c73 FREDDI.EXE
-cf8ef3a1fb483c5c4b1c584d1167b2c4 FREDDI.HE0
-e3b21adcc7ad12e0b8a0a8fa9bdd30a9 FREDDI.HE1
-1d10f0e80dc84a3dd8331c55f4146ed5 FREDDI.HE2
-6daf76c1fe724ce6bf2e4c5175f39352 FREDDI.HE3
-8e27aebf6d89f8576a08b58e216a6a90 FREDDI.HE4
-842badd1332ab8d6c8fd4e8277e0471c FREDDI.W32
-
-(freddi cd nb)
-Karl Ove Hufthammer
-???
-
-(freddi cd russian updated)
-sev
-D:\Scummsys.90\sputm.90\*.c
-746e88c172a5b7a1ae89ac0ee3ee681a Freddi.HE0
-02b964d6d7a3fcace1bc89ae2a2c9db7 FREDDI.HE1
-14a1058745c609eefa08f1591cc5d4df FREDDI.HE2
-2b219196f0cc74d626a3216932d3ea54 Freddi.he4
-58d117ae89707c7360f403186641e87f FREDDI.W32
-
-(freddi cd swedish)
-Sven Arvidsson
-???
-
-(farm cd hfs/airportcd hfs/jungle cd hfs/thinker1 cd hfs/thinkerk cd hfs/socks cd hfs/baseball cd hfs)
-khalek, Joachim
-1995-09-14 17:35 Freddi Demo
-42f4a55732734e3c54c0b198f2615970 Freddi Demo
-c8aac5e3e701874e2fa4117896f9e1b1 Freddi Demo (0)
-b4805ccd0841854d6b2f596f0efb5551 Freddi Demo (1)
-faca7509c38beabb37b2347b8b6bb1ea Freddi Demo (2)
-a8c3ced34ecb16ad1b0eed5b464ad61e Freddi Demo (4)
-
-(he classics cd hfs/pajama cd hfs/puttzoo cd hfs)
-khalek (comment: is this double entry really necessary?)
-1996-11-17 13:28 Freddi Demo
-42f4a55732734e3c54c0b198f2615970 Freddi Demo
-c8aac5e3e701874e2fa4117896f9e1b1 Freddi Demo (0)
-b4805ccd0841854d6b2f596f0efb5551 Freddi Demo (1)
-faca7509c38beabb37b2347b8b6bb1ea Freddi Demo (2)
-a8c3ced34ecb16ad1b0eed5b464ad61e Freddi Demo (4)
-
-(puttputt cd/puttmoon cd/fbear cd)
-khalek, sev, Joachim
-7.0.0 (Oct 20 1994 10:00:19)
-10f764e586228d090d66bdf43cc5a1ef FREDDEMO.EXE
-084ed0fa98a6d1e9368d67fe9cfbd417 FREDDEMO.HE0
-273e622b5fdf60859b549fee08384a33 FREDDEMO.HE1
-faca7509c38beabb37b2347b8b6bb1ea FREDDEMO.HE2
-6daf76c1fe724ce6bf2e4c5175f39352 FREDDEMO.HE3
-a8c3ced34ecb16ad1b0eed5b464ad61e FREDDEMO.HE4
-0ebc6a8cc24babc41dbfbfb07ee6456f FREDDEMO.W32
-
-(farm cd/airport cd/jungle cd/airport hfs/jungle hfs)
-khalek, Joachim
-7.0.0 (Jun 22 1995 14:06:25)
-e269b675a252296640430feab730e8b7 FREDDEMO.EXE
-0855496dde35356b1a9691e22ba84cdc FREDDEMO.HE0
-5374aef0d7c547a95dc779f4ea51e20f FREDDEMO.HE1
-faca7509c38beabb37b2347b8b6bb1ea FREDDEMO.HE2
-6daf76c1fe724ce6bf2e4c5175f39352 FREDDEMO.HE3
-a8c3ced34ecb16ad1b0eed5b464ad61e FREDDEMO.HE4
-3d43af3f3ecc18744dda721d951e2a2f FREDDEMO.W32
-
-(spyfox cd/pajama cd/puttzoo cd/he classics cd/freddi2 cd/baseball cd/socks cd/thinker1 cd/thinkerk cd)
-khalek, sev, Joachim (comment: all files uppercase on CD)
-7.0.0 (Jul 5 1995 14:46:05)
-e269b675a252296640430feab730e8b7 FREDDEMO.EXE
-566165a7338fa11029e7c14d94fa70d0 FREDDEMO.HE0
-649724a605cb66fef3fac73297ef4259 FREDDEMO.HE1
-faca7509c38beabb37b2347b8b6bb1ea FREDDEMO.HE2
-6daf76c1fe724ce6bf2e4c5175f39352 FREDDEMO.HE3
-a8c3ced34ecb16ad1b0eed5b464ad61e FREDDEMO.HE4
-25003798cd5f4b51bc1f4d02c6a2e218 FREDDEMO.W32
-
-(humongous ftp)
-7.0.0 (Jul 5 1995 14:46:05)
-khalek, sev
-566165a7338fa11029e7c14d94fa70d0 freddemo.he0
-649724a605cb66fef3fac73297ef4259 freddemo.he1
-faca7509c38beabb37b2347b8b6bb1ea freddemo.he2
-6daf76c1fe724ce6bf2e4c5175f39352 freddemo.he3
-a8c3ced34ecb16ad1b0eed5b464ad61e freddemo.he4
-a5459bfe36183cf1f4ced00fe325aa90 freddemo.w32
-
-(freddi2 cd german/freddi2 cd hfs german)
-Joachim
-fc00ad009697e2c9a50dd222f8f40c73 FREDDEMO.EXE
-cf4ef315214c7d8cdab6302cdb7e50db FREDDEMO.HE0
-c4671ee12bcb89be376a8432ac23ce77 FREDDEMO.HE1
-468e8c93b4831ff6e84ac69140f8b603 FREDDEMO.HE2
-6daf76c1fe724ce6bf2e4c5175f39352 FREDDEMO.HE3
-a8c3ced34ecb16ad1b0eed5b464ad61e FREDDEMO.HE4
-842badd1332ab8d6c8fd4e8277e0471c FREDDEMO.W32
-
-(freddi2 cd hfs)
-Kirben
-???
-
-(freddi2 hfs)
-Kirben
-???
-
-(freddi2 cd hfs)
-kirben, Joachim
-91a8077251d21b9a060792f50df91cbc Freddi Fish 2
-51305e929e330e24a75a0351c8f9975e Freddi Fish 2 (0)
-2f0f418ca29e298343a76e4a76ce5d96 Freddi Fish 2 (2)
-c87140d52e550ee923f18789517e61ab Freddi Fish 2 (4)
-722286b727e75a3e44f9333d6b604427 Freddi Fish 2 (a)
-d5920b5082d570d03500fe165bb75c0a Freddi Fish 2 (i)
-d41d8cd98f00b204e9800998ecf8427e Freddi Fish 2 (r)
-
-(freddi2 cd)
-kirben, Joachim
-722286b727e75a3e44f9333d6b604427 Freddi2.(a)
-ccca9a823d117afb1a882fd707586bf0 Freddi2.d32
-c45467455384a11c608530d371d6669e FREDDI2.EXE
-51305e929e330e24a75a0351c8f9975e Freddi2.HE0
-2f0f418ca29e298343a76e4a76ce5d96 Freddi2.he2
-c87140d52e550ee923f18789517e61ab Freddi2.he4
-15e826c4702e0c44018a6b6a31de76ef FREDDI2.w32
-
-(freddi2 cd hfs german)
-Joachim
-5d6f8f48c758f7ce07ace9141bd177d4 Fritzi Fisch 2
-fce4b8010704b103acfeea9413788f32 Fritzi Fisch 2 (0)
-d857b6f3ee3a2347faf589a823be6d6c Fritzi Fisch 2 (1)
-3e25355859e2fc97c88ebebfd63c5c14 Fritzi Fisch 2 (2)
-2b7114ad0e35ca65ec8de54b7acd352d Fritzi Fisch 2 (4)
-
-(freddi2 cd german)
-Joachim
-4c695f3d8015af4277fd284981e0d2c4 FREDDI2.D32
-9d4373de9fd1c25671de1500dbe358a2 FREDDI2.EXE
-fce4b8010704b103acfeea9413788f32 FREDDI2.HE0
-d857b6f3ee3a2347faf589a823be6d6c FREDDI2.HE1
-3e25355859e2fc97c88ebebfd63c5c14 FREDDI2.HE2
-2b7114ad0e35ca65ec8de54b7acd352d FREDDI2.HE4
-e24b9e887a04f66db3edcd5fc81767fd FREDDI2.W32
-
-(freddi2 cd)
-sev
-D:\Scummsrc.80\Sputm\*.c
-5057fb0e99e5aa29df1836329232f101 FREDDI2.HE0
-a586db95af3146aa7793c5e2d0ed9e83 FREDDI2.HE1
-9ff9a777a343e605278127c0bbdde58f FREDDI2.HE2
-d22f1b3bd41cb4901f89164043953bc8 FREDDI2.HE4
-d06066ae0ba8ffb338d6a00f556ae3ac FREDDI2.W32
-
-(freddi2 cd russian)
-sev
-D:\Scummsrc.80\Sputm\*.c
-5057fb0e99e5aa29df1836329232f101 FREDDI2.HE0
-1b6d479d15a7eb4a55c5e90711511b00 FREDDI2.HE1
-53f72ce417e28af51e3b8a60cd6ca5ef FREDDI2.HE2
-52494431dd3f658a8dc1d4348e677e48 FREDDI2.HE4
-a1a7f76f9de6b74031f4d6c9b8cbb130 FREDDI2.W32
-
-(freddi2 cd dutch)
-joostp
-???
-
-(freddi2 cd)
-vampir_raziel
-???
-
-(freddi2 cd russian updated)
-sev
-c:\Build\SRC\SPUTM\Src\SrcPWin\*.cpp
-c40f2b3cf5b82d34afc222779b3f0a7c FreddiCHSH.(a)
-b92b53d360319b1e0fa93d353503fbfd FreddiCHSH.exe
-e41de1c2a15abbcdbf9977e2d7e8a340 FreddiCHSH.he0
-83619bbe6b084ebf1ae53b5a56442719 FreddiCHSH.he2
-c366efa1e6b3d4406b5f3123c2247d8f FreddiCHSH.he4
-
-(freddi cd hfs/he classics hfs/pajama cd hfs/puttzoo cd hfs)
-khalek
-1997-10-28 17:16 Freddi Fish 2 Demo
-d7e1af5d819c98b2f0ec8150f54ad51f Freddi Fish 2 Demo
-fc8d197a22146e74766e9cb0cfcaf1da Freddi Fish 2 Demo (0)
-203cf83989f6410ec19edb9bd1455512 Freddi Fish 2 Demo (1)
-f96261232a8a7ae6bc7478d8c1c5a49c Freddi Fish 2 Demo (2)
-a97bf54bcae67fabb8d6e4a1e506efef Freddi Fish 2 Demo (4)
-
-(spyfox cd/pajama cd/puttzoo cd/he classics cd/pajama2 cd/freddi3 cd/baseball cd)
-khalek, sev, Joachim
-1996-10-17 03:54 ff2-demo.w32
-D:\Scummsrc.80\Sputm\*.c
-9d4373de9fd1c25671de1500dbe358a2 FF2-DEMO.EXE
-fc8d197a22146e74766e9cb0cfcaf1da FF2-DEMO.HE0
-203cf83989f6410ec19edb9bd1455512 FF2-DEMO.HE1
-f96261232a8a7ae6bc7478d8c1c5a49c FF2-DEMO.HE2
-a97bf54bcae67fabb8d6e4a1e506efef FF2-DEMO.HE4
-21935da87e116e29f558145b0c491770 FF2-DEMO.W32
-
-(freddi2 demo hfs)
-???
-
-(ftp)
-2002-06-05 15:23 ffhsdemo.exe
-khalek
-c:\Build\SRC\SPUTM\Src\*.cpp
-874613bc4b14dba444b43e31d843e622 ffhsdemo.exe
-d0a925e6d57938021ce5b1260731ec7d FFHSDemo.(a)
-d37c55388294b66e53e7ced3af88fa68 ffhsdemo.he0
-d0a925e6d57938021ce5b1260731ec7d ffhsdemo.he1
-7480dfa29b4df0002d23c72bb4932dde ffhsdemo.he2
-a97bf54bcae67fabb8d6e4a1e506efef ffhsdemo.he4
-
-(freddi3 cd hfs)
-Joachim
-560da18bc11f6cf7b068a96dd928ae7e Freddi Fish 3
-8368f552b1e3eba559f8d559bcc4cadb Freddi Fish 3 (0)
-89bba1d711672a8b52ac4a47ffcf442c Freddi Fish 3 (1)
-6e95640d43a66bdec5a9b9cd42921881 Freddi Fish 3 (2)
-47fed8094093a2d4d9f8d4f61d51e088 Freddi Fish 3 (4)
-d41d8cd98f00b204e9800998ecf8427e Freddi Fish 3 (r)
-
-(freddi3 cd)
-sev, Joachim
-D:\Scummsys.90\sputm.90\*.c
-c0c0934580cde95879bef0b6a5a49c29 FREDDI3.D32
-56e44f51bd02de77cb75737e45396987 FREDDI3.EXE
-8368f552b1e3eba559f8d559bcc4cadb FREDDI3.HE0
-89bba1d711672a8b52ac4a47ffcf442c FREDDI3.HE1
-6e95640d43a66bdec5a9b9cd42921881 FREDDI3.HE2
-47fed8094093a2d4d9f8d4f61d51e088 FREDDI3.HE4
-88d57485970d3e801364812c82dec001 FREDDI3.W32
-
-(freddi3 cd russian)
-sev
-D:\Scummsys.90\sputm.90\*.c
-8368f552b1e3eba559f8d559bcc4cadb FREDDI3.HE0
-28afc2494f8f5d45726409743c2763cc FREDDI3.HE1
-2be336eb6b1853c3493da984340dc80a FREDDI3.HE2
-211d598c446697f8203857d012d83d67 FREDDI3.HE4
-1f33f143fd76de496215eaa654a60f04 FREDDI3.W32
-
-(freddi3 cd hfs german)
-Joachim
-e228f3d94242920355d8ffc1f478ddb9 FreddiFGT
-83cedbe26aa8b58988e984e3d34cac8e FreddiFGT (0)
-a850841f6486fd5c8f1731f3092abfd0 FreddiFGT (2)
-3aab38ffaee61ada59211fa417231292 FreddiFGT (4)
-1c17cedc8593e0caebbae3ca61a8a78d FreddiFGT (a)
-01368f1a5c87746b09f50363696f5883 FreddiFGT (i)
-
-(freddi3 cd german)
-Joachim
-1c17cedc8593e0caebbae3ca61a8a78d FreddiFGT.(a)
-0fb226dcdd09aaa48dd77925c467d1cd FreddiFGT.D32
-045e9fab1078af432741aff53e6e438b FreddiFGT.exe
-83cedbe26aa8b58988e984e3d34cac8e FreddiFGT.HE0
-a850841f6486fd5c8f1731f3092abfd0 FreddiFGT.HE2
-3aab38ffaee61ada59211fa417231292 FreddiFGT.HE4
-d8fcf115eb08f1fbed13a61a23e37851 FreddiFGT.w32
-
-(freddi3 cd dutch)
-adutchguy
-???
-
-(freddi3 cd russian alt)
-sev
-D:\Scummsys.90\sputm.90\*.c
-898ce8eb1234a955ef75e87141902bb3 FREDDI3.HE0
-78f35e7aab370a3b4e828d317ecd7f27 FREDDI3.HE1
-ba7fe7de583c9b7a1e9173afc5d75b42 FREDDI3.HE2
-ef0df7bdc61977f783dbe1e37f6a15fe FREDDI3.HE4
-88d57485970d3e801364812c82dec001 FREDDI3.W32
-
-(freddi3 cd russian updated)
-sev
-d:\dev\SPUTM\Src\*.cpp
-b2b8622d2a1d954fedf526043fc185eb FreddiSCS.(a)
-75bff95816b84672b877d22a911ab811 FreddiSCS.he0
-39b5ea82513c799a6dba899b950c2977 FreddiSCS.he2
-fff20670a77450240918f8315fcfb33d FreddiSCS.HE4
-199a34d9dd51e79e2a5022c778321af8 freddiSCS.w32
-
-(freddi cd hfs/freddi3 cd hfs/pajama2 cd hfs)
-khalek, Joachim
-1997-12-04 18:25 F3-Mdemo
-e711a6fb0b7330782c6b5ae0e1283084 F3-Mdemo
-cb1559e8405d17a5a278a6b5ad9338d1 F3-Mdemo (0)
-a2fde75fcbd2376f057f4a40f9893cbe F3-Mdemo (1)
-30e3f97a2290f0683ccedf8b08a6ba55 F3-Mdemo (2)
-b90004518ba5bb4dc473170f5c975568 F3-Mdemo (4)
-d41d8cd98f00b204e9800998ecf8427e F3-Mdemo (r)
-
-(pajama2 cd/freddi3 cd/freddi cd)
-sev, Joachim
-D:\Scummsys.90\sputm.90\*.c
-c0c0934580cde95879bef0b6a5a49c29 F3-MDEMO.D32
-56e44f51bd02de77cb75737e45396987 F3-MDEMO.EXE
-cb1559e8405d17a5a278a6b5ad9338d1 F3-MDEMO.HE0
-a2fde75fcbd2376f057f4a40f9893cbe F3-MDEMO.HE1
-30e3f97a2290f0683ccedf8b08a6ba55 F3-MDEMO.HE2
-b90004518ba5bb4dc473170f5c975568 F3-MDEMO.HE4
-66ed086cf061ca023e5924147fc585be F3-MDEMO.W32
-
-(humongous ftp)
-1997-10-28 12:42 f3-mdemo.w32
-khalek, sev, Joachim
-D:\Scummsys.90\sputm.90\*.c
-c0c0934580cde95879bef0b6a5a49c29 F3-MDEMO.D32
-56e44f51bd02de77cb75737e45396987 F3-MDEMO.EXE
-cb1559e8405d17a5a278a6b5ad9338d1 F3-MDEMO.HE0
-a2fde75fcbd2376f057f4a40f9893cbe F3-MDEMO.HE1
-30e3f97a2290f0683ccedf8b08a6ba55 F3-MDEMO.HE2
-b90004518ba5bb4dc473170f5c975568 F3-MDEMO.HE4
-3ff95314abdeebe0b2d11f4417efa449 f3-mdemo.w32
-
-(puttrace cd/soccer cd)
-Joachim
-c0c0934580cde95879bef0b6a5a49c29 F3-MDEMO.D32
-3ff95314abdeebe0b2d11f4417efa449 F3-MDEMO.EXE
-cb1559e8405d17a5a278a6b5ad9338d1 F3-MDEMO.HE0
-a2fde75fcbd2376f057f4a40f9893cbe F3-MDEMO.HE1
-30e3f97a2290f0683ccedf8b08a6ba55 F3-MDEMO.HE2
-b90004518ba5bb4dc473170f5c975568 F3-MDEMO.HE4
-
-(freddi3 demo hfs french)
-kirben
-???
-
-(freddi3 demo french)
-kirben
-???
-
-(freddi3 demo dutch)
-adutchguy
-???
-
-(freddi4 cd hfs)
-Joachim
-382e75cc3252683c18ccb4b8a964b8bf Freddi 4
-4f580a021eee026f3b4589e17d130d78 Freddi 4 (0)
-944d9c81ce26f8820bbd2a6d2c2d987c Freddi 4 (2)
-d1c47dfa05160c783da89e6dc9894d3e Freddi 4 (4)
-d3cb0cbdd52b7684d321a3630bdf8abc Freddi 4 (a)
-d41d8cd98f00b204e9800998ecf8427e Freddi 4 (r)
-
-(freddi4 cd)
-Joachim
-d3cb0cbdd52b7684d321a3630bdf8abc FREDDI4.(A)
-ccca9a823d117afb1a882fd707586bf0 FREDDI4.D32
-dbde280a3b554db62f8f7920775cbed5 FREDDI4.EXE
-4f580a021eee026f3b4589e17d130d78 FREDDI4.HE0
-944d9c81ce26f8820bbd2a6d2c2d987c FREDDI4.HE2
-d1c47dfa05160c783da89e6dc9894d3e FREDDI4.HE4
-24b409ff575c52d385cdc6b7e91b5b79 FREDDI4.W32
-
-(freddi4 cd russian)
-sev
-D:\scummsys.98\sputm.98\*.c
-0fb24aa2d37a8a6cbf90066c2f792596 freddi4.(a)
-4f580a021eee026f3b4589e17d130d78 freddi4.he0
-02d4dba3fedc64e24c1baa9523035701 freddi4.he2
-a2e2010e75a1fd164ef6fc58eae7238d freddi4.he4
-24b409ff575c52d385cdc6b7e91b5b79 freddi4.w32
-
-(freddi4 cd dutch)
-adutchguy
-???
-
-(freddi4 cd german)
-Joachim
-25da2483b1d36a35c371393e907f57bf FreddiGS.(a)
-0fb226dcdd09aaa48dd77925c467d1cd FreddiGS.D32
-e9e4997d16bc12ec0d7048571c84023b FREDDIGS.EXE
-b5298a5c15ffbe8b381d51ea4e26d35c FreddiGS.HE0
-ee9720cc979cbad31193895c91e530f6 FreddiGS.HE2
-766c4f81601fe5fd69f6975c1dc51b98 FreddiGS.HE4
-25cb2425ded9b2e7557e8eb4dd7bb8d6 FreddiGS.w32
-
-
-(freddi4 cd russian updated}
-sev
-C:\HESystems\SPUTM\Src\*.cpp
-658d27fdb9219f5c62468314cf0007ff FreddiHRBG.(a)
-78bd5f036ea35a878b74e4f47941f784 FreddiHRBG.he0
-1d4023e93ffde7dae77426d293dab95b FreddiHRBG.he2
-ae8defe36ebe7d46f7b1796f3e95b139 FreddiHRBG.he4
-74b50dcbd98cd9bb3560be9a918c37db FreddiHRBG.w32
-
-(freddi4 russian alt)
-sev
-D:\scummsys.98\sputm.98\*.c
-41c340501caa1bf90cb0107679bf3e03 FREDDI4.(A)
-07b810e37be7489263f7bc7627d4765d FREDDI4.HE0
-b90be0993b688bfcdd361c55fd263ccc FREDDI4.HE2
-d1c47dfa05160c783da89e6dc9894d3e FREDDI4.HE4
-8da938ee682f5f83aa2d51789e9602f4 FREDDI4.W32
-
-(humongous ftp/pajama3 cd hfs/spyfox2 cd hfs/football cd hfs)
-Joachim
-8a61ffd683a01c2cddd9bb37e2fff119 Freddi 4 Demo
-7c2e76087027eeee9c8f8985f93a1cc5 Freddi 4 Demo (0)
-23632be3c8c4e77c3917148c5f8e56ef Freddi 4 Demo (2)
-0453fdf42a9aa750ed198bca1d9f8e91 Freddi 4 Demo (4)
-53b0e5c820bd264684df59231dbdc031 Freddi 4 Demo (a)
-d41d8cd98f00b204e9800998ecf8427e Freddi 4 Demo (r)
-
-(humongous ftp)
-1999-02-08 19:21 F4-demo.w32
-khalek, sev, Joachim
-D:\scummsys.98\sputm.98\*.c
-53b0e5c820bd264684df59231dbdc031 f4-demo.(a)
-ccca9a823d117afb1a882fd707586bf0 F4-demo.d32
-dbde280a3b554db62f8f7920775cbed5 F4-demo.exe
-7c2e76087027eeee9c8f8985f93a1cc5 f4-demo.HE0
-23632be3c8c4e77c3917148c5f8e56ef f4-demo.he2
-0453fdf42a9aa750ed198bca1d9f8e91 f4-demo.he4
-24b409ff575c52d385cdc6b7e91b5b79 F4-demo.w32
-
-(pajama3 cd/spyfox2 cd/football cd)
-Joachim
-53b0e5c820bd264684df59231dbdc031 f4-demo.(a)
-ccca9a823d117afb1a882fd707586bf0 F4-demo.d32
-24b409ff575c52d385cdc6b7e91b5b79 F4-demo.exe
-7c2e76087027eeee9c8f8985f93a1cc5 f4-demo.HE0
-23632be3c8c4e77c3917148c5f8e56ef f4-demo.he2
-0453fdf42a9aa750ed198bca1d9f8e91 f4-demo.he4
-
-(puttsfunshop cd hfs/puttcircus cd hfs/putttime cd hfs/spyozon cd hfs/freddicove cd hfs)
-Joachim
-7b08032b5e6ad870170e0d82d5786909 Freddi 4 Demo
-ebd324dcf06a4c49e1ba5c231eee1060 Freddi 4 Demo (0)
-23632be3c8c4e77c3917148c5f8e56ef Freddi 4 Demo (2)
-0453fdf42a9aa750ed198bca1d9f8e91 Freddi 4 Demo (4)
-0a5e8a6eb824c9e006dea982adf72d1e Freddi 4 Demo (a)
-d41d8cd98f00b204e9800998ecf8427e Freddi 4 Demo (i)
-
-
-(puttsfunshop cd/puttcircus cd/putttime cd/spyozon cd/freddicove cd/soccerMLS cd)
-sev, Joachim
-C:\Documents and Settings\stevej\My Documents\HECode\SPUTM\Src\*.cpp
-0a5e8a6eb824c9e006dea982adf72d1e f4-demo.(a)
-ccca9a823d117afb1a882fd707586bf0 f4-demo.D32
-20f57c3bf3f9fae1f88df9434bfd78e0 f4-demo.exe
-ebd324dcf06a4c49e1ba5c231eee1060 f4-demo.HE0
-23632be3c8c4e77c3917148c5f8e56ef f4-demo.he2
-0453fdf42a9aa750ed198bca1d9f8e91 f4-demo.he4
-
-(freddi4 demo hfs)
-???
-
-(dog cd)
-sev
-D:\scummsys.98\sputm.98\*.c
-bd6a0ac7c15562250349dd5b64709e92 F4-DEMO.(A)
-ccca9a823d117afb1a882fd707586bf0 F4-demo.d32
-24b409ff575c52d385cdc6b7e91b5b79 F4-demo.exe
-c25755b08a8d0d47695e05f1e2111bfc F4-DEMO.HE0
-23632be3c8c4e77c3917148c5f8e56ef F4-DEMO.HE2
-0453fdf42a9aa750ed198bca1d9f8e91 F4-DEMO.HE4
-
-(freddi4 demo hfs german)
-Joachim
-c089c75f6bc0f4a60c621a957043d279 Ff4demo
-688328c5bdc4c8ec4145688dfa077bf2 Ff4demo (0)
-3ad28b05239e4480644bea99d3804622 Ff4demo (2)
-0453fdf42a9aa750ed198bca1d9f8e91 Ff4demo (4)
-0eef3e0fca1f1ab0204982234be943a0 Ff4demo (a)
-d41d8cd98f00b204e9800998ecf8427e Ff4demo (i)
-
-(freddi4 demo german)
-Joachim
-0eef3e0fca1f1ab0204982234be943a0 Ff4demo.(a)
-2188b22aa1534b5248a8aa7dfa9c7861 Ff4demo.d32
-e179e35382bdc90601e01612c7a52ce8 FF4DEMO.EXE
-688328c5bdc4c8ec4145688dfa077bf2 Ff4demo.HE0
-3ad28b05239e4480644bea99d3804622 Ff4demo.HE2
-0453fdf42a9aa750ed198bca1d9f8e91 Ff4demo.he4
-
-(freddi4 demo dutch)
-joostp
-???
-
-(freddi4 demo dutch)
-adutchguy
-???
-
-(PuttTime CD UK release)
-eriktorbjorn
-d:\dev\SPUTM\Src\*.cpp
-a2bb4dbf44dbf26587c2c213064853a8 FF4DEMO.(A)
-cb52cbabfa8e91b76a0c6d76ded339c6 ff4demo.exe
-e03ed1474ec14de78359970e0457a820 FF4DEMO.HE0
-15c9746d2d612d2693ec7e509c4e9fb5 FF4DEMO.HE2
-9470cd17e5e301f33876477f14992f29 ff4demo.he4
-
-(Kellogg cereals pack)
-bc20db254834452db602728f90e9a6d4 FreddiMini.(a)
-d1286487c342ac81b28f3e1b90a2b7f3 FreddiMini.D32
-03d3b18ee3fd68114e2a687c871e38d5 FreddiMini.HE0
-cb52cbabfa8e91b76a0c6d76ded339c6 FreddiMini.exe
-38189191a5824dd54377f0dbd4779046 FreddiMini.he2
-9470cd17e5e301f33876477f14992f29 FreddiMini.he4
-
-
-(freddicove hfs cd)
-Joachim
-b8ae37c647509afe5a406cab82e8f789 FreddiCove
-590e6546aacd0d374b7f3a4f53013ab1 FreddiCove (0)
-52b33175cf8abfbadcafbd4702275e0d FreddiCove (2)
-a9f9f4a7ad25a3efda4626d4b6c80ffb FreddiCove (3)
-dfbd9adb0d406184383dd069a64c8757 FreddiCove (4)
-04ad937605bffa28fdf47693e61620cc FreddiCove (a)
-63082e55aefcec01986fdfda9c57e55a FreddiCove (i)
-
-(freddicove cd)
-Joachim
-C:\Spyfox3Sputm\Src\SrcPWin\*.cpp
-04ad937605bffa28fdf47693e61620cc freddicove.(a)
-b4c292854d70ff6cf89e20030630c5e0 freddicove.EXE
-590e6546aacd0d374b7f3a4f53013ab1 freddicove.HE0
-52b33175cf8abfbadcafbd4702275e0d freddicove.he2
-a9f9f4a7ad25a3efda4626d4b6c80ffb FreddiCove.he3
-dfbd9adb0d406184383dd069a64c8757 freddicove.he4
-213f75f25b1c92c1b401203440e2720e freddicove.w32
-
-(freddicove cd)
-sev
-C:\Spyfox3Sputm\Src\SrcPWin\*.cpp
-04ad937605bffa28fdf47693e61620cc FREDDICOVE.(A)
-b4c292854d70ff6cf89e20030630c5e0 FREDDICOVE.EXE
-590e6546aacd0d374b7f3a4f53013ab1 FREDDICOVE.HE0
-52b33175cf8abfbadcafbd4702275e0d FREDDICOVE.HE2
-a9f9f4a7ad25a3efda4626d4b6c80ffb FREDDICOVE.HE3
-dfbd9adb0d406184383dd069a64c8757 FREDDICOVE.HE4
-
-(freddicove cd russian)
-sev
-C:\Spyfox3Sputm\Src\SrcPWin\*.cpp
-04ad937605bffa28fdf47693e61620cc FREDDICOVE.(A)
-b4c292854d70ff6cf89e20030630c5e0 FREDDICOVE.EXE
-590e6546aacd0d374b7f3a4f53013ab1 FREDDICOVE.HE0
-62c6daba6da11b26e259e49c092cb08f FREDDICOVE.HE2
-a9f9f4a7ad25a3efda4626d4b6c80ffb FREDDICOVE.HE3
-dfbd9adb0d406184383dd069a64c8757 FREDDICOVE.HE4
-
-(freddicove cd dutch)
-adutchguy
-???
-
-(freddicove cd russian alt)
-sev
-C:\Spyfox3Sputm\Src\SrcPWin\*.cpp
-2cac27c79aebf9db05ed516783d950a6 freddicove.(a)
-21abe302e1b1e2b66d6f5c12e241ebfd freddicove.HE0
-52b33175cf8abfbadcafbd4702275e0d freddicove.he2
-a9f9f4a7ad25a3efda4626d4b6c80ffb FreddiCove.he3
-dfbd9adb0d406184383dd069a64c8757 freddicove.he4
-ca263c140b091bff2b31b1570e47aebe freddicove.w32
-
-(freddicove cd russian updated)
-sev
-C:\HE_dev\SPUTM\Src\*.cpp
-50211d918df60b69d78c03962a5b09ed FreddiCCC.(a)
-b3d5a75a35d165c5750ab84fdc6fd638 FreddiCCC.EXE
-4ce2d5b355964bbcb5e5ce73236ef868 FreddiCCC.HE0
-2890b42997816aae1bcaa618e77444bf FreddiCCC.he2
-2f238b51cfad1b8b5c179468a19aa29b FreddiCCC.he3
-29ef3472e3675c4a0e6ea440e0df4ffd FreddiCCC.he4
-
-(freddicove demo dutch)
-kirben, sev
-???
-
-(freddicove demo hfs)
-???
-
-(pajama4 cd)
-sev
-c:\SRC_RELEASE\SPUTM\Src\SrcPWin\*.cpp
-f1b5cd6bceb50f8296d7a8db6efb69ec FFCoveDemo.(a)
-e856bf226130de0d84bcaaa7ecfb5a3a FFCoveDemo.d32
-554762d1e011ade6cc29ab8024124017 FFCoveDemo.exe
-45082a5c9f42ba14dacfe1fdeeba819d FFCoveDemo.HE0
-0c8f5b94bee7ddcbe5d41abce1daf9e3 ffCoveDemo.he2
-af9375aa14e4d967801938ee355e1486 ffCoveDemo.he4
-912c159f4a0232ceaff2b6759b18fd2f ffCoveDemo.w32
-
-(super duper arcade 1 cd hfs)
-Joachim
-20b697227835007b68aaf078d19e239d Water Worries
-4ba37f835be11a59d969f90f272f575b Water Worries (0)
-e577863ba03c4c1001052e6c809bf66a Water Worries (1)
-9d4a6d9c383ab9b1d0a486a5bb6bfb34 Water Worries (2)
-3d5f7153500339e05815cfa9c3e9369e Water Worries (4)
-2856fa0e0e74484f9c55dc58b2e9203c Water Worries (7)
-
-(super duper arcade 1 cd)
-Joachim
-7a266bd72dc8ae9a4d1c209e49502c00 Water.a32
-9a8e77ece8ed9cfcadd214ad0efabcee water.exe
-4ba37f835be11a59d969f90f272f575b WATER.HE0
-e577863ba03c4c1001052e6c809bf66a WATER.HE1
-9d4a6d9c383ab9b1d0a486a5bb6bfb34 water.He2
-3d5f7153500339e05815cfa9c3e9369e water.he4
-2856fa0e0e74484f9c55dc58b2e9203c WATER.HE7
-
-
-(water cd hfs)
-Joachim
-2856fa0e0e74484f9c55dc58b2e9203c Water (7)
-91a8077251d21b9a060792f50df91cbc Water Worries
-f1b0e0d587b85052de5534a3847e68fe Water Worries (0)
-162e516eaea7f6635e0d09923ed819d2 Water Worries (2)
-3d5f7153500339e05815cfa9c3e9369e Water Worries (4)
-bc97954ab2fd772d67ed91d21cd67cfd Water Worries (A)
-e39e1837ed467d2e26fb57d9f14624ed Water Worries (i)
-d41d8cd98f00b204e9800998ecf8427e Water Worries (r)
-
-(water cd)
-Joachim
-bc97954ab2fd772d67ed91d21cd67cfd Water.(a)
-ccca9a823d117afb1a882fd707586bf0 Water.d32
-20902148fe2cdaaf73ad7fdf3663c01d Water.exe
-f1b0e0d587b85052de5534a3847e68fe Water.he0
-162e516eaea7f6635e0d09923ed819d2 Water.he2
-3d5f7153500339e05815cfa9c3e9369e Water.he4
-2856fa0e0e74484f9c55dc58b2e9203c Water.he7
-2eacfb93a578132a2194937dc4be7c85 WATER.w32
-
-
-(water cd russian)
-sev
-D:\scummsys\sputm80\*.c
-214d0ece69f444cc2ced3fd7bc0738dc Water.a32
-2012f854d83d9cc6f73b2b544cd8bbf8 WATER.HE0
-967f8921b88bebc81dc08cef276cdb3f WATER.HE1
-243bedd4215ec0640df55a35394b6778 water.He2
-3d5f7153500339e05815cfa9c3e9369e WATER.HE4
-2856fa0e0e74484f9c55dc58b2e9203c WATER.HE7
-
-(water cd russian updated)
-sev
-D:\scummsys\sputm80\*.c
-c2e40b953f90ed35926a958cc8cb6a52 WATER.HE2
-3d5f7153500339e05815cfa9c3e9369e WATER.HE4
-2856fa0e0e74484f9c55dc58b2e9203c WATER.HE7
-0be4193477036d3b1c57b5aaa0f4a709 WATER.W32
-6271130f440066830eca9056c1d7926f water.he0
-96a30e55cb95fc0611e4353637d6e5a7 water.he1
-
-(maze cd hfs)
-Kirben
-???
-
-(maze cd)
-Kirben
-???
-
-(super duper arcade 2 cd hfs)
-Kirben, Joachim
-20d2fe8f124bd4224c52f4a545995895 Maze Madness
-4f04b321a95d4315ce6d65f8e1dd0368 Maze Madness (0)
-4efc960a9e16764ad3cdaa64ee79f4f7 Maze Madness (1)
-86e4d05f086ab253e41eea36f9953b7b Maze Madness (2)
-818620a54fe0232fa17d6df1c3e547aa Maze Madness (4)
-40175d873ed23efa26dd49e3e108e943 Maze Madness (8)
-
-
-(super duper arcade 2 cd)
-Kirben, Joachim
-6b201406803dfce87682febb6d99c155 maze.a32
-0c80dbb40c4edb8c9c93f7cebc34f4ab MAZE.EXE
-4f04b321a95d4315ce6d65f8e1dd0368 maze.HE0
-4efc960a9e16764ad3cdaa64ee79f4f7 maze.HE1
-86e4d05f086ab253e41eea36f9953b7b maze.he2
-818620a54fe0232fa17d6df1c3e547aa maze.he4
-40175d873ed23efa26dd49e3e108e943 maze.he8
-
-(freddisfunshop cd hfs)
-Joachim
-430d3ede85344fe8ca75f8b446be8a53 Freddi's FunShop
-16542a7342a918bfe4ba512007d36c47 Freddi's FunShop (0)
-ac8faff875fd9e47328c0ad6dacc1326 Freddi's FunShop (2)
-db2ef7f3fdce0c5aa8932138636ab63b Freddi's FunShop (4)
-895b6746ab176b3ba3e70afa3ce6588b Freddi's FunShop (a)
-7a7b1e2d7b17c616c300ea736276f8e4 Freddi's FunShop (b)
-de6b13747c34a629162dd257cc4f0866 Freddi's FunShop (i)
-2d4bcfe0a03f44876182664b303f2bf7 Freddi's FunShop (u)
-
-(freddisfunshop cd)
-Joachim
-895b6746ab176b3ba3e70afa3ce6588b FreddisFunShop.(a)
-7a7b1e2d7b17c616c300ea736276f8e4 FreddisFunShop.(b)
-ccca9a823d117afb1a882fd707586bf0 FreddisFunShop.d32
-4bb50266471b1955d423d40fc716ecbf FreddisFunShop.exe
-16542a7342a918bfe4ba512007d36c47 FreddisFunShop.HE0
-ac8faff875fd9e47328c0ad6dacc1326 FreddisFunShop.he2
-db2ef7f3fdce0c5aa8932138636ab63b FreddisFunShop.he4
-d82da74cd5b040fdbee2330c85006810 FreddisFunShop.map
-39c468587c4bdad304be49e8d4041a22 FreddisFunShop.u32
-1f102a306b108951c86d0ea9f849935c FreddisFunShop.w32
-a38b59ccd74792e348b57e6f07ce2ccc FreddisFunShop.x32
-
-(puttputt cd/puttmoon cd/fbear cd)
-khalek, sev, Joachim
-7.0.0 (Feb 8 1995 16:33:26)
-d4d3dd3b039a5c0ecfae502064b5b2de CATALOG.EXE
-11e6e244078ff09b0f3832e35420e0a7 CATALOG.HE0
-0cb65eb736529221b9269b15a7fd1914 CATALOG.HE1
-c0e6ea1d47493cca09fc674c3d097836 CATALOG.HE2
-c0e6ea1d47493cca09fc674c3d097836 CATALOG.HE3
-1978944e3e597362d3f4f13606ab2264 CATALOG.W32
-
-(farm cd/airport cd/jungle cd/airport hfs/jungle hfs)
-khalek, sev, Joachim
-7.0.0 (Jun 22 1995 14:01:50)
-698d32c4dd2cca76918710665a8c3e6c CATALOG2.EXE
-037385a953789190298494d92b89b3d0 CATALOG2.HE0
-d43e75c3e71f3668727f436b4c777334 CATALOG2.HE1
-c0e6ea1d47493cca09fc674c3d097836 CATALOG2.HE2
-c0e6ea1d47493cca09fc674c3d097836 CATALOG2.HE3
-d33843ac942167d564ae5682e2b381c3 CATALOG2.W32
-
-(airport cd hfs)
-Joachim
-df6c3ad8f24c73b153e1d1fe1f011f5b The AirPort
-d6334a5a9b61afe18c368540fdf522ca The AirPort (0)
-e51ba2794c8fbe267b3cc9cf5f511ea9 The AirPort (1)
-0d20f6a921a35ed907a875e26e050b9c The AirPort (2)
-45348231d5da1aaa87e65ca170956eee The AirPort (4)
-cb6ef7b42f7804834a731826567d4212 The AirPort (7)
-765492059d83bc0ae8c30a4feef50a6a The AirPort (9)
-
-(trips collection cd/airport cd/airport cd hfs)
-sev, Joachim
-7.0.0 (Jul 1 1995 21:55:39)
-d031299fa80f81b7348ed57665aea617 AIRPORT.EXE
-07433205acdca3bc553d0e731588b35f AIRPORT.HE0
-1a40631092357a0a2fb63ed881a83730 AIRPORT.HE1
-0d20f6a921a35ed907a875e26e050b9c AIRPORT.HE2
-c0e6ea1d47493cca09fc674c3d097836 AIRPORT.HE3
-45348231d5da1aaa87e65ca170956eee AIRPORT.HE4
-cb6ef7b42f7804834a731826567d4212 AIRPORT.HE7
-765492059d83bc0ae8c30a4feef50a6a AIRPORT.HE9
-3c45181f2f31b7d67932295d0f2bafcb AIRPORT.W32
-
-(farm cd hfs/freddi cd hfs/he classics hfs/chase hfs/baseball hfs/pajama2 hfs/freddi3 hfs/socks hfs/thinker1 hfs/thinkerk hfs/jungle hfs)
-khalek, Joachim (comment: checked all MD5s, there is only 1 Mac-Demo-Version for sure)
-1995-09-14 17:20 Airport Demo
-af4f7ee28b83c0ba471459a779a34043 Airport Demo
-7ea2da67ebabea4ac20cee9f4f9d2934 Airport Demo (0)
-608f6b919b663642be7104c14440434f Airport Demo (1)
-858db51aa87dd51df99c00c0bab31d65 Airport Demo (2)
-42161ad979949daf67924b5227b94f2d Airport Demo (4)
-765492059d83bc0ae8c30a4feef50a6a Airport Demo (9)
-
-(puttputt cd/fbear cd/puttmoon cd/)
-khalek, sev, Joachim
-7.0.0 (Feb 8 1995 16:33:47)
-009e6924ae0913e7728e9a7f70f5a9db AIRDEMO.EXE
-86c9902b7bec1a17926d4dae85beaa45 AIRDEMO.HE0
-e5ce3f8cddd5d54aaf2b040c831dcc96 AIRDEMO.HE1
-858db51aa87dd51df99c00c0bab31d65 AIRDEMO.HE2
-c0e6ea1d47493cca09fc674c3d097836 AIRDEMO.HE3
-42161ad979949daf67924b5227b94f2d AIRDEMO.HE4
-765492059d83bc0ae8c30a4feef50a6a AIRDEMO.HE9
-a16fc5d8c29efffb65f84f3a42b154f1 AIRDEMO.W32
-
-(spyfox cd/pajama cd/puttzoo cd/he classics cd/freddi2 cd/baseball cd/thinker1 cd/thinkerk cd/socks cd/)
-khalek, sev, Joachim
-7.0.0 (Jul 5 1995 14:46:05)
-371f3abc95359eff033e6ef47c27190b AIRDEMO.EXE
-e144f5f49d9241d2a9dee2576b3d09cb AIRDEMO.HE0
-855ecd2da58317064d2e01263d6ca493 AIRDEMO.HE1
-858db51aa87dd51df99c00c0bab31d65 AIRDEMO.HE2
-c0e6ea1d47493cca09fc674c3d097836 AIRDEMO.HE3
-42161ad979949daf67924b5227b94f2d AIRDEMO.HE4
-765492059d83bc0ae8c30a4feef50a6a AIRDEMO.HE9
-a5459bfe36183cf1f4ced00fe325aa90 AIRDEMO.W32
-
-(farm cd/airport cd/airport hfs/jungle cd/jungle hfs/)
-khalek, sev, Joachim
-7.0.0 (Jun 22 1995 14:06:25)
-371f3abc95359eff033e6ef47c27190b AIRDEMO.EXE
-8ffd618a776a4c0d8922bb28b09f8ce8 AIRDEMO.HE0
-64fb30a7c26d119216cdadaff1b4e1bd AIRDEMO.HE1
-858db51aa87dd51df99c00c0bab31d65 AIRDEMO.HE2
-c0e6ea1d47493cca09fc674c3d097836 AIRDEMO.HE3
-42161ad979949daf67924b5227b94f2d AIRDEMO.HE4
-765492059d83bc0ae8c30a4feef50a6a AIRDEMO.HE9
-3d43af3f3ecc18744dda721d951e2a2f AIRDEMO.W32
-
-(freddi cd/pajama2 cd/freddi3 cd/chase cd)
-khalek, sev, Joachim
-7.0.0 (Jul 5 1995 14:46:05)
-371f3abc95359eff033e6ef47c27190b AIRDEMO.EXE
-8ffd618a776a4c0d8922bb28b09f8ce8 AIRDEMO.HE0
-64fb30a7c26d119216cdadaff1b4e1bd AIRDEMO.HE1
-858db51aa87dd51df99c00c0bab31d65 AIRDEMO.HE2
-c0e6ea1d47493cca09fc674c3d097836 AIRDEMO.HE3
-42161ad979949daf67924b5227b94f2d AIRDEMO.HE4
-765492059d83bc0ae8c30a4feef50a6a AIRDEMO.HE9
-a5459bfe36183cf1f4ced00fe325aa90 AIRDEMO.W32
-
-(farm cd hfs)
-khalek
-1995-09-16 14:11 The Farm
-f4f88abc0635e80a4fc8c605ce9d0db3 The Farm
-fbbbb38a81fc9d6a61d509278390a290 The Farm (0)
-3941f75ccb280e7c73890833f2a09514 The Farm (1)
-e778f5f5bbc457966f6ac90ec8f3d9ee The Farm (2)
-449029f90e778a4504de146ca9d0963b The Farm (4)
-3d29c1d665dcb4e4b036dfc7752b990b The Farm (9)
-
-(farm cd/trips collection cd)
-khalek, sev
-7.0.0 (Jun 11 1996 19:12:56)
-a85856675429fe88051744f755b72f93 farm.he0
-3e1111db20b879a482814b4a06122672 farm.he1
-e778f5f5bbc457966f6ac90ec8f3d9ee farm.he2
-c0e6ea1d47493cca09fc674c3d097836 farm.he3
-449029f90e778a4504de146ca9d0963b farm.he4
-3d29c1d665dcb4e4b036dfc7752b990b farm.he9
-fa49452f871e506a6930cc8697db6181 farm.w32
-
-(airport hfs)
-Joachim
-19a57595f7d2367286058a41241e574a Farm Demo
-39fd6db10d0222d817025c4d3346e3b4 Farm Demo (0)
-ba3cb50770848a91216565b91edf8579 Farm Demo (1)
-706d44b32f7c74e98ff4fe88d625826d Farm Demo (2)
-ad6a4dea7b696a28b99d40ea1d685788 Farm Demo (4)
-
-(farm demo dutch)
-adutchguy
-???
-
-(farm cd/pajama cd/airport cd/jungle cd/airport hfs/jungle hfs)
-khalek, sev, Joachim
-7.0.0 (Jun 22 1995 14:05:27)
-2e698fdcf17be7de5c70e9a66d6e8fc0 FARMDEMO.EXE
-8d479e36f35e80257dfc102cf4b8a912 FARMDEMO.HE0
-4d4cb9fdb5a0f3b651bbf0f80735cbe2 FARMDEMO.HE1
-706d44b32f7c74e98ff4fe88d625826d FARMDEMO.HE2
-c0e6ea1d47493cca09fc674c3d097836 FARMDEMO.HE3
-ad6a4dea7b696a28b99d40ea1d685788 FARMDEMO.HE4
-daca65342b60a86a8ba5fbbd5d8b71d4 FARMDEMO.W32
-
-(puttputt cd/puttmoon cd/fbear cd)
-khalek, sev, Joachim
-7.0.0 (Oct 13 1994 19:15:16)
-1b6b66d63a7e80edde33a9b2f57011ba FARMDEMO.EXE
-bf8b52fdd9a69c67f34e8e9fec72661c FARMDEMO.HE0
-6f5d57f1fdc449424792d840a9c85acc FARMDEMO.HE1
-706d44b32f7c74e98ff4fe88d625826d FARMDEMO.HE2
-1c26d0c926e9c31d1b77c0611a643dc9 FARMDEMO.HE3
-cdadbf8daf9c8f811dac28d348ff8825 FARMDEMO.W32
-
-(jungle hfs)
-Joachim
-0e896300a0af8bd43f82d57a9da6a525 The Jungle
-659942b9a6b519f123a13cca3c333a13 The Jungle (0)
-0212155e5de27230b4ce5e36fb910945 The Jungle (1)
-9a5bf899124f45288749d81a0918907a The Jungle (2)
-222ad352670c1d94366a8511af846f49 The Jungle (4)
-f80c48c622ba21d46fc518630f324cf7 The Jungle (9)
-
-
-(trips collection cd/jungle cd)
-sev, joachim
-7.0.0 (Oct 5 1995 08:20:42)
-11994b691574b2ecea7043a80a908647 JUNGLE.EXE
-8801fb4a1200b347f7a38523339526dd JUNGLE.HE0
-1b39261e8d7e7384cf47fe9a6fa808d8 JUNGLE.HE1
-9a5bf899124f45288749d81a0918907a JUNGLE.HE2
-c0e6ea1d47493cca09fc674c3d097836 JUNGLE.HE3
-222ad352670c1d94366a8511af846f49 JUNGLE.HE4
-f80c48c622ba21d46fc518630f324cf7 JUNGLE.HE9
-d8561c70fe52082eace566fe038995f7 JUNGLE.W32
-
-(pajama cd hfs)
-Kirben
-???
-
-(pajama cd)
-Kirben
-???
-
-(pajama cd hfs)
-khalek
-1996-09-12 20:55 Pajama Sam
-57fab7dc46bb7d9450970d95cf14e8fc Pajama Sam
-672dec94b82f7f0877ebb5b5cf7f4bc1 Pajama Sam (0)
-2e83592ae635f53d1cc94c3d98da6335 Pajama Sam (1)
-048a2cb8baad19ca90a4510783ab032b Pajama Sam (2)
-147be86929b5969224c72edac30896fd Pajama Sam (4)
-2546d42491fa61ac8e2d20d68d264fce Pajama Sam (7)
-
-(pajama cd)
-khalek, sev
-1996-09-14 00:28 pajama.w32
-D:\Scummsrc.80\Sputm\*.c
-672dec94b82f7f0877ebb5b5cf7f4bc1 pajama.he0
-2e83592ae635f53d1cc94c3d98da6335 pajama.he1
-048a2cb8baad19ca90a4510783ab032b pajama.he2
-4417ea03a6d1b0b7522526f41d1097f6 pajama.he3
-147be86929b5969224c72edac30896fd pajama.he4
-2546d42491fa61ac8e2d20d68d264fce pajama.he7
-8e0e6d39728cc6a87b32f5e71f602b20 pajama.w32
-
-(pajama cd dutch)
-joostp
-???
-
-(pajama cd)
-Joachim
-1e5baa49222b0f6a6cb671bf6cb208d8 Pajama.(a)
-ccca9a823d117afb1a882fd707586bf0 pajama.d32
-8f18bc14ff62d55d20cb3a9dc2ac1451 Pajama.exe
-898eaa21f79cf8d4f08db856244689ff Pajama.HE0
-4dc07befa5e311abd787a2580c91a12d Pajama.he2
-f81b518a579d83c8d4d1911a365ea982 Pajama.he3
-147be86929b5969224c72edac30896fd Pajama.he4
-2546d42491fa61ac8e2d20d68d264fce Pajama.he7
-2c0273605aecaf223287da677679e42a pajama.w32
-
-(freddi cd hfs/he classics hfs/puttzoo cd hfs)
-khalek
-1997-10-28 17:16 Pajama Sam Demo
-3b032e02ccbc5d65c7397cfb32f65f1d Pajama Sam Demo
-f237bf8a5ef9af78b2a6a4f3901da341 Pajama Sam Demo (0)
-5c12305ff68ed053daba74a700a56ad2 Pajama Sam Demo (1)
-4ccd03ca710a9053c42292cae09a6471 Pajama Sam Demo (2)
-6e0fdfcf13e37b659b7155cf5969965f Pajama Sam Demo (4)
-
-(spyfox cd/puttzoo cd/he classics cd/pajama2 cd/freddi cd/freddi2 cd/freddi3 cd/baseball cd)
-khalek, sev, Joachim
-1996-10-31 22:34 pjs-demo.w32
-D:\Scummsrc.80\Sputm\*.c
-11875252dea74302ea77f8adeaf9c2e9 PJS-DEMO.EXE
-f237bf8a5ef9af78b2a6a4f3901da341 PJS-DEMO.HE0
-5c12305ff68ed053daba74a700a56ad2 PJS-DEMO.HE1
-4ccd03ca710a9053c42292cae09a6471 PJS-DEMO.HE2
-6e0fdfcf13e37b659b7155cf5969965f PJS-DEMO.HE4
-0c7e0d0ef005f289e9ca06bbbf5e8839 PJS-DEMO.W32
-
-(pajama demo hfs)
-khalek
-???
-
-(ftp)
-2002-05-20 15:11 PjSamDemo.exe
-khalek, sev
-c:\Build\SRC\SPUTM\Src\SrcPWin\*.cpp
-1f5564cba5d070703c85fe8eda1f6236 PjSamDemo.(a)
-2c380ca1224d0c83a9de178546028cb5 PjSamDemo.exe
-d7ab7cd6105546016e6a0d46fb36b964 PjSamDemo.he0
-5207295bb0b0e0b3f71b7593dd7c3a81 PjSamDemo.he2
-6e0fdfcf13e37b659b7155cf5969965f PjSamDemo.he4
-
-(pajama demo hfs french)
-Kirben
-???
-
-(pajama demo french)
-Kirben
-???
-
-(pajama demo dutch)
-adutchguy
-???
-
-(pajama2 cd hfs)
-Joachim
-b921d8279b5a3aa567c669b83d89e489 Pajama Sam 2
-d4e79c3d8645b8266cd78c325bc35154 Pajama Sam 2 (0)
-cf1e7394ae00c0c65fa5af486e752e5c Pajama Sam 2 (1)
-53f95adc8f6727d26e3248fb1bad8180 Pajama Sam 2 (2)
-297787a960f2b591bb98add9b0689e9f Pajama Sam 2 (4)
-d41d8cd98f00b204e9800998ecf8427e Pajama Sam 2 (r)
-
-(pajama2 cd)
-sev, Joachim
-D:\scummsys.95\sputm.95\*.cpp
-ccca9a823d117afb1a882fd707586bf0 PAJAMA2.D32
-1830278a7bef7d5800ba02f816dbe373 PAJAMA2.EXE
-d4e79c3d8645b8266cd78c325bc35154 PAJAMA2.HE0
-cf1e7394ae00c0c65fa5af486e752e5c PAJAMA2.HE1
-53f95adc8f6727d26e3248fb1bad8180 PAJAMA2.HE2
-297787a960f2b591bb98add9b0689e9f PAJAMA2.HE4
-44a282944b6392ad883a48fc03f37146 PAJAMA2.W32
-58dfc09f344a9dec565bb914920800d3 PAJAMA2.X32
-
-(pajama2 cd hfs german)
-Joachim
-7ba80800b1302376b3a3d4d26d42aa50 PyjamaDBMN
-c6907d44f1166941d982864cd42cdc89 PyjamaDBMN (0)
-b4ecb33716598531823dc2a971a762f1 PyjamaDBMN (2)
-297787a960f2b591bb98add9b0689e9f PyjamaDBMN (4)
-55f4e9402bec2bded383843123f37c5c PyjamaDBMN (a)
-01368f1a5c87746b09f50363696f5883 PyjamaDBMN (i)
-
-(pajama2 cd german)
-Joachim
-55f4e9402bec2bded383843123f37c5c PyjamaDBMN.(a)
-b27cc88bc13451e9334fbf1d5f3c9c52 PyjamaDBMN.D32
-cecafac67b1f299b6f1c326bc58ba50f PyjamaDBMN.EXE
-c6907d44f1166941d982864cd42cdc89 PyjamaDBMN.HE0
-b4ecb33716598531823dc2a971a762f1 PyjamaDBMN.HE2
-297787a960f2b591bb98add9b0689e9f PyjamaDBMN.HE4
-b27bf7501668c7244baf779a947b585c PyjamaDBMN.w32
-
-(pajama2 cd russian updated)
-sev
-d:\dev\SPUTM\Src\*.cpp
-486b48e4ae421cdbecfcc1431c7e801f PajamaTAL.(a)
-738be524db140dc1c7fd6ddfab647c0b PajamaTAL.exe
-32709cbeeb3044b34129950860a83f14 PajamaTAL.he0
-f71fe00306d8246bd5f7ee99703aaaff PajamaTAL.he2
-297787a960f2b591bb98add9b0689e9f PajamaTAL.he4
-
-(pajama2 demo dutch hfs)
-Kirben
-???
-
-(pajama2 demo dutch)
-Kirben
-???
-
-(freddi2 cd hfs/freddi4 cd hfs/pajama3 cd hfs/puttrace cd hfs/putttime cd hfs/puttzoo cd hfs/spyfox cd hfs/superarcade1 cd hfs/superarcade2 cd hfs/water cd hfs/football cd hfs/soccer cd hfs)
-sev, Joachim
-01bae6f21e5c42b6a776efd57f363eb1 PJ2Demo
-36a6750e03fb505fc19fc2bf3e4dbe91 PJ2Demo (0)
-6b1f2b0359d146fda362f1b81892fc76 PJ2Demo (1)
-0c8b86610f358f9a6b45cdd45cb70a58 PJ2Demo (2)
-0f28e36711b55cc139921ddaaff6b341 PJ2Demo (4)
-d41d8cd98f00b204e9800998ecf8427e PJ2Demo (r)
-
-(freddi2 cd/freddi4 cd/pajama3 cd/puttrace cd/putttime cd/puttzoo cd/spyfox cd/superarcade1 cd/superarcade2 cd/water cd/football cd/soccer cd )
-Joachim
-ccca9a823d117afb1a882fd707586bf0 PJ2DEMO.D32
-44a282944b6392ad883a48fc03f37146 PJ2DEMO.EXE
-36a6750e03fb505fc19fc2bf3e4dbe91 PJ2DEMO.HE0
-6b1f2b0359d146fda362f1b81892fc76 PJ2DEMO.HE1
-0c8b86610f358f9a6b45cdd45cb70a58 PJ2DEMO.HE2
-0f28e36711b55cc139921ddaaff6b341 PJ2DEMO.HE4
-58dfc09f344a9dec565bb914920800d3 PJ2DEMO.X32
-
-
-(ftp/puttrace cd/dog cd/spyfox2 cd/putttime cd/football cd/soccer cd)
-1998-05-09 20:27 PJ2DEMO.W32
-khalek
-D:\scummsys.95\sputm.95\*.c
-36a6750e03fb505fc19fc2bf3e4dbe91 PJ2DEMO.HE0
-6b1f2b0359d146fda362f1b81892fc76 PJ2DEMO.HE1
-0c8b86610f358f9a6b45cdd45cb70a58 PJ2DEMO.HE2
-0f28e36711b55cc139921ddaaff6b341 PJ2DEMO.HE4
-44a282944b6392ad883a48fc03f37146 PJ2DEMO.W32
-
-(pajama3 cd hfs)
-Joachim
-0b642feb91da52a174e192a082fcc70f Pajama Sam 3
-f7711f9264d4d43c2a1518ec7c10a607 Pajama Sam 3 (0)
-978c86a8313b66d3b254c3b43e034460 Pajama Sam 3 (2)
-87938c64ef72195231d58fec4f5add88 Pajama Sam 3 (4)
-f7b0ad01b6a78bcd3854edd0ee9694df Pajama Sam 3 (a)
-5a40804b409c888525b04361a907dd39 Pajama Sam 3 (i)
-
-(pajama3 cd)
-sev, Joachim
-C:\Dev\Project\SPUTM\Src\*.cpp
-f7b0ad01b6a78bcd3854edd0ee9694df PAJAMA3.(A)
-ccca9a823d117afb1a882fd707586bf0 Pajama3.d32
-aaf2001f4d7120fccac9123278cb0db2 Pajama3.exe
-f7711f9264d4d43c2a1518ec7c10a607 PAJAMA3.HE0
-978c86a8313b66d3b254c3b43e034460 PAJAMA3.HE2
-87938c64ef72195231d58fec4f5add88 PAJAMA3.HE4
-7c4127882d847866cafd474b914da595 Pajama3.w32
-
-(pajama3 cd hfs german)
-Joachim
-d47b3fa7fbb331d83b4cdcf6effc88d6 PyjamaSkS
-2e8a1f76ea33bc5e04347646feee173d PyjamaSKS (0)
-2d9d0e25c050cc1d30d78d5d2c475178 PyjamaSKS (2)
-435437659b3c647c5a223e143e219846 PyjamaSKS (4)
-3694b1ef70da192f3c19cd24638ec79b PyjamaSKS (a)
-d41d8cd98f00b204e9800998ecf8427e PyjamaSkS (i)
-
-
-(pajama3 cd german)
-Joachim
-3694b1ef70da192f3c19cd24638ec79b PyjamaSKS.(a)
-c8538fa7fbb9c1b09bc4b833e04ce0dd PyjamaSKS.d32
-24efc2c233d1dfcf32e75c877e7640c0 PyjamaSKS.exe
-2e8a1f76ea33bc5e04347646feee173d PyjamaSKS.HE0
-2d9d0e25c050cc1d30d78d5d2c475178 PyjamaSKS.he2
-435437659b3c647c5a223e143e219846 PyjamaSKS.he4
-88084b7b68f19dc5ded4dc5a5a8c3c76 PyjamaSKS.w32
-
-(pajama3 cd russian)
-sev
-C:\HESystems\SPUTM\Src\SrcPWin\*.cpp
-20176076d708bf14407bcc9bdcd7a418 UKPajamaEAT.he0
-6c0b2725387fe0b0bc7bfe043714492b UKPajamaEAT.(a)
-eea6df70b4930c0d9e2ea69a1a193fc5 UKpajamaEAT.he2
-a7f5e841f72a72c0dec10d7d9fd74a51 UKpajamaEAT.HE4
-
-(pajama3 demo hfs dutch)
-joostp
-???
-
-(pajama3 demo dutch)
-joostp
-???
-
-(puttcircus cd hfs/spyozon cd hfsfreddicove cd hfs)
-Joachim
-e221e2a53e9726ecb9bc422ed7650d42 Pajama Sam 3-Demo
-a9f2f04b1ecaab9495b59befffe9bf88 Pajama Sam 3-Demo (0)
-057190fd8706c51c6e6657a8eb8f6898 Pajama Sam 3-Demo (2)
-d5b1d81d25d3d4850184fdb0ab627bea Pajama Sam 3-Demo (4)
-e305c20b5d26d7084f035be22617d8a8 Pajama Sam 3-Demo (a)
-d41d8cd98f00b204e9800998ecf8427e Pajama Sam 3-Demo (i)
-
-(puttcircus cd/spyozon cd/freddicove cd/soccerMLS cd)
-sev, Joachim
-e305c20b5d26d7084f035be22617d8a8 pj3-demo.(a)
-ccca9a823d117afb1a882fd707586bf0 pj3-demo.D32
-7c4127882d847866cafd474b914da595 pj3-demo.exe
-a9f2f04b1ecaab9495b59befffe9bf88 pj3-demo.HE0
-057190fd8706c51c6e6657a8eb8f6898 pj3-demo.he2
-d5b1d81d25d3d4850184fdb0ab627bea pj3-demo.he4
-
-(freddi3 cd hfs german/pajama2 cd hfs german/putttime cd hfs german/spyfox cd hfs german)
-Joachim
-37c439a53e3b0426f8e1a57e56e1f9eb PJ3Demo
-0c45eb4baff0c12c3d9dfa889c8070ab PJ3Demo (0)
-5989dc5d4fecf651db4d5f497ee36d0d PJ3Demo (2)
-44cef52dfec87a2dcccda97f3ac6b2cd PJ3Demo (4)
-e04352df925c102041c6e954bc86d71c PJ3Demo (a)
-d41d8cd98f00b204e9800998ecf8427e PJ3Demo (i)
-
-(freddi3 cd german/pajama2 cd german/putttime cd german/spyfox cd german)
-Joachim
-e04352df925c102041c6e954bc86d71c Gpj3demo.(a)
-2188b22aa1534b5248a8aa7dfa9c7861 GPJ3Demo.d32
-45d9f75902265d1ecbfbf5ff37a7bc70 GPJ3Demo.exe
-0c45eb4baff0c12c3d9dfa889c8070ab Gpj3demo.HE0
-5989dc5d4fecf651db4d5f497ee36d0d GPJ3Demo.HE2
-44cef52dfec87a2dcccda97f3ac6b2cd GPJ3Demo.HE4
-
-(puttsfunshop cd hfs/freddisfunshop cd hfs/samsfunshop cd hfs)
-Joachim
-e221e2a53e9726ecb9bc422ed7650d42 Pajama Sam 3-Demo
-a654fb60c3b67d6317a7894ffd9f25c5 Pajama Sam 3-Demo (0)
-057190fd8706c51c6e6657a8eb8f6898 Pajama Sam 3-Demo (2)
-d5b1d81d25d3d4850184fdb0ab627bea Pajama Sam 3-Demo (4)
-795bb07d00d8628631e767d2c23fba56 Pajama Sam 3-Demo (a)
-d41d8cd98f00b204e9800998ecf8427e Pajama Sam 3-Demo (i)
-
-(puttsfunshop cd/freddisfunshop cd/samsfunshop cd)
-sev, Joachim
-C:\Dev\Project\SPUTM\Src\*.cpp
-795bb07d00d8628631e767d2c23fba56 pj3-demo.(a)
-ccca9a823d117afb1a882fd707586bf0 pj3-demo.D32
-7c4127882d847866cafd474b914da595 pj3-demo.exe
-a654fb60c3b67d6317a7894ffd9f25c5 pj3-demo.HE0
-057190fd8706c51c6e6657a8eb8f6898 pj3-demo.he2
-d5b1d81d25d3d4850184fdb0ab627bea pj3-demo.he4
-
-2002-10-19 11:37 pj3-demo.w32
-khalek
-C:\Dev\Project\SPUTM\Src\*.cpp
-a2fe82b76e0e3db5d8e2f44ec9772548 pj3-demo.(a)
-cf90b4db5486ef798db78fe6fbf897e5 pj3-demo.he0
-e923a8f282ad6900b24beb562894661f pj3-demo.he2
-d5b1d81d25d3d4850184fdb0ab627bea pj3-demo.he4
-7c4127882d847866cafd474b914da595 pj3-demo.w32
-
-(PuttPutt CD UK release)
-eriktorbjorn
-d:\dev\SPUTM\Src\*.cpp
-5b0f71b2503688d8783f4cc37c302666 PJ3DEMO.(A)
-2702b7fad34607adea8e8a7b6adb1202 pj3demo.exe
-3e48298920fab9b7aec5a971e1bd1fab PJ3DEMO.HE0
-22df1316d6594bc5c70442874079c46d Pj3Demo.he2
-0794110b085ee91c2aa4a5fc844ff2f4 Pj3Demo.he4
-
-(pjgames cd hfs)
-Kirben
-???
-
-(pjgames cd)
-Kirben
-???
-
-(lost cd hfs)
-Kirben
-???
-
-(lost cd)
-Kirben
-???
-
-(superarcade2 cd hfs)
-Kirben, Joachim
-deb9d0989a2ffa00f77c06360b4e4794 Lost and Found
-ed361270102e355afe5236954216aba2 Lost and Found (0)
-2f1636bf18a437092f7e3de9614c7c49 Lost and Found (2)
-e0499c7a9aad75122c902934aaa98b62 Lost and Found (a)
-d41d8cd98f00b204e9800998ecf8427e Lost and Found (r)
-
-
-(superarcade2 cd)
-Kirben, Joachim
-e0499c7a9aad75122c902934aaa98b62 lost.(a)
-4a4564b8bdd8b3c004f2f84bf5e7fc85 lost.a32
-ccca9a823d117afb1a882fd707586bf0 lost.d32
-9d01495e4f8b34e4aefb1e29adcdd37f LOST.EXE
-ed361270102e355afe5236954216aba2 lost.HE0
-2f1636bf18a437092f7e3de9614c7c49 lost.he2
-
-(lost demo)
-1999-07-08 08:46 SMALLER.EXE
-khalek
-D:\(vss)scummsys.99\SPUTM\Src\SrcPWin\*.cpp
-070702d4a191580455acee3d38d5ca9e smaller.(a)
-7d2b945c2afb05a370da690c36b22bdd SMALLER.EXE
-a2bb6aa0537402c1b3c2ea899ccef64b SMALLER.HE0
-7fe73db8981467a6d0abdd92105f8618 data/world-1/levels/level-10.ot1
-b988a3d95f638bb342135d9bd04e0137 data/world-1/levels/level-10.ot2
-ce60d91581be1cde2d0619a85647b1a9 data/world-1/levels/level-11.ot1
-8cd6dea0b18593c8d1aaa12daff10cc7 data/world-1/levels/level-11.ot2
-7bfa53f7aa0b06372472b7fa475254cb data/world-1/levels/level-12.ot1
-ad2e8c62013a1aee64e3af638d7fac3a data/world-1/levels/level-12.ot2
-0dda1de323c63baa645863259937cfaa data/world-1/levels/level-13.ot1
-0832514ef1b2206b119054e838003241 data/world-1/levels/level-13.ot2
-08b28bfae2169083bdaf2635faf75213 data/world-1/levels/level-14.ot1
-510121696a26e6410766d3d414a4a1ed data/world-1/levels/level-14.ot2
-459027319d6db400bbb60acd37dd31a0 data/world-1/levels/level-15.ot1
-7c73fcd8abcb837bbcb72457eb71da44 data/world-1/levels/level-15.ot2
-ec75f20929d3ab9ad7b68b650e55b713 data/world-1/levels/level-16.ot1
-f90cd5c12b9dc3777b3371460bb6da1f data/world-1/levels/level-16.ot2
-085feba2672c7dc41570726e098d0d02 data/world-1/levels/level-17.ot1
-4a85080de411c54dcfd42b9929e1c0c3 data/world-1/levels/level-17.ot2
-37dacba43a2407c31d8a69dd302991a7 data/world-1/levels/level-18.ot1
-0dbc99bedd086e11dcf78794e1a21d50 data/world-1/levels/level-18.ot2
-67d9d144436e57215212bf65c6665395 data/world-1/levels/level-19.ot1
-679c0c4cdb9781ca9fe73d1f4314fc50 data/world-1/levels/level-19.ot2
-c60abc377414f72a16341901c4895b41 data/world-1/levels/level-1.ot1
-b69f642322a618c2c122e40f9533dd86 data/world-1/levels/level-1.ot2
-93de8918e2d6d35d04f21f067203b8f7 data/world-1/levels/level-20.ot1
-f5da057f3408613b5b8ed0bcd876833f data/world-1/levels/level-20.ot2
-8b175a1cb5722fccd2c649ff15e85e39 data/world-1/levels/level-2.ot1
-f958fbf2de135bcfdffd9e8d0cbfcaa4 data/world-1/levels/level-2.ot2
-453569e6100e194b2e40e52ea13a1747 data/world-1/levels/level-3.ot1
-388bb8ae5805a87ec6a9af5ffef67b65 data/world-1/levels/level-3.ot2
-a6719d4797937bc1501015d8ba02faf3 data/world-1/levels/level-4.ot1
-69946a0c1fded7a1cd1fd7e5da5bc716 data/world-1/levels/level-4.ot2
-170121ca31f889039771cf76a01fd60b data/world-1/levels/level-5.ot1
-9cd61c833f3342b881c280dd7c746db8 data/world-1/levels/level-5.ot2
-cfe953b525b530f144ba322f8969e9b8 data/world-1/levels/level-6.ot1
-650563fd608cc5f6418a20bdb3e3f6eb data/world-1/levels/level-6.ot2
-dd1d60970ff90ffe00f6a201b125ddd1 data/world-1/levels/level-7.ot1
-e5598a32e874f7451581c2fcc8118e8a data/world-1/levels/level-7.ot2
-8d9b7d1e209aa6103b5440d098e005ee data/world-1/levels/level-8.ot1
-f69c2ce78a6f2a70bf43f0cf665ac075 data/world-1/levels/level-8.ot2
-049b95a44520347dabf1d14b1cd9b9f4 data/world-1/levels/level-9.ot1
-b6087413d0aac4078203a1ef5fd88cb8 data/world-1/levels/level-9.ot2
-
-(samsfunshop cd hfs)
-Joachim
-b4673b59ed60b26fda077c43993102ab Sam's FunShop
-68155a6bf082221525f431c2cbdac8ab Sam's FunShop (0)
-2e44235ef224b25ce766eab34ecc0ab5 Sam's FunShop (2)
-c13b823a4f12d20a22f01acdc89102dc Sam's FunShop (4)
-35202bb9a0fa8fa23bbc3c9b606ad6b6 Sam's FunShop (a)
-eebac1d5bf74832aae8031c47c699197 Sam's FunShop (b)
-78d5350b0d208be368e1169c6f53728b Sam's FunShop (i)
-2d4bcfe0a03f44876182664b303f2bf7 Sam's FunShop (u)
-
-(samsfunshop cd)
-Joachim
-35202bb9a0fa8fa23bbc3c9b606ad6b6 SamsFunShop.(a)
-eebac1d5bf74832aae8031c47c699197 SamsFunShop.(b)
-ccca9a823d117afb1a882fd707586bf0 SamsFunShop.d32
-486422eba1f7ca37c6314ad13e00a041 SamsFunShop.exe
-68155a6bf082221525f431c2cbdac8ab SamsFunShop.HE0
-2e44235ef224b25ce766eab34ecc0ab5 SamsFunShop.he2
-c13b823a4f12d20a22f01acdc89102dc SAMSFUNSHOP.HE4
-e03725ba7069e7a94c28168b70dc99c4 SamsFunShop.r32
-39c468587c4bdad304be49e8d4041a22 SamsFunShop.u32
-591674119a23295aede9ced62642498a SamsFunShop.w32
-a38b59ccd74792e348b57e6f07ce2ccc SamsFunShop.x32
-
-(sock cd hfs/superarcade1 cd hfs)
-Joachim
-8351724df7b6141c57596a70f71261d1 SockWorks
-5e8fb66971a60e523e5afbc4c129c0e8 SockWorks (0)
-a8ae3fedb8ff53e798d22e495929812f SockWorks (1)
-70c23a4651349e957ac8996275fe66f3 SockWorks (2)
-14a5574aeae3187bbb71ce7f4a1b803b SockWorks (4)
-c137e6e5d636c13df8ccb108523640cc SockWorks (7)
-
-(sock cd)
-Joachim
-6e076d748dd4726d1d7a230cfdb13dec SOCKS.D32
-be18099a608458fb63bc996a86195a73 SOCKS.DLL
-d82c48a90176dafb1f344f13a0cefb60 SOCKS.EXE
-5e8fb66971a60e523e5afbc4c129c0e8 SOCKS.HE0
-a8ae3fedb8ff53e798d22e495929812f SOCKS.HE1
-70c23a4651349e957ac8996275fe66f3 SOCKS.HE2
-14a5574aeae3187bbb71ce7f4a1b803b SOCKS.HE4
-c137e6e5d636c13df8ccb108523640cc SOCKS.HE7
-619755f82f852d94f252add9bbc73a61 SOCKS.W32
-
-(superarcade1 cd)
-Joachim
-619755f82f852d94f252add9bbc73a61 Socks.a32
-6e076d748dd4726d1d7a230cfdb13dec socks.d32
-be18099a608458fb63bc996a86195a73 SOCKS.DLL
-aa2b672c687c4cda492e3d9ceb7486eb socks.exe
-5e8fb66971a60e523e5afbc4c129c0e8 SOCKS.HE0
-a8ae3fedb8ff53e798d22e495929812f SOCKS.HE1
-70c23a4651349e957ac8996275fe66f3 SOCKS.HE2
-14a5574aeae3187bbb71ce7f4a1b803b SOCKS.HE4
-c137e6e5d636c13df8ccb108523640cc SOCKS.HE7
-
-(socks cd russian)
-sev
-D:\scummsys.80\sputm80\*.c
-19263586f749a560c1adf8b3393a9593 SOCKS.HE0
-d4bc7dd56e22720c96ecf96bd68fbecd SOCKS.HE1
-5b1e928ecb604dba17e41fb739218a49 SOCKS.HE2
-14a5574aeae3187bbb71ce7f4a1b803b SOCKS.HE4
-c137e6e5d636c13df8ccb108523640cc SOCKS.HE7
-65b08876afc8c55b8dbb2022fb1b6a95 Socks.a32
-
-
-<----END OF WORK TODAY---->
-
-(puttrace cd hfs)
-Joachim
-???
-
-(puttrace cd)
-sev
-D:\scummsys.98\sputm.98\*.c
-ef68d6670cce33d4300468d0b76b3894 puttrace.(a)
-e56b14495c0075850c900ca0999f90f4 puttrace.(b)
-7ded875e14d324f610a4fde12de2d407 PUTTRACE.A32
-981e1e1891f2be7e25a01f50ae55a5af PUTTRACE.HE0
-1bb81a151d72f56b81b43b55b1de63e4 PUTTRACE.HE2
-3f368bd19438204b34db7d7ff8e5395d PUTTRACE.HE4
-
-(puttrace cd russian)
-sev
-C:\HESystems\SPUTM\Src\*.cpp
-cde08c76ce62dcb6081a3fb7dfd2bc89 UKPuttRace.(a)
-e348fe80ca1a40a30bd57ff9d08812c0 UKPuttRace.(b)
-62050da376483d8edcbd98cd26b6cb57 UKPuttRace.he0
-fdd32528084cd48078bb073ead02d2a9 UKPuttRace.he2
-4dfdf4303fa6769535eba7fed539002e UKPuttRace.he4
-91c0bc455b81e7e556646db1dacd461f UKPuttRace.w32
-
-(puttrace cd russian alt) ALL IN MD5
-sev
-D:\scummsys.98\sputm.98\*.c
-fe0cbe12588be2c8e509603821566a87 Puttrace.(a)
-e56b14495c0075850c900ca0999f90f4 Puttrace.(b)
-86821f1e71e2a2d679da7827485fdab1 PUTTRACE.A32
-981e1e1891f2be7e25a01f50ae55a5af PUTTRACE.HE0
-544b59d0b904a745033e1850c07a8b5f Puttrace.he2
-5d930459fd1827eaa9df846a20757932 Puttrace.he4
-
-(puttrace cd hfs german)
-Joachim
-???
-
-(puttrace cd german)
-Joachim
-???
-
-(puttrace demo hfs dutch)
-Kirben
-???
-
-(puttrace demo dutch)
-Kirben
-???
-
-(puttrace demo hfs dutch)
-joostp
-???
-
-(puttrace demo dutch)
-joostp
-???
-
-(puttrace demo hfs)
-sev
-???
-
-(pajama3 cd/putt dog cd/spyfox2 cd/puttcircus cd/putttime cd/football cd)
-sev
-D:\scummsys.98\sputm.98\*.c
-36590dcf019a0fa78de77354cf4db342 RACEDEMO.(A)
-7ded875e14d324f610a4fde12de2d407 RACEDEMO.A32
-8e1d77b06c92662ef5128b087f84f229 racedemo.exe
-0ac41e2e3d2174e5a042a6b565328dba RACEDEMO.HE0
-07e92dfae14eb6ef3afc6d40ba98fcd2 RACEDEMO.HE2
-e80168dc9bfca4577b4e2bbdd70db60b RACEDEMO.HE4
-
-2002-05-07 02:53 RACEDEMO.W32
-khalek
-D:\scummsys.98\sputm.98\*.c
-36590dcf019a0fa78de77354cf4db342 RACEDEMO.(A)
-0ac41e2e3d2174e5a042a6b565328dba RACEDEMO.HE0
-07e92dfae14eb6ef3afc6d40ba98fcd2 RACEDEMO.HE2
-e80168dc9bfca4577b4e2bbdd70db60b RACEDEMO.HE4
-a030210d465ed001953df89e3df1e558 RACEDEMO.W32
-
-(puttrace demo hfs german)
-Joachim
-???
-
-(puttrace demo german)
-Joachim
-???
-
-(PuttPutt CD UK release)
-eriktorbjorn
-d:\dev\SPUTM\Src\*.cpp
-cb6041f10fbaaa5e491aa8d14fc26dc0 RACEDEMO.(A)
-3616b3bf5877b2fb50ce33c705f15413 racedemo.exe
-7c8100e360e8ef05f88069d4cfa0afd1 RACEDEMO.HE0
-095795832ad8a4323bbfa6c137b691bb RACEDEMO.HE4
-177f4e5579e0279700c2b6b7f4f4ba71 RaceDemo.he2
-
-(puttmoon 3do)
-sev
-???
-
-(he classics cd)
-khalek, sev
-6.1.1 (Nov 4 1993 11:12:57)
-19113cc2ecc1dc24c70c46ae015abd78 PUTTMOON.BRS
-c6adfe1876ac936ff19546f0cd1e2b5b PUTTMOON.EXE
-780e4a0ae2ff17dc296f4a79543b44f8 PUTTMOON.HE0
-f02f36270d684e0c245d0fd0519b5e7b PUTTMOON.HE1
-bfecc91f0bf7b86acd7f82a3dfb53ca5 PUTTMOON.TLK
-
-(puttmoon cd russian)
-sev
-6.1.1 (Nov 4 1993 11:12:57)
-c6adfe1876ac936ff19546f0cd1e2b5b PUTTMOON.EXE
-780e4a0ae2ff17dc296f4a79543b44f8 PUTTMOON.HE0
-6a9457c786a8dcf8d2da8a2ec0123343 PUTTMOON.HE1
-c57a7faf7416d9da11919d0957332574 PUTTMOON.SG0
-3d6deb9406a3357764d11623ed6e48ee PUTTMOON.SG1
-1927fb2e7954326152630cb0f56158f8 PUTTMOON.TLK
-
-(puttmoon cd russian alt)
-sev
-6.1.1 (Nov 4 1993 11:12:57)
-c6adfe1876ac936ff19546f0cd1e2b5b PUTTMOON.EXE
-780e4a0ae2ff17dc296f4a79543b44f8 PUTTMOON.HE0
-2de9f712c62fab29507298c9f69591ec PUTTMOON.HE1
-c57a7faf7416d9da11919d0957332574 PUTTMOON.SG0
-3d6deb9406a3357764d11623ed6e48ee PUTTMOON.SG1
-3a35a45c5634203c72b9f2083e0d5717 PUTTMOON.TLK
-
-(puttmoon cd hebrew)
-sev
-???
-
-(he classics cd hfs)
-khalek
-9dc02577bf50d4cfaf3de3fbac06fbe2 Putt-Putt Moon 0
-e4e07a2763824a7646e11b6d9ad795c8 Putt-Putt Moon 1
-bfecc91f0bf7b86acd7f82a3dfb53ca5 Putt-Putt Moon 2
-19113cc2ecc1dc24c70c46ae015abd78 PUTTMOON.BRS
-
-(he classics cd)
-khalek, sev
-7.0.0 (Feb 7 1995 13:27:20)
-19113cc2ecc1dc24c70c46ae015abd78 PUTTMOON.BRS
-9c92eeaf517a31b7221ec2546ab669fd PUTTMOON.HE0
-cfe6d4059c4c5edb9f9f2351efb32a7b PUTTMOON.HE1
-965c113b3978682530e121ba8af7419b PUTTMOON.HE2
-58dfc09f344a9dec565bb914920800d3 PUTTMOON.HE3
-05d387396aabba20e7e3b8778bc0cf09 PUTTMOON.HE4
-56c8455570af6106931818e19344b46a PUTTMOON.W32
-
-6.1.1 (Sep 29 1993 17:18:45)
-khalek
-ef2d93dd02bcdabc7a1a59101e31f8be MOONDEMO.EXE
-aa6a91b7f6f119d1b7b1f2a4c9e24d59 MOONDEMO.HE0
-086b6835bbb924109a31e50f0b5c9e9a MOONDEMO.HE1
-0d06e43d5b5460375575a74d15d6bf07 MOONDEMO.TLK
-
-(puttmoon demo hfs)
-khalek
-???
-
-(puttputt cd/he classics cd)
-khalek, sev
-7.0.0 (Feb 7 1995 13:27:20)
-9c143c5905055d5df7a0f014ab379aee moondemo.he0
-ec82bd61eff3218216fb145004d2b005 moondemo.he1
-0d06e43d5b5460375575a74d15d6bf07 moondemo.he2
-7cf09a515cb499890e3faeab3a2aa491 moondemo.he3
-c182763838b5d06581cc9fb1c1bb1cfd moondemo.he4
-56c8455570af6106931818e19344b46a moondemo.w32
-
-(puttcircus cd hfs)
-sev
-???
-
-(puttcircus cd)
-sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-2efc1faef85c78dbfe91d46fcc26a3ec puttcircus.(a)
-ab0693e9324cfcf498fdcbb12acf8bb4 puttcircus.HE0
-320a3bca28c8c30ad7aeff74f24ced2e puttcircus.he2
-9c01311b009b0b1b65735beb51eb526a puttcircus.HE4
-d0552089e0c2bbf75969643e8dc30ef1 PUTTCIRCUS.w32
-
-(puttcircus cd hfs russian)
-sev
-???
-
-(puttcircus cd russian)
-sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-0deaf09aff8db115b7da47272955f206 puttcircus.(a)
-7bad72e332a59f9fcc1d437f4edad32a puttcircus.he0
-9ef7154db4ba00b89b5424ffd5cfce26 puttcircus.he2
-e902d67046bfb7cb09c9148b4462f297 puttcircus.he4
-f22635a81cf4abb712704990b7d9d597 PUTTCIRCUS.w32
-
-(puttcircus demo hfs)
-sev
-???
-
-(puttsfunshop cd/freddicove cd/soccerMLS cd)
-sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-d78d1eff392096c83687231fe2e78c6b circdemo.(a)
-ccca9a823d117afb1a882fd707586bf0 circdemo.D32
-79c9cf9572d32b2c587226f32b1ab946 circdemo.exe
-a7cacad9c40c4dc9e1812abf6c8af9d5 circdemo.HE0
-14b7f2b5180be87991338ea1017421be circdemo.he2
-860b38ff47ba90e910025ac8c6e9a823 circdemo.he4
-
-(puttputt 3do cd)
-khalek
-c817613033ceb12eb4c31ea6c336808f BREEZY.DMU
-fa14bc146cc6086ab44c906a320699c9 CALLIOPE.DMU
-67f93260bf6519d9a47fe987f46d286b CARWASH.DMU
-60fe949efb311eb660c1516fcc20edd2 CONGA.DMU
-667d5c394b63381f309d8c85085748d8 GASTASHN.DMU
-ed39e74166eb60b6d93ab5a26790dcac GROCER2.DMU
-a06560553d188e1dc5886c7633ee602a HAPPY.DMU
-01fd3afbc1b0f8b6e01a18232181cc39 HONEYBEE.DMU
-6bedd1f644ff35d55f2dd4e818f662ed MARSEILL.DMU
-ba59b9918a11a3f366719bb6dbb02426 MICE.DMU
-3031ecf1f94e9712ec9e2d192af5adaa MISCHIEF.DMU
-5b45f41c5e02ea737f64b8fb306346fa MONKEYS.DMU
-6beb885fb7fae9a4dc0a7b66b8e31e27 PAINTING.DMU
-725518498492603428a4b481a74f0ecd PARADE.DMU
-9d166dc6e1e55f78bfac5ede2e9c2daa PAUSE.CEL
-1748c190e7df232fabe70130f6636c9f PERFORM.CEL
-cbcf447cb91de76b6d034d41601bd148 PLAYFUL.DMU
-d8051a79de027921c27d08a67fb5fc09 POPWEASL.DMU
-8296845e881ba14f6c3e76e51220896c PUPPY.DMU
-7e151c17adf624f1966c8fc5827c95e9 PUTTPUTT.HE0
-3c985277e56fda01c1ef3d6da6817fd2 PUTTPUTT.HE1
-46f5aae1faea566f0e21b34572563e40 PUTTPUTT.TLK
-e4978c237ab8b7eb7820048a90a3161e PUTTSONG.DMU
-79e68c29627a5ba3514b87edacb57232 SHORTOCK.DMU
-87ffadb9e4d62e60fa2f8b16b672677a STARTUP.CEL
-d9b9d645a4f7949f127b32eb152e343b SUNNYDAY.DMU
-66d7b0f5c5b9bf0cf57a96b7fa457569 TICKTOCK.DMU
-b274a80fde5aaf92123972a4f3aabaa9 TOYSHOP.DMU
-cefbc7824935e5377bf25b3e461effdd WADDLE.DMU
-8f4c6d28938fb3a532d6038ebaadf234 WAITING.DMU
-a7914691959037a5a4f25fc5a6a138d2 WALTZ.DMU
-3caac70fd907c450ad8f4cd2d75ab576 WANDRING.DMU
-cf7150acba9df96c16a9e20d2345941d WHISTLIN.DMU
-
-(puttputt patch)
-khalek
-6.1.1 (Nov 20 1993 12:42:10)
-868b739deaf9319825137e5e55d4aee1 PUTTPUTT.EXE
-
-(puttputt cd/he classics cd)
-khalek, sev
-6.1.1 (Jan 18 1994 09:32:55)
-7564ee82886b8c75b3b1bd895c98fcb4 puttputt.exe
-9708cf716ed8bcc9ff3fcfc69413b746 puttputt.he0
-d109f3215ca2d5cd38c2efd83da5a51c puttputt.he1
-5f5a783f29c3da080d3bddbef0e2f01d puttputt.tlk
-
-(puttputt cd hebrew)
-sev
-???
-
-(puttputt cd russian)
-sev
-6.1.1 (Nov 19 1992 17:56:19)
-0b3222aaa7efcf283eb621e0cefd26cc PUTTPUTT.HE0
-64b5aee54f2b1453100b2040e1d778ef PUTTPUTT.HE1
-a4e799011c8320dffef43db7869b839a PUTTPUTT.TLK
-
-(puttputt cd russian alt)
-sev
-6.1.1 (Nov 19 1992 17:56:19)
-68ca57feaa198976c87f4a69f1e9a958 PUTTPUTT.EXE
-0b3222aaa7efcf283eb621e0cefd26cc PUTTPUTT.HE0
-64b5aee54f2b1453100b2040e1d778ef PUTTPUTT.HE1
-32453797af20693a00ccbe4dfa6db54f PUTTPUTT.TLK
-
-(he classics cd hfs)
-khalek
-684732efb5799c0f78804c99d8de9aba Putt-Putt Parade 0
-dc086db2e995aff8b2336147ccbd75d6 Putt-Putt Parade 1
-5f5a783f29c3da080d3bddbef0e2f01d Putt-Putt Parade 2
-
-(puttputt cd/he classics cd)
-khalek, sev
-7.0.0 (Feb 7 1995 13:26:59)
-6a30a07f353a75cdc602db27d73e1b42 puttputt.he0
-ce76be89bcace9527f457cab9d8231a6 puttputt.he1
-328b11537db07809864d8b2f536d07ae puttputt.he2
-58dfc09f344a9dec565bb914920800d3 puttputt.he3
-6cb903fb3d4d726fe0229affb1d22525 puttputt.he4
-71e615a8493f357e4de824a1e4632a80 puttputt.w32
-
-6.1.1 (Mar 9 1993 21:19:14)
-khalek
-57cbe80e524afa5330a77d04316d2bf6 puttdemo.exe
-31aa57f460a3d12429f0552a46a90b39 puttdemo.he0
-282a5503b45ddc15c7fb83c8e911b091 puttdemo.he1
-a49e0880f7c0638fbf7adf88894da3df puttdemo.tlk
-
-(puttputt demo hfs)
-khalek
-???
-
-(puttputt cd/he classics cd)
-khalek, sev
-7.0.0 (Feb 7 1995 13:26:59)
-37ff1b308999c4cca7319edfcc1280a0 puttdemo.he0
-9be0197fa0dac01ca3d72cf060826045 puttdemo.he1
-a49e0880f7c0638fbf7adf88894da3df puttdemo.he2
-58dfc09f344a9dec565bb914920800d3 puttdemo.he3
-cd26452706d7e66a3f4ba13975fe5c68 puttdemo.he4
-71e615a8493f357e4de824a1e4632a80 puttdemo.w32
-
-(puttzoo cd hfs)
-cyx
-???
-
-(puttzoo cd)
-cyx
-???
-
-(puttzoo cd hfs)
-khalek
-1995-09-14 17:11 Putt-Putt Saves the Zoo
-2f328b89b4404eaefb9bd18045dddd06 Putt-Putt Saves the Zoo
-58fdf4c7ad13540a734e18f8584cad89 Putt-Putt Saves the Zoo (0)
-8cffc74555fed521cc2008ed6a119118 Putt-Putt Saves the Zoo (1)
-225991e6f8d3d6ac5e519413392c34f3 Putt-Putt Saves the Zoo (2)
-d3235443d88751acd3412c1b0c6cec35 Putt-Putt Saves the Zoo (4)
-
-(puttzoo cd dutch)
-joostp
-???
-
-########## There is 9.8 version of puttzoo, Kirben has it
-(puttzoo cd)
-khalek
-7.0.0 (Jul 13 1995 18:45:07)
-1005456bfe351c1b679e1ff2dc2849e9 puttzoo.he0
-1399aaabdfc340203ac63aff57abf8a0 puttzoo.he1
-225991e6f8d3d6ac5e519413392c34f3 puttzoo.he2
-4417ea03a6d1b0b7522526f41d1097f6 puttzoo.he3
-d3235443d88751acd3412c1b0c6cec35 puttzoo.he4
-f6cc3beae345e71055efb143a342983c puttzoo.w32
-
-(puttzoo russian) (Comment: ALL LANGUAGES)
-sev
-7.0.0 (Jul 13 1995 18:45:07)
-1005456bfe351c1b679e1ff2dc2849e9 PUTTZOO.HE0
-1399aaabdfc340203ac63aff57abf8a0 PUTTZOO.HE1
-d03846ce20bab80288af295bb66870a3 PUTTZOO.HE2
-4417ea03a6d1b0b7522526f41d1097f6 PUTTZOO.HE3
-d3235443d88751acd3412c1b0c6cec35 PUTTZOO.HE4
-91903ca0f67564d78d229afa479b0b02 PUTTZOO.W32
-
-(he classics hfs/pajama cd hfs/farm cd hfs)
-khalek
-1996-11-17 13:28 Puttzoo Demo
-34727db5bde5a2f78a1ec84f75d0810c Puttzoo Demo
-3486ede0f904789267d4bcc5537a46d4 Puttzoo Demo (0)
-e0cde64b0c37a188c97a0bc93225cce9 Puttzoo Demo (1)
-a0cd041eb6c1a289a23549ef8740ff17 Puttzoo Demo (2)
-86dc7e6f520dbabe79b324ae64456686 Puttzoo Demo (4)
-
-(puttzoo demo hfs)
-Joachim
-???
-
-(ftp)
-sev
-7.0.0 (Jul 5 1995 14:45:19)
-f3d55aea441e260e9e9c7d2a187097e0 zoodemo.he0
-92722a557c952ff5178eb32964a12061 zoodemo.he1
-a0cd041eb6c1a289a23549ef8740ff17 zoodemo.he2
-47539950e6e6f656db4c1cc963bf9a8f zoodemo.he3
-86dc7e6f520dbabe79b324ae64456686 zoodemo.he4
-d30c3ce43992a116be1a28a4edccf597 zoodemo.w32
-
-(spyfox cd/pajama cd/he classics cd/freddi2 cd/baseball cd)
-khalek
-7.0.0 (Jun 4 1995 15:47:12)
-de4efb910210736813c9a1185384bace zoodemo.he0
-8ad56037c37b1c84efc2fa00bf4c59d5 zoodemo.he1
-c9b8363220ea094d2da8cc24635d8d48 zoodemo.he2
-47539950e6e6f656db4c1cc963bf9a8f zoodemo.he3
-86dc7e6f520dbabe79b324ae64456686 zoodemo.he4
-f3324cfe3dec0288fd38197cf88962af zoodemo.w32
-
-(farm cd/pajama cd)
-khalek, sev
-7.0.0 (Jun 22 1995 14:03:05)
-de4efb910210736813c9a1185384bace zoodemo.he0
-8ad56037c37b1c84efc2fa00bf4c59d5 zoodemo.he1
-c9b8363220ea094d2da8cc24635d8d48 zoodemo.he2
-47539950e6e6f656db4c1cc963bf9a8f zoodemo.he3
-86dc7e6f520dbabe79b324ae64456686 zoodemo.he4
-37e4b9463ead881fd53bf401aa62d0bf zoodemo.w32
-
-(puttzoo demo hfs german)
-Joachim
-???
-
-(putttime cd hfs)
-Kirben
-???
-
-(putttime cd)
-Kirben
-???
-
-(putttime cd hfs)
-sev
-???
-
-(putttime cd)
-sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-833cb49dd6767dc7722d671a4067ab5a PuttTime.(a)
-2108d83dcf09f8adb4bc524669c8cf51 PuttTime.he0
-802147789449535e375c7c4f2e666b96 PuttTime.he2
-15d5f719ebc6bcd4fe674587a8fa8596 PuttTime.he4
-a30dd1cd2b58b2c5c6eb1aa970f5a3c2 PuttTime.w32
-
-(putttime cd hfs german)
-Joachim
-???
-
-(putttime cd german)
-Joachim
-???
-
-(putttime cd dutch)
-adutchguy
-???
-
-(putttime cd)
-iziku
-???
-
-(putttime cd UK Release)
-eriktorbjorn
-d:\dev\SPUTM\Src\*.cpp
-6ea0c0e68384e588ece7e3e110c62b09 puttputtTTT.(a)
-d4aac997e2f4e15341f0bfbf905419bd puttputtTTT.HE0
-79e5273f8626f6b1448788bc0a279049 PuttPuttTTT.HE2
-7a0d96204f8874e4eda4918f63ca7b4e PuttPuttTTT.HE4
-a75403b5e853d7cc65cde2ec358ca5ba puttputtTTT.w32
-
-(putttime cd german)
-oncer
-???
-
-(putttime cd russian)
-sev
-d:\dev\SPUTM\Src\SAVELOAD.cpp
-4a7452aabc69cdaf897ccc099ff0bafa puttputtTTT.(a)
-defb8cb9ec4b0f91acfb6b61c6129ad9 puttputtTTT.he0
-5247f60e3913296860a74eef4bdfad2a PuttPuttTTT.he2
-a4816cbb60fa01f16295ab46868e7c41 PuttPuttTTT.he4
-947ce44f2336f8467ceadb184dbaa3e9 puttputtTTT.w32
-
-(freddi cd hfs)
-khalek
-1997-12-09 19:59 TimeDemo
-f2ece54cc9ca9621217c71cfd1ea594e TimeDemo
-4e5867848ee61bc30d157e2c94eee9b4 TimeDemo (0)
-5c58da43055710e93cfedd45bb14b03c TimeDemo (1)
-42df84a2b73a3d2ee461b89474ee2f57 TimeDemo (2)
-72339e5cf3f2902ad78e58c05bfcf7bb TimeDemo (4)
-d41d8cd98f00b204e9800998ecf8427e TimeDemo (r)
-
-(pajama2 cd/puttrace cd/soccer cd)
-sev
-D:\Scummsys.90\sputm.90\*.c
-c0c0934580cde95879bef0b6a5a49c29 timedemo.d32
-4e5867848ee61bc30d157e2c94eee9b4 timedemo.he0
-5c58da43055710e93cfedd45bb14b03c timedemo.he1
-42df84a2b73a3d2ee461b89474ee2f57 timedemo.he2
-72339e5cf3f2902ad78e58c05bfcf7bb timedemo.he4
-4c33312418b27bfe8ad307a6e14604e9 timedemo.w32
-
-(ftp/freddi3 cd)
-sev
-D:\Scummsys.90\sputm.90\*.c
-c0c0934580cde95879bef0b6a5a49c29 TIMEDEMO.D32
-4e5867848ee61bc30d157e2c94eee9b4 TIMEDEMO.HE0
-5c58da43055710e93cfedd45bb14b03c TIMEDEMO.HE1
-42df84a2b73a3d2ee461b89474ee2f57 TIMEDEMO.HE2
-72339e5cf3f2902ad78e58c05bfcf7bb TIMEDEMO.HE4
-a43540b44806b8311c7fd04c12cbf46a TIMEDEMO.W32
-
-(putttime demo hfs)
-sev
-???
-
-(web)
-2002-06-10 20:14 TimeDemo.exe
-khalek, sev
-c:\Build\SRC\SPUTM\Src\SrcPWin\*.cpp
-a64bde414f464ef8522fa0ffeea36d9c TimeDemo.exe
-0ab19be9e2a3f6938226638b2a3744fe TimeDemo.HE0
-1691e37409d7f0593c1aa1449f882058 TimeDemo.(a)
-63adb23ead513d5fcf657ed555e525ee TimeDemo.he2
-72339e5cf3f2902ad78e58c05bfcf7bb TimeDemo.he4
-
-(putttime demo hfs french)
-Kirben
-???
-
-(putttime demo french)
-Kirben
-???
-
-(putttime demo dutch)
-adutchguy
-???
-
-(Kellogg cereals pack)
-a6d982141c88f167cf4ec5dc684e2684 PuttMini.(a)
-d1286487c342ac81b28f3e1b90a2b7f3 PuttMini.D32
-0a6d7b81b850ed4a77811c60c9b5c555 PuttMini.HE0
-a75403b5e853d7cc65cde2ec358ca5ba PuttMini.exe
-ddcb5d9f71edc07982db401776c2d79e PuttMini.he2
-72339e5cf3f2902ad78e58c05bfcf7bb PuttMini.he4
-
-(balloon cd hfs)
-Kirben
-???
-
-(balloon cd)
-Kirben
-???
-
-(balloon cd hfs)
-Kirben
-???
-
-(balloon cd)
-Kirben
-???
-
-(balloon cd)
-iziku
-???
-
-(russian balloon)
-sev
-D:\Scummsrc.80\Sputm\*.c
-ad2d6ffbae12d46a2d50ccbbd2a15a83 Balloon.a32
-145bd3373574feb668cc2eea2ec6cf86 BALLOON.HE0
-86282ac950041a1a9723d2c86098939a BALLOON.HE1
-1dabd9eea9fa31c751ac52cfc2048c9c BALLOON.HE2
-4417ea03a6d1b0b7522526f41d1097f6 BALLOON.HE3
-6770978a98ae08e208c188d6c844ab69 BALLOON.HE4
-c2eb18b88529dc5cf79f868c73925f14 BALLOON.HE8
-cbe95e475b634087dc92d23596ad995f BALLOON.HE9
-
-(dog cd hfs)
-Kirben
-???
-
-(dog cd)
-Kirben
-???
-
-(dog cd)
-sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-ed126ee70102f94b8c725b3b90576f1e DOG.w32
-d4b8ee426b1afd3e53bc0cf020418cf6 dog.HE0
-43821dcacadd3340396dc9bdcf9fe455 dog.(a)
-8cbaaef96c0def188a98794f7e8826d6 dog.he2
-fc47c58d925148b1c1cce784d1f9fec1 dog.he4
-880f0f5e1acc4eb19c889c4d7c7492ef dog.he7
-50438756f002a90fbe7d6a4be184dccb dog.he8
-ccca9a823d117afb1a882fd707586bf0 dog.d32
-
-(activity cd)
-???
-
-(funpack cd 3do)
-sev
-???
-
-(funpack cd)
-iziku
-???
-
-(funpack patch)
-khalek
-6.1.1 (Nov 20 1993 12:20:32)
-091d066c93e751504e4b18c6748b97e0 FUNPACK.EXE
-
-(funpack cd)
-6.1.1 (Feb 15 1993 20:31:55)
-khalek
-f90f40b9702cfd3e2f6c9af76c743e41 funpack.exe
-46b53fd430adcfbed791b48a0d4b079f funpack.he0
-af6283c82fb6a867f91f28039b716036 funpack.he1
-7d6dec34833328722665c1e5a64e735f funpack.tlk
-
-(funpack cd hebrew)
-???
-
-(puttsfunshop cd hfs)
-sev
-???
-
-(puttsfunshop cd)
-sev
-C:\Dev\Project\SPUTM\Src\SrcPWin\*.cpp
-b525ccb6634db6c7f2762864f627f17a PuttsFunShop.(a)
-4504676bd50cb7b0e28b1b2026dce1b3 PuttsFunShop.(b)
-ccca9a823d117afb1a882fd707586bf0 PuttsFunShop.d32
-5262a27afcaee04e5c4900220bd463e7 PuttsFunShop.HE0
-5543c6d936bbec16be896902a473d2a4 PuttsFunShop.he2
-e93a12735e1a95559c755d7193676085 PUTTSFUNSHOP.HE4
-970f3883eefc562bc3949d1b1f88673e PuttsFunShop.map
-39c468587c4bdad304be49e8d4041a22 PuttsFunShop.u32
-7ea658395895f10ba7dfc4a7d147f615 PuttsFunShop.w32
-a38b59ccd74792e348b57e6f07ce2ccc PuttsFunShop.x32
-
-(spyfox cd hfs)
-Kirben
-???
-
-(spyfox cd)
-Kirben
-???
-
-(spyfox cd hfs)
-Joachim
-???
-
-(spyfox cd)
-Joachim
-???
-
-(spyfox cd hfs german)
-Joachim
-???
-
-(spyfox cd german updated)
-Joachim
-???
-
-(spyfox cd german)
-nachbarnebenan
-a28135a7ade38cc0208b04507c46efd1 spyfox.he0
-96da98152ccc2f0d9002c834f34d5cd0 spyfox.he1
-75bd69c4fc660695691844a68110a337 spyfox.he2
-f8029f33e2bc3da6fe38f6bda58c1f31 spyfox.he4
-
-(spyfox cd dutch)
-joostp
-???
-
-(spyfox cd) (COMMENT: ALL LANG)
-khalek
-1997-08-10 03:41 spyfox.w32
-D:\Scummsys.90\sputm.90\*.c
-6bf70eee5de3d24d2403e0dd3d267e8a spyfox.he0
-e01f959bdd49d5b0c8660fd8a14d4799 spyfox.he1
-0a7f78543f30138effbe593d9d09e720 spyfox.he2
-9fbab8bb60448f30ce7508dbf277ab05 spyfox.he4
-b7aa3c76d463137a8a09c68d9a1045d1 spyfox.w32
-
-(spyfox cd russian)
-sev
-D:\Scummsys.90\sputm.90\*.c
-6bf70eee5de3d24d2403e0dd3d267e8a SPYFOX.HE0
-f1b79e1dcb5f57b8d91aac8487a284d7 SPYFOX.HE1
-506a333aad3af2ca8abf5b862ceeb365 SPYFOX.HE2
-9fbab8bb60448f30ce7508dbf277ab05 SPYFOX.HE4
-1355eb775fa71d6df9d506fb906a51db SPYFOX.HLP
-b7aa3c76d463137a8a09c68d9a1045d1 SPYFOX.W32
-
-(spyfox cd russian updated)
-sev
-d:\dev\SPUTM\Src\*.cpp
-51ac439f04951d0910bc423e2825dab8 SPYFoxDC.(a)
-72ac6bc980d5101c2142189d746bd62f SPYFoxDC.he0
-10b638ee633558d528d7be0376175065 SPYFoxDC.he2
-f8029f33e2bc3da6fe38f6bda58c1f31 SPYFoxDC.he4
-b185cdec4ea6bc218afe08325af787a4 spyfoxdc.w32
-
-(farm cd hfs)
-khalek
-1997-12-09 19:59 FoxDemo
-09507650b60e891e9c1ed5e0a7aa0152 FoxDemo
-53e94115b55dd51d4b8ff0871aa1df1e FoxDemo (0)
-81fef80fadf4cd3ad0e04ac619f6eaed FoxDemo (1)
-1229ed0135d97aac8b50224a74ee4f34 FoxDemo (2)
-6f7993e15da433b58ea63e59e3666cea FoxDemo (4)
-d41d8cd98f00b204e9800998ecf8427e FoxDemo (r)
-
-(ftp/pajama2 demo/freddi3 cd)
-sev
-53e94115b55dd51d4b8ff0871aa1df1e foxdemo.he0
-81fef80fadf4cd3ad0e04ac619f6eaed foxdemo.he1
-1229ed0135d97aac8b50224a74ee4f34 foxdemo.he2
-6f7993e15da433b58ea63e59e3666cea foxdemo.he4
-b7aa3c76d463137a8a09c68d9a1045d1 foxdemo.w32
-
-(spyfox demo hfs)
-khalek
-???
-
-(ftp/putt dog cd/spyfox2 cd/putttime cd/football cd)
-1999-05-17 12:21 spydemo.w32
-khalek
-D:\Scummsys.90\sputm.90\*.c
-fbdd947d21e8f5bac6d6f7a316af1c5a spydemo.he0
-820bceab2a1ab02254c33e6e3fc81628 spydemo.he1
-bc8ed64e6a101f6646b80aa294fa5bdc spydemo.he2
-88867a804055334db8485d7da5d2c51f spydemo.he4
-b7aa3c76d463137a8a09c68d9a1045d1 spydemo.w32
-
-(spyfox demo hfs)
-khalek
-???
-
-2002-05-21 13:29 Spydemo.exe
-khalek
-c:\Build\SRC\SPUTM\Src\SrcPWin\*.cpp
-f5207b882c9015a4e4a9599460be6294 Spydemo.(a)
-4d34bf8f8ec20f2e653b19aa283da352 Spydemo.exe
-9d4ab3e0e1d1ebc6ba8a6a4c470ed184 Spydemo.HE0
-b34d614a23a7dac2be1407bbb51c6b24 Spydemo.he2
-88867a804055334db8485d7da5d2c51f Spydemo.he4
-
-(spyfox demo hfs french)
-Kirben
-???
-
-(spyfox demo french)
-Kirben
-???
-
-(spyfox demo dutch)
-Kirben
-???
-
-(spyfox2 cd hfs)
-sev
-???
-
-(spyfox2 cd)
-sev
-D:\(vss)scummsys.99\SPUTM\Src\*.cpp
-5f7ece9a7aefc709f11b6f4216c8764e spyfox2.(a)
-f79e60c17cca601e411f1f75e8ee9b5a SPYFOX2.HE0
-c8f3ab5d05e09360dc88c00243db0c2a SPYFOX2.HE2
-d601630d0dcf6b3084ecd42b6c8c5a33 SPYFOX2.HE4
-0b381fa8531972edca34f9b631638148 spyfox2.he9
-26ef6933e4a560f40bbb3dc0525a783c spy2arc.hst
-77179b054447bb7080aff0ec343588c6 Spyfox2.w32
-
-(spyfox2 cd russian) (COMMENT: ALL LANGUAGES)
-sev
-d68c11a69a955b66ee1a6b8f5a2ee9e0 spyfox2.(a)
-f79e60c17cca601e411f1f75e8ee9b5a SPYFOX2.HE0
-0a718eae78a467f5e664a34b601471e3 SPYFOX2.HE2
-d601630d0dcf6b3084ecd42b6c8c5a33 SPYFOX2.HE4
-0b381fa8531972edca34f9b631638148 spyfox2.he9
-010b18d51f6bf84c69333d03a4cc3c9b SPYFOX2.HLP
-77179b054447bb7080aff0ec343588c6 Spyfox2.w32
-
-(spyfox2 cd hfs russian updated)
-sev
-???
-
-(spyfox2 cd russian updated)
-sev
-C:\HESystems\SPUTM\Src\*.cpp
-4ecc3a54d961a23b80239e191309bb2a spyfoxsr.(a)
-cea91e3dd47f2518ea418e41611aa77f spyfoxsr.he0
-2e73380e32fb1960de5e9871042c6b2e spyfoxsr.he2
-42e883fdae113021eaa30bca3a7bfd2c spyfoxsr.he4
-0b381fa8531972edca34f9b631638148 spyfoxsr.he9
-dda8932e4ddd10c538086df4eaa965d2 SPYFOXSR.w32
-
-(spyfox2 cd dutch)
-adutchguy
-???
-
-(spyfox2 demo hfs dutch)
-joostp
-???
-
-(spyfox2 demo dutch)
-joostp
-???
-
-(putsfunshop cd/pajama3 cd/puttcircus cd/spyozon cd/soccerMLS cd)
-sev
-C:\Dev\Project\SPUTM\Src\*.cpp
-2ee6a9c1c8352d4aca638aeab38a194e sf2-demo.(a)
-f378c570abf42d4875d26674a35acd83 SF2-DEMO.EXE
-7222f260253f325c21fcfa68b5bfab67 sf2-demo.HE0
-8634f4ad2f224842364a86ddc57bb072 sf2-demo.he2
-c23f18777b5ad558826493f69749c4c6 SF2-DEMO.HE4
-
-(humongous ftp)
-sev
-D:\(vss)scummsys.99\SPUTM\Src\*.cpp
-2ee6a9c1c8352d4aca638aeab38a194e sf2-demo.(a)
-ccca9a823d117afb1a882fd707586bf0 sf2-demo.d32
-77179b054447bb7080aff0ec343588c6 sf2-demo.exe
-7222f260253f325c21fcfa68b5bfab67 sf2-demo.he0
-8634f4ad2f224842364a86ddc57bb072 sf2-demo.he2
-c23f18777b5ad558826493f69749c4c6 sf2-demo.he4
-
-(spyfox2 demo hfs german)
-Joachim
-???
-
-(spyfox2 demo german)
-Joachim
-???
-
-(PuttPutt CD UK release)
-eriktorbjorn
-d:\dev\SPUTM\Src\*.cpp
-e79b9525fd1e38c140424f48c609e642 SF2DEMO.(A)
-6dbe2db93323010de257bcb55d99c3fa sf2demo.exe
-19bf6938a94698296bcb0c99c31c91a7 SF2DEMO.HE0
-2577b0029ecfcb9e764e20a9b2a4be6a Sf2Demo.he2
-c23f18777b5ad558826493f69749c4c6 Sf2Demo.he4
-
-(spyozon cd hfs)
-sev
-???
-
-(spyozon cd)
-sev
-C:\Spyfox3Sputm\Src\*.cpp
-845312206b245156183ffa0ee79fcede SPYOZON.(A)
-600abd3e9f47e63e670188b7e4e86ac7 SPYOZON.HE0
-eec7f697ba008211d12be2108f9e6b56 SPYOZON.HE2
-2f238b51cfad1b8b5c179468a19aa29b SPYOZON.HE3
-6654406759193503d618405b075322e4 SPYOZON.HE4
-a76f985eb0fe5b9600dd8563cd5ac7d8 spyozon.w32
-
-(spyozon cd hfs russian updated)
-sev
-???
-
-(spyozon cd russian updated)
-sev
-C:\Spyfox3Sputm\Src\SrcPWin\*.cpp
-eb03a8bd9e7654d5d06635d934f2059b SPYFoxOzu.(a)
-194af4195ddb1f3a6017fbd6b27a92aa spyfoxozu.exe
-96a3069a3c63caa7329588ce1fef41ee SPYFoxOzu.he0
-efab08f94696fc1a7404ba366c6629d3 SPYFoxOZU.he2
-2f238b51cfad1b8b5c179468a19aa29b SPYFoxOZU.he3
-64531d4b40f2b932c8434b5c2c0f3547 SPYFoxOzu.he4
-
-(spyozon cd)
-???
-
-(spyozon demo hfs)
-???
-
-(freddicove cd/pajama4 cd)
-sev
-d:\dev\SPUTM\Src\SrcPWin\*.cpp
-0b3dac19ac1107f3fcfa9b38c47b2dfb SF3-DEMO.(A)
-ad443efafb53aa0c05749b7d523019cf SF3-DEMO.EXE
-ebd0b2c8a387f18887282afe6cad894a SF3-DEMO.HE0
-46dd1febbcad9683be77f23b666cdbbe SF3-DEMO.HE2
-145feca064ba53c0002c56a199bdc719 SF3-DEMO.HE3
-24f341ed410a69e052f90f9b3cb5ecf4 SF3-DEMO.HE4
-
-(chase cd hfs)
-Kirben
-???
-
-(chase hfs)
-Kirben
-???
-
-(chase cd hfs)
-Kirben
-???
-
-(chase hfs)
-Kirben
-???
-
-(chase cd russian)
-sev
-D:\scummsys.95\sputm.95\*.c
-dab6994bacb768b75a7085c01a473c94 Chase.a32
-9cdd327c1034c046cb595d251c44da2f CHASE.HE0
-d61f7c0fa645c0cead10e93b5223197c CHASE.HE1
-79fbaace4a08b14772aeea0250e95330 CHASE.HE2
-fe9666d561a54a101c92086d2ef77448 CHASE.HE4
-5201bee3111b5335fac48ecf30b27830 CHASE.HE8
-6d12e727e12365a23270269ca4c7e538 CHASE.HE9
-
-(mustard cd hfs)
-Kirben
-???
-
-(mustard cd)
-Kirben
-???
-
diff --git a/doc/he/smacker-md5s.txt b/doc/he/smacker-md5s.txt
deleted file mode 100644
index 39233c402b..0000000000
--- a/doc/he/smacker-md5s.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-(puttsfunshop cd/pj3 cd/puttcircus cd)
-sev
-D:\scummsys.98\sputm.98\*.c
-e07a222d121f7e8b04266bf4d7809cb4 BluesBirthdayDemo.a32
-dbf4d59d70b826733f379f998354d350 BluesBirthdayDemo.HE0
-6ddf8b026cfb9410b560f91f353dc0f4 BluesBirthdayDemo.(a)
-409a570e46466aef89c3cd3a30992543 BluesBirthdayDemo.(b)
-60cc055b47b53cb53eaa89e1f974c888 BluesBirthdayDemo.he2
-0794110b085ee91c2aa4a5fc844ff2f4 BluesBirthdayDemo.he4
-
-(puttrace cd)
-sev
-D:\scummsys.98\sputm.98\*.c
-e07a222d121f7e8b04266bf4d7809cb4 BluesBirthdayDemo.a32
-2d4acbdcfd8e374c9da8c2e7303a5cd0 BluesBirthdayDemo.HE0
-18ee74255c93da057c92effbd39ebd9a BluesBirthdayDemo.(a)
-409a570e46466aef89c3cd3a30992543 BluesBirthdayDemo.(b)
-dc5e63ecf2672d4a3a0458fe32902a4e BluesBirthdayDemo.he2
-0794110b085ee91c2aa4a5fc844ff2f4 BluesBirthdayDemo.he4
-ccca9a823d117afb1a882fd707586bf0 BluesBirthdayDemo.d32
-
-(freddi5 cd)
-sev
-C:\Dev\Project\SPUTM\Src\SrcPWin\*.cpp
-548fcedaa9cee84443a5a9acfff4cb04 ARTDEMO.(A)
-d00ffc8c32d17e575fd985d435d2eb88 ARTDEMO.HE0
-58c91c3f750b227b136e96b410b0e7cc ARTDEMO.HE2
-47f0573a8a629c6e7f8b9236112fe10e ARTDEMO.HE4
-7e98a8e45cbac83e65d98f3c133ae34d ARTDEMO.W32
-2f1a08df8aa13924959905fc5dc34a9b DATA/INTR_AT_IN_01.DAT
-f7841f8a37394805fc0699999898bcca DATA/INTR_AT_IN_02.DAT
-6a2f8c39d2ce07d422bae9f9bf416839 DATA/INTR_AT_IN_20_B.DAT
-
-(freddi5 cd)
-sev
-C:\Dev\Project\SPUTM\Src\SrcPWin\*.cpp
-f536221cc5d8da02009278523eda6bd5 READDEMO.(A)
-95818b178d473c989ac753574e8892aa READDEMO.HE0
-7c64b87e454e642e36a83c79341007b0 READDEMO.HE2
-4f307cf26e46f765298cc8f92f02db49 READDEMO.HE4
-eac7453b1dca87447974ef54137470f9 READDEMO.W32
-45a973a322b177ee4b36bea81981462d DATA/INT_RT_IN_01.DAT
-9e0c144bf1b7f0cc8ba3edae6135e313 DATA/INT_RT_IN_03.DAT
-8d150f9d9e12e485da50c4560135b4ef DATA/INT_RT_IN_04.DAT
-8cde496829546daaaa28084c49f3f4f7 DATA/INT_RT_IN_05.DAT
-c784fa970208b5bd49fff568ca0036ec DATA/INT_RT_IN_06.DAT
diff --git a/doc/he/u32.txt b/doc/he/u32.txt
deleted file mode 100644
index e4735cac71..0000000000
--- a/doc/he/u32.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-500demo, puttrace, racedemo [55808]
-39F6C16743D2AA4E0D92C2E6C4993311 500DEMO.U32
-39F6C16743D2AA4E0D92C2E6C4993311 PUTTRACE.U32
-39F6C16743D2AA4E0D92C2E6C4993311 RACEDEMO.U32
-
-basketball [282690]
-6e8c11a5294981e58032e9f2c8fcdb74 BASKETBALL.U32
-
-baseball2001, bb2demo [180224]
-23843A93F55BF0B4D7D22E80E0EEFD0A bb2demo.u32
-
-chase (he100) [118784]
-CC119A63F923076C300DC52575CB47C5 uberedit.u32
-
-football, footdemo [155648]
-07656b959c7febb6359c8de5fd6b6f76 FOOTBALL.U32
-
-football2002 [90156]
-2d027f461187ebadad44801c366b892c Football2002.u32
-
-moonbase 1.0 [458827]
-4c18f01f3020678d2ce9d5312057cb9d Moonbase.u32
-
-moondemo [458827]
-0C645CDF171CC79DAB28BF8962D6904B moondemo.u32
-
-FreddisFunShop, PuttsFunShop, SamsFunShop [40960]
-39C468587C4BDAD304BE49E8D4041A22 PuttsFunShop.u32
-39C468587C4BDAD304BE49E8D4041A22 SamsFunShop.u32
-39C468587C4BDAD304BE49E8D4041A22 FreddisFunShop.u32
-
-soccer [123904]
-ed64133f8cdfca57fb3cd09057def978 SOCCER.U32
-
-soccer2004 [90186]
-C7B6AB1B4408C4F6EB66ADD731A0DF1A SOCCER2004.U32
-
-soccerMLS [135168]
-86cb9583ca987446d12a4f36dd8d631b SoccerMLS.u32
diff --git a/doc/he/versions.html b/doc/he/versions.html
deleted file mode 100644
index 3ab604c128..0000000000
--- a/doc/he/versions.html
+++ /dev/null
@@ -1,754 +0,0 @@
-<html>
-<!-- $Id$ -->
-<p>
-Games below are believed to be SCUMM based games... most haven't been proven however.
-Every title Humongous Entertainment released before Backyard Hockey (early 2002) should be SCUMM based.
-Mac versions not listed in the interest of space, they seem to be the same as pc ones after you rename
-certain files anyway. Besides anyone who has a mac version has a PC version as the games are on hybrid
-HFS/ISO9660 CDs.
-
-<table border=1>
-
-<tr>
-<td>Game
-<td>Year
-<td>Plat
-<td>SPU Ver
-<td>Source dir
-
-
-<tr>
-<td>Putt-Putt Joins the Parade
-<td>1992
-<td>dos
-<td>6.1.1&nbsp;(Jan&nbsp;18&nbsp;1994&nbsp;09:32:55)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Joins the Parade (patch)
-<td>1992
-<td>dos
-<td>6.1.1 (Nov 20 1993 12:42:10)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Joins the Parade
-<td>1992
-<td>win
-<td>7.0.0 (Feb 7 1995 13:26:59)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Joins the Parade
-<td>1992
-<td>3do
-<td>6.5.1 (3DO)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Joins the Parade (demo)
-<td>1993
-<td>dos
-<td>6.1.1 (Mar 9 1993 21:19:14)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Joins the Parade (demo)
-<td>1993
-<td>win
-<td>7.0.0 (Feb 7 1995 13:26:59)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Goes to the Moon
-<td>1993
-<td>dos
-<td>6.1.1 (Nov 4 1993 11:12:57)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Goes to the Moon
-<td>1993
-<td>win
-<td>7.0.0 (Feb 7 1995 13:27:20)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Goes to the Moon
-<td>1993
-<td>3do
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Goes to the Moon (demo)
-<td>1993
-<td>dos
-<td>6.1.1 (Sep 29 1993 17:18:45)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Goes to the Moon (demo)
-<td>1993
-<td>win
-<td>7.0.0 (Feb 7 1995 13:27:20)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt's Fun Pack
-<td>1993
-<td>dos
-<td>6.1.1 (Feb 15 1993 20:31:55)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt's Fun Pack (patch)
-<td>1993
-<td>dos
-<td>6.1.1 (Nov 20 1993 12:20:32)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt's Fun Pack
-<td>1993
-<td>3do
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Saves the Zoo
-<td>1995
-<td>win
-<td>7.0.0 (Jul 13 1995 18:45:07)
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Putt-Putt Saves the Zoo (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Jun 4 1995 15:47:12)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Saves the Zoo (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Jun 22 1995 14:03:05)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Saves the Zoo (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Jul 5 1995 14:45:19)
-<td>&nbsp;
-
-<tr>
-<td>Putt-Putt Travels Through Time
-<td>1997
-<td>win
-<td>&nbsp;
-<td>C:\Dev\Project\SPUTM\Src\*.cpp
-
-<tr>
-<td>Putt-Putt Travels Through Time (demo)
-<td>1997
-<td>win
-<td>7.?.?
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Putt-Putt Travels Through Time (demo)
-<td>1997
-<td>win
-<td>7.?.?
-<td>c:\Build\SRC\SPUTM\Src\*.cpp
-
-<tr>
-<td>Putt-Putt Enters the Race
-<td>1998
-<td>win
-<td>7.?.?
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Putt-Putt Enters the Race (demo)
-<td>1998
-<td>win
-<td>7.?.?
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Putt-Putt Joins the Circus
-<td>&nbsp;
-<td>&nbsp;
-<td>&nbsp;
-<td>C:\Documents and Settings\stevej.BOT\My Documents\HECode\Libs\Wtoolkit\Rawbitm.cpp
-
-<tr>
-<td>Putt-Putt One-Stop Fun Shop
-<td>2000
-<td>win
-<td>7.?.?
-<td>C:\Dev\Project\SPUTM\Src\*.cpp
-
-<tr>
-<td>Putt-Putt and Pep's Balloon-O-Rama? (arcade)?
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>D:\Scummsrc.80\Sputm\*.c
-
-<tr>
-<td>Putt-Putt and Pep's Dog on a Stick? (arcade)
-<td>1999
-<td>win
-<td>7.?.?
-<td>C:\Dev\Project\SPUTM\Src\*.cpp
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Pajama Sam 1: No Need To Hide When Its Dark
-<td>1996
-<td>win
-<td>7.?.?
-<td>D:\Scummsrc.80\Sputm\*.c
-
-<tr>
-<td>Pajama Sam 1: No Need To Hide When Its Dark (demo)
-<td>1996
-<td>win
-<td>&nbsp;
-<td>D:\Scummsrc.80\Sputm\*.c
-
-<tr>
-<td>Pajama Sam 1: No Need to Hide When Its Dark (demo)
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>c:\Build\SRC\SPUTM\Src\*.cpp
-
-<tr>
-<td>Pajama Sam 2: Thunder and Lightning
-<td>1998
-<td>win
-<td>7.?.?
-<td>D:\scummsys.95\sputm.95\*.c
-
-<tr>
-<td>Pajama Sam 2: Thunder and Lightning (demo)
-<td>1998
-<td>win
-<td>&nbsp;
-<td>D:\scummsys.95\sputm.95\*.c
-
-<tr>
-<td>Pajama Sam 3: You Are What You Eat From Your
-<td>2000
-<td>win
-<td>7.?.?
-<td>C:\Dev\Project\SPUTM\Src\*.cpp
-
-<tr>
-<td>Pajama Sam 3: You Are What You Eat From (demo)
-<td>2000
-<td>win
-<td>7.?.?
-<td>C:\Dev\Project\SPUTM\Src\*.cpp
-
-<tr>
-<td>Pajama Sam One-Stop Fun Shop
-<td>2000
-<td>win
-<td>&nbsp;
-<td>C:\Documents and Settings\stevej\My Documents\HECode\SPUTM\Src\SrcPWin\*.cpp
-
-<tr>
-<td>Pajama Sam's Sock Works (arcade)
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\scummsys.80\sputm80\*.c
-
-<tr>
-<td>Pajama Sam's Lost & Found (arcade)
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Pajama Sam's Lost & Found (demo)
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\(vss)scummsys.99\SPUTM\Src\SrcPWin\*.cpp
-
-<tr>
-<td colspan=5>&nbsp;
-
-<tr>
-<td>Freddi Fish 1: The Case of the Missing Kelp
-<td>1995
-<td>?
-<td>7.0.0 (Jun 23 1995 09:58:48)
-<td>&nbsp;
-
-<tr>
-<td>Freddi Fish 1: The Case of the Missing Kelp
-<td>1998
-<td>?
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Freddi Fish 1: The Case of the Missing Kelp (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Oct 20 1994 10:00:19)
-<td>&nbsp;
-
-<tr>
-<td>Freddi Fish 1: The Case of the Missing Kelp (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Jun 22 1995 14:06:25)
-<td>&nbsp;
-
-<tr>
-<td>Freddi Fish 1: The Case of the Missing Kelp (demo)
-<td>1995
-<td>?
-<td>7.0.0 (Jul 5 1995 14:46:05)
-<td>&nbsp;
-
-<tr>
-<td>Freddi Fish 2: The Case of the Haunted Schoolhouse
-<td>1998
-<td>win
-<td>&nbsp;
-<td>D:\Scummsrc.80\Sputm\*.c
-
-<tr>
-<td>Freddi Fish 2: The Case of the Haunted (demo)
-<td>1996
-<td>win
-<td>7.?.?
-<td>D:\Scummsrc.80\Sputm\*.c
-
-<tr>
-<td>Freddi Fish 2: The Case of the Haunted (demo)
-<td>1998
-<td>win
-<td>7.?.?
-<td>c:\Build\SRC\SPUTM\Src\*.cpp
-
-<tr>
-<td>Freddi Fish 3: The Case of the Stolen Conch
-<td>1998
-<td>win
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Freddi Fish 3: The Case of the Stolen (demo)
-<td>1997
-<td>win
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Freddi Fish 4: The Case of the Hogfish Rustlers
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Freddi Fish 4: The Case of the Hogfish (demo)
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Freddi Fish 5: The Case of the Creature of Coral
-<td>2001
-<td>win
-<td>&nbsp;
-<td>C:\Spyfox3Sputm\Src\*.cpp
-
-<tr>
-<td>Freddi Fish One Stop Fun Shop
-<td>2000
-<td>win
-<td>&nbsp;
-<td>C:\Documents and Settings\stevej\My Documents\HECode\SPUTM\Src\*.cpp<br>
-
-<tr>
-<td>Freddi Fish and Luther's Maze Madness
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\scummsys\sputm80\*.c
-
-<tr>
-<td>Freddi Fish and Luther's Water Worries
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\scummsys\sputm80\*.c
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Spy Fox 1: Dry Cereal
-<td>1997
-<td>win
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Spy Fox 1: Dry Cereal (demo)
-<td>&nbsp;
-<td>&nbsp;
-<td>7.?.?
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Spy Fox 1: Dry Cereal (demo)
-<td>&nbsp;
-<td>&nbsp;
-<td>7.?.?
-<td>c:\Build\SRC\SPUTM\Src\*.cpp
-
-<tr>
-<td>Spy Fox 2: Some Assembly Required
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\(vss)scummsys.99\SPUTM\Src\*.cpp
-
-<tr>
-<td>Spy Fox 2: Some Assembly Required (Demo)
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>D:\(vss)scummsys.99\SPUTM\Src\*.cpp
-
-<tr>
-<td>Spy Fox 3: Operation Ozone
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>C:\Spyfox3Sputm\Src\SrcPWin\*.cpp
-
-<tr>
-<td>Spy Fox In Cheese Chase
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\scummsys.95\sputm.95\*.c
-
-<tr>
-<td>Spy Fox in Hold the Mustard
-<td>1999
-<td>win
-<td>&nbsp;
-<td>D:\(vss)scummsys.99\SPUTM\Src\*.cpp
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Fatty's Birthday Surprise
-<td>1993
-<td>dos
-<td>6.1.1 (Jun 23 1993 15:31:14)
-<td>&nbsp;
-
-<tr>
-<td>Fatty's Birthday Surprise
-<td>1993
-<td>win
-<td>7.0.0 (Feb 7 1995 13:27:40)
-<td>&nbsp;
-
-<tr>
-<td>Fatty's Birthday Surprise
-<td>1993
-<td>3do
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Fatty's Birthday Surprise (demo)
-<td>1993
-<td>dos
-<td>6.1.1 (Apr 6 1993 20:48:56)
-<td>&nbsp;
-
-<tr>
-<td>Fatty's Birthday Surprise (demo)
-<td>1993
-<td>win
-<td>7.0.0 (Feb 7 1995 13:27:40)
-<td>&nbsp;
-
-<tr>
-<td>Fatty Bear's Fun Pack
-<td>1993
-<td>dos
-<td>6.1.1 (Nov 11 1993 09:17:08)
-<td>&nbsp;
-
-<tr>
-<td>Fatty Bear's Fun Pack
-<td>1993
-<td>3do
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Blue's ABC Time Activities
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Blue's ABC Time Activities (demo)
-<td>&nbsp;
-<td>win
-<td>7.?.?
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Blue's 123 Time Activities
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Blue's Art Time Activities
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Blue's Birthday Adventure
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Blue's Learning Time
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Blue's Play Time
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Blue's Reading Time Activities
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Blue's Treasure Hunt
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Let's Explore the Airport with Buzzy
-<td>&nbsp;
-<td>win
-<td>7.0.0 (Jul 1 1995 21:55:39)
-<td>&nbsp;
-
-<tr>
-<td>Let's Explore the Airport with Buzzy (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Feb 8 1995 16:33:47)
-<td>&nbsp;
-
-<tr>
-<td>Let's Explore the Airport with Buzzy (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Jun 22 1995 14:06:25)
-<td>&nbsp;
-
-<tr>
-<td>Let's Explore the Airport with Buzzy (demo)
-<td>1995
-<td>win
-<td>7.0.0 (Jul 5 1995 14:46:05)
-<td>&nbsp;
-
-<tr>
-<td>Let's Explore the Jungle with Buzzy
-<td>&nbsp;
-<td>win
-<td>7.0.0 (Jul 1 1995 21:55:39)<br>7.0.0 (Oct 5 1995 08:20:42)
-<td>&nbsp;
-
-<tr>
-<td>Let's Explore the Farm with Buzzy
-<td>1996
-<td>win
-<td>7.0.0 (Jun 11 1996 19:12:56)
-<td>&nbsp;
-
-<tr>
-<td>Let's Explore the Farm with Buzzy (demo)
-<td>1994
-<td>win
-<td>7.0.0 (Oct 13 1994 19:15:16)
-<td>&nbsp;
-
-<tr>
-<td>Let's Explore the Farm with Buzzy (demo) (farm cd)
-<td>1995
-<td>win
-<td>7.0.0 (Jun 22 1995 14:05:27)
-<td>&nbsp;
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Big Thinkers First Grade
-<td>&nbsp;
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Big Thinkers First Grade (demo)
-<td>1997
-<td>win
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Big Thinkers Kindergarten
-<td>1997
-<td>win
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Big Thinkers Kindergarten (demo)
-<td>1997
-<td>win
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Humongous demo launcher "catalog"
-<td>1995
-<td>win
-<td>7.0.0 (Feb 8 1995 16:33:26)
-<td>&nbsp;
-
-<tr>
-<td>Humongous demo launcher "catalog2"
-<td>1995
-<td>win
-<td>7.0.0 (Jun 22 1995 14:01:50)
-<td>&nbsp;
-
-<tr>
-<td colspan=5>&nbsp;
-
-
-<tr>
-<td>Backyard Basketball
-<td>2001
-<td>win
-<td>&nbsp;
-<td>c:\Build\SRC\SPUTM\Src\*.cpp
-
-<tr>
-<td>Backyard Soccer
-<td>1998
-<td>win
-<td>&nbsp;
-<td>D:\scummsys.98\sputm.98\*.c
-
-<tr>
-<td>Backyard Soccer 2004
-<td>2003
-<td>win
-<td>&nbsp;
-<td>F:\HEdev\scummsys\SPUTM\Src\*.cpp
-
-<tr>
-<td>Backyard Football
-<td>1999
-<td>win
-<td>&nbsp;
-<td>&nbsp;
-
-<tr>
-<td>Backyard Football 2002
-<td>?
-<td>win
-<td>&nbsp;
-<td>C:\SRC_RELEASE\SPUTM\Src\*.cpp
-
-<tr>
-<td>Backyard Baseball
-<td>1997
-<td>win
-<td>&nbsp;
-<td>D:\Scummsys.90\sputm.90\*.c
-
-<tr>
-<td>Backyard Baseball 2001
-<td>2000
-<td>win
-<td>&nbsp;
-<td>C:\Dev\Project\SPUTM\Src\*.cpp
-
-<tr>
-<td>Backyard Baseball 2001 (demo)
-<td>2000
-<td>win
-<td>&nbsp;
-<td>C:\Dev\Project\SPUTM\Src\*.cpp
-</table>
-</html>
diff --git a/doc/it/GuidaRapida b/doc/it/GuidaRapida
new file mode 100644
index 0000000000..82059b0342
--- /dev/null
+++ b/doc/it/GuidaRapida
@@ -0,0 +1,161 @@
+Questo documento è una parziale traduzione del file README inglese. Il
+documento originale contiene molte più informazioni, quindi se qui non
+trovi ciò che ti serve e capisci un po' di inglese, prova a leggere il
+file README inglese.
+
+Per maggiori informazioni, liste di compatibilità, dettagli sulle
+donazioni, ultime versioni, resoconti sui progressi e altro, ti
+consigliamo di visitare il sito di ScummVM: http://www.scummvm.org/
+
+Indice dei contenuti:
+---------------------
+1.0) Introduzione
+ * 1.1 Informazioni su ScummVM
+ * 1.2 Guida rapida
+2.0) Contatti
+ * 2.1 Segnalazione bug
+
+1.0) Introduzione:
+---- -------------
+
+1.1) Informazioni su ScummVM:
+---- ------------------------
+ScummVM è un programma che ti permette di eseguire alcuni giochi grafici
+classici d'avventura punta-e-clicca, purché tu possieda già i loro file
+dati. La parte ingegnosa è questa: ScummVM sostituisce solo gli
+eseguibili forniti con i giochi, permettendoti di giocare su sistemi
+per i quali non erano stati concepiti!
+
+In origine è stato progettato per eseguire i giochi SCUMM della
+LucasArts, come Maniac Mansion, Monkey Island, Day of the Tentacle o Sam
+and Max. SCUMM sta per "Script Creation Utility for Maniac Mansion",
+cioè "Utilità di Creazione Script per Maniac Mansion", che è stato il
+primo gioco per il quale la LucasArts ha concepito questo sistema. E
+molto più tardi ha dato il nome a ScummVM (dove "VM" sta per Virtual
+Machine, macchina virtuale).
+
+Con il tempo è stato aggiunto il supporto a molti giochi non SCUMM, e
+ScummVM ora supporta molti giochi AGI e SCI della Sierra (come King's
+Quest 1-6, Space Quest 1-5, ...), Discworld 1 e 2, Simon the Sorcerer 1
+e 2, Beneath A Steel Sky, Lure of the Temptress, Broken Sword I and II,
+Flight of the Amazon Queen, Gobliiins 1-3, la serie di The Legend of
+Kyrandia, molti giochi SCUMM per bambini della Humongous Entertainment
+(inclusi i giochi di Freddi Fish e di Putt Putt) e molti altri. Puoi
+trovare una lista completa che elenca quali avventure sono supportate e
+in che misura nella pagina di compatibilità. ScummVM è in
+continuo miglioramento, quindi torna a dare un'occhiata ogni tanto.
+
+Tra i sistemi sui quali puoi giocare ci sono i normali computer desktop
+(con Windows, Linux, Mac OS X, ...), varie console (Dreamcast, Nintendo
+DS & Wii, PS2, PSP, ...), smartphone (Android, iPhone, PocketPC, Symbian,
+...) e altri.
+
+In questo momento è ancora in fase di sviluppo. Sappi che, anche se
+cerchiamo di assicurarci che i giochi possano essere completati senza
+bug gravi, possono avvenire dei crash e non offriamo garanzie. Detto
+questo, molti giochi sono supportati da molto tempo e dovrebbero
+funzionare in qualunque versione recente. Puoi avere una idea del
+funzionamento di ogni gioco in ScummVM guardando la pagina di
+compatibilità. A dire il vero curiosando un po' in giro potresti
+scoprire che ScummVM viene perfino usato a livello commerciale per le
+riedizioni di alcuni dei giochi supportati per le piattaforme moderne.
+Questo mostra come varie compagnie apprezzino la qualità del programma e
+la bontà di riproduzione di alcuni giochi.
+
+Se apprezzi ScummVM sentiti libero di fare una donazione usando il tasto
+PayPal sulla homepage di ScummVM. Questo ci permetterà di comprare
+strumenti necessari a sviluppare ScummVM in maniera più semplice e
+veloce. Se non puoi fare una donazione, contribuisci con una patch!
+
+1.2) Guida rapida:
+---- -------------
+IMPORTANTE: questa breve guida assume che tu stia usando ScummVM in
+italiano. Come impostazione predefinita, ScummVM userà la lingua del tuo
+sistema operativo. Se preferisci usare ScummVM in inglese, potresti
+preferire la guida in inglese nel file README.
+
+Per chi non può aspettare, di seguito è spiegato come far partire
+ScummVM in cinque semplici passi.
+
+1. Scarica ScummVM da <http://www.scummvm.org/downloads.php> e
+installalo.
+
+2. Crea una cartella sul disco rigido e copia i file di gioco dal
+supporto originale in questa cartella. Ripeti questa operazione per
+tutti i giochi (è consigliabile utilizzare una diversa cartella per ogni
+gioco).
+
+3. Avvia ScummVM.
+
+Se ScummVM appare in inglese invece che in italiano, procedi come segue
+per cambiare la lingua:
+- Clicca su "Options".
+- Clicca sulla freccia destra nella barra delle schede e seleziona la
+ scheda "Misc".
+- Seleziona "Italiano" nel menu a tendina "GUI Language" e clicca "OK".
+- Dai la conferma al messaggio che appare, clicca "Quit" per chiudere
+ ScummVM e riavvia il programma.
+
+Ora scegli "Aggiungi gioco", seleziona la cartella con i file dati (non
+selezionare i singoli file!) e premi "Scegli".
+
+4. Dovrebbe apparire una finestra per permetterti di configurare varie
+impostazioni (dovrebbe comunque funzionare bene lasciando tutto com'è).
+Dai l'OK di conferma.
+
+5. Seleziona il gioco che vuoi lanciare dalla lista, e premi "Gioca".
+
+ScummVM ricorda i giochi aggiunti. Quindi se chiudi ScummVM, al
+successivo avvio la lista conterrà tutti i giochi aggiunti in
+precedenza. Puoi quindi andare direttamente al punto 5, a meno che tu
+non voglia aggiungere altri giochi.
+
+Suggerimento: se vuoi aggiungere una serie di giochi in un solo colpo,
+prova a tenere premuto il tasto shift prima di cliccare su "Aggiungi
+gioco" -- l'etichetta del pulsante diventerà "Agg. in massa" e se lo
+premi ti verrà di nuovo chiesto di selezionare una cartella, ma questa
+volta ScummVM cercherà i giochi supportati in tutte le sotto-cartelle.
+
+
+2.0) Contatti:
+---- ---------
+Il modo più facile per contattare il team di ScummVM è attraverso la
+segnalazione di bug (vedi sezione 2.1) o tramite il forum su
+http://forums.scummvm.org. Puoi anche iscriverti alla mailing list
+scummvm-devel o contattarci in chat su IRC (#scummvm su
+irc.freenode.net). Per favore non chiederci di supportare un gioco non
+supportato -- prima leggi le FAQ sul nostro sito web. Ricorda che la
+lingua ufficiale di forum, mailing list e chat è l'inglese e non sarà
+usata nessuna altra lingua.
+
+
+2.1) Segnalazione bug:
+---- -----------------
+Per segnalare un bug, crea un account SourceForge e apri il link "Bug
+Tracker" sulla nostra homepage. Per favore assicurati che il bug sia
+riproducibile e che si verifichi nell'ultima versione giornaliera SVN.
+Controlla anche la lista dei problemi noti e la lista di compatibilità
+sul nostro sito, per assicurarti che il problema non sia già noto:
+
+ http://www.scummvm.org/compatibility_stable.php
+
+Per favore non segnalare bug di giochi che non sono segnati come
+completabili nella sezione "Supported Games" o nella lista di
+compatibilità.
+
+Per favore includi le seguenti informazioni:
+ - Versione di ScummVM (PER FAVORE testa l'ultima versione SVN)
+ - Dettagli del bug, incluse le istruzioni per riprodurlo
+ - Lingua del gioco (inglese, tedesco, ...)
+ - Versione del gioco (talkie, floppy, ...)
+ - Piattaforma e compilatore (Win32, Linux, FreeBSD, ...)
+ - Allega un salvataggio se possibile
+ - Se questo bug è apparso solo recentemente, per favore segnala
+ l'ultima versione senza il bug e la prima versione con il bug. In
+ questo modo possiamo correggerlo più velocemente controllando i
+ cambiamenti fatti.
+
+Infine, per favore segnala ogni problema separatamente; non riportare
+più problemi nello stesso ticket. (Altrimenti diventa difficile
+assegnare uno stato al singolo bug). Per favore ricordati che tutte le
+segnalazioni devono essere scritte in inglese.
diff --git a/doc/no-nb/HurtigStart b/doc/no-nb/HurtigStart
new file mode 100644
index 0000000000..be59253945
--- /dev/null
+++ b/doc/no-nb/HurtigStart
@@ -0,0 +1,156 @@
+Dette dokumentet er en delvis oversettelse av den engelske README-filen.
+Originaldokumentet har vesentlig mer informasjon, så dersom du ikke finner
+det du leter etter her, og forstår litt engelsk, kan du prøve å lete videre
+i den engelske README-filen.
+
+For mer informasjon, kompatibilitetslister, donasjonsdetaljer, nyeste versjon
+av ScummVM, fremdriftsoversikt med mer, besøk ScummVMs hjemmeside på:
+http://www.scummvm.org/
+
+Innholdsfortegnelse:
+-------------------
+1.0) Introduksjon
+ * 1.1 Om ScummVM
+ * 1.2 Hurtigstart
+2.0) Kontaktinfo
+ * 2.1 Rapportering av Bugs
+
+1.0) Introduksjon:
+---- -------------
+
+1.1) Om ScummVM:
+---- --------------
+ScummVM er et program som lar deg kjøre visse klassiske grafiske
+pek-og-klikk eventyrspill hvis du har datafilene til disse fra før.
+Den interessante detaljen er at ScummVM bare erstatter programfilene
+som kom med spillet, slik at du kan spille spillene på systemer de
+aldri ble designet for i grunnlaget.
+
+Opprinnelig var ScummVM bare designet for å kjøre LucasArts sine SCUMM-
+spill, slik som Maniac Mansion, Monkey Island, Day of The Tentacle eller
+Sam and Max. SCUMM står for «Script Creation Utility for Maniac Mansion»,
+(Skriptproduksjonsverktøy for Maniac Mansion), som var det første spillet
+LucasArts designet for dette systemet. I nyere tid har det da også døpt
+ScummVM (der 'VM' betyr Virtuell Maskin).
+
+Over tid har det blitt lagt til støtte for flere ikke-SCUMM-spill, så
+ScummVM støtter nå også mange av Sierras AGI og SCI-spill (slik som
+King's Quest 1-6, Space Quest 1-5, ...), Discworld 1 og 2, Simon the
+Sorcerer 1 og 2, Beneath A Steel Sky, Lure of the Temptress, Broken
+Sword I og II, Flight of the Amazon Queen, Gobliiins 1-3, The Legend of
+Kyrandia-serien, mange av Humongous Entertainment sine SCUMM-spill for
+barn (inkludert Freddi Fish-, og Putt Putt-spillene) mfl. Du finner
+en utfyllende liste med detaljer rundt hvilke eventyrspill som støttes,
+og hvor godt de støttes på kompatibilitets-siden. ScummVM forbedres
+stadig, så det kan lønne seg å kikke innom med jevne mellomrom.
+
+Blant systemene som spillene nå kan spilles på, finner vi vanlige
+stasjonære datamaskiner (med Windows, Linux, Mac OS X, etc), spillkonsoller
+(Dreamcast, Nintendo DS & Wii, PS2, PSP, ...), smarttelefoner (Android,
+iPhone, PocketPC, Symbian ...) mfl.
+
+På nåværende tidspunkt er ScummVM fortsatt under kraftig utvikling. Så
+være obs på at selv om vi forsøker å sikre oss at de fleste spillene kan
+fullføres uten større feil og mangler, kan det forekomme at spill krasjer,
+og vi gir ingen garanti for at ting fungerer. Når det er sagt, så har
+enkelte av spillene vært støttet i lang tid, og bør fungere finfint med
+enhver ny «stable»-versjon av ScummVM. Du kan finne en pekepinn på hvor
+godt hvert enkelt spill fungerer ved å se på kompatibilitetssiden vår.
+Faktisk, hvis man ser litt rundtom på nettet, vil man oppdage at ScummVM
+brukes kommersielt for å relansere noen av de støttede spillene på moderne
+platformer. Dette viser at flere firma er fornøyd med kvaliteten på
+programmet, og hvor godt det kjører enkelte av spillene.
+
+Hvis du liker ScummVM, doner gjerne ved å bruke PayPal-knappen på hjemme-
+siden vår. Dette hjelper oss til å kunne kjøpe verktøyene vi trenger for
+Ã¥ utvikle ScummVM enklere og mer effektivt. Hvis du ikke kan donere, hjelp
+gjerne ved å sende inn en patch.
+
+1.2) Hurtigstart:
+---- ------------
+VIKTIG: Denne korte gaiden antar at du bruker ScumMVM på bokmål. Som standard
+bruker ScummVM samme språk som operativsystemet ditt. Hvis du foretrekker å
+bruker ScummVM på engelsk, vil du muligens også foretrekke å følge gaiden
+i den engelske README-filen.
+
+For de rastløse; en enkel femstegs-gaid til å få ScummVM opp og kjøre:
+
+1. Last ned ScummVM fra <http://www.scummvm.org/downloads.php> og installer.
+
+2. Lag en mappe på harddisken din, og kopier spill-datafilene fra original-
+mediene til denne mappen. Gjenta dette for alle spillene du ønsker å spille.
+(Det er en fordel om du bruker en adskilt mappe for hvert spill)
+
+3. Start ScummVM.
+
+Dersom ScummVM starter på engelsk istedenfor på bokmål, gjør følgende
+for å endre språk:
+- Klikk på «Options».
+- Klikk på den høyre pilen i fanelinjen og velg fanen «Misc».
+- Velg «Norsk (bokmål)» i «GUI Language» boksen, og klikk OK.
+- Godkjenn meldingen som dukker opp, og klikk på «Quit» for å avslutte
+ScummVM, start så programmet på nytt.
+
+Velg «Legg til spill», velg mappen som inneholder spillfilene (ikke
+prøv å velge datafilene direkte!) og klikk «Velg».
+
+4. Det skal nå dukke opp en dialog som lar deg konfigurere forskjellige
+instillinger om det er ønskelig (det fungerer som oftest helt fint å
+la standardinstillingene være). Godkjenn denne dialogen.
+
+5. Velg spillet du vil spille i lista, og klikk 'Start'.
+
+ScummVM husker spillene du har lagt til. SÃ¥ om du lukker ScummVM, vil
+listen over spill du har lagt til tidligere fortsatt være der. Derfor
+kan du ved senere anledninger gå direkte til steg 5, med mindre du vil
+legge til flere spill.
+
+Tips: Om du vil legge til flere spill samtidig, prøv å holde shift-
+tasten nede mens du klikker på «Legg til spill» da vil teksten der
+forandre seg til «Legg til flere» og om du klikker på den, får du også
+samme spørsmål om å velge en mappe, men nå vil ScummVM lete gjennom
+alle undermapper etter støttede spill.
+
+2.0) Kontaktinfo:
+---- ------------
+Den enkleste måten å komme i kontakt med ScummVM-teamet på er ved å
+sende inn en bug-rapport, eller ved å bruke forumet du finner på
+http://forums.scummvm.org . Du kan også bli med og delta på epost-
+listen scummvm-devel , eller chatte med oss på IRC (#scummvm på
+irc.freenode.net) Vær så snill å ikke spør oss om å legge til støtte
+for et ustøttet spill -- les FAQen på hjemmesiden vår først. Legg merke
+til at det offisielle språket på forum, epostliste og chat er engelsk,
+så andre språk bør unngås.
+
+2.1) Rapportering av Bugs:
+---- ---------------------
+For å rapportere en bug, må du lage deg en SourceForge-konto, og følge
+«Bug Tracker»-lenken på hjemmesiden vår. Vennligst forsikre deg om at
+buggen du skal rapportere kan reproduseres, og at den fortsatt opptrer
+i den ferskeste git/Daily-versjonen. Sjekk også listen over kjente feil
+lenger ned i dette dokumentet, og kompatibilitetslisten på hjemmesiden
+vår angående spillet det gjelder, for å forsikre deg om at problemet ikke
+allerede har blitt rapportert:
+
+ http://www.scummvm.org/compatibility_stable.php
+
+Vennligst ikke rapporter bugs om spill som ikke står listet som
+«completable» i «Supported Games»-seksjonen, eller på kompatibilitetslisten.
+Vi VET at de spillene har bugs.
+
+Vennligst inkluder følgende informasjon:
+ - ScummVM-versjon (VÆR SÅ SNILL; test den ferskeste git/Daily-builden)
+ - Bug-detaljer, inkludert instruksjoner om hvordan man reproduserer buggen.
+ - Spillets språk (Engelsk, Tysk, ...)
+ - Spillversjon (med tale, diskettversjon, ...)
+ - Platform og kompilator ( Win32, Linux, FreeBSD, ...)
+ - Legg ved et lagret spill om mulig
+ - Dersom denne buggen kun oppsto nylig, vennligst nevn hvilken
+ versjon som var den siste som ikke hadde problemet. På den måten
+ kan vi løse problemet raskere ved å kikke på hvilke endringer som
+ har skjedd.
+
+Til slutt: Vennligst rapporter hvert problem for seg, ikke inkluder
+flere problemer i samme rapport. (Ellers blir det problematisk å
+holde orden på statusen til hver enkelt bug). Husk også at ALLE
+bug-rapporter MÅ skrives på engelsk.
diff --git a/doc/translations/README-de.txt b/doc/translations/README-de.txt
deleted file mode 100755
index a1d7d6eb5f..0000000000
--- a/doc/translations/README-de.txt
+++ /dev/null
@@ -1,178 +0,0 @@
-Dieses Dokument ist eine auszugsweise Ãœbersetzung der englischen
-REAMDE-Datei. Das Original-Dokument enthält viel mehr Informationen.
-Sollten Sie hier also nicht das finden, was Sie benötigen und ein wenig
-Englisch können, sollten Sie sich die englische README-Datei ansehen.
-
-Für weitere Informationen, Kompatiblitätslisten, Einzelheiten zu Spenden,
-die neusten veröffentlichten Versionen, Fortschrittberichte und mehr
-besuchen Sie bitte die ScummVM-Website unter der Adresse:
-http://www.scummvm.org/
-
-Inhaltsverzeichnis:
-------------------
-1.0) Einführung
- * 1.1 Ãœber ScummVM
- * 1.2 Schnellstart
-2.0) Kontakt
- * 2.1 Fehler berichten
-
-1.0) Einführung:
----- -------------
-
-1.1) Ãœber ScummVM:
----- --------------
-ScummVM ist ein Programm, welches es Ihnen ermöglicht, bestimmte klassische
-Grafik-Adventure (unter anderem aus dem Point-and-Click-Bereich) zu spielen,
-vorausgesetzt, Sie sind im Besitz der Dateien des Spiels. Das Schlaue daran
-ist: ScummVM ersetzt lediglich die Funktion der ausführbaren Dateien,
-die mit den Spielen kamen, was ermöglicht, diese Spiele auf Systemen zu spielen,
-für welche sie nie erstellt wurden!
-
-Ursprünglich wurde dieses Programm dafür entwickelt, um SCUMM-Spiele von
-LucasArts auszuführen, wie beispielsweise Maniac Mansion, Monkey Island,
-Day of the Tentacle oder Sam and Max. SCUMM steht als Abkürzung für
-„Script Creation Utility for Maniac Mansion“ (deutsch etwa:
-Skripterstellungsdienstprogramm für Maniac Mansion), was das erste
-Spiel von LucasArts war, für welches LucasArts dieses System entworfen hatte.
-Und viel später verlieh es seinen Namen an ScummVM (wobei „VM“ für
-„Virtuelle Maschine“ steht).
-
-Mit der Zeit wurde Unterstützung für viele Nicht-SCUMM-Spiele hinzugefügt.
-Einige Adventures, die ScummVM unterstützt, sind unter anderem Simon the
-Sorcerer 1 und 2 von Adventure Soft, Beneath A Steel Sky und
-Baphomets Fluch 1 und 2 von Revolution, Flight of the Amazon Queen,
-Erben der Erde (Wyrmkeep), Gobliiins von Coktel Vision sowie
-The Legend of Kyrandia von Westwood Studios.
-Sie können eine genaue Liste mit Einzelheiten einsehen, welche Auskunft
-darüber gibt, welche Spiele unterstützt werden und wie gut. Gehen Sie
-hierfür auf die Kompatiblitätsseite. ScummVM wird kontinuierlich
-verbessert, also schauen Sie oft vorbei.
-
-Unter den Systemen, mit denen Sie diese Spiele spielen können, befinden
-sich Windows, Linux, Mac OS X, Dreamcast, PocketPC, PalmOS, iPhone,
-AmigaOS, BeOS, OS/2, PSP, PS2, SymbianOS/EPOC und viele mehr.
-
-Zurzeit befindet sich ScummVM immer noch stark in der Entwicklung.
-Seien Sie sich bewusst, dass wir zwar versuchen, dass viele Spiele
-mit wenigen erheblichen Fehlern durchgespielt werden können, aber es
-dennoch zu Abstürzen kommen kann und wir keine Gewähr übernehmen.
-Davon abgesehen: Einige Spiele werden seit längerer Zeit unterstützt
-und sollten in jeder stabilen veröffentlichten Version gut laufen.
-Sie können sich einen Eindruck davon verschaffen, wie gut jedes Spiel
-unter ScummVM läuft, indem Sie auf die Kompatiblitätsseite schauen.
-
-Wenn Sie sich ein wenig umsehen, können Sie herausfinden, dass
-ScummVM sogar kommerziell genutzt wird, um einige der unterstützen Spiele
-auf modernen Plattformen wiederzuveröffentlichen. Dies zeigt, dass
-verschiedene Firmen mit der Qualität der Software zufrieden sind und wie gut
-einige der Spiele mit ihrer Hilfe laufen.
-
-Wenn Ihnen ScummVM gefällt, können Sie uns gerne etwas Geld spenden,
-um uns finanziell zu unterstützen. Dies hilft uns dabei, notwendige
-Dienstprogramme zu kaufen, um ScummVM einfacher und schneller zu entwickeln.
-Wenn Sie nicht spenden können, dürfen Sie auch gerne einen Patch beisteuern.
-
-1.2) Schnellstart:
----- ------------
-WICHTIG: In der unteren kurzen Anleitung wird davon ausgegangen, dass Sie
-ScummVM auf Deutsch benutzen. Standardmäßig wird ScummVM die Sprache
-Ihres Betriebssystems verwenden. Falls ScummVM auf Englisch statt auf
-Deutsch erscheint, sollten Sie folgende Schritte ausführen, wenn Sie bei
-Schritt 3 angelangt sind und ScummVM gestartet haben:
--Klicken Sie auf "Options".
--Klicken Sie auf den rechten Pfeil in der Reiterleiste und wählen den
- Reiter "Misc" aus.
--Wählen Sie im Feld "GUI Language" "Deutsch" aus und klicken auf "OK".
--Bestätigen Sie die erscheinende Nachricht, klicken auf "Quit", um
- ScummVM zu beenden und starten dann das Programm erneut.
-
-Wenn Sie ScummVM lieber in Englisch verwenden möchten, benutzen Sie bitte
-die Anleitung in der englischen README-Datei.
-
-
-Für die ungelduldigen unter den Benutzern ist hier in fünf einfachen
-Schritten kurz beschrieben, wie man ScummVM lauffähig macht und das
-Programm verwendet.
-
-1. Laden Sie ScummVM unter der Adresse
-<http://www.scummvm.org/downloads.php> herunter und installieren Sie es.
-
-2. Erstellen Sie ein Verzeichnis auf Ihrer Festplatte und kopieren Sie
-die Dateien des Spiels vom Original-Datenträger in dieses Verzeichnis.
-Wiederholen Sie diesen Vorgang für jedes Spiel, das Sie spielen möchten.
-
-3. Starten Sie ScummVM, wählen Sie "Spiel hinzufügen" aus, wählen Sie das
-Verzeichnis mit den Dateien des Spiels aus (versuchen Sie nicht, die
-Dateien des Spiels selbst auszuwählen!) und klicken Sie auf "Auswählen".
-
-4. Ein Dialog sollte erscheinen, der Ihnen ermöglicht, verschiedene
-Einstellungen vorzunehmn, sollten Sie dies wünschen (es sollte jedoch in
-Ordnung sein, alles voreingestellt zu belassen). Bestätigen Sie diesen
-Dialog.
-
-5. Wählen Sie das Spiel aus der Liste aus, welches Sie spielen möchten
-und klicken Sie auf "Starten".
-
-In Zukunft sollte es nun möglich sein, direkt zu Schritt 5 überzugehen,
-außer Sie wollen noch mehr Spiele hinzufügen.
-
-Tipp: Wenn Sie mehrere Spiele auf einmal hinzufügen möchten, drücken Sie
-die Umschalt-Taste (Shift), bevor Sie auf "Spiel hinzufügen" klicken.
-Diese Schaltfläche wird somit ihren Text zu "Durchsuchen" umändern und
-wenn Sie dann auf diese klicken, werden Sie auch dazu aufgefordert, ein
-Verzeichnis auszuwählen, nur dieses Mal wird ScummVM alle
-Unterverzeichnisse automatisch nach unterstützen Spielen durchsuchen.
-
-
-2.0) Kontakt:
----- --------
-Der einfachste Weg, um mit dem ScummVM-Team in Verbindung zu treten, ist,
-Fehlerberichte einzusenden (siehe Abschnitt 2.1) oder durch Verwendung
-des Forums unter der Adresse http://forums.scummvm.org .
-Sie können ebenso der Mailing-Liste scummvm-devel betreiten und an diese
-E-Mails versenden oder mit uns im IRC chatten (#scummvm unter
-irc.freenode.net). Bitte fordern Sie uns nicht dazu auf, ein nicht
-unterstütztes Spiel zu unterstützen. Lesen Sie zuerst die Seite FAQ
-(Häufig gestellte Fragen) auf unserer Website.
-Bitte beachten Sie Kenntnis, dass die offizielle Sprache des Forums,
-der Mailing-Liste und des Chats Englisch ist und keine andere Sprache
-dort verwendet werden sollte.
-
-
-2.1) Fehler berichten:
----- ---------------
-Um einen Fehler zu berichten, erstellen Sie bitte ein SourceForge-Konto
-und folgen Sie dem Link "Bug Tracker" auf der ScummVM-Website. Bitte
-stellen Sie sicher, dass sich der Bug wiedererzeugen lässt und immer noch
-in der neusten Version von SVN oder des Daily builds auftritt. Bitte
-sehen Sie auch auf der Problemliste unten und der Kompatiblitätsliste auf
-der ScummVM-Website für dieses Spiel nach, um sicherzustellen, dass das
-Problem nicht bereits bekannt ist:
-
- http://www.scummvm.org/compatibility_stable.php
-
-Bitte berichten Sie keine Fehler zu Spielen, die nicht als durchspielbar
-im Bereich "Supported Games" oder der Kompatiblitätsliste aufgelistet
-sind. Wir -wissen-, dass diese Spiele Fehler aufweisen.
-
-Bitte liefern Sie folgende Informationen:
- - ScummVM-Version (BITTE mit neuster Version von SVN oder
- des Daily builds testen)
- - Einzelheiten zum Fehler, einschließlich Anweisungen, um den Fehler
- hervorzurufen
- - Sprache des Spiels (Englisch, Deutsch, ...)
- - Version des Spiels (Version mit Sprachausgabe [Talkie],
- Disketten-Version, ...)
- - Plattform und gegebenenfalls Compiler (Win32, Linux, FreeBSD, ...)
- - Fügen Sie einen Speicherstand hinzu, wenn es möglich ist.
- - Wenn dieser Fehler erst seit kurzem Auftritt, teilen Sie bitte die
- letzte Version ohne den Fehler mit und die erste Version mit diesem
- Fehler. Auf diese Weise können wir diesen schneller beseitigen,
- indem wir die vorgenommen Veränderungen einsehen.
-
-Zum Schluss möchten wir Sie noch bitten, jeden Punkt einzeln zu
-berichten; bitte senden Sie nicht mehrere Punkte mit dem selben Ticket
-ein, ansonsten wird es schwierig, den Status jedes einzelnen Fehlers
-zu verfolgen. Denken Sie bitte auch daran, dass alle Fehlerberichte in
-Englisch verfasst sein müssen.
-
diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp
index d864fe8b52..081a97b9f1 100644
--- a/engines/advancedDetector.cpp
+++ b/engines/advancedDetector.cpp
@@ -104,7 +104,7 @@ void AdvancedMetaEngine::updateGameDescriptor(GameDescriptor &desc, const ADGame
if (_flags & kADFlagUseExtraAsHint)
desc["extra"] = realDesc->extra;
- desc.setGUIOptions(realDesc->guioptions | _guioptions);
+ desc.setGUIOptions(realDesc->guioptions + _guioptions);
desc.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(realDesc->language));
if (realDesc->flags & ADGF_ADDENGLISH)
@@ -207,7 +207,7 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine)
}
Common::FSNode dir(path);
Common::FSList files;
- if (!dir.isDirectory() || !dir.getChildren(files, Common::FSNode::kListAll)) {
+ if (!dir.isDirectory() || !dir.getChildren(files, Common::FSNode::kListAll, true)) {
warning("Game data path does not exist or is not a directory (%s)", path.c_str());
return Common::kNoGameDataFoundError;
}
@@ -257,7 +257,7 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine)
if (agdDesc->flags & ADGF_ADDENGLISH)
lang += " " + getGameGUIOptionsDescriptionLanguage(Common::EN_ANY);
- Common::updateGameGUIOptions(agdDesc->guioptions | _guioptions, lang);
+ Common::updateGameGUIOptions(agdDesc->guioptions + _guioptions, lang);
GameDescriptor gameDescriptor = toGameDescriptor(*agdDesc, _gameids);
@@ -568,7 +568,7 @@ AdvancedMetaEngine::AdvancedMetaEngine(const void *descs, uint descItemSize, con
_md5Bytes = 5000;
_singleid = NULL;
_flags = 0;
- _guioptions = Common::GUIO_NONE;
+ _guioptions = GUIO_NONE;
_maxScanDepth = 1;
_directoryGlobs = NULL;
}
diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h
index cbdfdf39d8..9a6b5e4ef7 100644
--- a/engines/advancedDetector.h
+++ b/engines/advancedDetector.h
@@ -88,7 +88,7 @@ struct ADGameDescription {
*/
uint32 flags;
- uint32 guioptions;
+ const char *guioptions;
};
/**
@@ -101,7 +101,7 @@ typedef Common::Array<const ADGameDescription *> ADGameDescList;
* terminate a list to be passed to the AdvancedDetector API.
*/
#define AD_TABLE_END_MARKER \
- { NULL, NULL, { { NULL, 0, NULL, 0 } }, Common::UNK_LANG, Common::kPlatformUnknown, ADGF_NO_FLAGS, Common::GUIO_NONE }
+ { NULL, NULL, { { NULL, 0, NULL, 0 } }, Common::UNK_LANG, Common::kPlatformUnknown, ADGF_NO_FLAGS, GUIO1(GUIO_NONE) }
struct ADFileBasedFallback {
/**
@@ -161,7 +161,7 @@ protected:
* is primarily based on computing and matching MD5 checksums of files.
* Since doing that for large files can be slow, it can be restricted
* to a subset of all files.
- * Typically this will be set to something between 5 and 50 kilobyte,
+ * Typically this will be set to something between 5 and 50 kilobytes,
* but arbitrary non-zero values are possible. The default is 5000.
*/
uint _md5Bytes;
@@ -181,11 +181,11 @@ protected:
uint32 _flags;
/**
- * A bitmask of game GUI options which will be added to each
+ * A list of game GUI options which will be added to each
* entry in addition to per-game options. Refer to GameGUIOption
* enum for the list.
*/
- uint32 _guioptions;
+ Common::String _guioptions;
/**
* Maximum depth of directories to look up.
diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp
index 0eefbab04d..4ed606c3ba 100644
--- a/engines/agi/agi.cpp
+++ b/engines/agi/agi.cpp
@@ -362,9 +362,15 @@ int AgiEngine::agiInit() {
initPriTable();
- // clear string buffer
- for (i = 0; i < MAX_STRINGS; i++)
- _game.strings[i][0] = 0;
+ // Clear the string buffer on startup, but not when the game restarts, as
+ // some scripts expect that the game strings remain unaffected after a
+ // restart. An example is script 98 in SQ2, which is not invoked on restart
+ // to ask Ego's name again. The name is supposed to be maintained in string 1.
+ // Fixes bug #3292784.
+ if (!_restartGame) {
+ for (i = 0; i < MAX_STRINGS; i++)
+ _game.strings[i][0] = 0;
+ }
// setup emulation
@@ -504,6 +510,7 @@ AgiBase::AgiBase(OSystem *syst, const AGIGameDescription *gameDesc) : Engine(sys
_noSaveLoadAllowed = false;
_rnd = new Common::RandomSource("agi");
+ _sound = 0;
initFeatures();
initVersion();
@@ -511,6 +518,26 @@ AgiBase::AgiBase(OSystem *syst, const AGIGameDescription *gameDesc) : Engine(sys
AgiBase::~AgiBase() {
delete _rnd;
+
+ if (_sound) {
+ _sound->deinitSound();
+ delete _sound;
+ }
+}
+
+void AgiBase::initRenderMode() {
+ _renderMode = Common::kRenderEGA;
+
+ if (ConfMan.hasKey("platform")) {
+ Common::Platform platform = Common::parsePlatform(ConfMan.get("platform"));
+ _renderMode = (platform == Common::kPlatformAmiga) ? Common::kRenderAmiga : Common::kRenderEGA;
+ }
+
+ if (ConfMan.hasKey("render_mode")) {
+ Common::RenderMode tmpMode = Common::parseRenderMode(ConfMan.get("render_mode").c_str());
+ if (tmpMode != Common::kRenderDefault)
+ _renderMode = tmpMode;
+ }
}
AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBase(syst, gameDesc) {
@@ -536,6 +563,8 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas
memset(&_debug, 0, sizeof(struct AgiDebug));
memset(&_mouse, 0, sizeof(struct Mouse));
+ _game._vm = this;
+
_game.clockEnabled = false;
_game.state = STATE_INIT;
@@ -564,14 +593,10 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas
_predictiveDictLineCount = 0;
_firstSlot = 0;
- // NOTE: On game reload the keys do not get set again,
- // thus it is incorrect to reset it in agiInit(). Fixes bug #2823762
- _game.lastController = 0;
- for (int i = 0; i < MAX_DIRS; i++)
- _game.controllerOccured[i] = false;
+ resetControllers();
setupOpcodes();
- _curLogic = NULL;
+ _game._curLogic = NULL;
_timerHack = 0;
}
@@ -610,23 +635,7 @@ void AgiEngine::initialize() {
}
}
- if (ConfMan.hasKey("render_mode")) {
- _renderMode = Common::parseRenderMode(ConfMan.get("render_mode").c_str());
- } else if (ConfMan.hasKey("platform")) {
- switch (Common::parsePlatform(ConfMan.get("platform"))) {
- case Common::kPlatformAmiga:
- _renderMode = Common::kRenderAmiga;
- break;
- case Common::kPlatformPC:
- _renderMode = Common::kRenderEGA;
- break;
- default:
- _renderMode = Common::kRenderEGA;
- break;
- }
- } else {
- _renderMode = Common::kRenderDefault;
- }
+ initRenderMode();
_buttonStyle = AgiButtonStyle(_renderMode);
_defaultButtonStyle = AgiButtonStyle();
@@ -680,8 +689,6 @@ AgiEngine::~AgiEngine() {
agiDeinit();
delete _loader;
- _sound->deinitSound();
- delete _sound;
_gfx->deinitVideo();
delete _sprites;
delete _picture;
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index 0155caf11d..6bb3beec78 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -88,6 +88,7 @@ typedef signed int Err;
#define _EMPTY 0xfffff
#define EGO_OWNED 0xff
+#define EGO_OWNED_V1 0xf9
#define CRYPT_KEY_SIERRA "Avis Durgan"
#define CRYPT_KEY_AGDS "Alex Simkin"
@@ -123,7 +124,6 @@ enum AgiGameID {
GID_XMASCARD,
GID_FANMADE,
GID_GETOUTTASQ, // Fanmade
- GID_SQ0, // Fanmade
GID_MICKEY, // PreAGI
GID_WINNIE, // PreAGI
GID_TROLL // PreAGI
@@ -131,10 +131,16 @@ enum AgiGameID {
enum AgiGameType {
GType_PreAGI = 0,
- GType_V2 = 1,
- GType_V3 = 2
+ GType_V1 = 1,
+ GType_V2 = 2,
+ GType_V3 = 3
};
+ enum BooterDisks {
+ BooterDisk1 = 0,
+ BooterDisk2 = 1
+ };
+
//
// GF_OLDAMIGAV20 means that the interpreter is an old Amiga AGI interpreter that
// uses value 20 for the computer type (v20 i.e. vComputer) rather than the usual value 5.
@@ -537,6 +543,8 @@ enum {
* by the interpreter.
*/
struct AgiGame {
+ AgiEngine *_vm;
+
State state; /**< state of the interpreter */
// TODO: Check whether adjMouseX and adjMouseY must be saved and loaded when using savegames.
@@ -605,7 +613,6 @@ struct AgiGame {
bool controllerOccured[MAX_DIRS]; /**< keyboard keypress events */
AgiController controllers[MAX_CONTROLLERS];
- int lastController;
char strings[MAX_STRINGS + 1][MAX_STRINGLEN]; /**< strings */
@@ -621,6 +628,11 @@ struct AgiGame {
AgiView views[MAX_DIRS]; /**< AGI view resources */
AgiSound *sounds[MAX_DIRS]; /**< Pointers to AGI sound resources */
+ AgiLogic *_curLogic;
+
+ // words
+ Common::Array<AgiWord*> words[26];
+
// view table
VtEntry viewTable[MAX_VIEWTABLE];
@@ -629,6 +641,13 @@ struct AgiGame {
int simpleSave; /**< select simple savegames */
Common::Rect mouseFence; /**< rectangle set by fence.mouse command */
+
+ // IF condition handling
+ int testResult;
+
+
+ int max_logics;
+ int logic_list[256];
};
class AgiLoader {
@@ -646,6 +665,28 @@ public:
virtual int loadWords(const char *) = 0;
};
+class AgiLoader_v1 : public AgiLoader {
+private:
+ AgiEngine *_vm;
+ Common::String _filenameDisk0;
+ Common::String _filenameDisk1;
+
+ int loadDir_DDP(AgiDir *agid, int offset, int max);
+ int loadDir_BC(AgiDir *agid, int offset, int max);
+ uint8 *loadVolRes(AgiDir *agid);
+
+public:
+ AgiLoader_v1(AgiEngine *vm);
+
+ virtual int init();
+ virtual int deinit();
+ virtual int detectGame();
+ virtual int loadResource(int, int);
+ virtual int unloadResource(int, int);
+ virtual int loadObjects(const char *);
+ virtual int loadWords(const char *);
+};
+
class AgiLoader_v2 : public AgiLoader {
private:
AgiEngine *_vm;
@@ -690,6 +731,7 @@ public:
virtual int loadWords(const char *);
};
+
class GfxMgr;
class SpritesMgr;
class Menu;
@@ -734,6 +776,8 @@ protected:
virtual void initialize() = 0;
+ void initRenderMode();
+
public:
GfxMgr *_gfx;
@@ -745,6 +789,8 @@ public:
AgiGame _game;
Common::RandomSource *_rnd;
+ SoundMgr *_sound;
+
Mouse _mouse;
bool _noSaveLoadAllowed;
@@ -763,8 +809,8 @@ public:
virtual void replayImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
int16 p4, int16 p5, int16 p6, int16 p7) = 0;
virtual void releaseImageStack() = 0;
- virtual int saveGame(const char *fileName, const char *saveName) = 0;
- virtual int loadGame(const char *fileName, bool checkId = true) = 0;
+ virtual int saveGame(const Common::String &fileName, const Common::String &saveName) = 0;
+ virtual int loadGame(const Common::String &fileName, bool checkId = true) = 0;
int _soundemu;
@@ -789,10 +835,14 @@ public:
void initVersion();
void setVersion(uint16 version);
+ const char *getDiskName(uint16 id);
+
bool canLoadGameStateCurrently();
bool canSaveGameStateCurrently();
};
+typedef void (*AgiCommand)(AgiGame *state, uint8 *p);
+
class AgiEngine : public AgiBase {
protected:
// Engine APIs
@@ -831,13 +881,13 @@ public:
StringData _stringdata;
- const char *getSavegameFilename(int num);
+ Common::String getSavegameFilename(int num) const;
void getSavegameDescription(int num, char *buf, bool showEmpty = true);
int selectSlot();
- int saveGame(const char *fileName, const char *saveName);
+ int saveGame(const Common::String &fileName, const Common::String &saveName);
+ int loadGame(const Common::String &fileName, bool checkId = true);
int saveGameDialog();
int saveGameSimple();
- int loadGame(const char *fileName, bool checkId = true);
int loadGameDialog();
int loadGameSimple();
@@ -851,7 +901,6 @@ public:
char _lastSentence[40];
SpritesMgr *_sprites;
- SoundMgr *_sound;
PictureMgr *_picture;
AgiLoader *_loader; // loader
@@ -915,16 +964,21 @@ public:
void checkQuickLoad();
// Objects
+public:
int showObjects();
- int decodeObjects(uint8 *mem, uint32 flen);
int loadObjects(const char *fname);
- int allocObjects(int);
+ int loadObjects(Common::File &fp);
void unloadObjects();
const char *objectName(unsigned int);
int objectGetLocation(unsigned int);
void objectSetLocation(unsigned int, int);
+private:
+ int decodeObjects(uint8 *mem, uint32 flen);
+ int readObjects(Common::File &fp, int flen);
+ int allocObjects(int);
// Logic
+public:
int decodeLogic(int);
void unloadLogic(int);
int runLogic(int);
@@ -932,8 +986,10 @@ public:
int testIfCode(int);
void executeAgiCommand(uint8, uint8 *);
-private:
+public:
// Some submethods of testIfCode
+ void skipInstruction(byte op);
+ void skipInstructionsUntil(byte v);
uint8 testObjRight(uint8, uint8, uint8, uint8, uint8);
uint8 testObjCenter(uint8, uint8, uint8, uint8, uint8);
uint8 testObjInBox(uint8, uint8, uint8, uint8, uint8);
@@ -966,8 +1022,10 @@ public:
bool isEgoView(const VtEntry *v);
// Words
+public:
int showWords();
int loadWords(const char *);
+ int loadWords_v1(Common::File &f);
void unloadWords();
int findWord(const char *word, int *flen);
void dictionaryWords(char *);
@@ -1018,7 +1076,7 @@ public:
char *agiSprintf(const char *);
void writeStatus();
void writePrompt();
- void clearPrompt();
+ void clearPrompt(bool useBlackBg = false);
void clearLines(int, int, int);
void flushLines(int, int);
bool predictiveDialog();
@@ -1045,196 +1103,13 @@ public:
char _predictiveResult[40];
private:
- typedef void (AgiEngine::*AgiCommand)(uint8 *);
-
AgiCommand _agiCommands[183];
- AgiLogic *_curLogic;
- int _timerHack; // Workaround for timer loop in MH1 logic 153
+ AgiCommand _agiCondCommands[256];
void setupOpcodes();
- void cmd_increment(uint8 *p);
- void cmd_decrement(uint8 *p);
- void cmd_assignn(uint8 *p);
- void cmd_assignv(uint8 *p);
- void cmd_addn(uint8 *p);
- void cmd_addv(uint8 *p);
- void cmd_subn(uint8 *p);
- void cmd_subv(uint8 *p); // 0x08
- void cmd_lindirectv(uint8 *p);
- void cmd_rindirect(uint8 *p);
- void cmd_lindirectn(uint8 *p);
- void cmd_set(uint8 *p);
- void cmd_reset(uint8 *p);
- void cmd_toggle(uint8 *p);
- void cmd_set_v(uint8 *p);
- void cmd_reset_v(uint8 *p); // 0x10
- void cmd_toggle_v(uint8 *p);
- void cmd_new_room(uint8 *p);
- void cmd_new_room_f(uint8 *p);
- void cmd_load_logic(uint8 *p);
- void cmd_load_logic_f(uint8 *p);
- void cmd_call(uint8 *p);
- void cmd_call_f(uint8 *p);
- void cmd_load_pic(uint8 *p); // 0x18
- void cmd_draw_pic(uint8 *p);
- void cmd_show_pic(uint8 *p);
- void cmd_discard_pic(uint8 *p);
- void cmd_overlay_pic(uint8 *p);
- void cmd_show_pri_screen(uint8 *p);
- void cmd_load_view(uint8 *p);
- void cmd_load_view_f(uint8 *p);
- void cmd_discard_view(uint8 *p); // 0x20
- void cmd_animate_obj(uint8 *p);
- void cmd_unanimate_all(uint8 *p);
- void cmd_draw(uint8 *p);
- void cmd_erase(uint8 *p);
- void cmd_position(uint8 *p);
- void cmd_position_f(uint8 *p);
- void cmd_get_posn(uint8 *p);
- void cmd_reposition(uint8 *p); // 0x28
- void cmd_set_view(uint8 *p);
- void cmd_set_view_f(uint8 *p);
- void cmd_set_loop(uint8 *p);
- void cmd_set_loop_f(uint8 *p);
- void cmd_fix_loop(uint8 *p);
- void cmd_release_loop(uint8 *p);
- void cmd_set_cel(uint8 *p);
- void cmd_set_cel_f(uint8 *p); // 0x30
- void cmd_last_cel(uint8 *p);
- void cmd_current_cel(uint8 *p);
- void cmd_current_loop(uint8 *p);
- void cmd_current_view(uint8 *p);
- void cmd_number_of_loops(uint8 *p);
- void cmd_set_priority(uint8 *p);
- void cmd_set_priority_f(uint8 *p);
- void cmd_release_priority(uint8 *p); // 0x38
- void cmd_get_priority(uint8 *p);
- void cmd_stop_update(uint8 *p);
- void cmd_start_update(uint8 *p);
- void cmd_force_update(uint8 *p);
- void cmd_ignore_horizon(uint8 *p);
- void cmd_observe_horizon(uint8 *p);
- void cmd_set_horizon(uint8 *p);
- void cmd_object_on_water(uint8 *p); // 0x40
- void cmd_object_on_land(uint8 *p);
- void cmd_object_on_anything(uint8 *p);
- void cmd_ignore_objs(uint8 *p);
- void cmd_observe_objs(uint8 *p);
- void cmd_distance(uint8 *p);
- void cmd_stop_cycling(uint8 *p);
- void cmd_start_cycling(uint8 *p);
- void cmd_normal_cycle(uint8 *p); // 0x48
- void cmd_end_of_loop(uint8 *p);
- void cmd_reverse_cycle(uint8 *p);
- void cmd_reverse_loop(uint8 *p);
- void cmd_cycle_time(uint8 *p);
- void cmd_stop_motion(uint8 *p);
- void cmd_start_motion(uint8 *p);
- void cmd_step_size(uint8 *p);
- void cmd_step_time(uint8 *p); // 0x50
- void cmd_move_obj(uint8 *p);
- void cmd_move_obj_f(uint8 *p);
- void cmd_follow_ego(uint8 *p);
- void cmd_wander(uint8 *p);
- void cmd_normal_motion(uint8 *p);
- void cmd_set_dir(uint8 *p);
- void cmd_get_dir(uint8 *p);
- void cmd_ignore_blocks(uint8 *p); // 0x58
- void cmd_observe_blocks(uint8 *p);
- void cmd_block(uint8 *p);
- void cmd_unblock(uint8 *p);
- void cmd_get(uint8 *p);
- void cmd_get_f(uint8 *p);
- void cmd_drop(uint8 *p);
- void cmd_put(uint8 *p);
- void cmd_put_f(uint8 *p); // 0x60
- void cmd_get_room_f(uint8 *p);
- void cmd_load_sound(uint8 *p);
- void cmd_sound(uint8 *p);
- void cmd_stop_sound(uint8 *p);
- void cmd_print(uint8 *p);
- void cmd_print_f(uint8 *p);
- void cmd_display(uint8 *p);
- void cmd_display_f(uint8 *p); // 0x68
- void cmd_clear_lines(uint8 *p);
- void cmd_text_screen(uint8 *p);
- void cmd_graphics(uint8 *p);
- void cmd_set_cursor_char(uint8 *p);
- void cmd_set_text_attribute(uint8 *p);
- void cmd_shake_screen(uint8 *p);
- void cmd_configure_screen(uint8 *p);
- void cmd_status_line_on(uint8 *p); // 0x70
- void cmd_status_line_off(uint8 *p);
- void cmd_set_string(uint8 *p);
- void cmd_get_string(uint8 *p);
- void cmd_word_to_string(uint8 *p);
- void cmd_parse(uint8 *p);
- void cmd_get_num(uint8 *p);
- void cmd_prevent_input(uint8 *p);
- void cmd_accept_input(uint8 *p); // 0x78
- void cmd_set_key(uint8 *p);
- void cmd_add_to_pic(uint8 *p);
- void cmd_add_to_pic_f(uint8 *p);
- void cmd_status(uint8 *p);
- void cmd_save_game(uint8 *p);
- void cmd_load_game(uint8 *p);
- void cmd_init_disk(uint8 *p);
- void cmd_restart_game(uint8 *p); // 0x80
- void cmd_show_obj(uint8 *p);
- void cmd_random(uint8 *p);
- void cmd_program_control(uint8 *p);
- void cmd_player_control(uint8 *p);
- void cmd_obj_status_f(uint8 *p);
- void cmd_quit(uint8 *p);
- void cmd_show_mem(uint8 *p);
- void cmd_pause(uint8 *p); // 0x88
- void cmd_echo_line(uint8 *p);
- void cmd_cancel_line(uint8 *p);
- void cmd_init_joy(uint8 *p);
- void cmd_toggle_monitor(uint8 *p);
- void cmd_version(uint8 *p);
- void cmd_script_size(uint8 *p);
- void cmd_set_game_id(uint8 *p);
- void cmd_log(uint8 *p); // 0x90
- void cmd_set_scan_start(uint8 *p);
- void cmd_reset_scan_start(uint8 *p);
- void cmd_reposition_to(uint8 *p);
- void cmd_reposition_to_f(uint8 *p);
- void cmd_trace_on(uint8 *p);
- void cmd_trace_info(uint8 *p);
- void cmd_print_at(uint8 *p);
- void cmd_print_at_v(uint8 *p); // 0x98
- //void cmd_discard_view(uint8 *p); // Opcode repeated from 0x20 ?
- void cmd_clear_text_rect(uint8 *p);
- void cmd_set_upper_left(uint8 *p);
- void cmd_set_menu(uint8 *p);
- void cmd_set_menu_item(uint8 *p);
- void cmd_submit_menu(uint8 *p);
- void cmd_enable_item(uint8 *p);
- void cmd_disable_item(uint8 *p); // 0xa0
- void cmd_menu_input(uint8 *p);
- void cmd_show_obj_v(uint8 *p);
- void cmd_open_dialogue(uint8 *p);
- void cmd_close_dialogue(uint8 *p);
- void cmd_mul_n(uint8 *p);
- void cmd_mul_v(uint8 *p);
- void cmd_div_n(uint8 *p);
- void cmd_div_v(uint8 *p); // 0xa8
- void cmd_close_window(uint8 *p);
- void cmd_set_simple(uint8 *p);
- void cmd_push_script(uint8 *p);
- void cmd_pop_script(uint8 *p);
- void cmd_hold_key(uint8 *p);
- void cmd_set_pri_base(uint8 *p);
- void cmd_discard_sound(uint8 *p);
- void cmd_hide_mouse(uint8 *p); // 0xb0
- void cmd_allow_menu(uint8 *p);
- void cmd_show_mouse(uint8 *p);
- void cmd_fence_mouse(uint8 *p);
- void cmd_mouse_posn(uint8 *p);
- void cmd_release_key(uint8 *p);
- void cmd_adj_ego_move_to_x_y(uint8 *p);
+public:
+ int _timerHack; // Workaround for timer loop in MH1 logic 153
};
} // End of namespace Agi
diff --git a/engines/agi/checks.cpp b/engines/agi/checks.cpp
index 20276657ff..c3b31f6ba9 100644
--- a/engines/agi/checks.cpp
+++ b/engines/agi/checks.cpp
@@ -31,7 +31,7 @@ int AgiEngine::checkPosition(VtEntry *v) {
v->xPos + v->xSize > _WIDTH ||
v->yPos - v->ySize + 1 < 0 ||
v->yPos >= _HEIGHT ||
- ((~v->flags & IGNORE_HORIZON) && v->yPos <= _game.horizon)) {
+ ((~v->flags & fIgnoreHorizon) && v->yPos <= _game.horizon)) {
debugC(4, kDebugLevelSprites, "check position failed: x=%d, y=%d, h=%d, w=%d",
v->xPos, v->yPos, v->xSize, v->ySize);
return 0;
@@ -52,14 +52,14 @@ int AgiEngine::checkPosition(VtEntry *v) {
int AgiEngine::checkCollision(VtEntry *v) {
VtEntry *u;
- if (v->flags & IGNORE_OBJECTS)
+ if (v->flags & fIgnoreObjects)
return 0;
for (u = _game.viewTable; u < &_game.viewTable[MAX_VIEWTABLE]; u++) {
- if ((u->flags & (ANIMATED | DRAWN)) != (ANIMATED | DRAWN))
+ if ((u->flags & (fAnimated | fDrawn)) != (fAnimated | fDrawn))
continue;
- if (u->flags & IGNORE_OBJECTS)
+ if (u->flags & fIgnoreObjects)
continue;
// Same object, check next
@@ -92,7 +92,7 @@ int AgiEngine::checkPriority(VtEntry *v) {
int i, trigger, water, pass, pri;
uint8 *p0;
- if (~v->flags & FIXED_PRIORITY) {
+ if (~v->flags & fFixedPriority) {
// Priority bands
v->priority = _game.priTable[v->yPos];
}
@@ -129,7 +129,7 @@ int AgiEngine::checkPriority(VtEntry *v) {
water = 0;
if (pri == 1) { // conditional blue
- if (v->flags & IGNORE_BLOCKS)
+ if (v->flags & fIgnoreBlocks)
continue;
debugC(4, kDebugLevelSprites, "Blocks observed!");
@@ -145,9 +145,9 @@ int AgiEngine::checkPriority(VtEntry *v) {
}
if (pass) {
- if (!water && v->flags & ON_WATER)
+ if (!water && v->flags & fOnWater)
pass = 0;
- if (water && v->flags & ON_LAND)
+ if (water && v->flags & fOnLand)
pass = 0;
}
@@ -180,7 +180,7 @@ void AgiEngine::updatePosition() {
_game.vars[vBorderTouchObj] = 0;
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
- if ((v->flags & (ANIMATED | UPDATE | DRAWN)) != (ANIMATED | UPDATE | DRAWN)) {
+ if ((v->flags & (fAnimated | fUpdate | fDrawn)) != (fAnimated | fUpdate | fDrawn)) {
continue;
}
@@ -195,7 +195,7 @@ void AgiEngine::updatePosition() {
y = oldY = v->yPos;
// If object has moved, update its position
- if (~v->flags & UPDATE_POS) {
+ if (~v->flags & fUpdatePos) {
int dx[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 };
int dy[9] = { 0, -1, -1, 0, 1, 1, 1, 0, -1 };
x += v->stepSize * dx[v->direction];
@@ -212,7 +212,7 @@ void AgiEngine::updatePosition() {
} else if (x <= 0 && getVersion() == 0x3086) { // KQ4
x = 0; // See Sarien bug #590462
border = 4;
- } else if (v->entry == 0 && x == 0 && v->flags & ADJ_EGO_XY) {
+ } else if (v->entry == 0 && x == 0 && v->flags & fAdjEgoXY) {
// Extra test to walk west clicking the mouse
x = 0;
border = 4;
@@ -228,7 +228,7 @@ void AgiEngine::updatePosition() {
} else if (y > _HEIGHT - 1) {
y = _HEIGHT - 1;
border = 3;
- } else if ((~v->flags & IGNORE_HORIZON) && y <= _game.horizon) {
+ } else if ((~v->flags & fIgnoreHorizon) && y <= _game.horizon) {
debugC(4, kDebugLevelSprites, "y = %d, horizon = %d", y, _game.horizon);
y = _game.horizon + 1;
border = 1;
@@ -251,12 +251,12 @@ void AgiEngine::updatePosition() {
_game.vars[vBorderCode] = v->entry;
_game.vars[vBorderTouchObj] = border;
}
- if (v->motion == MOTION_MOVE_OBJ) {
+ if (v->motion == kMotionMoveObj) {
inDestination(v);
}
}
- v->flags &= ~UPDATE_POS;
+ v->flags &= ~fUpdatePos;
}
}
@@ -276,7 +276,7 @@ void AgiEngine::fixPosition(int n) {
debugC(4, kDebugLevelSprites, "adjusting view table entry #%d (%d,%d)", n, v->xPos, v->yPos);
// test horizon
- if ((~v->flags & IGNORE_HORIZON) && v->yPos <= _game.horizon)
+ if ((~v->flags & fIgnoreHorizon) && v->yPos <= _game.horizon)
v->yPos = _game.horizon + 1;
dir = 0;
diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp
index d49bd57ea2..dd06736290 100644
--- a/engines/agi/console.cpp
+++ b/engines/agi/console.cpp
@@ -96,8 +96,8 @@ bool Console::Cmd_RunOpcode(int argc, const char **argv) {
for (int i = 0; logicNamesCmd[i].name; i++) {
if (!strcmp(argv[1], logicNamesCmd[i].name)) {
uint8 p[16];
- if ((argc - 2) != logicNamesCmd[i].numArgs) {
- DebugPrintf("AGI command wants %d arguments\n", logicNamesCmd[i].numArgs);
+ if ((argc - 2) != logicNamesCmd[i].argumentsLength()) {
+ DebugPrintf("AGI command wants %d arguments\n", logicNamesCmd[i].argumentsLength());
return 0;
}
p[0] = argv[2] ? (char)strtoul(argv[2], NULL, 0) : 0;
@@ -260,7 +260,7 @@ bool Console::Cmd_BT(int argc, const char **argv) {
for (it = _vm->_game.execStack.begin(); it != _vm->_game.execStack.end(); ++it) {
code = _vm->_game.logics[it->script].data;
op = code[it->curIP];
- num = logicNamesCmd[op].numArgs;
+ num = logicNamesCmd[op].argumentsLength();
memmove(p, &code[it->curIP], num);
memset(p + num, 0, CMD_BSIZE - num);
@@ -275,25 +275,21 @@ bool Console::Cmd_BT(int argc, const char **argv) {
return true;
}
-PreAGI_Console::PreAGI_Console(PreAgiEngine *vm) {
- _vm = vm;
-}
-
-Mickey_Console::Mickey_Console(PreAgiEngine *vm, Mickey *mickey) : PreAGI_Console(vm) {
+MickeyConsole::MickeyConsole(MickeyEngine *mickey) : GUI::Debugger() {
_mickey = mickey;
- DCmd_Register("curRoom", WRAP_METHOD(Mickey_Console, Cmd_CurRoom));
- DCmd_Register("gotoRoom", WRAP_METHOD(Mickey_Console, Cmd_GotoRoom));
- DCmd_Register("drawPic", WRAP_METHOD(Mickey_Console, Cmd_DrawPic));
- DCmd_Register("drawObj", WRAP_METHOD(Mickey_Console, Cmd_DrawObj));
+ DCmd_Register("curRoom", WRAP_METHOD(MickeyConsole, Cmd_CurRoom));
+ DCmd_Register("gotoRoom", WRAP_METHOD(MickeyConsole, Cmd_GotoRoom));
+ DCmd_Register("drawPic", WRAP_METHOD(MickeyConsole, Cmd_DrawPic));
+ DCmd_Register("drawObj", WRAP_METHOD(MickeyConsole, Cmd_DrawObj));
}
-bool Mickey_Console::Cmd_CurRoom(int argc, const char **argv) {
+bool MickeyConsole::Cmd_CurRoom(int argc, const char **argv) {
_mickey->debugCurRoom();
return true;
}
-bool Mickey_Console::Cmd_GotoRoom(int argc, const char **argv) {
+bool MickeyConsole::Cmd_GotoRoom(int argc, const char **argv) {
if (argc != 2)
DebugPrintf("Usage: %s <Room number>\n", argv[0]);
else
@@ -301,7 +297,7 @@ bool Mickey_Console::Cmd_GotoRoom(int argc, const char **argv) {
return true;
}
-bool Mickey_Console::Cmd_DrawPic(int argc, const char **argv) {
+bool MickeyConsole::Cmd_DrawPic(int argc, const char **argv) {
if (argc != 2)
DebugPrintf("Usage: %s <Picture number>\n", argv[0]);
else
@@ -309,7 +305,7 @@ bool Mickey_Console::Cmd_DrawPic(int argc, const char **argv) {
return true;
}
-bool Mickey_Console::Cmd_DrawObj(int argc, const char **argv) {
+bool MickeyConsole::Cmd_DrawObj(int argc, const char **argv) {
if (argc != 2)
DebugPrintf("Usage: %s <Object number>\n", argv[0]);
else
@@ -317,13 +313,13 @@ bool Mickey_Console::Cmd_DrawObj(int argc, const char **argv) {
return true;
}
-Winnie_Console::Winnie_Console(PreAgiEngine *vm, Winnie *winnie) : PreAGI_Console(vm) {
+WinnieConsole::WinnieConsole(WinnieEngine *winnie) : GUI::Debugger() {
_winnie = winnie;
- DCmd_Register("curRoom", WRAP_METHOD(Winnie_Console, Cmd_CurRoom));
+ DCmd_Register("curRoom", WRAP_METHOD(WinnieConsole, Cmd_CurRoom));
}
-bool Winnie_Console::Cmd_CurRoom(int argc, const char **argv) {
+bool WinnieConsole::Cmd_CurRoom(int argc, const char **argv) {
_winnie->debugCurRoom();
return true;
diff --git a/engines/agi/console.h b/engines/agi/console.h
index 308b0f1d1f..5f69460907 100644
--- a/engines/agi/console.h
+++ b/engines/agi/console.h
@@ -27,8 +27,8 @@ namespace Agi {
class AgiEngine;
class PreAgiEngine;
-class Winnie;
-class Mickey;
+class MickeyEngine;
+class WinnieEngine;
struct AgiDebug {
int enabled;
@@ -67,23 +67,13 @@ private:
AgiEngine *_vm;
};
-class PreAGI_Console : public GUI::Debugger {
+class MickeyConsole : public GUI::Debugger {
public:
- PreAGI_Console(PreAgiEngine *vm);
- virtual ~PreAGI_Console() {}
+ MickeyConsole(MickeyEngine *mickey);
+ virtual ~MickeyConsole() {}
private:
- PreAgiEngine *_vm;
-};
-
-
-class Mickey_Console : public PreAGI_Console {
-public:
- Mickey_Console(PreAgiEngine *vm, Mickey *mickey);
- virtual ~Mickey_Console() {}
-
-private:
- Mickey *_mickey;
+ MickeyEngine *_mickey;
bool Cmd_CurRoom(int argc, const char **argv);
bool Cmd_GotoRoom(int argc, const char **argv);
@@ -91,17 +81,17 @@ private:
bool Cmd_DrawObj(int argc, const char **argv);
};
-class Winnie_Console : public PreAGI_Console {
+class WinnieConsole : public GUI::Debugger {
public:
- Winnie_Console(PreAgiEngine *vm, Winnie *winnie);
- virtual ~Winnie_Console() {}
+ WinnieConsole(WinnieEngine *winnie);
+ virtual ~WinnieConsole() {}
private:
- Winnie *_winnie;
+ WinnieEngine *_winnie;
bool Cmd_CurRoom(int argc, const char **argv);
};
-} // End of namespace Agi
+} // End of namespace Agi
#endif /* AGI_CONSOLE_H */
diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp
index d86fb36709..9cbab1f3c4 100644
--- a/engines/agi/cycle.cpp
+++ b/engines/agi/cycle.cpp
@@ -47,8 +47,8 @@ void AgiEngine::newRoom(int n) {
i = 0;
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
v->entry = i++;
- v->flags &= ~(ANIMATED | DRAWN);
- v->flags |= UPDATE;
+ v->flags &= ~(fAnimated | fDrawn);
+ v->flags |= fUpdate;
v->stepTime = 1;
v->stepTimeCount = 1;
v->cycleTime = 1;
@@ -220,7 +220,7 @@ int AgiEngine::mainCycle() {
}
// Click-to-walk mouse interface
- if (_game.playerControl && v->flags & ADJ_EGO_XY) {
+ if (_game.playerControl && v->flags & fAdjEgoXY) {
int toX = v->parm1;
int toY = v->parm2;
@@ -384,7 +384,6 @@ int AgiEngine::runGame() {
if (_restartGame) {
setflag(fRestartGame, true);
- _game.lastController = 0;
setvar(vTimeDelay, 2); // "normal" speed
_restartGame = false;
}
diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp
index a0736d0cc3..982dce8405 100644
--- a/engines/agi/detection.cpp
+++ b/engines/agi/detection.cpp
@@ -28,6 +28,7 @@
#include "engines/advancedDetector.h"
#include "common/config-manager.h"
#include "common/file.h"
+#include "common/md5.h"
#include "common/savefile.h"
#include "common/textconsole.h"
#include "graphics/thumbnail.h"
@@ -35,6 +36,9 @@
#include "agi/agi.h"
#include "agi/preagi.h"
+#include "agi/preagi_mickey.h"
+#include "agi/preagi_troll.h"
+#include "agi/preagi_winnie.h"
#include "agi/wagparser.h"
@@ -93,6 +97,14 @@ void AgiBase::initVersion() {
_gameVersion = _gameDescription->version;
}
+const char *AgiBase::getDiskName(uint16 id) {
+ for (int i = 0; _gameDescription->desc.filesDescriptions[i].fileName != NULL; i++)
+ if (_gameDescription->desc.filesDescriptions[i].fileType == id)
+ return _gameDescription->desc.filesDescriptions[i].fileName;
+
+ return "";
+}
+
}
static const PlainGameDescriptor agiGames[] = {
@@ -138,7 +150,7 @@ class AgiMetaEngine : public AdvancedMetaEngine {
public:
AgiMetaEngine() : AdvancedMetaEngine(Agi::gameDescriptions, sizeof(Agi::AGIGameDescription), agiGames) {
_singleid = "agi";
- _guioptions = Common::GUIO_NOSPEECH;
+ _guioptions = GUIO1(GUIO_NOSPEECH);
}
virtual const char *getName() const {
@@ -182,8 +194,19 @@ bool AgiMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameD
switch (gd->gameType) {
case Agi::GType_PreAGI:
- *engine = new Agi::PreAgiEngine(syst, gd);
+ switch (gd->gameID) {
+ case GID_MICKEY:
+ *engine = new Agi::MickeyEngine(syst, gd);
+ break;
+ case GID_TROLL:
+ *engine = new Agi::TrollEngine(syst, gd);
+ break;
+ case GID_WINNIE:
+ *engine = new Agi::WinnieEngine(syst, gd);
+ break;
+ }
break;
+ case Agi::GType_V1:
case Agi::GType_V2:
case Agi::GType_V3:
*engine = new Agi::AgiEngine(syst, gd);
@@ -253,17 +276,14 @@ SaveStateDescriptor AgiMetaEngine::querySaveMetaInfos(const char *target, int sl
SaveStateDescriptor desc(slot, name);
+ // Do not allow save slot 0 (used for auto-saving) to be deleted or
+ // overwritten.
desc.setDeletableFlag(slot != 0);
desc.setWriteProtectedFlag(slot == 0);
char saveVersion = in->readByte();
if (saveVersion >= 4) {
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- if (!Graphics::loadThumbnail(*in, *thumbnail)) {
- delete thumbnail;
- thumbnail = 0;
- }
+ Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in);
desc.setThumbnail(thumbnail);
@@ -288,9 +308,12 @@ SaveStateDescriptor AgiMetaEngine::querySaveMetaInfos(const char *target, int sl
delete in;
return desc;
+ } else {
+ SaveStateDescriptor emptySave;
+ // Do not allow save slot 0 (used for auto-saving) to be overwritten.
+ emptySave.setWriteProtectedFlag(slot == 0);
+ return emptySave;
}
-
- return SaveStateDescriptor();
}
const ADGameDescription *AgiMetaEngine::fallbackDetect(const FileMap &allFilesXXX, const Common::FSList &fslist) const {
@@ -482,7 +505,9 @@ int AgiEngine::agiDetectGame() {
assert(_gameDescription != NULL);
- if (getVersion() <= 0x2999) {
+ if (getVersion() <= 0x2001) {
+ _loader = new AgiLoader_v1(this);
+ } else if (getVersion() <= 0x2999) {
_loader = new AgiLoader_v2(this);
} else {
_loader = new AgiLoader_v3(this);
diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h
index cd3edf50c6..081cb39668 100644
--- a/engines/agi/detection_tables.h
+++ b/engines/agi/detection_tables.h
@@ -22,8 +22,6 @@
namespace Agi {
-using Common::GUIO_NONE;
-
#define GAME_LVFPN(id,extra,fname,md5,size,lang,ver,features,gid,platform,interp) { \
{ \
id, \
@@ -32,12 +30,12 @@ using Common::GUIO_NONE;
lang, \
platform, \
ADGF_NO_FLAGS, \
- GUIO_NONE \
+ GUIO1(GUIO_NONE) \
}, \
gid, \
interp, \
features, \
- ver, \
+ ver \
}
#define GAME_LVFPNF(id,name,fname,md5,size,lang,ver,features,gid,platform,interp) { \
@@ -48,14 +46,15 @@ using Common::GUIO_NONE;
lang, \
platform, \
ADGF_USEEXTRAASTITLE, \
- GUIO_NONE \
+ GUIO1(GUIO_NONE) \
}, \
gid, \
interp, \
features, \
- ver, \
+ ver \
}
+#define BOOTER2(id,extra,fname,md5,size,ver,gid) GAME_LVFPN(id,extra,fname,md5,size,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V2)
#define GAME(id,extra,md5,ver,gid) GAME_LVFPN(id,extra,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V2)
#define GAME3(id,extra,fname,md5,ver,gid) GAME_LVFPN(id,extra,fname,md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V3)
@@ -118,6 +117,69 @@ static const AGIGameDescription gameDescriptions[] = {
// AGI Demo for Kings Quest III and Space Quest I
GAME("agidemo", "Demo Kings Quest III and Space Quest I", "502e6bf96827b6c4d3e67c9cdccd1033", 0x2272, GID_AGIDEMO),
+ {
+ // Black Cauldron (PC 3.5" booter) 1.1J [AGI 1.12]
+ {
+ "bc",
+ "Booter 1.1J",
+ {
+ { "bc-d1.img", BooterDisk1, "1d29a82b41c9c7491e2b68d16864bd11", 368640},
+ { "bc-d2.img", BooterDisk2, "5568f7a52e787305656246f95e2aa375", 368640},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GID_BC,
+ GType_V1,
+ 0,
+ 0x1120
+ },
+
+ {
+ // Black Cauldron (PC 3.5" booter) 1.1K [AGI 1.12]
+ {
+ "bc",
+ "Booter 1.1K",
+ {
+ { "bc-d1.img", BooterDisk1, "98a51d3a372baa9df288b6c0f0232567", 368640},
+ { "bc-d2.img", BooterDisk2, "5568f7a52e787305656246f95e2aa375", 368640},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GID_BC,
+ GType_V1,
+ 0,
+ 0x1120
+ },
+
+ {
+ // Black Cauldron (PC 3.5" booter) 1.1M [AGI 1.12]
+ {
+ "bc",
+ "Booter 1.1M",
+ {
+ { "bc-d1.img", BooterDisk1, "edc0e5befbe5e44bb109cdf9137ee12d", 368640},
+ { "bc-d2.img", BooterDisk2, "5568f7a52e787305656246f95e2aa375", 368640},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GID_BC,
+ GType_V1,
+ 0,
+ 0x1120
+ },
+
// Black Cauldron (Amiga) 2.00 6/14/87
GAME_P("bc", "2.00 1987-06-14", "7b01694af21213b4727bb94476f64eb5", 0x2440, GID_BC, Common::kPlatformAmiga),
@@ -143,9 +205,9 @@ static const AGIGameDescription gameDescriptions[] = {
// Black Cauldron (CoCo3 360k) [AGI 2.072]
GAME_PS("bc", "updated", "c4e1937f74e8100cd0152b904434d8b4", 357, 0x2440, GID_BC, Common::kPlatformCoCo3),
-// TODO
-// These aren't supposed to work now as they require unsupported agi engine 2.01
-#if 0
+ // Donald Duck's Playground (PC Booter) 1.0Q
+ BOOTER2("ddp", "Booter 1.0Q", "ddp.img", "f323f10abf8140ffb2668b09af2e7b87", 368640, 0x2001, GID_DDP),
+
// Donald Duck's Playground (Amiga) 1.0C
// Menus not tested
GAME_P("ddp", "1.0C 1987-04-27", "550971d196f65190a5c760d2479406ef", 0x2272, GID_DDP, Common::kPlatformAmiga),
@@ -157,7 +219,6 @@ static const AGIGameDescription gameDescriptions[] = {
// reported by Filippos (thebluegr) in bugreport #1654500
// Menus not tested
GAME_PS("ddp", "1.0C 1986-06-09", "550971d196f65190a5c760d2479406ef", 132, 0x2272, GID_DDP, Common::kPlatformPC),
-#endif
// Gold Rush! (Amiga) 1.01 1/13/89 aka 2.05 3/9/89 # 2.316
GAME3_PS("goldrush", "1.01 1989-01-13 aka 2.05 1989-03-09", "dirs", "a1d4de3e75c2688c1e2ca2634ffc3bd8", 2399, 0x3149, 0, GID_GOLDRUSH, Common::kPlatformAmiga),
@@ -191,12 +252,12 @@ static const AGIGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_GOLDRUSH,
GType_V3,
GF_MACGOLDRUSH,
- 0x3149,
+ 0x3149
},
@@ -236,8 +297,8 @@ static const AGIGameDescription gameDescriptions[] = {
// King's Quest 2 (IIgs) 2.0A 6/16/88 (CE)
GAME_P("kq2", "2.0A 1988-06-16 (CE)", "5203c8b95250a2ecfee93ddb99414753", 0x2917, GID_KQ2, Common::kPlatformApple2GS),
- // King's Quest 2 (Amiga) 2.0J (Broken)
- GAME_P("kq2", "2.0J 1987-01-29 [OBJECT decrypted]", "b866f0fab2fad91433a637a828cfa410", 0x2440, GID_KQ2, Common::kPlatformAmiga),
+ // King's Quest 2 (Amiga) 2.0J
+ GAME_P("kq2", "2.0J 1987-01-29", "b866f0fab2fad91433a637a828cfa410", 0x2440, GID_KQ2, Common::kPlatformAmiga),
// King's Quest 2 (Mac) 2.0R
GAME_P("kq2", "2.0R 1988-03-23", "cbdb0083317c8e7cfb7ac35da4bc7fdc", 0x2440, GID_KQ2, Common::kPlatformMacintosh),
@@ -509,12 +570,12 @@ static const AGIGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_SQ2,
GType_V2,
0,
- 0x2936,
+ 0x2936
},
@@ -645,39 +706,11 @@ static const AGIGameDescription gameDescriptions[] = {
FANMADE("Go West, Young Hippie", "ff31484ea465441cb5f3a0f8e956b716"),
FANMADE("Good Man (demo v3.41)", "3facd8a8f856b7b6e0f6c3200274d88c"),
- {
- // Groza
- {
- "agi-fanmade",
- "Groza (russian) [AGDS sample]",
- AD_ENTRY1("logdir", "421da3a18004122a966d64ab6bd86d2e"),
- Common::RU_RUS,
- Common::kPlatformPC,
- ADGF_USEEXTRAASTITLE,
- GUIO_NONE
- },
- GID_FANMADE,
- GType_V2,
- GF_AGDS,
- 0x2440,
- },
+ GAME_LVFPNF("agi-fanmade", "Groza (russian) [AGDS sample]", "logdir", "421da3a18004122a966d64ab6bd86d2e", -1,
+ Common::RU_RUS, 0x2440, GF_AGDS, GID_FANMADE, Common::kPlatformPC,GType_V2),
- {
- // Get Outta SQ
- {
- "agi-fanmade",
- "Get Outta Space Quest",
- AD_ENTRY1("logdir", "aaea5b4a348acb669d13b0e6f22d4dc9"),
- Common::EN_ANY,
- Common::kPlatformPC,
- ADGF_USEEXTRAASTITLE,
- GUIO_NONE
- },
- GID_GETOUTTASQ,
- GType_V2,
- 0,
- 0x2440,
- },
+ GAME_LVFPNF("agi-fanmade", "Get Outta Space Quest", "logdir", "aaea5b4a348acb669d13b0e6f22d4dc9", -1,
+ Common::EN_ANY, 0x2440, GF_FANMADE, GID_GETOUTTASQ, Common::kPlatformPC,GType_V2),
FANMADE_F("Half-Death - Terror At White-Mesa", "b62c05d0ace878261392073f57ae788c", GF_AGIMOUSE),
FANMADE("Hank's Quest (v1.0 English) - Victim of Society", "64c15b3d0483d17888129100dc5af213"),
@@ -826,12 +859,12 @@ static const AGIGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_USEEXTRAASTITLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_FANMADE,
GType_V3,
GF_FANMADE,
- 0x3149,
+ 0x3149
},
FANMADE_SVP("V - The Graphical Adventure", "1646eaade74f137a9041eb427a389969", 768, 0x2440, Common::kPlatformCoCo3),
@@ -854,12 +887,12 @@ static AGIGameDescription g_fallbackDesc = {
Common::UNK_LANG,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_FANMADE,
GType_V2,
GF_FANMADE,
- 0x2917,
+ 0x2917
};
} // End of namespace Agi
diff --git a/engines/agi/graphics.cpp b/engines/agi/graphics.cpp
index eb162e4ab0..074e5570d5 100644
--- a/engines/agi/graphics.cpp
+++ b/engines/agi/graphics.cpp
@@ -1192,7 +1192,6 @@ void GfxMgr::flushScreen() {
flushBlock(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1);
doUpdate();
- g_system->updateScreen();
}
/**
diff --git a/engines/agi/id.cpp b/engines/agi/id.cpp
index 00f8407529..dd370d4189 100644
--- a/engines/agi/id.cpp
+++ b/engines/agi/id.cpp
@@ -48,14 +48,17 @@ int AgiEngine::setupV2Game(int ver) {
// 'quit' takes 0 args for 2.089
if (ver == 0x2089)
- logicNamesCmd[0x86].numArgs = 0;
+// logicNamesCmd[0x86].numArgs = 0;
+ logicNamesCmd[0x86].args = "";
// 'print.at' and 'print.at.v' take 3 args before 2.272
// This is documented in the specs as only < 2.440, but it seems
// that KQ3 (2.272) needs a 'print.at' taking 4 args.
if (ver < 0x2272) {
- logicNamesCmd[0x97].numArgs = 3;
- logicNamesCmd[0x98].numArgs = 3;
+// logicNamesCmd[0x97].numArgs = 3;
+// logicNamesCmd[0x98].numArgs = 3;
+ logicNamesCmd[0x97].args = "vvv";
+ logicNamesCmd[0x98].args = "vvv";
}
return ec;
@@ -73,8 +76,10 @@ int AgiEngine::setupV3Game(int ver) {
// 'unknown173' also takes 1 arg for 3.002.068, not 0 args.
// Is this actually used anywhere? -- dsymonds
if (ver == 0x3086) {
- logicNamesCmd[0xb0].numArgs = 1;
- logicNamesCmd[0xad].numArgs = 1;
+// logicNamesCmd[0xb0].numArgs = 1;
+// logicNamesCmd[0xad].numArgs = 1;
+ logicNamesCmd[0xb0].args = "n";
+ logicNamesCmd[0xad].args = "n";
}
// FIXME: Apply this fix to other games also that use 2 arguments for command 182.
@@ -83,7 +88,8 @@ int AgiEngine::setupV3Game(int ver) {
// has been set to use AGI 3.149 in ScummVM so that's why this initialization is
// here and not in setupV2Game.
if (getGameID() == GID_GOLDRUSH && getPlatform() == Common::kPlatformAmiga)
- logicNamesCmd[182].numArgs = 2;
+// logicNamesCmd[182].numArgs = 2;
+ logicNamesCmd[182].args = "vv";
return ec;
}
diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp
index f5810a6e8c..a7f15c16fb 100644
--- a/engines/agi/keyboard.cpp
+++ b/engines/agi/keyboard.cpp
@@ -114,7 +114,7 @@ int AgiEngine::handleController(int key) {
debugC(3, kDebugLevelInput, "key = %04x", key);
- for (i = 0; i < _game.lastController; i++) {
+ for (i = 0; i < MAX_CONTROLLERS; i++) {
if (_game.controllers[i].keycode == key) {
debugC(3, kDebugLevelInput, "event %d: key press", _game.controllers[i].controller);
_game.controllerOccured[_game.controllers[i].controller] = true;
@@ -180,15 +180,22 @@ int AgiEngine::handleController(int key) {
if (!(getFeatures() & GF_AGIMOUSE)) {
// Handle mouse button events
if (key == BUTTON_LEFT) {
- v->flags |= ADJ_EGO_XY;
- v->parm1 = WIN_TO_PIC_X(_mouse.x);
- v->parm2 = WIN_TO_PIC_Y(_mouse.y);
- return true;
+ if (getGameID() == GID_PQ1 && _game.vars[vCurRoom] == 116) {
+ // WORKAROUND: Special handling for mouse clicks in the newspaper
+ // screen of PQ1. Fixes bug #3018770.
+ d = 3; // fake a right arrow key (next page)
+ } else {
+ // Click-to-walk mouse interface
+ v->flags |= fAdjEgoXY;
+ v->parm1 = WIN_TO_PIC_X(_mouse.x);
+ v->parm2 = WIN_TO_PIC_Y(_mouse.y);
+ return true;
+ }
}
}
if (d || key == KEY_STATIONARY) {
- v->flags &= ~ADJ_EGO_XY;
+ v->flags &= ~fAdjEgoXY;
v->direction = v->direction == d ? 0 : d;
return true;
}
diff --git a/engines/agi/loader_v1.cpp b/engines/agi/loader_v1.cpp
new file mode 100644
index 0000000000..c6a3e66705
--- /dev/null
+++ b/engines/agi/loader_v1.cpp
@@ -0,0 +1,329 @@
+/* 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.
+ *
+ */
+
+#include "agi/agi.h"
+#include "common/md5.h"
+
+#define IMAGE_SIZE 368640 // = 40 * 2 * 9 * 512 = tracks * sides * sectors * sector size
+#define SECTOR_OFFSET(s) ((s) * 512)
+
+#define DDP_BASE_SECTOR 0x1C2
+#define DDP_LOGDIR_SEC SECTOR_OFFSET(171) + 5
+#define DDP_LOGDIR_MAX 43
+#define DDP_PICDIR_SEC SECTOR_OFFSET(180) + 5
+#define DDP_PICDIR_MAX 30
+#define DDP_VIEWDIR_SEC SECTOR_OFFSET(189) + 5
+#define DDP_VIEWDIR_MAX 171
+#define DDP_SNDDIR_SEC SECTOR_OFFSET(198) + 5
+#define DDP_SNDDIR_MAX 64
+
+#define BC_LOGDIR_SEC SECTOR_OFFSET(90) + 5
+#define BC_LOGDIR_MAX 118
+#define BC_VIEWDIR_SEC SECTOR_OFFSET(96) + 5
+#define BC_VIEWDIR_MAX 180
+#define BC_PICDIR_SEC SECTOR_OFFSET(93) + 8
+#define BC_PICDIR_MAX 117
+#define BC_SNDDIR_SEC SECTOR_OFFSET(99) + 5
+#define BC_SNDDIR_MAX 29
+#define BC_WORDS SECTOR_OFFSET(0x26D) + 5
+#define BC_OBJECTS SECTOR_OFFSET(0x1E6) + 3
+
+namespace Agi {
+
+
+AgiLoader_v1::AgiLoader_v1(AgiEngine *vm) {
+ _vm = vm;
+}
+
+int AgiLoader_v1::detectGame() {
+ // Find filenames for the disk images
+ _filenameDisk0 = _vm->getDiskName(BooterDisk1);
+ _filenameDisk1 = _vm->getDiskName(BooterDisk2);
+
+ return _vm->setupV2Game(_vm->getVersion());
+}
+
+int AgiLoader_v1::loadDir_DDP(AgiDir *agid, int offset, int max) {
+ Common::File fp;
+
+ if (!fp.open(_filenameDisk0))
+ return errBadFileOpen;
+
+ // Cleanup
+ for (int i = 0; i < MAX_DIRS; i++) {
+ agid[i].volume = 0xFF;
+ agid[i].offset = _EMPTY;
+ }
+
+ fp.seek(offset, SEEK_SET);
+ for (int i = 0; i <= max; i++) {
+ int b0 = fp.readByte();
+ int b1 = fp.readByte();
+ int b2 = fp.readByte();
+
+ if (b0 == 0xFF && b1 == 0xFF && b2 == 0xFF) {
+ agid[i].volume = 0xFF;
+ agid[i].offset = _EMPTY;
+ } else {
+ int sec = (DDP_BASE_SECTOR + (((b0 & 0xF) << 8) | b1)) >> 1;
+ int off = ((b1 & 0x1) << 8) | b2;
+ agid[i].volume = 0;
+ agid[i].offset = SECTOR_OFFSET(sec) + off;
+ }
+ }
+
+ fp.close();
+
+ return errOK;
+}
+
+int AgiLoader_v1::loadDir_BC(AgiDir *agid, int offset, int max) {
+ Common::File fp;
+
+ if (!fp.open(_filenameDisk0))
+ return errBadFileOpen;
+
+ // Cleanup
+ for (int i = 0; i < MAX_DIRS; i++) {
+ agid[i].volume = 0xFF;
+ agid[i].offset = _EMPTY;
+ }
+
+ fp.seek(offset, SEEK_SET);
+ for (int i = 0; i <= max; i++) {
+ int b0 = fp.readByte();
+ int b1 = fp.readByte();
+ int b2 = fp.readByte();
+
+ if (b0 == 0xFF && b1 == 0xFF && b2 == 0xFF) {
+ agid[i].volume = 0xFF;
+ agid[i].offset = _EMPTY;
+ } else {
+ int sec = (b0 & 0x3F) * 18 + ((b1 >> 1) & 0x1) * 9 + ((b1 >> 2) & 0x1F) - 1;
+ int off = ((b1 & 0x1) << 8) | b2;
+ int vol = (b0 & 0xC0) >> 6;
+ agid[i].volume = 0;
+ agid[i].offset = (vol == 2) * IMAGE_SIZE + SECTOR_OFFSET(sec) + off;
+ }
+ }
+
+ fp.close();
+
+ return errOK;
+}
+
+int AgiLoader_v1::init() {
+ int ec = errOK;
+
+ switch (_vm->getGameID()) {
+ case GID_DDP:
+ ec = loadDir_DDP(_vm->_game.dirLogic, DDP_LOGDIR_SEC, DDP_LOGDIR_MAX);
+ if (ec == errOK)
+ ec = loadDir_DDP(_vm->_game.dirPic, DDP_PICDIR_SEC, DDP_PICDIR_MAX);
+ if (ec == errOK)
+ ec = loadDir_DDP(_vm->_game.dirView, DDP_VIEWDIR_SEC, DDP_VIEWDIR_MAX);
+ if (ec == errOK)
+ ec = loadDir_DDP(_vm->_game.dirSound, DDP_SNDDIR_SEC, DDP_SNDDIR_MAX);
+ break;
+
+ case GID_BC:
+ ec = loadDir_BC(_vm->_game.dirLogic, BC_LOGDIR_SEC, BC_LOGDIR_MAX);
+ if (ec == errOK)
+ ec = loadDir_BC(_vm->_game.dirPic, BC_PICDIR_SEC, BC_PICDIR_MAX);
+ if (ec == errOK)
+ ec = loadDir_BC(_vm->_game.dirView, BC_VIEWDIR_SEC, BC_VIEWDIR_MAX);
+ if (ec == errOK)
+ ec = loadDir_BC(_vm->_game.dirSound, BC_SNDDIR_SEC, BC_SNDDIR_MAX);
+ break;
+ }
+
+ return ec;
+}
+
+int AgiLoader_v1::deinit() {
+ int ec = errOK;
+ return ec;
+}
+
+uint8 *AgiLoader_v1::loadVolRes(struct AgiDir *agid) {
+ uint8 *data = NULL;
+ Common::File fp;
+ int offset = agid->offset;
+
+ if (offset == _EMPTY)
+ return NULL;
+
+ if (offset > IMAGE_SIZE) {
+ fp.open(_filenameDisk1);
+ offset -= IMAGE_SIZE;
+ } else {
+ fp.open(_filenameDisk0);
+ }
+
+ fp.seek(offset, SEEK_SET);
+
+ int signature = fp.readUint16BE();
+ if (signature != 0x1234) {
+ warning("AgiLoader_v1::loadVolRes: bad signature %04x", signature);
+ return NULL;
+ }
+
+ fp.readByte();
+ agid->len = fp.readUint16LE();
+ data = (uint8 *)calloc(1, agid->len + 32);
+ fp.read(data, agid->len);
+
+ fp.close();
+
+ return data;
+}
+
+int AgiLoader_v1::loadResource(int t, int n) {
+ int ec = errOK;
+ uint8 *data = NULL;
+
+ debugC(3, kDebugLevelResources, "(t = %d, n = %d)", t, n);
+ if (n > MAX_DIRS)
+ return errBadResource;
+
+ switch (t) {
+ case rLOGIC:
+ if (~_vm->_game.dirLogic[n].flags & RES_LOADED) {
+ debugC(3, kDebugLevelResources, "loading logic resource %d", n);
+ unloadResource(rLOGIC, n);
+
+ // load raw resource into data
+ data = loadVolRes(&_vm->_game.dirLogic[n]);
+
+ _vm->_game.logics[n].data = data;
+ ec = data ? _vm->decodeLogic(n) : errBadResource;
+
+ _vm->_game.logics[n].sIP = 2;
+ }
+
+ // if logic was cached, we get here
+ // reset code pointers incase it was cached
+
+ _vm->_game.logics[n].cIP = _vm->_game.logics[n].sIP;
+ break;
+ case rPICTURE:
+ // if picture is currently NOT loaded *OR* cacheing is off,
+ // unload the resource (caching == off) and reload it
+
+ debugC(3, kDebugLevelResources, "loading picture resource %d", n);
+ if (_vm->_game.dirPic[n].flags & RES_LOADED)
+ break;
+
+ // if loaded but not cached, unload it
+ // if cached but not loaded, etc
+ unloadResource(rPICTURE, n);
+ data = loadVolRes(&_vm->_game.dirPic[n]);
+
+ if (data != NULL) {
+ _vm->_game.pictures[n].rdata = data;
+ _vm->_game.dirPic[n].flags |= RES_LOADED;
+ } else {
+ ec = errBadResource;
+ }
+ break;
+ case rSOUND:
+ debugC(3, kDebugLevelResources, "loading sound resource %d", n);
+ if (_vm->_game.dirSound[n].flags & RES_LOADED)
+ break;
+
+ data = loadVolRes(&_vm->_game.dirSound[n]);
+
+ if (data != NULL) {
+ // Freeing of the raw resource from memory is delegated to the createFromRawResource-function
+ _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound, _vm->_soundemu);
+ _vm->_game.dirSound[n].flags |= RES_LOADED;
+ } else {
+ ec = errBadResource;
+ }
+ break;
+ case rVIEW:
+ // Load a VIEW resource into memory...
+ // Since VIEWS alter the view table ALL the time
+ // can we cache the view? or must we reload it all
+ // the time?
+ if (_vm->_game.dirView[n].flags & RES_LOADED)
+ break;
+
+ debugC(3, kDebugLevelResources, "loading view resource %d", n);
+ unloadResource(rVIEW, n);
+ data = loadVolRes(&_vm->_game.dirView[n]);
+ if (data) {
+ _vm->_game.views[n].rdata = data;
+ _vm->_game.dirView[n].flags |= RES_LOADED;
+ ec = _vm->decodeView(n);
+ } else {
+ ec = errBadResource;
+ }
+ break;
+ default:
+ ec = errBadResource;
+ break;
+ }
+
+ return ec;
+}
+
+int AgiLoader_v1::unloadResource(int t, int n) {
+ switch (t) {
+ case rLOGIC:
+ _vm->unloadLogic(n);
+ break;
+ case rPICTURE:
+ _vm->_picture->unloadPicture(n);
+ break;
+ case rVIEW:
+ _vm->unloadView(n);
+ break;
+ case rSOUND:
+ _vm->_sound->unloadSound(n);
+ break;
+ }
+
+ return errOK;
+}
+
+int AgiLoader_v1::loadObjects(const char *fname) {
+ if (_vm->getGameID() == GID_BC) {
+ Common::File f;
+ f.open(_filenameDisk0);
+ f.seek(BC_OBJECTS, SEEK_SET);
+ return _vm->loadObjects(f);
+ }
+ return errOK;
+}
+
+int AgiLoader_v1::loadWords(const char *fname) {
+ if (_vm->getGameID() == GID_BC) {
+ Common::File f;
+ f.open(_filenameDisk0);
+ f.seek(BC_WORDS, SEEK_SET);
+ return _vm->loadWords_v1(f);
+ }
+ return errOK;
+}
+
+}
diff --git a/engines/agi/module.mk b/engines/agi/module.mk
index 2339d1019f..68d86f7b2e 100644
--- a/engines/agi/module.mk
+++ b/engines/agi/module.mk
@@ -11,6 +11,7 @@ MODULE_OBJS := \
id.o \
inv.o \
keyboard.o \
+ loader_v1.o \
loader_v2.o \
loader_v3.o \
logic.o \
@@ -18,12 +19,12 @@ MODULE_OBJS := \
menu.o \
motion.o \
objects.o \
+ opcodes.o \
op_cmd.o \
op_dbg.o \
op_test.o \
picture.o \
preagi.o \
- preagi_common.o \
preagi_mickey.o \
preagi_troll.o \
preagi_winnie.o \
diff --git a/engines/agi/motion.cpp b/engines/agi/motion.cpp
index 261a7f3e61..e4de232267 100644
--- a/engines/agi/motion.cpp
+++ b/engines/agi/motion.cpp
@@ -52,9 +52,9 @@ void AgiEngine::changePos(VtEntry *v) {
y += v->stepSize * dy[v->direction];
if (checkBlock(x, y) == b) {
- v->flags &= ~MOTION;
+ v->flags &= ~fMotion;
} else {
- v->flags |= MOTION;
+ v->flags |= fMotion;
v->direction = 0;
if (isEgoView(v))
_game.vars[vEgoDir] = 0;
@@ -63,7 +63,7 @@ void AgiEngine::changePos(VtEntry *v) {
void AgiEngine::motionWander(VtEntry *v) {
if (v->parm1--) {
- if (~v->flags & DIDNT_MOVE)
+ if (~v->flags & fDidntMove)
return;
}
@@ -94,14 +94,14 @@ void AgiEngine::motionFollowEgo(VtEntry *v) {
// Already at ego coordinates
if (dir == 0) {
v->direction = 0;
- v->motion = MOTION_NORMAL;
+ v->motion = kMotionNormal;
setflag(v->parm2, true);
return;
}
if (v->parm3 == 0xff) {
v->parm3 = 0;
- } else if (v->flags & DIDNT_MOVE) {
+ } else if (v->flags & fDidntMove) {
int d;
while ((v->direction = _rnd->getRandomNumber(8)) == 0) {
@@ -152,18 +152,20 @@ void AgiEngine::motionMoveObj(VtEntry *v) {
void AgiEngine::checkMotion(VtEntry *v) {
switch (v->motion) {
- case MOTION_WANDER:
+ case kMotionNormal:
+ break;
+ case kMotionWander:
motionWander(v);
break;
- case MOTION_FOLLOW_EGO:
+ case kMotionFollowEgo:
motionFollowEgo(v);
break;
- case MOTION_MOVE_OBJ:
+ case kMotionMoveObj:
motionMoveObj(v);
break;
}
- if ((_game.block.active && (~v->flags & IGNORE_BLOCKS)) && v->direction)
+ if ((_game.block.active && (~v->flags & fIgnoreBlocks)) && v->direction)
changePos(v);
}
@@ -178,7 +180,7 @@ void AgiEngine::checkAllMotions() {
VtEntry *v;
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
- if ((v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | UPDATE | DRAWN)
+ if ((v->flags & (fAnimated | fUpdate | fDrawn)) == (fAnimated | fUpdate | fDrawn)
&& v->stepTimeCount == 1) {
checkMotion(v);
}
@@ -192,11 +194,11 @@ void AgiEngine::checkAllMotions() {
* @param v Pointer to view table entry
*/
void AgiEngine::inDestination(VtEntry *v) {
- if (v->motion == MOTION_MOVE_OBJ) {
+ if (v->motion == kMotionMoveObj) {
v->stepSize = v->parm3;
setflag(v->parm4, true);
}
- v->motion = MOTION_NORMAL;
+ v->motion = kMotionNormal;
if (isEgoView(v))
_game.playerControl = true;
}
@@ -204,7 +206,7 @@ void AgiEngine::inDestination(VtEntry *v) {
/**
* Wrapper for static function motion_moveobj().
* This function is used by cmd_move_object() in the first motion cycle
- * after setting the motion mode to MOTION_MOVE_OBJ.
+ * after setting the motion mode to kMotionMoveObj.
* @param v Pointer to view table entry
*/
void AgiEngine::moveObj(VtEntry *v) {
diff --git a/engines/agi/objects.cpp b/engines/agi/objects.cpp
index e04c9742f3..94eef92579 100644
--- a/engines/agi/objects.cpp
+++ b/engines/agi/objects.cpp
@@ -34,7 +34,7 @@ int AgiEngine::allocObjects(int n) {
}
int AgiEngine::decodeObjects(uint8 *mem, uint32 flen) {
- unsigned int i, so, padsize;
+ unsigned int i, so, padsize, spos;
padsize = _game.gameFlags & ID_AMIGA ? 4 : 3;
@@ -64,18 +64,24 @@ int AgiEngine::decodeObjects(uint8 *mem, uint32 flen) {
return errNotEnoughMemory;
// build the object list
- for (i = 0, so = padsize; i < _game.numObjects; i++, so += padsize) {
+ spos = getVersion() >= 0x2000 ? padsize : 0;
+ for (i = 0, so = spos; i < _game.numObjects; i++, so += padsize) {
int offset;
- (_objects + i)->location = *(mem + so + 2);
- offset = READ_LE_UINT16(mem + so) + padsize;
+ _objects[i].location = *(mem + so + 2);
+ offset = READ_LE_UINT16(mem + so) + spos;
if ((uint) offset < flen) {
- (_objects + i)->name = (char *)strdup((const char *)mem + offset);
+ _objects[i].name = (char *)strdup((const char *)mem + offset);
} else {
warning("object %i name beyond object filesize (%04x > %04x)", i, offset, flen);
- (_objects + i)->name = strdup("");
+ _objects[i].name = strdup("");
}
+
+ // Don't show the invalid "?" object in ego's inventory in the fanmade
+ // game Beyond the Titanic 2 (bug #3116541).
+ if (!strcmp(_objects[i].name, "?") && _objects[i].location == EGO_OWNED)
+ _objects[i].location = 0;
}
debug(0, "Reading objects: %d objects read.", _game.numObjects);
@@ -84,20 +90,33 @@ int AgiEngine::decodeObjects(uint8 *mem, uint32 flen) {
int AgiEngine::loadObjects(const char *fname) {
Common::File fp;
- uint32 flen;
- uint8 *mem;
-
- _objects = NULL;
- _game.numObjects = 0;
debugC(5, kDebugLevelResources, "(Loading objects '%s')", fname);
if (!fp.open(fname))
return errBadFileOpen;
- fp.seek(0, SEEK_END);
- flen = fp.pos();
- fp.seek(0, SEEK_SET);
+ return readObjects(fp, fp.size());
+}
+
+/**
+ * Loads an object file that is in the common VOL resource format. Expects
+ * the file pointer to point to the last field in header, ie. file length.
+ * This is used at least by the V1 booter games.
+ */
+int AgiEngine::loadObjects(Common::File &fp) {
+ int flen = fp.readUint16LE();
+ return readObjects(fp, flen);
+}
+
+/**
+ * Read and decode objects, and store them in the internal structure.
+ *
+ * @param fp File pointer
+ * @param flen File length
+ */
+int AgiEngine::readObjects(Common::File &fp, int flen) {
+ uint8 *mem;
if ((mem = (uint8 *)calloc(1, flen + 32)) == NULL) {
fp.close();
diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp
index bde62fe2d9..72f60e2516 100644
--- a/engines/agi/op_cmd.cpp
+++ b/engines/agi/op_cmd.cpp
@@ -41,28 +41,41 @@ namespace Agi {
#define p5 (p[5])
#define p6 (p[6])
-#define ip _curLogic->cIP
-#define vt _game.viewTable[p0]
-#define vt_v _game.viewTable[_game.vars[p0]]
-
-#define _v _game.vars
-
-void AgiEngine::cmd_increment(uint8 *p) {
- if (_v[p0] != 0xff)
- ++_v[p0];
+#define code state->_curLogic->data
+#define ip state->_curLogic->cIP
+#define vt state->viewTable[p0]
+#define vt_v state->viewTable[state->vars[p0]]
+
+#define _v state->vars
+
+#define getGameID() state->_vm->getGameID()
+#define getFeatures() state->_vm->getFeatures()
+#define getVersion() state->_vm->getVersion()
+#define getLanguage() state->_vm->getLanguage()
+#define setflag(a,b) state->_vm->setflag(a,b)
+#define getflag(a) state->_vm->getflag(a)
+
+void cmdIncrement(AgiGame *state, uint8 *p) {
+ if (getVersion() < 0x2000) {
+ if (_v[p0] < 0xf0)
+ ++_v[p0];
+ } else {
+ if (_v[p0] != 0xff)
+ ++_v[p0];
+ }
}
-void AgiEngine::cmd_decrement(uint8 *p) {
+void cmdDecrement(AgiGame *state, uint8 *p) {
if (_v[p0] != 0)
--_v[p0];
}
-void AgiEngine::cmd_assignn(uint8 *p) {
+void cmdAssignN(AgiGame *state, uint8 *p) {
_v[p0] = p1;
- // WORKAROUND for a bug in fan _game "Get outta SQ"
+ // WORKAROUND for a bug in fan game "Get outta SQ"
// Total number of points is stored in variable 7, which
- // is then incorrectly assigned to 0. Thus, when the _game
+ // is then incorrectly assigned to 0. Thus, when the game
// is restarted, "Points 0 of 0" is shown. We set the
// variable to the correct value here
// Fixes bug #1942476 - "AGI: Fan(Get Outta SQ) - Score
@@ -71,172 +84,188 @@ void AgiEngine::cmd_assignn(uint8 *p) {
_v[p0] = 8;
}
-void AgiEngine::cmd_addn(uint8 *p) {
+void cmdAddN(AgiGame *state, uint8 *p) {
_v[p0] += p1;
}
-void AgiEngine::cmd_subn(uint8 *p) {
+void cmdSubN(AgiGame *state, uint8 *p) {
_v[p0] -= p1;
}
-void AgiEngine::cmd_assignv(uint8 *p) {
+void cmdAssignV(AgiGame *state, uint8 *p) {
_v[p0] = _v[p1];
}
-void AgiEngine::cmd_addv(uint8 *p) {
+void cmdAddV(AgiGame *state, uint8 *p) {
_v[p0] += _v[p1];
}
-void AgiEngine::cmd_subv(uint8 *p) {
+void cmdSubV(AgiGame *state, uint8 *p) {
_v[p0] -= _v[p1];
}
-void AgiEngine::cmd_mul_n(uint8 *p) {
+void cmdMulN(AgiGame *state, uint8 *p) {
_v[p0] *= p1;
}
-void AgiEngine::cmd_mul_v(uint8 *p) {
+void cmdMulV(AgiGame *state, uint8 *p) {
_v[p0] *= _v[p1];
}
-void AgiEngine::cmd_div_n(uint8 *p) {
+void cmdDivN(AgiGame *state, uint8 *p) {
_v[p0] /= p1;
}
-void AgiEngine::cmd_div_v(uint8 *p) {
+void cmdDivV(AgiGame *state, uint8 *p) {
_v[p0] /= _v[p1];
}
-void AgiEngine::cmd_random(uint8 *p) {
- _v[p2] = _rnd->getRandomNumber(p1 - p0) + p0;
+void cmdRandomV1(AgiGame *state, uint8 *p) {
+ _v[p0] = state->_vm->_rnd->getRandomNumber(250);
+}
+
+void cmdRandom(AgiGame *state, uint8 *p) {
+ _v[p2] = state->_vm->_rnd->getRandomNumber(p1 - p0) + p0;
}
-void AgiEngine::cmd_lindirectn(uint8 *p) {
+void cmdLindirectN(AgiGame *state, uint8 *p) {
_v[_v[p0]] = p1;
}
-void AgiEngine::cmd_lindirectv(uint8 *p) {
+void cmdLindirectV(AgiGame *state, uint8 *p) {
_v[_v[p0]] = _v[p1];
}
-void AgiEngine::cmd_rindirect(uint8 *p) {
+void cmdRindirect(AgiGame *state, uint8 *p) {
_v[p0] = _v[_v[p1]];
}
-void AgiEngine::cmd_set(uint8 *p) {
+void cmdSet(AgiGame *state, uint8 *p) {
setflag(*p, true);
}
-void AgiEngine::cmd_reset(uint8 *p) {
+void cmdReset(AgiGame *state, uint8 *p) {
setflag(*p, false);
}
-void AgiEngine::cmd_toggle(uint8 *p) {
+void cmdToggle(AgiGame *state, uint8 *p) {
setflag(*p, !getflag(*p));
}
-void AgiEngine::cmd_set_v(uint8 *p) {
- setflag(_v[p0], true);
+void cmdSetV(AgiGame *state, uint8 *p) {
+ if (getVersion() < 0x2000) {
+ _v[p0] = 1;
+ } else {
+ setflag(_v[p0], true);
+ }
}
-void AgiEngine::cmd_reset_v(uint8 *p) {
- setflag(_v[p0], false);
+void cmdResetV(AgiGame *state, uint8 *p) {
+ if (getVersion() < 0x2000) {
+ _v[p0] = 0;
+ } else {
+ setflag(_v[p0], false);
+ }
}
-void AgiEngine::cmd_toggle_v(uint8 *p) {
- setflag(_v[p0], !getflag(_v[p0]));
+void cmdToggleV(AgiGame *state, uint8 *p) {
+ if (getVersion() < 0x2000) {
+ _v[p0] ^= 1;
+ } else {
+ setflag(_v[p0], !getflag(_v[p0]));
+ }
}
-void AgiEngine::cmd_new_room(uint8 *p) {
- newRoom(p0);
+void cmdNewRoom(AgiGame *state, uint8 *p) {
+ state->_vm->newRoom(p0);
// WORKAROUND: Works around intro skipping bug (#1737343) in Gold Rush.
// Intro was skipped because the enter-keypress finalizing the entering
// of the copy protection string (Copy protection is in logic.128) was
// left over to the intro scene (Starts with room 73 i.e. logic.073).
// The intro scene checks for any keys pressed and if it finds any it
- // jumps to the _game's start (Room 1 i.e. logic.001). We clear the
+ // jumps to the game's start (Room 1 i.e. logic.001). We clear the
// keyboard buffer when the intro sequence's first room (Room 73) is
// loaded so that no keys from the copy protection scene can be left
- // over to cause the intro to skip to the _game's start.
+ // over to cause the intro to skip to the game's start.
if (getGameID() == GID_GOLDRUSH && p0 == 73)
- _game.keypress = 0;
+ state->keypress = 0;
}
-void AgiEngine::cmd_new_room_f(uint8 *p) {
- newRoom(_v[p0]);
+void cmdNewRoomF(AgiGame *state, uint8 *p) {
+ state->_vm->newRoom(_v[p0]);
}
-void AgiEngine::cmd_load_view(uint8 *p) {
- agiLoadResource(rVIEW, p0);
+void cmdLoadView(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rVIEW, p0);
}
-void AgiEngine::cmd_load_logic(uint8 *p) {
- agiLoadResource(rLOGIC, p0);
+void cmdLoadLogic(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rLOGIC, p0);
}
-void AgiEngine::cmd_load_sound(uint8 *p) {
- agiLoadResource(rSOUND, p0);
+void cmdLoadSound(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rSOUND, p0);
}
-void AgiEngine::cmd_load_view_f(uint8 *p) {
- agiLoadResource(rVIEW, _v[p0]);
+void cmdLoadViewF(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rVIEW, _v[p0]);
}
-void AgiEngine::cmd_load_logic_f(uint8 *p) {
- agiLoadResource(rLOGIC, _v[p0]);
+void cmdLoadLogicF(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rLOGIC, _v[p0]);
}
-void AgiEngine::cmd_discard_view(uint8 *p) {
- agiUnloadResource(rVIEW, p0);
+void cmdDiscardView(AgiGame *state, uint8 *p) {
+ state->_vm->agiUnloadResource(rVIEW, p0);
}
-void AgiEngine::cmd_object_on_anything(uint8 *p) {
- vt.flags &= ~(ON_WATER | ON_LAND);
+void cmdObjectOnAnything(AgiGame *state, uint8 *p) {
+ vt.flags &= ~(fOnWater | fOnLand);
}
-void AgiEngine::cmd_object_on_land(uint8 *p) {
- vt.flags |= ON_LAND;
+void cmdObjectOnLand(AgiGame *state, uint8 *p) {
+ vt.flags |= fOnLand;
}
-void AgiEngine::cmd_object_on_water(uint8 *p) {
- vt.flags |= ON_WATER;
+void cmdObjectOnWater(AgiGame *state, uint8 *p) {
+ vt.flags |= fOnWater;
}
-void AgiEngine::cmd_observe_horizon(uint8 *p) {
- vt.flags &= ~IGNORE_HORIZON;
+void cmdObserveHorizon(AgiGame *state, uint8 *p) {
+ vt.flags &= ~fIgnoreHorizon;
}
-void AgiEngine::cmd_ignore_horizon(uint8 *p) {
- vt.flags |= IGNORE_HORIZON;
+void cmdIgnoreHorizon(AgiGame *state, uint8 *p) {
+ vt.flags |= fIgnoreHorizon;
}
-void AgiEngine::cmd_observe_objs(uint8 *p) {
- vt.flags &= ~IGNORE_OBJECTS;
+void cmdObserveObjs(AgiGame *state, uint8 *p) {
+ vt.flags &= ~fIgnoreObjects;
}
-void AgiEngine::cmd_ignore_objs(uint8 *p) {
- vt.flags |= IGNORE_OBJECTS;
+void cmdIgnoreObjs(AgiGame *state, uint8 *p) {
+ vt.flags |= fIgnoreObjects;
}
-void AgiEngine::cmd_observe_blocks(uint8 *p) {
- vt.flags &= ~IGNORE_BLOCKS;
+void cmdObserveBlocks(AgiGame *state, uint8 *p) {
+ vt.flags &= ~fIgnoreBlocks;
}
-void AgiEngine::cmd_ignore_blocks(uint8 *p) {
- vt.flags |= IGNORE_BLOCKS;
+void cmdIgnoreBlocks(AgiGame *state, uint8 *p) {
+ vt.flags |= fIgnoreBlocks;
}
-void AgiEngine::cmd_set_horizon(uint8 *p) {
- _game.horizon = p0;
+void cmdSetHorizon(AgiGame *state, uint8 *p) {
+ state->horizon = p0;
}
-void AgiEngine::cmd_get_priority(uint8 *p) {
+void cmdGetPriority(AgiGame *state, uint8 *p) {
_v[p1] = vt.priority;
}
-void AgiEngine::cmd_set_priority(uint8 *p) {
- vt.flags |= FIXED_PRIORITY;
+void cmdSetPriority(AgiGame *state, uint8 *p) {
+ vt.flags |= fFixedPriority;
vt.priority = p1;
// WORKAROUND: this fixes bug #1712585 in KQ4 (dwarf sprite priority)
@@ -246,257 +275,264 @@ void AgiEngine::cmd_set_priority(uint8 *p) {
// It seems that in this scene, ego's priority is set to 8, but the priority of
// the last dwarf with the soup bowls (view 152) is also set to 8, which causes
// the dwarf to be drawn behind ego
- // With this workaround, when the _game scripts set the priority of view 152
+ // With this workaround, when the game scripts set the priority of view 152
// (seventh dwarf with soup bowls), ego's priority is set to 7
- // The _game script itself sets priotity 8 for ego before she starts walking,
+ // The game script itself sets priotity 8 for ego before she starts walking,
// and then releases the fixed priority set on ego after ego is seated
// Therefore, this workaround only affects that specific part of this scene
// Ego is set to object 19 by script 54
if (getGameID() == GID_KQ4 && vt.currentView == 152) {
- _game.viewTable[19].flags |= FIXED_PRIORITY;
- _game.viewTable[19].priority = 7;
+ state->viewTable[19].flags |= fFixedPriority;
+ state->viewTable[19].priority = 7;
}
}
-void AgiEngine::cmd_set_priority_f(uint8 *p) {
- vt.flags |= FIXED_PRIORITY;
+void cmdSetPriorityF(AgiGame *state, uint8 *p) {
+ vt.flags |= fFixedPriority;
vt.priority = _v[p1];
}
-void AgiEngine::cmd_release_priority(uint8 *p) {
- vt.flags &= ~FIXED_PRIORITY;
+void cmdReleasePriority(AgiGame *state, uint8 *p) {
+ vt.flags &= ~fFixedPriority;
}
-void AgiEngine::cmd_set_upper_left(uint8 *p) { // do nothing (AGI 2.917)
+void cmdSetUpperLeft(AgiGame *state, uint8 *p) { // do nothing (AGI 2.917)
}
-void AgiEngine::cmd_start_update(uint8 *p) {
- startUpdate(&vt);
+void cmdStartUpdate(AgiGame *state, uint8 *p) {
+ state->_vm->startUpdate(&vt);
}
-void AgiEngine::cmd_stop_update(uint8 *p) {
- stopUpdate(&vt);
+void cmdStopUpdate(AgiGame *state, uint8 *p) {
+ state->_vm->stopUpdate(&vt);
}
-void AgiEngine::cmd_current_view(uint8 *p) {
+void cmdCurrentView(AgiGame *state, uint8 *p) {
_v[p1] = vt.currentView;
}
-void AgiEngine::cmd_current_cel(uint8 *p) {
+void cmdCurrentCel(AgiGame *state, uint8 *p) {
_v[p1] = vt.currentCel;
debugC(4, kDebugLevelScripts, "v%d=%d", p1, _v[p1]);
}
-void AgiEngine::cmd_current_loop(uint8 *p) {
+void cmdCurrentLoop(AgiGame *state, uint8 *p) {
_v[p1] = vt.currentLoop;
}
-void AgiEngine::cmd_last_cel(uint8 *p) {
+void cmdLastCel(AgiGame *state, uint8 *p) {
_v[p1] = vt.loopData->numCels - 1;
}
-void AgiEngine::cmd_set_cel(uint8 *p) {
- setCel(&vt, p1);
- vt.flags &= ~DONTUPDATE;
+void cmdSetCel(AgiGame *state, uint8 *p) {
+ state->_vm->setCel(&vt, p1);
+
+ if (getVersion() >= 0x2000) {
+ vt.flags &= ~fDontupdate;
+ }
}
-void AgiEngine::cmd_set_cel_f(uint8 *p) {
- setCel(&vt, _v[p1]);
- vt.flags &= ~DONTUPDATE;
+void cmdSetCelF(AgiGame *state, uint8 *p) {
+ state->_vm->setCel(&vt, _v[p1]);
+ vt.flags &= ~fDontupdate;
}
-void AgiEngine::cmd_set_view(uint8 *p) {
- setView(&vt, p1);
+void cmdSetView(AgiGame *state, uint8 *p) {
+ state->_vm->setView(&vt, p1);
}
-void AgiEngine::cmd_set_view_f(uint8 *p) {
- setView(&vt, _v[p1]);
+void cmdSetViewF(AgiGame *state, uint8 *p) {
+ state->_vm->setView(&vt, _v[p1]);
}
-void AgiEngine::cmd_set_loop(uint8 *p) {
- setLoop(&vt, p1);
+void cmdSetLoop(AgiGame *state, uint8 *p) {
+ state->_vm->setLoop(&vt, p1);
}
-void AgiEngine::cmd_set_loop_f(uint8 *p) {
- setLoop(&vt, _v[p1]);
+void cmdSetLoopF(AgiGame *state, uint8 *p) {
+ state->_vm->setLoop(&vt, _v[p1]);
}
-void AgiEngine::cmd_number_of_loops(uint8 *p) {
+void cmdNumberOfLoops(AgiGame *state, uint8 *p) {
_v[p1] = vt.numLoops;
}
-void AgiEngine::cmd_fix_loop(uint8 *p) {
- vt.flags |= FIX_LOOP;
+void cmdFixLoop(AgiGame *state, uint8 *p) {
+ vt.flags |= fFixLoop;
}
-void AgiEngine::cmd_release_loop(uint8 *p) {
- vt.flags &= ~FIX_LOOP;
+void cmdReleaseLoop(AgiGame *state, uint8 *p) {
+ vt.flags &= ~fFixLoop;
}
-void AgiEngine::cmd_step_size(uint8 *p) {
+void cmdStepSize(AgiGame *state, uint8 *p) {
vt.stepSize = _v[p1];
}
-void AgiEngine::cmd_step_time(uint8 *p) {
+void cmdStepTime(AgiGame *state, uint8 *p) {
vt.stepTime = vt.stepTimeCount = _v[p1];
}
-void AgiEngine::cmd_cycle_time(uint8 *p) {
+void cmdCycleTime(AgiGame *state, uint8 *p) {
vt.cycleTime = vt.cycleTimeCount = _v[p1];
}
-void AgiEngine::cmd_stop_cycling(uint8 *p) {
- vt.flags &= ~CYCLING;
+void cmdStopCycling(AgiGame *state, uint8 *p) {
+ vt.flags &= ~fCycling;
}
-void AgiEngine::cmd_start_cycling(uint8 *p) {
- vt.flags |= CYCLING;
+void cmdStartCycling(AgiGame *state, uint8 *p) {
+ vt.flags |= fCycling;
}
-void AgiEngine::cmd_normal_cycle(uint8 *p) {
- vt.cycle = CYCLE_NORMAL;
- vt.flags |= CYCLING;
+void cmdNormalCycle(AgiGame *state, uint8 *p) {
+ vt.cycle = kCycleNormal;
+ vt.flags |= fCycling;
}
-void AgiEngine::cmd_reverse_cycle(uint8 *p) {
- vt.cycle = CYCLE_REVERSE;
- vt.flags |= CYCLING;
+void cmdReverseCycle(AgiGame *state, uint8 *p) {
+ vt.cycle = kCycleReverse;
+ vt.flags |= fCycling;
}
-void AgiEngine::cmd_set_dir(uint8 *p) {
+void cmdSetDir(AgiGame *state, uint8 *p) {
vt.direction = _v[p1];
}
-void AgiEngine::cmd_get_dir(uint8 *p) {
+void cmdGetDir(AgiGame *state, uint8 *p) {
_v[p1] = vt.direction;
}
-void AgiEngine::cmd_get_room_f(uint8 *p) {
- _v[p1] = objectGetLocation(_v[p0]);
+void cmdGetRoomF(AgiGame *state, uint8 *p) {
+ _v[p1] = state->_vm->objectGetLocation(_v[p0]);
+}
+
+void cmdPut(AgiGame *state, uint8 *p) {
+ state->_vm->objectSetLocation(p0, _v[p1]);
}
-void AgiEngine::cmd_put(uint8 *p) {
- objectSetLocation(p0, _v[p1]);
+void cmdPutF(AgiGame *state, uint8 *p) {
+ state->_vm->objectSetLocation(_v[p0], _v[p1]);
}
-void AgiEngine::cmd_put_f(uint8 *p) {
- objectSetLocation(_v[p0], _v[p1]);
+void cmdDrop(AgiGame *state, uint8 *p) {
+ state->_vm->objectSetLocation(p0, 0);
}
-void AgiEngine::cmd_drop(uint8 *p) {
- objectSetLocation(p0, 0);
+void cmdGet(AgiGame *state, uint8 *p) {
+ state->_vm->objectSetLocation(p0, EGO_OWNED);
}
-void AgiEngine::cmd_get(uint8 *p) {
- objectSetLocation(p0, EGO_OWNED);
+void cmdGetV1(AgiGame *state, uint8 *p) {
+ state->_vm->objectSetLocation(p0, EGO_OWNED_V1);
}
-void AgiEngine::cmd_get_f(uint8 *p) {
- objectSetLocation(_v[p0], EGO_OWNED);
+void cmdGetF(AgiGame *state, uint8 *p) {
+ state->_vm->objectSetLocation(_v[p0], EGO_OWNED);
}
-void AgiEngine::cmd_word_to_string(uint8 *p) {
- strcpy(_game.strings[p0], _game.egoWords[p1].word);
+void cmdWordToString(AgiGame *state, uint8 *p) {
+ strcpy(state->strings[p0], state->egoWords[p1].word);
}
-void AgiEngine::cmd_open_dialogue(uint8 *p) {
- _game.hasWindow = true;
+void cmdOpenDialogue(AgiGame *state, uint8 *p) {
+ state->hasWindow = true;
}
-void AgiEngine::cmd_close_dialogue(uint8 *p) {
- _game.hasWindow = false;
+void cmdCloseDialogue(AgiGame *state, uint8 *p) {
+ state->hasWindow = false;
}
-void AgiEngine::cmd_close_window(uint8 *p) {
- closeWindow();
+void cmdCloseWindow(AgiGame *state, uint8 *p) {
+ state->_vm->closeWindow();
}
-void AgiEngine::cmd_status_line_on(uint8 *p) {
- _game.statusLine = true;
- writeStatus();
+void cmdStatusLineOn(AgiGame *state, uint8 *p) {
+ state->statusLine = true;
+ state->_vm->writeStatus();
}
-void AgiEngine::cmd_status_line_off(uint8 *p) {
- _game.statusLine = false;
- writeStatus();
+void cmdStatusLineOff(AgiGame *state, uint8 *p) {
+ state->statusLine = false;
+ state->_vm->writeStatus();
}
-void AgiEngine::cmd_show_obj(uint8 *p) {
- _sprites->showObj(p0);
+void cmdShowObj(AgiGame *state, uint8 *p) {
+ state->_vm->_sprites->showObj(p0);
}
-void AgiEngine::cmd_show_obj_v(uint8 *p) {
- _sprites->showObj(_v[p0]);
+void cmdShowObjV(AgiGame *state, uint8 *p) {
+ state->_vm->_sprites->showObj(_v[p0]);
}
-void AgiEngine::cmd_sound(uint8 *p) {
- _sound->startSound(p0, p1);
+void cmdSound(AgiGame *state, uint8 *p) {
+ state->_vm->_sound->startSound(p0, p1);
}
-void AgiEngine::cmd_stop_sound(uint8 *p) {
- _sound->stopSound();
+void cmdStopSound(AgiGame *state, uint8 *p) {
+ state->_vm->_sound->stopSound();
}
-void AgiEngine::cmd_menu_input(uint8 *p) {
- newInputMode(INPUT_MENU);
+void cmdMenuInput(AgiGame *state, uint8 *p) {
+ state->_vm->newInputMode(INPUT_MENU);
}
-void AgiEngine::cmd_enable_item(uint8 *p) {
- _menu->setItem(p0, true);
+void cmdEnableItem(AgiGame *state, uint8 *p) {
+ state->_vm->_menu->setItem(p0, true);
}
-void AgiEngine::cmd_disable_item(uint8 *p) {
- _menu->setItem(p0, false);
+void cmdDisableItem(AgiGame *state, uint8 *p) {
+ state->_vm->_menu->setItem(p0, false);
}
-void AgiEngine::cmd_submit_menu(uint8 *p) {
- _menu->submit();
+void cmdSubmitMenu(AgiGame *state, uint8 *p) {
+ state->_vm->_menu->submit();
}
-void AgiEngine::cmd_set_scan_start(uint8 *p) {
- _curLogic->sIP = _curLogic->cIP;
+void cmdSetScanStart(AgiGame *state, uint8 *p) {
+ state->_curLogic->sIP = state->_curLogic->cIP;
}
-void AgiEngine::cmd_reset_scan_start(uint8 *p) {
- _curLogic->sIP = 2;
+void cmdResetScanStart(AgiGame *state, uint8 *p) {
+ state->_curLogic->sIP = 2;
}
-void AgiEngine::cmd_save_game(uint8 *p) {
- _game.simpleSave ? saveGameSimple() : saveGameDialog();
+void cmdSaveGame(AgiGame *state, uint8 *p) {
+ state->simpleSave ? state->_vm->saveGameSimple() : state->_vm->saveGameDialog();
}
-void AgiEngine::cmd_load_game(uint8 *p) {
+void cmdLoadGame(AgiGame *state, uint8 *p) {
assert(1);
- _game.simpleSave ? loadGameSimple() : loadGameDialog();
+ state->simpleSave ? state->_vm->loadGameSimple() : state->_vm->loadGameDialog();
}
-void AgiEngine::cmd_init_disk(uint8 *p) { // do nothing
+void cmdInitDisk(AgiGame *state, uint8 *p) { // do nothing
}
-void AgiEngine::cmd_log(uint8 *p) { // do nothing
+void cmdLog(AgiGame *state, uint8 *p) { // do nothing
}
-void AgiEngine::cmd_trace_on(uint8 *p) { // do nothing
+void cmdTraceOn(AgiGame *state, uint8 *p) { // do nothing
}
-void AgiEngine::cmd_trace_info(uint8 *p) { // do nothing
+void cmdTraceInfo(AgiGame *state, uint8 *p) { // do nothing
}
-void AgiEngine::cmd_show_mem(uint8 *p) {
- messageBox("Enough memory");
+void cmdShowMem(AgiGame *state, uint8 *p) {
+ state->_vm->messageBox("Enough memory");
}
-void AgiEngine::cmd_init_joy(uint8 *p) { // do nothing
+void cmdInitJoy(AgiGame *state, uint8 *p) { // do nothing
}
-void AgiEngine::cmd_script_size(uint8 *p) {
+void cmdScriptSize(AgiGame *state, uint8 *p) {
debug(0, "script.size(%d)", p0);
}
-void AgiEngine::cmd_cancel_line(uint8 *p) {
- _game.inputBuffer[0] = 0;
- _game.cursorPos = 0;
- writePrompt();
+void cmdCancelLine(AgiGame *state, uint8 *p) {
+ state->inputBuffer[0] = 0;
+ state->cursorPos = 0;
+ state->_vm->writePrompt();
}
// This implementation is based on observations of Amiga's Gold Rush.
@@ -509,23 +545,23 @@ void AgiEngine::cmd_cancel_line(uint8 *p) {
// 4051 (When ego is stationary),
// 471 (When walking on the first screen's bridge),
// 71 (When walking around, using the mouse or the keyboard).
-void AgiEngine::cmd_obj_status_f(uint8 *p) {
+void cmdObjStatusF(AgiGame *state, uint8 *p) {
const char *cycleDesc; // Object's cycle description line
const char *motionDesc; // Object's motion description line
char msg[256]; // The whole object status message
// Generate cycle description line
switch (vt_v.cycle) {
- case CYCLE_NORMAL:
+ case kCycleNormal:
cycleDesc = "normal cycle";
break;
- case CYCLE_END_OF_LOOP:
+ case kCycleEndOfLoop:
cycleDesc = "end of loop";
break;
- case CYCLE_REV_LOOP:
+ case kCycleRevLoop:
cycleDesc = "reverse loop";
break;
- case CYCLE_REVERSE:
+ case kCycleReverse:
cycleDesc = "reverse cycle";
break;
default:
@@ -535,16 +571,16 @@ void AgiEngine::cmd_obj_status_f(uint8 *p) {
// Generate motion description line
switch (vt_v.motion) {
- case MOTION_NORMAL:
+ case kMotionNormal:
motionDesc = "normal motion";
break;
- case MOTION_WANDER:
+ case kMotionWander:
motionDesc = "wandering";
break;
- case MOTION_FOLLOW_EGO:
+ case kMotionFollowEgo:
motionDesc = "following ego";
break;
- case MOTION_MOVE_OBJ:
+ case kMotionMoveObj:
// Amiga's Gold Rush! most probably uses "move to (x, y)"
// here with real values for x and y. The same output
// is used when moving the ego around using the mouse.
@@ -570,7 +606,7 @@ void AgiEngine::cmd_obj_status_f(uint8 *p) {
vt_v.stepSize,
cycleDesc,
motionDesc);
- messageBox(msg);
+ state->_vm->messageBox(msg);
}
// unknown commands:
@@ -581,49 +617,49 @@ void AgiEngine::cmd_obj_status_f(uint8 *p) {
// unk_174: Change priority table (used in KQ4) -- j5
// unk_177: Disable menus completely -- j5
// unk_181: Deactivate keypressed control (default control of ego)
-void AgiEngine::cmd_set_simple(uint8 *p) {
+void cmdSetSimple(AgiGame *state, uint8 *p) {
if (!(getFeatures() & (GF_AGI256 | GF_AGI256_2))) {
- _game.simpleSave = true;
+ state->simpleSave = true;
} else { // AGI256 and AGI256-2 use this unknown170 command to load 256 color pictures.
- // Load the picture. Similar to void AgiEngine::cmd_load_pic(uint8 *p).
- _sprites->eraseBoth();
- agiLoadResource(rPICTURE, _v[p0]);
+ // Load the picture. Similar to void cmdLoad_pic(AgiGame *state, uint8 *p).
+ state->_vm->_sprites->eraseBoth();
+ state->_vm->agiLoadResource(rPICTURE, _v[p0]);
- // Draw the picture. Similar to void AgiEngine::cmd_draw_pic(uint8 *p).
- _picture->decodePicture(_v[p0], false, true);
- _sprites->blitBoth();
- _game.pictureShown = 0;
+ // Draw the picture. Similar to void cmdDraw_pic(AgiGame *state, uint8 *p).
+ state->_vm->_picture->decodePicture(_v[p0], false, true);
+ state->_vm->_sprites->blitBoth();
+ state->pictureShown = 0;
- // Show the picture. Similar to void AgiEngine::cmd_show_pic(uint8 *p).
+ // Show the picture. Similar to void cmdShow_pic(AgiGame *state, uint8 *p).
setflag(fOutputMode, false);
- closeWindow();
- _picture->showPic();
- _game.pictureShown = 1;
+ state->_vm->closeWindow();
+ state->_vm->_picture->showPic();
+ state->pictureShown = 1;
// Simulate slowww computer. Many effects rely on this
- pause(kPausePicture);
+ state->_vm->pause(kPausePicture);
}
}
-void AgiEngine::cmd_pop_script(uint8 *p) {
+void cmdPopScript(AgiGame *state, uint8 *p) {
if (getVersion() >= 0x2915) {
debug(0, "pop.script");
}
}
-void AgiEngine::cmd_hold_key(uint8 *p) {
+void cmdHoldKey(AgiGame *state, uint8 *p) {
if (getVersion() >= 0x3098) {
- _egoHoldKey = true;
+ state->_vm->_egoHoldKey = true;
}
}
-void AgiEngine::cmd_discard_sound(uint8 *p) {
+void cmdDiscardSound(AgiGame *state, uint8 *p) {
if (getVersion() >= 0x2936) {
debug(0, "discard.sound");
}
}
-void AgiEngine::cmd_hide_mouse(uint8 *p) {
+void cmdHideMouse(AgiGame *state, uint8 *p) {
// WORKAROUND: Turns off current movement that's being caused with the mouse.
// This fixes problems with too many popup boxes appearing in the Amiga
// Gold Rush's copy protection failure scene (i.e. the hanging scene, logic.192).
@@ -631,37 +667,37 @@ void AgiEngine::cmd_hide_mouse(uint8 *p) {
// to walk somewhere else than to the right using the mouse.
// FIXME: Write a proper implementation using disassembly and
// apply it to other games as well if applicable.
- _game.viewTable[0].flags &= ~ADJ_EGO_XY;
+ state->viewTable[0].flags &= ~fAdjEgoXY;
g_system->showMouse(false);
}
-void AgiEngine::cmd_allow_menu(uint8 *p) {
+void cmdAllowMenu(AgiGame *state, uint8 *p) {
if (getVersion() >= 0x3098) {
setflag(fMenusWork, ((p0 != 0) ? true : false));
}
}
-void AgiEngine::cmd_show_mouse(uint8 *p) {
+void cmdShowMouse(AgiGame *state, uint8 *p) {
g_system->showMouse(true);
}
-void AgiEngine::cmd_fence_mouse(uint8 *p) {
- _game.mouseFence.moveTo(p0, p1);
- _game.mouseFence.setWidth(p2 - p0);
- _game.mouseFence.setHeight(p3 - p1);
+void cmdFenceMouse(AgiGame *state, uint8 *p) {
+ state->mouseFence.moveTo(p0, p1);
+ state->mouseFence.setWidth(p2 - p0);
+ state->mouseFence.setHeight(p3 - p1);
}
-void AgiEngine::cmd_release_key(uint8 *p) {
+void cmdReleaseKey(AgiGame *state, uint8 *p) {
if (getVersion() >= 0x3098) {
- _egoHoldKey = false;
+ state->_vm->_egoHoldKey = false;
}
}
-void AgiEngine::cmd_adj_ego_move_to_x_y(uint8 *p) {
+void cmdAdjEgoMoveToXY(AgiGame *state, uint8 *p) {
int8 x, y;
- switch (logicNamesCmd[182].numArgs) {
+ switch (logicNamesCmd[182].argumentsLength()) {
// The 2 arguments version is used at least in Amiga Gold Rush!
// (v2.05 1989-03-09, Amiga AGI 2.316) in logics 130 and 150
// (Using arguments (0, 0), (0, 7), (0, 8), (9, 9) and (-9, 9)).
@@ -680,57 +716,67 @@ void AgiEngine::cmd_adj_ego_move_to_x_y(uint8 *p) {
// onto the ladder so this is more like it (Although that may be caused
// by something else because this command doesn't do any flag manipulations
// in the Amiga version - checked it with disassembly).
- if (x != _game.adjMouseX || y != _game.adjMouseY)
- _game.viewTable[EGO_VIEW_TABLE].flags &= ~ADJ_EGO_XY;
+ if (x != state->adjMouseX || y != state->adjMouseY)
+ state->viewTable[EGO_VIEW_TABLE].flags &= ~fAdjEgoXY;
- _game.adjMouseX = x;
- _game.adjMouseY = y;
+ state->adjMouseX = x;
+ state->adjMouseY = y;
debugC(4, kDebugLevelScripts, "adj.ego.move.to.x.y(%d, %d)", x, y);
break;
// TODO: Check where (if anywhere) the 0 arguments version is used
case 0:
default:
- _game.viewTable[0].flags |= ADJ_EGO_XY;
+ state->viewTable[0].flags |= fAdjEgoXY;
break;
}
}
-void AgiEngine::cmd_parse(uint8 *p) {
+void cmdParse(AgiGame *state, uint8 *p) {
_v[vWordNotFound] = 0;
setflag(fEnteredCli, false);
setflag(fSaidAcceptedInput, false);
- dictionaryWords(agiSprintf(_game.strings[p0]));
+ state->_vm->dictionaryWords(state->_vm->agiSprintf(state->strings[p0]));
}
-void AgiEngine::cmd_call(uint8 *p) {
+void cmdCall(AgiGame *state, uint8 *p) {
int oldCIP;
int oldLognum;
// CM: we don't save sIP because set.scan.start can be
// used in a called script (fixes xmas demo)
- oldCIP = _curLogic->cIP;
- oldLognum = _game.lognum;
+ oldCIP = state->_curLogic->cIP;
+ oldLognum = state->lognum;
- runLogic(p0);
+ state->_vm->runLogic(p0);
- _game.lognum = oldLognum;
- _curLogic = &_game.logics[_game.lognum];
- _curLogic->cIP = oldCIP;
+ state->lognum = oldLognum;
+ state->_curLogic = &state->logics[state->lognum];
+ state->_curLogic->cIP = oldCIP;
}
-void AgiEngine::cmd_call_f(uint8 *p) {
- cmd_call(&_v[p0]);
+void cmdCallF(AgiGame *state, uint8 *p) {
+ cmdCall(state, &_v[p0]);
}
-void AgiEngine::cmd_draw_pic(uint8 *p) {
+void cmdDrawPicV1(AgiGame *state, uint8 *p) {
+ debugC(6, kDebugLevelScripts, "=== draw pic V1 %d ===", _v[p0]);
+ state->_vm->_picture->decodePicture(_v[p0], true);
+
+ state->_vm->clearPrompt();
+
+ // Simulate slowww computer. Many effects rely on this
+ state->_vm->pause(kPausePicture);
+}
+
+void cmdDrawPic(AgiGame *state, uint8 *p) {
debugC(6, kDebugLevelScripts, "=== draw pic %d ===", _v[p0]);
- _sprites->eraseBoth();
- _picture->decodePicture(_v[p0], true);
- _sprites->blitBoth();
- _sprites->commitBoth();
- _game.pictureShown = 0;
+ state->_vm->_sprites->eraseBoth();
+ state->_vm->_picture->decodePicture(_v[p0], true);
+ state->_vm->_sprites->blitBoth();
+ state->_vm->_sprites->commitBoth();
+ state->pictureShown = 0;
debugC(6, kDebugLevelScripts, "--- end of draw pic %d ---", _v[p0]);
// WORKAROUND for a script bug which exists in SQ1, logic scripts
@@ -749,79 +795,93 @@ void AgiEngine::cmd_draw_pic(uint8 *p) {
setflag(103, false);
// Simulate slowww computer. Many effects rely on this
- pause(kPausePicture);
+ state->_vm->pause(kPausePicture);
}
-void AgiEngine::cmd_show_pic(uint8 *p) {
+void cmdShowPic(AgiGame *state, uint8 *p) {
debugC(6, kDebugLevelScripts, "=== show pic ===");
setflag(fOutputMode, false);
- closeWindow();
- _picture->showPic();
- _game.pictureShown = 1;
+ state->_vm->closeWindow();
+ state->_vm->_picture->showPic();
+ state->pictureShown = 1;
debugC(6, kDebugLevelScripts, "--- end of show pic ---");
}
-void AgiEngine::cmd_load_pic(uint8 *p) {
- _sprites->eraseBoth();
- agiLoadResource(rPICTURE, _v[p0]);
- _sprites->blitBoth();
- _sprites->commitBoth();
+void cmdLoadPic(AgiGame *state, uint8 *p) {
+ state->_vm->_sprites->eraseBoth();
+ state->_vm->agiLoadResource(rPICTURE, _v[p0]);
+ state->_vm->_sprites->blitBoth();
+ state->_vm->_sprites->commitBoth();
+}
+
+void cmdLoadPicV1(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rPICTURE, _v[p0]);
}
-void AgiEngine::cmd_discard_pic(uint8 *p) {
+void cmdDiscardPic(AgiGame *state, uint8 *p) {
debugC(6, kDebugLevelScripts, "--- discard pic ---");
// do nothing
}
-void AgiEngine::cmd_overlay_pic(uint8 *p) {
+void cmdOverlayPic(AgiGame *state, uint8 *p) {
debugC(6, kDebugLevelScripts, "--- overlay pic ---");
- _sprites->eraseBoth();
- _picture->decodePicture(_v[p0], false);
- _sprites->blitBoth();
- _game.pictureShown = 0;
- _sprites->commitBoth();
+ state->_vm->_sprites->eraseBoth();
+ state->_vm->_picture->decodePicture(_v[p0], false);
+ state->_vm->_sprites->blitBoth();
+ state->pictureShown = 0;
+ state->_vm->_sprites->commitBoth();
// Simulate slowww computer. Many effects rely on this
- pause(kPausePicture);
+ state->_vm->pause(kPausePicture);
}
-void AgiEngine::cmd_show_pri_screen(uint8 *p) {
- _debug.priority = 1;
- _sprites->eraseBoth();
- _picture->showPic();
- _sprites->blitBoth();
+void cmdShowPriScreen(AgiGame *state, uint8 *p) {
+ state->_vm->_debug.priority = 1;
+ state->_vm->_sprites->eraseBoth();
+ state->_vm->_picture->showPic();
+ state->_vm->_sprites->blitBoth();
- waitKey();
+ state->_vm->waitKey();
- _debug.priority = 0;
- _sprites->eraseBoth();
- _picture->showPic();
- _sprites->blitBoth();
+ state->_vm->_debug.priority = 0;
+ state->_vm->_sprites->eraseBoth();
+ state->_vm->_picture->showPic();
+ state->_vm->_sprites->blitBoth();
}
-void AgiEngine::cmd_animate_obj(uint8 *p) {
- if (vt.flags & ANIMATED)
- return;
+void cmdAnimateObj(AgiGame *state, uint8 *p) {
+ if (getVersion() < 0x2000) {
+ if (vt.flags & fDidntMove)
+ return;
+ } else {
+ if (vt.flags & fAnimated)
+ return;
+ }
debugC(4, kDebugLevelScripts, "animate vt entry #%d", p0);
- vt.flags = ANIMATED | UPDATE | CYCLING;
- vt.motion = MOTION_NORMAL;
- vt.cycle = CYCLE_NORMAL;
+ vt.flags = fAnimated | fUpdate | fCycling;
+
+ if (getVersion() < 0x2000) {
+ vt.flags |= fDidntMove;
+ }
+
+ vt.motion = kMotionNormal;
+ vt.cycle = kCycleNormal;
vt.direction = 0;
}
-void AgiEngine::cmd_unanimate_all(uint8 *p) {
+void cmdUnanimateAll(AgiGame *state, uint8 *p) {
int i;
for (i = 0; i < MAX_VIEWTABLE; i++)
- _game.viewTable[i].flags &= ~(ANIMATED | DRAWN);
+ state->viewTable[i].flags &= ~(fAnimated | fDrawn);
}
-void AgiEngine::cmd_draw(uint8 *p) {
- if (vt.flags & DRAWN)
+void cmdDraw(AgiGame *state, uint8 *p) {
+ if (vt.flags & fDrawn)
return;
if (vt.ySize <= 0 || vt.xSize <= 0)
@@ -829,20 +889,20 @@ void AgiEngine::cmd_draw(uint8 *p) {
debugC(4, kDebugLevelScripts, "draw entry %d", vt.entry);
- vt.flags |= UPDATE;
+ vt.flags |= fUpdate;
if (getVersion() >= 0x3000) {
- setLoop(&vt, vt.currentLoop);
- setCel(&vt, vt.currentCel);
+ state->_vm->setLoop(&vt, vt.currentLoop);
+ state->_vm->setCel(&vt, vt.currentCel);
}
- fixPosition(p0);
+ state->_vm->fixPosition(p0);
vt.xPos2 = vt.xPos;
vt.yPos2 = vt.yPos;
vt.celData2 = vt.celData;
- _sprites->eraseUpdSprites();
- vt.flags |= DRAWN;
+ state->_vm->_sprites->eraseUpdSprites();
+ vt.flags |= fDrawn;
- // WORKAROUND: This fixes a bug with AGI Fanmade _game Space Trek.
+ // WORKAROUND: This fixes a bug with AGI Fanmade game Space Trek.
// The original workaround checked if AGI version was <= 2.440, which could
// cause regressions with some AGI games. The original workaround no longer
// works for Space Trek in ScummVM, as all fanmade games are set to use
@@ -854,30 +914,30 @@ void AgiEngine::cmd_draw(uint8 *p) {
// games are affected. If yes, then it'd be best to set this for Space
// Trek only
if (getFeatures() & GF_FANMADE) // See Sarien bug #546562
- vt.flags |= ANIMATED;
+ vt.flags |= fAnimated;
- _sprites->blitUpdSprites();
- vt.flags &= ~DONTUPDATE;
+ state->_vm->_sprites->blitUpdSprites();
+ vt.flags &= ~fDontupdate;
- _sprites->commitBlock(vt.xPos, vt.yPos - vt.ySize + 1, vt.xPos + vt.xSize - 1, vt.yPos, true);
+ state->_vm->_sprites->commitBlock(vt.xPos, vt.yPos - vt.ySize + 1, vt.xPos + vt.xSize - 1, vt.yPos, true);
debugC(4, kDebugLevelScripts, "vt entry #%d flags = %02x", p0, vt.flags);
}
-void AgiEngine::cmd_erase(uint8 *p) {
- if (~vt.flags & DRAWN)
+void cmdErase(AgiGame *state, uint8 *p) {
+ if (~vt.flags & fDrawn)
return;
- _sprites->eraseUpdSprites();
+ state->_vm->_sprites->eraseUpdSprites();
- if (vt.flags & UPDATE) {
- vt.flags &= ~DRAWN;
+ if (vt.flags & fUpdate) {
+ vt.flags &= ~fDrawn;
} else {
- _sprites->eraseNonupdSprites();
- vt.flags &= ~DRAWN;
- _sprites->blitNonupdSprites();
+ state->_vm->_sprites->eraseNonupdSprites();
+ vt.flags &= ~fDrawn;
+ state->_vm->_sprites->blitNonupdSprites();
}
- _sprites->blitUpdSprites();
+ state->_vm->_sprites->blitUpdSprites();
int x1, y1, x2, y2;
@@ -886,10 +946,10 @@ void AgiEngine::cmd_erase(uint8 *p) {
y1 = MIN((int)MIN(vt.yPos, vt.yPos2), MIN(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height));
y2 = MAX((int)MAX(vt.yPos, vt.yPos2), MAX(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height));
- _sprites->commitBlock(x1, y1, x2, y2, true);
+ state->_vm->_sprites->commitBlock(x1, y1, x2, y2, true);
}
-void AgiEngine::cmd_position(uint8 *p) {
+void cmdPosition(AgiGame *state, uint8 *p) {
vt.xPos = vt.xPos2 = p1;
vt.yPos = vt.yPos2 = p2;
@@ -907,10 +967,15 @@ void AgiEngine::cmd_position(uint8 *p) {
// strictly need the identical workaround in the position.v-command but it does make
// for a nice symmetry.
if (getFeatures() & GF_CLIPCOORDS)
- clipViewCoordinates(&vt);
+ state->_vm->clipViewCoordinates(&vt);
+}
+
+void cmdPositionV1(AgiGame *state, uint8 *p) {
+ vt.xPos = p1;
+ vt.yPos = p2;
}
-void AgiEngine::cmd_position_f(uint8 *p) {
+void cmdPositionF(AgiGame *state, uint8 *p) {
vt.xPos = vt.xPos2 = _v[p1];
vt.yPos = vt.yPos2 = _v[p2];
@@ -918,19 +983,24 @@ void AgiEngine::cmd_position_f(uint8 *p) {
// with an accompanying identical workaround in position-command (i.e. command 0x25).
// See that workaround's comment for more in-depth information.
if (getFeatures() & GF_CLIPCOORDS)
- clipViewCoordinates(&vt);
+ state->_vm->clipViewCoordinates(&vt);
}
-void AgiEngine::cmd_get_posn(uint8 *p) {
- _game.vars[p1] = (unsigned char)vt.xPos;
- _game.vars[p2] = (unsigned char)vt.yPos;
+void cmdPositionFV1(AgiGame *state, uint8 *p) {
+ vt.xPos = _v[p1];
+ vt.yPos = _v[p2];
+}
+
+void cmdGetPosn(AgiGame *state, uint8 *p) {
+ state->vars[p1] = (unsigned char)vt.xPos;
+ state->vars[p2] = (unsigned char)vt.yPos;
}
-void AgiEngine::cmd_reposition(uint8 *p) {
+void cmdReposition(AgiGame *state, uint8 *p) {
int dx = (int8) _v[p1], dy = (int8) _v[p2];
debugC(4, kDebugLevelScripts, "dx=%d, dy=%d", dx, dy);
- vt.flags |= UPDATE_POS;
+ vt.flags |= fUpdatePos;
if (dx < 0 && vt.xPos < -dx)
vt.xPos = 0;
@@ -942,109 +1012,154 @@ void AgiEngine::cmd_reposition(uint8 *p) {
else
vt.yPos += dy;
- fixPosition(p0);
+ state->_vm->fixPosition(p0);
}
-void AgiEngine::cmd_reposition_to(uint8 *p) {
+void cmdRepositionV1(AgiGame *state, uint8 *p) {
+ vt.xPos2 = vt.xPos;
+ vt.yPos2 = vt.yPos;
+ vt.flags |= fUpdatePos;
+
+ vt.xPos = (vt.xPos + p1) & 0xff;
+ vt.yPos = (vt.yPos + p2) & 0xff;
+}
+
+void cmdRepositionTo(AgiGame *state, uint8 *p) {
vt.xPos = p1;
vt.yPos = p2;
- vt.flags |= UPDATE_POS;
- fixPosition(p0);
+ vt.flags |= fUpdatePos;
+ state->_vm->fixPosition(p0);
}
-void AgiEngine::cmd_reposition_to_f(uint8 *p) {
+void cmdRepositionToF(AgiGame *state, uint8 *p) {
vt.xPos = _v[p1];
vt.yPos = _v[p2];
- vt.flags |= UPDATE_POS;
- fixPosition(p0);
+ vt.flags |= fUpdatePos;
+ state->_vm->fixPosition(p0);
+}
+
+void cmdAddToPic(AgiGame *state, uint8 *p) {
+ state->_vm->_sprites->addToPic(p0, p1, p2, p3, p4, p5, p6);
}
-void AgiEngine::cmd_add_to_pic(uint8 *p) {
- _sprites->addToPic(p0, p1, p2, p3, p4, p5, p6);
+void cmdAddToPicV1(AgiGame *state, uint8 *p) {
+ state->_vm->_sprites->addToPic(p0, p1, p2, p3, p4, p5, -1);
}
-void AgiEngine::cmd_add_to_pic_f(uint8 *p) {
- _sprites->addToPic(_v[p0], _v[p1], _v[p2], _v[p3], _v[p4], _v[p5], _v[p6]);
+void cmdAddToPicF(AgiGame *state, uint8 *p) {
+ state->_vm->_sprites->addToPic(_v[p0], _v[p1], _v[p2], _v[p3], _v[p4], _v[p5], _v[p6]);
}
-void AgiEngine::cmd_force_update(uint8 *p) {
- _sprites->eraseBoth();
- _sprites->blitBoth();
- _sprites->commitBoth();
+void cmdForceUpdate(AgiGame *state, uint8 *p) {
+ state->_vm->_sprites->eraseBoth();
+ state->_vm->_sprites->blitBoth();
+ state->_vm->_sprites->commitBoth();
}
-void AgiEngine::cmd_reverse_loop(uint8 *p) {
+void cmdReverseLoop(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts, "o%d, f%d", p0, p1);
- vt.cycle = CYCLE_REV_LOOP;
- vt.flags |= (DONTUPDATE | UPDATE | CYCLING);
+ vt.cycle = kCycleRevLoop;
+ vt.flags |= (fDontupdate | fUpdate | fCycling);
vt.parm1 = p1;
setflag(p1, false);
}
-void AgiEngine::cmd_end_of_loop(uint8 *p) {
+void cmdReverseLoopV1(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts, "o%d, f%d", p0, p1);
- vt.cycle = CYCLE_END_OF_LOOP;
- vt.flags |= (DONTUPDATE | UPDATE | CYCLING);
+ vt.cycle = kCycleRevLoop;
+ state->_vm->setCel(&vt, 0);
+ vt.flags |= (fDontupdate | fUpdate | fCycling);
+ vt.parm1 = p1;
+ vt.parm3 = 0;
+}
+
+void cmdEndOfLoop(AgiGame *state, uint8 *p) {
+ debugC(4, kDebugLevelScripts, "o%d, f%d", p0, p1);
+ vt.cycle = kCycleEndOfLoop;
+ vt.flags |= (fDontupdate | fUpdate | fCycling);
vt.parm1 = p1;
setflag(p1, false);
}
-void AgiEngine::cmd_block(uint8 *p) {
+void cmdEndOfLoopV1(AgiGame *state, uint8 *p) {
+ debugC(4, kDebugLevelScripts, "o%d, f%d", p0, p1);
+ vt.cycle = kCycleEndOfLoop;
+ state->_vm->setCel(&vt, 0);
+ vt.flags |= (fDontupdate | fUpdate | fCycling);
+ vt.parm1 = p1;
+ vt.parm3 = 0;
+}
+
+void cmdBlock(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts, "x1=%d, y1=%d, x2=%d, y2=%d", p0, p1, p2, p3);
- _game.block.active = true;
- _game.block.x1 = p0;
- _game.block.y1 = p1;
- _game.block.x2 = p2;
- _game.block.y2 = p3;
+ state->block.active = true;
+ state->block.x1 = p0;
+ state->block.y1 = p1;
+ state->block.x2 = p2;
+ state->block.y2 = p3;
}
-void AgiEngine::cmd_unblock(uint8 *p) {
- _game.block.active = false;
+void cmdUnblock(AgiGame *state, uint8 *p) {
+ state->block.active = false;
}
-void AgiEngine::cmd_normal_motion(uint8 *p) {
- vt.motion = MOTION_NORMAL;
+void cmdNormalMotion(AgiGame *state, uint8 *p) {
+ vt.motion = kMotionNormal;
}
-void AgiEngine::cmd_stop_motion(uint8 *p) {
+void cmdStopMotion(AgiGame *state, uint8 *p) {
vt.direction = 0;
- vt.motion = MOTION_NORMAL;
+ vt.motion = kMotionNormal;
if (p0 == 0) { // ego only
_v[vEgoDir] = 0;
- _game.playerControl = false;
+ state->playerControl = false;
}
}
-void AgiEngine::cmd_start_motion(uint8 *p) {
- vt.motion = MOTION_NORMAL;
+void cmdStopMotionV1(AgiGame *state, uint8 *p) {
+ vt.flags &= ~fAnimated;
+}
+
+void cmdStartMotion(AgiGame *state, uint8 *p) {
+ vt.motion = kMotionNormal;
if (p0 == 0) { // ego only
_v[vEgoDir] = 0;
- _game.playerControl = true;
+ state->playerControl = true;
}
}
-void AgiEngine::cmd_player_control(uint8 *p) {
- _game.playerControl = true;
- _game.viewTable[0].motion = MOTION_NORMAL;
+void cmdStartMotionV1(AgiGame *state, uint8 *p) {
+ vt.flags |= fAnimated;
+}
+
+void cmdPlayerControl(AgiGame *state, uint8 *p) {
+ state->playerControl = true;
+ state->viewTable[0].motion = kMotionNormal;
}
-void AgiEngine::cmd_program_control(uint8 *p) {
- _game.playerControl = false;
+void cmdProgramControl(AgiGame *state, uint8 *p) {
+ state->playerControl = false;
}
-void AgiEngine::cmd_follow_ego(uint8 *p) {
- vt.motion = MOTION_FOLLOW_EGO;
+void cmdFollowEgo(AgiGame *state, uint8 *p) {
+ vt.motion = kMotionFollowEgo;
vt.parm1 = p1 > vt.stepSize ? p1 : vt.stepSize;
vt.parm2 = p2;
vt.parm3 = 0xff;
- setflag(p2, false);
- vt.flags |= UPDATE;
+
+ if (getVersion() < 0x2000) {
+ _v[p2] = 0;
+ vt.flags |= fUpdate | fAnimated;
+ } else {
+ setflag(p2, false);
+ vt.flags |= fUpdate;
+ }
}
-void AgiEngine::cmd_move_obj(uint8 *p) {
+void cmdMoveObj(AgiGame *state, uint8 *p) {
// _D (_D_WARN "o=%d, x=%d, y=%d, s=%d, f=%d", p0, p1, p2, p3, p4);
- vt.motion = MOTION_MOVE_OBJ;
+ vt.motion = kMotionMoveObj;
vt.parm1 = p1;
vt.parm2 = p2;
vt.parm3 = vt.stepSize;
@@ -1053,19 +1168,24 @@ void AgiEngine::cmd_move_obj(uint8 *p) {
if (p3 != 0)
vt.stepSize = p3;
- setflag(p4, false);
- vt.flags |= UPDATE;
+ if (getVersion() < 0x2000) {
+ _v[p4] = 0;
+ vt.flags |= fUpdate | fAnimated;
+ } else {
+ setflag(p4, false);
+ vt.flags |= fUpdate;
+ }
if (p0 == 0)
- _game.playerControl = false;
+ state->playerControl = false;
// AGI 2.272 (ddp, xmas) doesn't call move_obj!
if (getVersion() > 0x2272)
- moveObj(&vt);
+ state->_vm->moveObj(&vt);
}
-void AgiEngine::cmd_move_obj_f(uint8 *p) {
- vt.motion = MOTION_MOVE_OBJ;
+void cmdMoveObjF(AgiGame *state, uint8 *p) {
+ vt.motion = kMotionMoveObj;
vt.parm1 = _v[p1];
vt.parm2 = _v[p2];
vt.parm3 = vt.stepSize;
@@ -1075,67 +1195,70 @@ void AgiEngine::cmd_move_obj_f(uint8 *p) {
vt.stepSize = _v[p3];
setflag(p4, false);
- vt.flags |= UPDATE;
+ vt.flags |= fUpdate;
if (p0 == 0)
- _game.playerControl = false;
+ state->playerControl = false;
// AGI 2.272 (ddp, xmas) doesn't call move_obj!
if (getVersion() > 0x2272)
- moveObj(&vt);
+ state->_vm->moveObj(&vt);
}
-void AgiEngine::cmd_wander(uint8 *p) {
+void cmdWander(AgiGame *state, uint8 *p) {
if (p0 == 0)
- _game.playerControl = false;
+ state->playerControl = false;
- vt.motion = MOTION_WANDER;
- vt.flags |= UPDATE;
+ vt.motion = kMotionWander;
+ if (getVersion() < 0x2000) {
+ vt.flags |= fUpdate | fAnimated;
+ } else {
+ vt.flags |= fUpdate;
+ }
}
-void AgiEngine::cmd_set_game_id(uint8 *p) {
- if (_curLogic->texts && (p0 - 1) <= _curLogic->numTexts)
- strncpy(_game.id, _curLogic->texts[p0 - 1], 8);
+void cmdSetGameID(AgiGame *state, uint8 *p) {
+ if (state->_curLogic->texts && (p0 - 1) <= state->_curLogic->numTexts)
+ strncpy(state->id, state->_curLogic->texts[p0 - 1], 8);
else
- _game.id[0] = 0;
+ state->id[0] = 0;
- debug(0, "Game ID: \"%s\"", _game.id);
+ debug(0, "Game ID: \"%s\"", state->id);
}
-void AgiEngine::cmd_pause(uint8 *p) {
- int tmp = _game.clockEnabled;
+void cmdPause(AgiGame *state, uint8 *p) {
+ int tmp = state->clockEnabled;
const char *b[] = { "Continue", NULL };
const char *b_ru[] = { "\x8f\xe0\xae\xa4\xae\xab\xa6\xa8\xe2\xec", NULL };
- _game.clockEnabled = false;
+ state->clockEnabled = false;
switch (getLanguage()) {
case Common::RU_RUS:
- selectionBox(" \x88\xa3\xe0\xa0 \xae\xe1\xe2\xa0\xad\xae\xa2\xab\xa5\xad\xa0. \n\n\n", b_ru);
+ state->_vm->selectionBox(" \x88\xa3\xe0\xa0 \xae\xe1\xe2\xa0\xad\xae\xa2\xab\xa5\xad\xa0. \n\n\n", b_ru);
break;
default:
- selectionBox(" Game is paused. \n\n\n", b);
+ state->_vm->selectionBox(" Game is paused. \n\n\n", b);
break;
}
- _game.clockEnabled = tmp;
+ state->clockEnabled = tmp;
}
-void AgiEngine::cmd_set_menu(uint8 *p) {
- debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, _curLogic->numTexts);
+void cmdSetMenu(AgiGame *state, uint8 *p) {
+ debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, state->_curLogic->numTexts);
- if (_curLogic->texts != NULL && p0 <= _curLogic->numTexts)
- _menu->add(_curLogic->texts[p0 - 1]);
+ if (state->_curLogic->texts != NULL && p0 <= state->_curLogic->numTexts)
+ state->_vm->_menu->add(state->_curLogic->texts[p0 - 1]);
}
-void AgiEngine::cmd_set_menu_item(uint8 *p) {
- debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, _curLogic->numTexts);
+void cmdSetMenuItem(AgiGame *state, uint8 *p) {
+ debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, state->_curLogic->numTexts);
- if (_curLogic->texts != NULL && p0 <= _curLogic->numTexts)
- _menu->addItem(_curLogic->texts[p0 - 1], p1);
+ if (state->_curLogic->texts != NULL && p0 <= state->_curLogic->numTexts)
+ state->_vm->_menu->addItem(state->_curLogic->texts[p0 - 1], p1);
}
-void AgiEngine::cmd_version(uint8 *p) {
- char verMsg[64];
+void cmdVersion(AgiGame *state, uint8 *p) {
char ver2Msg[] =
"\n"
" \n\n"
@@ -1145,115 +1268,104 @@ void AgiEngine::cmd_version(uint8 *p) {
" \n\n"
" Emulating AGI v%x.002.%03x\n";
// no Sierra as it wraps textbox
- char *r, *q;
- int ver, maj, min;
- char msg[256];
- int gap;
- int len;
-
- sprintf(verMsg, TITLE " v%s", gScummVMVersion);
-
- ver = getVersion();
- maj = (ver >> 12) & 0xf;
- min = ver & 0xfff;
- q = maj == 2 ? ver2Msg : ver3Msg;
- r = strchr(q + 1, '\n');
+ Common::String verMsg = TITLE " v%s";
+
+ int ver = getVersion();
+ int maj = (ver >> 12) & 0xf;
+ int min = ver & 0xfff;
- // insert our version into the other version
- len = strlen(verMsg);
- gap = r - q;
-
- if (gap < 0)
- gap = 0;
- else
- gap = (gap - len) / 2;
+ verMsg += (maj == 2 ? ver2Msg : ver3Msg);
+ verMsg = Common::String::format(verMsg.c_str(), gScummVMVersion, maj, min);
- strncpy(q + 1 + gap, verMsg, strlen(verMsg));
- sprintf(msg, q, maj, min);
- messageBox(msg);
+ state->_vm->messageBox(verMsg.c_str());
}
-void AgiEngine::cmd_configure_screen(uint8 *p) {
- _game.lineMinPrint = p0;
- _game.lineUserInput = p1;
- _game.lineStatus = p2;
+void cmdConfigureScreen(AgiGame *state, uint8 *p) {
+ state->lineMinPrint = p0;
+ state->lineUserInput = p1;
+ state->lineStatus = p2;
}
-void AgiEngine::cmd_text_screen(uint8 *p) {
+void cmdTextScreen(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts, "switching to text mode");
- _game.gfxMode = false;
+ state->gfxMode = false;
// Simulates the "bright background bit" of the PC video
// controller.
- if (_game.colorBg)
- _game.colorBg |= 0x08;
+ if (state->colorBg)
+ state->colorBg |= 0x08;
- _gfx->clearScreen(_game.colorBg);
+ state->_vm->_gfx->clearScreen(state->colorBg);
}
-void AgiEngine::cmd_graphics(uint8 *p) {
+void cmdGraphics(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts, "switching to graphics mode");
- if (!_game.gfxMode) {
- _game.gfxMode = true;
- _gfx->clearScreen(0);
- _picture->showPic();
- writeStatus();
- writePrompt();
+ if (!state->gfxMode) {
+ state->gfxMode = true;
+ state->_vm->_gfx->clearScreen(0);
+ state->_vm->_picture->showPic();
+ state->_vm->writeStatus();
+ state->_vm->writePrompt();
}
}
-void AgiEngine::cmd_set_text_attribute(uint8 *p) {
- _game.colorFg = p0;
- _game.colorBg = p1;
+void cmdSetTextAttribute(AgiGame *state, uint8 *p) {
+ state->colorFg = p0;
+ state->colorBg = p1;
- if (_game.gfxMode) {
- if (_game.colorBg != 0) {
- _game.colorFg = 0;
- _game.colorBg = 15;
+ if (state->gfxMode) {
+ if (state->colorBg != 0) {
+ state->colorFg = 0;
+ state->colorBg = 15;
}
}
}
-void AgiEngine::cmd_status(uint8 *p) {
- inventory();
+void cmdStatus(AgiGame *state, uint8 *p) {
+ state->_vm->inventory();
}
-void AgiEngine::cmd_quit(uint8 *p) {
+void cmdQuit(AgiGame *state, uint8 *p) {
const char *buttons[] = { "Quit", "Continue", NULL };
- _sound->stopSound();
+ state->_vm->_sound->stopSound();
if (p0) {
- quitGame();
+ state->_vm->quitGame();
} else {
- if (selectionBox(" Quit the game, or continue? \n\n\n", buttons) == 0) {
- quitGame();
+ if (state->_vm->selectionBox(" Quit the game, or continue? \n\n\n", buttons) == 0) {
+ state->_vm->quitGame();
}
}
}
-void AgiEngine::cmd_restart_game(uint8 *p) {
+void cmdQuitV1(AgiGame *state, uint8 *p) {
+ state->_vm->_sound->stopSound();
+ state->_vm->quitGame();
+}
+
+void cmdRestartGame(AgiGame *state, uint8 *p) {
const char *buttons[] = { "Restart", "Continue", NULL };
int sel;
- _sound->stopSound();
+ state->_vm->_sound->stopSound();
sel = getflag(fAutoRestart) ? 0 :
- selectionBox(" Restart _game, or continue? \n\n\n", buttons);
+ state->_vm->selectionBox(" Restart game, or continue? \n\n\n", buttons);
if (sel == 0) {
- _restartGame = true;
+ state->_vm->_restartGame = true;
setflag(fRestartGame, true);
- _menu->enableAll();
+ state->_vm->_menu->enableAll();
}
}
-void AgiEngine::cmd_distance(uint8 *p) {
+void cmdDistance(AgiGame *state, uint8 *p) {
int16 x1, y1, x2, y2, d;
- VtEntry *v0 = &_game.viewTable[p0];
- VtEntry *v1 = &_game.viewTable[p1];
+ VtEntry *v0 = &state->viewTable[p0];
+ VtEntry *v1 = &state->viewTable[p1];
- if (v0->flags & DRAWN && v1->flags & DRAWN) {
+ if (v0->flags & fDrawn && v1->flags & fDrawn) {
x1 = v0->xPos + v0->xSize / 2;
y1 = v0->yPos;
x2 = v1->xPos + v1->xSize / 2;
@@ -1299,24 +1411,25 @@ void AgiEngine::cmd_distance(uint8 *p) {
_v[p2] = (unsigned char)d;
}
-void AgiEngine::cmd_accept_input(uint8 *p) {
+void cmdAcceptInput(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts | kDebugLevelInput, "input normal");
- newInputMode(INPUT_NORMAL);
- _game.inputEnabled = true;
- writePrompt();
+ state->_vm->newInputMode(INPUT_NORMAL);
+ state->inputEnabled = true;
+ state->_vm->writePrompt();
}
-void AgiEngine::cmd_prevent_input(uint8 *p) {
+void cmdPreventInput(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts | kDebugLevelInput, "no input");
- newInputMode(INPUT_NONE);
- _game.inputEnabled = false;
+ state->_vm->newInputMode(INPUT_NONE);
+ state->inputEnabled = false;
- clearPrompt();
+ // Always clear with black background. Fixes bug #3080041.
+ state->_vm->clearPrompt(true);
}
-void AgiEngine::cmd_get_string(uint8 *p) {
+void cmdGetString(AgiGame *state, uint8 *p) {
int tex, row, col;
debugC(4, kDebugLevelScripts, "%d %d %d %d %d", p0, p1, p2, p3, p4);
@@ -1332,100 +1445,107 @@ void AgiEngine::cmd_get_string(uint8 *p) {
if (col > 39)
col = 39;
- newInputMode(INPUT_GETSTRING);
+ state->_vm->newInputMode(INPUT_GETSTRING);
- if (_curLogic->texts != NULL && _curLogic->numTexts >= tex) {
- int len = strlen(_curLogic->texts[tex]);
+ if (state->_curLogic->texts != NULL && state->_curLogic->numTexts >= tex) {
+ int len = strlen(state->_curLogic->texts[tex]);
- printText(_curLogic->texts[tex], 0, col, row, len, _game.colorFg, _game.colorBg);
- getString(col + len - 1, row, p4, p0);
+ state->_vm->printText(state->_curLogic->texts[tex], 0, col, row, len, state->colorFg, state->colorBg);
+ state->_vm->getString(col + len - 1, row, p4, p0);
// SGEO: display input char
- _gfx->printCharacter((col + len), row, _game.cursorChar, _game.colorFg, _game.colorBg);
+ state->_vm->_gfx->printCharacter((col + len), row, state->cursorChar, state->colorFg, state->colorBg);
}
do {
- mainCycle();
- } while (_game.inputMode == INPUT_GETSTRING && !(shouldQuit() || _restartGame));
+ state->_vm->mainCycle();
+ } while (state->inputMode == INPUT_GETSTRING && !(state->_vm->shouldQuit() || state->_vm->_restartGame));
}
-void AgiEngine::cmd_get_num(uint8 *p) {
+void cmdGetNum(AgiGame *state, uint8 *p) {
debugC(4, kDebugLevelScripts, "%d %d", p0, p1);
- newInputMode(INPUT_GETSTRING);
+ state->_vm->newInputMode(INPUT_GETSTRING);
- if (_curLogic->texts != NULL && _curLogic->numTexts >= (p0 - 1)) {
- int len = strlen(_curLogic->texts[p0 - 1]);
+ if (state->_curLogic->texts != NULL && state->_curLogic->numTexts >= (p0 - 1)) {
+ int len = strlen(state->_curLogic->texts[p0 - 1]);
- printText(_curLogic->texts[p0 - 1], 0, 0, 22, len, _game.colorFg, _game.colorBg);
- getString(len - 1, 22, 3, MAX_STRINGS);
+ state->_vm->printText(state->_curLogic->texts[p0 - 1], 0, 0, 22, len, state->colorFg, state->colorBg);
+ state->_vm->getString(len - 1, 22, 3, MAX_STRINGS);
// CM: display input char
- _gfx->printCharacter((p3 + len), 22, _game.cursorChar, _game.colorFg, _game.colorBg);
+ state->_vm->_gfx->printCharacter((p3 + len), 22, state->cursorChar, state->colorFg, state->colorBg);
}
do {
- mainCycle();
- } while (_game.inputMode == INPUT_GETSTRING && !(shouldQuit() || _restartGame));
+ state->_vm->mainCycle();
+ } while (state->inputMode == INPUT_GETSTRING && !(state->_vm->shouldQuit() || state->_vm->_restartGame));
- _v[p1] = atoi(_game.strings[MAX_STRINGS]);
+ _v[p1] = atoi(state->strings[MAX_STRINGS]);
- debugC(4, kDebugLevelScripts, "[%s] -> %d", _game.strings[MAX_STRINGS], _v[p1]);
+ debugC(4, kDebugLevelScripts, "[%s] -> %d", state->strings[MAX_STRINGS], _v[p1]);
- clearLines(22, 22, _game.colorBg);
- flushLines(22, 22);
+ state->_vm->clearLines(22, 22, state->colorBg);
+ state->_vm->flushLines(22, 22);
}
-void AgiEngine::cmd_set_cursor_char(uint8 *p) {
- if (_curLogic->texts != NULL && (p0 - 1) <= _curLogic->numTexts) {
- _game.cursorChar = *_curLogic->texts[p0 - 1];
+void cmdSetCursorChar(AgiGame *state, uint8 *p) {
+ if (state->_curLogic->texts != NULL && (p0 - 1) <= state->_curLogic->numTexts) {
+ state->cursorChar = *state->_curLogic->texts[p0 - 1];
} else {
// default
- _game.cursorChar = '_';
+ state->cursorChar = '_';
}
}
-void AgiEngine::cmd_set_key(uint8 *p) {
- int key;
+void cmdSetKey(AgiGame *state, uint8 *p) {
+ int key = 256 * p1 + p0;
+ int slot = -1;
+
+ for (int i = 0; i < MAX_CONTROLLERS; i++) {
+ if (slot == -1 && !state->controllers[i].keycode)
+ slot = i;
+
+ if (state->controllers[i].keycode == key && state->controllers[i].controller == p2)
+ return;
+ }
- if (_game.lastController >= MAX_CONTROLLERS) {
+ if (slot == -1) {
warning("Number of set.keys exceeded %d", MAX_CONTROLLERS);
return;
}
- debugC(4, kDebugLevelScripts, "%d %d %d", p0, p1, p2);
+ debugC(4, kDebugLevelScripts, "cmdSetKey: %d %d %d", p0, p1, p2);
+ state->controllers[slot].keycode = key;
+ state->controllers[slot].controller = p2;
- key = 256 * p1 + p0;
-
- _game.controllers[_game.lastController].keycode = key;
- _game.controllers[_game.lastController].controller = p2;
- _game.lastController++;
-
- _game.controllerOccured[p2] = false;
+ state->controllerOccured[p2] = false;
}
-void AgiEngine::cmd_set_string(uint8 *p) {
+void cmdSetString(AgiGame *state, uint8 *p) {
// CM: to avoid crash in Groza (str = 150)
if (p0 > MAX_STRINGS)
return;
- strcpy(_game.strings[p0], _curLogic->texts[p1 - 1]);
+ strcpy(state->strings[p0], state->_curLogic->texts[p1 - 1]);
}
-void AgiEngine::cmd_display(uint8 *p) {
+void cmdDisplay(AgiGame *state, uint8 *p) {
+ // V1 has 4 args
+ int t = (getVersion() >= 0x2000 ? p2 : p3);
int len = 40;
- char *s = wordWrapString(_curLogic->texts[p2 - 1], &len);
+ char *s = state->_vm->wordWrapString(state->_curLogic->texts[t - 1], &len);
- printText(s, p1, 0, p0, 40, _game.colorFg, _game.colorBg);
+ state->_vm->printText(s, p1, 0, p0, 40, state->colorFg, state->colorBg);
free(s);
}
-void AgiEngine::cmd_display_f(uint8 *p) {
- printText(_curLogic->texts[_v[p2] - 1], _v[p1], 0, _v[p0], 40, _game.colorFg, _game.colorBg);
+void cmdDisplayF(AgiGame *state, uint8 *p) {
+ state->_vm->printText(state->_curLogic->texts[_v[p2] - 1], _v[p1], 0, _v[p0], 40, state->colorFg, state->colorBg);
}
-void AgiEngine::cmd_clear_text_rect(uint8 *p) {
+void cmdClearTextRect(AgiGame *state, uint8 *p) {
int c, x1, y1, x2, y2;
if ((c = p4) != 0)
@@ -1446,21 +1566,21 @@ void AgiEngine::cmd_clear_text_rect(uint8 *p) {
if (y2 > GFX_HEIGHT)
y2 = GFX_HEIGHT - 1;
- _gfx->drawRectangle(x1, y1, x2, y2, c);
- _gfx->flushBlock(x1, y1, x2, y2);
+ state->_vm->_gfx->drawRectangle(x1, y1, x2, y2, c);
+ state->_vm->_gfx->flushBlock(x1, y1, x2, y2);
}
-void AgiEngine::cmd_toggle_monitor(uint8 *p) {
+void cmdToggleMonitor(AgiGame *state, uint8 *p) {
debug(0, "toggle.monitor");
}
-void AgiEngine::cmd_echo_line(uint8 *p) {
- strcpy((char *)_game.inputBuffer, (const char *)_game.echoBuffer);
- _game.cursorPos = strlen((char *)_game.inputBuffer);
- _game.hasPrompt = 0;
+void cmdEchoLine(AgiGame *state, uint8 *p) {
+ strcpy((char *)state->inputBuffer, (const char *)state->echoBuffer);
+ state->cursorPos = strlen((char *)state->inputBuffer);
+ state->hasPrompt = 0;
}
-void AgiEngine::cmd_clear_lines(uint8 *p) {
+void cmdClearLines(AgiGame *state, uint8 *p) {
uint8 l;
// Residence 44 calls clear.lines(24,0,0), see Sarien bug #558423
@@ -1470,42 +1590,42 @@ void AgiEngine::cmd_clear_lines(uint8 *p) {
// #1935838 and #1935842
l = (l <= 24) ? l : 24;
- clearLines(p0, l, p2);
- flushLines(p0, l);
+ state->_vm->clearLines(p0, l, p2);
+ state->_vm->flushLines(p0, l);
}
-void AgiEngine::cmd_print(uint8 *p) {
+void cmdPrint(AgiGame *state, uint8 *p) {
int n = p0 < 1 ? 1 : p0;
- print(_curLogic->texts[n - 1], 0, 0, 0);
+ state->_vm->print(state->_curLogic->texts[n - 1], 0, 0, 0);
}
-void AgiEngine::cmd_print_f(uint8 *p) {
+void cmdPrintF(AgiGame *state, uint8 *p) {
int n = _v[p0] < 1 ? 1 : _v[p0];
- print(_curLogic->texts[n - 1], 0, 0, 0);
+ state->_vm->print(state->_curLogic->texts[n - 1], 0, 0, 0);
}
-void AgiEngine::cmd_print_at(uint8 *p) {
+void cmdPrintAt(AgiGame *state, uint8 *p) {
int n = p0 < 1 ? 1 : p0;
debugC(4, kDebugLevelScripts, "%d %d %d %d", p0, p1, p2, p3);
- print(_curLogic->texts[n - 1], p1, p2, p3);
+ state->_vm->print(state->_curLogic->texts[n - 1], p1, p2, p3);
}
-void AgiEngine::cmd_print_at_v(uint8 *p) {
+void cmdPrintAtV(AgiGame *state, uint8 *p) {
int n = _v[p0] < 1 ? 1 : _v[p0];
- print(_curLogic->texts[n - 1], p1, p2, p3);
+ state->_vm->print(state->_curLogic->texts[n - 1], p1, p2, p3);
}
-void AgiEngine::cmd_push_script(uint8 *p) {
+void cmdPushScript(AgiGame *state, uint8 *p) {
// We run AGIMOUSE always as a side effect
if (getFeatures() & GF_AGIMOUSE || true) {
- _game.vars[27] = _mouse.button;
- _game.vars[28] = _mouse.x / 2;
- _game.vars[29] = _mouse.y;
+ state->vars[27] = state->_vm->_mouse.button;
+ state->vars[28] = state->_vm->_mouse.x / 2;
+ state->vars[29] = state->_vm->_mouse.y;
} else {
if (getVersion() >= 0x2915) {
debug(0, "push.script");
@@ -1513,35 +1633,35 @@ void AgiEngine::cmd_push_script(uint8 *p) {
}
}
-void AgiEngine::cmd_set_pri_base(uint8 *p) {
+void cmdSetPriBase(AgiGame *state, uint8 *p) {
int i, x, pri;
debug(0, "Priority base set to %d", p0);
- // _game.alt_pri = true;
+ // state->alt_pri = true;
x = (_HEIGHT - p0) * _HEIGHT / 10;
for (i = 0; i < _HEIGHT; i++) {
pri = (i - p0) < 0 ? 4 : (i - p0) * _HEIGHT / x + 5;
if (pri > 15)
pri = 15;
- _game.priTable[i] = pri;
+ state->priTable[i] = pri;
}
}
-void AgiEngine::cmd_mouse_posn(uint8 *p) {
- _v[p0] = WIN_TO_PIC_X(_mouse.x);
- _v[p1] = WIN_TO_PIC_Y(_mouse.y);
+void cmdMousePosn(AgiGame *state, uint8 *p) {
+ _v[p0] = WIN_TO_PIC_X(state->_vm->_mouse.x);
+ _v[p1] = WIN_TO_PIC_Y(state->_vm->_mouse.y);
}
-void AgiEngine::cmd_shake_screen(uint8 *p) {
+void cmdShakeScreen(AgiGame *state, uint8 *p) {
int i;
// AGIPAL uses shake.screen values between 100 and 109 to set the palette
// (Checked the original AGIPAL-hack's shake.screen-routine's disassembly).
if (p0 >= 100 && p0 < 110) {
if (getFeatures() & GF_AGIPAL) {
- _gfx->setAGIPal(p0);
+ state->_vm->_gfx->setAGIPal(p0);
return;
} else {
warning("It looks like GF_AGIPAL flag is missing");
@@ -1550,212 +1670,60 @@ void AgiEngine::cmd_shake_screen(uint8 *p) {
// Disables input while shaking to prevent bug
// #1678230: AGI: Entering text while screen is shaking
- bool originalValue = _game.inputEnabled;
- _game.inputEnabled = false;
+ bool originalValue = state->inputEnabled;
+ state->inputEnabled = false;
- _gfx->shakeStart();
+ state->_vm->_gfx->shakeStart();
- _sprites->commitBoth(); // Fixes SQ1 demo
+ state->_vm->_sprites->commitBoth(); // Fixes SQ1 demo
for (i = 4 * p0; i; i--) {
- _gfx->shakeScreen(i & 1);
- _gfx->flushBlock(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1);
- mainCycle();
+ state->_vm->_gfx->shakeScreen(i & 1);
+ state->_vm->_gfx->flushBlock(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1);
+ state->_vm->mainCycle();
}
- _gfx->shakeEnd();
+ state->_vm->_gfx->shakeEnd();
// Sets input back to what it was
- _game.inputEnabled = originalValue;
-}
-
-void AgiEngine::setupOpcodes() {
- AgiCommand tmp[] = {
- NULL, // 0x00
- &AgiEngine::cmd_increment,
- &AgiEngine::cmd_decrement,
- &AgiEngine::cmd_assignn,
- &AgiEngine::cmd_assignv,
- &AgiEngine::cmd_addn,
- &AgiEngine::cmd_addv,
- &AgiEngine::cmd_subn,
- &AgiEngine::cmd_subv, // 0x08
- &AgiEngine::cmd_lindirectv,
- &AgiEngine::cmd_rindirect,
- &AgiEngine::cmd_lindirectn,
- &AgiEngine::cmd_set,
- &AgiEngine::cmd_reset,
- &AgiEngine::cmd_toggle,
- &AgiEngine::cmd_set_v,
- &AgiEngine::cmd_reset_v, // 0x10
- &AgiEngine::cmd_toggle_v,
- &AgiEngine::cmd_new_room,
- &AgiEngine::cmd_new_room_f,
- &AgiEngine::cmd_load_logic,
- &AgiEngine::cmd_load_logic_f,
- &AgiEngine::cmd_call,
- &AgiEngine::cmd_call_f,
- &AgiEngine::cmd_load_pic, // 0x18
- &AgiEngine::cmd_draw_pic,
- &AgiEngine::cmd_show_pic,
- &AgiEngine::cmd_discard_pic,
- &AgiEngine::cmd_overlay_pic,
- &AgiEngine::cmd_show_pri_screen,
- &AgiEngine::cmd_load_view,
- &AgiEngine::cmd_load_view_f,
- &AgiEngine::cmd_discard_view, // 0x20
- &AgiEngine::cmd_animate_obj,
- &AgiEngine::cmd_unanimate_all,
- &AgiEngine::cmd_draw,
- &AgiEngine::cmd_erase,
- &AgiEngine::cmd_position,
- &AgiEngine::cmd_position_f,
- &AgiEngine::cmd_get_posn,
- &AgiEngine::cmd_reposition, // 0x28
- &AgiEngine::cmd_set_view,
- &AgiEngine::cmd_set_view_f,
- &AgiEngine::cmd_set_loop,
- &AgiEngine::cmd_set_loop_f,
- &AgiEngine::cmd_fix_loop,
- &AgiEngine::cmd_release_loop,
- &AgiEngine::cmd_set_cel,
- &AgiEngine::cmd_set_cel_f, // 0x30
- &AgiEngine::cmd_last_cel,
- &AgiEngine::cmd_current_cel,
- &AgiEngine::cmd_current_loop,
- &AgiEngine::cmd_current_view,
- &AgiEngine::cmd_number_of_loops,
- &AgiEngine::cmd_set_priority,
- &AgiEngine::cmd_set_priority_f,
- &AgiEngine::cmd_release_priority, // 0x38
- &AgiEngine::cmd_get_priority,
- &AgiEngine::cmd_stop_update,
- &AgiEngine::cmd_start_update,
- &AgiEngine::cmd_force_update,
- &AgiEngine::cmd_ignore_horizon,
- &AgiEngine::cmd_observe_horizon,
- &AgiEngine::cmd_set_horizon,
- &AgiEngine::cmd_object_on_water, // 0x40
- &AgiEngine::cmd_object_on_land,
- &AgiEngine::cmd_object_on_anything,
- &AgiEngine::cmd_ignore_objs,
- &AgiEngine::cmd_observe_objs,
- &AgiEngine::cmd_distance,
- &AgiEngine::cmd_stop_cycling,
- &AgiEngine::cmd_start_cycling,
- &AgiEngine::cmd_normal_cycle, // 0x48
- &AgiEngine::cmd_end_of_loop,
- &AgiEngine::cmd_reverse_cycle,
- &AgiEngine::cmd_reverse_loop,
- &AgiEngine::cmd_cycle_time,
- &AgiEngine::cmd_stop_motion,
- &AgiEngine::cmd_start_motion,
- &AgiEngine::cmd_step_size,
- &AgiEngine::cmd_step_time, // 0x50
- &AgiEngine::cmd_move_obj,
- &AgiEngine::cmd_move_obj_f,
- &AgiEngine::cmd_follow_ego,
- &AgiEngine::cmd_wander,
- &AgiEngine::cmd_normal_motion,
- &AgiEngine::cmd_set_dir,
- &AgiEngine::cmd_get_dir,
- &AgiEngine::cmd_ignore_blocks, // 0x58
- &AgiEngine::cmd_observe_blocks,
- &AgiEngine::cmd_block,
- &AgiEngine::cmd_unblock,
- &AgiEngine::cmd_get,
- &AgiEngine::cmd_get_f,
- &AgiEngine::cmd_drop,
- &AgiEngine::cmd_put,
- &AgiEngine::cmd_put_f, // 0x60
- &AgiEngine::cmd_get_room_f,
- &AgiEngine::cmd_load_sound,
- &AgiEngine::cmd_sound,
- &AgiEngine::cmd_stop_sound,
- &AgiEngine::cmd_print,
- &AgiEngine::cmd_print_f,
- &AgiEngine::cmd_display,
- &AgiEngine::cmd_display_f, // 0x68
- &AgiEngine::cmd_clear_lines,
- &AgiEngine::cmd_text_screen,
- &AgiEngine::cmd_graphics,
- &AgiEngine::cmd_set_cursor_char,
- &AgiEngine::cmd_set_text_attribute,
- &AgiEngine::cmd_shake_screen,
- &AgiEngine::cmd_configure_screen,
- &AgiEngine::cmd_status_line_on, // 0x70
- &AgiEngine::cmd_status_line_off,
- &AgiEngine::cmd_set_string,
- &AgiEngine::cmd_get_string,
- &AgiEngine::cmd_word_to_string,
- &AgiEngine::cmd_parse,
- &AgiEngine::cmd_get_num,
- &AgiEngine::cmd_prevent_input,
- &AgiEngine::cmd_accept_input, // 0x78
- &AgiEngine::cmd_set_key,
- &AgiEngine::cmd_add_to_pic,
- &AgiEngine::cmd_add_to_pic_f,
- &AgiEngine::cmd_status,
- &AgiEngine::cmd_save_game,
- &AgiEngine::cmd_load_game,
- &AgiEngine::cmd_init_disk,
- &AgiEngine::cmd_restart_game, // 0x80
- &AgiEngine::cmd_show_obj,
- &AgiEngine::cmd_random,
- &AgiEngine::cmd_program_control,
- &AgiEngine::cmd_player_control,
- &AgiEngine::cmd_obj_status_f,
- &AgiEngine::cmd_quit,
- &AgiEngine::cmd_show_mem,
- &AgiEngine::cmd_pause, // 0x88
- &AgiEngine::cmd_echo_line,
- &AgiEngine::cmd_cancel_line,
- &AgiEngine::cmd_init_joy,
- &AgiEngine::cmd_toggle_monitor,
- &AgiEngine::cmd_version,
- &AgiEngine::cmd_script_size,
- &AgiEngine::cmd_set_game_id,
- &AgiEngine::cmd_log, // 0x90
- &AgiEngine::cmd_set_scan_start,
- &AgiEngine::cmd_reset_scan_start,
- &AgiEngine::cmd_reposition_to,
- &AgiEngine::cmd_reposition_to_f,
- &AgiEngine::cmd_trace_on,
- &AgiEngine::cmd_trace_info,
- &AgiEngine::cmd_print_at,
- &AgiEngine::cmd_print_at_v, // 0x98
- &AgiEngine::cmd_discard_view, // Opcode repeated from 0x20 ?
- &AgiEngine::cmd_clear_text_rect,
- &AgiEngine::cmd_set_upper_left,
- &AgiEngine::cmd_set_menu,
- &AgiEngine::cmd_set_menu_item,
- &AgiEngine::cmd_submit_menu,
- &AgiEngine::cmd_enable_item,
- &AgiEngine::cmd_disable_item, // 0xa0
- &AgiEngine::cmd_menu_input,
- &AgiEngine::cmd_show_obj_v,
- &AgiEngine::cmd_open_dialogue,
- &AgiEngine::cmd_close_dialogue,
- &AgiEngine::cmd_mul_n,
- &AgiEngine::cmd_mul_v,
- &AgiEngine::cmd_div_n,
- &AgiEngine::cmd_div_v, // 0xa8
- &AgiEngine::cmd_close_window,
- &AgiEngine::cmd_set_simple,
- &AgiEngine::cmd_push_script,
- &AgiEngine::cmd_pop_script,
- &AgiEngine::cmd_hold_key,
- &AgiEngine::cmd_set_pri_base,
- &AgiEngine::cmd_discard_sound,
- &AgiEngine::cmd_hide_mouse, // 0xb0
- &AgiEngine::cmd_allow_menu,
- &AgiEngine::cmd_show_mouse,
- &AgiEngine::cmd_fence_mouse,
- &AgiEngine::cmd_mouse_posn,
- &AgiEngine::cmd_release_key,
- &AgiEngine::cmd_adj_ego_move_to_x_y
- };
- assert(ARRAYSIZE(_agiCommands) == ARRAYSIZE(tmp));
- for (int i = 0; i < ARRAYSIZE(tmp); ++i)
- _agiCommands[i] = tmp[i];
+ state->inputEnabled = originalValue;
+}
+
+void cmdSetSpeed(AgiGame *state, uint8 *p) {
+ // V1 command
+ (void)state;
+ (void)p;
+ // speed = _v[p0];
+}
+
+void cmdSetItemView(AgiGame *state, uint8 *p) {
+ // V1 command
+ (void)state;
+ (void)p;
+}
+
+void cmdCallV1(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rLOGIC, p0);
+ state->logic_list[++state->max_logics];
+ _v[13] = 1;
+}
+
+void cmdNewRoomV1(AgiGame *state, uint8 *p) {
+ warning("cmdNewRoomV1()");
+ state->_vm->agiLoadResource(rLOGIC, p0);
+ state->max_logics = 1;
+ state->logic_list[1] = p0;
+ _v[13] = 1;
+}
+
+void cmdNewRoomVV1(AgiGame *state, uint8 *p) {
+ warning("cmdNewRoomVV1()");
+ state->_vm->agiLoadResource(rLOGIC, _v[p0]);
+ state->max_logics = 1;
+ state->logic_list[1] = _v[p0];
+ _v[13] = 1;
+}
+
+void cmdUnknown(AgiGame *state, uint8 *p) {
+ warning("Skipping unknown opcode %2X", *(code + ip - 1));
}
/**
@@ -1763,11 +1731,15 @@ void AgiEngine::setupOpcodes() {
* @param n Number of the logic resource to execute
*/
int AgiEngine::runLogic(int n) {
+ AgiGame *state = &_game;
uint8 op = 0;
uint8 p[CMD_BSIZE] = { 0 };
- uint8 *code = NULL;
int num = 0;
ScriptPos sp;
+ //int logic_index = 0;
+
+ state->logic_list[0] = 0;
+ state->max_logics = 0;
debugC(2, kDebugLevelScripts, "=================");
debugC(2, kDebugLevelScripts, "runLogic(%d)", n);
@@ -1783,10 +1755,9 @@ int AgiEngine::runLogic(int n) {
}
_game.lognum = n;
- _curLogic = &_game.logics[_game.lognum];
+ _game._curLogic = &_game.logics[_game.lognum];
- code = _curLogic->data;
- _curLogic->cIP = _curLogic->sIP;
+ _game._curLogic->cIP = _game._curLogic->sIP;
_timerHack = 0;
while (ip < _game.logics[n].size && !(shouldQuit() || _restartGame)) {
@@ -1833,19 +1804,39 @@ int AgiEngine::runLogic(int n) {
debugC(2, kDebugLevelScripts, "%sreturn() // Logic %d", st, n);
debugC(2, kDebugLevelScripts, "=================");
+// if (getVersion() < 0x2000) {
+// if (logic_index < state->max_logics) {
+// n = state->logic_list[++logic_index];
+// state->_curLogic = &state->logics[n];
+// state->lognum = n;
+// ip = 2;
+// warning("running logic %d\n", n);
+// break;
+// }
+// _v[13]=0;
+// }
+
_game.execStack.pop_back();
return 1;
default:
- num = logicNamesCmd[op].numArgs;
+ num = logicNamesCmd[op].argumentsLength();
memmove(p, code + ip, num);
memset(p + num, 0, CMD_BSIZE - num);
debugC(2, kDebugLevelScripts, "%s%s(%d %d %d)", st, logicNamesCmd[op].name, p[0], p[1], p[2]);
- (this->*_agiCommands[op])(p);
+ _agiCommands[op](&_game, p);
ip += num;
}
+// if ((op == 0x0B || op == 0x3F || op == 0x40) && logic_index < state->max_logics) {
+// n = state->logic_list[++logic_index];
+// state->_curLogic = &state->logics[n];
+// state->lognum = n;
+// ip = 2;
+// warning("running logic %d\n", n);
+// }
+
if (_game.exitAllLogics)
break;
}
@@ -1858,7 +1849,7 @@ int AgiEngine::runLogic(int n) {
void AgiEngine::executeAgiCommand(uint8 op, uint8 *p) {
debugC(2, kDebugLevelScripts, "%s(%d %d %d)", logicNamesCmd[op].name, p[0], p[1], p[2]);
- (this->*_agiCommands[op])(p);
+ _agiCommands[op](&_game, p);
}
} // End of namespace Agi
diff --git a/engines/agi/op_dbg.cpp b/engines/agi/op_dbg.cpp
index be73dbefae..87e235cf17 100644
--- a/engines/agi/op_dbg.cpp
+++ b/engines/agi/op_dbg.cpp
@@ -28,248 +28,17 @@ namespace Agi {
#define ip (_game.logics[lognum].cIP)
#define code (_game.logics[lognum].data)
-#ifdef _L
-#undef _L
-#endif
-
-#define _L(a,b,c) { a, b, c }
-
-struct AgiLogicnames logicNamesTest[] = {
- _L("", 0, 0x00),
- _L("equaln", 2, 0x80),
- _L("equalv", 2, 0xC0),
- _L("lessn", 2, 0x80),
- _L("lessv", 2, 0xC0),
- _L("greatern", 2, 0x80),
- _L("greaterv", 2, 0xC0),
- _L("isset", 1, 0x00),
- _L("issetv", 1, 0x80),
- _L("has", 1, 0x00),
- _L("obj.in.room", 2, 0x40),
- _L("posn", 5, 0x00),
- _L("controller", 1, 0x00),
- _L("have.key", 0, 0x00),
-
- // Not 0 args. Has variable number.
- _L("said", 0, 0x00),
-
- _L("compare.strings", 2, 0x00),
- _L("obj.in.box", 5, 0x00),
- _L("center.posn", 5, 0x00),
- _L("right.posn", 5, 0x00),
-
- // Haven't seen an official name for this command so tried to name it descriptively.
- _L("in.motion.using.mouse", 0, 0x00)
-};
-
-struct AgiLogicnames logicNamesIf[] = {
- _L("OR", 0, 0x00),
- _L("NOT", 0, 0x00),
- _L("ELSE", 0, 0x00),
- _L("IF", 0, 0x00)
-};
-
-struct AgiLogicnames logicNamesCmd[] = {
- _L("return", 0, 0x00), // 00
- _L("increment", 1, 0x80), // 01
- _L("decrement", 1, 0x80), // 02
- _L("assignn", 2, 0x80), // 03
- _L("assignv", 2, 0xC0), // 04
- _L("addn", 2, 0x80), // 05
- _L("addv", 2, 0xC0), // 06
- _L("subn", 2, 0x80), // 07
- _L("subv", 2, 0xC0), // 08
- _L("lindirectv", 2, 0xC0), // 09
- _L("rindirect", 2, 0xC0), // 0A
- _L("lindirectn", 2, 0x80), // 0B
- _L("set", 1, 0x00), // 0C
- _L("reset", 1, 0x00), // 0D
- _L("toggle", 1, 0x00), // 0E
- _L("set.v", 1, 0x80), // 0F
- _L("reset.v", 1, 0x80), // 10
- _L("toggle.v", 1, 0x80), // 11
- _L("new.room", 1, 0x00), // 12
- _L("new.room.v", 1, 0x80), // 13
- _L("load.logics", 1, 0x00), // 14
- _L("load.logics.v", 1, 0x80), // 15
- _L("call", 1, 0x00), // 16
- _L("call.v", 1, 0x80), // 17
- _L("load.pic", 1, 0x80), // 18
- _L("draw.pic", 1, 0x80), // 19
- _L("show.pic", 0, 0x00), // 1A
- _L("discard.pic", 1, 0x80), // 1B
- _L("overlay.pic", 1, 0x80), // 1C
- _L("show.pri.screen", 0, 0x00), // 1D
- _L("load.view", 1, 0x00), // 1E
- _L("load.view.v", 1, 0x80), // 1F
- _L("discard.view", 1, 0x00), // 20
- _L("animate.obj", 1, 0x00), // 21
- _L("unanimate.all", 0, 0x00), // 22
- _L("draw", 1, 0x00), // 23
- _L("erase", 1, 0x00), // 24
- _L("position", 3, 0x00), // 25
- _L("position.v", 3, 0x60), // 26
- _L("get.posn", 3, 0x60), // 27
- _L("reposition", 3, 0x60), // 28
- _L("set.view", 2, 0x00), // 29
- _L("set.view.v", 2, 0x40), // 2A
- _L("set.loop", 2, 0x00), // 2B
- _L("set.loop.v", 2, 0x40), // 2C
- _L("fix.loop", 1, 0x00), // 2D
- _L("release.loop", 1, 0x00), // 2E
- _L("set.cel", 2, 0x00), // 2F
- _L("set.cel.v", 2, 0x40), // 30
- _L("last.cel", 2, 0x40), // 31
- _L("current.cel", 2, 0x40), // 32
- _L("current.loop", 2, 0x40), // 33
- _L("current.view", 2, 0x40), // 34
- _L("number.of.loops", 2, 0x40), // 35
- _L("set.priority", 2, 0x00), // 36
- _L("set.priority.v", 2, 0x40), // 37
- _L("release.priority", 1, 0x00), // 38
- _L("get.priority", 2, 0x40), // 39
- _L("stop.update", 1, 0x00), // 3A
- _L("start.update", 1, 0x00), // 3B
- _L("force.update", 1, 0x00), // 3C
- _L("ignore.horizon", 1, 0x00), // 3D
- _L("observe.horizon", 1, 0x00), // 3E
- _L("set.horizon", 1, 0x00), // 3F
- _L("object.on.water", 1, 0x00), // 40
- _L("object.on.land", 1, 0x00), // 41
- _L("object.on.anything", 1, 0x00), // 42
- _L("ignore.objs", 1, 0x00), // 43
- _L("observe.objs", 1, 0x00), // 44
- _L("distance", 3, 0x20), // 45
- _L("stop.cycling", 1, 0x00), // 46
- _L("start.cycling", 1, 0x00), // 47
- _L("normal.cycle", 1, 0x00), // 48
- _L("end.of.loop", 2, 0x00), // 49
- _L("reverse.cycle", 1, 0x00), // 4A
- _L("reverse.loop", 2, 0x00), // 4B
- _L("cycle.time", 2, 0x40), // 4C
- _L("stop.motion", 1, 0x00), // 4D
- _L("start.motion", 1, 0x00), // 4E
- _L("step.size", 2, 0x40), // 4F
- _L("step.time", 2, 0x40), // 50
- _L("move.obj", 5, 0x00), // 51
- _L("move.obj.v", 5, 0x70), // 52
- _L("follow.ego", 3, 0x00), // 53
- _L("wander", 1, 0x00), // 54
- _L("normal.motion", 1, 0x00), // 55
- _L("set.dir", 2, 0x40), // 56
- _L("get.dir", 2, 0x40), // 57
- _L("ignore.blocks", 1, 0x00), // 58
- _L("observe.blocks", 1, 0x00), // 59
- _L("block", 4, 0x00), // 5A
- _L("unblock", 0, 0x00), // 5B
- _L("get", 1, 0x00), // 5C
- _L("get.v", 1, 0x80), // 5D
- _L("drop", 1, 0x00), // 5E
- _L("put", 2, 0x00), // 5F
- _L("put.v", 2, 0x40), // 60
- _L("get.room.v", 2, 0xC0), // 61
- _L("load.sound", 1, 0x00), // 62
- _L("sound", 2, 0x00), // 63
- _L("stop.sound", 0, 0x00), // 64
- _L("print", 1, 0x00), // 65
- _L("print.v", 1, 0x80), // 66
- _L("display", 3, 0x00), // 67
- _L("display.v", 3, 0xE0), // 68
- _L("clear.lines", 3, 0x00), // 69
- _L("text.screen", 0, 0x00), // 6A
- _L("graphics", 0, 0x00), // 6B
- _L("set.cursor.char", 1, 0x00), // 6C
- _L("set.text.attribute", 2, 0x00), // 6D
- _L("shake.screen", 1, 0x00), // 6E
- _L("configure.screen", 3, 0x00), // 6F
- _L("status.line.on", 0, 0x00), // 70
- _L("status.line.off", 0, 0x00), // 71
- _L("set.string", 2, 0x00), // 72
- _L("get.string", 5, 0x00), // 73
- _L("word.to.string", 2, 0x00), // 74
- _L("parse", 1, 0x00), // 75
- _L("get.num", 2, 0x40), // 76
- _L("prevent.input", 0, 0x00), // 77
- _L("accept.input", 0, 0x00), // 78
- _L("set.key", 3, 0x00), // 79
- _L("add.to.pic", 7, 0x00), // 7A
- _L("add.to.pic.v", 7, 0xFE), // 7B
- _L("status", 0, 0x00), // 7C
- _L("save.game", 0, 0x00), // 7D
- _L("restore.game", 0, 0x00), // 7E
- _L("init.disk", 0, 0x00), // 7F
- _L("restart.game", 0, 0x00), // 80
- _L("show.obj", 1, 0x00), // 81
- _L("random", 3, 0x20), // 82
- _L("program.control", 0, 0x00), // 83
- _L("player.control", 0, 0x00), // 84
- _L("obj.status.v", 1, 0x80), // 85
- // 0 args for AGI version 2.089
- _L("quit", 1, 0x00), // 86
-
- _L("show.mem", 0, 0x00), // 87
- _L("pause", 0, 0x00), // 88
- _L("echo.line", 0, 0x00), // 89
- _L("cancel.line", 0, 0x00), // 8A
- _L("init.joy", 0, 0x00), // 8B
- _L("toggle.monitor", 0, 0x00), // 8C
- _L("version", 0, 0x00), // 8D
- _L("script.size", 1, 0x00), // 8E
- _L("set.game.id", 1, 0x00), // 8F
- _L("log", 1, 0x00), // 90
- _L("set.scan.start", 0, 0x00), // 91
- _L("reset.scan.start", 0, 0x00), // 92
- _L("reposition.to", 3, 0x00), // 93
- _L("reposition.to.v", 3, 0x60), // 94
- _L("trace.on", 0, 0x00), // 95
- _L("trace.info", 3, 0x00), // 96
-
- // 3 args for AGI versions before 2.440
- _L("print.at", 4, 0x00), // 97
- _L("print.at.v", 4, 0x80), // 98
-
- _L("discard.view.v", 1, 0x80), // 99
- _L("clear.text.rect", 5, 0x00), // 9A
- _L("set.upper.left", 2, 0x00), // 9B
- _L("set.menu", 1, 0x00), // 9C
- _L("set.menu.item", 2, 0x00), // 9D
- _L("submit.menu", 0, 0x00), // 9E
- _L("enable.item", 1, 0x00), // 9F
- _L("disable.item", 1, 0x00), // A0
- _L("menu.input", 0, 0x00), // A1
- _L("show.obj.v", 1, 0x01), // A2
- _L("open.dialogue", 0, 0x00), // A3
- _L("close.dialogue", 0, 0x00), // A4
- _L("mul.n", 2, 0x80), // A5
- _L("mul.v", 2, 0xC0), // A6
- _L("div.n", 2, 0x80), // A7
- _L("div.v", 2, 0xC0), // A8
- _L("close.window", 0, 0x00), // A9
-
- _L("set.simple", 1, 0x00), // AA
- _L("push.script", 0, 0x00), // AB
- _L("pop.script", 0, 0x00), // AC
- _L("hold.key", 0, 0x00), // AD
- _L("set.pri.base", 1, 0x00), // AE
- _L("discard.sound", 1, 0x00), // AF
-
- // 1 arg for AGI version 3.002.086
- _L("hide.mouse", 0, 0x00), // B0
-
- _L("allow.menu", 1, 0x00), // B1
- _L("show.mouse", 0, 0x00), // B2
- _L("fence.mouse", 4, 0x00), // B3
- _L("mouse.posn", 2, 0x00), // B4
- _L("release.key", 0, 0x00), // B5
-
- // 2 args for at least the Amiga Gold Rush! (v2.05 1989-03-09) using Amiga AGI 2.316.
- _L("adj.ego.move.to.xy", 0, 0x00), // B6
- _L(NULL, 0, 0x00)
+AgiInstruction logicNamesIf[] = {
+ { "OR", "", NULL },
+ { "NOT", "", NULL },
+ { "ELSE", "", NULL },
+ { "IF", "", NULL }
};
void AgiEngine::debugConsole(int lognum, int mode, const char *str) {
- AgiLogicnames *x;
- uint8 a, c, z;
+ AgiInstruction *x;
+ uint8 a, z;
+ const char *c;
if (str) {
debug(0, " %s", str);
@@ -302,8 +71,8 @@ void AgiEngine::debugConsole(int lognum, int mode, const char *str) {
break;
default:
x = mode == lCOMMAND_MODE ? logicNamesCmd : logicNamesTest;
- a = (unsigned char)(x + *(code + ip))->numArgs;
- c = (unsigned char)(x + *(code + ip))->argMask;
+ a = x[*(code + ip)].argumentsLength();
+ c = x[*(code + ip)].args;
if (_debug.opcodes) {
debugN(0, "%02X %02X %02X %02X %02X %02X %02X %02X %02X\n"
@@ -321,12 +90,12 @@ void AgiEngine::debugConsole(int lognum, int mode, const char *str) {
debugN(0, "%s ", (x + *(code + ip))->name);
for (z = 1; a > 0;) {
- if (~c & 0x80) {
+ if (*c == 'n') {
debugN(0, "%d", *(code + (ip + z)));
} else {
debugN(0, "v%d[%d]", *(code + (ip + z)), getvar(*(code + (ip + z))));
}
- c <<= 1;
+ c++;
z++;
if (--a > 0)
debugN(0, ",");
diff --git a/engines/agi/op_test.cpp b/engines/agi/op_test.cpp
index 0660a614b6..a44c68e0fc 100644
--- a/engines/agi/op_test.cpp
+++ b/engines/agi/op_test.cpp
@@ -23,18 +23,180 @@
#include "agi/agi.h"
#include "agi/opcodes.h"
+#include "common/endian.h"
namespace Agi {
-#define ip (_game.logics[lognum].cIP)
-#define code (_game.logics[lognum].data)
+#define ip (state->_curLogic->cIP)
+#define code (state->_curLogic->data)
+
+#define getvar(a) state->_vm->getvar(a)
+#define getflag(a) state->_vm->getflag(a)
#define testEqual(v1, v2) (getvar(v1) == (v2))
#define testLess(v1, v2) (getvar(v1) < (v2))
#define testGreater(v1, v2) (getvar(v1) > (v2))
#define testIsSet(flag) (getflag(flag))
-#define testHas(obj) (objectGetLocation(obj) == EGO_OWNED)
-#define testObjInRoom(obj, v) (objectGetLocation(obj) == getvar(v))
+#define testHas(obj) (state->_vm->objectGetLocation(obj) == EGO_OWNED)
+#define testHasV1(obj) (state->_vm->objectGetLocation(obj) == EGO_OWNED_V1)
+#define testObjInRoom(obj, v) (state->_vm->objectGetLocation(obj) == getvar(v))
+
+void condEqual(AgiGame *state, uint8 *p) {
+ if (p[0] == 11)
+ state->_vm->_timerHack++;
+ state->testResult = testEqual(p[0], p[1]);
+}
+
+void condEqualV(AgiGame *state, uint8 *p) {
+ if (p[0] == 11 || p[1] == 11)
+ state->_vm->_timerHack++;
+ state->testResult = testEqual(p[0], getvar(p[1]));
+}
+
+void condLess(AgiGame *state, uint8 *p) {
+ if (p[0] == 11)
+ state->_vm->_timerHack++;
+ state->testResult = testLess(p[0], p[1]);
+}
+
+void condLessV(AgiGame *state, uint8 *p) {
+ if (p[0] == 11 || p[1] == 11)
+ state->_vm->_timerHack++;
+ state->testResult = testLess(p[0], getvar(p[1]));
+}
+
+void condGreater(AgiGame *state, uint8 *p) {
+ if (p[0] == 11)
+ state->_vm->_timerHack++;
+ state->testResult = testGreater(p[0], p[1]);
+}
+
+void condGreaterV(AgiGame *state, uint8 *p) {
+ if (p[0] == 11 || p[1] == 11)
+ state->_vm->_timerHack++;
+ state->testResult = testGreater(p[0], getvar(p[1]));
+}
+
+void condIsSet(AgiGame *state, uint8 *p) {
+ state->testResult = testIsSet(p[0]);
+}
+
+void condIsSetV(AgiGame *state, uint8 *p) {
+ state->testResult = testIsSet(getvar(p[1]));
+}
+
+void condIsSetV1(AgiGame *state, uint8 *p) {
+ state->testResult = getvar(p[0]) > 0;
+}
+
+void condHas(AgiGame *state, uint8 *p) {
+ state->testResult = testHas(p[0]);
+}
+
+void condHasV1(AgiGame *state, uint8 *p) {
+ state->testResult = testHasV1(p[0]);
+}
+
+void condObjInRoom(AgiGame *state, uint8 *p) {
+ state->testResult = testObjInRoom(p[0], p[1]);
+}
+
+void condPosn(AgiGame *state, uint8 *p) {
+ state->testResult = state->_vm->testPosn(p[0], p[1], p[2], p[3], p[4]);
+}
+
+void condController(AgiGame *state, uint8 *p) {
+ state->testResult = state->_vm->testController(p[0]);
+}
+
+void condHaveKey(AgiGame *state, uint8 *p) {
+ state->testResult = state->_vm->testKeypressed();
+}
+
+void condSaid(AgiGame *state, uint8 *p) {
+ int ec = state->_vm->testSaid(p[0], p + 1);
+ state->testResult = ec;
+}
+
+void condSaid1(AgiGame *state, uint8 *p) {
+ state->testResult = false;
+
+ if (!getflag(fEnteredCli))
+ return;
+
+ int id0 = READ_LE_UINT16(p);
+
+ if ((id0 == 1 || id0 == state->egoWords[0].id))
+ state->testResult = true;
+}
+
+void condSaid2(AgiGame *state, uint8 *p) {
+ state->testResult = false;
+
+ if (!getflag(fEnteredCli))
+ return;
+
+ int id0 = READ_LE_UINT16(p);
+ int id1 = READ_LE_UINT16(p + 2);
+
+ if ((id0 == 1 || id0 == state->egoWords[0].id) &&
+ (id1 == 1 || id1 == state->egoWords[1].id))
+ state->testResult = true;
+}
+
+void condSaid3(AgiGame *state, uint8 *p) {
+ state->testResult = false;
+
+ if (!getflag(fEnteredCli))
+ return;
+
+ int id0 = READ_LE_UINT16(p);
+ int id1 = READ_LE_UINT16(p + 2);
+ int id2 = READ_LE_UINT16(p + 4);
+
+ if ((id0 == 1 || id0 == state->egoWords[0].id) &&
+ (id1 == 1 || id1 == state->egoWords[1].id) &&
+ (id2 == 1 || id2 == state->egoWords[2].id))
+ state->testResult = true;
+}
+
+void condBit(AgiGame *state, uint8 *p) {
+ state->testResult = (getvar(p[1]) >> p[0]) & 1;
+}
+
+void condCompareStrings(AgiGame *state, uint8 *p) {
+ debugC(7, kDebugLevelScripts, "comparing [%s], [%s]", state->strings[p[0]], state->strings[p[1]]);
+ state->testResult = state->_vm->testCompareStrings(p[0], p[1]);
+}
+
+void condObjInBox(AgiGame *state, uint8 *p) {
+ state->testResult = state->_vm->testObjInBox(p[0], p[1], p[2], p[3], p[4]);
+}
+
+void condCenterPosn(AgiGame *state, uint8 *p) {
+ state->testResult = state->_vm->testObjCenter(p[0], p[1], p[2], p[3], p[4]);
+}
+
+void condRightPosn(AgiGame *state, uint8 *p) {
+ state->testResult = state->_vm->testObjRight(p[0], p[1], p[2], p[3], p[4]);
+}
+
+void condUnknown13(AgiGame *state, uint8 *p) {
+ // My current theory is that this command checks whether the ego is currently moving
+ // and that that movement has been caused using the mouse and not using the keyboard.
+ // I base this theory on the game's behavior on an Amiga emulator, not on disassembly.
+ // This command is used at least in the Amiga version of Gold Rush! v2.05 1989-03-09
+ // (AGI 2.316) in logics 1, 3, 5, 6, 137 and 192 (Logic.192 revealed this command's nature).
+ // TODO: Check this command's implementation using disassembly just to be sure.
+ int ec = state->viewTable[0].flags & fAdjEgoXY;
+ debugC(7, kDebugLevelScripts, "op_test: in.motion.using.mouse = %s (Amiga-specific testcase 19)", ec ? "true" : "false");
+ state->testResult = ec;
+}
+
+void condUnknown(AgiGame *state, uint8 *p) {
+ warning("Skipping unknown test command %2X", *(code + ip - 1));
+ state->testResult = false;
+}
uint8 AgiEngine::testCompareStrings(uint8 s1, uint8 s2) {
char ms1[MAX_STRINGLEN];
@@ -147,6 +309,7 @@ uint8 AgiEngine::testObjRight(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
// When player has entered something, it is parsed elsewhere
uint8 AgiEngine::testSaid(uint8 nwords, uint8 *cc) {
+ AgiGame *state = &_game;
int c, n = _game.numEgoWords;
int z = 0;
@@ -202,210 +365,110 @@ uint8 AgiEngine::testSaid(uint8 nwords, uint8 *cc) {
}
int AgiEngine::testIfCode(int lognum) {
- int ec = true;
- int retval = true;
- uint8 op = 0;
- uint8 notTest = false;
- uint8 orTest = false;
- uint16 lastIp = ip;
- uint8 p[16] = { 0 };
- bool end_test = false;
-
- while (retval && !(shouldQuit() || _restartGame) && !end_test) {
+ AgiGame *state = &_game;
+ uint8 op;
+ uint8 p[16];
+
+ int notMode = false;
+ int orMode = false;
+ int endTest = false;
+ int result = true;
+
+ while (!(shouldQuit() || _restartGame) && !endTest) {
if (_debug.enabled && (_debug.logic0 || lognum))
debugConsole(lognum, lTEST_MODE, NULL);
- lastIp = ip;
op = *(code + ip++);
memmove(p, (code + ip), 16);
switch (op) {
- case 0xFF: // END IF, TEST true
- end_test = true;
- break;
- case 0xFD:
- notTest = !notTest;
- continue;
- case 0xFC: // OR
- // if or_test is ON and we hit 0xFC, end of OR, then
- // or is STILL false so break.
- if (orTest) {
- ec = false;
- retval = false;
- end_test = true;
+ case 0xFC:
+ if (orMode) {
+ // We have reached the end of an OR expression without
+ // a single test command evaluating as true. Thus the OR
+ // expression evalutes as false which means the whole
+ // expression evaluates as false. So skip until the
+ // ending 0xFF and return.
+ skipInstructionsUntil(0xFF);
+ result = false;
+ endTest = true;
+ } else {
+ orMode = true;
}
-
- orTest = true;
continue;
-
+ case 0xFD:
+ notMode = true;
+ continue;
case 0x00:
- // return true?
- end_test = true;
- break;
- case 0x01:
- ec = testEqual(p[0], p[1]);
- if (p[0] == 11)
- _timerHack++;
- break;
- case 0x02:
- ec = testEqual(p[0], getvar(p[1]));
- if (p[0] == 11 || p[1] == 11)
- _timerHack++;
- break;
- case 0x03:
- ec = testLess(p[0], p[1]);
- if (p[0] == 11)
- _timerHack++;
- break;
- case 0x04:
- ec = testLess(p[0], getvar(p[1]));
- if (p[0] == 11 || p[1] == 11)
- _timerHack++;
- break;
- case 0x05:
- ec = testGreater(p[0], p[1]);
- if (p[0] == 11)
- _timerHack++;
- break;
- case 0x06:
- ec = testGreater(p[0], getvar(p[1]));
- if (p[0] == 11 || p[1] == 11)
- _timerHack++;
- break;
- case 0x07:
- ec = testIsSet(p[0]);
- break;
- case 0x08:
- ec = testIsSet(getvar(p[0]));
- break;
- case 0x09:
- ec = testHas(p[0]);
- break;
- case 0x0A:
- ec = testObjInRoom(p[0], p[1]);
- break;
- case 0x0B:
- ec = testPosn(p[0], p[1], p[2], p[3], p[4]);
- break;
- case 0x0C:
- ec = testController(p[0]);
- break;
- case 0x0D:
- ec = testKeypressed();
- break;
- case 0x0E:
- ec = testSaid(p[0], (uint8 *) code + (ip + 1));
- ip = lastIp;
- ip++; // skip opcode
- ip += p[0] * 2; // skip num_words * 2
- ip++; // skip num_words opcode
- break;
- case 0x0F:
- debugC(7, kDebugLevelScripts, "comparing [%s], [%s]", _game.strings[p[0]], _game.strings[p[1]]);
- ec = testCompareStrings(p[0], p[1]);
- break;
- case 0x10:
- ec = testObjInBox(p[0], p[1], p[2], p[3], p[4]);
- break;
- case 0x11:
- ec = testObjCenter(p[0], p[1], p[2], p[3], p[4]);
- break;
- case 0x12:
- ec = testObjRight(p[0], p[1], p[2], p[3], p[4]);
- break;
- case 0x13: // Unknown test command 19
- // My current theory is that this command checks whether the ego is currently moving
- // and that that movement has been caused using the mouse and not using the keyboard.
- // I base this theory on the game's behavior on an Amiga emulator, not on disassembly.
- // This command is used at least in the Amiga version of Gold Rush! v2.05 1989-03-09
- // (AGI 2.316) in logics 1, 3, 5, 6, 137 and 192 (Logic.192 revealed this command's nature).
- // TODO: Check this command's implementation using disassembly just to be sure.
- ec = _game.viewTable[0].flags & ADJ_EGO_XY;
- debugC(7, kDebugLevelScripts, "op_test: in.motion.using.mouse = %s (Amiga-specific testcase 19)", ec ? "true" : "false");
- break;
+ case 0xFF:
+ endTest = true;
+ continue;
+
default:
- ec = false;
- end_test = true;
- }
-
- if (!end_test) {
- if (op <= 0x12)
- ip += logicNamesTest[op].numArgs;
-
- // exchange ec value
- if (notTest)
- ec = !ec;
-
- // not is only enabled for 1 test command
- notTest = false;
-
- if (orTest && ec) {
- // a true inside an OR statement passes
- // ENTIRE statement scan for end of OR
-
- // CM: test for opcode < 0xfc changed from 'op' to
- // '*(code+ip)', to avoid problem with the 0xfd (NOT)
- // opcode byte. Changed a bad ip += ... ip++ construct.
- // This should fix the crash with Larry's logic.0 code:
- //
- // if ((isset(4) ||
- // !isset(2) ||
- // v30 == 2 ||
- // v30 == 1)) {
- // goto Label1;
- // }
- //
- // The bytecode is:
- // ff fc 07 04 fd 07 02 01 1e 02 01 1e 01 fc ff
-
- // find end of OR
- while (*(code + ip) != 0xFC) {
- if (*(code + ip) == 0x0E) { // said
- ip++;
-
- // cover count + ^words
- ip += 1 + ((*(code + ip)) * 2);
- continue;
- }
-
- if (*(code + ip) < 0xFC)
- ip += logicNamesTest[*(code + ip)].numArgs;
- ip++;
+ // Evaluate the command and skip the rest of the instruction
+ _agiCondCommands[op](state, p);
+ skipInstruction(op);
+
+ // NOT mode is enabled only for one instruction
+ if (notMode)
+ state->testResult = !state->testResult;
+ notMode = false;
+
+ if (orMode) {
+ if (state->testResult) {
+ // We are in OR mode and the last test command evaluated
+ // as true, thus the whole OR expression evaluates as
+ // true. So skip the rest of the OR expression and
+ // continue normally.
+ skipInstructionsUntil(0xFC);
+ orMode = false;
+ continue;
}
- ip++;
-
- orTest = false;
- retval = true;
} else {
- retval = orTest ? retval || ec : retval && ec;
+ result &= state->testResult;
+ if (!result) {
+ // Since we are in AND mode and the last test command
+ // evaluated as false, the whole expression also evaluates
+ // as false. So skip until the ending 0xFF and return.
+ skipInstructionsUntil(0xFF);
+ endTest = true;
+ continue;
+ }
}
+ break;
}
}
- // if false, scan for end of IP?
- if (retval)
+ // Skip the following IF block if the condition evaluates as false
+ if (result)
ip += 2;
- else {
- ip = lastIp;
- while (*(code + ip) != 0xff) {
- if (*(code + ip) == 0x0e) {
- ip++;
- ip += (*(code + ip)) * 2 + 1;
- } else if (*(code + ip) < 0xfc) {
- ip += logicNamesTest[*(code + ip)].numArgs;
- ip++;
- } else {
- ip++;
- }
- }
- ip++; // skip over 0xFF
+ else
ip += READ_LE_UINT16(code + ip) + 2;
- }
if (_debug.enabled && (_debug.logic0 || lognum))
- debugConsole(lognum, 0xFF, retval ? "=true" : "=false");
+ debugConsole(lognum, 0xFF, result ? "=true" : "=false");
+
+ return result;
+}
- return retval;
+void AgiEngine::skipInstruction(byte op) {
+ AgiGame *state = &_game;
+ if (op >= 0xFC)
+ return;
+ if (op == 0x0E && state->_vm->getVersion() >= 0x2000) // said
+ ip += *(code + ip) * 2 + 1;
+ else
+ ip += logicNamesTest[op].argumentsLength();
+}
+
+void AgiEngine::skipInstructionsUntil(byte v) {
+ AgiGame *state = &_game;
+ while (1) {
+ byte op = *(code + ip++);
+ if (op == v)
+ return;
+ skipInstruction(op);
+ }
}
} // End of namespace Agi
diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp
new file mode 100644
index 0000000000..d1baab93e1
--- /dev/null
+++ b/engines/agi/opcodes.cpp
@@ -0,0 +1,381 @@
+/* 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.
+ *
+ */
+
+#include "agi/agi.h"
+#include "agi/opcodes.h"
+
+namespace Agi {
+
+AgiInstruction *logicNamesTest;
+AgiInstruction *logicNamesCmd;
+
+AgiInstruction insV1Test[] = {
+ { "", "", &condUnknown }, // 00
+ { "equaln", "vn", &condEqual }, // 01
+ { "equalv", "vv", &condEqualV }, // 02
+ { "lessn", "vn", &condLess }, // 03
+ { "lessv", "vv", &condLessV }, // 04
+ { "greatern", "vn", &condGreater }, // 05
+ { "greaterv", "vv", &condGreaterV }, // 06
+ { "isset", "v", &condIsSetV1 }, // 07
+ { "has", "n", &condHasV1 }, // 08
+ { "said", "nnnn", &condSaid2 }, // 09
+ { "posn", "nnnnn", &condPosn }, // 0A
+ { "controller", "n", &condController }, // 0B
+ { "obj.in.room", "nv", &condObjInRoom }, // 0C
+ { "said", "nnnnnn", &condSaid3 }, // 0D
+ { "have.key", "", &condHaveKey }, // 0E
+ { "said", "nn", &condSaid1 }, // 0F
+ { "bit", "nv", &condBit }, // 10
+};
+
+AgiInstruction insV1[] = {
+ { "return", "", NULL }, // 00
+ { "increment", "v", &cmdIncrement }, // 01
+ { "decrement", "v", &cmdDecrement }, // 02
+ { "assignn", "vn", &cmdAssignN }, // 03
+ { "assignv", "vv", &cmdAssignV }, // 04
+ { "addn", "vn", &cmdAddN }, // 05
+ { "addv", "vv", &cmdAddV }, // 06
+ { "subn", "vn", &cmdSubN }, // 07
+ { "subv", "vv", &cmdSubV }, // 08
+ { "load.view", "n", &cmdLoadView }, // 09
+ { "animate.obj", "n", &cmdAnimateObj }, // 0A
+ { "new.room", "n", &cmdNewRoomV1 }, // 0B
+ { "draw.pic", "v", &cmdDrawPicV1 }, // 0C
+ { "print", "s", &cmdPrint }, // 0D TODO
+ { "status", "", &cmdStatus }, // 0E TODO
+ { "save.game", "", &cmdSaveGame }, // 0F TODO
+ { "restore.game", "", &cmdLoadGame }, // 10 TODO
+ { "init.disk", "", &cmdInitDisk }, // 11 TODO
+ { "restart.game", "", &cmdRestartGame }, // 12 TODO
+ { "random", "v", &cmdRandomV1 }, // 13
+ { "get", "n", &cmdGetV1 }, // 14
+ { "drop", "n", &cmdDrop }, // 15
+ { "draw", "n", &cmdDraw }, // 16 TODO
+ { "erase", "n", &cmdErase }, // 17 TODO
+ { "position", "nnn", &cmdPositionV1 }, // 18
+ { "position.v", "nvv", &cmdPositionFV1 }, // 19
+ { "get.posn", "nvv", &cmdGetPosn }, // 1A
+ { "set.cel", "nn", &cmdSetCel }, // 1B
+ { "set.loop", "nn", &cmdSetLoop }, // 1C
+ { "end.of.loop", "nn", &cmdEndOfLoopV1 }, // 1D
+ { "reverse.loop", "nn", &cmdReverseLoopV1 }, // 1E
+ { "move.obj", "nnnnn", &cmdMoveObj }, // 1F
+ { "set.view", "nn", &cmdSetView }, // 20
+ { "follow.ego", "nnn", &cmdFollowEgo }, // 21
+ { "block", "", &cmdBlock }, // 22
+ { "unblock", "", &cmdUnblock }, // 23
+ { "ignore.blocks", "n", &cmdIgnoreBlocks }, // 24
+ { "observe.blocks", "n", &cmdObserveBlocks }, // 25
+ { "wander", "n", &cmdWander }, // 26
+ { "reposition", "nvv", &cmdRepositionV1 }, // 27
+ { "stop.motion", "n", &cmdStopMotionV1 }, // 28
+ { "start.motion", "n", &cmdStartMotionV1 }, // 29
+ { "stop.cycling", "n", &cmdStopCycling }, // 2A
+ { "start.cycling", "n", &cmdStartCycling }, // 2B
+ { "stop.update", "n", &cmdStopUpdate }, // 2C
+ { "start.update", "n", &cmdStartUpdate }, // 2D
+ { "program.control", "", &cmdProgramControl }, // 2E
+ { "player.control", "", &cmdPlayerControl }, // 2F
+ { "set.priority", "nn", &cmdSetPriority }, // 30
+ { "release.priority", "n", &cmdReleasePriority }, // 31
+ { "add.to.pic", "nnnnnn", &cmdAddToPicV1 }, // 32
+ { "set.horizon", "n", &cmdSetHorizon }, // 33
+ { "ignore.horizon", "n", &cmdIgnoreHorizon }, // 34
+ { "observe.horizon", "n", &cmdObserveHorizon }, // 35
+ { "load.logics", "n", &cmdLoadLogic }, // 36 TODO
+ { "object.on.water", "n", &cmdObjectOnWater }, // 37
+ { "load.pic", "v", &cmdLoadPicV1 }, // 38
+ { "load.sound", "n", &cmdLoadSound }, // 39
+ { "sound", "nn", &cmdSound }, // 3A
+ { "stop.sound", "", &cmdStopSound }, // 3B
+ { "set.v", "v", &cmdSetV }, // 3C
+ { "reset.v", "v", &cmdResetV }, // 3D
+ { "toggle.v", "v", &cmdToggleV }, // 3E
+ { "new.room.v", "v", &cmdNewRoomVV1 }, // 3F TODO
+ { "call", "n", &cmdCallV1 }, // 40 TODO
+ { "quit", "", &cmdQuitV1 }, // 41
+ { "set.speed", "v", &cmdSetSpeed }, // 42
+ { "move.obj.v", "nvvvv", &cmdMoveObjF }, // 43
+ { "...", "nn", &cmdUnknown }, // 44
+ { "get.v", "v", &cmdUnknown }, // 45
+ { "assign.v", "vv", &cmdUnknown }, // 46
+ { "...", "n", &cmdUnknown }, // 47 # printvar.v
+ { "get.priority", "nv", &cmdGetPriority }, // 48
+ { "ignore.objs", "n", &cmdIgnoreObjs }, // 49
+ { "observe.objs", "n", &cmdObserveObjs }, // 4A
+ { "distance", "nnv", &cmdDistance }, // 4B
+ { "object.on.land", "n", &cmdObjectOnLand }, // 4C
+ { "...", "nv", &cmdUnknown }, // 4D # set.priority.f
+ { "...", "", &cmdUnknown }, // 4E # show.obj
+ { "load.logics", "n", &cmdLoadLogic }, // 4F # load.global.logics
+ { "display", "nnns", &cmdDisplay }, // 50 TODO: 4 vs 3 args
+ { "prevent.input???", "", &cmdUnknown }, // 51
+ { "...", "", &cmdUnknown }, // 52 # nop
+ { "...", "n", &cmdUnknown }, // 53 # text.screen
+ { "...", "", &cmdUnknown }, // 54 ???
+ { "stop.motion", "", &cmdStopMotion }, // 55 or force.update??
+ { "discard.view", "n", &cmdDiscardView }, // 56
+ { "discard.pic", "v", &cmdDiscardPic }, // 57
+ { "set.item.view", "nn", &cmdSetItemView }, // 58
+ { "...", "", &cmdUnknown }, // 59 # reverse.cycle
+ { "last.cel", "nv", &cmdLastCel }, // 5A
+ { "set.cel.v", "nv", &cmdSetCelF }, // 5B
+ { "...", "", &cmdUnknown }, // 5C # normal.cycle
+ { "load.view", "n", &cmdLoadView }, // 5D
+ { "...", "", &cmdUnknown }, // 5E
+ { "...", "", &cmdUnknown }, // 5F
+ { "setbit", "nv", &cmdUnknown }, // 60
+ { "...", "nv", &cmdUnknown }, // 61 # clearbit
+};
+
+AgiInstruction insV2Test[] = {
+ { "", "", &condUnknown }, // 00
+ { "equaln", "vn", &condEqual }, // 01
+ { "equalv", "vv", &condEqualV }, // 02
+ { "lessn", "vn", &condLess }, // 03
+ { "lessv", "vv", &condLessV }, // 04
+ { "greatern", "vn", &condGreater }, // 05
+ { "greaterv", "vv", &condGreaterV }, // 06
+ { "isset", "n", &condIsSet }, // 07
+ { "issetv", "v", &condIsSetV }, // 08
+ { "has", "n", &condHas }, // 09
+ { "obj.in.room", "nv", &condObjInRoom}, // 0A
+ { "posn", "nnnnn", &condPosn }, // 0B
+ { "controller", "n", &condController }, // 0C
+ { "have.key", "", &condHaveKey}, // 0D
+ { "said", "", &condSaid }, // 0E
+ { "compare.strings", "ss", &condCompareStrings }, // 0F
+ { "obj.in.box", "nnnnn", &condObjInBox }, // 10
+ { "center.posn", "nnnnn", &condCenterPosn }, // 11
+ { "right.posn", "nnnnn", &condRightPosn }, // 12
+ { "in.motion.using.mouse", "", &condUnknown13 } // 13
+};
+
+AgiInstruction insV2[] = {
+ { "return", "", NULL },
+ { "increment", "v", &cmdIncrement },
+ { "decrement", "v", &cmdDecrement },
+ { "assignn", "vn", &cmdAssignN },
+ { "assignv", "vv", &cmdAssignV },
+ { "addn", "vn", &cmdAddN },
+ { "addv", "vv", &cmdAddV },
+ { "subn", "vn", &cmdSubN },
+ { "subv", "vv", &cmdSubV },
+ { "lindirectv", "vv", &cmdLindirectV },
+ { "lindirect", "vv", &cmdRindirect },
+ { "lindirectn", "vn", &cmdLindirectN },
+ { "set", "n", &cmdSet },
+ { "reset", "n", &cmdReset },
+ { "toggle", "n", &cmdToggle },
+ { "set.v", "v", &cmdSetV },
+ { "reset.v", "v", &cmdResetV },
+ { "toggle.v", "v", &cmdToggleV },
+ { "new.room", "n", &cmdNewRoom },
+ { "new.room.v", "v", &cmdNewRoomF },
+ { "load.logics", "n", &cmdLoadLogic },
+ { "load.logics.v", "v", &cmdLoadLogicF },
+ { "call", "n", &cmdCall },
+ { "call.v", "v", &cmdCallF },
+ { "load.pic", "v", &cmdLoadPic },
+ { "draw.pic", "v", &cmdDrawPic },
+ { "show.pic", "", &cmdShowPic },
+ { "discard.pic", "v", &cmdDiscardPic },
+ { "overlay.pic", "v", &cmdOverlayPic },
+ { "show.pri.screen", "", &cmdShowPriScreen },
+ { "load.view", "n", &cmdLoadView },
+ { "load.view.v", "v", &cmdLoadViewF },
+ { "discard.view", "n", &cmdDiscardView },
+ { "animate.obj", "n", &cmdAnimateObj },
+ { "unanimate.all", "", &cmdUnanimateAll },
+ { "draw", "n", &cmdDraw },
+ { "erase", "n", &cmdErase },
+ { "position", "nnn", &cmdPosition },
+ { "position.v", "nvv", &cmdPositionF },
+ { "get.posn", "nvv", &cmdGetPosn },
+ { "reposition", "nvv", &cmdReposition },
+ { "set.view", "nn", &cmdSetView },
+ { "set.view.v", "nv", &cmdSetViewF },
+ { "set.loop", "nn", &cmdSetLoop },
+ { "set.loop.v", "nv", &cmdSetLoopF },
+ { "fix.loop", "n", &cmdFixLoop },
+ { "release.loop", "n", &cmdReleaseLoop },
+ { "set.cel", "nn", &cmdSetCel },
+ { "set.cel.v", "nv", &cmdSetCelF },
+ { "last.cel", "nv", &cmdLastCel },
+ { "current.cel", "nv", &cmdCurrentCel },
+ { "current.loop", "nv", &cmdCurrentLoop },
+ { "current.view", "nv", &cmdCurrentView },
+ { "number.of.loops", "nv", &cmdNumberOfLoops },
+ { "set.priority", "nn", &cmdSetPriority },
+ { "set.priority.v", "nv", &cmdSetPriorityF },
+ { "release.priority", "n", &cmdReleasePriority },
+ { "get.priority", "nn", &cmdGetPriority },
+ { "stop.update", "n", &cmdStopUpdate },
+ { "start.update", "n", &cmdStartUpdate },
+ { "force.update", "n", &cmdForceUpdate },
+ { "ignore.horizon", "n", &cmdIgnoreHorizon },
+ { "observe.horizon", "n", &cmdObserveHorizon },
+ { "set.horizon", "n", &cmdSetHorizon },
+ { "object.on.water", "n", &cmdObjectOnWater },
+ { "object.on.land", "n", &cmdObjectOnLand },
+ { "object.on.anything", "n", &cmdObjectOnAnything },
+ { "ignore.objs", "n", &cmdIgnoreObjs },
+ { "observe.objs", "n", &cmdObserveObjs },
+ { "distance", "nnv", &cmdDistance },
+ { "stop.cycling", "n", &cmdStopCycling },
+ { "start.cycling", "n", &cmdStartCycling },
+ { "normal.cycle", "n", &cmdNormalCycle },
+ { "end.of.loop", "nn", &cmdEndOfLoop },
+ { "reverse.cycle", "n", &cmdReverseCycle },
+ { "reverse.loop", "nn", &cmdReverseLoop },
+ { "cycle.time", "nv", &cmdCycleTime },
+ { "stop.motion", "n", &cmdStopMotion },
+ { "start.motion", "n", &cmdStartMotion },
+ { "step.size", "nv", &cmdStepSize },
+ { "step.time", "nv", &cmdStepTime },
+ { "move.obj", "nnnnn", &cmdMoveObj },
+ { "move.obj.v", "nvvvv", &cmdMoveObjF },
+ { "follow.ego", "nnn", &cmdFollowEgo },
+ { "wander", "n", &cmdWander },
+ { "normal.motion", "n", &cmdNormalMotion },
+ { "set.dir", "nv", &cmdSetDir },
+ { "get.dir", "nv", &cmdGetDir },
+ { "ignore.blocks", "n", &cmdIgnoreBlocks },
+ { "observe.blocks", "n", &cmdObserveBlocks },
+ { "block", "nnnn", &cmdBlock },
+ { "unblock", "", &cmdUnblock },
+ { "get", "n", &cmdGet },
+ { "get.v", "v", &cmdGetF },
+ { "drop", "n", &cmdDrop },
+ { "put", "nn", &cmdPut },
+ { "put.v", "vv", &cmdPutF },
+ { "get.room.v", "vv", &cmdGetRoomF },
+ { "load.sound", "n", &cmdLoadSound },
+ { "sound", "nn", &cmdSound },
+ { "stop.sound", "", &cmdStopSound },
+ { "print", "s", &cmdPrint },
+ { "print.v", "v", &cmdPrintF },
+ { "display", "nns", &cmdDisplay },
+ { "display.v", "vvv", &cmdDisplayF },
+ { "clear.lines", "nns", &cmdClearLines },
+ { "text.screen", "", &cmdTextScreen },
+ { "graphics", "", &cmdGraphics },
+ { "set.cursor.char", "s", &cmdSetCursorChar },
+ { "set.text.attribute", "nn", &cmdSetTextAttribute },
+ { "shake.screen", "n", &cmdShakeScreen },
+ { "configure.screen", "nnn", &cmdConfigureScreen },
+ { "status.line.on", "", &cmdStatusLineOn },
+ { "status.line.off", "", &cmdStatusLineOff },
+ { "set.string", "ns", &cmdSetString },
+ { "get.string", "nsnnn", &cmdGetString },
+ { "word.to.string", "nn", &cmdWordToString },
+ { "parse", "n", &cmdParse },
+ { "get.num", "nv", &cmdGetNum },
+ { "prevent.input", "", &cmdPreventInput },
+ { "accept.input", "", &cmdAcceptInput },
+ { "set.key", "nnn", &cmdSetKey },
+ { "add.to.pic", "nnnnnnn", &cmdAddToPic },
+ { "add.to.pic.v", "vvvvvvv", &cmdAddToPicF },
+ { "status", "", &cmdStatus },
+ { "save.game", "", &cmdSaveGame },
+ { "restore.game", "", &cmdLoadGame },
+ { "init.disk", "", &cmdInitDisk },
+ { "restart.game", "", &cmdRestartGame },
+ { "show.obj", "n", &cmdShowObj },
+ { "random", "nnv", &cmdRandom },
+ { "program.control", "", &cmdProgramControl },
+ { "player.control", "", &cmdPlayerControl },
+ { "obj.status.v", "v", &cmdObjStatusF },
+ { "quit", "n", &cmdQuit }, // 0 args for AGI version 2.089
+ { "show.mem", "", &cmdShowMem },
+ { "pause", "", &cmdPause },
+ { "echo.line", "", &cmdEchoLine },
+ { "cancel.line", "", &cmdCancelLine },
+ { "init.joy", "", &cmdInitJoy },
+ { "toggle.monitor", "", &cmdToggleMonitor },
+ { "version", "", &cmdVersion },
+ { "script.size", "n", &cmdScriptSize },
+ { "set.game.id", "s", &cmdSetGameID },
+ { "log", "s", &cmdLog },
+ { "set.scan.start", "", &cmdSetScanStart },
+ { "reset.scan.start", "", &cmdResetScanStart },
+ { "reposition.to", "nnn", &cmdRepositionTo },
+ { "reposition.to.v", "nvv", &cmdRepositionToF },
+ { "trace.on", "", &cmdTraceOn },
+ { "trace.info", "nnn", &cmdTraceInfo },
+ { "print.at", "snnn", &cmdPrintAt }, // 3 args for AGI versions before 2.440
+ { "print.at.v", "vnnn", &cmdPrintAtV },
+ { "discard.view.v", "v", &cmdDiscardView},
+ { "clear.text.rect", "nnnnn", &cmdClearTextRect },
+ { "set.upper.left", "nn", &cmdSetUpperLeft },
+ { "set.menu", "s", &cmdSetMenu },
+ { "set.menu.item", "sn", &cmdSetMenuItem },
+ { "submit.menu", "", &cmdSubmitMenu },
+ { "enable.item", "n", &cmdEnableItem },
+ { "disable.item", "n", &cmdDisableItem },
+ { "menu.input", "", &cmdMenuInput },
+ { "show.obj.v", "v", &cmdShowObjV },
+ { "open.dialogue", "", &cmdOpenDialogue },
+ { "close.dialogue", "", &cmdCloseDialogue },
+ { "mul.n", "vn", &cmdMulN },
+ { "mul.v", "vv", &cmdMulV },
+ { "div.n", "vn", &cmdDivN },
+ { "div.v", "vv", &cmdDivV },
+ { "close.window", "", &cmdCloseWindow },
+ { "set.simple", "n", &cmdSetSimple },
+ { "push.script", "", &cmdPushScript },
+ { "pop.script", "", &cmdPopScript },
+ { "hold.key", "", &cmdHoldKey },
+ { "set.pri.base", "n", &cmdSetPriBase },
+ { "discard.sound", "n", &cmdDiscardSound },
+ { "hide.mouse", "", &cmdHideMouse }, // 1 arg for AGI version 3.002.086
+ { "allow.menu", "n", &cmdAllowMenu },
+ { "show.mouse", "", &cmdShowMouse },
+ { "fence.mouse", "nnnn", &cmdFenceMouse },
+ { "mouse.posn", "vv", &cmdMousePosn },
+ { "release.key", "", &cmdReleaseKey }, // 2 args for at least the Amiga GR (v2.05 1989-03-09) using AGI 2.316
+ { "adj.ego.move.to.xy", "", &cmdAdjEgoMoveToXY }
+};
+
+void AgiEngine::setupOpcodes() {
+ if (getVersion() >= 0x2000) {
+ for (int i = 0; i <= ARRAYSIZE(insV2Test); ++i)
+ _agiCondCommands[i] = insV2Test[i].func;
+ for (int i = 0; i < ARRAYSIZE(insV2); ++i)
+ _agiCommands[i] = insV2[i].func;
+
+ logicNamesTest = insV2Test;
+ logicNamesCmd = insV2;
+ } else {
+ for (int i = 0; i <= ARRAYSIZE(insV1Test); ++i)
+ _agiCondCommands[i] = insV1Test[i].func;
+ for (int i = 0; i < ARRAYSIZE(insV1); ++i)
+ _agiCommands[i] = insV1[i].func;
+
+ logicNamesTest = insV1Test;
+ logicNamesCmd = insV1;
+ }
+}
+
+}
diff --git a/engines/agi/opcodes.h b/engines/agi/opcodes.h
index b0d2051f0b..7f0f287550 100644
--- a/engines/agi/opcodes.h
+++ b/engines/agi/opcodes.h
@@ -23,17 +23,251 @@
#ifndef AGI_OPCODES_H
#define AGI_OPCODES_H
+#include <string.h>
+
namespace Agi {
-struct AgiLogicnames {
+struct AgiInstruction {
const char *name;
- uint16 numArgs;
- uint16 argMask;
+ const char *args;
+ AgiCommand func;
+
+ int argumentsLength() { return strlen(args); }
};
-extern AgiLogicnames logicNamesTest[];
-extern AgiLogicnames logicNamesCmd[];
-extern AgiLogicnames logicNamesIf[];
+extern AgiInstruction *logicNamesTest;
+extern AgiInstruction *logicNamesCmd;
+
+void cmdIncrement(AgiGame *state, uint8 *p);
+void cmdDecrement(AgiGame *state, uint8 *p);
+void cmdAssignN(AgiGame *state, uint8 *p);
+void cmdAssignV(AgiGame *state, uint8 *p);
+void cmdAddN(AgiGame *state, uint8 *p);
+void cmdAddV(AgiGame *state, uint8 *p);
+void cmdSubN(AgiGame *state, uint8 *p);
+void cmdSubV(AgiGame *state, uint8 *p); // 0x08
+void cmdLindirectV(AgiGame *state, uint8 *p);
+void cmdRindirect(AgiGame *state, uint8 *p);
+void cmdLindirectN(AgiGame *state, uint8 *p);
+void cmdSet(AgiGame *state, uint8 *p);
+void cmdReset(AgiGame *state, uint8 *p);
+void cmdToggle(AgiGame *state, uint8 *p);
+void cmdSetV(AgiGame *state, uint8 *p);
+void cmdResetV(AgiGame *state, uint8 *p); // 0x10
+void cmdToggleV(AgiGame *state, uint8 *p);
+void cmdNewRoom(AgiGame *state, uint8 *p);
+void cmdNewRoomF(AgiGame *state, uint8 *p);
+void cmdLoadLogic(AgiGame *state, uint8 *p);
+void cmdLoadLogicF(AgiGame *state, uint8 *p);
+void cmdCall(AgiGame *state, uint8 *p);
+void cmdCallF(AgiGame *state, uint8 *p);
+void cmdLoadPic(AgiGame *state, uint8 *p); // 0x18
+void cmdLoadPicV1(AgiGame *state, uint8 *p);
+void cmdDrawPic(AgiGame *state, uint8 *p);
+void cmdDrawPicV1(AgiGame *state, uint8 *p);
+void cmdShowPic(AgiGame *state, uint8 *p);
+void cmdDiscardPic(AgiGame *state, uint8 *p);
+void cmdOverlayPic(AgiGame *state, uint8 *p);
+void cmdShowPriScreen(AgiGame *state, uint8 *p);
+void cmdLoadView(AgiGame *state, uint8 *p);
+void cmdLoadViewF(AgiGame *state, uint8 *p);
+void cmdDiscardView(AgiGame *state, uint8 *p); // 0x20
+void cmdAnimateObj(AgiGame *state, uint8 *p);
+void cmdUnanimateAll(AgiGame *state, uint8 *p);
+void cmdDraw(AgiGame *state, uint8 *p);
+void cmdErase(AgiGame *state, uint8 *p);
+void cmdPosition(AgiGame *state, uint8 *p);
+void cmdPositionV1(AgiGame *state, uint8 *p);
+void cmdPositionF(AgiGame *state, uint8 *p);
+void cmdPositionFV1(AgiGame *state, uint8 *p);
+void cmdGetPosn(AgiGame *state, uint8 *p);
+void cmdReposition(AgiGame *state, uint8 *p); // 0x28
+void cmdRepositionV1(AgiGame *state, uint8 *p); // 0x28
+void cmdSetView(AgiGame *state, uint8 *p);
+void cmdSetViewF(AgiGame *state, uint8 *p);
+void cmdSetLoop(AgiGame *state, uint8 *p);
+void cmdSetLoopF(AgiGame *state, uint8 *p);
+void cmdFixLoop(AgiGame *state, uint8 *p);
+void cmdReleaseLoop(AgiGame *state, uint8 *p);
+void cmdSetCel(AgiGame *state, uint8 *p);
+void cmdSetCelF(AgiGame *state, uint8 *p); // 0x30
+void cmdLastCel(AgiGame *state, uint8 *p);
+void cmdCurrentCel(AgiGame *state, uint8 *p);
+void cmdCurrentLoop(AgiGame *state, uint8 *p);
+void cmdCurrentView(AgiGame *state, uint8 *p);
+void cmdNumberOfLoops(AgiGame *state, uint8 *p);
+void cmdSetPriority(AgiGame *state, uint8 *p);
+void cmdSetPriorityF(AgiGame *state, uint8 *p);
+void cmdReleasePriority(AgiGame *state, uint8 *p); // 0x38
+void cmdGetPriority(AgiGame *state, uint8 *p);
+void cmdStopUpdate(AgiGame *state, uint8 *p);
+void cmdStartUpdate(AgiGame *state, uint8 *p);
+void cmdForceUpdate(AgiGame *state, uint8 *p);
+void cmdIgnoreHorizon(AgiGame *state, uint8 *p);
+void cmdObserveHorizon(AgiGame *state, uint8 *p);
+void cmdSetHorizon(AgiGame *state, uint8 *p);
+void cmdObjectOnWater(AgiGame *state, uint8 *p); // 0x40
+void cmdObjectOnLand(AgiGame *state, uint8 *p);
+void cmdObjectOnAnything(AgiGame *state, uint8 *p);
+void cmdIgnoreObjs(AgiGame *state, uint8 *p);
+void cmdObserveObjs(AgiGame *state, uint8 *p);
+void cmdDistance(AgiGame *state, uint8 *p);
+void cmdStopCycling(AgiGame *state, uint8 *p);
+void cmdStartCycling(AgiGame *state, uint8 *p);
+void cmdNormalCycle(AgiGame *state, uint8 *p); // 0x48
+void cmdEndOfLoop(AgiGame *state, uint8 *p);
+void cmdEndOfLoopV1(AgiGame *state, uint8 *p);
+void cmdReverseCycle(AgiGame *state, uint8 *p);
+void cmdReverseLoop(AgiGame *state, uint8 *p);
+void cmdReverseLoopV1(AgiGame *state, uint8 *p);
+void cmdCycleTime(AgiGame *state, uint8 *p);
+void cmdStopMotion(AgiGame *state, uint8 *p);
+void cmdStopMotionV1(AgiGame *state, uint8 *p);
+void cmdStartMotion(AgiGame *state, uint8 *p);
+void cmdStartMotionV1(AgiGame *state, uint8 *p);
+void cmdStepSize(AgiGame *state, uint8 *p);
+void cmdStepTime(AgiGame *state, uint8 *p); // 0x50
+void cmdMoveObj(AgiGame *state, uint8 *p);
+void cmdMoveObjF(AgiGame *state, uint8 *p);
+void cmdFollowEgo(AgiGame *state, uint8 *p);
+void cmdWander(AgiGame *state, uint8 *p);
+void cmdNormalMotion(AgiGame *state, uint8 *p);
+void cmdSetDir(AgiGame *state, uint8 *p);
+void cmdGetDir(AgiGame *state, uint8 *p);
+void cmdIgnoreBlocks(AgiGame *state, uint8 *p); // 0x58
+void cmdObserveBlocks(AgiGame *state, uint8 *p);
+void cmdBlock(AgiGame *state, uint8 *p);
+void cmdUnblock(AgiGame *state, uint8 *p);
+void cmdGet(AgiGame *state, uint8 *p);
+void cmdGetV1(AgiGame *state, uint8 *p);
+void cmdGetF(AgiGame *state, uint8 *p);
+void cmdDrop(AgiGame *state, uint8 *p);
+void cmdPut(AgiGame *state, uint8 *p);
+void cmdPutF(AgiGame *state, uint8 *p); // 0x60
+void cmdGetRoomF(AgiGame *state, uint8 *p);
+void cmdLoadSound(AgiGame *state, uint8 *p);
+void cmdSound(AgiGame *state, uint8 *p);
+void cmdStopSound(AgiGame *state, uint8 *p);
+void cmdPrint(AgiGame *state, uint8 *p);
+void cmdPrintF(AgiGame *state, uint8 *p);
+void cmdDisplay(AgiGame *state, uint8 *p);
+void cmdDisplayF(AgiGame *state, uint8 *p); // 0x68
+void cmdClearLines(AgiGame *state, uint8 *p);
+void cmdTextScreen(AgiGame *state, uint8 *p);
+void cmdGraphics(AgiGame *state, uint8 *p);
+void cmdSetCursorChar(AgiGame *state, uint8 *p);
+void cmdSetTextAttribute(AgiGame *state, uint8 *p);
+void cmdShakeScreen(AgiGame *state, uint8 *p);
+void cmdConfigureScreen(AgiGame *state, uint8 *p);
+void cmdStatusLineOn(AgiGame *state, uint8 *p); // 0x70
+void cmdStatusLineOff(AgiGame *state, uint8 *p);
+void cmdSetString(AgiGame *state, uint8 *p);
+void cmdGetString(AgiGame *state, uint8 *p);
+void cmdWordToString(AgiGame *state, uint8 *p);
+void cmdParse(AgiGame *state, uint8 *p);
+void cmdGetNum(AgiGame *state, uint8 *p);
+void cmdPreventInput(AgiGame *state, uint8 *p);
+void cmdAcceptInput(AgiGame *state, uint8 *p); // 0x78
+void cmdSetKey(AgiGame *state, uint8 *p);
+void cmdAddToPic(AgiGame *state, uint8 *p);
+void cmdAddToPicV1(AgiGame *state, uint8 *p);
+void cmdAddToPicF(AgiGame *state, uint8 *p);
+void cmdStatus(AgiGame *state, uint8 *p);
+void cmdSaveGame(AgiGame *state, uint8 *p);
+void cmdLoadGame(AgiGame *state, uint8 *p);
+void cmdInitDisk(AgiGame *state, uint8 *p);
+void cmdRestartGame(AgiGame *state, uint8 *p); // 0x80
+void cmdShowObj(AgiGame *state, uint8 *p);
+void cmdRandom(AgiGame *state, uint8 *p);
+void cmdRandomV1(AgiGame *state, uint8 *p);
+void cmdProgramControl(AgiGame *state, uint8 *p);
+void cmdPlayerControl(AgiGame *state, uint8 *p);
+void cmdObjStatusF(AgiGame *state, uint8 *p);
+void cmdQuit(AgiGame *state, uint8 *p);
+void cmdQuitV1(AgiGame *state, uint8 *p);
+void cmdShowMem(AgiGame *state, uint8 *p);
+void cmdPause(AgiGame *state, uint8 *p); // 0x88
+void cmdEchoLine(AgiGame *state, uint8 *p);
+void cmdCancelLine(AgiGame *state, uint8 *p);
+void cmdInitJoy(AgiGame *state, uint8 *p);
+void cmdToggleMonitor(AgiGame *state, uint8 *p);
+void cmdVersion(AgiGame *state, uint8 *p);
+void cmdScriptSize(AgiGame *state, uint8 *p);
+void cmdSetGameID(AgiGame *state, uint8 *p);
+void cmdLog(AgiGame *state, uint8 *p); // 0x90
+void cmdSetScanStart(AgiGame *state, uint8 *p);
+void cmdResetScanStart(AgiGame *state, uint8 *p);
+void cmdRepositionTo(AgiGame *state, uint8 *p);
+void cmdRepositionToF(AgiGame *state, uint8 *p);
+void cmdTraceOn(AgiGame *state, uint8 *p);
+void cmdTraceInfo(AgiGame *state, uint8 *p);
+void cmdPrintAt(AgiGame *state, uint8 *p);
+void cmdPrintAtV(AgiGame *state, uint8 *p); // 0x98
+//void cmdDiscardView(AgiGame *state, uint8 *p); // Opcode repeated from 0x20 ?
+void cmdClearTextRect(AgiGame *state, uint8 *p);
+void cmdSetUpperLeft(AgiGame *state, uint8 *p);
+void cmdSetMenu(AgiGame *state, uint8 *p);
+void cmdSetMenuItem(AgiGame *state, uint8 *p);
+void cmdSubmitMenu(AgiGame *state, uint8 *p);
+void cmdEnableItem(AgiGame *state, uint8 *p);
+void cmdDisableItem(AgiGame *state, uint8 *p); // 0xa0
+void cmdMenuInput(AgiGame *state, uint8 *p);
+void cmdShowObjV(AgiGame *state, uint8 *p);
+void cmdOpenDialogue(AgiGame *state, uint8 *p);
+void cmdCloseDialogue(AgiGame *state, uint8 *p);
+void cmdMulN(AgiGame *state, uint8 *p);
+void cmdMulV(AgiGame *state, uint8 *p);
+void cmdDivN(AgiGame *state, uint8 *p);
+void cmdDivV(AgiGame *state, uint8 *p); // 0xa8
+void cmdCloseWindow(AgiGame *state, uint8 *p);
+void cmdSetSimple(AgiGame *state, uint8 *p);
+void cmdPushScript(AgiGame *state, uint8 *p);
+void cmdPopScript(AgiGame *state, uint8 *p);
+void cmdHoldKey(AgiGame *state, uint8 *p);
+void cmdSetPriBase(AgiGame *state, uint8 *p);
+void cmdDiscardSound(AgiGame *state, uint8 *p);
+void cmdHideMouse(AgiGame *state, uint8 *p); // 0xb0
+void cmdAllowMenu(AgiGame *state, uint8 *p);
+void cmdShowMouse(AgiGame *state, uint8 *p);
+void cmdFenceMouse(AgiGame *state, uint8 *p);
+void cmdMousePosn(AgiGame *state, uint8 *p);
+void cmdReleaseKey(AgiGame *state, uint8 *p);
+void cmdAdjEgoMoveToXY(AgiGame *state, uint8 *p);
+
+void cmdSetSpeed(AgiGame *state, uint8 *p);
+void cmdSetItemView(AgiGame *state, uint8 *p);
+void cmdCallV1(AgiGame *state, uint8 *p);
+void cmdNewRoomV1(AgiGame *state, uint8 *p);
+void cmdNewRoomVV1(AgiGame *state, uint8 *p);
+void cmdUnknown(AgiGame *state, uint8 *p);
+
+void condEqual(AgiGame *state, uint8 *p);
+void condEqualV(AgiGame *state, uint8 *p);
+void condLess(AgiGame *state, uint8 *p);
+void condLessV(AgiGame *state, uint8 *p);
+void condGreater(AgiGame *state, uint8 *p);
+void condGreaterV(AgiGame *state, uint8 *p);
+void condIsSet(AgiGame *state, uint8 *p);
+void condIsSetV(AgiGame *state, uint8 *p);
+void condHas(AgiGame *state, uint8 *p);
+void condHasV1(AgiGame *state, uint8 *p);
+void condObjInRoom(AgiGame *state, uint8 *p);
+void condPosn(AgiGame *state, uint8 *p);
+void condController(AgiGame *state, uint8 *p);
+void condHaveKey(AgiGame *state, uint8 *p);
+void condSaid(AgiGame *state, uint8 *p);
+void condCompareStrings(AgiGame *state, uint8 *p);
+void condObjInBox(AgiGame *state, uint8 *p);
+void condCenterPosn(AgiGame *state, uint8 *p);
+void condRightPosn(AgiGame *state, uint8 *p);
+void condUnknown13(AgiGame *state, uint8 *p);
+void condUnknown(AgiGame *state, uint8 *p);
+
+void condIsSetV1(AgiGame *state, uint8 *p);
+void condSaid1(AgiGame *state, uint8 *p);
+void condSaid2(AgiGame *state, uint8 *p);
+void condSaid3(AgiGame *state, uint8 *p);
+void condBit(AgiGame *state, uint8 *p);
} // End of namespace Agi
diff --git a/engines/agi/preagi.cpp b/engines/agi/preagi.cpp
index c1a6cd33fe..0b5afc7f8c 100644
--- a/engines/agi/preagi.cpp
+++ b/engines/agi/preagi.cpp
@@ -22,18 +22,13 @@
#include "common/config-manager.h"
#include "common/debug-channels.h"
+#include "common/events.h"
#include "common/random.h"
#include "common/textconsole.h"
-#include "audio/mididrv.h"
-
#include "agi/preagi.h"
#include "agi/graphics.h"
-
-// preagi engines
-#include "agi/preagi_mickey.h"
-#include "agi/preagi_troll.h"
-#include "agi/preagi_winnie.h"
+#include "agi/keyboard.h"
namespace Agi {
@@ -59,39 +54,10 @@ PreAgiEngine::PreAgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) :
}
void PreAgiEngine::initialize() {
- // TODO: Some sound emulation modes do not fit our current music
- // drivers, and I'm not sure what they are. For now, they might
- // as well be called "PC Speaker" and "Not PC Speaker".
-
- switch (MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK))) {
- case MT_PCSPK:
- _soundemu = SOUND_EMU_PC;
- break;
- default:
- _soundemu = SOUND_EMU_NONE;
- break;
- }
-
- if (ConfMan.hasKey("render_mode")) {
- _renderMode = Common::parseRenderMode(ConfMan.get("render_mode").c_str());
- } else if (ConfMan.hasKey("platform")) {
- switch (Common::parsePlatform(ConfMan.get("platform"))) {
- case Common::kPlatformAmiga:
- _renderMode = Common::kRenderAmiga;
- break;
- case Common::kPlatformPC:
- _renderMode = Common::kRenderEGA;
- break;
- default:
- _renderMode = Common::kRenderEGA;
- break;
- }
- }
+ initRenderMode();
_gfx = new GfxMgr(this);
- //_sound = new SoundMgr(this, _mixer);
_picture = new PictureMgr(this, _gfx);
- //_sprites = new SpritesMgr(this, _gfx);
_gfx->initMachine();
@@ -111,7 +77,6 @@ void PreAgiEngine::initialize() {
_game.lineMinPrint = 0; // hardcoded
_gfx->initVideo();
- //_sound->initSound();
_speakerStream = new Audio::PCSpeaker(_mixer->getOutputRate());
_mixer->playStream(Audio::Mixer::kSFXSoundType, &_speakerHandle,
@@ -126,8 +91,6 @@ void PreAgiEngine::initialize() {
memset(&_game.dirPic[i], 0, sizeof(struct AgiDir));
memset(&_game.dirSound[i], 0, sizeof(struct AgiDir));
}
-
- debugC(2, kDebugLevelMain, "Init sound");
}
PreAgiEngine::~PreAgiEngine() {
@@ -135,50 +98,179 @@ PreAgiEngine::~PreAgiEngine() {
delete _speakerStream;
}
+int PreAgiEngine::rnd(int hi) {
+ return (_rnd->getRandomNumber(hi - 1) + 1);
+}
+
+// Screen functions
+void PreAgiEngine::clearScreen(int attr, bool overrideDefault) {
+ if (overrideDefault)
+ _defaultColor = attr;
-Common::Error PreAgiEngine::go() {
- setflag(fSoundOn, true); // enable sound
+ _gfx->clearScreen((attr & 0xF0) / 0x10);
+}
-//
-// FIXME (Fingolfin asks): Why are Mickey, Winnie and Troll standalone classes
-// instead of being subclasses of PreAgiEngine ?
-//
+void PreAgiEngine::clearGfxScreen(int attr) {
+ _gfx->drawRectangle(0, 0, GFX_WIDTH - 1, IDI_MAX_ROW_PIC * 8 -1, (attr & 0xF0) / 0x10);
+}
- // run preagi engine main loop
- switch (getGameID()) {
- case GID_MICKEY:
- {
- Mickey *mickey = new Mickey(this);
- mickey->init();
- mickey->run();
- delete mickey;
- }
- break;
- case GID_WINNIE:
- {
- Winnie *winnie = new Winnie(this);
- winnie->init();
- winnie->run();
- delete winnie;
+// String functions
+
+void PreAgiEngine::drawStr(int row, int col, int attr, const char *buffer) {
+ int code;
+
+ if (attr == kColorDefault)
+ attr = _defaultColor;
+
+ for (int iChar = 0; iChar < (int)strlen(buffer); iChar++) {
+ code = buffer[iChar];
+
+ switch (code) {
+ case '\n':
+ case 0x8D:
+ if (++row == 200 / 8) return;
+ col = 0;
+ break;
+
+ case '|':
+ // swap attribute nibbles
+ break;
+
+ default:
+ _gfx->putTextCharacter(1, col * 8 , row * 8, static_cast<char>(code), attr & 0x0f, (attr & 0xf0) / 0x10, false, getGameID() == GID_MICKEY ? mickey_fontdata : ibm_fontdata);
+
+ if (++col == 320 / 8) {
+ col = 0;
+ if (++row == 200 / 8) return;
+ }
}
- break;
- case GID_TROLL:
- {
- Troll *troll = new Troll(this);
- troll->init();
- troll->run();
- delete troll;
+ }
+}
+
+void PreAgiEngine::drawStrMiddle(int row, int attr, const char *buffer) {
+ int col = (25 / 2) - (strlen(buffer) / 2); // 25 = 320 / 8 (maximum column)
+ drawStr(row, col, attr, buffer);
+}
+
+void PreAgiEngine::clearTextArea() {
+ int start = IDI_MAX_ROW_PIC;
+
+ if (getGameID() == GID_TROLL)
+ start = 21;
+
+ for (int row = start; row < 200 / 8; row++) {
+ clearRow(row);
+ }
+}
+
+void PreAgiEngine::clearRow(int row) {
+ drawStr(row, 0, IDA_DEFAULT, " "); // 40 spaces
+}
+
+void PreAgiEngine::printStr(const char* szMsg) {
+ clearTextArea();
+ drawStr(21, 0, IDA_DEFAULT, szMsg);
+ _gfx->doUpdate();
+}
+
+void PreAgiEngine::XOR80(char *buffer) {
+ for (size_t i = 0; i < strlen(buffer); i++)
+ if (buffer[i] & 0x80)
+ buffer[i] ^= 0x80;
+}
+
+void PreAgiEngine::printStrXOR(char *szMsg) {
+ XOR80(szMsg);
+ printStr(szMsg);
+}
+
+// Input functions
+
+int PreAgiEngine::getSelection(SelectionTypes type) {
+ Common::Event event;
+ GUI::Debugger *console = getDebugger();
+
+ while (!shouldQuit()) {
+ while (_eventMan->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_RTL:
+ case Common::EVENT_QUIT:
+ return 0;
+ case Common::EVENT_RBUTTONUP:
+ return 0;
+ case Common::EVENT_LBUTTONUP:
+ if (type == kSelYesNo || type == kSelAnyKey)
+ return 1;
+ case Common::EVENT_KEYDOWN:
+ if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL) && console) {
+ console->attach();
+ console->onFrame();
+ //FIXME: If not cleared, clicking again will start the console
+ event.kbd.keycode = Common::KEYCODE_INVALID;
+ event.kbd.flags = 0;
+ continue;
+ }
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_y:
+ if (type == kSelYesNo)
+ return 1;
+ case Common::KEYCODE_n:
+ if (type == kSelYesNo)
+ return 0;
+ case Common::KEYCODE_ESCAPE:
+ if (type == kSelNumber || type == kSelAnyKey)
+ return 0;
+ case Common::KEYCODE_1:
+ case Common::KEYCODE_2:
+ case Common::KEYCODE_3:
+ case Common::KEYCODE_4:
+ case Common::KEYCODE_5:
+ case Common::KEYCODE_6:
+ case Common::KEYCODE_7:
+ case Common::KEYCODE_8:
+ case Common::KEYCODE_9:
+ if (type == kSelNumber)
+ return event.kbd.keycode - Common::KEYCODE_1 + 1;
+ case Common::KEYCODE_SPACE:
+ if (type == kSelSpace)
+ return 1;
+ case Common::KEYCODE_BACKSPACE:
+ if (type == kSelBackspace)
+ return 0;
+ default:
+ if (event.kbd.flags & Common::KBD_CTRL)
+ break;
+ if (type == kSelYesNo) {
+ return 2;
+ } else if (type == kSelNumber) {
+ return 10;
+ } else if (type == kSelAnyKey || type == kSelBackspace) {
+ return 1;
+ }
+ }
+ break;
+ default:
+ break;
+ }
}
- break;
- default:
- error("Unknown preagi engine");
- break;
+ _system->updateScreen();
+ _system->delayMillis(10);
}
- return Common::kNoError;
+ return 0;
}
-int PreAgiEngine::rnd(int hi) {
- return (_rnd->getRandomNumber(hi - 1) + 1);
+void PreAgiEngine::playNote(int16 frequency, int32 length) {
+ _speakerStream->play(Audio::PCSpeaker::kWaveFormSquare, frequency, length);
+ waitForTimer(length);
+}
+
+void PreAgiEngine::waitForTimer(int msec_delay) {
+ uint32 start_time = _system->getMillis();
+
+ while (_system->getMillis() < start_time + msec_delay) {
+ _gfx->doUpdate();
+ _system->delayMillis(10);
+ }
}
} // End of namespace Agi
diff --git a/engines/agi/preagi.h b/engines/agi/preagi.h
index 1a178497ad..5d50fb5af8 100644
--- a/engines/agi/preagi.h
+++ b/engines/agi/preagi.h
@@ -24,20 +24,36 @@
#define AGI_PREAGI_H
#include "agi/agi.h"
-#include "agi/preagi_common.h"
#include "audio/softsynth/pcspk.h"
namespace Agi {
+// default attributes
+#define IDA_DEFAULT 0x0F
+#define IDA_DEFAULT_REV 0xF0
+
+#define IDI_SND_OSCILLATOR_FREQUENCY 1193180
+#define IDI_SND_TIMER_RESOLUTION 0.0182
+
+#define kColorDefault 0x1337
+
+#define IDI_MAX_ROW_PIC 20
+
+enum SelectionTypes {
+ kSelYesNo,
+ kSelNumber,
+ kSelSpace,
+ kSelAnyKey,
+ kSelBackspace
+};
+
class PreAgiEngine : public AgiBase {
int _gameId;
protected:
- Common::Error go();
void initialize();
-public:
void pollTimer() {}
int getKeypress() { return 0; }
bool isKeypress() { return false; }
@@ -49,10 +65,7 @@ public:
return _gameId;
}
- //SoundMgr *_sound;
PictureMgr *_picture;
- PreAGI_Console *_console;
- GUI::Debugger *getDebugger() { return _console; }
void clearImageStack() {}
void recordImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
@@ -60,8 +73,8 @@ public:
void replayImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
int16 p4, int16 p5, int16 p6, int16 p7) {}
void releaseImageStack() {}
- int saveGame(const char *fileName, const char *saveName) { return -1; }
- int loadGame(const char *fileName, bool checkId = true) { return -1; }
+ int saveGame(const Common::String &fileName, const Common::String &saveName) { return -1; }
+ int loadGame(const Common::String &fileName, bool checkId = true) { return -1; }
// Game
Common::String getTargetName() { return _targetName; }
diff --git a/engines/agi/preagi_common.cpp b/engines/agi/preagi_common.cpp
deleted file mode 100644
index d437dc08f2..0000000000
--- a/engines/agi/preagi_common.cpp
+++ /dev/null
@@ -1,205 +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.
- *
- */
-
-#include "agi/preagi.h"
-#include "agi/graphics.h"
-#include "agi/keyboard.h"
-
-#include "agi/preagi_common.h"
-
-#include "common/events.h"
-
-namespace Agi {
-
-// Screen functions
-void PreAgiEngine::clearScreen(int attr, bool overrideDefault) {
- if (overrideDefault)
- _defaultColor = attr;
-
- _gfx->clearScreen((attr & 0xF0) / 0x10);
-}
-
-void PreAgiEngine::clearGfxScreen(int attr) {
- _gfx->drawRectangle(0, 0, GFX_WIDTH - 1, IDI_MAX_ROW_PIC * 8 -1, (attr & 0xF0) / 0x10);
-}
-
-// String functions
-
-void PreAgiEngine::drawStr(int row, int col, int attr, const char *buffer) {
- int code;
-
- if (attr == kColorDefault)
- attr = _defaultColor;
-
- for (int iChar = 0; iChar < (int)strlen(buffer); iChar++) {
- code = buffer[iChar];
-
- switch (code) {
- case '\n':
- case 0x8D:
- if (++row == 200 / 8) return;
- col = 0;
- break;
-
- case '|':
- // swap attribute nibbles
- break;
-
- default:
- _gfx->putTextCharacter(1, col * 8 , row * 8, static_cast<char>(code), attr & 0x0f, (attr & 0xf0) / 0x10, false, getGameID() == GID_MICKEY ? mickey_fontdata : ibm_fontdata);
-
- if (++col == 320 / 8) {
- col = 0;
- if (++row == 200 / 8) return;
- }
- }
- }
-}
-
-void PreAgiEngine::drawStrMiddle(int row, int attr, const char *buffer) {
- int col = (25 / 2) - (strlen(buffer) / 2); // 25 = 320 / 8 (maximum column)
- drawStr(row, col, attr, buffer);
-}
-
-void PreAgiEngine::clearTextArea() {
- int start = IDI_MAX_ROW_PIC;
-
- if (getGameID() == GID_TROLL)
- start = 21;
-
- for (int row = start; row < 200 / 8; row++) {
- clearRow(row);
- }
-}
-
-void PreAgiEngine::clearRow(int row) {
- drawStr(row, 0, IDA_DEFAULT, " "); // 40 spaces
-}
-
-void PreAgiEngine::printStr(const char* szMsg) {
- clearTextArea();
- drawStr(21, 0, IDA_DEFAULT, szMsg);
- _gfx->doUpdate();
- _system->updateScreen();
-}
-
-void PreAgiEngine::XOR80(char *buffer) {
- for (size_t i = 0; i < strlen(buffer); i++)
- if (buffer[i] & 0x80)
- buffer[i] ^= 0x80;
-}
-
-void PreAgiEngine::printStrXOR(char *szMsg) {
- XOR80(szMsg);
- printStr(szMsg);
-}
-
-// Input functions
-
-int PreAgiEngine::getSelection(SelectionTypes type) {
- Common::Event event;
-
- while (!shouldQuit()) {
- while (_eventMan->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_RTL:
- case Common::EVENT_QUIT:
- return 0;
- case Common::EVENT_RBUTTONUP:
- return 0;
- case Common::EVENT_LBUTTONUP:
- if (type == kSelYesNo || type == kSelAnyKey)
- return 1;
- case Common::EVENT_KEYDOWN:
- if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL) && _console) {
- _console->attach();
- _console->onFrame();
- //FIXME: If not cleared, clicking again will start the console
- event.kbd.keycode = Common::KEYCODE_INVALID;
- event.kbd.flags = 0;
- continue;
- }
- switch (event.kbd.keycode) {
- case Common::KEYCODE_y:
- if (type == kSelYesNo)
- return 1;
- case Common::KEYCODE_n:
- if (type == kSelYesNo)
- return 0;
- case Common::KEYCODE_ESCAPE:
- if (type == kSelNumber || type == kSelAnyKey)
- return 0;
- case Common::KEYCODE_1:
- case Common::KEYCODE_2:
- case Common::KEYCODE_3:
- case Common::KEYCODE_4:
- case Common::KEYCODE_5:
- case Common::KEYCODE_6:
- case Common::KEYCODE_7:
- case Common::KEYCODE_8:
- case Common::KEYCODE_9:
- if (type == kSelNumber)
- return event.kbd.keycode - Common::KEYCODE_1 + 1;
- case Common::KEYCODE_SPACE:
- if (type == kSelSpace)
- return 1;
- case Common::KEYCODE_BACKSPACE:
- if (type == kSelBackspace)
- return 0;
- default:
- if (event.kbd.flags & Common::KBD_CTRL)
- break;
- if (type == kSelYesNo) {
- return 2;
- } else if (type == kSelNumber) {
- return 10;
- } else if (type == kSelAnyKey || type == kSelBackspace) {
- return 1;
- }
- }
- break;
- default:
- break;
- }
- }
- _system->updateScreen();
- _system->delayMillis(10);
- }
- return 0;
-}
-
-void PreAgiEngine::playNote(int16 frequency, int32 length) {
- _speakerStream->play(Audio::PCSpeaker::kWaveFormSquare, frequency, length);
- waitForTimer(length);
-}
-
-void PreAgiEngine::waitForTimer(int msec_delay) {
- uint32 start_time = _system->getMillis();
-
- while (_system->getMillis() < start_time + msec_delay) {
- _gfx->doUpdate();
- _system->updateScreen();
- _system->delayMillis(10);
- }
-}
-
-}
diff --git a/engines/agi/preagi_mickey.cpp b/engines/agi/preagi_mickey.cpp
index 21eb780916..ed4882fcab 100644
--- a/engines/agi/preagi_mickey.cpp
+++ b/engines/agi/preagi_mickey.cpp
@@ -32,7 +32,7 @@
namespace Agi {
-int Mickey::getDat(int iRoom) {
+int MickeyEngine::getDat(int iRoom) {
if (((iRoom > 0) && (iRoom < 24)) || iRoom == 154 || iRoom == 155) return IDI_MSA_PLANET_EARTH;
if ((iRoom >= 30) && (iRoom <= 39)) return IDI_MSA_PLANET_VENUS;
if ((iRoom >= 40) && (iRoom <= 69)) return IDI_MSA_PLANET_NEPTUNE;
@@ -45,7 +45,7 @@ int Mickey::getDat(int iRoom) {
return IDI_MSA_PLANET_SPACESHIP;
}
-void Mickey::readExe(int ofs, uint8 *buffer, long buflen) {
+void MickeyEngine::readExe(int ofs, uint8 *buffer, long buflen) {
Common::File infile;
if (!infile.open("mickey.exe"))
return;
@@ -54,11 +54,11 @@ void Mickey::readExe(int ofs, uint8 *buffer, long buflen) {
infile.close();
}
-void Mickey::getDatFileName(int iRoom, char *szFile) {
+void MickeyEngine::getDatFileName(int iRoom, char *szFile) {
sprintf(szFile, IDS_MSA_PATH_DAT, IDS_MSA_NAME_DAT[getDat(iRoom)]);
}
-void Mickey::readDatHdr(char *szFile, MSA_DAT_HEADER *hdr) {
+void MickeyEngine::readDatHdr(char *szFile, MSA_DAT_HEADER *hdr) {
Common::File infile;
if (!infile.open(szFile))
@@ -83,7 +83,7 @@ void Mickey::readDatHdr(char *szFile, MSA_DAT_HEADER *hdr) {
infile.close();
}
-void Mickey::readOfsData(int offset, int iItem, uint8 *buffer, long buflen) {
+void MickeyEngine::readOfsData(int offset, int iItem, uint8 *buffer, long buflen) {
uint16 ofs[256];
readExe(offset, buffer, buflen);
@@ -97,11 +97,11 @@ void Mickey::readOfsData(int offset, int iItem, uint8 *buffer, long buflen) {
// User Interface
-bool Mickey::chooseY_N(int ofsPrompt, bool fErrorMsg) {
+bool MickeyEngine::chooseY_N(int ofsPrompt, bool fErrorMsg) {
printExeStr(ofsPrompt);
- while (!_vm->shouldQuit()) {
- switch (_vm->getSelection(kSelYesNo)) {
+ while (!shouldQuit()) {
+ switch (getSelection(kSelYesNo)) {
case 0: return false;
case 1: return true;
default:
@@ -117,15 +117,15 @@ bool Mickey::chooseY_N(int ofsPrompt, bool fErrorMsg) {
return false;
}
-int Mickey::choose1to9(int ofsPrompt) {
+int MickeyEngine::choose1to9(int ofsPrompt) {
int answer = 0;
printExeStr(ofsPrompt);
- while (!_vm->shouldQuit()) {
- answer = _vm->getSelection(kSelNumber);
+ while (!shouldQuit()) {
+ answer = getSelection(kSelNumber);
if (answer == 10) {
printExeStr(IDO_MSA_PRESS_1_TO_9);
- if (_vm->getSelection(kSelAnyKey) == 0)
+ if (getSelection(kSelAnyKey) == 0)
return 0;
printExeStr(ofsPrompt);
} else return answer;
@@ -134,38 +134,36 @@ int Mickey::choose1to9(int ofsPrompt) {
return 0;
}
-void Mickey::printStr(char *buffer) {
+void MickeyEngine::printStr(char *buffer) {
int pc = 1;
int nRows, iCol, iRow;
nRows = *buffer + IDI_MSA_ROW_MENU_0;
- _vm->clearTextArea();
+ clearTextArea();
for (iRow = IDI_MSA_ROW_MENU_0; iRow < nRows; iRow++) {
iCol = *(buffer + pc++);
- _vm->drawStr(iRow, iCol, IDA_DEFAULT, buffer + pc);
+ drawStr(iRow, iCol, IDA_DEFAULT, buffer + pc);
pc += strlen(buffer + pc) + 1;
}
// Show the string on screen
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
+ _gfx->doUpdate();
}
-void Mickey::printLine(const char *buffer) {
- _vm->clearTextArea();
+void MickeyEngine::printLine(const char *buffer) {
+ clearTextArea();
- _vm->drawStr(22, 18 - strlen(buffer) / 2, IDA_DEFAULT, buffer);
+ drawStr(22, 18 - strlen(buffer) / 2, IDA_DEFAULT, buffer);
// Show the string on screen
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
+ _gfx->doUpdate();
waitAnyKey(true);
}
-void Mickey::printExeStr(int ofs) {
+void MickeyEngine::printExeStr(int ofs) {
uint8 buffer[256] = {0};
if (!ofs)
@@ -175,7 +173,7 @@ void Mickey::printExeStr(int ofs) {
printStr((char *)buffer);
}
-void Mickey::printExeMsg(int ofs) {
+void MickeyEngine::printExeMsg(int ofs) {
if (!ofs)
return;
@@ -183,9 +181,9 @@ void Mickey::printExeMsg(int ofs) {
waitAnyKey(true);
}
-void Mickey::printDatString(int iStr) {
+void MickeyEngine::printDatString(int iStr) {
char buffer[256];
- int iDat = getDat(_game.iRoom);
+ int iDat = getDat(_gameStateMickey.iRoom);
MSA_DAT_HEADER hdr;
char szFile[256] = {0};
@@ -205,7 +203,7 @@ void Mickey::printDatString(int iStr) {
printStr(buffer);
}
-void Mickey::printDesc(int iRoom) {
+void MickeyEngine::printDesc(int iRoom) {
MSA_DAT_HEADER hdr;
char szFile[256] = {0};
@@ -228,20 +226,20 @@ void Mickey::printDesc(int iRoom) {
free(buffer);
}
-bool Mickey::checkMenu() {
+bool MickeyEngine::checkMenu() {
MSA_MENU menu;
int iSel0, iSel1;
MSA_DAT_HEADER hdr;
char szFile[256] = {0};
Common::File infile;
- getDatFileName(_game.iRoom, szFile);
+ getDatFileName(_gameStateMickey.iRoom, szFile);
readDatHdr(szFile, &hdr);
if (!infile.open(szFile))
return false;
char *buffer = new char[sizeof(MSA_MENU)];
- infile.seek(hdr.ofsRoom[_game.iRoom - 1] + IDI_MSA_OFS_DAT, SEEK_SET);
+ infile.seek(hdr.ofsRoom[_gameStateMickey.iRoom - 1] + IDI_MSA_OFS_DAT, SEEK_SET);
infile.read((uint8 *)buffer, sizeof(MSA_MENU));
infile.close();
@@ -255,7 +253,7 @@ bool Mickey::checkMenu() {
return parse(menu.cmd[iSel0].data[iSel1], menu.arg[iSel0].data[iSel1]);
}
-void Mickey::drawMenu(MSA_MENU menu, int sel0, int sel1) {
+void MickeyEngine::drawMenu(MSA_MENU menu, int sel0, int sel1) {
int iWord;
int iRow;
int sel;
@@ -263,7 +261,7 @@ void Mickey::drawMenu(MSA_MENU menu, int sel0, int sel1) {
// draw menu
- _vm->clearTextArea();
+ clearTextArea();
for (iRow = 0; iRow < 2; iRow++) {
for (iWord = 0; iWord < menu.row[iRow].count; iWord++) {
@@ -277,17 +275,16 @@ void Mickey::drawMenu(MSA_MENU menu, int sel0, int sel1) {
else
attr = IDA_DEFAULT;
- _vm->drawStr(IDI_MSA_ROW_MENU_0 + iRow, menu.row[iRow].entry[iWord].x0,
+ drawStr(IDI_MSA_ROW_MENU_0 + iRow, menu.row[iRow].entry[iWord].x0,
attr, (char *)menu.row[iRow].entry[iWord].szText);
}
}
// Menu created, show it on screen
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
+ _gfx->doUpdate();
}
-void Mickey::getMouseMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow, int x, int y) {
+void MickeyEngine::getMouseMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow, int x, int y) {
int iWord;
int *sel = 0;
@@ -314,7 +311,7 @@ void Mickey::getMouseMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow, i
}
}
-bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
+bool MickeyEngine::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
Common::Event event;
int *sel = 0;
int nWords;
@@ -357,8 +354,8 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
drawMenu(menu, *sel0, *sel1);
- while (!_vm->shouldQuit()) {
- while (_vm->_system->getEventManager()->pollEvent(event)) {
+ while (!shouldQuit()) {
+ while (_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
@@ -376,18 +373,18 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
// Change cursor
if (northIndex >= 0 && (event.mouse.x >= 20 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2) &&
(event.mouse.y >= 0 && event.mouse.y <= 10)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else if (southIndex >= 0 && (event.mouse.x >= 20 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2) &&
(event.mouse.y >= IDI_MSA_PIC_HEIGHT - 10 && event.mouse.y <= IDI_MSA_PIC_HEIGHT)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else if (westIndex >= 0 && (event.mouse.y >= 0 && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
(event.mouse.x >= 20 && event.mouse.x <= 30)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else if (eastIndex >= 0 && (event.mouse.y >= 0 && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
(event.mouse.x >= IDI_MSA_PIC_WIDTH * 2 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else {
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
}
}
break;
@@ -400,7 +397,7 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
drawMenu(menu, *sel0, *sel1);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
_clickToMove = true;
} else if (southIndex >= 0 && (event.mouse.x >= 20 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2) &&
(event.mouse.y >= IDI_MSA_PIC_HEIGHT - 10 && event.mouse.y <= IDI_MSA_PIC_HEIGHT)) {
@@ -409,7 +406,7 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
drawMenu(menu, *sel0, *sel1);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
_clickToMove = true;
} else if (westIndex >= 0 && (event.mouse.y >= 0 && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
(event.mouse.x >= 20 && event.mouse.x <= 30)) {
@@ -418,7 +415,7 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
drawMenu(menu, *sel0, *sel1);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
_clickToMove = true;
} else if (eastIndex >= 0 && (event.mouse.y >= 0 && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
(event.mouse.x >= IDI_MSA_PIC_WIDTH * 2 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2)) {
@@ -427,10 +424,10 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
drawMenu(menu, *sel0, *sel1);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
_clickToMove = true;
} else {
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
}
return true;
case Common::EVENT_RBUTTONUP:
@@ -458,20 +455,20 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
}
break;
case Common::EVENT_KEYDOWN:
- if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL) && _vm->_console) {
- _vm->_console->attach();
- _vm->_console->onFrame();
+ if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL) && _console) {
+ _console->attach();
+ _console->onFrame();
continue;
}
switch (event.kbd.keycode) {
case Common::KEYCODE_2:
// Hidden message
- if (_game.iRoom == IDI_MSA_PIC_MERCURY_CAVE_0) {
+ if (_gameStateMickey.iRoom == IDI_MSA_PIC_MERCURY_CAVE_0) {
for (int i = 0; i < 5; i++) {
printExeMsg(IDO_MSA_HIDDEN_MSG[i]);
}
- _vm->clearTextArea();
+ clearTextArea();
waitAnyKey();
}
break;
@@ -489,7 +486,7 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
return false;
case Common::KEYCODE_s:
- _vm->flipflag(fSoundOn);
+ flipflag(fSoundOn);
break;
case Common::KEYCODE_c:
inventory();
@@ -552,7 +549,7 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
return false;
}
-void Mickey::getMenuSel(char *buffer, int *sel0, int *sel1) {
+void MickeyEngine::getMenuSel(char *buffer, int *sel0, int *sel1) {
MSA_MENU menu;
memcpy(&menu, buffer, sizeof(MSA_MENU));
@@ -563,8 +560,8 @@ void Mickey::getMenuSel(char *buffer, int *sel0, int *sel1) {
// Show the mouse cursor for the menu
CursorMan.showMouse(true);
- while (!_vm->shouldQuit()) {
- while (!_vm->shouldQuit()) {
+ while (!shouldQuit()) {
+ while (!shouldQuit()) {
if (getMenuSelRow(menu, sel0, sel1, 0)) {
if (_clickToMove)
break;
@@ -586,7 +583,7 @@ void Mickey::getMenuSel(char *buffer, int *sel0, int *sel1) {
CursorMan.showMouse(false);
}
-void Mickey::centerMenu(MSA_MENU *menu) {
+void MickeyEngine::centerMenu(MSA_MENU *menu) {
int iWord;
int iRow;
int w, x;
@@ -606,19 +603,19 @@ void Mickey::centerMenu(MSA_MENU *menu) {
}
}
-void Mickey::patchMenu(MSA_MENU *menu) {
+void MickeyEngine::patchMenu(MSA_MENU *menu) {
uint8 buffer[512];
uint8 menubuf[sizeof(MSA_MENU)];
int nPatches;
int pBuf = 0;
// change planet name in ship airlock menu
- if (_game.iRoom == IDI_MSA_PIC_SHIP_AIRLOCK) {
- strcpy((char *)menu->row[1].entry[2].szText, IDS_MSA_NAME_PLANET[_game.iPlanet]);
+ if (_gameStateMickey.iRoom == IDI_MSA_PIC_SHIP_AIRLOCK) {
+ strcpy((char *)menu->row[1].entry[2].szText, IDS_MSA_NAME_PLANET[_gameStateMickey.iPlanet]);
}
// exit if fix unnecessary
- if (!_game.iRmMenu[_game.iRoom]) {
+ if (!_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
centerMenu(menu);
return;
}
@@ -629,7 +626,7 @@ void Mickey::patchMenu(MSA_MENU *menu) {
// read patches
readOfsData(
IDOFS_MSA_MENU_PATCHES,
- _game.nRmMenu[_game.iRoom] + _game.iRmMenu[_game.iRoom] - 1,
+ _gameStateMickey.nRmMenu[_gameStateMickey.iRoom] + _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] - 1,
buffer, sizeof(buffer)
);
@@ -652,24 +649,24 @@ void Mickey::patchMenu(MSA_MENU *menu) {
centerMenu(menu);
}
-void Mickey::printDatMessage(int iStr) {
+void MickeyEngine::printDatMessage(int iStr) {
printDatString(iStr);
waitAnyKey(true);
}
// Sound
-void Mickey::playNote(MSA_SND_NOTE note) {
+void MickeyEngine::playNote(MSA_SND_NOTE note) {
if (!note.counter) {
// Pause
- _vm->_system->delayMillis((uint) (note.length / IDI_SND_TIMER_RESOLUTION));
+ _system->delayMillis((uint) (note.length / IDI_SND_TIMER_RESOLUTION));
} else {
- _vm->playNote(IDI_SND_OSCILLATOR_FREQUENCY / note.counter, (int32) (note.length / IDI_SND_TIMER_RESOLUTION));
+ PreAgiEngine::playNote(IDI_SND_OSCILLATOR_FREQUENCY / note.counter, (int32) (note.length / IDI_SND_TIMER_RESOLUTION));
}
}
-void Mickey::playSound(ENUM_MSA_SOUND iSound) {
- if (!_vm->getflag(fSoundOn))
+void MickeyEngine::playSound(ENUM_MSA_SOUND iSound) {
+ if (!getflag(fSoundOn))
return;
Common::Event event;
@@ -680,7 +677,7 @@ void Mickey::playSound(ENUM_MSA_SOUND iSound) {
switch (iSound) {
case IDI_MSA_SND_XL30:
for (int iNote = 0; iNote < 6; iNote++) {
- note.counter = _vm->rnd(59600) + 59;
+ note.counter = rnd(59600) + 59;
note.length = 4;
playNote(note);
}
@@ -698,7 +695,7 @@ void Mickey::playSound(ENUM_MSA_SOUND iSound) {
pBuf += 3;
if (iSound == IDI_MSA_SND_THEME) {
- while (_vm->_system->getEventManager()->pollEvent(event)) {
+ while (_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
@@ -722,7 +719,7 @@ void Mickey::playSound(ENUM_MSA_SOUND iSound) {
// Graphics
-void Mickey::drawObj(ENUM_MSA_OBJECT iObj, int x0, int y0) {
+void MickeyEngine::drawObj(ENUM_MSA_OBJECT iObj, int x0, int y0) {
char szFile[255] = {0};
sprintf(szFile, IDS_MSA_PATH_OBJ, IDS_MSA_NAME_OBJ[iObj]);
@@ -736,15 +733,15 @@ void Mickey::drawObj(ENUM_MSA_OBJECT iObj, int x0, int y0) {
file.close();
if (iObj == IDI_MSA_OBJECT_CRYSTAL)
- _vm->_picture->setPictureFlags(kPicFStep);
+ _picture->setPictureFlags(kPicFStep);
- _vm->_picture->setOffset(x0, y0);
- _vm->_picture->decodePicture(buffer, size, false, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
- _vm->_picture->setOffset(0, 0);
- _vm->_picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
+ _picture->setOffset(x0, y0);
+ _picture->decodePicture(buffer, size, false, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
+ _picture->setOffset(0, 0);
+ _picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
}
-void Mickey::drawPic(int iPic) {
+void MickeyEngine::drawPic(int iPic) {
char szFile[255] = {0};
sprintf(szFile, IDS_MSA_PATH_PIC, iPic);
@@ -758,16 +755,16 @@ void Mickey::drawPic(int iPic) {
file.close();
// Note that decodePicture clears the screen
- _vm->_picture->decodePicture(buffer, size, true, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
- _vm->_picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
+ _picture->decodePicture(buffer, size, true, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
+ _picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
}
-void Mickey::drawRoomAnimation() {
+void MickeyEngine::drawRoomAnimation() {
uint8 objLight[] = {
0xF0, 1, 0xF9, 2, 43, 45, 0xFF
};
- switch (_game.iRoom) {
+ switch (_gameStateMickey.iRoom) {
case IDI_MSA_PIC_EARTH_SHIP:
case IDI_MSA_PIC_VENUS_SHIP:
case IDI_MSA_PIC_NEPTUNE_SHIP:
@@ -790,26 +787,26 @@ void Mickey::drawRoomAnimation() {
uint8 iColor = 0;
- _vm->_picture->setPattern(2, 0);
+ _picture->setPattern(2, 0);
for (int i = 0; i < 12; i++) {
- iColor = _game.nFrame + i;
+ iColor = _gameStateMickey.nFrame + i;
if (iColor > 15)
iColor -= 15;
objLight[1] = iColor;
objLight[4] += 7;
- _vm->_picture->setPictureData(objLight);
- _vm->_picture->setPictureFlags(kPicFCircle);
- _vm->_picture->drawPicture();
+ _picture->setPictureData(objLight);
+ _picture->setPictureFlags(kPicFCircle);
+ _picture->drawPicture();
}
- _vm->_picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
+ _picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
- _game.nFrame--;
- if (_game.nFrame < 0)
- _game.nFrame = 15;
+ _gameStateMickey.nFrame--;
+ if (_gameStateMickey.nFrame < 0)
+ _gameStateMickey.nFrame = 15;
playSound(IDI_MSA_SND_PRESS_BLUE);
}
@@ -818,12 +815,12 @@ void Mickey::drawRoomAnimation() {
case IDI_MSA_PIC_SHIP_CONTROLS:
// draw XL30 screen
- if (_game.fAnimXL30) {
- if (_game.nFrame > 5)
- _game.nFrame = 0;
+ if (_gameStateMickey.fAnimXL30) {
+ if (_gameStateMickey.nFrame > 5)
+ _gameStateMickey.nFrame = 0;
- drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_XL31 + _game.nFrame), 0, 4);
- _game.nFrame++;
+ drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_XL31 + _gameStateMickey.nFrame), 0, 4);
+ _gameStateMickey.nFrame++;
};
break;
@@ -831,17 +828,17 @@ void Mickey::drawRoomAnimation() {
default:
// draw crystal
- if (_game.iRoom == IDI_MSA_XTAL_ROOM_XY[_game.iPlanet][0]) {
- if (!_game.fHasXtal) {
- switch (_game.iPlanet) {
+ if (_gameStateMickey.iRoom == IDI_MSA_XTAL_ROOM_XY[_gameStateMickey.iPlanet][0]) {
+ if (!_gameStateMickey.fHasXtal) {
+ switch (_gameStateMickey.iPlanet) {
case IDI_MSA_PLANET_VENUS:
- if (_game.iRmMenu[_game.iRoom] != 2)
+ if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] != 2)
break;
default:
drawObj(
IDI_MSA_OBJECT_CRYSTAL,
- IDI_MSA_XTAL_ROOM_XY[_game.iPlanet][1],
- IDI_MSA_XTAL_ROOM_XY[_game.iPlanet][2]
+ IDI_MSA_XTAL_ROOM_XY[_gameStateMickey.iPlanet][1],
+ IDI_MSA_XTAL_ROOM_XY[_gameStateMickey.iPlanet][2]
);
break;
}
@@ -852,36 +849,36 @@ void Mickey::drawRoomAnimation() {
}
}
-void Mickey::drawRoom() {
+void MickeyEngine::drawRoom() {
uint8 buffer[256];
int pBuf = 0;
int nObjs;
// Draw room picture
- if (_game.iRoom == IDI_MSA_PIC_TITLE) {
+ if (_gameStateMickey.iRoom == IDI_MSA_PIC_TITLE) {
drawPic(IDI_MSA_PIC_TITLE);
} else {
- drawPic(_game.iRmPic[_game.iRoom]);
+ drawPic(_gameStateMickey.iRmPic[_gameStateMickey.iRoom]);
- if (_game.iRoom == IDI_MSA_PIC_SHIP_CONTROLS) {
+ if (_gameStateMickey.iRoom == IDI_MSA_PIC_SHIP_CONTROLS) {
// Draw ship control room window
- if (_game.fFlying) {
+ if (_gameStateMickey.fFlying) {
drawObj(IDI_MSA_OBJECT_W_SPACE, 0, 0);
} else {
- drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_W_EARTH + _game.iPlanet), 0, 1);
+ drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_W_EARTH + _gameStateMickey.iPlanet), 0, 1);
}
}
}
// Draw room objects
- if (_game.iRoom >= IDI_MSA_MAX_PIC_ROOM) {
+ if (_gameStateMickey.iRoom >= IDI_MSA_MAX_PIC_ROOM) {
drawRoomAnimation();
return;
}
- if (_game.iRmObj[_game.iRoom] != IDI_MSA_OBJECT_NONE) {
+ if (_gameStateMickey.iRmObj[_gameStateMickey.iRoom] != IDI_MSA_OBJECT_NONE) {
readOfsData(IDO_MSA_ROOM_OBJECT_XY_OFFSETS,
- _game.iRmObj[_game.iRoom], buffer, sizeof(buffer));
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom], buffer, sizeof(buffer));
nObjs = buffer[pBuf++];
@@ -914,7 +911,7 @@ const uint8 colorBCG[16][2] = {
{ 0xFF, 0xFF } // F (white, white)
};
-void Mickey::drawLogo() {
+void MickeyEngine::drawLogo() {
// TODO: clean this up and make it work properly, the logo is drawn way off to the right
#if 0
char szFile[256] = {0};
@@ -937,7 +934,7 @@ void Mickey::drawLogo() {
// draw logo bitmap
memcpy(bitmap, buffer, sizeof(bitmap));
- _vm->_picture->setDimensions(w, h);
+ _picture->setDimensions(w, h);
// Show BCG picture
for (int y = 0; y < h; y++) {
@@ -947,40 +944,40 @@ void Mickey::drawLogo() {
color3 = colorBCG[ bitmap[y][x] & 0x0f][0]; // foreground
color4 = colorBCG[ bitmap[y][x] & 0x0f][1]; // foreground
- _vm->_picture->putPixel(x * 4 - xoffset, y, color);
- _vm->_picture->putPixel(x * 4 + 1 - xoffset, y, color2);
- _vm->_picture->putPixel(x * 4 + 2 - xoffset, y, color3);
- _vm->_picture->putPixel(x * 4 + 3 - xoffset, y, color4);
- _vm->_picture->putPixel(x * 4 - xoffset, y + 1, color);
- _vm->_picture->putPixel(x * 4 + 1 - xoffset, y + 1, color2);
- _vm->_picture->putPixel(x * 4 + 2 - xoffset, y + 1, color3);
- _vm->_picture->putPixel(x * 4 + 3 - xoffset, y + 1, color4);
+ _picture->putPixel(x * 4 - xoffset, y, color);
+ _picture->putPixel(x * 4 + 1 - xoffset, y, color2);
+ _picture->putPixel(x * 4 + 2 - xoffset, y, color3);
+ _picture->putPixel(x * 4 + 3 - xoffset, y, color4);
+ _picture->putPixel(x * 4 - xoffset, y + 1, color);
+ _picture->putPixel(x * 4 + 1 - xoffset, y + 1, color2);
+ _picture->putPixel(x * 4 + 2 - xoffset, y + 1, color3);
+ _picture->putPixel(x * 4 + 3 - xoffset, y + 1, color4);
}
}
- _vm->_picture->showPic(10, 10, w, h);
+ _picture->showPic(10, 10, w, h);
delete[] buffer;
#endif
}
-void Mickey::animate() {
- _vm->_system->delayMillis(IDI_MSA_ANIM_DELAY);
+void MickeyEngine::animate() {
+ _system->delayMillis(IDI_MSA_ANIM_DELAY);
drawRoomAnimation();
}
-void Mickey::printRoomDesc() {
+void MickeyEngine::printRoomDesc() {
// print room description
- printDesc(_game.iRoom);
+ printDesc(_gameStateMickey.iRoom);
waitAnyKey(true);
// print extended room description
- if (_game.oRmTxt[_game.iRoom]) {
- printExeMsg(_game.oRmTxt[_game.iRoom] + IDI_MSA_OFS_EXE);
+ if (_gameStateMickey.oRmTxt[_gameStateMickey.iRoom]) {
+ printExeMsg(_gameStateMickey.oRmTxt[_gameStateMickey.iRoom] + IDI_MSA_OFS_EXE);
}
}
-bool Mickey::loadGame() {
+bool MickeyEngine::loadGame() {
Common::InSaveFile *infile;
char szFile[256] = {0};
bool diskerror = true;
@@ -994,15 +991,15 @@ bool Mickey::loadGame() {
return false;
// load game
- sprintf(szFile, "%s.s%02d", _vm->getTargetName().c_str(), sel);
- if (!(infile = _vm->getSaveFileMan()->openForLoading(szFile))) {
+ sprintf(szFile, "%s.s%02d", getTargetName().c_str(), sel);
+ if (!(infile = getSaveFileMan()->openForLoading(szFile))) {
printLine("PLEASE CHECK THE DISK DRIVE");
- if (_vm->getSelection(kSelAnyKey) == 0)
+ if (getSelection(kSelAnyKey) == 0)
return false;
} else {
if (infile->readUint32BE() != MKTAG('M','I','C','K')) {
- warning("Mickey::loadGame wrong save game format");
+ warning("MickeyEngine::loadGame wrong save game format");
return false;
}
@@ -1015,61 +1012,61 @@ bool Mickey::loadGame() {
if (saveVersion != MSA_SAVEGAME_VERSION)
warning("Old save game version (%d, current version is %d). Will try and read anyway, but don't be surprised if bad things happen", saveVersion, MSA_SAVEGAME_VERSION);
- _game.iRoom = infile->readByte();
- _game.iPlanet = infile->readByte();
- _game.iDisk = infile->readByte();
+ _gameStateMickey.iRoom = infile->readByte();
+ _gameStateMickey.iPlanet = infile->readByte();
+ _gameStateMickey.iDisk = infile->readByte();
- _game.nAir = infile->readByte();
- _game.nButtons = infile->readByte();
- _game.nRocks = infile->readByte();
+ _gameStateMickey.nAir = infile->readByte();
+ _gameStateMickey.nButtons = infile->readByte();
+ _gameStateMickey.nRocks = infile->readByte();
- _game.nXtals = infile->readByte();
+ _gameStateMickey.nXtals = infile->readByte();
for (i = 0; i < IDI_MSA_MAX_DAT; i++)
- _game.iPlanetXtal[i] = infile->readByte();
+ _gameStateMickey.iPlanetXtal[i] = infile->readByte();
for (i = 0; i < IDI_MSA_MAX_PLANET; i++)
- _game.iClue[i] = infile->readUint16LE();
+ _gameStateMickey.iClue[i] = infile->readUint16LE();
- infile->read(_game.szAddr, IDI_MSA_MAX_BUTTON + 1);
+ infile->read(_gameStateMickey.szAddr, IDI_MSA_MAX_BUTTON + 1);
- _game.fHasXtal = infile->readByte() == 1;
- _game.fIntro = infile->readByte() == 1;
- _game.fSuit = infile->readByte() == 1;
- _game.fShipDoorOpen = infile->readByte() == 1;
- _game.fFlying = infile->readByte() == 1;
- _game.fStoryShown = infile->readByte() == 1;
- _game.fPlanetsInitialized = infile->readByte() == 1;
- _game.fTempleDoorOpen = infile->readByte() == 1;
- _game.fAnimXL30 = infile->readByte() == 1;
+ _gameStateMickey.fHasXtal = infile->readByte() == 1;
+ _gameStateMickey.fIntro = infile->readByte() == 1;
+ _gameStateMickey.fSuit = infile->readByte() == 1;
+ _gameStateMickey.fShipDoorOpen = infile->readByte() == 1;
+ _gameStateMickey.fFlying = infile->readByte() == 1;
+ _gameStateMickey.fStoryShown = infile->readByte() == 1;
+ _gameStateMickey.fPlanetsInitialized = infile->readByte() == 1;
+ _gameStateMickey.fTempleDoorOpen = infile->readByte() == 1;
+ _gameStateMickey.fAnimXL30 = infile->readByte() == 1;
for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
- _game.fItem[i] = infile->readByte() == 1;
+ _gameStateMickey.fItem[i] = infile->readByte() == 1;
for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
- _game.fItemUsed[i] = infile->readByte() == 1;
+ _gameStateMickey.fItemUsed[i] = infile->readByte() == 1;
for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
- _game.iItem[i] = infile->readSByte();
+ _gameStateMickey.iItem[i] = infile->readSByte();
- _game.nItems = infile->readByte();
+ _gameStateMickey.nItems = infile->readByte();
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- _game.iRmObj[i] = infile->readSByte();
+ _gameStateMickey.iRmObj[i] = infile->readSByte();
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- _game.iRmPic[i] = infile->readByte();
+ _gameStateMickey.iRmPic[i] = infile->readByte();
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- _game.oRmTxt[i] = infile->readUint16LE();
+ _gameStateMickey.oRmTxt[i] = infile->readUint16LE();
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- _game.iRmMenu[i] = infile->readByte();
+ _gameStateMickey.iRmMenu[i] = infile->readByte();
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- _game.nRmMenu[i] = infile->readByte();
+ _gameStateMickey.nRmMenu[i] = infile->readByte();
- _game.nFrame = infile->readSByte();
+ _gameStateMickey.nFrame = infile->readSByte();
diskerror = false;
delete infile;
@@ -1080,7 +1077,7 @@ bool Mickey::loadGame() {
return true;
}
-void Mickey::saveGame() {
+void MickeyEngine::saveGame() {
Common::OutSaveFile* outfile;
char szFile[256] = {0};
bool diskerror = true;
@@ -1094,7 +1091,7 @@ void Mickey::saveGame() {
else
printExeStr(IDO_MSA_SAVE_GAME[2]);
- if (_vm->getSelection(kSelAnyKey) == 0)
+ if (getSelection(kSelAnyKey) == 0)
return;
while (diskerror) {
@@ -1107,75 +1104,75 @@ void Mickey::saveGame() {
else
printExeStr(IDO_MSA_SAVE_GAME[4]);
- if (_vm->getSelection(kSelAnyKey) == 0)
+ if (getSelection(kSelAnyKey) == 0)
return;
// save game
- sprintf(szFile, "%s.s%02d", _vm->getTargetName().c_str(), sel);
- if (!(outfile = _vm->getSaveFileMan()->openForSaving(szFile))) {
+ sprintf(szFile, "%s.s%02d", getTargetName().c_str(), sel);
+ if (!(outfile = getSaveFileMan()->openForSaving(szFile))) {
printLine("PLEASE CHECK THE DISK DRIVE");
- if (_vm->getSelection(kSelAnyKey) == 0)
+ if (getSelection(kSelAnyKey) == 0)
return;
} else {
outfile->writeUint32BE(MKTAG('M','I','C','K')); // header
outfile->writeByte(MSA_SAVEGAME_VERSION);
- outfile->writeByte(_game.iRoom);
- outfile->writeByte(_game.iPlanet);
- outfile->writeByte(_game.iDisk);
+ outfile->writeByte(_gameStateMickey.iRoom);
+ outfile->writeByte(_gameStateMickey.iPlanet);
+ outfile->writeByte(_gameStateMickey.iDisk);
- outfile->writeByte(_game.nAir);
- outfile->writeByte(_game.nButtons);
- outfile->writeByte(_game.nRocks);
+ outfile->writeByte(_gameStateMickey.nAir);
+ outfile->writeByte(_gameStateMickey.nButtons);
+ outfile->writeByte(_gameStateMickey.nRocks);
- outfile->writeByte(_game.nXtals);
+ outfile->writeByte(_gameStateMickey.nXtals);
for (i = 0; i < IDI_MSA_MAX_DAT; i++)
- outfile->writeByte(_game.iPlanetXtal[i]);
+ outfile->writeByte(_gameStateMickey.iPlanetXtal[i]);
for (i = 0; i < IDI_MSA_MAX_PLANET; i++)
- outfile->writeUint16LE(_game.iClue[i]);
+ outfile->writeUint16LE(_gameStateMickey.iClue[i]);
- outfile->write(_game.szAddr, IDI_MSA_MAX_BUTTON + 1);
+ outfile->write(_gameStateMickey.szAddr, IDI_MSA_MAX_BUTTON + 1);
- outfile->writeByte(_game.fHasXtal ? 1 : 0);
- outfile->writeByte(_game.fIntro ? 1 : 0);
- outfile->writeByte(_game.fSuit ? 1 : 0);
- outfile->writeByte(_game.fShipDoorOpen ? 1 : 0);
- outfile->writeByte(_game.fFlying ? 1 : 0);
- outfile->writeByte(_game.fStoryShown ? 1 : 0);
- outfile->writeByte(_game.fPlanetsInitialized ? 1 : 0);
- outfile->writeByte(_game.fTempleDoorOpen ? 1 : 0);
- outfile->writeByte(_game.fAnimXL30 ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fHasXtal ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fIntro ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fSuit ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fShipDoorOpen ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fFlying ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fStoryShown ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fPlanetsInitialized ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fTempleDoorOpen ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fAnimXL30 ? 1 : 0);
for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
- outfile->writeByte(_game.fItem[i] ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fItem[i] ? 1 : 0);
for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
- outfile->writeByte(_game.fItemUsed[i] ? 1 : 0);
+ outfile->writeByte(_gameStateMickey.fItemUsed[i] ? 1 : 0);
for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
- outfile->writeSByte(_game.iItem[i]);
+ outfile->writeSByte(_gameStateMickey.iItem[i]);
- outfile->writeByte(_game.nItems);
+ outfile->writeByte(_gameStateMickey.nItems);
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- outfile->writeSByte(_game.iRmObj[i]);
+ outfile->writeSByte(_gameStateMickey.iRmObj[i]);
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- outfile->writeByte(_game.iRmPic[i]);
+ outfile->writeByte(_gameStateMickey.iRmPic[i]);
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- outfile->writeUint16LE(_game.oRmTxt[i]);
+ outfile->writeUint16LE(_gameStateMickey.oRmTxt[i]);
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- outfile->writeByte(_game.iRmMenu[i]);
+ outfile->writeByte(_gameStateMickey.iRmMenu[i]);
for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
- outfile->writeByte(_game.nRmMenu[i]);
+ outfile->writeByte(_gameStateMickey.nRmMenu[i]);
- outfile->writeSByte(_game.nFrame);
+ outfile->writeSByte(_gameStateMickey.nFrame);
outfile->finalize();
@@ -1190,14 +1187,14 @@ void Mickey::saveGame() {
printExeMsg(IDO_MSA_SAVE_GAME[6]);
}
-void Mickey::showPlanetInfo() {
+void MickeyEngine::showPlanetInfo() {
for (int i = 0; i < 4; i++) {
- printExeStr(IDO_MSA_PLANET_INFO[_game.iPlanet][i]);
+ printExeStr(IDO_MSA_PLANET_INFO[_gameStateMickey.iPlanet][i]);
waitAnyKey();
}
}
-void Mickey::printStory() {
+void MickeyEngine::printStory() {
char buffer[IDI_MSA_LEN_STORY] = {0};
char szLine[41] = {0};
int iRow;
@@ -1205,37 +1202,37 @@ void Mickey::printStory() {
readExe(IDO_MSA_GAME_STORY, (uint8 *)buffer, sizeof(buffer));
- _vm->clearScreen(IDA_DEFAULT);
+ clearScreen(IDA_DEFAULT);
for (iRow = 0; iRow < 25; iRow++) {
strcpy(szLine, buffer + pBuf);
- _vm->drawStr(iRow, 0, IDA_DEFAULT, szLine);
+ drawStr(iRow, 0, IDA_DEFAULT, szLine);
pBuf += strlen(szLine) + 1;
}
waitAnyKey();
- _vm->clearScreen(IDA_DEFAULT);
+ clearScreen(IDA_DEFAULT);
for (iRow = 0; iRow < 21; iRow++) {
strcpy(szLine, buffer + pBuf);
- _vm->drawStr(iRow, 0, IDA_DEFAULT, szLine);
+ drawStr(iRow, 0, IDA_DEFAULT, szLine);
pBuf += strlen(szLine) + 1;
}
waitAnyKey();
//Set back to black
- _vm->_gfx->clearScreen(0);
- _vm->_gfx->doUpdate();
+ _gfx->clearScreen(0);
+ _gfx->doUpdate();
drawRoom();
- _game.fStoryShown = true;
+ _gameStateMickey.fStoryShown = true;
}
-int Mickey::getPlanet() {
- if (!_game.nButtons)
+int MickeyEngine::getPlanet() {
+ if (!_gameStateMickey.nButtons)
return -1;
for (int iPlanet = 0; iPlanet < IDI_MSA_MAX_DAT - 1; iPlanet++) {
- if (!strcmp(IDS_MSA_ADDR_PLANET[iPlanet], _game.szAddr)) {
+ if (!strcmp(IDS_MSA_ADDR_PLANET[iPlanet], _gameStateMickey.szAddr)) {
return iPlanet;
}
}
@@ -1243,49 +1240,49 @@ int Mickey::getPlanet() {
return -1;
}
-void Mickey::pressOB(int iButton) {
+void MickeyEngine::pressOB(int iButton) {
char szButtons[12] = {0};
// check if too many buttons pressed
- if (_game.nButtons == IDI_MSA_MAX_BUTTON) {
- _game.nButtons = 0;
- memset(_game.szAddr, 0, sizeof(_game.szAddr));
+ if (_gameStateMickey.nButtons == IDI_MSA_MAX_BUTTON) {
+ _gameStateMickey.nButtons = 0;
+ memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
printExeMsg(IDO_MSA_TOO_MANY_BUTTONS_PRESSED);
return;
}
// add button press to address
- _game.nButtons++;
- _game.szAddr[_game.nButtons - 1] = (char)iButton;
+ _gameStateMickey.nButtons++;
+ _gameStateMickey.szAddr[_gameStateMickey.nButtons - 1] = (char)iButton;
// format buttons string
for (int i = 0; i < IDI_MSA_MAX_BUTTON; i++) {
- szButtons[i * 2] = _game.szAddr[i];
- if (_game.szAddr[i + 1]) szButtons[(i * 2) + 1] = ',';
+ szButtons[i * 2] = _gameStateMickey.szAddr[i];
+ if (_gameStateMickey.szAddr[i + 1]) szButtons[(i * 2) + 1] = ',';
}
// print pressed buttons
printLine("MICKEY HAS PRESSED: ");
- _vm->drawStr(20, 22, IDA_DEFAULT, szButtons);
+ drawStr(20, 22, IDA_DEFAULT, szButtons);
waitAnyKey();
}
-void Mickey::insertDisk(int iDisk) {
- _vm->clearTextArea();
- _vm->drawStr(IDI_MSA_ROW_INSERT_DISK, IDI_MSA_COL_INSERT_DISK, IDA_DEFAULT, (const char *)IDS_MSA_INSERT_DISK[iDisk]);
+void MickeyEngine::insertDisk(int iDisk) {
+ clearTextArea();
+ drawStr(IDI_MSA_ROW_INSERT_DISK, IDI_MSA_COL_INSERT_DISK, IDA_DEFAULT, (const char *)IDS_MSA_INSERT_DISK[iDisk]);
waitAnyKey();
}
-void Mickey::gameOver() {
+void MickeyEngine::gameOver() {
// We shouldn't run the game over segment if we're quitting.
- if (_vm->shouldQuit())
+ if (shouldQuit())
return;
drawPic(IDI_MSA_PIC_EARTH_SHIP_LEAVING);
printExeMsg(IDO_MSA_GAME_OVER[3]);
playSound(IDI_MSA_SND_GAME_OVER);
- if (_game.fItemUsed[IDI_MSA_ITEM_LETTER]) {
+ if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER]) {
drawPic(IDI_MSA_PIC_EARTH_MINNIE);
printExeMsg(IDO_MSA_GAME_OVER[4]);
printExeMsg(IDO_MSA_GAME_OVER[5]);
@@ -1297,74 +1294,73 @@ void Mickey::gameOver() {
waitAnyKey();
}
-void Mickey::flipSwitch() {
- if (_game.fHasXtal || _game.nXtals) {
- if (!_game.fStoryShown)
+void MickeyEngine::flipSwitch() {
+ if (_gameStateMickey.fHasXtal || _gameStateMickey.nXtals) {
+ if (!_gameStateMickey.fStoryShown)
printStory();
// Initialize planet data
- if (!_game.fPlanetsInitialized) {
+ if (!_gameStateMickey.fPlanetsInitialized) {
int iHint = 0;
int iPlanet = 0;
- memset(_game.iPlanetXtal, 0, sizeof(_game.iPlanetXtal));
- memset(_game.iClue, 0, sizeof(_game.iClue));
+ memset(_gameStateMickey.iPlanetXtal, 0, sizeof(_gameStateMickey.iPlanetXtal));
+ memset(_gameStateMickey.iClue, 0, sizeof(_gameStateMickey.iClue));
- _game.iPlanetXtal[0] = IDI_MSA_PLANET_EARTH;
- _game.iPlanetXtal[8] = IDI_MSA_PLANET_URANUS;
+ _gameStateMickey.iPlanetXtal[0] = IDI_MSA_PLANET_EARTH;
+ _gameStateMickey.iPlanetXtal[8] = IDI_MSA_PLANET_URANUS;
for (int i = 1; i < IDI_MSA_MAX_PLANET; i++) {
if (i < 8) {
do {
// Earth (planet 0) and Uranus (planet 8) are excluded
- iPlanet = _vm->rnd(IDI_MSA_MAX_PLANET - 2);
+ iPlanet = rnd(IDI_MSA_MAX_PLANET - 2);
} while (planetIsAlreadyAssigned(iPlanet));
} else {
iPlanet = IDI_MSA_PLANET_URANUS; // Uranus is always last
}
- _game.iPlanetXtal[i] = iPlanet;
- iHint = _vm->rnd(5) - 1; // clues are 0-4
- _game.iClue[i] = IDO_MSA_NEXT_PIECE[iPlanet][iHint];
+ _gameStateMickey.iPlanetXtal[i] = iPlanet;
+ iHint = rnd(5) - 1; // clues are 0-4
+ _gameStateMickey.iClue[i] = IDO_MSA_NEXT_PIECE[iPlanet][iHint];
}
- _game.fPlanetsInitialized = true;
+ _gameStateMickey.fPlanetsInitialized = true;
}
// activate screen animation
- _game.fAnimXL30 = true;
+ _gameStateMickey.fAnimXL30 = true;
- _vm->clearTextArea();
+ clearTextArea();
playSound(IDI_MSA_SND_XL30);
printExeMsg(IDO_MSA_XL30_SPEAKING);
- if (_game.fHasXtal) {
- _game.fHasXtal = false;
+ if (_gameStateMickey.fHasXtal) {
+ _gameStateMickey.fHasXtal = false;
printExeMsg(IDO_MSA_CRYSTAL_PIECE_FOUND);
}
- if (_game.nXtals == IDI_MSA_MAX_PLANET) {
+ if (_gameStateMickey.nXtals == IDI_MSA_MAX_PLANET) {
printExeMsg(IDO_MSA_GAME_OVER[0]);
printExeMsg(IDO_MSA_GAME_OVER[1]);
printExeMsg(IDO_MSA_GAME_OVER[2]);
#if 0
// DEBUG
- strcpy(_game.szAddr, (char *)IDS_MSA_ADDR_PLANET[IDI_MSA_PLANET_EARTH]);
- _game.nButtons = strlen(_game.szAddr);
+ strcpy(_gameStateMickey.szAddr, (char *)IDS_MSA_ADDR_PLANET[IDI_MSA_PLANET_EARTH]);
+ _gameStateMickey.nButtons = strlen(_gameStateMickey.szAddr);
#endif
} else {
- printExeStr(_game.iClue[_game.nXtals]);
+ printExeStr(_gameStateMickey.iClue[_gameStateMickey.nXtals]);
#if 0
// DEBUG
- _vm->drawStr(24, 12, IDA_DEFAULT, (char *)IDS_MSA_NAME_PLANET_2[_game.iPlanetXtal[_game.nXtals]]);
- _vm->drawStr(24, 22, IDA_DEFAULT, (char *)IDS_MSA_ADDR_PLANET[_game.iPlanetXtal[_game.nXtals]]);
- strcpy(_game.szAddr, (char *)IDS_MSA_ADDR_PLANET[_game.iPlanetXtal[_game.nXtals]]);
- _game.nButtons = strlen(_game.szAddr);
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen(); // TODO: this should go in the game's main loop
+ drawStr(24, 12, IDA_DEFAULT, (char *)IDS_MSA_NAME_PLANET_2[_gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]]);
+ drawStr(24, 22, IDA_DEFAULT, (char *)IDS_MSA_ADDR_PLANET[_gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]]);
+ strcpy(_gameStateMickey.szAddr, (char *)IDS_MSA_ADDR_PLANET[_gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]]);
+ _gameStateMickey.nButtons = strlen(_gameStateMickey.szAddr);
+ _gfx->doUpdate();
#endif
waitAnyKey(true);
@@ -1374,73 +1370,73 @@ void Mickey::flipSwitch() {
}
}
-void Mickey::inventory() {
+void MickeyEngine::inventory() {
int iRow = IDI_MSA_ROW_INV_ITEMS;
char szCrystals[12] = {0};
- sprintf(szCrystals, IDS_MSA_CRYSTALS, IDS_MSA_CRYSTAL_NO[_game.nXtals]);
+ sprintf(szCrystals, IDS_MSA_CRYSTALS, IDS_MSA_CRYSTAL_NO[_gameStateMickey.nXtals]);
CursorMan.showMouse(false);
- _vm->clearScreen(IDA_DEFAULT);
- _vm->drawStr(IDI_MSA_ROW_INV_TITLE, IDI_MSA_COL_INV_TITLE, IDA_DEFAULT, IDS_MSA_INVENTORY);
- _vm->drawStr(IDI_MSA_ROW_INV_CRYSTALS, IDI_MSA_COL_INV_ITEMS, IDA_DEFAULT, szCrystals);
+ clearScreen(IDA_DEFAULT);
+ drawStr(IDI_MSA_ROW_INV_TITLE, IDI_MSA_COL_INV_TITLE, IDA_DEFAULT, IDS_MSA_INVENTORY);
+ drawStr(IDI_MSA_ROW_INV_CRYSTALS, IDI_MSA_COL_INV_ITEMS, IDA_DEFAULT, szCrystals);
for (int iItem = 0; iItem < IDI_MSA_MAX_ITEM; iItem++) {
- if (_game.fItem[_game.iItem[iItem]] && (_game.iItem[iItem] != IDI_MSA_OBJECT_NONE)) {
- _vm->drawStr(iRow++, IDI_MSA_COL_INV_ITEMS, IDA_DEFAULT, (const char *)IDS_MSA_NAME_ITEM[_game.iItem[iItem]]);
+ if (_gameStateMickey.fItem[_gameStateMickey.iItem[iItem]] && (_gameStateMickey.iItem[iItem] != IDI_MSA_OBJECT_NONE)) {
+ drawStr(iRow++, IDI_MSA_COL_INV_ITEMS, IDA_DEFAULT, (const char *)IDS_MSA_NAME_ITEM[_gameStateMickey.iItem[iItem]]);
}
}
waitAnyKey();
- _vm->clearScreen(IDA_DEFAULT);
+ clearScreen(IDA_DEFAULT);
CursorMan.showMouse(true);
}
-void Mickey::intro() {
+void MickeyEngine::intro() {
// Draw Sierra logo
//drawLogo(); // Original does not even show this, so we skip it too
//waitAnyKey(); // Not in the original, but needed so that the logo is visible
// draw title picture
- _game.iRoom = IDI_MSA_PIC_TITLE;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_TITLE;
drawRoom();
// show copyright and play theme
printExeMsg(IDO_MSA_COPYRIGHT);
// Quit if necessary
- if (_vm->shouldQuit())
+ if (shouldQuit())
return;
playSound(IDI_MSA_SND_THEME);
// load game
- _game.fIntro = true;
+ _gameStateMickey.fIntro = true;
if (chooseY_N(IDO_MSA_LOAD_GAME[0], true)) {
if (loadGame()) {
- _game.iPlanet = IDI_MSA_PLANET_EARTH;
- _game.fIntro = false;
- _game.iRoom = IDI_MSA_PIC_SHIP_CORRIDOR;
+ _gameStateMickey.iPlanet = IDI_MSA_PLANET_EARTH;
+ _gameStateMickey.fIntro = false;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_CORRIDOR;
return;
}
}
// Quit if necessary
- if (_vm->shouldQuit())
+ if (shouldQuit())
return;
// play spaceship landing scene
- _game.iPlanet = IDI_MSA_PLANET_EARTH;
- _game.iRoom = IDI_MSA_PIC_EARTH_ROAD_4;
+ _gameStateMickey.iPlanet = IDI_MSA_PLANET_EARTH;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_EARTH_ROAD_4;
drawRoom();
printRoomDesc();
// Quit if necessary
- if (_vm->shouldQuit())
+ if (shouldQuit())
return;
playSound(IDI_MSA_SND_SHIP_LAND);
@@ -1450,48 +1446,46 @@ void Mickey::intro() {
playSound(IDI_MSA_SND_PRESS_BLUE);
//Set screen to white
- _vm->_gfx->clearScreen(15);
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
+ _gfx->clearScreen(15);
+ _gfx->doUpdate();
- _vm->_system->delayMillis(IDI_MSA_ANIM_DELAY);
+ _system->delayMillis(IDI_MSA_ANIM_DELAY);
//Set back to black
- _vm->_gfx->clearScreen(0);
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
+ _gfx->clearScreen(0);
+ _gfx->doUpdate();
drawRoom();
- printDesc(_game.iRoom);
+ printDesc(_gameStateMickey.iRoom);
}
printExeMsg(IDO_MSA_INTRO);
}
-void Mickey::getItem(ENUM_MSA_ITEM iItem) {
- _game.fItem[iItem] = true;
- _game.iItem[_game.nItems++] = iItem;
- _game.oRmTxt[_game.iRoom] = 0;
+void MickeyEngine::getItem(ENUM_MSA_ITEM iItem) {
+ _gameStateMickey.fItem[iItem] = true;
+ _gameStateMickey.iItem[_gameStateMickey.nItems++] = iItem;
+ _gameStateMickey.oRmTxt[_gameStateMickey.iRoom] = 0;
playSound(IDI_MSA_SND_TAKE);
drawRoom();
}
-void Mickey::getXtal(int iStr) {
- _game.oRmTxt[_game.iRoom] = 0;
- _game.fHasXtal = true;
- _game.nXtals++;
+void MickeyEngine::getXtal(int iStr) {
+ _gameStateMickey.oRmTxt[_gameStateMickey.iRoom] = 0;
+ _gameStateMickey.fHasXtal = true;
+ _gameStateMickey.nXtals++;
playSound(IDI_MSA_SND_CRYSTAL);
drawRoom();
printDatMessage(iStr);
}
-bool Mickey::parse(int cmd, int arg) {
+bool MickeyEngine::parse(int cmd, int arg) {
switch (cmd) {
// BASIC
case IDI_MSA_ACTION_GOTO_ROOM:
- _game.iRoom = arg;
+ _gameStateMickey.iRoom = arg;
return true;
case IDI_MSA_ACTION_SHOW_INT_STR:
printLine(IDS_MSA_ERRORS[arg]);
@@ -1515,291 +1509,291 @@ bool Mickey::parse(int cmd, int arg) {
// EARTH
case IDI_MSA_ACTION_GET_ROPE:
- if (_game.iRmMenu[_game.iRoom] == 2) {
- _game.iRmObj[_game.iRoom] = IDI_MSA_OBJECT_NONE;
- _game.iRmMenu[_game.iRoom] = 3;
+ if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] == 2) {
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 3;
getItem(IDI_MSA_ITEM_ROPE);
printLine("MICKEY TAKES THE ROPE");
} else {
- _game.iRmMenu[_game.iRoom] = 1;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
printDatMessage(11);
}
break;
case IDI_MSA_ACTION_UNTIE_ROPE:
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_EARTH_TIRE_SWING_1;
- _game.iRmObj[_game.iRoom] = 0;
- _game.iRmMenu[_game.iRoom] = 2;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_TIRE_SWING_1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 0;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
drawRoom();
printDatMessage(12);
break;
case IDI_MSA_ACTION_GET_BONE:
- _game.iRmObj[_game.iRoom] = IDI_MSA_OBJECT_NONE;
- _game.iRmMenu[_game.iRoom] = 1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
getItem(IDI_MSA_ITEM_BONE);
printDatMessage(arg);
break;
case IDI_MSA_ACTION_GET_XTAL_EARTH:
- _game.iRmMenu[_game.iRoom] = 1;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
getXtal(arg);
break;
case IDI_MSA_ACTION_LOOK_DESK:
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmObj[_game.iRoom] = 2;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 2;
drawRoom();
printDatMessage(arg);
break;
case IDI_MSA_ACTION_WRITE_LETTER:
- _game.iRmMenu[_game.iRoom] = 3;
- _game.iRmMenu[IDI_MSA_PIC_EARTH_MAILBOX] = 1;
- _game.iRmObj[_game.iRoom] = IDI_MSA_OBJECT_NONE;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 3;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_EARTH_MAILBOX] = 1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
getItem(IDI_MSA_ITEM_LETTER);
printDatMessage(arg);
break;
case IDI_MSA_ACTION_MAIL_LETTER:
- _game.fItemUsed[IDI_MSA_ITEM_LETTER] = true;
- _game.fItem[IDI_MSA_ITEM_LETTER] = false;
- _game.iRmMenu[_game.iRoom] = 0;
+ _gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER] = true;
+ _gameStateMickey.fItem[IDI_MSA_ITEM_LETTER] = false;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
printDatMessage(arg);
break;
case IDI_MSA_ACTION_OPEN_MAILBOX:
- if (_game.fItemUsed[IDI_MSA_ITEM_LETTER]) {
+ if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER]) {
printDatMessage(110);
} else {
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_OPEN_CUPBOARD:
- if (_game.iRmMenu[_game.iRoom]) {
- if (_game.iRmObj[_game.iRoom] == IDI_MSA_OBJECT_NONE) {
+ if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
+ if (_gameStateMickey.iRmObj[_gameStateMickey.iRoom] == IDI_MSA_OBJECT_NONE) {
printDatMessage(78);
} else {
printDatMessage(arg);
}
} else {
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_EARTH_KITCHEN_1;
- _game.iRmObj[_game.iRoom] = 3;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_KITCHEN_1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 3;
drawRoom();
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_FLASHLIGHT:
if (!mickeyHasItem(IDI_MSA_ITEM_FLASHLIGHT)) {
- _game.iRmObj[_game.iRoom] = IDI_MSA_OBJECT_NONE;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
getItem(IDI_MSA_ITEM_FLASHLIGHT);
drawRoom();
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_OPEN_CABINET:
- if (_game.iRmMenu[_game.iRoom]) {
+ if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
printDatMessage(109);
} else {
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_EARTH_GARAGE_1;
- _game.iRmObj[_game.iRoom] = 15;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_GARAGE_1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 15;
drawRoom();
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_CROWBAR:
if (!mickeyHasItem(IDI_MSA_ITEM_CROWBAR)) {
- _game.iRmObj[_game.iRoom]--;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom]--;
getItem(IDI_MSA_ITEM_CROWBAR);
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_WRENCH:
if (!mickeyHasItem(IDI_MSA_ITEM_WRENCH)) {
- _game.iRmObj[_game.iRoom] -= 2;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] -= 2;
getItem(IDI_MSA_ITEM_WRENCH);
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_OPEN_CLOSET:
- if (_game.iRmMenu[_game.iRoom]) {
+ if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
printDatMessage(99);
} else {
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_EARTH_BEDROOM_1;
- _game.iRmObj[_game.iRoom] = 7;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_BEDROOM_1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 7;
drawRoom();
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_MATTRESS:
if (!mickeyHasItem(IDI_MSA_ITEM_MATTRESS)) {
- _game.iRmObj[_game.iRoom]--;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom]--;
getItem(IDI_MSA_ITEM_MATTRESS);
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_SCARF:
if (!mickeyHasItem(IDI_MSA_ITEM_SCARF)) {
- _game.iRmObj[_game.iRoom] -= 2;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] -= 2;
getItem(IDI_MSA_ITEM_SCARF);
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_SUNGLASSES:
if (!mickeyHasItem(IDI_MSA_ITEM_SUNGLASSES)) {
- _game.iRmObj[_game.iRoom]--;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom]--;
getItem(IDI_MSA_ITEM_SUNGLASSES);
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_SCALE:
if (!mickeyHasItem(IDI_MSA_ITEM_SCALE)) {
- _game.iRmMenu[IDI_MSA_PIC_VENUS_WEIGH] = 1;
- _game.iRmMenu[IDI_MSA_PIC_NEPTUNE_WEIGH] = 1;
- _game.iRmMenu[IDI_MSA_PIC_MERCURY_WEIGH] = 1;
- _game.iRmMenu[IDI_MSA_PIC_SATURN_WEIGH] = 1;
- _game.iRmMenu[IDI_MSA_PIC_PLUTO_WEIGH] = 1;
- _game.iRmMenu[IDI_MSA_PIC_JUPITER_WEIGH] = 1;
- _game.iRmMenu[IDI_MSA_PIC_MARS_WEIGH] = 1;
- _game.iRmMenu[IDI_MSA_PIC_URANUS_WEIGH] = 1;
- _game.iRmObj[_game.iRoom] -= 2;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_VENUS_WEIGH] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_NEPTUNE_WEIGH] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_MERCURY_WEIGH] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_WEIGH] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_PLUTO_WEIGH] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_JUPITER_WEIGH] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_MARS_WEIGH] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_URANUS_WEIGH] = 1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] -= 2;
getItem(IDI_MSA_ITEM_SCALE);
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GOTO_SPACESHIP:
- _game.iRoom = IDI_MSA_PIC_SHIP_AIRLOCK;
- if (_game.iPlanet != IDI_MSA_PLANET_EARTH)
+ _gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_AIRLOCK;
+ if (_gameStateMickey.iPlanet != IDI_MSA_PLANET_EARTH)
insertDisk(0);
return true;
// VENUS
case IDI_MSA_ACTION_DOWN_CHASM:
- if (_game.fItem[IDI_MSA_ITEM_ROPE]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROPE]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
break;
case IDI_MSA_ACTION_DOWN_ROPE:
- if (_game.fItemUsed[IDI_MSA_ITEM_ROPE]) {
- _game.iRoom = IDI_MSA_PIC_VENUS_PROBE;
+ if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_ROPE]) {
+ _gameStateMickey.iRoom = IDI_MSA_PIC_VENUS_PROBE;
return true;
} else {
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_USE_ROPE:
- if (_game.fItemUsed[IDI_MSA_ITEM_ROPE]) {
+ if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_ROPE]) {
printDatMessage(22);
} else {
- _game.fItemUsed[IDI_MSA_ITEM_ROPE] = true;
- _game.fItem[IDI_MSA_ITEM_ROPE] = false;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_VENUS_CHASM_1;
+ _gameStateMickey.fItemUsed[IDI_MSA_ITEM_ROPE] = true;
+ _gameStateMickey.fItem[IDI_MSA_ITEM_ROPE] = false;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_VENUS_CHASM_1;
drawRoom();
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_OPEN_HATCH:
- if (_game.fItemUsed[IDI_MSA_ITEM_WRENCH]) {
- if ((_game.iRmMenu[_game.iRoom] == 3) || (_game.iRmPic[_game.iRoom] == IDI_MSA_PIC_VENUS_PROBE_1))
+ if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_WRENCH]) {
+ if ((_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] == 3) || (_gameStateMickey.iRmPic[_gameStateMickey.iRoom] == IDI_MSA_PIC_VENUS_PROBE_1))
printDatMessage(39);
else {
- _game.iRmMenu[_game.iRoom] = 2;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_VENUS_PROBE_1;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_VENUS_PROBE_1;
drawRoom();
printDatMessage(24);
}
} else {
- if (_game.fItem[IDI_MSA_ITEM_WRENCH]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_WRENCH]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_USE_WRENCH:
- _game.fItemUsed[IDI_MSA_ITEM_WRENCH] = true;
+ _gameStateMickey.fItemUsed[IDI_MSA_ITEM_WRENCH] = true;
printDatString(arg);
- if (_game.iRmPic[_game.iRoom] == IDI_MSA_PIC_VENUS_PROBE_1) {
- _vm->clearRow(22);
+ if (_gameStateMickey.iRmPic[_gameStateMickey.iRoom] == IDI_MSA_PIC_VENUS_PROBE_1) {
+ clearRow(22);
}
waitAnyKey();
break;
case IDI_MSA_ACTION_GET_XTAL_VENUS:
- _game.iRmMenu[_game.iRoom] = 3;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 3;
getXtal(arg);
break;
// TRITON (NEPTUNE)
case IDI_MSA_ACTION_LOOK_CASTLE:
- if (!_game.iRmMenu[_game.iRoom]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (!_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
break;
case IDI_MSA_ACTION_ENTER_OPENING:
- if (_game.fItemUsed[IDI_MSA_ITEM_CROWBAR]) {
- _game.iRoom = IDI_MSA_PIC_NEPTUNE_CASTLE_4;
+ if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_CROWBAR]) {
+ _gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_CASTLE_4;
return true;
} else {
- if (_game.fItem[IDI_MSA_ITEM_CROWBAR]) {
- _game.iRmMenu[_game.iRoom] = 2;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_CROWBAR]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
}
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_USE_CROWBAR:
- _game.fItemUsed[IDI_MSA_ITEM_CROWBAR] = true;
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_NEPTUNE_ENTRANCE_1;
+ _gameStateMickey.fItemUsed[IDI_MSA_ITEM_CROWBAR] = true;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_NEPTUNE_ENTRANCE_1;
drawRoom();
printDatMessage(arg);
break;
case IDI_MSA_ACTION_GET_XTAL_NEPTUNE:
- if (_game.fHasXtal) {
+ if (_gameStateMickey.fHasXtal) {
printDatMessage(71);
} else {
- if (_game.fItem[IDI_MSA_ITEM_SCARF]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_SCARF]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_TALK_LEADER:
- _game.iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY;
printDatMessage(arg);
return true;
case IDI_MSA_ACTION_GIVE_SCARF:
- _game.iRmObj[_game.iRoom] = 18;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 18;
getXtal(arg);
- _game.fItem[IDI_MSA_ITEM_SCARF] = false;
- _game.iRmMenu[_game.iRoom] = 0;
- _game.iRmMenu[IDI_MSA_PIC_EARTH_BEDROOM] = 2;
- _game.iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY;
+ _gameStateMickey.fItem[IDI_MSA_ITEM_SCARF] = false;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_EARTH_BEDROOM] = 2;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY;
return true;
// MERCURY
case IDI_MSA_ACTION_GET_XTAL_MERCURY:
- if (_game.fHasXtal) {
- _game.iRmMenu[_game.iRoom] = 2;
+ if (_gameStateMickey.fHasXtal) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
printDatMessage(32);
} else {
- if (_game.fItem[IDI_MSA_ITEM_SUNGLASSES]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_SUNGLASSES]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GIVE_SUNGLASSES:
- _game.iRmObj[_game.iRoom] = 17;
- _game.iRmMenu[_game.iRoom] = 2;
- _game.fItem[IDI_MSA_ITEM_SUNGLASSES] = false;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 17;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
+ _gameStateMickey.fItem[IDI_MSA_ITEM_SUNGLASSES] = false;
getXtal(arg);
@@ -1808,30 +1802,30 @@ bool Mickey::parse(int cmd, int arg) {
// TITAN (SATURN)
case IDI_MSA_ACTION_CROSS_LAKE:
- if (_game.fItem[IDI_MSA_ITEM_MATTRESS]) {
- _game.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_0] = 1;
- _game.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_1] = 1;
- _game.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_2] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_MATTRESS]) {
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_0] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_1] = 1;
+ _gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_2] = 1;
}
printDatMessage(arg);
break;
case IDI_MSA_ACTION_USE_MATTRESS:
- _game.iRoom = IDI_MSA_PIC_SATURN_ISLAND;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_SATURN_ISLAND;
printDatMessage(arg);
return true;
case IDI_MSA_ACTION_GET_XTAL_SATURN:
- if (_game.fHasXtal) {
+ if (_gameStateMickey.fHasXtal) {
printDatMessage(29);
} else {
getXtal(arg);
}
break;
case IDI_MSA_ACTION_LEAVE_ISLAND:
- _game.iRoom = IDI_MSA_PIC_SATURN_LAKE_1;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_SATURN_LAKE_1;
printDatMessage(arg);
@@ -1840,19 +1834,19 @@ bool Mickey::parse(int cmd, int arg) {
// PLUTO
case IDI_MSA_ACTION_GET_XTAL_PLUTO:
- if (_game.fHasXtal) {
+ if (_gameStateMickey.fHasXtal) {
printDatMessage(19);
} else {
- if (_game.fItem[IDI_MSA_ITEM_BONE]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_BONE]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GIVE_BONE:
- _game.fItem[IDI_MSA_ITEM_BONE] = false;
- _game.iRmMenu[_game.iRoom] = 0;
- _game.iRmObj[_game.iRoom] = 16;
+ _gameStateMickey.fItem[IDI_MSA_ITEM_BONE] = false;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 16;
getXtal(arg);
@@ -1862,29 +1856,29 @@ bool Mickey::parse(int cmd, int arg) {
case IDI_MSA_ACTION_GET_ROCK_0:
case IDI_MSA_ACTION_GET_ROCK_1:
- if (_game.fItem[IDI_MSA_ITEM_ROCK]) {
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROCK]) {
printDatMessage(38);
} else {
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmObj[_game.iRoom] = IDI_MSA_OBJECT_NONE;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
getItem(IDI_MSA_ITEM_ROCK);
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_GET_XTAL_JUPITER:
- if (_game.fHasXtal) {
+ if (_gameStateMickey.fHasXtal) {
printDatMessage(15);
} else {
- switch (_game.nRocks) {
+ switch (_gameStateMickey.nRocks) {
case 0:
- if (_game.fItem[IDI_MSA_ITEM_ROCK]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROCK]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
break;
case 1:
- if (_game.fItem[IDI_MSA_ITEM_ROCK]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROCK]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(34);
break;
@@ -1895,47 +1889,47 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_THROW_ROCK:
- _game.fItem[IDI_MSA_ITEM_ROCK] = false;
- _game.nItems--;
- _game.iRmObj[_game.iRoom]++;
- _game.iRmMenu[_game.iRoom] = 0;
+ _gameStateMickey.fItem[IDI_MSA_ITEM_ROCK] = false;
+ _gameStateMickey.nItems--;
+ _gameStateMickey.iRmObj[_gameStateMickey.iRoom]++;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
drawRoom();
- if (_game.nRocks) {
+ if (_gameStateMickey.nRocks) {
printDatMessage(37);
} else {
printDatMessage(arg);
}
- _game.nRocks++;
+ _gameStateMickey.nRocks++;
break;
// MARS
case IDI_MSA_ACTION_GO_TUBE:
- if (_game.fItem[IDI_MSA_ITEM_FLASHLIGHT]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_FLASHLIGHT]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
break;
case IDI_MSA_ACTION_USE_FLASHLIGHT:
- _game.iRoom = IDI_MSA_PIC_MARS_TUBE_1;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_MARS_TUBE_1;
printDatMessage(15);
return true;
case IDI_MSA_ACTION_PLUTO_DIG:
- if (_game.fHasXtal) {
+ if (_gameStateMickey.fHasXtal) {
printDatMessage(21);
} else {
getXtal(arg);
}
break;
case IDI_MSA_ACTION_GET_XTAL_MARS:
- if (_game.fHasXtal) {
+ if (_gameStateMickey.fHasXtal) {
printDatMessage(23);
} else {
printDatMessage(arg);
@@ -1945,29 +1939,29 @@ bool Mickey::parse(int cmd, int arg) {
// OBERON (URANUS)
case IDI_MSA_ACTION_ENTER_TEMPLE:
- _game.iRoom = IDI_MSA_PIC_URANUS_TEMPLE;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_URANUS_TEMPLE;
return true;
case IDI_MSA_ACTION_USE_CRYSTAL:
- if (_game.iRmMenu[_game.iRoom]) {
+ if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
printDatMessage(25);
} else {
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE_1;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE_1;
drawRoom();
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE;
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_OPEN_DOOR:
- if (_game.fTempleDoorOpen) {
+ if (_gameStateMickey.fTempleDoorOpen) {
printDatMessage(36);
} else {
- _game.fTempleDoorOpen = 1;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE_2;
+ _gameStateMickey.fTempleDoorOpen = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE_2;
drawRoom();
@@ -1975,8 +1969,8 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_ENTER_DOOR:
- if (_game.fTempleDoorOpen) {
- _game.iRoom = IDI_MSA_PIC_URANUS_STEPS;
+ if (_gameStateMickey.fTempleDoorOpen) {
+ _gameStateMickey.iRoom = IDI_MSA_PIC_URANUS_STEPS;
return true;
} else {
@@ -1984,17 +1978,17 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_GET_XTAL_URANUS:
- if (_game.fHasXtal) {
+ if (_gameStateMickey.fHasXtal) {
printDatMessage(34);
} else {
- if (_game.fItem[IDI_MSA_ITEM_CROWBAR]) {
- _game.iRmMenu[_game.iRoom] = 1;
+ if (_gameStateMickey.fItem[IDI_MSA_ITEM_CROWBAR]) {
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
}
printDatMessage(arg);
}
break;
case IDI_MSA_ACTION_USE_CROWBAR_1:
- _game.iRmMenu[_game.iRoom] = 0;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
getXtal(arg);
@@ -2003,11 +1997,11 @@ bool Mickey::parse(int cmd, int arg) {
// SPACESHIP
case IDI_MSA_ACTION_GO_NORTH:
- if (_game.fShipDoorOpen) {
- if (_game.fSuit) {
+ if (_gameStateMickey.fShipDoorOpen) {
+ if (_gameStateMickey.fSuit) {
printDatMessage(45);
} else {
- _game.iRoom = IDI_MSA_PIC_SHIP_CORRIDOR;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_CORRIDOR;
return true;
}
} else {
@@ -2015,19 +2009,19 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_GO_PLANET:
- if (!_game.fShipDoorOpen) {
- if ((_game.nXtals == IDI_MSA_MAX_PLANET) && (_game.iPlanet == IDI_MSA_PLANET_EARTH))
+ if (!_gameStateMickey.fShipDoorOpen) {
+ if ((_gameStateMickey.nXtals == IDI_MSA_MAX_PLANET) && (_gameStateMickey.iPlanet == IDI_MSA_PLANET_EARTH))
gameOver();
- if ((_game.iPlanet == _game.iPlanetXtal[_game.nXtals]) || (_game.iPlanet == IDI_MSA_PLANET_EARTH)) {
- _game.fHasXtal = false;
- _game.iRoom = IDI_MSA_HOME_PLANET[_game.iPlanet];
+ if ((_gameStateMickey.iPlanet == _gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]) || (_gameStateMickey.iPlanet == IDI_MSA_PLANET_EARTH)) {
+ _gameStateMickey.fHasXtal = false;
+ _gameStateMickey.iRoom = IDI_MSA_HOME_PLANET[_gameStateMickey.iPlanet];
- if (_game.iPlanet != IDI_MSA_PLANET_EARTH)
+ if (_gameStateMickey.iPlanet != IDI_MSA_PLANET_EARTH)
insertDisk(1);
return true;
} else {
- _game.iRoom = IDI_MSA_SHIP_PLANET[_game.iPlanet];
+ _gameStateMickey.iRoom = IDI_MSA_SHIP_PLANET[_gameStateMickey.iPlanet];
return true;
}
@@ -2036,20 +2030,20 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_PRESS_BUTTON:
- if (_game.fShipDoorOpen) { // inner door open
- if (_game.iPlanet && !_game.fSuit) {
+ if (_gameStateMickey.fShipDoorOpen) { // inner door open
+ if (_gameStateMickey.iPlanet && !_gameStateMickey.fSuit) {
printDatMessage(arg);
} else {
- _game.fShipDoorOpen = false;
- _game.iRmPic[_game.iRoom]--;
+ _gameStateMickey.fShipDoorOpen = false;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom]--;
drawRoom();
printDatMessage(2);
}
} else {
- _game.fShipDoorOpen = true;
- _game.iRmPic[_game.iRoom]++;
+ _gameStateMickey.fShipDoorOpen = true;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom]++;
drawRoom();
@@ -2057,11 +2051,11 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_WEAR_SPACESUIT:
- if (_game.fSuit) {
- if (_game.fShipDoorOpen) {
- _game.fSuit = false;
- _game.iRmMenu[_game.iRoom] = 0;
- _game.iRmPic[_game.iRoom] -= 2;
+ if (_gameStateMickey.fSuit) {
+ if (_gameStateMickey.fShipDoorOpen) {
+ _gameStateMickey.fSuit = false;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] -= 2;
drawRoom();
@@ -2070,10 +2064,10 @@ bool Mickey::parse(int cmd, int arg) {
printDatMessage(3);
}
} else {
- if (_game.iPlanet) {
- _game.fSuit = true;
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmPic[_game.iRoom] += 2;
+ if (_gameStateMickey.iPlanet) {
+ _gameStateMickey.fSuit = true;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] += 2;
drawRoom();
@@ -2085,14 +2079,14 @@ bool Mickey::parse(int cmd, int arg) {
break;
case IDI_MSA_ACTION_READ_GAUGE:
printDatString(arg);
- _vm->drawStr(21, 15, IDA_DEFAULT, (const char *)IDS_MSA_TEMP_C[_game.iPlanet]);
- _vm->drawStr(21, 23, IDA_DEFAULT, (const char *)IDS_MSA_TEMP_F[_game.iPlanet]);
+ drawStr(21, 15, IDA_DEFAULT, (const char *)IDS_MSA_TEMP_C[_gameStateMickey.iPlanet]);
+ drawStr(21, 23, IDA_DEFAULT, (const char *)IDS_MSA_TEMP_F[_gameStateMickey.iPlanet]);
waitAnyKey();
break;
case IDI_MSA_ACTION_PRESS_ORANGE:
- if (_game.fFlying) {
+ if (_gameStateMickey.fFlying) {
printDatMessage(4);
} else {
playSound(IDI_MSA_SND_PRESS_ORANGE);
@@ -2101,7 +2095,7 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_PRESS_BLUE:
- if (_game.fFlying) {
+ if (_gameStateMickey.fFlying) {
printDatMessage(4);
} else {
playSound(IDI_MSA_SND_PRESS_BLUE);
@@ -2113,18 +2107,18 @@ bool Mickey::parse(int cmd, int arg) {
flipSwitch();
break;
case IDI_MSA_ACTION_PUSH_THROTTLE:
- if (_game.fFlying) {
- _game.fFlying = false;
- _game.nButtons = 0;
+ if (_gameStateMickey.fFlying) {
+ _gameStateMickey.fFlying = false;
+ _gameStateMickey.nButtons = 0;
- memset(_game.szAddr, 0, sizeof(_game.szAddr));
+ memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
drawRoom();
printDatString(22);
- _vm->drawStr(IDI_MSA_ROW_PLANET, IDI_MSA_COL_PLANET, IDA_DEFAULT,
- (const char *)IDS_MSA_PLANETS[_game.iPlanet]);
+ drawStr(IDI_MSA_ROW_PLANET, IDI_MSA_COL_PLANET, IDA_DEFAULT,
+ (const char *)IDS_MSA_PLANETS[_gameStateMickey.iPlanet]);
waitAnyKey(true);
@@ -2134,39 +2128,39 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_PULL_THROTTLE:
- if (_game.fFlying) {
+ if (_gameStateMickey.fFlying) {
printDatMessage(18);
} else {
if (getPlanet() != -1) {
- _game.fFlying = true;
- _game.iPlanet = getPlanet();
+ _gameStateMickey.fFlying = true;
+ _gameStateMickey.iPlanet = getPlanet();
drawRoom();
printDatMessage(16);
} else {
- _game.nButtons = 0;
+ _gameStateMickey.nButtons = 0;
- memset(_game.szAddr, 0, sizeof(_game.szAddr));
+ memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
printDatMessage(17);
}
}
break;
case IDI_MSA_ACTION_LEAVE_ROOM:
- if (_game.fFlying) {
+ if (_gameStateMickey.fFlying) {
printDatMessage(24);
} else {
- _game.iRoom = arg;
+ _gameStateMickey.iRoom = arg;
return true;
}
break;
case IDI_MSA_ACTION_OPEN_CABINET_1:
- if (_game.iRmMenu[_game.iRoom]) {
+ if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
printLine("THE CABINET IS ALREADY OPEN");
} else {
- _game.iRmMenu[_game.iRoom] = 1;
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_SHIP_KITCHEN_1;
+ _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_SHIP_KITCHEN_1;
drawRoom();
@@ -2174,7 +2168,7 @@ bool Mickey::parse(int cmd, int arg) {
}
break;
case IDI_MSA_ACTION_READ_MAP:
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_STAR_MAP;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_STAR_MAP;
drawRoom();
@@ -2182,16 +2176,16 @@ bool Mickey::parse(int cmd, int arg) {
printDatMessage(47);
printDatMessage(48);
- _game.iRmPic[_game.iRoom] = IDI_MSA_PIC_SHIP_BEDROOM;
+ _gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_SHIP_BEDROOM;
drawRoom();
break;
case IDI_MSA_ACTION_GO_WEST:
- _game.nButtons = 0;
+ _gameStateMickey.nButtons = 0;
- memset(_game.szAddr, 0, sizeof(_game.szAddr));
+ memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
- _game.iRoom = arg;
+ _gameStateMickey.iRoom = arg;
return true;
}
@@ -2201,14 +2195,14 @@ bool Mickey::parse(int cmd, int arg) {
// Keyboard
-void Mickey::waitAnyKey(bool anim) {
+void MickeyEngine::waitAnyKey(bool anim) {
Common::Event event;
if (!anim)
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
- while (!_vm->shouldQuit()) {
- while (_vm->_system->getEventManager()->pollEvent(event)) {
+ while (!shouldQuit()) {
+ while (_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
@@ -2223,134 +2217,138 @@ void Mickey::waitAnyKey(bool anim) {
if (anim) {
animate();
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
}
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(10);
+ _system->updateScreen();
+ _system->delayMillis(10);
}
}
// Console-related functions
-void Mickey::debugCurRoom() {
- _vm->_console->DebugPrintf("Current Room = %d\n", _game.iRoom);
+void MickeyEngine::debugCurRoom() {
+ _console->DebugPrintf("Current Room = %d\n", _gameStateMickey.iRoom);
- if (_game.iRmObj[_game.iRoom] != IDI_MSA_OBJECT_NONE) {
- _vm->_console->DebugPrintf("Object %d is in the room\n", _game.iRmObj[_game.iRoom]);
+ if (_gameStateMickey.iRmObj[_gameStateMickey.iRoom] != IDI_MSA_OBJECT_NONE) {
+ _console->DebugPrintf("Object %d is in the room\n", _gameStateMickey.iRmObj[_gameStateMickey.iRoom]);
}
}
-void Mickey::debugGotoRoom(int room) {
- _game.iRoom = room;
+void MickeyEngine::debugGotoRoom(int room) {
+ _gameStateMickey.iRoom = room;
drawRoom();
}
-Mickey::Mickey(PreAgiEngine *vm) : _vm(vm) {
- _vm->_console = new Mickey_Console(_vm, this);
+MickeyEngine::MickeyEngine(OSystem *syst, const AGIGameDescription *gameDesc) : PreAgiEngine(syst, gameDesc) {
+ _console = new MickeyConsole(this);
}
-Mickey::~Mickey() {
+MickeyEngine::~MickeyEngine() {
+ delete _console;
}
-void Mickey::init() {
+void MickeyEngine::init() {
uint8 buffer[512];
// clear game struct
- memset(&_game, 0, sizeof(_game));
- memset(&_game.iItem, IDI_MSA_OBJECT_NONE, sizeof(_game.iItem));
+ memset(&_gameStateMickey, 0, sizeof(_gameStateMickey));
+ memset(&_gameStateMickey.iItem, IDI_MSA_OBJECT_NONE, sizeof(_gameStateMickey.iItem));
// read room extended desc flags
//readExe(IDO_MSA_ROOM_TEXT, buffer, sizeof(buffer));
- //memcpy(_game.fRmTxt, buffer, sizeof(_game.fRmTxt));
+ //memcpy(_gameStateMickey.fRmTxt, buffer, sizeof(_gameStateMickey.fRmTxt));
// read room extended desc offsets
readExe(IDO_MSA_ROOM_TEXT_OFFSETS, buffer, sizeof(buffer));
- memcpy(_game.oRmTxt, buffer, sizeof(_game.oRmTxt));
+ memcpy(_gameStateMickey.oRmTxt, buffer, sizeof(_gameStateMickey.oRmTxt));
for (int i = 0; i < IDI_MSA_MAX_ROOM; i++)
- _game.oRmTxt[i] = buffer[i*2] + 256 * buffer[i*2+1];
+ _gameStateMickey.oRmTxt[i] = buffer[i*2] + 256 * buffer[i*2+1];
// read room object indices
//readExe(IDO_MSA_ROOM_OBJECT, buffer, sizeof(buffer));
- //memcpy(_game.iRmObj, buffer, sizeof(_game.iRmObj));
+ //memcpy(_gameStateMickey.iRmObj, buffer, sizeof(_gameStateMickey.iRmObj));
// read room picture indices
//readExe(IDO_MSA_ROOM_PICTURE, buffer, sizeof(buffer));
- //memcpy(_game.iRmPic, buffer, sizeof(_game.iRmPic));
+ //memcpy(_gameStateMickey.iRmPic, buffer, sizeof(_gameStateMickey.iRmPic));
// read room menu patch indices
readExe(IDO_MSA_ROOM_MENU_FIX, buffer, sizeof(buffer));
- memcpy(_game.nRmMenu, buffer, sizeof(_game.nRmMenu));
+ memcpy(_gameStateMickey.nRmMenu, buffer, sizeof(_gameStateMickey.nRmMenu));
// set room picture and room object indices
for (int i = 0; i < IDI_MSA_MAX_ROOM; i++) {
- _game.iRmPic[i] = i;
- _game.iRmObj[i] = -1;
+ _gameStateMickey.iRmPic[i] = i;
+ _gameStateMickey.iRmObj[i] = -1;
}
- _game.iRmPic[IDI_MSA_PIC_SHIP_AIRLOCK] = IDI_MSA_PIC_SHIP_AIRLOCK_0;
- _game.iRmObj[IDI_MSA_PIC_EARTH_BATHROOM] = 11;
- _game.iRmObj[IDI_MSA_PIC_JUPITER_LAVA] = 21;
- _game.iRmObj[IDI_MSA_PIC_JUPITER_ROCK_0] = 20;
- _game.iRmObj[IDI_MSA_PIC_JUPITER_ROCK_1] = 19;
- _game.iRmObj[IDI_MSA_PIC_EARTH_IN_DOGHOUSE] = 1;
+ _gameStateMickey.iRmPic[IDI_MSA_PIC_SHIP_AIRLOCK] = IDI_MSA_PIC_SHIP_AIRLOCK_0;
+ _gameStateMickey.iRmObj[IDI_MSA_PIC_EARTH_BATHROOM] = 11;
+ _gameStateMickey.iRmObj[IDI_MSA_PIC_JUPITER_LAVA] = 21;
+ _gameStateMickey.iRmObj[IDI_MSA_PIC_JUPITER_ROCK_0] = 20;
+ _gameStateMickey.iRmObj[IDI_MSA_PIC_JUPITER_ROCK_1] = 19;
+ _gameStateMickey.iRmObj[IDI_MSA_PIC_EARTH_IN_DOGHOUSE] = 1;
#if 0
// DEBUG
- _game.iPlanet = IDI_MSA_PLANET_EARTH;
- _game.iRoom = IDI_MSA_PIC_SHIP_CONTROLS;
- _game.fHasXtal = true;
- _game.nXtals = 9;
- _game.fItemUsed[IDI_MSA_ITEM_LETTER] = true;
+ _gameStateMickey.iPlanet = IDI_MSA_PLANET_EARTH;
+ _gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_CONTROLS;
+ _gameStateMickey.fHasXtal = true;
+ _gameStateMickey.nXtals = 9;
+ _gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER] = true;
#endif
}
-void Mickey::run() {
- bool done;
+Common::Error MickeyEngine::go() {
+ init();
// Game intro
intro();
// Game loop
- while (!_vm->shouldQuit()) {
+ while (!shouldQuit()) {
drawRoom();
- if (_game.fIntro) {
- _game.fIntro = false;
+ if (_gameStateMickey.fIntro) {
+ _gameStateMickey.fIntro = false;
} else {
printRoomDesc();
}
- if (_game.iRoom == IDI_MSA_PIC_NEPTUNE_GUARD) {
- _game.iRoom = IDI_MSA_PIC_NEPTUNE_LEADER;
+ bool done;
+ if (_gameStateMickey.iRoom == IDI_MSA_PIC_NEPTUNE_GUARD) {
+ _gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_LEADER;
done = true;
} else {
done = false;
}
- while (!done && !_vm->shouldQuit()) {
+ while (!done && !shouldQuit()) {
// Check air supply
- if (_game.fSuit) {
- _game.nAir -= 1;
+ if (_gameStateMickey.fSuit) {
+ _gameStateMickey.nAir -= 1;
for (int i = 0; i < 4; i++) {
- if (_game.nAir == IDI_MSA_AIR_SUPPLY[i]) {
+ if (_gameStateMickey.nAir == IDI_MSA_AIR_SUPPLY[i]) {
playSound(IDI_MSA_SND_XL30);
printExeMsg(IDO_MSA_XL30_SPEAKING);
printExeMsg(IDO_MSA_AIR_SUPPLY[i]);
if (i == 3)
- return;
+ return Common::kNoError;
}
}
} else {
- _game.nAir = 50; // max air supply
+ _gameStateMickey.nAir = 50; // max air supply
}
done = checkMenu();
}
- _game.nFrame = 0;
+ _gameStateMickey.nFrame = 0;
}
gameOver();
-}
+ return Common::kNoError;
}
+
+} // End of namespace Agi
diff --git a/engines/agi/preagi_mickey.h b/engines/agi/preagi_mickey.h
index 62981375c6..673839a592 100644
--- a/engines/agi/preagi_mickey.h
+++ b/engines/agi/preagi_mickey.h
@@ -676,23 +676,25 @@ struct MSA_GAME {
class PreAgiEngine;
-class Mickey {
+class MickeyEngine : public PreAgiEngine {
public:
- Mickey(PreAgiEngine *vm);
- ~Mickey();
+ MickeyEngine(OSystem *syst, const AGIGameDescription *gameDesc);
+ ~MickeyEngine();
void init();
- void run();
+ Common::Error go();
void debugCurRoom();
void debugGotoRoom(int);
void drawPic(int);
void drawObj(ENUM_MSA_OBJECT, int, int);
+ GUI::Debugger *getDebugger() { return _console; }
+
protected:
- PreAgiEngine *_vm;
+ MickeyConsole *_console;
- MSA_GAME _game;
+ MSA_GAME _gameStateMickey;
bool _clickToMove;
int getDat(int);
@@ -741,14 +743,14 @@ protected:
bool planetIsAlreadyAssigned(int planet) {
for (int j = 0; j < IDI_MSA_MAX_PLANET; j++) {
- if (_game.iPlanetXtal[j] == planet)
+ if (_gameStateMickey.iPlanetXtal[j] == planet)
return true;
}
return false;
}
bool mickeyHasItem(int item) {
- if (_game.fItem[item]) {
+ if (_gameStateMickey.fItem[item]) {
printDatMessage(90); // Mickey already has item
return true;
} else {
diff --git a/engines/agi/preagi_troll.cpp b/engines/agi/preagi_troll.cpp
index 445a9e34ff..50b2945383 100644
--- a/engines/agi/preagi_troll.cpp
+++ b/engines/agi/preagi_troll.cpp
@@ -31,32 +31,35 @@
namespace Agi {
-Troll::Troll(PreAgiEngine* vm) : _vm(vm) {
+TrollEngine::TrollEngine(OSystem *syst, const AGIGameDescription *gameDesc) : PreAgiEngine(syst, gameDesc) {
+}
+
+TrollEngine::~TrollEngine() {
}
// User Interface
-void Troll::pressAnyKey(int col) {
- _vm->drawStr(24, col, kColorDefault, IDS_TRO_PRESSANYKEY);
- _vm->_gfx->doUpdate();
- _vm->getSelection(kSelAnyKey);
+void TrollEngine::pressAnyKey(int col) {
+ drawStr(24, col, kColorDefault, IDS_TRO_PRESSANYKEY);
+ _gfx->doUpdate();
+ getSelection(kSelAnyKey);
}
-void Troll::drawMenu(const char *szMenu, int iSel) {
- _vm->clearTextArea();
- _vm->drawStr(21, 0, kColorDefault, szMenu);
- _vm->drawStr(22 + iSel, 0, kColorDefault, " *");
- _vm->_gfx->doUpdate();
+void TrollEngine::drawMenu(const char *szMenu, int iSel) {
+ clearTextArea();
+ drawStr(21, 0, kColorDefault, szMenu);
+ drawStr(22 + iSel, 0, kColorDefault, " *");
+ _gfx->doUpdate();
}
-bool Troll::getMenuSel(const char *szMenu, int *iSel, int nSel) {
+bool TrollEngine::getMenuSel(const char *szMenu, int *iSel, int nSel) {
Common::Event event;
int y;
drawMenu(szMenu, *iSel);
- while (!_vm->shouldQuit()) {
- while (_vm->_system->getEventManager()->pollEvent(event)) {
+ while (!shouldQuit()) {
+ while (_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
@@ -117,8 +120,8 @@ bool Troll::getMenuSel(const char *szMenu, int *iSel, int nSel) {
break;
}
}
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(10);
+ _system->updateScreen();
+ _system->delayMillis(10);
}
return true;
@@ -126,18 +129,18 @@ bool Troll::getMenuSel(const char *szMenu, int *iSel, int nSel) {
// Graphics
-void Troll::drawPic(int iPic, bool f3IsCont, bool clr, bool troll) {
- _vm->_picture->setDimensions(IDI_TRO_PIC_WIDTH, IDI_TRO_PIC_HEIGHT);
+void TrollEngine::drawPic(int iPic, bool f3IsCont, bool clr, bool troll) {
+ _picture->setDimensions(IDI_TRO_PIC_WIDTH, IDI_TRO_PIC_HEIGHT);
if (clr) {
- _vm->clearScreen(0x0f, false);
- _vm->_picture->clear();
+ clearScreen(0x0f, false);
+ _picture->clear();
}
- _vm->_picture->setPictureData(_gameData + IDO_TRO_FRAMEPIC);
- _vm->_picture->drawPicture();
+ _picture->setPictureData(_gameData + IDO_TRO_FRAMEPIC);
+ _picture->drawPicture();
- _vm->_picture->setPictureData(_gameData + _pictureOffsets[iPic]);
+ _picture->setPictureData(_gameData + _pictureOffsets[iPic]);
int addFlag = 0;
@@ -145,26 +148,26 @@ void Troll::drawPic(int iPic, bool f3IsCont, bool clr, bool troll) {
addFlag = kPicFTrollMode;
if (f3IsCont) {
- _vm->_picture->setPictureFlags(kPicFf3Cont | addFlag);
+ _picture->setPictureFlags(kPicFf3Cont | addFlag);
} else {
- _vm->_picture->setPictureFlags(kPicFf3Stop | addFlag);
+ _picture->setPictureFlags(kPicFf3Stop | addFlag);
}
- _vm->_picture->drawPicture();
+ _picture->drawPicture();
- _vm->_picture->showPic();
- _vm->_gfx->doUpdate();
+ _picture->showPic();
+ _gfx->doUpdate();
}
// Game Logic
-void Troll::inventory() {
+void TrollEngine::inventory() {
char tmp[40];
int n;
- _vm->clearScreen(0x07);
- _vm->drawStr(1, 12, kColorDefault, IDS_TRO_TREASURE_0);
- _vm->drawStr(2, 12, kColorDefault, IDS_TRO_TREASURE_1);
+ clearScreen(0x07);
+ drawStr(1, 12, kColorDefault, IDS_TRO_TREASURE_0);
+ drawStr(2, 12, kColorDefault, IDS_TRO_TREASURE_1);
for (int i = 0; i < IDI_TRO_MAX_TREASURE - _treasuresLeft; i++) {
@@ -172,36 +175,36 @@ void Troll::inventory() {
sprintf(tmp, " %2d ", i + 1);
- _vm->drawStr(2 + i, 10, _items[n].bg << 4 | 0x0f, tmp);
- _vm->drawStr(2 + i, 14, _items[n].bg << 4 | _items[n].fg, _items[n].name);
+ drawStr(2 + i, 10, _items[n].bg << 4 | 0x0f, tmp);
+ drawStr(2 + i, 14, _items[n].bg << 4 | _items[n].fg, _items[n].name);
}
switch (_treasuresLeft) {
case 1:
sprintf(tmp, IDS_TRO_TREASURE_5, _treasuresLeft);
- _vm->drawStr(20, 10, kColorDefault, tmp);
+ drawStr(20, 10, kColorDefault, tmp);
break;
case 0:
- _vm->drawStr(20, 1, kColorDefault, IDS_TRO_TREASURE_6);
+ drawStr(20, 1, kColorDefault, IDS_TRO_TREASURE_6);
break;
case IDI_TRO_MAX_TREASURE:
- _vm->drawStr(3, 17, kColorDefault, IDS_TRO_TREASURE_2);
+ drawStr(3, 17, kColorDefault, IDS_TRO_TREASURE_2);
default:
sprintf(tmp, IDS_TRO_TREASURE_4, _treasuresLeft);
- _vm->drawStr(20, 10, kColorDefault, tmp);
+ drawStr(20, 10, kColorDefault, tmp);
break;
}
pressAnyKey(6);
}
-void Troll::waitAnyKeyIntro() {
+void TrollEngine::waitAnyKeyIntro() {
Common::Event event;
int iMsg = 0;
- while (!_vm->shouldQuit()) {
- while (_vm->_system->getEventManager()->pollEvent(event)) {
+ while (!shouldQuit()) {
+ while (_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
@@ -217,26 +220,26 @@ void Troll::waitAnyKeyIntro() {
case 200:
iMsg = 0;
case 0:
- _vm->drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_2);
- _vm->_gfx->doUpdate();
+ drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_2);
+ _gfx->doUpdate();
break;
case 100:
- _vm->drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_3);
- _vm->_gfx->doUpdate();
+ drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_3);
+ _gfx->doUpdate();
break;
}
iMsg++;
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(10);
+ _system->updateScreen();
+ _system->delayMillis(10);
}
}
-void Troll::credits() {
- _vm->clearScreen(0x07);
+void TrollEngine::credits() {
+ clearScreen(0x07);
- _vm->drawStr(1, 2, kColorDefault, IDS_TRO_CREDITS_0);
+ drawStr(1, 2, kColorDefault, IDS_TRO_CREDITS_0);
int color = 10;
char str[2];
@@ -245,49 +248,49 @@ void Troll::credits() {
for (uint i = 0; i < strlen(IDS_TRO_CREDITS_1); i++) {
str[0] = IDS_TRO_CREDITS_1[i];
- _vm->drawStr(7, 19 + i, color++, str);
+ drawStr(7, 19 + i, color++, str);
if (color > 15)
color = 9;
}
- _vm->drawStr(8, 19, kColorDefault, IDS_TRO_CREDITS_2);
+ drawStr(8, 19, kColorDefault, IDS_TRO_CREDITS_2);
- _vm->drawStr(13, 11, 9, IDS_TRO_CREDITS_3);
- _vm->drawStr(15, 8, 10, IDS_TRO_CREDITS_4);
- _vm->drawStr(17, 7, 12, IDS_TRO_CREDITS_5);
- _vm->drawStr(19, 2, 14, IDS_TRO_CREDITS_6);
+ drawStr(13, 11, 9, IDS_TRO_CREDITS_3);
+ drawStr(15, 8, 10, IDS_TRO_CREDITS_4);
+ drawStr(17, 7, 12, IDS_TRO_CREDITS_5);
+ drawStr(19, 2, 14, IDS_TRO_CREDITS_6);
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
pressAnyKey();
}
-void Troll::tutorial() {
+void TrollEngine::tutorial() {
bool done = false;
int iSel = 0;
//char szTreasure[16] = {0};
- while (!_vm->shouldQuit()) {
- _vm->clearScreen(0xFF);
+ while (!shouldQuit()) {
+ clearScreen(0xFF);
- _vm->printStr(IDS_TRO_TUTORIAL_0);
- _vm->getSelection(kSelSpace);
+ printStr(IDS_TRO_TUTORIAL_0);
+ getSelection(kSelSpace);
- _vm->clearScreen(0x55);
- _vm->setDefaultTextColor(0x0F);
+ clearScreen(0x55);
+ setDefaultTextColor(0x0F);
done = false;
- while (!done && !_vm->shouldQuit()) {
+ while (!done && !shouldQuit()) {
getMenuSel(IDS_TRO_TUTORIAL_1, &iSel, IDI_TRO_MAX_OPTION);
switch (iSel) {
case IDI_TRO_SEL_OPTION_1:
- _vm->clearScreen(0x22, false);
- _vm->_gfx->doUpdate();
+ clearScreen(0x22, false);
+ _gfx->doUpdate();
break;
case IDI_TRO_SEL_OPTION_2:
- _vm->clearScreen(0x00, false);
- _vm->_gfx->doUpdate();
+ clearScreen(0x00, false);
+ _gfx->doUpdate();
break;
case IDI_TRO_SEL_OPTION_3:
done = true;
@@ -296,102 +299,101 @@ void Troll::tutorial() {
}
// do you need more practice ?
- _vm->clearScreen(0x4F);
- _vm->drawStr(7, 4, kColorDefault, IDS_TRO_TUTORIAL_5);
- _vm->drawStr(9, 4, kColorDefault, IDS_TRO_TUTORIAL_6);
- _vm->_gfx->doUpdate();
+ clearScreen(0x4F);
+ drawStr(7, 4, kColorDefault, IDS_TRO_TUTORIAL_5);
+ drawStr(9, 4, kColorDefault, IDS_TRO_TUTORIAL_6);
+ _gfx->doUpdate();
- if (!_vm->getSelection(kSelYesNo))
+ if (!getSelection(kSelYesNo))
break;
}
// show info texts
- _vm->clearScreen(0x5F);
- _vm->drawStr(4, 1, kColorDefault, IDS_TRO_TUTORIAL_7);
- _vm->drawStr(5, 1, kColorDefault, IDS_TRO_TUTORIAL_8);
- _vm->_gfx->doUpdate();
+ clearScreen(0x5F);
+ drawStr(4, 1, kColorDefault, IDS_TRO_TUTORIAL_7);
+ drawStr(5, 1, kColorDefault, IDS_TRO_TUTORIAL_8);
+ _gfx->doUpdate();
pressAnyKey();
- _vm->clearScreen(0x2F);
- _vm->drawStr(6, 1, kColorDefault, IDS_TRO_TUTORIAL_9);
- _vm->_gfx->doUpdate();
+ clearScreen(0x2F);
+ drawStr(6, 1, kColorDefault, IDS_TRO_TUTORIAL_9);
+ _gfx->doUpdate();
pressAnyKey();
- _vm->clearScreen(0x19);
- _vm->drawStr(7, 1, kColorDefault, IDS_TRO_TUTORIAL_10);
- _vm->drawStr(8, 1, kColorDefault, IDS_TRO_TUTORIAL_11);
- _vm->_gfx->doUpdate();
+ clearScreen(0x19);
+ drawStr(7, 1, kColorDefault, IDS_TRO_TUTORIAL_10);
+ drawStr(8, 1, kColorDefault, IDS_TRO_TUTORIAL_11);
+ _gfx->doUpdate();
pressAnyKey();
- _vm->clearScreen(0x6E);
- _vm->drawStr(9, 1, kColorDefault, IDS_TRO_TUTORIAL_12);
- _vm->drawStr(10, 1, kColorDefault, IDS_TRO_TUTORIAL_13);
- _vm->_gfx->doUpdate();
+ clearScreen(0x6E);
+ drawStr(9, 1, kColorDefault, IDS_TRO_TUTORIAL_12);
+ drawStr(10, 1, kColorDefault, IDS_TRO_TUTORIAL_13);
+ _gfx->doUpdate();
pressAnyKey();
- _vm->clearScreen(0x4C);
- _vm->drawStr(11, 1, kColorDefault, IDS_TRO_TUTORIAL_14);
- _vm->drawStr(12, 1, kColorDefault, IDS_TRO_TUTORIAL_15);
- _vm->_gfx->doUpdate();
+ clearScreen(0x4C);
+ drawStr(11, 1, kColorDefault, IDS_TRO_TUTORIAL_14);
+ drawStr(12, 1, kColorDefault, IDS_TRO_TUTORIAL_15);
+ _gfx->doUpdate();
pressAnyKey();
- _vm->clearScreen(0x5D);
- _vm->drawStr(13, 1, kColorDefault, IDS_TRO_TUTORIAL_16);
- _vm->drawStr(14, 1, kColorDefault, IDS_TRO_TUTORIAL_17);
- _vm->drawStr(15, 1, kColorDefault, IDS_TRO_TUTORIAL_18);
- _vm->_gfx->doUpdate();
+ clearScreen(0x5D);
+ drawStr(13, 1, kColorDefault, IDS_TRO_TUTORIAL_16);
+ drawStr(14, 1, kColorDefault, IDS_TRO_TUTORIAL_17);
+ drawStr(15, 1, kColorDefault, IDS_TRO_TUTORIAL_18);
+ _gfx->doUpdate();
pressAnyKey();
// show treasures
- _vm->clearScreen(0x2A);
- _vm->drawStr(2, 1, kColorDefault, IDS_TRO_TUTORIAL_19);
+ clearScreen(0x2A);
+ drawStr(2, 1, kColorDefault, IDS_TRO_TUTORIAL_19);
for (int i = 0; i < IDI_TRO_MAX_TREASURE; i++)
- _vm->drawStr(19 - i, 11, kColorDefault, _items[i].name);
+ drawStr(19 - i, 11, kColorDefault, _items[i].name);
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
pressAnyKey();
}
-void Troll::intro() {
+void TrollEngine::intro() {
// sierra on-line presents
- _vm->clearScreen(0x2F);
- _vm->drawStr(9, 10, kColorDefault, IDS_TRO_INTRO_0);
- _vm->drawStr(14, 15, kColorDefault, IDS_TRO_INTRO_1);
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(3200);
+ clearScreen(0x2F);
+ drawStr(9, 10, kColorDefault, IDS_TRO_INTRO_0);
+ drawStr(14, 15, kColorDefault, IDS_TRO_INTRO_1);
+ _gfx->doUpdate();
+ _system->delayMillis(3200);
CursorMan.showMouse(true);
// Draw logo
- _vm->setDefaultTextColor(0x0f);
+ setDefaultTextColor(0x0f);
drawPic(45, false, true);
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
// wait for keypress and alternate message
waitAnyKeyIntro();
// have you played this game before?
- _vm->drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_4);
- _vm->drawStr(23, 6, kColorDefault, IDS_TRO_INTRO_5);
- _vm->_gfx->doUpdate();
+ drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_4);
+ drawStr(23, 6, kColorDefault, IDS_TRO_INTRO_5);
+ _gfx->doUpdate();
- if (!_vm->getSelection(kSelYesNo))
+ if (!getSelection(kSelYesNo))
tutorial();
credits();
}
-void Troll::gameOver() {
+void TrollEngine::gameOver() {
// We do a check to see if the game should quit. Without this, the game show the picture, plays the
// music, and then quits. So if the game is quitting, we shouldn't run the "game over" part.
- if (_vm->shouldQuit())
+ if (shouldQuit())
return;
char szMoves[40];
- _vm->clearTextArea();
+ clearTextArea();
drawPic(42, true, true);
playTune(4, 25);
@@ -400,19 +402,19 @@ void Troll::gameOver() {
printUserMessage(33);
- _vm->clearTextArea();
+ clearTextArea();
drawPic(46, true, true);
sprintf(szMoves, IDS_TRO_GAMEOVER_0, _moves);
- _vm->drawStr(21, 1, kColorDefault, szMoves);
- _vm->drawStr(22, 1, kColorDefault, IDS_TRO_GAMEOVER_1);
- _vm->_gfx->doUpdate();
+ drawStr(21, 1, kColorDefault, szMoves);
+ drawStr(22, 1, kColorDefault, IDS_TRO_GAMEOVER_1);
+ _gfx->doUpdate();
pressAnyKey();
}
-void Troll::drawTroll() {
+void TrollEngine::drawTroll() {
for (int i = 0; i < IDI_TRO_NUM_NONTROLL; i++)
if (_currentRoom == _nonTrollRooms[i]) {
_isTrollAway = true;
@@ -422,14 +424,14 @@ void Troll::drawTroll() {
drawPic(43, false, false, true);
}
-int Troll::drawRoom(char *menu) {
+int TrollEngine::drawRoom(char *menu) {
int n = 0;
bool contFlag = false;
if (_currentRoom == 1) {
- _vm->_picture->setDimensions(IDI_TRO_PIC_WIDTH, IDI_TRO_PIC_HEIGHT);
- _vm->clearScreen(0x00, false);
- _vm->_picture->clear();
+ _picture->setDimensions(IDI_TRO_PIC_WIDTH, IDI_TRO_PIC_HEIGHT);
+ clearScreen(0x00, false);
+ _picture->clear();
} else {
if (_currentRoom != 42) {
@@ -439,7 +441,7 @@ int Troll::drawRoom(char *menu) {
}
drawPic(_currentRoom, contFlag, true);
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
if (_currentRoom == 42) {
drawPic(44, false, false); // don't clear
@@ -450,7 +452,7 @@ int Troll::drawRoom(char *menu) {
}
}
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
char tmp[10];
strncat(menu, (char*)_gameData + _locMessagesIdx[_currentRoom], 39);
@@ -469,7 +471,7 @@ int Troll::drawRoom(char *menu) {
return n;
}
-void Troll::playTune(int tune, int len) {
+void TrollEngine::playTune(int tune, int len) {
if (!_soundOn)
return;
@@ -482,34 +484,34 @@ void Troll::playTune(int tune, int len) {
duration = READ_LE_UINT16(_gameData + ptr);
ptr += 2;
- _vm->playNote(freq, duration);
+ playNote(freq, duration);
}
}
-void Troll::pickupTreasure(int treasureId) {
+void TrollEngine::pickupTreasure(int treasureId) {
char tmp[40];
_inventory[IDI_TRO_MAX_TREASURE - _treasuresLeft] = treasureId;
if (_currentRoom != 24) {
- _vm->clearTextArea();
+ clearTextArea();
drawPic(_currentRoom, false, true);
- _vm->_gfx->doUpdate();
+ _gfx->doUpdate();
}
printUserMessage(treasureId + 16);
- _vm->clearTextArea();
+ clearTextArea();
_treasuresLeft--;
switch (_treasuresLeft) {
case 1:
- _vm->drawStr(22, 1, kColorDefault, IDS_TRO_TREASURE_7);
+ drawStr(22, 1, kColorDefault, IDS_TRO_TREASURE_7);
break;
case 0:
- _vm->drawStr(22, 1, kColorDefault, IDS_TRO_TREASURE_8);
- _vm->drawStr(23, 4, kColorDefault, IDS_TRO_TREASURE_9);
+ drawStr(22, 1, kColorDefault, IDS_TRO_TREASURE_8);
+ drawStr(23, 4, kColorDefault, IDS_TRO_TREASURE_9);
_roomStates[6] = 1;
@@ -517,20 +519,20 @@ void Troll::pickupTreasure(int treasureId) {
break;
default:
sprintf(tmp, IDS_TRO_TREASURE_3, _treasuresLeft);
- _vm->drawStr(22, 1, kColorDefault, tmp);
+ drawStr(22, 1, kColorDefault, tmp);
break;
}
pressAnyKey();
}
-void Troll::printUserMessage(int msgId) {
+void TrollEngine::printUserMessage(int msgId) {
int i;
- _vm->clearTextArea();
+ clearTextArea();
for (i = 0; i < _userMessages[msgId - 1].num; i++) {
- _vm->drawStr(21 + i, 1, kColorDefault, _userMessages[msgId - 1].msg[i]);
+ drawStr(21 + i, 1, kColorDefault, _userMessages[msgId - 1].msg[i]);
}
if (msgId == 34) {
@@ -540,7 +542,7 @@ void Troll::printUserMessage(int msgId) {
pressAnyKey();
}
-void Troll::gameLoop() {
+void TrollEngine::gameLoop() {
bool done = false;
char menu[160+5];
int currentOption, numberOfOptions;
@@ -559,7 +561,7 @@ void Troll::gameLoop() {
memset(_inventory, 0, sizeof(_inventory));
- while (!done && !_vm->shouldQuit()) {
+ while (!done && !shouldQuit()) {
*menu = 0;
currentOption = 0;
@@ -589,7 +591,7 @@ void Troll::gameLoop() {
if (_currentRoom < 6 || _treasuresLeft == 0) {
_isTrollAway = true;
} else { // make odd 1:3
- _isTrollAway = (_vm->rnd(3) != 2);
+ _isTrollAway = (rnd(3) != 2);
}
break;
case OT_GET:
@@ -634,7 +636,7 @@ void Troll::gameLoop() {
}
-void Troll::fillOffsets() {
+void TrollEngine::fillOffsets() {
int i;
for (i = 0; i < IDI_TRO_PICNUM; i++)
@@ -721,8 +723,8 @@ void Troll::fillOffsets() {
// Init
-void Troll::init() {
- _vm->_picture->setPictureVersion(AGIPIC_V15);
+void TrollEngine::init() {
+ _picture->setPictureVersion(AGIPIC_V15);
//SetScreenPar(320, 200, (char*)ibm_fontdata);
const int gaps[] = { 0x3A40, 0x4600, 0x4800, 0x5800, 0x5a00, 0x6a00,
@@ -762,12 +764,16 @@ void Troll::init() {
fillOffsets();
}
-void Troll::run() {
- while (!_vm->shouldQuit()) {
+Common::Error TrollEngine::go() {
+ init();
+
+ while (!shouldQuit()) {
intro();
gameLoop();
gameOver();
}
+
+ return Common::kNoError;
}
} // End of namespace Agi
diff --git a/engines/agi/preagi_troll.h b/engines/agi/preagi_troll.h
index d9a995072b..c14a7872c2 100644
--- a/engines/agi/preagi_troll.h
+++ b/engines/agi/preagi_troll.h
@@ -157,16 +157,14 @@ struct Item {
char name[16];
};
-class Troll {
+class TrollEngine : public PreAgiEngine {
public:
- Troll(PreAgiEngine *vm);
+ TrollEngine(OSystem *syst, const AGIGameDescription *gameDesc);
+ ~TrollEngine();
- void init();
- void run();
+ Common::Error go();
private:
- PreAgiEngine *_vm;
-
int _roomPicture;
int _treasuresLeft;
int _currentRoom;
@@ -180,6 +178,7 @@ private:
byte *_gameData;
+ void init();
void intro();
void drawPic(int iPic, bool f3IsCont, bool clear, bool troll = false);
void drawTroll();
@@ -205,9 +204,7 @@ private:
void fillOffsets();
-private:
// These are come from game data
-
int _pictureOffsets[IDI_TRO_PICNUM];
int _roomPicStartIdx[IDI_TRO_NUM_NUMROOMS];
int _roomPicDeltas[IDI_TRO_NUM_NUMROOMS];
diff --git a/engines/agi/preagi_winnie.cpp b/engines/agi/preagi_winnie.cpp
index 1df31ff72a..cc5c2470ae 100644
--- a/engines/agi/preagi_winnie.cpp
+++ b/engines/agi/preagi_winnie.cpp
@@ -31,9 +31,11 @@
#include "common/savefile.h"
#include "common/textconsole.h"
+#include "audio/mididrv.h"
+
namespace Agi {
-void Winnie::parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len) {
+void WinnieEngine::parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len) {
int i;
Common::MemoryReadStreamEndian readS(buffer, len, _isBigEndian);
@@ -68,7 +70,7 @@ void Winnie::parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len) {
roomHdr->opt[i].ofsOpt[j] = readS.readUint16();
}
-void Winnie::parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len) {
+void WinnieEngine::parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len) {
int i;
Common::MemoryReadStreamEndian readS(buffer, len, _isBigEndian);
@@ -85,28 +87,31 @@ void Winnie::parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len) {
objHdr->ofsPic = readS.readUint16();
}
-uint32 Winnie::readRoom(int iRoom, uint8 *buffer, WTP_ROOM_HDR &roomHdr) {
- char szFile[256] = {0};
-
- if (_vm->getPlatform() == Common::kPlatformPC)
- sprintf(szFile, IDS_WTP_ROOM_DOS, iRoom);
- else if (_vm->getPlatform() == Common::kPlatformAmiga)
- sprintf(szFile, IDS_WTP_ROOM_AMIGA, iRoom);
- else if (_vm->getPlatform() == Common::kPlatformC64)
- sprintf(szFile, IDS_WTP_ROOM_C64, iRoom);
- else if (_vm->getPlatform() == Common::kPlatformApple2GS)
- sprintf(szFile, IDS_WTP_ROOM_APPLE, iRoom);
+uint32 WinnieEngine::readRoom(int iRoom, uint8 *buffer, WTP_ROOM_HDR &roomHdr) {
+ Common::String fileName;
+
+ if (getPlatform() == Common::kPlatformPC)
+ fileName = Common::String::format(IDS_WTP_ROOM_DOS, iRoom);
+ else if (getPlatform() == Common::kPlatformAmiga)
+ fileName = Common::String::format(IDS_WTP_ROOM_AMIGA, iRoom);
+ else if (getPlatform() == Common::kPlatformC64)
+ fileName = Common::String::format(IDS_WTP_ROOM_C64, iRoom);
+ else if (getPlatform() == Common::kPlatformApple2GS)
+ fileName = Common::String::format(IDS_WTP_ROOM_APPLE, iRoom);
+
Common::File file;
- if (!file.open(szFile)) {
- warning ("Could not open file \'%s\'", szFile);
+ if (!file.open(fileName)) {
+ warning("Could not open file \'%s\'", fileName.c_str());
return 0;
}
+
uint32 filelen = file.size();
- if (_vm->getPlatform() == Common::kPlatformC64) { //Skip the loading address
+ if (getPlatform() == Common::kPlatformC64) { // Skip the loading address
filelen -= 2;
file.seek(2, SEEK_CUR);
}
- memset(buffer, 0, sizeof(buffer));
+
+ memset(buffer, 0, 4096);
file.read(buffer, filelen);
file.close();
@@ -115,33 +120,37 @@ uint32 Winnie::readRoom(int iRoom, uint8 *buffer, WTP_ROOM_HDR &roomHdr) {
return filelen;
}
-uint32 Winnie::readObj(int iObj, uint8 *buffer) {
- char szFile[256] = {0};
- if (_vm->getPlatform() == Common::kPlatformPC)
- sprintf(szFile, IDS_WTP_OBJ_DOS, iObj);
- else if (_vm->getPlatform() == Common::kPlatformAmiga)
- sprintf(szFile, IDS_WTP_OBJ_AMIGA, iObj);
- else if (_vm->getPlatform() == Common::kPlatformC64)
- sprintf(szFile, IDS_WTP_OBJ_C64, iObj);
- else if (_vm->getPlatform() == Common::kPlatformApple2GS)
- sprintf(szFile, IDS_WTP_OBJ_APPLE, iObj);
+uint32 WinnieEngine::readObj(int iObj, uint8 *buffer) {
+ Common::String fileName;
+
+ if (getPlatform() == Common::kPlatformPC)
+ fileName = Common::String::format(IDS_WTP_OBJ_DOS, iObj);
+ else if (getPlatform() == Common::kPlatformAmiga)
+ fileName = Common::String::format(IDS_WTP_OBJ_AMIGA, iObj);
+ else if (getPlatform() == Common::kPlatformC64)
+ fileName = Common::String::format(IDS_WTP_OBJ_C64, iObj);
+ else if (getPlatform() == Common::kPlatformApple2GS)
+ fileName = Common::String::format(IDS_WTP_OBJ_APPLE, iObj);
+
Common::File file;
- if (!file.open(szFile)) {
- warning ("Could not open file \'%s\'", szFile);
+ if (!file.open(fileName)) {
+ warning ("Could not open file \'%s\'", fileName.c_str());
return 0;
}
+
uint32 filelen = file.size();
- if (_vm->getPlatform() == Common::kPlatformC64) { //Skip the loading address
+ if (getPlatform() == Common::kPlatformC64) { // Skip the loading address
filelen -= 2;
file.seek(2, SEEK_CUR);
}
- memset(buffer, 0, sizeof(buffer));
+
+ memset(buffer, 0, 2048);
file.read(buffer, filelen);
file.close();
return filelen;
}
-void Winnie::randomize() {
+void WinnieEngine::randomize() {
int iObj = 0;
int iRoom = 0;
bool done;
@@ -150,52 +159,50 @@ void Winnie::randomize() {
done = false;
while (!done) {
- iObj = _vm->rnd(IDI_WTP_MAX_OBJ - 1);
+ iObj = rnd(IDI_WTP_MAX_OBJ - 1);
done = true;
for (int j = 0; j < IDI_WTP_MAX_OBJ_MISSING; j++) {
- if (_game.iUsedObj[j] == iObj) {
+ if (_gameStateWinnie.iUsedObj[j] == iObj) {
done = false;
break;
}
}
}
- _game.iUsedObj[i] = iObj;
+ _gameStateWinnie.iUsedObj[i] = iObj;
done = false;
while (!done) {
- iRoom = _vm->rnd(IDI_WTP_MAX_ROOM_NORMAL);
+ iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
done = true;
for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
- if (_game.iObjRoom[j] == iRoom) {
+ if (_gameStateWinnie.iObjRoom[j] == iRoom) {
done = false;
break;
}
}
}
- _game.iObjRoom[iObj] = iRoom;
+ _gameStateWinnie.iObjRoom[iObj] = iRoom;
}
}
-void Winnie::intro() {
+void WinnieEngine::intro() {
drawPic(IDS_WTP_FILE_LOGO);
- _vm->printStr(IDS_WTP_INTRO_0);
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(0x640);
+ printStr(IDS_WTP_INTRO_0);
+ _gfx->doUpdate();
+ _system->delayMillis(0x640);
- if (_vm->getPlatform() == Common::kPlatformAmiga)
- _vm->_gfx->clearScreen(0);
+ if (getPlatform() == Common::kPlatformAmiga)
+ _gfx->clearScreen(0);
drawPic(IDS_WTP_FILE_TITLE);
- _vm->printStr(IDS_WTP_INTRO_1);
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(0x640);
+ printStr(IDS_WTP_INTRO_1);
+ _gfx->doUpdate();
+ _system->delayMillis(0x640);
if (!playSound(IDI_WTP_SND_POOH_0))
return;
@@ -207,27 +214,27 @@ void Winnie::intro() {
return;
}
-int Winnie::getObjInRoom(int iRoom) {
+int WinnieEngine::getObjInRoom(int iRoom) {
for (int iObj = 1; iObj < IDI_WTP_MAX_ROOM_OBJ; iObj++)
- if (_game.iObjRoom[iObj] == iRoom)
+ if (_gameStateWinnie.iObjRoom[iObj] == iRoom)
return iObj;
return 0;
}
-void Winnie::setTakeDrop(int fCanSel[]) {
+void WinnieEngine::setTakeDrop(int fCanSel[]) {
fCanSel[IDI_WTP_SEL_TAKE] = getObjInRoom(_room);
- fCanSel[IDI_WTP_SEL_DROP] = _game.iObjHave;
+ fCanSel[IDI_WTP_SEL_DROP] = _gameStateWinnie.iObjHave;
}
-void Winnie::setFlag(int iFlag) {
- _game.fGame[iFlag] = 1;
+void WinnieEngine::setFlag(int iFlag) {
+ _gameStateWinnie.fGame[iFlag] = 1;
}
-void Winnie::clearFlag(int iFlag) {
- _game.fGame[iFlag] = 0;
+void WinnieEngine::clearFlag(int iFlag) {
+ _gameStateWinnie.fGame[iFlag] = 0;
}
-int Winnie::parser(int pc, int index, uint8 *buffer) {
+int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
WTP_ROOM_HDR hdr;
int startpc = pc;
int8 opcode;
@@ -242,7 +249,7 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
// extract header from buffer
parseRoomHeader(&hdr, buffer, sizeof(WTP_ROOM_HDR));
- while (!_vm->shouldQuit()) {
+ while (!shouldQuit()) {
pc = startpc;
// check if block is to be run
@@ -252,7 +259,7 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
return IDI_WTP_PAR_OK;
fBlock = *(buffer + pc++);
- if (_game.fGame[iBlock] != fBlock)
+ if (_gameStateWinnie.fGame[iBlock] != fBlock)
return IDI_WTP_PAR_OK;
// extract text from block
@@ -285,12 +292,12 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
// extract menu string
strcpy(szMenu, (char *)(buffer + pc));
- _vm->XOR80(szMenu);
+ XOR80(szMenu);
break;
default:
// print description
printStrWinnie((char *)(buffer + pc));
- if (_vm->getSelection(kSelBackspace) == 1)
+ if (getSelection(kSelBackspace) == 1)
return IDI_WTP_PAR_OK;
else
return IDI_WTP_PAR_BACK;
@@ -307,7 +314,7 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
// get menu selection
getMenuSel(szMenu, &iSel, fCanSel);
- if (++_game.nMoves == IDI_WTP_MAX_MOVES_UNTIL_WIND)
+ if (++_gameStateWinnie.nMoves == IDI_WTP_MAX_MOVES_UNTIL_WIND)
_doWind = true;
if (_winnieEvent && (_room <= IDI_WTP_MAX_ROOM_TELEPORT)) {
@@ -349,8 +356,8 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
iDir = iSel - IDI_WTP_SEL_NORTH;
if (hdr.roomNew[iDir] == IDI_WTP_ROOM_NONE) {
- _vm->printStr(IDS_WTP_CANT_GO);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_CANT_GO);
+ getSelection(kSelAnyKey);
} else {
_room = hdr.roomNew[iDir];
return IDI_WTP_PAR_GOTO;
@@ -384,7 +391,7 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
case IDO_WTP_PRINT_MSG:
opcode = *(buffer + pc++);
printRoomStr(_room, opcode);
- _vm->getSelection(kSelAnyKey);
+ getSelection(kSelAnyKey);
break;
case IDO_WTP_PRINT_STR:
opcode = *(buffer + pc++);
@@ -409,7 +416,7 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
case IDO_WTP_WALK_MIST:
_mist--;
if (!_mist) {
- _room = _vm->rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
+ _room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
return IDI_WTP_PAR_GOTO;
}
break;
@@ -430,13 +437,13 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
showOwlHelp();
break;
case IDO_WTP_GOTO_RND:
- _room = _vm->rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
+ _room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
return IDI_WTP_PAR_GOTO;
default:
opcode = 0;
break;
}
- } while (opcode && !_vm->shouldQuit());
+ } while (opcode && !shouldQuit());
if (iNewRoom) {
_room = iNewRoom;
@@ -445,39 +452,36 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
if (iBlock == 1)
return IDI_WTP_PAR_OK;
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
+ _gfx->doUpdate();
}
return IDI_WTP_PAR_OK;
}
-void Winnie::keyHelp() {
+void WinnieEngine::keyHelp() {
playSound(IDI_WTP_SND_KEYHELP);
- _vm->printStr(IDS_WTP_HELP_0);
- _vm->getSelection(kSelAnyKey);
- _vm->printStr(IDS_WTP_HELP_1);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_HELP_0);
+ getSelection(kSelAnyKey);
+ printStr(IDS_WTP_HELP_1);
+ getSelection(kSelAnyKey);
}
-void Winnie::inventory() {
- char szMissing[41] = {0};
-
- if (_game.iObjHave)
- printObjStr(_game.iObjHave, IDI_WTP_OBJ_TAKE);
+void WinnieEngine::inventory() {
+ if (_gameStateWinnie.iObjHave)
+ printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_TAKE);
else {
- _vm->clearTextArea();
- _vm->drawStr(IDI_WTP_ROW_MENU, IDI_WTP_COL_MENU, IDA_DEFAULT, IDS_WTP_INVENTORY_0);
+ clearTextArea();
+ drawStr(IDI_WTP_ROW_MENU, IDI_WTP_COL_MENU, IDA_DEFAULT, IDS_WTP_INVENTORY_0);
}
- sprintf(szMissing, IDS_WTP_INVENTORY_1, _game.nObjMiss);
- _vm->drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_MENU, IDA_DEFAULT, szMissing);
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen(); //TODO: Move to game's main loop
- _vm->getSelection(kSelAnyKey);
+ Common::String missing = Common::String::format(IDS_WTP_INVENTORY_1, _gameStateWinnie.nObjMiss);
+
+ drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_MENU, IDA_DEFAULT, missing.c_str());
+ _gfx->doUpdate();
+ getSelection(kSelAnyKey);
}
-void Winnie::printObjStr(int iObj, int iStr) {
+void WinnieEngine::printObjStr(int iObj, int iStr) {
WTP_OBJ_HDR hdr;
uint8 *buffer = (uint8 *)malloc(2048);
@@ -488,7 +492,7 @@ void Winnie::printObjStr(int iObj, int iStr) {
free(buffer);
}
-bool Winnie::isRightObj(int iRoom, int iObj, int *iCode) {
+bool WinnieEngine::isRightObj(int iRoom, int iObj, int *iCode) {
WTP_ROOM_HDR roomhdr;
WTP_OBJ_HDR objhdr;
uint8 *roomdata = (uint8 *)malloc(4096);
@@ -511,212 +515,212 @@ bool Winnie::isRightObj(int iRoom, int iObj, int *iCode) {
return false;
}
-void Winnie::takeObj(int iRoom) {
- if (_game.iObjHave) {
+void WinnieEngine::takeObj(int iRoom) {
+ if (_gameStateWinnie.iObjHave) {
// player is already carrying an object, can't take
- _vm->printStr(IDS_WTP_CANT_TAKE);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_CANT_TAKE);
+ getSelection(kSelAnyKey);
} else {
// take object
int iObj = getObjInRoom(iRoom);
- _game.iObjHave = iObj;
- _game.iObjRoom[iObj] = 0;
+ _gameStateWinnie.iObjHave = iObj;
+ _gameStateWinnie.iObjRoom[iObj] = 0;
- _vm->printStr(IDS_WTP_OK);
+ printStr(IDS_WTP_OK);
playSound(IDI_WTP_SND_TAKE);
drawRoomPic();
// print object "take" string
- printObjStr(_game.iObjHave, IDI_WTP_OBJ_TAKE);
- _vm->getSelection(kSelAnyKey);
+ printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_TAKE);
+ getSelection(kSelAnyKey);
// HACK WARNING
if (iObj == 18) {
- _game.fGame[0x0d] = 1;
+ _gameStateWinnie.fGame[0x0d] = 1;
}
}
}
-void Winnie::dropObj(int iRoom) {
+void WinnieEngine::dropObj(int iRoom) {
int iCode;
if (getObjInRoom(iRoom)) {
// there already is an object in the room, can't drop
- _vm->printStr(IDS_WTP_CANT_DROP);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_CANT_DROP);
+ getSelection(kSelAnyKey);
} else {
// HACK WARNING
- if (_game.iObjHave == 18) {
- _game.fGame[0x0d] = 0;
+ if (_gameStateWinnie.iObjHave == 18) {
+ _gameStateWinnie.fGame[0x0d] = 0;
}
- if (isRightObj(iRoom, _game.iObjHave, &iCode)) {
+ if (isRightObj(iRoom, _gameStateWinnie.iObjHave, &iCode)) {
// object has been dropped in the right place
- _vm->printStr(IDS_WTP_OK);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_OK);
+ getSelection(kSelAnyKey);
playSound(IDI_WTP_SND_DROP_OK);
- printObjStr(_game.iObjHave, IDI_WTP_OBJ_DROP);
- _vm->getSelection(kSelAnyKey);
+ printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_DROP);
+ getSelection(kSelAnyKey);
// increase amount of objects returned, decrease amount of objects missing
- _game.nObjMiss--;
- _game.nObjRet++;
+ _gameStateWinnie.nObjMiss--;
+ _gameStateWinnie.nObjRet++;
// xor the dropped object with 0x80 to signify it has been dropped in the right place
for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) {
- if (_game.iUsedObj[i] == _game.iObjHave) {
- _game.iUsedObj[i] ^= 0x80;
+ if (_gameStateWinnie.iUsedObj[i] == _gameStateWinnie.iObjHave) {
+ _gameStateWinnie.iUsedObj[i] ^= 0x80;
break;
}
}
// set flag according to dropped object's id
- _game.fGame[iCode] = 1;
+ _gameStateWinnie.fGame[iCode] = 1;
// player is carrying nothing
- _game.iObjHave = 0;
+ _gameStateWinnie.iObjHave = 0;
- if (!_game.nObjMiss) {
+ if (!_gameStateWinnie.nObjMiss) {
// all objects returned, tell player to find party
playSound(IDI_WTP_SND_FANFARE);
- _vm->printStr(IDS_WTP_GAME_OVER_0);
- _vm->getSelection(kSelAnyKey);
- _vm->printStr(IDS_WTP_GAME_OVER_1);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_GAME_OVER_0);
+ getSelection(kSelAnyKey);
+ printStr(IDS_WTP_GAME_OVER_1);
+ getSelection(kSelAnyKey);
}
} else {
// drop object in the given room
- _game.iObjRoom[_game.iObjHave] = iRoom;
+ _gameStateWinnie.iObjRoom[_gameStateWinnie.iObjHave] = iRoom;
// object has been dropped in the wrong place
- _vm->printStr(IDS_WTP_WRONG_PLACE);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_WRONG_PLACE);
+ getSelection(kSelAnyKey);
playSound(IDI_WTP_SND_DROP);
drawRoomPic();
- _vm->printStr(IDS_WTP_WRONG_PLACE);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_WRONG_PLACE);
+ getSelection(kSelAnyKey);
// print object description
- printObjStr(_game.iObjHave, IDI_WTP_OBJ_DESC);
- _vm->getSelection(kSelAnyKey);
+ printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_DESC);
+ getSelection(kSelAnyKey);
- _game.iObjHave = 0;
+ _gameStateWinnie.iObjHave = 0;
}
}
}
-void Winnie::dropObjRnd() {
- if (!_game.iObjHave)
+void WinnieEngine::dropObjRnd() {
+ if (!_gameStateWinnie.iObjHave)
return;
int iRoom = 0;
bool done = false;
while (!done) {
- iRoom = _vm->rnd(IDI_WTP_MAX_ROOM_NORMAL);
+ iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
done = true;
if (iRoom == _room)
done = false;
for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
- if (_game.iObjRoom[j] == iRoom) {
+ if (_gameStateWinnie.iObjRoom[j] == iRoom) {
done = false;
}
}
}
- _game.iObjRoom[_game.iObjHave] = iRoom;
- _game.iObjHave = 0;
+ _gameStateWinnie.iObjRoom[_gameStateWinnie.iObjHave] = iRoom;
+ _gameStateWinnie.iObjHave = 0;
}
-void Winnie::wind() {
+void WinnieEngine::wind() {
int iRoom = 0;
bool done;
_doWind = 0;
- _game.nMoves = 0;
- if (!_game.nObjMiss)
+ _gameStateWinnie.nMoves = 0;
+ if (!_gameStateWinnie.nObjMiss)
return;
- _vm->printStr(IDS_WTP_WIND_0);
+ printStr(IDS_WTP_WIND_0);
playSound(IDI_WTP_SND_WIND_0);
- _vm->getSelection(kSelAnyKey);
+ getSelection(kSelAnyKey);
- _vm->printStr(IDS_WTP_WIND_1);
+ printStr(IDS_WTP_WIND_1);
playSound(IDI_WTP_SND_WIND_0);
- _vm->getSelection(kSelAnyKey);
+ getSelection(kSelAnyKey);
dropObjRnd();
// randomize positions of objects at large
for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) {
- if (!(_game.iUsedObj[i] & IDI_XOR_KEY)) {
+ if (!(_gameStateWinnie.iUsedObj[i] & IDI_XOR_KEY)) {
done = false;
while (!done) {
- iRoom = _vm->rnd(IDI_WTP_MAX_ROOM_NORMAL);
+ iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
done = true;
for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
- if (_game.iObjRoom[j] == iRoom) {
+ if (_gameStateWinnie.iObjRoom[j] == iRoom) {
done = false;
}
}
}
- _game.iObjRoom[_game.iUsedObj[i]] = iRoom;
+ _gameStateWinnie.iObjRoom[_gameStateWinnie.iUsedObj[i]] = iRoom;
}
}
}
-void Winnie::mist() {
+void WinnieEngine::mist() {
// mist length in turns is (2-5)
- _mist = _vm->rnd(4) + 2;
+ _mist = rnd(4) + 2;
_room = IDI_WTP_ROOM_MIST;
drawRoomPic();
- _vm->printStr(IDS_WTP_MIST);
+ printStr(IDS_WTP_MIST);
}
-void Winnie::tigger() {
+void WinnieEngine::tigger() {
_room = IDI_WTP_ROOM_TIGGER;
drawRoomPic();
- _vm->printStr(IDS_WTP_TIGGER);
+ printStr(IDS_WTP_TIGGER);
dropObjRnd();
}
-void Winnie::showOwlHelp() {
- if (_game.iObjHave) {
- _vm->printStr(IDS_WTP_OWL_0);
- _vm->getSelection(kSelAnyKey);
- printObjStr(_game.iObjHave, IDI_WTP_OBJ_HELP);
- _vm->getSelection(kSelAnyKey);
+void WinnieEngine::showOwlHelp() {
+ if (_gameStateWinnie.iObjHave) {
+ printStr(IDS_WTP_OWL_0);
+ getSelection(kSelAnyKey);
+ printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_HELP);
+ getSelection(kSelAnyKey);
}
if (getObjInRoom(_room)) {
- _vm->printStr(IDS_WTP_OWL_0);
- _vm->getSelection(kSelAnyKey);
+ printStr(IDS_WTP_OWL_0);
+ getSelection(kSelAnyKey);
printObjStr(getObjInRoom(_room), IDI_WTP_OBJ_HELP);
- _vm->getSelection(kSelAnyKey);
+ getSelection(kSelAnyKey);
}
}
-void Winnie::drawMenu(char *szMenu, int iSel, int fCanSel[]) {
+void WinnieEngine::drawMenu(char *szMenu, int iSel, int fCanSel[]) {
int iRow = 0, iCol = 0;
- _vm->clearTextArea();
- _vm->drawStr(IDI_WTP_ROW_MENU, IDI_WTP_COL_MENU, IDA_DEFAULT, szMenu);
+ clearTextArea();
+ drawStr(IDI_WTP_ROW_MENU, IDI_WTP_COL_MENU, IDA_DEFAULT, szMenu);
if (fCanSel[IDI_WTP_SEL_NORTH])
- _vm->drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_NSEW, IDA_DEFAULT, IDS_WTP_NSEW);
+ drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_NSEW, IDA_DEFAULT, IDS_WTP_NSEW);
if (fCanSel[IDI_WTP_SEL_TAKE])
- _vm->drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_TAKE, IDA_DEFAULT, IDS_WTP_TAKE);
+ drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_TAKE, IDA_DEFAULT, IDS_WTP_TAKE);
if (fCanSel[IDI_WTP_SEL_DROP])
- _vm->drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_DROP, IDA_DEFAULT, IDS_WTP_DROP);
+ drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_DROP, IDA_DEFAULT, IDS_WTP_DROP);
switch (iSel) {
case IDI_WTP_SEL_OPT_1:
@@ -750,26 +754,25 @@ void Winnie::drawMenu(char *szMenu, int iSel, int fCanSel[]) {
iCol = IDI_WTP_COL_DROP;
break;
}
- _vm->drawStr(iRow, iCol - 1, IDA_DEFAULT, ">");
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen(); //TODO: Move to game's main loop
+ drawStr(iRow, iCol - 1, IDA_DEFAULT, ">");
+ _gfx->doUpdate();
}
-void Winnie::incMenuSel(int *iSel, int fCanSel[]) {
+void WinnieEngine::incMenuSel(int *iSel, int fCanSel[]) {
do {
*iSel += 1;
if (*iSel > IDI_WTP_SEL_DROP) *iSel = IDI_WTP_SEL_OPT_1;
} while (!fCanSel[*iSel]);
}
-void Winnie::decMenuSel(int *iSel, int fCanSel[]) {
+void WinnieEngine::decMenuSel(int *iSel, int fCanSel[]) {
do {
*iSel -= 1;
if (*iSel < IDI_WTP_SEL_OPT_1) *iSel = IDI_WTP_SEL_DROP;
} while (!fCanSel[*iSel]);
}
-void Winnie::getMenuMouseSel(int *iSel, int fCanSel[], int x, int y) {
+void WinnieEngine::getMenuMouseSel(int *iSel, int fCanSel[], int x, int y) {
switch (y) {
case IDI_WTP_ROW_OPTION_1:
case IDI_WTP_ROW_OPTION_2:
@@ -787,7 +790,7 @@ void Winnie::getMenuMouseSel(int *iSel, int fCanSel[], int x, int y) {
}
}
-void Winnie::makeSel(int *iSel, int fCanSel[]) {
+void WinnieEngine::makeSel(int *iSel, int fCanSel[]) {
if (fCanSel[*iSel])
return;
@@ -795,7 +798,7 @@ void Winnie::makeSel(int *iSel, int fCanSel[]) {
clrMenuSel(iSel, fCanSel);
}
-void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
+void WinnieEngine::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
Common::Event event;
int x, y;
@@ -805,8 +808,8 @@ void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
// Show the mouse cursor for the menu
CursorMan.showMouse(true);
- while (!_vm->shouldQuit()) {
- while (_vm->_system->getEventManager()->pollEvent(event)) {
+ while (!shouldQuit()) {
+ while (_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
@@ -818,15 +821,15 @@ void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
// Change cursor
if (fCanSel[IDI_WTP_SEL_NORTH] && hotspotNorth.contains(event.mouse.x, event.mouse.y)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else if (fCanSel[IDI_WTP_SEL_SOUTH] && hotspotSouth.contains(event.mouse.x, event.mouse.y)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else if (fCanSel[IDI_WTP_SEL_WEST] && hotspotWest.contains(event.mouse.x, event.mouse.y)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else if (fCanSel[IDI_WTP_SEL_EAST] && hotspotEast.contains(event.mouse.x, event.mouse.y)) {
- _vm->_gfx->setCursorPalette(true);
+ _gfx->setCursorPalette(true);
} else {
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
}
break;
@@ -835,25 +838,25 @@ void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
if (fCanSel[IDI_WTP_SEL_NORTH] && hotspotNorth.contains(event.mouse.x, event.mouse.y)) {
*iSel = IDI_WTP_SEL_NORTH;
makeSel(iSel, fCanSel);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
return;
} else if (fCanSel[IDI_WTP_SEL_SOUTH] && hotspotSouth.contains(event.mouse.x, event.mouse.y)) {
*iSel = IDI_WTP_SEL_SOUTH;
makeSel(iSel, fCanSel);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
return;
} else if (fCanSel[IDI_WTP_SEL_WEST] && hotspotWest.contains(event.mouse.x, event.mouse.y)) {
*iSel = IDI_WTP_SEL_WEST;
makeSel(iSel, fCanSel);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
return;
} else if (fCanSel[IDI_WTP_SEL_EAST] && hotspotEast.contains(event.mouse.x, event.mouse.y)) {
*iSel = IDI_WTP_SEL_EAST;
makeSel(iSel, fCanSel);
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
return;
} else {
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
}
switch (*iSel) {
@@ -890,9 +893,9 @@ void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
incMenuSel(iSel, fCanSel);
break;
case Common::EVENT_KEYDOWN:
- if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL) && _vm->_console) {
- _vm->_console->attach();
- _vm->_console->onFrame();
+ if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL) && _console) {
+ _console->attach();
+ _console->onFrame();
continue;
}
@@ -938,7 +941,7 @@ void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
break;
case Common::KEYCODE_s:
if (event.kbd.flags & Common::KBD_CTRL) {
- _vm->flipflag(fSoundOn);
+ flipflag(fSoundOn);
} else {
*iSel = IDI_WTP_SEL_SOUTH;
makeSel(iSel, fCanSel);
@@ -999,24 +1002,23 @@ void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
}
}
-void Winnie::gameLoop() {
+void WinnieEngine::gameLoop() {
WTP_ROOM_HDR hdr;
uint8 *roomdata = (uint8 *)malloc(4096);
int iBlock;
phase0:
- if (!_game.nObjMiss && (_room == IDI_WTP_ROOM_PICNIC))
+ if (!_gameStateWinnie.nObjMiss && (_room == IDI_WTP_ROOM_PICNIC))
_room = IDI_WTP_ROOM_PARTY;
readRoom(_room, roomdata, hdr);
drawRoomPic();
- _vm->_gfx->doUpdate();
- _vm->_system->updateScreen();
+ _gfx->doUpdate();
phase1:
if (getObjInRoom(_room)) {
printObjStr(getObjInRoom(_room), IDI_WTP_OBJ_DESC);
- _vm->getSelection(kSelAnyKey);
+ getSelection(kSelAnyKey);
}
phase2:
@@ -1025,7 +1027,7 @@ phase2:
goto phase1;
}
- while (!_vm->shouldQuit()) {
+ while (!shouldQuit()) {
for (iBlock = 0; iBlock < IDI_WTP_MAX_BLOCK; iBlock++) {
switch (parser(hdr.ofsBlock[iBlock] - _roomOffset, iBlock, roomdata)) {
case IDI_WTP_PAR_GOTO:
@@ -1041,17 +1043,16 @@ phase2:
free(roomdata);
}
-void Winnie::drawPic(const char *szName) {
- char szFile[256] = {0};
+void WinnieEngine::drawPic(const char *szName) {
+ Common::String fileName = szName;
+
+ if (getPlatform() != Common::kPlatformAmiga)
+ fileName += ".pic";
+
Common::File file;
- // construct filename
- if (_vm->getPlatform() != Common::kPlatformAmiga)
- sprintf(szFile, "%s.pic", szName);
- else
- strcpy(szFile, szName);
- if (!file.open(szFile)) {
- warning ("Could not open file \'%s\'", szFile);
+ if (!file.open(fileName)) {
+ warning ("Could not open file \'%s\'", fileName.c_str());
return;
}
@@ -1060,13 +1061,13 @@ void Winnie::drawPic(const char *szName) {
file.read(buffer, size);
file.close();
- _vm->_picture->decodePicture(buffer, size, 1, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
- _vm->_picture->showPic(IDI_WTP_PIC_X0, IDI_WTP_PIC_Y0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+ _picture->decodePicture(buffer, size, 1, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+ _picture->showPic(IDI_WTP_PIC_X0, IDI_WTP_PIC_Y0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
free(buffer);
}
-void Winnie::drawObjPic(int iObj, int x0, int y0) {
+void WinnieEngine::drawObjPic(int iObj, int x0, int y0) {
if (!iObj)
return;
@@ -1075,28 +1076,28 @@ void Winnie::drawObjPic(int iObj, int x0, int y0) {
uint32 objSize = readObj(iObj, buffer);
parseObjHeader(&objhdr, buffer, sizeof(WTP_OBJ_HDR));
- _vm->_picture->setOffset(x0, y0);
- _vm->_picture->decodePicture(buffer + objhdr.ofsPic - _objOffset, objSize, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
- _vm->_picture->setOffset(0, 0);
- _vm->_picture->showPic(10, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+ _picture->setOffset(x0, y0);
+ _picture->decodePicture(buffer + objhdr.ofsPic - _objOffset, objSize, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+ _picture->setOffset(0, 0);
+ _picture->showPic(10, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
free(buffer);
}
-void Winnie::drawRoomPic() {
+void WinnieEngine::drawRoomPic() {
WTP_ROOM_HDR roomhdr;
uint8 *buffer = (uint8 *)malloc(4096);
int iObj = getObjInRoom(_room);
// clear gfx screen
- _vm->_gfx->clearScreen(0);
+ _gfx->clearScreen(0);
// read room picture
readRoom(_room, buffer, roomhdr);
// draw room picture
- _vm->_picture->decodePicture(buffer + roomhdr.ofsPic - _roomOffset, 4096, 1, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
- _vm->_picture->showPic(IDI_WTP_PIC_X0, IDI_WTP_PIC_Y0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+ _picture->decodePicture(buffer + roomhdr.ofsPic - _roomOffset, 4096, 1, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+ _picture->showPic(IDI_WTP_PIC_X0, IDI_WTP_PIC_Y0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
// draw object picture
drawObjPic(iObj, IDI_WTP_PIC_X0 + roomhdr.objX, IDI_WTP_PIC_Y0 + roomhdr.objY);
@@ -1104,21 +1105,68 @@ void Winnie::drawRoomPic() {
free(buffer);
}
-bool Winnie::playSound(ENUM_WTP_SOUND iSound) {
- //TODO
- warning ("STUB: playSound(%d)", iSound);
- return 1;
+bool WinnieEngine::playSound(ENUM_WTP_SOUND iSound) {
+ // TODO: Only DOS sound is supported, currently
+ if (getPlatform() != Common::kPlatformPC) {
+ warning("STUB: playSound(%d)", iSound);
+ return false;
+ }
+
+ Common::String fileName = Common::String::format(IDS_WTP_SND_DOS, iSound);
+
+ Common::File file;
+ if (!file.open(fileName))
+ return false;
+
+ uint32 size = file.size();
+ byte *data = new byte[size];
+ file.read(data, size);
+ file.close();
+
+ _game.sounds[0] = AgiSound::createFromRawResource(data, size, 0, *_sound, _soundemu);
+ _sound->startSound(0, 0);
+
+ bool cursorShowing = CursorMan.showMouse(false);
+ _system->updateScreen();
+
+ // Loop until the sound is done
+ bool skippedSound = false;
+ while (!shouldQuit() && _game.sounds[0]->isPlaying()) {
+ Common::Event event;
+ while (_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_KEYDOWN:
+ _sound->stopSound();
+ skippedSound = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ _system->delayMillis(10);
+ }
+
+ if (cursorShowing) {
+ CursorMan.showMouse(true);
+ _system->updateScreen();
+ }
+
+ delete _game.sounds[0];
+ _game.sounds[0] = 0;
+
+ return !shouldQuit() && !skippedSound;
}
-void Winnie::clrMenuSel(int *iSel, int fCanSel[]) {
+void WinnieEngine::clrMenuSel(int *iSel, int fCanSel[]) {
*iSel = IDI_WTP_SEL_OPT_1;
while (!fCanSel[*iSel]) {
*iSel += 1;
}
- _vm->_gfx->setCursorPalette(false);
+ _gfx->setCursorPalette(false);
}
-void Winnie::printRoomStr(int iRoom, int iStr) {
+void WinnieEngine::printRoomStr(int iRoom, int iStr) {
WTP_ROOM_HDR hdr;
uint8 *buffer = (uint8 *)malloc(4096);
@@ -1128,62 +1176,60 @@ void Winnie::printRoomStr(int iRoom, int iStr) {
free(buffer);
}
-void Winnie::gameOver() {
+void WinnieEngine::gameOver() {
// sing the Pooh song forever
- while (!_vm->shouldQuit()) {
- _vm->printStr(IDS_WTP_SONG_0);
+ while (!shouldQuit()) {
+ printStr(IDS_WTP_SONG_0);
playSound(IDI_WTP_SND_POOH_0);
- _vm->printStr(IDS_WTP_SONG_1);
+ printStr(IDS_WTP_SONG_1);
playSound(IDI_WTP_SND_POOH_1);
- _vm->printStr(IDS_WTP_SONG_2);
+ printStr(IDS_WTP_SONG_2);
playSound(IDI_WTP_SND_POOH_2);
- _vm->getSelection(kSelAnyKey);
+ getSelection(kSelAnyKey);
}
}
-void Winnie::saveGame() {
- Common::OutSaveFile* outfile;
- char szFile[256] = {0};
+void WinnieEngine::saveGame() {
int i = 0;
- sprintf(szFile, IDS_WTP_FILE_SAVEGAME);
- if (!(outfile = _vm->getSaveFileMan()->openForSaving(szFile)))
+ Common::OutSaveFile *outfile = getSaveFileMan()->openForSaving(IDS_WTP_FILE_SAVEGAME);
+
+ if (!outfile)
return;
outfile->writeUint32BE(MKTAG('W','I','N','N')); // header
outfile->writeByte(WTP_SAVEGAME_VERSION);
- outfile->writeByte(_game.fSound);
- outfile->writeByte(_game.nMoves);
- outfile->writeByte(_game.nObjMiss);
- outfile->writeByte(_game.nObjRet);
- outfile->writeByte(_game.iObjHave);
+ outfile->writeByte(_gameStateWinnie.fSound);
+ outfile->writeByte(_gameStateWinnie.nMoves);
+ outfile->writeByte(_gameStateWinnie.nObjMiss);
+ outfile->writeByte(_gameStateWinnie.nObjRet);
+ outfile->writeByte(_gameStateWinnie.iObjHave);
for (i = 0; i < IDI_WTP_MAX_FLAG; i++)
- outfile->writeByte(_game.fGame[i]);
+ outfile->writeByte(_gameStateWinnie.fGame[i]);
for (i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++)
- outfile->writeByte(_game.iUsedObj[i]);
+ outfile->writeByte(_gameStateWinnie.iUsedObj[i]);
for (i = 0; i < IDI_WTP_MAX_ROOM_OBJ; i++)
- outfile->writeByte(_game.iObjRoom[i]);
+ outfile->writeByte(_gameStateWinnie.iObjRoom[i]);
outfile->finalize();
if (outfile->err())
- warning("Can't write file '%s'. (Disk full?)", szFile);
+ warning("Can't write file '%s'. (Disk full?)", IDS_WTP_FILE_SAVEGAME);
delete outfile;
}
-void Winnie::loadGame() {
- Common::InSaveFile* infile;
- char szFile[256] = {0};
+void WinnieEngine::loadGame() {
int saveVersion = 0;
int i = 0;
- sprintf(szFile, IDS_WTP_FILE_SAVEGAME);
- if (!(infile = _vm->getSaveFileMan()->openForLoading(szFile)))
+ Common::InSaveFile *infile = getSaveFileMan()->openForLoading(IDS_WTP_FILE_SAVEGAME);
+
+ if (!infile)
return;
if (infile->readUint32BE() == MKTAG('W','I','N','N')) {
@@ -1191,11 +1237,11 @@ void Winnie::loadGame() {
if (saveVersion != WTP_SAVEGAME_VERSION)
warning("Old save game version (%d, current version is %d). Will try and read anyway, but don't be surprised if bad things happen", saveVersion, WTP_SAVEGAME_VERSION);
- _game.fSound = infile->readByte();
- _game.nMoves = infile->readByte();
- _game.nObjMiss = infile->readByte();
- _game.nObjRet = infile->readByte();
- _game.iObjHave = infile->readByte();
+ _gameStateWinnie.fSound = infile->readByte();
+ _gameStateWinnie.nMoves = infile->readByte();
+ _gameStateWinnie.nObjMiss = infile->readByte();
+ _gameStateWinnie.nObjRet = infile->readByte();
+ _gameStateWinnie.iObjHave = infile->readByte();
} else {
// This is probably a save from the original interpreter, throw a warning and attempt
// to read it as LE
@@ -1208,31 +1254,31 @@ void Winnie::loadGame() {
infile->readUint16LE(); // skip unused field
infile->readByte(); // first 8 bits of fSound
- _game.fSound = infile->readByte();
+ _gameStateWinnie.fSound = infile->readByte();
infile->readByte(); // first 8 bits of nMoves
- _game.nMoves = infile->readByte();
+ _gameStateWinnie.nMoves = infile->readByte();
infile->readByte(); // first 8 bits of nObjMiss
- _game.nObjMiss = infile->readByte();
+ _gameStateWinnie.nObjMiss = infile->readByte();
infile->readByte(); // first 8 bits of nObjRet
- _game.nObjRet = infile->readByte();
+ _gameStateWinnie.nObjRet = infile->readByte();
infile->readUint16LE(); // skip unused field
infile->readUint16LE(); // skip unused field
infile->readUint16LE(); // skip unused field
infile->readByte(); // first 8 bits of iObjHave
- _game.iObjHave = infile->readByte();
+ _gameStateWinnie.iObjHave = infile->readByte();
infile->readUint16LE(); // skip unused field
infile->readUint16LE(); // skip unused field
infile->readUint16LE(); // skip unused field
}
for (i = 0; i < IDI_WTP_MAX_FLAG; i++)
- _game.fGame[i] = infile->readByte();
+ _gameStateWinnie.fGame[i] = infile->readByte();
for (i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++)
- _game.iUsedObj[i] = infile->readByte();
+ _gameStateWinnie.iUsedObj[i] = infile->readByte();
for (i = 0; i < IDI_WTP_MAX_ROOM_OBJ; i++)
- _game.iObjRoom[i] = infile->readByte();
+ _gameStateWinnie.iObjRoom[i] = infile->readByte();
// Note that saved games from the original interpreter have 2 more 16-bit fields here
// which are ignored
@@ -1240,37 +1286,59 @@ void Winnie::loadGame() {
delete infile;
}
-void Winnie::printStrWinnie(char *szMsg) {
- if (_vm->getPlatform() != Common::kPlatformAmiga)
- _vm->printStrXOR(szMsg);
+void WinnieEngine::printStrWinnie(char *szMsg) {
+ if (getPlatform() != Common::kPlatformAmiga)
+ printStrXOR(szMsg);
else
- _vm->printStr(szMsg);
+ printStr(szMsg);
}
// Console-related functions
-void Winnie::debugCurRoom() {
- _vm->_console->DebugPrintf("Current Room = %d\n", _room);
+void WinnieEngine::debugCurRoom() {
+ _console->DebugPrintf("Current Room = %d\n", _room);
}
-Winnie::Winnie(PreAgiEngine* vm) : _vm(vm) {
- _vm->_console = new Winnie_Console(_vm, this);
+WinnieEngine::WinnieEngine(OSystem *syst, const AGIGameDescription *gameDesc) : PreAgiEngine(syst, gameDesc) {
+ _console = new WinnieConsole(this);
}
-void Winnie::init() {
- memset(&_game, 0, sizeof(_game));
- _game.fSound = 1;
- _game.nObjMiss = IDI_WTP_MAX_OBJ_MISSING;
- _game.nObjRet = 0;
- _game.fGame[0] = 1;
- _game.fGame[1] = 1;
+WinnieEngine::~WinnieEngine() {
+ delete _console;
+}
+
+void WinnieEngine::init() {
+ // Initialize sound
+
+ switch (MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK|MDT_PCJR))) {
+ case MT_PCSPK:
+ _soundemu = SOUND_EMU_PC;
+ break;
+ case MT_PCJR:
+ _soundemu = SOUND_EMU_PCJR;
+ break;
+ default:
+ _soundemu = SOUND_EMU_NONE;
+ break;
+ }
+
+ _sound = new SoundMgr(this, _mixer);
+ _sound->initSound();
+ setflag(fSoundOn, true); // enable sound
+
+ memset(&_gameStateWinnie, 0, sizeof(_gameStateWinnie));
+ _gameStateWinnie.fSound = 1;
+ _gameStateWinnie.nObjMiss = IDI_WTP_MAX_OBJ_MISSING;
+ _gameStateWinnie.nObjRet = 0;
+ _gameStateWinnie.fGame[0] = 1;
+ _gameStateWinnie.fGame[1] = 1;
_room = IDI_WTP_ROOM_HOME;
_mist = -1;
_doWind = false;
_winnieEvent = false;
- if (_vm->getPlatform() != Common::kPlatformAmiga) {
+ if (getPlatform() != Common::kPlatformAmiga) {
_isBigEndian = false;
_roomOffset = IDI_WTP_OFS_ROOM;
_objOffset = IDI_WTP_OFS_OBJ;
@@ -1280,8 +1348,8 @@ void Winnie::init() {
_objOffset = 0;
}
- if (_vm->getPlatform() == Common::kPlatformC64 || _vm->getPlatform() == Common::kPlatformApple2GS)
- _vm->_picture->setPictureVersion(AGIPIC_C64);
+ if (getPlatform() == Common::kPlatformC64 || getPlatform() == Common::kPlatformApple2GS)
+ _picture->setPictureVersion(AGIPIC_C64);
hotspotNorth = Common::Rect(20, 0, (IDI_WTP_PIC_WIDTH + 10) * 2, 10);
hotspotSouth = Common::Rect(20, IDI_WTP_PIC_HEIGHT - 10, (IDI_WTP_PIC_WIDTH + 10) * 2, IDI_WTP_PIC_HEIGHT);
@@ -1289,11 +1357,17 @@ void Winnie::init() {
hotspotWest = Common::Rect(20, 0, 30, IDI_WTP_PIC_HEIGHT);
}
-void Winnie::run() {
+Common::Error WinnieEngine::go() {
+ init();
randomize();
- if (_vm->getPlatform() != Common::kPlatformC64 && _vm->getPlatform() != Common::kPlatformApple2GS)
+
+ // The intro is not supported on these platforms yet
+ if (getPlatform() != Common::kPlatformC64 && getPlatform() != Common::kPlatformApple2GS)
intro();
+
gameLoop();
-}
+ return Common::kNoError;
}
+
+} // End of namespace AGI
diff --git a/engines/agi/preagi_winnie.h b/engines/agi/preagi_winnie.h
index 002eada65c..96ae65997e 100644
--- a/engines/agi/preagi_winnie.h
+++ b/engines/agi/preagi_winnie.h
@@ -281,19 +281,22 @@ struct WTP_SAVE_GAME {
class PreAgiEngine;
-class Winnie {
+class WinnieEngine : public PreAgiEngine {
public:
- Winnie(PreAgiEngine *vm);
+ WinnieEngine(OSystem *syst, const AGIGameDescription *gameDesc);
+ ~WinnieEngine();
void init();
- void run();
+ Common::Error go();
void debugCurRoom();
+ GUI::Debugger *getDebugger() { return _console; }
+
private:
- PreAgiEngine *_vm;
+ WinnieConsole *_console;
- WTP_SAVE_GAME _game;
+ WTP_SAVE_GAME _gameStateWinnie;
int _room;
int _mist;
bool _doWind;
@@ -355,5 +358,3 @@ private:
} // End of namespace Agi
#endif
-
-
diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp
index dae3dd42c1..3cebbf50c8 100644
--- a/engines/agi/saveload.cpp
+++ b/engines/agi/saveload.cpp
@@ -53,22 +53,22 @@ namespace Agi {
static const uint32 AGIflag = MKTAG('A','G','I',':');
-int AgiEngine::saveGame(const char *fileName, const char *description) {
+int AgiEngine::saveGame(const Common::String &fileName, const Common::String &description) {
char gameIDstring[8] = "gameIDX";
int i;
Common::OutSaveFile *out;
int result = errOK;
- debugC(3, kDebugLevelMain | kDebugLevelSavegame, "AgiEngine::saveGame(%s, %s)", fileName, description);
+ debugC(3, kDebugLevelMain | kDebugLevelSavegame, "AgiEngine::saveGame(%s, %s)", fileName.c_str(), description.c_str());
if (!(out = _saveFileMan->openForSaving(fileName))) {
- warning("Can't create file '%s', game not saved", fileName);
+ warning("Can't create file '%s', game not saved", fileName.c_str());
return errBadFileOpen;
} else {
- debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for writing", fileName);
+ debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for writing", fileName.c_str());
}
out->writeUint32BE(AGIflag);
- out->write(description, 31);
+ out->write(description.c_str(), 31);
out->writeByte(SAVEGAME_VERSION);
debugC(5, kDebugLevelMain | kDebugLevelSavegame, "Writing save game version (%d)", SAVEGAME_VERSION);
@@ -239,33 +239,33 @@ int AgiEngine::saveGame(const char *fileName, const char *description) {
out->finalize();
if (out->err()) {
- warning("Can't write file '%s'. (Disk full?)", fileName);
+ warning("Can't write file '%s'. (Disk full?)", fileName.c_str());
result = errIOError;
} else
- debugC(1, kDebugLevelMain | kDebugLevelSavegame, "Saved game %s in file %s", description, fileName);
+ debugC(1, kDebugLevelMain | kDebugLevelSavegame, "Saved game %s in file %s", description.c_str(), fileName.c_str());
delete out;
- debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName);
+ debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName.c_str());
_lastSaveTime = _system->getMillis();
return result;
}
-int AgiEngine::loadGame(const char *fileName, bool checkId) {
+int AgiEngine::loadGame(const Common::String &fileName, bool checkId) {
char description[31], saveVersion, loadId[8];
int i, vtEntries = MAX_VIEWTABLE;
uint8 t;
int16 parm[7];
Common::InSaveFile *in;
- debugC(3, kDebugLevelMain | kDebugLevelSavegame, "AgiEngine::loadGame(%s)", fileName);
+ debugC(3, kDebugLevelMain | kDebugLevelSavegame, "AgiEngine::loadGame(%s)", fileName.c_str());
if (!(in = _saveFileMan->openForLoading(fileName))) {
- warning("Can't open file '%s', game not loaded", fileName);
+ warning("Can't open file '%s', game not loaded", fileName.c_str());
return errBadFileOpen;
} else {
- debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for reading", fileName);
+ debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for reading", fileName.c_str());
}
uint32 typea = in->readUint32BE();
@@ -290,11 +290,7 @@ int AgiEngine::loadGame(const char *fileName, bool checkId) {
if (saveVersion >= 4) {
// We don't need the thumbnail here, so just read it and discard it
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- Graphics::loadThumbnail(*in, *thumbnail);
- delete thumbnail;
- thumbnail = 0;
+ Graphics::skipThumbnail(*in);
in->readUint32BE(); // save date
in->readUint16BE(); // save time
@@ -478,8 +474,8 @@ int AgiEngine::loadGame(const char *fileName, bool checkId) {
v->cycleTimeCount = in->readByte();
v->direction = in->readByte();
- v->motion = in->readByte();
- v->cycle = in->readByte();
+ v->motion = (MotionType)in->readByte();
+ v->cycle = (CycleType)in->readByte();
v->priority = in->readByte();
v->flags = in->readUint16BE();
@@ -531,7 +527,7 @@ int AgiEngine::loadGame(const char *fileName, bool checkId) {
_gfx->setAGIPal(in->readSint16BE());
delete in;
- debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName);
+ debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName.c_str());
setflag(fRestoreJustRan, true);
@@ -550,27 +546,27 @@ int AgiEngine::loadGame(const char *fileName, bool checkId) {
#define NUM_SLOTS 100
#define NUM_VISIBLE_SLOTS 12
-const char *AgiEngine::getSavegameFilename(int num) {
+Common::String AgiEngine::getSavegameFilename(int num) const {
Common::String saveLoadSlot = _targetName;
saveLoadSlot += Common::String::format(".%.3d", num);
- return saveLoadSlot.c_str();
+ return saveLoadSlot;
}
void AgiEngine::getSavegameDescription(int num, char *buf, bool showEmpty) {
- char fileName[MAXPATHLEN];
Common::InSaveFile *in;
+ Common::String fileName = getSavegameFilename(num);
debugC(4, kDebugLevelMain | kDebugLevelSavegame, "Current game id is %s", _targetName.c_str());
- sprintf(fileName, "%s", getSavegameFilename(num));
+
if (!(in = _saveFileMan->openForLoading(fileName))) {
- debugC(4, kDebugLevelMain | kDebugLevelSavegame, "File %s does not exist", fileName);
+ debugC(4, kDebugLevelMain | kDebugLevelSavegame, "File %s does not exist", fileName.c_str());
if (showEmpty)
strcpy(buf, " (empty slot)");
else
*buf = 0;
} else {
- debugC(4, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for reading", fileName);
+ debugC(4, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for reading", fileName.c_str());
uint32 type = in->readUint32BE();
@@ -786,7 +782,6 @@ getout:
}
int AgiEngine::saveGameDialog() {
- char fileName[MAXPATHLEN];
char *desc;
const char *buttons[] = { "Do as I say!", "I regret", NULL };
char dstr[200];
@@ -856,8 +851,8 @@ int AgiEngine::saveGameDialog() {
return errOK;
}
- sprintf(fileName, "%s", getSavegameFilename(_firstSlot + slot));
- debugC(8, kDebugLevelMain | kDebugLevelResources, "file is [%s]", fileName);
+ Common::String fileName = getSavegameFilename(_firstSlot + slot);
+ debugC(8, kDebugLevelMain | kDebugLevelResources, "file is [%s]", fileName.c_str());
// Make sure all graphics was blitted to screen. This fixes bug
// #2960567: "AGI: Ego partly erased in Load/Save thumbnails"
@@ -874,14 +869,15 @@ int AgiEngine::saveGameDialog() {
}
int AgiEngine::saveGameSimple() {
- int result = saveGame(getSavegameFilename(0), "Default savegame");
+ Common::String fileName = getSavegameFilename(0);
+
+ int result = saveGame(fileName, "Default savegame");
if (result != errOK)
messageBox("Error saving game.");
return result;
}
int AgiEngine::loadGameDialog() {
- char fileName[MAXPATHLEN];
int rc, slot = 0;
int hm, vm, hp, vp; // box margins
int w;
@@ -908,7 +904,7 @@ int AgiEngine::loadGameDialog() {
return errOK;
}
- sprintf(fileName, "%s", getSavegameFilename(_firstSlot + slot));
+ Common::String fileName = getSavegameFilename(_firstSlot + slot);
if ((rc = loadGame(fileName)) == errOK) {
messageBox("Game restored.");
@@ -922,10 +918,9 @@ int AgiEngine::loadGameDialog() {
}
int AgiEngine::loadGameSimple() {
- char fileName[MAXPATHLEN];
int rc = 0;
- sprintf(fileName, "%s", getSavegameFilename(0));
+ Common::String fileName = getSavegameFilename(0);
_sprites->eraseBoth();
_sound->stopSound();
@@ -984,12 +979,12 @@ void AgiEngine::releaseImageStack() {
void AgiEngine::checkQuickLoad() {
if (ConfMan.hasKey("save_slot")) {
- Common::String saveNameBuffer = Common::String::format("%s.%03d", _targetName.c_str(), ConfMan.getInt("save_slot"));
+ Common::String saveNameBuffer = getSavegameFilename(ConfMan.getInt("save_slot"));
_sprites->eraseBoth();
_sound->stopSound();
- if (loadGame(saveNameBuffer.c_str(), false) == errOK) { // Do not check game id
+ if (loadGame(saveNameBuffer, false) == errOK) { // Do not check game id
_game.exitAllLogics = 1;
_menu->enableAll();
}
@@ -997,8 +992,7 @@ void AgiEngine::checkQuickLoad() {
}
Common::Error AgiEngine::loadGameState(int slot) {
- char saveLoadSlot[12];
- sprintf(saveLoadSlot, "%s.%.3d", _targetName.c_str(), slot);
+ Common::String saveLoadSlot = getSavegameFilename(slot);
_sprites->eraseBoth();
_sound->stopSound();
@@ -1013,9 +1007,8 @@ Common::Error AgiEngine::loadGameState(int slot) {
}
Common::Error AgiEngine::saveGameState(int slot, const Common::String &desc) {
- char saveLoadSlot[12];
- sprintf(saveLoadSlot, "%s.%.3d", _targetName.c_str(), slot);
- if (saveGame(saveLoadSlot, desc.c_str()) == errOK)
+ Common::String saveLoadSlot = getSavegameFilename(slot);
+ if (saveGame(saveLoadSlot, desc) == errOK)
return Common::kNoError;
else
return Common::kUnknownError;
diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp
index f2d7af32da..ca3d799ecc 100644
--- a/engines/agi/sound.cpp
+++ b/engines/agi/sound.cpp
@@ -41,6 +41,10 @@ AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, S
return NULL;
uint16 type = READ_LE_UINT16(data);
+ // For V1 sound resources
+ if (type != AGI_SOUND_SAMPLE && (type & 0xFF) == 0x01)
+ return new PCjrSound(data, len, resnum, manager);
+
switch (type) { // Create a sound object based on the type
case AGI_SOUND_SAMPLE:
return new IIgsSample(data, len, resnum, manager);
@@ -62,6 +66,11 @@ PCjrSound::PCjrSound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : A
_data = data; // Save the resource pointer
_len = len; // Save the resource's length
_type = READ_LE_UINT16(data); // Read sound resource's type
+
+ // Detect V1 sound resources
+ if ((_type & 0xFF) == 0x01)
+ _type = AGI_SOUND_4CHN;
+
_isValid = (_type == AGI_SOUND_4CHN) && (_data != NULL) && (_len >= 2);
if (!_isValid) // Check for errors
@@ -127,7 +136,12 @@ void SoundMgr::startSound(int resnum, int flag) {
// Reset the flag
_endflag = flag;
- _vm->setflag(_endflag, false);
+
+ if (_vm->getVersion() < 0x2000) {
+ _vm->_game.vars[_endflag] = 0;
+ } else {
+ _vm->setflag(_endflag, false);
+ }
}
void SoundMgr::stopSound() {
@@ -142,8 +156,13 @@ void SoundMgr::stopSound() {
// This is probably not needed most of the time, but there also should
// not be any harm doing it, so do it anyway.
- if (_endflag != -1)
- _vm->setflag(_endflag, true);
+ if (_endflag != -1) {
+ if (_vm->getVersion() < 0x2000) {
+ _vm->_game.vars[_endflag] = 1;
+ } else {
+ _vm->setflag(_endflag, true);
+ }
+ }
_endflag = -1;
}
@@ -168,7 +187,7 @@ void SoundMgr::soundIsFinished() {
_endflag = -1;
}
-SoundMgr::SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer) {
+SoundMgr::SoundMgr(AgiBase *agi, Audio::Mixer *pMixer) {
_vm = agi;
_endflag = -1;
_playingSound = -1;
diff --git a/engines/agi/sound.h b/engines/agi/sound.h
index 0ee19878c4..6fd8dd516e 100644
--- a/engines/agi/sound.h
+++ b/engines/agi/sound.h
@@ -71,7 +71,7 @@ class SoundMgr;
class SoundGen {
public:
- SoundGen(AgiEngine *vm, Audio::Mixer *pMixer) : _vm(vm), _mixer(pMixer) {
+ SoundGen(AgiBase *vm, Audio::Mixer *pMixer) : _vm(vm), _mixer(pMixer) {
_sampleRate = pMixer->getOutputRate();
}
@@ -80,7 +80,7 @@ public:
virtual void play(int resnum) = 0;
virtual void stop(void) = 0;
- AgiEngine *_vm;
+ AgiBase *_vm;
Audio::Mixer *_mixer;
Audio::SoundHandle _soundHandle;
@@ -122,6 +122,8 @@ public:
~PCjrSound() { free(_data); }
virtual uint16 type() { return _type; }
const uint8 *getVoicePointer(uint voiceNum);
+ uint8 *getData() { return _data; }
+ uint32 getLength() { return _len; }
protected:
uint8 *_data; ///< Raw sound resource data
uint32 _len; ///< Length of the raw sound resource
@@ -131,7 +133,7 @@ protected:
class SoundMgr {
public:
- SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer);
+ SoundMgr(AgiBase *agi, Audio::Mixer *pMixer);
~SoundMgr();
void setVolume(uint8 volume);
@@ -147,7 +149,7 @@ public:
private:
int _endflag;
- AgiEngine *_vm;
+ AgiBase *_vm;
SoundGen *_soundGen;
diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp
index 38e256aa4b..c5cfa125d6 100644
--- a/engines/agi/sound_2gs.cpp
+++ b/engines/agi/sound_2gs.cpp
@@ -33,7 +33,7 @@
namespace Agi {
-SoundGen2GS::SoundGen2GS(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) {
+SoundGen2GS::SoundGen2GS(AgiBase *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) {
// Allocate memory for the wavetable
_wavetable = new int8[SIERRASTANDARD_SIZE];
diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h
index 9123e18415..89ffc3fe11 100644
--- a/engines/agi/sound_2gs.h
+++ b/engines/agi/sound_2gs.h
@@ -215,7 +215,7 @@ private:
class SoundGen2GS : public SoundGen, public Audio::AudioStream {
public:
- SoundGen2GS(AgiEngine *vm, Audio::Mixer *pMixer);
+ SoundGen2GS(AgiBase *vm, Audio::Mixer *pMixer);
~SoundGen2GS();
void play(int resnum);
diff --git a/engines/agi/sound_coco3.cpp b/engines/agi/sound_coco3.cpp
index 281f2cb2d4..64818e4e34 100644
--- a/engines/agi/sound_coco3.cpp
+++ b/engines/agi/sound_coco3.cpp
@@ -34,7 +34,7 @@ static int cocoFrequencies[] = {
2093, 2217, 2349, 2489, 2637, 2793, 2959, 3135, 3322, 3520, 3729, 3951
};
-SoundGenCoCo3::SoundGenCoCo3(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) {
+SoundGenCoCo3::SoundGenCoCo3(AgiBase *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) {
}
SoundGenCoCo3::~SoundGenCoCo3() {
diff --git a/engines/agi/sound_coco3.h b/engines/agi/sound_coco3.h
index 7058b770f5..d24acf5cc5 100644
--- a/engines/agi/sound_coco3.h
+++ b/engines/agi/sound_coco3.h
@@ -42,7 +42,7 @@ struct CoCoNote {
class SoundGenCoCo3 : public SoundGen, public Audio::AudioStream {
public:
- SoundGenCoCo3(AgiEngine *vm, Audio::Mixer *pMixer);
+ SoundGenCoCo3(AgiBase *vm, Audio::Mixer *pMixer);
~SoundGenCoCo3();
void play(int resnum);
diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp
index 0cbaa4af86..47d354093b 100644
--- a/engines/agi/sound_midi.cpp
+++ b/engines/agi/sound_midi.cpp
@@ -69,7 +69,7 @@ MIDISound::MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : A
warning("Error creating MIDI sound from resource %d (Type %d, length %d)", resnum, _type, len);
}
-SoundGenMIDI::SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _isGM(false) {
+SoundGenMIDI::SoundGenMIDI(AgiBase *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _isGM(false) {
MidiPlayer::createDriver(MDT_MIDI | MDT_ADLIB);
int ret = _driver->open();
diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h
index 92a4002498..36bd66ee76 100644
--- a/engines/agi/sound_midi.h
+++ b/engines/agi/sound_midi.h
@@ -45,7 +45,7 @@ protected:
class SoundGenMIDI : public SoundGen, public Audio::MidiPlayer {
public:
- SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer);
+ SoundGenMIDI(AgiBase *vm, Audio::Mixer *pMixer);
void play(int resnum);
// We must overload stop() here to implement the pure virtual
diff --git a/engines/agi/sound_pcjr.cpp b/engines/agi/sound_pcjr.cpp
index fdebf16b1a..d21baa450f 100644
--- a/engines/agi/sound_pcjr.cpp
+++ b/engines/agi/sound_pcjr.cpp
@@ -102,7 +102,7 @@ const int8 dissolveDataV3[] = {
};
-SoundGenPCJr::SoundGenPCJr(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) {
+SoundGenPCJr::SoundGenPCJr(AgiBase *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) {
_chanAllocated = 10240; // preallocate something which will most likely fit
_chanData = (int16 *)malloc(_chanAllocated << 1);
@@ -126,6 +126,9 @@ SoundGenPCJr::SoundGenPCJr(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, p
memset(_tchannel, 0, sizeof(_tchannel));
_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
+
+ _v1data = NULL;
+ _v1size = 0;
}
SoundGenPCJr::~SoundGenPCJr() {
@@ -153,6 +156,9 @@ void SoundGenPCJr::play(int resnum) {
_tchannel[i].genType = kGenTone;
_tchannel[i].genTypePrev = -1;
}
+
+ _v1data = pcjrSound->getData() + 1;
+ _v1size = pcjrSound->getLength() - 1;
}
void SoundGenPCJr::stop(void) {
@@ -201,7 +207,7 @@ int SoundGenPCJr::volumeCalc(SndGenChan *chan) {
chan->attenuationCopy = attenuation;
attenuation &= 0x0F;
- attenuation += _vm->getvar(vVolume);
+ attenuation += _mixer->getVolumeForSoundType(Audio::Mixer::kSFXSoundType) / 17;
if (attenuation > 0x0F)
attenuation = 0x0F;
}
@@ -214,16 +220,25 @@ int SoundGenPCJr::volumeCalc(SndGenChan *chan) {
return attenuation;
}
+int SoundGenPCJr::getNextNote(int ch)
+{
+ if (_vm->getVersion() > 0x2001)
+ return getNextNote_v2(ch);
+ else
+ return getNextNote_v1(ch);
+
+ return -1;
+}
+
// read the next channel data.. fill it in *tone
// if tone isn't touched.. it should be inited so it just plays silence
// return 0 if it's passing more data
// return -1 if it's passing nothing (end of data)
-int SoundGenPCJr::getNextNote(int ch, Tone *tone) {
+int SoundGenPCJr::getNextNote_v2(int ch) {
ToneChan *tpcm;
SndGenChan *chan;
const byte *data;
- assert(tone);
assert(ch < CHAN_MAX);
if (!_vm->getflag(fSoundOn))
@@ -234,7 +249,7 @@ int SoundGenPCJr::getNextNote(int ch, Tone *tone) {
if (!chan->avail)
return -1;
- while ((chan->duration == 0) && (chan->duration != 0xFFFF)) {
+ while (chan->duration <= 0) {
data = chan->data;
// read the duration of the note
@@ -242,58 +257,32 @@ int SoundGenPCJr::getNextNote(int ch, Tone *tone) {
// if it's 0 then it's not going to be played
// if it's 0xFFFF then the channel data has finished.
- if ((chan->duration != 0) && (chan->duration != 0xFFFF)) {
+ if ((chan->duration == 0) || (chan->duration == 0xFFFF)) {
tpcm->genTypePrev = -1;
tpcm->freqCountPrev = -1;
- // only tone channels dissolve
- if ((ch != 3) && (_dissolveMethod != 0)) // != noise??
- chan->dissolveCount = 0;
+ break;
+ }
- // attenuation (volume)
- chan->attenuation = data[4] & 0xF;
+ _tchannel[ch].genTypePrev = -1;
+ _tchannel[ch].freqCountPrev = -1;
- // frequency
- if (ch < (CHAN_MAX - 1)) {
- chan->freqCount = (uint16)data[2] & 0x3F;
- chan->freqCount <<= 4;
- chan->freqCount |= data[3] & 0x0F;
+ // only tone channels dissolve
+ if ((ch != 3) && (_dissolveMethod != 0)) // != noise??
+ chan->dissolveCount = 0;
+
+ // attenuation (volume)
+ writeData(data[4]);
+
+ // frequency
+ writeData(data[3]);
+ writeData(data[2]);
- chan->genType = kGenTone;
- } else {
- int noiseFreq;
-
- // check for white noise (1) or periodic (0)
- chan->genType = (data[3] & 0x04) ? kGenWhite : kGenPeriod;
-
- noiseFreq = data[3] & 0x03;
-
- switch (noiseFreq) {
- case 0:
- chan->freqCount = 32;
- break;
- case 1:
- chan->freqCount = 64;
- break;
- case 2:
- chan->freqCount = 128;
- break;
- case 3:
- chan->freqCount = _channel[2].freqCount * 2;
- break;
- }
- }
- }
// data now points to the next data seg-a-ment
chan->data += 5;
}
- if (chan->duration != 0xFFFF) {
- tone->freqCount = chan->freqCount;
- tone->atten = volumeCalc(chan); // calc volume, sent vol is different from saved vol
- tone->type = chan->genType;
- chan->duration--;
- } else {
+ if (chan->duration == 0xFFFF) {
// kill channel
chan->avail = 0;
chan->attenuation = 0x0F; // silent
@@ -302,9 +291,80 @@ int SoundGenPCJr::getNextNote(int ch, Tone *tone) {
return -1;
}
+ chan->duration--;
+
return 0;
}
+int SoundGenPCJr::getNextNote_v1(int ch) {
+ static int duration = 0;
+
+ byte *data = _v1data;
+ uint32 len = _v1size;
+
+ if (len <= 0 || data == NULL) {
+ _channel[ch].avail = 0;
+ _channel[ch].attenuation = 0x0F;
+ _channel[ch].attenuationCopy = 0x0F;
+ return -1;
+ }
+
+ // In the V1 player the default duration for a row is 3 ticks
+ if (duration > 0) {
+ duration--;
+ return 0;
+ }
+ duration = 3 * CHAN_MAX;
+
+ // Otherwise fetch a row of data for all channels
+ while (*data) {
+ writeData(*data);
+ data++;
+ len--;
+ }
+ data++;
+ len--;
+
+ _v1data = data;
+ _v1size = len;
+
+ return 0;
+}
+
+void SoundGenPCJr::writeData(uint8 val) {
+ static int reg = 0;
+
+ debugC(5, kDebugLevelSound, "writeData(%.2X)", val);
+
+ if ((val & 0x90) == 0x90) {
+ reg = (val >> 5) & 0x3;
+ _channel[reg].attenuation = val & 0xF;
+ } else if ((val & 0xF0) == 0xE0) {
+ _channel[3].genType = (val & 0x4) ? kGenWhite : kGenPeriod;
+ int noiseFreq = val & 0x03;
+ switch (noiseFreq) {
+ case 0:
+ _channel[3].freqCount = 32;
+ break;
+ case 1:
+ _channel[3].freqCount = 64;
+ break;
+ case 2:
+ _channel[3].freqCount = 128;
+ break;
+ case 3:
+ _channel[3].freqCount = _channel[2].freqCount * 2;
+ break;
+ }
+ } else if (val & 0x80) {
+ reg = (val >> 5) & 0x3;
+ _channel[reg].freqCount = val & 0xF;
+ _channel[reg].genType = kGenTone;
+ } else {
+ _channel[reg].freqCount |= (val & 0x3F) << 4;
+ }
+}
+
// Formulas for noise generator
// bit0 = output
@@ -340,7 +400,6 @@ const int16 volTable[16] = {
// fill buff
int SoundGenPCJr::chanGen(int chan, int16 *stream, int len) {
ToneChan *tpcm;
- Tone toneNew;
int fillSize;
int retVal;
@@ -351,13 +410,10 @@ int SoundGenPCJr::chanGen(int chan, int16 *stream, int len) {
while (len > 0) {
if (tpcm->noteCount <= 0) {
// get new tone data
- toneNew.freqCount = 0;
- toneNew.atten = 0xF;
- toneNew.type = kGenTone;
- if ((tpcm->avail) && (getNextNote(chan, &toneNew) == 0)) {
- tpcm->atten = toneNew.atten;
- tpcm->freqCount = toneNew.freqCount;
- tpcm->genType = toneNew.type;
+ if ((tpcm->avail) && (getNextNote(chan) == 0)) {
+ tpcm->atten = _channel[chan].attenuation;
+ tpcm->freqCount = _channel[chan].freqCount;
+ tpcm->genType = _channel[chan].genType;
// setup counters 'n stuff
// SAMPLE_RATE samples per sec.. tone changes 60 times per sec
diff --git a/engines/agi/sound_pcjr.h b/engines/agi/sound_pcjr.h
index 4317e86516..1b4d1e9efb 100644
--- a/engines/agi/sound_pcjr.h
+++ b/engines/agi/sound_pcjr.h
@@ -71,15 +71,9 @@ struct ToneChan {
int feedback; /* noise feedback mask */
};
-struct Tone {
- int freqCount;
- int atten;
- GenType type;
-};
-
class SoundGenPCJr : public SoundGen, public Audio::AudioStream {
public:
- SoundGenPCJr(AgiEngine *vm, Audio::Mixer *pMixer);
+ SoundGenPCJr(AgiBase *vm, Audio::Mixer *pMixer);
~SoundGenPCJr();
void play(int resnum);
@@ -102,9 +96,13 @@ public:
}
private:
- int getNextNote(int ch, Tone *tone);
+ int getNextNote(int ch);
+ int getNextNote_v2(int ch);
+ int getNextNote_v1(int ch);
int volumeCalc(SndGenChan *chan);
+ void writeData(uint8 val);
+
int chanGen(int chan, int16 *stream, int len);
int fillNoise(ToneChan *t, int16 *buf, int len);
@@ -117,6 +115,9 @@ private:
int _chanAllocated;
int _dissolveMethod;
+
+ uint8 *_v1data;
+ uint32 _v1size;
};
} // End of namespace Agi
diff --git a/engines/agi/sound_sarien.cpp b/engines/agi/sound_sarien.cpp
index 9ea8569b81..a2baf89d12 100644
--- a/engines/agi/sound_sarien.cpp
+++ b/engines/agi/sound_sarien.cpp
@@ -65,7 +65,7 @@ static const int16 waveformMac[WAVEFORM_SIZE] = {
-175, -172, -165, -159, -137, -114, -67, -19
};
-SoundGenSarien::SoundGenSarien(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _chn() {
+SoundGenSarien::SoundGenSarien(AgiBase *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _chn() {
_sndBuffer = (int16 *)calloc(2, BUFFER_SIZE);
memset(_sndBuffer, 0, BUFFER_SIZE << 1);
diff --git a/engines/agi/sound_sarien.h b/engines/agi/sound_sarien.h
index 22bfff3395..04f274ca7d 100644
--- a/engines/agi/sound_sarien.h
+++ b/engines/agi/sound_sarien.h
@@ -68,7 +68,7 @@ struct ChannelInfo {
class SoundGenSarien : public SoundGen, public Audio::AudioStream {
public:
- SoundGenSarien(AgiEngine *vm, Audio::Mixer *pMixer);
+ SoundGenSarien(AgiBase *vm, Audio::Mixer *pMixer);
~SoundGenSarien();
void play(int resnum);
diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp
index ea0b07f4da..8d13be3f68 100644
--- a/engines/agi/sprite.cpp
+++ b/engines/agi/sprite.cpp
@@ -257,7 +257,7 @@ bool SpritesMgr::testUpdating(VtEntry *v, AgiEngine *agi) {
if (~agi->_game.dirView[v->currentView].flags & RES_LOADED)
return false;
- return (v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | UPDATE | DRAWN);
+ return (v->flags & (fAnimated | fUpdate | fDrawn)) == (fAnimated | fUpdate | fDrawn);
}
/**
@@ -268,7 +268,7 @@ bool SpritesMgr::testNotUpdating(VtEntry *v, AgiEngine *vm) {
if (~vm->_game.dirView[v->currentView].flags & RES_LOADED)
return false;
- return (v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | DRAWN);
+ return (v->flags & (fAnimated | fUpdate | fDrawn)) == (fAnimated | fDrawn);
}
/**
@@ -332,7 +332,7 @@ void SpritesMgr::buildList(SpriteList &l, bool (*test)(VtEntry *, AgiEngine *))
for (v = _vm->_game.viewTable; v < &_vm->_game.viewTable[MAX_VIEWTABLE]; v++) {
if ((*test)(v, _vm)) {
entry[i] = v;
- yVal[i] = v->flags & FIXED_PRIORITY ? prioToY(v->priority) : v->yPos;
+ yVal[i] = v->flags & fFixedPriority ? prioToY(v->priority) : v->yPos;
i++;
}
}
@@ -407,13 +407,13 @@ void SpritesMgr::commitSprites(SpriteList &l, bool immediate) {
continue;
if (s->v->xPos == s->v->xPos2 && s->v->yPos == s->v->yPos2) {
- s->v->flags |= DIDNT_MOVE;
+ s->v->flags |= fDidntMove;
continue;
}
s->v->xPos2 = s->v->xPos;
s->v->yPos2 = s->v->yPos;
- s->v->flags &= ~DIDNT_MOVE;
+ s->v->flags &= ~fDidntMove;
}
}
@@ -604,7 +604,9 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in
// If margin is 0, 1, 2, or 3, the base of the cel is
// surrounded with a rectangle of the corresponding priority.
// If margin >= 4, this extra margin is not shown.
- if (mar < 4) {
+ //
+ // -1 indicates ignore and is set for V1
+ if (mar < 4 && mar != -1) {
// add rectangle around object, don't clobber control
// info in priority data. The box extends to the end of
// its priority band!
@@ -700,6 +702,21 @@ void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2, bool immediate) {
y1 = CLIP(y1, 0, _HEIGHT - 1);
y2 = CLIP(y2, 0, _HEIGHT - 1);
+ // Check if a window is active, and clip the block commited to exclude the
+ // window's contents. Fixes bug #3295652, and partially fixes bug #3080415.
+ AgiBlock &window = _vm->_game.window;
+ if (window.active) {
+ if (y1 < window.y2 && y2 > window.y2 && (x1 < window.x2 || x2 > window.x1)) {
+ // The top of the block covers the bottom of the window
+ y1 = window.y2;
+ }
+
+ if (y1 < window.y1 && y2 > window.y1 && (x1 < window.x2 || x2 > window.x1)) {
+ // The bottom of the block covers the top of the window
+ y2 = window.y1;
+ }
+ }
+
debugC(7, kDebugLevelSprites, "commitBlock(%d, %d, %d, %d)", x1, y1, x2, y2);
w = x2 - x1 + 1;
diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp
index 82a2340ad6..d5027588f9 100644
--- a/engines/agi/text.cpp
+++ b/engines/agi/text.cpp
@@ -62,22 +62,18 @@ void AgiEngine::printText2(int l, const char *msg, int foff, int xoff, int yoff,
for (m = (const unsigned char *)msg, x1 = y1 = 0; *m; m++) {
- if (*m >= 0x20 || *m == 1 || *m == 2 || *m == 3) {
- // FIXME: Fingolfin asks: why is there a FIXME here? Please either clarify what
- // needs fixing, or remove it!
- // FIXME
- int ypos;
-
- ypos = (y1 * CHAR_LINES) + yoff;
+ // Note: there were extra checks for *m being a cursor character
+ // here (1, 2 or 3), which have been removed, as the cursor
+ // character is no longer printed via this function.
+ if (*m >= 0x20) {
+ int ypos = (y1 * CHAR_LINES) + yoff;
if ((x1 != (len - 1) || x1 == 39) && (ypos <= (GFX_HEIGHT - CHAR_LINES))) {
- int xpos;
-
- xpos = (x1 * CHAR_COLS) + xoff + foff;
+ int xpos = (x1 * CHAR_COLS) + xoff + foff;
if (xpos >= GFX_WIDTH)
continue;
-
+
_gfx->putTextCharacter(l, xpos, ypos, *m, fg, bg, checkerboard);
if (x1 > maxx)
@@ -88,15 +84,17 @@ void AgiEngine::printText2(int l, const char *msg, int foff, int xoff, int yoff,
x1++;
- // DF: changed the len-1 to len...
- // FIXME: m[len] doesn't make sense and may read out of bounds?
- if (x1 == len && m[len] != '\n') {
+ // Change line if we've reached the end of this one, unless the next
+ // character is a new line itself, or the end of the string
+ if (x1 == len && m[1] != '\n' && m[1] != 0) {
y1++;
x1 = foff = 0;
}
} else {
- y1++;
- x1 = foff = 0;
+ if (m[1] != 0) {
+ y1++;
+ x1 = foff = 0;
+ }
}
}
}
@@ -223,14 +221,18 @@ void AgiEngine::printTextConsole(const char *msg, int x, int y, int len, int fg,
* @param str String to wrap.
* @param len Length of line.
*
- * Based on GBAGI implementaiton with permission from the author
+ * Based on GBAGI implementation with permission from the author
*/
char *AgiEngine::wordWrapString(const char *s, int *len) {
- char *outStr, *msgBuf, maxWidth = *len;
+ char *outStr, *msgBuf;
+ int maxWidth = *len;
const char *pWord;
int lnLen, wLen;
- msgBuf = outStr = strdup(s);
+ // Allocate some extra space for the final buffer, as
+ // outStr may end up being longer than s
+ // 26 = 200 (screen height) / 8 (font height) + 1
+ msgBuf = outStr = (char *)malloc(strlen(s) + 26);
int msgWidth = 0;
@@ -249,6 +251,8 @@ char *AgiEngine::wordWrapString(const char *s, int *len) {
wLen--;
if (wLen + lnLen >= maxWidth) {
+ // Check if outStr isn't msgBuf. If this is the case, outStr hasn't advanced
+ // yet, so no output has been written yet
if (outStr != msgBuf) {
if (outStr[-1] == ' ')
outStr[-1] = '\n';
@@ -438,12 +442,6 @@ int AgiEngine::print(const char *p, int lin, int col, int len) {
debugC(4, kDebugLevelText, "print(): lin = %d, col = %d, len = %d", lin, col, len);
- if (col == 0 && lin == 0 && len == 0)
- lin = col = -1;
-
- if (len == 0)
- len = 30;
-
blitTextbox(p, lin, col, len);
if (getflag(fOutputMode)) {
@@ -675,11 +673,11 @@ void AgiEngine::writePrompt() {
_gfx->doUpdate();
}
-void AgiEngine::clearPrompt() {
+void AgiEngine::clearPrompt(bool useBlackBg) {
int l;
l = _game.lineUserInput;
- clearLines(l, l, _game.colorBg);
+ clearLines(l, l, useBlackBg ? 0 : _game.colorBg);
flushLines(l, l);
_gfx->doUpdate();
diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp
index 0d420caa81..3f3686561e 100644
--- a/engines/agi/view.cpp
+++ b/engines/agi/view.cpp
@@ -47,7 +47,7 @@ void AgiEngine::lSetCel(VtEntry *v, int n) {
// in the KQ4 introduction
// It seems there's either a bug with KQ4's logic script 120 (the intro script)
// or flag 64 is not set correctly, which causes the erroneous behavior from the actors
- if (getGameID() == GID_KQ4 && !(v->flags & UPDATE) && (v->currentView == 172))
+ if (getGameID() == GID_KQ4 && !(v->flags & fUpdate) && (v->currentView == 172))
return;
currentVc = &currentVl->cel[n];
@@ -78,8 +78,8 @@ void AgiEngine::lSetLoop(VtEntry *v, int n) {
void AgiEngine::updateView(VtEntry *v) {
int cel, lastCel;
- if (v->flags & DONTUPDATE) {
- v->flags &= ~DONTUPDATE;
+ if (v->flags & fDontupdate) {
+ v->flags &= ~fDontupdate;
return;
}
@@ -87,32 +87,32 @@ void AgiEngine::updateView(VtEntry *v) {
lastCel = v->numCels - 1;
switch (v->cycle) {
- case CYCLE_NORMAL:
+ case kCycleNormal:
if (++cel > lastCel)
cel = 0;
break;
- case CYCLE_END_OF_LOOP:
+ case kCycleEndOfLoop:
if (cel < lastCel) {
debugC(5, kDebugLevelResources, "cel %d (last = %d)", cel + 1, lastCel);
if (++cel != lastCel)
break;
}
setflag(v->parm1, true);
- v->flags &= ~CYCLING;
+ v->flags &= ~fCycling;
v->direction = 0;
- v->cycle = CYCLE_NORMAL;
+ v->cycle = kCycleNormal;
break;
- case CYCLE_REV_LOOP:
+ case kCycleRevLoop:
if (cel) {
if (--cel)
break;
}
setflag(v->parm1, true);
- v->flags &= ~CYCLING;
+ v->flags &= ~fCycling;
v->direction = 0;
- v->cycle = CYCLE_NORMAL;
+ v->cycle = kCycleNormal;
break;
- case CYCLE_REVERSE:
+ case kCycleReverse:
if (cel == 0) {
cel = lastCel;
} else {
@@ -259,17 +259,22 @@ void AgiEngine::setCel(VtEntry *v, int n) {
*/
void AgiEngine::clipViewCoordinates(VtEntry *v) {
if (v->xPos + v->xSize > _WIDTH) {
- v->flags |= UPDATE_POS;
+ v->flags |= fUpdatePos;
v->xPos = _WIDTH - v->xSize;
}
if (v->yPos - v->ySize + 1 < 0) {
- v->flags |= UPDATE_POS;
+ v->flags |= fUpdatePos;
v->yPos = v->ySize - 1;
}
- if (v->yPos <= _game.horizon && (~v->flags & IGNORE_HORIZON)) {
- v->flags |= UPDATE_POS;
+ if (v->yPos <= _game.horizon && (~v->flags & fIgnoreHorizon)) {
+ v->flags |= fUpdatePos;
v->yPos = _game.horizon + 1;
}
+
+ if (getVersion() < 0x2000) {
+ v->flags |= fDontupdate;
+ }
+
}
/**
@@ -294,6 +299,12 @@ void AgiEngine::setView(VtEntry *v, int n) {
v->currentView = n;
v->numLoops = v->viewData->numLoops;
v->viewReplaced = true;
+
+ if (getVersion() < 0x2000) {
+ v->stepSize = v->viewData->rdata[0];
+ v->cycleTime = v->viewData->rdata[1];
+ v->cycleTimeCount = 0;
+ }
setLoop(v, v->currentLoop >= v->numLoops ? 0 : v->currentLoop);
}
@@ -302,10 +313,10 @@ void AgiEngine::setView(VtEntry *v, int n) {
* @param v pointer to view table entry
*/
void AgiEngine::startUpdate(VtEntry *v) {
- if (~v->flags & UPDATE) {
+ if (~v->flags & fUpdate) {
_sprites->eraseBoth();
- v->flags |= UPDATE;
+ v->flags |= fUpdate;
_sprites->blitBoth();
_sprites->commitBoth();
}
@@ -316,10 +327,10 @@ void AgiEngine::startUpdate(VtEntry *v) {
* @param v pointer to view table entry
*/
void AgiEngine::stopUpdate(VtEntry *v) {
- if (v->flags & UPDATE) {
+ if (v->flags & fUpdate) {
_sprites->eraseBoth();
- v->flags &= ~UPDATE;
+ v->flags &= ~fUpdate;
_sprites->blitBoth();
_sprites->commitBoth();
}
@@ -346,14 +357,14 @@ void AgiEngine::updateViewtable() {
i = 0;
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
- if ((v->flags & (ANIMATED | UPDATE | DRAWN)) != (ANIMATED | UPDATE | DRAWN)) {
+ if ((v->flags & (fAnimated | fUpdate | fDrawn)) != (fAnimated | fUpdate | fDrawn)) {
continue;
}
i++;
loop = 4;
- if (~v->flags & FIX_LOOP) {
+ if (~v->flags & fFixLoop) {
switch (v->numLoops) {
case 2:
case 3:
@@ -378,7 +389,7 @@ void AgiEngine::updateViewtable() {
}
}
- if (~v->flags & CYCLING)
+ if (~v->flags & fCycling)
continue;
if (v->cycleTimeCount == 0)
@@ -395,7 +406,7 @@ void AgiEngine::updateViewtable() {
updatePosition();
_sprites->blitUpdSprites();
_sprites->commitUpdSprites();
- _game.viewTable[0].flags &= ~(ON_WATER | ON_LAND);
+ _game.viewTable[0].flags &= ~(fOnWater | fOnLand);
}
}
diff --git a/engines/agi/view.h b/engines/agi/view.h
index 0ef443f8e5..5cf59d7df5 100644
--- a/engines/agi/view.h
+++ b/engines/agi/view.h
@@ -50,6 +50,39 @@ struct AgiView {
uint8 *rdata;
};
+enum MotionType {
+ kMotionNormal = 0,
+ kMotionWander = 1,
+ kMotionFollowEgo = 2,
+ kMotionMoveObj = 3
+};
+
+enum CycleType {
+ kCycleNormal = 0,
+ kCycleEndOfLoop = 1,
+ kCycleRevLoop = 2,
+ kCycleReverse = 3
+ };
+
+enum ViewFlags {
+ fDrawn = (1 << 0),
+ fIgnoreBlocks = (1 << 1),
+ fFixedPriority = (1 << 2),
+ fIgnoreHorizon = (1 << 3),
+ fUpdate = (1 << 4),
+ fCycling = (1 << 5),
+ fAnimated = (1 << 6),
+ fMotion = (1 << 7),
+ fOnWater = (1 << 8),
+ fIgnoreObjects = (1 << 9),
+ fUpdatePos = (1 << 10),
+ fOnLand = (1 << 11),
+ fDontupdate = (1 << 12),
+ fFixLoop = (1 << 13),
+ fDidntMove = (1 << 14),
+ fAdjEgoXY = (1 << 15)
+};
+
/**
* AGI view table entry
*/
@@ -78,39 +111,10 @@ struct VtEntry {
uint8 cycleTime;
uint8 cycleTimeCount;
uint8 direction;
-
-#define MOTION_NORMAL 0
-#define MOTION_WANDER 1
-#define MOTION_FOLLOW_EGO 2
-#define MOTION_MOVE_OBJ 3
- uint8 motion;
-
-#define CYCLE_NORMAL 0
-#define CYCLE_END_OF_LOOP 1
-#define CYCLE_REV_LOOP 2
-#define CYCLE_REVERSE 3
- uint8 cycle;
-
+ MotionType motion;
+ CycleType cycle;
uint8 priority;
-
-#define DRAWN 0x0001
-#define IGNORE_BLOCKS 0x0002
-#define FIXED_PRIORITY 0x0004
-#define IGNORE_HORIZON 0x0008
-#define UPDATE 0x0010
-#define CYCLING 0x0020
-#define ANIMATED 0x0040
-#define MOTION 0x0080
-#define ON_WATER 0x0100
-#define IGNORE_OBJECTS 0x0200
-#define UPDATE_POS 0x0400
-#define ON_LAND 0x0800
-#define DONTUPDATE 0x1000
-#define FIX_LOOP 0x2000
-#define DIDNT_MOVE 0x4000
-#define ADJ_EGO_XY 0x8000
uint16 flags;
-
uint8 parm1;
uint8 parm2;
uint8 parm3;
diff --git a/engines/agi/wagparser.cpp b/engines/agi/wagparser.cpp
index 14159c0147..39f9e0dd92 100644
--- a/engines/agi/wagparser.cpp
+++ b/engines/agi/wagparser.cpp
@@ -112,11 +112,11 @@ WagFileParser::~WagFileParser() {
bool WagFileParser::checkAgiVersionProperty(const WagProperty &version) const {
if (version.getCode() == WagProperty::PC_INTVERSION && // Must be AGI interpreter version property
version.getSize() >= 3 && // Need at least three characters for a version number like "X.Y"
- isdigit(version.getData()[0]) && // And the first character must be a digit
+ isdigit(static_cast<unsigned char>(version.getData()[0])) && // And the first character must be a digit
(version.getData()[1] == ',' || version.getData()[1] == '.')) { // And the second a comma or a period
for (int i = 2; i < version.getSize(); i++) // And the rest must all be digits
- if (!isdigit(version.getData()[i]))
+ if (!isdigit(static_cast<unsigned char>(version.getData()[i])))
return false; // Bail out if found a non-digit after the decimal point
return true;
diff --git a/engines/agi/words.cpp b/engines/agi/words.cpp
index 4b96fdf711..1001c66b20 100644
--- a/engines/agi/words.cpp
+++ b/engines/agi/words.cpp
@@ -20,19 +20,12 @@
*
*/
-//
-// New find_word algorithm by Thomas Akesson <tapilot@home.se>
-//
-
#include "agi/agi.h"
#include "common/textconsole.h"
namespace Agi {
-static uint8 *words; // words in the game
-static uint32 wordsFlen; // length of word memory
-
//
// Local implementation to avoid problems with strndup() used by
// gcc 3.2 Cygwin (see #635984)
@@ -43,12 +36,38 @@ static char *myStrndup(const char *src, int n) {
return tmp;
}
+int AgiEngine::loadWords_v1(Common::File &f) {
+ char str[64];
+ int k;
+
+ debug(0, "Loading dictionary");
+
+ // Loop through alphabet, as words in the dictionary file are sorted by
+ // first character
+ f.seek(f.pos() + 26 * 2, SEEK_SET);
+ do {
+ // Read next word
+ for (k = 0; k < (int)sizeof(str) - 1; k++) {
+ str[k] = f.readByte();
+ if (str[k] == 0 || (uint8)str[k] == 0xFF)
+ break;
+ }
+
+ // And store it in our internal dictionary
+ if (k > 0) {
+ AgiWord *w = new AgiWord;
+ w->word = myStrndup(str, k + 1);
+ w->id = f.readUint16LE();
+ _game.words[str[0] - 'a'].push_back(w);
+ debug(3, "'%s' (%d)", w->word, w->id);
+ }
+ } while((uint8)str[0] != 0xFF);
+
+ return errOK;
+}
+
int AgiEngine::loadWords(const char *fname) {
Common::File fp;
- uint32 flen;
- uint8 *mem = NULL;
-
- words = NULL;
if (!fp.open(fname)) {
warning("loadWords: can't open %s", fname);
@@ -56,85 +75,74 @@ int AgiEngine::loadWords(const char *fname) {
}
debug(0, "Loading dictionary: %s", fname);
- fp.seek(0, SEEK_END);
- flen = fp.pos();
- wordsFlen = flen;
- fp.seek(0, SEEK_SET);
-
- if ((mem = (uint8 *)calloc(1, flen + 32)) == NULL) {
- fp.close();
- return errNotEnoughMemory;
+ // Loop through alphabet, as words in the dictionary file are sorted by
+ // first character
+ for (int i = 0; i < 26; i++) {
+ fp.seek(i * 2, SEEK_SET);
+ int offset = fp.readUint16BE();
+ if (offset == 0)
+ continue;
+ fp.seek(offset, SEEK_SET);
+ int k = fp.readByte();
+ while (!fp.eos() && !fp.err()) {
+ // Read next word
+ char c, str[64];
+ do {
+ c = fp.readByte();
+ str[k++] = (c ^ 0x7F) & 0x7F;
+ } while (!(c & 0x80) && k < (int)sizeof(str) - 1);
+ str[k] = 0;
+
+ // And store it in our internal dictionary
+ AgiWord *w = new AgiWord;
+ w->word = myStrndup(str, k);
+ w->id = fp.readUint16BE();
+ _game.words[i].push_back(w);
+
+ // Are there more words with an already known prefix?
+ if (!(k = fp.readByte()))
+ break;
+ }
}
- fp.read(mem, flen);
- fp.close();
-
- words = mem;
-
return errOK;
}
void AgiEngine::unloadWords() {
- free(words);
- words = NULL;
+ for (int i = 0; i < 26; i++)
+ _game.words[i].clear();
}
/**
* Find a word in the dictionary
* Uses an algorithm hopefully like the one Sierra used. Returns the ID
* of the word and the length in flen. Returns -1 if not found.
- *
- * Thomas Akesson, November 2001
*/
int AgiEngine::findWord(const char *word, int *flen) {
- int mchr = 0; // matched chars
- int len, fchr, id = -1;
- const uint8 *p = words;
- const uint8 *q = words + wordsFlen;
- *flen = 0;
+ int c;
+ int result = -1;
debugC(2, kDebugLevelScripts, "find_word(%s)", word);
if (word[0] >= 'a' && word[0] <= 'z')
- fchr = word[0] - 'a';
+ c = word[0] - 'a';
else
return -1;
- len = strlen(word);
-
- // Get the offset to the first word beginning with the
- // right character
- p += READ_BE_UINT16(p + 2 * fchr);
-
- while (p[0] >= mchr) {
- if (p[0] == mchr) {
- p++;
- // Loop through all matching characters
- while ((p[0] ^ word[mchr]) == 0x7F && mchr < len) {
- mchr++;
- p++;
- }
- // Check if this is the last character of the word
- // and if it matches
- if ((p[0] ^ word[mchr]) == 0xFF && mchr < len) {
- mchr++;
- if (word[mchr] == 0 || word[mchr] == 0x20) {
- id = READ_BE_UINT16(p + 1);
- *flen = mchr;
- }
- }
+ *flen = 0;
+ Common::Array<AgiWord*> &a = _game.words[c];
+
+ for (int i = 0; i < (int)a.size(); i++) {
+ int wlen = strlen(a[i]->word);
+ // Keep looking till we find the word itself, or the whole phrase.
+ // Try to find the best match (i.e. the longest matching phrase).
+ if (!strncmp(a[i]->word, word, wlen) && (word[wlen] == 0 || word[wlen] == 0x20) && wlen >= *flen) {
+ *flen = wlen;
+ result = a[i]->id;
}
- if (p >= q)
- return -1;
-
- // Step to the next word
- while (p[0] < 0x80)
- p++;
-
- p += 3;
}
- return id;
+ return result;
}
void AgiEngine::dictionaryWords(char *msg) {
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp
index 4d879909c4..73a37e42ef 100644
--- a/engines/agos/agos.cpp
+++ b/engines/agos/agos.cpp
@@ -24,13 +24,13 @@
#include "common/file.h"
#include "common/fs.h"
#include "common/textconsole.h"
-#include "common/system.h"
#include "engines/util.h"
#include "agos/debugger.h"
#include "agos/intern.h"
#include "agos/agos.h"
+#include "agos/midi.h"
#include "backends/audiocd/audiocd.h"
@@ -41,18 +41,51 @@
namespace AGOS {
static const GameSpecificSettings simon1_settings = {
+ "", // base_filename
+ "", // restore_filename
+ "", // tbl_filename
"EFFECTS", // effects_filename
"SIMON", // speech_filename
};
static const GameSpecificSettings simon2_settings = {
+ "", // base_filename
+ "", // restore_filename
+ "", // tbl_filename
"", // effects_filename
"SIMON2", // speech_filename
};
-static const GameSpecificSettings puzzlepack_settings = {
+static const GameSpecificSettings dimp_settings = {
+ "Gdimp", // base_filename
+ "", // restore_filename
+ "", // tbl_filename
"", // effects_filename
- "MUSIC", // speech_filename
+ "MUSIC", // speech_filename
+};
+
+static const GameSpecificSettings jumble_settings = {
+ "Gjumble", // base_filename
+ "", // restore_filename
+ "", // tbl_filename
+ "", // effects_filename
+ "MUSIC", // speech_filename
+};
+
+static const GameSpecificSettings puzzle_settings = {
+ "Gpuzzle", // base_filename
+ "", // restore_filename
+ "", // tbl_filename
+ "", // effects_filename
+ "MUSIC", // speech_filename
+};
+
+static const GameSpecificSettings swampy_settings = {
+ "Gswampy", // base_filename
+ "", // restore_filename
+ "", // tbl_filename
+ "", // effects_filename
+ "MUSIC", // speech_filename
};
#ifdef ENABLE_AGOS2
@@ -132,6 +165,7 @@ AGOSEngine::AGOSEngine(OSystem *system, const AGOSGameDescription *gd)
_numMusic = 0;
_numSFX = 0;
_numSpeech = 0;
+ _numZone = 0;
_numBitArray1 = 0;
_numBitArray2 = 0;
@@ -541,16 +575,18 @@ Common::Error AGOSEngine::init() {
initGraphics(_screenWidth, _screenHeight, getGameType() == GType_FF || getGameType() == GType_PP);
+ _midi = new MidiPlayer();
+
if ((getGameType() == GType_SIMON2 && getPlatform() == Common::kPlatformWindows) ||
(getGameType() == GType_SIMON1 && getPlatform() == Common::kPlatformWindows) ||
((getFeatures() & GF_TALKIE) && getPlatform() == Common::kPlatformAcorn) ||
(getPlatform() == Common::kPlatformPC)) {
- int ret = _midi.open(getGameType());
+ int ret = _midi->open(getGameType());
if (ret)
warning("MIDI Player init failed: \"%s\"", MidiDriver::getErrorName(ret));
- _midi.setVolume(ConfMan.getInt("music_volume"), ConfMan.getInt("sfx_volume"));
+ _midi->setVolume(ConfMan.getInt("music_volume"), ConfMan.getInt("sfx_volume"));
_midiEnabled = true;
}
@@ -597,14 +633,14 @@ Common::Error AGOSEngine::init() {
if (ConfMan.hasKey("music_mute") && ConfMan.getBool("music_mute") == 1) {
_musicPaused = true;
if (_midiEnabled) {
- _midi.pause(_musicPaused);
+ _midi->pause(_musicPaused);
}
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, 0);
}
if (ConfMan.hasKey("sfx_mute") && ConfMan.getBool("sfx_mute") == 1) {
if (getGameId() == GID_SIMON1DOS)
- _midi._enable_sfx = !_midi._enable_sfx;
+ _midi->_enable_sfx = !_midi->_enable_sfx;
else {
_effectsPaused = !_effectsPaused;
_sound->effectsPause(_effectsPaused);
@@ -640,14 +676,12 @@ Common::Error AGOSEngine::init() {
// TODO: Use special debug levels instead of the following hack.
_debugMode = (gDebugLevel >= 0);
- if (gDebugLevel == 2)
- _dumpOpcodes = true;
- if (gDebugLevel == 3)
- _dumpVgaOpcodes = true;
- if (gDebugLevel == 4)
- _dumpScripts = true;
- if (gDebugLevel == 5)
- _dumpVgaScripts = true;
+ switch (gDebugLevel) {
+ case 2: _dumpOpcodes = true; break;
+ case 3: _dumpVgaOpcodes = true; break;
+ case 4: _dumpScripts = true; break;
+ case 5: _dumpVgaScripts = true; break;
+ }
return Common::kNoError;
}
@@ -678,7 +712,15 @@ static const uint16 initialVideoWindows_PN[20] = {
#ifdef ENABLE_AGOS2
void AGOSEngine_PuzzlePack::setupGame() {
- gss = &puzzlepack_settings;
+ if (getGameId() == GID_DIMP) {
+ gss = &dimp_settings;
+ } else if (getGameId() == GID_JUMBLE) {
+ gss = &jumble_settings;
+ } else if (getGameId() == GID_PUZZLE) {
+ gss = &puzzle_settings;
+ } else if (getGameId() == GID_SWAMPY) {
+ gss = &swampy_settings;
+ }
_numVideoOpcodes = 85;
_vgaMemSize = 7500000;
_itemMemSize = 20000;
@@ -691,6 +733,8 @@ void AGOSEngine_PuzzlePack::setupGame() {
_numTextBoxes = 40;
_numVars = 2048;
+ _numZone = 450;
+
AGOSEngine::setupGame();
}
#endif
@@ -708,7 +752,7 @@ void AGOSEngine_Simon2::setupGame() {
_itemMemSize = 20000;
_tableMemSize = 100000;
// Check whether to use MT-32 MIDI tracks in Simon the Sorcerer 2
- if (getGameType() == GType_SIMON2 && _midi.hasNativeMT32())
+ if (getGameType() == GType_SIMON2 && _midi->hasNativeMT32())
_musicIndexBase = (1128 + 612) / 4;
else
_musicIndexBase = 1128 / 4;
@@ -725,6 +769,7 @@ void AGOSEngine_Simon2::setupGame() {
_numMusic = 93;
_numSFX = 222;
_numSpeech = 11997;
+ _numZone = 140;
AGOSEngine::setupGame();
}
@@ -751,6 +796,7 @@ void AGOSEngine_Simon1::setupGame() {
_numMusic = 34;
_numSFX = 127;
_numSpeech = 3623;
+ _numZone = 164;
AGOSEngine::setupGame();
}
@@ -771,6 +817,7 @@ void AGOSEngine_Waxworks::setupGame() {
_numVars = 255;
_numMusic = 26;
+ _numZone = 155;
AGOSEngine::setupGame();
}
@@ -790,6 +837,7 @@ void AGOSEngine_Elvira2::setupGame() {
_numVars = 255;
_numMusic = 9;
+ _numZone = 99;
AGOSEngine::setupGame();
}
@@ -806,6 +854,7 @@ void AGOSEngine_Elvira1::setupGame() {
_numVars = 512;
_numMusic = 14;
+ _numZone = 74;
AGOSEngine::setupGame();
}
@@ -819,6 +868,8 @@ void AGOSEngine_PN::setupGame() {
_vgaPeriod = 50;
_numVars = 256;
+ _numZone = 26;
+
AGOSEngine::setupGame();
}
@@ -911,6 +962,8 @@ AGOSEngine::~AGOSEngine() {
_window6BackScn->free();
delete _window6BackScn;
+ delete _midi;
+
free(_firstTimeStruct);
free(_pendingDeleteTimeEvent);
@@ -938,12 +991,12 @@ void AGOSEngine::pauseEngineIntern(bool pauseIt) {
_keyPressed.reset();
_pause = true;
- _midi.pause(true);
+ _midi->pause(true);
_mixer->pauseAll(true);
} else {
_pause = false;
- _midi.pause(_musicPaused);
+ _midi->pause(_musicPaused);
_mixer->pauseAll(false);
}
}
@@ -961,6 +1014,10 @@ void AGOSEngine::pause() {
}
Common::Error AGOSEngine::go() {
+#ifdef ENABLE_AGOS2
+ loadArchives();
+#endif
+
loadGamePcFile();
addTimeEvent(0, 1);
@@ -1027,7 +1084,7 @@ void AGOSEngine::syncSoundSettings() {
int soundVolumeSFX = ConfMan.getInt("sfx_volume");
if (_midiEnabled)
- _midi.setVolume((mute ? 0 : soundVolumeMusic), (mute ? 0 : soundVolumeSFX));
+ _midi->setVolume((mute ? 0 : soundVolumeMusic), (mute ? 0 : soundVolumeSFX));
}
} // End of namespace AGOS
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index aa68a05eee..cf75842cdd 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -25,6 +25,7 @@
#include "engines/engine.h"
+#include "common/archive.h"
#include "common/array.h"
#include "common/error.h"
#include "common/keyboard.h"
@@ -33,7 +34,6 @@
#include "common/stack.h"
#include "common/util.h"
-#include "agos/midi.h"
#include "agos/sound.h"
#include "agos/vga.h"
@@ -50,6 +50,16 @@
* - Simon the Sorcerer 2
* - Simon the Sorcerer Puzzle Pack
*/
+
+namespace Common {
+class File;
+class SeekableReadStream;
+}
+
+namespace Graphics {
+struct Surface;
+}
+
namespace AGOS {
uint fileReadItemID(Common::SeekableReadStream *in);
@@ -60,6 +70,8 @@ uint fileReadItemID(Common::SeekableReadStream *in);
class MoviePlayer;
#endif
+class MidiPlayer;
+
struct Child;
struct SubObject;
@@ -175,6 +187,22 @@ class Debugger;
# define _OPCODE(ver, x) { &ver::x, "" }
#endif
+class ArchiveMan : public Common::SearchSet {
+public:
+ ArchiveMan();
+
+ void enableFallback(bool val) { _fallBack = val; }
+
+#ifdef ENABLE_AGOS2
+ void registerArchive(const Common::String &filename, int priority);
+#endif
+
+ Common::SeekableReadStream *open(const Common::String &filename);
+
+private:
+ bool _fallBack;
+};
+
class AGOSEngine : public Engine {
protected:
friend class Debugger;
@@ -229,6 +257,7 @@ protected:
uint8 _numMusic, _numSFX;
uint16 _numSpeech;
+ uint16 _numZone;
uint8 _numBitArray1, _numBitArray2, _numBitArray3, _numItemStore;
uint16 _numVars;
@@ -313,7 +342,7 @@ protected:
bool _backFlag;
uint16 _debugMode;
- uint16 _language;
+ Common::Language _language;
bool _copyProtection;
bool _pause;
bool _dumpScripts;
@@ -548,7 +577,7 @@ protected:
byte _lettersToPrintBuf[80];
- MidiPlayer _midi;
+ MidiPlayer *_midi;
bool _midiEnabled;
int _vgaTickCounter;
@@ -588,6 +617,8 @@ public:
AGOSEngine(OSystem *system, const AGOSGameDescription *gd);
virtual ~AGOSEngine();
+ ArchiveMan _archives;
+
byte *_curSfxFile;
uint32 _curSfxFileSize;
uint16 _sampleEnd, _sampleWait;
@@ -597,6 +628,10 @@ protected:
virtual uint16 readUint16Wrapper(const void *src);
virtual uint32 readUint32Wrapper(const void *src);
+#ifdef ENABLE_AGOS2
+ void loadArchives();
+#endif
+
int allocGamePcVars(Common::SeekableReadStream *in);
void createPlayer();
void allocateStringTable(int num);
@@ -781,14 +816,14 @@ protected:
void loadTextIntoMem(uint16 stringId);
uint loadTextFile(const char *filename, byte *dst);
- Common::File *openTablesFile(const char *filename);
- void closeTablesFile(Common::File *in);
+ Common::SeekableReadStream *openTablesFile(const char *filename);
+ void closeTablesFile(Common::SeekableReadStream *in);
uint loadTextFile_simon1(const char *filename, byte *dst);
- Common::File *openTablesFile_simon1(const char *filename);
+ Common::SeekableReadStream *openTablesFile_simon1(const char *filename);
uint loadTextFile_gme(const char *filename, byte *dst);
- Common::File *openTablesFile_gme(const char *filename);
+ Common::SeekableReadStream *openTablesFile_gme(const char *filename);
void invokeTimeEvent(TimeEvent *te);
bool kickoffTimeEvents();
diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp
index d9a585bd05..d9d6b71a2a 100644
--- a/engines/agos/animation.cpp
+++ b/engines/agos/animation.cpp
@@ -137,7 +137,7 @@ void MoviePlayer::handleNextFrame() {
// Movie player for DXA movies
///////////////////////////////////////////////////////////////////////////////
-const char * MoviePlayerDXA::_sequenceList[90] = {
+const char *const MoviePlayerDXA::_sequenceList[90] = {
"agent32",
"Airlock",
"Badluck",
@@ -251,8 +251,11 @@ bool MoviePlayerDXA::load() {
}
Common::String videoName = Common::String::format("%s.dxa", baseName);
- if (!loadFile(videoName))
+ Common::SeekableReadStream *videoStream = _vm->_archives.open(videoName);
+ if (!videoStream)
error("Failed to load video file %s", videoName.c_str());
+ if (!loadStream(videoStream))
+ error("Failed to load video stream from file %s", videoName.c_str());
debug(0, "Playing video %s", videoName.c_str());
@@ -412,8 +415,11 @@ MoviePlayerSMK::MoviePlayerSMK(AGOSEngine_Feeble *vm, const char *name)
bool MoviePlayerSMK::load() {
Common::String videoName = Common::String::format("%s.smk", baseName);
- if (!loadFile(videoName))
+ Common::SeekableReadStream *videoStream = _vm->_archives.open(videoName);
+ if (!videoStream)
error("Failed to load video file %s", videoName.c_str());
+ if (!loadStream(videoStream))
+ error("Failed to load video stream from file %s", videoName.c_str());
debug(0, "Playing video %s", videoName.c_str());
diff --git a/engines/agos/animation.h b/engines/agos/animation.h
index e1d7207251..11936aa338 100644
--- a/engines/agos/animation.h
+++ b/engines/agos/animation.h
@@ -73,7 +73,7 @@ protected:
};
class MoviePlayerDXA : public MoviePlayer, Video::DXADecoder {
- static const char *_sequenceList[90];
+ static const char *const _sequenceList[90];
uint8 _sequenceNum;
public:
MoviePlayerDXA(AGOSEngine_Feeble *vm, const char *name);
diff --git a/engines/agos/charset-fontdata.cpp b/engines/agos/charset-fontdata.cpp
index b708b4890b..e6b81f54ee 100644
--- a/engines/agos/charset-fontdata.cpp
+++ b/engines/agos/charset-fontdata.cpp
@@ -20,8 +20,6 @@
*
*/
-
-
#include "common/system.h"
#include "common/textconsole.h"
@@ -2454,4 +2452,3 @@ void AGOSEngine::windowDrawChar(WindowBlock *window, uint x, uint y, byte chr) {
}
} // End of namespace AGOS
-
diff --git a/engines/agos/charset.cpp b/engines/agos/charset.cpp
index 9d27afaa27..54aef99a47 100644
--- a/engines/agos/charset.cpp
+++ b/engines/agos/charset.cpp
@@ -20,8 +20,7 @@
*
*/
-
-
+#include "common/endian.h"
#include "common/system.h"
#include "agos/agos.h"
@@ -655,4 +654,3 @@ void AGOSEngine::windowScroll(WindowBlock *window) {
_videoLockOut &= ~0x8000;
}
} // End of namespace AGOS
-
diff --git a/engines/agos/contain.cpp b/engines/agos/contain.cpp
index ba60c65ff3..173194d45e 100644
--- a/engines/agos/contain.cpp
+++ b/engines/agos/contain.cpp
@@ -20,8 +20,6 @@
*
*/
-
-
#include "agos/agos.h"
#include "agos/intern.h"
diff --git a/engines/agos/cursor.cpp b/engines/agos/cursor.cpp
index ef4a1406c9..7c64d68048 100644
--- a/engines/agos/cursor.cpp
+++ b/engines/agos/cursor.cpp
@@ -20,10 +20,8 @@
*
*/
-
-
+#include "common/endian.h"
#include "common/events.h"
-#include "common/system.h"
#include "graphics/cursorman.h"
diff --git a/engines/agos/debug.cpp b/engines/agos/debug.cpp
index 9c44342975..841ac6bb1a 100644
--- a/engines/agos/debug.cpp
+++ b/engines/agos/debug.cpp
@@ -22,7 +22,6 @@
// AGOS debug functions
-
#include "common/file.h"
#include "common/textconsole.h"
@@ -298,20 +297,18 @@ void AGOSEngine::dumpVgaScriptAlways(const byte *ptr, uint16 res, uint16 id) {
}
void AGOSEngine::dumpAllVgaImageFiles() {
- uint8 start = (getGameType() == GType_PN) ? 0 : 2;
- uint16 end = (getGameType() == GType_PN) ? 26 : 450;
+ const uint8 start = (getGameType() == GType_PN) ? 0 : 2;
- for (int z = start; z < end; z++) {
+ for (int z = start; z < _numZone; z++) {
loadZone(z, false);
dumpVgaBitmaps(z);
}
}
void AGOSEngine::dumpAllVgaScriptFiles() {
- uint8 start = (getGameType() == GType_PN) ? 0 : 2;
- uint16 end = (getGameType() == GType_PN) ? 26 : 450;
+ const uint8 start = (getGameType() == GType_PN) ? 0 : 2;
- for (int z = start; z < end; z++) {
+ for (int z = start; z < _numZone; z++) {
uint16 zoneNum = (getGameType() == GType_PN) ? 0 : z;
loadZone(z, false);
@@ -517,7 +514,7 @@ void AGOSEngine::dumpBitmap(const char *filename, const byte *offs, uint16 w, ui
dst += w;
src += w;
}
- } else if ((getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) && w == 320 && (h == 134 || h == 200)) {
+ } else if ((getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) && w == 320 && (h == 134 || h == 135 || h == 200)) {
for (j = 0; j != h; j++) {
uint16 count = w / 8;
@@ -621,7 +618,7 @@ void AGOSEngine::palLoad(byte *pal, const byte *vga1, int a, int b) {
void AGOSEngine::dumpVgaBitmaps(uint16 zoneNum) {
uint16 width, height, flags;
- uint32 offs, curOffs = 0;
+ uint32 offs, offsEnd;
const byte *p2;
byte pal[768];
@@ -637,7 +634,11 @@ void AGOSEngine::dumpVgaBitmaps(uint16 zoneNum) {
memset(pal, 0, sizeof(pal));
palLoad(pal, vga1, 0, 0);
- for (int i = 1; ; i++) {
+ offsEnd = readUint32Wrapper(vga2 + 8);
+ for (uint i = 1; ; i++) {
+ if ((i * 8) >= offsEnd)
+ break;
+
p2 = vga2 + i * 8;
offs = readUint32Wrapper(p2);
@@ -651,10 +652,8 @@ void AGOSEngine::dumpVgaBitmaps(uint16 zoneNum) {
}
debug(1, "Zone %d: Image %d. Offs= %d Width=%d, Height=%d, Flags=0x%X", zoneNum, i, offs, width, height, flags);
- if (offs < curOffs || offs >= imageBlockSize || width == 0 || height == 0)
- return;
-
- curOffs = offs;
+ if (offs >= imageBlockSize || width == 0 || height == 0)
+ break;
/* dump bitmap */
char buf[40];
diff --git a/engines/agos/debug.h b/engines/agos/debug.h
index fd5908997f..fe14ae4860 100644
--- a/engines/agos/debug.h
+++ b/engines/agos/debug.h
@@ -2843,4 +2843,3 @@ const char *const feeblefiles_videoOpcodeNameTable[] = {
} // End of namespace AGOS
#endif
-
diff --git a/engines/agos/debugger.cpp b/engines/agos/debugger.cpp
index a313dbbd1e..fc24c6d363 100644
--- a/engines/agos/debugger.cpp
+++ b/engines/agos/debugger.cpp
@@ -20,12 +20,11 @@
*
*/
-
-
#include "common/config-manager.h"
#include "agos/debugger.h"
#include "agos/agos.h"
+#include "agos/midi.h"
namespace AGOS {
@@ -58,7 +57,7 @@ bool Debugger::Cmd_DebugLevel(int argc, const char **argv) {
DebugPrintf("Debugging is currently set at level %d\n", gDebugLevel);
} else { // set level
gDebugLevel = atoi(argv[1]);
- if (gDebugLevel >= 0 && gDebugLevel < 10) {
+ if (0 <= gDebugLevel && gDebugLevel < 11) {
_vm->_debugMode = true;
DebugPrintf("Debug level set to level %d\n", gDebugLevel);
} else if (gDebugLevel < 0) {
@@ -79,7 +78,7 @@ bool Debugger::Cmd_PlayMusic(int argc, const char **argv) {
// TODO
} else if (_vm->getGameType() == GType_SIMON2) {
_vm->loadMusic(music);
- _vm->_midi.startTrack(0);
+ _vm->_midi->startTrack(0);
} else {
_vm->playMusic(music, 0);
}
@@ -287,4 +286,3 @@ bool Debugger::Cmd_dumpScript(int argc, const char **argv) {
}
} // End of namespace AGOS
-
diff --git a/engines/agos/detection.cpp b/engines/agos/detection.cpp
index 2be888b92a..13559c2f4f 100644
--- a/engines/agos/detection.cpp
+++ b/engines/agos/detection.cpp
@@ -83,7 +83,7 @@ static const PlainGameDescriptor agosGames[] = {
#include "agos/detection_tables.h"
-static const char *directoryGlobs[] = {
+static const char *const directoryGlobs[] = {
"execute", // Used by Simon1 Acorn CD
0
};
@@ -93,7 +93,7 @@ using namespace AGOS;
class AgosMetaEngine : public AdvancedMetaEngine {
public:
AgosMetaEngine() : AdvancedMetaEngine(AGOS::gameDescriptions, sizeof(AGOS::AGOSGameDescription), agosGames) {
- _guioptions = Common::GUIO_NOLAUNCHLOAD;
+ _guioptions = GUIO1(GUIO_NOLAUNCHLOAD);
_maxScanDepth = 2;
_directoryGlobs = directoryGlobs;
}
@@ -240,6 +240,22 @@ Common::Platform AGOSEngine::getPlatform() const {
}
const char *AGOSEngine::getFileName(int type) const {
+ // Required if the InstallShield cab is been used
+ if (getGameType() == GType_PP) {
+ if (type == GAME_BASEFILE)
+ return gss->base_filename;
+ }
+
+ // Required if the InstallShield cab is been used
+ if (getGameType() == GType_FF && getPlatform() == Common::kPlatformWindows) {
+ if (type == GAME_BASEFILE)
+ return gss->base_filename;
+ if (type == GAME_RESTFILE)
+ return gss->restore_filename;
+ if (type == GAME_TBLFILE)
+ return gss->tbl_filename;
+ }
+
for (int i = 0; _gameDescription->desc.filesDescriptions[i].fileType; i++) {
if (_gameDescription->desc.filesDescriptions[i].fileType == type)
return _gameDescription->desc.filesDescriptions[i].fileName;
@@ -247,4 +263,17 @@ const char *AGOSEngine::getFileName(int type) const {
return NULL;
}
+#ifdef ENABLE_AGOS2
+void AGOSEngine::loadArchives() {
+ const ADGameFileDescription *ag;
+
+ if (getFeatures() & GF_PACKED) {
+ for (ag = _gameDescription->desc.filesDescriptions; ag->fileName; ag++) {
+ if (!_archives.hasArchive(ag->fileName))
+ _archives.registerArchive(ag->fileName, ag->fileType);
+ }
+ }
+}
+#endif
+
} // End of namespace AGOS
diff --git a/engines/agos/detection_tables.h b/engines/agos/detection_tables.h
index a43d581173..21b9d24c7c 100644
--- a/engines/agos/detection_tables.h
+++ b/engines/agos/detection_tables.h
@@ -22,12 +22,6 @@
namespace AGOS {
-using Common::GUIO_NONE;
-using Common::GUIO_NOMIDI;
-using Common::GUIO_NOMUSIC;
-using Common::GUIO_NOSPEECH;
-using Common::GUIO_NOSUBTITLES;
-
static const AGOSGameDescription gameDescriptions[] = {
// Personal Nightmare 1.1 - English Amiga
{
@@ -44,7 +38,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_PN,
@@ -67,7 +61,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_DEMO,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_PN,
@@ -90,7 +84,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_PN,
@@ -113,7 +107,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_PN,
@@ -136,7 +130,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_DEMO,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA1,
@@ -157,7 +151,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA1,
@@ -178,7 +172,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA1,
@@ -199,7 +193,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA1,
@@ -222,7 +216,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_DEMO,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA1,
@@ -245,7 +239,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA1,
@@ -268,7 +262,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA1,
@@ -291,7 +285,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA1,
@@ -314,7 +308,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA1,
@@ -337,7 +331,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA1,
@@ -360,7 +354,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA1,
@@ -383,7 +377,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA1,
@@ -409,7 +403,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA2,
@@ -435,7 +429,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA2,
@@ -461,7 +455,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA2,
@@ -487,7 +481,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA2,
@@ -513,7 +507,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA2,
@@ -539,7 +533,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA2,
@@ -565,7 +559,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_ELVIRA2,
@@ -592,7 +586,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -618,7 +612,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -644,7 +638,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -670,7 +664,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -696,7 +690,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -722,7 +716,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -748,7 +742,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -774,7 +768,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_ELVIRA2,
@@ -801,7 +795,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_WW,
@@ -828,7 +822,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_WW,
@@ -851,7 +845,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_WW,
@@ -880,7 +874,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_WW,
@@ -909,7 +903,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_WW,
@@ -938,7 +932,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_WW,
@@ -967,7 +961,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_WW,
@@ -991,7 +985,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAcorn,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1016,7 +1010,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAcorn,
ADGF_DEMO,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1040,8 +1034,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformAcorn,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ ADGF_CD,
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1065,7 +1059,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1089,7 +1083,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_DEMO,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1113,7 +1107,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1137,7 +1131,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1161,7 +1155,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1185,7 +1179,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH | GUIO_NOMIDI
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1208,8 +1202,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformAmiga,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMIDI
+ ADGF_CD,
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1232,8 +1226,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformAmiga,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMIDI
+ ADGF_CD,
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMIDI)
},
GType_SIMON1,
@@ -1257,7 +1251,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1281,7 +1275,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1305,7 +1299,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::CZ_CZE,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1329,7 +1323,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::RU_RUS,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1353,7 +1347,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1377,7 +1371,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::CZ_CZE,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1401,7 +1395,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::RU_RUS,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1425,7 +1419,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1449,7 +1443,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1473,7 +1467,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1497,7 +1491,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON1,
@@ -1522,7 +1516,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1546,8 +1540,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ ADGF_CD,
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1571,8 +1565,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ ADGF_CD,
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1596,8 +1590,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::RU_RUS,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON1,
@@ -1621,8 +1615,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::FR_FRA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON1,
@@ -1647,7 +1641,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1671,8 +1665,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::HE_ISR,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON1,
@@ -1696,8 +1690,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::IT_ITA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON1,
@@ -1722,8 +1716,8 @@ static const AGOSGameDescription gameDescriptions[] = {
// FIXME: DOS version which uses WAV format
Common::IT_ITA,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON1,
@@ -1747,8 +1741,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::ES_ESP,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON1,
@@ -1772,8 +1766,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ ADGF_CD,
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1797,8 +1791,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ ADGF_CD,
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_SIMON1,
@@ -1823,7 +1817,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON2,
@@ -1848,7 +1842,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::RU_RUS,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON2,
@@ -1873,7 +1867,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON2,
@@ -1898,7 +1892,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON2,
@@ -1923,7 +1917,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_SIMON2,
@@ -1948,7 +1942,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -1973,7 +1967,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -1998,7 +1992,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2022,8 +2016,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2047,8 +2041,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2072,8 +2066,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::FR_FRA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2097,8 +2091,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2122,8 +2116,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2147,8 +2141,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::HE_ISR,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2173,8 +2167,8 @@ static const AGOSGameDescription gameDescriptions[] = {
// FIXME: DOS version which uses WAV format
Common::IT_ITA,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2198,8 +2192,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::ES_ESP,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2223,8 +2217,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::CZ_CZE,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2248,8 +2242,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2273,8 +2267,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::FR_FRA,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2298,8 +2292,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2323,8 +2317,8 @@ static const AGOSGameDescription gameDescriptions[] = {
},
Common::PL_POL,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GType_SIMON2,
@@ -2346,7 +2340,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2367,7 +2361,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2391,7 +2385,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2415,7 +2409,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2439,7 +2433,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2463,7 +2457,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2487,7 +2481,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2511,7 +2505,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2519,6 +2513,27 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_OLD_BUNDLE | GF_ZLIBCOMP | GF_TALKIE
},
+ // The Feeble Files - English Windows 2CD (with InstallShield cab)
+ {
+ {
+ "feeble",
+ "2CD",
+
+ {
+ { "data1.cab", 0, "600db08891e7a21badc8215e604cd88f", 28845430},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
+ },
+
+ GType_FF,
+ GID_FEEBLEFILES,
+ GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED
+ },
+
// The Feeble Files - English Windows 2CD
{
{
@@ -2534,7 +2549,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2557,7 +2572,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::PL_POL,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2565,6 +2580,27 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_OLD_BUNDLE | GF_TALKIE
},
+ // The Feeble Files - English Windows 4CD (with InstallShield cab)
+ {
+ {
+ "feeble",
+ "4CD",
+
+ {
+ { "data1.cab", 0, "65804cbc9036ac4b1275d97e0de3be2f", 28943062},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
+ },
+
+ GType_FF,
+ GID_FEEBLEFILES,
+ GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED
+ },
+
// The Feeble Files - English Windows 4CD
{
{
@@ -2580,7 +2616,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2603,7 +2639,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2626,7 +2662,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2649,7 +2685,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2672,7 +2708,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::PL_POL,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2695,7 +2731,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_FF,
@@ -2703,6 +2739,27 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_OLD_BUNDLE | GF_TALKIE
},
+ // Simon the Sorcerer's Puzzle Pack - Demon in my Pocket (with InstallShield cab)
+ {
+ {
+ "dimp",
+ "CD",
+
+ {
+ { "data1.cab", 0, "36dd86c1d872cea81ac1de7753dd684a", 40394693},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
+ },
+
+ GType_PP,
+ GID_DIMP,
+ GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED
+ },
+
// Simon the Sorcerer's Puzzle Pack - Demon in my Pocket
{
{
@@ -2716,7 +2773,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOMUSIC
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOMUSIC)
},
GType_PP,
@@ -2724,6 +2781,27 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_OLD_BUNDLE | GF_TALKIE
},
+ // Simon the Sorcerer's Puzzle Pack - Jumble (with InstallShield cab)
+ {
+ {
+ "jumble",
+ "CD",
+
+ {
+ { "data1.cab", 0, "36dd86c1d872cea81ac1de7753dd684a", 40394693},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSUBTITLES)
+ },
+
+ GType_PP,
+ GID_JUMBLE,
+ GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED
+ },
+
// Simon the Sorcerer's Puzzle Pack - Jumble
{
{
@@ -2737,7 +2815,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_PP,
@@ -2745,6 +2823,27 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_OLD_BUNDLE | GF_TALKIE
},
+ // Simon the Sorcerer's Puzzle Pack - NoPatience (with InstallShield cab)
+ {
+ {
+ "puzzle",
+ "CD",
+
+ {
+ { "data1.cab", 0, "36dd86c1d872cea81ac1de7753dd684a", 40394693},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSUBTITLES)
+ },
+
+ GType_PP,
+ GID_PUZZLE,
+ GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED
+ },
+
// Simon the Sorcerer's Puzzle Pack - NoPatience
{
{
@@ -2758,7 +2857,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_PP,
@@ -2766,6 +2865,27 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_OLD_BUNDLE | GF_TALKIE
},
+ // Simon the Sorcerer's Puzzle Pack - Swampy Adventures - English (with InstallShield cab)
+ {
+ {
+ "swampy",
+ "CD",
+
+ {
+ { "data1.cab", 0, "36dd86c1d872cea81ac1de7753dd684a", 40394693},
+ { NULL, 0, NULL, 0}
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSUBTITLES)
+ },
+
+ GType_PP,
+ GID_SWAMPY,
+ GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED
+ },
+
// Simon the Sorcerer's Puzzle Pack - Swampy Adventures - English
{
{
@@ -2779,7 +2899,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_PP,
@@ -2800,7 +2920,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_PP,
@@ -2821,7 +2941,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::PL_POL,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_PP,
@@ -2842,7 +2962,7 @@ static const AGOSGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
GType_PP,
diff --git a/engines/agos/draw.cpp b/engines/agos/draw.cpp
index 4d66b56a96..9fc5cedbf9 100644
--- a/engines/agos/draw.cpp
+++ b/engines/agos/draw.cpp
@@ -20,8 +20,7 @@
*
*/
-
-
+#include "common/endian.h"
#include "common/system.h"
#include "graphics/surface.h"
diff --git a/engines/agos/event.cpp b/engines/agos/event.cpp
index 3411e6d632..ed26b96381 100644
--- a/engines/agos/event.cpp
+++ b/engines/agos/event.cpp
@@ -20,8 +20,6 @@
*
*/
-
-
#include "agos/agos.h"
#include "agos/animation.h"
#include "agos/debugger.h"
diff --git a/engines/agos/feeble.cpp b/engines/agos/feeble.cpp
index 4c82b7e19d..4608969667 100644
--- a/engines/agos/feeble.cpp
+++ b/engines/agos/feeble.cpp
@@ -45,6 +45,9 @@ AGOSEngine_Feeble::~AGOSEngine_Feeble() {
}
static const GameSpecificSettings feeblefiles_settings = {
+ "game22", // base_filename
+ "save.999", // restore_filename
+ "tbllist", // tbl_filename
"", // effects_filename
"VOICES", // speech_filename
};
@@ -66,6 +69,7 @@ void AGOSEngine_Feeble::setupGame() {
_numVars = 255;
_numSpeech = 10000;
+ _numZone = 450;
AGOSEngine::setupGame();
}
diff --git a/engines/agos/gfx.cpp b/engines/agos/gfx.cpp
index 0b045bae01..fbf7f416ed 100644
--- a/engines/agos/gfx.cpp
+++ b/engines/agos/gfx.cpp
@@ -20,8 +20,7 @@
*
*/
-
-
+#include "common/endian.h"
#include "common/system.h"
#include "common/textconsole.h"
diff --git a/engines/agos/icons.cpp b/engines/agos/icons.cpp
index ead4e49ebb..7db2d85f21 100644
--- a/engines/agos/icons.cpp
+++ b/engines/agos/icons.cpp
@@ -20,8 +20,6 @@
*
*/
-
-
#include "common/file.h"
#include "common/system.h"
#include "common/textconsole.h"
diff --git a/engines/agos/input.cpp b/engines/agos/input.cpp
index 2ab543a943..24e5339420 100644
--- a/engines/agos/input.cpp
+++ b/engines/agos/input.cpp
@@ -20,13 +20,12 @@
*
*/
-
-
#include "common/config-manager.h"
#include "common/file.h"
#include "agos/intern.h"
#include "agos/agos.h"
+#include "agos/midi.h"
#include "agos/vga.h"
namespace AGOS {
@@ -582,14 +581,14 @@ bool AGOSEngine::processSpecialKeys() {
break;
case '+':
if (_midiEnabled) {
- _midi.setVolume(_midi.getMusicVolume() + 16, _midi.getSFXVolume() + 16);
+ _midi->setVolume(_midi->getMusicVolume() + 16, _midi->getSFXVolume() + 16);
}
ConfMan.setInt("music_volume", _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType) + 16);
syncSoundSettings();
break;
case '-':
if (_midiEnabled) {
- _midi.setVolume(_midi.getMusicVolume() - 16, _midi.getSFXVolume() - 16);
+ _midi->setVolume(_midi->getMusicVolume() - 16, _midi->getSFXVolume() - 16);
}
ConfMan.setInt("music_volume", _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType) - 16);
syncSoundSettings();
@@ -597,13 +596,13 @@ bool AGOSEngine::processSpecialKeys() {
case 'm':
_musicPaused = !_musicPaused;
if (_midiEnabled) {
- _midi.pause(_musicPaused);
+ _midi->pause(_musicPaused);
}
syncSoundSettings();
break;
case 's':
if (getGameId() == GID_SIMON1DOS) {
- _midi._enable_sfx = !_midi._enable_sfx;
+ _midi->_enable_sfx = !_midi->_enable_sfx;
} else {
_effectsPaused = !_effectsPaused;
_sound->effectsPause(_effectsPaused);
diff --git a/engines/agos/input_pn.cpp b/engines/agos/input_pn.cpp
index 9cc97ff10f..b3a44f2b2f 100644
--- a/engines/agos/input_pn.cpp
+++ b/engines/agos/input_pn.cpp
@@ -20,8 +20,6 @@
*
*/
-
-
#include "agos/agos.h"
#include "agos/intern.h"
diff --git a/engines/agos/installshield_cab.cpp b/engines/agos/installshield_cab.cpp
new file mode 100644
index 0000000000..f7b49a64c5
--- /dev/null
+++ b/engines/agos/installshield_cab.cpp
@@ -0,0 +1,221 @@
+/* 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.
+ *
+ */
+
+// The following code is based on unshield
+// Original copyright:
+
+// Copyright (c) 2003 David Eriksson <twogood@users.sourceforge.net>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+#include "agos/installshield_cab.h"
+
+#include "common/debug.h"
+#include "common/file.h"
+#include "common/memstream.h"
+#include "common/zlib.h"
+
+namespace AGOS {
+
+class InstallShieldCabinet : public Common::Archive {
+ Common::String _installShieldFilename;
+
+public:
+ InstallShieldCabinet(const Common::String &filename);
+ ~InstallShieldCabinet();
+
+ // 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 FileEntry {
+ uint32 uncompressedSize;
+ uint32 compressedSize;
+ uint32 offset;
+ uint16 flags;
+ };
+
+ typedef Common::HashMap<Common::String, FileEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap;
+ FileMap _map;
+};
+
+InstallShieldCabinet::~InstallShieldCabinet() {
+ _map.clear();
+}
+
+InstallShieldCabinet::InstallShieldCabinet(const Common::String &filename) : _installShieldFilename(filename) {
+ Common::File installShieldFile;
+
+ if (!installShieldFile.open(_installShieldFilename)) {
+ warning("InstallShieldCabinet::InstallShieldCabinet(): Could not find the archive file %s", _installShieldFilename.c_str());
+ return;
+ }
+
+ // Note that we only support a limited subset of cabinet files
+ // Only single cabinet files and ones without data shared between
+ // cabinets.
+
+ // Check for the magic uint32
+ if (installShieldFile.readUint32LE() != 0x28635349) {
+ warning("InstallShieldCabinet::InstallShieldCabinet(): Magic ID doesn't match");
+ return;
+ }
+
+ uint32 version = installShieldFile.readUint32LE();
+
+ if (version != 0x01000004) {
+ warning("Unsupported CAB version %08x", version);
+ return;
+ }
+
+ /* uint32 volumeInfo = */ installShieldFile.readUint32LE();
+ uint32 cabDescriptorOffset = installShieldFile.readUint32LE();
+ /* uint32 cabDescriptorSize = */ installShieldFile.readUint32LE();
+
+ installShieldFile.seek(cabDescriptorOffset);
+
+ installShieldFile.skip(12);
+ uint32 fileTableOffset = installShieldFile.readUint32LE();
+ installShieldFile.skip(4);
+ uint32 fileTableSize = installShieldFile.readUint32LE();
+ uint32 fileTableSize2 = installShieldFile.readUint32LE();
+ uint32 directoryCount = installShieldFile.readUint32LE();
+ installShieldFile.skip(8);
+ uint32 fileCount = installShieldFile.readUint32LE();
+
+ if (fileTableSize != fileTableSize2)
+ warning("file table sizes do not match");
+
+ // We're ignoring file groups and components since we
+ // should not need them. Moving on to the files...
+
+ installShieldFile.seek(cabDescriptorOffset + fileTableOffset);
+ uint32 fileTableCount = directoryCount + fileCount;
+ uint32 *fileTableOffsets = new uint32[fileTableCount];
+ for (uint32 i = 0; i < fileTableCount; i++)
+ fileTableOffsets[i] = installShieldFile.readUint32LE();
+
+ for (uint32 i = directoryCount; i < fileCount + directoryCount; i++) {
+ installShieldFile.seek(cabDescriptorOffset + fileTableOffset + fileTableOffsets[i]);
+ uint32 nameOffset = installShieldFile.readUint32LE();
+ /* uint32 directoryIndex = */ installShieldFile.readUint32LE();
+
+ // First read in data needed by us to get at the file data
+ FileEntry entry;
+ entry.flags = installShieldFile.readUint16LE();
+ entry.uncompressedSize = installShieldFile.readUint32LE();
+ entry.compressedSize = installShieldFile.readUint32LE();
+ installShieldFile.skip(20);
+ entry.offset = installShieldFile.readUint32LE();
+
+ // Then let's get the string
+ installShieldFile.seek(cabDescriptorOffset + fileTableOffset + nameOffset);
+ Common::String fileName;
+
+ char c = installShieldFile.readByte();
+ while (c) {
+ fileName += c;
+ c = installShieldFile.readByte();
+ }
+ _map[fileName] = entry;
+ }
+
+ delete[] fileTableOffsets;
+}
+
+bool InstallShieldCabinet::hasFile(const Common::String &name) {
+ warning("hasFile: Filename %s", name.c_str());
+ return _map.contains(name);
+}
+
+int InstallShieldCabinet::listMembers(Common::ArchiveMemberList &list) {
+ for (FileMap::const_iterator it = _map.begin(); it != _map.end(); it++)
+ list.push_back(getMember(it->_key));
+
+ return _map.size();
+}
+
+Common::ArchiveMemberPtr InstallShieldCabinet::getMember(const Common::String &name) {
+ return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+}
+
+Common::SeekableReadStream *InstallShieldCabinet::createReadStreamForMember(const Common::String &name) const {
+ if (!_map.contains(name))
+ return 0;
+
+ const FileEntry &entry = _map[name];
+
+ Common::File archiveFile;
+ archiveFile.open(_installShieldFilename);
+ archiveFile.seek(entry.offset);
+
+ if (!(entry.flags & 0x04)) {
+ // Not compressed
+ return archiveFile.readStream(entry.uncompressedSize);
+ }
+
+#ifdef USE_ZLIB
+ byte *src = (byte *)malloc(entry.compressedSize);
+ byte *dst = (byte *)malloc(entry.uncompressedSize);
+
+ archiveFile.read(src, entry.compressedSize);
+
+ bool result = Common::inflateZlibHeaderless(dst, entry.uncompressedSize, src, entry.compressedSize);
+ free(src);
+
+ if (!result) {
+ warning("failed to inflate CAB file '%s'", name.c_str());
+ free(dst);
+ return 0;
+ }
+
+ return new Common::MemoryReadStream(dst, entry.uncompressedSize, DisposeAfterUse::YES);
+#else
+ warning("zlib required to extract compressed CAB file '%s'", name.c_str());
+ return 0;
+#endif
+}
+
+Common::Archive *makeInstallShieldArchive(const Common::String &name) {
+ return new InstallShieldCabinet(name);
+}
+
+} // End of namespace AGOS
diff --git a/engines/agos/installshield_cab.h b/engines/agos/installshield_cab.h
new file mode 100644
index 0000000000..f7e8bed277
--- /dev/null
+++ b/engines/agos/installshield_cab.h
@@ -0,0 +1,41 @@
+/* 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.
+ *
+ */
+
+#include "common/archive.h"
+#include "common/str.h"
+
+#ifndef AGOS_INSTALLSHIELD_CAB_H
+#define AGOS_INSTALLSHIELD_CAB_H
+
+namespace AGOS {
+
+/**
+ * This factory method creates an Archive instance corresponding to the content
+ * of the InstallShield compressed file with the given name.
+ *
+ * May return 0 in case of a failure.
+ */
+Common::Archive *makeInstallShieldArchive(const Common::String &name);
+
+} // End of namespace AGOS
+
+#endif
diff --git a/engines/agos/intern.h b/engines/agos/intern.h
index 18f56be4a4..773b9c15bd 100644
--- a/engines/agos/intern.h
+++ b/engines/agos/intern.h
@@ -193,6 +193,9 @@ struct TimeEvent {
};
struct GameSpecificSettings {
+ const char *base_filename;
+ const char *restore_filename;
+ const char *tbl_filename;
const char *effects_filename;
const char *speech_filename;
};
@@ -251,7 +254,8 @@ enum GameFeatures {
GF_32COLOR = 1 << 5,
GF_EGA = 1 << 6,
GF_PLANAR = 1 << 7,
- GF_DEMO = 1 << 8
+ GF_DEMO = 1 << 8,
+ GF_PACKED = 1 << 9
};
enum GameFileTypes {
diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp
index 0fb873a733..3bb5a132ef 100644
--- a/engines/agos/items.cpp
+++ b/engines/agos/items.cpp
@@ -20,8 +20,6 @@
*
*/
-
-
#include "common/file.h"
#include "common/textconsole.h"
diff --git a/engines/agos/menus.cpp b/engines/agos/menus.cpp
index 4d62e34820..a0d2bdcaa0 100644
--- a/engines/agos/menus.cpp
+++ b/engines/agos/menus.cpp
@@ -20,8 +20,6 @@
*
*/
-
-
#include "common/file.h"
#include "common/system.h"
#include "common/textconsole.h"
diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp
index 88f6dd80d1..431f080bf2 100644
--- a/engines/agos/midi.cpp
+++ b/engines/agos/midi.cpp
@@ -20,14 +20,12 @@
*
*/
-
-
#include "common/config-manager.h"
#include "common/file.h"
-#include "common/system.h"
#include "common/textconsole.h"
#include "agos/agos.h"
+#include "agos/midi.h"
namespace AGOS {
@@ -64,6 +62,7 @@ MidiPlayer::~MidiPlayer() {
Common::StackLock lock(_mutex);
if (_driver) {
+ _driver->setTimerCallback(0, 0);
_driver->close();
delete _driver;
}
diff --git a/engines/agos/midiparser_s1d.cpp b/engines/agos/midiparser_s1d.cpp
index 01690247f0..9ca87436fc 100644
--- a/engines/agos/midiparser_s1d.cpp
+++ b/engines/agos/midiparser_s1d.cpp
@@ -31,20 +31,22 @@ namespace AGOS {
/**
* Simon 1 Demo version of MidiParser.
- *
- * This parser is the result of eyeballing the one MUS file that's included
- * with simon1demo. So there might be some things missing. I've tried to notate
- * question-mark areas where they occur.
*/
class MidiParser_S1D : public MidiParser {
-protected:
+private:
byte *_data;
bool _no_delta;
+ struct Loop {
+ uint16 timer;
+ byte *start, *end;
+ } _loops[16];
+
+ uint32 readVLQ2(byte *&data);
+ void chainEvent(EventInfo &info);
protected:
void parseNextEvent(EventInfo &info);
void resetTracking();
- uint32 readVLQ2(byte * &data);
public:
MidiParser_S1D() : _data(0), _no_delta(false) {}
@@ -52,145 +54,128 @@ public:
bool loadMusic(byte *data, uint32 size);
};
+uint32 MidiParser_S1D::readVLQ2(byte *&data) {
+ uint32 delta = 0;
-// The VLQs for simon1demo seem to be
-// in Little Endian format.
-uint32 MidiParser_S1D::readVLQ2(byte * &data) {
- byte str;
- uint32 value = 0;
- int i;
-
- for (i = 0; i < 4; ++i) {
- str = data[0];
- ++data;
- value |= (str & 0x7F) << (i * 7);
- if (!(str & 0x80))
- break;
+ // LE format VLQ, which is 2 bytes long at max.
+ delta = *data++;
+ if (delta & 0x80) {
+ delta &= 0x7F;
+ delta |= *data++ << 7;
}
- return value;
+
+ return delta;
+}
+
+void MidiParser_S1D::chainEvent(EventInfo &info) {
+ // When we chain an event, we add up the old delta.
+ uint32 delta = info.delta;
+ parseNextEvent(info);
+ info.delta += delta;
}
void MidiParser_S1D::parseNextEvent(EventInfo &info) {
info.start = _position._play_pos;
+ info.length = 0;
info.delta = _no_delta ? 0 : readVLQ2(_position._play_pos);
-
_no_delta = false;
- info.event = *(_position._play_pos++);
- if (info.command() < 0x8) {
+
+ info.event = *_position._play_pos++;
+ if (!(info.event & 0x80)) {
_no_delta = true;
- info.event += 0x80;
+ info.event |= 0x80;
}
- switch (info.command()) {
- case 0x8:
- info.basic.param1 = *(_position._play_pos++);
- info.basic.param2 = 0;
- info.length = 0;
- break;
-
- case 0x9:
- info.basic.param1 = *(_position._play_pos++);
- info.basic.param2 = *(_position._play_pos++); // I'm ASSUMING this byte is velocity!
- info.length = 0;
- break;
-
- case 0xA:
- case 0xB:
- // I'm not sure what these are meant to do, or what the
- // parameter is. Elvira 1 needs them, though, and who am I to
- // argue with her?
- info.basic.param1 = *(_position._play_pos++);
- info.basic.param2 = 0;
- break;
-
- case 0xC:
- info.basic.param1 = *(_position._play_pos++);
- info.basic.param2 = 0;
- ++_position._play_pos; // I have NO IDEA what the second byte is for.
- break;
-
- case 0xD:
- // Triggered by MOD0/MOD1/MOD2/MOD3/MOD4/MOD6/MOD7/MOD8/MOD9 in Elvira 2
- // Triggered by MOD0/MOD2/MOD3/MOD5/MOD6/MOD7/MOD8/MOD9/MOD10/MOD12/MOD14/MOD15/MOD20 in Waxworks
- break;
-
- case 0xE:
- // Triggered by MOD9 in Elvira 1
- // Triggered by MOD3/MOD5 in Elvira 2
- // Triggered by MOD3/MOD7/MOD8/MOD13 in Waxworks
- break;
-
- case 0xF:
- switch (info.event & 0x0F) {
- case 0x0:
- // Trigged by MOD2/MOD6/MOD15 in Waxworks
- // Pure guesswork
- info.ext.type = *(_position._play_pos++);
- info.length = readVLQ(_position._play_pos);
- info.ext.data = _position._play_pos;
- break;
-
- case 0x3: // Not sure, Song Select?
- // Trigged by MOD1/MOD7/MOD10 in Elvira 1
- info.basic.param1 = *(_position._play_pos++);
+ if (info.event == 0xFC) {
+ // This means End of Track.
+ // Rewrite in SMF (MIDI transmission) form.
+ info.event = 0xFF;
+ info.ext.type = 0x2F;
+ } else {
+ switch (info.command()) {
+ case 0x8: // note off
+ info.basic.param1 = *_position._play_pos++;
info.basic.param2 = 0;
break;
- case 0x4:
- // Trigged by MOD8 in Elvira 1
- break;
-
- case 0x7:
- // Trigged by MOD6 in Elvira 2
- // Trigged by MOD5 in Waxworks
+ case 0x9: // note on
+ info.basic.param1 = *_position._play_pos++;
+ info.basic.param2 = *_position._play_pos++;
break;
- case 0x8: // Not sure, ?
- // Trigged by MOD19 in Waxworks
- info.basic.param1 = info.basic.param2 = 0;
+ case 0xA: { // loop control
+ // In case the stop mode(?) is set to 0x80 this will stop the
+ // track over here.
+
+ const int16 loopIterations = int8(*_position._play_pos++);
+ if (!loopIterations) {
+ _loops[info.channel()].start = _position._play_pos;
+ } else {
+ if (!_loops[info.channel()].timer) {
+ if (_loops[info.channel()].start) {
+ _loops[info.channel()].timer = uint16(loopIterations);
+ _loops[info.channel()].end = _position._play_pos;
+
+ // Go to the start of the loop
+ _position._play_pos = _loops[info.channel()].start;
+ }
+ } else {
+ if (_loops[info.channel()].timer)
+ _position._play_pos = _loops[info.channel()].start;
+ --_loops[info.channel()].timer;
+ }
+ }
+
+ // We need to read the next midi event here. Since we can not
+ // safely pass this event to the MIDI event processing.
+ chainEvent(info);
+ } break;
+
+ case 0xB: // auto stop marker(?)
+ // In case the stop mode(?) is set to 0x80 this will stop the
+ // track.
+
+ // We need to read the next midi event here. Since we can not
+ // safely pass this event to the MIDI event processing.
+ chainEvent(info);
break;
- case 0xA:
- // Trigged by MOD5 in Elvira 2
+ case 0xC: // program change
+ info.basic.param1 = *_position._play_pos++;
+ info.basic.param2 = 0;
break;
- case 0xC:
- // This means End of Track.
- // Rewrite in SMF (MIDI transmission) form.
- info.event = 0xFF;
- info.ext.type = 0x2F;
- info.length = 0;
- break;
+ case 0xD: // jump to loop end
+ if (_loops[info.channel()].end)
+ _position._play_pos = _loops[info.channel()].end;
- case 0xF: // Not sure, META event?
- // Trigged by MOD8/MOD9/MOD11/MOD12/MOD13 in Waxworks
- info.ext.type = *(_position._play_pos++);
- info.length = readVLQ(_position._play_pos);
- info.ext.data = _position._play_pos;
- _position._play_pos += info.length;
+ // We need to read the next midi event here. Since we can not
+ // safely pass this event to the MIDI event processing.
+ chainEvent(info);
break;
default:
- error("MidiParser_S1D: Unexpected type 0x%02X found", (int) info.event);
+ // The original called some other function from here, which seems
+ // not to be MIDI related.
+ warning("MidiParser_S1D: default case %d", info.channel());
+
+ // We need to read the next midi event here. Since we can not
+ // safely pass this event to the MIDI event processing.
+ chainEvent(info);
break;
}
- break;
- default:
- error("MidiParser_S1D: Unexpected event 0x%02X found", (int) info.command());
- break;
}
}
bool MidiParser_S1D::loadMusic(byte *data, uint32 size) {
unloadMusic();
+ // The original actually just ignores the first two bytes.
byte *pos = data;
if (*(pos++) != 0xFC)
debug(1, "Expected 0xFC header but found 0x%02X instead", (int) *pos);
- // The next 3 bytes MIGHT be tempo, but we skip them and use the default.
-// setTempo (*(pos++) | (*(pos++) << 8) | (*(pos++) << 16));
- pos += 3;
+ pos += 1;
// And now we're at the actual data. Only one track.
_num_tracks = 1;
@@ -208,7 +193,9 @@ bool MidiParser_S1D::loadMusic(byte *data, uint32 size) {
void MidiParser_S1D::resetTracking() {
MidiParser::resetTracking();
- _no_delta = false;
+ // The first event never contains any delta.
+ _no_delta = true;
+ memset(_loops, 0, sizeof(_loops));
}
MidiParser *MidiParser_createS1D() { return new MidiParser_S1D; }
diff --git a/engines/agos/module.mk b/engines/agos/module.mk
index 7069d8005b..7ae5e17bf2 100644
--- a/engines/agos/module.mk
+++ b/engines/agos/module.mk
@@ -51,6 +51,7 @@ ifdef ENABLE_AGOS2
MODULE_OBJS += \
animation.o \
feeble.o \
+ installshield_cab.o \
oracle.o \
script_dp.o \
script_ff.o \
diff --git a/engines/agos/oracle.cpp b/engines/agos/oracle.cpp
index 2a3c668c08..025a833b77 100644
--- a/engines/agos/oracle.cpp
+++ b/engines/agos/oracle.cpp
@@ -25,7 +25,6 @@
#ifdef ENABLE_AGOS2
#include "common/savefile.h"
-#include "common/system.h"
#include "graphics/surface.h"
diff --git a/engines/agos/res.cpp b/engines/agos/res.cpp
index a71d4d8150..69447f4b83 100644
--- a/engines/agos/res.cpp
+++ b/engines/agos/res.cpp
@@ -31,11 +31,30 @@
#include "agos/agos.h"
#include "agos/intern.h"
#include "agos/sound.h"
+#include "agos/installshield_cab.h"
#include "common/zlib.h"
namespace AGOS {
+ArchiveMan::ArchiveMan() {
+ _fallBack = true;
+}
+
+#ifdef ENABLE_AGOS2
+void ArchiveMan::registerArchive(const Common::String &filename, int priority) {
+ add(filename, makeInstallShieldArchive(filename), priority);
+}
+#endif
+
+Common::SeekableReadStream *ArchiveMan::open(const Common::String &filename) {
+ if (_fallBack && SearchMan.hasFile(filename)) {
+ return SearchMan.createReadStreamForMember(filename);
+ }
+
+ return createReadStreamForMember(filename);
+}
+
#ifdef ENABLE_AGOS2
uint16 AGOSEngine_Feeble::to16Wrapper(uint value) {
return TO_LE_16(value);
@@ -150,21 +169,21 @@ int AGOSEngine::allocGamePcVars(Common::SeekableReadStream *in) {
}
void AGOSEngine_PN::loadGamePcFile() {
- Common::File in;
+ Common::SeekableReadStream *in;
if (getFileName(GAME_BASEFILE) != NULL) {
// Read dataBase
- in.open(getFileName(GAME_BASEFILE));
- if (in.isOpen() == false) {
+ in = _archives.open(getFileName(GAME_BASEFILE));
+ if (!in) {
error("loadGamePcFile: Can't load database file '%s'", getFileName(GAME_BASEFILE));
}
- _dataBaseSize = in.size();
+ _dataBaseSize = in->size();
_dataBase = (byte *)malloc(_dataBaseSize);
if (_dataBase == NULL)
error("loadGamePcFile: Out of memory for dataBase");
- in.read(_dataBase, _dataBaseSize);
- in.close();
+ in->read(_dataBase, _dataBaseSize);
+ delete in;
if (_dataBase[31] != 0)
error("Later version of system requested");
@@ -172,17 +191,17 @@ void AGOSEngine_PN::loadGamePcFile() {
if (getFileName(GAME_TEXTFILE) != NULL) {
// Read textBase
- in.open(getFileName(GAME_TEXTFILE));
- if (in.isOpen() == false) {
+ in = _archives.open(getFileName(GAME_TEXTFILE));
+ if (!in) {
error("loadGamePcFile: Can't load textbase file '%s'", getFileName(GAME_TEXTFILE));
}
- _textBaseSize = in.size();
+ _textBaseSize = in->size();
_textBase = (byte *)malloc(_textBaseSize);
if (_textBase == NULL)
error("loadGamePcFile: Out of memory for textBase");
- in.read(_textBase, _textBaseSize);
- in.close();
+ in->read(_textBase, _textBaseSize);
+ delete in;
if (_textBase[getlong(30L)] != 128)
error("Unknown compression format");
@@ -190,20 +209,20 @@ void AGOSEngine_PN::loadGamePcFile() {
}
void AGOSEngine::loadGamePcFile() {
- Common::File in;
+ Common::SeekableReadStream *in;
int fileSize;
if (getFileName(GAME_BASEFILE) != NULL) {
/* Read main gamexx file */
- in.open(getFileName(GAME_BASEFILE));
- if (in.isOpen() == false) {
+ in = _archives.open(getFileName(GAME_BASEFILE));
+ if (!in) {
error("loadGamePcFile: Can't load gamexx file '%s'", getFileName(GAME_BASEFILE));
}
if (getFeatures() & GF_CRUNCHED_GAMEPC) {
- uint srcSize = in.size();
+ uint srcSize = in->size();
byte *srcBuf = (byte *)malloc(srcSize);
- in.read(srcBuf, srcSize);
+ in->read(srcBuf, srcSize);
uint dstSize = READ_BE_UINT32(srcBuf + srcSize - 4);
byte *dstBuf = (byte *)malloc(dstSize);
@@ -214,25 +233,25 @@ void AGOSEngine::loadGamePcFile() {
readGamePcFile(&stream);
free(dstBuf);
} else {
- readGamePcFile(&in);
+ readGamePcFile(in);
}
- in.close();
+ delete in;
}
if (getFileName(GAME_TBLFILE) != NULL) {
/* Read list of TABLE resources */
- in.open(getFileName(GAME_TBLFILE));
- if (in.isOpen() == false) {
+ in = _archives.open(getFileName(GAME_TBLFILE));
+ if (!in) {
error("loadGamePcFile: Can't load table resources file '%s'", getFileName(GAME_TBLFILE));
}
- fileSize = in.size();
+ fileSize = in->size();
_tblList = (byte *)malloc(fileSize);
if (_tblList == NULL)
error("loadGamePcFile: Out of memory for strip table list");
- in.read(_tblList, fileSize);
- in.close();
+ in->read(_tblList, fileSize);
+ delete in;
/* Remember the current state */
_subroutineListOrg = _subroutineList;
@@ -242,71 +261,71 @@ void AGOSEngine::loadGamePcFile() {
if (getFileName(GAME_STRFILE) != NULL) {
/* Read list of TEXT resources */
- in.open(getFileName(GAME_STRFILE));
- if (in.isOpen() == false)
+ in = _archives.open(getFileName(GAME_STRFILE));
+ if (!in)
error("loadGamePcFile: Can't load text resources file '%s'", getFileName(GAME_STRFILE));
- fileSize = in.size();
+ fileSize = in->size();
_strippedTxtMem = (byte *)malloc(fileSize);
if (_strippedTxtMem == NULL)
error("loadGamePcFile: Out of memory for strip text list");
- in.read(_strippedTxtMem, fileSize);
- in.close();
+ in->read(_strippedTxtMem, fileSize);
+ delete in;
}
if (getFileName(GAME_STATFILE) != NULL) {
/* Read list of ROOM STATE resources */
- in.open(getFileName(GAME_STATFILE));
- if (in.isOpen() == false) {
+ in = _archives.open(getFileName(GAME_STATFILE));
+ if (!in) {
error("loadGamePcFile: Can't load state resources file '%s'", getFileName(GAME_STATFILE));
}
- _numRoomStates = in.size() / 8;
+ _numRoomStates = in->size() / 8;
_roomStates = (RoomState *)calloc(_numRoomStates, sizeof(RoomState));
if (_roomStates == NULL)
error("loadGamePcFile: Out of memory for room state list");
for (uint s = 0; s < _numRoomStates; s++) {
- uint16 num = in.readUint16BE() - (_itemArrayInited - 2);
+ uint16 num = in->readUint16BE() - (_itemArrayInited - 2);
- _roomStates[num].state = in.readUint16BE();
- _roomStates[num].classFlags = in.readUint16BE();
- _roomStates[num].roomExitStates = in.readUint16BE();
+ _roomStates[num].state = in->readUint16BE();
+ _roomStates[num].classFlags = in->readUint16BE();
+ _roomStates[num].roomExitStates = in->readUint16BE();
}
- in.close();
+ delete in;
}
if (getFileName(GAME_RMSLFILE) != NULL) {
/* Read list of ROOM ITEMS resources */
- in.open(getFileName(GAME_RMSLFILE));
- if (in.isOpen() == false) {
+ in = _archives.open(getFileName(GAME_RMSLFILE));
+ if (!in) {
error("loadGamePcFile: Can't load room resources file '%s'", getFileName(GAME_RMSLFILE));
}
- fileSize = in.size();
+ fileSize = in->size();
_roomsList = (byte *)malloc(fileSize);
if (_roomsList == NULL)
error("loadGamePcFile: Out of memory for room items list");
- in.read(_roomsList, fileSize);
- in.close();
+ in->read(_roomsList, fileSize);
+ delete in;
}
if (getFileName(GAME_XTBLFILE) != NULL) {
/* Read list of XTABLE resources */
- in.open(getFileName(GAME_XTBLFILE));
- if (in.isOpen() == false) {
+ in = _archives.open(getFileName(GAME_XTBLFILE));
+ if (!in) {
error("loadGamePcFile: Can't load xtable resources file '%s'", getFileName(GAME_XTBLFILE));
}
- fileSize = in.size();
+ fileSize = in->size();
_xtblList = (byte *)malloc(fileSize);
if (_xtblList == NULL)
error("loadGamePcFile: Out of memory for strip xtable list");
- in.read(_xtblList, fileSize);
- in.close();
+ in->read(_xtblList, fileSize);
+ delete in;
/* Remember the current state */
_xsubroutineListOrg = _subroutineList;
@@ -780,7 +799,7 @@ void AGOSEngine::loadVGABeardFile(uint16 id) {
uint32 offs, size;
if (getFeatures() & GF_OLD_BUNDLE) {
- Common::File in;
+ Common::SeekableReadStream *in;
char filename[15];
if (id == 23)
id = 112;
@@ -796,22 +815,22 @@ void AGOSEngine::loadVGABeardFile(uint16 id) {
sprintf(filename, "0%d.VGA", id);
}
- in.open(filename);
- if (in.isOpen() == false)
+ in = _archives.open(filename);
+ if (!in)
error("loadSimonVGAFile: Can't load %s", filename);
- size = in.size();
+ size = in->size();
if (getFeatures() & GF_CRUNCHED) {
byte *srcBuffer = (byte *)malloc(size);
- if (in.read(srcBuffer, size) != size)
+ if (in->read(srcBuffer, size) != size)
error("loadSimonVGAFile: Read failed");
decrunchFile(srcBuffer, _vgaBufferPointers[11].vgaFile2, size);
free(srcBuffer);
} else {
- if (in.read(_vgaBufferPointers[11].vgaFile2, size) != size)
+ if (in->read(_vgaBufferPointers[11].vgaFile2, size) != size)
error("loadSimonVGAFile: Read failed");
}
- in.close();
+ delete in;
} else {
offs = _gameOffsetsPtr[id];
@@ -821,7 +840,7 @@ void AGOSEngine::loadVGABeardFile(uint16 id) {
}
void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
- Common::File in;
+ Common::SeekableReadStream *in;
char filename[15];
byte *dst;
uint32 file, offs, srcSize, dstSize;
@@ -874,8 +893,8 @@ void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
}
}
- in.open(filename);
- if (in.isOpen() == false) {
+ in = _archives.open(filename);
+ if (!in) {
if (useError)
error("loadVGAVideoFile: Can't load %s", filename);
@@ -883,11 +902,11 @@ void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
return;
}
- dstSize = srcSize = in.size();
+ dstSize = srcSize = in->size();
if (getGameType() == GType_PN && getPlatform() == Common::kPlatformPC && id == 17 && type == 2) {
// The A2.out file isn't compressed in PC version of Personal Nightmare
dst = allocBlock(dstSize + extraBuffer);
- if (in.read(dst, dstSize) != dstSize)
+ if (in->read(dst, dstSize) != dstSize)
error("loadVGAVideoFile: Read failed");
} else if (getGameType() == GType_PN && (getFeatures() & GF_CRUNCHED)) {
Common::Stack<uint32> data;
@@ -895,7 +914,7 @@ void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
int dataOutSize = 0;
for (uint i = 0; i < srcSize / 4; ++i) {
- uint32 dataVal = in.readUint32BE();
+ uint32 dataVal = in->readUint32BE();
// Correct incorrect byte, in corrupt 72.out file, included in some PC versions.
if (dataVal == 168042714)
data.push(168050906);
@@ -909,7 +928,7 @@ void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
delete[] dataOut;
} else if (getFeatures() & GF_CRUNCHED) {
byte *srcBuffer = (byte *)malloc(srcSize);
- if (in.read(srcBuffer, srcSize) != srcSize)
+ if (in->read(srcBuffer, srcSize) != srcSize)
error("loadVGAVideoFile: Read failed");
dstSize = READ_BE_UINT32(srcBuffer + srcSize - 4);
@@ -918,10 +937,10 @@ void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
free(srcBuffer);
} else {
dst = allocBlock(dstSize + extraBuffer);
- if (in.read(dst, dstSize) != dstSize)
+ if (in->read(dst, dstSize) != dstSize)
error("loadVGAVideoFile: Read failed");
}
- in.close();
+ delete in;
} else {
id = id * 2 + (type - 1);
offs = _gameOffsetsPtr[id];
diff --git a/engines/agos/res_ami.cpp b/engines/agos/res_ami.cpp
index b83d10364a..32adfa29e6 100644
--- a/engines/agos/res_ami.cpp
+++ b/engines/agos/res_ami.cpp
@@ -26,6 +26,8 @@
#include "agos/agos.h"
#include "agos/intern.h"
+#include "common/endian.h"
+
namespace AGOS {
enum {
diff --git a/engines/agos/res_snd.cpp b/engines/agos/res_snd.cpp
index 819af4fa40..b5612d710d 100644
--- a/engines/agos/res_snd.cpp
+++ b/engines/agos/res_snd.cpp
@@ -27,12 +27,12 @@
#include "agos/intern.h"
#include "agos/agos.h"
+#include "agos/midi.h"
#include "agos/vga.h"
#include "backends/audiocd/audiocd.h"
#include "audio/audiostream.h"
-#include "audio/mididrv.h"
#include "audio/mods/protracker.h"
namespace AGOS {
@@ -125,10 +125,10 @@ void AGOSEngine::loadMusic(uint16 music) {
_gameFile->read(buf, 4);
if (!memcmp(buf, "FORM", 4)) {
_gameFile->seek(_gameOffsetsPtr[_musicIndexBase + music - 1], SEEK_SET);
- _midi.loadXMIDI(_gameFile);
+ _midi->loadXMIDI(_gameFile);
} else {
_gameFile->seek(_gameOffsetsPtr[_musicIndexBase + music - 1], SEEK_SET);
- _midi.loadMultipleSMF(_gameFile);
+ _midi->loadMultipleSMF(_gameFile);
}
_lastMusicPlayed = music;
@@ -242,20 +242,20 @@ void AGOSEngine_Simon1::playMusic(uint16 music, uint16 track) {
if (music == 35)
return;
- _midi.setLoop(true); // Must do this BEFORE loading music. (GMF may have its own override.)
+ _midi->setLoop(true); // Must do this BEFORE loading music. (GMF may have its own override.)
_gameFile->seek(_gameOffsetsPtr[_musicIndexBase + music], SEEK_SET);
_gameFile->read(buf, 4);
if (!memcmp(buf, "GMF\x1", 4)) {
_gameFile->seek(_gameOffsetsPtr[_musicIndexBase + music], SEEK_SET);
- _midi.loadSMF(_gameFile, music);
+ _midi->loadSMF(_gameFile, music);
} else {
_gameFile->seek(_gameOffsetsPtr[_musicIndexBase + music], SEEK_SET);
- _midi.loadMultipleSMF(_gameFile);
+ _midi->loadMultipleSMF(_gameFile);
}
- _midi.startTrack(0);
- _midi.startTrack(track);
+ _midi->startTrack(0);
+ _midi->startTrack(track);
} else if (getPlatform() == Common::kPlatformAcorn) {
// TODO: Add support for Desktop Tracker format in Acorn disk version
} else {
@@ -266,15 +266,15 @@ void AGOSEngine_Simon1::playMusic(uint16 music, uint16 track) {
if (f.isOpen() == false)
error("playMusic: Can't load music from '%s'", filename);
- _midi.setLoop(true); // Must do this BEFORE loading music. (GMF may have its own override.)
+ _midi->setLoop(true); // Must do this BEFORE loading music. (GMF may have its own override.)
if (getFeatures() & GF_DEMO)
- _midi.loadS1D(&f);
+ _midi->loadS1D(&f);
else
- _midi.loadSMF(&f, music);
+ _midi->loadSMF(&f, music);
- _midi.startTrack(0);
- _midi.startTrack(track);
+ _midi->startTrack(0);
+ _midi->startTrack(track);
}
}
@@ -286,7 +286,7 @@ void AGOSEngine::playMusic(uint16 music, uint16 track) {
} else if (getPlatform() == Common::kPlatformAtariST) {
// TODO: Add support for music formats used
} else {
- _midi.setLoop(true); // Must do this BEFORE loading music.
+ _midi->setLoop(true); // Must do this BEFORE loading music.
char filename[15];
Common::File f;
@@ -295,21 +295,21 @@ void AGOSEngine::playMusic(uint16 music, uint16 track) {
if (f.isOpen() == false)
error("playMusic: Can't load music from '%s'", filename);
- _midi.loadS1D(&f);
- _midi.startTrack(0);
- _midi.startTrack(track);
+ _midi->loadS1D(&f);
+ _midi->startTrack(0);
+ _midi->startTrack(track);
}
}
void AGOSEngine::stopMusic() {
if (_midiEnabled) {
- _midi.stop();
+ _midi->stop();
}
_mixer->stopHandle(_modHandle);
}
void AGOSEngine::playSting(uint16 soundId) {
- if (!_midi._enable_sfx)
+ if (!_midi->_enable_sfx)
return;
char filename[15];
@@ -328,8 +328,8 @@ void AGOSEngine::playSting(uint16 soundId) {
error("playSting: Can't read sting %d offset", soundId);
mus_file.seek(mus_offset, SEEK_SET);
- _midi.loadSMF(&mus_file, soundId, true);
- _midi.startTrack(0);
+ _midi->loadSMF(&mus_file, soundId, true);
+ _midi->startTrack(0);
}
static const byte elvira1_soundTable[100] = {
@@ -413,7 +413,7 @@ bool AGOSEngine::loadVGASoundFile(uint16 id, uint8 type) {
return true;
}
-static const char *dimpSoundList[32] = {
+static const char *const dimpSoundList[32] = {
"Beep",
"Birth",
"Boiling",
@@ -450,17 +450,17 @@ static const char *dimpSoundList[32] = {
void AGOSEngine::loadSoundFile(const char* filename) {
- Common::File in;
+ Common::SeekableReadStream *in;
- in.open(filename);
- if (in.isOpen() == false)
+ in = _archives.open(filename);
+ if (!in)
error("loadSound: Can't load %s", filename);
- uint32 dstSize = in.size();
+ uint32 dstSize = in->size();
byte *dst = (byte *)malloc(dstSize);
- if (in.read(dst, dstSize) != dstSize)
+ if (in->read(dst, dstSize) != dstSize)
error("loadSound: Read failed");
- in.close();
+ delete in;
_sound->playSfxData(dst, 0, 0, 0);
}
@@ -469,21 +469,21 @@ void AGOSEngine::loadSound(uint16 sound, int16 pan, int16 vol, uint16 type) {
byte *dst;
if (getGameId() == GID_DIMP) {
- Common::File in;
+ Common::SeekableReadStream *in;
char filename[15];
assert(sound >= 1 && sound <= 32);
sprintf(filename, "%s.wav", dimpSoundList[sound - 1]);
- in.open(filename);
- if (in.isOpen() == false)
+ in = _archives.open(filename);
+ if (!in)
error("loadSound: Can't load %s", filename);
- uint32 dstSize = in.size();
+ uint32 dstSize = in->size();
dst = (byte *)malloc(dstSize);
- if (in.read(dst, dstSize) != dstSize)
+ if (in->read(dst, dstSize) != dstSize)
error("loadSound: Read failed");
- in.close();
+ delete in;
} else if (getFeatures() & GF_ZLIBCOMP) {
char filename[15];
diff --git a/engines/agos/rooms.cpp b/engines/agos/rooms.cpp
index f2629e419e..fb7b313e9c 100644
--- a/engines/agos/rooms.cpp
+++ b/engines/agos/rooms.cpp
@@ -401,9 +401,9 @@ bool AGOSEngine::loadRoomItems(uint16 room) {
filename[i] = 0;
p++;
- for (;;) {
- _roomsListPtr = p;
+ _roomsListPtr = p;
+ for (;;) {
minNum = READ_BE_UINT16(p); p += 2;
if (minNum == 0)
break;
diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp
index e6cce36b22..6779eabdbf 100644
--- a/engines/agos/saveload.cpp
+++ b/engines/agos/saveload.cpp
@@ -22,7 +22,6 @@
#include "common/file.h"
#include "common/savefile.h"
-#include "common/system.h"
#include "common/textconsole.h"
#include "common/translation.h"
@@ -1020,9 +1019,7 @@ bool AGOSEngine::loadGame(const char *filename, bool restartMode) {
if (restartMode) {
// Load restart state
- Common::File *file = new Common::File();
- file->open(filename);
- f = file;
+ f = _archives.open(filename);
} else {
f = _saveFileMan->openForLoading(filename);
}
@@ -1196,9 +1193,7 @@ bool AGOSEngine_Elvira2::loadGame(const char *filename, bool restartMode) {
if (restartMode) {
// Load restart state
- Common::File *file = new Common::File();
- file->open(filename);
- f = file;
+ f = _archives.open(filename);
} else {
f = _saveFileMan->openForLoading(filename);
}
diff --git a/engines/agos/script.cpp b/engines/agos/script.cpp
index 68a90e405b..1c36454278 100644
--- a/engines/agos/script.cpp
+++ b/engines/agos/script.cpp
@@ -22,8 +22,7 @@
// Item script opcodes for Simon1/Simon2
-
-
+#include "common/endian.h"
#include "common/system.h"
#include "common/textconsole.h"
diff --git a/engines/agos/script_dp.cpp b/engines/agos/script_dp.cpp
index a4ee249f47..f51e15dc67 100644
--- a/engines/agos/script_dp.cpp
+++ b/engines/agos/script_dp.cpp
@@ -24,8 +24,6 @@
#ifdef ENABLE_AGOS2
-#include "common/system.h"
-
#include "agos/agos.h"
namespace AGOS {
diff --git a/engines/agos/script_pn.cpp b/engines/agos/script_pn.cpp
index bde59b71b8..196350b9bf 100644
--- a/engines/agos/script_pn.cpp
+++ b/engines/agos/script_pn.cpp
@@ -23,6 +23,7 @@
#include "agos/agos.h"
#include "agos/vga.h"
+#include "common/endian.h"
#include "common/textconsole.h"
namespace AGOS {
@@ -465,8 +466,8 @@ void AGOSEngine_PN::opn_opcode35() {
void AGOSEngine_PN::opn_opcode36() {
for (int i = 0; i < _dataBase[57] + 1; ++i)
_wordcp[i] = 0;
- if (isspace(*_inpp))
- while ((*_inpp) && (isspace(*_inpp)))
+ if (isspace(static_cast<unsigned char>(*_inpp)))
+ while ((*_inpp) && (isspace(static_cast<unsigned char>(*_inpp))))
_inpp++;
if (*_inpp == 0) {
setScriptReturn(false);
@@ -480,7 +481,7 @@ void AGOSEngine_PN::opn_opcode36() {
}
int ct = 1;
- while ((*_inpp != '.') && (*_inpp != ',') && (!isspace(*_inpp)) && (*_inpp != '\0') &&
+ while ((*_inpp != '.') && (*_inpp != ',') && (!isspace(static_cast<unsigned char>(*_inpp))) && (*_inpp != '\0') &&
(*_inpp!='"')) {
if (ct < _dataBase[57])
_wordcp[ct++] = *_inpp;
@@ -580,7 +581,7 @@ void AGOSEngine_PN::opn_opcode46() {
return;
}
x++;
- while ((*x != '.') && (*x != ',') && (*x != '"') && (!isspace(*x)) && (*x != '\0'))
+ while ((*x != '.') && (*x != ',') && (*x != '"') && (!isspace(static_cast<unsigned char>(*x))) && (*x != '\0'))
pcf(*x++);
setScriptReturn(true);
}
diff --git a/engines/agos/script_s1.cpp b/engines/agos/script_s1.cpp
index 0e7e66778e..a07c05b4fc 100644
--- a/engines/agos/script_s1.cpp
+++ b/engines/agos/script_s1.cpp
@@ -20,8 +20,8 @@
*
*/
-
#include "common/system.h"
+#include "common/localization.h"
#include "graphics/palette.h"
@@ -308,34 +308,9 @@ void AGOSEngine_Simon1::os1_pauseGame() {
// 135: pause game
_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
- // If all else fails, use English as fallback.
- Common::KeyCode keyYes = Common::KEYCODE_y;
- Common::KeyCode keyNo = Common::KEYCODE_n;
-
- switch (_language) {
- case Common::RU_RUS:
- break;
- case Common::PL_POL:
- keyYes = Common::KEYCODE_t;
- break;
- case Common::HE_ISR:
- keyYes = Common::KEYCODE_f;
- break;
- case Common::ES_ESP:
- keyYes = Common::KEYCODE_s;
- break;
- case Common::IT_ITA:
- keyYes = Common::KEYCODE_s;
- break;
- case Common::FR_FRA:
- keyYes = Common::KEYCODE_o;
- break;
- case Common::DE_DEU:
- keyYes = Common::KEYCODE_j;
- break;
- default:
- break;
- }
+ Common::KeyCode keyYes, keyNo;
+
+ Common::getLanguageYesNo(_language, keyYes, keyNo);
while (!shouldQuit()) {
delay(1);
diff --git a/engines/agos/script_s2.cpp b/engines/agos/script_s2.cpp
index c646397ac3..c35771f8ec 100644
--- a/engines/agos/script_s2.cpp
+++ b/engines/agos/script_s2.cpp
@@ -23,6 +23,7 @@
#include "agos/agos.h"
+#include "agos/midi.h"
#include "common/textconsole.h"
@@ -342,11 +343,11 @@ void AGOSEngine_Simon2::os2_playTune() {
// effectively preloaded so there's no latency when
// starting playback).
- _midi.setLoop(loop != 0);
+ _midi->setLoop(loop != 0);
if (_lastMusicPlayed != music)
_nextMusicToPlay = music;
else
- _midi.startTrack(track);
+ _midi->startTrack(track);
}
void AGOSEngine_Simon2::os2_screenTextPObj() {
diff --git a/engines/agos/script_ww.cpp b/engines/agos/script_ww.cpp
index 29a91a15aa..873f258743 100644
--- a/engines/agos/script_ww.cpp
+++ b/engines/agos/script_ww.cpp
@@ -22,8 +22,6 @@
-#include "common/system.h"
-
#include "agos/agos.h"
namespace AGOS {
diff --git a/engines/agos/sound.cpp b/engines/agos/sound.cpp
index 03932aa4de..11a1cd792e 100644
--- a/engines/agos/sound.cpp
+++ b/engines/agos/sound.cpp
@@ -22,6 +22,7 @@
#include "common/file.h"
#include "common/memstream.h"
+#include "common/ptr.h"
#include "common/textconsole.h"
#include "common/util.h"
@@ -43,11 +44,10 @@ namespace AGOS {
class BaseSound : Common::NonCopyable {
protected:
- Common::File *_file;
+ Common::DisposablePtr<Common::File> _file;
uint32 *_offsets;
Audio::Mixer *_mixer;
bool _freeOffsets;
- DisposeAfterUse::Flag _disposeFile;
public:
BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 base, bool bigEndian, DisposeAfterUse::Flag disposeFileAfterUse = DisposeAfterUse::YES);
@@ -62,7 +62,7 @@ public:
};
BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 base, bool bigEndian, DisposeAfterUse::Flag disposeFileAfterUse)
- : _mixer(mixer), _file(file), _disposeFile(disposeFileAfterUse) {
+ : _mixer(mixer), _file(file, disposeFileAfterUse) {
uint res = 0;
uint32 size;
@@ -96,7 +96,7 @@ BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 base, bool
}
BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 *offsets, DisposeAfterUse::Flag disposeFileAfterUse)
- : _mixer(mixer), _file(file), _disposeFile(disposeFileAfterUse) {
+ : _mixer(mixer), _file(file, disposeFileAfterUse) {
_offsets = offsets;
_freeOffsets = false;
@@ -105,8 +105,6 @@ BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 *offsets, D
BaseSound::~BaseSound() {
if (_freeOffsets)
free(_offsets);
- if (_disposeFile == DisposeAfterUse::YES)
- delete _file;
}
///////////////////////////////////////////////////////////////////////////////
@@ -234,7 +232,7 @@ Audio::AudioStream *WavSound::makeAudioStream(uint sound) {
return NULL;
_file->seek(_offsets[sound], SEEK_SET);
- return Audio::makeWAVStream(_file, DisposeAfterUse::NO);
+ return Audio::makeWAVStream(_file.get(), DisposeAfterUse::NO);
}
void WavSound::playSound(uint sound, uint loopSound, Audio::Mixer::SoundType type, Audio::SoundHandle *handle, bool loop, int vol) {
@@ -257,7 +255,7 @@ public:
Audio::AudioStream *VocSound::makeAudioStream(uint sound) {
assert(_offsets);
_file->seek(_offsets[sound], SEEK_SET);
- return Audio::makeVOCStream(_file, _flags);
+ return Audio::makeVOCStream(_file.get(), _flags);
}
void VocSound::playSound(uint sound, uint loopSound, Audio::Mixer::SoundType type, Audio::SoundHandle *handle, bool loop, int vol) {
diff --git a/engines/agos/sound.h b/engines/agos/sound.h
index a7c4cd73db..ab4a3a963d 100644
--- a/engines/agos/sound.h
+++ b/engines/agos/sound.h
@@ -28,6 +28,10 @@
#include "agos/intern.h"
#include "common/str.h"
+namespace Common {
+class File;
+}
+
namespace AGOS {
class BaseSound;
diff --git a/engines/agos/string.cpp b/engines/agos/string.cpp
index f9a06cbecb..410fd5a1ce 100644
--- a/engines/agos/string.cpp
+++ b/engines/agos/string.cpp
@@ -517,8 +517,7 @@ void AGOSEngine::printScreenText(uint vgaSpriteId, uint color, const char *strin
y -= textHeight;
} else
pos = stringLength;
- padding = (lettersPerRow - pos) % 2 ?
- (lettersPerRow - pos) / 2 + 1 : (lettersPerRow - pos) / 2;
+ padding = ((lettersPerRow - pos) % 2) ? (lettersPerRow - pos) / 2 + 1 : (lettersPerRow - pos) / 2;
while (padding--)
*convertedString2++ = ' ';
stringLength -= pos;
diff --git a/engines/agos/string_pn.cpp b/engines/agos/string_pn.cpp
index 570fbc6200..ac8c263da3 100644
--- a/engines/agos/string_pn.cpp
+++ b/engines/agos/string_pn.cpp
@@ -68,7 +68,7 @@ void AGOSEngine_PN::uncomstr(char *c, uint32 x) {
*c = 0;
}
-static const char *objectNames[30] = {
+static const char *const objectNames[30] = {
"\0",
"Take \0",
"Inventory\r",
diff --git a/engines/agos/subroutine.cpp b/engines/agos/subroutine.cpp
index bd9abb16b5..10c1c1aaf9 100644
--- a/engines/agos/subroutine.cpp
+++ b/engines/agos/subroutine.cpp
@@ -258,22 +258,21 @@ void AGOSEngine::endCutscene() {
_runScriptReturn1 = true;
}
-Common::File *AGOSEngine::openTablesFile(const char *filename) {
+Common::SeekableReadStream *AGOSEngine::openTablesFile(const char *filename) {
if (getFeatures() & GF_OLD_BUNDLE)
return openTablesFile_simon1(filename);
else
return openTablesFile_gme(filename);
}
-Common::File *AGOSEngine::openTablesFile_simon1(const char *filename) {
- Common::File *fo = new Common::File();
- fo->open(filename);
- if (fo->isOpen() == false)
+Common::SeekableReadStream *AGOSEngine::openTablesFile_simon1(const char *filename) {
+ Common::SeekableReadStream *in = _archives.open(filename);
+ if (!in)
error("openTablesFile: Can't open '%s'", filename);
- return fo;
+ return in;
}
-Common::File *AGOSEngine::openTablesFile_gme(const char *filename) {
+Common::SeekableReadStream *AGOSEngine::openTablesFile_gme(const char *filename) {
uint res;
uint32 offs;
@@ -287,7 +286,7 @@ Common::File *AGOSEngine::openTablesFile_gme(const char *filename) {
bool AGOSEngine::loadTablesIntoMem(uint16 subrId) {
byte *p;
uint16 min_num, max_num, file_num;
- Common::File *in;
+ Common::SeekableReadStream *in;
char filename[30];
if (_tblList == NULL)
@@ -336,7 +335,7 @@ bool AGOSEngine::loadTablesIntoMem(uint16 subrId) {
bool AGOSEngine_Waxworks::loadTablesIntoMem(uint16 subrId) {
byte *p;
uint min_num, max_num;
- Common::File *in;
+ Common::SeekableReadStream *in;
p = _tblList;
if (p == NULL)
@@ -403,7 +402,7 @@ bool AGOSEngine::loadXTablesIntoMem(uint16 subrId) {
int i;
uint min_num, max_num;
char filename[30];
- Common::File *in;
+ Common::SeekableReadStream *in;
p = _xtblList;
if (p == NULL)
@@ -453,9 +452,8 @@ bool AGOSEngine::loadXTablesIntoMem(uint16 subrId) {
return 0;
}
-void AGOSEngine::closeTablesFile(Common::File *in) {
+void AGOSEngine::closeTablesFile(Common::SeekableReadStream *in) {
if (getFeatures() & GF_OLD_BUNDLE) {
- in->close();
delete in;
}
}
diff --git a/engines/agos/verb.cpp b/engines/agos/verb.cpp
index abc45c1ace..dec05f6703 100644
--- a/engines/agos/verb.cpp
+++ b/engines/agos/verb.cpp
@@ -22,7 +22,6 @@
// Verb and hitarea handling
-
#include "common/system.h"
#include "graphics/surface.h"
diff --git a/engines/agos/verb_pn.cpp b/engines/agos/verb_pn.cpp
index 19e8bb2d48..9dd0079b6d 100644
--- a/engines/agos/verb_pn.cpp
+++ b/engines/agos/verb_pn.cpp
@@ -258,7 +258,7 @@ void AGOSEngine_PN::hitBox9(HitArea *ha) {
iconPage();
}
-static const char *messageList[9] = {
+static const char *const messageList[9] = {
"North\r",
"East\r",
"South\r",
diff --git a/engines/agos/vga.cpp b/engines/agos/vga.cpp
index de6a6976e5..8541f579d6 100644
--- a/engines/agos/vga.cpp
+++ b/engines/agos/vga.cpp
@@ -27,6 +27,7 @@
#include "agos/intern.h"
#include "agos/vga.h"
+#include "common/endian.h"
#include "common/system.h"
#include "common/textconsole.h"
diff --git a/engines/agos/vga_e2.cpp b/engines/agos/vga_e2.cpp
index 1bde6945f0..d4aafd3d7b 100644
--- a/engines/agos/vga_e2.cpp
+++ b/engines/agos/vga_e2.cpp
@@ -26,6 +26,7 @@
#include "agos/agos.h"
#include "agos/intern.h"
+#include "common/endian.h"
#include "common/system.h"
#include "graphics/surface.h"
diff --git a/engines/agos/vga_s2.cpp b/engines/agos/vga_s2.cpp
index 1021ea8f94..9b9ed4e297 100644
--- a/engines/agos/vga_s2.cpp
+++ b/engines/agos/vga_s2.cpp
@@ -20,10 +20,9 @@
*
*/
-
-
#include "agos/agos.h"
#include "agos/intern.h"
+#include "agos/midi.h"
#include "graphics/surface.h"
@@ -146,8 +145,8 @@ void AGOSEngine::vc69_playSeq() {
// specifying a non-valid track number (999 or -1)
// as a means of stopping what music is currently
// playing.
- _midi.setLoop(loop != 0);
- _midi.startTrack(track);
+ _midi->setLoop(loop != 0);
+ _midi->startTrack(track);
}
void AGOSEngine::vc70_joinSeq() {
@@ -161,9 +160,9 @@ void AGOSEngine::vc70_joinSeq() {
// track and, if not, whether to switch to
// a different track upon completion.
if (track != 0xFFFF && track != 999)
- _midi.queueTrack(track, loop != 0);
+ _midi->queueTrack(track, loop != 0);
else
- _midi.setLoop(loop != 0);
+ _midi->setLoop(loop != 0);
}
void AGOSEngine::vc71_ifSeqWaiting() {
@@ -171,7 +170,7 @@ void AGOSEngine::vc71_ifSeqWaiting() {
// This command skips the next instruction
// unless (1) there is a track playing, AND
// (2) there is a track queued to play after it.
- if (!_midi.isPlaying(true))
+ if (!_midi->isPlaying(true))
vcSkipNextInstruction();
}
@@ -195,8 +194,8 @@ void AGOSEngine::vc72_segue() {
if (track == -1 || track == 999) {
stopMusic();
} else {
- _midi.setLoop(loop != 0);
- _midi.startTrack(track);
+ _midi->setLoop(loop != 0);
+ _midi->startTrack(track);
}
}
diff --git a/engines/agos/window.cpp b/engines/agos/window.cpp
index c55e3dcdda..0365c736d8 100644
--- a/engines/agos/window.cpp
+++ b/engines/agos/window.cpp
@@ -21,7 +21,6 @@
*/
-
#include "common/system.h"
#include "common/textconsole.h"
diff --git a/engines/agos/zones.cpp b/engines/agos/zones.cpp
index 61efbcb89a..483b9949eb 100644
--- a/engines/agos/zones.cpp
+++ b/engines/agos/zones.cpp
@@ -214,5 +214,3 @@ void AGOSEngine::checkZonePtrs() {
}
} // End of namespace AGOS
-
-
diff --git a/engines/cge/bitmap.cpp b/engines/cge/bitmap.cpp
new file mode 100644
index 0000000000..39bafc5e98
--- /dev/null
+++ b/engines/cge/bitmap.cpp
@@ -0,0 +1,392 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/bitmap.h"
+#include "cge/vga13h.h"
+#include "cge/cge_main.h"
+#include "common/system.h"
+#include "common/debug.h"
+#include "common/debug-channels.h"
+
+namespace CGE {
+
+Bitmap::Bitmap(CGEEngine *vm, const char *fname) : _m(NULL), _v(NULL), _map(0), _vm(vm) {
+ debugC(1, kCGEDebugBitmap, "Bitmap::Bitmap(%s)", fname);
+
+ char pat[kMaxPath];
+ forceExt(pat, fname, ".VBM");
+
+ if (_vm->_resman->exist(pat)) {
+ EncryptedStream file(_vm, pat);
+ if (file.err())
+ error("Unable to find VBM [%s]", fname);
+ if (!loadVBM(&file))
+ error("Bad VBM [%s]", fname);
+ } else {
+ error("Bad VBM [%s]", fname);
+ }
+}
+
+Bitmap::Bitmap(CGEEngine *vm, uint16 w, uint16 h, uint8 *map) : _w(w), _h(h), _m(map), _v(NULL), _map(0), _vm(vm) {
+ debugC(1, kCGEDebugBitmap, "Bitmap::Bitmap(%d, %d, map)", w, h);
+ if (map)
+ code();
+}
+
+// following routine creates filled rectangle
+// immediately as VGA video chunks, in near memory as fast as possible,
+// especially for text line real time display
+Bitmap::Bitmap(CGEEngine *vm, uint16 w, uint16 h, uint8 fill)
+ : _w((w + 3) & ~3), // only full uint32 allowed!
+ _h(h), _m(NULL), _map(0), _vm(vm) {
+ debugC(1, kCGEDebugBitmap, "Bitmap::Bitmap(%d, %d, %d)", w, h, fill);
+
+ uint16 dsiz = _w >> 2; // data size (1 plane line size)
+ uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap
+ uint16 psiz = _h * lsiz; // - last gape, but + plane trailer
+ uint8 *v = new uint8[4 * psiz + _h * sizeof(*_b)];// the same for 4 planes
+ // + room for wash table
+ assert(v != NULL);
+
+ *(uint16 *) v = TO_LE_16(kBmpCPY | dsiz); // data chunk hader
+ memset(v + 2, fill, dsiz); // data bytes
+ *(uint16 *)(v + lsiz - 2) = TO_LE_16(kBmpSKP | ((kScrWidth / 4) - dsiz)); // gap
+
+ // Replicate lines
+ byte *destP;
+ for (destP = v + lsiz; destP < (v + psiz); destP += lsiz)
+ Common::copy(v, v + lsiz, destP);
+
+ *(uint16 *)(v + psiz - 2) = TO_LE_16(kBmpEOI); // plane trailer uint16
+
+ // Replicate planes
+ for (destP = v + psiz; destP < (v + 4 * psiz); destP += psiz)
+ Common::copy(v, v + psiz, destP);
+
+ HideDesc *b = (HideDesc *)(v + 4 * psiz);
+ b->_skip = (kScrWidth - _w) >> 2;
+ b->_hide = _w >> 2;
+
+ // Replicate across the entire table
+ for (HideDesc *hdP = b + 1; hdP < (b + _h); hdP++)
+ *hdP = *b;
+
+ b->_skip = 0; // fix the first entry
+ _v = v;
+ _b = b;
+}
+
+Bitmap::Bitmap(CGEEngine *vm, const Bitmap &bmp) : _w(bmp._w), _h(bmp._h), _m(NULL), _v(NULL), _map(0), _vm(vm) {
+ debugC(1, kCGEDebugBitmap, "Bitmap::Bitmap(bmp)");
+ uint8 *v0 = bmp._v;
+ if (!v0)
+ return;
+
+ uint16 vsiz = (uint8 *)(bmp._b) - (uint8 *)(v0);
+ uint16 siz = vsiz + _h * sizeof(HideDesc);
+ uint8 *v1 = new uint8[siz];
+ assert(v1 != NULL);
+ memcpy(v1, v0, siz);
+ _b = (HideDesc *)((_v = v1) + vsiz);
+}
+
+Bitmap::~Bitmap() {
+ debugC(6, kCGEDebugBitmap, "Bitmap::~Bitmap()");
+
+ free(_m);
+ delete[] _v;
+}
+
+Bitmap &Bitmap::operator=(const Bitmap &bmp) {
+ debugC(1, kCGEDebugBitmap, "&Bitmap::operator =");
+
+ uint8 *v0 = bmp._v;
+ _w = bmp._w;
+ _h = bmp._h;
+ _m = NULL;
+ _map = 0;
+ delete[] _v;
+
+ if (v0 == NULL) {
+ _v = NULL;
+ } else {
+ uint16 vsiz = (uint8 *)bmp._b - (uint8 *)v0;
+ uint16 siz = vsiz + _h * sizeof(HideDesc);
+ uint8 *v1 = (uint8 *)malloc(sizeof(uint8) * siz);
+ assert(v1 != NULL);
+ memcpy(v1, v0, siz);
+ _b = (HideDesc *)((_v = v1) + vsiz);
+ }
+ return *this;
+}
+
+char *Bitmap::forceExt(char *buf, const char *name, const char *ext) {
+ strcpy(buf, name);
+ char *dot = strrchr(buf, '.');
+ if (dot)
+ *dot = '\0';
+ strcat(buf, ext);
+
+ return buf;
+}
+
+uint16 Bitmap::moveVmap(uint8 *buf) {
+ debugC(1, kCGEDebugBitmap, "Bitmap::moveVmap(buf)");
+
+ if (!_v)
+ return 0;
+
+ uint16 vsiz = (uint8 *)_b - (uint8 *)_v;
+ uint16 siz = vsiz + _h * sizeof(HideDesc);
+ memcpy(buf, _v, siz);
+ delete[] _v;
+ _b = (HideDesc *)((_v = buf) + vsiz);
+ return siz;
+}
+
+BitmapPtr Bitmap::code() {
+ debugC(1, kCGEDebugBitmap, "Bitmap::code()");
+
+ if (!_m)
+ return false;
+
+ uint16 cnt;
+
+ if (_v) { // old X-map exists, so remove it
+ delete[] _v;
+ _v = NULL;
+ }
+
+ while (true) { // at most 2 times: for (V == NULL) & for allocated block;
+ uint8 *im = _v + 2;
+ uint16 *cp = (uint16 *) _v;
+ int bpl;
+
+ if (_v) { // 2nd pass - fill the hide table
+ for (uint16 i = 0; i < _h; i++) {
+ _b[i]._skip = 0xFFFF;
+ _b[i]._hide = 0x0000;
+ }
+ }
+ for (bpl = 0; bpl < 4; bpl++) { // once per each bitplane
+ uint8 *bm = _m;
+ bool skip = (bm[bpl] == kPixelTransp);
+ uint16 j;
+
+ cnt = 0;
+ for (uint16 i = 0; i < _h; i++) { // once per each line
+ uint8 pix;
+ for (j = bpl; j < _w; j += 4) {
+ pix = bm[j];
+ if (_v && pix != kPixelTransp) {
+ if (j < _b[i]._skip)
+ _b[i]._skip = j;
+
+ if (j >= _b[i]._hide)
+ _b[i]._hide = j + 1;
+ }
+ if ((pix == kPixelTransp) != skip || cnt >= 0x3FF0) { // end of block
+ cnt |= (skip) ? kBmpSKP : kBmpCPY;
+ if (_v)
+ *cp = TO_LE_16(cnt); // store block description uint16
+
+ cp = (uint16 *) im;
+ im += 2;
+ skip = (pix == kPixelTransp);
+ cnt = 0;
+ }
+ if (!skip) {
+ if (_v)
+ *im = pix;
+ im++;
+ }
+ cnt++;
+ }
+
+ bm += _w;
+ if (_w < kScrWidth) {
+ if (skip) {
+ cnt += (kScrWidth - j + 3) / 4;
+ } else {
+ cnt |= kBmpCPY;
+ if (_v)
+ *cp = TO_LE_16(cnt);
+
+ cp = (uint16 *) im;
+ im += 2;
+ skip = true;
+ cnt = (kScrWidth - j + 3) / 4;
+ }
+ }
+ }
+ if (cnt && ! skip) {
+ cnt |= kBmpCPY;
+ if (_v)
+ *cp = TO_LE_16(cnt);
+
+ cp = (uint16 *) im;
+ im += 2;
+ }
+ if (_v)
+ *cp = TO_LE_16(kBmpEOI);
+ cp = (uint16 *) im;
+ im += 2;
+ }
+ if (_v)
+ break;
+
+ uint16 sizV = (uint16)(im - 2 - _v);
+ _v = new uint8[sizV + _h * sizeof(*_b)];
+ assert(_v != NULL);
+
+ _b = (HideDesc *)(_v + sizV);
+ }
+ cnt = 0;
+ for (uint16 i = 0; i < _h; i++) {
+ if (_b[i]._skip == 0xFFFF) { // whole line is skipped
+ _b[i]._skip = (cnt + kScrWidth) >> 2;
+ cnt = 0;
+ } else {
+ uint16 s = _b[i]._skip & ~3;
+ uint16 h = (_b[i]._hide + 3) & ~3;
+ _b[i]._skip = (cnt + s) >> 2;
+ _b[i]._hide = (h - s) >> 2;
+ cnt = kScrWidth - h;
+ }
+ }
+
+ return this;
+}
+
+bool Bitmap::solidAt(int16 x, int16 y) {
+ debugC(6, kCGEDebugBitmap, "Bitmap::solidAt(%d, %d)", x, y);
+
+ if ((x >= _w) || (y >= _h))
+ return false;
+
+ uint8 *m = _v;
+ uint16 r = static_cast<uint16>(x) % 4;
+ uint16 n0 = (kScrWidth * y + x) / 4;
+ uint16 n = 0;
+
+ while (r) {
+ uint16 w, t;
+
+ w = READ_LE_UINT16(m);
+ m += 2;
+ t = w & 0xC000;
+ w &= 0x3FFF;
+
+ switch (t) {
+ case kBmpEOI:
+ r--;
+ case kBmpSKP:
+ w = 0;
+ break;
+ case kBmpREP:
+ w = 1;
+ break;
+ }
+ m += w;
+ }
+
+ while (true) {
+ uint16 w, t;
+
+ w = READ_LE_UINT16(m);
+ m += 2;
+ t = w & 0xC000;
+ w &= 0x3FFF;
+
+ if (n > n0)
+ return false;
+
+ n += w;
+ switch (t) {
+ case kBmpEOI:
+ return false;
+ case kBmpSKP:
+ w = 0;
+ break;
+ case kBmpREP:
+ case kBmpCPY:
+ if (n - w <= n0 && n > n0)
+ return true;
+ break;
+ }
+ m += ((t == kBmpREP) ? 1 : w);
+ }
+}
+
+bool Bitmap::loadVBM(EncryptedStream *f) {
+ debugC(5, kCGEDebugBitmap, "Bitmap::loadVBM(f)");
+
+ uint16 p = 0, n = 0;
+ if (!f->err())
+ f->read((uint8 *)&p, sizeof(p));
+ p = FROM_LE_16(p);
+
+ if (!f->err())
+ f->read((uint8 *)&n, sizeof(n));
+ n = FROM_LE_16(n);
+
+ if (!f->err())
+ f->read((uint8 *)&_w, sizeof(_w));
+ _w = FROM_LE_16(_w);
+
+ if (!f->err())
+ f->read((uint8 *)&_h, sizeof(_h));
+ _h = FROM_LE_16(_h);
+
+ if (!f->err()) {
+ if (p) {
+ if (_vm->_bitmapPalette) {
+ // Read in the palette
+ byte palData[kPalSize];
+ f->read(palData, kPalSize);
+
+ const byte *srcP = palData;
+ for (int idx = 0; idx < kPalCount; idx++, srcP += 3) {
+ _vm->_bitmapPalette[idx]._r = *srcP;
+ _vm->_bitmapPalette[idx]._g = *(srcP + 1);
+ _vm->_bitmapPalette[idx]._b = *(srcP + 2);
+ }
+ } else
+ f->seek(f->pos() + kPalSize);
+ }
+ }
+ if ((_v = new uint8[n]) == NULL)
+ return false;
+
+ if (!f->err())
+ f->read(_v, n);
+
+ _b = (HideDesc *)(_v + n - _h * sizeof(HideDesc));
+ return (!f->err());
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/bitmap.h b/engines/cge/bitmap.h
new file mode 100644
index 0000000000..aa6282705c
--- /dev/null
+++ b/engines/cge/bitmap.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.
+ *
+ */
+
+/*
+ * This code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_BITMAP_H
+#define CGE_BITMAP_H
+
+#include "cge/general.h"
+#include "common/file.h"
+
+namespace CGE {
+
+class CGEEngine;
+class EncryptedStream;
+
+#define kMaxPath 128
+enum {
+ kBmpEOI = 0x0000,
+ kBmpSKP = 0x4000,
+ kBmpREP = 0x8000,
+ kBmpCPY = 0xC000
+};
+
+#include "common/pack-start.h"
+
+struct HideDesc {
+ uint16 _skip;
+ uint16 _hide;
+};
+
+#include "common/pack-end.h"
+
+class Bitmap {
+ CGEEngine *_vm;
+ char *forceExt(char *buf, const char *name, const char *ext);
+ bool loadVBM(EncryptedStream *f);
+public:
+ uint16 _w;
+ uint16 _h;
+ uint8 *_m;
+ uint8 *_v;
+ int32 _map;
+ HideDesc *_b;
+
+ Bitmap(CGEEngine *vm, const char *fname);
+ Bitmap(CGEEngine *vm, uint16 w, uint16 h, uint8 *map);
+ Bitmap(CGEEngine *vm, uint16 w, uint16 h, uint8 fill);
+ Bitmap(CGEEngine *vm, const Bitmap &bmp);
+ ~Bitmap();
+
+ Bitmap *code();
+ Bitmap &operator=(const Bitmap &bmp);
+ void hide(int16 x, int16 y);
+ void show(int16 x, int16 y);
+ void xShow(int16 x, int16 y);
+ bool solidAt(int16 x, int16 y);
+ uint16 moveVmap(uint8 *buf);
+};
+
+
+typedef Bitmap *BitmapPtr;
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp
new file mode 100644
index 0000000000..4ed2932cd9
--- /dev/null
+++ b/engines/cge/cge.cpp
@@ -0,0 +1,220 @@
+/* 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.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "common/debug.h"
+#include "common/debug-channels.h"
+#include "common/error.h"
+#include "common/EventRecorder.h"
+#include "common/file.h"
+#include "common/fs.h"
+#include "engines/util.h"
+#include "cge/cge.h"
+#include "cge/vga13h.h"
+#include "cge/cge_main.h"
+#include "cge/talk.h"
+#include "cge/text.h"
+#include "cge/walk.h"
+
+namespace CGE {
+
+const int CGEEngine::_maxSceneArr[5] = {1, 8, 16, 23, 24};
+
+CGEEngine::CGEEngine(OSystem *syst, const ADGameDescription *gameDescription)
+ : Engine(syst), _gameDescription(gameDescription), _randomSource("cge") {
+
+ // Debug/console setup
+ DebugMan.addDebugChannel(kCGEDebugBitmap, "bitmap", "CGE Bitmap debug channel");
+ DebugMan.addDebugChannel(kCGEDebugFile, "file", "CGE IO debug channel");
+ DebugMan.addDebugChannel(kCGEDebugEngine, "engine", "CGE Engine debug channel");
+
+ _startupMode = 1;
+ _demoText = kDemo;
+ _oldLev = 0;
+ _pocPtr = 0;
+ _bitmapPalette = NULL;
+
+
+
+}
+
+void CGEEngine::initSceneValues() {
+ for (int i = 0; i < kSceneMax; i++) {
+ _heroXY[i].x = 0;
+ _heroXY[i].y = 0;
+ }
+
+ for (int i = 0; i < kSceneMax + 1; i++) {
+ _barriers[i]._horz = 0xFF;
+ _barriers[i]._vert = 0xFF;
+ }
+}
+
+void CGEEngine::init() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::setup()");
+
+ // Initialise fields
+ _lastFrame = 0;
+ _lastTick = 0;
+ _hero = NULL;
+ _shadow = NULL;
+ _miniScene = NULL;
+ _miniShp = NULL;
+ _miniShpList = NULL;
+ _sprite = NULL;
+ _resman = new ResourceManager();
+
+ // Create debugger console
+ _console = new CGEConsole(this);
+
+ // Initialise engine objects
+ _font = new Font(this, "CGE");
+ _text = new Text(this, "CGE");
+ _talk = NULL;
+ _vga = new Vga();
+ _sys = new System(this);
+ _pocLight = new PocLight(this);
+ for (int i = 0; i < kPocketNX; i++)
+ _pocket[i] = NULL;
+ _horzLine = new HorizLine(this);
+ _infoLine = new InfoLine(this, kInfoW);
+ _sceneLight = new SceneLight(this);
+ _debugLine = new InfoLine(this, kScrWidth);
+ _commandHandler = new CommandHandler(this, false);
+ _commandHandlerTurbo = new CommandHandler(this, true);
+ _midiPlayer = new MusicPlayer(this);
+ _mouse = new Mouse(this);
+ _keyboard = new Keyboard(this);
+ _eventManager = new EventManager(this);
+ _fx = new Fx(this, 16); // must precede SOUND!!
+ _sound = new Sound(this);
+
+ _offUseCount = atoi(_text->getText(kOffUseCount));
+ _music = true;
+
+ for (int i = 0; i < kPocketNX; i++)
+ _pocref[i] = -1;
+ _volume[0] = 0;
+ _volume[1] = 0;
+
+ initSceneValues();
+
+ _maxScene = 0;
+ _dark = false;
+ _game = false;
+ _finis = false;
+ _now = 1;
+ _lev = -1;
+ _recentStep = -2;
+
+ for (int i = 0; i < 4; i++)
+ _flag[i] = false;
+
+ _mode = 0;
+ _soundOk = 1;
+ _sprTv = NULL;
+ _gameCase2Cpt = 0;
+ _offUseCount = 0;
+
+ _startGameSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1;
+}
+
+void CGEEngine::deinit() {
+ // Remove all of our debug levels here
+ DebugMan.clearAllDebugChannels();
+
+ delete _console;
+ _midiPlayer->killMidi();
+
+ // Delete engine objects
+ delete _vga;
+ delete _sys;
+ delete _sprite;
+ delete _miniScene;
+ delete _shadow;
+ delete _horzLine;
+ delete _infoLine;
+ delete _sceneLight;
+ delete _debugLine;
+ delete _text;
+ delete _pocLight;
+ delete _keyboard;
+ delete _mouse;
+ delete _eventManager;
+ delete _fx;
+ delete _sound;
+ delete _font;
+ delete _commandHandler;
+ delete _commandHandlerTurbo;
+ delete _hero;
+ delete _resman;
+
+ if (_miniShpList) {
+ for (int i = 0; _miniShpList[i]; ++i)
+ delete _miniShpList[i];
+ delete[] _miniShpList;
+ }
+}
+
+CGEEngine::~CGEEngine() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::~CGEEngine()");
+}
+
+Common::Error CGEEngine::run() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::run()");
+
+ if (_gameDescription->flags & ADGF_DEMO) {
+ warning("Demos of Soltys are not supported.\nPlease get a free version on ScummVM download page");
+ return Common::kUnsupportedGameidError;
+ }
+
+ // Initialize graphics using following:
+ initGraphics(320, 200, false);
+
+ // Setup necessary game objects
+ init();
+ // Run the game
+ cge_main();
+
+ // Remove game objects
+ deinit();
+
+ return Common::kNoError;
+}
+
+bool CGEEngine::hasFeature(EngineFeature f) const {
+ return
+ (f == kSupportsRTL) ||
+ (f == kSupportsLoadingDuringRuntime) ||
+ (f == kSupportsSavingDuringRuntime);
+}
+
+bool CGEEngine::canLoadGameStateCurrently() {
+ return (_startupMode == 0) && _mouse->_active;
+}
+
+bool CGEEngine::canSaveGameStateCurrently() {
+ return (_startupMode == 0) && _mouse->_active;
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/cge.h b/engines/cge/cge.h
new file mode 100644
index 0000000000..2ce154a4fb
--- /dev/null
+++ b/engines/cge/cge.h
@@ -0,0 +1,339 @@
+/* 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 CGE_H
+#define CGE_H
+
+#include "common/random.h"
+#include "common/savefile.h"
+#include "common/serializer.h"
+#include "common/str.h"
+#include "common/rect.h"
+#include "engines/engine.h"
+#include "gui/debugger.h"
+#include "graphics/surface.h"
+#include "engines/advancedDetector.h"
+#include "cge/console.h"
+#include "cge/bitmap.h"
+#include "cge/sound.h"
+
+namespace CGE {
+
+class Console;
+class Sprite;
+class Cluster;
+class Vga;
+class System;
+class Keyboard;
+class Mouse;
+class HorizLine;
+class InfoLine;
+class SceneLight;
+class CommandHandler;
+class EventManager;
+class ResourceManager;
+class Walk;
+class Text;
+class Talk;
+
+#define kSavegameVersion 2
+#define kSavegameStrSize 11
+#define kPocketX 174
+#define kPocketY 176
+#define kPocketDX 18
+#define kPocketDY 22
+#define kPocketNX 8
+#define kPocketNY 1
+#define kPocketSX 8
+#define kPocketSY 3
+#define kSceneDx 9
+#define kSceneDy 10
+#define kSceneNx 8
+#define kSceneNy 3
+#define kSceneMax kSceneNx * kSceneNy
+#define kPathMax 128
+#define kCryptSeed 0xA5
+#define kMaxFile 128
+#define kMapXCnt 40
+#define kMapZCnt 20
+
+// our engine debug channels
+enum {
+ kCGEDebugBitmap = 1 << 0,
+ kCGEDebugFile = 1 << 1,
+ kCGEDebugEngine = 1 << 2
+};
+
+enum SnList {
+ kNear, kTake
+};
+
+enum CallbackType {
+ kNullCB = 0, kQGame, kMiniStep, kXScene, kSoundSetVolume
+};
+
+struct SavegameHeader {
+ uint8 version;
+ Common::String saveName;
+ Graphics::Surface *thumbnail;
+ int saveYear, saveMonth, saveDay;
+ int saveHour, saveMinutes;
+ int totalFrames;
+};
+
+extern const char *savegameStr;
+
+struct Bar {
+ uint8 _horz;
+ uint8 _vert;
+};
+
+class Font {
+ char _path[kPathMax];
+ void load();
+ CGEEngine *_vm;
+public:
+ uint8 *_widthArr;
+ uint16 *_pos;
+ uint8 *_map;
+ Font(CGEEngine *vm, const char *name);
+ ~Font();
+ uint16 width(const char *text);
+ void save();
+};
+
+class CGEEngine : public Engine {
+private:
+ uint32 _lastFrame, _lastTick;
+ void tick();
+ void syncHeader(Common::Serializer &s);
+ void writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header);
+ void syncGame(Common::SeekableReadStream *readStream, Common::WriteStream *writeStream, bool tiny);
+ bool savegameExists(int slotNumber);
+ Common::String generateSaveName(int slot);
+public:
+ CGEEngine(OSystem *syst, const ADGameDescription *gameDescription);
+ ~CGEEngine();
+ virtual bool hasFeature(EngineFeature f) const;
+ virtual bool canLoadGameStateCurrently();
+ virtual bool canSaveGameStateCurrently();
+ virtual Common::Error loadGameState(int slot);
+ virtual Common::Error saveGameState(int slot, const Common::String &desc);
+
+ static const int _maxSceneArr[5];
+
+ const ADGameDescription *_gameDescription;
+ int _startupMode;
+ int _demoText;
+ int _oldLev;
+ int _pocPtr;
+ bool _music;
+ int _pocref[kPocketNX];
+ uint8 _volume[2];
+ int _maxScene;
+ bool _flag[4];
+ bool _dark;
+ bool _game;
+ bool _finis;
+ int _now;
+ int _lev;
+ int _mode;
+ int _soundOk;
+ int _gameCase2Cpt;
+ int _offUseCount;
+ Dac *_bitmapPalette;
+ uint8 _clusterMap[kMapZCnt][kMapXCnt];
+
+ Sprite *_sprTv;
+ Sprite *_sprK1;
+ Sprite *_sprK2;
+ Sprite *_sprK3;
+
+ Common::Point _heroXY[kSceneMax];
+ Bar _barriers[kSceneMax + 1];
+ Font *_font;
+ Vga *_vga;
+ System *_sys;
+ Sprite *_pocLight;
+ Keyboard *_keyboard;
+ Mouse *_mouse;
+ Sprite *_sprite;
+ Sprite *_miniScene;
+ Sprite *_shadow;
+ HorizLine *_horzLine;
+ InfoLine *_infoLine;
+ InfoLine *_debugLine;
+ SceneLight *_sceneLight;
+ CommandHandler *_commandHandler;
+ CommandHandler *_commandHandlerTurbo;
+ EventManager *_eventManager;
+ Fx *_fx;
+ Sound *_sound;
+ ResourceManager *_resman;
+ Sprite *_pocket[kPocketNX];
+ Walk *_hero;
+ Text *_text;
+ Talk *_talk;
+
+
+ Common::RandomSource _randomSource;
+ MusicPlayer *_midiPlayer;
+ BitmapPtr *_miniShp;
+ BitmapPtr *_miniShpList;
+ int _startGameSlot;
+
+ virtual Common::Error run();
+ GUI::Debugger *getDebugger() {
+ return _console;
+ }
+
+ void cge_main();
+ void switchScene(int newScene);
+ void startCountDown();
+ void quit();
+ void resetQSwitch();
+ void optionTouch(int opt, uint16 mask);
+ void resetGame();
+ bool loadGame(int slotNumber, SavegameHeader *header = NULL, bool tiny = false);
+ void setMapBrick(int x, int z);
+ void switchMapping();
+ void loadSprite(const char *fname, int ref, int scene, int col, int row, int pos);
+ void loadScript(const char *fname);
+ void loadUser();
+ void runGame();
+ bool showTitle(const char *name);
+ void movie(const char *ext);
+ void inf(const char *text);
+ void selectSound();
+ void dummy() {}
+ void NONE();
+ void SB();
+ void sceneDown();
+ void sceneUp();
+ void xScene();
+ void qGame();
+ void SBM();
+ void GUS();
+ void GUSM();
+ void MIDI();
+ void AUTO();
+ void setPortD();
+ void setPortM();
+ void setIRQ();
+ void setDMA();
+ void mainLoop();
+ void handleFrame();
+ void saveGame(int slotNumber, const Common::String &desc);
+ static bool readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header);
+ void switchMusic();
+ void selectPocket(int n);
+ void expandSprite(Sprite *spr);
+ void contractSprite(Sprite *spr);
+ int findPocket(Sprite *spr);
+ void feedSnail(Sprite *spr, SnList snq);
+ void pocFul();
+ void hide1(Sprite *spr);
+ void loadMapping();
+ void heroCover(int cvr);
+ void trouble(int seq, int text);
+ void offUse();
+ void tooFar();
+ void loadHeroXY();
+ void keyClick();
+ void switchColorMode();
+ void killSprite();
+ void switchDebug();
+ void miniStep(int stp);
+ void postMiniStep(int stp);
+ void showBak(int ref);
+ void initSceneValues();
+ char *mergeExt(char *buf, const char *name, const char *ext);
+ int takeEnum(const char **tab, const char *text);
+ int newRandom(int range);
+ void sndSetVolume();
+ Sprite *locate(int ref);
+ Sprite *spriteAt(int x, int y);
+ Cluster XZ(int16 x, int16 y);
+ void killText();
+
+ void snBackPt(Sprite *spr, int stp);
+ void snHBarrier(const int scene, const int barX);
+ void snVBarrier(const int scene, const int barY);
+ void snCover(Sprite *spr, int xref);
+ void snFlag(int indx, bool v);
+ void snFlash(bool on);
+ void snGame(Sprite *spr, int num);
+ void snGhost(Bitmap *bmp);
+ void snGive(Sprite *spr, int stp);
+ void snHide(Sprite *spr, int val);
+ void snKeep(Sprite *spr, int stp);
+ void snKill(Sprite *spr);
+ void snLevel(Sprite *spr, int lev);
+ void snLight(bool in);
+ void snMouse(bool on);
+ void snNNext(Sprite *spr, int p);
+ void snPort(Sprite *spr, int port);
+ void snReach(Sprite *spr, int mode);
+ void snRelZ(Sprite *spr, int z);
+ void snRNNext(Sprite *spr, int p);
+ void snRTNext(Sprite *spr, int p);
+ void snSend(Sprite *spr, int val);
+ void snRelX(Sprite *spr, int x);
+ void snRelY(Sprite *spr, int y);
+ void snRmNear(Sprite *spr);
+ void snRmTake(Sprite *spr);
+ void snRSeq(Sprite *spr, int val);
+ void snSeq(Sprite *spr, int val);
+ void snSetRef(Sprite *spr, int nr);
+ void snSetX(Sprite *spr, int x);
+ void snSetX0(int scene, int x0);
+ void snSetXY(Sprite *spr, uint16 xy);
+ void snSetY(Sprite *spr, int y);
+ void snSetY0(int scene, int y0);
+ void snSetZ(Sprite *spr, int z);
+ void snSlave(Sprite *spr, int ref);
+ void snSound(Sprite *spr, int wav);
+ void snSwap(Sprite *spr, int xref);
+ void snTNext(Sprite *spr, int p);
+ void snTrans(Sprite *spr, int trans);
+ void snUncover(Sprite *spr, Sprite *xspr);
+ void snWalk(Sprite *spr, int x, int y);
+ void snZTrim(Sprite *spr);
+protected:
+ int _recentStep;
+
+private:
+ CGEConsole *_console;
+ void init();
+ void deinit();
+};
+
+// Example console class
+class Console : public GUI::Debugger {
+public:
+ Console(CGEEngine *vm) {}
+ virtual ~Console() {}
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp
new file mode 100644
index 0000000000..1c2759bd97
--- /dev/null
+++ b/engines/cge/cge_main.cpp
@@ -0,0 +1,1579 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "common/scummsys.h"
+#include "common/endian.h"
+#include "common/memstream.h"
+#include "common/savefile.h"
+#include "common/serializer.h"
+#include "common/str.h"
+#include "graphics/palette.h"
+#include "graphics/scaler.h"
+#include "graphics/thumbnail.h"
+#include "cge/vga13h.h"
+#include "cge/cge.h"
+#include "cge/cge_main.h"
+#include "cge/general.h"
+#include "cge/sound.h"
+#include "cge/snail.h"
+#include "cge/text.h"
+#include "cge/game.h"
+#include "cge/events.h"
+#include "cge/talk.h"
+#include "cge/vmenu.h"
+#include "cge/walk.h"
+#include "cge/sound.h"
+
+namespace CGE {
+
+const char *savegameStr = "SCUMMVM_CGE";
+
+//--------------------------------------------------------------------------
+
+const Dac g_stdPal[] = {// R G B
+ { 0, 60, 0}, // 198
+ { 0, 104, 0}, // 199
+ { 20, 172, 0}, // 200
+ { 82, 82, 0}, // 201
+ { 0, 132, 82}, // 202
+ { 132, 173, 82}, // 203
+ { 82, 0, 0}, // 204
+ { 206, 0, 24}, // 205
+ { 255, 33, 33}, // 206
+ { 123, 41, 0}, // 207
+ { 0, 41, 0}, // 208
+ { 0, 0, 82}, // 209
+ { 132, 0, 0}, // 210
+ { 255, 0, 0}, // 211
+ { 255, 66, 66}, // 212
+ { 148, 66, 16}, // 213
+ { 0, 82, 0}, // 214
+ { 0, 0, 132}, // 215
+ { 173, 0, 0}, // 216
+ { 255, 49, 0}, // 217
+ { 255, 99, 99}, // 218
+ { 181, 107, 49}, // 219
+ { 0, 132, 0}, // 220
+ { 0, 0, 255}, // 221
+ { 173, 41, 0}, // 222
+ { 255, 82, 0}, // 223
+ { 255, 132, 132}, // 224
+ { 214, 148, 74}, // 225
+ { 41, 214, 0}, // 226
+ { 0, 82, 173}, // 227
+ { 255, 214, 0}, // 228
+ { 247, 132, 49}, // 229
+ { 255, 165, 165}, // 230
+ { 239, 198, 123}, // 231
+ { 173, 214, 0}, // 232
+ { 0, 132, 214}, // 233
+ { 57, 57, 57}, // 234
+ { 247, 189, 74}, // 235
+ { 255, 198, 198}, // 236
+ { 255, 239, 173}, // 237
+ { 214, 255, 173}, // 238
+ { 82, 173, 255}, // 239
+ { 107, 107, 107}, // 240
+ { 247, 222, 99}, // 241
+ { 255, 0, 255}, // 242
+ { 255, 132, 255}, // 243
+ { 132, 132, 173}, // 244
+ { 148, 247, 255}, // 245
+ { 148, 148, 148}, // 246
+ { 82, 0, 82}, // 247
+ { 112, 68, 112}, // 248
+ { 176, 88, 144}, // 249
+ { 214, 132, 173}, // 250
+ { 206, 247, 255}, // 251
+ { 198, 198, 198}, // 252
+ { 0, 214, 255}, // 253
+ { 96, 224, 96 }, // 254
+ { 255, 255, 255}, // 255
+};
+
+char *CGEEngine::mergeExt(char *buf, const char *name, const char *ext) {
+ strcpy(buf, name);
+ char *dot = strrchr(buf, '.');
+ if (!dot)
+ strcat(buf, ext);
+
+ return buf;
+}
+
+int CGEEngine::takeEnum(const char **tab, const char *text) {
+ const char **e;
+ if (text) {
+ for (e = tab; *e; e++) {
+ if (scumm_stricmp(text, *e) == 0) {
+ return e - tab;
+ }
+ }
+ }
+ return -1;
+}
+
+int CGEEngine::newRandom(int range) {
+ if (!range)
+ return 0;
+
+ return _randomSource.getRandomNumber(range - 1);
+}
+
+void CGEEngine::sndSetVolume() {
+ // USeless for ScummVM
+}
+
+void CGEEngine::syncHeader(Common::Serializer &s) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::syncHeader(s)");
+
+ int i;
+
+ s.syncAsUint16LE(_now);
+ s.syncAsUint16LE(_oldLev);
+ s.syncAsUint16LE(_demoText);
+ for (i = 0; i < 5; i++)
+ s.syncAsUint16LE(_game);
+ s.syncAsSint16LE(i); // unused VGA::Mono variable
+ s.syncAsUint16LE(_music);
+ s.syncBytes(_volume, 2);
+ for (i = 0; i < 4; i++)
+ s.syncAsUint16LE(_flag[i]);
+
+ if (s.isLoading()) {
+ // Reset scene values
+ initSceneValues();
+ }
+
+ for (i = 0; i < kSceneMax; i++) {
+ s.syncAsSint16LE(_heroXY[i].x);
+ s.syncAsUint16LE(_heroXY[i].y);
+ }
+ for (i = 0; i < 1 + kSceneMax; i++) {
+ s.syncAsByte(_barriers[i]._horz);
+ s.syncAsByte(_barriers[i]._vert);
+ }
+ for (i = 0; i < kPocketNX; i++)
+ s.syncAsUint16LE(_pocref[i]);
+
+ if (s.isSaving()) {
+ // Write checksum
+ int checksum = kSavegameCheckSum;
+ s.syncAsUint16LE(checksum);
+ } else {
+ // Read checksum and validate it
+ uint16 checksum;
+ s.syncAsUint16LE(checksum);
+ if (checksum != kSavegameCheckSum)
+ error("%s", _text->getText(kBadSVG));
+ }
+}
+
+bool CGEEngine::loadGame(int slotNumber, SavegameHeader *header, bool tiny) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::loadgame(%d, header, %s)", slotNumber, tiny ? "true" : "false");
+
+ Common::MemoryReadStream *readStream;
+ SavegameHeader saveHeader;
+
+ if (slotNumber == -1) {
+ // Loading the data for the initial game state
+ kSavegame0File file = kSavegame0File(this, kSavegame0Name);
+ int size = file.size();
+ byte *dataBuffer = (byte *)malloc(size);
+ file.read(dataBuffer, size);
+ readStream = new Common::MemoryReadStream(dataBuffer, size, DisposeAfterUse::YES);
+
+ } else {
+ // Open up the savgame file
+ Common::String slotName = generateSaveName(slotNumber);
+ Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName);
+
+ // Read the data into a data buffer
+ int size = saveFile->size();
+ byte *dataBuffer = (byte *)malloc(size);
+ saveFile->read(dataBuffer, size);
+ readStream = new Common::MemoryReadStream(dataBuffer, size, DisposeAfterUse::YES);
+ }
+
+ // Check to see if it's a ScummVM savegame or not
+ char buffer[kSavegameStrSize + 1];
+ readStream->read(buffer, kSavegameStrSize + 1);
+
+ if (strncmp(buffer, savegameStr, kSavegameStrSize + 1) != 0) {
+ // It's not, so rewind back to the start
+ readStream->seek(0);
+
+ if (header)
+ // Header wanted where none exists, so return false
+ return false;
+ } else {
+ // Found header
+ if (!readSavegameHeader(readStream, saveHeader)) {
+ delete readStream;
+ return false;
+ }
+
+ if (header) {
+ *header = saveHeader;
+ delete readStream;
+ return true;
+ }
+
+ // Delete the thumbnail
+ saveHeader.thumbnail->free();
+ delete saveHeader.thumbnail;
+ }
+
+ // Get in the savegame
+ syncGame(readStream, NULL, tiny);
+
+ delete readStream;
+ return true;
+}
+
+/**
+ * Returns true if a given savegame exists
+ */
+bool CGEEngine::savegameExists(int slotNumber) {
+ Common::String slotName = generateSaveName(slotNumber);
+
+ Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName);
+ bool result = saveFile != NULL;
+ delete saveFile;
+ return result;
+}
+
+/**
+ * Support method that generates a savegame name
+ * @param slot Slot number
+ */
+Common::String CGEEngine::generateSaveName(int slot) {
+ return Common::String::format("%s.%03d", _targetName.c_str(), slot);
+}
+
+Common::Error CGEEngine::loadGameState(int slot) {
+ // Clear current game activity
+ sceneDown();
+ resetGame();
+
+ // Load the game
+ loadGame(slot, NULL);
+ _commandHandler->addCommand(kCmdLevel, -1, _oldLev, &_sceneLight);
+ _sceneLight->gotoxy(kSceneX + ((_now - 1) % kSceneNx) * kSceneDx + kSceneSX,
+ kSceneY + ((_now - 1) / kSceneNx) * kSceneDy + kSceneSY);
+ sceneUp();
+
+ return Common::kNoError;
+}
+
+void CGEEngine::resetGame() {
+ _vga->_spareQ->clear();
+}
+
+Common::Error CGEEngine::saveGameState(int slot, const Common::String &desc) {
+ sceneDown();
+ _oldLev = _lev;
+
+ // Write out the user's progress
+ saveGame(slot, desc);
+
+ // Reload the scene
+ sceneUp();
+
+ return Common::kNoError;
+}
+
+void CGEEngine::saveGame(int slotNumber, const Common::String &desc) {
+ // Set up the serializer
+ Common::String slotName = generateSaveName(slotNumber);
+ Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(slotName);
+
+ // Write out the ScummVM savegame header
+ SavegameHeader header;
+ header.saveName = desc;
+ header.version = kSavegameVersion;
+ writeSavegameHeader(saveFile, header);
+
+ // Write out the data of the savegame
+ syncGame(NULL, saveFile, false);
+
+ // Finish writing out game data
+ saveFile->finalize();
+ delete saveFile;
+}
+
+void CGEEngine::writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header) {
+ // Write out a savegame header
+ out->write(savegameStr, kSavegameStrSize + 1);
+
+ out->writeByte(kSavegameVersion);
+
+ // Write savegame name
+ out->write(header.saveName.c_str(), header.saveName.size() + 1);
+
+ // Get the active palette
+ uint8 thumbPalette[256 * 3];
+ g_system->getPaletteManager()->grabPalette(thumbPalette, 0, 256);
+
+ // Create a thumbnail and save it
+ Graphics::Surface *thumb = new Graphics::Surface();
+ Graphics::Surface *s = _vga->_page[0];
+ ::createThumbnail(thumb, (const byte *)s->pixels, kScrWidth, kScrHeight, thumbPalette);
+ Graphics::saveThumbnail(*out, *thumb);
+ thumb->free();
+ delete thumb;
+
+ // Write out the save date/time
+ TimeDate td;
+ g_system->getTimeAndDate(td);
+ out->writeSint16LE(td.tm_year + 1900);
+ out->writeSint16LE(td.tm_mon + 1);
+ out->writeSint16LE(td.tm_mday);
+ out->writeSint16LE(td.tm_hour);
+ out->writeSint16LE(td.tm_min);
+}
+
+void CGEEngine::syncGame(Common::SeekableReadStream *readStream, Common::WriteStream *writeStream, bool tiny) {
+ Common::Serializer s(readStream, writeStream);
+
+ if (s.isSaving()) {
+ for (int i = 0; i < kPocketNX; i++) {
+ register Sprite *pocSpr = _pocket[i];
+ _pocref[i] = (pocSpr) ? pocSpr->_ref : -1;
+ }
+
+ // Skip Digital and Midi volumes, useless under ScummVM
+ _volume[0] = 0;
+ _volume[1] = 0;
+ }
+
+ // Synchronise header data
+ syncHeader(s);
+
+ if (s.isSaving()) {
+ // Loop through saving the sprite data
+ for (Sprite *spr = _vga->_spareQ->first(); spr; spr = spr->_next) {
+ if (!s.err())
+ spr->sync(s);
+ }
+ } else {
+ // Loading game
+ if (_soundOk == 1 && _mode == 0) {
+ // Skip Digital and Midi volumes, useless under ScummVM
+ sndSetVolume();
+ }
+
+ if (!tiny) { // load sprites & pocket
+ while (readStream->pos() < readStream->size()) {
+ Sprite S(this, NULL);
+ S.sync(s);
+
+ S._prev = S._next = NULL;
+ Sprite *spr = (scumm_stricmp(S._file + 2, "MUCHA") == 0) ? new Fly(this, NULL)
+ : new Sprite(this, NULL);
+ assert(spr != NULL);
+ *spr = S;
+ _vga->_spareQ->append(spr);
+ }
+
+ for (int i = 0; i < kPocketNX; i++) {
+ register int r = _pocref[i];
+ _pocket[i] = (r < 0) ? NULL : _vga->_spareQ->locate(r);
+ }
+ }
+ }
+}
+
+bool CGEEngine::readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header) {
+ header.thumbnail = NULL;
+
+ // Get the savegame version
+ header.version = in->readByte();
+ if (header.version > kSavegameVersion)
+ return false;
+
+ // Read in the string
+ header.saveName.clear();
+ char ch;
+ while ((ch = (char)in->readByte()) != '\0')
+ header.saveName += ch;
+
+ // Get the thumbnail
+ header.thumbnail = Graphics::loadThumbnail(*in);
+ if (!header.thumbnail) {
+ delete header.thumbnail;
+ header.thumbnail = NULL;
+ return false;
+ }
+
+ // Read in save date/time
+ header.saveYear = in->readSint16LE();
+ header.saveMonth = in->readSint16LE();
+ header.saveDay = in->readSint16LE();
+ header.saveHour = in->readSint16LE();
+ header.saveMinutes = in->readSint16LE();
+
+ return true;
+}
+
+void CGEEngine::heroCover(int cvr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::heroCover(%d)", cvr);
+
+ _commandHandler->addCommand(kCmdCover, 1, cvr, NULL);
+}
+
+void CGEEngine::trouble(int seq, int text) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::trouble(%d, %d)", seq, text);
+
+ _hero->park();
+ _commandHandler->addCommand(kCmdWait, -1, -1, _hero);
+ _commandHandler->addCommand(kCmdSeq, -1, seq, _hero);
+ _commandHandler->addCommand(kCmdSound, -1, 2, _hero);
+ _commandHandler->addCommand(kCmdWait, -1, -1, _hero);
+ _commandHandler->addCommand(kCmdSay, 1, text, _hero);
+}
+
+void CGEEngine::offUse() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::offUse()");
+
+ trouble(kSeqOffUse, kOffUse + newRandom(_offUseCount));
+}
+
+void CGEEngine::tooFar() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::tooFar()");
+
+ trouble(kSeqTooFar, kTooFar);
+}
+
+void CGEEngine::loadHeroXY() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::loadHeroXY()");
+
+ EncryptedStream cf(this, "CGE.HXY");
+ uint16 x, y;
+
+ memset(_heroXY, 0, sizeof(_heroXY));
+ if (!cf.err()) {
+ for (int i = 0; i < kSceneMax; ++i) {
+ cf.read((byte *)&x, 2);
+ cf.read((byte *)&y, 2);
+
+ _heroXY[i].x = (int16)FROM_LE_16(x);
+ _heroXY[i].y = (int16)FROM_LE_16(y);
+ }
+ }
+}
+
+void CGEEngine::loadMapping() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::loadMapping()");
+
+ if (_now <= kSceneMax) {
+ EncryptedStream cf(this, "CGE.TAB");
+ if (!cf.err()) {
+ // Move to the data for the given room
+ cf.seek((_now - 1) * kMapArrSize);
+
+ // Read in the data
+ for (int z = 0; z < kMapZCnt; ++z) {
+ cf.read(&_clusterMap[z][0], kMapXCnt);
+ }
+ }
+ }
+}
+
+Square::Square(CGEEngine *vm) : Sprite(vm, NULL), _vm(vm) {
+ _flags._kill = true;
+ _flags._bDel = false;
+
+ BitmapPtr *MB = new BitmapPtr[2];
+ MB[0] = new Bitmap(_vm, "BRICK");
+ MB[1] = NULL;
+ setShapeList(MB);
+}
+
+void Square::touch(uint16 mask, int x, int y) {
+ Sprite::touch(mask, x, y);
+ if (mask & kMouseLeftUp) {
+ _vm->XZ(_x + x, _y + y).cell() = 0;
+ _vm->_commandHandlerTurbo->addCommand(kCmdKill, -1, 0, this);
+ }
+}
+
+void CGEEngine::setMapBrick(int x, int z) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::setMapBrick(%d, %d)", x, z);
+
+ Square *s = new Square(this);
+ if (s) {
+ char n[6];
+ s->gotoxy(x * kMapGridX, kMapTop + z * kMapGridZ);
+ sprintf(n, "%02d:%02d", x, z);
+ _clusterMap[z][x] = 1;
+ s->setName(n);
+ _vga->_showQ->insert(s, _vga->_showQ->first());
+ }
+}
+
+void CGEEngine::keyClick() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::keyClick()");
+
+ _commandHandlerTurbo->addCommand(kCmdSound, -1, 5, NULL);
+}
+
+void CGEEngine::resetQSwitch() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::resetQSwitch()");
+
+ _commandHandlerTurbo->addCommand(kCmdSeq, 123, 0, NULL);
+ keyClick();
+}
+
+void CGEEngine::quit() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::quit()");
+
+ static Choice QuitMenu[] = {
+ { NULL, &CGEEngine::startCountDown },
+ { NULL, &CGEEngine::resetQSwitch },
+ { NULL, &CGEEngine::dummy }
+ };
+
+ if (_commandHandler->idle() && !_hero->_flags._hide) {
+ if (Vmenu::_addr) {
+ _commandHandlerTurbo->addCommand(kCmdKill, -1, 0, Vmenu::_addr);
+ resetQSwitch();
+ } else {
+ QuitMenu[0]._text = _text->getText(kQuit);
+ QuitMenu[1]._text = _text->getText(kNoQuit);
+ (new Vmenu(this, QuitMenu, -1, -1))->setName(_text->getText(kQuitTitle));
+ _commandHandlerTurbo->addCommand(kCmdSeq, 123, 1, NULL);
+ keyClick();
+ }
+ }
+}
+
+void CGEEngine::miniStep(int stp) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::miniStep(%d)", stp);
+
+ if (stp < 0) {
+ _miniScene->_flags._hide = true;
+ } else {
+ *_miniShp[0] = *_miniShpList[stp];
+ _miniScene->_flags._hide = false;
+ }
+}
+
+void CGEEngine::postMiniStep(int step) {
+ debugC(6, kCGEDebugEngine, "CGEEngine::postMiniStep(%d)", step);
+
+ if (_miniScene && step != _recentStep)
+ _commandHandlerTurbo->addCallback(kCmdExec, -1, _recentStep = step, kMiniStep);
+}
+
+void CGEEngine::showBak(int ref) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::showBack(%d)", ref);
+
+ Sprite *spr = _vga->_spareQ->locate(ref);
+ if (!spr)
+ return;
+
+ _bitmapPalette = _vga->_sysPal;
+ spr->expand();
+ _bitmapPalette = NULL;
+ spr->show(2);
+ _vga->copyPage(1, 2);
+ _sys->setPal();
+ spr->contract();
+}
+
+void CGEEngine::sceneUp() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::sceneUp()");
+
+ const int BakRef = 1000 * _now;
+ if (_music)
+ _midiPlayer->loadMidi(_now);
+
+ showBak(BakRef);
+ loadMapping();
+ Sprite *spr = _vga->_spareQ->first();
+ while (spr) {
+ Sprite *n = spr->_next;
+ if (spr->_scene == _now || spr->_scene == 0)
+ if (spr->_ref != BakRef) {
+ if (spr->_flags._back)
+ spr->backShow();
+ else
+ expandSprite(spr);
+ }
+ spr = n;
+ }
+
+ _sound->stop();
+ _fx->clear();
+ _fx->preload(0);
+ _fx->preload(BakRef);
+
+ if (_hero) {
+ _hero->gotoxy(_heroXY[_now - 1].x, _heroXY[_now - 1].y);
+ // following 2 lines trims Hero's Z position!
+ _hero->tick();
+ _hero->_time = 1;
+ _hero->_flags._hide = false;
+ }
+
+ if (!_dark)
+ _vga->sunset();
+
+ _vga->copyPage(0, 1);
+ selectPocket(-1);
+ if (_hero)
+ _vga->_showQ->insert(_vga->_showQ->remove(_hero));
+
+ if (_shadow) {
+ _vga->_showQ->remove(_shadow);
+ _shadow->makeXlat(_vga->glass(_vga->_sysPal, 204, 204, 204));
+ _vga->_showQ->insert(_shadow, _hero);
+ _shadow->_z = _hero->_z;
+ }
+ feedSnail(_vga->_showQ->locate(BakRef + 999), kTake);
+ _vga->show();
+ _vga->copyPage(1, 0);
+ _vga->show();
+ _vga->sunrise(_vga->_sysPal);
+ _dark = false;
+ if (!_startupMode)
+ _mouse->on();
+}
+
+void CGEEngine::sceneDown() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::sceneDown()");
+
+ if (_horzLine && !_horzLine->_flags._hide)
+ switchMapping();
+
+ for (Sprite *spr = _vga->_showQ->first(); spr;) {
+ Sprite *n = spr->_next;
+ if (spr->_ref >= 1000 /*&& spr->_scene*/) {
+ if (spr->_ref % 1000 == 999)
+ feedSnail(spr, kTake);
+ _vga->_spareQ->append(_vga->_showQ->remove(spr));
+ }
+ spr = n;
+ }
+}
+
+void CGEEngine::xScene() {
+ debugC(6, kCGEDebugEngine, "CGEEngine::xScene()");
+
+ sceneDown();
+ sceneUp();
+}
+
+void CGEEngine::qGame() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::qGame()");
+
+ sceneDown();
+ _oldLev = _lev;
+
+ // Write out the user's progress
+ saveGame(0, Common::String("Automatic Savegame"));
+
+ _vga->sunset();
+ _finis = true;
+}
+
+void CGEEngine::switchScene(int newScene) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::switchScene(%d)", newScene);
+
+ if (newScene == _now)
+ return;
+
+ if (newScene < 0) {
+ _commandHandler->addCommand(kCmdLabel, -1, 0, NULL); // wait for repaint
+ _commandHandler->addCallback(kCmdExec, -1, 0, kQGame); // quit game
+ } else {
+ _now = newScene;
+ _mouse->off();
+ if (_hero) {
+ _hero->park();
+ _hero->step(0);
+ _vga->_spareQ->_show = 0;
+ }
+ _sceneLight->gotoxy(kSceneX + ((_now - 1) % kSceneNx) * kSceneDx + kSceneSX,
+ kSceneY + ((_now - 1) / kSceneNx) * kSceneDy + kSceneSY);
+ killText();
+ if (!_startupMode)
+ keyClick();
+ _commandHandler->addCommand(kCmdLabel, -1, 0, NULL); // wait for repaint
+ _commandHandler->addCallback(kCmdExec, 0, 0, kXScene); // switch scene
+ }
+}
+
+System::System(CGEEngine *vm) : Sprite(vm, NULL), _vm(vm) {
+ _funDel = kHeroFun0;
+ setPal();
+ tick();
+}
+
+void System::setPal() {
+ Dac *p = _vm->_vga->_sysPal + 256 - ARRAYSIZE(g_stdPal);
+ for (uint i = 0; i < ARRAYSIZE(g_stdPal); i++) {
+ p[i]._r = g_stdPal[i]._r >> 2;
+ p[i]._g = g_stdPal[i]._g >> 2;
+ p[i]._b = g_stdPal[i]._b >> 2;
+ }
+}
+
+void System::funTouch() {
+ uint16 n = (_vm->_flag[0]) ? kHeroFun1 : kHeroFun0; // PAIN flag
+ if (_vm->_talk == NULL || n > _funDel)
+ _funDel = n;
+}
+
+void System::touch(uint16 mask, int x, int y) {
+ funTouch();
+
+ if (mask & kEventKeyb) {
+ _vm->keyClick();
+ _vm->killText();
+ if (_vm->_startupMode == 1) {
+ _vm->_commandHandler->addCommand(kCmdClear, -1, 0, NULL);
+ return;
+ }
+ switch (x) {
+ case 'X':
+ if (_vm->_keyboard->_key[kKeyAlt])
+ _vm->quit();
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ if (_vm->_keyboard->_key[kKeyAlt]) {
+ _vm->_commandHandler->addCommand(kCmdLevel, -1, x - '0', NULL);
+ break;
+ }
+ break;
+ }
+ } else {
+ if (_vm->_startupMode)
+ return;
+ int selectedScene = 0;
+ _vm->_infoLine->update(NULL);
+ if (y >= kWorldHeight ) {
+ if (x < kButtonX) { // select scene?
+ if (y >= kSceneY && y < kSceneY + kSceneNy * kSceneDy &&
+ x >= kSceneX && x < kSceneX + kSceneNx * kSceneDx && !_vm->_game) {
+ selectedScene = ((y - kSceneY) / kSceneDy) * kSceneNx + (x - kSceneX) / kSceneDx + 1;
+ if (selectedScene > _vm->_maxScene)
+ selectedScene = 0;
+ } else {
+ selectedScene = 0;
+ }
+ } else if (mask & kMouseLeftUp) {
+ if (y >= kPocketY && y < kPocketY + kPocketNY * kPocketDY &&
+ x >= kPocketX && x < kPocketX + kPocketNX * kPocketDX) {
+ int n = ((y - kPocketY) / kPocketDY) * kPocketNX + (x - kPocketX) / kPocketDX;
+ _vm->selectPocket(n);
+ }
+ }
+ }
+
+ _vm->postMiniStep(selectedScene - 1);
+
+ if (mask & kMouseLeftUp) {
+ if (selectedScene && _vm->_commandHandler->idle() && _vm->_hero->_tracePtr < 0)
+ _vm->switchScene(selectedScene);
+
+ if (_vm->_horzLine && !_vm->_horzLine->_flags._hide) {
+ if (y >= kMapTop && y < kMapTop + kMapHig) {
+ Cluster tmpCluster = _vm->XZ(x, y);
+ int16 x1 = tmpCluster._pt.x;
+ int16 z1 = tmpCluster._pt.y;
+ _vm->_clusterMap[z1][x1] = 1;
+ _vm->setMapBrick(x1, z1);
+ }
+ } else {
+ if (!_vm->_talk && _vm->_commandHandler->idle() && _vm->_hero
+ && y >= kMapTop && y < kMapTop + kMapHig && !_vm->_game) {
+ _vm->_hero->findWay(_vm->XZ(x, y));
+ }
+ }
+ }
+ }
+}
+
+void System::tick() {
+ if (!_vm->_startupMode)
+ if (--_funDel == 0) {
+ _vm->killText();
+ if (_vm->_commandHandler->idle()) {
+ if (_vm->_flag[0]) // Pain flag
+ _vm->heroCover(9);
+ else { // CHECKME: Before, was: if (Startup::_core >= CORE_MID) {
+ int n = _vm->newRandom(100);
+ if (n > 96)
+ _vm->heroCover(6 + (_vm->_hero->_x + _vm->_hero->_w / 2 < kScrWidth / 2));
+ else if (n > 90)
+ _vm->heroCover(5);
+ else if (n > 60)
+ _vm->heroCover(4);
+ else
+ _vm->heroCover(3);
+ }
+ }
+ funTouch();
+ }
+ _time = kSystemRate;
+}
+
+/**
+ * Switch greyscale mode on/off
+ */
+void CGEEngine::switchColorMode() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::switchColorMode()");
+
+ _commandHandlerTurbo->addCommand(kCmdSeq, 121, _vga->_mono = !_vga->_mono, NULL);
+ keyClick();
+ _vga->setColors(_vga->_sysPal, 64);
+}
+
+/**
+ * Switch music on/off
+ */
+void CGEEngine::switchMusic() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::switchMusic()");
+
+ _commandHandlerTurbo->addCommand(kCmdSeq, 122, (_music = !_music), NULL);
+ keyClick();
+
+ if (_music)
+ _midiPlayer->loadMidi(_now);
+ else
+ _midiPlayer->killMidi();
+}
+
+/**
+ * Shutdown game
+ */
+void CGEEngine::startCountDown() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::startCountDown()");
+
+ switchScene(-1);
+}
+
+void CGEEngine::switchMapping() {
+ assert(_horzLine);
+ debugC(1, kCGEDebugEngine, "CGEEngine::switchMapping()");
+
+ if (_horzLine && _horzLine->_flags._hide) {
+ for (int i = 0; i < kMapZCnt; i++) {
+ for (int j = 0; j < kMapXCnt; j++) {
+ if (_clusterMap[i][j])
+ setMapBrick(j, i);
+ }
+ }
+ } else {
+ for (Sprite *s = _vga->_showQ->first(); s; s = s->_next)
+ if (s->_w == kMapGridX && s->_h == kMapGridZ)
+ _commandHandlerTurbo->addCommand(kCmdKill, -1, 0, s);
+ }
+ _horzLine->_flags._hide = !_horzLine->_flags._hide;
+}
+
+void CGEEngine::killSprite() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::killSprite()");
+
+ _sprite->_flags._kill = true;
+ _sprite->_flags._bDel = true;
+ _commandHandlerTurbo->addCommand(kCmdKill, -1, 0, _sprite);
+ _sprite = NULL;
+}
+
+void CGEEngine::optionTouch(int opt, uint16 mask) {
+ switch (opt) {
+ case 1:
+ if (mask & kMouseLeftUp)
+ switchColorMode();
+ break;
+ case 2:
+ if (mask & kMouseLeftUp)
+ switchMusic();
+ else if (mask & kMouseRightUp)
+ warning("TODO: Use ScummVM sound dialog");
+ break;
+ case 3:
+ if (mask & kMouseLeftUp)
+ quit();
+ break;
+ }
+}
+
+#pragma argsused
+void Sprite::touch(uint16 mask, int x, int y) {
+ _vm->_sys->funTouch();
+
+ if ((mask & kEventAttn) != 0)
+ return;
+
+ _vm->_infoLine->update(name());
+
+ if (mask & (kMouseRightDown | kMouseLeftDown))
+ _vm->_sprite = this;
+
+ if (_ref / 10 == 12) {
+ _vm->optionTouch(_ref % 10, mask);
+ return;
+ }
+
+ if (_flags._syst)
+ return; // cannot access system sprites
+
+ if (_vm->_game)
+ if (mask & kMouseLeftUp) {
+ mask &= ~kMouseLeftUp;
+ mask |= kMouseRightUp;
+ }
+
+ if ((mask & kMouseRightUp) && _vm->_commandHandler->idle()) {
+ Sprite *ps = (_vm->_pocLight->_seqPtr) ? _vm->_pocket[_vm->_pocPtr] : NULL;
+ if (ps) {
+ if (_flags._kept || _vm->_hero->distance(this) < kDistMax) {
+ if (works(ps)) {
+ _vm->feedSnail(ps, kTake);
+ } else
+ _vm->offUse();
+ _vm->selectPocket(-1);
+ } else
+ _vm->tooFar();
+ } else {
+ if (_flags._kept) {
+ mask |= kMouseLeftUp;
+ } else {
+ if (_vm->_hero->distance(this) < kDistMax) {
+ if (_flags._port) {
+ if (_vm->findPocket(NULL) < 0) {
+ _vm->pocFul();
+ } else {
+ _vm->_commandHandler->addCommand(kCmdReach, -1, -1, this);
+ _vm->_commandHandler->addCommand(kCmdKeep, -1, -1, this);
+ _flags._port = false;
+ }
+ } else {
+ if (_takePtr != kNoPtr) {
+ if (snList(kTake)[_takePtr]._commandType == kCmdNext)
+ _vm->offUse();
+ else
+ _vm->feedSnail(this, kTake);
+ } else {
+ _vm->offUse();
+ }
+ }
+ } else {
+ _vm->tooFar();
+ }
+ }
+ }
+ }
+
+ if ((mask & kMouseLeftUp) && _vm->_commandHandler->idle()) {
+ if (_flags._kept) {
+ for (int n = 0; n < kPocketNX; n++) {
+ if (_vm->_pocket[n] == this) {
+ _vm->selectPocket(n);
+ break;
+ }
+ }
+ } else {
+ _vm->_commandHandler->addCommand(kCmdWalk, -1, -1, this); // Hero->FindWay(this);
+ }
+ }
+}
+
+void CGEEngine::loadSprite(const char *fname, int ref, int scene, int col = 0, int row = 0, int pos = 0) {
+ static const char *Comd[] = { "Name", "Type", "Phase", "East",
+ "Left", "Right", "Top", "Bottom",
+ "Seq", "Near", "Take",
+ "Portable", "Transparent",
+ NULL
+ };
+ static const char *Type[] = { "DEAD", "AUTO", "WALK", "NEWTON", "LISSAJOUS",
+ "FLY", NULL
+ };
+
+ int shpcnt = 0;
+ int type = 0; // DEAD
+ bool east = false;
+ bool port = false;
+ bool tran = false;
+ int i, lcnt = 0;
+
+ char tmpStr[kLineMax + 1];
+ Common::String line;
+ mergeExt(tmpStr, fname, kSprExt);
+
+ if (_resman->exist(tmpStr)) { // sprite description file exist
+ EncryptedStream sprf(this, tmpStr);
+ if (sprf.err())
+ error("Bad SPR [%s]", tmpStr);
+
+ uint16 len;
+ for (line = sprf.readLine(); !sprf.eos(); line = sprf.readLine()) {
+ len = line.size();
+ lcnt++;
+ strcpy(tmpStr, line.c_str());
+ if (len == 0 || *tmpStr == '.')
+ continue;
+
+ if ((i = takeEnum(Comd, strtok(tmpStr, " =\t"))) < 0)
+ error("Bad line %d [%s]", lcnt, fname);
+
+
+ switch (i) {
+ case 0 : // Name - will be taken in Expand routine
+ break;
+ case 1 : // Type
+ if ((type = takeEnum(Type, strtok(NULL, " \t,;/"))) < 0)
+ error("Bad line %d [%s]", lcnt, fname);
+ break;
+ case 2 : // Phase
+ shpcnt++;
+ break;
+ case 3 : // East
+ east = (atoi(strtok(NULL, " \t,;/")) != 0);
+ break;
+ case 11 : // Portable
+ port = (atoi(strtok(NULL, " \t,;/")) != 0);
+ break;
+ case 12 : // Transparent
+ tran = (atoi(strtok(NULL, " \t,;/")) != 0);
+ break;
+ }
+ }
+ if (! shpcnt)
+ error("No shapes [%s]", fname);
+ } else {
+ // no sprite description: mono-shaped sprite with only .BMP file
+ ++shpcnt;
+ }
+
+ // make sprite of choosen type
+ switch (type) {
+ case 1:
+ // AUTO
+ _sprite = new Sprite(this, NULL);
+ if (_sprite) {
+ _sprite->gotoxy(col, row);
+ }
+ break;
+ case 2:
+ { // WALK
+ Walk *w = new Walk(this, NULL);
+ if (w && ref == 1) {
+ w->gotoxy(col, row);
+ if (_hero)
+ error("2nd HERO [%s]", fname);
+ _hero = w;
+ }
+ _sprite = w;
+ break;
+ }
+ case 3: // NEWTON
+ case 4: // LISSAJOUS
+ error("Bad type [%s]", fname);
+ break;
+ case 5:
+ { // FLY
+ Fly *f = new Fly(this, NULL);
+ _sprite = f;
+ break;
+ }
+ default:
+ // DEAD
+ _sprite = new Sprite(this, NULL);
+ if (_sprite)
+ _sprite->gotoxy(col, row);
+ break;
+ }
+
+ if (_sprite) {
+ _sprite->_ref = ref;
+ _sprite->_scene = scene;
+ _sprite->_z = pos;
+ _sprite->_flags._east = east;
+ _sprite->_flags._port = port;
+ _sprite->_flags._tran = tran;
+ _sprite->_flags._kill = true;
+ _sprite->_flags._bDel = true;
+
+ // Extract the filename, without the extension
+ strcpy(_sprite->_file, fname);
+ char *p = strchr(_sprite->_file, '.');
+ if (p)
+ *p = '\0';
+
+ _sprite->_shpCnt = shpcnt;
+ _vga->_spareQ->append(_sprite);
+ }
+}
+
+void CGEEngine::loadScript(const char *fname) {
+ EncryptedStream scrf(this, fname);
+
+ if (scrf.err())
+ return;
+
+ bool ok = true;
+ int lcnt = 0;
+
+ char tmpStr[kLineMax+1];
+ Common::String line;
+
+ for (line = scrf.readLine(); !scrf.eos(); line = scrf.readLine()) {
+ char *p;
+
+ lcnt++;
+ strcpy(tmpStr, line.c_str());
+ if ((line.size() == 0) || (*tmpStr == '.'))
+ continue;
+
+ ok = false; // not OK if break
+
+ // sprite ident number
+ if ((p = strtok(tmpStr, " \t\n")) == NULL)
+ break;
+ int SpI = atoi(p);
+
+ // sprite file name
+ char *SpN;
+ if ((SpN = strtok(NULL, " ,;/\t\n")) == NULL)
+ break;
+
+ // sprite scene
+ if ((p = strtok(NULL, " ,;/\t\n")) == NULL)
+ break;
+ int SpA = atoi(p);
+
+ // sprite column
+ if ((p = strtok(NULL, " ,;/\t\n")) == NULL)
+ break;
+ int SpX = atoi(p);
+
+ // sprite row
+ if ((p = strtok(NULL, " ,;/\t\n")) == NULL)
+ break;
+ int SpY = atoi(p);
+
+ // sprite Z pos
+ if ((p = strtok(NULL, " ,;/\t\n")) == NULL)
+ break;
+ int SpZ = atoi(p);
+
+ // sprite life
+ if ((p = strtok(NULL, " ,;/\t\n")) == NULL)
+ break;
+ bool BkG = atoi(p) == 0;
+
+ ok = true; // no break: OK
+
+ _sprite = NULL;
+ loadSprite(SpN, SpI, SpA, SpX, SpY, SpZ);
+ if (_sprite && BkG)
+ _sprite->_flags._back = true;
+ }
+
+ if (!ok)
+ error("Bad INI line %d [%s]", lcnt, fname);
+}
+
+Sprite *CGEEngine::locate(int ref) {
+ Sprite *spr = _vga->_showQ->locate(ref);
+ return (spr) ? spr : _vga->_spareQ->locate(ref);
+}
+
+Sprite *CGEEngine::spriteAt(int x, int y) {
+ Sprite *spr = NULL, * tail = _vga->_showQ->last();
+ if (tail) {
+ for (spr = tail->_prev; spr; spr = spr->_prev) {
+ if (! spr->_flags._hide && ! spr->_flags._tran) {
+ if (spr->shp()->solidAt(x - spr->_x, y - spr->_y))
+ break;
+ }
+ }
+ }
+ return spr;
+}
+
+Cluster CGEEngine::XZ(int16 x, int16 y) {
+ if (y < kMapTop)
+ y = kMapTop;
+
+ if (y > kMapTop + kMapHig - kMapGridZ)
+ y = kMapTop + kMapHig - kMapGridZ;
+
+ return Cluster(this, x / kMapGridX, (y - kMapTop) / kMapGridZ);
+}
+
+void CGEEngine::killText() {
+ if (!_talk)
+ return;
+
+ _commandHandlerTurbo->addCommand(kCmdKill, -1, 0, _talk);
+ _talk = NULL;
+}
+
+void CGEEngine::mainLoop() {
+ _vga->show();
+ _commandHandlerTurbo->runCommand();
+ _commandHandler->runCommand();
+
+ // Handle a delay between game frames
+ handleFrame();
+
+ // Handle any pending events
+ _eventManager->poll();
+}
+
+void CGEEngine::handleFrame() {
+ // Game frame delay
+ uint32 millis = g_system->getMillis();
+ while (!_eventManager->_quitFlag && (millis < (_lastFrame + kGameFrameDelay))) {
+ // Handle any pending events
+ _eventManager->poll();
+
+ if (millis >= (_lastTick + kGameTickDelay)) {
+ // Dispatch the tick to any active objects
+ tick();
+ _lastTick = millis;
+ }
+
+ // Slight delay
+ g_system->delayMillis(5);
+ millis = g_system->getMillis();
+ }
+ _lastFrame = millis;
+
+ if (millis >= (_lastTick + kGameTickDelay)) {
+ // Dispatch the tick to any active objects
+ tick();
+ _lastTick = millis;
+ }
+}
+
+void CGEEngine::tick() {
+ for (Sprite *spr = _vga->_showQ->first(); spr; spr = spr->_next) {
+ if (spr->_time) {
+ if (!spr->_flags._hide) {
+ if (--spr->_time == 0)
+ spr->tick();
+ }
+ }
+ }
+}
+
+void CGEEngine::loadUser() {
+ // set scene
+ if (_mode == 0) {
+ // user .SVG file found - load it from slot 0
+ loadGame(0, NULL);
+ } else if (_mode == 1) {
+ // Load either initial game state savegame or launcher specified savegame
+ loadGame(_startGameSlot, NULL);
+ } else {
+ error("Creating setup savegames not supported");
+ }
+ loadScript("CGE.IN0");
+}
+
+void CGEEngine::runGame() {
+ if (_eventManager->_quitFlag)
+ return;
+
+ loadHeroXY();
+
+ _sceneLight->_flags._tran = true;
+ _vga->_showQ->append(_sceneLight);
+ _sceneLight->_flags._hide = true;
+
+ const Seq pocSeq[] = {
+ { 0, 0, 0, 0, 20 },
+ { 1, 2, 0, 0, 4 },
+ { 2, 3, 0, 0, 4 },
+ { 3, 4, 0, 0, 16 },
+ { 2, 5, 0, 0, 4 },
+ { 1, 6, 0, 0, 4 },
+ { 0, 1, 0, 0, 16 },
+ };
+ Seq *seq = (Seq *)malloc(7 * sizeof(Seq));
+ Common::copy(pocSeq, pocSeq + 7, seq);
+ _pocLight->setSeq(seq);
+
+ _pocLight->_flags._tran = true;
+ _pocLight->_time = 1;
+ _pocLight->_z = 120;
+ _vga->_showQ->append(_pocLight);
+ selectPocket(-1);
+
+ _vga->_showQ->append(_mouse);
+
+// ___________
+ loadUser();
+// ~~~~~~~~~~~
+
+ if ((_sprite = _vga->_spareQ->locate(121)) != NULL)
+ _commandHandlerTurbo->addCommand(kCmdSeq, -1, _vga->_mono, _sprite);
+ if ((_sprite = _vga->_spareQ->locate(122)) != NULL)
+ _sprite->step(_music);
+ _commandHandlerTurbo->addCommand(kCmdSeq, -1, _music, _sprite);
+ if (!_music)
+ _midiPlayer->killMidi();
+
+ if (_resman->exist("MINI.SPR")) {
+ _miniShp = new BitmapPtr[2];
+ _miniShp[0] = _miniShp[1] = NULL;
+
+ loadSprite("MINI", -1, 0, kMiniX, kMiniY);
+ expandSprite(_miniScene = _sprite); // NULL is ok
+ if (_miniScene) {
+ _miniScene->_flags._kill = false;
+ _miniScene->_flags._hide = true;
+ _miniShp[0] = new Bitmap(this, *_miniScene->shp());
+ _miniShpList = _miniScene->setShapeList(_miniShp);
+ postMiniStep(-1);
+ }
+ }
+
+ if (_hero) {
+ expandSprite(_hero);
+ _hero->gotoxy(_heroXY[_now - 1].x, _heroXY[_now - 1].y);
+ if (_resman->exist("00SHADOW.SPR")) {
+ loadSprite("00SHADOW", -1, 0, _hero->_x + 14, _hero->_y + 51);
+ delete _shadow;
+ if ((_shadow = _sprite) != NULL) {
+ _shadow->_ref = 2;
+ _shadow->_flags._tran = true;
+ _shadow->_flags._kill = false;
+ _hero->_flags._shad = true;
+ _vga->_showQ->insert(_vga->_spareQ->remove(_shadow), _hero);
+ }
+ }
+ }
+
+ _infoLine->gotoxy(kInfoX, kInfoY);
+ _infoLine->_flags._tran = true;
+ _infoLine->update(NULL);
+ _vga->_showQ->insert(_infoLine);
+
+ _debugLine->_z = 126;
+ _vga->_showQ->insert(_debugLine);
+
+ if (_horzLine) {
+ _horzLine->_y = kMapTop - (kMapTop > 0);
+ _horzLine->_z = 126;
+ _vga->_showQ->insert(_horzLine);
+ }
+
+ _mouse->_busy = _vga->_spareQ->locate(kBusyRef);
+ if (_mouse->_busy)
+ expandSprite(_mouse->_busy);
+
+ _startupMode = 0;
+
+ _commandHandler->addCommand(kCmdLevel, -1, _oldLev, &_sceneLight);
+ _sceneLight->gotoxy(kSceneX + ((_now - 1) % kSceneNx) * kSceneDx + kSceneSX,
+ kSceneY + ((_now - 1) / kSceneNx) * kSceneDy + kSceneSY);
+ sceneUp();
+
+ _keyboard->setClient(_sys);
+ // main loop
+ while (!_finis && !_eventManager->_quitFlag) {
+ if (_flag[3])
+ _commandHandler->addCallback(kCmdExec, -1, 0, kQGame);
+ mainLoop();
+ }
+
+ // If finishing game due to closing ScummVM window, explicitly save the game
+ if (!_finis && canSaveGameStateCurrently())
+ qGame();
+
+ _keyboard->setClient(NULL);
+ _commandHandler->addCommand(kCmdClear, -1, 0, NULL);
+ _commandHandlerTurbo->addCommand(kCmdClear, -1, 0, NULL);
+ _mouse->off();
+ _vga->_showQ->clear();
+ _vga->_spareQ->clear();
+ _hero = NULL;
+ _shadow = NULL;
+}
+
+void CGEEngine::movie(const char *ext) {
+ assert(ext);
+
+ if (_eventManager->_quitFlag)
+ return;
+
+ char fn[12];
+ sprintf(fn, "CGE.%s", (*ext == '.') ? ext +1 : ext);
+
+ if (_resman->exist(fn)) {
+ loadScript(fn);
+ expandSprite(_vga->_spareQ->locate(999));
+ feedSnail(_vga->_showQ->locate(999), kTake);
+ _vga->_showQ->append(_mouse);
+ _keyboard->setClient(_sys);
+ while (!_commandHandler->idle() && !_eventManager->_quitFlag)
+ mainLoop();
+
+ _keyboard->setClient(NULL);
+ _commandHandler->addCommand(kCmdClear, -1, 0, NULL);
+ _commandHandlerTurbo->addCommand(kCmdClear, -1, 0, NULL);
+ _vga->_showQ->clear();
+ _vga->_spareQ->clear();
+ }
+}
+
+bool CGEEngine::showTitle(const char *name) {
+ if (_eventManager->_quitFlag)
+ return false;
+
+ _bitmapPalette = _vga->_sysPal;
+ BitmapPtr *LB = new BitmapPtr[2];
+ LB[0] = new Bitmap(this, name);
+ LB[1] = NULL;
+ _bitmapPalette = NULL;
+
+ Sprite D(this, LB);
+ D._flags._kill = true;
+ D._flags._bDel = true;
+ D.center();
+ D.show(2);
+
+ if (_mode == 2) {
+ inf(kSavegame0Name);
+ _talk->show(2);
+ }
+
+ _vga->sunset();
+ _vga->copyPage(1, 2);
+ _vga->copyPage(0, 1);
+ selectPocket(-1);
+ _vga->sunrise(_vga->_sysPal);
+
+ if (_mode < 2 && !_soundOk) {
+ _vga->copyPage(1, 2);
+ _vga->copyPage(0, 1);
+ _vga->_showQ->append(_mouse);
+ _mouse->on();
+ for (; !_commandHandler->idle() || Vmenu::_addr;) {
+ mainLoop();
+ if (_eventManager->_quitFlag)
+ return false;
+ }
+
+ _mouse->off();
+ _vga->_showQ->clear();
+ _vga->copyPage(0, 2);
+ _soundOk = 2;
+ if (_music)
+ _midiPlayer->loadMidi(0);
+ }
+
+ if (_mode < 2) {
+ // At this point the game originally set the protection variables
+ // used by the copy protection check
+ movie(kPaylistExt); // paylist
+ _vga->copyPage(1, 2);
+ _vga->copyPage(0, 1);
+ _vga->_showQ->append(_mouse);
+ // In the original game, the user had to enter his name
+ // As it was only used to name savegames, it has been removed
+ _vga->_showQ->clear();
+ _vga->copyPage(0, 2);
+
+ if (_mode == 0) {
+// The auto-load of savegame #0 is currently disabled
+#if 0
+ if (savegameExists(0)) {
+ // Load the savegame
+ loadGame(0, NULL, true); // only system vars
+ _vga->setColors(_vga->_sysPal, 64);
+ _vga->update();
+ if (_flag[3]) { //flag FINIS
+ _mode++;
+ _flag[3] = false;
+ }
+ } else
+#endif
+ _mode++;
+ }
+ }
+
+ if (_mode < 2)
+ movie(kWinkExt);
+
+ _vga->copyPage(0, 2);
+
+ return true;
+}
+
+void CGEEngine::cge_main() {
+ memset(_barriers, 0xFF, sizeof(_barriers));
+
+ if (!_mouse->_exist)
+ error("%s", _text->getText(kTextNoMouse));
+
+ if (!_resman->exist(kSavegame0Name))
+ _mode = 2;
+
+ _debugLine->_flags._hide = true;
+ if (_horzLine)
+ _horzLine->_flags._hide = true;
+
+ if (_music && _soundOk)
+ _midiPlayer->loadMidi(0);
+
+ if (_startGameSlot != -1) {
+ // Starting up a savegame from the launcher
+ _mode++;
+ runGame();
+
+ _startupMode = 2;
+ if (_flag[3]) // Flag FINIS
+ movie(kEndgExt);
+ } else {
+ if (_mode < 2)
+ movie(kLgoExt);
+
+ if (showTitle("WELCOME")) {
+ if (_mode == 1)
+ movie(kIntroExt);
+ runGame();
+ _startupMode = 2;
+ if (_flag[3]) // Flag FINIS
+ movie(kEndgExt);
+ } else
+ _vga->sunset();
+ }
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/cge_main.h b/engines/cge/cge_main.h
new file mode 100644
index 0000000000..bdb3121d63
--- /dev/null
+++ b/engines/cge/cge_main.h
@@ -0,0 +1,114 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_CGEMAIN_H
+#define CGE_CGEMAIN_H
+
+#include "cge/events.h"
+
+namespace CGE {
+
+#define kSceneX 4
+#define kSceneY 166
+#define kSceneSX 0
+#define kSceneSY 0
+#define kInfoX 177
+#define kInfoY 164
+#define kInfoW 140
+#define kButtonX 151
+#define kButtonY 164
+#define kMiniX 86
+#define kMiniY 162
+#define kLineMax 512
+#define kDistMax 3
+#define kLgoExt ".LGO"
+#define kSvgExt ".SVG"
+#define kPaylistExt ".X00"
+#define kWinkExt ".X01"
+#define kIntroExt ".X02"
+#define kEndgExt ".X03"
+#define kWalkSide 10
+#define kBusyRef 500
+#define kSystemRate 6 // 12 Hz
+#define kHeroFun0 (40 * 12)
+#define kHeroFun1 ( 2 * 12)
+#define kGetNamePrompt 50
+#define kGetNameTitle 51
+#define kTSeq 96
+#define kNoMusic 98
+#define kBadSVG 99
+#define kSeqHTalk (kTSeq + 4)
+#define kSeqTooFar (kTSeq + 5)
+#define kSeqNoWay (kTSeq + 5)
+#define kSeqPocketFull (kTSeq + 5)
+#define kSeqOffUse (kTSeq + 6)
+#define kQuitTitle 200
+#define kQuit 201
+#define kNoQuit 202
+#define kDemo 300
+#define kOffUseCount 600
+#define kOffUse 601
+#define kNoWay 671
+#define kTooFar 681
+#define kPocketFull 691
+#define kPanHeight 40
+#define kScrWidth 320
+#define kScrHeight 200
+#define kWorldHeight (kScrHeight - kPanHeight)
+#define kStackSize 2048
+#define kSavegameCheckSum (1956 + _now + _oldLev + _game + _music + _demoText)
+#define kSavegame0Name ("{{INIT}}" kSvgExt)
+#define kSavegame0File EncryptedStream
+#define kSavegameStrSize 11
+#define kGameFrameDelay (1000 / 50)
+#define kGameTickDelay (1000 / 62)
+
+class System : public Sprite {
+public:
+ int _funDel;
+
+ System(CGEEngine *vm);
+
+ void setPal();
+ void funTouch();
+ virtual void touch(uint16 mask, int x, int y);
+ void tick();
+private:
+ CGEEngine *_vm;
+};
+
+class Square : public Sprite {
+public:
+ Square(CGEEngine *vm);
+ virtual void touch(uint16 mask, int x, int y);
+private:
+ CGEEngine *_vm;
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/console.cpp b/engines/cge/console.cpp
new file mode 100644
index 0000000000..71eedf34ea
--- /dev/null
+++ b/engines/cge/console.cpp
@@ -0,0 +1,34 @@
+/* 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.
+ *
+ */
+
+#include "cge/console.h"
+#include "cge/cge.h"
+
+namespace CGE {
+
+CGEConsole::CGEConsole(CGEEngine *vm) : GUI::Debugger(), _vm(vm) {
+}
+
+CGEConsole::~CGEConsole() {
+}
+
+} // End of namespace CGE
diff --git a/engines/agi/preagi_common.h b/engines/cge/console.h
index a557f69977..25a1a4fae3 100644
--- a/engines/agi/preagi_common.h
+++ b/engines/cge/console.h
@@ -20,32 +20,24 @@
*
*/
+#ifndef CGE_CONSOLE_H
+#define CGE_CONSOLE_H
+#include "gui/debugger.h"
-#ifndef AGI_PREAGI_COMMON_H
-#define AGI_PREAGI_COMMON_H
+namespace CGE {
-namespace Agi {
+class CGEEngine;
-// default attributes
-#define IDA_DEFAULT 0x0F
-#define IDA_DEFAULT_REV 0xF0
+class CGEConsole : public GUI::Debugger {
+public:
+ CGEConsole(CGEEngine *vm);
+ virtual ~CGEConsole();
-#define IDI_SND_OSCILLATOR_FREQUENCY 1193180
-#define IDI_SND_TIMER_RESOLUTION 0.0182
-
-#define kColorDefault 0x1337
-
-#define IDI_MAX_ROW_PIC 20
-
-enum SelectionTypes {
- kSelYesNo,
- kSelNumber,
- kSelSpace,
- kSelAnyKey,
- kSelBackspace
+private:
+ CGEEngine *_vm;
};
-} // End of namespace Agi
+} // End of namespace CGE
#endif
diff --git a/engines/cge/detection.cpp b/engines/cge/detection.cpp
new file mode 100644
index 0000000000..f2f5764e54
--- /dev/null
+++ b/engines/cge/detection.cpp
@@ -0,0 +1,238 @@
+/* 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.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "engines/advancedDetector.h"
+#include "common/savefile.h"
+#include "common/system.h"
+#include "base/plugins.h"
+#include "graphics/thumbnail.h"
+#include "cge/cge.h"
+
+static const PlainGameDescriptor CGEGames[] = {
+ { "soltys", "Soltys" },
+ { 0, 0 }
+};
+
+namespace CGE {
+
+static const ADGameDescription gameDescriptions[] = {
+
+ {
+ "soltys", "",
+ {
+ {"vol.cat", 0, "0c33e2c304821a2444d297fc5e2d67c6", 50176},
+ {"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8437572},
+ AD_LISTEND
+ },
+ Common::PL_POL, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO1(GUIO_NONE)
+ },
+ {
+ "soltys", "Soltys Freeware",
+ {
+ {"vol.cat", 0, "0c33e2c304821a2444d297fc5e2d67c6", 50176},
+ {"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8437676},
+ AD_LISTEND
+ },
+ Common::PL_POL, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO1(GUIO_NONE)
+ },
+ // English ScummVM version
+ {
+ "soltys", "",
+ {
+ {"vol.cat", 0, "bd08969b5f1acea0f92d195f750c17d5", 50176},
+ {"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8428832},
+ AD_LISTEND
+ },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO1(GUIO_NONE)
+ },
+ {
+ "soltys", "Soltys Demo (not supported)",
+ {
+ {"vol.cat", 0, "1e077c8ff58109a187f07ac54b0c873a", 18788},
+ {"vol.dat", 0, "75d385a6074c58b69f7730481f256051", 1796710},
+ AD_LISTEND
+ },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO , GUIO1(GUIO_NONE)
+ },
+ {
+ "soltys", "Soltys Demo (not supported)",
+ {
+ {"vol.cat", 0, "f17987487fab1ebddd781d8d02fedecc", 7168},
+ {"vol.dat", 0, "c5d9b15863cab61dc125551576dece04", 1075272},
+ AD_LISTEND
+ },
+ Common::PL_POL, Common::kPlatformPC, ADGF_DEMO , GUIO1(GUIO_NONE)
+ },
+ AD_TABLE_END_MARKER
+};
+
+static const ADFileBasedFallback fileBasedFallback[] = {
+ { &gameDescriptions[0], { "vol.cat", "vol.dat", 0 } },
+ { 0, { 0 } }
+};
+
+} // End of namespace CGE
+
+class CGEMetaEngine : public AdvancedMetaEngine {
+public:
+ CGEMetaEngine() : AdvancedMetaEngine(CGE::gameDescriptions, sizeof(ADGameDescription), CGEGames) {
+ _singleid = "Soltys";
+ }
+
+ virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const {
+ return detectGameFilebased(allFiles, CGE::fileBasedFallback);
+ }
+
+ virtual const char *getName() const {
+ return "CGE";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "Soltys (c) 1994-1996 L.K. Avalon";
+ }
+
+
+
+ virtual bool hasFeature(MetaEngineFeature f) const;
+ virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+ virtual int getMaximumSaveSlot() const;
+ virtual SaveStateList listSaves(const char *target) const;
+ SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+ virtual void removeSaveState(const char *target, int slot) const;
+};
+
+bool CGEMetaEngine::hasFeature(MetaEngineFeature f) const {
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail) ||
+ (f == kSavesSupportCreationDate);
+}
+
+void CGEMetaEngine::removeSaveState(const char *target, int slot) const {
+ Common::String fileName = Common::String::format("%s.%03d", target, slot);
+ g_system->getSavefileManager()->removeSavefile(fileName);
+}
+
+int CGEMetaEngine::getMaximumSaveSlot() const {
+ return 99;
+}
+
+SaveStateList CGEMetaEngine::listSaves(const char *target) const {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Common::StringArray filenames;
+ Common::String pattern = target;
+ pattern += ".???";
+
+ filenames = saveFileMan->listSavefiles(pattern);
+ sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
+
+ SaveStateList saveList;
+ int slotNum = 0;
+ for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) {
+ // Obtain the last 3 digits of the filename, since they correspond to the save slot
+ slotNum = atoi(filename->c_str() + filename->size() - 3);
+
+ if (slotNum >= 0 && slotNum <= 99) {
+
+ Common::InSaveFile *file = saveFileMan->openForLoading(*filename);
+ if (file) {
+ CGE::SavegameHeader header;
+
+ // Check to see if it's a ScummVM savegame or not
+ char buffer[kSavegameStrSize + 1];
+ file->read(buffer, kSavegameStrSize + 1);
+
+ if (!strncmp(buffer, CGE::savegameStr, kSavegameStrSize + 1)) {
+ // Valid savegame
+ if (CGE::CGEEngine::readSavegameHeader(file, header)) {
+ saveList.push_back(SaveStateDescriptor(slotNum, header.saveName));
+ delete header.thumbnail;
+ }
+ } else {
+ // Must be an original format savegame
+ saveList.push_back(SaveStateDescriptor(slotNum, "Unknown"));
+ }
+
+ delete file;
+ }
+ }
+ }
+
+ return saveList;
+}
+
+SaveStateDescriptor CGEMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+ Common::String fileName = Common::String::format("%s.%03d", target, slot);
+ Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName);
+
+ if (f) {
+ CGE::SavegameHeader header;
+
+ // Check to see if it's a ScummVM savegame or not
+ char buffer[kSavegameStrSize + 1];
+ f->read(buffer, kSavegameStrSize + 1);
+
+ bool hasHeader = !strncmp(buffer, CGE::savegameStr, kSavegameStrSize + 1) &&
+ CGE::CGEEngine::readSavegameHeader(f, header);
+ delete f;
+
+ if (!hasHeader) {
+ // Original savegame perhaps?
+ SaveStateDescriptor desc(slot, "Unknown");
+ return desc;
+ } else {
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header.saveName);
+ desc.setDeletableFlag(true);
+ desc.setWriteProtectedFlag(false);
+ desc.setThumbnail(header.thumbnail);
+ desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
+ desc.setSaveTime(header.saveHour, header.saveMinutes);
+
+ // Slot 0 is used for the 'automatic save on exit' save in Soltys, thus
+ // we prevent it from being deleted or overwritten by accident.
+ desc.setDeletableFlag(slot != 0);
+ desc.setWriteProtectedFlag(slot == 0);
+
+ return desc;
+ }
+ }
+
+ return SaveStateDescriptor();
+}
+
+bool CGEMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ if (desc) {
+ *engine = new CGE::CGEEngine(syst, desc);
+ }
+ return desc != 0;
+}
+
+#if PLUGIN_ENABLED_DYNAMIC(CGE)
+REGISTER_PLUGIN_DYNAMIC(CGE, PLUGIN_TYPE_ENGINE, CGEMetaEngine);
+#else
+REGISTER_PLUGIN_STATIC(CGE, PLUGIN_TYPE_ENGINE, CGEMetaEngine);
+#endif
diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp
new file mode 100644
index 0000000000..cc22d9075a
--- /dev/null
+++ b/engines/cge/events.cpp
@@ -0,0 +1,378 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "gui/saveload.h"
+#include "gui/about.h"
+#include "gui/message.h"
+#include "common/config-manager.h"
+#include "common/events.h"
+#include "cge/events.h"
+#include "cge/events.h"
+#include "cge/text.h"
+#include "cge/cge_main.h"
+
+namespace CGE {
+
+/*----------------- KEYBOARD interface -----------------*/
+
+const uint16 Keyboard::_code[0x60] = {
+ 0, Esc, '1', '2', '3',
+ '4', '5', '6', '7', '8',
+ '9', '0', '-', '+', BSp,
+ Tab, 'Q', 'W', 'E', 'R',
+ 'T', 'Y', 'U', 'I', 'O',
+ 'P', '[', ']', Enter, 0/*Ctrl*/,
+ 'A', 'S', 'D', 'F', 'G',
+ 'H', 'J', 'K', 'L', ';',
+ '\'', '`', 0/*LShift*/, '\\', 'Z',
+ 'X', 'C', 'V', 'B', 'N',
+ 'M', ',', '.', '/', 0/*RShift*/,
+ '*', 0/*Alt*/, ' ', 0/*Caps*/, F1,
+ F2, F3, F4, F5, F6,
+ F7, F8, F9, F10, 0/*NumLock*/,
+ 0/*ScrollLock*/, Home, Up, PgUp, '-',
+ Left, Ctr, Right, '+', End,
+ Down, PgDn, Ins, Del, 0 * 0x54,
+ 0 * 0x55, 0 * 0x56, F11, F12, 0 * 0x59,
+ 0 * 0x5A, 0 * 0x5B, 0 * 0x5C, 0 * 0x5D, 0 * 0x5E,
+ 0 * 0x5F
+};
+
+const uint16 Keyboard::_scummVmCodes[0x60] = {
+ 0, Common::KEYCODE_ESCAPE, Common::KEYCODE_1, Common::KEYCODE_2, Common::KEYCODE_3,
+ Common::KEYCODE_4, Common::KEYCODE_5, Common::KEYCODE_6, Common::KEYCODE_7, Common::KEYCODE_8,
+ Common::KEYCODE_9, Common::KEYCODE_0, Common::KEYCODE_MINUS, Common::KEYCODE_PLUS, Common::KEYCODE_BACKSPACE,
+ Common::KEYCODE_TAB, Common::KEYCODE_q, Common::KEYCODE_w, Common::KEYCODE_e, Common::KEYCODE_r,
+ Common::KEYCODE_t, Common::KEYCODE_y, Common::KEYCODE_u, Common::KEYCODE_i, Common::KEYCODE_o,
+ Common::KEYCODE_p, Common::KEYCODE_LEFTBRACKET, Common::KEYCODE_RIGHTBRACKET, Common::KEYCODE_RETURN, 0/*Ctrl*/,
+ Common::KEYCODE_a, Common::KEYCODE_s, Common::KEYCODE_d, Common::KEYCODE_f, Common::KEYCODE_g,
+ Common::KEYCODE_h, Common::KEYCODE_j, Common::KEYCODE_k, Common::KEYCODE_l, Common::KEYCODE_SEMICOLON,
+ Common::KEYCODE_BACKSLASH, Common::KEYCODE_TILDE, Common::KEYCODE_LSHIFT, Common::KEYCODE_BACKSLASH, Common::KEYCODE_z,
+ Common::KEYCODE_x, Common::KEYCODE_c, Common::KEYCODE_v, Common::KEYCODE_b, Common::KEYCODE_n,
+ Common::KEYCODE_m, Common::KEYCODE_COMMA, Common::KEYCODE_PERIOD, Common::KEYCODE_SLASH, Common::KEYCODE_RSHIFT,
+ Common::KEYCODE_KP_MULTIPLY, 0 /*Alt*/, Common::KEYCODE_SPACE, Common::KEYCODE_CAPSLOCK, Common::KEYCODE_F1,
+ Common::KEYCODE_F2, Common::KEYCODE_F3, Common::KEYCODE_F4, Common::KEYCODE_F5, Common::KEYCODE_F6,
+ Common::KEYCODE_F7, Common::KEYCODE_F8, Common::KEYCODE_F9, Common::KEYCODE_F10, Common::KEYCODE_NUMLOCK,
+ Common::KEYCODE_SCROLLOCK, Common::KEYCODE_KP7, Common::KEYCODE_KP8, Common::KEYCODE_KP9, Common::KEYCODE_KP_MINUS,
+ Common::KEYCODE_KP4, Common::KEYCODE_KP5, Common::KEYCODE_KP6, Common::KEYCODE_KP_PLUS, Common::KEYCODE_KP1,
+ Common::KEYCODE_KP2, Common::KEYCODE_KP3, Common::KEYCODE_KP0, Common::KEYCODE_KP_PERIOD, 0,
+ 0, 0, Common::KEYCODE_F11, Common::KEYCODE_F12, 0,
+ 0, 0, 0, 0, 0,
+ 0
+};
+
+Keyboard::Keyboard(CGEEngine *vm) : _client(NULL), _vm(vm) {
+ Common::set_to(&_key[0], &_key[0x60], false);
+ _current = 0;
+}
+
+Keyboard::~Keyboard() {
+}
+
+Sprite *Keyboard::setClient(Sprite *spr) {
+ SWAP(_client, spr);
+ return spr;
+}
+
+bool Keyboard::getKey(Common::Event &event, int &cgeCode) {
+ Common::KeyCode keycode = event.kbd.keycode;
+ if ((keycode == Common::KEYCODE_LCTRL) || (keycode == Common::KEYCODE_RCTRL)) {
+ cgeCode = kKeyCtrl;
+ return true;
+ }
+ if ((keycode == Common::KEYCODE_LALT) || (keycode == Common::KEYCODE_RALT)) {
+ cgeCode = kKeyAlt;
+ return true;
+ }
+ if (keycode == Common::KEYCODE_KP_ENTER) {
+ cgeCode = 28;
+ return true;
+ }
+ if (keycode == Common::KEYCODE_F5) {
+ warning("keycode %d", event.kbd.ascii);
+ if (_vm->canSaveGameStateCurrently()) {
+ const EnginePlugin *plugin = NULL;
+ EngineMan.findGame(_vm->_gameDescription->gameid, &plugin);
+
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save");
+ dialog->setSaveMode(true);
+ int16 savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ Common::String savegameDescription = dialog->getResultString();
+ delete dialog;
+ _vm->saveGameState(savegameId, savegameDescription);
+ }
+ return false;
+ } else if (keycode == Common::KEYCODE_F7) {
+ if (_vm->canLoadGameStateCurrently()) {
+ const EnginePlugin *plugin = NULL;
+ EngineMan.findGame(_vm->_gameDescription->gameid, &plugin);
+
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Restore game:", "Restore");
+ dialog->setSaveMode(false);
+ int16 savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ delete dialog;
+ _vm->loadGameState(savegameId);
+ }
+ return false;
+ }
+
+ // Scan through the ScummVM mapping list
+ for (int idx = 0; idx < 0x60; idx++) {
+ if (_scummVmCodes[idx] == event.kbd.ascii) {
+ cgeCode = idx;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Keyboard::newKeyboard(Common::Event &event) {
+ int keycode;
+ if (!getKey(event, keycode))
+ return;
+
+ if (event.type == Common::EVENT_KEYUP) {
+ // Key release
+ _key[keycode] = false;
+ } else if (event.type == Common::EVENT_KEYDOWN) {
+ // Key press
+ _key[keycode] = true;
+ _current = Keyboard::_code[keycode];
+
+ if (_client) {
+ CGEEvent &evt = _vm->_eventManager->getNextEvent();
+ evt._x = _current; // Keycode
+ evt._mask = kEventKeyb; // Event mask
+ evt._spritePtr = _client; // Sprite pointer
+ }
+ }
+}
+
+uint16 Keyboard::lastKey() {
+ uint16 cur = _current;
+ _current = 0;
+ return cur;
+}
+
+/*----------------- MOUSE interface -----------------*/
+
+Mouse::Mouse(CGEEngine *vm) : Sprite(vm, NULL), _busy(NULL), _hold(NULL), _hx(0), _vm(vm) {
+ _hold = NULL;
+ _hx = 0;
+ _hy = 0;
+ _exist = true;
+ _buttons = 0;
+ _busy = NULL;
+ _active = false;
+ _flags._kill = false;
+
+ const Seq ms[] = {
+ { 0, 0, 0, 0, 1 },
+ { 1, 1, 0, 0, 1 }
+ };
+ Seq *seq = (Seq *)malloc(2 * sizeof(Seq));
+ Common::copy(ms, ms + 2, seq);
+ setSeq(seq);
+
+ BitmapPtr *MC = new BitmapPtr[3];
+ MC[0] = new Bitmap(_vm, "MOUSE");
+ MC[1] = new Bitmap(_vm, "DUMMY");
+ MC[2] = NULL;
+ setShapeList(MC);
+
+ gotoxy(kScrWidth / 2, kScrHeight / 2);
+ _z = 127;
+ step(1);
+}
+
+Mouse::~Mouse() {
+ off();
+}
+
+void Mouse::on() {
+ if (_seqPtr && _exist) {
+ _active = true;
+ step(0);
+ if (_busy)
+ _busy->step(0);
+ }
+}
+
+void Mouse::off() {
+ if (_seqPtr == 0) {
+ if (_exist) {
+ _active = false;
+ }
+
+ step(1);
+ if (_busy)
+ _busy->step(1);
+ }
+}
+
+void Mouse::newMouse(Common::Event &event) {
+ if (!_active)
+ return;
+
+ CGEEvent &evt = _vm->_eventManager->getNextEvent();
+ evt._x = event.mouse.x;
+ evt._y = event.mouse.y;
+ evt._spritePtr = _vm->spriteAt(evt._x, evt._y);
+
+ switch (event.type) {
+ case Common::EVENT_MOUSEMOVE:
+ evt._mask = kMouseRoll;
+ break;
+ case Common::EVENT_LBUTTONDOWN:
+ evt._mask = kMouseLeftDown;
+ _buttons |= 1;
+ break;
+ case Common::EVENT_LBUTTONUP:
+ evt._mask = kMouseLeftUp;
+ _buttons &= ~1;
+ break;
+ case Common::EVENT_RBUTTONDOWN:
+ evt._mask = kMouseRightDown;
+ _buttons |= 2;
+ break;
+ case Common::EVENT_RBUTTONUP:
+ evt._mask = kMouseRightUp;
+ _buttons &= ~2;
+ break;
+ default:
+ break;
+ }
+}
+
+/*----------------- EventManager interface -----------------*/
+
+EventManager::EventManager(CGEEngine *vm) : _vm(vm){
+ _quitFlag = false;
+ _eventQueueHead = 0;
+ _eventQueueTail = 0;
+ memset(&_eventQueue, 0, kEventMax * sizeof(CGEEvent));
+ memset(&_event, 0, sizeof(Common::Event));
+}
+
+void EventManager::poll() {
+ while (g_system->getEventManager()->pollEvent(_event)) {
+ switch (_event.type) {
+ case Common::EVENT_QUIT:
+ // Signal to quit
+ _quitFlag = true;
+ return;
+ case Common::EVENT_KEYDOWN:
+ case Common::EVENT_KEYUP:
+ // Handle keyboard events
+ _vm->_keyboard->newKeyboard(_event);
+ handleEvents();
+ break;
+ case Common::EVENT_MOUSEMOVE:
+ case Common::EVENT_LBUTTONDOWN:
+ case Common::EVENT_LBUTTONUP:
+ case Common::EVENT_RBUTTONDOWN:
+ case Common::EVENT_RBUTTONUP:
+ // Handle mouse events
+ _vm->_mouse->newMouse(_event);
+ handleEvents();
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void EventManager::handleEvents() {
+ while (_eventQueueTail != _eventQueueHead) {
+ CGEEvent e = _eventQueue[_eventQueueTail];
+ if (e._mask) {
+ if (_vm->_mouse->_hold && e._spritePtr != _vm->_mouse->_hold)
+ _vm->_mouse->_hold->touch(e._mask | kEventAttn, e._x - _vm->_mouse->_hold->_x, e._y - _vm->_mouse->_hold->_y);
+
+ // update mouse cursor position
+ if (e._mask & kMouseRoll)
+ _vm->_mouse->gotoxy(e._x, e._y);
+
+ // activate current touched SPRITE
+ if (e._spritePtr) {
+ if (e._mask & kEventKeyb)
+ e._spritePtr->touch(e._mask, e._x, e._y);
+ else
+ e._spritePtr->touch(e._mask, e._x - e._spritePtr->_x, e._y - e._spritePtr->_y);
+ } else if (_vm->_sys)
+ _vm->_sys->touch(e._mask, e._x, e._y);
+
+ if (e._mask & kMouseLeftDown) {
+ _vm->_mouse->_hold = e._spritePtr;
+ if (_vm->_mouse->_hold) {
+ _vm->_mouse->_hold->_flags._hold = true;
+
+ if (_vm->_mouse->_hold->_flags._drag) {
+ _vm->_mouse->_hx = e._x - _vm->_mouse->_hold->_x;
+ _vm->_mouse->_hy = e._y - _vm->_mouse->_hold->_y;
+ }
+ }
+ }
+
+ if (e._mask & kMouseLeftUp) {
+ if (_vm->_mouse->_hold) {
+ _vm->_mouse->_hold->_flags._hold = false;
+ _vm->_mouse->_hold = NULL;
+ }
+ }
+ ///Touched = e.Ptr;
+
+ // discard Text if button released
+ if (e._mask & (kMouseLeftUp | kMouseRightUp))
+ _vm->killText();
+ }
+ _eventQueueTail = (_eventQueueTail + 1) % kEventMax;
+ }
+ if (_vm->_mouse->_hold) {
+ if (_vm->_mouse->_hold->_flags._drag)
+ _vm->_mouse->_hold->gotoxy(_vm->_mouse->_x - _vm->_mouse->_hx, _vm->_mouse->_y - _vm->_mouse->_hy);
+ }
+}
+
+void EventManager::clearEvent(Sprite *spr) {
+ if (spr) {
+ for (uint16 e = _eventQueueTail; e != _eventQueueHead; e = (e + 1) % kEventMax)
+ if (_eventQueue[e]._spritePtr == spr)
+ _eventQueue[e]._mask = 0;
+ } else
+ _eventQueueTail = _eventQueueHead;
+}
+
+CGEEvent &EventManager::getNextEvent() {
+ CGEEvent &evt = _eventQueue[_eventQueueHead];
+ _eventQueueHead = (_eventQueueHead + 1) % kEventMax;
+
+ return evt;
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/events.h b/engines/cge/events.h
new file mode 100644
index 0000000000..a4cdfed793
--- /dev/null
+++ b/engines/cge/events.h
@@ -0,0 +1,154 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_EVENTS_H
+#define CGE_EVENTS_H
+
+#include "common/events.h"
+#include "cge/game.h"
+#include "cge/talk.h"
+#include "cge/vga13h.h"
+
+namespace CGE {
+
+/*----------------- KEYBOARD interface -----------------*/
+
+#define kKeyCtrl 29
+#define kKeyAlt 56
+#define kEventMax 256
+
+enum EventMask {
+ kMouseRoll = 1 << 0,
+ kMouseLeftDown = 1 << 1,
+ kMouseLeftUp = 1 << 2,
+ kMouseRightDown = 1 << 3,
+ kMouseRightUp = 1 << 4,
+ kEventAttn = 1 << 5,
+ kEventKeyb = 1 << 7
+};
+
+enum Keys {
+ NoKey = 0, CtrlA, CtrlB, CtrlC, CtrlD, CtrlE, CtrlF, CtrlG, CtrlH,
+ CtrlI, CtrlJ, CtrlK, CtrlL, CtrlM, CtrlN, CtrlO, CtrlP,
+ CtrlQ, CtrlR, CtrlS, CtrlT, CtrlU, CtrlV, CtrlW, CtrlX,
+ CtrlY, CtrlZ,
+ BSp = 8, Tab,
+ Enter = 13,
+ Eof = 26, Esc,
+ AltQ = 256 + 16, AltW, AltE, AltR, AltT, AltY, AltU, AltI, AltO, AltP,
+ AltA = 256 + 30, AltS, AltD, AltF, AltG, AltH, AltJ, AltK, AltL,
+ AltZ = 256 + 44, AltX, AltC, AltV, AltB, AltN, AltM,
+ F11 = 256 + 87, F12,
+ F1 = 256 + 59, F2, F3, F4, F5, F6, F7, F8, F9, F10,
+ ShiftTab = 256 + 15,
+ ShiftF1 = 256 + 84, ShiftF2, ShiftF3, ShiftF4, ShiftF5,
+ ShiftF6, ShiftF7, ShiftF8, ShiftF9, ShiftF10,
+ CtrlF1 = 256 + 94, CtrlF2, CtrlF3, CtrlF4, CtrlF5,
+ CtrlF6, CtrlF7, CtrlF8, CtrlF9, CtrlF10,
+ AltF1 = 256 + 104, AltF2, AltF3, AltF4, AltF5,
+ AltF6, AltF7, AltF8, AltF9, AltF10,
+ Home = 256 + 71, Up, PgUp,
+ Left = 256 + 75, Ctr, Right,
+ End = 256 + 79, Down, PgDn, Ins, Del,
+ CtrlLeft = 256 + 115, CtrlRight, CtrlEnd, CtrlPgDn, CtrlHome,
+ CtrlPgUp = 256 + 132,
+ MouseLeft = 512 + 1, MouseRight,
+ TwiceLeft = 512 + 256 + 1, TwiceRight
+};
+
+class Keyboard {
+private:
+ bool getKey(Common::Event &event, int &cgeCode);
+ uint16 _current;
+ CGEEngine *_vm;
+public:
+ static const uint16 _code[0x60];
+ static const uint16 _scummVmCodes[0x60];
+
+ Sprite *_client;
+ bool _key[0x60];
+
+ void newKeyboard(Common::Event &event);
+ uint16 lastKey();
+ Sprite *setClient(Sprite *spr);
+
+ Keyboard(CGEEngine *vm);
+ ~Keyboard();
+};
+
+/*----------------- MOUSE interface -----------------*/
+
+struct CGEEvent {
+ uint16 _mask;
+ uint16 _x;
+ uint16 _y;
+ Sprite *_spritePtr;
+};
+
+class Mouse : public Sprite {
+public:
+ Sprite *_hold;
+ bool _active;
+ int _hx;
+ int _hy;
+ bool _exist;
+ int _buttons;
+ Sprite *_busy;
+ //Sprite *Touched;
+ Mouse(CGEEngine *vm);
+ ~Mouse();
+ void on();
+ void off();
+ void newMouse(Common::Event &event);
+private:
+ CGEEngine *_vm;
+};
+
+/*----------------- EventManager interface -----------------*/
+
+class EventManager {
+private:
+ CGEEngine *_vm;
+ Common::Event _event;
+ CGEEvent _eventQueue[kEventMax];
+ uint16 _eventQueueHead;
+ uint16 _eventQueueTail;
+
+ void handleEvents();
+public:
+ bool _quitFlag;
+
+ EventManager(CGEEngine *vm);
+ void poll();
+ void clearEvent(Sprite *spr);
+
+ CGEEvent &getNextEvent();
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/fileio.cpp b/engines/cge/fileio.cpp
new file mode 100644
index 0000000000..6db0818287
--- /dev/null
+++ b/engines/cge/fileio.cpp
@@ -0,0 +1,240 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "common/system.h"
+#include "common/str.h"
+#include "common/debug.h"
+#include "common/debug-channels.h"
+#include "common/memstream.h"
+#include "cge/cge.h"
+#include "cge/fileio.h"
+
+namespace CGE {
+
+/*-----------------------------------------------------------------------
+ * BtPage
+ *-----------------------------------------------------------------------*/
+void BtPage::readBTree(Common::ReadStream &s) {
+ _header._count = s.readUint16LE();
+ _header._down = s.readUint16LE();
+
+ if (_header._down == kBtValNone) {
+ // Leaf list
+ for (int i = 0; i < kBtLeafCount; ++i) {
+ s.read(_leaf[i]._key, kBtKeySize);
+ _leaf[i]._pos = s.readUint32LE();
+ _leaf[i]._size = s.readUint16LE();
+ }
+ } else {
+ // Root index
+ for (int i = 0; i < kBtInnerCount; ++i) {
+ s.read(_inner[i]._key, kBtKeySize);
+ _inner[i]._down = s.readUint16LE();
+ }
+ }
+}
+
+/*-----------------------------------------------------------------------
+ * ResourceManager
+ *-----------------------------------------------------------------------*/
+ResourceManager::ResourceManager() {
+ debugC(1, kCGEDebugFile, "ResourceManager::ResourceManager()");
+
+ _datFile = new Common::File();
+ _datFile->open(kDatName);
+
+ _catFile = new Common::File();
+ _catFile->open(kCatName);
+
+ if ((!_datFile) || (!_catFile))
+ error("Unable to open data files");
+
+ for (int i = 0; i < kBtLevel; i++) {
+ _buff[i]._page = new BtPage;
+ _buff[i]._pageNo = kBtValNone;
+ _buff[i]._index = -1;
+ assert(_buff[i]._page != NULL);
+ }
+}
+
+ResourceManager::~ResourceManager() {
+ debugC(1, kCGEDebugFile, "ResourceManager::~ResourceManager()");
+ _datFile->close();
+ delete _datFile;
+
+ _catFile->close();
+ delete _catFile;
+
+ for (int i = 0; i < kBtLevel; i++)
+ delete _buff[i]._page;
+}
+
+uint16 ResourceManager::XCrypt(void *buf, uint16 length) {
+ byte *b = static_cast<byte *>(buf);
+
+ for (uint16 i = 0; i < length; i++)
+ *b++ ^= kCryptSeed;
+
+ return kCryptSeed;
+}
+
+bool ResourceManager::seek(int32 offs, int whence) {
+ return _datFile->seek(offs, whence);
+}
+
+uint16 ResourceManager::read(void *buf, uint16 length) {
+ if (!_datFile->isOpen())
+ return 0;
+
+ uint16 bytesRead = _datFile->read(buf, length);
+ if (!bytesRead)
+ error("Read %s - %d bytes", _datFile->getName(), length);
+ XCrypt(buf, length);
+ return bytesRead;
+}
+
+BtPage *ResourceManager::getPage(int level, uint16 pageId) {
+ debugC(1, kCGEDebugFile, "IoHand::getPage(%d, %d)", level, pageId);
+
+ if (_buff[level]._pageNo != pageId) {
+ int32 pos = pageId * kBtSize;
+ _buff[level]._pageNo = pageId;
+ assert(_catFile->size() > pos);
+ // In the original, there was a check verifying if the
+ // purpose was to write a new file. This should only be
+ // to create a new file, thus it was removed.
+ _catFile->seek(pageId * kBtSize, SEEK_SET);
+
+ // Read in the page
+ byte buffer[kBtSize];
+ int bytesRead = catRead(buffer, kBtSize);
+
+ // Unpack it into the page structure
+ Common::MemoryReadStream stream(buffer, bytesRead, DisposeAfterUse::NO);
+ _buff[level]._page->readBTree(stream);
+ _buff[level]._index = -1;
+ }
+ return _buff[level]._page;
+}
+
+BtKeypack *ResourceManager::find(const char *key) {
+ debugC(1, kCGEDebugFile, "IoHand::find(%s)", key);
+
+ int lev = 0;
+ uint16 nxt = kBtValRoot;
+ while (!_catFile->eos()) {
+ BtPage *pg = getPage(lev, nxt);
+ // search
+ if (pg->_header._down != kBtValNone) {
+ int i;
+ for (i = 0; i < pg->_header._count; i++) {
+ // Does this work, or does it have to compare the entire buffer?
+ if (scumm_strnicmp((const char *)key, (const char*)pg->_inner[i]._key, kBtKeySize) < 0)
+ break;
+ }
+ nxt = (i) ? pg->_inner[i - 1]._down : pg->_header._down;
+ _buff[lev]._index = i - 1;
+ lev++;
+ } else {
+ int i;
+ for (i = 0; i < pg->_header._count - 1; i++) {
+ if (scumm_stricmp((const char *)key, (const char *)pg->_leaf[i]._key) <= 0)
+ break;
+ }
+ _buff[lev]._index = i;
+ return &pg->_leaf[i];
+ }
+ }
+ return NULL;
+}
+
+bool ResourceManager::exist(const char *name) {
+ debugC(1, kCGEDebugFile, "ResourceManager::exist(%s)", name);
+
+ return scumm_stricmp(find(name)->_key, name) == 0;
+}
+
+uint16 ResourceManager::catRead(void *buf, uint16 length) {
+ if (!_catFile->isOpen())
+ return 0;
+
+ uint16 bytesRead = _catFile->read(buf, length);
+ if (!bytesRead)
+ error("Read %s - %d bytes", _catFile->getName(), length);
+ XCrypt(buf, length);
+ return bytesRead;
+}
+
+/*-----------------------------------------------------------------------
+ * EncryptedStream
+ *-----------------------------------------------------------------------*/
+EncryptedStream::EncryptedStream(CGEEngine *vm, const char *name) : _vm(vm) {
+ debugC(3, kCGEDebugFile, "EncryptedStream::EncryptedStream(%s)", name);
+
+ _error = false;
+ BtKeypack *kp = _vm->_resman->find(name);
+ if (scumm_stricmp(kp->_key, name) != 0)
+ _error = true;
+
+ _vm->_resman->seek(kp->_pos);
+ byte *dataBuffer = (byte *)malloc(kp->_size);
+ _vm->_resman->read(dataBuffer, kp->_size);
+ _readStream = new Common::MemoryReadStream(dataBuffer, kp->_size, DisposeAfterUse::YES);
+}
+
+uint32 EncryptedStream::read(void *dataPtr, uint32 dataSize) {
+ return _readStream->read(dataPtr, dataSize);
+}
+
+bool EncryptedStream::err() {
+ return (_error & _readStream->err());
+}
+
+bool EncryptedStream::eos() {
+ return _readStream->eos();
+}
+
+bool EncryptedStream::seek(int32 offset) {
+ return _readStream->seek(offset);
+}
+
+Common::String EncryptedStream::readLine() {
+ return _readStream->readLine();
+}
+
+int32 EncryptedStream::size() {
+ return _readStream->size();
+}
+
+int32 EncryptedStream::pos() {
+ return _readStream->pos();
+}
+
+EncryptedStream::~EncryptedStream() {
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/fileio.h b/engines/cge/fileio.h
new file mode 100644
index 0000000000..cee1fa79ef
--- /dev/null
+++ b/engines/cge/fileio.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.
+ *
+ */
+
+/*
+ * This code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_FILEIO_H
+#define CGE_FILEIO_H
+
+#include "cge/general.h"
+#include "common/stream.h"
+
+namespace CGE {
+
+class CGEEngine;
+
+#define kBtSize 1024
+#define kBtKeySize 13
+#define kBtLevel 2
+#define kBtInnerCount ((kBtSize - 4 /*sizeof(Hea) */) / (kBtKeySize + 2 /*sizeof(Inner) */))
+#define kBtLeafCount ((kBtSize - 4 /*sizeof(Hea) */) / (kBtKeySize + 4 + 2 /*sizeof(BtKeypack) */))
+#define kBtValNone 0xFFFF
+#define kBtValRoot 0
+#define kCatName "VOL.CAT"
+#define kDatName "VOL.DAT"
+
+struct BtKeypack {
+ char _key[kBtKeySize];
+ uint32 _pos;
+ uint16 _size;
+};
+
+struct Inner {
+ uint8 _key[kBtKeySize];
+ uint16 _down;
+};
+
+struct Header {
+ uint16 _count;
+ uint16 _down;
+};
+
+struct BtPage {
+ Header _header;
+ union {
+ // dummy filler to make proper size of union
+ uint8 _data[kBtSize - 4]; /* 4 is the size of struct Header */
+ // inner version of data: key + word-sized page link
+ Inner _inner[kBtInnerCount];
+ // leaf version of data: key + all user data
+ BtKeypack _leaf[kBtLeafCount];
+ };
+
+ void readBTree(Common::ReadStream &s);
+};
+
+class ResourceManager {
+ struct {
+ BtPage *_page;
+ uint16 _pageNo;
+ int _index;
+ } _buff[kBtLevel];
+
+ BtPage *getPage(int level, uint16 pageId);
+ uint16 catRead(void *buf, uint16 length);
+ Common::File *_catFile;
+ Common::File *_datFile;
+ uint16 XCrypt(void *buf, uint16 length);
+public:
+
+ ResourceManager();
+ ~ResourceManager();
+ uint16 read(void *buf, uint16 length);
+ bool seek(int32 offs, int whence = 0);
+
+ BtKeypack *find(const char *key);
+ bool exist(const char *name);
+};
+
+class EncryptedStream {
+private:
+ CGEEngine *_vm;
+ Common::SeekableReadStream *_readStream;
+ bool _error;
+public:
+ EncryptedStream(CGEEngine *vm, const char *name);
+ ~EncryptedStream();
+ bool err();
+ bool eos();
+ bool seek(int32 offset);
+ int32 pos();
+ int32 size();
+ uint32 read(void *dataPtr, uint32 dataSize);
+ Common::String readLine();
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/game.cpp b/engines/cge/game.cpp
new file mode 100644
index 0000000000..851f6c59fb
--- /dev/null
+++ b/engines/cge/game.cpp
@@ -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.
+ *
+ */
+
+/*
+ * This code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/game.h"
+#include "cge/events.h"
+
+namespace CGE {
+
+Fly::Fly(CGEEngine *vm, Bitmap **shpl)
+ : Sprite(vm, shpl), _tx(0), _ty(0), _vm(vm) {
+ step(_vm->newRandom(2));
+ gotoxy(kFlyL + _vm->newRandom(kFlyR - kFlyL - _w), kFlyT + _vm->newRandom(kFlyB - kFlyT - _h));
+}
+
+void Fly::tick() {
+ step();
+ if (_flags._kept)
+ return;
+ if (_vm->newRandom(10) < 1) {
+ _tx = _vm->newRandom(3) - 1;
+ _ty = _vm->newRandom(3) - 1;
+ }
+ if (_x + _tx < kFlyL || _x + _tx + _w > kFlyR)
+ _tx = -_tx;
+ if (_y + _ty < kFlyT || _y + _ty + _h > kFlyB)
+ _ty = -_ty;
+ gotoxy(_x + _tx, _y + _ty);
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/game.h b/engines/cge/game.h
new file mode 100644
index 0000000000..4d5acf7371
--- /dev/null
+++ b/engines/cge/game.h
@@ -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.
+ *
+ */
+
+/*
+ * This code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_GAME_H
+#define CGE_GAME_H
+
+#include "cge/vga13h.h"
+
+namespace CGE {
+
+enum {
+ kFlyL = 20,
+ kFlyT = 40,
+ kFlyR = 110,
+ kFlyB = 100
+};
+
+class Fly : public Sprite {
+private:
+ CGEEngine *_vm;
+public:
+ int _tx, _ty;
+ Fly(CGEEngine *vm, Bitmap **shpl);
+ void tick();
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/general.h b/engines/cge/general.h
new file mode 100644
index 0000000000..9e3fc7f249
--- /dev/null
+++ b/engines/cge/general.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.
+ *
+ */
+
+/*
+ * This code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_GENERAL_H
+#define CGE_GENERAL_H
+
+#include "common/file.h"
+
+namespace CGE {
+
+struct Dac {
+ uint8 _r;
+ uint8 _g;
+ uint8 _b;
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/module.mk b/engines/cge/module.mk
new file mode 100644
index 0000000000..5745aa5d48
--- /dev/null
+++ b/engines/cge/module.mk
@@ -0,0 +1,30 @@
+MODULE := engines/cge
+
+MODULE_OBJS := \
+ bitmap.o \
+ cge.o \
+ cge_main.o \
+ console.o \
+ detection.o \
+ events.o \
+ fileio.o \
+ game.o \
+ snail.o \
+ sound.o \
+ talk.o \
+ text.o \
+ vga13h.o \
+ vmenu.o \
+ walk.o
+
+MODULE_DIRS += \
+ engines/cge
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_CGE), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
+
diff --git a/engines/cge/snail.cpp b/engines/cge/snail.cpp
new file mode 100644
index 0000000000..cbc463ced2
--- /dev/null
+++ b/engines/cge/snail.cpp
@@ -0,0 +1,1254 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/general.h"
+#include "cge/sound.h"
+#include "cge/snail.h"
+#include "cge/vga13h.h"
+#include "cge/text.h"
+#include "cge/cge_main.h"
+#include "cge/events.h"
+#include "cge/walk.h"
+
+namespace CGE {
+
+const char *CommandHandler::_commandText[] = {
+ "LABEL", "PAUSE", "WAIT", "LEVEL", "HIDE",
+ "SAY", "INF", "TIME", "CAVE", "KILL",
+ "RSEQ", "SEQ", "SEND", "SWAP", "KEEP",
+ "GIVE", "IF", "GAME", "SETX0", "SETY0",
+ "SLAVE", "SETXY", "RELX", "RELY", "RELZ",
+ "SETX", "SETY", "SETZ", "TRANS", "PORT",
+ "NEXT", "NNEXT", "TNEXT", "RNNEXT", "RTNEXT",
+ "RMNEAR", "RMTAKE", "FLAG", "SETREF", "BACKPT",
+ "FLASH", "LIGHT", "SETHB", "SETVB", "WALK",
+ "REACH", "COVER", "UNCOVER", "CLEAR", "TALK",
+ "MOUSE", "SOUND", "COUNT", NULL
+};
+
+CommandHandler::CommandHandler(CGEEngine *vm, bool turbo)
+ : _turbo(turbo), _busy(false), _textDelay(false),
+ _timerExpiry(0), _talkEnable(true),
+ _head(0), _tail(0), _commandList((Command *)malloc(sizeof(Command) * 256)), _vm(vm) {
+}
+
+CommandHandler::~CommandHandler() {
+ free(_commandList);
+}
+
+/**
+ * Add a Command on the head of _commandList
+ * @param com Command
+ * @param ref Reference
+ * @param val Value
+ * @param ptr Sprite pointer
+ */
+void CommandHandler::addCommand(CommandType com, int ref, int val, void *ptr) {
+ Command *headCmd = &_commandList[_head++];
+ headCmd->_commandType = com;
+ headCmd->_ref = ref;
+ headCmd->_val = val;
+ headCmd->_spritePtr = ptr;
+ headCmd->_cbType = kNullCB;
+ if (headCmd->_commandType == kCmdClear) {
+ _tail = _head;
+ _vm->killText();
+ _timerExpiry = 0;
+ }
+}
+
+/**
+ * Add a Callback on the head of _commandList
+ * @param com Command
+ * @param ref Reference
+ * @param val Value
+ * @param CallbackType Callback type
+ */
+void CommandHandler::addCallback(CommandType com, int ref, int val, CallbackType cbType) {
+ Command *headCmd = &_commandList[_head++];
+ headCmd->_commandType = com;
+ headCmd->_ref = ref;
+ headCmd->_val = val;
+ headCmd->_spritePtr = NULL;
+ headCmd->_cbType = cbType;
+ if (headCmd->_commandType == kCmdClear) {
+ _tail = _head;
+ _vm->killText();
+ _timerExpiry = 0;
+ }
+}
+
+/**
+ * Add a Command on the tail of _commandList
+ * @param com Command
+ * @param ref Reference
+ * @param val Value
+ * @param ptr Sprite pointer
+ */
+void CommandHandler::insertCommand(CommandType com, int ref, int val, void *ptr) {
+ Command *tailCmd;
+
+ if (_busy) {
+ _commandList[(_tail - 1) & 0xFF] = _commandList[_tail];
+ tailCmd = &_commandList[_tail];
+ } else
+ tailCmd = &_commandList[(_tail - 1) & 0xFF];
+ _tail--;
+ tailCmd->_commandType = com;
+ tailCmd->_ref = ref;
+ tailCmd->_val = val;
+ tailCmd->_spritePtr = ptr;
+ tailCmd->_cbType = kNullCB;
+ if (tailCmd->_commandType == kCmdClear) {
+ _tail = _head;
+ _vm->killText();
+ _timerExpiry = 0;
+ }
+}
+
+void CommandHandler::runCommand() {
+ if (_busy)
+ return;
+
+ _busy = true;
+ uint8 tmpHead = _head;
+ while (_tail != tmpHead) {
+ Command *tailCmd = &_commandList[_tail];
+
+ if (!_turbo) { // only for the slower one
+ if (_timerExpiry) {
+ // Delay in progress
+ if (_timerExpiry > g_system->getMillis())
+ // Delay not yet ended
+ break;
+
+ // Delay is finished
+ _timerExpiry = 0;
+ } else {
+ if (_textDelay) {
+ _vm->killText();
+ _textDelay = false;
+ }
+ }
+ if (_vm->_talk && tailCmd->_commandType != kCmdPause)
+ break;
+ }
+
+ Sprite *spr = ((tailCmd->_ref >= 0) ? _vm->locate(tailCmd->_ref) : ((Sprite *) tailCmd->_spritePtr));
+ switch (tailCmd->_commandType) {
+ case kCmdLabel:
+ break;
+ case kCmdPause:
+ _timerExpiry = g_system->getMillis() + tailCmd->_val * kCommandFrameDelay;
+ if (_vm->_talk)
+ _textDelay = true;
+ break;
+ case kCmdWait:
+ if (spr) {
+ if (spr->seqTest(tailCmd->_val) &&
+ (tailCmd->_val >= 0 || spr != _vm->_hero || _vm->_hero->_tracePtr < 0)) {
+ _timerExpiry = g_system->getMillis() + spr->_time * kCommandFrameDelay;
+ } else {
+ _busy = false;
+ return;
+ }
+ }
+ break;
+ case kCmdLevel:
+ _vm->snLevel(spr, tailCmd->_val);
+ break;
+ case kCmdHide:
+ _vm->snHide(spr, tailCmd->_val);
+ break;
+ case kCmdSay:
+ if (spr && _talkEnable) {
+ if (spr == _vm->_hero && spr->seqTest(-1))
+ spr->step(kSeqHTalk);
+ _vm->_text->say(_vm->_text->getText(tailCmd->_val), spr);
+ _vm->_sys->_funDel = kHeroFun0;
+ }
+ break;
+ case kCmdInf:
+ if (_talkEnable) {
+ _vm->inf(_vm->_text->getText(tailCmd->_val));
+ _vm->_sys->_funDel = kHeroFun0;
+ }
+ break;
+ case kCmdTime:
+ if (spr && _talkEnable) {
+ if (spr == _vm->_hero && spr->seqTest(-1))
+ spr->step(kSeqHTalk);
+ _vm->_text->sayTime(spr);
+ }
+ break;
+ case kCmdCave:
+ _vm->switchScene(tailCmd->_val);
+ break;
+ case kCmdKill:
+ _vm->snKill(spr);
+ break;
+ case kCmdSeq:
+ _vm->snSeq(spr, tailCmd->_val);
+ break;
+ case kCmdRSeq:
+ _vm->snRSeq(spr, tailCmd->_val);
+ break;
+ case kCmdSend:
+ _vm->snSend(spr, tailCmd->_val);
+ break;
+ case kCmdSwap:
+ _vm->snSwap(spr, tailCmd->_val);
+ break;
+ case kCmdCover:
+ _vm->snCover(spr, tailCmd->_val);
+ break;
+ case kCmdUncover:
+ _vm->snUncover(spr, (tailCmd->_val >= 0) ? _vm->locate(tailCmd->_val) : ((Sprite *) tailCmd->_spritePtr));
+ break;
+ case kCmdKeep:
+ _vm->snKeep(spr, tailCmd->_val);
+ break;
+ case kCmdGive:
+ _vm->snGive(spr, tailCmd->_val);
+ break;
+ case kCmdGame:
+ _vm->snGame(spr, tailCmd->_val);
+ break;
+ case kCmdSetX0:
+ _vm->snSetX0(tailCmd->_ref, tailCmd->_val);
+ break;
+ case kCmdSetY0:
+ _vm->snSetY0(tailCmd->_ref, tailCmd->_val);
+ break;
+ case kCmdSetXY:
+ _vm->snSetXY(spr, tailCmd->_val);
+ break;
+ case kCmdRelX:
+ _vm->snRelX(spr, tailCmd->_val);
+ break;
+ case kCmdRelY:
+ _vm->snRelY(spr, tailCmd->_val);
+ break;
+ case kCmdRelZ:
+ _vm->snRelZ(spr, tailCmd->_val);
+ break;
+ case kCmdSetX:
+ _vm->snSetX(spr, tailCmd->_val);
+ break;
+ case kCmdSetY:
+ _vm->snSetY(spr, tailCmd->_val);
+ break;
+ case kCmdSetZ:
+ _vm->snSetZ(spr, tailCmd->_val);
+ break;
+ case kCmdSlave:
+ _vm->snSlave(spr, tailCmd->_val);
+ break;
+ case kCmdTrans:
+ _vm->snTrans(spr, tailCmd->_val);
+ break;
+ case kCmdPort:
+ _vm->snPort(spr, tailCmd->_val);
+ break;
+ case kCmdNext:
+ case kCmdIf:
+ case kCmdTalk:
+ break;
+ case kCmdMouse:
+ _vm->snMouse(tailCmd->_val != 0);
+ break;
+ case kCmdNNext:
+ _vm->snNNext(spr, tailCmd->_val);
+ break;
+ case kCmdTNext:
+ _vm->snTNext(spr, tailCmd->_val);
+ break;
+ case kCmdRNNext:
+ _vm->snRNNext(spr, tailCmd->_val);
+ break;
+ case kCmdRTNext:
+ _vm->snRTNext(spr, tailCmd->_val);
+ break;
+ case kCmdRMNear:
+ _vm->snRmNear(spr);
+ break;
+ case kCmdRmTake:
+ _vm->snRmTake(spr);
+ break;
+ case kCmdFlag:
+ _vm->snFlag(tailCmd->_ref & 3, tailCmd->_val != 0);
+ break;
+ case kCmdSetRef:
+ _vm->snSetRef(spr, tailCmd->_val);
+ break;
+ case kCmdBackPt:
+ _vm->snBackPt(spr, tailCmd->_val);
+ break;
+ case kCmdFlash:
+ _vm->snFlash(tailCmd->_val != 0);
+ break;
+ case kCmdLight:
+ _vm->snLight(tailCmd->_val != 0);
+ break;
+ case kCmdSetHBarrier:
+ _vm->snHBarrier(tailCmd->_ref, tailCmd->_val);
+ break;
+ case kCmdSetVBarrier:
+ _vm->snVBarrier(tailCmd->_ref, tailCmd->_val);
+ break;
+ case kCmdWalk:
+ _vm->snWalk(spr, tailCmd->_ref, tailCmd->_val);
+ break;
+ case kCmdReach:
+ _vm->snReach(spr, tailCmd->_val);
+ break;
+ case kCmdSound:
+ _vm->snSound(spr, tailCmd->_val);
+ break;
+ case kCmdCount:
+ _vm->_sound->setRepeat(tailCmd->_val);
+ break;
+ case kCmdExec:
+ switch (tailCmd->_cbType) {
+ case kQGame:
+ _vm->qGame();
+ break;
+ case kMiniStep:
+ _vm->miniStep(tailCmd->_val);
+ break;
+ case kXScene:
+ _vm->xScene();
+ break;
+ case kSoundSetVolume:
+ _vm->sndSetVolume();
+ break;
+ default:
+ error("Unknown Callback Type in SNEXEC");
+ }
+ break;
+ case kCmdStep:
+ spr->step();
+ break;
+ case kCmdZTrim:
+ _vm->snZTrim(spr);
+ break;
+ case kCmdGhost:
+ _vm->snGhost((Bitmap *) tailCmd->_spritePtr);
+ break;
+ default:
+ warning("Unhandled snc->_com in SNMouse(bool)");
+ break;
+ }
+ _tail++;
+ if (!_turbo)
+ break;
+ }
+
+ _busy = false;
+}
+
+bool CommandHandler::idle() {
+ return (_head == _tail);
+}
+
+/**
+ * Handles mini-Games logic
+ * @param com Command
+ * @param num mini game number
+ */
+void CGEEngine::snGame(Sprite *spr, int num) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snGame(spr, %d)", num);
+
+ switch (num) {
+ case 1: {
+ static Sprite *dup[3] = { NULL, NULL, NULL };
+ int buref = 0;
+ int Stage = 0;
+
+ for (dup[0] = _vga->_showQ->first(); dup[0]; dup[0] = dup[0]->_next) {
+ buref = dup[0]->_ref;
+ if (buref / 1000 == 16 && buref % 100 == 6) {
+ Stage = (buref / 100) % 10;
+ break;
+ }
+ }
+ if (dup[1] == NULL) {
+ dup[1] = _vga->_showQ->locate(16003); // pan
+ dup[2] = _vga->_showQ->locate(16004); // pani
+ }
+
+ if (_game) { // continue game
+ int i = newRandom(3), hand = (dup[0]->_shpCnt == 6);
+ Stage++;
+ if (hand && Stage > kDressed)
+ ++hand;
+ if (i >= 0 || (dup[i] == spr && newRandom(3) == 0)) {
+ _commandHandler->addCommand(kCmdSeq, -1, 3, dup[0]); // Yes
+ _commandHandler->addCommand(kCmdSeq, -1, 3, dup[1]); // Yes
+ _commandHandler->addCommand(kCmdSeq, -1, 3, dup[2]); // Yes
+ _commandHandler->addCommand(kCmdTNext, -1, 0, dup[0]); // Reset Take
+ _commandHandler->addCommand(kCmdTNext, -1, 0, dup[1]); // Reset Take
+ _commandHandler->addCommand(kCmdTNext, -1, 0, dup[2]); // Reset Take
+ _commandHandler->addCommand(kCmdNNext, -1, 0, dup[0]); // Reset Near
+ _commandHandler->addCommand(kCmdPause, -1, 72, NULL); // Pause the game for 72/80 second
+ _commandHandler->addCommand(kCmdSay, 1, 16009, NULL); // Say "I win.."
+ _commandHandler->addCommand(kCmdSay, buref, 16010, NULL); // Say "Go Sit..."
+ _commandHandler->addCommand(kCmdSay, 1, 16011, NULL); // Say "I prefer not"
+
+ if (hand) {
+ _commandHandler->addCommand(kCmdSend, 16060 + hand, 16, NULL); // Give hand
+ _commandHandler->addCommand(kCmdSeq, buref, 4, NULL); // Take off
+ _commandHandler->addCommand(kCmdSeq, 16060 + hand, 1, NULL); // start one of the Bartender animations
+ _commandHandler->addCommand(kCmdSound, 16060 + hand, 16002, NULL); // Play tear sound
+ _commandHandler->addCommand(kCmdWait, 16060 + hand, 3, NULL); // Take up
+ _commandHandler->addCommand(kCmdSwap, buref, buref + 100, NULL); // Open hand
+ _commandHandler->addCommand(kCmdSeq, 16016, Stage, NULL); // Start Belongings animation
+ _commandHandler->addCommand(kCmdSend, 16060 + hand, -1, NULL); // Hide hand
+ _commandHandler->addCommand(kCmdWait, 16060 + hand, -1, NULL); // Stop moving hand
+ } else {
+ _commandHandler->addCommand(kCmdSeq, buref, 4, NULL); // Take off
+ _commandHandler->addCommand(kCmdSound, 16060 + hand, 16002, NULL); // Play tear sound
+ _commandHandler->addCommand(kCmdWait, buref, -1, NULL); // Will take off
+ _commandHandler->addCommand(kCmdSwap, buref, buref + 100, NULL); // Open hand
+ _commandHandler->addCommand(kCmdSeq, 16016, Stage, NULL); // Start Belongings animation
+ }
+ _commandHandler->addCommand(kCmdPause, -1, 72, NULL); // Pause the game for 72/80 second
+ _commandHandler->addCommand(kCmdSeq, -1, 0, dup[1]); // Get away (Him)
+ _commandHandler->addCommand(kCmdSetXY, -1, 203 + kScrWidth * 49, dup[1]);
+ _commandHandler->addCommand(kCmdSetZ, -1, 7, dup[1]);
+ _commandHandler->addCommand(kCmdSeq, -1, 0, dup[2]); // Get Away (Her)
+ _commandHandler->addCommand(kCmdSetXY, -1, 182 + kScrWidth * 62, dup[2]);
+ _commandHandler->addCommand(kCmdSetZ, -1, 9, dup[2]);
+ _game = 0;
+ return;
+ } else {
+ _commandHandler->addCommand(kCmdSeq, -1, 2, dup[0]); // reset animation sequence
+ _commandHandler->addCommand(kCmdSeq, -1, 2, dup[1]); // reset animation sequence
+ _commandHandler->addCommand(kCmdSeq, -1, 2, dup[2]); // reset animation sequence
+ _commandHandler->addCommand(kCmdPause, -1, 72, NULL); // Pause the game for 72/80 second
+ }
+ }
+ _commandHandler->addCommand(kCmdWalk, 198, 134, NULL); // Go to place
+ _commandHandler->addCommand(kCmdWait, 1, -1, NULL); // Stop moving
+ _commandHandler->addCommand(kCmdCover, 1, 16101, NULL); // Man to beat
+ _commandHandler->addCommand(kCmdSeq, 16101, 1, NULL); // Start Chief animation (16dupnia)
+ _commandHandler->addCommand(kCmdWait, 16101, 5, NULL); // wait
+ _commandHandler->addCommand(kCmdPause, 16101, 24, NULL); // Pause the game for 24/80 second
+ _commandHandler->addCommand(kCmdSeq, 16040, 1, NULL); // Start Slap animation (16plask)
+ _commandHandler->addCommand(kCmdSound, 16101, 16001, NULL); // Play "Slap" sound
+ _commandHandler->addCommand(kCmdPause, 16101, 24, NULL); // Pause the game for 24/80 second
+ _commandHandler->addCommand(kCmdSeq, 16040, 0, NULL); // Reset animation sequence
+ _commandHandler->addCommand(kCmdWait, 16101, -1, NULL); // stay
+ _commandHandler->addCommand(kCmdUncover, 1, 16101, NULL); // SDS
+ if (!_game) {
+ _commandHandler->addCommand(kCmdSay, buref, 16008, NULL); // say "Guess!"
+ _game = true;
+ }
+ }
+ break;
+ case 2:
+ if (_sprTv == NULL) {
+ _sprTv = _vga->_showQ->locate(20700);
+ _sprK1 = _vga->_showQ->locate(20701);
+ _sprK2 = _vga->_showQ->locate(20702);
+ _sprK3 = _vga->_showQ->locate(20703);
+ }
+
+ if (!_game) { // init
+ _commandHandler->addCommand(kCmdGame, 20002, 2, NULL);
+ _game = true;
+ break;
+ }
+
+ // cont
+ _sprK1->step(newRandom(6));
+ _sprK2->step(newRandom(6));
+ _sprK3->step(newRandom(6));
+
+ if (spr->_ref == 1 && _keyboard->_key[kKeyAlt]) {
+ _sprK1->step(5);
+ _sprK2->step(5);
+ _sprK3->step(5);
+ }
+
+ _commandHandler->addCommand(kCmdSetZ, 20700, 0, NULL);
+ bool hit = (_sprK1->_seqPtr + _sprK2->_seqPtr + _sprK3->_seqPtr == 15);
+ if (hit) {
+ if (spr->_ref == 1) {
+ _commandHandler->addCommand(kCmdSay, 1, 20003, NULL); // hurray!
+ _commandHandler->addCommand(kCmdSeq, 20011, 2, NULL); // Camera away
+ _commandHandler->addCommand(kCmdSend, 20701, -1, NULL); // move dice1 to scene -1
+ _commandHandler->addCommand(kCmdSend, 20702, -1, NULL); // move dice2 to scene -1
+ _commandHandler->addCommand(kCmdSend, 20703, -1, NULL); // move dice3 to scene -1
+ _commandHandler->addCommand(kCmdSend, 20700, -1, NULL); // move TV to scene -1
+ _commandHandler->addCommand(kCmdKeep, 20007, 0, NULL); // to pocket
+ _commandHandler->addCommand(kCmdSend, 20006, 20, NULL); // Move Coin to scene 20
+ _commandHandler->addCommand(kCmdSound, 20006, 20002, NULL); // Play Coin sound
+ _commandHandler->addCommand(kCmdSay, 20002, 20004, NULL); // Say "Luck guy..."
+ _commandHandler->addCommand(kCmdSend, 20010, 20, NULL); // Move Paper to scene 20
+ _commandHandler->addCommand(kCmdSound, 20010, 20003, NULL); // Play "ksh" sound! (fx20003.wav)
+ _commandHandler->addCommand(kCmdSay, 20001, 20005, NULL); // Say "Congratulations"
+ _game = false;
+ return;
+ } else
+ _sprK3->step(newRandom(5));
+ }
+
+ if (_gameCase2Cpt < 100) {
+ switch (_gameCase2Cpt) {
+ case 15:
+ // Give hint about ALTered dice
+ _commandHandler->addCommand(kCmdSay, 20003, 20021, NULL);
+ break;
+ case 30:
+ case 45:
+ case 60:
+ case 75:
+ // Tell to use ALT key
+ _commandHandler->addCommand(kCmdSay, 20003, 20022, NULL);
+ break;
+ }
+ _gameCase2Cpt++;
+ }
+
+ switch (spr->_ref) {
+ case 1:
+ _commandHandler->addCommand(kCmdSay, 20001, 20011, NULL); // Say "It'a my turn"
+ _commandHandler->addCommand(kCmdSeq, 20001, 1, NULL); // Throw dice
+ _commandHandler->addCommand(kCmdWait, 20001, 1, NULL); // wait
+ _commandHandler->addCommand(kCmdSetZ, 20700, 2, NULL); // hide dice
+ _commandHandler->addCommand(kCmdHide, 20007, 1, NULL); // hide dice
+ _commandHandler->addCommand(kCmdWait, 20001, 16, NULL); // wait
+ _commandHandler->addCommand(kCmdSeq, 20007, 1, NULL); // Start dice animation (20kosci)
+ _commandHandler->addCommand(kCmdHide, 20007, 0, NULL); // unhide
+ _commandHandler->addCommand(kCmdSound, 20007, 20001, NULL); // Play Dice sound
+ _commandHandler->addCommand(kCmdWait, 20007, -1, NULL); // the end
+ _commandHandler->addCommand(kCmdGame, 20001, 2, NULL); // again!
+ break;
+
+ case 20001:
+ _commandHandler->addCommand(kCmdSay, 20002, 20012, NULL); // Say "Now it's mine"
+ _commandHandler->addCommand(kCmdSeq, 20002, 1, NULL); // Throw dice
+ _commandHandler->addCommand(kCmdWait, 20002, 3, NULL); // wait
+ _commandHandler->addCommand(kCmdSetZ, 20700, 2, NULL); // hide dice
+ _commandHandler->addCommand(kCmdHide, 20007, 1, NULL); // hide dice
+ _commandHandler->addCommand(kCmdWait, 20002, 10, NULL); // wait
+ _commandHandler->addCommand(kCmdSeq, 20007, 2, NULL); // Start dice animation (20kosci)
+ _commandHandler->addCommand(kCmdHide, 20007, 0, NULL); // unhide
+ _commandHandler->addCommand(kCmdSound, 20007, 20001, NULL); // Play Dice sound
+ _commandHandler->addCommand(kCmdWait, 20007, -1, NULL); // the end
+ _commandHandler->addCommand(kCmdGame, 20002, 2, NULL); // again!
+ break;
+
+ case 20002:
+ _commandHandler->addCommand(kCmdSay, 20002, 20010, NULL); // "Roll the bones!"
+ _commandHandler->addCommand(kCmdWalk, 20005, -1, NULL); // Walk to table
+ _commandHandler->addCommand(kCmdWait, 1, -1, NULL); // Wait
+ _commandHandler->addCommand(kCmdCover, 1, 20101, NULL); // grasol ??
+ _commandHandler->addCommand(kCmdSeq, 20101, 1, NULL); // Start Chief animation (20solgra)
+ _commandHandler->addCommand(kCmdWait, 20101, 5, NULL); // Wait
+ _commandHandler->addCommand(kCmdSetZ, 20700, 2, NULL); // Hide dice
+ _commandHandler->addCommand(kCmdHide, 20007, 1, NULL); // Hide dice
+ _commandHandler->addCommand(kCmdWait, 20101, 15, NULL); // wait
+ _commandHandler->addCommand(kCmdSeq, 20007, 1, NULL); // Start dice animation (20kosci)
+ _commandHandler->addCommand(kCmdHide, 20007, 0, NULL); // Unhide
+ _commandHandler->addCommand(kCmdSound, 20007, 20001, NULL); // Play Dice sound
+ _commandHandler->addCommand(kCmdWait, 20101, -1, NULL); // the end
+ _commandHandler->addCommand(kCmdUncover, 1, 20101, NULL); // SDS ??
+ _commandHandler->addCommand(kCmdGame, 1, 2, NULL); // again!
+ break;
+ }
+ }
+}
+
+void CGEEngine::expandSprite(Sprite *spr) {
+ debugC(5, kCGEDebugEngine, "CGEEngine::expandSprite(spr)");
+
+ if (spr)
+ _vga->_showQ->insert(_vga->_spareQ->remove(spr));
+}
+
+void CGEEngine::contractSprite(Sprite *spr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::contractSprite(spr)");
+
+ if (spr)
+ _vga->_spareQ->append(_vga->_showQ->remove(spr));
+}
+
+/**
+ * Check if an item is in the inventory, and returns its position
+ * @param spr Sprite pointer
+ * @return -1 if not found, else index.
+ */
+int CGEEngine::findPocket(Sprite *spr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::findPocket(spr)");
+
+ for (int i = 0; i < kPocketNX; i++)
+ if (_pocket[i] == spr)
+ return i;
+ return -1;
+}
+
+/**
+ * Check if an item is in the inventory, and returns its position
+ * @param Inventory slot number Sprite pointer
+ */
+void CGEEngine::selectPocket(int n) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::selectPocket(%d)", n);
+
+ if (n < 0 || (_pocLight->_seqPtr && _pocPtr == n)) {
+ // If no slot specified, or another slot already selected
+ // stop the blinking animation
+ _pocLight->step(0);
+ n = findPocket(NULL);
+ if (n >= 0)
+ _pocPtr = n;
+ } else {
+ // If slot specified, check if the slot if used.
+ // Is so, start the blinking animation
+ if (_pocket[n] != NULL) {
+ _pocPtr = n;
+ _pocLight->step(1);
+ }
+ }
+ _pocLight->gotoxy(kPocketX + _pocPtr * kPocketDX + kPocketSX, kPocketY + kPocketSY);
+}
+
+/**
+ * Logic used when all the inventory slots are full and the user tries to pick
+ * another object.
+ * @param Inventory slot number Sprite pointer
+ */
+void CGEEngine::pocFul() {
+ debugC(1, kCGEDebugEngine, "CGEEngine::pocFul()");
+
+ _hero->park();
+ _commandHandler->addCommand(kCmdWait, -1, -1, _hero);
+ _commandHandler->addCommand(kCmdSeq, -1, kSeqPocketFull, _hero);
+ _commandHandler->addCommand(kCmdSound, -1, 2, _hero); // Play the 'hum-hum" sound (fx00002)
+ _commandHandler->addCommand(kCmdWait, -1, -1, _hero);
+ _commandHandler->addCommand(kCmdSay, 1, kPocketFull, _hero);
+}
+
+void CGEEngine::hide1(Sprite *spr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::hide1(spr)");
+
+ _commandHandlerTurbo->addCommand(kCmdGhost, -1, 0, spr->ghost());
+}
+
+void CGEEngine::snGhost(Bitmap *bmp) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snGhost(bmp)");
+
+ bmp->hide(bmp->_map & 0xFFFF, bmp->_map >> 16);
+ bmp->_m = NULL;
+ bmp->_map = 0;
+ delete bmp;
+}
+
+void CGEEngine::feedSnail(Sprite *spr, SnList snq) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::feedSnail(spr, snq)");
+
+ if (!spr || !spr->active())
+ return;
+
+ uint8 ptr = (snq == kTake) ? spr->_takePtr : spr->_nearPtr;
+
+ if (ptr == kNoPtr)
+ return;
+
+ CommandHandler::Command *comtab = spr->snList(snq);
+ CommandHandler::Command *c = comtab + ptr;
+
+ if (findPocket(NULL) < 0) { // no empty pockets?
+ CommandHandler::Command *p;
+ for (p = c; p->_commandType != kCmdNext; p++) { // find KEEP command
+ if (p->_commandType == kCmdKeep) {
+ pocFul();
+ return;
+ }
+ if (p->_spritePtr)
+ break;
+ }
+ }
+ while (true) {
+ if (c->_commandType == kCmdTalk) {
+ if ((_commandHandler->_talkEnable = (c->_val != 0)) == false)
+ killText();
+ }
+ if (c->_commandType == kCmdNext) {
+ Sprite *s = (c->_ref < 0) ? spr : locate(c->_ref);
+ if (s) {
+ uint8 *idx = (snq == kTake) ? &s->_takePtr : &s->_nearPtr;
+ if (*idx != kNoPtr) {
+ int v;
+ switch (c->_val) {
+ case -1 :
+ v = c - comtab + 1;
+ break;
+ case -2 :
+ v = c - comtab;
+ break;
+ case -3 :
+ v = -1;
+ break;
+ default :
+ v = c->_val;
+ break;
+ }
+ if (v >= 0)
+ *idx = v;
+ }
+ }
+ if (s == spr)
+ break;
+ }
+ if (c->_commandType == kCmdIf) {
+ Sprite *s = (c->_ref < 0) ? spr : locate(c->_ref);
+ if (s) { // sprite extsts
+ if (! s->seqTest(-1))
+ c = comtab + c->_val; // not parked
+ else
+ ++c;
+ } else
+ ++c;
+ } else {
+ _commandHandler->addCommand(c->_commandType, c->_ref, c->_val, spr);
+ if (c->_spritePtr)
+ break;
+ else
+ c++;
+ }
+ }
+}
+
+void CGEEngine::snNNext(Sprite *spr, int p) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snNNext(spr, %d)", p);
+
+ if (spr)
+ if (spr->_nearPtr != kNoPtr)
+ spr->_nearPtr = p;
+}
+
+void CGEEngine::snTNext(Sprite *spr, int p) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snTNext(spr, %d)", p);
+
+ if (spr)
+ if (spr->_takePtr != kNoPtr)
+ spr->_takePtr = p;
+}
+
+void CGEEngine::snRNNext(Sprite *spr, int p) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRNNext(spr, %d)", p);
+
+ if (spr)
+ if (spr->_nearPtr != kNoPtr)
+ spr->_nearPtr += p;
+}
+
+
+void CGEEngine::snRTNext(Sprite *spr, int p) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRTNext(spr, %d)", p);
+
+ if (spr)
+ if (spr->_takePtr != kNoPtr)
+ spr->_takePtr += p;
+}
+
+void CGEEngine::snZTrim(Sprite *spr) {
+ debugC(4, kCGEDebugEngine, "CGEEngine::snZTrim(spr)");
+
+ if (!spr || !spr->active())
+ return;
+
+ Sprite *s = (spr->_flags._shad) ? spr->_prev : NULL;
+ _vga->_showQ->insert(_vga->_showQ->remove(spr));
+ if (s) {
+ s->_z = spr->_z;
+ _vga->_showQ->insert(_vga->_showQ->remove(s), spr);
+ }
+}
+
+void CGEEngine::snHide(Sprite *spr, int val) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snHide(spr, %d)", val);
+
+ if (spr) {
+ spr->_flags._hide = (val >= 0) ? (val != 0) : (!spr->_flags._hide);
+ if (spr->_flags._shad)
+ spr->_prev->_flags._hide = spr->_flags._hide;
+ }
+}
+
+void CGEEngine::snRmNear(Sprite *spr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRmNear(spr)");
+
+ if (spr)
+ spr->_nearPtr = kNoPtr;
+}
+
+void CGEEngine::snRmTake(Sprite *spr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRmTake(spr)");
+
+ if (spr)
+ spr->_takePtr = kNoPtr;
+}
+
+void CGEEngine::snSeq(Sprite *spr, int val) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSeq(spr, %d)", val);
+
+ if (spr) {
+ if (spr == _hero && val == 0)
+ _hero->park();
+ else
+ spr->step(val);
+ }
+}
+
+void CGEEngine::snRSeq(Sprite *spr, int val) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRSeq(spr, %d)", val);
+
+ if (spr)
+ snSeq(spr, spr->_seqPtr + val);
+}
+
+void CGEEngine::snSend(Sprite *spr, int val) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSend(spr, %d)", val);
+
+ if (!spr)
+ return;
+
+ int was = spr->_scene;
+ bool was1 = (was == 0 || was == _now);
+ bool val1 = (val == 0 || val == _now);
+ spr->_scene = val;
+ if (val1 != was1) {
+ if (was1) {
+ if (spr->_flags._kept) {
+ int n = findPocket(spr);
+ if (n >= 0)
+ _pocket[n] = NULL;
+ }
+ hide1(spr);
+ contractSprite(spr);
+ spr->_flags._slav = false;
+ } else {
+ if (spr->_ref % 1000 == 0)
+ _bitmapPalette = _vga->_sysPal;
+ if (spr->_flags._back)
+ spr->backShow(true);
+ else
+ expandSprite(spr);
+ _bitmapPalette = NULL;
+ }
+ }
+}
+
+void CGEEngine::snSwap(Sprite *spr, int xref) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSwap(spr, %d)", xref);
+
+ Sprite *xspr = locate(xref);
+ if (!spr || !xspr)
+ return;
+
+ int was = spr->_scene;
+ int xwas = xspr->_scene;
+ bool was1 = (was == 0 || was == _now);
+ bool xwas1 = (xwas == 0 || xwas == _now);
+
+ SWAP(spr->_scene, xspr->_scene);
+ SWAP(spr->_x, xspr->_x);
+ SWAP(spr->_y, xspr->_y);
+ SWAP(spr->_z, xspr->_z);
+ if (spr->_flags._kept) {
+ int n = findPocket(spr);
+ if (n >= 0)
+ _pocket[n] = xspr;
+ xspr->_flags._kept = true;
+ xspr->_flags._port = false;
+ }
+ if (xwas1 != was1) {
+ if (was1) {
+ hide1(spr);
+ contractSprite(spr);
+ } else
+ expandSprite(spr);
+ if (xwas1) {
+ hide1(xspr);
+ contractSprite(xspr);
+ } else
+ expandSprite(xspr);
+ }
+}
+
+void CGEEngine::snCover(Sprite *spr, int xref) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snCover(spr, %d)", xref);
+
+ Sprite *xspr = locate(xref);
+ if (!spr || !xspr)
+ return;
+
+ spr->_flags._hide = true;
+ xspr->_z = spr->_z;
+ xspr->_scene = spr->_scene;
+ xspr->gotoxy(spr->_x, spr->_y);
+ expandSprite(xspr);
+ if ((xspr->_flags._shad = spr->_flags._shad) == 1) {
+ _vga->_showQ->insert(_vga->_showQ->remove(spr->_prev), xspr);
+ spr->_flags._shad = false;
+ }
+ feedSnail(xspr, kNear);
+}
+
+void CGEEngine::snUncover(Sprite *spr, Sprite *xspr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snUncover(spr, xspr)");
+
+ if (!spr || !xspr)
+ return;
+
+ spr->_flags._hide = false;
+ spr->_scene = xspr->_scene;
+ spr->gotoxy(xspr->_x, xspr->_y);
+ if ((spr->_flags._shad = xspr->_flags._shad) == 1) {
+ _vga->_showQ->insert(_vga->_showQ->remove(xspr->_prev), spr);
+ xspr->_flags._shad = false;
+ }
+ spr->_z = xspr->_z;
+ snSend(xspr, -1);
+ if (spr->_time == 0)
+ spr->_time++;
+}
+
+void CGEEngine::snSetX0(int scene, int x0) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSetX0(%d, %d)", scene, x0);
+
+ _heroXY[scene - 1].x = x0;
+}
+
+void CGEEngine::snSetY0(int scene, int y0) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSetY0(%d, %d)", scene, y0);
+
+ _heroXY[scene - 1].y = y0;
+}
+
+void CGEEngine::snSetXY(Sprite *spr, uint16 xy) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSetXY(spr, %d)", xy);
+
+ if (spr)
+ spr->gotoxy(xy % kScrWidth, xy / kScrWidth);
+}
+
+void CGEEngine::snRelX(Sprite *spr, int x) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRelX(spr, %d)", x);
+
+ if (spr && _hero)
+ spr->gotoxy(_hero->_x + x, spr->_y);
+}
+
+void CGEEngine::snRelY(Sprite *spr, int y) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRelY(spr, %d)", y);
+
+ if (spr && _hero)
+ spr->gotoxy(spr->_x, _hero->_y + y);
+}
+
+void CGEEngine::snRelZ(Sprite *spr, int z) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snRelZ(spr, %d)", z);
+
+ if (spr && _hero) {
+ spr->_z = _hero->_z + z;
+ snZTrim(spr);
+ }
+}
+
+void CGEEngine::snSetX(Sprite *spr, int x) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSetX(spr, %d)", x);
+
+ if (spr)
+ spr->gotoxy(x, spr->_y);
+}
+
+void CGEEngine::snSetY(Sprite *spr, int y) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSetY(spr, %d)", y);
+
+ if (spr)
+ spr->gotoxy(spr->_x, y);
+}
+
+void CGEEngine::snSetZ(Sprite *spr, int z) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSetZ(spr, %d)", z);
+
+ if (spr) {
+ spr->_z = z;
+ snZTrim(spr);
+ }
+}
+
+void CGEEngine::snSlave(Sprite *spr, int ref) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSlave(spr, %d)", ref);
+
+ Sprite *slv = locate(ref);
+ if (spr && slv) {
+ if (spr->active()) {
+ snSend(slv, spr->_scene);
+ slv->_flags._slav = true;
+ slv->_z = spr->_z;
+ _vga->_showQ->insert(_vga->_showQ->remove(slv), spr->_next);
+ }
+ }
+}
+
+void CGEEngine::snTrans(Sprite *spr, int trans) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snTrans(spr, %d)", trans);
+
+ if (spr)
+ spr->_flags._tran = (trans < 0) ? !spr->_flags._tran : (trans != 0);
+}
+
+void CGEEngine::snPort(Sprite *spr, int port) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snPort(spr, %d)", port);
+
+ if (spr)
+ spr->_flags._port = (port < 0) ? !spr->_flags._port : (port != 0);
+}
+
+void CGEEngine::snKill(Sprite *spr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snKill(spr)");
+
+ if (!spr)
+ return;
+
+ if (spr->_flags._kept) {
+ int n = findPocket(spr);
+ if (n >= 0)
+ _pocket[n] = NULL;
+ }
+ Sprite *nx = spr->_next;
+ hide1(spr);
+ _vga->_showQ->remove(spr);
+ _eventManager->clearEvent(spr);
+ if (spr->_flags._kill) {
+ delete spr;
+ } else {
+ spr->_scene = -1;
+ _vga->_spareQ->append(spr);
+ }
+ if (nx) {
+ if (nx->_flags._slav)
+ snKill(nx);
+ }
+}
+
+/**
+ * Play a FX sound
+ * @param spr Sprite pointer
+ * @param wav FX index
+ */
+void CGEEngine::snSound(Sprite *spr, int wav) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSound(spr, %d)", wav);
+
+ if (wav == -1)
+ _sound->stop();
+ else
+ _sound->play((*_fx)[wav], (spr) ? ((spr->_x + spr->_w / 2) / (kScrWidth / 16)) : 8);
+
+ _sound->setRepeat(1);
+}
+
+void CGEEngine::snKeep(Sprite *spr, int stp) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snKeep(spr, %d)", stp);
+
+ selectPocket(-1);
+ if (spr && ! spr->_flags._kept && _pocket[_pocPtr] == NULL) {
+ int16 oldRepeat = _sound->getRepeat();
+ _sound->setRepeat(1);
+ snSound(spr, 3);
+ _sound->setRepeat(oldRepeat);
+ _pocket[_pocPtr] = spr;
+ spr->_scene = 0;
+ spr->_flags._kept = true;
+ spr->gotoxy(kPocketX + kPocketDX * _pocPtr + kPocketDX / 2 - spr->_w / 2,
+ kPocketY + kPocketDY / 2 - spr->_h / 2);
+ if (stp >= 0)
+ spr->step(stp);
+ }
+ selectPocket(-1);
+}
+
+/**
+ * Remove an object from the inventory and (if specified) trigger an animation
+ * @param spr Inventory item
+ * @param stp Animation
+ */
+void CGEEngine::snGive(Sprite *spr, int stp) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snGive(spr, %d)", stp);
+
+ if (spr) {
+ int p = findPocket(spr);
+ if (p >= 0) {
+ _pocket[p] = NULL;
+ spr->_scene = _now;
+ spr->_flags._kept = false;
+ if (stp >= 0)
+ spr->step(stp);
+ }
+ }
+ selectPocket(-1);
+}
+
+void CGEEngine::snBackPt(Sprite *spr, int stp) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snBackPt(spr, %d)", stp);
+
+ if (spr) {
+ if (stp >= 0)
+ spr->step(stp);
+ spr->backShow(true);
+ }
+}
+
+void CGEEngine::snLevel(Sprite *spr, int lev) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snLevel(spr, %d)", lev);
+
+ assert((lev >= 0) && (lev < 5));
+
+ for (int i = 0; i < 5; i++) {
+ spr = _vga->_spareQ->locate(100 + i);
+ if (spr) {
+ if (i <= lev) {
+ spr->backShow(true);
+ spr->_scene = 0;
+ spr->_flags._hide = false;
+ } else {
+ spr->_flags._hide = true;
+ spr->_scene = -1;
+ }
+ } else {
+ warning("SPR not found! ref: %d", 100 + i);
+ }
+ }
+
+ _lev = lev;
+ _maxScene = _maxSceneArr[_lev];
+}
+
+/**
+ * Set a flag to a value
+ * @param indx Flag index
+ * @param val Flag value
+ */
+void CGEEngine::snFlag(int indx, bool val) {
+ _flag[indx] = val;
+}
+
+void CGEEngine::snSetRef(Sprite *spr, int nr) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snSetRef(spr, %d)", nr);
+
+ if (spr)
+ spr->_ref = nr;
+}
+
+void CGEEngine::snFlash(bool on) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snFlash(%s)", on ? "true" : "false");
+
+ if (on) {
+ Dac *pal = (Dac *)malloc(sizeof(Dac) * kPalCount);
+ if (pal) {
+ memcpy(pal, _vga->_sysPal, kPalSize);
+ for (int i = 0; i < kPalCount; i++) {
+ register int c;
+ c = pal[i]._r << 1;
+ pal[i]._r = (c < 64) ? c : 63;
+ c = pal[i]._g << 1;
+ pal[i]._g = (c < 64) ? c : 63;
+ c = pal[i]._b << 1;
+ pal[i]._b = (c < 64) ? c : 63;
+ }
+ _vga->setColors(pal, 64);
+ }
+ } else
+ _vga->setColors(_vga->_sysPal, 64);
+ _dark = false;
+}
+
+void CGEEngine::snLight(bool in) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snLight(%s)", in ? "true" : "false");
+
+ if (in)
+ _vga->sunrise(_vga->_sysPal);
+ else
+ _vga->sunset();
+ _dark = !in;
+}
+
+/**
+ * Set an horizontal boundary
+ * @param scene Scene number
+ * @param barX Horizontal boundary value
+ */
+void CGEEngine::snHBarrier(const int scene, const int barX) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snHBarrier(%d, %d)", scene, barX);
+
+ _barriers[(scene > 0) ? scene : _now]._horz = barX;
+}
+
+/**
+ * Set a vertical boundary
+ * @param scene Scene number
+ * @param barY Vertical boundary value
+ */
+void CGEEngine::snVBarrier(const int scene, const int barY) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snVBarrier(%d, %d)", scene, barY);
+
+ _barriers[(scene > 0) ? scene : _now]._vert = barY;
+}
+
+void CGEEngine::snWalk(Sprite *spr, int x, int y) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snWalk(spr, %d, %d)", x, y);
+
+ if (_hero) {
+ if (spr && y < 0)
+ _hero->findWay(spr);
+ else
+ _hero->findWay(XZ(x, y));
+ }
+}
+
+void CGEEngine::snReach(Sprite *spr, int mode) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snReach(spr, %d)", mode);
+
+ if (_hero)
+ _hero->reach(spr, mode);
+}
+
+void CGEEngine::snMouse(bool on) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::snMouse(%s)", on ? "true" : "false");
+
+ if (on)
+ _mouse->on();
+ else
+ _mouse->off();
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/snail.h b/engines/cge/snail.h
new file mode 100644
index 0000000000..3acbbd0e5f
--- /dev/null
+++ b/engines/cge/snail.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.
+ *
+ */
+
+/*
+ * This code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_COMMANDHANDLER_H
+#define CGE_COMMANDHANDLER_H
+
+#include "cge/cge.h"
+
+namespace CGE {
+
+#define kCommandFrameRate 80
+#define kCommandFrameDelay (1000 / kCommandFrameRate)
+#define kDressed 3
+
+enum CommandType {
+ kCmdLabel, kCmdPause, kCmdWait, kCmdLevel, kCmdHide,
+ kCmdSay, kCmdInf, kCmdTime, kCmdCave, kCmdKill,
+ kCmdRSeq, kCmdSeq, kCmdSend, kCmdSwap, kCmdKeep,
+ kCmdGive, kCmdIf, kCmdGame, kCmdSetX0, kCmdSetY0,
+ kCmdSlave, kCmdSetXY, kCmdRelX, kCmdRelY, kCmdRelZ,
+ kCmdSetX, kCmdSetY, kCmdSetZ, kCmdTrans, kCmdPort,
+ kCmdNext, kCmdNNext, kCmdTNext, kCmdRNNext, kCmdRTNext,
+ kCmdRMNear, kCmdRmTake, kCmdFlag, kCmdSetRef, kCmdBackPt,
+ kCmdFlash, kCmdLight, kCmdSetHBarrier, kCmdSetVBarrier, kCmdWalk,
+ kCmdReach, kCmdCover, kCmdUncover, kCmdClear, kCmdTalk,
+ kCmdMouse, kCmdSound, kCmdCount, kCmdExec, kCmdStep,
+ kCmdZTrim, kCmdGhost
+};
+
+class CommandHandler {
+public:
+ struct Command {
+ CommandType _commandType;
+ int _ref;
+ int _val;
+ void *_spritePtr;
+ CallbackType _cbType;
+ } *_commandList;
+ static const char *_commandText[];
+ bool _talkEnable;
+
+ CommandHandler(CGEEngine *vm, bool turbo);
+ ~CommandHandler();
+ void runCommand();
+ void addCommand(CommandType com, int ref, int val, void *ptr);
+ void addCallback(CommandType com, int ref, int val, CallbackType cbType);
+ void insertCommand(CommandType com, int ref, int val, void *ptr);
+ bool idle();
+private:
+ CGEEngine *_vm;
+ bool _turbo;
+ uint8 _head;
+ uint8 _tail;
+ bool _busy;
+ bool _textDelay;
+ uint32 _timerExpiry;
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/sound.cpp b/engines/cge/sound.cpp
new file mode 100644
index 0000000000..646689e99e
--- /dev/null
+++ b/engines/cge/sound.cpp
@@ -0,0 +1,290 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/sound.h"
+#include "cge/text.h"
+#include "cge/cge_main.h"
+#include "common/config-manager.h"
+#include "common/memstream.h"
+#include "audio/decoders/raw.h"
+#include "audio/audiostream.h"
+
+namespace CGE {
+
+DataCk::DataCk(byte *buf, int bufSize) {
+ _buf = buf;
+ _ckSize = bufSize;
+}
+
+DataCk::~DataCk() {
+ free(_buf);
+}
+
+Sound::Sound(CGEEngine *vm) : _vm(vm) {
+ _audioStream = NULL;
+ _soundRepeatCount = 1;
+ open();
+}
+
+Sound::~Sound() {
+ close();
+}
+
+void Sound::close() {
+ _vm->_midiPlayer->killMidi();
+}
+
+void Sound::open() {
+ setRepeat(1);
+ play((*_vm->_fx)[30000], 8);
+}
+
+void Sound::setRepeat(int16 count) {
+ _soundRepeatCount = count;
+}
+
+int16 Sound::getRepeat() {
+ return _soundRepeatCount;
+}
+
+void Sound::play(DataCk *wav, int pan) {
+ if (wav) {
+ stop();
+ _smpinf._saddr = &*(wav->addr());
+ _smpinf._slen = (uint16)wav->size();
+ _smpinf._span = pan;
+ _smpinf._counter = getRepeat();
+ sndDigiStart(&_smpinf);
+ }
+}
+
+void Sound::sndDigiStart(SmpInfo *PSmpInfo) {
+ // Create an audio stream wrapper for sound
+ Common::MemoryReadStream *stream = new Common::MemoryReadStream(PSmpInfo->_saddr,
+ PSmpInfo->_slen, DisposeAfterUse::NO);
+ _audioStream = Audio::makeWAVStream(stream, DisposeAfterUse::YES);
+
+ // Start the new sound
+ _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle,
+ Audio::makeLoopingAudioStream(_audioStream, (uint)PSmpInfo->_counter));
+}
+
+void Sound::stop() {
+ sndDigiStop(&_smpinf);
+}
+
+void Sound::sndDigiStop(SmpInfo *PSmpInfo) {
+ if (_vm->_mixer->isSoundHandleActive(_soundHandle))
+ _vm->_mixer->stopHandle(_soundHandle);
+ _audioStream = NULL;
+}
+
+Fx::Fx(CGEEngine *vm, int size) : _current(NULL), _vm(vm) {
+ _cache = new Handler[size];
+ for (_size = 0; _size < size; _size++) {
+ _cache[_size]._ref = 0;
+ _cache[_size]._wav = NULL;
+ }
+}
+
+Fx::~Fx() {
+ clear();
+ delete[] _cache;
+}
+
+void Fx::clear() {
+ for (Handler *p = _cache, *q = p + _size; p < q; p++) {
+ if (p->_ref) {
+ p->_ref = 0;
+ delete p->_wav;
+ p->_wav = NULL;
+ }
+ }
+ _current = NULL;
+}
+
+int Fx::find(int ref) {
+ int i = 0;
+ for (Handler *p = _cache, *q = p + _size; p < q; p++) {
+ if (p->_ref == ref)
+ break;
+ else
+ ++i;
+ }
+ return i;
+}
+
+void Fx::preload(int ref0) {
+ Handler *cacheLim = _cache + _size;
+ char filename[12];
+
+ for (int ref = ref0; ref < ref0 + 10; ref++) {
+ sprintf(filename, "FX%05d.WAV", ref);
+ EncryptedStream file(_vm, filename);
+ DataCk *wav = loadWave(&file);
+ if (wav) {
+ Handler *p = &_cache[find(0)];
+ if (p >= cacheLim)
+ break;
+ p->_wav = wav;
+ p->_ref = ref;
+ } else {
+ warning("Unable to load %s", filename);
+ }
+ }
+}
+
+DataCk *Fx::load(int idx, int ref) {
+ char filename[12];
+ sprintf(filename, "FX%05d.WAV", ref);
+
+ EncryptedStream file(_vm, filename);
+ DataCk *wav = loadWave(&file);
+ if (wav) {
+ Handler *p = &_cache[idx];
+ p->_wav = wav;
+ p->_ref = ref;
+ } else {
+ warning("Unable to load %s", filename);
+ }
+ return wav;
+}
+
+DataCk *Fx::loadWave(EncryptedStream *file) {
+ byte *data = (byte *)malloc(file->size());
+ file->read(data, file->size());
+
+ return new DataCk(data, file->size());
+}
+
+DataCk *Fx::operator[](int ref) {
+ int i;
+ if ((i = find(ref)) < _size)
+ _current = _cache[i]._wav;
+ else {
+ if ((i = find(0)) >= _size) {
+ clear();
+ i = 0;
+ }
+ _current = load(i, ref);
+ }
+ return _current;
+}
+
+MusicPlayer::MusicPlayer(CGEEngine *vm) : _vm(vm) {
+ _data = NULL;
+ _isGM = false;
+
+ MidiPlayer::createDriver();
+
+ int ret = _driver->open();
+ if (ret == 0) {
+ if (_nativeMT32)
+ _driver->sendMT32Reset();
+ else
+ _driver->sendGMReset();
+
+ // TODO: Load cmf.ins with the instrument table. It seems that an
+ // interface for such an operation is supported for AdLib. Maybe for
+ // this card, setting instruments is necessary.
+
+ _driver->setTimerCallback(this, &timerCallback);
+ }
+}
+
+MusicPlayer::~MusicPlayer() {
+ killMidi();
+}
+
+void MusicPlayer::killMidi() {
+ Audio::MidiPlayer::stop();
+
+ free(_data);
+ _data = NULL;
+}
+
+void MusicPlayer::loadMidi(int ref) {
+ // Work out the filename and check the given MIDI file exists
+ Common::String filename = Common::String::format("%.2d.MID", ref);
+ if (!_vm->_resman->exist(filename.c_str()))
+ return;
+
+ // Stop any currently playing MIDI file
+ killMidi();
+
+ // Read in the data for the file
+ EncryptedStream mid(_vm, filename.c_str());
+ _dataSize = mid.size();
+ _data = (byte *)malloc(_dataSize);
+ mid.read(_data, _dataSize);
+
+ // Start playing the music
+ sndMidiStart();
+}
+
+void MusicPlayer::sndMidiStart() {
+ _isGM = true;
+
+ MidiParser *parser = MidiParser::createParser_SMF();
+ if (parser->loadMusic(_data, _dataSize)) {
+ parser->setTrack(0);
+ parser->setMidiDriver(this);
+ parser->setTimerRate(_driver->getBaseTempo());
+ parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
+
+ _parser = parser;
+
+ syncVolume();
+
+ // Al the tracks are supposed to loop
+ _isLooping = true;
+ _isPlaying = true;
+ }
+}
+
+void MusicPlayer::send(uint32 b) {
+ if ((b & 0xF0) == 0xC0 && !_isGM && !_nativeMT32) {
+ b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8;
+ }
+
+ Audio::MidiPlayer::send(b);
+}
+
+void MusicPlayer::sendToChannel(byte channel, uint32 b) {
+ if (!_channelsTable[channel]) {
+ _channelsTable[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
+ // If a new channel is allocated during the playback, make sure
+ // its volume is correctly initialized.
+ if (_channelsTable[channel])
+ _channelsTable[channel]->volume(_channelsVolume[channel] * _masterVolume / 255);
+ }
+
+ if (_channelsTable[channel])
+ _channelsTable[channel]->send(b);
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/sound.h b/engines/cge/sound.h
new file mode 100644
index 0000000000..a3f4d4d777
--- /dev/null
+++ b/engines/cge/sound.h
@@ -0,0 +1,136 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_SOUND_H
+#define CGE_SOUND_H
+
+#include "cge/fileio.h"
+#include "audio/audiostream.h"
+#include "audio/decoders/wave.h"
+#include "audio/fmopl.h"
+#include "audio/mididrv.h"
+#include "audio/midiparser.h"
+#include "audio/midiplayer.h"
+#include "audio/mixer.h"
+#include "common/memstream.h"
+
+namespace CGE {
+
+class CGEEngine;
+
+// sample info
+struct SmpInfo {
+ const uint8 *_saddr; // address
+ uint16 _slen; // length
+ uint16 _span; // left/right pan (0-15)
+ int _counter; // number of time the sample should be played
+};
+
+class DataCk {
+ byte *_buf;
+ int _ckSize;
+public:
+ DataCk(byte *buf, int bufSize);
+ ~DataCk();
+ inline const byte *addr() {
+ return _buf;
+ }
+ inline int size() {
+ return _ckSize;
+ }
+};
+
+class Sound {
+public:
+ SmpInfo _smpinf;
+
+ Sound(CGEEngine *vm);
+ ~Sound();
+ void open();
+ void close();
+ void play(DataCk *wav, int pan);
+ int16 getRepeat();
+ void setRepeat(int16 count);
+ void stop();
+private:
+ int _soundRepeatCount;
+ CGEEngine *_vm;
+ Audio::SoundHandle _soundHandle;
+ Audio::RewindableAudioStream *_audioStream;
+
+ void sndDigiStart(SmpInfo *PSmpInfo);
+ void sndDigiStop(SmpInfo *PSmpInfo);
+};
+
+class Fx {
+ CGEEngine *_vm;
+ struct Handler {
+ int _ref;
+ DataCk *_wav;
+ } *_cache;
+ int _size;
+
+ DataCk *load(int idx, int ref);
+ DataCk *loadWave(EncryptedStream *file);
+ int find(int ref);
+public:
+ DataCk *_current;
+
+ Fx(CGEEngine *vm, int size);
+ ~Fx();
+ void clear();
+ void preload(int ref0);
+ DataCk *operator[](int ref);
+};
+
+class MusicPlayer: public Audio::MidiPlayer {
+private:
+ CGEEngine *_vm;
+ byte *_data;
+ int _dataSize;
+ bool _isGM;
+
+ // Start MIDI File
+ void sndMidiStart();
+
+ // Stop MIDI File
+ void sndMidiStop();
+public:
+ MusicPlayer(CGEEngine *vm);
+ ~MusicPlayer();
+
+ void loadMidi(int ref);
+ void killMidi();
+
+ virtual void send(uint32 b);
+ virtual void sendToChannel(byte channel, uint32 b);
+};
+
+} // End of namespace CGE
+
+#endif
+
diff --git a/engines/cge/talk.cpp b/engines/cge/talk.cpp
new file mode 100644
index 0000000000..467b39be40
--- /dev/null
+++ b/engines/cge/talk.cpp
@@ -0,0 +1,292 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/general.h"
+#include "cge/talk.h"
+#include "cge/game.h"
+#include "cge/events.h"
+#include "cge/cge_main.h"
+
+namespace CGE {
+
+Font::Font(CGEEngine *vm, const char *name) : _vm(vm) {
+ _map = (uint8 *)malloc(kMapSize);
+ _pos = (uint16 *)malloc(kPosSize * sizeof(uint16));
+ _widthArr = (uint8 *)malloc(kWidSize);
+
+ assert((_map != NULL) && (_pos != NULL) && (_widthArr != NULL));
+ _vm->mergeExt(_path, name, kFontExt);
+ load();
+}
+
+Font::~Font() {
+ free(_map);
+ free(_pos);
+ free(_widthArr);
+}
+
+void Font::load() {
+ EncryptedStream f(_vm, _path);
+ assert(!f.err());
+
+ f.read(_widthArr, kWidSize);
+ assert(!f.err());
+
+ uint16 p = 0;
+ for (uint16 i = 0; i < kPosSize; i++) {
+ _pos[i] = p;
+ p += _widthArr[i];
+ }
+ f.read(_map, p);
+}
+
+uint16 Font::width(const char *text) {
+ uint16 w = 0;
+ if (!text)
+ return 0;
+ while (*text)
+ w += _widthArr[(unsigned char)*(text++)];
+ return w;
+}
+
+Talk::Talk(CGEEngine *vm, const char *text, TextBoxStyle mode)
+ : Sprite(vm, NULL), _mode(mode), _vm(vm) {
+ _ts = NULL;
+ _flags._syst = true;
+ update(text);
+}
+
+
+Talk::Talk(CGEEngine *vm)
+ : Sprite(vm, NULL), _mode(kTBPure), _vm(vm) {
+ _ts = NULL;
+ _flags._syst = true;
+}
+
+void Talk::update(const char *text) {
+ const uint16 vmarg = (_mode) ? kTextVMargin : 0;
+ const uint16 hmarg = (_mode) ? kTextHMargin : 0;
+ uint16 mw = 0;
+ uint16 ln = vmarg;
+ uint8 *m;
+
+ if (!_ts) {
+ uint16 k = 2 * hmarg;
+ uint16 mh = 2 * vmarg + kFontHigh;
+ for (const char *p = text; *p; p++) {
+ if (*p == '|' || *p == '\n') {
+ mh += kFontHigh + kTextLineSpace;
+ if (k > mw)
+ mw = k;
+ k = 2 * hmarg;
+ } else
+ k += _vm->_font->_widthArr[(unsigned char)*p];
+ }
+ if (k > mw)
+ mw = k;
+
+ _ts = new BitmapPtr[2];
+ _ts[0] = box(mw, mh);
+ _ts[1] = NULL;
+ }
+
+ m = _ts[0]->_m + ln * mw + hmarg;
+
+ while (*text) {
+ if (*text == '|' || *text == '\n') {
+ m = _ts[0]->_m + (ln += kFontHigh + kTextLineSpace) * mw + hmarg;
+ } else {
+ int cw = _vm->_font->_widthArr[(unsigned char)*text];
+ uint8 *f = _vm->_font->_map + _vm->_font->_pos[(unsigned char)*text];
+ for (int i = 0; i < cw; i++) {
+ uint8 *pp = m;
+ uint16 n;
+ uint16 b = *(f++);
+ for (n = 0; n < kFontHigh; n++) {
+ if (b & 1)
+ *pp = kTextColFG;
+ b >>= 1;
+ pp += mw;
+ }
+ m++;
+ }
+ }
+ text++;
+ }
+ _ts[0]->code();
+ setShapeList(_ts);
+}
+
+Bitmap *Talk::box(uint16 w, uint16 h) {
+ if (w < 8)
+ w = 8;
+ if (h < 8)
+ h = 8;
+ uint16 n = w * h;
+ uint8 *b = (uint8 *)malloc(n);
+ assert(b != NULL);
+ memset(b, kTextColBG, n);
+
+ if (_mode) {
+ uint8 *p = b;
+ uint8 *q = b + n - w;
+ memset(p, kVgaColLightGray, w);
+ memset(q, kVgaColDarkGray, w);
+ while (p < q) {
+ p += w;
+ *(p - 1) = kVgaColDarkGray;
+ *p = kVgaColLightGray;
+ }
+ p = b;
+ const uint16 r = (_mode == kTBRound) ? kTextRoundCorner : 0;
+ for (int i = 0; i < r; i++) {
+ int j;
+ for (j = 0; j < r - i; j++) {
+ p[j] = kPixelTransp;
+ p[w - j - 1] = kPixelTransp;
+ q[j] = kPixelTransp;
+ q[w - j - 1] = kPixelTransp;
+ }
+ p[j] = kVgaColLightGray;
+ p[w - j - 1] = kVgaColDarkGray;
+ q[j] = kVgaColLightGray;
+ q[w - j - 1] = kVgaColDarkGray;
+ p += w;
+ q -= w;
+ }
+ }
+ return new Bitmap(_vm, w, h, b);
+}
+
+void Talk::putLine(int line, const char *text) {
+ // Note: (_ts[0]._w % 4) must be 0
+ uint16 w = _ts[0]->_w;
+ uint16 h = _ts[0]->_h;
+ uint8 *v = _ts[0]->_v;
+ uint16 dsiz = w >> 2; // data size (1 plane line size)
+ uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap
+ uint16 psiz = h * lsiz; // - last gap, but + plane trailer
+ uint16 size = 4 * psiz; // whole map size
+ uint16 rsiz = kFontHigh * lsiz; // length of whole text row map
+
+ // set desired line pointer
+ v += (kTextVMargin + (kFontHigh + kTextLineSpace) * line) * lsiz;
+ uint8 *p = v; // assume blanked line above text
+
+ // clear whole rectangle
+ assert((rsiz % lsiz) == 0);
+ for (int planeCtr = 0; planeCtr < 4; planeCtr++, p += psiz) {
+ for (byte *pDest = p; pDest < (p + (rsiz - lsiz)); pDest += lsiz)
+ Common::copy(p - lsiz, p, pDest);
+ }
+
+ // paint text line
+ if (!text)
+ return;
+ p = v + 2 + (kTextHMargin / 4) + (kTextHMargin % 4) * psiz;
+ uint8 *q = v + size;
+
+ while (*text) {
+ uint16 cw = _vm->_font->_widthArr[(unsigned char)*text], i;
+ uint8 *fp = _vm->_font->_map + _vm->_font->_pos[(unsigned char)*text];
+
+ for (i = 0; i < cw; i++) {
+ uint16 b = fp[i];
+ uint16 n;
+ for (n = 0; n < kFontHigh; n++) {
+ if (b & 1)
+ *p = kTextColFG;
+ b >>= 1;
+ p += lsiz;
+ }
+ p = p - rsiz + psiz;
+ if (p >= q)
+ p = p - size + 1;
+ }
+ text++;
+ }
+}
+
+InfoLine::InfoLine(CGEEngine *vm, uint16 w) : Talk(vm), _oldText(NULL), _vm(vm) {
+ if (!_ts) {
+ _ts = new BitmapPtr[2];
+ _ts[1] = NULL;
+ }
+
+ _ts[0] = new Bitmap(_vm, w, kFontHigh, kTextColBG);
+ setShapeList(_ts);
+}
+
+void InfoLine::update(const char *text) {
+ if (text == _oldText)
+ return;
+
+ uint16 w = _ts[0]->_w;
+ uint16 h = _ts[0]->_h;
+ uint8 *v = (uint8 *)_ts[0]->_v;
+ uint16 dsiz = w >> 2; // data size (1 plane line size)
+ uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap
+ uint16 psiz = h * lsiz; // - last gape, but + plane trailer
+ uint16 size = 4 * psiz; // whole map size
+
+ // clear whole rectangle
+ memset(v + 2, kTextColBG, dsiz); // data bytes
+ for (byte *pDest = v + lsiz; pDest < (v + psiz); pDest += lsiz) {
+ Common::copy(v, v + lsiz, pDest);
+ }
+ *(uint16 *)(v + psiz - 2) = TO_LE_16(kBmpEOI); // plane trailer uint16
+ for (byte *pDest = v + psiz; pDest < (v + 4 * psiz); pDest += psiz) {
+ Common::copy(v, v + psiz, pDest);
+ }
+
+ // paint text line
+ if (text) {
+ uint8 *p = v + 2, * q = p + size;
+
+ while (*text) {
+ uint16 cw = _vm->_font->_widthArr[(unsigned char)*text];
+ uint8 *fp = _vm->_font->_map + _vm->_font->_pos[(unsigned char)*text];
+
+ for (uint16 i = 0; i < cw; i++) {
+ uint16 b = fp[i];
+ for (uint16 n = 0; n < kFontHigh; n++) {
+ if (b & 1)
+ *p = kTextColFG;
+ b >>= 1;
+ p += lsiz;
+ }
+ if (p >= q)
+ p = p - size + 1;
+ }
+ text++;
+ }
+ }
+
+ _oldText = text;
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/talk.h b/engines/cge/talk.h
new file mode 100644
index 0000000000..55c529b7ea
--- /dev/null
+++ b/engines/cge/talk.h
@@ -0,0 +1,76 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_TALK_H
+#define CGE_TALK_H
+
+#include "cge/general.h"
+#include "cge/vga13h.h"
+
+namespace CGE {
+
+#define kTextColFG kVgaColDark // foreground color
+#define kTextColBG kVgaColGray // background color
+#define kTextHMargin (6&~1) // EVEN horizontal margins!
+#define kTextVMargin 5 // vertical margins
+#define kTextLineSpace 2 // line spacing
+#define kTextRoundCorner 3 // rounded corners
+#define kWidSize 256
+#define kPosSize 256
+#define kMapSize (256*8)
+#define kFontHigh 8
+#define kFontExt ".CFT"
+
+enum TextBoxStyle { kTBPure, kTBRect, kTBRound };
+
+class Talk : public Sprite {
+protected:
+ TextBoxStyle _mode;
+ BitmapPtr *_ts;
+ Bitmap *box(uint16 w, uint16 h);
+public:
+ Talk(CGEEngine *vm, const char *text, TextBoxStyle mode);
+ Talk(CGEEngine *vm);
+
+ virtual void update(const char *text);
+ void putLine(int line, const char *text);
+private:
+ CGEEngine *_vm;
+};
+
+class InfoLine : public Talk {
+ const char *_oldText;
+public:
+ InfoLine(CGEEngine *vm, uint16 wid);
+ void update(const char *text);
+private:
+ CGEEngine *_vm;
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/text.cpp b/engines/cge/text.cpp
new file mode 100644
index 0000000000..58acb5548c
--- /dev/null
+++ b/engines/cge/text.cpp
@@ -0,0 +1,205 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/general.h"
+#include "cge/text.h"
+#include "cge/talk.h"
+#include "cge/game.h"
+#include "cge/snail.h"
+#include "cge/cge_main.h"
+#include "common/str.h"
+
+namespace CGE {
+
+Text::Text(CGEEngine *vm, const char *fname) : _vm(vm) {
+ _vm->mergeExt(_fileName, fname, kSayExt);
+ if (!_vm->_resman->exist(_fileName))
+ error("No talk (%s)", _fileName);
+ int16 txtCount = count() + 1;
+ if (!txtCount)
+ error("Unable to read dialog file %s", _fileName);
+
+ _cache = new Handler[txtCount];
+ for (_size = 0; _size < txtCount; _size++) {
+ _cache[_size]._ref = 0;
+ _cache[_size]._text = NULL;
+ }
+ load();
+}
+
+Text::~Text() {
+ clear();
+ delete[] _cache;
+}
+
+int16 Text::count() {
+ EncryptedStream tf(_vm, _fileName);
+ if (tf.err())
+ return -1;
+
+ Common::String line;
+ char tmpStr[kLineMax + 1];
+
+ int counter = 0;
+
+ for (line = tf.readLine(); !tf.eos(); line = tf.readLine()) {
+ char *s;
+
+ strcpy(tmpStr, line.c_str());
+ if ((s = strtok(tmpStr, " =,;/\t\n")) == NULL)
+ continue;
+ if (!isdigit(*s))
+ continue;
+
+ counter++;
+ }
+ return counter;
+}
+
+void Text::clear() {
+ for (Handler *p = _cache, *q = p + _size; p < q; p++) {
+ if (p->_ref) {
+ p->_ref = 0;
+ delete[] p->_text;
+ p->_text = NULL;
+ }
+ }
+}
+
+void Text::load() {
+ EncryptedStream tf(_vm, _fileName);
+ assert(!tf.err());
+
+ Common::String line;
+ char tmpStr[kLineMax + 1];
+ int idx;
+
+ for (idx = 0, line = tf.readLine(); !tf.eos(); line = tf.readLine()) {
+ int n = line.size();
+ char *s;
+
+ strcpy(tmpStr, line.c_str());
+ if ((s = strtok(tmpStr, " =,;/\t\n")) == NULL)
+ continue;
+ if (!isdigit(*s))
+ continue;
+
+ int r = atoi(s);
+
+ s += strlen(s);
+ if (s < tmpStr + n)
+ ++s;
+
+ _cache[idx]._ref = r;
+ _cache[idx]._text = new char[strlen(s) + 1];
+ strcpy(_cache[idx]._text, s);
+ idx++;
+ }
+}
+
+char *Text::getText(int ref) {
+ int i;
+ for (i = 0; (i < _size) && (_cache[i]._ref != ref); i++)
+ ;
+
+ if (i < _size)
+ return _cache[i]._text;
+
+ warning("getText: Unable to find ref %d", ref);
+ return NULL;
+}
+
+void Text::say(const char *text, Sprite *spr) {
+ _vm->killText();
+ _vm->_talk = new Talk(_vm, text, kTBRound);
+ if (!_vm->_talk)
+ return;
+
+ bool east = spr->_flags._east;
+ int x = (east) ? (spr->_x + spr->_w - 2) : (spr->_x + 2);
+ int y = spr->_y + 2;
+ Speaker *speaker = new Speaker(_vm);
+ uint16 sw = speaker->_w;
+
+ if (east) {
+ if (x + sw + kTextRoundCorner + 5 >= kScrWidth)
+ east = false;
+ } else {
+ if (x <= 5 + kTextRoundCorner + sw)
+ east = true;
+ }
+ x = (east) ? (spr->_x + spr->_w - 2) : (spr->_x + 2 - sw);
+ if (spr->_ref == 1)
+ x += ((east) ? -10 : 10); // Hero
+
+ _vm->_talk->_flags._kill = true;
+ _vm->_talk->_flags._bDel = true;
+ _vm->_talk->setName(_vm->_text->getText(kSayName));
+ _vm->_talk->gotoxy(x - (_vm->_talk->_w - sw) / 2 - 3 + 6 * east, y - speaker->_h - _vm->_talk->_h + 1);
+ _vm->_talk->_z = 125;
+ _vm->_talk->_ref = kSayRef;
+
+ speaker->gotoxy(x, _vm->_talk->_y + _vm->_talk->_h - 1);
+ speaker->_z = 126;
+ speaker->_flags._slav = true;
+ speaker->_flags._kill = true;
+ speaker->setName(_vm->_text->getText(kSayName));
+ speaker->step(east);
+ speaker->_ref = kSayRef;
+
+ _vm->_vga->_showQ->insert(_vm->_talk, _vm->_vga->_showQ->last());
+ _vm->_vga->_showQ->insert(speaker, _vm->_vga->_showQ->last());
+}
+
+void CGEEngine::inf(const char *text) {
+ debugC(1, kCGEDebugEngine, "CGEEngine::inf(%s)", text);
+
+ killText();
+ _talk = new Talk(this, text, kTBRect);
+ if (!_talk)
+ return;
+
+ _talk->_flags._kill = true;
+ _talk->_flags._bDel = true;
+ _talk->setName(_text->getText(kInfName));
+ _talk->center();
+ _talk->gotoxy(_talk->_x, _talk->_y - 20);
+ _talk->_z = 126;
+ _talk->_ref = kInfRef;
+ _vga->_showQ->insert(_talk, _vga->_showQ->last());
+}
+
+void Text::sayTime(Sprite *spr) {
+ TimeDate curTime;
+ _vm->_system->getTimeAndDate(curTime);
+
+ char t[6];
+ sprintf(t, "%d:%02d", curTime.tm_hour, curTime.tm_min);
+ say(t, spr);
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/text.h b/engines/cge/text.h
new file mode 100644
index 0000000000..13ce6bbfbb
--- /dev/null
+++ b/engines/cge/text.h
@@ -0,0 +1,66 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_TEXT_H
+#define CGE_TEXT_H
+
+#include "cge/talk.h"
+
+namespace CGE {
+
+#define kSayExt ".SAY"
+#define kSysTextMax 1000
+#define kTextNoMouse 95
+#define kInfName 101
+#define kSayName 102
+#define kInfRef 301
+#define kSayRef 302
+
+
+class Text {
+ struct Handler {
+ int _ref;
+ char *_text;
+ } *_cache;
+ int _size;
+ char _fileName[kPathMax];
+ void load();
+ int16 count();
+public:
+ Text(CGEEngine *vm, const char *fname);
+ ~Text();
+ void clear();
+ char *getText(int ref);
+ void say(const char *text, Sprite *spr);
+ void sayTime(Sprite *spr);
+private:
+ CGEEngine *_vm;
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/vga13h.cpp b/engines/cge/vga13h.cpp
new file mode 100644
index 0000000000..49cfcd3084
--- /dev/null
+++ b/engines/cge/vga13h.cpp
@@ -0,0 +1,1009 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "common/array.h"
+#include "common/rect.h"
+#include "graphics/palette.h"
+#include "cge/general.h"
+#include "cge/vga13h.h"
+#include "cge/bitmap.h"
+#include "cge/text.h"
+#include "cge/cge_main.h"
+#include "cge/cge.h"
+
+namespace CGE {
+
+Seq *getConstantSeq(bool seqFlag) {
+ const Seq seq1[] = { { 0, 0, 0, 0, 0 } };
+ const Seq seq2[] = { { 0, 1, 0, 0, 0 }, { 1, 0, 0, 0, 0 } };
+
+ Seq *seq;
+ if (seqFlag) {
+ seq = (Seq *)malloc(1 * sizeof(Seq));
+ *seq = seq1[0];
+ } else {
+ seq = (Seq *)malloc(2 * sizeof(Seq));
+ seq[0] = seq2[0];
+ seq[1] = seq2[1];
+ }
+
+ return seq;
+}
+
+Sprite::Sprite(CGEEngine *vm, BitmapPtr *shpP)
+ : _x(0), _y(0), _z(0), _nearPtr(0), _takePtr(0),
+ _next(NULL), _prev(NULL), _seqPtr(kNoSeq), _time(0),
+ _ext(NULL), _ref(-1), _scene(0), _vm(vm) {
+ memset(_file, 0, sizeof(_file));
+ memset(&_flags, 0, sizeof(_flags));
+ _ref = 0;
+ _x = _y = 0;
+ _w = _h = 0;
+ _time = 0;
+ _seqPtr = 0;
+ _shpCnt = 0;
+ _prev = _next = NULL;
+
+ setShapeList(shpP);
+}
+
+Sprite::~Sprite() {
+ if (_vm->_sprite == this)
+ _vm->_sprite = NULL;
+
+ contract();
+}
+
+BitmapPtr Sprite::shp() {
+ SprExt *e = _ext;
+ if (!e || !e->_seq)
+ return NULL;
+
+ int i = e->_seq[_seqPtr]._now;
+ if (i >= _shpCnt)
+ error("Invalid PHASE in SPRITE::Shp() %s", _file);
+ return e->_shpList[i];
+}
+
+BitmapPtr *Sprite::setShapeList(BitmapPtr *shpP) {
+ BitmapPtr *r = (_ext) ? _ext->_shpList : NULL;
+
+ _shpCnt = 0;
+ _w = 0;
+ _h = 0;
+
+ if (shpP) {
+ BitmapPtr *p;
+ for (p = shpP; *p; p++) {
+ BitmapPtr b = (*p); // ->Code();
+ if (b->_w > _w)
+ _w = b->_w;
+ if (b->_h > _h)
+ _h = b->_h;
+ _shpCnt++;
+ }
+ expand();
+ _ext->_shpList = shpP;
+ _flags._bDel = true;
+ if (!_ext->_seq)
+ setSeq(getConstantSeq(_shpCnt < 2));
+ }
+ return r;
+}
+
+void Sprite::moveShapes(uint8 *buf) {
+ BitmapPtr *p;
+ for (p = _ext->_shpList; *p; p++) {
+ buf += (*p)->moveVmap(buf);
+ }
+}
+
+bool Sprite::works(Sprite *spr) {
+ if (!spr || !spr->_ext)
+ return false;
+
+ CommandHandler::Command *c = spr->_ext->_take;
+ if (c != NULL) {
+ c += spr->_takePtr;
+ if (c->_ref == _ref)
+ if (c->_commandType != kCmdLabel || (c->_val == 0 || c->_val == _vm->_now))
+ return true;
+ }
+
+ return false;
+}
+
+Seq *Sprite::setSeq(Seq *seq) {
+ if (_ext) {
+ free(_ext->_seq);
+ _ext->_seq = NULL;
+ }
+
+ expand();
+
+ Seq *s = _ext->_seq;
+ _ext->_seq = seq;
+ if (_seqPtr == kNoSeq)
+ step(0);
+ else if (_time == 0)
+ step(_seqPtr);
+ return s;
+}
+
+bool Sprite::seqTest(int n) {
+ if (n >= 0)
+ return (_seqPtr == n);
+ if (_ext)
+ return (_ext->_seq[_seqPtr]._next == _seqPtr);
+ return true;
+}
+
+CommandHandler::Command *Sprite::snList(SnList type) {
+ SprExt *e = _ext;
+ if (e)
+ return (type == kNear) ? e->_near : e->_take;
+ return NULL;
+}
+
+void Sprite::setName(char *newName) {
+ if (!_ext)
+ return;
+
+ if (_ext->_name) {
+ delete[] _ext->_name;
+ _ext->_name = NULL;
+ }
+ if (newName) {
+ _ext->_name = new char[strlen(newName) + 1];
+ assert(_ext->_name != NULL);
+ strcpy(_ext->_name, newName);
+ }
+}
+
+Sprite *Sprite::expand() {
+ if (_ext)
+ return this;
+
+ _ext = new SprExt;
+ assert(_ext != NULL);
+ if (!*_file)
+ return this;
+
+ static const char *Comd[] = { "Name", "Phase", "Seq", "Near", "Take", NULL };
+ char fname[kPathMax];
+
+ Common::Array<BitmapPtr> shplist;
+ for (int i = 0; i < _shpCnt + 1; ++i)
+ shplist.push_back(NULL);
+
+ Seq *seq = NULL;
+ int shapeCount = 0,
+ seqCount = 0,
+ nearCount = 0,
+ takeCount = 0,
+ maxnow = 0,
+ maxnxt = 0;
+
+ CommandHandler::Command *nearList = NULL;
+ CommandHandler::Command *takeList = NULL;
+ _vm->mergeExt(fname, _file, kSprExt);
+ if (_vm->_resman->exist(fname)) { // sprite description file exist
+ EncryptedStream sprf(_vm, fname);
+ if (sprf.err())
+ error("Bad SPR [%s]", fname);
+ Common::String line;
+ char tmpStr[kLineMax + 1];
+ int len = 0, lcnt = 0;
+
+ for (line = sprf.readLine(); !sprf.eos(); line = sprf.readLine()) {
+ len = line.size();
+ strcpy(tmpStr, line.c_str());
+ lcnt++;
+ if (len == 0 || *tmpStr == '.')
+ continue;
+
+ CommandHandler::Command *c;
+ switch (_vm->takeEnum(Comd, strtok(tmpStr, " =\t"))) {
+ case 0:
+ // Name
+ setName(strtok(NULL, ""));
+ break;
+ case 1:
+ // Phase
+ // In case the shape index gets too high, increase the array size
+ while ((shapeCount + 1) >= (int)shplist.size()) {
+ shplist.push_back(NULL);
+ ++_shpCnt;
+ }
+ shplist[shapeCount++] = new Bitmap(_vm, strtok(NULL, " \t,;/"));
+ break;
+ case 2:
+ // Seq
+ seq = (Seq *)realloc(seq, (seqCount + 1) * sizeof(*seq));
+ assert(seq != NULL);
+ Seq *s;
+ s = &seq[seqCount++];
+ s->_now = atoi(strtok(NULL, " \t,;/"));
+ if (s->_now > maxnow)
+ maxnow = s->_now;
+ s->_next = atoi(strtok(NULL, " \t,;/"));
+ switch (s->_next) {
+ case 0xFF:
+ s->_next = seqCount;
+ break;
+ case 0xFE:
+ s->_next = seqCount - 1;
+ break;
+ }
+ if (s->_next > maxnxt)
+ maxnxt = s->_next;
+ s->_dx = atoi(strtok(NULL, " \t,;/"));
+ s->_dy = atoi(strtok(NULL, " \t,;/"));
+ s->_dly = atoi(strtok(NULL, " \t,;/"));
+ break;
+ case 3:
+ // Near
+ if (_nearPtr == kNoPtr)
+ break;
+ nearList = (CommandHandler::Command *)realloc(nearList, (nearCount + 1) * sizeof(*nearList));
+ assert(nearList != NULL);
+ c = &nearList[nearCount++];
+ if ((c->_commandType = (CommandType)_vm->takeEnum(CommandHandler::_commandText, strtok(NULL, " \t,;/"))) < 0)
+ error("Bad NEAR in %d [%s]", lcnt, fname);
+ c->_ref = atoi(strtok(NULL, " \t,;/"));
+ c->_val = atoi(strtok(NULL, " \t,;/"));
+ c->_spritePtr = NULL;
+ break;
+ case 4:
+ // Take
+ if (_takePtr == kNoPtr)
+ break;
+ takeList = (CommandHandler::Command *)realloc(takeList, (takeCount + 1) * sizeof(*takeList));
+ assert(takeList != NULL);
+ c = &takeList[takeCount++];
+ if ((c->_commandType = (CommandType)_vm->takeEnum(CommandHandler::_commandText, strtok(NULL, " \t,;/"))) < 0)
+ error("Bad NEAR in %d [%s]", lcnt, fname);
+ c->_ref = atoi(strtok(NULL, " \t,;/"));
+ c->_val = atoi(strtok(NULL, " \t,;/"));
+ c->_spritePtr = NULL;
+ break;
+ }
+ }
+ } else {
+ // no sprite description: try to read immediately from .BMP
+ shplist[shapeCount++] = new Bitmap(_vm, _file);
+ }
+
+ shplist[shapeCount] = NULL;
+ if (seq) {
+ if (maxnow >= shapeCount)
+ error("Bad PHASE in SEQ [%s]", fname);
+ if (maxnxt >= seqCount)
+ error("Bad JUMP in SEQ [%s]", fname);
+ setSeq(seq);
+ } else
+ setSeq(getConstantSeq(_shpCnt == 1));
+
+ // Set the shape list
+ BitmapPtr *shapeList = new BitmapPtr[shplist.size()];
+ for (uint i = 0; i < shplist.size(); ++i)
+ shapeList[i] = shplist[i];
+
+ setShapeList(shapeList);
+
+ if (nearList)
+ nearList[nearCount - 1]._spritePtr = _ext->_near = nearList;
+ else
+ _nearPtr = kNoPtr;
+ if (takeList)
+ takeList[takeCount - 1]._spritePtr = _ext->_take = takeList;
+ else
+ _takePtr = kNoPtr;
+
+ return this;
+}
+
+Sprite *Sprite::contract() {
+ SprExt *e = _ext;
+ if (!e)
+ return this;
+
+ if (e->_name)
+ delete[] e->_name;
+ if (_flags._bDel && e->_shpList) {
+ for (int i = 0; e->_shpList[i]; i++)
+ delete e->_shpList[i];
+ delete[] e->_shpList;
+ }
+
+ free(e->_seq);
+ free(e->_near);
+ free(e->_take);
+
+ delete e;
+ _ext = NULL;
+
+ return this;
+}
+
+Sprite *Sprite::backShow(bool fast) {
+ expand();
+ show(2);
+ show(1);
+ if (fast)
+ show(0);
+ contract();
+ return this;
+}
+
+void Sprite::step(int nr) {
+ if (nr >= 0)
+ _seqPtr = nr;
+ if (_ext) {
+ Seq *seq;
+ if (nr < 0)
+ _seqPtr = _ext->_seq[_seqPtr]._next;
+ seq = _ext->_seq + _seqPtr;
+ if (seq->_dly >= 0) {
+ gotoxy(_x + (seq->_dx), _y + (seq->_dy));
+ _time = seq->_dly;
+ }
+ }
+}
+
+void Sprite::tick() {
+ step();
+}
+
+void Sprite::makeXlat(uint8 *x) {
+ if (!_ext)
+ return;
+
+ if (_flags._xlat)
+ killXlat();
+ for (BitmapPtr *b = _ext->_shpList; *b; b++)
+ (*b)->_m = x;
+ _flags._xlat = true;
+}
+
+void Sprite::killXlat() {
+ if (!_flags._xlat || !_ext)
+ return;
+
+ uint8 *m = (*_ext->_shpList)->_m;
+ free(m);
+
+ for (BitmapPtr *b = _ext->_shpList; *b; b++)
+ (*b)->_m = NULL;
+ _flags._xlat = false;
+}
+
+void Sprite::gotoxy(int x, int y) {
+ int xo = _x, yo = _y;
+ if (_x < kScrWidth) {
+ if (x < 0)
+ x = 0;
+ if (x + _w > kScrWidth)
+ x = (kScrWidth - _w);
+ _x = x;
+ }
+ if (_h < kScrHeight) {
+ if (y < 0)
+ y = 0;
+ if (y + _h > kScrHeight)
+ y = (kScrHeight - _h);
+ _y = y;
+ }
+ if (_next)
+ if (_next->_flags._slav)
+ _next->gotoxy(_next->_x - xo + _x, _next->_y - yo + _y);
+ if (_flags._shad)
+ _prev->gotoxy(_prev->_x - xo + _x, _prev->_y - yo + _y);
+}
+
+void Sprite::center() {
+ gotoxy((kScrWidth - _w) / 2, (kScrHeight - _h) / 2);
+}
+
+void Sprite::show() {
+ SprExt *e;
+ e = _ext;
+ e->_x0 = e->_x1;
+ e->_y0 = e->_y1;
+ e->_b0 = e->_b1;
+ e->_x1 = _x;
+ e->_y1 = _y;
+ e->_b1 = shp();
+ if (!_flags._hide) {
+ if (_flags._xlat)
+ e->_b1->xShow(e->_x1, e->_y1);
+ else
+ e->_b1->show(e->_x1, e->_y1);
+ }
+}
+
+void Sprite::show(uint16 pg) {
+ Graphics::Surface *a = _vm->_vga->_page[1];
+ _vm->_vga->_page[1] = _vm->_vga->_page[pg & 3];
+ shp()->show(_x, _y);
+ _vm->_vga->_page[1] = a;
+}
+
+void Sprite::hide() {
+ SprExt *e = _ext;
+ if (e->_b0)
+ e->_b0->hide(e->_x0, e->_y0);
+}
+
+BitmapPtr Sprite::ghost() {
+ SprExt *e = _ext;
+ if (!e->_b1)
+ return NULL;
+
+ BitmapPtr bmp = new Bitmap(_vm, 0, 0, (uint8 *)NULL);
+ assert(bmp != NULL);
+ bmp->_w = e->_b1->_w;
+ bmp->_h = e->_b1->_h;
+ bmp->_b = new HideDesc[bmp->_h];
+ assert(bmp->_b != NULL);
+ bmp->_v = (uint8 *) memcpy(bmp->_b, e->_b1->_b, sizeof(HideDesc) * bmp->_h);
+ bmp->_map = (e->_y1 << 16) + e->_x1;
+ return bmp;
+}
+
+void Sprite::sync(Common::Serializer &s) {
+ uint16 unused = 0;
+
+ s.syncAsUint16LE(unused);
+ s.syncAsUint16LE(unused); // _ext
+ s.syncAsUint16LE(_ref);
+ s.syncAsByte(_scene);
+
+ // bitfield in-memory storage is unpredictable, so to avoid
+ // any issues, pack/unpack everything manually
+ uint16 flags = 0;
+ if (s.isLoading()) {
+ s.syncAsUint16LE(flags);
+ _flags._hide = flags & 0x0001 ? true : false;
+ _flags._near = flags & 0x0002 ? true : false;
+ _flags._drag = flags & 0x0004 ? true : false;
+ _flags._hold = flags & 0x0008 ? true : false;
+ _flags._____ = flags & 0x0010 ? true : false;
+ _flags._slav = flags & 0x0020 ? true : false;
+ _flags._syst = flags & 0x0040 ? true : false;
+ _flags._kill = flags & 0x0080 ? true : false;
+ _flags._xlat = flags & 0x0100 ? true : false;
+ _flags._port = flags & 0x0200 ? true : false;
+ _flags._kept = flags & 0x0400 ? true : false;
+ _flags._east = flags & 0x0800 ? true : false;
+ _flags._shad = flags & 0x1000 ? true : false;
+ _flags._back = flags & 0x2000 ? true : false;
+ _flags._bDel = flags & 0x4000 ? true : false;
+ _flags._tran = flags & 0x8000 ? true : false;
+ } else {
+ flags = (flags << 1) | _flags._tran;
+ flags = (flags << 1) | _flags._bDel;
+ flags = (flags << 1) | _flags._back;
+ flags = (flags << 1) | _flags._shad;
+ flags = (flags << 1) | _flags._east;
+ flags = (flags << 1) | _flags._kept;
+ flags = (flags << 1) | _flags._port;
+ flags = (flags << 1) | _flags._xlat;
+ flags = (flags << 1) | _flags._kill;
+ flags = (flags << 1) | _flags._syst;
+ flags = (flags << 1) | _flags._slav;
+ flags = (flags << 1) | _flags._____;
+ flags = (flags << 1) | _flags._hold;
+ flags = (flags << 1) | _flags._drag;
+ flags = (flags << 1) | _flags._near;
+ flags = (flags << 1) | _flags._hide;
+ s.syncAsUint16LE(flags);
+ }
+
+ s.syncAsUint16LE(_x);
+ s.syncAsUint16LE(_y);
+ s.syncAsByte(_z);
+ s.syncAsUint16LE(_w);
+ s.syncAsUint16LE(_h);
+ s.syncAsUint16LE(_time);
+ s.syncAsByte(_nearPtr);
+ s.syncAsByte(_takePtr);
+ s.syncAsSint16LE(_seqPtr);
+ s.syncAsUint16LE(_shpCnt);
+ s.syncBytes((byte *)&_file[0], 9);
+ _file[8] = '\0';
+
+ s.syncAsUint16LE(unused); // _prev
+ s.syncAsUint16LE(unused); // _next
+}
+
+Queue::Queue(bool show) : _head(NULL), _tail(NULL), _show(show) {
+}
+
+Queue::~Queue() {
+ clear();
+}
+
+void Queue::clear() {
+ while (_head) {
+ Sprite *s = remove(_head);
+ if (s->_flags._kill)
+ delete s;
+ }
+}
+
+void Queue::append(Sprite *spr) {
+ if (_tail) {
+ spr->_prev = _tail;
+ _tail->_next = spr;
+ } else
+ _head = spr;
+ _tail = spr;
+ if (_show)
+ spr->expand();
+ else
+ spr->contract();
+}
+
+void Queue::insert(Sprite *spr, Sprite *nxt) {
+ if (nxt == _head) {
+ spr->_next = _head;
+ _head = spr;
+ if (!_tail)
+ _tail = spr;
+ } else {
+ assert(nxt);
+ spr->_next = nxt;
+ spr->_prev = nxt->_prev;
+ if (spr->_prev)
+ spr->_prev->_next = spr;
+ }
+ if (spr->_next)
+ spr->_next->_prev = spr;
+ if (_show)
+ spr->expand();
+ else
+ spr->contract();
+}
+
+void Queue::insert(Sprite *spr) {
+ Sprite *s;
+ for (s = _head; s; s = s->_next)
+ if (s->_z > spr->_z)
+ break;
+ if (s)
+ insert(spr, s);
+ else
+ append(spr);
+ if (_show)
+ spr->expand();
+ else
+ spr->contract();
+}
+
+template<typename T>
+inline bool contains(const Common::List<T> &l, const T &v) {
+ return (Common::find(l.begin(), l.end(), v) != l.end());
+}
+
+Sprite *Queue::remove(Sprite *spr) {
+ if (spr == _head)
+ _head = spr->_next;
+ if (spr == _tail)
+ _tail = spr->_prev;
+ if (spr->_next)
+ spr->_next->_prev = spr->_prev;
+ if (spr->_prev)
+ spr->_prev->_next = spr->_next;
+ spr->_prev = NULL;
+ spr->_next = NULL;
+ return spr;
+}
+
+Sprite *Queue::locate(int ref) {
+ for (Sprite *spr = _head; spr; spr = spr->_next) {
+ if (spr->_ref == ref)
+ return spr;
+ }
+ return NULL;
+}
+
+Vga::Vga() : _frmCnt(0), _msg(NULL), _name(NULL), _setPal(false), _mono(0) {
+ _oldColors = NULL;
+ _newColors = NULL;
+ _showQ = new Queue(true);
+ _spareQ = new Queue(false);
+ _sysPal = new Dac[kPalCount];
+
+ for (int idx = 0; idx < 4; idx++) {
+ _page[idx] = new Graphics::Surface();
+ _page[idx]->create(320, 200, Graphics::PixelFormat::createFormatCLUT8());
+ }
+
+#if 0
+ // This part was used to display credits at the beginning of the game
+ for (int i = 10; i < 20; i++) {
+ char *text = _text->getText(i);
+ if (text) {
+ debugN(1, "%s\n", text);
+ }
+ }
+#endif
+ _oldColors = (Dac *)malloc(sizeof(Dac) * kPalCount);
+ _newColors = (Dac *)malloc(sizeof(Dac) * kPalCount);
+ getColors(_oldColors);
+ sunset();
+ setColors();
+ clear(0);
+}
+
+Vga::~Vga() {
+ _mono = 0;
+
+ Common::String buffer = "";
+/*
+ clear(0);
+ setMode(_oldMode);
+ setColors();
+ restoreScreen(_oldScreen);
+ sunrise(_oldColors);
+*/
+ free(_oldColors);
+ free(_newColors);
+ if (_msg)
+ buffer = Common::String(_msg);
+ if (_name)
+ buffer = buffer + " [" + _name + "]";
+
+ debugN("%s", buffer.c_str());
+
+ delete _showQ;
+ delete _spareQ;
+ delete[] _sysPal;
+
+ for (int idx = 0; idx < 4; idx++) {
+ _page[idx]->free();
+ delete _page[idx];
+ }
+}
+
+void Vga::waitVR() {
+ // Since some of the game parts rely on using vertical sync as a delay mechanism,
+ // we're introducing a short delay to simulate it
+ g_system->delayMillis(5);
+}
+
+void Vga::getColors(Dac *tab) {
+ byte palData[kPalSize];
+ g_system->getPaletteManager()->grabPalette(palData, 0, kPalCount);
+ palToDac(palData, tab);
+}
+
+uint8 Vga::closest(Dac *pal, const uint8 colR, const uint8 colG, const uint8 colB) {
+#define f(col, lum) ((((uint16)(col)) << 8) / lum)
+ uint16 i, dif = 0xFFFF, found = 0;
+ uint16 L = colR + colG + colB;
+ if (!L)
+ L++;
+ uint16 R = f(colR, L), G = f(colG, L), B = f(colB, L);
+ for (i = 0; i < 256; i++) {
+ uint16 l = pal[i]._r + pal[i]._g + pal[i]._b;
+ if (!l)
+ l++;
+ int r = f(pal[i]._r, l), g = f(pal[i]._g, l), b = f(pal[i]._b, l);
+ uint16 D = ((r > R) ? (r - R) : (R - r)) +
+ ((g > G) ? (g - G) : (G - g)) +
+ ((b > B) ? (b - B) : (B - b)) +
+ ((l > L) ? (l - L) : (L - l)) * 10 ;
+
+ if (D < dif) {
+ found = i;
+ dif = D;
+ if (D == 0)
+ break; // exact!
+ }
+ }
+ return found;
+#undef f
+}
+
+uint8 *Vga::glass(Dac *pal, const uint8 colR, const uint8 colG, const uint8 colB) {
+ uint8 *x = (uint8 *)malloc(256);
+ if (x) {
+ uint16 i;
+ for (i = 0; i < 256; i++) {
+ x[i] = closest(pal, ((uint16)(pal[i]._r) * colR) / 255,
+ ((uint16)(pal[i]._g) * colG) / 255,
+ ((uint16)(pal[i]._b) * colB) / 255);
+ }
+ }
+ return x;
+}
+
+void Vga::palToDac(const byte *palData, Dac *tab) {
+ const byte *colP = palData;
+ for (int idx = 0; idx < kPalCount; idx++, colP += 3) {
+ tab[idx]._r = *colP >> 2;
+ tab[idx]._g = *(colP + 1) >> 2;
+ tab[idx]._b = *(colP + 2) >> 2;
+ }
+}
+
+void Vga::dacToPal(const Dac *tab, byte *palData) {
+ for (int idx = 0; idx < kPalCount; idx++, palData += 3) {
+ *palData = tab[idx]._r << 2;
+ *(palData + 1) = tab[idx]._g << 2;
+ *(palData + 2) = tab[idx]._b << 2;
+ }
+}
+
+void Vga::setColors(Dac *tab, int lum) {
+ Dac *palP = tab, *destP = _newColors;
+ for (int idx = 0; idx < kPalCount; idx++, palP++, destP++) {
+ destP->_r = (palP->_r * lum) >> 6;
+ destP->_g = (palP->_g * lum) >> 6;
+ destP->_b = (palP->_b * lum) >> 6;
+ }
+
+ if (_mono) {
+ destP = _newColors;
+ for (int idx = 0; idx < kPalCount; idx++, destP++) {
+ // Form a greyscalce colour from 30% R, 59% G, 11% B
+ uint8 intensity = (((int)destP->_r * 77) + ((int)destP->_g * 151) + ((int)destP->_b * 28)) >> 8;
+ destP->_r = intensity;
+ destP->_g = intensity;
+ destP->_b = intensity;
+ }
+ }
+
+ _setPal = true;
+}
+
+void Vga::setColors() {
+ memset(_newColors, 0, kPalSize);
+ updateColors();
+}
+
+void Vga::sunrise(Dac *tab) {
+ for (int i = 0; i <= 64; i += kFadeStep) {
+ setColors(tab, i);
+ waitVR();
+ updateColors();
+ }
+}
+
+void Vga::sunset() {
+ Dac tab[256];
+ getColors(tab);
+ for (int i = 64; i >= 0; i -= kFadeStep) {
+ setColors(tab, i);
+ waitVR();
+ updateColors();
+ }
+}
+
+void Vga::show() {
+ for (Sprite *spr = _showQ->first(); spr; spr = spr->_next)
+ spr->show();
+ update();
+ for (Sprite *spr = _showQ->first(); spr; spr = spr->_next)
+ spr->hide();
+
+ _frmCnt++;
+}
+
+void Vga::updateColors() {
+ byte palData[kPalSize];
+ dacToPal(_newColors, palData);
+ g_system->getPaletteManager()->setPalette(palData, 0, 256);
+}
+
+void Vga::update() {
+ SWAP(Vga::_page[0], Vga::_page[1]);
+
+ if (_setPal) {
+ updateColors();
+ _setPal = false;
+ }
+
+ g_system->copyRectToScreen((const byte *)Vga::_page[0]->getBasePtr(0, 0), kScrWidth, 0, 0, kScrWidth, kScrHeight);
+ g_system->updateScreen();
+}
+
+void Vga::clear(uint8 color) {
+ for (int paneNum = 0; paneNum < 4; paneNum++)
+ _page[paneNum]->fillRect(Common::Rect(0, 0, kScrWidth, kScrHeight), color);
+}
+
+void Vga::copyPage(uint16 d, uint16 s) {
+ _page[d]->copyFrom(*_page[s]);
+}
+
+//--------------------------------------------------------------------------
+
+void Bitmap::xShow(int16 x, int16 y) {
+ debugC(4, kCGEDebugBitmap, "Bitmap::xShow(%d, %d)", x, y);
+
+ const byte *srcP = (const byte *)_v;
+ byte *destEndP = (byte *)_vm->_vga->_page[1]->pixels + (kScrWidth * kScrHeight);
+ byte *lookupTable = _m;
+
+ // Loop through processing data for each plane. The game originally ran in plane mapped mode, where a
+ // given plane holds each fourth pixel sequentially. So to handle an entire picture, each plane's data
+ // must be decompressed and inserted into the surface
+ for (int planeCtr = 0; planeCtr < 4; planeCtr++) {
+ byte *destP = (byte *)_vm->_vga->_page[1]->getBasePtr(x + planeCtr, y);
+
+ for (;;) {
+ uint16 v = READ_LE_UINT16(srcP);
+ srcP += 2;
+ int cmd = v >> 14;
+ int count = v & 0x3FFF;
+
+ if (cmd == 0) {
+ // End of image
+ break;
+ }
+
+ assert(destP < destEndP);
+
+ if (cmd == 2)
+ srcP++;
+ else if (cmd == 3)
+ srcP += count;
+
+ // Handle a set of pixels
+ while (count-- > 0) {
+ // Transfer operation
+ switch (cmd) {
+ case 1:
+ // SKIP
+ break;
+ case 2:
+ case 3:
+ // TINT
+ *destP = lookupTable[*destP];
+ break;
+ }
+
+ // Move to next dest position
+ destP += 4;
+ }
+ }
+ }
+}
+
+
+void Bitmap::show(int16 x, int16 y) {
+ debugC(5, kCGEDebugBitmap, "Bitmap::show(%d, %d)", x, y);
+
+ const byte *srcP = (const byte *)_v;
+ byte *destEndP = (byte *)_vm->_vga->_page[1]->pixels + (kScrWidth * kScrHeight);
+
+ // Loop through processing data for each plane. The game originally ran in plane mapped mode, where a
+ // given plane holds each fourth pixel sequentially. So to handle an entire picture, each plane's data
+ // must be decompressed and inserted into the surface
+ for (int planeCtr = 0; planeCtr < 4; planeCtr++) {
+ byte *destP = (byte *)_vm->_vga->_page[1]->getBasePtr(x + planeCtr, y);
+
+ for (;;) {
+ uint16 v = READ_LE_UINT16(srcP);
+ srcP += 2;
+ int cmd = v >> 14;
+ int count = v & 0x3FFF;
+
+ if (cmd == 0) {
+ // End of image
+ break;
+ }
+
+ assert(destP < destEndP);
+
+ // Handle a set of pixels
+ while (count-- > 0) {
+ // Transfer operation
+ switch (cmd) {
+ case 1:
+ // SKIP
+ break;
+ case 2:
+ // REPEAT
+ *destP = *srcP;
+ break;
+ case 3:
+ // COPY
+ *destP = *srcP++;
+ break;
+ }
+
+ // Move to next dest position
+ destP += 4;
+ }
+
+ if (cmd == 2)
+ srcP++;
+ }
+ }
+}
+
+
+void Bitmap::hide(int16 x, int16 y) {
+ debugC(5, kCGEDebugBitmap, "Bitmap::hide(%d, %d)", x, y);
+
+ for (int yp = y; yp < y + _h; yp++) {
+ const byte *srcP = (const byte *)_vm->_vga->_page[2]->getBasePtr(x, yp);
+ byte *destP = (byte *)_vm->_vga->_page[1]->getBasePtr(x, yp);
+
+ Common::copy(srcP, srcP + _w, destP);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+HorizLine::HorizLine(CGEEngine *vm) : Sprite(vm, NULL), _vm(vm) {
+ // Set the sprite list
+ BitmapPtr *HL = new BitmapPtr[2];
+ HL[0] = new Bitmap(_vm, "HLINE");
+ HL[1] = NULL;
+
+ setShapeList(HL);
+}
+
+SceneLight::SceneLight(CGEEngine *vm) : Sprite(vm, NULL), _vm(vm) {
+ // Set the sprite list
+ BitmapPtr *PR = new BitmapPtr[2];
+ PR[0] = new Bitmap(_vm, "PRESS");
+ PR[1] = NULL;
+
+ setShapeList(PR);
+}
+
+Speaker::Speaker(CGEEngine *vm): Sprite(vm, NULL), _vm(vm) {
+ // Set the sprite list
+ BitmapPtr *SP = new BitmapPtr[3];
+ SP[0] = new Bitmap(_vm, "SPK_L");
+ SP[1] = new Bitmap(_vm, "SPK_R");
+ SP[2] = NULL;
+
+ setShapeList(SP);
+}
+
+PocLight::PocLight(CGEEngine *vm): Sprite(vm, NULL), _vm(vm) {
+ // Set the sprite list
+ BitmapPtr *LI = new BitmapPtr[5];
+ LI[0] = new Bitmap(_vm, "LITE0");
+ LI[1] = new Bitmap(_vm, "LITE1");
+ LI[2] = new Bitmap(_vm, "LITE2");
+ LI[3] = new Bitmap(_vm, "LITE3");
+ LI[4] = NULL;
+
+ setShapeList(LI);
+
+ _flags._kill = false;
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/vga13h.h b/engines/cge/vga13h.h
new file mode 100644
index 0000000000..0c514c4a66
--- /dev/null
+++ b/engines/cge/vga13h.h
@@ -0,0 +1,243 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_VGA13H_H
+#define CGE_VGA13H_H
+
+#include "common/serializer.h"
+#include "graphics/surface.h"
+#include "cge/general.h"
+#include "cge/bitmap.h"
+#include "cge/snail.h"
+#include "cge/cge.h"
+
+namespace CGE {
+
+#define kFadeStep 2
+#define kVgaColDark 207
+#define kVgaColDarkGray 225 /*219*/
+#define kVgaColGray 231
+#define kVgaColLightGray 237
+#define kPixelTransp 0xFE
+#define kNoSeq (-1)
+#define kNoPtr ((uint8)-1)
+#define kSprExt ".SPR"
+#define kPalCount 256
+#define kPalSize (kPalCount * 3)
+
+
+struct Seq {
+ uint8 _now;
+ uint8 _next;
+ int8 _dx;
+ int8 _dy;
+ int _dly;
+};
+
+class SprExt {
+public:
+ int _x0;
+ int _y0;
+ int _x1;
+ int _y1;
+ BitmapPtr _b0;
+ BitmapPtr _b1;
+ BitmapPtr *_shpList;
+ Seq *_seq;
+ char *_name;
+ CommandHandler::Command *_near;
+ CommandHandler::Command *_take;
+ SprExt() :
+ _x0(0), _y0(0),
+ _x1(0), _y1(0),
+ _b0(NULL), _b1(NULL),
+ _shpList(NULL), _seq(NULL),
+ _name(NULL), _near(NULL), _take(NULL)
+ {}
+};
+
+class Sprite {
+protected:
+ SprExt *_ext;
+public:
+ int _ref;
+ signed char _scene;
+ struct Flags {
+ uint16 _hide : 1; // general visibility switch
+ uint16 _near : 1; // Near action lock
+ uint16 _drag : 1; // sprite is moveable
+ uint16 _hold : 1; // sprite is held with mouse
+ uint16 _____ : 1; // intrrupt driven animation
+ uint16 _slav : 1; // slave object
+ uint16 _syst : 1; // system object
+ uint16 _kill : 1; // dispose memory after remove
+ uint16 _xlat : 1; // 2nd way display: xlat table
+ uint16 _port : 1; // portable
+ uint16 _kept : 1; // kept in pocket
+ uint16 _east : 1; // talk to east (in opposite to west)
+ uint16 _shad : 1; // shadow
+ uint16 _back : 1; // 'send to background' request
+ uint16 _bDel : 1; // delete bitmaps in ~SPRITE
+ uint16 _tran : 1; // transparent (untouchable)
+ } _flags;
+ int _x;
+ int _y;
+ signed char _z;
+ uint16 _w;
+ uint16 _h;
+ uint16 _time;
+ uint8 _nearPtr;
+ uint8 _takePtr;
+ int _seqPtr;
+ int _shpCnt;
+ char _file[kMaxFile];
+ Sprite *_prev;
+ Sprite *_next;
+
+ bool works(Sprite *spr);
+ bool seqTest(int n);
+ inline bool active() {
+ return _ext != NULL;
+ }
+
+ Sprite(CGEEngine *vm, BitmapPtr *shp);
+ virtual ~Sprite();
+ BitmapPtr shp();
+ BitmapPtr *setShapeList(BitmapPtr *shp);
+ void moveShapes(uint8 *buf);
+ Sprite *expand();
+ Sprite *contract();
+ Sprite *backShow(bool fast = false);
+ void setName(char *newName);
+ inline char *name() {
+ return (_ext) ? _ext->_name : NULL;
+ }
+ void gotoxy(int x, int y);
+ void center();
+ void show();
+ void hide();
+ BitmapPtr ghost();
+ void show(uint16 pg);
+ void makeXlat(uint8 *x);
+ void killXlat();
+ void step(int nr = -1);
+ Seq *setSeq(Seq *seq);
+ CommandHandler::Command *snList(SnList type);
+ virtual void touch(uint16 mask, int x, int y);
+ virtual void tick();
+ void sync(Common::Serializer &s);
+private:
+ CGEEngine *_vm;
+};
+
+class Queue {
+ Sprite *_head;
+ Sprite *_tail;
+public:
+ Queue(bool show);
+ ~Queue();
+
+ bool _show;
+
+ void append(Sprite *spr);
+ void insert(Sprite *spr, Sprite *nxt);
+ void insert(Sprite *spr);
+ Sprite *remove(Sprite *spr);
+ Sprite *first() {
+ return _head;
+ }
+ Sprite *last() {
+ return _tail;
+ }
+ Sprite *locate(int ref);
+ void clear();
+};
+
+class Vga {
+ bool _setPal;
+ Dac *_oldColors;
+ Dac *_newColors;
+ const char *_msg;
+ const char *_name;
+
+ void updateColors();
+ void setColors();
+ void waitVR();
+ uint8 closest(Dac *pal, const uint8 colR, const uint8 colG, const uint8 colB);
+
+public:
+ uint32 _frmCnt;
+ Queue *_showQ;
+ Queue *_spareQ;
+ int _mono;
+ Graphics::Surface *_page[4];
+ Dac *_sysPal;
+
+ Vga();
+ ~Vga();
+
+ uint8 *glass(Dac *pal, const uint8 colR, const uint8 colG, const uint8 colB);
+ void getColors(Dac *tab);
+ void setColors(Dac *tab, int lum);
+ void clear(uint8 color);
+ void copyPage(uint16 d, uint16 s);
+ void sunrise(Dac *tab);
+ void sunset();
+ void show();
+ void update();
+
+ void palToDac(const byte *palData, Dac *tab);
+ void dacToPal(const Dac *tab, byte *palData);
+};
+
+class HorizLine: public Sprite {
+ CGEEngine *_vm;
+public:
+ HorizLine(CGEEngine *vm);
+};
+
+class SceneLight: public Sprite {
+ CGEEngine *_vm;
+public:
+ SceneLight(CGEEngine *vm);
+};
+
+class Speaker: public Sprite {
+ CGEEngine *_vm;
+public:
+ Speaker(CGEEngine *vm);
+};
+
+class PocLight: public Sprite {
+ CGEEngine *_vm;
+public:
+ PocLight(CGEEngine *vm);
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/vmenu.cpp b/engines/cge/vmenu.cpp
new file mode 100644
index 0000000000..a317a765d4
--- /dev/null
+++ b/engines/cge/vmenu.cpp
@@ -0,0 +1,142 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/vmenu.h"
+#include "cge/events.h"
+#include "cge/cge_main.h"
+
+namespace CGE {
+
+MenuBar::MenuBar(CGEEngine *vm, uint16 w) : Talk(vm), _vm(vm) {
+ int h = kFontHigh + 2 * kMenuBarVM;
+ int i = (w += 2 * kMenuBarHM) * h;
+ uint8 *p = (uint8 *)malloc(sizeof(uint8) * i);
+
+ memset(p + w, kPixelTransp, i - 2 * w);
+ memset(p, kMenuBarLT, w);
+ memset(p + i - w, kMenuBarRB, w);
+ uint8 *p1 = p;
+ uint8 *p2 = p + i - 1;
+ for (int cpt = 0; cpt < h; cpt++) {
+ *p1 = kMenuBarLT;
+ *p2 = kMenuBarRB;
+ p1 += w;
+ p2 -= w;
+ }
+
+ _ts = new BitmapPtr[2];
+ _ts[0] = new Bitmap(_vm, w, h, p);
+ _ts[1] = NULL;
+ setShapeList(_ts);
+
+ _flags._slav = true;
+ _flags._tran = true;
+ _flags._kill = true;
+ _flags._bDel = true;
+}
+
+Vmenu *Vmenu::_addr = NULL;
+int Vmenu::_recent = -1;
+
+Vmenu::Vmenu(CGEEngine *vm, Choice *list, int x, int y)
+ : Talk(vm, VMGather(list), kTBRect), _menu(list), _bar(NULL), _vm(vm) {
+ Choice *cp;
+
+ _addr = this;
+ delete[] _vmgt;
+ _items = 0;
+ for (cp = list; cp->_text; cp++)
+ _items++;
+ _flags._bDel = true;
+ _flags._kill = true;
+ if (x < 0 || y < 0)
+ center();
+ else
+ gotoxy(x - _w / 2, y - (kTextVMargin + kFontHigh / 2));
+ _vm->_vga->_showQ->insert(this, _vm->_vga->_showQ->last());
+ _bar = new MenuBar(_vm, _w - 2 * kTextHMargin);
+ _bar->gotoxy(_x + kTextHMargin - kMenuBarHM, _y + kTextVMargin - kMenuBarVM);
+ _vm->_vga->_showQ->insert(_bar, _vm->_vga->_showQ->last());
+}
+
+Vmenu::~Vmenu() {
+ _addr = NULL;
+}
+
+#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
+
+void Vmenu::touch(uint16 mask, int x, int y) {
+ if (!_items)
+ return;
+
+ Sprite::touch(mask, x, y);
+
+ y -= kTextVMargin - 1;
+ int n = 0;
+ bool ok = false;
+ uint16 h = kFontHigh + kTextLineSpace;
+
+ if (y >= 0) {
+ n = y / h;
+ if (n < _items)
+ ok = (x >= kTextHMargin && x < _w - kTextHMargin/* && y % h < FONT_HIG*/);
+ else
+ n = _items - 1;
+ }
+
+ _bar->gotoxy(_x + kTextHMargin - kMenuBarHM, _y + kTextVMargin + n * h - kMenuBarVM);
+
+ if (ok && (mask & kMouseLeftUp)) {
+ _items = 0;
+ _vm->_commandHandlerTurbo->addCommand(kCmdKill, -1, 0, this);
+ _recent = n;
+ assert(_menu[n].Proc);
+ CALL_MEMBER_FN(*_vm, _menu[n].Proc)();
+ }
+}
+
+char *Vmenu::VMGather(Choice *list) {
+ Choice *cp;
+ int len = 0, h = 0;
+
+ for (cp = list; cp->_text; cp++) {
+ len += strlen(cp->_text);
+ h++;
+ }
+ _vmgt = new char[len + h];
+ if (_vmgt) {
+ *_vmgt = '\0';
+ for (cp = list; cp->_text; cp++) {
+ if (*_vmgt)
+ strcat(_vmgt, "|");
+ strcat(_vmgt, cp->_text);
+ h++;
+ }
+ }
+ return _vmgt;
+}
+} // End of namespace CGE
diff --git a/engines/cge/vmenu.h b/engines/cge/vmenu.h
new file mode 100644
index 0000000000..89ef7a9484
--- /dev/null
+++ b/engines/cge/vmenu.h
@@ -0,0 +1,73 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_VMENU_H
+#define CGE_VMENU_H
+
+#include "cge/talk.h"
+
+namespace CGE {
+
+#define kMenuBarVM 1
+#define kMenuBarHM 3
+#define kMenuBarLT kVgaColLightGray
+#define kMenuBarRB kVgaColDarkGray
+
+
+struct Choice {
+ const char *_text;
+ void (CGEEngine::*Proc)();
+};
+
+
+class MenuBar : public Talk {
+public:
+ MenuBar(CGEEngine *vm, uint16 w);
+private:
+ CGEEngine *_vm;
+};
+
+class Vmenu : public Talk {
+public:
+ static Vmenu *_addr;
+ static int _recent;
+ MenuBar *_bar;
+ Vmenu(CGEEngine *vm, Choice *list, int x, int y);
+ ~Vmenu();
+ virtual void touch(uint16 mask, int x, int y);
+private:
+ char *_vmgt;
+ CGEEngine *_vm;
+ uint16 _items;
+ Choice *_menu;
+
+ char *VMGather(Choice *list);
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cge/walk.cpp b/engines/cge/walk.cpp
new file mode 100644
index 0000000000..22c06a17c1
--- /dev/null
+++ b/engines/cge/walk.cpp
@@ -0,0 +1,273 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#include "cge/walk.h"
+#include "cge/cge_main.h"
+
+namespace CGE {
+
+Cluster::Cluster(CGEEngine *vm, int16 a, int16 b) : _vm(vm) {
+ _pt = Common::Point(a, b);
+}
+
+Cluster::Cluster(CGEEngine *vm) : _vm(vm) {
+ _pt = Common::Point(-1, -1);
+}
+
+uint8 &Cluster::cell() {
+ return _vm->_clusterMap[_pt.y][_pt.x];
+}
+
+bool Cluster::isValid() const {
+ return (_pt.x >= 0) && (_pt.x < kMapXCnt) && (_pt.y >= 0) && (_pt.y < kMapZCnt);
+}
+
+Walk::Walk(CGEEngine *vm, BitmapPtr *shpl)
+ : Sprite(vm, shpl), _dir(kDirNone), _tracePtr(-1), _level(0), _target(-1, -1), _findLevel(-1), _here(vm), _vm(vm) {
+ for (int i = 0; i < kMaxFindLevel; i++) {
+ Cluster *tmpClust = new Cluster(_vm);
+ _trace.push_back(tmpClust);
+ }
+}
+
+Walk::~Walk() {
+ for (uint idx = 0; idx < _trace.size(); ++idx)
+ delete _trace[idx];
+}
+
+void Walk::tick() {
+ if (_flags._hide)
+ return;
+
+ _here = _vm->XZ(_x + _w / 2, _y + _h);
+
+ if (_dir != kDirNone) {
+ _vm->_sys->funTouch();
+ for (Sprite *spr = _vm->_vga->_showQ->first(); spr; spr = spr->_next) {
+ if (distance(spr) < 2) {
+ if (!spr->_flags._near) {
+ _vm->feedSnail(spr, kNear);
+ spr->_flags._near = true;
+ }
+ } else {
+ spr->_flags._near = false;
+ }
+ }
+ }
+
+ if (_flags._hold || _tracePtr < 0) {
+ park();
+ } else {
+ if (_here._pt == _trace[_tracePtr]->_pt) {
+ if (--_tracePtr < 0)
+ park();
+ } else {
+ Common::Point tmpPoint = _trace[_tracePtr]->_pt - _here._pt;
+ int16 dx = tmpPoint.x;
+ int16 dz = tmpPoint.y;
+ Dir d = (dx) ? ((dx > 0) ? kDirEast : kDirWest) : ((dz > 0) ? kDirSouth : kDirNorth);
+ turn(d);
+ }
+ }
+
+ step();
+
+ if ((_dir == kDirWest && _x <= 0) ||
+ (_dir == kDirEast && _x + _w >= kScrWidth) ||
+ (_dir == kDirSouth && _y + _w >= kWorldHeight - 2)) {
+ park();
+ } else {
+ // take current Z position
+ _z = _here._pt.y;
+ _vm->_commandHandlerTurbo->addCommand(kCmdZTrim, -1, 0, this); // update Hero's pos in show queue
+ }
+}
+
+int Walk::distance(Sprite *spr) {
+ int dx = spr->_x - (_x + _w - kWalkSide);
+ if (dx < 0)
+ dx = (_x + kWalkSide) - (spr->_x + spr->_w);
+
+ if (dx < 0)
+ dx = 0;
+
+ dx /= kMapGridX;
+ int dz = spr->_z - _z;
+ if (dz < 0)
+ dz = - dz;
+
+ dx = dx * dx + dz * dz;
+ for (dz = 1; dz * dz < dx; dz++)
+ ;
+
+ return dz - 1;
+}
+/**
+ * Turn the character to a given direction
+ * @param d Direction
+ */
+void Walk::turn(Dir d) {
+ Dir dir = (_dir == kDirNone) ? kDirSouth : _dir;
+ if (d != _dir) {
+ step((d == dir) ? (1 + dir + dir) : (9 + 4 * dir + d));
+ _dir = d;
+ }
+}
+
+/**
+ * Stop the character and reset his direction
+ */
+void Walk::park() {
+ if (_time == 0)
+ _time++;
+
+ if (_dir != kDirNone) {
+ step(9 + 4 * _dir + _dir);
+ _dir = kDirNone;
+ _tracePtr = -1;
+ }
+}
+
+void Walk::findWay(Cluster c) {
+ if (c._pt == _here._pt)
+ return;
+
+ for (_findLevel = 1; _findLevel <= kMaxFindLevel; _findLevel++) {
+ _target = _here._pt;
+ int16 x = c._pt.x;
+ int16 z = c._pt.y;
+
+ if (find1Way(Cluster(_vm, x, z)))
+ break;
+ }
+
+ _tracePtr = (_findLevel > kMaxFindLevel) ? -1 : (_findLevel - 1);
+ if (_tracePtr < 0)
+ noWay();
+ _time = 1;
+}
+
+void Walk::findWay(Sprite *spr) {
+ if (!spr || spr == this)
+ return;
+
+ int x = spr->_x;
+ int z = spr->_z;
+ if (spr->_flags._east)
+ x += spr->_w + _w / 2 - kWalkSide;
+ else
+ x -= _w / 2 - kWalkSide;
+
+ findWay(Cluster(_vm, (x / kMapGridX),
+ ((z < kMapZCnt - kDistMax) ? (z + 1)
+ : (z - 1))));
+}
+
+bool Walk::lower(Sprite *spr) {
+ return (spr->_y > _y + (_h * 3) / 5);
+}
+
+void Walk::reach(Sprite *spr, int mode) {
+ if (spr) {
+ _vm->_hero->findWay(spr);
+ if (mode < 0) {
+ mode = spr->_flags._east;
+ if (lower(spr))
+ mode += 2;
+ }
+ }
+ // note: insert SNAIL commands in reverse order
+ _vm->_commandHandler->insertCommand(kCmdPause, -1, 64, NULL);
+ _vm->_commandHandler->insertCommand(kCmdSeq, -1, kTSeq + mode, this);
+ if (spr) {
+ _vm->_commandHandler->insertCommand(kCmdWait, -1, -1, _vm->_hero);
+ //SNINSERT(SNWALK, -1, -1, spr);
+ }
+ // sequence is not finished,
+ // now it is just at sprite appear (disappear) point
+}
+
+void Walk::noWay() {
+ _vm->trouble(kSeqNoWay, kNoWay);
+}
+
+bool Cluster::chkBar() const {
+ assert(_vm->_now <= kSceneMax);
+ return (_pt.x == _vm->_barriers[_vm->_now]._horz) || (_pt.y == _vm->_barriers[_vm->_now]._vert);
+}
+
+bool Walk::find1Way(Cluster c) {
+ const Cluster tab[4] = { Cluster(_vm, -1, 0), Cluster(_vm, 1, 0), Cluster(_vm, 0, -1), Cluster(_vm, 0, 1)};
+ const int tabLen = 4;
+
+ if (c._pt == _target)
+ // Found destination
+ return true;
+
+ if (_level >= _findLevel)
+ // Nesting limit
+ return false;
+
+ // Look for barriers
+ if (c.chkBar())
+ return false;
+
+ if (c.cell())
+ // Location is occupied
+ return false;
+
+ // Loop through each direction
+ Cluster start = c;
+ for (int i = 0; i < tabLen; i++) {
+ // Reset to starting position
+ c = start;
+
+ do {
+ c._pt += tab[i]._pt;
+ if (!c.isValid())
+ // Break to check next direction
+ break;
+
+ // Recursively check for further paths
+ ++_level;
+ ++start.cell();
+ bool foundPath = find1Way(c);
+ --start.cell();
+ --_level;
+
+ if (foundPath) {
+ // Set route point
+ _trace[_level]->_pt = start._pt;
+ return true;
+ }
+ } while (!c.chkBar() && !c.cell());
+ }
+
+ return false;
+}
+
+} // End of namespace CGE
diff --git a/engines/cge/walk.h b/engines/cge/walk.h
new file mode 100644
index 0000000000..99dc362eec
--- /dev/null
+++ b/engines/cge/walk.h
@@ -0,0 +1,87 @@
+/* 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 code is based on original Soltys source code
+ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
+ */
+
+#ifndef CGE_WALK_H
+#define CGE_WALK_H
+
+#include "common/rect.h"
+#include "cge/vga13h.h"
+#include "cge/events.h"
+
+namespace CGE {
+
+#define kMapArrSize (kMapZCnt * kMapXCnt)
+#define kMapTop 80
+#define kMapHig 80
+#define kMapGridX (kScrWidth / kMapXCnt)
+#define kMapGridZ (kMapHig / kMapZCnt)
+#define kMaxFindLevel 3
+
+enum Dir { kDirNone = -1, kDirNorth, kDirEast, kDirSouth, kDirWest };
+
+class Cluster {
+public:
+ CGEEngine *_vm;
+ Common::Point _pt;
+public:
+ uint8 &cell();
+ Cluster(CGEEngine *vm, int16 a, int16 b);
+ Cluster(CGEEngine *vm);
+ bool chkBar() const;
+ bool isValid() const;
+};
+
+class Walk : public Sprite {
+private:
+ CGEEngine *_vm;
+public:
+ Cluster _here;
+ int _tracePtr;
+ int _level;
+ int _findLevel;
+ Common::Point _target;
+ Common::Array<Cluster *> _trace;
+
+ Dir _dir;
+ Walk(CGEEngine *vm, BitmapPtr *shpl);
+ ~Walk();
+ void tick();
+ void findWay(Cluster c);
+ void findWay(Sprite *spr);
+ int distance(Sprite *spr);
+ void turn(Dir d);
+ void park();
+ bool lower(Sprite *spr);
+ void reach(Sprite *spr, int mode = -1);
+
+ void noWay();
+ bool find1Way(Cluster c);
+};
+
+} // End of namespace CGE
+
+#endif
diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp
index cffeb29418..a64272d967 100644
--- a/engines/cine/detection.cpp
+++ b/engines/cine/detection.cpp
@@ -65,7 +65,7 @@ class CineMetaEngine : public AdvancedMetaEngine {
public:
CineMetaEngine() : AdvancedMetaEngine(Cine::gameDescriptions, sizeof(Cine::CINEGameDescription), cineGames) {
_singleid = "cine";
- _guioptions = Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI;
+ _guioptions = GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI);
}
virtual GameDescriptor findGame(const char *gameid) const {
@@ -141,7 +141,7 @@ SaveStateList CineMetaEngine::listSaves(const char *target) const {
for (file = filenames.begin(); file != filenames.end(); ++file) {
// Jump over savegame files that don't end with a digit (e.g. "fw.3" is ok, "fw.a" is not).
- if (!isdigit(file->lastChar()))
+ if (!isdigit(static_cast<unsigned char>(file->lastChar())))
continue;
// Obtain the last digit of the filename, since they correspond to the save slot
diff --git a/engines/cine/detection_tables.h b/engines/cine/detection_tables.h
index 4b293deb62..c8ab63edaf 100644
--- a/engines/cine/detection_tables.h
+++ b/engines/cine/detection_tables.h
@@ -22,8 +22,6 @@
namespace Cine {
-using Common::GUIO_NONE;
-
static const CINEGameDescription gameDescriptions[] = {
{
{
@@ -33,7 +31,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -53,7 +51,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_USA,
Common::kPlatformPC,
ADGF_CD,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
GF_CD | GF_CRYPTED_BOOT_PRC,
@@ -68,7 +66,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -82,7 +80,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
GF_ALT_FONT,
@@ -96,7 +94,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
GF_ALT_FONT,
@@ -110,7 +108,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -124,7 +122,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -138,7 +136,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_USA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -152,7 +150,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
GF_ALT_FONT,
@@ -166,7 +164,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -180,7 +178,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -194,7 +192,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -212,7 +210,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -226,7 +224,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -240,7 +238,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_FW,
0,
@@ -254,7 +252,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -270,7 +268,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -284,7 +282,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_USA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -298,7 +296,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_USA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
GF_CD,
@@ -312,7 +310,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -326,7 +324,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -344,7 +342,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
GF_CD,
@@ -358,7 +356,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -372,7 +370,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -386,7 +384,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -400,7 +398,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -414,7 +412,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_USA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -428,7 +426,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -442,7 +440,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -456,7 +454,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -470,7 +468,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformAmiga,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
GF_DEMO,
@@ -484,7 +482,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
@@ -498,7 +496,7 @@ static const CINEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_OS,
0,
diff --git a/engines/cine/prc.cpp b/engines/cine/prc.cpp
index d86107a8f8..ba9ba70110 100644
--- a/engines/cine/prc.cpp
+++ b/engines/cine/prc.cpp
@@ -98,10 +98,10 @@ bool loadPrc(const char *pPrcName) {
char buffer[256];
for (s = 0; s < numScripts; s++) {
- if (scriptTable[s]->_size) {
+ if (g_cine->_scriptTable[s]->_size) {
sprintf(buffer, "%s_%03d.txt", pPrcName, s);
- decompileScript((const byte *)scriptTable[s]->getString(0), scriptTable[s]->_size, s);
+ decompileScript((const byte *)g_cine->_scriptTable[s]->getString(0), g_cine->_scriptTable[s]->_size, s);
dumpScript(buffer);
}
}
diff --git a/engines/cine/texte.cpp b/engines/cine/texte.cpp
index dc18d081c7..33ea569df7 100644
--- a/engines/cine/texte.cpp
+++ b/engines/cine/texte.cpp
@@ -28,13 +28,13 @@
namespace Cine {
-const char **failureMessages;
+const char *const *failureMessages;
const CommandeType *defaultActionCommand;
const CommandeType *systemMenu;
const CommandeType *confirmMenu;
-const char **otherMessages;
+const char *const *otherMessages;
const char *defaultCommandPreposition;
-const char **commandPrepositionTable;
+const char *const *commandPrepositionTable;
/**
* Loads font data from the given file.
@@ -152,7 +152,7 @@ static const CharacterEntry fontParamTable_alt[NUM_FONT_CHARS] = {
};
void initLanguage(Common::Language lang) {
- static const char *failureMessages_EN[] = {
+ static const char *const failureMessages_EN[] = {
// EXAMINE
"I don't see anything unusual.",
"There's nothing of interest here.",
@@ -195,7 +195,7 @@ void initLanguage(Common::Language lang) {
"NOACTION"
};
- static const char *commandPrepositionTable_EN[] = {
+ static const char *const commandPrepositionTable_EN[] = {
"", // EXAMINE
"", // TAKE
"", // INVENTORY
@@ -214,7 +214,7 @@ void initLanguage(Common::Language lang) {
"Save game"
};
- static const char *otherMessages_EN[] = {
+ static const char *const otherMessages_EN[] = {
"This backup doesn't exist ...",
"Could not create save file ...",
"PAUSE",
@@ -229,7 +229,7 @@ void initLanguage(Common::Language lang) {
"Absolutely Not!"
};
- static const char *failureMessages_FR[] = {
+ static const char *const failureMessages_FR[] = {
// EXAMINER
"Je ne vois rien de special.",
"Il n'y a rien d'int\x82ressant.",
@@ -272,7 +272,7 @@ void initLanguage(Common::Language lang) {
"NOACTION"
};
- static const char *commandPrepositionTable_FR[] = {
+ static const char *const commandPrepositionTable_FR[] = {
"", // EXAMINER
"", // PRENDRE
"", // INVENTAIRE
@@ -296,7 +296,7 @@ void initLanguage(Common::Language lang) {
"Surtout Pas !"
};
- static const char *otherMessages_FR[] = {
+ static const char *const otherMessages_FR[] = {
"Cette sauvegarde n'existe pas ...",
"Could not create save file ...", //
"PAUSE",
@@ -306,7 +306,7 @@ void initLanguage(Common::Language lang) {
"Veuillez entrer le Nom de la Sauvegarde ."
};
- static const char *failureMessages_ES[] = {
+ static const char *const failureMessages_ES[] = {
// EXAMINE
"No veo nada especial",
"No hay nada interesante",
@@ -349,7 +349,7 @@ void initLanguage(Common::Language lang) {
"NOACTION"
};
- static const char *commandPrepositionTable_ES[] = {
+ static const char *const commandPrepositionTable_ES[] = {
"", // EXAMINAR
"", // COGER
"", // INVENTARIO
@@ -373,7 +373,7 @@ void initLanguage(Common::Language lang) {
"Nade de nada !"
};
- static const char *otherMessages_ES[] = {
+ static const char *const otherMessages_ES[] = {
"Esta granacion no existe",
"Could not create save file ...", //
"PAUSE",
@@ -383,7 +383,7 @@ void initLanguage(Common::Language lang) {
"Teclea el nombre de la partida grabada"
};
- static const char *failureMessages_DE[] = {
+ static const char *const failureMessages_DE[] = {
// EXAMINE
"Ich sehe nichts Besonderes",
"Es gibt hier nichts Interessantes",
@@ -426,7 +426,7 @@ void initLanguage(Common::Language lang) {
"NOACTION"
};
- static const char *commandPrepositionTable_DE[] = {
+ static const char *const commandPrepositionTable_DE[] = {
"", // Prufe
"", // Nimm
"", // Bestand
@@ -450,7 +450,7 @@ void initLanguage(Common::Language lang) {
"Absolut Nicht!"
};
- static const char *otherMessages_DE[] = {
+ static const char *const otherMessages_DE[] = {
"Diese Sicherungskopie gibt es nicht",
"Could not create save file ...", //
"PAUSE",
@@ -460,7 +460,7 @@ void initLanguage(Common::Language lang) {
"Geben Sie den Namen|der Sicherungsdiskette ein"
};
- static const char *failureMessages_IT[] = {
+ static const char *const failureMessages_IT[] = {
// EXAMINE
"Non vedo nula di speciale",
"Non c'\x8a niente di interessante",
@@ -503,7 +503,7 @@ void initLanguage(Common::Language lang) {
"NOACTION"
};
- static const char *commandPrepositionTable_IT[] = {
+ static const char *const commandPrepositionTable_IT[] = {
"", // ESAMINARE
"", // PRENDERE
"", // INVENTARIO
@@ -527,7 +527,7 @@ void initLanguage(Common::Language lang) {
"Supratutto non!"
};
- static const char *otherMessages_IT[] = {
+ static const char *const otherMessages_IT[] = {
"Questo salvataggio non esiste...",
"Could not create save file ...", //
"PAUSE",
@@ -612,7 +612,7 @@ void loadErrmessDat(const char *fname) {
ptr[i] = (char *)ptr + (sizeof(char *) * 6 * 4) + 60 * i;
in.read(ptr[i], 60);
}
- failureMessages = const_cast<const char **>(ptr);
+ failureMessages = const_cast<const char *const *>(ptr);
in.close();
} else {
@@ -621,7 +621,7 @@ void loadErrmessDat(const char *fname) {
}
void freeErrmessDat() {
- free(failureMessages);
+ free(const_cast<const char **>(failureMessages));
failureMessages = 0;
}
diff --git a/engines/cine/texte.h b/engines/cine/texte.h
index f82127db98..dd4b7e06ee 100644
--- a/engines/cine/texte.h
+++ b/engines/cine/texte.h
@@ -50,13 +50,13 @@ struct TextHandler {
CharacterEntry fontParamTable[NUM_FONT_CHARS];
};
-extern const char **failureMessages;
+extern const char *const *failureMessages;
extern const CommandeType *defaultActionCommand;
extern const CommandeType *systemMenu;
extern const CommandeType *confirmMenu;
-extern const char **otherMessages;
+extern const char *const *otherMessages;
extern const char *defaultCommandPreposition;
-extern const char **commandPrepositionTable;
+extern const char *const *commandPrepositionTable;
void loadTextData(const char *filename);
void loadErrmessDat(const char *fname);
diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp
index cdb5140002..9b73ae1101 100644
--- a/engines/cine/various.cpp
+++ b/engines/cine/various.cpp
@@ -685,11 +685,8 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
int16 paramY;
uint16 button;
int16 var_A;
- int16 di;
uint16 j;
int16 mouseX, mouseY;
- int16 var_16;
- int16 var_14;
int16 currentSelection, oldSelection;
int16 var_4;
SelectionMenu *menu;
@@ -723,17 +720,12 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
currentSelection = 0;
- di = currentSelection * 9 + Y + 4;
-
menu->setSelection(currentSelection);
renderer->drawFrame();
manageEvents();
getMouseData(mouseUpdateStatus, &button, (uint16 *)&mouseX, (uint16 *)&mouseY);
- var_16 = mouseX;
- var_14 = mouseY;
-
menuVar = 0;
do {
@@ -777,8 +769,6 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
hideMouse();
}
- di = currentSelection * 9 + Y + 4;
-
menu->setSelection(currentSelection);
renderer->drawFrame();
diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp
new file mode 100644
index 0000000000..085ce815dd
--- /dev/null
+++ b/engines/composer/composer.cpp
@@ -0,0 +1,527 @@
+/* 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.
+ *
+ */
+#include "common/scummsys.h"
+
+#include "common/config-manager.h"
+#include "common/events.h"
+#include "common/file.h"
+#include "common/random.h"
+#include "common/fs.h"
+#include "common/keyboard.h"
+#include "common/substream.h"
+
+#include "graphics/cursorman.h"
+#include "graphics/surface.h"
+#include "graphics/pixelformat.h"
+
+#include "engines/util.h"
+#include "engines/advancedDetector.h"
+
+#include "audio/audiostream.h"
+
+#include "composer/composer.h"
+#include "composer/graphics.h"
+#include "composer/resource.h"
+
+namespace Composer {
+
+ComposerEngine::ComposerEngine(OSystem *syst, const ComposerGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
+ _rnd = new Common::RandomSource("composer");
+ _audioStream = NULL;
+}
+
+ComposerEngine::~ComposerEngine() {
+ DebugMan.clearAllDebugChannels();
+
+ for (Common::List<Library>::iterator i = _libraries.begin(); i != _libraries.end(); i++)
+ delete i->_archive;
+ for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++)
+ i->_surface.free();
+
+ delete _rnd;
+}
+
+Common::Error ComposerEngine::run() {
+ Common::Event event;
+
+ _vars.resize(1000);
+ for (uint i = 0; i < _vars.size(); i++)
+ _vars[i] = 0;
+
+ _queuedScripts.resize(10);
+ for (uint i = 0; i < _queuedScripts.size(); i++) {
+ _queuedScripts[i]._count = 0;
+ _queuedScripts[i]._scriptId = 0;
+ }
+
+ _mouseVisible = true;
+ _mouseEnabled = false;
+ _mouseSpriteId = 0;
+ _lastButton = NULL;
+
+ _directoriesToStrip = 1;
+ if (!_bookIni.loadFromFile("book.ini")) {
+ _directoriesToStrip = 0;
+ if (!_bookIni.loadFromFile("programs/book.ini")) {
+ // mac version?
+ if (!_bookIni.loadFromFile("Darby the Dragon.ini"))
+ if (!_bookIni.loadFromFile("Gregory.ini"))
+ error("failed to find book.ini");
+ }
+ }
+
+ uint width = 640;
+ if (_bookIni.hasKey("Width", "Common"))
+ width = atoi(getStringFromConfig("Common", "Width").c_str());
+ uint height = 480;
+ if (_bookIni.hasKey("Height", "Common"))
+ height = atoi(getStringFromConfig("Common", "Height").c_str());
+ initGraphics(width, height, true);
+ _surface.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+ _needsUpdate = true;
+
+ loadLibrary(0);
+
+ _currentTime = 0;
+ _lastTime = 0;
+
+ uint fps = atoi(getStringFromConfig("Common", "FPS").c_str());
+ uint frameTime = 1000 / fps;
+ uint32 lastDrawTime = 0;
+
+ while (!shouldQuit()) {
+ for (uint i = 0; i < _pendingPageChanges.size(); i++) {
+ if (_pendingPageChanges[i]._remove)
+ unloadLibrary(_pendingPageChanges[i]._pageId);
+ else
+ loadLibrary(_pendingPageChanges[i]._pageId);
+
+ lastDrawTime = _system->getMillis();
+ }
+ _pendingPageChanges.clear();
+
+ uint32 thisTime = _system->getMillis();
+ // maintain our own internal timing, since otherwise we get
+ // confused when starved of CPU (for example when the user
+ // is dragging the scummvm window around)
+ if (thisTime > _lastTime + frameTime)
+ _currentTime += frameTime;
+ else
+ _currentTime += thisTime - _lastTime;
+ _lastTime = thisTime;
+
+ for (uint i = 0; i < _queuedScripts.size(); i++) {
+ QueuedScript &script = _queuedScripts[i];
+ if (!script._count)
+ continue;
+ if (script._baseTime + script._duration > _currentTime)
+ continue;
+ if (script._count != 0xffffffff)
+ script._count--;
+ script._baseTime = _currentTime;
+ runScript(script._scriptId, i, 0, 0);
+ }
+
+ if (lastDrawTime + frameTime <= thisTime) {
+ // catch up if we're more than 2 frames behind
+ if (lastDrawTime + (frameTime * 2) <= thisTime)
+ lastDrawTime = thisTime;
+ else
+ lastDrawTime += frameTime;
+
+ redraw();
+
+ processAnimFrame();
+ } else if (_needsUpdate) {
+ redraw();
+ }
+
+ while (_eventMan->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_LBUTTONDOWN:
+ onMouseDown(event.mouse);
+ break;
+
+ case Common::EVENT_LBUTTONUP:
+ break;
+
+ case Common::EVENT_RBUTTONDOWN:
+ break;
+
+ case Common::EVENT_MOUSEMOVE:
+ onMouseMove(event.mouse);
+ break;
+
+ case Common::EVENT_KEYDOWN:
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_d:
+ /*if (event.kbd.hasFlags(Common::KBD_CTRL)) {
+ // Start the debugger
+ getDebugger()->attach();
+ getDebugger()->onFrame();
+ }*/
+ break;
+
+ case Common::KEYCODE_q:
+ if (event.kbd.hasFlags(Common::KBD_CTRL))
+ quitGame();
+ break;
+
+ default:
+ break;
+ }
+
+ onKeyDown(event.kbd.keycode);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ _system->delayMillis(20);
+ }
+
+ return Common::kNoError;
+}
+
+void ComposerEngine::onMouseDown(const Common::Point &pos) {
+ if (!_mouseEnabled || !_mouseVisible)
+ return;
+
+ const Sprite *sprite = getSpriteAtPos(pos);
+ const Button *button = getButtonFor(sprite, pos);
+ if (!button)
+ return;
+
+ // TODO: other buttons?
+ uint16 buttonsDown = 1; // MK_LBUTTON
+
+ uint16 spriteId = sprite ? sprite->_id : 0;
+ runScript(button->_scriptId, button->_id, buttonsDown, spriteId);
+}
+
+void ComposerEngine::onMouseMove(const Common::Point &pos) {
+ _lastMousePos = pos;
+
+ if (!_mouseEnabled || !_mouseVisible)
+ return;
+
+ // TODO: do we need to keep track of this?
+ uint buttonsDown = 0;
+
+ const Sprite *sprite = getSpriteAtPos(pos);
+ const Button *button = getButtonFor(sprite, pos);
+ if (_lastButton != button) {
+ if (_lastButton && _lastButton->_scriptIdRollOff)
+ runScript(_lastButton->_scriptIdRollOff, _lastButton->_id, buttonsDown, 0);
+ _lastButton = button;
+ if (_lastButton && _lastButton->_scriptIdRollOn)
+ runScript(_lastButton->_scriptIdRollOn, _lastButton->_id, buttonsDown, 0);
+ }
+
+ if (_mouseSpriteId) {
+ addSprite(_mouseSpriteId, 0, 0, _lastMousePos - _mouseOffset);
+ _needsUpdate = true;
+ }
+}
+
+void ComposerEngine::onKeyDown(uint16 keyCode) {
+ runEvent(kEventKeyDown, keyCode, 0, 0);
+ runEvent(kEventChar, keyCode, 0, 0);
+}
+
+void ComposerEngine::setCursor(uint16 id, const Common::Point &offset) {
+ _mouseOffset = offset;
+ if (_mouseSpriteId == id)
+ return;
+
+ if (_mouseSpriteId && _mouseVisible) {
+ removeSprite(_mouseSpriteId, 0);
+ }
+ _mouseSpriteId = id;
+ if (_mouseSpriteId && _mouseVisible) {
+ addSprite(_mouseSpriteId, 0, 0, _lastMousePos - _mouseOffset);
+ }
+}
+
+void ComposerEngine::setCursorVisible(bool visible) {
+ if (visible && !_mouseVisible) {
+ _mouseVisible = true;
+ if (_mouseSpriteId)
+ addSprite(_mouseSpriteId, 0, 0, _lastMousePos - _mouseOffset);
+ onMouseMove(_lastMousePos);
+ } else if (!visible && _mouseVisible) {
+ _mouseVisible = false;
+ if (_mouseSpriteId)
+ removeSprite(_mouseSpriteId, 0);
+ }
+}
+
+Common::String ComposerEngine::getStringFromConfig(const Common::String &section, const Common::String &key) {
+ Common::String value;
+ if (!_bookIni.getKey(key, section, value))
+ error("failed to find key '%s' in section '%s' of book config", key.c_str(), section.c_str());
+ return value;
+}
+
+Common::String ComposerEngine::getFilename(const Common::String &section, uint id) {
+ Common::String key = Common::String::format("%d", id);
+ Common::String filename = getStringFromConfig(section, key);
+
+ return mangleFilename(filename);
+}
+
+Common::String ComposerEngine::mangleFilename(Common::String filename) {
+ while (filename.size() && (filename[0] == '~' || filename[0] == ':' || filename[0] == '\\'))
+ filename = filename.c_str() + 1;
+
+ uint slashesToStrip = _directoriesToStrip;
+ while (slashesToStrip--) {
+ for (uint i = 0; i < filename.size(); i++) {
+ if (filename[i] != '\\' && filename[i] != ':')
+ continue;
+ filename = filename.c_str() + i + 1;
+ break;
+ }
+ }
+
+ Common::String outFilename;
+ for (uint i = 0; i < filename.size(); i++) {
+ if (filename[i] == '\\' || filename[i] == ':')
+ outFilename += '/';
+ else
+ outFilename += filename[i];
+ }
+ return outFilename;
+}
+
+void ComposerEngine::loadLibrary(uint id) {
+ if (!id)
+ id = atoi(getStringFromConfig("Common", "StartUp").c_str());
+ Common::String filename = getFilename("Libs", id);
+
+ Library library;
+
+ library._id = id;
+ library._archive = new ComposerArchive();
+ if (!library._archive->openFile(filename))
+ error("failed to open '%s'", filename.c_str());
+ _libraries.push_front(library);
+
+ Library &newLib = _libraries.front();
+
+ Common::Array<uint16> buttonResources = library._archive->getResourceIDList(ID_BUTN);
+ for (uint i = 0; i < buttonResources.size(); i++) {
+ uint16 buttonId = buttonResources[i];
+ Common::SeekableReadStream *stream = library._archive->getResource(ID_BUTN, buttonId);
+ Button button(stream, buttonId, getGameType());
+
+ bool inserted = false;
+ for (Common::List<Button>::iterator b = newLib._buttons.begin(); b != newLib._buttons.end(); b++) {
+ if (button._zorder < b->_zorder)
+ continue;
+ newLib._buttons.insert(b, button);
+ inserted = true;
+ break;
+ }
+ if (!inserted)
+ newLib._buttons.push_back(button);
+ }
+
+ // add background sprite, if it exists
+ if (hasResource(ID_BMAP, 1000))
+ setBackground(1000);
+
+ // TODO: better CTBL logic
+ loadCTBL(1000, 100);
+
+ // Run the startup script.
+ runScript(1000, 0, 0, 0);
+
+ _mouseEnabled = true;
+ onMouseMove(_lastMousePos);
+
+ runEvent(kEventLoad, id, 0, 0);
+}
+
+void ComposerEngine::unloadLibrary(uint id) {
+ for (Common::List<Library>::iterator i = _libraries.begin(); i != _libraries.end(); i++) {
+ if (i->_id != id)
+ continue;
+
+ for (Common::List<Animation *>::iterator j = _anims.begin(); j != _anims.end(); j++) {
+ delete *j;
+ }
+ _anims.clear();
+ for (Common::List<Pipe *>::iterator j = _pipes.begin(); j != _pipes.end(); j++) {
+ delete *j;
+ }
+ _pipes.clear();
+
+ for (Common::List<Sprite>::iterator j = _sprites.begin(); j != _sprites.end(); j++) {
+ j->_surface.free();
+ }
+ _sprites.clear();
+ i->_buttons.clear();
+
+ _lastButton = NULL;
+
+ _mixer->stopAll();
+ _audioStream = NULL;
+
+ for (uint j = 0; j < _queuedScripts.size(); j++) {
+ _queuedScripts[j]._count = 0;
+ _queuedScripts[j]._scriptId = 0;
+ }
+
+ delete i->_archive;
+ _libraries.erase(i);
+
+ runEvent(kEventUnload, id, 0, 0);
+
+ return;
+ }
+
+ error("tried to unload library %d, which isn't loaded", id);
+}
+
+bool ComposerEngine::hasResource(uint32 tag, uint16 id) {
+ for (Common::List<Library>::iterator i = _libraries.begin(); i != _libraries.end(); i++)
+ if (i->_archive->hasResource(tag, id))
+ return true;
+
+ return false;
+}
+
+Common::SeekableReadStream *ComposerEngine::getResource(uint32 tag, uint16 id) {
+ for (Common::List<Library>::iterator i = _libraries.begin(); i != _libraries.end(); i++)
+ if (i->_archive->hasResource(tag, id))
+ return i->_archive->getResource(tag, id);
+
+ error("No loaded library contains '%s' %04x", tag2str(tag), id);
+}
+
+Button::Button(Common::SeekableReadStream *stream, uint16 id, uint gameType) {
+ _id = id;
+
+ _type = stream->readUint16LE();
+ _active = (_type & 0x8000) ? true : false;
+ _type &= 0xfff;
+ debug(9, "button %d: type %d, active %d", id, _type, _active);
+
+ uint16 flags = 0;
+ uint16 size = 4;
+ if (gameType == GType_ComposerV1) {
+ flags = stream->readUint16LE();
+ _zorder = 0;
+ _scriptId = stream->readUint16LE();
+ _scriptIdRollOn = 0;
+ _scriptIdRollOff = 0;
+ } else {
+ _zorder = stream->readUint16LE();
+ _scriptId = stream->readUint16LE();
+ _scriptIdRollOn = stream->readUint16LE();
+ _scriptIdRollOff = stream->readUint16LE();
+
+ stream->skip(4);
+
+ size = stream->readUint16LE();
+ }
+
+ switch (_type) {
+ case kButtonRect:
+ case kButtonEllipse:
+ if (size != 4)
+ error("button %d of type %d had %d points, not 4", id, _type, size);
+ _rect.left = stream->readSint16LE();
+ _rect.top = stream->readSint16LE();
+ _rect.right = stream->readSint16LE();
+ _rect.bottom = stream->readSint16LE();
+ break;
+ case kButtonSprites:
+ if (gameType == GType_ComposerV1)
+ error("encountered kButtonSprites in V1 data");
+ for (uint i = 0; i < size; i++) {
+ _spriteIds.push_back(stream->readUint16LE());
+ }
+ break;
+ default:
+ error("unknown button type %d", _type);
+ }
+
+ if (flags & 0x40) {
+ _scriptIdRollOn = stream->readUint16LE();
+ _scriptIdRollOff = stream->readUint16LE();
+ }
+
+ delete stream;
+}
+
+bool Button::contains(const Common::Point &pos) const {
+ switch (_type) {
+ case kButtonRect:
+ return _rect.contains(pos);
+ case kButtonEllipse:
+ if (!_rect.contains(pos))
+ return false;
+ {
+ int16 a = _rect.width() / 2;
+ int16 b = _rect.height() / 2;
+ if (!a || !b)
+ return false;
+ Common::Point adjustedPos = pos - Common::Point(_rect.left + a, _rect.top + b);
+ return ((adjustedPos.x*adjustedPos.x)/(a*a) + (adjustedPos.y*adjustedPos.y)/(b*b) < 1);
+ }
+ case kButtonSprites:
+ return false;
+ default:
+ error("internal error (button type %d)", _type);
+ }
+}
+
+const Button *ComposerEngine::getButtonFor(const Sprite *sprite, const Common::Point &pos) {
+ for (Common::List<Library>::iterator l = _libraries.begin(); l != _libraries.end(); l++) {
+ for (Common::List<Button>::iterator i = l->_buttons.reverse_begin(); i != l->_buttons.end(); --i) {
+ if (!i->_active)
+ continue;
+
+ if (i->_spriteIds.empty()) {
+ if (i->contains(pos))
+ return &(*i);
+ continue;
+ }
+
+ if (!sprite)
+ continue;
+
+ for (uint j = 0; j < i->_spriteIds.size(); j++) {
+ if (i->_spriteIds[j] == sprite->_id)
+ return &(*i);
+ }
+ }
+ }
+
+ return NULL;
+}
+
+} // End of namespace Composer
diff --git a/engines/composer/composer.h b/engines/composer/composer.h
new file mode 100644
index 0000000000..03e895b59e
--- /dev/null
+++ b/engines/composer/composer.h
@@ -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.
+ *
+ */
+
+#ifndef COMPOSER_H
+#define COMPOSER_H
+
+#include "common/config-file.h"
+#include "common/random.h"
+#include "common/system.h"
+#include "common/debug.h"
+#include "common/debug-channels.h"
+#include "common/textconsole.h"
+#include "common/rect.h"
+
+#include "engines/engine.h"
+#include "engines/util.h"
+
+#include "graphics/surface.h"
+
+#include "audio/mixer.h"
+
+#include "composer/resource.h"
+
+namespace Audio {
+ class QueuingAudioStream;
+}
+
+namespace Composer {
+
+struct ComposerGameDescription;
+
+enum GameType {
+ GType_ComposerV1,
+ GType_ComposerV2
+};
+
+class Archive;
+struct Animation;
+class ComposerEngine;
+class Pipe;
+struct Sprite;
+
+enum {
+ kButtonRect = 0,
+ kButtonEllipse = 1,
+ kButtonSprites = 4
+};
+
+class Button {
+public:
+ Button() { }
+ Button(Common::SeekableReadStream *stream, uint16 id, uint gameType);
+
+ bool contains(const Common::Point &pos) const;
+
+ uint16 _id;
+ uint16 _type;
+ uint16 _zorder;
+ uint16 _scriptId;
+ uint16 _scriptIdRollOn;
+ uint16 _scriptIdRollOff;
+ bool _active;
+
+ Common::Rect _rect;
+ Common::Array<uint16> _spriteIds;
+};
+
+enum {
+ kEventAnimStarted = 1,
+ kEventAnimDone = 2,
+ kEventLoad = 3,
+ kEventUnload = 4,
+ kEventKeyDown = 5,
+ kEventChar = 6,
+ kEventKeyUp = 7
+};
+
+struct Library {
+ uint _id;
+ Archive *_archive;
+
+ Common::List<Button> _buttons;
+};
+
+struct QueuedScript {
+ uint32 _baseTime;
+ uint32 _duration;
+ uint32 _count;
+ uint16 _scriptId;
+};
+
+struct PendingPageChange {
+ PendingPageChange() { }
+ PendingPageChange(uint16 id, bool remove) : _pageId(id), _remove(remove) { }
+
+ uint16 _pageId;
+ bool _remove;
+};
+
+class ComposerEngine : public Engine {
+protected:
+ Common::Error run();
+
+public:
+ ComposerEngine(OSystem *syst, const ComposerGameDescription *gameDesc);
+ virtual ~ComposerEngine();
+
+ virtual bool hasFeature(EngineFeature f) const;
+
+ int getGameType() const;
+ const char *getGameId() const;
+ uint32 getFeatures() const;
+ Common::Language getLanguage() const;
+
+ const ComposerGameDescription *_gameDescription;
+
+private:
+ Common::RandomSource *_rnd;
+
+ Audio::SoundHandle _soundHandle;
+ Audio::QueuingAudioStream *_audioStream;
+ uint16 _currSoundPriority;
+
+ uint32 _currentTime, _lastTime;
+
+ bool _needsUpdate;
+ Common::Array<Common::Rect> _dirtyRects;
+ Graphics::Surface _surface;
+ Common::List<Sprite> _sprites;
+
+ uint _directoriesToStrip;
+ Common::ConfigFile _bookIni;
+ Common::List<Library> _libraries;
+ Common::Array<PendingPageChange> _pendingPageChanges;
+
+ Common::Array<uint16> _stack;
+ Common::Array<uint16> _vars;
+
+ Common::Array<QueuedScript> _queuedScripts;
+ Common::List<Animation *> _anims;
+ Common::List<Pipe *> _pipes;
+
+ void onMouseDown(const Common::Point &pos);
+ void onMouseMove(const Common::Point &pos);
+ void onKeyDown(uint16 keyCode);
+ void setCursor(uint16 id, const Common::Point &offset);
+ void setCursorVisible(bool visible);
+
+ bool _mouseEnabled;
+ bool _mouseVisible;
+ Common::Point _lastMousePos;
+ const Button *_lastButton;
+ uint16 _mouseSpriteId;
+ Common::Point _mouseOffset;
+
+ Common::String getStringFromConfig(const Common::String &section, const Common::String &key);
+ Common::String getFilename(const Common::String &section, uint id);
+ Common::String mangleFilename(Common::String filename);
+ void loadLibrary(uint id);
+ void unloadLibrary(uint id);
+
+ bool hasResource(uint32 tag, uint16 id);
+ Common::SeekableReadStream *getResource(uint32 tag, uint16 id);
+
+ void runEvent(uint16 id, int16 param1, int16 param2, int16 param3);
+ int16 runScript(uint16 id, int16 param1, int16 param2, int16 param3);
+
+ int16 getArg(uint16 arg, uint16 type);
+ void setArg(uint16 arg, uint16 type, uint16 val);
+ void runScript(uint16 id);
+ int16 scriptFuncCall(uint16 id, int16 param1, int16 param2, int16 param3);
+
+ void playAnimation(uint16 animId, int16 param1, int16 param2, int16 param3);
+ void stopAnimation(Animation *anim, bool localOnly = false, bool pipesOnly = false);
+ void playWaveForAnim(uint16 id, uint16 priority, bool bufferingOnly);
+ void processAnimFrame();
+
+ bool spriteVisible(uint16 id, uint16 animId);
+ Sprite *addSprite(uint16 id, uint16 animId, uint16 zorder, const Common::Point &pos);
+ void removeSprite(uint16 id, uint16 animId);
+ const Sprite *getSpriteAtPos(const Common::Point &pos);
+ const Button *getButtonFor(const Sprite *sprite, const Common::Point &pos);
+
+ void dirtySprite(const Sprite &sprite);
+ void redraw();
+ void loadCTBL(uint16 id, uint fadePercent);
+ void setBackground(uint16 id);
+ void decompressBitmap(uint16 type, Common::SeekableReadStream *stream, byte *buffer, uint32 size, uint width, uint height);
+ bool initSprite(Sprite &sprite);
+ Common::SeekableReadStream *getStreamForSprite(uint16 id);
+ void drawSprite(const Sprite &sprite);
+};
+
+} // End of namespace Composer
+
+#endif
diff --git a/engines/composer/detection.cpp b/engines/composer/detection.cpp
new file mode 100644
index 0000000000..eb4e820a13
--- /dev/null
+++ b/engines/composer/detection.cpp
@@ -0,0 +1,284 @@
+/* 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.
+ *
+ */
+
+#include "base/plugins.h"
+#include "engines/advancedDetector.h"
+
+#include "composer/composer.h"
+
+namespace Composer {
+
+struct ComposerGameDescription {
+ ADGameDescription desc;
+
+ int gameType;
+};
+
+int ComposerEngine::getGameType() const {
+ return _gameDescription->gameType;
+}
+
+const char *ComposerEngine::getGameId() const {
+ return _gameDescription->desc.gameid;
+}
+
+uint32 ComposerEngine::getFeatures() const {
+ return _gameDescription->desc.flags;
+}
+
+Common::Language ComposerEngine::getLanguage() const {
+ return _gameDescription->desc.language;
+}
+
+}
+
+static const PlainGameDescriptor composerGames[] = {
+ {"composer", "Composer Game"},
+ {"darby", "Darby the Dragon"},
+ {"gregory", "Gregory and the Hot Air Balloon"},
+ {"liam", "Magic Tales: Liam Finds a Story"},
+ {"princess", "The Princess and the Crab"},
+ {"sleepingcub", "Sleeping Cub's Test of Courage"},
+ {0, 0}
+};
+
+namespace Composer {
+
+static const ComposerGameDescription gameDescriptions[] = {
+ // from Liam Finds a Story CD
+ {
+ {
+ "magictales",
+ "Magic Tales Demo: Baby Yaga, Samurai, Imo",
+ AD_ENTRY1("book.ini", "dbc98c566f4ac61b544443524585dccb"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_USEEXTRAASTITLE | ADGF_DEMO,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV1
+ },
+
+ {
+ {
+ "liam",
+ 0,
+ AD_ENTRY1s("book.ini", "fc9d9b9e72e7301d011b808606eaa15b", 834),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ // from Liam Finds a Story CD
+ {
+ {
+ "magictales",
+ "Magic Tales Demo: Sleeping Cub, Princess & Crab",
+ AD_ENTRY1("book.ini", "3dede2522bb0886c95667b082987a87f"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_USEEXTRAASTITLE | ADGF_DEMO,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ {
+ {
+ "darby",
+ 0,
+ {
+ {"book.ini", 0, "7e3404c559d058521fff2aebe5c427a8", 2545},
+ {"page99.rsc", 0, "49cc6b16caa1c5ec7d94a3c47eed9a02", 1286480},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ {
+ {
+ "darby",
+ 0,
+ AD_ENTRY1("Darby the Dragon.ini", "d81f9214936fa70d42fc578908d4bb3d"),
+ Common::EN_ANY,
+ Common::kPlatformMacintosh,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ { // Provided by Strangerke, "CD-Rom 100% Malin" Pack
+ {
+ "darby",
+ 0,
+ AD_ENTRY1("book.ini", "285308372f7dddff2ca5a25c9192cf5c"),
+ Common::FR_FRA,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ {
+ {
+ "gregory",
+ 0,
+ {
+ {"book.ini", 0, "14a562dcf361773445255af9f3e94790", 2234},
+ {"page99.rsc", 0, "01f9381162467e052dfd4c704169ef3e", 388644},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ {
+ {
+ "gregory",
+ 0,
+ AD_ENTRY1("Gregory.ini", "fa82f14731f28c7379c5a106df07a0d6"),
+ Common::EN_ANY,
+ Common::kPlatformMacintosh,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ { // Provided by Strangerke, "CD-Rom 100% Malin" Pack
+ {
+ "gregory",
+ 0,
+ AD_ENTRY1("book.ini", "e54fc5c00de5f94e908a969e445af5d0"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ { // Provided by sev
+ {
+ "princess",
+ 0,
+ {
+ {"book.ini", 0, "fb32572577b9a41ba299825ef1e3181e", 966},
+ {"page99.rsc", 0, "fd5ebd3b5e36c4651c50241619525355", 45418},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ { // Provided by sev
+ {
+ "sleepingcub",
+ 0,
+ {
+ {"book.ini", 0, "0d329e592387009c6387a733a3ea2235", 964},
+ {"page99.rsc", 0, "219fbd9bd2ff87c7023814405d753145", 46916},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_ComposerV2
+ },
+
+ { AD_TABLE_END_MARKER, 0 }
+};
+
+} // End of namespace Composer
+
+using namespace Composer;
+
+// we match from data too, to stop detection from a non-top-level directory
+const static char *directoryGlobs[] = {
+ "data",
+ "programs",
+ "princess",
+ "sleepcub",
+ 0
+};
+
+class ComposerMetaEngine : public AdvancedMetaEngine {
+public:
+ ComposerMetaEngine() : AdvancedMetaEngine(Composer::gameDescriptions, sizeof(Composer::ComposerGameDescription), composerGames) {
+ _singleid = "composer";
+ _maxScanDepth = 2;
+ _directoryGlobs = directoryGlobs;
+ }
+
+ virtual const char *getName() const {
+ return "Magic Composer Engine";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "Copyright (C) 1995-1999 Animation Magic";
+ }
+
+ virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+ virtual bool hasFeature(MetaEngineFeature f) const;
+};
+
+bool ComposerMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ const Composer::ComposerGameDescription *gd = (const Composer::ComposerGameDescription *)desc;
+ if (gd) {
+ *engine = new Composer::ComposerEngine(syst, gd);
+ }
+ return gd != 0;
+}
+
+bool ComposerMetaEngine::hasFeature(MetaEngineFeature f) const {
+ return false;
+}
+
+bool Composer::ComposerEngine::hasFeature(EngineFeature f) const {
+ return (f == kSupportsRTL);
+}
+
+#if PLUGIN_ENABLED_DYNAMIC(COMPOSER)
+REGISTER_PLUGIN_DYNAMIC(COMPOSER, PLUGIN_TYPE_ENGINE, ComposerMetaEngine);
+#else
+REGISTER_PLUGIN_STATIC(COMPOSER, PLUGIN_TYPE_ENGINE, ComposerMetaEngine);
+#endif
diff --git a/engines/composer/graphics.cpp b/engines/composer/graphics.cpp
new file mode 100644
index 0000000000..f253d85ad7
--- /dev/null
+++ b/engines/composer/graphics.cpp
@@ -0,0 +1,774 @@
+/* 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.
+ *
+ */
+#include "common/scummsys.h"
+
+#include "graphics/palette.h"
+
+#include "audio/audiostream.h"
+#include "audio/decoders/raw.h"
+
+#include "composer/composer.h"
+#include "composer/graphics.h"
+#include "composer/resource.h"
+
+namespace Composer {
+
+bool Sprite::contains(const Common::Point &pos) const {
+ Common::Point adjustedPos = pos - _pos;
+
+ if (adjustedPos.x < 0 || adjustedPos.x >= _surface.w)
+ return false;
+ if (adjustedPos.y < 0 || adjustedPos.y >= _surface.h)
+ return false;
+ byte *pixels = (byte *)_surface.pixels;
+ return (pixels[(_surface.h - adjustedPos.y - 1) * _surface.w + adjustedPos.x] != 0);
+}
+
+enum {
+ kAnimOpEvent = 1,
+ kAnimOpPlayWave = 2,
+ kAnimOpPlayAnim = 3,
+ kAnimOpDrawSprite = 4
+};
+
+Animation::Animation(Common::SeekableReadStream *stream, uint16 id, Common::Point basePos, uint32 eventParam)
+ : _stream(stream), _id(id), _basePos(basePos), _eventParam(eventParam) {
+ uint32 size = _stream->readUint32LE();
+ _state = _stream->readUint32LE() + 1;
+
+ // probably total size?
+ uint32 unknown = _stream->readUint32LE();
+
+ debug(8, "anim: size %d, state %08x, unknown %08x", size, _state, unknown);
+
+ for (uint i = 0; i < size; i++) {
+ AnimationEntry entry;
+ entry.op = _stream->readUint16LE();
+ entry.priority = _stream->readUint16LE();
+ entry.state = _stream->readUint16LE();
+ entry.counter = 0;
+ entry.prevValue = 0;
+ debug(8, "anim entry: %04x, %04x, %04x", entry.op, entry.priority, entry.state);
+ _entries.push_back(entry);
+ }
+
+ _offset = _stream->pos();
+}
+
+Animation::~Animation() {
+ delete _stream;
+}
+
+void Animation::seekToCurrPos() {
+ _stream->seek(_offset, SEEK_SET);
+}
+
+void ComposerEngine::playAnimation(uint16 animId, int16 x, int16 y, int16 eventParam) {
+ // First, we check if this animation is already playing,
+ // and if it is, we sabotage that running one first.
+ for (Common::List<Animation *>::iterator i = _anims.begin(); i != _anims.end(); i++) {
+ Animation *anim = *i;
+ if (anim->_id != animId)
+ continue;
+
+ stopAnimation(*i);
+ }
+
+ Common::SeekableReadStream *stream = NULL;
+ Pipe *newPipe = NULL;
+
+ // First, check the existing pipes.
+ for (Common::List<Pipe *>::iterator j = _pipes.begin(); j != _pipes.end(); j++) {
+ Pipe *pipe = *j;
+ if (!pipe->hasResource(ID_ANIM, animId))
+ continue;
+ stream = pipe->getResource(ID_ANIM, animId, false);
+ break;
+ }
+
+ // If we didn't find it, try the libraries.
+ if (!stream) {
+ if (!hasResource(ID_ANIM, animId)) {
+ warning("ignoring attempt to play invalid anim %d", animId);
+ return;
+ }
+ stream = getResource(ID_ANIM, animId);
+
+ uint32 type = 0;
+ for (Common::List<Library>::iterator i = _libraries.begin(); i != _libraries.end(); i++)
+ if (i->_archive->hasResource(ID_ANIM, animId)) {
+ type = i->_archive->getResourceFlags(ID_ANIM, animId);
+ break;
+ }
+
+ // If the resource is a pipe itself, then load the pipe
+ // and then fish the requested animation out of it.
+ if (type != 1) {
+ newPipe = new Pipe(stream);
+ _pipes.push_front(newPipe);
+ stream = newPipe->getResource(ID_ANIM, animId, false);
+ }
+ }
+
+ Animation *anim = new Animation(stream, animId, Common::Point(x, y), eventParam);
+ _anims.push_back(anim);
+ runEvent(kEventAnimStarted, animId, eventParam, 0);
+ if (newPipe)
+ newPipe->_anim = anim;
+}
+
+void ComposerEngine::stopAnimation(Animation *anim, bool localOnly, bool pipesOnly) {
+ // disable the animation
+ anim->_state = 0;
+
+ // stop any animations it may have spawned
+ for (uint j = 0; j < anim->_entries.size(); j++) {
+ AnimationEntry &entry = anim->_entries[j];
+ if (!entry.prevValue)
+ continue;
+ if (localOnly) {
+ if (pipesOnly)
+ continue;
+ if (entry.op == kAnimOpDrawSprite) {
+ removeSprite(entry.prevValue, anim->_id);
+ } else if (entry.op == kAnimOpPlayWave) {
+ if (_currSoundPriority >= entry.priority) {
+ _mixer->stopAll();
+ _audioStream = NULL;
+ }
+ }
+ } else {
+ if (entry.op != kAnimOpPlayAnim)
+ continue;
+ for (Common::List<Animation *>::iterator i = _anims.begin(); i != _anims.end(); i++) {
+ if ((*i)->_id == entry.prevValue)
+ stopAnimation(*i);
+ }
+ }
+ }
+
+ // kill any pipe owned by the animation
+ for (Common::List<Pipe *>::iterator j = _pipes.begin(); j != _pipes.end(); j++) {
+ Pipe *pipe = *j;
+ if (pipe->_anim != anim)
+ continue;
+ j = _pipes.reverse_erase(j);
+ delete pipe;
+ break;
+ }
+}
+
+void ComposerEngine::playWaveForAnim(uint16 id, uint16 priority, bool bufferingOnly) {
+ if (_audioStream && _audioStream->numQueuedStreams() != 0) {
+ if (_currSoundPriority < priority)
+ return;
+ if (_currSoundPriority > priority) {
+ _mixer->stopAll();
+ _audioStream = NULL;
+ }
+ }
+ Common::SeekableReadStream *stream = NULL;
+ if (!bufferingOnly && hasResource(ID_WAVE, id)) {
+ stream = getResource(ID_WAVE, id);
+ } else {
+ for (Common::List<Pipe *>::iterator k = _pipes.begin(); k != _pipes.end(); k++) {
+ Pipe *pipe = *k;
+ if (!pipe->hasResource(ID_WAVE, id))
+ continue;
+ stream = pipe->getResource(ID_WAVE, id, true);
+ break;
+ }
+ }
+ if (!stream)
+ return;
+ // FIXME: non-pipe buffers have fixed wav header (data at +44, size at +40)
+ byte *buffer = (byte *)malloc(stream->size());
+ stream->read(buffer, stream->size());
+ if (!_audioStream)
+ _audioStream = Audio::makeQueuingAudioStream(22050, false);
+ _audioStream->queueBuffer(buffer, stream->size(), DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+ _currSoundPriority = priority;
+ delete stream;
+ if (!_mixer->isSoundHandleActive(_soundHandle))
+ _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, _audioStream);
+}
+
+void ComposerEngine::processAnimFrame() {
+ for (Common::List<Animation *>::iterator i = _anims.begin(); i != _anims.end(); i++) {
+ Animation *anim = *i;
+
+ anim->seekToCurrPos();
+
+ if (anim->_state <= 1) {
+ bool normalEnd = (anim->_state == 1);
+ if (normalEnd) {
+ runEvent(kEventAnimDone, anim->_id, anim->_eventParam, 0);
+ }
+ stopAnimation(anim, true, normalEnd);
+ delete anim;
+ i = _anims.reverse_erase(i);
+
+ continue;
+ }
+
+ for (uint j = 0; j < anim->_entries.size(); j++) {
+ AnimationEntry &entry = anim->_entries[j];
+ if (entry.op != kAnimOpEvent)
+ break;
+ if (entry.counter) {
+ entry.counter--;
+ } else {
+ if ((anim->_state > 1) && (anim->_stream->pos() + 2 > anim->_stream->size())) {
+ warning("anim with id %d ended too soon", anim->_id);
+ anim->_state = 0;
+ break;
+ }
+
+ uint16 event = anim->_stream->readUint16LE();
+ anim->_offset += 2;
+ if (event == 0xffff) {
+ entry.counter = anim->_stream->readUint16LE() - 1;
+ anim->_offset += 2;
+ } else {
+ debug(4, "anim: event %d", event);
+ runEvent(event, anim->_id, 0, 0);
+ }
+ }
+ }
+ }
+
+ for (Common::List<Animation *>::iterator i = _anims.begin(); i != _anims.end(); i++) {
+ Animation *anim = *i;
+
+ // did the anim get disabled?
+ if (anim->_state == 0) {
+ stopAnimation(anim, true, false);
+ delete anim;
+ i = _anims.reverse_erase(i);
+ continue;
+ }
+
+ anim->_state--;
+
+ bool foundWait = false;
+ for (uint j = 0; j < anim->_entries.size(); j++) {
+ AnimationEntry &entry = anim->_entries[j];
+
+ // only skip these at the start
+ if (!foundWait && (entry.op == kAnimOpEvent))
+ continue;
+ foundWait = true;
+
+ if (entry.counter) {
+ entry.counter--;
+ if ((entry.op == kAnimOpPlayWave) && entry.prevValue) {
+ debug(4, "anim: continue play wave %d", entry.prevValue);
+ playWaveForAnim(entry.prevValue, entry.priority, true);
+ }
+ } else {
+ anim->seekToCurrPos();
+ if ((anim->_state > 1) && (anim->_stream->pos() + 2 > anim->_stream->size())) {
+ warning("anim with id %d ended too soon", anim->_id);
+ anim->_state = 0;
+ break;
+ }
+
+ uint16 data = anim->_stream->readUint16LE();
+ anim->_offset += 2;
+ if (data == 0xffff) {
+ entry.counter = anim->_stream->readUint16LE() - 1;
+ anim->_offset += 2;
+ } else {
+ switch (entry.op) {
+ case kAnimOpEvent:
+ debug(4, "anim: event %d", data);
+ runEvent(data, anim->_id, 0, 0);
+ break;
+ case kAnimOpPlayWave:
+ debug(4, "anim: play wave %d", data);
+ playWaveForAnim(data, entry.priority, false);
+ break;
+ case kAnimOpPlayAnim:
+ debug(4, "anim: play anim %d", data);
+ playAnimation(data, anim->_basePos.x, anim->_basePos.y, 1);
+ break;
+ case kAnimOpDrawSprite:
+ if (!data || (entry.prevValue && (data != entry.prevValue))) {
+ debug(4, "anim: erase sprite %d", entry.prevValue);
+ removeSprite(entry.prevValue, anim->_id);
+ }
+ if (data) {
+ int16 x = anim->_stream->readSint16LE();
+ int16 y = anim->_stream->readSint16LE();
+ Common::Point pos(x, y);
+ anim->_offset += 4;
+ uint16 animId = anim->_id;
+ if (anim->_state == entry.state)
+ animId = 0;
+ debug(4, "anim: draw sprite %d at (relative) %d,%d", data, x, y);
+ bool wasVisible = spriteVisible(data, animId);
+ addSprite(data, animId, entry.priority, anim->_basePos + pos);
+ if (wasVisible) {
+ // make sure modified sprite isn't removed by another entry
+ for (uint k = 0; k < anim->_entries.size(); k++) {
+ if (anim->_entries[k].op != kAnimOpDrawSprite)
+ continue;
+ if (anim->_entries[k].prevValue == data)
+ anim->_entries[k].prevValue = 1;
+ }
+ }
+ }
+ break;
+ default:
+ warning("unknown anim op %d", entry.op);
+ }
+
+ entry.prevValue = data;
+ }
+ }
+ }
+ }
+
+ for (Common::List<Pipe *>::iterator j = _pipes.begin(); j != _pipes.end(); j++) {
+ Pipe *pipe = *j;
+ pipe->nextFrame();
+ }
+}
+
+bool ComposerEngine::spriteVisible(uint16 id, uint16 animId) {
+ for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
+ if (i->_id != id)
+ continue;
+ if (i->_animId && animId && (i->_animId != animId))
+ continue;
+ return true;
+ }
+
+ return false;
+}
+
+Sprite *ComposerEngine::addSprite(uint16 id, uint16 animId, uint16 zorder, const Common::Point &pos) {
+ Sprite sprite;
+ bool foundSprite = false;
+
+ // re-use old sprite, if any (the BMAP for this id might well have
+ // changed in the meantime, but the scripts depend on that!)
+ for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
+ if (i->_id != id)
+ continue;
+ if (i->_animId && animId && (i->_animId != animId))
+ continue;
+
+ dirtySprite(*i);
+
+ // if the zordering is identical, modify it in-place
+ if (i->_zorder == zorder) {
+ i->_animId = animId;
+ i->_pos = pos;
+ dirtySprite(*i);
+ return &(*i);
+ }
+
+ // otherwise, take a copy and remove it from the list
+ sprite = *i;
+ foundSprite = true;
+ _sprites.erase(i);
+ break;
+ }
+
+ sprite._animId = animId;
+ sprite._zorder = zorder;
+ sprite._pos = pos;
+
+ if (!foundSprite) {
+ sprite._id = id;
+ if (!initSprite(sprite)) {
+ debug(1, "ignoring addSprite on invalid sprite %d", id);
+ return NULL;
+ }
+ }
+
+ dirtySprite(sprite);
+
+ for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
+ if (sprite._zorder <= i->_zorder)
+ continue;
+ // insert *before* this sprite
+ _sprites.insert(i, sprite);
+ --i;
+ return &(*i);
+ }
+ _sprites.push_back(sprite);
+ return &_sprites.back();
+}
+
+void ComposerEngine::removeSprite(uint16 id, uint16 animId) {
+ for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
+ if (!i->_id || (id && i->_id != id))
+ continue;
+ if (i->_animId && animId && (i->_animId != animId))
+ continue;
+ dirtySprite(*i);
+ i->_surface.free();
+ i = _sprites.reverse_erase(i);
+ if (id)
+ break;
+ }
+}
+
+const Sprite *ComposerEngine::getSpriteAtPos(const Common::Point &pos) {
+ for (Common::List<Sprite>::iterator i = _sprites.reverse_begin(); i != _sprites.end(); --i) {
+ // avoid highest-level objects (e.g. the cursor)
+ if (!i->_zorder)
+ continue;
+
+ if (i->contains(pos))
+ return &(*i);
+ }
+
+ return NULL;
+}
+
+void ComposerEngine::dirtySprite(const Sprite &sprite) {
+ Common::Rect rect(sprite._pos.x, sprite._pos.y, sprite._pos.x + sprite._surface.w, sprite._pos.y + sprite._surface.h);
+ rect.clip(_surface.w, _surface.h);
+ if (rect.isEmpty())
+ return;
+
+ for (uint i = 0; i < _dirtyRects.size(); i++) {
+ if (!_dirtyRects[i].intersects(rect))
+ continue;
+ _dirtyRects[i].extend(rect);
+ return;
+ }
+
+ _dirtyRects.push_back(rect);
+}
+
+void ComposerEngine::redraw() {
+ if (!_needsUpdate && _dirtyRects.empty())
+ return;
+
+ for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
+ Common::Rect rect(i->_pos.x, i->_pos.y, i->_pos.x + i->_surface.w, i->_pos.y + i->_surface.h);
+ bool intersects = false;
+ for (uint j = 0; j < _dirtyRects.size(); j++) {
+ if (!_dirtyRects[j].intersects(rect))
+ continue;
+ intersects = true;
+ break;
+ }
+ if (!intersects)
+ continue;
+ drawSprite(*i);
+ }
+
+ for (uint i = 0; i < _dirtyRects.size(); i++) {
+ const Common::Rect &rect = _dirtyRects[i];
+ byte *pixels = (byte *)_surface.pixels + (rect.top * _surface.pitch) + rect.left;
+ _system->copyRectToScreen(pixels, _surface.pitch, rect.left, rect.top, rect.width(), rect.height());
+ }
+ _system->updateScreen();
+
+ _needsUpdate = false;
+ _dirtyRects.clear();
+}
+
+void ComposerEngine::loadCTBL(uint16 id, uint fadePercent) {
+ Common::SeekableReadStream *stream = getResource(ID_CTBL, id);
+
+ uint16 numEntries = stream->readUint16LE();
+ debug(1, "CTBL: %d entries", numEntries);
+
+ assert(numEntries <= 256);
+ assert(stream->size() == 2 + (numEntries * 3));
+
+ byte buffer[256 * 3];
+ stream->read(buffer, numEntries * 3);
+ delete stream;
+
+ for (uint16 i = 0; i < numEntries * 3; i++)
+ buffer[i] = ((unsigned int)buffer[i] * fadePercent) / 100;
+
+ _system->getPaletteManager()->setPalette(buffer, 0, numEntries);
+ _needsUpdate = true;
+}
+
+void ComposerEngine::setBackground(uint16 id) {
+ for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
+ if (i->_id)
+ continue;
+ dirtySprite(*i);
+ i->_surface.free();
+ i->_id = id;
+ if (!initSprite(*i))
+ error("failed to set background %d", id);
+ dirtySprite(*i);
+ i->_id = 0;
+ return;
+ }
+
+ Sprite *background = addSprite(id, 0, 0xffff, Common::Point());
+ if (background)
+ background->_id = 0;
+}
+
+static void decompressSLWM(byte *buffer, Common::SeekableReadStream *stream) {
+ uint bitsLeft = 0;
+ uint16 lastBits = 0;
+ byte currBit;
+ while (true) {
+ if (bitsLeft == 0) { bitsLeft = 16; lastBits = stream->readUint16LE(); }
+ currBit = (lastBits & 1); lastBits >>= 1; bitsLeft--;
+
+ if (currBit) {
+ // single byte
+ *buffer++ = stream->readByte();
+ continue;
+ }
+
+ if (bitsLeft == 0) { bitsLeft = 16; lastBits = stream->readUint16LE(); }
+ currBit = (lastBits & 1); lastBits >>= 1; bitsLeft--;
+
+ uint start;
+ uint count;
+ if (currBit) {
+ uint orMask = stream->readByte();
+ uint in = stream->readByte();
+ count = in & 7;
+ start = ((in & ~7) << 5) | orMask;
+ if (!count) {
+ count = stream->readByte();
+ if (!count)
+ break;
+ count -= 2;
+ }
+ } else {
+ // count encoded in the next two bits
+ count = 0;
+
+ if (bitsLeft == 0) { bitsLeft = 16; lastBits = stream->readUint16LE(); }
+ currBit = (lastBits & 1); lastBits >>= 1; bitsLeft--;
+
+ count = (count << 1) | currBit;
+
+ if (bitsLeft == 0) { bitsLeft = 16; lastBits = stream->readUint16LE(); }
+ currBit = (lastBits & 1); lastBits >>= 1; bitsLeft--;
+
+ count = (count << 1) | currBit;
+
+ start = stream->readByte();
+ }
+
+ count += 2;
+ start++;
+ for (uint i = 0; i < count; i++) {
+ *buffer = *(buffer - start);
+ buffer++;
+ }
+ }
+}
+
+// bitmap compression types
+enum {
+ kBitmapUncompressed = 0,
+ kBitmapSpp32 = 1,
+ kBitmapSLW8 = 3,
+ kBitmapRLESLWM = 4,
+ kBitmapSLWM = 5
+};
+
+void ComposerEngine::decompressBitmap(uint16 type, Common::SeekableReadStream *stream, byte *buffer, uint32 size, uint width, uint height) {
+ uint outSize = width * height;
+
+ switch (type) {
+ case kBitmapUncompressed:
+ if (stream->size() - (uint)stream->pos() != size)
+ error("kBitmapUncompressed stream had %d bytes left, supposed to be %d",
+ stream->size() - (uint)stream->pos(), size);
+ if (size != outSize)
+ error("kBitmapUncompressed size %d doesn't match required size %d",
+ size, outSize);
+ stream->read(buffer, size);
+ break;
+ case kBitmapSpp32:
+ byte lookup[16];
+ stream->read(lookup, 16);
+ while (size--) {
+ uint in = stream->readByte();
+ byte lowBits = in & 0xF;
+ byte highBits = (in & 0xF0) >> 4;
+ if (highBits == 0xf) {
+ // run of a single color
+ uint count = (uint)stream->readByte() + 3;
+ size--;
+ if (outSize < count)
+ error("kBitmapSpp32 only needed %d bytes, but got run of %d",
+ outSize, count);
+ outSize -= count;
+ memset(buffer, lookup[lowBits], count);
+ buffer += count;
+ } else {
+ // two pixels
+ if (!outSize)
+ error("kBitmapSpp32 had too many pixels");
+ *buffer++ = lookup[highBits];
+ outSize--;
+ if (outSize) {
+ *buffer++ = lookup[lowBits];
+ outSize--;
+ }
+ }
+ }
+ break;
+ case kBitmapSLW8:
+ while (size--) {
+ byte val = stream->readByte();
+ if (val != 0xff) {
+ *buffer++ = val;
+ continue;
+ }
+ uint count = stream->readByte();
+ size--;
+
+ uint16 step;
+ if (!(count & 0x80)) {
+ step = stream->readByte();
+ size--;
+ } else {
+ count = (count ^ 0x80);
+ step = stream->readUint16LE();
+ size -= 2;
+ }
+ count += 4;
+ // this is often overlapping (for repeating patterns)
+ for (uint i = 0; i < count; i++) {
+ *buffer = *(buffer - step - 1);
+ buffer++;
+ }
+ }
+ break;
+ case kBitmapRLESLWM:
+ {
+ uint32 bufSize = stream->readUint32LE();
+ byte *tempBuf = new byte[bufSize];
+ decompressSLWM(tempBuf, stream);
+
+ uint instrPos = tempBuf[0] + 1;
+ instrPos += READ_LE_UINT16(tempBuf + instrPos) + 2;
+ byte *instr = tempBuf + instrPos;
+
+ uint line = 0;
+ while (line++ < height) {
+ uint pixels = 0;
+
+ while (pixels < width) {
+ byte data = *instr++;
+ byte color = tempBuf[(data & 0x7F) + 1];
+ if (!(data & 0x80)) {
+ *buffer++ = color;
+ pixels++;
+ } else {
+ byte count = *instr++;
+ if (!count) {
+ while (pixels++ < width)
+ *buffer++ = color;
+ break;
+ }
+ for (uint i = 0; i < count; i++) {
+ *buffer++ = color;
+ pixels++;
+ }
+ }
+ }
+ }
+ delete[] tempBuf;
+ }
+ break;
+ case kBitmapSLWM:
+ decompressSLWM(buffer, stream);
+ break;
+ default:
+ error("decompressBitmap can't handle type %d", type);
+ }
+}
+
+Common::SeekableReadStream *ComposerEngine::getStreamForSprite(uint16 id) {
+ for (Common::List<Pipe *>::iterator k = _pipes.begin(); k != _pipes.end(); k++) {
+ Pipe *pipe = *k;
+ if (!pipe->hasResource(ID_BMAP, id))
+ continue;
+ return pipe->getResource(ID_BMAP, id, true);
+ }
+ if (hasResource(ID_BMAP, id))
+ return getResource(ID_BMAP, id);
+ return NULL;
+}
+
+bool ComposerEngine::initSprite(Sprite &sprite) {
+ Common::SeekableReadStream *stream = getStreamForSprite(sprite._id);
+ if (!stream)
+ return false;
+
+ uint16 type = stream->readUint16LE();
+ int16 height = stream->readSint16LE();
+ int16 width = stream->readSint16LE();
+ uint32 size = stream->readUint32LE();
+ debug(1, "loading BMAP: type %d, width %d, height %d, size %d", type, width, height, size);
+
+ if (width > 0 && height > 0) {
+ sprite._surface.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+ decompressBitmap(type, stream, (byte *)sprite._surface.pixels, size, width, height);
+ } else {
+ // there are some sprites (e.g. a -998x-998 one in Gregory's title screen)
+ // which have an invalid size, but the original engine doesn't notice for
+ // RLE sprites since the width/height is ignored until the actual draw
+ if (type != kBitmapRLESLWM)
+ error("sprite (type %d) had invalid size %dx%d", type, width, height);
+ delete stream;
+ return false;
+ }
+ delete stream;
+
+ return true;
+}
+
+void ComposerEngine::drawSprite(const Sprite &sprite) {
+ int x = sprite._pos.x;
+ int y = sprite._pos.y;
+
+ // incoming data is BMP-style (bottom-up), so flip it
+ byte *pixels = (byte *)_surface.pixels;
+ for (int j = 0; j < sprite._surface.h; j++) {
+ if (j + y < 0)
+ continue;
+ if (j + y >= _surface.h)
+ break;
+ byte *in = (byte *)sprite._surface.pixels + (sprite._surface.h - j - 1) * sprite._surface.w;
+ byte *out = pixels + ((j + y) * _surface.w) + x;
+ for (int i = 0; i < sprite._surface.w; i++)
+ if ((x + i >= 0) && (x + i < _surface.w) && in[i])
+ out[i] = in[i];
+ }
+}
+
+} // End of namespace Composer
diff --git a/engines/composer/graphics.h b/engines/composer/graphics.h
new file mode 100644
index 0000000000..e9d82920ba
--- /dev/null
+++ b/engines/composer/graphics.h
@@ -0,0 +1,71 @@
+/* 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 COMPOSER_GRAPHICS_H
+#define COMPOSER_GRAPHICS_H
+
+#include "common/rect.h"
+#include "graphics/surface.h"
+
+namespace Composer {
+
+class ComposerEngine;
+
+struct Sprite {
+ uint16 _id;
+ uint16 _animId;
+ uint16 _zorder;
+ Common::Point _pos;
+ Graphics::Surface _surface;
+
+ bool contains(const Common::Point &pos) const;
+};
+
+struct AnimationEntry {
+ uint32 state;
+ uint16 op;
+ uint16 priority;
+ uint16 counter;
+ uint16 prevValue;
+};
+
+struct Animation {
+ Animation(Common::SeekableReadStream *stream, uint16 id, Common::Point basePos, uint32 eventParam);
+ ~Animation();
+
+ void seekToCurrPos();
+
+ uint16 _id;
+ Common::Point _basePos;
+ uint32 _eventParam;
+
+ uint32 _state;
+
+ Common::Array<AnimationEntry> _entries;
+
+ uint32 _offset;
+ Common::SeekableReadStream *_stream;
+};
+
+} // End of namespace Composer
+
+#endif
diff --git a/engines/composer/module.mk b/engines/composer/module.mk
new file mode 100644
index 0000000000..8bfaf932e8
--- /dev/null
+++ b/engines/composer/module.mk
@@ -0,0 +1,16 @@
+MODULE := engines/composer
+
+MODULE_OBJS = \
+ composer.o \
+ detection.o \
+ graphics.o \
+ resource.o \
+ scripting.o
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_COMPOSER), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/composer/resource.cpp b/engines/composer/resource.cpp
new file mode 100644
index 0000000000..b40bdb379b
--- /dev/null
+++ b/engines/composer/resource.cpp
@@ -0,0 +1,337 @@
+/* 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.
+ *
+ */
+
+#include "composer/resource.h"
+
+#include "common/debug.h"
+#include "common/memstream.h"
+#include "common/substream.h"
+#include "common/util.h"
+#include "common/textconsole.h"
+
+namespace Composer {
+
+// Base Archive code
+// (copied from clone2727's mohawk code)
+
+Archive::Archive() {
+ _stream = 0;
+}
+
+Archive::~Archive() {
+ close();
+}
+
+bool Archive::openFile(const Common::String &fileName) {
+ Common::File *file = new Common::File();
+
+ if (!file->open(fileName)) {
+ delete file;
+ return false;
+ }
+
+ if (!openStream(file)) {
+ close();
+ return false;
+ }
+
+ return true;
+}
+
+void Archive::close() {
+ _types.clear();
+ delete _stream; _stream = 0;
+}
+
+bool Archive::hasResource(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
+ return false;
+
+ return _types[tag].contains(id);
+}
+
+bool Archive::hasResource(uint32 tag, const Common::String &resName) const {
+ if (!_types.contains(tag) || resName.empty())
+ return false;
+
+ const ResourceMap &resMap = _types[tag];
+
+ for (ResourceMap::const_iterator it = resMap.begin(); it != resMap.end(); it++)
+ if (it->_value.name.matchString(resName))
+ return true;
+
+ return false;
+}
+
+Common::SeekableReadStream *Archive::getResource(uint32 tag, uint16 id) {
+ if (!_types.contains(tag))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ const ResourceMap &resMap = _types[tag];
+
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ const Resource &res = resMap[id];
+
+ return new Common::SeekableSubReadStream(_stream, res.offset, res.offset + res.size);
+}
+
+uint32 Archive::getResourceFlags(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ const ResourceMap &resMap = _types[tag];
+
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ const Resource &res = resMap[id];
+
+ return res.flags;
+}
+
+uint32 Archive::getOffset(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ const ResourceMap &resMap = _types[tag];
+
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ return resMap[id].offset;
+}
+
+uint16 Archive::findResourceID(uint32 tag, const Common::String &resName) const {
+ if (!_types.contains(tag) || resName.empty())
+ return 0xFFFF;
+
+ const ResourceMap &resMap = _types[tag];
+
+ for (ResourceMap::const_iterator it = resMap.begin(); it != resMap.end(); it++)
+ if (it->_value.name.matchString(resName))
+ return it->_key;
+
+ return 0xFFFF;
+}
+
+Common::String Archive::getName(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ const ResourceMap &resMap = _types[tag];
+
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ return resMap[id].name;
+}
+
+Common::Array<uint32> Archive::getResourceTypeList() const {
+ Common::Array<uint32> typeList;
+
+ for (TypeMap::const_iterator it = _types.begin(); it != _types.end(); it++)
+ typeList.push_back(it->_key);
+
+ return typeList;
+}
+
+Common::Array<uint16> Archive::getResourceIDList(uint32 type) const {
+ Common::Array<uint16> idList;
+
+ if (!_types.contains(type))
+ return idList;
+
+ const ResourceMap &resMap = _types[type];
+
+ for (ResourceMap::const_iterator it = resMap.begin(); it != resMap.end(); it++)
+ idList.push_back(it->_key);
+
+ return idList;
+}
+
+// Composer Archive code
+
+bool ComposerArchive::openStream(Common::SeekableReadStream *stream) {
+ // Make sure no other file is open...
+ close();
+
+ bool newStyle = false;
+ uint32 headerSize = stream->readUint32LE();
+ if (headerSize == SWAP_CONSTANT_32(ID_LBRC)) {
+ // new-style file
+ newStyle = true;
+ headerSize = stream->readUint32LE();
+ uint32 zeros = stream->readUint32LE();
+ if (zeros != 0)
+ error("invalid LBRC header (%d instead of zeros)", zeros);
+ }
+
+ uint16 numResourceTypes = stream->readUint16LE();
+ if (newStyle) {
+ uint16 unknown = stream->readUint16LE();
+ debug(4, "skipping unknown %04x", unknown);
+ }
+
+ debug(4, "Reading LBRC resource table with %d entries", numResourceTypes);
+ for (uint i = 0; i < numResourceTypes; i++) {
+ uint32 tag = stream->readUint32BE();
+ uint32 tableOffset = stream->readUint32LE();
+ debug(4, "Type '%s' at offset %d", tag2str(tag), tableOffset);
+ // starting from the start of the resource table, which differs
+ // according to whether we have the 10 extra bytes for newStyle
+ if (newStyle)
+ tableOffset += 16;
+ else
+ tableOffset += 6;
+
+ ResourceMap &resMap = _types[tag];
+
+ uint32 oldPos = stream->pos();
+ stream->seek(tableOffset);
+
+ while (true) {
+ if (stream->eos())
+ error("LBRC file ran out of stream");
+
+ uint32 offset, size, id, flags;
+ if (newStyle) {
+ offset = stream->readUint32LE();
+ if (!offset)
+ break;
+ size = stream->readUint32LE();
+ id = stream->readUint16LE();
+ flags = stream->readUint16LE(); // set to 1 for preload, otherwise no preload
+ /*uint32 junk = */ stream->readUint32LE();
+ } else {
+ id = stream->readUint16LE();
+ if (!id)
+ break;
+ offset = stream->readUint32LE();
+ offset += headerSize;
+ size = stream->readUint32LE();
+ flags = stream->readUint16LE(); // FIXME
+
+ }
+
+ Resource &res = resMap[id];
+ res.offset = offset;
+ res.size = size;
+ res.flags = flags;
+ debug(4, "Id %d, offset %d, size %d, flags %08x", id, offset, size, flags);
+ }
+
+ stream->seek(oldPos);
+ }
+
+ _stream = stream;
+ return true;
+}
+
+Pipe::Pipe(Common::SeekableReadStream *stream) {
+ _offset = 0;
+ _stream = stream;
+ _anim = NULL;
+
+ nextFrame();
+}
+
+void Pipe::nextFrame() {
+ if (_offset == (uint)_stream->size())
+ return;
+
+ _stream->seek(_offset, SEEK_SET);
+
+ uint32 tagCount = _stream->readUint32LE();
+ _offset += 4;
+ for (uint i = 0; i < tagCount; i++) {
+ uint32 tag = _stream->readUint32BE();
+ uint32 count = _stream->readUint32LE();
+ _offset += 8;
+
+ ResourceMap &resMap = _types[tag];
+
+ _offset += (12 * count);
+ for (uint j = 0; j < count; j++) {
+ uint32 offset = _stream->readUint32LE();
+ uint32 size = _stream->readUint32LE();
+ uint16 id = _stream->readUint16LE();
+ uint32 unknown = _stream->readUint16LE(); // frame id?
+ debug(9, "pipe: %s/%d: offset %d, size %d, unknown %d", tag2str(tag), id, offset, size, unknown);
+
+ PipeResourceEntry entry;
+ entry.size = size;
+ entry.offset = _offset;
+ resMap[id].entries.push_back(entry);
+
+ _offset += size;
+ }
+ _stream->seek(_offset, SEEK_SET);
+ }
+}
+
+bool Pipe::hasResource(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
+ return false;
+
+ return _types[tag].contains(id);
+}
+
+Common::SeekableReadStream *Pipe::getResource(uint32 tag, uint16 id, bool buffering) {
+ if (!_types.contains(tag))
+ error("Pipe does not contain '%s' %04x", tag2str(tag), id);
+
+ const ResourceMap &resMap = _types[tag];
+
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
+
+ const PipeResource &res = resMap[id];
+
+ if (res.entries.size() == 1) {
+ Common::SeekableReadStream *stream = new Common::SeekableSubReadStream(_stream,
+ res.entries[0].offset, res.entries[0].offset + res.entries[0].size);
+ if (buffering)
+ _types[tag].erase(id);
+ return stream;
+ }
+
+ // If there are multiple entries in the pipe, we have to concaternate them together.
+
+ uint32 size = 0;
+ for (uint i = 0; i < res.entries.size(); i++)
+ size += res.entries[i].size;
+
+ byte *buffer = (byte *)malloc(size);
+ uint32 offset = 0;
+ for (uint i = 0; i < res.entries.size(); i++) {
+ _stream->seek(res.entries[i].offset, SEEK_SET);
+ _stream->read(buffer + offset, res.entries[i].size);
+ offset += res.entries[i].size;
+ }
+ if (buffering)
+ _types[tag].erase(id);
+ return new Common::MemoryReadStream(buffer, size, DisposeAfterUse::YES);
+}
+
+} // End of namespace Composer
diff --git a/engines/composer/resource.h b/engines/composer/resource.h
new file mode 100644
index 0000000000..9408cdffb8
--- /dev/null
+++ b/engines/composer/resource.h
@@ -0,0 +1,124 @@
+/* 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.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/endian.h"
+#include "common/hashmap.h"
+#include "common/file.h"
+#include "common/str.h"
+
+#ifndef COMPOSER_RESOURCE_H
+#define COMPOSER_RESOURCE_H
+
+namespace Composer {
+
+struct Animation;
+
+#define ID_LBRC MKTAG('L','B','R','C') // Main FourCC
+
+#define ID_ANIM MKTAG('A','N','I','M') // Animation
+#define ID_BMAP MKTAG('B','M','A','P') // Bitmap
+#define ID_BUTN MKTAG('B','U','T','N') // Button
+#define ID_CTBL MKTAG('C','T','B','L') // Color Table
+#define ID_EVNT MKTAG('E','V','N','T') // Event
+#define ID_PIPE MKTAG('P','I','P','E') // Pipe
+#define ID_SCRP MKTAG('S','C','R','P') // Script
+#define ID_VARI MKTAG('V','A','R','I') // Variables
+#define ID_WAVE MKTAG('W','A','V','E') // Wave
+
+class Archive {
+public:
+ Archive();
+ virtual ~Archive();
+
+ bool openFile(const Common::String &fileName);
+ virtual bool openStream(Common::SeekableReadStream *stream) = 0;
+ void close();
+
+ bool isOpen() const { return _stream != 0; }
+
+ bool hasResource(uint32 tag, uint16 id) const;
+ bool hasResource(uint32 tag, const Common::String &resName) const;
+ Common::SeekableReadStream *getResource(uint32 tag, uint16 id);
+ uint32 getResourceFlags(uint32 tag, uint16 id) const;
+ uint32 getOffset(uint32 tag, uint16 id) const;
+ uint16 findResourceID(uint32 tag, const Common::String &resName) const;
+ Common::String getName(uint32 tag, uint16 id) const;
+
+ Common::Array<uint32> getResourceTypeList() const;
+ Common::Array<uint16> getResourceIDList(uint32 type) const;
+
+protected:
+ Common::SeekableReadStream *_stream;
+
+ struct Resource {
+ uint32 offset;
+ uint32 size;
+ Common::String name;
+ uint32 flags;
+ };
+
+ typedef Common::HashMap<uint16, Resource> ResourceMap;
+ typedef Common::HashMap<uint32, ResourceMap> TypeMap;
+ TypeMap _types;
+};
+
+class ComposerArchive : public Archive {
+public:
+ ComposerArchive() : Archive() {}
+ ~ComposerArchive() {}
+
+ bool openStream(Common::SeekableReadStream *stream);
+};
+
+struct PipeResourceEntry {
+ uint32 size;
+ uint32 offset;
+};
+
+struct PipeResource {
+ Common::Array<PipeResourceEntry> entries;
+};
+
+class Pipe {
+public:
+ Pipe(Common::SeekableReadStream *stream);
+ void nextFrame();
+
+ Animation *_anim;
+
+ bool hasResource(uint32 tag, uint16 id) const;
+ Common::SeekableReadStream *getResource(uint32 tag, uint16 id, bool buffering);
+
+protected:
+ Common::SeekableReadStream *_stream;
+
+ typedef Common::HashMap<uint16, PipeResource> ResourceMap;
+ typedef Common::HashMap<uint32, ResourceMap> TypeMap;
+ TypeMap _types;
+
+ uint32 _offset;
+};
+
+} // End of namespace Composer
+
+#endif
diff --git a/engines/composer/scripting.cpp b/engines/composer/scripting.cpp
new file mode 100644
index 0000000000..1989919233
--- /dev/null
+++ b/engines/composer/scripting.cpp
@@ -0,0 +1,729 @@
+/* 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.
+ *
+ */
+#include "common/scummsys.h"
+#include "common/savefile.h"
+
+#include "composer/composer.h"
+#include "composer/graphics.h"
+#include "composer/resource.h"
+
+namespace Composer {
+
+// new script ops
+enum {
+ kOpPlusPlus = 0x1,
+ kOpMinusMinus = 0x2,
+ kOpAssign = 0x3,
+ kOpAdd = 0x4,
+ kOpSubtract = 0x5,
+ kOpMultiply = 0x6,
+ kOpDivide = 0x7,
+ kOpModulo = 0x8,
+ kOpMaybeAlsoAssign = 0x9,
+ kOpBooleanAssign = 0xA,
+ kOpNegate = 0xB,
+ kOpAnd = 0xC,
+ kOpOr = 0xD,
+ kOpXor = 0xE,
+ kOpNot = 0xF,
+ kOpSqrt = 0x10,
+ kOpRandom = 0x11,
+ kOpExecuteScript = 0x12,
+ kOpCallFunc = 0x13,
+ kOpBoolLessThanEq = 0x17,
+ kOpBoolLessThan = 0x16,
+ kOpBoolGreaterThanEq = 0x15,
+ kOpBoolGreaterThan = 0x14,
+ kOpBoolEqual = 0x18,
+ kOpBoolNotEqual = 0x19,
+ kOpSaveArgs = 0x1A,
+ kOpRestoreArgs = 0x1B,
+ kOpReturn = 0x20,
+ kOpLessThanEq = 0x22,
+ kOpLessThan = 0x21,
+ kOpGreaterThanEq = 0x24,
+ kOpGreaterThan = 0x23,
+ kOpEqual = 0x25,
+ kOpNotEqual = 0x26,
+ kOpJump = 0x80,
+ kOpJumpIfNot = 0x81,
+ kOpJumpIf = 0x82,
+ kOpJumpIfNotValue = 0x83,
+ kOpJumpIfValue = 0x84
+};
+
+enum {
+ kFuncPlayAnim = 35001,
+ kFuncStopAnim = 35002,
+ // (no 35003)
+ kFuncQueueScript = 35004,
+ kFuncDequeueScript = 35005,
+ kFuncSetCursor = 35006,
+ kFuncGetCursor = 35007,
+ kFuncShowCursor = 35008,
+ kFuncHideCursor = 35009,
+ // (no 35010)
+ kFuncActivateButton = 35011,
+ kFuncDeactivateButton = 35012,
+ kFuncNewPage = 35013,
+ kFuncLoadPage = 35014,
+ kFuncUnloadPage = 35015,
+ kFuncSetPalette = 35016,
+ kFuncSaveVars = 35017,
+ kFuncLoadVars = 35018,
+ kFuncQueueScriptOnce = 35019,
+ kFuncGetMousePos = 35020,
+ kFuncChangeBackground = 35021,
+ kFuncSetBackgroundColor = 35022,
+ kFuncClearSprites = 35023,
+ kFuncAddSprite = 35024,
+ kFuncRemoveSprite = 35025,
+ kFuncQuit = 35026,
+ kFuncSaveData = 35027,
+ kFuncLoadData = 35028,
+ kFuncGetSpriteSize = 35029
+};
+
+void ComposerEngine::runEvent(uint16 id, int16 param1, int16 param2, int16 param3) {
+ if (!hasResource(ID_EVNT, id))
+ return;
+
+ Common::SeekableReadStream *stream = getResource(ID_EVNT, id);
+ if (stream->size() != 2)
+ error("bad EVNT size %d", stream->size());
+ uint16 scriptId = stream->readUint16LE();
+ delete stream;
+
+ if (!scriptId)
+ return;
+
+ debug(2, "running event %d via script %d(%d, %d, %d)", id, scriptId, param1, param2, param3);
+
+ runScript(scriptId, param1, param2, param3);
+}
+
+int16 ComposerEngine::runScript(uint16 id, int16 param1, int16 param2, int16 param3) {
+ _vars[1] = param1;
+ _vars[2] = param2;
+ _vars[3] = param3;
+
+ runScript(id);
+
+ return _vars[0];
+}
+
+int16 ComposerEngine::getArg(uint16 arg, uint16 type) {
+ switch (type) {
+ case 0:
+ return (int16)arg;
+ case 1:
+ return (int16)_vars[arg];
+ case 2:
+ return (int16)_vars[_vars[arg]];
+ default:
+ error("invalid argument type %d (getting arg %d)", type, arg);
+ }
+}
+
+void ComposerEngine::setArg(uint16 arg, uint16 type, uint16 val) {
+ switch (type) {
+ case 1:
+ _vars[arg] = val;
+ break;
+ case 2:
+ _vars[_vars[arg]] = val;
+ break;
+ default:
+ error("invalid argument type %d (setting arg %d)", type, arg);
+ }
+
+}
+
+void ComposerEngine::runScript(uint16 id) {
+ if (!hasResource(ID_SCRP, id)) {
+ debug(1, "ignoring attempt to run script %d, because it doesn't exist", id);
+ return;
+ }
+
+ uint stackBase = _stack.size();
+ _stack.resize(_stack.size() + 19);
+
+ Common::SeekableReadStream *stream = getResource(ID_SCRP, id);
+ if (stream->size() < 2)
+ error("SCRP was too small (%d)", stream->size());
+ uint16 size = stream->readUint16LE();
+ if (stream->size() < 2 + 2*size)
+ error("SCRP was too small (%d, but claimed %d entries)", stream->size(), size);
+ uint16 *script = new uint16[size];
+ for (uint i = 0; i < size; i++)
+ script[i] = stream->readUint16LE();
+ delete stream;
+
+ uint16 pos = 0;
+ bool lastResult = false;
+ while (pos < size) {
+ int16 val1, val2, val3;
+
+ byte op = (byte)script[pos];
+ uint numParams = (script[pos] & 0x300) >> 8; // 2 bits
+ if (pos + numParams >= size)
+ error("script ran out of content");
+ uint arg1 = (script[pos] & 0xc00) >> 10; // 2 bits
+ uint arg2 = (script[pos] & 0x3000) >> 12; // 2 bits
+ uint arg3 = (script[pos] & 0xC000) >> 14; // 2 bits
+ switch (op) {
+ case kOpPlusPlus:
+ if (numParams != 1)
+ error("kOpPlusPlus had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ debug(9, "[%d/%d]++ (now %d)", script[pos + 1], arg1, val1 + 1);
+ setArg(script[pos + 1], arg1, val1 + 1);
+ break;
+ case kOpMinusMinus:
+ if (numParams != 1)
+ error("kOpMinusMinus had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ debug(9, "[%d/%d]-- (now %d)", script[pos + 1], arg1, val1 - 1);
+ setArg(script[pos + 1], arg1, val1 - 1);
+ break;
+ case kOpAssign:
+ if (numParams != 2)
+ error("kOpAssign had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] = [%d/%d] (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2);
+ setArg(script[pos + 1], arg1, val2);
+ break;
+ case kOpAdd:
+ if (numParams != 3)
+ error("kOpAdd had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d]=%d + [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 + val3);
+ setArg(script[pos + 1], arg1, val2 + val3);
+ break;
+ case kOpSubtract:
+ if (numParams != 3)
+ error("kOpSubtract had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d]=%d - [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 - val3);
+ setArg(script[pos + 1], arg1, val2 - val3);
+ break;
+ case kOpMultiply:
+ if (numParams != 3)
+ error("kOpMultiply had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d]=%d * [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 * val3);
+ setArg(script[pos + 1], arg1, val2 * val3);
+ break;
+ case kOpDivide:
+ if (numParams != 3)
+ error("kOpDivide had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ if (val3 == 0)
+ error("script tried to divide by zero");
+ debug(9, "[%d/%d] = [%d/%d]=%d / [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 / val3);
+ setArg(script[pos + 1], arg1, val2 / val3);
+ break;
+ case kOpModulo:
+ if (numParams != 3)
+ error("kOpModulo had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ if (val3 == 0)
+ error("script tried to divide by zero (modulo)");
+ debug(9, "[%d/%d] = [%d/%d]=%d %% [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 % val3);
+ setArg(script[pos + 1], arg1, val2 % val3);
+ break;
+ case kOpMaybeAlsoAssign:
+ if (numParams != 2)
+ error("kOpMaybeAlsoAssign had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] =(?) [%d/%d] (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2);
+ setArg(script[pos + 1], arg1, val2);
+ break;
+ case kOpBooleanAssign:
+ if (numParams != 2)
+ error("kOpBooleanAssign had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] = [%d/%d] (%d) ? 1 : 0", script[pos + 1], arg1, script[pos + 2], arg2, val2);
+ setArg(script[pos + 1], arg1, val2 ? 1 : 0);
+ break;
+ case kOpNegate:
+ if (numParams != 2)
+ error("kOpNegate had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] = -[%d/%d] (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2);
+ setArg(script[pos + 1], arg1, -val2);
+ break;
+ case kOpAnd:
+ if (numParams != 3)
+ error("kOpAnd had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d]=%d & [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 & val3);
+ setArg(script[pos + 1], arg1, val2 & val3);
+ break;
+ case kOpOr:
+ if (numParams != 3)
+ error("kOpOr had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d]=%d | [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 | val3);
+ setArg(script[pos + 1], arg1, val2 | val3);
+ break;
+ case kOpXor:
+ if (numParams != 3)
+ error("kOpXor had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d]=%d ^ [%d/%d]=%d (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val2 ^ val3);
+ setArg(script[pos + 1], arg1, val2 ^ val3);
+ break;
+ case kOpNot:
+ if (numParams != 2)
+ error("kOpNot had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] = ![%d/%d] (!%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2);
+ setArg(script[pos + 1], arg1, val2 ? 0 : 1);
+ break;
+ case kOpSqrt:
+ if (numParams != 2)
+ error("kOpSqrt had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] = sqrt([%d/%d] (%d))", script[pos + 1], arg1, script[pos + 2], arg2, val2);
+ setArg(script[pos + 1], arg1, (int16)sqrt((double)val2));
+ break;
+ case kOpRandom:
+ if (numParams != 3)
+ error("kOpRandom had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ val1 = _rnd->getRandomNumberRng(val2, val3);
+ debug(9, "[%d/%d] = rnd([%d/%d]=%d, [%d/%d]=%d) (%d)", script[pos + 1], arg1, script[pos + 2], arg2, val2, script[pos+3], arg3, val3, val1);
+ setArg(script[pos + 1], arg1, val1);
+ break;
+ case kOpExecuteScript:
+ if (numParams != 1)
+ error("kOpExecuteScript had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ debug(8, "run script [%d/%d]=%d", script[pos + 1], arg1, val1);
+ runScript(val1);
+ debug(8, "done run script");
+ break;
+ case kOpCallFunc:
+ if (numParams != 1)
+ error("kOpCallFunc had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ debug(8, "%d(%d, %d, %d)", (uint16)val1, _vars[1], _vars[2], _vars[3]);
+ _vars[0] = scriptFuncCall(val1, _vars[1], _vars[2], _vars[3]);
+ break;
+ case kOpBoolLessThanEq:
+ if (numParams != 2)
+ error("kOpBoolLessThanEq had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] <= [%d/%d]? (%d <= %d)", script[pos + 1], arg1, script[pos + 2], arg2, val1, val2);
+ lastResult = (val1 <= val2);
+ break;
+ case kOpBoolLessThan:
+ if (numParams != 2)
+ error("kOpBoolLessThan had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] < [%d/%d]? (%d < %d)", script[pos + 1], arg1, script[pos + 2], arg2, val1, val2);
+ lastResult = (val1 < val2);
+ break;
+ case kOpBoolGreaterThanEq:
+ if (numParams != 2)
+ error("kOpBoolGreaterThanEq had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] >= [%d/%d]? (%d >= %d)", script[pos + 1], arg1, script[pos + 2], arg2, val1, val2);
+ lastResult = (val1 >= val2);
+ break;
+ case kOpBoolGreaterThan:
+ if (numParams != 2)
+ error("kOpBoolGreaterThan had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] > [%d/%d]? (%d > %d)", script[pos + 1], arg1, script[pos + 2], arg2, val1, val2);
+ lastResult = (val1 > val2);
+ break;
+ case kOpBoolEqual:
+ if (numParams != 2)
+ error("kOpBoolEqual had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] == [%d/%d]? (%d == %d)", script[pos + 1], arg1, script[pos + 2], arg2, val1, val2);
+ lastResult = (val1 == val2);
+ break;
+ case kOpBoolNotEqual:
+ if (numParams != 2)
+ error("kOpBoolNotEqual had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "[%d/%d] != [%d/%d]? (%d != %d)", script[pos + 1], arg1, script[pos + 2], arg2, val1, val2);
+ lastResult = (val1 != val2);
+ break;
+ case kOpSaveArgs:
+ if (numParams != 0)
+ error("kOpSaveArgs had wrong number of params (%d)", numParams);
+ debug(9, "save args");
+ for (uint i = 1; i < 19; i++)
+ _stack[stackBase + i] = _vars[i];
+ break;
+ case kOpRestoreArgs:
+ if (numParams != 0)
+ error("kOpRestoreArgs had wrong number of params (%d)", numParams);
+ debug(9, "restore args");
+ for (uint i = 1; i < 19; i++)
+ _vars[i] = _stack[stackBase + i];
+ break;
+ case kOpReturn:
+ if (numParams != 1)
+ error("kOpReturn had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ debug(9, "return [%d/%d]=%d", script[pos + 1], arg1, val1);
+ _vars[0] = val1;
+ break;
+ case kOpLessThanEq:
+ if (numParams != 3)
+ error("kOpLessThanEq had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d] <= [%d/%d]? (%d <= %d)", script[pos + 1], arg1, script[pos + 2], arg2, script[pos + 3], arg3, val3, val2);
+ setArg(script[pos + 1], arg1, (val3 <= val2) ? 1 : 0);
+ break;
+ case kOpLessThan:
+ if (numParams != 3)
+ error("kOpLessThan had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d] < [%d/%d]? (%d < %d)", script[pos + 1], arg1, script[pos + 2], arg2, script[pos + 3], arg3, val3, val2);
+ setArg(script[pos + 1], arg1, (val3 < val2) ? 1 : 0);
+ break;
+ case kOpGreaterThanEq:
+ if (numParams != 3)
+ error("kOpGreaterThanEq had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d] >= [%d/%d]? (%d >= %d)", script[pos + 1], arg1, script[pos + 2], arg2, script[pos + 3], arg3, val3, val2);
+ setArg(script[pos + 1], arg1, (val3 >= val2) ? 1 : 0);
+ break;
+ case kOpGreaterThan:
+ if (numParams != 3)
+ error("kOpGreaterThan had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d] > [%d/%d]? (%d > %d)", script[pos + 1], arg1, script[pos + 2], arg2, script[pos + 3], arg3, val3, val2);
+ setArg(script[pos + 1], arg1, (val3 > val2) ? 1 : 0);
+ break;
+ case kOpEqual:
+ if (numParams != 3)
+ error("kOpEqual had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d] == [%d/%d]? (%d == %d)", script[pos + 1], arg1, script[pos + 2], arg2, script[pos + 3], arg3, val2, val3);
+ setArg(script[pos + 1], arg1, (val3 == val2) ? 1 : 0);
+ break;
+ case kOpNotEqual:
+ if (numParams != 3)
+ error("kOpNotEqual had wrong number of params (%d)", numParams);
+ val2 = getArg(script[pos + 2], arg2);
+ val3 = getArg(script[pos + 3], arg3);
+ debug(9, "[%d/%d] = [%d/%d] != [%d/%d]? (%d != %d)", script[pos + 1], arg1, script[pos + 2], arg2, script[pos + 3], arg3, val2, val3);
+ setArg(script[pos + 1], arg1, (val3 != val2) ? 1 : 0);
+ break;
+ case kOpJump:
+ if (numParams != 1)
+ error("kOpJump had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ debug(9, "jump by [%d/%d]=%d", script[pos + 1], arg1, val1);
+ pos += val1;
+ break;
+ case kOpJumpIfNot:
+ if (numParams != 1)
+ error("kOpJumpIfNot had wrong number of params (%d)", numParams);
+ if (lastResult)
+ break;
+ val1 = getArg(script[pos + 1], arg1);
+ debug(9, "jump if not, by [%d/%d]=%d", script[pos + 1], arg1, val1);
+ pos += val1;
+ break;
+ case kOpJumpIf:
+ if (numParams != 1)
+ error("kOpJumpIf had wrong number of params (%d)", numParams);
+ if (!lastResult)
+ break;
+ val1 = getArg(script[pos + 1], arg1);
+ debug(9, "jump if, by [%d/%d]=%d", script[pos + 1], arg1, val1);
+ pos += val1;
+ break;
+ case kOpJumpIfNotValue:
+ if (numParams != 2)
+ error("kOpJumpIfNotValue had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "jump if not [%d/%d]=%d", script[pos + 1], arg1, val1);
+ if (val1)
+ break;
+ debug(9, "--> jump by [%d/%d]=%d", script[pos + 2], arg2, val2);
+ pos += val2;
+ break;
+ case kOpJumpIfValue:
+ if (numParams != 2)
+ error("kOpJumpIfValue had wrong number of params (%d)", numParams);
+ val1 = getArg(script[pos + 1], arg1);
+ val2 = getArg(script[pos + 2], arg2);
+ debug(9, "jump if [%d/%d]=%d", script[pos + 1], arg1, val1);
+ if (!val1)
+ break;
+ debug(9, "--> jump by [%d/%d]=%d", script[pos + 2], arg2, val2);
+ pos += val2;
+ break;
+ default:
+ error("unknown script op 0x%02x", op);
+ }
+ pos += (1 + numParams);
+
+ if (op == kOpReturn)
+ break;
+ }
+
+ delete[] script;
+ _stack.resize(_stack.size() - 19);
+}
+
+int16 ComposerEngine::scriptFuncCall(uint16 id, int16 param1, int16 param2, int16 param3) {
+ switch (id) {
+ case kFuncPlayAnim:
+ debug(3, "kFuncPlayAnim(%d, %d, %d)", param1, param2, param3);
+ playAnimation(param1, param2, param3, 0);
+ return 1; // TODO: return 0 on failure
+ case kFuncStopAnim:
+ debug(3, "kFuncStopAnim(%d)", param1);
+ for (Common::List<Animation *>::iterator i = _anims.begin(); i != _anims.end(); i++) {
+ if ((*i)->_id == param1)
+ stopAnimation(*i);
+ }
+ return 0;
+ case kFuncQueueScript:
+ debug(3, "kFuncQueueScript(%d, %d, %d)", param1, param2, param3);
+ _queuedScripts[param1]._baseTime = _currentTime;
+ _queuedScripts[param1]._duration = 10 * param2;
+ _queuedScripts[param1]._count = 0xffffffff;
+ _queuedScripts[param1]._scriptId = param3;
+ return 0;
+ case kFuncDequeueScript:
+ debug(3, "kFuncDequeueScript(%d)", param1);
+ _queuedScripts[param1]._count = 0;
+ _queuedScripts[param1]._scriptId = 0;
+ return 0;
+ case kFuncSetCursor:
+ debug(3, "kSetCursor(%d, (%d, %d))", param1, param2, param3);
+ {
+ uint16 oldCursor = _mouseSpriteId;
+ setCursor(param1, Common::Point(param2, param3));
+ return oldCursor;
+ }
+ case kFuncGetCursor:
+ debug(3, "kFuncGetCursor()");
+ return _mouseSpriteId;
+ case kFuncShowCursor:
+ debug(3, "kFuncShowCursor()");
+ setCursorVisible(true);
+ return 0;
+ case kFuncHideCursor:
+ debug(3, "kFuncHideCursor()");
+ setCursorVisible(false);
+ return 0;
+ case kFuncActivateButton:
+ debug(3, "kFuncActivateButton(%d)", param1);
+ for (Common::List<Library>::iterator l = _libraries.begin(); l != _libraries.end(); l++) {
+ for (Common::List<Button>::iterator i = l->_buttons.begin(); i != l->_buttons.end(); i++) {
+ if (i->_id != param1)
+ continue;
+ i->_active = true;
+ }
+ }
+ onMouseMove(_lastMousePos);
+ return 1;
+ case kFuncDeactivateButton:
+ debug(3, "kFuncDeactivateButton(%d)", param1);
+ for (Common::List<Library>::iterator l = _libraries.begin(); l != _libraries.end(); l++) {
+ for (Common::List<Button>::iterator i = l->_buttons.begin(); i != l->_buttons.end(); i++) {
+ if (i->_id != param1)
+ continue;
+ i->_active = false;
+ }
+ }
+ onMouseMove(_lastMousePos);
+ return 1;
+ case kFuncNewPage:
+ debug(3, "kFuncNewPage(%d, %d)", param1, param2);
+ _pendingPageChanges.push_back(PendingPageChange(param1, true));
+ _pendingPageChanges.push_back(PendingPageChange(param2, false));
+ return 1;
+ case kFuncLoadPage:
+ debug(3, "kFuncLoadPage(%d)", param1);
+ _pendingPageChanges.push_back(PendingPageChange(param1, false));
+ return 1;
+ case kFuncUnloadPage:
+ debug(3, "kFuncUnloadPage(%d)", param1);
+ _pendingPageChanges.push_back(PendingPageChange(param1, true));
+ return 1;
+ case kFuncSetPalette:
+ // TODO: return 0 if not disabling (0) and doesn't exist
+ debug(4, "kFuncSetPalette(%d, %d)", param1, param2);
+ // this seems only needed for a script bug in the Gregory credits, sigh
+ if ((uint16)param2 > 100)
+ param2 = 100;
+ loadCTBL(param1, param2);
+ return 1;
+ case kFuncSaveVars:
+ debug(3, "kFuncSaveVars(%d)", param1);
+ {
+ Common::String filename = _targetName + Common::String::format(".%03d", param1);
+ Common::WriteStream *stream = _saveFileMan->openForSaving(filename);
+ for (uint i = 0; i < 1000; i++) {
+ stream->writeUint16LE(_vars[i]);
+ }
+ delete stream;
+ }
+ return 1;
+ case kFuncLoadVars:
+ debug(3, "kFuncLoadVars(%d, %d, %d)", param1, param2, param3);
+ {
+ Common::String filename = _targetName + Common::String::format(".%03d", param1);
+ Common::SeekableReadStream *stream = _saveFileMan->openForLoading(filename);
+ if (!stream) {
+ if (!_bookIni.hasKey(Common::String::format("%d", param1), "Data"))
+ return 0;
+ filename = getFilename("Data", param1);
+ Common::File *file = new Common::File();
+ if (!file->open(filename))
+ error("couldn't open '%s' to get vars id '%d'", filename.c_str(), param1);
+ stream = file;
+ }
+ if (param3 == 0)
+ param3 = 1000;
+ if (param2 < 0 || param3 < 0 || param2 + param3 > 1000)
+ error("can't read %d entries into %d from file '%s' for vars id '%d'", param3, param2, filename.c_str(), param1);
+ stream->skip(param2 * 2);
+ for (uint i = 0; i < (uint)param3; i++) {
+ if (stream->pos() + 1 > stream->size())
+ break;
+ _vars[param2 + i] = stream->readUint16LE();
+ }
+ delete stream;
+ }
+ return 1;
+ case kFuncQueueScriptOnce:
+ debug(3, "kFuncQueueScriptOnce(%d, %d, %d)", param1, param2, param3);
+ _queuedScripts[param1]._baseTime = _currentTime;
+ _queuedScripts[param1]._duration = 10 * param2;
+ _queuedScripts[param1]._count = 1;
+ _queuedScripts[param1]._scriptId = param3;
+ return 0;
+ case kFuncGetMousePos:
+ debug(3, "kFuncGetMousePos(%d, %d)", param1, param2);
+ _vars[param1] = _lastMousePos.x;
+ _vars[param2] = _lastMousePos.y;
+ return 0;
+ case kFuncChangeBackground:
+ debug(3, "kFuncChangeBackground(%d)", param1);
+ // TODO: return 1 if background existed, else 0
+ setBackground(param1);
+ return 1;
+ case kFuncSetBackgroundColor:
+ // TODO
+ warning("ignoring kFuncSetBackgroundColor(%d)", param1);
+ return 0;
+ case kFuncClearSprites:
+ debug(3, "kFuncClearSprites()");
+ removeSprite(0, 0);
+ return 0;
+ case kFuncAddSprite:
+ {
+ Common::Point pos(_vars[param3], _vars[param3 + 1]);
+ int16 zorder = _vars[param3 + 2];
+ debug(3, "kFuncAddSprite(%d, %d, [%d = (%d, %d), %d])", param1, param2, param3, pos.x, pos.y, zorder);
+ addSprite(param1, param2, zorder, pos);
+ }
+ return 0;
+ case kFuncRemoveSprite:
+ debug(3, "kFuncRemoveSprite(%d, %d)", param1, param2);
+ removeSprite(param1, param2);
+ return 0;
+ case kFuncQuit:
+ debug(3, "kFuncQuit()");
+ quitGame();
+ return 0;
+ case kFuncSaveData:
+ // TODO
+ warning("ignoring kFuncSaveData(%d, %d, %d)", param1, param2, param3);
+ return 1;
+ case kFuncLoadData:
+ debug(3, "kFuncLoadData(%d, %d, %d)", param1, param2, param3);
+ {
+ Common::String filename = getFilename("Data", param1);
+ Common::File *file = new Common::File();
+ if (!file->open(filename))
+ error("couldn't open '%s' to get data id '%d'", filename.c_str(), param1);
+ if (param3 == 0)
+ param3 = 1000;
+ if (param2 < 0 || param3 < 0 || param2 + param3 > 1000)
+ error("can't read %d entries into %d from file '%s' for data id '%d'", param3, param2, filename.c_str(), param1);
+ for (uint i = 0; i < (uint)param3; i++) {
+ if (file->pos() + 1 > file->size())
+ break;
+ _vars[param2 + i] = file->readUint16LE();
+ }
+ delete file;
+ }
+ return 1;
+ case kFuncGetSpriteSize:
+ debug(3, "kFuncGetSpriteSize(%d, %d, %d)", param1, param2, param3);
+ int16 width, height;
+ width = 0;
+ height = 0;
+ {
+ Common::SeekableReadStream *stream = getStreamForSprite(param1);
+ if (stream) {
+ stream->readUint16LE();
+ height = stream->readSint16LE();
+ width = stream->readSint16LE();
+ delete stream;
+ }
+ }
+ _vars[param2] = width;
+ _vars[param3] = height;
+ return 0;
+ default:
+ error("unknown scriptFuncCall %d(%d, %d, %d)", (uint32)id, param1, param2, param3);
+ }
+}
+
+} // End of namespace Composer
diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h
index 900f677975..94f8759d01 100644
--- a/engines/cruise/cruise.h
+++ b/engines/cruise/cruise.h
@@ -108,7 +108,15 @@ public:
Common::RandomSource _rnd;
- Common::List<byte *> _memList;
+ struct MemInfo {
+ int32 lineNum;
+ char fname[64];
+ uint32 magic;
+
+ static uint32 const cookie = 0x41424344;
+ };
+
+ Common::List<MemInfo*> _memList;
typedef Common::List<Common::Rect> RectList;
diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp
index a97583c972..d0340238cd 100644
--- a/engines/cruise/cruise_main.cpp
+++ b/engines/cruise/cruise_main.cpp
@@ -40,19 +40,21 @@ unsigned int timer = 0;
gfxEntryStruct* linkedMsgList = NULL;
+typedef CruiseEngine::MemInfo MemInfo;
+
void MemoryList() {
if (!_vm->_memList.empty()) {
debug("Current list of un-freed memory blocks:");
- Common::List<byte *>::iterator i;
+ Common::List<MemInfo*>::iterator i;
for (i = _vm->_memList.begin(); i != _vm->_memList.end(); ++i) {
- byte *v = *i;
- debug("%s - %d", (const char *)(v - 68), *((int32 *)(v - 72)));
+ MemInfo const *const v = *i;
+ debug("%s - %d", v->fname, v->lineNum);
}
}
}
void *MemoryAlloc(uint32 size, bool clearFlag, int32 lineNum, const char *fname) {
- byte *result;
+ void *result;
if (gDebugLevel > 0) {
// Find the point after the final slash
@@ -61,17 +63,17 @@ void *MemoryAlloc(uint32 size, bool clearFlag, int32 lineNum, const char *fname)
--fnameP;
// Create the new memory block and add it to the memory list
- byte *v = (byte *)malloc(size + 64 + 8);
- *((int32 *) v) = lineNum;
- strncpy((char *)v + 4, fnameP, 63);
- *((char *)v + 4 + 63) = '\0';
- *((uint32 *) (v + 68)) = 0x41424344;
+ MemInfo *const v = (MemInfo *)malloc(sizeof(MemInfo) + size);
+ v->lineNum = lineNum;
+ strncpy(v->fname, fnameP, sizeof(v->fname));
+ v->fname[ARRAYSIZE(v->fname) - 1] = '\0';
+ v->magic = MemInfo::cookie;
// Add the block to the memory list
- result = v + 64 + 8;
- _vm->_memList.push_back(result);
+ _vm->_memList.push_back(v);
+ result = v + 1;
} else
- result = (byte *)malloc(size);
+ result = malloc(size);
if (clearFlag)
memset(result, 0, size);
@@ -84,11 +86,11 @@ void MemoryFree(void *v) {
return;
if (gDebugLevel > 0) {
- byte *p = (byte *)v;
- assert(*((uint32 *) (p - 4)) == 0x41424344);
+ MemInfo *const p = (MemInfo *)v - 1;
+ assert(p->magic == MemInfo::cookie);
_vm->_memList.remove(p);
- free(p - 8 - 64);
+ free(p);
} else
free(v);
}
@@ -902,18 +904,8 @@ bool createDialog(int objOvl, int objIdx, int x, int y) {
if (!obj2Ovl) obj2Ovl = j;
char verbe_name[80];
- char obj1_name[80];
- char obj2_name[80];
- char r_verbe_name[80];
- char r_obj1_name[80];
- char r_obj2_name[80];
verbe_name[0] = 0;
- obj1_name[0] = 0;
- obj2_name[0] = 0;
- r_verbe_name[0] = 0;
- r_obj1_name[0] = 0;
- r_obj2_name[0] = 0;
ovlDataStruct *ovl2 = NULL;
ovlDataStruct *ovl3 = NULL;
@@ -1812,6 +1804,8 @@ void CruiseEngine::mainLoop() {
bool skipEvents = false;
do {
+ g_system->updateScreen();
+
g_system->delayMillis(10);
currentTick = g_system->getMillis();
diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp
index 5be2fdeeea..a482e263a2 100644
--- a/engines/cruise/detection.cpp
+++ b/engines/cruise/detection.cpp
@@ -66,8 +66,6 @@ static const PlainGameDescriptor cruiseGames[] = {
namespace Cruise {
-using Common::GUIO_NONE;
-
static const CRUISEGameDescription gameDescriptions[] = {
{
{
@@ -77,7 +75,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -90,7 +88,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -103,7 +101,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -116,7 +114,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -129,7 +127,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -142,7 +140,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -155,7 +153,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -168,7 +166,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -181,7 +179,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -194,7 +192,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -207,7 +205,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CRUISE,
0,
@@ -221,7 +219,7 @@ class CruiseMetaEngine : public AdvancedMetaEngine {
public:
CruiseMetaEngine() : AdvancedMetaEngine(Cruise::gameDescriptions, sizeof(Cruise::CRUISEGameDescription), cruiseGames) {
_singleid = "cruise";
- _guioptions = Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI;
+ _guioptions = GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI);
}
virtual const char *getName() const {
@@ -284,19 +282,22 @@ void CruiseMetaEngine::removeSaveState(const char *target, int slot) const {
SaveStateDescriptor CruiseMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
Cruise::CruiseEngine::getSavegameFile(slot));
- assert(f);
-
- Cruise::CruiseSavegameHeader header;
- Cruise::readSavegameHeader(f, header);
- delete f;
-
- // Create the return descriptor
- SaveStateDescriptor desc(slot, header.saveName);
- desc.setDeletableFlag(true);
- desc.setWriteProtectedFlag(false);
- desc.setThumbnail(header.thumbnail);
+
+ if (f) {
+ Cruise::CruiseSavegameHeader header;
+ Cruise::readSavegameHeader(f, header);
+ delete f;
+
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header.saveName);
+ desc.setDeletableFlag(true);
+ desc.setWriteProtectedFlag(false);
+ desc.setThumbnail(header.thumbnail);
+
+ return desc;
+ }
- return desc;
+ return SaveStateDescriptor();
}
bool CruiseMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
diff --git a/engines/cruise/mainDraw.cpp b/engines/cruise/mainDraw.cpp
index 814d0aa9e9..14b6daf4bb 100644
--- a/engines/cruise/mainDraw.cpp
+++ b/engines/cruise/mainDraw.cpp
@@ -440,7 +440,6 @@ void buildSegment() {
// is segment on screen ?
if (!((tempAX > 199) || (tempDX < 0))) {
- int dx = Y1;
int cx = X2 - X1;
if (cx == 0) {
// vertical line
@@ -473,7 +472,6 @@ void buildSegment() {
} else {
if (cx < 0) {
cx = -cx;
- dx = Y2;
SWAP(X1, X2);
SWAP(Y1, Y2);
@@ -1490,9 +1488,6 @@ void mainDraw(int16 param) {
if (currentObjPtr->animLoop > 0)
currentObjPtr->animLoop--;
} else {
- int16 data2;
- data2 = currentObjPtr->animStart;
-
change = false;
currentObjPtr->animStep = 0;
@@ -1512,9 +1507,6 @@ void mainDraw(int16 param) {
if (currentObjPtr->animLoop > 0)
currentObjPtr->animLoop--;
} else {
- int16 data2;
- data2 = currentObjPtr->animStart;
-
change = false;
currentObjPtr->animStep = 0;
diff --git a/engines/cruise/module.mk b/engines/cruise/module.mk
index 5c36b2a7c1..ae07d20956 100644
--- a/engines/cruise/module.mk
+++ b/engines/cruise/module.mk
@@ -40,4 +40,3 @@ endif
# Include common rules
include $(srcdir)/rules.mk
-
diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp
index 6392009373..c3d1ea6643 100644
--- a/engines/cruise/saveload.cpp
+++ b/engines/cruise/saveload.cpp
@@ -62,12 +62,9 @@ bool readSavegameHeader(Common::InSaveFile *in, CruiseSavegameHeader &header) {
while ((ch = (char)in->readByte()) != '\0') header.saveName += ch;
// Get the thumbnail
- header.thumbnail = new Graphics::Surface();
- if (!Graphics::loadThumbnail(*in, *header.thumbnail)) {
- delete header.thumbnail;
- header.thumbnail = NULL;
+ header.thumbnail = Graphics::loadThumbnail(*in);
+ if (!header.thumbnail)
return false;
- }
return true;
}
diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp
index 4e76194a45..cf28548e7d 100644
--- a/engines/cruise/script.cpp
+++ b/engines/cruise/script.cpp
@@ -231,9 +231,7 @@ int32 opcodeType2() {
int type = getByteFromScript();
int overlay = getByteFromScript();
- int firstOffset;
- int offset;
- firstOffset = offset = getShortFromScript();
+ int offset = getShortFromScript();
offset += index;
int typ7 = type & 7;
diff --git a/engines/cruise/sound.cpp b/engines/cruise/sound.cpp
index 290cc220d4..21d9a75297 100644
--- a/engines/cruise/sound.cpp
+++ b/engines/cruise/sound.cpp
@@ -31,6 +31,7 @@
#include "audio/audiostream.h"
#include "audio/fmopl.h"
+#include "audio/mixer.h"
#include "audio/mods/soundfx.h"
namespace Cruise {
diff --git a/engines/cruise/sound.h b/engines/cruise/sound.h
index 11aec0b04e..c1975dc579 100644
--- a/engines/cruise/sound.h
+++ b/engines/cruise/sound.h
@@ -23,10 +23,6 @@
#ifndef CRUISE_SOUND_H
#define CRUISE_SOUND_H
-#include "audio/mididrv.h"
-#include "audio/midiparser.h"
-#include "audio/mixer.h"
-
#include "common/config-manager.h"
#include "common/serializer.h"
diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp
index 89c07ad24c..435576e9e4 100644
--- a/engines/dialogs.cpp
+++ b/engines/dialogs.cpp
@@ -228,7 +228,15 @@ void MainMenuDialog::save() {
if (result.empty()) {
// If the user was lazy and entered no save name, come up with a default name.
Common::String buf;
+ #if defined(USE_SAVEGAME_TIMESTAMP)
+ TimeDate curTime;
+ g_system->getTimeAndDate(curTime);
+ curTime.tm_year += 1900; // fixup year
+ curTime.tm_mon++; // fixup month
+ buf = Common::String::format("%04d.%02d.%02d / %02d:%02d:%02d", curTime.tm_year, curTime.tm_mon, curTime.tm_mday, curTime.tm_hour, curTime.tm_min, curTime.tm_sec);
+ #else
buf = Common::String::format("Save %d", slot + 1);
+ #endif
_engine->saveGameState(slot, buf);
} else {
_engine->saveGameState(slot, result);
@@ -246,14 +254,10 @@ void MainMenuDialog::load() {
int slot = _loadDialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
- if (slot >= 0) {
- // FIXME: For now we just ignore the return
- // value, which is quite bad since it could
- // be a fatal loading error, which renders
- // the engine unusable.
- _engine->loadGameState(slot);
+ _engine->setGameToLoadSlot(slot);
+
+ if (slot >= 0)
close();
- }
}
enum {
@@ -342,4 +346,3 @@ void ConfigDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32
GUI::OptionsDialog::handleCommand (sender, cmd, data);
}
}
-
diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp
index b7e83e1edb..e483e8ca9f 100644
--- a/engines/draci/detection.cpp
+++ b/engines/draci/detection.cpp
@@ -35,8 +35,6 @@ static const PlainGameDescriptor draciGames[] = {
namespace Draci {
-using Common::GUIO_NONE;
-
const ADGameDescription gameDescriptions[] = {
{
"draci",
@@ -45,7 +43,7 @@ const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
@@ -55,7 +53,7 @@ const ADGameDescription gameDescriptions[] = {
Common::CZ_CZE,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
@@ -65,7 +63,7 @@ const ADGameDescription gameDescriptions[] = {
Common::PL_POL,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
@@ -75,7 +73,7 @@ const ADGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER
@@ -155,30 +153,33 @@ void DraciMetaEngine::removeSaveState(const char *target, int slot) const {
SaveStateDescriptor DraciMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
Draci::DraciEngine::getSavegameFile(slot));
- assert(f);
-
- Draci::DraciSavegameHeader header;
- Draci::readSavegameHeader(f, header);
- delete f;
-
- // Create the return descriptor
- SaveStateDescriptor desc(slot, header.saveName);
- desc.setDeletableFlag(true);
- desc.setWriteProtectedFlag(false);
- desc.setThumbnail(header.thumbnail);
-
- int day = (header.date >> 24) & 0xFF;
- int month = (header.date >> 16) & 0xFF;
- int year = header.date & 0xFFFF;
- desc.setSaveDate(year, month, day);
-
- int hour = (header.time >> 8) & 0xFF;
- int minutes = header.time & 0xFF;
- desc.setSaveTime(hour, minutes);
-
- desc.setPlayTime(header.playtime * 1000);
+
+ if (f) {
+ Draci::DraciSavegameHeader header;
+ Draci::readSavegameHeader(f, header);
+ delete f;
+
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header.saveName);
+ desc.setDeletableFlag(true);
+ desc.setWriteProtectedFlag(false);
+ desc.setThumbnail(header.thumbnail);
+
+ int day = (header.date >> 24) & 0xFF;
+ int month = (header.date >> 16) & 0xFF;
+ int year = header.date & 0xFFFF;
+ desc.setSaveDate(year, month, day);
+
+ int hour = (header.time >> 8) & 0xFF;
+ int minutes = header.time & 0xFF;
+ desc.setSaveTime(hour, minutes);
+
+ desc.setPlayTime(header.playtime * 1000);
+
+ return desc;
+ }
- return desc;
+ return SaveStateDescriptor();
}
bool DraciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp
index 893e321b79..c4108cc0c7 100644
--- a/engines/draci/game.cpp
+++ b/engines/draci/game.cpp
@@ -39,7 +39,7 @@
namespace Draci {
-static const char *dialoguePath = "ROZH";
+static const char *const dialoguePath = "ROZH";
static double real_to_double(byte real[6]);
diff --git a/engines/draci/saveload.cpp b/engines/draci/saveload.cpp
index 1479dd3c77..b3bf0cbcd8 100644
--- a/engines/draci/saveload.cpp
+++ b/engines/draci/saveload.cpp
@@ -33,7 +33,7 @@
namespace Draci {
-static const char *draciIdentString = "DRACI";
+static const char *const draciIdentString = "DRACI";
bool readSavegameHeader(Common::InSaveFile *in, DraciSavegameHeader &header) {
char saveIdentBuffer[6];
@@ -58,13 +58,9 @@ bool readSavegameHeader(Common::InSaveFile *in, DraciSavegameHeader &header) {
header.playtime = in->readUint32LE();
// Get the thumbnail
- header.thumbnail = new Graphics::Surface();
- if (!Graphics::loadThumbnail(*in, *header.thumbnail)) {
- header.thumbnail->free();
- delete header.thumbnail;
- header.thumbnail = NULL;
+ header.thumbnail = Graphics::loadThumbnail(*in);
+ if (!header.thumbnail)
return false;
- }
return true;
}
diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp
index c4df9d9dde..8ff60033ed 100644
--- a/engines/draci/script.cpp
+++ b/engines/draci/script.cpp
@@ -1160,9 +1160,7 @@ void Script::run(const GPL2Program &program, uint16 offset) {
}
}
} else {
- debugC(1, kDraciBytecodeDebugLevel, "Unknown opcode %d, %d",
- num, subnum);
- abort();
+ error("Unknown opcode %d, %d", num, subnum);
}
GPLHandler handler = cmd->_handler;
diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp
index 106167ef8a..d534f46a6e 100644
--- a/engines/draci/sound.cpp
+++ b/engines/draci/sound.cpp
@@ -67,8 +67,12 @@ void LegacySoundArchive::openArchive(const char *path) {
debugC(1, kDraciArchiverDebugLevel, "Loading header");
uint totalLength = _f->readUint32LE();
+
const uint kMaxSamples = 4095; // The no-sound file is exactly 16K bytes long, so don't fail on short reads
- uint sampleStarts[kMaxSamples];
+ uint *sampleStarts = (uint *)malloc(kMaxSamples * sizeof(uint));
+ if (!sampleStarts)
+ error("[LegacySoundArchive::openArchive] Cannot allocate buffer for no-sound file");
+
for (uint i = 0; i < kMaxSamples; ++i) {
sampleStarts[i] = _f->readUint32LE();
}
@@ -90,17 +94,22 @@ void LegacySoundArchive::openArchive(const char *path) {
}
if (_samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length != totalLength &&
_samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length - _samples[0]._offset != totalLength) {
- // WORKAROUND: the stored length is stored with the header for sounds and without the hader for dubbing. Crazy.
+ // WORKAROUND: the stored length is stored with the header for sounds and without the header for dubbing. Crazy.
debugC(1, kDraciArchiverDebugLevel, "Broken sound archive: %d != %d",
_samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length,
totalLength);
closeArchive();
+
+ free(sampleStarts);
+
return;
}
} else {
debugC(1, kDraciArchiverDebugLevel, "Archive info: empty");
}
+ free(sampleStarts);
+
// Indicate that the archive has been successfully opened
_opened = true;
}
diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp
index 6ba5597e8a..0969ad4131 100644
--- a/engines/drascula/detection.cpp
+++ b/engines/drascula/detection.cpp
@@ -63,8 +63,6 @@ static const PlainGameDescriptor drasculaGames[] = {
namespace Drascula {
-using Common::GUIO_NONE;
-
static const DrasculaGameDescription gameDescriptions[] = {
{
// Drascula English version
@@ -75,7 +73,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -95,7 +93,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -112,7 +110,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -129,7 +127,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -142,7 +140,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -155,7 +153,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -168,7 +166,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -181,7 +179,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -194,7 +192,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
{
@@ -206,7 +204,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -223,7 +221,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -240,7 +238,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -257,7 +255,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
GF_PACKED,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -270,7 +268,7 @@ class DrasculaMetaEngine : public AdvancedMetaEngine {
public:
DrasculaMetaEngine() : AdvancedMetaEngine(Drascula::gameDescriptions, sizeof(Drascula::DrasculaGameDescription), drasculaGames) {
_singleid = "drascula";
- _guioptions = Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD;
+ _guioptions = GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD);
}
virtual const char *getName() const {
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h
index 2b6aa0f291..6f98c50fdc 100644
--- a/engines/drascula/drascula.h
+++ b/engines/drascula/drascula.h
@@ -30,6 +30,7 @@
#include "common/file.h"
#include "common/hash-str.h"
#include "common/keyboard.h"
+#include "common/ptr.h"
#include "common/random.h"
#include "common/savefile.h"
#include "common/system.h"
@@ -264,15 +265,13 @@ private:
};
class TextResourceParser {
- Common::SeekableReadStream *_stream;
- DisposeAfterUse::Flag _dispose;
+ Common::DisposablePtr<Common::SeekableReadStream> _stream;
int _maxLen;
void getLine(char *buf);
public:
TextResourceParser(Common::SeekableReadStream *stream, DisposeAfterUse::Flag dispose);
- ~TextResourceParser();
void parseInt(int &result);
void parseString(char *result);
@@ -496,6 +495,8 @@ public:
void updateVolume(Audio::Mixer::SoundType soundType, int prevVolume);
void volumeControls();
bool saveLoadScreen();
+ void loadSaveNames();
+ void saveSaveNames();
void print_abc(const char *, int, int);
void delay(int ms);
bool confirmExit();
@@ -776,6 +777,7 @@ private:
RoomUpdate *_roomPreUpdates, *_roomUpdates;
RoomTalkAction *_roomActions;
TalkSequenceCommand *_talkSequences;
+ char _saveNames[10][23];
char **loadTexts(Common::File &in);
void freeTexts(char **ptr);
diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp
index eb36baed18..e3a97087c0 100644
--- a/engines/drascula/interface.cpp
+++ b/engines/drascula/interface.cpp
@@ -159,7 +159,7 @@ void DrasculaEngine::enterName() {
key = getScan();
if (key != 0) {
- if (key >= 0 && key <= 0xFF && isalpha(key))
+ if (key >= 0 && key <= 0xFF && isalpha(static_cast<unsigned char>(key)))
select2[v] = tolower(key);
else if ((key >= Common::KEYCODE_0 && key <= Common::KEYCODE_9) || key == Common::KEYCODE_SPACE)
select2[v] = key;
diff --git a/engines/drascula/resource.cpp b/engines/drascula/resource.cpp
index 6da43e7cba..95a95e3487 100644
--- a/engines/drascula/resource.cpp
+++ b/engines/drascula/resource.cpp
@@ -42,7 +42,7 @@ Common::SeekableReadStream *ArchiveMan::open(const Common::String &filename) {
}
TextResourceParser::TextResourceParser(Common::SeekableReadStream *stream, DisposeAfterUse::Flag dispose) :
- _stream(stream), _dispose(dispose) {
+ _stream(stream, dispose) {
// NOTE: strangely enough, the code before this refactoring used the size of
// the stream as a fixed maximum length for the parser. Using an updated
@@ -50,12 +50,6 @@ TextResourceParser::TextResourceParser(Common::SeekableReadStream *stream, Dispo
_maxLen = _stream->size();
}
-TextResourceParser::~TextResourceParser() {
- if (_dispose == DisposeAfterUse::YES) {
- delete _stream;
- }
-}
-
void TextResourceParser::getLine(char *buf) {
byte c;
char *b;
@@ -101,4 +95,3 @@ void TextResourceParser::parseString(char* result) {
} // End of namespace Drascula
-
diff --git a/engines/drascula/saveload.cpp b/engines/drascula/saveload.cpp
index 664a082eb4..c8622f3c92 100644
--- a/engines/drascula/saveload.cpp
+++ b/engines/drascula/saveload.cpp
@@ -26,20 +26,26 @@
namespace Drascula {
-bool DrasculaEngine::saveLoadScreen() {
- char names[10][23];
- Common::String file;
- int n, n2, num_sav = 0, y = 27;
+/**
+ * Loads the save names from the EPA index file.
+ *
+ * TODO: We should move the save names in their respective save files and get
+ * rid of this completely. A good example is the sword1 engine, which also used
+ * to have an index file for its saves, that has been removed.
+ * sword1 contains code that converts the old index-based saves into the new
+ * format without the index file, so we could apply this idea to drascula as
+ * well.
+ */
+void DrasculaEngine::loadSaveNames() {
Common::InSaveFile *sav;
-
- clearRoom();
-
Common::String fileEpa = Common::String::format("%s.epa", _targetName.c_str());
+
+ // Create and initialize the index file, if it doesn't exist
if (!(sav = _saveFileMan->openForLoading(fileEpa))) {
Common::OutSaveFile *epa;
if (!(epa = _saveFileMan->openForSaving(fileEpa)))
error("Can't open %s file", fileEpa.c_str());
- for (n = 0; n < NUM_SAVES; n++)
+ for (int n = 0; n < NUM_SAVES; n++)
epa->writeString("*\n");
epa->finalize();
delete epa;
@@ -47,11 +53,47 @@ bool DrasculaEngine::saveLoadScreen() {
error("Can't open %s file", fileEpa.c_str());
}
}
- for (n = 0; n < NUM_SAVES; n++) {
- strncpy(names[n], sav->readLine().c_str(), 23);
- names[n][22] = '\0'; // make sure the savegame name is 0-terminated
+
+ // Load the index file
+ for (int n = 0; n < NUM_SAVES; n++) {
+ strncpy(_saveNames[n], sav->readLine().c_str(), 23);
+ _saveNames[n][22] = '\0'; // make sure the savegame name is 0-terminated
}
delete sav;
+}
+
+/**
+ * Saves the save names into the EPA index file.
+ *
+ * TODO: We should move the save names in their respective save files and get
+ * rid of this completely. A good example is the sword1 engine, which also used
+ * to have an index file for its saves, that has been removed.
+ * sword1 contains code that converts the old index-based saves into the new
+ * format without the index file, so we could apply this idea to drascula as
+ * well.
+ */
+void DrasculaEngine::saveSaveNames() {
+ Common::OutSaveFile *tsav;
+ Common::String fileEpa = Common::String::format("%s.epa", _targetName.c_str());
+
+ if (!(tsav = _saveFileMan->openForSaving(fileEpa))) {
+ error("Can't open %s file", fileEpa.c_str());
+ }
+ for (int n = 0; n < NUM_SAVES; n++) {
+ tsav->writeString(_saveNames[n]);
+ tsav->writeString("\n");
+ }
+ tsav->finalize();
+ delete tsav;
+}
+
+bool DrasculaEngine::saveLoadScreen() {
+ Common::String file;
+ int n, n2, num_sav = 0, y = 27;
+
+ clearRoom();
+
+ loadSaveNames();
loadPic("savescr.alg", bgSurface, HALF_PAL);
@@ -66,7 +108,7 @@ bool DrasculaEngine::saveLoadScreen() {
y = 27;
copyBackground();
for (n = 0; n < NUM_SAVES; n++) {
- print_abc(names[n], 116, y);
+ print_abc(_saveNames[n], 116, y);
y = y + 9;
}
print_abc(select, 117, 15);
@@ -79,33 +121,24 @@ bool DrasculaEngine::saveLoadScreen() {
delay(50);
for (n = 0; n < NUM_SAVES; n++) {
if (mouseX > 115 && mouseY > y + (9 * n) && mouseX < 115 + 175 && mouseY < y + 10 + (9 * n)) {
- strcpy(select, names[n]);
+ strcpy(select, _saveNames[n]);
if (strcmp(select, "*"))
selectionMade = 1;
else {
enterName();
- strcpy(names[n], select);
+ strcpy(_saveNames[n], select);
if (selectionMade == 1) {
file = Common::String::format("%s%02d", _targetName.c_str(), n + 1);
saveGame(file.c_str());
- Common::OutSaveFile *tsav;
- if (!(tsav = _saveFileMan->openForSaving(fileEpa))) {
- error("Can't open %s file", fileEpa.c_str());
- }
- for (n = 0; n < NUM_SAVES; n++) {
- tsav->writeString(names[n]);
- tsav->writeString("\n");
- }
- tsav->finalize();
- delete tsav;
+ saveSaveNames();
}
}
print_abc(select, 117, 15);
y = 27;
for (n2 = 0; n2 < NUM_SAVES; n2++) {
- print_abc(names[n2], 116, y);
+ print_abc(_saveNames[n2], 116, y);
y = y + 9;
}
if (selectionMade == 1) {
@@ -117,27 +150,18 @@ bool DrasculaEngine::saveLoadScreen() {
if (mouseX > 117 && mouseY > 15 && mouseX < 295 && mouseY < 24 && selectionMade == 1) {
enterName();
- strcpy(names[num_sav], select);
+ strcpy(_saveNames[num_sav], select);
print_abc(select, 117, 15);
y = 27;
for (n2 = 0; n2 < NUM_SAVES; n2++) {
- print_abc(names[n2], 116, y);
+ print_abc(_saveNames[n2], 116, y);
y = y + 9;
}
if (selectionMade == 1) {
file = Common::String::format("%s%02d", _targetName.c_str(), n + 1);
saveGame(file.c_str());
- Common::OutSaveFile *tsav;
- if (!(tsav = _saveFileMan->openForSaving(fileEpa))) {
- error("Can't open %s file", fileEpa.c_str());
- }
- for (n = 0; n < NUM_SAVES; n++) {
- tsav->writeString(names[n]);
- tsav->writeString("\n");
- }
- tsav->finalize();
- delete tsav;
+ saveSaveNames();
}
}
@@ -149,16 +173,7 @@ bool DrasculaEngine::saveLoadScreen() {
break;
} else if (mouseX > 208 && mouseY > 123 && mouseX < 282 && mouseY < 149 && selectionMade == 1) {
saveGame(file.c_str());
- Common::OutSaveFile *tsav;
- if (!(tsav = _saveFileMan->openForSaving(fileEpa))) {
- error("Can't open %s file", fileEpa.c_str());
- }
- for (n = 0; n < NUM_SAVES; n++) {
- tsav->writeString(names[n]);
- tsav->writeString("\n");
- }
- tsav->finalize();
- delete tsav;
+ saveSaveNames();
} else if (mouseX > 168 && mouseY > 154 && mouseX < 242 && mouseY < 180)
break;
else if (selectionMade == 0) {
diff --git a/engines/drascula/sound.cpp b/engines/drascula/sound.cpp
index 4721d2d369..413a631118 100644
--- a/engines/drascula/sound.cpp
+++ b/engines/drascula/sound.cpp
@@ -23,7 +23,6 @@
#include "audio/audiostream.h"
#include "audio/mixer.h"
#include "audio/decoders/raw.h"
-#include "audio/decoders/voc.h"
#include "common/config-manager.h"
#include "common/textconsole.h"
diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp
new file mode 100644
index 0000000000..ffcad5b6bf
--- /dev/null
+++ b/engines/dreamweb/backdrop.cpp
@@ -0,0 +1,333 @@
+/* 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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamGen {
+
+void DreamGenContext::doblocks() {
+ uint16 dstOffset = data.word(kMapady) * 320 + data.word(kMapadx);
+ uint16 mapOffset = kMap + data.byte(kMapy) * kMapwidth + data.byte(kMapx);
+ ds = data.word(kMapdata);
+ const uint8 *mapData = ds.ptr(mapOffset, 0);
+ ds = data.word(kBackdrop);
+ const uint8 *blocks = ds.ptr(kBlocks, 0);
+ es = data.word(kWorkspace);
+ uint8 *dstBuffer = es.ptr(dstOffset, 0);
+
+ for (size_t i = 0; i < 10; ++i) {
+ for (size_t j = 0; j < 11; ++j) {
+ uint16 blockType = mapData[j];
+ if (blockType != 0) {
+ uint8 *dst = dstBuffer + i * 320 * 16 + j * 16;
+ const uint8 *block = blocks + blockType * 256;
+ for (size_t k = 0; k < 4; ++k) {
+ memcpy(dst, block, 16);
+ block += 16;
+ dst += 320;
+ }
+ for (size_t k = 0; k < 12; ++k) {
+ memcpy(dst, block, 16);
+ memset(dst + 16, 0xdf, 4);
+ block += 16;
+ dst += 320;
+ }
+ dst += 4;
+ ax = 0x0dfdf;
+ memset(dst, 0xdf, 16);
+ dst += 320;
+ memset(dst, 0xdf, 16);
+ dst += 320;
+ memset(dst, 0xdf, 16);
+ dst += 320;
+ memset(dst, 0xdf, 16);
+ }
+ }
+ mapData += kMapwidth;
+ }
+}
+
+uint8 DreamGenContext::getxad(const uint8 *setData, uint8 *result) {
+ uint8 v0 = setData[0];
+ uint8 v1 = setData[1];
+ uint8 v2 = setData[2];
+ if (v0 != 0)
+ return 0;
+ if (v1 < data.byte(kMapx))
+ return 0;
+ v1 -= data.byte(kMapx);
+ if (v1 >= 11)
+ return 0;
+ *result = (v1 << 4) | v2;
+ return 1;
+}
+
+uint8 DreamGenContext::getyad(const uint8 *setData, uint8 *result) {
+ uint8 v0 = setData[3];
+ uint8 v1 = setData[4];
+ if (v0 < data.byte(kMapy))
+ return 0;
+ v0 -= data.byte(kMapy);
+ if (v0 >= 10)
+ return 0;
+ *result = (v0 << 4) | v1;
+ return 1;
+}
+
+void DreamGenContext::getmapad() {
+ ch = getmapad((const uint8 *)es.ptr(si, 5));
+}
+
+uint8 DreamGenContext::getmapad(const uint8 *setData) {
+ uint8 xad, yad;
+ if (getxad(setData, &xad) == 0)
+ return 0;
+ data.word(kObjectx) = xad;
+ if (getyad(setData, &yad) == 0)
+ return 0;
+ data.word(kObjecty) = yad;
+ return 1;
+}
+
+void DreamGenContext::calcfrframe() {
+ uint8 width, height;
+ calcfrframe(&width, &height);
+ cl = width;
+ ch = height;
+}
+
+void DreamGenContext::calcfrframe(uint8* width, uint8* height) {
+ const Frame *frame = (const Frame *)segRef(data.word(kFrsegment)).ptr(data.word(kCurrentframe) * sizeof(Frame), sizeof(Frame));
+ data.word(kSavesource) = data.word(kFramesad) + frame->ptr();
+ data.byte(kSavesize+0) = frame->width;
+ data.byte(kSavesize+1) = frame->height;
+ data.word(kOffsetx) = frame->x;
+ data.word(kOffsety) = frame->y;
+ *width = frame->width;
+ *height = frame->height;
+}
+
+void DreamGenContext::finalframe() {
+ uint16 x, y;
+ finalframe(&x, &y);
+ di = x;
+ bx = y;
+}
+
+void DreamGenContext::finalframe(uint16 *x, uint16 *y) {
+ data.byte(kSavex) = (data.word(kObjectx) + data.word(kOffsetx)) & 0xff;
+ data.byte(kSavey) = (data.word(kObjecty) + data.word(kOffsety)) & 0xff;
+ *x = data.word(kObjectx);
+ *y = data.word(kObjecty);
+}
+
+void DreamGenContext::showallobs() {
+ data.word(kListpos) = kSetlist;
+ memset(segRef(data.word(kBuffers)).ptr(kSetlist, 0), 0xff, 128 * 5);
+ data.word(kFrsegment) = data.word(kSetframes);
+ data.word(kDataad) = kFramedata;
+ data.word(kFramesad) = kFrames;
+
+ const Frame *frames = (const Frame *)segRef(data.word(kFrsegment)).ptr(0, 0);
+ SetObject *setEntries = (SetObject *)segRef(data.word(kSetdat)).ptr(0, 128 * sizeof(SetObject));
+ for (size_t i = 0; i < 128; ++i) {
+ SetObject *setEntry = setEntries + i;
+ if (getmapad(setEntry->mapad) == 0)
+ continue;
+ uint8 currentFrame = setEntry->b18[0];
+ data.word(kCurrentframe) = currentFrame;
+ if (currentFrame == 0xff)
+ continue;
+ calcfrframe();
+ uint16 x, y;
+ finalframe(&x, &y);
+ setEntry->index = setEntry->b18[0];
+ if ((setEntry->type == 0) && (setEntry->priority != 5) && (setEntry->priority != 6)) {
+ x += data.word(kMapadx);
+ y += data.word(kMapady);
+ showframe(frames, x, y, data.word(kCurrentframe), 0);
+ } else
+ makebackob(setEntry);
+
+ ObjPos *objPos = (ObjPos *)segRef(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(ObjPos));
+ objPos->xMin = data.byte(kSavex);
+ objPos->yMin = data.byte(kSavey);
+ objPos->xMax = data.byte(kSavex) + data.byte(kSavesize+0);
+ objPos->yMax = data.byte(kSavey) + data.byte(kSavesize+1);
+ objPos->index = i;
+ data.word(kListpos) += sizeof(ObjPos);
+ }
+}
+
+void DreamGenContext::getdimension()
+{
+ uint8 mapXstart, mapYstart;
+ uint8 mapXsize, mapYsize;
+ getdimension(&mapXstart, &mapYstart, &mapXsize, &mapYsize);
+ cl = mapXstart;
+ ch = mapYstart;
+ dl = mapXsize;
+ dh = mapYsize;
+}
+
+bool DreamGenContext::addalong(const uint8 *mapFlags) {
+ for (size_t i = 0; i < 11; ++i) {
+ if (mapFlags[3 * i] != 0)
+ return true;
+ }
+ return false;
+}
+
+bool DreamGenContext::addlength(const uint8 *mapFlags) {
+ for (size_t i = 0; i < 10; ++i) {
+ if (mapFlags[3 * 11 * i] != 0)
+ return true;
+ }
+ return false;
+}
+
+void DreamGenContext::getdimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize) {
+ const uint8 *mapFlags = segRef(data.word(kBuffers)).ptr(kMapflags, 0);
+
+ uint8 yStart = 0;
+ while (! addalong(mapFlags + 3 * 11 * yStart))
+ ++yStart;
+
+ uint8 xStart = 0;
+ while (! addlength(mapFlags + 3 * xStart))
+ ++xStart;
+
+ uint8 yEnd = 10;
+ while (! addalong(mapFlags + 3 * 11 * (yEnd - 1)))
+ --yEnd;
+
+ uint8 xEnd = 11;
+ while (! addlength(mapFlags + 3 * (xEnd - 1)))
+ --xEnd;
+
+ *mapXstart = xStart;
+ *mapYstart = yStart;
+ *mapXsize = xEnd - xStart;
+ *mapYsize = yEnd - yStart;
+ data.word(kMapxstart) = xStart << 4;
+ data.word(kMapystart) = yStart << 4;
+ data.byte(kMapxsize) = *mapXsize << 4;
+ data.byte(kMapysize) = *mapYsize << 4;
+}
+
+void DreamGenContext::calcmapad() {
+ uint8 mapXstart, mapYstart;
+ uint8 mapXsize, mapYsize;
+ getdimension(&mapXstart, &mapYstart, &mapXsize, &mapYsize);
+ data.word(kMapadx) = data.word(kMapoffsetx) - 8 * (mapXsize + 2 * mapXstart - 11);
+ data.word(kMapady) = data.word(kMapoffsety) - 8 * (mapYsize + 2 * mapYstart - 10);
+}
+
+void DreamGenContext::showallfree() {
+ data.word(kListpos) = kFreelist;
+ ObjPos *listPos = (ObjPos *)segRef(data.word(kBuffers)).ptr(kFreelist, 80 * sizeof(ObjPos));
+ memset(listPos, 0xff, 80 * sizeof(ObjPos));
+
+ data.word(kFrsegment) = data.word(kFreeframes);
+ data.word(kDataad) = kFrframedata;
+ data.word(kFramesad) = kFrframes;
+ data.byte(kCurrentfree) = 0;
+ const DynObject *freeObjects = (const DynObject *)segRef(data.word(kFreedat)).ptr(0, 0);
+ for(size_t i = 0; i < 80; ++i) {
+ uint8 mapad = getmapad(freeObjects[i].mapad);
+ if (mapad != 0) {
+ data.word(kCurrentframe) = 3 * data.byte(kCurrentfree);
+ uint8 width, height;
+ calcfrframe(&width, &height);
+ uint16 x, y;
+ finalframe(&x, &y);
+ if ((width != 0) || (height != 0)) {
+ x += data.word(kMapadx);
+ y += data.word(kMapady);
+ showframe((Frame *)segRef(data.word(kFrsegment)).ptr(0, 0), x, y, data.word(kCurrentframe) & 0xff, 0);
+ ObjPos *objPos = (ObjPos *)segRef(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(ObjPos));
+ objPos->xMin = data.byte(kSavex);
+ objPos->yMin = data.byte(kSavey);
+ objPos->xMax = data.byte(kSavex) + data.byte(kSavesize+0);
+ objPos->yMax = data.byte(kSavey) + data.byte(kSavesize+1);
+ objPos->index = i;
+ data.word(kListpos) += sizeof(ObjPos);
+ }
+ }
+
+ ++data.byte(kCurrentfree);
+ }
+}
+
+void DreamGenContext::drawflags() {
+ uint8 *mapFlags = segRef(data.word(kBuffers)).ptr(kMapflags, 0);
+ const uint8 *mapData = segRef(data.word(kMapdata)).ptr(kMap + data.byte(kMapy) * kMapwidth + data.byte(kMapx), 0);
+ const uint8 *backdropFlags = segRef(data.word(kBackdrop)).ptr(kFlags, 0);
+
+ for (size_t i = 0; i < 10; ++i) {
+ for (size_t j = 0; j < 11; ++j) {
+ uint8 tile = mapData[i * kMapwidth + j];
+ mapFlags[0] = backdropFlags[2 * tile + 0];
+ mapFlags[1] = backdropFlags[2 * tile + 1];
+ mapFlags[2] = tile;
+ mapFlags += 3;
+ }
+ }
+}
+
+void DreamGenContext::showallex() {
+ data.word(kListpos) = kExlist;
+ memset(segRef(data.word(kBuffers)).ptr(kExlist, 100 * 5), 0xff, 100 * 5);
+
+ data.word(kFrsegment) = data.word(kExtras);
+ data.word(kDataad) = kExframedata;
+ data.word(kFramesad) = kExframes;
+ data.byte(kCurrentex) = 0;
+ DynObject *objects = (DynObject *)segRef(data.word(kExtras)).ptr(kExdata, sizeof(DynObject));
+ for (size_t i = 0; i < 100; ++i, ++data.byte(kCurrentex)) {
+ DynObject *object = objects + i;
+ if (object->mapad[0] == 0xff)
+ continue;
+ if (object->currentLocation != data.byte(kReallocation))
+ continue;
+ if (getmapad(object->mapad) == 0)
+ continue;
+ data.word(kCurrentframe) = 3 * data.byte(kCurrentex);
+ uint8 width, height;
+ calcfrframe(&width, &height);
+ uint16 x, y;
+ finalframe(&x, &y);
+ if ((width != 0) || (height != 0)) {
+ showframe((Frame *)segRef(data.word(kFrsegment)).ptr(0, 0), x + data.word(kMapadx), y + data.word(kMapady), data.word(kCurrentframe) & 0xff, 0);
+ ObjPos *objPos = (ObjPos *)segRef(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(ObjPos));
+ objPos->xMin = data.byte(kSavex);
+ objPos->yMin = data.byte(kSavey);
+ objPos->xMax = data.byte(kSavesize + 0) + data.byte(kSavex);
+ objPos->yMax = data.byte(kSavesize + 1) + data.byte(kSavey);
+ objPos->index = i;
+ data.word(kListpos) += sizeof(ObjPos);
+ }
+ }
+}
+
+} /*namespace dreamgen */
+
diff --git a/engines/dreamweb/console.cpp b/engines/dreamweb/console.cpp
index e004746d8a..d415089a48 100644
--- a/engines/dreamweb/console.cpp
+++ b/engines/dreamweb/console.cpp
@@ -18,9 +18,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * $URL: https://svn.scummvm.org:4444/svn/dreamweb/console.cpp $
- * $Id: console.cpp 70 2011-01-26 05:36:55Z digitall $
- *
*/
#include "dreamweb/console.h"
diff --git a/engines/dreamweb/console.h b/engines/dreamweb/console.h
index 58c8467b34..a90794e94e 100644
--- a/engines/dreamweb/console.h
+++ b/engines/dreamweb/console.h
@@ -18,9 +18,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * $URL: https://svn.scummvm.org:4444/svn/dreamweb/console.h $
- * $Id: console.h 70 2011-01-26 05:36:55Z digitall $
- *
*/
#ifndef DREAMWEB_CONSOLE_H
diff --git a/engines/dreamweb/detection.cpp b/engines/dreamweb/detection.cpp
index 18a2f899a8..a3f311c304 100644
--- a/engines/dreamweb/detection.cpp
+++ b/engines/dreamweb/detection.cpp
@@ -18,9 +18,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * $URL: https://svn.scummvm.org:4444/svn/dreamweb/detection.cpp $
- * $Id: detection.cpp 3 2010-09-16 19:32:18Z megath $
- *
*/
#include "base/plugins.h"
@@ -30,16 +27,6 @@
#include "dreamweb/dreamweb.h"
-#include "engines/advancedDetector.h"
-
-namespace DreamWeb {
-
-struct DreamWebGameDescription {
- ADGameDescription desc;
-};
-
-} // End of namespace DreamWeb
-
static const PlainGameDescriptor dreamWebGames[] = {
{ "dreamweb", "DreamWeb" },
{ 0, 0 }
@@ -53,7 +40,7 @@ public:
AdvancedMetaEngine(DreamWeb::gameDescriptions,
sizeof(DreamWeb::DreamWebGameDescription), dreamWebGames) {
_singleid = "dreamweb";
- _guioptions = Common::GUIO_NOMIDI;
+ _guioptions = GUIO1(GUIO_NOMIDI);
}
virtual const char *getName() const {
@@ -74,8 +61,8 @@ public:
bool DreamWebMetaEngine::hasFeature(MetaEngineFeature f) const {
switch(f) {
case kSupportsListSaves:
- //case kSupportsLoadingDuringStartup:
- //case kSupportsDeleteSave:
+ case kSupportsLoadingDuringStartup:
+ case kSupportsDeleteSave:
return true;
default:
return false;
@@ -86,6 +73,8 @@ bool DreamWeb::DreamWebEngine::hasFeature(EngineFeature f) const {
switch(f) {
case kSupportsRTL:
return true;
+ case kSupportsSubtitleOptions:
+ return _gameDescription->desc.flags & ADGF_CD;
default:
return false;
}
@@ -116,14 +105,15 @@ SaveStateList DreamWebMetaEngine::listSaves(const char *target) const {
stream->read(name, sizeof(name) - 1);
delete stream;
- SaveStateDescriptor sd(i, name);
+ int slotNum = atoi(file.c_str() + file.size() - 2);
+ SaveStateDescriptor sd(slotNum, name);
saveList.push_back(sd);
}
return saveList;
}
-int DreamWebMetaEngine::getMaximumSaveSlot() const { return 6; }
+int DreamWebMetaEngine::getMaximumSaveSlot() const { return 99; }
void DreamWebMetaEngine::removeSaveState(const char *target, int slot) const {
}
diff --git a/engines/dreamweb/detection_tables.h b/engines/dreamweb/detection_tables.h
index f32b8de6b6..0902236916 100644
--- a/engines/dreamweb/detection_tables.h
+++ b/engines/dreamweb/detection_tables.h
@@ -18,9 +18,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * $URL: https://svn.scummvm.org:4444/svn/dreamweb/detection_tables.h $
- * $Id: detection_tables.h 66 2010-11-07 08:31:21Z eriktorbjorn $
- *
*/
#ifndef DREAMWEB_DETECTION_TABLES_H
@@ -28,9 +25,8 @@
namespace DreamWeb {
-using Common::GUIO_NONE;
-
static const DreamWebGameDescription gameDescriptions[] = {
+ // International floppy release
{
{
"dreamweb",
@@ -43,7 +39,7 @@ static const DreamWebGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -60,7 +56,7 @@ static const DreamWebGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_CD | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
},
@@ -77,7 +73,41 @@ static const DreamWebGameDescription gameDescriptions[] = {
Common::EN_USA,
Common::kPlatformPC,
ADGF_CD,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ },
+
+ // French CD release
+ {
+ {
+ "dreamweb",
+ "CD",
+ {
+ {"dreamwfr.r00", 0, "e354582a8564faf5c515df92f207e8d1", 154657},
+ {"dreamwfr.r02", 0, "57f3f08d5aefd04184eac76927eced80", 200575},
+ AD_LISTEND
+ },
+ Common::FR_FRA,
+ Common::kPlatformPC,
+ ADGF_CD | ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+ },
+
+ // German floppy release
+ {
+ {
+ "dreamweb",
+ "",
+ {
+ {"dreamweb.r00", 0, "9960dc3baddabc6ad2a6fd75292b149c", 155886},
+ {"dreamweb.r02", 0, "48e1f42a53402f963ca2d1ed969f4084", 212823},
+ AD_LISTEND
+ },
+ Common::DE_DEU,
+ Common::kPlatformPC,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
},
},
@@ -94,7 +124,58 @@ static const DreamWebGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_CD | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ },
+
+ // Spanish floppy release
+ {
+ {
+ "dreamweb",
+ "",
+ {
+ {"dreamweb.r00", 0, "2df07174321de39c4f17c9ff654b268a", 153608},
+ {"dreamweb.r02", 0, "f97d435ad5da08fb1bcf6ea3dd6e0b9e", 199499},
+ AD_LISTEND
+ },
+ Common::ES_ESP,
+ Common::kPlatformPC,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+ },
+
+ // Spanish CD release
+ {
+ {
+ "dreamweb",
+ "CD",
+ {
+ {"dreamwsp.r00", 0, "2df07174321de39c4f17c9ff654b268a", 153608},
+ {"dreamwsp.r02", 0, "577d435ad5da08fb1bcf6ea3dd6e0b9e", 199499},
+ AD_LISTEND
+ },
+ Common::ES_ESP,
+ Common::kPlatformPC,
+ ADGF_CD | ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+ },
+
+ // Italian floppy release
+ {
+ {
+ "dreamweb",
+ "",
+ {
+ {"dreamweb.r00", 0, "66dcab08354232f423c590156335f819", 155448},
+ {"dreamweb.r02", 0, "87a026e9f80ed4f94169381f871ee305", 199676},
+ AD_LISTEND
+ },
+ Common::IT_ITA,
+ Common::kPlatformPC,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
},
},
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 462ae596f8..8f4b4cea21 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -1,5 +1,29 @@
/* PLEASE DO NOT MODIFY THIS FILE. ALL CHANGES WILL BE LOST! LOOK FOR README FOR DETAILS */
+/* 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.
+ *
+ */
+
+
+
#include "dreamgen.h"
namespace DreamGen {
@@ -1670,116 +1694,6 @@ notendtelly:
showgamereel();
}
-void DreamGenContext::madman() {
- STACK_CHECK;
- data.word(kWatchingtime) = 2;
- checkspeed();
- if (!flags.z())
- goto nomadspeed;
- ax = es.word(bx+3);
- _cmp(ax, 364);
- if (!flags.c())
- goto ryansded;
- _cmp(ax, 10);
- if (!flags.z())
- goto notfirstmad;
- push(es);
- push(bx);
- push(ax);
- dx = 2247;
- loadtemptext();
- ax = pop();
- bx = pop();
- es = pop();
- data.byte(kCombatcount) = -1;
- data.byte(kSpeechcount) = 0;
-notfirstmad:
- _inc(ax);
- _cmp(ax, 294);
- if (flags.z())
- goto madmanspoken;
- _cmp(ax, 66);
- if (!flags.z())
- goto nomadspeak;
- _inc(data.byte(kCombatcount));
- push(es);
- push(bx);
- madmantext();
- bx = pop();
- es = pop();
- ax = 53;
- _cmp(data.byte(kCombatcount), 64);
- if (flags.c())
- goto nomadspeak;
- _cmp(data.byte(kCombatcount), 70);
- if (flags.z())
- goto killryan;
- _cmp(data.byte(kLastweapon), 8);
- if (!flags.z())
- goto nomadspeak;
- data.byte(kCombatcount) = 72;
- data.byte(kLastweapon) = -1;
- data.byte(kMadmanflag) = 1;
- ax = 67;
- goto nomadspeak;
-killryan:
- ax = 310;
-nomadspeak:
- es.word(bx+3) = ax;
-nomadspeed:
- showgamereel();
- al = data.byte(kMapx);
- es.byte(bx+1) = al;
- madmode();
- return;
-madmanspoken:
- _cmp(data.byte(kWongame), 1);
- if (flags.z())
- return /* (alreadywon) */;
- data.byte(kWongame) = 1;
- push(es);
- push(bx);
- getridoftemptext();
- bx = pop();
- es = pop();
- return;
-ryansded:
- data.byte(kMandead) = 2;
- showgamereel();
-}
-
-void DreamGenContext::madmantext() {
- STACK_CHECK;
- _cmp(data.byte(kSpeechcount), 63);
- if (!flags.c())
- return /* (nomadtext) */;
- _cmp(data.byte(kCh1playing), 255);
- if (!flags.z())
- return /* (nomadtext) */;
- al = data.byte(kSpeechcount);
- _inc(data.byte(kSpeechcount));
- _add(al, 47);
- bl = 72;
- bh = 80;
- cx = 90;
- dx = 1;
- ah = 82;
- setuptimedtemp();
-}
-
-void DreamGenContext::madmode() {
- STACK_CHECK;
- data.word(kWatchingtime) = 2;
- data.byte(kPointermode) = 0;
- _cmp(data.byte(kCombatcount), 65);
- if (flags.c())
- return /* (iswatchmad) */;
- _cmp(data.byte(kCombatcount), 70);
- if (!flags.c())
- return /* (iswatchmad) */;
- data.byte(kPointermode) = 2;
-}
-
void DreamGenContext::priesttext() {
STACK_CHECK;
_cmp(es.word(bx+3), 2);
@@ -2118,40 +2032,6 @@ gottrainframe:
showgamereel();
}
-void DreamGenContext::addtopeoplelist() {
- STACK_CHECK;
- push(es);
- push(bx);
- push(bx);
- cl = es.byte(bx+7);
- ax = es.word(bx+3);
- bx = data.word(kListpos);
- es = data.word(kBuffers);
- es.word(bx) = ax;
- ax = pop();
- es.word(bx+2) = ax;
- es.byte(bx+4) = cl;
- bx = pop();
- es = pop();
- _add(data.word(kListpos), 5);
-}
-
-void DreamGenContext::showgamereel() {
- STACK_CHECK;
- ax = es.word(bx+3);
- _cmp(ax, 512);
- if (!flags.c())
- return /* (noshow) */;
- data.word(kReelpointer) = ax;
- push(es);
- push(bx);
- plotreel();
- bx = pop();
- es = pop();
- ax = data.word(kReelpointer);
- es.word(bx+3) = ax;
-}
-
void DreamGenContext::checkspeed() {
STACK_CHECK;
_cmp(data.byte(kLastweapon), -1);
@@ -2170,431 +2050,6 @@ forcenext:
_cmp(al, al);
}
-void DreamGenContext::clearsprites() {
- STACK_CHECK;
- es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
- al = 255;
- cx = (32)*16;
- _stosb(cx, true);
-}
-
-void DreamGenContext::makesprite() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
-_tmp17:
- _cmp(es.byte(bx+15), 255);
- if (flags.z())
- goto _tmp17a;
- _add(bx, (32));
- goto _tmp17;
-_tmp17a:
- es.word(bx) = cx;
- es.word(bx+10) = si;
- es.word(bx+6) = dx;
- es.word(bx+8) = di;
- es.word(bx+2) = 0x0ffff;
- es.byte(bx+15) = 0;
- es.byte(bx+18) = 0;
-}
-
-void DreamGenContext::delsprite() {
- STACK_CHECK;
- di = bx;
- cx = (32);
- al = 255;
- _stosb(cx, true);
-}
-
-void DreamGenContext::spriteupdate() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
- al = data.byte(kRyanon);
- es.byte(bx+31) = al;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
- cx = 16;
-_tmp18:
- push(cx);
- push(bx);
- ax = es.word(bx);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- goto _tmp18a;
- push(es);
- push(ds);
- cx = es.word(bx+2);
- es.word(bx+24) = cx;
- __dispatch_call(ax);
- ds = pop();
- es = pop();
-_tmp18a:
- bx = pop();
- cx = pop();
- _cmp(data.byte(kNowinnewroom), 1);
- if (flags.z())
- return /* ($18b) */;
- _add(bx, (32));
- if (--cx)
- goto _tmp18;
-}
-
-void DreamGenContext::printsprites() {
- STACK_CHECK;
- es = data.word(kBuffers);
- cx = 0;
-priorityloop:
- push(cx);
- data.byte(kPriority) = cl;
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
- cx = 16;
-prtspriteloop:
- push(cx);
- push(bx);
- ax = es.word(bx);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- goto skipsprite;
- al = data.byte(kPriority);
- _cmp(al, es.byte(bx+23));
- if (!flags.z())
- goto skipsprite;
- _cmp(es.byte(bx+31), 1);
- if (flags.z())
- goto skipsprite;
- printasprite();
-skipsprite:
- bx = pop();
- cx = pop();
- _add(bx, (32));
- if (--cx)
- goto prtspriteloop;
- cx = pop();
- _inc(cx);
- _cmp(cx, 7);
- if (!flags.z())
- goto priorityloop;
-}
-
-void DreamGenContext::printasprite() {
- STACK_CHECK;
- push(es);
- push(bx);
- si = bx;
- ds = es.word(si+6);
- al = es.byte(si+11);
- ah = 0;
- _cmp(al, 220);
- if (flags.c())
- goto notnegative1;
- ah = 255;
-notnegative1:
- bx = ax;
- _add(bx, data.word(kMapady));
- al = es.byte(si+10);
- ah = 0;
- _cmp(al, 220);
- if (flags.c())
- goto notnegative2;
- ah = 255;
-notnegative2:
- di = ax;
- _add(di, data.word(kMapadx));
- al = es.byte(si+15);
- ah = 0;
- _cmp(es.byte(si+30), 0);
- if (flags.z())
- goto steadyframe;
- ah = 8;
-steadyframe:
- _cmp(data.byte(kPriority), 6);
- if (!flags.z())
- goto notquickp;
-notquickp:
- showframe();
- bx = pop();
- es = pop();
-}
-
-void DreamGenContext::checkone() {
- STACK_CHECK;
- push(cx);
- al = ch;
- ah = 0;
- cl = 4;
- _shr(ax, cl);
- dl = al;
- cx = pop();
- al = cl;
- ah = 0;
- cl = 4;
- _shr(ax, cl);
- ah = dl;
- push(ax);
- ch = 0;
- cl = al;
- push(cx);
- al = ah;
- ah = 0;
- cx = 11;
- _mul(cx);
- cx = pop();
- _add(ax, cx);
- cx = 3;
- _mul(cx);
- si = ax;
- ds = data.word(kBuffers);
- _add(si, (0+(180*10)+32+60+(32*32)));
- _lodsw();
- cx = ax;
- _lodsb();
- dx = pop();
-}
-
-void DreamGenContext::findsource() {
- STACK_CHECK;
- ax = data.word(kCurrentframe);
- _cmp(ax, 160);
- if (!flags.c())
- goto over1000;
- ds = data.word(kReel1);
- data.word(kTakeoff) = 0;
- return;
-over1000:
- _cmp(ax, 320);
- if (!flags.c())
- goto over1001;
- ds = data.word(kReel2);
- data.word(kTakeoff) = 160;
- return;
-over1001:
- ds = data.word(kReel3);
- data.word(kTakeoff) = 320;
-}
-
-void DreamGenContext::initman() {
- STACK_CHECK;
- al = data.byte(kRyanx);
- ah = data.byte(kRyany);
- si = ax;
- cx = 49464;
- dx = data.word(kMainsprites);
- di = 0;
- makesprite();
- es.byte(bx+23) = 4;
- es.byte(bx+22) = 0;
- es.byte(bx+29) = 0;
-}
-
-void DreamGenContext::mainman() {
- STACK_CHECK;
- _cmp(data.byte(kResetmanxy), 1);
- if (!flags.z())
- goto notinnewroom;
- data.byte(kResetmanxy) = 0;
- al = data.byte(kRyanx);
- ah = data.byte(kRyany);
- es.word(bx+10) = ax;
- es.byte(bx+29) = 0;
- goto executewalk;
-notinnewroom:
- _dec(es.byte(bx+22));
- _cmp(es.byte(bx+22), -1);
- if (flags.z())
- goto executewalk;
- return;
-executewalk:
- es.byte(bx+22) = 0;
- al = data.byte(kTurntoface);
- _cmp(al, data.byte(kFacing));
- if (flags.z())
- goto facingok;
- aboutturn();
- goto notwalk;
-facingok:
- _cmp(data.byte(kTurndirection), 0);
- if (flags.z())
- goto alreadyturned;
- _cmp(data.byte(kLinepointer), 254);
- if (!flags.z())
- goto alreadyturned;
- data.byte(kReasseschanges) = 1;
- al = data.byte(kFacing);
- _cmp(al, data.byte(kLeavedirection));
- if (!flags.z())
- goto alreadyturned;
- checkforexit();
-alreadyturned:
- data.byte(kTurndirection) = 0;
- _cmp(data.byte(kLinepointer), 254);
- if (!flags.z())
- goto walkman;
- es.byte(bx+29) = 0;
- goto notwalk;
-walkman:
- al = es.byte(bx+29);
- _inc(al);
- _cmp(al, 11);
- if (!flags.z())
- goto notanimend1;
- al = 1;
-notanimend1:
- es.byte(bx+29) = al;
- walking();
- _cmp(data.byte(kLinepointer), 254);
- if (flags.z())
- goto afterwalk;
- al = data.byte(kFacing);
- _and(al, 1);
- if (flags.z())
- goto isdouble;
- al = es.byte(bx+29);
- _cmp(al, 2);
- if (flags.z())
- goto afterwalk;
- _cmp(al, 7);
- if (flags.z())
- goto afterwalk;
-isdouble:
- walking();
-afterwalk:
- _cmp(data.byte(kLinepointer), 254);
- if (!flags.z())
- goto notwalk;
- al = data.byte(kTurntoface);
- _cmp(al, data.byte(kFacing));
- if (!flags.z())
- goto notwalk;
- data.byte(kReasseschanges) = 1;
- al = data.byte(kFacing);
- _cmp(al, data.byte(kLeavedirection));
- if (!flags.z())
- goto notwalk;
- checkforexit();
-notwalk:
- al = data.byte(kFacing);
- ah = 0;
- di = 1105;
- _add(di, ax);
- al = cs.byte(di);
- _add(al, es.byte(bx+29));
- es.byte(bx+15) = al;
- ax = es.word(bx+10);
- data.byte(kRyanx) = al;
- data.byte(kRyany) = ah;
-}
-
-void DreamGenContext::aboutturn() {
- STACK_CHECK;
- _cmp(data.byte(kTurndirection), 1);
- if (flags.z())
- goto incdir;
- _cmp(data.byte(kTurndirection), -1);
- if (flags.z())
- goto decdir;
- al = data.byte(kFacing);
- _sub(al, data.byte(kTurntoface));
- if (!flags.c())
- goto higher;
- _neg(al);
- _cmp(al, 4);
- if (!flags.c())
- goto decdir;
- goto incdir;
-higher:
- _cmp(al, 4);
- if (!flags.c())
- goto incdir;
- goto decdir;
-incdir:
- data.byte(kTurndirection) = 1;
- al = data.byte(kFacing);
- _inc(al);
- _and(al, 7);
- data.byte(kFacing) = al;
- es.byte(bx+29) = 0;
- return;
-decdir:
- data.byte(kTurndirection) = -1;
- al = data.byte(kFacing);
- _dec(al);
- _and(al, 7);
- data.byte(kFacing) = al;
- es.byte(bx+29) = 0;
-}
-
-void DreamGenContext::walking() {
- STACK_CHECK;
- _cmp(data.byte(kLinedirection), 0);
- if (flags.z())
- goto normalwalk;
- al = data.byte(kLinepointer);
- _dec(al);
- data.byte(kLinepointer) = al;
- _cmp(al, 200);
- if (!flags.c())
- goto endofline;
- goto continuewalk;
-normalwalk:
- al = data.byte(kLinepointer);
- _inc(al);
- data.byte(kLinepointer) = al;
- _cmp(al, data.byte(kLinelength));
- if (!flags.c())
- goto endofline;
-continuewalk:
- ah = 0;
- _add(ax, ax);
- push(es);
- push(bx);
- dx = data;
- es = dx;
- bx = 8173;
- _add(bx, ax);
- ax = es.word(bx);
- bx = pop();
- es = pop();
- es.word(bx+10) = ax;
- return;
-endofline:
- data.byte(kLinepointer) = 254;
- al = data.byte(kDestination);
- data.byte(kManspath) = al;
- _cmp(al, data.byte(kFinaldest));
- if (flags.z())
- goto finishedwalk;
- al = data.byte(kFinaldest);
- data.byte(kDestination) = al;
- push(es);
- push(bx);
- autosetwalk();
- bx = pop();
- es = pop();
- return;
-finishedwalk:
- facerightway();
-}
-
-void DreamGenContext::facerightway() {
- STACK_CHECK;
- push(es);
- push(bx);
- getroomspaths();
- al = data.byte(kManspath);
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = es.byte(bx+7);
- data.byte(kTurntoface) = al;
- data.byte(kLeavedirection) = al;
- bx = pop();
- es = pop();
-}
-
void DreamGenContext::checkforexit() {
STACK_CHECK;
cl = data.byte(kRyanx);
@@ -2810,8 +2265,8 @@ forgotone:
void DreamGenContext::initrain() {
STACK_CHECK;
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24));
- bx = 1113;
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30));
+ bx = offset_rainlocations;
checkmorerain:
al = cs.byte(bx);
_cmp(al, 255);
@@ -2930,263 +2385,6 @@ foundlineend:
goto lookforlinestart;
}
-void DreamGenContext::getblockofpixel() {
- STACK_CHECK;
- push(cx);
- push(es);
- push(di);
- ax = data.word(kMapxstart);
- _add(cl, al);
- ax = data.word(kMapystart);
- _add(ch, al);
- checkone();
- _and(cl, 1);
- if (!flags.z())
- goto failrain;
- di = pop();
- es = pop();
- cx = pop();
- return;
-failrain:
- di = pop();
- es = pop();
- cx = pop();
- al = 0;
-}
-
-void DreamGenContext::showrain() {
- STACK_CHECK;
- ds = data.word(kMainsprites);
- si = 6*58;
- ax = ds.word(si+2);
- si = ax;
- _add(si, 2080);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24));
- es = data.word(kBuffers);
- _cmp(es.byte(bx), 255);
- if (flags.z())
- return /* (nothunder) */;
-morerain:
- es = data.word(kBuffers);
- _cmp(es.byte(bx), 255);
- if (flags.z())
- goto finishrain;
- al = es.byte(bx+1);
- ah = 0;
- _add(ax, data.word(kMapady));
- _add(ax, data.word(kMapystart));
- cx = 320;
- _mul(cx);
- cl = es.byte(bx);
- ch = 0;
- _add(ax, cx);
- _add(ax, data.word(kMapadx));
- _add(ax, data.word(kMapxstart));
- di = ax;
- cl = es.byte(bx+2);
- ch = 0;
- ax = es.word(bx+3);
- dl = es.byte(bx+5);
- dh = 0;
- _sub(ax, dx);
- _and(ax, 511);
- es.word(bx+3) = ax;
- _add(bx, 6);
- push(si);
- _add(si, ax);
- es = data.word(kWorkspace);
- ah = 0;
- dx = 320-2;
-rainloop:
- _lodsb();
- _cmp(al, ah);
- if (flags.z())
- goto noplot;
- _stosb();
- _add(di, dx);
- if (--cx)
- goto rainloop;
- si = pop();
- goto morerain;
-noplot:
- _add(di, 320-1);
- if (--cx)
- goto rainloop;
- si = pop();
- goto morerain;
-finishrain:
- _cmp(data.word(kCh1blockstocopy), 0);
- if (!flags.z())
- return /* (nothunder) */;
- _cmp(data.byte(kReallocation), 2);
- if (!flags.z())
- goto notlouisthund;
- _cmp(data.byte(kBeenmugged), 1);
- if (!flags.z())
- return /* (nothunder) */;
-notlouisthund:
- _cmp(data.byte(kReallocation), 55);
- if (flags.z())
- return /* (nothunder) */;
- randomnum1();
- _cmp(al, 1);
- if (!flags.c())
- return /* (nothunder) */;
- al = 7;
- _cmp(data.byte(kCh0playing), 6);
- if (flags.z())
- goto isthunder1;
- al = 4;
-isthunder1:
- playchannel1();
-}
-
-void DreamGenContext::backobject() {
- STACK_CHECK;
- ds = data.word(kSetdat);
- di = es.word(bx+20);
- al = es.byte(bx+18);
- _cmp(al, 0);
- if (flags.z())
- goto _tmp48z;
- _dec(al);
- es.byte(bx+18) = al;
- return /* (finishback) */;
-_tmp48z:
- al = ds.byte(di+7);
- es.byte(bx+18) = al;
- al = ds.byte(di+8);
- _cmp(al, 6);
- if (!flags.z())
- goto notwidedoor;
- widedoor();
- return /* (finishback) */;
-notwidedoor:
- _cmp(al, 5);
- if (!flags.z())
- goto notrandom;
- random();
- return /* (finishback) */;
-notrandom:
- _cmp(al, 4);
- if (!flags.z())
- goto notlockdoor;
- lockeddoorway();
- return /* (finishback) */;
-notlockdoor:
- _cmp(al, 3);
- if (!flags.z())
- goto notlift;
- liftsprite();
- return /* (finishback) */;
-notlift:
- _cmp(al, 2);
- if (!flags.z())
- goto notdoor;
- doorway();
- return /* (finishback) */;
-notdoor:
- _cmp(al, 1);
- if (!flags.z())
- goto steadyob;
- constant();
- return /* (finishback) */;
-steadyob:
- steady();
-}
-
-void DreamGenContext::liftsprite() {
- STACK_CHECK;
- al = data.byte(kLiftflag);
- _cmp(al, 0);
- if (flags.z())
- goto liftclosed;
- _cmp(al, 1);
- if (flags.z())
- goto liftopen;
- _cmp(al, 3);
- if (flags.z())
- goto openlift;
- al = es.byte(bx+19);
- _cmp(al, 0);
- if (flags.z())
- goto finishclose;
- _dec(al);
- _cmp(al, 11);
- if (!flags.z())
- goto pokelift;
- push(ax);
- al = 3;
- liftnoise();
- ax = pop();
- goto pokelift;
-finishclose:
- data.byte(kLiftflag) = 0;
- return;
-openlift:
- al = es.byte(bx+19);
- _cmp(al, 12);
- if (flags.z())
- goto endoflist;
- _inc(al);
- _cmp(al, 1);
- if (!flags.z())
- goto pokelift;
- push(ax);
- al = 2;
- liftnoise();
- ax = pop();
-pokelift:
- es.byte(bx+19) = al;
- ah = 0;
- push(di);
- _add(di, ax);
- al = ds.byte(di+18);
- di = pop();
- es.byte(bx+15) = al;
- ds.byte(di+17) = al;
- return;
-endoflist:
- data.byte(kLiftflag) = 1;
- return;
-liftopen:
- al = data.byte(kLiftpath);
- push(es);
- push(bx);
- turnpathon();
- bx = pop();
- es = pop();
- _cmp(data.byte(kCounttoclose), 0);
- if (flags.z())
- goto nocountclose;
- _dec(data.byte(kCounttoclose));
- _cmp(data.byte(kCounttoclose), 0);
- if (!flags.z())
- goto nocountclose;
- data.byte(kLiftflag) = 2;
-nocountclose:
- al = 12;
- goto pokelift;
-liftclosed:
- al = data.byte(kLiftpath);
- push(es);
- push(bx);
- turnpathoff();
- bx = pop();
- es = pop();
- _cmp(data.byte(kCounttoopen), 0);
- if (flags.z())
- goto nocountopen;
- _dec(data.byte(kCounttoopen));
- _cmp(data.byte(kCounttoopen), 0);
- if (!flags.z())
- goto nocountopen;
- data.byte(kLiftflag) = 3;
-nocountopen:
- al = 0;
- goto pokelift;
-}
-
void DreamGenContext::liftnoise() {
STACK_CHECK;
_cmp(data.byte(kReallocation), 5);
@@ -3240,334 +2438,6 @@ gotconst:
ds.byte(di+17) = al;
}
-void DreamGenContext::doorway() {
- STACK_CHECK;
- data.byte(kDoorcheck1) = -24;
- data.byte(kDoorcheck2) = 10;
- data.byte(kDoorcheck3) = -30;
- data.byte(kDoorcheck4) = 10;
- dodoor();
-}
-
-void DreamGenContext::widedoor() {
- STACK_CHECK;
- data.byte(kDoorcheck1) = -24;
- data.byte(kDoorcheck2) = 24;
- data.byte(kDoorcheck3) = -30;
- data.byte(kDoorcheck4) = 24;
- dodoor();
-}
-
-void DreamGenContext::dodoor() {
- STACK_CHECK;
- al = data.byte(kRyanx);
- ah = data.byte(kRyany);
- cl = es.byte(bx+10);
- ch = es.byte(bx+11);
- _cmp(al, cl);
- if (!flags.c())
- goto rtofdoor;
- _sub(al, cl);
- _cmp(al, data.byte(kDoorcheck1));
- if (!flags.c())
- goto upordown;
- goto shutdoor;
-rtofdoor:
- _sub(al, cl);
- _cmp(al, data.byte(kDoorcheck2));
- if (!flags.c())
- goto shutdoor;
-upordown:
- _cmp(ah, ch);
- if (!flags.c())
- goto botofdoor;
- _sub(ah, ch);
- _cmp(ah, data.byte(kDoorcheck3));
- if (flags.c())
- goto shutdoor;
- goto opendoor;
-botofdoor:
- _sub(ah, ch);
- _cmp(ah, data.byte(kDoorcheck4));
- if (!flags.c())
- goto shutdoor;
-opendoor:
- cl = es.byte(bx+19);
- _cmp(data.byte(kThroughdoor), 1);
- if (!flags.z())
- goto notthrough;
- _cmp(cl, 0);
- if (!flags.z())
- goto notthrough;
- cl = 6;
-notthrough:
- _inc(cl);
- _cmp(cl, 1);
- if (!flags.z())
- goto notdoorsound2;
- al = 0;
- _cmp(data.byte(kReallocation), 5);
- if (!flags.z())
- goto nothoteldoor2;
- al = 13;
-nothoteldoor2:
- playchannel1();
-notdoorsound2:
- ch = 0;
- push(di);
- _add(di, cx);
- al = ds.byte(di+18);
- _cmp(al, 255);
- if (!flags.z())
- goto atlast1;
- _dec(di);
- _dec(cl);
-atlast1:
- es.byte(bx+19) = cl;
- al = ds.byte(di+18);
- di = pop();
- es.byte(bx+15) = al;
- ds.byte(di+17) = al;
- data.byte(kThroughdoor) = 1;
- return;
-shutdoor:
- cl = es.byte(bx+19);
- _cmp(cl, 5);
- if (!flags.z())
- goto notdoorsound1;
- al = 1;
- _cmp(data.byte(kReallocation), 5);
- if (!flags.z())
- goto nothoteldoor1;
- al = 13;
-nothoteldoor1:
- playchannel1();
-notdoorsound1:
- _cmp(cl, 0);
- if (flags.z())
- goto atlast2;
- _dec(cl);
- es.byte(bx+19) = cl;
-atlast2:
- ch = 0;
- push(di);
- _add(di, cx);
- al = ds.byte(di+18);
- di = pop();
- es.byte(bx+15) = al;
- ds.byte(di+17) = al;
- _cmp(cl, 5);
- if (!flags.z())
- return /* (notnearly) */;
- data.byte(kThroughdoor) = 0;
-}
-
-void DreamGenContext::lockeddoorway() {
- STACK_CHECK;
- al = data.byte(kRyanx);
- ah = data.byte(kRyany);
- cl = es.byte(bx+10);
- ch = es.byte(bx+11);
- _cmp(al, cl);
- if (!flags.c())
- goto rtofdoor2;
- _sub(al, cl);
- _cmp(al, -24);
- if (!flags.c())
- goto upordown2;
- goto shutdoor2;
-rtofdoor2:
- _sub(al, cl);
- _cmp(al, 10);
- if (!flags.c())
- goto shutdoor2;
-upordown2:
- _cmp(ah, ch);
- if (!flags.c())
- goto botofdoor2;
- _sub(ah, ch);
- _cmp(ah, -30);
- if (flags.c())
- goto shutdoor2;
- goto opendoor2;
-botofdoor2:
- _sub(ah, ch);
- _cmp(ah, 12);
- if (!flags.c())
- goto shutdoor2;
-opendoor2:
- _cmp(data.byte(kThroughdoor), 1);
- if (flags.z())
- goto mustbeopen;
- _cmp(data.byte(kLockstatus), 1);
- if (flags.z())
- goto shutdoor;
-mustbeopen:
- cl = es.byte(bx+19);
- _cmp(cl, 1);
- if (!flags.z())
- goto notdoorsound4;
- al = 0;
- playchannel1();
-notdoorsound4:
- _cmp(cl, 6);
- if (!flags.z())
- goto noturnonyet;
- al = data.byte(kDoorpath);
- push(es);
- push(bx);
- turnpathon();
- bx = pop();
- es = pop();
-noturnonyet:
- cl = es.byte(bx+19);
- _cmp(data.byte(kThroughdoor), 1);
- if (!flags.z())
- goto notthrough2;
- _cmp(cl, 0);
- if (!flags.z())
- goto notthrough2;
- cl = 6;
-notthrough2:
- _inc(cl);
- ch = 0;
- push(di);
- _add(di, cx);
- al = ds.byte(di+18);
- _cmp(al, 255);
- if (!flags.z())
- goto atlast3;
- _dec(di);
- _dec(cl);
-atlast3:
- es.byte(bx+19) = cl;
- al = ds.byte(di+18);
- di = pop();
- es.byte(bx+15) = al;
- ds.byte(di+17) = al;
- _cmp(cl, 5);
- if (!flags.z())
- return /* (justshutting) */;
- data.byte(kThroughdoor) = 1;
- return;
-shutdoor2:
- cl = es.byte(bx+19);
- _cmp(cl, 5);
- if (!flags.z())
- goto notdoorsound3;
- al = 1;
- playchannel1();
-notdoorsound3:
- _cmp(cl, 0);
- if (flags.z())
- goto atlast4;
- _dec(cl);
- es.byte(bx+19) = cl;
-atlast4:
- ch = 0;
- data.byte(kThroughdoor) = 0;
- push(di);
- _add(di, cx);
- al = ds.byte(di+18);
- di = pop();
- es.byte(bx+15) = al;
- ds.byte(di+17) = al;
- _cmp(cl, 0);
- if (!flags.z())
- return /* (notlocky) */;
- al = data.byte(kDoorpath);
- push(es);
- push(bx);
- turnpathoff();
- bx = pop();
- es = pop();
- data.byte(kLockstatus) = 1;
-/*continuing to unbounded code: shutdoor from dodoor:60-87*/
-shutdoor:
- cl = es.byte(bx+19);
- _cmp(cl, 5);
- if (!flags.z())
- goto notdoorsound1;
- al = 1;
- _cmp(data.byte(kReallocation), 5);
- if (!flags.z())
- goto nothoteldoor1;
- al = 13;
-nothoteldoor1:
- playchannel1();
-notdoorsound1:
- _cmp(cl, 0);
- if (flags.z())
- goto atlast2;
- _dec(cl);
- es.byte(bx+19) = cl;
-atlast2:
- ch = 0;
- push(di);
- _add(di, cx);
- al = ds.byte(di+18);
- di = pop();
- es.byte(bx+15) = al;
- ds.byte(di+17) = al;
- _cmp(cl, 5);
- if (!flags.z())
- return /* (notnearly) */;
- data.byte(kThroughdoor) = 0;
-}
-
-void DreamGenContext::updatepeople() {
- STACK_CHECK;
- es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5));
- data.word(kListpos) = di;
- cx = 12*5;
- al = 255;
- _stosb(cx, true);
- _inc(data.word(kMaintimer));
- es = cs;
- bx = 534;
- di = 991;
-updateloop:
- al = es.byte(bx);
- _cmp(al, 255);
- if (flags.z())
- return /* (endupdate) */;
- _cmp(al, data.byte(kReallocation));
- if (!flags.z())
- goto notinthisroom;
- cx = es.word(bx+1);
- _cmp(cl, data.byte(kMapx));
- if (!flags.z())
- goto notinthisroom;
- _cmp(ch, data.byte(kMapy));
- if (!flags.z())
- goto notinthisroom;
- push(di);
- ax = cs.word(di);
- __dispatch_call(ax);
- di = pop();
-notinthisroom:
- _add(bx, 8);
- _add(di, 2);
- goto updateloop;
-}
-
-void DreamGenContext::getreelframeax() {
- STACK_CHECK;
- push(ds);
- data.word(kCurrentframe) = ax;
- findsource();
- es = ds;
- ds = pop();
- ax = data.word(kCurrentframe);
- _sub(ax, data.word(kTakeoff));
- _add(ax, ax);
- cx = ax;
- _add(ax, ax);
- _add(ax, cx);
- bx = ax;
-}
-
void DreamGenContext::reelsonscreen() {
STACK_CHECK;
reconstruct();
@@ -3577,48 +2447,6 @@ void DreamGenContext::reelsonscreen() {
usetimedtext();
}
-void DreamGenContext::plotreel() {
- STACK_CHECK;
- getreelstart();
-retryreel:
- push(es);
- push(si);
- ax = es.word(si+2);
- _cmp(al, 220);
- if (flags.c())
- goto normalreel;
- _cmp(al, 255);
- if (flags.z())
- goto normalreel;
- dealwithspecial();
- _inc(data.word(kReelpointer));
- si = pop();
- es = pop();
- _add(si, 40);
- goto retryreel;
-normalreel:
- cx = 8;
-plotloop:
- push(cx);
- push(es);
- push(si);
- ax = es.word(si);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- goto notplot;
- showreelframe();
-notplot:
- si = pop();
- es = pop();
- cx = pop();
- _add(si, 5);
- if (--cx)
- goto plotloop;
- soundonreels();
- bx = pop();
- es = pop();
-}
-
void DreamGenContext::soundonreels() {
STACK_CHECK;
bl = data.byte(kReallocation);
@@ -3673,127 +2501,15 @@ void DreamGenContext::reconstruct() {
drawfloor();
spriteupdate();
printsprites();
- data.byte(kHavedoneobs) = 0;
-}
-
-void DreamGenContext::dealwithspecial() {
- STACK_CHECK;
- _sub(al, 220);
- _cmp(al, 0);
- if (!flags.z())
- goto notplset;
- al = ah;
- placesetobject();
- data.byte(kHavedoneobs) = 1;
- return;
-notplset:
- _cmp(al, 1);
- if (!flags.z())
- goto notremset;
- al = ah;
- removesetobject();
- data.byte(kHavedoneobs) = 1;
- return;
-notremset:
- _cmp(al, 2);
- if (!flags.z())
- goto notplfree;
- al = ah;
- placefreeobject();
- data.byte(kHavedoneobs) = 1;
- return;
-notplfree:
- _cmp(al, 3);
- if (!flags.z())
- goto notremfree;
- al = ah;
- removefreeobject();
- data.byte(kHavedoneobs) = 1;
- return;
-notremfree:
- _cmp(al, 4);
- if (!flags.z())
- goto notryanoff;
- switchryanoff();
- return;
-notryanoff:
- _cmp(al, 5);
- if (!flags.z())
- goto notryanon;
- data.byte(kTurntoface) = ah;
- data.byte(kFacing) = ah;
- switchryanon();
- return;
-notryanon:
- _cmp(al, 6);
- if (!flags.z())
- goto notchangeloc;
- data.byte(kNewlocation) = ah;
- return;
-notchangeloc:
- movemap();
-}
-
-void DreamGenContext::movemap() {
- STACK_CHECK;
- _cmp(ah, 32);
- if (!flags.z())
- goto notmapup2;
- _sub(data.byte(kMapy), 20);
- data.byte(kNowinnewroom) = 1;
- return;
-notmapup2:
- _cmp(ah, 16);
- if (!flags.z())
- goto notmapupspec;
- _sub(data.byte(kMapy), 10);
- data.byte(kNowinnewroom) = 1;
- return;
-notmapupspec:
- _cmp(ah, 8);
- if (!flags.z())
- goto notmapdownspec;
- _add(data.byte(kMapy), 10);
- data.byte(kNowinnewroom) = 1;
- return;
-notmapdownspec:
- _cmp(ah, 2);
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto notfudge;
+ _cmp(data.byte(kReallocation), 20);
if (!flags.z())
- goto notmaprightspec;
- _add(data.byte(kMapx), 11);
- data.byte(kNowinnewroom) = 1;
- return;
-notmaprightspec:
- _sub(data.byte(kMapx), 11);
- data.byte(kNowinnewroom) = 1;
-}
-
-void DreamGenContext::getreelstart() {
- STACK_CHECK;
- ax = data.word(kReelpointer);
- cx = 40;
- _mul(cx);
- es = data.word(kReels);
- si = ax;
- _add(si, (0+(36*144)));
-}
-
-void DreamGenContext::showreelframe() {
- STACK_CHECK;
- al = es.byte(si+2);
- ah = 0;
- di = ax;
- _add(di, data.word(kMapadx));
- al = es.byte(si+3);
- bx = ax;
- _add(bx, data.word(kMapady));
- ax = es.word(si);
- data.word(kCurrentframe) = ax;
- findsource();
- ax = data.word(kCurrentframe);
- _sub(ax, data.word(kTakeoff));
- ah = 8;
- showframe();
+ goto notfudge;
+ undertextline();
+notfudge:
+ data.byte(kHavedoneobs) = 0;
}
void DreamGenContext::deleverything() {
@@ -3812,71 +2528,6 @@ bigroom:
_add(data.byte(kMapysize), 8);
}
-void DreamGenContext::dumpeverything() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40));
-dumpevery1:
- ax = es.word(bx);
- cx = es.word(bx+2);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- goto finishevery1;
- _cmp(ax, es.word(bx+(40*5)));
- if (!flags.z())
- goto notskip1;
- _cmp(cx, es.word(bx+(40*5)+2));
- if (flags.z())
- goto skip1;
-notskip1:
- push(bx);
- push(es);
- push(ds);
- bl = ah;
- bh = 0;
- ah = 0;
- di = ax;
- _add(di, data.word(kMapadx));
- _add(bx, data.word(kMapady));
- multidump();
- ds = pop();
- es = pop();
- bx = pop();
-skip1:
- _add(bx, 5);
- goto dumpevery1;
-finishevery1:
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40))+(40*5);
-dumpevery2:
- ax = es.word(bx);
- cx = es.word(bx+2);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- return /* (finishevery2) */;
- push(bx);
- push(es);
- push(ds);
- bl = ah;
- bh = 0;
- ah = 0;
- di = ax;
- _add(di, data.word(kMapadx));
- _add(bx, data.word(kMapady));
- multidump();
- ds = pop();
- es = pop();
- bx = pop();
- _add(bx, 5);
- goto dumpevery2;
-}
-
-void DreamGenContext::allocatework() {
- STACK_CHECK;
- bx = 0x1000;
- allocatemem();
- data.word(kWorkspace) = ax;
-}
-
void DreamGenContext::loadpalfromiff() {
STACK_CHECK;
dx = 2481;
@@ -3887,7 +2538,7 @@ void DreamGenContext::loadpalfromiff() {
readfromfile();
closefile();
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768);
ds = data.word(kMapstore);
si = 0x30;
cx = 768;
@@ -3916,83 +2567,6 @@ nought:
goto palloop;
}
-void DreamGenContext::paneltomap() {
- STACK_CHECK;
- di = data.word(kMapxstart);
- _add(di, data.word(kMapadx));
- bx = data.word(kMapystart);
- _add(bx, data.word(kMapady));
- ds = data.word(kMapstore);
- si = 0;
- cl = data.byte(kMapxsize);
- ch = data.byte(kMapysize);
- multiget();
-}
-
-void DreamGenContext::maptopanel() {
- STACK_CHECK;
- di = data.word(kMapxstart);
- _add(di, data.word(kMapadx));
- bx = data.word(kMapystart);
- _add(bx, data.word(kMapady));
- ds = data.word(kMapstore);
- si = 0;
- cl = data.byte(kMapxsize);
- ch = data.byte(kMapysize);
- multiput();
-}
-
-void DreamGenContext::dumpmap() {
- STACK_CHECK;
- di = data.word(kMapxstart);
- _add(di, data.word(kMapadx));
- bx = data.word(kMapystart);
- _add(bx, data.word(kMapady));
- cl = data.byte(kMapxsize);
- ch = data.byte(kMapysize);
- multidump();
-}
-
-void DreamGenContext::pixelcheckset() {
- STACK_CHECK;
- push(ax);
- _sub(al, es.byte(bx));
- _sub(ah, es.byte(bx+1));
- push(es);
- push(bx);
- push(cx);
- push(ax);
- al = es.byte(bx+4);
- getsetad();
- al = es.byte(bx+17);
- es = data.word(kSetframes);
- bx = (0);
- ah = 0;
- cx = 6;
- _mul(cx);
- _add(bx, ax);
- ax = pop();
- push(ax);
- al = ah;
- ah = 0;
- cl = es.byte(bx);
- ch = 0;
- _mul(cx);
- cx = pop();
- ch = 0;
- _add(ax, cx);
- _add(ax, es.word(bx+2));
- bx = ax;
- _add(bx, (0+2080));
- al = es.byte(bx);
- dl = al;
- cx = pop();
- bx = pop();
- es = pop();
- ax = pop();
- _cmp(dl, 0);
-}
-
void DreamGenContext::createpanel() {
STACK_CHECK;
di = 0;
@@ -4038,430 +2612,6 @@ void DreamGenContext::createpanel2() {
showframe();
}
-void DreamGenContext::clearwork() {
- STACK_CHECK;
- ax = 0x0;
- es = data.word(kWorkspace);
- di = 0;
- cx = (200*320)/64;
-clearloop:
- _stosw(32);
- if (--cx)
- goto clearloop;
-}
-
-void DreamGenContext::zoom() {
- STACK_CHECK;
- _cmp(data.word(kWatchingtime), 0);
- if (!flags.z())
- return /* (inwatching) */;
- _cmp(data.byte(kZoomon), 1);
- if (flags.z())
- goto zoomswitch;
- return;
-zoomswitch:
- _cmp(data.byte(kCommandtype), 199);
- if (flags.c())
- goto zoomit;
- putunderzoom();
- return;
-zoomit:
- ax = data.word(kOldpointery);
- _sub(ax, 9);
- cx = (320);
- _mul(cx);
- _add(ax, data.word(kOldpointerx));
- _sub(ax, 11);
- si = ax;
- ax = (132)+4;
- cx = (320);
- _mul(cx);
- _add(ax, (8)+5);
- di = ax;
- es = data.word(kWorkspace);
- ds = data.word(kWorkspace);
- cx = 20;
-zoomloop:
- push(cx);
- cx = 23;
-zoomloop2:
- _lodsb();
- ah = al;
- _stosw();
- es.word(di+(320)-2) = ax;
- if (--cx)
- goto zoomloop2;
- _add(si, (320)-23);
- _add(di, (320)-46+(320));
- cx = pop();
- if (--cx)
- goto zoomloop;
- crosshair();
- data.byte(kDidzoom) = 1;
-}
-
-void DreamGenContext::delthisone() {
- STACK_CHECK;
- push(ax);
- push(ax);
- al = ah;
- ah = 0;
- _add(ax, data.word(kMapady));
- bx = (320);
- _mul(bx);
- bx = pop();
- bh = 0;
- _add(bx, data.word(kMapadx));
- _add(ax, bx);
- di = ax;
- ax = pop();
- push(ax);
- al = ah;
- ah = 0;
- bx = 22*8;
- _mul(bx);
- bx = pop();
- bh = 0;
- _add(ax, bx);
- si = ax;
- es = data.word(kWorkspace);
- ds = data.word(kMapstore);
- dl = cl;
- dh = 0;
- ax = (320);
- _sub(ax, dx);
- _neg(dx);
- _add(dx, 22*8);
-deloneloop:
- push(cx);
- ch = 0;
- _movsb(cx, true);
- cx = pop();
- _add(di, ax);
- _add(si, dx);
- _dec(ch);
- if (!flags.z())
- goto deloneloop;
-}
-
-void DreamGenContext::doblocks() {
- STACK_CHECK;
- es = data.word(kWorkspace);
- ax = data.word(kMapady);
- cx = (320);
- _mul(cx);
- di = data.word(kMapadx);
- _add(di, ax);
- al = data.byte(kMapy);
- ah = 0;
- bx = (66);
- _mul(bx);
- bl = data.byte(kMapx);
- bh = 0;
- _add(ax, bx);
- si = (0);
- _add(si, ax);
- cx = 10;
-loop120:
- push(di);
- push(cx);
- cx = 11;
-loop124:
- push(cx);
- push(di);
- ds = data.word(kMapdata);
- _lodsb();
- ds = data.word(kBackdrop);
- push(si);
- _cmp(al, 0);
- if (flags.z())
- goto zeroblock;
- ah = al;
- al = 0;
- si = (0+192);
- _add(si, ax);
- bh = 14;
- bh = 4;
-firstbitofblock:
- _movsw(8);
- _add(di, (320)-16);
- _dec(bh);
- if (!flags.z())
- goto firstbitofblock;
- bh = 12;
-loop125:
- _movsw(8);
- ax = 0x0dfdf;
- _stosw(2);
- _add(di, (320)-20);
- _dec(bh);
- if (!flags.z())
- goto loop125;
- _add(di, 4);
- ax = 0x0dfdf;
- _stosw(8);
- _add(di, (320)-16);
- _stosw(8);
- _add(di, (320)-16);
- _stosw(8);
- _add(di, (320)-16);
- _stosw(8);
-zeroblock:
- si = pop();
- di = pop();
- cx = pop();
- _add(di, 16);
- if (--cx)
- goto loop124;
- _add(si, (66)-11);
- cx = pop();
- di = pop();
- _add(di, (320)*16);
- if (--cx)
- goto loop120;
-}
-
-void DreamGenContext::showframe() {
- STACK_CHECK;
- push(dx);
- push(ax);
- cx = ax;
- _and(cx, 511);
- _add(cx, cx);
- si = cx;
- _add(cx, cx);
- _add(si, cx);
- _cmp(ds.word(si), 0);
- if (!flags.z())
- goto notblankshow;
- ax = pop();
- dx = pop();
- cx = 0;
- return;
-notblankshow:
- _test(ah, 128);
- if (!flags.z())
- goto skipoffsets;
- al = ds.byte(si+4);
- ah = 0;
- _add(di, ax);
- al = ds.byte(si+5);
- ah = 0;
- _add(bx, ax);
-skipoffsets:
- cx = ds.word(si+0);
- ax = ds.word(si+2);
- _add(ax, 2080);
- si = ax;
- ax = pop();
- dx = pop();
- _cmp(ah, 0);
- if (flags.z())
- goto noeffects;
- _test(ah, 128);
- if (flags.z())
- goto notcentred;
- push(ax);
- al = cl;
- ah = 0;
- _shr(ax, 1);
- _sub(di, ax);
- al = ch;
- ah = 0;
- _shr(ax, 1);
- _sub(bx, ax);
- ax = pop();
-notcentred:
- _test(ah, 64);
- if (flags.z())
- goto notdiffdest;
- push(cx);
- frameoutfx();
- cx = pop();
- return;
-notdiffdest:
- _test(ah, 8);
- if (flags.z())
- goto notprintlist;
- push(ax);
- ax = di;
- _sub(ax, data.word(kMapadx));
- push(bx);
- _sub(bx, data.word(kMapady));
- ah = bl;
- bx = pop();
- ax = pop();
-notprintlist:
- _test(ah, 4);
- if (flags.z())
- goto notflippedx;
- dx = (320);
- es = data.word(kWorkspace);
- push(cx);
- frameoutfx();
- cx = pop();
- return;
-notflippedx:
- _test(ah, 2);
- if (flags.z())
- goto notnomask;
- dx = (320);
- es = data.word(kWorkspace);
- push(cx);
- frameoutnm();
- cx = pop();
- return;
-notnomask:
- _test(ah, 32);
- if (flags.z())
- goto noeffects;
- dx = (320);
- es = data.word(kWorkspace);
- push(cx);
- frameoutbh();
- cx = pop();
- return;
-noeffects:
- dx = (320);
- es = data.word(kWorkspace);
- push(cx);
- frameoutv();
- cx = pop();
-}
-
-void DreamGenContext::frameoutbh() {
- STACK_CHECK;
- push(dx);
- ax = bx;
- bx = dx;
- _mul(bx);
- _add(di, ax);
- dx = pop();
- push(cx);
- ch = 0;
- _sub(dx, cx);
- cx = pop();
-bhloop2:
- push(cx);
- ch = 0;
- ah = 255;
-bhloop1:
- _cmp(es.byte(di), ah);
- if (!flags.z())
- goto nofill;
- _movsb();
- if (--cx)
- goto bhloop1;
- goto nextline;
-nofill:
- _inc(di);
- _inc(si);
- if (--cx)
- goto bhloop1;
-nextline:
- _add(di, dx);
- cx = pop();
- _dec(ch);
- if (!flags.z())
- goto bhloop2;
-}
-
-void DreamGenContext::frameoutfx() {
- STACK_CHECK;
- push(dx);
- ax = bx;
- bx = dx;
- _mul(bx);
- _add(di, ax);
- dx = pop();
- push(cx);
- ch = 0;
- _add(dx, cx);
- cx = pop();
-frameloopfx1:
- push(cx);
- ch = 0;
-frameloopfx2:
- _lodsb();
- _cmp(al, 0);
- if (!flags.z())
- goto backtosolidfx;
-backtootherfx:
- _dec(di);
- if (--cx)
- goto frameloopfx2;
- cx = pop();
- _add(di, dx);
- _dec(ch);
- if (!flags.z())
- goto frameloopfx1;
- return;
-frameloopfx3:
- _lodsb();
- _cmp(al, 0);
- if (flags.z())
- goto backtootherfx;
-backtosolidfx:
- es.byte(di) = al;
- _dec(di);
- if (--cx)
- goto frameloopfx3;
- cx = pop();
- _add(di, dx);
- _dec(ch);
- if (!flags.z())
- goto frameloopfx1;
-}
-
-void DreamGenContext::transferinv() {
- STACK_CHECK;
- di = data.word(kExframepos);
- push(di);
- al = data.byte(kExpos);
- ah = 0;
- bx = ax;
- _add(ax, ax);
- _add(ax, bx);
- _inc(ax);
- cx = 6;
- _mul(cx);
- es = data.word(kExtras);
- bx = (0);
- _add(bx, ax);
- _add(di, (0+2080));
- push(bx);
- al = data.byte(kItemtotran);
- ah = 0;
- bx = ax;
- _add(ax, ax);
- _add(ax, bx);
- _inc(ax);
- cx = 6;
- _mul(cx);
- ds = data.word(kFreeframes);
- bx = (0);
- _add(bx, ax);
- si = (0+2080);
- al = ds.byte(bx);
- ah = 0;
- cl = ds.byte(bx+1);
- ch = 0;
- _add(si, ds.word(bx+2));
- dx = ds.word(bx+4);
- bx = pop();
- es.byte(bx+0) = al;
- es.byte(bx+1) = cl;
- es.word(bx+4) = dx;
- _mul(cx);
- cx = ax;
- push(cx);
- _movsb(cx, true);
- cx = pop();
- ax = pop();
- es.word(bx+2) = ax;
- _add(data.word(kExframepos), cx);
-}
-
void DreamGenContext::transfermap() {
STACK_CHECK;
di = data.word(kExframepos);
@@ -4519,7 +2669,7 @@ void DreamGenContext::dofade() {
al = data.byte(kColourpos);
ah = 0;
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3));
_add(si, ax);
_add(si, ax);
_add(si, ax);
@@ -4536,7 +2686,7 @@ void DreamGenContext::dofade() {
void DreamGenContext::clearendpal() {
STACK_CHECK;
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
cx = 768;
al = 0;
_stosb(cx, true);
@@ -4562,11 +2712,11 @@ void DreamGenContext::fadescreenup() {
void DreamGenContext::fadetowhite() {
STACK_CHECK;
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
cx = 768;
al = 63;
_stosb(cx, true);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
al = 0;
_stosb(3);
paltostartpal();
@@ -4579,11 +2729,11 @@ void DreamGenContext::fadetowhite() {
void DreamGenContext::fadefromwhite() {
STACK_CHECK;
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3));
cx = 768;
al = 63;
_stosb(cx, true);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3));
al = 0;
_stosb(3);
paltoendpal();
@@ -4609,7 +2759,7 @@ void DreamGenContext::fadescreendownhalf() {
paltoendpal();
cx = 768;
es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
+ bx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
halfend:
al = es.byte(bx);
_shr(al, 1);
@@ -4619,12 +2769,12 @@ halfend:
goto halfend;
ds = data.word(kBuffers);
es = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(56*3);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(56*3);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3))+(56*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(56*3);
cx = 3*5;
_movsb(cx, true);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(77*3);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(77*3);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3))+(77*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(77*3);
cx = 3*2;
_movsb(cx, true);
data.byte(kFadedirection) = 1;
@@ -4666,7 +2816,7 @@ void DreamGenContext::fadescreendowns() {
void DreamGenContext::clearstartpal() {
STACK_CHECK;
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3));
cx = 256;
wholeloop1:
ax = 0;
@@ -4837,8 +2987,8 @@ void DreamGenContext::fadecalculation() {
goto nomorefading;
bl = data.byte(kFadecount);
es = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3));
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
cx = 768;
fadecolloop:
al = es.byte(si);
@@ -4872,8 +3022,8 @@ nomorefading:
void DreamGenContext::greyscalesum() {
STACK_CHECK;
es = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
cx = 256;
greysumloop1:
push(cx);
@@ -4931,8 +3081,8 @@ void DreamGenContext::paltostartpal() {
STACK_CHECK;
es = data.word(kBuffers);
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3));
cx = 768/2;
_movsw(cx, true);
}
@@ -4941,8 +3091,8 @@ void DreamGenContext::endpaltostart() {
STACK_CHECK;
es = data.word(kBuffers);
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3));
cx = 768/2;
_movsw(cx, true);
}
@@ -4951,8 +3101,8 @@ void DreamGenContext::startpaltoend() {
STACK_CHECK;
es = data.word(kBuffers);
ds = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3));
cx = 768/2;
_movsw(cx, true);
}
@@ -4961,8 +3111,8 @@ void DreamGenContext::paltoendpal() {
STACK_CHECK;
es = data.word(kBuffers);
ds = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768);
cx = 768/2;
_movsw(cx, true);
}
@@ -4971,8 +3121,8 @@ void DreamGenContext::allpalette() {
STACK_CHECK;
es = data.word(kBuffers);
ds = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3));
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768);
cx = 768/2;
_movsw(cx, true);
dumpcurrent();
@@ -4980,7 +3130,7 @@ void DreamGenContext::allpalette() {
void DreamGenContext::dumpcurrent() {
STACK_CHECK;
- si = (0+(180*10)+32+60+(32*32)+(11*10*3));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3));
ds = data.word(kBuffers);
vsync();
al = 0;
@@ -4997,11 +3147,11 @@ void DreamGenContext::fadedownmon() {
paltostartpal();
paltoendpal();
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(231*3);
cx = 3*8;
ax = 0;
_stosb(cx, true);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(246*3);
_stosb();
_stosw();
data.byte(kFadedirection) = 1;
@@ -5017,11 +3167,11 @@ void DreamGenContext::fadeupmon() {
paltostartpal();
paltoendpal();
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(231*3);
cx = 3*8;
ax = 0;
_stosb(cx, true);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(246*3);
_stosb();
_stosw();
data.byte(kFadedirection) = 1;
@@ -5037,11 +3187,11 @@ void DreamGenContext::fadeupmonfirst() {
paltostartpal();
paltoendpal();
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(231*3);
cx = 3*8;
ax = 0;
_stosb(cx, true);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(246*3);
_stosb();
_stosw();
data.byte(kFadedirection) = 1;
@@ -5060,11 +3210,11 @@ void DreamGenContext::fadeupyellows() {
STACK_CHECK;
paltoendpal();
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(231*3);
cx = 3*8;
ax = 0;
_stosb(cx, true);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(246*3);
_stosb();
_stosw();
data.byte(kFadedirection) = 1;
@@ -5079,15 +3229,15 @@ void DreamGenContext::initialmoncols() {
STACK_CHECK;
paltostartpal();
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(230*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(230*3);
cx = 3*9;
ax = 0;
_stosb(cx, true);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(246*3);
_stosb();
_stosw();
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(230*3);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3))+(230*3);
al = 230;
cx = 18;
showgroup();
@@ -5498,238 +3648,6 @@ realcreditsearly:
data.byte(kLasthardkey) = 0;
}
-void DreamGenContext::printchar() {
- STACK_CHECK;
- _cmp(al, 255);
- if (flags.z())
- return /* (ignoreit) */;
- push(si);
- push(bx);
- push(di);
- push(ax);
- _sub(al, 32);
- ah = 0;
- _add(ax, data.word(kCharshift));
- showframe();
- ax = pop();
- di = pop();
- bx = pop();
- si = pop();
- _cmp(data.byte(kKerning), 0);
- if (!flags.z())
- goto nokern;
- kernchars();
-nokern:
- push(cx);
- ch = 0;
- _add(di, cx);
- cx = pop();
-}
-
-void DreamGenContext::kernchars() {
- STACK_CHECK;
- _cmp(al, 'a');
- if (flags.z())
- goto iskern;
- _cmp(al, 'u');
- if (flags.z())
- goto iskern;
- return;
-iskern:
- _cmp(ah, 'n');
- if (flags.z())
- goto kernit;
- _cmp(ah, 't');
- if (flags.z())
- goto kernit;
- _cmp(ah, 'r');
- if (flags.z())
- goto kernit;
- _cmp(ah, 'i');
- if (flags.z())
- goto kernit;
- _cmp(ah, 'l');
- if (flags.z())
- goto kernit;
- return;
-kernit:
- _dec(cl);
-}
-
-void DreamGenContext::printslow() {
- STACK_CHECK;
- data.byte(kPointerframe) = 1;
- data.byte(kPointermode) = 3;
- ds = data.word(kCharset1);
-printloopslow6:
- push(bx);
- push(di);
- push(dx);
- getnumber();
- ch = 0;
-printloopslow5:
- push(cx);
- push(si);
- push(es);
- ax = es.word(si);
- push(bx);
- push(cx);
- push(es);
- push(si);
- push(ds);
- printboth();
- ds = pop();
- si = pop();
- es = pop();
- cx = pop();
- bx = pop();
- ax = es.word(si+1);
- _inc(si);
- _cmp(al, 0);
- if (flags.z())
- goto finishslow;
- _cmp(al, ':');
- if (flags.z())
- goto finishslow;
- _cmp(cl, 1);
- if (flags.z())
- goto afterslow;
- push(di);
- push(ds);
- push(bx);
- push(cx);
- push(es);
- push(si);
- data.word(kCharshift) = 91;
- printboth();
- data.word(kCharshift) = 0;
- si = pop();
- es = pop();
- cx = pop();
- bx = pop();
- ds = pop();
- di = pop();
- waitframes();
- _cmp(ax, 0);
- if (flags.z())
- goto keepgoing;
- _cmp(ax, data.word(kOldbutton));
- if (!flags.z())
- goto finishslow2;
-keepgoing:
- waitframes();
- _cmp(ax, 0);
- if (flags.z())
- goto afterslow;
- _cmp(ax, data.word(kOldbutton));
- if (!flags.z())
- goto finishslow2;
-afterslow:
- es = pop();
- si = pop();
- cx = pop();
- _inc(si);
- if (--cx)
- goto printloopslow5;
- dx = pop();
- di = pop();
- bx = pop();
- _add(bx, 10);
- goto printloopslow6;
-finishslow:
- es = pop();
- si = pop();
- cx = pop();
- dx = pop();
- di = pop();
- bx = pop();
- al = 0;
- return;
-finishslow2:
- es = pop();
- si = pop();
- cx = pop();
- dx = pop();
- di = pop();
- bx = pop();
- al = 1;
-}
-
-void DreamGenContext::waitframes() {
- STACK_CHECK;
- push(di);
- push(bx);
- push(es);
- push(si);
- push(ds);
- readmouse();
- showpointer();
- vsync();
- dumppointer();
- delpointer();
- ax = data.word(kMousebutton);
- ds = pop();
- si = pop();
- es = pop();
- bx = pop();
- di = pop();
-}
-
-void DreamGenContext::printboth() {
- STACK_CHECK;
- push(ax);
- push(cx);
- push(bx);
- push(di);
- printchar();
- ax = pop();
- push(di);
- di = ax;
- multidump();
- di = pop();
- bx = pop();
- cx = pop();
- ax = pop();
-}
-
-void DreamGenContext::printdirect() {
- STACK_CHECK;
- data.word(kLastxpos) = di;
- ds = data.word(kCurrentset);
-printloop6:
- push(bx);
- push(di);
- push(dx);
- getnumber();
- ch = 0;
-printloop5:
- ax = es.word(si);
- _inc(si);
- _cmp(al, 0);
- if (flags.z())
- goto finishdirct;
- _cmp(al, ':');
- if (flags.z())
- goto finishdirct;
- push(cx);
- push(es);
- printchar();
- data.word(kLastxpos) = di;
- es = pop();
- cx = pop();
- if (--cx)
- goto printloop5;
- dx = pop();
- di = pop();
- bx = pop();
- _add(bx, data.word(kLinespacing));
- goto printloop6;
-finishdirct:
- dx = pop();
- di = pop();
- bx = pop();
-}
-
void DreamGenContext::monprint() {
STACK_CHECK;
data.byte(kKerning) = 1;
@@ -5769,6 +3687,7 @@ printloop7:
nottrigger:
push(cx);
push(es);
+ modifychar();
printchar();
data.word(kCurslocx) = di;
data.word(kCurslocy) = bx;
@@ -5815,200 +3734,6 @@ nottrigger2:
data.byte(kKerning) = 0;
}
-void DreamGenContext::getnumber() {
- STACK_CHECK;
- cx = 0;
- push(si);
- push(bx);
- push(di);
- push(ds);
- push(es);
- di = si;
-wordloop:
- push(cx);
- push(dx);
- getnextword();
- dx = pop();
- cx = pop();
- _cmp(al, 1);
- if (flags.z())
- goto endoftext;
- al = cl;
- ah = 0;
- push(bx);
- bh = 0;
- _add(ax, bx);
- bx = pop();
- _sub(ax, 10);
- dh = 0;
- _cmp(ax, dx);
- if (!flags.c())
- goto gotoverend;
- _add(cl, bl);
- _add(ch, bh);
- goto wordloop;
-gotoverend:
- al = dl;
- _and(al, 1);
- if (flags.z())
- goto notcentre;
- push(cx);
- al = dl;
- _and(al, 0xfe);
- ah = 0;
- ch = 0;
- _sub(ax, cx);
- _add(ax, 20);
- _shr(ax, 1);
- cx = pop();
- es = pop();
- ds = pop();
- di = pop();
- bx = pop();
- si = pop();
- _add(di, ax);
- cl = ch;
- return;
-notcentre:
- es = pop();
- ds = pop();
- di = pop();
- bx = pop();
- si = pop();
- cl = ch;
- return;
-endoftext:
- al = cl;
- ah = 0;
- push(bx);
- bh = 0;
- _add(ax, bx);
- bx = pop();
- _sub(ax, 10);
- dh = 0;
- _cmp(ax, dx);
- if (!flags.c())
- goto gotoverend2;
- _add(cl, bl);
- _add(ch, bh);
-gotoverend2:
- al = dl;
- _and(al, 1);
- if (flags.z())
- goto notcent2;
- push(cx);
- al = dl;
- _and(al, 0xfe);
- _add(al, 2);
- ah = 0;
- ch = 0;
- _add(ax, 20);
- _sub(ax, cx);
- _shr(ax, 1);
- cx = pop();
- es = pop();
- ds = pop();
- di = pop();
- bx = pop();
- si = pop();
- _add(di, ax);
- cl = ch;
- return;
-notcent2:
- es = pop();
- ds = pop();
- di = pop();
- bx = pop();
- si = pop();
- cl = ch;
-}
-
-void DreamGenContext::getnextword() {
- STACK_CHECK;
- bx = 0;
-getloop:
- ax = es.word(di);
- _inc(di);
- _inc(bh);
- _cmp(al, ':');
- if (flags.z())
- goto endall;
- _cmp(al, 0);
- if (flags.z())
- goto endall;
- _cmp(al, 32);
- if (flags.z())
- goto endword;
- _cmp(al, 255);
- if (flags.z())
- goto getloop;
- push(ax);
- _sub(al, 32);
- ah = 0;
- _add(ax, data.word(kCharshift));
- _add(ax, ax);
- si = ax;
- _add(ax, ax);
- _add(si, ax);
- cl = ds.byte(si+0);
- ax = pop();
- kernchars();
- _add(bl, cl);
- goto getloop;
-endword:
- _add(bl, 6);
- al = 0;
- return;
-endall:
- _add(bl, 6);
- al = 1;
-}
-
-void DreamGenContext::fillryan() {
- STACK_CHECK;
- es = data.word(kBuffers);
- di = (0+(180*10)+32);
- findallryan();
- si = (0+(180*10)+32);
- al = data.byte(kRyanpage);
- ah = 0;
- cx = 20;
- _mul(cx);
- _add(si, ax);
- di = (80);
- bx = (58);
- cx = 2;
-ryanloop2:
- push(cx);
- push(di);
- push(bx);
- cx = 5;
-ryanloop1:
- push(cx);
- push(di);
- push(bx);
- ax = es.word(si);
- _add(si, 2);
- push(si);
- push(es);
- obtoinv();
- es = pop();
- si = pop();
- bx = pop();
- di = pop();
- cx = pop();
- _add(di, (44));
- if (--cx)
- goto ryanloop1;
- bx = pop();
- di = pop();
- cx = pop();
- _add(bx, (44));
- if (--cx)
- goto ryanloop2;
- showryanpage();
-}
-
void DreamGenContext::fillopen() {
STACK_CHECK;
deltextline();
@@ -6021,9 +3746,9 @@ lessthanapage:
al = 1;
push(ax);
es = data.word(kBuffers);
- di = (0+(180*10));
+ di = (0+(228*13));
findallopen();
- si = (0+(180*10));
+ si = (0+(228*13));
di = (80);
bx = (58)+96;
cx = pop();
@@ -6053,41 +3778,6 @@ nextopenslot:
undertextline();
}
-void DreamGenContext::findallryan() {
- STACK_CHECK;
- push(di);
- cx = 30;
- ax = 0x0ffff;
- _stosw(cx, true);
- di = pop();
- cl = 4;
- ds = data.word(kExtras);
- bx = (0+2080+30000);
- ch = 0;
-findryanloop:
- _cmp(ds.byte(bx+2), cl);
- if (!flags.z())
- goto notinryaninv;
- _cmp(ds.byte(bx+3), 255);
- if (!flags.z())
- goto notinryaninv;
- al = ds.byte(bx+4);
- ah = 0;
- push(di);
- _add(di, ax);
- _add(di, ax);
- al = ch;
- ah = 4;
- _stosw();
- di = pop();
-notinryaninv:
- _add(bx, 16);
- _inc(ch);
- _cmp(ch, (114));
- if (!flags.z())
- goto findryanloop;
-}
-
void DreamGenContext::findallopen() {
STACK_CHECK;
push(di);
@@ -6161,82 +3851,6 @@ findopen2a:
goto findopen1a;
}
-void DreamGenContext::obtoinv() {
- STACK_CHECK;
- push(bx);
- push(es);
- push(si);
- push(ax);
- push(ax);
- push(di);
- push(bx);
- ds = data.word(kIcons1);
- _sub(di, 2);
- _sub(bx, 1);
- al = 10;
- ah = 0;
- showframe();
- bx = pop();
- di = pop();
- ax = pop();
- _cmp(al, 255);
- if (flags.z())
- goto finishfill;
- push(bx);
- push(di);
- push(ax);
- ds = data.word(kExtras);
- _cmp(ah, 4);
- if (flags.z())
- goto isanextra;
- ds = data.word(kFreeframes);
-isanextra:
- cl = al;
- _add(al, al);
- _add(al, cl);
- _inc(al);
- ah = 128;
- _add(bx, 19);
- _add(di, 18);
- showframe();
- ax = pop();
- di = pop();
- bx = pop();
- push(bx);
- getanyaddir();
- isitworn();
- bx = pop();
- if (!flags.z())
- goto finishfill;
- ds = data.word(kIcons1);
- _sub(di, 3);
- _sub(bx, 2);
- al = 7;
- ah = 0;
- showframe();
-finishfill:
- ax = pop();
- si = pop();
- es = pop();
- bx = pop();
-}
-
-void DreamGenContext::isitworn() {
- STACK_CHECK;
- al = es.byte(bx+12);
- _cmp(al, 'W'-'A');
- if (!flags.z())
- return /* (notworn) */;
- al = es.byte(bx+13);
- _cmp(al, 'E'-'A');
-}
-
-void DreamGenContext::makeworn() {
- STACK_CHECK;
- es.byte(bx+12) = 'W'-'A';
- es.byte(bx+13) = 'E'-'A';
-}
-
void DreamGenContext::examineob() {
STACK_CHECK;
data.byte(kPointermode) = 0;
@@ -6272,17 +3886,20 @@ waitexam:
dumptextline();
delpointer();
data.byte(kGetback) = 0;
- bx = 2494;
+ bx = offset_examlist;
_cmp(data.byte(kInvopen), 0);
if (flags.z())
goto notuseinv;
- bx = 2556;
+ bx = offset_invlist1;
_cmp(data.byte(kInvopen), 1);
if (flags.z())
goto notuseinv;
- bx = 2618;
+ bx = offset_withlist1;
notuseinv:
checkcoords();
+ _cmp(data.byte(kQuitrequested), 0);
+ if (!flags.z())
+ goto stopwaiting;
_cmp(data.byte(kExamagain), 0);
if (flags.z())
goto norex;
@@ -6291,6 +3908,7 @@ norex:
_cmp(data.byte(kGetback), 0);
if (flags.z())
goto waitexam;
+stopwaiting:
data.byte(kPickup) = 0;
_cmp(data.word(kWatchingtime), 0);
if (!flags.z())
@@ -6383,35 +4001,11 @@ void DreamGenContext::openinv() {
data.byte(kCommandtype) = 255;
}
-void DreamGenContext::showryanpage() {
- STACK_CHECK;
- ds = data.word(kIcons1);
- di = (80)+167;
- bx = (58)-12;
- al = 12;
- ah = 0;
- showframe();
- al = 13;
- _add(al, data.byte(kRyanpage));
- push(ax);
- al = data.byte(kRyanpage);
- ah = 0;
- cx = 18;
- _mul(cx);
- ds = data.word(kIcons1);
- di = (80)+167;
- _add(di, ax);
- bx = (58)-12;
- ax = pop();
- ah = 0;
- showframe();
-}
-
void DreamGenContext::openob() {
STACK_CHECK;
al = data.byte(kOpenedob);
ah = data.byte(kOpenedtype);
- di = 5847;
+ di = offset_commandline;
copyname();
di = (80);
bx = (58)+86;
@@ -6422,7 +4016,7 @@ void DreamGenContext::openob() {
_add(di, 5);
bx = (58)+86;
es = cs;
- si = 5847;
+ si = offset_commandline;
dl = 220;
al = 0;
ah = 0;
@@ -6434,32 +4028,10 @@ void DreamGenContext::openob() {
cx = (44);
_mul(cx);
_add(ax, (80));
- bx = 2588;
+ bx = offset_openchangesize;
cs.word(bx) = ax;
}
-void DreamGenContext::obicons() {
- STACK_CHECK;
- al = data.byte(kCommand);
- getanyad();
- _cmp(al, 255);
- if (flags.z())
- goto cantopenit;
- ds = data.word(kIcons2);
- di = 210;
- bx = 1;
- al = 4;
- ah = 0;
- showframe();
-cantopenit:
- ds = data.word(kIcons2);
- di = 260;
- bx = 1;
- al = 1;
- ah = 0;
- showframe();
-}
-
void DreamGenContext::examicon() {
STACK_CHECK;
ds = data.word(kIcons2);
@@ -6470,43 +4042,19 @@ void DreamGenContext::examicon() {
showframe();
}
-void DreamGenContext::obpicture() {
- STACK_CHECK;
- al = data.byte(kCommand);
- ah = data.byte(kObjecttype);
- _cmp(ah, 1);
- if (flags.z())
- return /* (setframe) */;
- _cmp(ah, 4);
- if (flags.z())
- goto exframe;
- ds = data.word(kFreeframes);
- di = 160;
- bx = 68;
- cl = al;
- _add(al, al);
- _add(al, cl);
- _inc(al);
- ah = 128;
- showframe();
- return;
-exframe:
- ds = data.word(kExtras);
- di = 160;
- bx = 68;
- cl = al;
- _add(al, al);
- _add(al, cl);
- _inc(al);
- ah = 128;
- showframe();
-}
-
void DreamGenContext::describeob() {
STACK_CHECK;
getobtextstart();
di = 33;
bx = 92;
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto notsetd;
+ _cmp(data.byte(kObjecttype), 1);
+ if (!flags.z())
+ goto notsetd;
+ bx = 82;
+notsetd:
dl = 241;
ah = 16;
data.word(kCharshift) = 91+91;
@@ -6514,6 +4062,14 @@ void DreamGenContext::describeob() {
data.word(kCharshift) = 0;
di = 36;
bx = 104;
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto notsetd2;
+ _cmp(data.byte(kObjecttype), 1);
+ if (!flags.z())
+ goto notsetd2;
+ bx = 94;
+notsetd2:
dl = 241;
ah = 0;
printdirect();
@@ -6677,19 +4233,6 @@ foundmatch:
bx = pop();
}
-void DreamGenContext::findnextcolon() {
- STACK_CHECK;
-isntcolon:
- al = es.byte(si);
- _inc(si);
- _cmp(al, 0);
- if (flags.z())
- return /* (endofcolon) */;
- _cmp(al, ':');
- if (!flags.z())
- goto isntcolon;
-}
-
void DreamGenContext::inventory() {
STACK_CHECK;
_cmp(data.byte(kMandead), 1);
@@ -6737,7 +4280,8 @@ doopeninv:
delpointer();
data.byte(kOpenedob) = 255;
goto waitexam;
-/*continuing to unbounded code: examineagain from examineob:3-66*/
+ return;
+/*continuing to unbounded code: examineagain from examineob:3-69*/
examineagain:
data.byte(kInmaparea) = 0;
data.byte(kExamagain) = 0;
@@ -6769,17 +4313,20 @@ waitexam:
dumptextline();
delpointer();
data.byte(kGetback) = 0;
- bx = 2494;
+ bx = offset_examlist;
_cmp(data.byte(kInvopen), 0);
if (flags.z())
goto notuseinv;
- bx = 2556;
+ bx = offset_invlist1;
_cmp(data.byte(kInvopen), 1);
if (flags.z())
goto notuseinv;
- bx = 2618;
+ bx = offset_withlist1;
notuseinv:
checkcoords();
+ _cmp(data.byte(kQuitrequested), 0);
+ if (!flags.z())
+ goto stopwaiting;
_cmp(data.byte(kExamagain), 0);
if (flags.z())
goto norex;
@@ -6788,6 +4335,7 @@ norex:
_cmp(data.byte(kGetback), 0);
if (flags.z())
goto waitexam;
+stopwaiting:
data.byte(kPickup) = 0;
_cmp(data.word(kWatchingtime), 0);
if (!flags.z())
@@ -7135,31 +4683,6 @@ doplace:
delpointer();
}
-void DreamGenContext::deletetaken() {
- STACK_CHECK;
- es = data.word(kFreedat);
- ah = data.byte(kReallocation);
- ds = data.word(kExtras);
- si = (0+2080+30000);
- cx = (114);
-takenloop:
- al = ds.byte(si+11);
- _cmp(al, ah);
- if (!flags.z())
- goto notinhere;
- bl = ds.byte(si+1);
- bh = 0;
- _add(bx, bx);
- _add(bx, bx);
- _add(bx, bx);
- _add(bx, bx);
- es.byte(bx+2) = 254;
-notinhere:
- _add(si, 16);
- if (--cx)
- goto takenloop;
-}
-
void DreamGenContext::outofinv() {
STACK_CHECK;
findinvpos();
@@ -7347,7 +4870,7 @@ findinv2:
data.byte(kLastinvpos) = al;
_add(bx, bx);
es = data.word(kBuffers);
- _add(bx, (0+(180*10)+32));
+ _add(bx, (0+(228*13)+32));
}
void DreamGenContext::findopenpos() {
@@ -7364,7 +4887,7 @@ findopenp1:
data.byte(kLastinvpos) = al;
_add(bx, bx);
es = data.word(kBuffers);
- _add(bx, (0+(180*10)));
+ _add(bx, (0+(228*13)));
}
void DreamGenContext::dropobject() {
@@ -7506,25 +5029,6 @@ void DreamGenContext::cantdrop() {
worktoscreenm();
}
-void DreamGenContext::wornerror() {
- STACK_CHECK;
- data.byte(kCommandtype) = 255;
- delpointer();
- di = 76;
- bx = 21;
- al = 57;
- dl = 240;
- printmessage();
- worktoscreenm();
- cx = 50;
- hangonp();
- showpanel();
- showman();
- examicon();
- data.byte(kCommandtype) = 255;
- worktoscreenm();
-}
-
void DreamGenContext::removeobfrominv() {
STACK_CHECK;
_cmp(data.byte(kCommand), 100);
@@ -8004,24 +5508,6 @@ moretext:
goto moretext;
}
-void DreamGenContext::getexpos() {
- STACK_CHECK;
- es = data.word(kExtras);
- al = 0;
- di = (0+2080+30000);
-tryanotherex:
- _cmp(es.byte(di+2), 255);
- if (flags.z())
- goto foundnewex;
- _add(di, 16);
- _inc(al);
- _cmp(al, (114));
- if (!flags.z())
- goto tryanotherex;
-foundnewex:
- data.byte(kExpos) = al;
-}
-
void DreamGenContext::purgealocation() {
STACK_CHECK;
push(ax);
@@ -8235,11 +5721,7 @@ findlenextext:
push(bx);
push(ax);
_sub(cx, bx);
- _cmp(cx, 0xffff);
- if (flags.z())
- goto _tmp1;
_movsb(cx, true);
-_tmp1:
bx = pop();
_sub(data.word(kExtextpos), bx);
si = pop();
@@ -8285,629 +5767,6 @@ void DreamGenContext::drawfloor() {
es = pop();
}
-void DreamGenContext::calcmapad() {
- STACK_CHECK;
- getdimension();
- push(cx);
- push(dx);
- al = 11;
- _sub(al, dl);
- _sub(al, cl);
- _sub(al, cl);
- ax.cbw();
- bx = 8;
- _mul(bx);
- _add(ax, data.word(kMapoffsetx));
- data.word(kMapadx) = ax;
- dx = pop();
- cx = pop();
- al = 10;
- _sub(al, dh);
- _sub(al, ch);
- _sub(al, ch);
- ax.cbw();
- bx = 8;
- _mul(bx);
- _add(ax, data.word(kMapoffsety));
- data.word(kMapady) = ax;
-}
-
-void DreamGenContext::getdimension() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32));
- ch = 0;
-dimloop1:
- addalong();
- _cmp(al, 0);
- if (!flags.z())
- goto finishdim1;
- _inc(ch);
- goto dimloop1;
-finishdim1:
- bx = (0+(180*10)+32+60+(32*32));
- cl = 0;
-dimloop2:
- push(bx);
- addlength();
- bx = pop();
- _cmp(al, 0);
- if (!flags.z())
- goto finishdim2;
- _inc(cl);
- _add(bx, 3);
- goto dimloop2;
-finishdim2:
- bx = (0+(180*10)+32+60+(32*32))+(11*3*9);
- dh = 10;
-dimloop3:
- push(bx);
- addalong();
- bx = pop();
- _cmp(al, 0);
- if (!flags.z())
- goto finishdim3;
- _dec(dh);
- _sub(bx, 11*3);
- goto dimloop3;
-finishdim3:
- bx = (0+(180*10)+32+60+(32*32))+(3*10);
- dl = 11;
-dimloop4:
- push(bx);
- addlength();
- bx = pop();
- _cmp(al, 0);
- if (!flags.z())
- goto finishdim4;
- _dec(dl);
- _sub(bx, 3);
- goto dimloop4;
-finishdim4:
- al = cl;
- ah = 0;
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- data.word(kMapxstart) = ax;
- al = ch;
- ah = 0;
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- data.word(kMapystart) = ax;
- _sub(dl, cl);
- _sub(dh, ch);
- al = dl;
- ah = 0;
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- data.byte(kMapxsize) = al;
- al = dh;
- ah = 0;
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- _shl(ax, 1);
- data.byte(kMapysize) = al;
-}
-
-void DreamGenContext::addalong() {
- STACK_CHECK;
- ah = 11;
-addloop:
- _cmp(es.byte(bx), 0);
- if (!flags.z())
- goto gotalong;
- _add(bx, 3);
- _dec(ah);
- if (!flags.z())
- goto addloop;
- al = 0;
- return;
-gotalong:
- al = 1;
-}
-
-void DreamGenContext::addlength() {
- STACK_CHECK;
- ah = 10;
-addloop2:
- _cmp(es.byte(bx), 0);
- if (!flags.z())
- goto gotlength;
- _add(bx, 3*11);
- _dec(ah);
- if (!flags.z())
- goto addloop2;
- al = 0;
- return;
-gotlength:
- al = 1;
-}
-
-void DreamGenContext::drawflags() {
- STACK_CHECK;
- es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32));
- al = data.byte(kMapy);
- ah = 0;
- cx = (66);
- _mul(cx);
- bl = data.byte(kMapx);
- bh = 0;
- _add(ax, bx);
- si = (0);
- _add(si, ax);
- cx = 10;
-_tmp28:
- push(cx);
- cx = 11;
-_tmp28a:
- ds = data.word(kMapdata);
- _lodsb();
- ds = data.word(kBackdrop);
- push(si);
- push(ax);
- ah = 0;
- _add(ax, ax);
- si = (0);
- _add(si, ax);
- _movsw();
- ax = pop();
- _stosb();
- si = pop();
- if (--cx)
- goto _tmp28a;
- _add(si, (66)-11);
- cx = pop();
- if (--cx)
- goto _tmp28;
-}
-
-void DreamGenContext::eraseoldobs() {
- STACK_CHECK;
- _cmp(data.byte(kNewobs), 0);
- if (flags.z())
- return /* (donterase) */;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
- cx = 16;
-oberase:
- push(cx);
- push(bx);
- ax = es.word(bx+20);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- goto notthisob;
- di = bx;
- al = 255;
- cx = (32);
- _stosb(cx, true);
-notthisob:
- bx = pop();
- cx = pop();
- _add(bx, (32));
- if (--cx)
- goto oberase;
-}
-
-void DreamGenContext::showallobs() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32));
- data.word(kListpos) = bx;
- di = bx;
- cx = 128*5;
- al = 255;
- _stosb(cx, true);
- es = data.word(kSetframes);
- data.word(kFrsegment) = es;
- ax = (0);
- data.word(kDataad) = ax;
- ax = (0+2080);
- data.word(kFramesad) = ax;
- data.byte(kCurrentob) = 0;
- ds = data.word(kSetdat);
- si = 0;
- cx = 128;
-showobsloop:
- push(cx);
- push(si);
- push(si);
- _add(si, 58);
- es = data.word(kSetdat);
- getmapad();
- si = pop();
- _cmp(ch, 0);
- if (flags.z())
- goto blankframe;
- al = es.byte(si+18);
- ah = 0;
- data.word(kCurrentframe) = ax;
- _cmp(al, 255);
- if (flags.z())
- goto blankframe;
- push(es);
- push(si);
- calcfrframe();
- finalframe();
- si = pop();
- es = pop();
- al = es.byte(si+18);
- es.byte(si+17) = al;
- _cmp(es.byte(si+8), 0);
- if (!flags.z())
- goto animating;
- _cmp(es.byte(si+5), 5);
- if (flags.z())
- goto animating;
- _cmp(es.byte(si+5), 6);
- if (flags.z())
- goto animating;
- ax = data.word(kCurrentframe);
- ah = 0;
- _add(di, data.word(kMapadx));
- _add(bx, data.word(kMapady));
- showframe();
- goto drawnsetob;
-animating:
- makebackob();
-drawnsetob:
- si = data.word(kListpos);
- es = data.word(kBuffers);
- al = data.byte(kSavex);
- ah = data.byte(kSavey);
- es.word(si) = ax;
- cx = ax;
- ax = data.word(kSavesize);
- _add(al, cl);
- _add(ah, ch);
- es.word(si+2) = ax;
- al = data.byte(kCurrentob);
- es.byte(si+4) = al;
- _add(si, 5);
- data.word(kListpos) = si;
-blankframe:
- _inc(data.byte(kCurrentob));
- si = pop();
- cx = pop();
- _add(si, 64);
- _dec(cx);
- if (flags.z())
- return /* (finishedsetobs) */;
- goto showobsloop;
-}
-
-void DreamGenContext::makebackob() {
- STACK_CHECK;
- _cmp(data.byte(kNewobs), 0);
- if (flags.z())
- return /* (nomake) */;
- al = es.byte(si+5);
- ah = es.byte(si+8);
- push(si);
- push(ax);
- push(si);
- ax = data.word(kObjectx);
- bx = data.word(kObjecty);
- ah = bl;
- si = ax;
- cx = 49520;
- dx = data.word(kSetframes);
- di = (0);
- makesprite();
- ax = pop();
- es.word(bx+20) = ax;
- ax = pop();
- _cmp(al, 255);
- if (!flags.z())
- goto usedpriority;
- al = 0;
-usedpriority:
- es.byte(bx+23) = al;
- es.byte(bx+30) = ah;
- es.byte(bx+16) = 0;
- es.byte(bx+18) = 0;
- es.byte(bx+19) = 0;
- si = pop();
-}
-
-void DreamGenContext::showallfree() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5));
- data.word(kListpos) = bx;
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5));
- cx = 80*5;
- al = 255;
- _stosb(cx, true);
- es = data.word(kFreeframes);
- data.word(kFrsegment) = es;
- ax = (0);
- data.word(kDataad) = ax;
- ax = (0+2080);
- data.word(kFramesad) = ax;
- al = 0;
- data.byte(kCurrentfree) = al;
- ds = data.word(kFreedat);
- si = 2;
- cx = 0;
-loop127:
- push(cx);
- push(si);
- push(si);
- es = data.word(kFreedat);
- getmapad();
- si = pop();
- _cmp(ch, 0);
- if (flags.z())
- goto over138;
- al = data.byte(kCurrentfree);
- ah = 0;
- dx = ax;
- _add(ax, ax);
- _add(ax, dx);
- data.word(kCurrentframe) = ax;
- push(es);
- push(si);
- calcfrframe();
- es = data.word(kMapstore);
- ds = data.word(kFrsegment);
- finalframe();
- si = pop();
- es = pop();
- _cmp(cx, 0);
- if (flags.z())
- goto over138;
- ax = data.word(kCurrentframe);
- ah = 0;
- _add(di, data.word(kMapadx));
- _add(bx, data.word(kMapady));
- showframe();
- si = data.word(kListpos);
- es = data.word(kBuffers);
- al = data.byte(kSavex);
- ah = data.byte(kSavey);
- es.word(si) = ax;
- cx = ax;
- ax = data.word(kSavesize);
- _add(al, cl);
- _add(ah, ch);
- es.word(si+2) = ax;
- ax = pop();
- cx = pop();
- push(cx);
- push(ax);
- es.byte(si+4) = cl;
- _add(si, 5);
- data.word(kListpos) = si;
-over138:
- _inc(data.byte(kCurrentfree));
- si = pop();
- cx = pop();
- _add(si, 16);
- _inc(cx);
- _cmp(cx, 80);
- if (flags.z())
- return /* (finfree) */;
- goto loop127;
-}
-
-void DreamGenContext::showallex() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5));
- data.word(kListpos) = bx;
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5));
- cx = 100*5;
- al = 255;
- _stosb(cx, true);
- es = data.word(kExtras);
- data.word(kFrsegment) = es;
- ax = (0);
- data.word(kDataad) = ax;
- ax = (0+2080);
- data.word(kFramesad) = ax;
- data.byte(kCurrentex) = 0;
- si = (0+2080+30000)+2;
- cx = 0;
-exloop:
- push(cx);
- push(si);
- es = data.word(kExtras);
- push(si);
- ch = 0;
- _cmp(es.byte(si), 255);
- if (flags.z())
- goto notinroom;
- al = es.byte(si-2);
- _cmp(al, data.byte(kReallocation));
- if (!flags.z())
- goto notinroom;
- getmapad();
-notinroom:
- si = pop();
- _cmp(ch, 0);
- if (flags.z())
- goto blankex;
- al = data.byte(kCurrentex);
- ah = 0;
- dx = ax;
- _add(ax, ax);
- _add(ax, dx);
- data.word(kCurrentframe) = ax;
- push(es);
- push(si);
- calcfrframe();
- es = data.word(kMapstore);
- ds = data.word(kFrsegment);
- finalframe();
- si = pop();
- es = pop();
- _cmp(cx, 0);
- if (flags.z())
- goto blankex;
- ax = data.word(kCurrentframe);
- ah = 0;
- _add(di, data.word(kMapadx));
- _add(bx, data.word(kMapady));
- showframe();
- si = data.word(kListpos);
- es = data.word(kBuffers);
- al = data.byte(kSavex);
- ah = data.byte(kSavey);
- es.word(si) = ax;
- cx = ax;
- ax = data.word(kSavesize);
- _add(al, cl);
- _add(ah, ch);
- es.word(si+2) = ax;
- ax = pop();
- cx = pop();
- push(cx);
- push(ax);
- es.byte(si+4) = cl;
- _add(si, 5);
- data.word(kListpos) = si;
-blankex:
- _inc(data.byte(kCurrentex));
- si = pop();
- cx = pop();
- _add(si, 16);
- _inc(cx);
- _cmp(cx, 100);
- if (flags.z())
- return /* (finex) */;
- goto exloop;
-}
-
-void DreamGenContext::calcfrframe() {
- STACK_CHECK;
- dx = data.word(kFrsegment);
- ax = data.word(kFramesad);
- push(ax);
- cx = data.word(kDataad);
- ax = data.word(kCurrentframe);
- ds = dx;
- bx = 6;
- _mul(bx);
- _add(ax, cx);
- bx = ax;
- cx = ds.word(bx);
- ax = ds.word(bx+2);
- dx = ds.word(bx+4);
- bx = pop();
- push(dx);
- _add(ax, bx);
- data.word(kSavesource) = ax;
- data.word(kSavesize) = cx;
- ax = pop();
- push(ax);
- ah = 0;
- data.word(kOffsetx) = ax;
- ax = pop();
- al = ah;
- ah = 0;
- data.word(kOffsety) = ax;
- return;
- ax = pop();
- cx = 0;
- data.word(kSavesize) = cx;
-}
-
-void DreamGenContext::finalframe() {
- STACK_CHECK;
- ax = data.word(kObjecty);
- _add(ax, data.word(kOffsety));
- bx = data.word(kObjectx);
- _add(bx, data.word(kOffsetx));
- data.byte(kSavex) = bl;
- data.byte(kSavey) = al;
- di = data.word(kObjectx);
- bx = data.word(kObjecty);
-}
-
-void DreamGenContext::adjustlen() {
- STACK_CHECK;
- ah = al;
- _add(al, ch);
- _cmp(al, 100);
- if (flags.c())
- return /* (over242) */;
- al = 224;
- _sub(al, ch);
- ch = al;
-}
-
-void DreamGenContext::getmapad() {
- STACK_CHECK;
- getxad();
- _cmp(ch, 0);
- if (flags.z())
- return /* (over146) */;
- data.word(kObjectx) = ax;
- getyad();
- _cmp(ch, 0);
- if (flags.z())
- return /* (over146) */;
- data.word(kObjecty) = ax;
- ch = 1;
-}
-
-void DreamGenContext::getxad() {
- STACK_CHECK;
- cl = es.byte(si);
- _inc(si);
- al = es.byte(si);
- _inc(si);
- ah = es.byte(si);
- _inc(si);
- _cmp(cl, 0);
- if (!flags.z())
- goto over148;
- _sub(al, data.byte(kMapx));
- if (flags.c())
- goto over148;
- _cmp(al, 11);
- if (!flags.c())
- goto over148;
- cl = 4;
- _shl(al, cl);
- _or(al, ah);
- ah = 0;
- ch = 1;
- return;
-over148:
- ch = 0;
-}
-
-void DreamGenContext::getyad() {
- STACK_CHECK;
- al = es.byte(si);
- _inc(si);
- ah = es.byte(si);
- _inc(si);
- _sub(al, data.byte(kMapy));
- if (flags.c())
- goto over147;
- _cmp(al, 10);
- if (!flags.c())
- goto over147;
- cl = 4;
- _shl(al, cl);
- _or(al, ah);
- ah = 0;
- ch = 1;
- return;
-over147:
- ch = 0;
-}
-
void DreamGenContext::autolook() {
STACK_CHECK;
ax = data.word(kMousex);
@@ -9063,11 +5922,15 @@ waittalk:
dumppointer();
dumptextline();
data.byte(kGetback) = 0;
- bx = 2660;
+ bx = offset_talklist;
checkcoords();
+ _cmp(data.byte(kQuitrequested), 0);
+ if (!flags.z())
+ goto finishtalk;
_cmp(data.byte(kGetback), 0);
if (flags.z())
goto waittalk;
+finishtalk:
bx = data.word(kPersondata);
es = cs;
_cmp(data.byte(kTalkpos), 4);
@@ -9353,13 +6216,16 @@ hangloopq:
vsync();
dumppointer();
dumptextline();
- bx = 2692;
+ bx = offset_quitlist;
checkcoords();
bx = pop();
cx = pop();
_cmp(data.byte(kGetback), 1);
if (flags.z())
goto quitconv;
+ _cmp(data.byte(kQuitrequested), 0);
+ if (!flags.z())
+ goto quitconv;
_cmp(data.byte(kSpeechloaded), 1);
if (!flags.z())
goto notspeaking;
@@ -9485,7 +6351,7 @@ select:
_cmp(data.byte(kGetback), 1);
if (flags.z())
goto quittravel;
- bx = 2714;
+ bx = offset_destlist;
checkcoords();
_cmp(data.byte(kNewlocation), 255);
if (flags.z())
@@ -9563,6 +6429,15 @@ alreadyinfo:
di = 60;
bx = 72+55;
showframe();
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto _tmp1;
+ al = 4;
+ ah = 0;
+ di = 60;
+ bx = 72+55+21;
+ showframe();
+_tmp1:
bx = pop();
bh = 0;
_add(bx, bx);
@@ -9572,6 +6447,11 @@ alreadyinfo:
findnextcolon();
di = 63;
bx = 84;
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto _tmp2;
+ bx = 84+4;
+_tmp2:
dl = 191;
al = 0;
ah = 0;
@@ -9895,12 +6775,12 @@ void DreamGenContext::usemon() {
al = 32;
_stosb(cx, true);
es = cs;
- di = 2942+1;
+ di = offset_operand1+1;
cx = 12;
al = 32;
_stosb(cx, true);
es = cs;
- di = 2836;
+ di = offset_keys;
es.byte(di) = 1;
_add(di, 26);
cx = 3;
@@ -10398,7 +7278,7 @@ void DreamGenContext::delchar() {
void DreamGenContext::execcommand() {
STACK_CHECK;
es = cs;
- bx = 2776;
+ bx = offset_comlist;
ds = cs;
si = 8045;
al = ds.byte(si);
@@ -10497,7 +7377,7 @@ void DreamGenContext::dircom() {
dirroot:
data.byte(kLogonum) = 0;
ds = cs;
- si = 2956;
+ si = offset_rootdir;
_inc(si);
es = cs;
di = 2970;
@@ -10538,7 +7418,7 @@ void DreamGenContext::signon() {
parser();
_inc(di);
ds = cs;
- si = 2836;
+ si = offset_keys;
cx = 4;
signonloop:
push(cx);
@@ -10642,7 +7522,7 @@ void DreamGenContext::showkeys() {
al = 18;
monmessage();
es = cs;
- bx = 2836;
+ bx = offset_keys;
cx = 4;
keysloop:
push(cx);
@@ -10709,7 +7589,7 @@ foundfile2:
return;
keyok1:
es = cs;
- di = 2942;
+ di = offset_operand1;
ds = data.word(kMonsource);
searchforstring();
_cmp(al, 0);
@@ -10801,7 +7681,7 @@ keyok2:
push(es);
push(bx);
ds = cs;
- si = 2942+1;
+ si = offset_operand1+1;
es = cs;
di = 2970+1;
cx = 12;
@@ -10848,7 +7728,7 @@ void DreamGenContext::getkeyandlogo() {
cx = 26;
_mul(cx);
es = cs;
- bx = 2836;
+ bx = offset_keys;
_add(bx, ax);
al = es.byte(bx);
_cmp(al, 1);
@@ -10922,11 +7802,11 @@ notfound:
void DreamGenContext::parser() {
STACK_CHECK;
es = cs;
- di = 2942;
+ di = offset_operand1;
cx = 13;
al = 0;
_stosb(cx, true);
- di = 2942;
+ di = offset_operand1;
al = '=';
_stosb();
ds = cs;
@@ -10955,7 +7835,7 @@ copyin1:
if (!flags.z())
goto copyin1;
finishpars:
- di = 2942;
+ di = offset_operand1;
}
void DreamGenContext::scrollmonitor() {
@@ -10986,19 +7866,6 @@ void DreamGenContext::scrollmonitor() {
ax = pop();
}
-void DreamGenContext::lockmon() {
- STACK_CHECK;
- _cmp(data.byte(kLasthardkey), 57);
- if (!flags.z())
- return /* (notlock) */;
- locklighton();
-lockloop:
- _cmp(data.byte(kLasthardkey), 57);
- if (flags.z())
- goto lockloop;
- locklightoff();
-}
-
void DreamGenContext::monitorlogo() {
STACK_CHECK;
al = data.byte(kLogonum);
@@ -11043,6 +7910,7 @@ curfileloop:
return /* (finishfile) */;
_inc(si);
push(si);
+ modifychar();
ds = data.word(kTempcharset);
ah = 0;
printchar();
@@ -11141,6 +8009,12 @@ void DreamGenContext::printcurs() {
bx = data.word(kCurslocy);
cl = 6;
ch = 8;
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto _tmp1;
+ _sub(bx, 3);
+ ch = 11;
+_tmp1:
ds = data.word(kBuffers);
si = (0);
push(di);
@@ -11166,6 +8040,11 @@ flashcurs:
_sub(di, 6);
cl = 12;
ch = 8;
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto _tmp2;
+ ch = 11;
+_tmp2:
multidump();
es = pop();
bx = pop();
@@ -11187,6 +8066,12 @@ void DreamGenContext::delcurs() {
bx = data.word(kCurslocy);
cl = 6;
ch = 8;
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto _tmp1;
+ _sub(bx, 3);
+ ch = 11;
+_tmp1:
push(di);
push(bx);
push(cx);
@@ -11229,91 +8114,6 @@ douse:
useroutine();
}
-void DreamGenContext::useroutine() {
- STACK_CHECK;
- _cmp(data.byte(kReallocation), 50);
- if (flags.c())
- goto nodream7;
- _cmp(data.byte(kPointerpower), 0);
- if (!flags.z())
- goto powerok;
- return;
-powerok:
- data.byte(kPointerpower) = 0;
-nodream7:
- getanyad();
- dx = data;
- ds = dx;
- si = 2984;
-checkuselist:
- push(si);
- _lodsb();
- _sub(al, 'A');
- _cmp(al, es.byte(bx+12));
- if (!flags.z())
- goto failed;
- _lodsb();
- _sub(al, 'A');
- _cmp(al, es.byte(bx+13));
- if (!flags.z())
- goto failed;
- _lodsb();
- _sub(al, 'A');
- _cmp(al, es.byte(bx+14));
- if (!flags.z())
- goto failed;
- _lodsb();
- _sub(al, 'A');
- _cmp(al, es.byte(bx+15));
- if (!flags.z())
- goto failed;
- _lodsw();
- si = pop();
- __dispatch_call(ax);
- return;
-failed:
- si = pop();
- _add(si, 6);
- _cmp(ds.byte(si), 140);
- if (!flags.z())
- goto checkuselist;
- delpointer();
- getobtextstart();
- findnextcolon();
- _cmp(al, 0);
- if (flags.z())
- goto cantuse2;
- findnextcolon();
- _cmp(al, 0);
- if (flags.z())
- goto cantuse2;
- al = es.byte(si);
- _cmp(al, 0);
- if (flags.z())
- goto cantuse2;
- usetext();
- cx = 400;
- hangonp();
- putbackobstuff();
- return;
-cantuse2:
- createpanel();
- showpanel();
- showman();
- showexit();
- obicons();
- di = 33;
- bx = 100;
- al = 63;
- dl = 241;
- printmessage();
- worktoscreenm();
- cx = 50;
- hangonp();
- putbackobstuff();
- data.byte(kCommandtype) = 255;
-}
-
void DreamGenContext::wheelsound() {
STACK_CHECK;
al = 17;
@@ -12645,6 +9445,11 @@ void DreamGenContext::usecashcard() {
showman();
di = 114;
bx = 120;
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto _tmp1;
+ bx = 120-3;
+_tmp1:
ds = data.word(kTempgraphics);
al = 39;
ah = 0;
@@ -12663,7 +9468,7 @@ void DreamGenContext::usecashcard() {
di = 160;
bx = 155;
es = cs;
- si = 3474;
+ si = offset_money1poke;
data.word(kCharshift) = 91*2+75;
al = 0;
ah = 0;
@@ -12672,7 +9477,7 @@ void DreamGenContext::usecashcard() {
di = 187;
bx = 155;
es = cs;
- si = 3479;
+ si = offset_money2poke;
data.word(kCharshift) = 91*2+85;
al = 0;
ah = 0;
@@ -12740,7 +9545,7 @@ void DreamGenContext::lookatcard() {
void DreamGenContext::moneypoke() {
STACK_CHECK;
- bx = 3474;
+ bx = offset_money1poke;
cl = 48-1;
numberpoke0:
_inc(cl);
@@ -12776,7 +9581,7 @@ numberpoke3:
goto numberpoke3;
_add(ax, 10);
cs.byte(bx) = cl;
- bx = 3479;
+ bx = offset_money2poke;
_add(al, 48);
cs.byte(bx) = al;
}
@@ -13180,6 +9985,7 @@ void DreamGenContext::useaxe() {
return;
notinpool:
showfirstuse();
+ return;
/*continuing to unbounded code: axeondoor from useelvdoor:19-30*/
axeondoor:
al = 15;
@@ -13238,7 +10044,7 @@ void DreamGenContext::withwhat() {
al = data.byte(kCommand);
ah = data.byte(kObjecttype);
es = cs;
- di = 5847;
+ di = offset_commandline;
copyname();
di = 100;
bx = 21;
@@ -13250,7 +10056,7 @@ void DreamGenContext::withwhat() {
_add(di, 5);
bx = 21;
es = cs;
- si = 5847;
+ si = offset_commandline;
dl = 220;
al = 0;
ah = 0;
@@ -13310,23 +10116,6 @@ doselob:
useroutine();
}
-void DreamGenContext::compare() {
- STACK_CHECK;
- _sub(dl, 'A');
- _sub(dh, 'A');
- _sub(cl, 'A');
- _sub(ch, 'A');
- push(cx);
- push(dx);
- getanyaddir();
- dx = pop();
- cx = pop();
- _cmp(es.word(bx+12), cx);
- if (!flags.z())
- return /* (comparefin) */;
- _cmp(es.word(bx+14), dx);
-}
-
void DreamGenContext::findsetobject() {
STACK_CHECK;
_sub(al, 'A');
@@ -13452,26 +10241,6 @@ notfoundinside:
goto insideloop;
}
-void DreamGenContext::usetext() {
- STACK_CHECK;
- push(es);
- push(si);
- createpanel();
- showpanel();
- showman();
- showexit();
- obicons();
- si = pop();
- es = pop();
- di = 36;
- bx = 104;
- dl = 241;
- al = 0;
- ah = 0;
- printdirect();
- worktoscreenm();
-}
-
void DreamGenContext::putbackobstuff() {
STACK_CHECK;
createpanel();
@@ -13523,32 +10292,6 @@ void DreamGenContext::findpuztext() {
si = ax;
}
-void DreamGenContext::placesetobject() {
- STACK_CHECK;
- push(es);
- push(bx);
- cl = 0;
- ch = 0;
- findormake();
- getsetad();
- es.byte(bx+58) = 0;
- bx = pop();
- es = pop();
-}
-
-void DreamGenContext::removesetobject() {
- STACK_CHECK;
- push(es);
- push(bx);
- cl = 255;
- ch = 0;
- findormake();
- getsetad();
- es.byte(bx+58) = 255;
- bx = pop();
- es = pop();
-}
-
void DreamGenContext::issetobonmap() {
STACK_CHECK;
push(es);
@@ -13583,35 +10326,6 @@ void DreamGenContext::removefreeobject() {
es = pop();
}
-void DreamGenContext::findormake() {
- STACK_CHECK;
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
- push(ax);
- es = data.word(kBuffers);
- ah = data.byte(kReallocation);
-changeloop:
- _cmp(es.byte(bx), 255);
- if (flags.z())
- goto haventfound;
- _cmp(ax, es.word(bx));
- if (!flags.z())
- goto nofoundchange;
- _cmp(ch, es.byte(bx+3));
- if (flags.z())
- goto foundchange;
-nofoundchange:
- _add(bx, 4);
- goto changeloop;
-foundchange:
- ax = pop();
- es.byte(bx+2) = cl;
- return;
-haventfound:
- es.word(bx) = ax;
- es.word(bx+2) = cx;
- ax = pop();
-}
-
void DreamGenContext::switchryanon() {
STACK_CHECK;
data.byte(kRyanon) = 255;
@@ -13622,70 +10336,6 @@ void DreamGenContext::switchryanoff() {
data.byte(kRyanon) = 1;
}
-void DreamGenContext::setallchanges() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
-setallloop:
- ax = es.word(bx);
- _cmp(al, 255);
- if (flags.z())
- return /* (endsetloop) */;
- cx = es.word(bx+2);
- _add(bx, 4);
- _cmp(ah, data.byte(kReallocation));
- if (!flags.z())
- goto setallloop;
- push(es);
- push(bx);
- dochange();
- bx = pop();
- es = pop();
- goto setallloop;
-}
-
-void DreamGenContext::dochange() {
- STACK_CHECK;
- _cmp(ch, 0);
- if (flags.z())
- goto object;
- _cmp(ch, 1);
- if (flags.z())
- goto freeobject;
- push(cx);
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- push(ax);
- al = ch;
- _sub(al, 100);
- ah = 0;
- cx = 144;
- _mul(cx);
- bx = pop();
- _add(bx, ax);
- _add(bx, (0));
- es = data.word(kReels);
- cx = pop();
- es.byte(bx+6) = cl;
- return;
-object:
- push(cx);
- getsetad();
- cx = pop();
- es.byte(bx+58) = cl;
- return;
-freeobject:
- push(cx);
- getfreead();
- cx = pop();
- _cmp(es.byte(bx+2), 255);
- if (!flags.z())
- return /* (beenpickedup) */;
- es.byte(bx+2) = cl;
-}
-
void DreamGenContext::autoappear() {
STACK_CHECK;
_cmp(data.byte(kLocation), 32);
@@ -13756,53 +10406,6 @@ notonsartroof:
placesetobject();
}
-void DreamGenContext::getundertimed() {
- STACK_CHECK;
- al = data.byte(kTimedy);
- ah = 0;
- bx = ax;
- al = data.byte(kTimedx);
- ah = 0;
- di = ax;
- ch = (24);
- cl = 240;
- ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
- multiget();
-}
-
-void DreamGenContext::putundertimed() {
- STACK_CHECK;
- al = data.byte(kTimedy);
- ah = 0;
- bx = ax;
- al = data.byte(kTimedx);
- ah = 0;
- di = ax;
- ch = (24);
- cl = 240;
- ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
- multiput();
-}
-
-void DreamGenContext::dumptimedtext() {
- STACK_CHECK;
- _cmp(data.byte(kNeedtodumptimed), 1);
- if (!flags.z())
- return /* (nodumptimed) */;
- al = data.byte(kTimedy);
- ah = 0;
- bx = ax;
- al = data.byte(kTimedx);
- ah = 0;
- di = ax;
- cl = 240;
- ch = (24);
- multidump();
- data.byte(kNeedtodumptimed) = 0;
-}
-
void DreamGenContext::setuptimeduse() {
STACK_CHECK;
_cmp(data.word(kTimecount), 0);
@@ -13825,79 +10428,6 @@ void DreamGenContext::setuptimeduse() {
data.word(kTimedoffset) = bx;
}
-void DreamGenContext::setuptimedtemp() {
- STACK_CHECK;
- _cmp(ah, 0);
- if (flags.z())
- goto notloadspeech3;
- dl = 'T';
- dh = ah;
- cl = 'T';
- ah = 0;
- loadspeech();
- _cmp(data.byte(kSpeechloaded), 1);
- if (!flags.z())
- goto notloadspeech3;
- al = 50+12;
- playchannel1();
- return;
-notloadspeech3:
- _cmp(data.word(kTimecount), 0);
- if (!flags.z())
- return /* (cantsetup2) */;
- data.byte(kTimedy) = bh;
- data.byte(kTimedx) = bl;
- data.word(kCounttotimed) = cx;
- _add(dx, cx);
- data.word(kTimecount) = dx;
- bl = al;
- bh = 0;
- _add(bx, bx);
- es = data.word(kTextfile1);
- cx = (66*2);
- ax = es.word(bx);
- _add(ax, cx);
- bx = ax;
- data.word(kTimedseg) = es;
- data.word(kTimedoffset) = bx;
-}
-
-void DreamGenContext::usetimedtext() {
- STACK_CHECK;
- _cmp(data.word(kTimecount), 0);
- if (flags.z())
- return /* (notext) */;
- _dec(data.word(kTimecount));
- _cmp(data.word(kTimecount), 0);
- if (flags.z())
- goto deltimedtext;
- ax = data.word(kTimecount);
- _cmp(ax, data.word(kCounttotimed));
- if (flags.z())
- goto firsttimed;
- if (!flags.c())
- return /* (notext) */;
- goto notfirsttimed;
-firsttimed:
- getundertimed();
-notfirsttimed:
- bl = data.byte(kTimedy);
- bh = 0;
- al = data.byte(kTimedx);
- ah = 0;
- di = ax;
- es = data.word(kTimedseg);
- si = data.word(kTimedoffset);
- dl = 237;
- ah = 0;
- printdirect();
- data.byte(kNeedtodumptimed) = 1;
- return;
-deltimedtext:
- putundertimed();
- data.byte(kNeedtodumptimed) = 1;
-}
-
void DreamGenContext::edenscdplayer() {
STACK_CHECK;
showfirstuse();
@@ -14335,10 +10865,14 @@ void DreamGenContext::entercode() {
data.word(kPresspointer) = 0;
data.byte(kGetback) = 0;
keypadloop:
+ _cmp(data.byte(kQuitrequested), 0);
+ if (!flags.z())
+ goto numberright;
delpointer();
readmouse();
showkeypad();
showpointer();
+ vsync();
_cmp(data.byte(kPresscount), 0);
if (flags.z())
goto nopresses;
@@ -14352,7 +10886,7 @@ afterpress:
dumppointer();
dumpkeypad();
dumptextline();
- bx = 3482;
+ bx = offset_keypadlist;
checkcoords();
_cmp(data.byte(kGetback), 1);
if (flags.z())
@@ -14692,7 +11226,7 @@ menuloop:
dumppointer();
dumpmenu();
dumptextline();
- bx = 3614;
+ bx = offset_menulist;
checkcoords();
_cmp(data.byte(kGetback), 1);
if (!flags.z())
@@ -14721,7 +11255,7 @@ void DreamGenContext::getundermenu() {
cl = 48;
ch = 48;
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
multiget();
}
@@ -14732,7 +11266,7 @@ void DreamGenContext::putundermenu() {
cl = 48;
ch = 48;
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
multiput();
}
@@ -14805,7 +11339,7 @@ folderloop:
vsync();
dumppointer();
dumptextline();
- bx = 3636;
+ bx = offset_folderlist;
checkcoords();
_cmp(data.byte(kGetback), 0);
if (flags.z())
@@ -14849,7 +11383,7 @@ donextf:
delpointer();
showfolder();
data.word(kMousebutton) = 0;
- bx = 3636;
+ bx = offset_folderlist;
checkcoords();
worktoscreenm();
}
@@ -14936,7 +11470,7 @@ dolastf:
delpointer();
showfolder();
data.word(kMousebutton) = 0;
- bx = 3636;
+ bx = offset_folderlist;
checkcoords();
worktoscreenm();
}
@@ -15198,7 +11732,7 @@ symbolloop:
dumppointer();
dumptextline();
dumpsymbol();
- bx = 3678;
+ bx = offset_symbollist;
checkcoords();
_cmp(data.byte(kGetback), 0);
if (flags.z())
@@ -15569,7 +12103,7 @@ diaryloop:
dumppointer();
dumpdiarykeys();
dumptextline();
- bx = 3740;
+ bx = offset_diarylist;
checkcoords();
_cmp(data.byte(kGetback), 0);
if (flags.z())
@@ -15807,47 +12341,6 @@ void DreamGenContext::findtext1() {
si = ax;
}
-void DreamGenContext::zoomonoff() {
- STACK_CHECK;
- _cmp(data.word(kWatchingtime), 0);
- if (!flags.z())
- { blank(); return; };
- _cmp(data.byte(kPointermode), 2);
- if (flags.z())
- { blank(); return; };
- _cmp(data.byte(kCommandtype), 222);
- if (flags.z())
- goto alreadyonoff;
- data.byte(kCommandtype) = 222;
- al = 39;
- commandonly();
-alreadyonoff:
- ax = data.word(kMousebutton);
- _cmp(ax, data.word(kOldbutton));
- if (flags.z())
- return /* (nozoomonoff) */;
- _and(ax, 1);
- if (!flags.z())
- goto dozoomonoff;
- return;
-dozoomonoff:
- al = data.byte(kZoomon);
- _xor(al, 1);
- data.byte(kZoomon) = al;
- createpanel();
- data.byte(kNewobs) = 0;
- drawfloor();
- printsprites();
- reelsonscreen();
- showicon();
- getunderzoom();
- undertextline();
- al = 39;
- commandonly();
- readmouse();
- worktoscreenm();
-}
-
void DreamGenContext::saveload() {
STACK_CHECK;
_cmp(data.word(kWatchingtime), 0);
@@ -15905,7 +12398,7 @@ waitops:
dumppointer();
dumptextline();
delpointer();
- bx = 3782;
+ bx = offset_opslist;
checkcoords();
_cmp(data.byte(kGetback), 0);
if (flags.z())
@@ -15995,71 +12488,6 @@ void DreamGenContext::loadsavebox() {
loadintotemp();
}
-void DreamGenContext::loadgame() {
- STACK_CHECK;
- _cmp(data.byte(kCommandtype), 246);
- if (flags.z())
- goto alreadyload;
- data.byte(kCommandtype) = 246;
- al = 41;
- commandonly();
-alreadyload:
- ax = data.word(kMousebutton);
- _cmp(ax, data.word(kOldbutton));
- if (flags.z())
- return /* (noload) */;
- _cmp(ax, 1);
- if (flags.z())
- goto doload;
- return;
-doload:
- data.byte(kLoadingorsave) = 1;
- showopbox();
- showloadops();
- data.byte(kCurrentslot) = 0;
- showslots();
- shownames();
- data.byte(kPointerframe) = 0;
- worktoscreenm();
- namestoold();
- data.byte(kGetback) = 0;
-loadops:
- _cmp(data.byte(kQuitrequested), 0);
- if (!flags.z())
- return /* (quitloaded) */;
- delpointer();
- readmouse();
- showpointer();
- vsync();
- dumppointer();
- dumptextline();
- bx = 3824;
- checkcoords();
- _cmp(data.byte(kGetback), 0);
- if (flags.z())
- goto loadops;
- _cmp(data.byte(kGetback), 2);
- if (flags.z())
- return /* (quitloaded) */;
- getridoftemp();
- dx = data;
- es = dx;
- bx = 7979;
- startloading();
- loadroomssample();
- data.byte(kRoomloaded) = 1;
- data.byte(kNewlocation) = 255;
- clearsprites();
- initman();
- initrain();
- data.word(kTextaddressx) = 13;
- data.word(kTextaddressy) = 182;
- data.byte(kTextlen) = 240;
- startup();
- worktoscreen();
- data.byte(kGetback) = 4;
-}
-
void DreamGenContext::getbacktoops() {
STACK_CHECK;
_cmp(data.byte(kCommandtype), 201);
@@ -16117,63 +12545,13 @@ discopsloop:
vsync();
dumppointer();
dumptextline();
- bx = 3866;
+ bx = offset_discopslist;
checkcoords();
_cmp(data.byte(kGetback), 0);
if (flags.z())
goto discopsloop;
}
-void DreamGenContext::savegame() {
- STACK_CHECK;
- _cmp(data.byte(kMandead), 2);
- if (!flags.z())
- goto cansaveok;
- blank();
- return;
-cansaveok:
- _cmp(data.byte(kCommandtype), 247);
- if (flags.z())
- goto alreadysave;
- data.byte(kCommandtype) = 247;
- al = 44;
- commandonly();
-alreadysave:
- ax = data.word(kMousebutton);
- _and(ax, 1);
- if (!flags.z())
- goto dosave;
- return;
-dosave:
- data.byte(kLoadingorsave) = 2;
- showopbox();
- showsaveops();
- data.byte(kCurrentslot) = 0;
- showslots();
- shownames();
- worktoscreenm();
- namestoold();
- data.word(kBufferin) = 0;
- data.word(kBufferout) = 0;
- data.byte(kGetback) = 0;
-saveops:
- _cmp(data.byte(kQuitrequested), 0);
- if (!flags.z())
- return /* (quitsavegame) */;
- delpointer();
- checkinput();
- readmouse();
- showpointer();
- vsync();
- dumppointer();
- dumptextline();
- bx = 3908;
- checkcoords();
- _cmp(data.byte(kGetback), 0);
- if (flags.z())
- goto saveops;
-}
-
void DreamGenContext::actualsave() {
STACK_CHECK;
_cmp(data.byte(kCommandtype), 222);
@@ -16557,7 +12935,7 @@ void DreamGenContext::namestoold() {
STACK_CHECK;
ds = cs;
si = 8579;
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
es = data.word(kBuffers);
cx = 17*4;
_movsb(cx, true);
@@ -16567,7 +12945,7 @@ void DreamGenContext::oldtonames() {
STACK_CHECK;
es = cs;
di = 8579;
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
ds = data.word(kBuffers);
cx = 17*4;
_movsb(cx, true);
@@ -16610,7 +12988,7 @@ void DreamGenContext::saveposition() {
dx = (0);
saveseg();
ds = data.word(kBuffers);
- dx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
+ dx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
saveseg();
dx = data;
ds = dx;
@@ -16659,7 +13037,7 @@ void DreamGenContext::loadposition() {
dx = (0);
loadseg();
ds = data.word(kBuffers);
- dx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
+ dx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
loadseg();
dx = data;
ds = dx;
@@ -16700,21 +13078,6 @@ isntblank:
_stosw();
}
-void DreamGenContext::findlen() {
- STACK_CHECK;
- _dec(bx);
- _add(bx, ax);
-nextone:
- _cmp(cl, ds.byte(bx));
- if (!flags.z())
- return /* (foundlen) */;
- _dec(bx);
- _dec(ax);
- _cmp(ax, 0);
- if (!flags.z())
- goto nextone;
-}
-
void DreamGenContext::scanfornames() {
STACK_CHECK;
dx = data;
@@ -16794,7 +13157,7 @@ _tmp1:
dumppointer();
dumptextline();
delpointer();
- bx = 5057;
+ bx = offset_decidelist;
checkcoords();
_cmp(data.byte(kGetback), 0);
if (flags.z())
@@ -16838,55 +13201,6 @@ alreadynewgame:
data.byte(kGetback) = 3;
}
-void DreamGenContext::doload() {
- STACK_CHECK;
- data.byte(kLoadingorsave) = 1;
- showopbox();
- showloadops();
- data.byte(kCurrentslot) = 0;
- showslots();
- shownames();
- data.byte(kPointerframe) = 0;
- worktoscreenm();
- namestoold();
- data.byte(kGetback) = 0;
-loadops:
- _cmp(data.byte(kQuitrequested), 0);
- if (!flags.z())
- return /* (quitloaded) */;
- delpointer();
- readmouse();
- showpointer();
- vsync();
- dumppointer();
- dumptextline();
- bx = 3824;
- checkcoords();
- _cmp(data.byte(kGetback), 0);
- if (flags.z())
- goto loadops;
- _cmp(data.byte(kGetback), 2);
- if (flags.z())
- return /* (quitloaded) */;
- getridoftemp();
- dx = data;
- es = dx;
- bx = 7979;
- startloading();
- loadroomssample();
- data.byte(kRoomloaded) = 1;
- data.byte(kNewlocation) = 255;
- clearsprites();
- initman();
- initrain();
- data.word(kTextaddressx) = 13;
- data.word(kTextaddressy) = 182;
- data.byte(kTextlen) = 240;
- startup();
- worktoscreen();
- data.byte(kGetback) = 4;
-}
-
void DreamGenContext::loadold() {
STACK_CHECK;
_cmp(data.byte(kCommandtype), 252);
@@ -16900,6 +13214,7 @@ alreadyloadold:
_and(ax, 1);
if (flags.z())
return /* (noloadold) */;
+ ax = 0x0ffff;
doload();
_cmp(data.byte(kGetback), 4);
if (flags.z())
@@ -16915,7 +13230,7 @@ alreadyloadold:
void DreamGenContext::createname() {
STACK_CHECK;
push(ax);
- di = 5105;
+ di = offset_speechfile;
cs.byte(di+0) = dl;
cs.byte(di+3) = cl;
al = dh;
@@ -17082,46 +13397,6 @@ notsecondbank1:
es = pop();
}
-void DreamGenContext::makenextblock() {
- STACK_CHECK;
- volumeadjust();
- loopchannel0();
- _cmp(data.word(kCh1blockstocopy), 0);
- if (flags.z())
- goto mightbeonlych0;
- _cmp(data.word(kCh0blockstocopy), 0);
- if (flags.z())
- goto mightbeonlych1;
- _dec(data.word(kCh0blockstocopy));
- _dec(data.word(kCh1blockstocopy));
- bothchannels();
- return;
-mightbeonlych1:
- data.byte(kCh0playing) = 255;
- _cmp(data.word(kCh1blockstocopy), 0);
- if (flags.z())
- return /* (notch1only) */;
- _dec(data.word(kCh1blockstocopy));
- channel1only();
- return;
-mightbeonlych0:
- data.byte(kCh1playing) = 255;
- _cmp(data.word(kCh0blockstocopy), 0);
- if (flags.z())
- goto notch0only;
- _dec(data.word(kCh0blockstocopy));
- channel0only();
- return;
-notch0only:
- es = data.word(kSoundbuffer);
- di = data.word(kSoundbufferwrite);
- cx = 1024;
- ax = 0x7f7f;
- _stosw(cx, true);
- _and(di, 16384-1);
- data.word(kSoundbufferwrite) = di;
-}
-
void DreamGenContext::volumeadjust() {
STACK_CHECK;
al = data.byte(kVolumedirection);
@@ -17143,175 +13418,6 @@ volfinish:
data.byte(kVolumedirection) = 0;
}
-void DreamGenContext::loopchannel0() {
- STACK_CHECK;
- _cmp(data.word(kCh0blockstocopy), 0);
- if (!flags.z())
- return /* (notloop) */;
- _cmp(data.byte(kCh0repeat), 0);
- if (flags.z())
- return /* (notloop) */;
- _cmp(data.byte(kCh0repeat), 255);
- if (flags.z())
- goto endlessloop;
- _dec(data.byte(kCh0repeat));
-endlessloop:
- ax = data.word(kCh0oldemmpage);
- data.word(kCh0emmpage) = ax;
- ax = data.word(kCh0oldoffset);
- data.word(kCh0offset) = ax;
- ax = data.word(kCh0blockstocopy);
- _add(ax, data.word(kCh0oldblockstocopy));
- data.word(kCh0blockstocopy) = ax;
-}
-
-void DreamGenContext::cancelch0() {
- STACK_CHECK;
- data.byte(kCh0repeat) = 0;
- data.word(kCh0blockstocopy) = 0;
- data.byte(kCh0playing) = 255;
-}
-
-void DreamGenContext::cancelch1() {
- STACK_CHECK;
- data.word(kCh1blockstocopy) = 0;
- data.byte(kCh1playing) = 255;
-}
-
-void DreamGenContext::channel0tran() {
- STACK_CHECK;
- _cmp(data.byte(kVolume), 0);
- if (!flags.z())
- goto lowvolumetran;
- cx = 1024;
- _movsw(cx, true);
- return;
-lowvolumetran:
- cx = 1024;
- bh = data.byte(kVolume);
- bl = 0;
- _add(bx, 16384-256);
-volloop:
- _lodsw();
- bl = al;
- al = es.byte(bx);
- bl = ah;
- ah = es.byte(bx);
- _stosw();
- if (--cx)
- goto volloop;
-}
-
-void DreamGenContext::domix() {
- STACK_CHECK;
- _cmp(data.byte(kVolume), 0);
- if (!flags.z())
- goto lowvolumemix;
-slow:
- _lodsb();
- ah = ds.byte(bx);
- _inc(bx);
- _cmp(al, dh);
- if (!flags.c())
- goto toplot;
- _cmp(ah, dh);
- if (!flags.c())
- goto nodistort;
- _add(al, ah);
- if (flags.s())
- goto botok;
- _xor(al, al);
- _stosb();
- if (--cx)
- goto slow;
- return /* (doneit) */;
-botok:
- _xor(al, dh);
- _stosb();
- if (--cx)
- goto slow;
- return /* (doneit) */;
-toplot:
- _cmp(ah, dh);
- if (flags.c())
- goto nodistort;
- _add(al, ah);
- if (!flags.s())
- goto topok;
- al = dl;
- _stosb();
- if (--cx)
- goto slow;
- return /* (doneit) */;
-topok:
- _xor(al, dh);
- _stosb();
- if (--cx)
- goto slow;
- return /* (doneit) */;
-nodistort:
- _add(al, ah);
- _xor(al, dh);
- _stosb();
- if (--cx)
- goto slow;
- return /* (doneit) */;
-lowvolumemix:
- _lodsb();
- push(bx);
- bh = data.byte(kVolume);
- _add(bh, 63);
- bl = al;
- al = es.byte(bx);
- bx = pop();
- ah = ds.byte(bx);
- _inc(bx);
- _cmp(al, dh);
- if (!flags.c())
- goto toplotv;
- _cmp(ah, dh);
- if (!flags.c())
- goto nodistortv;
- _add(al, ah);
- if (flags.s())
- goto botokv;
- _xor(al, al);
- _stosb();
- if (--cx)
- goto lowvolumemix;
- return /* (doneit) */;
-botokv:
- _xor(al, dh);
- _stosb();
- if (--cx)
- goto lowvolumemix;
- return /* (doneit) */;
-toplotv:
- _cmp(ah, dh);
- if (flags.c())
- goto nodistortv;
- _add(al, ah);
- if (!flags.s())
- goto topokv;
- al = dl;
- _stosb();
- if (--cx)
- goto lowvolumemix;
- return /* (doneit) */;
-topokv:
- _xor(al, dh);
- _stosb();
- if (--cx)
- goto lowvolumemix;
- return /* (doneit) */;
-nodistortv:
- _add(al, ah);
- _xor(al, dh);
- _stosb();
- if (--cx)
- goto lowvolumemix;
-}
-
void DreamGenContext::entrytexts() {
STACK_CHECK;
_cmp(data.byte(kLocation), 21);
@@ -17596,7 +13702,7 @@ void DreamGenContext::allocatebuffers() {
allocatemem();
data.word(kMapdata) = ax;
trysoundalloc();
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0)/16;
+ bx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+991-534+68-0)/16;
allocatemem();
data.word(kBuffers) = ax;
trysoundalloc();
@@ -17623,7 +13729,7 @@ void DreamGenContext::allocatebuffers() {
void DreamGenContext::clearbuffers() {
STACK_CHECK;
es = data.word(kBuffers);
- cx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0)/2;
+ cx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+991-534+68-0)/2;
ax = 0;
di = 0;
_stosw(cx, true);
@@ -17633,13 +13739,13 @@ void DreamGenContext::clearbuffers() {
di = 0;
_stosw(cx, true);
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64));
ds = cs;
si = 534;
cx = (991-534);
_movsb(cx, true);
es = data.word(kBuffers);
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534);
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+991-534);
ds = cs;
si = 0;
cx = (68-0);
@@ -17652,16 +13758,16 @@ void DreamGenContext::clearchanges() {
es = data.word(kBuffers);
cx = (250)*2;
ax = 0x0ffff;
- di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
+ di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
_stosw(cx, true);
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64));
es = cs;
di = 534;
cx = (991-534);
_movsb(cx, true);
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534);
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+991-534);
es = cs;
di = 0;
cx = (68-0);
@@ -17734,84 +13840,6 @@ void DreamGenContext::clearrest() {
deallocatemem();
}
-void DreamGenContext::parseblaster() {
- STACK_CHECK;
-lookattail:
- al = es.byte(bx);
- _cmp(al, 0);
- if (flags.z())
- return /* (endtail) */;
- _cmp(al, 13);
- if (flags.z())
- return /* (endtail) */;
- _cmp(al, 'i');
- if (flags.z())
- goto issoundint;
- _cmp(al, 'I');
- if (flags.z())
- goto issoundint;
- _cmp(al, 'b');
- if (flags.z())
- goto isbright;
- _cmp(al, 'B');
- if (flags.z())
- goto isbright;
- _cmp(al, 'a');
- if (flags.z())
- goto isbaseadd;
- _cmp(al, 'A');
- if (flags.z())
- goto isbaseadd;
- _cmp(al, 'n');
- if (flags.z())
- goto isnosound;
- _cmp(al, 'N');
- if (flags.z())
- goto isnosound;
- _cmp(al, 'd');
- if (flags.z())
- goto isdma;
- _cmp(al, 'D');
- if (flags.z())
- goto isdma;
- _inc(bx);
- if (--cx)
- goto lookattail;
- return;
-issoundint:
- al = es.byte(bx+1);
- _sub(al, '0');
- data.byte(kSoundint) = al;
- _inc(bx);
- goto lookattail;
-isdma:
- al = es.byte(bx+1);
- _sub(al, '0');
- data.byte(kSounddmachannel) = al;
- _inc(bx);
- goto lookattail;
-isbaseadd:
- push(cx);
- al = es.byte(bx+2);
- _sub(al, '0');
- ah = 0;
- cl = 4;
- _shl(ax, cl);
- _add(ax, 0x200);
- data.word(kSoundbaseadd) = ax;
- cx = pop();
- _inc(bx);
- goto lookattail;
-isbright:
- data.byte(kBrightness) = 1;
- _inc(bx);
- goto lookattail;
-isnosound:
- data.byte(kSoundint) = 255;
- _inc(bx);
- goto lookattail;
-}
-
void DreamGenContext::startup() {
STACK_CHECK;
data.byte(kCurrentkey) = 0;
@@ -18217,96 +14245,14 @@ notzeronum:
ch = 1;
}
-void DreamGenContext::walkandexamine() {
- STACK_CHECK;
- finishedwalking();
- if (!flags.z())
- return /* (noobselect) */;
- al = data.byte(kWalkexamtype);
- data.byte(kCommandtype) = al;
- al = data.byte(kWalkexamnum);
- data.byte(kCommand) = al;
- data.byte(kWalkandexam) = 0;
- _cmp(data.byte(kCommandtype), 5);
- if (flags.z())
- return /* (noobselect) */;
- examineob();
- return;
-wantstowalk:
- setwalk();
- data.byte(kReasseschanges) = 1;
- return;
-diff:
- data.byte(kCommand) = al;
- data.byte(kCommandtype) = ah;
- _cmp(data.byte(kLinepointer), 254);
- if (!flags.z())
- goto middleofwalk;
- _cmp(data.word(kWatchingtime), 0);
- if (!flags.z())
- goto middleofwalk;
- al = data.byte(kFacing);
- _cmp(al, data.byte(kTurntoface));
- if (!flags.z())
- goto middleofwalk;
- _cmp(data.byte(kCommandtype), 3);
- if (!flags.z())
- goto notblock;
- bl = data.byte(kManspath);
- _cmp(bl, data.byte(kPointerspath));
- if (!flags.z())
- goto dontcheck;
- cl = data.byte(kRyanx);
- _add(cl, 12);
- ch = data.byte(kRyany);
- _add(ch, 12);
- checkone();
- _cmp(cl, 2);
- if (flags.c())
- goto isblock;
-dontcheck:
- getflagunderp();
- _cmp(data.byte(kLastflag), 2);
- if (flags.c())
- goto isblock;
- _cmp(data.byte(kLastflag), 128);
- if (!flags.c())
- goto isblock;
- goto toofaraway;
-notblock:
- bl = data.byte(kManspath);
- _cmp(bl, data.byte(kPointerspath));
- if (!flags.z())
- goto toofaraway;
- _cmp(data.byte(kCommandtype), 3);
- if (flags.z())
- goto isblock;
- _cmp(data.byte(kCommandtype), 5);
- if (flags.z())
- goto isaperson;
- examineobtext();
- return;
-middleofwalk:
- blocknametext();
- return;
-isblock:
- blocknametext();
- return;
-isaperson:
- personnametext();
- return;
-toofaraway:
- walktotext();
-}
-
void DreamGenContext::mainscreen() {
STACK_CHECK;
data.byte(kInmaparea) = 0;
- bx = 5122;
+ bx = offset_mainlist;
_cmp(data.byte(kWatchon), 1);
if (flags.z())
goto checkmain;
- bx = 5184;
+ bx = offset_mainlist2;
checkmain:
checkcoords();
_cmp(data.byte(kWalkandexam), 0);
@@ -18346,43 +14292,6 @@ alreadyrun:
data.byte(kLastweapon) = 8;
}
-void DreamGenContext::checkcoords() {
- STACK_CHECK;
- _cmp(data.byte(kNewlocation), 255);
- if (flags.z())
- goto loop048;
- return;
-loop048:
- ax = cs.word(bx);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- return /* (nonefound) */;
- push(bx);
- _cmp(data.word(kMousex), ax);
- if (flags.l())
- goto over045;
- ax = cs.word(bx+2);
- _cmp(data.word(kMousex), ax);
- if (!flags.l())
- goto over045;
- ax = cs.word(bx+4);
- _cmp(data.word(kMousey), ax);
- if (flags.l())
- goto over045;
- ax = cs.word(bx+6);
- _cmp(data.word(kMousey), ax);
- if (!flags.l())
- goto over045;
- ax = cs.word(bx+8);
- __dispatch_call(ax);
- ax = pop();
- return;
-over045:
- bx = pop();
- _add(bx, 10);
- goto loop048;
-}
-
void DreamGenContext::identifyob() {
STACK_CHECK;
_cmp(data.word(kWatchingtime), 0);
@@ -18446,203 +14355,6 @@ nothingund:
blank();
}
-void DreamGenContext::checkifperson() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5));
- cx = 12;
-identifyreel:
- push(cx);
- _cmp(es.byte(bx+4), 255);
- if (flags.z())
- goto notareelid;
- push(es);
- push(bx);
- push(ax);
- ax = es.word(bx+0);
- data.word(kReelpointer) = ax;
- getreelstart();
- _cmp(es.word(si+2), 0x0ffff);
- if (!flags.z())
- goto notblankpers;
- _add(si, 5);
-notblankpers:
- cx = es.word(si+2);
- ax = es.word(si+0);
- push(cx);
- getreelframeax();
- cx = pop();
- _add(cl, es.byte(bx+4));
- _add(ch, es.byte(bx+5));
- dx = cx;
- _add(dl, es.byte(bx+0));
- _add(dh, es.byte(bx+1));
- ax = pop();
- bx = pop();
- es = pop();
- _cmp(al, cl);
- if (flags.c())
- goto notareelid;
- _cmp(ah, ch);
- if (flags.c())
- goto notareelid;
- _cmp(al, dl);
- if (!flags.c())
- goto notareelid;
- _cmp(ah, dh);
- if (!flags.c())
- goto notareelid;
- cx = pop();
- ax = es.word(bx+2);
- data.word(kPersondata) = ax;
- al = es.byte(bx+4);
- ah = 5;
- obname();
- al = 0;
- _cmp(al, 1);
- return;
-notareelid:
- cx = pop();
- _add(bx, 5);
- _dec(cx);
- if (!flags.z())
- goto identifyreel;
-}
-
-void DreamGenContext::checkifset() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32))+(127*5);
- cx = 127;
-identifyset:
- _cmp(es.byte(bx+4), 255);
- if (flags.z())
- goto notasetid;
- _cmp(al, es.byte(bx));
- if (flags.c())
- goto notasetid;
- _cmp(al, es.byte(bx+2));
- if (!flags.c())
- goto notasetid;
- _cmp(ah, es.byte(bx+1));
- if (flags.c())
- goto notasetid;
- _cmp(ah, es.byte(bx+3));
- if (!flags.c())
- goto notasetid;
- pixelcheckset();
- if (flags.z())
- goto notasetid;
- isitdescribed();
- if (flags.z())
- goto notasetid;
- al = es.byte(bx+4);
- ah = 1;
- obname();
- al = 0;
- _cmp(al, 1);
- return;
-notasetid:
- _sub(bx, 5);
- _dec(cx);
- _cmp(cx, -1);
- if (!flags.z())
- goto identifyset;
-}
-
-void DreamGenContext::checkifex() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5))+(99*5);
- cx = 99;
-identifyex:
- _cmp(es.byte(bx+4), 255);
- if (flags.z())
- goto notanexid;
- _cmp(al, es.byte(bx));
- if (flags.c())
- goto notanexid;
- _cmp(al, es.byte(bx+2));
- if (!flags.c())
- goto notanexid;
- _cmp(ah, es.byte(bx+1));
- if (flags.c())
- goto notanexid;
- _cmp(ah, es.byte(bx+3));
- if (!flags.c())
- goto notanexid;
- al = es.byte(bx+4);
- ah = 4;
- obname();
- al = 1;
- _cmp(al, 0);
- return;
-notanexid:
- _sub(bx, 5);
- _dec(cx);
- _cmp(cx, -1);
- if (!flags.z())
- goto identifyex;
-}
-
-void DreamGenContext::checkiffree() {
- STACK_CHECK;
- es = data.word(kBuffers);
- bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5))+(79*5);
- cx = 79;
-identifyfree:
- _cmp(es.byte(bx+4), 255);
- if (flags.z())
- goto notafreeid;
- _cmp(al, es.byte(bx));
- if (flags.c())
- goto notafreeid;
- _cmp(al, es.byte(bx+2));
- if (!flags.c())
- goto notafreeid;
- _cmp(ah, es.byte(bx+1));
- if (flags.c())
- goto notafreeid;
- _cmp(ah, es.byte(bx+3));
- if (!flags.c())
- goto notafreeid;
- al = es.byte(bx+4);
- ah = 2;
- obname();
- al = 0;
- _cmp(al, 1);
- return;
-notafreeid:
- _sub(bx, 5);
- _dec(cx);
- _cmp(cx, -1);
- if (!flags.z())
- goto identifyfree;
-}
-
-void DreamGenContext::isitdescribed() {
- STACK_CHECK;
- push(ax);
- push(cx);
- push(es);
- push(bx);
- al = es.byte(bx+4);
- ah = 0;
- _add(ax, ax);
- bx = ax;
- es = data.word(kSetdesc);
- _add(bx, (0));
- ax = es.word(bx);
- _add(ax, (0+(130*2)));
- bx = ax;
- dl = es.byte(bx);
- bx = pop();
- es = pop();
- cx = pop();
- ax = pop();
- _cmp(dl, 0);
-}
-
void DreamGenContext::findpathofpoint() {
STACK_CHECK;
push(ax);
@@ -18730,118 +14442,6 @@ gotfirst:
al = es.byte(bx+6);
}
-void DreamGenContext::turnpathon() {
- STACK_CHECK;
- push(ax);
- push(ax);
- cl = 255;
- ch = data.byte(kRoomnum);
- _add(ch, 100);
- findormake();
- ax = pop();
- getroomspaths();
- ax = pop();
- _cmp(al, 255);
- if (flags.z())
- return /* (nopathon) */;
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = 255;
- es.byte(bx+6) = al;
-}
-
-void DreamGenContext::turnpathoff() {
- STACK_CHECK;
- push(ax);
- push(ax);
- cl = 0;
- ch = data.byte(kRoomnum);
- _add(ch, 100);
- findormake();
- ax = pop();
- getroomspaths();
- ax = pop();
- _cmp(al, 255);
- if (flags.z())
- return /* (nopathoff) */;
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = 0;
- es.byte(bx+6) = al;
-}
-
-void DreamGenContext::turnanypathon() {
- STACK_CHECK;
- push(ax);
- push(ax);
- cl = 255;
- ch = ah;
- _add(ch, 100);
- findormake();
- ax = pop();
- al = ah;
- ah = 0;
- cx = 144;
- _mul(cx);
- es = data.word(kReels);
- bx = (0);
- _add(bx, ax);
- ax = pop();
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = 255;
- es.byte(bx+6) = al;
-}
-
-void DreamGenContext::turnanypathoff() {
- STACK_CHECK;
- push(ax);
- push(ax);
- cl = 0;
- ch = ah;
- _add(ch, 100);
- findormake();
- ax = pop();
- al = ah;
- ah = 0;
- cx = 144;
- _mul(cx);
- es = data.word(kReels);
- bx = (0);
- _add(bx, ax);
- ax = pop();
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = 0;
- es.byte(bx+6) = al;
-}
-
-void DreamGenContext::checkifpathison() {
- STACK_CHECK;
- push(ax);
- getroomspaths();
- ax = pop();
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = es.byte(bx+6);
- _cmp(al, 255);
-}
-
void DreamGenContext::afternewroom() {
STACK_CHECK;
_cmp(data.byte(kNowinnewroom), 0);
@@ -18885,7 +14485,7 @@ void DreamGenContext::atmospheres() {
STACK_CHECK;
cl = data.byte(kMapx);
ch = data.byte(kMapy);
- bx = 5246;
+ bx = offset_atmospherelist;
nextatmos:
al = cs.byte(bx);
_cmp(al, 255);
@@ -18991,266 +14591,6 @@ void DreamGenContext::afterintroroom() {
data.byte(kNowinnewroom) = 0;
}
-void DreamGenContext::obname() {
- STACK_CHECK;
- _cmp(data.byte(kReasseschanges), 0);
- if (flags.z())
- goto notnewpath;
- data.byte(kReasseschanges) = 0;
- goto diff;
-notnewpath:
- _cmp(ah, data.byte(kCommandtype));
- if (flags.z())
- goto notdiffob;
- goto diff;
-notdiffob:
- _cmp(al, data.byte(kCommand));
- if (!flags.z())
- goto diff;
- _cmp(data.byte(kWalkandexam), 1);
- if (flags.z())
- goto walkandexamine;
- _cmp(data.word(kMousebutton), 0);
- if (flags.z())
- return /* (noobselect) */;
- _cmp(data.byte(kCommandtype), 3);
- if (!flags.z())
- goto isntblock;
- _cmp(data.byte(kLastflag), 2);
- if (flags.c())
- return /* (noobselect) */;
-isntblock:
- bl = data.byte(kManspath);
- _cmp(bl, data.byte(kPointerspath));
- if (!flags.z())
- goto wantstowalk;
- _cmp(data.byte(kCommandtype), 3);
- if (flags.z())
- goto wantstowalk;
- finishedwalking();
- if (!flags.z())
- return /* (noobselect) */;
- _cmp(data.byte(kCommandtype), 5);
- if (flags.z())
- goto wantstotalk;
- _cmp(data.word(kWatchingtime), 0);
- if (!flags.z())
- return /* (noobselect) */;
- examineob();
- return;
-wantstotalk:
- _cmp(data.word(kWatchingtime), 0);
- if (!flags.z())
- return /* (noobselect) */;
- talk();
- return;
-walkandexamine:
- finishedwalking();
- if (!flags.z())
- return /* (noobselect) */;
- al = data.byte(kWalkexamtype);
- data.byte(kCommandtype) = al;
- al = data.byte(kWalkexamnum);
- data.byte(kCommand) = al;
- data.byte(kWalkandexam) = 0;
- _cmp(data.byte(kCommandtype), 5);
- if (flags.z())
- return /* (noobselect) */;
- examineob();
- return;
-wantstowalk:
- setwalk();
- data.byte(kReasseschanges) = 1;
- return;
-diff:
- data.byte(kCommand) = al;
- data.byte(kCommandtype) = ah;
- _cmp(data.byte(kLinepointer), 254);
- if (!flags.z())
- goto middleofwalk;
- _cmp(data.word(kWatchingtime), 0);
- if (!flags.z())
- goto middleofwalk;
- al = data.byte(kFacing);
- _cmp(al, data.byte(kTurntoface));
- if (!flags.z())
- goto middleofwalk;
- _cmp(data.byte(kCommandtype), 3);
- if (!flags.z())
- goto notblock;
- bl = data.byte(kManspath);
- _cmp(bl, data.byte(kPointerspath));
- if (!flags.z())
- goto dontcheck;
- cl = data.byte(kRyanx);
- _add(cl, 12);
- ch = data.byte(kRyany);
- _add(ch, 12);
- checkone();
- _cmp(cl, 2);
- if (flags.c())
- goto isblock;
-dontcheck:
- getflagunderp();
- _cmp(data.byte(kLastflag), 2);
- if (flags.c())
- goto isblock;
- _cmp(data.byte(kLastflag), 128);
- if (!flags.c())
- goto isblock;
- goto toofaraway;
-notblock:
- bl = data.byte(kManspath);
- _cmp(bl, data.byte(kPointerspath));
- if (!flags.z())
- goto toofaraway;
- _cmp(data.byte(kCommandtype), 3);
- if (flags.z())
- goto isblock;
- _cmp(data.byte(kCommandtype), 5);
- if (flags.z())
- goto isaperson;
- examineobtext();
- return;
-middleofwalk:
- blocknametext();
- return;
-isblock:
- blocknametext();
- return;
-isaperson:
- personnametext();
- return;
-toofaraway:
- walktotext();
-}
-
-void DreamGenContext::finishedwalking() {
- STACK_CHECK;
- _cmp(data.byte(kLinepointer), 254);
- if (!flags.z())
- return /* (iswalking) */;
- al = data.byte(kFacing);
- _cmp(al, data.byte(kTurntoface));
-}
-
-void DreamGenContext::examineobtext() {
- STACK_CHECK;
- bl = data.byte(kCommand);
- bh = data.byte(kCommandtype);
- al = 1;
- commandwithob();
-}
-
-void DreamGenContext::commandwithob() {
- STACK_CHECK;
- push(ax);
- push(ax);
- push(bx);
- push(cx);
- push(dx);
- push(es);
- push(ds);
- push(si);
- push(di);
- deltextline();
- di = pop();
- si = pop();
- ds = pop();
- es = pop();
- dx = pop();
- cx = pop();
- bx = pop();
- ax = pop();
- push(bx);
- ah = 0;
- _add(ax, ax);
- bx = ax;
- es = data.word(kCommandtext);
- ax = es.word(bx);
- _add(ax, (66*2));
- si = ax;
- di = data.word(kTextaddressx);
- bx = data.word(kTextaddressy);
- dl = data.byte(kTextlen);
- al = 0;
- ah = 0;
- printdirect();
- ax = pop();
- di = 5847;
- copyname();
- ax = pop();
- di = data.word(kLastxpos);
- _cmp(al, 0);
- if (flags.z())
- goto noadd;
- _add(di, 5);
-noadd:
- bx = data.word(kTextaddressy);
- es = cs;
- si = 5847;
- dl = data.byte(kTextlen);
- al = 0;
- ah = 0;
- printdirect();
- data.byte(kNewtextline) = 1;
-}
-
-void DreamGenContext::commandonly() {
- STACK_CHECK;
- push(ax);
- push(bx);
- push(cx);
- push(dx);
- push(es);
- push(ds);
- push(si);
- push(di);
- deltextline();
- di = pop();
- si = pop();
- ds = pop();
- es = pop();
- dx = pop();
- cx = pop();
- bx = pop();
- ax = pop();
- ah = 0;
- _add(ax, ax);
- bx = ax;
- es = data.word(kCommandtext);
- ax = es.word(bx);
- _add(ax, (66*2));
- si = ax;
- di = data.word(kTextaddressx);
- bx = data.word(kTextaddressy);
- dl = data.byte(kTextlen);
- al = 0;
- ah = 0;
- printdirect();
- data.byte(kNewtextline) = 1;
-}
-
-void DreamGenContext::printmessage() {
- STACK_CHECK;
- push(dx);
- push(bx);
- push(di);
- ah = 0;
- _add(ax, ax);
- bx = ax;
- es = data.word(kCommandtext);
- ax = es.word(bx);
- _add(ax, (66*2));
- si = ax;
- di = pop();
- bx = pop();
- dx = pop();
- al = 0;
- ah = 0;
- printdirect();
-}
-
void DreamGenContext::printmessage2() {
STACK_CHECK;
push(dx);
@@ -19280,43 +14620,6 @@ searchmess:
printdirect();
}
-void DreamGenContext::blocknametext() {
- STACK_CHECK;
- bl = data.byte(kCommand);
- bh = data.byte(kCommandtype);
- al = 0;
- commandwithob();
-}
-
-void DreamGenContext::personnametext() {
- STACK_CHECK;
- bl = data.byte(kCommand);
- _and(bl, 127);
- bh = data.byte(kCommandtype);
- al = 2;
- commandwithob();
-}
-
-void DreamGenContext::walktotext() {
- STACK_CHECK;
- bl = data.byte(kCommand);
- bh = data.byte(kCommandtype);
- al = 3;
- commandwithob();
-}
-
-void DreamGenContext::getflagunderp() {
- STACK_CHECK;
- cx = data.word(kMousex);
- _sub(cx, data.word(kMapadx));
- ax = data.word(kMousey);
- _sub(ax, data.word(kMapady));
- ch = al;
- checkone();
- data.byte(kLastflag) = cl;
- data.byte(kLastflagex) = ch;
-}
-
void DreamGenContext::setwalk() {
STACK_CHECK;
_cmp(data.byte(kLinepointer), 254);
@@ -19360,237 +14663,6 @@ holdingreel:
data.byte(kWatchmode) = 2;
}
-void DreamGenContext::autosetwalk() {
- STACK_CHECK;
- al = data.byte(kManspath);
- _cmp(data.byte(kFinaldest), al);
- if (!flags.z())
- goto notsamealready;
- return;
-notsamealready:
- getroomspaths();
- checkdest();
- push(bx);
- al = data.byte(kManspath);
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = es.byte(bx);
- ah = 0;
- _sub(ax, 12);
- data.word(kLinestartx) = ax;
- al = es.byte(bx+1);
- ah = 0;
- _sub(ax, 12);
- data.word(kLinestarty) = ax;
- bx = pop();
- al = data.byte(kDestination);
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- al = es.byte(bx);
- ah = 0;
- _sub(ax, 12);
- data.word(kLineendx) = ax;
- al = es.byte(bx+1);
- ah = 0;
- _sub(ax, 12);
- data.word(kLineendy) = ax;
- bresenhams();
- _cmp(data.byte(kLinedirection), 0);
- if (flags.z())
- goto normalline;
- al = data.byte(kLinelength);
- _dec(al);
- data.byte(kLinepointer) = al;
- data.byte(kLinedirection) = 1;
- return;
-normalline:
- data.byte(kLinepointer) = 0;
-}
-
-void DreamGenContext::checkdest() {
- STACK_CHECK;
- push(bx);
- _add(bx, 12*8);
- ah = data.byte(kManspath);
- cl = 4;
- _shl(ah, cl);
- al = data.byte(kDestination);
- cl = 24;
- ch = data.byte(kDestination);
-checkdestloop:
- dh = es.byte(bx);
- _and(dh, 0xf0);
- dl = es.byte(bx);
- _and(dl, 0xf);
- _cmp(ax, dx);
- if (!flags.z())
- goto nextcheck;
- al = es.byte(bx+1);
- _and(al, 15);
- data.byte(kDestination) = al;
- bx = pop();
- return;
-nextcheck:
- dl = es.byte(bx);
- _and(dl, 0xf0);
- _shr(dl, 1);
- _shr(dl, 1);
- _shr(dl, 1);
- _shr(dl, 1);
- dh = es.byte(bx);
- _and(dh, 0xf);
- _shl(dh, 1);
- _shl(dh, 1);
- _shl(dh, 1);
- _shl(dh, 1);
- _cmp(ax, dx);
- if (!flags.z())
- goto nextcheck2;
- ch = es.byte(bx+1);
- _and(ch, 15);
-nextcheck2:
- _add(bx, 2);
- _dec(cl);
- if (!flags.z())
- goto checkdestloop;
- data.byte(kDestination) = ch;
- bx = pop();
-}
-
-void DreamGenContext::bresenhams() {
- STACK_CHECK;
- workoutframes();
- dx = data;
- es = dx;
- di = 8173;
- si = 1;
- data.byte(kLinedirection) = 0;
- cx = data.word(kLineendx);
- _sub(cx, data.word(kLinestartx));
- if (flags.z())
- goto vertline;
- if (!flags.s())
- goto line1;
- _neg(cx);
- bx = data.word(kLineendx);
- _xchg(bx, data.word(kLinestartx));
- data.word(kLineendx) = bx;
- bx = data.word(kLineendy);
- _xchg(bx, data.word(kLinestarty));
- data.word(kLineendy) = bx;
- data.byte(kLinedirection) = 1;
-line1:
- bx = data.word(kLineendy);
- _sub(bx, data.word(kLinestarty));
- if (flags.z())
- goto horizline;
- if (!flags.s())
- goto line3;
- _neg(bx);
- _neg(si);
-line3:
- push(si);
- data.byte(kLineroutine) = 0;
- _cmp(bx, cx);
- if (flags.le())
- goto line4;
- data.byte(kLineroutine) = 1;
- _xchg(bx, cx);
-line4:
- _shl(bx, 1);
- data.word(kIncrement1) = bx;
- _sub(bx, cx);
- si = bx;
- _sub(bx, cx);
- data.word(kIncrement2) = bx;
- ax = data.word(kLinestartx);
- bx = data.word(kLinestarty);
- ah = bl;
- _inc(cx);
- bx = pop();
- _cmp(data.byte(kLineroutine), 1);
- if (flags.z())
- goto hislope;
- goto loslope;
-vertline:
- ax = data.word(kLinestarty);
- bx = data.word(kLineendy);
- cx = bx;
- _sub(cx, ax);
- if (!flags.l())
- goto line31;
- _neg(cx);
- ax = bx;
- data.byte(kLinedirection) = 1;
-line31:
- _inc(cx);
- bx = data.word(kLinestartx);
- _xchg(ax, bx);
- ah = bl;
- bx = si;
-line32:
- _stosw();
- _add(ah, bl);
- if (--cx)
- goto line32;
- goto lineexit;
-horizline:
- ax = data.word(kLinestartx);
- bx = data.word(kLinestarty);
- ah = bl;
- _inc(cx);
-horizloop:
- _stosw();
- _inc(al);
- if (--cx)
- goto horizloop;
- goto lineexit;
-loslope:
-loloop:
- _stosw();
- _inc(al);
- _or(si, si);
- if (!flags.s())
- goto line12;
- _add(si, data.word(kIncrement1));
- if (--cx)
- goto loloop;
- goto lineexit;
-line12:
- _add(si, data.word(kIncrement2));
- _add(ah, bl);
- if (--cx)
- goto loloop;
- goto lineexit;
-hislope:
-hiloop:
- _stosw();
- _add(ah, bl);
- _or(si, si);
- if (!flags.s())
- goto line23;
- _add(si, data.word(kIncrement1));
- if (--cx)
- goto hiloop;
- goto lineexit;
-line23:
- _add(si, data.word(kIncrement2));
- _inc(al);
- if (--cx)
- goto hiloop;
-lineexit:
- _sub(di, 8173);
- ax = di;
- _shr(ax, 1);
- data.byte(kLinelength) = al;
-}
-
void DreamGenContext::workoutframes() {
STACK_CHECK;
bx = data.word(kLinestartx);
@@ -19678,106 +14750,6 @@ success:
data.byte(kTurndirection) = 0;
}
-void DreamGenContext::getroomspaths() {
- STACK_CHECK;
- al = data.byte(kRoomnum);
- ah = 0;
- cx = 144;
- _mul(cx);
- es = data.word(kReels);
- bx = (0);
- _add(bx, ax);
-}
-
-void DreamGenContext::copyname() {
- STACK_CHECK;
- push(di);
- findobname();
- di = pop();
- es = cs;
- cx = 28;
-make:
- _lodsb();
- _cmp(al, ':');
- if (flags.z())
- goto finishmakename;
- _cmp(al, 0);
- if (flags.z())
- goto finishmakename;
- _stosb();
- if (--cx)
- goto make;
-finishmakename:
- _inc(cx);
- al = 0;
- _stosb();
- return;
- al = 255;
- _stosb(cx, true);
-}
-
-void DreamGenContext::findobname() {
- STACK_CHECK;
- push(ax);
- ah = 0;
- _add(ax, ax);
- bx = ax;
- ax = pop();
- _cmp(ah, 5);
- if (!flags.z())
- goto notpersonname;
- push(ax);
- _and(al, 127);
- ah = 0;
- bx = 64*2;
- _mul(bx);
- si = ax;
- ds = data.word(kPeople);
- _add(si, (0+24));
- cx = (0+24+(1026*2));
- ax = ds.word(si);
- _add(ax, cx);
- si = ax;
- ax = pop();
- return;
-notpersonname:
- _cmp(ah, 4);
- if (!flags.z())
- goto notextraname;
- ds = data.word(kExtras);
- _add(bx, (0+2080+30000+(16*114)));
- ax = ds.word(bx);
- _add(ax, (0+2080+30000+(16*114)+((114+2)*2)));
- si = ax;
- return;
-notextraname:
- _cmp(ah, 2);
- if (!flags.z())
- goto notfreename;
- ds = data.word(kFreedesc);
- _add(bx, (0));
- ax = ds.word(bx);
- _add(ax, (0+(82*2)));
- si = ax;
- return;
-notfreename:
- _cmp(ah, 1);
- if (!flags.z())
- goto notsetname;
- ds = data.word(kSetdesc);
- _add(bx, (0));
- ax = ds.word(bx);
- _add(ax, (0+(130*2)));
- si = ax;
- return;
-notsetname:
- ds = data.word(kBlockdesc);
- _add(bx, (0));
- ax = ds.word(bx);
- _add(ax, (0+(98*2)));
- si = ax;
-}
-
void DreamGenContext::showicon() {
STACK_CHECK;
_cmp(data.byte(kReallocation), 50);
@@ -19882,22 +14854,6 @@ void DreamGenContext::showman() {
showframe();
}
-void DreamGenContext::showpanel() {
- STACK_CHECK;
- ds = data.word(kIcons1);
- di = 72;
- bx = 0;
- al = 19;
- ah = 0;
- showframe();
- ds = data.word(kIcons1);
- di = 192;
- bx = 0;
- al = 19;
- ah = 0;
- showframe();
-}
-
void DreamGenContext::roomname() {
STACK_CHECK;
di = 88;
@@ -20014,63 +14970,6 @@ void DreamGenContext::zoomicon() {
showframe();
}
-void DreamGenContext::showblink() {
- STACK_CHECK;
- _cmp(data.byte(kManisoffscreen), 1);
- if (flags.z())
- return /* (finblink1) */;
- _inc(data.byte(kBlinkcount));
- _cmp(data.byte(kShadeson), 0);
- if (!flags.z())
- return /* (finblink1) */;
- _cmp(data.byte(kReallocation), 50);
- if (!flags.c())
- return /* (eyesshut) */;
- al = data.byte(kBlinkcount);
- _cmp(al, 3);
- if (!flags.z())
- return /* (finblink1) */;
- data.byte(kBlinkcount) = 0;
- al = data.byte(kBlinkframe);
- _inc(al);
- data.byte(kBlinkframe) = al;
- _cmp(al, 6);
- if (flags.c())
- goto nomorethan6;
- al = 6;
-nomorethan6:
- ah = 0;
- bx = 5888;
- _add(bx, ax);
- al = cs.byte(bx);
- ds = data.word(kIcons1);
- di = 44;
- bx = 32;
- ah = 0;
- showframe();
-}
-
-void DreamGenContext::dumpblink() {
- STACK_CHECK;
- _cmp(data.byte(kShadeson), 0);
- if (!flags.z())
- return /* (nodumpeye) */;
- _cmp(data.byte(kBlinkcount), 0);
- if (!flags.z())
- return /* (nodumpeye) */;
- al = data.byte(kBlinkframe);
- _cmp(al, 6);
- if (!flags.c())
- return /* (nodumpeye) */;
- push(ds);
- di = 44;
- bx = 32;
- cl = 16;
- ch = 12;
- multidump();
- ds = pop();
-}
-
void DreamGenContext::worktoscreenm() {
STACK_CHECK;
animpointer();
@@ -20098,53 +14997,6 @@ void DreamGenContext::allpointer() {
dumppointer();
}
-void DreamGenContext::hangonp() {
- STACK_CHECK;
- push(cx);
- _add(cx, cx);
- ax = pop();
- _add(cx, ax);
- data.word(kMaintimer) = 0;
- al = data.byte(kPointerframe);
- ah = data.byte(kPickup);
- push(ax);
- data.byte(kPointermode) = 3;
- data.byte(kPickup) = 0;
- push(cx);
- data.byte(kCommandtype) = 255;
- readmouse();
- animpointer();
- showpointer();
- vsync();
- dumppointer();
- cx = pop();
-hangloop:
- push(cx);
- delpointer();
- readmouse();
- animpointer();
- showpointer();
- vsync();
- dumppointer();
- cx = pop();
- ax = data.word(kMousebutton);
- _cmp(ax, 0);
- if (flags.z())
- goto notpressed;
- _cmp(ax, data.word(kOldbutton));
- if (!flags.z())
- goto getoutofit;
-notpressed:
- if (--cx)
- goto hangloop;
-getoutofit:
- delpointer();
- ax = pop();
- data.byte(kPointerframe) = al;
- data.byte(kPickup) = ah;
- data.byte(kPointermode) = 0;
-}
-
void DreamGenContext::hangonw() {
STACK_CHECK;
hangloopw:
@@ -20177,7 +15029,7 @@ void DreamGenContext::getunderzoom() {
di = (8)+5;
bx = (132)+4;
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
cl = 46;
ch = 40;
multiget();
@@ -20200,375 +15052,28 @@ void DreamGenContext::putunderzoom() {
di = (8)+5;
bx = (132)+4;
ds = data.word(kBuffers);
- si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
+ si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
cl = 46;
ch = 40;
multiput();
}
-void DreamGenContext::crosshair() {
- STACK_CHECK;
- _cmp(data.byte(kCommandtype), 3);
- if (flags.z())
- goto nocross;
- _cmp(data.byte(kCommandtype), 10);
- if (!flags.c())
- goto nocross;
- es = data.word(kWorkspace);
- ds = data.word(kIcons1);
- di = (8)+24;
- bx = (132)+19;
- al = 9;
- ah = 0;
- showframe();
- return;
-nocross:
- es = data.word(kWorkspace);
- ds = data.word(kIcons1);
- di = (8)+24;
- bx = (132)+19;
- al = 29;
- ah = 0;
- showframe();
-}
-
-void DreamGenContext::showpointer() {
- STACK_CHECK;
- showblink();
- di = data.word(kMousex);
- data.word(kOldpointerx) = di;
- bx = data.word(kMousey);
- data.word(kOldpointery) = bx;
- _cmp(data.byte(kPickup), 1);
- if (flags.z())
- goto itsanobject;
- push(bx);
- push(di);
- ds = data.word(kIcons1);
- al = data.byte(kPointerframe);
- _add(al, 20);
- ah = 0;
- _add(ax, ax);
- si = ax;
- _add(ax, ax);
- _add(si, ax);
- cx = ds.word(si);
- _cmp(cl, 12);
- if (!flags.c())
- goto notsmallx;
- cl = 12;
-notsmallx:
- _cmp(ch, 12);
- if (!flags.c())
- goto notsmally;
- ch = 12;
-notsmally:
- data.byte(kPointerxs) = cl;
- data.byte(kPointerys) = ch;
- push(ds);
- ds = data.word(kBuffers);
- si = (0+(180*10)+32+60);
- multiget();
- ds = pop();
- di = pop();
- bx = pop();
- push(di);
- push(bx);
- al = data.byte(kPointerframe);
- _add(al, 20);
- ah = 0;
- showframe();
- bx = pop();
- di = pop();
- return;
-itsanobject:
- al = data.byte(kItemframe);
- ds = data.word(kExtras);
- _cmp(data.byte(kObjecttype), 4);
- if (flags.z())
- goto itsfrominv;
- ds = data.word(kFreeframes);
-itsfrominv:
- cl = al;
- _add(al, al);
- _add(al, cl);
- _inc(al);
- ah = 0;
- push(ax);
- _add(ax, ax);
- si = ax;
- _add(ax, ax);
- _add(si, ax);
- ax = 2080;
- cx = ds.word(si);
- _cmp(cl, 12);
- if (!flags.c())
- goto notsmallx2;
- cl = 12;
-notsmallx2:
- _cmp(ch, 12);
- if (!flags.c())
- goto notsmally2;
- ch = 12;
-notsmally2:
- data.byte(kPointerxs) = cl;
- data.byte(kPointerys) = ch;
- ax = pop();
- push(di);
- push(bx);
- push(ax);
- push(bx);
- push(di);
- push(ds);
- al = cl;
- ah = 0;
- _shr(ax, 1);
- _sub(data.word(kOldpointerx), ax);
- _sub(di, ax);
- al = ch;
- _shr(ax, 1);
- _sub(data.word(kOldpointery), ax);
- _sub(bx, ax);
- ds = data.word(kBuffers);
- si = (0+(180*10)+32+60);
- multiget();
- ds = pop();
- di = pop();
- bx = pop();
- ax = pop();
- ah = 128;
- showframe();
- bx = pop();
- di = pop();
- ds = data.word(kIcons1);
- al = 3;
- ah = 128;
- showframe();
-}
-
-void DreamGenContext::delpointer() {
- STACK_CHECK;
- ax = data.word(kOldpointerx);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- return /* (nevershown) */;
- data.word(kDelherex) = ax;
- ax = data.word(kOldpointery);
- data.word(kDelherey) = ax;
- cl = data.byte(kPointerxs);
- data.byte(kDelxs) = cl;
- ch = data.byte(kPointerys);
- data.byte(kDelys) = ch;
- ds = data.word(kBuffers);
- si = (0+(180*10)+32+60);
- di = data.word(kDelherex);
- bx = data.word(kDelherey);
- multiput();
-}
-
-void DreamGenContext::dumppointer() {
- STACK_CHECK;
- dumpblink();
- cl = data.byte(kDelxs);
- ch = data.byte(kDelys);
- di = data.word(kDelherex);
- bx = data.word(kDelherey);
- multidump();
- bx = data.word(kOldpointery);
- di = data.word(kOldpointerx);
- _cmp(di, data.word(kDelherex));
- if (!flags.z())
- goto difffound;
- _cmp(bx, data.word(kDelherey));
- if (flags.z())
- return /* (notboth) */;
-difffound:
- cl = data.byte(kPointerxs);
- ch = data.byte(kPointerys);
- multidump();
-}
-
void DreamGenContext::undertextline() {
STACK_CHECK;
di = data.word(kTextaddressx);
bx = data.word(kTextaddressy);
+ _cmp(data.byte(kForeignrelease), 0);
+ if (flags.z())
+ goto _tmp1;
+ _sub(bx, 3);
+_tmp1:
ds = data.word(kBuffers);
si = (0);
- cl = (180);
- ch = (10);
+ cl = (228);
+ ch = (13);
multiget();
}
-void DreamGenContext::deltextline() {
- STACK_CHECK;
- di = data.word(kTextaddressx);
- bx = data.word(kTextaddressy);
- ds = data.word(kBuffers);
- si = (0);
- cl = (180);
- ch = (10);
- multiput();
-}
-
-void DreamGenContext::dumptextline() {
- STACK_CHECK;
- _cmp(data.byte(kNewtextline), 1);
- if (!flags.z())
- return /* (nodumptextline) */;
- data.byte(kNewtextline) = 0;
- di = data.word(kTextaddressx);
- bx = data.word(kTextaddressy);
- cl = (180);
- ch = (10);
- multidump();
-}
-
-void DreamGenContext::animpointer() {
- STACK_CHECK;
- _cmp(data.byte(kPointermode), 2);
- if (flags.z())
- goto combathand;
- _cmp(data.byte(kPointermode), 3);
- if (flags.z())
- goto mousehand;
- _cmp(data.word(kWatchingtime), 0);
- if (flags.z())
- goto notwatchpoint;
- data.byte(kPointerframe) = 11;
- return;
-notwatchpoint:
- data.byte(kPointerframe) = 0;
- _cmp(data.byte(kInmaparea), 0);
- if (flags.z())
- return /* (gothand) */;
- _cmp(data.byte(kPointerfirstpath), 0);
- if (flags.z())
- return /* (gothand) */;
- getflagunderp();
- _cmp(cl, 2);
- if (flags.c())
- return /* (gothand) */;
- _cmp(cl, 128);
- if (!flags.c())
- return /* (gothand) */;
- data.byte(kPointerframe) = 3;
- _test(cl, 4);
- if (!flags.z())
- return /* (gothand) */;
- data.byte(kPointerframe) = 4;
- _test(cl, 16);
- if (!flags.z())
- return /* (gothand) */;
- data.byte(kPointerframe) = 5;
- _test(cl, 2);
- if (!flags.z())
- return /* (gothand) */;
- data.byte(kPointerframe) = 6;
- _test(cl, 8);
- if (!flags.z())
- return /* (gothand) */;
- data.byte(kPointerframe) = 8;
- return;
-mousehand:
- _cmp(data.byte(kPointerspeed), 0);
- if (flags.z())
- goto rightspeed3;
- _dec(data.byte(kPointerspeed));
- goto finflashmouse;
-rightspeed3:
- data.byte(kPointerspeed) = 5;
- _inc(data.byte(kPointercount));
- _cmp(data.byte(kPointercount), 16);
- if (!flags.z())
- goto finflashmouse;
- data.byte(kPointercount) = 0;
-finflashmouse:
- al = data.byte(kPointercount);
- ah = 0;
- bx = 5895;
- _add(bx, ax);
- al = cs.byte(bx);
- data.byte(kPointerframe) = al;
- return;
-combathand:
- data.byte(kPointerframe) = 0;
- _cmp(data.byte(kReallocation), 14);
- if (!flags.z())
- return /* (notarrow) */;
- _cmp(data.byte(kCommandtype), 211);
- if (!flags.z())
- return /* (notarrow) */;
- data.byte(kPointerframe) = 5;
-}
-
-void DreamGenContext::readmouse() {
- STACK_CHECK;
- ax = data.word(kMousebutton);
- data.word(kOldbutton) = ax;
- ax = data.word(kMousex);
- data.word(kOldx) = ax;
- ax = data.word(kMousey);
- data.word(kOldy) = ax;
- mousecall();
- data.word(kMousex) = cx;
- data.word(kMousey) = dx;
- data.word(kMousebutton) = bx;
-}
-
-void DreamGenContext::readmouse1() {
- STACK_CHECK;
- ax = data.word(kMousex);
- data.word(kOldx) = ax;
- ax = data.word(kMousey);
- data.word(kOldy) = ax;
- mousecall();
- data.word(kMousex) = cx;
- data.word(kMousey) = dx;
- data.word(kMousebutton1) = bx;
-}
-
-void DreamGenContext::readmouse2() {
- STACK_CHECK;
- ax = data.word(kMousex);
- data.word(kOldx) = ax;
- ax = data.word(kMousey);
- data.word(kOldy) = ax;
- mousecall();
- data.word(kMousex) = cx;
- data.word(kMousey) = dx;
- data.word(kMousebutton2) = bx;
-}
-
-void DreamGenContext::readmouse3() {
- STACK_CHECK;
- ax = data.word(kMousex);
- data.word(kOldx) = ax;
- ax = data.word(kMousey);
- data.word(kOldy) = ax;
- mousecall();
- data.word(kMousex) = cx;
- data.word(kMousey) = dx;
- data.word(kMousebutton3) = bx;
-}
-
-void DreamGenContext::readmouse4() {
- STACK_CHECK;
- ax = data.word(kMousebutton);
- data.word(kOldbutton) = ax;
- ax = data.word(kMousex);
- data.word(kOldx) = ax;
- ax = data.word(kMousey);
- data.word(kOldy) = ax;
- mousecall();
- data.word(kMousex) = cx;
- data.word(kMousey) = dx;
- ax = data.word(kMousebutton1);
- _or(ax, data.word(kMousebutton2));
- _or(ax, data.word(kMousebutton3));
- _or(bx, ax);
- data.word(kMousebutton) = bx;
-}
-
void DreamGenContext::readkey() {
STACK_CHECK;
bx = data.word(kBufferout);
@@ -20578,7 +15083,7 @@ void DreamGenContext::readkey() {
_inc(bx);
_and(bx, 15);
data.word(kBufferout) = bx;
- di = 5912;
+ di = offset_keybuffer;
_add(di, bx);
al = cs.byte(di);
data.byte(kCurrentkey) = al;
@@ -20618,16 +15123,6 @@ void DreamGenContext::randomnum2() {
ds = pop();
}
-void DreamGenContext::hangon() {
- STACK_CHECK;
-hangonloop:
- push(cx);
- vsync();
- cx = pop();
- if (--cx)
- goto hangonloop;
-}
-
void DreamGenContext::loadtraveltext() {
STACK_CHECK;
dx = 2234;
@@ -20902,142 +15397,6 @@ blimey:
es = pop();
}
-void DreamGenContext::startloading() {
- STACK_CHECK;
- data.byte(kCombatcount) = 0;
- al = cs.byte(bx+13);
- data.byte(kRoomssample) = al;
- al = cs.byte(bx+15);
- data.byte(kMapx) = al;
- al = cs.byte(bx+16);
- data.byte(kMapy) = al;
- al = cs.byte(bx+20);
- data.byte(kLiftflag) = al;
- al = cs.byte(bx+21);
- data.byte(kManspath) = al;
- data.byte(kDestination) = al;
- data.byte(kFinaldest) = al;
- al = cs.byte(bx+22);
- data.byte(kFacing) = al;
- data.byte(kTurntoface) = al;
- al = cs.byte(bx+23);
- data.byte(kCounttoopen) = al;
- al = cs.byte(bx+24);
- data.byte(kLiftpath) = al;
- al = cs.byte(bx+25);
- data.byte(kDoorpath) = al;
- data.byte(kLastweapon) = -1;
- al = cs.byte(bx+27);
- push(ax);
- al = cs.byte(bx+31);
- ah = data.byte(kReallocation);
- data.byte(kReallocation) = al;
- dx = bx;
- openfile();
- readheader();
- allocateload();
- ds = ax;
- data.word(kBackdrop) = ax;
- dx = (0);
- loadseg();
- ds = data.word(kWorkspace);
- dx = (0);
- cx = 132*66;
- al = 0;
- fillspace();
- loadseg();
- sortoutmap();
- allocateload();
- data.word(kSetframes) = ax;
- ds = ax;
- dx = (0);
- loadseg();
- ds = data.word(kSetdat);
- dx = 0;
- cx = (64*128);
- al = 255;
- fillspace();
- loadseg();
- allocateload();
- data.word(kReel1) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kReel2) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kReel3) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kReels) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kPeople) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kSetdesc) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kBlockdesc) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kRoomdesc) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- allocateload();
- data.word(kFreeframes) = ax;
- ds = ax;
- dx = 0;
- loadseg();
- ds = data.word(kFreedat);
- dx = 0;
- cx = (16*80);
- al = 255;
- fillspace();
- loadseg();
- allocateload();
- data.word(kFreedesc) = ax;
- ds = ax;
- dx = (0);
- loadseg();
- closefile();
- findroominloc();
- deletetaken();
- setallchanges();
- autoappear();
- al = data.byte(kNewlocation);
- getroomdata();
- data.byte(kLastweapon) = -1;
- data.byte(kMandead) = 0;
- data.word(kLookcounter) = 160;
- data.byte(kNewlocation) = 255;
- data.byte(kLinepointer) = 254;
- ax = pop();
- _cmp(al, 255);
- if (flags.z())
- goto dontwalkin;
- data.byte(kManspath) = al;
- push(bx);
- autosetwalk();
- bx = pop();
-dontwalkin:
- findxyfrompath();
-}
-
void DreamGenContext::disablepath() {
STACK_CHECK;
push(cx);
@@ -21072,22 +15431,6 @@ lookx2:
es.byte(bx+6) = al;
}
-void DreamGenContext::findxyfrompath() {
- STACK_CHECK;
- getroomspaths();
- al = data.byte(kManspath);
- ah = 0;
- _add(ax, ax);
- _add(ax, ax);
- _add(ax, ax);
- _add(bx, ax);
- ax = es.word(bx);
- _sub(al, 12);
- _sub(ah, 12);
- data.byte(kRyanx) = al;
- data.byte(kRyany) = ah;
-}
-
void DreamGenContext::findroominloc() {
STACK_CHECK;
al = data.byte(kMapy);
@@ -21107,25 +15450,6 @@ lookx:
data.byte(kRoomnum) = cl;
}
-void DreamGenContext::getroomdata() {
- STACK_CHECK;
- ah = 0;
- cx = 32;
- _mul(cx);
- bx = 6187;
- _add(bx, ax);
-}
-
-void DreamGenContext::readheader() {
- STACK_CHECK;
- ds = cs;
- dx = 6091;
- cx = (6187-6091);
- readfromfile();
- es = cs;
- di = 6141;
-}
-
void DreamGenContext::allocateload() {
STACK_CHECK;
push(es);
@@ -21138,23 +15462,6 @@ void DreamGenContext::allocateload() {
es = pop();
}
-void DreamGenContext::fillspace() {
- STACK_CHECK;
- push(es);
- push(ds);
- push(dx);
- push(di);
- push(bx);
- di = dx;
- es = ds;
- _stosb(cx, true);
- bx = pop();
- di = pop();
- dx = pop();
- ds = pop();
- es = pop();
-}
-
void DreamGenContext::getridoftemp() {
STACK_CHECK;
es = data.word(kTempgraphics);
@@ -21225,1469 +15532,1735 @@ void DreamGenContext::readsetdata() {
closefile();
}
-void DreamGenContext::makename() {
- STACK_CHECK;
- si = dx;
- di = 6061;
-transfer:
- al = cs.byte(si);
- cs.byte(di) = al;
- _inc(si);
- _inc(di);
- _cmp(al, 0);
- if (!flags.z())
- goto transfer;
- dx = 6059;
-}
-
-void DreamGenContext::dreamweb() {
- STACK_CHECK;
- seecommandtail();
- checkbasemem();
- soundstartup();
- setkeyboardint();
- setupemm();
- allocatebuffers();
- setmouse();
- fadedos();
- gettime();
- clearbuffers();
- clearpalette();
- set16colpalette();
- readsetdata();
- data.byte(kWongame) = 0;
- dx = 1909;
- loadsample();
- setsoundoff();
- scanfornames();
- _cmp(al, 0);
- if (!flags.z())
- goto dodecisions;
- setmode();
- loadpalfromiff();
- titles();
- credits();
- goto playgame;
-dodecisions:
- cls();
- setmode();
- decide();
- _cmp(data.byte(kQuitrequested), 0);
- if (!flags.z())
- return /* (exitgame) */;
- _cmp(data.byte(kGetback), 4);
- if (flags.z())
- goto mainloop;
- titles();
- _cmp(data.byte(kQuitrequested), 0);
- if (!flags.z())
- return /* (exitgame) */;
- credits();
-playgame:
- _cmp(data.byte(kQuitrequested), 0);
- if (!flags.z())
- return /* (exitgame) */;
- clearchanges();
- setmode();
- loadpalfromiff();
- data.byte(kLocation) = 255;
- data.byte(kRoomafterdream) = 1;
- data.byte(kNewlocation) = 35;
- data.byte(kVolume) = 7;
- loadroom();
- clearsprites();
- initman();
- entrytexts();
- entryanims();
- data.byte(kDestpos) = 3;
- initialinv();
- data.byte(kLastflag) = 32;
- startup1();
- data.byte(kVolumeto) = 0;
- data.byte(kVolumedirection) = -1;
- data.byte(kCommandtype) = 255;
- goto mainloop;
-loadnew:
- clearbeforeload();
- loadroom();
- clearsprites();
- initman();
- entrytexts();
- entryanims();
- data.byte(kNewlocation) = 255;
- startup();
- data.byte(kCommandtype) = 255;
- worktoscreenm();
- goto mainloop;
- data.byte(kNewlocation) = 255;
- clearsprites();
- initman();
- startup();
- data.byte(kCommandtype) = 255;
-mainloop:
- _cmp(data.byte(kQuitrequested), 0);
- if (!flags.z())
- return /* (exitgame) */;
- screenupdate();
- _cmp(data.byte(kWongame), 0);
- if (!flags.z())
- goto endofgame;
- _cmp(data.byte(kMandead), 1);
- if (flags.z())
- goto gameover;
- _cmp(data.byte(kMandead), 2);
- if (flags.z())
- goto gameover;
- _cmp(data.word(kWatchingtime), 0);
- if (flags.z())
- goto notwatching;
- al = data.byte(kFinaldest);
- _cmp(al, data.byte(kManspath));
- if (!flags.z())
- goto mainloop;
- _dec(data.word(kWatchingtime));
- if (!flags.z())
- goto mainloop;
-notwatching:
- _cmp(data.byte(kMandead), 4);
- if (flags.z())
- goto gameover;
- _cmp(data.byte(kNewlocation), 255);
- if (!flags.z())
- goto loadnew;
- goto mainloop;
-gameover:
- clearbeforeload();
- showgun();
- fadescreendown();
- cx = 100;
- hangon();
- goto dodecisions;
-endofgame:
- clearbeforeload();
- fadescreendowns();
- cx = 200;
- hangon();
- endgame();
- { quickquit2(); return; };
-}
-
void DreamGenContext::__start() {
static const uint8 src[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0000: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x0010: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0020: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0xff, 0x00,
+ //0x0030: .... .... .... ....
0xff, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0xb6,
+ //0x0040: ...0 .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0050: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0060: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0070: .... ...h .&.. ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0080: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0090: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x00a0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
+ //0x00b0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x00c0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x00d0: .... .... .... ....
0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x00e0: .. .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x00f0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0100: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0110: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0120: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0130: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0140: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0150: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ //0x0160: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00,
+ //0x0170: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0180: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0190: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ //0x01a0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x01b0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x01c0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x01d0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x01e0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x01f0: .... .... .... ....
0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x0200: .... .... .... ....
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x14, 0x00, 0x02, 0x00, 0x01, 0x01, 0x37,
+ //0x0210: .... ..., .... ...7
0x00, 0x00, 0x00, 0x32, 0x14, 0x00, 0x18, 0x16, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x18, 0x21,
+ //0x0220: ...2 .... .J.. ...!
0x0a, 0x4b, 0x00, 0x01, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x02, 0x01, 0x2c,
+ //0x0230: .K.. ..., .... ...,
0x00, 0x60, 0x00, 0x03, 0x00, 0x04, 0x01, 0x2c, 0x00, 0x76, 0x00, 0x02, 0x00, 0x05, 0x01, 0x2c,
+ //0x0240: .`.. ..., .v.. ...,
0x0a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, 0x16, 0x14, 0x35, 0x00, 0x03, 0x00, 0x00, 0x05, 0x16,
+ //0x0250: .... .... .5.. ....
0x14, 0x28, 0x00, 0x01, 0x00, 0x02, 0x05, 0x16, 0x14, 0x32, 0x00, 0x01, 0x00, 0x03, 0x02, 0x0b,
+ //0x0260: .(.. .... .2.. ....
0x0a, 0xc0, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0b, 0x0a, 0xb6, 0x00, 0x02, 0x00, 0x01, 0x08, 0x0b,
+ //0x0270: .... .... .... ....
0x0a, 0x00, 0x00, 0x02, 0x00, 0x01, 0x17, 0x00, 0x32, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1c, 0x0b,
+ //0x0280: .... .... 2... ....
0x14, 0xfa, 0x00, 0x04, 0x00, 0x00, 0x17, 0x00, 0x32, 0x2b, 0x00, 0x02, 0x00, 0x08, 0x17, 0x0b,
+ //0x0290: .... .... 2+.. ....
0x28, 0x82, 0x00, 0x02, 0x00, 0x01, 0x17, 0x16, 0x28, 0x7a, 0x00, 0x02, 0x00, 0x02, 0x17, 0x16,
+ //0x02a0: (... .... (z.. ....
0x28, 0x69, 0x00, 0x02, 0x00, 0x03, 0x17, 0x16, 0x28, 0x51, 0x00, 0x02, 0x00, 0x04, 0x17, 0x0b,
+ //0x02b0: (i.. .... (Q.. ....
0x28, 0x87, 0x00, 0x02, 0x00, 0x05, 0x17, 0x16, 0x28, 0x91, 0x00, 0x02, 0x00, 0x06, 0x04, 0x16,
+ //0x02c0: (... .... (... ....
0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x2d, 0x16, 0x1e, 0xc8, 0x00, 0x00, 0x00, 0x14, 0x2d, 0x16,
+ //0x02d0: .... ..-. .... ..-.
0x1e, 0x27, 0x00, 0x02, 0x00, 0x00, 0x2d, 0x16, 0x1e, 0x19, 0x00, 0x02, 0x00, 0x00, 0x08, 0x16,
+ //0x02e0: .'.. ..-. .... ....
0x28, 0x20, 0x00, 0x02, 0x00, 0x00, 0x07, 0x0b, 0x14, 0x40, 0x00, 0x02, 0x00, 0x00, 0x16, 0x16,
+ //0x02f0: ( .. .... .@.. ....
0x14, 0x52, 0x00, 0x02, 0x00, 0x00, 0x1b, 0x0b, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00,
+ //0x0300: .R.. .... .... ....
0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x21, 0x28, 0x15, 0x00, 0x01, 0x00, 0x00, 0x1d, 0x0b,
+ //0x0310: .... ...! (... ....
0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x19, 0x00,
+ //0x0320: .... .... .... ....
0x32, 0x04, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x1e, 0x79, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16,
+ //0x0330: 2... ..2. .y.. ..2.
0x1e, 0x00, 0x00, 0x14, 0x00, 0x00, 0x34, 0x16, 0x1e, 0xc0, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16,
+ //0x0340: .... ..4. .... ..4.
0x1e, 0xe9, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x28, 0x68, 0x00, 0x37, 0x00, 0x00, 0x35, 0x21,
+ //0x0350: .... ..2. (h.7 ..5!
0x00, 0x63, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x28, 0x00, 0x00, 0x03, 0x00, 0x00, 0x32, 0x16,
+ //0x0360: .c.. ..2. (... ..2.
0x1e, 0xa2, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16, 0x1e, 0x39, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16,
+ //0x0370: .... ..4. .9.. ..4.
0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x36, 0x00, 0x00, 0x48, 0x00, 0x03, 0x00, 0x00, 0x37, 0x2c,
+ //0x0380: .... ..6. .H.. ..7,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0e, 0x16,
+ //0x0390: .... .... .... ....
0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x16, 0x00, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x0a, 0x16,
+ //0x03a0: .... .... .,.. ....
0x1e, 0xae, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x16, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0x0b,
+ //0x03b0: .... .... .... ....
0x14, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0b, 0x0b, 0x1e, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0b, 0x16,
+ //0x03c0: ...2 .... ...2 ....
0x14, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0e, 0x21, 0x28, 0x00, 0x00, 0x32, 0x14, 0x00, 0xff, 0x7c,
+ //0x03d0: ...2 ...! (..2 ...|
0xc0, 0x80, 0xc0, 0x1c, 0xc0, 0x20, 0xc0, 0x00, 0xc1, 0x10, 0xc0, 0x18, 0xc0, 0xf4, 0xc0, 0x0c,
+ //0x03e0: .... . .. .... ....
0xc0, 0x24, 0xc0, 0x28, 0xc0, 0x2c, 0xc0, 0x30, 0xc0, 0x54, 0xc0, 0x78, 0xc0, 0x50, 0xc0, 0x74,
+ //0x03f0: .$.( .,.0 .T.x .P.t
0xc0, 0x34, 0xc0, 0x38, 0xc0, 0x40, 0xc0, 0x44, 0xc0, 0x48, 0xc0, 0x3c, 0xc0, 0x14, 0xc0, 0x88,
+ //0x0400: .4.8 .@.D .H.< ....
0xc0, 0x8c, 0xc0, 0x90, 0xc0, 0x70, 0xc0, 0xfc, 0xc0, 0x6c, 0xc0, 0x58, 0xc0, 0x68, 0xc0, 0x04,
+ //0x0410: .... .p.. .l.X .h..
0xc1, 0x64, 0xc0, 0x60, 0xc0, 0x5c, 0xc0, 0x94, 0xc0, 0x04, 0xc0, 0xa4, 0xc0, 0x9c, 0xc0, 0xa0,
+ //0x0420: .d.` .... .... ....
0xc0, 0xa8, 0xc0, 0xac, 0xc0, 0x98, 0xc0, 0xb0, 0xc0, 0xb4, 0xc0, 0xc8, 0xc0, 0xcc, 0xc0, 0xd4,
+ //0x0430: .... .... .... ....
0xc0, 0xdc, 0xc0, 0xd8, 0xc0, 0x00, 0xc0, 0x08, 0xc0, 0x84, 0xc0, 0x84, 0xc0, 0x84, 0xc0, 0x84,
+ //0x0440: .... .... .... ....
0xc0, 0x00, 0x3c, 0x21, 0x47, 0x0b, 0x52, 0x16, 0x5d, 0x01, 0x2c, 0x0a, 0x10, 0x04, 0x0b, 0x1e,
+ //0x0450: ..<! G.R. ].,. ....
0x0e, 0x04, 0x16, 0x1e, 0x0e, 0x03, 0x21, 0x0a, 0x0e, 0x0a, 0x21, 0x1e, 0x0e, 0x0a, 0x16, 0x1e,
+ //0x0460: .... ..!. ..!. ....
0x18, 0x09, 0x16, 0x0a, 0x0e, 0x02, 0x21, 0x00, 0x0e, 0x02, 0x16, 0x00, 0x0e, 0x06, 0x0b, 0x1e,
+ //0x0470: .... ..!. .... ....
0x0e, 0x07, 0x0b, 0x14, 0x12, 0x07, 0x00, 0x14, 0x12, 0x07, 0x00, 0x1e, 0x12, 0x37, 0x2c, 0x00,
+ //0x0480: .... .... .... .7,.
0x0e, 0x05, 0x16, 0x1e, 0x0e, 0x08, 0x00, 0x0a, 0x12, 0x08, 0x0b, 0x0a, 0x12, 0x08, 0x16, 0x0a,
+ //0x0490: .... .... .... ....
0x12, 0x08, 0x21, 0x0a, 0x12, 0x08, 0x21, 0x14, 0x12, 0x08, 0x21, 0x1e, 0x12, 0x08, 0x21, 0x28,
+ //0x04a0: ..!. ..!. ..!. ..!(
0x12, 0x08, 0x16, 0x28, 0x12, 0x08, 0x0b, 0x28, 0x12, 0x15, 0x2c, 0x14, 0x12, 0xff, 0x2e, 0x05,
+ //0x04b0: ...( ...( ..,. ....
0x2f, 0x05, 0x33, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x46, 0x05, 0x2e, 0x05, 0x4d, 0x05,
+ //0x04c0: /.3. .... ..F. ..M.
0x5d, 0x05, 0x64, 0x05, 0x68, 0x05, 0x6c, 0x05, 0x70, 0x05, 0x7d, 0x05, 0x2e, 0x05, 0x2e, 0x05,
+ //0x04d0: ].d. h.l. p.}. ....
0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x9f, 0x05, 0x2e, 0x05, 0xb5, 0x05, 0xd4, 0x05, 0x2e, 0x05,
+ //0x04e0: .... .... .... ....
0xe1, 0x05, 0xf7, 0x05, 0x0d, 0x06, 0x26, 0x06, 0x39, 0x06, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05,
+ //0x04f0: .... ..&. 9... ....
0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05,
+ //0x0500: .... .... .... ....
0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x49, 0x06, 0x50, 0x06, 0x75, 0x06, 0x2e, 0x05,
+ //0x0510: .... .... I.P. u...
0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x82, 0x06, 0x86, 0x06, 0x2e, 0x05, 0x8d, 0x06, 0xff, 0x0f,
+ //0x0520: .... .... .... ....
0x01, 0x01, 0xff, 0x0c, 0x05, 0x00, 0x0d, 0x15, 0x00, 0x0f, 0x23, 0x00, 0x11, 0x32, 0x00, 0x12,
+ //0x0530: .... .... ..#. .2..
0x67, 0x00, 0x13, 0x6c, 0x00, 0xff, 0x12, 0x13, 0x00, 0x13, 0x17, 0x00, 0xff, 0x0c, 0x33, 0x00,
+ //0x0540: g..l .... .... ..3.
0x0d, 0x35, 0x00, 0x0e, 0x0e, 0x00, 0x0f, 0x14, 0x00, 0x00, 0x4e, 0x00, 0xff, 0x0c, 0x77, 0x00,
+ //0x0550: .5.. .... ..N. ..w.
0x0c, 0x91, 0x00, 0xff, 0x0d, 0x10, 0x00, 0xff, 0x0d, 0x14, 0x00, 0xff, 0x0e, 0x10, 0x00, 0xff,
+ //0x0560: .... .... .... ....
0x0f, 0x04, 0x00, 0x10, 0x08, 0x00, 0x11, 0x86, 0x00, 0x12, 0x99, 0x00, 0xff, 0x0d, 0x6c, 0x00,
+ //0x0570: .... .... .... ..l.
0x0f, 0x46, 0x01, 0x0f, 0x4b, 0x01, 0x0f, 0x50, 0x01, 0x0f, 0x56, 0x01, 0x0f, 0x5c, 0x01, 0x0f,
+ //0x0580: .F.. K..P ..V. ....
0x62, 0x01, 0x12, 0x9f, 0x00, 0x12, 0xb2, 0x00, 0x93, 0xd9, 0x00, 0x54, 0xe4, 0x00, 0xff, 0x0d,
+ //0x0590: b... .... ...T ....
0x14, 0x00, 0x0d, 0x15, 0x00, 0x0f, 0x22, 0x00, 0x0d, 0x34, 0x00, 0x0d, 0x37, 0x00, 0x19, 0x39,
+ //0x05a0: .... ..". .4.. 7..9
0x00, 0x15, 0x49, 0x00, 0xff, 0x0d, 0xc4, 0x00, 0x0d, 0xea, 0x00, 0x0d, 0x9c, 0x00, 0x0e, 0x81,
+ //0x05b0: ..I. .... .... ....
0x00, 0x0d, 0x7c, 0x00, 0x0f, 0xa2, 0x00, 0x0f, 0xc8, 0x00, 0x0f, 0xef, 0x00, 0x11, 0x63, 0x00,
+ //0x05c0: ..|. .... .... ..c.
0x0c, 0x34, 0x00, 0xff, 0x0f, 0x38, 0x00, 0x10, 0x40, 0x00, 0x13, 0x16, 0x00, 0x14, 0x21, 0x00,
+ //0x05d0: .4.. .8.. @... ..!.
0xff, 0x14, 0x0b, 0x00, 0x14, 0x0f, 0x00, 0x0f, 0x1c, 0x00, 0x0d, 0x50, 0x00, 0x15, 0x52, 0x00,
+ //0x05e0: .... .... ...P ..R.
0x93, 0x57, 0x00, 0x57, 0x80, 0x00, 0xff, 0x0c, 0x0d, 0x00, 0x0e, 0x27, 0x00, 0x0c, 0x43, 0x00,
+ //0x05f0: .W.W .... ...' ..C.
0x0c, 0x4b, 0x00, 0x0c, 0x53, 0x00, 0x0c, 0x5b, 0x00, 0x0f, 0x66, 0x00, 0xff, 0x16, 0x24, 0x00,
+ //0x0600: .K.. S..[ ..f. ..$.
0x0d, 0x7d, 0x00, 0x12, 0x58, 0x00, 0x0f, 0x6b, 0x00, 0x0e, 0x7f, 0x00, 0x0e, 0x9a, 0x00, 0x93,
+ //0x0610: .}.. X..k .... ....
0xaa, 0x00, 0x57, 0xe8, 0x00, 0xff, 0x15, 0x10, 0x00, 0x15, 0x48, 0x00, 0x15, 0xcd, 0x00, 0x16,
+ //0x0620: ..W. .... ..H. ....
0x3f, 0x00, 0x97, 0x63, 0x00, 0x58, 0x9e, 0x00, 0xff, 0x0d, 0x15, 0x00, 0x0e, 0x18, 0x00, 0x93,
+ //0x0630: ?..c .X.. .... ....
0x32, 0x00, 0x57, 0x4b, 0x00, 0x18, 0x80, 0x00, 0xff, 0x53, 0x2e, 0x00, 0x10, 0xa7, 0x00, 0xff,
+ //0x0640: 2.WK .... .S.. ....
0x10, 0x13, 0x00, 0x0e, 0x24, 0x00, 0x10, 0x32, 0x00, 0x0e, 0x41, 0x00, 0x10, 0x51, 0x00, 0x0e,
+ //0x0650: .... $..2 ..A. .Q..
0x60, 0x00, 0x10, 0x72, 0x00, 0x0e, 0x81, 0x00, 0x10, 0x93, 0x00, 0x0e, 0xa2, 0x00, 0x10, 0xb1,
+ //0x0660: `..r .... .... ....
0x00, 0x0e, 0xbf, 0x00, 0xff, 0x0d, 0x30, 0x00, 0x0e, 0x29, 0x00, 0x0f, 0x4e, 0x00, 0x10, 0x5c,
+ //0x0670: .... ..0. .).. N...
0x00, 0xff, 0x10, 0x73, 0x00, 0xff, 0x15, 0x67, 0x00, 0x14, 0xc7, 0x00, 0xff, 0x11, 0x35, 0x00,
+ //0x0680: ...s ...g .... ..5.
0x11, 0x36, 0x00, 0x11, 0x37, 0x00, 0x11, 0x38, 0x00, 0x11, 0x39, 0x00, 0x11, 0x3a, 0x00, 0x11,
+ //0x0690: .6.. 7..8 ..9. .:..
0x3b, 0x00, 0x11, 0x3d, 0x00, 0x11, 0x3f, 0x00, 0x11, 0x40, 0x00, 0x11, 0x41, 0x00, 0xff, 0x9c,
+ //0x06a0: ;..= ..?. .@.. A...
0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c,
+ //0x06b0: .... .... .... ....
0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d,
+ //0x06c0: .... .... .... ....
0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c,
+ //0x06d0: .... .... .... ....
0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c,
+ //0x06e0: .... .... .... ....
0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d,
+ //0x06f0: .... .... .... ....
0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c,
+ //0x0700: .... .... .... ....
0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9c, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x0710: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x53, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42,
+ //0x0720: WEB. S00. DREA MWEB
0x2e, 0x53, 0x30, 0x32, 0x00, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x2e, 0x44, 0x41, 0x54,
+ //0x0730: .S02 .INS TALL .DAT
0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x43, 0x30, 0x30, 0x00, 0x44, 0x52,
+ //0x0740: .DRE AMWE B.C0 0.DR
0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x43, 0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x0750: EAMW EB.C 01.D REAM
0x57, 0x45, 0x42, 0x2e, 0x43, 0x30, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42,
+ //0x0760: WEB. C02. DREA MWEB
0x2e, 0x56, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x56, 0x39,
+ //0x0770: .V00 .DRE AMWE B.V9
0x39, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x30, 0x00, 0x44,
+ //0x0780: 9.DR EAMW EB.G 00.D
0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41,
+ //0x0790: REAM WEB. G01. DREA
0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45,
+ //0x07a0: MWEB .G02 .DRE AMWE
0x42, 0x2e, 0x47, 0x30, 0x38, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47,
+ //0x07b0: B.G0 8.DR EAMW EB.G
0x30, 0x33, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x37, 0x00,
+ //0x07c0: 03.D REAM WEB. G07.
0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x34, 0x00, 0x44, 0x52, 0x45,
+ //0x07d0: DREA MWEB .G04 .DRE
0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57,
+ //0x07e0: AMWE B.G0 5.DR EAMW
0x45, 0x42, 0x2e, 0x47, 0x30, 0x36, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e,
+ //0x07f0: EB.G 06.D REAM WEB.
0x47, 0x31, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x30, 0x31,
+ //0x0800: G14. DREA MWEB .T01
0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x30, 0x32, 0x00, 0x44, 0x52,
+ //0x0810: .DRE AMWE B.T0 2.DR
0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x31, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x0820: EAMW EB.T 10.D REAM
0x57, 0x45, 0x42, 0x2e, 0x54, 0x31, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42,
+ //0x0830: WEB. T11. DREA MWEB
0x2e, 0x54, 0x31, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x31,
+ //0x0840: .T12 .DRE AMWE B.T1
0x33, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x32, 0x30, 0x00, 0x44,
+ //0x0850: 3.DR EAMW EB.T 20.D
0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x32, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41,
+ //0x0860: REAM WEB. T21. DREA
0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x32, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45,
+ //0x0870: MWEB .T22 .DRE AMWE
0x42, 0x2e, 0x54, 0x32, 0x33, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54,
+ //0x0880: B.T2 3.DR EAMW EB.T
0x32, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x35, 0x30, 0x00,
+ //0x0890: 24.D REAM WEB. T50.
0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x35, 0x31, 0x00, 0x44, 0x52, 0x45,
+ //0x08a0: DREA MWEB .T51 .DRE
0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x38, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57,
+ //0x08b0: AMWE B.T8 0.DR EAMW
0x45, 0x42, 0x2e, 0x54, 0x38, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e,
+ //0x08c0: EB.T 81.D REAM WEB.
0x54, 0x38, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x38, 0x33,
+ //0x08d0: T82. DREA MWEB .T83
0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x38, 0x34, 0x00, 0x44, 0x52,
+ //0x08e0: .DRE AMWE B.T8 4.DR
0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x56, 0x4f, 0x4c, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x08f0: EAMW EB.V OL.D REAM
0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x39, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42,
+ //0x0900: WEB. G09. DREA MWEB
0x2e, 0x47, 0x31, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31,
+ //0x0910: .G10 .DRE AMWE B.G1
0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31, 0x32, 0x00, 0x44,
+ //0x0920: 1.DR EAMW EB.G 12.D
0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31, 0x33, 0x00, 0x44, 0x52, 0x45, 0x41,
+ //0x0930: REAM WEB. G13. DREA
0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45,
+ //0x0940: MWEB .G15 .DRE AMWE
0x42, 0x2e, 0x49, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49,
+ //0x0950: B.I0 0.DR EAMW EB.I
0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x32, 0x00,
+ //0x0960: 01.D REAM WEB. I02.
0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x33, 0x00, 0x44, 0x52, 0x45,
+ //0x0970: DREA MWEB .I03 .DRE
0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57,
+ //0x0980: AMWE B.I0 4.DR EAMW
0x45, 0x42, 0x2e, 0x49, 0x30, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e,
+ //0x0990: EB.I 05.D REAM WEB.
0x49, 0x30, 0x36, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x37,
+ //0x09a0: I06. DREA MWEB .I07
0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x50, 0x41, 0x4c, 0x00, 0x11, 0x01,
+ //0x09b0: .DRE AMWE B.PA L...
0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x44, 0xc3, 0x04, 0x01, 0x2c, 0x01, 0x00, 0x00, 0x2c, 0x00,
+ //0x09c0: @... ..D. ..,. ..,.
0x80, 0xc5, 0xd2, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x2c, 0x00, 0xdc, 0xc3, 0x90, 0x00, 0xb0, 0x00,
+ //0x09d0: .... .... ,... ....
0x40, 0x00, 0x60, 0x00, 0x80, 0xc3, 0x00, 0x00, 0x32, 0x00, 0x32, 0x00, 0xc8, 0x00, 0x84, 0xc3,
+ //0x09e0: @.`. .... 2.2. ....
0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01,
+ //0x09f0: ..@. .... .... ..@.
0x9d, 0x00, 0xc6, 0x00, 0x44, 0xc3, 0xff, 0x00, 0x26, 0x01, 0x00, 0x00, 0x18, 0x00, 0xc8, 0xc3,
+ //0x0a00: .... D... &... ....
0xf7, 0x00, 0x2d, 0x01, 0x28, 0x00, 0x38, 0x00, 0x48, 0xc3, 0x50, 0x00, 0x00, 0x01, 0x9e, 0x00,
+ //0x0a10: ..-. (.8. H.P. ....
0xca, 0x00, 0xe0, 0xc3, 0x50, 0x00, 0x2c, 0x01, 0x3a, 0x00, 0x92, 0x00, 0x98, 0xc3, 0x00, 0x00,
+ //0x0a20: .... P.,. :... ....
0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00,
+ //0x0a30: @... .... .... @...
0xc6, 0x00, 0x44, 0xc3, 0xf7, 0x00, 0x2d, 0x01, 0x28, 0x00, 0x38, 0x00, 0x48, 0xc3, 0x50, 0x00,
+ //0x0a40: ..D. ..-. (.8. H.P.
0x2c, 0x01, 0x3a, 0x00, 0x92, 0x00, 0xbc, 0xc6, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00,
+ //0x0a50: ,.:. .... ..@. ....
0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x7c, 0xc4, 0xf0, 0x00,
+ //0x0a60: .... ..@. .... |...
0x22, 0x01, 0x02, 0x00, 0x2c, 0x00, 0x94, 0xc4, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00,
+ //0x0a70: "... ,... ..@. ....
0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x7c, 0xc4, 0x00, 0x00,
+ //0x0a80: .... ..@. .... |...
0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0xee, 0x00, 0x02, 0x01, 0x04, 0x00,
+ //0x0a90: @... .... .... ....
0x2c, 0x00, 0xc8, 0xc4, 0x68, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x2c, 0x00, 0xcc, 0xc4, 0x18, 0x01,
+ //0x0aa0: ,... h.|. ..,. ....
0x34, 0x01, 0x04, 0x00, 0x2c, 0x00, 0xb0, 0xc4, 0x68, 0x00, 0xd8, 0x00, 0x8a, 0x00, 0xc0, 0x00,
+ //0x0ab0: 4... ,... h... ....
0xd0, 0xc4, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x7c, 0xc4, 0x00, 0x00, 0x40, 0x01,
+ //0x0ac0: .... @... ..|. ..@.
0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x45, 0x58, 0x49, 0x54, 0x20, 0x20, 0x20, 0x20,
+ //0x0ad0: .... .... EXIT
0x20, 0x20, 0x48, 0x45, 0x4c, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x49, 0x53, 0x54,
+ //0x0ae0: HE LP LIST
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x45, 0x41, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x0af0: RE AD
0x4c, 0x4f, 0x47, 0x4f, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4b, 0x45, 0x59, 0x53, 0x20, 0x20,
+ //0x0b00: LOGO N KE YS
0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x20, 0x20, 0x20,
+ //0x0b10: ..PU BLIC
0x20, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00,
+ //0x0b20: PU BLIC ...
0x42, 0x4c, 0x41, 0x43, 0x4b, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x20, 0x52, 0x59, 0x41, 0x4e,
+ //0x0b30: BLAC KDRA GON RYAN
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x48, 0x45, 0x4e, 0x44, 0x52, 0x49,
+ //0x0b40: . ..HE NDRI
0x58, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x4f, 0x55, 0x49, 0x53, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x0b50: X LO UIS
0x20, 0x00, 0x00, 0x00, 0x53, 0x45, 0x50, 0x54, 0x49, 0x4d, 0x55, 0x53, 0x20, 0x20, 0x20, 0x20,
+ //0x0b60: ... SEPT IMUS
0x42, 0x45, 0x43, 0x4b, 0x45, 0x54, 0x54, 0x20, 0x20, 0x20, 0x20, 0x00, 0xff, 0xff, 0x20, 0x20,
+ //0x0b70: BECK ETT . ..
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x22, 0x52, 0x4f, 0x4f,
+ //0x0b80: . "ROO
0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x0b90: T ."
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x4e, 0x45, 0x54, 0x57, 0xe8, 0xc4, 0x45, 0x4c,
+ //0x0ba0: . NETW ..EL
0x56, 0x41, 0x8c, 0xc6, 0x45, 0x4c, 0x56, 0x42, 0x9c, 0xc6, 0x45, 0x4c, 0x56, 0x43, 0x94, 0xc6,
+ //0x0bb0: VA.. ELVB ..EL VC..
0x45, 0x4c, 0x56, 0x45, 0x98, 0xc6, 0x45, 0x4c, 0x56, 0x46, 0xa0, 0xc6, 0x43, 0x47, 0x41, 0x54,
+ //0x0bc0: ELVE ..EL VF.. CGAT
0x30, 0xc7, 0x52, 0x45, 0x4d, 0x4f, 0xa8, 0xc6, 0x42, 0x55, 0x54, 0x41, 0x3c, 0xc7, 0x43, 0x42,
+ //0x0bd0: 0.RE MO.. BUTA <.CB
0x4f, 0x58, 0x44, 0xc7, 0x4c, 0x49, 0x54, 0x45, 0x5c, 0xc6, 0x50, 0x4c, 0x41, 0x54, 0x40, 0xc7,
+ //0x0be0: OXD. LITE ..PL AT@.
0x4c, 0x49, 0x46, 0x54, 0x7c, 0xc6, 0x57, 0x49, 0x52, 0x45, 0x84, 0xc6, 0x48, 0x4e, 0x44, 0x4c,
+ //0x0bf0: LIFT |.WI RE.. HNDL
0x88, 0xc6, 0x48, 0x41, 0x43, 0x48, 0x80, 0xc6, 0x44, 0x4f, 0x4f, 0x52, 0xb4, 0xc6, 0x43, 0x53,
+ //0x0c00: ..HA CH.. DOOR ..CS
0x48, 0x52, 0x70, 0xc6, 0x47, 0x55, 0x4e, 0x41, 0x34, 0xc7, 0x43, 0x52, 0x41, 0x41, 0x64, 0xc6,
+ //0x0c10: HRp. GUNA 4.CR AAd.
0x43, 0x52, 0x42, 0x42, 0x68, 0xc6, 0x43, 0x52, 0x43, 0x43, 0x6c, 0xc6, 0x53, 0x45, 0x41, 0x54,
+ //0x0c20: CRBB h.CR CCl. SEAT
0xf8, 0xc5, 0x4d, 0x45, 0x4e, 0x55, 0x98, 0xc7, 0x43, 0x4f, 0x4f, 0x4b, 0xac, 0xc6, 0x45, 0x4c,
+ //0x0c30: ..ME NU.. COOK ..EL
0x43, 0x41, 0x4c, 0xc6, 0x45, 0x44, 0x43, 0x41, 0x50, 0xc6, 0x44, 0x44, 0x43, 0x41, 0x54, 0xc6,
+ //0x0c40: CAL. EDCA P.DD CAT.
0x41, 0x4c, 0x54, 0x52, 0x04, 0xc6, 0x4c, 0x4f, 0x4b, 0x41, 0x3c, 0xc6, 0x4c, 0x4f, 0x4b, 0x42,
+ //0x0c50: ALTR ..LO KA<. LOKB
0x40, 0xc6, 0x45, 0x4e, 0x54, 0x41, 0x10, 0xc6, 0x45, 0x4e, 0x54, 0x42, 0x24, 0xc6, 0x45, 0x4e,
+ //0x0c60: @.EN TA.. ENTB $.EN
0x54, 0x45, 0x28, 0xc6, 0x45, 0x4e, 0x54, 0x43, 0x18, 0xc6, 0x45, 0x4e, 0x54, 0x44, 0x2c, 0xc6,
+ //0x0c70: TE(. ENTC ..EN TD,.
0x45, 0x4e, 0x54, 0x48, 0x30, 0xc6, 0x57, 0x57, 0x41, 0x54, 0xf0, 0xc5, 0x50, 0x4f, 0x4f, 0x4c,
+ //0x0c80: ENTH 0.WW AT.. POOL
0x58, 0xc6, 0x57, 0x53, 0x48, 0x44, 0xf4, 0xc5, 0x47, 0x52, 0x41, 0x46, 0x44, 0xc6, 0x54, 0x52,
+ //0x0c90: X.WS HD.. GRAF D.TR
0x41, 0x50, 0x48, 0xc6, 0x43, 0x44, 0x50, 0x45, 0x28, 0xc7, 0x44, 0x4c, 0x4f, 0x4b, 0x08, 0xc6,
+ //0x0ca0: APH. CDPE (.DL OK..
0x48, 0x4f, 0x4c, 0x45, 0x00, 0xc6, 0x44, 0x52, 0x59, 0x52, 0x0c, 0xc6, 0x48, 0x4f, 0x4c, 0x59,
+ //0x0cb0: HOLE ..DR YR.. HOLY
0xfc, 0xc5, 0x57, 0x41, 0x4c, 0x4c, 0x2c, 0xc7, 0x42, 0x4f, 0x4f, 0x4b, 0x08, 0xc8, 0x41, 0x58,
+ //0x0cc0: ..WA LL,. BOOK ..AX
0x45, 0x44, 0xb0, 0xc6, 0x53, 0x48, 0x4c, 0x44, 0x38, 0xc7, 0x42, 0x43, 0x4e, 0x59, 0xe8, 0xc5,
+ //0x0cd0: ED.. SHLD 8.BC NY..
0x4c, 0x49, 0x44, 0x43, 0xe4, 0xc5, 0x4c, 0x49, 0x44, 0x55, 0xe0, 0xc5, 0x4c, 0x49, 0x44, 0x4f,
+ //0x0ce0: LIDC ..LI DU.. LIDO
0xec, 0xc5, 0x50, 0x49, 0x50, 0x45, 0xa8, 0xc5, 0x42, 0x41, 0x4c, 0x43, 0x20, 0xc6, 0x57, 0x49,
+ //0x0cf0: ..PI PE.. BALC .WI
0x4e, 0x44, 0x1c, 0xc6, 0x50, 0x41, 0x50, 0x52, 0xb4, 0xc7, 0x55, 0x57, 0x54, 0x41, 0xa0, 0xc5,
+ //0x0d00: ND.. PAPR ..UW TA..
0x55, 0x57, 0x54, 0x42, 0xa0, 0xc5, 0x53, 0x54, 0x41, 0x54, 0xd8, 0xc7, 0x54, 0x4c, 0x49, 0x44,
+ //0x0d10: UWTB ..ST AT.. TLID
0x9c, 0xc5, 0x53, 0x4c, 0x41, 0x42, 0xd8, 0xc5, 0x43, 0x41, 0x52, 0x54, 0xdc, 0xc5, 0x46, 0x43,
+ //0x0d20: ..SL AB.. CART ..FC
0x41, 0x52, 0xac, 0xc5, 0x53, 0x4c, 0x42, 0x41, 0xc0, 0xc5, 0x53, 0x4c, 0x42, 0x42, 0xc4, 0xc5,
+ //0x0d30: AR.. SLBA ..SL BB..
0x53, 0x4c, 0x42, 0x43, 0xcc, 0xc5, 0x53, 0x4c, 0x42, 0x44, 0xc8, 0xc5, 0x53, 0x4c, 0x42, 0x45,
+ //0x0d40: SLBC ..SL BD.. SLBE
0xd0, 0xc5, 0x53, 0x4c, 0x42, 0x46, 0xd4, 0xc5, 0x50, 0x4c, 0x49, 0x4e, 0xb0, 0xc5, 0x4c, 0x41,
+ //0x0d50: ..SL BF.. PLIN ..LA
0x44, 0x44, 0xb8, 0xc5, 0x4c, 0x41, 0x44, 0x42, 0xbc, 0xc5, 0x47, 0x55, 0x4d, 0x41, 0xb4, 0xc5,
+ //0x0d60: DD.. LADB ..GU MA..
0x53, 0x51, 0x45, 0x45, 0x88, 0xc5, 0x54, 0x41, 0x50, 0x50, 0x8c, 0xc5, 0x47, 0x55, 0x49, 0x54,
+ //0x0d70: SQEE ..TA PP.. GUIT
0x90, 0xc5, 0x43, 0x4f, 0x4e, 0x54, 0x94, 0xc5, 0x42, 0x45, 0x4c, 0x4c, 0x98, 0xc5, 0x8c, 0x8c,
+ //0x0d80: ..CO NT.. BELL ....
0x8c, 0x8c, 0x30, 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x9d, 0x00, 0xb2, 0x00, 0x51, 0x00,
+ //0x0d90: ..00 00.0 0... ..Q.
0x5e, 0x00, 0x58, 0xc7, 0xb3, 0x00, 0xc8, 0x00, 0x51, 0x00, 0x5e, 0x00, 0x5c, 0xc7, 0xc9, 0x00,
+ //0x0da0: ^.X. .... Q.^. ....
0xde, 0x00, 0x51, 0x00, 0x5e, 0x00, 0x60, 0xc7, 0x9d, 0x00, 0xb2, 0x00, 0x5f, 0x00, 0x70, 0x00,
+ //0x0db0: ..Q. ^.`. .... _.p.
0x64, 0xc7, 0xb3, 0x00, 0xc8, 0x00, 0x5f, 0x00, 0x70, 0x00, 0x68, 0xc7, 0xc9, 0x00, 0xde, 0x00,
+ //0x0dc0: d... .._. p.h. ....
0x5f, 0x00, 0x70, 0x00, 0x6c, 0xc7, 0x9d, 0x00, 0xb2, 0x00, 0x71, 0x00, 0x82, 0x00, 0x70, 0xc7,
+ //0x0dd0: _.p. l... ..q. ..p.
0xb3, 0x00, 0xc8, 0x00, 0x71, 0x00, 0x82, 0x00, 0x74, 0xc7, 0xc9, 0x00, 0xde, 0x00, 0x71, 0x00,
+ //0x0de0: .... q... t... ..q.
0x82, 0x00, 0x78, 0xc7, 0x9d, 0x00, 0xb2, 0x00, 0x83, 0x00, 0x91, 0x00, 0x7c, 0xc7, 0xb3, 0x00,
+ //0x0df0: ..x. .... .... |...
0xde, 0x00, 0x83, 0x00, 0x91, 0x00, 0x80, 0xc7, 0xdc, 0x00, 0xea, 0x00, 0x98, 0x00, 0xa6, 0x00,
+ //0x0e00: .... .... .... ....
0x50, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0xae, 0x00,
+ //0x0e10: P... @... .... ....
0xbc, 0x00, 0x84, 0x00, 0x94, 0x00, 0x50, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00,
+ //0x0e20: .... ..P. ..@. ....
0xa0, 0xca, 0xff, 0xff, 0x18, 0x01, 0x40, 0x01, 0xa0, 0x00, 0xc8, 0x00, 0x50, 0xc7, 0x8f, 0x00,
+ //0x0e30: .... ..@. .... P...
0x2c, 0x01, 0x06, 0x00, 0xc2, 0x00, 0xb8, 0xc7, 0x00, 0x00, 0x8f, 0x00, 0x06, 0x00, 0xc2, 0x00,
+ //0x0e40: ,... .... .... ....
0xc0, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x68, 0x00,
+ //0x0e50: .... @... .... ..h.
0x80, 0x00, 0x3a, 0x00, 0x48, 0x00, 0xdc, 0xc7, 0x40, 0x00, 0x74, 0x00, 0x4c, 0x00, 0x6a, 0x00,
+ //0x0e60: ..:. H... @.t. L.j.
0xe0, 0xc7, 0x74, 0x00, 0xa8, 0x00, 0x4c, 0x00, 0x6a, 0x00, 0xe4, 0xc7, 0x40, 0x00, 0x74, 0x00,
+ //0x0e70: ..t. ..L. j... @.t.
0x6a, 0x00, 0x88, 0x00, 0xe8, 0xc7, 0x74, 0x00, 0xa8, 0x00, 0x6a, 0x00, 0x88, 0x00, 0xec, 0xc7,
+ //0x0e80: j... ..t. ..j. ....
0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0xba, 0x00, 0xca, 0x00,
+ //0x0e90: ..@. .... .... ....
0x9d, 0x00, 0xad, 0x00, 0x1c, 0xc8, 0xf3, 0x00, 0x03, 0x01, 0x83, 0x00, 0x93, 0x00, 0x18, 0xc8,
+ //0x0ea0: .... .... .... ....
0x0c, 0x01, 0x1c, 0x01, 0xa8, 0x00, 0xb8, 0x00, 0x50, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00,
+ //0x0eb0: .... .... P... @...
0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x77, 0x00, 0xae, 0x00, 0x52, 0x00, 0x80, 0x00, 0x34, 0xc8,
+ //0x0ec0: .... ..w. ..R. ..4.
0x46, 0x00, 0x89, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0x80, 0xc8, 0xbc, 0x00, 0xfa, 0x00, 0x44, 0x00,
+ //0x0ed0: F... >.o. .... ..D.
0x98, 0x00, 0x4c, 0xc8, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff,
+ //0x0ee0: ..L. ..@. .... ....
0xec, 0x00, 0xfc, 0x00, 0x70, 0x00, 0x80, 0x00, 0x48, 0xc8, 0xbc, 0x00, 0xfa, 0x00, 0x40, 0x00,
+ //0x0ef0: .... p... H... ..@.
0x98, 0x00, 0x58, 0xc8, 0x3e, 0x00, 0x98, 0x00, 0x38, 0x00, 0x85, 0x00, 0x74, 0xc8, 0x00, 0x00,
+ //0x0f00: ..X. >... 8... t...
0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x77, 0x00, 0xae, 0x00, 0x52, 0x00,
+ //0x0f10: @... .... ..w. ..R.
0x80, 0x00, 0x44, 0xc8, 0x46, 0x00, 0x8b, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0x50, 0xc8, 0xec, 0x00,
+ //0x0f20: ..D. F... >.o. P...
0xfc, 0x00, 0x70, 0x00, 0x80, 0x00, 0x48, 0xc8, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00,
+ //0x0f30: ..p. ..H. ..@. ....
0xa0, 0xca, 0xff, 0xff, 0xec, 0x00, 0xfc, 0x00, 0x70, 0x00, 0x80, 0x00, 0x48, 0xc8, 0xbc, 0x00,
+ //0x0f40: .... .... p... H...
0xfa, 0x00, 0x40, 0x00, 0x98, 0x00, 0x54, 0xc8, 0x3e, 0x00, 0x98, 0x00, 0x38, 0x00, 0x85, 0x00,
+ //0x0f50: ..@. ..T. >... 8...
0x74, 0xc8, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x0d, 0x0a,
+ //0x0f60: t... @... .... ....
0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61,
+ //0x0f70: ..Dr eamw eb h as a
0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+ //0x0f80: n Er ror: ..Un able
0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x45, 0x78, 0x70,
+ //0x0f90: to allo cate Exp
0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2e, 0x0d, 0x0a, 0x0d,
+ //0x0fa0: ande d Me mory ....
0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68,
+ //0x0fb0: .$.. ..Dr eamw eb h
0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x53, 0x6f,
+ //0x0fc0: as a n Er ror: ..So
0x75, 0x6e, 0x64, 0x20, 0x42, 0x6c, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x72, 0x64,
+ //0x0fd0: und Blas ter card
0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x20, 0x61, 0x64,
+ //0x0fe0: not fou nd a t ad
0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x32, 0x32, 0x30, 0x20, 0x48, 0x65, 0x78, 0x2e, 0x0d, 0x0a,
+ //0x0ff0: dres s 22 0 He x...
0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20,
+ //0x1000: ..$. ...D ream web
0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x4f,
+ //0x1010: has an E rror :..O
0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x61, 0x73, 0x65, 0x20, 0x4d, 0x65, 0x6d, 0x6f, 0x72,
+ //0x1020: ut o f Ba se M emor
0x79, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d,
+ //0x1030: y... ..$. ...D ream
0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ //0x1040: web has an E rror
0x3a, 0x0d, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x44, 0x65, 0x61, 0x6c, 0x6c, 0x6f,
+ //0x1050: :..M emor y De allo
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x2e, 0x0d,
+ //0x1060: cati on p robl em..
0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62,
+ //0x1070: ...$ .... Drea mweb
0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a,
+ //0x1080: has an Erro r:..
0x41, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x35, 0x39, 0x30, 0x4b, 0x20, 0x6f, 0x66,
+ //0x1090: At l east 590 K of
0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20,
+ //0x10a0: bas e me mory is
0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a,
+ //0x10b0: requ ired .... .$..
0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61,
+ //0x10c0: ..Dr eamw eb h as a
0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x20,
+ //0x10d0: n Er ror: ..So und
0x42, 0x6c, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e,
+ //0x10e0: Blas ter not foun
0x64, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x75, 0x70, 0x74, 0x20, 0x30, 0x0d,
+ //0x10f0: d on int erup t 0.
0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62,
+ //0x1100: ...$ .... Drea mweb
0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a,
+ //0x1110: has an Erro r:..
0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74,
+ //0x1120: Unab le t o se lect
0x20, 0x45, 0x4d, 0x4d, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, 0x0d,
+ //0x1130: EMM pag e... ..$.
0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20,
+ //0x1140: ...D ream web has
0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x20,
+ //0x1150: an E rror :..F ile
0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x63, 0x0d, 0x0a, 0x0d, 0x0a, 0x24,
+ //0x1160: not foun d.c. ...$
0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x66,
+ //0x1170: Drea mweb loo ks f
0x6f, 0x72, 0x20, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x42, 0x6c, 0x61, 0x73, 0x74, 0x65, 0x72,
+ //0x1180: or S ound Bla ster
0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x0d,
+ //0x1190: inf orma tion in.
0x0a, 0x74, 0x68, 0x65, 0x20, 0x42, 0x4c, 0x41, 0x53, 0x54, 0x45, 0x52, 0x20, 0x65, 0x6e, 0x76,
+ //0x11a0: .the BLA STER env
0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,
+ //0x11b0: iron ment var iabl
0x65, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x41, 0x55, 0x54, 0x4f, 0x45,
+ //0x11c0: e (i n yo ur A UTOE
0x58, 0x45, 0x43, 0x2e, 0x42, 0x41, 0x54, 0x29, 0x0d, 0x0a, 0x0d, 0x0a, 0x49, 0x66, 0x20, 0x74,
+ //0x11d0: XEC. BAT) .... If t
0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64,
+ //0x11e0: his is n ot f ound
0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x49, 0x52, 0x51, 0x20, 0x37, 0x2c, 0x20, 0x44, 0x4d, 0x41,
+ //0x11f0: the n IR Q 7, DMA
0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62,
+ //0x1200: cha nnel 1 a nd b
0x61, 0x73, 0x65, 0x0d, 0x0a, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x32, 0x32, 0x30,
+ //0x1210: ase. .add ress 220
0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x2e, 0x0d, 0x0a,
+ //0x1220: h ar e as sume d...
0x0d, 0x0a, 0x54, 0x6f, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f,
+ //0x1230: ..To alt er a ny o
0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x73,
+ //0x1240: r al l of the se s
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20,
+ //0x1250: etti ngs you can
0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x0d, 0x0a, 0x6f, 0x6e,
+ //0x1260: spec ify them ..on
0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e,
+ //0x1270: the com mand lin
0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x0d,
+ //0x1280: e. F or e xamp le:.
0x0a, 0x0d, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1290: ...T ype D REAM
0x57, 0x45, 0x42, 0x20, 0x49, 0x37, 0x20, 0x41, 0x32, 0x32, 0x30, 0x20, 0x44, 0x31, 0x20, 0x20,
+ //0x12a0: WEB I7 A 220 D1
0x20, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65,
+ //0x12b0: to run Dre amwe
0x62, 0x20, 0x6f, 0x6e, 0x20, 0x49, 0x52, 0x51, 0x20, 0x37, 0x2c, 0x20, 0x44, 0x4d, 0x41, 0x0d,
+ //0x12c0: b on IRQ 7, DMA.
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x12d0: .
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x12e0:
0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x61,
+ //0x12f0: chan nel 1 an d ba
0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x32, 0x32, 0x30, 0x68, 0x0d,
+ //0x1300: se a ddre ss 2 20h.
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45,
+ //0x1310: . DRE AMWE
0x42, 0x20, 0x49, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x1320: B I5
0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20,
+ //0x1330: to r un D ream web
0x6f, 0x6e, 0x20, 0x49, 0x52, 0x51, 0x20, 0x35, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x20, 0x20,
+ //0x1340: on I RQ 5 and ..
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x1350:
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66,
+ //0x1360: def
0x61, 0x75, 0x6c, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ //0x1370: ault add ress of
0x32, 0x32, 0x30, 0x68, 0x2c, 0x20, 0x44, 0x4d, 0x41, 0x20, 0x31, 0x0d, 0x0a, 0x0d, 0x0a, 0x24,
+ //0x1380: 220h , DM A 1. ...$
0x0d, 0x0a, 0x0d, 0x0a, 0x54, 0x72, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x72, 0x65, 0x61,
+ //0x1390: .... Try the Drea
0x6d, 0x77, 0x65, 0x62, 0x20, 0x43, 0x44, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20,
+ //0x13a0: mweb CD in y our
0x73, 0x74, 0x65, 0x72, 0x65, 0x6f, 0x2e, 0x2e, 0x2e, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
+ //0x13b0: ster eo.. .... ....
0x24, 0x81, 0x00, 0xb8, 0x00, 0x52, 0x00, 0x80, 0x00, 0xc0, 0xc8, 0x50, 0x00, 0x93, 0x00, 0x3e,
+ //0x13c0: $... .R.. ...P ...>
0x00, 0x6f, 0x00, 0x80, 0xc8, 0xb7, 0x00, 0xfa, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0xc4, 0xc8, 0x00,
+ //0x13d0: .o.. .... .>.o ....
0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x53, 0x50, 0x45, 0x45, 0x43,
+ //0x13e0: .@.. .... ...S PEEC
0x48, 0x52, 0x32, 0x34, 0x43, 0x30, 0x30, 0x30, 0x35, 0x2e, 0x52, 0x41, 0x57, 0x00, 0x87, 0x83,
+ //0x13f0: HR24 C000 5.RA W...
0x81, 0x82, 0x2c, 0x00, 0x46, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x70, 0xc4, 0x00, 0x00, 0x32, 0x00,
+ //0x1400: ..,. F. . ..p. ..2.
0x00, 0x00, 0xb4, 0x00, 0x7c, 0xc3, 0xe2, 0x00, 0xf4, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x28, 0xc8,
+ //0x1410: .... |... .... ..(.
0xe2, 0x00, 0xf4, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x2c, 0xc8, 0xf0, 0x00, 0x04, 0x01, 0x64, 0x00,
+ //0x1420: .... ..(. ,... ..d.
0x7c, 0x00, 0xcc, 0xc9, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xd4, 0xc9, 0xff, 0xff,
+ //0x1430: |... ..@. .... ....
0x2c, 0x00, 0x46, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x70, 0xc4, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
+ //0x1440: ,.F. ... p... 2...
0xb4, 0x00, 0x7c, 0xc3, 0x12, 0x01, 0x24, 0x01, 0x0a, 0x00, 0x1a, 0x00, 0x28, 0xc8, 0x12, 0x01,
+ //0x1450: ..|. ..$. .... (...
0x24, 0x01, 0x1a, 0x00, 0x28, 0x00, 0x2c, 0xc8, 0xf0, 0x00, 0x04, 0x01, 0x64, 0x00, 0x7c, 0x00,
+ //0x1460: $... (.,. .... d.|.
0xcc, 0xc9, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xd4, 0xc9, 0xff, 0xff, 0x00, 0x21,
+ //0x1470: .... @... .... ...!
0x0a, 0x0f, 0xff, 0x00, 0x16, 0x0a, 0x0f, 0xff, 0x00, 0x16, 0x00, 0x0f, 0xff, 0x00, 0x0b, 0x00,
+ //0x1480: .... .... .... ....
0x0f, 0xff, 0x00, 0x0b, 0x0a, 0x0f, 0xff, 0x00, 0x00, 0x0a, 0x0f, 0xff, 0x01, 0x2c, 0x0a, 0x06,
+ //0x1490: .... .... .... .,..
0xff, 0x01, 0x2c, 0x00, 0x0d, 0xff, 0x02, 0x21, 0x00, 0x06, 0xff, 0x02, 0x16, 0x00, 0x05, 0xff,
+ //0x14a0: ..,. ...! .... ....
0x02, 0x16, 0x0a, 0x10, 0xff, 0x02, 0x0b, 0x0a, 0x10, 0xff, 0x03, 0x2c, 0x00, 0x0f, 0xff, 0x03,
+ //0x14b0: .... .... ..., ....
0x21, 0x0a, 0x06, 0xff, 0x03, 0x21, 0x00, 0x05, 0xff, 0x04, 0x0b, 0x1e, 0x06, 0xff, 0x04, 0x16,
+ //0x14c0: !... .!.. .... ....
0x1e, 0x05, 0xff, 0x04, 0x16, 0x14, 0x0d, 0xff, 0x0a, 0x21, 0x1e, 0x06, 0xff, 0x0a, 0x16, 0x1e,
+ //0x14d0: .... .... .!.. ....
0x06, 0xff, 0x09, 0x16, 0x0a, 0x06, 0xff, 0x09, 0x16, 0x14, 0x10, 0xff, 0x09, 0x16, 0x1e, 0x10,
+ //0x14e0: .... .... .... ....
0xff, 0x09, 0x16, 0x28, 0x10, 0xff, 0x09, 0x16, 0x32, 0x10, 0xff, 0x06, 0x0b, 0x1e, 0x06, 0xff,
+ //0x14f0: ...( .... 2... ....
0x06, 0x00, 0x0a, 0x0f, 0xff, 0x06, 0x00, 0x14, 0x0f, 0xff, 0x06, 0x0b, 0x14, 0x0f, 0xff, 0x06,
+ //0x1500: .... .... .... ....
0x16, 0x14, 0x0f, 0xff, 0x07, 0x0b, 0x14, 0x06, 0xff, 0x07, 0x00, 0x14, 0x06, 0xff, 0x07, 0x00,
+ //0x1510: .... .... .... ....
0x1e, 0x06, 0xff, 0x37, 0x2c, 0x00, 0x05, 0xff, 0x37, 0x2c, 0x0a, 0x05, 0xff, 0x05, 0x16, 0x1e,
+ //0x1520: ...7 ,... 7,.. ....
0x06, 0xff, 0x05, 0x16, 0x14, 0x0f, 0xff, 0x05, 0x16, 0x0a, 0x0f, 0xff, 0x18, 0x16, 0x00, 0x0f,
+ //0x1530: .... .... .... ....
0xff, 0x18, 0x21, 0x00, 0x0f, 0xff, 0x18, 0x2c, 0x00, 0x0f, 0xff, 0x18, 0x21, 0x0a, 0x0f, 0xff,
+ //0x1540: ..!. ..., .... !...
0x08, 0x00, 0x0a, 0x06, 0xff, 0x08, 0x0b, 0x0a, 0x06, 0xff, 0x08, 0x16, 0x0a, 0x06, 0xff, 0x08,
+ //0x1550: .... .... .... ....
0x21, 0x0a, 0x06, 0xff, 0x08, 0x21, 0x14, 0x06, 0xff, 0x08, 0x21, 0x1e, 0x06, 0xff, 0x08, 0x21,
+ //0x1560: !... .!.. ..!. ...!
0x28, 0x06, 0xff, 0x08, 0x16, 0x28, 0x06, 0xff, 0x08, 0x0b, 0x28, 0x06, 0xff, 0x0b, 0x0b, 0x14,
+ //0x1570: (... .(.. ..(. ....
0x0c, 0xff, 0x0b, 0x0b, 0x1e, 0x0c, 0xff, 0x0b, 0x16, 0x14, 0x0c, 0xff, 0x0b, 0x16, 0x1e, 0x0c,
+ //0x1580: .... .... .... ....
0xff, 0x0c, 0x16, 0x14, 0x0c, 0xff, 0x0d, 0x16, 0x14, 0x0c, 0xff, 0x0d, 0x21, 0x14, 0x0c, 0xff,
+ //0x1590: .... .... .... !...
0x0e, 0x2c, 0x14, 0x0c, 0xff, 0x0e, 0x21, 0x00, 0x0c, 0xff, 0x0e, 0x21, 0x0a, 0x0c, 0xff, 0x0e,
+ //0x15a0: .,.. ..!. ...! ....
0x21, 0x14, 0x0c, 0xff, 0x0e, 0x21, 0x1e, 0x0c, 0xff, 0x0e, 0x21, 0x28, 0x0c, 0xff, 0x0e, 0x16,
+ //0x15b0: !... .!.. ..!( ....
0x00, 0x10, 0xff, 0x13, 0x00, 0x00, 0x0c, 0xff, 0x14, 0x00, 0x14, 0x10, 0xff, 0x14, 0x00, 0x1e,
+ //0x15c0: .... .... .... ....
0x10, 0xff, 0x14, 0x0b, 0x1e, 0x10, 0xff, 0x14, 0x00, 0x28, 0x10, 0xff, 0x14, 0x0b, 0x28, 0x10,
+ //0x15d0: .... .... .(.. ..(.
0xff, 0x15, 0x0b, 0x0a, 0x0f, 0xff, 0x15, 0x0b, 0x14, 0x0f, 0xff, 0x15, 0x00, 0x14, 0x0f, 0xff,
+ //0x15e0: .... .... .... ....
0x15, 0x16, 0x14, 0x0f, 0xff, 0x15, 0x21, 0x14, 0x0f, 0xff, 0x15, 0x2c, 0x14, 0x0f, 0xff, 0x15,
+ //0x15f0: .... ..!. ..., ....
0x2c, 0x0a, 0x0f, 0xff, 0x16, 0x16, 0x0a, 0x10, 0xff, 0x16, 0x16, 0x14, 0x10, 0xff, 0x17, 0x16,
+ //0x1600: ,... .... .... ....
0x1e, 0x0d, 0xff, 0x17, 0x16, 0x28, 0x0d, 0xff, 0x17, 0x21, 0x28, 0x0d, 0xff, 0x17, 0x0b, 0x28,
+ //0x1610: .... .(.. .!(. ...(
0x0d, 0xff, 0x17, 0x00, 0x28, 0x0d, 0xff, 0x17, 0x00, 0x32, 0x0d, 0xff, 0x19, 0x0b, 0x28, 0x10,
+ //0x1620: .... (... .2.. ..(.
0xff, 0x19, 0x0b, 0x32, 0x10, 0xff, 0x19, 0x00, 0x32, 0x10, 0xff, 0x1b, 0x0b, 0x14, 0x10, 0xff,
+ //0x1630: ...2 .... 2... ....
0x1b, 0x0b, 0x1e, 0x10, 0xff, 0x1d, 0x0b, 0x0a, 0x10, 0xff, 0x2d, 0x16, 0x1e, 0x0c, 0xff, 0x2d,
+ //0x1640: .... .... ..-. ...-
0x16, 0x28, 0x0c, 0xff, 0x2d, 0x16, 0x32, 0x0c, 0xff, 0x2e, 0x16, 0x28, 0x0c, 0xff, 0x2e, 0x0b,
+ //0x1650: .(.. -.2. ...( ....
0x32, 0x0c, 0xff, 0x2e, 0x16, 0x32, 0x0c, 0xff, 0x2e, 0x21, 0x32, 0x0c, 0xff, 0x2f, 0x00, 0x00,
+ //0x1660: 2... .2.. .!2. ./..
0x0c, 0xff, 0x1a, 0x16, 0x14, 0x10, 0xff, 0x1a, 0x21, 0x0a, 0x10, 0xff, 0x1a, 0x21, 0x14, 0x10,
+ //0x1670: .... .... !... .!..
0xff, 0x1a, 0x21, 0x1e, 0x10, 0xff, 0x1a, 0x2c, 0x1e, 0x10, 0xff, 0x1a, 0x16, 0x1e, 0x10, 0xff,
+ //0x1680: ..!. ..., .... ....
0x1a, 0x0b, 0x1e, 0x10, 0xff, 0x1a, 0x0b, 0x14, 0x10, 0xff, 0x1a, 0x00, 0x14, 0x10, 0xff, 0x1a,
+ //0x1690: .... .... .... ....
0x0b, 0x28, 0x10, 0xff, 0x1a, 0x00, 0x28, 0x10, 0xff, 0x1a, 0x16, 0x28, 0x10, 0xff, 0x1a, 0x0b,
+ //0x16a0: .(.. ..(. ...( ....
0x32, 0x10, 0xff, 0x1c, 0x00, 0x1e, 0x0f, 0xff, 0x1c, 0x00, 0x14, 0x0f, 0xff, 0x1c, 0x00, 0x28,
+ //0x16b0: 2... .... .... ...(
0x0f, 0xff, 0x1c, 0x0b, 0x1e, 0x0f, 0xff, 0x1c, 0x0b, 0x14, 0x0f, 0xff, 0x1c, 0x16, 0x1e, 0x0f,
+ //0x16c0: .... .... .... ....
0xff, 0x1c, 0x16, 0x14, 0x0f, 0xff, 0xff, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x20, 0x4e, 0x41,
+ //0x16d0: .... ...O BJEC T NA
0x4d, 0x45, 0x20, 0x4f, 0x4e, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ //0x16e0: ME O NE
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
+ //0x16f0: .
0x10, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x1700: .... .... .... ....
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1710: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
+ //0x1720: .... .... ..12 3456
0x37, 0x38, 0x39, 0x30, 0x2d, 0x00, 0x08, 0x00, 0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49,
+ //0x1730: 7890 -... QWER TYUI
0x4f, 0x50, 0x00, 0x00, 0x0d, 0x00, 0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x00,
+ //0x1740: OP.. ..AS DFGH JKL.
0x00, 0x00, 0x00, 0x00, 0x5a, 0x58, 0x43, 0x56, 0x42, 0x4e, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1750: .... ZXCV BNM. ....
0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1760: . .. .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1770: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1780: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1790: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x3a, 0x00, 0x00, 0x00,
+ //0x17a0: .... .... ...D :...
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x17b0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x17c0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x20, 0x44, 0x41, 0x54, 0x41, 0x20, 0x46, 0x49, 0x4c, 0x45, 0x20, 0x43, 0x4f,
+ //0x17d0: WEB DATA FIL E CO
0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x31, 0x39, 0x39, 0x32, 0x20, 0x43, 0x52, 0x45,
+ //0x17e0: PYRI GHT 1992 CRE
0x41, 0x54, 0x49, 0x56, 0x45, 0x20, 0x52, 0x45, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x00, 0x00, 0x00,
+ //0x17f0: ATIV E RE ALIT Y...
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1800: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1810: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1820: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x30, 0x00, 0x05, 0xff, 0x21, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1830: WEB. R00. ..!. ....
0x01, 0x06, 0x02, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1840: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x31, 0x00, 0x01, 0xff, 0x2c, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1850: WEB. R01. ..,. ....
0x07, 0x02, 0xff, 0xff, 0xff, 0xff, 0x06, 0xff, 0xff, 0xff, 0x01, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1860: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x32, 0x00, 0x02, 0xff, 0x21, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1870: WEB. R02. ..!. ....
0x01, 0x00, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, 0x02, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1880: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x33, 0x00, 0x05, 0xff, 0x21, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1890: WEB. R03. ..!. ....
0x02, 0x02, 0x00, 0x02, 0x04, 0xff, 0x00, 0xff, 0xff, 0xff, 0x03, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x18a0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x34, 0x00, 0x17, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x18b0: WEB. R04. .... ....
0x01, 0x04, 0x00, 0x05, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x04, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x18c0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x35, 0x00, 0x05, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x18d0: WEB. R05. .... ....
0x01, 0x02, 0x00, 0x04, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x05, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x18e0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x36, 0x00, 0x05, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x18f0: WEB. R06. .... ....
0x01, 0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0xff, 0xff, 0xff, 0x06, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1900: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x37, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1910: WEB. R07. .... ....
0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x07, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1920: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x38, 0x00, 0x08, 0xff, 0x00, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1930: WEB. R08. .... ....
0x01, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0b, 0x28, 0x00, 0x08, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1940: .... .... (..D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x39, 0x00, 0x09, 0xff, 0x16, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1950: WEB. R09. .... ....
0x04, 0x06, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x09, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1960: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x30, 0x00, 0x0a, 0xff, 0x21, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1970: WEB. R10. ..!. ....
0x02, 0x00, 0xff, 0xff, 0x02, 0x02, 0x04, 0x16, 0x1e, 0xff, 0x0a, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1980: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x31, 0x00, 0x0b, 0xff, 0x0b, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1990: WEB. R11. .... ....
0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x19a0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x32, 0x00, 0x0c, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x19b0: WEB. R12. .... ....
0x01, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x19c0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x33, 0x00, 0x0c, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x19d0: WEB. R13. .... ....
0x01, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x19e0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x34, 0x00, 0x0e, 0xff, 0x2c, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x19f0: WEB. R14. ..,. ....
0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a00: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a10: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a20: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a30: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a40: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a50: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a60: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1a70: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1a80: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x39, 0x00, 0x13, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1a90: WEB. R19. .... ....
0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1aa0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x30, 0x00, 0x16, 0xff, 0x00, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1ab0: WEB. R20. .... ....
0x01, 0x04, 0x02, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ac0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x31, 0x00, 0x05, 0xff, 0x0b, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1ad0: WEB. R21. .... ....
0x01, 0x04, 0x02, 0x0f, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x15, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ae0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x32, 0x00, 0x16, 0xff, 0x16, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1af0: WEB. R22. .... ....
0x00, 0x04, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1b00: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x33, 0x00, 0x17, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1b10: WEB. R23. .... ....
0x01, 0x04, 0x02, 0x0f, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1b20: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x34, 0x00, 0x05, 0xff, 0x2c, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1b30: WEB. R24. ..,. ....
0x01, 0x06, 0x02, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1b40: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x35, 0x00, 0x16, 0xff, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x00,
+ //0x1b50: WEB. R25. ...( ....
0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1b60: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x36, 0x00, 0x09, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1b70: WEB. R26. .... ....
0x04, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1b80: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x37, 0x00, 0x16, 0xff, 0x0b, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1b90: WEB. R27. .... ....
0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ba0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x38, 0x00, 0x05, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1bb0: WEB. R28. .... ....
0x00, 0x00, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1bc0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x39, 0x00, 0x16, 0xff, 0x0b, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1bd0: WEB. R29. .... ....
0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1be0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x35, 0x00, 0x05, 0xff, 0x16, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1bf0: WEB. R05. .... ....
0x01, 0x04, 0x01, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x05, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1c00: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x34, 0x00, 0x17, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1c10: WEB. R04. .... ....
0x01, 0x04, 0x02, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1c20: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x30, 0x00, 0x0a, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1c30: WEB. R10. .... ....
0x03, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1c40: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x32, 0x00, 0x0c, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1c50: WEB. R12. .... ....
0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1c60: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x33, 0x00, 0x05, 0xff, 0x2c, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1c70: WEB. R03. ..,. ....
0x01, 0x06, 0x02, 0xff, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1c80: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x34, 0x00, 0x05, 0xff, 0x16, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1c90: WEB. R24. .... ....
0x03, 0x06, 0x00, 0xff, 0xff, 0xff, 0xff, 0x21, 0x00, 0x03, 0x18, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ca0: .... ...! ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x32, 0x00, 0x16, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1cb0: WEB. R22. .... ....
0x01, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1cc0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x32, 0x00, 0x16, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1cd0: WEB. R22. .... ....
0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ce0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x31, 0x00, 0x0b, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1cf0: WEB. R11. .... ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1d00: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x38, 0x00, 0x05, 0xff, 0x0b, 0x14, 0xff, 0xff, 0xff, 0x00,
+ //0x1d10: WEB. R28. .... ....
0x00, 0x06, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1d20: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x31, 0x00, 0x05, 0xff, 0x0b, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1d30: WEB. R21. .... ....
0x01, 0x04, 0x02, 0x0f, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x15, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1d40: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x36, 0x00, 0x09, 0xff, 0x00, 0x28, 0xff, 0xff, 0xff, 0x00,
+ //0x1d50: WEB. R26. ...( ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1d60: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x39, 0x00, 0x13, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1d70: WEB. R19. .... ....
0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1d80: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x38, 0x00, 0x08, 0xff, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x00,
+ //0x1d90: WEB. R08. ...( ....
0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1da0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x31, 0x00, 0x01, 0xff, 0x2c, 0x0a, 0xff, 0xff, 0xff, 0x00,
+ //0x1db0: WEB. R01. ..,. ....
0x03, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1dc0: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x35, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1dd0: WEB. R45. #... ....
0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1de0: .... .... ..-D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x36, 0x00, 0x23, 0xff, 0x16, 0x28, 0xff, 0xff, 0xff, 0x00,
+ //0x1df0: WEB. R46. #..( ....
0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1e00: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x37, 0x00, 0x23, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1e10: WEB. R47. #... ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1e20: .... .... ../D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x35, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1e30: WEB. R45. #... ....
0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1e40: .... .... ..-D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x36, 0x00, 0x23, 0xff, 0x16, 0x32, 0xff, 0xff, 0xff, 0x00,
+ //0x1e50: WEB. R46. #..2 ....
0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1e60: .... .... ...D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x30, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1e70: WEB. R50. #... ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1e80: .... .... ..2D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x31, 0x00, 0x23, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1e90: WEB. R51. #... ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ea0: .... .... ..3D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x32, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00,
+ //0x1eb0: WEB. R52. #... ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ec0: .... .... ..4D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x33, 0x00, 0x23, 0xff, 0x21, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1ed0: WEB. R53. #.!. ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1ee0: .... .... ..5D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x34, 0x00, 0x23, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1ef0: WEB. R54. #... ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x1f00: .... .... ..6D REAM
0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x35, 0x00, 0x0e, 0xff, 0x2c, 0x00, 0xff, 0xff, 0xff, 0x00,
+ //0x1f10: WEB. R55. ..,. ....
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1f20: .... .... ..7. ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1f30: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00,
+ //0x1f40: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x02, 0x04,
+ //0x1f50: .... .... .... ....
0x01, 0x0a, 0x09, 0x08, 0x06, 0x0b, 0x04, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1f60: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1f70: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1f80: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1f90: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1fa0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1fb0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1fc0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x1fd0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+ //0x1fe0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x1ff0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2000: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2010: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2020: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2030: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2040: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2050: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2060: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2070: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2080: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2090: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x20a0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x20b0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x20c0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x20d0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x20e0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x20f0: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2100: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2110: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2120: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2130: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2140: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2150: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2160: .... .... .... ....
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ //0x2170: .... .... .... ....
0xff, 0xff, 0xff, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x2180: .... .... .... ....
0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x2190: .... .... .... ....
0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x21a0: .... .... .... ....
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x21b0: .... .... .... ....
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x21c0: .... .... .... ....
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x21d0: .... .... .... ....
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,
+ //0x21e0: .... .... .... ....
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57,
+ //0x21f0: .... .... ..DR EAMW
0x45, 0x42, 0x2e, 0x44, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e,
+ //0x2200: EB.D 00.D REAM WEB.
0x44, 0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x32,
+ //0x2210: D01. DREA MWEB .D02
0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x33, 0x00, 0x44, 0x52,
+ //0x2220: .DRE AMWE B.D0 3.DR
0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d,
+ //0x2230: EAMW EB.D 04.D REAM
0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42,
+ //0x2240: WEB. D05. DREA MWEB
0x2e, 0x44, 0x30, 0x36, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x45,
+ //0x2250: .D06 .DRE AMWE B.DE
0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2260: M... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2270: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2280: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2290: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x22a0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x22b0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x22c0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x22d0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x22e0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x22f0: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2300: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2310: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2320: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2330: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ //0x2340: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, };
+ //0x2350: .... .... .... ....
+ 0x00, 0x00, 0x00, 0x00, 0x00, };
ds.assign(src, src + sizeof(src));
dreamweb();
}
void DreamGenContext::__dispatch_call(uint16 addr) {
switch(addr) {
- case 0xc000: alleybarksound(); break;
- case 0xc004: intromusic(); break;
- case 0xc008: foghornsound(); break;
- case 0xc00c: receptionist(); break;
- case 0xc010: smokebloke(); break;
- case 0xc014: attendant(); break;
- case 0xc018: manasleep(); break;
- case 0xc01c: eden(); break;
- case 0xc020: edeninbath(); break;
- case 0xc024: malefan(); break;
- case 0xc028: femalefan(); break;
- case 0xc02c: louis(); break;
- case 0xc030: louischair(); break;
- case 0xc034: manasleep2(); break;
- case 0xc038: mansatstill(); break;
- case 0xc03c: tattooman(); break;
- case 0xc040: drinker(); break;
- case 0xc044: bartender(); break;
- case 0xc048: othersmoker(); break;
- case 0xc04c: barwoman(); break;
- case 0xc050: interviewer(); break;
- case 0xc054: soldier1(); break;
- case 0xc058: rockstar(); break;
- case 0xc05c: helicopter(); break;
- case 0xc060: mugger(); break;
- case 0xc064: aide(); break;
- case 0xc068: businessman(); break;
- case 0xc06c: poolguard(); break;
- case 0xc070: security(); break;
- case 0xc074: heavy(); break;
- case 0xc078: bossman(); break;
- case 0xc07c: gamer(); break;
- case 0xc080: sparkydrip(); break;
- case 0xc084: carparkdrip(); break;
- case 0xc088: keeper(); break;
- case 0xc08c: candles1(); break;
- case 0xc090: smallcandle(); break;
- case 0xc094: intromagic1(); break;
- case 0xc098: candles(); break;
- case 0xc09c: candles2(); break;
- case 0xc0a0: gates(); break;
- case 0xc0a4: intromagic2(); break;
- case 0xc0a8: intromagic3(); break;
- case 0xc0ac: intromonks1(); break;
- case 0xc0b0: intromonks2(); break;
- case 0xc0b4: handclap(); break;
- case 0xc0b8: monks2text(); break;
- case 0xc0bc: intro1text(); break;
- case 0xc0c0: intro2text(); break;
- case 0xc0c4: intro3text(); break;
- case 0xc0c8: monkandryan(); break;
- case 0xc0cc: endgameseq(); break;
- case 0xc0d0: rollendcredits(); break;
- case 0xc0d4: priest(); break;
- case 0xc0d8: madmanstelly(); break;
- case 0xc0dc: madman(); break;
- case 0xc0e0: madmantext(); break;
- case 0xc0e4: madmode(); break;
- case 0xc0e8: priesttext(); break;
- case 0xc0ec: textforend(); break;
- case 0xc0f0: textformonk(); break;
- case 0xc0f4: drunk(); break;
- case 0xc0f8: advisor(); break;
- case 0xc0fc: copper(); break;
- case 0xc100: sparky(); break;
- case 0xc104: train(); break;
- case 0xc108: addtopeoplelist(); break;
- case 0xc10c: showgamereel(); break;
- case 0xc110: checkspeed(); break;
- case 0xc114: clearsprites(); break;
- case 0xc118: makesprite(); break;
- case 0xc11c: delsprite(); break;
- case 0xc120: spriteupdate(); break;
- case 0xc124: printsprites(); break;
- case 0xc128: printasprite(); break;
- case 0xc12c: checkone(); break;
- case 0xc130: findsource(); break;
- case 0xc134: initman(); break;
- case 0xc138: mainman(); break;
- case 0xc13c: aboutturn(); break;
- case 0xc140: walking(); break;
- case 0xc144: facerightway(); break;
- case 0xc148: checkforexit(); break;
- case 0xc14c: adjustdown(); break;
- case 0xc150: adjustup(); break;
- case 0xc154: adjustleft(); break;
- case 0xc158: adjustright(); break;
- case 0xc15c: reminders(); break;
- case 0xc160: initrain(); break;
- case 0xc164: splitintolines(); break;
- case 0xc168: getblockofpixel(); break;
- case 0xc16c: showrain(); break;
- case 0xc170: backobject(); break;
- case 0xc174: liftsprite(); break;
- case 0xc178: liftnoise(); break;
- case 0xc17c: random(); break;
- case 0xc180: steady(); break;
- case 0xc184: constant(); break;
- case 0xc188: doorway(); break;
- case 0xc18c: widedoor(); break;
- case 0xc190: dodoor(); break;
- case 0xc194: lockeddoorway(); break;
- case 0xc198: updatepeople(); break;
- case 0xc19c: getreelframeax(); break;
- case 0xc1a0: reelsonscreen(); break;
- case 0xc1a4: plotreel(); break;
- case 0xc1a8: soundonreels(); break;
- case 0xc1ac: reconstruct(); break;
- case 0xc1b0: dealwithspecial(); break;
- case 0xc1b4: movemap(); break;
- case 0xc1b8: getreelstart(); break;
- case 0xc1bc: showreelframe(); break;
- case 0xc1c0: deleverything(); break;
- case 0xc1c4: dumpeverything(); break;
- case 0xc1c8: allocatework(); break;
- case 0xc1cc: showpcx(); break;
- case 0xc1d8: loadpalfromiff(); break;
- case 0xc1dc: setmode(); break;
- case 0xc1ec: paneltomap(); break;
- case 0xc1f0: maptopanel(); break;
- case 0xc1f4: dumpmap(); break;
- case 0xc1f8: pixelcheckset(); break;
- case 0xc1fc: createpanel(); break;
- case 0xc200: createpanel2(); break;
- case 0xc204: clearwork(); break;
- case 0xc208: vsync(); break;
- case 0xc20c: doshake(); break;
- case 0xc210: zoom(); break;
- case 0xc214: delthisone(); break;
- case 0xc228: doblocks(); break;
- case 0xc22c: showframe(); break;
- case 0xc238: frameoutbh(); break;
- case 0xc23c: frameoutfx(); break;
- case 0xc240: transferinv(); break;
- case 0xc244: transfermap(); break;
- case 0xc248: fadedos(); break;
- case 0xc24c: dofade(); break;
- case 0xc250: clearendpal(); break;
- case 0xc254: clearpalette(); break;
- case 0xc258: fadescreenup(); break;
- case 0xc25c: fadetowhite(); break;
- case 0xc260: fadefromwhite(); break;
- case 0xc264: fadescreenups(); break;
- case 0xc268: fadescreendownhalf(); break;
- case 0xc26c: fadescreenuphalf(); break;
- case 0xc270: fadescreendown(); break;
- case 0xc274: fadescreendowns(); break;
- case 0xc278: clearstartpal(); break;
- case 0xc27c: showgun(); break;
- case 0xc280: rollendcredits2(); break;
- case 0xc284: rollem(); break;
- case 0xc288: fadecalculation(); break;
- case 0xc28c: greyscalesum(); break;
- case 0xc290: showgroup(); break;
- case 0xc294: paltostartpal(); break;
- case 0xc298: endpaltostart(); break;
- case 0xc29c: startpaltoend(); break;
- case 0xc2a0: paltoendpal(); break;
- case 0xc2a4: allpalette(); break;
- case 0xc2a8: dumpcurrent(); break;
- case 0xc2ac: fadedownmon(); break;
- case 0xc2b0: fadeupmon(); break;
- case 0xc2b4: fadeupmonfirst(); break;
- case 0xc2b8: fadeupyellows(); break;
- case 0xc2bc: initialmoncols(); break;
- case 0xc2c0: titles(); break;
- case 0xc2c4: endgame(); break;
- case 0xc2c8: monkspeaking(); break;
- case 0xc2cc: showmonk(); break;
- case 0xc2d0: gettingshot(); break;
- case 0xc2d4: credits(); break;
- case 0xc2d8: biblequote(); break;
- case 0xc2dc: hangone(); break;
- case 0xc2e0: intro(); break;
- case 0xc2e4: runintroseq(); break;
- case 0xc2e8: runendseq(); break;
- case 0xc2ec: loadintroroom(); break;
- case 0xc2f0: mode640x480(); break;
- case 0xc2f4: set16colpalette(); break;
- case 0xc2f8: realcredits(); break;
- case 0xc2fc: printchar(); break;
- case 0xc300: kernchars(); break;
- case 0xc304: printslow(); break;
- case 0xc308: waitframes(); break;
- case 0xc30c: printboth(); break;
- case 0xc310: printdirect(); break;
- case 0xc314: monprint(); break;
- case 0xc318: getnumber(); break;
- case 0xc31c: getnextword(); break;
- case 0xc320: fillryan(); break;
- case 0xc324: fillopen(); break;
- case 0xc328: findallryan(); break;
- case 0xc32c: findallopen(); break;
- case 0xc330: obtoinv(); break;
- case 0xc334: isitworn(); break;
- case 0xc338: makeworn(); break;
- case 0xc33c: examineob(); break;
- case 0xc340: makemainscreen(); break;
- case 0xc344: getbackfromob(); break;
- case 0xc348: incryanpage(); break;
- case 0xc34c: openinv(); break;
- case 0xc350: showryanpage(); break;
- case 0xc354: openob(); break;
- case 0xc358: obicons(); break;
- case 0xc35c: examicon(); break;
- case 0xc360: obpicture(); break;
- case 0xc364: describeob(); break;
- case 0xc368: additionaltext(); break;
- case 0xc36c: obsthatdothings(); break;
- case 0xc370: getobtextstart(); break;
- case 0xc374: searchforsame(); break;
- case 0xc378: findnextcolon(); break;
- case 0xc37c: inventory(); break;
- case 0xc380: setpickup(); break;
- case 0xc384: examinventory(); break;
- case 0xc388: reexfrominv(); break;
- case 0xc38c: reexfromopen(); break;
- case 0xc390: swapwithinv(); break;
- case 0xc394: swapwithopen(); break;
- case 0xc398: intoinv(); break;
- case 0xc39c: deletetaken(); break;
- case 0xc3a0: outofinv(); break;
- case 0xc3a4: getfreead(); break;
- case 0xc3a8: getexad(); break;
- case 0xc3ac: geteitherad(); break;
- case 0xc3b0: getanyad(); break;
- case 0xc3b4: getanyaddir(); break;
- case 0xc3b8: getopenedsize(); break;
- case 0xc3bc: getsetad(); break;
- case 0xc3c0: findinvpos(); break;
- case 0xc3c4: findopenpos(); break;
- case 0xc3c8: dropobject(); break;
- case 0xc3cc: droperror(); break;
- case 0xc3d0: cantdrop(); break;
- case 0xc3d4: wornerror(); break;
- case 0xc3d8: removeobfrominv(); break;
- case 0xc3dc: selectopenob(); break;
- case 0xc3e0: useopened(); break;
- case 0xc3e4: errormessage1(); break;
- case 0xc3e8: errormessage2(); break;
- case 0xc3ec: errormessage3(); break;
- case 0xc3f0: checkobjectsize(); break;
- case 0xc3f4: outofopen(); break;
- case 0xc3f8: transfertoex(); break;
- case 0xc3fc: pickupconts(); break;
- case 0xc400: transfercontoex(); break;
- case 0xc404: transfertext(); break;
- case 0xc408: getexpos(); break;
- case 0xc40c: purgealocation(); break;
- case 0xc410: emergencypurge(); break;
- case 0xc414: purgeanitem(); break;
- case 0xc418: deleteexobject(); break;
- case 0xc41c: deleteexframe(); break;
- case 0xc420: deleteextext(); break;
- case 0xc424: blockget(); break;
- case 0xc428: drawfloor(); break;
- case 0xc42c: calcmapad(); break;
- case 0xc430: getdimension(); break;
- case 0xc434: addalong(); break;
- case 0xc438: addlength(); break;
- case 0xc43c: drawflags(); break;
- case 0xc440: eraseoldobs(); break;
- case 0xc444: showallobs(); break;
- case 0xc448: makebackob(); break;
- case 0xc44c: showallfree(); break;
- case 0xc450: showallex(); break;
- case 0xc454: calcfrframe(); break;
- case 0xc458: finalframe(); break;
- case 0xc45c: adjustlen(); break;
- case 0xc460: getmapad(); break;
- case 0xc464: getxad(); break;
- case 0xc468: getyad(); break;
- case 0xc46c: autolook(); break;
- case 0xc470: look(); break;
- case 0xc474: dolook(); break;
- case 0xc478: redrawmainscrn(); break;
- case 0xc47c: getback1(); break;
- case 0xc480: talk(); break;
- case 0xc484: convicons(); break;
- case 0xc488: getpersframe(); break;
- case 0xc48c: starttalk(); break;
- case 0xc490: getpersontext(); break;
- case 0xc494: moretalk(); break;
- case 0xc498: dosometalk(); break;
- case 0xc49c: hangonpq(); break;
- case 0xc4a0: redes(); break;
- case 0xc4a4: newplace(); break;
- case 0xc4a8: selectlocation(); break;
- case 0xc4ac: showcity(); break;
- case 0xc4b0: lookatplace(); break;
- case 0xc4b4: getundercentre(); break;
- case 0xc4b8: putundercentre(); break;
- case 0xc4bc: locationpic(); break;
- case 0xc4c0: getdestinfo(); break;
- case 0xc4c4: showarrows(); break;
- case 0xc4c8: nextdest(); break;
- case 0xc4cc: lastdest(); break;
- case 0xc4d0: destselect(); break;
- case 0xc4d4: getlocation(); break;
- case 0xc4d8: setlocation(); break;
- case 0xc4dc: resetlocation(); break;
- case 0xc4e0: readdesticon(); break;
- case 0xc4e4: readcitypic(); break;
- case 0xc4e8: usemon(); break;
- case 0xc4ec: printoutermon(); break;
- case 0xc4f0: loadpersonal(); break;
- case 0xc4f4: loadnews(); break;
- case 0xc4f8: loadcart(); break;
- case 0xc4fc: lookininterface(); break;
- case 0xc500: turnonpower(); break;
- case 0xc504: randomaccess(); break;
- case 0xc508: powerlighton(); break;
- case 0xc50c: powerlightoff(); break;
- case 0xc510: accesslighton(); break;
- case 0xc514: accesslightoff(); break;
- case 0xc518: locklighton(); break;
- case 0xc51c: locklightoff(); break;
- case 0xc520: input(); break;
- case 0xc524: makecaps(); break;
- case 0xc528: delchar(); break;
- case 0xc52c: execcommand(); break;
- case 0xc530: neterror(); break;
- case 0xc534: dircom(); break;
- case 0xc538: searchforfiles(); break;
- case 0xc53c: signon(); break;
- case 0xc540: showkeys(); break;
- case 0xc544: read(); break;
- case 0xc548: dirfile(); break;
- case 0xc54c: getkeyandlogo(); break;
- case 0xc550: searchforstring(); break;
- case 0xc554: parser(); break;
- case 0xc558: scrollmonitor(); break;
- case 0xc55c: lockmon(); break;
- case 0xc560: monitorlogo(); break;
- case 0xc564: printlogo(); break;
- case 0xc568: showcurrentfile(); break;
- case 0xc56c: monmessage(); break;
- case 0xc570: processtrigger(); break;
- case 0xc574: triggermessage(); break;
- case 0xc578: printcurs(); break;
- case 0xc57c: delcurs(); break;
- case 0xc580: useobject(); break;
- case 0xc584: useroutine(); break;
- case 0xc588: wheelsound(); break;
- case 0xc58c: runtap(); break;
- case 0xc590: playguitar(); break;
- case 0xc594: hotelcontrol(); break;
- case 0xc598: hotelbell(); break;
- case 0xc59c: opentomb(); break;
- case 0xc5a0: usetrainer(); break;
- case 0xc5a4: nothelderror(); break;
- case 0xc5a8: usepipe(); break;
- case 0xc5ac: usefullcart(); break;
- case 0xc5b0: useplinth(); break;
- case 0xc5b4: chewy(); break;
- case 0xc5b8: useladder(); break;
- case 0xc5bc: useladderb(); break;
- case 0xc5c0: slabdoora(); break;
- case 0xc5c4: slabdoorb(); break;
- case 0xc5c8: slabdoord(); break;
- case 0xc5cc: slabdoorc(); break;
- case 0xc5d0: slabdoore(); break;
- case 0xc5d4: slabdoorf(); break;
- case 0xc5d8: useslab(); break;
- case 0xc5dc: usecart(); break;
- case 0xc5e0: useclearbox(); break;
- case 0xc5e4: usecoveredbox(); break;
- case 0xc5e8: userailing(); break;
- case 0xc5ec: useopenbox(); break;
- case 0xc5f0: wearwatch(); break;
- case 0xc5f4: wearshades(); break;
- case 0xc5f8: sitdowninbar(); break;
- case 0xc5fc: usechurchhole(); break;
- case 0xc600: usehole(); break;
- case 0xc604: usealtar(); break;
- case 0xc608: opentvdoor(); break;
- case 0xc60c: usedryer(); break;
- case 0xc610: openlouis(); break;
- case 0xc614: nextcolon(); break;
- case 0xc618: openyourneighbour(); break;
- case 0xc61c: usewindow(); break;
- case 0xc620: usebalcony(); break;
- case 0xc624: openryan(); break;
- case 0xc628: openpoolboss(); break;
- case 0xc62c: openeden(); break;
- case 0xc630: opensarters(); break;
- case 0xc634: isitright(); break;
- case 0xc638: drawitall(); break;
- case 0xc63c: openhoteldoor(); break;
- case 0xc640: openhoteldoor2(); break;
- case 0xc644: grafittidoor(); break;
- case 0xc648: trapdoor(); break;
- case 0xc64c: callhotellift(); break;
- case 0xc650: calledenslift(); break;
- case 0xc654: calledensdlift(); break;
- case 0xc658: usepoolreader(); break;
- case 0xc65c: uselighter(); break;
- case 0xc660: showseconduse(); break;
- case 0xc664: usecardreader1(); break;
- case 0xc668: usecardreader2(); break;
- case 0xc66c: usecardreader3(); break;
- case 0xc670: usecashcard(); break;
- case 0xc674: lookatcard(); break;
- case 0xc678: moneypoke(); break;
- case 0xc67c: usecontrol(); break;
- case 0xc680: usehatch(); break;
- case 0xc684: usewire(); break;
- case 0xc688: usehandle(); break;
- case 0xc68c: useelevator1(); break;
- case 0xc690: showfirstuse(); break;
- case 0xc694: useelevator3(); break;
- case 0xc698: useelevator4(); break;
- case 0xc69c: useelevator2(); break;
- case 0xc6a0: useelevator5(); break;
- case 0xc6a4: usekey(); break;
- case 0xc6a8: usestereo(); break;
- case 0xc6ac: usecooker(); break;
- case 0xc6b0: useaxe(); break;
- case 0xc6b4: useelvdoor(); break;
- case 0xc6b8: withwhat(); break;
- case 0xc6bc: selectob(); break;
- case 0xc6c0: compare(); break;
- case 0xc6c4: findsetobject(); break;
- case 0xc6c8: findexobject(); break;
- case 0xc6cc: isryanholding(); break;
- case 0xc6d0: checkinside(); break;
- case 0xc6d4: usetext(); break;
- case 0xc6d8: putbackobstuff(); break;
- case 0xc6dc: showpuztext(); break;
- case 0xc6e0: findpuztext(); break;
- case 0xc6e4: placesetobject(); break;
- case 0xc6e8: removesetobject(); break;
- case 0xc6ec: issetobonmap(); break;
- case 0xc6f0: placefreeobject(); break;
- case 0xc6f4: removefreeobject(); break;
- case 0xc6f8: findormake(); break;
- case 0xc6fc: switchryanon(); break;
- case 0xc700: switchryanoff(); break;
- case 0xc704: setallchanges(); break;
- case 0xc708: dochange(); break;
- case 0xc70c: autoappear(); break;
- case 0xc710: getundertimed(); break;
- case 0xc714: putundertimed(); break;
- case 0xc718: dumptimedtext(); break;
- case 0xc71c: setuptimeduse(); break;
- case 0xc720: setuptimedtemp(); break;
- case 0xc724: usetimedtext(); break;
- case 0xc728: edenscdplayer(); break;
- case 0xc72c: usewall(); break;
- case 0xc730: usechurchgate(); break;
- case 0xc734: usegun(); break;
- case 0xc738: useshield(); break;
- case 0xc73c: usebuttona(); break;
- case 0xc740: useplate(); break;
- case 0xc744: usewinch(); break;
- case 0xc748: entercode(); break;
- case 0xc74c: loadkeypad(); break;
- case 0xc750: quitkey(); break;
- case 0xc754: addtopresslist(); break;
- case 0xc758: buttonone(); break;
- case 0xc75c: buttontwo(); break;
- case 0xc760: buttonthree(); break;
- case 0xc764: buttonfour(); break;
- case 0xc768: buttonfive(); break;
- case 0xc76c: buttonsix(); break;
- case 0xc770: buttonseven(); break;
- case 0xc774: buttoneight(); break;
- case 0xc778: buttonnine(); break;
- case 0xc77c: buttonnought(); break;
- case 0xc780: buttonenter(); break;
- case 0xc784: buttonpress(); break;
- case 0xc788: showouterpad(); break;
- case 0xc78c: showkeypad(); break;
- case 0xc790: singlekey(); break;
- case 0xc794: dumpkeypad(); break;
- case 0xc798: usemenu(); break;
- case 0xc79c: dumpmenu(); break;
- case 0xc7a0: getundermenu(); break;
- case 0xc7a4: putundermenu(); break;
- case 0xc7a8: showoutermenu(); break;
- case 0xc7ac: showmenu(); break;
- case 0xc7b0: loadmenu(); break;
- case 0xc7b4: viewfolder(); break;
- case 0xc7b8: nextfolder(); break;
- case 0xc7bc: folderhints(); break;
- case 0xc7c0: lastfolder(); break;
- case 0xc7c4: loadfolder(); break;
- case 0xc7c8: showfolder(); break;
- case 0xc7cc: folderexit(); break;
- case 0xc7d0: showleftpage(); break;
- case 0xc7d4: showrightpage(); break;
- case 0xc7d8: entersymbol(); break;
- case 0xc7dc: quitsymbol(); break;
- case 0xc7e0: settopleft(); break;
- case 0xc7e4: settopright(); break;
- case 0xc7e8: setbotleft(); break;
- case 0xc7ec: setbotright(); break;
- case 0xc7f0: dumpsymbol(); break;
- case 0xc7f4: showsymbol(); break;
- case 0xc7f8: nextsymbol(); break;
- case 0xc7fc: updatesymboltop(); break;
- case 0xc800: updatesymbolbot(); break;
- case 0xc804: dumpsymbox(); break;
- case 0xc808: usediary(); break;
- case 0xc80c: showdiary(); break;
- case 0xc810: showdiarykeys(); break;
- case 0xc814: dumpdiarykeys(); break;
- case 0xc818: diarykeyp(); break;
- case 0xc81c: diarykeyn(); break;
- case 0xc820: showdiarypage(); break;
- case 0xc824: findtext1(); break;
- case 0xc828: zoomonoff(); break;
- case 0xc82c: saveload(); break;
- case 0xc830: dosaveload(); break;
- case 0xc834: getbackfromops(); break;
- case 0xc838: showmainops(); break;
- case 0xc83c: showdiscops(); break;
- case 0xc840: loadsavebox(); break;
- case 0xc844: loadgame(); break;
- case 0xc848: getbacktoops(); break;
- case 0xc84c: discops(); break;
- case 0xc850: savegame(); break;
- case 0xc854: actualsave(); break;
- case 0xc858: actualload(); break;
- case 0xc85c: selectslot2(); break;
- case 0xc860: checkinput(); break;
- case 0xc864: getnamepos(); break;
- case 0xc868: showopbox(); break;
- case 0xc86c: showloadops(); break;
- case 0xc870: showsaveops(); break;
- case 0xc874: selectslot(); break;
- case 0xc878: showslots(); break;
- case 0xc87c: shownames(); break;
- case 0xc880: dosreturn(); break;
- case 0xc884: error(); break;
- case 0xc888: namestoold(); break;
- case 0xc88c: oldtonames(); break;
- case 0xc890: savefilewrite(); break;
- case 0xc894: savefileread(); break;
- case 0xc898: saveposition(); break;
- case 0xc89c: loadposition(); break;
- case 0xc8a0: loadseg(); break;
- case 0xc8a4: makeheader(); break;
- case 0xc8a8: storeit(); break;
- case 0xc8ac: saveseg(); break;
- case 0xc8b0: findlen(); break;
- case 0xc8b4: scanfornames(); break;
- case 0xc8b8: decide(); break;
- case 0xc8bc: showdecisions(); break;
- case 0xc8c0: newgame(); break;
- case 0xc8c4: loadold(); break;
- case 0xc8c8: loadspeech(); break;
- case 0xc8cc: createname(); break;
- case 0xc8d0: loadsample(); break;
- case 0xc8d4: loadsecondsample(); break;
- case 0xc8d8: soundstartup(); break;
- case 0xc8dc: trysoundalloc(); break;
- case 0xc8e0: setsoundoff(); break;
- case 0xc8e4: checksoundint(); break;
- case 0xc8e8: enablesoundint(); break;
- case 0xc8ec: disablesoundint(); break;
- case 0xc8f0: interupttest(); break;
- case 0xc8f4: soundend(); break;
- case 0xc8f8: out22c(); break;
- case 0xc8fc: playchannel0(); break;
- case 0xc900: playchannel1(); break;
- case 0xc904: makenextblock(); break;
- case 0xc908: volumeadjust(); break;
- case 0xc90c: loopchannel0(); break;
- case 0xc910: cancelch0(); break;
- case 0xc914: cancelch1(); break;
- case 0xc918: channel0only(); break;
- case 0xc91c: channel1only(); break;
- case 0xc920: channel0tran(); break;
- case 0xc924: bothchannels(); break;
- case 0xc928: saveems(); break;
- case 0xc92c: restoreems(); break;
- case 0xc930: domix(); break;
- case 0xc934: dmaend(); break;
- case 0xc938: startdmablock(); break;
- case 0xc93c: setuppit(); break;
- case 0xc940: getridofpit(); break;
- case 0xc944: pitinterupt(); break;
- case 0xc948: dreamweb(); break;
- case 0xc94c: entrytexts(); break;
- case 0xc950: entryanims(); break;
- case 0xc954: initialinv(); break;
- case 0xc958: pickupob(); break;
- case 0xc95c: setupemm(); break;
- case 0xc960: removeemm(); break;
- case 0xc964: checkforemm(); break;
- case 0xc968: checkbasemem(); break;
- case 0xc96c: allocatebuffers(); break;
- case 0xc970: clearbuffers(); break;
- case 0xc974: clearchanges(); break;
- case 0xc978: clearbeforeload(); break;
- case 0xc97c: clearreels(); break;
- case 0xc980: clearrest(); break;
- case 0xc984: deallocatemem(); break;
- case 0xc988: allocatemem(); break;
- case 0xc990: parseblaster(); break;
- case 0xc994: startup(); break;
- case 0xc998: startup1(); break;
- case 0xc99c: screenupdate(); break;
- case 0xc9a0: watchreel(); break;
- case 0xc9a4: checkforshake(); break;
- case 0xc9a8: watchcount(); break;
- case 0xc9ac: showtime(); break;
- case 0xc9b0: dumpwatch(); break;
- case 0xc9b4: showbyte(); break;
- case 0xc9b8: onedigit(); break;
- case 0xc9bc: twodigitnum(); break;
- case 0xc9c0: showword(); break;
- case 0xc9c4: convnum(); break;
- case 0xc9c8: mainscreen(); break;
- case 0xc9cc: madmanrun(); break;
- case 0xc9d0: checkcoords(); break;
- case 0xc9d4: identifyob(); break;
- case 0xc9d8: checkifperson(); break;
- case 0xc9dc: checkifset(); break;
- case 0xc9e0: checkifex(); break;
- case 0xc9e4: checkiffree(); break;
- case 0xc9e8: isitdescribed(); break;
- case 0xc9ec: findpathofpoint(); break;
- case 0xc9f0: findfirstpath(); break;
- case 0xc9f4: turnpathon(); break;
- case 0xc9f8: turnpathoff(); break;
- case 0xc9fc: turnanypathon(); break;
- case 0xca00: turnanypathoff(); break;
- case 0xca04: checkifpathison(); break;
- case 0xca08: afternewroom(); break;
- case 0xca0c: atmospheres(); break;
- case 0xca10: walkintoroom(); break;
- case 0xca14: afterintroroom(); break;
- case 0xca18: obname(); break;
- case 0xca1c: finishedwalking(); break;
- case 0xca20: examineobtext(); break;
- case 0xca24: commandwithob(); break;
- case 0xca28: commandonly(); break;
- case 0xca2c: printmessage(); break;
- case 0xca30: printmessage2(); break;
- case 0xca34: blocknametext(); break;
- case 0xca38: personnametext(); break;
- case 0xca3c: walktotext(); break;
- case 0xca40: getflagunderp(); break;
- case 0xca44: setwalk(); break;
- case 0xca48: autosetwalk(); break;
- case 0xca4c: checkdest(); break;
- case 0xca50: bresenhams(); break;
- case 0xca54: workoutframes(); break;
- case 0xca58: getroomspaths(); break;
- case 0xca5c: copyname(); break;
- case 0xca60: findobname(); break;
- case 0xca64: showicon(); break;
- case 0xca68: middlepanel(); break;
- case 0xca6c: showman(); break;
- case 0xca70: showpanel(); break;
- case 0xca74: roomname(); break;
- case 0xca78: usecharset1(); break;
- case 0xca7c: usetempcharset(); break;
- case 0xca80: showexit(); break;
- case 0xca84: panelicons1(); break;
- case 0xca88: showwatch(); break;
- case 0xca8c: gettime(); break;
- case 0xca90: zoomicon(); break;
- case 0xca94: showblink(); break;
- case 0xca98: dumpblink(); break;
- case 0xca9c: worktoscreenm(); break;
- case 0xcaa0: blank(); break;
- case 0xcaa4: allpointer(); break;
- case 0xcaa8: hangonp(); break;
- case 0xcaac: hangonw(); break;
- case 0xcab0: hangoncurs(); break;
- case 0xcab4: getunderzoom(); break;
- case 0xcab8: dumpzoom(); break;
- case 0xcabc: putunderzoom(); break;
- case 0xcac0: crosshair(); break;
- case 0xcac4: showpointer(); break;
- case 0xcac8: delpointer(); break;
- case 0xcacc: dumppointer(); break;
- case 0xcad0: undertextline(); break;
- case 0xcad4: deltextline(); break;
- case 0xcad8: dumptextline(); break;
- case 0xcadc: animpointer(); break;
- case 0xcae0: setmouse(); break;
- case 0xcae4: readmouse(); break;
- case 0xcae8: mousecall(); break;
- case 0xcaec: readmouse1(); break;
- case 0xcaf0: readmouse2(); break;
- case 0xcaf4: readmouse3(); break;
- case 0xcaf8: readmouse4(); break;
- case 0xcafc: readkey(); break;
- case 0xcb04: randomnum1(); break;
- case 0xcb08: randomnum2(); break;
- case 0xcb10: hangon(); break;
- case 0xcb14: loadtraveltext(); break;
- case 0xcb18: loadintotemp(); break;
- case 0xcb1c: loadintotemp2(); break;
- case 0xcb20: loadintotemp3(); break;
- case 0xcb24: loadtempcharset(); break;
- case 0xcb28: standardload(); break;
- case 0xcb2c: loadtemptext(); break;
- case 0xcb30: loadroom(); break;
- case 0xcb34: loadroomssample(); break;
- case 0xcb38: getridofreels(); break;
- case 0xcb3c: getridofall(); break;
- case 0xcb40: restorereels(); break;
- case 0xcb44: restoreall(); break;
- case 0xcb48: sortoutmap(); break;
- case 0xcb4c: startloading(); break;
- case 0xcb50: disablepath(); break;
- case 0xcb54: findxyfrompath(); break;
- case 0xcb58: findroominloc(); break;
- case 0xcb5c: getroomdata(); break;
- case 0xcb60: readheader(); break;
- case 0xcb64: dontloadseg(); break;
- case 0xcb68: allocateload(); break;
- case 0xcb6c: fillspace(); break;
- case 0xcb70: getridoftemp(); break;
- case 0xcb74: getridoftemptext(); break;
- case 0xcb78: getridoftemp2(); break;
- case 0xcb7c: getridoftemp3(); break;
- case 0xcb80: getridoftempcharset(); break;
- case 0xcb84: getridoftempsp(); break;
- case 0xcb88: readsetdata(); break;
- case 0xcb8c: createfile(); break;
- case 0xcb90: openfile(); break;
- case 0xcb94: openfilefromc(); break;
- case 0xcb98: makename(); break;
- case 0xcb9c: openfilenocheck(); break;
- case 0xcba0: openforsave(); break;
- case 0xcba4: closefile(); break;
- case 0xcba8: readfromfile(); break;
- case 0xcbac: setkeyboardint(); break;
- case 0xcbb0: resetkeyboard(); break;
- case 0xcbb4: keyboardread(); break;
- case 0xcbb8: walkandexamine(); break;
- case 0xcbbc: doload(); break;
- case 0xcbc0: generalerror(); break;
+ case addr_alleybarksound: alleybarksound(); break;
+ case addr_intromusic: intromusic(); break;
+ case addr_foghornsound: foghornsound(); break;
+ case addr_receptionist: receptionist(); break;
+ case addr_smokebloke: smokebloke(); break;
+ case addr_attendant: attendant(); break;
+ case addr_manasleep: manasleep(); break;
+ case addr_eden: eden(); break;
+ case addr_edeninbath: edeninbath(); break;
+ case addr_malefan: malefan(); break;
+ case addr_femalefan: femalefan(); break;
+ case addr_louis: louis(); break;
+ case addr_louischair: louischair(); break;
+ case addr_manasleep2: manasleep2(); break;
+ case addr_mansatstill: mansatstill(); break;
+ case addr_tattooman: tattooman(); break;
+ case addr_drinker: drinker(); break;
+ case addr_bartender: bartender(); break;
+ case addr_othersmoker: othersmoker(); break;
+ case addr_barwoman: barwoman(); break;
+ case addr_interviewer: interviewer(); break;
+ case addr_soldier1: soldier1(); break;
+ case addr_rockstar: rockstar(); break;
+ case addr_helicopter: helicopter(); break;
+ case addr_mugger: mugger(); break;
+ case addr_aide: aide(); break;
+ case addr_businessman: businessman(); break;
+ case addr_poolguard: poolguard(); break;
+ case addr_security: security(); break;
+ case addr_heavy: heavy(); break;
+ case addr_bossman: bossman(); break;
+ case addr_gamer: gamer(); break;
+ case addr_sparkydrip: sparkydrip(); break;
+ case addr_carparkdrip: carparkdrip(); break;
+ case addr_keeper: keeper(); break;
+ case addr_candles1: candles1(); break;
+ case addr_smallcandle: smallcandle(); break;
+ case addr_intromagic1: intromagic1(); break;
+ case addr_candles: candles(); break;
+ case addr_candles2: candles2(); break;
+ case addr_gates: gates(); break;
+ case addr_intromagic2: intromagic2(); break;
+ case addr_intromagic3: intromagic3(); break;
+ case addr_intromonks1: intromonks1(); break;
+ case addr_intromonks2: intromonks2(); break;
+ case addr_handclap: handclap(); break;
+ case addr_monks2text: monks2text(); break;
+ case addr_intro1text: intro1text(); break;
+ case addr_intro2text: intro2text(); break;
+ case addr_intro3text: intro3text(); break;
+ case addr_monkandryan: monkandryan(); break;
+ case addr_endgameseq: endgameseq(); break;
+ case addr_rollendcredits: rollendcredits(); break;
+ case addr_priest: priest(); break;
+ case addr_madmanstelly: madmanstelly(); break;
+ case addr_madman: madman(); break;
+ case addr_priesttext: priesttext(); break;
+ case addr_textforend: textforend(); break;
+ case addr_textformonk: textformonk(); break;
+ case addr_drunk: drunk(); break;
+ case addr_advisor: advisor(); break;
+ case addr_copper: copper(); break;
+ case addr_sparky: sparky(); break;
+ case addr_train: train(); break;
+ case addr_checkspeed: checkspeed(); break;
+ case addr_mainman: mainman(); break;
+ case addr_checkforexit: checkforexit(); break;
+ case addr_adjustdown: adjustdown(); break;
+ case addr_adjustup: adjustup(); break;
+ case addr_adjustleft: adjustleft(); break;
+ case addr_adjustright: adjustright(); break;
+ case addr_reminders: reminders(); break;
+ case addr_initrain: initrain(); break;
+ case addr_splitintolines: splitintolines(); break;
+ case addr_backobject: backobject(); break;
+ case addr_liftnoise: liftnoise(); break;
+ case addr_random: random(); break;
+ case addr_steady: steady(); break;
+ case addr_constant: constant(); break;
+ case addr_reelsonscreen: reelsonscreen(); break;
+ case addr_soundonreels: soundonreels(); break;
+ case addr_reconstruct: reconstruct(); break;
+ case addr_deleverything: deleverything(); break;
+ case addr_showpcx: showpcx(); break;
+ case addr_loadpalfromiff: loadpalfromiff(); break;
+ case addr_setmode: setmode(); break;
+ case addr_createpanel: createpanel(); break;
+ case addr_createpanel2: createpanel2(); break;
+ case addr_vsync: vsync(); break;
+ case addr_doshake: doshake(); break;
+ case addr_transfermap: transfermap(); break;
+ case addr_fadedos: fadedos(); break;
+ case addr_dofade: dofade(); break;
+ case addr_clearendpal: clearendpal(); break;
+ case addr_clearpalette: clearpalette(); break;
+ case addr_fadescreenup: fadescreenup(); break;
+ case addr_fadetowhite: fadetowhite(); break;
+ case addr_fadefromwhite: fadefromwhite(); break;
+ case addr_fadescreenups: fadescreenups(); break;
+ case addr_fadescreendownhalf: fadescreendownhalf(); break;
+ case addr_fadescreenuphalf: fadescreenuphalf(); break;
+ case addr_fadescreendown: fadescreendown(); break;
+ case addr_fadescreendowns: fadescreendowns(); break;
+ case addr_clearstartpal: clearstartpal(); break;
+ case addr_showgun: showgun(); break;
+ case addr_rollendcredits2: rollendcredits2(); break;
+ case addr_rollem: rollem(); break;
+ case addr_fadecalculation: fadecalculation(); break;
+ case addr_greyscalesum: greyscalesum(); break;
+ case addr_showgroup: showgroup(); break;
+ case addr_paltostartpal: paltostartpal(); break;
+ case addr_endpaltostart: endpaltostart(); break;
+ case addr_startpaltoend: startpaltoend(); break;
+ case addr_paltoendpal: paltoendpal(); break;
+ case addr_allpalette: allpalette(); break;
+ case addr_dumpcurrent: dumpcurrent(); break;
+ case addr_fadedownmon: fadedownmon(); break;
+ case addr_fadeupmon: fadeupmon(); break;
+ case addr_fadeupmonfirst: fadeupmonfirst(); break;
+ case addr_fadeupyellows: fadeupyellows(); break;
+ case addr_initialmoncols: initialmoncols(); break;
+ case addr_titles: titles(); break;
+ case addr_endgame: endgame(); break;
+ case addr_monkspeaking: monkspeaking(); break;
+ case addr_showmonk: showmonk(); break;
+ case addr_gettingshot: gettingshot(); break;
+ case addr_credits: credits(); break;
+ case addr_biblequote: biblequote(); break;
+ case addr_hangone: hangone(); break;
+ case addr_intro: intro(); break;
+ case addr_runintroseq: runintroseq(); break;
+ case addr_runendseq: runendseq(); break;
+ case addr_loadintroroom: loadintroroom(); break;
+ case addr_mode640x480: mode640x480(); break;
+ case addr_set16colpalette: set16colpalette(); break;
+ case addr_realcredits: realcredits(); break;
+ case addr_monprint: monprint(); break;
+ case addr_fillopen: fillopen(); break;
+ case addr_findallopen: findallopen(); break;
+ case addr_examineob: examineob(); break;
+ case addr_makemainscreen: makemainscreen(); break;
+ case addr_getbackfromob: getbackfromob(); break;
+ case addr_incryanpage: incryanpage(); break;
+ case addr_openinv: openinv(); break;
+ case addr_openob: openob(); break;
+ case addr_examicon: examicon(); break;
+ case addr_describeob: describeob(); break;
+ case addr_additionaltext: additionaltext(); break;
+ case addr_obsthatdothings: obsthatdothings(); break;
+ case addr_getobtextstart: getobtextstart(); break;
+ case addr_searchforsame: searchforsame(); break;
+ case addr_inventory: inventory(); break;
+ case addr_setpickup: setpickup(); break;
+ case addr_examinventory: examinventory(); break;
+ case addr_reexfrominv: reexfrominv(); break;
+ case addr_reexfromopen: reexfromopen(); break;
+ case addr_swapwithinv: swapwithinv(); break;
+ case addr_swapwithopen: swapwithopen(); break;
+ case addr_intoinv: intoinv(); break;
+ case addr_outofinv: outofinv(); break;
+ case addr_getfreead: getfreead(); break;
+ case addr_getexad: getexad(); break;
+ case addr_geteitherad: geteitherad(); break;
+ case addr_getanyad: getanyad(); break;
+ case addr_getanyaddir: getanyaddir(); break;
+ case addr_getopenedsize: getopenedsize(); break;
+ case addr_getsetad: getsetad(); break;
+ case addr_findinvpos: findinvpos(); break;
+ case addr_findopenpos: findopenpos(); break;
+ case addr_dropobject: dropobject(); break;
+ case addr_droperror: droperror(); break;
+ case addr_cantdrop: cantdrop(); break;
+ case addr_removeobfrominv: removeobfrominv(); break;
+ case addr_selectopenob: selectopenob(); break;
+ case addr_useopened: useopened(); break;
+ case addr_errormessage1: errormessage1(); break;
+ case addr_errormessage2: errormessage2(); break;
+ case addr_errormessage3: errormessage3(); break;
+ case addr_checkobjectsize: checkobjectsize(); break;
+ case addr_outofopen: outofopen(); break;
+ case addr_transfertoex: transfertoex(); break;
+ case addr_pickupconts: pickupconts(); break;
+ case addr_transfercontoex: transfercontoex(); break;
+ case addr_transfertext: transfertext(); break;
+ case addr_purgealocation: purgealocation(); break;
+ case addr_emergencypurge: emergencypurge(); break;
+ case addr_purgeanitem: purgeanitem(); break;
+ case addr_deleteexobject: deleteexobject(); break;
+ case addr_deleteexframe: deleteexframe(); break;
+ case addr_deleteextext: deleteextext(); break;
+ case addr_blockget: blockget(); break;
+ case addr_drawfloor: drawfloor(); break;
+ case addr_autolook: autolook(); break;
+ case addr_look: look(); break;
+ case addr_dolook: dolook(); break;
+ case addr_redrawmainscrn: redrawmainscrn(); break;
+ case addr_getback1: getback1(); break;
+ case addr_talk: talk(); break;
+ case addr_convicons: convicons(); break;
+ case addr_getpersframe: getpersframe(); break;
+ case addr_starttalk: starttalk(); break;
+ case addr_getpersontext: getpersontext(); break;
+ case addr_moretalk: moretalk(); break;
+ case addr_dosometalk: dosometalk(); break;
+ case addr_hangonpq: hangonpq(); break;
+ case addr_redes: redes(); break;
+ case addr_newplace: newplace(); break;
+ case addr_selectlocation: selectlocation(); break;
+ case addr_showcity: showcity(); break;
+ case addr_lookatplace: lookatplace(); break;
+ case addr_getundercentre: getundercentre(); break;
+ case addr_putundercentre: putundercentre(); break;
+ case addr_locationpic: locationpic(); break;
+ case addr_getdestinfo: getdestinfo(); break;
+ case addr_showarrows: showarrows(); break;
+ case addr_nextdest: nextdest(); break;
+ case addr_lastdest: lastdest(); break;
+ case addr_destselect: destselect(); break;
+ case addr_getlocation: getlocation(); break;
+ case addr_setlocation: setlocation(); break;
+ case addr_resetlocation: resetlocation(); break;
+ case addr_readdesticon: readdesticon(); break;
+ case addr_readcitypic: readcitypic(); break;
+ case addr_usemon: usemon(); break;
+ case addr_printoutermon: printoutermon(); break;
+ case addr_loadpersonal: loadpersonal(); break;
+ case addr_loadnews: loadnews(); break;
+ case addr_loadcart: loadcart(); break;
+ case addr_lookininterface: lookininterface(); break;
+ case addr_turnonpower: turnonpower(); break;
+ case addr_randomaccess: randomaccess(); break;
+ case addr_powerlighton: powerlighton(); break;
+ case addr_powerlightoff: powerlightoff(); break;
+ case addr_accesslighton: accesslighton(); break;
+ case addr_accesslightoff: accesslightoff(); break;
+ case addr_locklighton: locklighton(); break;
+ case addr_locklightoff: locklightoff(); break;
+ case addr_input: input(); break;
+ case addr_makecaps: makecaps(); break;
+ case addr_delchar: delchar(); break;
+ case addr_execcommand: execcommand(); break;
+ case addr_neterror: neterror(); break;
+ case addr_dircom: dircom(); break;
+ case addr_searchforfiles: searchforfiles(); break;
+ case addr_signon: signon(); break;
+ case addr_showkeys: showkeys(); break;
+ case addr_read: read(); break;
+ case addr_dirfile: dirfile(); break;
+ case addr_getkeyandlogo: getkeyandlogo(); break;
+ case addr_searchforstring: searchforstring(); break;
+ case addr_parser: parser(); break;
+ case addr_scrollmonitor: scrollmonitor(); break;
+ case addr_monitorlogo: monitorlogo(); break;
+ case addr_printlogo: printlogo(); break;
+ case addr_showcurrentfile: showcurrentfile(); break;
+ case addr_monmessage: monmessage(); break;
+ case addr_processtrigger: processtrigger(); break;
+ case addr_triggermessage: triggermessage(); break;
+ case addr_printcurs: printcurs(); break;
+ case addr_delcurs: delcurs(); break;
+ case addr_useobject: useobject(); break;
+ case addr_wheelsound: wheelsound(); break;
+ case addr_runtap: runtap(); break;
+ case addr_playguitar: playguitar(); break;
+ case addr_hotelcontrol: hotelcontrol(); break;
+ case addr_hotelbell: hotelbell(); break;
+ case addr_opentomb: opentomb(); break;
+ case addr_usetrainer: usetrainer(); break;
+ case addr_nothelderror: nothelderror(); break;
+ case addr_usepipe: usepipe(); break;
+ case addr_usefullcart: usefullcart(); break;
+ case addr_useplinth: useplinth(); break;
+ case addr_chewy: chewy(); break;
+ case addr_useladder: useladder(); break;
+ case addr_useladderb: useladderb(); break;
+ case addr_slabdoora: slabdoora(); break;
+ case addr_slabdoorb: slabdoorb(); break;
+ case addr_slabdoord: slabdoord(); break;
+ case addr_slabdoorc: slabdoorc(); break;
+ case addr_slabdoore: slabdoore(); break;
+ case addr_slabdoorf: slabdoorf(); break;
+ case addr_useslab: useslab(); break;
+ case addr_usecart: usecart(); break;
+ case addr_useclearbox: useclearbox(); break;
+ case addr_usecoveredbox: usecoveredbox(); break;
+ case addr_userailing: userailing(); break;
+ case addr_useopenbox: useopenbox(); break;
+ case addr_wearwatch: wearwatch(); break;
+ case addr_wearshades: wearshades(); break;
+ case addr_sitdowninbar: sitdowninbar(); break;
+ case addr_usechurchhole: usechurchhole(); break;
+ case addr_usehole: usehole(); break;
+ case addr_usealtar: usealtar(); break;
+ case addr_opentvdoor: opentvdoor(); break;
+ case addr_usedryer: usedryer(); break;
+ case addr_openlouis: openlouis(); break;
+ case addr_nextcolon: nextcolon(); break;
+ case addr_openyourneighbour: openyourneighbour(); break;
+ case addr_usewindow: usewindow(); break;
+ case addr_usebalcony: usebalcony(); break;
+ case addr_openryan: openryan(); break;
+ case addr_openpoolboss: openpoolboss(); break;
+ case addr_openeden: openeden(); break;
+ case addr_opensarters: opensarters(); break;
+ case addr_isitright: isitright(); break;
+ case addr_drawitall: drawitall(); break;
+ case addr_openhoteldoor: openhoteldoor(); break;
+ case addr_openhoteldoor2: openhoteldoor2(); break;
+ case addr_grafittidoor: grafittidoor(); break;
+ case addr_trapdoor: trapdoor(); break;
+ case addr_callhotellift: callhotellift(); break;
+ case addr_calledenslift: calledenslift(); break;
+ case addr_calledensdlift: calledensdlift(); break;
+ case addr_usepoolreader: usepoolreader(); break;
+ case addr_uselighter: uselighter(); break;
+ case addr_showseconduse: showseconduse(); break;
+ case addr_usecardreader1: usecardreader1(); break;
+ case addr_usecardreader2: usecardreader2(); break;
+ case addr_usecardreader3: usecardreader3(); break;
+ case addr_usecashcard: usecashcard(); break;
+ case addr_lookatcard: lookatcard(); break;
+ case addr_moneypoke: moneypoke(); break;
+ case addr_usecontrol: usecontrol(); break;
+ case addr_usehatch: usehatch(); break;
+ case addr_usewire: usewire(); break;
+ case addr_usehandle: usehandle(); break;
+ case addr_useelevator1: useelevator1(); break;
+ case addr_showfirstuse: showfirstuse(); break;
+ case addr_useelevator3: useelevator3(); break;
+ case addr_useelevator4: useelevator4(); break;
+ case addr_useelevator2: useelevator2(); break;
+ case addr_useelevator5: useelevator5(); break;
+ case addr_usekey: usekey(); break;
+ case addr_usestereo: usestereo(); break;
+ case addr_usecooker: usecooker(); break;
+ case addr_useaxe: useaxe(); break;
+ case addr_useelvdoor: useelvdoor(); break;
+ case addr_withwhat: withwhat(); break;
+ case addr_selectob: selectob(); break;
+ case addr_findsetobject: findsetobject(); break;
+ case addr_findexobject: findexobject(); break;
+ case addr_isryanholding: isryanholding(); break;
+ case addr_checkinside: checkinside(); break;
+ case addr_putbackobstuff: putbackobstuff(); break;
+ case addr_showpuztext: showpuztext(); break;
+ case addr_findpuztext: findpuztext(); break;
+ case addr_issetobonmap: issetobonmap(); break;
+ case addr_placefreeobject: placefreeobject(); break;
+ case addr_removefreeobject: removefreeobject(); break;
+ case addr_switchryanon: switchryanon(); break;
+ case addr_switchryanoff: switchryanoff(); break;
+ case addr_autoappear: autoappear(); break;
+ case addr_setuptimeduse: setuptimeduse(); break;
+ case addr_edenscdplayer: edenscdplayer(); break;
+ case addr_usewall: usewall(); break;
+ case addr_usechurchgate: usechurchgate(); break;
+ case addr_usegun: usegun(); break;
+ case addr_useshield: useshield(); break;
+ case addr_usebuttona: usebuttona(); break;
+ case addr_useplate: useplate(); break;
+ case addr_usewinch: usewinch(); break;
+ case addr_entercode: entercode(); break;
+ case addr_loadkeypad: loadkeypad(); break;
+ case addr_quitkey: quitkey(); break;
+ case addr_addtopresslist: addtopresslist(); break;
+ case addr_buttonone: buttonone(); break;
+ case addr_buttontwo: buttontwo(); break;
+ case addr_buttonthree: buttonthree(); break;
+ case addr_buttonfour: buttonfour(); break;
+ case addr_buttonfive: buttonfive(); break;
+ case addr_buttonsix: buttonsix(); break;
+ case addr_buttonseven: buttonseven(); break;
+ case addr_buttoneight: buttoneight(); break;
+ case addr_buttonnine: buttonnine(); break;
+ case addr_buttonnought: buttonnought(); break;
+ case addr_buttonenter: buttonenter(); break;
+ case addr_buttonpress: buttonpress(); break;
+ case addr_showouterpad: showouterpad(); break;
+ case addr_showkeypad: showkeypad(); break;
+ case addr_singlekey: singlekey(); break;
+ case addr_dumpkeypad: dumpkeypad(); break;
+ case addr_usemenu: usemenu(); break;
+ case addr_dumpmenu: dumpmenu(); break;
+ case addr_getundermenu: getundermenu(); break;
+ case addr_putundermenu: putundermenu(); break;
+ case addr_showoutermenu: showoutermenu(); break;
+ case addr_showmenu: showmenu(); break;
+ case addr_loadmenu: loadmenu(); break;
+ case addr_viewfolder: viewfolder(); break;
+ case addr_nextfolder: nextfolder(); break;
+ case addr_folderhints: folderhints(); break;
+ case addr_lastfolder: lastfolder(); break;
+ case addr_loadfolder: loadfolder(); break;
+ case addr_showfolder: showfolder(); break;
+ case addr_folderexit: folderexit(); break;
+ case addr_showleftpage: showleftpage(); break;
+ case addr_showrightpage: showrightpage(); break;
+ case addr_entersymbol: entersymbol(); break;
+ case addr_quitsymbol: quitsymbol(); break;
+ case addr_settopleft: settopleft(); break;
+ case addr_settopright: settopright(); break;
+ case addr_setbotleft: setbotleft(); break;
+ case addr_setbotright: setbotright(); break;
+ case addr_dumpsymbol: dumpsymbol(); break;
+ case addr_showsymbol: showsymbol(); break;
+ case addr_nextsymbol: nextsymbol(); break;
+ case addr_updatesymboltop: updatesymboltop(); break;
+ case addr_updatesymbolbot: updatesymbolbot(); break;
+ case addr_dumpsymbox: dumpsymbox(); break;
+ case addr_usediary: usediary(); break;
+ case addr_showdiary: showdiary(); break;
+ case addr_showdiarykeys: showdiarykeys(); break;
+ case addr_dumpdiarykeys: dumpdiarykeys(); break;
+ case addr_diarykeyp: diarykeyp(); break;
+ case addr_diarykeyn: diarykeyn(); break;
+ case addr_showdiarypage: showdiarypage(); break;
+ case addr_findtext1: findtext1(); break;
+ case addr_zoomonoff: zoomonoff(); break;
+ case addr_saveload: saveload(); break;
+ case addr_dosaveload: dosaveload(); break;
+ case addr_getbackfromops: getbackfromops(); break;
+ case addr_showmainops: showmainops(); break;
+ case addr_showdiscops: showdiscops(); break;
+ case addr_loadsavebox: loadsavebox(); break;
+ case addr_loadgame: loadgame(); break;
+ case addr_getbacktoops: getbacktoops(); break;
+ case addr_discops: discops(); break;
+ case addr_savegame: savegame(); break;
+ case addr_actualsave: actualsave(); break;
+ case addr_actualload: actualload(); break;
+ case addr_selectslot2: selectslot2(); break;
+ case addr_checkinput: checkinput(); break;
+ case addr_getnamepos: getnamepos(); break;
+ case addr_showopbox: showopbox(); break;
+ case addr_showloadops: showloadops(); break;
+ case addr_showsaveops: showsaveops(); break;
+ case addr_selectslot: selectslot(); break;
+ case addr_showslots: showslots(); break;
+ case addr_shownames: shownames(); break;
+ case addr_dosreturn: dosreturn(); break;
+ case addr_error: error(); break;
+ case addr_namestoold: namestoold(); break;
+ case addr_oldtonames: oldtonames(); break;
+ case addr_savefilewrite: savefilewrite(); break;
+ case addr_savefileread: savefileread(); break;
+ case addr_saveposition: saveposition(); break;
+ case addr_loadposition: loadposition(); break;
+ case addr_loadseg: loadseg(); break;
+ case addr_makeheader: makeheader(); break;
+ case addr_storeit: storeit(); break;
+ case addr_saveseg: saveseg(); break;
+ case addr_scanfornames: scanfornames(); break;
+ case addr_decide: decide(); break;
+ case addr_showdecisions: showdecisions(); break;
+ case addr_newgame: newgame(); break;
+ case addr_loadold: loadold(); break;
+ case addr_loadspeech: loadspeech(); break;
+ case addr_createname: createname(); break;
+ case addr_loadsample: loadsample(); break;
+ case addr_loadsecondsample: loadsecondsample(); break;
+ case addr_soundstartup: soundstartup(); break;
+ case addr_trysoundalloc: trysoundalloc(); break;
+ case addr_setsoundoff: setsoundoff(); break;
+ case addr_checksoundint: checksoundint(); break;
+ case addr_enablesoundint: enablesoundint(); break;
+ case addr_disablesoundint: disablesoundint(); break;
+ case addr_interupttest: interupttest(); break;
+ case addr_soundend: soundend(); break;
+ case addr_out22c: out22c(); break;
+ case addr_playchannel0: playchannel0(); break;
+ case addr_playchannel1: playchannel1(); break;
+ case addr_volumeadjust: volumeadjust(); break;
+ case addr_channel0only: channel0only(); break;
+ case addr_channel1only: channel1only(); break;
+ case addr_bothchannels: bothchannels(); break;
+ case addr_saveems: saveems(); break;
+ case addr_restoreems: restoreems(); break;
+ case addr_dmaend: dmaend(); break;
+ case addr_startdmablock: startdmablock(); break;
+ case addr_setuppit: setuppit(); break;
+ case addr_getridofpit: getridofpit(); break;
+ case addr_pitinterupt: pitinterupt(); break;
+ case addr_dreamweb: dreamweb(); break;
+ case addr_entrytexts: entrytexts(); break;
+ case addr_entryanims: entryanims(); break;
+ case addr_initialinv: initialinv(); break;
+ case addr_pickupob: pickupob(); break;
+ case addr_setupemm: setupemm(); break;
+ case addr_removeemm: removeemm(); break;
+ case addr_checkforemm: checkforemm(); break;
+ case addr_checkbasemem: checkbasemem(); break;
+ case addr_allocatebuffers: allocatebuffers(); break;
+ case addr_clearbuffers: clearbuffers(); break;
+ case addr_clearchanges: clearchanges(); break;
+ case addr_clearbeforeload: clearbeforeload(); break;
+ case addr_clearreels: clearreels(); break;
+ case addr_clearrest: clearrest(); break;
+ case addr_deallocatemem: deallocatemem(); break;
+ case addr_allocatemem: allocatemem(); break;
+ case addr_startup: startup(); break;
+ case addr_startup1: startup1(); break;
+ case addr_screenupdate: screenupdate(); break;
+ case addr_watchreel: watchreel(); break;
+ case addr_checkforshake: checkforshake(); break;
+ case addr_watchcount: watchcount(); break;
+ case addr_showtime: showtime(); break;
+ case addr_dumpwatch: dumpwatch(); break;
+ case addr_showbyte: showbyte(); break;
+ case addr_onedigit: onedigit(); break;
+ case addr_twodigitnum: twodigitnum(); break;
+ case addr_showword: showword(); break;
+ case addr_convnum: convnum(); break;
+ case addr_mainscreen: mainscreen(); break;
+ case addr_madmanrun: madmanrun(); break;
+ case addr_identifyob: identifyob(); break;
+ case addr_findpathofpoint: findpathofpoint(); break;
+ case addr_findfirstpath: findfirstpath(); break;
+ case addr_afternewroom: afternewroom(); break;
+ case addr_atmospheres: atmospheres(); break;
+ case addr_walkintoroom: walkintoroom(); break;
+ case addr_afterintroroom: afterintroroom(); break;
+ case addr_printmessage2: printmessage2(); break;
+ case addr_setwalk: setwalk(); break;
+ case addr_workoutframes: workoutframes(); break;
+ case addr_showicon: showicon(); break;
+ case addr_middlepanel: middlepanel(); break;
+ case addr_showman: showman(); break;
+ case addr_roomname: roomname(); break;
+ case addr_usecharset1: usecharset1(); break;
+ case addr_usetempcharset: usetempcharset(); break;
+ case addr_showexit: showexit(); break;
+ case addr_panelicons1: panelicons1(); break;
+ case addr_showwatch: showwatch(); break;
+ case addr_gettime: gettime(); break;
+ case addr_zoomicon: zoomicon(); break;
+ case addr_worktoscreenm: worktoscreenm(); break;
+ case addr_blank: blank(); break;
+ case addr_allpointer: allpointer(); break;
+ case addr_hangonw: hangonw(); break;
+ case addr_hangoncurs: hangoncurs(); break;
+ case addr_getunderzoom: getunderzoom(); break;
+ case addr_dumpzoom: dumpzoom(); break;
+ case addr_putunderzoom: putunderzoom(); break;
+ case addr_undertextline: undertextline(); break;
+ case addr_setmouse: setmouse(); break;
+ case addr_mousecall: mousecall(); break;
+ case addr_readkey: readkey(); break;
+ case addr_randomnum1: randomnum1(); break;
+ case addr_randomnum2: randomnum2(); break;
+ case addr_loadtraveltext: loadtraveltext(); break;
+ case addr_loadintotemp: loadintotemp(); break;
+ case addr_loadintotemp2: loadintotemp2(); break;
+ case addr_loadintotemp3: loadintotemp3(); break;
+ case addr_loadtempcharset: loadtempcharset(); break;
+ case addr_standardload: standardload(); break;
+ case addr_loadtemptext: loadtemptext(); break;
+ case addr_loadroom: loadroom(); break;
+ case addr_loadroomssample: loadroomssample(); break;
+ case addr_getridofreels: getridofreels(); break;
+ case addr_getridofall: getridofall(); break;
+ case addr_restorereels: restorereels(); break;
+ case addr_restoreall: restoreall(); break;
+ case addr_sortoutmap: sortoutmap(); break;
+ case addr_disablepath: disablepath(); break;
+ case addr_findroominloc: findroominloc(); break;
+ case addr_dontloadseg: dontloadseg(); break;
+ case addr_allocateload: allocateload(); break;
+ case addr_getridoftemp: getridoftemp(); break;
+ case addr_getridoftemptext: getridoftemptext(); break;
+ case addr_getridoftemp2: getridoftemp2(); break;
+ case addr_getridoftemp3: getridoftemp3(); break;
+ case addr_getridoftempcharset: getridoftempcharset(); break;
+ case addr_getridoftempsp: getridoftempsp(); break;
+ case addr_readsetdata: readsetdata(); break;
+ case addr_createfile: createfile(); break;
+ case addr_openfile: openfile(); break;
+ case addr_openfilefromc: openfilefromc(); break;
+ case addr_openfilenocheck: openfilenocheck(); break;
+ case addr_openforsave: openforsave(); break;
+ case addr_closefile: closefile(); break;
+ case addr_readfromfile: readfromfile(); break;
+ case addr_setkeyboardint: setkeyboardint(); break;
+ case addr_resetkeyboard: resetkeyboard(); break;
+ case addr_keyboardread: keyboardread(); break;
+ case addr_doload: doload(); break;
+ case addr_generalerror: generalerror(); break;
default: ::error("invalid call to %04x dispatched", (uint16)ax);
}
}
diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h
index b012663ab6..f3a763fbd8 100644
--- a/engines/dreamweb/dreamgen.h
+++ b/engines/dreamweb/dreamgen.h
@@ -3,665 +3,1327 @@
/* PLEASE DO NOT MODIFY THIS FILE. ALL CHANGES WILL BE LOST! LOOK FOR README FOR DETAILS */
+/* 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.
+ *
+ */
+
+
+
#include "dreamweb/runtime.h"
namespace DreamGen {
-
+#include "structs.h"
class DreamGenContext : public Context {
public:
void __start();
void __dispatch_call(uint16 addr);
+#include "stubs.h" // Allow hand-reversed functions to have a signature different than void f()
- const static uint16 kStartvars = 0;
- const static uint16 kProgresspoints = 1;
- const static uint16 kWatchon = 2;
- const static uint16 kShadeson = 3;
- const static uint16 kSecondcount = 4;
- const static uint16 kMinutecount = 5;
- const static uint16 kHourcount = 6;
- const static uint16 kZoomon = 7;
- const static uint16 kLocation = 8;
- const static uint16 kExpos = 9;
- const static uint16 kExframepos = 10;
- const static uint16 kExtextpos = 12;
- const static uint16 kCard1money = 14;
- const static uint16 kListpos = 16;
- const static uint16 kRyanpage = 18;
- const static uint16 kWatchingtime = 19;
- const static uint16 kReeltowatch = 21;
- const static uint16 kEndwatchreel = 23;
- const static uint16 kSpeedcount = 25;
- const static uint16 kWatchspeed = 26;
- const static uint16 kReeltohold = 27;
- const static uint16 kEndofholdreel = 29;
- const static uint16 kWatchmode = 31;
- const static uint16 kDestafterhold = 32;
- const static uint16 kNewsitem = 33;
- const static uint16 kLiftflag = 34;
- const static uint16 kLiftpath = 35;
- const static uint16 kLockstatus = 36;
- const static uint16 kDoorpath = 37;
- const static uint16 kCounttoopen = 38;
- const static uint16 kCounttoclose = 39;
- const static uint16 kRockstardead = 40;
- const static uint16 kGeneraldead = 41;
- const static uint16 kSartaindead = 42;
- const static uint16 kAidedead = 43;
- const static uint16 kBeenmugged = 44;
- const static uint16 kGunpassflag = 45;
- const static uint16 kCanmovealtar = 46;
- const static uint16 kTalkedtoattendant = 47;
- const static uint16 kTalkedtosparky = 48;
- const static uint16 kTalkedtoboss = 49;
- const static uint16 kTalkedtorecep = 50;
- const static uint16 kCardpassflag = 51;
- const static uint16 kMadmanflag = 52;
- const static uint16 kKeeperflag = 53;
- const static uint16 kLasttrigger = 54;
- const static uint16 kMandead = 55;
- const static uint16 kSeed = 56;
- const static uint16 kNeedtotravel = 59;
- const static uint16 kThroughdoor = 60;
- const static uint16 kNewobs = 61;
- const static uint16 kRyanon = 62;
- const static uint16 kCombatcount = 63;
- const static uint16 kLastweapon = 64;
- const static uint16 kDreamnumber = 65;
- const static uint16 kRoomafterdream = 66;
- const static uint16 kShakecounter = 67;
- const static uint16 kSpeechcount = 68;
- const static uint16 kCharshift = 69;
- const static uint16 kKerning = 71;
- const static uint16 kBrightness = 72;
- const static uint16 kRoomloaded = 73;
- const static uint16 kDidzoom = 74;
- const static uint16 kLinespacing = 75;
- const static uint16 kTextaddressx = 77;
- const static uint16 kTextaddressy = 79;
- const static uint16 kTextlen = 81;
- const static uint16 kLastxpos = 82;
- const static uint16 kIcontop = 84;
- const static uint16 kIconleft = 86;
- const static uint16 kItemframe = 88;
- const static uint16 kItemtotran = 89;
- const static uint16 kRoomad = 90;
- const static uint16 kOldsubject = 92;
- const static uint16 kWithobject = 94;
- const static uint16 kWithtype = 95;
- const static uint16 kLookcounter = 96;
- const static uint16 kCommand = 98;
- const static uint16 kCommandtype = 99;
- const static uint16 kOldcommandtype = 100;
- const static uint16 kObjecttype = 101;
- const static uint16 kGetback = 102;
- const static uint16 kInvopen = 103;
- const static uint16 kMainmode = 104;
- const static uint16 kPickup = 105;
- const static uint16 kLastinvpos = 106;
- const static uint16 kExamagain = 107;
- const static uint16 kNewtextline = 108;
- const static uint16 kOpenedob = 109;
- const static uint16 kOpenedtype = 110;
- const static uint16 kOldmapadx = 111;
- const static uint16 kOldmapady = 113;
- const static uint16 kMapadx = 115;
- const static uint16 kMapady = 117;
- const static uint16 kMapoffsetx = 119;
- const static uint16 kMapoffsety = 121;
- const static uint16 kMapxstart = 123;
- const static uint16 kMapystart = 125;
- const static uint16 kMapxsize = 127;
- const static uint16 kMapysize = 128;
- const static uint16 kHavedoneobs = 129;
- const static uint16 kManisoffscreen = 130;
- const static uint16 kRainspace = 131;
- const static uint16 kFacing = 132;
- const static uint16 kLeavedirection = 133;
- const static uint16 kTurntoface = 134;
- const static uint16 kTurndirection = 135;
- const static uint16 kMaintimer = 136;
- const static uint16 kIntrocount = 138;
- const static uint16 kArrowad = 139;
- const static uint16 kCurrentkey = 141;
- const static uint16 kOldkey = 142;
- const static uint16 kUseddirection = 143;
- const static uint16 kCurrentkey2 = 144;
- const static uint16 kTimercount = 145;
- const static uint16 kOldtimercount = 146;
- const static uint16 kMapx = 147;
- const static uint16 kMapy = 148;
- const static uint16 kNewscreen = 149;
- const static uint16 kRyanx = 150;
- const static uint16 kRyany = 151;
- const static uint16 kLastflag = 152;
- const static uint16 kLastflagex = 153;
- const static uint16 kFlagx = 154;
- const static uint16 kFlagy = 155;
- const static uint16 kCurrentex = 156;
- const static uint16 kCurrentfree = 157;
- const static uint16 kCurrentframe = 158;
- const static uint16 kFramesad = 160;
- const static uint16 kDataad = 162;
- const static uint16 kFrsegment = 164;
- const static uint16 kObjectx = 166;
- const static uint16 kObjecty = 168;
- const static uint16 kOffsetx = 170;
- const static uint16 kOffsety = 172;
- const static uint16 kSavesize = 174;
- const static uint16 kSavesource = 176;
- const static uint16 kSavex = 178;
- const static uint16 kSavey = 179;
- const static uint16 kCurrentob = 180;
- const static uint16 kPriority = 181;
- const static uint16 kDestpos = 182;
- const static uint16 kReallocation = 183;
- const static uint16 kRoomnum = 184;
- const static uint16 kNowinnewroom = 185;
- const static uint16 kResetmanxy = 186;
- const static uint16 kNewlocation = 187;
- const static uint16 kAutolocation = 188;
- const static uint16 kMustload = 189;
- const static uint16 kAnswered = 190;
- const static uint16 kSaidno = 191;
- const static uint16 kDoorcheck1 = 192;
- const static uint16 kDoorcheck2 = 193;
- const static uint16 kDoorcheck3 = 194;
- const static uint16 kDoorcheck4 = 195;
- const static uint16 kMousex = 196;
- const static uint16 kMousey = 198;
- const static uint16 kMousebutton = 200;
- const static uint16 kMousebutton1 = 202;
- const static uint16 kMousebutton2 = 204;
- const static uint16 kMousebutton3 = 206;
- const static uint16 kMousebutton4 = 208;
- const static uint16 kOldbutton = 210;
- const static uint16 kOldx = 212;
- const static uint16 kOldy = 214;
- const static uint16 kLastbutton = 216;
- const static uint16 kOldpointerx = 218;
- const static uint16 kOldpointery = 220;
- const static uint16 kDelherex = 222;
- const static uint16 kDelherey = 224;
- const static uint16 kPointerxs = 226;
- const static uint16 kPointerys = 227;
- const static uint16 kDelxs = 228;
- const static uint16 kDelys = 229;
- const static uint16 kPointerframe = 230;
- const static uint16 kPointerpower = 231;
- const static uint16 kAuxpointerframe = 232;
- const static uint16 kPointermode = 233;
- const static uint16 kPointerspeed = 234;
- const static uint16 kPointercount = 235;
- const static uint16 kInmaparea = 236;
- const static uint16 kReelpointer = 237;
- const static uint16 kSlotdata = 239;
- const static uint16 kThisslot = 240;
- const static uint16 kSlotflags = 241;
- const static uint16 kTakeoff = 242;
- const static uint16 kTalkmode = 244;
- const static uint16 kTalkpos = 245;
- const static uint16 kCharacter = 246;
- const static uint16 kPersondata = 247;
- const static uint16 kTalknum = 249;
- const static uint16 kNumberinroom = 250;
- const static uint16 kCurrentcel = 251;
- const static uint16 kOldselection = 252;
- const static uint16 kStopwalking = 253;
- const static uint16 kMouseon = 254;
- const static uint16 kPlayed = 255;
- const static uint16 kTimer1 = 257;
- const static uint16 kTimer2 = 258;
- const static uint16 kTimer3 = 259;
- const static uint16 kWholetimer = 260;
- const static uint16 kTimer1to = 262;
- const static uint16 kTimer2to = 263;
- const static uint16 kTimer3to = 264;
- const static uint16 kWatchdump = 265;
- const static uint16 kCurrentset = 266;
- const static uint16 kLogonum = 268;
- const static uint16 kOldlogonum = 269;
- const static uint16 kNewlogonum = 270;
- const static uint16 kNetseg = 271;
- const static uint16 kNetpoint = 273;
- const static uint16 kKeynum = 275;
- const static uint16 kCursorstate = 276;
- const static uint16 kPressed = 277;
- const static uint16 kPresspointer = 278;
- const static uint16 kGraphicpress = 280;
- const static uint16 kPresscount = 281;
- const static uint16 kKeypadax = 282;
- const static uint16 kKeypadcx = 284;
- const static uint16 kLightcount = 286;
- const static uint16 kFolderpage = 287;
- const static uint16 kDiarypage = 288;
- const static uint16 kMenucount = 289;
- const static uint16 kSymboltopx = 290;
- const static uint16 kSymboltopnum = 291;
- const static uint16 kSymboltopdir = 292;
- const static uint16 kSymbolbotx = 293;
- const static uint16 kSymbolbotnum = 294;
- const static uint16 kSymbolbotdir = 295;
- const static uint16 kSymboltolight = 296;
- const static uint16 kSymbol1 = 297;
- const static uint16 kSymbol2 = 298;
- const static uint16 kSymbol3 = 299;
- const static uint16 kSymbolnum = 300;
- const static uint16 kDumpx = 301;
- const static uint16 kDumpy = 303;
- const static uint16 kWalkandexam = 305;
- const static uint16 kWalkexamtype = 306;
- const static uint16 kWalkexamnum = 307;
- const static uint16 kCursloc = 308;
- const static uint16 kCurslocx = 310;
- const static uint16 kCurslocy = 312;
- const static uint16 kCurpos = 314;
- const static uint16 kMonadx = 316;
- const static uint16 kMonady = 318;
- const static uint16 kGotfrom = 320;
- const static uint16 kMonsource = 322;
- const static uint16 kNumtodo = 324;
- const static uint16 kTimecount = 326;
- const static uint16 kCounttotimed = 328;
- const static uint16 kTimedseg = 330;
- const static uint16 kTimedoffset = 332;
- const static uint16 kTimedy = 334;
- const static uint16 kTimedx = 335;
- const static uint16 kNeedtodumptimed = 336;
- const static uint16 kHandle = 337;
- const static uint16 kLoadingorsave = 339;
- const static uint16 kCurrentslot = 340;
- const static uint16 kCursorpos = 341;
- const static uint16 kColourpos = 342;
- const static uint16 kFadedirection = 343;
- const static uint16 kNumtofade = 344;
- const static uint16 kFadecount = 345;
- const static uint16 kAddtogreen = 346;
- const static uint16 kAddtored = 347;
- const static uint16 kAddtoblue = 348;
- const static uint16 kLastsoundreel = 349;
- const static uint16 kSoundbuffer = 351;
- const static uint16 kSoundbufferad = 353;
- const static uint16 kSoundbufferpage = 355;
- const static uint16 kSoundtimes = 356;
- const static uint16 kNeedsoundbuff = 357;
- const static uint16 kOldint9seg = 358;
- const static uint16 kOldint9add = 360;
- const static uint16 kOldint8seg = 362;
- const static uint16 kOldint8add = 364;
- const static uint16 kOldsoundintseg = 366;
- const static uint16 kOldsoundintadd = 368;
- const static uint16 kSoundbaseadd = 370;
- const static uint16 kDsp_status = 372;
- const static uint16 kDsp_write = 374;
- const static uint16 kDmaaddress = 376;
- const static uint16 kSoundint = 377;
- const static uint16 kSounddmachannel = 378;
- const static uint16 kSampleplaying = 379;
- const static uint16 kTestresult = 380;
- const static uint16 kCurrentirq = 381;
- const static uint16 kSpeechloaded = 382;
- const static uint16 kSpeechlength = 383;
- const static uint16 kVolume = 385;
- const static uint16 kVolumeto = 386;
- const static uint16 kVolumedirection = 387;
- const static uint16 kVolumecount = 388;
- const static uint16 kPlayblock = 389;
- const static uint16 kWongame = 390;
- const static uint16 kLasthardkey = 391;
- const static uint16 kBufferin = 392;
- const static uint16 kBufferout = 394;
- const static uint16 kExtras = 396;
- const static uint16 kWorkspace = 398;
- const static uint16 kMapstore = 400;
- const static uint16 kCharset1 = 402;
- const static uint16 kTempcharset = 404;
- const static uint16 kIcons1 = 406;
- const static uint16 kIcons2 = 408;
- const static uint16 kBuffers = 410;
- const static uint16 kMainsprites = 412;
- const static uint16 kBackdrop = 414;
- const static uint16 kMapdata = 416;
- const static uint16 kSounddata = 418;
- const static uint16 kSounddata2 = 420;
- const static uint16 kRecordspace = 422;
- const static uint16 kFreedat = 424;
- const static uint16 kSetdat = 426;
- const static uint16 kReel1 = 428;
- const static uint16 kReel2 = 430;
- const static uint16 kReel3 = 432;
- const static uint16 kRoomdesc = 434;
- const static uint16 kFreedesc = 436;
- const static uint16 kSetdesc = 438;
- const static uint16 kBlockdesc = 440;
- const static uint16 kSetframes = 442;
- const static uint16 kFreeframes = 444;
- const static uint16 kPeople = 446;
- const static uint16 kReels = 448;
- const static uint16 kCommandtext = 450;
- const static uint16 kPuzzletext = 452;
- const static uint16 kTraveltext = 454;
- const static uint16 kTempgraphics = 456;
- const static uint16 kTempgraphics2 = 458;
- const static uint16 kTempgraphics3 = 460;
- const static uint16 kTempsprites = 462;
- const static uint16 kTextfile1 = 464;
- const static uint16 kTextfile2 = 466;
- const static uint16 kTextfile3 = 468;
- const static uint16 kBlinkframe = 470;
- const static uint16 kBlinkcount = 471;
- const static uint16 kReasseschanges = 472;
- const static uint16 kPointerspath = 473;
- const static uint16 kManspath = 474;
- const static uint16 kPointerfirstpath = 475;
- const static uint16 kFinaldest = 476;
- const static uint16 kDestination = 477;
- const static uint16 kLinestartx = 478;
- const static uint16 kLinestarty = 480;
- const static uint16 kLineendx = 482;
- const static uint16 kLineendy = 484;
- const static uint16 kIncrement1 = 486;
- const static uint16 kIncrement2 = 488;
- const static uint16 kLineroutine = 490;
- const static uint16 kLinepointer = 491;
- const static uint16 kLinedirection = 492;
- const static uint16 kLinelength = 493;
- const static uint16 kLiftsoundcount = 494;
- const static uint16 kEmmhandle = 495;
- const static uint16 kEmmpageframe = 497;
- const static uint16 kEmmhardwarepage = 499;
- const static uint16 kCh0emmpage = 500;
- const static uint16 kCh0offset = 502;
- const static uint16 kCh0blockstocopy = 504;
- const static uint16 kCh0playing = 506;
- const static uint16 kCh0repeat = 507;
- const static uint16 kCh0oldemmpage = 508;
- const static uint16 kCh0oldoffset = 510;
- const static uint16 kCh0oldblockstocopy = 512;
- const static uint16 kCh1playing = 514;
- const static uint16 kCh1emmpage = 515;
- const static uint16 kCh1offset = 517;
- const static uint16 kCh1blockstocopy = 519;
- const static uint16 kCh1blocksplayed = 521;
- const static uint16 kSoundbufferwrite = 523;
- const static uint16 kSoundemmpage = 525;
- const static uint16 kSpeechemmpage = 527;
- const static uint16 kCurrentsample = 529;
- const static uint16 kRoomssample = 530;
- const static uint16 kGameerror = 531;
- const static uint16 kHowmuchalloc = 532;
- const static uint16 kReelroutines = 534;
- const static uint16 kReelcalls = 991;
- const static uint16 kRoombyroom = 1214;
- const static uint16 kR0 = 1326;
- const static uint16 kR1 = 1327;
- const static uint16 kR2 = 1331;
- const static uint16 kR6 = 1350;
- const static uint16 kR8 = 1357;
- const static uint16 kR9 = 1373;
- const static uint16 kR10 = 1380;
- const static uint16 kR11 = 1384;
- const static uint16 kR12 = 1388;
- const static uint16 kR13 = 1392;
- const static uint16 kR14 = 1405;
- const static uint16 kR20 = 1439;
- const static uint16 kR22 = 1461;
- const static uint16 kR23 = 1492;
- const static uint16 kR25 = 1505;
- const static uint16 kR26 = 1527;
- const static uint16 kR27 = 1549;
- const static uint16 kR28 = 1574;
- const static uint16 kR29 = 1593;
- const static uint16 kR45 = 1609;
- const static uint16 kR46 = 1616;
- const static uint16 kR47 = 1653;
- const static uint16 kR52 = 1666;
- const static uint16 kR53 = 1670;
- const static uint16 kR55 = 1677;
- const static uint16 kSpritename1 = 1819;
- const static uint16 kSpritename3 = 1832;
- const static uint16 kIdname = 1845;
- const static uint16 kCharacterset1 = 1857;
- const static uint16 kCharacterset2 = 1870;
- const static uint16 kCharacterset3 = 1883;
- const static uint16 kSamplename = 1896;
- const static uint16 kBasicsample = 1909;
- const static uint16 kIcongraphics0 = 1922;
- const static uint16 kIcongraphics1 = 1935;
- const static uint16 kExtragraphics1 = 1948;
- const static uint16 kIcongraphics8 = 1961;
- const static uint16 kMongraphicname = 1974;
- const static uint16 kMongraphics2 = 1987;
- const static uint16 kCityname = 2000;
- const static uint16 kTravelgraphic1 = 2013;
- const static uint16 kTravelgraphic2 = 2026;
- const static uint16 kDiarygraphic = 2039;
- const static uint16 kMonitorfile1 = 2052;
- const static uint16 kMonitorfile2 = 2065;
- const static uint16 kMonitorfile10 = 2078;
- const static uint16 kMonitorfile11 = 2091;
- const static uint16 kMonitorfile12 = 2104;
- const static uint16 kMonitorfile13 = 2117;
- const static uint16 kMonitorfile20 = 2130;
- const static uint16 kMonitorfile21 = 2143;
- const static uint16 kMonitorfile22 = 2156;
- const static uint16 kMonitorfile23 = 2169;
- const static uint16 kMonitorfile24 = 2182;
- const static uint16 kFoldertext = 2195;
- const static uint16 kDiarytext = 2208;
- const static uint16 kPuzzletextname = 2221;
- const static uint16 kTraveltextname = 2234;
- const static uint16 kIntrotextname = 2247;
- const static uint16 kEndtextname = 2260;
- const static uint16 kCommandtextname = 2273;
- const static uint16 kVolumetabname = 2286;
- const static uint16 kFoldergraphic1 = 2299;
- const static uint16 kFoldergraphic2 = 2312;
- const static uint16 kFoldergraphic3 = 2325;
- const static uint16 kSymbolgraphic = 2338;
- const static uint16 kGungraphic = 2351;
- const static uint16 kMonkface = 2364;
- const static uint16 kTitle0graphics = 2377;
- const static uint16 kTitle1graphics = 2390;
- const static uint16 kTitle2graphics = 2403;
- const static uint16 kTitle3graphics = 2416;
- const static uint16 kTitle4graphics = 2429;
- const static uint16 kTitle5graphics = 2442;
- const static uint16 kTitle6graphics = 2455;
- const static uint16 kTitle7graphics = 2468;
- const static uint16 kPalettescreen = 2481;
- const static uint16 kCurrentfile = 2970;
- const static uint16 kDmaaddresses = 5118;
- const static uint16 kFileheader = 6091;
- const static uint16 kFiledata = 6141;
- const static uint16 kExtradata = 6181;
- const static uint16 kRoomdata = 6187;
- const static uint16 kMadeuproomdat = 7979;
- const static uint16 kRoomscango = 8011;
- const static uint16 kRoompics = 8027;
- const static uint16 kOplist = 8042;
- const static uint16 kInputline = 8045;
- const static uint16 kLinedata = 8173;
- const static uint16 kPresslist = 8573;
- const static uint16 kSavenames = 8579;
- const static uint16 kSavefiles = 8698;
- const static uint16 kRecname = 8789;
- const static uint16 kQuitrequested = 8802;
- const static uint16 kStak = 8803;
- const static uint16 kBlocktextdat = (0);
- const static uint16 kPersonframes = (0);
- const static uint16 kDebuglevel1 = (0);
- const static uint16 kDebuglevel2 = (0);
- const static uint16 kPlayback = (0);
- const static uint16 kMap = (0);
- const static uint16 kSettextdat = (0);
- const static uint16 kSpanish = (0);
- const static uint16 kFramedata = (0);
- const static uint16 kRecording = (0);
- const static uint16 kFlags = (0);
- const static uint16 kGerman = (0);
- const static uint16 kTextunder = (0);
- const static uint16 kForeign = (0);
- const static uint16 kPathdata = (0);
- const static uint16 kDemo = (0);
- const static uint16 kExframedata = (0);
- const static uint16 kIntextdat = (0);
- const static uint16 kFreetextdat = (0);
- const static uint16 kFrframedata = (0);
- const static uint16 kSettext = (0+(130*2));
- const static uint16 kOpeninvlist = (0+(180*10));
- const static uint16 kRyaninvlist = (0+(180*10)+32);
- const static uint16 kPointerback = (0+(180*10)+32+60);
- const static uint16 kMapflags = (0+(180*10)+32+60+(32*32));
- const static uint16 kStartpal = (0+(180*10)+32+60+(32*32)+(11*10*3));
- const static uint16 kEndpal = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
- const static uint16 kMaingamepal = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
- const static uint16 kSpritetable = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
- const static uint16 kSetlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32));
- const static uint16 kFreelist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5));
- const static uint16 kExlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5));
- const static uint16 kPeoplelist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5));
- const static uint16 kZoomspace = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
- const static uint16 kPrintedlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40));
- const static uint16 kListofchanges = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
- const static uint16 kUndertimedtext = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
- const static uint16 kRainlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24));
- const static uint16 kInitialreelrouts = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64));
- const static uint16 kInitialvars = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534);
- const static uint16 kLengthofbuffer = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0);
- const static uint16 kReellist = (0+(36*144));
- const static uint16 kIntext = (0+(38*2));
- const static uint16 kLengthofmap = (0+(66*60));
- const static uint16 kFreetext = (0+(82*2));
- const static uint16 kBlocktext = (0+(98*2));
- const static uint16 kBlocks = (0+192);
- const static uint16 kFrframes = (0+2080);
- const static uint16 kExframes = (0+2080);
- const static uint16 kFrames = (0+2080);
- const static uint16 kExdata = (0+2080+30000);
- const static uint16 kExtextdat = (0+2080+30000+(16*114));
- const static uint16 kExtext = (0+2080+30000+(16*114)+((114+2)*2));
- const static uint16 kLengthofextra = (0+2080+30000+(16*114)+((114+2)*2)+18000);
- const static uint16 kPersontxtdat = (0+24);
- const static uint16 kPersontext = (0+24+(1026*2));
- const static uint16 kInputport = (0x63);
- const static uint16 kCd = (1);
- const static uint16 kUndertextsizey = (10);
- const static uint16 kNumexobjects = (114);
- const static uint16 kZoomy = (132);
- const static uint16 kFreedatlen = (16*80);
- const static uint16 kUndertextsizex = (180);
- const static uint16 kExtextlen = (18000);
- const static uint16 kLenofmapstore = (22*8*20*8);
- const static uint16 kUndertimedysize = (24);
- const static uint16 kNumchanges = (250);
- const static uint16 kExframeslen = (30000);
- const static uint16 kTablesize = (32);
- const static uint16 kScreenwidth = (320);
- const static uint16 kKeypadx = (36+112);
- const static uint16 kItempicsize = (44);
- const static uint16 kDiaryy = (48+12);
- const static uint16 kOpsy = (52);
- const static uint16 kSymboly = (56);
- const static uint16 kInventy = (58);
- const static uint16 kMenuy = (60);
- const static uint16 kOpsx = (60);
- const static uint16 kMaplength = (60);
- const static uint16 kHeaderlen = (6187-6091);
- const static uint16 kSymbolx = (64);
- const static uint16 kSetdatlen = (64*128);
- const static uint16 kMapwidth = (66);
- const static uint16 kTextstart = (66*2);
- const static uint16 kMaplen = (66*60);
- const static uint16 kDiaryx = (68+24);
- const static uint16 kLengthofvars = (68-0);
- const static uint16 kKeypady = (72);
- const static uint16 kZoomx = (8);
- const static uint16 kInventx = (80);
- const static uint16 kMenux = (80+40);
- const static uint16 kLenofreelrouts = (991-534);
+ static const uint16 addr_dreamweb = 0xc948;
+ static const uint16 addr_keyboardread = 0xcbb4;
+ static const uint16 addr_resetkeyboard = 0xcbb0;
+ static const uint16 addr_setkeyboardint = 0xcbac;
+ static const uint16 addr_readfromfile = 0xcba8;
+ static const uint16 addr_closefile = 0xcba4;
+ static const uint16 addr_openforsave = 0xcba0;
+ static const uint16 addr_openfilenocheck = 0xcb9c;
+ static const uint16 addr_openfilefromc = 0xcb94;
+ static const uint16 addr_openfile = 0xcb90;
+ static const uint16 addr_createfile = 0xcb8c;
+ static const uint16 addr_readsetdata = 0xcb88;
+ static const uint16 addr_getridoftempsp = 0xcb84;
+ static const uint16 addr_getridoftempcharset = 0xcb80;
+ static const uint16 addr_getridoftemp3 = 0xcb7c;
+ static const uint16 addr_getridoftemp2 = 0xcb78;
+ static const uint16 addr_getridoftemptext = 0xcb74;
+ static const uint16 addr_getridoftemp = 0xcb70;
+ static const uint16 addr_allocateload = 0xcb68;
+ static const uint16 addr_dontloadseg = 0xcb64;
+ static const uint16 addr_findroominloc = 0xcb58;
+ static const uint16 addr_disablepath = 0xcb50;
+ static const uint16 addr_sortoutmap = 0xcb48;
+ static const uint16 addr_restoreall = 0xcb44;
+ static const uint16 addr_restorereels = 0xcb40;
+ static const uint16 addr_getridofall = 0xcb3c;
+ static const uint16 addr_getridofreels = 0xcb38;
+ static const uint16 addr_loadroomssample = 0xcb34;
+ static const uint16 addr_loadroom = 0xcb30;
+ static const uint16 addr_loadtemptext = 0xcb2c;
+ static const uint16 addr_standardload = 0xcb28;
+ static const uint16 addr_loadtempcharset = 0xcb24;
+ static const uint16 addr_loadintotemp3 = 0xcb20;
+ static const uint16 addr_loadintotemp2 = 0xcb1c;
+ static const uint16 addr_loadintotemp = 0xcb18;
+ static const uint16 addr_loadtraveltext = 0xcb14;
+ static const uint16 addr_randomnum2 = 0xcb08;
+ static const uint16 addr_randomnum1 = 0xcb04;
+ static const uint16 addr_readkey = 0xcafc;
+ static const uint16 addr_mousecall = 0xcae8;
+ static const uint16 addr_setmouse = 0xcae0;
+ static const uint16 addr_undertextline = 0xcad0;
+ static const uint16 addr_putunderzoom = 0xcabc;
+ static const uint16 addr_dumpzoom = 0xcab8;
+ static const uint16 addr_getunderzoom = 0xcab4;
+ static const uint16 addr_hangoncurs = 0xcab0;
+ static const uint16 addr_hangonw = 0xcaac;
+ static const uint16 addr_allpointer = 0xcaa4;
+ static const uint16 addr_blank = 0xcaa0;
+ static const uint16 addr_worktoscreenm = 0xca9c;
+ static const uint16 addr_zoomicon = 0xca90;
+ static const uint16 addr_gettime = 0xca8c;
+ static const uint16 addr_showwatch = 0xca88;
+ static const uint16 addr_panelicons1 = 0xca84;
+ static const uint16 addr_showexit = 0xca80;
+ static const uint16 addr_usetempcharset = 0xca7c;
+ static const uint16 addr_usecharset1 = 0xca78;
+ static const uint16 addr_roomname = 0xca74;
+ static const uint16 addr_showman = 0xca6c;
+ static const uint16 addr_middlepanel = 0xca68;
+ static const uint16 addr_showicon = 0xca64;
+ static const uint16 addr_workoutframes = 0xca54;
+ static const uint16 addr_setwalk = 0xca44;
+ static const uint16 addr_printmessage2 = 0xca30;
+ static const uint16 addr_afterintroroom = 0xca14;
+ static const uint16 addr_walkintoroom = 0xca10;
+ static const uint16 addr_atmospheres = 0xca0c;
+ static const uint16 addr_afternewroom = 0xca08;
+ static const uint16 addr_findfirstpath = 0xc9f0;
+ static const uint16 addr_findpathofpoint = 0xc9ec;
+ static const uint16 addr_identifyob = 0xc9d4;
+ static const uint16 addr_madmanrun = 0xc9cc;
+ static const uint16 addr_mainscreen = 0xc9c8;
+ static const uint16 addr_convnum = 0xc9c4;
+ static const uint16 addr_showword = 0xc9c0;
+ static const uint16 addr_twodigitnum = 0xc9bc;
+ static const uint16 addr_onedigit = 0xc9b8;
+ static const uint16 addr_showbyte = 0xc9b4;
+ static const uint16 addr_dumpwatch = 0xc9b0;
+ static const uint16 addr_showtime = 0xc9ac;
+ static const uint16 addr_watchcount = 0xc9a8;
+ static const uint16 addr_checkforshake = 0xc9a4;
+ static const uint16 addr_watchreel = 0xc9a0;
+ static const uint16 addr_screenupdate = 0xc99c;
+ static const uint16 addr_startup1 = 0xc998;
+ static const uint16 addr_startup = 0xc994;
+ static const uint16 addr_allocatemem = 0xc988;
+ static const uint16 addr_deallocatemem = 0xc984;
+ static const uint16 addr_clearrest = 0xc980;
+ static const uint16 addr_clearreels = 0xc97c;
+ static const uint16 addr_clearbeforeload = 0xc978;
+ static const uint16 addr_clearchanges = 0xc974;
+ static const uint16 addr_clearbuffers = 0xc970;
+ static const uint16 addr_allocatebuffers = 0xc96c;
+ static const uint16 addr_checkbasemem = 0xc968;
+ static const uint16 addr_checkforemm = 0xc964;
+ static const uint16 addr_removeemm = 0xc960;
+ static const uint16 addr_setupemm = 0xc95c;
+ static const uint16 addr_pickupob = 0xc958;
+ static const uint16 addr_initialinv = 0xc954;
+ static const uint16 addr_entryanims = 0xc950;
+ static const uint16 addr_entrytexts = 0xc94c;
+ static const uint16 addr_pitinterupt = 0xc944;
+ static const uint16 addr_getridofpit = 0xc940;
+ static const uint16 addr_setuppit = 0xc93c;
+ static const uint16 addr_startdmablock = 0xc938;
+ static const uint16 addr_dmaend = 0xc934;
+ static const uint16 addr_restoreems = 0xc92c;
+ static const uint16 addr_saveems = 0xc928;
+ static const uint16 addr_bothchannels = 0xc924;
+ static const uint16 addr_channel1only = 0xc91c;
+ static const uint16 addr_channel0only = 0xc918;
+ static const uint16 addr_volumeadjust = 0xc908;
+ static const uint16 addr_playchannel1 = 0xc900;
+ static const uint16 addr_playchannel0 = 0xc8fc;
+ static const uint16 addr_out22c = 0xc8f8;
+ static const uint16 addr_soundend = 0xc8f4;
+ static const uint16 addr_interupttest = 0xc8f0;
+ static const uint16 addr_disablesoundint = 0xc8ec;
+ static const uint16 addr_enablesoundint = 0xc8e8;
+ static const uint16 addr_checksoundint = 0xc8e4;
+ static const uint16 addr_setsoundoff = 0xc8e0;
+ static const uint16 addr_trysoundalloc = 0xc8dc;
+ static const uint16 addr_soundstartup = 0xc8d8;
+ static const uint16 addr_loadsecondsample = 0xc8d4;
+ static const uint16 addr_loadsample = 0xc8d0;
+ static const uint16 addr_createname = 0xc8cc;
+ static const uint16 addr_loadspeech = 0xc8c8;
+ static const uint16 addr_loadold = 0xc8c4;
+ static const uint16 addr_doload = 0xcbb8;
+ static const uint16 addr_newgame = 0xc8c0;
+ static const uint16 addr_showdecisions = 0xc8bc;
+ static const uint16 addr_decide = 0xc8b8;
+ static const uint16 addr_scanfornames = 0xc8b4;
+ static const uint16 addr_saveseg = 0xc8ac;
+ static const uint16 addr_storeit = 0xc8a8;
+ static const uint16 addr_makeheader = 0xc8a4;
+ static const uint16 addr_loadseg = 0xc8a0;
+ static const uint16 addr_loadposition = 0xc89c;
+ static const uint16 addr_saveposition = 0xc898;
+ static const uint16 addr_savefileread = 0xc894;
+ static const uint16 addr_savefilewrite = 0xc890;
+ static const uint16 addr_oldtonames = 0xc88c;
+ static const uint16 addr_namestoold = 0xc888;
+ static const uint16 addr_error = 0xc884;
+ static const uint16 addr_generalerror = 0xcbbc;
+ static const uint16 addr_dosreturn = 0xc880;
+ static const uint16 addr_shownames = 0xc87c;
+ static const uint16 addr_showslots = 0xc878;
+ static const uint16 addr_selectslot = 0xc874;
+ static const uint16 addr_showsaveops = 0xc870;
+ static const uint16 addr_showloadops = 0xc86c;
+ static const uint16 addr_showopbox = 0xc868;
+ static const uint16 addr_getnamepos = 0xc864;
+ static const uint16 addr_checkinput = 0xc860;
+ static const uint16 addr_selectslot2 = 0xc85c;
+ static const uint16 addr_actualload = 0xc858;
+ static const uint16 addr_actualsave = 0xc854;
+ static const uint16 addr_savegame = 0xc850;
+ static const uint16 addr_discops = 0xc84c;
+ static const uint16 addr_getbacktoops = 0xc848;
+ static const uint16 addr_loadgame = 0xc844;
+ static const uint16 addr_loadsavebox = 0xc840;
+ static const uint16 addr_showdiscops = 0xc83c;
+ static const uint16 addr_showmainops = 0xc838;
+ static const uint16 addr_getbackfromops = 0xc834;
+ static const uint16 addr_dosaveload = 0xc830;
+ static const uint16 addr_saveload = 0xc82c;
+ static const uint16 addr_zoomonoff = 0xc828;
+ static const uint16 addr_findtext1 = 0xc824;
+ static const uint16 addr_showdiarypage = 0xc820;
+ static const uint16 addr_diarykeyn = 0xc81c;
+ static const uint16 addr_diarykeyp = 0xc818;
+ static const uint16 addr_dumpdiarykeys = 0xc814;
+ static const uint16 addr_showdiarykeys = 0xc810;
+ static const uint16 addr_showdiary = 0xc80c;
+ static const uint16 addr_usediary = 0xc808;
+ static const uint16 addr_dumpsymbox = 0xc804;
+ static const uint16 addr_updatesymbolbot = 0xc800;
+ static const uint16 addr_updatesymboltop = 0xc7fc;
+ static const uint16 addr_nextsymbol = 0xc7f8;
+ static const uint16 addr_showsymbol = 0xc7f4;
+ static const uint16 addr_dumpsymbol = 0xc7f0;
+ static const uint16 addr_setbotright = 0xc7ec;
+ static const uint16 addr_setbotleft = 0xc7e8;
+ static const uint16 addr_settopright = 0xc7e4;
+ static const uint16 addr_settopleft = 0xc7e0;
+ static const uint16 addr_quitsymbol = 0xc7dc;
+ static const uint16 addr_entersymbol = 0xc7d8;
+ static const uint16 addr_showrightpage = 0xc7d4;
+ static const uint16 addr_showleftpage = 0xc7d0;
+ static const uint16 addr_folderexit = 0xc7cc;
+ static const uint16 addr_showfolder = 0xc7c8;
+ static const uint16 addr_loadfolder = 0xc7c4;
+ static const uint16 addr_lastfolder = 0xc7c0;
+ static const uint16 addr_folderhints = 0xc7bc;
+ static const uint16 addr_nextfolder = 0xc7b8;
+ static const uint16 addr_viewfolder = 0xc7b4;
+ static const uint16 addr_loadmenu = 0xc7b0;
+ static const uint16 addr_showmenu = 0xc7ac;
+ static const uint16 addr_showoutermenu = 0xc7a8;
+ static const uint16 addr_putundermenu = 0xc7a4;
+ static const uint16 addr_getundermenu = 0xc7a0;
+ static const uint16 addr_dumpmenu = 0xc79c;
+ static const uint16 addr_usemenu = 0xc798;
+ static const uint16 addr_dumpkeypad = 0xc794;
+ static const uint16 addr_singlekey = 0xc790;
+ static const uint16 addr_showkeypad = 0xc78c;
+ static const uint16 addr_showouterpad = 0xc788;
+ static const uint16 addr_buttonpress = 0xc784;
+ static const uint16 addr_buttonenter = 0xc780;
+ static const uint16 addr_buttonnought = 0xc77c;
+ static const uint16 addr_buttonnine = 0xc778;
+ static const uint16 addr_buttoneight = 0xc774;
+ static const uint16 addr_buttonseven = 0xc770;
+ static const uint16 addr_buttonsix = 0xc76c;
+ static const uint16 addr_buttonfive = 0xc768;
+ static const uint16 addr_buttonfour = 0xc764;
+ static const uint16 addr_buttonthree = 0xc760;
+ static const uint16 addr_buttontwo = 0xc75c;
+ static const uint16 addr_buttonone = 0xc758;
+ static const uint16 addr_addtopresslist = 0xc754;
+ static const uint16 addr_quitkey = 0xc750;
+ static const uint16 addr_loadkeypad = 0xc74c;
+ static const uint16 addr_entercode = 0xc748;
+ static const uint16 addr_usewinch = 0xc744;
+ static const uint16 addr_useplate = 0xc740;
+ static const uint16 addr_usebuttona = 0xc73c;
+ static const uint16 addr_useshield = 0xc738;
+ static const uint16 addr_usegun = 0xc734;
+ static const uint16 addr_usechurchgate = 0xc730;
+ static const uint16 addr_usewall = 0xc72c;
+ static const uint16 addr_edenscdplayer = 0xc728;
+ static const uint16 addr_setuptimeduse = 0xc71c;
+ static const uint16 addr_autoappear = 0xc70c;
+ static const uint16 addr_switchryanoff = 0xc700;
+ static const uint16 addr_switchryanon = 0xc6fc;
+ static const uint16 addr_removefreeobject = 0xc6f4;
+ static const uint16 addr_placefreeobject = 0xc6f0;
+ static const uint16 addr_issetobonmap = 0xc6ec;
+ static const uint16 addr_findpuztext = 0xc6e0;
+ static const uint16 addr_showpuztext = 0xc6dc;
+ static const uint16 addr_putbackobstuff = 0xc6d8;
+ static const uint16 addr_checkinside = 0xc6d0;
+ static const uint16 addr_isryanholding = 0xc6cc;
+ static const uint16 addr_findexobject = 0xc6c8;
+ static const uint16 addr_findsetobject = 0xc6c4;
+ static const uint16 addr_selectob = 0xc6bc;
+ static const uint16 addr_withwhat = 0xc6b8;
+ static const uint16 addr_useelvdoor = 0xc6b4;
+ static const uint16 addr_useaxe = 0xc6b0;
+ static const uint16 addr_usecooker = 0xc6ac;
+ static const uint16 addr_usestereo = 0xc6a8;
+ static const uint16 addr_usekey = 0xc6a4;
+ static const uint16 addr_useelevator5 = 0xc6a0;
+ static const uint16 addr_useelevator2 = 0xc69c;
+ static const uint16 addr_useelevator4 = 0xc698;
+ static const uint16 addr_useelevator3 = 0xc694;
+ static const uint16 addr_showfirstuse = 0xc690;
+ static const uint16 addr_useelevator1 = 0xc68c;
+ static const uint16 addr_usehandle = 0xc688;
+ static const uint16 addr_usewire = 0xc684;
+ static const uint16 addr_usehatch = 0xc680;
+ static const uint16 addr_usecontrol = 0xc67c;
+ static const uint16 addr_moneypoke = 0xc678;
+ static const uint16 addr_lookatcard = 0xc674;
+ static const uint16 addr_usecashcard = 0xc670;
+ static const uint16 addr_usecardreader3 = 0xc66c;
+ static const uint16 addr_usecardreader2 = 0xc668;
+ static const uint16 addr_usecardreader1 = 0xc664;
+ static const uint16 addr_showseconduse = 0xc660;
+ static const uint16 addr_uselighter = 0xc65c;
+ static const uint16 addr_usepoolreader = 0xc658;
+ static const uint16 addr_calledensdlift = 0xc654;
+ static const uint16 addr_calledenslift = 0xc650;
+ static const uint16 addr_callhotellift = 0xc64c;
+ static const uint16 addr_trapdoor = 0xc648;
+ static const uint16 addr_grafittidoor = 0xc644;
+ static const uint16 addr_openhoteldoor2 = 0xc640;
+ static const uint16 addr_openhoteldoor = 0xc63c;
+ static const uint16 addr_drawitall = 0xc638;
+ static const uint16 addr_isitright = 0xc634;
+ static const uint16 addr_opensarters = 0xc630;
+ static const uint16 addr_openeden = 0xc62c;
+ static const uint16 addr_openpoolboss = 0xc628;
+ static const uint16 addr_openryan = 0xc624;
+ static const uint16 addr_usebalcony = 0xc620;
+ static const uint16 addr_usewindow = 0xc61c;
+ static const uint16 addr_openyourneighbour = 0xc618;
+ static const uint16 addr_nextcolon = 0xc614;
+ static const uint16 addr_openlouis = 0xc610;
+ static const uint16 addr_usedryer = 0xc60c;
+ static const uint16 addr_opentvdoor = 0xc608;
+ static const uint16 addr_usealtar = 0xc604;
+ static const uint16 addr_usehole = 0xc600;
+ static const uint16 addr_usechurchhole = 0xc5fc;
+ static const uint16 addr_sitdowninbar = 0xc5f8;
+ static const uint16 addr_wearshades = 0xc5f4;
+ static const uint16 addr_wearwatch = 0xc5f0;
+ static const uint16 addr_useopenbox = 0xc5ec;
+ static const uint16 addr_userailing = 0xc5e8;
+ static const uint16 addr_usecoveredbox = 0xc5e4;
+ static const uint16 addr_useclearbox = 0xc5e0;
+ static const uint16 addr_usecart = 0xc5dc;
+ static const uint16 addr_useslab = 0xc5d8;
+ static const uint16 addr_slabdoorf = 0xc5d4;
+ static const uint16 addr_slabdoore = 0xc5d0;
+ static const uint16 addr_slabdoorc = 0xc5cc;
+ static const uint16 addr_slabdoord = 0xc5c8;
+ static const uint16 addr_slabdoorb = 0xc5c4;
+ static const uint16 addr_slabdoora = 0xc5c0;
+ static const uint16 addr_useladderb = 0xc5bc;
+ static const uint16 addr_useladder = 0xc5b8;
+ static const uint16 addr_chewy = 0xc5b4;
+ static const uint16 addr_useplinth = 0xc5b0;
+ static const uint16 addr_usefullcart = 0xc5ac;
+ static const uint16 addr_usepipe = 0xc5a8;
+ static const uint16 addr_nothelderror = 0xc5a4;
+ static const uint16 addr_usetrainer = 0xc5a0;
+ static const uint16 addr_opentomb = 0xc59c;
+ static const uint16 addr_hotelbell = 0xc598;
+ static const uint16 addr_hotelcontrol = 0xc594;
+ static const uint16 addr_playguitar = 0xc590;
+ static const uint16 addr_runtap = 0xc58c;
+ static const uint16 addr_wheelsound = 0xc588;
+ static const uint16 addr_useobject = 0xc580;
+ static const uint16 addr_delcurs = 0xc57c;
+ static const uint16 addr_printcurs = 0xc578;
+ static const uint16 addr_triggermessage = 0xc574;
+ static const uint16 addr_processtrigger = 0xc570;
+ static const uint16 addr_monmessage = 0xc56c;
+ static const uint16 addr_showcurrentfile = 0xc568;
+ static const uint16 addr_printlogo = 0xc564;
+ static const uint16 addr_monitorlogo = 0xc560;
+ static const uint16 addr_scrollmonitor = 0xc558;
+ static const uint16 addr_parser = 0xc554;
+ static const uint16 addr_searchforstring = 0xc550;
+ static const uint16 addr_getkeyandlogo = 0xc54c;
+ static const uint16 addr_dirfile = 0xc548;
+ static const uint16 addr_read = 0xc544;
+ static const uint16 addr_showkeys = 0xc540;
+ static const uint16 addr_signon = 0xc53c;
+ static const uint16 addr_searchforfiles = 0xc538;
+ static const uint16 addr_dircom = 0xc534;
+ static const uint16 addr_neterror = 0xc530;
+ static const uint16 addr_execcommand = 0xc52c;
+ static const uint16 addr_delchar = 0xc528;
+ static const uint16 addr_makecaps = 0xc524;
+ static const uint16 addr_input = 0xc520;
+ static const uint16 addr_locklightoff = 0xc51c;
+ static const uint16 addr_locklighton = 0xc518;
+ static const uint16 addr_accesslightoff = 0xc514;
+ static const uint16 addr_accesslighton = 0xc510;
+ static const uint16 addr_powerlightoff = 0xc50c;
+ static const uint16 addr_powerlighton = 0xc508;
+ static const uint16 addr_randomaccess = 0xc504;
+ static const uint16 addr_turnonpower = 0xc500;
+ static const uint16 addr_lookininterface = 0xc4fc;
+ static const uint16 addr_loadcart = 0xc4f8;
+ static const uint16 addr_loadnews = 0xc4f4;
+ static const uint16 addr_loadpersonal = 0xc4f0;
+ static const uint16 addr_printoutermon = 0xc4ec;
+ static const uint16 addr_usemon = 0xc4e8;
+ static const uint16 addr_readcitypic = 0xc4e4;
+ static const uint16 addr_readdesticon = 0xc4e0;
+ static const uint16 addr_resetlocation = 0xc4dc;
+ static const uint16 addr_setlocation = 0xc4d8;
+ static const uint16 addr_getlocation = 0xc4d4;
+ static const uint16 addr_destselect = 0xc4d0;
+ static const uint16 addr_lastdest = 0xc4cc;
+ static const uint16 addr_nextdest = 0xc4c8;
+ static const uint16 addr_showarrows = 0xc4c4;
+ static const uint16 addr_getdestinfo = 0xc4c0;
+ static const uint16 addr_locationpic = 0xc4bc;
+ static const uint16 addr_putundercentre = 0xc4b8;
+ static const uint16 addr_getundercentre = 0xc4b4;
+ static const uint16 addr_lookatplace = 0xc4b0;
+ static const uint16 addr_showcity = 0xc4ac;
+ static const uint16 addr_selectlocation = 0xc4a8;
+ static const uint16 addr_newplace = 0xc4a4;
+ static const uint16 addr_redes = 0xc4a0;
+ static const uint16 addr_hangonpq = 0xc49c;
+ static const uint16 addr_dosometalk = 0xc498;
+ static const uint16 addr_moretalk = 0xc494;
+ static const uint16 addr_getpersontext = 0xc490;
+ static const uint16 addr_starttalk = 0xc48c;
+ static const uint16 addr_getpersframe = 0xc488;
+ static const uint16 addr_convicons = 0xc484;
+ static const uint16 addr_talk = 0xc480;
+ static const uint16 addr_getback1 = 0xc47c;
+ static const uint16 addr_redrawmainscrn = 0xc478;
+ static const uint16 addr_dolook = 0xc474;
+ static const uint16 addr_look = 0xc470;
+ static const uint16 addr_autolook = 0xc46c;
+ static const uint16 addr_drawfloor = 0xc428;
+ static const uint16 addr_blockget = 0xc424;
+ static const uint16 addr_deleteextext = 0xc420;
+ static const uint16 addr_deleteexframe = 0xc41c;
+ static const uint16 addr_deleteexobject = 0xc418;
+ static const uint16 addr_purgeanitem = 0xc414;
+ static const uint16 addr_emergencypurge = 0xc410;
+ static const uint16 addr_purgealocation = 0xc40c;
+ static const uint16 addr_transfertext = 0xc404;
+ static const uint16 addr_transfercontoex = 0xc400;
+ static const uint16 addr_pickupconts = 0xc3fc;
+ static const uint16 addr_transfertoex = 0xc3f8;
+ static const uint16 addr_outofopen = 0xc3f4;
+ static const uint16 addr_checkobjectsize = 0xc3f0;
+ static const uint16 addr_errormessage3 = 0xc3ec;
+ static const uint16 addr_errormessage2 = 0xc3e8;
+ static const uint16 addr_errormessage1 = 0xc3e4;
+ static const uint16 addr_useopened = 0xc3e0;
+ static const uint16 addr_selectopenob = 0xc3dc;
+ static const uint16 addr_removeobfrominv = 0xc3d8;
+ static const uint16 addr_cantdrop = 0xc3d0;
+ static const uint16 addr_droperror = 0xc3cc;
+ static const uint16 addr_dropobject = 0xc3c8;
+ static const uint16 addr_findopenpos = 0xc3c4;
+ static const uint16 addr_findinvpos = 0xc3c0;
+ static const uint16 addr_getsetad = 0xc3bc;
+ static const uint16 addr_getopenedsize = 0xc3b8;
+ static const uint16 addr_getanyaddir = 0xc3b4;
+ static const uint16 addr_getanyad = 0xc3b0;
+ static const uint16 addr_geteitherad = 0xc3ac;
+ static const uint16 addr_getexad = 0xc3a8;
+ static const uint16 addr_getfreead = 0xc3a4;
+ static const uint16 addr_outofinv = 0xc3a0;
+ static const uint16 addr_intoinv = 0xc398;
+ static const uint16 addr_swapwithopen = 0xc394;
+ static const uint16 addr_swapwithinv = 0xc390;
+ static const uint16 addr_reexfromopen = 0xc38c;
+ static const uint16 addr_reexfrominv = 0xc388;
+ static const uint16 addr_examinventory = 0xc384;
+ static const uint16 addr_setpickup = 0xc380;
+ static const uint16 addr_inventory = 0xc37c;
+ static const uint16 addr_searchforsame = 0xc374;
+ static const uint16 addr_getobtextstart = 0xc370;
+ static const uint16 addr_obsthatdothings = 0xc36c;
+ static const uint16 addr_additionaltext = 0xc368;
+ static const uint16 addr_describeob = 0xc364;
+ static const uint16 addr_examicon = 0xc35c;
+ static const uint16 addr_openob = 0xc354;
+ static const uint16 addr_openinv = 0xc34c;
+ static const uint16 addr_incryanpage = 0xc348;
+ static const uint16 addr_getbackfromob = 0xc344;
+ static const uint16 addr_makemainscreen = 0xc340;
+ static const uint16 addr_examineob = 0xc33c;
+ static const uint16 addr_findallopen = 0xc32c;
+ static const uint16 addr_fillopen = 0xc324;
+ static const uint16 addr_monprint = 0xc314;
+ static const uint16 addr_realcredits = 0xc2f8;
+ static const uint16 addr_set16colpalette = 0xc2f4;
+ static const uint16 addr_mode640x480 = 0xc2f0;
+ static const uint16 addr_loadintroroom = 0xc2ec;
+ static const uint16 addr_runendseq = 0xc2e8;
+ static const uint16 addr_runintroseq = 0xc2e4;
+ static const uint16 addr_intro = 0xc2e0;
+ static const uint16 addr_hangone = 0xc2dc;
+ static const uint16 addr_biblequote = 0xc2d8;
+ static const uint16 addr_credits = 0xc2d4;
+ static const uint16 addr_gettingshot = 0xc2d0;
+ static const uint16 addr_showmonk = 0xc2cc;
+ static const uint16 addr_monkspeaking = 0xc2c8;
+ static const uint16 addr_endgame = 0xc2c4;
+ static const uint16 addr_titles = 0xc2c0;
+ static const uint16 addr_initialmoncols = 0xc2bc;
+ static const uint16 addr_fadeupyellows = 0xc2b8;
+ static const uint16 addr_fadeupmonfirst = 0xc2b4;
+ static const uint16 addr_fadeupmon = 0xc2b0;
+ static const uint16 addr_fadedownmon = 0xc2ac;
+ static const uint16 addr_dumpcurrent = 0xc2a8;
+ static const uint16 addr_allpalette = 0xc2a4;
+ static const uint16 addr_paltoendpal = 0xc2a0;
+ static const uint16 addr_startpaltoend = 0xc29c;
+ static const uint16 addr_endpaltostart = 0xc298;
+ static const uint16 addr_paltostartpal = 0xc294;
+ static const uint16 addr_showgroup = 0xc290;
+ static const uint16 addr_greyscalesum = 0xc28c;
+ static const uint16 addr_fadecalculation = 0xc288;
+ static const uint16 addr_rollem = 0xc284;
+ static const uint16 addr_rollendcredits2 = 0xc280;
+ static const uint16 addr_showgun = 0xc27c;
+ static const uint16 addr_clearstartpal = 0xc278;
+ static const uint16 addr_fadescreendowns = 0xc274;
+ static const uint16 addr_fadescreendown = 0xc270;
+ static const uint16 addr_fadescreenuphalf = 0xc26c;
+ static const uint16 addr_fadescreendownhalf = 0xc268;
+ static const uint16 addr_fadescreenups = 0xc264;
+ static const uint16 addr_fadefromwhite = 0xc260;
+ static const uint16 addr_fadetowhite = 0xc25c;
+ static const uint16 addr_fadescreenup = 0xc258;
+ static const uint16 addr_clearpalette = 0xc254;
+ static const uint16 addr_clearendpal = 0xc250;
+ static const uint16 addr_dofade = 0xc24c;
+ static const uint16 addr_fadedos = 0xc248;
+ static const uint16 addr_transfermap = 0xc244;
+ static const uint16 addr_doshake = 0xc20c;
+ static const uint16 addr_vsync = 0xc208;
+ static const uint16 addr_createpanel2 = 0xc200;
+ static const uint16 addr_createpanel = 0xc1fc;
+ static const uint16 addr_setmode = 0xc1dc;
+ static const uint16 addr_loadpalfromiff = 0xc1d8;
+ static const uint16 addr_showpcx = 0xc1cc;
+ static const uint16 addr_deleverything = 0xc1c0;
+ static const uint16 addr_reconstruct = 0xc1ac;
+ static const uint16 addr_soundonreels = 0xc1a8;
+ static const uint16 addr_reelsonscreen = 0xc1a0;
+ static const uint16 addr_constant = 0xc184;
+ static const uint16 addr_steady = 0xc180;
+ static const uint16 addr_random = 0xc17c;
+ static const uint16 addr_liftnoise = 0xc178;
+ static const uint16 addr_backobject = 0xc170;
+ static const uint16 addr_splitintolines = 0xc164;
+ static const uint16 addr_initrain = 0xc160;
+ static const uint16 addr_reminders = 0xc15c;
+ static const uint16 addr_adjustright = 0xc158;
+ static const uint16 addr_adjustleft = 0xc154;
+ static const uint16 addr_adjustup = 0xc150;
+ static const uint16 addr_adjustdown = 0xc14c;
+ static const uint16 addr_checkforexit = 0xc148;
+ static const uint16 addr_mainman = 0xc138;
+ static const uint16 addr_checkspeed = 0xc110;
+ static const uint16 addr_train = 0xc104;
+ static const uint16 addr_sparky = 0xc100;
+ static const uint16 addr_copper = 0xc0fc;
+ static const uint16 addr_advisor = 0xc0f8;
+ static const uint16 addr_drunk = 0xc0f4;
+ static const uint16 addr_textformonk = 0xc0f0;
+ static const uint16 addr_textforend = 0xc0ec;
+ static const uint16 addr_priesttext = 0xc0e8;
+ static const uint16 addr_madman = 0xc0dc;
+ static const uint16 addr_madmanstelly = 0xc0d8;
+ static const uint16 addr_priest = 0xc0d4;
+ static const uint16 addr_rollendcredits = 0xc0d0;
+ static const uint16 addr_endgameseq = 0xc0cc;
+ static const uint16 addr_monkandryan = 0xc0c8;
+ static const uint16 addr_intro3text = 0xc0c4;
+ static const uint16 addr_intro2text = 0xc0c0;
+ static const uint16 addr_intro1text = 0xc0bc;
+ static const uint16 addr_monks2text = 0xc0b8;
+ static const uint16 addr_handclap = 0xc0b4;
+ static const uint16 addr_intromonks2 = 0xc0b0;
+ static const uint16 addr_intromonks1 = 0xc0ac;
+ static const uint16 addr_intromagic3 = 0xc0a8;
+ static const uint16 addr_intromagic2 = 0xc0a4;
+ static const uint16 addr_gates = 0xc0a0;
+ static const uint16 addr_candles2 = 0xc09c;
+ static const uint16 addr_candles = 0xc098;
+ static const uint16 addr_intromagic1 = 0xc094;
+ static const uint16 addr_smallcandle = 0xc090;
+ static const uint16 addr_candles1 = 0xc08c;
+ static const uint16 addr_keeper = 0xc088;
+ static const uint16 addr_carparkdrip = 0xc084;
+ static const uint16 addr_sparkydrip = 0xc080;
+ static const uint16 addr_gamer = 0xc07c;
+ static const uint16 addr_bossman = 0xc078;
+ static const uint16 addr_heavy = 0xc074;
+ static const uint16 addr_security = 0xc070;
+ static const uint16 addr_poolguard = 0xc06c;
+ static const uint16 addr_businessman = 0xc068;
+ static const uint16 addr_aide = 0xc064;
+ static const uint16 addr_mugger = 0xc060;
+ static const uint16 addr_helicopter = 0xc05c;
+ static const uint16 addr_rockstar = 0xc058;
+ static const uint16 addr_soldier1 = 0xc054;
+ static const uint16 addr_interviewer = 0xc050;
+ static const uint16 addr_barwoman = 0xc04c;
+ static const uint16 addr_othersmoker = 0xc048;
+ static const uint16 addr_bartender = 0xc044;
+ static const uint16 addr_drinker = 0xc040;
+ static const uint16 addr_tattooman = 0xc03c;
+ static const uint16 addr_mansatstill = 0xc038;
+ static const uint16 addr_manasleep2 = 0xc034;
+ static const uint16 addr_louischair = 0xc030;
+ static const uint16 addr_louis = 0xc02c;
+ static const uint16 addr_femalefan = 0xc028;
+ static const uint16 addr_malefan = 0xc024;
+ static const uint16 addr_edeninbath = 0xc020;
+ static const uint16 addr_eden = 0xc01c;
+ static const uint16 addr_manasleep = 0xc018;
+ static const uint16 addr_attendant = 0xc014;
+ static const uint16 addr_smokebloke = 0xc010;
+ static const uint16 addr_receptionist = 0xc00c;
+ static const uint16 addr_foghornsound = 0xc008;
+ static const uint16 addr_intromusic = 0xc004;
+ static const uint16 addr_alleybarksound = 0xc000;
+ static const uint16 offset_quitlist = 0x0a84;
+ static const uint16 offset_savelist = 0x0f44;
+ static const uint16 offset_mainlist = 0x1402;
+ static const uint16 offset_gameerror8 = 0x113f;
+ static const uint16 offset_gameerror5 = 0x1074;
+ static const uint16 offset_error2patch = 0x0ff6;
+ static const uint16 offset_openchangesize = 0x0a1c;
+ static const uint16 offset_keys = 0x0b14;
+ static const uint16 offset_mainlist2 = 0x1440;
+ static const uint16 offset_gameerror2 = 0x0fb2;
+ static const uint16 offset_loadlist = 0x0ef0;
+ static const uint16 offset_gameerror6 = 0x10be;
+ static const uint16 offset_speechfile = 0x13f1;
+ static const uint16 offset_atmospherelist = 0x147e;
+ static const uint16 offset_gameerror4 = 0x1037;
+ static const uint16 offset_gameerror1 = 0x0f6e;
+ static const uint16 offset_examlist = 0x09be;
+ static const uint16 offset_gameinfo = 0x1170;
+ static const uint16 offset_opslist = 0x0ec6;
+ static const uint16 offset_invlist1 = 0x09fc;
+ static const uint16 offset_money2poke = 0x0d97;
+ static const uint16 offset_talklist = 0x0a64;
+ static const uint16 offset_menulist = 0x0e1e;
+ static const uint16 offset_comlist = 0x0ad8;
+ static const uint16 offset_withlist1 = 0x0a3a;
+ static const uint16 offset_money1poke = 0x0d92;
+ static const uint16 offset_gameerror7 = 0x1104;
+ static const uint16 offset_discopslist = 0x0f1a;
+ static const uint16 offset_commandline = 0x16d7;
+ static const uint16 offset_destlist = 0x0a9a;
+ static const uint16 offset_shaketable = 0x06af;
+ static const uint16 offset_error6patch = 0x10fe;
+ static const uint16 offset_keybuffer = 0x1718;
+ static const uint16 offset_speechfilename = 0x13eb;
+ static const uint16 offset_rootdir = 0x0b8c;
+ static const uint16 offset_gameerror3 = 0x1003;
+ static const uint16 offset_rainlocations = 0x0459;
+ static const uint16 offset_diarylist = 0x0e9c;
+ static const uint16 offset_decidelist = 0x13c1;
+ static const uint16 offset_symbollist = 0x0e5e;
+ static const uint16 offset_folderlist = 0x0e34;
+ static const uint16 offset_facelist = 0x0451;
+ static const uint16 offset_operand1 = 0x0b7e;
+ static const uint16 offset_keypadlist = 0x0d9a;
+ static const uint16 kStartvars = 0;
+ static const uint16 kProgresspoints = 1;
+ static const uint16 kWatchon = 2;
+ static const uint16 kShadeson = 3;
+ static const uint16 kSecondcount = 4;
+ static const uint16 kMinutecount = 5;
+ static const uint16 kHourcount = 6;
+ static const uint16 kZoomon = 7;
+ static const uint16 kLocation = 8;
+ static const uint16 kExpos = 9;
+ static const uint16 kExframepos = 10;
+ static const uint16 kExtextpos = 12;
+ static const uint16 kCard1money = 14;
+ static const uint16 kListpos = 16;
+ static const uint16 kRyanpage = 18;
+ static const uint16 kWatchingtime = 19;
+ static const uint16 kReeltowatch = 21;
+ static const uint16 kEndwatchreel = 23;
+ static const uint16 kSpeedcount = 25;
+ static const uint16 kWatchspeed = 26;
+ static const uint16 kReeltohold = 27;
+ static const uint16 kEndofholdreel = 29;
+ static const uint16 kWatchmode = 31;
+ static const uint16 kDestafterhold = 32;
+ static const uint16 kNewsitem = 33;
+ static const uint16 kLiftflag = 34;
+ static const uint16 kLiftpath = 35;
+ static const uint16 kLockstatus = 36;
+ static const uint16 kDoorpath = 37;
+ static const uint16 kCounttoopen = 38;
+ static const uint16 kCounttoclose = 39;
+ static const uint16 kRockstardead = 40;
+ static const uint16 kGeneraldead = 41;
+ static const uint16 kSartaindead = 42;
+ static const uint16 kAidedead = 43;
+ static const uint16 kBeenmugged = 44;
+ static const uint16 kGunpassflag = 45;
+ static const uint16 kCanmovealtar = 46;
+ static const uint16 kTalkedtoattendant = 47;
+ static const uint16 kTalkedtosparky = 48;
+ static const uint16 kTalkedtoboss = 49;
+ static const uint16 kTalkedtorecep = 50;
+ static const uint16 kCardpassflag = 51;
+ static const uint16 kMadmanflag = 52;
+ static const uint16 kKeeperflag = 53;
+ static const uint16 kLasttrigger = 54;
+ static const uint16 kMandead = 55;
+ static const uint16 kSeed = 56;
+ static const uint16 kNeedtotravel = 59;
+ static const uint16 kThroughdoor = 60;
+ static const uint16 kNewobs = 61;
+ static const uint16 kRyanon = 62;
+ static const uint16 kCombatcount = 63;
+ static const uint16 kLastweapon = 64;
+ static const uint16 kDreamnumber = 65;
+ static const uint16 kRoomafterdream = 66;
+ static const uint16 kShakecounter = 67;
+ static const uint16 kSpeechcount = 68;
+ static const uint16 kCharshift = 69;
+ static const uint16 kKerning = 71;
+ static const uint16 kBrightness = 72;
+ static const uint16 kRoomloaded = 73;
+ static const uint16 kDidzoom = 74;
+ static const uint16 kLinespacing = 75;
+ static const uint16 kTextaddressx = 77;
+ static const uint16 kTextaddressy = 79;
+ static const uint16 kTextlen = 81;
+ static const uint16 kLastxpos = 82;
+ static const uint16 kIcontop = 84;
+ static const uint16 kIconleft = 86;
+ static const uint16 kItemframe = 88;
+ static const uint16 kItemtotran = 89;
+ static const uint16 kRoomad = 90;
+ static const uint16 kOldsubject = 92;
+ static const uint16 kWithobject = 94;
+ static const uint16 kWithtype = 95;
+ static const uint16 kLookcounter = 96;
+ static const uint16 kCommand = 98;
+ static const uint16 kCommandtype = 99;
+ static const uint16 kOldcommandtype = 100;
+ static const uint16 kObjecttype = 101;
+ static const uint16 kGetback = 102;
+ static const uint16 kInvopen = 103;
+ static const uint16 kMainmode = 104;
+ static const uint16 kPickup = 105;
+ static const uint16 kLastinvpos = 106;
+ static const uint16 kExamagain = 107;
+ static const uint16 kNewtextline = 108;
+ static const uint16 kOpenedob = 109;
+ static const uint16 kOpenedtype = 110;
+ static const uint16 kOldmapadx = 111;
+ static const uint16 kOldmapady = 113;
+ static const uint16 kMapadx = 115;
+ static const uint16 kMapady = 117;
+ static const uint16 kMapoffsetx = 119;
+ static const uint16 kMapoffsety = 121;
+ static const uint16 kMapxstart = 123;
+ static const uint16 kMapystart = 125;
+ static const uint16 kMapxsize = 127;
+ static const uint16 kMapysize = 128;
+ static const uint16 kHavedoneobs = 129;
+ static const uint16 kManisoffscreen = 130;
+ static const uint16 kRainspace = 131;
+ static const uint16 kFacing = 132;
+ static const uint16 kLeavedirection = 133;
+ static const uint16 kTurntoface = 134;
+ static const uint16 kTurndirection = 135;
+ static const uint16 kMaintimer = 136;
+ static const uint16 kIntrocount = 138;
+ static const uint16 kArrowad = 139;
+ static const uint16 kCurrentkey = 141;
+ static const uint16 kOldkey = 142;
+ static const uint16 kUseddirection = 143;
+ static const uint16 kCurrentkey2 = 144;
+ static const uint16 kTimercount = 145;
+ static const uint16 kOldtimercount = 146;
+ static const uint16 kMapx = 147;
+ static const uint16 kMapy = 148;
+ static const uint16 kNewscreen = 149;
+ static const uint16 kRyanx = 150;
+ static const uint16 kRyany = 151;
+ static const uint16 kLastflag = 152;
+ static const uint16 kLastflagex = 153;
+ static const uint16 kFlagx = 154;
+ static const uint16 kFlagy = 155;
+ static const uint16 kCurrentex = 156;
+ static const uint16 kCurrentfree = 157;
+ static const uint16 kCurrentframe = 158;
+ static const uint16 kFramesad = 160;
+ static const uint16 kDataad = 162;
+ static const uint16 kFrsegment = 164;
+ static const uint16 kObjectx = 166;
+ static const uint16 kObjecty = 168;
+ static const uint16 kOffsetx = 170;
+ static const uint16 kOffsety = 172;
+ static const uint16 kSavesize = 174;
+ static const uint16 kSavesource = 176;
+ static const uint16 kSavex = 178;
+ static const uint16 kSavey = 179;
+ static const uint16 kCurrentob = 180;
+ static const uint16 kPrioritydep = 181;
+ static const uint16 kDestpos = 182;
+ static const uint16 kReallocation = 183;
+ static const uint16 kRoomnum = 184;
+ static const uint16 kNowinnewroom = 185;
+ static const uint16 kResetmanxy = 186;
+ static const uint16 kNewlocation = 187;
+ static const uint16 kAutolocation = 188;
+ static const uint16 kMustload = 189;
+ static const uint16 kAnswered = 190;
+ static const uint16 kSaidno = 191;
+ static const uint16 kDoorcheck1 = 192;
+ static const uint16 kDoorcheck2 = 193;
+ static const uint16 kDoorcheck3 = 194;
+ static const uint16 kDoorcheck4 = 195;
+ static const uint16 kMousex = 196;
+ static const uint16 kMousey = 198;
+ static const uint16 kMousebutton = 200;
+ static const uint16 kMousebutton1 = 202;
+ static const uint16 kMousebutton2 = 204;
+ static const uint16 kMousebutton3 = 206;
+ static const uint16 kMousebutton4 = 208;
+ static const uint16 kOldbutton = 210;
+ static const uint16 kOldx = 212;
+ static const uint16 kOldy = 214;
+ static const uint16 kLastbutton = 216;
+ static const uint16 kOldpointerx = 218;
+ static const uint16 kOldpointery = 220;
+ static const uint16 kDelherex = 222;
+ static const uint16 kDelherey = 224;
+ static const uint16 kPointerxs = 226;
+ static const uint16 kPointerys = 227;
+ static const uint16 kDelxs = 228;
+ static const uint16 kDelys = 229;
+ static const uint16 kPointerframe = 230;
+ static const uint16 kPointerpower = 231;
+ static const uint16 kAuxpointerframe = 232;
+ static const uint16 kPointermode = 233;
+ static const uint16 kPointerspeed = 234;
+ static const uint16 kPointercount = 235;
+ static const uint16 kInmaparea = 236;
+ static const uint16 kReelpointer = 237;
+ static const uint16 kSlotdata = 239;
+ static const uint16 kThisslot = 240;
+ static const uint16 kSlotflags = 241;
+ static const uint16 kTakeoff = 242;
+ static const uint16 kTalkmode = 244;
+ static const uint16 kTalkpos = 245;
+ static const uint16 kCharacter = 246;
+ static const uint16 kPersondata = 247;
+ static const uint16 kTalknum = 249;
+ static const uint16 kNumberinroom = 250;
+ static const uint16 kCurrentcel = 251;
+ static const uint16 kOldselection = 252;
+ static const uint16 kStopwalking = 253;
+ static const uint16 kMouseon = 254;
+ static const uint16 kPlayed = 255;
+ static const uint16 kTimer1 = 257;
+ static const uint16 kTimer2 = 258;
+ static const uint16 kTimer3 = 259;
+ static const uint16 kWholetimer = 260;
+ static const uint16 kTimer1to = 262;
+ static const uint16 kTimer2to = 263;
+ static const uint16 kTimer3to = 264;
+ static const uint16 kWatchdump = 265;
+ static const uint16 kCurrentset = 266;
+ static const uint16 kLogonum = 268;
+ static const uint16 kOldlogonum = 269;
+ static const uint16 kNewlogonum = 270;
+ static const uint16 kNetseg = 271;
+ static const uint16 kNetpoint = 273;
+ static const uint16 kKeynum = 275;
+ static const uint16 kCursorstate = 276;
+ static const uint16 kPressed = 277;
+ static const uint16 kPresspointer = 278;
+ static const uint16 kGraphicpress = 280;
+ static const uint16 kPresscount = 281;
+ static const uint16 kKeypadax = 282;
+ static const uint16 kKeypadcx = 284;
+ static const uint16 kLightcount = 286;
+ static const uint16 kFolderpage = 287;
+ static const uint16 kDiarypage = 288;
+ static const uint16 kMenucount = 289;
+ static const uint16 kSymboltopx = 290;
+ static const uint16 kSymboltopnum = 291;
+ static const uint16 kSymboltopdir = 292;
+ static const uint16 kSymbolbotx = 293;
+ static const uint16 kSymbolbotnum = 294;
+ static const uint16 kSymbolbotdir = 295;
+ static const uint16 kSymboltolight = 296;
+ static const uint16 kSymbol1 = 297;
+ static const uint16 kSymbol2 = 298;
+ static const uint16 kSymbol3 = 299;
+ static const uint16 kSymbolnum = 300;
+ static const uint16 kDumpx = 301;
+ static const uint16 kDumpy = 303;
+ static const uint16 kWalkandexam = 305;
+ static const uint16 kWalkexamtype = 306;
+ static const uint16 kWalkexamnum = 307;
+ static const uint16 kCursloc = 308;
+ static const uint16 kCurslocx = 310;
+ static const uint16 kCurslocy = 312;
+ static const uint16 kCurpos = 314;
+ static const uint16 kMonadx = 316;
+ static const uint16 kMonady = 318;
+ static const uint16 kGotfrom = 320;
+ static const uint16 kMonsource = 322;
+ static const uint16 kNumtodo = 324;
+ static const uint16 kTimecount = 326;
+ static const uint16 kCounttotimed = 328;
+ static const uint16 kTimedseg = 330;
+ static const uint16 kTimedoffset = 332;
+ static const uint16 kTimedy = 334;
+ static const uint16 kTimedx = 335;
+ static const uint16 kNeedtodumptimed = 336;
+ static const uint16 kHandle = 337;
+ static const uint16 kLoadingorsave = 339;
+ static const uint16 kCurrentslot = 340;
+ static const uint16 kCursorpos = 341;
+ static const uint16 kColourpos = 342;
+ static const uint16 kFadedirection = 343;
+ static const uint16 kNumtofade = 344;
+ static const uint16 kFadecount = 345;
+ static const uint16 kAddtogreen = 346;
+ static const uint16 kAddtored = 347;
+ static const uint16 kAddtoblue = 348;
+ static const uint16 kLastsoundreel = 349;
+ static const uint16 kSoundbuffer = 351;
+ static const uint16 kSoundbufferad = 353;
+ static const uint16 kSoundbufferpage = 355;
+ static const uint16 kSoundtimes = 356;
+ static const uint16 kNeedsoundbuff = 357;
+ static const uint16 kOldint9seg = 358;
+ static const uint16 kOldint9add = 360;
+ static const uint16 kOldint8seg = 362;
+ static const uint16 kOldint8add = 364;
+ static const uint16 kOldsoundintseg = 366;
+ static const uint16 kOldsoundintadd = 368;
+ static const uint16 kSoundbaseadd = 370;
+ static const uint16 kDsp_status = 372;
+ static const uint16 kDsp_write = 374;
+ static const uint16 kDmaaddress = 376;
+ static const uint16 kSoundint = 377;
+ static const uint16 kSounddmachannel = 378;
+ static const uint16 kSampleplaying = 379;
+ static const uint16 kTestresult = 380;
+ static const uint16 kCurrentirq = 381;
+ static const uint16 kSpeechloaded = 382;
+ static const uint16 kSpeechlength = 383;
+ static const uint16 kVolume = 385;
+ static const uint16 kVolumeto = 386;
+ static const uint16 kVolumedirection = 387;
+ static const uint16 kVolumecount = 388;
+ static const uint16 kPlayblock = 389;
+ static const uint16 kWongame = 390;
+ static const uint16 kLasthardkey = 391;
+ static const uint16 kBufferin = 392;
+ static const uint16 kBufferout = 394;
+ static const uint16 kExtras = 396;
+ static const uint16 kWorkspace = 398;
+ static const uint16 kMapstore = 400;
+ static const uint16 kCharset1 = 402;
+ static const uint16 kTempcharset = 404;
+ static const uint16 kIcons1 = 406;
+ static const uint16 kIcons2 = 408;
+ static const uint16 kBuffers = 410;
+ static const uint16 kMainsprites = 412;
+ static const uint16 kBackdrop = 414;
+ static const uint16 kMapdata = 416;
+ static const uint16 kSounddata = 418;
+ static const uint16 kSounddata2 = 420;
+ static const uint16 kRecordspace = 422;
+ static const uint16 kFreedat = 424;
+ static const uint16 kSetdat = 426;
+ static const uint16 kReel1 = 428;
+ static const uint16 kReel2 = 430;
+ static const uint16 kReel3 = 432;
+ static const uint16 kRoomdesc = 434;
+ static const uint16 kFreedesc = 436;
+ static const uint16 kSetdesc = 438;
+ static const uint16 kBlockdesc = 440;
+ static const uint16 kSetframes = 442;
+ static const uint16 kFreeframes = 444;
+ static const uint16 kPeople = 446;
+ static const uint16 kReels = 448;
+ static const uint16 kCommandtext = 450;
+ static const uint16 kPuzzletext = 452;
+ static const uint16 kTraveltext = 454;
+ static const uint16 kTempgraphics = 456;
+ static const uint16 kTempgraphics2 = 458;
+ static const uint16 kTempgraphics3 = 460;
+ static const uint16 kTempsprites = 462;
+ static const uint16 kTextfile1 = 464;
+ static const uint16 kTextfile2 = 466;
+ static const uint16 kTextfile3 = 468;
+ static const uint16 kBlinkframe = 470;
+ static const uint16 kBlinkcount = 471;
+ static const uint16 kReasseschanges = 472;
+ static const uint16 kPointerspath = 473;
+ static const uint16 kManspath = 474;
+ static const uint16 kPointerfirstpath = 475;
+ static const uint16 kFinaldest = 476;
+ static const uint16 kDestination = 477;
+ static const uint16 kLinestartx = 478;
+ static const uint16 kLinestarty = 480;
+ static const uint16 kLineendx = 482;
+ static const uint16 kLineendy = 484;
+ static const uint16 kIncrement1 = 486;
+ static const uint16 kIncrement2 = 488;
+ static const uint16 kLineroutine = 490;
+ static const uint16 kLinepointer = 491;
+ static const uint16 kLinedirection = 492;
+ static const uint16 kLinelength = 493;
+ static const uint16 kLiftsoundcount = 494;
+ static const uint16 kEmmhandle = 495;
+ static const uint16 kEmmpageframe = 497;
+ static const uint16 kEmmhardwarepage = 499;
+ static const uint16 kCh0emmpage = 500;
+ static const uint16 kCh0offset = 502;
+ static const uint16 kCh0blockstocopy = 504;
+ static const uint16 kCh0playing = 506;
+ static const uint16 kCh0repeat = 507;
+ static const uint16 kCh0oldemmpage = 508;
+ static const uint16 kCh0oldoffset = 510;
+ static const uint16 kCh0oldblockstocopy = 512;
+ static const uint16 kCh1playing = 514;
+ static const uint16 kCh1emmpage = 515;
+ static const uint16 kCh1offset = 517;
+ static const uint16 kCh1blockstocopy = 519;
+ static const uint16 kCh1blocksplayed = 521;
+ static const uint16 kSoundbufferwrite = 523;
+ static const uint16 kSoundemmpage = 525;
+ static const uint16 kSpeechemmpage = 527;
+ static const uint16 kCurrentsample = 529;
+ static const uint16 kRoomssample = 530;
+ static const uint16 kGameerror = 531;
+ static const uint16 kHowmuchalloc = 532;
+ static const uint16 kReelroutines = 534;
+ static const uint16 kReelcalls = 991;
+ static const uint16 kRoombyroom = 1214;
+ static const uint16 kR0 = 1326;
+ static const uint16 kR1 = 1327;
+ static const uint16 kR2 = 1331;
+ static const uint16 kR6 = 1350;
+ static const uint16 kR8 = 1357;
+ static const uint16 kR9 = 1373;
+ static const uint16 kR10 = 1380;
+ static const uint16 kR11 = 1384;
+ static const uint16 kR12 = 1388;
+ static const uint16 kR13 = 1392;
+ static const uint16 kR14 = 1405;
+ static const uint16 kR20 = 1439;
+ static const uint16 kR22 = 1461;
+ static const uint16 kR23 = 1492;
+ static const uint16 kR25 = 1505;
+ static const uint16 kR26 = 1527;
+ static const uint16 kR27 = 1549;
+ static const uint16 kR28 = 1574;
+ static const uint16 kR29 = 1593;
+ static const uint16 kR45 = 1609;
+ static const uint16 kR46 = 1616;
+ static const uint16 kR47 = 1653;
+ static const uint16 kR52 = 1666;
+ static const uint16 kR53 = 1670;
+ static const uint16 kR55 = 1677;
+ static const uint16 kSpritename1 = 1819;
+ static const uint16 kSpritename3 = 1832;
+ static const uint16 kIdname = 1845;
+ static const uint16 kCharacterset1 = 1857;
+ static const uint16 kCharacterset2 = 1870;
+ static const uint16 kCharacterset3 = 1883;
+ static const uint16 kSamplename = 1896;
+ static const uint16 kBasicsample = 1909;
+ static const uint16 kIcongraphics0 = 1922;
+ static const uint16 kIcongraphics1 = 1935;
+ static const uint16 kExtragraphics1 = 1948;
+ static const uint16 kIcongraphics8 = 1961;
+ static const uint16 kMongraphicname = 1974;
+ static const uint16 kMongraphics2 = 1987;
+ static const uint16 kCityname = 2000;
+ static const uint16 kTravelgraphic1 = 2013;
+ static const uint16 kTravelgraphic2 = 2026;
+ static const uint16 kDiarygraphic = 2039;
+ static const uint16 kMonitorfile1 = 2052;
+ static const uint16 kMonitorfile2 = 2065;
+ static const uint16 kMonitorfile10 = 2078;
+ static const uint16 kMonitorfile11 = 2091;
+ static const uint16 kMonitorfile12 = 2104;
+ static const uint16 kMonitorfile13 = 2117;
+ static const uint16 kMonitorfile20 = 2130;
+ static const uint16 kMonitorfile21 = 2143;
+ static const uint16 kMonitorfile22 = 2156;
+ static const uint16 kMonitorfile23 = 2169;
+ static const uint16 kMonitorfile24 = 2182;
+ static const uint16 kFoldertext = 2195;
+ static const uint16 kDiarytext = 2208;
+ static const uint16 kPuzzletextname = 2221;
+ static const uint16 kTraveltextname = 2234;
+ static const uint16 kIntrotextname = 2247;
+ static const uint16 kEndtextname = 2260;
+ static const uint16 kCommandtextname = 2273;
+ static const uint16 kVolumetabname = 2286;
+ static const uint16 kFoldergraphic1 = 2299;
+ static const uint16 kFoldergraphic2 = 2312;
+ static const uint16 kFoldergraphic3 = 2325;
+ static const uint16 kSymbolgraphic = 2338;
+ static const uint16 kGungraphic = 2351;
+ static const uint16 kMonkface = 2364;
+ static const uint16 kTitle0graphics = 2377;
+ static const uint16 kTitle1graphics = 2390;
+ static const uint16 kTitle2graphics = 2403;
+ static const uint16 kTitle3graphics = 2416;
+ static const uint16 kTitle4graphics = 2429;
+ static const uint16 kTitle5graphics = 2442;
+ static const uint16 kTitle6graphics = 2455;
+ static const uint16 kTitle7graphics = 2468;
+ static const uint16 kPalettescreen = 2481;
+ static const uint16 kCurrentfile = 2970;
+ static const uint16 kDmaaddresses = 5118;
+ static const uint16 kFileheader = 6091;
+ static const uint16 kFiledata = 6141;
+ static const uint16 kExtradata = 6181;
+ static const uint16 kRoomdata = 6187;
+ static const uint16 kMadeuproomdat = 7979;
+ static const uint16 kRoomscango = 8011;
+ static const uint16 kRoompics = 8027;
+ static const uint16 kOplist = 8042;
+ static const uint16 kInputline = 8045;
+ static const uint16 kLinedata = 8173;
+ static const uint16 kPresslist = 8573;
+ static const uint16 kSavenames = 8579;
+ static const uint16 kSavefiles = 8698;
+ static const uint16 kRecname = 8789;
+ static const uint16 kQuitrequested = 8802;
+ static const uint16 kSubtitles = 8803;
+ static const uint16 kForeignrelease = 8804;
+ static const uint16 kStak = 8805;
+ static const uint16 kBlocktextdat = (0);
+ static const uint16 kPersonframes = (0);
+ static const uint16 kDebuglevel1 = (0);
+ static const uint16 kDebuglevel2 = (0);
+ static const uint16 kPlayback = (0);
+ static const uint16 kMap = (0);
+ static const uint16 kSettextdat = (0);
+ static const uint16 kSpanish = (0);
+ static const uint16 kFramedata = (0);
+ static const uint16 kRecording = (0);
+ static const uint16 kFlags = (0);
+ static const uint16 kGerman = (0);
+ static const uint16 kTextunder = (0);
+ static const uint16 kPathdata = (0);
+ static const uint16 kDemo = (0);
+ static const uint16 kExframedata = (0);
+ static const uint16 kIntextdat = (0);
+ static const uint16 kFreetextdat = (0);
+ static const uint16 kFrframedata = (0);
+ static const uint16 kSettext = (0+(130*2));
+ static const uint16 kOpeninvlist = (0+(228*13));
+ static const uint16 kRyaninvlist = (0+(228*13)+32);
+ static const uint16 kPointerback = (0+(228*13)+32+60);
+ static const uint16 kMapflags = (0+(228*13)+32+60+(32*32));
+ static const uint16 kStartpal = (0+(228*13)+32+60+(32*32)+(11*10*3));
+ static const uint16 kEndpal = (0+(228*13)+32+60+(32*32)+(11*10*3)+768);
+ static const uint16 kMaingamepal = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768);
+ static const uint16 kSpritetable = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768);
+ static const uint16 kSetlist = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32));
+ static const uint16 kFreelist = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5));
+ static const uint16 kExlist = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5));
+ static const uint16 kPeoplelist = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5));
+ static const uint16 kZoomspace = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
+ static const uint16 kPrintedlist = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40));
+ static const uint16 kListofchanges = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
+ static const uint16 kUndertimedtext = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4));
+ static const uint16 kRainlist = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30));
+ static const uint16 kInitialreelrouts = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64));
+ static const uint16 kInitialvars = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+991-534);
+ static const uint16 kLengthofbuffer = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+991-534+68-0);
+ static const uint16 kReellist = (0+(36*144));
+ static const uint16 kIntext = (0+(38*2));
+ static const uint16 kLengthofmap = (0+(66*60));
+ static const uint16 kFreetext = (0+(82*2));
+ static const uint16 kBlocktext = (0+(98*2));
+ static const uint16 kBlocks = (0+192);
+ static const uint16 kFrframes = (0+2080);
+ static const uint16 kExframes = (0+2080);
+ static const uint16 kFrames = (0+2080);
+ static const uint16 kExdata = (0+2080+30000);
+ static const uint16 kExtextdat = (0+2080+30000+(16*114));
+ static const uint16 kExtext = (0+2080+30000+(16*114)+((114+2)*2));
+ static const uint16 kLengthofextra = (0+2080+30000+(16*114)+((114+2)*2)+18000);
+ static const uint16 kPersontxtdat = (0+24);
+ static const uint16 kPersontext = (0+24+(1026*2));
+ static const uint16 kInputport = (0x63);
+ static const uint16 kForeign = (1);
+ static const uint16 kCd = (1);
+ static const uint16 kNumexobjects = (114);
+ static const uint16 kUndertextsizey = (13);
+ static const uint16 kZoomy = (132);
+ static const uint16 kFreedatlen = (16*80);
+ static const uint16 kExtextlen = (18000);
+ static const uint16 kLenofmapstore = (22*8*20*8);
+ static const uint16 kUndertextsizex = (228);
+ static const uint16 kNumchanges = (250);
+ static const uint16 kUndertimedysize = (30);
+ static const uint16 kExframeslen = (30000);
+ static const uint16 kTablesize = (32);
+ static const uint16 kScreenwidth = (320);
+ static const uint16 kKeypadx = (36+112);
+ static const uint16 kItempicsize = (44);
+ static const uint16 kDiaryy = (48+12);
+ static const uint16 kOpsy = (52);
+ static const uint16 kSymboly = (56);
+ static const uint16 kInventy = (58);
+ static const uint16 kMenuy = (60);
+ static const uint16 kOpsx = (60);
+ static const uint16 kMaplength = (60);
+ static const uint16 kHeaderlen = (6187-6091);
+ static const uint16 kSymbolx = (64);
+ static const uint16 kSetdatlen = (64*128);
+ static const uint16 kMapwidth = (66);
+ static const uint16 kTextstart = (66*2);
+ static const uint16 kMaplen = (66*60);
+ static const uint16 kDiaryx = (68+24);
+ static const uint16 kLengthofvars = (68-0);
+ static const uint16 kKeypady = (72);
+ static const uint16 kZoomx = (8);
+ static const uint16 kInventx = (80);
+ static const uint16 kMenux = (80+40);
+ static const uint16 kLenofreelrouts = (991-534);
void bothchannels();
void usewire();
void getnamepos();
- void drawitall();
+ void loadtemptext();
void clearstartpal();
void femalefan();
- void greyscalesum();
- void showgamereel();
+ //void showgamereel();
void identifyob();
void trysoundalloc();
void uselighter();
void showmenu();
void usepoolreader();
- void showgroup();
void startdmablock();
void useopenbox();
void clearbuffers();
+ //void getyad();
void neterror();
void storeit();
- void lockeddoorway();
- void isitworn();
- void putundertimed();
- void dumpmap();
- void multidump();
+ //void lockeddoorway();
+ //void isitworn();
+ //void putundertimed();
+ //void dumpmap();
+ //void multidump();
void channel0only();
void worktoscreenm();
+ //void obicons();
void removeemm();
- void mansatstill();
+ //void frameoutbh();
void getobtextstart();
void loadfolder();
void decide();
- void dumppointer();
+ //void dumppointer();
void reelsonscreen();
void getridofreels();
void readkey();
void louis();
void entrytexts();
- void getreelstart();
+ //void getreelstart();
void buttonenter();
void checkinput();
- void crosshair();
- void bresenhams();
+ //void crosshair();
+ void setmode();
void getbackfromops();
- void frameoutv();
- void restoreall();
+ //void frameoutv();
+ void showbyte();
void screenupdate();
- void addlength();
- void usetimedtext();
+ //void addlength();
+ //void usetimedtext();
void putundercentre();
void checkobjectsize();
- void commandonly();
- void adjustlen();
+ //void commandonly();
+ void titles();
void deallocatemem();
void mainscreen();
void watchreel();
void showfolder();
- void turnanypathoff();
+ //void turnanypathoff();
void openfilefromc();
void gettime();
- void clearwork();
+ //void clearwork();
void loadtraveltext();
- void worktoscreen();
- void getexpos();
+ //void worktoscreen();
+ //void getexpos();
void fadedos();
- void multiget();
+ //void fillspace();
+ void selectlocation();
+ //void multiget();
+ //void autosetwalk();
void fadeupmonfirst();
void drawfloor();
void loadkeypad();
- void findsource();
+ //void findsource();
void clearendpal();
void findtext1();
void isryanholding();
- void interupttest();
+ void showslots();
void usecashcard();
void usewall();
void opentomb();
+ //void makename();
void buttonfour();
- void animpointer();
- void lockmon();
- void dochange();
+ void restoreall();
+ //void lockmon();
+ //void dochange();
void getanyaddir();
+ //void dumpblink();
void showsaveops();
void intromonks1();
void resetlocation();
@@ -669,26 +1331,26 @@ public:
void showdiscops();
void advisor();
void additionaltext();
- void kernchars();
+ //void compare();
void othersmoker();
- void autosetwalk();
- void setuptimedtemp();
- void blocknametext();
+ void dofade();
+ //void setuptimedtemp();
+ //void blocknametext();
void useelevator5();
void useelevator4();
void useelevator1();
- void attendant();
+ //void findormake();
void useelevator3();
void useelevator2();
void buttonone();
void keyboardread();
- void deltextline();
+ //void deltextline();
void entercode();
void getopenedsize();
void getpersframe();
void doshake();
void resetkeyboard();
- void showpanel();
+ //void showpanel();
void soundstartup();
void slabdoora();
void fadeupyellows();
@@ -697,50 +1359,51 @@ public:
void slabdoore();
void slabdoord();
void adjustup();
- void readsetdata();
+ void slabdoorf();
void loadintotemp();
void loadintroroom();
void saveseg();
- void showblink();
+ //void showblink();
void mousecall();
void train();
void watchcount();
void fadedownmon();
void loadcart();
- void splitintolines();
+ //void calcfrframe();
void bartender();
void eden();
void showdiary();
void purgealocation();
- void updatepeople();
- void slabdoorf();
- void addtopeoplelist();
+ //void updatepeople();
+ //void addtopeoplelist();
void hangoncurs();
- void sparkydrip();
- void compare();
+ //void getblockofpixel();
+ //void kernchars();
void printcurs();
- void convertkey();
+ //void convertkey();
void outofopen();
- void dealwithspecial();
+ //void dealwithspecial();
+ //void eraseoldobs();
void dircom();
- void liftsprite();
+ //void liftsprite();
void dumpkeypad();
- void dumpzoom();
+ void showsymbol();
void endgameseq();
- void cancelch0();
+ //void cancelch0();
void setbotleft();
void findfirstpath();
- void showallfree();
+ //void cancelch1();
void loadold();
void loadtempcharset();
void useslab();
- void aboutturn();
+ void dumpzoom();
+ //void aboutturn();
void usealtar();
void createpanel2();
void turnonpower();
void manasleep2();
void moretalk();
- void printslow();
+ //void printslow();
void loadroom();
void starttalk();
void delchar();
@@ -748,7 +1411,7 @@ public:
void endgame();
void monprint();
void usepipe();
- void startloading();
+ //void startloading();
void getunderzoom();
void candles();
void backobject();
@@ -756,38 +1419,36 @@ public:
void reminders();
void selectslot2();
void runtap();
- void domix();
- void priesttext();
- void paneltomap();
- void obname();
+ //void domix();
+ //void paneltomap();
+ //void obname();
void getridoftemp3();
void getridoftemp2();
void usebalcony();
void runendseq();
void dumpdiarykeys();
void disablesoundint();
- void checkifset();
- void showallex();
- void showrain();
+ void priesttext();
+ //void showallex();
void openpoolboss();
void buttontwo();
- void fillopen();
- void delsprite();
- void getroomspaths();
- void dumptextline();
+ //void delsprite();
+ //void getroomspaths();
+ //void dumptextline();
void fadescreendownhalf();
void useplate();
void candles1();
void lookininterface();
void manasleep();
- void isitdescribed();
+ //void isitdescribed();
void hotelbell();
void loadspeech();
- void cls();
- void printsprites();
- void dumptimedtext();
- void showallobs();
- void getnumber();
+ void interupttest();
+ //void cls();
+ //void printsprites();
+ //void checkifperson();
+ //void showallobs();
+ //void getnumber();
void adjustleft();
void calledenslift();
void useclearbox();
@@ -796,15 +1457,16 @@ public:
void getfreead();
void showarrows();
void walkintoroom();
- void getridoftemptext();
+ void usehatch();
void printoutermon();
void setuppit();
void showpcx();
void showdecisions();
void checkspeed();
- void printchar();
+ //void printchar();
void showkeypad();
- void obtoinv();
+ //void obtoinv();
+ //void getroomdata();
void removeobfrominv();
void usecoveredbox();
void openyourneighbour();
@@ -816,61 +1478,60 @@ public:
void usekey();
void locklighton();
void useladderb();
- void spriteupdate();
+ //void spriteupdate();
void usetempcharset();
void discops();
- void printdirect();
- void delthisone();
- void makebackob();
+ //void printdirect();
+ //void delthisone();
+ //void makebackob();
void middlepanel();
void dumpwatch();
void saveload();
void monitorlogo();
void loadposition();
- void wornerror();
+ //void wornerror();
void entersymbol();
void showword();
void dirfile();
- void setmode();
- void walktotext();
+ //void bresenhams();
+ //void walktotext();
void pickupconts();
void locklightoff();
void wearwatch();
void runintroseq();
- void doblocks();
- void showbyte();
- void allpalette();
- void findormake();
+ //void doblocks();
+ void opensarters();
+ //void delpointer();
+ void attendant();
void nextsymbol();
void monks2text();
- void poolguard();
void clearpalette();
void cantdrop();
- void maptopanel();
- void calcmapad();
+ //void maptopanel();
+ //void calcmapad();
void getridofall();
void copper();
void folderhints();
void openhoteldoor();
- void removesetobject();
- void checkifperson();
- void frameoutfx();
+ //void removesetobject();
+ //void dumptimedtext();
+ //void frameoutfx();
void blank();
void drinker();
void nextcolon();
void placefreeobject();
- void delpointer();
- void loopchannel0();
+ void allpalette();
+ //void loopchannel0();
void initrain();
void showleftpage();
void rockstar();
void adjustright();
void putunderzoom();
void vsync();
- void turnpathoff();
+ //void finishedwalking();
void findinvpos();
- void usetext();
- void hangonpq();
+ void dumpmenu();
+ //void examineobtext();
void liftnoise();
void workoutframes();
void getbackfromob();
@@ -885,39 +1546,37 @@ public:
void showouterpad();
void getkeyandlogo();
void selectob();
- void checkcoords();
- void dumpmenu();
+ //void checkcoords();
+ //void usetext();
void chewy();
void accesslighton();
- void dosreturn();
- void titles();
- void quickquit();
- void showpointer();
+ void useplinth();
+ //void adjustlen();
+ //void quickquit();
+ //void showpointer();
void usecooker();
void loadmenu();
void checkforemm();
- void checkifpathison();
- void smallcandle();
+ //void checkifpathison();
+ //void finalframe();
void receptionist();
void selectslot();
- void edenscdplayer();
- void readoneblock();
+ void openfilenocheck();
+ //void readoneblock();
void fadeupmon();
void paltoendpal();
void fadetowhite();
- void textformonk();
void loadsavebox();
- void fadescreenup();
void soundend();
void redes();
void errormessage1();
void clearchanges();
void errormessage3();
- void deletetaken();
+ //void deletetaken();
void putundermenu();
- void checkifex();
+ void intromonks2();
void intromagic2();
- void findobname();
+ void intromagic3();
void edeninbath();
void intromagic1();
void showdiarypage();
@@ -925,33 +1584,33 @@ public:
void getbacktoops();
void rollendcredits();
void intro1text();
- void getmapad();
+ void transfertoex();
void playchannel1();
void playchannel0();
void usemon();
void steady();
- void pixelcheckset();
+ //void pixelcheckset();
void reexfrominv();
- void fillspace();
+ void examinventory();
void talk();
void usedryer();
- void dumpeverything();
- void usehatch();
- void zoom();
+ //void dumpeverything();
+ //void readmouse2();
+ //void zoom();
void outofinv();
void viewfolder();
- void walking();
+ //void walking();
void diarykeyp();
- void readabyte();
- void showframe();
+ //void readabyte();
+ //void showframe();
void random();
- void obicons();
- void frameoutbh();
+ void mainman();
+ void mansatstill();
void channel1only();
- void playguitar();
+ void checkbasemem();
void lastfolder();
void transfermap();
- void showreelframe();
+ //void showreelframe();
void showmonk();
void diarykeyn();
void set16colpalette();
@@ -961,36 +1620,39 @@ public:
void purgeanitem();
void madman();
void createpanel();
- void turnpathon();
- void showmainops();
+ //void turnpathon();
+ void enablesoundint();
void madmanstelly();
void constant();
void loadroomssample();
- void getblockofpixel();
+ void sparkydrip();
void paltostartpal();
void bossman();
void getridofpit();
void convnum();
+ //void checkifset();
void nothelderror();
- void readheader();
+ //void readheader();
void getsetad();
- void getyad();
+ void textformonk();
void reconstruct();
void soldier1();
+ //void animpointer();
void getundercentre();
void checkforexit();
void loadseg();
void makeheader();
void setkeyboardint();
void priest();
- void readmouse();
+ //void readmouse();
void powerlighton();
void savefilewrite();
void printmessage2();
+ //void showallfree();
void loadnews();
void rollem();
- void makeworn();
- void examineobtext();
+ //void makeworn();
+ void hangonpq();
void startup();
void savegame();
void startpaltoend();
@@ -999,14 +1661,14 @@ public:
void describeob();
void deleteexframe();
void folderexit();
- void useplinth();
+ void dosreturn();
void wheelsound();
void actualsave();
void autolook();
- void checkbasemem();
+ void playguitar();
void transfertext();
void searchforsame();
- void enablesoundint();
+ void showmainops();
void getback1();
void setlocation();
void fadefromwhite();
@@ -1017,9 +1679,9 @@ public:
void pitinterupt();
void deleverything();
void fadescreendown();
- void findxyfrompath();
+ //void findxyfrompath();
void namestoold();
- void getxad();
+ //void getxad();
void openinv();
void lookatplace();
void useaxe();
@@ -1031,30 +1693,29 @@ public:
void realcredits();
void handclap();
void smokebloke();
- void showexit();
- void printundermon();
+ void afterintroroom();
+ //void printundermon();
void buttonnine();
void findallopen();
void loadintotemp3();
void loadintotemp2();
void gamer();
- void personnametext();
- void quitsymbol();
+ void poolguard();
void readfromfile();
void initialinv();
- void showslots();
- void dofade();
- void hangon();
+ void quitsymbol();
+ //void modifychar();
+ //void initman();
void settopright();
void findsetobject();
void singlekey();
- void seecommandtail();
- void getundertimed();
+ //void seecommandtail();
+ //void getundertimed();
void hangone();
void carparkdrip();
void usediary();
void deleteexobject();
- void frameoutnm();
+ //void frameoutnm();
void moneypoke();
void destselect();
void restoreems();
@@ -1064,24 +1725,26 @@ public:
void openlouis();
void buttonthree();
void getundermenu();
- void randomnumber();
+ //void randomnumber();
void lookatcard();
void helicopter();
void scrollmonitor();
void setsoundoff();
void setpickup();
+ //void doorway();
void dropobject();
- void printmessage();
+ void isitright();
void reexfromopen();
- void fillryan();
- void loadtemptext();
+ //void fillryan();
+ void drawitall();
void usestereo();
void showcurrentfile();
- void copyname();
+ //void turnpathoff();
+ //void copyname();
void look();
void setmouse();
- void checkone();
- void transferinv();
+ //void checkone();
+ //void transferinv();
void candles2();
void pickupob();
void error();
@@ -1089,84 +1752,83 @@ public:
void clearbeforeload();
void biblequote();
void doload();
- void afterintroroom();
+ void showexit();
void blockget();
void usetrainer();
- void allocatework();
+ //void allocatework();
void addtopresslist();
- void walkandexamine();
+ //void walkandexamine();
void dmaend();
- void quickquit2();
+ //void quickquit2();
void twodigitnum();
- void madmantext();
+ //void madmantext();
void dumpcurrent();
void textforend();
void showdiarykeys();
void dontloadseg();
- void madmode();
+ //void madmode();
void intro3text();
void allocatemem();
void sortoutmap();
- void doorway();
+ //void showrain();
void useopened();
void inventory();
void powerlightoff();
- void getroomdata();
+ void fillopen();
void showoutermenu();
void signon();
void deleteextext();
void foghornsound();
void showrightpage();
- void openhoteldoor2();
+ void showloadops();
void examicon();
void showgun();
void switchryanon();
+ //void personnametext();
void louischair();
void saveems();
void locationpic();
- void getflagunderp();
+ //void getflagunderp();
void dolook();
void opentvdoor();
void triggermessage();
- void finalframe();
- void plotreel();
+ void smallcandle();
+ //void plotreel();
void swapwithopen();
- void makesprite();
+ //void makesprite();
void dreamweb();
void droperror();
- void openfilenocheck();
+ void edenscdplayer();
void calledensdlift();
void checkinside();
void gates();
- void selectlocation();
+ void newgame();
void showwatch();
- void turnanypathon();
+ //void turnanypathon();
void restorereels();
void setwalk();
- void printboth();
- void useroutine();
+ //void useroutine();
void zoomicon();
- void hotelcontrol();
+ //void findlen();
void findpathofpoint();
void issetobonmap();
void getdestinfo();
void drunk();
- void dumpblink();
+ void getridoftemptext();
void setuptimeduse();
void grafittidoor();
void input();
void nextdest();
- void getdimension();
+ //void getdimension();
void makecaps();
void read();
void fadescreenups();
- void checkdest();
- void initman();
+ //void checkdest();
+ //void hangon();
void loadpalfromiff();
- void facerightway();
+ //void facerightway();
void startup1();
- void findlen();
- void showsymbol();
+ void hotelcontrol();
void mugger();
void atmospheres();
void out22c();
@@ -1174,51 +1836,49 @@ public:
void gettingshot();
void settopleft();
void searchforstring();
- void clearsprites();
- void obpicture();
+ //void clearsprites();
+ //void obpicture();
void selectopenob();
- void widedoor();
+ //void widedoor();
void security();
- void printasprite();
+ //void printasprite();
void buttonfive();
void soundonreels();
void usegun();
void autoappear();
- void findnextcolon();
- void readmouse4();
+ //void findnextcolon();
+ //void readmouse4();
void openryan();
- void readmouse1();
+ void callhotellift();
void showman();
- void readmouse2();
+ void usefullcart();
void newplace();
- void movemap();
+ //void movemap();
void loadsample();
void usecardreader1();
void usecardreader2();
void usecardreader3();
void tattooman();
void usehandle();
- void quitkey();
void openfile();
void usecharset1();
- void makenextblock();
+ //void makenextblock();
void showpuztext();
- void addalong();
- void width160();
+ //void addalong();
+ //void width160();
void incryanpage();
- void dodoor();
- void eraseoldobs();
+ //void dodoor();
+ void greyscalesum();
void buttoneight();
- void opensarters();
void findexobject();
void errormessage2();
void usechurchhole();
void searchforfiles();
void monkspeaking();
void fadecalculation();
- void waitframes();
+ //void waitframes();
void clearrest();
- void getreelframeax();
+ //void getreelframeax();
void barwoman();
void roomname();
void credits();
@@ -1227,18 +1887,18 @@ public:
void keeper();
void afternewroom();
void getexad();
- void aide();
void openforsave();
void closefile();
void delcurs();
void randomaccess();
- void calcfrframe();
- void intromagic3();
+ void splitintolines();
+ //void checkifex();
+ //void findobname();
void initialmoncols();
void checkforshake();
void usebuttona();
- void cancelch1();
- void getnextword();
+ void fadescreenup();
+ //void getnextword();
void generalerror();
void actualload();
void allocateload();
@@ -1256,28 +1916,27 @@ public:
void usecontrol();
void buttonseven();
void redrawmainscrn();
- void finishedwalking();
- void findallryan();
- void channel0tran();
+ void showgroup();
+ //void findallryan();
+ //void channel0tran();
void buttonpress();
- void parseblaster();
- void callhotellift();
+ //void parseblaster();
+ //void readmouse1();
void makemainscreen();
- void intromonks2();
void usewinch();
void setbotright();
- void readmouse3();
+ //void readmouse3();
void showfirstuse();
void setupemm();
- void usefullcart();
- void transfertoex();
+ void aide();
+ //void getmapad();
void getlocation();
void geteitherad();
- void placesetobject();
- void drawflags();
+ //void placesetobject();
+ //void drawflags();
void zoomonoff();
void updatesymboltop();
- void showryanpage();
+ //void showryanpage();
void printlogo();
void allpointer();
void showseconduse();
@@ -1292,14 +1951,14 @@ public:
void parser();
void hangonw();
void intro();
- void hangonp();
+ //void hangonp();
void fadescreendowns();
- void showloadops();
+ void openhoteldoor2();
void getridoftempsp();
void scanfornames();
- void setallchanges();
- void newgame();
- void examinventory();
+ //void setallchanges();
+ void readsetdata();
+ //void printboth();
void standardload();
void undertextline();
void findroominloc();
@@ -1312,18 +1971,18 @@ public:
void dosometalk();
void usecart();
void intromusic();
- void makename();
+ void quitkey();
void processtrigger();
void monmessage();
void readdesticon();
void randomnum2();
void loadsecondsample();
void transfercontoex();
- void multiput();
- void isitright();
+ //void multiput();
+ //void printmessage();
void businessman();
void switchryanoff();
- void commandwithob();
+ //void commandwithob();
void panelicons1();
void adjustdown();
void withwhat();
@@ -1333,9 +1992,8 @@ public:
void accesslightoff();
void usehole();
void useobject();
- void mainman();
void volumeadjust();
- void checkiffree();
+ //void checkiffree();
};
}
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index 8be02dc90e..0e43f18db6 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -18,9 +18,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * $URL: https://svn.scummvm.org:4444/svn/dreamweb/dreamweb.cpp $
- * $Id: dreamweb.cpp 79 2011-06-05 08:26:54Z eriktorbjorn $
- *
*/
#include "common/config-manager.h"
@@ -65,6 +62,8 @@ DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gam
_oldMouseState = 0;
_channel0 = 0;
_channel1 = 0;
+
+ _language = gameDesc->desc.language;
}
DreamWebEngine::~DreamWebEngine() {
@@ -111,14 +110,6 @@ void DreamWebEngine::processEvents() {
return;
}
- if (_enableSavingOrLoading && _loadSavefile >= 0 && _loadSavefile <= 6) {
- debug(1, "loading save state %d", _loadSavefile);
- _context.data.byte(_context.kCurrentslot) = _loadSavefile;
- _loadSavefile = -1;
- _context.loadposition();
- _context.data.byte(_context.kGetback) = 1;
- }
-
soundHandler();
Common::Event event;
int softKey, hardKey;
@@ -214,13 +205,12 @@ void DreamWebEngine::processEvents() {
Common::Error DreamWebEngine::run() {
+ syncSoundSettings();
_console = new DreamWebConsole(this);
- _loadSavefile = Common::ConfigManager::instance().getInt("save_slot");
-
- getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70, this);
- //http://martin.hinner.info/vga/timing.html
+ ConfMan.registerDefault("dreamweb_originalsaveload", "true");
+ getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70, this, "dreamwebVSync");
_context.__start();
_context.data.byte(DreamGen::DreamGenContext::kQuitrequested) = 0;
@@ -233,7 +223,7 @@ void DreamWebEngine::setSpeed(uint speed) {
debug(0, "setting speed %u", speed);
_speed = speed;
getTimerManager()->removeTimerProc(vSyncInterrupt);
- getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70 / speed, this);
+ getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70 / speed, this, "dreamwebVSync");
}
void DreamWebEngine::openFile(const Common::String &name) {
@@ -313,7 +303,7 @@ void DreamWebEngine::keyPressed(uint16 ascii) {
keybuf[in] = ascii;
}
-void DreamWebEngine::mouseCall() {
+void DreamWebEngine::mouseCall(uint16 *x, uint16 *y, uint16 *state) {
processEvents();
Common::EventManager *eventMan = _system->getEventManager();
Common::Point pos = eventMan->getMousePos();
@@ -325,13 +315,12 @@ void DreamWebEngine::mouseCall() {
pos.y = 15;
if (pos.y > 184)
pos.y = 184;
- _context.cx = pos.x;
- _context.dx = pos.y;
+ *x = pos.x;
+ *y = pos.y;
- unsigned state = eventMan->getButtonState();
- _context.bx = state == _oldMouseState? 0: state;
- _oldMouseState = state;
- _context.flags._c = false;
+ unsigned newState = eventMan->getButtonState();
+ *state = (newState == _oldMouseState? 0 : newState);
+ _oldMouseState = newState;
}
void DreamWebEngine::fadeDos() {
@@ -419,17 +408,21 @@ void DreamWebEngine::cls() {
void DreamWebEngine::playSound(uint8 channel, uint8 id, uint8 loops) {
debug(1, "playSound(%u, %u, %u)", channel, id, loops);
- const SoundData &data = _soundData[id >= 12? 1: 0];
- Audio::Mixer::SoundType type;
- bool speech = id == 62; //actually 50
+ int bank = 0;
+ bool speech = false;
+ Audio::Mixer::SoundType type = channel == 0?
+ Audio::Mixer::kMusicSoundType: Audio::Mixer::kSFXSoundType;
+
if (id >= 12) {
id -= 12;
- type = Audio::Mixer::kSFXSoundType;
- } else if (speech)
- type = Audio::Mixer::kSpeechSoundType;
- else
- type = Audio::Mixer::kMusicSoundType;
+ bank = 1;
+ if (id == 50) {
+ speech = true;
+ type = Audio::Mixer::kSpeechSoundType;
+ }
+ }
+ const SoundData &data = _soundData[bank];
Audio::SeekableAudioStream *raw;
if (!speech) {
@@ -469,7 +462,20 @@ void DreamWebEngine::playSound(uint8 channel, uint8 id, uint8 loops) {
_mixer->playStream(type, &_channelHandle[channel], stream);
}
+void DreamWebEngine::stopSound(uint8 channel) {
+ debug(1, "stopSound(%u)", channel);
+ assert(channel == 0 || channel == 1);
+ _mixer->stopHandle(_channelHandle[channel]);
+ if (channel == 0)
+ _channel0 = 0;
+ else
+ _channel1 = 0;
+}
+
bool DreamWebEngine::loadSpeech(const Common::String &filename) {
+ if (ConfMan.getBool("speech_mute"))
+ return false;
+
Common::File file;
if (!file.open("speech/" + filename))
return false;
@@ -485,6 +491,7 @@ bool DreamWebEngine::loadSpeech(const Common::String &filename) {
void DreamWebEngine::soundHandler() {
+ _context.data.byte(_context.kSubtitles) = ConfMan.getBool("subtitles");
_context.push(_context.ax);
_context.volumeadjust();
_context.ax = _context.pop();
@@ -566,7 +573,59 @@ void DreamWebEngine::loadSounds(uint bank, const Common::String &filename) {
file.close();
}
+uint8 DreamWebEngine::modifyChar(uint8 c) const {
+ if (c < 128)
+ return c;
+
+ switch(_language) {
+ case Common::DE_DEU:
+ switch(c)
+ {
+ case 129:
+ return 'Z' + 3;
+ case 132:
+ return 'Z' + 1;
+ case 142:
+ return 'Z' + 4;
+ case 154:
+ return 'Z' + 6;
+ case 225:
+ return 'A' - 1;
+ case 153:
+ return 'Z' + 5;
+ case 148:
+ return 'Z' + 2;
+ default:
+ return c;
+ }
+ case Common::ES_ESP:
+ switch(c) {
+ case 160:
+ return 'Z' + 1;
+ case 130:
+ return 'Z' + 2;
+ case 161:
+ return 'Z' + 3;
+ case 162:
+ return 'Z' + 4;
+ case 163:
+ return 'Z' + 5;
+ case 164:
+ return 'Z' + 6;
+ case 165:
+ return ',' - 1;
+ case 168:
+ return 'A' - 1;
+ case 173:
+ return 'A' - 4;
+ case 129:
+ return 'A' - 5;
+ default:
+ return c;
+ }
+ default:
+ return c;
+ }
+}
} // End of namespace DreamWeb
-
-
diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h
index e0797bc96b..97f6007f9d 100644
--- a/engines/dreamweb/dreamweb.h
+++ b/engines/dreamweb/dreamweb.h
@@ -18,9 +18,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * $URL: https://svn.scummvm.org:4444/svn/dreamweb/dreamweb.h $
- * $Id: dreamweb.h 77 2011-05-18 14:26:43Z digitall $
- *
*/
#ifndef DREAMWEB_H
@@ -37,7 +34,9 @@
#include "audio/audiostream.h"
#include "audio/mixer.h"
+#include "engines/advancedDetector.h"
#include "engines/engine.h"
+
#include "dreamweb/dreamgen.h"
#include "dreamweb/console.h"
@@ -49,7 +48,9 @@ enum {
kDebugSaveLoad = (1 << 1)
};
-struct DreamWebGameDescription;
+struct DreamWebGameDescription {
+ ADGameDescription desc;
+};
class DreamWebEngine : public Engine {
private:
@@ -81,7 +82,7 @@ public:
uint32 skipBytes(uint32 bytes);
void closeFile();
- void mouseCall(); //fill mouse pos and button state
+ void mouseCall(uint16 *x, uint16 *y, uint16 *state); //fill mouse pos and button state
void processEvents();
void setPalette();
void fadeDos();
@@ -107,6 +108,11 @@ public:
void enableSavingOrLoading(bool enable = true) { _enableSavingOrLoading = enable; }
+ Common::Language getLanguage() const { return _language; }
+ uint8 modifyChar(uint8 c) const;
+
+ void stopSound(uint8 channel);
+
private:
void keyPressed(uint16 ascii);
void setSpeed(uint speed);
@@ -123,8 +129,8 @@ private:
uint _speed;
bool _turbo;
uint _oldMouseState;
- int _loadSavefile;
bool _enableSavingOrLoading;
+ Common::Language _language;
struct Sample {
uint offset;
diff --git a/engines/dreamweb/module.mk b/engines/dreamweb/module.mk
index 3b0c7f3325..21429dc960 100644
--- a/engines/dreamweb/module.mk
+++ b/engines/dreamweb/module.mk
@@ -1,11 +1,19 @@
MODULE := engines/dreamweb
MODULE_OBJS := \
+ backdrop.o \
console.o \
detection.o \
dreamweb.o \
dreamgen.o \
- stubs.o
+ object.o \
+ pathfind.o \
+ print.o \
+ saveload.o \
+ sprite.o \
+ stubs.o \
+ use.o \
+ vgagrafx.o
# This module can be built as a plugin
ifeq ($(ENABLE_DREAMWEB), DYNAMIC_PLUGIN)
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
new file mode 100644
index 0000000000..e2da902465
--- /dev/null
+++ b/engines/dreamweb/object.cpp
@@ -0,0 +1,114 @@
+/* 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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamGen {
+
+void DreamGenContext::fillryan() {
+ uint8 *inv = segRef(data.word(kBuffers)).ptr(kRyaninvlist, 60);
+ findallryan(inv);
+ inv += data.byte(kRyanpage) * 2 * 10;
+ for (size_t i = 0; i < 2; ++i) {
+ for (size_t j = 0; j < 5; ++j) {
+ uint8 objIndex = *inv++;
+ uint8 objType = *inv++;
+ obtoinv(objIndex, objType, kInventx + j * kItempicsize, kInventy + i * kItempicsize);
+ }
+ }
+ showryanpage();
+}
+
+void DreamGenContext::isitworn() {
+ flags._z = isitworn((const DynObject *)es.ptr(bx, sizeof(DynObject)));
+}
+
+bool DreamGenContext::isitworn(const DynObject *object) {
+ return (object->id[0] == 'W'-'A') && (object->id[1] == 'E'-'A');
+}
+
+void DreamGenContext::wornerror() {
+ data.byte(kCommandtype) = 255;
+ delpointer();
+ printmessage(76, 21, 57, 240, false);
+ worktoscreenm();
+ hangonp(50);
+ showpanel();
+ showman();
+ examicon();
+ data.byte(kCommandtype) = 255;
+ worktoscreenm();
+}
+
+void DreamGenContext::makeworn() {
+ makeworn((DynObject *)es.ptr(bx, sizeof(DynObject)));
+}
+
+void DreamGenContext::makeworn(DynObject *object) {
+ object->id[0] = 'W'-'A';
+ object->id[1] = 'E'-'A';
+}
+
+void DreamGenContext::obtoinv() {
+ obtoinv(al, ah, di, bx);
+}
+
+void DreamGenContext::obtoinv(uint8 index, uint8 flag, uint16 x, uint16 y) {
+ Frame *icons1 = (Frame *)segRef(data.word(kIcons1)).ptr(0, 0);
+ showframe(icons1, x - 2, y - 1, 10, 0);
+ if (index == 0xff)
+ return;
+
+ Frame *extras = (Frame *)segRef(data.word(kExtras)).ptr(0, 0);
+ Frame *frees = (Frame *)segRef(data.word(kFreeframes)).ptr(0, 0);
+ Frame *frames = (flag == 4) ? extras : frees;
+ showframe(frames, x + 18, y + 19, 3 * index + 1, 128);
+ const DynObject *object = (const DynObject *)getanyaddir(index, flag);
+ bool worn = isitworn(object);
+ if (worn)
+ showframe(icons1, x - 3, y - 2, 7, 0);
+}
+
+void DreamGenContext::obpicture() {
+ if (data.byte(kObjecttype) == 1)
+ return;
+ Frame *frames;
+ if (data.byte(kObjecttype) == 4)
+ frames = (Frame *)segRef(data.word(kExtras)).ptr(0, 0);
+ else
+ frames = (Frame *)segRef(data.word(kFreeframes)).ptr(0, 0);
+ uint8 frame = 3 * data.byte(kCommand) + 1;
+ showframe(frames, 160, 68, frame, 0x80);
+}
+
+void DreamGenContext::obicons() {
+ uint8 value1, value2;
+ getanyad(&value1, &value2);
+ if (value1 == 0xff) {
+ showframe((Frame *)segRef(data.word(kIcons2)).ptr(0, 0), 260, 1, 1, 0);
+ } else {
+ showframe((Frame *)segRef(data.word(kIcons2)).ptr(0, 0), 210, 1, 4, 0);
+ }
+}
+
+} /*namespace dreamgen */
+
diff --git a/engines/dreamweb/pathfind.cpp b/engines/dreamweb/pathfind.cpp
new file mode 100644
index 0000000000..d367f02d15
--- /dev/null
+++ b/engines/dreamweb/pathfind.cpp
@@ -0,0 +1,254 @@
+/* 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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamGen {
+
+void DreamGenContext::turnpathon() {
+ turnpathon(al);
+}
+
+void DreamGenContext::turnpathon(uint8 param) {
+ findormake(param, 0xff, data.byte(kRoomnum) + 100);
+ PathNode *roomsPaths = getroomspaths()->nodes;
+ if (param == 0xff)
+ return;
+ roomsPaths[param].on = 0xff;
+}
+
+void DreamGenContext::turnpathoff() {
+ turnpathoff(al);
+}
+
+void DreamGenContext::turnpathoff(uint8 param) {
+ findormake(param, 0x00, data.byte(kRoomnum) + 100);
+ PathNode *roomsPaths = getroomspaths()->nodes;
+ if (param == 0xff)
+ return;
+ roomsPaths[param].on = 0x00;
+}
+
+void DreamGenContext::turnanypathon(uint8 param, uint8 room) {
+ findormake(param, 0xff, room + 100);
+ PathNode *paths = (PathNode *)segRef(data.word(kReels)).ptr(kPathdata + 144 * room, 0);
+ paths[param].on = 0xff;
+}
+
+
+void DreamGenContext::turnanypathon() {
+ turnanypathon(al, ah);
+}
+
+void DreamGenContext::turnanypathoff(uint8 param, uint8 room) {
+ findormake(param, 0x00, room + 100);
+ PathNode *paths = (PathNode *)segRef(data.word(kReels)).ptr(kPathdata + 144 * room, 0);
+ paths[param].on = 0x00;
+}
+
+void DreamGenContext::turnanypathoff() {
+ turnanypathoff(al, ah);
+}
+
+RoomPaths *DreamGenContext::getroomspaths() {
+ void *result = segRef(data.word(kReels)).ptr(data.byte(kRoomnum) * 144, 144);
+ return (RoomPaths *)result;
+}
+
+void DreamGenContext::autosetwalk() {
+ al = data.byte(kManspath);
+ if (data.byte(kFinaldest) == al)
+ return;
+ const RoomPaths *roomsPaths = getroomspaths();
+ checkdest(roomsPaths);
+ data.word(kLinestartx) = roomsPaths->nodes[data.byte(kManspath)].x - 12;
+ data.word(kLinestarty) = roomsPaths->nodes[data.byte(kManspath)].y - 12;
+ data.word(kLineendx) = roomsPaths->nodes[data.byte(kDestination)].x - 12;
+ data.word(kLineendy) = roomsPaths->nodes[data.byte(kDestination)].y - 12;
+ bresenhams();
+ if (data.byte(kLinedirection) != 0) {
+ data.byte(kLinepointer) = data.byte(kLinelength) - 1;
+ data.byte(kLinedirection) = 1;
+ return;
+ }
+ data.byte(kLinepointer) = 0;
+}
+
+void DreamGenContext::checkdest(const RoomPaths *roomsPaths) {
+ const PathSegment *segments = roomsPaths->segments;
+ ah = data.byte(kManspath) << 4;
+ al = data.byte(kDestination);
+ uint8 destination = data.byte(kDestination);
+ for (size_t i = 0; i < 24; ++i) {
+ dh = segments[i].b0 & 0xf0;
+ dl = segments[i].b0 & 0x0f;
+ if (ax == dx) {
+ data.byte(kDestination) = segments[i].b1 & 0x0f;
+ return;
+ }
+ dl = (segments[i].b0 & 0xf0) >> 4;
+ dh = (segments[i].b0 & 0x0f) << 4;
+ if (ax == dx) {
+ destination = segments[i].b1 & 0x0f;
+ }
+ }
+ data.byte(kDestination) = destination;
+}
+
+void DreamGenContext::findxyfrompath() {
+ const PathNode *roomsPaths = getroomspaths()->nodes;
+ data.byte(kRyanx) = roomsPaths[data.byte(kManspath)].x - 12;
+ data.byte(kRyany) = roomsPaths[data.byte(kManspath)].y - 12;
+}
+
+void DreamGenContext::checkifpathison() {
+ flags._z = checkifpathison(al);
+}
+
+bool DreamGenContext::checkifpathison(uint8 index) {
+ RoomPaths *roomsPaths = getroomspaths();
+ uint8 pathOn = roomsPaths->nodes[index].on;
+ return pathOn == 0xff;
+}
+
+void DreamGenContext::bresenhams() {
+ workoutframes();
+ int8 *lineData = (int8 *)data.ptr(kLinedata, 0);
+ int16 startX = (int16)data.word(kLinestartx);
+ int16 startY = (int16)data.word(kLinestarty);
+ int16 endX = (int16)data.word(kLineendx);
+ int16 endY = (int16)data.word(kLineendy);
+
+ if (endX == startX) {
+ uint16 deltaY;
+ int8 y;
+ if (endY < startY) {
+ deltaY = startY - endY;
+ y = (int8)endY;
+ data.byte(kLinedirection) = 1;
+ } else {
+ deltaY = endY - startY;
+ y = (int8)startY;
+ data.byte(kLinedirection) = 0;
+ }
+ ++deltaY;
+ int8 x = (int8)startX;
+ data.byte(kLinelength) = deltaY;
+ do {
+ lineData[0] = x;
+ lineData[1] = y;
+ lineData += 2;
+ ++y;
+ --deltaY;
+ } while (deltaY);
+ return;
+ }
+ uint16 deltaX;
+ if (endX < startX) {
+ deltaX = startX - endX;
+ SWAP(startX, endX);
+ SWAP(startY, endY);
+ data.word(kLinestartx) = (uint16)startX;
+ data.word(kLinestarty) = (uint16)startY;
+ data.word(kLineendx) = (uint16)endX;
+ data.word(kLineendy) = (uint16)endY;
+ data.byte(kLinedirection) = 1;
+ } else {
+ deltaX = endX - startX;
+ data.byte(kLinedirection) = 0;
+ }
+
+ int16 increment;
+ if (endY == startY) {
+ int8 x = (int8)startX;
+ int8 y = (int8)startY;
+ ++deltaX;
+ data.byte(kLinelength) = deltaX;
+ do {
+ lineData[0] = x;
+ lineData[1] = y;
+ lineData += 2;
+ ++x;
+ --deltaX;
+ } while (deltaX);
+ return;
+ }
+ uint16 deltaY;
+ if (startY > endY) {
+ deltaY = startY - endY;
+ increment = -1;
+ } else {
+ deltaY = endY - startY;
+ increment = 1;
+ }
+
+ uint16 delta1, delta2;
+ if (deltaY > deltaX) {
+ data.byte(kLineroutine) = 1;
+ delta1 = deltaY;
+ delta2 = deltaX;
+ } else {
+ data.byte(kLineroutine) = 0;
+ delta1 = deltaX;
+ delta2 = deltaY;
+ }
+
+ data.word(kIncrement1) = delta2 * 2;
+ int16 remainder = delta2 * 2 - delta1;
+ data.word(kIncrement2) = delta2 * 2 - delta1 * 2;
+ ++delta1;
+ int8 x = (int8)startX;
+ int8 y = (int8)startY;
+ data.byte(kLinelength) = delta1;
+ if (data.byte(kLineroutine) != 1) {
+ do {
+ lineData[0] = x;
+ lineData[1] = y;
+ lineData += 2;
+ ++x;
+ if (remainder < 0) {
+ remainder += data.word(kIncrement1);
+ } else {
+ remainder += data.word(kIncrement2);
+ y += increment;
+ }
+ --delta1;
+ } while (delta1);
+ } else {
+ do {
+ lineData[0] = x;
+ lineData[1] = y;
+ lineData += 2;
+ y += increment;
+ if (remainder < 0) {
+ remainder += data.word(kIncrement1);
+ } else {
+ remainder += data.word(kIncrement2);
+ ++x;
+ }
+ --delta1;
+ } while (delta1);
+ }
+}
+
+} /*namespace dreamgen */
+
diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp
new file mode 100644
index 0000000000..edaf8ee1eb
--- /dev/null
+++ b/engines/dreamweb/print.cpp
@@ -0,0 +1,233 @@
+/* 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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamGen {
+
+void DreamGenContext::printboth(const Frame *charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar) {
+ uint16 newX = *x;
+ uint8 width, height;
+ printchar(charSet, &newX, y, c, nextChar, &width, &height);
+ multidump(*x, y, width, height);
+ *x = newX;
+}
+
+uint8 DreamGenContext::getnextword(const Frame *charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount) {
+ *totalWidth = 0;
+ *charCount = 0;
+ while(true) {
+ uint8 firstChar = *string;
+ ++string;
+ ++*charCount;
+ if ((firstChar == ':') || (firstChar == 0)) { //endall
+ *totalWidth += 6;
+ return 1;
+ }
+ if (firstChar == 32) { //endword
+ *totalWidth += 6;
+ return 0;
+ }
+ firstChar = engine->modifyChar(firstChar);
+ if (firstChar != 255) {
+ uint8 secondChar = *string;
+ uint8 width = charSet[firstChar - 32 + data.word(kCharshift)].width;
+ width = kernchars(firstChar, secondChar, width);
+ *totalWidth += width;
+ }
+ }
+}
+
+void DreamGenContext::printchar() {
+ uint16 x = di;
+ uint8 width, height;
+ printchar((const Frame *)ds.ptr(0, 0), &x, bx, al, ah, &width, &height);
+ di = x;
+ cl = width;
+ ch = height;
+}
+
+void DreamGenContext::printchar(const Frame *charSet, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) {
+ if (c == 255)
+ return;
+ push(si);
+ push(di);
+ if (data.byte(kForeignrelease) != 0)
+ y -= 3;
+ uint16 tmp = c - 32 + data.word(kCharshift);
+ showframe(charSet, *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height);
+ di = pop();
+ si = pop();
+ _cmp(data.byte(kKerning), 0);
+ if (flags.z())
+ *width = kernchars(c, nextChar, *width);
+ (*x) += *width;
+}
+
+void DreamGenContext::printslow() {
+ al = printslow(es.ptr(si, 0), di, bx, dl, (bool)(dl & 1));
+}
+
+uint8 DreamGenContext::printslow(const uint8 *string, uint16 x, uint16 y, uint8 maxWidth, bool centered) {
+ data.byte(kPointerframe) = 1;
+ data.byte(kPointermode) = 3;
+ const Frame* charSet = (const Frame *)segRef(data.word(kCharset1)).ptr(0, 0);
+ do {
+ uint16 offset = x;
+ uint16 charCount = getnumber(charSet, string, maxWidth, centered, &offset);
+ do {
+ uint8 c0 = string[0];
+ uint8 c1 = string[1];
+ uint8 c2 = string[2];
+ c0 = engine->modifyChar(c0);
+ printboth(charSet, &offset, y, c0, c1);
+ if ((c1 == 0) || (c1 == ':')) {
+ return 0;
+ }
+ if (charCount != 1) {
+ c1 = engine->modifyChar(c1);
+ data.word(kCharshift) = 91;
+ uint16 offset2 = offset;
+ printboth(charSet, &offset2, y, c1, c2);
+ data.word(kCharshift) = 0;
+ for (int i=0; i<2; ++i) {
+ uint16 mouseState = waitframes();
+ if (data.byte(kQuitrequested))
+ return 0;
+ if (mouseState == 0)
+ continue;
+ if (mouseState != data.word(kOldbutton)) {
+ return 1;
+ }
+ }
+ }
+
+ ++string;
+ --charCount;
+ } while (charCount);
+ y += 10;
+ } while (true);
+}
+
+void DreamGenContext::printdirect() {
+ uint16 y = bx;
+ uint16 initialSi = si;
+ const uint8 *initialString = es.ptr(si, 0);
+ const uint8 *string = initialString;
+ printdirect(&string, di, &y, dl, (bool)(dl & 1));
+ si = initialSi + (string - initialString);
+ bx = y;
+}
+
+void DreamGenContext::printdirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered) {
+ printdirect(&string, x, &y, maxWidth, centered);
+}
+
+void DreamGenContext::printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered) {
+ data.word(kLastxpos) = x;
+ const Frame *charSet = (const Frame *)segRef(data.word(kCurrentset)).ptr(0, 0);
+ while (true) {
+ uint16 offset = x;
+ uint8 charCount = getnumber(charSet, *string, maxWidth, centered, &offset);
+ uint16 i = offset;
+ do {
+ uint8 c = (*string)[0];
+ uint8 nextChar = (*string)[1];
+ ++(*string);
+ if ((c == 0) || (c == ':')) {
+ return;
+ }
+ c = engine->modifyChar(c);
+ uint8 width, height;
+ printchar(charSet, &i, *y, c, nextChar, &width, &height);
+ data.word(kLastxpos) = i;
+ --charCount;
+ } while(charCount);
+ *y += data.word(kLinespacing);
+ }
+}
+
+void DreamGenContext::getnumber() {
+ uint16 offset = di;
+ cl = getnumber((Frame *)ds.ptr(0, 0), es.ptr(si, 0), dl, (bool)(dl & 1), &offset);
+ di = offset;
+}
+
+uint8 DreamGenContext::getnumber(const Frame *charSet, const uint8 *string, uint16 maxWidth, bool centered, uint16* offset) {
+ uint8 totalWidth = 0;
+ uint8 charCount = 0;
+ while (true) {
+ uint8 wordTotalWidth, wordCharCount;
+ uint8 done = getnextword(charSet, string, &wordTotalWidth, &wordCharCount);
+ string += wordCharCount;
+
+ if (done == 1) { //endoftext
+ ax = totalWidth + wordTotalWidth - 10;
+ if (ax < maxWidth) {
+ totalWidth += wordTotalWidth;
+ charCount += wordCharCount;
+ }
+
+ if (centered) {
+ ax = (maxWidth & 0xfe) + 2 + 20 - totalWidth;
+ ax /= 2;
+ } else {
+ ax = 0;
+ }
+ *offset += ax;
+ return charCount;
+ }
+ ax = totalWidth + wordTotalWidth - 10;
+ if (ax >= maxWidth) { //gotoverend
+ if (centered) {
+ ax = (maxWidth & 0xfe) - totalWidth + 20;
+ ax /= 2;
+ } else {
+ ax = 0;
+ }
+ *offset += ax;
+ return charCount;
+ }
+ totalWidth += wordTotalWidth;
+ charCount += wordCharCount;
+ }
+}
+
+uint8 DreamGenContext::kernchars(uint8 firstChar, uint8 secondChar, uint8 width) {
+ if ((firstChar == 'a') || (al == 'u')) {
+ if ((secondChar == 'n') || (secondChar == 't') || (secondChar == 'r') || (secondChar == 'i') || (secondChar == 'l'))
+ return width-1;
+ }
+ return width;
+}
+
+uint16 DreamGenContext::waitframes() {
+ readmouse();
+ showpointer();
+ vsync();
+ dumppointer();
+ delpointer();
+ return data.word(kMousebutton);
+}
+
+} /*namespace dreamgen */
+
diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index 724d5e4053..8aa71b285c 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -1,5 +1,27 @@
-#ifndef ENGINES_DREAMGEN_RUNTIME_H__
-#define ENGINES_DREAMGEN_RUNTIME_H__
+/* 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 DREAMGEN_RUNTIME_H__
+#define DREAMGEN_RUNTIME_H__
#include <assert.h>
#include "common/scummsys.h"
@@ -111,7 +133,7 @@ struct Segment {
return WordRef(data, index);
}
- inline uint8* ptr(unsigned index, unsigned size) {
+ inline uint8 *ptr(unsigned index, unsigned size) {
assert(index + size <= data.size());
return data.begin() + index;
}
@@ -164,7 +186,7 @@ public:
_segment->assign(b, e);
}
- inline uint8* ptr(unsigned index, unsigned size) {
+ inline uint8 *ptr(unsigned index, unsigned size) {
assert(_segment != 0);
return _segment->ptr(index, size);
}
@@ -265,6 +287,12 @@ public:
_freeSegments.push_back(id);
}
+ SegmentRef segRef(uint16 seg) {
+ SegmentRef result(this);
+ result = seg;
+ return result;
+ }
+
inline void _cmp(uint8 a, uint8 b) {
_sub(a, b);
}
@@ -464,11 +492,9 @@ public:
inline void _movsb(uint size, bool clear_cx = false) {
assert(size != 0xffff);
- uint8 *dst = es.ptr(di, size);
- uint8 *src = ds.ptr(si, size);
- memcpy(dst, src, size);
- di += size;
- si += size;
+ //fixme: add overlap and segment boundary check and rewrite
+ while (size--)
+ _movsb();
if (clear_cx)
cx = 0;
}
@@ -505,7 +531,7 @@ public:
assert(size != 0xffff);
uint8 *dst = es.ptr(di, size * 2);
di += 2 * size;
- while(size--) {
+ while (size--) {
*dst++ = al;
*dst++ = ah;
}
@@ -560,4 +586,3 @@ public:
}
#endif
-
diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
new file mode 100644
index 0000000000..636182dc83
--- /dev/null
+++ b/engines/dreamweb/saveload.cpp
@@ -0,0 +1,343 @@
+/* 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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+#include "engines/metaengine.h"
+#include "gui/saveload.h"
+#include "common/config-manager.h"
+#include "common/translation.h"
+
+namespace DreamGen {
+
+void DreamGenContext::loadgame() {
+ STACK_CHECK;
+ if (data.byte(kCommandtype) != 246) {
+ data.byte(kCommandtype) = 246;
+ al = 41;
+ commandonly();
+ }
+ if (data.word(kMousebutton) == data.word(kOldbutton))
+ return; // "noload"
+ if (data.word(kMousebutton) == 1) {
+ ax = 0xFFFF;
+ doload();
+ }
+}
+
+// input: ax = savegameId
+// if -1, open menu to ask for slot to load
+// if >= 0, directly load from that slot
+void DreamGenContext::doload() {
+ STACK_CHECK;
+ int savegameId = (int16)ax;
+
+ data.byte(kLoadingorsave) = 1;
+
+ if (ConfMan.getBool("dreamweb_originalsaveload") && savegameId == -1) {
+ showopbox();
+ showloadops();
+ data.byte(kCurrentslot) = 0;
+ showslots();
+ shownames();
+ data.byte(kPointerframe) = 0;
+ worktoscreenm();
+ namestoold();
+ data.byte(kGetback) = 0;
+
+ while (true) {
+ if (data.byte(kQuitrequested))
+ return; // "quitloaded"
+ delpointer();
+ readmouse();
+ showpointer();
+ vsync();
+ dumppointer();
+ dumptextline();
+ bx = offset_loadlist;
+ checkcoords();
+ if (data.byte(kGetback) == 1)
+ break;
+ if (data.byte(kGetback) == 2)
+ return; // "quitloaded"
+ }
+ } else {
+
+ if (savegameId == -1) {
+ // Open dialog to get savegameId
+
+ const EnginePlugin *plugin = NULL;
+ Common::String gameId = ConfMan.get("gameid");
+ EngineMan.findGame(gameId, &plugin);
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"));
+ dialog->setSaveMode(false);
+ savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ delete dialog;
+ }
+
+ if (savegameId < 0) {
+ data.byte(kGetback) = 0;
+ return;
+ }
+
+
+ // TODO: proper scheme for filename, in a separate function
+ //Common::String filename = ConfMan.getActiveDomainName() + Common::String::format(".d%02d", savegameId);
+ Common::String filename = Common::String::format("DREAMWEB.D%02d", savegameId);
+ debug(1, "Loading from filename: %s", filename.c_str());
+ engine->openSaveFileForReading(filename);
+
+ // TODO: The below is duplicated from Loadposition
+ data.word(kTimecount) = 0;
+ clearchanges();
+
+ ds = cs;
+ dx = kFileheader;
+ cx = kHeaderlen;
+ savefileread();
+ es = cs;
+ di = kFiledata;
+ ax = savegameId;
+ if (savegameId < 7) {
+ cx = 17;
+ _mul(cx);
+ ds = data;
+ dx = kSavenames;
+ _add(dx, ax);
+ loadseg();
+ } else {
+ // For potential support of more than 7 savegame slots,
+ // loading into the savenames buffer isn't always possible
+ // Emulate a loadseg call:
+ uint8 namebuf[17];
+ engine->readFromFile(namebuf, 17);
+ _add(di, 2);
+ }
+ ds = data;
+ dx = kStartvars;
+ loadseg();
+ ds = data.word(kExtras);
+ dx = kExframedata;
+ loadseg();
+ ds = data.word(kBuffers);
+ dx = kListofchanges;
+ loadseg();
+ ds = data;
+ dx = kMadeuproomdat;
+ loadseg();
+ ds = cs;
+ dx = kReelroutines;
+ loadseg();
+ closefile();
+ data.byte(kGetback) = 1;
+ }
+
+ // kTempgraphics might not have been allocated if we bypassed all menus
+ if (data.word(kTempgraphics) != 0xFFFF)
+ getridoftemp();
+
+ dx = data;
+ es = dx;
+ bx = kMadeuproomdat;
+ startloading();
+ loadroomssample();
+ data.byte(kRoomloaded) = 1;
+ data.byte(kNewlocation) = 255;
+ clearsprites();
+ initman();
+ initrain();
+ data.word(kTextaddressx) = 13;
+ data.word(kTextaddressy) = 182;
+ data.byte(kTextlen) = 240;
+ startup();
+ worktoscreen();
+ data.byte(kGetback) = 4;
+}
+
+
+void DreamGenContext::savegame() {
+ STACK_CHECK;
+ if (data.byte(kMandead) == 2) {
+ blank();
+ return;
+ }
+
+ if (data.byte(kCommandtype) != 247) {
+ data.byte(kCommandtype) = 247;
+ al = 44;
+ commandonly();
+ }
+ if (data.word(kMousebutton) != 1)
+ return;
+
+ data.byte(kLoadingorsave) = 2;
+
+ if (ConfMan.getBool("dreamweb_originalsaveload")) {
+ showopbox();
+ showsaveops();
+ data.byte(kCurrentslot) = 0;
+ showslots();
+ shownames();
+ worktoscreenm();
+ namestoold();
+ data.word(kBufferin) = 0;
+ data.word(kBufferout) = 0;
+ data.byte(kGetback) = 0;
+
+ while (true) {
+ _cmp(data.byte(kQuitrequested), 0);
+ if (!flags.z())
+ return /* (quitsavegame) */;
+ delpointer();
+ checkinput();
+ readmouse();
+ showpointer();
+ vsync();
+ dumppointer();
+ dumptextline();
+ bx = offset_savelist;
+ checkcoords();
+ _cmp(data.byte(kGetback), 0);
+ if (flags.z())
+ continue;
+ break;
+ }
+ return;
+ } else {
+ const EnginePlugin *plugin = NULL;
+ Common::String gameId = ConfMan.get("gameid");
+ EngineMan.findGame(gameId, &plugin);
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"));
+ dialog->setSaveMode(true);
+ int savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ Common::String game_description = dialog->getResultString();
+ if (game_description.empty())
+ game_description = "Untitled";
+ delete dialog;
+
+ if (savegameId < 0) {
+ data.byte(kGetback) = 0;
+ return;
+ }
+
+ // TODO: The below is copied from actualsave
+ al = data.byte(kLocation);
+ ah = 0;
+ cx = 32;
+ _mul(cx);
+ ds = cs;
+ si = kRoomdata;
+ _add(si, ax);
+ di = kMadeuproomdat;
+ bx = di;
+ es = cs;
+ cx = 16;
+ _movsw(cx, true);
+ al = data.byte(kRoomssample);
+ es.byte(bx+13) = al;
+ al = data.byte(kMapx);
+ es.byte(bx+15) = al;
+ al = data.byte(kMapy);
+ es.byte(bx+16) = al;
+ al = data.byte(kLiftflag);
+ es.byte(bx+20) = al;
+ al = data.byte(kManspath);
+ es.byte(bx+21) = al;
+ al = data.byte(kFacing);
+ es.byte(bx+22) = al;
+ al = 255;
+ es.byte(bx+27) = al;
+
+ // TODO: The below is copied from saveposition
+ makeheader();
+
+ //Common::String filename = ConfMan.getActiveDomainName() + Common::String::format(".d%02d", savegameId);
+ Common::String filename = Common::String::format("DREAMWEB.D%02d", savegameId);
+ debug(1, "Saving to filename: %s (%s)", filename.c_str(), game_description.c_str());
+
+ engine->openSaveFileForWriting(filename.c_str());
+
+ dx = data;
+ ds = dx;
+ dx = kFileheader;
+ cx = kHeaderlen;
+ savefilewrite();
+ dx = data;
+ es = dx;
+ di = kFiledata;
+
+ // TODO: Check if this 2 is a constant
+ uint8 descbuf[17] = { 2, 0 };
+ strncpy((char*)descbuf+1, game_description.c_str(), 16);
+ unsigned int desclen = game_description.size();
+ if (desclen > 15)
+ desclen = 15;
+ // zero terminate, and pad with ones
+ descbuf[++desclen] = 0;
+ while (desclen < 17)
+ descbuf[++desclen] = 1;
+ if (savegameId < 7) {
+ ax = savegameId;
+ cx = 17;
+ _mul(cx);
+ ds = data;
+ dx = kSavenames;
+ _add(dx, ax);
+ memcpy(data.ptr(dx,17), descbuf, 17);
+ saveseg();
+ } else {
+ // savenames only has room for descriptions for 7 slots
+ uint16 len = es.word(di);
+ _add(di, 2);
+ assert(len == 17);
+ engine->writeToSaveFile(descbuf, len);
+ }
+
+ ds = data;
+ dx = kStartvars;
+ saveseg();
+ ds = data.word(kExtras);
+ dx = kExframedata;
+ saveseg();
+ ds = data.word(kBuffers);
+ dx = kListofchanges;
+ saveseg();
+ ds = data;
+ dx = kMadeuproomdat;
+ saveseg();
+ ds = data;
+ dx = kReelroutines;
+ saveseg();
+ closefile();
+
+ getridoftemp();
+ restoreall();
+ data.word(kTextaddressx) = 13;
+ data.word(kTextaddressy) = 182;
+ data.byte(kTextlen) = 240;
+ redrawmainscrn();
+ worktoscreenm();
+ data.byte(kGetback) = 4;
+ }
+}
+
+
+} /*namespace dreamgen */
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
new file mode 100644
index 0000000000..3b67bfbd72
--- /dev/null
+++ b/engines/dreamweb/sprite.cpp
@@ -0,0 +1,907 @@
+/* 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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamGen {
+
+Sprite *DreamGenContext::spritetable() {
+ Sprite *sprite = (Sprite *)segRef(data.word(kBuffers)).ptr(kSpritetable, 16 * sizeof(Sprite));
+ return sprite;
+}
+
+void DreamGenContext::printsprites() {
+ for (size_t priority = 0; priority < 7; ++priority) {
+ Sprite *sprites = spritetable();
+ for (size_t j = 0; j < 16; ++j) {
+ const Sprite &sprite = sprites[j];
+ if (sprite.updateCallback() == 0x0ffff)
+ continue;
+ if (priority != sprite.priority)
+ continue;
+ if (sprite.hidden == 1)
+ continue;
+ printasprite(&sprite);
+ }
+ }
+}
+
+void DreamGenContext::printasprite(const Sprite *sprite) {
+ uint16 x, y;
+ if (sprite->y >= 220) {
+ y = data.word(kMapady) - (256 - sprite->y);
+ } else {
+ y = sprite->y + data.word(kMapady);
+ }
+
+ if (sprite->x >= 220) {
+ x = data.word(kMapadx) - (256 - sprite->x);
+ } else {
+ x = sprite->x + data.word(kMapadx);
+ }
+
+ uint8 c;
+ if (sprite->b29 != 0)
+ c = 8;
+ else
+ c = 0;
+ showframe((const Frame *)segRef(sprite->frameData()).ptr(0, 0), x, y, sprite->b15, c);
+}
+
+void DreamGenContext::clearsprites() {
+ memset(spritetable(), 0xff, sizeof(Sprite) * 16);
+}
+
+Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi) {
+ Sprite *sprite = spritetable();
+ while (sprite->b15 != 0xff) { // NB: No boundchecking in the original code either
+ ++sprite;
+ }
+
+ sprite->setUpdateCallback(updateCallback);
+ sprite->x = x;
+ sprite->y = y;
+ sprite->setFrameData(frameData);
+ WRITE_LE_UINT16(&sprite->w8, somethingInDi);
+ sprite->w2 = 0xffff;
+ sprite->b15 = 0;
+ sprite->delay = 0;
+ return sprite;
+}
+
+void DreamGenContext::spriteupdate() {
+ Sprite *sprites = spritetable();
+ sprites[0].hidden = data.byte(kRyanon);
+
+ Sprite *sprite = sprites;
+ for (size_t i=0; i < 16; ++i) {
+ uint16 updateCallback = sprite->updateCallback();
+ if (updateCallback != 0xffff) {
+ sprite->w24 = sprite->w2;
+ if (updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++
+ mainman(sprite);
+ else {
+ assert(updateCallback == addr_backobject);
+ backobject(sprite);
+ }
+ }
+
+ if (data.byte(kNowinnewroom) == 1)
+ break;
+ ++sprite;
+ }
+}
+
+void DreamGenContext::initman() {
+ Sprite *sprite = makesprite(data.byte(kRyanx), data.byte(kRyany), addr_mainman, data.word(kMainsprites), 0);
+ sprite->priority = 4;
+ sprite->b22 = 0;
+ sprite->b29 = 0;
+}
+
+void DreamGenContext::mainman() {
+ assert(false);
+}
+
+void DreamGenContext::mainman(Sprite *sprite) {
+ push(es);
+ push(ds);
+
+ // Recover es:bx from sprite
+ es = data.word(kBuffers);
+ bx = kSpritetable;
+ Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16);
+ bx += 32 * (sprite - sprites);
+ //
+
+ if (data.byte(kResetmanxy) == 1) {
+ data.byte(kResetmanxy) = 0;
+ sprite->x = data.byte(kRyanx);
+ sprite->y = data.byte(kRyany);
+ sprite->b29 = 0;
+ }
+ --sprite->b22;
+ if (sprite->b22 != 0xff) {
+ ds = pop();
+ es = pop();
+ return;
+ }
+ sprite->b22 = 0;
+ if (data.byte(kTurntoface) != data.byte(kFacing)) {
+ aboutturn(sprite);
+ } else {
+ if ((data.byte(kTurndirection) != 0) && (data.byte(kLinepointer) == 254)) {
+ data.byte(kReasseschanges) = 1;
+ if (data.byte(kFacing) == data.byte(kLeavedirection))
+ checkforexit();
+ }
+ data.byte(kTurndirection) = 0;
+ if (data.byte(kLinepointer) == 254) {
+ sprite->b29 = 0;
+ } else {
+ ++sprite->b29;
+ if (sprite->b29 == 11)
+ sprite->b29 = 1;
+ walking(sprite);
+ if (data.byte(kLinepointer) != 254) {
+ if ((data.byte(kFacing) & 1) == 0)
+ walking(sprite);
+ else if ((sprite->b29 != 2) && (sprite->b29 != 7))
+ walking(sprite);
+ }
+ if (data.byte(kLinepointer) == 254) {
+ if (data.byte(kTurntoface) == data.byte(kFacing)) {
+ data.byte(kReasseschanges) = 1;
+ if (data.byte(kFacing) == data.byte(kLeavedirection))
+ checkforexit();
+ }
+ }
+ }
+ }
+ static const uint8 facelist[] = { 0,60,33,71,11,82,22,93 };
+ sprite->b15 = sprite->b29 + facelist[data.byte(kFacing)];
+ data.byte(kRyanx) = sprite->x;
+ data.byte(kRyany) = sprite->y;
+
+ ds = pop();
+ es = pop();
+}
+
+void DreamGenContext::walking(Sprite *sprite) {
+ uint8 comp;
+ if (data.byte(kLinedirection) != 0) {
+ --data.byte(kLinepointer);
+ comp = 200;
+ } else {
+ ++data.byte(kLinepointer);
+ comp = data.byte(kLinelength);
+ }
+ if (data.byte(kLinepointer) < comp) {
+ sprite->x = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 0);
+ sprite->y = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 1);
+ return;
+ }
+
+ data.byte(kLinepointer) = 254;
+ data.byte(kManspath) = data.byte(kDestination);
+ if (data.byte(kDestination) == data.byte(kFinaldest)) {
+ facerightway();
+ return;
+ }
+ data.byte(kDestination) = data.byte(kFinaldest);
+ push(es);
+ push(bx);
+ autosetwalk();
+ bx = pop();
+ es = pop();
+}
+
+void DreamGenContext::aboutturn(Sprite *sprite) {
+ bool incdir = true;
+
+ if (data.byte(kTurndirection) == 1)
+ incdir = true;
+ else if ((int8)data.byte(kTurndirection) == -1)
+ incdir = false;
+ else {
+ if (data.byte(kFacing) < data.byte(kTurntoface)) {
+ uint8 delta = data.byte(kTurntoface) - data.byte(kFacing);
+ if (delta >= 4)
+ incdir = false;
+ else
+ incdir = true;
+ } else {
+ uint8 delta = data.byte(kFacing) - data.byte(kTurntoface);
+ if (delta >= 4)
+ incdir = true;
+ else
+ incdir = false;
+ }
+ }
+
+ if (incdir) {
+ data.byte(kTurndirection) = 1;
+ data.byte(kFacing) = (data.byte(kFacing) + 1) & 7;
+ sprite->b29 = 0;
+ } else {
+ data.byte(kTurndirection) = (uint8)-1;
+ data.byte(kFacing) = (data.byte(kFacing) - 1) & 7;
+ sprite->b29 = 0;
+ }
+}
+
+void DreamGenContext::backobject() {
+ assert(false);
+}
+
+void DreamGenContext::backobject(Sprite *sprite) {
+ SetObject *objData = (SetObject *)segRef(data.word(kSetdat)).ptr(sprite->objData(), 0);
+
+ if (sprite->delay != 0) {
+ --sprite->delay;
+ return;
+ }
+
+ sprite->delay = objData->delay;
+ if (objData->type == 6)
+ widedoor(sprite, objData);
+ else if (objData->type == 5)
+ random(sprite, objData);
+ else if (objData->type == 4)
+ lockeddoorway(sprite, objData);
+ else if (objData->type == 3)
+ liftsprite(sprite, objData);
+ else if (objData->type == 2)
+ doorway(sprite, objData);
+ else if (objData->type == 1)
+ constant(sprite, objData);
+ else
+ steady(sprite, objData);
+}
+
+void DreamGenContext::constant(Sprite *sprite, SetObject *objData) {
+ ++sprite->frame;
+ if (objData->b18[sprite->frame] == 255) {
+ sprite->frame = 0;
+ }
+ uint8 b18 = objData->b18[sprite->frame];
+ objData->index = b18;
+ sprite->b15 = b18;
+}
+
+void DreamGenContext::random(Sprite *sprite, SetObject *objData) {
+ randomnum1();
+ uint16 r = ax;
+ sprite->b15 = objData->b18[r&7];
+}
+
+void DreamGenContext::doorway(Sprite *sprite, SetObject *objData) {
+ data.byte(kDoorcheck1) = (uint8)-24;
+ data.byte(kDoorcheck2) = 10;
+ data.byte(kDoorcheck3) = (uint8)-30;
+ data.byte(kDoorcheck4) = 10;
+ dodoor(sprite, objData);
+}
+
+void DreamGenContext::widedoor(Sprite *sprite, SetObject *objData) {
+ data.byte(kDoorcheck1) = (uint8)-24;
+ data.byte(kDoorcheck2) = 24;
+ data.byte(kDoorcheck3) = (uint8)-30;
+ data.byte(kDoorcheck4) = 24;
+ dodoor(sprite, objData);
+}
+
+void DreamGenContext::dodoor() {
+ Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite));
+ SetObject *objData = (SetObject *)ds.ptr(di, 0);
+ dodoor(sprite, objData);
+}
+
+void DreamGenContext::dodoor(Sprite *sprite, SetObject *objData) {
+ uint8 ryanx = data.byte(kRyanx);
+ uint8 ryany = data.byte(kRyany);
+ if (ryanx < sprite->x) {
+ if (ryanx < sprite->x + (int8)data.byte(kDoorcheck1))
+ goto shutdoor;
+ } else {
+ if (ryanx >= sprite->x + data.byte(kDoorcheck2))
+ goto shutdoor;
+ }
+ if (ryany < sprite->y) {
+ if (ryany < sprite->y + (int8)data.byte(kDoorcheck3))
+ goto shutdoor;
+ } else {
+ if (ryany >= sprite->y + data.byte(kDoorcheck4))
+ goto shutdoor;
+ }
+//opendoor:
+ if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0))
+ sprite->frame = 6;
+
+ ++sprite->frame;
+ if (sprite->frame == 1) { //doorsound2
+ if (data.byte(kReallocation) == 5) //hoteldoor2
+ al = 13;
+ else
+ al = 0;
+ playchannel1();
+ }
+ if (objData->b18[sprite->frame] == 255) {
+ --sprite->frame;
+ }
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+ data.byte(kThroughdoor) = 1;
+ return;
+shutdoor:
+ if (sprite->frame == 5) { //doorsound1;
+ if (data.byte(kReallocation) == 5) //hoteldoor1
+ al = 13;
+ else
+ al = 1;
+ playchannel1();
+ }
+ if (sprite->frame != 0) {
+ --sprite->frame;
+ }
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+ if (sprite->frame == 5) //nearly
+ data.byte(kThroughdoor) = 0;
+}
+
+void DreamGenContext::steady(Sprite *sprite, SetObject *objData) {
+ uint8 b18 = objData->b18[0];
+ objData->index = b18;
+ sprite->b15 = b18;
+}
+
+void DreamGenContext::lockeddoorway(Sprite *sprite, SetObject *objData) {
+ if (data.byte(kRyanx) < sprite->x) {
+ if (sprite->x - data.byte(kRyanx) > 24)
+ goto shutdoor2;
+ } else {
+ if (data.byte(kRyanx) - sprite->x >= 10)
+ goto shutdoor2;
+ }
+
+ if (data.byte(kRyany) < sprite->y) {
+ if (sprite->y - data.byte(kRyany) > 30)
+ goto shutdoor2;
+ } else {
+ if (data.byte(kRyany) - sprite->y >= 12)
+ goto shutdoor2;
+ }
+
+ if (data.byte(kThroughdoor) != 1) {
+ if (data.byte(kLockstatus) == 1)
+ goto shutdoor2;
+ }
+
+ if (sprite->frame == 1) {
+ al = 0;
+ playchannel1();
+ }
+
+ if (sprite->frame == 6) {
+ turnpathon(data.byte(kDoorpath));
+ }
+
+ if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) {
+ sprite->frame = 6;
+ }
+
+ ++sprite->frame;
+ if (objData->b18[sprite->frame] == 255) {
+ --sprite->frame;
+ }
+
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+ if (sprite->frame == 5)
+ data.byte(kThroughdoor) = 1;
+ return;
+
+shutdoor2:
+ if (sprite->frame == 5) {
+ al = 1;
+ playchannel1();
+ }
+
+ if (sprite->frame != 0) {
+ --sprite->frame;
+ }
+
+ data.byte(kThroughdoor) = 0;
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+
+ if (sprite->frame == 0) {
+ turnpathoff(data.byte(kDoorpath));
+ data.byte(kLockstatus) = 1;
+ }
+}
+
+void DreamGenContext::liftsprite(Sprite *sprite, SetObject *objData) {
+ uint8 liftFlag = data.byte(kLiftflag);
+ if (liftFlag == 0) { //liftclosed
+ turnpathoff(data.byte(kLiftpath));
+
+ if (data.byte(kCounttoopen) != 0) {
+ _dec(data.byte(kCounttoopen));
+ if (data.byte(kCounttoopen) == 0)
+ data.byte(kLiftflag) = 3;
+ }
+ sprite->frame = 0;
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+ }
+ else if (liftFlag == 1) { //liftopen
+ turnpathon(data.byte(kLiftpath));
+
+ if (data.byte(kCounttoclose) != 0) {
+ _dec(data.byte(kCounttoclose));
+ if (data.byte(kCounttoclose) == 0)
+ data.byte(kLiftflag) = 2;
+ }
+ sprite->frame = 12;
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+ }
+ else if (liftFlag == 3) { //openlift
+ if (sprite->frame == 12) {
+ data.byte(kLiftflag) = 1;
+ return;
+ }
+ ++sprite->frame;
+ if (sprite->frame == 1) {
+ al = 2;
+ liftnoise();
+ }
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+ } else { //closeLift
+ assert(liftFlag == 2);
+ if (sprite->frame == 0) {
+ data.byte(kLiftflag) = 0;
+ return;
+ }
+ --sprite->frame;
+ if (sprite->frame == 11) {
+ al = 3;
+ liftnoise();
+ }
+ sprite->b15 = objData->index = objData->b18[sprite->frame];
+ }
+}
+
+void DreamGenContext::facerightway() {
+ PathNode *paths = getroomspaths()->nodes;
+ uint8 dir = paths[data.byte(kManspath)].dir;
+ data.byte(kTurntoface) = dir;
+ data.byte(kLeavedirection) = dir;
+}
+
+void DreamGenContext::findsource() {
+ uint16 currentFrame = data.word(kCurrentframe);
+ if (currentFrame < 160) {
+ ds = data.word(kReel1);
+ data.word(kTakeoff) = 0;
+ } else if (currentFrame < 320) {
+ ds = data.word(kReel2);
+ data.word(kTakeoff) = 160;
+ } else {
+ ds = data.word(kReel3);
+ data.word(kTakeoff) = 320;
+ }
+}
+
+Frame *DreamGenContext::findsourceCPP() {
+ push(ds);
+ findsource();
+ Frame *result = (Frame *)ds.ptr(0, 0);
+ ds = pop();
+ return result;
+}
+
+Reel *DreamGenContext::getreelstart() {
+ Reel *reel = (Reel *)segRef(data.word(kReels)).ptr(kReellist + data.word(kReelpointer) * sizeof(Reel) * 8, sizeof(Reel));
+ return reel;
+}
+
+void DreamGenContext::showreelframe() {
+ Reel *reel = (Reel *)es.ptr(si, sizeof(Reel));
+ showreelframe(reel);
+}
+
+void DreamGenContext::showreelframe(Reel *reel) {
+ uint16 x = reel->x + data.word(kMapadx);
+ uint16 y = reel->y + data.word(kMapady);
+ data.word(kCurrentframe) = reel->frame();
+ Frame *source = findsourceCPP();
+ uint16 frame = data.word(kCurrentframe) - data.word(kTakeoff);
+ showframe(source, x, y, frame, 8);
+}
+
+void DreamGenContext::showgamereel() {
+ showgamereel((ReelRoutine *)es.ptr(bx, sizeof(ReelRoutine)));
+}
+
+void DreamGenContext::showgamereel(ReelRoutine *routine) {
+ uint16 reelpointer = routine->reelPointer();
+ if (reelpointer >= 512)
+ return;
+ data.word(kReelpointer) = reelpointer;
+ plotreel();
+ routine->setReelPointer(data.word(kReelpointer));
+}
+
+const Frame *DreamGenContext::getreelframeax(uint16 frame) {
+ data.word(kCurrentframe) = frame;
+ Frame *source = findsourceCPP();
+ uint16 offset = data.word(kCurrentframe) - data.word(kTakeoff);
+ return source + offset;
+}
+
+void DreamGenContext::showrain() {
+ ds = data.word(kMainsprites);
+ si = 6*58;
+ ax = ds.word(si+2);
+ si = ax + 2080;
+ Rain *rain = (Rain *)segRef(data.word(kBuffers)).ptr(kRainlist, 0);
+ if (rain->x == 255)
+ return;
+ while (true) {
+ if (rain->x == 255) {
+ if (data.word(kCh1blockstocopy) != 0)
+ return;
+ if ((data.byte(kReallocation) == 2) && (data.byte(kBeenmugged) != 1))
+ return;
+ if (data.byte(kReallocation) == 55)
+ return;
+ randomnum1();
+ if (al >= 1)
+ return;
+ if (data.byte(kCh0playing) != 6)
+ al = 4;
+ else
+ al = 7;
+ playchannel1();
+ return;
+ }
+ uint16 y = rain->y + data.word(kMapady) + data.word(kMapystart);
+ uint16 x = rain->x + data.word(kMapadx) + data.word(kMapxstart);
+ uint16 size = rain->size;
+ ax = ((uint16)(rain->w3() - rain->b5)) & 511;
+ rain->setW3(ax);
+ ++rain;
+ const uint8 *src = ds.ptr(si, 0) + ax;
+ uint8 *dst = workspace() + y * 320 + x;
+ for(uint16 i = 0; i < size; ++i) {
+ uint8 v = src[i];
+ if (v != 0)
+ *dst = v;
+ dst += 320-1;
+ }
+ }
+}
+
+void DreamGenContext::updatepeople() {
+ data.word(kListpos) = kPeoplelist;
+ memset(segRef(data.word(kBuffers)).ptr(kPeoplelist, 12 * sizeof(People)), 0xff, 12 * sizeof(People));
+ ++data.word(kMaintimer);
+ es = cs;
+ bx = kReelroutines;
+ const ReelRoutine *reelRoutine = (const ReelRoutine *)cs.ptr(bx, 0);
+ const uint16 *callbacks = (const uint16 *)cs.ptr(kReelcalls, 0);
+ while (true) {
+ uint8 realLocation = reelRoutine->reallocation;
+ if (realLocation == 255)
+ return;
+ if ((realLocation == data.byte(kReallocation)) &&
+ (reelRoutine->mapX == data.byte(kMapx)) &&
+ (reelRoutine->mapY == data.byte(kMapy))) {
+ uint16 callback = READ_LE_UINT16(callbacks);
+ //dw gamer,sparkydrip,eden,edeninbath,sparky,smokebloke
+ if (callback == addr_gamer)
+ gamer();
+ else if (callback == addr_sparkydrip)
+ sparkydrip();
+ else if (callback == addr_eden)
+ eden();
+ else if (callback == addr_edeninbath)
+ edeninbath();
+ else if (callback == addr_sparky)
+ sparky();
+ else if (callback == addr_smokebloke)
+ smokebloke();
+ //dw manasleep,drunk,receptionist,malefan,femalefan
+ else if (callback == addr_manasleep)
+ manasleep();
+ else if (callback == addr_drunk)
+ drunk();
+ else if (callback == addr_receptionist)
+ receptionist();
+ else if (callback == addr_malefan)
+ malefan();
+ else if (callback == addr_femalefan)
+ femalefan();
+ //dw louis,louischair,soldier1,bossman,interviewer
+ else if (callback == addr_louis)
+ louis();
+ else if (callback == addr_louischair)
+ louischair();
+ else if (callback == addr_soldier1)
+ soldier1();
+ else if (callback == addr_bossman)
+ bossman();
+ else if (callback == addr_interviewer)
+ interviewer();
+ //dw heavy,manasleep2,mansatstill,drinker,bartender
+ else if (callback == addr_heavy)
+ heavy();
+ else if (callback == addr_manasleep2)
+ manasleep2();
+ else if (callback == addr_mansatstill)
+ mansatstill();
+ else if (callback == addr_drinker)
+ drinker();
+ else if (callback == addr_bartender)
+ bartender();
+ //dw othersmoker,tattooman,attendant,keeper,candles1
+ else if (callback == addr_othersmoker)
+ othersmoker();
+ else if (callback == addr_tattooman)
+ tattooman();
+ else if (callback == addr_attendant)
+ attendant();
+ else if (callback == addr_keeper)
+ keeper();
+ else if (callback == addr_candles1)
+ candles1();
+ //dw smallcandle,security,copper,poolguard,rockstar
+ else if (callback == addr_smallcandle)
+ smallcandle();
+ else if (callback == addr_security)
+ security();
+ else if (callback == addr_copper)
+ copper();
+ else if (callback == addr_poolguard)
+ poolguard();
+ else if (callback == addr_rockstar)
+ rockstar();
+ //dw businessman,train,aide,mugger,helicopter
+ else if (callback == addr_businessman)
+ businessman();
+ else if (callback == addr_train)
+ train();
+ else if (callback == addr_aide)
+ aide();
+ else if (callback == addr_mugger)
+ mugger();
+ else if (callback == addr_helicopter)
+ helicopter();
+ //dw intromagic1,intromusic,intromagic2,candles2,gates
+ else if (callback == addr_intromagic1)
+ intromagic1();
+ else if (callback == addr_intromusic)
+ intromusic();
+ else if (callback == addr_intromagic2)
+ intromagic2();
+ else if (callback == addr_candles2)
+ candles2();
+ else if (callback == addr_gates)
+ gates();
+ //dw intromagic3,intromonks1,candles,intromonks2
+ else if (callback == addr_intromagic3)
+ intromagic3();
+ else if (callback == addr_intromonks1)
+ intromonks1();
+ else if (callback == addr_candles)
+ candles();
+ else if (callback == addr_intromonks2)
+ intromonks2();
+ //dw handclap,monkandryan,endgameseq,priest,madman
+ else if (callback == addr_handclap)
+ handclap();
+ else if (callback == addr_monkandryan)
+ monkandryan();
+ else if (callback == addr_endgameseq)
+ endgameseq();
+ else if (callback == addr_priest)
+ priest();
+ else if (callback == addr_madman)
+ madman();
+ //dw madmanstelly,alleybarksound,foghornsound
+ else if (callback == addr_madmanstelly)
+ madmanstelly();
+ else if (callback == addr_alleybarksound)
+ alleybarksound();
+ else if (callback == addr_foghornsound)
+ foghornsound();
+ //dw carparkdrip,carparkdrip,carparkdrip,carparkdrip
+ else if (callback == addr_carparkdrip)
+ carparkdrip();
+ else
+ assert(false); // Oops I forgot something in the dispatch table
+ }
+ bx += 8;
+ ++reelRoutine;
+ ++callbacks;
+ }
+}
+
+void DreamGenContext::madmantext() {
+ if (isCD()) {
+ if (data.byte(kSpeechcount) >= 63)
+ return;
+ if (data.byte(kCh1playing) != 255)
+ return;
+ al = data.byte(kSpeechcount);
+ ++data.byte(kSpeechcount);
+ } else {
+ if (data.byte(kCombatcount) >= 61)
+ return;
+ al = data.byte(kCombatcount);
+ _and(al, 3);
+ if (!flags.z())
+ return;
+ al = data.byte(kCombatcount) / 4;
+ }
+ setuptimedtemp(47 + al, 82, 72, 80, 90, 1);
+}
+
+void DreamGenContext::madman() {
+ data.word(kWatchingtime) = 2;
+ checkspeed();
+ if (flags.z()) {
+ ax = es.word(bx+3);
+ if (ax >= 364) {
+ data.byte(kMandead) = 2;
+ showgamereel();
+ return;
+ }
+ if (ax == 10) {
+ push(es);
+ push(bx);
+ push(ax);
+ dx = kIntrotextname;
+ loadtemptext();
+ ax = pop();
+ bx = pop();
+ es = pop();
+ data.byte(kCombatcount) = (uint8)-1;
+ data.byte(kSpeechcount) = 0;
+ }
+ ++ax;
+ if (ax == 294) {
+ if (data.byte(kWongame) == 1)
+ return;
+ data.byte(kWongame) = 1;
+ push(es);
+ push(bx);
+ getridoftemptext();
+ bx = pop();
+ es = pop();
+ return;
+ }
+ if (ax == 66) {
+ ++data.byte(kCombatcount);
+ push(es);
+ push(bx);
+ madmantext();
+ bx = pop();
+ es = pop();
+ ax = 53;
+ if (data.byte(kCombatcount) >= (isCD() ? 64 : 62)) {
+ if (data.byte(kCombatcount) == (isCD() ? 70 : 68))
+ ax = 310;
+ else {
+ if (data.byte(kLastweapon) == 8) {
+ data.byte(kCombatcount) = isCD() ? 72 : 70;
+ data.byte(kLastweapon) = (uint8)-1;
+ data.byte(kMadmanflag) = 1;
+ ax = 67;
+ }
+ }
+ }
+ }
+ es.word(bx+3) = ax;
+ }
+ showgamereel();
+ es.byte(bx+1) = data.byte(kMapx);
+ madmode();
+}
+
+void DreamGenContext::madmode() {
+ data.word(kWatchingtime) = 2;
+ data.byte(kPointermode) = 0;
+ if (data.byte(kCombatcount) < (isCD() ? 65 : 63))
+ return;
+ if (data.byte(kCombatcount) >= (isCD() ? 70 : 68))
+ return;
+ data.byte(kPointermode) = 2;
+}
+
+void DreamGenContext::movemap(uint8 param) {
+ switch (param) {
+ case 32:
+ data.byte(kMapy) -= 20;
+ break;
+ case 16:
+ data.byte(kMapy) -= 10;
+ break;
+ case 8:
+ data.byte(kMapy) += 10;
+ break;
+ case 2:
+ data.byte(kMapx) += 11;
+ break;
+ default:
+ data.byte(kMapx) -= 11;
+ break;
+ }
+ data.byte(kNowinnewroom) = 1;
+}
+
+void DreamGenContext::checkone() {
+ uint8 flag, flagEx, type, flagX, flagY;
+ checkone(cl, ch, &flag, &flagEx, &type, &flagX, &flagY);
+
+ cl = flag;
+ ch = flagEx;
+ dl = flagX;
+ dh = flagY;
+ al = type;
+}
+
+void DreamGenContext::checkone(uint8 x, uint8 y, uint8 *flag, uint8 *flagEx, uint8 *type, uint8 *flagX, uint8 *flagY) {
+ *flagX = x / 16;
+ *flagY = y / 16;
+ const uint8 *tileData = segRef(data.word(kBuffers)).ptr(kMapflags + (*flagY * 11 + *flagX) * 3, 3);
+ *flag = tileData[0];
+ *flagEx = tileData[1];
+ *type = tileData[2];
+}
+
+void DreamGenContext::getblockofpixel() {
+ al = getblockofpixel(cl, ch);
+}
+
+uint8 DreamGenContext::getblockofpixel(uint8 x, uint8 y) {
+ uint8 flag, flagEx, type, flagX, flagY;
+ checkone(x + data.word(kMapxstart), y + data.word(kMapystart), &flag, &flagEx, &type, &flagX, &flagY);
+ if (flag & 1)
+ return 0;
+ else
+ return type;
+}
+
+void DreamGenContext::addtopeoplelist() {
+ addtopeoplelist((ReelRoutine *)es.ptr(bx, sizeof(ReelRoutine)));
+}
+
+void DreamGenContext::addtopeoplelist(ReelRoutine *routine) {
+ uint16 routinePointer = (const uint8 *)routine - cs.ptr(0, 0);
+
+ People *people = (People *)segRef(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(People));
+ people->setReelPointer(routine->reelPointer());
+ people->setRoutinePointer(routinePointer);
+ people->b4 = routine->b7;
+ data.word(kListpos) += sizeof(People);
+}
+
+} /*namespace dreamgen */
+
diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h
new file mode 100644
index 0000000000..0d7bbb6cbf
--- /dev/null
+++ b/engines/dreamweb/structs.h
@@ -0,0 +1,251 @@
+/* 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.
+ *
+ */
+
+#include "common/endian.h"
+
+struct Sprite {
+ uint16 _updateCallback;
+ uint16 updateCallback() const { return READ_LE_UINT16(&_updateCallback); }
+ void setUpdateCallback(uint16 v) { WRITE_LE_UINT16(&_updateCallback, v); }
+ uint16 w2;
+ uint16 w4;
+ uint16 _frameData;
+ uint16 frameData() const { return READ_LE_UINT16(&_frameData); }
+ void setFrameData(uint16 v) { WRITE_LE_UINT16(&_frameData, v); }
+ uint16 w8;
+ uint8 x;
+ uint8 y;
+ uint16 w12;
+ uint8 b14;
+ uint8 b15;
+ uint8 b16;
+ uint8 b17;
+ uint8 delay;
+ uint8 frame;
+ uint16 _objData;
+ uint16 objData() const { return READ_LE_UINT16(&_objData); }
+ void setObjData(uint16 v) { WRITE_LE_UINT16(&_objData, v); }
+ uint8 b22;
+ uint8 priority;
+ uint16 w24;
+ uint16 w26;
+ uint8 b28;
+ uint8 b29;
+ uint8 type;
+ uint8 hidden;
+};
+
+struct RectWithCallback {
+ uint16 _xMin, _xMax;
+ uint16 _yMin, _yMax;
+ uint16 _callback;
+
+ uint16 xMin() const { return READ_LE_UINT16(&_xMin); }
+ uint16 xMax() const { return READ_LE_UINT16(&_xMax); }
+ uint16 yMin() const { return READ_LE_UINT16(&_yMin); }
+ uint16 yMax() const { return READ_LE_UINT16(&_yMax); }
+ uint16 callback() const { return READ_LE_UINT16(&_callback); }
+
+ bool contains(uint16 x, uint16 y) const {
+ return (x >= xMin()) && (x < xMax()) && (y >= yMin()) && (y < yMax());
+ }
+};
+
+struct SetObject {
+ uint8 b0;
+ uint8 b1;
+ uint8 b2;
+ uint8 b3;
+ uint8 b4;
+ uint8 priority;
+ uint8 b6;
+ uint8 delay;
+ uint8 type;
+ uint8 b9;
+ uint8 b10;
+ uint8 b11;
+ uint8 name[4];
+ uint8 b16;
+ uint8 index;
+ uint8 b18[13]; // NB: Don't know the size yet
+ uint8 b31;
+ uint8 b32;
+ uint8 b33;
+ uint8 b34;
+ uint8 b35;
+ uint8 b36;
+ uint8 b37;
+ uint8 b38;
+ uint8 b39;
+ uint8 b40;
+ uint8 b41;
+ uint8 b42;
+ uint8 b43;
+ uint8 b44;
+ uint8 b45;
+ uint8 b46;
+ uint8 b47;
+ uint8 b48;
+ uint8 b49;
+ uint8 b50;
+ uint8 b51;
+ uint8 b52;
+ uint8 b53;
+ uint8 b54;
+ uint8 b55;
+ uint8 b56;
+ uint8 b57;
+ uint8 mapad[5];
+ uint8 b63;
+};
+
+struct DynObject {
+ uint8 currentLocation;
+ uint8 index;
+ uint8 mapad[5];
+ uint8 b7;
+ uint8 b8;
+ uint8 b9;
+ uint8 b10;
+ uint8 initialLocation;
+ uint8 id[4];
+};
+
+struct ObjPos {
+ uint8 xMin;
+ uint8 yMin;
+ uint8 xMax;
+ uint8 yMax;
+ uint8 index;
+};
+
+struct Frame {
+ uint8 width;
+ uint8 height;
+ uint16 _ptr;
+ uint16 ptr() const { return READ_LE_UINT16(&_ptr); }
+ void setPtr(uint16 v) { WRITE_LE_UINT16(&_ptr, v); }
+ uint8 x;
+ uint8 y;
+};
+
+struct Reel {
+ uint8 frame_lo;
+ uint8 frame_hi;
+ uint16 frame() const { return READ_LE_UINT16(&frame_lo); }
+ void setFrame(uint16 v) { WRITE_LE_UINT16(&frame_lo, v); }
+ uint8 x;
+ uint8 y;
+ uint8 b4;
+};
+
+struct ReelRoutine {
+ uint8 reallocation;
+ uint8 mapX;
+ uint8 mapY;
+ uint8 b3;
+ uint8 b4;
+ uint16 reelPointer() const { return READ_LE_UINT16(&b3); }
+ void setReelPointer(uint16 v) { WRITE_LE_UINT16(&b3, v); }
+ uint8 b5;
+ uint8 b6;
+ uint8 b7;
+};
+
+struct People {
+ uint8 b0;
+ uint8 b1;
+ uint16 reelPointer() const { return READ_LE_UINT16(&b0); }
+ void setReelPointer(uint16 v) { WRITE_LE_UINT16(&b0, v); }
+ uint8 b2;
+ uint8 b3;
+ uint16 routinePointer() const { return READ_LE_UINT16(&b2); }
+ void setRoutinePointer(uint16 v) { WRITE_LE_UINT16(&b2, v); }
+ uint8 b4;
+
+};
+
+struct Room {
+ uint8 name[10];
+ uint8 b10;
+ uint8 b11;
+ uint8 b12;
+ uint8 roomsSample;
+ uint8 b14;
+ uint8 mapX;
+ uint8 mapY;
+ uint8 b17;
+ uint8 b18;
+ uint8 b19;
+ uint8 liftFlag;
+ uint8 b21;
+ uint8 b22;
+ uint8 countToOpen;
+ uint8 liftPath;
+ uint8 doorPath;
+ uint8 b26;
+ uint8 b27;
+ uint8 b28;
+ uint8 b29;
+ uint8 b30;
+ uint8 b31;
+};
+
+struct Rain {
+ uint8 x;
+ uint8 y;
+ uint8 size;
+ uint8 w3_lo;
+ uint8 w3_hi;
+ uint16 w3() const { return READ_LE_UINT16(&w3_lo); }
+ void setW3(uint16 v) { WRITE_LE_UINT16(&w3_lo, v); }
+ uint8 b5;
+};
+
+struct Change {
+ uint8 index;
+ uint8 location;
+ uint8 value;
+ uint8 type;
+};
+
+struct PathNode {
+ uint8 x;
+ uint8 y;
+ uint8 b2;
+ uint8 b3;
+ uint8 b4;
+ uint8 b5;
+ uint8 on;
+ uint8 dir;
+};
+
+struct PathSegment {
+ uint8 b0;
+ uint8 b1;
+};
+
+struct RoomPaths {
+ PathNode nodes[12];
+ PathSegment segments[24];
+};
+
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 1869f1b109..bfa22f431c 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -1,103 +1,201 @@
+/* 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.
+ *
+ */
+
#include "dreamweb/dreamweb.h"
#include "engines/util.h"
-#include "graphics/surface.h"
+#include "common/config-manager.h"
namespace DreamGen {
-Common::String getFilename(Context &context) {
- uint16 name_ptr = context.dx;
- Common::String name;
- uint8 c;
- while((c = context.cs.byte(name_ptr++)) != 0)
- name += (char)c;
- return name;
-}
+void DreamGenContext::dreamweb() {
+ STACK_CHECK;
+ seecommandtail();
+ checkbasemem();
+ soundstartup();
+ setkeyboardint();
+ setupemm();
+ allocatebuffers();
+ setmouse();
+ fadedos();
+ gettime();
+ clearbuffers();
+ clearpalette();
+ set16colpalette();
+ readsetdata();
+ data.byte(kWongame) = 0;
-void DreamGenContext::multiget() {
- unsigned w = (uint8)cl, h = (uint8)ch;
- unsigned x = (uint16)di, y = (uint16)bx;
- unsigned src = x + y * kScreenwidth;
- unsigned dst = (uint16)si;
- es = ds;
- ds = data.word(kWorkspace);
- if (y + h > 200)
- h = 200 - y;
- if (x + w > 320)
- w = 320 - x;
- //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es);
- for(unsigned l = 0; l < h; ++l) {
- uint8 *src_p = ds.ptr(src + kScreenwidth * l, w);
- uint8 *dst_p = es.ptr(dst + w * l, w);
- memcpy(dst_p, src_p, w);
- }
- si += w * h;
- di = src + kScreenwidth * h;
- cx = 0;
-}
+ dx = 1909;
+ loadsample();
+ setsoundoff();
-void DreamGenContext::multiput() {
- unsigned w = (uint8)cl, h = (uint8)ch;
- unsigned x = (uint16)di, y = (uint16)bx;
- unsigned src = (uint16)si;
- unsigned dst = x + y * kScreenwidth;
- es = data.word(kWorkspace);
- if (y + h > 200)
- h = 200 - y;
- if (x + w > 320)
- w = 320 - x;
- //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es);
- for(unsigned l = 0; l < h; ++l) {
- uint8 *src_p = ds.ptr(src + w * l, w);
- uint8 *dst_p = es.ptr(dst + kScreenwidth * l, w);
- memcpy(dst_p, src_p, w);
- }
- si += w * h;
- di = dst + kScreenwidth * h;
- cx = 0;
-}
+ bool firstLoop = true;
-void DreamGenContext::multidump() {
- ds = data.word(kWorkspace);
- int w = (uint8)cl, h = (uint8)ch;
- int x = (int16)di, y = (int16)bx;
- unsigned offset = x + y * kScreenwidth;
- //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)ds, x, y, offset);
- engine->blit(ds.ptr(offset, w * h), kScreenwidth, x, y, w, h);
- si = di = offset + h * kScreenwidth;
- cx = 0;
-}
+ int savegameId = Common::ConfigManager::instance().getInt("save_slot");
-void DreamGenContext::worktoscreen() {
- ds = data.word(kWorkspace);
- uint size = 320 * 200;
- engine->blit(ds.ptr(0, size), 320, 0, 0, 320, 200);
- di = si = size;
- cx = 0;
-}
+ while (true) {
-void DreamGenContext::printundermon() {
- engine->printUnderMonitor();
-}
+ scanfornames();
-void DreamGenContext::cls() {
- engine->cls();
-}
+ bool startNewGame = true;
+
+ if (firstLoop && savegameId >= 0) {
+
+ // loading a savegame requested from launcher/command line
+
+ cls();
+ setmode();
+ loadpalfromiff();
+ clearpalette();
+
+ ax = savegameId;
+ doload();
+ worktoscreen();
+ fadescreenup();
+ startNewGame = false;
+
+ } else if (al == 0 && firstLoop) {
+
+ // no savegames found, and we're not restarting.
+
+ setmode();
+ loadpalfromiff();
+
+ } else {
+ // "dodecisions"
+
+ // Savegames found, so ask if we should load one.
+ // (If we're restarting after game over, we also always show these
+ // options.)
+
+ cls();
+ setmode();
+ decide();
+ if (data.byte(kQuitrequested))
+ return; // exit game
+
+ if (data.byte(kGetback) == 4)
+ startNewGame = false; // savegame has been loaded
+
+ }
+
+ firstLoop = false;
+
+ if (startNewGame) {
+ // "playgame"
+
+ titles();
+ if (data.byte(kQuitrequested))
+ return; // exit game
+ credits();
+
+ if (data.byte(kQuitrequested))
+ return; // exit game
+
+ clearchanges();
+ setmode();
+ loadpalfromiff();
+ data.byte(kLocation) = 255;
+ data.byte(kRoomafterdream) = 1;
+ data.byte(kNewlocation) = 35;
+ data.byte(kVolume) = 7;
+ loadroom();
+ clearsprites();
+ initman();
+ entrytexts();
+ entryanims();
+ data.byte(kDestpos) = 3;
+ initialinv();
+ data.byte(kLastflag) = 32;
+ startup1();
+ data.byte(kVolumeto) = 0;
+ data.byte(kVolumedirection) = (uint8)-1;
+ data.byte(kCommandtype) = 255;
+
+ }
+
+ // main loop
+ while (true) {
+
+ if (data.byte(kQuitrequested))
+ return; // exit game
+
+ screenupdate();
+
+ if (data.byte(kWongame) != 0) {
+ // "endofgame"
+ clearbeforeload();
+ fadescreendowns();
+ hangon(200);
+ endgame();
+ quickquit2();
+ return;
+ }
+
+ if (data.byte(kMandead) == 1 || data.byte(kMandead) == 2)
+ break;
+
+ if (data.word(kWatchingtime) > 0) {
+ if (data.byte(kFinaldest) == data.byte(kManspath))
+ data.word(kWatchingtime)--;
+ }
+
+ if (data.word(kWatchingtime) == 0) {
+ // "notwatching"
+
+ if (data.byte(kMandead) == 4)
+ break;
+
+ if (data.byte(kNewlocation) != 255) {
+ // "loadnew"
+ clearbeforeload();
+ loadroom();
+ clearsprites();
+ initman();
+ entrytexts();
+ entryanims();
+ data.byte(kNewlocation) = 255;
+ startup();
+ data.byte(kCommandtype) = 255;
+ worktoscreenm();
+ }
+ }
+ }
+
+ // "gameover"
+ clearbeforeload();
+ showgun();
+ fadescreendown();
+ hangon(100);
-void DreamGenContext::frameoutnm() {
- unsigned w = (uint8)cl, h = (uint8)ch;
- unsigned pitch = (uint16)dx;
- unsigned src = (uint16)si;
- int x = (uint16)di, y = (uint16)bx;
- unsigned dst = x + y * pitch;
- //debug(1, "framenm %ux%u[pitch: %u]-> %d,%d, segment: %04x->%04x", w, h, pitch, x, y, (uint16)ds, (uint16)es);
- for(unsigned l = 0; l < h; ++l) {
- uint8 *src_p = ds.ptr(src + w * l, w);
- uint8 *dst_p = es.ptr(dst + pitch * l, w);
- memcpy(dst_p, src_p, w);
}
- di += dst + pitch * h;
- si += w * h;
- cx = 0;
+}
+
+static Common::String getFilename(Context &context) {
+ uint16 name_ptr = context.dx;
+ Common::String name;
+ uint8 c;
+ while((c = context.cs.byte(name_ptr++)) != 0)
+ name += (char)c;
+ return name;
}
void DreamGenContext::seecommandtail() {
@@ -184,13 +282,173 @@ void DreamGenContext::dontloadseg() {
}
void DreamGenContext::mousecall() {
- engine->mouseCall();
+ uint16 x, y, state;
+ engine->mouseCall(&x, &y, &state);
+ cx = x;
+ dx = y;
+ bx = state;
+}
+
+void DreamGenContext::readmouse() {
+ data.word(kOldbutton) = data.word(kMousebutton);
+ data.word(kOldx) = data.word(kMousex);
+ data.word(kOldy) = data.word(kMousey);
+ uint16 x, y, state;
+ engine->mouseCall(&x, &y, &state);
+ data.word(kMousex) = x;
+ data.word(kMousey) = y;
+ data.word(kMousebutton) = state;
+}
+
+void DreamGenContext::readmouse1() {
+ data.word(kOldx) = data.word(kMousex);
+ data.word(kOldy) = data.word(kMousey);
+ uint16 x, y, state;
+ engine->mouseCall(&x, &y, &state);
+ data.word(kMousex) = x;
+ data.word(kMousey) = y;
+ data.word(kMousebutton1) = state;
+}
+
+void DreamGenContext::readmouse2() {
+ data.word(kOldx) = data.word(kMousex);
+ data.word(kOldy) = data.word(kMousey);
+ uint16 x, y, state;
+ engine->mouseCall(&x, &y, &state);
+ data.word(kMousex) = x;
+ data.word(kMousey) = y;
+ data.word(kMousebutton2) = state;
+}
+
+void DreamGenContext::readmouse3() {
+ data.word(kOldx) = data.word(kMousex);
+ data.word(kOldy) = data.word(kMousey);
+ uint16 x, y, state;
+ engine->mouseCall(&x, &y, &state);
+ data.word(kMousex) = x;
+ data.word(kMousey) = y;
+ data.word(kMousebutton3) = state;
+}
+
+void DreamGenContext::readmouse4() {
+ data.word(kOldbutton) = data.word(kMousebutton);
+ data.word(kOldx) = data.word(kMousex);
+ data.word(kOldy) = data.word(kMousey);
+ uint16 x, y, state;
+ engine->mouseCall(&x, &y, &state);
+ data.word(kMousex) = x;
+ data.word(kMousey) = y;
+ data.word(kMousebutton) = state | data.word(kMousebutton1) | data.word(kMousebutton2) | data.word(kMousebutton3);
}
void DreamGenContext::setmouse() {
data.word(kOldpointerx) = 0xffff;
}
+void DreamGenContext::dumptextline() {
+ if (data.byte(kNewtextline) != 1)
+ return;
+ data.byte(kNewtextline) = 0;
+ uint16 x = data.word(kTextaddressx);
+ uint16 y = data.word(kTextaddressy);
+ if (data.byte(kForeignrelease) != 0)
+ y -= 3;
+ multidump(x, y, 228, 13);
+}
+
+void DreamGenContext::getundertimed() {
+ uint16 y = data.byte(kTimedy);
+ if (data.byte(kForeignrelease))
+ y -= 3;
+ ds = data.word(kBuffers);
+ si = kUndertimedtext;
+ multiget(ds.ptr(si, 0), data.byte(kTimedx), y, 240, kUndertimedysize);
+}
+
+void DreamGenContext::putundertimed() {
+ uint16 y = data.byte(kTimedy);
+ if (data.byte(kForeignrelease))
+ y -= 3;
+ ds = data.word(kBuffers);
+ si = kUndertimedtext;
+ multiput(ds.ptr(si, 0), data.byte(kTimedx), y, 240, kUndertimedysize);
+}
+
+void DreamGenContext::usetimedtext() {
+ if (data.word(kTimecount) == 0)
+ return;
+ --data.word(kTimecount);
+ if (data.word(kTimecount) == 0) {
+ putundertimed();
+ data.byte(kNeedtodumptimed) = 1;
+ return;
+ }
+
+ if (data.word(kTimecount) == data.word(kCounttotimed))
+ getundertimed();
+ else if (data.word(kTimecount) > data.word(kCounttotimed))
+ return;
+
+ es = data.word(kTimedseg);
+ si = data.word(kTimedoffset);
+ const uint8 *string = es.ptr(si, 0);
+ uint16 y = data.byte(kTimedy);
+ printdirect(&string, data.byte(kTimedx), &y, 237, true);
+ data.byte(kNeedtodumptimed) = 1;
+}
+
+void DreamGenContext::setuptimedtemp() {
+ setuptimedtemp(al, ah, bl, bh, cx, dx);
+}
+
+void DreamGenContext::setuptimedtemp(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount) {
+#if 1 // if cd
+ if (voiceIndex != 0) {
+ push(ax);
+ push(bx);
+ push(cx);
+ push(dx);
+ dl = 'T';
+ dh = voiceIndex;
+ cl = 'T';
+ ah = 0;
+ loadspeech();
+ if (data.byte(kSpeechloaded) == 1) {
+ al = 50+12;
+ playchannel1();
+ }
+ dx = pop();
+ cx = pop();
+ bx = pop();
+ ax = pop();
+ if ((data.byte(kSpeechloaded) == 1) && (data.byte(kSubtitles) != 1))
+ return;
+ }
+#endif
+
+ if (data.word(kTimecount) != 0)
+ return;
+ data.byte(kTimedy) = y;
+ data.byte(kTimedx) = x;
+ data.word(kCounttotimed) = countToTimed;
+ data.word(kTimecount) = timeCount + countToTimed;
+ data.word(kTimedseg) = data.word(kTextfile1);
+ data.word(kTimedoffset) = kTextstart + segRef(data.word(kTextfile1)).word(textIndex * 2);
+ const uint8 *string = segRef(data.word(kTextfile1)).ptr(data.word(kTimedoffset), 0);
+ debug(1, "setuptimedtemp: (%d, %d) => '%s'", textIndex, voiceIndex, string);
+}
+
+void DreamGenContext::dumptimedtext() {
+ if (data.byte(kNeedtodumptimed) != 1)
+ return;
+ uint8 y = data.byte(kTimedy);
+ if (data.byte(kForeignrelease) != 0)
+ y -= 3;
+
+ multidump(data.byte(kTimedx), y, 240, kUndertimedysize);
+ data.byte(kNeedtodumptimed) = 0;
+}
+
void DreamGenContext::gettime() {
TimeDate t;
g_system->getTimeAndDate(t);
@@ -204,12 +462,17 @@ void DreamGenContext::gettime() {
}
void DreamGenContext::allocatemem() {
- uint size = (bx + 2) * 16;
+ ax = allocatemem(bx);
+}
+
+uint16 DreamGenContext::allocatemem(uint16 paragraphs) {
+ uint size = (paragraphs + 2) * 16;
debug(1, "allocate mem, %u bytes", size);
flags._c = false;
SegmentRef seg = allocateSegment(size);
- ax = (uint16)seg;
- debug(1, "\tsegment address -> %04x", (uint16)ax);
+ uint16 result = (uint16)seg;
+ debug(1, "\tsegment address -> %04x", result);
+ return result;
}
void DreamGenContext::deallocatemem() {
@@ -239,6 +502,15 @@ void DreamGenContext::removeemm() {
}
void DreamGenContext::setupemm() {
+ //good place for early initialization
+ switch(engine->getLanguage()) {
+ case Common::EN_ANY:
+ case Common::EN_GRB:
+ case Common::EN_USA:
+ return;
+ default:
+ data.byte(kForeignrelease) = 1;
+ }
}
void DreamGenContext::pitinterupt() {
@@ -375,8 +647,6 @@ void DreamGenContext::dosreturn() {
}
void DreamGenContext::set16colpalette() {
- //fixme: this is a bit hackish, set16colpalette called after initialization and nearly before main loop.
- engine->enableSavingOrLoading();
}
void DreamGenContext::mode640x480() {
@@ -394,135 +664,1227 @@ void DreamGenContext::fadedos() {
engine->fadeDos();
}
-void DreamGenContext::doshake() {
- uint8 &counter = data.byte(kShakecounter);
- _cmp(counter, 48);
- if (flags.z())
+void DreamGenContext::eraseoldobs() {
+ if (data.byte(kNewobs) == 0)
return;
- _add(counter, 1);
- static const int shakeTable[] = {
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 2, 0, -2, 3, -2,
- 0, 2, 4, -1, 1, -3, 3, 2,
- 0, -2, 3, -2, 0, 2, 4, -1,
+ Sprite *sprites = spritetable();
+ for (size_t i=0; i < 16; ++i) {
+ Sprite &sprite = sprites[i];
+ if (sprite.objData() != 0xffff) {
+ memset(&sprite, 0xff, sizeof(Sprite));
+ }
+ }
+}
- 1, -3, 3, 2, 0, -2, 3, -2,
- 0, 2, 4, -1, 1, -3, 3, 2,
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 2, 0, -2, 3, -2,
+void DreamGenContext::modifychar() {
+ al = engine->modifyChar(al);
+}
- 0, 2, 4, -1, 1, -3, 3, 2,
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 2, 0, -2, 3, -2,
- 0, 2, 4, -1, 1, -3, 3, 2,
+void DreamGenContext::lockmon() {
+ // Pressing space pauses text output in the monitor. We use the "hard"
+ // key because calling readkey() drains characters from the input
+ // buffer, we we want the user to be able to type ahead while the text
+ // is being printed.
+ if (data.byte(kLasthardkey) == 57) {
+ // Clear the keyboard buffer. Otherwise the space that caused
+ // the pause will be read immediately unpause the game.
+ do {
+ readkey();
+ } while (data.byte(kCurrentkey) != 0);
+
+ locklighton();
+ while (!engine->shouldQuit()) {
+ engine->waitForVSync();
+ readkey();
+ if (data.byte(kCurrentkey) == ' ')
+ break;
+ }
+ // Forget the last "hard" key, otherwise the space that caused
+ // the unpausing will immediately re-pause the game.
+ data.byte(kLasthardkey) = 0;
+ locklightoff();
+ }
+}
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 0,
- };
- int offset = shakeTable[counter];
- engine->setShakePos(offset >= 0? offset: -offset);
+void DreamGenContext::cancelch0() {
+ data.byte(kCh0repeat) = 0;
+ data.word(kCh0blockstocopy) = 0;
+ data.byte(kCh0playing) = 255;
+ engine->stopSound(0);
}
-void DreamGenContext::vsync() {
- engine->waitForVSync();
+void DreamGenContext::cancelch1() {
+ data.word(kCh1blockstocopy) = 0;
+ data.byte(kCh1playing) = 255;
+ engine->stopSound(1);
}
-void DreamGenContext::setmode() {
- vsync();
- initGraphics(320, 200, false);
+void DreamGenContext::makebackob(SetObject *objData) {
+ if (data.byte(kNewobs) == 0)
+ return;
+ uint8 priority = objData->priority;
+ uint8 type = objData->type;
+ Sprite *sprite = makesprite(data.word(kObjectx), data.word(kObjecty), addr_backobject, data.word(kSetframes), 0);
+
+ uint16 objDataOffset = (uint8 *)objData - segRef(data.word(kSetdat)).ptr(0, 0);
+ assert(objDataOffset % sizeof(SetObject) == 0);
+ assert(objDataOffset < 128 * sizeof(SetObject));
+ sprite->setObjData(objDataOffset);
+ if (priority == 255)
+ priority = 0;
+ sprite->priority = priority;
+ sprite->type = type;
+ sprite->b16 = 0;
+ sprite->delay = 0;
+ sprite->frame = 0;
+}
+
+void DreamGenContext::getroomdata() {
+ bx = kRoomdata + sizeof(Room) * al;
+}
+
+void DreamGenContext::startloading() {
+ const Room *room = (Room *)cs.ptr(bx, sizeof(Room));
+ startloading(room);
}
-void DreamGenContext::showpcx() {
+void DreamGenContext::readheader() {
+ ax = engine->readFromFile(cs.ptr(kFileheader, kHeaderlen), kHeaderlen);
+ es = cs;
+ di = kFiledata;
+}
+
+void DreamGenContext::startloading(const Room *room) {
+ data.byte(kCombatcount) = 0;
+ data.byte(kRoomssample) = room->roomsSample;
+ data.byte(kMapx) = room->mapX;
+ data.byte(kMapy) = room->mapY;
+ data.byte(kLiftflag) = room->liftFlag;
+ data.byte(kManspath) = room->b21;
+ data.byte(kDestination) = room->b21;
+ data.byte(kFinaldest) = room->b21;
+ data.byte(kFacing) = room->b22;
+ data.byte(kTurntoface) = room->b22;
+ data.byte(kCounttoopen) = room->countToOpen;
+ data.byte(kLiftpath) = room->liftPath;
+ data.byte(kDoorpath) = room->doorPath;
+ data.byte(kLastweapon) = (uint8)-1;
+ al = room->b27;
+ push(ax);
+ al = room->b31;
+ ah = data.byte(kReallocation);
+ data.byte(kReallocation) = al;
+ dx = bx;
Common::String name = getFilename(*this);
- Common::File pcxFile;
+ engine->openFile(name);
+ cs.word(kHandle) = 1; //only one handle
+ flags._c = false;
+ readheader();
+ allocateload();
+ ds = ax;
+ data.word(kBackdrop) = ax;
+ dx = (0);
+ loadseg();
+ ds = data.word(kWorkspace);
+ dx = (0);
+ cx = 132*66;
+ al = 0;
+ fillspace();
+ loadseg();
+ sortoutmap();
+ allocateload();
+ data.word(kSetframes) = ax;
+ ds = ax;
+ dx = (0);
+ loadseg();
+ ds = data.word(kSetdat);
+ dx = 0;
+ cx = (64*128);
+ al = 255;
+ fillspace();
+ loadseg();
+ allocateload();
+ data.word(kReel1) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kReel2) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kReel3) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kReels) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kPeople) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kSetdesc) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kBlockdesc) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kRoomdesc) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ allocateload();
+ data.word(kFreeframes) = ax;
+ ds = ax;
+ dx = 0;
+ loadseg();
+ ds = data.word(kFreedat);
+ dx = 0;
+ cx = (16*80);
+ al = 255;
+ fillspace();
+ loadseg();
+ allocateload();
+ data.word(kFreedesc) = ax;
+ ds = ax;
+ dx = (0);
+ loadseg();
+ closefile();
+ findroominloc();
+ deletetaken();
+ setallchanges();
+ autoappear();
+ al = data.byte(kNewlocation);
+ getroomdata();
+ data.byte(kLastweapon) = (uint8)-1;
+ data.byte(kMandead) = 0;
+ data.word(kLookcounter) = 160;
+ data.byte(kNewlocation) = 255;
+ data.byte(kLinepointer) = 254;
+ ax = pop();
+ if (al != 255) {
+ data.byte(kManspath) = al;
+ push(bx);
+ autosetwalk();
+ bx = pop();
+ }
+ findxyfrompath();
+}
- if (!pcxFile.open(name)) {
- warning("showpcx: Could not open '%s'", name.c_str());
- return;
+void DreamGenContext::fillspace() {
+ memset(ds.ptr(dx, cx), al, cx);
+}
+
+void DreamGenContext::dealwithspecial(uint8 firstParam, uint8 secondParam) {
+ uint8 type = firstParam - 220;
+ if (type == 0) {
+ placesetobject(secondParam);
+ data.byte(kHavedoneobs) = 1;
+ } else if (type == 1) {
+ removesetobject(secondParam);
+ data.byte(kHavedoneobs) = 1;
+ } else if (type == 2) {
+ al = secondParam;
+ placefreeobject();
+ data.byte(kHavedoneobs) = 1;
+ } else if (type == 3) {
+ al = secondParam;
+ removefreeobject();
+ data.byte(kHavedoneobs) = 1;
+ } else if (type == 4) {
+ switchryanoff();
+ } else if (type == 5) {
+ data.byte(kTurntoface) = secondParam;
+ data.byte(kFacing) = secondParam;
+ switchryanon();
+ } else if (type == 6) {
+ data.byte(kNewlocation) = secondParam;
+ } else {
+ movemap(secondParam);
}
+}
- uint8 *maingamepal;
- int i, j;
+void DreamGenContext::plotreel() {
+ Reel *reel = getreelstart();
+ while (true) {
+ if (reel->x < 220)
+ break;
+ if (reel->x == 255)
+ break;
+ dealwithspecial(reel->x, reel->y);
+ ++data.word(kReelpointer);
+ reel += 8;
+ }
- // Read the 16-color palette into the 'maingamepal' buffer. Note that
- // the color components have to be adjusted from 8 to 6 bits.
+ for (size_t i = 0; i < 8; ++i) {
+ if (reel->frame() != 0xffff)
+ showreelframe(reel);
+ ++reel;
+ }
+ push(es);
+ push(bx);
+ soundonreels();
+ bx = pop();
+ es = pop();
+}
- pcxFile.seek(16, SEEK_SET);
- es = data.word(kBuffers);
- maingamepal = es.ptr(kMaingamepal, 768);
- pcxFile.read(maingamepal, 48);
+void DreamGenContext::crosshair() {
+ uint8 frame;
+ if ((data.byte(kCommandtype) != 3) && (data.byte(kCommandtype) < 10)) {
+ frame = 9;
+ } else {
+ frame = 29;
+ }
+ const Frame *src = (const Frame *)segRef(data.word(kIcons1)).ptr(0, 0);
+ showframe(src, kZoomx + 24, kZoomy + 19, frame, 0);
+}
+
+void DreamGenContext::deltextline() {
+ uint16 x = data.word(kTextaddressx);
+ uint16 y = data.word(kTextaddressy);
+ if (data.byte(kForeignrelease) != 0)
+ y -= 3;
+ multiput(segRef(data.word(kBuffers)).ptr(kTextunder, 0), x, y, kUndertextsizex, kUndertextsizey);
+}
+
+void DreamGenContext::commandonly() {
+ commandonly(al);
+}
- memset(maingamepal + 48, 0xff, 720);
- for (i = 0; i < 48; i++) {
- maingamepal[i] >>= 2;
+void DreamGenContext::commandonly(uint8 command) {
+ deltextline();
+ uint16 index = command * 2;
+ uint16 offset = kTextstart + segRef(data.word(kCommandtext)).word(index);
+ uint16 y = data.word(kTextaddressy);
+ const uint8 *string = segRef(data.word(kCommandtext)).ptr(offset, 0);
+ printdirect(&string, data.word(kTextaddressx), &y, data.byte(kTextlen), (bool)(data.byte(kTextlen) & 1));
+ data.byte(kNewtextline) = 1;
+}
+
+void DreamGenContext::checkifperson() {
+ flags._z = !checkifperson(al, ah);
+}
+
+bool DreamGenContext::checkifperson(uint8 x, uint8 y) {
+ People *people = (People *)segRef(data.word(kBuffers)).ptr(kPeoplelist, 0);
+
+ for (size_t i = 0; i < 12; ++i, ++people) {
+ if (people->b4 == 255)
+ continue;
+ data.word(kReelpointer) = people->reelPointer();
+ Reel *reel = getreelstart();
+ if (reel->frame() == 0xffff)
+ ++reel;
+ const Frame *frame = getreelframeax(reel->frame());
+ uint8 xmin = reel->x + frame->x;
+ uint8 ymin = reel->y + frame->y;
+ uint8 xmax = xmin + frame->width;
+ uint8 ymax = ymin + frame->height;
+ if (x < xmin)
+ continue;
+ if (y < ymin)
+ continue;
+ if (x >= xmax)
+ continue;
+ if (y >= ymax)
+ continue;
+ data.word(kPersondata) = people->routinePointer();
+ obname(people->b4, 5);
+ return true;
}
+ return false;
+}
- // Decode the image data.
+void DreamGenContext::checkiffree() {
+ flags._z = !checkiffree(al, ah);
+}
- Graphics::Surface *s = g_system->lockScreen();
- Common::Rect rect(640, 480);
+bool DreamGenContext::checkiffree(uint8 x, uint8 y) {
+ const ObjPos *freeList = (const ObjPos *)segRef(data.word(kBuffers)).ptr(kFreelist, 80 * sizeof(ObjPos));
+ for (size_t i = 0; i < 80; ++i) {
+ const ObjPos *objPos = freeList + 79 - i;
+ if (objPos->index == 0xff)
+ continue;
+ if (x < objPos->xMin)
+ continue;
+ if (x >= objPos->xMax)
+ continue;
+ if (y < objPos->yMin)
+ continue;
+ if (y >= objPos->yMax)
+ continue;
+ obname(objPos->index, 2);
+ return true;
+ }
+ return false;
+}
- s->fillRect(rect, 0);
- pcxFile.seek(128, SEEK_SET);
+void DreamGenContext::checkifex() {
+ flags._z = !checkifex(al, ah);
+}
- for (int y = 0; y < 480; y++) {
- byte *dst = (byte *)s->getBasePtr(0, y);
- int decoded = 0;
+bool DreamGenContext::checkifex(uint8 x, uint8 y) {
+ const ObjPos *exList = (const ObjPos *)segRef(data.word(kBuffers)).ptr(kExlist, 100 * sizeof(ObjPos));
+ for (size_t i = 0; i < 100; ++i) {
+ const ObjPos *objPos = exList + 99 - i;
+ if (objPos->index == 0xff)
+ continue;
+ if (x < objPos->xMin)
+ continue;
+ if (x >= objPos->xMax)
+ continue;
+ if (y < objPos->yMin)
+ continue;
+ if (y >= objPos->yMax)
+ continue;
+ obname(objPos->index, 4);
+ return true;
+ }
+ return false;
+}
+
+const uint8 *DreamGenContext::findobname(uint8 type, uint8 index) {
+ if (type == 5) {
+ uint16 i = 64 * 2 * (index & 127);
+ uint16 offset = segRef(data.word(kPeople)).word(kPersontxtdat + i) + kPersontext;
+ return segRef(data.word(kPeople)).ptr(offset, 0);
+ } else if (type == 4) {
+ uint16 offset = segRef(data.word(kExtras)).word(kExtextdat + index * 2) + kExtext;
+ return segRef(data.word(kExtras)).ptr(offset, 0);
+ } else if (type == 2) {
+ uint16 offset = segRef(data.word(kFreedesc)).word(kFreetextdat + index * 2) + kFreetext;
+ return segRef(data.word(kFreedesc)).ptr(offset, 0);
+ } else if (type == 1) {
+ uint16 offset = segRef(data.word(kSetdesc)).word(kSettextdat + index * 2) + kSettext;
+ return segRef(data.word(kSetdesc)).ptr(offset, 0);
+ } else {
+ uint16 offset = segRef(data.word(kBlockdesc)).word(kBlocktextdat + index * 2) + kBlocktext;
+ return segRef(data.word(kBlockdesc)).ptr(offset, 0);
+ }
+}
+
+void DreamGenContext::copyname() {
+ copyname(ah, al, cs.ptr(di, 0));
+}
+
+void DreamGenContext::copyname(uint8 type, uint8 index, uint8 *dst) {
+ const uint8 *src = findobname(type, index);
+ size_t i;
+ for (i = 0; i < 28; ++i) {
+ char c = src[i];
+ if (c == ':')
+ break;
+ if (c == 0)
+ break;
+ dst[i] = c;
+ }
+ dst[i] = 0;
+}
+
+void DreamGenContext::commandwithob() {
+ commandwithob(al, bh, bl);
+}
+
+void DreamGenContext::commandwithob(uint8 command, uint8 type, uint8 index) {
+ uint8 commandLine[64] = "OBJECT NAME ONE ";
+ deltextline();
+ uint16 commandText = kTextstart + segRef(data.word(kCommandtext)).word(command * 2);
+ uint8 textLen = data.byte(kTextlen);
+ {
+ const uint8 *string = segRef(data.word(kCommandtext)).ptr(commandText, 0);
+ printdirect(string, data.word(kTextaddressx), data.word(kTextaddressy), textLen, (bool)(textLen & 1));
+ }
+ copyname(type, index, commandLine);
+ uint16 x = data.word(kLastxpos);
+ if (command != 0)
+ x += 5;
+ printdirect(commandLine, x, data.word(kTextaddressy), textLen, (bool)(textLen & 1));
+ data.byte(kNewtextline) = 1;
+}
+
+void DreamGenContext::examineobtext() {
+ commandwithob(1, data.byte(kCommandtype), data.byte(kCommand));
+}
- while (decoded < 320) {
- byte col = pcxFile.readByte();
- byte len;
+void DreamGenContext::showpanel() {
+ Frame *frame = (Frame *)segRef(data.word(kIcons1)).ptr(0, sizeof(Frame));
+ showframe(frame, 72, 0, 19, 0);
+ showframe(frame, 192, 0, 19, 0);
+}
- if ((col & 0xc0) == 0xc0) {
- len = col & 0x3f;
- col = pcxFile.readByte();
+void DreamGenContext::blocknametext() {
+ commandwithob(0, data.byte(kCommandtype), data.byte(kCommand));
+}
+
+void DreamGenContext::personnametext() {
+ commandwithob(2, data.byte(kCommandtype), data.byte(kCommand) & 127);
+}
+
+void DreamGenContext::walktotext() {
+ commandwithob(3, data.byte(kCommandtype), data.byte(kCommand));
+}
+
+void DreamGenContext::findormake() {
+ uint8 b0 = al;
+ uint8 b2 = cl;
+ uint8 b3 = ch;
+ findormake(b0, b2, b3);
+}
+
+void DreamGenContext::findormake(uint8 index, uint8 value, uint8 type) {
+ Change *change = (Change *)segRef(data.word(kBuffers)).ptr(kListofchanges, sizeof(Change));
+ while (true) {
+ if (change->index == 0xff) {
+ change->index = index;
+ change->location = data.byte(kReallocation);
+ change->value = value;
+ change->type = type;
+ return;
+ }
+ if ((index == change->index) && (data.byte(kReallocation) == change->location) && (type == change->type)) {
+ change->value = value;
+ return;
+ }
+ ++change;
+ }
+}
+
+void DreamGenContext::setallchanges() {
+ Change *change = (Change *)segRef(data.word(kBuffers)).ptr(kListofchanges, sizeof(Change));
+ while (change->index != 0xff) {
+ if (change->location == data.byte(kReallocation))
+ dochange(change->index, change->value, change->type);
+ ++change;
+ }
+}
+
+DynObject *DreamGenContext::getfreead(uint8 index) {
+ return (DynObject *)segRef(data.word(kFreedat)).ptr(0, 0) + index;
+}
+
+DynObject *DreamGenContext::getexad(uint8 index) {
+ return (DynObject *)segRef(data.word(kExtras)).ptr(kExdata, 0) + index;
+}
+
+DynObject *DreamGenContext::geteitheradCPP() {
+ if (data.byte(kObjecttype) == 4)
+ return getexad(data.byte(kItemframe));
+ else
+ return getfreead(data.byte(kItemframe));
+}
+
+void *DreamGenContext::getanyad(uint8 *value1, uint8 *value2) {
+ if (data.byte(kObjecttype) == 4) {
+ DynObject *exObject = getexad(data.byte(kCommand));
+ *value1 = exObject->b7;
+ *value2 = exObject->b8;
+ return exObject;
+ } else if (data.byte(kObjecttype) == 2) {
+ DynObject *freeObject = getfreead(data.byte(kCommand));
+ *value1 = freeObject->b7;
+ *value2 = freeObject->b8;
+ return freeObject;
+ } else {
+ SetObject *setObject = getsetad(data.byte(kCommand));
+ *value1 = setObject->b4;
+ *value2 = setObject->priority;
+ return setObject;
+ }
+}
+
+void *DreamGenContext::getanyaddir(uint8 index, uint8 flag) {
+ if (flag == 4)
+ return getexad(index);
+ else if (flag == 2)
+ return getfreead(index);
+ else
+ return getsetad(index);
+}
+
+SetObject *DreamGenContext::getsetad(uint8 index) {
+ return (SetObject *)segRef(data.word(kSetdat)).ptr(0, 0) + index;
+}
+
+void DreamGenContext::dochange() {
+ dochange(al, cl, ch);
+}
+
+void DreamGenContext::dochange(uint8 index, uint8 value, uint8 type) {
+ if (type == 0) { //object
+ getsetad(index)->mapad[0] = value;
+ } else if (type == 1) { //freeobject
+ DynObject *freeObject = getfreead(index);
+ if (freeObject->mapad[0] == 0xff)
+ freeObject->mapad[0] = value;
+ } else { //path
+ bx = kPathdata + (type - 100) * 144 + index * 8;
+ es = data.word(kReels);
+ es.byte(bx+6) = value;
+ }
+}
+
+void DreamGenContext::deletetaken() {
+ const DynObject *extraObjects = (const DynObject *)segRef(data.word(kExtras)).ptr(kExdata, 0);
+ DynObject *freeObjects = (DynObject *)segRef(data.word(kFreedat)).ptr(0, 0);
+ for(size_t i = 0; i < kNumexobjects; ++i) {
+ uint8 location = extraObjects[i].initialLocation;
+ if (location == data.byte(kReallocation)) {
+ uint8 index = extraObjects[i].index;
+ freeObjects[index].mapad[0] = 0xfe;
+ }
+ }
+}
+
+void DreamGenContext::getexpos() {
+ es = data.word(kExtras);
+ const DynObject *objects = (const DynObject *)segRef(data.word(kExtras)).ptr(kExdata, sizeof(DynObject));
+ for (size_t i = 0; i < kNumexobjects; ++i) {
+ if (objects[i].mapad[0] == 0xff) {
+ data.byte(kExpos) = i;
+ di = kExdata + i * sizeof(DynObject);
+ return;
+ }
+ }
+ data.byte(kExpos) = kNumexobjects;
+ di = kExdata + kNumexobjects * sizeof(DynObject);
+}
+
+void DreamGenContext::placesetobject() {
+ placesetobject(al);
+}
+
+void DreamGenContext::placesetobject(uint8 index) {
+ findormake(index, 0, 0);
+ getsetad(index)->mapad[0] = 0;
+}
+
+void DreamGenContext::removesetobject() {
+ removesetobject(al);
+}
+
+void DreamGenContext::removesetobject(uint8 index) {
+ findormake(index, 0xff, 0);
+ getsetad(index)->mapad[0] = 0xff;
+}
+
+void DreamGenContext::finishedwalking() {
+ flags._z = finishedwalkingCPP();
+}
+
+bool DreamGenContext::finishedwalkingCPP() {
+ return (data.byte(kLinepointer) == 254) && (data.byte(kFacing) == data.byte(kTurntoface));
+}
+
+void DreamGenContext::getflagunderp() {
+ uint8 flag, flagEx;
+ getflagunderp(&flag, &flagEx);
+ cl = flag;
+ ch = flagEx;
+}
+
+void DreamGenContext::getflagunderp(uint8 *flag, uint8 *flagEx) {
+ uint8 type, flagX, flagY;
+ checkone(data.word(kMousex) - data.word(kMapadx), data.word(kMousey) - data.word(kMapady), flag, flagEx, &type, &flagX, &flagY);
+ cl = data.byte(kLastflag) = *flag;
+ ch = data.byte(kLastflagex) = *flagEx;
+}
+
+void DreamGenContext::walkandexamine() {
+ if (! finishedwalkingCPP())
+ return;
+ data.byte(kCommandtype) = data.byte(kWalkexamtype);
+ data.byte(kCommand) = data.byte(kWalkexamnum);
+ data.byte(kWalkandexam) = 0;
+ if (data.byte(kCommandtype) != 5)
+ examineob();
+}
+
+void DreamGenContext::obname() {
+ obname(al, ah);
+}
+
+void DreamGenContext::obname(uint8 command, uint8 commandType) {
+ if (data.byte(kReasseschanges) == 0) {
+ if ((commandType == data.byte(kCommandtype)) && (command == data.byte(kCommand))) {
+ if (data.byte(kWalkandexam) == 1) {
+ walkandexamine();
+ return;
+ } else if (data.word(kMousebutton) == 0)
+ return;
+ else if ((data.byte(kCommandtype) == 3) && (data.byte(kLastflag) < 2))
+ return;
+ else if ((data.byte(kManspath) != data.byte(kPointerspath)) || (data.byte(kCommandtype) == 3)) {
+ setwalk();
+ data.byte(kReasseschanges) = 1;
+ return;
+ } else if (! finishedwalkingCPP())
+ return;
+ else if (data.byte(kCommandtype) == 5) {
+ if (data.word(kWatchingtime) == 0)
+ talk();
+ return;
} else {
- len = 1;
+ if (data.word(kWatchingtime) == 0)
+ examineob();
+ return;
}
+ }
+ } else
+ data.byte(kReasseschanges) = 0;
- // The image uses 16 colors and is stored as four bit
- // planes, one for each bit of the color, least
- // significant bit plane first.
+ data.byte(kCommand) = command;
+ data.byte(kCommandtype) = commandType;
+ if ((data.byte(kLinepointer) != 254) || (data.word(kWatchingtime) != 0) || (data.byte(kFacing) != data.byte(kTurntoface))) {
+ blocknametext();
+ return;
+ } else if (data.byte(kCommandtype) != 3) {
+ if (data.byte(kManspath) != data.byte(kPointerspath)) {
+ walktotext();
+ return;
+ } else if (data.byte(kCommandtype) == 3) {
+ blocknametext();
+ return;
+ } else if (data.byte(kCommandtype) == 5) {
+ personnametext();
+ return;
+ } else {
+ examineobtext();
+ return;
+ }
+ }
+ if (data.byte(kManspath) == data.byte(kPointerspath)) {
+ uint8 flag, flagEx, type, flagX, flagY;
+ checkone(data.byte(kRyanx) + 12, data.byte(kRyany) + 12, &flag, &flagEx, &type, &flagX, &flagY);
+ if (flag < 2) {
+ blocknametext();
+ return;
+ }
+ }
- for (i = 0; i < len; i++) {
- int plane = decoded / 80;
- int pos = decoded % 80;
+ getflagunderp();
+ if (data.byte(kLastflag) < 2) {
+ blocknametext();
+ return;
+ } else if (data.byte(kLastflag) >= 128) {
+ blocknametext();
+ return;
+ } else {
+ walktotext();
+ return;
+ }
+}
- for (j = 0; j < 8; j++) {
- byte bit = (col >> (7 - j)) & 1;
- dst[8 * pos + j] |= (bit << plane);
- }
+void DreamGenContext::delpointer() {
+ if (data.word(kOldpointerx) == 0xffff)
+ return;
+ data.word(kDelherex) = data.word(kOldpointerx);
+ data.word(kDelherey) = data.word(kOldpointery);
+ data.byte(kDelxs) = data.byte(kPointerxs);
+ data.byte(kDelys) = data.byte(kPointerys);
+ multiput(segRef(data.word(kBuffers)).ptr(kPointerback, 0), data.word(kDelherex), data.word(kDelherey), data.byte(kPointerxs), data.byte(kPointerys));
+}
+
+void DreamGenContext::showblink() {
+ if (data.byte(kManisoffscreen) == 1)
+ return;
+ ++data.byte(kBlinkcount);
+ if (data.byte(kShadeson) != 0)
+ return;
+ if (data.byte(kReallocation) >= 50) // eyesshut
+ return;
+ if (data.byte(kBlinkcount) != 3)
+ return;
+ data.byte(kBlinkcount) = 0;
+ uint8 blinkFrame = data.byte(kBlinkframe);
+ ++blinkFrame; // Implicit %256
+ data.byte(kBlinkframe) = blinkFrame;
+ if (blinkFrame > 6)
+ blinkFrame = 6;
+ static const uint8 blinkTab[] = { 16,18,18,17,16,16,16 };
+ uint8 width, height;
+ showframe((Frame *)segRef(data.word(kIcons1)).ptr(0, 0), 44, 32, blinkTab[blinkFrame], 0, &width, &height);
+}
+
+void DreamGenContext::dumpblink() {
+ if (data.byte(kShadeson) != 0)
+ return;
+ if (data.byte(kBlinkcount) != 0)
+ return;
+ if (data.byte(kBlinkframe) >= 6)
+ return;
+ multidump(44, 32, 16, 12);
+}
- decoded++;
+void DreamGenContext::dumppointer() {
+ dumpblink();
+ multidump(data.word(kDelherex), data.word(kDelherey), data.byte(kDelxs), data.byte(kDelys));
+ if ((data.word(kOldpointerx) != data.word(kDelherex)) || (data.word(kOldpointery) != data.word(kDelherey)))
+ multidump(data.word(kOldpointerx), data.word(kOldpointery), data.byte(kPointerxs), data.byte(kPointerys));
+}
+
+void DreamGenContext::checkcoords() {
+ checkcoords((const RectWithCallback *)cs.ptr(bx, 0));
+}
+
+void DreamGenContext::checkcoords(const RectWithCallback *rectWithCallbacks) {
+ if (data.byte(kNewlocation) != 0xff)
+ return;
+
+ const RectWithCallback *rectWithCallback = rectWithCallbacks;
+ while (rectWithCallback->xMin() != 0xffff) {
+ if (rectWithCallback->contains(data.word(kMousex), data.word(kMousey))) {
+ uint16 callback = rectWithCallback->callback();
+
+ // common
+ if(callback == addr_blank)
+ blank();
+ else if(callback == addr_getbackfromob)
+ getbackfromob();
+ else if(callback == addr_incryanpage)
+ incryanpage();
+ else if(callback == addr_getback1)
+ getback1();
+ else if(callback == addr_quitkey)
+ quitkey();
+ else if(callback == addr_dosreturn)
+ dosreturn();
+ else if(callback == addr_getbacktoops)
+ getbacktoops();
+ else if(callback == addr_selectslot)
+ selectslot();
+ // examlist
+ else if(callback == addr_useobject)
+ useobject();
+ else if(callback == addr_selectopenob)
+ selectopenob();
+ else if(callback == addr_setpickup)
+ setpickup();
+ else if(callback == addr_examinventory)
+ examinventory();
+ // invlist1
+ else if(callback == addr_dropobject)
+ dropobject();
+ else if(callback == addr_useopened)
+ useopened();
+ else if(callback == addr_setpickup)
+ setpickup();
+ else if(callback == addr_intoinv)
+ intoinv();
+ // withlist1
+ else if(callback == addr_selectob)
+ selectob();
+ // talklist
+ else if(callback == addr_moretalk)
+ moretalk();
+ // quitlist
+ // destlist
+ else if(callback == addr_nextdest)
+ nextdest();
+ else if(callback == addr_lastdest)
+ lastdest();
+ else if(callback == addr_lookatplace)
+ lookatplace();
+ else if(callback == addr_destselect)
+ destselect();
+ // keypadlist
+ else if(callback == addr_buttonone)
+ buttonone();
+ else if(callback == addr_buttontwo)
+ buttontwo();
+ else if(callback == addr_buttonthree)
+ buttonthree();
+ else if(callback == addr_buttonfour)
+ buttonfour();
+ else if(callback == addr_buttonfive)
+ buttonfive();
+ else if(callback == addr_buttonsix)
+ buttonsix();
+ else if(callback == addr_buttonseven)
+ buttonseven();
+ else if(callback == addr_buttoneight)
+ buttoneight();
+ else if(callback == addr_buttonnine)
+ buttonnine();
+ else if(callback == addr_buttonnought)
+ buttonnought();
+ else if(callback == addr_buttonenter)
+ buttonenter();
+ // menulist
+ // folderlist
+ else if(callback == addr_nextfolder)
+ nextfolder();
+ else if(callback == addr_lastfolder)
+ lastfolder();
+ // symbollist
+ else if(callback == addr_quitsymbol)
+ quitsymbol();
+ else if(callback == addr_settopleft)
+ settopleft();
+ else if(callback == addr_settopright)
+ settopright();
+ else if(callback == addr_setbotleft)
+ setbotleft();
+ else if(callback == addr_setbotright)
+ setbotright();
+ // diarylist
+ else if(callback == addr_diarykeyn)
+ diarykeyn();
+ else if(callback == addr_diarykeyp)
+ diarykeyp();
+ else if(callback == addr_quitkey)
+ quitkey();
+ // opslist
+ else if(callback == addr_getbackfromops)
+ getbackfromops();
+ else if(callback == addr_discops)
+ discops();
+ // discopslist
+ else if(callback == addr_loadgame)
+ loadgame();
+ else if(callback == addr_savegame)
+ savegame();
+ // mainlist, mainlist2
+ else if(callback == addr_look)
+ look();
+ else if(callback == addr_inventory)
+ inventory();
+ else if(callback == addr_zoomonoff)
+ zoomonoff();
+ else if(callback == addr_saveload)
+ saveload();
+ else if(callback == addr_madmanrun)
+ madmanrun();
+ else if(callback == addr_identifyob)
+ identifyob();
+ // decidelist
+ else if(callback == addr_newgame)
+ newgame();
+ else if(callback == addr_loadold)
+ loadold();
+ // loadlist
+ else if(callback == addr_actualload)
+ actualload();
+ // savelist
+ else if(callback == addr_actualsave)
+ actualsave();
+ else {
+ debug("__dispatch_call remaining in checkcoords! %d", (int)callback);
+ __dispatch_call(callback);
}
+ return;
}
+ ++rectWithCallback;
}
-
- g_system->unlockScreen();
- pcxFile.close();
}
-void DreamGenContext::frameoutv() {
- uint16 pitch = dx;
- uint16 width = cx & 0xff;
- uint16 height = cx >> 8;
- uint16 stride = pitch - width;
+void DreamGenContext::showpointer() {
+ showblink();
+ const Frame *icons1 = ((const Frame *)segRef(data.word(kIcons1)).ptr(0, 0));
+ uint16 x = data.word(kMousex);
+ data.word(kOldpointerx) = data.word(kMousex);
+ uint16 y = data.word(kMousey);
+ data.word(kOldpointery) = data.word(kMousey);
+ if (data.byte(kPickup) == 1) {
+ const Frame *frames;
+ if (data.byte(kObjecttype) != 4)
+ frames = (const Frame *)segRef(data.word(kFreeframes)).ptr(0, 0);
+ else
+ frames = (const Frame *)segRef(data.word(kExtras)).ptr(0, 0);
+ const Frame *frame = frames + (3 * data.byte(kItemframe) + 1);
+ uint8 width = frame->width;
+ uint8 height = frame->height;
+ if (width < 12)
+ width = 12;
+ if (height < 12)
+ height = 12;
+ data.byte(kPointerxs) = width;
+ data.byte(kPointerys) = height;
+ uint16 xMin = (x >= width / 2) ? x - width / 2 : 0;
+ uint16 yMin = (y >= height / 2) ? y - height / 2 : 0;
+ data.word(kOldpointerx) = xMin;
+ data.word(kOldpointery) = yMin;
+ multiget(segRef(data.word(kBuffers)).ptr(kPointerback, 0), xMin, yMin, width, height);
+ showframe(frames, x, y, 3 * data.byte(kItemframe) + 1, 128);
+ showframe(icons1, x, y, 3, 128);
+ } else {
+ const Frame *frame = icons1 + (data.byte(kPointerframe) + 20);
+ uint8 width = frame->width;
+ uint8 height = frame->height;
+ if (width < 12)
+ width = 12;
+ if (height < 12)
+ height = 12;
+ data.byte(kPointerxs) = width;
+ data.byte(kPointerys) = height;
+ multiget(segRef(data.word(kBuffers)).ptr(kPointerback, 0), x, y, width, height);
+ showframe(icons1, x, y, data.byte(kPointerframe) + 20, 0);
+ }
+}
- const uint8* src = ds.ptr(si, width * height);
- uint8* base = es.ptr(di, stride * height);
- uint8* dst = base + pitch * bx;
+void DreamGenContext::animpointer() {
- // NB: Original code assumes non-zero width and height, "for" are unneeded, do-while would suffice but would be less readable
- for (uint16 y = 0; y < height; ++y) {
- for (uint16 x = 0; x < width; ++x) {
- uint8 pixel = *src++;
- if (pixel)
- *dst = pixel;
- ++dst;
+ if (data.byte(kPointermode) == 2) {
+ data.byte(kPointerframe) = 0;
+ if ((data.byte(kReallocation) == 14) && (data.byte(kCommandtype) == 211))
+ data.byte(kPointerframe) = 5;
+ return;
+ } else if (data.byte(kPointermode) == 3) {
+ if (data.byte(kPointerspeed) != 0) {
+ --data.byte(kPointerspeed);
+ } else {
+ data.byte(kPointerspeed) = 5;
+ ++data.byte(kPointercount);
+ if (data.byte(kPointercount) == 16)
+ data.byte(kPointercount) = 0;
}
- dst += stride;
+ static const uint8 flashMouseTab[] = { 1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2 };
+ data.byte(kPointerframe) = flashMouseTab[data.byte(kPointercount)];
+ return;
+ }
+ if (data.word(kWatchingtime) != 0) {
+ data.byte(kPointerframe) = 11;
+ return;
+ }
+ data.byte(kPointerframe) = 0;
+ if (data.byte(kInmaparea) == 0)
+ return;
+ if (data.byte(kPointerfirstpath) == 0)
+ return;
+ uint8 flag, flagEx;
+ getflagunderp(&flag, &flagEx);
+ if (flag < 2)
+ return;
+ if (flag >= 128)
+ return;
+ if (flag & 4) {
+ data.byte(kPointerframe) = 3;
+ return;
+ }
+ if (flag & 16) {
+ data.byte(kPointerframe) = 4;
+ return;
+ }
+ if (flag & 2) {
+ data.byte(kPointerframe) = 5;
+ return;
+ }
+ if (flag & 8) {
+ data.byte(kPointerframe) = 6;
+ return;
+ }
+ data.byte(kPointerframe) = 8;
+}
+
+void DreamGenContext::printmessage() {
+ printmessage(di, bx, al, dl, (bool)(dl & 1));
+}
+
+void DreamGenContext::printmessage(uint16 x, uint16 y, uint8 index, uint8 maxWidth, bool centered) {
+ uint16 offset = kTextstart + segRef(data.word(kCommandtext)).word(index * 2);
+ const uint8 *string = segRef(data.word(kCommandtext)).ptr(offset, 0);
+ printdirect(&string, x, &y, maxWidth, centered);
+}
+
+void DreamGenContext::compare() {
+ char id[4] = { cl, ch, dl, dh };
+ flags._z = compare(al, ah, id);
+}
+
+bool DreamGenContext::compare(uint8 index, uint8 flag, const char id[4]) {
+ void *ptr = getanyaddir(index, flag);
+ const char *objId = (const char *)(((const uint8 *)ptr) + 12); // whether it is a DynObject or a SetObject
+ for (size_t i = 0; i < 4; ++i) {
+ if(id[i] != objId[i] + 'A')
+ return false;
+ }
+ return true;
+}
+
+bool DreamGenContext::isitdescribed(const ObjPos *pos) {
+ uint16 offset = segRef(data.word(kSetdesc)).word(kSettextdat + pos->index * 2);
+ uint8 result = segRef(data.word(kSetdesc)).byte(kSettext + offset);
+ return result != 0;
+}
+
+bool DreamGenContext::isCD() {
+ // The original sources has two codepaths depending if the game is 'if cd' or not
+ // This is a hack to guess which version to use with the assumption that if we have a cd version
+ // we managed to load the speech. At least it is isolated in this function and can be changed.
+ // Maybe detect the version during game id?
+ return (data.byte(kSpeechloaded) == 1);
+}
+
+void DreamGenContext::checkifset() {
+ flags._z = !checkifset(al, ah);
+}
+
+bool DreamGenContext::checkifset(uint8 x, uint8 y) {
+ const ObjPos *setList = (const ObjPos *)segRef(data.word(kBuffers)).ptr(kSetlist, sizeof(ObjPos) * 128);
+ for (size_t i = 0; i < 128; ++i) {
+ const ObjPos *pos = setList + 127 - i;
+ if (pos->index == 0xff)
+ continue;
+ if (x < pos->xMin)
+ continue;
+ if (x >= pos->xMax)
+ continue;
+ if (y < pos->yMin)
+ continue;
+ if (y >= pos->yMax)
+ continue;
+ if (! pixelcheckset(pos, x, y))
+ continue;
+ if (! isitdescribed(pos))
+ continue;
+ obname(pos->index, 1);
+ return true;
}
+ return false;
+}
+
+void DreamGenContext::showryanpage() {
+ Frame *icons1 = (Frame *)segRef(data.word(kIcons1)).ptr(0, 0);
+ showframe(icons1, kInventx + 167, kInventy - 12, 12, 0);
+ showframe(icons1, kInventx + 167 + 18 * data.byte(kRyanpage), kInventy - 12, 13 + data.byte(kRyanpage), 0);
+}
+
+void DreamGenContext::findallryan() {
+ findallryan(es.ptr(di, 60));
+}
+
+void DreamGenContext::findallryan(uint8 *inv) {
+ memset(inv, 0xff, 60);
+ for (size_t i = 0; i < kNumexobjects; ++i) {
+ DynObject *extra = getexad(i);
+ if (extra->mapad[0] != 4)
+ continue;
+ if (extra->mapad[1] != 0xff)
+ continue;
+ uint8 slot = extra->mapad[2];
+ assert(slot < 30);
+ inv[2 * slot + 0] = i;
+ inv[2 * slot + 1] = 4;
+ }
+}
+
+void DreamGenContext::hangon() {
+ hangon(cx);
+}
+
+void DreamGenContext::hangon(uint16 frameCount) {
+ while (frameCount) {
+ vsync();
+ --frameCount;
+ if (data.byte(kQuitrequested))
+ break;
+ }
+}
+
+void DreamGenContext::hangonp() {
+ hangonp(cx);
+}
+
+void DreamGenContext::hangonp(uint16 count) {
+ data.word(kMaintimer) = 0;
+ uint8 pointerFrame = data.byte(kPointerframe);
+ uint8 pickup = data.byte(kPickup);
+ data.byte(kPointermode) = 3;
+ data.byte(kPickup) = 0;
+ data.byte(kCommandtype) = 255;
+ readmouse();
+ animpointer();
+ showpointer();
+ vsync();
+ dumppointer();
+ uint32 counter = count; // silence a signed/unsigned MSVC warning below
+ for (uint32 i = 0; i < counter * 3; ++i) {
+ delpointer();
+ readmouse();
+ animpointer();
+ showpointer();
+ vsync();
+ dumppointer();
+ if (data.byte(kQuitrequested))
+ break;
+ if (data.word(kMousebutton) == 0)
+ continue;
+ if (data.word(kMousebutton) != data.word(kOldbutton))
+ break;
+ }
+
+ delpointer();
+ data.byte(kPointerframe) = pointerFrame;
+ data.byte(kPickup) = pickup;
+ data.byte(kPointermode) = 0;
+}
+
+void DreamGenContext::findnextcolon() {
+ uint8 *initialString = es.ptr(si, 0);
+ uint8 *string = initialString;
+ al = findnextcolon(&string);
+ si += (string - initialString);
+}
+
+uint8 DreamGenContext::findnextcolon(uint8 **string) {
+ uint8 c;
+ do {
+ c = **string;
+ ++(*string);
+ } while ((c != 0) && (c != ':'));
+ return c;
+}
+
+uint8 *DreamGenContext::getobtextstartCPP() {
+ push(es);
+ push(si);
+ getobtextstart();
+ uint8 *result = es.ptr(si, 0);
+ si = pop();
+ es = pop();
+ return result;
+}
+
+void DreamGenContext::zoomonoff() {
+ if (data.word(kWatchingtime) != 0) {
+ blank();
+ return;
+ }
+ if (data.byte(kPointermode) == 2) {
+ blank();
+ return;
+ }
+ if (data.byte(kCommandtype) != 222) {
+ data.byte(kCommandtype) = 222;
+ commandonly(39);
+ }
+ if (data.word(kMousebutton) == data.word(kOldbutton))
+ return;
+ if ((data.word(kMousebutton) & 1) == 0)
+ return;
+ data.byte(kZoomon) ^= 1;
+ createpanel();
+ data.byte(kNewobs) = 0;
+ drawfloor();
+ printsprites();
+ reelsonscreen();
+ showicon();
+ getunderzoom();
+ undertextline();
+ commandonly(39);
+ readmouse();
+ worktoscreenm();
}
} /*namespace dreamgen */
+
diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h
new file mode 100644
index 0000000000..ac7e1a5b91
--- /dev/null
+++ b/engines/dreamweb/stubs.h
@@ -0,0 +1,249 @@
+/* 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.
+ *
+ */
+ uint16 allocatemem(uint16 paragraphs);
+ uint8 *workspace();
+ void allocatework();
+ void clearwork();
+ void multidump();
+ void multidump(uint16 x, uint16 y, uint8 width, uint8 height);
+ void frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, int16 x, int16 y);
+ void frameoutnm(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
+ void frameoutbh(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
+ void frameoutfx(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
+ void worktoscreen();
+ void multiget();
+ void multiget(uint8 *dst, uint16 x, uint16 y, uint8 width, uint8 height);
+ void convertkey();
+ void cls();
+ void printsprites();
+ void quickquit();
+ void readoneblock();
+ void printundermon();
+ void seecommandtail();
+ void randomnumber();
+ void quickquit2();
+ uint8 getnextword(const Frame *charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount);
+ void printboth(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar);
+ void printchar();
+ void printchar(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height);
+ void printdirect();
+ void printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered);
+ void printdirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered);
+ void printmessage(uint16 x, uint16 y, uint8 index, uint8 maxWidth, bool centered);
+ void printmessage();
+ void usetimedtext();
+ void dumptimedtext();
+ void setuptimedtemp();
+ void setuptimedtemp(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount);
+ void getundertimed();
+ void putundertimed();
+ uint8 printslow(const uint8 *string, uint16 x, uint16 y, uint8 maxWidth, bool centered);
+ void printslow();
+ void dumptextline();
+ void getnumber();
+ uint8 getnumber(const Frame *charSet, const uint8 *string, uint16 maxWidth, bool centered, uint16 *offset);
+ uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width);
+ void getroomdata();
+ void readheader();
+ void fillspace();
+ void startloading();
+ void startloading(const Room *room);
+ Sprite *spritetable();
+ void showframe();
+ void showframe(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height);
+ void showframe(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag);
+ void printasprite(const Sprite *sprite);
+ void width160();
+ void multiput(const uint8 *src, uint16 x, uint16 y, uint8 width, uint8 height);
+ void multiput();
+ void eraseoldobs();
+ void clearsprites();
+ Sprite *makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi);
+ void spriteupdate();
+ void initman();
+ void mainman(Sprite *sprite);
+ void facerightway();
+ void walking(Sprite *sprite);
+ void autosetwalk();
+ void checkdest(const RoomPaths *roomsPaths);
+ void aboutturn(Sprite *sprite);
+ void backobject(Sprite *sprite);
+ void constant(Sprite *sprite, SetObject *objData);
+ void steady(Sprite *sprite, SetObject *objData);
+ void random(Sprite *sprite, SetObject *objData);
+ void dodoor();
+ void dodoor(Sprite *sprite, SetObject *objData);
+ void doorway(Sprite *sprite, SetObject *objData);
+ void widedoor(Sprite *sprite, SetObject *objData);
+ void lockeddoorway(Sprite *sprite, SetObject *objData);
+ void liftsprite(Sprite *sprite, SetObject *objData);
+ void findsource();
+ Frame *findsourceCPP();
+ void showgamereel();
+ void showgamereel(ReelRoutine *routine);
+ void showreelframe();
+ void showreelframe(Reel *reel);
+ const Frame *getreelframeax(uint16 frame);
+ void turnpathon(uint8 param);
+ void turnpathoff(uint8 param);
+ void turnpathon();
+ void turnpathoff();
+ void turnanypathon(uint8 param, uint8 room);
+ void turnanypathoff(uint8 param, uint8 room);
+ void turnanypathon();
+ void turnanypathoff();
+ RoomPaths *getroomspaths();
+ void makebackob(SetObject *objData);
+ void modifychar();
+ void lockmon();
+ void cancelch0();
+ void cancelch1();
+ void plotreel();
+ Reel *getreelstart();
+ void dealwithspecial(uint8 firstParam, uint8 secondParam);
+ void zoom();
+ void crosshair();
+ void showrain();
+ void deltextline();
+ void commandonly();
+ void commandonly(uint8 command);
+ void doblocks();
+ void checkifperson();
+ bool checkifperson(uint8 x, uint8 y);
+ void checkiffree();
+ bool checkiffree(uint8 x, uint8 y);
+ void checkifex();
+ bool checkifex(uint8 x, uint8 y);
+ const uint8 *findobname(uint8 type, uint8 index);
+ void copyname();
+ void copyname(uint8 type, uint8 index, uint8 *dst);
+ void commandwithob();
+ void commandwithob(uint8 command, uint8 type, uint8 index);
+ void showpanel();
+ void updatepeople();
+ void madmantext();
+ void madmode();
+ void movemap(uint8 param);
+ bool addalong(const uint8 *mapFlags);
+ bool addlength(const uint8 *mapFlags);
+ void getdimension();
+ void getdimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize);
+ void getmapad();
+ void calcmapad();
+ uint8 getmapad(const uint8 *setData);
+ uint8 getxad(const uint8 *setData, uint8 *result);
+ uint8 getyad(const uint8 *setData, uint8 *result);
+ void calcfrframe();
+ void calcfrframe(uint8* width, uint8* height);
+ void finalframe();
+ void finalframe(uint16 *x, uint16 *y);
+ void showallobs();
+ void blocknametext();
+ void walktotext();
+ void personnametext();
+ void findxyfrompath();
+ void findormake();
+ void findormake(uint8 index, uint8 value, uint8 type);
+ DynObject *getfreead(uint8 index);
+ DynObject *getexad(uint8 index);
+ DynObject *geteitheradCPP();
+ SetObject *getsetad(uint8 index);
+ void *getanyad(uint8 *value1, uint8 *value2);
+ void *getanyaddir(uint8 index, uint8 flag);
+ void setallchanges();
+ void dochange();
+ void dochange(uint8 index, uint8 value, uint8 type);
+ void deletetaken();
+ bool isCD();
+ void placesetobject();
+ void placesetobject(uint8 index);
+ void removesetobject();
+ void removesetobject(uint8 index);
+ void showallfree();
+ void showallex();
+ bool finishedwalkingCPP();
+ void finishedwalking();
+ void checkone();
+ void checkone(uint8 x, uint8 y, uint8 *flag, uint8 *flagEx, uint8 *type, uint8 *flagX, uint8 *flagY);
+ void getflagunderp();
+ void getflagunderp(uint8 *flag, uint8 *flagEx);
+ void walkandexamine();
+ void obname();
+ void obname(uint8 command, uint8 commandType);
+ void delpointer();
+ void showblink();
+ void dumpblink();
+ void dumppointer();
+ void showpointer();
+ void animpointer();
+ void checkcoords();
+ void checkcoords(const RectWithCallback *rectWithCallbacks);
+ void readmouse();
+ void readmouse1();
+ void readmouse2();
+ void readmouse3();
+ void readmouse4();
+ uint16 waitframes();
+ void drawflags();
+ void addtopeoplelist();
+ void addtopeoplelist(ReelRoutine *routine);
+ void getexpos();
+ void paneltomap();
+ void maptopanel();
+ void dumpmap();
+ void obpicture();
+ void transferinv();
+ void obicons();
+ void compare();
+ bool compare(uint8 index, uint8 flag, const char id[4]);
+ bool pixelcheckset(const ObjPos *pos, uint8 x, uint8 y);
+ bool isitdescribed(const ObjPos *objPos);
+ void checkifset();
+ bool checkifset(uint8 x, uint8 y);
+ void checkifpathison();
+ bool checkifpathison(uint8 index);
+ void isitworn();
+ bool isitworn(const DynObject *object);
+ void wornerror();
+ void makeworn();
+ void makeworn(DynObject *object);
+ void obtoinv();
+ void obtoinv(uint8 index, uint8 flag, uint16 x, uint16 y);
+ void showryanpage();
+ void findallryan();
+ void findallryan(uint8 *inv);
+ void fillryan();
+ void useroutine();
+ void hangon();
+ void hangon(uint16 frameCount);
+ void hangonp();
+ void hangonp(uint16 count);
+ uint8 findnextcolon(uint8 **string);
+ void findnextcolon();
+ uint8 *getobtextstartCPP();
+ void usetext(const uint8 *string);
+ void usetext();
+ void getblockofpixel();
+ uint8 getblockofpixel(uint8 x, uint8 y);
+ void bresenhams();
+ void examineobtext();
+
diff --git a/engines/dreamweb/use.cpp b/engines/dreamweb/use.cpp
new file mode 100644
index 0000000000..d6648b556e
--- /dev/null
+++ b/engines/dreamweb/use.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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamGen {
+
+
+typedef void (DreamGenContext::*UseCallback)(void);
+
+struct UseListEntry {
+ uint8 id[5]; // 0-terminal because it is easier syntatically to initialize the array
+ UseCallback callback;
+};
+
+void DreamGenContext::useroutine() {
+
+ static const UseListEntry kUseList[] = {
+ { "NETW", &DreamGenContext::usemon },
+ { "ELVA", &DreamGenContext::useelevator1 },
+ { "ELVB", &DreamGenContext::useelevator2 },
+ { "ELVC", &DreamGenContext::useelevator3 },
+ { "ELVE", &DreamGenContext::useelevator4 },
+ { "ELVF", &DreamGenContext::useelevator5 },
+ { "CGAT", &DreamGenContext::usechurchgate },
+ { "REMO", &DreamGenContext::usestereo },
+ { "BUTA", &DreamGenContext::usebuttona },
+ { "CBOX", &DreamGenContext::usewinch },
+ { "LITE", &DreamGenContext::uselighter },
+ { "PLAT", &DreamGenContext::useplate },
+ { "LIFT", &DreamGenContext::usecontrol },
+ { "WIRE", &DreamGenContext::usewire },
+ { "HNDL", &DreamGenContext::usehandle },
+ { "HACH", &DreamGenContext::usehatch },
+ { "DOOR", &DreamGenContext::useelvdoor },
+ { "CSHR", &DreamGenContext::usecashcard },
+ { "GUNA", &DreamGenContext::usegun },
+ { "CRAA", &DreamGenContext::usecardreader1 },
+ { "CRBB", &DreamGenContext::usecardreader2 },
+ { "CRCC", &DreamGenContext::usecardreader3 },
+ { "SEAT", &DreamGenContext::sitdowninbar },
+ { "MENU", &DreamGenContext::usemenu },
+ { "COOK", &DreamGenContext::usecooker },
+ { "ELCA", &DreamGenContext::callhotellift },
+ { "EDCA", &DreamGenContext::calledenslift },
+ { "DDCA", &DreamGenContext::calledensdlift },
+ { "ALTR", &DreamGenContext::usealtar },
+ { "LOKA", &DreamGenContext::openhoteldoor },
+ { "LOKB", &DreamGenContext::openhoteldoor2 },
+ { "ENTA", &DreamGenContext::openlouis },
+ { "ENTB", &DreamGenContext::openryan },
+ { "ENTE", &DreamGenContext::openpoolboss },
+ { "ENTC", &DreamGenContext::openyourneighbour },
+ { "ENTD", &DreamGenContext::openeden },
+ { "ENTH", &DreamGenContext::opensarters },
+ { "WWAT", &DreamGenContext::wearwatch },
+ { "POOL", &DreamGenContext::usepoolreader },
+ { "WSHD", &DreamGenContext::wearshades },
+ { "GRAF", &DreamGenContext::grafittidoor },
+ { "TRAP", &DreamGenContext::trapdoor },
+ { "CDPE", &DreamGenContext::edenscdplayer },
+ { "DLOK", &DreamGenContext::opentvdoor },
+ { "HOLE", &DreamGenContext::usehole },
+ { "DRYR", &DreamGenContext::usedryer },
+ { "HOLY", &DreamGenContext::usechurchhole },
+ { "WALL", &DreamGenContext::usewall },
+ { "BOOK", &DreamGenContext::usediary },
+ { "AXED", &DreamGenContext::useaxe },
+ { "SHLD", &DreamGenContext::useshield },
+ { "BCNY", &DreamGenContext::userailing },
+ { "LIDC", &DreamGenContext::usecoveredbox },
+ { "LIDU", &DreamGenContext::useclearbox },
+ { "LIDO", &DreamGenContext::useopenbox },
+ { "PIPE", &DreamGenContext::usepipe },
+ { "BALC", &DreamGenContext::usebalcony },
+ { "WIND", &DreamGenContext::usewindow },
+ { "PAPR", &DreamGenContext::viewfolder },
+ { "UWTA", &DreamGenContext::usetrainer },
+ { "UWTB", &DreamGenContext::usetrainer },
+ { "STAT", &DreamGenContext::entersymbol },
+ { "TLID", &DreamGenContext::opentomb },
+ { "SLAB", &DreamGenContext::useslab },
+ { "CART", &DreamGenContext::usecart },
+ { "FCAR", &DreamGenContext::usefullcart },
+ { "SLBA", &DreamGenContext::slabdoora },
+ { "SLBB", &DreamGenContext::slabdoorb },
+ { "SLBC", &DreamGenContext::slabdoorc },
+ { "SLBD", &DreamGenContext::slabdoord },
+ { "SLBE", &DreamGenContext::slabdoore },
+ { "SLBF", &DreamGenContext::slabdoorf },
+ { "PLIN", &DreamGenContext::useplinth },
+ { "LADD", &DreamGenContext::useladder },
+ { "LADB", &DreamGenContext::useladderb },
+ { "GUMA", &DreamGenContext::chewy },
+ { "SQEE", &DreamGenContext::wheelsound },
+ { "TAPP", &DreamGenContext::runtap },
+ { "GUIT", &DreamGenContext::playguitar },
+ { "CONT", &DreamGenContext::hotelcontrol },
+ { "BELL", &DreamGenContext::hotelbell },
+ };
+
+ if (data.byte(kReallocation) >= 50) {
+ if (data.byte(kPointerpower) == 0)
+ return;
+ data.byte(kPointerpower) = 0;
+ }
+
+ getanyad();
+ const uint8 *id = es.ptr(bx + 12, 4);
+
+ for (size_t i = 0; i < sizeof(kUseList)/sizeof(UseListEntry); ++i) {
+ const UseListEntry &entry = kUseList[i];
+ if (('A' + id[0] == entry.id[0]) && ('A' + id[1] == entry.id[1]) && ('A' + id[2] == entry.id[2]) && ('A' + id[3] == entry.id[3])) {
+ (this->*entry.callback)();
+ return;
+ }
+ }
+
+ delpointer();
+ uint8 *obText = getobtextstartCPP();
+ if (findnextcolon(&obText) != 0) {
+ if (findnextcolon(&obText) != 0) {
+ if (*obText != 0) {
+ usetext(obText);
+ hangonp(400);
+ putbackobstuff();
+ return;
+ }
+ }
+ }
+
+ createpanel();
+ showpanel();
+ showman();
+ showexit();
+ obicons();
+ printmessage(33, 100, 63, 241, true);
+ worktoscreenm();
+ hangonp(50);
+ putbackobstuff();
+ data.byte(kCommandtype) = 255;
+}
+
+void DreamGenContext::usetext() {
+ usetext(es.ptr(si, 0));
+}
+
+void DreamGenContext::usetext(const uint8 *string) {
+ createpanel();
+ showpanel();
+ showman();
+ showexit();
+ obicons();
+ printdirect(string, 36, 104, 241, true);
+ worktoscreenm();
+}
+
+} /*namespace dreamgen */
+
diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp
new file mode 100644
index 0000000000..53db811313
--- /dev/null
+++ b/engines/dreamweb/vgagrafx.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.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+#include "engines/util.h"
+#include "graphics/surface.h"
+
+namespace DreamGen {
+
+uint8 *DreamGenContext::workspace() {
+ uint8 *result = segRef(data.word(kWorkspace)).ptr(0, 0);
+ return result;
+}
+
+void DreamGenContext::allocatework() {
+ data.word(kWorkspace) = allocatemem(0x1000);
+}
+
+void DreamGenContext::multiget() {
+ multiget(ds.ptr(si, 0), di, bx, cl, ch);
+ si += cl * ch;
+ di += bx * kScreenwidth + kScreenwidth * ch;
+ cx = 0;
+}
+
+void DreamGenContext::multiget(uint8 *dst, uint16 x, uint16 y, uint8 w, uint8 h) {
+ assert(x < 320);
+ assert(y < 200);
+ const uint8 *src = workspace() + x + y * kScreenwidth;
+ if (y + h > 200)
+ h = 200 - y;
+ if (x + w > 320)
+ w = 320 - x;
+ //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es);
+ for(unsigned l = 0; l < h; ++l) {
+ const uint8 *src_p = src + kScreenwidth * l;
+ uint8 *dst_p = dst + w * l;
+ memcpy(dst_p, src_p, w);
+ }
+}
+
+void DreamGenContext::multiput() {
+ multiput(ds.ptr(si, 0), di, bx, cl, ch);
+ si += cl * ch;
+ di += bx * kScreenwidth + kScreenwidth * ch;
+ cx = 0;
+}
+
+void DreamGenContext::multiput(const uint8 *src, uint16 x, uint16 y, uint8 w, uint8 h) {
+ assert(x < 320);
+ assert(y < 200);
+ uint8 *dst = workspace() + x + y * kScreenwidth;
+ if (y + h > 200)
+ h = 200 - y;
+ if (x + w > 320)
+ w = 320 - x;
+ //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es);
+ for(unsigned l = 0; l < h; ++l) {
+ const uint8 *src_p = src + w * l;
+ uint8 *dst_p = dst + kScreenwidth * l;
+ memcpy(dst_p, src_p, w);
+ }
+}
+
+void DreamGenContext::multidump(uint16 x, uint16 y, uint8 width, uint8 height) {
+ unsigned offset = x + y * kScreenwidth;
+ //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)ds, x, y, offset);
+ engine->blit(workspace() + offset, kScreenwidth, x, y, width, height);
+}
+
+void DreamGenContext::multidump() {
+ multidump(di, bx, cl, ch);
+ unsigned offset = di + bx * kScreenwidth;
+ si = di = offset + ch * kScreenwidth;
+ cx = 0;
+}
+
+void DreamGenContext::worktoscreen() {
+ uint size = 320 * 200;
+ engine->blit(workspace(), 320, 0, 0, 320, 200);
+ di = si = size;
+ cx = 0;
+}
+
+void DreamGenContext::printundermon() {
+ engine->printUnderMonitor();
+}
+
+void DreamGenContext::cls() {
+ engine->cls();
+}
+
+void DreamGenContext::frameoutnm(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) {
+ dst += pitch * y + x;
+
+ for (uint16 j = 0; j < height; ++j) {
+ memcpy(dst, src, width);
+ dst += pitch;
+ src += width;
+ }
+}
+
+void DreamGenContext::frameoutbh(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) {
+ uint16 stride = pitch - width;
+ dst += y * pitch + x;
+
+ for (uint16 i = 0; i < height; ++i) {
+ for (uint16 j = 0; j < width; ++j) {
+ if (*dst == 0xff) {
+ *dst = *src;
+ }
+ ++src;
+ ++dst;
+ }
+ dst += stride;
+ }
+}
+
+void DreamGenContext::frameoutfx(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) {
+ uint16 stride = pitch - width;
+ dst += y * pitch + x;
+ dst -= width;
+
+ for (uint16 j = 0; j < height; ++j) {
+ for (uint16 i = 0; i < width; ++i) {
+ uint8 pixel = src[width - i - 1];
+ if (pixel)
+ *dst = pixel;
+ ++dst;
+ }
+ src += width;
+ dst += stride;
+ }
+}
+
+void DreamGenContext::doshake() {
+ uint8 &counter = data.byte(kShakecounter);
+ if (counter == 48)
+ return;
+
+ ++counter;
+ static const int shakeTable[] = {
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 2, 0, -2, 3, -2,
+ 0, 2, 4, -1, 1, -3, 3, 2,
+ 0, -2, 3, -2, 0, 2, 4, -1,
+
+ 1, -3, 3, 2, 0, -2, 3, -2,
+ 0, 2, 4, -1, 1, -3, 3, 2,
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 2, 0, -2, 3, -2,
+
+ 0, 2, 4, -1, 1, -3, 3, 2,
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 2, 0, -2, 3, -2,
+ 0, 2, 4, -1, 1, -3, 3, 2,
+
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 0,
+ };
+ int offset = shakeTable[counter];
+ engine->setShakePos(offset >= 0 ? offset : -offset);
+}
+
+void DreamGenContext::vsync() {
+ push(ax);
+ push(bx);
+ push(cx);
+ push(dx);
+ push(si);
+ push(di);
+ push(es);
+ push(ds);
+ engine->waitForVSync();
+ ds = pop();
+ es = pop();
+ di = pop();
+ si = pop();
+ dx = pop();
+ cx = pop();
+ bx = pop();
+ ax = pop();
+}
+
+void DreamGenContext::setmode() {
+ vsync();
+ initGraphics(320, 200, false);
+}
+
+static Common::String getFilename(Context &context) {
+ uint16 name_ptr = context.dx;
+ Common::String name;
+ uint8 c;
+ while((c = context.cs.byte(name_ptr++)) != 0)
+ name += (char)c;
+ return name;
+}
+
+void DreamGenContext::showpcx() {
+ Common::String name = getFilename(*this);
+ Common::File pcxFile;
+
+ if (!pcxFile.open(name)) {
+ warning("showpcx: Could not open '%s'", name.c_str());
+ return;
+ }
+
+ uint8 *maingamepal;
+ int i, j;
+
+ // Read the 16-color palette into the 'maingamepal' buffer. Note that
+ // the color components have to be adjusted from 8 to 6 bits.
+
+ pcxFile.seek(16, SEEK_SET);
+ es = data.word(kBuffers);
+ maingamepal = es.ptr(kMaingamepal, 768);
+ pcxFile.read(maingamepal, 48);
+
+ memset(maingamepal + 48, 0xff, 720);
+ for (i = 0; i < 48; i++) {
+ maingamepal[i] >>= 2;
+ }
+
+ // Decode the image data.
+
+ Graphics::Surface *s = g_system->lockScreen();
+ Common::Rect rect(640, 480);
+
+ s->fillRect(rect, 0);
+ pcxFile.seek(128, SEEK_SET);
+
+ for (int y = 0; y < 480; y++) {
+ byte *dst = (byte *)s->getBasePtr(0, y);
+ int decoded = 0;
+
+ while (decoded < 320) {
+ byte col = pcxFile.readByte();
+ byte len;
+
+ if ((col & 0xc0) == 0xc0) {
+ len = col & 0x3f;
+ col = pcxFile.readByte();
+ } else {
+ len = 1;
+ }
+
+ // The image uses 16 colors and is stored as four bit
+ // planes, one for each bit of the color, least
+ // significant bit plane first.
+
+ for (i = 0; i < len; i++) {
+ int plane = decoded / 80;
+ int pos = decoded % 80;
+
+ for (j = 0; j < 8; j++) {
+ byte bit = (col >> (7 - j)) & 1;
+ dst[8 * pos + j] |= (bit << plane);
+ }
+
+ decoded++;
+ }
+ }
+ }
+
+ g_system->unlockScreen();
+ pcxFile.close();
+}
+
+void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, int16 x, int16 y) {
+ // NB : These resilience checks were not in the original engine, but did they result in undefined behaviour
+ // or was something broken during porting to C++?
+ assert(pitch == 320);
+
+ if(x < 0) {
+ assert(width >= -x);
+ width -= -x;
+ src += -x;
+ x = 0;
+ }
+ if(y < 0) {
+ assert(height >= -y);
+ height -= -y;
+ src += (-y) * width;
+ y = 0;
+ }
+ if(x >= 320)
+ return;
+ if(y >= 200)
+ return;
+ if(x + width > 320) {
+ width = 320 - x;
+ }
+ if(y + height > 200) {
+ height = 200 - y;
+ }
+
+ uint16 stride = pitch - width;
+ dst += pitch * y + x;
+
+ for (uint16 j = 0; j < height; ++j) {
+ for (uint16 i = 0; i < width; ++i) {
+ uint8 pixel = *src++;
+ if (pixel)
+ *dst = pixel;
+ ++dst;
+ }
+ dst += stride;
+ }
+}
+
+void DreamGenContext::showframe(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag) {
+ uint8 width, height;
+ showframe(frameData, x, y, frameNumber, effectsFlag, &width, &height);
+}
+
+void DreamGenContext::showframe(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) {
+ const Frame *frame = frameData + frameNumber;
+ if ((frame->width == 0) && (frame->height == 0)) {
+ *width = 0;
+ *height = 0;
+ return;
+ }
+
+//notblankshow:
+ if ((effectsFlag & 128) == 0) {
+ x += frame->x;
+ y += frame->y;
+ }
+//skipoffsets:
+
+ *width = frame->width;
+ *height = frame->height;
+ const uint8 *pSrc = ((const uint8 *)frameData) + frame->ptr() + 2080;
+
+ if (effectsFlag) {
+ if (effectsFlag & 128) { //centred
+ x -= *width / 2;
+ y -= *height / 2;
+ }
+ if (effectsFlag & 64) { //diffdest
+ frameoutfx(es.ptr(0, dx * *height), pSrc, dx, *width, *height, x, y);
+ return;
+ }
+ if (effectsFlag & 8) { //printlist
+ /*
+ push(ax);
+ al = x - data.word(kMapadx);
+ ah = y - data.word(kMapady);
+ //addtoprintlist(); // NB: Commented in the original asm
+ ax = pop();
+ */
+ }
+ if (effectsFlag & 4) { //flippedx
+ frameoutfx(workspace(), pSrc, 320, *width, *height, x, y);
+ return;
+ }
+ if (effectsFlag & 2) { //nomask
+ frameoutnm(workspace(), pSrc, 320, *width, *height, x, y);
+ return;
+ }
+ if (effectsFlag & 32) {
+ frameoutbh(workspace(), pSrc, 320, *width, *height, x, y);
+ return;
+ }
+ }
+//noeffects:
+ frameoutv(workspace(), pSrc, 320, *width, *height, x, y);
+ return;
+}
+
+void DreamGenContext::showframe() {
+ uint8 width, height;
+ showframe((Frame *)ds.ptr(0, 0), di, bx, ax & 0x1ff, ah & 0xfe, &width, &height);
+ cl = width;
+ ch = height;
+}
+
+void DreamGenContext::clearwork() {
+ memset(workspace(), 0, 320*200);
+}
+
+void DreamGenContext::zoom() {
+ if (data.word(kWatchingtime) != 0)
+ return;
+ if (data.byte(kZoomon) != 1)
+ return;
+ if (data.byte(kCommandtype) >= 199) {
+ putunderzoom();
+ return;
+ }
+ uint16 srcOffset = (data.word(kOldpointery) - 9) * 320 + (data.word(kOldpointerx) - 11);
+ uint16 dstOffset = (kZoomy + 4) * 320 + (kZoomx + 5);
+ const uint8 *src = workspace() + srcOffset;
+ uint8 *dst = workspace() + dstOffset;
+ for(size_t i=0; i<20; ++i) {
+ for(size_t j=0; j<23; ++j) {
+ uint8 v = src[j];
+ dst[2*j+0] = v;
+ dst[2*j+1] = v;
+ dst[2*j+320] = v;
+ dst[2*j+321] = v;
+ }
+ src += 320;
+ dst += 320*2;
+ }
+ crosshair();
+ data.byte(kDidzoom) = 1;
+}
+
+void DreamGenContext::paneltomap() {
+ multiget(segRef(data.word(kMapstore)).ptr(0, 0), data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
+}
+
+void DreamGenContext::maptopanel() {
+ multiput(segRef(data.word(kMapstore)).ptr(0, 0), data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
+}
+
+void DreamGenContext::dumpmap() {
+ multidump(data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
+}
+
+void DreamGenContext::transferinv() {
+ const Frame *freeFrames = (const Frame *)segRef(data.word(kFreeframes)).ptr(kFrframedata, 0);
+ const Frame *freeFrame = freeFrames + (3 * data.byte(kItemtotran) + 1);
+ Frame *exFrames = (Frame *)segRef(data.word(kExtras)).ptr(kExframedata, 0);
+ Frame *exFrame = exFrames + (3 * data.byte(kExpos) + 1);
+ exFrame->width = freeFrame->width;
+ exFrame->height = freeFrame->height;
+ exFrame->x = freeFrame->x;
+ exFrame->y = freeFrame->y;
+ uint16 byteCount = freeFrame->width * freeFrame->height;
+ const uint8 *src = segRef(data.word(kFreeframes)).ptr(kFrframes + freeFrame->ptr(), byteCount);
+ uint8 *dst = segRef(data.word(kExtras)).ptr(kExframes + data.word(kExframepos), byteCount);
+ memcpy(dst, src, byteCount);
+ exFrame->setPtr(data.word(kExframepos));
+ data.word(kExframepos) += byteCount;
+}
+
+bool DreamGenContext::pixelcheckset(const ObjPos *pos, uint8 x, uint8 y) {
+ x -= pos->xMin;
+ y -= pos->yMin;
+ SetObject *setObject = getsetad(pos->index);
+ Frame *frame = (Frame *)segRef(data.word(kSetframes)).ptr(kFramedata, 0) + setObject->index;
+ const uint8 *ptr = segRef(data.word(kSetframes)).ptr(kFrames, 0) + frame->ptr() + y * frame->width + x;
+ return *ptr != 0;
+}
+
+} /*namespace dreamgen */
+
diff --git a/engines/engine.cpp b/engines/engine.cpp
index dde5064dc4..ee1d53fa9c 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -41,6 +41,7 @@
#include "common/list.h"
#include "common/list_intern.h"
#include "common/scummsys.h"
+#include "common/taskbar.h"
#include "common/textconsole.h"
#include "common/translation.h"
@@ -79,10 +80,21 @@ static void defaultErrorHandler(const char *msg) {
if (isSmartphone())
debugger = 0;
#endif
+
+#if defined(USE_TASKBAR)
+ g_system->getTaskbarManager()->notifyError();
+#endif
+
if (debugger && !debugger->isActive()) {
debugger->attach(msg);
debugger->onFrame();
}
+
+
+#if defined(USE_TASKBAR)
+ g_system->getTaskbarManager()->clearError();
+#endif
+
}
}
@@ -96,6 +108,7 @@ Engine::Engine(OSystem *syst)
_targetName(ConfMan.getActiveDomainName()),
_pauseLevel(0),
_pauseStartTime(0),
+ _saveSlotToLoad(-1),
_engineStartTime(_system->getMillis()),
_mainMenuDialog(NULL) {
@@ -396,7 +409,22 @@ void Engine::pauseEngineIntern(bool pause) {
void Engine::openMainMenuDialog() {
if (!_mainMenuDialog)
_mainMenuDialog = new MainMenuDialog(this);
+
+ setGameToLoadSlot(-1);
+
runDialog(*_mainMenuDialog);
+
+ // Load savegame after main menu execution
+ // (not from inside the menu loop to avoid
+ // mouse cursor glitches and simliar bugs,
+ // e.g. #2822778).
+ // FIXME: For now we just ignore the return
+ // value, which is quite bad since it could
+ // be a fatal loading error, which renders
+ // the engine unusable.
+ if (_saveSlotToLoad >= 0)
+ loadGameState(_saveSlotToLoad);
+
syncSoundSettings();
}
@@ -437,6 +465,10 @@ int Engine::runDialog(GUI::Dialog &dialog) {
return result;
}
+void Engine::setGameToLoadSlot(int slot) {
+ _saveSlotToLoad = slot;
+}
+
void Engine::syncSoundSettings() {
// Sync the engine with the config manager
int soundVolumeMusic = ConfMan.getInt("music_volume");
diff --git a/engines/engine.h b/engines/engine.h
index 06b7f7dedd..2796df5c4f 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -82,6 +82,13 @@ private:
*/
int32 _engineStartTime;
+ /**
+ * Save slot selected via global main menu.
+ * This slot will be loaded after main menu execution (not from inside
+ * the menu loop, to avoid bugs like #2822778).
+ */
+ int _saveSlotToLoad;
+
public:
@@ -186,6 +193,15 @@ public:
virtual Common::Error loadGameState(int slot);
/**
+ * Sets the game slot for a savegame to be loaded after global
+ * main menu execution. This is to avoid loading a savegame from
+ * inside the menu loop which causes bugs like #2822778.
+ *
+ * @param slot the slot from which a savestate should be loaded.
+ */
+ void setGameToLoadSlot(int slot);
+
+ /**
* Indicates whether a game state can be loaded.
*/
virtual bool canLoadGameStateCurrently();
diff --git a/engines/engines.mk b/engines/engines.mk
index fb754ef104..32306b2573 100644
--- a/engines/engines.mk
+++ b/engines/engines.mk
@@ -26,11 +26,21 @@ DEFINES += -DENABLE_AGOS2
endif
endif
+ifdef ENABLE_CGE
+DEFINES += -DENABLE_CGE=$(ENABLE_CGE)
+MODULES += engines/cge
+endif
+
ifdef ENABLE_CINE
DEFINES += -DENABLE_CINE=$(ENABLE_CINE)
MODULES += engines/cine
endif
+ifdef ENABLE_COMPOSER
+DEFINES += -DENABLE_COMPOSER=$(ENABLE_COMPOSER)
+MODULES += engines/composer
+endif
+
ifdef ENABLE_CRUISE
DEFINES += -DENABLE_CRUISE=$(ENABLE_CRUISE)
MODULES += engines/cruise
@@ -207,4 +217,3 @@ ifdef ENABLE_TUCKER
DEFINES += -DENABLE_TUCKER=$(ENABLE_TUCKER)
MODULES += engines/tucker
endif
-
diff --git a/engines/game.cpp b/engines/game.cpp
index 8ea68bb681..be15240745 100644
--- a/engines/game.cpp
+++ b/engines/game.cpp
@@ -38,29 +38,29 @@ GameDescriptor::GameDescriptor() {
setVal("description", "");
}
-GameDescriptor::GameDescriptor(const PlainGameDescriptor &pgd, uint32 guioptions) {
+GameDescriptor::GameDescriptor(const PlainGameDescriptor &pgd, Common::String guioptions) {
setVal("gameid", pgd.gameid);
setVal("description", pgd.description);
- if (guioptions != 0)
+ if (!guioptions.empty())
setVal("guioptions", Common::getGameGUIOptionsDescription(guioptions));
}
-GameDescriptor::GameDescriptor(const Common::String &g, const Common::String &d, Common::Language l, Common::Platform p, uint32 guioptions, GameSupportLevel gsl) {
+GameDescriptor::GameDescriptor(const Common::String &g, const Common::String &d, Common::Language l, Common::Platform p, Common::String guioptions, GameSupportLevel gsl) {
setVal("gameid", g);
setVal("description", d);
if (l != Common::UNK_LANG)
setVal("language", Common::getLanguageCode(l));
if (p != Common::kPlatformUnknown)
setVal("platform", Common::getPlatformCode(p));
- if (guioptions != 0)
+ if (!guioptions.empty())
setVal("guioptions", Common::getGameGUIOptionsDescription(guioptions));
setSupportLevel(gsl);
}
-void GameDescriptor::setGUIOptions(uint32 guioptions) {
- if (guioptions != 0)
+void GameDescriptor::setGUIOptions(Common::String guioptions) {
+ if (!guioptions.empty())
setVal("guioptions", Common::getGameGUIOptionsDescription(guioptions));
else
erase("guioptions");
diff --git a/engines/game.h b/engines/game.h
index 9082d93793..23512e89b8 100644
--- a/engines/game.h
+++ b/engines/game.h
@@ -65,12 +65,12 @@ enum GameSupportLevel {
class GameDescriptor : public Common::StringMap {
public:
GameDescriptor();
- GameDescriptor(const PlainGameDescriptor &pgd, uint32 guioptions = 0);
+ GameDescriptor(const PlainGameDescriptor &pgd, Common::String guioptions = "");
GameDescriptor(const Common::String &gameid,
const Common::String &description,
Common::Language language = Common::UNK_LANG,
Common::Platform platform = Common::kPlatformUnknown,
- uint32 guioptions = 0,
+ Common::String guioptions = "",
GameSupportLevel gsl = kStableGame);
/**
@@ -80,7 +80,7 @@ public:
*/
void updateDesc(const char *extra = 0);
- void setGUIOptions(uint32 options);
+ void setGUIOptions(Common::String options);
void appendGUIOptions(const Common::String &str);
/**
diff --git a/engines/gob/anifile.cpp b/engines/gob/anifile.cpp
new file mode 100644
index 0000000000..1a905f1083
--- /dev/null
+++ b/engines/gob/anifile.cpp
@@ -0,0 +1,326 @@
+/* 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.
+ *
+ */
+
+#include "common/stream.h"
+#include "common/substream.h"
+
+#include "gob/gob.h"
+#include "gob/util.h"
+#include "gob/dataio.h"
+#include "gob/surface.h"
+#include "gob/video.h"
+#include "gob/anifile.h"
+
+namespace Gob {
+
+ANIFile::Layer::Layer() : surface(0), coordinates(0) {
+}
+
+ANIFile::Layer::~Layer() {
+ delete coordinates;
+ delete surface;
+}
+
+
+ANIFile::ANIFile(GobEngine *vm, const Common::String &fileName,
+ uint16 width, uint8 bpp) : _vm(vm),
+ _width(width), _bpp(bpp), _hasPadding(false) {
+
+ Common::SeekableReadStream *ani = _vm->_dataIO->getFile(fileName);
+ if (ani) {
+ Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), false, DisposeAfterUse::YES);
+
+ load(sub, fileName);
+ return;
+ }
+
+ // File doesn't exist, try to open the big-endian'd alternate file
+ Common::String alternateFileName = fileName;
+ alternateFileName.setChar('_', 0);
+
+ ani = _vm->_dataIO->getFile(alternateFileName);
+ if (ani) {
+ Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), true, DisposeAfterUse::YES);
+
+ // The big endian version pads a few fields to even size
+ _hasPadding = true;
+
+ load(sub, fileName);
+ return;
+ }
+
+ warning("ANIFile::ANIFile(): No such file \"%s\"", fileName.c_str());
+}
+
+ANIFile::~ANIFile() {
+}
+
+void ANIFile::load(Common::SeekableSubReadStreamEndian &ani, const Common::String &fileName) {
+ ani.skip(2); // Unused
+
+ uint16 animationCount = ani.readUint16();
+ uint16 layerCount = ani.readUint16();
+
+ if (layerCount < 1)
+ warning("ANIFile::load(): Less than one layer (%d) in file \"%s\"",
+ layerCount, fileName.c_str());
+
+ // Load the layers
+ if (layerCount > 0) {
+ ani.skip(13); // The first layer is ignored?
+ if (_hasPadding)
+ ani.skip(1);
+
+ _layers.resize(layerCount - 1);
+ for (LayerArray::iterator l = _layers.begin(); l != _layers.end(); ++l)
+ loadLayer(*l, ani);
+ }
+
+ _maxWidth = 0;
+ _maxHeight = 0;
+
+ // Load the animations
+ _animations.resize(animationCount);
+ _frames.resize(animationCount);
+
+ for (uint16 animation = 0; animation < animationCount; animation++) {
+ loadAnimation(_animations[animation], _frames[animation], ani);
+
+ _maxWidth = MAX<uint16>(_maxWidth , _animations[animation].width);
+ _maxHeight = MAX<uint16>(_maxHeight, _animations[animation].height);
+ }
+}
+
+void ANIFile::loadAnimation(Animation &animation, FrameArray &frames,
+ Common::SeekableSubReadStreamEndian &ani) {
+
+ // Animation properties
+
+ animation.name = Util::readString(ani, 13);
+ if (_hasPadding)
+ ani.skip(1);
+
+ ani.skip(13); // The name a second time?!?
+ if (_hasPadding)
+ ani.skip(1);
+
+ ani.skip(2); // Unknown
+
+ animation.x = (int16) ani.readUint16();
+ animation.y = (int16) ani.readUint16();
+ animation.deltaX = (int16) ani.readUint16();
+ animation.deltaY = (int16) ani.readUint16();
+
+ animation.transp = ani.readByte() != 0;
+
+ if (_hasPadding)
+ ani.skip(1);
+
+ uint16 frameCount = ani.readUint16();
+
+ // Load the frames
+
+ frames.resize(MAX<uint16>(1, frameCount));
+ loadFrames(frames, ani);
+
+ animation.frameCount = frames.size();
+
+ animation.width = 0;
+ animation.height = 0;
+
+ // Calculate the areas of each frame
+
+ animation.frameAreas.resize(animation.frameCount);
+ for (uint16 i = 0; i < animation.frameCount; i++) {
+ const ChunkList &frame = frames[i];
+ FrameArea &area = animation.frameAreas[i];
+
+ area.left = area.top = 0x7FFF;
+ area.right = area.bottom = -0x7FFF;
+
+ for (ChunkList::const_iterator c = frame.begin(); c != frame.end(); c++) {
+ const Layer *layer;
+ const RXYFile::Coordinates *coords;
+
+ if (!getPart(c->layer, c->part, layer, coords))
+ continue;
+
+ const uint16 width = coords->right - coords->left + 1;
+ const uint16 height = coords->bottom - coords->top + 1;
+
+ const uint16 l = c->x;
+ const uint16 t = c->y;
+ const uint16 r = l + width - 1;
+ const uint16 b = t + height - 1;
+
+ area.left = MIN<int16>(area.left , l);
+ area.top = MIN<int16>(area.top , t);
+ area.right = MAX<int16>(area.right , r);
+ area.bottom = MAX<int16>(area.bottom, b);
+ }
+
+ if ((area.left <= area.right) && (area.top <= area.bottom)) {
+ animation.width = MAX<uint16>(animation.width , area.right - area.left + 1);
+ animation.height = MAX<uint16>(animation.height, area.bottom - area.top + 1);
+ }
+ }
+}
+
+void ANIFile::loadFrames(FrameArray &frames, Common::SeekableSubReadStreamEndian &ani) {
+ uint32 curFrame = 0;
+
+ bool end = false;
+ while (!end) {
+ frames[curFrame].push_back(AnimationChunk());
+ AnimationChunk &chunk = frames[curFrame].back();
+
+ uint8 layerFlags = ani.readByte();
+
+ // Chunk properties
+ chunk.layer = (layerFlags & 0x0F) - 1;
+ chunk.part = ani.readByte();
+ chunk.x = (int8) ani.readByte();
+ chunk.y = (int8) ani.readByte();
+
+ // X multiplier/offset
+ int16 xOff = ((layerFlags & 0xC0) >> 6) << 7;
+ if (chunk.x >= 0)
+ chunk.x += xOff;
+ else
+ chunk.x -= xOff;
+
+ // Y multiplier/offset
+ int16 yOff = ((layerFlags & 0x30) >> 4) << 7;
+ if (chunk.y >= 0)
+ chunk.y += yOff;
+ else
+ chunk.y -= yOff;
+
+ uint8 multiPart = ani.readByte();
+ if (multiPart == 0xFF) // No more frames in this animation
+ end = true;
+ else if (multiPart != 0x01) // No more chunks in this frame
+ curFrame++;
+
+ // Shouldn't happen, but just to be safe
+ if (curFrame >= frames.size())
+ frames.resize(curFrame + 1);
+
+ if (_hasPadding)
+ ani.skip(1);
+
+ if (ani.eos() || ani.err())
+ error("ANIFile::loadFrames(): Read error");
+ }
+}
+
+void ANIFile::loadLayer(Layer &layer, Common::SeekableSubReadStreamEndian &ani) {
+ Common::String file = Util::readString(ani, 13);
+ if (_hasPadding)
+ ani.skip(1);
+
+ if (file.empty())
+ return;
+
+ Common::String fileRXY = Util::setExtension(file, ".RXY");
+ Common::String fileCMP = Util::setExtension(file, ".CMP");
+ if (!_vm->_dataIO->hasFile(fileRXY) || !_vm->_dataIO->hasFile(fileCMP))
+ return;
+
+ loadLayer(layer, fileRXY, fileCMP);
+}
+
+void ANIFile::loadLayer(Layer &layer, const Common::String &fileRXY,
+ const Common::String &fileCMP) {
+
+ Common::SeekableReadStream *dataRXY = _vm->_dataIO->getFile(fileRXY);
+ if (!dataRXY)
+ return;
+
+ layer.coordinates = new RXYFile(*dataRXY);
+ layer.surface = new Surface(_width, layer.coordinates->getHeight(), _bpp);
+
+ _vm->_video->drawPackedSprite(fileCMP.c_str(), *layer.surface);
+}
+
+uint16 ANIFile::getAnimationCount() const {
+ return _animations.size();
+}
+
+void ANIFile::getMaxSize(uint16 &width, uint16 &height) const {
+ width = _maxWidth;
+ height = _maxHeight;
+}
+
+const ANIFile::Animation &ANIFile::getAnimationInfo(uint16 animation) const {
+ assert(animation < _animations.size());
+
+ return _animations[animation];
+}
+
+bool ANIFile::getPart(uint16 layer, uint16 part,
+ const Layer *&l, const RXYFile::Coordinates *&c) const {
+
+ if (layer >= _layers.size())
+ return false;
+
+ l = &_layers[layer];
+ if (!l->surface || !l->coordinates)
+ return false;
+
+ if (part >= l->coordinates->size())
+ return false;
+
+ c = &(*l->coordinates)[part];
+ if (c->left == 0xFFFF)
+ return false;
+
+ return true;
+}
+
+void ANIFile::draw(Surface &dest, uint16 animation, uint16 frame, int16 x, int16 y) const {
+ if (animation >= _animations.size())
+ return;
+
+ const Animation &anim = _animations[animation];
+ if (frame >= anim.frameCount)
+ return;
+
+ const ChunkList &chunks = _frames[animation][frame];
+
+ for (ChunkList::const_iterator c = chunks.begin(); c != chunks.end(); ++c)
+ drawLayer(dest, c->layer, c->part, x + c->x, y + c->y, anim.transp ? 0 : -1);
+}
+
+void ANIFile::drawLayer(Surface &dest, uint16 layer, uint16 part,
+ int16 x, int16 y, int32 transp) const {
+
+ const Layer *l;
+ const RXYFile::Coordinates *c;
+
+ if (!getPart(layer, part, l, c))
+ return;
+
+ dest.blit(*l->surface, c->left, c->top, c->right, c->bottom, x, y, transp);
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/anifile.h b/engines/gob/anifile.h
new file mode 100644
index 0000000000..1e10da6ff4
--- /dev/null
+++ b/engines/gob/anifile.h
@@ -0,0 +1,161 @@
+/* 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 GOB_ANIFILE_H
+#define GOB_ANIFILE_H
+
+#include "common/system.h"
+#include "common/str.h"
+#include "common/array.h"
+#include "common/list.h"
+
+#include "gob/rxyfile.h"
+
+namespace Common {
+ class SeekableSubReadStreamEndian;
+}
+
+namespace Gob {
+
+class GobEngine;
+class Surface;
+
+/** An ANI file, describing an animation.
+ *
+ * Used in hardcoded "actiony" parts of gob games.
+ * The principle is similar to an Anim in Scenery (see scenery.cpp), but
+ * instead of referencing indices in the sprites array, ANIs reference sprites
+ * directly by filename.
+ */
+class ANIFile {
+public:
+ /** The relative area a frame sprite occupies. */
+ struct FrameArea {
+ int16 left;
+ int16 top;
+ int16 right;
+ int16 bottom;
+ };
+
+ /** An animation within an ANI file. */
+ struct Animation {
+ Common::String name; ///< The name of the animation.
+
+ uint16 frameCount; ///< The number of frames in this animation.
+
+ int16 x; ///< The default x position for this animation.
+ int16 y; ///< The default y position for this animation.
+ bool transp; ///< Should the animation frames be drawn with transparency?
+
+ int16 deltaX; ///< # of pixels to advance in X direction after each cycle.
+ int16 deltaY; ///< # of pixels to advance in Y direction after each cycle.
+
+ /** The relative area each frame sprite occupies. */
+ Common::Array<FrameArea> frameAreas;
+
+ uint16 width; ///< The maximum width of this animation's frames.
+ uint16 height; ///< The maximum height of this animation's frames.
+ };
+
+
+ ANIFile(GobEngine *vm, const Common::String &fileName,
+ uint16 width = 320, uint8 bpp = 1);
+ ~ANIFile();
+
+ /** Return the number of animations in this ANI file. */
+ uint16 getAnimationCount() const;
+
+ /** Return the maximum size of all animation frames. */
+ void getMaxSize(uint16 &width, uint16 &height) const;
+
+ /** Get this animation's properties. */
+ const Animation &getAnimationInfo(uint16 animation) const;
+
+ /** Draw an animation frame. */
+ void draw(Surface &dest, uint16 animation, uint16 frame, int16 x, int16 y) const;
+
+private:
+ /** A sprite layer. */
+ struct Layer {
+ Surface *surface; ///< The surface containing the layer sprite.
+ RXYFile *coordinates; ///< The coordinates describing the layer sprite parts.
+
+ Layer();
+ ~Layer();
+ };
+
+ typedef Common::Array<Layer> LayerArray;
+ typedef Common::Array<Animation> AnimationArray;
+
+ /** A "chunk" of an animation frame. */
+ struct AnimationChunk {
+ int16 x; ///< The relative x offset of this chunk.
+ int16 y; ///< The relative y offset of this chunk.
+
+ uint16 layer; ///< The layer the chunk's sprite is on.
+ uint16 part; ///< The layer part the chunk's sprite is.
+ };
+
+ typedef Common::List<AnimationChunk> ChunkList;
+ typedef Common::Array<ChunkList> FrameArray;
+ typedef Common::Array<FrameArray> AnimationFrameArray;
+
+
+ GobEngine *_vm;
+
+ uint16 _width; ///< The width of a sprite layer.
+ uint8 _bpp; ///< Number of bytes per pixel in a sprite layer.
+
+ byte _hasPadding;
+
+ LayerArray _layers; ///< The animation sprite layers.
+ AnimationArray _animations; ///< The animations.
+ AnimationFrameArray _frames; ///< The animation frames.
+
+ uint16 _maxWidth;
+ uint16 _maxHeight;
+
+
+ // Loading helpers
+
+ void load(Common::SeekableSubReadStreamEndian &ani, const Common::String &fileName);
+
+ void loadLayer(Layer &layer, Common::SeekableSubReadStreamEndian &ani);
+ void loadLayer(Layer &layer, const Common::String &fileRXY,
+ const Common::String &fileCMP);
+
+ void loadAnimation(Animation &animation, FrameArray &frames,
+ Common::SeekableSubReadStreamEndian &ani);
+ void loadFrames(FrameArray &frames, Common::SeekableSubReadStreamEndian &ani);
+
+ // Drawing helpers
+
+ bool getPart(uint16 layer, uint16 part,
+ const Layer *&l, const RXYFile::Coordinates *&c) const;
+
+ void drawLayer(Surface &dest, uint16 layer, uint16 part,
+ int16 x, int16 y, int32 transp) const;
+};
+
+} // End of namespace Gob
+
+#endif // GOB_ANIFILE_H
diff --git a/engines/gob/aniobject.cpp b/engines/gob/aniobject.cpp
new file mode 100644
index 0000000000..a01fe43672
--- /dev/null
+++ b/engines/gob/aniobject.cpp
@@ -0,0 +1,210 @@
+/* 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.
+ *
+ */
+
+#include "gob/surface.h"
+#include "gob/anifile.h"
+#include "gob/aniobject.h"
+
+namespace Gob {
+
+ANIObject::ANIObject(const ANIFile &ani) : _ani(&ani),
+ _visible(false), _paused(false), _mode(kModeContinuous),
+ _x(0), _y(0), _background(0), _drawn(false) {
+
+ setAnimation(0);
+ setPosition();
+}
+
+ANIObject::~ANIObject() {
+ delete _background;
+}
+
+void ANIObject::setVisible(bool visible) {
+ _visible = visible;
+}
+
+bool ANIObject::isVisible() const {
+ return _visible;
+}
+
+void ANIObject::setPause(bool pause) {
+ _paused = pause;
+}
+
+bool ANIObject::isPaused() const {
+ return _paused;
+}
+
+void ANIObject::setMode(Mode mode) {
+ _mode = mode;
+}
+
+void ANIObject::setAnimation(uint16 animation) {
+ _animation = animation;
+ _frame = 0;
+}
+
+void ANIObject::rewind() {
+ _frame = 0;
+}
+
+void ANIObject::setPosition() {
+ if (_animation >= _ani->getAnimationCount())
+ return;
+
+ const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation);
+
+ _x = animation.x;
+ _y = animation.y;
+}
+
+void ANIObject::setPosition(int16 x, int16 y) {
+ _x = x;
+ _y = y;
+}
+
+void ANIObject::getPosition(int16 &x, int16 &y) const {
+ x = _x;
+ y = _y;
+}
+
+void ANIObject::getFramePosition(int16 &x, int16 &y) const {
+ if (_animation >= _ani->getAnimationCount())
+ return;
+
+ const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation);
+ if (_frame >= animation.frameCount)
+ return;
+
+ x = _x + animation.frameAreas[_frame].left;
+ y = _y + animation.frameAreas[_frame].top;
+}
+
+void ANIObject::getFrameSize(int16 &width, int16 &height) const {
+ if (_animation >= _ani->getAnimationCount())
+ return;
+
+ const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation);
+ if (_frame >= animation.frameCount)
+ return;
+
+ width = animation.frameAreas[_frame].right - animation.frameAreas[_frame].left + 1;
+ height = animation.frameAreas[_frame].bottom - animation.frameAreas[_frame].top + 1;
+}
+
+void ANIObject::draw(Surface &dest, int16 &left, int16 &top,
+ int16 &right, int16 &bottom) {
+
+ if (!_visible)
+ return;
+
+ if (!_background) {
+ uint16 width, height;
+
+ _ani->getMaxSize(width, height);
+
+ _background = new Surface(width, height, dest.getBPP());
+ }
+
+ const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation);
+ if (_frame >= animation.frameCount)
+ return;
+
+ const ANIFile::FrameArea &area = animation.frameAreas[_frame];
+
+ _backgroundLeft = CLIP<int16>(area.left + _x, 0, dest.getWidth () - 1);
+ _backgroundTop = CLIP<int16>(area.top + _y, 0, dest.getHeight() - 1);
+ _backgroundRight = CLIP<int16>(area.right + _x, 0, dest.getWidth () - 1);
+ _backgroundBottom = CLIP<int16>(area.bottom + _y, 0, dest.getHeight() - 1);
+
+ _background->blit(dest, _backgroundLeft , _backgroundTop,
+ _backgroundRight, _backgroundBottom, 0, 0);
+
+ _ani->draw(dest, _animation, _frame, _x, _y);
+
+ _drawn = true;
+
+ left = _backgroundLeft;
+ top = _backgroundTop;
+ right = _backgroundRight;
+ bottom = _backgroundBottom;
+}
+
+void ANIObject::clear(Surface &dest, int16 &left, int16 &top,
+ int16 &right, int16 &bottom) {
+
+ if (!_drawn)
+ return;
+
+ const int16 bgRight = _backgroundRight - _backgroundLeft;
+ const int16 bgBottom = _backgroundBottom - _backgroundTop;
+
+ dest.blit(*_background, 0, 0, bgRight, bgBottom, _backgroundLeft, _backgroundTop);
+
+ _drawn = false;
+
+ left = _backgroundLeft;
+ top = _backgroundTop;
+ right = _backgroundRight;
+ bottom = _backgroundBottom;
+}
+
+void ANIObject::advance() {
+ if (_paused)
+ return;
+
+ if (_animation >= _ani->getAnimationCount())
+ return;
+
+ const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation);
+
+ _frame = (_frame + 1) % animation.frameCount;
+
+ if (_frame == 0) {
+ _x += animation.deltaX;
+ _y += animation.deltaY;
+
+ if (_mode == kModeOnce) {
+ _paused = true;
+ _visible = false;
+ }
+ }
+}
+
+uint16 ANIObject::getAnimation() const {
+ return _animation;
+}
+
+uint16 ANIObject::getFrame() const {
+ return _frame;
+}
+
+bool ANIObject::lastFrame() const {
+ if (_animation >= _ani->getAnimationCount())
+ return true;
+
+ const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation);
+
+ return (_frame + 1) >= animation.frameCount;
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/aniobject.h b/engines/gob/aniobject.h
new file mode 100644
index 0000000000..28103007a6
--- /dev/null
+++ b/engines/gob/aniobject.h
@@ -0,0 +1,119 @@
+/* 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 GOB_ANIOBJECT_H
+#define GOB_ANIOBJECT_H
+
+#include "common/system.h"
+
+namespace Gob {
+
+class ANIFile;
+class Surface;
+
+/** An ANI object, controlling an animation within an ANI file. */
+class ANIObject {
+public:
+ enum Mode {
+ kModeContinuous, ///< Play the animation continuously.
+ kModeOnce ///< Play the animation only once.
+ };
+
+ ANIObject(const ANIFile &ani);
+ virtual ~ANIObject();
+
+ /** Make the object visible/invisible. */
+ void setVisible(bool visible);
+
+ /** Is the object currently visible? */
+ bool isVisible() const;
+
+ /** Pause/Unpause the animation. */
+ void setPause(bool pause);
+
+ /** Is the animation currently paused? */
+ bool isPaused() const;
+
+ /** Set the animation mode. */
+ void setMode(Mode mode);
+
+ /** Set the current position to the animation's default. */
+ void setPosition();
+ /** Set the current position. */
+ void setPosition(int16 x, int16 y);
+
+ /** Return the current position. */
+ void getPosition(int16 &x, int16 &y) const;
+
+ /** Return the current frame position. */
+ void getFramePosition(int16 &x, int16 &y) const;
+ /** Return the current frame size. */
+ void getFrameSize(int16 &width, int16 &height) const;
+
+ /** Set the animation number. */
+ void setAnimation(uint16 animation);
+
+ /** Rewind the current animation to the first frame. */
+ void rewind();
+
+ /** Return the current animation number. */
+ uint16 getAnimation() const;
+ /** Return the current frame number. */
+ uint16 getFrame() const;
+
+ /** Is this the last frame within this animation cycle? */
+ bool lastFrame() const;
+
+ /** Draw the current frame onto the surface and return the affected rectangle. */
+ void draw(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom);
+ /** Draw the current frame from the surface and return the affected rectangle. */
+ void clear(Surface &dest, int16 &left , int16 &top, int16 &right, int16 &bottom);
+
+ /** Advance the animation to the next frame. */
+ virtual void advance();
+
+private:
+ const ANIFile *_ani; ///< The managed ANI file.
+
+ uint16 _animation; ///< The current animation number
+ uint16 _frame; ///< The current frame.
+
+ bool _visible; ///< Is the object currently visible?
+ bool _paused; ///< Is the animation currently paused?
+
+ Mode _mode; ///< The animation mode.
+
+ int16 _x; ///< The current X position.
+ int16 _y; ///< The current Y position.
+
+ Surface *_background; ///< The saved background.
+ bool _drawn; ///< Was the animation drawn?
+
+ int16 _backgroundLeft; ///< The left position of the saved background.
+ int16 _backgroundTop; ///< The top of the saved background.
+ int16 _backgroundRight; ///< The right position of the saved background.
+ int16 _backgroundBottom; ///< The bottom position of the saved background.
+};
+
+} // End of namespace Gob
+
+#endif // GOB_ANIOBJECT_H
diff --git a/engines/gob/console.cpp b/engines/gob/console.cpp
index b8aed37727..e7296fb81b 100644
--- a/engines/gob/console.cpp
+++ b/engines/gob/console.cpp
@@ -29,6 +29,7 @@ namespace Gob {
GobConsole::GobConsole(GobEngine *vm) : GUI::Debugger(), _vm(vm) {
DCmd_Register("varSize", WRAP_METHOD(GobConsole, cmd_varSize));
+ DCmd_Register("dumpVars", WRAP_METHOD(GobConsole, cmd_dumpVars));
DCmd_Register("var8", WRAP_METHOD(GobConsole, cmd_var8));
DCmd_Register("var16", WRAP_METHOD(GobConsole, cmd_var16));
DCmd_Register("var32", WRAP_METHOD(GobConsole, cmd_var32));
@@ -44,6 +45,23 @@ bool GobConsole::cmd_varSize(int argc, const char **argv) {
return true;
}
+bool GobConsole::cmd_dumpVars(int argc, const char **argv) {
+ if (!_vm->_inter->_variables)
+ return true;
+
+ Common::DumpFile file;
+
+ if (!file.open("variables.dmp"))
+ return true;
+
+ file.write(_vm->_inter->_variables->getAddressOff8(0), _vm->_inter->_variables->getSize());
+
+ file.flush();
+ file.close();
+
+ return true;
+}
+
bool GobConsole::cmd_var8(int argc, const char **argv) {
if (argc == 1) {
DebugPrintf("Usage: var8 <var offset> (<value>)\n");
diff --git a/engines/gob/console.h b/engines/gob/console.h
index b9f9b81d0e..b9c3f5ed70 100644
--- a/engines/gob/console.h
+++ b/engines/gob/console.h
@@ -38,6 +38,7 @@ private:
GobEngine *_vm;
bool cmd_varSize(int argc, const char **argv);
+ bool cmd_dumpVars(int argc, const char **argv);
bool cmd_var8(int argc, const char **argv);
bool cmd_var16(int argc, const char **argv);
bool cmd_var32(int argc, const char **argv);
diff --git a/engines/gob/dataio.cpp b/engines/gob/dataio.cpp
index a576cf9487..1633a1edb7 100644
--- a/engines/gob/dataio.cpp
+++ b/engines/gob/dataio.cpp
@@ -32,11 +32,11 @@
namespace Gob {
-DataIO::File::File() : size(0), offset(0), packed(false), archive(0) {
+DataIO::File::File() : size(0), offset(0), compression(0), archive(0) {
}
-DataIO::File::File(const Common::String &n, uint32 s, uint32 o, bool p, Archive &a) :
- name(n), size(s), offset(o), packed(p), archive(&a) {
+DataIO::File::File(const Common::String &n, uint32 s, uint32 o, uint8 c, Archive &a) :
+ name(n), size(s), offset(o), compression(c), archive(&a) {
}
@@ -71,26 +71,92 @@ void DataIO::getArchiveInfo(Common::Array<ArchiveInfo> &info) const {
}
}
-byte *DataIO::unpack(const byte *src, uint32 srcSize, int32 &size) {
- size = READ_LE_UINT32(src);
+uint32 DataIO::getSizeChunks(Common::SeekableReadStream &src) {
+ uint32 size = 0;
- byte *data = new byte[size];
+ uint32 chunkSize = 2, realSize;
+ while (chunkSize != 0xFFFF) {
+ src.skip(chunkSize - 2);
+
+ chunkSize = src.readUint16LE();
+ realSize = src.readUint16LE();
+
+ assert(chunkSize >= 4);
+
+ size += realSize;
+ }
+
+ assert(!src.eos());
+
+ src.seek(0);
+
+ return size;
+}
+
+byte *DataIO::unpack(Common::SeekableReadStream &src, int32 &size, uint8 compression, bool useMalloc) {
+ assert((compression == 1) || (compression == 2));
+
+ if (compression == 1)
+ size = src.readUint32LE();
+ else if (compression == 2)
+ size = getSizeChunks(src);
+
+ assert(size > 0);
+
+ byte *data = 0;
+ if (useMalloc)
+ data = (byte *) malloc(size);
+ else
+ data = new byte[size];
+
+ if (compression == 1)
+ unpackChunk(src, data, size);
+ else if (compression == 2)
+ unpackChunks(src, data, size);
- Common::MemoryReadStream srcStream(src + 4, srcSize - 4);
- unpack(srcStream, data, size);
return data;
}
-Common::SeekableReadStream *DataIO::unpack(Common::SeekableReadStream &src) {
- uint32 size = src.readUint32LE();
+byte *DataIO::unpack(const byte *src, uint32 srcSize, int32 &size, uint8 compression) {
+ Common::MemoryReadStream srcStream(src, srcSize);
- byte *data = (byte *) malloc(size);
+ return unpack(srcStream, size, compression, false);
+}
+
+Common::SeekableReadStream *DataIO::unpack(Common::SeekableReadStream &src, uint8 compression) {
+ int32 size;
+
+ byte *data = unpack(src, size, compression, true);
+ if (!data)
+ return 0;
- unpack(src, data, size);
return new Common::MemoryReadStream(data, size, DisposeAfterUse::YES);
}
-void DataIO::unpack(Common::SeekableReadStream &src, byte *dest, uint32 size) {
+void DataIO::unpackChunks(Common::SeekableReadStream &src, byte *dest, uint32 size) {
+ uint32 chunkSize = 0, realSize;
+ while (chunkSize != 0xFFFF) {
+ uint32 pos = src.pos();
+
+ chunkSize = src.readUint16LE();
+ realSize = src.readUint16LE();
+
+ assert(chunkSize >= 4);
+ assert(size >= realSize);
+
+ src.skip(2);
+
+ unpackChunk(src, dest, realSize);
+
+ if (chunkSize != 0xFFFF)
+ src.seek(pos + chunkSize + 2);
+
+ size -= realSize;
+ dest += realSize;
+ }
+}
+
+void DataIO::unpackChunk(Common::SeekableReadStream &src, byte *dest, uint32 size) {
byte *tmpBuf = new byte[4114];
assert(tmpBuf);
@@ -194,9 +260,9 @@ DataIO::Archive *DataIO::openArchive(const Common::String &name) {
archive->file.read(fileName, 13);
fileName[13] = '\0';
- file.size = archive->file.readUint32LE();
- file.offset = archive->file.readUint32LE();
- file.packed = archive->file.readByte() != 0;
+ file.size = archive->file.readUint32LE();
+ file.offset = archive->file.readUint32LE();
+ file.compression = archive->file.readByte() != 0;
// Replacing cyrillic characters
Util::replaceChar(fileName, (char) 0x85, 'E');
@@ -209,8 +275,8 @@ DataIO::Archive *DataIO::openArchive(const Common::String &name) {
// Geisha use 0ot files, which are compressed TOT files without the packed byte set.
if (file.name.hasSuffix(".0OT")) {
- file.name.setChar(file.name.size() - 3, 'T');
- file.packed = true;
+ file.name.setChar('T', file.name.size() - 3);
+ file.compression = 2;
}
file.archive = archive;
@@ -254,7 +320,7 @@ int32 DataIO::fileSize(const Common::String &name) {
// Try to find the file in the archives
File *file = findFile(name);
if (file) {
- if (!file->packed)
+ if (file->compression == 0)
return file->size;
// Sanity checks
@@ -264,6 +330,10 @@ int32 DataIO::fileSize(const Common::String &name) {
// Read the full, unpacked size
file->archive->file.seek(file->offset);
+
+ if (file->compression == 2)
+ file->archive->file.skip(4);
+
return file->archive->file.readUint32LE();
}
@@ -346,10 +416,10 @@ Common::SeekableReadStream *DataIO::getFile(File &file) {
Common::SeekableReadStream *rawData =
new Common::SafeSubReadStream(&file.archive->file, file.offset, file.offset + file.size);
- if (!file.packed)
+ if (file.compression == 0)
return rawData;
- Common::SeekableReadStream *unpackedData = unpack(*rawData);
+ Common::SeekableReadStream *unpackedData = unpack(*rawData, file.compression);
delete rawData;
@@ -374,10 +444,10 @@ byte *DataIO::getFile(File &file, int32 &size) {
return 0;
}
- if (!file.packed)
+ if (file.compression == 0)
return rawData;
- byte *unpackedData = unpack(rawData, file.size, size);
+ byte *unpackedData = unpack(rawData, file.size, size, file.compression);
delete[] rawData;
diff --git a/engines/gob/dataio.h b/engines/gob/dataio.h
index d95f001097..adf0786389 100644
--- a/engines/gob/dataio.h
+++ b/engines/gob/dataio.h
@@ -58,8 +58,8 @@ public:
Common::SeekableReadStream *getFile(const Common::String &name);
byte *getFile(const Common::String &name, int32 &size);
- static byte *unpack(const byte *src, uint32 srcSize, int32 &size);
- static Common::SeekableReadStream *unpack(Common::SeekableReadStream &src);
+ static byte *unpack(const byte *src, uint32 srcSize, int32 &size, uint8 compression = 1);
+ static Common::SeekableReadStream *unpack(Common::SeekableReadStream &src, uint8 compression = 1);
private:
static const int kMaxArchives = 8;
@@ -70,12 +70,12 @@ private:
Common::String name;
uint32 size;
uint32 offset;
- bool packed;
+ uint8 compression;
Archive *archive;
File();
- File(const Common::String &n, uint32 s, uint32 o, bool p, Archive &a);
+ File(const Common::String &n, uint32 s, uint32 o, uint8 c, Archive &a);
};
typedef Common::HashMap<Common::String, File, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap;
@@ -99,7 +99,12 @@ private:
Common::SeekableReadStream *getFile(File &file);
byte *getFile(File &file, int32 &size);
- static void unpack(Common::SeekableReadStream &src, byte *dest, uint32 size);
+ static byte *unpack(Common::SeekableReadStream &src, int32 &size, uint8 compression, bool useMalloc);
+
+ static uint32 getSizeChunks(Common::SeekableReadStream &src);
+
+ static void unpackChunks(Common::SeekableReadStream &src, byte *dest, uint32 size);
+ static void unpackChunk (Common::SeekableReadStream &src, byte *dest, uint32 size);
};
} // End of namespace Gob
diff --git a/engines/gob/decfile.cpp b/engines/gob/decfile.cpp
new file mode 100644
index 0000000000..f5910f0654
--- /dev/null
+++ b/engines/gob/decfile.cpp
@@ -0,0 +1,214 @@
+/* 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.
+ *
+ */
+
+#include "common/str.h"
+#include "common/stream.h"
+#include "common/substream.h"
+
+#include "gob/gob.h"
+#include "gob/util.h"
+#include "gob/dataio.h"
+#include "gob/surface.h"
+#include "gob/video.h"
+#include "gob/rxyfile.h"
+#include "gob/decfile.h"
+
+namespace Gob {
+
+DECFile::Layer::Layer() : surface(0), coordinates(0) {
+}
+
+DECFile::Layer::~Layer() {
+ delete coordinates;
+ delete surface;
+}
+
+
+DECFile::DECFile(GobEngine *vm, const Common::String &fileName,
+ uint16 width, uint16 height, uint8 bpp) : _vm(vm),
+ _width(width), _height(height), _bpp(bpp), _hasPadding(false) {
+
+ _backdrop = new Surface(_width, _height, _bpp);
+
+ Common::SeekableReadStream *dec = _vm->_dataIO->getFile(fileName);
+ if (dec) {
+ Common::SeekableSubReadStreamEndian sub(dec, 0, dec->size(), false, DisposeAfterUse::YES);
+
+ load(sub, fileName);
+ return;
+ }
+
+ // File doesn't exist, try to open the big-endian'd alternate file
+ Common::String alternateFileName = fileName;
+ alternateFileName.setChar('_', 0);
+
+ dec = _vm->_dataIO->getFile(alternateFileName);
+ if (dec) {
+ Common::SeekableSubReadStreamEndian sub(dec, 0, dec->size(), true, DisposeAfterUse::YES);
+
+ // The big endian version pads a few fields to even size
+ _hasPadding = true;
+
+ load(sub, fileName);
+ return;
+ }
+
+ warning("DECFile::DECFile(): No such file \"%s\"", fileName.c_str());
+}
+
+DECFile::~DECFile() {
+ delete _backdrop;
+}
+
+void DECFile::load(Common::SeekableSubReadStreamEndian &dec, const Common::String &fileName) {
+ dec.skip(2); // Unused
+
+ int16 backdropCount = dec.readUint16();
+ int16 layerCount = dec.readUint16();
+
+ // Sanity checks
+ if (backdropCount > 1)
+ warning("DECFile::load(): More than one backdrop (%d) in file \"%s\"",
+ backdropCount, fileName.c_str());
+ if (layerCount < 1)
+ warning("DECFile::load(): Less than one layer (%d) in file \"%s\"",
+ layerCount, fileName.c_str());
+
+ // Load the backdrop
+ if (backdropCount > 0) {
+ loadBackdrop(dec);
+
+ // We only support one backdrop, skip the rest
+ dec.skip((backdropCount - 1) * (13 + (_hasPadding ? 1 : 0)));
+ }
+
+ // Load the layers
+ _layers.resize(MAX(0, layerCount - 1));
+ for (LayerArray::iterator l = _layers.begin(); l != _layers.end(); ++l)
+ loadLayer(*l, dec);
+
+ // Load the backdrop parts
+ if (backdropCount > 0)
+ loadParts(dec);
+}
+
+void DECFile::loadBackdrop(Common::SeekableSubReadStreamEndian &dec) {
+ // Interestingly, DEC files reference "FOO.LBM" instead of "FOO.CMP"
+ Common::String file = Util::setExtension(Util::readString(dec, 13), ".CMP");
+ if (_hasPadding)
+ dec.skip(1);
+
+ if (file.empty() || !_vm->_dataIO->hasFile(file))
+ return;
+
+ _vm->_video->drawPackedSprite(file.c_str(), *_backdrop);
+}
+
+void DECFile::loadLayer(Layer &layer, Common::SeekableSubReadStreamEndian &dec) {
+ Common::String file = Util::readString(dec, 13);
+ if (_hasPadding)
+ dec.skip(1);
+
+ if (file.empty())
+ return;
+
+ Common::String fileRXY = Util::setExtension(file, ".RXY");
+ Common::String fileCMP = Util::setExtension(file, ".CMP");
+ if (!_vm->_dataIO->hasFile(fileRXY) || !_vm->_dataIO->hasFile(fileCMP))
+ return;
+
+ loadLayer(layer, fileRXY, fileCMP);
+}
+
+void DECFile::loadLayer(Layer &layer, const Common::String &fileRXY,
+ const Common::String &fileCMP) {
+
+ Common::SeekableReadStream *dataRXY = _vm->_dataIO->getFile(fileRXY);
+ if (!dataRXY)
+ return;
+
+ layer.coordinates = new RXYFile(*dataRXY);
+ layer.surface = new Surface(_width, layer.coordinates->getHeight(), _bpp);
+
+ _vm->_video->drawPackedSprite(fileCMP.c_str(), *layer.surface);
+}
+
+void DECFile::loadParts(Common::SeekableSubReadStreamEndian &dec) {
+ dec.skip(13); // Name
+ if (_hasPadding)
+ dec.skip(1);
+
+ dec.skip(13); // File?
+ if (_hasPadding)
+ dec.skip(1);
+
+ uint16 partCount = dec.readUint16();
+
+ _parts.resize(partCount);
+ for (PartArray::iterator p = _parts.begin(); p != _parts.end(); ++p)
+ loadPart(*p, dec);
+}
+
+void DECFile::loadPart(Part &part, Common::SeekableSubReadStreamEndian &dec) {
+ part.layer = dec.readByte() - 1;
+ part.part = dec.readByte();
+
+ dec.skip(1); // Unknown
+
+ part.x = dec.readUint16();
+ part.y = dec.readUint16();
+
+ part.transp = dec.readByte() != 0;
+}
+
+void DECFile::draw(Surface &dest) const {
+ drawBackdrop(dest);
+
+ for (PartArray::const_iterator p = _parts.begin(); p != _parts.end(); ++p)
+ drawLayer(dest, p->layer, p->part, p->x, p->y, p->transp ? 0 : -1);
+}
+
+void DECFile::drawBackdrop(Surface &dest) const {
+ dest.blit(*_backdrop);
+}
+
+void DECFile::drawLayer(Surface &dest, uint16 layer, uint16 part,
+ uint16 x, uint16 y, int32 transp) const {
+
+ if (layer >= _layers.size())
+ return;
+
+ const Layer &l = _layers[layer];
+ if (!l.surface || !l.coordinates)
+ return;
+
+ if (part >= l.coordinates->size())
+ return;
+
+ const RXYFile::Coordinates &c = (*l.coordinates)[part];
+ if (c.left == 0xFFFF)
+ return;
+
+ dest.blit(*l.surface, c.left, c.top, c.right, c.bottom, x, y, transp);
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/decfile.h b/engines/gob/decfile.h
new file mode 100644
index 0000000000..31d90180d3
--- /dev/null
+++ b/engines/gob/decfile.h
@@ -0,0 +1,111 @@
+/* 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 GOB_DECFILE_H
+#define GOB_DECFILE_H
+
+#include "common/system.h"
+
+namespace Common {
+ class String;
+ class SeekableSubReadStreamEndian;
+}
+
+namespace Gob {
+
+class GobEngine;
+class Surface;
+class RXYFile;
+
+/** A DEC file, describing a "decal" (background).
+ *
+ * Used in hardcoded "actiony" parts of gob games.
+ * The principle is similar to a Static in Scenery (see scenery.cpp), but
+ * instead of referencing indices in the sprites array, DECs reference sprites
+ * directly by filename.
+ */
+class DECFile {
+public:
+ DECFile(GobEngine *vm, const Common::String &fileName,
+ uint16 width, uint16 height, uint8 bpp = 1);
+ ~DECFile();
+
+ /** Draw the background, including all default layer parts. */
+ void draw(Surface &dest) const;
+
+ /** Explicitly draw the backdrop. */
+ void drawBackdrop(Surface &dest) const;
+
+ /** Explicitly draw a layer part. */
+ void drawLayer(Surface &dest, uint16 layer, uint16 part,
+ uint16 x, uint16 y, int32 transp = -1) const;
+
+private:
+ struct Layer {
+ Surface *surface; ///< The surface containing the layer sprite.
+ RXYFile *coordinates; ///< The coordinates describing the layer sprite parts.
+
+ Layer();
+ ~Layer();
+ };
+
+ struct Part {
+ uint8 layer;
+ uint8 part;
+
+ uint16 x;
+ uint16 y;
+ bool transp;
+ };
+
+ typedef Common::Array<Layer> LayerArray;
+ typedef Common::Array<Part> PartArray;
+
+ GobEngine *_vm;
+
+ uint16 _width;
+ uint16 _height;
+ uint8 _bpp;
+
+ byte _hasPadding;
+
+ Surface *_backdrop;
+
+ LayerArray _layers;
+ PartArray _parts;
+
+
+ void load(Common::SeekableSubReadStreamEndian &dec, const Common::String &fileName);
+
+ void loadBackdrop(Common::SeekableSubReadStreamEndian &dec);
+
+ void loadLayer(Layer &layer, Common::SeekableSubReadStreamEndian &dec);
+ void loadLayer(Layer &layer, const Common::String &fileRXY,
+ const Common::String &fileCMP);
+
+ void loadParts(Common::SeekableSubReadStreamEndian &dec);
+ void loadPart(Part &part, Common::SeekableSubReadStreamEndian &dec);
+};
+
+} // End of namespace Gob
+
+#endif // GOB_DECFILE_H
diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp
index 9a554b5429..17a2ae3da8 100644
--- a/engines/gob/detection.cpp
+++ b/engines/gob/detection.cpp
@@ -91,7 +91,7 @@ class GobMetaEngine : public AdvancedMetaEngine {
public:
GobMetaEngine() : AdvancedMetaEngine(Gob::gameDescriptions, sizeof(Gob::GOBGameDescription), gobGames) {
_singleid = "gob";
- _guioptions = Common::GUIO_NOLAUNCHLOAD;
+ _guioptions = GUIO1(GUIO_NOLAUNCHLOAD);
}
virtual GameDescriptor findGame(const char *gameid) const {
diff --git a/engines/gob/detection_tables.h b/engines/gob/detection_tables.h
index 1c9811fe9e..636044975a 100644
--- a/engines/gob/detection_tables.h
+++ b/engines/gob/detection_tables.h
@@ -22,10 +22,6 @@
namespace Gob {
-using Common::GUIO_NOSPEECH;
-using Common::GUIO_NOSUBTITLES;
-using Common::GUIO_NONE;
-
static const GOBGameDescription gameDescriptions[] = {
{ // Supplied by Florian Zeitz on scummvm-devel
{
@@ -35,7 +31,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesEGA,
@@ -49,7 +45,7 @@ static const GOBGameDescription gameDescriptions[] = {
RU_RUS,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesEGA,
@@ -63,7 +59,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesNone,
@@ -77,7 +73,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -91,7 +87,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesNone,
@@ -105,7 +101,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -119,7 +115,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -133,7 +129,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -147,7 +143,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -161,7 +157,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -179,7 +175,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -197,7 +193,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -215,7 +211,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -233,7 +229,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -251,7 +247,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -269,7 +265,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -287,7 +283,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -305,7 +301,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -323,7 +319,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -341,7 +337,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -355,7 +351,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -369,7 +365,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -383,7 +379,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -397,7 +393,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -411,7 +407,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -425,7 +421,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -439,7 +435,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -453,7 +449,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -467,7 +463,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -481,7 +477,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -495,7 +491,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -509,7 +505,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -523,7 +519,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -537,7 +533,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -551,7 +547,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -565,7 +561,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -579,7 +575,7 @@ static const GOBGameDescription gameDescriptions[] = {
HU_HUN,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -593,7 +589,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -607,7 +603,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -621,7 +617,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -635,7 +631,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformAmiga,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesNone,
@@ -649,7 +645,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesNone,
@@ -663,7 +659,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesNone,
@@ -677,7 +673,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesNone,
@@ -691,7 +687,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformCDi,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesAdLib,
@@ -705,7 +701,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesNone,
@@ -719,7 +715,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesNone,
@@ -733,7 +729,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesNone,
@@ -747,7 +743,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesNone,
@@ -765,7 +761,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -783,7 +779,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -797,7 +793,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -811,7 +807,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -825,7 +821,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -839,7 +835,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -853,7 +849,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -867,7 +863,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -881,7 +877,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -895,7 +891,7 @@ static const GOBGameDescription gameDescriptions[] = {
RU_RUS,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -909,7 +905,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -927,7 +923,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -945,7 +941,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -963,7 +959,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -981,7 +977,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -999,7 +995,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -1017,7 +1013,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -1031,7 +1027,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -1045,7 +1041,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -1059,7 +1055,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1073,7 +1069,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1087,7 +1083,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1101,7 +1097,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1115,7 +1111,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1129,7 +1125,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1143,7 +1139,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1157,7 +1153,7 @@ static const GOBGameDescription gameDescriptions[] = {
HU_HUN,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1171,7 +1167,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1185,7 +1181,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1199,7 +1195,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1213,7 +1209,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -1227,7 +1223,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -1241,7 +1237,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -1255,7 +1251,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformAmiga,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesNone,
@@ -1269,7 +1265,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformAmiga,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesNone,
@@ -1287,7 +1283,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesNone,
@@ -1301,7 +1297,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesNone,
@@ -1315,7 +1311,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesNone,
@@ -1329,7 +1325,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesNone,
@@ -1347,7 +1343,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesNone,
@@ -1365,7 +1361,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesNone,
@@ -1379,7 +1375,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesNone,
@@ -1393,7 +1389,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1407,7 +1403,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1421,7 +1417,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1435,7 +1431,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1449,7 +1445,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1463,7 +1459,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1477,7 +1473,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1491,7 +1487,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWeen,
kFeaturesAdLib,
@@ -1505,7 +1501,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -1519,7 +1515,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -1533,7 +1529,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -1547,7 +1543,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -1561,7 +1557,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -1575,7 +1571,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -1589,7 +1585,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -1603,7 +1599,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1617,7 +1613,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1631,7 +1627,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1645,7 +1641,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1659,7 +1655,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1677,7 +1673,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesNone,
@@ -1691,7 +1687,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1705,7 +1701,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1719,7 +1715,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1733,7 +1729,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1747,7 +1743,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1761,7 +1757,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1775,7 +1771,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1789,7 +1785,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1803,7 +1799,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1817,7 +1813,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib | kFeaturesEGA,
@@ -1833,7 +1829,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_PIRATED,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -1847,7 +1843,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -1861,7 +1857,7 @@ static const GOBGameDescription gameDescriptions[] = {
HE_ISR,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -1875,7 +1871,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -1889,7 +1885,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -1907,7 +1903,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -1921,7 +1917,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -1935,7 +1931,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -1949,7 +1945,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -1963,7 +1959,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -1977,7 +1973,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -1991,7 +1987,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -2005,7 +2001,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -2019,7 +2015,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -2033,7 +2029,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -2047,7 +2043,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -2061,7 +2057,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -2075,7 +2071,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -2089,7 +2085,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2103,7 +2099,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2117,7 +2113,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2131,7 +2127,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2145,7 +2141,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2159,7 +2155,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2177,7 +2173,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2195,7 +2191,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2209,7 +2205,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2227,7 +2223,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2241,7 +2237,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2255,7 +2251,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -2269,7 +2265,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesAdLib,
@@ -2283,7 +2279,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesAdLib,
@@ -2297,7 +2293,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesAdLib,
@@ -2311,7 +2307,7 @@ static const GOBGameDescription gameDescriptions[] = {
HE_ISR,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesAdLib,
@@ -2325,7 +2321,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesAdLib,
@@ -2339,7 +2335,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesAdLib,
@@ -2353,7 +2349,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesNone,
@@ -2367,7 +2363,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesNone,
@@ -2381,7 +2377,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesNone,
@@ -2395,7 +2391,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesNone,
@@ -2409,7 +2405,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformAtariST,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesNone,
@@ -2423,7 +2419,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
kGameTypeFascination,
kFeaturesCD,
@@ -2437,7 +2433,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
kGameTypeFascination,
kFeaturesCD,
@@ -2451,7 +2447,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
kGameTypeFascination,
kFeaturesCD,
@@ -2465,7 +2461,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
kGameTypeFascination,
kFeaturesCD,
@@ -2479,7 +2475,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ GUIO1(GUIO_NOSUBTITLES)
},
kGameTypeFascination,
kFeaturesCD,
@@ -2493,10 +2489,10 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGeisha,
- kFeaturesNone,
+ kFeaturesEGA | kFeaturesAdLib,
"disk1.stk", "intro.tot", 0
},
{
@@ -2507,10 +2503,24 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGeisha,
- kFeaturesNone,
+ kFeaturesEGA | kFeaturesAdLib,
+ "disk1.stk", "intro.tot", 0
+ },
+ {
+ {
+ "geisha",
+ "",
+ AD_ENTRY1s("disk1.stk", "e5892f00917c62423e93f5fd9920cf47", 208120),
+ UNK_LANG,
+ kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
+ },
+ kGameTypeGeisha,
+ kFeaturesEGA,
"disk1.stk", "intro.tot", 0
},
{
@@ -2521,7 +2531,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2535,7 +2545,7 @@ static const GOBGameDescription gameDescriptions[] = {
HE_ISR,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2549,7 +2559,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2567,7 +2577,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2585,7 +2595,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2603,7 +2613,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2621,7 +2631,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2635,7 +2645,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2649,7 +2659,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2663,7 +2673,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2677,7 +2687,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2691,7 +2701,7 @@ static const GOBGameDescription gameDescriptions[] = {
RU_RUS,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2705,7 +2715,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2719,7 +2729,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2733,7 +2743,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesNone,
@@ -2747,7 +2757,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesNone,
@@ -2765,7 +2775,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2783,7 +2793,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2801,7 +2811,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2815,7 +2825,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2829,7 +2839,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2843,7 +2853,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2857,7 +2867,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2871,7 +2881,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2885,7 +2895,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2899,7 +2909,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2913,7 +2923,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2927,7 +2937,7 @@ static const GOBGameDescription gameDescriptions[] = {
HU_HUN,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2941,7 +2951,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2955,7 +2965,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2969,7 +2979,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -2983,7 +2993,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -2997,7 +3007,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -3011,7 +3021,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -3025,7 +3035,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -3039,7 +3049,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesCD,
@@ -3053,7 +3063,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesCD,
@@ -3067,7 +3077,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesCD,
@@ -3081,7 +3091,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesCD,
@@ -3095,7 +3105,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesCD,
@@ -3109,7 +3119,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3123,7 +3133,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3137,7 +3147,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3151,7 +3161,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3165,7 +3175,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3179,7 +3189,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3193,7 +3203,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3207,7 +3217,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib,
@@ -3234,7 +3244,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeInca2,
kFeaturesAdLib | kFeaturesBATDemo,
@@ -3248,7 +3258,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3262,7 +3272,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3276,7 +3286,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3290,7 +3300,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3304,7 +3314,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3318,7 +3328,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3332,7 +3342,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3346,7 +3356,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3360,7 +3370,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3374,7 +3384,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3388,7 +3398,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3402,7 +3412,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3416,7 +3426,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3430,7 +3440,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3444,7 +3454,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3458,7 +3468,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3472,7 +3482,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3486,7 +3496,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3500,7 +3510,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3514,7 +3524,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3528,7 +3538,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3542,7 +3552,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3556,7 +3566,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3570,7 +3580,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3584,7 +3594,7 @@ static const GOBGameDescription gameDescriptions[] = {
PL_POL,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -3602,7 +3612,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -3616,7 +3626,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3630,7 +3640,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3644,7 +3654,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3658,7 +3668,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3672,7 +3682,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3686,7 +3696,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3700,7 +3710,7 @@ static const GOBGameDescription gameDescriptions[] = {
UNK_LANG,
kPlatformWindows,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3714,7 +3724,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformWindows,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeDynasty,
kFeatures640x480,
@@ -3728,7 +3738,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -3742,7 +3752,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_USA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -3756,7 +3766,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -3770,7 +3780,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -3784,7 +3794,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -3798,7 +3808,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -3812,7 +3822,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -3831,7 +3841,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor | kFeaturesSCNDemo,
@@ -3849,7 +3859,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -3867,7 +3877,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -3885,7 +3895,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -3903,7 +3913,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -3926,7 +3936,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -3944,7 +3954,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -3966,7 +3976,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -3987,7 +3997,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -4005,7 +4015,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4023,7 +4033,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4041,7 +4051,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4059,7 +4069,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4077,7 +4087,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4095,7 +4105,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4113,7 +4123,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4131,7 +4141,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4149,7 +4159,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4167,7 +4177,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4185,7 +4195,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4203,7 +4213,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4221,7 +4231,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBambou,
kFeatures640x480,
@@ -4239,7 +4249,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4257,7 +4267,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4275,7 +4285,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -4289,7 +4299,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeaturesNone,
@@ -4303,7 +4313,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4317,7 +4327,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4331,7 +4341,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeaturesNone,
@@ -4345,7 +4355,7 @@ static const GOBGameDescription gameDescriptions[] = {
ES_ESP,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4359,7 +4369,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4373,7 +4383,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4387,7 +4397,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4401,7 +4411,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4415,7 +4425,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -4435,7 +4445,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeAdi2,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -4449,7 +4459,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4463,7 +4473,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4477,7 +4487,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4491,7 +4501,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4505,7 +4515,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4519,7 +4529,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4533,7 +4543,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeaturesNone,
@@ -4547,7 +4557,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeaturesNone,
@@ -4561,7 +4571,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeaturesNone,
@@ -4575,7 +4585,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4589,7 +4599,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeaturesNone,
@@ -4603,7 +4613,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4617,7 +4627,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -4631,7 +4641,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_ANY,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -4645,7 +4655,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeAdibou1,
kFeaturesAdLib,
@@ -4659,7 +4669,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4673,7 +4683,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4687,7 +4697,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4701,7 +4711,7 @@ static const GOBGameDescription gameDescriptions[] = {
IT_ITA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4715,7 +4725,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4729,7 +4739,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4743,7 +4753,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4757,7 +4767,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4771,7 +4781,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4785,7 +4795,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeAdibou2,
kFeaturesNone,
@@ -4803,7 +4813,7 @@ static const GOBGameDescription gameDescriptions[] = {
EN_GRB,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeAdibou2,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -4821,7 +4831,7 @@ static const GOBGameDescription gameDescriptions[] = {
DE_DEU,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeAdibou2,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -4839,7 +4849,7 @@ static const GOBGameDescription gameDescriptions[] = {
FR_FRA,
kPlatformPC,
ADGF_DEMO,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeAdibou2,
kFeatures640x480 | kFeaturesSCNDemo,
@@ -4857,7 +4867,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesNone,
@@ -4871,7 +4881,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob1,
kFeaturesCD,
@@ -4885,7 +4895,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -4899,7 +4909,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesAdLib,
@@ -4913,7 +4923,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob2,
kFeaturesCD,
@@ -4927,7 +4937,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBargon,
kFeaturesNone,
@@ -4941,7 +4951,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesAdLib,
@@ -4955,7 +4965,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGob3,
kFeaturesCD,
@@ -4969,7 +4979,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeWoodruff,
kFeatures640x480,
@@ -4983,7 +4993,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -4997,7 +5007,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesAdLib,
@@ -5011,7 +5021,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeLostInTime,
kFeaturesCD,
@@ -5025,7 +5035,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeUrban,
kFeatures640x480 | kFeaturesTrueColor,
@@ -5039,7 +5049,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -5053,7 +5063,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -5067,7 +5077,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -5081,7 +5091,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -5095,7 +5105,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -5109,7 +5119,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypePlaytoons,
kFeatures640x480,
@@ -5123,7 +5133,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeBambou,
kFeatures640x480,
@@ -5137,7 +5147,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeFascination,
kFeaturesNone,
@@ -5151,10 +5161,10 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeGeisha,
- kFeaturesNone,
+ kFeaturesEGA,
"disk1.stk", "intro.tot", 0
},
{ //22
@@ -5165,7 +5175,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeAdi2,
kFeatures640x480,
@@ -5179,7 +5189,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
},
kGameTypeAdi4,
kFeatures640x480,
@@ -5193,7 +5203,7 @@ static const GOBGameDescription fallbackDescs[] = {
UNK_LANG,
kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeUrban,
kFeaturesAdLib | kFeatures640x480 | kFeaturesSCNDemo,
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index 580696523f..4b659f51de 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -107,6 +107,9 @@ Draw::Draw(GobEngine *vm) : _vm(vm) {
_cursorHotspotXVar = -1;
_cursorHotspotYVar = -1;
+ _cursorHotspotX = -1;
+ _cursorHotspotY = -1;
+
_cursorAnim = 0;
for (int i = 0; i < 40; i++) {
_cursorAnimLow[i] = 0;
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index 57faefa314..393822c33a 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -133,6 +133,9 @@ public:
int32 _cursorHotspotXVar;
int32 _cursorHotspotYVar;
+ int32 _cursorHotspotX;
+ int32 _cursorHotspotY;
+
SurfacePtr _cursorSprites;
SurfacePtr _cursorSpritesBack;
SurfacePtr _scummvmCursor;
diff --git a/engines/gob/draw_v1.cpp b/engines/gob/draw_v1.cpp
index 3873a99d5f..8cb88b522c 100644
--- a/engines/gob/draw_v1.cpp
+++ b/engines/gob/draw_v1.cpp
@@ -44,8 +44,8 @@ void Draw_v1::initScreen() {
_backSurface = _vm->_video->initSurfDesc(320, 200);
_frontSurface = _vm->_global->_primarySurfDesc;
- _cursorSprites = _vm->_video->initSurfDesc(32, 16, 2);
- _scummvmCursor = _vm->_video->initSurfDesc(16, 16, SCUMMVM_CURSOR);
+ _cursorSprites = _vm->_video->initSurfDesc(_cursorWidth * 2, _cursorHeight, 2);
+ _scummvmCursor = _vm->_video->initSurfDesc(_cursorWidth , _cursorHeight, SCUMMVM_CURSOR);
}
void Draw_v1::closeScreen() {
@@ -112,6 +112,9 @@ void Draw_v1::animateCursor(int16 cursor) {
if (_cursorHotspotXVar != -1) {
newX -= hotspotX = (uint16) VAR(_cursorIndex + _cursorHotspotXVar);
newY -= hotspotY = (uint16) VAR(_cursorIndex + _cursorHotspotYVar);
+ } else if (_cursorHotspotX != -1) {
+ newX -= hotspotX = _cursorHotspotX;
+ newY -= hotspotY = _cursorHotspotY;
}
_scummvmCursor->clear();
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index cc8f6b5e3c..6e64d6fd06 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -138,6 +138,9 @@ void Draw_v2::animateCursor(int16 cursor) {
if (_cursorHotspotXVar != -1) {
newX -= hotspotX = (uint16) VAR(_cursorIndex + _cursorHotspotXVar);
newY -= hotspotY = (uint16) VAR(_cursorIndex + _cursorHotspotYVar);
+ } else if (_cursorHotspotX != -1) {
+ newX -= hotspotX = _cursorHotspotX;
+ newY -= hotspotY = _cursorHotspotY;
}
_scummvmCursor->clear();
@@ -916,4 +919,3 @@ void Draw_v2::spriteOperation(int16 operation) {
}
} // End of namespace Gob
-
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 926027e15d..502a440005 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -492,9 +492,6 @@ void Game::prepareStart() {
_vm->_draw->_noInvalidated = true;
_vm->_draw->_applyPal = false;
_vm->_draw->_paletteCleared = false;
- _vm->_draw->_cursorWidth = 16;
- _vm->_draw->_cursorHeight = 16;
- _vm->_draw->_transparentCursor = 1;
for (int i = 0; i < 40; i++) {
_vm->_draw->_cursorAnimLow[i] = -1;
@@ -586,7 +583,11 @@ void Game::playTot(int16 function) {
WRITE_VAR(13, _vm->_global->_useMouse);
WRITE_VAR(14, _vm->_global->_soundFlags);
WRITE_VAR(15, _vm->_global->_fakeVideoMode);
- WRITE_VAR(16, _vm->_global->_language);
+
+ if (_vm->getGameType() == kGameTypeGeisha)
+ WRITE_VAR(57, _vm->_global->_language);
+ else
+ WRITE_VAR(16, _vm->_global->_language);
// WORKAROUND: Inca2 seems to depend on that variable to be cleared
if (_vm->getGameType() == kGameTypeInca2)
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index ea7e329480..51a117b7ec 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -402,7 +402,6 @@ bool GobEngine::initGameParts() {
_game = new Game(this);
switch (_gameType) {
- case kGameTypeGeisha:
case kGameTypeGob1:
_init = new Init_v1(this);
_video = new Video_v1(this);
@@ -414,6 +413,18 @@ bool GobEngine::initGameParts() {
_scenery = new Scenery_v1(this);
break;
+ case kGameTypeGeisha:
+ _init = new Init_Geisha(this);
+ _video = new Video_v1(this);
+ _inter = new Inter_Geisha(this);
+ _mult = new Mult_v1(this);
+ _draw = new Draw_v1(this);
+ _map = new Map_v1(this);
+ _goblin = new Goblin_v1(this);
+ _scenery = new Scenery_v1(this);
+ _saveLoad = new SaveLoad_Geisha(this, _targetName.c_str());
+ break;
+
case kGameTypeFascination:
_init = new Init_Fascination(this);
_video = new Video_v2(this);
diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp
index f3647af76e..5e0af847de 100644
--- a/engines/gob/hotspots.cpp
+++ b/engines/gob/hotspots.cpp
@@ -202,6 +202,8 @@ Hotspots::Hotspots(GobEngine *vm) : _vm(vm) {
_currentKey = 0;
_currentIndex = 0;
_currentId = 0;
+ _currentX = 0;
+ _currentY = 0;
}
Hotspots::~Hotspots() {
@@ -385,6 +387,8 @@ void Hotspots::push(uint8 all, bool force) {
backup.key = _currentKey;
backup.id = _currentId;
backup.index = _currentIndex;
+ backup.x = _currentX;
+ backup.y = _currentY;
backup.hotspots = new Hotspot[size];
@@ -415,6 +419,8 @@ void Hotspots::push(uint8 all, bool force) {
_currentKey = 0;
_currentId = 0;
_currentIndex = 0;
+ _currentX = 0;
+ _currentY = 0;
_stack.push(backup);
}
@@ -445,6 +451,8 @@ void Hotspots::pop() {
_currentKey = backup.key;
_currentId = backup.id;
_currentIndex = backup.index;
+ _currentX = backup.x;
+ _currentY = backup.y;
delete[] backup.hotspots;
}
@@ -498,6 +506,9 @@ void Hotspots::enter(uint16 index) {
(spot.getState() == (kStateFilled | kStateType2)))
WRITE_VAR(17, -(spot.id & 0x0FFF));
+ _currentX = _vm->_global->_inter_mouseX;
+ _currentY = _vm->_global->_inter_mouseY;
+
if (spot.funcEnter != 0)
call(spot.funcEnter);
}
@@ -649,9 +660,22 @@ bool Hotspots::checkHotspotChanged() {
// Get the current hotspot
key = checkMouse(kTypeMove, id, index);
- if (key == _currentKey)
- // Nothing changed => nothing to do
+ uint16 mouseX = _vm->_global->_inter_mouseX;
+ uint16 mouseY = _vm->_global->_inter_mouseY;
+
+ if (key == _currentKey) {
+ // Still the same hotspot, just update the mouse position
+
+ _currentX = mouseX;
+ _currentY = mouseY;
return false;
+ }
+
+ // In Geisha, no move hotspot changes should occur when
+ // we didn't actually move the mouse
+ if (_vm->getGameType() == kGameTypeGeisha)
+ if ((mouseX == _currentX) && (mouseY == _currentY))
+ return false;
// Leave the old area
if (isValid(_currentKey, _currentId,_currentIndex))
@@ -660,6 +684,8 @@ bool Hotspots::checkHotspotChanged() {
_currentKey = key;
_currentId = id;
_currentIndex = index;
+ _currentX = mouseX;
+ _currentY = mouseY;
// Enter the new one
if (isValid(key, id, index))
@@ -775,7 +801,8 @@ uint16 Hotspots::check(uint8 handleMouse, int16 delay, uint16 &id, uint16 &index
_vm->_draw->blitCursor();
- if ((key != _currentKey) && (_vm->getGameType() != kGameTypeFascination))
+ if ((key != _currentKey) && (_vm->getGameType() != kGameTypeFascination) &&
+ (_vm->getGameType() != kGameTypeGeisha))
// If the hotspot changed, leave the old one
// Code not present in Fascination executables
leave(_currentIndex);
@@ -1348,12 +1375,12 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
inputs[inputCount].str = 0;
if ((type >= kTypeInput2NoLeave) && (type <= kTypeInput3Leave)) {
- uint16 length = _vm->_game->_script->readUint16();
+ inputs[inputCount].length = _vm->_game->_script->readUint16();
inputs[inputCount].str =
(const char *)(_vm->_game->_script->getData() + _vm->_game->_script->pos());
- _vm->_game->_script->skip(length);
+ _vm->_game->_script->skip(inputs[inputCount].length);
}
if (left == 0xFFFF) {
diff --git a/engines/gob/hotspots.h b/engines/gob/hotspots.h
index 8d26ad224e..b348f9cd70 100644
--- a/engines/gob/hotspots.h
+++ b/engines/gob/hotspots.h
@@ -158,6 +158,8 @@ private:
uint32 key;
uint32 id;
uint32 index;
+ uint16 x;
+ uint16 y;
};
struct InputDesc {
@@ -178,6 +180,8 @@ private:
uint16 _currentKey;
uint16 _currentIndex;
uint16 _currentId;
+ uint16 _currentX;
+ uint16 _currentY;
/** Add a hotspot, returning the new index. */
uint16 add(const Hotspot &hotspot);
diff --git a/engines/gob/init.cpp b/engines/gob/init.cpp
index 90c2a1602a..a61261f355 100644
--- a/engines/gob/init.cpp
+++ b/engines/gob/init.cpp
@@ -40,7 +40,7 @@
namespace Gob {
-const char *Init::_fontNames[] = { "jeulet1.let", "jeulet2.let", "jeucar1.let", "jeumath.let" };
+const char *const Init::_fontNames[] = { "jeulet1.let", "jeulet2.let", "jeucar1.let", "jeumath.let" };
Init::Init(GobEngine *vm) : _vm(vm) {
_palDesc = 0;
diff --git a/engines/gob/init.h b/engines/gob/init.h
index 1cb2904099..946a3fa4f1 100644
--- a/engines/gob/init.h
+++ b/engines/gob/init.h
@@ -41,7 +41,7 @@ public:
protected:
Video::PalDesc *_palDesc;
- static const char *_fontNames[4];
+ static const char *const _fontNames[4];
GobEngine *_vm;
void cleanup();
@@ -56,6 +56,15 @@ public:
void initVideo();
};
+class Init_Geisha : public Init_v1 {
+public:
+ Init_Geisha(GobEngine *vm);
+ ~Init_Geisha();
+
+ void initVideo();
+ void initGame();
+};
+
class Init_v2 : public Init_v1 {
public:
Init_v2(GobEngine *vm);
diff --git a/engines/gob/init_geisha.cpp b/engines/gob/init_geisha.cpp
new file mode 100644
index 0000000000..b5bbcff400
--- /dev/null
+++ b/engines/gob/init_geisha.cpp
@@ -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.
+ *
+ */
+
+#include "common/endian.h"
+
+#include "gob/gob.h"
+#include "gob/init.h"
+#include "gob/global.h"
+#include "gob/draw.h"
+#include "gob/video.h"
+
+namespace Gob {
+
+Init_Geisha::Init_Geisha(GobEngine *vm) : Init_v1(vm) {
+}
+
+Init_Geisha::~Init_Geisha() {
+}
+
+void Init_Geisha::initVideo() {
+ Init_v1::initVideo();
+
+ _vm->_draw->_cursorWidth = 16;
+ _vm->_draw->_cursorHeight = 23;
+ _vm->_draw->_transparentCursor = 1;
+}
+
+void Init_Geisha::initGame() {
+ // HACK - Since the MDY/TBR player is not working, claim we have no AdLib
+ _vm->_global->_soundFlags = 0;
+
+ Init::initGame();
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/init_v1.cpp b/engines/gob/init_v1.cpp
index 6772a13eb0..25d521aca6 100644
--- a/engines/gob/init_v1.cpp
+++ b/engines/gob/init_v1.cpp
@@ -52,6 +52,10 @@ void Init_v1::initVideo() {
_vm->_global->_pPaletteDesc->unused2 = _vm->_global->_unusedPalette2;
_vm->_video->initSurfDesc(320, 200, PRIMARY_SURFACE);
+
+ _vm->_draw->_cursorWidth = 16;
+ _vm->_draw->_cursorHeight = 16;
+ _vm->_draw->_transparentCursor = 1;
}
} // End of namespace Gob
diff --git a/engines/gob/init_v2.cpp b/engines/gob/init_v2.cpp
index f10d586a34..1289d561ea 100644
--- a/engines/gob/init_v2.cpp
+++ b/engines/gob/init_v2.cpp
@@ -62,6 +62,10 @@ void Init_v2::initVideo() {
_vm->_global->_pPaletteDesc->unused2 = _vm->_global->_unusedPalette2;
_vm->_video->initSurfDesc(_vm->_video->_surfWidth, _vm->_video->_surfHeight, PRIMARY_SURFACE);
+
+ _vm->_draw->_cursorWidth = 16;
+ _vm->_draw->_cursorHeight = 16;
+ _vm->_draw->_transparentCursor = 1;
}
} // End of namespace Gob
diff --git a/engines/gob/init_v6.cpp b/engines/gob/init_v6.cpp
index 947556835a..6059ec89ed 100644
--- a/engines/gob/init_v6.cpp
+++ b/engines/gob/init_v6.cpp
@@ -46,9 +46,8 @@ void Init_v6::initGame() {
// WORKAROUND: The CD number detection in Urban Runner is quite daft
// (it checks CD1.ITK - CD4.ITK and the first that's found determines
- // the CD number), while its NO_CD modus wants everything in CD1.ITK.
+ // the CD number), while its NO_CD mode wants everything in CD1.ITK.
// So we just open the other ITKs, too.
- _vm->_dataIO->openArchive("CD1.ITK", false);
_vm->_dataIO->openArchive("CD2.ITK", false);
_vm->_dataIO->openArchive("CD3.ITK", false);
_vm->_dataIO->openArchive("CD4.ITK", false);
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 78d5e34271..6fd4dc2187 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -33,6 +33,11 @@
namespace Gob {
+namespace Geisha {
+ class Diving;
+ class Penetration;
+}
+
// This is to help devices with small memory (PDA, smartphones, ...)
// to save a bit of memory used by opcode names in the Gob engine.
#ifndef REDUCE_MEMORY_USAGE
@@ -334,6 +339,40 @@ protected:
void manipulateMap(int16 xPos, int16 yPos, int16 item);
};
+class Inter_Geisha : public Inter_v1 {
+public:
+ Inter_Geisha(GobEngine *vm);
+ virtual ~Inter_Geisha();
+
+protected:
+ virtual void setupOpcodesDraw();
+ virtual void setupOpcodesFunc();
+ virtual void setupOpcodesGob();
+
+ void oGeisha_loadCursor(OpFuncParams &params);
+ void oGeisha_loadTot(OpFuncParams &params);
+ void oGeisha_goblinFunc(OpFuncParams &params);
+ void oGeisha_loadSound(OpFuncParams &params);
+ void oGeisha_checkData(OpFuncParams &params);
+ void oGeisha_readData(OpFuncParams &params);
+ void oGeisha_writeData(OpFuncParams &params);
+
+ void oGeisha_gamePenetration(OpGobParams &params);
+ void oGeisha_gameDiving(OpGobParams &params);
+ void oGeisha_loadTitleMusic(OpGobParams &params);
+ void oGeisha_playMusic(OpGobParams &params);
+ void oGeisha_stopMusic(OpGobParams &params);
+
+ void oGeisha_caress1(OpGobParams &params);
+ void oGeisha_caress2(OpGobParams &params);
+
+ int16 loadSound(int16 slot);
+
+private:
+ Geisha::Diving *_diving;
+ Geisha::Penetration *_penetration;
+};
+
class Inter_v2 : public Inter_v1 {
public:
Inter_v2(GobEngine *vm);
@@ -477,9 +516,14 @@ protected:
virtual void setupOpcodesGob();
void o3_getTotTextItemPart(OpFuncParams &params);
+ void o3_speakerOn(OpFuncParams &params);
+ void o3_speakerOff(OpFuncParams &params);
void o3_copySprite(OpFuncParams &params);
void o3_wobble(OpGobParams &params);
+
+private:
+ bool _ignoreSpeakerOff;
};
class Inter_Inca2 : public Inter_v3 {
diff --git a/engines/gob/inter_bargon.cpp b/engines/gob/inter_bargon.cpp
index c2e6a2e912..134203fa9d 100644
--- a/engines/gob/inter_bargon.cpp
+++ b/engines/gob/inter_bargon.cpp
@@ -120,7 +120,7 @@ void Inter_Bargon::oBargon_intro2(OpGobParams &params) {
SurfacePtr surface;
SoundDesc samples[4];
int16 comp[5] = { 0, 1, 2, 3, -1 };
- static const char *sndFiles[] = {"1INTROII.snd", "2INTROII.snd", "1INTRO3.snd", "2INTRO3.snd"};
+ static const char *const sndFiles[] = {"1INTROII.snd", "2INTROII.snd", "1INTRO3.snd", "2INTRO3.snd"};
surface = _vm->_video->initSurfDesc(320, 200);
_vm->_video->drawPackedSprite("2ille.ims", *surface);
@@ -169,8 +169,8 @@ void Inter_Bargon::oBargon_intro3(OpGobParams &params) {
SoundDesc samples[2];
int16 comp[3] = { 0, 1, -1 };
byte *palettes[4];
- static const char *sndFiles[] = {"1INTROIV.snd", "2INTROIV.snd"};
- static const char *palFiles[] = {"2ou2.clt", "2ou3.clt", "2ou4.clt", "2ou5.clt"};
+ static const char *const sndFiles[] = {"1INTROIV.snd", "2INTROIV.snd"};
+ static const char *const palFiles[] = {"2ou2.clt", "2ou3.clt", "2ou4.clt", "2ou5.clt"};
int32 size;
diff --git a/engines/gob/inter_geisha.cpp b/engines/gob/inter_geisha.cpp
new file mode 100644
index 0000000000..c5b91a484b
--- /dev/null
+++ b/engines/gob/inter_geisha.cpp
@@ -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.
+ *
+ */
+
+#include "common/endian.h"
+#include "common/str.h"
+#include "common/translation.h"
+
+#include "gui/message.h"
+
+#include "gob/gob.h"
+#include "gob/inter.h"
+#include "gob/dataio.h"
+#include "gob/script.h"
+#include "gob/resources.h"
+#include "gob/game.h"
+#include "gob/draw.h"
+#include "gob/video.h"
+#include "gob/save/saveload.h"
+#include "gob/sound/sound.h"
+#include "gob/sound/sounddesc.h"
+
+#include "gob/minigames/geisha/diving.h"
+#include "gob/minigames/geisha/penetration.h"
+
+namespace Gob {
+
+#define OPCODEVER Inter_Geisha
+#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
+#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
+
+Inter_Geisha::Inter_Geisha(GobEngine *vm) : Inter_v1(vm),
+ _diving(0), _penetration(0) {
+
+ _diving = new Geisha::Diving(vm);
+ _penetration = new Geisha::Penetration(vm);
+}
+
+Inter_Geisha::~Inter_Geisha() {
+ delete _penetration;
+ delete _diving;
+}
+
+void Inter_Geisha::setupOpcodesDraw() {
+ Inter_v1::setupOpcodesDraw();
+}
+
+void Inter_Geisha::setupOpcodesFunc() {
+ Inter_v1::setupOpcodesFunc();
+
+ OPCODEFUNC(0x03, oGeisha_loadCursor);
+ OPCODEFUNC(0x12, oGeisha_loadTot);
+ OPCODEFUNC(0x25, oGeisha_goblinFunc);
+ OPCODEFUNC(0x3A, oGeisha_loadSound);
+ OPCODEFUNC(0x3F, oGeisha_checkData);
+ OPCODEFUNC(0x4D, oGeisha_readData);
+ OPCODEFUNC(0x4E, oGeisha_writeData);
+
+ OPCODEGOB(0, oGeisha_gamePenetration);
+ OPCODEGOB(1, oGeisha_gameDiving);
+ OPCODEGOB(2, oGeisha_loadTitleMusic);
+ OPCODEGOB(3, oGeisha_playMusic);
+ OPCODEGOB(4, oGeisha_stopMusic);
+ OPCODEGOB(6, oGeisha_caress1);
+ OPCODEGOB(7, oGeisha_caress2);
+}
+
+void Inter_Geisha::setupOpcodesGob() {
+}
+
+void Inter_Geisha::oGeisha_loadCursor(OpFuncParams &params) {
+ if (_vm->_game->_script->peekByte(1) & 0x80)
+ warning("Geisha Stub: oGeisha_loadCursor: script[1] & 0x80");
+
+ o1_loadCursor(params);
+}
+
+struct TOTTransition {
+ const char *to;
+ const char *from;
+ int32 offset;
+};
+
+static const TOTTransition kTOTTransitions[] = {
+ {"chambre.tot", "photo.tot" , 1801},
+ {"mo.tot" , "chambre.tot", 13580},
+ {"chambre.tot", "mo.tot" , 564},
+ {"hard.tot" , "chambre.tot", 13917},
+ {"carte.tot" , "hard.tot" , 17926},
+ {"chambre.tot", "carte.tot" , 14609},
+ {"chambre.tot", "mo.tot" , 3658},
+ {"streap.tot" , "chambre.tot", 14652},
+ {"bonsai.tot" , "porte.tot" , 2858},
+ {"lit.tot" , "napa.tot" , 3380},
+ {"oko.tot" , "chambre.tot", 14146},
+ {"chambre.tot", "oko.tot" , 2334}
+};
+
+void Inter_Geisha::oGeisha_loadTot(OpFuncParams &params) {
+ o1_loadTot(params);
+
+ // WORKAROUND: Geisha often displays text while it loads a new TOT.
+ // Back in the days, this took long enough so that the text
+ // could be read. Since this isn't the case anymore, we'll
+ // wait for the user to press a key or click the mouse.
+ bool needWait = false;
+
+ for (int i = 0; i < ARRAYSIZE(kTOTTransitions); i++)
+ if ((_vm->_game->_script->pos() == kTOTTransitions[i].offset) &&
+ (_vm->_game->_totToLoad == kTOTTransitions[i].to) &&
+ (_vm->_game->_curTotFile == kTOTTransitions[i].from)) {
+
+ needWait = true;
+ break;
+ }
+
+ if (needWait)
+ while (!_vm->_util->keyPressed())
+ _vm->_util->longDelay(1);
+}
+
+void Inter_Geisha::oGeisha_loadSound(OpFuncParams &params) {
+ loadSound(-1);
+}
+
+void Inter_Geisha::oGeisha_goblinFunc(OpFuncParams &params) {
+ OpGobParams gobParams;
+ int16 cmd;
+
+ cmd = _vm->_game->_script->readInt16();
+
+ gobParams.paramCount = _vm->_game->_script->readInt16();
+ gobParams.extraData = cmd;
+
+ executeOpcodeGob(cmd, gobParams);
+}
+
+int16 Inter_Geisha::loadSound(int16 slot) {
+ const char *sndFile = _vm->_game->_script->evalString();
+
+ if (slot == -1)
+ slot = _vm->_game->_script->readValExpr();
+
+ SoundDesc *sample = _vm->_sound->sampleGetBySlot(slot);
+ if (!sample)
+ return 0;
+
+ int32 dataSize;
+ byte *dataPtr = _vm->_dataIO->getFile(sndFile, dataSize);
+ if (!dataPtr)
+ return 0;
+
+ if (!sample->load(SOUND_SND, dataPtr, dataSize)) {
+ delete[] dataPtr;
+ return 0;
+ }
+
+ return 0;
+}
+
+void Inter_Geisha::oGeisha_checkData(OpFuncParams &params) {
+ Common::String file = _vm->_game->_script->evalString();
+ int16 varOff = _vm->_game->_script->readVarIndex();
+
+ file.toLowercase();
+ if (file.hasSuffix(".0ot"))
+ file.setChar('t', file.size() - 3);
+
+ bool exists = false;
+
+ SaveLoad::SaveMode mode = _vm->_saveLoad->getSaveMode(file.c_str());
+ if (mode == SaveLoad::kSaveModeNone) {
+
+ exists = _vm->_dataIO->hasFile(file);
+ if (!exists)
+ warning("File \"%s\" not found", file.c_str());
+
+ } else if (mode == SaveLoad::kSaveModeSave)
+ exists = _vm->_saveLoad->getSize(file.c_str()) >= 0;
+ else if (mode == SaveLoad::kSaveModeExists)
+ exists = true;
+
+ WRITE_VAR_OFFSET(varOff, exists ? 50 : (uint32)-1);
+}
+
+void Inter_Geisha::oGeisha_readData(OpFuncParams &params) {
+ const char *file = _vm->_game->_script->evalString();
+
+ uint16 dataVar = _vm->_game->_script->readVarIndex();
+
+ debugC(2, kDebugFileIO, "Read from file \"%s\" (%d)", file, dataVar);
+
+ WRITE_VAR(1, 1);
+
+ SaveLoad::SaveMode mode = _vm->_saveLoad->getSaveMode(file);
+ if (mode == SaveLoad::kSaveModeSave) {
+
+ if (!_vm->_saveLoad->load(file, dataVar, 0, 0)) {
+
+ GUI::MessageDialog dialog(_("Failed to load game state from file."));
+ dialog.runModal();
+
+ } else
+ WRITE_VAR(1, 0);
+
+ return;
+
+ } else if (mode == SaveLoad::kSaveModeIgnore) {
+ WRITE_VAR(1, 0);
+ return;
+ }
+
+ warning("Attempted to read from file \"%s\"", file);
+}
+
+void Inter_Geisha::oGeisha_writeData(OpFuncParams &params) {
+ const char *file = _vm->_game->_script->evalString();
+
+ int16 dataVar = _vm->_game->_script->readVarIndex();
+ int32 size = _vm->_game->_script->readValExpr();
+
+ debugC(2, kDebugFileIO, "Write to file \"%s\" (%d, %d bytes)", file, dataVar, size);
+
+ WRITE_VAR(1, 1);
+
+ SaveLoad::SaveMode mode = _vm->_saveLoad->getSaveMode(file);
+ if (mode == SaveLoad::kSaveModeSave) {
+
+ if (!_vm->_saveLoad->save(file, dataVar, size, 0)) {
+
+ GUI::MessageDialog dialog(_("Failed to save game state to file."));
+ dialog.runModal();
+
+ } else
+ WRITE_VAR(1, 0);
+
+ } else if (mode == SaveLoad::kSaveModeIgnore) {
+ WRITE_VAR(1, 0);
+ return;
+ } else if (mode == SaveLoad::kSaveModeNone)
+ warning("Attempted to write to file \"%s\"", file);
+
+ WRITE_VAR(1, 0);
+}
+
+void Inter_Geisha::oGeisha_gamePenetration(OpGobParams &params) {
+ uint16 var1 = _vm->_game->_script->readUint16();
+ uint16 var2 = _vm->_game->_script->readUint16();
+ uint16 var3 = _vm->_game->_script->readUint16();
+ uint16 resultVar = _vm->_game->_script->readUint16();
+
+ bool result = _penetration->play(var1, var2, var3);
+
+ WRITE_VAR_UINT32(resultVar, result ? 1 : 0);
+}
+
+void Inter_Geisha::oGeisha_gameDiving(OpGobParams &params) {
+ uint16 playerCount = _vm->_game->_script->readUint16();
+ uint16 hasPearlLocation = _vm->_game->_script->readUint16();
+ uint16 resultVar = _vm->_game->_script->readUint16();
+
+ bool result = _diving->play(playerCount, hasPearlLocation);
+
+ WRITE_VAR_UINT32(resultVar, result ? 1 : 0);
+}
+
+void Inter_Geisha::oGeisha_loadTitleMusic(OpGobParams &params) {
+ _vm->_sound->adlibLoadTBR("geisha.tbr");
+ _vm->_sound->adlibLoadMDY("geisha.mdy");
+}
+
+void Inter_Geisha::oGeisha_playMusic(OpGobParams &params) {
+ // TODO: The MDYPlayer is still broken!
+ warning("Geisha Stub: oGeisha_playMusic");
+ // _vm->_sound->adlibPlay();
+}
+
+void Inter_Geisha::oGeisha_stopMusic(OpGobParams &params) {
+ _vm->_sound->adlibStop();
+ _vm->_sound->adlibUnload();
+}
+
+void Inter_Geisha::oGeisha_caress1(OpGobParams &params) {
+ if (_vm->_draw->_spritesArray[0])
+ _vm->_video->drawPackedSprite("hp1.cmp", *_vm->_draw->_spritesArray[0]);
+}
+
+void Inter_Geisha::oGeisha_caress2(OpGobParams &params) {
+ if (_vm->_draw->_spritesArray[1])
+ _vm->_video->drawPackedSprite("hpsc1.cmp", *_vm->_draw->_spritesArray[1]);
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index 47b0beaf63..0eb8be1a03 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -658,6 +658,20 @@ void Inter_v1::o1_callSub(OpFuncParams &params) {
return;
}
+ // A cheat to get around the stupid mastermind puzzle in Geisha,
+ // while we're still testing it
+ if ((_vm->getGameType() == kGameTypeGeisha) && (offset == 12934) &&
+ _vm->isCurrentTot("hard.tot") && _vm->_inter->_variables) {
+
+ uint32 digit1 = READ_VARO_UINT32(0x768);
+ uint32 digit2 = READ_VARO_UINT32(0x76C);
+ uint32 digit3 = READ_VARO_UINT32(0x770);
+ uint32 digit4 = READ_VARO_UINT32(0x774);
+ uint32 digit5 = READ_VARO_UINT32(0x778);
+
+ warning("Mastermind solution: %d %d %d %d %d", digit1, digit2, digit3, digit4, digit5);
+ }
+
// Skipping the copy protection screen in Gobliiins
if (!_vm->_copyProtection && (_vm->getGameType() == kGameTypeGob1) && (offset == 3905) &&
_vm->isCurrentTot(_vm->_startTot)) {
@@ -1094,6 +1108,8 @@ void Inter_v1::o1_palLoad(OpFuncParams &params) {
_vm->_draw->_vgaPalette[i].green = _vm->_game->_script->readByte();
_vm->_draw->_vgaPalette[i].blue = _vm->_game->_script->readByte();
}
+
+ memcpy(_vm->_draw->_vgaSmallPalette, _vm->_draw->_vgaPalette, 16 * 3);
break;
case 53:
diff --git a/engines/gob/inter_v3.cpp b/engines/gob/inter_v3.cpp
index 47486b0899..edf56012d9 100644
--- a/engines/gob/inter_v3.cpp
+++ b/engines/gob/inter_v3.cpp
@@ -31,6 +31,7 @@
#include "gob/game.h"
#include "gob/script.h"
#include "gob/resources.h"
+#include "gob/sound/sound.h"
namespace Gob {
@@ -39,7 +40,7 @@ namespace Gob {
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
-Inter_v3::Inter_v3(GobEngine *vm) : Inter_v2(vm) {
+Inter_v3::Inter_v3(GobEngine *vm) : Inter_v2(vm), _ignoreSpeakerOff(false) {
}
void Inter_v3::setupOpcodesDraw() {
@@ -50,6 +51,8 @@ void Inter_v3::setupOpcodesFunc() {
Inter_v2::setupOpcodesFunc();
OPCODEFUNC(0x1A, o3_getTotTextItemPart);
+ OPCODEFUNC(0x22, o3_speakerOn);
+ OPCODEFUNC(0x23, o3_speakerOff);
OPCODEFUNC(0x32, o3_copySprite);
}
@@ -245,6 +248,36 @@ void Inter_v3::o3_getTotTextItemPart(OpFuncParams &params) {
delete textItem;
}
+void Inter_v3::o3_speakerOn(OpFuncParams &params) {
+ int16 frequency = _vm->_game->_script->readValExpr();
+ int32 length = -1;
+
+ _ignoreSpeakerOff = false;
+
+ // WORKAROUND: This is the footsteps sound. The scripts just fire
+ // speaker on" and then a "speaker off" after a short while. Since
+ // we have delay in certain places avoid 100% CPU all the time and
+ // our PC speaker emulator sometimes "swallows" very short beeper
+ // bursts issued in this way, this is in general quite wonky and
+ // prone to fail, as can be seen in bug report #3376547. Therefore,
+ // we explicitely set a length in this case and ignore the next
+ // speaker off command.
+ if (frequency == 50) {
+ length = 5;
+
+ _ignoreSpeakerOff = true;
+ }
+
+ _vm->_sound->speakerOn(frequency, length);
+}
+
+void Inter_v3::o3_speakerOff(OpFuncParams &params) {
+ if (!_ignoreSpeakerOff)
+ _vm->_sound->speakerOff();
+
+ _ignoreSpeakerOff = false;
+}
+
void Inter_v3::o3_copySprite(OpFuncParams &params) {
o1_copySprite(params);
diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp
index 589328dfdb..505993ee4d 100644
--- a/engines/gob/inter_v6.cpp
+++ b/engines/gob/inter_v6.cpp
@@ -21,7 +21,6 @@
*/
#include "common/str.h"
-#include "graphics/dither.h"
#include "gob/gob.h"
#include "gob/inter.h"
diff --git a/engines/gob/minigames/geisha/diving.cpp b/engines/gob/minigames/geisha/diving.cpp
new file mode 100644
index 0000000000..e3bc69a503
--- /dev/null
+++ b/engines/gob/minigames/geisha/diving.cpp
@@ -0,0 +1,439 @@
+/* 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.
+ *
+ */
+
+#include "common/list.h"
+
+#include "gob/global.h"
+#include "gob/draw.h"
+#include "gob/video.h"
+#include "gob/decfile.h"
+#include "gob/anifile.h"
+
+#include "gob/sound/sound.h"
+
+#include "gob/minigames/geisha/evilfish.h"
+#include "gob/minigames/geisha/diving.h"
+
+namespace Gob {
+
+namespace Geisha {
+
+static const int kEvilFishTypeCount = 3;
+
+static const int kEvilFishTypes[kEvilFishTypeCount][5] = {
+ { 0, 14, 8, 9, 3}, // Shark
+ {15, 1, 12, 13, 3}, // Moray
+ {16, 2, 10, 11, 3} // Ray
+};
+
+
+Diving::Diving(GobEngine *vm) : _vm(vm), _background(0),
+ _objects(0), _gui(0), _oko(0), _lungs(0), _heart(0),
+ _blackPearl(0), _whitePearlCount(0), _blackPearlCount(0) {
+
+ _blackPearl = new Surface(11, 8, 1);
+}
+
+Diving::~Diving() {
+ delete _blackPearl;
+
+ deinit();
+}
+
+bool Diving::play(uint16 playerCount, bool hasPearlLocation) {
+ init();
+ initScreen();
+ initCursor();
+
+ _vm->_draw->blitInvalidated();
+ _vm->_video->retrace();
+
+ while (!_vm->shouldQuit()) {
+ checkShots();
+ updateEvilFish();
+ updateDecorFish();
+ updateAnims();
+
+ _vm->_draw->animateCursor(1);
+
+ _vm->_draw->blitInvalidated();
+
+ _vm->_util->waitEndFrame();
+ _vm->_util->processInput();
+
+ int16 mouseX, mouseY;
+ MouseButtons mouseButtons;
+
+ int16 key = checkInput(mouseX, mouseY, mouseButtons);
+ if (key == kKeyEscape)
+ break;
+
+ if (mouseButtons == kMouseButtonsLeft)
+ shoot(mouseX, mouseY);
+
+ if ((_whitePearlCount >= 20) || (_blackPearlCount >= 2))
+ break;
+ }
+
+ deinit();
+ return _blackPearlCount >= 2;
+}
+
+void Diving::init() {
+ _background = new DECFile(_vm, "tperle.dec" , 320, 200);
+ _objects = new ANIFile(_vm, "tperle.ani" , 320);
+ _gui = new ANIFile(_vm, "tperlcpt.ani", 320);
+ _oko = new ANIFile(_vm, "tplonge.ani" , 320);
+
+ _water = new ANIObject(*_objects);
+ _lungs = new ANIObject(*_gui);
+ _heart = new ANIObject(*_gui);
+
+ _water->setAnimation(7);
+ _water->setPosition();
+ _water->setVisible(true);
+
+ _lungs->setAnimation(0);
+ _lungs->setPosition();
+ _lungs->setVisible(true);
+ _lungs->setPause(true);
+
+ _heart->setAnimation(1);
+ _heart->setPosition();
+ _heart->setVisible(true);
+ _heart->setPause(true);
+
+ for (uint i = 0; i < kEvilFishCount; i++) {
+ _evilFish[i].enterAt = 0;
+ _evilFish[i].leaveAt = 0;
+
+ _evilFish[i].evilFish = new EvilFish(*_objects, 320, 0, 0, 0, 0, 0);
+ }
+
+ for (uint i = 0; i < kDecorFishCount; i++) {
+ _decorFish[i].enterAt = 0;
+
+ _decorFish[i].decorFish = new ANIObject(*_objects);
+ }
+
+ _decorFish[0].decorFish->setAnimation( 6); // Jellyfish
+ _decorFish[0].deltaX = 0;
+
+ _decorFish[1].decorFish->setAnimation(32); // Swarm of red/green fish
+ _decorFish[1].deltaX = -6;
+
+ _decorFish[2].decorFish->setAnimation(33); // Swarm of orange fish
+ _decorFish[2].deltaX = -6;
+
+ for (uint i = 0; i < kMaxShotCount; i++) {
+ _shot[i] = new ANIObject(*_objects);
+
+ _shot[i]->setAnimation(17);
+ _shot[i]->setMode(ANIObject::kModeOnce);
+ }
+
+ Surface tmp(320, 103, 1);
+
+ _vm->_video->drawPackedSprite("tperlobj.cmp", tmp);
+
+ _blackPearl->blit(tmp, 282, 80, 292, 87, 0, 0);
+
+ _blackPearlCount = 0;
+
+ _currentShot = 0;
+
+ _anims.push_back(_water);
+ for (uint i = 0; i < kMaxShotCount; i++)
+ _anims.push_back(_shot[i]);
+ for (uint i = 0; i < kDecorFishCount; i++)
+ _anims.push_back(_decorFish[i].decorFish);
+ for (uint i = 0; i < kEvilFishCount; i++)
+ _anims.push_back(_evilFish[i].evilFish);
+ _anims.push_back(_lungs);
+ _anims.push_back(_heart);
+
+ _vm->_sound->sampleLoad(&_soundShoot , SOUND_SND, "tirgim.snd");
+ _vm->_sound->sampleLoad(&_soundBreathe , SOUND_SND, "respir.snd");
+ _vm->_sound->sampleLoad(&_soundWhitePearl, SOUND_SND, "virtou.snd");
+ _vm->_sound->sampleLoad(&_soundBlackPearl, SOUND_SND, "trouve.snd");
+}
+
+void Diving::deinit() {
+ _vm->_draw->_cursorHotspotX = -1;
+ _vm->_draw->_cursorHotspotY = -1;
+
+ _soundShoot.free();
+ _soundBreathe.free();
+ _soundWhitePearl.free();
+ _soundBlackPearl.free();
+
+ _anims.clear();
+
+ _activeShots.clear();
+
+ for (uint i = 0; i < kMaxShotCount; i++) {
+ delete _shot[i];
+
+ _shot[i] = 0;
+ }
+
+ for (uint i = 0; i < kEvilFishCount; i++) {
+ delete _evilFish[i].evilFish;
+
+ _evilFish[i].evilFish = 0;
+ }
+
+ for (uint i = 0; i < kDecorFishCount; i++) {
+ delete _decorFish[i].decorFish;
+
+ _decorFish[i].decorFish = 0;
+ }
+
+ delete _heart;
+ delete _lungs;
+ delete _water;
+
+ delete _oko;
+ delete _gui;
+ delete _objects;
+ delete _background;
+
+ _water = 0;
+ _heart = 0;
+ _lungs = 0;
+
+ _oko = 0;
+ _gui = 0;
+ _objects = 0;
+ _background = 0;
+}
+
+void Diving::initScreen() {
+ _vm->_util->setFrameRate(15);
+
+ _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
+
+ _vm->_draw->_backSurface->clear();
+ _background->draw(*_vm->_draw->_backSurface);
+
+ int16 left, top, right, bottom;
+ _lungs->draw(*_vm->_draw->_backSurface, left, top, right, bottom);
+ _heart->draw(*_vm->_draw->_backSurface, left, top, right, bottom);
+
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 0, 0, 319, 199);
+}
+
+void Diving::initCursor() {
+ const int index = _vm->_draw->_cursorIndex;
+
+ const int16 left = index * _vm->_draw->_cursorWidth;
+ const int16 top = 0;
+ const int16 right = left + _vm->_draw->_cursorWidth - 1;
+ const int16 bottom = _vm->_draw->_cursorHeight - 1;
+
+ _vm->_draw->_cursorSprites->fillRect(left, top, right, bottom, 0);
+
+ _objects->draw(*_vm->_draw->_cursorSprites, 31, 0, left, top);
+ _vm->_draw->_cursorAnimLow[index] = 0;
+
+ _vm->_draw->_cursorHotspotX = 8;
+ _vm->_draw->_cursorHotspotY = 8;
+}
+
+void Diving::updateEvilFish() {
+ for (uint i = 0; i < kEvilFishCount; i++) {
+ ManagedEvilFish &fish = _evilFish[i];
+
+ if (fish.evilFish->isVisible()) {
+ // Evil fishes leave on their own after 30s - 40s
+
+ fish.enterAt = 0;
+
+ if (fish.leaveAt == 0)
+ fish.leaveAt = _vm->_util->getTimeKey() + 30000 + _vm->_util->getRandom(10000);
+
+ if (_vm->_util->getTimeKey() >= fish.leaveAt)
+ fish.evilFish->leave();
+
+ } else {
+ // Evil fishes enter the screen in 2s - 10s
+
+ fish.leaveAt = 0;
+
+ if (fish.enterAt == 0)
+ fish.enterAt = _vm->_util->getTimeKey() + 2000 + _vm->_util->getRandom(8000);
+
+ if (_vm->_util->getTimeKey() >= fish.enterAt) {
+ int fishType = _vm->_util->getRandom(kEvilFishTypeCount);
+ fish.evilFish->mutate(kEvilFishTypes[fishType][0], kEvilFishTypes[fishType][1],
+ kEvilFishTypes[fishType][2], kEvilFishTypes[fishType][3],
+ kEvilFishTypes[fishType][4]);
+
+ fish.evilFish->enter((EvilFish::Direction)_vm->_util->getRandom(2),
+ 36 + _vm->_util->getRandom(3) * 40);
+ }
+ }
+ }
+}
+
+void Diving::updateDecorFish() {
+ for (uint i = 0; i < kDecorFishCount; i++) {
+ ManagedDecorFish &fish = _decorFish[i];
+
+ if (fish.decorFish->isVisible()) {
+ // Move the fish
+ int16 x, y;
+ fish.decorFish->getPosition(x, y);
+ fish.decorFish->setPosition(x + fish.deltaX, y);
+
+ // Check if the fish has left the screen
+ int16 width, height;
+ fish.decorFish->getFramePosition(x, y);
+ fish.decorFish->getFrameSize(width, height);
+
+ if ((x + width) <= 0) {
+ fish.decorFish->setVisible(false);
+ fish.decorFish->setPause(true);
+
+ fish.enterAt = 0;
+ }
+
+ } else {
+ // Decor fishes enter the screen every 0s - 10s
+
+ if (fish.enterAt == 0)
+ fish.enterAt = _vm->_util->getTimeKey() + _vm->_util->getRandom(10000);
+
+ if (_vm->_util->getTimeKey() >= fish.enterAt) {
+ fish.decorFish->rewind();
+ fish.decorFish->setPosition(320, 30 + _vm->_util->getRandom(100));
+ fish.decorFish->setVisible(true);
+ fish.decorFish->setPause(false);
+ }
+ }
+ }
+}
+
+void Diving::foundBlackPearl() {
+ _blackPearlCount++;
+
+ if (_blackPearlCount == 1) {
+ _vm->_draw->_backSurface->blit(*_blackPearl, 0, 0, 10, 7, 147, 179, 0);
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 147, 179, 157, 186);
+ } else if (_blackPearlCount == 2) {
+ _vm->_draw->_backSurface->blit(*_blackPearl, 0, 0, 10, 7, 160, 179, 0);
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 147, 179, 160, 186);
+ }
+}
+
+void Diving::foundWhitePearl() {
+ _whitePearlCount++;
+
+ int16 x = 54 + (_whitePearlCount - 1) * 8;
+ if (_whitePearlCount > 10)
+ x += 48;
+
+ _background->drawLayer(*_vm->_draw->_backSurface, 0, 2, x, 177, 0);
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, x, 177, x + 3, 180);
+}
+
+void Diving::updateAnims() {
+ int16 left, top, right, bottom;
+
+ // Clear the previous animation frames
+ for (Common::List<ANIObject *>::iterator a = _anims.reverse_begin();
+ a != _anims.end(); --a) {
+
+ (*a)->clear(*_vm->_draw->_backSurface, left, top, right, bottom);
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom);
+ }
+
+ // Draw the current animation frames
+ for (Common::List<ANIObject *>::iterator a = _anims.begin();
+ a != _anims.end(); ++a) {
+
+ (*a)->draw(*_vm->_draw->_backSurface, left, top, right, bottom);
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom);
+
+ (*a)->advance();
+ }
+}
+
+int16 Diving::checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons) {
+ _vm->_util->getMouseState(&mouseX, &mouseY, &mouseButtons);
+
+ return _vm->_util->checkKey();
+}
+
+void Diving::shoot(int16 mouseX, int16 mouseY) {
+ // Outside the playable area?
+ if (mouseY > 157)
+ return;
+
+ // Too many shots still active?
+ if (_activeShots.size() >= kMaxShotCount)
+ return;
+
+ ANIObject &shot = *_shot[_currentShot];
+
+ shot.rewind();
+ shot.setVisible(true);
+ shot.setPause(false);
+ shot.setPosition(mouseX - 8, mouseY - 8);
+
+ _activeShots.push_back(_currentShot);
+
+ _currentShot = (_currentShot + 1) % kMaxShotCount;
+
+ _vm->_sound->blasterPlay(&_soundShoot, 1, 0);
+}
+
+void Diving::checkShots() {
+ Common::List<int>::iterator activeShot = _activeShots.begin();
+
+ while (activeShot != _activeShots.end()) {
+ ANIObject &shot = *_shot[*activeShot];
+
+ if (shot.lastFrame()) {
+ int16 x, y;
+
+ shot.getPosition(x, y);
+
+ for (uint i = 0; i < kEvilFishCount; i++) {
+ EvilFish &evilFish = *_evilFish[i].evilFish;
+
+ if (evilFish.isIn(x + 8, y + 8)) {
+ evilFish.die();
+
+ break;
+ }
+ }
+
+ activeShot = _activeShots.erase(activeShot);
+ } else
+ ++activeShot;
+ }
+}
+
+} // End of namespace Geisha
+
+} // End of namespace Gob
diff --git a/engines/gob/minigames/geisha/diving.h b/engines/gob/minigames/geisha/diving.h
new file mode 100644
index 0000000000..e386d783d7
--- /dev/null
+++ b/engines/gob/minigames/geisha/diving.h
@@ -0,0 +1,127 @@
+/* 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 GOB_MINIGAMES_GEISHA_DIVING_H
+#define GOB_MINIGAMES_GEISHA_DIVING_H
+
+#include "common/system.h"
+
+#include "gob/util.h"
+
+#include "gob/sound/sounddesc.h"
+
+namespace Gob {
+
+class GobEngine;
+class Surface;
+class DECFile;
+class ANIFile;
+class ANIObject;
+
+namespace Geisha {
+
+class EvilFish;
+
+/** Geisha's "Diving" minigame. */
+class Diving {
+public:
+ Diving(GobEngine *vm);
+ ~Diving();
+
+ bool play(uint16 playerCount, bool hasPearlLocation);
+
+private:
+ static const uint kEvilFishCount = 3;
+ static const uint kDecorFishCount = 3;
+ static const uint kMaxShotCount = 10;
+
+ struct ManagedEvilFish {
+ EvilFish *evilFish;
+
+ uint32 enterAt;
+ uint32 leaveAt;
+ };
+
+ struct ManagedDecorFish {
+ ANIObject *decorFish;
+
+ uint32 enterAt;
+ int8 deltaX;
+ };
+
+ GobEngine *_vm;
+
+ DECFile *_background;
+ ANIFile *_objects;
+ ANIFile *_gui;
+ ANIFile *_oko;
+
+ ANIObject *_water;
+ ANIObject *_lungs;
+ ANIObject *_heart;
+
+ ManagedEvilFish _evilFish[kEvilFishCount];
+ ManagedDecorFish _decorFish[kDecorFishCount];
+
+ ANIObject *_shot[kMaxShotCount];
+
+ Common::List<int> _activeShots;
+
+ Common::List<ANIObject *> _anims;
+
+ Surface *_blackPearl;
+
+ uint8 _whitePearlCount;
+ uint8 _blackPearlCount;
+
+ uint8 _currentShot;
+
+ SoundDesc _soundShoot;
+ SoundDesc _soundBreathe;
+ SoundDesc _soundWhitePearl;
+ SoundDesc _soundBlackPearl;
+
+
+ void init();
+ void deinit();
+
+ void initScreen();
+ void initCursor();
+
+ void foundBlackPearl();
+ void foundWhitePearl();
+
+ void updateEvilFish();
+ void updateDecorFish();
+ void updateAnims();
+
+ int16 checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons);
+
+ void shoot(int16 mouseX, int16 mouseY);
+ void checkShots();
+};
+
+} // End of namespace Geisha
+
+} // End of namespace Gob
+
+#endif // GOB_MINIGAMES_GEISHA_DIVING_H
diff --git a/engines/gob/minigames/geisha/evilfish.cpp b/engines/gob/minigames/geisha/evilfish.cpp
new file mode 100644
index 0000000000..e9503f4aed
--- /dev/null
+++ b/engines/gob/minigames/geisha/evilfish.cpp
@@ -0,0 +1,189 @@
+/* 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.
+ *
+ */
+
+#include "gob/minigames/geisha/evilfish.h"
+
+namespace Gob {
+
+namespace Geisha {
+
+EvilFish::EvilFish(const ANIFile &ani, uint16 screenWidth,
+ uint16 animSwimLeft, uint16 animSwimRight,
+ uint16 animTurnLeft, uint16 animTurnRight, uint16 animDie) :
+ ANIObject(ani), _screenWidth(screenWidth),
+ _animSwimLeft(animSwimLeft), _animSwimRight(animSwimRight),
+ _animTurnLeft(animTurnLeft), _animTurnRight(animTurnRight), _animDie(animDie),
+ _shouldLeave(false), _state(kStateNone) {
+
+}
+
+EvilFish::~EvilFish() {
+}
+
+bool EvilFish::isIn(int16 x, int16 y) const {
+ int16 frameX, frameY, frameWidth, frameHeight;
+ getFramePosition(frameX, frameY);
+ getFrameSize(frameWidth, frameHeight);
+
+ if ((x < frameX) || (y < frameY))
+ return false;
+ if ((x > (frameX + frameWidth)) || (y > (frameY + frameHeight)))
+ return false;
+
+ return true;
+}
+
+void EvilFish::enter(Direction from, int16 y) {
+ _shouldLeave = false;
+
+ bool left = from == kDirectionLeft;
+
+ setAnimation(left ? _animSwimLeft : _animSwimRight);
+
+ int16 width, height;
+ getFrameSize(width, height);
+
+ setPosition(left ? -width : _screenWidth, y);
+ setVisible(true);
+
+ _state = left ? kStateSwimLeft : kStateSwimRight;
+}
+
+void EvilFish::leave() {
+ if (_state == kStateNone)
+ return;
+
+ _shouldLeave = true;
+}
+
+void EvilFish::die() {
+ if ((_state == kStateNone) || (_state == kStateDie))
+ return;
+
+ int16 x, y;
+ getFramePosition(x, y);
+
+ setAnimation(_animDie);
+ setPosition(x, y);
+
+ _state = kStateDie;
+}
+
+void EvilFish::advance() {
+ if (_state == kStateNone)
+ return;
+
+ bool wasLastFrame = lastFrame();
+
+ int16 oldX, oldY;
+ getPosition(oldX, oldY);
+
+ ANIObject::advance();
+
+ int16 x, y, width, height;
+ getFramePosition(x, y);
+ getFrameSize(width, height);
+
+ switch (_state) {
+ case kStateNone:
+ break;
+
+ case kStateSwimLeft:
+ if (!_shouldLeave && (x >= _screenWidth - width)) {
+ setAnimation(_animTurnRight);
+ setPosition(x, oldY);
+ _state = kStateTurnRight;
+ }
+
+ if (_shouldLeave && (x >= _screenWidth)) {
+ setVisible(false);
+
+ _shouldLeave = false;
+ _state = kStateNone;
+ }
+ break;
+
+ case kStateSwimRight:
+ if (!_shouldLeave && (x <= 0)) {
+ setAnimation(_animTurnLeft);
+ setPosition(x, oldY);
+ _state = kStateTurnLeft;
+ }
+
+ if (_shouldLeave && (x < -width)) {
+ setVisible(false);
+
+ _shouldLeave = false;
+ _state = kStateNone;
+ }
+ break;
+
+ case kStateTurnLeft:
+ if (wasLastFrame) {
+ setAnimation(_animSwimLeft);
+ _state = kStateSwimLeft;
+ }
+ break;
+
+ case kStateTurnRight:
+ if (wasLastFrame) {
+ setAnimation(_animSwimRight);
+ _state = kStateSwimRight;
+ }
+ break;
+
+ case kStateDie:
+ if (wasLastFrame) {
+ setVisible(false);
+
+ _state = kStateNone;
+ }
+ break;
+ }
+}
+
+void EvilFish::mutate(uint16 animSwimLeft, uint16 animSwimRight,
+ uint16 animTurnLeft, uint16 animTurnRight, uint16 animDie) {
+
+ _animSwimLeft = animSwimLeft;
+ _animSwimRight = animSwimRight;
+ _animTurnLeft = animTurnLeft;
+ _animTurnRight = animTurnRight;
+ _animDie = animDie;
+
+ switch (_state) {
+ case kStateSwimLeft:
+ setAnimation(_animSwimLeft);
+ break;
+
+ case kStateSwimRight:
+ setAnimation(_animSwimRight);
+ break;
+
+ default:
+ break;
+ }
+}
+
+} // End of namespace Geisha
+
+} // End of namespace Gob
diff --git a/engines/gob/minigames/geisha/evilfish.h b/engines/gob/minigames/geisha/evilfish.h
new file mode 100644
index 0000000000..223645f47f
--- /dev/null
+++ b/engines/gob/minigames/geisha/evilfish.h
@@ -0,0 +1,90 @@
+/* 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 GOB_MINIGAMES_GEISHA_EVILFISH_H
+#define GOB_MINIGAMES_GEISHA_EVILFISH_H
+
+#include "gob/aniobject.h"
+
+namespace Gob {
+
+namespace Geisha {
+
+/** An "evil" fish in Geisha's "Diving" minigame. */
+class EvilFish : public ANIObject {
+public:
+ enum Direction {
+ kDirectionLeft = 0,
+ kDirectionRight = 1
+ };
+
+ EvilFish(const ANIFile &ani, uint16 screenWidth,
+ uint16 animSwimLeft, uint16 animSwimRight,
+ uint16 animTurnLeft, uint16 animTurnRight, uint16 animDie);
+ ~EvilFish();
+
+ /** Are there coordinates within the fish's sprite? */
+ bool isIn(int16 x, int16 y) const;
+
+ /** Enter from this direction / screen edge. */
+ void enter(Direction from, int16 y);
+ /** Leave the screen in the current direction. */
+ void leave();
+
+ /** Kill the fish. */
+ void die();
+
+ /** Advance the animation to the next frame. */
+ void advance();
+
+ /** Change the fish's animations, effectively making it a different fish type. */
+ void mutate(uint16 animSwimLeft, uint16 animSwimRight,
+ uint16 animTurnLeft, uint16 animTurnRight, uint16 animDie);
+
+private:
+ enum State {
+ kStateNone,
+ kStateSwimLeft,
+ kStateSwimRight,
+ kStateTurnLeft,
+ kStateTurnRight,
+ kStateDie
+ };
+
+ uint16 _screenWidth;
+
+ uint16 _animSwimLeft;
+ uint16 _animSwimRight;
+ uint16 _animTurnLeft;
+ uint16 _animTurnRight;
+ uint16 _animDie;
+
+ bool _shouldLeave;
+
+ State _state;
+};
+
+} // End of namespace Geisha
+
+} // End of namespace Gob
+
+#endif // GOB_MINIGAMES_GEISHA_EVILFISH_H
diff --git a/engines/gob/minigames/geisha/penetration.cpp b/engines/gob/minigames/geisha/penetration.cpp
new file mode 100644
index 0000000000..121a45bc40
--- /dev/null
+++ b/engines/gob/minigames/geisha/penetration.cpp
@@ -0,0 +1,106 @@
+/* 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.
+ *
+ */
+
+#include "gob/global.h"
+#include "gob/util.h"
+#include "gob/draw.h"
+#include "gob/video.h"
+#include "gob/decfile.h"
+#include "gob/anifile.h"
+
+#include "gob/minigames/geisha/penetration.h"
+
+namespace Gob {
+
+namespace Geisha {
+
+static const byte kPalette[48] = {
+ 0x16, 0x16, 0x16,
+ 0x12, 0x14, 0x16,
+ 0x34, 0x00, 0x25,
+ 0x1D, 0x1F, 0x22,
+ 0x24, 0x27, 0x2A,
+ 0x2C, 0x0D, 0x22,
+ 0x2B, 0x2E, 0x32,
+ 0x12, 0x09, 0x20,
+ 0x3D, 0x3F, 0x00,
+ 0x3F, 0x3F, 0x3F,
+ 0x00, 0x00, 0x00,
+ 0x15, 0x15, 0x3F,
+ 0x25, 0x22, 0x2F,
+ 0x1A, 0x14, 0x28,
+ 0x3F, 0x00, 0x00,
+ 0x15, 0x3F, 0x15
+};
+
+Penetration::Penetration(GobEngine *vm) : _vm(vm), _background(0), _objects(0) {
+ _background = new Surface(320, 200, 1);
+}
+
+Penetration::~Penetration() {
+ deinit();
+
+ delete _background;
+}
+
+bool Penetration::play(uint16 var1, uint16 var2, uint16 var3) {
+ init();
+ initScreen();
+
+ _vm->_draw->blitInvalidated();
+ _vm->_video->retrace();
+ while (!_vm->_util->keyPressed() && !_vm->shouldQuit())
+ _vm->_util->longDelay(1);
+
+ deinit();
+ return true;
+}
+
+void Penetration::init() {
+ _background->clear();
+
+ _vm->_video->drawPackedSprite("hyprmef2.cmp", *_background);
+
+ _objects = new ANIFile(_vm, "tcite.ani", 320);
+}
+
+void Penetration::deinit() {
+ delete _objects;
+
+ _objects = 0;
+}
+
+void Penetration::initScreen() {
+ _vm->_util->setFrameRate(15);
+
+ memcpy(_vm->_draw->_vgaPalette , kPalette, 48);
+ memcpy(_vm->_draw->_vgaSmallPalette, kPalette, 48);
+
+ _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
+
+ _vm->_draw->_backSurface->blit(*_background);
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 0, 0, 319, 199);
+}
+
+} // End of namespace Geisha
+
+} // End of namespace Gob
diff --git a/engines/gob/minigames/geisha/penetration.h b/engines/gob/minigames/geisha/penetration.h
new file mode 100644
index 0000000000..c346a7bf5a
--- /dev/null
+++ b/engines/gob/minigames/geisha/penetration.h
@@ -0,0 +1,61 @@
+/* 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 GOB_MINIGAMES_GEISHA_PENETRATION_H
+#define GOB_MINIGAMES_GEISHA_PENETRATION_H
+
+#include "common/system.h"
+
+namespace Gob {
+
+class GobEngine;
+class Surface;
+class ANIFile;
+
+namespace Geisha {
+
+/** Geisha's "Penetration" minigame. */
+class Penetration {
+public:
+ Penetration(GobEngine *vm);
+ ~Penetration();
+
+ bool play(uint16 var1, uint16 var2, uint16 var3);
+
+private:
+ GobEngine *_vm;
+
+ Surface *_background;
+ ANIFile *_objects;
+
+
+ void init();
+ void deinit();
+
+ void initScreen();
+};
+
+} // End of namespace Geisha
+
+} // End of namespace Gob
+
+#endif // GOB_MINIGAMES_GEISHA_PENETRATION_H
diff --git a/engines/gob/module.mk b/engines/gob/module.mk
index cdad1e6c46..bf040c5428 100644
--- a/engines/gob/module.mk
+++ b/engines/gob/module.mk
@@ -1,10 +1,13 @@
MODULE := engines/gob
MODULE_OBJS := \
+ anifile.o \
+ aniobject.o \
console.o \
dataio.o \
databases.o \
dbase.o \
+ decfile.o \
detection.o \
draw.o \
draw_v1.o \
@@ -25,6 +28,7 @@ MODULE_OBJS := \
iniconfig.o \
init.o \
init_v1.o \
+ init_geisha.o \
init_v2.o \
init_fascin.o \
init_v3.o \
@@ -33,6 +37,7 @@ MODULE_OBJS := \
init_v7.o \
inter.o \
inter_v1.o \
+ inter_geisha.o \
inter_v2.o \
inter_bargon.o \
inter_fascin.o \
@@ -51,6 +56,7 @@ MODULE_OBJS := \
mult_v2.o \
palanim.o \
resources.o \
+ rxyfile.o \
scenery.o \
scenery_v1.o \
scenery_v2.o \
@@ -67,6 +73,9 @@ MODULE_OBJS := \
demos/demoplayer.o \
demos/scnplayer.o \
demos/batplayer.o \
+ minigames/geisha/evilfish.o \
+ minigames/geisha/diving.o \
+ minigames/geisha/penetration.o \
save/savefile.o \
save/savehandler.o \
save/saveload.o \
@@ -75,6 +84,7 @@ MODULE_OBJS := \
save/saveload_v4.o \
save/saveload_v6.o \
save/saveload_v7.o \
+ save/saveload_geisha.o \
save/saveload_fascin.o \
save/saveload_inca2.o \
save/saveload_playtoons.o \
diff --git a/engines/gob/palanim.cpp b/engines/gob/palanim.cpp
index 42aeaf63eb..8a5327c3f1 100644
--- a/engines/gob/palanim.cpp
+++ b/engines/gob/palanim.cpp
@@ -79,9 +79,6 @@ bool PalAnim::fadeStep(int16 oper) {
byte newGreen;
byte newBlue;
- if (_vm->_global->_colorCount != 256)
- error("PalAnim::fadeStep(): Only 256 color mode is supported");
-
if (oper == 0) {
if (_vm->_global->_setAllPalette) {
if (_vm->_global->_inVM != 0)
@@ -134,12 +131,6 @@ void PalAnim::fade(Video::PalDesc *palDesc, int16 fadeV, int16 allColors) {
_fadeValue = (fadeV < 0) ? -fadeV : 2;
- if (_vm->_global->_colorCount < 256) {
- if (palDesc)
- _vm->_video->setFullPalette(palDesc);
- return;
- }
-
if (!_vm->_global->_setAllPalette) {
if (!palDesc) {
for (i = 0; i < 16; i++) {
diff --git a/engines/gob/rxyfile.cpp b/engines/gob/rxyfile.cpp
new file mode 100644
index 0000000000..5311eece0f
--- /dev/null
+++ b/engines/gob/rxyfile.cpp
@@ -0,0 +1,82 @@
+/* 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.
+ *
+ */
+
+#include "common/stream.h"
+
+#include "gob/rxyfile.h"
+
+namespace Gob {
+
+RXYFile::RXYFile(Common::SeekableReadStream &rxy) : _width(0), _height(0) {
+ load(rxy);
+}
+
+RXYFile::~RXYFile() {
+}
+
+uint RXYFile::size() const {
+ return _coords.size();
+}
+
+uint16 RXYFile::getWidth() const {
+ return _width;
+}
+
+uint16 RXYFile::getHeight() const {
+ return _height;
+}
+
+uint16 RXYFile::getRealCount() const {
+ return _realCount;
+}
+
+const RXYFile::Coordinates &RXYFile::operator[](uint i) const {
+ assert(i < _coords.size());
+
+ return _coords[i];
+}
+
+void RXYFile::load(Common::SeekableReadStream &rxy) {
+ if (rxy.size() < 2)
+ return;
+
+ rxy.seek(0);
+
+ _realCount = rxy.readUint16LE();
+
+ uint16 count = (rxy.size() - 2) / 8;
+
+ _coords.resize(count);
+ for (CoordArray::iterator c = _coords.begin(); c != _coords.end(); ++c) {
+ c->left = rxy.readUint16LE();
+ c->right = rxy.readUint16LE();
+ c->top = rxy.readUint16LE();
+ c->bottom = rxy.readUint16LE();
+
+ if (c->left != 0xFFFF) {
+ _width = MAX<uint16>(_width , c->right + 1);
+ _height = MAX<uint16>(_height, c->bottom + 1);
+ }
+ }
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/rxyfile.h b/engines/gob/rxyfile.h
new file mode 100644
index 0000000000..828f8b73c7
--- /dev/null
+++ b/engines/gob/rxyfile.h
@@ -0,0 +1,76 @@
+/* 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 GOB_RXYFILE_H
+#define GOB_RXYFILE_H
+
+#include "common/system.h"
+#include "common/array.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Gob {
+
+/** A RXY file, containing relative sprite coordinates.
+ *
+ * Used in hardcoded "actiony" parts of gob games.
+ */
+class RXYFile {
+public:
+ struct Coordinates {
+ uint16 left;
+ uint16 top;
+ uint16 right;
+ uint16 bottom;
+ };
+
+ RXYFile(Common::SeekableReadStream &rxy);
+ ~RXYFile();
+
+ uint size() const;
+
+ uint16 getWidth () const;
+ uint16 getHeight() const;
+
+ uint16 getRealCount() const;
+
+ const Coordinates &operator[](uint i) const;
+
+private:
+ typedef Common::Array<Coordinates> CoordArray;
+
+ CoordArray _coords;
+
+ uint16 _realCount;
+
+ uint16 _width;
+ uint16 _height;
+
+
+ void load(Common::SeekableReadStream &rxy);
+};
+
+} // End of namespace Gob
+
+#endif // GOB_RXYFILE_H
diff --git a/engines/gob/save/saveload.h b/engines/gob/save/saveload.h
index 4d51a5b51c..66b3482bac 100644
--- a/engines/gob/save/saveload.h
+++ b/engines/gob/save/saveload.h
@@ -71,6 +71,60 @@ protected:
virtual const char *getDescription(const char *fileName) const;
};
+/** Save/Load class for Geisha. */
+class SaveLoad_Geisha : public SaveLoad {
+public:
+ SaveLoad_Geisha(GobEngine *vm, const char *targetName);
+ virtual ~SaveLoad_Geisha();
+
+ SaveMode getSaveMode(const char *fileName) const;
+
+protected:
+ static const uint32 kSlotCount = 7;
+ static const uint32 kSlotSize = 44;
+
+ static const uint32 kSaveFileSize = kSlotCount * kSlotSize;
+
+ struct SaveFile {
+ const char *sourceName;
+ SaveMode mode;
+ SaveHandler *handler;
+ const char *description;
+ };
+
+ /** Handles the save slots. */
+ class GameHandler : public SaveHandler {
+ public:
+ GameHandler(GobEngine *vm, const Common::String &target);
+ ~GameHandler();
+
+ int32 getSize();
+ bool load(int16 dataVar, int32 size, int32 offset);
+ bool save(int16 dataVar, int32 size, int32 offset);
+
+ private:
+ /** Slot file construction. */
+ class File : public SlotFileIndexed {
+ public:
+ File(GobEngine *vm, const Common::String &base);
+ ~File();
+
+ int getSlot(int32 offset) const;
+ int getSlotRemainder(int32 offset) const;
+ };
+
+ File _file;
+ };
+
+ static SaveFile _saveFiles[];
+
+ SaveHandler *getHandler(const char *fileName) const;
+ const char *getDescription(const char *fileName) const;
+
+ const SaveFile *getSaveFile(const char *fileName) const;
+ SaveFile *getSaveFile(const char *fileName);
+};
+
/** Save/Load class for Gobliins 2, Ween: The Prophecy and Bargon Attack. */
class SaveLoad_v2 : public SaveLoad {
public:
diff --git a/engines/gob/save/saveload_geisha.cpp b/engines/gob/save/saveload_geisha.cpp
new file mode 100644
index 0000000000..3414c12dda
--- /dev/null
+++ b/engines/gob/save/saveload_geisha.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.
+ *
+ */
+
+#include "gob/save/saveload.h"
+#include "gob/save/saveconverter.h"
+#include "gob/inter.h"
+#include "gob/variables.h"
+
+namespace Gob {
+
+SaveLoad_Geisha::SaveFile SaveLoad_Geisha::_saveFiles[] = {
+ {"save.inf", kSaveModeSave, 0, "savegame"}
+};
+
+
+SaveLoad_Geisha::GameHandler::File::File(GobEngine *vm, const Common::String &base) :
+ SlotFileIndexed(vm, SaveLoad_Geisha::kSlotCount, base, "s") {
+
+}
+
+SaveLoad_Geisha::GameHandler::File::~File() {
+}
+
+int SaveLoad_Geisha::GameHandler::File::getSlot(int32 offset) const {
+ return 0;
+}
+
+int SaveLoad_Geisha::GameHandler::File::getSlotRemainder(int32 offset) const {
+ return 0;
+}
+
+
+SaveLoad_Geisha::GameHandler::GameHandler(GobEngine *vm, const Common::String &target) :
+ SaveHandler(vm), _file(vm, target) {
+
+}
+
+SaveLoad_Geisha::GameHandler::~GameHandler() {
+}
+
+int32 SaveLoad_Geisha::GameHandler::getSize() {
+ if (_file.getSlotMax() == 0)
+ return -1;
+
+ return SaveLoad_Geisha::kSaveFileSize;
+}
+
+bool SaveLoad_Geisha::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
+ if ((size != 0) || (offset != 0)) {
+ warning("Invalid loading procedure: %d, %d, %d", dataVar, size, offset);
+ return false;
+ }
+
+ memset(_vm->_inter->_variables->getAddressOff8(dataVar), 0, SaveLoad_Geisha::kSaveFileSize);
+
+ for (uint32 slot = 0; slot < SaveLoad_Geisha::kSlotCount;
+ slot++, dataVar += SaveLoad_Geisha::kSlotSize) {
+
+ if (!_file.exists(slot))
+ continue;
+
+ Common::String slotFile = _file.build(slot);
+ if (slotFile.empty())
+ return false;
+
+ SaveReader reader(2, slot, slotFile);
+ if (!reader.load()) {
+ warning("Save slot %d contains corrupted save", slot);
+ continue;
+ }
+
+ SavePartInfo info(20, (uint32) _vm->getGameType(), 0,
+ _vm->getEndianness(), _vm->_inter->_variables->getSize());
+ SavePartVars vars(_vm, SaveLoad_Geisha::kSlotSize);
+
+ if (!reader.readPart(0, &info) || !reader.readPart(1, &vars)) {
+ warning("Save slot %d contains corrupted save", slot);
+ continue;
+ }
+
+ if (!vars.writeInto(dataVar, 0, SaveLoad_Geisha::kSlotSize)) {
+ warning("Save slot %d contains corrupted save", slot);
+ continue;
+ }
+ }
+
+ return true;
+}
+
+bool SaveLoad_Geisha::GameHandler::save(int16 dataVar, int32 size, int32 offset) {
+ if (((uint32)size != SaveLoad_Geisha::kSaveFileSize) || (offset != 0)) {
+ warning("Invalid saving procedure: %d, %d, %d", dataVar, size, offset);
+ return false;
+ }
+
+ for (uint32 slot = 0; slot < SaveLoad_Geisha::kSlotCount;
+ slot++, dataVar += SaveLoad_Geisha::kSlotSize) {
+
+ const byte *slotData = _vm->_inter->_variables->getAddressOff8(dataVar);
+
+ // Check of the slot's data is empty
+ bool empty = true;
+ for (uint32 j = 0; j < SaveLoad_Geisha::kSlotSize; j++) {
+ if (slotData[j] != 0) {
+ empty = false;
+ break;
+ }
+ }
+
+ // Don't save empty slots
+ if (empty)
+ continue;
+
+ Common::String slotFile = _file.build(slot);
+ if (slotFile.empty())
+ return false;
+
+ SaveWriter writer(2, slot, slotFile);
+
+ SavePartInfo info(20, (uint32) _vm->getGameType(), 0,
+ _vm->getEndianness(), _vm->_inter->_variables->getSize());
+ SavePartVars vars(_vm, SaveLoad_Geisha::kSlotSize);
+
+ info.setDesc(Common::String::format("Geisha, slot %d", slot).c_str());
+ if (!vars.readFrom(dataVar, 0, SaveLoad_Geisha::kSlotSize))
+ return false;
+
+ if (!writer.writePart(0, &info))
+ return false;
+ if (!writer.writePart(1, &vars))
+ return false;
+ }
+
+ return true;
+}
+
+
+SaveLoad_Geisha::SaveLoad_Geisha(GobEngine *vm, const char *targetName) :
+ SaveLoad(vm) {
+
+ _saveFiles[0].handler = new GameHandler(vm, targetName);
+}
+
+SaveLoad_Geisha::~SaveLoad_Geisha() {
+ for (int i = 0; i < ARRAYSIZE(_saveFiles); i++)
+ delete _saveFiles[i].handler;
+}
+
+const SaveLoad_Geisha::SaveFile *SaveLoad_Geisha::getSaveFile(const char *fileName) const {
+ fileName = stripPath(fileName);
+
+ for (int i = 0; i < ARRAYSIZE(_saveFiles); i++)
+ if (!scumm_stricmp(fileName, _saveFiles[i].sourceName))
+ return &_saveFiles[i];
+
+ return 0;
+}
+
+SaveLoad_Geisha::SaveFile *SaveLoad_Geisha::getSaveFile(const char *fileName) {
+ fileName = stripPath(fileName);
+
+ for (int i = 0; i < ARRAYSIZE(_saveFiles); i++)
+ if (!scumm_stricmp(fileName, _saveFiles[i].sourceName))
+ return &_saveFiles[i];
+
+ return 0;
+}
+
+SaveHandler *SaveLoad_Geisha::getHandler(const char *fileName) const {
+ const SaveFile *saveFile = getSaveFile(fileName);
+
+ if (saveFile)
+ return saveFile->handler;
+
+ return 0;
+}
+
+const char *SaveLoad_Geisha::getDescription(const char *fileName) const {
+ const SaveFile *saveFile = getSaveFile(fileName);
+
+ if (saveFile)
+ return saveFile->description;
+
+ return 0;
+}
+
+SaveLoad::SaveMode SaveLoad_Geisha::getSaveMode(const char *fileName) const {
+ const SaveFile *saveFile = getSaveFile(fileName);
+
+ if (saveFile)
+ return saveFile->mode;
+
+ return kSaveModeNone;
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp
index bb50818ed8..33fdfcaa2a 100644
--- a/engines/gob/scenery.cpp
+++ b/engines/gob/scenery.cpp
@@ -622,7 +622,7 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,
if (frame >= (int32)_vm->_vidPlayer->getFrameCount(obj.videoSlot - 1))
frame = _vm->_vidPlayer->getFrameCount(obj.videoSlot - 1) - 1;
- if (_vm->_vidPlayer->getCurrentFrame(obj.videoSlot - 1) >= 255) {
+ if ((int32)_vm->_vidPlayer->getCurrentFrame(obj.videoSlot - 1) >= 255) {
// Allow for object videos with more than 255 frames, although the
// object frame counter is just a byte.
diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp
index 212116f689..bfe0394390 100644
--- a/engines/gob/sound/sound.cpp
+++ b/engines/gob/sound/sound.cpp
@@ -330,7 +330,7 @@ void Sound::adlibPlayBgMusic() {
if (!_adlPlayer)
_adlPlayer = new ADLPlayer(*_vm->_mixer);
- static const char *tracksMac[] = {
+ static const char *const tracksMac[] = {
// "musmac1.adl", // TODO: This track isn't played correctly at all yet
"musmac2.adl",
"musmac3.adl",
@@ -339,7 +339,7 @@ void Sound::adlibPlayBgMusic() {
"musmac6.adl"
};
- static const char *tracksWin[] = {
+ static const char *const tracksWin[] = {
"musmac1.mid",
"musmac2.mid",
"musmac3.mid",
@@ -434,6 +434,8 @@ void Sound::blasterPlay(SoundDesc *sndDesc, int16 repCount,
debugC(1, kDebugSound, "SoundBlaster: Playing sample (%d, %d, %d)",
repCount, frequency, fadeLength);
+ blasterStopComposition();
+
_blaster->playSample(*sndDesc, repCount, frequency, fadeLength);
}
@@ -534,7 +536,7 @@ void Sound::cdPlayBgMusic() {
if (!_cdrom)
return;
- static const char *tracks[][2] = {
+ static const char *const tracks[][2] = {
{"avt00.tot", "mine"},
{"avt001.tot", "nuit"},
{"avt002.tot", "campagne"},
@@ -571,7 +573,7 @@ void Sound::cdPlayMultMusic() {
if (!_cdrom)
return;
- static const char *tracks[][6] = {
+ static const char *const tracks[][6] = {
{"avt005.tot", "fra1", "all1", "ang1", "esp1", "ita1"},
{"avt006.tot", "fra2", "all2", "ang2", "esp2", "ita2"},
{"avt012.tot", "fra3", "all3", "ang3", "esp3", "ita3"},
diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp
index 6d83745602..7f9c6131fd 100644
--- a/engines/gob/util.cpp
+++ b/engines/gob/util.cpp
@@ -20,6 +20,10 @@
*
*/
+#include "common/stream.h"
+#include "common/events.h"
+
+#include "graphics/palette.h"
#include "gob/gob.h"
#include "gob/util.h"
@@ -31,10 +35,6 @@
#include "gob/videoplayer.h"
#include "gob/sound/sound.h"
-#include "common/events.h"
-
-#include "graphics/palette.h"
-
namespace Gob {
Util::Util(GobEngine *vm) : _vm(vm) {
@@ -257,6 +257,18 @@ bool Util::checkKey(int16 &key) {
return true;
}
+bool Util::keyPressed() {
+ int16 key = checkKey();
+ if (key)
+ return true;
+
+ int16 x, y;
+ MouseButtons buttons;
+
+ getMouseState(&x, &y, &buttons);
+ return buttons != kMouseButtonsNone;
+}
+
void Util::getMouseState(int16 *pX, int16 *pY, MouseButtons *pButtons) {
Common::Point mouse = g_system->getEventManager()->getMousePos();
*pX = mouse.x + _vm->_video->_scrollOffsetX - _vm->_video->_screenDeltaX;
@@ -518,6 +530,11 @@ void Util::deleteList(List *list) {
}
char *Util::setExtension(char *str, const char *ext) {
+ assert(str && ext);
+
+ if (str[0] == '\0')
+ return str;
+
char *dot = strrchr(str, '.');
if (dot)
*dot = '\0';
@@ -527,6 +544,9 @@ char *Util::setExtension(char *str, const char *ext) {
}
Common::String Util::setExtension(const Common::String &str, const Common::String &ext) {
+ if (str.empty())
+ return str;
+
const char *dot = strrchr(str.c_str(), '.');
if (dot)
return Common::String(str.c_str(), dot - str.c_str()) + ext;
@@ -534,6 +554,23 @@ Common::String Util::setExtension(const Common::String &str, const Common::Strin
return str + ext;
}
+Common::String Util::readString(Common::SeekableReadStream &stream, int n) {
+ Common::String str;
+
+ char c;
+ while (n-- > 0) {
+ if ((c = stream.readByte()) == '\0')
+ break;
+
+ str += c;
+ }
+
+ if (n > 0)
+ stream.skip(n);
+
+ return str;
+}
+
/* NOT IMPLEMENTED */
void Util::checkJoystick() {
_vm->_global->_useJoystick = 0;
diff --git a/engines/gob/util.h b/engines/gob/util.h
index a6a689c1d2..4228dac768 100644
--- a/engines/gob/util.h
+++ b/engines/gob/util.h
@@ -23,8 +23,13 @@
#ifndef GOB_UTIL_H
#define GOB_UTIL_H
+#include "common/str.h"
#include "common/keyboard.h"
+namespace Common {
+ class SeekableReadStream;
+}
+
namespace Gob {
class GobEngine;
@@ -103,6 +108,7 @@ public:
int16 getKey();
int16 checkKey();
bool checkKey(int16 &key);
+ bool keyPressed();
void getMouseState(int16 *pX, int16 *pY, MouseButtons *pButtons);
void setMousePos(int16 x, int16 y);
@@ -131,6 +137,9 @@ public:
static char *setExtension(char *str, const char *ext);
static Common::String setExtension(const Common::String &str, const Common::String &ext);
+ /** Read a constant-length string out of a stream. */
+ static Common::String readString(Common::SeekableReadStream &stream, int n);
+
Util(GobEngine *vm);
protected:
diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp
index 651c9a3154..221f5ab3c9 100644
--- a/engines/gob/videoplayer.cpp
+++ b/engines/gob/videoplayer.cpp
@@ -61,7 +61,7 @@ void VideoPlayer::Video::close() {
}
-const char *VideoPlayer::_extensions[] = { "IMD", "IMD", "VMD", "RMD", "SMD" };
+const char *const VideoPlayer::_extensions[] = { "IMD", "IMD", "VMD", "RMD", "SMD" };
VideoPlayer::VideoPlayer(GobEngine *vm) : _vm(vm), _needBlit(false),
_noCursorSwitch(false), _woodruffCohCottWorkaround(false) {
@@ -262,7 +262,7 @@ void VideoPlayer::waitSoundEnd(int slot) {
video->decoder->finishSound();
- while(video->decoder->isSoundPlaying())
+ while (video->decoder->isSoundPlaying())
_vm->_util->longDelay(1);
}
diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h
index 373832939a..bc7cb48768 100644
--- a/engines/gob/videoplayer.h
+++ b/engines/gob/videoplayer.h
@@ -167,7 +167,7 @@ private:
static const int kVideoSlotCount = 32;
- static const char *_extensions[];
+ static const char *const _extensions[];
GobEngine *_vm;
diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp
index 62887bac1e..f8414ac455 100644
--- a/engines/groovie/detection.cpp
+++ b/engines/groovie/detection.cpp
@@ -52,7 +52,7 @@ static const GroovieGameDescription gameDescriptions[] = {
"t7g", "",
AD_ENTRY1s("script.grv", "d1b8033b40aa67c076039881eccce90d", 16659),
Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM)
},
kGroovieT7G, 0
},
@@ -63,7 +63,7 @@ static const GroovieGameDescription gameDescriptions[] = {
"t7g", "",
AD_ENTRY1s("T7GMac", "acdc4a58dd3f007f65e99b99d78e0bce", 1814029),
Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM)
},
kGroovieT7G, 0
},
@@ -79,7 +79,7 @@ static const GroovieGameDescription gameDescriptions[] = {
"t7g", "",
AD_ENTRY1s("T7GMac", "6bdee8d0f9eef6d58d02fcd7deec3fb2", 1830783),
Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM)
},
kGroovieT7G, 0
},
@@ -90,7 +90,7 @@ static const GroovieGameDescription gameDescriptions[] = {
"t7g", "",
AD_ENTRY1s("T7GMac", "0d595d4b44ae1814082938d051e5174e", 1830783),
Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM)
},
kGroovieT7G, 0
},
@@ -106,7 +106,7 @@ static const GroovieGameDescription gameDescriptions[] = {
{ NULL, 0, NULL, 0}
},
Common::RU_RUS, Common::kPlatformPC, ADGF_NO_FLAGS,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM)
},
kGroovieT7G, 0
},
@@ -120,7 +120,7 @@ static const GroovieGameDescription gameDescriptions[] = {
{ NULL, 0, NULL, 0}
},
Common::EN_ANY, Common::kPlatformIOS, ADGF_NO_FLAGS,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
kGroovieT7G, 0
},
@@ -132,7 +132,7 @@ static const GroovieGameDescription gameDescriptions[] = {
"11h", "",
AD_ENTRY1s("disk.1", "5c0428cd3659fc7bbcd0aa16485ed5da", 227),
Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM)
},
kGroovieV2, 1
},
@@ -142,8 +142,8 @@ static const GroovieGameDescription gameDescriptions[] = {
{
"11h", "Demo",
AD_ENTRY1s("disk.1", "aacb32ce07e0df2894bd83a3dee40c12", 70),
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, Common::GUIO_NOLAUNCHLOAD |
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE,
+ GUIO4(GUIO_NOLAUNCHLOAD, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM)
},
kGroovieV2, 1
},
@@ -153,7 +153,7 @@ static const GroovieGameDescription gameDescriptions[] = {
{
"11h", "Making Of",
AD_ENTRY1s("disk.1", "5c0428cd3659fc7bbcd0aa16485ed5da", 227),
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)
},
kGroovieV2, 2
},
@@ -163,7 +163,7 @@ static const GroovieGameDescription gameDescriptions[] = {
{
"clandestiny", "Trailer",
AD_ENTRY1s("disk.1", "5c0428cd3659fc7bbcd0aa16485ed5da", 227),
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)
},
kGroovieV2, 3
},
@@ -173,7 +173,7 @@ static const GroovieGameDescription gameDescriptions[] = {
{
"clandestiny", "",
AD_ENTRY1s("disk.1", "f79fc1515174540fef6a34132efc4c53", 76),
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI)
},
kGroovieV2, 1
},
@@ -183,7 +183,7 @@ static const GroovieGameDescription gameDescriptions[] = {
{
"unclehenry", "",
AD_ENTRY1s("disk.1", "0e1b1d3cecc4fc7efa62a968844d1f7a", 72),
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI)
},
kGroovieV2, 1
},
@@ -193,7 +193,7 @@ static const GroovieGameDescription gameDescriptions[] = {
{
"tlc", "",
AD_ENTRY1s("disk.1", "32a1afa68478f1f9d2b25eeea427f2e3", 84),
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI)
},
kGroovieV2, 1
},
@@ -216,7 +216,7 @@ public:
// to the detection entries. In the latter case, this TODO should be
// replaced with an according explanation.
_flags = kADFlagUseExtraAsHint;
- _guioptions = Common::GUIO_NOSUBTITLES | Common::GUIO_NOSFX;
+ _guioptions = GUIO2(GUIO_NOSUBTITLES, GUIO_NOSFX);
}
const char *getName() const {
diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp
index 5f95de649a..f5f02b5cdd 100644
--- a/engines/groovie/groovie.cpp
+++ b/engines/groovie/groovie.cpp
@@ -20,6 +20,9 @@
*
*/
+#include "audio/mididrv.h"
+#include "audio/mixer.h"
+
#include "groovie/groovie.h"
#include "groovie/cursor.h"
#include "groovie/detection.h"
diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp
index c6e990dfcf..af929d439b 100644
--- a/engines/groovie/music.cpp
+++ b/engines/groovie/music.cpp
@@ -20,6 +20,9 @@
*
*/
+#include "audio/mididrv.h"
+#include "audio/mixer.h"
+
#include "groovie/music.h"
#include "groovie/groovie.h"
#include "groovie/resource.h"
@@ -766,7 +769,7 @@ Common::SeekableReadStream *MusicPlayerMac::decompressMidi(Common::SeekableReadS
}
MusicPlayerIOS::MusicPlayerIOS(GroovieEngine *vm) : MusicPlayer(vm) {
- vm->getTimerManager()->installTimerProc(&onTimer, 50 * 1000, this);
+ vm->getTimerManager()->installTimerProc(&onTimer, 50 * 1000, this, "groovieMusic");
}
MusicPlayerIOS::~MusicPlayerIOS() {
diff --git a/engines/groovie/music.h b/engines/groovie/music.h
index 7af482e45d..cc852aa8dc 100644
--- a/engines/groovie/music.h
+++ b/engines/groovie/music.h
@@ -25,8 +25,6 @@
#include "common/array.h"
#include "common/mutex.h"
-#include "audio/mididrv.h"
-#include "audio/mixer.h"
class MidiParser;
diff --git a/engines/groovie/roq.cpp b/engines/groovie/roq.cpp
index 7f477c41fa..ca896a8d21 100644
--- a/engines/groovie/roq.cpp
+++ b/engines/groovie/roq.cpp
@@ -43,9 +43,6 @@
namespace Groovie {
ROQPlayer::ROQPlayer(GroovieEngine *vm) :
-#ifdef DITHER
- _dither(NULL),
-#endif
VideoPlayer(vm), _codingTypeCount(0),
_fg(&_vm->_graphicsMan->_foreground), _bg(&_vm->_graphicsMan->_background) {
@@ -55,38 +52,13 @@ ROQPlayer::ROQPlayer(GroovieEngine *vm) :
if (_vm->_mode8bit) {
byte pal[256 * 3];
-#ifdef DITHER
- // Initialize to a black palette
- memset(pal, 0, 256 * 3);
-
- // Build a basic color palette
- for (int r = 0; r < 4; r++) {
- for (int g = 0; g < 4; g++) {
- for (int b = 0; b < 4; b++) {
- byte col = (r << 4) | (g << 2) | (b << 0);
- pal[3 * col + 0] = r << 6;
- pal[3 * col + 1] = g << 6;
- pal[3 * col + 2] = b << 6;
- }
- }
- }
-
- // Initialize the dithering algorithm
- _paletteLookup = new Graphics::PaletteLUT(8, Graphics::PaletteLUT::kPaletteYUV);
- _paletteLookup->setPalette(pal, Graphics::PaletteLUT::kPaletteRGB, 8);
- for (int i = 0; (i < 64) && !_vm->shouldQuit(); i++) {
- debug("Groovie::ROQ: Building palette table: %02d/63", i);
- _paletteLookup->buildNext();
- }
-#else // !DITHER
// Set a grayscale palette
for (int i = 0; i < 256; i++) {
pal[(i * 3) + 0] = i;
pal[(i * 3) + 1] = i;
pal[(i * 3) + 2] = i;
}
-#endif // DITHER
_syst->getPaletteManager()->setPalette(pal, 0, 256);
}
@@ -98,12 +70,6 @@ ROQPlayer::~ROQPlayer() {
delete _currBuf;
_prevBuf->free();
delete _prevBuf;
-
-#ifdef DITHER
- // Free the dithering algorithm
- delete _dither;
- delete _paletteLookup;
-#endif
}
uint16 ROQPlayer::loadInternal() {
@@ -147,22 +113,13 @@ uint16 ROQPlayer::loadInternal() {
}
void ROQPlayer::buildShowBuf() {
-#ifdef DITHER
- // Start a new frame dithering
- _dither->newFrame();
-#endif
-
for (int line = 0; line < _bg->h; line++) {
byte *out = (byte *)_bg->getBasePtr(0, line);
byte *in = (byte *)_currBuf->getBasePtr(0, line / _scaleY);
for (int x = 0; x < _bg->w; x++) {
if (_vm->_mode8bit) {
-#ifdef DITHER
- *out = _dither->dither(*in, *(in + 1), *(in + 2), x);
-#else
// Just use the luminancy component
*out = *in;
-#endif // DITHER
#ifdef USE_RGB_COLOR
} else {
// Do the format conversion (YUV -> RGB -> Screen format)
@@ -178,9 +135,6 @@ void ROQPlayer::buildShowBuf() {
if (!(x % _scaleX))
in += _currBuf->format.bytesPerPixel;
}
-#ifdef DITHER
- _dither->nextLine();
-#endif
}
// Swap buffers
@@ -349,11 +303,6 @@ bool ROQPlayer::processBlockInfo(ROQBlockHeader &blockHeader) {
*ptr2++ = 128;
}
-#ifdef DITHER
- // Reset the dithering algorithm with the new width
- delete _dither;
- _dither = new Graphics::SierraLight(width * _scaleX, _paletteLookup);
-#endif
}
return true;
diff --git a/engines/groovie/roq.h b/engines/groovie/roq.h
index ddb307065c..c5d3f255d3 100644
--- a/engines/groovie/roq.h
+++ b/engines/groovie/roq.h
@@ -25,12 +25,6 @@
#include "groovie/player.h"
-//#define DITHER
-
-#ifdef DITHER
-#include "graphics/dither.h"
-#endif
-
namespace Groovie {
class GroovieEngine;
@@ -89,11 +83,6 @@ private:
bool _dirty;
byte _alpha;
-#ifdef DITHER
- // Dithering
- Graphics::PaletteLUT *_paletteLookup;
- Graphics::SierraLight *_dither;
-#endif
};
} // End of Groovie namespace
diff --git a/engines/groovie/saveload.cpp b/engines/groovie/saveload.cpp
index a0463db0be..14e7a09cb2 100644
--- a/engines/groovie/saveload.cpp
+++ b/engines/groovie/saveload.cpp
@@ -102,7 +102,7 @@ Common::InSaveFile *SaveLoad::openForLoading(const Common::String &target, int s
// Fill the SaveStateDescriptor if it was provided
if (descriptor) {
// Initialize the SaveStateDescriptor
- descriptor->setVal("save_slot", Common::String('0' + slot));
+ descriptor->setSaveSlot(slot);
descriptor->setDeletableFlag(true);
descriptor->setWriteProtectedFlag(false);
@@ -132,7 +132,7 @@ Common::InSaveFile *SaveLoad::openForLoading(const Common::String &target, int s
description += c;
}
}
- descriptor->setVal("description", description);
+ descriptor->setDescription(description);
}
// Return a substream, skipping the metadata
diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp
index f87e6bb91b..9003a58ab8 100644
--- a/engines/groovie/script.cpp
+++ b/engines/groovie/script.cpp
@@ -20,6 +20,9 @@
*
*/
+#include "audio/mididrv.h"
+#include "audio/mixer.h"
+
#include "groovie/script.h"
#include "groovie/cell.h"
#include "groovie/cursor.h"
@@ -1350,15 +1353,15 @@ void Script::o_checkvalidsaves() {
uint count = 0;
SaveStateList::iterator it = list.begin();
while (it != list.end()) {
- int8 slot = it->getVal("save_slot").lastChar() - '0';
+ int8 slot = it->getSaveSlot();
if (SaveLoad::isSlotValid(slot)) {
- debugScript(2, true, " Found valid savegame: %s", it->getVal("description").c_str());
+ debugScript(2, true, " Found valid savegame: %s", it->getDescription().c_str());
// Mark this slot as used
setVariable(slot, 1);
// Cache this slot's description
- _saveNames[slot] = it->getVal("description");
+ _saveNames[slot] = it->getDescription();
count++;
}
it++;
diff --git a/engines/hugo/detection.cpp b/engines/hugo/detection.cpp
index f70a21aa8f..43e688bba4 100644
--- a/engines/hugo/detection.cpp
+++ b/engines/hugo/detection.cpp
@@ -63,7 +63,7 @@ static const HugoGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeHugo1
},
@@ -75,7 +75,7 @@ static const HugoGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
GF_PACKED,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeHugo1
},
@@ -87,7 +87,7 @@ static const HugoGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
GF_PACKED,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeHugo2
},
@@ -99,7 +99,7 @@ static const HugoGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
GF_PACKED,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeHugo2
},
@@ -111,7 +111,7 @@ static const HugoGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
GF_PACKED,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeHugo3
},
@@ -123,7 +123,7 @@ static const HugoGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
GF_PACKED,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
kGameTypeHugo3
},
@@ -241,12 +241,7 @@ SaveStateDescriptor HugoMetaEngine::querySaveMetaInfos(const char *target, int s
SaveStateDescriptor desc(slot, saveName);
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- if (!Graphics::loadThumbnail(*file, *thumbnail)) {
- delete thumbnail;
- thumbnail = 0;
- }
+ Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*file);
desc.setThumbnail(thumbnail);
desc.setDeletableFlag(true);
diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp
index 2d35bb0448..fa18d6b791 100644
--- a/engines/hugo/display.cpp
+++ b/engines/hugo/display.cpp
@@ -813,4 +813,3 @@ overlayState_t Screen_v1w::findOvl(seq_t *seq_p, image_pt dst_p, uint16 y) {
}
} // End of namespace Hugo
-
diff --git a/engines/hugo/file.cpp b/engines/hugo/file.cpp
index cde6e108ea..2217cef92a 100644
--- a/engines/hugo/file.cpp
+++ b/engines/hugo/file.cpp
@@ -695,4 +695,3 @@ void FileManager::readUIFImages() {
}
} // End of namespace Hugo
-
diff --git a/engines/hugo/file_v1d.cpp b/engines/hugo/file_v1d.cpp
index 9ebd9d284c..c3bb0e275f 100644
--- a/engines/hugo/file_v1d.cpp
+++ b/engines/hugo/file_v1d.cpp
@@ -62,7 +62,7 @@ void FileManager_v1d::readOverlay(const int screenNum, image_pt image, const ovl
Common::String buf = Common::String(_vm->_text->getScreenNames(screenNum)) + Common::String(ovl_ext[overlayType]);
if (!Common::File::exists(buf)) {
- memset(image, 0, sizeof(image));
+ memset(image, 0, kOvlSize);
warning("File not found: %s", buf.c_str());
return;
}
@@ -128,4 +128,3 @@ void FileManager_v1d::instructions() const {
}
} // End of namespace Hugo
-
diff --git a/engines/hugo/file_v1w.cpp b/engines/hugo/file_v1w.cpp
index eb2226f18a..8a06cef939 100644
--- a/engines/hugo/file_v1w.cpp
+++ b/engines/hugo/file_v1w.cpp
@@ -80,11 +80,10 @@ void FileManager_v1w::readOverlay(const int screenNum, image_pt image, ovl_t ove
break;
}
if (i == 0) {
- memset(image, 0, sizeof(image));
+ memset(image, 0, kOvlSize);
return;
}
_sceneryArchive1.read(tmpImage, kOvlSize);
}
} // End of namespace Hugo
-
diff --git a/engines/hugo/file_v2d.cpp b/engines/hugo/file_v2d.cpp
index 2a663edcfa..520e1b77b6 100644
--- a/engines/hugo/file_v2d.cpp
+++ b/engines/hugo/file_v2d.cpp
@@ -136,7 +136,7 @@ void FileManager_v2d::readOverlay(const int screenNum, image_pt image, ovl_t ove
break;
}
if (i == 0) {
- memset(image, 0, sizeof(image));
+ memset(image, 0, kOvlSize);
return;
}
@@ -187,4 +187,3 @@ const char *FileManager_v2d::fetchString(const int index) {
return _fetchStringBuf;
}
} // End of namespace Hugo
-
diff --git a/engines/hugo/file_v2w.cpp b/engines/hugo/file_v2w.cpp
index 1384f02df6..98a15526fa 100644
--- a/engines/hugo/file_v2w.cpp
+++ b/engines/hugo/file_v2w.cpp
@@ -49,4 +49,3 @@ void FileManager_v2w::instructions() const {
}
} // End of namespace Hugo
-
diff --git a/engines/hugo/file_v3d.cpp b/engines/hugo/file_v3d.cpp
index 7ac0ffc48a..d86003a040 100644
--- a/engines/hugo/file_v3d.cpp
+++ b/engines/hugo/file_v3d.cpp
@@ -143,7 +143,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
break;
}
if (i == 0) {
- memset(image, 0, sizeof(image));
+ memset(image, 0, kOvlSize);
return;
}
@@ -182,7 +182,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
break;
}
if (i == 0) {
- memset(image, 0, sizeof(image));
+ memset(image, 0, kOvlSize);
return;
}
@@ -205,4 +205,3 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
}
}
} // End of namespace Hugo
-
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index 7b54c7701d..df8abf32eb 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -463,7 +463,7 @@ bool HugoEngine::loadHugoDat() {
if (varnt == _gameVariant) {
_numStates = numElem;
_screenStates = (byte *)malloc(sizeof(byte) * numElem);
- memset(_screenStates, 0, sizeof(_screenStates));
+ memset(_screenStates, 0, sizeof(byte) * numElem);
}
}
diff --git a/engines/hugo/intro.cpp b/engines/hugo/intro.cpp
index c66c0ef624..72f718fe8e 100644
--- a/engines/hugo/intro.cpp
+++ b/engines/hugo/intro.cpp
@@ -317,7 +317,7 @@ void intro_v3d::introInit() {
_vm->_file->readBackground(22); // display screen MAP_3d
_vm->_screen->displayBackground();
introTicks = 0;
- _vm->_sound->DOSSongPtr = _vm->_sound->DOSIntroSong;
+ _vm->_sound->_DOSSongPtr = _vm->_sound->_DOSIntroSong;
}
/**
diff --git a/engines/hugo/object.cpp b/engines/hugo/object.cpp
index e5c7b4bf90..bc99abf410 100644
--- a/engines/hugo/object.cpp
+++ b/engines/hugo/object.cpp
@@ -283,7 +283,7 @@ void ObjectHandler::freeObjects() {
free(_uses);
}
- for(int16 i = 0; i < _objCount; i++) {
+ for (int16 i = 0; i < _objCount; i++) {
free(_objects[i].stateDataIndex);
_objects[i].stateDataIndex = 0;
}
diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp
index 5cb97f2dc5..bbf6c39f13 100644
--- a/engines/hugo/parser.cpp
+++ b/engines/hugo/parser.cpp
@@ -235,7 +235,7 @@ void Parser::charHandler() {
if (_cmdLineIndex >= kMaxLineSize) {
//MessageBeep(MB_ICONASTERISK);
warning("STUB: MessageBeep() - Command line too long");
- } else if (isprint(c)) {
+ } else if (isprint(static_cast<unsigned char>(c))) {
_cmdLine[_cmdLineIndex++] = c;
_cmdLine[_cmdLineIndex] = '\0';
}
@@ -449,7 +449,7 @@ const char *Parser::findVerb() const {
*/
void Parser::showDosInventory() const {
debugC(1, kDebugParser, "showDosInventory()");
- static const char *blanks = " ";
+ static const char *const blanks = " ";
uint16 index = 0, len1 = 0, len2 = 0;
for (int i = 0; i < _vm->_object->_numObj; i++) { // Find widths of 2 columns
diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp
index d1b4aa6a9c..384b3ace8f 100644
--- a/engines/hugo/schedule.cpp
+++ b/engines/hugo/schedule.cpp
@@ -297,7 +297,7 @@ void Scheduler::readAct(Common::ReadStream &in, act &curAct) {
curAct.a3.timer = in.readSint16BE();
curAct.a3.promptIndex = in.readSint16BE();
numSubAct = in.readUint16BE();
- curAct.a3.responsePtr = (int *) malloc(sizeof(int) * numSubAct);
+ curAct.a3.responsePtr = (int *)malloc(sizeof(int) * numSubAct);
for (int k = 0; k < numSubAct; k++)
curAct.a3.responsePtr[k] = in.readSint16BE();
curAct.a3.actPassIndex = in.readUint16BE();
@@ -566,7 +566,7 @@ void Scheduler::loadActListArr(Common::ReadStream &in) {
for (int i = 0; i < numElem; i++) {
numSubElem = in.readUint16BE();
if (varnt == _vm->_gameVariant)
- _actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
+ _actListArr[i] = (act *)malloc(sizeof(act) * (numSubElem + 1));
for (int j = 0; j < numSubElem; j++) {
if (varnt == _vm->_gameVariant) {
readAct(in, _actListArr[i][j]);
@@ -1416,7 +1416,7 @@ event_t *Scheduler::doAction(event_t *curEvent) {
break;
case OLD_SONG:
// Replaces ACT26 for DOS games.
- _vm->_sound->DOSSongPtr = _vm->_text->getTextData(action->a49.songIndex);
+ _vm->_sound->_DOSSongPtr = _vm->_text->getTextData(action->a49.songIndex);
break;
default:
error("An error has occurred: %s", "doAction");
@@ -1557,7 +1557,7 @@ void Scheduler_v1d::decodeString(char *line) {
debugC(1, kDebugSchedule, "decodeString(%s)", line);
uint16 linelength = strlen(line);
- for(uint16 i = 0; i < linelength; i++) {
+ for (uint16 i = 0; i < linelength; i++) {
line[i] = (line[i] + _cypher.c_str()[i % _cypher.size()]) % '~';
if (line[i] < ' ')
line[i] += ' ';
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
index 1fea1f4343..9dcd7d346a 100644
--- a/engines/hugo/sound.cpp
+++ b/engines/hugo/sound.cpp
@@ -123,11 +123,11 @@ SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) {
_speakerStream = new Audio::PCSpeaker(_vm->_mixer->getOutputRate());
_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_speakerHandle,
_speakerStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
- DOSSongPtr = 0;
- curPriority = 0;
- pcspkrTimer = 0;
- pcspkrOctave = 3;
- pcspkrNoteDuration = 2;
+ _DOSSongPtr = 0;
+ _curPriority = 0;
+ _pcspkrTimer = 0;
+ _pcspkrOctave = 3;
+ _pcspkrNoteDuration = 2;
}
SoundHandler::~SoundHandler() {
@@ -207,7 +207,7 @@ void SoundHandler::playSound(int16 sound, const byte priority) {
return;
syncVolume();
- curPriority = priority;
+ _curPriority = priority;
// Get sound data
if ((sound_p = _vm->_file->getSound(sound, &size)) == 0)
@@ -269,94 +269,112 @@ void SoundHandler::pcspkr_player() {
static const uint16 pcspkrSharps[8] = {1279, 1171, 2150, 1916, 1755, 1611, 1435}; // The sharps, A# to B#
static const uint16 pcspkrFlats[8] = {1435, 1279, 2342, 2150, 1916, 1755, 1611}; // The flats, Ab to Bb
- _vm->getTimerManager()->removeTimerProc(&loopPlayer);
- _vm->getTimerManager()->installTimerProc(&loopPlayer, 1000000 / 9, this);
-
- uint16 count; // Value to set timer chip to for note
- bool cmd_note;
-
+ // Does the user not want any sound?
if (!_vm->_config.soundFl || !_vm->_mixer->isReady())
- return; // Poo! User doesn't want sound!
+ return;
- if (!DOSSongPtr)
+ // Is there no song?
+ if (!_DOSSongPtr)
return;
- if (!*DOSSongPtr) // Song has finished
+ // Did we reach the end of the song?
+ if (!*_DOSSongPtr)
return;
- if (!--pcspkrTimer) { // timer zero, stop note
+ // Update the timer.
+ _pcspkrTimer--;
+
+ // Check the timer state..
+ if (!_pcspkrTimer) {
+ // A note just finished, stop the sound (if any) and return.
_speakerStream->stop();
return;
- } else if (pcspkrTimer >= 0) { // Note still going
+ } else if (_pcspkrTimer > 0) {
+ // A (rest or normal) note is still playing, return.
return;
}
- // Time to play next note
+ // The timer is <0, time to play the next note.
+ bool cmdNote = true;
do {
- cmd_note = true;
- switch (*DOSSongPtr) {
- case 'O': // Switch to new octave 1..7
- DOSSongPtr++;
- pcspkrOctave = *DOSSongPtr - '0';
- if ((pcspkrOctave < 0) || (pcspkrOctave > 7))
+ switch (*_DOSSongPtr) {
+ case 'O':
+ // Switch to new octave 0..7
+ _DOSSongPtr++;
+ _pcspkrOctave = *_DOSSongPtr - '0';
+ if ((_pcspkrOctave < 0) || (_pcspkrOctave > 7))
error("pcspkr_player() - Bad octave");
- DOSSongPtr++;
+ _DOSSongPtr++;
break;
- case 'L': // Switch to new duration (in ticks)
- DOSSongPtr++;
- pcspkrNoteDuration = *DOSSongPtr - '0';
- if (pcspkrNoteDuration < 0)
+ case 'L':
+ // Switch to new duration (in ticks)
+ _DOSSongPtr++;
+ _pcspkrNoteDuration = *_DOSSongPtr - '0';
+ if (_pcspkrNoteDuration < 0)
error("pcspkr_player() - Bad duration");
- pcspkrNoteDuration--;
- DOSSongPtr++;
+ _pcspkrNoteDuration--;
+ _DOSSongPtr++;
break;
case '<':
- case '^': // Move up an octave
- pcspkrOctave++;
- DOSSongPtr++;
+ case '^':
+ // Move up an octave
+ _DOSSongPtr++;
+ _pcspkrOctave++;
break;
case '>':
- case 'v': // Move down an octave
- pcspkrOctave--;
- DOSSongPtr++;
+ case 'v':
+ // Move down an octave
+ _DOSSongPtr++;
+ _pcspkrOctave--;
break;
default:
- cmd_note = false;
+ // Not a command, probably a note; so we should stop
+ // processing commands and move onward now.
+ cmdNote = false;
break;
}
- } while (cmd_note);
+ } while (cmdNote);
- switch (*DOSSongPtr) {
- case 'A': // The notes.
+ switch (*_DOSSongPtr) {
+ case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
- count = pcspkrNotes[*DOSSongPtr - 'A'];
- switch (DOSSongPtr[1]) { // Check for sharp or flat (#, -)
+ // Play a note.
+
+ // First, what frequency does this note get played at?
+ // We must check for sharp or flat (#, -).
+ uint16 count;
+ switch (_DOSSongPtr[1]) {
case '#':
- count = pcspkrSharps[*DOSSongPtr++ - 'A'];
+ count = pcspkrSharps[*_DOSSongPtr++ - 'A'];
break;
case 'b':
- count = pcspkrFlats[*DOSSongPtr++ - 'A'];
+ count = pcspkrFlats[*_DOSSongPtr++ - 'A'];
break;
default:
+ count = pcspkrNotes[*_DOSSongPtr - 'A'];
break;
}
- if (pcspkrOctave > 3) // Adjust for octave
- count /= (1 << (pcspkrOctave - 3));
- else if (pcspkrOctave < 3)
- count *= (1 << (3 - pcspkrOctave));
- _speakerStream->play(Audio::PCSpeaker::kWaveFormSaw, kHugoCNT / count, (int32) ((1 + pcspkrNoteDuration) * _vm->_normalTPS) * 8);
- pcspkrTimer = pcspkrNoteDuration;
- DOSSongPtr++;
+ // Adjust for the octave if needed.
+ if (_pcspkrOctave > 3)
+ count /= (1 << (_pcspkrOctave - 3));
+ else if (_pcspkrOctave < 3)
+ count *= (1 << (3 - _pcspkrOctave));
+
+ // Start a note playing (we will stop it when the timer expires).
+ _speakerStream->play(Audio::PCSpeaker::kWaveFormSquare, kHugoCNT / count, -1);
+ _pcspkrTimer = _pcspkrNoteDuration;
+ _DOSSongPtr++;
break;
- case '.': // A rest note
+ case '.':
+ // Play a 'rest note' by being silent for a bit.
_speakerStream->stop();
- pcspkrTimer = pcspkrNoteDuration;
- DOSSongPtr++;
+ _pcspkrTimer = _pcspkrNoteDuration;
+ _DOSSongPtr++;
break;
default:
warning("pcspkr_player() - Unhandled note");
@@ -367,12 +385,12 @@ void SoundHandler::loadIntroSong(Common::ReadStream &in) {
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numBuf = in.readUint16BE();
if (varnt == _vm->_gameVariant)
- DOSIntroSong = _vm->_text->getTextData(numBuf);
+ _DOSIntroSong = _vm->_text->getTextData(numBuf);
}
}
void SoundHandler::initPcspkrPlayer() {
- _vm->getTimerManager()->installTimerProc(&loopPlayer, 1000000 / 9, this);
+ _vm->getTimerManager()->installTimerProc(&loopPlayer, 1000000 / _vm->_normalTPS, this, "hugoSoundLoop");
}
} // End of namespace Hugo
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
index 33dba9f2a8..1e504fbdea 100644
--- a/engines/hugo/sound.h
+++ b/engines/hugo/sound.h
@@ -60,12 +60,12 @@ public:
static const int kHugoCNT = 1190000;
- int8 pcspkrTimer; // Timer (ticks) for note being played
- int8 pcspkrOctave; // Current octave 1..7
- int8 pcspkrNoteDuration; // Current length of note (ticks)
+ int8 _pcspkrTimer; // Timer (ticks) for note being played
+ int8 _pcspkrOctave; // Current octave 1..7
+ int8 _pcspkrNoteDuration; // Current length of note (ticks)
- const char *DOSSongPtr;
- const char *DOSIntroSong;
+ const char *_DOSSongPtr;
+ const char *_DOSIntroSong;
void toggleMusic();
void toggleSound();
@@ -80,7 +80,7 @@ public:
void loadIntroSong(Common::ReadStream &in);
void initPcspkrPlayer();
protected:
- byte curPriority; // Priority of currently playing sound
+ byte _curPriority; // Priority of currently playing sound
private:
HugoEngine *_vm;
diff --git a/engines/hugo/util.cpp b/engines/hugo/util.cpp
index a936a23de1..6dc9890c3a 100644
--- a/engines/hugo/util.cpp
+++ b/engines/hugo/util.cpp
@@ -119,7 +119,7 @@ char *strlwr(char *buffer) {
char *result = buffer;
while (*buffer != '\0') {
- if (isupper(*buffer))
+ if (isupper(static_cast<unsigned char>(*buffer)))
*buffer = tolower(*buffer);
buffer++;
}
diff --git a/engines/kyra/animator_hof.cpp b/engines/kyra/animator_hof.cpp
index 4cdb622501..741e358143 100644
--- a/engines/kyra/animator_hof.cpp
+++ b/engines/kyra/animator_hof.cpp
@@ -314,4 +314,3 @@ void KyraEngine_HoF::resetCharacterAnimDim() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/animator_lok.cpp b/engines/kyra/animator_lok.cpp
index 3e9dd7aa66..4126681bbe 100644
--- a/engines/kyra/animator_lok.cpp
+++ b/engines/kyra/animator_lok.cpp
@@ -649,4 +649,3 @@ void Animator_LoK::setCharactersHeight() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/animator_lok.h b/engines/kyra/animator_lok.h
index 21d24866c8..74b8305468 100644
--- a/engines/kyra/animator_lok.h
+++ b/engines/kyra/animator_lok.h
@@ -125,4 +125,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/animator_mr.cpp b/engines/kyra/animator_mr.cpp
index 84bda3f3fd..31c5cd1a53 100644
--- a/engines/kyra/animator_mr.cpp
+++ b/engines/kyra/animator_mr.cpp
@@ -445,7 +445,7 @@ void KyraEngine_MR::showIdleAnim() {
if (!_nextIdleType && !talkObjectsInCurScene()) {
randomSceneChat();
} else {
- static const char *facingTable[] = {
+ static const char *const facingTable[] = {
"A", "R", "R", "FR", "FX", "FL", "L", "L"
};
@@ -459,4 +459,3 @@ void KyraEngine_MR::showIdleAnim() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/animator_v2.cpp b/engines/kyra/animator_v2.cpp
index ad7057f11a..334356e261 100644
--- a/engines/kyra/animator_v2.cpp
+++ b/engines/kyra/animator_v2.cpp
@@ -185,4 +185,3 @@ void KyraEngine_v2::deleteItemAnimEntry(int item) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp
index d0baf8a133..dfc2a9f868 100644
--- a/engines/kyra/debugger.cpp
+++ b/engines/kyra/debugger.cpp
@@ -71,11 +71,18 @@ bool Debugger::cmd_loadPalette(int argc, const char **argv) {
}
if (_vm->game() != GI_KYRA1 && _vm->resource()->getFileSize(argv[1]) != 768) {
- uint8 buffer[320*200];
+ uint8 *buffer = new uint8[320 * 200 * sizeof(uint8)];
+ if (!buffer) {
+ DebugPrintf("ERROR: Cannot allocate buffer for screen region!\n");
+ return true;
+ }
+
_vm->screen()->copyRegionToBuffer(5, 0, 0, 320, 200, buffer);
_vm->screen()->loadBitmap(argv[1], 5, 5, 0);
palette.copy(_vm->screen()->getCPagePtr(5), 0, 256);
_vm->screen()->copyBlockToPage(5, 0, 0, 320, 200, buffer);
+
+ delete[] buffer;
} else if (!_vm->screen()->loadPalette(argv[1], palette)) {
DebugPrintf("ERROR: Palette '%s' not found!\n", argv[1]);
return true;
@@ -454,4 +461,3 @@ Debugger_LoL::Debugger_LoL(LoLEngine *vm) : Debugger(vm), _vm(vm) {
#endif // ENABLE_LOL
} // End of namespace Kyra
-
diff --git a/engines/kyra/debugger.h b/engines/kyra/debugger.h
index 70c547381e..09ddd89a7a 100644
--- a/engines/kyra/debugger.h
+++ b/engines/kyra/debugger.h
@@ -106,4 +106,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp
index a6af584fb8..68eb08210e 100644
--- a/engines/kyra/detection.cpp
+++ b/engines/kyra/detection.cpp
@@ -187,6 +187,7 @@ void KyraMetaEngine::removeSaveState(const char *target, int slot) const {
SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
Common::String filename = Kyra::KyraEngine_v1::getSavegameFilename(target, slot);
Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename);
+ const bool lolGame = ConfMan.getDomain(target)->getVal("gameid").equalsIgnoreCase("lol");
if (in) {
Kyra::KyraEngine_v1::SaveHeader header;
@@ -198,14 +199,13 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s
if (error == Kyra::KyraEngine_v1::kRSHENoError) {
SaveStateDescriptor desc(slot, header.description);
- bool lolGame = ConfMan.getDomain(target)->getVal("gameid").equalsIgnoreCase("lol");
-
// Slot 0 is used for the 'restart game' save in all three Kyrandia games, thus
// we prevent it from being deleted.
desc.setDeletableFlag(slot != 0 || lolGame);
// We don't allow quick saves (slot 990 till 998) to be overwritten.
- // The same goes for the 'Autosave', which is slot 999.
+ // The same goes for the 'Autosave', which is slot 999. Slot 0 will also
+ // be protected in Kyra 1-3, since it's the 'restart game' save.
desc.setWriteProtectedFlag((slot == 0 && !lolGame) || slot >= 990);
desc.setThumbnail(header.thumbnail);
@@ -213,7 +213,14 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s
}
}
- return SaveStateDescriptor();
+ SaveStateDescriptor desc(slot, Common::String());
+
+ // We don't allow quick saves (slot 990 till 998) to be overwritten.
+ // The same goes for the 'Autosave', which is slot 999. Slot 0 will also
+ // be protected in Kyra 1-3, since it's the 'restart game' save.
+ desc.setWriteProtectedFlag((slot == 0 && !lolGame) || slot >= 990);
+
+ return desc;
}
#if PLUGIN_ENABLED_DYNAMIC(KYRA)
@@ -221,4 +228,3 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s
#else
REGISTER_PLUGIN_STATIC(KYRA, PLUGIN_TYPE_ENGINE, KyraMetaEngine);
#endif
-
diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h
index 47a3c4362a..5c1e9df408 100644
--- a/engines/kyra/detection_tables.h
+++ b/engines/kyra/detection_tables.h
@@ -21,38 +21,41 @@
namespace {
-#define FLAGS(x, y, z, a, b, c, d, id) { Common::UNK_LANG, Common::UNK_LANG, Common::UNK_LANG, Common::kPlatformUnknown, x, y, z, a, b, c, d, id }
-#define FLAGS_FAN(fanLang, repLang, x, y, z, a, b, c, d, id) { Common::UNK_LANG, fanLang, repLang, Common::kPlatformUnknown, x, y, z, a, b, c, d, id }
-
-#define KYRA1_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_KYRA1)
-#define KYRA1_AMIGA_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_TOWNS_FLAGS FLAGS(false, true, false, false, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_TOWNS_SJIS_FLAGS FLAGS(false, true, false, true, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_CD_FLAGS FLAGS(false, true, true, false, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_DEMO_CD_FLAGS FLAGS(true, true, true, false, false, false, false, Kyra::GI_KYRA1)
-
-#define KYRA2_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_KYRA2)
-#define KYRA2_CD_FLAGS FLAGS(false, false, true, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_CD_DEMO_FLAGS FLAGS(true, false, true, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_TOWNS_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_TOWNS_SJIS_FLAGS FLAGS(false, false, false, true, false, false, false, Kyra::GI_KYRA2)
-
-#define KYRA3_CD_FLAGS FLAGS(false, false, true, false, false, true, true, Kyra::GI_KYRA3)
-#define KYRA3_CD_INS_FLAGS FLAGS(false, false, true, false, false, true, false, Kyra::GI_KYRA3)
-#define KYRA3_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, true, false, Kyra::GI_KYRA3)
-
-#define LOL_CD_FLAGS FLAGS(false, false, true, false, false, false, false, Kyra::GI_LOL)
-#define LOL_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, false, Kyra::GI_LOL)
-#define LOL_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_LOL)
-#define LOL_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_LOL)
-#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, true, true, false, false, Kyra::GI_LOL)
-#define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, Kyra::GI_LOL)
-#define LOL_KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2)
+#define FLAGS(x, y, z, a, b, c, d, e, id) { Common::UNK_LANG, Common::UNK_LANG, Common::UNK_LANG, Common::kPlatformUnknown, x, y, z, a, b, c, d, e, id }
+#define FLAGS_FAN(fanLang, repLang, x, y, z, a, b, c, d, e, id) { Common::UNK_LANG, fanLang, repLang, Common::kPlatformUnknown, x, y, z, a, b, c, d, e, id }
+
+#define KYRA1_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, false, true, Kyra::GI_KYRA1)
+#define KYRA1_OLDFLOPPY_FLAGS FLAGS(false, false, false, true, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_AMIGA_FLAGS FLAGS(false, false, false, false, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_TOWNS_FLAGS FLAGS(false, true, false, false, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_TOWNS_SJIS_FLAGS FLAGS(false, true, false, false, true, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_CD_FLAGS FLAGS(false, true, true, false, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_DEMO_CD_FLAGS FLAGS(true, true, true, false, false, false, false, false, Kyra::GI_KYRA1)
+
+#define KYRA2_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, false, true, Kyra::GI_KYRA2)
+#define KYRA2_FLOPPY_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, false, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_CD_FLAGS FLAGS(false, false, true, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_CD_DEMO_FLAGS FLAGS(true, false, true, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_TOWNS_FLAGS FLAGS(false, false, false, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_TOWNS_SJIS_FLAGS FLAGS(false, false, false, false, true, false, false, false, Kyra::GI_KYRA2)
+
+#define KYRA3_CD_FLAGS FLAGS(false, false, true, false, false, false, true, true, Kyra::GI_KYRA3)
+#define KYRA3_CD_INS_FLAGS FLAGS(false, false, true, false, false, false, true, false, Kyra::GI_KYRA3)
+#define KYRA3_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, true, false, Kyra::GI_KYRA3)
+
+#define LOL_CD_FLAGS FLAGS(false, false, true, false, false, false, false, false, Kyra::GI_LOL)
+#define LOL_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, false, false, Kyra::GI_LOL)
+#define LOL_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, false, Kyra::GI_LOL)
+#define LOL_FLOPPY_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, false, false, false, false, false, false, Kyra::GI_LOL)
+#define LOL_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, false, true, Kyra::GI_LOL)
+#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, false, true, true, false, false, Kyra::GI_LOL)
+#define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, false, Kyra::GI_LOL)
+#define LOL_KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, false, Kyra::GI_KYRA2)
const KYRAGameDescription adGameDescs[] = {
/* disable these targets until they get supported
@@ -64,7 +67,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_CMP_FLAGS
},
@@ -77,7 +80,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_CMP_FLAGS
},
@@ -91,10 +94,11 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
+
{
{
"kyra1",
@@ -103,7 +107,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
@@ -115,7 +119,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
@@ -127,7 +131,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
@@ -139,10 +143,22 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
+ {
+ {
+ "kyra1",
+ "Extracted",
+ AD_ENTRY1("GEMCUT.EMC", "689b62b7519215c1b2571d466c95624c"),
+ Common::RU_RUS,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
+ },
+ KYRA1_OLDFLOPPY_FLAGS
+ },
{ // from VooD
{
"kyra1",
@@ -151,7 +167,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
@@ -163,7 +179,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
@@ -175,7 +191,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_FLOPPY_FLAGS
},
@@ -192,7 +208,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIAMIGA
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDIAMIGA)
},
KYRA1_AMIGA_FLAGS
},
@@ -209,7 +225,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIAMIGA
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDIAMIGA)
},
KYRA1_AMIGA_FLAGS
},
@@ -226,7 +242,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIGM
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDIGM)
},
KYRA1_FLOPPY_FLAGS
},
@@ -243,7 +259,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformFMTowns,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDITOWNS)
},
KYRA1_TOWNS_FLAGS
},
@@ -259,7 +275,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::JA_JPN,
Common::kPlatformFMTowns,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDITOWNS)
},
KYRA1_TOWNS_SJIS_FLAGS
},
@@ -278,7 +294,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::JA_JPN,
Common::kPlatformPC98,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDIPC98)
},
KYRA1_TOWNS_SJIS_FLAGS
},
@@ -291,7 +307,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_CD_FLAGS
},
@@ -303,7 +319,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_CD_FLAGS
},
@@ -315,7 +331,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_CD_FLAGS
},
@@ -328,7 +344,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_CD_FLAGS
},
@@ -345,7 +361,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_CD,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
KYRA1_CD_FLAGS
},
@@ -361,7 +377,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformMacintosh,
ADGF_CD,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
KYRA1_CD_FLAGS
},
@@ -377,7 +393,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformMacintosh,
ADGF_CD,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
KYRA1_CD_FLAGS
},
@@ -390,7 +406,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_DEMO_FLAGS
},
@@ -403,7 +419,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
+ GUIO3(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK)
},
KYRA1_DEMO_CD_FLAGS
},
@@ -416,7 +432,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_FLOPPY_CMP_FLAGS
},
@@ -429,7 +445,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_FLOPPY_CMP_FLAGS
},
@@ -442,7 +458,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_FLOPPY_FLAGS
},
@@ -455,7 +471,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_FLOPPY_FLAGS
},
@@ -468,7 +484,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_FLOPPY_FLAGS
},
@@ -481,11 +497,37 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_FLOPPY_FLAGS
},
+ { // Floppy version extracted
+ {
+ "kyra2",
+ "Extracted",
+ AD_ENTRY1("CH01-S00.DLG", "54b7a5a94f6e1ec91f0fb1311eec09ab"),
+ Common::RU_RUS,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
+ },
+ KYRA2_FLOPPY_FAN_FLAGS(Common::RU_RUS, Common::EN_ANY)
+ },
+
+ { // Floppy version extracted
+ {
+ "kyra2",
+ "Extracted",
+ AD_ENTRY1("CH01-S00.DLG", "7c36c0e63ab8c81cbb3ea58681331366"),
+ Common::RU_RUS,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
+ },
+ KYRA2_FLOPPY_FAN_FLAGS(Common::RU_RUS, Common::EN_ANY)
+ },
+
{ // CD version
{
"kyra2",
@@ -494,7 +536,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FLAGS
},
@@ -506,7 +548,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FLAGS
},
@@ -518,7 +560,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FLAGS
},
@@ -532,7 +574,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -544,7 +586,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -556,7 +598,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -569,7 +611,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -582,7 +624,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -595,7 +637,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -608,7 +650,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_DEMO_FLAGS
},
@@ -621,7 +663,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_DEMO_FLAGS
},
@@ -634,7 +676,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_CD_DEMO_FLAGS
},
@@ -647,7 +689,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
KYRA2_DEMO_FLAGS
},
@@ -660,7 +702,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformFMTowns,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDITOWNS)
},
KYRA2_TOWNS_FLAGS
},
@@ -672,7 +714,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::JA_JPN,
Common::kPlatformFMTowns,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDITOWNS)
},
KYRA2_TOWNS_SJIS_FLAGS
},
@@ -684,7 +726,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC98,
ADGF_CD,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDIPC98)
},
KYRA2_TOWNS_FLAGS
},
@@ -696,7 +738,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::JA_JPN,
Common::kPlatformPC98,
ADGF_CD,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDIPC98)
},
KYRA2_TOWNS_SJIS_FLAGS
},
@@ -716,7 +758,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FLAGS
},
@@ -732,7 +774,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FLAGS
},
@@ -748,7 +790,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FLAGS
},
@@ -766,7 +808,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_INS_FLAGS
},
@@ -782,7 +824,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_INS_FLAGS
},
@@ -798,7 +840,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_INS_FLAGS
},
@@ -816,7 +858,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_INS_FLAGS
},
@@ -832,7 +874,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformMacintosh,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_INS_FLAGS
},
@@ -848,7 +890,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformMacintosh,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_INS_FLAGS
},
@@ -866,7 +908,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY)
},
@@ -882,7 +924,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY)
},
@@ -898,7 +940,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY)
},
@@ -916,7 +958,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA)
},
@@ -932,7 +974,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA)
},
@@ -948,7 +990,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- Common::GUIO_NOMIDI
+ GUIO1(GUIO_NOMIDI)
},
KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA)
},
@@ -967,7 +1009,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FLAGS
},
@@ -984,7 +1026,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FLAGS
},
@@ -1001,7 +1043,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FLAGS
},
@@ -1018,7 +1060,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FLAGS
},
@@ -1035,7 +1077,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FLAGS
},
@@ -1052,11 +1094,64 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FLAGS
},
+ // Russian fan translation
+ {
+ {
+ "lol",
+ "CD",
+ {
+ { "GENERAL.PAK", 0, "19354b0f464295c38c801d30588df062", -1 },
+ { "L01.PAK", 0, "174d37f21e0336c5d91020f8c58717ef", -1 },
+ { 0, 0, 0, 0 }
+ },
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
+ },
+ LOL_CD_FAN_FLAGS(Common::RU_RUS, Common::DE_DEU)
+ },
+
+ {
+ {
+ "lol",
+ "CD",
+ {
+
+ { "GENERAL.PAK", 0, "19354b0f464295c38c801d30588df062", -1 },
+ { "L01.PAK", 0, "174d37f21e0336c5d91020f8c58717ef", -1 },
+ { 0, 0, 0, 0 }
+ },
+ Common::FR_FRA,
+ Common::kPlatformPC,
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
+ },
+ LOL_CD_FAN_FLAGS(Common::RU_RUS, Common::DE_DEU)
+ },
+
+ {
+ {
+ "lol",
+ "CD",
+ {
+ { "GENERAL.PAK", 0, "19354b0f464295c38c801d30588df062", -1 },
+ { "L01.PAK", 0, "174d37f21e0336c5d91020f8c58717ef", -1 },
+ { 0, 0, 0, 0 }
+ },
+ Common::RU_RUS,
+ Common::kPlatformPC,
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
+ },
+ LOL_CD_FAN_FLAGS(Common::RU_RUS, Common::DE_DEU)
+ },
+
// Italian fan translation
{
{
@@ -1070,7 +1165,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -1087,7 +1182,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -1104,7 +1199,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -1121,7 +1216,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -1138,7 +1233,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -1155,7 +1250,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE | ADGF_CD,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY)
},
@@ -1171,7 +1266,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_FLOPPY_CMP_FLAGS
},
@@ -1187,7 +1282,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_FLOPPY_CMP_FLAGS
},
@@ -1203,7 +1298,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_FLOPPY_CMP_FLAGS
},
@@ -1220,7 +1315,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_FLOPPY_FLAGS
},
@@ -1237,7 +1332,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_FLOPPY_FLAGS
},
@@ -1254,7 +1349,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_FLOPPY_FLAGS
},
@@ -1271,11 +1366,29 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_FLOPPY_FLAGS
},
+ // Russian fan translation
+ {
+ {
+ "lol",
+ "Extracted",
+ {
+ { "GENERAL.PAK", 0, "d8f4c1153aed2418f41f886c3fb27543", -1 },
+ { "CHAPTER7.PAK", 0, "f0b8a2fdff951738834fadc12248ac1f", -1 },
+ { 0, 0, 0, 0 }
+ },
+ Common::RU_RUS,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO5(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
+ },
+ LOL_FLOPPY_FAN_FLAGS(Common::RU_RUS, Common::EN_ANY)
+ },
+
{
{
"lol",
@@ -1288,7 +1401,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::JA_JPN,
Common::kPlatformPC98,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98
+ GUIO2(GUIO_NOSPEECH, GUIO_MIDIPC98)
},
LOL_PC98_SJIS_FLAGS
},
@@ -1305,7 +1418,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_DEMO_FLAGS
},
@@ -1321,12 +1434,12 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
+ GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK)
},
LOL_KYRA2_DEMO_FLAGS
},
#endif // ENABLE_LOL
- { AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0, 0) }
+ { AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0, 0, 0) }
};
const PlainGameDescriptor gameList[] = {
diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp
index f58ca0117c..7fd9880dce 100644
--- a/engines/kyra/gui.cpp
+++ b/engines/kyra/gui.cpp
@@ -375,7 +375,7 @@ void GUI::updateSaveList(bool excludeQuickSaves) {
s1 = (*i)[i->size()-3];
s2 = (*i)[i->size()-2];
s3 = (*i)[i->size()-1];
- if (!isdigit(s1) || !isdigit(s2) || !isdigit(s3))
+ if (!isdigit(static_cast<unsigned char>(s1)) || !isdigit(static_cast<unsigned char>(s2)) || !isdigit(static_cast<unsigned char>(s3)))
continue;
s1 -= '0';
s2 -= '0';
@@ -415,7 +415,7 @@ void GUI::checkTextfieldInput() {
bool running = true;
int keys = 0;
- while (_vm->_eventMan->pollEvent(event) && running) {
+ while (running && _vm->_eventMan->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_KEYDOWN:
if (event.kbd.keycode == Common::KEYCODE_q && event.kbd.hasFlags(Common::KBD_CTRL))
@@ -671,4 +671,3 @@ void MainMenu::printString(const char *format, int x, int y, int col1, int col2,
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/gui.h b/engines/kyra/gui.h
index 6afdc431ed..1efbdde394 100644
--- a/engines/kyra/gui.h
+++ b/engines/kyra/gui.h
@@ -263,4 +263,3 @@ private:
} // end of namesapce Kyra
#endif
-
diff --git a/engines/kyra/gui_hof.cpp b/engines/kyra/gui_hof.cpp
index 1666cdd0e4..a1e0ce66bf 100644
--- a/engines/kyra/gui_hof.cpp
+++ b/engines/kyra/gui_hof.cpp
@@ -1195,4 +1195,3 @@ int GUI_HoF::loadMenu(Button *caller) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/gui_hof.h b/engines/kyra/gui_hof.h
index a02d14e9f1..c228c35551 100644
--- a/engines/kyra/gui_hof.h
+++ b/engines/kyra/gui_hof.h
@@ -82,4 +82,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/gui_lok.cpp b/engines/kyra/gui_lok.cpp
index eac82ec2c5..4a2d51faa3 100644
--- a/engines/kyra/gui_lok.cpp
+++ b/engines/kyra/gui_lok.cpp
@@ -576,6 +576,15 @@ void GUI_LoK::setupSavegames(Menu &menu, int num) {
if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header))) {
Common::strlcpy(_savegameNames[i], header.description.c_str(), ARRAYSIZE(_savegameNames[0]));
+ // Trim long GMM save descriptions to fit our save slots
+ _screen->_charWidth = -2;
+ int fC = _screen->getTextWidth(_savegameNames[i]);
+ while (_savegameNames[i][0] && (fC > 240 )) {
+ _savegameNames[i][strlen(_savegameNames[i]) - 1] = 0;
+ fC = _screen->getTextWidth(_savegameNames[i]);
+ }
+ _screen->_charWidth = 0;
+
Util::convertISOToDOS(_savegameNames[i]);
menu.item[i].itemString = _savegameNames[i];
@@ -693,12 +702,15 @@ void GUI_LoK::updateSavegameString() {
if (_keyPressed.keycode) {
length = strlen(_savegameName);
+ _screen->_charWidth = -2;
+ int width = _screen->getTextWidth(_savegameName) + 7;
+ _screen->_charWidth = 0;
char inputKey = _keyPressed.ascii;
Util::convertISOToDOS(inputKey);
if ((uint8)inputKey > 31 && (uint8)inputKey < (_vm->gameFlags().lang == Common::JA_JPN ? 128 : 226)) {
- if (length < ARRAYSIZE(_savegameName)-1) {
+ if ((length < ARRAYSIZE(_savegameName)-1) && (width <= 240)) {
_savegameName[length] = inputKey;
_savegameName[length+1] = 0;
redrawTextfield();
@@ -1125,4 +1137,3 @@ void KyraEngine_LoK::drawAmulet() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/gui_lok.h b/engines/kyra/gui_lok.h
index 4d7bfa1ada..5a8d6ab532 100644
--- a/engines/kyra/gui_lok.h
+++ b/engines/kyra/gui_lok.h
@@ -182,4 +182,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp
index fb11040168..3ab52b9940 100644
--- a/engines/kyra/gui_lol.cpp
+++ b/engines/kyra/gui_lol.cpp
@@ -395,8 +395,8 @@ void LoLEngine::gui_drawCharPortraitWithStats(int charNum) {
} else {
gui_drawLiveMagicBar(33, 32, _characters[charNum].magicPointsCur, 0, _characters[charNum].magicPointsMax, 5, 32, 162, 1, 0);
gui_drawLiveMagicBar(39, 32, _characters[charNum].hitPointsCur, 0, _characters[charNum].hitPointsMax, 5, 32, 154, 1, 1);
- _screen->printText(getLangString(0x4253), 33, 1, 160, 0);
- _screen->printText(getLangString(0x4254), 39, 1, 152, 0);
+ _screen->printText((_flags.platform == Common::kPlatformPC && !_flags.isTalkie) ? "M" : getLangString(0x4253), 33, 1, 160, 0);
+ _screen->printText((_flags.platform == Common::kPlatformPC && !_flags.isTalkie) ? "H" : getLangString(0x4254), 39, 1, 152, 0);
}
int spellLevels = 0;
@@ -2572,9 +2572,19 @@ void GUI_LoL::setupSaveMenuSlots(Menu &menu, int num) {
slotOffs = 1;
}
+ int saveSlotMaxLen = ((_screen->getScreenDim(8))->w << 3) - _screen->getCharWidth('W');
+
for (int i = startSlot; i < num && _savegameOffset + i - slotOffs < _savegameListSize; ++i) {
if (_savegameList[_saveSlots[i + _savegameOffset - slotOffs]]) {
Common::strlcpy(s, _savegameList[_saveSlots[i + _savegameOffset - slotOffs]], 80);
+
+ // Trim long GMM save descriptions to fit our save slots
+ int fC = _screen->getTextWidth(s);
+ while (s[0] && fC >= saveSlotMaxLen) {
+ s[strlen(s) - 1] = 0;
+ fC = _screen->getTextWidth(s);
+ }
+
menu.item[i].itemString = s;
s += (strlen(s) + 1);
menu.item[i].saveSlot = _saveSlots[i + _savegameOffset - slotOffs];
@@ -2997,4 +3007,3 @@ const char *GUI_LoL::getMenuItemLabel(const MenuItem &menuItem) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/gui_lol.h b/engines/kyra/gui_lol.h
index bc49b21299..0686926534 100644
--- a/engines/kyra/gui_lol.h
+++ b/engines/kyra/gui_lol.h
@@ -182,4 +182,3 @@ private:
#endif
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/gui_mr.cpp b/engines/kyra/gui_mr.cpp
index 32eb02e06d..82082961e9 100644
--- a/engines/kyra/gui_mr.cpp
+++ b/engines/kyra/gui_mr.cpp
@@ -1607,4 +1607,3 @@ void GUI_MR::drawSliderBar(int slider, const uint8 *shape) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/gui_mr.h b/engines/kyra/gui_mr.h
index 9c8d79b321..6303dff83f 100644
--- a/engines/kyra/gui_mr.h
+++ b/engines/kyra/gui_mr.h
@@ -85,4 +85,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/gui_v2.cpp b/engines/kyra/gui_v2.cpp
index 0b82df8cd5..c0477f29f1 100644
--- a/engines/kyra/gui_v2.cpp
+++ b/engines/kyra/gui_v2.cpp
@@ -457,6 +457,15 @@ void GUI_v2::setupSavegameNames(Menu &menu, int num) {
Common::strlcpy(s, header.description.c_str(), 80);
Util::convertISOToDOS(s);
+ // Trim long GMM save descriptions to fit our save slots
+ _screen->_charWidth = -2;
+ int fC = _screen->getTextWidth(s);
+ while (s[0] && fC > 240) {
+ s[strlen(s) - 1] = 0;
+ fC = _screen->getTextWidth(s);
+ }
+ _screen->_charWidth = 0;
+
menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
menu.item[i].enabled = true;
delete in;
@@ -878,4 +887,3 @@ int GUI_v2::choiceNo(Button *caller) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/gui_v2.h b/engines/kyra/gui_v2.h
index 0009bf8e54..ef95c0301a 100644
--- a/engines/kyra/gui_v2.h
+++ b/engines/kyra/gui_v2.h
@@ -231,4 +231,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/item.h b/engines/kyra/item.h
index 86b6fc7d46..4b236372a2 100644
--- a/engines/kyra/item.h
+++ b/engines/kyra/item.h
@@ -39,4 +39,3 @@ enum {
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/items_hof.cpp b/engines/kyra/items_hof.cpp
index 73aed2e067..711e1b8f7c 100644
--- a/engines/kyra/items_hof.cpp
+++ b/engines/kyra/items_hof.cpp
@@ -427,4 +427,3 @@ void KyraEngine_HoF::setMouseCursor(Item item) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/items_lok.cpp b/engines/kyra/items_lok.cpp
index d66eb553f2..d598a17cf1 100644
--- a/engines/kyra/items_lok.cpp
+++ b/engines/kyra/items_lok.cpp
@@ -575,7 +575,14 @@ void KyraEngine_LoK::dropItem(int unk1, int item, int x, int y, int unk2) {
if (processItemDrop(_currentCharacter->sceneId, item, x, y, unk1, unk2))
return;
snd_playSoundEffect(54);
+
+ // Old floppy versions don't print warning messages and don't have the necessary string resources.
+ // These versions will only play the warning sound effect.
+ if (_flags.isOldFloppy && !_noDropList)
+ return;
+
assert(_noDropList);
+
if (12 == countItemsInScene(_currentCharacter->sceneId))
drawSentenceCommand(_noDropList[0], 6);
else
@@ -969,4 +976,3 @@ int KyraEngine_LoK::getItemListIndex(Item item) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/items_lol.cpp b/engines/kyra/items_lol.cpp
index 2cf2cb2c70..7e9ae439fc 100644
--- a/engines/kyra/items_lol.cpp
+++ b/engines/kyra/items_lol.cpp
@@ -551,4 +551,3 @@ int LoLEngine::checkSceneForItems(uint16 *blockDrawObjects, int color) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/items_mr.cpp b/engines/kyra/items_mr.cpp
index 88c02f56c8..c731627026 100644
--- a/engines/kyra/items_mr.cpp
+++ b/engines/kyra/items_mr.cpp
@@ -544,4 +544,3 @@ int KyraEngine_MR::getItemCommandStringInv(uint16 item) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/items_v2.cpp b/engines/kyra/items_v2.cpp
index 29dddc6772..c191c2e62b 100644
--- a/engines/kyra/items_v2.cpp
+++ b/engines/kyra/items_v2.cpp
@@ -105,4 +105,3 @@ void KyraEngine_v2::removeHandItem() {
}
} // end of namesapce Kyra
-
diff --git a/engines/kyra/kyra_hof.cpp b/engines/kyra/kyra_hof.cpp
index 9a4f7bc42e..4497ab8019 100644
--- a/engines/kyra/kyra_hof.cpp
+++ b/engines/kyra/kyra_hof.cpp
@@ -503,14 +503,6 @@ void KyraEngine_HoF::runLoop() {
int inputFlag = checkInput(_buttonList, true);
removeInputTop();
- if (_updateHandItemCursor) {
- // This works around an issue which would occur when setHandItem(_itemInHand)
- // was called from inside loadGameState(). When loading via GMM the
- // mouse cursor would not be set correctly.
- _updateHandItemCursor = false;
- setHandItem(_itemInHand);
- }
-
update();
if (inputFlag == 198 || inputFlag == 199) {
@@ -865,7 +857,7 @@ void KyraEngine_HoF::loadOptionsBuffer(const char *file) {
void KyraEngine_HoF::loadChapterBuffer(int chapter) {
char tempString[14];
- static const char *chapterFilenames[] = {
+ static const char *const chapterFilenames[] = {
"CH1.XXX", "CH2.XXX", "CH3.XXX", "CH4.XXX", "CH5.XXX"
};
@@ -1060,8 +1052,7 @@ void KyraEngine_HoF::runStartScript(int script, int unk1) {
void KyraEngine_HoF::loadNPCScript() {
_emc->unload(&_npcScriptData);
- char filename[12];
- strcpy(filename, "_NPC.EMC");
+ char filename[] = "_NPC.EMC";
if (_flags.platform != Common::kPlatformPC || _flags.isTalkie) {
switch (_lang) {
@@ -1092,11 +1083,11 @@ void KyraEngine_HoF::loadNPCScript() {
#pragma mark -
void KyraEngine_HoF::resetScaleTable() {
- Common::set_to(_scaleTable, _scaleTable + ARRAYSIZE(_scaleTable), 0x100);
+ Common::set_to(_scaleTable, ARRAYEND(_scaleTable), 0x100);
}
void KyraEngine_HoF::setScaleTableItem(int item, int data) {
- if (item >= 1 || item <= 15)
+ if (item >= 1 && item <= 15)
_scaleTable[item-1] = (data << 8) / 100;
}
@@ -1105,7 +1096,7 @@ int KyraEngine_HoF::getScale(int x, int y) {
}
void KyraEngine_HoF::setDrawLayerTableEntry(int entry, int data) {
- if (entry >= 1 || entry <= 15)
+ if (entry >= 1 && entry <= 15)
_drawLayerTable[entry-1] = data;
}
@@ -1422,7 +1413,7 @@ void KyraEngine_HoF::runIdleScript(int script) {
setNextIdleAnimTimer();
} else {
// FIXME: move this to staticres.cpp?
- static const char *idleScriptFiles[] = {
+ static const char *const idleScriptFiles[] = {
"_IDLHAIR.EMC", "_IDLDUST.EMC", "_IDLLEAN.EMC", "_IDLDIRT.EMC", "_IDLTOSS.EMC", "_IDLNOSE.EMC",
"_IDLBRSH.EMC", "_Z3IDLE.EMC", "_Z4IDLE.EMC", "_Z6IDLE.EMC", "_Z7IDLE.EMC", "_Z8IDLE.EMC"
};
@@ -1682,7 +1673,7 @@ void KyraEngine_HoF::setCauldronState(uint8 state, bool paletteFade) {
}
void KyraEngine_HoF::clearCauldronTable() {
- Common::set_to(_cauldronTable, _cauldronTable+ARRAYSIZE(_cauldronTable), -1);
+ Common::set_to(_cauldronTable, ARRAYEND(_cauldronTable), -1);
}
void KyraEngine_HoF::addFrontCauldronTable(int item) {
@@ -2006,4 +1997,3 @@ void KyraEngine_HoF::readSettings() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h
index da7486bc29..916cac0c9d 100644
--- a/engines/kyra/kyra_hof.h
+++ b/engines/kyra/kyra_hof.h
@@ -566,8 +566,8 @@ protected:
// -
char _internStringBuf[200];
- static const char *_languageExtension[];
- static const char *_scriptLangExt[];
+ static const char *const _languageExtension[];
+ static const char *const _scriptLangExt[];
// character
bool _useCharPal;
@@ -925,4 +925,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp
index ee67062cdd..27d0849e5f 100644
--- a/engines/kyra/kyra_lok.cpp
+++ b/engines/kyra/kyra_lok.cpp
@@ -98,6 +98,8 @@ KyraEngine_LoK::KyraEngine_LoK(OSystem *system, const GameFlags &flags)
_malcolmFrame = 0;
_malcolmTimer1 = _malcolmTimer2 = 0;
+
+ _soundFiles = 0;
}
KyraEngine_LoK::~KyraEngine_LoK() {
@@ -121,6 +123,8 @@ KyraEngine_LoK::~KyraEngine_LoK() {
delete _animator;
delete _seq;
+ delete[] _soundFiles;
+
delete[] _characterList;
delete[] _roomTable;
@@ -821,14 +825,6 @@ void KyraEngine_LoK::updateMousePointer(bool forceUpdate) {
newY = 4;
}
- if (_updateHandItemCursor) {
- // This works around an issue which would occur when setHandItem(_itemInHand)
- // was called from inside loadGameState(). When loading via GMM the
- // mouse cursor would not be set correctly.
- _updateHandItemCursor = false;
- setHandItem(_itemInHand);
- }
-
if ((newMouseState && _mouseState != newMouseState) || (newMouseState && forceUpdate)) {
_mouseState = newMouseState;
_screen->hideMouse();
diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h
index 066c27c69a..57e6bd39ab 100644
--- a/engines/kyra/kyra_lok.h
+++ b/engines/kyra/kyra_lok.h
@@ -826,4 +826,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp
index 973ab25088..5798e99a1f 100644
--- a/engines/kyra/kyra_mr.cpp
+++ b/engines/kyra/kyra_mr.cpp
@@ -908,14 +908,6 @@ void KyraEngine_MR::runLoop() {
int inputFlag = checkInput(_mainButtonList, true);
removeInputTop();
- if (_updateHandItemCursor) {
- // This works around an issue which would occur when setHandItem(_itemInHand)
- // was called from inside loadGameState(). When loading via GMM the
- // mouse cursor would not be set correctly.
- _updateHandItemCursor = false;
- setHandItem(_itemInHand);
- }
-
update();
_timer->update();
@@ -1434,4 +1426,3 @@ void KyraEngine_MR::readSettings() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/kyra_mr.h b/engines/kyra/kyra_mr.h
index b762648d29..473c0371dc 100644
--- a/engines/kyra/kyra_mr.h
+++ b/engines/kyra/kyra_mr.h
@@ -659,7 +659,7 @@ private:
// resource specific
private:
- static const char *_languageExtension[];
+ static const char *const _languageExtension[];
static const int _languageExtensionSize;
int loadLanguageFile(const char *file, uint8 *&buffer);
@@ -668,4 +668,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp
index f79fabf9eb..c950612a42 100644
--- a/engines/kyra/kyra_v1.cpp
+++ b/engines/kyra/kyra_v1.cpp
@@ -56,7 +56,6 @@ KyraEngine_v1::KyraEngine_v1(OSystem *system, const GameFlags &flags)
_gameToLoad = -1;
_mouseState = -1;
- _updateHandItemCursor = false;
_deathHandler = -1;
memset(_flagsTable, 0, sizeof(_flagsTable));
@@ -84,7 +83,9 @@ KyraEngine_v1::KyraEngine_v1(OSystem *system, const GameFlags &flags)
}
void KyraEngine_v1::pauseEngineIntern(bool pause) {
- _sound->pause(pause);
+ Engine::pauseEngineIntern(pause);
+ if (_sound)
+ _sound->pause(pause);
_timer->pause(pause);
}
@@ -649,4 +650,3 @@ void KyraEngine_v1::syncSoundSettings() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h
index 5b4f3385a4..584176e08c 100644
--- a/engines/kyra/kyra_v1.h
+++ b/engines/kyra/kyra_v1.h
@@ -73,27 +73,21 @@ class KyraMetaEngine;
* Kyrandia 2 Russian (no feature request)
* Kyrandia 3 Russian (feature request #2812792 "Kyrandia3 Russian")
*
- * The primary maintainer for the engine is LordHoto, although some parts are maintained by _athrxx.
- * If you have questions about parts of the code, the following rough description might help in
- * determining who you should ask:
- * _athrxx is the maintainer for the Lands of Lore subengine, he also maintains most of the FM-TOWNS
- * and PC98 specific code (especially the sound code, also some ingame code) and the Kyrandia 2
- * sequence player code.
- * LordHoto is responsible for the rest of the codebase, he also worked on the graphics output for 16
- * color PC98 games.
+ * The engine is maintained by _athrxx.
*
* Other people who worked on this engine include cyx, who initially started to work on Kyrandia 1
* support, vinterstum, who did various things for Kyrandia 1 and started to work on the Kyrandia 2
* sequence player code and also on the TIM script code, and eriktorbjorn, who helped out naming
* our AdLib player code and also contributed a work around for a music bug in the "Pool of Sorrow"
- * scene of Kyrandia 1, which is also present in the original. All three mentioned developers are
- * not actively working on KYRA anymore.
+ * scene of Kyrandia 1, which is also present in the original. LordHoto worked on Kyrandia 1 to 3
+ * support and graphics output for 16 color PC98 games and was a maintainer of the Kyrandia part.
+ * All mentioned developers are not actively working on KYRA anymore.
*
* The engine is mostly finished code wise. A possible remaining task is proper refactoring,
* which might help in reducing binary size and along with it runtime memory use, but of course
* might lead to regressions (since the current code makes no problems on our low end ports, it
* is pretty minor priority though, since the benefit would be mostly nicer code). The biggest
- * task left is the kyra.dat handling, which is currently being revised by LordHoto.
+ * task left is the kyra.dat handling.
*
* Games using this engine:
* - The Legend of Kyrandia (fully supported, except for Macintosh port, which lacks sound)
@@ -115,6 +109,7 @@ struct GameFlags {
bool isDemo : 1;
bool useAltShapeHeader : 1; // alternative shape header (uses 2 bytes more, those are unused though)
bool isTalkie : 1;
+ bool isOldFloppy : 1;
bool useHiResOverlay : 1;
bool use16ColorMode : 1;
bool useDigSound : 1;
@@ -343,9 +338,6 @@ protected:
virtual void setHandItem(Item item) = 0;
virtual void removeHandItem() = 0;
- void setDelayedCursorUpdate() { _updateHandItemCursor = true; }
- bool _updateHandItemCursor;
-
// game flags
uint8 _flagsTable[100]; // TODO: check this value
@@ -431,4 +423,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp
index d0f8d78bd1..e8cb9b4370 100644
--- a/engines/kyra/kyra_v2.cpp
+++ b/engines/kyra/kyra_v2.cpp
@@ -243,4 +243,3 @@ int KyraEngine_v2::updateCharPos(int *table, int force) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h
index f21458ab5d..56391d151a 100644
--- a/engines/kyra/kyra_v2.h
+++ b/engines/kyra/kyra_v2.h
@@ -398,4 +398,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp
index c567cbb037..5aba264ceb 100644
--- a/engines/kyra/lol.cpp
+++ b/engines/kyra/lol.cpp
@@ -935,14 +935,6 @@ void LoLEngine::runLoop() {
checkFloatingPointerRegions();
gui_updateInput();
- if (_updateHandItemCursor) {
- // This works around an issue which would occur when setHandItem(_itemInHand)
- // was called from inside loadGameState(). When loading via GMM the
- // mouse cursor would not be set correctly.
- _updateHandItemCursor = false;
- setHandItem(_itemInHand);
- }
-
update();
if (_sceneUpdateRequired)
@@ -1046,11 +1038,14 @@ char *LoLEngine::getLangString(uint16 id) {
char *string = (char *)getTableEntry(buffer, realId);
char *srcBuffer = _stringBuffer[_lastUsedStringBuffer];
- if (_flags.lang != Common::JA_JPN) {
- Util::decodeString1(string, srcBuffer);
+ if (_flags.lang == Common::JA_JPN) {
+ decodeSjis(string, srcBuffer);
+ } else if (_flags.lang == Common::RU_RUS && !_flags.isTalkie) {
+ decodeCyrillic(string, srcBuffer);
Util::decodeString2(srcBuffer, srcBuffer);
} else {
- decodeSjis(string, srcBuffer);
+ Util::decodeString1(string, srcBuffer);
+ Util::decodeString2(srcBuffer, srcBuffer);
}
++_lastUsedStringBuffer;
@@ -1089,6 +1084,54 @@ void LoLEngine::decodeSjis(const char *src, char *dst) {
*dst = 0;
}
+int LoLEngine::decodeCyrillic(const char *src, char *dst) {
+ static const uint8 decodeTable1[] = {
+ 0x20, 0xAE, 0xA5, 0xA0, 0xE2, 0xAD, 0xA8, 0xE0, 0xE1, 0xAB, 0xA2,
+ 0xA4, 0xAC, 0xAA, 0xE3, 0x2E
+ };
+
+ static const uint8 decodeTable2[] = {
+ 0xAD, 0xAF, 0xA2, 0xE1, 0xAC, 0xAA, 0x20, 0xA4, 0xAB, 0x20,
+ 0xE0, 0xE2, 0xA4, 0xA2, 0xA6, 0xAA, 0x20, 0xAD, 0xE2, 0xE0,
+ 0xAB, 0xAC, 0xE1, 0xA1, 0x20, 0xAC, 0xE1, 0xAA, 0xAB, 0xE0,
+ 0xE2, 0xAD, 0xAE, 0xEC, 0xA8, 0xA5, 0xA0, 0x20, 0xE0, 0xEB,
+ 0xAE, 0xA0, 0xA8, 0xA5, 0xEB, 0xEF, 0x20, 0xE3, 0xE2, 0x20,
+ 0xAD, 0xE7, 0xAB, 0xAC, 0xA5, 0xE0, 0xAE, 0xA0, 0xA5, 0xA8,
+ 0xE3, 0xEB, 0xEF, 0xAA, 0xE2, 0xEF, 0xA5, 0xEC, 0xAB, 0xAE,
+ 0xAA, 0xAF, 0xA8, 0xA0, 0xA5, 0xEF, 0xAE, 0xEE, 0xEC, 0xE3,
+ 0xA0, 0xAE, 0xA5, 0xA8, 0xEB, 0x20, 0xE0, 0xE3, 0xA0, 0xA5,
+ 0xAE, 0xA8, 0xE3, 0xE1, 0xAD, 0xAB, 0x20, 0xAE, 0xA5, 0xA0,
+ 0xA8, 0xAD, 0x2E, 0xE3, 0xAE, 0xA0, 0xA8, 0x20, 0xE0, 0xE3,
+ 0xAB, 0xE1, 0x20, 0xA4, 0xAD, 0xE2, 0xA1, 0xA6, 0xAC, 0xE1,
+ 0x0D, 0x20, 0x2E, 0x09, 0xA0, 0xA1, 0x9D, 0xA5
+ };
+
+ int size = 0;
+ uint cChar = 0;
+ while ((cChar = *src++) != 0) {
+ if (cChar & 0x80) {
+ cChar &= 0x7F;
+ int index = (cChar & 0x78) >> 3;
+ *dst++ = decodeTable1[index];
+ ++size;
+ assert(cChar < sizeof(decodeTable2));
+ cChar = decodeTable2[cChar];
+ } else if (cChar >= 0x70) {
+ cChar = *src++;
+ } else if (cChar >= 0x30) {
+ if (cChar < 0x60)
+ cChar -= 0x30;
+ cChar |= 0x80;
+ }
+
+ *dst++ = cChar;
+ ++size;
+ }
+
+ *dst++ = 0;
+ return size;
+}
+
bool LoLEngine::addCharacter(int id) {
const uint16 *cdf[] = { _charDefsMan, _charDefsMan, _charDefsMan, _charDefsWoman,
_charDefsMan, _charDefsMan, _charDefsWoman, _charDefsKieran, _charDefsAkshel };
@@ -4555,4 +4598,3 @@ void LoLEngine::generateTempData() {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h
index 06a4f29f63..164f030a1d 100644
--- a/engines/kyra/lol.h
+++ b/engines/kyra/lol.h
@@ -363,12 +363,13 @@ private:
void showIntro();
struct CharacterPrev {
- const char *name;
int x, y;
int attrib[3];
};
static const CharacterPrev _charPreviews[];
+ static const char *const _charPreviewNamesDefault[];
+ static const char *const _charPreviewNamesRussianFloppy[];
// PC98 specific data
static const uint16 _charPosXPC98[];
@@ -875,6 +876,7 @@ private:
char *getLangString(uint16 id);
uint8 *getTableEntry(uint8 *buffer, uint16 id);
void decodeSjis(const char *src, char *dst);
+ int decodeCyrillic(const char *src, char *dst);
static const char * const _languageExt[];
@@ -1525,4 +1527,3 @@ private:
#endif
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/module.mk b/engines/kyra/module.mk
index 4708041cf7..abd535ee29 100644
--- a/engines/kyra/module.mk
+++ b/engines/kyra/module.mk
@@ -96,3 +96,10 @@ endif
# Include common rules
include $(srcdir)/rules.mk
+
+ifeq ($(BACKEND), maemo)
+#ugly workaround, screen.cpp crashes gcc version 3.4.4 (CodeSourcery ARM 2005q3-2) with anything but -O3
+$(MODULE)/screen.o: $(MODULE)/screen.cpp
+ $(MKDIR) $(*D)/$(DEPDIR)
+ $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) -O3 $(CPPFLAGS) -c $(<) -o $*.o
+endif
diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp
index bc9c93f8ca..a35ec3d81b 100644
--- a/engines/kyra/resource.cpp
+++ b/engines/kyra/resource.cpp
@@ -366,6 +366,3 @@ void Resource::initializeLoaders() {
}
} // End of namespace Kyra
-
-
-
diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h
index 1c69362bfd..c2a697f18d 100644
--- a/engines/kyra/resource.h
+++ b/engines/kyra/resource.h
@@ -202,6 +202,7 @@ enum KyraResources {
k1ConfigStrings,
k1AudioTracks,
+ k1AudioTracks2,
k1AudioTracksIntro,
k1CreditsStrings,
@@ -479,7 +480,3 @@ private:
} // End of namespace Kyra
#endif
-
-
-
-
diff --git a/engines/kyra/saveload.cpp b/engines/kyra/saveload.cpp
index 80182d949b..42c5d3e8a8 100644
--- a/engines/kyra/saveload.cpp
+++ b/engines/kyra/saveload.cpp
@@ -113,12 +113,7 @@ KyraEngine_v1::kReadSaveHeaderError KyraEngine_v1::readSaveHeader(Common::Seekab
if (header.version >= 14) {
if (loadThumbnail) {
- header.thumbnail = new Graphics::Surface();
- assert(header.thumbnail);
- if (!Graphics::loadThumbnail(*in, *header.thumbnail)) {
- delete header.thumbnail;
- header.thumbnail = 0;
- }
+ header.thumbnail = Graphics::loadThumbnail(*in);
} else {
Graphics::skipThumbnail(*in);
}
@@ -268,4 +263,3 @@ void KyraEngine_v1::loadGameStateCheck(int slot) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/saveload_hof.cpp b/engines/kyra/saveload_hof.cpp
index b395a38acd..1d28b6bc13 100644
--- a/engines/kyra/saveload_hof.cpp
+++ b/engines/kyra/saveload_hof.cpp
@@ -306,7 +306,7 @@ Common::Error KyraEngine_HoF::loadGameState(int slot) {
_mainCharacter.facing = 4;
enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
- setDelayedCursorUpdate();
+ setHandItem(_itemInHand);
if (_lastMusicCommand >= 0 && !_unkSceneScreenFlag1)
snd_playWanderScoreViaMap(_lastMusicCommand, 1);
@@ -329,4 +329,3 @@ Common::Error KyraEngine_HoF::loadGameState(int slot) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/saveload_lok.cpp b/engines/kyra/saveload_lok.cpp
index 7689a904b0..22d412e7f6 100644
--- a/engines/kyra/saveload_lok.cpp
+++ b/engines/kyra/saveload_lok.cpp
@@ -170,7 +170,7 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) {
_screen->copyRegion(8, 8, 8, 8, 304, 212, 10, 0);
}
- setDelayedCursorUpdate();
+ setHandItem(_itemInHand);
// Will-O-Wisp uses a different shape size than Brandon's usual
// shape, thus we need to setup the correct size depending on
@@ -317,4 +317,3 @@ Common::Error KyraEngine_LoK::saveGameStateIntern(int slot, const char *saveName
return Common::kNoError;
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/saveload_lol.cpp b/engines/kyra/saveload_lol.cpp
index c81ace26f0..1bf26477e6 100644
--- a/engines/kyra/saveload_lol.cpp
+++ b/engines/kyra/saveload_lol.cpp
@@ -257,7 +257,7 @@ Common::Error LoLEngine::loadGameState(int slot) {
int t = _credits;
_credits = 0;
giveCredits(t, 0);
- setDelayedCursorUpdate();
+ setHandItem(_itemInHand);
loadLevel(_currentLevel);
gui_drawPlayField();
timerSpecialCharacterUpdate(0);
@@ -472,4 +472,3 @@ Graphics::Surface *LoLEngine::generateSaveThumbnail() const {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/saveload_mr.cpp b/engines/kyra/saveload_mr.cpp
index 0fd3e520f9..c49a528d02 100644
--- a/engines/kyra/saveload_mr.cpp
+++ b/engines/kyra/saveload_mr.cpp
@@ -305,7 +305,7 @@ Common::Error KyraEngine_MR::loadGameState(int slot) {
_goodConsciencePosition = false;
enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
- setDelayedCursorUpdate();
+ setHandItem(_itemInHand);
if (_lastMusicCommand >= 0 && !_unkSceneScreenFlag1)
snd_playWanderScoreViaMap(_lastMusicCommand, 1);
@@ -327,4 +327,3 @@ Common::Error KyraEngine_MR::loadGameState(int slot) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/scene_hof.cpp b/engines/kyra/scene_hof.cpp
index 197ef38bf1..f6cd77ca89 100644
--- a/engines/kyra/scene_hof.cpp
+++ b/engines/kyra/scene_hof.cpp
@@ -95,7 +95,7 @@ void KyraEngine_HoF::enterNewScene(uint16 newScene, int facing, int unk1, int un
_emc->run(&_sceneScriptState);
}
- Common::for_each(_wsaSlots, _wsaSlots+ARRAYSIZE(_wsaSlots), Common::mem_fun(&WSAMovie_v2::close));
+ Common::for_each(_wsaSlots, ARRAYEND(_wsaSlots), Common::mem_fun(&WSAMovie_v2::close));
_specialExitCount = 0;
memset(_specialExitTable, -1, sizeof(_specialExitTable));
@@ -735,4 +735,3 @@ bool KyraEngine_HoF::lineIsPassable(int x, int y) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/scene_lok.cpp b/engines/kyra/scene_lok.cpp
index 6cb3e2a98a..a926f8493f 100644
--- a/engines/kyra/scene_lok.cpp
+++ b/engines/kyra/scene_lok.cpp
@@ -1299,4 +1299,3 @@ void KyraEngine_LoK::setupSceneResource(int sceneId) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp
index 165919dff2..a5a2562448 100644
--- a/engines/kyra/scene_lol.cpp
+++ b/engines/kyra/scene_lol.cpp
@@ -2192,4 +2192,3 @@ void LoLEngine::drawSpecialGuiShape(int pageNum) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/scene_mr.cpp b/engines/kyra/scene_mr.cpp
index 6b234d9a73..74d2e89e6e 100644
--- a/engines/kyra/scene_mr.cpp
+++ b/engines/kyra/scene_mr.cpp
@@ -83,7 +83,7 @@ void KyraEngine_MR::enterNewScene(uint16 sceneId, int facing, int unk1, int unk2
}
_specialExitCount = 0;
- Common::set_to(_specialExitTable, _specialExitTable+ARRAYSIZE(_specialExitTable), 0xFFFF);
+ Common::set_to(_specialExitTable, ARRAYEND(_specialExitTable), 0xFFFF);
_mainCharacter.sceneId = sceneId;
_sceneList[sceneId].flags &= ~1;
@@ -388,7 +388,7 @@ void KyraEngine_MR::initSceneScript(int unk1) {
strcat(filename, ".CPS");
_screen->loadBitmap(filename, 3, 3, 0);
- Common::set_to(_specialSceneScriptState, _specialSceneScriptState+ARRAYSIZE(_specialSceneScriptState), false);
+ Common::set_to(_specialSceneScriptState, ARRAYEND(_specialSceneScriptState), false);
_sceneEnterX1 = 160;
_sceneEnterY1 = 0;
_sceneEnterX2 = 296;
diff --git a/engines/kyra/scene_v2.cpp b/engines/kyra/scene_v2.cpp
index fbddb6604e..061ce4c21a 100644
--- a/engines/kyra/scene_v2.cpp
+++ b/engines/kyra/scene_v2.cpp
@@ -225,4 +225,3 @@ void KyraEngine_v2::pathfinderFinializePath(int *moveTable, int tableLen, int x,
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp
index b4304a6de0..4eae89e0d4 100644
--- a/engines/kyra/screen.cpp
+++ b/engines/kyra/screen.cpp
@@ -3359,7 +3359,7 @@ void SJISFont::drawChar(uint16 c, byte *dst, int pitch) const {
color2 = _colorMap[0];
}
- _font->drawChar(dst, c, 640, 1, color1, color2);
+ _font->drawChar(dst, c, 640, 1, color1, color2, 640, 400);
}
#pragma mark -
@@ -3459,4 +3459,3 @@ uint8 *Palette::fetchRealPalette() const {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h
index e23f104760..51a9a7f744 100644
--- a/engines/kyra/screen.h
+++ b/engines/kyra/screen.h
@@ -616,4 +616,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/screen_hof.cpp b/engines/kyra/screen_hof.cpp
index 1282447411..24e0751c0e 100644
--- a/engines/kyra/screen_hof.cpp
+++ b/engines/kyra/screen_hof.cpp
@@ -146,4 +146,3 @@ void Screen_HoF::copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/screen_hof.h b/engines/kyra/screen_hof.h
index 08a9133809..edcb339da9 100644
--- a/engines/kyra/screen_hof.h
+++ b/engines/kyra/screen_hof.h
@@ -53,4 +53,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp
index c6874ca0ed..6d0460e0a1 100644
--- a/engines/kyra/screen_lol.cpp
+++ b/engines/kyra/screen_lol.cpp
@@ -959,4 +959,3 @@ void Screen_LoL::postProcessCursor(uint8 *data, int w, int h, int pitch) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/screen_lol.h b/engines/kyra/screen_lol.h
index 926183225f..02b78606b9 100644
--- a/engines/kyra/screen_lol.h
+++ b/engines/kyra/screen_lol.h
@@ -119,4 +119,3 @@ private:
#endif
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp
index 64fbe2b834..57581fa750 100644
--- a/engines/kyra/screen_v2.cpp
+++ b/engines/kyra/screen_v2.cpp
@@ -388,4 +388,3 @@ void Screen_v2::checkedPageUpdate(int srcPage, int dstPage) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h
index eb8415be78..d85c762038 100644
--- a/engines/kyra/screen_v2.h
+++ b/engines/kyra/screen_v2.h
@@ -73,4 +73,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/script.cpp b/engines/kyra/script.cpp
index b185b8ed6f..303cbb45aa 100644
--- a/engines/kyra/script.cpp
+++ b/engines/kyra/script.cpp
@@ -443,4 +443,3 @@ void EMCInterpreter::op_setRetAndJmp(EMCState *script) {
}
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/script.h b/engines/kyra/script.h
index 4250732c7c..5bd75f7b80 100644
--- a/engines/kyra/script.h
+++ b/engines/kyra/script.h
@@ -140,4 +140,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/script_hof.cpp b/engines/kyra/script_hof.cpp
index 27cfc808cc..296cd4002b 100644
--- a/engines/kyra/script_hof.cpp
+++ b/engines/kyra/script_hof.cpp
@@ -1730,4 +1730,3 @@ void KyraEngine_HoF::setupOpcodeTable() {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/script_lok.cpp b/engines/kyra/script_lok.cpp
index 2b90d001ca..4d40971124 100644
--- a/engines/kyra/script_lok.cpp
+++ b/engines/kyra/script_lok.cpp
@@ -558,7 +558,10 @@ int KyraEngine_LoK::o1_setCustomPaletteRange(EMCState *script) {
_screen->copyPalette(0, 12);
}
} else {
- _screen->getPalette(1).copy(_specialPalettes[stackPos(0)], 0, stackPos(2), stackPos(1));
+ if (!_specialPalettes[stackPos(0)])
+ warning("KyraEngine_LoK::o1_setCustomPaletteRange(): Trying to use missing special palette %d", stackPos(0));
+ else
+ _screen->getPalette(1).copy(_specialPalettes[stackPos(0)], 0, stackPos(2), stackPos(1));
}
return 0;
}
@@ -1956,4 +1959,3 @@ void KyraEngine_LoK::setupOpcodeTable() {
#undef Opcode
} // End of namespace Kyra
-
diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp
index 1afefcffa4..b4b8f00022 100644
--- a/engines/kyra/script_lol.cpp
+++ b/engines/kyra/script_lol.cpp
@@ -3071,4 +3071,3 @@ void LoLEngine::setupOpcodeTable() {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp
index 6f0f0ab083..83d03d1f63 100644
--- a/engines/kyra/script_tim.cpp
+++ b/engines/kyra/script_tim.cpp
@@ -1246,4 +1246,3 @@ int TIMInterpreter_LoL::cmd_dialogueBox(const uint16 *param) {
#endif // ENABLE_LOL
} // End of namespace Kyra
-
diff --git a/engines/kyra/script_tim.h b/engines/kyra/script_tim.h
index 89040720c2..11b716c3a9 100644
--- a/engines/kyra/script_tim.h
+++ b/engines/kyra/script_tim.h
@@ -317,4 +317,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/script_v1.cpp b/engines/kyra/script_v1.cpp
index b12a08a417..4cfbdf8ab8 100644
--- a/engines/kyra/script_v1.cpp
+++ b/engines/kyra/script_v1.cpp
@@ -123,4 +123,3 @@ int KyraEngine_v1::o1_playSoundEffect(EMCState *script) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/script_v2.cpp b/engines/kyra/script_v2.cpp
index 2e3a3d2bc4..e42cdf9ff4 100644
--- a/engines/kyra/script_v2.cpp
+++ b/engines/kyra/script_v2.cpp
@@ -340,4 +340,3 @@ int KyraEngine_v2::o2a_setResetFrame(EMCState *script) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/seqplayer.cpp b/engines/kyra/seqplayer.cpp
index ce2eafcea5..531d864293 100644
--- a/engines/kyra/seqplayer.cpp
+++ b/engines/kyra/seqplayer.cpp
@@ -657,4 +657,3 @@ bool SeqPlayer::playSequence(const uint8 *seqData, bool skipSeq) {
} // End of namespace Kyra
-
diff --git a/engines/kyra/seqplayer.h b/engines/kyra/seqplayer.h
index 1f030cde19..12d94e3f6d 100644
--- a/engines/kyra/seqplayer.h
+++ b/engines/kyra/seqplayer.h
@@ -122,4 +122,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/sequences_hof.cpp b/engines/kyra/sequences_hof.cpp
index e504278047..50b5db78fc 100644
--- a/engines/kyra/sequences_hof.cpp
+++ b/engines/kyra/sequences_hof.cpp
@@ -2920,5 +2920,3 @@ void KyraEngine_HoF::seq_makeBookAppear() {
}
} // End of namespace Kyra
-
-
diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp
index 5f9bd86724..2de0565a74 100644
--- a/engines/kyra/sequences_lok.cpp
+++ b/engines/kyra/sequences_lok.cpp
@@ -250,7 +250,7 @@ bool KyraEngine_LoK::seq_introStory() {
if (!textEnabled() && speechEnabled() && _flags.lang != Common::IT_ITA)
return false;
- if ((_flags.lang == Common::EN_ANY && !_flags.isTalkie && _flags.platform == Common::kPlatformPC) || _flags.platform == Common::kPlatformAmiga)
+ if (((_flags.lang == Common::EN_ANY || _flags.lang == Common::RU_RUS) && !_flags.isTalkie && _flags.platform == Common::kPlatformPC) || _flags.platform == Common::kPlatformAmiga)
_screen->loadBitmap("TEXT.CPS", 3, 3, &_screen->getPalette(0));
else if (_flags.lang == Common::EN_ANY || _flags.lang == Common::JA_JPN)
_screen->loadBitmap("TEXT_ENG.CPS", 3, 3, &_screen->getPalette(0));
@@ -2112,4 +2112,3 @@ void KyraEngine_LoK::drawJewelsFadeOutEnd(int jewel) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/sequences_lol.cpp b/engines/kyra/sequences_lol.cpp
index 27f3951faf..83d525d400 100644
--- a/engines/kyra/sequences_lol.cpp
+++ b/engines/kyra/sequences_lol.cpp
@@ -316,8 +316,9 @@ int LoLEngine::chooseCharacter() {
_screen->printText(_tim->getCTableEntry(53), 72, 184, 0x81, 0x00);
_screen->printText(_tim->getCTableEntry(55), 72, 192, 0x81, 0x00);
} else {
+ const char *const *previewNames = (_flags.lang == Common::RU_RUS && !_flags.isTalkie) ? _charPreviewNamesRussianFloppy : _charPreviewNamesDefault;
for (int i = 0; i < 4; ++i) {
- _screen->fprintStringIntro("%s", _charPreviews[i].x + 16, _charPreviews[i].y + 36, 0xC0, 0x00, 0x9C, 0x120, _charPreviews[i].name);
+ _screen->fprintStringIntro("%s", _charPreviews[i].x + 16, _charPreviews[i].y + 36, 0xC0, 0x00, 0x9C, 0x120, previewNames[i]);
_screen->fprintStringIntro("%d", _charPreviews[i].x + 21, _charPreviews[i].y + 48, 0x98, 0x00, 0x9C, 0x220, _charPreviews[i].attrib[0]);
_screen->fprintStringIntro("%d", _charPreviews[i].x + 21, _charPreviews[i].y + 56, 0x98, 0x00, 0x9C, 0x220, _charPreviews[i].attrib[1]);
_screen->fprintStringIntro("%d", _charPreviews[i].x + 21, _charPreviews[i].y + 64, 0x98, 0x00, 0x9C, 0x220, _charPreviews[i].attrib[2]);
@@ -1518,4 +1519,3 @@ void LoLEngine::loadOutroShapes(int file, uint8 **storage) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/sequences_mr.cpp b/engines/kyra/sequences_mr.cpp
index b3adc687c2..76badb63f5 100644
--- a/engines/kyra/sequences_mr.cpp
+++ b/engines/kyra/sequences_mr.cpp
@@ -57,7 +57,7 @@ void KyraEngine_MR::showBadConscience() {
talkObject.x = 30;
talkObject.y = 30;
- static const char *animFilenames[] = {
+ static const char *const animFilenames[] = {
"GUNFL00.WSA", "GUNFL01.WSA", "GUNFL02.WSA", "GUNFL03.WSA", "GUNFL04.WSA", "GUNFL05.WSA", "GUNFL06.WSA", "GUNFL07.WSA",
"GUNFR00.WSA", "GUNFR01.WSA", "GUNFR02.WSA", "GUNFR03.WSA", "GUNFR04.WSA", "GUNFR05.WSA", "GUNFR06.WSA", "GUNFR07.WSA"
};
@@ -128,7 +128,7 @@ void KyraEngine_MR::showGoodConscience() {
talkObject.x = 30;
talkObject.y = 30;
- static const char *animFilenames[] = {
+ static const char *const animFilenames[] = {
"STUFL00.WSA", "STUFL02.WSA", "STUFL04.WSA", "STUFL03.WSA", "STUFL01.WSA",
"STUFR00.WSA", "STUFR02.WSA", "STUFR04.WSA", "STUFR03.WSA", "STUFR01.WSA"
};
@@ -235,4 +235,3 @@ void KyraEngine_MR::uninitAnimationShapes(int count, uint8 *filedata) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/sequences_v2.cpp b/engines/kyra/sequences_v2.cpp
index fb61d7cddf..e431e45f10 100644
--- a/engines/kyra/sequences_v2.cpp
+++ b/engines/kyra/sequences_v2.cpp
@@ -128,4 +128,3 @@ void KyraEngine_v2::processAnimationScript(int allowSkip, int resetChar) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp
index 3713537afd..0e83c1cb1f 100644
--- a/engines/kyra/sound.cpp
+++ b/engines/kyra/sound.cpp
@@ -43,10 +43,6 @@ Sound::Sound(KyraEngine_v1 *vm, Audio::Mixer *mixer)
Sound::~Sound() {
}
-void Sound::pause(bool paused) {
- _mixer->pauseAll(paused);
-}
-
bool Sound::voiceFileIsPresent(const char *file) {
for (int i = 0; _supportedCodecs[i].fileext; ++i) {
Common::String f = file;
@@ -113,8 +109,14 @@ bool Sound::playVoiceStream(Audio::AudioStream *stream, Audio::SoundHandle *hand
while (h < kNumChannelHandles && _mixer->isSoundHandleActive(_soundChannels[h]))
++h;
- if (h >= kNumChannelHandles)
+ if (h >= kNumChannelHandles) {
+ // When we run out of handles we need to destroy the stream object,
+ // this is to avoid memory leaks in some scenes where too many sfx
+ // are started.
+ // See bug #3427240 "LOL-CD: Memory leak in caves level 3".
+ delete stream;
return false;
+ }
_mixer->playStream(isSfx ? Audio::Mixer::kSFXSoundType : Audio::Mixer::kSpeechSoundType, &_soundChannels[h], stream, -1, volume);
if (handle)
@@ -280,5 +282,3 @@ const Sound::SpeechCodecs Sound::_supportedCodecs[] = {
};
} // End of namespace Kyra
-
-
diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h
index 566b37ff43..c3c32331be 100644
--- a/engines/kyra/sound.h
+++ b/engines/kyra/sound.h
@@ -156,7 +156,7 @@ public:
/**
* Stops all audio playback when paused. Continues after end of pause.
*/
- virtual void pause(bool paused);
+ virtual void pause(bool paused) {}
void enableMusic(int enable) { _musicEnabled = enable; }
int musicEnabled() const { return _musicEnabled; }
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp
index 75041b8161..8976eba99c 100644
--- a/engines/kyra/sound_adlib.cpp
+++ b/engines/kyra/sound_adlib.cpp
@@ -318,7 +318,6 @@ private:
//
// _unkValue1 - Unknown. Used for updating _unkValue2
// _unkValue2 - Unknown. Used for updating _unkValue4
- // _unkValue3 - Unknown. Used for updating _unkValue2
// _unkValue4 - Unknown. Used for updating _unkValue5
// _unkValue5 - Unknown. Used for controlling updateCallback24().
// _unkValue6 - Unknown. Rhythm section volume?
@@ -357,7 +356,7 @@ private:
uint8 _unkValue1;
uint8 _unkValue2;
- uint8 _unkValue3;
+ uint8 _callbackTimer;
uint8 _unkValue4;
uint8 _unkValue5;
uint8 _unkValue6;
@@ -395,7 +394,7 @@ private:
static const uint8 _regOffset[];
static const uint16 _unkTable[];
- static const uint8 *_unkTable2[];
+ static const uint8 *const _unkTable2[];
static const uint8 _unkTable2_1[];
static const uint8 _unkTable2_2[];
static const uint8 _unkTable2_3[];
@@ -434,7 +433,7 @@ AdLibDriver::AdLibDriver(Audio::Mixer *mixer, bool v2) {
_tempo = 0;
_soundTrigger = 0;
- _unkValue3 = 0xFF;
+ _callbackTimer = 0xFF;
_unkValue1 = _unkValue2 = _unkValue4 = _unkValue5 = 0;
_unkValue6 = _unkValue7 = _unkValue8 = _unkValue9 = _unkValue10 = 0;
_unkValue11 = _unkValue12 = _unkValue13 = _unkValue14 = _unkValue15 =
@@ -635,9 +634,9 @@ void AdLibDriver::callback() {
setupPrograms();
executePrograms();
- uint8 temp = _unkValue3;
- _unkValue3 += _tempo;
- if (_unkValue3 < temp) {
+ uint8 temp = _callbackTimer;
+ _callbackTimer += _tempo;
+ if (_callbackTimer < temp) {
if (!(--_unkValue2)) {
_unkValue2 = _unkValue1;
++_unkValue4;
@@ -791,6 +790,11 @@ void AdLibDriver::executePrograms() {
noteOn(channel);
setupDuration(param, channel);
if (param) {
+ // We need to make sure we are always running the
+ // effects after this. Otherwise some sounds are
+ // wrong. Like the sfx when bumping into a wall in
+ // LoL.
+ result = 1;
channel.dataptr = dataptr;
break;
}
@@ -1114,11 +1118,11 @@ void AdLibDriver::primaryEffect1(Channel &channel) {
return;
// Initialize unk1 to the current frequency
- uint16 unk1 = ((channel.regBx & 3) << 8) | channel.regAx;
+ int16 unk1 = ((channel.regBx & 3) << 8) | channel.regAx;
// This is presumably to shift the "note on" bit so far to the left
// that it won't be affected by any of the calculations below.
- uint16 unk2 = ((channel.regBx & 0x20) << 8) | (channel.regBx & 0x1C);
+ int16 unk2 = ((channel.regBx & 0x20) << 8) | (channel.regBx & 0x1C);
int16 unk3 = (int16)channel.unk30;
@@ -1470,7 +1474,7 @@ int AdLibDriver::update_setPriority(uint8 *&dataptr, Channel &channel, uint8 val
int AdLibDriver::updateCallback23(uint8 *&dataptr, Channel &channel, uint8 value) {
value >>= 1;
_unkValue1 = _unkValue2 = value;
- _unkValue3 = 0xFF;
+ _callbackTimer = 0xFF;
_unkValue4 = _unkValue5 = 0;
return 0;
}
@@ -2074,7 +2078,7 @@ const uint16 AdLibDriver::_unkTable[] = {
// These tables are currently only used by updateCallback46(), which only ever
// uses the first element of one of the sub-tables.
-const uint8 *AdLibDriver::_unkTable2[] = {
+const uint8 *const AdLibDriver::_unkTable2[] = {
AdLibDriver::_unkTable2_1,
AdLibDriver::_unkTable2_2,
AdLibDriver::_unkTable2_1,
@@ -2297,8 +2301,8 @@ void SoundAdLibPC::playTrack(uint8 track) {
}
void SoundAdLibPC::haltTrack() {
- unk1();
- unk2();
+ playSoundEffect(0);
+ playSoundEffect(0);
//_vm->_system->delayMillis(3 * 60);
}
@@ -2402,8 +2406,8 @@ void SoundAdLibPC::internalLoadFile(Common::String file) {
return;
}
- unk2();
- unk1();
+ playSoundEffect(0);
+ playSoundEffect(0);
_driver->callback(8, int(-1));
_soundDataPtr = 0;
@@ -2435,14 +2439,4 @@ void SoundAdLibPC::internalLoadFile(Common::String file) {
_soundFileLoaded = file;
}
-void SoundAdLibPC::unk1() {
- playSoundEffect(0);
- //_vm->_system->delayMillis(5 * 60);
-}
-
-void SoundAdLibPC::unk2() {
- playSoundEffect(0);
-}
-
} // End of namespace Kyra
-
diff --git a/engines/kyra/sound_adlib.h b/engines/kyra/sound_adlib.h
index 58b97e3474..c09fec997e 100644
--- a/engines/kyra/sound_adlib.h
+++ b/engines/kyra/sound_adlib.h
@@ -83,9 +83,6 @@ private:
void play(uint8 track);
- void unk1();
- void unk2();
-
AdLibDriver *_driver;
bool _v2;
@@ -108,4 +105,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/sound_amiga.cpp b/engines/kyra/sound_amiga.cpp
index dc09670408..dfb0aa8bf3 100644
--- a/engines/kyra/sound_amiga.cpp
+++ b/engines/kyra/sound_amiga.cpp
@@ -214,4 +214,3 @@ void SoundAmiga::playSoundEffect(uint8 track) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/sound_digital.cpp b/engines/kyra/sound_digital.cpp
index 3f8eddbb0d..fe0f1fb9bc 100644
--- a/engines/kyra/sound_digital.cpp
+++ b/engines/kyra/sound_digital.cpp
@@ -544,4 +544,3 @@ const SoundDigital::AudioCodecs SoundDigital::_supportedCodecs[] = {
} // End of namespace Kyra
-
diff --git a/engines/kyra/sound_lol.cpp b/engines/kyra/sound_lol.cpp
index 7262635728..efa844968d 100644
--- a/engines/kyra/sound_lol.cpp
+++ b/engines/kyra/sound_lol.cpp
@@ -312,4 +312,3 @@ int LoLEngine::convertVolumeFromMixer(int value) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp
index dc0f8c11ec..1a5c2f94ac 100644
--- a/engines/kyra/sound_midi.cpp
+++ b/engines/kyra/sound_midi.cpp
@@ -716,9 +716,6 @@ void SoundMidiPC::beginFadeOut() {
}
void SoundMidiPC::pause(bool paused) {
- // Stop all mixer related sounds
- Sound::pause(paused);
-
Common::StackLock lock(_mutex);
if (paused) {
@@ -790,4 +787,3 @@ Common::String SoundMidiPC::getFileName(const Common::String &str) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/sound_pcspk.cpp b/engines/kyra/sound_pcspk.cpp
index 051f36dd1b..8664e2a22e 100644
--- a/engines/kyra/sound_pcspk.cpp
+++ b/engines/kyra/sound_pcspk.cpp
@@ -364,4 +364,3 @@ const uint8 MidiDriver_PCSpeaker::_noteTable2[] = {
};
} // End of namespace Kyra
-
diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp
index 012f1f5d7d..c851842f22 100644
--- a/engines/kyra/sound_towns.cpp
+++ b/engines/kyra/sound_towns.cpp
@@ -673,4 +673,3 @@ void SoundTownsPC98_v2::updateVolumeSettings() {
} // End of namespace Kyra
#undef EUPHONY_FADEOUT_TICKS
-
diff --git a/engines/kyra/sprites.cpp b/engines/kyra/sprites.cpp
index e0d1142905..f4cebf6470 100644
--- a/engines/kyra/sprites.cpp
+++ b/engines/kyra/sprites.cpp
@@ -573,4 +573,3 @@ int Sprites::getDrawLayer(int y) {
return returnValue;
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/sprites.h b/engines/kyra/sprites.h
index 6a4241f13e..93cdcdbbcb 100644
--- a/engines/kyra/sprites.h
+++ b/engines/kyra/sprites.h
@@ -97,4 +97,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/sprites_lol.cpp b/engines/kyra/sprites_lol.cpp
index a77fda043c..fbf4c7c5c2 100644
--- a/engines/kyra/sprites_lol.cpp
+++ b/engines/kyra/sprites_lol.cpp
@@ -1632,4 +1632,3 @@ void LoLEngine::killMonster(MonsterInPlay *monster) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp
index d56abc5d47..e03369f700 100644
--- a/engines/kyra/staticres.cpp
+++ b/engines/kyra/staticres.cpp
@@ -38,7 +38,7 @@
namespace Kyra {
-#define RESFILE_VERSION 74
+#define RESFILE_VERSION 78
namespace {
bool checkKyraDat(Common::SeekableReadStream *file) {
@@ -80,7 +80,7 @@ const IndexTable iGameTable[] = {
};
byte getGameID(const GameFlags &flags) {
- return Common::find(iGameTable, iGameTable + ARRAYSIZE(iGameTable) - 1, flags.gameID)->value;
+ return Common::find(iGameTable, ARRAYEND(iGameTable) - 1, flags.gameID)->value;
}
const IndexTable iLanguageTable[] = {
@@ -90,11 +90,12 @@ const IndexTable iLanguageTable[] = {
{ Common::ES_ESP, 4 },
{ Common::IT_ITA, 5 },
{ Common::JA_JPN, 6 },
+ { Common::RU_RUS, 7 },
{ -1, -1 }
};
byte getLanguageID(const GameFlags &flags) {
- return Common::find(iLanguageTable, iLanguageTable + ARRAYSIZE(iLanguageTable) - 1, flags.lang)->value;
+ return Common::find(iLanguageTable, ARRAYEND(iLanguageTable) - 1, flags.lang)->value;
}
const IndexTable iPlatformTable[] = {
@@ -107,11 +108,13 @@ const IndexTable iPlatformTable[] = {
};
byte getPlatformID(const GameFlags &flags) {
- return Common::find(iPlatformTable, iPlatformTable + ARRAYSIZE(iPlatformTable) - 1, flags.platform)->value;
+ return Common::find(iPlatformTable, ARRAYEND(iPlatformTable) - 1, flags.platform)->value;
}
byte getSpecialID(const GameFlags &flags) {
- if (flags.isDemo && flags.isTalkie)
+ if (flags.isOldFloppy)
+ return 4;
+ else if (flags.isDemo && flags.isTalkie)
return 3;
else if (flags.isDemo)
return 2;
@@ -748,7 +751,17 @@ void KyraEngine_LoK::initStaticResource() {
_storyStrings = _staticres->loadStrings(k1PC98StoryStrings, _storyStringsSize);
- _soundFiles = _staticres->loadStrings(k1AudioTracks, _soundFilesSize);
+ int size1, size2;
+ const char *const *soundfiles1 = _staticres->loadStrings(k1AudioTracks, size1);
+ const char *const *soundfiles2 = _staticres->loadStrings(k1AudioTracks2, size2);
+ _soundFilesSize = size1 + size2;
+ if (_soundFilesSize) {
+ delete[] _soundFiles;
+ const char **soundfiles = new const char*[_soundFilesSize];
+ for (int i = 0; i < _soundFilesSize; i++)
+ soundfiles[i] = (i < size1) ? soundfiles1[i] : soundfiles2[i - size1];
+ _soundFiles = soundfiles;
+ }
_soundFilesIntro = _staticres->loadStrings(k1AudioTracksIntro, _soundFilesIntroSize);
_cdaTrackTable = (const int32 *)_staticres->loadRawData(k1TownsCDATable, _cdaTrackTableSize);
@@ -781,8 +794,8 @@ void KyraEngine_LoK::initStaticResource() {
}
// audio data tables
- static const char *tIntro98[] = { "INTRO%d.DAT" };
- static const char *tIngame98[] = { "KYRAM%d.DAT" };
+ static const char *const tIntro98[] = { "INTRO%d.DAT" };
+ static const char *const tIngame98[] = { "KYRAM%d.DAT" };
// FIXME: It seems Kyra1 MAC CD includes AdLib and MIDI music and sfx, thus we enable
// support for those for now. (Based on patch #2767489 "Support for Mac Kyrandia 1 CD" by satz).
@@ -926,7 +939,7 @@ void KyraEngine_LoK::loadButtonShapes() {
void KyraEngine_LoK::loadMainScreen(int page) {
_screen->clearPage(page);
- if ((_flags.lang == Common::EN_ANY && !_flags.isTalkie && _flags.platform == Common::kPlatformPC) || _flags.platform == Common::kPlatformAmiga)
+ if (((_flags.lang == Common::EN_ANY || _flags.lang == Common::RU_RUS) && !_flags.isTalkie && _flags.platform == Common::kPlatformPC) || _flags.platform == Common::kPlatformAmiga)
_screen->loadBitmap("MAIN15.CPS", page, page, &_screen->getPalette(0));
else if (_flags.lang == Common::EN_ANY || _flags.lang == Common::JA_JPN || (_flags.isTalkie && _flags.lang == Common::IT_ITA))
_screen->loadBitmap("MAIN_ENG.CPS", page, page, 0);
@@ -998,13 +1011,13 @@ void KyraEngine_HoF::initStaticResource() {
_sequenceSoundList = tmpSndLst;
// assign music data
- static const char *fmtMusicFileListIntro[] = { "intro%d.twn" };
- static const char *fmtMusicFileListFinale[] = { "finale%d.twn" };
- static const char *fmtMusicFileListIngame[] = { "km%02d.twn" };
+ static const char *const fmtMusicFileListIntro[] = { "intro%d.twn" };
+ static const char *const fmtMusicFileListFinale[] = { "finale%d.twn" };
+ static const char *const fmtMusicFileListIngame[] = { "km%02d.twn" };
- static const char *pc98MusicFileListIntro[] = { "intro%d.86" };
- static const char *pc98MusicFileListFinale[] = { "finale%d.86" };
- static const char *pc98MusicFileListIngame[] = { "km%02d.86" };
+ static const char *const pc98MusicFileListIntro[] = { "intro%d.86" };
+ static const char *const pc98MusicFileListFinale[] = { "finale%d.86" };
+ static const char *const pc98MusicFileListIngame[] = { "km%02d.86" };
memset(_soundData, 0, sizeof(_soundData));
if (_flags.platform == Common::kPlatformPC) {
@@ -1374,7 +1387,7 @@ const int GUI_v2::_sliderBarsPosition[] = {
const uint8 KyraEngine_HoF::_seqTextColorPresets[] = { 0x01, 0x01, 0x00, 0x3f, 0x3f, 0x3f };
-const char *KyraEngine_HoF::_languageExtension[] = {
+const char *const KyraEngine_HoF::_languageExtension[] = {
"ENG",
"FRE",
"GER",/*,
@@ -1383,7 +1396,7 @@ const char *KyraEngine_HoF::_languageExtension[] = {
"JPN",
};
-const char *KyraEngine_HoF::_scriptLangExt[] = {
+const char *const KyraEngine_HoF::_scriptLangExt[] = {
"EMC",
"FMC",
"GMC",/*,
@@ -1872,7 +1885,7 @@ const uint8 KyraEngine_HoF::_rainbowRoomData[] = {
// kyra 3 static res
-const char *KyraEngine_MR::_languageExtension[] = {
+const char *const KyraEngine_MR::_languageExtension[] = {
"TRE",
"TRF",
"TRG"/*,
@@ -2129,4 +2142,3 @@ const int8 KyraEngine_MR::_albumWSAY[] = {
};
} // End of namespace Kyra
-
diff --git a/engines/kyra/staticres_lol.cpp b/engines/kyra/staticres_lol.cpp
index cf75a317e1..bf838cd572 100644
--- a/engines/kyra/staticres_lol.cpp
+++ b/engines/kyra/staticres_lol.cpp
@@ -261,13 +261,13 @@ void StaticResource::freeButtonDefs(void *&ptr, int &size) {
void LoLEngine::initStaticResource() {
// assign music data
- static const char *pcMusicFileListIntro[] = { "LOREINTR" };
- static const char *pcMusicFileListFinale[] = { "LOREFINL" };
- static const char *pcMusicFileListIngame[] = { "LORE%02d%c" };
+ static const char *const pcMusicFileListIntro[] = { "LOREINTR" };
+ static const char *const pcMusicFileListFinale[] = { "LOREFINL" };
+ static const char *const pcMusicFileListIngame[] = { "LORE%02d%c" };
- static const char *pc98MusicFileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" };
- static const char *pc98MusicFileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" };
- static const char *pc98MusicFileListIngame[] = { "lore%02d.86" };
+ static const char *const pc98MusicFileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" };
+ static const char *const pc98MusicFileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" };
+ static const char *const pc98MusicFileListIngame[] = { "lore%02d.86" };
memset(_soundData, 0, sizeof(_soundData));
if (_flags.platform == Common::kPlatformPC) {
@@ -687,11 +687,25 @@ const char * const LoLEngine::_languageExt[] = {
"GER"
};
+const char *const LoLEngine::_charPreviewNamesDefault[] = {
+ "Ak\'shel",
+ "Michael",
+ "Kieran",
+ "Conrad"
+};
+
+const char *const LoLEngine::_charPreviewNamesRussianFloppy[] = {
+ "\x80\xAA\xE8\xA5\xAB\0",
+ "\x8C\xA0\xA9\xAA\xAB\0",
+ "\x8A\xA8\xE0\xA0\xAD\0",
+ "\x8A\xAE\xAD\xE0\xA0\xA4\0"
+};
+
const LoLEngine::CharacterPrev LoLEngine::_charPreviews[] = {
- { "Ak\'shel", 0x060, 0x7F, { 0x0F, 0x08, 0x05 } },
- { "Michael", 0x09A, 0x7F, { 0x06, 0x0A, 0x0F } },
- { "Kieran", 0x0D4, 0x7F, { 0x08, 0x06, 0x08 } },
- { "Conrad", 0x10F, 0x7F, { 0x0A, 0x0C, 0x0A } }
+ { 0x060, 0x7F, { 0x0F, 0x08, 0x05 } },
+ { 0x09A, 0x7F, { 0x06, 0x0A, 0x0F } },
+ { 0x0D4, 0x7F, { 0x08, 0x06, 0x08 } },
+ { 0x10F, 0x7F, { 0x0A, 0x0C, 0x0A } }
};
const uint16 LoLEngine::_charPosXPC98[] = {
@@ -877,4 +891,3 @@ const int LoLEngine::_outroMonsterScaleTableY[] = {
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/text.h b/engines/kyra/text.h
index a95c2c4abc..199029469e 100644
--- a/engines/kyra/text.h
+++ b/engines/kyra/text.h
@@ -79,4 +79,3 @@ protected:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/text_hof.cpp b/engines/kyra/text_hof.cpp
index 4406f3ec41..4a52d7d740 100644
--- a/engines/kyra/text_hof.cpp
+++ b/engines/kyra/text_hof.cpp
@@ -194,7 +194,7 @@ void KyraEngine_HoF::objectChat(const char *str, int object, int vocHigh, int vo
assert(_mainCharacter.facing * 3 + chatType < ARRAYSIZE(talkScriptTable));
int script = talkScriptTable[_mainCharacter.facing * 3 + chatType];
- static const char *chatScriptFilenames[] = {
+ static const char *const chatScriptFilenames[] = {
"_Z1FSTMT.EMC",
"_Z1FQUES.EMC",
"_Z1FEXCL.EMC",
diff --git a/engines/kyra/text_hof.h b/engines/kyra/text_hof.h
index f371fb1898..414d02fe4b 100644
--- a/engines/kyra/text_hof.h
+++ b/engines/kyra/text_hof.h
@@ -50,4 +50,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/text_lol.cpp b/engines/kyra/text_lol.cpp
index 346d5100b8..1c2167b892 100644
--- a/engines/kyra/text_lol.cpp
+++ b/engines/kyra/text_lol.cpp
@@ -830,4 +830,3 @@ void TextDisplayer_LoL::clearCurDim() {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/text_lol.h b/engines/kyra/text_lol.h
index 020d4b5e89..3e59bc90fe 100644
--- a/engines/kyra/text_lol.h
+++ b/engines/kyra/text_lol.h
@@ -97,4 +97,3 @@ private:
#endif
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/text_mr.cpp b/engines/kyra/text_mr.cpp
index d690b70266..b680e9c6f9 100644
--- a/engines/kyra/text_mr.cpp
+++ b/engines/kyra/text_mr.cpp
@@ -216,7 +216,7 @@ void KyraEngine_MR::objectChat(const char *str, int object, int vocHigh, int voc
0x08, 0x09, 0x0A, 0x0B
};
- static const char *talkFilenameTable[] = {
+ static const char *const talkFilenameTable[] = {
"MTFL00S.EMC", "MTFL00Q.EMC", "MTFL00E.EMC", "MTFL00T.EMC",
"MTFR00S.EMC", "MTFR00Q.EMC", "MTFR00E.EMC", "MTFR00T.EMC",
"MTL00S.EMC", "MTL00Q.EMC", "MTL00E.EMC", "MTL00T.EMC",
@@ -898,4 +898,3 @@ void KyraEngine_MR::doDialog(int dlgIndex, int funcNum) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/timer.h b/engines/kyra/timer.h
index e9cb8b2b0c..205be5957d 100644
--- a/engines/kyra/timer.h
+++ b/engines/kyra/timer.h
@@ -104,4 +104,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/timer_lok.cpp b/engines/kyra/timer_lok.cpp
index e1825d027d..555b3680e2 100644
--- a/engines/kyra/timer_lok.cpp
+++ b/engines/kyra/timer_lok.cpp
@@ -190,4 +190,3 @@ void KyraEngine_LoK::setWalkspeed(uint8 newSpeed) {
}
} // End of namespace Kyra
-
diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp
index 4f450f570f..3221556e6d 100644
--- a/engines/kyra/timer_lol.cpp
+++ b/engines/kyra/timer_lol.cpp
@@ -255,4 +255,3 @@ void LoLEngine::timerFadeMessageText(int timerNum) {
} // End of namespace Kyra
#endif // ENABLE_LOL
-
diff --git a/engines/kyra/util.cpp b/engines/kyra/util.cpp
index 3776bdc705..f71978d03e 100644
--- a/engines/kyra/util.cpp
+++ b/engines/kyra/util.cpp
@@ -146,4 +146,3 @@ const uint8 Util::_charMapISOToDOS[128] = {
};
} // End of namespace Kyra
-
diff --git a/engines/kyra/util.h b/engines/kyra/util.h
index 042da74cd9..b91f84ad36 100644
--- a/engines/kyra/util.h
+++ b/engines/kyra/util.h
@@ -46,4 +46,3 @@ private:
} // End of namespace Kyra
#endif
-
diff --git a/engines/kyra/wsamovie.cpp b/engines/kyra/wsamovie.cpp
index 37102744a8..21ff80f033 100644
--- a/engines/kyra/wsamovie.cpp
+++ b/engines/kyra/wsamovie.cpp
@@ -459,5 +459,3 @@ int WSAMovie_v2::open(const char *filename, int unk1, Palette *palBuf) {
}
} // End of namespace Kyra
-
-
diff --git a/engines/kyra/wsamovie.h b/engines/kyra/wsamovie.h
index 0d8bfdc869..7dadc9319b 100644
--- a/engines/kyra/wsamovie.h
+++ b/engines/kyra/wsamovie.h
@@ -132,5 +132,3 @@ protected:
} // End of namespace Kyra
#endif
-
-
diff --git a/engines/lastexpress/data/animation.cpp b/engines/lastexpress/data/animation.cpp
index 1cbf7672d1..28d30ec7d1 100644
--- a/engines/lastexpress/data/animation.cpp
+++ b/engines/lastexpress/data/animation.cpp
@@ -77,7 +77,7 @@ bool Animation::load(Common::SeekableReadStream *stream, int flag) {
// Check if there is enough data
if (_stream->size() - _stream->pos() < (signed)(numChunks * sizeof(Chunk))) {
- debugC(2, kLastExpressDebugGraphics, "NIS file seems to be corrupted!");
+ debugC(2, kLastExpressDebugGraphics, "NIS file seems to be corrupted");
return false;
}
@@ -101,10 +101,10 @@ bool Animation::load(Common::SeekableReadStream *stream, int flag) {
bool Animation::process() {
if (!_currentChunk)
- error("Animation::process - internal error: the current chunk iterator is invalid!");
+ error("[Animation::process] Current chunk iterator is invalid");
if (_stream == NULL || _chunks.size() == 0)
- error("Trying to show an animation before loading data");
+ error("[Animation::process] Trying to show an animation before loading data");
// TODO: - subtract the time paused by the GUI
// - Re-implement to be closer to the original engine
@@ -191,7 +191,7 @@ bool Animation::process() {
break;
default:
- error(" UNKNOWN chunk type=%x frame=%d size=%d", _currentChunk->type, _currentChunk->frame, _currentChunk->size);
+ error("[Animation::process] UNKNOWN chunk type=%x frame=%d size=%d", _currentChunk->type, _currentChunk->frame, _currentChunk->size);
break;
}
_currentChunk++;
@@ -206,7 +206,7 @@ bool Animation::hasEnded() {
Common::Rect Animation::draw(Graphics::Surface *surface) {
if (!_overlay)
- error("Animation::draw - internal error: the current overlay animation frame is invalid!");
+ error("[Animation::draw] Current overlay animation frame is invalid");
// Paint the background
if (_backgroundCurrent == 1 && _background1)
@@ -242,7 +242,7 @@ AnimFrame *Animation::processChunkFrame(Common::SeekableReadStream *in, const Ch
void Animation::processChunkAudio(Common::SeekableReadStream *in, const Chunk &c) {
if (!_audio)
- error("Animation::processChunkAudio - internal error: the audio stream is invalid!");
+ error("[Animation::processChunkAudio] Audio stream is invalid");
// Skip the Snd header, to queue just the audio blocks
uint32 size = c.size;
diff --git a/engines/lastexpress/data/background.cpp b/engines/lastexpress/data/background.cpp
index de6fd7eeae..3d866c26f9 100644
--- a/engines/lastexpress/data/background.cpp
+++ b/engines/lastexpress/data/background.cpp
@@ -85,7 +85,7 @@ bool Background::load(Common::SeekableReadStream *stream) {
Common::Rect Background::draw(Graphics::Surface *surface) {
if (!_data) {
- debugC(2, kLastExpressDebugGraphics, "Trying to show a background before loading data!");
+ debugC(2, kLastExpressDebugGraphics, "Trying to show a background before loading data");
return Common::Rect();
}
diff --git a/engines/lastexpress/data/font.cpp b/engines/lastexpress/data/font.cpp
index 9a60b88a25..79cf64e617 100644
--- a/engines/lastexpress/data/font.cpp
+++ b/engines/lastexpress/data/font.cpp
@@ -89,17 +89,17 @@ bool Font::load(Common::SeekableReadStream *stream) {
uint16 Font::getCharGlyph(uint16 c) const {
//warning("%c", c);
if (c >= 0x200)
- error("Express::Font: Invalid character %d", c);
+ error("[Font::getCharGlyph] Invalid character %d", c);
return _charMap[c];
}
byte *Font::getGlyphImg(uint16 g) {
if (!_glyphs)
- error("Express::getGlyphImg: Invalid glyphs!");
+ error("[Font::getGlyphImg] Invalid glyphs");
if (g >= _numGlyphs)
- error("Express::getGlyphImg: Invalid glyph %d (%d available)", g, _numGlyphs);
+ error("[Font::getGlyphImg] Invalid glyph %d (%d available)", g, _numGlyphs);
return _glyphs + g * 18 * 8;
}
@@ -140,7 +140,7 @@ uint8 Font::getCharWidth(uint16 c) const{
return 10;
} else {
if (!_glyphWidths)
- error("Express::getCharWidth: Invalid glyphs widths!");
+ error("[Font::getCharWidth] Invalid glyphs widths");
return _glyphWidths[getCharGlyph(c)];
}
diff --git a/engines/lastexpress/data/scene.cpp b/engines/lastexpress/data/scene.cpp
index 2ec8e6935d..8f279ffbb3 100644
--- a/engines/lastexpress/data/scene.cpp
+++ b/engines/lastexpress/data/scene.cpp
@@ -187,10 +187,10 @@ bool Scene::checkHotSpot(const Common::Point &coord, SceneHotspot **hotspot) {
SceneHotspot *Scene::getHotspot(uint index) {
if (_hotspots.empty())
- error("Scene::getHotspot: scene does not have any hotspots!");
+ error("[Scene::getHotspot] Scene does not have any hotspots");
if (index >= _hotspots.size())
- error("Scene::getHotspot: invalid index (was: %d, max: %d)", index, _hotspots.size() - 1);
+ error("[Scene::getHotspot] Invalid index (was: %d, max: %d)", index, _hotspots.size() - 1);
return _hotspots[index];
}
@@ -202,7 +202,7 @@ Common::Rect Scene::draw(Graphics::Surface *surface) {
Common::String sceneName(_name);
sceneName.trim();
if (sceneName.empty())
- error("Scene::draw: This scene is not a valid drawing scene!");
+ error("[Scene::draw] This scene is not a valid drawing scene");
// Load background
Background *background = ((LastExpressEngine *)g_engine)->getResourceManager()->loadBackground(sceneName);
@@ -260,7 +260,7 @@ bool SceneLoader::load(Common::SeekableReadStream *stream) {
// Read the default scene to get the total number of scenes
Scene *header = Scene::load(_stream);
if (!header)
- error("SceneLoader::load: Invalid data file!");
+ error("[SceneLoader::load] Invalid data file");
debugC(2, kLastExpressDebugScenes, " found %d entries", header->entityPosition); /* Header entityPosition is the scene count */
diff --git a/engines/lastexpress/data/sequence.cpp b/engines/lastexpress/data/sequence.cpp
index a27c27de2e..a62348f6c0 100644
--- a/engines/lastexpress/data/sequence.cpp
+++ b/engines/lastexpress/data/sequence.cpp
@@ -115,7 +115,7 @@ AnimFrame::AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f) : _pale
decompFF(in, f);
break;
default:
- error("Unknown frame compression: %d", f.compressionType);
+ error("[AnimFrame::AnimFrame] Unknown frame compression: %d", f.compressionType);
}
readPalette(in, f);
@@ -379,11 +379,11 @@ bool Sequence::load(Common::SeekableReadStream *stream, byte field30) {
// Move stream to start of frame
_stream->seek((int32)(_sequenceHeaderSize + i * _sequenceFrameSize), SEEK_SET);
if (_stream->eos())
- error("Couldn't seek to the current frame data");
+ error("[Sequence::load] Couldn't seek to the current frame data");
// Check if there is enough data
if ((unsigned)(_stream->size() - _stream->pos()) < _sequenceFrameSize)
- error("The sequence frame does not have a valid header");
+ error("[Sequence::load] The sequence frame does not have a valid header");
FrameInfo info;
info.read(_stream, true);
@@ -397,10 +397,10 @@ bool Sequence::load(Common::SeekableReadStream *stream, byte field30) {
FrameInfo *Sequence::getFrameInfo(uint16 index) {
if (_frames.size() == 0)
- error("Trying to decode a sequence before loading its data");
+ error("[Sequence::getFrameInfo] Trying to decode a sequence before loading its data");
if (index > _frames.size() - 1)
- error("Invalid sequence frame requested: %d, max %d", index, _frames.size() - 1);
+ error("[Sequence::getFrameInfo] Invalid sequence frame requested: %d, max %d", index, _frames.size() - 1);
return &_frames[index];
}
@@ -463,14 +463,14 @@ bool SequenceFrame::nextFrame() {
FrameInfo *SequenceFrame::getInfo() {
if (!_sequence)
- error("SequenceFrame::getFrameInfo: Invalid sequence!");
+ error("[SequenceFrame::getInfo] Invalid sequence");
return _sequence->getFrameInfo(_frame);
}
Common::String SequenceFrame::getName() {
if (!_sequence)
- error("SequenceFrame::getName: Invalid sequence!");
+ error("[SequenceFrame::getName] Invalid sequence");
return _sequence->getName();
}
diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp
index 3ffe3ca14b..a9bee6155d 100644
--- a/engines/lastexpress/data/snd.cpp
+++ b/engines/lastexpress/data/snd.cpp
@@ -36,16 +36,336 @@
namespace LastExpress {
+#pragma region Sound filters tables
+
+static const int stepTable[1424] = {
+ 0, 0, 0, 0, 128, 256, 384, 512, 0, 0, 0, 0, 128, 256,
+ 384, 512, 0, 0, 0, 0, 192, 320, 448, 576, 0, 0, 0, 0,
+ 192, 320, 448, 576, 64, 64, 64, 64, 256, 384, 512, 640,
+ 64, 64, 64, 64, 256, 384, 512, 640, 128, 128, 128, 128,
+ 320, 448, 576, 704, 128, 128, 128, 128, 320, 448, 576,
+ 704, 192, 192, 192, 192, 384, 512, 640, 768, 192, 192,
+ 192, 192, 384, 512, 640, 768, 256, 256, 256, 256, 448,
+ 576, 704, 832, 256, 256, 256, 256, 448, 576, 704, 832,
+ 320, 320, 320, 320, 512, 640, 768, 896, 320, 320, 320,
+ 320, 512, 640, 768, 896, 384, 384, 384, 384, 576, 704,
+ 832, 960, 384, 384, 384, 384, 576, 704, 832, 960, 448,
+ 448, 448, 448, 640, 768, 896, 1024, 448, 448, 448, 448,
+ 640, 768, 896, 1024, 512, 512, 512, 512, 704, 832, 960,
+ 1088, 512, 512, 512, 512, 704, 832, 960, 1088, 576,
+ 576, 576, 576, 768, 896, 1024, 1152, 576, 576, 576,
+ 576, 768, 896, 1024, 1152, 640, 640, 640, 640, 832,
+ 960, 1088, 1216, 640, 640, 640, 640, 832, 960, 1088,
+ 1216, 704, 704, 704, 704, 896, 1024, 1152, 1280, 704,
+ 704, 704, 704, 896, 1024, 1152, 1280, 768, 768, 768,
+ 768, 960, 1088, 1216, 1344, 768, 768, 768, 768, 960,
+ 1088, 1216, 1344, 832, 832, 832, 832, 1024, 1152, 1280,
+ 1408, 832, 832, 832, 832, 1024, 1152, 1280, 1408, 896,
+ 896, 896, 896, 1088, 1216, 1344, 1472, 896, 896, 896,
+ 896, 1088, 1216, 1344, 1472, 960, 960, 960, 960, 1152,
+ 1280, 1408, 1536, 960, 960, 960, 960, 1152, 1280, 1408,
+ 1536, 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600,
+ 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600, 1088,
+ 1088, 1088, 1088, 1280, 1408, 1536, 1664, 1088, 1088,
+ 1088, 1088, 1280, 1408, 1536, 1664, 1152, 1152, 1152,
+ 1152, 1344, 1472, 1600, 1728, 1152, 1152, 1152, 1152,
+ 1344, 1472, 1600, 1728, 1216, 1216, 1216, 1216, 1408,
+ 1536, 1664, 1792, 1216, 1216, 1216, 1216, 1408, 1536,
+ 1664, 1792, 1280, 1280, 1280, 1280, 1472, 1600, 1728,
+ 1856, 1280, 1280, 1280, 1280, 1472, 1600, 1728, 1856,
+ 1344, 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1344,
+ 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1408, 1408,
+ 1408, 1408, 1600, 1728, 1856, 1984, 1408, 1408, 1408,
+ 1408, 1600, 1728, 1856, 1984, 1472, 1472, 1472, 1472,
+ 1664, 1792, 1920, 2048, 1472, 1472, 1472, 1472, 1664,
+ 1792, 1920, 2048, 1536, 1536, 1536, 1536, 1728, 1856,
+ 1984, 2112, 1536, 1536, 1536, 1536, 1728, 1856, 1984,
+ 2112, 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176,
+ 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176, 1664,
+ 1664, 1664, 1664, 1856, 1984, 2112, 2240, 1664, 1664,
+ 1664, 1664, 1856, 1984, 2112, 2240, 1728, 1728, 1728,
+ 1728, 1920, 2048, 2176, 2304, 1728, 1728, 1728, 1728,
+ 1920, 2048, 2176, 2304, 1792, 1792, 1792, 1792, 1984,
+ 2112, 2240, 2368, 1792, 1792, 1792, 1792, 1984, 2112,
+ 2240, 2368, 1856, 1856, 1856, 1856, 2048, 2176, 2304,
+ 2432, 1856, 1856, 1856, 1856, 2048, 2176, 2304, 2432,
+ 1920, 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1920,
+ 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1984, 1984,
+ 1984, 1984, 2176, 2304, 2432, 2560, 1984, 1984, 1984,
+ 1984, 2176, 2304, 2432, 2560, 2048, 2048, 2048, 2048,
+ 2240, 2368, 2496, 2624, 2048, 2048, 2048, 2048, 2240,
+ 2368, 2496, 2624, 2112, 2112, 2112, 2112, 2304, 2432,
+ 2560, 2688, 2112, 2112, 2112, 2112, 2304, 2432, 2560,
+ 2688, 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752,
+ 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752, 2240,
+ 2240, 2240, 2240, 2432, 2560, 2688, 2816, 2240, 2240,
+ 2240, 2240, 2432, 2560, 2688, 2816, 2304, 2304, 2304,
+ 2304, 2496, 2624, 2752, 2880, 2304, 2304, 2304, 2304,
+ 2496, 2624, 2752, 2880, 2368, 2368, 2368, 2368, 2560,
+ 2688, 2816, 2944, 2368, 2368, 2368, 2368, 2560, 2688,
+ 2816, 2944, 2432, 2432, 2432, 2432, 2624, 2752, 2880,
+ 3008, 2432, 2432, 2432, 2432, 2624, 2752, 2880, 3008,
+ 2496, 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2496,
+ 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2560, 2560,
+ 2560, 2560, 2752, 2880, 3008, 3136, 2560, 2560, 2560,
+ 2560, 2752, 2880, 3008, 3136, 2624, 2624, 2624, 2624,
+ 2816, 2944, 3072, 3200, 2624, 2624, 2624, 2624, 2816,
+ 2944, 3072, 3200, 2688, 2688, 2688, 2688, 2880, 3008,
+ 3136, 3264, 2688, 2688, 2688, 2688, 2880, 3008, 3136,
+ 3264, 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328,
+ 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328, 2816,
+ 2816, 2816, 2816, 3008, 3136, 3264, 3392, 2816, 2816,
+ 2816, 2816, 3008, 3136, 3264, 3392, 2880, 2880, 2880,
+ 2880, 3072, 3200, 3328, 3456, 2880, 2880, 2880, 2880,
+ 3072, 3200, 3328, 3456, 2944, 2944, 2944, 2944, 3136,
+ 3264, 3392, 3520, 2944, 2944, 2944, 2944, 3136, 3264,
+ 3392, 3520, 3008, 3008, 3008, 3008, 3200, 3328, 3456,
+ 3584, 3008, 3008, 3008, 3008, 3200, 3328, 3456, 3584,
+ 3072, 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3072,
+ 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3136, 3136,
+ 3136, 3136, 3328, 3456, 3584, 3712, 3136, 3136, 3136,
+ 3136, 3328, 3456, 3584, 3712, 3200, 3200, 3200, 3200,
+ 3392, 3520, 3648, 3776, 3200, 3200, 3200, 3200, 3392,
+ 3520, 3648, 3776, 3264, 3264, 3264, 3264, 3456, 3584,
+ 3712, 3840, 3264, 3264, 3264, 3264, 3456, 3584, 3712,
+ 3840, 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904,
+ 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904, 3392,
+ 3392, 3392, 3392, 3584, 3712, 3840, 3968, 3392, 3392,
+ 3392, 3392, 3584, 3712, 3840, 3968, 3456, 3456, 3456,
+ 3456, 3648, 3776, 3904, 4032, 3456, 3456, 3456, 3456,
+ 3648, 3776, 3904, 4032, 3520, 3520, 3520, 3520, 3712,
+ 3840, 3968, 4096, 3520, 3520, 3520, 3520, 3712, 3840,
+ 3968, 4096, 3584, 3584, 3584, 3584, 3776, 3904, 4032,
+ 4160, 3584, 3584, 3584, 3584, 3776, 3904, 4032, 4160,
+ 3648, 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3648,
+ 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3712, 3712,
+ 3712, 3712, 3904, 4032, 4160, 4288, 3712, 3712, 3712,
+ 3712, 3904, 4032, 4160, 4288, 3776, 3776, 3776, 3776,
+ 3968, 4096, 4224, 4352, 3776, 3776, 3776, 3776, 3968,
+ 4096, 4224, 4352, 3840, 3840, 3840, 3840, 4032, 4160,
+ 4288, 4416, 3840, 3840, 3840, 3840, 4032, 4160, 4288,
+ 4416, 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480,
+ 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480, 3968,
+ 3968, 3968, 3968, 4160, 4288, 4416, 4544, 3968, 3968,
+ 3968, 3968, 4160, 4288, 4416, 4544, 4032, 4032, 4032,
+ 4032, 4224, 4352, 4480, 4608, 4032, 4032, 4032, 4032,
+ 4224, 4352, 4480, 4608, 4096, 4096, 4096, 4096, 4288,
+ 4416, 4544, 4672, 4096, 4096, 4096, 4096, 4288, 4416,
+ 4544, 4672, 4160, 4160, 4160, 4160, 4352, 4480, 4608,
+ 4736, 4160, 4160, 4160, 4160, 4352, 4480, 4608, 4736,
+ 4224, 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4224,
+ 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4288, 4288,
+ 4288, 4288, 4480, 4608, 4736, 4864, 4288, 4288, 4288,
+ 4288, 4480, 4608, 4736, 4864, 4352, 4352, 4352, 4352,
+ 4544, 4672, 4800, 4928, 4352, 4352, 4352, 4352, 4544,
+ 4672, 4800, 4928, 4416, 4416, 4416, 4416, 4608, 4736,
+ 4864, 4992, 4416, 4416, 4416, 4416, 4608, 4736, 4864,
+ 4992, 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056,
+ 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056, 4544,
+ 4544, 4544, 4544, 4736, 4864, 4992, 5120, 4544, 4544,
+ 4544, 4544, 4736, 4864, 4992, 5120, 4608, 4608, 4608,
+ 4608, 4800, 4928, 5056, 5184, 4608, 4608, 4608, 4608,
+ 4800, 4928, 5056, 5184, 4672, 4672, 4672, 4672, 4864,
+ 4992, 5120, 5248, 4672, 4672, 4672, 4672, 4864, 4992,
+ 5120, 5248, 4736, 4736, 4736, 4736, 4928, 5056, 5184,
+ 5312, 4736, 4736, 4736, 4736, 4928, 5056, 5184, 5312,
+ 4800, 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4800,
+ 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4864, 4864,
+ 4864, 4864, 5056, 5184, 5312, 5440, 4864, 4864, 4864,
+ 4864, 5056, 5184, 5312, 5440, 4928, 4928, 4928, 4928,
+ 5120, 5248, 5376, 5504, 4928, 4928, 4928, 4928, 5120,
+ 5248, 5376, 5504, 4992, 4992, 4992, 4992, 5184, 5312,
+ 5440, 5568, 4992, 4992, 4992, 4992, 5184, 5312, 5440,
+ 5568, 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632,
+ 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632, 5120,
+ 5120, 5120, 5120, 5312, 5440, 5568, 5632, 5120, 5120,
+ 5120, 5120, 5312, 5440, 5568, 5632, 5184, 5184, 5184,
+ 5184, 5376, 5504, 5632, 5632, 5184, 5184, 5184, 5184,
+ 5376, 5504, 5632, 5632, 5248, 5248, 5248, 5248, 5440,
+ 5568, 5632, 5632, 5248, 5248, 5248, 5248, 5440, 5568,
+ 5632, 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632,
+ 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632, 5632,
+ 5376, 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5376,
+ 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5440, 5440,
+ 5440, 5440, 5632, 5632, 5632, 5632, 5440, 5440, 5440,
+ 5440, 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504,
+ 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504, 5632,
+ 5632, 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632,
+ 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632, 5632,
+ 5632
+};
+
+static const int imaTable[1424] = {
+ 0, 2, 4, 6, 7, 9, 11, 13, 0, -2, -4, -6, -7, -9, -11,
+ -13, 1, 3, 5, 7, 9, 11, 13, 15, -1, -3, -5, -7, -9,
+ -11, -13, -15, 1, 3, 5, 7, 10, 12, 14, 16, -1, -3, -5,
+ -7, -10, -12, -14, -16, 1, 3, 6, 8, 11, 13, 16, 18,
+ -1, -3, -6, -8, -11, -13, -16, -18, 1, 4, 6, 9, 12,
+ 15, 17, 20, -1, -4, -6, -9, -12, -15, -17, -20, 1, 4,
+ 7, 10, 13, 16, 19, 22, -1, -4, -7, -10, -13, -16, -19,
+ -22, 1, 4, 8, 11, 14, 17, 21, 24, -1, -4, -8, -11, -14,
+ -17, -21, -24, 1, 5, 8, 12, 15, 19, 22, 26, -1, -5,
+ -8, -12, -15, -19, -22, -26, 2, 6, 10, 14, 18, 22, 26,
+ 30, -2, -6, -10, -14, -18, -22, -26, -30, 2, 6, 10,
+ 14, 19, 23, 27, 31, -2, -6, -10, -14, -19, -23, -27,
+ -31, 2, 7, 11, 16, 21, 26, 30, 35, -2, -7, -11, -16,
+ -21, -26, -30, -35, 2, 7, 13, 18, 23, 28, 34, 39, -2,
+ -7, -13, -18, -23, -28, -34, -39, 2, 8, 14, 20, 25,
+ 31, 37, 43, -2, -8, -14, -20, -25, -31, -37, -43, 3,
+ 9, 15, 21, 28, 34, 40, 46, -3, -9, -15, -21, -28, -34,
+ -40, -46, 3, 10, 17, 24, 31, 38, 45, 52, -3, -10, -17,
+ -24, -31, -38, -45, -52, 3, 11, 19, 27, 34, 42, 50,
+ 58, -3, -11, -19, -27, -34, -42, -50, -58, 4, 12, 21,
+ 29, 38, 46, 55, 63, -4, -12, -21, -29, -38, -46, -55,
+ -63, 4, 13, 23, 32, 41, 50, 60, 69, -4, -13, -23, -32,
+ -41, -50, -60, -69, 5, 15, 25, 35, 46, 56, 66, 76, -5,
+ -15, -25, -35, -46, -56, -66, -76, 5, 16, 28, 39, 50,
+ 61, 73, 84, -5, -16, -28, -39, -50, -61, -73, -84, 6,
+ 18, 31, 43, 56, 68, 81, 93, -6, -18, -31, -43, -56,
+ -68, -81, -93, 6, 20, 34, 48, 61, 75, 89, 103, -6, -20,
+ -34, -48, -61, -75, -89, -103, 7, 22, 37, 52, 67, 82,
+ 97, 112, -7, -22, -37, -52, -67, -82, -97, -112, 8,
+ 24, 41, 57, 74, 90, 107, 123, -8, -24, -41, -57, -74,
+ -90, -107, -123, 9, 27, 45, 63, 82, 100, 118, 136, -9,
+ -27, -45, -63, -82, -100, -118, -136, 10, 30, 50, 70,
+ 90, 110, 130, 150, -10, -30, -50, -70, -90, -110, -130,
+ -150, 11, 33, 55, 77, 99, 121, 143, 165, -11, -33, -55,
+ -77, -99, -121, -143, -165, 12, 36, 60, 84, 109, 133,
+ 157, 181, -12, -36, -60, -84, -109, -133, -157, -181,
+ 13, 40, 66, 93, 120, 147, 173, 200, -13, -40, -66, -93,
+ -120, -147, -173, -200, 14, 44, 73, 103, 132, 162, 191,
+ 221, -14, -44, -73, -103, -132, -162, -191, -221, 16,
+ 48, 81, 113, 146, 178, 211, 243, -16, -48, -81, -113,
+ -146, -178, -211, -243, 17, 53, 89, 125, 160, 196, 232,
+ 268, -17, -53, -89, -125, -160, -196, -232, -268, 19,
+ 58, 98, 137, 176, 215, 255, 294, -19, -58, -98, -137,
+ -176, -215, -255, -294, 21, 64, 108, 151, 194, 237,
+ 281, 324, -21, -64, -108, -151, -194, -237, -281, -324,
+ 23, 71, 118, 166, 213, 261, 308, 356, -23, -71, -118,
+ -166, -213, -261, -308, -356, 26, 78, 130, 182, 235,
+ 287, 339, 391, -26, -78, -130, -182, -235, -287, -339,
+ -391, 28, 86, 143, 201, 258, 316, 373, 431, -28, -86,
+ -143, -201, -258, -316, -373, -431, 31, 94, 158, 221,
+ 284, 347, 411, 474, -31, -94, -158, -221, -284, -347,
+ -411, -474, 34, 104, 174, 244, 313, 383, 453, 523, -34,
+ -104, -174, -244, -313, -383, -453, -523, 38, 115, 191,
+ 268, 345, 422, 498, 575, -38, -115, -191, -268, -345,
+ -422, -498, -575, 42, 126, 210, 294, 379, 463, 547,
+ 631, -42, -126, -210, -294, -379, -463, -547, -631,
+ 46, 139, 231, 324, 417, 510, 602, 695, -46, -139, -231,
+ -324, -417, -510, -602, -695, 51, 153, 255, 357, 459,
+ 561, 663, 765, -51, -153, -255, -357, -459, -561, -663,
+ -765, 56, 168, 280, 392, 505, 617, 729, 841, -56, -168,
+ -280, -392, -505, -617, -729, -841, 61, 185, 308, 432,
+ 555, 679, 802, 926, -61, -185, -308, -432, -555, -679,
+ -802, -926, 68, 204, 340, 476, 612, 748, 884, 1020,
+ -68, -204, -340, -476, -612, -748, -884, -1020, 74,
+ 224, 373, 523, 672, 822, 971, 1121, -74, -224, -373,
+ -523, -672, -822, -971, -1121, 82, 246, 411, 575, 740,
+ 904, 1069, 1233, -82, -246, -411, -575, -740, -904,
+ -1069, -1233, 90, 271, 452, 633, 814, 995, 1176, 1357,
+ -90, -271, -452, -633, -814, -995, -1176, -1357, 99,
+ 298, 497, 696, 895, 1094, 1293, 1492, -99, -298, -497,
+ -696, -895, -1094, -1293, -1492, 109, 328, 547, 766,
+ 985, 1204, 1423, 1642, -109, -328, -547, -766, -985,
+ -1204, -1423, -1642, 120, 361, 601, 842, 1083, 1324,
+ 1564, 1805, -120, -361, -601, -842, -1083, -1324, -1564,
+ -1805, 132, 397, 662, 927, 1192, 1457, 1722, 1987, -132,
+ -397, -662, -927, -1192, -1457, -1722, -1987, 145, 437,
+ 728, 1020, 1311, 1603, 1894, 2186, -145, -437, -728,
+ -1020, -1311, -1603, -1894, -2186, 160, 480, 801, 1121,
+ 1442, 1762, 2083, 2403, -160, -480, -801, -1121, -1442,
+ -1762, -2083, -2403, 176, 529, 881, 1234, 1587, 1940,
+ 2292, 2645, -176, -529, -881, -1234, -1587, -1940, -2292,
+ -2645, 194, 582, 970, 1358, 1746, 2134, 2522, 2910,
+ -194, -582, -970, -1358, -1746, -2134, -2522, -2910,
+ 213, 640, 1066, 1493, 1920, 2347, 2773, 3200, -213,
+ -640, -1066, -1493, -1920, -2347, -2773, -3200, 234,
+ 704, 1173, 1643, 2112, 2582, 3051, 3521, -234, -704,
+ -1173, -1643, -2112, -2582, -3051, -3521, 258, 774,
+ 1291, 1807, 2324, 2840, 3357, 3873, -258, -774, -1291,
+ -1807, -2324, -2840, -3357, -3873, 284, 852, 1420, 1988,
+ 2556, 3124, 3692, 4260, -284, -852, -1420, -1988, -2556,
+ -3124, -3692, -4260, 312, 937, 1561, 2186, 2811, 3436,
+ 4060, 4685, -312, -937, -1561, -2186, -2811, -3436,
+ -4060, -4685, 343, 1030, 1718, 2405, 3092, 3779, 4467,
+ 5154, -343, -1030, -1718, -2405, -3092, -3779, -4467,
+ -5154, 378, 1134, 1890, 2646, 3402, 4158, 4914, 5670,
+ -378, -1134, -1890, -2646, -3402, -4158, -4914, -5670,
+ 415, 1247, 2079, 2911, 3742, 4574, 5406, 6238, -415,
+ -1247, -2079, -2911, -3742, -4574, -5406, -6238, 457,
+ 1372, 2287, 3202, 4117, 5032, 5947, 6862, -457, -1372,
+ -2287, -3202, -4117, -5032, -5947, -6862, 503, 1509,
+ 2516, 3522, 4529, 5535, 6542, 7548, -503, -1509, -2516,
+ -3522, -4529, -5535, -6542, -7548, 553, 1660, 2767,
+ 3874, 4981, 6088, 7195, 8302, -553, -1660, -2767, -3874,
+ -4981, -6088, -7195, -8302, 608, 1826, 3044, 4262, 5479,
+ 6697, 7915, 9133, -608, -1826, -3044, -4262, -5479,
+ -6697, -7915, -9133, 669, 2009, 3348, 4688, 6027, 7367,
+ 8706, 10046, -669, -2009, -3348, -4688, -6027, -7367,
+ -8706, -10046, 736, 2210, 3683, 5157, 6630, 8104, 9577,
+ 11051, -736, -2210, -3683, -5157, -6630, -8104, -9577,
+ -11051, 810, 2431, 4052, 5673, 7294, 8915, 10536, 12157,
+ -810, -2431, -4052, -5673, -7294, -8915, -10536, -12157,
+ 891, 2674, 4457, 6240, 8023, 9806, 11589, 13372, -891,
+ -2674, -4457, -6240, -8023, -9806, -11589, -13372, 980,
+ 2941, 4903, 6864, 8825, 10786, 12748, 14709, -980, -2941,
+ -4903, -6864, -8825, -10786, -12748, -14709, 1078, 3236,
+ 5393, 7551, 9708, 11866, 14023, 16181, -1078, -3236,
+ -5393, -7551, -9708, -11866, -14023, -16181, 1186, 3559,
+ 5933, 8306, 10679, 13052, 15426, 17799, -1186, -3559,
+ -5933, -8306, -10679, -13052, -15426, -17799, 1305,
+ 3915, 6526, 9136, 11747, 14357, 16968, 19578, -1305,
+ -3915, -6526, -9136, -11747, -14357, -16968, -19578,
+ 1435, 4307, 7179, 10051, 12922, 15794, 18666, 21538,
+ -1435, -4307, -7179, -10051, -12922, -15794, -18666,
+ -21538, 1579, 4738, 7896, 11055, 14214, 17373, 20531,
+ 23690, -1579, -4738, -7896, -11055, -14214, -17373,
+ -20531, -23690, 1737, 5212, 8686, 12161, 15636, 19111,
+ 22585, 26060, -1737, -5212, -8686, -12161, -15636, -19111,
+ -22585, -26060, 1911, 5733, 9555, 13377, 17200, 21022,
+ 24844, 28666, -1911, -5733, -9555, -13377, -17200, -21022,
+ -24844, -28666, 2102, 6306, 10511, 14715, 18920, 23124,
+ 27329, 31533, -2102, -6306, -10511, -14715, -18920,
+ -23124, -27329, -31533, 2312, 6937, 11562, 16187, 20812,
+ 25437, 30062, 32767, -2312, -6937, -11562, -16187, -20812,
+ -25437, -30062, -32767, 2543, 7631, 12718, 17806, 22893,
+ 27981, 32767, 32767, -2543, -7631, -12718, -17806, -22893,
+ -27981, -32767, -32767, 2798, 8394, 13990, 19586, 25183,
+ 30779, 32767, 32767, -2798, -8394, -13990, -19586, -25183,
+ -30779, -32767, -32767, 3077, 9233, 15389, 21545, 27700,
+ 32767, 32767, 32767, -3077, -9233, -15389, -21545, -27700,
+ -32767, -32767, -32767, 3385, 10157, 16928, 23700, 30471,
+ 32767, 32767, 32767, -3385, -10157, -16928, -23700,
+ -30471, -32767, -32767, -32767, 3724, 11172, 18621,
+ 26069, 32767, 32767, 32767, 32767, -3724, -11172, -18621,
+ -26069, -32767, -32767, -32767, -32767, 4095, 12287,
+ 20479, 28671, 32767, 32767, 32767, 32767, -4095, -12287,
+ -20479, -28671, -32767, -32767, -32767, -32767
+};
+
+static const int p1s[17] = { 0, 4, 3, 4, 2, 4, 3, 4, 1, 4, 3, 4, 2, 4, 3, 4, 0 };
+static const int p2s[17] = { 0, 1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15, 1 };
+
+#pragma endregion
+
// Last Express ADPCM is similar to MS IMA mono, but inverts its nibbles
// and does not have the 4 byte per channel requirement
-class LastExpress_ADPCMStream : public Audio::Ima_ADPCMStream {
+class LastExpress_ADPCMStream : public Audio::ADPCMStream {
public:
- LastExpress_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, uint32 blockSize) :
- Audio::Ima_ADPCMStream(stream, disposeAfterUse, size, 44100, 1, blockSize) {}
+ LastExpress_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, uint32 blockSize, int32 filterId) :
+ Audio::ADPCMStream(stream, disposeAfterUse, size, 44100, 1, blockSize) {
+ _currentFilterId = -1;
+ _nextFilterId = filterId;
+ }
int readBuffer(int16 *buffer, const int numSamples) {
int samples = 0;
+ // Temporary data
+ int step = 0;
+ int sample = 0;
+ byte idx = 0;
assert(numSamples % 2 == 0);
@@ -53,20 +373,50 @@ public:
if (_blockPos[0] == _blockAlign) {
// read block header
_status.ima_ch[0].last = _stream->readSint16LE();
- _status.ima_ch[0].stepIndex = _stream->readSint16LE();
+ _status.ima_ch[0].stepIndex = _stream->readSint16LE() << 6;
_blockPos[0] = 4;
+
+ // Get current filter
+ _currentFilterId = _nextFilterId;
+ _nextFilterId = -1;
+
+ // No filter: skip decoding
+ if (_currentFilterId == -1)
+ break;
+
+ // Compute step adjustment
+ _stepAdjust1 = p1s[_currentFilterId];
+ _stepAdjust2 = p2s[_currentFilterId];
}
for (; samples < numSamples && _blockPos[0] < _blockAlign && !_stream->eos() && _stream->pos() < _endpos; samples += 2) {
byte data = _stream->readByte();
_blockPos[0]++;
- buffer[samples] = decodeIMA((data >> 4) & 0x0f);
- buffer[samples + 1] = decodeIMA(data & 0x0f);
+
+ // First nibble
+ idx = data >> 4;
+ step = stepTable[idx + _status.ima_ch[0].stepIndex / 4];
+ sample = CLIP<int>(imaTable[idx + _status.ima_ch[0].stepIndex / 4] + _status.ima_ch[0].last, -32767, 32767);
+ buffer[samples] = (_stepAdjust2 * sample) >> _stepAdjust1;
+
+ // Second nibble
+ idx = data & 0xF;
+ _status.ima_ch[0].stepIndex = stepTable[idx + step / 4];
+ _status.ima_ch[0].last = CLIP(imaTable[idx + step / 4] + sample, -32767, 32767);
+ buffer[samples + 1] = (_stepAdjust2 * _status.ima_ch[0].last) >> _stepAdjust1;
}
}
return samples;
}
+
+ void setFilterId(int32 filterId) { _nextFilterId = filterId; }
+
+private:
+ int32 _currentFilterId;
+ int32 _nextFilterId; // the sound filter id, -1 for none
+ int32 _stepAdjust1;
+ int32 _stepAdjust2;
};
//////////////////////////////////////////////////////////////////////////
@@ -92,8 +442,8 @@ void SimpleSound::loadHeader(Common::SeekableReadStream *in) {
_blockSize = _size / _blocks;
}
-Audio::AudioStream *SimpleSound::makeDecoder(Common::SeekableReadStream *in, uint32 size) const {
- return new LastExpress_ADPCMStream(in, DisposeAfterUse::YES, size, _blockSize);
+Audio::AudioStream *SimpleSound::makeDecoder(Common::SeekableReadStream *in, uint32 size, int32 filterId) const {
+ return new LastExpress_ADPCMStream(in, DisposeAfterUse::YES, size, _blockSize, filterId);
}
void SimpleSound::play(Audio::AudioStream *as) {
@@ -103,10 +453,11 @@ void SimpleSound::play(Audio::AudioStream *as) {
//////////////////////////////////////////////////////////////////////////
// StreamedSound
//////////////////////////////////////////////////////////////////////////
-StreamedSound::StreamedSound() {}
+StreamedSound::StreamedSound() : _as(NULL), _loaded(false) {}
+
StreamedSound::~StreamedSound() {}
-bool StreamedSound::load(Common::SeekableReadStream *stream) {
+bool StreamedSound::load(Common::SeekableReadStream *stream, int32 filterId) {
if (!stream)
return false;
@@ -115,14 +466,27 @@ bool StreamedSound::load(Common::SeekableReadStream *stream) {
loadHeader(stream);
// Start decoding the input stream
- Audio::AudioStream *as = makeDecoder(stream, _size);
+ _as = makeDecoder(stream, _size, filterId);
// Start playing the decoded audio stream
- play(as);
+ play(_as);
+
+ _loaded = true;
return true;
}
+bool StreamedSound::isFinished() {
+ if (!_loaded)
+ return false;
+
+ return !g_system->getMixer()->isSoundHandleActive(_handle);
+}
+
+void StreamedSound::setFilterId(int32 filterId) {
+ ((LastExpress_ADPCMStream *)_as)->setFilterId(filterId);
+}
+
//////////////////////////////////////////////////////////////////////////
// StreamedSound
//////////////////////////////////////////////////////////////////////////
@@ -152,7 +516,7 @@ void AppendableSound::queueBuffer(const byte *data, uint32 size) {
void AppendableSound::queueBuffer(Common::SeekableReadStream *bufferIn) {
if (!_as)
- error("AppendableSound::queueBuffer - internal error: the audio stream is invalid!");
+ error("[AppendableSound::queueBuffer] Audio stream is invalid");
// Setup the ADPCM decoder
uint32 sizeIn = (uint32)bufferIn->size();
@@ -164,7 +528,7 @@ void AppendableSound::queueBuffer(Common::SeekableReadStream *bufferIn) {
void AppendableSound::finish() {
if (!_as)
- error("AppendableSound::queueBuffer - internal error: the audio stream is invalid!");
+ error("[AppendableSound::finish] Audio stream is invalid");
if (!_finished)
_as->finish();
@@ -172,4 +536,8 @@ void AppendableSound::finish() {
_finished = true;
}
+bool AppendableSound::isFinished() {
+ return _as->endOfStream();
+}
+
} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/snd.h b/engines/lastexpress/data/snd.h
index 95a136ee1c..7111d939e7 100644
--- a/engines/lastexpress/data/snd.h
+++ b/engines/lastexpress/data/snd.h
@@ -55,10 +55,11 @@ public:
virtual ~SimpleSound();
void stop() const;
+ virtual bool isFinished() = 0;
protected:
void loadHeader(Common::SeekableReadStream *in);
- Audio::AudioStream *makeDecoder(Common::SeekableReadStream *in, uint32 size) const;
+ Audio::AudioStream *makeDecoder(Common::SeekableReadStream *in, uint32 size, int32 filterId = -1) const;
void play(Audio::AudioStream *as);
uint32 _size; ///< data size
@@ -75,7 +76,14 @@ public:
StreamedSound();
~StreamedSound();
- bool load(Common::SeekableReadStream *stream);
+ bool load(Common::SeekableReadStream *stream, int32 filterId = -1);
+ virtual bool isFinished();
+
+ void setFilterId(int32 filterId);
+
+private:
+ Audio::AudioStream *_as;
+ bool _loaded;
};
class AppendableSound : public SimpleSound {
@@ -87,6 +95,8 @@ public:
void queueBuffer(Common::SeekableReadStream *bufferIn);
void finish();
+ virtual bool isFinished();
+
private:
Audio::QueuingAudioStream *_as;
bool _finished;
diff --git a/engines/lastexpress/data/subtitle.cpp b/engines/lastexpress/data/subtitle.cpp
index c3a7397b66..0be832cbdd 100644
--- a/engines/lastexpress/data/subtitle.cpp
+++ b/engines/lastexpress/data/subtitle.cpp
@@ -168,13 +168,13 @@ bool SubtitleManager::load(Common::SeekableReadStream *stream) {
// Read header to get the number of subtitles
uint32 numSubtitles = stream->readUint16LE();
if (stream->eos())
- error("Cannot read from subtitle file");
+ error("[SubtitleManager::load] Cannot read from subtitle file");
debugC(3, kLastExpressDebugSubtitle, "Number of subtitles in file: %d", numSubtitles);
// TODO: Check that stream contain enough data
//if (stream->size() < (signed)(numSubtitles * sizeof(SubtitleData))) {
- //debugC(2, kLastExpressDebugSubtitle, "Subtitle file does not contain valid data!");
+ //debugC(2, kLastExpressDebugSubtitle, "Subtitle file does not contain valid data");
//return false;
//}
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index 4b7c5f6a9a..dc2807db63 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -31,18 +31,21 @@
#include "lastexpress/data/snd.h"
#include "lastexpress/data/subtitle.h"
+#include "lastexpress/fight/fight.h"
+
#include "lastexpress/game/action.h"
#include "lastexpress/game/beetle.h"
-#include "lastexpress/game/fight.h"
#include "lastexpress/game/inventory.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savegame.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/graphics.h"
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -792,7 +795,7 @@ bool Debugger::cmdFight(int argc, const char **argv) {
restoreArchive();
// Stop audio and restore scene
- getSound()->stopAllSound();
+ getSoundQueue()->stopAllSound();
clearBg(GraphicsManager::kBackgroundAll);
@@ -924,7 +927,7 @@ bool Debugger::cmdBeetle(int argc, const char **argv) {
restoreArchive();
// Stop audio and restore scene
- getSound()->stopAllSound();
+ getSoundQueue()->stopAllSound();
clearBg(GraphicsManager::kBackgroundAll);
diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp
index de80e75341..e2133c0929 100644
--- a/engines/lastexpress/detection.cpp
+++ b/engines/lastexpress/detection.cpp
@@ -48,7 +48,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// The Last Express (English) - UK Broderbund Release
@@ -66,7 +66,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// The Last Express (English) - Interplay Release
@@ -84,7 +84,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// The Last Express (Demo - English) - Broderbund
@@ -99,7 +99,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformUnknown,
ADGF_DEMO | ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// The Last Express (French) - Broderbund Release
@@ -117,7 +117,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// The Last Express (German)
@@ -127,7 +127,7 @@ static const ADGameDescription gameDescriptions[] = {
"lastexpress",
"",
{
- {"HD.HPF", 0, "7cdd70fc0b1555785f1e9e8d371ea85c", 31301632}, // 1997-04-08 14:33:42
+ {"HD.HPF", 0, "7cdd70fc0b1555785f1e9e8d371ea85c", 31301632}, // 1997-04-08 14:33:42
{"CD1.HPF", 0, "6d74cc861d172466bc745ff8bf0e59c5", 522971136}, // 1997-04-08 13:05:56
{"CD2.HPF", 0, "b71ac9391de415807c74ff078f4fab22", 655702016}, // 1997-04-08 15:26:14
{"CD3.HPF", 0, "ee55d4310546dd2a38560b096d1c2771", 641144832}, // 1997-04-05 18:35:50
@@ -135,7 +135,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// The Last Express (Spanish)
@@ -153,7 +153,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// The Last Express (Italian)
@@ -163,7 +163,7 @@ static const ADGameDescription gameDescriptions[] = {
"lastexpress",
"",
{
- {"HD.HPF", 0, "5539e78fd7eecb70bc858e86b5709fe9", 29562880}, // 1997-12-11 14:11:52
+ {"HD.HPF", 0, "5539e78fd7eecb70bc858e86b5709fe9", 29562880}, // 1997-12-11 14:11:52
{"CD1.HPF", 0, "3c1c80b41f2c454b7b89dcb32648796c", 522328064}, // 1997-12-11 14:39:46
{"CD2.HPF", 0, "ea6414d5a718501cfd55de3884f4431d", 665411584}, // 1997-12-11 15:20:26
{"CD3.HPF", 0, "a5bd5b58acddbd951d4551f68de22025", 637718528}, // 1997-12-11 15:58:44
@@ -171,7 +171,25 @@ static const ADGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+
+ // The Last Express (Russian)
+ // expressw.exe 1999-04-05 15:33:56
+ // express.exe ???
+ {
+ "lastexpress",
+ "",
+ {
+ {"HD.HPF", 0, "a9e915c20f3231c5a1ac4455286971bb", 29908992}, // 1999-04-08 12:43:56
+ {"CD1.HPF", 0, "80fbb95c9228353436b7b38e4b5bb64d", 525805568}, // 1999-04-07 13:30:14
+ {"CD2.HPF", 0, "a1c8c344754e03eaa86eaabc6024709e", 677289984}, // 1999-04-07 16:19:56
+ {"CD3.HPF", 0, "ea5adac447e59ea6d4a1737abad46480", 642584576}, // 1999-04-07 17:26:18
+ },
+ Common::RU_RUS,
+ Common::kPlatformUnknown,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER
@@ -182,7 +200,7 @@ class LastExpressMetaEngine : public AdvancedMetaEngine {
public:
LastExpressMetaEngine() : AdvancedMetaEngine(gameDescriptions, sizeof(ADGameDescription), lastExpressGames) {
_singleid = "lastexpress";
- _guioptions = Common::GUIO_NOSUBTITLES | Common::GUIO_NOSFX;
+ _guioptions = GUIO2(GUIO_NOSUBTITLES, GUIO_NOSFX);
}
const char *getName() const {
diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp
index 29bb31b248..c5c6f2a44d 100644
--- a/engines/lastexpress/entities/abbot.cpp
+++ b/engines/lastexpress/entities/abbot.cpp
@@ -31,9 +31,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -1112,7 +1114,7 @@ IMPLEMENT_FUNCTION(35, Abbot, function35)
case 2:
getData()->location = kLocationOutsideCompartment;
- getSound()->playSound(kEntityAbbot, "Abb3040", SoundManager::kFlagInvalid, 45);
+ getSound()->playSound(kEntityAbbot, "Abb3040", kFlagInvalid, 45);
getEntities()->updatePositionEnter(kEntityAbbot, kCarRestaurant, 57);
setCallback(3);
@@ -1409,7 +1411,7 @@ IMPLEMENT_FUNCTION(43, Abbot, function43)
setup_playSound("Abb4002");
break;
} else {
- if (!getEntities()->isDistanceBetweenEntities(kEntityAbbot, kEntityPlayer, 1000) || getSound()->isBuffered(kEntityBoutarel) || !params->param4)
+ if (!getEntities()->isDistanceBetweenEntities(kEntityAbbot, kEntityPlayer, 1000) || getSoundQueue()->isBuffered(kEntityBoutarel) || !params->param4)
params->param4 = (uint)getState()->time + 450;
if (params->param4 < getState()->time) {
@@ -1754,7 +1756,7 @@ IMPLEMENT_FUNCTION(49, Abbot, pickBomb)
break;
case kActionKnock:
- if (!getSound()->isBuffered("LIB012", true))
+ if (!getSoundQueue()->isBuffered("LIB012", true))
getSound()->playSound(kEntityPlayer, "LIB012");
break;
diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp
index d723a5607c..073ca3f175 100644
--- a/engines/lastexpress/entities/alexei.cpp
+++ b/engines/lastexpress/entities/alexei.cpp
@@ -29,9 +29,10 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp
index 715622aaab..cd79870559 100644
--- a/engines/lastexpress/entities/alouan.cpp
+++ b/engines/lastexpress/entities/alouan.cpp
@@ -26,9 +26,10 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp
index 0bedda41e8..b13aa21f6d 100644
--- a/engines/lastexpress/entities/anna.cpp
+++ b/engines/lastexpress/entities/anna.cpp
@@ -22,17 +22,20 @@
#include "lastexpress/entities/anna.h"
+#include "lastexpress/fight/fight.h"
+
#include "lastexpress/game/action.h"
#include "lastexpress/game/entities.h"
-#include "lastexpress/game/fight.h"
#include "lastexpress/game/inventory.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -311,7 +314,7 @@ IMPLEMENT_FUNCTION(12, Anna, function12)
params->param4 = 0;
params->param5 = 0;
} else {
- getSound()->removeFromQueue(kEntityAnna);
+ getSoundQueue()->removeFromQueue(kEntityAnna);
getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
@@ -322,7 +325,7 @@ IMPLEMENT_FUNCTION(12, Anna, function12)
break;
case kActionOpenDoor:
- getSound()->removeFromQueue(kEntityAnna);
+ getSoundQueue()->removeFromQueue(kEntityAnna);
setCallback(3);
setup_playSound("LIB013");
break;
@@ -338,8 +341,8 @@ IMPLEMENT_FUNCTION(12, Anna, function12)
getEntities()->drawSequenceLeft(kEntityAnna, "418C");
- if (getSound()->isBuffered(kEntityAnna))
- getSound()->processEntry(kEntityAnna);
+ if (getSoundQueue()->isBuffered(kEntityAnna))
+ getSoundQueue()->processEntry(kEntityAnna);
getSound()->playSound(kEntityAnna, "ANN2135A");
break;
@@ -378,7 +381,7 @@ IMPLEMENT_FUNCTION(12, Anna, function12)
break;
case 3:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
setCallback(4);
setup_playSound("MAX1120");
break;
@@ -502,7 +505,7 @@ IMPLEMENT_FUNCTION_IS(15, Anna, function15, TimeValue)
break;
case 1:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
setCallback(2);
setup_playSound("MAX1120");
break;
@@ -1455,7 +1458,7 @@ label_callback_1:
case 2:
case 3:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
setCallback(4);
setup_playSound("MAX1120");
break;
@@ -1520,8 +1523,8 @@ IMPLEMENT_FUNCTION(35, Anna, function35)
case kActionKnock:
case kActionOpenDoor:
- if (getSound()->isBuffered(kEntityAnna))
- getSound()->processEntry(kEntityAnna);
+ if (getSoundQueue()->isBuffered(kEntityAnna))
+ getSoundQueue()->processEntry(kEntityAnna);
if (savepoint.action == kActionKnock)
getSound()->playSound(kEntityPlayer, "LIB012");
@@ -1563,8 +1566,8 @@ IMPLEMENT_FUNCTION(35, Anna, function35)
break;
case kAction226031488:
- if (getSound()->isBuffered(kEntityAnna))
- getSound()->processEntry(kEntityAnna);
+ if (getSoundQueue()->isBuffered(kEntityAnna))
+ getSoundQueue()->processEntry(kEntityAnna);
getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
break;
@@ -1843,7 +1846,7 @@ IMPLEMENT_FUNCTION(41, Anna, function41)
case 1:
case 2:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
setCallback(3);
setup_playSound("MAX1120");
break;
@@ -2062,7 +2065,7 @@ IMPLEMENT_FUNCTION(47, Anna, function47)
break;
case 4:
- getSound()->playSound(kEntityAnna, getEvent(kEventAugustLunch) ? "Ann3136" : "Ann3136A", SoundManager::kFlagInvalid, 30);
+ getSound()->playSound(kEntityAnna, getEvent(kEventAugustLunch) ? "Ann3136" : "Ann3136A", kFlagInvalid, 30);
getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122358304);
setCallback(5);
@@ -2089,7 +2092,7 @@ IMPLEMENT_FUNCTION(48, Anna, function48)
break;
if (params->param3 != kTimeInvalid && getState()->time > kTime1969200) {
- UPDATE_PARAM_PROC_TIME(kTime1983600, (!getEntities()->isInRestaurant(kEntityPlayer) || getSound()->isBuffered(kEntityBoutarel)), params->param3, 150)
+ UPDATE_PARAM_PROC_TIME(kTime1983600, (!getEntities()->isInRestaurant(kEntityPlayer) || getSoundQueue()->isBuffered(kEntityBoutarel)), params->param3, 150)
setCallback(3);
setup_playSound("Aug3007A");
break;
@@ -2257,7 +2260,7 @@ IMPLEMENT_FUNCTION(51, Anna, function51)
break;
case kActionDefault:
- getSound()->playSound(kEntityAnna, "Aug3142", SoundManager::kFlagInvalid, 30);
+ getSound()->playSound(kEntityAnna, "Aug3142", kFlagInvalid, 30);
getEntities()->updatePositionEnter(kEntityAnna, kCarRestaurant, 57);
getEntities()->drawSequenceRight(kEntityAnna, "112A");
if (getEntities()->isInRestaurant(kEntityPlayer))
@@ -2480,7 +2483,7 @@ IMPLEMENT_FUNCTION(53, Anna, function53)
break;
case 1:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
setCallback(2);
setup_playSound("MAX1120");
break;
@@ -2619,7 +2622,7 @@ IMPLEMENT_FUNCTION(54, Anna, function54)
break;
case 1:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
setCallback(2);
setup_playSound("MAX1120");
break;
@@ -2788,7 +2791,7 @@ IMPLEMENT_FUNCTION(57, Anna, function57)
break;
case 4:
- if (getSound()->isBuffered(kEntityAugust)) {
+ if (getSoundQueue()->isBuffered(kEntityAugust)) {
setCallback(4);
setup_updateFromTime(75);
} else {
@@ -2816,7 +2819,7 @@ IMPLEMENT_FUNCTION(57, Anna, function57)
case kAction123712592:
getEntities()->drawSequenceLeft(kEntityAnna, "628Af");
- if (getSound()->isBuffered(kEntityAugust)) {
+ if (getSoundQueue()->isBuffered(kEntityAugust)) {
setCallback(4);
setup_updateFromTime(75);
} else {
@@ -3157,8 +3160,8 @@ IMPLEMENT_FUNCTION(63, Anna, function63)
// Anna will get killed...
case kAction272177921:
- if (getSound()->isBuffered("MUS012"))
- getSound()->processEntry("MUS012");
+ if (getSoundQueue()->isBuffered("MUS012"))
+ getSoundQueue()->processEntry("MUS012");
setCallback(1);
setup_savegame(kSavegameTypeEvent, kEventAnnaKilled);
@@ -3840,7 +3843,7 @@ IMPLEMENT_FUNCTION(78, Anna, function78)
case 2:
getAction()->playAnimation(kEventKronosHostageAnna);
getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
- getSound()->playSound(kEntityAnna, "Mus024", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityAnna, "Mus024", kFlagDefault);
setup_function79();
break;
}
@@ -3910,11 +3913,11 @@ IMPLEMENT_FUNCTION(80, Anna, function80)
case kActionNone:
UPDATE_PARAM(params->param1, getState()->timeTicks, 450);
- getSound()->playSound(kEntityPlayer, "Kro5001", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityPlayer, "Kro5001", kFlagDefault);
break;
case kActionEndSound:
- getSound()->playSound(kEntityPlayer, "Kro5002", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityPlayer, "Kro5002", kFlagDefault);
getState()->time = kTime4923000;
setCallback(1);
@@ -3934,12 +3937,12 @@ IMPLEMENT_FUNCTION(80, Anna, function80)
break;
case 1:
- if (getSound()->isBuffered(kEntityAnna))
- getSound()->processEntry(kEntityAnna);
+ if (getSoundQueue()->isBuffered(kEntityAnna))
+ getSoundQueue()->processEntry(kEntityAnna);
getAction()->playAnimation(kEventKronosBringFirebird);
getScenes()->loadSceneFromItem(kItemFirebird);
- getSound()->playSound(kEntityAnna, "Mus025", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityAnna, "Mus025", kFlagDefault);
break;
case 2:
@@ -3950,8 +3953,8 @@ IMPLEMENT_FUNCTION(80, Anna, function80)
case 3:
getProgress().isEggOpen = true;
- if (getSound()->isBuffered(kEntityAnna))
- getSound()->processEntry(kEntityAnna);
+ if (getSoundQueue()->isBuffered(kEntityAnna))
+ getSoundQueue()->processEntry(kEntityAnna);
getAction()->playAnimation(kEventKronosOpenFirebird);
getScenes()->loadSceneFromPosition(kCarRestaurant, 3);
diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp
index f7e7390b90..eb3b09af59 100644
--- a/engines/lastexpress/entities/august.cpp
+++ b/engines/lastexpress/entities/august.cpp
@@ -33,9 +33,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -199,7 +201,7 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_S(13, August, playSound16)
- Entity::playSound(savepoint, false, SoundManager::kFlagDefault);
+ Entity::playSound(savepoint, false, kFlagDefault);
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
@@ -338,7 +340,7 @@ IMPLEMENT_FUNCTION_II(19, August, function19, bool, bool)
case kAction1:
getData()->inventoryItem = kItemNone;
getSound()->playSound(kEntityPlayer, "CAT1002");
- getSound()->playSound(kEntityAugust, "AUG3101", SoundManager::kFlagInvalid, 15);
+ getSound()->playSound(kEntityAugust, "AUG3101", kFlagInvalid, 15);
break;
case kActionDefault:
@@ -1427,7 +1429,7 @@ IMPLEMENT_FUNCTION(29, August, function29)
if (getState()->time < kTime1134000) {
if (!getEntities()->isInRestaurant(kEntityPlayer)
- || getSound()->isBuffered("MRB1076") || getSound()->isBuffered("MRB1078") || getSound()->isBuffered("MRB1078A"))
+ || getSoundQueue()->isBuffered("MRB1076") || getSoundQueue()->isBuffered("MRB1078") || getSoundQueue()->isBuffered("MRB1078A"))
params->param3 = (uint)getState()->time + 225;
if (params->param3 > getState()->time)
@@ -1762,7 +1764,7 @@ IMPLEMENT_FUNCTION(34, August, function34)
break;
case kActionNone:
- if (!getSound()->isBuffered(kEntityAugust) && getProgress().field_18 != 4)
+ if (!getSoundQueue()->isBuffered(kEntityAugust) && getProgress().field_18 != 4)
getSound()->playSound(kEntityAugust, "AUG1057"); // August snoring
break;
@@ -2179,11 +2181,11 @@ IMPLEMENT_FUNCTION_III(42, August, function42, CarIndex, EntityPosition, bool)
getData()->inventoryItem = kItemNone;
getSound()->playSound(kEntityPlayer, "CAT1002");
- getSound()->playSound(kEntityAugust, getEvent(kEventAugustBringBriefcase) ? "AUG3103" : "AUG3100", SoundManager::kFlagInvalid, 15);
+ getSound()->playSound(kEntityAugust, getEvent(kEventAugustBringBriefcase) ? "AUG3103" : "AUG3100", kFlagInvalid, 15);
break;
case kActionExcuseMe:
- if (!getSound()->isBuffered(kEntityAugust))
+ if (!getSoundQueue()->isBuffered(kEntityAugust))
getSound()->excuseMe(kEntityAugust);
break;
@@ -2385,7 +2387,7 @@ IMPLEMENT_FUNCTION(45, August, function45)
case kAction1:
getData()->inventoryItem = kItemNone;
getSound()->playSound(kEntityPlayer, "CAT1002");
- getSound()->playSound(kEntityAugust, "AUG3102", SoundManager::kFlagInvalid, 15);
+ getSound()->playSound(kEntityAugust, "AUG3102", kFlagInvalid, 15);
break;
case kActionDefault:
@@ -3343,7 +3345,7 @@ IMPLEMENT_FUNCTION(65, August, function65)
getObjects()->update(kObjectCompartment3, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
- if (!getSound()->isBuffered(kEntityAugust))
+ if (!getSoundQueue()->isBuffered(kEntityAugust))
getSound()->playSound(kEntityAugust, "AUG1057"); // August snoring
break;
}
@@ -3504,9 +3506,9 @@ IMPLEMENT_FUNCTION(69, August, unhookCars)
break;
case kActionDefault:
- getSound()->processEntries();
- if (getSound()->isBuffered("ARRIVE"))
- getSound()->removeFromQueue("ARRIVE");
+ getSoundQueue()->processEntries();
+ if (getSoundQueue()->isBuffered("ARRIVE"))
+ getSoundQueue()->removeFromQueue("ARRIVE");
setCallback(1);
setup_savegame(kSavegameTypeEvent, kEventAugustUnhookCarsBetrayal);
@@ -3516,7 +3518,7 @@ IMPLEMENT_FUNCTION(69, August, unhookCars)
if (getCallback() == 1) {
getAction()->playAnimation(getProgress().field_C ? kEventAugustUnhookCarsBetrayal : kEventAugustUnhookCars);
getEntities()->clearSequences(kEntityAugust);
- getSound()->resetState();
+ getSoundQueue()->resetState();
getSound()->playSound(kEntityPlayer, "MUS050");
getScenes()->loadSceneFromPosition(kCarRestaurant, 85, 1);
getSavePoints()->pushAll(kEntityAugust, kActionProceedChapter5);
diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp
index 0b2040897c..315b12a69e 100644
--- a/engines/lastexpress/entities/boutarel.cpp
+++ b/engines/lastexpress/entities/boutarel.cpp
@@ -29,9 +29,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/scenes.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -214,7 +216,7 @@ IMPLEMENT_FUNCTION_I(11, Boutarel, function11, bool)
break;
case kChapter1:
- getSound()->playSound(kEntityBoutarel, "MRB1075", SoundManager::kFlagInvalid, 60);
+ getSound()->playSound(kEntityBoutarel, "MRB1075", kFlagInvalid, 60);
break;
case kChapter3:
@@ -941,7 +943,7 @@ IMPLEMENT_FUNCTION(29, Boutarel, function29)
if (getEntities()->isInRestaurant(kEntityAnna)
&& getEntities()->isInRestaurant(kEntityAugust)
- && !getSound()->isBuffered(kEntityBoutarel)
+ && !getSoundQueue()->isBuffered(kEntityBoutarel)
&& params->param3 != kTimeInvalid) {
if (getState()->time <= kTime1998000)
diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp
index 1252a62d8d..96e08ba808 100644
--- a/engines/lastexpress/entities/chapters.cpp
+++ b/engines/lastexpress/entities/chapters.cpp
@@ -57,13 +57,16 @@
#include "lastexpress/game/entities.h"
#include "lastexpress/game/inventory.h"
#include "lastexpress/game/logic.h"
-#include "lastexpress/game/menu.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/menu/menu.h"
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/sound/queue.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
#include "lastexpress/resource.h"
@@ -159,20 +162,20 @@ IMPLEMENT_FUNCTION(6, Chapters, chapter1End)
break;
case kActionEndSound:
- getSound()->playSound(kEntityChapters, "MUS0009", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityChapters, "MUS0009", kFlagDefault);
break;
case kActionKnock:
- if (!getSound()->isBuffered("LIB012", true))
+ if (!getSoundQueue()->isBuffered("LIB012", true))
getSound()->playSound(kEntityPlayer, "LIB012");
break;
case kActionOpenDoor:
if (params->param1) {
getEntities()->clearSequences(kEntityChapters);
- getSound()->processEntry(kEntityChapters);
+ getSoundQueue()->processEntry(kEntityChapters);
getSound()->playSound(kEntityPlayer, "LIB014");
- getSound()->resetState();
+ getSoundQueue()->resetState();
ENTITY_PARAM(0, 4) = 7;
@@ -191,10 +194,10 @@ IMPLEMENT_FUNCTION(6, Chapters, chapter1End)
CALLBACK_ACTION();
} else {
getSound()->playSound(kEntityPlayer, "LIB014");
- getSound()->playSound(kEntityPlayer, "LIB015", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityPlayer, "LIB015", kFlagDefault, 15);
- if (!getSound()->isBuffered(kEntityChapters))
- getSound()->playSound(kEntityChapters, "MUS009", SoundManager::kFlagDefault);
+ if (!getSoundQueue()->isBuffered(kEntityChapters))
+ getSound()->playSound(kEntityChapters, "MUS009", kFlagDefault);
getScenes()->loadSceneFromPosition(kCarLocomotive, 38);
@@ -240,42 +243,42 @@ IMPLEMENT_FUNCTION(6, Chapters, chapter1End)
RESET_ENTITY_STATE(kEntityHadija, Alouan, setup_function12);
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
ENTITY_PARAM(0, 2) = 0;
ENTITY_PARAM(0, 3) = 0;
}
- getSound()->processEntries();
+ getSoundQueue()->processEntries();
- if (getSound()->isBuffered("CON1505"))
- getSound()->processEntry("CON1505");
+ if (getSoundQueue()->isBuffered("CON1505"))
+ getSoundQueue()->processEntry("CON1505");
- if (getSound()->isBuffered("AUG1057"))
- getSound()->processEntry("AUG1057");
+ if (getSoundQueue()->isBuffered("AUG1057"))
+ getSoundQueue()->processEntry("AUG1057");
- if (getSound()->isBuffered("ZFX1005"))
- getSound()->processEntry("ZFX1005");
+ if (getSoundQueue()->isBuffered("ZFX1005"))
+ getSoundQueue()->processEntry("ZFX1005");
- if (getSound()->isBuffered("ZFX1006"))
- getSound()->processEntry("ZFX1006");
+ if (getSoundQueue()->isBuffered("ZFX1006"))
+ getSoundQueue()->processEntry("ZFX1006");
- if (getSound()->isBuffered("ZFX1007"))
- getSound()->processEntry("ZFX1007");
+ if (getSoundQueue()->isBuffered("ZFX1007"))
+ getSoundQueue()->processEntry("ZFX1007");
- if (getSound()->isBuffered("ZFX1007A"))
- getSound()->processEntry("ZFX1007A");
+ if (getSoundQueue()->isBuffered("ZFX1007A"))
+ getSoundQueue()->processEntry("ZFX1007A");
- if (getSound()->isBuffered("ZFX1007B"))
- getSound()->processEntry("ZFX1007B");
+ if (getSoundQueue()->isBuffered("ZFX1007B"))
+ getSoundQueue()->processEntry("ZFX1007B");
- getSound()->playSound(kEntityPlayer, "MUS008", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityPlayer, "MUS008", kFlagDefault);
getInventory()->unselectItem();
// FIXME add event pump ?
- while (getSound()->isBuffered("MUS008"))
- getSound()->updateQueue();
+ while (getSoundQueue()->isBuffered("MUS008"))
+ getSoundQueue()->updateQueue();
getProgress().field_84 = true;
@@ -300,7 +303,7 @@ IMPLEMENT_FUNCTION(6, Chapters, chapter1End)
if (params->param2 >= 3) {
- if (!getSound()->isBuffered("LIB031", true))
+ if (!getSoundQueue()->isBuffered("LIB031", true))
getSound()->playSound(kEntityPlayer, "LIB031");
if (params->param2 == 3) {
@@ -318,7 +321,7 @@ IMPLEMENT_FUNCTION(7, Chapters, chapter1Init)
return;
getProgress().chapter = kChapter1;
- getSound()->resetState();
+ getSoundQueue()->resetState();
getState()->time = kTimeChapter1;
getState()->timeDelta = 0;
@@ -384,7 +387,7 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
#define PLAY_STEAM() { \
- getSound()->resetState(); \
+ getSoundQueue()->resetState(); \
getSound()->playSteam((CityIndex)ENTITY_PARAM(0, 4)); \
ENTITY_PARAM(0, 2) = 0; \
}
@@ -562,7 +565,7 @@ label_chapter1_next:
}
if (ENTITY_PARAM(0, 3)) {
- getSound()->resetState();
+ getSoundQueue()->resetState();
ENTITY_PARAM(0, 3) = 0;
if (params->param4) {
@@ -693,16 +696,16 @@ IMPLEMENT_FUNCTION(9, Chapters, chapter1Next)
if (savepoint.action == kActionDefault) {
// Reset sound cache
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
ENTITY_PARAM(0, 2) = 0;
ENTITY_PARAM(0, 3) = 0;
}
- getSound()->playSound(kEntityPlayer, "MUS008", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityPlayer, "MUS008", kFlagDefault);
getInventory()->unselectItem();
- while (getSound()->isBuffered("MUS008"))
- getSound()->updateQueue();
+ while (getSoundQueue()->isBuffered("MUS008"))
+ getSoundQueue()->updateQueue();
setup_chapter2();
}
@@ -789,7 +792,7 @@ IMPLEMENT_FUNCTION(11, Chapters, chapter2Init)
// Reset sound cache
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
ENTITY_PARAM(0, 2) = 0;
ENTITY_PARAM(0, 3) = 0;
}
@@ -873,7 +876,7 @@ IMPLEMENT_FUNCTION(14, Chapters, chapter3Init)
getObjects()->update(kObject107, kEntityPlayer, kObjectLocation3, kCursorKeepValue, kCursorKeepValue);
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
ENTITY_PARAM(0, 2) = 0;
ENTITY_PARAM(0, 3) = 0;
}
@@ -914,11 +917,11 @@ IMPLEMENT_FUNCTION(15, Chapters, chapter3Handler)
break;
case 0:
- getSound()->playSound(kEntityPlayer, "ZFX1008", (SoundManager::FlagType)(rnd(15) + 2));
+ getSound()->playSound(kEntityPlayer, "ZFX1008", (SoundFlag)(rnd(15) + 2));
break;
case 1:
- getSound()->playSound(kEntityPlayer, "ZFX1009", (SoundManager::FlagType)(rnd(15) + 2));
+ getSound()->playSound(kEntityPlayer, "ZFX1009", (SoundFlag)(rnd(15) + 2));
break;
}
@@ -986,7 +989,7 @@ label_callback_8:
}
}
- getSound()->resetState();
+ getSoundQueue()->resetState();
getSound()->playSteam((CityIndex)ENTITY_PARAM(0, 4));
ENTITY_PARAM(0, 2) = 0;
@@ -997,7 +1000,7 @@ label_callback_8:
}
if (ENTITY_PARAM(0, 3)) {
- getSound()->resetState();
+ getSoundQueue()->resetState();
ENTITY_PARAM(0, 3) = 0;
}
break;
@@ -1149,8 +1152,8 @@ IMPLEMENT_FUNCTION(18, Chapters, chapter4Init)
if (savepoint.action != kActionDefault)
return;
- getSound()->processEntries();
- getSound()->resetState();
+ getSoundQueue()->processEntries();
+ getSoundQueue()->resetState();
getProgress().isTrainRunning = true;
@@ -1176,7 +1179,7 @@ IMPLEMENT_FUNCTION(18, Chapters, chapter4Init)
getObjects()->update(kObject107, kEntityPlayer, kObjectLocation3, kCursorKeepValue, kCursorKeepValue);
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
ENTITY_PARAM(0, 2) = 0;
ENTITY_PARAM(0, 3) = 0;
}
@@ -1213,11 +1216,11 @@ IMPLEMENT_FUNCTION(19, Chapters, chapter4Handler)
break;
case 0:
- getSound()->playSound(kEntityPlayer, "ZFX1008", (SoundManager::FlagType)(rnd(15) + 2));
+ getSound()->playSound(kEntityPlayer, "ZFX1008", (SoundFlag)(rnd(15) + 2));
break;
case 1:
- getSound()->playSound(kEntityPlayer, "ZFX1009", (SoundManager::FlagType)(rnd(15) + 2));
+ getSound()->playSound(kEntityPlayer, "ZFX1009", (SoundFlag)(rnd(15) + 2));
break;
}
@@ -1318,7 +1321,7 @@ label_callback_4:
}
if (ENTITY_PARAM(0, 3)) {
- getSound()->resetState();
+ getSoundQueue()->resetState();
ENTITY_PARAM(0, 3) = 0;
} else if (!params->param2 && !params->param3) {
getSound()->playSound(kEntityChapters, "ZFX1001");
@@ -1355,17 +1358,17 @@ label_callback_4:
goto label_callback_4;
case 5:
- if (getSound()->isBuffered(kEntityChapters))
- getSound()->removeFromQueue(kEntityChapters);
+ if (getSoundQueue()->isBuffered(kEntityChapters))
+ getSoundQueue()->removeFromQueue(kEntityChapters);
getAction()->playAnimation(kEventTrainExplosionBridge);
getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneNone, true);
break;
case 6:
- getSound()->processEntries();
+ getSoundQueue()->processEntries();
getAction()->playAnimation(kEventTylerCastleDream);
- getSound()->resetState();
+ getSoundQueue()->resetState();
getProgress().field_18 = 1;
@@ -1417,7 +1420,7 @@ label_callback_4:
case 11:
getScenes()->loadSceneFromPosition(kCarRedSleeping, 74);
- getSound()->playSound(kEntityTrain, "ZFX4001", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityTrain, "ZFX4001", kFlagDefault);
getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneNone, true);
break;
}
@@ -1464,17 +1467,17 @@ label_callback_4:
params->param1 = 1;
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
ENTITY_PARAM(0, 2) = 0;
ENTITY_PARAM(0, 3) = 0;
}
- getSound()->playSound(kEntityPlayer, "MUS008", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityPlayer, "MUS008", kFlagDefault);
getInventory()->unselectItem();
- while (getSound()->isBuffered("MUS008"))
- getSound()->updateQueue();
+ while (getSoundQueue()->isBuffered("MUS008"))
+ getSoundQueue()->updateQueue();
if (getInventory()->hasItem(kItemBomb)) {
RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_function47);
@@ -1521,8 +1524,8 @@ label_callback_4:
case kAction191001984:
getState()->time = kTime2520000;
- if (getSound()->isBuffered(kEntityChapters))
- getSound()->removeFromQueue(kEntityChapters);
+ if (getSoundQueue()->isBuffered(kEntityChapters))
+ getSoundQueue()->removeFromQueue(kEntityChapters);
getEntities()->clearSequences(kEntityChapters);
getInventory()->removeItem(kItemTelegram);
@@ -1534,10 +1537,10 @@ label_callback_4:
break;
case kAction201959744:
- if (getSound()->isBuffered(kEntityChapters))
- getSound()->removeFromQueue(kEntityChapters);
+ if (getSoundQueue()->isBuffered(kEntityChapters))
+ getSoundQueue()->removeFromQueue(kEntityChapters);
- getSound()->playSound(kEntityTrain, "ZFX4001", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityTrain, "ZFX4001", kFlagDefault);
getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, true);
break;
@@ -1643,7 +1646,7 @@ IMPLEMENT_FUNCTION(21, Chapters, chapter5Init)
getObjects()->updateLocation2(kObjectRestaurantCar, kObjectLocation2);
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
ENTITY_PARAM(0, 2) = 0;
ENTITY_PARAM(0, 3) = 0;
}
@@ -1673,8 +1676,8 @@ IMPLEMENT_FUNCTION(22, Chapters, chapter5Handler)
params->param2 = 1;
if (!getProgress().isNightTime) {
- getSound()->playSound(kEntityChapters, "ARRIVE", SoundManager::kFlag8);
- getSound()->processEntries();
+ getSound()->playSound(kEntityChapters, "ARRIVE", kFlag8);
+ getSoundQueue()->processEntries();
}
}
@@ -1682,8 +1685,8 @@ IMPLEMENT_FUNCTION(22, Chapters, chapter5Handler)
params->param3 = 1;
if (!getEvent(kEventLocomotiveMilosDay) && !getEvent(kEventLocomotiveMilosNight)) {
- getSound()->playSound(kEntityChapters, "ARRIVE", SoundManager::kFlag8);
- getSound()->processEntries();
+ getSound()->playSound(kEntityChapters, "ARRIVE", kFlag8);
+ getSoundQueue()->processEntries();
}
}
break;
@@ -1712,8 +1715,8 @@ IMPLEMENT_FUNCTION(22, Chapters, chapter5Handler)
getProgress().isNightTime = true;
getState()->time = kTime2916000;
- if (getSound()->isBuffered(kEntityChapters))
- getSound()->removeFromQueue(kEntityChapters);
+ if (getSoundQueue()->isBuffered(kEntityChapters))
+ getSoundQueue()->removeFromQueue(kEntityChapters);
break;
}
IMPLEMENT_FUNCTION_END
@@ -1729,7 +1732,7 @@ void Chapters::enterExitStation(const SavePoint &savepoint, bool isEnteringStati
return;
}
- getSound()->removeFromQueue(kEntityChapters);
+ getSoundQueue()->removeFromQueue(kEntityChapters);
if (!ENTITY_PARAM(0, 2)) {
if (ENTITY_PARAM(0, 3))
@@ -1796,8 +1799,8 @@ void Chapters::enterExitStation(const SavePoint &savepoint, bool isEnteringStati
void Chapters::enterExitHelper(bool isEnteringStation) {
EXPOSE_PARAMS(EntityData::EntityParametersSIIS);
- getSound()->playSound(kEntityChapters, isEnteringStation ? "ARRIVE" : "DEPART", SoundManager::kFlag8);
- getSound()->processEntries();
+ getSound()->playSound(kEntityChapters, isEnteringStation ? "ARRIVE" : "DEPART", kFlag8);
+ getSoundQueue()->processEntries();
getObjects()->update(kObjectHandleOutsideLeft, kEntityPlayer, kObjectLocation1, kCursorNormal, isEnteringStation ? kCursorNormal : kCursorHand);
getObjects()->update(kObjectHandleOutsideRight, kEntityPlayer, kObjectLocation1, kCursorNormal, isEnteringStation ? kCursorNormal : kCursorHand);
diff --git a/engines/lastexpress/entities/cooks.cpp b/engines/lastexpress/entities/cooks.cpp
index 336f911800..42e888cc7c 100644
--- a/engines/lastexpress/entities/cooks.cpp
+++ b/engines/lastexpress/entities/cooks.cpp
@@ -26,9 +26,11 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -101,7 +103,7 @@ IMPLEMENT_FUNCTION(3, Cooks, function3)
if (getEntities()->isPlayerPosition(kCarRestaurant, 46)) {
getEntities()->drawSequenceLeft(kEntityCooks, "308D");
- if (!getSound()->isBuffered(kEntityCooks)) {
+ if (!getSoundQueue()->isBuffered(kEntityCooks)) {
if (params->param1) {
if (!getEntities()->hasValidFrame(kEntityCooks)) {
getSound()->playSound(kEntityCooks, "LIB015");
@@ -187,7 +189,7 @@ IMPLEMENT_FUNCTION(4, Cooks, function4)
if (getEntities()->isPlayerPosition(kCarRestaurant, 80)) {
getEntities()->drawSequenceLeft(kEntityCooks, "308D");
- if (!getSound()->isBuffered(kEntityCooks)) {
+ if (!getSoundQueue()->isBuffered(kEntityCooks)) {
if (params->param1) {
if (!getEntities()->hasValidFrame(kEntityCooks)) {
getSound()->playSound(kEntityCooks, "LIB015");
diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp
index e74471ebca..c3e7e37b88 100644
--- a/engines/lastexpress/entities/coudert.cpp
+++ b/engines/lastexpress/entities/coudert.cpp
@@ -29,9 +29,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -258,7 +260,7 @@ IMPLEMENT_FUNCTION_NOSETUP(7, Coudert, playSound16)
break;
case kActionDefault:
- getSound()->playSound(kEntityCoudert, (char *)&params->seq1, SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityCoudert, (char *)&params->seq1, kFlagDefault);
break;
case kActionCallback:
@@ -314,7 +316,7 @@ IMPLEMENT_FUNCTION_II(9, Coudert, updateEntity, CarIndex, EntityPosition)
case kActionExcuseMeCath:
if (getData()->clothes == kClothes1)
getSound()->playSound(kEntityPlayer, "ZFX1003", getSound()->getSoundFlag(kEntityCoudert));
- else if (!getSound()->isBuffered(kEntityCoudert))
+ else if (!getSoundQueue()->isBuffered(kEntityCoudert))
getSound()->playSound(kEntityPlayer, "JAC1112", getSound()->getSoundFlag(kEntityCoudert));
break;
@@ -409,7 +411,7 @@ IMPLEMENT_FUNCTION_I(12, Coudert, excuseMe, EntityIndex)
if (savepoint.action != kActionDefault)
return;
- if (getSound()->isBuffered(kEntityCoudert)) {
+ if (getSoundQueue()->isBuffered(kEntityCoudert)) {
CALLBACK_ACTION();
return;
}
@@ -823,7 +825,7 @@ IMPLEMENT_FUNCTION(18, Coudert, function18)
getScenes()->loadSceneFromItemPosition(kItem5);
if (getEntities()->isPlayerPosition(kCarRedSleeping, 68)) {
- if (!getSound()->isBuffered(kEntityCoudert))
+ if (!getSoundQueue()->isBuffered(kEntityCoudert))
getSound()->playSound(kEntityCoudert, "JAC1111");
getScenes()->loadSceneFromPosition(kCarRedSleeping, 25);
@@ -1642,7 +1644,7 @@ IMPLEMENT_FUNCTION_I(31, Coudert, function31, uint32)
break;
case 1:
- if (getSound()->isBuffered(kEntityCoudert)) {
+ if (getSoundQueue()->isBuffered(kEntityCoudert)) {
getEntities()->drawSequenceLeft(kEntityCoudert, "627K");
} else {
setCallback(2);
@@ -1929,7 +1931,7 @@ IMPLEMENT_FUNCTION_I(35, Coudert, function35, bool)
break;
case 1:
- if (!getSound()->isBuffered(kEntityCoudert))
+ if (!getSoundQueue()->isBuffered(kEntityCoudert))
getSound()->playSound(kEntityCoudert, "Ann3124");
if (params->param1)
@@ -2008,8 +2010,8 @@ IMPLEMENT_FUNCTION(37, Coudert, function37)
break;
case kActionDefault:
- if (getSound()->isBuffered(kEntityCoudert))
- getSound()->processEntry(kEntityCoudert);
+ if (getSoundQueue()->isBuffered(kEntityCoudert))
+ getSoundQueue()->processEntry(kEntityCoudert);
if (ENTITY_PARAM(0, 7)) {
getData()->entityPosition = kPosition_8200;
@@ -2268,7 +2270,7 @@ label_callback_8:
}
label_callback_9:
- if (ENTITY_PARAM(0, 1) && !getSound()->isBuffered(kEntityCoudert))
+ if (ENTITY_PARAM(0, 1) && !getSoundQueue()->isBuffered(kEntityCoudert))
getSound()->playSound(kEntityCoudert, rnd(2) ? "JAC1065" : "JAC1065A");
if (getState()->time > kTime1107000 && !ENTITY_PARAM(0, 1) && !getEvent(kEventVassiliSeizure)) {
@@ -3019,7 +3021,7 @@ IMPLEMENT_FUNCTION(46, Coudert, function46)
// Fallback to next case
case 7:
- if (getSound()->isBuffered(kEntityCoudert)) {
+ if (getSoundQueue()->isBuffered(kEntityCoudert)) {
setCallback(7);
setup_updateFromTime(75);
} else {
@@ -3088,7 +3090,7 @@ IMPLEMENT_FUNCTION_I(47, Coudert, function47, bool)
// Fallback to next case
case 4:
- if (getSound()->isBuffered(kEntityCoudert)) {
+ if (getSoundQueue()->isBuffered(kEntityCoudert)) {
setCallback(4);
setup_updateFromTime(225);
} else {
diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp
index 22750989fb..e136ca4776 100644
--- a/engines/lastexpress/entities/entity.cpp
+++ b/engines/lastexpress/entities/entity.cpp
@@ -33,9 +33,10 @@
#include "lastexpress/game/state.h"
#include "lastexpress/game/savegame.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -104,24 +105,24 @@ void EntityData::EntityCallData::saveLoadWithSerializer(Common::Serializer &s) {
//////////////////////////////////////////////////////////////////////////
EntityData::EntityParameters *EntityData::getParameters(uint callback, byte index) const {
if (callback >= 9)
- error("EntityData::getParameters: invalid callback value (was: %d, max: 9)", callback);
+ error("[EntityData::getParameters] Invalid callback value (was: %d, max: 9)", callback);
if (index >= 4)
- error("EntityData::getParameters: invalid index value (was: %d, max: 4)", index);
+ error("[EntityData::getParameters] Invalid index value (was: %d, max: 4)", index);
return _parameters[callback].parameters[index];
}
int EntityData::getCallback(uint callback) const {
if (callback >= 16)
- error("EntityData::getParameters: invalid callback value (was: %d, max: 16)", callback);
+ error("[EntityData::getCallback] Invalid callback value (was: %d, max: 16)", callback);
return _data.callbacks[callback];
}
void EntityData::setCallback(uint callback, byte index) {
if (callback >= 16)
- error("EntityData::getParameters: invalid callback value (was: %d, max: 16)", callback);
+ error("[EntityData::setCallback] Invalid callback value (was: %d, max: 16)", callback);
_data.callbacks[callback] = index;
}
@@ -136,7 +137,7 @@ void EntityData::updateParameters(uint32 index) const {
else if (index < 32)
getParameters(8, 3)->update(index - 24);
else
- error("EntityData::updateParameters: invalid param index to update (was:%d, max:32)!", index);
+ error("[EntityData::updateParameters] Invalid param index to update (was:%d, max:32)", index);
}
void EntityData::saveLoadWithSerializer(Common::Serializer &s) {
@@ -255,7 +256,7 @@ void Entity::savegame(const SavePoint &savepoint) {
}
}
-void Entity::playSound(const SavePoint &savepoint, bool resetItem, SoundManager::FlagType flag) {
+void Entity::playSound(const SavePoint &savepoint, bool resetItem, SoundFlag flag) {
EXPOSE_PARAMS(EntityData::EntityParametersSIIS)
switch (savepoint.action) {
diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h
index 01cf17f791..039f461c7b 100644
--- a/engines/lastexpress/entities/entity.h
+++ b/engines/lastexpress/entities/entity.h
@@ -25,7 +25,7 @@
#include "lastexpress/shared.h"
-#include "lastexpress/game/sound.h"
+#include "lastexpress/sound/sound.h"
#include "lastexpress/helpers.h"
@@ -85,7 +85,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersIIII::update: invalid index (was: %d)", index);
+ error("[EntityParametersIIII::update] Invalid index (was: %d)", index);
case 0: param1 = 1; break;
case 1: param2 = 1; break;
@@ -134,7 +134,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersSIII::update: invalid index (was: %d)", index);
+ error("[EntityParametersSIII::update] Invalid index (was: %d)", index);
case 3: param4 = 1; break;
case 4: param5 = 1; break;
@@ -174,7 +174,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersSIIS::update: invalid index (was: %d)", index);
+ error("[EntityParametersSIIS::update] Invalid index (was: %d)", index);
case 3: param4 = 1; break;
case 4: param5 = 1; break;
@@ -209,7 +209,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersISSI::update: invalid index (was: %d)", index);
+ error("[EntityParametersISSI::update] Invalid index (was: %d)", index);
case 0: param1 = 1; break;
case 7: param8 = 1; break;
@@ -248,7 +248,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersISII::update: invalid index (was: %d)", index);
+ error("[EntityParametersISII::update] Invalid index (was: %d)", index);
case 0: param1 = 1; break;
case 4: param5 = 1; break;
@@ -288,7 +288,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersSSII::update: invalid index (was: %d)", index);
+ error("[EntityParametersSSII::update] Invalid index (was: %d)", index);
case 6: param7 = 1; break;
case 7: param8 = 1; break;
@@ -319,7 +319,7 @@ public:
}
void update(uint32) {
- error("EntityParametersSSS::update: cannot update this type of parameters");
+ error("[EntityParametersSSS::update] Cannot update this type of parameters");
}
void saveLoadWithSerializer(Common::Serializer &s) {
@@ -349,7 +349,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersIISS::update: invalid index (was: %d)", index);
+ error("[EntityParametersIISS::update] Invalid index (was: %d)", index);
case 0: param1 = 1; break;
case 1: param2 = 1; break;
@@ -388,7 +388,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersIISI::update: invalid index (was: %d)", index);
+ error("[EntityParametersIISI::update] Invalid index (was: %d)", index);
case 0: param1 = 1; break;
case 1: param2 = 1; break;
@@ -432,7 +432,7 @@ public:
void update(uint32 index) {
switch (index) {
default:
- error("EntityParametersIIIS::update: invalid index (was: %d)", index);
+ error("[EntityParametersIIIS::update] Invalid index (was: %d)", index);
case 0: param1 = 1; break;
case 1: param2 = 1; break;
@@ -686,7 +686,7 @@ protected:
* @param resetItem true to reset item.
* @param flag sound flag
*/
- void playSound(const SavePoint &savepoint, bool resetItem = false, SoundManager::FlagType flag = SoundManager::kFlagInvalid);
+ void playSound(const SavePoint &savepoint, bool resetItem = false, SoundFlag flag = kFlagInvalid);
/**
* Draws the entity
diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h
index 43d7f702c9..bf75e022de 100644
--- a/engines/lastexpress/entities/entity_intern.h
+++ b/engines/lastexpress/entities/entity_intern.h
@@ -96,7 +96,7 @@ void class::setup_##name() { \
#define EXPOSE_PARAMS(type) \
type *params = (type*)_data->getCurrentParameters(); \
if (!params) \
- error("Trying to call an entity function with invalid parameters!"); \
+ error("[EXPOSE_PARAMS] Trying to call an entity function with invalid parameters"); \
// function signature without setup (we keep the index for consistency but never use it)
@@ -413,7 +413,7 @@ void class::setup_##name() { \
//////////////////////////////////////////////////////////////////////////
#define CALLBACK_ACTION() { \
if (getData()->currentCall == 0) \
- error("CALLBACK_ACTION: currentCall is already 0, cannot proceed!"); \
+ error("[CALLBACK_ACTION] currentCall is already 0, cannot proceed"); \
getData()->currentCall--; \
getSavePoints()->setCallback(_entityIndex, _callbacks[_data->getCurrentCallback()]); \
getSavePoints()->call(_entityIndex, _entityIndex, kActionCallback); \
diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp
index 86b6820499..2b170d93a3 100644
--- a/engines/lastexpress/entities/francois.cpp
+++ b/engines/lastexpress/entities/francois.cpp
@@ -30,6 +30,8 @@
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -219,7 +221,7 @@ IMPLEMENT_FUNCTION(9, Francois, function9)
case 1:
getObjects()->update(kObjectCompartmentD, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
- break;
+ // Fallback to next case
case 2:
getData()->location = kLocationOutsideCompartment;
@@ -255,7 +257,7 @@ IMPLEMENT_FUNCTION(10, Francois, function10)
case 1:
getObjects()->update(kObjectCompartmentD, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
getSavePoints()->push(kEntityFrancois, kEntityMmeBoutarel, kAction102484312);
- break;
+ // Fallback to next case
case 2:
getData()->location = kLocationInsideCompartment;
@@ -275,7 +277,7 @@ IMPLEMENT_FUNCTION_I(11, Francois, function11, TimeValue)
break;
case kActionNone:
- if (!getSound()->isBuffered(kEntityFrancois)) {
+ if (!getSoundQueue()->isBuffered(kEntityFrancois)) {
UPDATE_PARAM_PROC(CURRENT_PARAM(1, 1), getState()->timeTicks, params->param6)
switch (rnd(7)) {
@@ -370,8 +372,8 @@ label_callback:
getData()->field_4A3 = 30;
getData()->inventoryItem = kItemNone;
- if (getSound()->isBuffered(kEntityFrancois))
- getSound()->processEntry(kEntityFrancois);
+ if (getSoundQueue()->isBuffered(kEntityFrancois))
+ getSoundQueue()->processEntry(kEntityFrancois);
setCallback(4);
setup_updateEntity(kCarRedSleeping, kPosition_5790);
@@ -381,8 +383,8 @@ label_callback:
case kAction1:
getData()->inventoryItem = kItemNone;
- if (getSound()->isBuffered(kEntityFrancois))
- getSound()->processEntry(kEntityFrancois);
+ if (getSoundQueue()->isBuffered(kEntityFrancois))
+ getSoundQueue()->processEntry(kEntityFrancois);
setCallback(6);
setup_savegame(kSavegameTypeEvent, kEventFrancoisWhistle);
diff --git a/engines/lastexpress/entities/gendarmes.cpp b/engines/lastexpress/entities/gendarmes.cpp
index f5ae191f9d..daa50956d3 100644
--- a/engines/lastexpress/entities/gendarmes.cpp
+++ b/engines/lastexpress/entities/gendarmes.cpp
@@ -88,12 +88,12 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_S(5, Gendarmes, arrestPlaysound16)
- arrest(savepoint, true, SoundManager::kFlagDefault);
+ arrest(savepoint, true, kFlagDefault);
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_I(6, Gendarmes, arrestCallback, uint32)
- arrest(savepoint, true, SoundManager::kFlagInvalid, true);
+ arrest(savepoint, true, kFlagInvalid, true);
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
@@ -103,7 +103,7 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_II(8, Gendarmes, arrestUpdateEntity, CarIndex, EntityPosition)
- arrest(savepoint, true, SoundManager::kFlagInvalid, false, true);
+ arrest(savepoint, true, kFlagInvalid, false, true);
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
@@ -221,7 +221,7 @@ IMPLEMENT_FUNCTION_IISS(9, Gendarmes, function9, CarIndex, EntityPosition)
strcpy(arrestSound, "POL1043");
strcat(arrestSound, (char *)&params->seq2);
- getSound()->playSound(kEntityGendarmes, arrestSound, SoundManager::kFlagInvalid, 30);
+ getSound()->playSound(kEntityGendarmes, arrestSound, kFlagInvalid, 30);
}
getData()->location = kLocationInsideCompartment;
@@ -264,7 +264,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
if (params->param6 == 0 || getState()->timeTicks > (uint32)params->param6) {
params->param6 = kTimeInvalid;
- getSound()->playSound(kEntityGendarmes, "POL1046A", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityGendarmes, "POL1046A", kFlagDefault);
}
UPDATE_PARAM(params->param7, getState()->timeTicks, 300);
@@ -276,7 +276,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
if (getEntities()->isOutsideAlexeiWindow())
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
- getSound()->playSound(kEntityGendarmes, "LIB017", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityGendarmes, "LIB017", kFlagDefault);
setCallback(getProgress().jacket == kJacketBlood ? 3 : 4);
setup_savegame(kSavegameTypeEvent, getProgress().jacket == kJacketBlood ? kEventMertensBloodJacket : kEventGendarmesArrestation);
@@ -312,7 +312,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
break;
case 2:
- getSound()->playSound(kEntityGendarmes, "LIB014", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityGendarmes, "LIB014", kFlagDefault);
getAction()->playAnimation(kEventGendarmesArrestation);
getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneGameOverPolice1, true);
break;
@@ -338,7 +338,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
break;
case 6:
- getSound()->playSound(kEntityGendarmes, "LIB014", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityGendarmes, "LIB014", kFlagDefault);
getAction()->playAnimation(kEventGendarmesArrestation);
getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneGameOverPolice1, true);
break;
@@ -544,7 +544,7 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
// Private functions
//////////////////////////////////////////////////////////////////////////
-void Gendarmes::arrest(const SavePoint &savepoint, bool shouldPlaySound, SoundManager::FlagType flag, bool checkCallback, bool shouldUpdateEntity) {
+void Gendarmes::arrest(const SavePoint &savepoint, bool shouldPlaySound, SoundFlag flag, bool checkCallback, bool shouldUpdateEntity) {
switch (savepoint.action) {
default:
break;
diff --git a/engines/lastexpress/entities/gendarmes.h b/engines/lastexpress/entities/gendarmes.h
index e8f9cb2c38..d999cfc1fd 100644
--- a/engines/lastexpress/entities/gendarmes.h
+++ b/engines/lastexpress/entities/gendarmes.h
@@ -26,7 +26,7 @@
#include "lastexpress/entities/entity.h"
#include "lastexpress/entities/entity_intern.h"
-#include "lastexpress/game/sound.h"
+#include "lastexpress/sound/sound.h"
namespace LastExpress {
@@ -88,7 +88,7 @@ public:
DECLARE_FUNCTION(chapter5)
private:
- void arrest(const SavePoint &savepoint, bool playSound = false, SoundManager::FlagType flag = SoundManager::kFlagInvalid, bool checkCallback = false, bool shouldUpdateEntity = false);
+ void arrest(const SavePoint &savepoint, bool playSound = false, SoundFlag flag = kFlagInvalid, bool checkCallback = false, bool shouldUpdateEntity = false);
};
} // End of namespace LastExpress
diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp
index ce2c9718db..8ec972b939 100644
--- a/engines/lastexpress/entities/hadija.cpp
+++ b/engines/lastexpress/entities/hadija.cpp
@@ -26,9 +26,10 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
diff --git a/engines/lastexpress/entities/ivo.cpp b/engines/lastexpress/entities/ivo.cpp
index 35f4ccfb8c..f2261b438c 100644
--- a/engines/lastexpress/entities/ivo.cpp
+++ b/engines/lastexpress/entities/ivo.cpp
@@ -22,16 +22,18 @@
#include "lastexpress/entities/ivo.h"
+#include "lastexpress/fight/fight.h"
+
#include "lastexpress/game/action.h"
#include "lastexpress/game/entities.h"
-#include "lastexpress/game/fight.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp
index 6472ce0533..2918b1e8bd 100644
--- a/engines/lastexpress/entities/kahina.cpp
+++ b/engines/lastexpress/entities/kahina.cpp
@@ -29,9 +29,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -607,8 +609,8 @@ label_callback_3:
break;
if (getEvent(kEventKahinaAskSpeakFirebird)) {
- if (getSound()->isBuffered(kEntityKahina))
- getSound()->processEntry(kEntityKahina);
+ if (getSoundQueue()->isBuffered(kEntityKahina))
+ getSoundQueue()->processEntry(kEntityKahina);
if (savepoint.action == kActionKnock)
getSound()->playSound(kEntityPlayer, "LIB012");
@@ -1163,8 +1165,8 @@ IMPLEMENT_FUNCTION(24, Kahina, function24)
case 1:
if (ENTITY_PARAM(0, 2)) {
getEntities()->clearSequences(kEntityKahina);
- if (getSound()->isBuffered(kEntityKahina))
- getSound()->processEntry(kEntityKahina);
+ if (getSoundQueue()->isBuffered(kEntityKahina))
+ getSoundQueue()->processEntry(kEntityKahina);
getProgress().field_44 = 0;
@@ -1186,7 +1188,7 @@ IMPLEMENT_FUNCTION(24, Kahina, function24)
getEntities()->updateEntity(kEntityKahina, kCarKronos, kPosition_9270);
getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + 750));
getSavePoints()->push(kEntityKahina, kEntityKronos, kAction235599361);
- getSound()->playSound(kEntityKahina, "MUS016", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityKahina, "MUS016", kFlagDefault);
getProgress().field_44 = 1;
params->param1 = true;
@@ -1198,8 +1200,8 @@ IMPLEMENT_FUNCTION(24, Kahina, function24)
case kAction137503360:
getEntities()->clearSequences(kEntityKahina);
- if (getSound()->isBuffered(kEntityKahina))
- getSound()->processEntry(kEntityKahina);
+ if (getSoundQueue()->isBuffered(kEntityKahina))
+ getSoundQueue()->processEntry(kEntityKahina);
getProgress().field_44 = 0;
diff --git a/engines/lastexpress/entities/kronos.cpp b/engines/lastexpress/entities/kronos.cpp
index 925b0967b7..134dce9c81 100644
--- a/engines/lastexpress/entities/kronos.cpp
+++ b/engines/lastexpress/entities/kronos.cpp
@@ -36,9 +36,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -216,7 +218,7 @@ IMPLEMENT_FUNCTION(11, Kronos, function11)
case kActionDefault:
getData()->entityPosition = kPosition_7000;
- if (!getSound()->isBuffered(kEntityKronos))
+ if (!getSoundQueue()->isBuffered(kEntityKronos))
getSound()->playSound(kEntityKronos, "KRO1001");
break;
}
@@ -457,7 +459,7 @@ IMPLEMENT_FUNCTION(19, Kronos, function19)
case 2:
getAction()->playAnimation(kEventConcertStart);
- getSound()->setupEntry(SoundManager::kSoundType7, kEntityKronos);
+ getSoundQueue()->setupEntry(kSoundType7, kEntityKronos);
getScenes()->loadSceneFromPosition(kCarKronos, 83);
RESET_ENTITY_STATE(kEntityRebecca, Rebecca, setup_function39);
@@ -480,7 +482,7 @@ IMPLEMENT_FUNCTION(20, Kronos, function20)
break;
case kActionNone:
- params->param5 = getSound()->getEntryTime(kEntityKronos)* 2;
+ params->param5 = getSoundQueue()->getEntryTime(kEntityKronos)* 2;
if (params->param6 < ARRAYSIZE(concertData) && params->param5 > concertData[params->param6].time) {
@@ -560,8 +562,8 @@ IMPLEMENT_FUNCTION(20, Kronos, function20)
case 3:
getAction()->playAnimation(kEventCathFallingAsleep);
- while (getSound()->isBuffered("1919.LNK"))
- getSound()->updateQueue();
+ while (getSoundQueue()->isBuffered("1919.LNK"))
+ getSoundQueue()->updateQueue();
getAction()->playAnimation(kEventCathWakingUp);
getScenes()->processScene();
@@ -746,7 +748,7 @@ IMPLEMENT_FUNCTION(22, Kronos, function22)
case kActionKnock:
case kActionOpenDoor:
- if (!getSound()->isBuffered(savepoint.action == kActionKnock ? "LIB012" : "LIB013", true))
+ if (!getSoundQueue()->isBuffered(savepoint.action == kActionKnock ? "LIB012" : "LIB013", true))
getSound()->playSound(kEntityPlayer, savepoint.action == kActionKnock ? "LIB012" : "LIB013");
if (getEvent(kEventConcertLeaveWithBriefcase))
diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp
index 7d30d31a84..0e67b45cd2 100644
--- a/engines/lastexpress/entities/mahmud.cpp
+++ b/engines/lastexpress/entities/mahmud.cpp
@@ -31,9 +31,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -157,7 +159,7 @@ IMPLEMENT_FUNCTION_II(10, Mahmud, function10, ObjectIndex, bool)
case kActionEndSound:
case kActionDrawScene:
- if (!getSound()->isBuffered(kEntityMahmud)) {
+ if (!getSoundQueue()->isBuffered(kEntityMahmud)) {
EntityPosition position = getEntityData(kEntityPlayer)->entityPosition;
if (position < kPosition_1500 || position >= kPosition_5790 || (position > kPosition_4455 && params->param5 != 5)) {
getObjects()->update(kObjectCompartment5, kEntityTrain, kObjectLocation3, kCursorHandKnock, kCursorHand);
@@ -173,12 +175,12 @@ IMPLEMENT_FUNCTION_II(10, Mahmud, function10, ObjectIndex, bool)
case kActionKnock:
case kActionOpenDoor:
- if (!getSound()->isBuffered((savepoint.action == kActionKnock) ? "LIB012" : "LIB013", true))
+ if (!getSoundQueue()->isBuffered((savepoint.action == kActionKnock) ? "LIB012" : "LIB013", true))
getSound()->playSound(kEntityPlayer, (savepoint.action == kActionKnock) ? "LIB012" : "LIB013");
params->param5 = savepoint.param.intValue;
- if (!getSound()->isBuffered(kEntityMahmud)) {
+ if (!getSoundQueue()->isBuffered(kEntityMahmud)) {
params->param3++;
switch(params->param3) {
@@ -204,7 +206,7 @@ IMPLEMENT_FUNCTION_II(10, Mahmud, function10, ObjectIndex, bool)
if (getState()->time >= kTimeCityGalanta) {
params->param3 = 0;
} else {
- getSound()->playSound(kEntityTrain, "LIB050", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityTrain, "LIB050", kFlagDefault);
getLogic()->gameOver(kSavegameTypeIndex, 0, (getProgress().chapter == kChapter1) ? kSceneGameOverPolice1 : kSceneGameOverPolice2, true);
}
break;
@@ -235,7 +237,7 @@ IMPLEMENT_FUNCTION_II(10, Mahmud, function10, ObjectIndex, bool)
break;
case kActionDefault:
- getSound()->playSound(kEntityMahmud, params->param2 ? "MAH1170A" : "MAH1173", SoundManager::kFlagInvalid, 45);
+ getSound()->playSound(kEntityMahmud, params->param2 ? "MAH1170A" : "MAH1173", kFlagInvalid, 45);
getProgress().field_C4 = 1;
setCallback(1);
@@ -282,7 +284,7 @@ IMPLEMENT_FUNCTION(11, Mahmud, function11)
case kActionOpenDoor: {
getSound()->playSound(kEntityPlayer, (savepoint.action == kActionKnock ? "LIB012" : "LIB013"));
- if (!getSound()->isBuffered(kEntityMahmud)) {
+ if (!getSoundQueue()->isBuffered(kEntityMahmud)) {
params->param1++;
getSound()->playSound(kEntityMahmud, (params->param1 == 1 ? "MAH1170E" : (params->param1 == 2 ? "MAH1173B" : "MAH1174")));
@@ -396,8 +398,8 @@ IMPLEMENT_FUNCTION(11, Mahmud, function11)
break;
case kAction123852928:
- if (getSound()->isBuffered(kEntityMahmud))
- getSound()->processEntry(kEntityMahmud);
+ if (getSoundQueue()->isBuffered(kEntityMahmud))
+ getSoundQueue()->processEntry(kEntityMahmud);
getObjects()->update(kObjectCompartment5, kEntityTrain, kObjectLocation3, kCursorHandKnock, kCursorHand);
getObjects()->update(kObjectCompartment6, kEntityTrain, kObjectLocation3, kCursorHandKnock, kCursorHand);
@@ -560,7 +562,7 @@ IMPLEMENT_FUNCTION(14, Mahmud, chaptersHandler)
TIME_CHECK_CALLBACK(kTime1098000, params->param6, 1, setup_function13);
- if (!getSound()->isBuffered("HAR1104") && getState()->time > kTime1167300 && !params->param7) {
+ if (!getSoundQueue()->isBuffered("HAR1104") && getState()->time > kTime1167300 && !params->param7) {
params->param7 = 1;
setCallback(2);
@@ -636,7 +638,7 @@ IMPLEMENT_FUNCTION(14, Mahmud, chaptersHandler)
params->param4 = 0;
params->param5 = 0;
- if (!getSound()->isBuffered("HAR1104") && getState()->time > kTime1167300 && !params->param7) {
+ if (!getSoundQueue()->isBuffered("HAR1104") && getState()->time > kTime1167300 && !params->param7) {
params->param7 = 1;
setCallback(2);
setup_function12();
diff --git a/engines/lastexpress/entities/max.cpp b/engines/lastexpress/entities/max.cpp
index 7e5931322d..eacc38bf60 100644
--- a/engines/lastexpress/entities/max.cpp
+++ b/engines/lastexpress/entities/max.cpp
@@ -28,9 +28,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -91,7 +93,7 @@ IMPLEMENT_FUNCTION(6, Max, chapter12_handler)
case kActionNone:
UPDATE_PARAM(params->param2, getState()->time, params->param1);
- if (!getSound()->isBuffered(kEntityMax))
+ if (!getSoundQueue()->isBuffered(kEntityMax))
getSound()->playSound(kEntityMax, "Max1122");
params->param1 = 255 * (4 * rnd(20) + 40);
@@ -108,7 +110,7 @@ IMPLEMENT_FUNCTION(6, Max, chapter12_handler)
break;
case kAction158007856:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
getSound()->playSound(kEntityMax, "Max1122");
params->param1 = 255 * (4 * rnd(20) + 40);
}
@@ -125,7 +127,7 @@ IMPLEMENT_FUNCTION(7, Max, function7)
case kActionNone:
UPDATE_PARAM(params->param2, getState()->time, params->param1)
- if (!getSound()->isBuffered(kEntityMax))
+ if (!getSoundQueue()->isBuffered(kEntityMax))
getSound()->playSound(kEntityMax, "Max1122");
params->param1 = 255 * (4 * rnd(20) + 40);
@@ -137,8 +139,8 @@ IMPLEMENT_FUNCTION(7, Max, function7)
getObjects()->update(kObjectCompartmentF, kEntityMax, kObjectLocation1, kCursorNormal, kCursorNormal);
getObjects()->update(kObject53, kEntityMax, kObjectLocation1, kCursorNormal, kCursorNormal);
- if (getSound()->isBuffered(kEntityMax))
- getSound()->processEntry(kEntityMax);
+ if (getSoundQueue()->isBuffered(kEntityMax))
+ getSoundQueue()->processEntry(kEntityMax);
setCallback((savepoint.action == kActionKnock) ? 1 : 2);
setup_playSound((savepoint.action == kActionKnock) ? "LIB012" : "LIB013");
@@ -156,7 +158,7 @@ IMPLEMENT_FUNCTION(7, Max, function7)
break;
case kActionDrawScene:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
if (getEntities()->isPlayerPosition(kCarRedSleeping, 56) || getEntities()->isPlayerPosition(kCarRedSleeping, 78))
getSound()->playSound(kEntityMax, "Max1120");
}
@@ -197,7 +199,7 @@ IMPLEMENT_FUNCTION(7, Max, function7)
break;
case kAction158007856:
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
getSound()->playSound(kEntityMax, "Max1122");
params->param1 = 255 * (4 * rnd(20) + 40);
}
@@ -214,7 +216,7 @@ IMPLEMENT_FUNCTION(8, Max, chapter4Handler)
case kActionNone:
UPDATE_PARAM(params->param3, getState()->time, params->param2);
- if (!getSound()->isBuffered(kEntityMax))
+ if (!getSoundQueue()->isBuffered(kEntityMax))
getSound()->playSound(kEntityMax, "Max3101");
params->param2 = 255 * (4 * rnd(20) + 40);
@@ -228,8 +230,8 @@ IMPLEMENT_FUNCTION(8, Max, chapter4Handler)
break;
}
- if (getSound()->isBuffered(kEntityMax))
- getSound()->processEntry(kEntityMax);
+ if (getSoundQueue()->isBuffered(kEntityMax))
+ getSoundQueue()->processEntry(kEntityMax);
getAction()->playAnimation(kEventCathMaxLickHand);
getScenes()->processScene();
@@ -247,7 +249,7 @@ IMPLEMENT_FUNCTION(8, Max, chapter4Handler)
getData()->location = kLocationInsideCompartment;
getData()->car = kCarBaggage;
- if (!getSound()->isBuffered(kEntityMax))
+ if (!getSoundQueue()->isBuffered(kEntityMax))
getSound()->playSound(kEntityMax, "Max3101");
break;
@@ -255,8 +257,8 @@ IMPLEMENT_FUNCTION(8, Max, chapter4Handler)
if (getCallback() != 1)
break;
- if (getSound()->isBuffered(kEntityMax))
- getSound()->processEntry(kEntityMax);
+ if (getSoundQueue()->isBuffered(kEntityMax))
+ getSoundQueue()->processEntry(kEntityMax);
getSound()->playSound(kEntityPlayer, "LIB026");
getAction()->playAnimation(kEventCathMaxFree);
@@ -392,7 +394,7 @@ IMPLEMENT_FUNCTION(13, Max, chapter3Handler)
UPDATE_PARAM(params->param3, getState()->time, params->param1);
- if (!getSound()->isBuffered(kEntityMax))
+ if (!getSoundQueue()->isBuffered(kEntityMax))
getSound()->playSound(kEntityMax, "Max1122");
params->param1 = 255 * (4 * rnd(20) + 40);
@@ -424,7 +426,7 @@ IMPLEMENT_FUNCTION(13, Max, chapter3Handler)
if (params->param2)
break;
- if (!getSound()->isBuffered(kEntityMax)) {
+ if (!getSoundQueue()->isBuffered(kEntityMax)) {
getSound()->playSound(kEntityMax, "Max1122");
params->param1 = 255 * (4 * rnd(20) + 40);
}
@@ -464,7 +466,7 @@ IMPLEMENT_FUNCTION(14, Max, freeFromCage)
getData()->location = kLocationInsideCompartment;
getData()->car = kCarBaggage;
- if (!getSound()->isBuffered(kEntityMax))
+ if (!getSoundQueue()->isBuffered(kEntityMax))
getSound()->playSound(kEntityMax, "Max1122");
break;
@@ -476,17 +478,17 @@ IMPLEMENT_FUNCTION(14, Max, freeFromCage)
break;
case 1:
- if (getSound()->isBuffered(kEntityMax))
- getSound()->removeFromQueue(kEntityMax);
+ if (getSoundQueue()->isBuffered(kEntityMax))
+ getSoundQueue()->removeFromQueue(kEntityMax);
getAction()->playAnimation(kEventCathMaxCage);
- getSound()->setupEntry(SoundManager::kSoundType7, kEntityMax);
+ getSoundQueue()->setupEntry(kSoundType7, kEntityMax);
getScenes()->processScene();
break;
case 2:
- if (getSound()->isBuffered(kEntityMax))
- getSound()->processEntry(kEntityMax);
+ if (getSoundQueue()->isBuffered(kEntityMax))
+ getSoundQueue()->processEntry(kEntityMax);
getSound()->playSound(kEntityPlayer, "LIB026");
getAction()->playAnimation(kEventCathMaxFree);
@@ -523,7 +525,7 @@ IMPLEMENT_FUNCTION(15, Max, function15)
getData()->location = kLocationOutsideCompartment;
getData()->car = kCarRedSleeping;
- if (!getSound()->isBuffered(kEntityMax))
+ if (!getSoundQueue()->isBuffered(kEntityMax))
getSound()->playSound(kEntityMax, "Max3010");
setCallback(1);
diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp
index 91082f487e..e222af4805 100644
--- a/engines/lastexpress/entities/mertens.cpp
+++ b/engines/lastexpress/entities/mertens.cpp
@@ -30,7 +30,9 @@
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
#include "lastexpress/game/state.h"
-#include "lastexpress/game/sound.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -289,7 +291,7 @@ IMPLEMENT_FUNCTION_S(8, Mertens, playSound16)
break;
case kActionDefault:
- getSound()->playSound(kEntityMertens, (char *)&params->seq1, SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityMertens, (char *)&params->seq1, kFlagDefault);
break;
case kActionCallback:
@@ -503,7 +505,7 @@ IMPLEMENT_FUNCTION_I(12, Mertens, bonsoir, EntityIndex)
if (savepoint.action == kActionDefault)
return;
- if (getSound()->isBuffered(kEntityMertens)) {
+ if (getSoundQueue()->isBuffered(kEntityMertens)) {
CALLBACK_ACTION();
return;
}
@@ -589,7 +591,7 @@ IMPLEMENT_FUNCTION_II(13, Mertens, function13, bool, bool)
if (params->param2)
params->param3 = 1;
- if (!getSound()->isBuffered(kEntityMertens)) {
+ if (!getSoundQueue()->isBuffered(kEntityMertens)) {
}
@@ -896,7 +898,7 @@ IMPLEMENT_FUNCTION(17, Mertens, function17)
} else {
// Got the passenger list, Mertens is looking for it before sitting
ENTITY_PARAM(0, 2) = 1;
- getSound()->playSound(kEntityMertens, "CON1058", SoundManager::kFlagInvalid, 75);
+ getSound()->playSound(kEntityMertens, "CON1058", kFlagInvalid, 75);
getEntities()->drawSequenceRight(kEntityMertens, "601D");
}
@@ -984,7 +986,7 @@ IMPLEMENT_FUNCTION(18, Mertens, function18)
getEntities()->drawSequenceRight(kEntityMertens, "601A");
} else {
ENTITY_PARAM(0, 2) = 1;
- getSound()->playSound(kEntityMertens, "CON1058", SoundManager::kFlagInvalid, 75);
+ getSound()->playSound(kEntityMertens, "CON1058", kFlagInvalid, 75);
getEntities()->drawSequenceRight(kEntityMertens, "601D");
}
@@ -1188,7 +1190,7 @@ IMPLEMENT_FUNCTION(22, Mertens, function22)
break;
case 5:
- if (!getSound()->isBuffered(kEntityMertens))
+ if (!getSoundQueue()->isBuffered(kEntityMertens))
getSound()->playSound(kEntityMertens, "MAH1170I");
setCallback(6);
@@ -1198,8 +1200,8 @@ IMPLEMENT_FUNCTION(22, Mertens, function22)
case 6:
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityMertens);
- if (!getSound()->isBuffered(kEntityMertens))
- getSound()->playSound(kEntityMertens, "MAH1172", SoundManager::kFlagInvalid, 225);
+ if (!getSoundQueue()->isBuffered(kEntityMertens))
+ getSound()->playSound(kEntityMertens, "MAH1172", kFlagInvalid, 225);
setCallback(7);
setup_function21(kObjectCompartment4, kObject20);
@@ -2300,7 +2302,7 @@ IMPLEMENT_FUNCTION_I(31, Mertens, function31, MertensActionType)
break;
case 1:
- if (getSound()->isBuffered(kEntityMertens)) {
+ if (getSoundQueue()->isBuffered(kEntityMertens)) {
getEntities()->drawSequenceLeft(kEntityMertens, "601J");
} else {
setCallback(2);
@@ -3017,7 +3019,7 @@ IMPLEMENT_FUNCTION(42, Mertens, function42)
if (getState()->time <= kTime1188000) {
if ((!getEntities()->isPlayerInCar(kCarGreenSleeping) && !getEntities()->isPlayerInCar(kCarRedSleeping))
- || getSound()->isBuffered("REB1205")
+ || getSoundQueue()->isBuffered("REB1205")
|| !getEntities()->isInsideCompartment(kEntityMmeBoutarel, kCarRedSleeping, kPosition_5790)
|| !params->param4) {
params->param4 = (uint)getState()->time;
@@ -3138,7 +3140,7 @@ label_callback_18:
}
label_callback_19:
- if (ENTITY_PARAM(0, 1) && !getSound()->isBuffered(kEntityMertens)) {
+ if (ENTITY_PARAM(0, 1) && !getSoundQueue()->isBuffered(kEntityMertens)) {
if (getProgress().field_18 != 4)
getSound()->playSound(kEntityMertens, "CON1505");
}
diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp
index 587c43cade..ff3d2b6744 100644
--- a/engines/lastexpress/entities/milos.cpp
+++ b/engines/lastexpress/entities/milos.cpp
@@ -24,17 +24,20 @@
#include "lastexpress/entities/vesna.h"
+#include "lastexpress/fight/fight.h"
+
#include "lastexpress/game/action.h"
#include "lastexpress/game/entities.h"
-#include "lastexpress/game/fight.h"
#include "lastexpress/game/inventory.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -110,7 +113,7 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_S(7, Milos, playSound16)
- Entity::playSound(savepoint, false, SoundManager::kFlagDefault);
+ Entity::playSound(savepoint, false, kFlagDefault);
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
@@ -1576,8 +1579,8 @@ IMPLEMENT_FUNCTION(29, Milos, chapter4Handler)
break;
case kAction221683008:
- if (getSound()->isBuffered(kEntityMilos))
- getSound()->processEntry(kEntityMilos);
+ if (getSoundQueue()->isBuffered(kEntityMilos))
+ getSoundQueue()->processEntry(kEntityMilos);
params->param1 = 1;
getSavePoints()->push(kEntityMilos, kEntityCoudert, kAction123199584);
@@ -1719,15 +1722,15 @@ IMPLEMENT_FUNCTION(34, Milos, chapter5Handler)
break;
case 2:
- if (getSound()->isBuffered("MUS050"))
- getSound()->processEntry("MUS050");
+ if (getSoundQueue()->isBuffered("MUS050"))
+ getSoundQueue()->processEntry("MUS050");
- if (getSound()->isBuffered("ARRIVE"))
- getSound()->removeFromQueue("ARRIVE");
+ if (getSoundQueue()->isBuffered("ARRIVE"))
+ getSoundQueue()->removeFromQueue("ARRIVE");
- getSound()->processEntries();
+ getSoundQueue()->processEntries();
getAction()->playAnimation(isNight() ? kEventLocomotiveMilosNight : kEventLocomotiveMilosDay);
- getSound()->setupEntry(SoundManager::kSoundType7, kEntityMilos);
+ getSoundQueue()->setupEntry(kSoundType7, kEntityMilos);
getScenes()->loadSceneFromPosition(kCarCoalTender, 1);
break;
@@ -1739,7 +1742,7 @@ IMPLEMENT_FUNCTION(34, Milos, chapter5Handler)
case 4:
getAction()->playAnimation(kEventLocomotiveRestartTrain);
getAction()->playAnimation(kEventLocomotiveOldBridge);
- getSound()->resetState();
+ getSoundQueue()->resetState();
getState()->time = kTime2983500;
setCallback(5);
@@ -1782,7 +1785,7 @@ IMPLEMENT_FUNCTION(34, Milos, chapter5Handler)
setup_savegame(kSavegameTypeEvent, kEventLocomotiveAnnaStopsTrain);
}
- getSound()->processEntry(kEntityMilos);
+ getSoundQueue()->processEntry(kEntityMilos);
if (getState()->time < kTimeTrainStopped2)
getState()->time = kTimeTrainStopped2;
diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp
index 78f2d2fb4b..9ca10ca374 100644
--- a/engines/lastexpress/entities/mmeboutarel.cpp
+++ b/engines/lastexpress/entities/mmeboutarel.cpp
@@ -28,9 +28,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -399,7 +401,7 @@ IMPLEMENT_FUNCTION(13, MmeBoutarel, function13)
break;
case kActionNone:
- if (!getSound()->isBuffered(kEntityMmeBoutarel) && params->param6 != kTimeInvalid) {
+ if (!getSoundQueue()->isBuffered(kEntityMmeBoutarel) && params->param6 != kTimeInvalid) {
UPDATE_PARAM_PROC_TIME(params->param1, !getEntities()->isDistanceBetweenEntities(kEntityMmeBoutarel, kEntityPlayer, 2000), params->param6, 0)
getObjects()->update(kObjectCompartmentD, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal);
getObjects()->update(kObject51, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal);
@@ -883,8 +885,8 @@ IMPLEMENT_FUNCTION(21, MmeBoutarel, chapter3Handler)
if (getState()->time <= kTime2038500) {
if (!getEntities()->isPlayerInCar(kCarRedSleeping)
|| !params->param1
- || getSound()->isBuffered("FRA2012")
- || getSound()->isBuffered("FRA2010")
+ || getSoundQueue()->isBuffered("FRA2012")
+ || getSoundQueue()->isBuffered("FRA2010")
||!params->param2)
params->param2 = (uint)getState()->time;
diff --git a/engines/lastexpress/entities/pascale.cpp b/engines/lastexpress/entities/pascale.cpp
index 7cf7f7766e..a191273702 100644
--- a/engines/lastexpress/entities/pascale.cpp
+++ b/engines/lastexpress/entities/pascale.cpp
@@ -27,9 +27,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -141,15 +143,15 @@ IMPLEMENT_FUNCTION(8, Pascale, welcomeSophieAndRebecca)
break;
case kChapter1:
- getSound()->playSound(kEntityPascale, "REB1198", SoundManager::kFlagInvalid, 30);
+ getSound()->playSound(kEntityPascale, "REB1198", kFlagInvalid, 30);
break;
case kChapter3:
- getSound()->playSound(kEntityPascale, "REB3001", SoundManager::kFlagInvalid, 30);
+ getSound()->playSound(kEntityPascale, "REB3001", kFlagInvalid, 30);
break;
case kChapter4:
- getSound()->playSound(kEntityPascale, "REB4001", SoundManager::kFlagInvalid, 30);
+ getSound()->playSound(kEntityPascale, "REB4001", kFlagInvalid, 30);
break;
}
@@ -201,7 +203,7 @@ IMPLEMENT_FUNCTION(10, Pascale, welcomeCath)
break;
case kActionNone:
- if (params->param1 && !getSound()->isBuffered(kEntityPascale))
+ if (params->param1 && !getSoundQueue()->isBuffered(kEntityPascale))
getEntities()->updatePositionExit(kEntityPascale, kCarRestaurant, 64);
break;
@@ -462,10 +464,10 @@ IMPLEMENT_FUNCTION(16, Pascale, serveTatianaVassili)
getEntities()->drawSequenceLeft(kEntityPascale, "014B");
getEntities()->updatePositionEnter(kEntityPascale, kCarRestaurant, 67);
- if (getSound()->isBuffered("TAT1069A"))
- getSound()->processEntry("TAT1069A");
- else if (getSound()->isBuffered("TAT1069B"))
- getSound()->processEntry("TAT1069B");
+ if (getSoundQueue()->isBuffered("TAT1069A"))
+ getSoundQueue()->processEntry("TAT1069A");
+ else if (getSoundQueue()->isBuffered("TAT1069B"))
+ getSoundQueue()->processEntry("TAT1069B");
setCallback(2);
setup_playSound("TAT1066");
@@ -754,7 +756,7 @@ IMPLEMENT_FUNCTION(24, Pascale, welcomeAbbot)
break;
case kActionDefault:
- getSound()->playSound(kEntityPascale, "ABB3015", SoundManager::kFlagInvalid, 105);
+ getSound()->playSound(kEntityPascale, "ABB3015", kFlagInvalid, 105);
getEntities()->drawSequenceRight(kEntityPascale, "029A1");
getEntities()->drawSequenceRight(kEntityAbbot, "029A2");
break;
@@ -1213,7 +1215,7 @@ label_callback1:
break;
case kAction169750080:
- if (getSound()->isBuffered(kEntityPascale)) {
+ if (getSoundQueue()->isBuffered(kEntityPascale)) {
params->param4 = 1;
} else {
setCallback(7);
diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp
index 1cb895d8d6..b1a176b47e 100644
--- a/engines/lastexpress/entities/rebecca.cpp
+++ b/engines/lastexpress/entities/rebecca.cpp
@@ -27,9 +27,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -316,7 +318,7 @@ IMPLEMENT_FUNCTION_I(17, Rebecca, function17, bool)
getData()->location = kLocationOutsideCompartment;
if (getProgress().chapter == kChapter3)
- getSound()->playSound(kEntityRebecca, "Reb3005", SoundManager::kFlagInvalid, 75);
+ getSound()->playSound(kEntityRebecca, "Reb3005", kFlagInvalid, 75);
if (params->param1) {
setCallback(5);
@@ -511,7 +513,7 @@ IMPLEMENT_FUNCTION_I(20, Rebecca, function20, TimeValue)
if (getProgress().chapter == kChapter1 && !ENTITY_PARAM(0, 3)) {
if (params->param7 != kTimeInvalid && getState()->time > kTime1174500) {
if (getState()->time <= kTime1183500) {
- if (!getEntities()->isDistanceBetweenEntities(kEntityRebecca, kEntityPlayer, 2000) || getSound()->isBuffered("CON1210") || !params->param7)
+ if (!getEntities()->isDistanceBetweenEntities(kEntityRebecca, kEntityPlayer, 2000) || getSoundQueue()->isBuffered("CON1210") || !params->param7)
params->param7 = (uint)(getState()->time);
if (params->param7 >= getState()->time)
@@ -1357,7 +1359,7 @@ label_callback_3:
params->param5 = kTimeInvalid;
getData()->inventoryItem = kItemNone;
- getSound()->playSound(kEntityRebecca, "Reb3008", SoundManager::kFlagInvalid, 60);
+ getSound()->playSound(kEntityRebecca, "Reb3008", kFlagInvalid, 60);
getEntities()->updatePositionEnter(kEntityRebecca, kCarRestaurant, 52);
setCallback(3);
diff --git a/engines/lastexpress/entities/salko.cpp b/engines/lastexpress/entities/salko.cpp
index 4d510bb9bf..63d995dc42 100644
--- a/engines/lastexpress/entities/salko.cpp
+++ b/engines/lastexpress/entities/salko.cpp
@@ -22,16 +22,19 @@
#include "lastexpress/entities/salko.h"
+#include "lastexpress/fight/fight.h"
+
#include "lastexpress/game/action.h"
#include "lastexpress/game/entities.h"
-#include "lastexpress/game/fight.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -595,8 +598,8 @@ IMPLEMENT_FUNCTION(24, Salko, chapter5Handler)
break;
case 1:
- if (getSound()->isBuffered("MUS050"))
- getSound()->processEntry("MUS050");
+ if (getSoundQueue()->isBuffered("MUS050"))
+ getSoundQueue()->processEntry("MUS050");
getAction()->playAnimation(kEventCathSalkoTrainTopFight);
diff --git a/engines/lastexpress/entities/servers0.cpp b/engines/lastexpress/entities/servers0.cpp
index 1fec775659..989bddd662 100644
--- a/engines/lastexpress/entities/servers0.cpp
+++ b/engines/lastexpress/entities/servers0.cpp
@@ -26,9 +26,10 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
diff --git a/engines/lastexpress/entities/servers1.cpp b/engines/lastexpress/entities/servers1.cpp
index cd0a162755..995fbbc01b 100644
--- a/engines/lastexpress/entities/servers1.cpp
+++ b/engines/lastexpress/entities/servers1.cpp
@@ -26,9 +26,10 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
diff --git a/engines/lastexpress/entities/sophie.cpp b/engines/lastexpress/entities/sophie.cpp
index e0c63f7297..57bd491949 100644
--- a/engines/lastexpress/entities/sophie.cpp
+++ b/engines/lastexpress/entities/sophie.cpp
@@ -25,9 +25,10 @@
#include "lastexpress/game/entities.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
diff --git a/engines/lastexpress/entities/tables.cpp b/engines/lastexpress/entities/tables.cpp
index c372663c40..06ea4c597c 100644
--- a/engines/lastexpress/entities/tables.cpp
+++ b/engines/lastexpress/entities/tables.cpp
@@ -26,9 +26,11 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -49,7 +51,7 @@ Tables::Tables(LastExpressEngine *engine, EntityIndex id) : Entity(engine, id) {
IMPLEMENT_FUNCTION(1, Tables, chapter1)
if (savepoint.action == kActionDefault) {
if (_id == kEntityTables2)
- getSound()->playSoundWithSubtitles("LOOP8A.SND", SoundManager::kFlagLoop, kEntityTables2);
+ getSound()->playSoundWithSubtitles("LOOP8A.SND", kFlagLoop, kEntityTables2);
setup_draw();
}
@@ -59,7 +61,7 @@ IMPLEMENT_FUNCTION_END
IMPLEMENT_FUNCTION(2, Tables, chapter2)
if (savepoint.action == kActionDefault) {
if (_id == kEntityTables2)
- getSound()->playSoundWithSubtitles("LOOP8A.SND", SoundManager::kFlagLoop, kEntityTables2);
+ getSound()->playSoundWithSubtitles("LOOP8A.SND", kFlagLoop, kEntityTables2);
setup_draw();
}
@@ -69,7 +71,7 @@ IMPLEMENT_FUNCTION_END
IMPLEMENT_FUNCTION(3, Tables, chapter3)
if (savepoint.action == kActionDefault) {
if (_id == kEntityTables2)
- getSound()->playSoundWithSubtitles("LOOP8A.SND", SoundManager::kFlagLoop, kEntityTables2);
+ getSound()->playSoundWithSubtitles("LOOP8A.SND", kFlagLoop, kEntityTables2);
setup_draw();
}
@@ -79,7 +81,7 @@ IMPLEMENT_FUNCTION_END
IMPLEMENT_FUNCTION(4, Tables, chapter4)
if (savepoint.action == kActionDefault) {
if (_id == kEntityTables2)
- getSound()->playSoundWithSubtitles("LOOP8A.SND", SoundManager::kFlagLoop, kEntityTables2);
+ getSound()->playSoundWithSubtitles("LOOP8A.SND", kFlagLoop, kEntityTables2);
setup_draw();
}
@@ -88,8 +90,8 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(5, Tables, chapter5)
if (savepoint.action == kActionDefault) {
- if (_id == kEntityTables2 && getSound()->isBuffered(kEntityTables2))
- getSound()->processEntry(kEntityTables2);
+ if (_id == kEntityTables2 && getSoundQueue()->isBuffered(kEntityTables2))
+ getSoundQueue()->processEntry(kEntityTables2);
setup_draw();
}
@@ -113,21 +115,21 @@ IMPLEMENT_FUNCTION(6, Tables, draw)
case kChapter1:
if (getState()->time > kTime1165500 && !params->param1) {
params->param1 = 1;
- getSound()->processEntry(kEntityTables2);
+ getSoundQueue()->processEntry(kEntityTables2);
}
break;
case kChapter3:
if (getState()->time > kTime2052000 && !params->param2) {
params->param2 = 1;
- getSound()->processEntry(kEntityTables2);
+ getSoundQueue()->processEntry(kEntityTables2);
}
break;
case kChapter4:
if (getState()->time > kTime2488500 && !params->param3) {
params->param3 = 1;
- getSound()->processEntry(kEntityTables2);
+ getSoundQueue()->processEntry(kEntityTables2);
}
break;
diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp
index 6e25d8c5c7..c8901b3e30 100644
--- a/engines/lastexpress/entities/tatiana.cpp
+++ b/engines/lastexpress/entities/tatiana.cpp
@@ -32,9 +32,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -420,7 +422,7 @@ IMPLEMENT_FUNCTION(19, Tatiana, chapter1Handler)
break;
case kActionNone:
- if (getSound()->isBuffered(kEntityTatiana) || !params->param4 || params->param3 == 2 || getSound()->isBuffered("TAT1066"))
+ if (getSoundQueue()->isBuffered(kEntityTatiana) || !params->param4 || params->param3 == 2 || getSoundQueue()->isBuffered("TAT1066"))
goto label_tatiana_chapter1_2;
UPDATE_PARAM_PROC(params->param5, getState()->timeTicks, 450)
@@ -568,7 +570,7 @@ IMPLEMENT_FUNCTION(21, Tatiana, function21)
// Fallback to next case
case 3:
- if (getSound()->isBuffered(kEntityTatiana)) {
+ if (getSoundQueue()->isBuffered(kEntityTatiana)) {
setCallback(3);
setup_updateFromTime(75);
} else {
@@ -1858,7 +1860,7 @@ IMPLEMENT_FUNCTION(46, Tatiana, function46)
parameters->param3 = 1;
if (parameters->param2) {
- getSound()->removeFromQueue(kEntityTatiana);
+ getSoundQueue()->removeFromQueue(kEntityTatiana);
getSavePoints()->call(kEntityTatiana, kEntityTatiana, kActionEndSound);
}
} else {
@@ -1947,12 +1949,12 @@ IMPLEMENT_FUNCTION(48, Tatiana, function48)
params->param1 = 0;
}
- if (!params->param1 || getSound()->isBuffered(kEntityTatiana))
+ if (!params->param1 || getSoundQueue()->isBuffered(kEntityTatiana))
goto label_end;
UPDATE_PARAM_GOTO(params->param2, getState()->timeTicks, 5 * (3 * rnd(5) + 30), label_end);
- getSound()->playSound(kEntityTatiana, "LIB012", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityTatiana, "LIB012", kFlagDefault);
params->param2 = 0;
label_end:
@@ -2086,7 +2088,7 @@ IMPLEMENT_FUNCTION(50, Tatiana, function50)
break;
case kActionKnock:
- if (!getSound()->isBuffered("LIB012", true))
+ if (!getSoundQueue()->isBuffered("LIB012", true))
getSound()->playSound(kEntityPlayer, "LIB012");
break;
@@ -2107,14 +2109,14 @@ IMPLEMENT_FUNCTION(50, Tatiana, function50)
getObjects()->update(kObject48, kEntityTatiana, kObjectLocationNone, kCursorHandKnock, kCursorHand);
getObjects()->update(kObjectCompartmentA, kEntityTatiana, kObjectLocationNone, kCursorHandKnock, kCursorHand);
- if (!getSound()->isBuffered(kEntityTatiana))
+ if (!getSoundQueue()->isBuffered(kEntityTatiana))
getSound()->playSound(kEntityTatiana, "Tat4166");
break;
case kActionCallback:
if (getCallback() == 1) {
- if (getSound()->isBuffered("MUS013"))
- getSound()->processEntry("MUS013");
+ if (getSoundQueue()->isBuffered("MUS013"))
+ getSoundQueue()->processEntry("MUS013");
getAction()->playAnimation(kEventVassiliDeadAlexei);
getSavePoints()->push(kEntityTatiana, kEntityAbbot, kAction104060776);
@@ -2223,11 +2225,11 @@ IMPLEMENT_FUNCTION(54, Tatiana, function54)
case kActionCallback:
if (getCallback() == 1) {
- if (getSound()->isBuffered("MUS050"))
- getSound()->processEntry("MUS050");
+ if (getSoundQueue()->isBuffered("MUS050"))
+ getSoundQueue()->processEntry("MUS050");
- if (getSound()->isBuffered(kEntityTatiana))
- getSound()->processEntry(kEntityTatiana);
+ if (getSoundQueue()->isBuffered(kEntityTatiana))
+ getSoundQueue()->processEntry(kEntityTatiana);
getAction()->playAnimation(isNight() ? kEventTatianaVassiliTalkNight : kEventTatianaVassiliTalk);
getScenes()->processScene();
diff --git a/engines/lastexpress/entities/train.cpp b/engines/lastexpress/entities/train.cpp
index 19c6fe279c..bced1da62b 100644
--- a/engines/lastexpress/entities/train.cpp
+++ b/engines/lastexpress/entities/train.cpp
@@ -30,7 +30,9 @@
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
#include "lastexpress/game/state.h"
-#include "lastexpress/game/sound.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -90,7 +92,7 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
switch (params->param1) {
default:
- error("Train::harem: Invalid value for parameter 1: %d", params->param1);
+ error("[Train::harem] Invalid value for parameter 1: %d", params->param1);
break;
case kObjectCompartment5:
@@ -118,7 +120,7 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
getObjects()->update((ObjectIndex)params->param1, kEntityTrain, kObjectLocation3, kCursorNormal, kCursorNormal);
// Knock / closed door sound
- getSound()->playSound(kEntityTables5, (params->param2 == 8) ? "LIB012" : "LIB013", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityTables5, (params->param2 == 8) ? "LIB012" : "LIB013", kFlagDefault);
if (params->param4 && params->param5) {
@@ -130,17 +132,17 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
break;
case 1:
- getSound()->playSound(kEntityTables5, "Har1014", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1014", kFlagDefault, 15);
break;
case 2:
- getSound()->playSound(kEntityTables5, "Har1013", SoundManager::kFlagDefault, 15);
- getSound()->playSound(kEntityTables5, "Har1016", SoundManager::kFlagDefault, 150);
+ getSound()->playSound(kEntityTables5, "Har1013", kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1016", kFlagDefault, 150);
break;
case 3:
- getSound()->playSound(kEntityTables5, "Har1015A", SoundManager::kFlagDefault, 15);
- getSound()->playSound(kEntityTables5, "Har1015", SoundManager::kFlagDefault, 150);
+ getSound()->playSound(kEntityTables5, "Har1015A", kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1015", kFlagDefault, 150);
break;
}
@@ -164,15 +166,15 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
break;
case 1:
- getSound()->playSound(kEntityTables5, "Har1014", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1014", kFlagDefault, 15);
break;
case 2:
- getSound()->playSound(kEntityTables5, "Har1013", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1013", kFlagDefault, 15);
break;
case 3:
- getSound()->playSound(kEntityTables5, "Har1013A", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1013A", kFlagDefault, 15);
break;
}
@@ -191,11 +193,11 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
break;
case 1:
- getSound()->playSound(kEntityTables5, "Har1012", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1012", kFlagDefault, 15);
break;
case 2:
- getSound()->playSound(kEntityTables5, "Har1012A", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1012A", kFlagDefault, 15);
break;
}
@@ -207,7 +209,7 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
ENTITY_PARAM(0, 1)++;
if (ENTITY_PARAM(0, 1) <= 1)
- getSound()->playSound(kEntityTables5, "Har1014", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1014", kFlagDefault, 15);
else
params->param8 = 1;
@@ -221,7 +223,7 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
ENTITY_PARAM(0, 4)++;
if (ENTITY_PARAM(0, 4) <= 1) {
- getSound()->playSound(kEntityTables5, "Har1011", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1011", kFlagDefault, 15);
handleCompartmentAction();
return;
}
@@ -241,11 +243,11 @@ IMPLEMENT_FUNCTION_II(7, Train, harem, ObjectIndex, uint32)
break;
case 1:
- getSound()->playSound(kEntityTables5, "Har1013", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1013", kFlagDefault, 15);
break;
case 2:
- getSound()->playSound(kEntityTables5, "Har1013A", SoundManager::kFlagDefault, 15);
+ getSound()->playSound(kEntityTables5, "Har1013A", kFlagDefault, 15);
break;
}
@@ -300,13 +302,13 @@ label_process:
}
// Update object
- if (ENTITY_PARAM(0, 8) && !getSound()->isBuffered(kEntityTables5)) {
+ if (ENTITY_PARAM(0, 8) && !getSoundQueue()->isBuffered(kEntityTables5)) {
getObjects()->update((ObjectIndex)ENTITY_PARAM(0, 8), getObjects()->get((ObjectIndex)ENTITY_PARAM(0, 8)).entity, kObjectLocation3, kCursorHandKnock, kCursorHand);
ENTITY_PARAM(0, 8) = 0;
}
// Play clock sound
- if (params->param6 && !getSound()->isBuffered("ZFX1001", true))
+ if (params->param6 && !getSoundQueue()->isBuffered("ZFX1001", true))
getSound()->playSound(kEntityPlayer, "ZFX1001");
break;
@@ -339,12 +341,12 @@ label_process:
// Play clock sound
if (getEntities()->isPlayerPosition(kCarRestaurant, 81)) {
params->param6 = 1;
- if (!getSound()->isBuffered("ZFX1001"))
+ if (!getSoundQueue()->isBuffered("ZFX1001"))
getSound()->playSound(kEntityPlayer, "ZFX1001");
} else {
params->param6 = 0;
- if (getSound()->isBuffered("ZFX1001", true))
- getSound()->removeFromQueue("ZFX1001");
+ if (getSoundQueue()->isBuffered("ZFX1001", true))
+ getSoundQueue()->removeFromQueue("ZFX1001");
}
// Draw moving background behind windows
@@ -562,8 +564,8 @@ void Train::resetParam8() {
&& !getEntities()->isInsideCompartment(kEntityPlayer, (CarIndex)params1->param1, (EntityPosition)params1->param2)
&& !getEntities()->isInsideCompartment(kEntityPlayer, (CarIndex)params1->param1, (EntityPosition)params1->param3)) {
- if (getSound()->isBuffered((const char *)&params1->seq))
- getSound()->processEntry((const char *)&params1->seq);
+ if (getSoundQueue()->isBuffered((const char *)&params1->seq))
+ getSoundQueue()->processEntry((const char *)&params1->seq);
params->param8 = 0;
}
diff --git a/engines/lastexpress/entities/vassili.cpp b/engines/lastexpress/entities/vassili.cpp
index 09fb5b1223..22f41afa92 100644
--- a/engines/lastexpress/entities/vassili.cpp
+++ b/engines/lastexpress/entities/vassili.cpp
@@ -32,9 +32,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -268,7 +270,7 @@ IMPLEMENT_FUNCTION(8, Vassili, function8)
getSavePoints()->push(kEntityVassili, kEntityAnna, kAction226031488);
getSavePoints()->push(kEntityVassili, kEntityVerges, kAction226031488);
getSavePoints()->push(kEntityVassili, kEntityCoudert, kAction226031488);
- getSound()->playSound(kEntityVassili, "VAS1027", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityVassili, "VAS1027", kFlagDefault);
break;
}
IMPLEMENT_FUNCTION_END
@@ -295,12 +297,12 @@ IMPLEMENT_FUNCTION(9, Vassili, function9)
|| getEntities()->isPlayerPosition(kCarRedSleeping, 41)) {
if (savepoint.action == kActionDrawScene)
- getSound()->processEntry(kEntityVassili);
+ getSoundQueue()->processEntry(kEntityVassili);
setup_seizure();
} else {
if (savepoint.action == kActionDefault)
- getSound()->playSound(kEntityVassili, "VAS1028", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityVassili, "VAS1028", kFlagDefault);
}
break;
}
diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp
index bc35a105b1..8246f85145 100644
--- a/engines/lastexpress/entities/verges.cpp
+++ b/engines/lastexpress/entities/verges.cpp
@@ -29,9 +29,11 @@
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -123,7 +125,7 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_NOSETUP(5, Verges, playSound16)
- Entity::playSound(savepoint, false, SoundManager::kFlagDefault);
+ Entity::playSound(savepoint, false, kFlagDefault);
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
@@ -139,7 +141,7 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_II(8, Verges, updateEntity, CarIndex, EntityPosition)
if (savepoint.action == kActionExcuseMeCath) {
- if (!getSound()->isBuffered(kEntityVerges))
+ if (!getSoundQueue()->isBuffered(kEntityVerges))
getSound()->playSound(kEntityPlayer, "TRA1113", getSound()->getSoundFlag(kEntityVerges));
return;
@@ -187,7 +189,7 @@ switch (savepoint.action) {
break;
case 2:
- if (!getSound()->isBuffered(kEntityVerges))
+ if (!getSoundQueue()->isBuffered(kEntityVerges))
getSound()->playSound(kEntityVerges, (char *)&params->seq1);
getEntities()->drawSequenceRight(kEntityVerges, "813DS");
@@ -232,7 +234,7 @@ IMPLEMENT_FUNCTION_IIS(10, Verges, function10, CarIndex, EntityPosition)
case kActionNone:
if (!params->param7) {
- if (!getSound()->isBuffered(kEntityVerges)) {
+ if (!getSoundQueue()->isBuffered(kEntityVerges)) {
getSound()->playSound(kEntityVerges, (char *)&params->seq);
params->param7 = 1;
}
@@ -258,7 +260,7 @@ IMPLEMENT_FUNCTION_IIS(10, Verges, function10, CarIndex, EntityPosition)
break;
case kActionDefault:
- if (!getSound()->isBuffered(kEntityVerges)) {
+ if (!getSoundQueue()->isBuffered(kEntityVerges)) {
getSound()->playSound(kEntityVerges, (char *)&params->seq);
params->param7 = 1;
}
@@ -699,12 +701,12 @@ IMPLEMENT_FUNCTION(24, Verges, policeGettingOffTrain)
break;
case kActionDefault:
- getSound()->playSound(kEntityVerges, "POL1101", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityVerges, "POL1101", kFlagDefault);
break;
case kActionCallback:
if (getCallback() == 1) {
- getSound()->processEntry(kEntityVerges);
+ getSoundQueue()->processEntry(kEntityVerges);
getAction()->playAnimation(kEventGendarmesArrestation);
getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneGameOverPolice1, true);
}
@@ -1314,7 +1316,7 @@ IMPLEMENT_FUNCTION(32, Verges, function32)
break;
case 2:
- if (!getSound()->isBuffered(kEntityVerges))
+ if (!getSoundQueue()->isBuffered(kEntityVerges))
getSound()->playSound(kEntityVerges, "TRA3004");
getEntities()->drawSequenceRight(kEntityVerges, "813DS");
@@ -1752,16 +1754,16 @@ IMPLEMENT_FUNCTION(40, Verges, chapter5Handler)
break;
case kActionNone:
- if (getEntities()->isInSalon(kEntityPlayer) && !getSound()->isBuffered(kEntityVerges))
+ if (getEntities()->isInSalon(kEntityPlayer) && !getSoundQueue()->isBuffered(kEntityVerges))
getSound()->playSound(kEntityVerges, "WAT5000");
break;
case kActionOpenDoor:
- if (getSound()->isBuffered(kEntityVerges))
- getSound()->processEntry(kEntityVerges);
+ if (getSoundQueue()->isBuffered(kEntityVerges))
+ getSoundQueue()->processEntry(kEntityVerges);
- if (getSound()->isBuffered("MUS050"))
- getSound()->processEntry("MUS050");
+ if (getSoundQueue()->isBuffered("MUS050"))
+ getSoundQueue()->processEntry("MUS050");
getObjects()->update(kObject65, kEntityPlayer, kObjectLocationNone, kCursorNormal, kCursorForward);
@@ -1811,7 +1813,7 @@ IMPLEMENT_FUNCTION(41, Verges, function41)
// Fallback to next case
case 2:
- if (getSound()->isBuffered(kEntityVerges)) {
+ if (getSoundQueue()->isBuffered(kEntityVerges)) {
setCallback(2);
setup_updateFromTime(225);
} else {
diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp
index 8e09dbf7b0..7a1f1d3195 100644
--- a/engines/lastexpress/entities/vesna.cpp
+++ b/engines/lastexpress/entities/vesna.cpp
@@ -22,16 +22,18 @@
#include "lastexpress/entities/vesna.h"
+#include "lastexpress/fight/fight.h"
+
#include "lastexpress/game/action.h"
#include "lastexpress/game/entities.h"
-#include "lastexpress/game/fight.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -1082,7 +1084,7 @@ IMPLEMENT_FUNCTION(30, Vesna, function30)
case kActionNone:
if (!params->param1) {
UPDATE_PARAM_PROC(params->param3, getState()->timeTicks, 120)
- getSound()->playSound(kEntityVesna, "Ves50001", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityVesna, "Ves50001", kFlagDefault);
params->param1 = 1;
UPDATE_PARAM_PROC_END
}
@@ -1145,7 +1147,7 @@ IMPLEMENT_FUNCTION(30, Vesna, function30)
setCallback(2);
setup_savegame(kSavegameTypeEvent, kEventCathVesnaTrainTopKilled);
} else {
- getSound()->playSound(kEntityVesna, "Ves5001", SoundManager::kFlagDefault);
+ getSound()->playSound(kEntityVesna, "Ves5001", kFlagDefault);
params->param1 = 1;
}
break;
diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp
index 7e8b2f7348..45e5e11568 100644
--- a/engines/lastexpress/entities/yasmin.cpp
+++ b/engines/lastexpress/entities/yasmin.cpp
@@ -26,9 +26,10 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp
new file mode 100644
index 0000000000..b832d46a60
--- /dev/null
+++ b/engines/lastexpress/fight/fight.cpp
@@ -0,0 +1,409 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/fight/fight.h"
+
+#include "lastexpress/fight/fighter_anna.h"
+#include "lastexpress/fight/fighter_ivo.h"
+#include "lastexpress/fight/fighter_milos.h"
+#include "lastexpress/fight/fighter_salko.h"
+#include "lastexpress/fight/fighter_vesna.h"
+
+#include "lastexpress/data/cursor.h"
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/game/inventory.h"
+#include "lastexpress/game/logic.h"
+#include "lastexpress/game/object.h"
+#include "lastexpress/game/scenes.h"
+#include "lastexpress/game/state.h"
+
+#include "lastexpress/sound/queue.h"
+
+#include "lastexpress/graphics.h"
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+Fight::FightData::FightData() {
+ player = NULL;
+ opponent = NULL;
+
+ index = 0;
+
+ isFightRunning = false;
+}
+
+Fight::FightData::~FightData() {
+ SAFE_DELETE(player);
+ SAFE_DELETE(opponent);
+}
+
+Fight::Fight(LastExpressEngine *engine) : _engine(engine), _data(NULL), _endType(kFightEndLost), _state(0), _handleTimer(false) {
+}
+
+Fight::~Fight() {
+ clearData();
+ _data = NULL;
+
+ // Zero passed pointers
+ _engine = NULL;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Events
+//////////////////////////////////////////////////////////////////////////
+void Fight::eventMouse(const Common::Event &ev) {
+ if (!_data || _data->index)
+ return;
+
+ // TODO move all the egg handling to inventory functions
+
+ getFlags()->mouseLeftClick = false;
+ getFlags()->shouldRedraw = false;
+ getFlags()->mouseRightClick = false;
+
+ if (ev.mouse.x < 608 || ev.mouse.y < 448 || ev.mouse.x >= 640 || ev.mouse.x >= 480) {
+
+ // Handle right button click
+ if (ev.type == Common::EVENT_RBUTTONUP) {
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ setStopped();
+
+ getGlobalTimer() ? _state = 0 : ++_state;
+
+ getFlags()->mouseRightClick = true;
+ }
+
+ if (_handleTimer) {
+ // Timer expired => show with full brightness
+ if (!getGlobalTimer())
+ getInventory()->drawBlinkingEgg();
+
+ _handleTimer = false;
+ }
+
+ // Check hotspots
+ Scene *scene = getScenes()->get(getState()->scene);
+ SceneHotspot *hotspot = NULL;
+
+ if (!scene->checkHotSpot(ev.mouse, &hotspot)) {
+ _engine->getCursor()->setStyle(kCursorNormal);
+ } else {
+ _engine->getCursor()->setStyle((CursorStyle)hotspot->cursor);
+
+ // Call player function
+ if (_data->player->canInteract((Fighter::FightAction)hotspot->action)) {
+ if (ev.type == Common::EVENT_LBUTTONUP)
+ _data->player->handleAction((Fighter::FightAction)hotspot->action);
+ } else {
+ _engine->getCursor()->setStyle(kCursorNormal);
+ }
+ }
+ } else {
+ // Handle clicks on menu icon
+
+ if (!_handleTimer) {
+ // Timer expired => show with full brightness
+ if (!getGlobalTimer())
+ getInventory()->drawBlinkingEgg();
+
+ _handleTimer = true;
+ }
+
+ // Stop fight if clicked
+ if (ev.type == Common::EVENT_LBUTTONUP) {
+ _handleTimer = false;
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ bailout(kFightEndExit);
+ }
+
+ // Reset timer on right click
+ if (ev.type == Common::EVENT_RBUTTONUP) {
+ if (getGlobalTimer()) {
+ if (getSoundQueue()->isBuffered("TIMER"))
+ getSoundQueue()->removeFromQueue("TIMER");
+
+ setGlobalTimer(900);
+ }
+ }
+ }
+
+ getFlags()->shouldRedraw = true;
+}
+
+void Fight::eventTick(const Common::Event &ev) {
+ handleTick(ev, true);
+}
+
+void Fight::handleTick(const Common::Event &ev, bool isProcessing) {
+ // TODO move all the egg handling to inventory functions
+
+ // Blink egg
+ if (getGlobalTimer()) {
+ warning("[Fight::handleTick] Egg blinking not implemented");
+ }
+
+ if (!_data || _data->index)
+ return;
+
+ SceneHotspot *hotspot = NULL;
+ if (!getScenes()->get(getState()->scene)->checkHotSpot(ev.mouse, &hotspot) || !_data->player->canInteract((Fighter::FightAction)hotspot->action)) {
+ _engine->getCursor()->setStyle(kCursorNormal);
+ } else {
+ _engine->getCursor()->setStyle((CursorStyle)hotspot->cursor);
+ }
+
+ _data->player->update();
+ _data->opponent->update();
+
+ // Draw sequences
+ if (!_data->isFightRunning)
+ return;
+
+ if (isProcessing)
+ getScenes()->drawFrames(true);
+
+ if (_data->index) {
+ // Set next sequence name index
+ _data->index--;
+ _data->sequences[_data->index] = loadSequence(_data->names[_data->index]);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Setup
+//////////////////////////////////////////////////////////////////////////
+Fight::FightEndType Fight::setup(FightType type) {
+ if (_data)
+ error("[Fight::setup] Calling fight setup again while a fight is already in progress");
+
+ //////////////////////////////////////////////////////////////////////////
+ // Prepare UI & state
+ if (_state >= 5 && (type == kFightSalko || type == kFightVesna)) {
+ _state = 0;
+ return kFightEndWin;
+ }
+
+ getInventory()->showHourGlass();
+ // TODO events function
+ getFlags()->flag_0 = false;
+ getFlags()->mouseRightClick = false;
+ getEntities()->reset();
+
+ // Compute scene to use
+ SceneIndex sceneIndex;
+ switch(type) {
+ default:
+ sceneIndex = kSceneFightDefault;
+ break;
+
+ case kFightMilos:
+ sceneIndex = (getObjects()->get(kObjectCompartment1).location2 < kObjectLocation3) ? kSceneFightMilos : kSceneFightMilosBedOpened;
+ break;
+
+ case kFightAnna:
+ sceneIndex = kSceneFightAnna;
+ break;
+
+ case kFightIvo:
+ sceneIndex = kSceneFightIvo;
+ break;
+
+ case kFightSalko:
+ sceneIndex = kSceneFightSalko;
+ break;
+
+ case kFightVesna:
+ sceneIndex = kSceneFightVesna;
+ break;
+ }
+
+ if (getFlags()->shouldRedraw) {
+ getFlags()->shouldRedraw = false;
+ askForRedraw();
+ //redrawScreen();
+ }
+
+ // Load the scene object
+ Scene *scene = getScenes()->get(sceneIndex);
+
+ // Update game entities and state
+ getEntityData(kEntityPlayer)->entityPosition = scene->entityPosition;
+ getEntityData(kEntityPlayer)->location = scene->location;
+
+ getState()->scene = sceneIndex;
+
+ getFlags()->flag_3 = true;
+
+ // Draw the scene
+ _engine->getGraphicsManager()->draw(scene, GraphicsManager::kBackgroundC);
+ // FIXME move to start of fight?
+ askForRedraw();
+ redrawScreen();
+
+ //////////////////////////////////////////////////////////////////////////
+ // Setup the fight
+ _data = new FightData;
+ loadData(type);
+
+ // Show opponents & egg button
+ Common::Event emptyEvent;
+ handleTick(emptyEvent, false);
+ getInventory()->drawEgg();
+
+ // Start fight
+ _endType = kFightEndLost;
+ while (_data->isFightRunning) {
+ if (_engine->handleEvents())
+ continue;
+
+ getSoundQueue()->updateQueue();
+ }
+
+ // Cleanup after fight is over
+ clearData();
+
+ return _endType;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Status
+//////////////////////////////////////////////////////////////////////////
+void Fight::setStopped() {
+ if (_data)
+ _data->isFightRunning = false;
+}
+
+void Fight::bailout(FightEndType type) {
+ _state = 0;
+ _endType = type;
+ setStopped();
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Cleanup
+//////////////////////////////////////////////////////////////////////////
+void Fight::clearData() {
+ if (!_data)
+ return;
+
+ // Clear data
+ SAFE_DELETE(_data);
+
+ _engine->restoreEventHandlers();
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Loading
+//////////////////////////////////////////////////////////////////////////
+void Fight::loadData(FightType type) {
+ if (!_data)
+ error("[Fight::loadData] Data not initialized");
+
+ switch (type) {
+ default:
+ break;
+
+ case kFightMilos:
+ _data->player = new FighterPlayerMilos(_engine);
+ _data->opponent = new FighterOpponentMilos(_engine);
+ break;
+
+ case kFightAnna:
+ _data->player = new FighterPlayerAnna(_engine);
+ _data->opponent = new FighterOpponentAnna(_engine);
+ break;
+
+ case kFightIvo:
+ _data->player = new FighterPlayerIvo(_engine);
+ _data->opponent = new FighterOpponentIvo(_engine);
+ break;
+
+ case kFightSalko:
+ _data->player = new FighterPlayerSalko(_engine);
+ _data->opponent = new FighterOpponentSalko(_engine);
+ break;
+
+ case kFightVesna:
+ _data->player = new FighterPlayerVesna(_engine);
+ _data->opponent = new FighterOpponentVesna(_engine);
+ break;
+ }
+
+ if (!_data->player || !_data->opponent)
+ error("[Fight::loadData] Error loading fight data (type=%d)", type);
+
+ // Setup opponent pointers
+ setOpponents();
+
+ //////////////////////////////////////////////////////////////////////////
+ // Start running the fight
+ _data->isFightRunning = true;
+
+ if (_state < 5) {
+ _data->player->setSequenceAndDraw(0, Fighter::kFightSequenceType0);
+ _data->opponent->setSequenceAndDraw(0, Fighter::kFightSequenceType0);
+ goto end_load;
+ }
+
+ switch(type) {
+ default:
+ break;
+
+ case kFightMilos:
+ _data->opponent->setCountdown(1);
+ _data->player->setSequenceAndDraw(4, Fighter::kFightSequenceType0);
+ _data->opponent->setSequenceAndDraw(0, Fighter::kFightSequenceType0);
+ break;
+
+ case kFightIvo:
+ _data->opponent->setCountdown(1);
+ _data->player->setSequenceAndDraw(3, Fighter::kFightSequenceType0);
+ _data->opponent->setSequenceAndDraw(6, Fighter::kFightSequenceType0);
+ break;
+
+ case kFightVesna:
+ _data->opponent->setCountdown(1);
+ _data->player->setSequenceAndDraw(0, Fighter::kFightSequenceType0);
+ _data->player->setSequenceAndDraw(3, Fighter::kFightSequenceType2);
+ _data->opponent->setSequenceAndDraw(5, Fighter::kFightSequenceType0);
+ break;
+ }
+
+end_load:
+ // Setup event handlers
+ _engine->backupEventHandlers();
+ SET_EVENT_HANDLERS(Fight, this);
+}
+
+void Fight::setOpponents() {
+ _data->player->setOpponent(_data->opponent);
+ _data->opponent->setOpponent(_data->player);
+
+ _data->player->setFight(this);
+ _data->opponent->setFight(this);
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fight.h b/engines/lastexpress/fight/fight.h
new file mode 100644
index 0000000000..fffb520789
--- /dev/null
+++ b/engines/lastexpress/fight/fight.h
@@ -0,0 +1,125 @@
+/* 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 LASTEXPRESS_FIGHT_H
+#define LASTEXPRESS_FIGHT_H
+
+/*
+ Fight structure
+ ---------------
+ uint32 {4} - player struct
+ uint32 {4} - opponent struct
+ uint32 {4} - hasLost flag
+
+ byte {1} - isRunning
+
+ Fight participant structure
+ ---------------------------
+ uint32 {4} - function pointer
+ uint32 {4} - pointer to fight structure
+ uint32 {4} - pointer to opponent (fight participant structure)
+ uint32 {4} - array of sequences
+ uint32 {4} - number of sequences
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint16 {2} - ??
+ uint16 {2} - ?? - only for opponent structure
+ uint32 {4} - ?? - only for opponent structure
+
+*/
+
+#include "lastexpress/shared.h"
+
+#include "lastexpress/eventhandler.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+class Sequence;
+
+class Fighter;
+class Opponent;
+
+class Fight : public EventHandler {
+public:
+ enum FightEndType {
+ kFightEndWin = 0,
+ kFightEndLost = 1,
+ kFightEndExit = 2
+ };
+
+ Fight(LastExpressEngine *engine);
+ ~Fight();
+
+ FightEndType setup(FightType type);
+
+ void eventMouse(const Common::Event &ev);
+ void eventTick(const Common::Event &ev);
+
+ // State
+ bool isRunning() { return _data->isFightRunning; }
+ void setRunningState(bool state) { _data->isFightRunning = state; }
+ void bailout(FightEndType type);
+ void setStopped();
+ void resetState() { _state = 0; }
+ void setEndType(FightEndType endType) { _endType = endType; }
+
+private:
+ struct FightData {
+ Fighter *player;
+ Opponent *opponent;
+ int32 index;
+
+ Sequence *sequences[20];
+ Common::String names[20];
+
+ bool isFightRunning;
+
+ FightData();
+ ~FightData();
+ };
+
+ LastExpressEngine *_engine;
+ FightData *_data;
+ FightEndType _endType;
+ int _state;
+
+ bool _handleTimer;
+
+ // Events
+ void handleTick(const Common::Event &ev, bool unknown);
+
+ // Data
+ void loadData(FightType type);
+ void clearData();
+ void setOpponents();
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_FIGHT_H
diff --git a/engines/lastexpress/fight/fighter.cpp b/engines/lastexpress/fight/fighter.cpp
new file mode 100644
index 0000000000..bae7728a2b
--- /dev/null
+++ b/engines/lastexpress/fight/fighter.cpp
@@ -0,0 +1,249 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/fight/fighter.h"
+
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/game/scenes.h"
+
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+Fighter::Fighter(LastExpressEngine *engine) : _engine(engine) {
+ _opponent = NULL;
+ _fight = NULL;
+
+ _sequenceIndex = 0;
+ _sequence = NULL;
+ _frame = NULL;
+ _frameIndex = 0;
+
+ _field_24 = 0;
+
+ _action = kFightAction101;
+ _sequenceIndex2 = 0;
+
+ _countdown = 1;
+
+ _field_34 = 0;
+}
+
+Fighter::~Fighter() {
+ clearSequences();
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Cleanup
+//////////////////////////////////////////////////////////////////////////
+void Fighter::clearSequences() {
+ // The original game resets the function pointers to default values, just before deleting the struct
+
+ getScenes()->removeAndRedraw(&_frame, false);
+
+ // Free sequences
+ for (int i = 0; i < (int)_sequences.size(); i++)
+ SAFE_DELETE(_sequences[i]);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Drawing
+//////////////////////////////////////////////////////////////////////////
+void Fighter::setSequenceAndDraw(uint32 sequenceIndex, FightSequenceType type) {
+ if (_sequences.size() < sequenceIndex)
+ return;
+
+ switch (type) {
+ default:
+ break;
+
+ case kFightSequenceType0:
+ if (_sequenceIndex)
+ return;
+
+ _sequence = _sequences[sequenceIndex];
+ _sequenceIndex = sequenceIndex;
+ draw();
+ break;
+
+ case kFightSequenceType1:
+ _sequence = _sequences[sequenceIndex];
+ _sequenceIndex = sequenceIndex;
+ _sequenceIndex2 = 0;
+ draw();
+ break;
+
+ case kFightSequenceType2:
+ _sequenceIndex2 = sequenceIndex;
+ break;
+ }
+}
+
+void Fighter::draw() {
+ getScenes()->removeAndRedraw(&_frame, false);
+
+ _frameIndex = 0;
+ _field_24 = 0;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Processing
+//////////////////////////////////////////////////////////////////////////
+void Fighter::process() {
+ if (!_sequence) {
+ if (_frame) {
+ getScenes()->removeFromQueue(_frame);
+ getScenes()->setCoordinates(_frame);
+ }
+ SAFE_DELETE(_frame);
+ return;
+ }
+
+ if (_sequence->count() <= _frameIndex) {
+ switch(_action) {
+ default:
+ break;
+
+ case kFightAction101:
+ setSequenceAndDraw(_sequenceIndex2, kFightSequenceType1);
+ _sequenceIndex2 = 0;
+ break;
+
+ case kFightActionResetFrame:
+ _frameIndex = 0;
+ break;
+
+ case kFightAction103:
+ setSequenceAndDraw(0, kFightSequenceType1);
+ handleAction(kFightAction101);
+ _opponent->setSequenceAndDraw(0, kFightSequenceType1);
+ _opponent->handleAction(kFightAction101);
+ _opponent->update();
+ break;
+
+ case kFightActionWin:
+ _fight->bailout(Fight::kFightEndWin);
+ break;
+
+ case kFightActionLost:
+ _fight->bailout(Fight::kFightEndLost);
+ break;
+ }
+ }
+
+ if (_fight->isRunning()) {
+
+ // Get the current sequence frame
+ SequenceFrame *frame = new SequenceFrame(_sequence, (uint16)_frameIndex);
+ frame->getInfo()->location = 1;
+
+ if (_frame == frame) {
+ delete frame;
+ return;
+ }
+
+ getSound()->playFightSound(frame->getInfo()->soundAction, frame->getInfo()->field_31);
+
+ // Add current frame to queue and advance
+ getScenes()->addToQueue(frame);
+ _frameIndex++;
+
+ if (_frame) {
+ getScenes()->removeFromQueue(_frame);
+
+ if (!frame->getInfo()->field_2E)
+ getScenes()->setCoordinates(_frame);
+ }
+
+ // Replace by new frame
+ delete _frame;
+ _frame = frame;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Default actions
+//////////////////////////////////////////////////////////////////////////
+void Fighter::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ return;
+
+ case kFightAction101:
+ break;
+
+ case kFightActionResetFrame:
+ _countdown--;
+ break;
+
+ case kFightAction103:
+ _opponent->handleAction(kFightActionResetFrame);
+ break;
+
+ case kFightActionWin:
+ _fight->setEndType(Fight::kFightEndWin);
+ _opponent->handleAction(kFightActionResetFrame);
+ break;
+
+ case kFightActionLost:
+ _fight->setEndType(Fight::kFightEndLost);
+ _opponent->handleAction(kFightActionResetFrame);
+ break;
+ }
+
+ // Update action
+ _action = action;
+}
+
+bool Fighter::canInteract(FightAction /*action = kFightActionNone*/ ) {
+ return (_action == kFightAction101 && !_sequenceIndex);
+}
+
+void Fighter::update() {
+ process();
+
+ if (_frame)
+ _frame->getInfo()->location = (_action == kFightActionResetFrame ? 2 : 0);
+}
+
+void Opponent::update() {
+ process();
+
+ if (_field_38 && !_sequenceIndex)
+ _field_38--;
+
+ if (_frame)
+ _frame->getInfo()->location = 1;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Helpers
+//////////////////////////////////////////////////////////////////////////
+bool Fighter::checkFrame(uint32 val) {
+ return (_frame->getInfo()->field_33 & val);
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fighter.h b/engines/lastexpress/fight/fighter.h
new file mode 100644
index 0000000000..e37fe49d86
--- /dev/null
+++ b/engines/lastexpress/fight/fighter.h
@@ -0,0 +1,123 @@
+/* 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 LASTEXPRESS_FIGHTER_H
+#define LASTEXPRESS_FIGHTER_H
+
+#include "lastexpress/fight/fight.h"
+
+#include "common/array.h"
+
+namespace LastExpress {
+
+class Fight;
+class Sequence;
+class SequenceFrame;
+
+class Fighter {
+public:
+ enum FightAction {
+ kFightActionNone = 0,
+ kFightAction1 = 1,
+ kFightAction2 = 2,
+ kFightAction3 = 3,
+ kFightAction4 = 4,
+ kFightAction5 = 5,
+ kFightAction101 = 101,
+ kFightActionResetFrame = 102,
+ kFightAction103 = 103,
+ kFightActionWin = 104,
+ kFightActionLost = 105,
+ kFightAction128 = 128,
+ kFightAction129 = 129,
+ kFightAction130 = 130,
+ kFightAction131 = 131,
+ kFightAction132 = 132
+ };
+
+ enum FightSequenceType {
+ kFightSequenceType0 = 0,
+ kFightSequenceType1 = 1,
+ kFightSequenceType2 = 2
+ };
+
+ Fighter(LastExpressEngine *engine);
+ virtual ~Fighter();
+
+ // Default functions
+ virtual void handleAction(FightAction action);
+ virtual void update();
+ virtual bool canInteract(FightAction action = kFightActionNone);
+
+ // Drawing
+ void setSequenceAndDraw(uint32 sequenceIndex, FightSequenceType type);
+
+ // Accessors
+ void setOpponent(Fighter *opponent) { _opponent = opponent; }
+ void setCountdown(int32 countdown) { _countdown = countdown; }
+ void setFight(Fight *fight) { _fight = fight; }
+
+ int getCountdown() { return _countdown; }
+ uint32 getSequenceIndex() { return _sequenceIndex; }
+ uint32 getField34() { return _field_34; }
+
+protected:
+ LastExpressEngine *_engine;
+ Fight *_fight;
+ Fighter *_opponent;
+ Sequence *_sequence;
+ SequenceFrame *_frame;
+ uint32 _sequenceIndex;
+ Common::Array<Sequence *> _sequences;
+ uint32 _frameIndex;
+ uint32 _field_24;
+ FightAction _action;
+ uint32 _sequenceIndex2;
+ int32 _countdown; // countdown before loosing ?
+ uint32 _field_34;
+
+ // Drawing and processing
+ void draw();
+ void process();
+
+ // Cleanup
+ void clearSequences();
+
+ // Helpers
+ bool checkFrame(uint32 val);
+};
+
+class Opponent : public Fighter {
+public:
+ Opponent(LastExpressEngine *engine) : Fighter(engine) {
+ _field_38 = 0;
+ }
+
+ virtual void update();
+
+protected:
+ int32 _field_38;
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_FIGHTER_H
diff --git a/engines/lastexpress/fight/fighter_anna.cpp b/engines/lastexpress/fight/fighter_anna.cpp
new file mode 100644
index 0000000000..c7660cab1a
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_anna.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.
+ *
+ */
+
+#include "lastexpress/fight/fighter_anna.h"
+
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+//////////////////////////////////////////////////////////////////////////
+// Player
+//////////////////////////////////////////////////////////////////////////
+FighterPlayerAnna::FighterPlayerAnna(LastExpressEngine *engine) : Fighter(engine) {
+ _sequences.push_back(loadSequence("2002cr.seq"));
+ _sequences.push_back(loadSequence("2002cdl.seq"));
+ _sequences.push_back(loadSequence("2002cdr.seq"));
+ _sequences.push_back(loadSequence("2002cdm.seq"));
+ _sequences.push_back(loadSequence("2002lbk.seq"));
+}
+
+void FighterPlayerAnna::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ Fighter::handleAction(action);
+ return;
+
+ case kFightAction1:
+ if ((_sequenceIndex != 1 && _sequenceIndex != 3) || checkFrame(4)) {
+ setSequenceAndDraw(4, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(4, kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction2:
+ if ((_sequenceIndex != 2 && _sequenceIndex != 3) || checkFrame(4)) {
+ setSequenceAndDraw(4, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(5, kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction3:
+ if ((_sequenceIndex != 2 && _sequenceIndex != 1) || checkFrame(4)) {
+ setSequenceAndDraw(4, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(6, kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction128:
+ switch (_opponent->getSequenceIndex()) {
+ default:
+ setSequenceAndDraw(3, kFightSequenceType0);
+ break;
+
+ case 1:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 2:
+ setSequenceAndDraw(3, kFightSequenceType0);
+ break;
+
+ case 3:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+ }
+ break;
+ }
+
+ if (_field_34 > 4) {
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ _fight->bailout(Fight::kFightEndWin);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Opponent
+//////////////////////////////////////////////////////////////////////////
+FighterOpponentAnna::FighterOpponentAnna(LastExpressEngine *engine) : Opponent(engine) {
+ _sequences.push_back(loadSequence("2002or.seq"));
+ _sequences.push_back(loadSequence("2002oal.seq"));
+ _sequences.push_back(loadSequence("2002oam.seq"));
+ _sequences.push_back(loadSequence("2002oar.seq"));
+ _sequences.push_back(loadSequence("2002okr.seq"));
+ _sequences.push_back(loadSequence("2002okml.seq"));
+ _sequences.push_back(loadSequence("2002okm.seq"));
+
+ getSound()->playSound(kEntityTables0, "MUS030", kFlagDefault);
+
+ _field_38 = 30;
+}
+
+void FighterOpponentAnna::update() {
+ if (!_field_38 && canInteract(kFightAction1) && !_sequenceIndex2) {
+
+ if (_opponent->getField34() >= 2) {
+ switch (rnd(6)) {
+ default:
+ break;
+
+ case 0:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 1:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+
+ case 2:
+ setSequenceAndDraw(3, kFightSequenceType0);
+ break;
+
+ case 3:
+ setSequenceAndDraw(3, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+
+ case 4:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+
+ case 5:
+ setSequenceAndDraw(3, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+ }
+ }
+
+ // Update field_38
+ _field_38 = (int32)rnd(15);
+ }
+
+ if (_frame && checkFrame(2)) {
+ if (_sequenceIndex == 1 || _sequenceIndex == 2 || _sequenceIndex == 3)
+ _opponent->handleAction((FightAction)_sequenceIndex);
+
+ if (_opponent->getCountdown() <= 0) {
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ handleAction(kFightActionLost);
+ }
+ }
+
+ Fighter::update();
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fighter_anna.h b/engines/lastexpress/fight/fighter_anna.h
new file mode 100644
index 0000000000..abb6f9dc64
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_anna.h
@@ -0,0 +1,48 @@
+/* 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 LASTEXPRESS_FIGHTER_ANNA_H
+#define LASTEXPRESS_FIGHTER_ANNA_H
+
+#include "lastexpress/fight/fighter.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+
+class FighterPlayerAnna : public Fighter {
+public:
+ FighterPlayerAnna(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+};
+
+class FighterOpponentAnna : public Opponent {
+public:
+ FighterOpponentAnna(LastExpressEngine *engine);
+
+ virtual void update();
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_FIGHTER_ANNA_H
diff --git a/engines/lastexpress/fight/fighter_ivo.cpp b/engines/lastexpress/fight/fighter_ivo.cpp
new file mode 100644
index 0000000000..87a52c6be4
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_ivo.cpp
@@ -0,0 +1,245 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/fight/fighter_ivo.h"
+
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+//////////////////////////////////////////////////////////////////////////
+// Player
+//////////////////////////////////////////////////////////////////////////
+FighterPlayerIvo::FighterPlayerIvo(LastExpressEngine *engine) : Fighter(engine) {
+ _sequences.push_back(loadSequence("2003cr.seq"));
+ _sequences.push_back(loadSequence("2003car.seq"));
+ _sequences.push_back(loadSequence("2003cal.seq"));
+ _sequences.push_back(loadSequence("2003cdr.seq"));
+ _sequences.push_back(loadSequence("2003cdm.seq"));
+ _sequences.push_back(loadSequence("2003chr.seq"));
+ _sequences.push_back(loadSequence("2003chl.seq"));
+ _sequences.push_back(loadSequence("2003ckr.seq"));
+ _sequences.push_back(loadSequence("2003lbk.seq"));
+ _sequences.push_back(loadSequence("2003fbk.seq"));
+
+ _countdown = 5;
+}
+
+void FighterPlayerIvo::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ Fighter::handleAction(action);
+ return;
+
+ case kFightAction1:
+ if (_sequenceIndex != 1 || checkFrame(4)) {
+ setSequenceAndDraw(7, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(4, kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+ update();
+ }
+ break;
+
+ case kFightAction2:
+ if ((_sequenceIndex != 2 && _sequenceIndex != 3) || checkFrame(4)) {
+ setSequenceAndDraw(7, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(5, kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+ update();
+ }
+ break;
+
+ case kFightAction128:
+ switch (_opponent->getSequenceIndex()) {
+ default:
+ case 1:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 2:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+ }
+ break;
+
+ case kFightAction129:
+ setSequenceAndDraw((_opponent->getCountdown() > 1) ? 4 : 3, _sequenceIndex ? kFightSequenceType2 : kFightSequenceType0);
+ break;
+
+ case kFightAction130:
+ setSequenceAndDraw(3, _sequenceIndex ? kFightSequenceType2 : kFightSequenceType0);
+ break;
+ }
+}
+
+void FighterPlayerIvo::update() {
+
+ if ((_sequenceIndex == 3 || _sequenceIndex == 4) && !_frameIndex)
+ _opponent->handleAction(kFightAction131);
+
+ if (_frame && checkFrame(2)) {
+
+ // Draw sequences
+ if (_opponent->getCountdown() <= 0) {
+ setSequenceAndDraw(9, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(8, kFightSequenceType1);
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+
+ handleAction(kFightActionWin);
+ return;
+ }
+
+ if (_sequenceIndex == 3 || _sequenceIndex == 4)
+ _opponent->handleAction((FightAction)_sequenceIndex);
+ }
+
+ Fighter::update();
+}
+
+bool FighterPlayerIvo::canInteract(FightAction action) {
+ if (action == kFightAction129 || action == kFightAction130)
+ return (_sequenceIndex >= 8);
+
+ return Fighter::canInteract();
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Opponent
+//////////////////////////////////////////////////////////////////////////
+FighterOpponentIvo::FighterOpponentIvo(LastExpressEngine *engine) : Opponent(engine) {
+ _sequences.push_back(loadSequence("2003or.seq"));
+ _sequences.push_back(loadSequence("2003oal.seq"));
+ _sequences.push_back(loadSequence("2003oar.seq"));
+ _sequences.push_back(loadSequence("2003odm.seq"));
+ _sequences.push_back(loadSequence("2003okl.seq"));
+ _sequences.push_back(loadSequence("2003okj.seq"));
+ _sequences.push_back(loadSequence("blank.seq"));
+ _sequences.push_back(loadSequence("csdr.seq"));
+ _sequences.push_back(loadSequence("2003l.seq"));
+
+ getSound()->playSound(kEntityTables0, "MUS032", kFlagDefault);
+
+ _countdown = 5;
+ _field_38 = 15;
+}
+
+void FighterOpponentIvo::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ Fighter::handleAction(action);
+ break;
+
+ case kFightAction3:
+ if ((_sequenceIndex != 1 && _sequenceIndex != 3) || checkFrame(4)) {
+ setSequenceAndDraw(6, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(6, kFightSequenceType1);
+ _opponent->handleAction(kFightAction103);
+ }
+ break;
+
+ case kFightAction4:
+ if ((_sequenceIndex != 2 && _sequenceIndex != 3) || checkFrame(4)) {
+ setSequenceAndDraw(6, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(5, kFightSequenceType1);
+ _opponent->handleAction(kFightAction103);
+ }
+ break;
+
+ case kFightAction131:
+ if (_sequenceIndex)
+ break;
+
+ if (rnd(100) <= (unsigned int)(_countdown > 2 ? 60 : 75)) {
+ setSequenceAndDraw(3 , kFightSequenceType1);
+ if (_opponent->getSequenceIndex() == 4)
+ setSequenceAndDraw(2, kFightSequenceType2);
+ }
+ break;
+ }
+}
+
+void FighterOpponentIvo::update() {
+ if (!_field_38 && canInteract(kFightAction1) && !_sequenceIndex2) {
+
+ if (_opponent->getField34() >= 2) {
+ switch (rnd(5)) {
+ default:
+ break;
+
+ case 0:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 1:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+
+ case 2:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+
+ case 3:
+ setSequenceAndDraw(0, kFightSequenceType2);
+ setSequenceAndDraw(1, kFightSequenceType2);
+ break;
+
+ case 4:
+ setSequenceAndDraw(0, kFightSequenceType1);
+ setSequenceAndDraw(1, kFightSequenceType2);
+ break;
+ }
+ }
+
+ // Update field_38
+ _field_38 = 3 * _countdown + (int32)rnd(10);
+ }
+
+ if (_frame && checkFrame(2)) {
+
+ if (_opponent->getCountdown() <= 0) {
+ setSequenceAndDraw(7, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(8, kFightSequenceType1);
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+
+ _opponent->handleAction(kFightActionWin);
+
+ return;
+ }
+
+ if (_sequenceIndex == 1 || _sequenceIndex == 2)
+ _opponent->handleAction((FightAction)_sequenceIndex);
+ }
+
+ Fighter::update();
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fighter_ivo.h b/engines/lastexpress/fight/fighter_ivo.h
new file mode 100644
index 0000000000..ca54fea904
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_ivo.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.
+ *
+ */
+
+#ifndef LASTEXPRESS_FIGHTER_IVO_H
+#define LASTEXPRESS_FIGHTER_IVO_H
+
+#include "lastexpress/fight/fighter.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+
+class FighterPlayerIvo : public Fighter {
+public:
+ FighterPlayerIvo(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+ virtual bool canInteract(FightAction action = kFightActionNone);
+};
+
+class FighterOpponentIvo : public Opponent {
+public:
+ FighterOpponentIvo(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_FIGHTER_IVO_H
diff --git a/engines/lastexpress/fight/fighter_milos.cpp b/engines/lastexpress/fight/fighter_milos.cpp
new file mode 100644
index 0000000000..9f8e726165
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_milos.cpp
@@ -0,0 +1,222 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/fight/fighter_milos.h"
+
+#include "lastexpress/data/cursor.h"
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+//////////////////////////////////////////////////////////////////////////
+// Player
+//////////////////////////////////////////////////////////////////////////
+FighterPlayerMilos::FighterPlayerMilos(LastExpressEngine *engine) : Fighter(engine) {
+ _sequences.push_back(loadSequence("2001cr.seq"));
+ _sequences.push_back(loadSequence("2001cdl.seq"));
+ _sequences.push_back(loadSequence("2001cdr.seq"));
+ _sequences.push_back(loadSequence("2001cdm.seq"));
+ _sequences.push_back(loadSequence("2001csgr.seq"));
+ _sequences.push_back(loadSequence("2001csgl.seq"));
+ _sequences.push_back(loadSequence("2001dbk.seq"));
+}
+
+void FighterPlayerMilos::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ Fighter::handleAction(action);
+ return;
+
+ case kFightAction1:
+ if (_sequenceIndex != 1 || checkFrame(4)) {
+ setSequenceAndDraw(6, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(3, kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction2:
+ if ((_sequenceIndex != 2 && _sequenceIndex != 3) || checkFrame(4)) {
+ setSequenceAndDraw(6, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(4, kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction128:
+ if (_sequenceIndex != 1 || checkFrame(4) || _opponent->getSequenceIndex() != 1) {
+ switch (_opponent->getSequenceIndex()) {
+ default:
+ setSequenceAndDraw(rnd(3) + 1, kFightSequenceType0);
+ break;
+
+ case 1:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 2:
+ setSequenceAndDraw(3, kFightSequenceType0);
+ break;
+ }
+ } else {
+ setSequenceAndDraw(4, kFightSequenceType1);
+ update();
+ }
+ break;
+ }
+}
+
+void FighterPlayerMilos::update() {
+ if (_frame && checkFrame(2)) {
+
+ // Draw sequences
+ if (_opponent->getCountdown() <= 0) {
+ setSequenceAndDraw(5, kFightSequenceType1);
+ _opponent->setSequenceAndDraw(6, kFightSequenceType1);
+
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ getSound()->playSound(kEntityTrain, "MUS029", kFlagDefault);
+
+ handleAction(kFightActionWin);
+ }
+
+ if (_sequenceIndex == 4) {
+ _opponent->handleAction(kFightAction4);
+ _fight->setEndType(Fight::kFightEndLost);
+ }
+ }
+
+ Fighter::update();
+}
+
+bool FighterPlayerMilos::canInteract(FightAction action) {
+ if (action != kFightAction128
+ || _sequenceIndex != 1
+ || !_frame
+ || checkFrame(4)
+ || _opponent->getSequenceIndex() != 1) {
+ return Fighter::canInteract();
+ }
+
+ _engine->getCursor()->setStyle(kCursorHand);
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Opponent
+//////////////////////////////////////////////////////////////////////////
+FighterOpponentMilos::FighterOpponentMilos(LastExpressEngine *engine) : Opponent(engine) {
+ _sequences.push_back(loadSequence("2001or.seq"));
+ _sequences.push_back(loadSequence("2001oal.seq"));
+ _sequences.push_back(loadSequence("2001oam.seq"));
+ _sequences.push_back(loadSequence("2001okl.seq"));
+ _sequences.push_back(loadSequence("2001okm.seq"));
+ _sequences.push_back(loadSequence("2001dbk.seq"));
+ _sequences.push_back(loadSequence("2001wbk.seq"));
+
+ getSound()->playSound(kEntityTables0, "MUS027", kFlagDefault);
+
+ _field_38 = 35;
+}
+
+void FighterOpponentMilos::handleAction(FightAction action) {
+ if (action == kFightAction4) {
+ setSequenceAndDraw(5, kFightSequenceType1);
+ _opponent->handleAction(kFightAction103);
+ } else {
+ if (action != kFightAction131)
+ Fighter::handleAction(action);
+ }
+}
+
+void FighterOpponentMilos::update() {
+ if (!_field_38 && canInteract(kFightAction1) && !_sequenceIndex2) {
+
+ if (_opponent->getField34() >= 2) {
+ switch (rnd(5)) {
+ default:
+ break;
+
+ case 0:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 1:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+
+ case 2:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType1);
+ break;
+
+ case 3:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+
+ case 4:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(1, kFightSequenceType2);
+ break;
+ }
+ } else {
+ setSequenceAndDraw(2, kFightSequenceType0);
+ }
+
+ // Update field_38
+ if (_opponent->getField34() < 5)
+ _field_38 = 6 * (5 - _opponent->getField34());
+ else
+ _field_38 = 0;
+ }
+
+ if (_frame && checkFrame(2)) {
+ if (_sequenceIndex == 1 || _sequenceIndex == 2)
+ _opponent->handleAction((FightAction)_sequenceIndex);
+
+ if (_opponent->getCountdown() <= 0) {
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ handleAction(kFightActionLost);
+ }
+ }
+
+ Fighter::update();
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fighter_milos.h b/engines/lastexpress/fight/fighter_milos.h
new file mode 100644
index 0000000000..2126dd1838
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_milos.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.
+ *
+ */
+
+#ifndef LASTEXPRESS_FIGHTER_MILOS_H
+#define LASTEXPRESS_FIGHTER_MILOS_H
+
+#include "lastexpress/fight/fighter.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+
+class FighterPlayerMilos : public Fighter {
+public:
+ FighterPlayerMilos(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+ virtual bool canInteract(FightAction action = kFightActionNone);
+};
+
+class FighterOpponentMilos : public Opponent {
+public:
+ FighterOpponentMilos(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_FIGHTER_MILOS_H
diff --git a/engines/lastexpress/fight/fighter_salko.cpp b/engines/lastexpress/fight/fighter_salko.cpp
new file mode 100644
index 0000000000..1082674235
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_salko.cpp
@@ -0,0 +1,202 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/fight/fighter_salko.h"
+
+#include "lastexpress/data/cursor.h"
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+//////////////////////////////////////////////////////////////////////////
+// Player
+//////////////////////////////////////////////////////////////////////////
+FighterPlayerSalko::FighterPlayerSalko(LastExpressEngine *engine) : Fighter(engine) {
+ _sequences.push_back(loadSequence("2004cr.seq"));
+ _sequences.push_back(loadSequence("2004cdr.seq"));
+ _sequences.push_back(loadSequence("2004chj.seq"));
+ _sequences.push_back(loadSequence("2004bk.seq"));
+
+ _countdown = 2;
+}
+
+void FighterPlayerSalko::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ Fighter::handleAction(action);
+ return;
+
+ case kFightAction1:
+ case kFightAction2:
+ if (_sequenceIndex != 1 && checkFrame(4)) {
+ _field_34 = 0;
+
+ setSequenceAndDraw(3, kFightSequenceType1);
+ _opponent->setSequenceAndDraw((action == kFightAction1 ? 3 : 4), kFightSequenceType1);
+
+ _opponent->handleAction(kFightAction103);
+
+ if (action == kFightAction2)
+ _countdown= 0;
+
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction5:
+ if (_sequenceIndex != 3) {
+ _opponent->handleAction(kFightAction103);
+ update();
+ }
+ break;
+
+ case kFightAction128:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ _field_34 = 0;
+ break;
+
+ case kFightAction131:
+ setSequenceAndDraw(2, (_sequenceIndex ? kFightSequenceType2 : kFightSequenceType0));
+ break;
+ }
+}
+
+void FighterPlayerSalko::update() {
+ Fighter::update();
+
+ // The original doesn't check for currentSequence2 != NULL (might not happen when everything is working properly, but crashes with our current implementation)
+ if (_frame && checkFrame(2)) {
+
+ if (_opponent->getCountdown() <= 0) {
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ _fight->bailout(Fight::kFightEndWin);
+
+ return;
+ }
+
+ if (_sequenceIndex == 2)
+ _opponent->handleAction(kFightAction2);
+ }
+}
+
+bool FighterPlayerSalko::canInteract(FightAction action) {
+ if (action == kFightAction131) {
+ if (_sequenceIndex == 1) {
+ if (_opponent->getCountdown() <= 0)
+ _engine->getCursor()->setStyle(kCursorHand);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ return Fighter::canInteract();
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Opponent
+//////////////////////////////////////////////////////////////////////////
+FighterOpponentSalko::FighterOpponentSalko(LastExpressEngine *engine) : Opponent(engine) {
+ _sequences.push_back(loadSequence("2004or.seq"));
+ _sequences.push_back(loadSequence("2004oam.seq"));
+ _sequences.push_back(loadSequence("2004oar.seq"));
+ _sequences.push_back(loadSequence("2004okr.seq"));
+ _sequences.push_back(loadSequence("2004ohm.seq"));
+ _sequences.push_back(loadSequence("blank.seq"));
+
+ getSound()->playSound(kEntityTables0, "MUS035", kFlagDefault);
+
+ _countdown = 3;
+ _field_38 = 30;
+}
+
+void FighterOpponentSalko::handleAction(FightAction action) {
+ if (action == kFightAction2) {
+ setSequenceAndDraw(5, kFightSequenceType1);
+ _opponent->handleAction(kFightAction103);
+ } else {
+ Fighter::handleAction(action);
+ }
+}
+
+void FighterOpponentSalko::update() {
+ if (!_field_38 && canInteract(kFightAction1) && !_sequenceIndex2) {
+
+ switch (rnd(5)) {
+ default:
+ break;
+
+ case 0:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 1:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+
+ case 2:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+
+ case 3:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ setSequenceAndDraw(1, kFightSequenceType2);
+ break;
+
+ case 4:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(1, kFightSequenceType2);
+ break;
+ }
+
+ // Update field_38
+ _field_38 = 4 * _countdown;
+ }
+
+ if (_frame && checkFrame(2)) {
+ if (_opponent->getCountdown() <= 0) {
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ _fight->bailout(Fight::kFightEndLost);
+
+ // Stop processing
+ return;
+ }
+
+ if (_sequenceIndex == 1 || _sequenceIndex == 2)
+ _opponent->handleAction((FightAction)_sequenceIndex);
+ }
+
+ Fighter::update();
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fighter_salko.h b/engines/lastexpress/fight/fighter_salko.h
new file mode 100644
index 0000000000..0a2a615867
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_salko.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.
+ *
+ */
+
+#ifndef LASTEXPRESS_FIGHTER_SALKO_H
+#define LASTEXPRESS_FIGHTER_SALKO_H
+
+#include "lastexpress/fight/fighter.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+
+class FighterPlayerSalko : public Fighter {
+public:
+ FighterPlayerSalko(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+ virtual bool canInteract(FightAction action = kFightActionNone);
+};
+
+class FighterOpponentSalko : public Opponent {
+public:
+ FighterOpponentSalko(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_FIGHTER_SALKO_H
diff --git a/engines/lastexpress/fight/fighter_vesna.cpp b/engines/lastexpress/fight/fighter_vesna.cpp
new file mode 100644
index 0000000000..02aaa1c16c
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_vesna.cpp
@@ -0,0 +1,265 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/fight/fighter_vesna.h"
+
+#include "lastexpress/data/cursor.h"
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+//////////////////////////////////////////////////////////////////////////
+// Player
+//////////////////////////////////////////////////////////////////////////
+FighterPlayerVesna::FighterPlayerVesna(LastExpressEngine *engine) : Fighter(engine) {
+ _sequences.push_back(loadSequence("2005cr.seq"));
+ _sequences.push_back(loadSequence("2005cdr.seq"));
+ _sequences.push_back(loadSequence("2005cbr.seq"));
+ _sequences.push_back(loadSequence("2005bk.seq"));
+ _sequences.push_back(loadSequence("2005cdm1.seq"));
+ _sequences.push_back(loadSequence("2005chl.seq"));
+}
+
+void FighterPlayerVesna::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ Fighter::handleAction(action);
+ return;
+
+ case kFightAction1:
+ if (_sequenceIndex != 1) {
+ _opponent->handleAction(kFightAction103);
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction2:
+ if (_sequenceIndex != 2) {
+ _opponent->handleAction(kFightAction103);
+ update();
+ } else {
+ _field_34++;
+ }
+ break;
+
+ case kFightAction5:
+ if (_sequenceIndex != 3) {
+ _opponent->handleAction(kFightAction103);
+ update();
+ }
+ break;
+
+ case kFightAction128:
+ if (_sequenceIndex == 1 && _opponent->getSequenceIndex() == 1 && checkFrame(4)) {
+ setSequenceAndDraw(5, kFightSequenceType1);
+ } else {
+ setSequenceAndDraw((_opponent->getSequenceIndex() == 5) ? 3 : 1, kFightSequenceType0);
+ }
+ break;
+
+ case kFightAction132:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+ }
+
+ if (_field_34 > 10) {
+ _opponent->setSequenceAndDraw(5, kFightSequenceType2);
+ _opponent->setCountdown(1);
+ _field_34 = 0;
+ }
+}
+
+void FighterPlayerVesna::update() {
+ if (_frame && checkFrame(2)) {
+
+ if (_sequenceIndex == 3)
+ _opponent->handleAction(kFightAction3);
+
+ if (_opponent->getCountdown() <= 0) {
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+ _fight->bailout(Fight::kFightEndWin);
+ return;
+ }
+
+ if (_sequenceIndex == 5)
+ _opponent->handleAction(kFightAction5);
+ }
+
+ Fighter::update();
+}
+
+bool FighterPlayerVesna::canInteract(FightAction action) {
+ if (action != kFightAction128)
+ return Fighter::canInteract();
+
+ if (_sequenceIndex != 1) {
+
+ if (_opponent->getSequenceIndex() == 5) {
+ _engine->getCursor()->setStyle(kCursorDown);
+ return true;
+ }
+
+ return Fighter::canInteract();
+ }
+
+ if (_opponent->getSequenceIndex() == 1 && checkFrame(4)) {
+ _engine->getCursor()->setStyle(kCursorPunchLeft);
+ return true;
+ }
+
+ return false;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Opponent
+//////////////////////////////////////////////////////////////////////////
+FighterOpponentVesna::FighterOpponentVesna(LastExpressEngine *engine) : Opponent(engine) {
+ _sequences.push_back(loadSequence("2005or.seq"));
+ _sequences.push_back(loadSequence("2005oam.seq"));
+ _sequences.push_back(loadSequence("2005oar.seq"));
+ _sequences.push_back(loadSequence("2005okml.seq"));
+ _sequences.push_back(loadSequence("2005okr.seq"));
+ _sequences.push_back(loadSequence("2005odm1.seq"));
+ _sequences.push_back(loadSequence("2005csbm.seq"));
+ _sequences.push_back(loadSequence("2005oam4.seq"));
+
+ getSound()->playSound(kEntityTables0, "MUS038", kFlagDefault);
+
+ _countdown = 4;
+ _field_38 = 30;
+}
+
+void FighterOpponentVesna::handleAction(FightAction action) {
+ switch (action) {
+ default:
+ Fighter::handleAction(action);
+ break;
+
+ case kFightAction3:
+ _opponent->handleAction(kFightAction103);
+ break;
+
+ case kFightAction5:
+ setSequenceAndDraw(7, kFightSequenceType1);
+ _opponent->handleAction(kFightAction103);
+ if (_countdown <= 1)
+ _countdown = 1;
+ break;
+
+ case kFightAction131:
+ break;
+ }
+}
+
+void FighterOpponentVesna::update() {
+ if (!_field_38 && canInteract(kFightAction1) && !_sequenceIndex2) {
+
+ if (_opponent->getField34() == 1) {
+ setSequenceAndDraw(2, kFightSequenceType0);
+ } else {
+ switch (rnd(6)) {
+ default:
+ break;
+
+ case 0:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ break;
+
+ case 1:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(1, kFightSequenceType2);
+ break;
+
+ case 2:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ break;
+
+ case 3:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+
+ case 4:
+ setSequenceAndDraw(1, kFightSequenceType0);
+ setSequenceAndDraw(2, kFightSequenceType2);
+ break;
+
+ case 5:
+ setSequenceAndDraw(2, kFightSequenceType0);
+ setSequenceAndDraw(1, kFightSequenceType2);
+ break;
+ }
+ }
+
+ // Update field_38
+ _field_38 = 4 * _countdown;
+ }
+
+ if (_frame && checkFrame(2)) {
+ if (_sequenceIndex == 1 || _sequenceIndex == 2 || _sequenceIndex == 5)
+ _opponent->handleAction((FightAction)_sequenceIndex);
+
+ if (_opponent->getCountdown() <= 0) {
+
+ switch (_sequenceIndex) {
+ default:
+ break;
+
+ case 1:
+ setSequenceAndDraw(3, kFightSequenceType1);
+ break;
+
+ case 2:
+ setSequenceAndDraw(4, kFightSequenceType1);
+ break;
+
+ case 5:
+ setSequenceAndDraw(6, kFightSequenceType1);
+ break;
+ }
+
+ _opponent->setSequenceAndDraw(4, kFightSequenceType1);
+
+ handleAction(kFightActionLost);
+ _opponent->update();
+ Fighter::update();
+
+ getSoundQueue()->removeFromQueue(kEntityTables0);
+
+ // Stop processing
+ return;
+ }
+ }
+
+ Fighter::update();
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fighter_vesna.h b/engines/lastexpress/fight/fighter_vesna.h
new file mode 100644
index 0000000000..5c8ec855ae
--- /dev/null
+++ b/engines/lastexpress/fight/fighter_vesna.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.
+ *
+ */
+
+#ifndef LASTEXPRESS_FIGHTER_VESNA_H
+#define LASTEXPRESS_FIGHTER_VESNA_H
+
+#include "lastexpress/fight/fighter.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+
+class FighterPlayerVesna : public Fighter {
+public:
+ FighterPlayerVesna(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+ virtual bool canInteract(FightAction action = kFightActionNone);
+};
+
+class FighterOpponentVesna : public Opponent {
+public:
+ FighterOpponentVesna(LastExpressEngine *engine);
+
+ virtual void handleAction(FightAction action);
+ virtual void update();
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_FIGHTER_VESNA_H
diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp
index 7540d18ed8..2ef4c20d70 100644
--- a/engines/lastexpress/game/action.cpp
+++ b/engines/lastexpress/game/action.cpp
@@ -39,9 +39,11 @@
#include "lastexpress/game/savegame.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
#include "lastexpress/resource.h"
@@ -405,7 +407,7 @@ SceneIndex Action::processHotspot(const SceneHotspot &hotspot) {
//////////////////////////////////////////////////////////////////////////
// Action 0
IMPLEMENT_ACTION(dummy)
- warning("Action::action_dummy: Dummy action function called (hotspot action: %d)!", hotspot.action);
+ warning("[Action::action_dummy] Dummy action function called (hotspot action: %d)", hotspot.action);
return kSceneInvalid;
}
@@ -453,7 +455,7 @@ IMPLEMENT_ACTION(savePoint)
IMPLEMENT_ACTION(playSound)
// Check that the file is not already buffered
- if (hotspot.param2 || !getSound()->isBuffered(Common::String::format("LIB%03d", hotspot.param1), true))
+ if (hotspot.param2 || !getSoundQueue()->isBuffered(Common::String::format("LIB%03d", hotspot.param1), true))
getSound()->playSoundEvent(kEntityPlayer, hotspot.param1, hotspot.param2);
return kSceneInvalid;
@@ -465,8 +467,8 @@ IMPLEMENT_ACTION(playMusic)
// Check that the file is not already buffered
Common::String filename = Common::String::format("MUS%03d", hotspot.param1);
- if (!getSound()->isBuffered(filename) && (hotspot.param1 != 50 || getProgress().chapter == kChapter5))
- getSound()->playSound(kEntityPlayer, filename, SoundManager::kFlagDefault, hotspot.param2);
+ if (!getSoundQueue()->isBuffered(filename) && (hotspot.param1 != 50 || getProgress().chapter == kChapter5))
+ getSound()->playSound(kEntityPlayer, filename, kFlagDefault, hotspot.param2);
return kSceneInvalid;
}
@@ -481,7 +483,7 @@ IMPLEMENT_ACTION(knock)
if (getObjects()->get(object).entity) {
getSavePoints()->push(kEntityPlayer, getObjects()->get(object).entity, kActionKnock, object);
} else {
- if (!getSound()->isBuffered("LIB012", true))
+ if (!getSoundQueue()->isBuffered("LIB012", true))
getSound()->playSoundEvent(kEntityPlayer, 12);
}
@@ -516,7 +518,7 @@ IMPLEMENT_ACTION(compartment)
&& (compartment != kObjectCompartment1
|| !getInventory()->hasItem(kItemKey)
|| (getInventory()->getSelectedItem() != kItemFirebird && getInventory()->getSelectedItem() != kItemBriefcase)))) {
- if (!getSound()->isBuffered("LIB13"))
+ if (!getSoundQueue()->isBuffered("LIB13"))
getSound()->playSoundEvent(kEntityPlayer, 13);
// Stop processing further
@@ -621,7 +623,7 @@ IMPLEMENT_ACTION(updateObjetLocation2)
getObjects()->updateLocation2(object, location);
- if (object != kObject112 || getSound()->isBuffered("LIB096")) {
+ if (object != kObject112 || getSoundQueue()->isBuffered("LIB096")) {
if (object == 1)
getSound()->playSoundEvent(kEntityPlayer, 73);
} else {
@@ -805,8 +807,8 @@ IMPLEMENT_ACTION(enterCompartment)
getSound()->playSoundEvent(kEntityPlayer, 14);
getSound()->playSoundEvent(kEntityPlayer, 15, 22);
- if (getProgress().field_78 && !getSound()->isBuffered("MUS003")) {
- getSound()->playSound(kEntityPlayer, "MUS003", SoundManager::kFlagDefault);
+ if (getProgress().field_78 && !getSoundQueue()->isBuffered("MUS003")) {
+ getSound()->playSound(kEntityPlayer, "MUS003", kFlagDefault);
getProgress().field_78 = 0;
}
@@ -1083,8 +1085,8 @@ IMPLEMENT_ACTION(25)
break;
case 2:
- if (!getSound()->isBuffered("MUS021"))
- getSound()->playSound(kEntityPlayer, "MUS021", SoundManager::kFlagDefault);
+ if (!getSoundQueue()->isBuffered("MUS021"))
+ getSound()->playSound(kEntityPlayer, "MUS021", kFlagDefault);
break;
case 3:
@@ -1134,7 +1136,7 @@ IMPLEMENT_ACTION(26)
//////////////////////////////////////////////////////////////////////////
// Action 27
IMPLEMENT_ACTION(27)
- if (!getSound()->isBuffered("LIB031", true))
+ if (!getSoundQueue()->isBuffered("LIB031", true))
getSound()->playSoundEvent(kEntityPlayer, 31);
switch (getEntityData(kEntityPlayer)->car) {
@@ -1182,8 +1184,8 @@ IMPLEMENT_ACTION(29)
getSound()->playSoundEvent(kEntityPlayer, hotspot.param1, hotspot.param2);
Common::String filename = Common::String::format("MUS%03d", hotspot.param3);
- if (!getSound()->isBuffered(filename))
- getSound()->playSound(kEntityPlayer, filename, SoundManager::kFlagDefault);
+ if (!getSoundQueue()->isBuffered(filename))
+ getSound()->playSound(kEntityPlayer, filename, kFlagDefault);
return kSceneInvalid;
}
@@ -1345,7 +1347,7 @@ IMPLEMENT_ACTION(openBed)
//////////////////////////////////////////////////////////////////////////
// Action 37
IMPLEMENT_ACTION(dialog)
- getSound()->playDialog(kEntityTables4, (EntityIndex)hotspot.param1, SoundManager::kFlagDefault, 0);
+ getSound()->playDialog(kEntityTables4, (EntityIndex)hotspot.param1, kFlagDefault, 0);
return kSceneInvalid;
}
@@ -1354,8 +1356,8 @@ IMPLEMENT_ACTION(dialog)
// Action 38
IMPLEMENT_ACTION(eggBox)
getSound()->playSoundEvent(kEntityPlayer, 43);
- if (getProgress().field_7C && !getSound()->isBuffered("MUS003")) {
- getSound()->playSound(kEntityPlayer, "MUS003", SoundManager::kFlagDefault);
+ if (getProgress().field_7C && !getSoundQueue()->isBuffered("MUS003")) {
+ getSound()->playSound(kEntityPlayer, "MUS003", kFlagDefault);
getProgress().field_7C = 0;
}
@@ -1366,8 +1368,8 @@ IMPLEMENT_ACTION(eggBox)
// Action 39
IMPLEMENT_ACTION(39)
getSound()->playSoundEvent(kEntityPlayer, 24);
- if (getProgress().field_80 && !getSound()->isBuffered("MUS003")) {
- getSound()->playSound(kEntityPlayer, "MUS003", SoundManager::kFlagDefault);
+ if (getProgress().field_80 && !getSoundQueue()->isBuffered("MUS003")) {
+ getSound()->playSound(kEntityPlayer, "MUS003", kFlagDefault);
getProgress().field_80 = 0;
}
@@ -1408,8 +1410,8 @@ IMPLEMENT_ACTION(playMusicChapter)
if (id) {
Common::String filename = Common::String::format("MUS%03d", id);
- if (!getSound()->isBuffered(filename))
- getSound()->playSound(kEntityPlayer, filename, SoundManager::kFlagDefault);
+ if (!getSoundQueue()->isBuffered(filename))
+ getSound()->playSound(kEntityPlayer, filename, kFlagDefault);
}
return kSceneInvalid;
@@ -1440,8 +1442,8 @@ IMPLEMENT_ACTION(playMusicChapterSetupTrain)
Common::String filename = Common::String::format("MUS%03d", hotspot.param1);
- if (!getSound()->isBuffered(filename) && hotspot.param3 & id) {
- getSound()->playSound(kEntityPlayer, filename, SoundManager::kFlagDefault);
+ if (!getSoundQueue()->isBuffered(filename) && hotspot.param3 & id) {
+ getSound()->playSound(kEntityPlayer, filename, kFlagDefault);
getSavePoints()->call(kEntityPlayer, kEntityTrain, kAction203863200, filename.c_str());
getSavePoints()->push(kEntityPlayer, kEntityTrain, kAction222746496, hotspot.param2);
@@ -1612,7 +1614,7 @@ bool Action::handleOtherCompartment(ObjectIndex object, bool doPlaySound, bool d
if (doPlaySound)
playCompartmentSoundEvents(object);
- if (!getSound()->isBuffered(kEntityMertens))
+ if (!getSoundQueue()->isBuffered(kEntityMertens))
getSound()->playWarningCompartment(kEntityMertens, object);
getSavePoints()->push(kEntityPlayer, kEntityMertens, kAction305159806);
@@ -1628,7 +1630,7 @@ bool Action::handleOtherCompartment(ObjectIndex object, bool doPlaySound, bool d
if (doPlaySound)
playCompartmentSoundEvents(object);
- if (!getSound()->isBuffered(kEntityMertens))
+ if (!getSoundQueue()->isBuffered(kEntityMertens))
getSound()->playSound(kEntityMertens, (rnd(2)) ? "JAC1000" : "JAC1000A");
if (doLoadScene)
@@ -1640,7 +1642,7 @@ bool Action::handleOtherCompartment(ObjectIndex object, bool doPlaySound, bool d
if (doPlaySound)
playCompartmentSoundEvents(object);
- if (!getSound()->isBuffered(kEntityMertens))
+ if (!getSoundQueue()->isBuffered(kEntityMertens))
getSound()->playSound(kEntityMertens, (rnd(2)) ? "JAC1000" : "JAC1000A");
if (doLoadScene)
@@ -1667,7 +1669,7 @@ bool Action::handleOtherCompartment(ObjectIndex object, bool doPlaySound, bool d
if (doPlaySound)
playCompartmentSoundEvents(object);
- if (!getSound()->isBuffered(kEntityCoudert))
+ if (!getSoundQueue()->isBuffered(kEntityCoudert))
getSound()->playWarningCompartment(kEntityCoudert, object);
getSavePoints()->push(kEntityPlayer, kEntityCoudert, kAction305159806);
@@ -1684,7 +1686,7 @@ bool Action::handleOtherCompartment(ObjectIndex object, bool doPlaySound, bool d
if (doPlaySound)
playCompartmentSoundEvents(object);
- if (!getSound()->isBuffered(kEntityCoudert))
+ if (!getSoundQueue()->isBuffered(kEntityCoudert))
getSound()->playSound(kEntityCoudert, (rnd(2)) ? "JAC1000" : "JAC1000A");
if (doLoadScene)
@@ -1699,7 +1701,7 @@ bool Action::handleOtherCompartment(ObjectIndex object, bool doPlaySound, bool d
if (doPlaySound)
playCompartmentSoundEvents(object);
- if (!getSound()->isBuffered(kEntityCoudert))
+ if (!getSoundQueue()->isBuffered(kEntityCoudert))
getSound()->playSound(kEntityCoudert, (rnd(2)) ? "JAC1000" : "JAC1000A");
if (doLoadScene)
@@ -1908,7 +1910,7 @@ LABEL_KEY:
// Play an animation and add delta time to global game time
void Action::playAnimation(EventIndex index, bool debugMode) const {
if (index >= _animationListSize)
- error("Action::playAnimation: invalid event index (value=%i, max=%i)", index, _animationListSize);
+ error("[Action::playAnimation] Invalid event index (value=%i, max=%i)", index, _animationListSize);
// In debug mode, just show the animation
if (debugMode) {
@@ -1930,8 +1932,8 @@ void Action::playAnimation(EventIndex index, bool debugMode) const {
if (!getFlags()->mouseRightClick) {
if (getGlobalTimer()) {
- if (getSound()->isBuffered("TIMER")) {
- getSound()->processEntry("TIMER");
+ if (getSoundQueue()->isBuffered("TIMER")) {
+ getSoundQueue()->processEntry("TIMER");
setGlobalTimer(105);
}
}
@@ -1948,8 +1950,8 @@ void Action::playAnimation(EventIndex index, bool debugMode) const {
if (animation.load(getArchive(Common::String(_animationList[index].filename) + ".nis") , processSound ? Animation::kFlagDefault : Animation::kFlagProcess))
animation.play();
- if (getSound()->isBuffered("TIMER"))
- getSound()->removeFromQueue("TIMER");
+ if (getSoundQueue()->isBuffered("TIMER"))
+ getSoundQueue()->removeFromQueue("TIMER");
}
// Show cursor
diff --git a/engines/lastexpress/game/beetle.cpp b/engines/lastexpress/game/beetle.cpp
index cb6f0a3306..ab707ddae9 100644
--- a/engines/lastexpress/game/beetle.cpp
+++ b/engines/lastexpress/game/beetle.cpp
@@ -131,7 +131,7 @@ bool Beetle::isLoaded() const {
bool Beetle::catchBeetle() {
if (!_data)
- error("Beetle::catchBeetle: sequences have not been loaded!");
+ error("[Beetle::catchBeetle] Sequences have not been loaded");
if (getInventory()->getSelectedItem() == kItemMatchBox
&& getInventory()->hasItem(kItemMatch)
@@ -148,14 +148,14 @@ bool Beetle::catchBeetle() {
bool Beetle::isCatchable() const {
if (!_data)
- error("Beetle::isCatchable: sequences have not been loaded!");
+ error("[Beetle::isCatchable] Sequences have not been loaded");
return (_data->indexes[_data->offset] >= 30);
}
void Beetle::update() {
if (!_data)
- error("Beetle::update: sequences have not been loaded!");
+ error("[Beetle::update] Sequences have not been loaded");
if (!_data->isLoaded)
return;
@@ -194,7 +194,7 @@ void Beetle::update() {
void Beetle::drawUpdate() {
if (!_data)
- error("Beetle::drawUpdate: sequences have not been loaded!");
+ error("[Beetle::drawUpdate] Sequences have not been loaded");
if (_data->frame != NULL) {
getScenes()->setCoordinates(_data->frame);
@@ -366,7 +366,7 @@ void Beetle::drawUpdate() {
void Beetle::move() {
if (!_data)
- error("Beetle::move: sequences have not been loaded!");
+ error("[Beetle::move] Sequences have not been loaded");
if (_data->indexes[_data->offset] >= 24 && _data->indexes[_data->offset] <= 29)
return;
@@ -444,7 +444,7 @@ update_data:
// Update the beetle sequence to show the correct frames in the correct place
void Beetle::updateFrame(SequenceFrame *frame) const {
if (!_data)
- error("Beetle::updateSequence: sequences have not been loaded!");
+ error("[Beetle::updateFrame] Sequences have not been loaded");
if (!frame)
return;
@@ -459,7 +459,7 @@ void Beetle::updateFrame(SequenceFrame *frame) const {
void Beetle::updateData(uint32 index) {
if (!_data)
- error("Beetle::updateData: sequences have not been loaded!");
+ error("[Beetle::updateData] Sequences have not been loaded");
if (!_data->isLoaded)
return;
diff --git a/engines/lastexpress/game/entities.cpp b/engines/lastexpress/game/entities.cpp
index 513ad114b0..1b31339b7b 100644
--- a/engines/lastexpress/game/entities.cpp
+++ b/engines/lastexpress/game/entities.cpp
@@ -68,9 +68,11 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/graphics.h"
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -200,7 +202,7 @@ Entity *Entities::get(EntityIndex entity) {
assert((uint)entity < _entities.size());
if (entity == kEntityPlayer)
- error("Cannot get entity for index == 0!");
+ error("[Entities::get] Cannot get entity for kEntityPlayer");
return _entities[entity];
}
@@ -218,24 +220,24 @@ int Entities::getPosition(CarIndex car, Position position) const {
int index = 100 * car + position;
if (car > 10)
- error("Entities::getPosition: trying to access an invalid car (was: %d, valid:0-9)", car);
+ error("[Entities::getPosition] Trying to access an invalid car (was: %d, valid:0-9)", car);
if (position > 100)
- error("Entities::getPosition: trying to access an invalid position (was: %d, valid:0-100)", position);
+ error("[Entities::getPosition] Trying to access an invalid position (was: %d, valid:0-100)", position);
return _positions[index];
}
int Entities::getCompartments(int index) const {
if (index >= _compartmentsCount)
- error("Entities::getCompartments: trying to access an invalid compartment (was: %d, valid:0-15)", index);
+ error("[Entities::getCompartments] Trying to access an invalid compartment (was: %d, valid:0-15)", index);
return _compartments[index];
}
int Entities::getCompartments1(int index) const {
if (index >= _compartmentsCount)
- error("Entities::getCompartments: trying to access an invalid compartment (was: %d, valid:0-15)", index);
+ error("[Entities::getCompartments] Trying to access an invalid compartment (was: %d, valid:0-15)", index);
return _compartments1[index];
}
@@ -299,7 +301,7 @@ void Entities::setupChapter(ChapterIndex chapter) {
memset(&_compartments1, 0, sizeof(_compartments1));
memset(&_positions, 0, sizeof(_positions));
- getSound()->resetQueue(SoundManager::kSoundType13);
+ getSoundQueue()->resetQueue(kSoundType13);
}
// we skip the header when doing entity setup
@@ -369,8 +371,8 @@ void Entities::resetState(EntityIndex entityIndex) {
getData(entityIndex)->currentCall = 0;
getData(entityIndex)->inventoryItem = kItemNone;
- if (getSound()->isBuffered(entityIndex))
- getSound()->removeFromQueue(entityIndex);
+ if (getSoundQueue()->isBuffered(entityIndex))
+ getSoundQueue()->removeFromQueue(entityIndex);
clearSequences(entityIndex);
@@ -751,50 +753,48 @@ label_nosequence:
if (!data->sequence)
goto label_nosequence;
- if (data->frame->getInfo()->field_30 > data->field_49B + 1 || (data->direction == kDirectionLeft && data->sequence->count() == 1)) {
+ if (data->frame->getInfo()->field_30 > (data->field_49B + 1) || (data->direction == kDirectionLeft && data->sequence->count() == 1)) {
++data->field_49B;
- INCREMENT_DIRECTION_COUNTER();
- return;
- }
+ } else {
+ if (data->frame->getInfo()->field_30 > data->field_49B && !data->frame->getInfo()->keepPreviousFrame) {
+ ++data->field_49B;
+ } else {
+ if (data->frame->getInfo()->keepPreviousFrame == 1)
+ keepPreviousFrame = true;
- if (data->frame->getInfo()->field_30 > data->field_49B && !data->frame->getInfo()->keepPreviousFrame) {
- ++data->field_49B;
- INCREMENT_DIRECTION_COUNTER();
- return;
- }
+ // Increment current frame
+ ++data->currentFrame;
- if (data->frame->getInfo()->keepPreviousFrame == 1)
- keepPreviousFrame = true;
+ if (data->currentFrame > (int16)(data->sequence->count() - 1) || (data->field_4A9 && checkSequenceFromPosition(entityIndex))) {
- // Increment current frame
- ++data->currentFrame;
+ if (data->direction == kDirectionLeft) {
+ data->currentFrame = 0;
+ } else {
+ keepPreviousFrame = true;
+ drawNextSequence(entityIndex);
- if (data->currentFrame > (int16)(data->sequence->count() - 1) || (data->field_4A9 && checkSequenceFromPosition(entityIndex))) {
+ if (getFlags()->flag_entities_0 || data->doProcessEntity)
+ return;
- if (data->direction == kDirectionLeft) {
- data->currentFrame = 0;
- } else {
- keepPreviousFrame = true;
- drawNextSequence(entityIndex);
+ if (!data->sequence2) {
+ updateEntityPosition(entityIndex);
+ data->doProcessEntity = false;
+ return;
+ }
- if (getFlags()->flag_entities_0 || data->doProcessEntity)
- return;
+ copySequenceData(entityIndex);
+ }
- if (!data->sequence2) {
- updateEntityPosition(entityIndex);
- data->doProcessEntity = false;
- return;
}
- copySequenceData(entityIndex);
- }
+ processFrame(entityIndex, keepPreviousFrame, false);
+ if (getFlags()->flag_entities_0 || data->doProcessEntity)
+ return;
+ }
}
- processFrame(entityIndex, keepPreviousFrame, false);
-
- if (!getFlags()->flag_entities_0 && !data->doProcessEntity)
- INCREMENT_DIRECTION_COUNTER();
+ INCREMENT_DIRECTION_COUNTER();
}
void Entities::computeCurrentFrame(EntityIndex entityIndex) const {
@@ -1107,9 +1107,8 @@ void Entities::processFrame(EntityIndex entityIndex, bool keepPreviousFrame, boo
// Get new frame info
FrameInfo *info = data->sequence->getFrameInfo((uint16)data->currentFrame);
- if (data->frame && data->frame->getInfo()->subType != kFrameType3)
- if (!info->field_2E || keepPreviousFrame)
- getScenes()->setCoordinates(data->frame);
+ if (data->frame && data->frame->getInfo()->subType != kFrameType3 && (!info->field_2E || keepPreviousFrame))
+ getScenes()->setCoordinates(data->frame);
// Update position
if (info->entityPosition) {
@@ -1780,7 +1779,7 @@ void Entities::enterCompartment(EntityIndex entity, ObjectIndex compartment, boo
// Update compartments
int index = (compartment < 32 ? compartment - 1 : compartment - 24);
if (index >= 16)
- error("Entities::exitCompartment: invalid compartment index!");
+ error("[Entities::enterCompartment] Invalid compartment index");
if (useCompartment1)
_compartments1[index] |= STORE_VALUE(entity);
@@ -1866,7 +1865,7 @@ void Entities::exitCompartment(EntityIndex entity, ObjectIndex compartment, bool
// Update compartments
int index = (compartment < 32 ? compartment - 1 : compartment - 24);
if (index >= 16)
- error("Entities::exitCompartment: invalid compartment index!");
+ error("[Entities::exitCompartment] Invalid compartment index");
if (useCompartment1)
_compartments1[index] &= ~STORE_VALUE(entity);
@@ -2355,7 +2354,7 @@ bool Entities::changeCar(EntityData::EntityCallData *data, EntityIndex entity, C
if (data->car == newCar) {
if (isInGreenCarEntrance(kEntityPlayer)) {
getSound()->playSoundEvent(kEntityPlayer, 14);
- getSound()->excuseMe(entity, kEntityPlayer, SoundManager::kFlagDefault);
+ getSound()->excuseMe(entity, kEntityPlayer, kFlagDefault);
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 1);
getSound()->playSound(kEntityPlayer, "CAT1127A");
getSound()->playSoundEvent(kEntityPlayer, 15);
@@ -2374,7 +2373,7 @@ bool Entities::changeCar(EntityData::EntityCallData *data, EntityIndex entity, C
if (data->car == newCar) {
if (isInKronosCarEntrance(kEntityPlayer)) {
getSound()->playSoundEvent(kEntityPlayer, 14);
- getSound()->excuseMe(entity, kEntityPlayer, SoundManager::kFlagDefault);
+ getSound()->excuseMe(entity, kEntityPlayer, kFlagDefault);
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 62);
getSound()->playSound(kEntityPlayer, "CAT1127A");
getSound()->playSoundEvent(kEntityPlayer, 15);
diff --git a/engines/lastexpress/game/fight.cpp b/engines/lastexpress/game/fight.cpp
deleted file mode 100644
index ecc43bed2b..0000000000
--- a/engines/lastexpress/game/fight.cpp
+++ /dev/null
@@ -1,1583 +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.
- *
- */
-
-#include "lastexpress/game/fight.h"
-
-#include "lastexpress/data/cursor.h"
-#include "lastexpress/data/scene.h"
-#include "lastexpress/data/sequence.h"
-
-#include "lastexpress/game/entities.h"
-#include "lastexpress/game/inventory.h"
-#include "lastexpress/game/logic.h"
-#include "lastexpress/game/object.h"
-#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
-#include "lastexpress/game/state.h"
-
-#include "lastexpress/graphics.h"
-#include "lastexpress/helpers.h"
-#include "lastexpress/lastexpress.h"
-#include "lastexpress/resource.h"
-
-#include "common/func.h"
-
-namespace LastExpress {
-
-#define CALL_FUNCTION0(fighter, name) \
- (*fighter->name)(fighter)
-
-#define CALL_FUNCTION1(fighter, name, a) \
- (*fighter->name)(fighter, a)
-
-#define REGISTER_PLAYER_FUNCTIONS(name) \
- if (!_data) \
- error("Fight::load##namePlayer - invalid data!"); \
- _data->player->handleAction = new Common::Functor2Mem<Fighter *, FightAction, void, Fight>(this, &Fight::handleAction##name); \
- _data->player->update = new Common::Functor1Mem<Fighter *, void, Fight>(this, &Fight::update##name); \
- _data->player->canInteract = new Common::Functor2Mem<Fighter const *, FightAction, bool, Fight>(this, &Fight::canInteract##name);
-
-#define REGISTER_OPPONENT_FUNCTIONS(name) \
- if (!_data) \
- error("Fight::load##nameOpponent - invalid data!"); \
- _data->opponent->handleAction = new Common::Functor2Mem<Fighter *, FightAction, void, Fight>(this, &Fight::handleOpponentAction##name); \
- _data->opponent->update = new Common::Functor1Mem<Fighter *, void, Fight>(this, &Fight::updateOpponent##name); \
- _data->opponent->canInteract = new Common::Functor2Mem<Fighter const *, FightAction, bool, Fight>(this, &Fight::canInteract);
-
-#define CHECK_SEQUENCE2(fighter, value) \
- (fighter->frame->getInfo()->field_33 & value)
-
-Fight::Fight(LastExpressEngine *engine) : _engine(engine), _data(NULL), _endType(kFightEndLost), _state(0), _handleTimer(false) {}
-
-Fight::~Fight() {
- clearData();
- _data = NULL;
-
- // Zero passed pointers
- _engine = NULL;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Events
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::eventMouse(const Common::Event &ev) {
- if (!_data || _data->index)
- return;
-
- // TODO move all the egg handling to inventory functions
-
- getFlags()->mouseLeftClick = false;
- getFlags()->shouldRedraw = false;
- getFlags()->mouseRightClick = false;
-
- if (ev.mouse.x < 608 || ev.mouse.y < 448 || ev.mouse.x >= 640 || ev.mouse.x >= 480) {
-
- // Handle right button click
- if (ev.type == Common::EVENT_RBUTTONUP) {
- getSound()->removeFromQueue(kEntityTables0);
- setStopped();
-
- getGlobalTimer() ? _state = 0 : ++_state;
-
- getFlags()->mouseRightClick = true;
- }
-
- if (_handleTimer) {
- // Timer expired => show with full brightness
- if (!getGlobalTimer())
- getInventory()->drawBlinkingEgg();
-
- _handleTimer = false;
- }
-
- // Check hotspots
- Scene *scene = getScenes()->get(getState()->scene);
- SceneHotspot *hotspot = NULL;
-
- if (!scene->checkHotSpot(ev.mouse, &hotspot)) {
- _engine->getCursor()->setStyle(kCursorNormal);
- } else {
- _engine->getCursor()->setStyle((CursorStyle)hotspot->cursor);
-
- // Call player function
- if (CALL_FUNCTION1(_data->player, canInteract, (FightAction)hotspot->action)) {
- if (ev.type == Common::EVENT_LBUTTONUP)
- CALL_FUNCTION1(_data->player, handleAction, (FightAction)hotspot->action);
- } else {
- _engine->getCursor()->setStyle(kCursorNormal);
- }
- }
- } else {
- // Handle clicks on menu icon
-
- if (!_handleTimer) {
- // Timer expired => show with full brightness
- if (!getGlobalTimer())
- getInventory()->drawBlinkingEgg();
-
- _handleTimer = true;
- }
-
- // Stop fight if clicked
- if (ev.type == Common::EVENT_LBUTTONUP) {
- _handleTimer = false;
- getSound()->removeFromQueue(kEntityTables0);
- bailout(kFightEndExit);
- }
-
- // Reset timer on right click
- if (ev.type == Common::EVENT_RBUTTONUP) {
- if (getGlobalTimer()) {
- if (getSound()->isBuffered("TIMER"))
- getSound()->removeFromQueue("TIMER");
-
- setGlobalTimer(900);
- }
- }
- }
-
- getFlags()->shouldRedraw = true;
-}
-
-void Fight::eventTick(const Common::Event &ev) {
- handleTick(ev, true);
-}
-
-void Fight::handleTick(const Common::Event &ev, bool isProcessing) {
- // TODO move all the egg handling to inventory functions
-
- // Blink egg
- if (getGlobalTimer()) {
- warning("Fight::handleMouseMove - egg blinking not implemented!");
- }
-
- if (!_data || _data->index)
- return;
-
- SceneHotspot *hotspot = NULL;
- if (!getScenes()->get(getState()->scene)->checkHotSpot(ev.mouse, &hotspot) || !CALL_FUNCTION1(_data->player, canInteract, (FightAction)hotspot->action)) {
- _engine->getCursor()->setStyle(kCursorNormal);
- } else {
- _engine->getCursor()->setStyle((CursorStyle)hotspot->cursor);
- }
-
- CALL_FUNCTION0(_data->player, update);
- CALL_FUNCTION0(_data->opponent, update);
-
- // Draw sequences
- if (!_data->isRunning)
- return;
-
- if (isProcessing)
- getScenes()->drawFrames(true);
-
- if (_data->index) {
- // Set next sequence name index
- _data->index--;
- _data->sequences[_data->index] = loadSequence(_data->names[_data->index]);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Setup
-//////////////////////////////////////////////////////////////////////////
-
-Fight::FightEndType Fight::setup(FightType type) {
- if (_data)
- error("Fight::setup - calling fight setup again while a fight is already in progress!");
-
- //////////////////////////////////////////////////////////////////////////
- // Prepare UI & state
- if (_state >= 5 && (type == kFightSalko || type == kFightVesna)) {
- _state = 0;
- return kFightEndWin;
- }
-
- getInventory()->showHourGlass();
- // TODO events function
- getFlags()->flag_0 = false;
- getFlags()->mouseRightClick = false;
- getEntities()->reset();
-
- // Compute scene to use
- SceneIndex sceneIndex;
- switch(type) {
- default:
- sceneIndex = kSceneFightDefault;
- break;
-
- case kFightMilos:
- sceneIndex = (getObjects()->get(kObjectCompartment1).location2 < kObjectLocation3) ? kSceneFightMilos : kSceneFightMilosBedOpened;
- break;
-
- case kFightAnna:
- sceneIndex = kSceneFightAnna;
- break;
-
- case kFightIvo:
- sceneIndex = kSceneFightIvo;
- break;
-
- case kFightSalko:
- sceneIndex = kSceneFightSalko;
- break;
-
- case kFightVesna:
- sceneIndex = kSceneFightVesna;
- break;
- }
-
- if (getFlags()->shouldRedraw) {
- getFlags()->shouldRedraw = false;
- askForRedraw();
- //redrawScreen();
- }
-
- // Load the scene object
- Scene *scene = getScenes()->get(sceneIndex);
-
- // Update game entities and state
- getEntityData(kEntityPlayer)->entityPosition = scene->entityPosition;
- getEntityData(kEntityPlayer)->location = scene->location;
-
- getState()->scene = sceneIndex;
-
- getFlags()->flag_3 = true;
-
- // Draw the scene
- _engine->getGraphicsManager()->draw(scene, GraphicsManager::kBackgroundC);
- // FIXME move to start of fight?
- askForRedraw();
- redrawScreen();
-
- //////////////////////////////////////////////////////////////////////////
- // Setup the fight
- _data = new FightData;
- loadData(type);
-
- // Show opponents & egg button
- Common::Event emptyEvent;
- handleTick(emptyEvent, false);
- getInventory()->drawEgg();
-
- // Start fight
- _endType = kFightEndLost;
- while (_data->isRunning) {
- if (_engine->handleEvents())
- continue;
-
- getSound()->updateQueue();
- }
-
- // Cleanup after fight is over
- clearData();
-
- return _endType;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Status
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::setStopped() {
- if (_data)
- _data->isRunning = false;
-}
-
-void Fight::bailout(FightEndType type) {
- _state = 0;
- _endType = type;
- setStopped();
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Cleanup
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::clearData() {
- if (!_data)
- return;
-
- // Clear data
- clearSequences(_data->player);
- clearSequences(_data->opponent);
-
- SAFE_DELETE(_data->player);
- SAFE_DELETE(_data->opponent);
-
- SAFE_DELETE(_data);
-
- _engine->restoreEventHandlers();
-}
-
-void Fight::clearSequences(Fighter *combatant) const {
- if (!combatant)
- return;
-
- // The original game resets the function pointers to default values, just before deleting the struct
- getScenes()->removeAndRedraw(&combatant->frame, false);
-
- // Free sequences
- for (int i = 0; i < (int)combatant->sequences.size(); i++)
- SAFE_DELETE(combatant->sequences[i]);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Drawing
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::setSequenceAndDraw(Fighter *combatant, uint32 sequenceIndex, FightSequenceType type) const {
- if (combatant->sequences.size() < sequenceIndex)
- return;
-
- switch (type) {
- default:
- break;
-
- case kFightSequenceType0:
- if (combatant->sequenceIndex)
- return;
-
- combatant->sequence = combatant->sequences[sequenceIndex];
- combatant->sequenceIndex = sequenceIndex;
- draw(combatant);
- break;
-
- case kFightSequenceType1:
- combatant->sequence = combatant->sequences[sequenceIndex];
- combatant->sequenceIndex = sequenceIndex;
- combatant->sequenceIndex2 = 0;
- draw(combatant);
- break;
-
- case kFightSequenceType2:
- combatant->sequenceIndex2 = sequenceIndex;
- break;
- }
-}
-
-void Fight::draw(Fighter *combatant) const {
- getScenes()->removeAndRedraw(&combatant->frame, false);
-
- combatant->frameIndex = 0;
- combatant->field_24 = 0;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Loading
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::loadData(FightType type) {
- if (!_data)
- error("Fight::loadData - invalid data!");
-
- switch (type) {
- default:
- break;
-
- case kFightMilos:
- loadMilosPlayer();
- loadMilosOpponent();
- break;
-
- case kFightAnna:
- loadAnnaPlayer();
- loadAnnaOpponent();
- break;
-
- case kFightIvo:
- loadIvoPlayer();
- loadIvoOpponent();
- break;
-
- case kFightSalko:
- loadSalkoPlayer();
- loadSalkoOpponent();
- break;
-
- case kFightVesna:
- loadVesnaPlayer();
- loadVesnaOpponent();
- break;
- }
-
- if (!_data->player || !_data->opponent)
- error("Fight::loadData - error loading fight data (type=%d)", type);
-
- //////////////////////////////////////////////////////////////////////////
- // Start running the fight
- _data->isRunning = true;
-
- if (_state < 5) {
- setSequenceAndDraw(_data->player, 0, kFightSequenceType0);
- setSequenceAndDraw(_data->opponent, 0, kFightSequenceType0);
- goto end_load;
- }
-
- switch(type) {
- default:
- break;
-
- case kFightMilos:
- _data->opponent->countdown = 1;
- setSequenceAndDraw(_data->player, 4, kFightSequenceType0);
- setSequenceAndDraw(_data->opponent, 0, kFightSequenceType0);
- break;
-
- case kFightIvo:
- _data->opponent->countdown = 1;
- setSequenceAndDraw(_data->player, 3, kFightSequenceType0);
- setSequenceAndDraw(_data->opponent, 6, kFightSequenceType0);
- break;
-
- case kFightVesna:
- _data->opponent->countdown = 1;
- setSequenceAndDraw(_data->player, 0, kFightSequenceType0);
- setSequenceAndDraw(_data->player, 3, kFightSequenceType2);
- setSequenceAndDraw(_data->opponent, 5, kFightSequenceType0);
- break;
- }
-
-end_load:
- // Setup event handlers
- _engine->backupEventHandlers();
- SET_EVENT_HANDLERS(Fight, this);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Shared
-//////////////////////////////////////////////////////////////////////////
-void Fight::processFighter(Fighter *fighter) {
- if (!_data)
- error("Fight::processFighter - invalid data!");
-
- if (!fighter->sequence) {
- if (fighter->frame) {
- getScenes()->removeFromQueue(fighter->frame);
- getScenes()->setCoordinates(fighter->frame);
- }
- SAFE_DELETE(fighter->frame);
- return;
- }
-
- if (fighter->sequence->count() <= fighter->frameIndex) {
- switch(fighter->action) {
- default:
- break;
-
- case kFightAction101:
- setSequenceAndDraw(fighter, fighter->sequenceIndex2, kFightSequenceType1);
- fighter->sequenceIndex2 = 0;
- break;
-
- case kFightActionResetFrame:
- fighter->frameIndex = 0;
- break;
-
- case kFightAction103:
- setSequenceAndDraw(fighter, 0, kFightSequenceType1);
- CALL_FUNCTION1(fighter, handleAction, kFightAction101);
- setSequenceAndDraw(fighter->opponent, 0, kFightSequenceType1);
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction101);
- CALL_FUNCTION0(fighter->opponent, update);
- break;
-
- case kFightActionWin:
- bailout(kFightEndWin);
- break;
-
- case kFightActionLost:
- bailout(kFightEndLost);
- break;
- }
- }
-
- if (_data->isRunning) {
-
- // Get the current sequence frame
- SequenceFrame *frame = new SequenceFrame(fighter->sequence, (uint16)fighter->frameIndex);
- frame->getInfo()->location = 1;
-
- if (fighter->frame == frame) {
- delete frame;
- return;
- }
-
- getSound()->playFightSound(frame->getInfo()->soundAction, frame->getInfo()->field_31);
-
- // Add current frame to queue and advance
- getScenes()->addToQueue(frame);
- fighter->frameIndex++;
-
- if (fighter->frame) {
- getScenes()->removeFromQueue(fighter->frame);
-
- if (!frame->getInfo()->field_2E)
- getScenes()->setCoordinates(fighter->frame);
- }
-
- // Replace by new frame
- delete fighter->frame;
- fighter->frame = frame;
- }
-}
-
-void Fight::handleAction(Fighter *fighter, FightAction action) {
- switch (action) {
- default:
- return;
-
- case kFightAction101:
- break;
-
- case kFightActionResetFrame:
- fighter->countdown--;
- break;
-
- case kFightAction103:
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightActionResetFrame);
- break;
-
- case kFightActionWin:
- _endType = kFightEndWin;
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightActionResetFrame);
- break;
-
- case kFightActionLost:
- _endType = kFightEndLost;
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightActionResetFrame);
- break;
- }
-
- // Update action
- fighter->action = action;
-}
-
-bool Fight::canInteract(Fighter const *fighter, FightAction /*= (FightAction)0*/ ) {
- return (fighter->action == kFightAction101 && !fighter->sequenceIndex);
-}
-
-void Fight::update(Fighter *fighter) {
-
- processFighter(fighter);
-
- if (fighter->frame)
- fighter->frame->getInfo()->location = (fighter->action == kFightActionResetFrame ? 2 : 0);
-}
-
-void Fight::updateOpponent(Fighter *fighter) {
-
- // This is an opponent struct!
- Opponent *opponent = (Opponent *)fighter;
-
- processFighter(opponent);
-
- if (opponent->field_38 && !opponent->sequenceIndex)
- opponent->field_38--;
-
- if (fighter->frame)
- fighter->frame->getInfo()->location = 1;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Milos
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::loadMilosPlayer() {
- REGISTER_PLAYER_FUNCTIONS(Milos)
-
- _data->player->sequences.push_back(loadSequence("2001cr.seq"));
- _data->player->sequences.push_back(loadSequence("2001cdl.seq"));
- _data->player->sequences.push_back(loadSequence("2001cdr.seq"));
- _data->player->sequences.push_back(loadSequence("2001cdm.seq"));
- _data->player->sequences.push_back(loadSequence("2001csgr.seq"));
- _data->player->sequences.push_back(loadSequence("2001csgl.seq"));
- _data->player->sequences.push_back(loadSequence("2001dbk.seq"));
-}
-
-void Fight::loadMilosOpponent() {
- REGISTER_OPPONENT_FUNCTIONS(Milos)
-
- _data->opponent->sequences.push_back(loadSequence("2001or.seq"));
- _data->opponent->sequences.push_back(loadSequence("2001oal.seq"));
- _data->opponent->sequences.push_back(loadSequence("2001oam.seq"));
- _data->opponent->sequences.push_back(loadSequence("2001okl.seq"));
- _data->opponent->sequences.push_back(loadSequence("2001okm.seq"));
- _data->opponent->sequences.push_back(loadSequence("2001dbk.seq"));
- _data->opponent->sequences.push_back(loadSequence("2001wbk.seq"));
-
- getSound()->playSound(kEntityTables0, "MUS027", SoundManager::kFlagDefault);
-
- _data->opponent->field_38 = 35;
-}
-
-void Fight::handleActionMilos(Fighter *fighter, FightAction action) {
- switch (action) {
- default:
- handleAction(fighter, action);
- return;
-
- case kFightAction1:
- if (fighter->sequenceIndex != 1 || CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 6, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 3, kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction2:
- if ((fighter->sequenceIndex != 2 && fighter->sequenceIndex != 3) || CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 6, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 4, kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction128:
- if (fighter->sequenceIndex != 1 || CHECK_SEQUENCE2(fighter, 4) || fighter->opponent->sequenceIndex != 1) {
- switch (fighter->opponent->sequenceIndex) {
- default:
- setSequenceAndDraw(fighter, rnd(3) + 1, kFightSequenceType0);
- break;
-
- case 1:
- setSequenceAndDraw(fighter, 1, kFightSequenceType0);
- break;
-
- case 2:
- setSequenceAndDraw(fighter, 3, kFightSequenceType0);
- break;
- }
- } else {
- setSequenceAndDraw(fighter, 4, kFightSequenceType1);
- CALL_FUNCTION0(fighter, update);
- }
- break;
- }
-}
-
-void Fight::updateMilos(Fighter *fighter) {
- if (fighter->frame && CHECK_SEQUENCE2(fighter, 2)) {
-
- // Draw sequences
- if (fighter->opponent->countdown <= 0) {
- setSequenceAndDraw(fighter, 5, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 6, kFightSequenceType1);
-
- getSound()->removeFromQueue(kEntityTables0);
- getSound()->playSound(kEntityTrain, "MUS029", SoundManager::kFlagDefault);
-
- CALL_FUNCTION1(fighter, handleAction, kFightActionWin);
- }
-
- if (fighter->sequenceIndex == 4) {
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction4);
- _endType = kFightEndLost;
- }
- }
-
- update(fighter);
-}
-
-bool Fight::canInteractMilos(Fighter const *fighter, FightAction action) {
- if (!_data)
- error("Fight::canInteractMilos - invalid data!");
-
- if (action != kFightAction128
- || _data->player->sequenceIndex != 1
- || !fighter->frame
- || CHECK_SEQUENCE2(fighter, 4)
- || fighter->opponent->sequenceIndex != 1) {
- return canInteract(fighter);
- }
-
- _engine->getCursor()->setStyle(kCursorHand);
-
- return true;
-}
-
-void Fight::handleOpponentActionMilos(Fighter *fighter, FightAction action) {
- if (action == kFightAction4) {
- setSequenceAndDraw(fighter, 5, kFightSequenceType1);
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- } else {
- if (action != kFightAction131)
- handleAction(fighter, action);
- }
-}
-
-void Fight::updateOpponentMilos(Fighter *fighter) {
- // This is an opponent struct!
- Opponent *opponent = (Opponent *)fighter;
-
- if (!opponent->field_38 && CALL_FUNCTION1(opponent, canInteract, kFightAction1) && !opponent->sequenceIndex2) {
-
- if (opponent->opponent->field_34 >= 2) {
- switch (rnd(5)) {
- default:
- break;
-
- case 0:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- break;
-
- case 1:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- break;
-
- case 2:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType1);
- break;
-
- case 3:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
-
- case 4:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 1, kFightSequenceType2);
- break;
- }
- } else {
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- }
-
- // Update field_38
- if (opponent->opponent->field_34 < 5)
- opponent->field_38 = 6 * (5 - opponent->opponent->field_34);
- else
- opponent->field_38 = 0;
- }
-
- if (opponent->frame && CHECK_SEQUENCE2(opponent, 2)) {
- if (opponent->sequenceIndex == 1 || opponent->sequenceIndex == 2)
- CALL_FUNCTION1(opponent->opponent, handleAction, (FightAction)opponent->sequenceIndex);
-
- if (opponent->opponent->countdown <= 0) {
- getSound()->removeFromQueue(kEntityTables0);
- CALL_FUNCTION1(opponent, handleAction, kFightActionLost);
- }
- }
-
- updateOpponent(opponent);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Anna
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::loadAnnaPlayer() {
- if (!_data)
- error("Fight::loadAnnaPlayer - invalid data!");
-
- // Special case: we are using some shared functions directly
- _data->player->handleAction = new Common::Functor2Mem<Fighter *, FightAction, void, Fight>(this, &Fight::handleActionAnna);
- _data->player->update = new Common::Functor1Mem<Fighter *, void, Fight>(this, &Fight::update);
- _data->player->canInteract = new Common::Functor2Mem<Fighter const *, FightAction, bool, Fight>(this, &Fight::canInteract);
-
- _data->player->sequences.push_back(loadSequence("2002cr.seq"));
- _data->player->sequences.push_back(loadSequence("2002cdl.seq"));
- _data->player->sequences.push_back(loadSequence("2002cdr.seq"));
- _data->player->sequences.push_back(loadSequence("2002cdm.seq"));
- _data->player->sequences.push_back(loadSequence("2002lbk.seq"));
-}
-
-void Fight::loadAnnaOpponent() {
- if (!_data)
- error("Fight::loadAnnaOpponent - invalid data!");
-
- // Special case: we are using some shared functions directly
- _data->opponent->handleAction = new Common::Functor2Mem<Fighter *, FightAction, void, Fight>(this, &Fight::handleAction);
- _data->opponent->update = new Common::Functor1Mem<Fighter *, void, Fight>(this, &Fight::updateOpponentAnna);
- _data->opponent->canInteract = new Common::Functor2Mem<Fighter const *, FightAction, bool, Fight>(this, &Fight::canInteract);
-
- _data->opponent->sequences.push_back(loadSequence("2002or.seq"));
- _data->opponent->sequences.push_back(loadSequence("2002oal.seq"));
- _data->opponent->sequences.push_back(loadSequence("2002oam.seq"));
- _data->opponent->sequences.push_back(loadSequence("2002oar.seq"));
- _data->opponent->sequences.push_back(loadSequence("2002okr.seq"));
- _data->opponent->sequences.push_back(loadSequence("2002okml.seq"));
- _data->opponent->sequences.push_back(loadSequence("2002okm.seq"));
-
- getSound()->playSound(kEntityTables0, "MUS030", SoundManager::kFlagDefault);
-
- _data->opponent->field_38 = 30;
-}
-
-void Fight::handleActionAnna(Fighter *fighter, FightAction action) {
- switch (action) {
- default:
- handleAction(fighter, action);
- return;
-
- case kFightAction1:
- if ((fighter->sequenceIndex != 1 && fighter->sequenceIndex != 3) || CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 4, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 4, kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction2:
- if ((fighter->sequenceIndex != 2 && fighter->sequenceIndex != 3) || CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 4, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 5, kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction3:
- if ((fighter->sequenceIndex != 2 && fighter->sequenceIndex != 1) || CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 4, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 6, kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction128:
- switch (fighter->opponent->sequenceIndex) {
- default:
- setSequenceAndDraw(fighter, 3, kFightSequenceType0);
- break;
-
- case 1:
- setSequenceAndDraw(fighter, 1, kFightSequenceType0);
- break;
-
- case 2:
- setSequenceAndDraw(fighter, 3, kFightSequenceType0);
- break;
-
- case 3:
- setSequenceAndDraw(fighter, 2, kFightSequenceType0);
- break;
- }
- break;
- }
-
- if (fighter->field_34 > 4) {
- getSound()->removeFromQueue(kEntityTables0);
- bailout(kFightEndWin);
- }
-}
-
-void Fight::updateOpponentAnna(Fighter *fighter) {
- // This is an opponent struct!
- Opponent *opponent = (Opponent *)fighter;
-
- if (!opponent->field_38 && CALL_FUNCTION1(opponent, canInteract, kFightAction1) && !opponent->sequenceIndex2) {
-
- if (opponent->opponent->field_34 >= 2) {
- switch (rnd(6)) {
- default:
- break;
-
- case 0:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- break;
-
- case 1:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- break;
-
- case 2:
- setSequenceAndDraw(opponent, 3, kFightSequenceType0);
- break;
-
- case 3:
- setSequenceAndDraw(opponent, 3, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
-
- case 4:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
-
- case 5:
- setSequenceAndDraw(opponent, 3, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
- }
- }
-
- // Update field_38
- opponent->field_38 = (int32)rnd(15);
- }
-
- if (opponent->frame && CHECK_SEQUENCE2(opponent, 2)) {
- if (opponent->sequenceIndex == 1 || opponent->sequenceIndex == 2 || opponent->sequenceIndex == 3)
- CALL_FUNCTION1(opponent->opponent, handleAction, (FightAction)opponent->sequenceIndex);
-
- if (opponent->opponent->countdown <= 0) {
- getSound()->removeFromQueue(kEntityTables0);
- CALL_FUNCTION1(opponent, handleAction, kFightActionLost);
- }
- }
-
- updateOpponent(opponent);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Ivo
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::loadIvoPlayer() {
- REGISTER_PLAYER_FUNCTIONS(Ivo)
-
- _data->player->sequences.push_back(loadSequence("2003cr.seq"));
- _data->player->sequences.push_back(loadSequence("2003car.seq"));
- _data->player->sequences.push_back(loadSequence("2003cal.seq"));
- _data->player->sequences.push_back(loadSequence("2003cdr.seq"));
- _data->player->sequences.push_back(loadSequence("2003cdm.seq"));
- _data->player->sequences.push_back(loadSequence("2003chr.seq"));
- _data->player->sequences.push_back(loadSequence("2003chl.seq"));
- _data->player->sequences.push_back(loadSequence("2003ckr.seq"));
- _data->player->sequences.push_back(loadSequence("2003lbk.seq"));
- _data->player->sequences.push_back(loadSequence("2003fbk.seq"));
-
- _data->player->countdown = 5;
-}
-
-void Fight::loadIvoOpponent() {
- REGISTER_OPPONENT_FUNCTIONS(Ivo)
-
- _data->opponent->sequences.push_back(loadSequence("2003or.seq"));
- _data->opponent->sequences.push_back(loadSequence("2003oal.seq"));
- _data->opponent->sequences.push_back(loadSequence("2003oar.seq"));
- _data->opponent->sequences.push_back(loadSequence("2003odm.seq"));
- _data->opponent->sequences.push_back(loadSequence("2003okl.seq"));
- _data->opponent->sequences.push_back(loadSequence("2003okj.seq"));
- _data->opponent->sequences.push_back(loadSequence("blank.seq"));
- _data->opponent->sequences.push_back(loadSequence("csdr.seq"));
- _data->opponent->sequences.push_back(loadSequence("2003l.seq"));
-
- getSound()->playSound(kEntityTables0, "MUS032", SoundManager::kFlagDefault);
-
- _data->opponent->countdown = 5;
- _data->opponent->field_38 = 15;
-}
-
-void Fight::handleActionIvo(Fighter *fighter, FightAction action) {
- switch (action) {
- default:
- handleAction(fighter, action);
- return;
-
- case kFightAction1:
- if (fighter->sequenceIndex != 1 || CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 7, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 4, kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- }
- break;
-
- case kFightAction2:
- if ((fighter->sequenceIndex != 2 && fighter->sequenceIndex != 3) || CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 7, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 5, kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- }
- break;
-
- case kFightAction128:
- switch (fighter->opponent->sequenceIndex) {
- default:
- case 1:
- setSequenceAndDraw(fighter, 1, kFightSequenceType0);
- break;
-
- case 2:
- setSequenceAndDraw(fighter, 2, kFightSequenceType0);
- break;
- }
- break;
-
- case kFightAction129:
- setSequenceAndDraw(fighter, (fighter->opponent->countdown > 1) ? 4 : 3, fighter->sequenceIndex ? kFightSequenceType2 : kFightSequenceType0);
- break;
-
- case kFightAction130:
- setSequenceAndDraw(fighter, 3, fighter->sequenceIndex ? kFightSequenceType2 : kFightSequenceType0);
- break;
- }
-}
-
-void Fight::updateIvo(Fighter *fighter) {
-
- if ((fighter->sequenceIndex == 3 || fighter->sequenceIndex == 4) && !fighter->frameIndex)
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction131);
-
- if (fighter->frame && CHECK_SEQUENCE2(fighter, 2)) {
-
- // Draw sequences
- if (fighter->opponent->countdown <= 0) {
- setSequenceAndDraw(fighter, 9, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, 8, kFightSequenceType1);
- getSound()->removeFromQueue(kEntityTables0);
-
- CALL_FUNCTION1(fighter, handleAction, kFightActionWin);
- return;
- }
-
- if (fighter->sequenceIndex == 3 || fighter->sequenceIndex == 4)
- CALL_FUNCTION1(fighter->opponent, handleAction, (FightAction)fighter->sequenceIndex);
- }
-
- update(fighter);
-}
-
-bool Fight::canInteractIvo(Fighter const *fighter, FightAction action) {
- if (action == kFightAction129 || action == kFightAction130)
- return (fighter->sequenceIndex >= 8);
-
- return canInteract(fighter);
-}
-
-void Fight::handleOpponentActionIvo(Fighter *fighter, FightAction action) {
- // This is an opponent struct!
- Opponent *opponent = (Opponent *)fighter;
-
- switch (action) {
- default:
- handleAction(fighter, action);
- break;
-
- case kFightAction3:
- if ((opponent->sequenceIndex != 1 && opponent->sequenceIndex != 3) || CHECK_SEQUENCE2(opponent, 4)) {
- setSequenceAndDraw(opponent, 6, kFightSequenceType1);
- setSequenceAndDraw(opponent->opponent, 6, kFightSequenceType1);
- CALL_FUNCTION1(opponent->opponent, handleAction, kFightAction103);
- }
- break;
-
- case kFightAction4:
- if ((opponent->sequenceIndex != 2 && opponent->sequenceIndex != 3) || CHECK_SEQUENCE2(opponent, 4)) {
- setSequenceAndDraw(opponent, 6, kFightSequenceType1);
- setSequenceAndDraw(opponent->opponent, 5, kFightSequenceType1);
- CALL_FUNCTION1(opponent->opponent, handleAction, kFightAction103);
- }
- break;
-
- case kFightAction131:
- if (opponent->sequenceIndex)
- break;
-
- if (rnd(100) <= (unsigned int)(opponent->countdown > 2 ? 60 : 75)) {
- setSequenceAndDraw(opponent, 3 , kFightSequenceType1);
- if (opponent->opponent->sequenceIndex == 4)
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- }
- break;
- }
-}
-
-void Fight::updateOpponentIvo(Fighter *fighter) {
- // This is an opponent struct!
- Opponent *opponent = (Opponent *)fighter;
-
- if (!opponent->field_38 && CALL_FUNCTION1(opponent, canInteract, kFightAction1) && !opponent->sequenceIndex2) {
-
- if (opponent->opponent->field_34 >= 2) {
- switch (rnd(5)) {
- default:
- break;
-
- case 0:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- break;
-
- case 1:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- break;
-
- case 2:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
-
- case 3:
- setSequenceAndDraw(opponent, 0, kFightSequenceType2);
- setSequenceAndDraw(opponent, 1, kFightSequenceType2);
- break;
-
- case 4:
- setSequenceAndDraw(opponent, 0, kFightSequenceType1);
- setSequenceAndDraw(opponent, 1, kFightSequenceType2);
- break;
- }
- }
-
- // Update field_38
- opponent->field_38 = 3 * opponent->countdown + (int32)rnd(10);
- }
-
- if (opponent->frame && CHECK_SEQUENCE2(opponent, 2)) {
-
- if (opponent->opponent->countdown <= 0) {
- setSequenceAndDraw(opponent, 7, kFightSequenceType1);
- setSequenceAndDraw(opponent->opponent, 8, kFightSequenceType1);
- getSound()->removeFromQueue(kEntityTables0);
-
- CALL_FUNCTION1(opponent->opponent, handleAction, kFightActionWin);
-
- return;
- }
-
- if (opponent->sequenceIndex == 1 || opponent->sequenceIndex == 2)
- CALL_FUNCTION1(opponent->opponent, handleAction, (FightAction)opponent->sequenceIndex);
- }
-
- updateOpponent(opponent);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Salko
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::loadSalkoPlayer() {
- REGISTER_PLAYER_FUNCTIONS(Salko)
-
- _data->player->sequences.push_back(loadSequence("2004cr.seq"));
- _data->player->sequences.push_back(loadSequence("2004cdr.seq"));
- _data->player->sequences.push_back(loadSequence("2004chj.seq"));
- _data->player->sequences.push_back(loadSequence("2004bk.seq"));
-
- _data->player->countdown = 2;
-}
-
-void Fight::loadSalkoOpponent() {
- REGISTER_OPPONENT_FUNCTIONS(Salko)
-
- _data->opponent->sequences.push_back(loadSequence("2004or.seq"));
- _data->opponent->sequences.push_back(loadSequence("2004oam.seq"));
- _data->opponent->sequences.push_back(loadSequence("2004oar.seq"));
- _data->opponent->sequences.push_back(loadSequence("2004okr.seq"));
- _data->opponent->sequences.push_back(loadSequence("2004ohm.seq"));
- _data->opponent->sequences.push_back(loadSequence("blank.seq"));
-
- getSound()->playSound(kEntityTables0, "MUS035", SoundManager::kFlagDefault);
-
- _data->opponent->countdown = 3;
- _data->opponent->field_38 = 30;
-}
-
-void Fight::handleActionSalko(Fighter *fighter, FightAction action) {
- switch (action) {
- default:
- handleAction(fighter, action);
- return;
-
- case kFightAction1:
- case kFightAction2:
- if (fighter->sequenceIndex != 1 && CHECK_SEQUENCE2(fighter, 4)) {
- fighter->field_34 = 0;
-
- setSequenceAndDraw(fighter, 3, kFightSequenceType1);
- setSequenceAndDraw(fighter->opponent, (action == kFightAction1 ? 3 : 4), kFightSequenceType1);
-
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
-
- if (action == kFightAction2)
- fighter->countdown= 0;
-
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction5:
- if (fighter->sequenceIndex != 3) {
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- }
- break;
-
- case kFightAction128:
- setSequenceAndDraw(fighter, 1, kFightSequenceType0);
- fighter->field_34 = 0;
- break;
-
- case kFightAction131:
- setSequenceAndDraw(fighter, 2, (fighter->sequenceIndex ? kFightSequenceType2 : kFightSequenceType0));
- break;
- }
-}
-
-void Fight::updateSalko(Fighter *fighter) {
- update(fighter);
-
- // The original doesn't check for currentSequence2 != NULL (might not happen when everything is working properly, but crashes with our current implementation)
- if (fighter->frame && CHECK_SEQUENCE2(fighter, 2)) {
-
- if (fighter->opponent->countdown <= 0) {
- getSound()->removeFromQueue(kEntityTables0);
- bailout(kFightEndWin);
-
- return;
- }
-
- if (fighter->sequenceIndex == 2)
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction2);
- }
-}
-
-bool Fight::canInteractSalko(Fighter const *fighter, FightAction action) {
- if (action == kFightAction131) {
- if (fighter->sequenceIndex == 1) {
- if (fighter->opponent->countdown <= 0)
- _engine->getCursor()->setStyle(kCursorHand);
-
- return true;
- }
-
- return false;
- }
-
- return canInteract(fighter);
-}
-
-void Fight::handleOpponentActionSalko(Fighter *fighter, FightAction action) {
- if (action == kFightAction2) {
- setSequenceAndDraw(fighter, 5, kFightSequenceType1);
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- } else {
- handleAction(fighter, action);
- }
-}
-
-void Fight::updateOpponentSalko(Fighter *fighter) {
- // This is an opponent struct
- Opponent *opponent = (Opponent *)fighter;
-
- if (!opponent->field_38 && CALL_FUNCTION1(opponent, canInteract, kFightAction1) && !opponent->sequenceIndex2) {
-
- switch (rnd(5)) {
- default:
- break;
-
- case 0:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- break;
-
- case 1:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- break;
-
- case 2:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
-
- case 3:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- setSequenceAndDraw(opponent, 1, kFightSequenceType2);
- break;
-
- case 4:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 1, kFightSequenceType2);
- break;
- }
-
- // Update field_38
- opponent->field_38 = 4 * opponent->countdown;
- }
-
- if (opponent->frame && CHECK_SEQUENCE2(opponent, 2)) {
- if (opponent->opponent->countdown <= 0) {
- getSound()->removeFromQueue(kEntityTables0);
- bailout(kFightEndLost);
-
- // Stop processing
- return;
- }
-
- if (opponent->sequenceIndex == 1 || opponent->sequenceIndex == 2)
- CALL_FUNCTION1(opponent->opponent, handleAction, (FightAction)opponent->sequenceIndex);
- }
-
- updateOpponent(opponent);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Vesna
-//////////////////////////////////////////////////////////////////////////
-
-void Fight::loadVesnaPlayer() {
- REGISTER_PLAYER_FUNCTIONS(Vesna)
-
- _data->player->sequences.push_back(loadSequence("2005cr.seq"));
- _data->player->sequences.push_back(loadSequence("2005cdr.seq"));
- _data->player->sequences.push_back(loadSequence("2005cbr.seq"));
- _data->player->sequences.push_back(loadSequence("2005bk.seq"));
- _data->player->sequences.push_back(loadSequence("2005cdm1.seq"));
- _data->player->sequences.push_back(loadSequence("2005chl.seq"));
-}
-
-void Fight::loadVesnaOpponent() {
- REGISTER_OPPONENT_FUNCTIONS(Vesna)
-
- _data->opponent->sequences.push_back(loadSequence("2005or.seq"));
- _data->opponent->sequences.push_back(loadSequence("2005oam.seq"));
- _data->opponent->sequences.push_back(loadSequence("2005oar.seq"));
- _data->opponent->sequences.push_back(loadSequence("2005okml.seq"));
- _data->opponent->sequences.push_back(loadSequence("2005okr.seq"));
- _data->opponent->sequences.push_back(loadSequence("2005odm1.seq"));
- _data->opponent->sequences.push_back(loadSequence("2005csbm.seq"));
- _data->opponent->sequences.push_back(loadSequence("2005oam4.seq"));
-
- getSound()->playSound(kEntityTables0, "MUS038", SoundManager::kFlagDefault);
-
- _data->opponent->countdown = 4;
- _data->opponent->field_38 = 30;
-}
-
-void Fight::handleActionVesna(Fighter *fighter, FightAction action) {
- switch (action) {
- default:
- handleAction(fighter, action);
- return;
-
- case kFightAction1:
- if (fighter->sequenceIndex != 1) {
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction2:
- if (fighter->sequenceIndex != 2) {
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- } else {
- fighter->field_34++;
- }
- break;
-
- case kFightAction5:
- if (fighter->sequenceIndex != 3) {
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- CALL_FUNCTION0(fighter, update);
- }
- break;
-
- case kFightAction128:
- if (fighter->sequenceIndex == 1 && fighter->opponent->sequenceIndex == 1 && CHECK_SEQUENCE2(fighter, 4)) {
- setSequenceAndDraw(fighter, 5, kFightSequenceType1);
- } else {
- setSequenceAndDraw(fighter, (fighter->opponent->sequenceIndex == 5) ? 3 : 1, kFightSequenceType0);
- }
- break;
-
- case kFightAction132:
- setSequenceAndDraw(fighter, 2, kFightSequenceType0);
- break;
- }
-
- if (fighter->field_34 > 10) {
- setSequenceAndDraw(fighter->opponent, 5, kFightSequenceType2);
- fighter->opponent->countdown = 1;
- fighter->field_34 = 0;
- }
-}
-
-void Fight::updateVesna(Fighter *fighter) {
- if (fighter->frame && CHECK_SEQUENCE2(fighter, 2)) {
-
- if (fighter->sequenceIndex == 3)
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction3);
-
- if (fighter->opponent->countdown <= 0) {
- getSound()->removeFromQueue(kEntityTables0);
- bailout(kFightEndWin);
- return;
- }
-
- if (fighter->sequenceIndex == 5)
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction5);
- }
-
- update(fighter);
-}
-
-bool Fight::canInteractVesna(Fighter const *fighter, FightAction action) {
- if (action != kFightAction128)
- return canInteract(fighter);
-
- if (fighter->sequenceIndex != 1) {
-
- if (fighter->opponent->sequenceIndex == 5) {
- _engine->getCursor()->setStyle(kCursorDown);
- return true;
- }
-
- return canInteract(fighter);
- }
-
- if (fighter->opponent->sequenceIndex == 1 && CHECK_SEQUENCE2(fighter, 4)) {
- _engine->getCursor()->setStyle(kCursorPunchLeft);
- return true;
- }
-
- return false;
-}
-
-void Fight::handleOpponentActionVesna(Fighter *fighter, FightAction action) {
- switch (action) {
- default:
- handleAction(fighter, action);
- break;
-
- case kFightAction3:
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- break;
-
- case kFightAction5:
- setSequenceAndDraw(fighter, 7, kFightSequenceType1);
- CALL_FUNCTION1(fighter->opponent, handleAction, kFightAction103);
- if (fighter->countdown <= 1)
- fighter->countdown = 1;
- break;
-
- case kFightAction131:
- break;
- }
-}
-
-void Fight::updateOpponentVesna(Fighter *fighter) {
- // This is an opponent struct
- Opponent *opponent = (Opponent *)fighter;
-
- if (!opponent->field_38 && CALL_FUNCTION1(opponent, canInteract, kFightAction1) && !opponent->sequenceIndex2) {
-
- if (opponent->opponent->field_34 == 1) {
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- } else {
- switch (rnd(6)) {
- default:
- break;
-
- case 0:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- break;
-
- case 1:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 1, kFightSequenceType2);
- break;
-
- case 2:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- break;
-
- case 3:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
-
- case 4:
- setSequenceAndDraw(opponent, 1, kFightSequenceType0);
- setSequenceAndDraw(opponent, 2, kFightSequenceType2);
- break;
-
- case 5:
- setSequenceAndDraw(opponent, 2, kFightSequenceType0);
- setSequenceAndDraw(opponent, 1, kFightSequenceType2);
- break;
- }
- }
-
- // Update field_38
- opponent->field_38 = 4 * opponent->countdown;
- }
-
- if (opponent->frame && CHECK_SEQUENCE2(opponent, 2)) {
- if (opponent->sequenceIndex == 1 || opponent->sequenceIndex == 2 || opponent->sequenceIndex == 5)
- CALL_FUNCTION1(opponent->opponent, handleAction, (FightAction)opponent->sequenceIndex);
-
- if (opponent->opponent->countdown <= 0) {
-
- switch (opponent->sequenceIndex) {
- default:
- break;
-
- case 1:
- setSequenceAndDraw(opponent, 3, kFightSequenceType1);
- break;
-
- case 2:
- setSequenceAndDraw(opponent, 4, kFightSequenceType1);
- break;
-
- case 5:
- setSequenceAndDraw(opponent, 6, kFightSequenceType1);
- break;
- }
-
- setSequenceAndDraw(opponent->opponent, 4, kFightSequenceType1);
-
- CALL_FUNCTION1(opponent, handleAction, kFightActionLost);
- CALL_FUNCTION0(opponent->opponent, update);
- CALL_FUNCTION0(opponent, update);
-
- getSound()->removeFromQueue(kEntityTables0);
-
- // Stop processing
- return;
- }
- }
-
- updateOpponent(opponent);
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/game/fight.h b/engines/lastexpress/game/fight.h
deleted file mode 100644
index a33cc93a29..0000000000
--- a/engines/lastexpress/game/fight.h
+++ /dev/null
@@ -1,266 +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.
- *
- */
-
-#ifndef LASTEXPRESS_FIGHT_H
-#define LASTEXPRESS_FIGHT_H
-
-/*
- Fight structure
- ---------------
- uint32 {4} - player struct
- uint32 {4} - opponent struct
- uint32 {4} - hasLost flag
-
- byte {1} - isRunning
-
- Fight participant structure
- ---------------------------
- uint32 {4} - function pointer
- uint32 {4} - pointer to fight structure
- uint32 {4} - pointer to opponent (fight participant structure)
- uint32 {4} - array of sequences
- uint32 {4} - number of sequences
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint16 {2} - ??
- uint16 {2} - ?? - only for opponent structure
- uint32 {4} - ?? - only for opponent structure
-
-*/
-
-#include "lastexpress/shared.h"
-
-#include "lastexpress/eventhandler.h"
-
-#include "common/array.h"
-
-namespace LastExpress {
-
-class LastExpressEngine;
-class Sequence;
-class SequenceFrame;
-
-//////////////////////////////////////////////////////////////////////////
-// TODO : objectify!
-class Fight : public EventHandler {
-public:
- enum FightEndType {
- kFightEndWin = 0,
- kFightEndLost = 1,
- kFightEndExit = 2
- };
-
- Fight(LastExpressEngine *engine);
- ~Fight();
-
- FightEndType setup(FightType type);
-
- void eventMouse(const Common::Event &ev);
- void eventTick(const Common::Event &ev);
-
- void setStopped();
- void resetState() { _state = 0; }
-
-private:
- enum FightSequenceType {
- kFightSequenceType0 = 0,
- kFightSequenceType1 = 1,
- kFightSequenceType2 = 2
- };
-
- enum FightAction {
- kFightAction1 = 1,
- kFightAction2 = 2,
- kFightAction3 = 3,
- kFightAction4 = 4,
- kFightAction5 = 5,
- kFightAction101 = 101,
- kFightActionResetFrame = 102,
- kFightAction103 = 103,
- kFightActionWin = 104,
- kFightActionLost = 105,
- kFightAction128 = 128,
- kFightAction129 = 129,
- kFightAction130 = 130,
- kFightAction131 = 131,
- kFightAction132 = 132
- };
-
- struct Fighter {
- Common::Functor2<Fighter *, FightAction, void> *handleAction;
- Common::Functor1<Fighter *, void> *update;
- Common::Functor2<Fighter const *, FightAction, bool> *canInteract;
- Fighter *opponent;
- Common::Array<Sequence *> sequences;
- uint32 sequenceIndex;
- Sequence *sequence;
- SequenceFrame *frame;
- uint32 frameIndex;
- uint32 field_24;
- FightAction action;
- uint32 sequenceIndex2;
- int32 countdown; // countdown before loosing ?
- uint32 field_34;
-
- Fighter() {
- handleAction = NULL;
- update = NULL;
- canInteract = NULL;
-
- opponent = NULL;
-
- sequenceIndex = 0;
- sequence = NULL;
- frame = NULL;
- frameIndex = 0;
-
- field_24 = 0;
-
- action = kFightAction101;
- sequenceIndex2 = 0;
-
- countdown = 1;
-
- field_34 = 0;
- }
- };
-
- // Opponent struct
- struct Opponent : Fighter {
- int32 field_38;
-
- Opponent() : Fighter() {
- field_38 = 0;
- }
- };
-
- struct FightData {
- Fighter *player;
- Opponent *opponent;
- int32 index;
-
- Sequence *sequences[20];
- Common::String names[20];
-
- bool isRunning;
-
- FightData() {
- player = new Fighter();
- opponent = new Opponent();
-
- // Set opponents
- player->opponent = opponent;
- opponent->opponent = player;
-
- index = 0;
-
- isRunning = false;
- }
- };
-
- LastExpressEngine *_engine;
- FightData *_data;
- FightEndType _endType;
- int _state;
-
- bool _handleTimer;
-
- // Events
- void handleTick(const Common::Event &ev, bool unknown);
-
- // State
- void bailout(FightEndType type);
-
-
- // Drawing
- void setSequenceAndDraw(Fighter *fighter, uint32 sequenceIndex, FightSequenceType type) const;
- void draw(Fighter *fighter) const;
-
- // Cleanup
- void clearData();
- void clearSequences(Fighter *fighter) const;
-
- //////////////////////////////////////////////////////////////////////////
- // Loading
- void loadData(FightType type);
-
- // Shared
- void processFighter(Fighter *fighter);
-
- // Default functions
- void handleAction(Fighter *fighter, FightAction action);
- void update(Fighter *fighter);
- bool canInteract(Fighter const *fighter, FightAction = (FightAction)0);
- void updateOpponent(Fighter *fighter);
-
- // Milos
- void loadMilosPlayer();
- void loadMilosOpponent();
- void handleActionMilos(Fighter *fighter, FightAction action);
- void updateMilos(Fighter *fighter);
- bool canInteractMilos(Fighter const *fighter, FightAction action);
- void handleOpponentActionMilos(Fighter *fighter, FightAction action);
- void updateOpponentMilos(Fighter *fighter);
-
- // Anna
- void loadAnnaPlayer();
- void loadAnnaOpponent();
- void handleActionAnna(Fighter *fighter, FightAction action);
- void updateOpponentAnna(Fighter *fighter);
-
- // Ivo
- void loadIvoPlayer();
- void loadIvoOpponent();
- void handleActionIvo(Fighter *fighter, FightAction action);
- void updateIvo(Fighter *fighter);
- bool canInteractIvo(Fighter const *fighter, FightAction action);
- void handleOpponentActionIvo(Fighter *fighter, FightAction action);
- void updateOpponentIvo(Fighter *fighter);
-
- // Salko
- void loadSalkoPlayer();
- void loadSalkoOpponent();
- void handleActionSalko(Fighter *fighter, FightAction action);
- void updateSalko(Fighter *fighter);
- bool canInteractSalko(Fighter const *fighter, FightAction action);
- void handleOpponentActionSalko(Fighter *fighter, FightAction action);
- void updateOpponentSalko(Fighter *fighter);
-
- // Vesna
- void loadVesnaPlayer();
- void loadVesnaOpponent();
- void handleActionVesna(Fighter *fighter, FightAction action);
- void updateVesna(Fighter *fighter);
- bool canInteractVesna(Fighter const *fighter, FightAction action);
- void handleOpponentActionVesna(Fighter *fighter, FightAction action);
- void updateOpponentVesna(Fighter *fighter);
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_FIGHT_H
diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp
index adf6ff772e..e417b1ec0d 100644
--- a/engines/lastexpress/game/inventory.cpp
+++ b/engines/lastexpress/game/inventory.cpp
@@ -27,11 +27,14 @@
#include "lastexpress/data/snd.h"
#include "lastexpress/game/logic.h"
-#include "lastexpress/game/menu.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/menu/menu.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/graphics.h"
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -155,14 +158,14 @@ void Inventory::handleMouseEvent(const Common::Event &ev) {
_portraitHighlighted = false;
_isOpened = false;
- getSound()->playSoundWithSubtitles("LIB039.SND", SoundManager::kFlagMenuClock, kEntityPlayer);
+ getSound()->playSoundWithSubtitles("LIB039.SND", kFlagMenuClock, kEntityPlayer);
getMenu()->show(true, kSavegameTypeIndex, 0);
} else if (ev.type == Common::EVENT_RBUTTONDOWN) {
if (getGlobalTimer()) {
- if (getSound()->isBuffered("TIMER"))
- getSound()->removeFromQueue("TIMER");
+ if (getSoundQueue()->isBuffered("TIMER"))
+ getSoundQueue()->removeFromQueue("TIMER");
setGlobalTimer(900);
}
@@ -436,7 +439,7 @@ void Inventory::showHourGlass(){
//////////////////////////////////////////////////////////////////////////
Inventory::InventoryEntry *Inventory::get(InventoryItem item) {
if (item >= kPortraitOriginal)
- error("Inventory::getEntry: Invalid inventory item!");
+ error("[Inventory::get] Invalid inventory item");
return &_entries[item];
}
@@ -620,7 +623,7 @@ void Inventory::drawEgg() {
// Blinking egg: we need to blink the egg for delta time, with the blinking getting faster until it's always lit.
void Inventory::drawBlinkingEgg() {
- warning("Inventory::drawEgg - blinking not implemented!");
+ warning("[Inventory::drawBlinkingEgg] Blinking not implemented");
//// TODO show egg (with or without mouseover)
@@ -629,7 +632,7 @@ void Inventory::drawBlinkingEgg() {
// if (getGlobalTimer() + ticks >= 90)
// getSound()->playSoundWithSubtitles("TIMER.SND", 50331664, kEntityPlayer);
- // if (getSound()->isBuffered("TIMER"))
+ // if (getSoundQueue()->isBuffered("TIMER"))
// setGlobalTimer(0);
//}
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 0911c60de0..aeac8cff98 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -30,20 +30,25 @@
// Entities
#include "lastexpress/entities/chapters.h"
+// Fight
+#include "lastexpress/fight/fight.h"
+
// Game
#include "lastexpress/game/action.h"
#include "lastexpress/game/beetle.h"
#include "lastexpress/game/entities.h"
-#include "lastexpress/game/fight.h"
#include "lastexpress/game/inventory.h"
-#include "lastexpress/game/menu.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savegame.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/menu/menu.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/graphics.h"
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -149,7 +154,7 @@ void Logic::eventMouse(const Common::Event &ev) {
_engine->getCursor()->setStyle(getInventory()->get(kItemWhistle)->cursor);
// Check if clicked
- if (ev.type == Common::EVENT_LBUTTONUP && !getSound()->isBuffered("LIB045")) {
+ if (ev.type == Common::EVENT_LBUTTONUP && !getSoundQueue()->isBuffered("LIB045")) {
getSound()->playSoundEvent(kEntityPlayer, 45);
@@ -408,7 +413,7 @@ void Logic::eventTick(const Common::Event &) {
void Logic::resetState() {
getState()->scene = kSceneDefault;
- warning("Logic::resetState: not implemented! You need to restart the engine until this is implemented.");
+ warning("[Logic::resetState] Not implemented! You need to restart the engine until this is implemented.");
}
/**
@@ -421,7 +426,7 @@ void Logic::resetState() {
*/
void Logic::gameOver(SavegameType type, uint32 value, SceneIndex sceneIndex, bool showScene) const {
- getSound()->processEntries();
+ getSoundQueue()->processEntries();
getEntities()->reset();
getFlags()->isGameRunning = false;
getSavePoints()->reset();
@@ -429,16 +434,16 @@ void Logic::gameOver(SavegameType type, uint32 value, SceneIndex sceneIndex, boo
if (showScene) {
- getSound()->processEntry(SoundManager::kSoundType11);
+ getSoundQueue()->processEntry(kSoundType11);
if (sceneIndex && !getFlags()->mouseRightClick) {
getScenes()->loadScene(sceneIndex);
- while (getSound()->isBuffered(kEntityTables4)) {
+ while (getSoundQueue()->isBuffered(kEntityTables4)) {
if (getFlags()->mouseRightClick)
break;
- getSound()->updateQueue();
+ getSoundQueue()->updateQueue();
}
}
}
@@ -448,7 +453,7 @@ void Logic::gameOver(SavegameType type, uint32 value, SceneIndex sceneIndex, boo
}
void Logic::switchChapter() const {
- getSound()->clearStatus();
+ getSoundQueue()->clearStatus();
switch(getState()->progress.chapter) {
default:
@@ -488,7 +493,7 @@ void Logic::switchChapter() const {
}
void Logic::playFinalSequence() const {
- getSound()->processEntries();
+ getSoundQueue()->processEntries();
_action->playAnimation(kEventFinalSequence);
showCredits();
@@ -501,7 +506,7 @@ void Logic::playFinalSequence() const {
}
void Logic::showCredits() const {
- error("Logic::showCredits: not implemented!");
+ error("[Logic::showCredits] Not implemented");
}
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/game/object.cpp b/engines/lastexpress/game/object.cpp
index a600075953..d9e9e4279a 100644
--- a/engines/lastexpress/game/object.cpp
+++ b/engines/lastexpress/game/object.cpp
@@ -39,7 +39,7 @@ Objects::Objects(LastExpressEngine *engine) : _engine(engine) {}
const Objects::Object Objects::get(ObjectIndex index) const {
if (index >= kObjectMax)
- error("Objects::get - internal error: invalid object index (%d)", index);
+ error("[Objects::get] Invalid object index (%d)", index);
return _objects[index];
}
diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp
index 5d06ecab13..57c18b5697 100644
--- a/engines/lastexpress/game/savegame.cpp
+++ b/engines/lastexpress/game/savegame.cpp
@@ -24,11 +24,14 @@
#include "lastexpress/game/inventory.h"
#include "lastexpress/game/logic.h"
-#include "lastexpress/game/menu.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/menu/menu.h"
+
+#include "lastexpress/sound/queue.h"
+
#include "lastexpress/debug.h"
#include "lastexpress/lastexpress.h"
#include "lastexpress/helpers.h"
@@ -42,12 +45,12 @@ namespace LastExpress {
static const struct {
const char *saveFile;
} gameInfo[6] = {
- {"blue.egg"},
- {"red.egg"},
- {"green.egg"},
- {"purple.egg"},
- {"teal.egg"},
- {"gold.egg"}
+ {"lastexpress-blue.egg"},
+ {"lastexpress-red.egg"},
+ {"lastexpress-green.egg"},
+ {"lastexpress-purple.egg"},
+ {"lastexpress-teal.egg"},
+ {"lastexpress-gold.egg"}
};
//////////////////////////////////////////////////////////////////////////
@@ -72,10 +75,10 @@ void SaveLoad::initStream() {
void SaveLoad::flushStream(GameId id) {
Common::OutSaveFile *save = openForSaving(id);
if (!save)
- error("SaveLoad::flushStream: cannot open savegame (%s)!", getFilename(id).c_str());
+ error("[SaveLoad::flushStream] Cannot open savegame (%s)", getFilename(id).c_str());
if (!_savegame)
- error("SaveLoad::flushStream: savegame stream is invalid");
+ error("[SaveLoad::flushStream] Savegame stream is invalid");
save->write(_savegame->getData(), (uint32)_savegame->size());
@@ -106,7 +109,7 @@ uint32 SaveLoad::init(GameId id, bool resetHeaders) {
SavegameMainHeader mainHeader;
mainHeader.saveLoadWithSerializer(ser);
if (!mainHeader.isValid())
- error("SaveLoad::init - Savegame seems to be corrupted (invalid header)");
+ error("[SaveLoad::init] Savegame seems to be corrupted (invalid header)");
// Reset cached entry headers if needed
if (resetHeaders) {
@@ -124,7 +127,7 @@ uint32 SaveLoad::init(GameId id, bool resetHeaders) {
while (_savegame->pos() < _savegame->size() && !_savegame->eos() && !_savegame->err()) {
// Update sound queue while we go through the savegame
- getSound()->updateQueue();
+ getSoundQueue()->updateQueue();
SavegameEntryHeader *entry = new SavegameEntryHeader();
entry->saveLoadWithSerializer(ser);
@@ -145,10 +148,10 @@ uint32 SaveLoad::init(GameId id, bool resetHeaders) {
void SaveLoad::loadStream(GameId id) {
Common::InSaveFile *save = openForLoading(id);
if (save->size() < 32)
- error("SaveLoad::init - Savegame seems to be corrupted (not enough data: %i bytes)", save->size());
+ error("[SaveLoad::loadStream] Savegame seems to be corrupted (not enough data: %i bytes)", save->size());
if (!_savegame)
- error("SaveLoad::loadStream: savegame stream is invalid");
+ error("[SaveLoad::loadStream] Savegame stream is invalid");
// Load all savegame data
uint8* buf = new uint8[8192];
@@ -189,7 +192,7 @@ void SaveLoad::clear(bool clearStream) {
// Load game
void SaveLoad::loadGame(GameId id) {
if (!_savegame)
- error("SaveLoad::loadGame: No savegame stream present!");
+ error("[SaveLoad::loadGame] No savegame stream present");
// Rewind current savegame
_savegame->seek(0);
@@ -197,12 +200,12 @@ void SaveLoad::loadGame(GameId id) {
// Validate main header
SavegameMainHeader header;
if (!loadMainHeader(_savegame, &header)) {
- debugC(2, kLastExpressDebugSavegame, "SaveLoad::saveGame - Cannot load main header: %s", getFilename(getMenu()->getGameId()).c_str());
+ debugC(2, kLastExpressDebugSavegame, "Cannot load main header: %s", getFilename(getMenu()->getGameId()).c_str());
return;
}
if (!_savegame)
- error("SaveLoad::loadGame: No savegame stream present!");
+ error("[SaveLoad::loadGame] No savegame stream present");
// Load the last entry
_savegame->seek(header.offsetEntry);
@@ -216,7 +219,7 @@ void SaveLoad::loadGame(GameId id) {
_gameTicksLastSavegame = getState()->timeTicks;
if (header.keepIndex) {
- getSound()->clearQueue();
+ getSoundQueue()->clearQueue();
readEntry(&type, &entity, &val, false);
}
@@ -227,7 +230,7 @@ void SaveLoad::loadGame(GameId id) {
// Load a specific game entry
void SaveLoad::loadGame(GameId id, uint32 index) {
- error("SaveLoad::loadGame: not implemented! (only loading the last entry is working for now)");
+ error("[SaveLoad::loadGame] Not implemented! (only loading the last entry is working for now)");
}
// Save game
@@ -238,12 +241,12 @@ void SaveLoad::saveGame(SavegameType type, EntityIndex entity, uint32 value) {
// Validate main header
SavegameMainHeader header;
if (!loadMainHeader(_savegame, &header)) {
- debugC(2, kLastExpressDebugSavegame, "SaveLoad::saveGame - Cannot load main header: %s", getFilename(getMenu()->getGameId()).c_str());
+ debugC(2, kLastExpressDebugSavegame, "Cannot load main header: %s", getFilename(getMenu()->getGameId()).c_str());
return;
}
if (!_savegame)
- error("SaveLoad::saveGame: savegame stream is invalid");
+ error("[SaveLoad::saveGame] Savegame stream is invalid");
// Validate the current entry if it exists
if (header.count > 0) {
@@ -255,7 +258,7 @@ void SaveLoad::saveGame(SavegameType type, EntityIndex entity, uint32 value) {
entry.saveLoadWithSerializer(ser);
if (!entry.isValid()) {
- warning("SaveLoad::saveGame: Invalid entry. This savegame might be corrupted!");
+ warning("[SaveLoad::saveGame] Invalid entry. This savegame might be corrupted");
_savegame->seek(header.offset);
} else if (getState()->time < entry.time || (type == kSavegameTypeTickInterval && getState()->time == entry.time)) {
// Not ready to save a game, skipping!
@@ -293,7 +296,7 @@ void SaveLoad::saveGame(SavegameType type, EntityIndex entity, uint32 value) {
// Validate the main header
if (!header.isValid())
- error("SaveLoad::saveGame: main game header is invalid!");
+ error("[SaveLoad::saveGame] Main game header is invalid");
// Write the main header
_savegame->seek(0);
@@ -304,7 +307,7 @@ void SaveLoad::saveGame(SavegameType type, EntityIndex entity, uint32 value) {
}
void SaveLoad::saveVolumeBrightness() {
- warning("SaveLoad::saveVolumeBrightness: not implemented!");
+ warning("[SaveLoad::saveVolumeBrightness] Not implemented");
}
//////////////////////////////////////////////////////////////////////////
@@ -316,7 +319,7 @@ bool SaveLoad::loadMainHeader(Common::InSaveFile *stream, SavegameMainHeader *he
// Check there is enough data (32 bytes)
if (stream->size() < 32) {
- debugC(2, kLastExpressDebugSavegame, "SaveLoad::loadMainHeader - Savegame seems to be corrupted (not enough data: %i bytes)!", stream->size());
+ debugC(2, kLastExpressDebugSavegame, "Savegame seems to be corrupted (not enough data: %i bytes)", stream->size());
return false;
}
@@ -328,7 +331,7 @@ bool SaveLoad::loadMainHeader(Common::InSaveFile *stream, SavegameMainHeader *he
// Validate the header
if (!header->isValid()) {
- debugC(2, kLastExpressDebugSavegame, "SaveLoad::loadMainHeader - Cannot validate main header!");
+ debugC(2, kLastExpressDebugSavegame, "Cannot validate main header");
return false;
}
@@ -345,11 +348,11 @@ void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) {
uint32 _count = (uint32)_savegame->pos() - _prevPosition; \
debugC(kLastExpressDebugSavegame, "Savegame: Writing " #name ": %d bytes", _count); \
if (_count != val)\
- error("SaveLoad::writeEntry: Number of bytes written (%d) differ from expected count (%d)", _count, val); \
+ error("[SaveLoad::writeEntry] Number of bytes written (%d) differ from expected count (%d)", _count, val); \
}
if (!_savegame)
- error("SaveLoad::writeEntry: savegame stream is invalid");
+ error("[SaveLoad::writeEntry] Savegame stream is invalid");
SavegameEntryHeader header;
@@ -376,7 +379,7 @@ void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) {
WRITE_ENTRY("inventory", getInventory()->saveLoadWithSerializer(ser), 7 * 32);
WRITE_ENTRY("objects", getObjects()->saveLoadWithSerializer(ser), 5 * 128);
WRITE_ENTRY("entities", getEntities()->saveLoadWithSerializer(ser), 1262 * 40);
- WRITE_ENTRY("sound", getSound()->saveLoadWithSerializer(ser), 3 * 4 + getSound()->count() * 64);
+ WRITE_ENTRY("sound", getSoundQueue()->saveLoadWithSerializer(ser), 3 * 4 + getSoundQueue()->count() * 64);
WRITE_ENTRY("savepoints", getSavePoints()->saveLoadWithSerializer(ser), 128 * 16 + 4 + getSavePoints()->count() * 16);
header.offset = (uint32)_savegame->pos() - (originalPosition + 32);
@@ -392,7 +395,7 @@ void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) {
// Validate entry header
if (!header.isValid())
- error("SaveLoad::writeEntry: entry header is invalid");
+ error("[SaveLoad::writeEntry] Entry header is invalid");
// Save the header with the updated info
_savegame->seek(originalPosition);
@@ -409,7 +412,7 @@ void SaveLoad::readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, b
uint32 _count = (uint32)_savegame->pos() - _prevPosition; \
debugC(kLastExpressDebugSavegame, "Savegame: Reading " #name ": %d bytes", _count); \
if (_count != val) \
- error("SaveLoad::readEntry: Number of bytes read (%d) differ from expected count (%d)", _count, val); \
+ error("[SaveLoad::readEntry] Number of bytes read (%d) differ from expected count (%d)", _count, val); \
}
#define LOAD_ENTRY_ONLY(name, func) { \
@@ -420,10 +423,10 @@ void SaveLoad::readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, b
}
if (!type || !entity || !val)
- error("SaveLoad::readEntry: Invalid parameters passed!");
+ error("[SaveLoad::readEntry] Invalid parameters passed");
if (!_savegame)
- error("SaveLoad::readEntry: No savegame stream present!");
+ error("[SaveLoad::readEntry] No savegame stream present");
// Load entry header
SavegameEntryHeader entry;
@@ -431,7 +434,7 @@ void SaveLoad::readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, b
entry.saveLoadWithSerializer(ser);
if (!entry.isValid())
- error("SaveLoad::readEntry: entry header is invalid!");
+ error("[SaveLoad::readEntry] Entry header is invalid");
// Init type, entity & value
*type = entry.type;
@@ -451,7 +454,7 @@ void SaveLoad::readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, b
LOAD_ENTRY("inventory", getInventory()->saveLoadWithSerializer(ser), 7 * 32);
LOAD_ENTRY("objects", getObjects()->saveLoadWithSerializer(ser), 5 * 128);
LOAD_ENTRY("entities", getEntities()->saveLoadWithSerializer(ser), 1262 * 40);
- LOAD_ENTRY_ONLY("sound", getSound()->saveLoadWithSerializer(ser));
+ LOAD_ENTRY_ONLY("sound", getSoundQueue()->saveLoadWithSerializer(ser));
LOAD_ENTRY_ONLY("savepoints", getSavePoints()->saveLoadWithSerializer(ser));
// Update chapter
@@ -466,7 +469,7 @@ void SaveLoad::readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, b
SaveLoad::SavegameEntryHeader *SaveLoad::getEntry(uint32 index) {
if (index >= _gameHeaders.size())
- error("SaveLoad::getEntry: invalid index (was:%d, max:%d)", index, _gameHeaders.size() - 1);
+ error("[SaveLoad::getEntry] Invalid index (was:%d, max:%d)", index, _gameHeaders.size() - 1);
return _gameHeaders[index];
}
@@ -486,7 +489,7 @@ bool SaveLoad::isSavegamePresent(GameId id) {
// Check if the game has been started in the specific savegame
bool SaveLoad::isSavegameValid(GameId id) {
if (!isSavegamePresent(id)) {
- debugC(2, kLastExpressDebugSavegame, "SaveLoad::isSavegameValid - Savegame does not exist: %s", getFilename(id).c_str());
+ debugC(2, kLastExpressDebugSavegame, "Savegame does not exist: %s", getFilename(id).c_str());
return false;
}
@@ -549,7 +552,7 @@ bool SaveLoad::isGameFinished(uint32 menuIndex, uint32 savegameIndex) {
// Get the file name from the savegame ID
Common::String SaveLoad::getFilename(GameId id) {
if (id >= 6)
- error("SaveLoad::getName - attempting to use an invalid game id. Valid values: 0 - 5, was %d", id);
+ error("[SaveLoad::getFilename] Attempting to use an invalid game id. Valid values: 0 - 5, was %d", id);
return gameInfo[id].saveFile;
}
@@ -558,7 +561,7 @@ Common::InSaveFile *SaveLoad::openForLoading(GameId id) {
Common::InSaveFile *load = g_system->getSavefileManager()->openForLoading(getFilename(id));
if (!load)
- debugC(2, kLastExpressDebugSavegame, "SaveLoad::openForLoading - Cannot open savegame for loading: %s", getFilename(id).c_str());
+ debugC(2, kLastExpressDebugSavegame, "Cannot open savegame for loading: %s", getFilename(id).c_str());
return load;
}
@@ -567,7 +570,7 @@ Common::OutSaveFile *SaveLoad::openForSaving(GameId id) {
Common::OutSaveFile *save = g_system->getSavefileManager()->openForSaving(getFilename(id));
if (!save)
- debugC(2, kLastExpressDebugSavegame, "SaveLoad::openForSaving - Cannot open savegame for writing: %s", getFilename(id).c_str());
+ debugC(2, kLastExpressDebugSavegame, "Cannot open savegame for writing: %s", getFilename(id).c_str());
return save;
}
diff --git a/engines/lastexpress/game/savepoint.cpp b/engines/lastexpress/game/savepoint.cpp
index 7ec7c241e9..64ae26c2be 100644
--- a/engines/lastexpress/game/savepoint.cpp
+++ b/engines/lastexpress/game/savepoint.cpp
@@ -128,17 +128,17 @@ void SavePoints::addData(EntityIndex entity, ActionIndex action, uint32 param) {
//////////////////////////////////////////////////////////////////////////
void SavePoints::setCallback(EntityIndex index, Entity::Callback *callback) {
if (index >= 40)
- error("SavePoints::setCallback - attempting to use an invalid entity index. Valid values 0-39, was %d", index);
+ error("[SavePoints::setCallback] Attempting to use an invalid entity index. Valid values 0-39, was %d", index);
if (!callback || !callback->isValid())
- error("SavePoints::setCallback - attempting to set an invalid callback for entity %s", ENTITY_NAME(index));
+ error("[SavePoints::setCallback] Attempting to set an invalid callback for entity %s", ENTITY_NAME(index));
_callbacks[index] = callback;
}
Entity::Callback *SavePoints::getCallback(EntityIndex index) const {
if (index >= 40)
- error("SavePoints::getCallback - attempting to use an invalid entity index. Valid values 0-39, was %d", index);
+ error("[SavePoints::getCallback] Attempting to use an invalid entity index. Valid values 0-39, was %d", index);
return _callbacks[index];
}
diff --git a/engines/lastexpress/game/scenes.cpp b/engines/lastexpress/game/scenes.cpp
index e830b1d128..b886951e0b 100644
--- a/engines/lastexpress/game/scenes.cpp
+++ b/engines/lastexpress/game/scenes.cpp
@@ -31,9 +31,11 @@
#include "lastexpress/game/logic.h"
#include "lastexpress/game/object.h"
#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/graphics.h"
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -79,12 +81,12 @@ void SceneManager::loadSceneDataFile(ArchiveIndex archive) {
case kArchiveCd2:
case kArchiveCd3:
if (!_sceneLoader->load(getArchive(Common::String::format("CD%iTRAIN.DAT", archive))))
- error("SceneManager::loadSceneDataFile: cannot load data file CD%iTRAIN.DAT", archive);
+ error("[SceneManager::loadSceneDataFile] Cannot load data file CD%iTRAIN.DAT", archive);
break;
default:
case kArchiveAll:
- error("SceneManager::loadSceneDataFile: Invalid archive index (must be [1-3], was %d", archive);
+ error("[SceneManager::loadSceneDataFile] Invalid archive index (must be [1-3], was %d", archive);
break;
}
}
@@ -462,7 +464,7 @@ bool SceneManager::checkPosition(SceneIndex index, CheckPositionType type) const
switch (type) {
default:
- error("SceneManager::checkPosition: Invalid position type: %d", type);
+ error("[SceneManager::checkPosition] Invalid position type: %d", type);
case kCheckPositionLookingUp:
return isInSleepingCar && (position >= 1 && position <= 19);
@@ -1057,9 +1059,9 @@ void SceneManager::preProcessScene(SceneIndex *index) {
// Sound processing
Scene *newScene = getScenes()->get(*index);
- if (getSound()->isBuffered(kEntityTables4)) {
+ if (getSoundQueue()->isBuffered(kEntityTables4)) {
if (newScene->type != Scene::kTypeReadText || newScene->param1)
- getSound()->processEntry(kEntityTables4);
+ getSoundQueue()->processEntry(kEntityTables4);
}
// Cleanup beetle sequences
@@ -1089,8 +1091,8 @@ void SceneManager::postProcessScene() {
if (getFlags()->mouseRightClick)
break;
- getSound()->updateQueue();
- getSound()->updateSubtitles();
+ getSoundQueue()->updateQueue();
+ getSoundQueue()->updateSubtitles();
}
}
@@ -1132,7 +1134,7 @@ void SceneManager::postProcessScene() {
}
if (progress)
- getSound()->excuseMe((progress == 1) ? entities[0] : entities[rnd(progress)], kEntityPlayer, SoundManager::kFlagDefault);
+ getSound()->excuseMe((progress == 1) ? entities[0] : entities[rnd(progress)], kEntityPlayer, kFlagDefault);
}
if (hotspot->scene)
@@ -1157,8 +1159,8 @@ void SceneManager::postProcessScene() {
if (getState()->time >= kTimeCityGalanta || getProgress().field_18 == 4)
break;
- getSound()->processEntry(SoundManager::kSoundType7);
- getSound()->playSound(kEntityTrain, "LIB050", SoundManager::kFlagDefault);
+ getSoundQueue()->processEntry(kSoundType7);
+ getSound()->playSound(kEntityTrain, "LIB050", kFlagDefault);
switch (getProgress().chapter) {
default:
diff --git a/engines/lastexpress/game/sound.cpp b/engines/lastexpress/game/sound.cpp
deleted file mode 100644
index 1c7abbf95e..0000000000
--- a/engines/lastexpress/game/sound.cpp
+++ /dev/null
@@ -1,2302 +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.
- *
- */
-
-#include "lastexpress/game/sound.h"
-
-#include "lastexpress/game/action.h"
-#include "lastexpress/game/entities.h"
-#include "lastexpress/game/inventory.h"
-#include "lastexpress/game/logic.h"
-#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/state.h"
-
-#include "lastexpress/helpers.h"
-#include "lastexpress/graphics.h"
-#include "lastexpress/lastexpress.h"
-#include "lastexpress/resource.h"
-
-namespace LastExpress {
-
-#define SOUNDCACHE_ENTRY_SIZE 92160
-#define SOUNDCACHE_MAX_SIZE 6
-
-// Letters & messages
-static const char *const messages[24] = {
- "",
- "TXT1001", // 1
- "TXT1001A", // 2
- "TXT1011", // 3
- "TXT1012", // 4
- "TXT1013", // 5
- "TXT1014", // 6
- "TXT1020", // 7
- "TXT1030", // 8
- "END1009B", // 50
- "END1046", // 51
- "END1047", // 52
- "END1112", // 53
- "END1112A", // 54
- "END1503", // 55
- "END1505A", // 56
- "END1505B", // 57
- "END1610", // 58
- "END1612A", // 59
- "END1612C", // 61
- "END1612D", // 62
- "ENDALRM1", // 63
- "ENDALRM2", // 64
- "ENDALRM3" // 65
-};
-
-static const char *const cities[17] = {
- "EPERNAY",
- "CHALONS",
- "BARLEDUC",
- "NANCY",
- "LUNEVILL",
- "AVRICOUR",
- "DEUTSCHA",
- "STRASBOU",
- "BADENOOS",
- "SALZBURG",
- "ATTNANG",
- "WELS",
- "LINZ",
- "VIENNA",
- "POZSONY",
- "GALANTA",
- "POLICE"
-};
-
-static const char *const locomotiveSounds[5] = {
- "ZFX1005",
- "ZFX1006",
- "ZFX1007",
- "ZFX1007A",
- "ZFX1007B"
-};
-
-static const SoundManager::FlagType soundFlags[32] = {
- SoundManager::kFlagDefault, SoundManager::kFlag15, SoundManager::kFlag14, SoundManager::kFlag13, SoundManager::kFlag12,
- SoundManager::kFlag11, SoundManager::kFlag11, SoundManager::kFlag10, SoundManager::kFlag10, SoundManager::kFlag9, SoundManager::kFlag9, SoundManager::kFlag8, SoundManager::kFlag8,
- SoundManager::kFlag7, SoundManager::kFlag7, SoundManager::kFlag7, SoundManager::kFlag6, SoundManager::kFlag6, SoundManager::kFlag6,
- SoundManager::kFlag5, SoundManager::kFlag5, SoundManager::kFlag5, SoundManager::kFlag5, SoundManager::kFlag4, SoundManager::kFlag4, SoundManager::kFlag4, SoundManager::kFlag4,
- SoundManager::kFlag3, SoundManager::kFlag3, SoundManager::kFlag3, SoundManager::kFlag3, SoundManager::kFlag3
-};
-
-SoundManager::SoundManager(LastExpressEngine *engine) : _engine(engine), _state(0), _currentType(kSoundType16), _flag(0) {
- // Initialize unknown data
- _data0 = 0;
- _data1 = 0;
- _data2 = 0;
-
- memset(&_buffer, 0, sizeof(_buffer));
- memset(&_lastWarning, 0, sizeof(_lastWarning));
-
- // Sound cache
- _soundCacheData = malloc(6 * SOUNDCACHE_ENTRY_SIZE);
-
- _drawSubtitles = 0;
- _currentSubtitle = NULL;
-}
-
-SoundManager::~SoundManager() {
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
- SAFE_DELETE(*i);
- _soundList.clear();
-
- // Entries in the cache are just pointers to sound list entries
- _soundCache.clear();
-
- for (Common::List<SubtitleEntry *>::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i)
- SAFE_DELETE(*i);
- _subtitles.clear();
-
- _currentSubtitle = NULL;
-
- free(_soundCacheData);
-
- // Zero passed pointers
- _engine = NULL;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Timer
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::handleTimer() {
- Common::StackLock locker(_mutex);
-
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
- SoundEntry *entry = (*i);
- if (entry->stream == NULL) {
- SAFE_DELETE(*i);
- i = _soundList.reverse_erase(i);
- continue;
- } else if (!entry->soundStream) {
- entry->soundStream = new StreamedSound();
-
- // TODO: stream any sound in the queue after filtering
- entry->soundStream->load(entry->stream);
- }
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Sound queue management
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::updateQueue() {
- // TODO add mutex lock!
- warning("Sound::updateQueue: not implemented!");
-}
-
-void SoundManager::resetQueue(SoundType type1, SoundType type2) {
- if (!type2)
- type2 = type1;
-
- Common::StackLock locker(_mutex);
-
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
- if ((*i)->type != type1 && (*i)->type != type2)
- resetEntry(*i);
- }
-}
-
-void SoundManager::removeFromQueue(EntityIndex entity) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(entity);
- if (entry)
- resetEntry(entry);
-}
-
-void SoundManager::removeFromQueue(Common::String filename) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(filename);
- if (entry)
- resetEntry(entry);
-}
-
-void SoundManager::clearQueue() {
- _flag |= 4;
-
- // FIXME: Wait a while for a flag to be set
- //for (int i = 0; i < 3000000; i++)
- // if (_flag & 8)
- // break;
-
- _flag |= 8;
-
- Common::StackLock locker(_mutex);
-
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
- SoundEntry *entry = (*i);
-
- // Delete entry
- removeEntry(entry);
- SAFE_DELETE(entry);
-
- i = _soundList.reverse_erase(i);
- }
-
- updateSubtitles();
-}
-
-bool SoundManager::isBuffered(EntityIndex entity) {
- Common::StackLock locker(_mutex);
-
- return (getEntry(entity) != NULL);
-}
-
-bool SoundManager::isBuffered(Common::String filename, bool testForEntity) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(filename);
-
- if (testForEntity)
- return entry != NULL && !entry->entity;
-
- return (entry != NULL);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Entry
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::setupEntry(SoundEntry *entry, Common::String name, FlagType flag, int a4) {
- if (!entry)
- error("SoundManager::setupEntry: Invalid entry!");
-
- entry->field_4C = a4;
- setEntryType(entry, flag);
- setEntryStatus(entry, flag);
-
- // Add entry to sound list
- _soundList.push_back(entry);
-
- // TODO Add entry to cache and load sound data
- //setupCache(entry);
- loadSoundData(entry, name);
-}
-
-void SoundManager::setEntryType(SoundEntry *entry, FlagType flag) {
- switch (flag & kFlagType9) {
- default:
- case kFlagNone:
- entry->type = _currentType;
- _currentType = (SoundType)(_currentType + 1);
- break;
-
- case kFlagType1_2: {
- SoundEntry *previous2 = getEntry(kSoundType2);
- if (previous2)
- updateEntry(previous2, 0);
-
- SoundEntry *previous = getEntry(kSoundType1);
- if (previous) {
- previous->type = kSoundType2;
- updateEntry(previous, 0);
- }
-
- entry->type = kSoundType1;
- }
- break;
-
- case kFlagType3: {
- SoundEntry *previous = getEntry(kSoundType3);
- if (previous) {
- previous->type = kSoundType4;
- updateEntry(previous, 0);
- }
-
- entry->type = kSoundType11;
- }
- break;
-
- case kFlagType7: {
- SoundEntry *previous = getEntry(kSoundType7);
- if (previous)
- previous->type = kSoundType8;
-
- entry->type = kSoundType7;
- }
- break;
-
- case kFlagType9: {
- SoundEntry *previous = getEntry(kSoundType9);
- if (previous)
- previous->type = kSoundType10;
-
- entry->type = kSoundType9;
- }
- break;
-
- case kFlagType11: {
- SoundEntry *previous = getEntry(kSoundType11);
- if (previous)
- previous->type = kSoundType14;
-
- entry->type = kSoundType11;
- }
- break;
-
- case kFlagType13: {
- SoundEntry *previous = getEntry(kSoundType13);
- if (previous)
- previous->type = kSoundType14;
-
- entry->type = kSoundType13;
- }
- break;
- }
-}
-
-void SoundManager::setEntryStatus(SoundEntry *entry, FlagType flag) const {
- SoundStatus status = (SoundStatus)flag;
- if (!((status & 0xFF) & kSoundStatusClear1))
- status = (SoundStatus)(status | kSoundStatusClear2);
-
- if (((status & 0xFF00) >> 8) & kSoundStatusClear0)
- entry->status.status = (uint32)status;
- else
- entry->status.status = (status | kSoundStatusClear4);
-}
-
-void SoundManager::setInCache(SoundEntry *entry) {
- entry->status.status |= kSoundStatusClear2;
-}
-
-bool SoundManager::setupCache(SoundEntry *entry) {
- if (entry->soundData)
- return true;
-
- if (_soundCache.size() >= SOUNDCACHE_MAX_SIZE) {
-
- SoundEntry *cacheEntry = NULL;
- uint32 size = 1000;
-
- for (Common::List<SoundEntry *>::iterator i = _soundCache.begin(); i != _soundCache.end(); ++i) {
- if (!((*i)->status.status & kSoundStatus_180)) {
- uint32 newSize = (*i)->field_4C + ((*i)->status.status & kSoundStatusClear1);
-
- if (newSize < size) {
- cacheEntry = (*i);
- size = newSize;
- }
- }
- }
-
- if (entry->field_4C <= size)
- return false;
-
- if (cacheEntry)
- setInCache(cacheEntry);
-
- // TODO: Wait until the cache entry is ready to be removed
- while (!(cacheEntry->status.status1 & 1))
- ;
-
- if (cacheEntry->soundData)
- removeFromCache(cacheEntry);
-
- _soundCache.push_back(entry);
- entry->soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_soundCache.size() - 1);
- } else {
- _soundCache.push_back(entry);
- entry->soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_soundCache.size() - 1);
- }
-
- return true;
-}
-
-void SoundManager::removeFromCache(SoundEntry *entry) {
- for (Common::List<SoundEntry *>::iterator i = _soundCache.begin(); i != _soundCache.end(); ++i) {
- if ((*i) == entry) {
- // Remove sound buffer
- entry->soundData = NULL;
-
- // Remove entry from sound cache
- i = _soundCache.reverse_erase(i);
- }
- }
-}
-
-void SoundManager::clearStatus() {
- Common::StackLock locker(_mutex);
-
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
- (*i)->status.status |= kSoundStatusClear3;
-}
-
-void SoundManager::loadSoundData(SoundEntry *entry, Common::String name) {
- entry->name2 = name;
-
- // Load sound data
- entry->stream = getArchive(name);
-
- if (!entry->stream)
- entry->stream = getArchive("DEFAULT.SND");
-
- if (entry->stream) {
- warning("Sound::loadSoundData: not implemented!");
- } else {
- entry->status.status = kSoundStatusRemoved;
- }
-}
-
-void SoundManager::resetEntry(SoundEntry *entry) const {
- entry->status.status |= kSoundStatusRemoved;
- entry->entity = kEntityPlayer;
-
- if (entry->stream) {
- if (!entry->soundStream) {
- SAFE_DELETE(entry->stream);
- } else {
- entry->soundStream->stop();
- SAFE_DELETE(entry->soundStream);
- }
-
- entry->stream = NULL;
- }
-}
-
-
-void SoundManager::removeEntry(SoundEntry *entry) {
- entry->status.status |= kSoundStatusRemoved;
-
- // Loop until ready
- while (!(entry->status.status1 & 4) && !(_flag & 8) && (_flag & 1))
- ; // empty loop body
-
- // The original game remove the entry from the cache here,
- // but since we are called from within an iterator loop
- // we will remove the entry there
- // removeFromCache(entry);
-
- if (entry->subtitle) {
- drawSubtitle(entry->subtitle);
- SAFE_DELETE(entry->subtitle);
- }
-
- if (entry->entity) {
- if (entry->entity == kEntitySteam)
- playLoopingSound();
- else if (entry->entity != kEntityTrain)
- getSavePoints()->push(kEntityPlayer, entry->entity, kActionEndSound);
- }
-}
-
-void SoundManager::updateEntry(SoundEntry *entry, uint value) const {
- if (!(entry->status.status3 & 64)) {
- int value2 = value;
-
- entry->status.status |= kSoundStatus_100000;
-
- if (value) {
- if (_flag & 32) {
- entry->field_40 = value;
- value2 = value * 2 + 1;
- }
-
- entry->field_3C = value2;
- } else {
- entry->field_3C = 0;
- entry->status.status |= kSoundStatus_40000000;
- }
- }
-}
-
-void SoundManager::updateEntryState(SoundEntry *entry) const {
- if (_flag & 32) {
- if (entry->type != kSoundType9 && entry->type != kSoundType7 && entry->type != kSoundType5) {
- uint32 status = entry->status.status & kSoundStatusClear1;
-
- entry->status.status &= kSoundStatusClearAll;
-
- entry->field_40 = status;
- entry->status.status |= status * 2 + 1;
- }
- }
-
- entry->status.status |= kSoundStatus_20;
-}
-
-void SoundManager::processEntry(EntityIndex entity) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(entity);
- if (entry) {
- updateEntry(entry, 0);
- entry->entity = kEntityPlayer;
- }
-}
-
-void SoundManager::processEntry(SoundType type) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(type);
- if (entry)
- updateEntry(entry, 0);
-}
-
-void SoundManager::setupEntry(SoundType type, EntityIndex index) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(type);
- if (entry)
- entry->entity = index;
-}
-
-void SoundManager::processEntry(Common::String filename) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(filename);
- if (entry) {
- updateEntry(entry, 0);
- entry->entity = kEntityPlayer;
- }
-}
-
-void SoundManager::processEntries() {
- _state = 0;
-
- processEntry(kSoundType1);
- processEntry(kSoundType2);
-}
-
-uint32 SoundManager::getEntryTime(EntityIndex index) {
- Common::StackLock locker(_mutex);
-
- SoundEntry *entry = getEntry(index);
- if (entry)
- return entry->time;
-
- return 0;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Misc
-//////////////////////////////////////////////////////////////////////////
-
-void SoundManager::unknownFunction4() {
- // TODO: Add mutex ?
- warning("Sound::unknownFunction4: not implemented!");
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Entry search
-//////////////////////////////////////////////////////////////////////////
-SoundManager::SoundEntry *SoundManager::getEntry(EntityIndex index) {
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
- if ((*i)->entity == index)
- return *i;
- }
-
- return NULL;
-}
-
-SoundManager::SoundEntry *SoundManager::getEntry(Common::String name) {
- if (!name.contains('.'))
- name += ".SND";
-
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
- if ((*i)->name2 == name)
- return *i;
- }
-
- return NULL;
-}
-
-SoundManager::SoundEntry *SoundManager::getEntry(SoundType type) {
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
- if ((*i)->type == type)
- return *i;
- }
-
- return NULL;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Savegame
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::saveLoadWithSerializer(Common::Serializer &s) {
- s.syncAsUint32LE(_state);
- s.syncAsUint32LE(_currentType);
-
- // Compute the number of entries to save
- uint32 numEntries = count();
- s.syncAsUint32LE(numEntries);
-
- Common::StackLock locker(_mutex);
-
- // Save or load each entry data
- if (s.isSaving()) {
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
- SoundEntry *entry = *i;
- if (entry->name2.matchString("NISSND?") && (entry->status.status & kFlagType7) != kFlag3) {
- s.syncAsUint32LE(entry->status.status); // status;
- s.syncAsUint32LE(entry->type); // type;
- s.syncAsUint32LE(entry->blockCount); // field_8;
- s.syncAsUint32LE(entry->time); // time;
- s.syncAsUint32LE(entry->field_34); // field_10;
- s.syncAsUint32LE(entry->field_38); // field_14;
- s.syncAsUint32LE(entry->entity); // entity;
-
- uint32 blockCount = (uint32)entry->field_48 - _data2;
- if (blockCount > kFlag8)
- blockCount = 0;
- s.syncAsUint32LE(blockCount); // blockCount;
-
- s.syncAsUint32LE(entry->field_4C); // field_20;
-
- char name1[16];
- strcpy((char *)&name1, entry->name1.c_str());
- s.syncBytes((byte *)&name1, 16);
-
- char name2[16];
- strcpy((char *)&name2, entry->name2.c_str());
- s.syncBytes((byte *)&name2, 16);
- }
- }
- } else {
- warning("Sound::saveLoadWithSerializer: not implemented!");
- s.skip(numEntries * 64);
- }
-}
-
-
-// FIXME: We probably need another mutex here to protect during the whole savegame process
-// as we could have removed an entry between the time we check the count and the time we
-// save the entries
-uint32 SoundManager::count() {
- Common::StackLock locker(_mutex);
-
- uint32 numEntries = 0;
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
- if ((*i)->name2.matchString("NISSND?"))
- ++numEntries;
-
- return numEntries;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Game-related functions
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::playSound(EntityIndex entity, Common::String filename, FlagType flag, byte a4) {
- if (isBuffered(entity) && entity)
- removeFromQueue(entity);
-
- FlagType currentFlag = (flag == -1) ? getSoundFlag(entity) : (FlagType)(flag | 0x80000);
-
- // Add .SND at the end of the filename if needed
- if (!filename.contains('.'))
- filename += ".SND";
-
- if (!playSoundWithSubtitles(filename, currentFlag, entity, a4))
- if (entity)
- getSavePoints()->push(kEntityPlayer, entity, kActionEndSound);
-}
-
-bool SoundManager::playSoundWithSubtitles(Common::String filename, FlagType flag, EntityIndex entity, byte a4) {
- SoundEntry *entry = new SoundEntry();
-
- Common::StackLock locker(_mutex);
-
- setupEntry(entry, filename, flag, 30);
- entry->entity = entity;
-
- if (a4) {
- entry->field_48 = _data2 + 2 * a4;
- entry->status.status |= kSoundStatus_8000;
- } else {
- // Get subtitles name
- while (filename.size() > 4)
- filename.deleteLastChar();
-
- showSubtitle(entry, filename);
- updateEntryState(entry);
- }
-
- return (entry->type != kSoundTypeNone);
-}
-
-void SoundManager::playSoundEvent(EntityIndex entity, byte action, byte a3) {
- int values[5];
-
- if (getEntityData(entity)->car != getEntityData(kEntityPlayer)->car)
- return;
-
- if (getEntities()->isInSalon(entity) != getEntities()->isInSalon(kEntityPlayer))
- return;
-
- int _action = (int)action;
- FlagType flag = getSoundFlag(entity);
-
- switch (action) {
- case 36: {
- int _param3 = (flag <= 9) ? flag + 7 : 16;
-
- if (_param3 > 7) {
- _data0 = (uint)_param3;
- _data1 = _data2 + 2 * a3;
- }
- break;
- }
-
- case 37:
- _data0 = 7;
- _data1 = _data2 + 2 * a3;
- break;
-
- case 150:
- case 156:
- case 162:
- case 168:
- case 188:
- case 198:
- _action += 1 + (int)rnd(5);
- break;
-
- case 174:
- case 184:
- case 194:
- _action += 1 + (int)rnd(3);
- break;
-
- case 180:
- _action += 1 + (int)rnd(4);
- break;
-
- case 246:
- values[0] = 0;
- values[1] = 104;
- values[2] = 105;
- values[3] = 106;
- values[4] = 116;
- _action = values[rnd(5)];
- break;
-
- case 247:
- values[0] = 11;
- values[1] = 123;
- values[2] = 124;
- _action = values[rnd(3)];
- break;
-
- case 248:
- values[0] = 0;
- values[1] = 103;
- values[2] = 108;
- values[3] = 109;
- _action = values[rnd(4)];
- break;
-
- case 249:
- values[0] = 0;
- values[1] = 56;
- values[2] = 112;
- values[3] = 113;
- _action = values[rnd(4)];
- break;
-
- case 250:
- values[0] = 0;
- values[1] = 107;
- values[2] = 115;
- values[3] = 117;
- _action = values[rnd(4)];
- break;
-
- case 251:
- values[0] = 0;
- values[1] = 11;
- values[2] = 56;
- values[3] = 113;
- _action = values[rnd(4)];
- break;
-
- case 252:
- values[0] = 0;
- values[1] = 6;
- values[2] = 109;
- values[3] = 121;
- _action = values[rnd(4)];
- break;
-
- case 254:
- values[0] = 0;
- values[1] = 104;
- values[2] = 120;
- values[3] = 121;
- _action = values[rnd(4)];
- break;
-
- case 255:
- values[0] = 0;
- values[1] = 106;
- values[2] = 115;
- _action = values[rnd(3)];
- break;
-
- default:
- break;
- }
-
- if (_action && flag)
- playSoundWithSubtitles(Common::String::format("LIB%03d.SND", _action), flag, kEntityPlayer, a3);
-}
-
-void SoundManager::playSteam(CityIndex index) {
- if (index >= ARRAYSIZE(cities))
- error("SoundManager::playSteam: invalid city index (was %d, max %d)", index, ARRAYSIZE(cities));
-
- _state |= kSoundState2;
-
- if (!getEntry(kSoundType1))
- playSoundWithSubtitles("STEAM.SND", kFlagSteam, kEntitySteam);
-
- // Get the new sound entry and show subtitles
- SoundEntry *entry = getEntry(kSoundType1);
- if (entry)
- showSubtitle(entry, cities[index]);
-}
-
-void SoundManager::playFightSound(byte action, byte a4) {
- int _action = (int)action;
- int values[5];
-
- switch (action) {
- default:
- break;
-
- case 174:
- case 184:
- case 194:
- values[0] = action + 1;
- values[1] = action + 2;
- values[2] = action + 3;
- _action = values[rnd(3)];
- break;
-
- case 180:
- values[0] = action + 1;
- values[1] = action + 2;
- values[2] = action + 3;
- values[3] = action + 4;
- _action = values[rnd(4)];
- break;
-
- case 150:
- case 156:
- case 162:
- case 168:
- case 188:
- case 198:
- values[0] = action + 1;
- values[1] = action + 2;
- values[2] = action + 3;
- values[3] = action + 4;
- values[4] = action + 5;
- _action = values[rnd(5)];
- break;
- }
-
- if (_action)
- playSound(kEntityTrain, Common::String::format("LIB%03d.SND", _action), kFlagDefault, a4);
-}
-
-void SoundManager::playDialog(EntityIndex entity, EntityIndex entityDialog, FlagType flag, byte a4) {
- if (isBuffered(getDialogName(entityDialog)))
- removeFromQueue(getDialogName(entityDialog));
-
- playSound(entity, getDialogName(entityDialog), flag, a4);
-}
-
-void SoundManager::playLocomotiveSound() {
- playSound(kEntityPlayer, locomotiveSounds[rnd(5)], (FlagType)(rnd(15) + 2));
-}
-
-const char *SoundManager::getDialogName(EntityIndex entity) const {
- switch (entity) {
- case kEntityAnna:
- if (getEvent(kEventAnnaDialogGoToJerusalem))
- return "XANN12";
-
- if (getEvent(kEventLocomotiveRestartTrain))
- return "XANN11";
-
- if (getEvent(kEventAnnaBaggageTies) || getEvent(kEventAnnaBaggageTies2) || getEvent(kEventAnnaBaggageTies3) || getEvent(kEventAnnaBaggageTies4))
- return "XANN10";
-
- if (getEvent(kEventAnnaTired) || getEvent(kEventAnnaTiredKiss))
- return "XANN9";
-
- if (getEvent(kEventAnnaBaggageArgument))
- return "XANN8";
-
- if (getEvent(kEventKronosVisit))
- return "XANN7";
-
- if (getEvent(kEventAbbotIntroduction))
- return "XANN6A";
-
- if (getEvent(kEventVassiliSeizure))
- return "XANN6";
-
- if (getEvent(kEventAugustPresentAnna) || getEvent(kEventAugustPresentAnnaFirstIntroduction))
- return "XANN5";
-
- if (getProgress().field_60)
- return "XANN4";
-
- if (getEvent(kEventAnnaGiveScarf) || getEvent(kEventAnnaGiveScarfDiner) || getEvent(kEventAnnaGiveScarfSalon)
- || getEvent(kEventAnnaGiveScarfMonogram) || getEvent(kEventAnnaGiveScarfDinerMonogram) || getEvent(kEventAnnaGiveScarfSalonMonogram))
- return "XANN3";
-
- if (getEvent(kEventDinerMindJoin))
- return "XANN2";
-
- if (getEvent(kEventGotALight) || getEvent(kEventGotALightD))
- return "XANN1";
-
- break;
-
- case kEntityAugust:
- if (getEvent(kEventAugustTalkCigar))
- return "XAUG6";
-
- if (getEvent(kEventAugustBringBriefcase))
- return "XAUG5";
-
- // Getting closer to Vienna...
- if (getState()->time > kTime2200500 && !getEvent(kEventAugustMerchandise))
- return "XAUG4A";
-
- if (getEvent(kEventAugustMerchandise))
- return "XAUG4";
-
- if (getEvent(kEventDinerAugust) || getEvent(kEventDinerAugustAlexeiBackground) || getEvent(kEventMeetAugustTylerCompartment)
- || getEvent(kEventMeetAugustTylerCompartmentBed) || getEvent(kEventMeetAugustHisCompartment) || getEvent(kEventMeetAugustHisCompartmentBed))
- return "XAUG3";
-
- if (getEvent(kEventAugustPresentAnnaFirstIntroduction))
- return "XAUG2";
-
- if (getProgress().eventMertensAugustWaiting)
- return "XAUG1";
-
- break;
-
- case kEntityTatiana:
- if (getEvent(kEventTatianaTylerCompartment))
- return "XTAT6";
-
- if (getEvent(kEventTatianaCompartmentStealEgg))
- return "XTAT5";
-
- if (getEvent(kEventTatianaGivePoem))
- return "XTAT3";
-
- if (getProgress().field_64)
- return "XTAT1";
-
- break;
-
- case kEntityVassili:
- if (getEvent(kEventCathFreePassengers))
- return "XVAS4";
-
- if (getEvent(kEventVassiliCompartmentStealEgg))
- return "XVAS3";
-
- if (getEvent(kEventAbbotIntroduction))
- return "XVAS2";
-
- if (getEvent(kEventVassiliSeizure))
- return "XVAS1A";
-
- if (getProgress().field_64)
- return "XVAS1";
-
- break;
-
- case kEntityAlexei:
- if (getProgress().field_88)
- return "XALX6";
-
- if (getProgress().field_8C)
- return "XALX5";
-
- if (getProgress().field_90)
- return "XALX4A";
-
- if (getProgress().field_68)
- return "XALX4";
-
- if (getEvent(kEventAlexeiSalonPoem))
- return "XALX3";
-
- if (getEvent(kEventAlexeiSalonVassili))
- return "XALX2";
-
- if (getEvent(kEventAlexeiDiner) || getEvent(kEventAlexeiDinerOriginalJacket))
- return "XALX1";
-
- break;
-
- case kEntityAbbot:
- if (getEvent(kEventAbbotDrinkDefuse))
- return "XABB4";
-
- if (getEvent(kEventAbbotInvitationDrink) || getEvent(kEventDefuseBomb))
- return "XABB3";
-
- if (getEvent(kEventAbbotWrongCompartment) || getEvent(kEventAbbotWrongCompartmentBed))
- return "XABB2";
-
- if (getEvent(kEventAbbotIntroduction))
- return "XABB1";
-
- break;
-
- case kEntityMilos:
- if (getEvent(kEventLocomotiveMilosDay) || getEvent(kEventLocomotiveMilosNight))
- return "XMIL5";
-
- if (getEvent(kEventMilosCompartmentVisitTyler) && (getProgress().chapter == kChapter3 || getProgress().chapter == kChapter4))
- return "XMIL4";
-
- if (getEvent(kEventMilosCorridorThanks) || getProgress().chapter == kChapter5)
- return "XMIL3";
-
- if (getEvent(kEventMilosCompartmentVisitAugust))
- return "XMIL2";
-
- if (getEvent(kEventMilosTylerCompartmentDefeat))
- return "XMIL1";
-
- break;
-
- case kEntityVesna:
- if (getProgress().field_94)
- return "XVES2";
-
- if (getProgress().field_98)
- return "XVES1";
-
- break;
-
- case kEntityKronos:
- if (getEvent(kEventKronosReturnBriefcase))
- return "XKRO6";
-
- if (getEvent(kEventKronosBringEggCeiling) || getEvent(kEventKronosBringEgg))
- return "XKRO5";
-
- if (getEvent(kEventKronosConversation) || getEvent(kEventKronosConversationFirebird)) {
- ObjectLocation location = getInventory()->get(kItemFirebird)->location;
- if (location != kObjectLocation6 && location != kObjectLocation5 && location != kObjectLocation2 && location != kObjectLocation1)
- return "XKRO4A";
- }
-
- if (getEvent(kEventKronosConversationFirebird))
- return "XKRO4";
-
- if (getEvent(kEventKronosConversation)) {
- if (!getEvent(kEventMilosCompartmentVisitAugust))
- return "XKRO3";
- else
- return "XKRO2";
- }
-
- if (getProgress().eventMertensKronosInvitation)
- return "XKRO1";
-
- break;
-
- case kEntityFrancois:
- if (getProgress().field_9C)
- return "XFRA3";
-
- if (getProgress().field_A0
- || getEvent(kEventFrancoisWhistle) || getEvent(kEventFrancoisWhistleD)
- || getEvent(kEventFrancoisWhistleNight) || getEvent(kEventFrancoisWhistleNightD))
- return "XFRA2";
-
- if (getState()->time > kTimeParisEpernay) // Between Paris and Epernay
- return "XFRA1";
-
- break;
-
- case kEntityMmeBoutarel:
- if (getProgress().field_A4)
- return "XMME4";
-
- if (getProgress().field_A8)
- return "XMME3";
-
- if (getProgress().field_A0)
- return "XMME2";
-
- if (getProgress().field_AC)
- return "XMME1";
-
- break;
-
- case kEntityBoutarel:
- if (getProgress().eventMetBoutarel)
- return "XMRB1";
-
- break;
-
- case kEntityRebecca:
- if (getProgress().field_B4)
- return "XREB1A";
-
- if (getProgress().field_B8)
- return "XREB1";
-
- break;
-
- case kEntitySophie:
- if (getProgress().field_B0)
- return "XSOP2";
-
- if (getProgress().field_BC)
- return "XSOP1B";
-
- if (getProgress().field_B4)
- return "XSOP1A";
-
- if (getProgress().field_B8)
- return "XSOP1";
-
- break;
-
- case kEntityMahmud:
- if (getProgress().field_C4)
- return "XMAH1";
-
- break;
-
- case kEntityYasmin:
- if (getProgress().eventMetYasmin)
- return "XHAR2";
-
- break;
-
- case kEntityHadija:
- if (getProgress().eventMetHadija)
- return "XHAR1";
-
- break;
-
- case kEntityAlouan:
- if (getProgress().field_DC)
- return "XHAR3";
-
- break;
-
- case kEntityGendarmes:
- if (getProgress().field_E0)
- return "XHAR4";
-
- break;
-
- case kEntityChapters:
- if (getEvent(kEventCathDream) || getEvent(kEventCathWakingUp))
- return "XTYL3";
-
- return "XTYL1";
-
- default:
- break;
- }
-
- return NULL;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Letters & Messages
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::readText(int id){
- if (!isBuffered(kEntityTables4))
- return;
-
- if (id < 0 || (id > 8 && id < 50) || id > 64)
- error("Sound::readText - attempting to use invalid id. Valid values [1;8] - [50;64], was %d", id);
-
- // Get proper message file (names are stored in sequence in the array but id is [1;8] - [50;64])
- const char *text = messages[id <= 8 ? id : id - 41];
-
- // Check if file is in cache for id [1;8]
- if (id <= 8)
- if (isBuffered(text))
- removeFromQueue(text);
-
- playSound(kEntityTables4, text, kFlagDefault);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Sound bites
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::playWarningCompartment(EntityIndex entity, ObjectIndex compartment) {
-
-#define PLAY_WARNING(index, sound1, sound2, sound3, sound4, sound5, sound6) { \
- if (_lastWarning[index] + 450 >= getState()->timeTicks) { \
- if (rnd(2)) \
- playSound(kEntityMertens, sound1, kFlagDefault); \
- else \
- playSound(kEntityMertens, rnd(2) ? sound2 : sound3, kFlagDefault); \
- } else { \
- if (rnd(2)) \
- playSound(kEntityMertens, sound4, kFlagDefault); \
- else \
- playSound(kEntityMertens, rnd(2) ? sound5 : sound6, kFlagDefault); \
- } \
- _lastWarning[index] = getState()->timeTicks; \
-}
-
- if (entity != kEntityMertens && entity != kEntityCoudert)
- return;
-
- //////////////////////////////////////////////////////////////////////////
- // Mertens
- if (entity == kEntityMertens) {
-
- switch (compartment) {
- default:
- break;
-
- case kObjectCompartment2:
- PLAY_WARNING(0, "Con1502A", "Con1500B", "Con1500C", "Con1502", "Con1500", "Con1500A");
- break;
-
- case kObjectCompartment3:
- PLAY_WARNING(1, "Con1501A", "Con1500B", "Con1500C", "Con1501", "Con1500", "Con1500A");
- break;
-
- case kObjectCompartment4:
- PLAY_WARNING(2, "Con1503", "Con1500B", "Con1500C", "Con1503", "Con1500", "Con1500A");
- break;
-
- case kObjectCompartment5:
- case kObjectCompartment6:
- case kObjectCompartment7:
- case kObjectCompartment8:
- ++_lastWarning[3];
-
- switch (_lastWarning[3]) {
- default:
- break;
-
- case 1:
- getSound()->playSound(kEntityMertens, "Con1503C", kFlagDefault);
- break;
-
- case 2:
- getSound()->playSound(kEntityMertens, rnd(2) ? "Con1503E" : "Con1503A", kFlagDefault);
- break;
-
- case 3:
- getSound()->playSound(kEntityMertens, rnd(2) ? "Con1503B" : "Con1503D", kFlagDefault);
- _lastWarning[3] = 0;
- break;
- }
- }
-
- return;
- }
-
- //////////////////////////////////////////////////////////////////////////
- // Coudert
- switch (compartment) {
- default:
- break;
-
- case kObjectCompartmentA:
- if (_lastWarning[4] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1508" : "Jac1508A", kFlagDefault);
- break;
-
- case kObjectCompartmentB:
- if (_lastWarning[5] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- if (getProgress().field_40 || (getState()->time > kTimeCityLinz && getState()->time < kTime2133000))
- getSound()->playSound(kEntityCoudert, "Jac1507A", kFlagDefault);
- else
- getSound()->playSound(kEntityCoudert, "Jac1507", kFlagDefault);
- break;
-
- case kObjectCompartmentC:
- if (_lastWarning[6] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- if (getProgress().chapter < kChapter3)
- getSound()->playSound(kEntityCoudert, "Jac1506", kFlagDefault);
- else
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1506A" : "Jac1506B", kFlagDefault);
- break;
-
- case kObjectCompartmentD:
- if (_lastWarning[7] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- getSound()->playSound(kEntityCoudert, "Jac1505", kFlagDefault);
- break;
-
- case kObjectCompartmentE:
- if (_lastWarning[8] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- if (getProgress().field_40 || (getState()->time > kTime2115000 && getState()->time < kTime2133000)) {
- getSound()->playSound(kEntityCoudert, "Jac1504B", kFlagDefault);
- break;
- }
-
- if (getEntities()->isInsideCompartment(kEntityRebecca, kCarRedSleeping, kPosition_4840))
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- else
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1504" : "Jac1504A", kFlagDefault);
- break;
-
- case kObjectCompartmentF:
- if (_lastWarning[9] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- if (getProgress().field_40 || (getState()->time > kTime2083500 && getState()->time < kTime2133000)) {
- getSound()->playSound(kEntityCoudert, "Jac1503B", kFlagDefault);
- break;
- }
-
- if (rnd(2) || getEntities()->isInsideCompartment(kEntityAnna, kCarRedSleeping, kPosition_4070))
- getSound()->playSound(kEntityCoudert, "Jac1503", kFlagDefault);
- else
- getSound()->playSound(kEntityCoudert, "Jac1503A", kFlagDefault);
- break;
-
- case kObjectCompartmentG:
- if (_lastWarning[10] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- if (rnd(2) || getEntities()->isInsideCompartment(kEntityMilos, kCarRedSleeping, kPosition_3050))
- getSound()->playSound(kEntityCoudert, "Jac1502", kFlagDefault);
- else
- getSound()->playSound(kEntityCoudert, "Jac1502A", kFlagDefault);
- break;
-
- case kObjectCompartmentH:
- if (_lastWarning[11] + 450 >= getState()->timeTicks) {
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- break;
- }
-
- if (getEntities()->isInsideCompartment(kEntityIvo, kCarRedSleeping, kPosition_2740))
- getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
- else
- getSound()->playSound(kEntityCoudert, "Jac1501", kFlagDefault);
- break;
- }
-
- // Update ticks (Compartments A - H are indexes 4 - 11)
- _lastWarning[compartment - 28] = getState()->timeTicks;
-}
-
-void SoundManager::excuseMe(EntityIndex entity, EntityIndex entity2, FlagType flag) {
- if (isBuffered(entity) && entity != kEntityPlayer && entity != kEntityChapters && entity != kEntityTrain)
- return;
-
- if (entity2 == kEntityFrancois || entity2 == kEntityMax)
- return;
-
- if (entity == kEntityFrancois && getEntityData(kEntityFrancois)->field_4A3 != 30)
- return;
-
- if (flag == kFlagNone)
- flag = getSoundFlag(entity);
-
- switch (entity) {
- default:
- break;
-
- case kEntityAnna:
- playSound(kEntityPlayer, "ANN1107A", flag);
- break;
-
- case kEntityAugust:
- switch(rnd(4)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, "AUG1100A", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, "AUG1100B", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, "AUG1100C", flag);
- break;
-
- case 3:
- playSound(kEntityPlayer, "AUG1100D", flag);
- break;
- }
- break;
-
- case kEntityMertens:
- if (Entities::isFemale(entity2)) {
- playSound(kEntityPlayer, (rnd(2) ? "CON1111" : "CON1111A"), flag);
- } else {
- if (entity2 || getProgress().jacket != kJacketGreen || !rnd(2)) {
- switch(rnd(3)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, "CON1110A", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, "CON1110C", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, "CON1110", flag);
- break;
- }
- } else {
- if (isNight()) {
- playSound(kEntityPlayer, (getProgress().field_18 == 2 ? "CON1110F" : "CON1110E"));
- } else {
- playSound(kEntityPlayer, "CON1110D");
- }
- }
- }
- break;
-
- case kEntityCoudert:
- if (Entities::isFemale(entity2)) {
- playSound(kEntityPlayer, "JAC1111D", flag);
- } else {
- if (entity2 || getProgress().jacket != kJacketGreen || !rnd(2)) {
- switch(rnd(4)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, "JAC1111", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, "JAC1111A", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, "JAC1111B", flag);
- break;
-
- case 3:
- playSound(kEntityPlayer, "JAC1111C", flag);
- break;
- }
- } else {
- playSound(kEntityPlayer, "JAC1113B", flag);
- }
- }
- break;
-
- case kEntityPascale:
- playSound(kEntityPlayer, (rnd(2) ? "HDE1002" : "HED1002A"), flag);
- break;
-
- case kEntityServers0:
- case kEntityServers1:
- switch(rnd(3)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, (entity == kEntityServers0) ? "WAT1002" : "WAT1003", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, (entity == kEntityServers0) ? "WAT1002A" : "WAT1003A", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, (entity == kEntityServers0) ? "WAT1002B" : "WAT1003B", flag);
- break;
- }
- break;
-
- case kEntityVerges:
- if (Entities::isFemale(entity2)) {
- playSound(kEntityPlayer, (rnd(2) ? "TRA1113A" : "TRA1113B"));
- } else {
- playSound(kEntityPlayer, "TRA1112", flag);
- }
- break;
-
- case kEntityTatiana:
- playSound(kEntityPlayer, (rnd(2) ? "TAT1102A" : "TAT1102B"), flag);
- break;
-
- case kEntityAlexei:
- playSound(kEntityPlayer, (rnd(2) ? "ALX1099C" : "ALX1099D"), flag);
- break;
-
- case kEntityAbbot:
- if (Entities::isFemale(entity2)) {
- playSound(kEntityPlayer, "ABB3002C", flag);
- } else {
- switch(rnd(3)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, "ABB3002", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, "ABB3002A", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, "ABB3002B", flag);
- break;
- }
- }
- break;
-
- case kEntityVesna:
- switch(rnd(3)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, "VES1109A", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, "VES1109B", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, "VES1109C", flag);
- break;
- }
- break;
-
- case kEntityKahina:
- playSound(kEntityPlayer, (rnd(2) ? "KAH1001" : "KAH1001A"), flag);
- break;
-
- case kEntityFrancois:
- case kEntityMmeBoutarel:
- switch(rnd(4)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001" : "MME1103A", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001A" : "MME1103B", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001B" : "MME1103C", flag);
- break;
-
- case 3:
- playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001C" : "MME1103D", flag);
- break;
- }
- break;
-
- case kEntityBoutarel:
- playSound(kEntityPlayer, "MRB1104", flag);
- if (flag > 2)
- getProgress().eventMetBoutarel = true;
- break;
-
- case kEntityRebecca:
- playSound(kEntityPlayer, (rnd(2) ? "REB1106" : "REB110A"), flag);
- break;
-
- case kEntitySophie: {
- switch(rnd(3)) {
- default:
- break;
-
- case 0:
- playSound(kEntityPlayer, "SOP1105", flag);
- break;
-
- case 1:
- playSound(kEntityPlayer, Entities::isFemale(entity2) ? "SOP1105C" : "SOP1105A", flag);
- break;
-
- case 2:
- playSound(kEntityPlayer, Entities::isFemale(entity2) ? "SOP1105D" : "SOP1105B", flag);
- break;
- }
- break;
- }
-
- case kEntityMahmud:
- playSound(kEntityPlayer, "MAH1101", flag);
- break;
-
- case kEntityYasmin:
- playSound(kEntityPlayer, "HAR1002", flag);
- if (flag > 2)
- getProgress().eventMetYasmin = true;
- break;
-
- case kEntityHadija:
- playSound(kEntityPlayer, (rnd(2) ? "HAR1001" : "HAR1001A"), flag);
- if (flag > 2)
- getProgress().eventMetHadija = true;
- break;
-
- case kEntityAlouan:
- playSound(kEntityPlayer, "HAR1004", flag);
- break;
- }
-}
-
-void SoundManager::excuseMeCath() {
- switch(rnd(3)) {
- default:
- playSound(kEntityPlayer, "CAT1126B");
- break;
-
- case 1:
- playSound(kEntityPlayer, "CAT1126C");
- break;
-
- case 2:
- playSound(kEntityPlayer, "CAT1126D");
- break;
- }
-}
-
-const char *SoundManager::justCheckingCath() const {
- switch(rnd(4)) {
- default:
- break;
-
- case 0:
- return "CAT5001";
-
- case 1:
- return "CAT5001A";
-
- case 2:
- return "CAT5001B";
-
- case 3:
- return "CAT5001C";
- }
-
- return "CAT5001";
-}
-
-const char *SoundManager::wrongDoorCath() const {
- switch(rnd(5)) {
- default:
- break;
-
- case 0:
- return "CAT1125";
-
- case 1:
- return "CAT1125A";
-
- case 2:
- return "CAT1125B";
-
- case 3:
- return "CAT1125C";
-
- case 4:
- return "CAT1125D";
- }
-
- return "CAT1125";
-}
-
-const char *SoundManager::justAMinuteCath() const {
- switch(rnd(3)) {
- default:
- break;
-
- case 0:
- return "CAT1520";
-
- case 1:
- return "CAT1521";
-
- case 2:
- return "CAT1125"; // ?? is this a bug in the original?
- }
-
- return "CAT1520";
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Sound flags
-//////////////////////////////////////////////////////////////////////////
-SoundManager::FlagType SoundManager::getSoundFlag(EntityIndex entity) const {
- if (entity == kEntityPlayer)
- return kFlagDefault;
-
- if (getEntityData(entity)->car != getEntityData(kEntityPlayer)->car)
- return kFlagNone;
-
- // Compute sound value
- FlagType ret = kFlag2;
-
- // Get default value if valid
- int index = ABS(getEntityData(entity)->entityPosition - getEntityData(kEntityPlayer)->entityPosition) / 230;
- if (index < 32)
- ret = soundFlags[index];
-
- if (getEntityData(entity)->location == kLocationOutsideTrain) {
- if (getEntityData(entity)->car != kCarKronos
- && !getEntities()->isOutsideAlexeiWindow()
- && !getEntities()->isOutsideAnnaWindow())
- return kFlagNone;
-
- return (FlagType)(ret / 6);
- }
-
- switch (getEntityData(entity)->car) {
- default:
- break;
-
- case kCarKronos:
- if (getEntities()->isInKronosSalon(entity) != getEntities()->isInKronosSalon(kEntityPlayer))
- ret = (FlagType)(ret * 2);
- break;
-
- case kCarGreenSleeping:
- case kCarRedSleeping:
- if (getEntities()->isInGreenCarEntrance(kEntityPlayer) && !getEntities()->isInKronosSalon(entity))
- ret = (FlagType)(ret * 2);
-
- if (getEntityData(kEntityPlayer)->location
- && (getEntityData(entity)->entityPosition != kPosition_1 || !getEntities()->isDistanceBetweenEntities(kEntityPlayer, entity, 400)))
- ret = (FlagType)(ret * 2);
- break;
-
- case kCarRestaurant:
- if (getEntities()->isInSalon(entity) == getEntities()->isInSalon(kEntityPlayer)
- && (getEntities()->isInRestaurant(entity) != getEntities()->isInRestaurant(kEntityPlayer)))
- ret = (FlagType)(ret * 2);
- else
- ret = (FlagType)(ret * 4);
- break;
- }
-
- return ret;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Subtitles
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::updateSubtitles() {
- Common::StackLock locker(_mutex);
-
- uint32 index = 0;
- SubtitleEntry *subtitle = NULL;
-
- for (Common::List<SubtitleEntry *>::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
- uint32 current_index = 0;
- SoundEntry *soundEntry = (*i)->sound;
- SoundStatus status = (SoundStatus)soundEntry->status.status;
-
- if (!(status & kSoundStatus_40)
- || status & 0x180
- || soundEntry->time == 0
- || (status & 0x1F) < 6
- || ((getFlags()->nis & 0x8000) && soundEntry->field_4C < 90)) {
- current_index = 0;
- } else {
- current_index = soundEntry->field_4C + (status & 0x1F);
-
- if (_currentSubtitle == (*i))
- current_index += 4;
- }
-
- if (index < current_index) {
- index = current_index;
- subtitle = (*i);
- }
- }
-
- if (_currentSubtitle == subtitle) {
- if (subtitle)
- setupSubtitleAndDraw(subtitle);
-
- return;
- }
-
- if (_drawSubtitles & 1)
- drawSubtitleOnScreen(subtitle);
-
- if (subtitle) {
- loadSubtitleData(subtitle);
- setupSubtitleAndDraw(subtitle);
- }
-}
-
-void SoundManager::showSubtitle(SoundEntry *entry, Common::String filename) {
- entry->subtitle = loadSubtitle(filename, entry);
-
- if (entry->subtitle->status.status2 & 4) {
- drawSubtitle(entry->subtitle);
- SAFE_DELETE(entry->subtitle);
- } else {
- entry->status.status |= kSoundStatus_20000;
- }
-}
-
-SoundManager::SubtitleEntry *SoundManager::loadSubtitle(Common::String filename, SoundEntry *soundEntry) {
- SubtitleEntry *entry = new SubtitleEntry();
- _subtitles.push_back(entry);
-
- // Set sound entry and filename
- entry->filename = filename + ".SBE";
- entry->sound = soundEntry;
-
- // Load subtitle data
- if (_engine->getResourceManager()->hasFile(filename)) {
- if (_drawSubtitles & 2)
- return entry;
-
- loadSubtitleData(entry);
- } else {
- entry->status.status = kSoundStatus_400;
- }
-
- return entry;
-}
-
-void SoundManager::loadSubtitleData(SubtitleEntry * entry) {
- entry->data = new SubtitleManager(_engine->getFont());
- entry->data->load(getArchive(entry->filename));
-
- _drawSubtitles |= 2;
- _currentSubtitle = entry;
-}
-
-void SoundManager::setupSubtitleAndDraw(SubtitleEntry *subtitle) {
- if (!subtitle->data) {
- subtitle->data = new SubtitleManager(_engine->getFont());
- subtitle->data->load(getArchive(subtitle->filename));
- }
-
- if (subtitle->data->getMaxTime() > subtitle->sound->time) {
- subtitle->status.status = kSoundStatus_400;
- } else {
- subtitle->data->setTime((uint16)subtitle->sound->time);
-
- if (_drawSubtitles & 1)
- drawSubtitleOnScreen(subtitle);
- }
-
- _currentSubtitle = subtitle;
-}
-
-void SoundManager::drawSubtitle(SubtitleEntry *subtitle) {
- // Remove subtitle from queue
- _subtitles.remove(subtitle);
-
- if (subtitle == _currentSubtitle) {
- drawSubtitleOnScreen(subtitle);
-
- _currentSubtitle = NULL;
- _drawSubtitles = 0;
- }
-}
-
-void SoundManager::drawSubtitleOnScreen(SubtitleEntry *subtitle) {
- if (!subtitle)
- error("SoundManager::drawSubtitleOnScreen: Invalid subtitle entry!");
-
- _drawSubtitles &= ~1;
-
- if (subtitle->data == NULL)
- return;
-
- if (_drawSubtitles & 1)
- _engine->getGraphicsManager()->draw(subtitle->data, GraphicsManager::kBackgroundOverlay);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Misc
-//////////////////////////////////////////////////////////////////////////
-void SoundManager::playLoopingSound() {
- warning("SoundManager::playLoopingSound: not implemented!");
-}
-
-void SoundManager::stopAllSound() {
- Common::StackLock locker(_mutex);
-
- for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
- (*i)->soundStream->stop();
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Sound filter
-//////////////////////////////////////////////////////////////////////////
-
-static const int filterData[1424] = {
- 0, 0, 0, 0, 128, 256, 384, 512, 0, 0, 0, 0, 128, 256,
- 384, 512, 0, 0, 0, 0, 192, 320, 448, 576, 0, 0, 0, 0,
- 192, 320, 448, 576, 64, 64, 64, 64, 256, 384, 512, 640,
- 64, 64, 64, 64, 256, 384, 512, 640, 128, 128, 128, 128,
- 320, 448, 576, 704, 128, 128, 128, 128, 320, 448, 576,
- 704, 192, 192, 192, 192, 384, 512, 640, 768, 192, 192,
- 192, 192, 384, 512, 640, 768, 256, 256, 256, 256, 448,
- 576, 704, 832, 256, 256, 256, 256, 448, 576, 704, 832,
- 320, 320, 320, 320, 512, 640, 768, 896, 320, 320, 320,
- 320, 512, 640, 768, 896, 384, 384, 384, 384, 576, 704,
- 832, 960, 384, 384, 384, 384, 576, 704, 832, 960, 448,
- 448, 448, 448, 640, 768, 896, 1024, 448, 448, 448, 448,
- 640, 768, 896, 1024, 512, 512, 512, 512, 704, 832, 960,
- 1088, 512, 512, 512, 512, 704, 832, 960, 1088, 576,
- 576, 576, 576, 768, 896, 1024, 1152, 576, 576, 576,
- 576, 768, 896, 1024, 1152, 640, 640, 640, 640, 832,
- 960, 1088, 1216, 640, 640, 640, 640, 832, 960, 1088,
- 1216, 704, 704, 704, 704, 896, 1024, 1152, 1280, 704,
- 704, 704, 704, 896, 1024, 1152, 1280, 768, 768, 768,
- 768, 960, 1088, 1216, 1344, 768, 768, 768, 768, 960,
- 1088, 1216, 1344, 832, 832, 832, 832, 1024, 1152, 1280,
- 1408, 832, 832, 832, 832, 1024, 1152, 1280, 1408, 896,
- 896, 896, 896, 1088, 1216, 1344, 1472, 896, 896, 896,
- 896, 1088, 1216, 1344, 1472, 960, 960, 960, 960, 1152,
- 1280, 1408, 1536, 960, 960, 960, 960, 1152, 1280, 1408,
- 1536, 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600,
- 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600, 1088,
- 1088, 1088, 1088, 1280, 1408, 1536, 1664, 1088, 1088,
- 1088, 1088, 1280, 1408, 1536, 1664, 1152, 1152, 1152,
- 1152, 1344, 1472, 1600, 1728, 1152, 1152, 1152, 1152,
- 1344, 1472, 1600, 1728, 1216, 1216, 1216, 1216, 1408,
- 1536, 1664, 1792, 1216, 1216, 1216, 1216, 1408, 1536,
- 1664, 1792, 1280, 1280, 1280, 1280, 1472, 1600, 1728,
- 1856, 1280, 1280, 1280, 1280, 1472, 1600, 1728, 1856,
- 1344, 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1344,
- 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1408, 1408,
- 1408, 1408, 1600, 1728, 1856, 1984, 1408, 1408, 1408,
- 1408, 1600, 1728, 1856, 1984, 1472, 1472, 1472, 1472,
- 1664, 1792, 1920, 2048, 1472, 1472, 1472, 1472, 1664,
- 1792, 1920, 2048, 1536, 1536, 1536, 1536, 1728, 1856,
- 1984, 2112, 1536, 1536, 1536, 1536, 1728, 1856, 1984,
- 2112, 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176,
- 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176, 1664,
- 1664, 1664, 1664, 1856, 1984, 2112, 2240, 1664, 1664,
- 1664, 1664, 1856, 1984, 2112, 2240, 1728, 1728, 1728,
- 1728, 1920, 2048, 2176, 2304, 1728, 1728, 1728, 1728,
- 1920, 2048, 2176, 2304, 1792, 1792, 1792, 1792, 1984,
- 2112, 2240, 2368, 1792, 1792, 1792, 1792, 1984, 2112,
- 2240, 2368, 1856, 1856, 1856, 1856, 2048, 2176, 2304,
- 2432, 1856, 1856, 1856, 1856, 2048, 2176, 2304, 2432,
- 1920, 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1920,
- 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1984, 1984,
- 1984, 1984, 2176, 2304, 2432, 2560, 1984, 1984, 1984,
- 1984, 2176, 2304, 2432, 2560, 2048, 2048, 2048, 2048,
- 2240, 2368, 2496, 2624, 2048, 2048, 2048, 2048, 2240,
- 2368, 2496, 2624, 2112, 2112, 2112, 2112, 2304, 2432,
- 2560, 2688, 2112, 2112, 2112, 2112, 2304, 2432, 2560,
- 2688, 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752,
- 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752, 2240,
- 2240, 2240, 2240, 2432, 2560, 2688, 2816, 2240, 2240,
- 2240, 2240, 2432, 2560, 2688, 2816, 2304, 2304, 2304,
- 2304, 2496, 2624, 2752, 2880, 2304, 2304, 2304, 2304,
- 2496, 2624, 2752, 2880, 2368, 2368, 2368, 2368, 2560,
- 2688, 2816, 2944, 2368, 2368, 2368, 2368, 2560, 2688,
- 2816, 2944, 2432, 2432, 2432, 2432, 2624, 2752, 2880,
- 3008, 2432, 2432, 2432, 2432, 2624, 2752, 2880, 3008,
- 2496, 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2496,
- 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2560, 2560,
- 2560, 2560, 2752, 2880, 3008, 3136, 2560, 2560, 2560,
- 2560, 2752, 2880, 3008, 3136, 2624, 2624, 2624, 2624,
- 2816, 2944, 3072, 3200, 2624, 2624, 2624, 2624, 2816,
- 2944, 3072, 3200, 2688, 2688, 2688, 2688, 2880, 3008,
- 3136, 3264, 2688, 2688, 2688, 2688, 2880, 3008, 3136,
- 3264, 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328,
- 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328, 2816,
- 2816, 2816, 2816, 3008, 3136, 3264, 3392, 2816, 2816,
- 2816, 2816, 3008, 3136, 3264, 3392, 2880, 2880, 2880,
- 2880, 3072, 3200, 3328, 3456, 2880, 2880, 2880, 2880,
- 3072, 3200, 3328, 3456, 2944, 2944, 2944, 2944, 3136,
- 3264, 3392, 3520, 2944, 2944, 2944, 2944, 3136, 3264,
- 3392, 3520, 3008, 3008, 3008, 3008, 3200, 3328, 3456,
- 3584, 3008, 3008, 3008, 3008, 3200, 3328, 3456, 3584,
- 3072, 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3072,
- 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3136, 3136,
- 3136, 3136, 3328, 3456, 3584, 3712, 3136, 3136, 3136,
- 3136, 3328, 3456, 3584, 3712, 3200, 3200, 3200, 3200,
- 3392, 3520, 3648, 3776, 3200, 3200, 3200, 3200, 3392,
- 3520, 3648, 3776, 3264, 3264, 3264, 3264, 3456, 3584,
- 3712, 3840, 3264, 3264, 3264, 3264, 3456, 3584, 3712,
- 3840, 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904,
- 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904, 3392,
- 3392, 3392, 3392, 3584, 3712, 3840, 3968, 3392, 3392,
- 3392, 3392, 3584, 3712, 3840, 3968, 3456, 3456, 3456,
- 3456, 3648, 3776, 3904, 4032, 3456, 3456, 3456, 3456,
- 3648, 3776, 3904, 4032, 3520, 3520, 3520, 3520, 3712,
- 3840, 3968, 4096, 3520, 3520, 3520, 3520, 3712, 3840,
- 3968, 4096, 3584, 3584, 3584, 3584, 3776, 3904, 4032,
- 4160, 3584, 3584, 3584, 3584, 3776, 3904, 4032, 4160,
- 3648, 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3648,
- 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3712, 3712,
- 3712, 3712, 3904, 4032, 4160, 4288, 3712, 3712, 3712,
- 3712, 3904, 4032, 4160, 4288, 3776, 3776, 3776, 3776,
- 3968, 4096, 4224, 4352, 3776, 3776, 3776, 3776, 3968,
- 4096, 4224, 4352, 3840, 3840, 3840, 3840, 4032, 4160,
- 4288, 4416, 3840, 3840, 3840, 3840, 4032, 4160, 4288,
- 4416, 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480,
- 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480, 3968,
- 3968, 3968, 3968, 4160, 4288, 4416, 4544, 3968, 3968,
- 3968, 3968, 4160, 4288, 4416, 4544, 4032, 4032, 4032,
- 4032, 4224, 4352, 4480, 4608, 4032, 4032, 4032, 4032,
- 4224, 4352, 4480, 4608, 4096, 4096, 4096, 4096, 4288,
- 4416, 4544, 4672, 4096, 4096, 4096, 4096, 4288, 4416,
- 4544, 4672, 4160, 4160, 4160, 4160, 4352, 4480, 4608,
- 4736, 4160, 4160, 4160, 4160, 4352, 4480, 4608, 4736,
- 4224, 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4224,
- 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4288, 4288,
- 4288, 4288, 4480, 4608, 4736, 4864, 4288, 4288, 4288,
- 4288, 4480, 4608, 4736, 4864, 4352, 4352, 4352, 4352,
- 4544, 4672, 4800, 4928, 4352, 4352, 4352, 4352, 4544,
- 4672, 4800, 4928, 4416, 4416, 4416, 4416, 4608, 4736,
- 4864, 4992, 4416, 4416, 4416, 4416, 4608, 4736, 4864,
- 4992, 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056,
- 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056, 4544,
- 4544, 4544, 4544, 4736, 4864, 4992, 5120, 4544, 4544,
- 4544, 4544, 4736, 4864, 4992, 5120, 4608, 4608, 4608,
- 4608, 4800, 4928, 5056, 5184, 4608, 4608, 4608, 4608,
- 4800, 4928, 5056, 5184, 4672, 4672, 4672, 4672, 4864,
- 4992, 5120, 5248, 4672, 4672, 4672, 4672, 4864, 4992,
- 5120, 5248, 4736, 4736, 4736, 4736, 4928, 5056, 5184,
- 5312, 4736, 4736, 4736, 4736, 4928, 5056, 5184, 5312,
- 4800, 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4800,
- 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4864, 4864,
- 4864, 4864, 5056, 5184, 5312, 5440, 4864, 4864, 4864,
- 4864, 5056, 5184, 5312, 5440, 4928, 4928, 4928, 4928,
- 5120, 5248, 5376, 5504, 4928, 4928, 4928, 4928, 5120,
- 5248, 5376, 5504, 4992, 4992, 4992, 4992, 5184, 5312,
- 5440, 5568, 4992, 4992, 4992, 4992, 5184, 5312, 5440,
- 5568, 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632,
- 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632, 5120,
- 5120, 5120, 5120, 5312, 5440, 5568, 5632, 5120, 5120,
- 5120, 5120, 5312, 5440, 5568, 5632, 5184, 5184, 5184,
- 5184, 5376, 5504, 5632, 5632, 5184, 5184, 5184, 5184,
- 5376, 5504, 5632, 5632, 5248, 5248, 5248, 5248, 5440,
- 5568, 5632, 5632, 5248, 5248, 5248, 5248, 5440, 5568,
- 5632, 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632,
- 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632, 5632,
- 5376, 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5376,
- 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5440, 5440,
- 5440, 5440, 5632, 5632, 5632, 5632, 5440, 5440, 5440,
- 5440, 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504,
- 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504, 5632,
- 5632, 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632,
- 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632, 5632,
- 5632
-};
-
-static const int filterData2[1424] = {
- 0, 2, 4, 6, 7, 9, 11, 13, 0, -2, -4, -6, -7, -9, -11,
- -13, 1, 3, 5, 7, 9, 11, 13, 15, -1, -3, -5, -7, -9,
- -11, -13, -15, 1, 3, 5, 7, 10, 12, 14, 16, -1, -3, -5,
- -7, -10, -12, -14, -16, 1, 3, 6, 8, 11, 13, 16, 18,
- -1, -3, -6, -8, -11, -13, -16, -18, 1, 4, 6, 9, 12,
- 15, 17, 20, -1, -4, -6, -9, -12, -15, -17, -20, 1, 4,
- 7, 10, 13, 16, 19, 22, -1, -4, -7, -10, -13, -16, -19,
- -22, 1, 4, 8, 11, 14, 17, 21, 24, -1, -4, -8, -11, -14,
- -17, -21, -24, 1, 5, 8, 12, 15, 19, 22, 26, -1, -5,
- -8, -12, -15, -19, -22, -26, 2, 6, 10, 14, 18, 22, 26,
- 30, -2, -6, -10, -14, -18, -22, -26, -30, 2, 6, 10,
- 14, 19, 23, 27, 31, -2, -6, -10, -14, -19, -23, -27,
- -31, 2, 7, 11, 16, 21, 26, 30, 35, -2, -7, -11, -16,
- -21, -26, -30, -35, 2, 7, 13, 18, 23, 28, 34, 39, -2,
- -7, -13, -18, -23, -28, -34, -39, 2, 8, 14, 20, 25,
- 31, 37, 43, -2, -8, -14, -20, -25, -31, -37, -43, 3,
- 9, 15, 21, 28, 34, 40, 46, -3, -9, -15, -21, -28, -34,
- -40, -46, 3, 10, 17, 24, 31, 38, 45, 52, -3, -10, -17,
- -24, -31, -38, -45, -52, 3, 11, 19, 27, 34, 42, 50,
- 58, -3, -11, -19, -27, -34, -42, -50, -58, 4, 12, 21,
- 29, 38, 46, 55, 63, -4, -12, -21, -29, -38, -46, -55,
- -63, 4, 13, 23, 32, 41, 50, 60, 69, -4, -13, -23, -32,
- -41, -50, -60, -69, 5, 15, 25, 35, 46, 56, 66, 76, -5,
- -15, -25, -35, -46, -56, -66, -76, 5, 16, 28, 39, 50,
- 61, 73, 84, -5, -16, -28, -39, -50, -61, -73, -84, 6,
- 18, 31, 43, 56, 68, 81, 93, -6, -18, -31, -43, -56,
- -68, -81, -93, 6, 20, 34, 48, 61, 75, 89, 103, -6, -20,
- -34, -48, -61, -75, -89, -103, 7, 22, 37, 52, 67, 82,
- 97, 112, -7, -22, -37, -52, -67, -82, -97, -112, 8,
- 24, 41, 57, 74, 90, 107, 123, -8, -24, -41, -57, -74,
- -90, -107, -123, 9, 27, 45, 63, 82, 100, 118, 136, -9,
- -27, -45, -63, -82, -100, -118, -136, 10, 30, 50, 70,
- 90, 110, 130, 150, -10, -30, -50, -70, -90, -110, -130,
- -150, 11, 33, 55, 77, 99, 121, 143, 165, -11, -33, -55,
- -77, -99, -121, -143, -165, 12, 36, 60, 84, 109, 133,
- 157, 181, -12, -36, -60, -84, -109, -133, -157, -181,
- 13, 40, 66, 93, 120, 147, 173, 200, -13, -40, -66, -93,
- -120, -147, -173, -200, 14, 44, 73, 103, 132, 162, 191,
- 221, -14, -44, -73, -103, -132, -162, -191, -221, 16,
- 48, 81, 113, 146, 178, 211, 243, -16, -48, -81, -113,
- -146, -178, -211, -243, 17, 53, 89, 125, 160, 196, 232,
- 268, -17, -53, -89, -125, -160, -196, -232, -268, 19,
- 58, 98, 137, 176, 215, 255, 294, -19, -58, -98, -137,
- -176, -215, -255, -294, 21, 64, 108, 151, 194, 237,
- 281, 324, -21, -64, -108, -151, -194, -237, -281, -324,
- 23, 71, 118, 166, 213, 261, 308, 356, -23, -71, -118,
- -166, -213, -261, -308, -356, 26, 78, 130, 182, 235,
- 287, 339, 391, -26, -78, -130, -182, -235, -287, -339,
- -391, 28, 86, 143, 201, 258, 316, 373, 431, -28, -86,
- -143, -201, -258, -316, -373, -431, 31, 94, 158, 221,
- 284, 347, 411, 474, -31, -94, -158, -221, -284, -347,
- -411, -474, 34, 104, 174, 244, 313, 383, 453, 523, -34,
- -104, -174, -244, -313, -383, -453, -523, 38, 115, 191,
- 268, 345, 422, 498, 575, -38, -115, -191, -268, -345,
- -422, -498, -575, 42, 126, 210, 294, 379, 463, 547,
- 631, -42, -126, -210, -294, -379, -463, -547, -631,
- 46, 139, 231, 324, 417, 510, 602, 695, -46, -139, -231,
- -324, -417, -510, -602, -695, 51, 153, 255, 357, 459,
- 561, 663, 765, -51, -153, -255, -357, -459, -561, -663,
- -765, 56, 168, 280, 392, 505, 617, 729, 841, -56, -168,
- -280, -392, -505, -617, -729, -841, 61, 185, 308, 432,
- 555, 679, 802, 926, -61, -185, -308, -432, -555, -679,
- -802, -926, 68, 204, 340, 476, 612, 748, 884, 1020,
- -68, -204, -340, -476, -612, -748, -884, -1020, 74,
- 224, 373, 523, 672, 822, 971, 1121, -74, -224, -373,
- -523, -672, -822, -971, -1121, 82, 246, 411, 575, 740,
- 904, 1069, 1233, -82, -246, -411, -575, -740, -904,
- -1069, -1233, 90, 271, 452, 633, 814, 995, 1176, 1357,
- -90, -271, -452, -633, -814, -995, -1176, -1357, 99,
- 298, 497, 696, 895, 1094, 1293, 1492, -99, -298, -497,
- -696, -895, -1094, -1293, -1492, 109, 328, 547, 766,
- 985, 1204, 1423, 1642, -109, -328, -547, -766, -985,
- -1204, -1423, -1642, 120, 361, 601, 842, 1083, 1324,
- 1564, 1805, -120, -361, -601, -842, -1083, -1324, -1564,
- -1805, 132, 397, 662, 927, 1192, 1457, 1722, 1987, -132,
- -397, -662, -927, -1192, -1457, -1722, -1987, 145, 437,
- 728, 1020, 1311, 1603, 1894, 2186, -145, -437, -728,
- -1020, -1311, -1603, -1894, -2186, 160, 480, 801, 1121,
- 1442, 1762, 2083, 2403, -160, -480, -801, -1121, -1442,
- -1762, -2083, -2403, 176, 529, 881, 1234, 1587, 1940,
- 2292, 2645, -176, -529, -881, -1234, -1587, -1940, -2292,
- -2645, 194, 582, 970, 1358, 1746, 2134, 2522, 2910,
- -194, -582, -970, -1358, -1746, -2134, -2522, -2910,
- 213, 640, 1066, 1493, 1920, 2347, 2773, 3200, -213,
- -640, -1066, -1493, -1920, -2347, -2773, -3200, 234,
- 704, 1173, 1643, 2112, 2582, 3051, 3521, -234, -704,
- -1173, -1643, -2112, -2582, -3051, -3521, 258, 774,
- 1291, 1807, 2324, 2840, 3357, 3873, -258, -774, -1291,
- -1807, -2324, -2840, -3357, -3873, 284, 852, 1420, 1988,
- 2556, 3124, 3692, 4260, -284, -852, -1420, -1988, -2556,
- -3124, -3692, -4260, 312, 937, 1561, 2186, 2811, 3436,
- 4060, 4685, -312, -937, -1561, -2186, -2811, -3436,
- -4060, -4685, 343, 1030, 1718, 2405, 3092, 3779, 4467,
- 5154, -343, -1030, -1718, -2405, -3092, -3779, -4467,
- -5154, 378, 1134, 1890, 2646, 3402, 4158, 4914, 5670,
- -378, -1134, -1890, -2646, -3402, -4158, -4914, -5670,
- 415, 1247, 2079, 2911, 3742, 4574, 5406, 6238, -415,
- -1247, -2079, -2911, -3742, -4574, -5406, -6238, 457,
- 1372, 2287, 3202, 4117, 5032, 5947, 6862, -457, -1372,
- -2287, -3202, -4117, -5032, -5947, -6862, 503, 1509,
- 2516, 3522, 4529, 5535, 6542, 7548, -503, -1509, -2516,
- -3522, -4529, -5535, -6542, -7548, 553, 1660, 2767,
- 3874, 4981, 6088, 7195, 8302, -553, -1660, -2767, -3874,
- -4981, -6088, -7195, -8302, 608, 1826, 3044, 4262, 5479,
- 6697, 7915, 9133, -608, -1826, -3044, -4262, -5479,
- -6697, -7915, -9133, 669, 2009, 3348, 4688, 6027, 7367,
- 8706, 10046, -669, -2009, -3348, -4688, -6027, -7367,
- -8706, -10046, 736, 2210, 3683, 5157, 6630, 8104, 9577,
- 11051, -736, -2210, -3683, -5157, -6630, -8104, -9577,
- -11051, 810, 2431, 4052, 5673, 7294, 8915, 10536, 12157,
- -810, -2431, -4052, -5673, -7294, -8915, -10536, -12157,
- 891, 2674, 4457, 6240, 8023, 9806, 11589, 13372, -891,
- -2674, -4457, -6240, -8023, -9806, -11589, -13372, 980,
- 2941, 4903, 6864, 8825, 10786, 12748, 14709, -980, -2941,
- -4903, -6864, -8825, -10786, -12748, -14709, 1078, 3236,
- 5393, 7551, 9708, 11866, 14023, 16181, -1078, -3236,
- -5393, -7551, -9708, -11866, -14023, -16181, 1186, 3559,
- 5933, 8306, 10679, 13052, 15426, 17799, -1186, -3559,
- -5933, -8306, -10679, -13052, -15426, -17799, 1305,
- 3915, 6526, 9136, 11747, 14357, 16968, 19578, -1305,
- -3915, -6526, -9136, -11747, -14357, -16968, -19578,
- 1435, 4307, 7179, 10051, 12922, 15794, 18666, 21538,
- -1435, -4307, -7179, -10051, -12922, -15794, -18666,
- -21538, 1579, 4738, 7896, 11055, 14214, 17373, 20531,
- 23690, -1579, -4738, -7896, -11055, -14214, -17373,
- -20531, -23690, 1737, 5212, 8686, 12161, 15636, 19111,
- 22585, 26060, -1737, -5212, -8686, -12161, -15636, -19111,
- -22585, -26060, 1911, 5733, 9555, 13377, 17200, 21022,
- 24844, 28666, -1911, -5733, -9555, -13377, -17200, -21022,
- -24844, -28666, 2102, 6306, 10511, 14715, 18920, 23124,
- 27329, 31533, -2102, -6306, -10511, -14715, -18920,
- -23124, -27329, -31533, 2312, 6937, 11562, 16187, 20812,
- 25437, 30062, 32767, -2312, -6937, -11562, -16187, -20812,
- -25437, -30062, -32767, 2543, 7631, 12718, 17806, 22893,
- 27981, 32767, 32767, -2543, -7631, -12718, -17806, -22893,
- -27981, -32767, -32767, 2798, 8394, 13990, 19586, 25183,
- 30779, 32767, 32767, -2798, -8394, -13990, -19586, -25183,
- -30779, -32767, -32767, 3077, 9233, 15389, 21545, 27700,
- 32767, 32767, 32767, -3077, -9233, -15389, -21545, -27700,
- -32767, -32767, -32767, 3385, 10157, 16928, 23700, 30471,
- 32767, 32767, 32767, -3385, -10157, -16928, -23700,
- -30471, -32767, -32767, -32767, 3724, 11172, 18621,
- 26069, 32767, 32767, 32767, 32767, -3724, -11172, -18621,
- -26069, -32767, -32767, -32767, -32767, 4095, 12287,
- 20479, 28671, 32767, 32767, 32767, 32767, -4095, -12287,
- -20479, -28671, -32767, -32767, -32767, -32767
-};
-
-static const int p1s[17] = { 0, 4, 3, 4, 2, 4, 3, 4, 1, 4, 3, 4, 2, 4, 3, 4, 0 };
-static const int p2s[17] = { 0, 1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15, 1 };
-
-static void soundFilter(byte *data, int16 *buffer, int p1, int p2);
-
-void SoundManager::applyFilter(SoundEntry *entry, int16 *buffer) {
- if ((((byte *)entry->soundData)[1] << 6) > 0x1600) {
- entry->status.status |= 0x20000000;
- } else {
- int variant = entry->status.status & 0x1f;
-
- soundFilter((byte *)entry->soundData, buffer, p1s[variant], p2s[variant]);
- }
-}
-
-
-static void soundFilter(byte *data, int16 *buffer, int p1, int p2) {
- int data1, data2, data1p, data2p;
- byte idx;
-
- data2 = data[0];
- data1 = data[1] << 6;
-
- data += 2;
-
- for (int count = 0; count < 735; count++) {
- idx = data[count] >> 4;
- data1p = filterData[idx + data1];
- data2p = CLIP(filterData2[idx + data1] + data2, -32767, 32767);
-
- buffer[2 * count] = (p2 * data2p) >> p1;
-
- idx = data[count] & 0xF;
-
- data1 = filterData[idx + data1p];
- data2 = CLIP(filterData2[idx + data1p] + data2p, -32767, 32767);
- buffer[2 * count + 1] = (p2 * data2) >> p1;
- }
-}
-
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/game/sound.h b/engines/lastexpress/game/sound.h
deleted file mode 100644
index 839c868813..0000000000
--- a/engines/lastexpress/game/sound.h
+++ /dev/null
@@ -1,389 +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.
- *
- */
-
-#ifndef LASTEXPRESS_SOUND_H
-#define LASTEXPRESS_SOUND_H
-
-/*
-
- Sound entry: 68 bytes (this is what appears in the savegames)
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - entity
- uint32 {4} - ??
- uint32 {4} - ??
- char {16} - name 1
- char {16} - name 2
-
- Sound queue entry: 120 bytes
- uint16 {2} - status
- byte {1} - ??
- byte {1} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - file data pointer
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - archive structure pointer
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - ??
- uint32 {4} - entity
- uint32 {4} - ??
- uint32 {4} - ??
- char {16} - name 1
- char {16} - name 2
- uint32 {4} - pointer to next entry in the queue
- uint32 {4} - subtitle data pointer
-
-*/
-
-#include "lastexpress/data/snd.h"
-#include "lastexpress/data/subtitle.h"
-
-#include "lastexpress/shared.h"
-
-#include "lastexpress/helpers.h"
-
-#include "common/list.h"
-#include "common/mutex.h"
-#include "common/system.h"
-#include "common/serializer.h"
-
-namespace LastExpress {
-
-class LastExpressEngine;
-class SubtitleManager;
-
-class SoundManager : Common::Serializable {
-public:
- enum SoundType {
- kSoundTypeNone = 0,
- kSoundType1,
- kSoundType2,
- kSoundType3,
- kSoundType4,
- kSoundType5,
- kSoundType6,
- kSoundType7,
- kSoundType8,
- kSoundType9,
- kSoundType10,
- kSoundType11,
- kSoundType12,
- kSoundType13,
- kSoundType14,
- kSoundType15,
- kSoundType16
- };
-
- enum FlagType {
- kFlagInvalid = -1,
- kFlagNone = 0x0,
- kFlag2 = 0x2,
- kFlag3 = 0x3,
- kFlag4 = 0x4,
- kFlag5 = 0x5,
- kFlag6 = 0x6,
- kFlag7 = 0x7,
- kFlag8 = 0x8,
- kFlag9 = 0x9,
- kFlag10 = 0xA,
- kFlag11 = 0xB,
- kFlag12 = 0xC,
- kFlag13 = 0xD,
- kFlag14 = 0xE,
- kFlag15 = 0xF,
- kFlagDefault = 0x10,
-
- kFlagType1_2 = 0x1000000,
- kFlagSteam = 0x1001007,
- kFlagType13 = 0x3000000,
- kFlagMenuClock = 0x3080010,
- kFlagType7 = 0x4000000,
- kFlagType11 = 0x5000000,
- kFlagMusic = 0x5000010,
- kFlagType3 = 0x6000000,
- kFlagLoop = 0x6001008,
- kFlagType9 = 0x7000000
- };
-
- SoundManager(LastExpressEngine *engine);
- ~SoundManager();
-
- // Timer
- void handleTimer();
-
- // State
- void resetState() { _state |= kSoundType1; }
-
- // Sound queue
- void updateQueue();
- void resetQueue(SoundType type1, SoundType type2 = kSoundTypeNone);
- void clearQueue();
-
- // Subtitles
- void updateSubtitles();
-
- // Entry
- bool isBuffered(Common::String filename, bool testForEntity = false);
- bool isBuffered(EntityIndex entity);
- void setupEntry(SoundType type, EntityIndex index);
- void processEntry(EntityIndex entity);
- void processEntry(SoundType type);
- void processEntry(Common::String filename);
- void processEntries();
- void removeFromQueue(Common::String filename);
- void removeFromQueue(EntityIndex entity);
- uint32 getEntryTime(EntityIndex index);
-
- // Misc
- void unknownFunction4();
- void clearStatus();
-
- // Sound playing
- void playSound(EntityIndex entity, Common::String filename, FlagType flag = kFlagInvalid, byte a4 = 0);
- bool playSoundWithSubtitles(Common::String filename, FlagType flag, EntityIndex entity, byte a4 = 0);
- void playSoundEvent(EntityIndex entity, byte action, byte a3 = 0);
- void playDialog(EntityIndex entity, EntityIndex entityDialog, FlagType flag, byte a4);
- void playSteam(CityIndex index);
- void playFightSound(byte action, byte a4);
- void playLocomotiveSound();
- void playWarningCompartment(EntityIndex entity, ObjectIndex compartment);
-
- // Dialog & Letters
- void readText(int id);
- const char *getDialogName(EntityIndex entity) const;
-
- // Sound bites
- void excuseMe(EntityIndex entity, EntityIndex entity2 = kEntityPlayer, FlagType flag = kFlagNone);
- void excuseMeCath();
- const char *justCheckingCath() const;
- const char *wrongDoorCath() const;
- const char *justAMinuteCath() const;
-
- // FLags
- SoundManager::FlagType getSoundFlag(EntityIndex index) const;
-
- // Debug
- void stopAllSound();
-
- // Serializable
- void saveLoadWithSerializer(Common::Serializer &ser);
- uint32 count();
-
-private:
- typedef int32 *SoundBuffer;
-
- enum SoundStatus {
- kSoundStatus_20 = 0x20,
- kSoundStatus_40 = 0x40,
- kSoundStatus_180 = 0x180,
- kSoundStatusRemoved = 0x200,
- kSoundStatus_400 = 0x400,
-
- kSoundStatus_8000 = 0x8000,
- kSoundStatus_20000 = 0x20000,
- kSoundStatus_100000 = 0x100000,
- kSoundStatus_40000000 = 0x40000000,
-
- kSoundStatusClear0 = 0x10,
- kSoundStatusClear1 = 0x1F,
- kSoundStatusClear2 = 0x80,
- kSoundStatusClear3 = 0x200,
- kSoundStatusClear4 = 0x800,
- kSoundStatusClearAll = 0xFFFFFFE0
- };
-
- enum SoundState {
- kSoundState0 = 0,
- kSoundState1 = 1,
- kSoundState2 = 2
- };
-
- union SoundStatusUnion {
- uint32 status;
- byte status1;
- byte status2;
- byte status3;
- byte status4;
-
- SoundStatusUnion() {
- status = 0;
- }
- };
-
- struct SubtitleEntry;
-
- struct SoundEntry {
- SoundStatusUnion status;
- SoundType type; // int
- //int data;
- //int endOffset;
- int currentDataPtr;
- void *soundData;
- //int currentBufferPtr;
- int blockCount;
- uint32 time;
- //int size;
- //int field_28;
- Common::SeekableReadStream *stream; // int
- //int field_30;
- int field_34;
- int field_38;
- int field_3C;
- int field_40;
- EntityIndex entity;
- int field_48;
- uint32 field_4C;
- Common::String name1; //char[16];
- Common::String name2; //char[16];
- //int next; // offset to the next structure in the list (not used)
- SubtitleEntry *subtitle;
-
- // Sound stream
- StreamedSound *soundStream;
-
- SoundEntry() {
- status.status = 0;
- type = kSoundTypeNone;
-
- currentDataPtr = 0;
- soundData = NULL;
-
- blockCount = 0;
- time = 0;
-
- stream = NULL;
-
- field_34 = 0;
- field_38 = 0;
- field_3C = 0;
- field_40 = 0;
- entity = kEntityPlayer;
- field_48 = 0;
- field_4C = 0;
-
- subtitle = NULL;
-
- soundStream = NULL;
- }
-
- ~SoundEntry() {
- // Entries that have been queued would have their streamed disposed automatically
- if (!soundStream)
- SAFE_DELETE(stream);
-
- delete soundStream;
- }
- };
-
- struct SubtitleEntry {
- Common::String filename;
- SoundStatusUnion status;
- SoundEntry *sound;
- SubtitleManager *data;
-
- SubtitleEntry() {
- status.status = 0;
- sound = NULL;
- data = NULL;
- }
-
- ~SubtitleEntry() {
- SAFE_DELETE(data);
- }
- };
-
- // Engine
- LastExpressEngine *_engine;
-
- // State flag
- int _state;
- SoundType _currentType;
-
- Common::Mutex _mutex;
-
- // Unknown data
- uint32 _data0;
- uint32 _data1;
- uint32 _data2;
- uint32 _flag;
-
- // Filters
- int32 _buffer[2940]; ///< Static sound buffer
-
- // Compartment warnings by Mertens or Coudert
- uint32 _lastWarning[12];
-
- // Looping sound
- void playLoopingSound();
-
- // Sound entries
- Common::List<SoundEntry *> _soundList; ///< List of all sound entries
- Common::List<SoundEntry *> _soundCache; ///< List of entries with a data buffer
- void *_soundCacheData;
-
- SoundEntry *getEntry(EntityIndex index);
- SoundEntry *getEntry(Common::String name);
- SoundEntry *getEntry(SoundType type);
-
- void setupEntry(SoundEntry *entry, Common::String name, FlagType flag, int a4);
- void setEntryType(SoundEntry *entry, FlagType flag);
- void setEntryStatus(SoundEntry *entry, FlagType flag) const;
- void setInCache(SoundEntry *entry);
- bool setupCache(SoundEntry *entry);
- void removeFromCache(SoundEntry *entry);
- void loadSoundData(SoundEntry *entry, Common::String name);
-
- void updateEntry(SoundEntry *entry, uint value) const;
- void updateEntryState(SoundEntry *entry) const;
- void resetEntry(SoundEntry *entry) const;
- void removeEntry(SoundEntry *entry);
-
- // Subtitles
- int _drawSubtitles;
- Common::List<SubtitleEntry *> _subtitles;
- SubtitleEntry *_currentSubtitle;
- void showSubtitle(SoundEntry *entry, Common::String filename);
- SubtitleEntry *loadSubtitle(Common::String filename, SoundEntry *soundEntry);
- void loadSubtitleData(SubtitleEntry * entry);
- void setupSubtitleAndDraw(SubtitleEntry *subtitle);
- void drawSubtitle(SubtitleEntry *subtitle);
- void drawSubtitleOnScreen(SubtitleEntry *subtitle);
-
- // Sound filter
- void applyFilter(SoundEntry *entry, int16 *buffer);
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_SOUND_H
diff --git a/engines/lastexpress/game/state.cpp b/engines/lastexpress/game/state.cpp
index 0cf2ddba40..f3fd9720b1 100644
--- a/engines/lastexpress/game/state.cpp
+++ b/engines/lastexpress/game/state.cpp
@@ -57,7 +57,7 @@ bool State::isNightTime() const {
void State::getHourMinutes(uint32 time, uint8 *hours, uint8 *minutes) {
if (hours == NULL || minutes == NULL)
- error("State::getHourMinutes: invalid parameters passed!");
+ error("[State::getHourMinutes] Invalid parameters passed");
*hours = (uint8)((time % 1296000) / 54000);
*minutes = (uint8)((time % 54000) / 900);
diff --git a/engines/lastexpress/game/state.h b/engines/lastexpress/game/state.h
index 8f71e7d424..c937fdce9f 100644
--- a/engines/lastexpress/game/state.h
+++ b/engines/lastexpress/game/state.h
@@ -325,7 +325,7 @@ public:
switch (index) {
default:
- error("GameProgress::isEqual: invalid index value (was: %d, max:127)", index);
+ error("[GameProgress::getValueName] Invalid index value (was: %d, max:127)", index);
break;
EXPOSE_VALUE(0, field_0);
diff --git a/engines/lastexpress/graphics.cpp b/engines/lastexpress/graphics.cpp
index abbdf2b766..e129457256 100644
--- a/engines/lastexpress/graphics.cpp
+++ b/engines/lastexpress/graphics.cpp
@@ -72,7 +72,7 @@ void GraphicsManager::clear(BackgroundType type) {
void GraphicsManager::clear(BackgroundType type, const Common::Rect &rect) {
switch (type) {
default:
- error("GraphicsManager::clear() - Unknown background type: %d", type);
+ error("[GraphicsManager::clear] Unknown background type: %d", type);
break;
case kBackgroundA:
@@ -105,7 +105,7 @@ bool GraphicsManager::draw(Drawable *drawable, BackgroundType type, bool transit
Graphics::Surface *GraphicsManager::getSurface(BackgroundType type) {
switch (type) {
default:
- error("GraphicsManager::getSurface() - Unknown surface type: %d", type);
+ error("[GraphicsManager::getSurface] Unknown surface type: %d", type);
break;
case kBackgroundA:
@@ -121,7 +121,7 @@ Graphics::Surface *GraphicsManager::getSurface(BackgroundType type) {
return &_inventory;
case kBackgroundAll:
- error("GraphicsManager::getSurface() - cannot return a surface for kBackgroundAll!");
+ error("[GraphicsManager::getSurface] Cannot return a surface for kBackgroundAll");
break;
}
}
diff --git a/engines/lastexpress/helpers.h b/engines/lastexpress/helpers.h
index 594c8b0400..7f3f1e246c 100644
--- a/engines/lastexpress/helpers.h
+++ b/engines/lastexpress/helpers.h
@@ -63,6 +63,7 @@
// Sound
#define getSound() _engine->getSoundManager()
+#define getSoundQueue() _engine->getSoundManager()->getQueue()
// Others
#define getEntityData(entity) getEntities()->getData(entity)
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index e162998719..250fa0f2d0 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -26,10 +26,13 @@
#include "lastexpress/data/font.h"
#include "lastexpress/game/logic.h"
-#include "lastexpress/game/menu.h"
#include "lastexpress/game/scenes.h"
#include "lastexpress/game/state.h"
-#include "lastexpress/game/sound.h"
+
+#include "lastexpress/menu/menu.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
#include "lastexpress/graphics.h"
#include "lastexpress/helpers.h"
@@ -39,6 +42,7 @@
#include "common/debug-channels.h"
#include "common/error.h"
#include "common/fs.h"
+#include "common/timer.h"
#include "engines/util.h"
@@ -143,15 +147,15 @@ Common::Error LastExpressEngine::run() {
// Start sound manager and setup timer
_soundMan = new SoundManager(this);
- _timer->installTimerProc(&soundTimer, 17000, this);
+ _timer->installTimerProc(&soundTimer, 17000, this, "lastexpressSound");
// Menu
_menu = new Menu(this);
_menu->show(false, kSavegameTypeIndex, 0);
while (!shouldQuit()) {
- _soundMan->updateQueue();
- _soundMan->updateSubtitles();
+ _soundMan->getQueue()->updateQueue();
+ _soundMan->getQueue()->updateSubtitles();
if (handleEvents())
continue;
@@ -182,7 +186,7 @@ void LastExpressEngine::pollEvents() {
bool LastExpressEngine::handleEvents() {
// Make sure all the subsystems have been initialized
if (!_debugger || !_graphicsMan)
- error("LastExpressEngine::handleEvents: called before the required subsystems have been initialized!");
+ error("[LastExpressEngine::handleEvents] Called before the required subsystems have been initialized");
// Execute stored commands
if (_debugger->hasCommand()) {
@@ -279,7 +283,7 @@ void LastExpressEngine::soundTimer(void *refCon) {
void LastExpressEngine::handleSoundTimer() {
if (_frameCounter & 1)
if (_soundMan)
- _soundMan->handleTimer();
+ _soundMan->getQueue()->handleTimer();
_frameCounter++;
}
@@ -288,22 +292,34 @@ void LastExpressEngine::handleSoundTimer() {
/// Event Handling
///////////////////////////////////////////////////////////////////////////////////
void LastExpressEngine::backupEventHandlers() {
+ if (_eventMouseBackup != NULL || _eventTickBackup != NULL)
+ error("[LastExpressEngine::backupEventHandlers] backup event handlers are already set");
+
_eventMouseBackup = _eventMouse;
_eventTickBackup = _eventTick;
}
void LastExpressEngine::restoreEventHandlers() {
if (_eventMouseBackup == NULL || _eventTickBackup == NULL)
- error("LastExpressEngine::restoreEventHandlers: restore called before backing up the event handlers!");
+ error("[LastExpressEngine::restoreEventHandlers] restore called before backing up the event handlers");
+
+ // Cleanup previous event handlers
+ SAFE_DELETE(_eventMouse);
+ SAFE_DELETE(_eventTick);
_eventMouse = _eventMouseBackup;
_eventTick = _eventTickBackup;
+
+ _eventMouseBackup = NULL;
+ _eventTickBackup = NULL;
}
void LastExpressEngine::setEventHandlers(EventHandler::EventFunction *mouse, EventHandler::EventFunction *tick) {
- // Cleanup previous event handlers
- delete _eventMouse;
- delete _eventTick;
+ if (_eventMouse != _eventMouseBackup)
+ SAFE_DELETE(_eventMouse);
+
+ if (_eventTick != _eventTickBackup)
+ SAFE_DELETE(_eventTick);
_eventMouse = mouse;
_eventTick = tick;
diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h
index f8f38788a0..1431b79b9f 100644
--- a/engines/lastexpress/lastexpress.h
+++ b/engines/lastexpress/lastexpress.h
@@ -27,7 +27,6 @@
#include "lastexpress/eventhandler.h"
#include "common/random.h"
-#include "common/timer.h"
#include "engines/engine.h"
diff --git a/engines/lastexpress/menu/clock.cpp b/engines/lastexpress/menu/clock.cpp
new file mode 100644
index 0000000000..dedf045940
--- /dev/null
+++ b/engines/lastexpress/menu/clock.cpp
@@ -0,0 +1,106 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/menu/clock.h"
+
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/game/scenes.h"
+#include "lastexpress/game/state.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+Clock::Clock(LastExpressEngine *engine) : _engine(engine), _frameMinutes(NULL), _frameHour(NULL), _frameSun(NULL), _frameDate(NULL) {
+ _frameMinutes = new SequenceFrame(loadSequence("eggmin.seq"), 0, true);
+ _frameHour = new SequenceFrame(loadSequence("egghour.seq"), 0, true);
+ _frameSun = new SequenceFrame(loadSequence("sun.seq"), 0, true);
+ _frameDate = new SequenceFrame(loadSequence("datenew.seq"), 0, true);
+}
+
+Clock::~Clock() {
+ SAFE_DELETE(_frameMinutes);
+ SAFE_DELETE(_frameHour);
+ SAFE_DELETE(_frameSun);
+ SAFE_DELETE(_frameDate);
+
+ // Zero passed pointers
+ _engine = NULL;
+}
+
+void Clock::clear() {
+ getScenes()->removeFromQueue(_frameMinutes);
+ getScenes()->removeFromQueue(_frameHour);
+ getScenes()->removeFromQueue(_frameSun);
+ getScenes()->removeFromQueue(_frameDate);
+}
+
+void Clock::draw(uint32 time) {
+ assert(time >= kTimeCityParis && time <= kTimeCityConstantinople);
+
+ // Check that sequences have been loaded
+ if (!_frameMinutes || !_frameHour || !_frameSun || !_frameDate)
+ error("[Clock::draw] Clock sequences have not been loaded correctly");
+
+ // Clear existing frames
+ clear();
+
+ // Game starts at: 1037700 = 7:13 p.m. on July 24, 1914
+ // Game ends at: 4941000 = 7:30 p.m. on July 26, 1914
+ // Game lasts for: 3903300 = 2 days + 17 mins = 2897 mins
+
+ // 15 = 1 second
+ // 15 * 60 = 900 = 1 minute
+ // 900 * 60 = 54000 = 1 hour
+ // 54000 * 24 = 1296000 = 1 day
+
+ // Calculate each sequence index from the current time
+
+ uint8 hour = 0;
+ uint8 minute = 0;
+ State::getHourMinutes(time, &hour, &minute);
+ uint32 index_date = 18 * time / 1296000;
+ if (hour == 23)
+ index_date += 18 * minute / 60;
+
+ // Set sequences frames
+ _frameMinutes->setFrame(minute);
+ _frameHour->setFrame((5 * hour + minute / 12) % 60);
+ _frameSun->setFrame((5 * hour + minute / 12) % 120);
+ _frameDate->setFrame((uint16)index_date);
+
+ // Adjust z-order and queue
+ _frameMinutes->getInfo()->location = 1;
+ _frameHour->getInfo()->location = 1;
+ _frameSun->getInfo()->location = 1;
+ _frameDate->getInfo()->location = 1;
+
+ getScenes()->addToQueue(_frameMinutes);
+ getScenes()->addToQueue(_frameHour);
+ getScenes()->addToQueue(_frameSun);
+ getScenes()->addToQueue(_frameDate);
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/menu/clock.h b/engines/lastexpress/menu/clock.h
new file mode 100644
index 0000000000..339a18604f
--- /dev/null
+++ b/engines/lastexpress/menu/clock.h
@@ -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.
+ *
+ */
+
+#ifndef LASTEXPRESS_CLOCK_H
+#define LASTEXPRESS_CLOCK_H
+
+#include "common/scummsys.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+class SequenceFrame;
+
+class Clock {
+public:
+ explicit Clock(LastExpressEngine *engine);
+ ~Clock();
+
+ void draw(uint32 time);
+ void clear();
+
+private:
+ LastExpressEngine *_engine;
+
+ // Frames
+ SequenceFrame *_frameMinutes;
+ SequenceFrame *_frameHour;
+ SequenceFrame *_frameSun;
+ SequenceFrame *_frameDate;
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_CLOCK_H
diff --git a/engines/lastexpress/game/menu.cpp b/engines/lastexpress/menu/menu.cpp
index f9eef26326..f1a8bebe94 100644
--- a/engines/lastexpress/game/menu.cpp
+++ b/engines/lastexpress/menu/menu.cpp
@@ -20,7 +20,7 @@
*
*/
-#include "lastexpress/game/menu.h"
+#include "lastexpress/menu/menu.h"
// Data
#include "lastexpress/data/animation.h"
@@ -28,15 +28,21 @@
#include "lastexpress/data/snd.h"
#include "lastexpress/data/scene.h"
-#include "lastexpress/game/fight.h"
+#include "lastexpress/fight/fight.h"
+
#include "lastexpress/game/inventory.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/savegame.h"
#include "lastexpress/game/savepoint.h"
#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/sound.h"
#include "lastexpress/game/state.h"
+#include "lastexpress/menu/clock.h"
+#include "lastexpress/menu/trainline.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
#include "lastexpress/graphics.h"
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
@@ -118,45 +124,6 @@ enum StartMenuTooltips {
//////////////////////////////////////////////////////////////////////////
// DATA
//////////////////////////////////////////////////////////////////////////
-
-// Information about the cities on the train line
-static const struct {
- uint8 frame;
- TimeValue time;
-} _trainCities[31] = {
- {0, kTimeCityParis},
- {9, kTimeCityEpernay},
- {11, kTimeCityChalons},
- {16, kTimeCityBarLeDuc},
- {21, kTimeCityNancy},
- {25, kTimeCityLuneville},
- {35, kTimeCityAvricourt},
- {37, kTimeCityDeutschAvricourt},
- {40, kTimeCityStrasbourg},
- {53, kTimeCityBadenOos},
- {56, kTimeCityKarlsruhe},
- {60, kTimeCityStuttgart},
- {63, kTimeCityGeislingen},
- {66, kTimeCityUlm},
- {68, kTimeCityAugsburg},
- {73, kTimeCityMunich},
- {84, kTimeCitySalzbourg},
- {89, kTimeCityAttnangPuchheim},
- {97, kTimeCityWels},
- {100, kTimeCityLinz},
- {104, kTimeCityAmstetten},
- {111, kTimeCityVienna},
- {120, kTimeCityPoszony},
- {124, kTimeCityGalanta},
- {132, kTimeCityBudapest},
- {148, kTimeCityBelgrade},
- /* Line 1 ends at 150 - line 2 begins at 0 */
- {157, kTimeCityNish},
- {165, kTimeCityTzaribrod},
- {174, kTimeCitySofia},
- {198, kTimeCityAdrianople},
- {210, kTimeCityConstantinople}};
-
static const struct {
TimeValue time;
uint index;
@@ -173,185 +140,6 @@ static const struct {
};
//////////////////////////////////////////////////////////////////////////
-// Clock
-//////////////////////////////////////////////////////////////////////////
-class Clock {
-public:
- explicit Clock(LastExpressEngine *engine);
- ~Clock();
-
- void draw(uint32 time);
- void clear();
-
-private:
- LastExpressEngine *_engine;
-
- // Frames
- SequenceFrame *_frameMinutes;
- SequenceFrame *_frameHour;
- SequenceFrame *_frameSun;
- SequenceFrame *_frameDate;
-};
-
-Clock::Clock(LastExpressEngine *engine) : _engine(engine), _frameMinutes(NULL), _frameHour(NULL), _frameSun(NULL), _frameDate(NULL) {
- _frameMinutes = new SequenceFrame(loadSequence("eggmin.seq"), 0, true);
- _frameHour = new SequenceFrame(loadSequence("egghour.seq"), 0, true);
- _frameSun = new SequenceFrame(loadSequence("sun.seq"), 0, true);
- _frameDate = new SequenceFrame(loadSequence("datenew.seq"), 0, true);
-}
-
-Clock::~Clock() {
- SAFE_DELETE(_frameMinutes);
- SAFE_DELETE(_frameHour);
- SAFE_DELETE(_frameSun);
- SAFE_DELETE(_frameDate);
-
- // Zero passed pointers
- _engine = NULL;
-}
-
-void Clock::clear() {
- getScenes()->removeFromQueue(_frameMinutes);
- getScenes()->removeFromQueue(_frameHour);
- getScenes()->removeFromQueue(_frameSun);
- getScenes()->removeFromQueue(_frameDate);
-}
-
-void Clock::draw(uint32 time) {
- assert(time >= kTimeCityParis && time <= kTimeCityConstantinople);
-
- // Check that sequences have been loaded
- if (!_frameMinutes || !_frameHour || !_frameSun || !_frameDate)
- error("Clock::process: clock sequences have not been loaded correctly!");
-
- // Clear existing frames
- clear();
-
- // Game starts at: 1037700 = 7:13 p.m. on July 24, 1914
- // Game ends at: 4941000 = 7:30 p.m. on July 26, 1914
- // Game lasts for: 3903300 = 2 days + 17 mins = 2897 mins
-
- // 15 = 1 second
- // 15 * 60 = 900 = 1 minute
- // 900 * 60 = 54000 = 1 hour
- // 54000 * 24 = 1296000 = 1 day
-
- // Calculate each sequence index from the current time
-
- uint8 hour = 0;
- uint8 minute = 0;
- State::getHourMinutes(time, &hour, &minute);
- uint32 index_date = 18 * time / 1296000;
- if (hour == 23)
- index_date += 18 * minute / 60;
-
- // Set sequences frames
- _frameMinutes->setFrame(minute);
- _frameHour->setFrame((5 * hour + minute / 12) % 60);
- _frameSun->setFrame((5 * hour + minute / 12) % 120);
- _frameDate->setFrame((uint16)index_date);
-
- // Adjust z-order and queue
- _frameMinutes->getInfo()->location = 1;
- _frameHour->getInfo()->location = 1;
- _frameSun->getInfo()->location = 1;
- _frameDate->getInfo()->location = 1;
-
- getScenes()->addToQueue(_frameMinutes);
- getScenes()->addToQueue(_frameHour);
- getScenes()->addToQueue(_frameSun);
- getScenes()->addToQueue(_frameDate);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// TrainLine
-//////////////////////////////////////////////////////////////////////////
-class TrainLine {
-public:
- explicit TrainLine(LastExpressEngine *engine);
- ~TrainLine();
-
- void draw(uint32 time);
- void clear();
-
-private:
- LastExpressEngine *_engine;
-
- // Frames
- SequenceFrame *_frameLine1;
- SequenceFrame *_frameLine2;
-};
-
-TrainLine::TrainLine(LastExpressEngine *engine) : _engine(engine), _frameLine1(NULL), _frameLine2(NULL) {
- _frameLine1 = new SequenceFrame(loadSequence("line1.seq"), 0, true);
- _frameLine2 = new SequenceFrame(loadSequence("line2.seq"), 0, true);
-}
-
-TrainLine::~TrainLine() {
- SAFE_DELETE(_frameLine1);
- SAFE_DELETE(_frameLine2);
-
- // Zero passed pointers
- _engine = NULL;
-}
-
-void TrainLine::clear() {
- getScenes()->removeFromQueue(_frameLine1);
- getScenes()->removeFromQueue(_frameLine2);
-}
-
-// Draw the train line at the time
-// line1: 150 frames (=> Belgrade)
-// line2: 61 frames (=> Constantinople)
-void TrainLine::draw(uint32 time) {
- assert(time >= kTimeCityParis && time <= kTimeCityConstantinople);
-
- // Check that sequences have been loaded
- if (!_frameLine1 || !_frameLine2)
- error("TrainLine::process: Line sequences have not been loaded correctly!");
-
- // Clear existing frames
- clear();
-
- // Get the index of the last city the train has visited
- uint index = 0;
- for (uint i = 0; i < ARRAYSIZE(_trainCities); i++)
- if ((uint32)_trainCities[i].time <= time)
- index = i;
-
- uint16 frame;
- if (time > (uint32)_trainCities[index].time) {
- // Interpolate linearly to use a frame between the cities
- uint8 diffFrames = _trainCities[index + 1].frame - _trainCities[index].frame;
- uint diffTimeCities = (uint)(_trainCities[index + 1].time - _trainCities[index].time);
- uint traveledTime = (time - (uint)_trainCities[index].time);
- frame = (uint16)(_trainCities[index].frame + (traveledTime * diffFrames) / diffTimeCities);
- } else {
- // Exactly on the city
- frame = _trainCities[index].frame;
- }
-
- // Set frame, z-order and queue
- if (frame < 150) {
- _frameLine1->setFrame(frame);
-
- _frameLine1->getInfo()->location = 1;
- getScenes()->addToQueue(_frameLine1);
- } else {
- // We passed Belgrade
- _frameLine1->setFrame(149);
- _frameLine2->setFrame(frame - 150);
-
- _frameLine1->getInfo()->location = 1;
- _frameLine2->getInfo()->location = 1;
-
- getScenes()->addToQueue(_frameLine1);
- getScenes()->addToQueue(_frameLine2);
- }
-}
-
-
-//////////////////////////////////////////////////////////////////////////
// Menu
//////////////////////////////////////////////////////////////////////////
Menu::Menu(LastExpressEngine *engine) : _engine(engine),
@@ -528,7 +316,7 @@ void Menu::show(bool doSavegame, SavegameType type, uint32 value) {
getFlags()->mouseRightClick = false;
// Play intro music
- getSound()->playSoundWithSubtitles("MUS001.SND", SoundManager::kFlagMusic, kEntityPlayer);
+ getSound()->playSoundWithSubtitles("MUS001.SND", kFlagMusic, kEntityPlayer);
// Show The Smoking Car logo
if (animation.load(getArchive("1931.nis")))
@@ -539,7 +327,7 @@ void Menu::show(bool doSavegame, SavegameType type, uint32 value) {
} else {
// Only show the quick intro
if (!_hasShownStartScreen) {
- getSound()->playSoundWithSubtitles("MUS018.SND", SoundManager::kFlagMusic, kEntityPlayer);
+ getSound()->playSoundWithSubtitles("MUS018.SND", kFlagMusic, kEntityPlayer);
getScenes()->loadScene(kSceneStartScreen);
// Original game waits 60 frames and loops Sound::unknownFunction1 unless the right button is pressed
@@ -550,7 +338,7 @@ void Menu::show(bool doSavegame, SavegameType type, uint32 value) {
if (getFlags()->mouseRightClick)
break;
- getSound()->updateQueue();
+ getSoundQueue()->updateQueue();
}
}
}
@@ -562,10 +350,10 @@ void Menu::show(bool doSavegame, SavegameType type, uint32 value) {
init(doSavegame, type, value);
// Setup sound
- getSound()->unknownFunction4();
- getSound()->resetQueue(SoundManager::kSoundType11, SoundManager::kSoundType13);
- if (getSound()->isBuffered("TIMER"))
- getSound()->removeFromQueue("TIMER");
+ getSoundQueue()->resetQueue();
+ getSoundQueue()->resetQueue(kSoundType11, kSoundType13);
+ if (getSoundQueue()->isBuffered("TIMER"))
+ getSoundQueue()->removeFromQueue("TIMER");
// Init flags & misc
_isShowingCredits = false;
@@ -625,13 +413,13 @@ bool Menu::handleEvent(StartMenuAction action, Common::EventType type) {
if (clicked) {
showFrame(kOverlayButtons, kButtonQuitPushed, true);
- getSound()->clearStatus();
- getSound()->updateQueue();
+ getSoundQueue()->clearStatus();
+ getSoundQueue()->updateQueue();
getSound()->playSound(kEntityPlayer, "LIB046");
// FIXME uncomment when sound queue is properly implemented
- /*while (getSound()->isBuffered("LIB046"))
- getSound()->updateQueue();*/
+ /*while (getSoundQueue()->isBuffered("LIB046"))
+ getSoundQueue()->updateQueue();*/
getFlags()->shouldRedraw = false;
@@ -698,7 +486,7 @@ bool Menu::handleEvent(StartMenuAction action, Common::EventType type) {
setLogicEventHandlers();
if (_index) {
- getSound()->processEntry(SoundManager::kSoundType11);
+ getSoundQueue()->processEntry(kSoundType11);
} else {
if (!getFlags()->mouseRightClick) {
getScenes()->loadScene((SceneIndex)(5 * _gameId + 3));
@@ -710,7 +498,7 @@ bool Menu::handleEvent(StartMenuAction action, Common::EventType type) {
getScenes()->loadScene((SceneIndex)(5 * _gameId + 5));
if (!getFlags()->mouseRightClick) {
- getSound()->processEntry(SoundManager::kSoundType11);
+ getSoundQueue()->processEntry(kSoundType11);
// Show intro
Animation animation;
@@ -726,7 +514,7 @@ bool Menu::handleEvent(StartMenuAction action, Common::EventType type) {
if (!getEvent(kEventIntro)) {
getEvent(kEventIntro) = 1;
- getSound()->processEntry(SoundManager::kSoundType11);
+ getSoundQueue()->processEntry(kSoundType11);
}
}
@@ -921,7 +709,7 @@ bool Menu::handleEvent(StartMenuAction action, Common::EventType type) {
while (nextFrameCount > getFrameCount()) {
_engine->pollEvents();
- getSound()->updateQueue();
+ getSoundQueue()->updateQueue();
}
} else {
showFrame(kOverlayButtons, kButtonVolumeDown, true);
@@ -956,7 +744,7 @@ bool Menu::handleEvent(StartMenuAction action, Common::EventType type) {
while (nextFrameCount > getFrameCount()) {
_engine->pollEvents();
- getSound()->updateQueue();
+ getSoundQueue()->updateQueue();
}
} else {
showFrame(kOverlayButtons, kButtonVolumeUp, true);
@@ -1072,7 +860,7 @@ void Menu::init(bool doSavegame, SavegameType type, uint32 value) {
useSameIndex = false;
// TODO remove existing savegame and reset index & savegame name
- warning("Menu::initGame: not implemented!");
+ warning("[Menu::initGame] Not implemented");
}
doSavegame = false;
@@ -1331,10 +1119,10 @@ void Menu::updateTime(uint32 time) {
_currentTime = time;
if (_time != time) {
- if (getSound()->isBuffered(kEntityChapters))
- getSound()->removeFromQueue(kEntityChapters);
+ if (getSoundQueue()->isBuffered(kEntityChapters))
+ getSoundQueue()->removeFromQueue(kEntityChapters);
- getSound()->playSoundWithSubtitles((_currentTime >= _time) ? "LIB042" : "LIB041", SoundManager::kFlagMenuClock, kEntityChapters);
+ getSound()->playSoundWithSubtitles((_currentTime >= _time) ? "LIB042" : "LIB041", kFlagMenuClock, kEntityChapters);
adjustIndex(_currentTime, _time, false);
}
}
@@ -1463,8 +1251,8 @@ void Menu::adjustTime() {
_time = _currentTime;
}
- if (_currentTime == _time && getSound()->isBuffered(kEntityChapters))
- getSound()->removeFromQueue(kEntityChapters);
+ if (_currentTime == _time && getSoundQueue()->isBuffered(kEntityChapters))
+ getSoundQueue()->removeFromQueue(kEntityChapters);
_clock->draw(_time);
_trainLine->draw(_time);
diff --git a/engines/lastexpress/game/menu.h b/engines/lastexpress/menu/menu.h
index 4b84c065cb..4b84c065cb 100644
--- a/engines/lastexpress/game/menu.h
+++ b/engines/lastexpress/menu/menu.h
diff --git a/engines/lastexpress/menu/trainline.cpp b/engines/lastexpress/menu/trainline.cpp
new file mode 100644
index 0000000000..f819776163
--- /dev/null
+++ b/engines/lastexpress/menu/trainline.cpp
@@ -0,0 +1,142 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/menu/trainline.h"
+
+#include "lastexpress/data/sequence.h"
+
+#include "lastexpress/game/scenes.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+// Information about the cities on the train line
+static const struct {
+ uint8 frame;
+ TimeValue time;
+} _trainCities[31] = {
+ {0, kTimeCityParis},
+ {9, kTimeCityEpernay},
+ {11, kTimeCityChalons},
+ {16, kTimeCityBarLeDuc},
+ {21, kTimeCityNancy},
+ {25, kTimeCityLuneville},
+ {35, kTimeCityAvricourt},
+ {37, kTimeCityDeutschAvricourt},
+ {40, kTimeCityStrasbourg},
+ {53, kTimeCityBadenOos},
+ {56, kTimeCityKarlsruhe},
+ {60, kTimeCityStuttgart},
+ {63, kTimeCityGeislingen},
+ {66, kTimeCityUlm},
+ {68, kTimeCityAugsburg},
+ {73, kTimeCityMunich},
+ {84, kTimeCitySalzbourg},
+ {89, kTimeCityAttnangPuchheim},
+ {97, kTimeCityWels},
+ {100, kTimeCityLinz},
+ {104, kTimeCityAmstetten},
+ {111, kTimeCityVienna},
+ {120, kTimeCityPoszony},
+ {124, kTimeCityGalanta},
+ {132, kTimeCityBudapest},
+ {148, kTimeCityBelgrade},
+ /* Line 1 ends at 150 - line 2 begins at 0 */
+ {157, kTimeCityNish},
+ {165, kTimeCityTzaribrod},
+ {174, kTimeCitySofia},
+ {198, kTimeCityAdrianople},
+ {210, kTimeCityConstantinople}
+};
+
+TrainLine::TrainLine(LastExpressEngine *engine) : _engine(engine), _frameLine1(NULL), _frameLine2(NULL) {
+ _frameLine1 = new SequenceFrame(loadSequence("line1.seq"), 0, true);
+ _frameLine2 = new SequenceFrame(loadSequence("line2.seq"), 0, true);
+}
+
+TrainLine::~TrainLine() {
+ SAFE_DELETE(_frameLine1);
+ SAFE_DELETE(_frameLine2);
+
+ // Zero passed pointers
+ _engine = NULL;
+}
+
+void TrainLine::clear() {
+ getScenes()->removeFromQueue(_frameLine1);
+ getScenes()->removeFromQueue(_frameLine2);
+}
+
+// Draw the train line at the time
+// line1: 150 frames (=> Belgrade)
+// line2: 61 frames (=> Constantinople)
+void TrainLine::draw(uint32 time) {
+ assert(time >= kTimeCityParis && time <= kTimeCityConstantinople);
+
+ // Check that sequences have been loaded
+ if (!_frameLine1 || !_frameLine2)
+ error("[TrainLine::draw] Line sequences have not been loaded correctly");
+
+ // Clear existing frames
+ clear();
+
+ // Get the index of the last city the train has visited
+ uint index = 0;
+ for (uint i = 0; i < ARRAYSIZE(_trainCities); i++)
+ if ((uint32)_trainCities[i].time <= time)
+ index = i;
+
+ uint16 frame;
+ if (time > (uint32)_trainCities[index].time) {
+ // Interpolate linearly to use a frame between the cities
+ uint8 diffFrames = _trainCities[index + 1].frame - _trainCities[index].frame;
+ uint diffTimeCities = (uint)(_trainCities[index + 1].time - _trainCities[index].time);
+ uint traveledTime = (time - (uint)_trainCities[index].time);
+ frame = (uint16)(_trainCities[index].frame + (traveledTime * diffFrames) / diffTimeCities);
+ } else {
+ // Exactly on the city
+ frame = _trainCities[index].frame;
+ }
+
+ // Set frame, z-order and queue
+ if (frame < 150) {
+ _frameLine1->setFrame(frame);
+
+ _frameLine1->getInfo()->location = 1;
+ getScenes()->addToQueue(_frameLine1);
+ } else {
+ // We passed Belgrade
+ _frameLine1->setFrame(149);
+ _frameLine2->setFrame(frame - 150);
+
+ _frameLine1->getInfo()->location = 1;
+ _frameLine2->getInfo()->location = 1;
+
+ getScenes()->addToQueue(_frameLine1);
+ getScenes()->addToQueue(_frameLine2);
+ }
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/menu/trainline.h b/engines/lastexpress/menu/trainline.h
new file mode 100644
index 0000000000..af6a121e9c
--- /dev/null
+++ b/engines/lastexpress/menu/trainline.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.
+ *
+ */
+
+#ifndef LASTEXPRESS_TRAINLINE_H
+#define LASTEXPRESS_TRAINLINE_H
+
+#include "common/scummsys.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+class SequenceFrame;
+
+class TrainLine {
+public:
+ explicit TrainLine(LastExpressEngine *engine);
+ ~TrainLine();
+
+ void draw(uint32 time);
+ void clear();
+
+private:
+ LastExpressEngine *_engine;
+
+ // Frames
+ SequenceFrame *_frameLine1;
+ SequenceFrame *_frameLine2;
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_TRAINLINE_H
diff --git a/engines/lastexpress/module.mk b/engines/lastexpress/module.mk
index 12fbb4f85b..8b3287d5d7 100644
--- a/engines/lastexpress/module.mk
+++ b/engines/lastexpress/module.mk
@@ -45,19 +45,29 @@ MODULE_OBJS := \
entities/verges.o \
entities/vesna.o \
entities/yasmin.o \
+ fight/fight.o \
+ fight/fighter.o \
+ fight/fighter_anna.o \
+ fight/fighter_ivo.o \
+ fight/fighter_milos.o \
+ fight/fighter_salko.o \
+ fight/fighter_vesna.o \
game/action.o \
game/beetle.o \
game/entities.o \
- game/fight.o \
game/inventory.o \
game/logic.o \
- game/menu.o \
game/object.o \
game/savegame.o \
game/savepoint.o \
game/scenes.o \
- game/sound.o \
game/state.o \
+ menu/clock.o \
+ menu/menu.o \
+ menu/trainline.o \
+ sound/entry.o \
+ sound/queue.o \
+ sound/sound.o \
debug.o \
detection.o \
graphics.o \
@@ -70,4 +80,4 @@ PLUGIN := 1
endif
# Include common rules
-include $(srcdir)/rules.mk \ No newline at end of file
+include $(srcdir)/rules.mk
diff --git a/engines/lastexpress/resource.cpp b/engines/lastexpress/resource.cpp
index f376a3a299..3910aaa010 100644
--- a/engines/lastexpress/resource.cpp
+++ b/engines/lastexpress/resource.cpp
@@ -52,7 +52,7 @@ bool ResourceManager::isArchivePresent(ArchiveIndex type) {
switch (type) {
default:
case kArchiveAll:
- error("ResourceManager::isArchivePresent: Only checks for single CDs are valid!");
+ error("[ResourceManager::isArchivePresent] Only checks for single CDs are valid");
case kArchiveCd1:
return Common::File::exists(archiveCD1Path);
@@ -134,7 +134,7 @@ Common::SeekableReadStream *ResourceManager::getFileStream(const Common::String
// Check if the file exits in the archive
if (!hasFile(name)) {
//#ifdef _DEBUG
-// error("ResourceManager::getFileStream: cannot open file: %s", name.c_str());
+// error("[ResourceManager::getFileStream] Cannot open file: %s", name.c_str());
//#endif
debugC(2, kLastExpressDebugResource, "Error opening file: %s", name.c_str());
return NULL;
diff --git a/engines/lastexpress/resource.h b/engines/lastexpress/resource.h
index 7dc909ab34..9e05a90399 100644
--- a/engines/lastexpress/resource.h
+++ b/engines/lastexpress/resource.h
@@ -26,6 +26,8 @@
#include "lastexpress/data/archive.h"
#include "lastexpress/shared.h"
+#include "common/array.h"
+
namespace LastExpress {
class Background;
diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h
index 8cebe16d87..d60a498447 100644
--- a/engines/lastexpress/shared.h
+++ b/engines/lastexpress/shared.h
@@ -28,6 +28,86 @@
namespace LastExpress {
//////////////////////////////////////////////////////////////////////////
+// Sound
+//////////////////////////////////////////////////////////////////////////
+
+enum SoundType {
+ kSoundTypeNone = 0,
+ kSoundType1,
+ kSoundType2,
+ kSoundType3,
+ kSoundType4,
+ kSoundType5,
+ kSoundType6,
+ kSoundType7,
+ kSoundType8,
+ kSoundType9,
+ kSoundType10,
+ kSoundType11,
+ kSoundType12,
+ kSoundType13,
+ kSoundType14,
+ kSoundType15,
+ kSoundType16
+};
+
+enum SoundFlag {
+ kFlagInvalid = -1,
+ kFlagNone = 0x0,
+ kFlag2 = 0x2,
+ kFlag3 = 0x3,
+ kFlag4 = 0x4,
+ kFlag5 = 0x5,
+ kFlag6 = 0x6,
+ kFlag7 = 0x7,
+ kFlag8 = 0x8,
+ kFlag9 = 0x9,
+ kFlag10 = 0xA,
+ kFlag11 = 0xB,
+ kFlag12 = 0xC,
+ kFlag13 = 0xD,
+ kFlag14 = 0xE,
+ kFlag15 = 0xF,
+ kFlagDefault = 0x10,
+
+ kFlagType1_2 = 0x1000000,
+ kFlagLoopedSound = 0x1001001,
+ kFlagSteam = 0x1001007,
+ kFlagType13 = 0x3000000,
+ kFlagMenuClock = 0x3080010,
+ kFlagType7 = 0x4000000,
+ kFlagType11 = 0x5000000,
+ kFlagMusic = 0x5000010,
+ kFlagType3 = 0x6000000,
+ kFlagLoop = 0x6001008,
+ kFlagType9 = 0x7000000
+};
+
+enum SoundState {
+ kSoundStateNone = 0,
+ kSoundState1 = 1,
+ kSoundState2 = 2
+};
+
+enum SoundStatus {
+ kSoundStatusClear0 = 0x10,
+ kSoundStatusFilter = 0x1F,
+ kSoundStatus_20 = 0x20,
+ kSoundStatus_40 = 0x40,
+ kSoundStatusCached = 0x80,
+ kSoundStatus_180 = 0x180,
+ kSoundStatusClosed = 0x200,
+ kSoundStatus_400 = 0x400,
+ kSoundStatusClear4 = 0x800,
+ kSoundStatus_8000 = 0x8000,
+ kSoundStatus_20000 = 0x20000,
+ kSoundStatus_100000 = 0x100000,
+ kSoundStatus_20000000 = 0x20000000,
+ kSoundStatus_40000000 = 0x40000000,
+ kSoundStatusClearAll = 0xFFFFFFE0
+};
+
+//////////////////////////////////////////////////////////////////////////
// Time values
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp
new file mode 100644
index 0000000000..44cc68a57b
--- /dev/null
+++ b/engines/lastexpress/sound/entry.cpp
@@ -0,0 +1,465 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/sound/entry.h"
+
+#include "lastexpress/game/logic.h"
+#include "lastexpress/game/savepoint.h"
+#include "lastexpress/game/state.h"
+
+#include "lastexpress/sound/queue.h"
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/graphics.h"
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+#include "common/stream.h"
+
+namespace LastExpress {
+
+#define SOUNDCACHE_ENTRY_SIZE 92160
+#define FILTER_BUFFER_SIZE 2940
+
+//////////////////////////////////////////////////////////////////////////
+// SoundEntry
+//////////////////////////////////////////////////////////////////////////
+SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) {
+ _type = kSoundTypeNone;
+
+ _blockCount = 0;
+ _time = 0;
+
+ _stream = NULL;
+
+ _field_34 = 0;
+ _field_38 = 0;
+ _field_3C = 0;
+ _variant = 0;
+ _entity = kEntityPlayer;
+ _field_48 = 0;
+ _priority = 0;
+
+ _subtitle = NULL;
+
+ _soundStream = NULL;
+
+ _queued = false;
+}
+
+SoundEntry::~SoundEntry() {
+ // Entries that have been queued will have their streamed disposed automatically
+ if (!_soundStream)
+ SAFE_DELETE(_stream);
+ delete _soundStream;
+
+ // Zero passed pointers
+ _engine = NULL;
+}
+
+void SoundEntry::open(Common::String name, SoundFlag flag, int priority) {
+ _priority = priority;
+ setType(flag);
+ setupStatus(flag);
+ loadStream(name);
+}
+
+void SoundEntry::close() {
+ _status.status |= kSoundStatusClosed;
+
+ // Loop until ready
+ //while (!(_status.status1 & 4) && !(getSoundQueue()->getFlag() & 8) && (getSoundQueue()->getFlag() & 1))
+ // ; // empty loop body
+
+ // The original game remove the entry from the cache here,
+ // but since we are called from within an iterator loop
+ // we will remove the entry there
+ // removeFromCache(entry);
+
+ if (_subtitle) {
+ _subtitle->draw();
+ SAFE_DELETE(_subtitle);
+ }
+
+ if (_entity) {
+ if (_entity == kEntitySteam)
+ getSound()->playLoopingSound(2);
+ else if (_entity != kEntityTrain)
+ getSavePoints()->push(kEntityPlayer, _entity, kActionEndSound);
+ }
+}
+
+void SoundEntry::play() {
+ if (!_stream) {
+ warning("[SoundEntry::play] stream has been disposed");
+ return;
+ }
+
+ // Prepare sound stream
+ if (!_soundStream)
+ _soundStream = new StreamedSound();
+
+ // Compute current filter id
+ int32 filterId = _status.status & kSoundStatusFilter;
+ // TODO adjust status (based on stepIndex)
+
+ if (_queued) {
+ _soundStream->setFilterId(filterId);
+ } else {
+ _stream->seek(0);
+
+ // Load the stream and start playing
+ _soundStream->load(_stream, filterId);
+
+ _queued = true;
+ }
+}
+
+bool SoundEntry::isFinished() {
+ if (!_stream)
+ return true;
+
+ if (!_soundStream || !_queued)
+ return false;
+
+ // TODO check that all data has been queued
+ return _soundStream->isFinished();
+}
+
+void SoundEntry::setType(SoundFlag flag) {
+ switch (flag & kFlagType9) {
+ default:
+ case kFlagNone:
+ _type = getSoundQueue()->getCurrentType();
+ getSoundQueue()->setCurrentType((SoundType)(_type + 1));
+ break;
+
+ case kFlagType1_2: {
+ SoundEntry *previous2 = getSoundQueue()->getEntry(kSoundType2);
+ if (previous2)
+ previous2->update(0);
+
+ SoundEntry *previous = getSoundQueue()->getEntry(kSoundType1);
+ if (previous) {
+ previous->setType(kSoundType2);
+ previous->update(0);
+ }
+
+ _type = kSoundType1;
+ }
+ break;
+
+ case kFlagType3: {
+ SoundEntry *previous = getSoundQueue()->getEntry(kSoundType3);
+ if (previous) {
+ previous->setType(kSoundType4);
+ previous->update(0);
+ }
+
+ _type = kSoundType11;
+ }
+ break;
+
+ case kFlagType7: {
+ SoundEntry *previous = getSoundQueue()->getEntry(kSoundType7);
+ if (previous)
+ previous->setType(kSoundType8);
+
+ _type = kSoundType7;
+ }
+ break;
+
+ case kFlagType9: {
+ SoundEntry *previous = getSoundQueue()->getEntry(kSoundType9);
+ if (previous)
+ previous->setType(kSoundType10);
+
+ _type = kSoundType9;
+ }
+ break;
+
+ case kFlagType11: {
+ SoundEntry *previous = getSoundQueue()->getEntry(kSoundType11);
+ if (previous)
+ previous->setType(kSoundType14);
+
+ _type = kSoundType11;
+ }
+ break;
+
+ case kFlagType13: {
+ SoundEntry *previous = getSoundQueue()->getEntry(kSoundType13);
+ if (previous)
+ previous->setType(kSoundType14);
+
+ _type = kSoundType13;
+ }
+ break;
+ }
+}
+
+void SoundEntry::setupStatus(SoundFlag flag) {
+ SoundStatus statusFlag = (SoundStatus)flag;
+ if (!((statusFlag & 0xFF) & kSoundStatusFilter))
+ statusFlag = (SoundStatus)(statusFlag | kSoundStatusCached);
+
+ if (((statusFlag & 0xFF00) >> 8) & kSoundStatusClear0)
+ _status.status = (uint32)statusFlag;
+ else
+ _status.status = (statusFlag | kSoundStatusClear4);
+}
+
+void SoundEntry::loadStream(Common::String name) {
+ _name2 = name;
+
+ // Load sound data
+ _stream = getArchive(name);
+
+ if (!_stream)
+ _stream = getArchive("DEFAULT.SND");
+
+ if (!_stream)
+ _status.status = kSoundStatusClosed;
+}
+
+void SoundEntry::update(uint val) {
+ if (!(_status.status3 & 64)) {
+ int value2 = val;
+
+ _status.status |= kSoundStatus_100000;
+
+ if (val) {
+ if (getSoundQueue()->getFlag() & 32) {
+ _variant = val;
+ value2 = val * 2 + 1;
+ }
+
+ _field_3C = value2;
+ } else {
+ _field_3C = 0;
+ _status.status |= kSoundStatus_40000000;
+ }
+ }
+}
+
+bool SoundEntry::updateSound() {
+ bool result;
+ char sub[16];
+
+ if (_status.status2 & 4) {
+ result = false;
+ } else {
+ if (_status.status2 & 0x80) {
+ if (_field_48 <= getSound()->getData2()) {
+ _status.status |= 0x20;
+ _status.status &= ~0x8000;
+ strcpy(sub, _name2.c_str());
+
+ int l = strlen(sub) + 1;
+ if (l - 1 > 4)
+ sub[l - 1 - 4] = 0;
+ showSubtitle(sub);
+ }
+ } else {
+ if (!(getSoundQueue()->getFlag() & 0x20)) {
+ if (!(_status.status3 & 8)) {
+ if (_entity) {
+ if (_entity < 0x80) {
+ updateEntryFlag(getSound()->getSoundFlag(_entity));
+ }
+ }
+ }
+ }
+ //if (status.status2 & 0x40 && !((uint32)_status.status & 0x180) && v1->soundBuffer)
+ // Sound_FillSoundBuffer(v1);
+ }
+ result = true;
+ }
+
+ return result;
+}
+
+void SoundEntry::updateEntryFlag(SoundFlag flag) {
+ if (flag) {
+ if (getSoundQueue()->getFlag() & 0x20 && _type != kSoundType9 && _type != kSoundType7)
+ update(flag);
+ else
+ _status.status = flag + (_status.status & ~0x1F);
+ } else {
+ _variant = 0;
+ _status.status |= 0x80u;
+ _status.status &= ~0x10001F;
+ }
+}
+
+void SoundEntry::updateState() {
+ if (getSoundQueue()->getFlag() & 32) {
+ if (_type != kSoundType9 && _type != kSoundType7 && _type != kSoundType5) {
+ uint32 variant = _status.status & kSoundStatusFilter;
+
+ _status.status &= kSoundStatusClearAll;
+
+ _variant = variant;
+ _status.status |= variant * 2 + 1;
+ }
+ }
+
+ _status.status |= kSoundStatus_20;
+}
+
+void SoundEntry::reset() {
+ _status.status |= kSoundStatusClosed;
+ _entity = kEntityPlayer;
+
+ if (_stream) {
+ if (!_soundStream) {
+ SAFE_DELETE(_stream);
+ } else {
+ // the original stream will be disposed
+ _soundStream->stop();
+ SAFE_DELETE(_soundStream);
+ }
+
+ _stream = NULL;
+ }
+}
+
+void SoundEntry::showSubtitle(Common::String filename) {
+ _subtitle = new SubtitleEntry(_engine);
+ _subtitle->load(filename, this);
+
+ if (_subtitle->getStatus().status2 & 4) {
+ _subtitle->draw();
+ SAFE_DELETE(_subtitle);
+ } else {
+ _status.status |= kSoundStatus_20000;
+ }
+}
+
+void SoundEntry::saveLoadWithSerializer(Common::Serializer &s) {
+ if (_name2.matchString("NISSND?") && (_status.status & kFlagType7) != kFlag3) {
+ s.syncAsUint32LE(_status.status);
+ s.syncAsUint32LE(_type);
+ s.syncAsUint32LE(_blockCount); // field_8;
+ s.syncAsUint32LE(_time);
+ s.syncAsUint32LE(_field_34); // field_10;
+ s.syncAsUint32LE(_field_38); // field_14;
+ s.syncAsUint32LE(_entity);
+
+ uint32 delta = (uint32)_field_48 - getSound()->getData2();
+ if (delta > kFlag8)
+ delta = 0;
+ s.syncAsUint32LE(delta);
+
+ s.syncAsUint32LE(_priority);
+
+ char name1[16];
+ strcpy((char *)&name1, _name1.c_str());
+ s.syncBytes((byte *)&name1, 16);
+
+ char name2[16];
+ strcpy((char *)&name2, _name2.c_str());
+ s.syncBytes((byte *)&name2, 16);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// SubtitleEntry
+//////////////////////////////////////////////////////////////////////////
+SubtitleEntry::SubtitleEntry(LastExpressEngine *engine) : _engine(engine) {
+ _sound = NULL;
+ _data = NULL;
+}
+
+SubtitleEntry::~SubtitleEntry() {
+ SAFE_DELETE(_data);
+}
+
+void SubtitleEntry::load(Common::String filename, SoundEntry *soundEntry) {
+ // Add ourselves to the list of active subtitles
+ getSoundQueue()->addSubtitle(this);
+
+ // Set sound entry and filename
+ _filename = filename + ".SBE";
+ _sound = soundEntry;
+
+ // Load subtitle data
+ if (_engine->getResourceManager()->hasFile(_filename)) {
+ if (getSoundQueue()->getSubtitleFlag() & 2)
+ return;
+
+ loadData();
+ } else {
+ _status.status = kSoundStatus_400;
+ }
+}
+
+void SubtitleEntry::loadData() {
+ _data = new SubtitleManager(_engine->getFont());
+ _data->load(getArchive(_filename));
+
+ getSoundQueue()->setSubtitleFlag(getSoundQueue()->getSubtitleFlag() | 2);
+ getSoundQueue()->setCurrentSubtitle(this);
+}
+
+void SubtitleEntry::setupAndDraw() {
+ if (!_data) {
+ _data = new SubtitleManager(_engine->getFont());
+ _data->load(getArchive(_filename));
+ }
+
+ if (_data->getMaxTime() > _sound->getTime()) {
+ _status.status = kSoundStatus_400;
+ } else {
+ _data->setTime((uint16)_sound->getTime());
+
+ if (getSoundQueue()->getSubtitleFlag() & 1)
+ drawOnScreen();
+ }
+
+ getSoundQueue()->setCurrentSubtitle(this);
+
+ // TODO Missing code
+}
+
+void SubtitleEntry::draw() {
+ // Remove ourselves from the queue
+ getSoundQueue()->removeSubtitle(this);
+
+ if (this == getSoundQueue()->getCurrentSubtitle()) {
+ drawOnScreen();
+
+ getSoundQueue()->setCurrentSubtitle(NULL);
+ getSoundQueue()->setSubtitleFlag(0);
+ }
+}
+
+void SubtitleEntry::drawOnScreen() {
+ if (_data == NULL)
+ return;
+
+ getSoundQueue()->setSubtitleFlag(getSoundQueue()->getSubtitleFlag() & -2);
+ _engine->getGraphicsManager()->draw(_data, GraphicsManager::kBackgroundOverlay);
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/sound/entry.h b/engines/lastexpress/sound/entry.h
new file mode 100644
index 0000000000..a88b0b7210
--- /dev/null
+++ b/engines/lastexpress/sound/entry.h
@@ -0,0 +1,196 @@
+/* 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 LASTEXPRESS_SOUND_ENTRY_H
+#define LASTEXPRESS_SOUND_ENTRY_H
+
+/*
+ Sound entry: 68 bytes (this is what appears in savegames)
+ uint32 {4} - status
+ uint32 {4} - type
+ uint32 {4} - blockCount
+ uint32 {4} - time
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - entity
+ uint32 {4} - ??
+ uint32 {4} - priority
+ char {16} - name 1
+ char {16} - name 2
+
+ Sound queue entry: 120 bytes
+ uint16 {2} - status
+ byte {1} - type
+ byte {1} - ??
+ uint32 {4} - ??
+ uint32 {4} - currentDataPtr
+ uint32 {4} - soundData
+ uint32 {4} - currentBufferPtr
+ uint32 {4} - blockCount
+ uint32 {4} - time
+ uint32 {4} - size
+ uint32 {4} - ??
+ uint32 {4} - archive structure pointer
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - ??
+ uint32 {4} - entity
+ uint32 {4} - ??
+ uint32 {4} - priority
+ char {16} - name 1
+ char {16} - name 2
+ uint32 {4} - pointer to next entry in the queue
+ uint32 {4} - subtitle data pointer
+*/
+
+#include "lastexpress/data/snd.h"
+#include "lastexpress/data/subtitle.h"
+
+#include "lastexpress/shared.h"
+
+#include "common/serializer.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+class SubtitleEntry;
+
+union SoundStatusUnion {
+ uint32 status;
+ byte status1;
+ byte status2;
+ byte status3;
+ byte status4;
+
+ SoundStatusUnion() {
+ status = 0;
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////
+// SoundEntry
+//////////////////////////////////////////////////////////////////////////
+class SoundEntry : Common::Serializable {
+public:
+ SoundEntry(LastExpressEngine *engine);
+ ~SoundEntry();
+
+ void open(Common::String name, SoundFlag flag, int priority);
+ void close();
+ void play();
+ void reset();
+ bool isFinished();
+ void update(uint val);
+ bool updateSound();
+ void updateState();
+ void updateEntryFlag(SoundFlag flag);
+
+ // Subtitles
+ void showSubtitle(Common::String filename);
+
+ // Serializable
+ void saveLoadWithSerializer(Common::Serializer &ser);
+
+ // Accessors
+ void setStatus(int status) { _status.status = status; }
+ void setType(SoundType type) { _type = type; }
+ void setEntity(EntityIndex entity) { _entity = entity; }
+ void setField48(int val) { _field_48 = val; }
+
+ SoundStatusUnion getStatus() { return _status; }
+ SoundType getType() { return _type; }
+ uint32 getTime() { return _time; }
+ EntityIndex getEntity() { return _entity; }
+ uint32 getPriority() { return _priority; }
+ Common::String getName2() { return _name2; }
+
+ // Streams
+ SimpleSound *getSoundStream() { return _soundStream; }
+
+private:
+ LastExpressEngine *_engine;
+
+ SoundStatusUnion _status;
+ SoundType _type; // int
+ //int _data;
+ //int _endOffset;
+ byte * _currentDataPtr;
+ //int _currentBufferPtr;
+ int _blockCount;
+ uint32 _time;
+ //int _size;
+ //int _field_28;
+ Common::SeekableReadStream *_stream; // The file stream
+ //int _archive;
+ int _field_34;
+ int _field_38;
+ int _field_3C;
+ int _variant;
+ EntityIndex _entity;
+ int _field_48;
+ uint32 _priority;
+ Common::String _name1; //char[16];
+ Common::String _name2; //char[16];
+ // original has pointer to the next structure in the list (not used)
+ SubtitleEntry *_subtitle;
+
+ // Sound buffer & stream
+ bool _queued;
+ StreamedSound *_soundStream; // the filtered sound stream
+
+ void setType(SoundFlag flag);
+ void setupStatus(SoundFlag flag);
+ void loadStream(Common::String name);
+};
+
+//////////////////////////////////////////////////////////////////////////
+// SubtitleEntry
+//////////////////////////////////////////////////////////////////////////
+class SubtitleEntry {
+public:
+ SubtitleEntry(LastExpressEngine *engine);
+ ~SubtitleEntry();
+
+ void load(Common::String filename, SoundEntry *soundEntry);
+ void loadData();
+ void draw();
+ void setupAndDraw();
+ void drawOnScreen();
+
+ // Accessors
+ SoundStatusUnion getStatus() { return _status; }
+ SoundEntry *getSoundEntry() { return _sound; }
+
+private:
+ LastExpressEngine *_engine;
+
+ Common::String _filename;
+ SoundStatusUnion _status;
+ SoundEntry *_sound;
+ SubtitleManager *_data;
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_SOUND_ENTRY_H
diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp
new file mode 100644
index 0000000000..33b4c06793
--- /dev/null
+++ b/engines/lastexpress/sound/queue.cpp
@@ -0,0 +1,400 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/sound/queue.h"
+
+#include "lastexpress/game/logic.h"
+#include "lastexpress/game/state.h"
+
+#include "lastexpress/sound/entry.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+SoundQueue::SoundQueue(LastExpressEngine *engine) : _engine(engine) {
+ _state = 0;
+ _currentType = kSoundType16;
+ _flag = 0;
+
+ _subtitlesFlag = 0;
+ _currentSubtitle = NULL;
+}
+
+SoundQueue::~SoundQueue() {
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
+ SAFE_DELETE(*i);
+ _soundList.clear();
+
+ for (Common::List<SubtitleEntry *>::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i)
+ SAFE_DELETE(*i);
+ _subtitles.clear();
+
+ _currentSubtitle = NULL;
+
+ // Zero passed pointers
+ _engine = NULL;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Timer
+//////////////////////////////////////////////////////////////////////////
+void SoundQueue::handleTimer() {
+ Common::StackLock locker(_mutex);
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ SoundEntry *entry = (*i);
+
+ // When the entry has stopped playing, we remove his buffer
+ if (entry->isFinished()) {
+ entry->close();
+ SAFE_DELETE(entry);
+ i = _soundList.reverse_erase(i);
+ continue;
+ }
+
+ // Queue the entry data, applying filtering
+ entry->play();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Sound queue management
+//////////////////////////////////////////////////////////////////////////
+void SoundQueue::addToQueue(SoundEntry *entry) {
+ _soundList.push_back(entry);
+}
+
+void SoundQueue::removeFromQueue(EntityIndex entity) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(entity);
+ if (entry)
+ entry->reset();
+}
+
+void SoundQueue::removeFromQueue(Common::String filename) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(filename);
+ if (entry)
+ entry->reset();
+}
+
+void SoundQueue::updateQueue() {
+ Common::StackLock locker(_mutex);
+
+ ++_flag;
+
+ if (getSoundState() & kSoundState1) {
+ SoundEntry *entry = getEntry(kSoundType1);
+ if (!entry || getFlags()->flag_3 || (entry && entry->getTime() > getSound()->getLoopingSoundDuration())) {
+ getSound()->playLoopingSound(0x45);
+ } else {
+ if (getSound()->getData1() && getSound()->getData2() >= getSound()->getData1()) {
+ entry->update(getSound()->getData0());
+ getSound()->setData1(0);
+ }
+ }
+ }
+
+ for (Common::List<SoundEntry *>::iterator it = _soundList.begin(); it != _soundList.end(); ++it) {
+ SoundEntry *entry = *it;
+
+ // Original removes the entry data from the cache and sets the archive as not loaded
+ // and if the sound data buffer is not full, loads a new entry to be played based on
+ // its priority and filter id
+
+ if (!entry->updateSound() && !(entry->getStatus().status3 & 0x8)) {
+ entry->close();
+ SAFE_DELETE(entry);
+ it = _soundList.reverse_erase(it);
+ }
+ }
+
+ // Original update the current entry, loading another set of samples to be decoded
+
+ getFlags()->flag_3 = 0;
+
+ --_flag;
+}
+
+void SoundQueue::resetQueue() {
+ Common::StackLock locker(_mutex);
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ if ((*i)->getType() == kSoundType1) {
+ (*i)->reset();
+ break;
+ }
+ }
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ if ((*i)->getType() == kSoundType2) {
+ (*i)->reset();
+ break;
+ }
+ }
+}
+
+void SoundQueue::resetQueue(SoundType type1, SoundType type2) {
+ if (!type2)
+ type2 = type1;
+
+ Common::StackLock locker(_mutex);
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ if ((*i)->getType() != type1 && (*i)->getType() != type2)
+ (*i)->reset();
+ }
+}
+
+void SoundQueue::clearQueue() {
+ Common::StackLock locker(_mutex);
+
+ _flag |= 8;
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ SoundEntry *entry = (*i);
+
+ // Delete entry
+ entry->close();
+ SAFE_DELETE(entry);
+
+ i = _soundList.reverse_erase(i);
+ }
+
+ updateSubtitles();
+}
+
+//////////////////////////////////////////////////////////////////////////
+// State
+//////////////////////////////////////////////////////////////////////////
+void SoundQueue::clearStatus() {
+ Common::StackLock locker(_mutex);
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
+ (*i)->setStatus((*i)->getStatus().status | kSoundStatusClosed);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Entry management
+//////////////////////////////////////////////////////////////////////////
+void SoundQueue::setupEntry(SoundType type, EntityIndex index) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(type);
+ if (entry)
+ entry->setEntity(index);
+}
+
+void SoundQueue::processEntry(EntityIndex entity) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(entity);
+ if (entry) {
+ entry->update(0);
+ entry->setEntity(kEntityPlayer);
+ }
+}
+
+void SoundQueue::processEntry(SoundType type) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(type);
+ if (entry)
+ entry->update(0);
+}
+
+void SoundQueue::processEntry(Common::String filename) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(filename);
+ if (entry) {
+ entry->update(0);
+ entry->setEntity(kEntityPlayer);
+ }
+}
+
+void SoundQueue::processEntries() {
+ _state = 0;
+
+ processEntry(kSoundType1);
+ processEntry(kSoundType2);
+}
+
+SoundEntry *SoundQueue::getEntry(EntityIndex index) {
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ if ((*i)->getEntity() == index)
+ return *i;
+ }
+
+ return NULL;
+}
+
+SoundEntry *SoundQueue::getEntry(Common::String name) {
+ if (!name.contains('.'))
+ name += ".SND";
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ if ((*i)->getName2() == name)
+ return *i;
+ }
+
+ return NULL;
+}
+
+SoundEntry *SoundQueue::getEntry(SoundType type) {
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ if ((*i)->getType() == type)
+ return *i;
+ }
+
+ return NULL;
+}
+
+uint32 SoundQueue::getEntryTime(EntityIndex index) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(index);
+ if (entry)
+ return entry->getTime();
+
+ return 0;
+}
+
+bool SoundQueue::isBuffered(EntityIndex entity) {
+ Common::StackLock locker(_mutex);
+
+ return (getEntry(entity) != NULL);
+}
+
+bool SoundQueue::isBuffered(Common::String filename, bool testForEntity) {
+ Common::StackLock locker(_mutex);
+
+ SoundEntry *entry = getEntry(filename);
+
+ if (testForEntity)
+ return entry != NULL && entry->getEntity() != kEntityPlayer;
+
+ return (entry != NULL);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Subtitles
+//////////////////////////////////////////////////////////////////////////
+void SoundQueue::updateSubtitles() {
+ Common::StackLock locker(_mutex);
+
+ uint32 index = 0;
+ SubtitleEntry *subtitle = NULL;
+
+ for (Common::List<SubtitleEntry *>::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
+ uint32 current_index = 0;
+ SoundEntry *soundEntry = (*i)->getSoundEntry();
+ SoundStatus status = (SoundStatus)soundEntry->getStatus().status;
+
+ if (!(status & kSoundStatus_40)
+ || status & kSoundStatus_180
+ || soundEntry->getTime() == 0
+ || (status & kSoundStatusFilter) < 6
+ || ((getFlags()->nis & 0x8000) && soundEntry->getPriority() < 90)) {
+ current_index = 0;
+ } else {
+ current_index = soundEntry->getPriority() + (status & kSoundStatusFilter);
+
+ if (_currentSubtitle == (*i))
+ current_index += 4;
+ }
+
+ if (index < current_index) {
+ index = current_index;
+ subtitle = (*i);
+ }
+ }
+
+ if (_currentSubtitle == subtitle) {
+ if (subtitle)
+ subtitle->setupAndDraw();
+
+ return;
+ }
+
+ if (_subtitlesFlag & 1)
+ subtitle->drawOnScreen();
+
+ if (subtitle) {
+ subtitle->loadData();
+ subtitle->setupAndDraw();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Savegame
+//////////////////////////////////////////////////////////////////////////
+void SoundQueue::saveLoadWithSerializer(Common::Serializer &s) {
+ Common::StackLock locker(_mutex);
+
+ s.syncAsUint32LE(_state);
+ s.syncAsUint32LE(_currentType);
+
+ // Compute the number of entries to save
+ uint32 numEntries = count();
+ s.syncAsUint32LE(numEntries);
+
+ // Save or load each entry data
+ if (s.isSaving()) {
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
+ (*i)->saveLoadWithSerializer(s);
+ } else {
+ warning("[Sound::saveLoadWithSerializer] Loading not implemented");
+ s.skip(numEntries * 64);
+ }
+}
+
+
+// FIXME: We probably need another mutex here to protect during the whole savegame process
+// as we could have removed an entry between the time we check the count and the time we
+// save the entries
+uint32 SoundQueue::count() {
+ Common::StackLock locker(_mutex);
+
+ uint32 numEntries = 0;
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
+ if ((*i)->getName2().matchString("NISSND?"))
+ ++numEntries;
+
+ return numEntries;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Debug
+//////////////////////////////////////////////////////////////////////////
+void SoundQueue::stopAllSound() {
+ Common::StackLock locker(_mutex);
+
+ for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
+ (*i)->getSoundStream()->stop();
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/sound/queue.h b/engines/lastexpress/sound/queue.h
new file mode 100644
index 0000000000..75fe06883a
--- /dev/null
+++ b/engines/lastexpress/sound/queue.h
@@ -0,0 +1,121 @@
+/* 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 LASTEXPRESS_SOUND_QUEUE_H
+#define LASTEXPRESS_SOUND_QUEUE_H
+
+#include "lastexpress/shared.h"
+
+#include "common/array.h"
+#include "common/mutex.h"
+#include "common/serializer.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+class SoundEntry;
+class SubtitleEntry;
+
+class SoundQueue : Common::Serializable {
+public:
+ SoundQueue(LastExpressEngine *engine);
+ ~SoundQueue();
+
+ // Timer
+ void handleTimer();
+
+ // Queue
+ void addToQueue(SoundEntry *entry);
+ void removeFromQueue(Common::String filename);
+ void removeFromQueue(EntityIndex entity);
+ void updateQueue();
+ void resetQueue();
+ void resetQueue(SoundType type1, SoundType type2 = kSoundTypeNone);
+ void clearQueue();
+
+ // State
+ void clearStatus();
+ int getSoundState() { return _state; }
+ void resetState() { resetState(kSoundState1); }
+ void resetState(SoundState state) { _state |= state; }
+
+ // Entries
+ void setupEntry(SoundType type, EntityIndex index);
+ void processEntry(EntityIndex entity);
+ void processEntry(SoundType type);
+ void processEntry(Common::String filename);
+ void processEntries();
+ SoundEntry *getEntry(SoundType type);
+ SoundEntry *getEntry(EntityIndex index);
+ SoundEntry *getEntry(Common::String name);
+ uint32 getEntryTime(EntityIndex index);
+ bool isBuffered(Common::String filename, bool testForEntity = false);
+ bool isBuffered(EntityIndex entity);
+
+ // Subtitles
+ void updateSubtitles();
+ void addSubtitle(SubtitleEntry *entry) { _subtitles.push_back(entry); }
+ void removeSubtitle(SubtitleEntry *entry) { _subtitles.remove(entry); }
+ void setCurrentSubtitle(SubtitleEntry *entry) { _currentSubtitle = entry; }
+ SubtitleEntry *getCurrentSubtitle() { return _currentSubtitle; }
+
+ // Serializable
+ void saveLoadWithSerializer(Common::Serializer &ser);
+ uint32 count();
+
+ // Accessors
+ uint32 getFlag() { return _flag; }
+ int getSubtitleFlag() { return _subtitlesFlag; }
+ void setSubtitleFlag(int flag) { _subtitlesFlag = flag; }
+ SoundType getCurrentType() { return _currentType; }
+ void setCurrentType(SoundType type) { _currentType = type; }
+
+protected:
+ // Debug
+ void stopAllSound();
+
+private:
+ LastExpressEngine *_engine;
+
+ Common::Mutex _mutex;
+
+ // State & shared data
+ int _state;
+ SoundType _currentType;
+ // TODO: this seems to be a synchronization flag for the sound timer
+ uint32 _flag;
+
+ // Entries
+ Common::List<SoundEntry *> _soundList; ///< List of all sound entries
+ void *_soundCacheData;
+
+ // Subtitles
+ int _subtitlesFlag;
+ Common::List<SubtitleEntry *> _subtitles;
+ SubtitleEntry *_currentSubtitle;
+
+ friend class Debugger;
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_SOUND_QUEUE_H
diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp
new file mode 100644
index 0000000000..2f7bb4a601
--- /dev/null
+++ b/engines/lastexpress/sound/sound.cpp
@@ -0,0 +1,1383 @@
+/* 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.
+ *
+ */
+
+#include "lastexpress/sound/sound.h"
+
+#include "lastexpress/game/action.h"
+#include "lastexpress/game/entities.h"
+#include "lastexpress/game/inventory.h"
+#include "lastexpress/game/logic.h"
+#include "lastexpress/game/object.h"
+#include "lastexpress/game/savepoint.h"
+#include "lastexpress/game/state.h"
+
+#include "lastexpress/sound/entry.h"
+#include "lastexpress/sound/queue.h"
+
+#include "lastexpress/helpers.h"
+#include "lastexpress/graphics.h"
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/resource.h"
+
+namespace LastExpress {
+
+// Letters & messages
+static const char *const messages[24] = {
+ "",
+ "TXT1001", // 1
+ "TXT1001A", // 2
+ "TXT1011", // 3
+ "TXT1012", // 4
+ "TXT1013", // 5
+ "TXT1014", // 6
+ "TXT1020", // 7
+ "TXT1030", // 8
+ "END1009B", // 50
+ "END1046", // 51
+ "END1047", // 52
+ "END1112", // 53
+ "END1112A", // 54
+ "END1503", // 55
+ "END1505A", // 56
+ "END1505B", // 57
+ "END1610", // 58
+ "END1612A", // 59
+ "END1612C", // 61
+ "END1612D", // 62
+ "ENDALRM1", // 63
+ "ENDALRM2", // 64
+ "ENDALRM3" // 65
+};
+
+static const char *const cities[17] = {
+ "EPERNAY",
+ "CHALONS",
+ "BARLEDUC",
+ "NANCY",
+ "LUNEVILL",
+ "AVRICOUR",
+ "DEUTSCHA",
+ "STRASBOU",
+ "BADENOOS",
+ "SALZBURG",
+ "ATTNANG",
+ "WELS",
+ "LINZ",
+ "VIENNA",
+ "POZSONY",
+ "GALANTA",
+ "POLICE"
+};
+
+static const char *const locomotiveSounds[5] = {
+ "ZFX1005",
+ "ZFX1006",
+ "ZFX1007",
+ "ZFX1007A",
+ "ZFX1007B"
+};
+
+static const SoundFlag soundFlags[32] = {
+ kFlagDefault,
+ kFlag15,
+ kFlag14,
+ kFlag13,
+ kFlag12,
+ kFlag11, kFlag11,
+ kFlag10, kFlag10,
+ kFlag9, kFlag9,
+ kFlag8, kFlag8,
+ kFlag7, kFlag7, kFlag7,
+ kFlag6, kFlag6, kFlag6,
+ kFlag5, kFlag5, kFlag5, kFlag5,
+ kFlag4, kFlag4, kFlag4, kFlag4,
+ kFlag3, kFlag3, kFlag3, kFlag3, kFlag3
+};
+
+SoundManager::SoundManager(LastExpressEngine *engine) : _engine(engine) {
+ _loopingSoundDuration = 0;
+
+ _queue = new SoundQueue(engine);
+
+ memset(&_lastWarning, 0, sizeof(_lastWarning));
+
+ // Initialize unknown data
+ _data0 = 0;
+ _data1 = 0;
+ _data2 = 0;
+}
+
+SoundManager::~SoundManager() {
+ SAFE_DELETE(_queue);
+
+ // Zero passed pointers
+ _engine = NULL;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Sound-related functions
+//////////////////////////////////////////////////////////////////////////
+void SoundManager::playSound(EntityIndex entity, Common::String filename, SoundFlag flag, byte a4) {
+ if (_queue->isBuffered(entity) && entity)
+ _queue->removeFromQueue(entity);
+
+ SoundFlag currentFlag = (flag == -1) ? getSoundFlag(entity) : (SoundFlag)(flag | 0x80000);
+
+ // Add .SND at the end of the filename if needed
+ if (!filename.contains('.'))
+ filename += ".SND";
+
+ if (!playSoundWithSubtitles(filename, currentFlag, entity, a4))
+ if (entity)
+ getSavePoints()->push(kEntityPlayer, entity, kActionEndSound);
+}
+
+bool SoundManager::playSoundWithSubtitles(Common::String filename, SoundFlag flag, EntityIndex entity, byte a4) {
+ SoundEntry *entry = new SoundEntry(_engine);
+
+ entry->open(filename, flag, 30);
+ entry->setEntity(entity);
+
+ if (a4) {
+ entry->setField48(_data2 + 2 * a4);
+ entry->setStatus(entry->getStatus().status | kSoundStatus_8000);
+ } else {
+ // Get subtitles name
+ uint32 size = filename.size();
+ while (filename.size() > size - 4)
+ filename.deleteLastChar();
+
+ entry->showSubtitle(filename);
+ entry->updateState();
+ }
+
+ // Add entry to sound list
+ _queue->addToQueue(entry);
+
+ return (entry->getType() != kSoundTypeNone);
+}
+
+void SoundManager::playSoundEvent(EntityIndex entity, byte action, byte a3) {
+ int values[5];
+
+ if (getEntityData(entity)->car != getEntityData(kEntityPlayer)->car)
+ return;
+
+ if (getEntities()->isInSalon(entity) != getEntities()->isInSalon(kEntityPlayer))
+ return;
+
+ int _action = (int)action;
+ SoundFlag flag = getSoundFlag(entity);
+
+ switch (action) {
+ case 36: {
+ int _param3 = (flag <= 9) ? flag + 7 : 16;
+
+ if (_param3 > 7) {
+ _data0 = (uint)_param3;
+ _data1 = _data2 + 2 * a3;
+ }
+ break;
+ }
+
+ case 37:
+ _data0 = 7;
+ _data1 = _data2 + 2 * a3;
+ break;
+
+ case 150:
+ case 156:
+ case 162:
+ case 168:
+ case 188:
+ case 198:
+ _action += 1 + (int)rnd(5);
+ break;
+
+ case 174:
+ case 184:
+ case 194:
+ _action += 1 + (int)rnd(3);
+ break;
+
+ case 180:
+ _action += 1 + (int)rnd(4);
+ break;
+
+ case 246:
+ values[0] = 0;
+ values[1] = 104;
+ values[2] = 105;
+ values[3] = 106;
+ values[4] = 116;
+ _action = values[rnd(5)];
+ break;
+
+ case 247:
+ values[0] = 11;
+ values[1] = 123;
+ values[2] = 124;
+ _action = values[rnd(3)];
+ break;
+
+ case 248:
+ values[0] = 0;
+ values[1] = 103;
+ values[2] = 108;
+ values[3] = 109;
+ _action = values[rnd(4)];
+ break;
+
+ case 249:
+ values[0] = 0;
+ values[1] = 56;
+ values[2] = 112;
+ values[3] = 113;
+ _action = values[rnd(4)];
+ break;
+
+ case 250:
+ values[0] = 0;
+ values[1] = 107;
+ values[2] = 115;
+ values[3] = 117;
+ _action = values[rnd(4)];
+ break;
+
+ case 251:
+ values[0] = 0;
+ values[1] = 11;
+ values[2] = 56;
+ values[3] = 113;
+ _action = values[rnd(4)];
+ break;
+
+ case 252:
+ values[0] = 0;
+ values[1] = 6;
+ values[2] = 109;
+ values[3] = 121;
+ _action = values[rnd(4)];
+ break;
+
+ case 254:
+ values[0] = 0;
+ values[1] = 104;
+ values[2] = 120;
+ values[3] = 121;
+ _action = values[rnd(4)];
+ break;
+
+ case 255:
+ values[0] = 0;
+ values[1] = 106;
+ values[2] = 115;
+ _action = values[rnd(3)];
+ break;
+
+ default:
+ break;
+ }
+
+ if (_action && flag)
+ playSoundWithSubtitles(Common::String::format("LIB%03d.SND", _action), flag, kEntityPlayer, a3);
+}
+
+void SoundManager::playSteam(CityIndex index) {
+ if (index >= ARRAYSIZE(cities))
+ error("[SoundManager::playSteam] Invalid city index (was %d, max %d)", index, ARRAYSIZE(cities));
+
+ _queue->resetState(kSoundState2);
+
+ if (!_queue->getEntry(kSoundType1))
+ playSoundWithSubtitles("STEAM.SND", kFlagSteam, kEntitySteam);
+
+ // Get the new sound entry and show subtitles
+ SoundEntry *entry = _queue->getEntry(kSoundType1);
+ if (entry)
+ entry->showSubtitle(cities[index]);
+}
+
+void SoundManager::playFightSound(byte action, byte a4) {
+ int _action = (int)action;
+ int values[5];
+
+ switch (action) {
+ default:
+ break;
+
+ case 174:
+ case 184:
+ case 194:
+ values[0] = action + 1;
+ values[1] = action + 2;
+ values[2] = action + 3;
+ _action = values[rnd(3)];
+ break;
+
+ case 180:
+ values[0] = action + 1;
+ values[1] = action + 2;
+ values[2] = action + 3;
+ values[3] = action + 4;
+ _action = values[rnd(4)];
+ break;
+
+ case 150:
+ case 156:
+ case 162:
+ case 168:
+ case 188:
+ case 198:
+ values[0] = action + 1;
+ values[1] = action + 2;
+ values[2] = action + 3;
+ values[3] = action + 4;
+ values[4] = action + 5;
+ _action = values[rnd(5)];
+ break;
+ }
+
+ if (_action)
+ playSound(kEntityTrain, Common::String::format("LIB%03d.SND", _action), kFlagDefault, a4);
+}
+
+void SoundManager::playDialog(EntityIndex entity, EntityIndex entityDialog, SoundFlag flag, byte a4) {
+ if (_queue->isBuffered(getDialogName(entityDialog)))
+ _queue->removeFromQueue(getDialogName(entityDialog));
+
+ playSound(entity, getDialogName(entityDialog), flag, a4);
+}
+
+void SoundManager::playLocomotiveSound() {
+ playSound(kEntityPlayer, locomotiveSounds[rnd(5)], (SoundFlag)(rnd(15) + 2));
+}
+
+const char *SoundManager::getDialogName(EntityIndex entity) const {
+ switch (entity) {
+ case kEntityAnna:
+ if (getEvent(kEventAnnaDialogGoToJerusalem))
+ return "XANN12";
+
+ if (getEvent(kEventLocomotiveRestartTrain))
+ return "XANN11";
+
+ if (getEvent(kEventAnnaBaggageTies) || getEvent(kEventAnnaBaggageTies2) || getEvent(kEventAnnaBaggageTies3) || getEvent(kEventAnnaBaggageTies4))
+ return "XANN10";
+
+ if (getEvent(kEventAnnaTired) || getEvent(kEventAnnaTiredKiss))
+ return "XANN9";
+
+ if (getEvent(kEventAnnaBaggageArgument))
+ return "XANN8";
+
+ if (getEvent(kEventKronosVisit))
+ return "XANN7";
+
+ if (getEvent(kEventAbbotIntroduction))
+ return "XANN6A";
+
+ if (getEvent(kEventVassiliSeizure))
+ return "XANN6";
+
+ if (getEvent(kEventAugustPresentAnna) || getEvent(kEventAugustPresentAnnaFirstIntroduction))
+ return "XANN5";
+
+ if (getProgress().field_60)
+ return "XANN4";
+
+ if (getEvent(kEventAnnaGiveScarf) || getEvent(kEventAnnaGiveScarfDiner) || getEvent(kEventAnnaGiveScarfSalon)
+ || getEvent(kEventAnnaGiveScarfMonogram) || getEvent(kEventAnnaGiveScarfDinerMonogram) || getEvent(kEventAnnaGiveScarfSalonMonogram))
+ return "XANN3";
+
+ if (getEvent(kEventDinerMindJoin))
+ return "XANN2";
+
+ if (getEvent(kEventGotALight) || getEvent(kEventGotALightD))
+ return "XANN1";
+
+ break;
+
+ case kEntityAugust:
+ if (getEvent(kEventAugustTalkCigar))
+ return "XAUG6";
+
+ if (getEvent(kEventAugustBringBriefcase))
+ return "XAUG5";
+
+ // Getting closer to Vienna...
+ if (getState()->time > kTime2200500 && !getEvent(kEventAugustMerchandise))
+ return "XAUG4A";
+
+ if (getEvent(kEventAugustMerchandise))
+ return "XAUG4";
+
+ if (getEvent(kEventDinerAugust) || getEvent(kEventDinerAugustAlexeiBackground) || getEvent(kEventMeetAugustTylerCompartment)
+ || getEvent(kEventMeetAugustTylerCompartmentBed) || getEvent(kEventMeetAugustHisCompartment) || getEvent(kEventMeetAugustHisCompartmentBed))
+ return "XAUG3";
+
+ if (getEvent(kEventAugustPresentAnnaFirstIntroduction))
+ return "XAUG2";
+
+ if (getProgress().eventMertensAugustWaiting)
+ return "XAUG1";
+
+ break;
+
+ case kEntityTatiana:
+ if (getEvent(kEventTatianaTylerCompartment))
+ return "XTAT6";
+
+ if (getEvent(kEventTatianaCompartmentStealEgg))
+ return "XTAT5";
+
+ if (getEvent(kEventTatianaGivePoem))
+ return "XTAT3";
+
+ if (getProgress().field_64)
+ return "XTAT1";
+
+ break;
+
+ case kEntityVassili:
+ if (getEvent(kEventCathFreePassengers))
+ return "XVAS4";
+
+ if (getEvent(kEventVassiliCompartmentStealEgg))
+ return "XVAS3";
+
+ if (getEvent(kEventAbbotIntroduction))
+ return "XVAS2";
+
+ if (getEvent(kEventVassiliSeizure))
+ return "XVAS1A";
+
+ if (getProgress().field_64)
+ return "XVAS1";
+
+ break;
+
+ case kEntityAlexei:
+ if (getProgress().field_88)
+ return "XALX6";
+
+ if (getProgress().field_8C)
+ return "XALX5";
+
+ if (getProgress().field_90)
+ return "XALX4A";
+
+ if (getProgress().field_68)
+ return "XALX4";
+
+ if (getEvent(kEventAlexeiSalonPoem))
+ return "XALX3";
+
+ if (getEvent(kEventAlexeiSalonVassili))
+ return "XALX2";
+
+ if (getEvent(kEventAlexeiDiner) || getEvent(kEventAlexeiDinerOriginalJacket))
+ return "XALX1";
+
+ break;
+
+ case kEntityAbbot:
+ if (getEvent(kEventAbbotDrinkDefuse))
+ return "XABB4";
+
+ if (getEvent(kEventAbbotInvitationDrink) || getEvent(kEventDefuseBomb))
+ return "XABB3";
+
+ if (getEvent(kEventAbbotWrongCompartment) || getEvent(kEventAbbotWrongCompartmentBed))
+ return "XABB2";
+
+ if (getEvent(kEventAbbotIntroduction))
+ return "XABB1";
+
+ break;
+
+ case kEntityMilos:
+ if (getEvent(kEventLocomotiveMilosDay) || getEvent(kEventLocomotiveMilosNight))
+ return "XMIL5";
+
+ if (getEvent(kEventMilosCompartmentVisitTyler) && (getProgress().chapter == kChapter3 || getProgress().chapter == kChapter4))
+ return "XMIL4";
+
+ if (getEvent(kEventMilosCorridorThanks) || getProgress().chapter == kChapter5)
+ return "XMIL3";
+
+ if (getEvent(kEventMilosCompartmentVisitAugust))
+ return "XMIL2";
+
+ if (getEvent(kEventMilosTylerCompartmentDefeat))
+ return "XMIL1";
+
+ break;
+
+ case kEntityVesna:
+ if (getProgress().field_94)
+ return "XVES2";
+
+ if (getProgress().field_98)
+ return "XVES1";
+
+ break;
+
+ case kEntityKronos:
+ if (getEvent(kEventKronosReturnBriefcase))
+ return "XKRO6";
+
+ if (getEvent(kEventKronosBringEggCeiling) || getEvent(kEventKronosBringEgg))
+ return "XKRO5";
+
+ if (getEvent(kEventKronosConversation) || getEvent(kEventKronosConversationFirebird)) {
+ ObjectLocation location = getInventory()->get(kItemFirebird)->location;
+ if (location != kObjectLocation6 && location != kObjectLocation5 && location != kObjectLocation2 && location != kObjectLocation1)
+ return "XKRO4A";
+ }
+
+ if (getEvent(kEventKronosConversationFirebird))
+ return "XKRO4";
+
+ if (getEvent(kEventKronosConversation)) {
+ if (!getEvent(kEventMilosCompartmentVisitAugust))
+ return "XKRO3";
+ else
+ return "XKRO2";
+ }
+
+ if (getProgress().eventMertensKronosInvitation)
+ return "XKRO1";
+
+ break;
+
+ case kEntityFrancois:
+ if (getProgress().field_9C)
+ return "XFRA3";
+
+ if (getProgress().field_A0
+ || getEvent(kEventFrancoisWhistle) || getEvent(kEventFrancoisWhistleD)
+ || getEvent(kEventFrancoisWhistleNight) || getEvent(kEventFrancoisWhistleNightD))
+ return "XFRA2";
+
+ if (getState()->time > kTimeParisEpernay) // Between Paris and Epernay
+ return "XFRA1";
+
+ break;
+
+ case kEntityMmeBoutarel:
+ if (getProgress().field_A4)
+ return "XMME4";
+
+ if (getProgress().field_A8)
+ return "XMME3";
+
+ if (getProgress().field_A0)
+ return "XMME2";
+
+ if (getProgress().field_AC)
+ return "XMME1";
+
+ break;
+
+ case kEntityBoutarel:
+ if (getProgress().eventMetBoutarel)
+ return "XMRB1";
+
+ break;
+
+ case kEntityRebecca:
+ if (getProgress().field_B4)
+ return "XREB1A";
+
+ if (getProgress().field_B8)
+ return "XREB1";
+
+ break;
+
+ case kEntitySophie:
+ if (getProgress().field_B0)
+ return "XSOP2";
+
+ if (getProgress().field_BC)
+ return "XSOP1B";
+
+ if (getProgress().field_B4)
+ return "XSOP1A";
+
+ if (getProgress().field_B8)
+ return "XSOP1";
+
+ break;
+
+ case kEntityMahmud:
+ if (getProgress().field_C4)
+ return "XMAH1";
+
+ break;
+
+ case kEntityYasmin:
+ if (getProgress().eventMetYasmin)
+ return "XHAR2";
+
+ break;
+
+ case kEntityHadija:
+ if (getProgress().eventMetHadija)
+ return "XHAR1";
+
+ break;
+
+ case kEntityAlouan:
+ if (getProgress().field_DC)
+ return "XHAR3";
+
+ break;
+
+ case kEntityGendarmes:
+ if (getProgress().field_E0)
+ return "XHAR4";
+
+ break;
+
+ case kEntityChapters:
+ if (getEvent(kEventCathDream) || getEvent(kEventCathWakingUp))
+ return "XTYL3";
+
+ return "XTYL1";
+
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Letters & Messages
+//////////////////////////////////////////////////////////////////////////
+void SoundManager::readText(int id){
+ if (!_queue->isBuffered(kEntityTables4))
+ return;
+
+ if (id < 0 || (id > 8 && id < 50) || id > 64)
+ error("[Sound::readText] Attempting to use invalid id. Valid values [1;8] - [50;64], was %d", id);
+
+ // Get proper message file (names are stored in sequence in the array but id is [1;8] - [50;64])
+ const char *text = messages[id <= 8 ? id : id - 41];
+
+ // Check if file is in cache for id [1;8]
+ if (id <= 8)
+ if (_queue->isBuffered(text))
+ _queue->removeFromQueue(text);
+
+ playSound(kEntityTables4, text, kFlagDefault);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Sound bites
+//////////////////////////////////////////////////////////////////////////
+void SoundManager::playWarningCompartment(EntityIndex entity, ObjectIndex compartment) {
+
+#define PLAY_WARNING(index, sound1, sound2, sound3, sound4, sound5, sound6) { \
+ if (_lastWarning[index] + 450 >= getState()->timeTicks) { \
+ if (rnd(2)) \
+ playSound(kEntityMertens, sound1, kFlagDefault); \
+ else \
+ playSound(kEntityMertens, rnd(2) ? sound2 : sound3, kFlagDefault); \
+ } else { \
+ if (rnd(2)) \
+ playSound(kEntityMertens, sound4, kFlagDefault); \
+ else \
+ playSound(kEntityMertens, rnd(2) ? sound5 : sound6, kFlagDefault); \
+ } \
+ _lastWarning[index] = getState()->timeTicks; \
+}
+
+ if (entity != kEntityMertens && entity != kEntityCoudert)
+ return;
+
+ //////////////////////////////////////////////////////////////////////////
+ // Mertens
+ if (entity == kEntityMertens) {
+
+ switch (compartment) {
+ default:
+ break;
+
+ case kObjectCompartment2:
+ PLAY_WARNING(0, "Con1502A", "Con1500B", "Con1500C", "Con1502", "Con1500", "Con1500A");
+ break;
+
+ case kObjectCompartment3:
+ PLAY_WARNING(1, "Con1501A", "Con1500B", "Con1500C", "Con1501", "Con1500", "Con1500A");
+ break;
+
+ case kObjectCompartment4:
+ PLAY_WARNING(2, "Con1503", "Con1500B", "Con1500C", "Con1503", "Con1500", "Con1500A");
+ break;
+
+ case kObjectCompartment5:
+ case kObjectCompartment6:
+ case kObjectCompartment7:
+ case kObjectCompartment8:
+ ++_lastWarning[3];
+
+ switch (_lastWarning[3]) {
+ default:
+ break;
+
+ case 1:
+ getSound()->playSound(kEntityMertens, "Con1503C", kFlagDefault);
+ break;
+
+ case 2:
+ getSound()->playSound(kEntityMertens, rnd(2) ? "Con1503E" : "Con1503A", kFlagDefault);
+ break;
+
+ case 3:
+ getSound()->playSound(kEntityMertens, rnd(2) ? "Con1503B" : "Con1503D", kFlagDefault);
+ _lastWarning[3] = 0;
+ break;
+ }
+ }
+
+ return;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Coudert
+ switch (compartment) {
+ default:
+ break;
+
+ case kObjectCompartmentA:
+ if (_lastWarning[4] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1508" : "Jac1508A", kFlagDefault);
+ break;
+
+ case kObjectCompartmentB:
+ if (_lastWarning[5] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ if (getProgress().field_40 || (getState()->time > kTimeCityLinz && getState()->time < kTime2133000))
+ getSound()->playSound(kEntityCoudert, "Jac1507A", kFlagDefault);
+ else
+ getSound()->playSound(kEntityCoudert, "Jac1507", kFlagDefault);
+ break;
+
+ case kObjectCompartmentC:
+ if (_lastWarning[6] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ if (getProgress().chapter < kChapter3)
+ getSound()->playSound(kEntityCoudert, "Jac1506", kFlagDefault);
+ else
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1506A" : "Jac1506B", kFlagDefault);
+ break;
+
+ case kObjectCompartmentD:
+ if (_lastWarning[7] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ getSound()->playSound(kEntityCoudert, "Jac1505", kFlagDefault);
+ break;
+
+ case kObjectCompartmentE:
+ if (_lastWarning[8] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ if (getProgress().field_40 || (getState()->time > kTime2115000 && getState()->time < kTime2133000)) {
+ getSound()->playSound(kEntityCoudert, "Jac1504B", kFlagDefault);
+ break;
+ }
+
+ if (getEntities()->isInsideCompartment(kEntityRebecca, kCarRedSleeping, kPosition_4840))
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ else
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1504" : "Jac1504A", kFlagDefault);
+ break;
+
+ case kObjectCompartmentF:
+ if (_lastWarning[9] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ if (getProgress().field_40 || (getState()->time > kTime2083500 && getState()->time < kTime2133000)) {
+ getSound()->playSound(kEntityCoudert, "Jac1503B", kFlagDefault);
+ break;
+ }
+
+ if (rnd(2) || getEntities()->isInsideCompartment(kEntityAnna, kCarRedSleeping, kPosition_4070))
+ getSound()->playSound(kEntityCoudert, "Jac1503", kFlagDefault);
+ else
+ getSound()->playSound(kEntityCoudert, "Jac1503A", kFlagDefault);
+ break;
+
+ case kObjectCompartmentG:
+ if (_lastWarning[10] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ if (rnd(2) || getEntities()->isInsideCompartment(kEntityMilos, kCarRedSleeping, kPosition_3050))
+ getSound()->playSound(kEntityCoudert, "Jac1502", kFlagDefault);
+ else
+ getSound()->playSound(kEntityCoudert, "Jac1502A", kFlagDefault);
+ break;
+
+ case kObjectCompartmentH:
+ if (_lastWarning[11] + 450 >= getState()->timeTicks) {
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ break;
+ }
+
+ if (getEntities()->isInsideCompartment(kEntityIvo, kCarRedSleeping, kPosition_2740))
+ getSound()->playSound(kEntityCoudert, rnd(2) ? "Jac1500" : "Jac1500A", kFlagDefault);
+ else
+ getSound()->playSound(kEntityCoudert, "Jac1501", kFlagDefault);
+ break;
+ }
+
+ // Update ticks (Compartments A - H are indexes 4 - 11)
+ _lastWarning[compartment - 28] = getState()->timeTicks;
+}
+
+void SoundManager::excuseMe(EntityIndex entity, EntityIndex entity2, SoundFlag flag) {
+ if (_queue->isBuffered(entity) && entity != kEntityPlayer && entity != kEntityChapters && entity != kEntityTrain)
+ return;
+
+ if (entity2 == kEntityFrancois || entity2 == kEntityMax)
+ return;
+
+ if (entity == kEntityFrancois && getEntityData(kEntityFrancois)->field_4A3 != 30)
+ return;
+
+ if (flag == kFlagNone)
+ flag = getSoundFlag(entity);
+
+ switch (entity) {
+ default:
+ break;
+
+ case kEntityAnna:
+ playSound(kEntityPlayer, "ANN1107A", flag);
+ break;
+
+ case kEntityAugust:
+ switch(rnd(4)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, "AUG1100A", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, "AUG1100B", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, "AUG1100C", flag);
+ break;
+
+ case 3:
+ playSound(kEntityPlayer, "AUG1100D", flag);
+ break;
+ }
+ break;
+
+ case kEntityMertens:
+ if (Entities::isFemale(entity2)) {
+ playSound(kEntityPlayer, (rnd(2) ? "CON1111" : "CON1111A"), flag);
+ } else {
+ if (entity2 || getProgress().jacket != kJacketGreen || !rnd(2)) {
+ switch(rnd(3)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, "CON1110A", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, "CON1110C", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, "CON1110", flag);
+ break;
+ }
+ } else {
+ if (isNight()) {
+ playSound(kEntityPlayer, (getProgress().field_18 == 2 ? "CON1110F" : "CON1110E"));
+ } else {
+ playSound(kEntityPlayer, "CON1110D");
+ }
+ }
+ }
+ break;
+
+ case kEntityCoudert:
+ if (Entities::isFemale(entity2)) {
+ playSound(kEntityPlayer, "JAC1111D", flag);
+ } else {
+ if (entity2 || getProgress().jacket != kJacketGreen || !rnd(2)) {
+ switch(rnd(4)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, "JAC1111", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, "JAC1111A", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, "JAC1111B", flag);
+ break;
+
+ case 3:
+ playSound(kEntityPlayer, "JAC1111C", flag);
+ break;
+ }
+ } else {
+ playSound(kEntityPlayer, "JAC1113B", flag);
+ }
+ }
+ break;
+
+ case kEntityPascale:
+ playSound(kEntityPlayer, (rnd(2) ? "HDE1002" : "HED1002A"), flag);
+ break;
+
+ case kEntityServers0:
+ case kEntityServers1:
+ switch(rnd(3)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, (entity == kEntityServers0) ? "WAT1002" : "WAT1003", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, (entity == kEntityServers0) ? "WAT1002A" : "WAT1003A", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, (entity == kEntityServers0) ? "WAT1002B" : "WAT1003B", flag);
+ break;
+ }
+ break;
+
+ case kEntityVerges:
+ if (Entities::isFemale(entity2)) {
+ playSound(kEntityPlayer, (rnd(2) ? "TRA1113A" : "TRA1113B"));
+ } else {
+ playSound(kEntityPlayer, "TRA1112", flag);
+ }
+ break;
+
+ case kEntityTatiana:
+ playSound(kEntityPlayer, (rnd(2) ? "TAT1102A" : "TAT1102B"), flag);
+ break;
+
+ case kEntityAlexei:
+ playSound(kEntityPlayer, (rnd(2) ? "ALX1099C" : "ALX1099D"), flag);
+ break;
+
+ case kEntityAbbot:
+ if (Entities::isFemale(entity2)) {
+ playSound(kEntityPlayer, "ABB3002C", flag);
+ } else {
+ switch(rnd(3)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, "ABB3002", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, "ABB3002A", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, "ABB3002B", flag);
+ break;
+ }
+ }
+ break;
+
+ case kEntityVesna:
+ switch(rnd(3)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, "VES1109A", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, "VES1109B", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, "VES1109C", flag);
+ break;
+ }
+ break;
+
+ case kEntityKahina:
+ playSound(kEntityPlayer, (rnd(2) ? "KAH1001" : "KAH1001A"), flag);
+ break;
+
+ case kEntityFrancois:
+ case kEntityMmeBoutarel:
+ switch(rnd(4)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001" : "MME1103A", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001A" : "MME1103B", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001B" : "MME1103C", flag);
+ break;
+
+ case 3:
+ playSound(kEntityPlayer, (entity == kEntityFrancois) ? "FRA1001C" : "MME1103D", flag);
+ break;
+ }
+ break;
+
+ case kEntityBoutarel:
+ playSound(kEntityPlayer, "MRB1104", flag);
+ if (flag > 2)
+ getProgress().eventMetBoutarel = true;
+ break;
+
+ case kEntityRebecca:
+ playSound(kEntityPlayer, (rnd(2) ? "REB1106" : "REB110A"), flag);
+ break;
+
+ case kEntitySophie: {
+ switch(rnd(3)) {
+ default:
+ break;
+
+ case 0:
+ playSound(kEntityPlayer, "SOP1105", flag);
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, Entities::isFemale(entity2) ? "SOP1105C" : "SOP1105A", flag);
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, Entities::isFemale(entity2) ? "SOP1105D" : "SOP1105B", flag);
+ break;
+ }
+ break;
+ }
+
+ case kEntityMahmud:
+ playSound(kEntityPlayer, "MAH1101", flag);
+ break;
+
+ case kEntityYasmin:
+ playSound(kEntityPlayer, "HAR1002", flag);
+ if (flag > 2)
+ getProgress().eventMetYasmin = true;
+ break;
+
+ case kEntityHadija:
+ playSound(kEntityPlayer, (rnd(2) ? "HAR1001" : "HAR1001A"), flag);
+ if (flag > 2)
+ getProgress().eventMetHadija = true;
+ break;
+
+ case kEntityAlouan:
+ playSound(kEntityPlayer, "HAR1004", flag);
+ break;
+ }
+}
+
+void SoundManager::excuseMeCath() {
+ switch(rnd(3)) {
+ default:
+ playSound(kEntityPlayer, "CAT1126B");
+ break;
+
+ case 1:
+ playSound(kEntityPlayer, "CAT1126C");
+ break;
+
+ case 2:
+ playSound(kEntityPlayer, "CAT1126D");
+ break;
+ }
+}
+
+const char *SoundManager::justCheckingCath() const {
+ switch(rnd(4)) {
+ default:
+ break;
+
+ case 0:
+ return "CAT5001";
+
+ case 1:
+ return "CAT5001A";
+
+ case 2:
+ return "CAT5001B";
+
+ case 3:
+ return "CAT5001C";
+ }
+
+ return "CAT5001";
+}
+
+const char *SoundManager::wrongDoorCath() const {
+ switch(rnd(5)) {
+ default:
+ break;
+
+ case 0:
+ return "CAT1125";
+
+ case 1:
+ return "CAT1125A";
+
+ case 2:
+ return "CAT1125B";
+
+ case 3:
+ return "CAT1125C";
+
+ case 4:
+ return "CAT1125D";
+ }
+
+ return "CAT1125";
+}
+
+const char *SoundManager::justAMinuteCath() const {
+ switch(rnd(3)) {
+ default:
+ break;
+
+ case 0:
+ return "CAT1520";
+
+ case 1:
+ return "CAT1521";
+
+ case 2:
+ return "CAT1125"; // ?? is this a bug in the original?
+ }
+
+ return "CAT1520";
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Sound flags
+//////////////////////////////////////////////////////////////////////////
+SoundFlag SoundManager::getSoundFlag(EntityIndex entity) const {
+ if (entity == kEntityPlayer)
+ return kFlagDefault;
+
+ if (getEntityData(entity)->car != getEntityData(kEntityPlayer)->car)
+ return kFlagNone;
+
+ // Compute sound value
+ SoundFlag ret = kFlag2;
+
+ // Get default value if valid
+ int index = ABS(getEntityData(entity)->entityPosition - getEntityData(kEntityPlayer)->entityPosition) / 230;
+ if (index < 32)
+ ret = soundFlags[index];
+
+ if (getEntityData(entity)->location == kLocationOutsideTrain) {
+ if (getEntityData(entity)->car != kCarKronos
+ && !getEntities()->isOutsideAlexeiWindow()
+ && !getEntities()->isOutsideAnnaWindow())
+ return kFlagNone;
+
+ return (SoundFlag)(ret / 6);
+ }
+
+ switch (getEntityData(entity)->car) {
+ default:
+ break;
+
+ case kCarKronos:
+ if (getEntities()->isInKronosSalon(entity) != getEntities()->isInKronosSalon(kEntityPlayer))
+ ret = (SoundFlag)(ret * 2);
+ break;
+
+ case kCarGreenSleeping:
+ case kCarRedSleeping:
+ if (getEntities()->isInGreenCarEntrance(kEntityPlayer) && !getEntities()->isInKronosSalon(entity))
+ ret = (SoundFlag)(ret * 2);
+
+ if (getEntityData(kEntityPlayer)->location
+ && (getEntityData(entity)->entityPosition != kPosition_1 || !getEntities()->isDistanceBetweenEntities(kEntityPlayer, entity, 400)))
+ ret = (SoundFlag)(ret * 2);
+ break;
+
+ case kCarRestaurant:
+ if (getEntities()->isInSalon(entity) == getEntities()->isInSalon(kEntityPlayer)
+ && (getEntities()->isInRestaurant(entity) != getEntities()->isInRestaurant(kEntityPlayer)))
+ ret = (SoundFlag)(ret * 2);
+ else
+ ret = (SoundFlag)(ret * 4);
+ break;
+ }
+
+ return ret;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Misc
+//////////////////////////////////////////////////////////////////////////
+void SoundManager::playLoopingSound(int param) {
+ SoundEntry *entry = _queue->getEntry(kSoundType1);
+
+ static const EntityPosition positions[8] = { kPosition_8200, kPosition_7500,
+ kPosition_6470, kPosition_5790,
+ kPosition_4840, kPosition_4070,
+ kPosition_3050, kPosition_2740 };
+
+ byte numLoops[8];
+ numLoops[1] = 4;
+ numLoops[2] = 2;
+ numLoops[3] = 2;
+ numLoops[4] = 2;
+ numLoops[5] = 2;
+ numLoops[6] = 2;
+
+ char tmp[80];
+ tmp[0] = 0;
+
+ int partNumber = 1;
+ int fnameLen = 6;
+
+ if (_queue->getSoundState() & kSoundState1 && param >= 0x45 && param <= 0x46) {
+ if (_queue->getSoundState() & kSoundState2) {
+ strcpy(tmp, "STEAM.SND");
+
+ _loopingSoundDuration = 32767;
+ } else {
+ if (getEntityData(kEntityPlayer)->location == kLocationOutsideTrain) {
+ partNumber = 6;
+ } else {
+ if (getEntities()->isInsideCompartments(kEntityPlayer)) {
+ int objNum = (getEntityData(kEntityPlayer)->car - 3) < 1 ? 9 : 40; // Weird numbers
+
+ numLoops[0] = 0;
+
+ for (int pos = 0; pos < 8; pos++) {
+ if (numLoops[0])
+ break;
+ if (getEntities()->isInsideCompartment(kEntityPlayer, getEntityData(kEntityPlayer)->car, positions[pos])) {
+ numLoops[0] = 1;
+ partNumber = (getObjects()->get((ObjectIndex)objNum).location - 2) < 1 ? 6 : 1;
+ }
+ objNum++;
+ }
+ } else {
+ switch (getEntityData(kEntityPlayer)->car) {
+ case 1:
+ case 6:
+ partNumber = 4;
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ partNumber = 1;
+ break;
+ case 7:
+ partNumber = 5;
+ break;
+ case 8:
+ partNumber = 99;
+ break;
+ case 9:
+ partNumber = 3;
+ break;
+ default:
+ partNumber = 6;
+ break;
+ }
+ }
+ }
+
+ if (partNumber != 99)
+ sprintf(tmp, "LOOP%d%c.SND", partNumber, _engine->getRandom().getRandomNumber(numLoops[partNumber] - 1) + 'A');
+ }
+
+ if (getFlags()->flag_3)
+ fnameLen = 5;
+
+ if (!entry || scumm_strnicmp(entry->getName2().c_str(), tmp, fnameLen)) {
+ _loopingSoundDuration = _engine->getRandom().getRandomNumber(319) + 260;
+
+ if (partNumber != 99) {
+ playSoundWithSubtitles(tmp, kFlagLoopedSound, kEntitySteam);
+
+ if (entry)
+ entry->update(0);
+
+ SoundEntry *entry1 = _queue->getEntry(kSoundType1);
+ if (entry1)
+ entry1->update(7);
+ }
+ }
+ }
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/sound/sound.h b/engines/lastexpress/sound/sound.h
new file mode 100644
index 0000000000..517543f470
--- /dev/null
+++ b/engines/lastexpress/sound/sound.h
@@ -0,0 +1,93 @@
+/* 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 LASTEXPRESS_SOUND_H
+#define LASTEXPRESS_SOUND_H
+
+#include "lastexpress/shared.h"
+
+#include "common/str.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+class SoundQueue;
+
+class SoundManager {
+public:
+ SoundManager(LastExpressEngine *engine);
+ ~SoundManager();
+
+ // Sound playing
+ void playSound(EntityIndex entity, Common::String filename, SoundFlag flag = kFlagInvalid, byte a4 = 0);
+ bool playSoundWithSubtitles(Common::String filename, SoundFlag flag, EntityIndex entity, byte a4 = 0);
+ void playSoundEvent(EntityIndex entity, byte action, byte a3 = 0);
+ void playDialog(EntityIndex entity, EntityIndex entityDialog, SoundFlag flag, byte a4);
+ void playSteam(CityIndex index);
+ void playFightSound(byte action, byte a4);
+ void playLocomotiveSound();
+ void playWarningCompartment(EntityIndex entity, ObjectIndex compartment);
+ void playLoopingSound(int param);
+
+ // Dialog & Letters
+ void readText(int id);
+ const char *getDialogName(EntityIndex entity) const;
+
+ // Sound bites
+ void excuseMe(EntityIndex entity, EntityIndex entity2 = kEntityPlayer, SoundFlag flag = kFlagNone);
+ void excuseMeCath();
+ const char *justCheckingCath() const;
+ const char *wrongDoorCath() const;
+ const char *justAMinuteCath() const;
+
+ // Flags
+ SoundFlag getSoundFlag(EntityIndex index) const;
+
+ // Accessors
+ SoundQueue *getQueue() { return _queue; }
+ uint32 getData0() { return _data0; }
+ int32 getData1() { return _data1; }
+ int32 getData2() { return _data2; }
+ uint32 getLoopingSoundDuration() { return _loopingSoundDuration; }
+
+ // Setters
+ void setData1(int32 data) { _data1 = data; }
+
+private:
+ LastExpressEngine *_engine;
+ SoundQueue *_queue;
+
+ // Compartment warnings by Mertens or Coudert
+ uint32 _lastWarning[12];
+
+ // Looping sound
+ int _loopingSoundDuration;
+
+ // Unknown data
+ uint32 _data0;
+ int32 _data1;
+ int32 _data2;
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_SOUND_H
diff --git a/engines/lure/debugger.cpp b/engines/lure/debugger.cpp
index 68410875f7..ef4a22f73a 100644
--- a/engines/lure/debugger.cpp
+++ b/engines/lure/debugger.cpp
@@ -549,14 +549,19 @@ bool Debugger::cmd_showAnim(int argc, const char **argv) {
}
bool Debugger::cmd_saveStrings(int argc, const char **argv) {
- StringData &strings = StringData::getReference();
- char buffer[32768];
-
if (argc != 2) {
DebugPrintf("strings <stringId>\n");
return true;
}
+ StringData &strings = StringData::getReference();
+
+ char *buffer = (char *)malloc(32768);
+ if (!buffer) {
+ DebugPrintf("Cannot allocate strings buffer\n");
+ return true;
+ }
+
uint16 id = strToInt(argv[1]);
strings.getString(id, buffer, NULL, NULL);
DebugPrintf("%s\n", buffer);
@@ -577,6 +582,9 @@ bool Debugger::cmd_saveStrings(int argc, const char **argv) {
DebugPrintf("Done\n");
*/
+
+ free(buffer);
+
return true;
}
diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp
index 081625863d..276b2d77af 100644
--- a/engines/lure/detection.cpp
+++ b/engines/lure/detection.cpp
@@ -63,8 +63,6 @@ static const PlainGameDescriptor lureGames[] = {
namespace Lure {
-using Common::GUIO_NONE;
-
static const LureGameDescription gameDescriptions[] = {
{
{
@@ -74,7 +72,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY,
},
@@ -87,7 +85,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY | GF_EGA,
},
@@ -100,7 +98,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY,
},
@@ -113,7 +111,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY | GF_EGA,
},
@@ -126,7 +124,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY,
},
@@ -139,7 +137,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY,
},
@@ -152,7 +150,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY,
},
@@ -165,7 +163,7 @@ static const LureGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GF_FLOPPY,
},
@@ -184,7 +182,7 @@ public:
// Use kADFlagUseExtraAsHint to distinguish between EGA and VGA versions
// of italian Lure when their datafiles sit in the same directory.
_flags = kADFlagUseExtraAsHint;
- _guioptions = Common::GUIO_NOSPEECH;
+ _guioptions = GUIO1(GUIO_NOSPEECH);
}
virtual const char *getName() const {
diff --git a/engines/lure/disk.cpp b/engines/lure/disk.cpp
index 9212508be0..552da73f18 100644
--- a/engines/lure/disk.cpp
+++ b/engines/lure/disk.cpp
@@ -98,7 +98,6 @@ void Disk::openFile(uint8 fileNum) {
error("Could not open %s", sFilename);
char buffer[7];
- uint32 bytesRead;
// If it's the support file, then move to the correct language area
@@ -130,7 +129,7 @@ void Disk::openFile(uint8 fileNum) {
// Validate the header
- bytesRead = _fileHandle->read(buffer, 6);
+ _fileHandle->read(buffer, 6);
buffer[6] = '\0';
if (strcmp(buffer, HEADER_IDENT_STRING) != 0)
error("The file %s was not a valid VGA file", sFilename);
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp
index 97fbaa72ae..96e5e088ab 100644
--- a/engines/lure/hotspots.cpp
+++ b/engines/lure/hotspots.cpp
@@ -763,7 +763,7 @@ void Hotspot::showMessage(uint16 messageId, uint16 destCharacterId) {
MemoryBlock *data = res.messagesData();
Hotspot *hotspot;
uint8 *msgData = (uint8 *) data->data();
- uint16 v2, idVal;
+ uint16 idVal;
messageId &= 0x7fff;
// Skip through header to find table for given character
@@ -781,7 +781,6 @@ void Hotspot::showMessage(uint16 messageId, uint16 destCharacterId) {
// Scan through secondary list
uint16 *v = (uint16 *) (msgData + READ_LE_UINT16(msgData + idx + sizeof(uint16)));
- v2 = 0;
while ((idVal = READ_LE_UINT16(v)) != 0xffff) {
++v;
if (READ_LE_UINT16(v) == messageId) break;
@@ -1674,6 +1673,12 @@ void Hotspot::doTalkTo(HotspotData *hotspot) {
faceHotspot(hotspot);
endAction();
+ // WORKAROUND: Fix crash when talking when an ask conversation is active
+ if (_data->talkDestCharacterId != 0) {
+ // Don't allow the talk to start
+ return;
+ }
+
uint16 sequenceOffset = res.getHotspotAction(hotspot->actionsOffset, TALK_TO);
if (sequenceOffset >= 0x8000) {
showMessage(sequenceOffset);
diff --git a/engines/lure/memory.cpp b/engines/lure/memory.cpp
index c5c28fa8bc..137a8f6bee 100644
--- a/engines/lure/memory.cpp
+++ b/engines/lure/memory.cpp
@@ -93,8 +93,12 @@ void MemoryBlock::copyFrom(const byte *src, uint32 srcPos, uint32 destPos, uint3
void MemoryBlock::reallocate(uint32 size1) {
_size = size1;
- _data = (byte *) realloc(_data, size1);
- if (!_data) error ("Failed reallocating memory block");
+
+ byte *tmp = (byte *) realloc(_data, size1);
+ if (!tmp)
+ error ("[MemoryBlock::reallocate] Failed reallocating memory block");
+
+ _data = tmp;
}
} // End of namespace Lure
diff --git a/engines/lure/module.mk b/engines/lure/module.mk
index ba158756b4..57126a6491 100644
--- a/engines/lure/module.mk
+++ b/engines/lure/module.mk
@@ -31,4 +31,3 @@ endif
# Include common rules
include $(srcdir)/rules.mk
-
diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp
index cf28e0bb74..85b86a8400 100644
--- a/engines/lure/sound.cpp
+++ b/engines/lure/sound.cpp
@@ -31,7 +31,9 @@
#include "common/endian.h"
#include "audio/midiparser.h"
+namespace Common {
DECLARE_SINGLETON(Lure::SoundManager);
+}
namespace Lure {
diff --git a/engines/lure/sound.h b/engines/lure/sound.h
index 9fa9a91260..365a7ccdb6 100644
--- a/engines/lure/sound.h
+++ b/engines/lure/sound.h
@@ -30,10 +30,11 @@
#include "common/mutex.h"
#include "common/singleton.h"
#include "common/ptr.h"
+
#include "audio/mididrv.h"
-#include "audio/mixer.h"
class MidiParser;
+class MidiChannel;
namespace Lure {
diff --git a/engines/m4/converse.cpp b/engines/m4/converse.cpp
index 4630d2e2d6..bdce7928ac 100644
--- a/engines/m4/converse.cpp
+++ b/engines/m4/converse.cpp
@@ -609,7 +609,7 @@ void Converse::loadConversation(const char *convName) {
// ----------------------------------------------------------------------------
// Entry action chunks
case CHUNK_CASN: // Conditional assign
- case CHUNK_ASGN: // Assign
+ case CHUNK_ASGN: { // Assign
curAction = new EntryAction();
if (debugFlag) debugCN(kDebugConversations, "ASGN chunk\n");
curAction->actionType = kAssignValue;
@@ -625,9 +625,11 @@ void Converse::loadConversation(const char *convName) {
}
curAction->targetOffset = convS->readUint32LE();
- assert(convS->readUint32LE() == kOpAssign);
+ int op = convS->readUint32LE();
+ assert(op == kOpAssign);
curAction->value = convS->readUint32LE();
break;
+ }
case CHUNK_CCGO: // Conditional go to entry
case CHUNK_CHDE: // Conditional hide entry
case CHUNK_CUHD: // Conditional unhide entry
diff --git a/engines/m4/detection.cpp b/engines/m4/detection.cpp
index 9c359c081f..58a5db6c89 100644
--- a/engines/m4/detection.cpp
+++ b/engines/m4/detection.cpp
@@ -65,9 +65,6 @@ const char *MadsM4Engine::getGameFile(int fileType) {
return NULL;
}
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-
static const M4GameDescription gameDescriptions[] = {
{
{
@@ -80,7 +77,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Burger,
kFeaturesCD
@@ -96,7 +93,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Burger,
kFeaturesCD
@@ -112,7 +109,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::RU_RUS,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Burger,
kFeaturesCD
@@ -128,7 +125,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Burger,
kFeaturesDemo
@@ -144,7 +141,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Burger,
kFeaturesDemo
@@ -160,7 +157,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Riddle,
kFeaturesCD
@@ -176,7 +173,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Riddle,
kFeaturesCD
@@ -192,7 +189,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Riddle,
kFeaturesCD
@@ -208,7 +205,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Riddle,
kFeaturesCD
@@ -224,7 +221,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Riddle,
kFeaturesCD
@@ -240,7 +237,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Riddle,
kFeaturesDemo
@@ -256,7 +253,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_RexNebular,
kFeaturesNone
@@ -272,7 +269,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RexNebular,
kFeaturesDemo
@@ -288,7 +285,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_DragonSphere,
kFeaturesNone
@@ -305,7 +302,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_DragonSphere,
kFeaturesCD
@@ -321,7 +318,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_DragonSphere,
kFeaturesDemo
@@ -337,7 +334,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_Phantom,
kFeaturesNone
@@ -353,7 +350,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Phantom,
kFeaturesCD
@@ -369,7 +366,7 @@ static const M4GameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_Phantom,
kFeaturesDemo
@@ -388,7 +385,7 @@ class M4MetaEngine : public AdvancedMetaEngine {
public:
M4MetaEngine() : AdvancedMetaEngine(M4::gameDescriptions, sizeof(M4::M4GameDescription), m4Games) {
_singleid = "m4";
- _guioptions = Common::GUIO_NOMIDI;
+ _guioptions = GUIO1(GUIO_NOMIDI);
_maxScanDepth = 2;
_directoryGlobs = directoryGlobs;
}
diff --git a/engines/m4/dialogs.cpp b/engines/m4/dialogs.cpp
index 390ca711d1..2b2c479673 100644
--- a/engines/m4/dialogs.cpp
+++ b/engines/m4/dialogs.cpp
@@ -265,7 +265,7 @@ void Dialog::setupInputArea() {
*/
bool Dialog::matchCommand(const char *s1, const char *s2) {
bool result = scumm_strnicmp(s1, s2, strlen(s2)) == 0;
- _commandCase = isupper(*s1);
+ _commandCase = isupper(static_cast<unsigned char>(*s1));
return result;
}
diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp
index f4aab8ae8f..7a0b776eb8 100644
--- a/engines/m4/globals.cpp
+++ b/engines/m4/globals.cpp
@@ -380,6 +380,15 @@ void MadsGlobals::loadMadsObjects() {
_vm->res()->toss("objects.dat");
}
+int MadsGlobals::getObjectIndex(uint16 descId) {
+ for (uint i = 0; i < _madsObjects.size(); ++i) {
+ if (_madsObjects[i].get()->_descId == descId)
+ return i;
+ }
+
+ return -1;
+}
+
int MadsGlobals::messageIndexOf(uint32 messageId) {
for (uint i = 0; i < _madsMessages.size(); ++i)
{
diff --git a/engines/m4/globals.h b/engines/m4/globals.h
index ae2941c169..693dc9d6c9 100644
--- a/engines/m4/globals.h
+++ b/engines/m4/globals.h
@@ -297,6 +297,8 @@ public:
void loadMadsObjects();
uint32 getObjectsSize() { return _madsObjects.size(); }
MadsObject *getObject(uint32 index) { return _madsObjects[index].get(); }
+ int getObjectIndex(uint16 descId);
+ int getObjectFolder(uint32 folderId) { warning("TODO: getObjectFolder"); return -1; }
void addVisitedScene(int sceneNumber);
bool isSceneVisited(int sceneNumber);
diff --git a/engines/m4/m4.h b/engines/m4/m4.h
index 46107cb20a..b40ba0e878 100644
--- a/engines/m4/m4.h
+++ b/engines/m4/m4.h
@@ -26,7 +26,6 @@
#include "common/scummsys.h"
#include "common/util.h"
#include "common/random.h"
-#include "audio/mididrv.h"
#include "engines/engine.h"
diff --git a/engines/m4/m4_views.cpp b/engines/m4/m4_views.cpp
index 78c409252b..1324526ab5 100644
--- a/engines/m4/m4_views.cpp
+++ b/engines/m4/m4_views.cpp
@@ -231,11 +231,9 @@ M4InterfaceView::M4InterfaceView(MadsM4Engine *vm):
_selected = false;
Common::SeekableReadStream *data = _vm->res()->get(INTERFACE_SERIES);
- RGB8 *palette;
-
_sprites = new SpriteAsset(_vm, data, data->size(), INTERFACE_SERIES);
- palette = _sprites->getPalette();
+ //RGB8 *palette = _sprites->getPalette();
//Palette.setPalette(palette, 0, _sprites->getColorCount());
_vm->res()->toss(INTERFACE_SERIES);
diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp
index cc28a26e68..335127393e 100644
--- a/engines/m4/mads_logic.cpp
+++ b/engines/m4/mads_logic.cpp
@@ -199,6 +199,10 @@ uint32 MadsSceneLogic::getDataValue(int dataId) {
return getActiveAnimationBool();
case 11:
return getAnimationCurrentFrame();
+ case 12:
+ return _madsVm->scene()->_action._inProgress;
+ case 13:
+ return _madsVm->globals()->_difficultyLevel;
default:
// All other data variables get stored in the hash table
return _madsVm->globals()->_dataMap[dataId];
@@ -239,6 +243,12 @@ void MadsSceneLogic::setDataValue(int dataId, uint16 dataValue) {
case 11:
error("Tried to set read only data field %d", dataId);
break;
+ case 12:
+ _madsVm->scene()->_action._inProgress = dataValue != 0;
+ break;
+ case 13:
+ _madsVm->globals()->_difficultyLevel = dataValue;
+ break;
default:
// All other data variables get stored in the hash table
_madsVm->globals()->_dataMap[dataId] = dataValue;
@@ -986,6 +996,37 @@ void MadsSceneLogic::callSubroutine(int subIndex, Common::Stack<ScriptVar> &stac
break;
}
+ case 27: {
+ // object_get_id_from_desc
+ EXTRACT_PARAMS(1);
+ stack.push(_madsVm->globals()->getObjectIndex(p[0]));
+ break;
+ }
+
+ case 28: {
+ // object_get_folder
+ EXTRACT_PARAMS(1);
+ stack.push(_madsVm->globals()->getObjectFolder(p[0]));
+ break;
+ }
+
+ case 29:
+ // inventory_remove
+ EXTRACT_PARAMS(1);
+ _madsVm->scene()->getInterface()->addObjectToInventory(p[0]);
+ break;
+
+ case 30:
+ // image_inter_list_call
+ EXTRACT_PARAMS(1);
+ warning("TODO: image_inter_list_call");
+ break;
+
+ case 31:
+ // dialog_flags_show
+ warning("todo: dialog_flags_show");
+ break;
+
default:
error("Unknown subroutine %d called", subIndex);
break;
diff --git a/engines/m4/midi.h b/engines/m4/midi.h
index 6eef907ce3..817150fd81 100644
--- a/engines/m4/midi.h
+++ b/engines/m4/midi.h
@@ -57,4 +57,3 @@ protected:
} // End of namespace M4
#endif
-
diff --git a/engines/m4/saveload.cpp b/engines/m4/saveload.cpp
index aa35385bfe..a7615fa4b6 100644
--- a/engines/m4/saveload.cpp
+++ b/engines/m4/saveload.cpp
@@ -96,7 +96,8 @@ SaveGameList *SaveLoad::getSaves() {
result->push_back(Common::String());
} else {
// Skip over byte offset
- assert(saveFile->readUint32LE() < 0x100);
+ uint32 offset = saveFile->readUint32LE();
+ assert(offset < 0x100);
// Read in savegame name
saveFile->read(&saveName[0], MAX_SAVEGAME_NAME);
diff --git a/engines/m4/scripttab.h b/engines/m4/scripttab.h
index b6156f0b82..3264ae743c 100644
--- a/engines/m4/scripttab.h
+++ b/engines/m4/scripttab.h
@@ -133,4 +133,3 @@
VARIABLE(kInterfaceVisible)
};
#undef VARIABLE
-
diff --git a/engines/made/database.cpp b/engines/made/database.cpp
index 004f1462a6..454fe09a38 100644
--- a/engines/made/database.cpp
+++ b/engines/made/database.cpp
@@ -20,13 +20,15 @@
*
*/
-#include "common/system.h"
+#include "made/database.h"
+#include "made/redreader.h"
+
#include "common/endian.h"
-#include "common/util.h"
+#include "common/stream.h"
+#include "common/debug.h"
+#include "common/file.h"
#include "common/savefile.h"
-#include "common/textconsole.h"
-
-#include "made/database.h"
+#include "common/system.h"
namespace Made {
@@ -494,6 +496,7 @@ int16 GameDatabaseV2::savegame(const char *filename, const char *description, in
out->write(_gameState + 2, _gameStateSize - 2);
for (uint i = 0; i < _objects.size(); i++)
_objects[i]->save(*out);
+ out->finalize();
delete out;
return result;
}
@@ -697,6 +700,7 @@ int16 GameDatabaseV3::savegame(const char *filename, const char *description, in
out->writeUint16LE(version);
out->write(desc, 64);
out->write(_gameState, _gameStateSize);
+ out->finalize();
delete out;
return result;
}
diff --git a/engines/made/database.h b/engines/made/database.h
index 3bf69ca116..63f0557196 100644
--- a/engines/made/database.h
+++ b/engines/made/database.h
@@ -23,18 +23,18 @@
#ifndef MADE_DATABASE_H
#define MADE_DATABASE_H
-#include "common/array.h"
#include "common/hashmap.h"
-#include "common/util.h"
-#include "common/file.h"
-#include "common/stream.h"
-#include "common/str.h"
-#include "made/made.h"
-#include "made/redreader.h"
+namespace Common {
+class SeekableReadStream;
+class WriteStream;
+class String;
+}
namespace Made {
+class MadeEngine;
+
class Object {
public:
diff --git a/engines/made/detection.cpp b/engines/made/detection.cpp
index e8c948af4e..2a9beed5c4 100644
--- a/engines/made/detection.cpp
+++ b/engines/made/detection.cpp
@@ -20,13 +20,9 @@
*
*/
-#include "base/plugins.h"
-
-#include "engines/advancedDetector.h"
-#include "common/file.h"
-
#include "made/made.h"
+#include "engines/advancedDetector.h"
namespace Made {
@@ -69,9 +65,6 @@ static const PlainGameDescriptor madeGames[] = {
namespace Made {
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-
static const MadeGameDescription gameDescriptions[] = {
{
// NOTE: Return to Zork entries with *.dat are used to detect the game via rtzcd.dat,
@@ -87,7 +80,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -104,8 +97,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1("rtzcd.red", "cd8b62ece4677c438688c1de3f5379b9"),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -121,8 +114,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.dat", "a1db8c97a78dae10f91d356f16ad07b8", 536064),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -138,8 +131,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.red", "c4e2430e6b6c6ff1562a80fb4a9df24c", 276177),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -156,8 +149,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a"),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -173,8 +166,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 276584),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -191,8 +184,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a", 525824),
Common::DE_DEU,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -209,8 +202,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 355442),
Common::DE_DEU,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -227,8 +220,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.dat", "5b86035aed0277f96e3d173542b5364a", 523776),
Common::IT_ITA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -245,8 +238,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354971),
Common::IT_ITA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -263,8 +256,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.dat", "bde8251a8e34e87c54e3f93147d56c9e", 523776),
Common::FR_FRA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -281,8 +274,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354614),
Common::FR_FRA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -299,7 +292,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_RTZ,
0,
@@ -316,7 +309,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -333,8 +326,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1("rtzcd.dat", "c4fccf67ad247f09b94c3c808b138576"),
Common::JA_JPN,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -351,8 +344,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1("rtzcd.dat", "e949a6a42d82daabfa7d4dc0a87a9843"),
Common::JA_JPN,
Common::kPlatformFMTowns,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -369,8 +362,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1("rtzcd.dat", "0c0117e98530c736a141c2aad6834dc5"),
Common::JA_JPN,
Common::kPlatformPC98,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_RTZ,
0,
@@ -386,8 +379,8 @@ static const MadeGameDescription gameDescriptions[] = {
AD_ENTRY1("manhole.dat", "cb21e31ed35c963208343bc995225b73"),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ ADGF_CD,
+ GUIO1(GUIO_NOSPEECH)
},
GID_MANHOLE,
0,
@@ -404,7 +397,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_MANHOLE,
0,
@@ -421,7 +414,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_LGOP2,
0,
@@ -439,7 +432,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_LGOP2,
0,
@@ -457,7 +450,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_LGOP2,
0,
@@ -475,7 +468,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_LGOP2,
0,
@@ -492,7 +485,7 @@ static const MadeGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_RODNEY,
0,
@@ -515,7 +508,7 @@ static MadeGameDescription g_fallbackDesc = {
Common::UNK_LANG,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
0,
0,
@@ -542,7 +535,7 @@ public:
virtual bool hasFeature(MetaEngineFeature f) const;
virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
- const ADGameDescription *fallbackDetect(const Common::FSList &fslist, const FileMap &allFiles) const;
+ const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const;
};
@@ -564,7 +557,7 @@ bool MadeMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGame
return gd != 0;
}
-const ADGameDescription *MadeMetaEngine::fallbackDetect(const Common::FSList &fslist, const FileMap &allFiles) const {
+const ADGameDescription *MadeMetaEngine::fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const {
// Set the default values for the fallback descriptor's ADGameDescription part.
Made::g_fallbackDesc.desc.language = Common::UNK_LANG;
Made::g_fallbackDesc.desc.platform = Common::kPlatformPC;
diff --git a/engines/made/graphics.cpp b/engines/made/graphics.cpp
index 3ac73617c1..30496d8595 100644
--- a/engines/made/graphics.cpp
+++ b/engines/made/graphics.cpp
@@ -20,11 +20,14 @@
*
*/
-#include "common/debug.h"
+#include "made/graphics.h"
+
#include "common/endian.h"
#include "common/textconsole.h"
+#include "common/debug.h"
+#include "common/util.h"
-#include "made/graphics.h"
+#include "graphics/surface.h"
namespace Made {
diff --git a/engines/made/graphics.h b/engines/made/graphics.h
index 691f1127c2..15704c7792 100644
--- a/engines/made/graphics.h
+++ b/engines/made/graphics.h
@@ -23,10 +23,11 @@
#ifndef MADE_GRAPHICS_H
#define MADE_GRAPHICS_H
-#include "common/util.h"
-#include "common/file.h"
-#include "common/stream.h"
-#include "graphics/surface.h"
+#include "common/scummsys.h"
+
+namespace Graphics {
+struct Surface;
+}
namespace Made {
diff --git a/engines/made/made.cpp b/engines/made/made.cpp
index 75d39fa205..3843040961 100644
--- a/engines/made/made.cpp
+++ b/engines/made/made.cpp
@@ -20,31 +20,23 @@
*
*/
-#include "common/events.h"
-#include "common/keyboard.h"
-#include "common/config-manager.h"
-#include "common/stream.h"
-
-#include "graphics/cursorman.h"
-
-#include "engines/util.h"
-
-#include "backends/audiocd/audiocd.h"
-
-#include "base/plugins.h"
-#include "base/version.h"
-
-#include "audio/mixer.h"
-
#include "made/made.h"
-#include "made/database.h"
+#include "made/console.h"
#include "made/pmvplayer.h"
#include "made/resource.h"
#include "made/screen.h"
+#include "made/database.h"
#include "made/script.h"
-#include "made/sound.h"
#include "made/music.h"
-#include "made/redreader.h"
+
+#include "common/config-manager.h"
+#include "common/events.h"
+#include "common/system.h"
+#include "common/error.h"
+
+#include "engines/util.h"
+
+#include "backends/audiocd/audiocd.h"
namespace Made {
@@ -143,6 +135,10 @@ int16 MadeEngine::getTicks() {
return g_system->getMillis() * 30 / 1000;
}
+GUI::Debugger *MadeEngine::getDebugger() {
+ return _console;
+}
+
int16 MadeEngine::getTimer(int16 timerNum) {
if (timerNum > 0 && timerNum <= ARRAYSIZE(_timers) && _timers[timerNum - 1] != -1)
return (getTicks() - _timers[timerNum - 1]);
diff --git a/engines/made/made.h b/engines/made/made.h
index e9673eed3c..c0b86bb0a8 100644
--- a/engines/made/made.h
+++ b/engines/made/made.h
@@ -20,30 +20,14 @@
*
*/
-#ifndef MADE_H
-#define MADE_H
-
-#include "common/scummsys.h"
-#include "common/endian.h"
-#include "common/events.h"
-#include "common/file.h"
-#include "common/hash-str.h"
-#include "common/keyboard.h"
-#include "common/random.h"
-#include "common/savefile.h"
-#include "common/system.h"
-#include "common/util.h"
-
-#include "graphics/surface.h"
+#ifndef MADE_MADE_H
+#define MADE_MADE_H
-#include "audio/audiostream.h"
-#include "audio/mixer.h"
-#include "audio/decoders/voc.h"
+#include "made/sound.h"
#include "engines/engine.h"
-#include "made/sound.h"
-#include "made/console.h"
+#include "common/random.h"
/**
* This is the namespace of the Made engine.
@@ -82,6 +66,7 @@ class Screen;
class ScriptInterpreter;
class GameDatabase;
class MusicPlayer;
+class MadeConsole;
class MadeEngine : public ::Engine {
int _gameId;
@@ -98,7 +83,7 @@ public:
virtual bool hasFeature(EngineFeature f) const;
virtual void syncSoundSettings();
- GUI::Debugger *getDebugger() { return _console; }
+ virtual GUI::Debugger *getDebugger();
int getGameId() {
return _gameId;
diff --git a/engines/made/music.cpp b/engines/made/music.cpp
index 146d8d6371..04ac13eeda 100644
--- a/engines/made/music.cpp
+++ b/engines/made/music.cpp
@@ -24,11 +24,10 @@
// MIDI and digital music class
-#include "audio/audiostream.h"
-#include "audio/mididrv.h"
-#include "audio/midiparser.h"
-
#include "made/music.h"
+#include "made/resource.h"
+
+#include "audio/midiparser.h"
namespace Made {
diff --git a/engines/made/music.h b/engines/made/music.h
index 1a5bae3040..3cfbd50ce7 100644
--- a/engines/made/music.h
+++ b/engines/made/music.h
@@ -26,13 +26,11 @@
#define MADE_MUSIC_H
#include "audio/midiplayer.h"
-#include "audio/midiparser.h"
-#include "common/mutex.h"
-
-#include "made/resource.h"
namespace Made {
+class GenericResource;
+
enum MusicFlags {
MUSIC_NORMAL = 0,
MUSIC_LOOP = 1
diff --git a/engines/made/pmvplayer.cpp b/engines/made/pmvplayer.cpp
index 386d618273..6c4749f44d 100644
--- a/engines/made/pmvplayer.cpp
+++ b/engines/made/pmvplayer.cpp
@@ -21,9 +21,19 @@
*/
#include "made/pmvplayer.h"
+#include "made/made.h"
#include "made/screen.h"
+#include "made/graphics.h"
+
+#include "common/file.h"
+#include "common/debug.h"
+#include "common/system.h"
+#include "common/events.h"
#include "audio/decoders/raw.h"
+#include "audio/audiostream.h"
+
+#include "graphics/surface.h"
namespace Made {
diff --git a/engines/made/pmvplayer.h b/engines/made/pmvplayer.h
index 58b6eafd2b..3821ca8de1 100644
--- a/engines/made/pmvplayer.h
+++ b/engines/made/pmvplayer.h
@@ -23,20 +23,24 @@
#ifndef MADE_PMVPLAYER_H
#define MADE_PMVPLAYER_H
-#include "common/system.h"
-#include "common/events.h"
-#include "common/file.h"
-#include "common/endian.h"
-#include "graphics/surface.h"
#include "audio/mixer.h"
-#include "audio/audiostream.h"
-#include "made/graphics.h"
-#include "made/sound.h"
-#include "made/made.h"
+namespace Common {
+class File;
+}
+
+namespace Graphics {
+struct Surface;
+}
+
+namespace Audio {
+class QueuingAudioStream;
+}
namespace Made {
+class MadeEngine;
+
class PmvPlayer {
public:
PmvPlayer(MadeEngine *vm, Audio::Mixer *mixer);
diff --git a/engines/made/redreader.cpp b/engines/made/redreader.cpp
index a18c719110..7e92cfe71b 100644
--- a/engines/made/redreader.cpp
+++ b/engines/made/redreader.cpp
@@ -21,8 +21,9 @@
*/
#include "made/redreader.h"
+
+#include "common/file.h"
#include "common/memstream.h"
-#include "common/textconsole.h"
namespace Made {
diff --git a/engines/made/redreader.h b/engines/made/redreader.h
index 84181fb722..3025d31ce1 100644
--- a/engines/made/redreader.h
+++ b/engines/made/redreader.h
@@ -23,9 +23,12 @@
#ifndef MADE_REDREADER_H
#define MADE_REDREADER_H
-#include "common/util.h"
-#include "common/file.h"
-#include "common/stream.h"
+#include "common/scummsys.h"
+
+namespace Common {
+class SeekableReadStream;
+class File;
+}
namespace Made {
diff --git a/engines/made/resource.cpp b/engines/made/resource.cpp
index 246241561c..28fee8ce57 100644
--- a/engines/made/resource.cpp
+++ b/engines/made/resource.cpp
@@ -20,15 +20,17 @@
*
*/
-#include "common/debug.h"
-#include "common/endian.h"
-#include "common/memstream.h"
-#include "audio/mixer.h"
-#include "audio/decoders/raw.h"
-
#include "made/resource.h"
#include "made/graphics.h"
-#include "made/sound.h"
+
+#include "common/file.h"
+#include "common/memstream.h"
+#include "common/debug.h"
+
+#include "graphics/surface.h"
+
+#include "audio/decoders/raw.h"
+#include "audio/audiostream.h"
namespace Made {
diff --git a/engines/made/resource.h b/engines/made/resource.h
index 8ffebfef50..9e0a729c58 100644
--- a/engines/made/resource.h
+++ b/engines/made/resource.h
@@ -23,15 +23,23 @@
#ifndef MADE_RESOURCE_H
#define MADE_RESOURCE_H
-#include "common/util.h"
-#include "common/file.h"
-#include "common/stream.h"
+#include "made/sound.h"
+
+#include "common/endian.h"
+#include "common/array.h"
#include "common/hashmap.h"
-#include "common/textconsole.h"
-#include "graphics/surface.h"
-#include "audio/audiostream.h"
-#include "made/sound.h"
+namespace Common {
+class File;
+}
+
+namespace Audio {
+class AudioStream;
+}
+
+namespace Graphics {
+struct Surface;
+}
namespace Made {
diff --git a/engines/made/screen.cpp b/engines/made/screen.cpp
index 7a8b4603dc..dbe2f1c7ba 100644
--- a/engines/made/screen.cpp
+++ b/engines/made/screen.cpp
@@ -20,12 +20,16 @@
*
*/
-#include "made/made.h"
#include "made/screen.h"
-#include "made/resource.h"
+#include "made/made.h"
+#include "made/screenfx.h"
#include "made/database.h"
+#include "common/system.h"
+
+#include "graphics/surface.h"
#include "graphics/palette.h"
+#include "graphics/cursorman.h"
namespace Made {
diff --git a/engines/made/screen.h b/engines/made/screen.h
index 8485c1c4d7..a61ecabdce 100644
--- a/engines/made/screen.h
+++ b/engines/made/screen.h
@@ -23,15 +23,9 @@
#ifndef MADE_SCREEN_H
#define MADE_SCREEN_H
-#include "common/endian.h"
-#include "common/util.h"
-#include "common/rect.h"
-
-#include "graphics/surface.h"
-#include "graphics/cursorman.h"
-
#include "made/resource.h"
-#include "made/screenfx.h"
+
+#include "common/rect.h"
namespace Made {
@@ -56,6 +50,7 @@ struct SpriteListItem {
};
class MadeEngine;
+class ScreenEffects;
static const byte defaultMouseCursor[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
diff --git a/engines/made/screenfx.cpp b/engines/made/screenfx.cpp
index bdc36c87d7..ff0d393885 100644
--- a/engines/made/screenfx.cpp
+++ b/engines/made/screenfx.cpp
@@ -20,9 +20,10 @@
*
*/
-#include "made/made.h"
-#include "made/screen.h"
#include "made/screenfx.h"
+#include "made/screen.h"
+
+#include "graphics/surface.h"
namespace Made {
@@ -58,11 +59,6 @@ ScreenEffects::~ScreenEffects() {
}
void ScreenEffects::run(int16 effectNum, Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
- // Workaround: we set up the final palette beforehand, to reduce CPU usage during the screen effect.
- // The visual difference is not noticeable, but CPU load is much much less (as palette updates are very expensive).
- // The palette changes in the effects have been removed, where applicable, to reduce CPU load
- setPalette(palette);
-
// TODO: Put effect functions into an array
switch (effectNum) {
@@ -188,6 +184,28 @@ void ScreenEffects::setBlendedPalette(byte *palette, byte *newPalette, int color
}
}
+void ScreenEffects::startBlendedPalette(byte *palette, byte *newPalette, int colorCount, int16 maxValue) {
+ _blendedPaletteStatus._palette = palette;
+ _blendedPaletteStatus._newPalette = newPalette;
+ _blendedPaletteStatus._colorCount = colorCount;
+ _blendedPaletteStatus._maxValue = maxValue;
+ _blendedPaletteStatus._incr = maxValue / 10; // ~10 palette updates
+ _blendedPaletteStatus._value = 0;
+ // Don't do anything if the two palettes are identical
+ _blendedPaletteStatus._active = memcmp(palette, newPalette, colorCount * 3) != 0;
+}
+
+void ScreenEffects::stepBlendedPalette() {
+ if (_blendedPaletteStatus._active && _blendedPaletteStatus._value < _blendedPaletteStatus._maxValue) {
+ setBlendedPalette(_blendedPaletteStatus._palette, _blendedPaletteStatus._newPalette,
+ _blendedPaletteStatus._colorCount, _blendedPaletteStatus._value, _blendedPaletteStatus._maxValue);
+ if (_blendedPaletteStatus._value == _blendedPaletteStatus._maxValue)
+ _blendedPaletteStatus._value++;
+ else
+ _blendedPaletteStatus._value = MIN<int16>(_blendedPaletteStatus._value + _blendedPaletteStatus._incr, _blendedPaletteStatus._maxValue);
+ }
+}
+
void ScreenEffects::copyFxRect(Graphics::Surface *surface, int16 x1, int16 y1, int16 x2, int16 y2) {
// TODO: Clean up
@@ -273,71 +291,78 @@ void ScreenEffects::vfx00(Graphics::Surface *surface, byte *palette, byte *newPa
}
void ScreenEffects::vfx01(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 312);
for (int x = 0; x < 320; x += 8) {
_screen->copyRectToScreen((const byte*)surface->getBasePtr(x, 0), surface->pitch, x, 0, 8, 200);
- //setBlendedPalette(palette, newPalette, colorCount, x, 312); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
void ScreenEffects::vfx02(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 312);
for (int x = 312; x >= 0; x -= 8) {
_screen->copyRectToScreen((const byte*)surface->getBasePtr(x, 0), surface->pitch, x, 0, 8, 200);
- //setBlendedPalette(palette, newPalette, colorCount, 312 - x, 312); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
void ScreenEffects::vfx03(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 190);
for (int y = 0; y < 200; y += 10) {
_screen->copyRectToScreen((const byte*)surface->getBasePtr(0, y), surface->pitch, 0, y, 320, 10);
- //setBlendedPalette(palette, newPalette, colorCount, y, 190); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
void ScreenEffects::vfx04(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 190);
for (int y = 190; y >= 0; y -= 10) {
_screen->copyRectToScreen((const byte*)surface->getBasePtr(0, y), surface->pitch, 0, y, 320, 10);
- //setBlendedPalette(palette, newPalette, colorCount, 190 - y, 190); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
void ScreenEffects::vfx05(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 90);
for (int y = 0; y < 100; y += 10) {
_screen->copyRectToScreen((const byte*)surface->getBasePtr(0, y + 100), surface->pitch, 0, y + 100, 320, 10);
_screen->copyRectToScreen((const byte*)surface->getBasePtr(0, 90 - y), surface->pitch, 0, 90 - y, 320, 10);
- //setBlendedPalette(palette, newPalette, colorCount, y, 90); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Curtain open" effect
void ScreenEffects::vfx06(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 152);
for (int x = 0; x < 160; x += 8) {
_screen->copyRectToScreen((const byte*)surface->getBasePtr(x + 160, 0), surface->pitch, x + 160, 0, 8, 200);
_screen->copyRectToScreen((const byte*)surface->getBasePtr(152 - x, 0), surface->pitch, 152 - x, 0, 8, 200);
- //setBlendedPalette(palette, newPalette, colorCount, x, 152); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Curtain close" effect
void ScreenEffects::vfx07(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 152);
for (int x = 152; x >= 0; x -= 8) {
_screen->copyRectToScreen((const byte*)surface->getBasePtr(x + 160, 0), surface->pitch, x + 160, 0, 8, 200);
_screen->copyRectToScreen((const byte*)surface->getBasePtr(152 - x, 0), surface->pitch, 152 - x, 0, 8, 200);
- //setBlendedPalette(palette, newPalette, colorCount, 152 - x, 152); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Screen slide in" right to left
@@ -346,7 +371,7 @@ void ScreenEffects::vfx08(Graphics::Surface *surface, byte *palette, byte *newPa
_screen->copyRectToScreen((const byte*)surface->getBasePtr(0, 0), surface->pitch, 320 - x, 0, x, 200);
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Checkerboard" effect
@@ -365,77 +390,84 @@ void ScreenEffects::vfx09(Graphics::Surface *surface, byte *palette, byte *newPa
// "Screen wipe in", left to right
void ScreenEffects::vfx10(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 368);
for (int x = -56; x < 312; x += 8) {
copyFxRect(surface, x, 0, x + 64, 200);
- //setBlendedPalette(palette, newPalette, colorCount, x + 56, 368); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Screen wipe in", right to left
void ScreenEffects::vfx11(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 368);
for (int x = 312; x > -56; x -= 8) {
copyFxRect(surface, x, 0, x + 64, 200);
- //setBlendedPalette(palette, newPalette, colorCount, x + 56, 368); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Screen wipe in", top to bottom
void ScreenEffects::vfx12(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 260);
for (int y = -70; y < 312; y += 10) {
copyFxRect(surface, 0, y, 320, y + 80);
- //setBlendedPalette(palette, newPalette, colorCount, y + 70, 260); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Screen wipe in", bottom to top
void ScreenEffects::vfx13(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ startBlendedPalette(palette, newPalette, colorCount, 260);
for (int y = 312; y > -70; y -= 10) {
copyFxRect(surface, 0, y, 320, y + 80);
- //setBlendedPalette(palette, newPalette, colorCount, y + 70, 260); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Screen open" effect
void ScreenEffects::vfx14(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
int16 x = 8, y = 5;
+ startBlendedPalette(palette, newPalette, colorCount, 27);
for (int i = 0; i < 27; i++) {
copyFxRect(surface, 160 - x, 100 - y, 160 + x, 100 + y);
x += 8;
y += 5;
- //setBlendedPalette(palette, newPalette, colorCount, i, 27); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
void ScreenEffects::vfx15(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
int16 x = 8;
+ startBlendedPalette(palette, newPalette, colorCount, 27);
for (int i = 0; i < 27; i++) {
copyFxRect(surface, 160 - x, 0, 160 + x, 200);
x += 8;
- //setBlendedPalette(palette, newPalette, colorCount, i, 27); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
void ScreenEffects::vfx16(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
int16 y = 8;
+ startBlendedPalette(palette, newPalette, colorCount, 27);
for (int i = 0; i < 27; i++) {
copyFxRect(surface, 0, 100 - y, 320, 100 + y);
y += 5;
- //setBlendedPalette(palette, newPalette, colorCount, i, 27); // original behavior
+ stepBlendedPalette();
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// Palette fadeout/fadein
@@ -448,16 +480,12 @@ void ScreenEffects::vfx17(Graphics::Surface *surface, byte *palette, byte *newPa
memcpy(tempPalette, palette, 768);
- // We reduce the number of palette updates by the following factor (e.g. a factor of 5 would mean 5
- // times less updates). This is done to reduce CPU load while performing the very expensive full
- // screen palette changes. The original behavior is to set factor to 1.
- int factor = 5;
-
// Fade out to black
memset(palette, 0, 768);
- for (int i = 0; i < 50 / factor; i++) {
- setBlendedPalette(palette, newPalette, colorCount, i * factor, 50);
- _screen->updateScreenAndWait(25 * factor);
+ startBlendedPalette(palette, newPalette, colorCount, 50);
+ for (int i = 0; i < 50; i++) {
+ stepBlendedPalette();
+ _screen->updateScreenAndWait(25);
}
_screen->setRGBPalette(palette, 0, colorCount);
@@ -467,9 +495,10 @@ void ScreenEffects::vfx17(Graphics::Surface *surface, byte *palette, byte *newPa
// Fade from black to palette
memset(newPalette, 0, 768);
- for (int i = 0; i < 50 / factor; i++) {
- setBlendedPalette(palette, newPalette, colorCount, i * factor, 50);
- _screen->updateScreenAndWait(25 * factor);
+ startBlendedPalette(palette, newPalette, colorCount, 50);
+ for (int i = 0; i < 50; i++) {
+ stepBlendedPalette();
+ _screen->updateScreenAndWait(25);
}
_screen->setRGBPalette(palette, 0, colorCount);
@@ -484,7 +513,7 @@ void ScreenEffects::vfx18(Graphics::Surface *surface, byte *palette, byte *newPa
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Screen slide in" top to bottom
@@ -494,7 +523,7 @@ void ScreenEffects::vfx19(Graphics::Surface *surface, byte *palette, byte *newPa
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
// "Screen slide in" bottom to top
@@ -504,7 +533,7 @@ void ScreenEffects::vfx20(Graphics::Surface *surface, byte *palette, byte *newPa
_screen->updateScreenAndWait(25);
}
- //setPalette(palette); // original behavior
+ setPalette(palette);
}
} // End of namespace Made
diff --git a/engines/made/screenfx.h b/engines/made/screenfx.h
index 793fcba2d6..1fcdd5f0d4 100644
--- a/engines/made/screenfx.h
+++ b/engines/made/screenfx.h
@@ -23,17 +23,24 @@
#ifndef MADE_SCREENFX_H
#define MADE_SCREENFX_H
-#include "common/endian.h"
-#include "common/util.h"
-#include "common/rect.h"
+#include "common/scummsys.h"
-#include "graphics/surface.h"
-
-#include "made/made.h"
-#include "made/screen.h"
+namespace Graphics {
+struct Surface;
+}
namespace Made {
+class Screen;
+
+struct BlendedPaletteStatus {
+ bool _active;
+ byte *_palette, *_newPalette;
+ int _colorCount;
+ int16 _value, _maxValue, _incr;
+ int cnt;
+};
+
class ScreenEffects {
public:
ScreenEffects(Screen *screen);
@@ -47,8 +54,12 @@ private:
static const byte vfxOffsIndexTable[8];
const byte *vfxOffsTablePtr;
int16 vfxX1, vfxY1, vfxWidth, vfxHeight;
+ BlendedPaletteStatus _blendedPaletteStatus;
+
void setPalette(byte *palette);
void setBlendedPalette(byte *palette, byte *newPalette, int colorCount, int16 value, int16 maxValue);
+ void startBlendedPalette(byte *palette, byte *newPalette, int colorCount, int16 maxValue);
+ void stepBlendedPalette();
void copyFxRect(Graphics::Surface *surface, int16 x1, int16 y1, int16 x2, int16 y2);
void vfx00(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
diff --git a/engines/made/script.cpp b/engines/made/script.cpp
index 2776008828..7658d20eb5 100644
--- a/engines/made/script.cpp
+++ b/engines/made/script.cpp
@@ -20,15 +20,13 @@
*
*/
-#include "common/endian.h"
-#include "common/util.h"
-
-#include "made/made.h"
#include "made/script.h"
-#include "made/database.h"
#include "made/scriptfuncs.h"
+#include "made/made.h"
+#include "made/database.h"
#include "made/screen.h"
+#include "common/util.h"
namespace Made {
diff --git a/engines/made/script.h b/engines/made/script.h
index 0a7cf8e974..f3db43485f 100644
--- a/engines/made/script.h
+++ b/engines/made/script.h
@@ -23,9 +23,6 @@
#ifndef MADE_SCRIPT_H
#define MADE_SCRIPT_H
-#include "common/util.h"
-#include "common/file.h"
-#include "common/stream.h"
#include "common/textconsole.h"
namespace Made {
diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp
index aa172bbe74..de7b5b70f9 100644
--- a/engines/made/scriptfuncs.cpp
+++ b/engines/made/scriptfuncs.cpp
@@ -20,21 +20,19 @@
*
*/
-#include "common/util.h"
-
-#include "backends/audiocd/audiocd.h"
-#include "graphics/cursorman.h"
-#include "audio/softsynth/pcspk.h"
-
+#include "made/scriptfuncs.h"
#include "made/made.h"
-#include "made/resource.h"
-#include "made/database.h"
#include "made/screen.h"
-#include "made/script.h"
-#include "made/sound.h"
-#include "made/pmvplayer.h"
-#include "made/scriptfuncs.h"
#include "made/music.h"
+#include "made/database.h"
+#include "made/pmvplayer.h"
+
+#include "audio/softsynth/pcspk.h"
+
+#include "backends/audiocd/audiocd.h"
+
+#include "graphics/cursorman.h"
+#include "graphics/surface.h"
namespace Made {
diff --git a/engines/made/scriptfuncs.h b/engines/made/scriptfuncs.h
index 481c131248..6b3301755d 100644
--- a/engines/made/scriptfuncs.h
+++ b/engines/made/scriptfuncs.h
@@ -23,13 +23,13 @@
#ifndef MADE_SCRIPTFUNCS_H
#define MADE_SCRIPTFUNCS_H
-#include "common/util.h"
-#include "common/file.h"
-#include "common/func.h"
-#include "common/stream.h"
-
#include "made/resource.h"
+#include "audio/mixer.h"
+
+#include "common/debug.h"
+#include "common/system.h"
+
namespace Audio {
class PCSpeaker;
}
diff --git a/engines/made/sound.cpp b/engines/made/sound.cpp
index 54333eb3d4..f73c580560 100644
--- a/engines/made/sound.cpp
+++ b/engines/made/sound.cpp
@@ -20,12 +20,10 @@
*
*/
-#include "common/endian.h"
-#include "common/list.h"
-#include "common/util.h"
-
#include "made/sound.h"
+#include "common/endian.h"
+
namespace Made {
void ManholeEgaSoundDecompressor::decompress(byte *source, byte *dest, uint32 size) {
diff --git a/engines/made/sound.h b/engines/made/sound.h
index 8358d279cf..b8399fd90a 100644
--- a/engines/made/sound.h
+++ b/engines/made/sound.h
@@ -24,9 +24,6 @@
#define MADE_SOUND_H
#include "common/array.h"
-#include "common/util.h"
-#include "common/file.h"
-#include "common/stream.h"
namespace Made {
diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp
index 05012bec3d..0234c86c7e 100644
--- a/engines/mohawk/console.cpp
+++ b/engines/mohawk/console.cpp
@@ -117,7 +117,7 @@ static const char *mystStackNames[12] = {
static const uint16 default_start_card[12] = {
3137,
10000,
- 2001, // TODO: Should be 2000?
+ 2000,
5038,
2, // TODO: Should be 1?
1,
@@ -700,14 +700,25 @@ bool LivingBooksConsole::Cmd_DrawImage(int argc, const char **argv) {
}
bool LivingBooksConsole::Cmd_ChangePage(int argc, const char **argv) {
- if (argc == 1) {
- DebugPrintf("Usage: changePage <page> [<mode>]\n");
+ if (argc < 2 || argc > 3) {
+ DebugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n");
return true;
}
- if (_vm->tryLoadPageStart(argc == 2 ? _vm->getCurMode() : (LBMode)atoi(argv[2]), atoi(argv[1])))
- return false;
- DebugPrintf("no such page %d\n", atoi(argv[1]));
+ int page, subpage = 0;
+ if (sscanf(argv[1], "%d.%d", &page, &subpage) == 0) {
+ DebugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n");
+ return true;
+ }
+ LBMode mode = argc == 2 ? _vm->getCurMode() : (LBMode)atoi(argv[2]);
+ if (subpage == 0) {
+ if (_vm->tryLoadPageStart(mode, page))
+ return false;
+ } else {
+ if (_vm->loadPage(mode, page, subpage))
+ return false;
+ }
+ DebugPrintf("no such page %d.%d\n", page, subpage);
return true;
}
diff --git a/engines/mohawk/cstime.cpp b/engines/mohawk/cstime.cpp
index 59bc5ad661..3f9827581b 100644
--- a/engines/mohawk/cstime.cpp
+++ b/engines/mohawk/cstime.cpp
@@ -217,7 +217,7 @@ void MohawkEngine_CSTime::nextScene() {
void MohawkEngine_CSTime::loadResourceFile(Common::String name) {
MohawkArchive *archive = new MohawkArchive();
- if (!archive->open(name + ".mhk"))
+ if (!archive->openFile(name + ".mhk"))
error("failed to open %s.mhk", name.c_str());
_mhk.push_back(archive);
}
diff --git a/engines/mohawk/cstime.h b/engines/mohawk/cstime.h
index 3a1de6a137..0bc236f930 100644
--- a/engines/mohawk/cstime.h
+++ b/engines/mohawk/cstime.h
@@ -30,8 +30,6 @@
#include "common/random.h"
#include "common/list.h"
-#include "audio/mixer.h"
-
namespace Mohawk {
class CSTimeCase;
diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp
index a797e4e127..8c72c9875e 100644
--- a/engines/mohawk/cursors.cpp
+++ b/engines/mohawk/cursors.cpp
@@ -49,36 +49,13 @@ void CursorManager::hideCursor() {
}
void CursorManager::setDefaultCursor() {
- static const byte defaultCursor[] = {
- 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0,
- 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0,
- 1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0,
- 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0,
- 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 1, 2, 2, 1, 0, 0, 0, 0,
- 1, 2, 2, 1, 1, 2, 2, 1, 0, 0, 0, 0,
- 1, 2, 1, 0, 1, 1, 2, 2, 1, 0, 0, 0,
- 1, 1, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0
- };
-
- static const byte bwPalette[] = {
- 0x00, 0x00, 0x00, // Black
- 0xFF, 0xFF, 0xFF // White
- };
-
- CursorMan.replaceCursor(defaultCursor, 12, 20, 0, 0, 0);
- CursorMan.replaceCursorPalette(bwPalette, 1, 2);
+ Graphics::Cursor *cursor = Graphics::makeDefaultWinCursor();
+
+ CursorMan.replaceCursor(cursor->getSurface(), cursor->getWidth(), cursor->getHeight(), cursor->getHotspotX(),
+ cursor->getHotspotY(), cursor->getKeyColor());
+ CursorMan.replaceCursorPalette(cursor->getPalette(), cursor->getPaletteStartIndex(), cursor->getPaletteCount());
+
+ delete cursor;
}
void CursorManager::setCursor(uint16 id) {
@@ -222,19 +199,17 @@ void MacCursorManager::setCursor(uint16 id) {
if (!stream)
stream = _resFork->getResource(MKTAG('C','U','R','S'), id);
- if (stream) {
+ if (stream)
setMacCursor(stream);
- delete stream;
- } else {
+ else
setDefaultCursor();
- }
}
LivingBooksCursorManager_v2::LivingBooksCursorManager_v2() {
// Try to open the system archive if we have it
_sysArchive = new MohawkArchive();
- if (!_sysArchive->open("system.mhk")) {
+ if (!_sysArchive->openFile("system.mhk")) {
delete _sysArchive;
_sysArchive = 0;
}
@@ -252,6 +227,17 @@ void LivingBooksCursorManager_v2::setCursor(uint16 id) {
}
}
+void LivingBooksCursorManager_v2::setCursor(const Common::String &name) {
+ if (!_sysArchive)
+ return;
+
+ uint16 id = _sysArchive->findResourceID(ID_TCUR, name);
+ if (id == 0xffff)
+ error("Could not find cursor '%s'", name.c_str());
+ else
+ setCursor(id);
+}
+
PECursorManager::PECursorManager(const Common::String &appName) {
_exe = new Common::PEResources();
diff --git a/engines/mohawk/cursors.h b/engines/mohawk/cursors.h
index d92b6b4285..7bfa491904 100644
--- a/engines/mohawk/cursors.h
+++ b/engines/mohawk/cursors.h
@@ -56,6 +56,7 @@ public:
virtual void showCursor();
virtual void hideCursor();
virtual void setCursor(uint16 id);
+ virtual void setCursor(const Common::String &name) {}
virtual void setDefaultCursor();
virtual bool hasSource() const { return false; }
@@ -157,6 +158,7 @@ public:
~LivingBooksCursorManager_v2();
void setCursor(uint16 id);
+ void setCursor(const Common::String &name);
bool hasSource() const { return _sysArchive != 0; }
private:
diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h
index 2243dd1c1d..94f18e134b 100644
--- a/engines/mohawk/detection_tables.h
+++ b/engines/mohawk/detection_tables.h
@@ -34,7 +34,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
0,
@@ -52,7 +52,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO | ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
GF_DEMO,
@@ -70,7 +70,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
0,
@@ -88,7 +88,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
0,
@@ -106,7 +106,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
0,
@@ -124,7 +124,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::JA_JPN,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
0,
@@ -142,7 +142,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
0,
@@ -160,7 +160,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MAKINGOF,
0,
@@ -178,7 +178,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::JA_JPN,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MAKINGOF,
0,
@@ -196,7 +196,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
GF_ME,
@@ -214,7 +214,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
GF_ME,
@@ -232,7 +232,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
GF_ME,
@@ -250,7 +250,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
GF_ME,
@@ -268,7 +268,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
0,
@@ -286,7 +286,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
0,
@@ -304,7 +304,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
0,
@@ -322,7 +322,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
GF_DVD,
@@ -340,7 +340,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
GF_DVD,
@@ -358,7 +358,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
GF_DVD,
@@ -376,7 +376,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO | ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
GF_DEMO,
@@ -391,7 +391,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CSTIME,
0,
@@ -406,7 +406,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO | ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CSTIME,
GF_DEMO,
@@ -422,7 +422,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_ZOOMBINI,
GF_HASMIDI,
@@ -437,7 +437,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_ZOOMBINI,
GF_HASMIDI,
@@ -452,7 +452,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_ZOOMBINI,
GF_HASMIDI,
@@ -467,7 +467,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_ZOOMBINI,
GF_HASMIDI,
@@ -482,7 +482,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_ZOOMBINI,
GF_HASMIDI,
@@ -497,7 +497,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CSWORLD,
0,
@@ -512,7 +512,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CSWORLD,
0,
@@ -527,7 +527,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CSAMTRAK,
0,
@@ -545,7 +545,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -563,7 +563,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -581,7 +581,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -597,7 +597,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -613,7 +613,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -629,7 +629,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -646,7 +646,24 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV1,
+ 0,
+ "HARRY.EXE"
+ },
+
+ // part of "Super Living Books" compilation
+ // from rgemini, bug #3309343
+ {
+ {
+ "harryhh",
+ "",
+ AD_ENTRY1("HARRY.512", "39d11399796dfa36d3f631d2d87e8b85"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -661,7 +678,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV5,
0,
@@ -676,13 +693,29 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV5,
0,
0
},
+ // From afholman in bug #3309306
+ {
+ {
+ "lbsampler",
+ "v3",
+ AD_ENTRY1("outline", "8397cea6bed1ff90029f7602ef37684d"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV3,
+ 0,
+ "Living Books Sampler"
+ },
+
{
{
"maggiesfa",
@@ -691,7 +724,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -706,7 +739,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -721,7 +754,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_JAMESMATH,
GF_HASMIDI,
@@ -737,7 +770,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_JAMESMATH,
GF_HASMIDI,
@@ -752,7 +785,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_TREEHOUSE,
GF_HASMIDI,
@@ -767,7 +800,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -783,7 +816,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -798,7 +831,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -813,7 +846,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -829,7 +862,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -844,7 +877,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -859,7 +892,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
GF_DEMO,
@@ -874,7 +907,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_1STDEGREE,
GF_HASMIDI,
@@ -892,7 +925,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_1STDEGREE,
GF_HASMIDI,
@@ -907,7 +940,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_CSUSA,
0,
@@ -922,7 +955,24 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV1,
+ 0,
+ "TORTOISE.EXE"
+ },
+
+ // part of "Super Living Books" compilation
+ // from rgemini, bug #3309343
+ {
+ {
+ "tortoise",
+ "",
+ AD_ENTRY1("TORTOISE.512", "e9ec7a6bc6b451c9e85e5b4f072d5143"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -938,7 +988,23 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "tortoise",
+ "",
+ AD_ENTRY1("TORTB.LB", "9a80b66e7d95c7f59bdfd2c280e03e6e"),
+ Common::EN_GRB,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -954,7 +1020,23 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "tortoise",
+ "",
+ AD_ENTRY1("TORTD.LB", "5d4d830116fe965ee35e328db85743b7"),
+ Common::DE_DEU,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -970,7 +1052,23 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "tortoise",
+ "",
+ AD_ENTRY1("TORTF.LB", "89f23bc3a1d1797bfe07dd0eaa7c13c4"),
+ Common::FR_FRA,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -985,7 +1083,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1000,7 +1098,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1016,7 +1114,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1031,7 +1129,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1046,7 +1144,24 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV1,
+ GF_LB_10,
+ "ARTHUR.EXE"
+ },
+
+ // part of "Super Living Books" compilation
+ // from rgemini, bug #3309343
+ {
+ {
+ "arthur",
+ "",
+ AD_ENTRY1("PAGES.512", "cd995d20d0d7b4642476fd76044b4e5b"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_LB_10,
@@ -1062,7 +1177,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_LB_10,
@@ -1078,7 +1193,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_LB_10,
@@ -1093,7 +1208,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO | GF_LB_10,
@@ -1108,7 +1223,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1124,7 +1239,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1139,7 +1254,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO | GF_LB_10,
@@ -1154,7 +1269,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1170,8 +1285,8 @@ static const MohawkGameDescription gameDescriptions[] = {
AD_ENTRY1("OUTLINE", "159c18b663c58d1aa17ad5e1ab1f0e12"),
Common::EN_ANY,
Common::kPlatformWindows,
- ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1188,13 +1303,77 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_LB_10,
"GRANDMA.EXE"
},
+ // from jjnryan in bug #3389857
+ {
+ {
+ "grandma",
+ "v1.0",
+ AD_ENTRY1("PAGES.512", "613ca946bc8d91087fb7c10e9b84e88b"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV1,
+ GF_LB_10,
+ "GRANDMA.EXE"
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "grandma",
+ "",
+ AD_ENTRY1("JGMB.LB", "400b68a6f23b88ca23a01cfd11c6ef9f"),
+ Common::EN_GRB,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "grandma",
+ "",
+ AD_ENTRY1("JGMD.LB", "c4fbfd73f805a2266cf9e15caa1b7462"),
+ Common::DE_DEU,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "grandma",
+ "",
+ AD_ENTRY1("JGMF.LB", "0c3305e109a027f8b62a6bd8c5d2addb"),
+ Common::FR_FRA,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
{
{
"grandma",
@@ -1203,7 +1382,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO | GF_LB_10,
@@ -1218,7 +1397,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1234,7 +1413,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1249,7 +1428,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO | GF_LB_10,
@@ -1264,7 +1443,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1281,7 +1460,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1297,7 +1476,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1312,7 +1491,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1328,7 +1507,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1343,7 +1522,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1359,7 +1538,24 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV1,
+ 0,
+ "NEWKID.EXE"
+ },
+
+ // part of "Super Living Books" compilation
+ // from rgemini, bug #3309343
+ {
+ {
+ "newkid",
+ "",
+ AD_ENTRY1("NEWKID.512", "28a5aef3e6ef7e2ed7742485c25bdff6"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1375,7 +1571,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1390,7 +1586,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1405,7 +1601,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1421,7 +1617,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1436,7 +1632,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1451,7 +1647,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1467,7 +1663,22 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV3,
+ 0,
+ 0
+ },
+
+ {
+ {
+ "arthurrace",
+ "",
+ AD_ENTRY1("BookOutline", "f0a9251824a648fce1b49cb7c1a0ba67"),
+ Common::EN_ANY,
+ Common::kPlatformMacintosh,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1483,7 +1694,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1499,13 +1710,78 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
"Living Books Player"
},
+ // From Torsten in bug#3422652
+ {
+ {
+ "arthurbday",
+ "",
+ AD_ENTRY1("AB16B.LB", "54223967c507a48e572902802650412f"),
+ Common::EN_GRB,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "arthurbday",
+ "",
+ AD_ENTRY1("AB16D.LB", "1154bfdb9fe8c42ad8692e68071ec175"),
+ Common::DE_DEU,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // From Torsten in bug#3422652
+ {
+ {
+ "arthurbday",
+ "",
+ AD_ENTRY1("AB16F.LB", "60f439aa56c22a400bda27c9574115a9"),
+ Common::FR_FRA,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV2,
+ 0,
+ 0,
+ },
+
+ // Arthur Birthday (English) Version 2.0 Windows(R) August 8, 1997
+ // From jacecen in bug #3413119
+ {
+ {
+ "arthurbday",
+ "",
+ AD_ENTRY1("Outline", "3b793adf2b303722e0fb6c632f94e1fb"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV3,
+ 0,
+ 0
+ },
+
{
{
"arthurbday",
@@ -1514,7 +1790,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1530,7 +1806,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1545,7 +1821,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1560,7 +1836,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1575,7 +1851,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1591,7 +1867,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1607,7 +1883,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1623,7 +1899,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1639,7 +1915,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1655,7 +1931,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1671,7 +1947,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1687,7 +1963,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
GF_DEMO,
@@ -1702,7 +1978,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1717,7 +1993,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1732,7 +2008,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV4,
0,
@@ -1747,7 +2023,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV4,
0,
@@ -1765,7 +2041,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV4,
0,
@@ -1780,7 +2056,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1795,7 +2071,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1810,7 +2086,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1826,7 +2102,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1841,7 +2117,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1856,7 +2132,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1871,7 +2147,24 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
+ },
+ GType_LIVINGBOOKSV1,
+ 0,
+ "FIGHT.EXE"
+ },
+
+ // The Berenstain Bears Get in a Fight (English and Spanish) Version 1.0 1995
+ // From jacecen in bug #3413119
+ {
+ {
+ "bearfight",
+ "",
+ AD_ENTRY1("FIGHT.512", "e313242a4cba2fffcd8cded5ca23c68a"),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1886,7 +2179,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV1,
0,
@@ -1902,7 +2195,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1919,7 +2212,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1935,7 +2228,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV3,
0,
@@ -1950,7 +2243,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV4,
0,
@@ -1965,7 +2258,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV4,
0,
@@ -1982,7 +2275,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -1998,7 +2291,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2014,7 +2307,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2031,7 +2324,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2047,7 +2340,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2063,7 +2356,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2079,7 +2372,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2095,7 +2388,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2111,7 +2404,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2127,7 +2420,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2143,7 +2436,7 @@ static const MohawkGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_LIVINGBOOKSV2,
0,
@@ -2166,7 +2459,7 @@ static const MohawkGameDescription fallbackDescs[] = {
Common::UNK_LANG,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
0,
@@ -2181,7 +2474,7 @@ static const MohawkGameDescription fallbackDescs[] = {
Common::UNK_LANG,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MAKINGOF,
0,
@@ -2196,7 +2489,7 @@ static const MohawkGameDescription fallbackDescs[] = {
Common::UNK_LANG,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_MYST,
GF_ME,
@@ -2211,7 +2504,7 @@ static const MohawkGameDescription fallbackDescs[] = {
Common::UNK_LANG,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
0,
@@ -2226,7 +2519,7 @@ static const MohawkGameDescription fallbackDescs[] = {
Common::UNK_LANG,
Common::kPlatformWindows,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GType_RIVEN,
GF_DVD,
diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp
index 6cb455917e..4461a30ad4 100644
--- a/engines/mohawk/dialogs.cpp
+++ b/engines/mohawk/dialogs.cpp
@@ -81,14 +81,17 @@ enum {
kTransCmd = 'TRAN',
kWaterCmd = 'WATR',
kDropCmd = 'DROP',
- kMapCmd = 'SMAP'
+ kMapCmd = 'SMAP',
+ kMenuCmd = 'MENU'
};
#ifdef ENABLE_MYST
MystOptionsDialog::MystOptionsDialog(MohawkEngine_Myst* vm) : GUI::OptionsDialog("", 120, 120, 360, 200), _vm(vm) {
+ // I18N: Option for fast scene switching
_zipModeCheckbox = new GUI::CheckboxWidget(this, 15, 10, 300, 15, _("~Z~ip Mode Activated"), 0, kZipCmd);
_transitionsCheckbox = new GUI::CheckboxWidget(this, 15, 30, 300, 15, _("~T~ransitions Enabled"), 0, kTransCmd);
+ // I18N: Drop book page
_dropPageButton = new GUI::ButtonWidget(this, 15, 60, 100, 25, _("~D~rop Page"), 0, kDropCmd);
// Myst ME only has maps
@@ -97,6 +100,12 @@ MystOptionsDialog::MystOptionsDialog(MohawkEngine_Myst* vm) : GUI::OptionsDialog
else
_showMapButton = 0;
+ // Myst demo only has a menu
+ if (_vm->getFeatures() & GF_DEMO)
+ _returnToMenuButton = new GUI::ButtonWidget(this, 15, 95, 100, 25, _("~M~ain Menu"), 0, kMenuCmd);
+ else
+ _returnToMenuButton = 0;
+
new GUI::ButtonWidget(this, 95, 160, 120, 25, _("~O~K"), 0, GUI::kOKCmd);
new GUI::ButtonWidget(this, 225, 160, 120, 25, _("~C~ancel"), 0, GUI::kCloseCmd);
}
@@ -113,6 +122,15 @@ void MystOptionsDialog::open() {
_showMapButton->setEnabled(_vm->_scriptParser &&
_vm->_scriptParser->getMap());
+ // Return to menu button is not enabled on the menu
+ if (_returnToMenuButton)
+ _returnToMenuButton->setEnabled(_vm->_scriptParser &&
+ _vm->getCurStack() != kDemoStack);
+
+ // Zip mode is disabled in the demo
+ if (_vm->getFeatures() & GF_DEMO)
+ _zipModeCheckbox->setEnabled(false);
+
_zipModeCheckbox->setState(_vm->_gameState->_globals.zipMode);
_transitionsCheckbox->setState(_vm->_gameState->_globals.transitions);
}
@@ -133,6 +151,10 @@ void MystOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, ui
_vm->_needsShowMap = true;
close();
break;
+ case kMenuCmd:
+ _vm->_needsShowDemoMenu = true;
+ close();
+ break;
case GUI::kCloseCmd:
close();
break;
diff --git a/engines/mohawk/dialogs.h b/engines/mohawk/dialogs.h
index 853ff30813..844c01ad26 100644
--- a/engines/mohawk/dialogs.h
+++ b/engines/mohawk/dialogs.h
@@ -83,6 +83,7 @@ private:
GUI::CheckboxWidget *_transitionsCheckbox;
GUI::ButtonWidget *_dropPageButton;
GUI::ButtonWidget *_showMapButton;
+ GUI::ButtonWidget *_returnToMenuButton;
};
#endif
diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp
index b3653b1fdf..c4326d175f 100644
--- a/engines/mohawk/graphics.cpp
+++ b/engines/mohawk/graphics.cpp
@@ -672,6 +672,52 @@ void MystGraphics::simulatePreviousDrawDelay(const Common::Rect &dest) {
_nextAllowedDrawTime = time + _constantDrawDelay + dest.height() * dest.width() / _proportionalDrawDelay;
}
+void MystGraphics::copyBackBufferToScreenWithSaturation(int16 saturation) {
+ Graphics::Surface *screen = _vm->_system->lockScreen();
+
+ for (uint16 y = 0; y < _viewport.height(); y++)
+ for (uint16 x = 0; x < _viewport.width(); x++) {
+ uint32 color;
+ uint8 r, g, b;
+
+ if (_pixelFormat.bytesPerPixel == 2)
+ color = *(const uint16 *)_backBuffer->getBasePtr(x, y);
+ else
+ color = *(const uint32 *)_backBuffer->getBasePtr(x, y);
+
+ _pixelFormat.colorToRGB(color, r, g, b);
+
+ r = CLIP<int16>((int16)r - saturation, 0, 255);
+ g = CLIP<int16>((int16)g - saturation, 0, 255);
+ b = CLIP<int16>((int16)b - saturation, 0, 255);
+
+ color = _pixelFormat.RGBToColor(r, g, b);
+
+ if (_pixelFormat.bytesPerPixel == 2) {
+ uint16 *dst = (uint16 *)screen->getBasePtr(x, y);
+ *dst = color;
+ } else {
+ uint32 *dst = (uint32 *)screen->getBasePtr(x, y);
+ *dst = color;
+ }
+ }
+
+ _vm->_system->unlockScreen();
+ _vm->_system->updateScreen();
+}
+
+void MystGraphics::fadeToBlack() {
+ for (int16 i = 0; i < 256; i += 32) {
+ copyBackBufferToScreenWithSaturation(i);
+ }
+}
+
+void MystGraphics::fadeFromBlack() {
+ for (int16 i = 256; i >= 0; i -= 32) {
+ copyBackBufferToScreenWithSaturation(i);
+ }
+}
+
#endif // ENABLE_MYST
#ifdef ENABLE_RIVEN
@@ -913,7 +959,8 @@ void RivenGraphics::clearMainScreen() {
}
void RivenGraphics::fadeToBlack() {
- // Self-explanatory
+ // The transition speed is forced to best here
+ setTransitionSpeed(kRivenTransitionSpeedBest);
scheduleTransition(16);
clearMainScreen();
runScheduledTransition();
diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h
index d7057f48cf..463608a2aa 100644
--- a/engines/mohawk/graphics.h
+++ b/engines/mohawk/graphics.h
@@ -129,11 +129,14 @@ public:
void drawRect(Common::Rect rect, RectState state);
void drawLine(const Common::Point &p1, const Common::Point &p2, uint32 color);
void enableDrawingTimeSimulation(bool enable);
+ void fadeToBlack();
+ void fadeFromBlack();
protected:
MohawkSurface *decodeImage(uint16 id);
MohawkEngine *getVM() { return (MohawkEngine *)_vm; }
void simulatePreviousDrawDelay(const Common::Rect &dest);
+ void copyBackBufferToScreenWithSaturation(int16 saturation);
private:
MohawkEngine_Myst *_vm;
@@ -194,6 +197,7 @@ public:
void scheduleTransition(uint16 id, Common::Rect rect = Common::Rect(0, 0, 608, 392));
void runScheduledTransition();
void fadeToBlack();
+ void setTransitionSpeed(uint32 speed) { _transitionSpeed = speed; }
// Inventory
void showInventory();
@@ -229,6 +233,7 @@ private:
// Transitions
int16 _scheduledTransition;
Common::Rect _transitionRect;
+ uint32 _transitionSpeed;
// Inventory
void clearInventoryArea();
diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp
index 375806cda4..65073bd970 100644
--- a/engines/mohawk/livingbooks.cpp
+++ b/engines/mohawk/livingbooks.cpp
@@ -32,6 +32,7 @@
#include "common/archive.h"
#include "common/textconsole.h"
#include "common/system.h"
+#include "common/memstream.h"
#include "graphics/palette.h"
@@ -42,7 +43,7 @@
namespace Mohawk {
// read a null-terminated string from a stream
-Common::String MohawkEngine_LivingBooks::readString(Common::SeekableSubReadStreamEndian *stream) {
+Common::String MohawkEngine_LivingBooks::readString(Common::ReadStream *stream) {
Common::String ret;
while (!stream->eos()) {
byte in = stream->readByte();
@@ -54,7 +55,7 @@ Common::String MohawkEngine_LivingBooks::readString(Common::SeekableSubReadStrea
}
// read a rect from a stream
-Common::Rect MohawkEngine_LivingBooks::readRect(Common::SeekableSubReadStreamEndian *stream) {
+Common::Rect MohawkEngine_LivingBooks::readRect(Common::ReadStreamEndian *stream) {
Common::Rect rect;
// the V1 mac games have their rects in QuickDraw order
@@ -81,13 +82,19 @@ LBPage::LBPage(MohawkEngine_LivingBooks *vm) : _vm(vm) {
_cascade = false;
}
-void LBPage::open(MohawkArchive *mhk, uint16 baseId) {
+void LBPage::open(Archive *mhk, uint16 baseId) {
_mhk = mhk;
_baseId = baseId;
_vm->addArchive(_mhk);
- if (_vm->hasResource(ID_BCOD, baseId))
+ if (!_vm->hasResource(ID_BCOD, baseId)) {
+ // assume that BCOD is mandatory for v4/v5
+ if (_vm->getGameType() == GType_LIVINGBOOKSV4 || _vm->getGameType() == GType_LIVINGBOOKSV5)
+ error("missing BCOD resource (id %d)", baseId);
+ _code = new LBCode(_vm, 0);
+ } else {
_code = new LBCode(_vm, baseId);
+ }
loadBITL(baseId);
for (uint i = 0; i < _items.size(); i++)
@@ -197,9 +204,12 @@ Common::Error MohawkEngine_LivingBooks::run() {
break;
case Common::EVENT_LBUTTONDOWN:
- for (uint16 i = 0; i < _items.size(); i++)
- if (_items[i]->contains(event.mouse))
- found = _items[i];
+ for (Common::List<LBItem *>::const_iterator i = _orderedItems.begin(); i != _orderedItems.end(); ++i) {
+ if ((*i)->contains(event.mouse)) {
+ found = *i;
+ break;
+ }
+ }
if (found)
found->handleMouseDown(event.mouse);
@@ -334,6 +344,7 @@ void MohawkEngine_LivingBooks::destroyPage() {
delete _page;
assert(_items.empty());
+ assert(_orderedItems.empty());
_page = NULL;
_notifyEvents.clear();
@@ -384,8 +395,8 @@ bool MohawkEngine_LivingBooks::loadPage(LBMode mode, uint page, uint subpage) {
warning("ignoring 'killgag' for filename '%s'", filename.c_str());
}
- MohawkArchive *pageArchive = createMohawkArchive();
- if (!filename.empty() && pageArchive->open(filename)) {
+ Archive *pageArchive = createArchive();
+ if (!filename.empty() && pageArchive->openFile(filename)) {
_page = new LBPage(this);
_page->open(pageArchive, 1000);
} else {
@@ -560,6 +571,7 @@ void MohawkEngine_LivingBooks::updatePage() {
case kLBDelayedEventDestroy:
_items.remove_at(i);
i--;
+ _orderedItems.remove(delayedEvent.item);
delete delayedEvent.item;
_page->itemDestroyed(delayedEvent.item);
if (_focus == delayedEvent.item)
@@ -589,11 +601,11 @@ void MohawkEngine_LivingBooks::updatePage() {
}
}
-void MohawkEngine_LivingBooks::addArchive(MohawkArchive *archive) {
+void MohawkEngine_LivingBooks::addArchive(Archive *archive) {
_mhk.push_back(archive);
}
-void MohawkEngine_LivingBooks::removeArchive(MohawkArchive *archive) {
+void MohawkEngine_LivingBooks::removeArchive(Archive *archive) {
for (uint i = 0; i < _mhk.size(); i++) {
if (archive != _mhk[i])
continue;
@@ -606,6 +618,8 @@ void MohawkEngine_LivingBooks::removeArchive(MohawkArchive *archive) {
void MohawkEngine_LivingBooks::addItem(LBItem *item) {
_items.push_back(item);
+ _orderedItems.push_front(item);
+ item->_iterator = _orderedItems.begin();
}
void MohawkEngine_LivingBooks::removeItems(const Common::Array<LBItem *> &items) {
@@ -619,6 +633,7 @@ void MohawkEngine_LivingBooks::removeItems(const Common::Array<LBItem *> &items)
break;
}
assert(found);
+ _orderedItems.erase(items[i]->_iterator);
}
}
@@ -767,6 +782,8 @@ void LBPage::loadBITL(uint16 resourceId) {
if (bitlStream->size() == bitlStream->pos())
break;
}
+
+ delete bitlStream;
}
Common::SeekableSubReadStreamEndian *MohawkEngine_LivingBooks::wrapStreamEndian(uint32 tag, uint16 id) {
@@ -862,8 +879,11 @@ Common::String MohawkEngine_LivingBooks::convertWinFileName(const Common::String
return filename;
}
-MohawkArchive *MohawkEngine_LivingBooks::createMohawkArchive() const {
- return isPreMohawk() ? new LivingBooksArchive_v1() : new MohawkArchive();
+Archive *MohawkEngine_LivingBooks::createArchive() const {
+ if (isPreMohawk())
+ return new LivingBooksArchive_v1();
+
+ return new MohawkArchive();
}
bool MohawkEngine_LivingBooks::isPreMohawk() const {
@@ -1307,8 +1327,13 @@ void MohawkEngine_LivingBooks::handleNotify(NotifyEvent &event) {
if (getGameType() == GType_LIVINGBOOKSV1) {
debug(2, "kLBNotifyChangeMode: %d", event.param);
quitGame();
- } else {
- debug(2, "kLBNotifyChangeMode: mode %d, page %d.%d",
+ break;
+ }
+
+ debug(2, "kLBNotifyChangeMode: v2 type %d", event.param);
+ switch (event.param) {
+ case 1:
+ debug(2, "kLBNotifyChangeMode:, mode %d, page %d.%d",
event.newMode, event.newPage, event.newSubpage);
// TODO: what is entry.newUnknown?
if (!event.newMode)
@@ -1319,6 +1344,13 @@ void MohawkEngine_LivingBooks::handleNotify(NotifyEvent &event) {
error("kLBNotifyChangeMode failed to move to mode %d, page %d.%d",
event.newMode, event.newPage, event.newSubpage);
}
+ break;
+ case 3:
+ debug(2, "kLBNotifyChangeMode: new cursor '%s'", event.newCursor.c_str());
+ _cursor->setCursor(event.newCursor);
+ break;
+ default:
+ error("unknown v2 kLBNotifyChangeMode type %d", event.param);
}
break;
@@ -1873,6 +1905,7 @@ uint16 LBAnimation::getParentId() {
LBScriptEntry::LBScriptEntry() {
state = 0;
+ data = NULL;
argvParam = NULL;
argvTarget = NULL;
}
@@ -1880,6 +1913,7 @@ LBScriptEntry::LBScriptEntry() {
LBScriptEntry::~LBScriptEntry() {
delete[] argvParam;
delete[] argvTarget;
+ delete[] data;
for (uint i = 0; i < subentries.size(); i++)
delete subentries[i];
@@ -1943,7 +1977,10 @@ void LBItem::readFrom(Common::SeekableSubReadStreamEndian *stream) {
uint16 dataSize = stream->readUint16();
debug(4, "Data type %04x, size %d", dataType, dataSize);
- readData(dataType, dataSize, stream);
+ byte *buf = new byte[dataSize];
+ stream->read(buf, dataSize);
+ readData(dataType, dataSize, buf);
+ delete[] buf;
if ((uint)stream->pos() != oldPos + 4 + (uint)dataSize)
error("Failed to read correct number of bytes (off by %d) for data type %04x (size %d)",
@@ -1956,7 +1993,7 @@ void LBItem::readFrom(Common::SeekableSubReadStreamEndian *stream) {
}
}
-LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::SeekableSubReadStreamEndian *stream, bool isSubentry) {
+LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::MemoryReadStreamEndian *stream, bool isSubentry) {
if (size < 6)
error("Script entry of type 0x%04x was too small (%d)", type, size);
@@ -1999,30 +2036,40 @@ LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::Seeka
entry->argc = stream->readUint16();
size -= 2;
+ entry->targetingType = 0;
+
uint16 targetingType = entry->argc;
- if (targetingType == 0x3f3f || targetingType == 0xffff) {
- entry->argc = 0;
+ if (targetingType == kTargetTypeExpression || targetingType == kTargetTypeCode
+ || targetingType == kTargetTypeName) {
+ entry->targetingType = targetingType;
+
+ // FIXME
+ if (targetingType == kTargetTypeCode)
+ error("encountered kTargetTypeCode");
+ if (size < 2)
+ error("not enough bytes (%d) reading special targeting", size);
uint16 count = stream->readUint16();
size -= 2;
debug(4, "%d targets with targeting type %04x", count, targetingType);
- // FIXME: targeting by name
uint oldAlign = size % 2;
for (uint i = 0; i < count; i++) {
Common::String target = _vm->readString(stream);
- warning("ignoring target '%s' in script entry", target.c_str());
+ debug(4, "target '%s'", target.c_str());
+ entry->targets.push_back(target);
+ if (target.size() + 1 > size)
+ error("failed to read target (ran out of stream)");
size -= target.size() + 1;
}
+ entry->argc = entry->targets.size();
if ((uint)(size % 2) != oldAlign) {
stream->skip(1);
size--;
}
- }
-
- if (entry->argc) {
+ } else if (entry->argc) {
entry->argvParam = new uint16[entry->argc];
entry->argvTarget = new uint16[entry->argc];
debug(4, "With %d targets:", entry->argc);
@@ -2057,16 +2104,32 @@ LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::Seeka
}
if (type == kLBNotifyScript && entry->opcode == kLBNotifyChangeMode && _vm->getGameType() != GType_LIVINGBOOKSV1) {
- if (size < 8) {
- error("%d unknown bytes in notify entry kLBNotifyChangeMode", size);
+ switch (entry->param) {
+ case 1:
+ if (size < 8)
+ error("%d unknown bytes in notify entry kLBNotifyChangeMode", size);
+ entry->newUnknown = stream->readUint16();
+ entry->newMode = stream->readUint16();
+ entry->newPage = stream->readUint16();
+ entry->newSubpage = stream->readUint16();
+ debug(4, "kLBNotifyChangeMode: unknown %04x, mode %d, page %d.%d",
+ entry->newUnknown, entry->newMode, entry->newPage, entry->newSubpage);
+ size -= 8;
+ break;
+ case 3:
+ {
+ Common::String newCursor = _vm->readString(stream);
+ entry->newCursor = newCursor;
+ if (size < newCursor.size() + 1)
+ error("failed to read newCursor in notify entry");
+ size -= newCursor.size() + 1;
+ debug(4, "kLBNotifyChangeMode: new cursor '%s'", newCursor.c_str());
+ }
+ break;
+ default:
+ // the original engine also does something when param==2 (but not a notify)
+ error("unknown v2 kLBNotifyChangeMode type %d", entry->param);
}
- entry->newUnknown = stream->readUint16();
- entry->newMode = stream->readUint16();
- entry->newPage = stream->readUint16();
- entry->newSubpage = stream->readUint16();
- debug(4, "kLBNotifyChangeMode: unknown %04x, mode %d, page %d.%d",
- entry->newUnknown, entry->newMode, entry->newPage, entry->newSubpage);
- size -= 8;
}
if (entry->opcode == kLBOpSendExpression) {
if (size < 4)
@@ -2075,37 +2138,33 @@ LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::Seeka
debug(4, "kLBOpSendExpression: offset %08x", entry->offset);
size -= 4;
}
- if (entry->opcode == 0xffff) {
+ if (entry->opcode == kLBOpRunData) {
if (size < 4)
- error("didn't get enough bytes (%d) to read message in script entry", size);
- uint16 msgId = stream->readUint16();
- uint16 msgLen = stream->readUint16();
+ error("didn't get enough bytes (%d) to read data header in script entry", size);
+ entry->dataType = stream->readUint16();
+ entry->dataLen = stream->readUint16();
size -= 4;
- if (msgId == kLBSetPlayInfo) {
- if (size != 20)
- error("wah, more than just the kLBSetPlayInfo in here");
- // FIXME
- warning("ignoring kLBSetPlayInfo");
- size -= 20;
- stream->skip(20);
- return entry;
- }
- if (msgId != kLBCommand)
- error("expected a command in script entry, got 0x%04x", msgId);
+ if (size < entry->dataLen)
+ error("didn't get enough bytes (%d) to read data in script entry", size);
- if (msgLen != size - (entry->event == kLBEventNotified ? 4 : 0) && !conditionTag)
- error("script entry msgLen %d is not equal to size %d", msgLen, size);
-
- Common::String command = _vm->readString(stream);
- if (command.size() + 1 > size) {
- error("failed to read command in script entry: msgLen %d, command '%s' (%d chars)",
- msgLen, command.c_str(), command.size());
+ if (entry->dataType == kLBCommand) {
+ Common::String command = _vm->readString(stream);
+ uint commandSize = command.size() + 1;
+ if (commandSize > entry->dataLen)
+ error("failed to read command in script entry: dataLen %d, command '%s' (%d chars)",
+ entry->dataLen, command.c_str(), commandSize);
+ entry->dataLen = commandSize;
+ entry->data = new byte[commandSize];
+ memcpy(entry->data, command.c_str(), commandSize);
+ size -= commandSize;
+ } else {
+ if (conditionTag)
+ error("kLBOpRunData had unexpected conditionTag");
+ entry->data = new byte[entry->dataLen];
+ stream->read(entry->data, entry->dataLen);
+ size -= entry->dataLen;
}
- size -= command.size() + 1;
-
- entry->command = command;
- debug(4, "script entry command '%s'", command.c_str());
}
if (entry->event == kLBEventNotified) {
if (size < 4)
@@ -2126,6 +2185,8 @@ LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::Seeka
}
if (conditionTag == 1) {
+ if (!size)
+ error("failed to read condition (empty stream)");
Common::String condition = _vm->readString(stream);
if (condition.size() == 0) {
size--;
@@ -2140,6 +2201,8 @@ LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::Seeka
entry->conditions.push_back(condition);
debug(4, "script entry condition '%s'", condition.c_str());
} else if (conditionTag == 2) {
+ if (size < 4)
+ error("expected more than %d bytes for conditionTag 2", size);
// FIXME
stream->skip(4);
size -= 4;
@@ -2156,7 +2219,12 @@ LBScriptEntry *LBItem::parseScriptEntry(uint16 type, uint16 &size, Common::Seeka
return entry;
}
-void LBItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream) {
+void LBItem::readData(uint16 type, uint16 size, byte *data) {
+ Common::MemoryReadStreamEndian stream(data, size, _vm->isBigEndian());
+ readData(type, size, &stream);
+}
+
+void LBItem::readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream) {
switch (type) {
case kLBMsgListScript:
case kLBNotifyScript:
@@ -2274,8 +2342,6 @@ void LBItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEnd
{
assert(size == 4);
uint offset = stream->readUint32();
- if (!_page->_code)
- error("no BCOD?");
_page->_code->runCode(this, offset);
}
break;
@@ -2547,6 +2613,7 @@ void LBItem::runScript(uint event, uint16 data, uint16 from) {
notifyEvent.newMode = entry->newMode;
notifyEvent.newPage = entry->newPage;
notifyEvent.newSubpage = entry->newSubpage;
+ notifyEvent.newCursor = entry->newCursor;
_vm->addNotifyEvent(notifyEvent);
} else
_vm->addNotifyEvent(NotifyEvent(entry->opcode, entry->param));
@@ -2612,15 +2679,59 @@ int LBItem::runScriptEntry(LBScriptEntry *entry) {
entry->type, entry->event, entry->opcode, entry->param);
if (entry->argc) {
- uint16 targetId = entry->argvTarget[n];
- // TODO: is this type, perhaps?
- uint16 param = entry->argvParam[n];
- target = _vm->getItemById(targetId);
- if (!target) {
- debug(2, "Target %04x (%04x) doesn't exist, skipping", targetId, param);
- continue;
+ switch (entry->targetingType) {
+ case kTargetTypeExpression:
+ {
+ // FIXME: this should be EVALUATED
+ LBValue &tgt = _vm->_variables[entry->targets[n]];
+ switch (tgt.type) {
+ case kLBValueItemPtr:
+ target = tgt.item;
+ break;
+ case kLBValueString:
+ // FIXME: handle 'self', at least
+ // TODO: correct otherwise? or only self?
+ target = _vm->getItemByName(tgt.string);
+ break;
+ case kLBValueInteger:
+ target = _vm->getItemById(tgt.integer);
+ break;
+ default:
+ // FIXME: handle list
+ warning("Target '%s' (by expression) resulted in unknown type, skipping", entry->targets[n].c_str());
+ continue;
+ }
+ }
+ if (!target) {
+ debug(2, "Target '%s' (by expression) doesn't exist, skipping", entry->targets[n].c_str());
+ continue;
+ }
+ debug(2, "Target: '%s' (expression '%s')", target->_desc.c_str(), entry->targets[n].c_str());
+ break;
+ case kTargetTypeCode:
+ // FIXME
+ error("encountered kTargetTypeCode");
+ break;
+ case kTargetTypeName:
+ // FIXME: handle 'self'
+ target = _vm->getItemByName(entry->targets[n]);
+ if (!target) {
+ debug(2, "Target '%s' (by name) doesn't exist, skipping", entry->targets[n].c_str());
+ continue;
+ }
+ debug(2, "Target: '%s' (by name)", target->_desc.c_str());
+ break;
+ default:
+ uint16 targetId = entry->argvTarget[n];
+ // TODO: is this type, perhaps?
+ uint16 param = entry->argvParam[n];
+ target = _vm->getItemById(targetId);
+ if (!target) {
+ debug(2, "Target %04x (%04x) doesn't exist, skipping", targetId, param);
+ continue;
+ }
+ debug(2, "Target: %04x (%04x) '%s'", targetId, param, target->_desc.c_str());
}
- debug(2, "Target: %04x (%04x) '%s'", targetId, param, target->_desc.c_str());
} else {
target = this;
debug(2, "Self-target on '%s'", _desc.c_str());
@@ -2753,8 +2864,6 @@ int LBItem::runScriptEntry(LBScriptEntry *entry) {
break;
case kLBOpSendExpression:
- if (!_page->_code)
- error("no BCOD?");
_page->_code->runCode(this, entry->offset);
break;
@@ -2781,15 +2890,13 @@ int LBItem::runScriptEntry(LBScriptEntry *entry) {
}
break;
- case kLBOpRunCommand:
- runCommand(entry->command);
+ case kLBOpRunData:
+ readData(entry->dataType, entry->dataLen, entry->data);
break;
case kLBOpJumpUnlessExpression:
case kLBOpBreakExpression:
case kLBOpJumpToExpression:
- if (!_page->_code)
- error("no BCOD?");
{
LBValue r = _page->_code->runCode(this, entry->offset);
// FIXME
@@ -2814,257 +2921,24 @@ void LBItem::setNextTime(uint16 min, uint16 max, uint32 start) {
debug(9, "nextTime is now %d frames away", _nextTime - (uint)(_vm->_system->getMillis() / 16));
}
-enum LBTokenType {
- kLBNoToken,
- kLBNameToken,
- kLBStringToken,
- kLBOperatorToken,
- kLBIntegerToken,
- kLBEndToken
-};
-
-static Common::String readToken(const Common::String &source, uint &pos, LBTokenType &type) {
- Common::String token;
- type = kLBNoToken;
-
- bool done = false;
- while (pos < source.size() && !done) {
- if (type == kLBStringToken) {
- if (source[pos] == '"') {
- pos++;
- return token;
- }
-
- token += source[pos];
- pos++;
- continue;
- }
-
- switch (source[pos]) {
- case ' ':
- pos++;
- done = true;
- break;
-
- case ')':
- if (type == kLBNoToken) {
- type = kLBEndToken;
- return Common::String();
- }
- done = true;
- break;
-
- case ';':
- if (type == kLBNoToken) {
- pos++;
- type = kLBEndToken;
- return Common::String();
- }
- done = true;
- break;
-
- case '@':
- // FIXME
- error("found @ in string '%s', not supported yet", source.c_str());
-
- case '+':
- case '-':
- case '!':
- case '=':
- case '>':
- case '<':
- if (type == kLBNoToken)
- type = kLBOperatorToken;
- if (type == kLBOperatorToken)
- token += source[pos];
- else
- done = true;
- break;
-
- case '"':
- if (type == kLBNoToken)
- type = kLBStringToken;
- else
- done = true;
- break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (type == kLBNoToken)
- type = kLBIntegerToken;
- if (type == kLBNameToken || type == kLBIntegerToken)
- token += source[pos];
- else
- done = true;
- break;
-
- default:
- if (type == kLBNoToken)
- type = kLBNameToken;
- if (type == kLBNameToken)
- token += source[pos];
- else
- done = true;
- break;
- }
-
- if (!done)
- pos++;
- }
-
- if (type == kLBStringToken)
- error("readToken: ran out of input while parsing string from '%s'", source.c_str());
-
- if (!token.size()) {
- assert(type == kLBNoToken);
- type = kLBEndToken;
- }
-
- return token;
-}
-
-LBValue LBItem::parseValue(const Common::String &source, uint &pos) {
- LBTokenType type, postOpType;
- Common::String preOp, postOp;
-
- Common::String str = readToken(source, pos, type);
- if (type == kLBOperatorToken) {
- preOp = str;
- str = readToken(source, pos, type);
- }
-
- LBValue value;
- if (type == kLBStringToken) {
- value.type = kLBValueString;
- value.string = str;
- } else if (type == kLBIntegerToken) {
- value.type = kLBValueInteger;
- value.integer = atoi(str.c_str());
- } else if (type == kLBNameToken) {
- value = _vm->_variables[str];
- } else {
- error("expected string/integer as value in '%s', got '%s'", source.c_str(), str.c_str());
- }
-
- uint readAheadPos = pos;
- postOp = readToken(source, readAheadPos, postOpType);
- if (postOpType != kLBEndToken) {
- if (postOpType != kLBOperatorToken)
- error("expected operator after '%s' in '%s', got '%s'", str.c_str(), source.c_str(), postOp.c_str());
- // might be a comparison operator, caller will handle other cases if valid
- if (postOp == "-" || postOp == "+") {
- pos = readAheadPos;
- LBValue nextValue = parseValue(source, pos);
- if (value.type != kLBValueInteger || nextValue.type != kLBValueInteger)
- error("expected integer for arthmetic operator in '%s'", source.c_str());
- if (postOp == "+")
- value.integer += nextValue.integer;
- else if (postOp == "-")
- value.integer -= nextValue.integer;
- }
- }
-
- if (preOp.size()) {
- if (preOp == "!") {
- if (value.type == kLBValueInteger)
- value.integer = !value.integer;
- else
- error("expected integer after ! operator in '%s'", source.c_str());
- } else {
- error("expected valid operator before '%s' in '%s', got '%s'", str.c_str(), source.c_str(), preOp.c_str());
- }
- }
-
- return value;
-}
-
void LBItem::runCommand(const Common::String &command) {
- uint pos = 0;
- LBTokenType type;
+ LBCode tempCode(_vm, 0);
debug(2, "running command '%s'", command.c_str());
- while (pos < command.size()) {
- Common::String varname = readToken(command, pos, type);
- if (type != kLBNameToken)
- error("expected name as lvalue of command '%s', got '%s'", command.c_str(), varname.c_str());
- Common::String op = readToken(command, pos, type);
- if (type != kLBOperatorToken || (op != "=" && op != "++" && op != "--"))
- error("expected assignment/postincrement/postdecrement operator for command '%s', got '%s'", command.c_str(), op.c_str());
-
- if (op == "=") {
- LBValue value = parseValue(command, pos);
- _vm->_variables[varname] = value;
- } else {
- if (_vm->_variables[varname].type != kLBValueInteger)
- error("expected integer after postincrement/postdecrement operator in '%s'", command.c_str());
- if (op == "++")
- _vm->_variables[varname].integer++;
- else if (op == "--")
- _vm->_variables[varname].integer--;
- }
-
- if (pos < command.size() && command[pos] == ';')
- pos++;
- }
+ uint offset = tempCode.parseCode(command);
+ tempCode.runCode(this, offset);
}
bool LBItem::checkCondition(const Common::String &condition) {
- uint pos = 0;
- LBTokenType type;
+ LBCode tempCode(_vm, 0);
debug(3, "checking condition '%s'", condition.c_str());
- if (condition.size() <= pos || condition[pos] != '(')
- error("bad condition '%s' (started wrong)", condition.c_str());
- pos++;
-
- LBValue value1 = parseValue(condition, pos);
-
- Common::String op = readToken(condition, pos, type);
- if (type == kLBEndToken) {
- if (condition.size() != pos + 1 || condition[pos] != ')')
- error("bad condition '%s' (ended wrong)", condition.c_str());
-
- if (value1.type == kLBValueInteger)
- return value1.integer;
- else
- error("expected comparison operator for condition '%s'", condition.c_str());
- }
- if (type != kLBOperatorToken || (op != "!=" && op != "==" && op != ">" && op != "<" && op != ">=" && op != "<="))
- error("expected comparison operator for condition '%s', got '%s'", condition.c_str(), op.c_str());
-
- LBValue value2 = parseValue(condition, pos);
-
- if (condition.size() != pos + 1 || condition[pos] != ')')
- error("bad condition '%s' (ended wrong)", condition.c_str());
-
- if (op == "!=")
- return (value1 != value2);
- else if (op == "==")
- return (value1 == value2);
-
- if (value1.type != kLBValueInteger || value2.type != kLBValueInteger)
- error("evaluation operator %s in condition '%s' expected two integer operands!", op.c_str(), condition.c_str());
-
- if (op == ">")
- return (value1.integer > value2.integer);
- else if (op == ">=")
- return (value1.integer >= value2.integer);
- else if (op == "<")
- return (value1.integer < value2.integer);
- else if (op == "<=")
- return (value1.integer <= value2.integer);
+ uint offset = tempCode.parseCode(condition);
+ LBValue result = tempCode.runCode(this, offset);
- return false; // unreachable
+ return result.toInt();
}
LBSoundItem::LBSoundItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {
@@ -3118,7 +2992,7 @@ LBGroupItem::LBGroupItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rec
_starting = false;
}
-void LBGroupItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream) {
+void LBGroupItem::readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream) {
switch (type) {
case kLBGroupData:
{
@@ -3239,7 +3113,7 @@ LBPaletteItem::~LBPaletteItem() {
delete[] _palette;
}
-void LBPaletteItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream) {
+void LBPaletteItem::readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream) {
switch (type) {
case kLBPaletteXData:
{
@@ -3319,7 +3193,7 @@ LBLiveTextItem::LBLiveTextItem(MohawkEngine_LivingBooks *vm, LBPage *page, Commo
debug(3, "new LBLiveTextItem");
}
-void LBLiveTextItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream) {
+void LBLiveTextItem::readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream) {
switch (type) {
case kLBLiveTextData:
{
@@ -3564,7 +3438,7 @@ LBPictureItem::LBPictureItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common:
debug(3, "new LBPictureItem");
}
-void LBPictureItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream) {
+void LBPictureItem::readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream) {
switch (type) {
case kLBSetDrawMode:
{
@@ -3790,8 +3664,8 @@ void LBProxyItem::init() {
}
debug(1, "LBProxyItem loading archive '%s' with id %d", filename.c_str(), baseId);
- MohawkArchive *pageArchive = _vm->createMohawkArchive();
- if (!pageArchive->open(filename))
+ Archive *pageArchive = _vm->createArchive();
+ if (!pageArchive->openFile(filename))
error("failed to open archive '%s' (for proxy '%s')", filename.c_str(), _desc.c_str());
_page = new LBPage(_vm);
_page->open(pageArchive, baseId);
diff --git a/engines/mohawk/livingbooks.h b/engines/mohawk/livingbooks.h
index 56107ad97b..008a7dbf23 100644
--- a/engines/mohawk/livingbooks.h
+++ b/engines/mohawk/livingbooks.h
@@ -29,15 +29,17 @@
#include "mohawk/sound.h"
#include "common/config-file.h"
-#include "common/substream.h"
#include "common/rect.h"
#include "common/queue.h"
#include "common/random.h"
-#include "audio/mixer.h"
-
#include "livingbooks_code.h"
+namespace Common {
+ class SeekableSubReadStreamEndian;
+ class MemoryReadStreamEndian;
+}
+
namespace Mohawk {
#define LBKEY_MOD_CTRL 1
@@ -129,7 +131,9 @@ enum {
kLBEventMouseUp = 5,
kLBEventPhaseMain = 6,
kLBEventNotified = 7,
+ kLBEventDragStart = 8,
kLBEventDragMove = 9,
+ kLBEventDragEnd = 0xa,
kLBEventRolloverBegin = 0xb,
kLBEventRolloverMove = 0xc,
kLBEventRolloverEnd = 0xd,
@@ -218,7 +222,7 @@ enum {
kLBOpBreakExpression = 0xfffc,
kLBOpJumpToExpression = 0xfffd,
kLBOpRunSubentries = 0xfffe,
- kLBOpRunCommand = 0xffff
+ kLBOpRunData = 0xffff
};
enum {
@@ -233,6 +237,12 @@ enum {
kLBNotifyQuit = 0xd
};
+enum {
+ kTargetTypeExpression = 0x3f3f,
+ kTargetTypeCode = 0xfffe,
+ kTargetTypeName = 0xffff
+};
+
class MohawkEngine_LivingBooks;
class LBPage;
class LBGraphics;
@@ -253,11 +263,15 @@ struct LBScriptEntry {
uint16 *argvParam;
uint16 *argvTarget;
+ uint16 targetingType;
+ Common::Array<Common::String> targets;
+
// kLBNotifyChangeMode
uint16 newUnknown;
uint16 newMode;
uint16 newPage;
uint16 newSubpage;
+ Common::String newCursor;
// kLBEventNotified
uint16 matchFrom;
@@ -268,7 +282,10 @@ struct LBScriptEntry {
// kLBOpJumpUnlessExpression
uint16 target;
- Common::String command;
+ uint16 dataType;
+ uint16 dataLen;
+ byte *data;
+
Common::Array<Common::String> conditions;
Common::Array<LBScriptEntry *> subentries;
};
@@ -359,7 +376,8 @@ public:
virtual ~LBItem();
void readFrom(Common::SeekableSubReadStreamEndian *stream);
- virtual void readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream);
+ void readData(uint16 type, uint16 size, byte *data);
+ virtual void readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream);
virtual void destroySelf(); // 0x2
virtual void setEnabled(bool enabled); // 0x3
@@ -388,6 +406,8 @@ public:
uint16 getSoundPriority() { return _soundMode; }
bool isAmbient() { return _isAmbient; }
+ Common::List<LBItem *>::iterator _iterator;
+
protected:
MohawkEngine_LivingBooks *_vm;
LBPage *_page;
@@ -417,11 +437,10 @@ protected:
void runScript(uint event, uint16 data = 0, uint16 from = 0);
int runScriptEntry(LBScriptEntry *entry);
- LBValue parseValue(const Common::String &command, uint &pos);
void runCommand(const Common::String &command);
bool checkCondition(const Common::String &condition);
- LBScriptEntry *parseScriptEntry(uint16 type, uint16 &size, Common::SeekableSubReadStreamEndian *stream, bool isSubentry = false);
+ LBScriptEntry *parseScriptEntry(uint16 type, uint16 &size, Common::MemoryReadStreamEndian *stream, bool isSubentry = false);
};
class LBSoundItem : public LBItem {
@@ -446,7 +465,7 @@ class LBGroupItem : public LBItem {
public:
LBGroupItem(MohawkEngine_LivingBooks *_vm, LBPage *page, Common::Rect rect);
- void readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream);
+ void readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream);
void destroySelf();
void setEnabled(bool enabled);
@@ -471,7 +490,7 @@ public:
LBPaletteItem(MohawkEngine_LivingBooks *_vm, LBPage *page, Common::Rect rect);
~LBPaletteItem();
- void readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream);
+ void readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream);
bool togglePlaying(bool playing, bool restart);
void update();
@@ -497,7 +516,7 @@ class LBLiveTextItem : public LBItem {
public:
LBLiveTextItem(MohawkEngine_LivingBooks *_vm, LBPage *page, Common::Rect rect);
- void readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream);
+ void readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream);
bool contains(Common::Point point);
void update();
@@ -526,7 +545,7 @@ class LBPictureItem : public LBItem {
public:
LBPictureItem(MohawkEngine_LivingBooks *_vm, LBPage *page, Common::Rect rect);
- void readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEndian *stream);
+ void readData(uint16 type, uint16 size, Common::MemoryReadStreamEndian *stream);
bool contains(Common::Point point);
void draw();
@@ -592,6 +611,7 @@ struct NotifyEvent {
uint16 newMode;
uint16 newPage;
uint16 newSubpage;
+ Common::String newCursor;
};
enum DelayedEventType {
@@ -611,7 +631,7 @@ public:
LBPage(MohawkEngine_LivingBooks *vm);
~LBPage();
- void open(MohawkArchive *mhk, uint16 baseId);
+ void open(Archive *mhk, uint16 baseId);
uint16 getResourceVersion();
void itemDestroyed(LBItem *item);
@@ -621,7 +641,7 @@ public:
protected:
MohawkEngine_LivingBooks *_vm;
- MohawkArchive *_mhk;
+ Archive *_mhk;
Common::Array<LBItem *> _items;
uint16 _baseId;
@@ -646,12 +666,12 @@ public:
void addNotifyEvent(NotifyEvent event);
Common::SeekableSubReadStreamEndian *wrapStreamEndian(uint32 tag, uint16 id);
- Common::String readString(Common::SeekableSubReadStreamEndian *stream);
- Common::Rect readRect(Common::SeekableSubReadStreamEndian *stream);
+ Common::String readString(Common::ReadStream *stream);
+ Common::Rect readRect(Common::ReadStreamEndian *stream);
GUI::Debugger *getDebugger() { return _console; }
- void addArchive(MohawkArchive *archive);
- void removeArchive(MohawkArchive *Archive);
+ void addArchive(Archive *archive);
+ void removeArchive(Archive *archive);
void addItem(LBItem *item);
void removeItems(const Common::Array<LBItem *> &items);
@@ -672,6 +692,7 @@ public:
LBMode getCurMode() { return _curMode; }
bool tryLoadPageStart(LBMode mode, uint page);
+ bool loadPage(LBMode mode, uint page, uint subpage);
void prevPage();
void nextPage();
@@ -680,7 +701,7 @@ public:
// helper functions, also used by LBProxyItem
Common::String getFileNameFromConfig(const Common::String &section, const Common::String &key, Common::String &leftover);
- MohawkArchive *createMohawkArchive() const;
+ Archive *createArchive() const;
private:
LivingBooksConsole *_console;
@@ -697,10 +718,10 @@ private:
uint16 _phase;
LBPage *_page;
Common::Array<LBItem *> _items;
+ Common::List<LBItem *> _orderedItems;
Common::Queue<DelayedEvent> _eventQueue;
LBItem *_focus;
void destroyPage();
- bool loadPage(LBMode mode, uint page, uint subpage);
void updatePage();
uint16 _lastSoundOwner, _lastSoundId;
diff --git a/engines/mohawk/livingbooks_code.cpp b/engines/mohawk/livingbooks_code.cpp
index 165ca4a328..80b5fe9660 100644
--- a/engines/mohawk/livingbooks_code.cpp
+++ b/engines/mohawk/livingbooks_code.cpp
@@ -32,6 +32,10 @@ bool LBValue::operator==(const LBValue &x) const {
if (type != x.type) {
if (isNumeric() && x.isNumeric())
return toDouble() == x.toDouble();
+ else if (type == kLBValueString && x.type == kLBValueItemPtr)
+ return string == x.item->getName();
+ else if (type == kLBValueItemPtr && x.type == kLBValueString)
+ return item->getName() == x.string;
else
return false;
}
@@ -123,6 +127,12 @@ Common::Rect LBValue::toRect() const {
}
LBCode::LBCode(MohawkEngine_LivingBooks *vm, uint16 baseId) : _vm(vm) {
+ if (!baseId) {
+ _data = NULL;
+ _size = 0;
+ return;
+ }
+
Common::SeekableSubReadStreamEndian *bcodStream = _vm->wrapStreamEndian(ID_BCOD, baseId);
uint32 totalSize = bcodStream->readUint32();
@@ -168,12 +178,8 @@ LBValue LBCode::runCode(LBItem *src, uint32 offset) {
}
void LBCode::nextToken() {
- if (_currOffset + 1 >= _size) {
- // TODO
- warning("went off the end of code");
- _currToken = kTokenEndOfFile;
- _currValue = LBValue();
- return;
+ if (_currOffset >= _size) {
+ error("went off the end of code");
}
_currToken = _data[_currOffset++];
@@ -182,6 +188,8 @@ void LBCode::nextToken() {
switch (_currToken) {
case kTokenIdentifier:
{
+ if (_currOffset + 2 > _size)
+ error("went off the end of code reading identifier");
uint16 offset = READ_BE_UINT16(_data + _currOffset);
// TODO: check string exists
_currValue = _strings[offset];
@@ -191,9 +199,13 @@ void LBCode::nextToken() {
case kTokenLiteral:
{
+ if (_currOffset + 1 > _size)
+ error("went off the end of code reading literal");
byte literalType = _data[_currOffset++];
switch (literalType) {
case kLBCodeLiteralInteger:
+ if (_currOffset + 2 > _size)
+ error("went off the end of code reading literal integer");
_currValue = READ_BE_UINT16(_data + _currOffset);
_currOffset += 2;
break;
@@ -207,6 +219,8 @@ void LBCode::nextToken() {
case kTokenConstEventId:
case 0x5e: // TODO: ??
case kTokenKeycode:
+ if (_currOffset + 2 > _size)
+ error("went off the end of code reading immediate");
_currValue = READ_BE_UINT16(_data + _currOffset);
_currOffset += 2;
break;
@@ -223,6 +237,8 @@ void LBCode::nextToken() {
case kTokenString:
{
+ if (_currOffset + 2 > _size)
+ error("went off the end of code reading string");
uint16 offset = READ_BE_UINT16(_data + _currOffset);
// TODO: check string exists
_currValue = _strings[offset];
@@ -246,8 +262,10 @@ LBValue LBCode::runCode(byte terminator) {
parseStatement();
if (_stack.size())
result = _stack.pop();
- if (_currToken == terminator || _currToken == kTokenEndOfFile)
+ if (_currToken == terminator || _currToken == kTokenEndOfFile) {
+ debugN("\n");
break;
+ }
if (_currToken != kTokenEndOfStatement && _currToken != kTokenEndOfFile)
error("missing EOS (got %02x)", _currToken);
debugN("\n");
@@ -259,27 +277,27 @@ LBValue LBCode::runCode(byte terminator) {
void LBCode::parseStatement() {
parseComparisons();
- if (_currToken != kTokenAnd && _currToken != kTokenOr)
- return;
- byte op = _currToken;
- if (op == kTokenAnd)
- debugN(" && ");
- else
- debugN(" || ");
+ while (_currToken == kTokenAnd || _currToken == kTokenOr) {
+ byte op = _currToken;
+ if (op == kTokenAnd)
+ debugN(" && ");
+ else
+ debugN(" || ");
- nextToken();
- parseComparisons();
+ nextToken();
+ parseComparisons();
- LBValue val2 = _stack.pop();
- LBValue val1 = _stack.pop();
- bool result;
- if (op == kTokenAnd)
- result = !val1.isZero() && !val2.isZero();
- else
- result = !val1.isZero() || !val2.isZero();
+ LBValue val2 = _stack.pop();
+ LBValue val1 = _stack.pop();
+ bool result;
+ if (op == kTokenAnd)
+ result = !val1.isZero() && !val2.isZero();
+ else
+ result = !val1.isZero() || !val2.isZero();
- debugN(" [--> %s]", result ? "true" : "false");
- _stack.push(result);
+ debugN(" [--> %s]", result ? "true" : "false");
+ _stack.push(result);
+ }
}
void LBCode::parseComparisons() {
@@ -347,49 +365,95 @@ void LBCode::parseComparisons() {
void LBCode::parseConcat() {
parseArithmetic1();
- if (_currToken != kTokenConcat)
- return;
-
- debugN(" & ");
- nextToken();
- parseArithmetic1();
+ while (_currToken == kTokenConcat) {
+ debugN(" & ");
+ nextToken();
+ parseArithmetic1();
- LBValue val2 = _stack.pop();
- LBValue val1 = _stack.pop();
- Common::String result = val1.toString() + val2.toString();
- debugN(" [--> \"%s\"]", result.c_str());
- _stack.push(result);
+ LBValue val2 = _stack.pop();
+ LBValue val1 = _stack.pop();
+ Common::String result = val1.toString() + val2.toString();
+ debugN(" [--> \"%s\"]", result.c_str());
+ _stack.push(result);
+ }
}
void LBCode::parseArithmetic1() {
parseArithmetic2();
- if (_currToken != kTokenMinus && _currToken != kTokenPlus)
- return;
-
- byte op = _currToken;
- if (op == kTokenMinus)
- debugN(" - ");
- else if (op == kTokenPlus)
- debugN(" + ");
+ while (_currToken == kTokenMinus || _currToken == kTokenPlus) {
+ byte op = _currToken;
+ if (op == kTokenMinus)
+ debugN(" - ");
+ else if (op == kTokenPlus)
+ debugN(" + ");
- nextToken();
- parseArithmetic2();
-
- LBValue val2 = _stack.pop();
- LBValue val1 = _stack.pop();
- LBValue result;
- // TODO: cope with non-integers
- if (op == kTokenMinus)
- result = val1.toInt() - val2.toInt();
- else
- result = val1.toInt() + val2.toInt();
- _stack.push(result);
+ nextToken();
+ parseArithmetic2();
+
+ LBValue val2 = _stack.pop();
+ LBValue val1 = _stack.pop();
+ LBValue result;
+ // TODO: cope with non-integers
+ if (op == kTokenMinus)
+ result = val1.toInt() - val2.toInt();
+ else
+ result = val1.toInt() + val2.toInt();
+ debugN(" [--> %d]", result.toInt());
+ _stack.push(result);
+ }
}
void LBCode::parseArithmetic2() {
- // FIXME: other math operators
parseMain();
+
+ while (true) {
+ byte op = _currToken;
+ switch (op) {
+ case kTokenMultiply:
+ debugN(" * ");
+ break;
+ case kTokenDivide:
+ debugN(" / ");
+ break;
+ case kTokenIntDivide:
+ debugN(" div ");
+ break;
+ case kTokenModulo:
+ debugN(" %% ");
+ break;
+ default:
+ return;
+ }
+
+ nextToken();
+ parseMain();
+
+ LBValue val2 = _stack.pop();
+ LBValue val1 = _stack.pop();
+ LBValue result;
+ // TODO: cope with non-integers
+ if (op == kTokenMultiply) {
+ result = val1.toInt() * val2.toInt();
+ } else if (val2.toInt() == 0) {
+ result = 1;
+ } else {
+ switch (op) {
+ case kTokenDivide:
+ // TODO: fp divide
+ result = val1.toInt() / val2.toInt();
+ break;
+ case kTokenIntDivide:
+ result = val1.toInt() / val2.toInt();
+ break;
+ case kTokenModulo:
+ result = val1.toInt() % val2.toInt();
+ break;
+ }
+ }
+
+ _stack.push(result);
+ }
}
void LBCode::parseMain() {
@@ -437,6 +501,33 @@ void LBCode::parseMain() {
}
break;
+ case kTokenPlusPlus:
+ case kTokenMinusMinus:
+ {
+ byte token = _currToken;
+ if (token == kTokenPlusPlus)
+ debugN("++");
+ else
+ debugN("--");
+ nextToken();
+
+ if (_currToken != kTokenIdentifier)
+ error("expected identifier");
+ assert(_currValue.type == kLBValueString);
+ Common::String varname = _currValue.string;
+ debugN("%s", varname.c_str());
+ LBValue &val = _vm->_variables[varname];
+
+ // FIXME: pre/postincrement for non-integers
+ if (token == kTokenPlusPlus)
+ val.integer++;
+ else
+ val.integer--;
+ _stack.push(val);
+ nextToken();
+ }
+ break;
+
case kTokenLiteral:
case kTokenConstMode:
case kTokenConstEventId:
@@ -516,6 +607,16 @@ void LBCode::parseMain() {
}
}
+LBItem *LBCode::resolveItem(const LBValue &value) {
+ if (value.type == kLBValueItemPtr)
+ return value.item;
+ if (value.type == kLBValueString)
+ return _vm->getItemByName(value.string);
+ if (value.type == kLBValueInteger)
+ return _vm->getItemById(value.integer);
+ return NULL;
+}
+
Common::Array<LBValue> LBCode::readParams() {
Common::Array<LBValue> params;
@@ -583,10 +684,10 @@ struct CodeCommandInfo {
#define NUM_GENERAL_COMMANDS 129
CodeCommandInfo generalCommandInfo[NUM_GENERAL_COMMANDS] = {
- { "eval", 0 },
- { "random", 0 },
- { "stringLen", 0 },
- { "substring", 0 },
+ { "eval", &LBCode::cmdEval },
+ { "random", &LBCode::cmdRandom },
+ { "stringLen", &LBCode::cmdStringLen },
+ { "substring", &LBCode::cmdSubstring },
{ "max", 0 },
{ "min", 0 },
{ "abs", 0 },
@@ -740,6 +841,51 @@ void LBCode::cmdUnimplemented(const Common::Array<LBValue> &params) {
warning("unimplemented command called");
}
+void LBCode::cmdEval(const Common::Array<LBValue> &params) {
+ // FIXME: v4 eval is different?
+ if (params.size() != 1)
+ error("incorrect number of parameters (%d) to eval", params.size());
+
+ LBCode tempCode(_vm, 0);
+
+ uint offset = tempCode.parseCode(params[0].toString());
+ _stack.push(tempCode.runCode(_currSource, offset));
+}
+
+void LBCode::cmdRandom(const Common::Array<LBValue> &params) {
+ if (params.size() != 2)
+ error("incorrect number of parameters (%d) to random", params.size());
+
+ int min = params[0].toInt();
+ int max = params[1].toInt();
+ _stack.push(_vm->_rnd->getRandomNumberRng(min, max));
+}
+
+void LBCode::cmdStringLen(const Common::Array<LBValue> &params) {
+ if (params.size() != 1)
+ error("incorrect number of parameters (%d) to stringLen", params.size());
+
+ const Common::String &string = params[0].toString();
+ _stack.push(string.size());
+}
+
+void LBCode::cmdSubstring(const Common::Array<LBValue> &params) {
+ if (params.size() != 3)
+ error("incorrect number of parameters (%d) to substring", params.size());
+
+ const Common::String &string = params[0].toString();
+ uint begin = params[1].toInt();
+ uint end = params[2].toInt();
+ if (begin == 0)
+ error("invalid substring call (%d to %d)", begin, end);
+ if (begin > end || end > string.size()) {
+ _stack.push(Common::String());
+ return;
+ }
+ Common::String substring(string.c_str() + (begin - 1), end - begin + 1);
+ _stack.push(substring);
+}
+
void LBCode::cmdGetRect(const Common::Array<LBValue> &params) {
if (params.size() < 2) {
_stack.push(getRectFromParams(params));
@@ -882,7 +1028,7 @@ CodeCommandInfo itemCommandInfo[NUM_ITEM_COMMANDS] = {
{ "moveTo", &LBCode::itemMoveTo },
{ "mute", 0 },
{ "play", 0 },
- { "seek", 0 },
+ { "seek", &LBCode::itemSeek },
{ "seekToFrame", 0 },
{ "setParent", &LBCode::itemSetParent },
{ "setZOrder", 0 },
@@ -918,6 +1064,17 @@ void LBCode::itemMoveTo(const Common::Array<LBValue> &params) {
warning("ignoring moveTo");
}
+void LBCode::itemSeek(const Common::Array<LBValue> &params) {
+ if (params.size() != 2)
+ error("incorrect number of parameters (%d) to seek", params.size());
+
+ LBItem *item = resolveItem(params[0]);
+ if (!item)
+ error("attempted seek on invalid item (%s)", params[0].toString().c_str());
+ uint seekTo = params[1].toInt();
+ item->seek(seekTo);
+}
+
void LBCode::itemSetParent(const Common::Array<LBValue> &params) {
if (params.size() > 2)
error("incorrect number of parameters (%d) to setParent", params.size());
@@ -1002,4 +1159,278 @@ void LBCode::runNotifyCommand() {
}
}
+/*
+ * Helper function for parseCode/parseCodeSymbol:
+ * Returns an unused string id.
+ */
+uint LBCode::nextFreeString() {
+ for (uint i = 0; i <= 0xffff; i++) {
+ if (!_strings.contains(i))
+ return i;
+ }
+
+ error("nextFreeString couldn't find a space");
+}
+
+/*
+ * Helper function for parseCode:
+ * Given a name, appends the appropriate data to the provided code array and
+ * returns true if it's a function, or false otherwise.
+ */
+bool LBCode::parseCodeSymbol(const Common::String &name, uint &pos, Common::Array<byte> &code) {
+ // first, check whether the name matches a known function
+ for (uint i = 0; i < 2; i++) {
+ byte cmdToken;
+ CodeCommandInfo *cmdInfo = NULL;
+ uint cmdCount = 0;
+
+ switch (i) {
+ case 0:
+ cmdInfo = generalCommandInfo;
+ cmdToken = kTokenGeneralCommand;
+ cmdCount = NUM_GENERAL_COMMANDS;
+ break;
+ case 1:
+ cmdInfo = itemCommandInfo;
+ cmdToken = kTokenItemCommand;
+ cmdCount = NUM_ITEM_COMMANDS;
+ break;
+ }
+
+ for (uint n = 0; n < cmdCount; n++) {
+ const char *cmdName = cmdInfo[n].name;
+ if (!cmdName)
+ continue;
+ if (!name.equalsIgnoreCase(cmdName))
+ continue;
+
+ // found a matching function
+ code.push_back(cmdToken);
+ code.push_back(n + 1);
+ return true;
+ }
+ }
+
+ // not a function, so must be an identifier
+ code.push_back(kTokenIdentifier);
+
+ uint stringId = nextFreeString();
+ _strings[stringId] = name;
+
+ char tmp[2];
+ WRITE_BE_UINT16(tmp, (int16)stringId);
+ code.push_back(tmp[0]);
+ code.push_back(tmp[1]);
+
+ return false;
+}
+
+/*
+ * Parse a string for later execution, and return the offset where it was
+ * stored.
+ */
+uint LBCode::parseCode(const Common::String &source) {
+ struct LBCodeOperator {
+ byte token;
+ byte op;
+ byte lookahead1;
+ byte lookahead1Op;
+ byte lookahead2;
+ byte lookahead2Op;
+ };
+
+ #define NUM_LB_OPERATORS 11
+ static const LBCodeOperator operators[NUM_LB_OPERATORS] = {
+ { '+', kTokenPlus, '+', kTokenPlusPlus, '=', kTokenPlusEquals },
+ { '-', kTokenMinus, '-', kTokenMinusMinus, '=', kTokenMinusEquals },
+ { '/', kTokenDivide, '=', kTokenDivideEquals, 0, 0 },
+ { '*', kTokenMultiply, '=', kTokenMultiplyEquals, 0, 0 },
+ { '=', kTokenAssign, '=', kTokenEquals, 0, 0 },
+ { '>', kTokenGreaterThan, '=', kTokenGreaterThanEq, 0, 0 },
+ { '<', kTokenLessThan, '=', kTokenLessThanEq, 0, 0 },
+ { '!', kTokenNot, '=', kTokenNotEq, 0, 0 },
+ { '&', kTokenConcat, '&', kTokenAnd, '=', kTokenAndEquals },
+ { '|', 0, '|', kTokenOr, 0, 0 },
+ { ';', kTokenEndOfStatement, 0, 0, 0, 0 }
+ };
+
+ uint pos = 0;
+ Common::Array<byte> code;
+ Common::Array<uint> counterPositions;
+ bool wasFunction = false;
+
+ while (pos < source.size()) {
+ byte token = source[pos];
+ byte lookahead = 0;
+ if (pos + 1 < source.size())
+ lookahead = source[pos + 1];
+ pos++;
+
+ if (token != ' ' && token != '(' && wasFunction)
+ error("while parsing script '%s', encountered incomplete function call", source.c_str());
+
+ // First, we check for simple operators.
+ for (uint i = 0; i < NUM_LB_OPERATORS; i++) {
+ if (token != operators[i].token)
+ continue;
+ if (lookahead) {
+ if (lookahead == operators[i].lookahead1) {
+ code.push_back(operators[i].lookahead1Op);
+ token = 0;
+ } else if (lookahead == operators[i].lookahead2) {
+ code.push_back(operators[i].lookahead2Op);
+ token = 0;
+ }
+ if (!token) {
+ pos++;
+ break;
+ }
+ }
+ if (operators[i].op) {
+ code.push_back(operators[i].op);
+ token = 0;
+ }
+ break;
+ }
+ if (!token)
+ continue;
+
+ // Then, we check for more complex tokens.
+ switch (token) {
+ // whitespace
+ case ' ':
+ // ignore
+ break;
+ // literal string
+ case '"':
+ case '\'':
+ {
+ Common::String tempString;
+ while (pos < source.size()) {
+ if (source[pos] == token)
+ break;
+ tempString += source[pos++];
+ }
+ if (pos++ == source.size())
+ error("while parsing script '%s', string had no end", source.c_str());
+
+ code.push_back(kTokenString);
+
+ uint stringId = nextFreeString();
+ _strings[stringId] = tempString;
+
+ char tmp[2];
+ WRITE_BE_UINT16(tmp, (int16)stringId);
+ code.push_back(tmp[0]);
+ code.push_back(tmp[1]);
+ }
+ break;
+ // open bracket
+ case '(':
+ if (wasFunction) {
+ // function call parameters
+ wasFunction = false;
+ // we will need to back-patch the parameter count,
+ // if parameters are encountered
+ counterPositions.push_back(code.size());
+ code.push_back(1);
+ // if the next token is a ) then there are no
+ // parameters, otherwise start with 1 and increment
+ // if/when we encounter commas
+ for (uint i = pos; i < source.size(); i++) {
+ if (source[i] == ' ')
+ continue;
+ if (source[i] != ')')
+ break;
+ code[code.size() - 1] = 0;
+ break;
+ }
+ } else {
+ // brackets around expression
+ counterPositions.push_back(0);
+ }
+ code.push_back(kTokenOpenBracket);
+ break;
+ // close bracket
+ case ')':
+ if (counterPositions.empty())
+ error("while parsing script '%s', encountered unmatched )", source.c_str());
+ counterPositions.pop_back();
+ code.push_back(kTokenCloseBracket);
+ break;
+ // comma (seperating function params)
+ case ',':
+ {
+ if (counterPositions.empty())
+ error("while parsing script '%s', encountered unexpected ,", source.c_str());
+ code.push_back(kTokenComma);
+ uint counterPos = counterPositions.back();
+ if (!counterPos)
+ error("while parsing script '%s', encountered , outside parameter list", source.c_str());
+ code[counterPos]++;
+ }
+ break;
+ // old-style explicit function call
+ case '@':
+ {
+ Common::String tempString;
+ while (pos < source.size()) {
+ if (!isalpha(source[pos]) && !isdigit(source[pos]))
+ break;
+ tempString += source[pos++];
+ }
+ wasFunction = parseCodeSymbol(tempString, pos, code);
+ if (!wasFunction)
+ error("while parsing script '%s', encountered explicit function call to unknown function '%s'",
+ source.c_str(), tempString.c_str());
+ }
+ break;
+ default:
+ if (isdigit(token)) {
+ const char *in = source.c_str() + pos - 1;
+ // FIXME: handle floats?
+ char *endptr;
+ long int intValue = strtol(in, &endptr, 0);
+ assert(endptr > in);
+ pos += (endptr - in) - 1;
+
+ // FIXME: handle storing longs if needed
+ code.push_back(kTokenLiteral);
+ code.push_back(kLBCodeLiteralInteger);
+ char tmp[2];
+ WRITE_BE_UINT16(tmp, (int16)intValue);
+ code.push_back(tmp[0]);
+ code.push_back(tmp[1]);
+ } else if (isalpha(token)) {
+ Common::String tempString;
+ tempString += token;
+ while (pos < source.size()) {
+ if (!isalpha(source[pos]) && !isdigit(source[pos]))
+ break;
+ tempString += source[pos++];
+ }
+ wasFunction = parseCodeSymbol(tempString, pos, code);
+ } else {
+ error("while parsing script '%s', couldn't parse '%c'", source.c_str(), token);
+ }
+ }
+ }
+
+ if (wasFunction)
+ error("while parsing script '%s', encountered incomplete function call", source.c_str());
+ if (counterPositions.size())
+ error("while parsing script '%s', unmatched (", source.c_str());
+
+ code.push_back(kTokenEndOfFile);
+
+ uint codeOffset = _size;
+ byte *newData = new byte[_size + code.size()];
+ memcpy(newData, _data, _size);
+ memcpy(newData, &code[0], code.size());
+ delete[] _data;
+ _data = newData;
+ _size += code.size();
+ return codeOffset;
+}
+
} // End of namespace Mohawk
diff --git a/engines/mohawk/livingbooks_code.h b/engines/mohawk/livingbooks_code.h
index 9602e2d22d..79c9af94f7 100644
--- a/engines/mohawk/livingbooks_code.h
+++ b/engines/mohawk/livingbooks_code.h
@@ -181,6 +181,7 @@ public:
~LBCode();
LBValue runCode(LBItem *src, uint32 offset);
+ uint parseCode(const Common::String &source);
protected:
MohawkEngine_LivingBooks *_vm;
@@ -206,6 +207,7 @@ protected:
void parseArithmetic2();
void parseMain();
+ LBItem *resolveItem(const LBValue &value);
Common::Array<LBValue> readParams();
Common::Rect getRectFromParams(const Common::Array<LBValue> &params);
@@ -213,8 +215,15 @@ protected:
void runItemCommand();
void runNotifyCommand();
+ uint nextFreeString();
+ bool parseCodeSymbol(const Common::String &name, uint &pos, Common::Array<byte> &code);
+
public:
void cmdUnimplemented(const Common::Array<LBValue> &params);
+ void cmdEval(const Common::Array<LBValue> &params);
+ void cmdRandom(const Common::Array<LBValue> &params);
+ void cmdStringLen(const Common::Array<LBValue> &params);
+ void cmdSubstring(const Common::Array<LBValue> &params);
void cmdGetRect(const Common::Array<LBValue> &params);
void cmdTopLeft(const Common::Array<LBValue> &params);
void cmdBottomRight(const Common::Array<LBValue> &params);
@@ -228,9 +237,10 @@ public:
void cmdSetHitTest(const Common::Array<LBValue> &params);
void cmdKey(const Common::Array<LBValue> &params);
- void itemSetParent(const Common::Array<LBValue> &params);
- void itemMoveTo(const Common::Array<LBValue> &params);
void itemIsPlaying(const Common::Array<LBValue> &params);
+ void itemMoveTo(const Common::Array<LBValue> &params);
+ void itemSeek(const Common::Array<LBValue> &params);
+ void itemSetParent(const Common::Array<LBValue> &params);
};
} // End of namespace Mohawk
diff --git a/engines/mohawk/mohawk.cpp b/engines/mohawk/mohawk.cpp
index faf52595b7..cb419064c0 100644
--- a/engines/mohawk/mohawk.cpp
+++ b/engines/mohawk/mohawk.cpp
@@ -31,8 +31,6 @@
#include "mohawk/sound.h"
#include "mohawk/video.h"
-#include "audio/mixer.h"
-
namespace Mohawk {
MohawkEngine::MohawkEngine(OSystem *syst, const MohawkGameDescription *gamedesc) : Engine(syst), _gameDescription(gamedesc) {
diff --git a/engines/mohawk/mohawk.h b/engines/mohawk/mohawk.h
index f0618f7374..2f0e570d56 100644
--- a/engines/mohawk/mohawk.h
+++ b/engines/mohawk/mohawk.h
@@ -77,7 +77,7 @@ enum MohawkGameFeatures {
struct MohawkGameDescription;
class Sound;
class PauseDialog;
-class MohawkArchive;
+class Archive;
class CursorManager;
class MohawkEngine : public ::Engine {
@@ -123,7 +123,7 @@ private:
protected:
// An array holding the main Mohawk archives require by the games
- Common::Array<MohawkArchive *> _mhk;
+ Common::Array<Archive *> _mhk;
};
} // End of namespace Mohawk
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index b60f8bd1ee..eeb4594f3c 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -281,7 +281,7 @@ Common::Error MohawkEngine_Myst::run() {
// Load Help System (Masterpiece Edition Only)
if (getFeatures() & GF_ME) {
MohawkArchive *mhk = new MohawkArchive();
- if (!mhk->open("help.dat"))
+ if (!mhk->openFile("help.dat"))
error("Could not load help.dat");
_mhk.push_back(mhk);
}
@@ -343,6 +343,7 @@ Common::Error MohawkEngine_Myst::run() {
case Common::KEYCODE_F5:
_needsPageDrop = false;
_needsShowMap = false;
+ _needsShowDemoMenu = false;
runDialog(*_optionsDialog);
@@ -355,6 +356,11 @@ Common::Error MohawkEngine_Myst::run() {
_scriptParser->showMap();
_needsShowMap = false;
}
+
+ if (_needsShowDemoMenu) {
+ changeToStack(kDemoStack, 2002, 0, 0);
+ _needsShowDemoMenu = false;
+ }
break;
default:
break;
@@ -441,6 +447,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
_scriptParser = new MystStacks::Credits(this);
break;
case kDemoStack:
+ _gameState->_globals.currentAge = 0;
_scriptParser = new MystStacks::Demo(this);
break;
case kDniStack:
@@ -469,6 +476,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
_scriptParser = new MystStacks::Selenitic(this);
break;
case kDemoSlidesStack:
+ _gameState->_globals.currentAge = 1;
_scriptParser = new MystStacks::Slides(this);
break;
case kStoneshipStack:
@@ -488,7 +496,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
_mhk[0] = new MohawkArchive();
}
- if (!_mhk[0]->open(mystFiles[_curStack]))
+ if (!_mhk[0]->openFile(mystFiles[_curStack]))
error("Could not open %s", mystFiles[_curStack]);
if (getPlatform() == Common::kPlatformMacintosh)
@@ -645,7 +653,11 @@ void MohawkEngine_Myst::changeToCard(uint16 card, bool updateScreen) {
for (uint16 i = 0; i < _resources.size(); i++)
_resources[i]->handleCardChange();
- // TODO: Handle Script Resources
+ // The demo resets the cursor at each card change except when in the library
+ if (getFeatures() & GF_DEMO
+ && _gameState->_globals.currentAge != 2) {
+ _cursor->setDefaultCursor();
+ }
// Make sure the screen is updated
if (updateScreen) {
diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h
index ebcc3b445c..02f0a46e3f 100644
--- a/engines/mohawk/myst.h
+++ b/engines/mohawk/myst.h
@@ -167,6 +167,7 @@ public:
bool _needsUpdate;
bool _needsPageDrop;
bool _needsShowMap;
+ bool _needsShowDemoMenu;
MystView _view;
MystGraphics *_gfx;
diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp
index be5b7e1c76..ca8e985491 100644
--- a/engines/mohawk/myst_scripts.cpp
+++ b/engines/mohawk/myst_scripts.cpp
@@ -436,89 +436,77 @@ void MystScriptParser::o_changeCardDirectional(uint16 op, uint16 var, uint16 arg
// but with the current cardId stored.
// Opcode 18 then "pops" this stored CardId and returns to that card.
-// TODO: The purpose of the optional argv[1] on Opcode 17 and argv[0]
-// on Opcode 18 which are always 4, 5 or 6 is unknown.
-
void MystScriptParser::o_changeCardPush(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- if (argc == 2) {
- debugC(kDebugScript, "Opcode %d: Jump to Card Id, Storing Current Card Id", op);
-
- uint16 cardId = argv[0];
- debugC(kDebugScript, "\tJump to CardId: %d", cardId);
+ debugC(kDebugScript, "Opcode %d: Jump to Card Id, Storing Current Card Id", op);
- uint16 u0 = argv[1]; // TODO
- debugC(kDebugScript, "\tu0: %d", u0);
+ _savedCardId = _vm->getCurCard();
+ uint16 cardId = argv[0];
- _savedCardId = _vm->getCurCard();
+ // argv[1] is not used in the original engine
- debugC(kDebugScript, "\tCurrent CardId: %d", _savedCardId);
+ debugC(kDebugScript, "\tCurrent CardId: %d", _savedCardId);
+ debugC(kDebugScript, "\tJump to CardId: %d", cardId);
- _vm->changeToCard(cardId, true);
- } else
- unknown(op, var, argc, argv);
+ _vm->changeToCard(cardId, true);
}
void MystScriptParser::o_changeCardPop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- if (argc == 1) {
- debugC(kDebugScript, "Opcode %d: Return To Stored Card Id", op);
- debugC(kDebugScript, "\tCardId: %d", _savedCardId);
+ debugC(kDebugScript, "Opcode %d: Return To Stored Card Id", op);
+ debugC(kDebugScript, "\tCardId: %d", _savedCardId);
- uint16 u0 = argv[0];
- debugC(kDebugScript, "\tu0: %d", u0);
+ // argv[0] is not used in the original engine
- _vm->changeToCard(_savedCardId, true);
- } else
- unknown(op, var, argc, argv);
+ _vm->changeToCard(_savedCardId, true);
}
void MystScriptParser::o_enableAreas(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+ debugC(kDebugScript, "Opcode %d: Enable Hotspots", op);
- if (argc > 0) {
- debugC(kDebugScript, "Opcode %d: Enable Hotspots", op);
+ uint16 count = argv[0];
- uint16 count = argv[0];
+ if (argc == count + 1) {
+ for (uint16 i = 0; i < count; i++) {
+ debugC(kDebugScript, "Enable hotspot index %d", argv[i + 1]);
- if (argc != count + 1)
- unknown(op, var, argc, argv);
- else {
- for (uint16 i = 0; i < count; i++) {
- debugC(kDebugScript, "Enable hotspot index %d", argv[i + 1]);
- _vm->setResourceEnabled(argv[i + 1], true);
- }
+ MystResource *resource = 0;
+ if (argv[i + 1] == 0xFFFF)
+ resource = _invokingResource;
+ else
+ resource = _vm->_resources[argv[i + 1]];
+
+ if (resource)
+ resource->setEnabled(true);
+ else
+ warning("Unknown Resource in enableAreas script Opcode");
}
- } else
- unknown(op, var, argc, argv);
+ } else {
+ error("Invalid arguments for opcode %d", op);
+ }
}
void MystScriptParser::o_disableAreas(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- if (argc > 0) {
- debugC(kDebugScript, "Opcode %d: Disable Hotspots", op);
-
- uint16 count = argv[0];
-
- if (argc != count + 1)
- unknown(op, var, argc, argv);
- else {
- for (uint16 i = 0; i < count; i++) {
- debugC(kDebugScript, "Disable hotspot index %d", argv[i + 1]);
- if (argv[i + 1] == 0xFFFF) {
- if (_invokingResource != NULL)
- _invokingResource->setEnabled(false);
- else
- warning("Unknown Resource in disableHotspots script Opcode");
- } else
- _vm->setResourceEnabled(argv[i + 1], false);
- }
+ debugC(kDebugScript, "Opcode %d: Disable Hotspots", op);
+
+ uint16 count = argv[0];
+
+ if (argc == count + 1) {
+ for (uint16 i = 0; i < count; i++) {
+ debugC(kDebugScript, "Disable hotspot index %d", argv[i + 1]);
+
+ MystResource *resource = 0;
+ if (argv[i + 1] == 0xFFFF)
+ resource = _invokingResource;
+ else
+ resource = _vm->_resources[argv[i + 1]];
+
+ if (resource)
+ resource->setEnabled(false);
+ else
+ warning("Unknown Resource in disableAreas script Opcode");
}
- } else
- unknown(op, var, argc, argv);
+ } else {
+ error("Invalid arguments for opcode %d", op);
+ }
}
void MystScriptParser::o_directionalUpdate(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -528,43 +516,37 @@ void MystScriptParser::o_directionalUpdate(uint16 op, uint16 var, uint16 argc, u
}
void MystScriptParser::o_toggleAreasActivation(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- if (argc > 0) {
- debugC(kDebugScript, "Opcode %d: Toggle areas activation", op);
+ debugC(kDebugScript, "Opcode %d: Toggle areas activation", op);
- uint16 count = argv[0];
+ uint16 count = argv[0];
- if (argc != count + 1)
- unknown(op, var, argc, argv);
- else {
- for (uint16 i = 0; i < count; i++) {
- debugC(kDebugScript, "Enable/Disable hotspot index %d", argv[i + 1]);
+ if (argc == count + 1) {
+ for (uint16 i = 0; i < count; i++) {
+ debugC(kDebugScript, "Enable/Disable hotspot index %d", argv[i + 1]);
- MystResource *resource = 0;
- if (argv[i + 1] == 0xFFFF)
- resource = _invokingResource;
- else
- resource = _vm->_resources[argv[i + 1]];
+ MystResource *resource = 0;
+ if (argv[i + 1] == 0xFFFF)
+ resource = _invokingResource;
+ else
+ resource = _vm->_resources[argv[i + 1]];
- if (resource)
- resource->setEnabled(!resource->isEnabled());
- }
+ if (resource)
+ resource->setEnabled(!resource->isEnabled());
+ else
+ warning("Unknown Resource in toggleAreasActivation script Opcode");
}
- } else
- unknown(op, var, argc, argv);
+ } else {
+ error("Invalid arguments for opcode %d", op);
+ }
}
void MystScriptParser::o_playSound(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- if (argc == 1) {
- uint16 soundId = argv[0];
+ uint16 soundId = argv[0];
- debugC(kDebugScript, "Opcode %d: playSound", op);
- debugC(kDebugScript, "\tsoundId: %d", soundId);
+ debugC(kDebugScript, "Opcode %d: playSound", op);
+ debugC(kDebugScript, "\tsoundId: %d", soundId);
- _vm->_sound->replaceSoundMyst(soundId);
- } else
- unknown(op, var, argc, argv);
+ _vm->_sound->replaceSoundMyst(soundId);
}
void MystScriptParser::o_stopSoundBackground(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -578,6 +560,7 @@ void MystScriptParser::o_playSoundBlocking(uint16 op, uint16 var, uint16 argc, u
debugC(kDebugScript, "Opcode %d: playSoundBlocking", op);
debugC(kDebugScript, "\tsoundId: %d", soundId);
+ _vm->_sound->stopSound();
_vm->_sound->playSoundBlocking(soundId);
}
@@ -590,7 +573,6 @@ void MystScriptParser::o_copyBackBufferToScreen(uint16 op, uint16 var, uint16 ar
// Used in Mechanical Card 6267 (Code Lock)
rect = _invokingResource->getRect();
} else {
- // Used in ... TODO: Fill in.
rect = Common::Rect(argv[0], argv[1], argv[2], argv[3]);
}
@@ -645,8 +627,6 @@ void MystScriptParser::o_copyImageToBackBuffer(uint16 op, uint16 var, uint16 arg
// by Channelwood Card 3280 (Tank Valve) and water flow sound behavior in pipe
// on cards leading from shed...
void MystScriptParser::o_changeBackgroundSound(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
int16 *soundList = NULL;
uint16 *soundListVolume = NULL;
@@ -709,7 +689,7 @@ void MystScriptParser::o_changeBackgroundSound(uint16 op, uint16 var, uint16 arg
warning("Unknown sound control value in opcode %d", op);
}
} else
- unknown(op, var, argc, argv);
+ warning("Unknown arg count in opcode %d", op);
delete[] soundList;
soundList = NULL;
@@ -783,25 +763,19 @@ void MystScriptParser::o_changeCard(uint16 op, uint16 var, uint16 argc, uint16 *
}
void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- if (argc == 3) {
debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Delay then Change Card", op);
uint16 imageId = argv[0];
uint16 cardId = argv[1];
- uint16 delay = argv[2]; // TODO: Not sure about argv[2] being delay..
+ // argv[2] is not used in the original engine
debugC(kDebugScript, "\timageId: %d", imageId);
debugC(kDebugScript, "\tcardId: %d", cardId);
- debugC(kDebugScript, "\tdelay: %d", delay);
_vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));
_vm->_system->updateScreen();
- _vm->_system->delayMillis(delay * 100);
+
_vm->changeToCard(cardId, true);
- } else
- unknown(op, var, argc, argv);
}
void MystScriptParser::o_changeMainCursor(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -916,7 +890,8 @@ void MystScriptParser::o_soundWaitStop(uint16 op, uint16 var, uint16 argc, uint1
// Used when Button is pushed...
debugC(kDebugScript, "Opcode %d: Wait for foreground sound to finish", op);
- // TODO: Implement
+ while (_vm->_sound->isPlaying())
+ _vm->_system->delayMillis(10);
}
void MystScriptParser::o_quit(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp
index 0dd69a673a..9ca47cc92a 100644
--- a/engines/mohawk/myst_stacks/channelwood.cpp
+++ b/engines/mohawk/myst_stacks/channelwood.cpp
@@ -159,6 +159,16 @@ uint16 Channelwood::getVar(uint16 var) {
return ((_state.waterValveStates & 0xe2) == 0x80) ? 1 : 0;
case 30: // Door State
return _doorOpened;
+ case 31: // Water flowing in pipe fork ?
+ // 0 -> keep sound.
+ // 1 -> not flowing.
+ // 2 --> flowing.
+ if ((_state.waterValveStates & 0xe2) == 0x82) // From left.
+ return 2;
+ if ((_state.waterValveStates & 0xf4) == 0xa0) // From right.
+ return 1;
+
+ return 0;
case 32: // Sound - Water Flowing in Pipe to Book Room Elevator
return ((_state.waterValveStates & 0xf8) == 0xb0 && _state.pipeState) ? 1 : 0;
case 33: // Channelwood Lower Walkway to Upper Walkway Spiral Stair Upper Door State
diff --git a/engines/mohawk/myst_stacks/demo.cpp b/engines/mohawk/myst_stacks/demo.cpp
index 5788f4b3a3..fbad7dc384 100644
--- a/engines/mohawk/myst_stacks/demo.cpp
+++ b/engines/mohawk/myst_stacks/demo.cpp
@@ -20,16 +20,20 @@
*
*/
+#include "mohawk/cursors.h"
+#include "mohawk/graphics.h"
#include "mohawk/myst.h"
#include "mohawk/myst_stacks/demo.h"
-#include "gui/message.h"
+#include "common/system.h"
namespace Mohawk {
namespace MystStacks {
Demo::Demo(MohawkEngine_Myst *vm) : Intro(vm) {
setupOpcodes();
+
+ _returnToMenuStep = 0;
}
Demo::~Demo() {
@@ -47,15 +51,12 @@ Demo::~Demo() {
void Demo::setupOpcodes() {
// "Stack-Specific" Opcodes
- OVERRIDE_OPCODE(100, opcode_100);
- OPCODE(101, opcode_101);
- OPCODE(102, opcode_102);
+ OVERRIDE_OPCODE(100, o_stopIntro);
+ OPCODE(101, o_fadeFromBlack);
+ OPCODE(102, o_fadeToBlack);
// "Init" Opcodes
- OVERRIDE_OPCODE(201, opcode_201);
-
- // "Exit" Opcodes
- OVERRIDE_OPCODE(300, opcode_300);
+ OVERRIDE_OPCODE(201, o_returnToMenu_init);
}
#undef OPCODE
@@ -64,61 +65,69 @@ void Demo::setupOpcodes() {
void Demo::disablePersistentScripts() {
Intro::disablePersistentScripts();
- _enabled201 = false;
+ _returnToMenuRunning = false;
}
void Demo::runPersistentScripts() {
Intro::runPersistentScripts();
- if (_enabled201) {
- // Used on Card 2001, 2002 and 2003
-
- // TODO: Fill in Function...
+ if (_returnToMenuRunning) {
+ returnToMenu_run();
}
}
-void Demo::opcode_100(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- // TODO: Fill in Function...
+void Demo::o_stopIntro(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Unk", op);
+ // The original also seems to stop the movies. Not needed with this engine.
+ _vm->_gfx->fadeToBlack();
}
-void Demo::opcode_101(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void Demo::o_fadeFromBlack(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Fade from black", op);
- // Used on Card 2000, 2002 and 2003
- // Triggered by Click
- if (argc == 0) {
- // TODO: Fill in Logic.. Fade in?
- } else
- unknown(op, var, argc, argv);
+ // FIXME: This glitches when enabled. The backbuffer is drawn to screen,
+ // and then the fading occurs, causing the background to appear for one frame.
+ // _vm->_gfx->fadeFromBlack();
}
-void Demo::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used on Card 2002 and 2003
- // Triggered by Click
- if (argc == 0) {
- // TODO: Fill in Logic.. Fade out?
- } else
- unknown(op, var, argc, argv);
+void Demo::o_fadeToBlack(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Fade to black", op);
+ _vm->_gfx->fadeToBlack();
}
-void Demo::opcode_201(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used on Card 2001, 2002 and 2003
- if (argc == 0)
- _enabled201 = true;
- else
- unknown(op, var, argc, argv);
+void Demo::returnToMenu_run() {
+ uint32 time = _vm->_system->getMillis();
+
+ if (time < _returnToMenuNextTime)
+ return;
+
+ switch (_returnToMenuStep){
+ case 0:
+ _vm->_gfx->fadeToBlack();
+ _vm->changeToCard(2003, false);
+ _vm->_gfx->fadeFromBlack();
+
+ _returnToMenuStep++;
+ break;
+ case 1:
+ _vm->_gfx->fadeToBlack();
+ _vm->changeToCard(2001, false);
+ _vm->_gfx->fadeFromBlack();
+ _vm->_cursor->showCursor();
+
+ _returnToMenuStep++;
+ break;
+ default:
+ break;
+ }
}
+void Demo::o_returnToMenu_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Return to menu init", op);
-void Demo::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- // Used on Card 2000
- varUnusedCheck(op, var);
-
- // TODO: Fill in Function...
+ // Used on Card 2001, 2002 and 2003
+ _returnToMenuNextTime = _vm->_system->getMillis() + 5000;
+ _returnToMenuRunning = true;
}
} // End of namespace MystStacks
diff --git a/engines/mohawk/myst_stacks/demo.h b/engines/mohawk/myst_stacks/demo.h
index 4f8d68759b..c3e57cf7ae 100644
--- a/engines/mohawk/myst_stacks/demo.h
+++ b/engines/mohawk/myst_stacks/demo.h
@@ -46,15 +46,19 @@ public:
private:
void setupOpcodes();
- DECLARE_OPCODE(opcode_100);
- DECLARE_OPCODE(opcode_101);
- DECLARE_OPCODE(opcode_102);
+ DECLARE_OPCODE(o_stopIntro);
+ DECLARE_OPCODE(o_fadeFromBlack);
+ DECLARE_OPCODE(o_fadeToBlack);
- DECLARE_OPCODE(opcode_201);
+ DECLARE_OPCODE(o_returnToMenu_init);
DECLARE_OPCODE(opcode_300);
- bool _enabled201;
+ bool _returnToMenuRunning;
+ uint16 _returnToMenuStep; // 42
+ uint32 _returnToMenuNextTime; // 6
+
+ void returnToMenu_run();
};
} // End of namespace MystStacks
diff --git a/engines/mohawk/myst_stacks/dni.cpp b/engines/mohawk/myst_stacks/dni.cpp
index cf28945c71..2ced265f02 100644
--- a/engines/mohawk/myst_stacks/dni.cpp
+++ b/engines/mohawk/myst_stacks/dni.cpp
@@ -106,7 +106,7 @@ void Dni::o_handPage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
if (_globals.ending == 1 && _vm->_video->getElapsedTime(atrus) > (uint)Audio::Timestamp(0, 6801, 600).msecs()) {
_globals.ending = 2;
_globals.heldPage = 0;
- _vm->_cursor->setCursor(kDefaultMystCursor);
+ _vm->setMainCursor(kDefaultMystCursor);
// Play movie end (atrus leaving)
_vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 14813, 600), Audio::Timestamp(0xFFFFFFFF));
diff --git a/engines/mohawk/myst_stacks/mechanical.cpp b/engines/mohawk/myst_stacks/mechanical.cpp
index d6dd1b5407..12d9dc7e2f 100644
--- a/engines/mohawk/myst_stacks/mechanical.cpp
+++ b/engines/mohawk/myst_stacks/mechanical.cpp
@@ -102,6 +102,7 @@ void Mechanical::setupOpcodes() {
void Mechanical::disablePersistentScripts() {
_fortressSimulationRunning = false;
+ _elevatorRotationLeverMoving = false;
_elevatorGoingMiddle = false;
_birdSinging = false;
_fortressRotationRunning = false;
@@ -126,10 +127,10 @@ void Mechanical::runPersistentScripts() {
uint16 Mechanical::getVar(uint16 var) {
switch(var) {
- case 0: // Sirrus's Secret Panel State
- return _state.sirrusPanelState;
- case 1: // Achenar's Secret Panel State
+ case 0: // Achenar's Secret Panel State
return _state.achenarPanelState;
+ case 1: // Sirrus's Secret Panel State
+ return _state.sirrusPanelState;
case 2: // Achenar's Secret Room Crate Lid Open and Blue Page Present
if (_state.achenarCrateOpened) {
if (_globals.bluePagesInBook & 4 || _globals.heldPage == 3)
@@ -195,16 +196,21 @@ uint16 Mechanical::getVar(uint16 var) {
void Mechanical::toggleVar(uint16 var) {
switch(var) {
- case 0: // Sirrus's Secret Panel State
- _state.sirrusPanelState ^= 1;
- case 1: // Achenar's Secret Panel State
+ case 0: // Achenar's Secret Panel State
_state.achenarPanelState ^= 1;
+ break;
+ case 1: // Sirrus's Secret Panel State
+ _state.sirrusPanelState ^= 1;
+ break;
case 3: // Achenar's Secret Room Crate State
_state.achenarCrateOpened ^= 1;
+ break;
case 4: // Myst Book Room Staircase State
_mystStaircaseState ^= 1;
+ break;
case 10: // Fortress Staircase State
_state.staircaseState ^= 1;
+ break;
case 16: // Code Lock Shape #1 - Left
case 17: // Code Lock Shape #2
case 18: // Code Lock Shape #3
@@ -242,6 +248,7 @@ bool Mechanical::setVarValue(uint16 var, uint16 value) {
switch (var) {
case 13:
_elevatorPosition = value;
+ break;
case 14: // Elevator going down when at top
_elevatorGoingDown = value;
break;
@@ -724,6 +731,7 @@ void Mechanical::birdSing_run() {
uint32 time = _vm->_system->getMillis();
if (_birdSingEndTime < time) {
_bird->pauseMovie(true);
+ _vm->_sound->stopSound();
_birdSinging = false;
}
}
diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp
index 66492d1200..b67b333a85 100644
--- a/engines/mohawk/myst_stacks/myst.cpp
+++ b/engines/mohawk/myst_stacks/myst.cpp
@@ -1350,8 +1350,10 @@ void Myst::o_generatorButtonPressed(uint16 op, uint16 var, uint16 argc, uint16 *
if (_state.generatorVoltage)
_vm->_sound->replaceSoundMyst(8297);
- else
+ else {
_vm->_sound->replaceSoundMyst(9297);
+ _vm->_sound->stopBackgroundMyst();
+ }
} else {
if (_generatorVoltage)
_vm->_sound->replaceSoundMyst(6297);
diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h
index 9510d371d7..e9bff08cb4 100644
--- a/engines/mohawk/myst_stacks/myst.h
+++ b/engines/mohawk/myst_stacks/myst.h
@@ -40,8 +40,8 @@ public:
Myst(MohawkEngine_Myst *vm);
~Myst();
- void disablePersistentScripts();
- void runPersistentScripts();
+ virtual void disablePersistentScripts();
+ virtual void runPersistentScripts();
private:
void setupOpcodes();
diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp
index 37b749f100..31e22bb8c5 100644
--- a/engines/mohawk/myst_stacks/preview.cpp
+++ b/engines/mohawk/myst_stacks/preview.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "mohawk/cursors.h"
#include "mohawk/myst.h"
#include "mohawk/graphics.h"
#include "mohawk/myst_areas.h"
@@ -35,6 +36,7 @@ namespace MystStacks {
Preview::Preview(MohawkEngine_Myst *vm) : Myst(vm) {
setupOpcodes();
+ _vm->_cursor->hideCursor();
}
Preview::~Preview() {
@@ -52,86 +54,191 @@ Preview::~Preview() {
void Preview::setupOpcodes() {
// "Stack-Specific" Opcodes
- OVERRIDE_OPCODE(196, opcode_196);
- OVERRIDE_OPCODE(197, opcode_197);
- OVERRIDE_OPCODE(198, opcode_198);
- OVERRIDE_OPCODE(199, opcode_199);
+ OVERRIDE_OPCODE(196, o_fadeToBlack);
+ OVERRIDE_OPCODE(197, o_fadeFromBlack);
+ OVERRIDE_OPCODE(198, o_stayHere);
+ OVERRIDE_OPCODE(199, o_speechStop);
// "Init" Opcodes
- OPCODE(298, opcode_298);
- OPCODE(299, opcode_299);
+ OPCODE(298, o_speech_init);
+ OPCODE(299, o_library_init);
}
#undef OPCODE
#undef OVERRIDE_OPCODE
-void Preview::opcode_196(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void Preview::disablePersistentScripts() {
+ Myst::disablePersistentScripts();
+}
+
+void Preview::runPersistentScripts() {
+ Myst::runPersistentScripts();
+
+ if (_speechRunning)
+ speech_run();
+}
- // Used on Card ...
- // TODO: Finish Implementation...
- // Voice Over and Card Advance?
+void Preview::o_fadeToBlack(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Fade to black", op);
+ _vm->_gfx->fadeToBlack();
}
-void Preview::opcode_197(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void Preview::o_fadeFromBlack(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Fade from black", op);
- // Used on Card ...
- // TODO: Finish Implementation...
- // Voice Over and Card Advance?
+ // FIXME: This glitches when enabled. The backbuffer is drawn to screen,
+ // and then the fading occurs, causing the background to appear for one frame.
+ // _vm->_gfx->fadeFromBlack();
}
-// TODO: Merge with Opcode 42?
-void Preview::opcode_198(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void Preview::o_stayHere(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Stay here dialog", op);
- if (argc == 0) {
- // Nuh-uh! No leaving the library in the demo!
- GUI::MessageDialog dialog("You can't leave the library in the demo.");
- dialog.runModal();
- } else
- unknown(op, var, argc, argv);
+ // Nuh-uh! No leaving the library in the demo!
+ GUI::MessageDialog dialog("You can't leave the library in the demo.");
+ dialog.runModal();
}
-void Preview::opcode_199(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void Preview::o_speechStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Speech stop", op);
- // Used on Card ...
- // TODO: Finish Implementation...
- // Voice Over and Card Advance?
+ _vm->_sound->stopSound(3001);
+ _speechRunning = false;
+ _globals.currentAge = 2;
}
-void Preview::opcode_298(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void Preview::speechUpdateCue() {
+ // This is a callback in the original, handling audio events.
+ if (!_vm->_sound->isPlaying(3001)) {
+ return;
+ }
- // Used for Card 3000 (Closed Myst Book)
- // TODO: Fill in logic.
- // Start Voice Over... which controls book opening
- _vm->_sound->replaceSoundMyst(3001);
-
- // then link to Myst - Trigger of Hotspot? then opcode 199/196/197 for voice over continue?
- // TODO: Sync Voice and Actions to Original
- // TODO: Flash Library Red
- // TODO: Move to run process based delay to prevent
- // blocking...
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(20 * 1000);
-
- for (uint16 imageId = 3001; imageId <= 3012; imageId++) {
- _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));
- _vm->_system->updateScreen();
- _vm->_system->delayMillis(5 * 1000);
+ uint samples = _vm->_sound->getNumSamplesPlayed(3001);
+ for (int16 i = 0; i < _cueList.pointCount; i++) {
+ if (_cueList.points[i].sampleFrame > samples)
+ return;
+ if (i > _currentCue - 1) {
+ _currentCue++;
+ debugC(kDebugScript, "Sneak speech advanced to cue %d", _currentCue);
+ }
+ }
+}
+
+void Preview::speech_run() {
+ uint32 time = _vm->_system->getMillis();
+
+ // Update current speech sound cue
+ speechUpdateCue();
+
+ switch (_speechStep) {
+ case 0: // Start Voice Over... which controls book opening
+ _currentCue = 0;
+ _vm->_sound->playSound(3001, Audio::Mixer::kMaxChannelVolume, false, &_cueList);
+
+ _speechStep++;
+ break;
+ case 1: // Open book
+ if (_currentCue >= 1) {
+ _vm->changeToCard(3001, true);
+
+ _speechStep++;
+ }
+ break;
+ case 2: // Go to Myst
+ if (_currentCue >= 2) {
+ _vm->_gfx->fadeToBlack();
+ _vm->changeToCard(3002, false);
+ _vm->_gfx->fadeFromBlack();
+
+ _speechStep++;
+ }
+ break;
+ case 3: // Start blinking the library
+ if (_currentCue >= 3) {
+ _libraryState = 1;
+ _speechNextTime = 0;
+ _speechStep++;
+ }
+ break;
+ case 4: // Library blinking, zoom in library
+ if (_currentCue >= 4) {
+ _library->drawConditionalDataToScreen(0);
+
+ _vm->changeToCard(3003, true);
+
+ _speechNextTime = time + 2000;
+ _speechStep++;
+ } else {
+ if (time < _speechNextTime)
+ break;
+
+ _library->drawConditionalDataToScreen(_libraryState);
+ _libraryState = (_libraryState + 1) % 2;
+ _speechNextTime = time + 500;
+ }
+ break;
+ case 5: // Go to library near view
+ if (time < _speechNextTime)
+ break;
+
+ _vm->changeToCard(3004, true);
+ _speechNextTime = time + 2000;
+ _speechStep++;
+ break;
+ case 6: // Fade to courtyard
+ if (time < _speechNextTime)
+ break;
+
+ _vm->_gfx->fadeToBlack();
+ _vm->changeToCard(3005, false);
+ _vm->_gfx->fadeFromBlack();
+ _speechNextTime = time + 1000;
+ _speechStep++;
+ break;
+ case 7: // Walk to library
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ if (time < _speechNextTime)
+ break;
+
+ _vm->changeToCard(3006 + _speechStep - 7, true);
+ _speechNextTime = time + 2000;
+ _speechStep++;
+ break;
+ case 14: // Go to playable library card
+ if (time < _speechNextTime)
+ break;
+
+ _vm->changeToCard(4329, true);
+
+ _speechRunning = false;
+ _globals.currentAge = 2;
+
+ _vm->_cursor->showCursor();
+ break;
+ default:
+ warning("Unknown speech step");
+ break;
}
}
-void Preview::opcode_299(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void Preview::o_speech_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Speech init", op);
+
+ // Used for Card 3000 (Closed Myst Book)
+ _speechStep = 0;
+ _speechRunning = true;
+}
+
+void Preview::o_library_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Library init", op);
// Used for Card 3002 (Myst Island Overview)
- // TODO: Fill in logic.
- // Zoom into Island?
- // On this card is a Type 8 controlled by Var 0, which
- // can change the Myst Library to Red..
+ _library = static_cast<MystResourceType8 *>(_invokingResource);
}
} // End of namespace MystStacks
diff --git a/engines/mohawk/myst_stacks/preview.h b/engines/mohawk/myst_stacks/preview.h
index 7e4e418eef..1e4ff3efb4 100644
--- a/engines/mohawk/myst_stacks/preview.h
+++ b/engines/mohawk/myst_stacks/preview.h
@@ -40,16 +40,31 @@ public:
Preview(MohawkEngine_Myst *vm);
~Preview();
+ void disablePersistentScripts();
+ void runPersistentScripts();
+
private:
void setupOpcodes();
- DECLARE_OPCODE(opcode_196);
- DECLARE_OPCODE(opcode_197);
- DECLARE_OPCODE(opcode_198);
- DECLARE_OPCODE(opcode_199);
+ DECLARE_OPCODE(o_fadeToBlack);
+ DECLARE_OPCODE(o_fadeFromBlack);
+ DECLARE_OPCODE(o_stayHere);
+ DECLARE_OPCODE(o_speechStop);
+
+ DECLARE_OPCODE(o_speech_init);
+ DECLARE_OPCODE(o_library_init);
+
+ uint16 _libraryState; // 4
+ MystResourceType8 *_library; // 32
+
+ bool _speechRunning;
+ uint _speechStep;
+ CueList _cueList;
+ int16 _currentCue;
+ uint32 _speechNextTime; // 6
- DECLARE_OPCODE(opcode_298);
- DECLARE_OPCODE(opcode_299);
+ void speech_run();
+ void speechUpdateCue();
};
} // End of namespace MystStacks
diff --git a/engines/mohawk/myst_stacks/slides.cpp b/engines/mohawk/myst_stacks/slides.cpp
index 72b299ee6d..794793e49c 100644
--- a/engines/mohawk/myst_stacks/slides.cpp
+++ b/engines/mohawk/myst_stacks/slides.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "mohawk/cursors.h"
#include "mohawk/myst.h"
#include "mohawk/graphics.h"
#include "mohawk/myst_areas.h"
@@ -35,6 +36,7 @@ namespace MystStacks {
Slides::Slides(MohawkEngine_Myst *vm) : MystScriptParser(vm) {
setupOpcodes();
+ _vm->_cursor->hideCursor();
}
Slides::~Slides() {
@@ -59,23 +61,28 @@ void Slides::disablePersistentScripts() {
void Slides::runPersistentScripts() {
if (_cardSwapEnabled) {
// Used on Cards...
- if (_vm->_system->getMillis() - _lastCardTime >= 2 * 1000)
- _vm->changeToCard(_nextCardID, true);
+ if (_vm->_system->getMillis() > _nextCardTime) {
+ _vm->_gfx->fadeToBlack();
+ _vm->changeToCard(_nextCardID, false);
+ _vm->_gfx->fadeFromBlack();
+ }
}
}
void Slides::o_returnToMenu(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- _vm->changeToStack(kDemoStack, 2001, 0, 0);
+ debugC(kDebugScript, "Opcode %d: Return to menu", op);
+
+ // Go to the information screens of the menu
+ _vm->changeToStack(kDemoStack, 2002, 0, 0);
}
void Slides::o_setCardSwap(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- // Used on Cards...
- if (argc == 1) {
- _nextCardID = argv[0];
- _lastCardTime = _vm->_system->getMillis();
- _cardSwapEnabled = true;
- } else
- unknown(op, var, argc, argv);
+ _nextCardID = argv[0];
+
+ debugC(kDebugScript, "Opcode %d: Set next card %d", op, _nextCardID);
+
+ _nextCardTime = _vm->_system->getMillis() + 5000;
+ _cardSwapEnabled = true;
}
} // End of namespace MystStacks
diff --git a/engines/mohawk/myst_stacks/slides.h b/engines/mohawk/myst_stacks/slides.h
index 8bc61d0e24..9fb76728b6 100644
--- a/engines/mohawk/myst_stacks/slides.h
+++ b/engines/mohawk/myst_stacks/slides.h
@@ -52,7 +52,7 @@ private:
bool _cardSwapEnabled;
uint16 _nextCardID;
- uint32 _lastCardTime;
+ uint32 _nextCardTime;
};
} // End of namespace MystStacks
diff --git a/engines/mohawk/myst_state.cpp b/engines/mohawk/myst_state.cpp
index bab4b8dd51..3a8d233a26 100644
--- a/engines/mohawk/myst_state.cpp
+++ b/engines/mohawk/myst_state.cpp
@@ -320,6 +320,10 @@ void MystGameState::deleteSave(const Common::String &saveName) {
void MystGameState::addZipDest(uint16 stack, uint16 view) {
ZipDests *zipDests = 0;
+ // The demo has no zip dest storage
+ if (_vm->getFeatures() & GF_DEMO)
+ return;
+
// Select stack
switch (stack) {
case kChannelwoodStack:
@@ -362,6 +366,10 @@ bool MystGameState::isReachableZipDest(uint16 stack, uint16 view) {
if (!_globals.zipMode)
return false;
+ // The demo has no zip dest storage
+ if (_vm->getFeatures() & GF_DEMO)
+ return false;
+
// Select stack
ZipDests *zipDests;
switch (stack) {
diff --git a/engines/mohawk/resource.cpp b/engines/mohawk/resource.cpp
index 37fc73de67..f01375bacf 100644
--- a/engines/mohawk/resource.cpp
+++ b/engines/mohawk/resource.cpp
@@ -29,23 +29,25 @@
namespace Mohawk {
-MohawkArchive::MohawkArchive() {
- _mhk = NULL;
- _types = NULL;
- _fileTable = NULL;
+// Base Archive code
+
+Archive::Archive() {
+ _stream = 0;
+}
+
+Archive::~Archive() {
+ close();
}
-bool MohawkArchive::open(const Common::String &filename) {
+bool Archive::openFile(const Common::String &fileName) {
Common::File *file = new Common::File();
- if (!file->open(filename)) {
+ if (!file->open(fileName)) {
delete file;
return false;
}
- _curFile = filename;
-
- if (!open(file)) {
+ if (!openStream(file)) {
close();
return false;
}
@@ -53,431 +55,370 @@ bool MohawkArchive::open(const Common::String &filename) {
return true;
}
-void MohawkArchive::close() {
- delete _mhk; _mhk = NULL;
- delete[] _types; _types = NULL;
- delete[] _fileTable; _fileTable = NULL;
-
- _curFile.clear();
+void Archive::close() {
+ _types.clear();
+ delete _stream; _stream = 0;
}
-bool MohawkArchive::open(Common::SeekableReadStream *stream) {
- // Make sure no other file is open...
- close();
- _mhk = stream;
-
- if (_mhk->readUint32BE() != ID_MHWK) {
- warning("Could not find tag 'MHWK'");
+bool Archive::hasResource(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
return false;
- }
- /* uint32 fileSize = */ _mhk->readUint32BE();
+ return _types[tag].contains(id);
+}
- if (_mhk->readUint32BE() != ID_RSRC) {
- warning("Could not find tag \'RSRC\'");
+bool Archive::hasResource(uint32 tag, const Common::String &resName) const {
+ if (!_types.contains(tag) || resName.empty())
return false;
- }
-
- _rsrc.version = _mhk->readUint16BE();
- if (_rsrc.version != 0x100) {
- warning("Unsupported Mohawk resource version %d.%d", (_rsrc.version >> 8) & 0xff, _rsrc.version & 0xff);
- return false;
- }
+ const ResourceMap &resMap = _types[tag];
- _rsrc.compaction = _mhk->readUint16BE(); // Only used in creation, not in reading
- _rsrc.filesize = _mhk->readUint32BE();
- _rsrc.abs_offset = _mhk->readUint32BE();
- _rsrc.file_table_offset = _mhk->readUint16BE();
- _rsrc.file_table_size = _mhk->readUint16BE();
+ for (ResourceMap::const_iterator it = resMap.begin(); it != resMap.end(); it++)
+ if (it->_value.name.matchString(resName))
+ return true;
- debug (3, "Absolute Offset = %08x", _rsrc.abs_offset);
+ return false;
+}
- /////////////////////////////////
- //Resource Dir
- /////////////////////////////////
+Common::SeekableReadStream *Archive::getResource(uint32 tag, uint16 id) {
+ if (!_types.contains(tag))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
- // Type Table
- _mhk->seek(_rsrc.abs_offset);
- _typeTable.name_offset = _mhk->readUint16BE();
- _typeTable.resource_types = _mhk->readUint16BE();
+ const ResourceMap &resMap = _types[tag];
- debug (0, "Name List Offset = %04x Number of Resource Types = %04x", _typeTable.name_offset, _typeTable.resource_types);
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
- _types = new Type[_typeTable.resource_types];
+ const Resource &res = resMap[id];
- for (uint16 i = 0; i < _typeTable.resource_types; i++) {
- _types[i].tag = _mhk->readUint32BE();
- _types[i].resource_table_offset = _mhk->readUint16BE();
- _types[i].name_table_offset = _mhk->readUint16BE();
+ return new Common::SeekableSubReadStream(_stream, res.offset, res.offset + res.size);
+}
- // HACK: Zoombini's SND resource starts will a NULL.
- if (_types[i].tag == ID_SND)
- debug (3, "Type[%02d]: Tag = \'SND\' ResTable Offset = %04x NameTable Offset = %04x", i, _types[i].resource_table_offset, _types[i].name_table_offset);
- else
- debug (3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x NameTable Offset = %04x", i, tag2str(_types[i].tag), _types[i].resource_table_offset, _types[i].name_table_offset);
+uint32 Archive::getOffset(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
- // Resource Table
- _mhk->seek(_rsrc.abs_offset + _types[i].resource_table_offset);
- _types[i].resTable.resources = _mhk->readUint16BE();
+ const ResourceMap &resMap = _types[tag];
- debug (3, "Resources = %04x", _types[i].resTable.resources);
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
- _types[i].resTable.entries = new Type::ResourceTable::Entries[_types[i].resTable.resources];
+ return resMap[id].offset;
+}
- for (uint16 j = 0; j < _types[i].resTable.resources; j++) {
- _types[i].resTable.entries[j].id = _mhk->readUint16BE();
- _types[i].resTable.entries[j].index = _mhk->readUint16BE();
+uint16 Archive::findResourceID(uint32 tag, const Common::String &resName) const {
+ if (!_types.contains(tag) || resName.empty())
+ return 0xFFFF;
- debug (4, "Entry[%02x]: ID = %04x (%d) Index = %04x", j, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].index);
- }
+ const ResourceMap &resMap = _types[tag];
- // Name Table
- _mhk->seek(_rsrc.abs_offset + _types[i].name_table_offset);
- _types[i].nameTable.num = _mhk->readUint16BE();
+ for (ResourceMap::const_iterator it = resMap.begin(); it != resMap.end(); it++)
+ if (it->_value.name.matchString(resName))
+ return it->_key;
- debug (3, "Names = %04x", _types[i].nameTable.num);
+ return 0xFFFF;
+}
- _types[i].nameTable.entries = new Type::NameTable::Entries[_types[i].nameTable.num];
+Common::String Archive::getName(uint32 tag, uint16 id) const {
+ if (!_types.contains(tag))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
- for (uint16 j = 0; j < _types[i].nameTable.num; j++) {
- _types[i].nameTable.entries[j].offset = _mhk->readUint16BE();
- _types[i].nameTable.entries[j].index = _mhk->readUint16BE();
+ const ResourceMap &resMap = _types[tag];
- debug (4, "Entry[%02x]: Name List Offset = %04x Index = %04x", j, _types[i].nameTable.entries[j].offset, _types[i].nameTable.entries[j].index);
+ if (!resMap.contains(id))
+ error("Archive does not contain '%s' %04x", tag2str(tag), id);
- // Name List
- uint32 pos = _mhk->pos();
- _mhk->seek(_rsrc.abs_offset + _typeTable.name_offset + _types[i].nameTable.entries[j].offset);
- char c = (char)_mhk->readByte();
- while (c != 0) {
- _types[i].nameTable.entries[j].name += c;
- c = (char)_mhk->readByte();
- }
+ return resMap[id].name;
+}
- debug (3, "Name = \'%s\'", _types[i].nameTable.entries[j].name.c_str());
+Common::Array<uint32> Archive::getResourceTypeList() const {
+ Common::Array<uint32> typeList;
- // Get back to next entry
- _mhk->seek(pos);
- }
+ for (TypeMap::const_iterator it = _types.begin(); it != _types.end(); it++)
+ typeList.push_back(it->_key);
- // Return to next TypeTable entry
- _mhk->seek(_rsrc.abs_offset + (i + 1) * 8 + 4);
+ return typeList;
+}
- debug (3, "\n");
- }
+Common::Array<uint16> Archive::getResourceIDList(uint32 type) const {
+ Common::Array<uint16> idList;
- _mhk->seek(_rsrc.abs_offset + _rsrc.file_table_offset);
- _fileTableAmount = _mhk->readUint32BE();
- _fileTable = new FileTable[_fileTableAmount];
+ if (!_types.contains(type))
+ return idList;
- for (uint32 i = 0; i < _fileTableAmount; i++) {
- _fileTable[i].offset = _mhk->readUint32BE();
- _fileTable[i].dataSize = _mhk->readUint16BE();
- _fileTable[i].dataSize += _mhk->readByte() << 16; // Get bits 15-24 of dataSize too
- _fileTable[i].flags = _mhk->readByte();
- _fileTable[i].unk = _mhk->readUint16BE();
+ const ResourceMap &resMap = _types[type];
- // Add in another 3 bits for file size from the flags.
- // The flags are useless to us except for doing this ;)
- _fileTable[i].dataSize += (_fileTable[i].flags & 7) << 24;
+ for (ResourceMap::const_iterator it = resMap.begin(); it != resMap.end(); it++)
+ idList.push_back(it->_key);
- debug (4, "File[%02x]: Offset = %08x DataSize = %07x Flags = %02x Unk = %04x", i, _fileTable[i].offset, _fileTable[i].dataSize, _fileTable[i].flags, _fileTable[i].unk);
- }
-
- return true;
+ return idList;
}
-int MohawkArchive::getTypeIndex(uint32 tag) {
- for (uint16 i = 0; i < _typeTable.resource_types; i++)
- if (_types[i].tag == tag)
- return i;
- return -1; // not found
-}
+// Mohawk Archive code
-int MohawkArchive::getIDIndex(int typeIndex, uint16 id) {
- for (uint16 i = 0; i < _types[typeIndex].resTable.resources; i++)
- if (_types[typeIndex].resTable.entries[i].id == id)
- return i;
- return -1; // not found
-}
-
-int MohawkArchive::getIDIndex(int typeIndex, const Common::String &resName) {
- int index = -1;
+struct FileTableEntry {
+ uint32 offset;
+ uint32 size;
+ byte flags;
+ uint16 unknown;
+};
- for (uint16 i = 0; i < _types[typeIndex].nameTable.num; i++)
- if (_types[typeIndex].nameTable.entries[i].name.matchString(resName)) {
- index = _types[typeIndex].nameTable.entries[i].index;
- break;
- }
+struct NameTableEntry {
+ uint16 index;
+ Common::String name;
+};
- if (index < 0)
- return -1; // Not found
-
- for (uint16 i = 0; i < _types[typeIndex].resTable.resources; i++)
- if (_types[typeIndex].resTable.entries[i].index == index)
- return i;
-
- return -1; // Not found
-}
+bool MohawkArchive::openStream(Common::SeekableReadStream *stream) {
+ // Make sure no other file is open...
+ close();
-uint16 MohawkArchive::findResourceID(uint32 type, const Common::String &resName) {
- int typeIndex = getTypeIndex(type);
+ if (stream->readUint32BE() != ID_MHWK) {
+ warning("Could not find tag 'MHWK'");
+ return false;
+ }
- if (typeIndex < 0)
- return 0xFFFF;
+ /* uint32 fileSize = */ stream->readUint32BE();
- int idIndex = getIDIndex(typeIndex, resName);
+ if (stream->readUint32BE() != ID_RSRC) {
+ warning("Could not find tag \'RSRC\'");
+ return false;
+ }
- if (idIndex < 0)
- return 0xFFFF;
+ uint16 version = stream->readUint16BE();
- return _types[typeIndex].resTable.entries[idIndex].id;
-}
-
-bool MohawkArchive::hasResource(uint32 tag, uint16 id) {
- if (!_mhk)
+ if (version != 0x100) {
+ warning("Unsupported Mohawk resource version %d.%d", (version >> 8) & 0xff, version & 0xff);
return false;
+ }
- int16 typeIndex = getTypeIndex(tag);
+ /* uint16 compaction = */ stream->readUint16BE(); // Only used in creation, not in reading
+ /* uint32 rsrcSize = */ stream->readUint32BE();
+ uint32 absOffset = stream->readUint32BE();
+ uint16 fileTableOffset = stream->readUint16BE();
+ /* uint16 fileTableSize = */ stream->readUint16BE();
- if (typeIndex < 0)
- return false;
+ // First, read in the file table
+ stream->seek(absOffset + fileTableOffset);
+ Common::Array<FileTableEntry> fileTable;
+ fileTable.resize(stream->readUint32BE());
- return getIDIndex(typeIndex, id) >= 0;
-}
+ debug(4, "Reading file table with %d entries", fileTable.size());
-bool MohawkArchive::hasResource(uint32 tag, const Common::String &resName) {
- if (!_mhk)
- return false;
+ for (uint32 i = 0; i < fileTable.size(); i++) {
+ fileTable[i].offset = stream->readUint32BE();
+ fileTable[i].size = stream->readUint16BE();
+ fileTable[i].size += stream->readByte() << 16; // Get bits 15-24 of size too
+ fileTable[i].flags = stream->readByte();
+ fileTable[i].unknown = stream->readUint16BE();
- int16 typeIndex = getTypeIndex(tag);
+ // Add in another 3 bits for file size from the flags.
+ // The flags are useless to us except for doing this ;)
+ fileTable[i].size += (fileTable[i].flags & 7) << 24;
- if (typeIndex < 0)
- return false;
+ debug(4, "File[%02x]: Offset = %08x Size = %07x Flags = %02x Unknown = %04x", i, fileTable[i].offset, fileTable[i].size, fileTable[i].flags, fileTable[i].unknown);
+ }
- return getIDIndex(typeIndex, resName) >= 0;
-}
+ // Now go in an read in each of the types
+ stream->seek(absOffset);
+ uint16 stringTableOffset = stream->readUint16BE();
+ uint16 typeCount = stream->readUint16BE();
-Common::String MohawkArchive::getName(uint32 tag, uint16 id) {
- if (!_mhk)
- return 0;
+ debug(0, "Name List Offset = %04x Number of Resource Types = %04x", stringTableOffset, typeCount);
- int16 typeIndex = getTypeIndex(tag);
+ for (uint16 i = 0; i < typeCount; i++) {
+ uint32 tag = stream->readUint32BE();
+ uint16 resourceTableOffset = stream->readUint16BE();
+ uint16 nameTableOffset = stream->readUint16BE();
- if (typeIndex < 0)
- return 0;
+ // HACK: Zoombini's SND resource starts will a NULL.
+ if (tag == ID_SND)
+ debug(3, "Type[%02d]: Tag = \'SND\' ResTable Offset = %04x NameTable Offset = %04x", i, resourceTableOffset, nameTableOffset);
+ else
+ debug(3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x NameTable Offset = %04x", i, tag2str(tag), resourceTableOffset, nameTableOffset);
- int16 idIndex = -1;
+ // Name Table
+ stream->seek(absOffset + nameTableOffset);
+ Common::Array<NameTableEntry> nameTable;
+ nameTable.resize(stream->readUint16BE());
- for (uint16 i = 0; i < _types[typeIndex].resTable.resources; i++)
- if (_types[typeIndex].resTable.entries[i].id == id) {
- idIndex = _types[typeIndex].resTable.entries[i].index;
- break;
- }
+ debug(3, "Names = %04x", nameTable.size());
- assert(idIndex >= 0);
+ for (uint16 j = 0; j < nameTable.size(); j++) {
+ uint16 offset = stream->readUint16BE();
+ nameTable[j].index = stream->readUint16BE();
- for (uint16 i = 0; i < _types[typeIndex].nameTable.num; i++)
- if (_types[typeIndex].nameTable.entries[i].index == idIndex)
- return _types[typeIndex].nameTable.entries[i].name;
+ debug(4, "Entry[%02x]: Name List Offset = %04x Index = %04x", j, offset, nameTable[j].index);
- return 0; // not found
-}
+ // Name List
+ uint32 pos = stream->pos();
+ stream->seek(absOffset + stringTableOffset + offset);
+ char c = (char)stream->readByte();
+ while (c != 0) {
+ nameTable[j].name += c;
+ c = (char)stream->readByte();
+ }
-uint32 MohawkArchive::getOffset(uint32 tag, uint16 id) {
- assert(_mhk);
+ debug(3, "Name = \'%s\'", nameTable[j].name.c_str());
- int16 typeIndex = getTypeIndex(tag);
- assert(typeIndex >= 0);
+ // Get back to next entry
+ stream->seek(pos);
+ }
- int16 idIndex = getIDIndex(typeIndex, id);
- assert(idIndex >= 0);
+ // Resource Table
+ stream->seek(absOffset + resourceTableOffset);
+ uint16 resourceCount = stream->readUint16BE();
- return _fileTable[_types[typeIndex].resTable.entries[idIndex].index - 1].offset;
-}
+ debug(3, "Resource count = %04x", resourceCount);
-Common::SeekableReadStream *MohawkArchive::getResource(uint32 tag, uint16 id) {
- if (!_mhk)
- error("MohawkArchive::getResource(): No File in Use");
+ ResourceMap &resMap = _types[tag];
- int16 typeIndex = getTypeIndex(tag);
+ for (uint16 j = 0; j < resourceCount; j++) {
+ uint16 id = stream->readUint16BE();
+ uint16 index = stream->readUint16BE();
- if (typeIndex < 0)
- error("Could not find a tag of '%s' in file '%s'", tag2str(tag), _curFile.c_str());
+ Resource &res = resMap[id];
- int16 idIndex = getIDIndex(typeIndex, id);
+ // Pull out the name from the name table
+ for (uint32 k = 0; k < nameTable.size(); k++) {
+ if (nameTable[k].index == index) {
+ res.name = nameTable[k].name;
+ break;
+ }
+ }
- if (idIndex < 0)
- error("Could not find '%s' %04x in file '%s'", tag2str(tag), id, _curFile.c_str());
+ // Pull out our offset/size too
+ res.offset = fileTable[index - 1].offset;
+
+ // WORKAROUND: tMOV resources pretty much ignore the size part of the file table,
+ // as the original just passed the full Mohawk file to QuickTime and the offset.
+ // We need to do this because of the way Mohawk is set up (this is much more "proper"
+ // than passing _stream at the right offset). We may want to do that in the future, though.
+ if (tag == ID_TMOV) {
+ if (index == fileTable.size())
+ res.size = stream->size() - fileTable[index - 1].offset;
+ else
+ res.size = fileTable[index].offset - fileTable[index - 1].offset;
+ } else
+ res.size = fileTable[index - 1].size;
+
+ debug(4, "Entry[%02x]: ID = %04x (%d) Index = %04x", j, id, id, index);
+ }
- // Note: the fileTableIndex is based off 1, not 0. So, subtract 1
- uint16 fileTableIndex = _types[typeIndex].resTable.entries[idIndex].index - 1;
+ // Return to next TypeTable entry
+ stream->seek(absOffset + (i + 1) * 8 + 4);
- // WORKAROUND: tMOV resources pretty much ignore the size part of the file table,
- // as the original just passed the full Mohawk file to QuickTime and the offset.
- // We need to do this because of the way Mohawk is set up (this is much more "proper"
- // than passing _mhk at the right offset). We may want to do that in the future, though.
- if (_types[typeIndex].tag == ID_TMOV) {
- if (fileTableIndex == _fileTableAmount - 1)
- return new Common::SeekableSubReadStream(_mhk, _fileTable[fileTableIndex].offset, _mhk->size());
- else
- return new Common::SeekableSubReadStream(_mhk, _fileTable[fileTableIndex].offset, _fileTable[fileTableIndex + 1].offset);
+ debug(3, "\n");
}
- return new Common::SeekableSubReadStream(_mhk, _fileTable[fileTableIndex].offset, _fileTable[fileTableIndex].offset + _fileTable[fileTableIndex].dataSize);
+ _stream = stream;
+ return true;
}
-bool LivingBooksArchive_v1::open(Common::SeekableReadStream *stream) {
+// Living Books Archive code
+
+bool LivingBooksArchive_v1::openStream(Common::SeekableReadStream *stream) {
close();
- _mhk = stream;
// This is for the "old" Mohawk resource format used in some older
// Living Books. It is very similar, just missing the MHWK tag and
// some other minor differences, especially with the file table
// being merged into the resource table.
- uint32 headerSize = _mhk->readUint32BE();
+ uint32 headerSize = stream->readUint32BE();
// NOTE: There are differences besides endianness! (Subtle changes,
// but different).
if (headerSize == 6) { // We're in Big Endian mode (Macintosh)
- _mhk->readUint16BE(); // Resource Table Size
- _typeTable.resource_types = _mhk->readUint16BE();
- _types = new OldType[_typeTable.resource_types];
+ stream->readUint16BE(); // Resource Table Size
+ uint16 typeCount = stream->readUint16BE();
- debug (0, "Old Mohawk File (Macintosh): Number of Resource Types = %04x", _typeTable.resource_types);
+ debug(0, "Old Mohawk File (Macintosh): Number of Resource Types = %04x", typeCount);
- for (uint16 i = 0; i < _typeTable.resource_types; i++) {
- _types[i].tag = _mhk->readUint32BE();
- _types[i].resource_table_offset = (uint16)_mhk->readUint32BE() + 6;
- _mhk->readUint32BE(); // Unknown (always 0?)
+ for (uint16 i = 0; i < typeCount; i++) {
+ uint32 tag = stream->readUint32BE();
+ uint32 resourceTableOffset = stream->readUint32BE() + 6;
+ stream->readUint32BE(); // Unknown (always 0?)
- debug (3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x", i, tag2str(_types[i].tag), _types[i].resource_table_offset);
+ debug(3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x", i, tag2str(tag), resourceTableOffset);
- uint32 oldPos = _mhk->pos();
+ uint32 oldPos = stream->pos();
// Resource Table/File Table
- _mhk->seek(_types[i].resource_table_offset);
- _types[i].resTable.resources = _mhk->readUint16BE();
- _types[i].resTable.entries = new OldType::ResourceTable::Entries[_types[i].resTable.resources];
-
- for (uint16 j = 0; j < _types[i].resTable.resources; j++) {
- _types[i].resTable.entries[j].id = _mhk->readUint16BE();
- _types[i].resTable.entries[j].offset = _mhk->readUint32BE();
- _types[i].resTable.entries[j].size = _mhk->readByte() << 16;
- _types[i].resTable.entries[j].size += _mhk->readUint16BE();
- _mhk->skip(5); // Unknown (always 0?)
-
- debug (4, "Entry[%02x]: ID = %04x (%d)\tOffset = %08x, Size = %08x", j, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].offset, _types[i].resTable.entries[j].size);
- }
+ stream->seek(resourceTableOffset);
+ uint16 resourceCount = stream->readUint16BE();
- _mhk->seek(oldPos);
- debug (3, "\n");
- }
- } else if (SWAP_BYTES_32(headerSize) == 6) { // We're in Little Endian mode (Windows)
- _mhk->readUint16LE(); // Resource Table Size
- _typeTable.resource_types = _mhk->readUint16LE();
- _types = new OldType[_typeTable.resource_types];
-
- debug (0, "Old Mohawk File (Windows): Number of Resource Types = %04x", _typeTable.resource_types);
-
- for (uint16 i = 0; i < _typeTable.resource_types; i++) {
- _types[i].tag = _mhk->readUint32LE();
- _types[i].resource_table_offset = _mhk->readUint16LE() + 6;
- _mhk->readUint16LE(); // Unknown (always 0?)
+ ResourceMap &resMap = _types[tag];
- debug (3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x", i, tag2str(_types[i].tag), _types[i].resource_table_offset);
+ for (uint16 j = 0; j < resourceCount; j++) {
+ uint16 id = stream->readUint16BE();
- uint32 oldPos = _mhk->pos();
+ Resource &res = resMap[id];
- // Resource Table/File Table
- _mhk->seek(_types[i].resource_table_offset);
- _types[i].resTable.resources = _mhk->readUint16LE();
- _types[i].resTable.entries = new OldType::ResourceTable::Entries[_types[i].resTable.resources];
-
- for (uint16 j = 0; j < _types[i].resTable.resources; j++) {
- _types[i].resTable.entries[j].id = _mhk->readUint16LE();
- _types[i].resTable.entries[j].offset = _mhk->readUint32LE();
- _types[i].resTable.entries[j].size = _mhk->readUint32LE();
- _mhk->readUint16LE(); // Unknown (always 0?)
+ res.offset = stream->readUint32BE();
+ res.size = stream->readByte() << 16;
+ res.size |= stream->readUint16BE();
+ stream->skip(5); // Unknown (always 0?)
- debug (4, "Entry[%02x]: ID = %04x (%d)\tOffset = %08x, Size = %08x", j, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].offset, _types[i].resTable.entries[j].size);
+ debug(4, "Entry[%02x]: ID = %04x (%d)\tOffset = %08x, Size = %08x", j, id, id, res.offset, res.size);
}
- _mhk->seek(oldPos);
- debug (3, "\n");
+ stream->seek(oldPos);
+ debug(3, "\n");
}
- } else {
- warning("Could not determine type of Old Mohawk resource");
- return false;
- }
-
- return true;
-}
-
-uint32 LivingBooksArchive_v1::getOffset(uint32 tag, uint16 id) {
- assert(_mhk);
+ } else if (SWAP_BYTES_32(headerSize) == 6) { // We're in Little Endian mode (Windows)
+ stream->readUint16LE(); // Resource Table Size
+ uint16 typeCount = stream->readUint16LE();
- int16 typeIndex = getTypeIndex(tag);
- assert(typeIndex >= 0);
+ debug(0, "Old Mohawk File (Windows): Number of Resource Types = %04x", typeCount);
- int16 idIndex = getIDIndex(typeIndex, id);
- assert(idIndex >= 0);
+ for (uint16 i = 0; i < typeCount; i++) {
+ uint32 tag = stream->readUint32LE();
+ uint16 resourceTableOffset = stream->readUint16LE() + 6;
+ stream->readUint16LE(); // Unknown (always 0?)
- return _types[typeIndex].resTable.entries[idIndex].offset;
-}
+ debug(3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x", i, tag2str(tag), resourceTableOffset);
-Common::SeekableReadStream *LivingBooksArchive_v1::getResource(uint32 tag, uint16 id) {
- if (!_mhk)
- error("LivingBooksArchive_v1::getResource(): No File in Use");
+ uint32 oldPos = stream->pos();
- int16 typeIndex = getTypeIndex(tag);
-
- if (typeIndex < 0)
- error("Could not find a tag of \'%s\' in file \'%s\'", tag2str(tag), _curFile.c_str());
+ // Resource Table/File Table
+ stream->seek(resourceTableOffset);
+ uint16 resourceCount = stream->readUint16LE();
- int16 idIndex = getIDIndex(typeIndex, id);
+ ResourceMap &resMap = _types[tag];
- if (idIndex < 0)
- error("Could not find \'%s\' %04x in file \'%s\'", tag2str(tag), id, _curFile.c_str());
+ for (uint16 j = 0; j < resourceCount; j++) {
+ uint16 id = stream->readUint16LE();
- return new Common::SeekableSubReadStream(_mhk, _types[typeIndex].resTable.entries[idIndex].offset, _types[typeIndex].resTable.entries[idIndex].offset + _types[typeIndex].resTable.entries[idIndex].size);
-}
+ Resource &res = resMap[id];
-bool LivingBooksArchive_v1::hasResource(uint32 tag, uint16 id) {
- if (!_mhk)
- return false;
+ res.offset = stream->readUint32LE();
+ res.size = stream->readUint32LE();
+ stream->readUint16LE(); // Unknown (always 0?)
- int16 typeIndex = getTypeIndex(tag);
+ debug(4, "Entry[%02x]: ID = %04x (%d)\tOffset = %08x, Size = %08x", j, id, id, res.offset, res.size);
+ }
- if (typeIndex < 0)
+ stream->seek(oldPos);
+ debug(3, "\n");
+ }
+ } else {
+ // Not a valid Living Books Archive
return false;
+ }
- return getIDIndex(typeIndex, id) >= 0;
+ _stream = stream;
+ return true;
}
-int LivingBooksArchive_v1::getTypeIndex(uint32 tag) {
- for (uint16 i = 0; i < _typeTable.resource_types; i++)
- if (_types[i].tag == tag)
- return i;
- return -1; // not found
-}
-
-int LivingBooksArchive_v1::getIDIndex(int typeIndex, uint16 id) {
- for (uint16 i = 0; i < _types[typeIndex].resTable.resources; i++)
- if (_types[typeIndex].resTable.entries[i].id == id)
- return i;
- return -1; // not found
-}
+// DOS Archive (v2) code
// Partially based on the Prince of Persia Format Specifications
// See http://sdfg.com.ar/git/?p=fp-git.git;a=blob;f=FP/doc/FormatSpecifications
// However, I'm keeping with the terminology we've been using with the
// later archive formats.
-bool DOSArchive_v2::open(Common::SeekableReadStream *stream) {
+bool DOSArchive_v2::openStream(Common::SeekableReadStream *stream) {
close();
uint32 typeTableOffset = stream->readUint32LE();
@@ -488,36 +429,38 @@ bool DOSArchive_v2::open(Common::SeekableReadStream *stream) {
stream->seek(typeTableOffset);
- _typeTable.resource_types = stream->readUint16LE();
- _types = new OldType[_typeTable.resource_types];
+ uint16 typeCount = stream->readUint16LE();
- for (uint16 i = 0; i < _typeTable.resource_types; i++) {
- _types[i].tag = stream->readUint32LE();
- _types[i].resource_table_offset = stream->readUint16LE();
+ for (uint16 i = 0; i < typeCount; i++) {
+ uint32 tag = stream->readUint32LE();
+ uint16 resourceTableOffset = stream->readUint16LE();
- debug(3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x", i, tag2str(_types[i].tag), _types[i].resource_table_offset);
+ debug(3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x", i, tag2str(tag), resourceTableOffset);
uint32 oldPos = stream->pos();
// Resource Table/File Table
- stream->seek(_types[i].resource_table_offset + typeTableOffset);
- _types[i].resTable.resources = stream->readUint16LE();
- _types[i].resTable.entries = new OldType::ResourceTable::Entries[_types[i].resTable.resources];
+ stream->seek(resourceTableOffset + typeTableOffset);
+ uint16 resourceCount = stream->readUint16LE();
+
+ ResourceMap &resMap = _types[tag];
+
+ for (uint16 j = 0; j < resourceCount; j++) {
+ uint16 id = stream->readUint16LE();
- for (uint16 j = 0; j < _types[i].resTable.resources; j++) {
- _types[i].resTable.entries[j].id = stream->readUint16LE();
- _types[i].resTable.entries[j].offset = stream->readUint32LE() + 1; // Need to add one to the offset to skip the checksum byte
- _types[i].resTable.entries[j].size = stream->readUint16LE();
- stream->skip(3); // Skip the useless flags
+ Resource &res = resMap[id];
+ res.offset = stream->readUint32LE() + 1; // Need to add one to the offset to skip the checksum byte
+ res.size = stream->readUint16LE();
+ stream->skip(3); // Skip (useless) flags
- debug (4, "Entry[%02x]: ID = %04x (%d)\tOffset = %08x, Size = %08x", j, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].id, _types[i].resTable.entries[j].offset, _types[i].resTable.entries[j].size);
+ debug(4, "Entry[%02x]: ID = %04x (%d)\tOffset = %08x, Size = %08x", j, id, id, res.offset, res.size);
}
stream->seek(oldPos);
- debug (3, "\n");
+ debug(3, "\n");
}
- _mhk = stream;
+ _stream = stream;
return true;
}
diff --git a/engines/mohawk/resource.h b/engines/mohawk/resource.h
index cabce04e38..f2ead7af65 100644
--- a/engines/mohawk/resource.h
+++ b/engines/mohawk/resource.h
@@ -22,6 +22,7 @@
#include "common/scummsys.h"
#include "common/endian.h"
+#include "common/hashmap.h"
#include "common/file.h"
#include "common/str.h"
@@ -128,127 +129,64 @@ namespace Mohawk {
#define ID_BBOX MKTAG('B','B','O','X') // Boxes? (CSWorld, CSAmtrak)
#define ID_SYSX MKTAG('S','Y','S','X') // MIDI Sysex
-struct FileTable {
- uint32 offset;
- uint32 dataSize; // Really 27 bits
- byte flags; // Mostly useless except for the bottom 3 bits which are part of the size
- uint16 unk; // Always 0
-};
-
-struct Type {
- Type() { resTable.entries = NULL; nameTable.entries = NULL; }
- ~Type() { delete[] resTable.entries; delete[] nameTable.entries; }
-
- //Type Table
- uint32 tag;
- uint16 resource_table_offset;
- uint16 name_table_offset;
-
- struct ResourceTable {
- uint16 resources;
- struct Entries {
- uint16 id;
- uint16 index;
- } *entries;
- } resTable;
-
- struct NameTable {
- uint16 num;
- struct Entries {
- uint16 offset;
- uint16 index;
- // Name List
- Common::String name;
- } *entries;
- } nameTable;
-};
-
-struct TypeTable {
- uint16 name_offset;
- uint16 resource_types;
-};
-struct RSRC_Header {
- uint16 version;
- uint16 compaction;
- uint32 filesize;
- uint32 abs_offset;
- uint16 file_table_offset;
- uint16 file_table_size;
-};
-
-class MohawkArchive {
+class Archive {
public:
- MohawkArchive();
- virtual ~MohawkArchive() { close(); }
+ Archive();
+ virtual ~Archive();
- bool open(const Common::String &filename);
- virtual bool open(Common::SeekableReadStream *stream);
+ bool openFile(const Common::String &fileName);
+ virtual bool openStream(Common::SeekableReadStream *stream) = 0;
void close();
- virtual bool hasResource(uint32 tag, uint16 id);
- virtual bool hasResource(uint32 tag, const Common::String &resName);
- virtual Common::SeekableReadStream *getResource(uint32 tag, uint16 id);
- virtual uint32 getOffset(uint32 tag, uint16 id);
- virtual uint16 findResourceID(uint32 type, const Common::String &resName);
- Common::String getName(uint32 tag, uint16 id);
+ bool isOpen() const { return _stream != 0; }
+
+ bool hasResource(uint32 tag, uint16 id) const;
+ bool hasResource(uint32 tag, const Common::String &resName) const;
+ Common::SeekableReadStream *getResource(uint32 tag, uint16 id);
+ uint32 getOffset(uint32 tag, uint16 id) const;
+ uint16 findResourceID(uint32 tag, const Common::String &resName) const;
+ Common::String getName(uint32 tag, uint16 id) const;
+
+ Common::Array<uint32> getResourceTypeList() const;
+ Common::Array<uint16> getResourceIDList(uint32 type) const;
protected:
- Common::SeekableReadStream *_mhk;
- TypeTable _typeTable;
- Common::String _curFile;
-
-private:
- RSRC_Header _rsrc;
- Type *_types;
- FileTable *_fileTable;
- uint16 _nameTableAmount;
- uint16 _resourceTableAmount;
- uint16 _fileTableAmount;
-
- int getTypeIndex(uint32 tag);
- int getIDIndex(int typeIndex, uint16 id);
- int getIDIndex(int typeIndex, const Common::String &resName);
+ Common::SeekableReadStream *_stream;
+
+ struct Resource {
+ uint32 offset;
+ uint32 size;
+ Common::String name;
+ };
+
+ typedef Common::HashMap<uint16, Resource> ResourceMap;
+ typedef Common::HashMap<uint32, ResourceMap> TypeMap;
+ TypeMap _types;
};
-class LivingBooksArchive_v1 : public MohawkArchive {
+class MohawkArchive : public Archive {
public:
- LivingBooksArchive_v1() : MohawkArchive() {}
- ~LivingBooksArchive_v1() {}
+ MohawkArchive() : Archive() {}
+ ~MohawkArchive() {}
- bool hasResource(uint32 tag, uint16 id);
- bool hasResource(uint32 tag, const Common::String &resName) { return false; }
- virtual bool open(Common::SeekableReadStream *stream);
- Common::SeekableReadStream *getResource(uint32 tag, uint16 id);
- Common::SeekableReadStream *getResource(uint32 tag, const Common::String &resName) { return 0; }
- uint32 getOffset(uint32 tag, uint16 id);
- uint16 findResourceID(uint32 type, const Common::String &resName) { return 0xFFFF; }
+ bool openStream(Common::SeekableReadStream *stream);
+};
-protected:
- struct OldType {
- uint32 tag;
- uint16 resource_table_offset;
- struct ResourceTable {
- uint16 resources;
- struct Entries {
- uint16 id;
- uint32 offset;
- uint32 size;
- } *entries;
- } resTable;
- } *_types;
-
-private:
- int getTypeIndex(uint32 tag);
- int getIDIndex(int typeIndex, uint16 id);
+class LivingBooksArchive_v1 : public Archive {
+public:
+ LivingBooksArchive_v1() : Archive() {}
+ ~LivingBooksArchive_v1() {}
+
+ bool openStream(Common::SeekableReadStream *stream);
};
-class DOSArchive_v2 : public LivingBooksArchive_v1 {
+class DOSArchive_v2 : public Archive {
public:
- DOSArchive_v2() : LivingBooksArchive_v1() {}
+ DOSArchive_v2() : Archive() {}
~DOSArchive_v2() {}
- virtual bool open(Common::SeekableReadStream *stream);
+ bool openStream(Common::SeekableReadStream *stream);
};
} // End of namespace Mohawk
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index 8f8bc15990..3e2fa4f979 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -143,13 +143,16 @@ Common::Error MohawkEngine_Riven::run() {
_extrasFile = new MohawkArchive();
// We need extras.mhk for inventory images, marble images, and credits images
- if (!_extrasFile->open("extras.mhk")) {
+ if (!_extrasFile->openFile("extras.mhk")) {
Common::String message = "You're missing 'extras.mhk'. Using the 'arcriven.z' installer file also works.";
GUIErrorMessage(message);
warning("%s", message.c_str());
return Common::kNoGameDataFoundError;
}
+ // Set the transition speed
+ _gfx->setTransitionSpeed(_vars["transitionmode"]);
+
// Start at main cursor
_cursor->setCursor(kRivenMainCursor);
_cursor->showCursor();
@@ -209,8 +212,10 @@ void MohawkEngine_Riven::handleEvents() {
needsUpdate = true;
break;
case Common::EVENT_LBUTTONDOWN:
- if (_curHotspot >= 0)
+ if (_curHotspot >= 0) {
+ checkSunnerAlertClick();
runHotspotScript(_curHotspot, kMouseDownScript);
+ }
break;
case Common::EVENT_LBUTTONUP:
// See RivenScript::switchCard() for more information on why we sometimes
@@ -317,7 +322,7 @@ void MohawkEngine_Riven::changeToStack(uint16 n) {
Common::String filename = Common::String(prefix) + endings[i];
MohawkArchive *mhk = new MohawkArchive();
- if (mhk->open(filename))
+ if (mhk->openFile(filename))
_mhk.push_back(mhk);
else
delete mhk;
@@ -812,6 +817,138 @@ static void catherineIdleTimer(MohawkEngine_Riven *vm) {
vm->installTimer(&catherineIdleTimer, timeUntilNextMovie);
}
+static void sunnersTopStairsTimer(MohawkEngine_Riven *vm) {
+ // If the sunners are gone, we have no video to play
+ if (vm->_vars["jsunners"] != 0) {
+ vm->removeTimer();
+ return;
+ }
+
+ // Play a random sunners video if the script one is not playing already
+ // and then set a new timer for when the new video should be played
+
+ VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1);
+ uint32 timerTime = 500;
+
+ if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) {
+ uint32 &sunnerTime = vm->_vars["jsunnertime"];
+
+ if (sunnerTime == 0) {
+ timerTime = vm->_rnd->getRandomNumberRng(2, 15) * 1000;
+ } else if (sunnerTime < vm->getTotalPlayTime()) {
+ VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(1, 3));
+
+ timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(2, 15) * 1000;
+ }
+
+ sunnerTime = timerTime + vm->getTotalPlayTime();
+ }
+
+ vm->installTimer(&sunnersTopStairsTimer, timerTime);
+}
+
+static void sunnersMidStairsTimer(MohawkEngine_Riven *vm) {
+ // If the sunners are gone, we have no video to play
+ if (vm->_vars["jsunners"] != 0) {
+ vm->removeTimer();
+ return;
+ }
+
+ // Play a random sunners video if the script one is not playing already
+ // and then set a new timer for when the new video should be played
+
+ VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1);
+ uint32 timerTime = 500;
+
+ if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) {
+ uint32 &sunnerTime = vm->_vars["jsunnertime"];
+
+ if (sunnerTime == 0) {
+ timerTime = vm->_rnd->getRandomNumberRng(1, 10) * 1000;
+ } else if (sunnerTime < vm->getTotalPlayTime()) {
+ // Randomize the video
+ int randValue = vm->_rnd->getRandomNumber(5);
+ uint16 movie = 4;
+ if (randValue == 4)
+ movie = 2;
+ else if (randValue == 5)
+ movie = 3;
+
+ VideoHandle handle = vm->_video->playMovieRiven(movie);
+
+ timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 10) * 1000;
+ }
+
+ sunnerTime = timerTime + vm->getTotalPlayTime();
+ }
+
+ vm->installTimer(&sunnersMidStairsTimer, timerTime);
+}
+
+static void sunnersLowerStairsTimer(MohawkEngine_Riven *vm) {
+ // If the sunners are gone, we have no video to play
+ if (vm->_vars["jsunners"] != 0) {
+ vm->removeTimer();
+ return;
+ }
+
+ // Play a random sunners video if the script one is not playing already
+ // and then set a new timer for when the new video should be played
+
+ VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1);
+ uint32 timerTime = 500;
+
+ if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) {
+ uint32 &sunnerTime = vm->_vars["jsunnertime"];
+
+ if (sunnerTime == 0) {
+ timerTime = vm->_rnd->getRandomNumberRng(1, 30) * 1000;
+ } else if (sunnerTime < vm->getTotalPlayTime()) {
+ VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(3, 5));
+
+ timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 30) * 1000;
+ }
+
+ sunnerTime = timerTime + vm->getTotalPlayTime();
+ }
+
+ vm->installTimer(&sunnersLowerStairsTimer, timerTime);
+}
+
+static void sunnersBeachTimer(MohawkEngine_Riven *vm) {
+ // If the sunners are gone, we have no video to play
+ if (vm->_vars["jsunners"] != 0) {
+ vm->removeTimer();
+ return;
+ }
+
+ // Play a random sunners video if the script one is not playing already
+ // and then set a new timer for when the new video should be played
+
+ VideoHandle oldHandle = vm->_video->findVideoHandleRiven(3);
+ uint32 timerTime = 500;
+
+ if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) {
+ uint32 &sunnerTime = vm->_vars["jsunnertime"];
+
+ if (sunnerTime == 0) {
+ timerTime = vm->_rnd->getRandomNumberRng(1, 30) * 1000;
+ } else if (sunnerTime < vm->getTotalPlayTime()) {
+ // Unlike the other cards' scripts which automatically
+ // activate the MLST, we have to set it manually here.
+ uint16 mlstID = vm->_rnd->getRandomNumberRng(3, 8);
+ vm->_video->activateMLST(mlstID, vm->getCurCard());
+ VideoHandle handle = vm->_video->playMovieRiven(mlstID);
+
+ timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 30) * 1000;
+ }
+
+ sunnerTime = timerTime + vm->getTotalPlayTime();
+ }
+
+ vm->installTimer(&sunnersBeachTimer, timerTime);
+}
+
void MohawkEngine_Riven::installCardTimer() {
switch (getCurCardRMAP()) {
case 0x3a85: // Top of elevator on prison island
@@ -819,16 +956,16 @@ void MohawkEngine_Riven::installCardTimer() {
installTimer(&catherineIdleTimer, _rnd->getRandomNumberRng(1, 33) * 1000);
break;
case 0x77d6: // Sunners, top of stairs
- // TODO: Background Sunner videos
+ installTimer(&sunnersTopStairsTimer, 500);
break;
case 0x79bd: // Sunners, middle of stairs
- // TODO: Background Sunner videos
+ installTimer(&sunnersMidStairsTimer, 500);
break;
case 0x7beb: // Sunners, bottom of stairs
- // TODO: Background Sunner videos
+ installTimer(&sunnersLowerStairsTimer, 500);
break;
case 0xb6ca: // Sunners, shoreline
- // TODO: Background Sunner videos
+ installTimer(&sunnersBeachTimer, 500);
break;
}
}
@@ -846,6 +983,34 @@ void MohawkEngine_Riven::doVideoTimer(VideoHandle handle, bool force) {
_scriptMan->runStoredMovieOpcode();
}
+void MohawkEngine_Riven::checkSunnerAlertClick() {
+ // We need to do a manual hardcoded check for the sunners'
+ // alert movies.
+
+ uint32 &sunners = _vars["jsunners"];
+
+ // If the sunners are gone, there's nothing for us to do
+ if (sunners != 0)
+ return;
+
+ uint32 rmapCode = getCurCardRMAP();
+
+ // This is only for the mid/lower staircase sections
+ if (rmapCode != 0x79bd && rmapCode != 0x7beb)
+ return;
+
+ // Only set the sunners variable on the forward hotspot
+ if ((rmapCode == 0x79bd && _curHotspot != 1) || (rmapCode == 0x7beb && _curHotspot != 2))
+ return;
+
+ // If the alert video is no longer playing, we have nothing left to do
+ VideoHandle handle = _video->findVideoHandleRiven(1);
+ if (handle == NULL_VID_HANDLE || _video->endOfVideo(handle))
+ return;
+
+ sunners = 1;
+}
+
bool ZipMode::operator== (const ZipMode &z) const {
return z.name == name && z.id == id;
}
diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h
index c7d36e585d..e99a9f78fc 100644
--- a/engines/mohawk/riven.h
+++ b/engines/mohawk/riven.h
@@ -67,6 +67,13 @@ enum {
StackNames = 5
};
+enum RivenTransitionSpeed {
+ kRivenTransitionSpeedNone = 5000,
+ kRivenTransitionSpeedFastest = 5001,
+ kRivenTransitionSpeedNormal = 5002,
+ kRivenTransitionSpeedBest = 5003
+};
+
// Rects for the inventory object positions (initialized in
// MohawkEngine_Riven's constructor).
extern Common::Rect *g_atrusJournalRect1;
@@ -164,6 +171,7 @@ private:
// Miscellaneous
bool _gameOver;
bool _ignoreNextMouseUp;
+ void checkSunnerAlertClick();
public:
// Stack/card/script funtions
diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp
index 60e94ea795..9e1365f8da 100644
--- a/engines/mohawk/riven_external.cpp
+++ b/engines/mohawk/riven_external.cpp
@@ -234,10 +234,10 @@ void RivenExternal::runCredits(uint16 video, uint32 delay) {
// Set us up to start after delay ms
nextCreditsFrameStart = _vm->_system->getMillis() + delay;
} else if (_vm->_system->getMillis() >= nextCreditsFrameStart) {
- // the first two frames stay on for 5 seconds
+ // the first two frames stay on for 4 seconds
// the rest of the scroll updates happen at 30Hz
if (_vm->_gfx->getCurCreditsImage() < 304)
- nextCreditsFrameStart = _vm->_system->getMillis() + 5000;
+ nextCreditsFrameStart = _vm->_system->getMillis() + 4000;
else
nextCreditsFrameStart = _vm->_system->getMillis() + 1000 / 30;
@@ -1889,21 +1889,42 @@ void RivenExternal::xjplaybeetle_1450(uint16 argc, uint16 *argv) {
}
void RivenExternal::xjlagoon700_alert(uint16 argc, uint16 *argv) {
- // TODO: Sunner related
+ // Handle sunner reactions (mid-staircase)
+
+ if (_vm->_vars["jsunners"] == 0)
+ _vm->_video->playMovieRiven(1);
}
void RivenExternal::xjlagoon800_alert(uint16 argc, uint16 *argv) {
- // TODO: Sunner related
+ // Handle sunner reactions (lower-staircase)
+
+ uint32 &sunners = _vm->_vars["jsunners"];
+
+ if (sunners == 0) {
+ // Show the sunners alert video
+ _vm->_video->playMovieRiven(1);
+ } else if (sunners == 1) {
+ // Show the sunners leaving if you moved forward in their "alert" status
+ _vm->_video->playMovieBlockingRiven(2);
+ _vm->_video->playMovieBlockingRiven(6);
+ sunners = 2;
+ _vm->refreshCard();
+ }
}
void RivenExternal::xjlagoon1500_alert(uint16 argc, uint16 *argv) {
- // Have the sunners move a bit as you get closer ;)
+ // Handle sunner reactions (beach)
+
uint32 &sunners = _vm->_vars["jsunners"];
+
if (sunners == 0) {
+ // Show the sunners alert video
_vm->_video->playMovieBlockingRiven(3);
} else if (sunners == 1) {
+ // Show the sunners leaving if you moved forward in their "alert" status
_vm->_video->playMovieBlockingRiven(2);
sunners = 2;
+ _vm->refreshCard();
}
}
@@ -2726,6 +2747,7 @@ void RivenExternal::xtatboundary(uint16 argc, uint16 *argv) {
void RivenExternal::xflies(uint16 argc, uint16 *argv) {
// TODO: Activate the "flies" effect
+ debug(1, "STUB: xflies(): create %d %s fl%s", argv[1], (argv[0] == 0) ? "black" : "glowing", (argv[1] == 1) ? "y" : "ies");
}
} // End of namespace Mohawk
diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp
index 35d82d4aa0..18c13ec12b 100644
--- a/engines/mohawk/riven_saveload.cpp
+++ b/engines/mohawk/riven_saveload.cpp
@@ -100,7 +100,7 @@ bool RivenSaveLoad::loadGame(Common::String filename) {
MohawkArchive *mhk = new MohawkArchive();
- if (!mhk->open(loadFile)) {
+ if (!mhk->openStream(loadFile)) {
warning("Save file is not a Mohawk archive");
delete mhk;
return false;
@@ -274,7 +274,16 @@ Common::MemoryWriteStreamDynamic *RivenSaveLoad::genZIPSSection() {
}
bool RivenSaveLoad::saveGame(Common::String filename) {
- // Note, this code is still WIP. It works quite well for now.
+ // NOTE: This code is designed to only output a Mohawk archive
+ // for a Riven saved game. It's hardcoded to do this because
+ // (as of right now) this is the only place in the engine
+ // that requires this feature. If the time comes when other
+ // games need this, we should think about coming up with some
+ // more common way of outputting resources to an archive.
+
+ // TODO: Make these saves work with the original interpreter.
+ // Not sure why they don't work yet (they still can be loaded
+ // by ScummVM).
// Make sure we have the right extension
if (!filename.matchString("*.rvn", true))
@@ -296,99 +305,101 @@ bool RivenSaveLoad::saveGame(Common::String filename) {
Common::MemoryWriteStreamDynamic *zipsSection = genZIPSSection();
// Let's calculate the file size!
- uint32 fileSize = 0;
+ uint32 fileSize = 142;
fileSize += versSection->size();
fileSize += nameSection->size();
fileSize += varsSection->size();
fileSize += zipsSection->size();
- fileSize += 16; // RSRC Header
- fileSize += 4; // Type Table Header
- fileSize += 4 * 8; // Type Table Entries
- fileSize += 2; // Pseudo-Name entries
- // IFF Header
+ // MHWK Header (8 bytes - total: 8)
saveFile->writeUint32BE(ID_MHWK);
- saveFile->writeUint32BE(fileSize);
+ saveFile->writeUint32BE(fileSize - 8);
- // RSRC Header
+ // RSRC Header (20 bytes - total: 28)
saveFile->writeUint32BE(ID_RSRC);
saveFile->writeUint16BE(0x100); // Resource Version (1.0)
- saveFile->writeUint16BE(0); // No compaction
- saveFile->writeUint32BE(fileSize + 8); // Add on the 8 from the IFF header
- saveFile->writeUint32BE(28); // IFF + RSRC
- saveFile->writeUint16BE(62); // File Table Offset
- saveFile->writeUint16BE(44); // 4 + 4 * 10
-
- //Type Table
- saveFile->writeUint16BE(36); // After the Type Table Entries
+ saveFile->writeUint16BE(1); // Compaction -- original saves have this too
+ saveFile->writeUint32BE(fileSize); // Subtract off the MHWK header size
+ saveFile->writeUint32BE(28); // Absolute offset: right after both headers
+ saveFile->writeUint16BE(70); // File Table Offset
+ saveFile->writeUint16BE(44); // File Table Size (4 bytes count + 4 entries * 10 bytes per entry)
+
+ // Type Table (4 bytes - total: 32)
+ saveFile->writeUint16BE(36); // String table offset After the Type Table Entries
saveFile->writeUint16BE(4); // 4 Type Table Entries
- // Hardcode Entries
+ // Hardcode Entries (32 bytes - total: 64)
saveFile->writeUint32BE(ID_VERS);
- saveFile->writeUint16BE(38);
- saveFile->writeUint16BE(36);
+ saveFile->writeUint16BE(46); // Resource table offset
+ saveFile->writeUint16BE(38); // String table offset
saveFile->writeUint32BE(ID_NAME);
- saveFile->writeUint16BE(44);
- saveFile->writeUint16BE(36);
+ saveFile->writeUint16BE(52);
+ saveFile->writeUint16BE(40);
saveFile->writeUint32BE(ID_VARS);
- saveFile->writeUint16BE(50);
- saveFile->writeUint16BE(36);
+ saveFile->writeUint16BE(58);
+ saveFile->writeUint16BE(42);
saveFile->writeUint32BE(ID_ZIPS);
- saveFile->writeUint16BE(56);
- saveFile->writeUint16BE(36);
+ saveFile->writeUint16BE(64);
+ saveFile->writeUint16BE(44);
- // Pseudo-Name Table/Name List
+ // Pseudo-String Table (2 bytes - total: 66)
saveFile->writeUint16BE(0); // We don't need a name list
- // VERS Section (Resource Table)
+ // Psuedo-Name Tables (8 bytes - total: 74)
+ saveFile->writeUint16BE(0);
+ saveFile->writeUint16BE(0);
+ saveFile->writeUint16BE(0);
+ saveFile->writeUint16BE(0);
+
+ // VERS Section (Resource Table) (6 bytes - total: 80)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
- // NAME Section (Resource Table)
+ // NAME Section (Resource Table) (6 bytes - total: 86)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(2);
- // VARS Section (Resource Table)
+ // VARS Section (Resource Table) (6 bytes - total: 92)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(3);
- // ZIPS Section (Resource Table)
+ // ZIPS Section (Resource Table) (6 bytes - total: 98)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(4);
- // File Table
+ // File Table (4 bytes - total: 102)
saveFile->writeUint32BE(4);
- // VERS Section (File Table)
- saveFile->writeUint32BE(134);
+ // VERS Section (File Table) (10 bytes - total: 112)
+ saveFile->writeUint32BE(142);
saveFile->writeUint16BE(versSection->size() & 0xFFFF);
saveFile->writeByte((versSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
saveFile->writeUint16BE(0);
- // NAME Section (File Table)
- saveFile->writeUint32BE(134 + versSection->size());
+ // NAME Section (File Table) (10 bytes - total: 122)
+ saveFile->writeUint32BE(142 + versSection->size());
saveFile->writeUint16BE(nameSection->size() & 0xFFFF);
saveFile->writeByte((nameSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
saveFile->writeUint16BE(0);
- // VARS Section (File Table)
- saveFile->writeUint32BE(134 + versSection->size() + nameSection->size());
+ // VARS Section (File Table) (10 bytes - total: 132)
+ saveFile->writeUint32BE(142 + versSection->size() + nameSection->size());
saveFile->writeUint16BE(varsSection->size() & 0xFFFF);
saveFile->writeByte((varsSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
saveFile->writeUint16BE(0);
- // ZIPS Section (File Table)
- saveFile->writeUint32BE(134 + versSection->size() + nameSection->size() + varsSection->size());
+ // ZIPS Section (File Table) (10 bytes - total: 142)
+ saveFile->writeUint32BE(142 + versSection->size() + nameSection->size() + varsSection->size());
saveFile->writeUint16BE(zipsSection->size() & 0xFFFF);
saveFile->writeByte((zipsSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp
index 946e2e0496..ba5c343e07 100644
--- a/engines/mohawk/riven_vars.cpp
+++ b/engines/mohawk/riven_vars.cpp
@@ -268,7 +268,12 @@ static const char *variableNames[] = {
};
uint32 &MohawkEngine_Riven::getStackVar(uint32 index) {
- return _vars[getName(VariableNames, index)];
+ Common::String name = getName(VariableNames, index);
+
+ if (!_vars.contains(name))
+ error("Could not find variable '%s' (stack variable %d)", name.c_str(), index);
+
+ return _vars[name];
}
void MohawkEngine_Riven::initVars() {
@@ -299,6 +304,7 @@ void MohawkEngine_Riven::initVars() {
_vars["bmagcar"] = 1;
_vars["gnmagcar"] = 1;
_vars["omusicplayer"] = 1;
+ _vars["transitionmode"] = kRivenTransitionSpeedFastest;
// Randomize the telescope combination
uint32 &teleCombo = _vars["tcorrectorder"];
diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp
index 6144c89e21..f92bebf10e 100644
--- a/engines/mohawk/sound.cpp
+++ b/engines/mohawk/sound.cpp
@@ -20,19 +20,20 @@
*
*/
-#include "mohawk/sound.h"
-
#include "common/debug.h"
#include "common/system.h"
#include "common/util.h"
#include "common/textconsole.h"
+#include "audio/midiparser.h"
#include "audio/musicplugin.h"
#include "audio/audiostream.h"
#include "audio/decoders/mp3.h"
#include "audio/decoders/raw.h"
#include "audio/decoders/wave.h"
+#include "mohawk/sound.h"
+
namespace Mohawk {
Sound::Sound(MohawkEngine* vm) : _vm(vm) {
@@ -84,7 +85,7 @@ Audio::AudioStream *Sound::makeAudioStream(uint16 id, CueList *cueList) {
if (_vm->getFeatures() & GF_ME)
audStream = Audio::makeWAVStream(_vm->getResource(ID_MSND, convertMystID(id)), DisposeAfterUse::YES);
else
- audStream = makeMohawkWaveStream(_vm->getResource(ID_MSND, id));
+ audStream = makeMohawkWaveStream(_vm->getResource(ID_MSND, id), cueList);
break;
case GType_ZOOMBINI:
audStream = makeMohawkWaveStream(_vm->getResource(ID_SND, id));
@@ -141,6 +142,19 @@ Audio::SoundHandle *Sound::replaceSoundMyst(uint16 id, byte volume, bool loop) {
&& name.equals(_vm->getResourceName(ID_MSND, convertMystID(_handles[i].id))))
return &_handles[i].handle;
+ // The original engine also forces looping for those sounds
+ switch (id) {
+ case 2205:
+ case 2207:
+ case 5378:
+ case 7220:
+ case 9119: // Elevator engine sound in mechanical age is looping.
+ case 9120:
+ case 9327:
+ loop = true;
+ break;
+ }
+
stopSound();
return playSound(id, volume, loop);
}
diff --git a/engines/mohawk/sound.h b/engines/mohawk/sound.h
index 593f2fcd0b..12a59cdedf 100644
--- a/engines/mohawk/sound.h
+++ b/engines/mohawk/sound.h
@@ -27,14 +27,15 @@
#include "common/str.h"
#include "audio/audiostream.h"
-#include "audio/decoders/adpcm.h"
-#include "audio/mididrv.h"
-#include "audio/midiparser.h"
#include "audio/mixer.h"
+#include "audio/decoders/adpcm.h"
#include "mohawk/mohawk.h"
#include "mohawk/resource.h"
+class MidiDriver;
+class MidiParser;
+
namespace Mohawk {
#define MAX_CHANNELS 2 // Can there be more than 2?
diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index b80379bc2d..df9eca3d7f 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -64,9 +64,6 @@ static const PlainGameDescriptor neverhoodGames[] = {
namespace Neverhood {
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-
static const NeverhoodGameDescription gameDescriptions[] = {
{
@@ -79,7 +76,7 @@ static const NeverhoodGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
0,
0,
diff --git a/engines/parallaction/detection.cpp b/engines/parallaction/detection.cpp
index d0610f7a29..43176a0759 100644
--- a/engines/parallaction/detection.cpp
+++ b/engines/parallaction/detection.cpp
@@ -53,9 +53,6 @@ static const PlainGameDescriptor parallactionGames[] = {
namespace Parallaction {
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-
static const PARALLACTIONGameDescription gameDescriptions[] = {
{
{
@@ -75,7 +72,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::UNK_LANG,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_Nippon,
GF_LANG_EN | GF_LANG_FR | GF_LANG_DE | GF_LANG_IT | GF_LANG_MULT,
@@ -99,7 +96,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::UNK_LANG,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_Nippon,
GF_LANG_EN | GF_LANG_FR | GF_LANG_DE | GF_LANG_MULT,
@@ -117,7 +114,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_Nippon,
GF_LANG_EN | GF_DEMO,
@@ -140,7 +137,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_Nippon,
GF_LANG_IT,
@@ -158,7 +155,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::UNK_LANG,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_BRA,
GF_LANG_EN | GF_LANG_FR | GF_LANG_DE | GF_LANG_IT | GF_LANG_MULT,
@@ -175,7 +172,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::UNK_LANG,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_BRA,
GF_LANG_EN | GF_DEMO,
@@ -192,7 +189,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::UNK_LANG,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_BRA,
GF_LANG_EN | GF_LANG_FR | GF_LANG_DE | GF_LANG_IT | GF_LANG_MULT,
@@ -209,7 +206,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
Common::UNK_LANG,
Common::kPlatformAmiga,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GType_BRA,
GF_LANG_EN | GF_DEMO,
@@ -223,7 +220,7 @@ static const PARALLACTIONGameDescription gameDescriptions[] = {
class ParallactionMetaEngine : public AdvancedMetaEngine {
public:
ParallactionMetaEngine() : AdvancedMetaEngine(Parallaction::gameDescriptions, sizeof(Parallaction::PARALLACTIONGameDescription), parallactionGames) {
- _guioptions = Common::GUIO_NOLAUNCHLOAD;
+ _guioptions = GUIO1(GUIO_NOLAUNCHLOAD);
}
virtual const char *getName() const {
diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp
index 48d84ed101..c351551e36 100644
--- a/engines/parallaction/gfxbase.cpp
+++ b/engines/parallaction/gfxbase.cpp
@@ -55,17 +55,14 @@ const char *GfxObj::getName() const {
return _name;
}
-
uint GfxObj::getNum() {
return _frames->getNum();
}
-
void GfxObj::getRect(uint f, Common::Rect &r) {
_frames->getRect(f, r);
}
-
byte *GfxObj::getData(uint f) {
return _frames->getData(f);
}
@@ -77,7 +74,6 @@ uint GfxObj::getSize(uint f) {
return _frames->getSize(f);
}
-
void GfxObj::setFlags(uint32 flags) {
_flags |= flags;
}
@@ -108,6 +104,7 @@ void Gfx::resetSceneDrawList() {
}
GfxObj* Gfx::loadAnim(const char *name) {
+ debugC(1, kDebugGraphics, "Gfx::loadAnim(\"%s\")", name);
Frames* frames = _disk->loadFrames(name);
assert(frames);
@@ -146,7 +143,6 @@ GfxObj* Gfx::loadDoor(const char *name) {
return obj;
}
-
void Gfx::freeLocationObjects() {
freeDialogueObjects();
freeLabels();
@@ -157,6 +153,7 @@ void Gfx::freeCharacterObjects() {
}
void BackgroundInfo::loadGfxObjMask(const char *name, GfxObj *obj) {
+ debugC(1, kDebugGraphics, "BackgroundInfo::loadGfxObjMask(\"%s\")", name);
Common::Rect rect;
obj->getRect(0, rect);
@@ -180,6 +177,7 @@ void Gfx::showGfxObj(GfxObj* obj, bool visible) {
if (!obj) {
return;
}
+ debugC(1, kDebugGraphics, "Gfx::showGfxObj(\"%s\", visible:%d)", obj->getName(), visible ? 1 : 0);
if (visible) {
obj->setFlags(kGfxObjVisible);
@@ -188,27 +186,27 @@ void Gfx::showGfxObj(GfxObj* obj, bool visible) {
}
if (obj->_hasMask) {
+ debugC(1, kDebugGraphics, "\tHas Mask");
_backgroundInfo->toggleMaskPatch(obj->_maskId, obj->x, obj->y, visible);
}
if (obj->_hasPath) {
+ debugC(1, kDebugGraphics, "\tHas Path");
_backgroundInfo->togglePathPatch(obj->_pathId, obj->x, obj->y, visible);
}
}
-
-
bool compareZ(const GfxObj* a1, const GfxObj* a2) {
return (a1->z == a2->z) ? (a1->_prog < a2->_prog) : (a1->z < a2->z);
}
void Gfx::sortScene() {
+ debugC(3, kDebugGraphics, "Gfx::sortScene()");
GfxObjArray::iterator first = _sceneObjects.begin();
GfxObjArray::iterator last = _sceneObjects.end();
Common::sort(first, last, compareZ);
}
-
void Gfx::drawGfxObject(GfxObj *obj, Graphics::Surface &surf) {
if (!obj->isVisible()) {
return;
@@ -236,16 +234,13 @@ void Gfx::drawGfxObject(GfxObj *obj, Graphics::Surface &surf) {
}
-
void Gfx::drawText(Font *font, Graphics::Surface* surf, uint16 x, uint16 y, const char *text, byte color) {
byte *dst = (byte*)surf->getBasePtr(x, y);
font->setColor(color);
font->drawString(dst, surf->w, text);
}
-
void Gfx::unpackBlt(const Common::Rect& r, byte *data, uint size, Graphics::Surface *surf, uint16 z, uint scale, byte transparentColor) {
-
byte *d = _unpackedBitmap;
uint pixelsLeftInLine = r.width();
@@ -273,7 +268,6 @@ void Gfx::unpackBlt(const Common::Rect& r, byte *data, uint size, Graphics::Surf
blt(r, _unpackedBitmap, surf, z, scale, transparentColor);
}
-
void Gfx::bltMaskScale(const Common::Rect& r, byte *data, Graphics::Surface *surf, uint16 z, uint scale, byte transparentColor) {
if (scale == 100) {
// use optimized path
@@ -301,7 +295,6 @@ void Gfx::bltMaskScale(const Common::Rect& r, byte *data, Graphics::Surface *sur
dstRect.clip(clipper);
if (!dstRect.isValidRect()) return;
-
// clipped source rectangle
Common::Rect srcRect;
srcRect.left = (dstRect.left - scaledLeft) * 100 / scale;
@@ -448,10 +441,8 @@ void Gfx::bltNoMaskNoScale(const Common::Rect& r, byte *data, Graphics::Surface
}
}
-
void Gfx::blt(const Common::Rect& r, byte *data, Graphics::Surface *surf, uint16 z, uint scale, byte transparentColor) {
bltMaskScale(r, data, surf, z, scale, transparentColor);
}
-
} // namespace Parallaction
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h
index 2f86f3693b..dacf7715ae 100644
--- a/engines/parallaction/graphics.h
+++ b/engines/parallaction/graphics.h
@@ -28,6 +28,7 @@
#include "common/hashmap.h"
#include "common/hash-str.h"
#include "common/stream.h"
+#include "common/array.h"
#include "graphics/surface.h"
@@ -559,12 +560,3 @@ protected:
#endif
-
-
-
-
-
-
-
-
-
diff --git a/engines/parallaction/gui_br.cpp b/engines/parallaction/gui_br.cpp
index d1361a6e8c..56148d78d8 100644
--- a/engines/parallaction/gui_br.cpp
+++ b/engines/parallaction/gui_br.cpp
@@ -548,4 +548,3 @@ void Parallaction_br::startIngameMenu() {
} // namespace Parallaction
-
diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp
index 22406013a1..fe21732f03 100644
--- a/engines/parallaction/objects.cpp
+++ b/engines/parallaction/objects.cpp
@@ -220,7 +220,11 @@ bool Zone::hitRect(int x, int y) const {
if (_right < _left || _bottom < _top) {
return false;
}
- return Common::Rect(_left, _top, _right, _bottom).contains(x, y);
+
+ Common::Rect r(_left, _top, _right + 1, _bottom + 1);
+ r.grow(-1);
+
+ return r.contains(x, y);
}
Dialogue::Dialogue() {
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index a37c4439a1..2fffc9071c 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -899,22 +899,23 @@ void CharacterName::bind(const char *name) {
_dummy = IS_DUMMY_CHARACTER(name);
if (!_dummy) {
- if (!strstr(name, "donna")) {
+ if (!strcmp(name, "donna")) {
_engineFlags &= ~kEngineTransformedDonna;
- } else
- if (_engineFlags & kEngineTransformedDonna) {
- _suffix = _suffixTras;
} else {
- const char *s = strstr(name, "tras");
- if (s) {
- _engineFlags |= kEngineTransformedDonna;
+ if (_engineFlags & kEngineTransformedDonna) {
_suffix = _suffixTras;
- end = s;
+ } else {
+ const char *s = strstr(name, "tras");
+ if (s) {
+ _engineFlags |= kEngineTransformedDonna;
+ _suffix = _suffixTras;
+ end = s;
+ }
+ }
+ if (IS_MINI_CHARACTER(name)) {
+ _prefix = _prefixMini;
+ begin = name + 4;
}
- }
- if (IS_MINI_CHARACTER(name)) {
- _prefix = _prefixMini;
- begin = name+4;
}
}
diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp
index f53d71caec..df53ecca3f 100644
--- a/engines/parallaction/parser_br.cpp
+++ b/engines/parallaction/parser_br.cpp
@@ -524,14 +524,14 @@ DECLARE_COMMAND_PARSER(location) {
ctxt.cmd->_startPos.x = -1000;
ctxt.cmd->_startPos2.x = -1000;
if (_tokens[ctxt.nextToken][0] != '\0') {
- if (isdigit(_tokens[ctxt.nextToken][0]) || _tokens[ctxt.nextToken][0] == '-') {
+ if (isdigit(static_cast<unsigned char>(_tokens[ctxt.nextToken][0])) || _tokens[ctxt.nextToken][0] == '-') {
ctxt.cmd->_startPos.x = atoi(_tokens[ctxt.nextToken]);
ctxt.nextToken++;
ctxt.cmd->_startPos.y = atoi(_tokens[ctxt.nextToken]);
ctxt.nextToken++;
}
- if (isdigit(_tokens[ctxt.nextToken][0]) || _tokens[ctxt.nextToken][0] == '-') {
+ if (isdigit(static_cast<unsigned char>(_tokens[ctxt.nextToken][0])) || _tokens[ctxt.nextToken][0] == '-') {
ctxt.cmd->_startPos2.x = atoi(_tokens[ctxt.nextToken]);
ctxt.nextToken++;
ctxt.cmd->_startPos2.y = atoi(_tokens[ctxt.nextToken]);
@@ -677,7 +677,7 @@ DECLARE_COMMAND_PARSER(text) {
createCommand(_parser->_lookup);
- if (isdigit(_tokens[1][1])) {
+ if (isdigit(static_cast<unsigned char>(_tokens[1][1]))) {
ctxt.cmd->_zeta0 = atoi(_tokens[1]);
ctxt.nextToken++;
} else {
@@ -714,7 +714,7 @@ DECLARE_COMMAND_PARSER(unary) {
DECLARE_ZONE_PARSER(limits) {
debugC(7, kDebugParser, "ZONE_PARSER(limits) ");
- if (isalpha(_tokens[1][1])) {
+ if (isalpha(static_cast<unsigned char>(_tokens[1][1]))) {
ctxt.z->_flags |= kFlagsAnimLinked;
ctxt.z->_linkedName = _tokens[1];
} else {
@@ -1003,7 +1003,7 @@ DECLARE_INSTRUCTION_PARSER(text) {
int _si = 1;
- if (isdigit(_tokens[1][1])) {
+ if (isdigit(static_cast<unsigned char>(_tokens[1][1]))) {
ctxt.inst->_y = atoi(_tokens[1]);
_si = 2;
} else {
@@ -1066,7 +1066,7 @@ DECLARE_INSTRUCTION_PARSER(endif) {
void ProgramParser_br::parseRValue(ScriptVar &v, const char *str) {
- if (isdigit(str[0]) || str[0] == '-') {
+ if (isdigit(static_cast<unsigned char>(str[0])) || str[0] == '-') {
v.setImmediate(atoi(str));
return;
}
diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp
index 213f0ae191..a73f1558e8 100644
--- a/engines/parallaction/parser_ns.cpp
+++ b/engines/parallaction/parser_ns.cpp
@@ -534,7 +534,7 @@ DECLARE_INSTRUCTION_PARSER(endscript) {
void ProgramParser_ns::parseRValue(ScriptVar &v, const char *str) {
- if (isdigit(str[0]) || str[0] == '-') {
+ if (isdigit(static_cast<unsigned char>(str[0])) || str[0] == '-') {
v.setImmediate(atoi(str));
return;
}
@@ -1334,6 +1334,21 @@ void LocationParser_ns::parseGetData(ZonePtr z) {
obj->x = z->getX();
obj->y = z->getY();
obj->_prog = _zoneProg;
+
+ // WORKAROUND for script bug #2969913
+ // The katana object has the same default z index (kGfxObjGetZ or -100)
+ // as the cripta object (the safe) - a script bug.
+ // Game scripts do not set an explicit z for the katana (as it isn't an
+ // animation), but rather rely on the draw order to draw it over the
+ // safe. In this particular case, the safe is added to the scene after
+ // the katana, thus it is drawn over the katana. We explicitly set the
+ // z index of the katana to be higher than the safe, so that the katana
+ // is drawn correctly over it.
+ // This is a regression from the graphics rewrite (commits be2c5d3,
+ // 3c2c16c and 44906f5).
+ if (!scumm_stricmp(obj->getName(), "katana"))
+ obj->z = 0;
+
bool visible = (z->_flags & kFlagsRemove) == 0;
_vm->_gfx->showGfxObj(obj, visible);
data->_gfxobj = obj;
diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h
index d0b5e5c175..e875e69334 100644
--- a/engines/parallaction/sound.h
+++ b/engines/parallaction/sound.h
@@ -26,10 +26,9 @@
#include "common/util.h"
#include "common/mutex.h"
+#include "audio/mixer.h"
#include "audio/audiostream.h"
#include "audio/decoders/iff_sound.h"
-#include "audio/mixer.h"
-#include "audio/mididrv.h"
#define PATH_LEN 200
diff --git a/engines/parallaction/walk.cpp b/engines/parallaction/walk.cpp
index 5d5695ace4..53237db4ef 100644
--- a/engines/parallaction/walk.cpp
+++ b/engines/parallaction/walk.cpp
@@ -26,8 +26,6 @@
namespace Parallaction {
-#define IS_PATH_CLEAR(x,y) _vm->_gfx->_backgroundInfo->_path->getValue((x), (y))
-
enum {
WALK_LEFT = 0,
WALK_RIGHT = 1,
@@ -56,21 +54,45 @@ WalkFrames _char24WalkFrames_NS = {
{ 2, 2, 4, 4 }
};
+static int getPathWidth() {
+ if (!_vm->_gfx->_backgroundInfo->_path) {
+ warning("getPathWidth() _path is NULL!");
+ return 0;
+ } else
+ return _vm->_gfx->_backgroundInfo->_path->w;
+}
+
+static int getPathHeight() {
+ if (!_vm->_gfx->_backgroundInfo->_path) {
+ warning("getPathHeight() _path is NULL!");
+ return 0;
+ } else
+ return _vm->_gfx->_backgroundInfo->_path->h;
+}
+
+static bool isPathClear(uint16 x, uint16 y) {
+ if (!_vm->_gfx->_backgroundInfo->_path) {
+ warning("isPathClear() _path is NULL!");
+ return false;
+ } else
+ return (_vm->_gfx->_backgroundInfo->_path->getValue(x, y) ? true : false);
+}
+
// adjusts position towards nearest walkable point
void PathWalker_NS::correctPathPoint(Common::Point &to) {
- if (IS_PATH_CLEAR(to.x, to.y)) return;
+ if (isPathClear(to.x, to.y)) return;
- int maxX = _vm->_gfx->_backgroundInfo->_path->w;
- int maxY = _vm->_gfx->_backgroundInfo->_path->h;
+ int maxX = getPathWidth();
+ int maxY = getPathHeight();
int16 right = to.x;
int16 left = to.x;
do {
right++;
- } while ((right < maxX) && !IS_PATH_CLEAR(right, to.y));
+ } while ((right < maxX) && !isPathClear(right, to.y));
do {
left--;
- } while ((left > 0) && !IS_PATH_CLEAR(left, to.y));
+ } while ((left > 0) && !isPathClear(left, to.y));
right = (right == maxX) ? 1000 : right - to.x;
left = (left == 0) ? 1000 : to.x - left;
@@ -78,10 +100,10 @@ void PathWalker_NS::correctPathPoint(Common::Point &to) {
int16 bottom = to.y;
do {
top--;
- } while ((top > 0) && !IS_PATH_CLEAR(to.x, top));
+ } while ((top > 0) && !isPathClear(to.x, top));
do {
bottom++;
- } while ((bottom < maxY) && !IS_PATH_CLEAR(to.x, bottom));
+ } while ((bottom < maxY) && !isPathClear(to.x, bottom));
top = (top == 0) ? 1000 : to.y - top;
bottom = (bottom == maxY) ? 1000 : bottom - to.y;
@@ -203,10 +225,10 @@ uint16 PathWalker_NS::walkFunc1(const Common::Point &to, Common::Point& node) {
while (foot != arg) {
- if (foot.x < to.x && IS_PATH_CLEAR(foot.x + 1, foot.y)) foot.x++;
- if (foot.x > to.x && IS_PATH_CLEAR(foot.x - 1, foot.y)) foot.x--;
- if (foot.y < to.y && IS_PATH_CLEAR(foot.x, foot.y + 1)) foot.y++;
- if (foot.y > to.y && IS_PATH_CLEAR(foot.x, foot.y - 1)) foot.y--;
+ if (foot.x < to.x && isPathClear(foot.x + 1, foot.y)) foot.x++;
+ if (foot.x > to.x && isPathClear(foot.x - 1, foot.y)) foot.x--;
+ if (foot.y < to.y && isPathClear(foot.x, foot.y + 1)) foot.y++;
+ if (foot.y > to.y && isPathClear(foot.x, foot.y - 1)) foot.y--;
if (foot == v8 && foot != arg) {
// foot couldn't move and still away from target
@@ -215,10 +237,10 @@ uint16 PathWalker_NS::walkFunc1(const Common::Point &to, Common::Point& node) {
while (foot != arg) {
- if (foot.x < to.x && !IS_PATH_CLEAR(foot.x + 1, foot.y)) foot.x++;
- if (foot.x > to.x && !IS_PATH_CLEAR(foot.x - 1, foot.y)) foot.x--;
- if (foot.y < to.y && !IS_PATH_CLEAR(foot.x, foot.y + 1)) foot.y++;
- if (foot.y > to.y && !IS_PATH_CLEAR(foot.x, foot.y - 1)) foot.y--;
+ if (foot.x < to.x && !isPathClear(foot.x + 1, foot.y)) foot.x++;
+ if (foot.x > to.x && !isPathClear(foot.x - 1, foot.y)) foot.x--;
+ if (foot.y < to.y && !isPathClear(foot.x, foot.y + 1)) foot.y++;
+ if (foot.y > to.y && !isPathClear(foot.x, foot.y - 1)) foot.y--;
if (foot == v8 && foot != arg)
return 0;
@@ -238,19 +260,19 @@ uint16 PathWalker_NS::walkFunc1(const Common::Point &to, Common::Point& node) {
}
void PathWalker_NS::clipMove(Common::Point& pos, const Common::Point& to) {
- if ((pos.x < to.x) && (pos.x < _vm->_gfx->_backgroundInfo->_path->w) && IS_PATH_CLEAR(pos.x + 2, pos.y)) {
+ if ((pos.x < to.x) && (pos.x < getPathWidth()) && isPathClear(pos.x + 2, pos.y)) {
pos.x = (pos.x + 2 < to.x) ? pos.x + 2 : to.x;
}
- if ((pos.x > to.x) && (pos.x > 0) && IS_PATH_CLEAR(pos.x - 2, pos.y)) {
+ if ((pos.x > to.x) && (pos.x > 0) && isPathClear(pos.x - 2, pos.y)) {
pos.x = (pos.x - 2 > to.x) ? pos.x - 2 : to.x;
}
- if ((pos.y < to.y) && (pos.y < _vm->_gfx->_backgroundInfo->_path->h) && IS_PATH_CLEAR(pos.x, pos.y + 2)) {
+ if ((pos.y < to.y) && (pos.y < getPathHeight()) && isPathClear(pos.x, pos.y + 2)) {
pos.y = (pos.y + 2 <= to.y) ? pos.y + 2 : to.y;
}
- if ((pos.y > to.y) && (pos.y > 0) && IS_PATH_CLEAR(pos.x, pos.y - 2)) {
+ if ((pos.y > to.y) && (pos.y > 0) && isPathClear(pos.x, pos.y - 2)) {
pos.y = (pos.y - 2 >= to.y) ? pos.y - 2 : to.y;
}
}
@@ -368,10 +390,10 @@ bool PathWalker_BR::directPathExists(const Common::Point &from, const Common::Po
Common::Point p(copy);
while (p != to) {
- if (p.x < to.x && IS_PATH_CLEAR(p.x + 1, p.y)) p.x++;
- if (p.x > to.x && IS_PATH_CLEAR(p.x - 1, p.y)) p.x--;
- if (p.y < to.y && IS_PATH_CLEAR(p.x, p.y + 1)) p.y++;
- if (p.y > to.y && IS_PATH_CLEAR(p.x, p.y - 1)) p.y--;
+ if (p.x < to.x && isPathClear(p.x + 1, p.y)) p.x++;
+ if (p.x > to.x && isPathClear(p.x - 1, p.y)) p.x--;
+ if (p.y < to.y && isPathClear(p.x, p.y + 1)) p.y++;
+ if (p.y > to.y && isPathClear(p.x, p.y - 1)) p.y--;
if (p == copy && p != to)
return false;
@@ -620,7 +642,7 @@ void PathWalker_BR::doWalk(State &s) {
assert (!s._walkPath.empty());
Common::Point p(*s._walkPath.begin());
- if (s._startFoot.y < p.y && (s._startFoot.y + yStep) < maxY && IS_PATH_CLEAR(s._startFoot.x, s._startFoot.y + yStep)) {
+ if (s._startFoot.y < p.y && (s._startFoot.y + yStep) < maxY && isPathClear(s._startFoot.x, s._startFoot.y + yStep)) {
if (yStep + s._startFoot.y <= p.y) {
s._stillWalkingTowardsNode = true;
delta.y = yStep;
@@ -631,7 +653,7 @@ void PathWalker_BR::doWalk(State &s) {
}
s._dirFrame = 9;
} else
- if (s._startFoot.y > p.y && (s._startFoot.y - yStep) > minY && IS_PATH_CLEAR(s._startFoot.x, s._startFoot.y - yStep)) {
+ if (s._startFoot.y > p.y && (s._startFoot.y - yStep) > minY && isPathClear(s._startFoot.x, s._startFoot.y - yStep)) {
if (s._startFoot.y - yStep >= p.y) {
s._stillWalkingTowardsNode = true;
delta.y = yStep;
@@ -643,7 +665,7 @@ void PathWalker_BR::doWalk(State &s) {
s._dirFrame = 0;
}
- if (s._startFoot.x < p.x && (s._startFoot.x + xStep) < maxX && IS_PATH_CLEAR(s._startFoot.x + xStep, s._startFoot.y)) {
+ if (s._startFoot.x < p.x && (s._startFoot.x + xStep) < maxX && isPathClear(s._startFoot.x + xStep, s._startFoot.y)) {
if (s._startFoot.x + xStep <= p.x) {
s._stillWalkingTowardsNode = true;
delta.x = xStep;
@@ -656,7 +678,7 @@ void PathWalker_BR::doWalk(State &s) {
s._dirFrame = 18; // right
}
} else
- if (s._startFoot.x > p.x && (s._startFoot.x - xStep) > minX && IS_PATH_CLEAR(s._startFoot.x - xStep, s._startFoot.y)) {
+ if (s._startFoot.x > p.x && (s._startFoot.x - xStep) > minX && isPathClear(s._startFoot.x - xStep, s._startFoot.y)) {
if (s._startFoot.x - xStep >= p.x) {
s._stillWalkingTowardsNode = true;
delta.x = xStep;
diff --git a/engines/queen/command.h b/engines/queen/command.h
index aa72537a9f..6865aa80a2 100644
--- a/engines/queen/command.h
+++ b/engines/queen/command.h
@@ -234,4 +234,3 @@ private:
} // End of namespace Queen
#endif
-
diff --git a/engines/queen/credits.cpp b/engines/queen/credits.cpp
index d503562601..43e3bc7c6a 100644
--- a/engines/queen/credits.cpp
+++ b/engines/queen/credits.cpp
@@ -141,4 +141,3 @@ void Credits::update() {
} // End of namespace Queen
-
diff --git a/engines/queen/graphics.cpp b/engines/queen/graphics.cpp
index d9a8a10d70..fbb72fde44 100644
--- a/engines/queen/graphics.cpp
+++ b/engines/queen/graphics.cpp
@@ -1201,7 +1201,7 @@ void BamScene::updateCarAnimation() {
}
void BamScene::updateFightAnimation() {
- static const BamDataBlock *fightDataBlocks[] = {
+ static const BamDataBlock *const fightDataBlocks[] = {
_fight1Data,
_fight2Data,
_fight3Data
diff --git a/engines/queen/input.cpp b/engines/queen/input.cpp
index 5a04b0f8a4..30bf681e63 100644
--- a/engines/queen/input.cpp
+++ b/engines/queen/input.cpp
@@ -30,7 +30,7 @@
namespace Queen {
-const char *Input::_commandKeys[] = {
+const char *const Input::_commandKeys[] = {
"ocmglptu", // English
"osbgpnre", // German
"ofdnepau", // French
diff --git a/engines/queen/input.h b/engines/queen/input.h
index 93e2bde638..0aa04dd026 100644
--- a/engines/queen/input.h
+++ b/engines/queen/input.h
@@ -141,7 +141,7 @@ private:
const char *_currentCommandKeys;
//! command keys for all languages
- static const char *_commandKeys[];
+ static const char *const _commandKeys[];
//! verbs matching the command keys
static const Verb _verbKeys[];
diff --git a/engines/queen/musicdata.cpp b/engines/queen/musicdata.cpp
index d3974dcdbf..a046355446 100644
--- a/engines/queen/musicdata.cpp
+++ b/engines/queen/musicdata.cpp
@@ -1495,7 +1495,7 @@ const TuneData Sound::_tune[] = {
{ { 77, 1017, 0 }, { 0, 0 }, 1, 0 }
};
-const char *Sound::_sfxName[] = {
+const char *const Sound::_sfxName[] = {
/* 1 - Door Open (standard) */
"116Bssss",
diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index a10e74bfd8..c610ef9921 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -120,13 +120,13 @@ GameList QueenMetaEngine::detectGames(const Common::FSList &fslist) const {
GameDescriptor dg(queenGameDescriptor.gameid, queenGameDescriptor.description, version.language, version.platform);
if (version.features & Queen::GF_DEMO) {
dg.updateDesc("Demo");
- dg.setGUIOptions(Common::GUIO_NOSPEECH);
+ dg.setGUIOptions(GUIO_NOSPEECH);
} else if (version.features & Queen::GF_INTERVIEW) {
dg.updateDesc("Interview");
- dg.setGUIOptions(Common::GUIO_NOSPEECH);
+ dg.setGUIOptions(GUIO_NOSPEECH);
} else if (version.features & Queen::GF_FLOPPY) {
dg.updateDesc("Floppy");
- dg.setGUIOptions(Common::GUIO_NOSPEECH);
+ dg.setGUIOptions(GUIO_NOSPEECH);
} else if (version.features & Queen::GF_TALKIE) {
dg.updateDesc("Talkie");
}
diff --git a/engines/queen/resource.cpp b/engines/queen/resource.cpp
index d837a63cb5..84043fa3af 100644
--- a/engines/queen/resource.cpp
+++ b/engines/queen/resource.cpp
@@ -30,7 +30,7 @@
namespace Queen {
-const char *Resource::_tableFilename = "queen.tbl";
+const char *const Resource::_tableFilename = "queen.tbl";
const RetailGameVersion Resource::_gameVersions[] = {
{ "PEM10", 1, 0x00000008, 22677657 },
diff --git a/engines/queen/resource.h b/engines/queen/resource.h
index 5c6746e92f..ef8e463631 100644
--- a/engines/queen/resource.h
+++ b/engines/queen/resource.h
@@ -158,7 +158,7 @@ protected:
static const RetailGameVersion *detectGameVersionFromSize(uint32 size);
//! resource table filename (queen.tbl)
- static const char *_tableFilename;
+ static const char *const _tableFilename;
//! known FOTAQ versions
static const RetailGameVersion _gameVersions[];
diff --git a/engines/queen/sound.h b/engines/queen/sound.h
index 2aabb0d73b..371500f356 100644
--- a/engines/queen/sound.h
+++ b/engines/queen/sound.h
@@ -104,7 +104,7 @@ public:
static const SongData _song[];
static const TuneData _tuneDemo[];
static const TuneData _tune[];
- static const char *_sfxName[];
+ static const char *const _sfxName[];
static const int16 _jungleList[];
protected:
diff --git a/engines/queen/talk.cpp b/engines/queen/talk.cpp
index b83bf60435..1f8d9b29f9 100644
--- a/engines/queen/talk.cpp
+++ b/engines/queen/talk.cpp
@@ -658,7 +658,7 @@ void Talk::stringAnimation(const SpeechParameters *parameters, int startFrame, i
} else if (parameters->animation[0] == 'E') {
// Talking head animation
return;
- } else if (!isdigit(parameters->animation[0])) {
+ } else if (!isdigit(static_cast<unsigned char>(parameters->animation[0]))) {
debug(6, "Error in speak string animation: '%s'", parameters->animation);
return;
} else
diff --git a/engines/saga/actor.cpp b/engines/saga/actor.cpp
index 862a0b4d64..06ce335518 100644
--- a/engines/saga/actor.cpp
+++ b/engines/saga/actor.cpp
@@ -385,6 +385,7 @@ void Actor::loadActorList(int protagonistIdx, int actorCount, int actorsResource
ByteArrayReadStreamEndian actorS(actorListData);
+ _actors.clear();
_actors.resize(actorCount);
i = 0;
for (ActorDataArray::iterator actor = _actors.begin(); actor != _actors.end(); ++actor, i++) {
diff --git a/engines/saga/actor.h b/engines/saga/actor.h
index a4f475660d..d9d4b70168 100644
--- a/engines/saga/actor.h
+++ b/engines/saga/actor.h
@@ -650,7 +650,7 @@ private:
public:
#ifdef ACTOR_DEBUG
#ifndef SAGA_DEBUG
- you must also define SAGA_DEBUG
+ #error You must also define SAGA_DEBUG
#endif
//path debug - use with care
struct DebugPoint {
diff --git a/engines/saga/actor_walk.cpp b/engines/saga/actor_walk.cpp
index 5607fcdd66..ea33a0950d 100644
--- a/engines/saga/actor_walk.cpp
+++ b/engines/saga/actor_walk.cpp
@@ -1165,7 +1165,15 @@ void Actor::moveDragon(ActorData *actor) {
dir0 = actor->_actionDirection;
dir1 = actor->_tileDirections[actor->_walkStepIndex++];
dir2 = actor->_tileDirections[actor->_walkStepIndex];
- dir3 = actor->_tileDirections[actor->_walkStepIndex + 1];
+ // Fix for Bug #3324850 ("ITE (SAGA): crash in dog sewers")
+ // If there were more than two steps left, get the third (next) step.
+ // Otherwise, store the second step again so the anim looks right.
+ // (If you stop the move instead, Rif isn't automatically knocked into
+ // the Sewer.)
+ if (actor->_walkStepIndex + 1 < actor->_walkStepsCount)
+ dir3 = actor->_tileDirections[actor->_walkStepIndex + 1];
+ else
+ dir3 = dir2;
if (dir0 != dir1){
actor->_actionDirection = dir0 = dir1;
diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp
index 7a98fe4164..091ec8d427 100644
--- a/engines/saga/detection.cpp
+++ b/engines/saga/detection.cpp
@@ -67,9 +67,6 @@ int SagaEngine::getGameId() const { return _gameDescription->gameId; }
uint32 SagaEngine::getFeatures() const {
uint32 result = _gameDescription->features;
- if (_gf_wyrmkeep)
- result |= GF_WYRMKEEP;
-
return result;
}
@@ -259,13 +256,7 @@ SaveStateDescriptor SagaMetaEngine::querySaveMetaInfos(const char *target, int s
desc.setWriteProtectedFlag(false);
if (version >= 6) {
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- if (!Graphics::loadThumbnail(*in, *thumbnail)) {
- delete thumbnail;
- thumbnail = 0;
- }
-
+ Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in);
desc.setThumbnail(thumbnail);
uint32 saveDate = in->readUint32BE();
diff --git a/engines/saga/detection_tables.h b/engines/saga/detection_tables.h
index ab73fcba6e..863c2cee64 100644
--- a/engines/saga/detection_tables.h
+++ b/engines/saga/detection_tables.h
@@ -164,9 +164,6 @@ static const GamePatchDescription ITEMacPatch_Files[] = {
{ NULL, 0, 0}
};
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-
static const SAGAGameDescription gameDescriptions[] = {
// ITE Section ////////////////////////////////////////////////////////////////////////////////////////////
@@ -193,7 +190,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_ITE, // Game id
GF_OLD_ITE_DOS, // features
@@ -218,10 +215,10 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_ITE,
- GF_WYRMKEEP | GF_SCENE_SUBSTITUTES | GF_MONO_MUSIC | GF_LE_VOICES,
+ 0,
ITE_DEFAULT_SCENE,
&ITE_Resources,
ARRAYSIZE(ITEWINDEMO_GameFonts),
@@ -244,10 +241,10 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_ITE,
- GF_WYRMKEEP | GF_LE_VOICES,
+ 0,
ITE_DEFAULT_SCENE,
&ITE_Resources,
ARRAYSIZE(ITEWINDEMO_GameFonts),
@@ -270,10 +267,10 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_ITE,
- GF_WYRMKEEP | GF_SCENE_SUBSTITUTES,
+ 0,
ITE_DEFAULT_SCENE,
&ITE_Resources,
ARRAYSIZE(ITEWINDEMO_GameFonts),
@@ -296,10 +293,10 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_ITE,
- GF_WYRMKEEP | GF_8BIT_UNSIGNED_PCM,
+ GF_8BIT_UNSIGNED_PCM,
ITE_DEFAULT_SCENE,
&ITE_Resources,
ARRAYSIZE(ITEWINDEMO_GameFonts),
@@ -328,8 +325,8 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformMacintosh,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
GF_8BIT_UNSIGNED_PCM,
@@ -352,11 +349,11 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformMacintosh,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
- GF_WYRMKEEP,
+ 0,
ITE_DEFAULT_SCENE,
&ITE_Resources,
ARRAYSIZE(ITEWINDEMO_GameFonts),
@@ -384,11 +381,11 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformUnknown,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
- GF_WYRMKEEP,
+ 0,
ITE_DEFAULT_SCENE,
&ITE_Resources,
ARRAYSIZE(ITE_GameFonts),
@@ -414,11 +411,11 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::IT_ITA,
Common::kPlatformUnknown,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
- GF_WYRMKEEP,
+ 0,
ITE_DEFAULT_SCENE,
&ITE_Resources,
ARRAYSIZE(ITE_GameFonts),
@@ -438,8 +435,8 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
GF_EXTRA_ITE_CREDITS,
@@ -462,8 +459,8 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::IT_ITA,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
0,
@@ -486,8 +483,8 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
0,
@@ -511,8 +508,8 @@ static const SAGAGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_ITE,
0,
@@ -539,7 +536,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_ITE,
GF_ITE_FLOPPY,
@@ -563,7 +560,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_ITE,
GF_ITE_FLOPPY,
@@ -587,7 +584,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_ITE,
GF_ITE_FLOPPY,
@@ -620,7 +617,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_IHNM,
0,
@@ -652,7 +649,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_IHNM,
0,
@@ -682,7 +679,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_IHNM,
0,
@@ -710,7 +707,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_IHNM,
0,
@@ -739,7 +736,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_IHNM,
0,
@@ -767,7 +764,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_IHNM,
0,
@@ -792,7 +789,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_IHNM,
0,
@@ -822,7 +819,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DINO,
0,
@@ -852,7 +849,7 @@ static const SAGAGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_FTA2,
0,
diff --git a/engines/saga/input.cpp b/engines/saga/input.cpp
index 69a353da9f..8576a3e536 100644
--- a/engines/saga/input.cpp
+++ b/engines/saga/input.cpp
@@ -158,4 +158,3 @@ Point SagaEngine::mousePos() const {
}
} // End of namespace Saga
-
diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp
index 08c5ddc6f9..994b35cbf8 100644
--- a/engines/saga/interface.cpp
+++ b/engines/saga/interface.cpp
@@ -320,10 +320,11 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) {
_disableAbortSpeeches = false;
// set save game reminder alarm
- _vm->getTimerManager()->installTimerProc(&saveReminderCallback, TIMETOSAVE, this);
+ _vm->getTimerManager()->installTimerProc(&saveReminderCallback, TIMETOSAVE, this, "sagaSaveReminder");
}
Interface::~Interface() {
+ _vm->getTimerManager()->removeTimerProc(&saveReminderCallback);
}
void Interface::saveReminderCallback(void *refCon) {
@@ -335,7 +336,7 @@ void Interface::updateSaveReminder() {
_saveReminderState = _saveReminderState % _vm->getDisplayInfo().saveReminderNumSprites + 1;
drawStatusBar();
_vm->getTimerManager()->removeTimerProc(&saveReminderCallback);
- _vm->getTimerManager()->installTimerProc(&saveReminderCallback, ((_vm->getGameId() == GID_ITE) ? TIMETOBLINK_ITE : TIMETOBLINK_IHNM), this);
+ _vm->getTimerManager()->installTimerProc(&saveReminderCallback, ((_vm->getGameId() == GID_ITE) ? TIMETOBLINK_ITE : TIMETOBLINK_IHNM), this, "sagaSaveReminder");
}
}
@@ -1390,7 +1391,7 @@ void Interface::setSave(PanelButton *panelButton) {
void Interface::resetSaveReminder() {
_vm->getTimerManager()->removeTimerProc(&saveReminderCallback);
- _vm->getTimerManager()->installTimerProc(&saveReminderCallback, TIMETOSAVE, this);
+ _vm->getTimerManager()->installTimerProc(&saveReminderCallback, TIMETOSAVE, this, "sagaSaveReminder");
setSaveReminderState(1);
}
diff --git a/engines/saga/introproc_ite.cpp b/engines/saga/introproc_ite.cpp
index 87fd48e2d2..9248f2b530 100644
--- a/engines/saga/introproc_ite.cpp
+++ b/engines/saga/introproc_ite.cpp
@@ -179,21 +179,22 @@ enum {
EventColumns *Scene::ITEQueueCredits(int delta_time, int duration, int n_credits, const IntroCredit credits[]) {
int game;
Common::Language lang;
+ bool hasWyrmkeepCredits = (Common::File::exists("credit3n.dlt") || // PC
+ Common::File::exists("credit3m.dlt")); // Mac
// The assumption here is that all WyrmKeep versions have the same
// credits, regardless of which operating system they're for.
lang = _vm->getLanguage();
- if (_vm->getFeatures() & GF_WYRMKEEP) {
+ if (hasWyrmkeepCredits)
game = kITEWyrmKeep;
- } else if (_vm->getPlatform() == Common::kPlatformMacintosh) {
+ else if (_vm->getPlatform() == Common::kPlatformMacintosh)
game = kITEMac;
- } else if (_vm->getFeatures() & GF_EXTRA_ITE_CREDITS) {
+ else if (_vm->getFeatures() & GF_EXTRA_ITE_CREDITS)
game = kITEPCCD;
- } else {
+ else
game = kITEPC;
- }
int line_spacing = 0;
int paragraph_spacing;
@@ -303,6 +304,11 @@ int Scene::SC_ITEIntroAnimProc(int param, void *refCon) {
int Scene::ITEIntroAnimProc(int param) {
Event event;
EventColumns *eventColumns;
+ bool isMac = _vm->getPlatform() == Common::kPlatformMacintosh;
+ bool isMultiCD = _vm->getPlatform() == Common::kPlatformUnknown;
+ bool hasWyrmkeepCredits = (Common::File::exists("credit3n.dlt") || // PC
+ Common::File::exists("credit3m.dlt")); // Mac
+ bool isDemo = Common::File::exists("scriptsd.rsc");
switch (param) {
case SCENE_BEGIN:{
@@ -324,19 +330,10 @@ int Scene::ITEIntroAnimProc(int param) {
// playback
int lastAnim;
- if (_vm->getFeatures() & GF_WYRMKEEP) {
- if (_vm->getPlatform() == Common::kPlatformMacintosh) {
- lastAnim = 3;
- } else {
- lastAnim = 2;
- }
- } else {
- if (_vm->getPlatform() == Common::kPlatformMacintosh) {
- lastAnim = 4;
- } else {
- lastAnim = 5;
- }
- }
+ if (hasWyrmkeepCredits || isMultiCD || isDemo)
+ lastAnim = isMac ? 3 : 2;
+ else
+ lastAnim = isMac ? 4 : 5;
for (int i = 0; i < lastAnim; i++)
_vm->_anim->link(i, i+1);
diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp
index 21f3cc489e..13850a0b6d 100644
--- a/engines/saga/music.cpp
+++ b/engines/saga/music.cpp
@@ -213,7 +213,7 @@ void Music::setVolume(int volume, int time) {
return;
}
- _vm->getTimerManager()->installTimerProc(&musicVolumeGaugeCallback, time * 3000L, this);
+ _vm->getTimerManager()->installTimerProc(&musicVolumeGaugeCallback, time * 3000L, this, "sagaMusicVolume");
}
bool Music::isPlaying() {
@@ -287,7 +287,12 @@ void Music::play(uint32 resourceId, MusicFlags flags) {
if (_vm->isBigEndian())
musicFlags &= ~Audio::FLAG_LITTLE_ENDIAN;
- if (_vm->getFeatures() & GF_MONO_MUSIC)
+ // The newer ITE Mac demo version contains a music file, but it has mono music.
+ // This is the only music file that is about 7MB, whereas all the other ones
+ // are much larger. Thus, we use this simple heuristic to determine if we got
+ // mono music in the ITE demos or not.
+ if (!strcmp(_digitalMusicContext->fileName(), "musicd.rsc") &&
+ _digitalMusicContext->fileSize() < 8000000)
musicFlags &= ~Audio::FLAG_STEREO;
audioStream = Audio::makeRawStream(musicStream, 11025, musicFlags, DisposeAfterUse::YES);
@@ -368,10 +373,12 @@ void Music::play(uint32 resourceId, MusicFlags flags) {
void Music::pause() {
_player->pause();
+ _player->setVolume(0);
}
void Music::resume() {
_player->resume();
+ _player->setVolume(_vm->_musicVolume);
}
void Music::stop() {
@@ -379,4 +386,3 @@ void Music::stop() {
}
} // End of namespace Saga
-
diff --git a/engines/saga/palanim.h b/engines/saga/palanim.h
index 9959d08e2f..920cbec65a 100644
--- a/engines/saga/palanim.h
+++ b/engines/saga/palanim.h
@@ -53,4 +53,3 @@ class PalAnim {
} // End of namespace Saga
#endif
-
diff --git a/engines/saga/puzzle.cpp b/engines/saga/puzzle.cpp
index d5d83c706f..63d9a88fee 100644
--- a/engines/saga/puzzle.cpp
+++ b/engines/saga/puzzle.cpp
@@ -140,7 +140,7 @@ void Puzzle::initPieceInfo(int i, int16 curX, int16 curY, byte offX, byte offY,
void Puzzle::execute() {
_active = true;
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime, this, "sagaPuzzleHint");
initPieces();
@@ -408,12 +408,12 @@ void Puzzle::solicitHint() {
switch (_hintRqState) {
case kRQSpeaking:
if (_vm->_actor->isSpeaking()) {
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50 * 1000000, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50 * 1000000, this, "sagaPuzzleHint");
break;
}
_hintRqState = _hintNextRqState;
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 100*1000000/3, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 100*1000000/3, this, "sagaPuzzleHint");
break;
case kRQNoHint:
@@ -436,11 +436,11 @@ void Puzzle::solicitHint() {
// Roll to see if Sakka scolds
if (_vm->_rnd.getRandomNumber(1)) {
_hintRqState = kRQSakkaDenies;
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 200*1000000, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 200*1000000, this, "sagaPuzzleHint");
} else {
_hintRqState = kRQSpeaking;
_hintNextRqState = kRQHintRequested;
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50*1000000, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50*1000000, this, "sagaPuzzleHint");
}
break;
@@ -453,7 +453,7 @@ void Puzzle::solicitHint() {
_hintRqState = kRQSpeaking;
_hintNextRqState = kRQHintRequestedStage2;
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50*1000000, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50*1000000, this, "sagaPuzzleHint");
_vm->_interface->converseClear();
_vm->_interface->converseAddText(optionsStr[_lang][kROAccept], 0, 1, 0, 0);
@@ -480,7 +480,7 @@ void Puzzle::solicitHint() {
_vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0, 0);
_vm->_interface->converseDisplayText();
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime, this, "sagaPuzzleHint");
_hintRqState = kRQSkipEverything;
break;
@@ -504,7 +504,7 @@ void Puzzle::handleReply(int reply) {
_vm->_actor->abortSpeech();
_hintRqState = kRQNoHint;
_vm->getTimerManager()->removeTimerProc(&hintTimerCallback);
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime * 2, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime * 2, this, "sagaPuzzleHint");
clearHint();
break;
}
@@ -566,7 +566,7 @@ void Puzzle::giveHint() {
_vm->_interface->converseDisplayText();
_vm->getTimerManager()->removeTimerProc(&hintTimerCallback);
- _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime, this);
+ _vm->getTimerManager()->installTimerProc(&hintTimerCallback, kPuzzleHintTime, this, "sagaPuzzleHint");
}
void Puzzle::clearHint() {
diff --git a/engines/saga/render.cpp b/engines/saga/render.cpp
index 757374a3a3..a9ef23381e 100644
--- a/engines/saga/render.cpp
+++ b/engines/saga/render.cpp
@@ -50,7 +50,7 @@ Render::Render(SagaEngine *vm, OSystem *system) {
#ifdef SAGA_DEBUG
// Initialize FPS timer callback
- _vm->getTimerManager()->installTimerProc(&fpsTimerCallback, 1000000, this);
+ _vm->getTimerManager()->installTimerProc(&fpsTimerCallback, 1000000, this, "sagaFPS");
#endif
_backGroundSurface.create(_vm->getDisplayInfo().width, _vm->getDisplayInfo().height, Graphics::PixelFormat::createFormatCLUT8());
diff --git a/engines/saga/resource.cpp b/engines/saga/resource.cpp
index 72b021309c..1b0dfa2f22 100644
--- a/engines/saga/resource.cpp
+++ b/engines/saga/resource.cpp
@@ -162,12 +162,6 @@ bool Resource::createContexts() {
uint16 voiceFileAddType;
};
-
- // If the Wyrmkeep credits file is found, set the Wyrmkeep version flag to true
- if (Common::File::exists("credit3n.dlt")) {
- _vm->_gf_wyrmkeep = true;
- }
-
for (const ADGameFileDescription *gameFileDescription = _vm->getFilesDescriptions();
gameFileDescription->fileName; gameFileDescription++) {
addContext(gameFileDescription->fileName, gameFileDescription->fileType);
diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp
index d168605e99..6e272d37c0 100644
--- a/engines/saga/saga.cpp
+++ b/engines/saga/saga.cpp
@@ -72,9 +72,8 @@ SagaEngine::SagaEngine(OSystem *syst, const SAGAGameDescription *gameDesc)
_readingSpeed = 0;
_copyProtection = false;
- _gf_wyrmkeep = false;
_musicWasPlaying = false;
-
+ _hasITESceneSubstitutes = false;
_sndRes = NULL;
_sound = NULL;
@@ -211,9 +210,9 @@ Common::Error SagaEngine::run() {
_subtitlesEnabled = ConfMan.getBool("subtitles");
_readingSpeed = getTalkspeed();
_copyProtection = ConfMan.getBool("copy_protection");
- _gf_wyrmkeep = false;
_musicWasPlaying = false;
_isIHNMDemo = Common::File::exists("music.res");
+ _hasITESceneSubstitutes = Common::File::exists("boarhall.bbm");
if (_readingSpeed > 3)
_readingSpeed = 0;
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index 23258e1277..fb01b1ac5d 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -29,7 +29,6 @@
#include "common/random.h"
#include "common/memstream.h"
#include "common/textconsole.h"
-#include "audio/mididrv.h"
#include "saga/gfx.h"
@@ -137,16 +136,12 @@ enum GameFileTypes {
};
enum GameFeatures {
- GF_WYRMKEEP = 1 << 0,
- GF_ITE_FLOPPY = 1 << 1,
- GF_SCENE_SUBSTITUTES = 1 << 2,
+ GF_ITE_FLOPPY = 1 << 0,
#if 0
- GF_OLD_ITE_DOS = 1 << 3, // Currently unused
+ GF_OLD_ITE_DOS = 1 << 1, // Currently unused
#endif
- GF_MONO_MUSIC = 1 << 4,
- GF_EXTRA_ITE_CREDITS = 1 << 5,
- GF_LE_VOICES = 1 << 6,
- GF_8BIT_UNSIGNED_PCM = 1 << 7
+ GF_EXTRA_ITE_CREDITS = 1 << 2,
+ GF_8BIT_UNSIGNED_PCM = 1 << 3
};
enum VerbTypeIds {
@@ -532,9 +527,9 @@ public:
int _readingSpeed;
bool _copyProtection;
- bool _gf_wyrmkeep;
bool _musicWasPlaying;
bool _isIHNMDemo;
+ bool _hasITESceneSubstitutes;
SndRes *_sndRes;
Sound *_sound;
diff --git a/engines/saga/saveload.cpp b/engines/saga/saveload.cpp
index 8d7b718c09..9e0789fdaf 100644
--- a/engines/saga/saveload.cpp
+++ b/engines/saga/saveload.cpp
@@ -295,12 +295,7 @@ void SagaEngine::load(const char *fileName) {
if (_saveHeader.version >= 6) {
// We don't need the thumbnail here, so just read it and discard it
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- Graphics::loadThumbnail(*in, *thumbnail);
- thumbnail->free();
- delete thumbnail;
- thumbnail = 0;
+ Graphics::skipThumbnail(*in);
in->readUint32BE(); // save date
in->readUint16BE(); // save time
diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp
index 66ee8f4504..61e62d5626 100644
--- a/engines/saga/scene.cpp
+++ b/engines/saga/scene.cpp
@@ -451,7 +451,7 @@ void Scene::changeScene(int16 sceneNumber, int actorsEntrance, SceneTransitionTy
// This is used for latter ITE demos where all places on world map except
// Tent Faire are substituted with LBM picture and short description
- if (_vm->getFeatures() & GF_SCENE_SUBSTITUTES) {
+ if (_vm->_hasITESceneSubstitutes) {
for (int i = 0; i < ARRAYSIZE(sceneSubstitutes); i++) {
if (sceneSubstitutes[i].sceneId == sceneNumber) {
Surface bbmBuffer;
diff --git a/engines/saga/script.cpp b/engines/saga/script.cpp
index f4902b6c11..96746b538c 100644
--- a/engines/saga/script.cpp
+++ b/engines/saga/script.cpp
@@ -26,6 +26,7 @@
#include "saga/gfx.h"
#include "saga/console.h"
+#include "saga/animation.h"
#include "saga/script.h"
#include "saga/interface.h"
#include "saga/itedata.h"
@@ -941,6 +942,18 @@ void Script::opSpeak(SCRIPTOP_PARAMS) {
return;
}
+#ifdef ENABLE_IHNM
+ // WORKAROUND for script bug #3358007 in IHNM. When the zeppelin is landing
+ // and the player attempts to exit from the right door in room 13, the game
+ // scripts change to scene 5, but do not clear the cutaway that appears
+ // before Gorrister's speech starts, resulting in a deadlock. We do this
+ // manually here.
+ if (_vm->getGameId() == GID_IHNM && _vm->_scene->currentChapterNumber() == 1 &&
+ _vm->_scene->currentSceneNumber() == 5 && _vm->_anim->hasCutaway()) {
+ _vm->_anim->returnFromCutaway();
+ }
+#endif
+
int stringsCount = scriptS->readByte();
uint16 actorId = scriptS->readUint16LE();
uint16 speechFlags = scriptS->readByte();
diff --git a/engines/saga/shorten.cpp b/engines/saga/shorten.cpp
index 39af7aa3db..5efc8d1f67 100644
--- a/engines/saga/shorten.cpp
+++ b/engines/saga/shorten.cpp
@@ -541,4 +541,3 @@ Audio::AudioStream *makeShortenStream(Common::SeekableReadStream &stream) {
} // End of namespace Audio
#endif // defined(SOUND_SHORTEN_H)
-
diff --git a/engines/saga/shorten.h b/engines/saga/shorten.h
index f2114bedeb..77feafa54d 100644
--- a/engines/saga/shorten.h
+++ b/engines/saga/shorten.h
@@ -57,4 +57,3 @@ Audio::AudioStream *makeShortenStream(Common::ReadStream &stream);
#endif
#endif // engine and dynamic plugins guard
-
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp
index 2433c93e93..add34e22a2 100644
--- a/engines/saga/sndres.cpp
+++ b/engines/saga/sndres.cpp
@@ -262,9 +262,12 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
buffer.flags |= Audio::FLAG_UNSIGNED;
buffer.flags &= ~Audio::FLAG_16BITS;
} else {
- // Voice files in newer ITE demo versions are OKI ADPCM (VOX) encoded
- if (!uncompressedSound && !scumm_stricmp(context->fileName(), "voicesd.rsc"))
+ // Voice files in newer ITE demo versions are OKI ADPCM (VOX) encoded.
+ // These are LE in all the Windows and Mac demos
+ if (!uncompressedSound && !scumm_stricmp(context->fileName(), "voicesd.rsc")) {
resourceType = kSoundVOX;
+ buffer.flags |= Audio::FLAG_LITTLE_ENDIAN;
+ }
}
}
buffer.buffer = NULL;
@@ -272,8 +275,6 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
// Check for LE sounds
if (!context->isBigEndian())
buffer.flags |= Audio::FLAG_LITTLE_ENDIAN;
- if ((context->fileType() & GAME_VOICEFILE) && (_vm->getFeatures() & GF_LE_VOICES))
- buffer.flags |= Audio::FLAG_LITTLE_ENDIAN;
// Older Mac versions of ITE were Macbinary packed
int soundOffset = (context->fileType() & GAME_MACBINARY) ? 36 : 0;
diff --git a/engines/saga/sthread.cpp b/engines/saga/sthread.cpp
index ec81d8d733..6e5cc68ae6 100644
--- a/engines/saga/sthread.cpp
+++ b/engines/saga/sthread.cpp
@@ -102,9 +102,8 @@ void Script::wakeUpThreadsDelayed(int waitType, int sleepTime) {
void Script::executeThreads(uint msec) {
ScriptThreadList::iterator threadIterator;
- if (_vm->_interface->_statusTextInput) {
+ if (_vm->_interface->_statusTextInput)
return;
- }
threadIterator = _threadList.begin();
@@ -129,11 +128,10 @@ void Script::executeThreads(uint msec) {
switch (thread._waitType) {
case kWaitTypeDelay:
- if (thread._sleepTime < msec) {
+ if (thread._sleepTime < msec)
thread._sleepTime = 0;
- } else {
+ else
thread._sleepTime -= msec;
- }
if (thread._sleepTime == 0)
thread._flags &= ~kTFlagWaiting;
@@ -141,11 +139,9 @@ void Script::executeThreads(uint msec) {
case kWaitTypeWalk:
{
- ActorData *actor;
- actor = (ActorData *)thread._threadObj;
- if (actor->_currentAction == kActionWait) {
+ ActorData *actor = (ActorData *)thread._threadObj;
+ if (actor->_currentAction == kActionWait)
thread._flags &= ~kTFlagWaiting;
- }
}
break;
@@ -157,9 +153,8 @@ void Script::executeThreads(uint msec) {
}
if (!(thread._flags & kTFlagWaiting)) {
- if (runThread(thread)) {
+ if (runThread(thread))
break;
- }
}
++threadIterator;
@@ -236,4 +231,3 @@ bool Script::runThread(ScriptThread &thread) {
}
} // End of namespace Saga
-
diff --git a/engines/savestate.cpp b/engines/savestate.cpp
index 551c39b880..260c7cd3ff 100644
--- a/engines/savestate.cpp
+++ b/engines/savestate.cpp
@@ -24,53 +24,37 @@
#include "graphics/surface.h"
#include "common/textconsole.h"
-void SaveStateDescriptor::setThumbnail(Graphics::Surface *t) {
- if (_thumbnail.get() == t)
- return;
-
- _thumbnail = Common::SharedPtr<Graphics::Surface>(t, Graphics::SharedPtrSurfaceDeleter());
+SaveStateDescriptor::SaveStateDescriptor()
+ // FIXME: default to 0 (first slot) or to -1 (invalid slot) ?
+ : _slot(-1), _description(), _isDeletable(true), _isWriteProtected(false),
+ _saveDate(), _saveTime(), _playTime(), _thumbnail() {
}
-bool SaveStateDescriptor::getBool(const Common::String &key) const {
- if (contains(key)) {
- const Common::String value = getVal(key);
- bool valueAsBool;
- if (Common::parseBool(value, valueAsBool))
- return valueAsBool;
- error("SaveStateDescriptor: %s '%s' has unknown value '%s' for boolean '%s'",
- save_slot().c_str(), description().c_str(), value.c_str(), key.c_str());
- }
- return false;
+SaveStateDescriptor::SaveStateDescriptor(int s, const Common::String &d)
+ : _slot(s), _description(d), _isDeletable(true), _isWriteProtected(false),
+ _saveDate(), _saveTime(), _playTime(), _thumbnail() {
}
-void SaveStateDescriptor::setDeletableFlag(bool state) {
- setVal("is_deletable", state ? "true" : "false");
-}
+void SaveStateDescriptor::setThumbnail(Graphics::Surface *t) {
+ if (_thumbnail.get() == t)
+ return;
-void SaveStateDescriptor::setWriteProtectedFlag(bool state) {
- setVal("is_write_protected", state ? "true" : "false");
+ _thumbnail = Common::SharedPtr<Graphics::Surface>(t, Graphics::SharedPtrSurfaceDeleter());
}
void SaveStateDescriptor::setSaveDate(int year, int month, int day) {
- Common::String buffer;
- buffer = Common::String::format("%.2d.%.2d.%.4d", day, month, year);
- setVal("save_date", buffer);
+ _saveDate = Common::String::format("%.2d.%.2d.%.4d", day, month, year);
}
void SaveStateDescriptor::setSaveTime(int hour, int min) {
- Common::String buffer;
- buffer = Common::String::format("%.2d:%.2d", hour, min);
- setVal("save_time", buffer);
+ _saveTime = Common::String::format("%.2d:%.2d", hour, min);
}
void SaveStateDescriptor::setPlayTime(int hours, int minutes) {
- Common::String buffer;
- buffer = Common::String::format("%.2d:%.2d", hours, minutes);
- setVal("play_time", buffer);
+ _playTime = Common::String::format("%.2d:%.2d", hours, minutes);
}
void SaveStateDescriptor::setPlayTime(uint32 msecs) {
uint minutes = msecs / 60000;
setPlayTime(minutes / 60, minutes % 60);
}
-
diff --git a/engines/savestate.h b/engines/savestate.h
index df01732058..6cbdb22edf 100644
--- a/engines/savestate.h
+++ b/engines/savestate.h
@@ -24,7 +24,7 @@
#define ENGINES_SAVESTATE_H
#include "common/array.h"
-#include "common/hash-str.h"
+#include "common/str.h"
#include "common/ptr.h"
@@ -33,65 +33,60 @@ struct Surface;
}
/**
- * A hashmap describing details about a given save state.
- * TODO
- * Guaranteed to contain save_slot and description values.
- * Additional ideas: Playtime, creation date, thumbnail, ...
+ * Object describing a save state.
+ *
+ * This at least includes the save slot number and a human readable
+ * description of the save state.
+ *
+ * Further possibilites are a thumbnail, play time, creation date,
+ * creation time, delete protected, write protection.
*/
-class SaveStateDescriptor : public Common::StringMap {
-protected:
- Common::SharedPtr<Graphics::Surface> _thumbnail; // can be 0
-
+class SaveStateDescriptor {
public:
- SaveStateDescriptor() : _thumbnail() {
- setVal("save_slot", "-1"); // FIXME: default to 0 (first slot) or to -1 (invalid slot) ?
- setVal("description", "");
- }
-
- SaveStateDescriptor(int s, const Common::String &d) : _thumbnail() {
- setVal("save_slot", Common::String::format("%d", s));
- setVal("description", d);
- }
+ SaveStateDescriptor();
+ SaveStateDescriptor(int s, const Common::String &d);
- SaveStateDescriptor(const Common::String &s, const Common::String &d) : _thumbnail() {
- setVal("save_slot", s);
- setVal("description", d);
- }
-
- /** The saveslot id, as it would be passed to the "-x" command line switch. */
- Common::String &save_slot() { return getVal("save_slot"); }
+ /**
+ * @param slot The saveslot id, as it would be passed to the "-x" command line switch.
+ */
+ void setSaveSlot(int slot) { _slot = slot; }
- /** The saveslot id, as it would be passed to the "-x" command line switch (read-only variant). */
- const Common::String &save_slot() const { return getVal("save_slot"); }
+ /**
+ * @return The saveslot id, as it would be passed to the "-x" command line switch.
+ */
+ int getSaveSlot() const { return _slot; }
- /** A human readable description of the save state. */
- Common::String &description() { return getVal("description"); }
+ /**
+ * @param desc A human readable description of the save state.
+ */
+ void setDescription(const Common::String &desc) { _description = desc; }
- /** A human readable description of the save state (read-only variant). */
- const Common::String &description() const { return getVal("description"); }
+ /**
+ * @return A human readable description of the save state.
+ */
+ const Common::String &getDescription() const { return _description; }
/** Optional entries only included when querying via MetaEngine::querySaveMetaInfo */
/**
- * Returns the value of a given key as boolean.
- * It accepts 'true', 'yes' and '1' for true and
- * 'false', 'no' and '0' for false.
- * (FIXME:) On unknown value it errors out ScummVM.
- * On unknown key it returns false as default.
+ * Defines whether the save state is allowed to be deleted.
*/
- bool getBool(const Common::String &key) const;
+ void setDeletableFlag(bool state) { _isDeletable = state; }
/**
- * Sets the 'is_deletable' key, which indicates if the
- * given savestate is safe for deletion.
+ * Queries whether the save state is allowed to be deleted.
*/
- void setDeletableFlag(bool state);
+ bool getDeletableFlag() const { return _isDeletable; }
/**
- * Sets the 'is_write_protected' key, which indicates if the
- * given savestate can be overwritten or not
+ * Defines whether the save state is write protected.
*/
- void setWriteProtectedFlag(bool state);
+ void setWriteProtectedFlag(bool state) { _isWriteProtected = state; }
+
+ /**
+ * Queries whether the save state is write protected.
+ */
+ bool getWriteProtectedFlag() const { return _isWriteProtected; }
/**
* Return a thumbnail graphics surface representing the savestate visually.
@@ -109,24 +104,100 @@ public:
void setThumbnail(Graphics::Surface *t);
/**
- * Sets the 'save_date' key properly, based on the given values.
+ * Sets the date the save state was created.
+ *
+ * @param year Year of creation.
+ * @param month Month of creation.
+ * @param day Day of creation.
*/
void setSaveDate(int year, int month, int day);
/**
- * Sets the 'save_time' key properly, based on the given values.
+ * Queries a human readable description of the date the save state was created.
+ *
+ * This will return an empty string in case the value is not set.
+ */
+ const Common::String &getSaveDate() const { return _saveDate; }
+
+ /**
+ * Sets the time the save state was created.
+ *
+ * @param hour Hour of creation.
+ * @param min Minute of creation.
*/
void setSaveTime(int hour, int min);
/**
- * Sets the 'play_time' key properly, based on the given values.
+ * Queries a human readable description of the time the save state was created.
+ *
+ * This will return an empty string in case the value is not set.
+ */
+ const Common::String &getSaveTime() const { return _saveTime; }
+
+ /**
+ * Sets the time the game was played before the save state was created.
+ *
+ * @param hours How many hours the user played the game so far.
+ * @param min How many minutes the user played the game so far.
*/
void setPlayTime(int hours, int minutes);
/**
- * Sets the 'play_time' key properly, based on the given value.
+ * Sets the time the game was played before the save state was created.
+ *
+ * @param msecs How many milliseconds the user played the game so far.
*/
void setPlayTime(uint32 msecs);
+
+ /**
+ * Queries a human readable description of the time the game was played
+ * before the save state was created.
+ *
+ * This will return an empty string in case the value is not set.
+ */
+ const Common::String &getPlayTime() const { return _playTime; }
+
+private:
+ /**
+ * The saveslot id, as it would be passed to the "-x" command line switch.
+ */
+ int _slot;
+
+ /**
+ * A human readable description of the save state.
+ */
+ Common::String _description;
+
+ /**
+ * Whether the save state can be deleted.
+ */
+ bool _isDeletable;
+
+ /**
+ * Whether the save state is write protected.
+ */
+ bool _isWriteProtected;
+
+ /**
+ * Human readable description of the date the save state was created.
+ */
+ Common::String _saveDate;
+
+ /**
+ * Human readable description of the time the save state was created.
+ */
+ Common::String _saveTime;
+
+ /**
+ * Human readable description of the time the game was played till the
+ * save state was created.
+ */
+ Common::String _playTime;
+
+ /**
+ * The thumbnail of the save state.
+ */
+ Common::SharedPtr<Graphics::Surface> _thumbnail;
};
/** List of savestates. */
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index 2f69d5caa1..a44c661561 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -1498,10 +1498,22 @@ bool Console::cmdDrawPic(int argc, const char **argv) {
return true;
}
- uint16 resourceId = atoi(argv[1]);
+#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER
+ // If a graphical debugger overlay is used, hide it here, so that the
+ // results can be drawn.
+ g_system->hideOverlay();
+#endif
+ uint16 resourceId = atoi(argv[1]);
_engine->_gfxPaint->kernelDrawPicture(resourceId, 100, false, false, false, 0);
_engine->_gfxScreen->copyToScreen();
+ _engine->sleep(2000);
+
+#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER
+ // Show the graphical debugger overlay
+ g_system->showOverlay();
+#endif
+
return true;
}
diff --git a/engines/sci/decompressor.cpp b/engines/sci/decompressor.cpp
index 03a06d240d..82af6eca43 100644
--- a/engines/sci/decompressor.cpp
+++ b/engines/sci/decompressor.cpp
@@ -181,16 +181,27 @@ int DecompressorLZW::unpackLZW(Common::ReadStream *src, byte *dest, uint32 nPack
init(src, dest, nPacked, nUnpacked);
uint16 token; // The last received value
-
- uint16 tokenlist[4096]; // pointers to dest[]
- uint16 tokenlengthlist[4096]; // char length of each token
uint16 tokenlastlength = 0;
+ uint16 *tokenlist = (uint16 *)malloc(4096 * sizeof(uint16)); // pointers to dest[]
+ uint16* tokenlengthlist = (uint16 *)malloc(4096 * sizeof(uint16)); // char length of each token
+ if (!tokenlist || !tokenlengthlist) {
+ free(tokenlist);
+ free(tokenlengthlist);
+
+ error("[DecompressorLZW::unpackLZW] Cannot allocate token memory buffers");
+ }
+
while (!isFinished()) {
token = getBitsLSB(_numbits);
- if (token == 0x101)
+ if (token == 0x101) {
+ free(tokenlist);
+ free(tokenlengthlist);
+
return 0; // terminator
+ }
+
if (token == 0x100) { // reset command
_numbits = 9;
_endtoken = 0x1FF;
@@ -199,6 +210,10 @@ int DecompressorLZW::unpackLZW(Common::ReadStream *src, byte *dest, uint32 nPack
if (token > 0xff) {
if (token >= _curtoken) {
warning("unpackLZW: Bad token %x", token);
+
+ free(tokenlist);
+ free(tokenlengthlist);
+
return SCI_ERROR_DECOMPRESSION_ERROR;
}
tokenlastlength = tokenlengthlist[token] + 1;
@@ -231,6 +246,9 @@ int DecompressorLZW::unpackLZW(Common::ReadStream *src, byte *dest, uint32 nPack
}
}
+ free(tokenlist);
+ free(tokenlengthlist);
+
return _dwWrote == _szUnpacked ? 0 : SCI_ERROR_DECOMPRESSION_ERROR;
}
@@ -238,12 +256,20 @@ int DecompressorLZW::unpackLZW1(Common::ReadStream *src, byte *dest, uint32 nPac
uint32 nUnpacked) {
init(src, dest, nPacked, nUnpacked);
- byte stak[0x1014];
+ byte *stak = (byte *)malloc(0x1014);
+ unsigned int tokensSize = 0x1004 * sizeof(Tokenlist);
+ Tokenlist *tokens = (Tokenlist *)malloc(tokensSize);
+ if (!stak || !tokens) {
+ free(stak);
+ free(tokens);
+
+ error("[DecompressorLZW::unpackLZW1] Cannot allocate decompression buffers");
+ }
+
+ memset(tokens, 0, tokensSize);
+
byte lastchar = 0;
uint16 stakptr = 0, lastbits = 0;
- Tokenlist tokens[0x1004];
- memset(tokens, 0, sizeof(tokens));
-
byte decryptstart = 0;
uint16 bitstring;
@@ -310,6 +336,10 @@ int DecompressorLZW::unpackLZW1(Common::ReadStream *src, byte *dest, uint32 nPac
break;
}
}
+
+ free(stak);
+ free(tokens);
+
return _dwWrote == _szUnpacked ? 0 : SCI_ERROR_DECOMPRESSION_ERROR;
}
diff --git a/engines/sci/decompressor.h b/engines/sci/decompressor.h
index 37a5b5d7cb..5753026709 100644
--- a/engines/sci/decompressor.h
+++ b/engines/sci/decompressor.h
@@ -197,4 +197,3 @@ protected:
} // End of namespace Sci
#endif // SCI_SCICORE_DECOMPRESSOR_H
-
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp
index 2285e512bd..2d567a7fde 100644
--- a/engines/sci/detection.cpp
+++ b/engines/sci/detection.cpp
@@ -285,7 +285,7 @@ static const OldNewIdTableEntry s_oldNewTable[] = {
* @param[in] gameFlags The game's flags, which are adjusted accordingly for demos
* @return The equivalent ScummVM game id
*/
-Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, ResourceManager *resMan) {
+Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, ResourceManager &resMan) {
// Convert the id to lower case, so that we match all upper/lower case variants.
sierraId.toLowercase();
@@ -296,12 +296,14 @@ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, R
sierraId == "mg" || sierraId == "pq" ||
sierraId == "jones" ||
sierraId == "cardgames" || sierraId == "solitare" ||
- sierraId == "hoyle3" || sierraId == "hoyle4")
+ sierraId == "hoyle4")
demoThreshold = 40;
+ if (sierraId == "hoyle3")
+ demoThreshold = 45; // cnick-kq has 42 scripts. The actual hoyle 3 demo has 27.
if (sierraId == "fp" || sierraId == "gk" || sierraId == "pq4")
demoThreshold = 150;
- Common::ScopedPtr<Common::List<ResourceId> > resources(resMan->listResources(kResourceTypeScript, -1));
+ Common::ScopedPtr<Common::List<ResourceId> > resources(resMan.listResources(kResourceTypeScript, -1));
if (resources->size() < demoThreshold) {
*gameFlags |= ADGF_DEMO;
@@ -310,8 +312,11 @@ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, R
return "cnick-lsl";
if (sierraId == "sq4" && resources->size() == 34)
return "cnick-sq";
-
- // TODO: cnick-kq, cnick-laurabow and cnick-longbow (their resources can't be read)
+ if (sierraId == "hoyle3" && resources->size() == 42)
+ return "cnick-kq";
+ if (sierraId == "rh budget" && resources->size() == 39)
+ return "cnick-longbow";
+ // TODO: cnick-laurabow (the name of the game object contains junk)
// Handle Astrochicken 1 (SQ3) and 2 (SQ4)
if (sierraId == "sq3" && resources->size() == 20)
@@ -337,7 +342,7 @@ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, R
// This could either be qfg1 VGA, qfg3 or qfg4 demo (all SCI1.1),
// or qfg4 full (SCI2)
// qfg1 VGA doesn't have view 1
- if (!resMan->testResource(ResourceId(kResourceTypeView, 1)))
+ if (!resMan.testResource(ResourceId(kResourceTypeView, 1)))
return "qfg1vga";
// qfg4 full is SCI2
@@ -368,7 +373,7 @@ static ADGameDescription s_fallbackDesc = {
Common::UNK_LANG,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
};
static char s_fallbackGameIdBuf[256];
@@ -430,7 +435,7 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles,
s_fallbackDesc.flags = ADGF_NO_FLAGS;
s_fallbackDesc.platform = Common::kPlatformPC; // default to PC platform
s_fallbackDesc.gameid = "sci";
- s_fallbackDesc.guioptions = Common::GUIO_NONE;
+ s_fallbackDesc.guioptions = GUIO1(GUIO_NONE);
if (allFiles.contains("resource.map") || allFiles.contains("Data1")
|| allFiles.contains("resmap.001") || allFiles.contains("resmap.001")) {
@@ -480,10 +485,9 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles,
return 0;
}
- Common::ScopedPtr<ResourceManager> resMan(new ResourceManager());
- assert(resMan);
- resMan->addAppropriateSources(fslist);
- resMan->init(true);
+ ResourceManager resMan;
+ resMan.addAppropriateSources(fslist);
+ resMan.init(true);
// TODO: Add error handling.
#ifndef ENABLE_SCI32
@@ -494,7 +498,7 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles,
}
#endif
- ViewType gameViews = resMan->getViewType();
+ ViewType gameViews = resMan.getViewType();
// Have we identified the game views? If not, stop here
// Can't be SCI (or unsupported SCI views). Pinball Creep by sierra also uses resource.map/resource.000 files
@@ -508,7 +512,7 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles,
s_fallbackDesc.platform = Common::kPlatformAmiga;
// Determine the game id
- Common::String sierraGameId = resMan->findSierraGameId();
+ Common::String sierraGameId = resMan.findSierraGameId();
// If we don't have a game id, the game is not SCI
if (sierraGameId.empty()) {
@@ -530,7 +534,7 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles,
// As far as we know, these games store the messages of each language in separate
// resources, and it's not possible to detect that easily
// Also look for "%J" which is used in japanese games
- Resource *text = resMan->findResource(ResourceId(kResourceTypeText, 0), 0);
+ Resource *text = resMan.findResource(ResourceId(kResourceTypeText, 0), 0);
uint seeker = 0;
if (text) {
while (seeker < text->size) {
@@ -561,7 +565,7 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles,
const bool isCD = (s_fallbackDesc.flags & ADGF_CD);
if (!isCD)
- s_fallbackDesc.guioptions |= Common::GUIO_NOSPEECH;
+ s_fallbackDesc.guioptions = GUIO1(GUIO_NOSPEECH);
if (gameId.hasSuffix("sci")) {
s_fallbackDesc.extra = "SCI";
@@ -588,7 +592,7 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles,
s_fallbackDesc.extra = "CD";
}
- return (const ADGameDescription *)&s_fallbackDesc;
+ return &s_fallbackDesc;
}
bool SciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
@@ -677,13 +681,7 @@ SaveStateDescriptor SciMetaEngine::querySaveMetaInfos(const char *target, int sl
SaveStateDescriptor desc(slot, meta.name);
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- if (!Graphics::loadThumbnail(*in, *thumbnail)) {
- delete thumbnail;
- thumbnail = 0;
- }
-
+ Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in);
desc.setThumbnail(thumbnail);
desc.setDeletableFlag(true);
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index 0010f095e1..4b1f36cda0 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -29,15 +29,11 @@ namespace Sci {
{"sci-fanmade", name, { \
{"resource.map", 0, resMapMd5, resMapSize}, \
{"resource.001", 0, resMd5, resSize}, \
- AD_LISTEND}, lang, Common::kPlatformPC, 0, GUIO_NOSPEECH \
+ AD_LISTEND}, lang, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) \
}
#define FANMADE(name, resMapMd5, resMapSize, resMd5, resSize) FANMADE_L(name, resMapMd5, resMapSize, resMd5, resSize, Common::EN_ANY)
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-using Common::GUIO_MIDIGM;
-
// Game descriptions
static const struct ADGameDescription SciGameDescriptions[] = {
// Astro Chicken - English DOS
@@ -46,7 +42,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "f3d1be7752d30ba60614533d531e2e98", 474},
{"resource.001", 0, "6fd05926c2199af0af6f72f90d0d7260", 126895},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Castle of Dr. Brain - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.005.000"
@@ -58,9 +54,9 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "d226d7d3b4f77c4a566913fc310487fc", 792380},
{"resource.003", 0, "d226d7d3b4f77c4a566913fc310487fc", 464348},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
- // Castle of Dr. Brain - German Amiga (from www.back2roots.org, also includes english language)
+ // Castle of Dr. Brain - German Amiga (from www.back2roots.org, also includes English language)
// Executable scanning reports "1.005.001"
// SCI interpreter version 1.000.510
{"castlebrain", "", {
@@ -70,7 +66,17 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 826309},
{"resource.003", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 493638},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
+
+ // Castle of Dr. Brain Macintosh (from omer_mor, bug report #3328251)
+ {"castlebrain", "", {
+ {"resource.map", 0, "75cb06a94d2e0641295edd043f26f3a8", 2763},
+ {"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 476566},
+ {"resource.001", 0, "7f7da982f5cd868e1e608cd4f6515656", 400521},
+ {"resource.002", 0, "e1a6b6f1060f60be9dcb6d28ad7a2a20", 1168310},
+ {"resource.003", 0, "6c3d1bb26ad532c94046bc9ac49b5ff4", 891295},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
// Castle of Dr. Brain - English DOS Non-Interactive Demo
// SCI interpreter version 1.000.005
@@ -79,9 +85,9 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "9780f040d58182994e22d2e34fab85b0", 67367},
{"resource.001", 0, "2af49dbd8f2e1db4ab09f9310dc91259", 570553},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
- // Castle of Dr. Brain - English DOS Floppy EGA (from omer_mor, bug report #3035349)
+ // Castle of Dr. Brain - English DOS 5.25" Floppy EGA (from omer_mor, bug report #3035349)
{"castlebrain", "EGA", {
{"resource.map", 0, "88d106f945f7fd9d1aeda961cfec38a9", 2646},
{"resource.000", 0, "6e125f4ce3f4f5c35f2617c7b66c6e21", 25325},
@@ -92,7 +98,17 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "8a5ed3ba96e2eaf18e36fedfaab89419", 297838},
{"resource.006", 0, "dceed92e709cad1bd9582809a235b0a0", 266682},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
+
+ // Castle of Dr. Brain - English DOS 3.5" Floppy EGA (from nozomi77, bug report #3405307)
+ {"castlebrain", "EGA", {
+ {"resource.map", 0, "dfcf23e36cb81223bdf11166aaf90754", 2730},
+ {"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 300857},
+ {"resource.001", 0, "6e0020a9f9bef9a9d65943dc013f14b5", 222108},
+ {"resource.002", 0, "de2f182529efaad2c4b510b452ab77ac", 633662},
+ {"resource.003", 0, "38b4b37febc6b4f5061c461a283df148", 430388},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Castle of Dr. Brain - English DOS Floppy (from jvprat)
// Executable scanning reports "1.000.044", Floppy label reports "1.0, 10.30.91", VERSION file reports "1.000"
@@ -103,7 +119,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "d2f5a1be74ed963fa849a76892be5290", 794832},
{"resource.002", 0, "c0c29c51af66d65cb53f49e785a2d978", 1280907},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Castle of Dr. Brain - English DOS Floppy 1.1
{"castlebrain", "", {
@@ -112,7 +128,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "13e81e1839cd7b216d2bb5615c1ca160", 796776},
{"resource.002", 0, "930e416bec196b9703a331d81b3d66f2", 1283812},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Castle of Dr. Brain - English DOS Floppy 1.000
// Reported by graxer in bug report #3037942
@@ -127,7 +143,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "1d778a0c65cac9ddbab65495e50a94ee", 335281},
{"resource.007", 0, "063bb8ce4157c778cf30d1c912c006f1", 335631},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Castle of Dr. Brain - Spanish DOS (also includes english language)
// SCI interpreter version 1.000.510
@@ -136,7 +152,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 1197694},
{"resource.001", 0, "735be4e58957180cfc807d5e18fdffcd", 1433302},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Christmas Card 1988 - English DOS
// SCI interpreter version 0.000.294
@@ -144,7 +160,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "39485580d34a72997f3d5b3aba4d24f1", 426},
{"resource.001", 0, "11391434f41c834090d7a1e9488ce936", 129739},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Christmas Card 1990: The Seasoned Professional - English DOS (16 Colors)
// SCI interpreter version 1.000.172
@@ -152,7 +168,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8f656714a05b94423ac6eb10ee8797d0", 600},
{"resource.001", 0, "acde93e58fca4f7a2a5a220558a94aa8", 272629},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Christmas Card 1990: The Seasoned Professional - English DOS (256 Colors)
// SCI interpreter version 1.000.174
@@ -160,7 +176,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "44b8f45b841b9b5e17e939a35e443988", 600},
{"resource.001", 0, "acde93e58fca4f7a2a5a220558a94aa8", 335362},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Christmas Card 1992 - English DOS
// SCI interpreter version 1.001.055
@@ -168,7 +184,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "f1f8c8a8443f523422af70b4ec85b71c", 318},
{"resource.000", 0, "62fb9256f8e7e6e65a6875efdb7939ac", 203396},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Codename: Iceman - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.031"
@@ -182,7 +198,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "8613c45fc771d658e5a505b9a4a54f31", 713382},
{"resource.005", 0, "605b67a9ef199a9bb015745e7c004cf4", 478384},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Codename: Iceman - English DOS Non-Interactive Demo
// Executable scanning reports "0.000.685"
@@ -190,7 +206,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "782974f29d8a824782d2d4aea39964e3", 1056},
{"resource.001", 0, "d4b75e280d1c3a97cfef1b0bebff387c", 573647},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Codename: Iceman - English DOS (from jvprat)
// Executable scanning reports "0.000.685", Floppy label reports "1.033, 6.8.90", VERSION file reports "1.033"
@@ -203,7 +219,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "d97a96f1ab91b41cf46a02cc89b0a04e", 624303},
{"resource.004", 0, "8613c45fc771d658e5a505b9a4a54f31", 670883},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Codename: Iceman - English DOS (from FRG)
// SCI interpreter version 0.000.668
@@ -215,7 +231,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "dc7c5280e7acfaffe6ef2a6c963c5f94", 622118},
{"resource.004", 0, "64f342463f6f35ba71b3509ef696ae3f", 669188},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Codename: Iceman - English DOS (supplied by ssburnout in bug report #3049193)
// 1.022 9x5.25" (label: Int#0.000.668)
@@ -230,7 +246,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "08050329aa113a9f14ed99cbfe3536ec", 232942},
{"resource.007", 0, "64f342463f6f35ba71b3509ef696ae3f", 267811},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Codename: Iceman - English DOS 1.023 (from abevi, bug report #2612718)
{"iceman", "", {
@@ -244,7 +260,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "08050329aa113a9f14ed99cbfe3536ec", 232942},
{"resource.007", 0, "64f342463f6f35ba71b3509ef696ae3f", 267702},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of Camelot - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.030"
@@ -259,7 +275,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "c6e551bdc24f0acc193159038d4ca767", 605882},
{"resource.006", 0, "8f880a536908ab496bbc552f7f5c3738", 585255},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of Camelot - English DOS Non-Interactive Demo
// SCI interpreter version 0.000.668
@@ -267,7 +283,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "f4cd75c15be75e04cdca3acda2c0b0ea", 468},
{"resource.001", 0, "4930708722f34bfbaa4945fb08f55f61", 232523},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Conquests of Camelot - English DOS (from jvprat)
// Executable scanning reports "0.000.685", Floppy label reports "1.001, 0.000.685", VERSION file reports "1.001.000"
@@ -279,7 +295,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "8e1a3a8c588007404b532b8dfacc1460", 723712},
{"resource.004", 0, "8e1a3a8c588007404b532b8dfacc1460", 729143},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of Camelot - English DOS
// SCI interpreter version 0.000.685
@@ -293,7 +309,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "8e1a3a8c588007404b532b8dfacc1460", 332446},
{"resource.007", 0, "8e1a3a8c588007404b532b8dfacc1460", 358182},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.005.001"
@@ -308,7 +324,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "1c3804e56b114028c5873a35c2f06d13", 653002},
{"resource.006", 0, "f9487732289a4f4966b4e34eea413325", 842817},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow - English DOS
// SCI interpreter version 1.000.510
@@ -322,7 +338,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "d036df0872f2db19bca34601276be2d7", 1154950},
{"resource.006", 0, "b367a6a59f29ee30dde1d88a5a41152d", 1042966},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow - English DOS Floppy (from jvprat)
// Executable scanning reports "1.000.168", Floppy label reports "1.1, 1.13.92", VERSION file reports "1.1"
@@ -336,7 +352,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1261462},
{"resource.005", 0, "21ebe6b39b57a73fc449f67f013765aa", 1284720},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow - English DOS
// SCI interpreter version 1.000.510
@@ -349,7 +365,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1260237},
{"resource.005", 0, "21ebe6b39b57a73fc449f67f013765aa", 1284609},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow EGA - English DOS
// SCI interpreter version 1.000.510
@@ -362,7 +378,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "b7bb35c027bb424ecefcd122768e5e60", 705631},
{"resource.005", 0, "58942b1aa6d6ffeb66e9f8897fd4435f", 469243},
{"resource.006", 0, "8c767b3939add63d11274065e46aad04", 713158},
- AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow DOS 1.0 EGA (4 x 5.25" disks)
// Provided by ssburnout in bug report #3046802
@@ -372,7 +388,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"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 },
+ AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow - English DOS Non-Interactive Demo
// SCI interpreter version 1.000.510
@@ -380,7 +396,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "cbc5cb73341de1bff1b1e20a640af220", 588},
{"resource.001", 0, "f05a20cc07eee85da8e999d0ac0f596b", 869916},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Conquests of the Longbow - German DOS (suplied by markcoolio in bug report #2727681, also includes english language)
// SCI interpreter version 1.000.510
@@ -394,7 +410,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "d036df0872f2db19bca34601276be2d7", 1176914},
{"resource.006", 0, "b367a6a59f29ee30dde1d88a5a41152d", 1123585},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Eco Quest - English DOS Non-Interactive Demo (from FRG)
// Executable scanning reports "x.yyy.zzz"
@@ -403,7 +419,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "c819e171359b7c95f4c13b846d5c034e", 873},
{"resource.001", 0, "baf9393a9bfa73098adb501e5bc5487b", 657518},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Eco Quest - English DOS CD 1.1
// SCI interpreter version 1.001.064
@@ -411,7 +427,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a4b73d5d2b55bdb6e44345e99c8fbdd0", 4804},
{"resource.000", 0, "d908dbef56816ac6c60dd145fdeafb2b", 3536046},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Eco Quest - English DOS CD 1.1
// SCI interpreter version 1.001.064
@@ -421,7 +437,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a4b73d5d2b55bdb6e44345e99c8fbdd0", 4804},
{"resource.000", 0, "d908dbef56816ac6c60dd145fdeafb2b", 3536046},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO_MIDIGM },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO1(GUIO_MIDIGM) },
// Eco Quest - English DOS Floppy
// SCI interpreter version 1.000.510
@@ -432,7 +448,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "28fe9b4f0567e71feb198bc9f3a2c605", 1241816},
{"resource.003", 0, "f3146df0ad4297f5ce35aa8c4753bf6c", 586832},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Eco Quest - English DOS Floppy
// SCI interpreter version 1.000.510
@@ -443,7 +459,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "323b3b12f43d53f27d259beb225f0aa7", 1129316},
{"resource.003", 0, "83ac03e4bddb2c1ac2d36d2a587d0536", 1145616},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Eco Quest - German DOS Floppy (supplied by markcoolio in bug report #2723744, also includes english language)
// SCI interpreter version 1.000.510
@@ -454,7 +470,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "02d7d0411f7903aacb3bc8b0f8ca8a9a", 1202581},
{"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1175835},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Eco Quest - Spanish DOS Floppy (from jvprat, also includes english language)
// Executable scanning reports "1.ECO.013", VERSION file reports "1.000, 11.12.92"
@@ -466,7 +482,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "2d21a1d2dcbffa551552e3e0725d2284", 1186033},
{"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1174993},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Eco Quest - French DOS Floppy (from Strangerke, also includes english language)
// SCI interpreter version 1.ECO.013
@@ -477,7 +493,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "b836c6ee9de67d814ac5d1b05f5b9858", 1173872},
{"resource.003", 0, "f8f767f9d6351432621c6e54c1b2ba8c", 1141520},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Eco Quest 2 - English DOS Non-Interactive Demo
// SCI interpreter version 1.001.055
@@ -485,7 +501,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "607cfa0d8a03b7d348c06ee727e3d939", 1321},
{"resource.000", 0, "dd6f614c43c029f063e93cd243af90a4", 525992},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Eco Quest 2 - English DOS Floppy (supplied by markcoolio in bug report #2723761)
// SCI interpreter version 1.001.065
@@ -493,7 +509,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "28fb7b6abb9fc1cb8882d7c2e701b63f", 5658},
{"resource.000", 0, "cc1d17e5637528dbe4a812699e1cbfc6", 4208192},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Eco Quest 2 - French DOS Floppy (from Strangerke)
// SCI interpreter version 1.001.081
@@ -501,7 +517,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "c22ab8b33c339c138b6b1697b77b9e79", 5588},
{"resource.000", 0, "1c4093f7248240329121fdf8c0d59152", 4231946},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Eco Quest 2 - Spanish DOS Floppy (supplied by umbrio in bug report #3313962)
{"ecoquest2", "Floppy", {
@@ -509,7 +525,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "1c4093f7248240329121fdf8c0d59152", 4209150},
{"resource.msg", 0, "eff8be1925d42288de55e405983e9314", 117810},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Freddy Pharkas - English DOS demo (from FRG)
// SCI interpreter version 1.001.069
@@ -517,7 +533,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "97aa9fcfe84c9993a64debd28c32393a", 1909},
{"resource.000", 0, "5ea8e7a3ea10cce6efd5c106dc62fd8c", 867724},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Freddy Pharkas - English CD DOS (from FRG)
// SCI interpreter version 1.001.132
@@ -525,7 +541,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "d46b282f228a67ba13bd4b4009e95f8f", 6058},
{"resource.000", 0, "ee3c64ffff0ba9fb08bea2624631c598", 5490246},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Freddy Pharkas - English DOS Floppy (updated information from markcoolio in bug reports #2723773 and #2724720)
// Executable scanning reports "1.cfs.081"
@@ -535,7 +551,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230},
{"resource.msg", 0, "554f65315d851184f6e38211489fdd8f", -1},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Freddy Pharkas - Windows (supplied by abevi in bug report #2612718)
// Executable scanning reports "1.cfs.081"
@@ -544,7 +560,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a32674e7fbf7b213b4a066c8037f16b6", 5816},
{"resource.000", 0, "fed4808fdb72486908ac7ad0044b14d8", 5233230},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, 0, GUIO1(GUIO_NOSPEECH) },
// Freddy Pharkas - German DOS Floppy (from Tobis87, updated information from markcoolio in bug reports #2723772 and #2724720)
// Executable scanning reports "1.cfs.081"
@@ -554,7 +570,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230},
{"resource.msg", 0, "304b5a5781800affd2235152a5794fa8", -1},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Freddy Pharkas - Spanish DOS (from jvprat)
// Executable scanning reports "1.cfs.081", VERSION file reports "1.000, March 30, 1995"
@@ -567,7 +583,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "05acdc256c742e79c50b9fe7ec2cc898", 863310},
{"resource.msg", 0, "45b5bf74933ac3727e4cc844446dc052", 796156},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Freddy Pharkas - Spanish DOS (from jvprat)
// Executable scanning reports "1.cfs.081", VERSION file reports "1.000, March 30, 1995"
@@ -577,7 +593,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230},
{"resource.msg", 0, "45b5bf74933ac3727e4cc844446dc052", 796156},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Freddy Pharkas - English DOS CD Demo
// SCI interpreter version 1.001.095
@@ -585,14 +601,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a62a7eae85dd1e6b07f39662b278437e", 1918},
{"resource.000", 0, "4962a3c4dd44e36e78ea4a7a374c2220", 957382},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NONE) },
// Freddy Pharkas - English Macintosh
{"freddypharkas", "", {
{"Data1", 0, "ef7cbd62727989818f1cfae69c9fd61d", 3038492},
{"Data2", 0, "2424b418f7d52c385cea4701f529c69a", 4721732},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO1(GUIO_NOSPEECH) },
// Fun Seeker's Guide - English DOS
// SCI interpreter version 0.000.506
@@ -600,7 +616,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7ee6859ef74314f6d91938c3595348a9", 282},
{"resource.001", 0, "f1e680095424e31f7fae1255d36bacba", 40692},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Gabriel Knight - English DOS CD Demo
// SCI interpreter version 1.001.092
@@ -608,7 +624,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "39645952ae0ed8072c7e838f31b75464", 2490},
{"resource.000", 0, "eb3ed7477ca4110813fe1fcf35928561", 1718450},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NONE) },
#ifdef ENABLE_SCI32
// Gabriel Knight - English DOS Floppy
@@ -617,7 +633,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Gabriel Knight - English DOS Floppy (supplied my markcoolio in bug report #2723777)
// SCI interpreter version 2.000.000
@@ -625,7 +641,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "65e8c14092e4c9b3b3538b7602c8c5ec", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Gabriel Knight - English DOS Floppy
// SCI interpreter version 2.000.000, VERSION file reports "1.0\nGabriel Knight\n11/22/10:33 pm\n\x1A"
@@ -633,7 +649,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ef41df08cf2c1f680216cdbeed0f8311", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Gabriel Knight - German DOS Floppy (supplied my markcoolio in bug report #2723775)
// SCI interpreter version 2.000.000
@@ -641,7 +657,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ad6508b0296b25c07b1f58828dc33696", 10789},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13077029},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Gabriel Knight - English DOS CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "01.100.000"
@@ -649,7 +665,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight - English Windows CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "01.100.000"
@@ -657,7 +673,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight - German DOS CD (from Tobis87)
// SCI interpreter version 2.000.000
@@ -665,7 +681,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight - Spanish DOS CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995"
@@ -673,7 +689,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight - French DOS CD (from Hkz)
// VERSION file reports "1.000.000, May 3, 1994"
@@ -681,7 +697,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "55f909ba93a2515042a08d8a2da8414e", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13325145},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight - German Windows CD (from Tobis87)
// SCI interpreter version 2.000.000
@@ -689,7 +705,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight - Spanish Windows CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995"
@@ -697,7 +713,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::ES_ESP, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight - English Macintosh
{"gk1", "", {
@@ -706,7 +722,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data3", 0, "f25068b408b09275d8b698866462f578", 3677599},
{"Data4", 0, "1cceebbe411b26c860a74f91c337fdf3", 3230086},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight 2 - English Windows Non-Interactive Demo
// Executable scanning reports "2.100.002"
@@ -714,7 +730,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e0effce11c4908f4b91838741716c83d", 1351},
{"resource.000", 0, "d04cfc7f04b6f74d13025378be49ec2b", 4640330},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
+
+ // Gabriel Knight 2 - English DOS (GOG version) - ressci.* merged in ressci.000
+ // using Enrico Rolfi's HD/DVD installer: http://gkpatches.vogons.zetafleet.com/
+ {"gk2", "", {
+ {"resmap.000", 0, "b996fa1e57389a1e179a00a0049de1f4", 8110},
+ {"ressci.000", 0, "a19fc3604c6e5407abcf03d59ee87217", 168522221},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight 2 - English DOS (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.1"
@@ -732,7 +756,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.006", 0, "ce9359037277b7d7976da185c2fa0aad", 2977},
{"ressci.006", 0, "8e44e03890205a7be12f45aaba9644b4", 60659424},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight 2 - French DOS (6-CDs Sierra Originals reedition)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -750,8 +774,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.006", 0, "11b2e722170b8c93fdaa5428e2c7676f", 3001},
{"ressci.006", 0, "4037d941aec39d2e654e20960429aefc", 60568486},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE,
- GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Gabriel Knight 2 - English Macintosh
// NOTE: This only contains disc 1 files (as well as the persistent file:
@@ -763,7 +786,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data4", 0, "8b843c62eb53136a855d6e0087e3cb0d", 5889553},
{"Data5", 0, "f9fcf9ab2eb13b2125c33a1cda03a093", 14349984},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
#endif // ENABLE_SCI32
@@ -775,7 +798,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 342149},
{"resource.003", 0, "e0dd44069a62a463fd124974b915f10d", 328925},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 1 - English DOS (supplied by wibble92 in bug report #2644547)
// SCI interpreter version 0.000.530
@@ -785,7 +808,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 342309},
{"resource.003", 0, "e0dd44069a62a463fd124974b915f10d", 328912},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 1 - English DOS (supplied by merkur in bug report #2719227)
// SCI interpreter version 0.000.530
@@ -793,14 +816,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "1034a218943d12f1f36e753fa10c95b8", 4386},
{"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 518308},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 1 3.5' - English DOS (supplied by eddydrama in bug report #3052366 and dinnerx in bug report #3090841)
{"hoyle1", "", {
{"resource.map", 0, "0af9a3dcd72a091960de070432e1f524", 4386},
{"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 518127},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
#if 0 // TODO: unknown if these files are corrupt
// Hoyle 1 - English Amiga (from www.back2roots.org)
@@ -810,7 +833,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 218755},
{"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 439502},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
#endif
// Hoyle 2 - English DOS
@@ -820,7 +843,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 98138},
{"resource.002", 0, "8f2dd70abe01112eca464cda818b5eb6", 196631},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 2 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.000.011 1x3.5" (label:Int#6.21.90)
@@ -828,7 +851,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "db0ba08b953e9904a4960ad99cd29c20", 1356},
{"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 216315},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 2 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
@@ -837,7 +860,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "62ed48d20c580e5a98f102f7cd93706a", 1356},
{"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 222704},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 2 - English Macintosh
// Executable scanning reports "x.yyy.zzz"
@@ -845,7 +868,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "1af1d3aa3cf564f93477c9f87e53f495", 1728},
{"resource.001", 0, "b73b8131669d69d41a326415e4519138", 482882},
{NULL, 0, NULL, 0}},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
#if 0 // TODO: unknown if these files are corrupt
// Hoyle 3 - English Amiga (from www.back2roots.org)
@@ -856,7 +879,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "595b6039ea1356e7f96a52c58eedcf22", 355791},
{"resource.001", 0, "143df8aef214a2db34c2d48190742012", 632273},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
#endif
// Hoyle 3 - English DOS Non-Interactive Demo
@@ -866,7 +889,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0d06cacc87dc21a08cd017e73036f905", 735},
{"resource.001", 0, "24db2bccda0a3c43ac4a7b5edb116c7e", 797678},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Hoyle 3 - English DOS Floppy (from jvprat)
// Executable scanning reports "x.yyy.zzz", Floppy label reports "1.0, 11.2.91", VERSION file reports "1.000"
@@ -876,7 +899,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 541845},
{"resource.001", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 845795},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 3 - English DOS Floppy (supplied by eddydrama in bug report #3038837)
{"hoyle3", "", {
@@ -887,7 +910,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "97cfd72633f8f9b2a0b1d4116cf3ee81", 346116},
{"resource.004", 0, "2884fb91b225fabd9ca87ea231293b48", 351218},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 3 EGA - English DOS Floppy 1.0 (supplied by abevi in bug report #2612718)
{"hoyle3", "EGA", {
@@ -895,14 +918,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 319905},
{"resource.001", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 526438},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 4 (Hoyle Classic Card Games) - English DOS Demo
{"hoyle4", "Demo", {
{"resource.map", 0, "60f764020a6b788bbbe415dbc2ccb9f3", 931},
{"resource.000", 0, "5fe3670e3ddcd4f85c10013b5453141a", 615522},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Hoyle 4 (Hoyle Classic Card Games) - English DOS Demo
// SCI interpreter version 1.001.200 (just a guess)
@@ -911,7 +934,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "662087cb383e52e3cc4ae7ecb10e20aa", 938},
{"resource.000", 0, "24c10844792c54d476d272213cbac300", 675252},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Hoyle 4 (Hoyle Classic Card Games) - English DOS/Win
// Supplied by abevi in bug report #3039291
@@ -919,7 +942,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2b577c975cc8d8d43f61b6a756129fe3", 4352},
{"resource.000", 0, "43e2c15ce436aab611a462ad0603e12d", 2000132},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Hoyle 4 (Hoyle Classic Card Games) - English Macintosh Floppy
// VERSION file reports "2.0"
@@ -927,7 +950,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data1", 0, "99575fae4579540a314bbedd72d51e8c", 7682887},
{"Data2", 0, "7d4bf5bdf3c02edbf35cb8471c84ec13", 1539134},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO1(GUIO_NOSPEECH) },
// Jones in the Fast Lane EGA - English DOS
// SCI interpreter version 1.000.172 (not 100% sure FIXME)
@@ -936,14 +959,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 202105},
{"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 341771},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Jones in the Fast Lane EGA - English DOS (supplied by EddyDrama in bug report #3038761)
{"jones", "EGA", {
{"resource.map", 0, "8e92cf319180cc8b5b87b2ce93a4fe22", 1602},
{"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 511528},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Jones in the Fast Lane VGA - English DOS
// SCI interpreter version 1.000.172
@@ -952,7 +975,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 313476},
{"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 719747},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Jones in the Fast Lane VGA - English DOS (supplied by omer_mor in bug report #3037054)
// VERSION file reports "1.000.060"
@@ -960,14 +983,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "db175ab494ab0666f19ab8f2597a8e49", 1602},
{"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 994487},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Jones in the Fast Lane - English DOS CD
{"jones", "CD", {
{"resource.map", 0, "459f5b04467bc2107aec02f5c4b71b37", 4878},
{"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652150},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Jones in the Fast Lane - English DOS CD
// Same entry as the DOS version above. This one is used for the alternate
@@ -976,7 +999,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "459f5b04467bc2107aec02f5c4b71b37", 4878},
{"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652150},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO_MIDIGM },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO1(GUIO_MIDIGM) },
// King's Quest 1 SCI Remake - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.003.007"
@@ -988,7 +1011,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "9ae2a13708d691cd42f9129173c4b39d", 763224},
{"resource.004", 0, "9ae2a13708d691cd42f9129173c4b39d", 820443},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 1 SCI Remake - English DOS Non-Interactive Demo
// Executable scanning reports "S.old.010"
@@ -996,7 +1019,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "59b13619078bd47011421468959ee5d4", 954},
{"resource.001", 0, "4cfb9040db152868f7cb6a1e8151c910", 296555},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// King's Quest 1 SCI Remake - English DOS (from the King's Quest Collection)
// Executable scanning reports "S.old.010", VERSION file reports "1.000.051"
@@ -1007,7 +1030,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "fed9e0072ffd511d248674e60dee2099", 714062},
{"resource.003", 0, "fed9e0072ffd511d248674e60dee2099", 717478},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(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)
@@ -1021,7 +1044,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "fed9e0072ffd511d248674e60dee2099", 351062},
{"resource.007", 0, "fed9e0072ffd511d248674e60dee2099", 330472},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 4 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
@@ -1034,7 +1057,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "fd16c9c223f7dc5b65f06447615224ff", 683016},
{"resource.004", 0, "3fac034c7d130e055d05bc43a1f8d5f8", 549993},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 4 - English DOS Non-Interactive Demo
// Executable scanning reports "0.000.494"
@@ -1042,7 +1065,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "992ac7cc31d3717fe53818a9bb6d1dae", 594},
{"resource.001", 0, "143e1c14f15ad0fbfc714f648a65f661", 205330},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// King's Quest 4 - English DOS (original boxed release, 3 1/2" disks)
// SCI interpreter version 0.000.247
@@ -1053,7 +1076,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "851a62d00972dc4002f472cc0d84e71d", 683145},
{"resource.004", 0, "851a62d00972dc4002f472cc0d84e71d", 649441},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 4 - English DOS (from the King's Quest Collection)
// Executable scanning reports "0.000.502"
@@ -1065,7 +1088,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "77615c595388acf3d1df8e107bfb6b52", 707591},
{"resource.004", 0, "77615c595388acf3d1df8e107bfb6b52", 479562},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(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)
@@ -1079,7 +1102,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "6db7de6f93c6ea62dca78abee677f8c0", 324789},
{"resource.007", 0, "6db7de6f93c6ea62dca78abee677f8c0", 334441},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 4 - English DOS
// SCI interpreter version 0.000.274
@@ -1093,7 +1116,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "851a62d00972dc4002f472cc0d84e71d", 333777},
{"resource.007", 0, "851a62d00972dc4002f472cc0d84e71d", 341038},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 4 - English DOS
// SCI interpreter version 0.000.253
@@ -1107,7 +1130,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "0c8566848a76eea19a6d6220914030a7", 337288},
{"resource.007", 0, "0c8566848a76eea19a6d6220914030a7", 343882},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 4 - English Atari ST (double-sided diskettes)
// Game version 1.003.006 (January 12, 1989)
@@ -1120,7 +1143,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "a3cdb4848fb859fdd302976fff56490f", 705074},
{"resource.004", 0, "a3cdb4848fb859fdd302976fff56490f", 478366},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.004.018"
@@ -1136,7 +1159,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "26c0c25399b6715fec03fc3e12544fe3", 823048},
{"resource.007", 0, "b914b5901e786327213e779725d30dd1", 778772},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - German Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -1152,7 +1175,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "56546b20db11a4836f900efa6d3a3e74", 672099},
{"resource.007", 0, "56546b20db11a4836f900efa6d3a3e74", 794194},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - Italian Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -1168,7 +1191,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "11cb750f5f816445ad0f4b9f50a4f59a", 672527},
{"resource.007", 0, "11cb750f5f816445ad0f4b9f50a4f59a", 794259},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::IT_ITA, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - English DOS CD (from the King's Quest Collection)
// Executable scanning reports "x.yyy.zzz", VERSION file reports "1.000.052"
@@ -1178,7 +1201,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "449471bfd77be52f18a3773c7f7d843d", 571368},
{"resource.001", 0, "b45a581ff8751e052c7e364f58d3617f", 16800210},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// King's Quest 5 - English DOS CD (from the King's Quest Collection)
// Executable scanning reports "x.yyy.zzz", VERSION file reports "1.000.052"
@@ -1190,7 +1213,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "449471bfd77be52f18a3773c7f7d843d", 571368},
{"resource.001", 0, "b45a581ff8751e052c7e364f58d3617f", 16800210},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO_MIDIGM },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO1(GUIO_MIDIGM) },
// King's Quest 5 - English DOS Floppy
// SCI interpreter version 1.000.060
@@ -1205,7 +1228,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "672ede1136e9e401658538e51bd5dc22", 1172619},
{"resource.007", 0, "2f48faf27666b58c276dda20f91f4a93", 1240456},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - English DOS Floppy (supplied by omer_mor in bug report #3036996)
// VERSION file reports "0.000.051"
@@ -1220,7 +1243,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "06cb3f689836086ebe08b1efc0126592", 921113},
{"resource.007", 0, "252249753c6e850eacceb8af634986d3", 1133608},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 EGA (supplied by markcoolio in bug report #2829470)
// SCI interpreter version 1.000.060
@@ -1236,7 +1259,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "698c698570cde9015e4d51eb8d2e9db1", 666527},
{"resource.007", 0, "703d8df30e89541af337d7706540d5c4", 541743},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 EGA 1.2M disk version (from LordHoto)
// VERSION file reports "0.000.055"
@@ -1248,7 +1271,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "53206afb4fd73871a484e83acab80f31", 7608},
{"resource.004", 0, "83568edf7fde18b3eed988bc5d22ceb1", 1188053},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 EGA (supplied by omer_mor in bug report #3035421)
// VERSION file reports "0.000.062"
@@ -1263,7 +1286,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "698c698570cde9015e4d51eb8d2e9db1", 666541},
{"resource.007", 0, "703d8df30e89541af337d7706540d5c4", 541762},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest V DOS 0.000.062 EGA (5 x 5.25" disks)
// Supplied by ssburnout in bug report #3046780
@@ -1275,7 +1298,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "3cca5b2dae8afe94532edfdc98d7edbe", 1092325},
{"resource.004", 0, "8e5c1bc4d738cf7316ff506f59d265e2", 1187803},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(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
@@ -1290,7 +1313,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "d1a75fdc01840664d00366cff6919366", 1208972},
{"resource.007", 0, "c07494f0cce7c05210893938786a955b", 1337361},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - French DOS Floppy (from the King's Quest Collector's Edition 1994, also includes english language)
// Supplied by aroenai in bug report #2812611
@@ -1306,7 +1329,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f7dc85307632ef657ceb1651204f6f51", 1210081},
{"resource.007", 0, "7db4d0a1d8d547c0019cb7d2a6acbdd4", 1338473},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - Italian DOS Floppy (from glorifindel, includes english language)
// SCI interpreter version 1.000.060
@@ -1321,7 +1344,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "8eeabd92af71e766e323db2100879102", 1209325},
{"resource.007", 0, "dc10c107e0923b902326a040b9c166b9", 1337859},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::IT_ITA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722, includes english language?!)
// SCI interpreter version 1.000.060
@@ -1336,7 +1359,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "da82e4beb744731d0a151f1d4922fafa", 1170456},
{"resource.007", 0, "431def14ca29cdb5e6a5e84d3f38f679", 1240176},
AD_LISTEND},
- Common::PL_POL, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::PL_POL, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - English Macintosh
// VERSION file reports "1.000.055"
@@ -1351,7 +1374,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "3d22904a374c192f51e5665b74364133", 1264079},
{"resource.007", 0, "ffe17e23d5833a79f3695addfc149a56", 1361965},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 5 - FM-Towns (supplied by abevi in bug report #3038720)
{"kq5", "", {
@@ -1359,7 +1382,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "71afd220d46bde1109c58e6acc0f3a01", 469094},
{"resource.001", 0, "72a569f46f1abf2d9d2b1526ad3799c3", 12808839},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO1(GUIO_NONE) },
// King's Quest 5 - Japanese PC-98 Floppy 0.000.015 (supplied by omer_mor in bug report #3073583)
{"kq5", "", {
@@ -1371,7 +1394,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "e114ce8f884601c43308fb5cbbea4874", 1174129},
{"resource.005", 0, "349ad9438172265d00680075c5a988d0", 1019669},
AD_LISTEND},
- Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// King's Quest 6 - English DOS Non-Interactive Demo
// Executable scanning reports "1.001.055", VERSION file reports "1.000.000"
@@ -1381,7 +1404,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "535b1b920441ec73f42eaa4ccfd47b89", 264116},
{"resource.msg", 0, "54d1fdc936f98c81f9e4c19e04fb1510", 8260},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// King's Quest 6 - English DOS Floppy
// SCI interpreter version 1.001.054
@@ -1390,7 +1413,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "f2b7f753992c56a0c7a08d6a5077c895", 7863324},
{"resource.msg", 0, "3cf5de44de36191f109d425b8450efc8", 258590},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 6 - German DOS Floppy (supplied by markcoolio in bug report #2727156)
// SCI interpreter version 1.001.054
@@ -1399,7 +1422,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "f2b7f753992c56a0c7a08d6a5077c895", 7863324},
{"resource.msg", 0, "756297b2155db9e43f621c6f6fb763c3", 282822},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// King's Quest 6 - English DOS CD (from the King's Quest Collection)
// Executable scanning reports "1.cfs.158", VERSION file reports "1.034 9/11/94 - KQ6 version 1.000.00G"
@@ -1408,7 +1431,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7a550ebfeae2575ca00d47703a6a774c", 9215},
{"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376352},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// King's Quest 6 - English Windows CD (from the King's Quest Collection)
// Executable scanning reports "1.cfs.158", VERSION file reports "1.034 9/11/94 - KQ6 version 1.000.00G"
@@ -1417,7 +1440,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7a550ebfeae2575ca00d47703a6a774c", 9215},
{"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376352},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO1(GUIO_NONE) },
// King's Quest 6 - Spanish DOS CD (from jvprat)
// Executable scanning reports "1.cfs.158", VERSION file reports "1.000.000, July 5, 1994"
@@ -1427,7 +1450,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4da3ad5868a775549a7cc4f72770a58e", 8537260},
{"resource.msg", 0, "41eed2d3893e1ca6c3695deba4e9d2e8", 267102},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// King's Quest 6 - English Macintosh Floppy
// VERSION file reports "1.0"
@@ -1435,7 +1458,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data1", 0, "a183fc0c22fcbd9be4c8800d974b5599", 3892124},
{"Data2", 0, "b3722460dfd3097a1fbaf99a21ad8ea5", 15031272},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI32
@@ -1446,7 +1469,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4948e4e1506f1e1c4e1d47abfa06b7f8", 204385195},
{"resource.map", 0, "40ccafb2195301504eba2e4f4f2c7f3d", 18925},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// King's Quest 7 - English Windows (from the King's Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.4"
@@ -1454,7 +1477,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2be9ab94429c721af8e05c507e048a15", 18697},
{"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 203882535},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// King's Quest 7 - English DOS (from FRG)
// SCI interpreter version 2.100.002, VERSION file reports "2.00b"
@@ -1462,7 +1485,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// King's Quest 7 - English Windows (from FRG)
// SCI interpreter version 2.100.002, VERSION file reports "2.00b"
@@ -1470,7 +1493,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// King's Quest 7 - German Windows (supplied by markcoolio in bug report #2727402)
// SCI interpreter version 2.100.002
@@ -1478,7 +1501,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "838b9ff132bd6962026fee832e8a7ddb", 18697},
{"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 206626576},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// King's Quest 7 - Spanish DOS (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "2.00"
@@ -1486,7 +1509,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0b62693cbe87e3aaca3e8655a437f27f", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// King's Quest 7 - English DOS Non-Interactive Demo
// SCI interpreter version 2.100.002
@@ -1494,7 +1517,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "b44f774108d63faa1d021101221c5a54", 1690},
{"resource.000", 0, "d9659d2cf0c269c6a9dc776707f5bea0", 2433827},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#endif // ENABLE_SCI32
@@ -1510,7 +1533,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "aa553977f7e5804081de293800d3bcce", 695067},
{"resource.005", 0, "bfd870d51dc97729f0914095f58e6957", 676881},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Laura Bow - English Atari ST (from jvprat)
// Executable scanning reports "1.002.030", Floppy label reports "1.000.062, 9.23.90"
@@ -1522,7 +1545,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 667365},
{"resource.004", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 683737},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO1(GUIO_NOSPEECH) },
// Laura Bow - English DOS Non-Interactive Demo
// Executable scanning reports "x.yyy.zzz"
@@ -1530,7 +1553,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e625726268ff4e123ada11f31f0249f3", 768},
{"resource.001", 0, "0c8912290af0890f8d95faeb4ddb2d68", 333031},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Laura Bow - English DOS 3.5" Floppy (from "The Roberta Williams Anthology"/1996)
// SCI interpreter version 0.000.631
@@ -1541,7 +1564,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 667468},
{"resource.004", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 683807},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Laura Bow - English DOS (from FRG)
// SCI interpreter version 0.000.631
@@ -1555,7 +1578,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 328390},
{"resource.007", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 317687},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Laura Bow 2 - English DOS Non-Interactive Demo (from FRG)
// Executable scanning reports "x.yyy.zzz"
@@ -1564,7 +1587,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "24dffc5db1d88c7999f13e8767ed7346", 855},
{"resource.000", 0, "2b2b1b4f7584f9b38fd13f6ab95634d1", 781912},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Laura Bow 2 - English DOS Floppy
// Executable scanning reports "2.000.274"
@@ -1573,7 +1596,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "610bfd9a852004222f0faaf5fc9e630a", 6489},
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5035964},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Laura Bow 2 - English DOS CD (from "The Roberta Williams Antology"/1996)
// Executable scanning reports "1.001.072", VERSION file reports "1.1" (from jvprat)
@@ -1582,7 +1605,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a70945e61ba7ac7bfea6b7bd72c6aec5", 7274},
{"resource.000", 0, "82578b8d5a7e09c4c58891ca49fae35b", 5598672},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Laura Bow 2 v1.1 - French DOS Floppy (from Hkz)
{"laurabow2", "", {
@@ -1590,7 +1613,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
{"resource.msg", 0, "0fceedfbdd85a4bc7851fdd9dd2d2f19", 278253},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Laura Bow 2 v1.1 - German DOS Floppy (from Tobis87, updated info from markcoolio in bug report #2723787, updated info from #2797962))
// Executable scanning reports "2.000.274"
@@ -1599,7 +1622,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
{"resource.msg", 0, "795c928cd00dfec9fbc62ebcd12e1f65", 303185},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Laura Bow 2 - Spanish DOS CD (from jvprat)
// Executable scanning reports "2.000.274", VERSION file reports "1.000.000, May 10, 1994"
@@ -1608,7 +1631,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
{"resource.msg", 0, "71f1f0cd9f082da2e750c793a8ed9d84", 286141},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Larry 1 EGA Remake - English DOS (from spookypeanut)
// SCI interpreter version 0.000.510 (or 0.000.577?)
@@ -1619,7 +1642,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "24c958bc922b07f91e25e8c93aa01fcf", 491230},
{"resource.003", 0, "685cd6c1e05a695ab1e0db826337ee2a", 553279},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
#if 0
// The resource.002 file, contained in disk 3, is broken in this version
@@ -1637,7 +1660,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "5790ac0505f7ca98d4567132b875eb1e", 681041},
{"resource.003", 0, "4a34c3367c2fe7eb380d741374da1989", 572251},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
#endif
// Larry 1 VGA Remake - English DOS (from spookypeanut)
@@ -1648,7 +1671,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "ec20246209d7b19f38989261e5c8f5b8", 1111226},
{"resource.002", 0, "85d6935ef77e6b0e16bc307640a0d913", 1088312},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 1 VGA Remake - English DOS (from FRG)
// SCI interpreter version 1.000.510
@@ -1658,7 +1681,16 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "d34cadb11e1aefbb497cf91bc1d3baa7", 1114688},
{"resource.002", 0, "85b030bb66d5342b0a068f1208c431a8", 1078443},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
+
+ // Larry 1 VGA Remake - English Macintosh (from omer_mor, bug report #3328262)
+ {"lsl1sci", "SCI", {
+ {"resource.map", 0, "6395e7f7881e37e39d81ff5175a35f6f", 3237},
+ {"resource.000", 0, "5933df4ea688584d6f59fdea5a9404f8", 989066},
+ {"resource.001", 0, "aa6f153f70f1e32d1bde465fff08eecf", 1137418},
+ {"resource.002", 0, "b22c616aa789ebef990290c7ffd86548", 1097477},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 1 VGA Remake - English DOS Non-Interactive Demo
// SCI interpreter version 1.000.084
@@ -1666,7 +1698,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "434e1f6c39d71647b34f0ee57b2bbd68", 444},
{"resource.001", 0, "0c0768215c562d9dace4a5ca53696cf3", 359913},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Larry 1 VGA Remake - Spanish DOS (from the Leisure Suit Larry Collection, also includes english language)
// Executable scanning reports "1.SQ4.057", VERSION file reports "1.000"
@@ -1679,7 +1711,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "3fe2a3aec0ed53c7d6db1845a67e3aa2", 1095908},
{"resource.003", 0, "ac175df0ea9a2cba57f0248651856d27", 376556},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 1 VGA Remake - Russian DOS (also includes english language?!)
// Executable scanning reports "1.000.510", VERSION file reports "2.0"
@@ -1690,7 +1722,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "bc8ca10c807515d959cbd91f9ba47735", 1123759},
{"resource.002", 0, "b7409ab32bc3bee2d6cce887cd33f2b6", 1092160},
AD_LISTEND},
- Common::RU_RUS, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::RU_RUS, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 1 VGA Remake - Polish DOS (from Polish Leisure Suit Larry Collection, official release)
// SCI interpreter version 1.000.577, VERSION file reports "2.1" (this release does NOT include english text)
@@ -1698,7 +1730,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "58330a85767e42a2487129913283ab5b", 3228},
{"resource.000", 0, "b6097ff35cdc8469f02150fe2f824198", 4781210},
AD_LISTEND},
- Common::PL_POL, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::PL_POL, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 2 - English Amiga (from www.back2roots.org)
// Executable scanning reports "x.yyy.zzz"
@@ -1710,7 +1742,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "a0d4a625311d307257da7fc43d00459d", 570356},
{"resource.004", 0, "a0d4a625311d307257da7fc43d00459d", 717844},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 2 - English DOS Non-Interactive Demo
// Executable scanning reports "x.yyy.zzz"
@@ -1719,7 +1751,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "03dba704bb77da55a91ad27b5a3cac09", 528},
{"resource.001", 0, "9f5520f0297206928df0b0b36493cd33", 127532},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Larry 2 - English DOS
// SCI interpreter version 0.000.409
@@ -1732,7 +1764,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "4a24443a25e2b1492462a52809605dc2", 277732},
{"resource.006", 0, "4a24443a25e2b1492462a52809605dc2", 345683},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 2 - English DOS
// SCI interpreter version 0.000.343
@@ -1747,7 +1779,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
//{"resource.006", 0, "96033f57accfca903750413fd09193c8", 345818},
{"resource.006", 0, "96033f57accfca903750413fd09193c8", -1}, // 345818 or 208739
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 2 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.000.011 3x3.5" (label: Int. #0.000.343)
@@ -1757,7 +1789,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "96033f57accfca903750413fd09193c8", 407014},
{"resource.003", 0, "96033f57accfca903750413fd09193c8", 592834},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 2 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.002.000 3x3.5" (label: INT#0.000.409)
@@ -1767,7 +1799,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "4a24443a25e2b1492462a52809605dc2", 406935},
{"resource.003", 0, "4a24443a25e2b1492462a52809605dc2", 592533},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 3 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
@@ -1781,7 +1813,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "f408e59cbee1457f042e5773b8c53951", 651634},
{"resource.005", 0, "433911eb764089d493aed1f958a5615a", 524259},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 3 - English DOS
// SCI interpreter version 0.000.572
@@ -1792,7 +1824,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "f18441027154292836b973c655fa3175", 506807},
{"resource.004", 0, "f18441027154292836b973c655fa3175", 513651},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 3 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.021 8x5.25" (label: Int#5.15.90)
@@ -1806,7 +1838,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f18441027154292836b973c655fa3175", 282649},
{"resource.007", 0, "f18441027154292836b973c655fa3175", 257178},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 3 - English DOS
// SCI interpreter version 0.000.572
@@ -1820,7 +1852,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f18441027154292836b973c655fa3175", 282465},
{"resource.007", 0, "f18441027154292836b973c655fa3175", 257174},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 3 - English DOS Non-Interactive Demo
// SCI interpreter version 0.000.530
@@ -1829,7 +1861,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "f773d79b93dfd4052ec8c1cc64c1e6ab", 76525},
{"resource.002", 0, "f773d79b93dfd4052ec8c1cc64c1e6ab", 268299},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Larry 3 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723832, also includes english language)
// Executable scanning reports "S.old.123"
@@ -1841,7 +1873,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "3827a9b17b926e12dcc336860f50612a", 587036},
{"resource.004", 0, "3827a9b17b926e12dcc336860f50612a", 691932},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 3 - French DOS (provided by richiefs in bug report #2670691, also includes english language)
// Executable scanning reports "S.old.123"
@@ -1853,7 +1885,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "65f1bdaa20f6d0470e9d969f22473873", 586921},
{"resource.004", 0, "65f1bdaa20f6d0470e9d969f22473873", 690826},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 3 1.050 Fr/En (9 x 5.25" disks)
// Provided by ssburnout in bug report #3046779
@@ -1867,7 +1899,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "65f1bdaa20f6d0470e9d969f22473873", 325292},
{"resource.007", 0, "65f1bdaa20f6d0470e9d969f22473873", 308982},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - English Amiga
// Executable scanning reports "1.004.023"
@@ -1882,7 +1914,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "f8b2d1137bb767e5d232056b99dd69eb", 623621},
{"resource.006", 0, "bafc64e3144f115dc58c6aee02de98fb", 715598},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - German Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -1898,7 +1930,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "bafc64e3144f115dc58c6aee02de98fb", 754966},
{"resource.007", 0, "59eba83ad465b08d763b44f86afa86f6", 683135},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.000.181
@@ -1906,7 +1938,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "efe8d3f45ce4f6bd9a6643e0ac8d2a97", 504},
{"resource.001", 0, "8bd8d9c0b5f455ee1269d63ce86c50dd", 531380},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - English DOS (from spookypeanut)
// SCI interpreter version 1.000.510
@@ -1921,7 +1953,21 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1024810},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 1030656},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
+
+ // Larry 5 - English Macintosh (from omer_mor, bug report #3328257)
+ {"lsl5", "", {
+ {"resource.map", 0, "f12439da78b9878e16436661deb83f84", 6525},
+ {"resource.000", 0, "f2537473213d70e7f4fc82e988ab90ca", 702403},
+ {"resource.001", 0, "db4a1381d88028876a99303bfaaba893", 704679},
+ {"resource.002", 0, "e86aeb27711f4a673e06ec32cfc84125", 1125854},
+ {"resource.003", 0, "13fd4942bb818f9acd2970d66fca6509", 854733},
+ {"resource.004", 0, "999f407c9f38f937d4b8c4230ff5bb38", 1046644},
+ {"resource.005", 0, "0cc8d35a744031c772ca7cd21ae95273", 1008293},
+ {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1110043},
+ {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 989801},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - German DOS (from Tobis87)
// SCI interpreter version T.A00.196
@@ -1936,7 +1982,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1021774},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 993408},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - French DOS (provided by richiefs in bug report #2670691)
// Executable scanning reports "1.lsl5.019"
@@ -1952,7 +1998,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 946540},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 958842},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - Spanish DOS (from the Leisure Suit Larry Collection)
// Executable scanning reports "1.ls5.006", VERSION file reports "1.000, 4/21/92"
@@ -1968,7 +2014,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1015136},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 987222},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Larry 5 - Italian DOS Floppy (from glorifindel)
// SCI interpreter version 1.000.510 (just a guess)
@@ -1976,7 +2022,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a99776df795127f387cb35dae872d4e4", 5919},
{"resource.000", 0, "a8989a5a89e7d4f702b26b378c7a357a", 7001981},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::IT_ITA, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 5 1.0 EGA DOS (8 x 3.5" disks)
// Provided by ssburnout in bug report #3046806
@@ -1991,7 +2037,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f6046a8445422f17d40b1b10ab21ebf3", 568551},
{"resource.007", 0, "640ee65595d40372ef95462f2c1ae28a", 593429},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 5 EGA
// Supplied by omer_mor in bug report #3049771
@@ -2002,7 +2048,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "5a55af4e40728b1a8103dc47ad2afa8d", 1100539},
{"resource.003", 0, "16f4d8fb1b526125edaca4fc6cbb7530", 1064563},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 6 - English DOS (from spookypeanut)
// SCI interpreter version 1.001.113
@@ -2010,7 +2056,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "bb8a39d9e2a77ba449a1e591109ad9a8", 6973},
{"resource.000", 0, "4462fe48c7452d98fddcec327a3e738d", 5789138},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Larry 6 - English/German/French DOS CD - LOWRES
// SCI interpreter version 1.001.115
@@ -2018,7 +2064,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0b91234b7112782962cb480b7791b6e2", 7263},
{"resource.000", 0, "57d5fe8bb9e044158514476ea7678eb0", 5754790},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Larry 6 - German DOS CD - LOWRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 1.001.115
@@ -2026,7 +2072,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "bafe85f32738854135991d4324ad147e", 7268},
{"resource.000", 0, "f6cbc6da7b90ea135883e0759848ca2c", 5773160},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Larry 6 - French DOS CD - LOWRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 1.001.115
@@ -2034,7 +2080,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "97797ea775baaf18a1907d357d3c0ea6", 7268},
{"resource.000", 0, "f6cbc6da7b90ea135883e0759848ca2c", 5776092},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Larry 6 - Spanish DOS - LOWRES (from the Leisure Suit Larry Collection)
// Executable scanning reports "1.001.113", VERSION file reports "1.000, 11.06.93, FIVE PATCHES ADDED TO DISK 6 ON 11-18-93"
@@ -2042,7 +2088,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "633bf8f42170b6271019917c8009989b", 6943},
{"resource.000", 0, "7884a8db9253e29e6b37a2651fd90ba3", 5733116},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Crazy Nick's Software Picks: Leisure Suit Larry's Casino - English DOS (from the Leisure Suit Larry Collection)
// Executable scanning reports "1.001.029", VERSION file reports "1.000"
@@ -2050,60 +2096,60 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "194f1578f2624db813c9072359ad1639", 783},
{"resource.001", 0, "3733433b517ec3d14a3331d9ab3842ae", 344830},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Crazy Nick's Software Picks: King Graham's Board Game Challenge
{"cnick-kq", "", {
{"resource.map", 0, "44bc538a5cd24b39ffccc967c0ebf84d", 1137},
{"resource.001", 0, "470e7a4a3504635e70b623c44461e1ac", 451272},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Crazy Nick's Software Picks: Parlor Games with Laura Bow
{"cnick-laurabow", "", {
{"resource.map", 0, "3b826bfe64f8ff1ccf30eef93cd2f727", 999},
{"resource.001", 0, "985ac8db6f636f2b4334c04b0fbb44fb", 336698},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Crazy Nick's Software Picks: Robin Hood's Game of Skill and Chance
{"cnick-longbow", "", {
{"resource.map", 0, "4a5c81f485a2416bde12978506f2fb5f", 897},
{"resource.001", 0, "ef16dc9e867eb8eeb5b13e110b90bd4b", 571466},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Crazy Nick's Software Picks: Roger Wilco's Spaced Out Game Pack
{"cnick-sq", "", {
{"resource.map", 0, "b4d95b02d84e297441bd999d34eaa6b1", 879},
{"resource.001", 0, "82ff2b64a60117886fbcd6a3a8c977c6", 364921},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI32
// Larry 6 - English/German DOS CD - HIRES
// SCI interpreter version 2.100.002
- {"lsl6hires", "", {
+ {"lsl6hires", "Hi-res", {
{"resource.map", 0, "0c0804434ea62278dd15032b1947426c", 8872},
{"resource.000", 0, "9a9f4870504444cda863dd14d077a680", 18520872},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Larry 6 - German DOS CD - HIRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
- {"lsl6hires", "", {
+ {"lsl6hires", "Hi-res", {
{"resource.map", 0, "badfdf446ffed569a310d2c63a249421", 8896},
{"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18534274},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Larry 6 - French DOS CD - HIRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
- {"lsl6hires", "", {
+ {"lsl6hires", "Hi-res", {
{"resource.map", 0, "d184e9aa4f2d4b5670ddb3669db82cda", 8896},
{"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18538987},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Larry 7 - English DOS Demo (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
@@ -2111,7 +2157,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "5cc6159688b2dc03790a67c90ccc67f9", 10195878},
{"resmap.000", 0, "6a2b2811eef82e87cde91cf1de845af8", 2695},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI3_GAMES
// Larry 7 - English DOS CD (from spookypeanut)
@@ -2120,7 +2166,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "eae93e1b1d1ccc58b4691c371281c95d", 8188},
{"ressci.000", 0, "89353723488219e25589165d73ed663e", 66965678},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Larry 7 - German DOS (from Tobis87)
// SCI interpreter version 3.000.000
@@ -2128,7 +2174,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "c11e6bfcfc2f2d05da47e5a7df3e9b1a", 8188},
{"ressci.000", 0, "a8c6817bb94f332ff498a71c8b47f893", 66971724},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Larry 7 - French DOS (provided by richiefs in bug report #2670691)
// SCI interpreter version 3.000.000
@@ -2136,7 +2182,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "4407849fd52fe3efb0c30fba60cd5cd4", 8206},
{"ressci.000", 0, "dc37c3055fffbefb494ff22b145d377b", 66964472},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Larry 7 - Italian DOS CD (from glorifindel)
// SCI interpreter version 3.000.000
@@ -2144,7 +2190,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "9852a97141f789413f29bf956052acdb", 8212},
{"ressci.000", 0, "440b9fed89590abb4e4386ed6f948ee2", 67140181},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::IT_ITA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Larry 7 - Spanish DOS (from the Leisure Suit Larry Collection)
// Executable scanning reports "3.000.000", VERSION file reports "1.0s"
@@ -2152,7 +2198,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "8f3d603e1acc834a5d598b30cdfc93f3", 8188},
{"ressci.000", 0, "32792f9bc1bf3633a88b382bb3f6e40d", 67071418},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#endif
// Lighthouse - English Windows Demo (from jvprat)
@@ -2161,7 +2207,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "543124606352bfa5e07696ddf2a669be", 64},
{"resource.000", 0, "5d7714416b612463d750fb9c5690c859", 28952},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI3_GAMES
// Lighthouse - English Windows Demo
@@ -2170,7 +2216,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "3bdee7a16926975a4729f75cf6b80a92", 1525},
{"ressci.000", 0, "3c585827fa4a82f4c04a56a0bc52ccee", 11494351},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Lighthouse - English DOS (from jvprat)
// Executable scanning reports "3.000.000", VERSION file reports "1.1"
@@ -2180,7 +2226,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.002", 0, "c68db5333f152fea6ca2dfc75cad8b34", 7573},
{"ressci.002", 0, "175468431a979b9f317c294ce3bc1430", 94628315},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Lighthouse - Spanish DOS (from jvprat)
// Executable scanning reports "3.000.000", VERSION file reports "1.1"
@@ -2190,7 +2236,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.002", 0, "e7dc85884a2417e2eff9de0c63dd65fa", 7630},
{"ressci.002", 0, "3c8d627c555b0e3e4f1d9955bc0f0df4", 94631127},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#endif // ENABLE_SCI3_GAMES
#endif // ENABLE_SCI32
@@ -2201,7 +2247,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "8be56a3a88c065ee00c02c0e29199f3a", 14643},
{"resource.001", 0, "9e33566515b18bee7915db448063bba2", 871853},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Fairy Tales - English DOS Floppy EGA (from omer_mor, bug report #3035350)
{"fairytales", "EGA", {
@@ -2212,7 +2258,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "509b2467ba779100d5933ed51a9ae32f", 560255},
{"resource.004", 0, "93afc85d5ffa60ea555d6cc336d22c03", 651109},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Fairy Tales v1.000 - English DOS (supplied by markcoolio in bug report #2723791)
// Executable scanning reports "1.000.145"
@@ -2224,7 +2270,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "b1288e0821ee358d1ffe877e5900c8ec", 1047565},
{"resource.004", 0, "f79daa70390d73746742ffcfc3dc4471", 937580},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Fairy Tales - English DOS Floppy (from jvprat)
// Executable scanning reports "1.000.145", Floppy label reports "1.0, 11.13.91", VERSION file reports "1.000"
@@ -2235,7 +2281,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "564f516d991032e781492592a4eaa275", 1414142},
{"resource.003", 0, "dd6cef0c592eadb7e6be9a25307c57a2", 1344719},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Mother Goose - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.003.009"
@@ -2245,7 +2291,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "fb552ae550ca1dac19ed8f6a3767612d", 262885},
{"resource.002", 0, "fb552ae550ca1dac19ed8f6a3767612d", 817191},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Mother Goose - English DOS Floppy EGA (from omer_mor, bug report #3035354)
{"mothergoose", "EGA", {
@@ -2253,7 +2299,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "d893892d62b3f061357291d66775e360", 239906},
{"resource.002", 0, "d893892d62b3f061357291d66775e360", 719398},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(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)
@@ -2266,7 +2312,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "dbbc22f124533ce308bc386b08956326", 146251},
{"resource.005", 0, "2ba5348e7fad641b9c4c7ff7c7cf4e68", 110979},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Mother Goose v2.000 - English DOS Floppy (supplied by markcoolio in bug report #2723795)
// Executable scanning reports "1.001.031"
@@ -2274,7 +2320,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "52aae15e493cafd1da7e1c9b657a5bb9", 7026},
{"resource.000", 0, "b7ecd8ae9e254e80310b5a668b276e6e", 2948975},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Mother Goose - English DOS CD (from jvprat)
// Executable scanning reports "x.yyy.zzz"
@@ -2283,7 +2329,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "1c7f311b0a2c927b2fbe81ae341fb2f6", 5790},
{"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 4369438},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Mixed-Up Mother Goose - English Windows Interactive Demo
// Executable scanning reports "x.yyy.zzz"
@@ -2291,14 +2337,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "87f9dc1cafc4d4fa835fb2f00cf3a6ef", 4560},
{"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 2070072},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Mixed-Up Mother Goose - FM-Towns (supplied by abevi in bug report #3038720)
{"mothergoose256", "", {
{"resource.map", 0, "b11e971ccd2040bebba59dfb409a08ef", 5772},
{"resource.001", 0, "d49625d9b8005ec01c852f8322a82867", 4330713},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO1(GUIO_NONE) },
#ifdef ENABLE_SCI32
// Mixed-Up Mother Goose Deluxe - English Windows/DOS CD (supplied by markcoolio in bug report #2723810)
@@ -2307,7 +2353,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5159a1578c4306bfe070a3e4d8c2e1d3", 4741},
{"resource.000", 0, "1926925c95d82f0999590e93b02887c5", 15150768},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Mixed-Up Mother Goose Deluxe - Multilingual Windows CD (English/French/German/Spanish)
// Executable scanning reports "2.100.002"
@@ -2315,7 +2361,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969},
{"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
#endif // ENABLE_SCI32
// Ms. Astro Chicken - English DOS
@@ -2324,7 +2370,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5b457cbe5042f557e5b610148171f6c0", 1158},
{"resource.001", 0, "453ea81ef66a50cbe33ce06302afe47f", 229737},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI32
// Phantasmagoria - English DOS (from jvprat)
@@ -2345,7 +2391,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.007", 0, "afbd16ea77869a720afa1c5371de107d", 7972},
//{"ressci.007", 0, "3aae6559aa1df273bc542d5ac6330d75", 25859038},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Phantasmagoria - English DOS Demo
// Executable scanning reports "2.100.002"
@@ -2353,7 +2399,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.001", 0, "416138651ea828219ca454cae18341a3", 11518},
{"ressci.001", 0, "3aae6559aa1df273bc542d5ac6330d75", 65844612},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Phantasmagoria - English DOS/Windows (GOG version) - ressci.* merged in ressci.000
// Windows executable scanning reports "2.100.002" - "Sep 19 1995 15:09:43"
@@ -2364,7 +2410,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "cd5967f9b9586e3380645961c0765be3", 116822037},
{"resmap.000", 0, "3cafc1c6a53945c1f3babbfd6380c64c", 16468},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Phantasmagoria - English Macintosh
// NOTE: This only contains disc 1 files (as well as the two persistent files:
@@ -2380,7 +2426,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
// Data8-12 are empty
{"Data13", 0, "6d2c450fca19a69b5af74ed5b03c0a17", 14923328},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
#ifdef ENABLE_SCI3_GAMES
// Phantasmagoria 2 - English Windows (from jvprat)
@@ -2397,7 +2443,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.005", 0, "8bd5ceeedcbe16dfe55d1b90dcd4be84", 1942},
{"ressci.005", 0, "05f9fe2bee749659acb3cd2c90252fc5", 67905112},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Phantasmagoria 2 - English DOS (GOG version) - ressci.* merged in ressci.000
// Executable scanning reports "3.000.000" - "Dec 07 1996 09:29:03"
@@ -2407,7 +2453,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "c54f26d9f43f908151263254b6d97053", 108134481},
{"resmap.000", 0, "de154a223a9ef4ea7358b76adc38ef5b", 2956},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#endif // ENABLE_SCI3_GAMES
#endif // ENABLE_SCI32
@@ -2418,7 +2464,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "72726dc81c1b4c1110c486be77369bc8", 5179},
{"resource.000", 0, "670d0c53622429f4b11275caf7f8d292", 5459574},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Pepper - English DOS Non-Interactive Demo
// Executable scanning reports "1.001.060", VERSION file reports "1.000"
@@ -2426,7 +2472,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "379bb4fb896630b14f2d91ed21e36ba1", 984},
{"resource.000", 0, "118f6c31a93ec7fd9a231c61125229e3", 645494},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Pepper - English DOS/Windows Interactive Demo
// Executable scanning reports "1.001.069", VERSION file reports ".001"
@@ -2434,7 +2480,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "975e8df76106a5c13d12ab674f906a02", 2514},
{"resource.000", 0, "e6a918a2dd7a4bcecd8fb389f43287c2", 1698164},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Pepper - English DOS Interactive Demo
// Executable scanning reports "1.001.072", VERSION file reports "1.000"
@@ -2442,7 +2488,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "9c9b7b900651a370dd3fb38d478b1798", 2524},
{"resource.000", 0, "e6a918a2dd7a4bcecd8fb389f43287c2", 1713544},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Police Quest 1 VGA Remake - English DOS (from the Police Quest Collection)
// Executable scanning reports "1.001.029", VERSION file reports "2.000"
@@ -2450,7 +2496,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "35efa814fb994b1cbdac9611e401da67", 5013},
{"resource.000", 0, "e0d5ddf34eda903a38f0837e2aa7145b", 6401433},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 2 - English Amiga (from www.back2roots.org)
// SCI interpreter version 0.000.685 (just a guess)
@@ -2461,7 +2507,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "499737c21a28ac026e11ab817100d610", 511099},
{"resource.003", 0, "e008f5d6e2a7c4d4a0da0173e4fa8f8b", 553970},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 2 - English DOS Non-Interactive Demo
// Executable scanning reports "0.000.413"
@@ -2469,7 +2515,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8b77d0d4650c2052b356cece28294b58", 576},
{"resource.001", 0, "376ef6d6eaaeed66e1424bd219c4b9ab", 215398},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Police Quest 2 - English DOS (provided by richiefs in bug report #2670691)
// SCI interpreter version 0.000.395
@@ -2482,7 +2528,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "77f02def3094af804fd2371db25b7100", 349899},
{"resource.006", 0, "77f02def3094af804fd2371db25b7100", 354991},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 2 - English DOS (from the Police Quest Collection)
// Executable scanning reports "0.000.490"
@@ -2492,7 +2538,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "77f02def3094af804fd2371db25b7100", 546000},
{"resource.003", 0, "77f02def3094af804fd2371db25b7100", 591851},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 2 - English DOS (from FRG)
// SCI interpreter version 0.000.395
@@ -2502,7 +2548,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "77f02def3094af804fd2371db25b7100", 542897},
{"resource.003", 0, "77f02def3094af804fd2371db25b7100", 586857},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 2 English DOS 1.001.006 (supplied by merkur-kun in bug report #3028479)
{"pq2", "", {
@@ -2511,7 +2557,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "77f02def3094af804fd2371db25b7100", 541261},
{"resource.003", 0, "77f02def3094af804fd2371db25b7100", 587511},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 2 - Japanese PC-98 (also includes english language)
// SCI interpreter version unknown
@@ -2521,7 +2567,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 637662},
{"resource.003", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 684395},
AD_LISTEND},
- Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Police Quest 3 - English Amiga
// Executable scanning reports "1.004.024"
@@ -2534,7 +2580,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "630bfa65beb05f743552704ac2899dae", 759891},
{"resource.004", 0, "7b229fbdf30d670d0728cede3e984a7e", 838663},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 3 - German Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -2548,7 +2594,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "6258d5dd85898d8e218eb8113ebc9059", 722738},
{"resource.005", 0, "6258d5dd85898d8e218eb8113ebc9059", 704485},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Police Quest 3 - English DOS (from the Police Quest Collection)
// Executable scanning reports "T.A00.178", VERSION file reports "1.00"
@@ -2561,7 +2607,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "8791b9eef53edf77c2dac950142221d3", 1159791},
{"resource.004", 0, "1b91e891a3c60a941dac0eecdf83375b", 1143606},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 3 - English DOS Non-Interactive Demo
// Executable scanning reports "T.A00.052"
@@ -2571,7 +2617,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "277f97771f7a6d89677141f02da313d6", 65150},
{"resource.001", 0, "5c5a551b6c86cce2ee75becb90e0b586", 624411},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Police Quest 3 - German DOS (supplied by markcoolio in bug report #2723837, also includes english language)
// Executable scanning reports "T.A00.178"
@@ -2584,7 +2630,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "4836f460f4cfc8de61e2df4c45775504", 1180956},
{"resource.004", 0, "0c3eb84b9755852d9e795e0d5c9373c7", 1171760},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Police Quest 3 EGA
// Reported by musiclyinspired in bug report #3046573
@@ -2597,7 +2643,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "b96a86ab681769e4cbb439670d967ca6", 449682},
{"resource.005", 0, "9e6c53a0e7eef53694d260fade8b1fc7", 724000},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Police Quest 4 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.096
@@ -2605,7 +2651,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "be56f87a1c4a13062a30a362df860c2f", 1472},
{"resource.000", 0, "527d5684016e6816157cd15d9071b11b", 1121310},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI32
// Police Quest 4 - English DOS CD (from the Police Quest Collection)
@@ -2614,7 +2660,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "379dfe80ed6bd16c47e4b950c4722eac", 11374},
{"resource.000", 0, "fd316a09b628b7032248139003369022", 18841068},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
+
+ // Police Quest 4 - German DOS CD (German text, English speech)
+ // Supplied by markcoolio in bug report #3392955
+ {"pq4", "CD", {
+ {"resource.map", 0, "a398076371ed0e1e706c8f9fb9fc7ac5", 11386},
+ {"resource.000", 0, "6ff21954e0a2c5992279e7eb787c8d56", 18918747},
+ AD_LISTEND},
+ Common::DE_DEU, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Police Quest 4 - English DOS
// SCI interpreter version 2.000.000 (a guess?)
@@ -2622,7 +2676,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "aed9643158ccf01b71f359db33137f82", 9895},
{"resource.000", 0, "da383857b3be1e4514daeba2524359e0", 15141432},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Police Quest 4 - French DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 2.000.000
@@ -2630,7 +2684,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "008030846edcc7c5c7a812c7f4ae4ceb", 9256},
{"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730153},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Police Quest 4 - German DOS (supplied by markcoolio in bug report #2723840)
// SCI interpreter version 2.000.000 (a guess?)
@@ -2638,7 +2692,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2393ee728ab930b2762cb5889f9b5aff", 9256},
{"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730155},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Police Quest: SWAT - English DOS/Windows Demo (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "0.001.200"
@@ -2646,7 +2700,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8c96733ef94c21526792f7ca4e3f2120", 1648},
{"resource.000", 0, "d8892f1b8c56c8f7704325460f49b300", 3676175},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Police Quest: SWAT - English DOS (from GOG.com)
// Executable scanning reports "2.100.002", VERSION file reports "1.0c"
@@ -2654,7 +2708,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "1c2563fee189885e29d9348f37306d94", 12175},
{"ressci.000", 0, "b2e1826ca81ce2e7e764587f5a14eee9", 127149181},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Police Quest: SWAT - English Windows (from the Police Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.0c"
@@ -2669,7 +2723,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.004", 0, "4228038906f041623e65789500b22285", 6835},
{"ressci.004", 0, "b7e619e6ecf62fe65d5116a3a422e5f0", 46223872},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
#endif // ENABLE_SCI32
// Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy (supplied by merkur in bug report #2718784)
@@ -2682,7 +2736,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 642203},
{"resource.004", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 641688},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy (supplied by alonzotg in bug report #3206006)
{"qfg1", "", {
@@ -2693,7 +2747,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 642203},
{"resource.004", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 641688},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy (supplied by markcoolio in bug report #2723843)
// Executable scanning reports "0.000.566"
@@ -2708,7 +2762,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "69366c2a2f99917199fe1b60a4fee19d", 267852},
{"resource.007", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 272747},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(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)
@@ -2723,7 +2777,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "69366c2a2f99917199fe1b60a4fee19d", 267852},
{"resource.007", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 272747},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(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)
@@ -2738,7 +2792,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f46690dca714abc8c89357d30e363dd3", 278387},
{"resource.007", 0, "951299a82a8134ed12c5c18118d45c2f", 269173},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 / Hero's Quest - English DOS Demo
// Executable scanning reports "0.000.685"
@@ -2746,7 +2800,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "df34c758cbb9026da175793ff686b0e6", 882},
{"resource.001", 0, "73fbaafdd313b39aeedb80fbf85ecef1", 389884},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes English language)
// Executable scanning reports "S.old.201"
@@ -2756,7 +2810,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1136968},
{"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 769897},
AD_LISTEND},
- Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes English language)
// Executable scanning reports "S.old.201"
@@ -2766,7 +2820,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1147121},
{"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 777575},
AD_LISTEND},
- Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 - English Amiga
// Executable scanning reports "1.002.020"
@@ -2780,7 +2834,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "16cd4414c37ae3bb6d6da33dce8e25e8", 689124},
{"resource.005", 0, "5f3386ef2f2b1254e4a066f5d9027324", 609529},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 (from abevi, bug report #2612718)
{"qfg1", "", {
@@ -2791,7 +2845,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "f0af87c60ec869946da442833aa5afa8", 640502},
{"resource.004", 0, "f0af87c60ec869946da442833aa5afa8", 644575},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 - English DOS
// SCI interpreter version 0.000.629
@@ -2803,7 +2857,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "951299a82a8134ed12c5c18118d45c2f", 640483},
{"resource.004", 0, "951299a82a8134ed12c5c18118d45c2f", 644443},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 VGA Remake - English DOS
// Executable scanning reports "2.000.411"
@@ -2811,7 +2865,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a731fb6c9c0b282443f7027bc8694d4c", 8469},
{"resource.000", 0, "ecace1a2771846b1a8aa1afdd44111a0", 6570147},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 VGA Remake - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.029
@@ -2819,7 +2873,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ac0257051c95a59c0cdc0be24d9b11fa", 729},
{"resource.000", 0, "ec6f5cf369054dd3e5392995e9975b9e", 768218},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 1 VGA Remake - English Macintosh Floppy
// VERSION file reports "2.0"
@@ -2827,7 +2881,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data1", 0, "106527ff8756e4e1a795d63d23e8b833", 1752358},
{"Data2", 0, "5cdd92033231159c6e9c71d43e9f194d", 6574746},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 2 - English Amiga
// Executable scanning reports "1.003.004"
@@ -2843,7 +2897,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "ccf5dba33e5cab6d5872838c0f8db44c", 500039},
{"resource.007", 0, "4c9fc1587545879295cb9627f56a2cb8", 575056},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 2 - English (supplied by ssburnout in bug report #3049193)
// 1.000 5x5.25" (label: INT#10.31.90)
@@ -2855,7 +2909,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "0790f67d87642132be515cab05026baa", 972144},
{"resource.004", 0, "2ac1e6fea9aa1f5b91a06693a67b9766", 982830},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 2 - English (supplied by ssburnout in bug report #3049193)
// 1.000 9x3.5" (label: INT#10.31.90)
@@ -2870,7 +2924,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "5e9deacbdb17198ad844988e04833520", 498593},
{"resource.007", 0, "2ac1e6fea9aa1f5b91a06693a67b9766", 490151},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 2 - English (from FRG)
// Executable scanning reports "1.000.072"
@@ -2882,7 +2936,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "b192607c42f6960ecdf2ad2e4f90e9bc", 972804},
{"resource.004", 0, "cd2de58e27665d5853530de93fae7cd6", 983617},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 2 - English DOS
// Executable scanning reports "1.000.072"
@@ -2897,7 +2951,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "b1944bd664ddbd2859cdaa0c4a0d6281", 507489},
{"resource.007", 0, "cd2de58e27665d5853530de93fae7cd6", 490794},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 2 - English DOS Non-Interactive Demo
// Executable scanning reports "1.000.046"
@@ -2905,7 +2959,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e75eb86bdd517b3ef709058249986a87", 906},
{"resource.001", 0, "9b098f9e1008abe30e56c93b896494e6", 362123},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 3 - English DOS Non-Interactive Demo (from FRG)
// Executable scanning reports "1.001.021", VERSION file reports "1.000, 0.001.059, 6.12.92"
@@ -2913,7 +2967,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "fd71de9b588a45f085317caacf050e91", 687},
{"resource.000", 0, "b6c69bf6c18bf177492249fe81fc6a6d", 648702},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 3 - English DOS
// SCI interpreter version 1.001.050
@@ -2921,7 +2975,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958},
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 3 - English DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 1.001.050
@@ -2929,7 +2983,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "62c185d190363d7df06330fa0cc45b36", 5958},
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5867442},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 3 - English DOS (supplied by dknute in bug report #3125559)
{"qfg3", "", {
@@ -2937,7 +2991,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868042},
{"resource.msg", 0, "27e5419c98ce444253f88c95dced14a9", 246888},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 3 - German DOS (supplied by markcoolio in bug report #2723846)
// Executable scanning reports "L.rry.083"
@@ -2945,7 +2999,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958},
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868042},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 3 - Spanish DOS CD (from jvprat)
// Executable scanning reports "L.rry.083", VERSION file reports "1.000.000, June 30, 1994"
@@ -2954,7 +3008,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "ba7ac86155e4c531e46cd73c86daa80a", 5884098},
{"resource.msg", 0, "a63974730d294dec0bea10057c36e506", 256014},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE },
+ Common::ES_ESP, Common::kPlatformPC, 0, GUIO1(GUIO_NONE) },
// Quest for Glory 3 - Italian DOS
// Supplied by ghoost in bug report #3053457
@@ -2963,7 +3017,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000},
{"resource.msg", 0, "5a0a896ff3e4a628db38a75eb6c84114", 259018},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NONE },
+ Common::IT_ITA, Common::kPlatformPC, 0, GUIO1(GUIO_NONE) },
// Quest for Glory 4 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.069 (just a guess)
@@ -2971,7 +3025,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "1ba7c7ae1efb315326d45cb931569b1b", 922},
{"resource.000", 0, "41ba03f0b188b029132daa3ece0d3e14", 623154},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI32
// Quest for Glory 4 1.1 Floppy - English DOS (supplied by markcool in bug report #2723852)
@@ -2980,7 +3034,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "685bdb1ed47bbbb0e5e25db392da83ce", 9301},
{"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11004993},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 4 1.1 Floppy - English DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 2.000.000
@@ -2988,7 +3042,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "d10a4cc177d2091d744e2ad8c049b0ae", 9295},
{"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11003589},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 4 1.1 Floppy - German DOS (supplied by markcool in bug report #2723850)
// Executable scanning reports "2.000.000", VERSION file reports "1.1"
@@ -2996,7 +3050,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "9e0abba8746f40565bc7eb5720522ecd", 9301},
{"resource.000", 0, "57f22cdc54eeb35fce1f26b31b5c3ee1", 11076197},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Quest for Glory 4 CD - English DOS/Windows (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -3004,7 +3058,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "aba367f2102e81782d961b14fbe3d630", 10246},
{"resource.000", 0, "263dce4aa34c49d3ad29bec889007b1c", 11571394},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// RAMA - English DOS/Windows Demo
// Executable scanning reports "2.100.002", VERSION file reports "000.000.008"
@@ -3012,7 +3066,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.001", 0, "775304e9b2a545156be4d94209550094", 1393},
{"ressci.001", 0, "259437fd75fdf51e8207fda8c01fa4fd", 2334384},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
#ifdef ENABLE_SCI3_GAMES
// RAMA - English Windows (from jvprat)
@@ -3025,7 +3079,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.003", 0, "31ef4c0621711585d031f0ae81707251", 1636},
{"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6860492},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// RAMA - English Windows (from Quietust, in bug report #2850645)
{"rama", "", {
@@ -3036,7 +3090,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.003", 0, "48841e4b84ef1b98b48d43566fda9e13", 1636},
{"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6870356},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// RAMA - Italian Windows CD (from glorifindel)
// SCI interpreter version 3.000.000 (a guess?)
@@ -3044,7 +3098,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.001", 0, "2a68edd064e5e4937b5e9c74b38f2082", 70611091},
{"resmap.001", 0, "70ba2ff04a2b7fb2c52420ba7fbd47c2", 8338},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE },
+ Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
#endif // ENABLE_SCI3_GAMES
// Shivers - English Windows (from jvprat)
@@ -3053,14 +3107,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "f2ead37749ed8f6535a2445a7d05a0cc", 46525},
{"ressci.000", 0, "4294c6d7510935f2e0a52e302073c951", 262654836},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Shivers - German Windows (from Tobis87)
{"shivers", "", {
{"resmap.000", 0, "f483d0a1f78334c18052e92785c3086e", 46537},
{"ressci.000", 0, "6751b144671e2deed919eb9d284b07eb", 262390692},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Shivers - English Windows Demo
// Executable scanning reports "2.100.002"
@@ -3068,7 +3122,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "d9e0bc5eddefcbe47f528760085d8927", 1186},
{"ressci.000", 0, "3a93c6340b54e07e65d0e5583354d186", 10505469},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Shivers 2 doesn't contain SCI scripts. The whole game logic has
// been reimplemented from SCI in native code placed in DLL files.
@@ -3086,7 +3140,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "d8659188b84beaef076bd869837cd530", 634},
{"ressci.000", 0, "7fbac0807a044c9543e8ac376d200e59", 4925003},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Shivers 2 - English Windows (from abevi)
// VERSION.TXT Version 1.0 (3/25/97)
@@ -3094,7 +3148,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.001", 0, "a79d03d6eb75be0a79324f14e3d2ace4", 95346793},
{"resmap.001", 0, "a4804d436d90c4ec2e46b537f5e954db", 6268},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#endif
@@ -3107,7 +3161,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.msg", 0, "1aeafe2b495de288d002109650b66614", 1364},
{"resource.000", 0, "8e10d4f05c1fd9f883384fa38a898489", 377394},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Slater & Charlie Go Camping - English DOS/Windows
{"slater", "", {
@@ -3115,7 +3169,16 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044},
{"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
+
+
+ // Slater & Charlie Go Camping - English DOS/Windows (Sierra Originals)
+ {"slater", "", {
+ {"resource.000", 0, "d7b4cc8e2c0b3a4768f8dfb5de27f206", 2256126},
+ {"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044},
+ {"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 1 VGA Remake - English Amiga (from www.back2roots.org)
// SCI interpreter version 1.000.510 (just a guess)
@@ -3128,7 +3191,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "b25a1539c71701f7715f738c5037e9a6", 775515},
{"resource.005", 0, "640ffe1a9acde392cc33cc1b1a528328", 806324},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 1 VGA Remake - English DOS (from the Space Quest Collection)
// Executable scanning reports "T.A00.081", VERSION file reports "2.000"
@@ -3141,7 +3204,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "c47600e50c6fc591957ae0c5020ee7b8", 1213262},
{"resource.004", 0, "e19ea4ad131472f9238590f2e1d40289", 1203051},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 1 VGA Remake - English Mac (from Fingolfin)
{"sq1sci", "SCI", {
@@ -3152,7 +3215,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "ae46e195e66df5a131917f0aa80b5669", 1242794},
{"resource.004", 0, "91d58a9eb2187c38424990afe4c12bc6", 1250949},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 1 VGA Remake - English Non-Interactive Demo (from FRG)
// SCI interpreter version 1.000.181
@@ -3160,7 +3223,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5af709ac5e0e923e0b8174f49978c30e", 636},
{"resource.001", 0, "fd99ea43f57576ded7c86036996346cf", 507642},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Space Quest 1 VGA Remake - Spanish DOS Floppy (from jvprat)
// Executable scanning reports "T.A00.081", VERSION file reports "2.000"
@@ -3174,7 +3237,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9b78228ad4f9f335fedf74f1812dcfca", 513325},
{"resource.005", 0, "7d4ebcb745c0bf8fc42e4013f52ecd49", 1101812},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest I 2.0 EGA DOS (6 x 3.5" disks)
// Provided by ssburnout in bug report #3046805
@@ -3187,7 +3250,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "975c6e81194ae6b65e960a248129ecaa", 684119},
{"resource.005", 0, "13d96f7905637552c0647175ff816145", 695589},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - English Amiga (from www.back2roots.org)
// SCI interpreter version 0.000.453 (just a guess)
@@ -3198,7 +3261,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 746496},
{"resource.004", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 761984},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - German Amiga (also includes english language)
// Executable scanning reports "1.004.006"
@@ -3211,7 +3274,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "6d8f34090503ce937e7dbef6cb6cdb6a", 545053},
{"resource.005", 0, "6d8f34090503ce937e7dbef6cb6cdb6a", 687507},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - English DOS Non-Interactive Demo
// SCI interpreter version 0.000.453
@@ -3219,7 +3282,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ec66ac2b1ce58b2575ba00b65058de1a", 612},
{"resource.001", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 180245},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - English DOS (provided by richiefs in bug report #2670691)
// SCI interpreter version 0.000.453
@@ -3229,7 +3292,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 720244},
{"resource.003", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 688367},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - English DOS (from the Space Quest Collection)
// Executable scanning reports "0.000.685", VERSION file reports "1.018"
@@ -3239,7 +3302,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 715777},
{"resource.003", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 703370},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - English DOS (from abevi, bug report #2612718)
{"sq3", "", {
@@ -3251,7 +3314,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 328278},
{"resource.006", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 356702},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - English Mac (from Fingolfin)
{"sq3", "", {
@@ -3260,7 +3323,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "0d8dfe42683b46f3131823233a91ce6a", 794072},
{"resource.003", 0, "0d8dfe42683b46f3131823233a91ce6a", 776536},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 - German DOS (from Tobis87, also includes english language)
// SCI interpreter version 0.000.453 (?)
@@ -3274,7 +3337,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "9107c2aa5398e28b5c5406df13491f85", 320643},
{"resource.007", 0, "9107c2aa5398e28b5c5406df13491f85", 344287},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 3 v1.052 - German DOS (supplied by markcoolio in bug report #2723860, also includes english language)
// Executable scanning reports "S.old.114"
@@ -3284,7 +3347,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "9107c2aa5398e28b5c5406df13491f85", 596768},
{"resource.003", 0, "9107c2aa5398e28b5c5406df13491f85", 693573},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - English Amiga
// Executable scanning reports "1.004.024"
@@ -3299,7 +3362,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "3540d1cc84d674cf4b2c898b88a3b563", 790296},
{"resource.006", 0, "ade814bc4d56244c156d9e9bcfebbc11", 664085},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - German Amiga (from www.back2roots.org, also includes english language)
// SCI interpreter version 1.000.200 (just a guess)
@@ -3313,7 +3376,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "10ee1709e6559c724676d058199b75b5", 818745},
{"resource.006", 0, "67fb188b191d88efe8414af6ea297b93", 672675},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - English DOS - THIS VERSION IS PIRATED/CRACKED AND REPACKAGED =DO NOT RE-ADD=
// Executable scanning reports "1.000.753"
@@ -3322,7 +3385,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a18088c8aceb06025dbc945f29e02935", 5124},
{"resource.000", 0, "e1f46832cd2458796028e054a0466031", 5502009},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_PIRATED, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_PIRATED, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - English DOS
// Executable scanning reports "1.000.753"
@@ -3331,7 +3394,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "71ccf4f82ac4efb588731acfb7bf2603", 5646},
{"resource.000", 0, "e1f46832cd2458796028e054a0466031", 933928},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 1.052 - English DOS Floppy (supplied by markcoolio in bug report #2723865)
// Executable scanning reports "1.000.753"
@@ -3345,7 +3408,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "ff9c87da3bc53473fdee8b9d3edbc93c", 1200631},
{"resource.005", 0, "e33019ac19f755ae33fbf49b4fc9066c", 1053294},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 1.000 - English DOS Floppy (from abevi, bug report #2612718)
{"sq4", "", {
@@ -3357,7 +3420,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "c06350184a490c10eb4585fff0aa3192", 1254368},
{"resource.005", 0, "b8d6efbd3235329bfe844c794097b2c9", 1098717},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest IV DOS 1.060 EGA (6 x 3.5" disks)
// Supplied by ssburnout in bug report #3046781
@@ -3370,7 +3433,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9a673e33c3f6dd560b993ffed77eeb49", 534994},
{"resource.005", 0, "3c4841d0a3ebba4404af588c93620c22", 595465},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - German DOS (from Tobis87, also includes english language)
// SCI interpreter version 1.000.200 (just a guess)
@@ -3384,7 +3447,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "47ee647b5b12232d27e63cc627c25899", 1156765},
{"resource.006", 0, "dfb023e4e2a1e7a00fa18f9ede72a91b", 924059},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - Italian DOS Floppy (from glorifindel, also includes english language)
// SCI interpreter version 1.000.200 (just a guess)
@@ -3397,7 +3460,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "4277c61bed40a50dadc4b5a344520af2", 1251000},
{"resource.005", 0, "5f885abd335978e2fd4e5f886d7676c8", 1102880},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::IT_ITA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - Japanese PC-98 5.25" Floppy (also includes english language)
// SCI interpreter version 1.000.1068
@@ -3407,7 +3470,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088},
{"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249},
AD_LISTEND},
- Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - Japanese PC-98 5.25" Floppy (also includes english language)
// SCI interpreter version 1.000.1068
@@ -3417,7 +3480,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088},
{"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - English DOS CD (from the Space Quest Collection)
// Executable scanning reports "1.001.064", VERSION file reports "1.0"
@@ -3425,7 +3488,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054},
{"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GUIO_NONE) },
// Space Quest 4 - English Windows CD (from the Space Quest Collection)
// Executable scanning reports "1.001.064", VERSION file reports "1.0"
@@ -3435,7 +3498,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054},
{"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO_MIDIGM },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO1(GUIO_MIDIGM) },
// Space Quest 4 - Spanish DOS CD (from jvprat, is still text only, not talkie, also includes english language)
// Executable scanning reports "1.SQ4.057", VERSION file reports "1.000"
@@ -3449,7 +3512,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "776fba81c110d1908776232cbe190e20", 1253752},
{"resource.005", 0, "55fae26c2a92f16ef72c1e216e827c0f", 1098328},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NONE },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NONE) },
// Space Quest 4 - Spanish DOS Floppy (from jvprat, also includes english language)
// Executable scanning reports "1.SQ4.056", VERSION file reports "1.000"
@@ -3461,7 +3524,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "74c62fa2146ff3b3b2ea2b3fb95b9af9", 1140801},
{"resource.003", 0, "42a307941edeb1a3be31daeb2e4be90b", 1088408},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 1.000 - German DOS Floppy (supplied by markcoolio in bug report #2723862, also includes english language)
// Executable scanning reports "1.SQ4.030"
@@ -3475,7 +3538,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "c06350184a490c10eb4585fff0aa3192", 1254368},
{"resource.005", 0, "b8d6efbd3235329bfe844c794097b2c9", 1098717},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - English Macintosh
// Executable scanning reports "x.yyy.zzz"
@@ -3490,7 +3553,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "869d16cab6641c80b06f4dcee18f86bc", 1426228},
{"resource.006", 0, "91d23407bc0447a3722fbeb952d7edee", 1402451},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 4 - Russian DOS
// Executable scanning reports "1.000.753", VERSION file reports "1.994"
@@ -3503,7 +3566,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "2763fe4f0cb74df716ec8b0c464b0988", 1217428},
{"resource.005", 0, "d608713197c5ba1cd8c6ed46299c3069", 1057924},
AD_LISTEND},
- Common::RU_RUS, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::RU_RUS, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 5 - English DOS (from the Space Quest Collection)
// Executable scanning reports "1.001.068", VERSION file reports "1.04"
@@ -3512,7 +3575,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486},
{"resource.msg", 0, "bb8ad78793c26bdb3f77498b1d6515a9", 125988},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// 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=
@@ -3521,7 +3584,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8bde0a9adb9a3e9aaa861826874c9834", 6473},
{"resource.000", 0, "f4a48705764544d7cc64a7bb22a610df", 6025184},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_PIRATED, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_PIRATED, GUIO1(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
@@ -3530,7 +3593,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486},
{"resource.msg", 0, "7c71cfc36153cfe07b450423a51f7e68", 146282},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 5 v1.04 - French DOS (from Hkz, Included in Space Quest Collector's Edition, with chapters I-V)
{"sq5", "", {
@@ -3538,7 +3601,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486},
{"resource.msg", 0, "877c42380320eb1db7dad83ccd261214", 140374},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 5 - Italian DOS Floppy (from glorifindel)
// SCI interpreter version 1.001.068 (just a guess)
@@ -3546,7 +3609,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "5040026519f37199f3616fb1d4704dff", 6047170},
{"resource.map", 0, "5b09168baa2f6e2e22787429b2d72f54", 6492},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::IT_ITA, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 5 - Spanish DOS Floppy (from mirir, bug report #3090664)
{"sq5", "", {
@@ -3554,7 +3617,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5714a899033bdebf2d61ad333c8c6637", 6492},
{"resource.msg", 0, "46deca7ef9cf057f7d442df98c1a2ae2", 134612},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// Space Quest 5 - Russian DOS
// Executable scanning reports "1.001.068", VERSION file reports "1.994"
@@ -3563,7 +3626,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6f9ed21e1001526b4137f6703ed476af", 6103778},
{"resource.msg", 0, "0a8931990cd2eac1691602391c68ab85", 147580},
AD_LISTEND},
- Common::RU_RUS, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::RU_RUS, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI32
// Space Quest 6 - English DOS/Win3.11 CD (from the Space Quest Collection)
@@ -3572,7 +3635,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "6dddfa3a8f3a3a513ec9dfdfae955005", 10528},
{"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Space Quest 6 - English DOS/Win3.11 CD ver 1.11 (from FRG)
// SCI interpreter version 2.100.002 (just a guess)
@@ -3580,7 +3643,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e0615d6e4e10e37ae42e6a2a95aaf145", 10528},
{"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Space Quest 6 - French DOS/Win3.11 CD (from French magazine Joystick - September 1997)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -3588,7 +3651,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "3c831625931d5079b73ae8c275f52c95", 10534},
{"resource.000", 0, "4195ca940f759424f62b90e262cc1737", 40932397},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::FR_FRA, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Space Quest 6 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723884)
// SCI interpreter version 2.100.002 (just a guess)
@@ -3596,7 +3659,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "664d797415484f85c90b1b45aedc7686", 10534},
{"resource.000", 0, "ba87ba91e5bdabb4169dd0df75777722", 40933685},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE },
+ Common::DE_DEU, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
// Space Quest 6 - English DOS/Win3.11 Interactive Demo (from FRG)
// SCI interpreter version 2.100.002 (just a guess)
@@ -3604,7 +3667,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "368f07b07433db3f819fa3fa0e5efee5", 2572},
{"resource.000", 0, "ab12724e078dea34b624e0d2a38dcd7c", 2272050},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
#endif // ENABLE_SCI32
// The Island of Dr. Brain - English DOS CD (from jvprat)
@@ -3613,7 +3676,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2388efef8430b041b0f3b00b9050e4a2", 3281},
{"resource.000", 0, "b3acd9b9dd7fe53c4ee133ac9a1acfab", 2103560},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NONE) },
// The Island of Dr. Brain - English DOS (from Quietust)
// Executable scanning reports "1.001.053", VERSION file reports "1.1 2.3.93"
@@ -3621,7 +3684,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "3c07da06bdd1689f9d07af78fb94d0ec", 3101},
{"resource.000", 0, "ecc686e0034fb4d41de077ac7167b3cf", 1947866},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO1(GUIO_NOSPEECH) },
// The Island of Dr. Brain - English DOS Non-Interactive Demo
// SCI interpreter version 1.001.053 (just a guess)
@@ -3629,7 +3692,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a8e5ca8ed1996974afa59f4c45e06195", 986},
{"resource.000", 0, "b3acd9b9dd7fe53c4ee133ac9a1acfab", 586560},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NOSPEECH) },
#ifdef ENABLE_SCI32
// Torin's Passage - English Windows Interactive Demo
@@ -3638,7 +3701,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "9a3e172cde9963d0a969f26469318cec", 3403},
{"ressci.000", 0, "db3e290481c35c3224e9602e71e4a1f1", 5073868},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Torin's Passage - English Windows
// SCI interpreter version 2.100.002 (just a guess)
@@ -3646,7 +3709,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Torin's Passage - Spanish Windows (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -3655,7 +3718,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
// TODO: depend on one of the patches?
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::ES_ESP, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Torin's Passage - French Windows
// SCI interpreter version 2.100.002 (just a guess)
@@ -3663,7 +3726,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Torin's Passage - German Windows
// SCI interpreter version 2.100.002 (just a guess)
@@ -3671,7 +3734,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NOSPEECH) },
// Torin's Passage - Italian Windows CD (from glorifindel)
// SCI interpreter version 2.100.002 (just a guess)
@@ -3679,7 +3742,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE },
+ Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO1(GUIO_NONE) },
#endif // ENABLE_SCI32
// SCI Fanmade Games
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 8fb6322f55..6f783d79e8 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -488,8 +488,15 @@ bool Kernel::signatureMatch(const uint16 *sig, int argc, const reg_t *argv) {
if ((type & SIG_IS_INVALID) && (!(curSig & SIG_IS_INVALID)))
return false; // pointer is invalid and signature doesn't allow that?
- if (!((type & ~SIG_IS_INVALID) & curSig))
- return false; // type mismatch
+ if (!((type & ~SIG_IS_INVALID) & curSig)) {
+ if ((type & ~SIG_IS_INVALID) == SIG_TYPE_ERROR && (curSig & SIG_IS_INVALID)) {
+ // Type is unknown (error - usually because of a deallocated object or
+ // stale pointer) and the signature allows invalid pointers. In this case,
+ // ignore the invalid pointer.
+ } else {
+ return false; // type mismatch
+ }
+ }
if (!(curSig & SIG_MORE_MAY_FOLLOW)) {
sig++;
@@ -821,7 +828,8 @@ void Kernel::setDefaultKernelNames(GameFeatures *features) {
enum {
kKernelEntriesSci2 = 0x8b,
kKernelEntriesGk2Demo = 0xa0,
- kKernelEntriesSci21 = 0x9d
+ kKernelEntriesSci21 = 0x9d,
+ kKernelEntriesSci3 = 0xa1
};
void Kernel::setKernelNamesSci2() {
@@ -849,8 +857,11 @@ void Kernel::setKernelNamesSci21(GameFeatures *features) {
// OnMe is IsOnMe here, but they should be compatible
_kernelNames[0x23] = "Robot"; // Graph in SCI2
_kernelNames[0x2e] = "Priority"; // DisposeTextBitmap in SCI2
- } else
+ } else if (getSciVersion() != SCI_VERSION_3) {
_kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci21);
+ } else if (getSciVersion() == SCI_VERSION_3) {
+ _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci3);
+ }
}
#endif
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index ff3c67c84b..8cb294e166 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -442,11 +442,11 @@ reg_t kUpdateScreenItem(EngineState *s, int argc, reg_t *argv);
reg_t kDeleteScreenItem(EngineState *s, int argc, reg_t *argv);
// Text
reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv);
+reg_t kDisposeTextBitmap(EngineState *s, int argc, reg_t *argv);
// "Planes" in SCI32 are pictures
reg_t kAddPlane(EngineState *s, int argc, reg_t *argv);
reg_t kDeletePlane(EngineState *s, int argc, reg_t *argv);
reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv);
-reg_t kRepaintPlane(EngineState *s, int argc, reg_t *argv);
reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv);
reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv);
reg_t kFrameOut(EngineState *s, int argc, reg_t *argv);
@@ -456,6 +456,7 @@ reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv);
reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv);
reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv);
reg_t kInPolygon(EngineState *s, int argc, reg_t *argv);
+reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv);
// SCI2.1 Kernel Functions
reg_t kText(EngineState *s, int argc, reg_t *argv);
@@ -476,6 +477,10 @@ reg_t kSetLanguage(EngineState *s, int argc, reg_t *argv);
reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv);
reg_t kSetFontRes(EngineState *s, int argc, reg_t *argv);
reg_t kFont(EngineState *s, int argc, reg_t *argv);
+reg_t kBitmap(EngineState *s, int argc, reg_t *argv);
+
+// SCI3 Kernel functions
+reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv);
#endif
reg_t kDoSoundInit(EngineState *s, int argc, reg_t *argv);
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index 0c5d4e680d..afe6b176e5 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -477,6 +477,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i(.*)", NULL, NULL },
{ MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL, NULL },
{ MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL },
+ { MAP_CALL(DisposeTextBitmap), SIG_EVERYWHERE, "r", NULL, NULL },
{ MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL, NULL },
{ MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL },
{ MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL },
@@ -493,25 +494,52 @@ static SciKernelMapEntry s_kernelMap[] = {
// our own memory manager and garbage collector, thus we simply call FlushResources, which in turn invokes
// our garbage collector (i.e. the SCI0-SCI1.1 semantics).
{ "Purge", kFlushResources, SIG_EVERYWHERE, "i", NULL, NULL },
- { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL },
{ MAP_CALL(SetShowStyle), SIG_EVERYWHERE, "ioiiiii([ri])(i)", NULL, NULL },
{ MAP_CALL(String), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL, NULL },
{ MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL },
+ { MAP_CALL(ObjectIntersect), SIG_EVERYWHERE, "oo", NULL, NULL },
// SCI2 unmapped functions - TODO!
- // SetScroll
- // AddMagnify // most probably similar to the SCI1.1 functions. We need a test case
- // DeleteMagnify
- // EditText
- // DisposeTextBitmap
- // VibrateMouse - used in QFG4 floppy
- // PalCycle
- // ObjectIntersect - used in QFG4 floppy
- // MakeSaveCatName - used in the Save/Load dialog of GK1CD (SRDialog, script 64990)
- // MakeSaveFileName - used in the Save/Load dialog of GK1CD (SRDialog, script 64990)
+
+ // SetScroll - called by script 64909, Styler::doit()
+ // PalCycle - called by Game::newRoom. Related to RemapColors.
+ // VibrateMouse - used in QFG4
+
+ // SCI2 Empty functions
+
+ // Debug function used to track resources
+ { MAP_EMPTY(ResourceTrack), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+
+ // SCI2 functions that are used in the original save/load menus. Marked as dummy, so
+ // that the engine errors out on purpose. TODO: Implement once the original save/load
+ // menus are implemented.
+
+ // Creates the name of the save catalogue/directory to save into.
+ // TODO: Implement once the original save/load menus are implemented.
+ { MAP_DUMMY(MakeSaveCatName), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+
+ // Creates the name of the save file to save into
+ // TODO: Implement once the original save/load menus are implemented.
+ { MAP_DUMMY(MakeSaveFileName), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+
+ // Used for edit boxes in save/load dialogs. It's a rewritten version of kEditControl,
+ // but it handles events on its own, using an internal loop, instead of using SCI
+ // scripts for event management like kEditControl does. Called by script 64914,
+ // DEdit::hilite().
+ // TODO: Implement once the original save/load menus are implemented.
+ { MAP_DUMMY(EditText), SIG_EVERYWHERE, "o", NULL, NULL },
// Unused / debug SCI2 unused functions, always mapped to kDummy
+
+ // AddMagnify/DeleteMagnify are both called by script 64979 (the Magnifier
+ // object) in GK1 only. There is also an associated empty magnifier view
+ // (view 1), however, it doesn't seem to be used anywhere, as all the
+ // magnifier closeups (e.g. in scene 470) are normal views. Thus, these
+ // are marked as dummy, so if they're ever used the engine will error out.
+ { MAP_DUMMY(AddMagnify), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+ { MAP_DUMMY(DeleteMagnify), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+ { MAP_DUMMY(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL },
{ MAP_DUMMY(InspectObject), SIG_EVERYWHERE, "(.*)", NULL, NULL },
// Profiler (same as SCI0-SCI1.1)
// Record (same as SCI0-SCI1.1)
@@ -546,6 +574,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(ScrollWindow), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(SetFontRes), SIG_EVERYWHERE, "ii", NULL, NULL },
{ MAP_CALL(Font), SIG_EVERYWHERE, "i(.*)", NULL, NULL },
+ { MAP_CALL(Bitmap), SIG_EVERYWHERE, "(.*)", NULL, NULL },
// SCI2.1 Empty Functions
@@ -564,6 +593,9 @@ static SciKernelMapEntry s_kernelMap[] = {
// just use GetConfig and mark this one as empty, like the DOS version does.
{ MAP_EMPTY(GetSierraProfileInt), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+ // Debug function called whenever the current room changes
+ { MAP_EMPTY(NewRoom), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+
// Unused / debug SCI2.1 unused functions, always mapped to kDummy
// The debug functions are called from the inbuilt debugger or polygon
@@ -586,23 +618,24 @@ static SciKernelMapEntry s_kernelMap[] = {
// SCI2.1 unmapped functions - TODO!
- // Bitmap
// MovePlaneItems - used by SQ6 to scroll through the inventory via the up/down buttons
// AddLine - used by Torin's Passage to highlight the chapter buttons
// DeleteLine - used by Torin's Passage to delete the highlight from the chapter buttons
// UpdateLine - used by LSL6
// SetPalStyleRange - 2 integer parameters, start and end. All styles from start-end
// (inclusive) are set to 0
- // NewRoom - 1 integer parameter, the current room number
// MorphOn - used by SQ6, script 900, the datacorder reprogramming puzzle (from room 270)
// SetHotRectangles - used by Phantasmagoria 1
+
+ // SCI3 Kernel Functions
+ { MAP_CALL(PlayDuck), SIG_EVERYWHERE, "(.*)", NULL, NULL },
#endif
{ NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL }
};
/** Default kernel name table. */
-static const char *s_defaultKernelNames[] = {
+static const char *const s_defaultKernelNames[] = {
/*0x00*/ "Load",
/*0x01*/ "UnLoad",
/*0x02*/ "ScriptID",
@@ -751,7 +784,7 @@ static const char *s_defaultKernelNames[] = {
// NOTE: 0x72-0x79, 0x85-0x86, 0x88 are from the GK2 demo (which has debug support) and are
// just Dummy in other SCI2 games.
-static const char *sci2_default_knames[] = {
+static const char *const sci2_default_knames[] = {
/*0x00*/ "Load",
/*0x01*/ "UnLoad",
/*0x02*/ "ScriptID",
@@ -768,7 +801,7 @@ static const char *sci2_default_knames[] = {
/*0x0d*/ "CelWide",
/*0x0e*/ "CelHigh",
/*0x0f*/ "GetHighPlanePri",
- /*0x10*/ "GetHighItemPri",
+ /*0x10*/ "GetHighItemPri", // unused function
/*0x11*/ "ShakeScreen",
/*0x12*/ "OnMe",
/*0x13*/ "ShowMovie",
@@ -780,9 +813,9 @@ static const char *sci2_default_knames[] = {
/*0x19*/ "AddPlane",
/*0x1a*/ "DeletePlane",
/*0x1b*/ "UpdatePlane",
- /*0x1c*/ "RepaintPlane",
+ /*0x1c*/ "RepaintPlane", // unused function
/*0x1d*/ "SetShowStyle",
- /*0x1e*/ "ShowStylePercent",
+ /*0x1e*/ "ShowStylePercent", // unused function
/*0x1f*/ "SetScroll",
/*0x20*/ "AddMagnify",
/*0x21*/ "DeleteMagnify",
@@ -796,7 +829,7 @@ static const char *sci2_default_knames[] = {
/*0x29*/ "Dummy",
/*0x2a*/ "SetQuitStr",
/*0x2b*/ "EditText",
- /*0x2c*/ "InputText",
+ /*0x2c*/ "InputText", // unused function
/*0x2d*/ "CreateTextBitmap",
/*0x2e*/ "DisposeTextBitmap",
/*0x2f*/ "GetEvent",
@@ -916,7 +949,7 @@ static const char *sci2_default_knames[] = {
/*0x9f*/ "MessageBox"
};
-static const char *sci21_default_knames[] = {
+static const char *const sci21_default_knames[] = {
/*0x00*/ "Load",
/*0x01*/ "UnLoad",
/*0x02*/ "ScriptID",
@@ -941,8 +974,8 @@ static const char *sci21_default_knames[] = {
/*0x15*/ "NumLoops",
/*0x16*/ "NumCels",
/*0x17*/ "IsOnMe",
- /*0x18*/ "AddMagnify",
- /*0x19*/ "DeleteMagnify",
+ /*0x18*/ "AddMagnify", // dummy in SCI3
+ /*0x19*/ "DeleteMagnify", // dummy in SCI3
/*0x1a*/ "CelRect",
/*0x1b*/ "BaseLineSpan",
/*0x1c*/ "CelWide",
@@ -962,10 +995,10 @@ static const char *sci21_default_knames[] = {
/*0x2a*/ "UpdatePlane",
/*0x2b*/ "RepaintPlane",
/*0x2c*/ "GetHighPlanePri",
- /*0x2d*/ "GetHighItemPri",
+ /*0x2d*/ "GetHighItemPri", // unused function
/*0x2e*/ "SetShowStyle",
- /*0x2f*/ "ShowStylePercent",
- /*0x30*/ "SetScroll",
+ /*0x2f*/ "ShowStylePercent", // unused function
+ /*0x30*/ "SetScroll", // dummy in SCI3
/*0x31*/ "MovePlaneItems",
/*0x32*/ "ShakeScreen",
/*0x33*/ "Dummy",
@@ -974,7 +1007,7 @@ static const char *sci21_default_knames[] = {
/*0x36*/ "Dummy",
/*0x37*/ "IsHiRes",
/*0x38*/ "SetVideoMode",
- /*0x39*/ "ShowMovie",
+ /*0x39*/ "ShowMovie", // dummy in SCI3
/*0x3a*/ "Robot",
/*0x3b*/ "CreateTextBitmap",
/*0x3c*/ "Random",
@@ -992,7 +1025,7 @@ static const char *sci21_default_knames[] = {
/*0x48*/ "Message",
/*0x49*/ "Font",
/*0x4a*/ "EditText",
- /*0x4b*/ "InputText",
+ /*0x4b*/ "InputText", // unused function
/*0x4c*/ "ScrollWindow", // Dummy in SCI3
/*0x4d*/ "Dummy",
/*0x4e*/ "Dummy",
@@ -1017,9 +1050,9 @@ static const char *sci21_default_knames[] = {
/*0x61*/ "InitBresen",
/*0x62*/ "DoBresen",
/*0x63*/ "SetJump",
- /*0x64*/ "AvoidPath",
+ /*0x64*/ "AvoidPath", // dummy in SCI3
/*0x65*/ "InPolygon",
- /*0x66*/ "MergePoly",
+ /*0x66*/ "MergePoly", // dummy in SCI3
/*0x67*/ "ObjectIntersect",
/*0x68*/ "Dummy",
/*0x69*/ "MemoryInfo",
@@ -1048,7 +1081,7 @@ static const char *sci21_default_knames[] = {
/*0x80*/ "Dummy",
/*0x81*/ "Dummy", // called when changing rooms in most SCI2.1 games (e.g. KQ7, GK2, MUMG deluxe, Phant1)
/*0x82*/ "Dummy",
- /*0x83*/ "PrintDebug", // debug function, used by Shivers 2 (demo and full)
+ /*0x83*/ "PrintDebug", // debug function, used by Shivers (demo and full)
/*0x84*/ "Dummy",
/*0x85*/ "Dummy",
/*0x86*/ "Dummy",
@@ -1059,7 +1092,7 @@ static const char *sci21_default_knames[] = {
/*0x8b*/ "SetPalStyleRange",
/*0x8c*/ "AddPicAt",
/*0x8d*/ "MessageBox", // SCI3, was Dummy in SCI2.1
- /*0x8e*/ "NewRoom",
+ /*0x8e*/ "NewRoom", // debug function
/*0x8f*/ "Dummy",
/*0x90*/ "Priority",
/*0x91*/ "MorphOn",
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index 1bd6754ca5..9e9441847d 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -365,9 +365,12 @@ reg_t kDeviceInfo(EngineState *s, int argc, reg_t *argv) {
reg_t kGetSaveDir(EngineState *s, int argc, reg_t *argv) {
#ifdef ENABLE_SCI32
- // TODO: SCI32 uses a parameter here.
- if (argc > 0)
- warning("kGetSaveDir called with %d parameter(s): %04x:%04x", argc, PRINT_REG(argv[0]));
+ // SCI32 uses a parameter here. It is used to modify a string, stored in a
+ // global variable, so that game scripts store the save directory. We
+ // don't really set a save game directory, thus not setting the string to
+ // anything is the correct thing to do here.
+ //if (argc > 0)
+ // warning("kGetSaveDir called with %d parameter(s): %04x:%04x", argc, PRINT_REG(argv[0]));
#endif
return s->_segMan->getSaveDirPtr();
}
@@ -578,11 +581,15 @@ reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) {
game_description = dialog->getResultString();
if (game_description.empty()) {
// create our own description for the saved game, the user didnt enter it
+ #if defined(USE_SAVEGAME_TIMESTAMP)
TimeDate curTime;
g_system->getTimeAndDate(curTime);
curTime.tm_year += 1900; // fixup year
curTime.tm_mon++; // fixup month
- game_description = Common::String::format("%02d.%02d.%04d / %02d:%02d:%02d", curTime.tm_mday, curTime.tm_mon, curTime.tm_year, curTime.tm_hour, curTime.tm_min, curTime.tm_sec);
+ game_description = Common::String::format("%04d.%02d.%02d / %02d:%02d:%02d", curTime.tm_year, curTime.tm_mon, curTime.tm_mday, curTime.tm_hour, curTime.tm_min, curTime.tm_sec);
+ #else
+ game_description = Common::String::format("Save %d", savegameId + 1);
+ #endif
}
delete dialog;
g_sci->_soundCmd->pauseAll(false); // unpause music ( we can't have it paused during save)
@@ -1160,8 +1167,17 @@ reg_t kSave(EngineState *s, int argc, reg_t *argv) {
return kRestoreGame(s, argc - 1,argv + 1);
case 2:
return kGetSaveDir(s, argc - 1, argv + 1);
+ case 3:
+ return kCheckSaveGame(s, argc - 1, argv + 1);
case 5:
return kGetSaveFiles(s, argc - 1, argv + 1);
+ case 6:
+ // This is used in Shivers to delete saved games, however it
+ // always passes the same file name (SHIVER), so it doesn't
+ // actually delete anything...
+ // TODO: Check why this happens
+ // argv[1] is a string (most likely the save game directory)
+ return kFileIOUnlink(s, argc - 2, argv + 2);
case 8:
// TODO
// This is a timer callback, with 1 parameter: the timer object
@@ -1172,10 +1188,9 @@ reg_t kSave(EngineState *s, int argc, reg_t *argv) {
// This function has to return something other than 0 to proceed
return s->r_acc;
default:
- warning("Unknown/unhandled kSave subop %d", argv[0].toUint16());
+ kStub(s, argc, argv);
+ return NULL_REG;
}
-
- return NULL_REG;
}
#endif
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index 36de767464..ea2b4816fc 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -49,8 +49,9 @@
#include "sci/graphics/text16.h"
#include "sci/graphics/view.h"
#ifdef ENABLE_SCI32
+#include "sci/graphics/font.h" // TODO: remove once kBitmap is moved in a separate class
+#include "sci/graphics/text32.h"
#include "sci/graphics/frameout.h"
-#include "sci/video/robot_decoder.h"
#endif
namespace Sci {
@@ -353,11 +354,9 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) {
textWidth = dest[3].toUint16(); textHeight = dest[2].toUint16();
#ifdef ENABLE_SCI32
- if (!g_sci->_gfxText16) {
- // TODO: Implement this
- textWidth = 0; textHeight = 0;
- warning("TODO: implement kTextSize for SCI32");
- } else
+ if (g_sci->_gfxText32)
+ g_sci->_gfxText32->kernelTextSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight);
+ else
#endif
g_sci->_gfxText16->kernelTextSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight);
@@ -380,8 +379,13 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) {
}
debugC(kDebugLevelStrings, "GetTextSize '%s' -> %dx%d", text.c_str(), textWidth, textHeight);
- dest[2] = make_reg(0, textHeight);
- dest[3] = make_reg(0, textWidth);
+ if (getSciVersion() <= SCI_VERSION_1_1) {
+ dest[2] = make_reg(0, textHeight);
+ dest[3] = make_reg(0, textWidth);
+ } else {
+ dest[2] = make_reg(0, textWidth);
+ dest[3] = make_reg(0, textHeight);
+ }
return s->r_acc;
}
@@ -1284,7 +1288,10 @@ reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv) {
}
reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) {
- g_sci->_gfxFrameout->kernelAddScreenItem(argv[0]);
+ if (g_sci->_gfxFrameout->findScreenItem(argv[0]) == NULL)
+ g_sci->_gfxFrameout->kernelAddScreenItem(argv[0]);
+ else
+ g_sci->_gfxFrameout->kernelUpdateScreenItem(argv[0]);
return s->r_acc;
}
@@ -1313,18 +1320,13 @@ reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
-reg_t kRepaintPlane(EngineState *s, int argc, reg_t *argv) {
- g_sci->_gfxFrameout->kernelRepaintPlane(argv[0]);
- return s->r_acc;
-}
-
reg_t kAddPicAt(EngineState *s, int argc, reg_t *argv) {
reg_t planeObj = argv[0];
GuiResourceId pictureId = argv[1].toUint16();
- int16 forWidth = argv[2].toSint16();
- // argv[3] seems to be 0 most of the time
+ int16 pictureX = argv[2].toSint16();
+ int16 pictureY = argv[3].toSint16();
- g_sci->_gfxFrameout->kernelAddPicAt(planeObj, forWidth, pictureId);
+ g_sci->_gfxFrameout->kernelAddPicAt(planeObj, pictureId, pictureX, pictureY);
return s->r_acc;
}
@@ -1333,39 +1335,27 @@ reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv) {
}
reg_t kFrameOut(EngineState *s, int argc, reg_t *argv) {
- // This kernel call likely seems to be doing the screen updates,
- // as its called right after a view is updated
-
- // TODO
g_sci->_gfxFrameout->kernelFrameout();
-
return NULL_REG;
}
+reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv) {
+ Common::Rect objRect1 = g_sci->_gfxCompare->getNSRect(argv[0]);
+ Common::Rect objRect2 = g_sci->_gfxCompare->getNSRect(argv[1]);
+ return make_reg(0, objRect1.intersects(objRect2));
+}
+
// Tests if the coordinate is on the passed object
reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) {
uint16 x = argv[0].toUint16();
uint16 y = argv[1].toUint16();
reg_t targetObject = argv[2];
uint16 illegalBits = argv[3].offset;
- Common::Rect nsRect;
+ Common::Rect nsRect = g_sci->_gfxCompare->getNSRect(targetObject, true);
// we assume that x, y are local coordinates
- // Get the bounding rectangle of the object
- nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft));
- nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop));
- nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight));
- nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom));
-
- // nsRect top/left may be negative, adjust accordingly
- Common::Rect checkRect = nsRect;
- if (checkRect.top < 0)
- checkRect.top = 0;
- if (checkRect.left < 0)
- checkRect.left = 0;
-
- bool contained = checkRect.contains(x, y);
+ bool contained = nsRect.contains(x, y);
if (contained && illegalBits) {
// If illegalbits are set, we check the color of the pixel that got clicked on
// for now, we return false if the pixel is transparent
@@ -1380,74 +1370,40 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) {
}
reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) {
- // TODO: argument 0 is usually 0, and arguments 1 and 2 are usually 1
switch (argv[0].toUint16()) {
case 0: {
if (argc != 4) {
warning("kCreateTextBitmap(0): expected 4 arguments, got %i", argc);
return NULL_REG;
}
- //reg_t object = argv[3];
- //Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text)));
- break;
+ reg_t object = argv[3];
+ Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text)));
+ debugC(kDebugLevelStrings, "kCreateTextBitmap case 0 (%04x:%04x, %04x:%04x, %04x:%04x)",
+ PRINT_REG(argv[1]), PRINT_REG(argv[2]), PRINT_REG(argv[3]));
+ debugC(kDebugLevelStrings, "%s", text.c_str());
+ uint16 maxWidth = argv[1].toUint16(); // nsRight - nsLeft + 1
+ uint16 maxHeight = argv[2].toUint16(); // nsBottom - nsTop + 1
+ return g_sci->_gfxText32->createTextBitmap(object, maxWidth, maxHeight);
}
case 1: {
if (argc != 2) {
- warning("kCreateTextBitmap(0): expected 2 arguments, got %i", argc);
+ warning("kCreateTextBitmap(1): expected 2 arguments, got %i", argc);
return NULL_REG;
}
- //reg_t object = argv[1];
- //Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text)));
- break;
+ reg_t object = argv[1];
+ Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text)));
+ debugC(kDebugLevelStrings, "kCreateTextBitmap case 1 (%04x:%04x)", PRINT_REG(argv[1]));
+ debugC(kDebugLevelStrings, "%s", text.c_str());
+ return g_sci->_gfxText32->createTextBitmap(object);
}
default:
warning("CreateTextBitmap(%d)", argv[0].toUint16());
+ return NULL_REG;
}
-
- return NULL_REG;
}
-reg_t kRobot(EngineState *s, int argc, reg_t *argv) {
-
- int16 subop = argv[0].toUint16();
-
- switch (subop) {
- case 0: { // init
- int id = argv[1].toUint16();
- reg_t obj = argv[2];
- int16 flag = argv[3].toSint16();
- int16 x = argv[4].toUint16();
- int16 y = argv[5].toUint16();
- warning("kRobot(init), id %d, obj %04x:%04x, flag %d, x=%d, y=%d", id, PRINT_REG(obj), flag, x, y);
- g_sci->_robotDecoder->load(id);
- g_sci->_robotDecoder->setPos(x, y);
- }
- break;
- case 1: // LSL6 hires (startup)
- // TODO
- return NULL_REG; // an integer is expected
- case 4: { // start - we don't really have a use for this one
- //int id = argv[1].toUint16();
- //warning("kRobot(start), id %d", id);
- }
- break;
- case 7: // unknown, called e.g. by Phantasmagoria
- warning("kRobot(%d)", subop);
- break;
- case 8: // sync
- if ((uint32)g_sci->_robotDecoder->getCurFrame() != g_sci->_robotDecoder->getFrameCount() - 1) {
- writeSelector(s->_segMan, argv[1], SELECTOR(signal), NULL_REG);
- } else {
- g_sci->_robotDecoder->close();
- // Signal the engine scripts that the video is done
- writeSelector(s->_segMan, argv[1], SELECTOR(signal), SIGNAL_REG);
- }
- break;
- default:
- warning("kRobot(%d)", subop);
- break;
- }
-
+reg_t kDisposeTextBitmap(EngineState *s, int argc, reg_t *argv) {
+ g_sci->_gfxText32->disposeTextBitmap(argv[0]);
return s->r_acc;
}
@@ -1481,22 +1437,30 @@ reg_t kWinHelp(EngineState *s, int argc, reg_t *argv) {
}
/**
- * Used to programmatically mass set properties of the target plane
+ * Used for scene transitions, replacing (but reusing parts of) the old
+ * transition code.
*/
reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv) {
- // TODO: This is all a stub/skeleton, thus we're invoking kStub() for now
- kStub(s, argc, argv);
-
// Can be called with 7 or 8 parameters
- // showStyle matches the style selector of the associated plane object
+ // The style defines which transition to perform. Related to the transition
+ // tables inside graphics/transitions.cpp
uint16 showStyle = argv[0].toUint16(); // 0 - 15
- reg_t planeObj = argv[1];
- //argv[2] // seconds
- //argv[3] // back
+ reg_t planeObj = argv[1]; // the affected plane
+ //argv[2] // seconds that the transition lasts
+ //argv[3] // back color to be used(?)
//int16 priority = argv[4].toSint16();
- //argv[5] // animate
+ //argv[5] // boolean, animate or not while the transition lasts
//argv[6] // refFrame
- //int16 unk7 = (argc >= 8) ? argv[7].toSint16() : 0; // divisions
+
+ // If the game has the pFadeArray selector, another parameter is used here,
+ // before the optional last parameter
+ /*bool hasFadeArray = g_sci->getKernel()->findSelector("pFadeArray") > 0;
+ if (hasFadeArray) {
+ // argv[7]
+ //int16 unk7 = (argc >= 9) ? argv[8].toSint16() : 0; // divisions (transition steps?)
+ } else {
+ //int16 unk7 = (argc >= 8) ? argv[7].toSint16() : 0; // divisions (transition steps?)
+ }*/
if (showStyle > 15) {
warning("kSetShowStyle: Illegal style %d for plane %04x:%04x", showStyle, PRINT_REG(planeObj));
@@ -1505,36 +1469,36 @@ reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv) {
// TODO: Check if the plane is in the list of planes to draw
- return s->r_acc;
-}
-
-reg_t kCelInfo(EngineState *s, int argc, reg_t *argv) {
// TODO: This is all a stub/skeleton, thus we're invoking kStub() for now
kStub(s, argc, argv);
- // Used by Shivers 1, room 23601
-
- // 6 arguments, all integers:
- // argv[0] - subop (0 - 4). It's constantly called with 4 in Shivers 1
- // argv[1] - view (used with view 23602 in Shivers 1)
- // argv[2] - loop
- // argv[3] - cel
- // argv[4] - unknown (row?)
- // argv[5] - unknown (column?)
-
- // Subops:
- // 0 - return the view
- // 1 - return the loop
- // 2, 3 - nop
- // 4 - returns some kind of hash (?) based on the view and the two last params
-
- // This seems to be a debug function, but it could be used to check if
- // the jigsaw pieces "stick" together (they currently don't, unless I'm missing
- // something)
-
return s->r_acc;
}
+reg_t kCelInfo(EngineState *s, int argc, reg_t *argv) {
+ // Used by Shivers 1, room 23601 to determine what blocks on the red door puzzle board
+ // are occupied by pieces already
+
+ switch (argv[0].toUint16()) { // subops 0 - 4
+ // 0 - return the view
+ // 1 - return the loop
+ // 2, 3 - nop
+ case 4: {
+ GuiResourceId viewId = argv[1].toSint16();
+ int16 loopNo = argv[2].toSint16();
+ int16 celNo = argv[3].toSint16();
+ int16 x = argv[4].toUint16();
+ int16 y = argv[5].toUint16();
+ byte color = g_sci->_gfxCache->kernelViewGetColorAtCoordinate(viewId, loopNo, celNo, x, y);
+ return make_reg(0, color);
+ }
+ default: {
+ kStub(s, argc, argv);
+ return s->r_acc;
+ }
+ }
+}
+
reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) {
// Used by Phantasmagoria 1 and SQ6. In SQ6, it is used for the messages
// shown in the scroll window at the bottom of the screen.
@@ -1667,6 +1631,170 @@ reg_t kFont(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+// TODO: Eventually, all of the kBitmap operations should be put
+// in a separate class
+
+#define BITMAP_HEADER_SIZE 46
+
+reg_t kBitmap(EngineState *s, int argc, reg_t *argv) {
+ // Used for bitmap operations in SCI2.1 and SCI3.
+ // This is the SCI2.1 version, the functionality seems to have changed in SCI3.
+
+ switch (argv[0].toUint16()) {
+ case 0: // init bitmap surface
+ {
+ // 6 params, called e.g. from TextView::init() in Torin's Passage,
+ // script 64890 and TransView::init() in script 64884
+ uint16 width = argv[1].toUint16();
+ uint16 height = argv[2].toUint16();
+ //uint16 skip = argv[3].toUint16();
+ uint16 back = argv[4].toUint16(); // usually equals skip
+ //uint16 width2 = (argc >= 6) ? argv[5].toUint16() : 0;
+ //uint16 height2 = (argc >= 7) ? argv[6].toUint16() : 0;
+ //uint16 transparentFlag = (argc >= 8) ? argv[7].toUint16() : 0;
+
+ // TODO: skip, width2, height2, transparentFlag
+ // (used for transparent bitmaps)
+ int entrySize = width * height + BITMAP_HEADER_SIZE;
+ reg_t memoryId = s->_segMan->allocateHunkEntry("Bitmap()", entrySize);
+ byte *memoryPtr = s->_segMan->getHunkPointer(memoryId);
+ memset(memoryPtr, 0, BITMAP_HEADER_SIZE); // zero out the bitmap header
+ memset(memoryPtr + BITMAP_HEADER_SIZE, back, width * height);
+ // Save totalWidth, totalHeight
+ // TODO: Save the whole bitmap header, like SSCI does
+ WRITE_LE_UINT16((void *)memoryPtr, width);
+ WRITE_LE_UINT16((void *)(memoryPtr + 2), height);
+ return memoryId;
+ }
+ break;
+ case 1: // dispose text bitmap surface
+ return kDisposeTextBitmap(s, argc - 1, argv + 1);
+ case 2: // dispose bitmap surface, with extra param
+ // 2 params, called e.g. from MenuItem::dispose in Torin's Passage,
+ // script 64893
+ warning("kBitmap(2), unk1 %d, bitmap ptr %04x:%04x", argv[1].toUint16(), PRINT_REG(argv[2]));
+ break;
+ case 3: // tiled surface
+ {
+ // 6 params, called e.g. from TiledBitmap::resize() in Torin's Passage,
+ // script 64869
+ reg_t hunkId = argv[1]; // obtained from kBitmap(0)
+ // The tiled view seems to always have 2 loops.
+ // These loops need to have 1 cel in loop 0 and 8 cels in loop 1.
+ uint16 viewNum = argv[2].toUint16(); // vTiles selector
+ uint16 loop = argv[3].toUint16();
+ uint16 cel = argv[4].toUint16();
+ uint16 x = argv[5].toUint16();
+ uint16 y = argv[6].toUint16();
+
+ byte *memoryPtr = s->_segMan->getHunkPointer(hunkId);
+ // Get totalWidth, totalHeight
+ uint16 totalWidth = READ_LE_UINT16((void *)memoryPtr);
+ uint16 totalHeight = READ_LE_UINT16((void *)(memoryPtr + 2));
+ byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
+
+ GfxView *view = g_sci->_gfxCache->getView(viewNum);
+ uint16 tileWidth = view->getWidth(loop, cel);
+ uint16 tileHeight = view->getHeight(loop, cel);
+ const byte *tileBitmap = view->getBitmap(loop, cel);
+ uint16 width = MIN<uint16>(totalWidth - x, tileWidth);
+ uint16 height = MIN<uint16>(totalHeight - y, tileHeight);
+
+ for (uint16 curY = 0; curY < height; curY++) {
+ for (uint16 curX = 0; curX < width; curX++) {
+ bitmap[(curY + y) * totalWidth + (curX + x)] = tileBitmap[curY * tileWidth + curX];
+ }
+ }
+
+ }
+ break;
+ case 4: // add text to bitmap
+ {
+ // 13 params, called e.g. from TextButton::createBitmap() in Torin's Passage,
+ // script 64894
+ reg_t hunkId = argv[1]; // obtained from kBitmap(0)
+ Common::String text = s->_segMan->getString(argv[2]);
+ uint16 textX = argv[3].toUint16();
+ uint16 textY = argv[4].toUint16();
+ //reg_t unk5 = argv[5];
+ //reg_t unk6 = argv[6];
+ //reg_t unk7 = argv[7]; // skip?
+ //reg_t unk8 = argv[8]; // back?
+ //reg_t unk9 = argv[9];
+ uint16 fontId = argv[10].toUint16();
+ //uint16 mode = argv[11].toUint16();
+ uint16 dimmed = argv[12].toUint16();
+ //warning("kBitmap(4): bitmap ptr %04x:%04x, font %d, mode %d, dimmed %d - text: \"%s\"",
+ // PRINT_REG(bitmapPtr), font, mode, dimmed, text.c_str());
+ uint16 foreColor = 255; // TODO
+
+ byte *memoryPtr = s->_segMan->getHunkPointer(hunkId);
+ // Get totalWidth, totalHeight
+ uint16 totalWidth = READ_LE_UINT16((void *)memoryPtr);
+ uint16 totalHeight = READ_LE_UINT16((void *)(memoryPtr + 2));
+ byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
+
+ GfxFont *font = g_sci->_gfxCache->getFont(fontId);
+
+ int16 charCount = 0;
+ uint16 curX = textX, curY = textY;
+ const char *txt = text.c_str();
+
+ while (*txt) {
+ charCount = g_sci->_gfxText32->GetLongest(txt, totalWidth, font);
+ if (charCount == 0)
+ break;
+
+ for (int i = 0; i < charCount; i++) {
+ unsigned char curChar = txt[i];
+ font->drawToBuffer(curChar, curY, curX, foreColor, dimmed, bitmap, totalWidth, totalHeight);
+ curX += font->getCharWidth(curChar);
+ }
+
+ curX = textX;
+ curY += font->getHeight();
+ txt += charCount;
+ while (*txt == ' ')
+ txt++; // skip over breaking spaces
+ }
+
+ }
+ break;
+ case 5: // fill with color
+ {
+ // 6 params, called e.g. from TextView::init() and TextView::draw()
+ // in Torin's Passage, script 64890
+ reg_t hunkId = argv[1]; // obtained from kBitmap(0)
+ uint16 x = argv[2].toUint16();
+ uint16 y = argv[3].toUint16();
+ uint16 fillWidth = argv[4].toUint16(); // width - 1
+ uint16 fillHeight = argv[5].toUint16(); // height - 1
+ uint16 back = argv[6].toUint16();
+
+ byte *memoryPtr = s->_segMan->getHunkPointer(hunkId);
+ // Get totalWidth, totalHeight
+ uint16 totalWidth = READ_LE_UINT16((void *)memoryPtr);
+ uint16 totalHeight = READ_LE_UINT16((void *)(memoryPtr + 2));
+ uint16 width = MIN<uint16>(totalWidth - x, fillWidth);
+ uint16 height = MIN<uint16>(totalHeight - y, fillHeight);
+ byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
+
+ for (uint16 curY = 0; curY < height; curY++) {
+ for (uint16 curX = 0; curX < width; curX++) {
+ bitmap[(curY + y) * totalWidth + (curX + x)] = back;
+ }
+ }
+
+ }
+ break;
+ default:
+ kStub(s, argc, argv);
+ break;
+ }
+
+ return s->r_acc;
+}
+
#endif
} // End of namespace Sci
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index 68469f5c9a..8500f08211 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -691,6 +691,16 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) {
}
case 2: { // At (return value at an index)
SciArray<reg_t> *array = s->_segMan->lookupArray(argv[1]);
+ if (g_sci->getGameId() == GID_PHANTASMAGORIA2) {
+ // HACK: Phantasmagoria 2 keeps trying to access past the end of an
+ // array when it starts. I'm assuming it's trying to see where the
+ // array ends, or tries to resize it. Adjust the array size
+ // accordingly, and return NULL for now.
+ if (array->getSize() == argv[2].toUint16()) {
+ array->setSize(argv[2].toUint16());
+ return NULL_REG;
+ }
+ }
return array->getValue(argv[2].toUint16());
}
case 3: { // Atput (put value at an index)
diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp
index ef795d7e2f..7570856dff 100644
--- a/engines/sci/engine/kmath.cpp
+++ b/engines/sci/engine/kmath.cpp
@@ -37,6 +37,14 @@ reg_t kRandom(EngineState *s, int argc, reg_t *argv) {
// 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();
+ // Some scripts may request a range in the reverse order (from largest
+ // to smallest). An example can be found in Longbow, room 710, where a
+ // random number is requested from 119 to 83. In this case, we're
+ // supposed to return toNumber (determined by the KQ5CD disasm).
+ // Fixes bug #3413020.
+ if (fromNumber > toNumber)
+ return make_reg(0, toNumber);
+
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
diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp
index e6837242e4..a32480c168 100644
--- a/engines/sci/engine/kmisc.cpp
+++ b/engines/sci/engine/kmisc.cpp
@@ -54,8 +54,33 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) {
uint32 neededSleep = 30;
- // WORKAROUNDS:
+ // WORKAROUNDS for scripts that are polling too quickly in scenes that
+ // are not animating much
switch (g_sci->getGameId()) {
+ case GID_CASTLEBRAIN:
+ // In Castle of Dr. Brain, memory color matching puzzle in the first
+ // room (room 100), the game scripts constantly poll the state of each
+ // stone when the user clicks on one. Since the scene is not animating
+ // much, this results in activating and deactivating each stone very
+ // quickly (together with its associated tone sound), depending on how
+ // low it is in the animate list. This worked somewhat in older PCs, but
+ // not in modern computers. We throttle the scene in order to allow the
+ // stones to display, otherwise the game scripts reset them too soon.
+ // Fixes bug #3127824.
+ if (s->currentRoomNumber() == 100) {
+ s->_throttleTrigger = true;
+ neededSleep = 60;
+ }
+ break;
+ case GID_ICEMAN:
+ // In ICEMAN the submarine control room is not animating much, so it
+ // runs way too fast. We calm it down even more, otherwise fighting
+ // against other submarines is almost impossible.
+ if (s->currentRoomNumber() == 27) {
+ s->_throttleTrigger = true;
+ neededSleep = 60;
+ }
+ break;
case GID_LSL3:
// LSL3 calculates a machinespeed variable during game startup
// (right after the filthy questions). This one would go through w/o
@@ -65,21 +90,12 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) {
if (s->currentRoomNumber() == 290)
s->_throttleTrigger = true;
break;
- case GID_ICEMAN:
- // In ICEMAN the submarine control room is not animating much, so it runs way too fast
- // we calm it down even more otherwise especially fighting against other submarines
- // is almost impossible
- if (s->currentRoomNumber() == 27) {
- s->_throttleTrigger = true;
- neededSleep = 60;
- }
- break;
case GID_SQ4:
// In SQ4 (floppy and CD) the sequel police appear way too quickly in
// the Skate-o-rama rooms, resulting in all sorts of timer issues, like
// #3109139 (which occurs because a police officer instantly teleports
// just before Roger exits and shoots him). We throttle these scenes a
- // bit more, in order to prevent timer bugs related to the sequel police
+ // bit more, in order to prevent timer bugs related to the sequel police.
if (s->currentRoomNumber() == 405 || s->currentRoomNumber() == 406 ||
s->currentRoomNumber() == 410 || s->currentRoomNumber() == 411) {
s->_throttleTrigger = true;
diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp
index 14f7db47a0..649a1428a0 100644
--- a/engines/sci/engine/kmovement.cpp
+++ b/engines/sci/engine/kmovement.cpp
@@ -505,116 +505,6 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) {
}
writeSelectorValue(segMan, avoider, SELECTOR(heading), avoiderHeading);
return s->r_acc;
-
-#if 0
- reg_t client, looper, mover;
- int angle;
- int dx, dy;
- int destx, desty;
-
- s->r_acc = SIGNAL_REG;
-
- if (!s->_segMan->isHeapObject(avoider)) {
- error("DoAvoider() where avoider %04x:%04x is not an object", PRINT_REG(avoider));
- return NULL_REG;
- }
-
- client = readSelector(segMan, avoider, SELECTOR(client));
-
- if (!s->_segMan->isHeapObject(client)) {
- error("DoAvoider() where client %04x:%04x is not an object", PRINT_REG(client));
- return NULL_REG;
- }
-
- looper = readSelector(segMan, client, SELECTOR(looper));
- mover = readSelector(segMan, client, SELECTOR(mover));
-
- if (!s->_segMan->isHeapObject(mover)) {
- if (mover.segment) {
- error("DoAvoider() where mover %04x:%04x is not an object", PRINT_REG(mover));
- }
- return s->r_acc;
- }
-
- destx = readSelectorValue(segMan, mover, SELECTOR(x));
- desty = readSelectorValue(segMan, mover, SELECTOR(y));
-
- debugC(kDebugLevelBresen, "Doing avoider %04x:%04x (dest=%d,%d)", PRINT_REG(avoider), destx, desty);
-
- invokeSelector(s, mover, SELECTOR(doit), argc, argv);
-
- mover = readSelector(segMan, client, SELECTOR(mover));
- if (!mover.segment) // Mover has been disposed?
- return s->r_acc; // Return gracefully.
-
- invokeSelector(s, client, SELECTOR(isBlocked), argc, argv);
-
- dx = destx - readSelectorValue(segMan, client, SELECTOR(x));
- dy = desty - readSelectorValue(segMan, client, SELECTOR(y));
- angle = getAngle(dx, dy);
-
- debugC(kDebugLevelBresen, "Movement (%d,%d), angle %d is %sblocked", dx, dy, angle, (s->r_acc.offset) ? " " : "not ");
-
- if (s->r_acc.offset) { // isBlocked() returned non-zero
- int rotation = (g_sci->getRNG().getRandomBit() == 1) ? 45 : (360 - 45); // Clockwise/counterclockwise
- int oldx = readSelectorValue(segMan, client, SELECTOR(x));
- int oldy = readSelectorValue(segMan, client, SELECTOR(y));
- int xstep = readSelectorValue(segMan, client, SELECTOR(xStep));
- int ystep = readSelectorValue(segMan, client, SELECTOR(yStep));
- int moves;
-
- debugC(kDebugLevelBresen, " avoider %04x:%04x", PRINT_REG(avoider));
-
- for (moves = 0; moves < 8; moves++) {
- int move_x = (int)(sin(angle * M_PI / 180.0) * (xstep));
- int move_y = (int)(-cos(angle * M_PI / 180.0) * (ystep));
-
- writeSelectorValue(segMan, client, SELECTOR(x), oldx + move_x);
- writeSelectorValue(segMan, client, SELECTOR(y), oldy + move_y);
-
- debugC(kDebugLevelBresen, "Pos (%d,%d): Trying angle %d; delta=(%d,%d)", oldx, oldy, angle, move_x, move_y);
-
- invokeSelector(s, client, SELECTOR(canBeHere), argc, argv);
-
- writeSelectorValue(segMan, client, SELECTOR(x), oldx);
- writeSelectorValue(segMan, client, SELECTOR(y), oldy);
-
- if (s->r_acc.offset) { // We can be here
- debugC(kDebugLevelBresen, "Success");
- writeSelectorValue(segMan, client, SELECTOR(heading), angle);
-
- return make_reg(0, angle);
- }
-
- angle += rotation;
-
- if (angle > 360)
- angle -= 360;
- }
-
- error("DoAvoider failed for avoider %04x:%04x", PRINT_REG(avoider));
- } else {
- int heading = readSelectorValue(segMan, client, SELECTOR(heading));
-
- if (heading == -1)
- return s->r_acc; // No change
-
- writeSelectorValue(segMan, client, SELECTOR(heading), angle);
-
- s->r_acc = make_reg(0, angle);
-
- 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
- kDirLoopWorker(client, (uint16)angle, s, argc, argv);
- }
- }
-
- return s->r_acc;
-#endif
}
} // End of namespace Sci
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp
index 07b87a7cbc..1a9359bb26 100644
--- a/engines/sci/engine/kstring.cpp
+++ b/engines/sci/engine/kstring.cpp
@@ -42,6 +42,14 @@ reg_t kStrCat(EngineState *s, int argc, reg_t *argv) {
Common::String s1 = s->_segMan->getString(argv[0]);
Common::String s2 = s->_segMan->getString(argv[1]);
+ // The Japanese version of PQ2 splits the two strings here
+ // (check bug #3396887).
+ if (g_sci->getGameId() == GID_PQ2 &&
+ g_sci->getLanguage() == Common::JA_JPN) {
+ s1 = g_sci->strSplit(s1.c_str(), NULL);
+ s2 = g_sci->strSplit(s2.c_str(), NULL);
+ }
+
s1 += s2;
s->_segMan->strcpy(argv[0], s1.c_str());
return argv[0];
@@ -193,8 +201,8 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
char xfer;
int i;
int startarg;
- int str_leng = 0; /* Used for stuff like "%13s" */
- int unsigned_var = 0;
+ int strLength = 0; /* Used for stuff like "%13s" */
+ bool unsignedVar = false;
if (position.segment)
startarg = 2;
@@ -228,7 +236,7 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
mode = 0;
} else {
mode = 1;
- str_leng = 0;
+ strLength = 0;
}
} else if (mode == 1) { /* xfer != '%' */
char fillchar = ' ';
@@ -238,32 +246,32 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
/* int writelength; -- unused atm */
- if (xfer && (isdigit(xfer) || xfer == '-' || xfer == '=')) {
+ if (xfer && (isdigit(static_cast<unsigned char>(xfer)) || xfer == '-' || xfer == '=')) {
char *destp;
if (xfer == '0')
fillchar = '0';
else if (xfer == '=')
align = ALIGN_CENTER;
- else if (isdigit(xfer) || (xfer == '-'))
+ else if (isdigit(static_cast<unsigned char>(xfer)) || (xfer == '-'))
source--; // Go to start of length argument
- str_leng = strtol(source, &destp, 10);
+ strLength = strtol(source, &destp, 10);
if (destp > source)
source = destp;
- if (str_leng < 0) {
+ if (strLength < 0) {
align = ALIGN_LEFT;
- str_leng = -str_leng;
+ strLength = -strLength;
} else if (align != ALIGN_CENTER)
align = ALIGN_RIGHT;
xfer = *source++;
} else
- str_leng = 0;
+ strLength = 0;
- assert((target - targetbuf) + str_leng + 1 <= maxsize);
+ assert((target - targetbuf) + strLength + 1 <= maxsize);
switch (xfer) {
case 's': { /* Copy string */
@@ -278,7 +286,7 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
Common::String tempsource = g_sci->getKernel()->lookupText(reg,
arguments[paramindex + 1]);
int slen = strlen(tempsource.c_str());
- int extralen = str_leng - slen;
+ int extralen = strLength - slen;
assert((target - targetbuf) + extralen <= maxsize);
if (extralen < 0)
extralen = 0;
@@ -334,18 +342,25 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
case 'c': { /* insert character */
assert((target - targetbuf) + 2 <= maxsize);
if (align >= 0)
- while (str_leng-- > 1)
+ while (strLength-- > 1)
*target++ = ' '; /* Format into the text */
-
- *target++ = arguments[paramindex++];
+ char argchar = arguments[paramindex++];
+ if (argchar)
+ *target++ = argchar;
mode = 0;
}
break;
case 'x':
case 'u':
- unsigned_var = 1;
+ unsignedVar = true;
case 'd': { /* Copy decimal */
+ // In the new SCI2 kString function, %d is used for unsigned
+ // integers. An example is script 962 in Shivers - it uses %d
+ // to create file names.
+ if (getSciVersion() >= SCI_VERSION_2)
+ unsignedVar = true;
+
/* int templen; -- unused atm */
const char *format_string = "%d";
@@ -353,14 +368,14 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
format_string = "%x";
int val = arguments[paramindex];
- if (!unsigned_var)
+ if (!unsignedVar)
val = (int16)arguments[paramindex];
target += sprintf(target, format_string, val);
paramindex++;
assert((target - targetbuf) <= maxsize);
- unsigned_var = 0;
+ unsignedVar = false;
mode = 0;
}
@@ -375,7 +390,7 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
if (align) {
int written = target - writestart;
- int padding = str_leng - written;
+ int padding = strLength - written;
if (padding > 0) {
if (align > 0) {
@@ -730,6 +745,10 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) {
case 8: { // Dup
const char *rawString = 0;
uint32 size = 0;
+ reg_t stringHandle;
+ // We allocate the new string first because if the StringTable needs to
+ // grow, our rawString pointer will be invalidated
+ SciString *dupString = s->_segMan->allocateString(&stringHandle);
if (argv[1].segment == s->_segMan->getStringSegmentId()) {
SciString *string = s->_segMan->lookupString(argv[1]);
@@ -741,8 +760,6 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) {
size = string.size() + 1;
}
- reg_t stringHandle;
- SciString *dupString = s->_segMan->allocateString(&stringHandle);
dupString->setSize(size);
for (uint32 i = 0; i < size; i++)
diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp
index 6d810d516c..c9cf652013 100644
--- a/engines/sci/engine/kvideo.cpp
+++ b/engines/sci/engine/kvideo.cpp
@@ -21,6 +21,7 @@
*/
#include "engines/util.h"
+#include "sci/engine/kernel.h"
#include "sci/engine/state.h"
#include "sci/graphics/helpers.h"
#include "sci/graphics/cursor.h"
@@ -39,6 +40,7 @@
#include "sci/video/seq_decoder.h"
#ifdef ENABLE_SCI32
#include "video/coktel_decoder.h"
+#include "sci/video/robot_decoder.h"
#endif
namespace Sci {
@@ -230,6 +232,49 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) {
#ifdef ENABLE_SCI32
+reg_t kRobot(EngineState *s, int argc, reg_t *argv) {
+ int16 subop = argv[0].toUint16();
+
+ switch (subop) {
+ case 0: { // init
+ int id = argv[1].toUint16();
+ reg_t obj = argv[2];
+ int16 flag = argv[3].toSint16();
+ int16 x = argv[4].toUint16();
+ int16 y = argv[5].toUint16();
+ warning("kRobot(init), id %d, obj %04x:%04x, flag %d, x=%d, y=%d", id, PRINT_REG(obj), flag, x, y);
+ g_sci->_robotDecoder->load(id);
+ g_sci->_robotDecoder->setPos(x, y);
+ }
+ break;
+ case 1: // LSL6 hires (startup)
+ // TODO
+ return NULL_REG; // an integer is expected
+ case 4: { // start - we don't really have a use for this one
+ //int id = argv[1].toUint16();
+ //warning("kRobot(start), id %d", id);
+ }
+ break;
+ case 7: // unknown, called e.g. by Phantasmagoria
+ warning("kRobot(%d)", subop);
+ break;
+ case 8: // sync
+ if ((uint32)g_sci->_robotDecoder->getCurFrame() != g_sci->_robotDecoder->getFrameCount() - 1) {
+ writeSelector(s->_segMan, argv[1], SELECTOR(signal), NULL_REG);
+ } else {
+ g_sci->_robotDecoder->close();
+ // Signal the engine scripts that the video is done
+ writeSelector(s->_segMan, argv[1], SELECTOR(signal), SIGNAL_REG);
+ }
+ break;
+ default:
+ warning("kRobot(%d)", subop);
+ break;
+ }
+
+ return s->r_acc;
+}
+
reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) {
uint16 operation = argv[0].toUint16();
Video::VideoDecoder *videoDecoder = 0;
@@ -331,6 +376,55 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv) {
+ uint16 operation = argv[0].toUint16();
+ Video::VideoDecoder *videoDecoder = 0;
+ bool reshowCursor = g_sci->_gfxCursor->isVisible();
+
+ switch (operation) {
+ case 1: // Play
+ // 6 params
+ s->_videoState.reset();
+ s->_videoState.fileName = Common::String::format("%d.duk", argv[1].toUint16());
+
+ videoDecoder = new Video::AviDecoder(g_system->getMixer());
+
+ if (!videoDecoder->loadFile(s->_videoState.fileName)) {
+ warning("Could not open Duck %s", s->_videoState.fileName.c_str());
+ break;
+ }
+
+ if (reshowCursor)
+ g_sci->_gfxCursor->kernelHide();
+
+ {
+ // Duck videos are 16bpp, so we need to change the active pixel format
+ int oldWidth = g_system->getWidth();
+ int oldHeight = g_system->getHeight();
+ Common::List<Graphics::PixelFormat> formats;
+ formats.push_back(videoDecoder->getPixelFormat());
+ initGraphics(640, 480, true, formats);
+
+ if (g_system->getScreenFormat().bytesPerPixel != videoDecoder->getPixelFormat().bytesPerPixel)
+ error("Could not switch screen format for the duck video");
+
+ playVideo(videoDecoder, s->_videoState);
+
+ // Switch back to 8bpp
+ initGraphics(oldWidth, oldHeight, oldWidth > 320);
+ }
+
+ if (reshowCursor)
+ g_sci->_gfxCursor->kernelShow();
+ break;
+ default:
+ kStub(s, argc, argv);
+ break;
+ }
+
+ return s->r_acc;
+}
+
#endif
} // End of namespace Sci
diff --git a/engines/sci/engine/object.cpp b/engines/sci/engine/object.cpp
index a1854a2723..78e216cdb5 100644
--- a/engines/sci/engine/object.cpp
+++ b/engines/sci/engine/object.cpp
@@ -202,9 +202,10 @@ bool Object::initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClas
name = "<invalid name>";
}
- warning("Object %04x:%04x (name %s, script %d) varnum doesn't "
- "match baseObj's: obj %d, base %d", PRINT_REG(_pos),
- name, objScript, originalVarCount, baseObj->getVarCount());
+ debugC(kDebugLevelVM, "Object %04x:%04x (name %s, script %d) "
+ "varnum doesn't match baseObj's: obj %d, base %d",
+ PRINT_REG(_pos), name, objScript,
+ originalVarCount, baseObj->getVarCount());
#if 0
// We enumerate the methods selectors which could be hidden here
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index e43c7097ed..030c0f3f54 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -545,8 +545,6 @@ void DataStack::saveLoadWithSerializer(Common::Serializer &s) {
void SciMusic::saveLoadWithSerializer(Common::Serializer &s) {
// Sync song lib data. When loading, the actual song lib will be initialized
// afterwards in gamestate_restore()
- Common::StackLock lock(_mutex);
-
int songcount = 0;
byte masterVolume = soundGetMasterVolume();
byte reverb = _pMidiDrv->getReverb();
@@ -576,9 +574,12 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) {
songcount = _playList.size();
s.syncAsUint32LE(songcount);
- if (s.isLoading()) {
+ if (s.isLoading())
clearPlayList();
+ Common::StackLock lock(_mutex);
+
+ if (s.isLoading()) {
for (int i = 0; i < songcount; i++) {
MusicEntry *curSong = new MusicEntry();
curSong->saveLoadWithSerializer(s);
@@ -626,12 +627,8 @@ void SoundCommandParser::reconstructPlayList() {
const MusicList::iterator end = _music->getPlayListEnd();
for (MusicList::iterator i = _music->getPlayListStart(); i != end; ++i) {
- if ((*i)->resourceId && _resMan->testResource(ResourceId(kResourceTypeSound, (*i)->resourceId))) {
- (*i)->soundRes = new SoundResource((*i)->resourceId, _resMan, _soundVersion);
- _music->soundInitSnd(*i);
- } else {
- (*i)->soundRes = 0;
- }
+ initSoundResource(*i);
+
if ((*i)->status == kSoundPlaying) {
// Sync the sound object's selectors related to playing with the stored
// ones in the playlist, as they may have been invalidated when loading.
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index a714980a35..7efcb42f4b 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -855,26 +855,8 @@ const uint16 qfg3PatchImportDialog[] = {
PATCH_END
};
-// Script 23 in QFG3 has a typo/bug which makes it loop endlessly and
-// read garbage. Fixes bug #3040722.
-const byte qfg3DialogCrash[] = {
- 5,
- 0x34, 0xe7, 0x03, // ldi 3e7 (999)
- 0x22, // lt?
- 0x33, // jmp [back] ---> BUG! Infinite loop
- 0
-};
-
-const uint16 qfg3PatchDialogCrash[] = {
- 0x34, 0xe7, 0x03, // ldi 3e7 (999)
- 0x22, // lt?
- 0x31, // bnt [back]
- PATCH_END
-};
-
// script, description, magic DWORD, adjust
const SciScriptSignature qfg3Signatures[] = {
- { 23, "dialog crash", 1, PATCH_MAGICDWORD(0xe7, 0x03, 0x22, 0x33), -1, qfg3DialogCrash, qfg3PatchDialogCrash },
{ 944, "import dialog continuous calls", 1, PATCH_MAGICDWORD(0x2a, 0x31, 0x0b, 0x7a), -1, qfg3SignatureImportDialog, qfg3PatchImportDialog },
SCI_SIGNATUREENTRY_TERMINATOR
};
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index 3a18fbc68f..ad3f4fb788 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -31,6 +31,8 @@
namespace Sci {
+//#define VM_DEBUG_SEND
+
// This table is only used for debugging. Don't include it for devices
// with not enough available memory (e.g. phones), where REDUCE_MEMORY_USAGE
// is defined
@@ -618,12 +620,13 @@ void debugSelectorCall(reg_t send_obj, Selector selector, int argc, StackPtr arg
#ifdef VM_DEBUG_SEND
debugN("Send to %04x:%04x (%s), selector %04x (%s):", PRINT_REG(send_obj),
- s->_segMan->getObjectName(send_obj), selector,
+ segMan->getObjectName(send_obj), selector,
g_sci->getKernel()->getSelectorName(selector).c_str());
#endif // VM_DEBUG_SEND
switch (selectorType) {
case kSelectorNone:
+ debugN("\n");
break;
case kSelectorVariable:
#ifdef VM_DEBUG_SEND
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index ab67da32db..1510af8508 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -28,12 +28,6 @@
namespace Sci {
-enum {
- DEFAULT_SCRIPTS = 32,
- DEFAULT_OBJECTS = 8, ///< default number of objects per script
- DEFAULT_OBJECTS_INCREMENT = 4 ///< Number of additional objects to instantiate if we're running out of them
-};
-
SegManager::SegManager(ResourceManager *resMan) {
_heap.push_back(0);
diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp
index c2f857f319..a9aca9e22f 100644
--- a/engines/sci/engine/selector.cpp
+++ b/engines/sci/engine/selector.cpp
@@ -167,6 +167,7 @@ void Kernel::mapSelectors() {
#ifdef ENABLE_SCI32
FIND_SELECTOR(data);
FIND_SELECTOR(picture);
+ FIND_SELECTOR(bitmap);
FIND_SELECTOR(plane);
FIND_SELECTOR(top);
FIND_SELECTOR(left);
diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h
index 085dd6e832..bbd86bb03e 100644
--- a/engines/sci/engine/selector.h
+++ b/engines/sci/engine/selector.h
@@ -132,6 +132,7 @@ struct SelectorCache {
#ifdef ENABLE_SCI32
Selector data; // Used by Array()/String()
Selector picture; // Used to hold the picture ID for SCI32 pictures
+ Selector bitmap; // Used to hold the text bitmap for SCI32 texts
Selector plane;
Selector top;
diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp
index cca4c47be8..74d2851024 100644
--- a/engines/sci/engine/static_selectors.cpp
+++ b/engines/sci/engine/static_selectors.cpp
@@ -102,18 +102,28 @@ static const char * const sci2Selectors[] = {
#endif
static const SelectorRemap sciSelectorRemap[] = {
- { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "moveDone", 170 },
- { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "points", 316 },
- { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "flags", 368 },
- { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "nodePtr", 44 },
- { SCI_VERSION_1_LATE, SCI_VERSION_1_LATE, "cantBeHere", 57 },
- { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "topString", 101 },
- { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "flags", 102 },
+ { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "moveDone", 170 },
+ { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "points", 316 },
+ { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "flags", 368 },
+ { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "nodePtr", 44 },
+ { SCI_VERSION_1_LATE, SCI_VERSION_1_LATE, "cantBeHere", 57 },
+ { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "topString", 101 },
+ { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "flags", 102 },
// SCI1.1
- { SCI_VERSION_1_1, SCI_VERSION_1_1, "nodePtr", 41 },
- { SCI_VERSION_1_1, SCI_VERSION_1_1, "cantBeHere", 54 },
- { SCI_VERSION_1_1, SCI_VERSION_2_1, "-info-",4103 },
- { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, 0 }
+ { SCI_VERSION_1_1, SCI_VERSION_1_1, "nodePtr", 41 },
+ { SCI_VERSION_1_1, SCI_VERSION_1_1, "cantBeHere", 54 },
+ // The following are not really needed. They've only been defined to
+ // ease game debugging.
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-objID-", 4096 },
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-size-", 4097 },
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-propDict-", 4098 },
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-methDict-", 4099 },
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-classScript-", 4100 },
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-script-", 4101 },
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-super-", 4102 },
+ //
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-info-", 4103 },
+ { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, 0 }
};
struct ClassReference {
@@ -182,9 +192,6 @@ Common::StringArray Kernel::checkStaticSelectorNames() {
for (int i = count + countSci1; i < count + countSci1 + countSci11; i++)
names[i] = sci11Selectors[i - count - countSci1];
}
-
- findSpecificSelectors(names);
-
#ifdef ENABLE_SCI32
} else {
// SCI2+
@@ -193,6 +200,8 @@ Common::StringArray Kernel::checkStaticSelectorNames() {
#endif
}
+ findSpecificSelectors(names);
+
for (const SelectorRemap *selectorRemap = sciSelectorRemap; selectorRemap->slot; ++selectorRemap) {
if (getSciVersion() >= selectorRemap->minVersion && getSciVersion() <= selectorRemap->maxVersion) {
const uint32 slot = selectorRemap->slot;
@@ -213,13 +222,16 @@ void Kernel::findSpecificSelectors(Common::StringArray &selectorNames) {
// We need to initialize script 0 here, to make sure that it's always
// located at segment 1.
_segMan->instantiateScript(0);
+ uint16 sci2Offset = (getSciVersion() >= SCI_VERSION_2) ? 64000 : 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 ((getSciVersion() >= SCI_VERSION_1_EGA_ONLY)) {
- if (_resMan->testResource(ResourceId(kResourceTypeScript, 998))) {
- _segMan->instantiateScript(998);
+ uint16 actorScript = 998;
+
+ if (_resMan->testResource(ResourceId(kResourceTypeScript, actorScript + sci2Offset))) {
+ _segMan->instantiateScript(actorScript + sci2Offset);
const Object *actorClass = _segMan->getObject(_segMan->findObjectByName("Actor"));
@@ -227,9 +239,10 @@ void Kernel::findSpecificSelectors(Common::StringArray &selectorNames) {
// Find the xLast and yLast selectors, used in kDoBresen
const int offset = (getSciVersion() < SCI_VERSION_1_1) ? 3 : 0;
+ const int offset2 = (getSciVersion() >= SCI_VERSION_2) ? 12 : 0;
// 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
+ int illegalBitsSelectorPos = actorClass->locateVarSelector(_segMan, 15 + offset + offset2); // illegalBits
+ int xStepSelectorPos = actorClass->locateVarSelector(_segMan, 51 + offset + offset2); // xStep
if (xStepSelectorPos - illegalBitsSelectorPos != 3) {
error("illegalBits and xStep selectors aren't found in "
"known locations. illegalBits = %d, xStep = %d",
@@ -253,10 +266,10 @@ void Kernel::findSpecificSelectors(Common::StringArray &selectorNames) {
// Find selectors from specific classes
for (int i = 0; i < ARRAYSIZE(classReferences); i++) {
- if (!_resMan->testResource(ResourceId(kResourceTypeScript, classReferences[i].script)))
+ if (!_resMan->testResource(ResourceId(kResourceTypeScript, classReferences[i].script + sci2Offset)))
continue;
- _segMan->instantiateScript(classReferences[i].script);
+ _segMan->instantiateScript(classReferences[i].script + sci2Offset);
const Object *targetClass = _segMan->getObject(_segMan->findObjectByName(classReferences[i].className));
int targetSelectorPos = 0;
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index db682de16f..c94fdac034 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -41,7 +41,6 @@ namespace Sci {
const reg_t NULL_REG = {0, 0};
const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET};
const reg_t TRUE_REG = {0, 1};
-//#define VM_DEBUG_SEND
// Enable the define below to have the VM abort on cases where a conditional
// statement is followed by an unconditional jump (which will most likely lead
// to an infinite loop). Aids in detecting script bugs such as #3040722.
@@ -233,11 +232,10 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP
if (!temp) {
#ifdef ENABLE_SCI32
- // HACK: Temporarily switch to a warning in SCI32 games until we can figure out why Torin has
- // an invalid exported function.
- if (getSciVersion() >= SCI_VERSION_2)
- warning("Request for invalid exported function 0x%x of script %d", pubfunct, script);
- else
+ if (g_sci->getGameId() == GID_TORIN && script == 64036) {
+ // Script 64036 in Torin's Passage is empty and contains an invalid
+ // (empty) export
+ } else
#endif
error("Request for invalid exported function 0x%x of script %d", pubfunct, script);
return NULL;
@@ -462,7 +460,7 @@ int readPMachineInstruction(const byte *src, byte &extOpcode, int16 opparams[4])
extOpcode = src[offset++]; // Get "extended" opcode (lower bit has special meaning)
const byte opcode = extOpcode >> 1; // get the actual opcode
- memset(opparams, 0, sizeof(opparams));
+ memset(opparams, 0, 4*sizeof(int16));
for (int i = 0; g_opcode_formats[opcode][i]; ++i) {
//debugN("Opcode: 0x%x, Opnumber: 0x%x, temp: %d\n", opcode, opcode, temp);
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index 768ba28518..f68b74e1e0 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -77,6 +77,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_HOYLE4, 700, 700, 1, "BridgeHand", "calcQTS", -1, 3, { WORKAROUND_FAKE, 0 } }, // sometimes when placing a bid in bridge
{ GID_HOYLE4, 300, 300, 0, "", "export 2", 0x1d4d, 0, { WORKAROUND_FAKE, 0 } }, // after passing around cards in hearts
{ GID_HOYLE4, 400, 400, 1, "GinHand", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // sometimes while playing Gin Rummy (e.g. when knocking and placing a card) - bug #3292334
+ { GID_HOYLE4, 500, 17, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // sometimes while playing Cribbage (e.g. when the opponent says "Last Card") - bug #3292327
{ 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
@@ -123,6 +124,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ 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", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // happens during the non-interactive demo of Pepper
+ { GID_PQ4, -1, 25, 0, "iconToggle", "select", -1, 1, { WORKAROUND_FAKE, 0 } }, // when toggling the icon bar to auto-hide or not
{ GID_PQSWAT, -1, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // Using the menu in the beginning
{ 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
@@ -153,6 +155,9 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_SHIVERS, -1, 952, 0, "SoundManager", "stop", -1, 2, { WORKAROUND_FAKE, 0 } }, // Just after Sierra logo
{ GID_SHIVERS, -1, 64950, 0, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When clicking on the locked door at the beginning
{ GID_SHIVERS, -1, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When clicking on the gargoyle eye at the beginning
+ { GID_SHIVERS, 20311, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // Just after door puzzle is solved and the metal balls start to roll
+ { GID_SHIVERS, 29260, 29260, 0, "spMars", "handleEvent", -1, 4, { WORKAROUND_FAKE, 0 } }, // When clicking mars after seeing fortune to align earth etc...
+ { GID_SHIVERS, 29260, 29260, 0, "spVenus", "handleEvent", -1, 4, { WORKAROUND_FAKE, 0 } }, // When clicking venus after seeing fortune to align earth etc...
{ 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)
@@ -211,10 +216,6 @@ const SciWorkaroundEntry kDisplay_workarounds[] = {
{ 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_QFG3, -1, 47, 0, "barterWin", "open", 0x1426, 0, { WORKAROUND_IGNORE, 0 } }, // sometimes when talking with a vendor that can be bartered with, the wrong local variable is checked and the variable contents are wrong - bug #3292251
- { GID_QFG3, -1, 47, 0, "barterIcon", "show", 0x135c, 0, { WORKAROUND_IGNORE, 0 } }, // sometimes when talking with a vendor that can be bartered with, the wrong local variable is checked and the variable contents are wrong - bug #3292251
- { GID_SQ1, -1, 700, 0, "arcadaRegion", "doit", -1, 0, { WORKAROUND_IGNORE, 0 } }, // restoring in some rooms of the arcada (right at the start)
- { GID_SQ1, 44, 44, 0, "spinDone", "changeState",0x13b0, 0, { WORKAROUND_IGNORE, 0 } }, // restoring a game at the slot machine in Ulence Flats (bug #3308087)
{ 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
@@ -283,7 +284,6 @@ const SciWorkaroundEntry kGraphSaveBox_workarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = {
{ 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, NULL, "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens while playing Battle Cruiser (invalid segment) - bug #3056811
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -387,7 +387,7 @@ const SciWorkaroundEntry kStrLen_workarounds[] = {
const SciWorkaroundEntry kUnLoad_workarounds[] = {
{ GID_ECOQUEST, 380, 61, 0, "gotIt", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // CD version: after talking to the dolphin the first time, a 3rd parameter is passed by accident
{ GID_ECOQUEST, 380, 69, 0, "lookAtBlackBoard", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // German version, when closing the blackboard closeup in the dolphin room, a 3rd parameter is passed by accident - bug #3098353
- { GID_LAURABOW2, -1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902
+ { GID_LAURABOW2, -1, -1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902
{ GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident
{ GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident
{ GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident
diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp
index 18f8511953..983e697481 100644
--- a/engines/sci/graphics/animate.cpp
+++ b/engines/sci/graphics/animate.cpp
@@ -32,6 +32,7 @@
#include "sci/engine/selector.h"
#include "sci/engine/vm.h"
#include "sci/graphics/cache.h"
+#include "sci/graphics/compare.h"
#include "sci/graphics/cursor.h"
#include "sci/graphics/ports.h"
#include "sci/graphics/paint16.h"
@@ -307,10 +308,7 @@ void GfxAnimate::setNsRect(GfxView *view, AnimateList::iterator it) {
// This special handling is not included in the other SCI1.1 interpreters and MUST NOT be
// checked in those cases, otherwise we will break games (e.g. EcoQuest 2, room 200)
if ((g_sci->getGameId() == GID_HOYLE4) && (it->scaleSignal & kScaleSignalHoyle4SpecialHandling)) {
- it->celRect.left = readSelectorValue(_s->_segMan, it->object, SELECTOR(nsLeft));
- it->celRect.top = readSelectorValue(_s->_segMan, it->object, SELECTOR(nsTop));
- it->celRect.right = readSelectorValue(_s->_segMan, it->object, SELECTOR(nsRight));
- it->celRect.bottom = readSelectorValue(_s->_segMan, it->object, SELECTOR(nsBottom));
+ it->celRect = g_sci->_gfxCompare->getNSRect(it->object);
view->getCelSpecialHoyle4Rect(it->loopNo, it->celNo, it->x, it->y, it->z, it->celRect);
shouldSetNsRect = false;
} else {
@@ -319,10 +317,7 @@ void GfxAnimate::setNsRect(GfxView *view, AnimateList::iterator it) {
}
if (shouldSetNsRect) {
- writeSelectorValue(_s->_segMan, it->object, SELECTOR(nsLeft), it->celRect.left);
- writeSelectorValue(_s->_segMan, it->object, SELECTOR(nsTop), it->celRect.top);
- writeSelectorValue(_s->_segMan, it->object, SELECTOR(nsRight), it->celRect.right);
- writeSelectorValue(_s->_segMan, it->object, SELECTOR(nsBottom), it->celRect.bottom);
+ g_sci->_gfxCompare->setNSRect(it->object, it->celRect);
}
}
@@ -544,10 +539,7 @@ void GfxAnimate::addToPicDrawCels() {
applyGlobalScaling(it, view);
}
view->getCelScaledRect(it->loopNo, it->celNo, it->x, it->y, it->z, it->scaleX, it->scaleY, it->celRect);
- writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsLeft), it->celRect.left);
- writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsTop), it->celRect.top);
- writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsRight), it->celRect.right);
- writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsBottom), it->celRect.bottom);
+ g_sci->_gfxCompare->setNSRect(curObject, it->celRect);
} else {
view->getCelRect(it->loopNo, it->celNo, it->x, it->y, it->z, it->celRect);
}
diff --git a/engines/sci/graphics/cache.cpp b/engines/sci/graphics/cache.cpp
index d2bd76ac99..55f8624c49 100644
--- a/engines/sci/graphics/cache.cpp
+++ b/engines/sci/graphics/cache.cpp
@@ -102,4 +102,8 @@ int16 GfxCache::kernelViewGetCelCount(GuiResourceId viewId, int16 loopNo) {
return getView(viewId)->getCelCount(loopNo);
}
+byte GfxCache::kernelViewGetColorAtCoordinate(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 x, int16 y) {
+ return getView(viewId)->getColorAtCoordinate(loopNo, celNo, x, y);
+}
+
} // End of namespace Sci
diff --git a/engines/sci/graphics/cache.h b/engines/sci/graphics/cache.h
index c090cda7d7..2f462fe042 100644
--- a/engines/sci/graphics/cache.h
+++ b/engines/sci/graphics/cache.h
@@ -49,6 +49,8 @@ public:
int16 kernelViewGetLoopCount(GuiResourceId viewId);
int16 kernelViewGetCelCount(GuiResourceId viewId, int16 loopNo);
+ byte kernelViewGetColorAtCoordinate(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 x, int16 y);
+
private:
void purgeFontCache();
void purgeViewCache();
diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp
index 3183ffa2b9..70dff15a86 100644
--- a/engines/sci/graphics/compare.cpp
+++ b/engines/sci/graphics/compare.cpp
@@ -147,10 +147,7 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) {
#endif
if (lookupSelector(_segMan, objectReference, SELECTOR(nsTop), NULL, NULL) == kSelectorVariable) {
- writeSelectorValue(_segMan, objectReference, SELECTOR(nsLeft), celRect.left);
- writeSelectorValue(_segMan, objectReference, SELECTOR(nsRight), celRect.right);
- writeSelectorValue(_segMan, objectReference, SELECTOR(nsTop), celRect.top);
- writeSelectorValue(_segMan, objectReference, SELECTOR(nsBottom), celRect.bottom);
+ setNSRect(objectReference, celRect);
}
}
@@ -221,10 +218,7 @@ void GfxCompare::kernelBaseSetter(reg_t object) {
scaleSignal = 0;
if (scaleSignal & kScaleSignalDoScaling) {
- celRect.left = readSelectorValue(_segMan, object, SELECTOR(nsLeft));
- celRect.right = readSelectorValue(_segMan, object, SELECTOR(nsRight));
- celRect.top = readSelectorValue(_segMan, object, SELECTOR(nsTop));
- celRect.bottom = readSelectorValue(_segMan, object, SELECTOR(nsBottom));
+ celRect = getNSRect(object);
} else {
if (tmpView->isSci2Hires())
tmpView->adjustToUpscaledCoordinates(y, x);
@@ -247,4 +241,29 @@ void GfxCompare::kernelBaseSetter(reg_t object) {
}
}
+Common::Rect GfxCompare::getNSRect(reg_t object, bool fixRect) {
+ Common::Rect nsRect;
+ nsRect.top = readSelectorValue(_segMan, object, SELECTOR(nsTop));
+ nsRect.left = readSelectorValue(_segMan, object, SELECTOR(nsLeft));
+ nsRect.bottom = readSelectorValue(_segMan, object, SELECTOR(nsBottom));
+ nsRect.right = readSelectorValue(_segMan, object, SELECTOR(nsRight));
+
+ if (fixRect) {
+ // nsRect top/left may be negative, adjust accordingly
+ if (nsRect.top < 0)
+ nsRect.top = 0;
+ if (nsRect.left < 0)
+ nsRect.left = 0;
+ }
+
+ return nsRect;
+}
+
+void GfxCompare::setNSRect(reg_t object, Common::Rect nsRect) {
+ writeSelectorValue(_segMan, object, SELECTOR(nsLeft), nsRect.left);
+ writeSelectorValue(_segMan, object, SELECTOR(nsTop), nsRect.top);
+ writeSelectorValue(_segMan, object, SELECTOR(nsRight), nsRect.right);
+ writeSelectorValue(_segMan, object, SELECTOR(nsBottom), nsRect.bottom);
+}
+
} // End of namespace Sci
diff --git a/engines/sci/graphics/compare.h b/engines/sci/graphics/compare.h
index bacb6e71e2..91e3b90fdb 100644
--- a/engines/sci/graphics/compare.h
+++ b/engines/sci/graphics/compare.h
@@ -42,6 +42,8 @@ public:
reg_t kernelCanBeHere(reg_t curObject, reg_t listReference);
bool kernelIsItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position);
void kernelBaseSetter(reg_t object);
+ Common::Rect getNSRect(reg_t object, bool fixRect = false);
+ void setNSRect(reg_t object, Common::Rect nsRect);
private:
SegManager *_segMan;
diff --git a/engines/sci/graphics/controls.cpp b/engines/sci/graphics/controls.cpp
index 8d4712a969..a0750c7d3e 100644
--- a/engines/sci/graphics/controls.cpp
+++ b/engines/sci/graphics/controls.cpp
@@ -30,6 +30,7 @@
#include "sci/engine/kernel.h"
#include "sci/engine/state.h"
#include "sci/engine/selector.h"
+#include "sci/graphics/compare.h"
#include "sci/graphics/ports.h"
#include "sci/graphics/paint16.h"
#include "sci/graphics/font.h"
@@ -230,8 +231,8 @@ void GfxControls::kernelTexteditChange(reg_t controlObject, reg_t eventObject) {
if (textChanged) {
GuiResourceId oldFontId = _text16->GetFontId();
GuiResourceId fontId = readSelectorValue(_segMan, controlObject, SELECTOR(font));
- rect = Common::Rect(readSelectorValue(_segMan, controlObject, SELECTOR(nsLeft)), readSelectorValue(_segMan, controlObject, SELECTOR(nsTop)),
- readSelectorValue(_segMan, controlObject, SELECTOR(nsRight)), readSelectorValue(_segMan, controlObject, SELECTOR(nsBottom)));
+ rect = g_sci->_gfxCompare->getNSRect(controlObject);
+
_text16->SetFont(fontId);
if (textAddChar) {
diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp
index ec49a38814..50da48aaf3 100644
--- a/engines/sci/graphics/cursor.cpp
+++ b/engines/sci/graphics/cursor.cpp
@@ -179,6 +179,18 @@ void GfxCursor::kernelSetView(GuiResourceId viewNum, int loopNum, int celNum, Co
if (_useOriginalKQ6WinCursors)
viewNum += 2000; // Windows cursors
+ if (g_sci->getGameId() == GID_PHANTASMAGORIA2) {
+ // HACK: Ignore cursor views for Phantasmagoria 2. They've got
+ // differences from other SCI32 views, thus we skip them for
+ // now, otherwise our view decoding code will crash.
+ // The view code will crash with *any* view in P2, but this hack
+ // allows the game to start and show the menu.
+ // TODO: Remove once the view code is updated to handle
+ // Phantasmagoria 2 views.
+ warning("TODO: Cursor views for Phantasmagoria 2");
+ return;
+ }
+
if (!_cachedCursors.contains(viewNum))
_cachedCursors[viewNum] = new GfxView(_resMan, _screen, _palette, viewNum);
@@ -227,8 +239,10 @@ void GfxCursor::kernelSetView(GuiResourceId viewNum, int loopNum, int celNum, Co
// Game, newPosition, validRect
static const SciCursorSetPositionWorkarounds setPositionWorkarounds[] = {
{ GID_ISLANDBRAIN, 84, 109, 46, 76, 174, 243 }, // island of dr. brain / game menu
+ { GID_ISLANDBRAIN,143, 135, 57, 102, 163, 218 },// island of dr. brain / pause menu within copy protection
{ 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
+ { GID_QFG3, 70, 170, 40, 61, 81, 258 }, // Quest For Glory 3 / run/walk/sleep sub-menu
{ (SciGameId)0, -1, -1, -1, -1, -1, -1 }
};
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 11948d5d38..a41efd6a9f 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -37,12 +37,14 @@
#include "sci/engine/vm.h"
#include "sci/graphics/cache.h"
#include "sci/graphics/coordadjuster.h"
+#include "sci/graphics/compare.h"
#include "sci/graphics/font.h"
#include "sci/graphics/view.h"
#include "sci/graphics/screen.h"
#include "sci/graphics/paint32.h"
#include "sci/graphics/palette.h"
#include "sci/graphics/picture.h"
+#include "sci/graphics/text32.h"
#include "sci/graphics/frameout.h"
#include "sci/video/robot_decoder.h"
@@ -89,6 +91,7 @@ void GfxFrameout::kernelAddPlane(reg_t object) {
newPlane.priority = readSelectorValue(_segMan, object, SELECTOR(priority));
newPlane.lastPriority = 0xFFFF; // hidden
newPlane.planeOffsetX = 0;
+ newPlane.planeOffsetY = 0;
newPlane.pictureId = 0xFFFF;
newPlane.planePictureMirrored = false;
newPlane.planeBack = 0;
@@ -131,9 +134,14 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) {
} else {
it->planeOffsetX = 0;
}
-
- if (it->planeRect.top < 0)
+
+ if (it->planeRect.top < 0) {
+ it->planeOffsetY = -it->planeRect.top;
it->planeRect.top = 0;
+ } else {
+ it->planeOffsetY = 0;
+ }
+
// We get bad plane-bottom in sq6
if (it->planeRect.right > _screen->getWidth())
it->planeRect.right = _screen->getWidth();
@@ -169,10 +177,6 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) {
error("kUpdatePlane called on plane that wasn't added before");
}
-void GfxFrameout::kernelRepaintPlane(reg_t object) {
- // TODO
-}
-
void GfxFrameout::kernelDeletePlane(reg_t object) {
deletePlanePictures(object);
for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) {
@@ -197,12 +201,13 @@ void GfxFrameout::kernelDeletePlane(reg_t object) {
}
}
-void GfxFrameout::addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 startX) {
+void GfxFrameout::addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 startX, uint16 startY) {
PlanePictureEntry newPicture;
newPicture.object = object;
newPicture.pictureId = pictureId;
newPicture.picture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, pictureId, false);
newPicture.startX = startX;
+ newPicture.startY = startY;
newPicture.pictureCels = 0;
_planePictures.push_back(newPicture);
}
@@ -237,36 +242,45 @@ void GfxFrameout::kernelUpdateScreenItem(reg_t object) {
if (!_segMan->isObject(object))
return;
- for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
- FrameoutEntry *itemEntry = *listIterator;
-
- if (itemEntry->object == object) {
- itemEntry->viewId = readSelectorValue(_segMan, object, SELECTOR(view));
- itemEntry->loopNo = readSelectorValue(_segMan, object, SELECTOR(loop));
- itemEntry->celNo = readSelectorValue(_segMan, object, SELECTOR(cel));
- itemEntry->x = readSelectorValue(_segMan, object, SELECTOR(x));
- itemEntry->y = readSelectorValue(_segMan, object, SELECTOR(y));
- itemEntry->z = readSelectorValue(_segMan, object, SELECTOR(z));
- itemEntry->priority = readSelectorValue(_segMan, object, SELECTOR(priority));
- if (readSelectorValue(_segMan, object, SELECTOR(fixPriority)) == 0)
- itemEntry->priority = itemEntry->y;
-
- itemEntry->signal = readSelectorValue(_segMan, object, SELECTOR(signal));
- itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX));
- itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY));
- return;
- }
+ FrameoutEntry *itemEntry = findScreenItem(object);
+ if (!itemEntry) {
+ warning("kernelUpdateScreenItem: invalid object %04x:%04x", PRINT_REG(object));
+ return;
}
+
+ itemEntry->viewId = readSelectorValue(_segMan, object, SELECTOR(view));
+ itemEntry->loopNo = readSelectorValue(_segMan, object, SELECTOR(loop));
+ itemEntry->celNo = readSelectorValue(_segMan, object, SELECTOR(cel));
+ itemEntry->x = readSelectorValue(_segMan, object, SELECTOR(x));
+ itemEntry->y = readSelectorValue(_segMan, object, SELECTOR(y));
+ itemEntry->z = readSelectorValue(_segMan, object, SELECTOR(z));
+ itemEntry->priority = readSelectorValue(_segMan, object, SELECTOR(priority));
+ if (readSelectorValue(_segMan, object, SELECTOR(fixPriority)) == 0)
+ itemEntry->priority = itemEntry->y;
+
+ itemEntry->signal = readSelectorValue(_segMan, object, SELECTOR(signal));
+ itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX));
+ itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY));
}
void GfxFrameout::kernelDeleteScreenItem(reg_t object) {
+ FrameoutEntry *itemEntry = findScreenItem(object);
+ if (!itemEntry) {
+ warning("kernelDeleteScreenItem: invalid object %04x:%04x", PRINT_REG(object));
+ return;
+ }
+
+ _screenItems.remove(itemEntry);
+}
+
+FrameoutEntry *GfxFrameout::findScreenItem(reg_t object) {
for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
FrameoutEntry *itemEntry = *listIterator;
- if (itemEntry->object == object) {
- _screenItems.remove(itemEntry);
- return;
- }
+ if (itemEntry->object == object)
+ return itemEntry;
}
+
+ return NULL;
}
int16 GfxFrameout::kernelGetHighPlanePri() {
@@ -274,9 +288,8 @@ int16 GfxFrameout::kernelGetHighPlanePri() {
return readSelectorValue(g_sci->getEngineState()->_segMan, _planes.back().object, SELECTOR(priority));
}
-// TODO: No idea yet how to implement this
-void GfxFrameout::kernelAddPicAt(reg_t planeObj, int16 forWidth, GuiResourceId pictureId) {
- addPlanePicture(planeObj, pictureId, forWidth);
+void GfxFrameout::kernelAddPicAt(reg_t planeObj, GuiResourceId pictureId, int16 pictureX, int16 pictureY) {
+ addPlanePicture(planeObj, pictureId, pictureX, pictureY);
}
bool sortHelper(const FrameoutEntry* entry1, const FrameoutEntry* entry2) {
@@ -316,44 +329,6 @@ void GfxFrameout::sortPlanes() {
Common::sort(_planes.begin(), _planes.end(), planeSortHelper);
}
-static int16 GetLongest(const char *text, int16 maxWidth, GfxFont *font) {
- uint16 curChar = 0;
- int16 maxChars = 0, curCharCount = 0;
- uint16 width = 0;
-
- while (width <= maxWidth) {
- curChar = (*(const byte *)text++);
-
- switch (curChar) {
- // We need to add 0xD, 0xA and 0xD 0xA to curCharCount and then exit
- // which means, we split text like
- // 'Mature, experienced software analyst available.' 0xD 0xA
- // 'Bug installation a proven speciality. "No version too clean."' (normal game text, this is from lsl2)
- // and 0xA '-------' 0xA (which is the official sierra subtitle separator)
- // Sierra did it the same way.
- case 0xD:
- // Check, if 0xA is following, if so include it as well
- if ((*(const unsigned char *)text) == 0xA)
- curCharCount++;
- // it's meant to pass through here
- case 0xA:
- curCharCount++;
- // and it's also meant to pass through here
- case 0:
- return curCharCount;
- case ' ':
- maxChars = curCharCount; // return count up to (but not including) breaking space
- break;
- }
- if (width + font->getCharWidth(curChar) > maxWidth)
- break;
- width += font->getCharWidth(curChar);
- curCharCount++;
- }
-
- return maxChars;
-}
-
void GfxFrameout::kernelFrameout() {
if (g_sci->_robotDecoder->isVideoLoaded()) {
bool skipVideo = false;
@@ -405,7 +380,10 @@ void GfxFrameout::kernelFrameout() {
continue;
}
- if (it->planeBack)
+ // There is a race condition lurking in SQ6, which causes the game to hang in the intro, when teleporting to Polysorbate LX.
+ // Since I first wrote the patch, the race has stopped occurring for me though.
+ // I'll leave this for investigation later, when someone can reproduce.
+ if (it->pictureId == 0xffff)
_paint32->fillRect(it->planeRect, it->planeBack);
GuiResourceId planeMainPictureId = it->pictureId;
@@ -440,6 +418,7 @@ void GfxFrameout::kernelFrameout() {
picEntry->y = planePicture->getSci32celY(pictureCelNr);
picEntry->x = planePicture->getSci32celX(pictureCelNr);
picEntry->picStartX = pictureIt->startX;
+ picEntry->picStartY = pictureIt->startY;
picEntry->priority = planePicture->getSci32celPriority(pictureCelNr);
@@ -462,8 +441,9 @@ void GfxFrameout::kernelFrameout() {
itemEntry->y = ((itemEntry->y * _screen->getHeight()) / scriptsRunningHeight);
itemEntry->x = ((itemEntry->x * _screen->getWidth()) / scriptsRunningWidth);
itemEntry->picStartX = ((itemEntry->picStartX * _screen->getWidth()) / scriptsRunningWidth);
+ itemEntry->picStartY = ((itemEntry->picStartY * _screen->getHeight()) / scriptsRunningHeight);
- // Out of view
+ // Out of view horizontally (sanity checks)
int16 pictureCelStartX = itemEntry->picStartX + itemEntry->x;
int16 pictureCelEndX = pictureCelStartX + itemEntry->picture->getSci32celWidth(itemEntry->celNo);
int16 planeStartX = it->planeOffsetX;
@@ -473,6 +453,16 @@ void GfxFrameout::kernelFrameout() {
if (pictureCelStartX > planeEndX)
continue;
+ // Out of view vertically (sanity checks)
+ int16 pictureCelStartY = itemEntry->picStartY + itemEntry->y;
+ int16 pictureCelEndY = pictureCelStartY + itemEntry->picture->getSci32celHeight(itemEntry->celNo);
+ int16 planeStartY = it->planeOffsetY;
+ int16 planeEndY = planeStartY + it->planeRect.height();
+ if (pictureCelEndY < planeStartY)
+ continue;
+ if (pictureCelStartY > planeEndY)
+ continue;
+
int16 pictureOffsetX = it->planeOffsetX;
int16 pictureX = itemEntry->x;
if ((it->planeOffsetX) || (itemEntry->picStartX)) {
@@ -484,7 +474,18 @@ void GfxFrameout::kernelFrameout() {
}
}
- itemEntry->picture->drawSci32Vga(itemEntry->celNo, pictureX, itemEntry->y, pictureOffsetX, it->planePictureMirrored);
+ int16 pictureOffsetY = it->planeOffsetY;
+ int16 pictureY = itemEntry->y;
+ if ((it->planeOffsetY) || (itemEntry->picStartY)) {
+ if (it->planeOffsetY <= itemEntry->picStartY) {
+ pictureY += itemEntry->picStartY - it->planeOffsetY;
+ pictureOffsetY = 0;
+ } else {
+ pictureOffsetY = it->planeOffsetY - itemEntry->picStartY;
+ }
+ }
+
+ itemEntry->picture->drawSci32Vga(itemEntry->celNo, pictureX, itemEntry->y, pictureOffsetX, pictureOffsetY, it->planePictureMirrored);
// warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority);
} else if (itemEntry->viewId != 0xFFFF) {
@@ -492,7 +493,6 @@ void GfxFrameout::kernelFrameout() {
// warning("view %s %04x:%04x", _segMan->getObjectName(itemEntry->object), PRINT_REG(itemEntry->object));
-
if (view->isSci2Hires()) {
int16 dummyX = 0;
view->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x);
@@ -505,6 +505,7 @@ void GfxFrameout::kernelFrameout() {
// Adjust according to current scroll position
itemEntry->x -= it->planeOffsetX;
+ itemEntry->y -= it->planeOffsetY;
uint16 useInsetRect = readSelectorValue(_segMan, itemEntry->object, SELECTOR(useInsetRect));
if (useInsetRect) {
@@ -527,7 +528,7 @@ void GfxFrameout::kernelFrameout() {
Common::Rect nsRect = itemEntry->celRect;
// Translate back to actual coordinate within scrollable plane
- nsRect.translate(it->planeOffsetX, 0);
+ nsRect.translate(it->planeOffsetX, it->planeOffsetY);
if (view->isSci2Hires()) {
view->adjustBackUpscaledCoordinates(nsRect.top, nsRect.left);
@@ -539,10 +540,14 @@ void GfxFrameout::kernelFrameout() {
nsRect.right = (nsRect.right * scriptsRunningWidth) / _screen->getWidth();
}
- writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsLeft), nsRect.left);
- writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsTop), nsRect.top);
- writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsRight), nsRect.right);
- writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsBottom), nsRect.bottom);
+ if (g_sci->getGameId() == GID_PHANTASMAGORIA2) {
+ // HACK: Some (?) objects in Phantasmagoria 2 have no NS rect. Skip them for now.
+ // TODO: Remove once we figure out how Phantasmagoria 2 draws objects on screen.
+ if (lookupSelector(_segMan, itemEntry->object, SELECTOR(nsLeft), NULL, NULL) != kSelectorVariable)
+ continue;
+ }
+
+ g_sci->_gfxCompare->setNSRect(itemEntry->object, nsRect);
}
int16 screenHeight = _screen->getHeight();
@@ -578,62 +583,8 @@ void GfxFrameout::kernelFrameout() {
}
} else {
// Most likely a text entry
- // This draws text the "SCI0-SCI11" way. In SCI2, text is prerendered in kCreateTextBitmap
- // TODO: rewrite this the "SCI2" way (i.e. implement the text buffer to draw inside kCreateTextBitmap)
if (lookupSelector(_segMan, itemEntry->object, SELECTOR(text), NULL, NULL) == kSelectorVariable) {
- reg_t stringObject = readSelector(_segMan, itemEntry->object, SELECTOR(text));
-
- // The object in the text selector of the item can be either a raw string
- // or a Str object. In the latter case, we need to access the object's data
- // selector to get the raw string.
- if (_segMan->isHeapObject(stringObject))
- stringObject = readSelector(_segMan, stringObject, SELECTOR(data));
-
- Common::String text = _segMan->getString(stringObject);
- GfxFont *font = _cache->getFont(readSelectorValue(_segMan, itemEntry->object, SELECTOR(font)));
- bool dimmed = readSelectorValue(_segMan, itemEntry->object, SELECTOR(dimmed));
- uint16 foreColor = readSelectorValue(_segMan, itemEntry->object, SELECTOR(fore));
-
- itemEntry->y = ((itemEntry->y * _screen->getHeight()) / scriptsRunningHeight);
- itemEntry->x = ((itemEntry->x * _screen->getWidth()) / scriptsRunningWidth);
-
- uint16 startX = itemEntry->x + it->planeRect.left;
- uint16 curY = itemEntry->y + it->planeRect.top;
- const char *txt = text.c_str();
- // HACK. The plane sometimes doesn't contain the correct width. This
- // hack breaks the dialog options when speaking with Grace, but it's
- // the best we got up to now. This happens because of the unimplemented
- // kTextWidth function in SCI32.
- // TODO: Remove this once kTextWidth has been implemented.
- uint16 w = it->planeRect.width() >= 20 ? it->planeRect.width() : _screen->getWidth() - 10;
- int16 charCount;
-
- // Upscale the coordinates/width if the fonts are already upscaled
- if (_screen->fontIsUpscaled()) {
- startX = startX * _screen->getDisplayWidth() / _screen->getWidth();
- curY = curY * _screen->getDisplayHeight() / _screen->getHeight();
- w = w * _screen->getDisplayWidth() / _screen->getWidth();
- }
-
- while (*txt) {
- charCount = GetLongest(txt, w, font);
- if (charCount == 0)
- break;
-
- uint16 curX = startX;
-
- for (int i = 0; i < charCount; i++) {
- unsigned char curChar = txt[i];
- font->draw(curChar, curY, curX, foreColor, dimmed);
- curX += font->getCharWidth(curChar);
- }
-
- curY += font->getHeight();
- txt += charCount;
- while (*txt == ' ')
- txt++; // skip over breaking spaces
- }
-
+ g_sci->_gfxText32->drawTextBitmap(itemEntry->object);
}
}
}
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index 7e5b1a5006..160c343b05 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -32,6 +32,7 @@ struct PlaneEntry {
uint16 priority;
uint16 lastPriority;
int16 planeOffsetX;
+ int16 planeOffsetY;
GuiResourceId pictureId;
Common::Rect planeRect;
Common::Rect planeClipRect;
@@ -58,6 +59,7 @@ struct FrameoutEntry {
Common::Rect celRect;
GfxPicture *picture;
int16 picStartX;
+ int16 picStartY;
};
typedef Common::List<FrameoutEntry *> FrameoutList;
@@ -65,6 +67,7 @@ typedef Common::List<FrameoutEntry *> FrameoutList;
struct PlanePictureEntry {
reg_t object;
int16 startX;
+ int16 startY;
GuiResourceId pictureId;
GfxPicture *picture;
FrameoutEntry *pictureCels; // temporary
@@ -87,16 +90,16 @@ public:
void kernelAddPlane(reg_t object);
void kernelUpdatePlane(reg_t object);
- void kernelRepaintPlane(reg_t object);
void kernelDeletePlane(reg_t object);
void kernelAddScreenItem(reg_t object);
void kernelUpdateScreenItem(reg_t object);
void kernelDeleteScreenItem(reg_t object);
+ FrameoutEntry *findScreenItem(reg_t object);
int16 kernelGetHighPlanePri();
- void kernelAddPicAt(reg_t planeObj, int16 forWidth, GuiResourceId pictureId);
+ void kernelAddPicAt(reg_t planeObj, GuiResourceId pictureId, int16 pictureX, int16 pictureY);
void kernelFrameout();
- void addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 startX);
+ void addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 startX, uint16 startY = 0);
void deletePlanePictures(reg_t object);
void clear();
diff --git a/engines/sci/graphics/paint.h b/engines/sci/graphics/paint.h
index efeaa38875..27f7e428b6 100644
--- a/engines/sci/graphics/paint.h
+++ b/engines/sci/graphics/paint.h
@@ -23,8 +23,6 @@
#ifndef SCI_GRAPHICS_PAINT_H
#define SCI_GRAPHICS_PAINT_H
-#include "common/hashmap.h"
-
namespace Sci {
class GfxPaint {
diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp
index 75fef0a3ec..23177dfc7b 100644
--- a/engines/sci/graphics/paint16.cpp
+++ b/engines/sci/graphics/paint16.cpp
@@ -467,9 +467,9 @@ void GfxPaint16::kernelGraphRedrawBox(Common::Rect rect) {
#define SCI_DISPLAY_WIDTH 106
#define SCI_DISPLAY_SAVEUNDER 107
#define SCI_DISPLAY_RESTOREUNDER 108
-#define SCI_DISPLAY_DUMMY1 114 // used in longbow demo/qfg1 ega demo, not supported in sierra sci - no parameters
-#define SCI_DISPLAY_DUMMY2 115 // used in longbow demo, not supported in sierra sci - has 1 parameter
-#define SCI_DISPLAY_DUMMY3 117 // used in qfg1 ega demo, not supported in sierra sci - no parameters
+#define SCI_DISPLAY_DUMMY1 114
+#define SCI_DISPLAY_DUMMY2 115
+#define SCI_DISPLAY_DUMMY3 117
#define SCI_DISPLAY_DONTSHOWBITS 121
reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) {
@@ -539,26 +539,29 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) {
bRedraw = 0;
break;
- // 2 Dummy functions, longbow-demo is using those several times but sierra sci doesn't support them at all
- // The Quest for Glory 1 EGA demo also calls kDisplay(114) and kDisplay(117)
- case SCI_DISPLAY_DUMMY1:
- case SCI_DISPLAY_DUMMY2:
- case SCI_DISPLAY_DUMMY3:
- if (!g_sci->isDemo() || (g_sci->getGameId() != GID_LONGBOW && g_sci->getGameId() != GID_QFG1))
+ // The following three dummy calls are not supported by the Sierra SCI
+ // interpreter, but are erroneously called in some game scripts.
+ case SCI_DISPLAY_DUMMY1: // Longbow demo (all rooms) and QFG1 EGA demo (room 11)
+ case SCI_DISPLAY_DUMMY2: // Longbow demo (all rooms)
+ case SCI_DISPLAY_DUMMY3: // QFG1 EGA demo (room 11) and PQ2 (room 23)
+ if (!(g_sci->getGameId() == GID_LONGBOW && g_sci->isDemo()) &&
+ !(g_sci->getGameId() == GID_QFG1 && g_sci->isDemo()) &&
+ !(g_sci->getGameId() == GID_PQ2))
error("Unknown kDisplay argument %d", displayArg.offset);
+
if (displayArg.offset == SCI_DISPLAY_DUMMY2) {
- if (argc) {
- argc--; argv++;
- } else {
+ if (!argc)
error("No parameter left for kDisplay(115)");
- }
+ argc--; argv++;
}
break;
default:
SciTrackOriginReply originReply;
SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, kDisplay_workarounds, &originReply);
if (solution.type == WORKAROUND_NONE)
- error("Unknown kDisplay argument (%04x:%04x) from method %s::%s (script %d, localCall %x)", PRINT_REG(displayArg), originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset);
+ error("Unknown kDisplay argument (%04x:%04x) from method %s::%s (script %d, localCall %x)",
+ PRINT_REG(displayArg), originReply.objectName.c_str(), originReply.methodName.c_str(),
+ originReply.scriptNr, originReply.localCallOffset);
assert(solution.type == WORKAROUND_IGNORE);
break;
}
diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h
index 31916599ba..46df203200 100644
--- a/engines/sci/graphics/paint16.h
+++ b/engines/sci/graphics/paint16.h
@@ -25,8 +25,6 @@
#include "sci/graphics/paint.h"
-#include "common/hashmap.h"
-
namespace Sci {
class GfxPorts;
diff --git a/engines/sci/graphics/paint32.h b/engines/sci/graphics/paint32.h
index dd4246c507..66b31de282 100644
--- a/engines/sci/graphics/paint32.h
+++ b/engines/sci/graphics/paint32.h
@@ -25,8 +25,6 @@
#include "sci/graphics/paint.h"
-#include "common/hashmap.h"
-
namespace Sci {
class GfxPorts;
diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp
index c5a3545701..b52af38675 100644
--- a/engines/sci/graphics/palette.cpp
+++ b/engines/sci/graphics/palette.cpp
@@ -37,7 +37,7 @@
namespace Sci {
-GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMerging)
+GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen)
: _resMan(resMan), _screen(screen) {
int16 color;
@@ -65,7 +65,14 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMergi
// the real merging done in earlier games. If we use the copying over, we
// will get issues because some views have marked all colors as being used
// and those will overwrite the current palette in that case
- _useMerging = useMerging;
+ if (getSciVersion() < SCI_VERSION_1_1)
+ _useMerging = true;
+ else if (getSciVersion() == SCI_VERSION_1_1)
+ // there are some games that use inbetween SCI1.1 interpreter, so we have
+ // to detect if the current game is merging or copying
+ _useMerging = _resMan->detectPaletteMergingSci11();
+ else // SCI32
+ _useMerging = false;
palVaryInit();
@@ -114,7 +121,7 @@ bool GfxPalette::isMerging() {
void GfxPalette::setDefault() {
if (_resMan->getViewType() == kViewEga)
setEGA();
- else if (_resMan->getViewType() == kViewAmiga)
+ else if (_resMan->getViewType() == kViewAmiga || _resMan->getViewType() == kViewAmiga64)
setAmiga();
else
kernelSetFromResource(999, true);
@@ -206,6 +213,14 @@ bool GfxPalette::setAmiga() {
_sysPalette.colors[curColor].r = (byte1 & 0x0F) * 0x11;
_sysPalette.colors[curColor].g = ((byte2 & 0xF0) >> 4) * 0x11;
_sysPalette.colors[curColor].b = (byte2 & 0x0F) * 0x11;
+
+ if (_totalScreenColors == 64) {
+ // Set the associated color from the Amiga halfbrite colors
+ _sysPalette.colors[curColor + 32].used = 1;
+ _sysPalette.colors[curColor + 32].r = _sysPalette.colors[curColor].r >> 1;
+ _sysPalette.colors[curColor + 32].g = _sysPalette.colors[curColor].g >> 1;
+ _sysPalette.colors[curColor + 32].b = _sysPalette.colors[curColor].b >> 1;
+ }
}
// Directly set the palette, because setOnScreen() wont do a thing for amiga
@@ -226,6 +241,13 @@ void GfxPalette::modifyAmigaPalette(byte *data) {
_sysPalette.colors[curColor].r = (byte1 & 0x0F) * 0x11;
_sysPalette.colors[curColor].g = ((byte2 & 0xF0) >> 4) * 0x11;
_sysPalette.colors[curColor].b = (byte2 & 0x0F) * 0x11;
+
+ if (_totalScreenColors == 64) {
+ // Set the associated color from the Amiga halfbrite colors
+ _sysPalette.colors[curColor + 32].r = _sysPalette.colors[curColor].r >> 1;
+ _sysPalette.colors[curColor + 32].g = _sysPalette.colors[curColor].g >> 1;
+ _sysPalette.colors[curColor + 32].b = _sysPalette.colors[curColor].b >> 1;
+ }
}
copySysPaletteToScreen();
@@ -312,7 +334,9 @@ bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) {
for (int i = 1; i < 255; i++) {
if (newPalette->colors[i].used) {
- if ((newPalette->colors[i].r != destPalette->colors[i].r) || (newPalette->colors[i].g != destPalette->colors[i].g) || (newPalette->colors[i].b != destPalette->colors[i].b)) {
+ if ((newPalette->colors[i].r != destPalette->colors[i].r) ||
+ (newPalette->colors[i].g != destPalette->colors[i].g) ||
+ (newPalette->colors[i].b != destPalette->colors[i].b)) {
destPalette->colors[i].r = newPalette->colors[i].r;
destPalette->colors[i].g = newPalette->colors[i].g;
destPalette->colors[i].b = newPalette->colors[i].b;
@@ -339,7 +363,9 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) {
// forced palette merging or dest color is not used yet
if (force || (!_sysPalette.colors[i].used)) {
_sysPalette.colors[i].used = newPalette->colors[i].used;
- if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) {
+ if ((newPalette->colors[i].r != _sysPalette.colors[i].r) ||
+ (newPalette->colors[i].g != _sysPalette.colors[i].g) ||
+ (newPalette->colors[i].b != _sysPalette.colors[i].b)) {
_sysPalette.colors[i].r = newPalette->colors[i].r;
_sysPalette.colors[i].g = newPalette->colors[i].g;
_sysPalette.colors[i].b = newPalette->colors[i].b;
@@ -352,7 +378,9 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) {
// is the same color already at the same position? -> match it directly w/o lookup
// this fixes games like lsl1demo/sq5 where the same rgb color exists multiple times and where we would
// otherwise match the wrong one (which would result into the pixels affected (or not) by palette changes)
- if ((_sysPalette.colors[i].r == newPalette->colors[i].r) && (_sysPalette.colors[i].g == newPalette->colors[i].g) && (_sysPalette.colors[i].b == newPalette->colors[i].b)) {
+ if ((_sysPalette.colors[i].r == newPalette->colors[i].r) &&
+ (_sysPalette.colors[i].g == newPalette->colors[i].g) &&
+ (_sysPalette.colors[i].b == newPalette->colors[i].b)) {
newPalette->mapping[i] = i;
continue;
}
@@ -683,7 +711,7 @@ bool GfxPalette::palVaryLoadTargetPalette(GuiResourceId resourceId) {
void GfxPalette::palVaryInstallTimer() {
int16 ticks = _palVaryTicks > 0 ? _palVaryTicks : 1;
// Call signal increase every [ticks]
- g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this);
+ g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this, "sciPalette");
}
void GfxPalette::palVaryRemoveTimer() {
diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h
index 243420cc47..a9ea1c32de 100644
--- a/engines/sci/graphics/palette.h
+++ b/engines/sci/graphics/palette.h
@@ -36,7 +36,7 @@ class GfxScreen;
*/
class GfxPalette : public Common::Serializable {
public:
- GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMerging);
+ GfxPalette(ResourceManager *resMan, GfxScreen *screen);
~GfxPalette();
bool isMerging();
diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp
index ecb54e89e8..bb326b1d2f 100644
--- a/engines/sci/graphics/picture.cpp
+++ b/engines/sci/graphics/picture.cpp
@@ -77,7 +77,7 @@ void GfxPicture::draw(int16 animationNr, bool mirroredFlag, bool addToFlag, int1
#ifdef ENABLE_SCI32
case 0x0e: // SCI32 VGA picture
_resourceType = SCI_PICTURE_TYPE_SCI32;
- //drawSci32Vga();
+ drawSci32Vga(0, 0, 0, 0, 0, false);
break;
#endif
default:
@@ -132,7 +132,7 @@ void GfxPicture::drawSci11Vga() {
_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);
+ drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0, 0);
}
// process vector data
@@ -148,18 +148,18 @@ int16 GfxPicture::getSci32celCount() {
return inbuffer[2];
}
-int16 GfxPicture::getSci32celY(int16 celNo) {
+int16 GfxPicture::getSci32celX(int16 celNo) {
byte *inbuffer = _resource->data;
int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
int cel_headerPos = header_size + 42 * celNo;
- return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 40);
+ return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 38);
}
-int16 GfxPicture::getSci32celX(int16 celNo) {
+int16 GfxPicture::getSci32celY(int16 celNo) {
byte *inbuffer = _resource->data;
int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
int cel_headerPos = header_size + 42 * celNo;
- return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 38);
+ return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 40);
}
int16 GfxPicture::getSci32celWidth(int16 celNo) {
@@ -169,6 +169,14 @@ int16 GfxPicture::getSci32celWidth(int16 celNo) {
return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 0);
}
+int16 GfxPicture::getSci32celHeight(int16 celNo) {
+ byte *inbuffer = _resource->data;
+ int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
+ int cel_headerPos = header_size + 42 * celNo;
+ return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 2);
+}
+
+
int16 GfxPicture::getSci32celPriority(int16 celNo) {
byte *inbuffer = _resource->data;
int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
@@ -176,7 +184,7 @@ int16 GfxPicture::getSci32celPriority(int16 celNo) {
return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 36);
}
-void GfxPicture::drawSci32Vga(int16 celNo, int16 drawX, int16 drawY, int16 pictureX, bool mirrored) {
+void GfxPicture::drawSci32Vga(int16 celNo, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY, bool mirrored) {
byte *inbuffer = _resource->data;
int size = _resource->size;
int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
@@ -216,14 +224,14 @@ void GfxPicture::drawSci32Vga(int16 celNo, int16 drawX, int16 drawY, int16 pictu
cel_RlePos = READ_SCI11ENDIAN_UINT32(inbuffer + cel_headerPos + 24);
cel_LiteralPos = READ_SCI11ENDIAN_UINT32(inbuffer + cel_headerPos + 28);
- drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, drawX, drawY, pictureX);
+ drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, drawX, drawY, pictureX, pictureY);
cel_headerPos += 42;
}
#endif
extern void unpackCelData(byte *inBuffer, byte *celBitmap, byte clearColor, int pixelCount, int rlePos, int literalPos, ViewType viewType, uint16 width, bool isMacSci11ViewData);
-void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX) {
+void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY) {
byte *celBitmap = NULL;
byte *ptr = NULL;
byte *headerPtr = inbuffer + headerPos;
@@ -300,10 +308,11 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
Common::Rect displayArea = _coordAdjuster->pictureGetDisplayArea();
+ // Horizontal clipping
uint16 skipCelBitmapPixels = 0;
int16 displayWidth = width;
if (pictureX) {
- // scroll position for picture active, we need to adjust drawX accordingly
+ // horizontal scroll position for picture active, we need to adjust drawX accordingly
drawX -= pictureX;
if (drawX < 0) {
skipCelBitmapPixels = -drawX;
@@ -312,7 +321,21 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
}
}
- if (displayWidth > 0) {
+ // Vertical clipping
+ uint16 skipCelBitmapLines = 0;
+ int16 displayHeight = height;
+ if (pictureY) {
+ // vertical scroll position for picture active, we need to adjust drawY accordingly
+ // TODO: Finish this
+ /*drawY -= pictureY;
+ if (drawY < 0) {
+ skipCelBitmapLines = -drawY;
+ displayHeight -= skipCelBitmapLines;
+ drawY = 0;
+ }*/
+ }
+
+ if (displayWidth > 0 && displayHeight > 0) {
y = displayArea.top + drawY;
lastY = MIN<int16>(height + y, displayArea.bottom);
leftX = displayArea.left + drawX;
@@ -334,6 +357,7 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
ptr = celBitmap;
ptr += skipCelBitmapPixels;
+ ptr += skipCelBitmapLines * width;
if (!_mirroredFlag) {
// Draw bitmap to screen
x = leftX;
@@ -714,7 +738,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
vectorGetAbsCoordsNoMirror(data, curPos, x, y);
size = READ_LE_UINT16(data + curPos); curPos += 2;
_priority = pic_priority; // set global priority so the cel gets drawn using current priority as well
- drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0);
+ drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0, 0);
curPos += size;
break;
case PIC_OPX_EGA_SET_PRIORITY_TABLE:
@@ -740,7 +764,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
// Left-Over VGA palette, we simply ignore it
curPos += 256 + 4 + 1024;
} else {
- // Setting half of the amiga palette
+ // Setting half of the Amiga palette
_palette->modifyAmigaPalette(&data[curPos]);
curPos += 32;
}
@@ -757,7 +781,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
vectorGetAbsCoordsNoMirror(data, curPos, x, y);
size = READ_LE_UINT16(data + curPos); curPos += 2;
_priority = pic_priority; // set global priority so the cel gets drawn using current priority as well
- drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0);
+ drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0, 0);
curPos += size;
break;
case PIC_OPX_VGA_PRIORITY_TABLE_EQDIST:
diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h
index 78623d5e09..4f075a6226 100644
--- a/engines/sci/graphics/picture.h
+++ b/engines/sci/graphics/picture.h
@@ -56,15 +56,16 @@ public:
int16 getSci32celY(int16 celNo);
int16 getSci32celX(int16 celNo);
int16 getSci32celWidth(int16 celNo);
+ int16 getSci32celHeight(int16 celNo);
int16 getSci32celPriority(int16 celNo);
- void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, int16 pictureX, bool mirrored);
+ void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, int16 pictureX, int16 pictureY, bool mirrored);
#endif
private:
void initData(GuiResourceId resourceId);
void reset();
void drawSci11Vga();
- void drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX);
+ void drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY);
void drawVectorData(byte *data, int size);
bool vectorIsNonOpcode(byte pixel);
void vectorGetAbsCoords(byte *data, int &curPos, int16 &x, int16 &y);
diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp
index 4ab0b9719f..6469bc0cb3 100644
--- a/engines/sci/graphics/screen.cpp
+++ b/engines/sci/graphics/screen.cpp
@@ -20,9 +20,9 @@
*
*/
-#include "common/timer.h"
#include "common/util.h"
#include "common/system.h"
+#include "common/timer.h"
#include "graphics/surface.h"
#include "engines/util.h"
@@ -338,7 +338,7 @@ void GfxScreen::drawLine(Common::Point startPoint, Common::Point endPoint, byte
void GfxScreen::putKanjiChar(Graphics::FontSJIS *commonFont, int16 x, int16 y, uint16 chr, byte color) {
byte *displayPtr = _displayScreen + y * _displayWidth * 2 + x * 2;
// we don't use outline, so color 0 is actually not used
- commonFont->drawChar(displayPtr, chr, _displayWidth, 1, color, 0);
+ commonFont->drawChar(displayPtr, chr, _displayWidth, 1, color, 0, -1, -1);
}
byte GfxScreen::getVisual(int x, int y) {
diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp
index c2f71a0e54..84547d9828 100644
--- a/engines/sci/graphics/text16.cpp
+++ b/engines/sci/graphics/text16.cpp
@@ -100,7 +100,7 @@ int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int1
// cX -> sets textColor to _textColors[X-1]
curCode = textCode[0];
curCodeParm = textCode[1];
- if (isdigit(curCodeParm)) {
+ if (isdigit(static_cast<unsigned char>(curCodeParm))) {
curCodeParm -= '0';
} else {
curCodeParm = -1;
diff --git a/engines/sci/graphics/text32.cpp b/engines/sci/graphics/text32.cpp
new file mode 100644
index 0000000000..029030165d
--- /dev/null
+++ b/engines/sci/graphics/text32.cpp
@@ -0,0 +1,283 @@
+/* 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: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/engines/sci/graphics/text16.cpp $
+ * $Id: text16.cpp 55178 2011-01-08 23:16:44Z thebluegr $
+ *
+ */
+
+#include "common/util.h"
+#include "common/stack.h"
+#include "graphics/primitives.h"
+
+#include "sci/sci.h"
+#include "sci/engine/kernel.h"
+#include "sci/engine/selector.h"
+#include "sci/engine/state.h"
+#include "sci/graphics/cache.h"
+#include "sci/graphics/compare.h"
+#include "sci/graphics/font.h"
+#include "sci/graphics/screen.h"
+#include "sci/graphics/text32.h"
+
+namespace Sci {
+
+#define BITMAP_HEADER_SIZE 46
+
+GfxText32::GfxText32(SegManager *segMan, GfxCache *fonts, GfxScreen *screen)
+ : _segMan(segMan), _cache(fonts), _screen(screen) {
+}
+
+GfxText32::~GfxText32() {
+}
+
+reg_t GfxText32::createTextBitmap(reg_t textObject, uint16 maxWidth, uint16 maxHeight) {
+ reg_t stringObject = readSelector(_segMan, textObject, SELECTOR(text));
+
+ // The object in the text selector of the item can be either a raw string
+ // or a Str object. In the latter case, we need to access the object's data
+ // selector to get the raw string.
+ if (_segMan->isHeapObject(stringObject))
+ stringObject = readSelector(_segMan, stringObject, SELECTOR(data));
+
+ Common::String text = _segMan->getString(stringObject);
+ GfxFont *font = _cache->getFont(readSelectorValue(_segMan, textObject, SELECTOR(font)));
+ bool dimmed = readSelectorValue(_segMan, textObject, SELECTOR(dimmed));
+ uint16 foreColor = readSelectorValue(_segMan, textObject, SELECTOR(fore));
+
+ Common::Rect planeRect = getPlaneRect(textObject);
+ uint16 width = planeRect.width() + 1;
+ uint16 height = planeRect.height() + 1;
+
+ // Limit rectangle dimensions, if requested
+ if (maxWidth > 0)
+ width = maxWidth;
+ if (maxHeight > 0)
+ height = maxHeight;
+
+ // Upscale the coordinates/width if the fonts are already upscaled
+ if (_screen->fontIsUpscaled()) {
+ width = width * _screen->getDisplayWidth() / _screen->getWidth();
+ height = height * _screen->getDisplayHeight() / _screen->getHeight();
+ }
+
+ int entrySize = width * height + BITMAP_HEADER_SIZE;
+ reg_t memoryId = _segMan->allocateHunkEntry("TextBitmap()", entrySize);
+ writeSelector(_segMan, textObject, SELECTOR(bitmap), memoryId);
+ byte *memoryPtr = _segMan->getHunkPointer(memoryId);
+ memset(memoryPtr, 0, entrySize);
+ byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
+
+ int16 charCount = 0;
+ uint16 curX = 0, curY = 0;
+ const char *txt = text.c_str();
+
+ while (*txt) {
+ charCount = GetLongest(txt, width, font);
+ if (charCount == 0)
+ break;
+
+ for (int i = 0; i < charCount; i++) {
+ unsigned char curChar = txt[i];
+ font->drawToBuffer(curChar, curY, curX, foreColor, dimmed, bitmap, width, height);
+ curX += font->getCharWidth(curChar);
+ }
+
+ curX = 0;
+ curY += font->getHeight();
+ txt += charCount;
+ while (*txt == ' ')
+ txt++; // skip over breaking spaces
+ }
+
+ return memoryId;
+}
+
+void GfxText32::disposeTextBitmap(reg_t hunkId) {
+ _segMan->freeHunkEntry(hunkId);
+}
+
+void GfxText32::drawTextBitmap(reg_t textObject) {
+ reg_t hunkId = readSelector(_segMan, textObject, SELECTOR(bitmap));
+ // Sanity check: Check if the hunk is set. If not, either the game scripts
+ // didn't set it, or an old saved game has been loaded, where it wasn't set.
+ if (hunkId.isNull())
+ return;
+
+ byte *memoryPtr = _segMan->getHunkPointer(hunkId);
+
+ if (!memoryPtr)
+ error("Attempt to draw an invalid text bitmap");
+
+ byte *surface = memoryPtr + BITMAP_HEADER_SIZE;
+
+ int curByte = 0;
+ Common::Rect nsRect = g_sci->_gfxCompare->getNSRect(textObject);
+ Common::Rect planeRect = getPlaneRect(textObject);
+ uint16 x = readSelectorValue(_segMan, textObject, SELECTOR(x));
+ uint16 y = readSelectorValue(_segMan, textObject, SELECTOR(y));
+ uint16 textX = planeRect.left + x;
+ uint16 textY = planeRect.top + y;
+ uint16 width = nsRect.width() + 1;
+ uint16 height = nsRect.height() + 1;
+
+ // Upscale the coordinates/width if the fonts are already upscaled
+ if (_screen->fontIsUpscaled()) {
+ textX = textX * _screen->getDisplayWidth() / _screen->getWidth();
+ textY = textY * _screen->getDisplayHeight() / _screen->getHeight();
+ width = width * _screen->getDisplayWidth() / _screen->getWidth();
+ height = height * _screen->getDisplayHeight() / _screen->getHeight();
+ }
+
+ for (int curY = 0; curY < height; curY++) {
+ for (int curX = 0; curX < width; curX++) {
+ byte pixel = surface[curByte++];
+ if (pixel)
+ _screen->putFontPixel(textY, curX + textX, curY, pixel);
+ }
+ }
+}
+
+Common::Rect GfxText32::getPlaneRect(reg_t textObject) {
+ Common::Rect planeRect(0, 0, _screen->getWidth(), _screen->getHeight());
+
+ reg_t planeObject = readSelector(_segMan, textObject, SELECTOR(plane));
+ if (!planeObject.isNull()) {
+ planeRect.top = readSelectorValue(_segMan, planeObject, SELECTOR(top));
+ planeRect.left = readSelectorValue(_segMan, planeObject, SELECTOR(left));
+ planeRect.bottom = readSelectorValue(_segMan, planeObject, SELECTOR(bottom));
+ planeRect.right = readSelectorValue(_segMan, planeObject, SELECTOR(right));
+ }
+
+ return planeRect;
+}
+
+int16 GfxText32::GetLongest(const char *text, int16 maxWidth, GfxFont *font) {
+ uint16 curChar = 0;
+ int16 maxChars = 0, curCharCount = 0;
+ uint16 width = 0;
+
+ while (width <= maxWidth) {
+ curChar = (*(const byte *)text++);
+
+ switch (curChar) {
+ // We need to add 0xD, 0xA and 0xD 0xA to curCharCount and then exit
+ // which means, we split text like
+ // 'Mature, experienced software analyst available.' 0xD 0xA
+ // 'Bug installation a proven speciality. "No version too clean."' (normal game text, this is from lsl2)
+ // and 0xA '-------' 0xA (which is the official sierra subtitle separator)
+ // Sierra did it the same way.
+ case 0xD:
+ // Check, if 0xA is following, if so include it as well
+ if ((*(const unsigned char *)text) == 0xA)
+ curCharCount++;
+ // it's meant to pass through here
+ case 0xA:
+ curCharCount++;
+ // and it's also meant to pass through here
+ case 0:
+ return curCharCount;
+ case ' ':
+ maxChars = curCharCount; // return count up to (but not including) breaking space
+ break;
+ }
+ if (width + font->getCharWidth(curChar) > maxWidth)
+ break;
+ width += font->getCharWidth(curChar);
+ curCharCount++;
+ }
+
+ return maxChars;
+}
+
+void GfxText32::kernelTextSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) {
+ Common::Rect rect(0, 0, 0, 0);
+ Size(rect, text, font, maxWidth);
+ *textWidth = rect.width();
+ *textHeight = rect.height();
+}
+
+void GfxText32::StringWidth(const char *str, GuiResourceId fontId, int16 &textWidth, int16 &textHeight) {
+ Width(str, 0, (int16)strlen(str), fontId, textWidth, textHeight, true);
+}
+
+void GfxText32::Width(const char *text, int16 from, int16 len, GuiResourceId fontId, int16 &textWidth, int16 &textHeight, bool restoreFont) {
+ uint16 curChar;
+ textWidth = 0; textHeight = 0;
+
+ GfxFont *font = _cache->getFont(fontId);
+
+ if (font) {
+ text += from;
+ while (len--) {
+ curChar = (*(const byte *)text++);
+ switch (curChar) {
+ case 0x0A:
+ case 0x0D:
+ case 0x9781: // this one is used by SQ4/japanese as line break as well
+ textHeight = MAX<int16> (textHeight, font->getHeight());
+ break;
+ case 0x7C:
+ warning("Code processing isn't implemented in SCI32");
+ break;
+ default:
+ textHeight = MAX<int16> (textHeight, font->getHeight());
+ textWidth += font->getCharWidth(curChar);
+ break;
+ }
+ }
+ }
+}
+
+int16 GfxText32::Size(Common::Rect &rect, const char *text, GuiResourceId fontId, int16 maxWidth) {
+ int16 charCount;
+ int16 maxTextWidth = 0, textWidth;
+ int16 totalHeight = 0, textHeight;
+
+ rect.top = rect.left = 0;
+ GfxFont *font = _cache->getFont(fontId);
+
+ if (maxWidth < 0) { // force output as single line
+ StringWidth(text, fontId, textWidth, textHeight);
+ rect.bottom = textHeight;
+ rect.right = textWidth;
+ } else {
+ // rect.right=found widest line with RTextWidth and GetLongest
+ // rect.bottom=num. lines * GetPointSize
+ rect.right = (maxWidth ? maxWidth : 192);
+ const char *curPos = text;
+ while (*curPos) {
+ charCount = GetLongest(curPos, rect.right, font);
+ if (charCount == 0)
+ break;
+ Width(curPos, 0, charCount, fontId, textWidth, textHeight, false);
+ maxTextWidth = MAX(textWidth, maxTextWidth);
+ totalHeight += textHeight;
+ curPos += charCount;
+ while (*curPos == ' ')
+ curPos++; // skip over breaking spaces
+ }
+ rect.bottom = totalHeight;
+ rect.right = maxWidth ? maxWidth : MIN(rect.right, maxTextWidth);
+ }
+ return rect.right;
+}
+
+} // End of namespace Sci
diff --git a/engines/sci/graphics/text32.h b/engines/sci/graphics/text32.h
new file mode 100644
index 0000000000..dfcbf63ccf
--- /dev/null
+++ b/engines/sci/graphics/text32.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: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/engines/sci/graphics/text16.h $
+ * $Id: text16.h 55178 2011-01-08 23:16:44Z thebluegr $
+ *
+ */
+
+#ifndef SCI_GRAPHICS_TEXT32_H
+#define SCI_GRAPHICS_TEXT32_H
+
+namespace Sci {
+
+/**
+ * Text32 class, handles text calculation and displaying of text for SCI2, SCI21 and SCI3 games
+ */
+class GfxText32 {
+public:
+ GfxText32(SegManager *segMan, GfxCache *fonts, GfxScreen *screen);
+ ~GfxText32();
+ reg_t createTextBitmap(reg_t textObject, uint16 maxWidth = 0, uint16 maxHeight = 0);
+ void disposeTextBitmap(reg_t hunkId);
+ void drawTextBitmap(reg_t textObject);
+ int16 GetLongest(const char *text, int16 maxWidth, GfxFont *font);
+
+ void kernelTextSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight);
+
+private:
+ int16 Size(Common::Rect &rect, const char *text, GuiResourceId fontId, int16 maxWidth);
+ void Width(const char *text, int16 from, int16 len, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight, bool restoreFont);
+ void StringWidth(const char *str, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight);
+ Common::Rect getPlaneRect(reg_t textObject);
+
+ SegManager *_segMan;
+ GfxCache *_cache;
+ GfxScreen *_screen;
+};
+
+} // End of namespace Sci
+
+#endif
diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp
index 6ca4903e17..e095cde697 100644
--- a/engines/sci/graphics/view.cpp
+++ b/engines/sci/graphics/view.cpp
@@ -172,6 +172,20 @@ void GfxView::initData(GuiResourceId resourceId) {
cel->displaceX = (signed char)celData[4];
cel->displaceY = celData[5];
cel->clearKey = celData[6];
+
+ // HACK: Fix Ego's odd displacement in the QFG3 demo, scene 740.
+ // For some reason, ego jumps above the rope, so we fix his rope
+ // hanging view by displacing it down by 40 pixels. Fixes bug
+ // #3035693.
+ // FIXME: Remove this once we figure out why Ego jumps so high.
+ // Likely culprits include kInitBresen, kDoBresen and kCantBeHere.
+ // The scripts have the y offset that hero reaches (11) hardcoded,
+ // so it might be collision detection. However, since this requires
+ // extensive work to fix properly for very little gain, this hack
+ // here will suffice until the actual issue is found.
+ if (g_sci->getGameId() == GID_QFG3 && g_sci->isDemo() && resourceId == 39)
+ cel->displaceY = 98;
+
if (isEGA) {
cel->offsetEGA = celOffset + 7;
cel->offsetRLE = 0;
@@ -471,7 +485,8 @@ void unpackCelData(byte *inBuffer, byte *celBitmap, byte clearColor, int pixelCo
curByte = *rlePtr++;
if (curByte & 0xC0) { // fill with color
runLength = curByte >> 6;
- memset(outPtr + pixelNr, curByte & 0x3F, MIN<uint16>(runLength, pixelCount - pixelNr));
+ curByte = curByte & 0x3F;
+ memset(outPtr + pixelNr, curByte, MIN<uint16>(runLength, pixelCount - pixelNr));
} else { // skip the next pixels (transparency)
runLength = curByte & 0x3F;
}
@@ -836,4 +851,13 @@ void GfxView::adjustBackUpscaledCoordinates(int16 &y, int16 &x) {
_screen->adjustBackUpscaledCoordinates(y, x, _sci2ScaleRes);
}
+byte GfxView::getColorAtCoordinate(int16 loopNo, int16 celNo, int16 x, int16 y) {
+ const CelInfo *celInfo = getCelInfo(loopNo, celNo);
+ const byte *bitmap = getBitmap(loopNo, celNo);
+ const int16 celWidth = celInfo->width;
+
+ bitmap += (celWidth * y);
+ return bitmap[x];
+}
+
} // End of namespace Sci
diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h
index 19ef2e62f8..d3473f1024 100644
--- a/engines/sci/graphics/view.h
+++ b/engines/sci/graphics/view.h
@@ -85,6 +85,8 @@ public:
void adjustToUpscaledCoordinates(int16 &y, int16 &x);
void adjustBackUpscaledCoordinates(int16 &y, int16 &x);
+ byte getColorAtCoordinate(int16 loopNo, int16 celNo, int16 x, int16 y);
+
private:
void initData(GuiResourceId resourceId);
void unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCount);
diff --git a/engines/sci/module.mk b/engines/sci/module.mk
index 2202002e2e..c129ae5439 100644
--- a/engines/sci/module.mk
+++ b/engines/sci/module.mk
@@ -80,6 +80,7 @@ ifdef ENABLE_SCI32
MODULE_OBJS += \
graphics/frameout.o \
graphics/paint32.o \
+ graphics/text32.o \
video/robot_decoder.o
endif
diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp
index 01c25ef401..d44109faec 100644
--- a/engines/sci/parser/said.cpp
+++ b/engines/sci/parser/said.cpp
@@ -1147,4 +1147,3 @@ True
} // End of namespace Sci
-
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index fa70481bdc..c50d1b8d8a 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -93,7 +93,7 @@ const char *getSciVersionDesc(SciVersion version) {
//#define SCI_VERBOSE_RESMAN 1
-static const char *sci_error_types[] = {
+static const char *const sci_error_types[] = {
"No error",
"I/O error",
"Resource is empty (size 0)",
@@ -107,7 +107,7 @@ static const char *sci_error_types[] = {
"SCI version is unsupported"
};
-static const char *s_resourceTypeNames[] = {
+static const char *const s_resourceTypeNames[] = {
"view", "pic", "script", "text", "sound",
"memory", "vocab", "font", "cursor",
"patch", "bitmap", "palette", "cdaudio",
@@ -120,7 +120,7 @@ static const char *s_resourceTypeNames[] = {
// Resource type suffixes. Note that the
// suffic of SCI3 scripts has been changed from
// scr to csc
-static const char *s_resourceTypeSuffixes[] = {
+static const char *const s_resourceTypeSuffixes[] = {
"v56", "p56", "scr", "tex", "snd",
"", "voc", "fon", "cur", "pat",
"bit", "pal", "cda", "aud", "syn",
@@ -1158,8 +1158,10 @@ ResVersion ResourceManager::detectMapVersion() {
}
}
- if (!fileStream)
- error("Failed to open resource map file");
+ if (!fileStream) {
+ warning("Failed to open resource map file");
+ return kResVersionUnknown;
+ }
// detection
// SCI0 and SCI01 maps have last 6 bytes set to FF
@@ -1259,7 +1261,7 @@ ResVersion ResourceManager::detectVolVersion() {
}
if (!fileStream) {
- error("Failed to open volume file - if you got resource.p01/resource.p02/etc. files, merge them together into resource.000");
+ warning("Failed to open volume file - if you got resource.p01/resource.p02/etc. files, merge them together into resource.000");
// resource.p01/resource.p02/etc. may be there when directly copying the files from the original floppies
// the sierra installer would merge those together (perhaps we could do this as well?)
// possible TODO
@@ -1555,7 +1557,7 @@ void ResourceManager::readResourcePatches() {
name = (*x)->getName();
// SCI1 scheme
- if (isdigit(name[0])) {
+ if (isdigit(static_cast<unsigned char>(name[0]))) {
char *end = 0;
resourceNr = strtol(name.c_str(), &end, 10);
bAdd = (*end == '.'); // Ensure the next character is the period
@@ -1563,7 +1565,7 @@ void ResourceManager::readResourcePatches() {
// SCI0 scheme
int resname_len = strlen(szResType);
if (scumm_strnicmp(name.c_str(), szResType, resname_len) == 0
- && !isalpha(name[resname_len + 1])) {
+ && !isalpha(static_cast<unsigned char>(name[resname_len + 1]))) {
resourceNr = atoi(name.c_str() + resname_len + 1);
bAdd = true;
}
@@ -1721,15 +1723,19 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) {
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;
+ // If the resource is already present in a volume, change it to
+ // the new content (but only in a volume, so as not to overwrite
+ // external patches - refer to bug #3366295).
+ // This is needed at least for the German version of Pharkas.
+ // That version contains several duplicate resources INSIDE the
+ // resource data files like fonts, views, scripts, etc. Thus,
+ // if we use the first entries in the resource file, half of the
+ // game will be English and umlauts will also be missing :P
+ if (resource->_source->getSourceType() == kSourceVolume) {
+ resource->_source = source;
+ resource->_fileOffset = fileOffset;
+ resource->size = 0;
+ }
}
}
}
@@ -2175,15 +2181,16 @@ void ResourceManager::detectSciVersion() {
}
if (_volVersion == kResVersionSci11Mac) {
- // SCI32 doesn't have the resource.cfg file, so we can figure out
- // which of the games are SCI1.1. Note that there are no Mac SCI2 games.
- // Yes, that means that GK1 Mac is SCI2.1 and not SCI2.
+ Resource *res = testResource(ResourceId(kResourceTypeScript, 64920));
+ // Distinguish between SCI1.1 and SCI32 games here. SCI32 games will
+ // always include script 64920 (the Array class). Note that there are
+ // no Mac SCI2 games. Yes, that means that GK1 Mac is SCI2.1 and not SCI2.
// TODO: Decide between SCI2.1 and SCI3
- if (Common::File::exists("resource.cfg"))
- s_sciVersion = SCI_VERSION_1_1;
- else
+ if (res)
s_sciVersion = SCI_VERSION_2_1;
+ else
+ s_sciVersion = SCI_VERSION_1_1;
return;
}
@@ -2348,7 +2355,7 @@ bool ResourceManager::detectFontExtended() {
}
// detects, if SCI1.1 game uses palette merging or copying - this is supposed to only get used on SCI1.1 games
-bool ResourceManager::detectForPaletteMergingForSci11() {
+bool ResourceManager::detectPaletteMergingSci11() {
// Load palette 999 (default palette)
Resource *res = findResource(ResourceId(kResourceTypePalette, 999), false);
diff --git a/engines/sci/resource.h b/engines/sci/resource.h
index f450f1b397..47602de017 100644
--- a/engines/sci/resource.h
+++ b/engines/sci/resource.h
@@ -354,7 +354,7 @@ public:
// Detects, if standard font of current game includes extended characters (>0x80)
bool detectFontExtended();
// Detects, if SCI1.1 game uses palette merging
- bool detectForPaletteMergingForSci11();
+ bool detectPaletteMergingSci11();
// Detects, if SCI0EARLY game also has SCI0EARLY sound resources
bool detectEarlySound();
diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp
index 032040fc2c..f3a3c8dd5b 100644
--- a/engines/sci/resource_audio.cpp
+++ b/engines/sci/resource_audio.cpp
@@ -197,7 +197,7 @@ void ResourceManager::readWaveAudioPatches() {
for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) {
Common::String name = (*x)->getName();
- if (isdigit(name[0]))
+ if (isdigit(static_cast<unsigned char>(name[0])))
processWavePatch(ResourceId(kResourceTypeAudio, atoi(name.c_str())), name);
}
}
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index de1aafb8e2..1d0d63870d 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -61,6 +61,7 @@
#include "sci/graphics/transitions.h"
#ifdef ENABLE_SCI32
+#include "sci/graphics/text32.h"
#include "sci/graphics/frameout.h"
#include "sci/video/robot_decoder.h"
#endif
@@ -146,6 +147,7 @@ SciEngine::~SciEngine() {
DebugMan.clearAllDebugChannels();
#ifdef ENABLE_SCI32
+ delete _gfxText32;
delete _robotDecoder;
delete _gfxFrameout;
#endif
@@ -598,6 +600,7 @@ void SciEngine::initGraphics() {
_gfxText16 = 0;
_gfxTransitions = 0;
#ifdef ENABLE_SCI32
+ _gfxText32 = 0;
_robotDecoder = 0;
_gfxFrameout = 0;
_gfxPaint32 = 0;
@@ -606,16 +609,7 @@ void SciEngine::initGraphics() {
if (hasMacIconBar())
_gfxMacIconBar = new GfxMacIconBar();
- bool paletteMerging = true;
- if (getSciVersion() >= SCI_VERSION_1_1) {
- // there are some games that use inbetween SCI1.1 interpreter, so we have to detect if it's merging or copying
- if (getSciVersion() == SCI_VERSION_1_1)
- paletteMerging = _resMan->detectForPaletteMergingForSci11();
- else
- paletteMerging = false;
- }
-
- _gfxPalette = new GfxPalette(_resMan, _gfxScreen, paletteMerging);
+ _gfxPalette = new GfxPalette(_resMan, _gfxScreen);
_gfxCache = new GfxCache(_resMan, _gfxScreen, _gfxPalette);
_gfxCursor = new GfxCursor(_resMan, _gfxPalette, _gfxScreen);
@@ -627,6 +621,7 @@ void SciEngine::initGraphics() {
_gfxCompare = new GfxCompare(_gamestate->_segMan, _kernel, _gfxCache, _gfxScreen, _gfxCoordAdjuster);
_gfxPaint32 = new GfxPaint32(_resMan, _gamestate->_segMan, _kernel, _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette);
_gfxPaint = _gfxPaint32;
+ _gfxText32 = new GfxText32(_gamestate->_segMan, _gfxCache, _gfxScreen);
_robotDecoder = new RobotDecoder(g_system->getMixer(), getPlatform() == Common::kPlatformMacintosh);
_gfxFrameout = new GfxFrameout(_gamestate->_segMan, _resMan, _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette, _gfxPaint32);
} else {
@@ -870,6 +865,7 @@ void SciEngine::syncIngameAudioOptions() {
// Is it a game that supports simultaneous speech and subtitles?
if (getGameId() == GID_SQ4
|| getGameId() == GID_FREDDYPHARKAS
+ || getGameId() == GID_ECOQUEST
// TODO: The following need script patches for simultaneous speech and subtitles
//|| getGameId() == GID_KQ6
//|| getGameId() == GID_LAURABOW2
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index b419d862a4..81bbdc51de 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -71,6 +71,7 @@ class GfxPalette;
class GfxPorts;
class GfxScreen;
class GfxText16;
+class GfxText32;
class GfxTransitions;
#ifdef ENABLE_SCI32
@@ -313,6 +314,7 @@ public:
GfxPorts *_gfxPorts; // Port managment for 16-bit gfx
GfxScreen *_gfxScreen;
GfxText16 *_gfxText16;
+ GfxText32 *_gfxText32;
GfxTransitions *_gfxTransitions; // transitions between screens for 16-bit gfx
GfxMacIconBar *_gfxMacIconBar; // Mac Icon Bar manager
diff --git a/engines/sci/sound/drivers/cms.cpp b/engines/sci/sound/drivers/cms.cpp
index ace96ba499..dbcbf3d431 100644
--- a/engines/sci/sound/drivers/cms.cpp
+++ b/engines/sci/sound/drivers/cms.cpp
@@ -813,4 +813,3 @@ MidiPlayer *MidiPlayer_CMS_create(SciVersion version) {
}
} // End of namespace SCI
-
diff --git a/engines/sci/sound/drivers/gm_names.h b/engines/sci/sound/drivers/gm_names.h
index bfe5ff88c7..fbfa413a4a 100644
--- a/engines/sci/sound/drivers/gm_names.h
+++ b/engines/sci/sound/drivers/gm_names.h
@@ -30,7 +30,7 @@ namespace Sci {
// is defined
#ifndef REDUCE_MEMORY_USAGE
-static const char *GmInstrumentNames[] = {
+static const char *const GmInstrumentNames[] = {
/*000*/ "Acoustic Grand Piano",
/*001*/ "Bright Acoustic Piano",
/*002*/ "Electric Grand Piano",
@@ -162,7 +162,7 @@ static const char *GmInstrumentNames[] = {
};
// The GM Percussion map is downwards compatible to the MT32 map, which is used in SCI
-static const char *GmPercussionNames[] = {
+static const char *const GmPercussionNames[] = {
/*00*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/*10*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/*20*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp
index 95b165468d..ad7ba7ca36 100644
--- a/engines/sci/sound/midiparser_sci.cpp
+++ b/engines/sci/sound/midiparser_sci.cpp
@@ -480,11 +480,18 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) {
info.basic.param2 = 0;
if (info.channel() == 0xF) {// SCI special case
if (info.basic.param1 != kSetSignalLoop) {
- // at least in kq5/french&mac the first scene in the intro has a song that sets signal to 4 immediately
- // on tick 0. Signal isn't set at that point by sierra sci and it would cause the castle daventry text to
- // get immediately removed, so we currently filter it.
- // Sierra SCI ignores them as well at that time
- if ((_position._play_tick) || (info.delta)) {
+ // At least in kq5/french&mac the first scene in the intro has
+ // a song that sets signal to 4 immediately on tick 0. Signal
+ // isn't set at that point by sierra sci and it would cause the
+ // castle daventry text to get immediately removed, so we
+ // currently filter it. Sierra SCI ignores them as well at that
+ // time. However, this filtering should only be performed for
+ // SCI1 and newer games. Signalling is done differently in SCI0
+ // though, so ignoring these signals in SCI0 games will result
+ // in glitches (e.g. the intro of LB1 Amiga gets stuck - bug
+ // #3297883). Refer to MusicEntry::setSignal() in sound/music.cpp.
+ if (_soundVersion <= SCI_VERSION_0_LATE ||
+ _position._play_tick || info.delta) {
_signalSet = true;
_signalToSet = info.basic.param1;
}
@@ -626,7 +633,11 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) {
if (info.ext.type == 0x2F) {// end of track reached
if (_pSnd->loop)
_pSnd->loop--;
- if (_pSnd->loop) {
+ // QFG3 abuses the hold flag. Its scripts call kDoSoundSetHold,
+ // but sometimes there's no hold marker in the associated songs
+ // (e.g. song 110, during the intro). The original interpreter
+ // treats this case as an infinite loop (bug #3311911).
+ if (_pSnd->loop || _pSnd->hold > 0) {
// We need to play it again...
jumpToTick(_loopTick);
} else {
diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp
index 2afab3858d..9610b6f847 100644
--- a/engines/sci/sound/music.cpp
+++ b/engines/sci/sound/music.cpp
@@ -63,12 +63,13 @@ void SciMusic::init() {
// SCI sound init
_dwTempo = 0;
- // Default to MIDI in SCI2.1+ games, as many don't have AdLib support.
Common::Platform platform = g_sci->getPlatform();
-
uint32 deviceFlags = MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI;
- if (getSciVersion() >= SCI_VERSION_2_1)
+ // Default to MIDI in SCI2.1+ games, as many don't have AdLib support.
+ // Also, default to MIDI for Windows versions of SCI1.1 games, as their
+ // soundtrack is written for GM.
+ if (getSciVersion() >= SCI_VERSION_2_1 || g_sci->_features->useAltWinGMSound())
deviceFlags |= MDT_PREFER_GM;
// Currently our CMS implementation only supports SCI1(.1)
diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp
index 4ea290ff9e..274c532779 100644
--- a/engines/sci/sound/soundcmd.cpp
+++ b/engines/sci/sound/soundcmd.cpp
@@ -37,6 +37,15 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM
_music = new SciMusic(_soundVersion);
_music->init();
+ // Check if the user wants synthesized or digital sound effects in SCI1.1
+ // or later games
+ _bMultiMidi = ConfMan.getBool("multi_midi");
+ // In SCI2 and later games, this check should always be true - there was
+ // always only one version of each sound effect or digital music track
+ // (e.g. the menu music in GK1 - there is a sound effect with the same
+ // resource number, but it's totally unrelated to the menu music).
+ if (getSciVersion() >= SCI_VERSION_2)
+ _bMultiMidi = true;
}
SoundCommandParser::~SoundCommandParser() {
@@ -49,11 +58,54 @@ reg_t SoundCommandParser::kDoSoundInit(int argc, reg_t *argv, reg_t acc) {
return acc;
}
-void SoundCommandParser::processInitSound(reg_t obj) {
- int resourceId = readSelectorValue(_segMan, obj, SELECTOR(number));
+int SoundCommandParser::getSoundResourceId(reg_t obj) {
+ int resourceId = obj.segment ? readSelectorValue(_segMan, obj, SELECTOR(number)) : -1;
// Modify the resourceId for the Windows versions that have an alternate MIDI soundtrack, like SSCI did.
- if (g_sci && g_sci->_features->useAltWinGMSound())
- resourceId += 1000;
+ if (g_sci && g_sci->_features->useAltWinGMSound()) {
+ // Check if the alternate MIDI song actually exists...
+ // There are cases where it just doesn't exist (e.g. SQ4, room 530 -
+ // bug #3392767). In these cases, use the DOS tracks instead.
+ if (resourceId && _resMan->testResource(ResourceId(kResourceTypeSound, resourceId + 1000)))
+ resourceId += 1000;
+ }
+
+ return resourceId;
+}
+
+void SoundCommandParser::initSoundResource(MusicEntry *newSound) {
+ if (newSound->resourceId && _resMan->testResource(ResourceId(kResourceTypeSound, newSound->resourceId)))
+ newSound->soundRes = new SoundResource(newSound->resourceId, _resMan, _soundVersion);
+ else
+ newSound->soundRes = 0;
+
+ // In SCI1.1 games, sound effects are started from here. If we can find
+ // a relevant audio resource, play it, otherwise switch to synthesized
+ // effects. If the resource exists, play it using map 65535 (sound
+ // effects map)
+ bool checkAudioResource = getSciVersion() >= SCI_VERSION_1_1;
+ // Hoyle 4 has garbled audio resources in place of the sound resources.
+ // The demo of GK1 has no alternate sound effects.
+ if ((g_sci->getGameId() == GID_HOYLE4) ||
+ (g_sci->getGameId() == GID_GK1 && g_sci->isDemo()))
+ checkAudioResource = false;
+
+ if (checkAudioResource && _resMan->testResource(ResourceId(kResourceTypeAudio, newSound->resourceId))) {
+ // Found a relevant audio resource, create an audio stream if there is
+ // no associated sound resource, or if both resources exist and the
+ // user wants the digital version.
+ if (_bMultiMidi || !newSound->soundRes) {
+ int sampleLen;
+ newSound->pStreamAud = _audio->getAudioStream(newSound->resourceId, 65535, &sampleLen);
+ newSound->soundType = Audio::Mixer::kSpeechSoundType;
+ }
+ }
+
+ if (!newSound->pStreamAud && newSound->soundRes)
+ _music->soundInitSnd(newSound);
+}
+
+void SoundCommandParser::processInitSound(reg_t obj) {
+ int resourceId = getSoundResourceId(obj);
// Check if a track with the same sound object is already playing
MusicEntry *oldSound = _music->getSlot(obj);
@@ -62,11 +114,6 @@ void SoundCommandParser::processInitSound(reg_t obj) {
MusicEntry *newSound = new MusicEntry();
newSound->resourceId = resourceId;
- if (resourceId && _resMan->testResource(ResourceId(kResourceTypeSound, resourceId)))
- newSound->soundRes = new SoundResource(resourceId, _resMan, _soundVersion);
- else
- newSound->soundRes = 0;
-
newSound->soundObj = obj;
newSound->loop = readSelectorValue(_segMan, obj, SELECTOR(loop));
newSound->priority = readSelectorValue(_segMan, obj, SELECTOR(pri)) & 0xFF;
@@ -77,25 +124,7 @@ void SoundCommandParser::processInitSound(reg_t obj) {
debugC(kDebugLevelSound, "kDoSound(init): %04x:%04x number %d, loop %d, prio %d, vol %d", PRINT_REG(obj),
resourceId, newSound->loop, newSound->priority, newSound->volume);
- // In SCI1.1 games, sound effects are started from here. If we can find
- // a relevant audio resource, play it, otherwise switch to synthesized
- // effects. If the resource exists, play it using map 65535 (sound
- // effects map)
- bool checkAudioResource = getSciVersion() >= SCI_VERSION_1_1;
- if (g_sci->getGameId() == GID_HOYLE4)
- checkAudioResource = false; // hoyle 4 has garbled audio resources in place of the sound resources
- // if we play those, we will only make the user deaf and break speakers. Sierra SCI doesn't play anything
- // on soundblaster. FIXME: check, why this is
-
- if (checkAudioResource && _resMan->testResource(ResourceId(kResourceTypeAudio, resourceId))) {
- // Found a relevant audio resource, play it
- int sampleLen;
- newSound->pStreamAud = _audio->getAudioStream(resourceId, 65535, &sampleLen);
- newSound->soundType = Audio::Mixer::kSpeechSoundType;
- } else {
- if (newSound->soundRes)
- _music->soundInitSnd(newSound);
- }
+ initSoundResource(newSound);
_music->pushBackSlot(newSound);
@@ -105,8 +134,6 @@ void SoundCommandParser::processInitSound(reg_t obj) {
writeSelectorValue(_segMan, obj, SELECTOR(state), kSoundInitialized);
else
writeSelector(_segMan, obj, SELECTOR(nodePtr), obj);
-
- writeSelector(_segMan, obj, SELECTOR(handle), obj);
}
}
@@ -119,14 +146,17 @@ reg_t SoundCommandParser::kDoSoundPlay(int argc, reg_t *argv, reg_t acc) {
void SoundCommandParser::processPlaySound(reg_t obj) {
MusicEntry *musicSlot = _music->getSlot(obj);
if (!musicSlot) {
- warning("kDoSound(play): Slot not found (%04x:%04x)", PRINT_REG(obj));
- return;
+ warning("kDoSound(play): Slot not found (%04x:%04x), initializing it manually", PRINT_REG(obj));
+ // The sound hasn't been initialized for some reason, so initialize it
+ // here. Happens in KQ6, room 460, when giving the creature (child) to
+ // the bookworm. Fixes bugs #3413301 and #3421098.
+ processInitSound(obj);
+ musicSlot = _music->getSlot(obj);
+ if (!musicSlot)
+ error("Failed to initialize uninitialized sound slot");
}
- int resourceId = obj.segment ? readSelectorValue(_segMan, obj, SELECTOR(number)) : -1;
- // Modify the resourceId for the Windows versions that have an alternate MIDI soundtrack, like SSCI did.
- if (g_sci && g_sci->_features->useAltWinGMSound())
- resourceId += 1000;
+ int resourceId = getSoundResourceId(obj);
if (musicSlot->resourceId != resourceId) { // another sound loaded into struct
processDisposeSound(obj);
@@ -149,6 +179,9 @@ void SoundCommandParser::processPlaySound(reg_t obj) {
musicSlot->loop = readSelectorValue(_segMan, obj, SELECTOR(loop));
musicSlot->priority = readSelectorValue(_segMan, obj, SELECTOR(priority));
+ // Reset hold when starting a new song. kDoSoundSetHold is always called after
+ // kDoSoundPlay to set it properly, if needed. Fixes bug #3413589.
+ musicSlot->hold = -1;
if (_soundVersion >= SCI_VERSION_1_EARLY)
musicSlot->volume = readSelectorValue(_segMan, obj, SELECTOR(vol));
@@ -618,13 +651,10 @@ reg_t SoundCommandParser::kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc)
}
if (value == -1) {
- uint16 resourceNr = musicSlot->resourceId;
- // Modify the resourceId for the Windows versions that have an alternate MIDI soundtrack, like SSCI did.
- if (g_sci && g_sci->_features->useAltWinGMSound())
- resourceNr += 1000;
+ uint16 resourceId = musicSlot->resourceId;
// Set priority from the song data
- Resource *song = _resMan->findResource(ResourceId(kResourceTypeSound, resourceNr), 0);
+ Resource *song = _resMan->findResource(ResourceId(kResourceTypeSound, resourceId), 0);
if (song->data[0] == 0xf0)
_music->soundSetPriority(musicSlot, song->data[1]);
else
diff --git a/engines/sci/sound/soundcmd.h b/engines/sci/sound/soundcmd.h
index a542a8b384..c1dce014d2 100644
--- a/engines/sci/sound/soundcmd.h
+++ b/engines/sci/sound/soundcmd.h
@@ -32,6 +32,7 @@ namespace Sci {
class Console;
class SciMusic;
class SoundCommandParser;
+class MusicEntry;
//typedef void (SoundCommandParser::*SoundCommand)(reg_t obj, int16 value);
//struct MusicEntryCommand {
@@ -64,6 +65,7 @@ public:
void processPlaySound(reg_t obj);
void processStopSound(reg_t obj, bool sampleFinishedPlaying);
+ void initSoundResource(MusicEntry *newSound);
MusicType getMusicType() const;
@@ -109,10 +111,12 @@ private:
SciMusic *_music;
AudioPlayer *_audio;
SciVersion _soundVersion;
+ bool _bMultiMidi;
void processInitSound(reg_t obj);
void processDisposeSound(reg_t obj);
void processUpdateCues(reg_t obj);
+ int getSoundResourceId(reg_t obj);
};
} // End of namespace Sci
diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index 20b929dfd4..eb23c30ebe 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -2287,7 +2287,7 @@ void Actor::setActorCostume(int c) {
}
}
-static const char* v0ActorNames_English[25] = {
+static const char *const v0ActorNames_English[25] = {
"Syd",
"Razor",
"Dave",
@@ -2313,7 +2313,7 @@ static const char* v0ActorNames_English[25] = {
"Sandy"
};
-static const char* v0ActorNames_German[25] = {
+static const char *const v0ActorNames_German[25] = {
"Syd",
"Razor",
"Dave",
diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp
index 7fb834ce98..4064853b6b 100644
--- a/engines/scumm/charset.cpp
+++ b/engines/scumm/charset.cpp
@@ -49,35 +49,28 @@ void ScummEngine::loadCJKFont() {
_newLineCharacter = 0;
if (_game.version <= 5 && _game.platform == Common::kPlatformFMTowns && _language == Common::JA_JPN) { // FM-TOWNS v3 / v5 Kanji
-#ifdef DISABLE_TOWNS_DUAL_LAYER_MODE
+#if defined(DISABLE_TOWNS_DUAL_LAYER_MODE) || !defined(USE_RGB_COLOR)
GUIErrorMessage("FM-Towns Kanji font drawing requires dual graphics layer support which is disabled in this build");
error("FM-Towns Kanji font drawing requires dual graphics layer support which is disabled in this build");
#else
// use FM-TOWNS font rom, since game files don't have kanji font resources
- _cjkFont = Graphics::FontSJIS::createFont(Common::kPlatformFMTowns);
+ _cjkFont = Graphics::FontSJIS::createFont(_game.platform);
if (!_cjkFont)
error("SCUMM::Font: Could not open file 'FMT_FNT.ROM'");
_textSurfaceMultiplier = 2;
_useCJKMode = true;
#endif
} else if (_game.id == GID_LOOM && _game.platform == Common::kPlatformPCEngine && _language == Common::JA_JPN) {
- int numChar = 3418;
- _2byteWidth = 12;
- _2byteHeight = 12;
+#ifdef USE_RGB_COLOR
// use PC-Engine System Card, since game files don't have kanji font resources
- if (!fp.open("pce.cdbios")) {
- error("SCUMM::Font: Could not open System Card pce.cdbios");
- } else {
- _useCJKMode = true;
- debug(2, "Loading PC-Engine System Card");
-
- // A 0x200 byte header can be present at the beginning of the syscard. Seek past it too.
- fp.seek((fp.size() & 0x200) ? 0x30200 : 0x30000);
+ _cjkFont = Graphics::FontSJIS::createFont(_game.platform);
+ if (!_cjkFont)
+ error("SCUMM::Font: Could not open file 'pce.cdbios'");
- _2byteFontPtr = new byte[_2byteWidth * _2byteHeight * numChar / 8];
- fp.read(_2byteFontPtr, _2byteWidth * _2byteHeight * numChar / 8);
- fp.close();
- }
+ _cjkFont->setDrawingMode(Graphics::FontSJIS::kShadowMode);
+ _2byteWidth = _2byteHeight = 12;
+ _useCJKMode = true;
+#endif
} else if (_game.id == GID_MONKEY && _game.platform == Common::kPlatformSegaCD && _language == Common::JA_JPN) {
int numChar = 1413;
_2byteWidth = 16;
@@ -161,71 +154,16 @@ void ScummEngine::loadCJKFont() {
}
}
-static int SJIStoPCEChunk(int f, int s) { //converts sjis code to pce font offset
- // rangeTbl maps SJIS char-codes to the PCE System Card font rom.
- // Each pair {<upperBound>,<lowerBound>} in the array represents a SJIS range.
- const int rangeCnt = 45;
- static const uint16 rangeTbl[rangeCnt][2] = {
- // Symbols
- {0x8140,0x817E},{0x8180,0x81AC},
- // 0-9
- {0x824F,0x8258},
- // Latin upper
- {0x8260,0x8279},
- // Latin lower
- {0x8281,0x829A},
- // Kana
- {0x829F,0x82F1},{0x8340,0x837E},{0x8380,0x8396},
- // Greek upper
- {0x839F,0x83B6},
- // Greek lower
- {0x83BF,0x83D6},
- // Cyrillic upper
- {0x8440,0x8460},
- // Cyrillic lower
- {0x8470,0x847E},{0x8480,0x8491},
- // Kanji
- {0x889F,0x88FC},
- {0x8940,0x897E},{0x8980,0x89FC},
- {0x8A40,0x8A7E},{0x8A80,0x8AFC},
- {0x8B40,0x8B7E},{0x8B80,0x8BFC},
- {0x8C40,0x8C7E},{0x8C80,0x8CFC},
- {0x8D40,0x8D7E},{0x8D80,0x8DFC},
- {0x8E40,0x8E7E},{0x8E80,0x8EFC},
- {0x8F40,0x8F7E},{0x8F80,0x8FFC},
- {0x9040,0x907E},{0x9080,0x90FC},
- {0x9140,0x917E},{0x9180,0x91FC},
- {0x9240,0x927E},{0x9280,0x92FC},
- {0x9340,0x937E},{0x9380,0x93FC},
- {0x9440,0x947E},{0x9480,0x94FC},
- {0x9540,0x957E},{0x9580,0x95FC},
- {0x9640,0x967E},{0x9680,0x96FC},
- {0x9740,0x977E},{0x9780,0x97FC},
- {0x9840,0x9872}
- };
-
- int ch = (f << 8) | (s & 0xFF);
- int offset = 0;
- for (int i = 0; i < rangeCnt; ++i) {
- if (ch >= rangeTbl[i][0] && ch <= rangeTbl[i][1])
- return offset + ch - rangeTbl[i][0];
- offset += rangeTbl[i][1] - rangeTbl[i][0] + 1;
- }
-
- debug(4, "Invalid Char: 0x%x", ch);
- return 0;
-}
-
byte *ScummEngine::get2byteCharPtr(int idx) {
+ if (_game.platform == Common::kPlatformFMTowns || _game.platform == Common::kPlatformPCEngine)
+ return 0;
+
switch (_language) {
case Common::KO_KOR:
idx = ((idx % 256) - 0xb0) * 94 + (idx / 256) - 0xa1;
break;
case Common::JA_JPN:
- if (_game.id == GID_LOOM && _game.platform == Common::kPlatformPCEngine) {
- idx = SJIStoPCEChunk((idx % 256), (idx / 256));
- return _2byteFontPtr + (_2byteWidth * _2byteHeight / 8) * idx;
- } else if (_game.id == GID_MONKEY && _game.platform == Common::kPlatformSegaCD && _language == Common::JA_JPN) {
+ if (_game.id == GID_MONKEY && _game.platform == Common::kPlatformSegaCD && _language == Common::JA_JPN) {
// init pointer to charset resource
if (_2byteFontPtr[0] == 0xFF) {
int charsetId = 5;
@@ -314,7 +252,7 @@ CharsetRenderer::~CharsetRenderer() {
CharsetRendererCommon::CharsetRendererCommon(ScummEngine *vm)
: CharsetRenderer(vm), _bytesPerPixel(0), _fontHeight(0), _numChars(0) {
- _shadowMode = kNoShadowMode;
+ _shadowMode = false;
_shadowColor = 0;
}
@@ -362,17 +300,9 @@ void CharsetRendererV3::setCurID(int32 id) {
}
int CharsetRendererCommon::getFontHeight() {
- if (_vm->_useCJKMode) {
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- static const uint8 sjisFontHeightM1[] = { 0, 8, 9, 8, 9, 8, 9, 0, 0, 0 };
- static const uint8 sjisFontHeightM2[] = { 0, 8, 9, 9, 9, 8, 9, 9, 9, 8 };
- static const uint8 sjisFontHeightI4[] = { 0, 8, 9, 9, 9, 8, 8, 8, 8, 8 };
- const uint8 *htbl = (_vm->_game.id == GID_MONKEY) ? sjisFontHeightM1 : ((_vm->_game.id == GID_INDY4) ? sjisFontHeightI4 : sjisFontHeightM2);
- return (_vm->_game.version == 3) ? 8 : htbl[_curId];
- } else {
- return MAX(_vm->_2byteHeight + 1, _fontHeight);
- }
- } else
+ if (_vm->_useCJKMode)
+ return MAX(_vm->_2byteHeight + 1, _fontHeight);
+ else
return _fontHeight;
}
@@ -380,57 +310,16 @@ int CharsetRendererCommon::getFontHeight() {
int CharsetRendererClassic::getCharWidth(uint16 chr) {
int spacing = 0;
- if (_vm->_useCJKMode) {
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- if ((chr & 0xff00) == 0xfd00) {
- chr &= 0xff;
- } else if (chr >= 256) {
- spacing = 8;
- } else if (useTownsFontRomCharacter(chr)) {
- spacing = 4;
- }
-
- if (spacing) {
- if (_vm->_game.id == GID_MONKEY) {
- spacing++;
- if (_curId == 2)
- spacing++;
- } else if (_vm->_game.id != GID_INDY4 && _curId == 1) {
- spacing++;
- }
- }
-
- } else if (chr >= 0x80) {
- return _vm->_2byteWidth / 2;
- }
- }
+ if (_vm->_useCJKMode && chr >= 0x80)
+ return _vm->_2byteWidth / 2;
- if (!spacing) {
- int offs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
- if (offs) {
- spacing = _fontPtr[offs] + (signed char)_fontPtr[offs + 2];
- }
- }
+ int offs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
+ if (offs)
+ spacing = _fontPtr[offs] + (signed char)_fontPtr[offs + 2];
return spacing;
}
-bool CharsetRendererClassic::useTownsFontRomCharacter(uint16 chr) {
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (_vm->_game.platform != Common::kPlatformFMTowns || !_vm->_useCJKMode)
- return false;
-
- if (chr < 128) {
- if (((_vm->_game.id == GID_MONKEY2 && _curId != 0) || (_vm->_game.id == GID_INDY4 && _curId != 3)) && (chr > 31 && chr != 94 && chr != 95 && chr != 126 && chr != 127))
- return true;
- return false;
- }
- return true;
-#else
- return false;
-#endif
-}
-
int CharsetRenderer::getStringWidth(int arg, const byte *text) {
int pos = 0;
int width = 1;
@@ -608,22 +497,52 @@ void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth) {
int CharsetRendererV3::getCharWidth(uint16 chr) {
int spacing = 0;
- if (_vm->_useCJKMode) {
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- if (chr >= 256)
- spacing = 8;
- else if (chr >= 128)
- spacing = 4;
- } else if (chr & 0x80) {
- spacing = _vm->_2byteWidth / 2;
+ if (_vm->_useCJKMode && (chr & 0x80))
+ spacing = _vm->_2byteWidth / 2;
+
+ if (!spacing)
+ spacing = *(_widthTable + chr);
+
+ return spacing;
+}
+
+void CharsetRendererV3::enableShadow(bool enable) {
+ _shadowColor = 0;
+ _shadowMode = enable;
+}
+
+void CharsetRendererV3::drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height) {
+ byte *dst = (byte *)dest.getBasePtr(x, y);
+
+ byte bits = 0;
+ uint8 col = _color;
+ int pitch = dest.pitch - width * dest.format.bytesPerPixel;
+ byte *dst2 = dst + dest.pitch;
+
+ for (y = 0; y < height && y + drawTop < dest.h; y++) {
+ for (x = 0; x < width; x++) {
+ if ((x % 8) == 0)
+ bits = *src++;
+ if ((bits & revBitMask(x % 8)) && y + drawTop >= 0) {
+ if (_shadowMode)
+ dst[1] = dst2[0] = dst2[1] = _shadowColor;
+ dst[0] = col;
+ }
+ dst += dest.format.bytesPerPixel;
+ dst2 += dest.format.bytesPerPixel;
}
- }
- if (!spacing) {
- spacing = *(_widthTable + chr);
+ dst += pitch;
+ dst2 += pitch;
}
+}
- return spacing;
+int CharsetRendererV3::getDrawWidthIntern(uint16 chr) {
+ return getCharWidth(chr);
+}
+
+int CharsetRendererV3::getDrawHeightIntern(uint16) {
+ return 8;
}
void CharsetRendererV3::setColor(byte color) {
@@ -662,43 +581,6 @@ void CharsetRendererPCE::setColor(byte color) {
}
#endif
-void CharsetRendererCommon::enableShadow(bool enable) {
- if (enable) {
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- _shadowColor = 8;
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- _shadowColor = _vm->_game.version == 5 ? _vm->_townsCharsetColorMap[0] : 0x88;
- if (_vm->_cjkFont) {
- if (_vm->_game.version == 5) {
- if (((_vm->_game.id == GID_MONKEY) && (_curId == 2 || _curId == 4 || _curId == 6)) ||
- ((_vm->_game.id == GID_MONKEY2) && (_curId != 1 && _curId != 5 && _curId != 9)) ||
- ((_vm->_game.id == GID_INDY4) && (_curId == 2 || _curId == 3 || _curId == 4))) {
- _vm->_cjkFont->setDrawingMode(Graphics::FontSJIS::kOutlineMode);
- } else {
- _vm->_cjkFont->setDrawingMode(Graphics::FontSJIS::kDefaultMode);
- }
- _vm->_cjkFont->toggleFlippedMode((_vm->_game.id == GID_MONKEY || _vm->_game.id == GID_MONKEY2) && _curId == 3);
- } else {
- _vm->_cjkFont->setDrawingMode(Graphics::FontSJIS::kShadowMode);
- }
- }
-#endif
- _shadowMode = kFMTOWNSShadowMode;
- } else {
- _shadowColor = 0;
- _shadowMode = kNormalShadowMode;
- }
- } else {
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (_vm->_cjkFont) {
- _vm->_cjkFont->setDrawingMode(Graphics::FontSJIS::kDefaultMode);
- _vm->_cjkFont->toggleFlippedMode(false);
- }
-#endif
- _shadowMode = kNoShadowMode;
- }
-}
-
void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
// WORKAROUND for bug #1509509: Indy3 Mac does not show black
// characters (such as in the grail diary) if ignoreCharsetMask
@@ -710,7 +592,6 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
int width, height, origWidth = 0, origHeight;
VirtScreen *vs;
const byte *charPtr;
- byte *dst;
int is2byte = (chr >= 256 && _vm->_useCJKMode) ? 1 : 0;
assertRange(0, _curId, _vm->_numCharsets - 1, "charset");
@@ -721,33 +602,19 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
if (chr == '@')
return;
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (_vm->_useCJKMode && chr > 127) {
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- charPtr = 0;
- width = _vm->_cjkFont->getCharWidth(chr);
- height = _vm->_cjkFont->getFontHeight();
- } else {
- width = _vm->_2byteWidth;
- height = _vm->_2byteHeight;
- charPtr = _vm->get2byteCharPtr(chr);
- }
- } else
-#endif
- {
- charPtr = _fontPtr + chr * 8;
- width = getCharWidth(chr);
- height = 8;
- }
+ charPtr = (_vm->_useCJKMode && chr > 127) ? _vm->get2byteCharPtr(chr) : _fontPtr + chr * 8;
+ width = getDrawWidthIntern(chr);
+ height = getDrawHeightIntern(chr);
+ setDrawCharIntern(chr);
+
+ origWidth = width;
+ origHeight = height;
// Clip at the right side (to avoid drawing "outside" the screen bounds).
if (_left + origWidth > _right + 1)
return;
- origWidth = width;
- origHeight = height;
-
- if (_shadowMode != kNoShadowMode) {
+ if (_shadowMode) {
width++;
height++;
}
@@ -769,30 +636,18 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
_textScreenID = vs->number;
}
- if (
+ if ((ignoreCharsetMask || !vs->hasTwoBuffers)
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- (_vm->_game.platform != Common::kPlatformFMTowns) &&
+ && (_vm->_game.platform != Common::kPlatformFMTowns)
#endif
- (ignoreCharsetMask || !vs->hasTwoBuffers)) {
- dst = vs->getPixels(_left, drawTop);
- if (charPtr)
- drawBits1(*vs, dst, charPtr, drawTop, origWidth, origHeight, vs->format.bytesPerPixel);
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- else if (_vm->_cjkFont)
- _vm->_cjkFont->drawChar(vs, chr, _left, drawTop, _color, _shadowColor);
-#endif
- } else {
- dst = (byte *)_vm->_textSurface.getBasePtr(_left * _vm->_textSurfaceMultiplier, _top * _vm->_textSurfaceMultiplier);
- if (charPtr)
- drawBits1(_vm->_textSurface, dst, charPtr, drawTop, origWidth, origHeight, _vm->_textSurface.format.bytesPerPixel, (_vm->_textSurfaceMultiplier == 2 && !is2byte));
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- else if (_vm->_cjkFont)
- _vm->_cjkFont->drawChar(_vm->_textSurface, chr, _left * _vm->_textSurfaceMultiplier, _top * _vm->_textSurfaceMultiplier, _color, _shadowColor);
-#endif
- if (is2byte) {
- origWidth /= _vm->_textSurfaceMultiplier;
- height /= _vm->_textSurfaceMultiplier;
- }
+ )
+ drawBits1(*vs, _left + vs->xstart, drawTop, charPtr, drawTop, origWidth, origHeight);
+ else
+ drawBits1(_vm->_textSurface, _left * _vm->_textSurfaceMultiplier, _top * _vm->_textSurfaceMultiplier, charPtr, drawTop, origWidth, origHeight);
+
+ if (is2byte) {
+ origWidth /= _vm->_textSurfaceMultiplier;
+ height /= _vm->_textSurfaceMultiplier;
}
if (_str.left > _left)
@@ -802,7 +657,7 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
if (_str.right < _left) {
_str.right = _left;
- if (_shadowMode != kNoShadowMode)
+ if (_shadowMode)
_str.right++;
}
@@ -811,31 +666,11 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
}
void CharsetRendererV3::drawChar(int chr, Graphics::Surface &s, int x, int y) {
- const byte *charPtr;
- byte *dst;
- int width, height;
- int is2byte = (chr >= 0x80 && _vm->_useCJKMode) ? 1 : 0;
- if (is2byte) {
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- _vm->_cjkFont->drawChar(s, chr, x * _vm->_textSurfaceMultiplier, y * _vm->_textSurfaceMultiplier, _color, _shadowColor);
- return;
- }
- else
-#endif
- {
- charPtr = _vm->get2byteCharPtr(chr);
- width = _vm->_2byteWidth;
- height = _vm->_2byteHeight;
- }
- } else {
- charPtr = _fontPtr + chr * 8;
-// width = height = 8;
- width = getCharWidth(chr);
- height = 8;
- }
- dst = (byte *)s.pixels + y * s.pitch + x;
- drawBits1(s, dst, charPtr, y, width, height, s.format.bytesPerPixel);
+ const byte *charPtr = (_vm->_useCJKMode && chr > 127) ? _vm->get2byteCharPtr(chr) : _fontPtr + chr * 8;
+ int width = getDrawWidthIntern(chr);
+ int height = getDrawHeightIntern(chr);
+ setDrawCharIntern(chr);
+ drawBits1(s, x, y, charPtr, y, width, height);
}
void CharsetRenderer::translateColor() {
@@ -853,29 +688,6 @@ void CharsetRenderer::translateColor() {
}
}
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
-void CharsetRenderer::processTownsCharsetColors(uint8 bytesPerPixel) {
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- for (int i = 0; i < (1 << bytesPerPixel); i++) {
- uint8 c = _vm->_charsetColorMap[i];
-
- if (c > 16) {
- uint8 t = (_vm->_currentPalette[c * 3] < 32) ? 4 : 12;
- t |= ((_vm->_currentPalette[c * 3 + 1] < 32) ? 2 : 10);
- t |= ((_vm->_currentPalette[c * 3 + 1] < 32) ? 1 : 9);
- c = t;
- }
-
- if (c == 0)
- c = _vm->_townsOverrideShadowColor;
-
- c = ((c & 0x0f) << 4) | (c & 0x0f);
- _vm->_townsCharsetColorMap[i] = c;
- }
- }
-}
-#endif
-
void CharsetRenderer::saveLoadWithSerializer(Serializer *ser) {
static const SaveLoadEntry charsetRendererEntries[] = {
MKLINE_OLD(CharsetRenderer, _curId, sleByte, VER(73), VER(73)),
@@ -893,10 +705,7 @@ void CharsetRenderer::saveLoadWithSerializer(Serializer *ser) {
}
void CharsetRendererClassic::printChar(int chr, bool ignoreCharsetMask) {
- int width, height, origWidth, origHeight;
- int offsX, offsY;
VirtScreen *vs;
- const byte *charPtr;
bool is2byte = (chr >= 256 && _vm->_useCJKMode);
assertRange(1, _curId, _vm->_numCharsets - 1, "charset");
@@ -911,64 +720,8 @@ void CharsetRendererClassic::printChar(int chr, bool ignoreCharsetMask) {
_vm->_charsetColorMap[1] = _color;
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- processTownsCharsetColors(_bytesPerPixel);
- bool noSjis = false;
-
- if (_vm->_game.platform == Common::kPlatformFMTowns && _vm->_useCJKMode) {
- if ((chr & 0x00ff) == 0x00fd) {
- chr >>= 8;
- noSjis = true;
- }
- }
-
- if (useTownsFontRomCharacter(chr) && !noSjis) {
- charPtr = 0;
- _vm->_cjkChar = chr;
- enableShadow(true);
-
- width = getCharWidth(chr);
- // For whatever reason MI1 uses a different font width
- // for alignment calculation and for drawing when
- // charset 2 is active. This fixes some subtle glitches.
- if (_vm->_game.id == GID_MONKEY && _curId == 2)
- width--;
- origWidth = width;
-
- origHeight = height = getFontHeight();
- offsX = offsY = 0;
- } else if (_vm->_useCJKMode && (chr >= 128) && !noSjis) {
- enableShadow(true);
- origWidth = width = _vm->_2byteWidth;
- origHeight = height = _vm->_2byteHeight;
- charPtr = _vm->get2byteCharPtr(chr);
- offsX = offsY = 0;
- if (_shadowMode != kNoShadowMode) {
- width++;
- height++;
- }
- } else
-#endif
- {
- uint32 charOffs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
- assert(charOffs < 0x14000);
- if (!charOffs)
- return;
- charPtr = _fontPtr + charOffs;
-
- width = origWidth = charPtr[0];
- height = origHeight = charPtr[1];
-
- if (_disableOffsX) {
- offsX = 0;
- } else {
- offsX = (signed char)charPtr[2];
- }
-
- offsY = (signed char)charPtr[3];
-
- charPtr += 4; // Skip over char header
- }
+ if (!prepareDraw(chr))
+ return;
if (_firstChar) {
_str.left = 0;
@@ -977,12 +730,12 @@ void CharsetRendererClassic::printChar(int chr, bool ignoreCharsetMask) {
_str.bottom = 0;
}
- _top += offsY;
- _left += offsX;
+ _top += _offsY;
+ _left += _offsX;
- if (_left + origWidth > _right + 1 || _left < 0) {
- _left += origWidth;
- _top -= offsY;
+ if (_left + _origWidth > _right + 1 || _left < 0) {
+ _left += _origWidth;
+ _top -= _offsY;
return;
}
@@ -1004,33 +757,36 @@ void CharsetRendererClassic::printChar(int chr, bool ignoreCharsetMask) {
int drawTop = _top - vs->topline;
- _vm->markRectAsDirty(vs->number, _left, _left + width, drawTop, drawTop + height);
+ _vm->markRectAsDirty(vs->number, _left, _left + _width, drawTop, drawTop + _height);
// This check for kPlatformFMTowns and kMainVirtScreen is at least required for the chat with
// the navigator's head in front of the ghost ship in Monkey Island 1
- if (!ignoreCharsetMask
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- || (_vm->_game.platform == Common::kPlatformFMTowns && vs->number == kMainVirtScreen)
-#endif
- ) {
+ if (!ignoreCharsetMask || (_vm->_game.platform == Common::kPlatformFMTowns && vs->number == kMainVirtScreen)) {
_hasMask = true;
_textScreenID = vs->number;
}
- printCharIntern(is2byte, charPtr, origWidth, origHeight, width, height, vs, ignoreCharsetMask);
+ // We need to know the virtual screen we draw on for Indy 4 Amiga, since
+ // it selects the palette map according to this. We furthermore can not
+ // use _textScreenID here, since that will cause inventory graphics
+ // glitches.
+ if (_vm->_game.platform == Common::kPlatformAmiga && _vm->_game.id == GID_INDY4)
+ _drawScreen = vs->number;
- _left += origWidth;
+ printCharIntern(is2byte, _charPtr, _origWidth, _origHeight, _width, _height, vs, ignoreCharsetMask);
+
+ _left += _origWidth;
if (_str.right < _left) {
_str.right = _left;
- if (_vm->_game.platform != Common::kPlatformFMTowns && _shadowMode != kNoShadowMode)
+ if (_vm->_game.platform != Common::kPlatformFMTowns && _shadowMode)
_str.right++;
}
- if (_str.bottom < _top + origHeight)
- _str.bottom = _top + origHeight;
+ if (_str.bottom < _top + _origHeight)
+ _str.bottom = _top + _origHeight;
- _top -= offsY;
+ _top -= _offsY;
}
void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr, int origWidth, int origHeight, int width, int height, VirtScreen *vs, bool ignoreCharsetMask) {
@@ -1068,11 +824,7 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr,
} else {
Graphics::Surface dstSurface;
Graphics::Surface backSurface;
- if ((ignoreCharsetMask || !vs->hasTwoBuffers)
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- && (_vm->_game.platform != Common::kPlatformFMTowns)
-#endif
- ) {
+ if ((ignoreCharsetMask || !vs->hasTwoBuffers)) {
dstSurface = *vs;
dstPtr = vs->getPixels(_left, drawTop);
} else {
@@ -1091,16 +843,7 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr,
drawTop = _top - _vm->_screenTop;
}
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (!charPtr && _vm->_cjkFont) {
- _vm->_cjkFont->drawChar(dstSurface, _vm->_cjkChar, _left * _vm->_textSurfaceMultiplier, (_top - _vm->_screenTop) * _vm->_textSurfaceMultiplier, _vm->_townsCharsetColorMap[1], _shadowColor);
- } else
-#endif
- if (is2byte) {
- drawBits1(dstSurface, dstPtr, charPtr, drawTop, origWidth, origHeight, dstSurface.format.bytesPerPixel);
- } else {
- drawBitsN(dstSurface, dstPtr, charPtr, *_fontPtr, drawTop, origWidth, origHeight, _vm->_textSurfaceMultiplier == 2);
- }
+ drawBitsN(dstSurface, dstPtr, charPtr, *_fontPtr, drawTop, origWidth, origHeight);
if (_blitAlso && vs->hasTwoBuffers) {
// FIXME: Revisiting this code, I think the _blitAlso mode is likely broken
@@ -1139,54 +882,36 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr,
}
}
-void CharsetRendererClassic::drawChar(int chr, Graphics::Surface &s, int x, int y) {
- const byte *charPtr;
- byte *dst;
- int width, height;
- int is2byte = (chr >= 0x80 && _vm->_useCJKMode) ? 1 : 0;
-
- if (is2byte) {
- enableShadow(true);
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (_vm->_game.platform == Common::kPlatformFMTowns) {
- _vm->_cjkFont->drawChar(s, chr, x * _vm->_textSurfaceMultiplier, y * _vm->_textSurfaceMultiplier, _color, _shadowColor);
- return;
- } else
-#endif
- {
- charPtr = _vm->get2byteCharPtr(chr);
- width = _vm->_2byteWidth;
- height = _vm->_2byteHeight;
- }
- } else {
- uint32 charOffs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
- assert(charOffs < 0x10000);
- if (!charOffs)
- return;
- charPtr = _fontPtr + charOffs;
+bool CharsetRendererClassic::prepareDraw(uint16 chr) {
+ uint32 charOffs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
+ assert(charOffs < 0x14000);
+ if (!charOffs)
+ return false;
+ _charPtr = _fontPtr + charOffs;
- width = charPtr[0];
- height = charPtr[1];
+ _width = _origWidth = _charPtr[0];
+ _height = _origHeight = _charPtr[1];
- charPtr += 4; // Skip over char header
+ if (_disableOffsX) {
+ _offsX = 0;
+ } else {
+ _offsX = (signed char)_charPtr[2];
}
- dst = (byte *)s.pixels + y * s.pitch + x;
+ _offsY = (signed char)_charPtr[3];
- if (is2byte) {
- drawBits1(s, dst, charPtr, y, width, height, s.format.bytesPerPixel);
- } else {
- drawBitsN(s, dst, charPtr, *_fontPtr, y, width, height);
- }
+ _charPtr += 4; // Skip over char header
+ return true;
}
-void CharsetRendererClassic::drawBitsN(const Graphics::Surface &s, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height,
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- bool scale2x) {
-#else
- bool) {
-#endif
+void CharsetRendererClassic::drawChar(int chr, Graphics::Surface &s, int x, int y) {
+ if (!prepareDraw(chr))
+ return;
+ byte *dst = (byte *)s.pixels + y * s.pitch + x;
+ drawBitsN(s, dst, _charPtr, *_fontPtr, y, _width, _height);
+}
+void CharsetRendererClassic::drawBitsN(const Graphics::Surface &s, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height) {
int y, x;
int color;
byte numbits, bits;
@@ -1198,38 +923,28 @@ void CharsetRendererClassic::drawBitsN(const Graphics::Surface &s, byte *dst, co
numbits = 8;
byte *cmap = _vm->_charsetColorMap;
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- byte *dst2 = dst;
-
- if (_vm->_game.platform == Common::kPlatformFMTowns)
- cmap = _vm->_townsCharsetColorMap;
- if (scale2x) {
- dst2 += s.pitch;
- pitch <<= 1;
+ // Indy4 Amiga always uses the room or verb palette map to match colors to
+ // the currently setup palette, thus we need to select it over here too.
+ // Done like the original interpreter.
+ byte *amigaMap = 0;
+ if (_vm->_game.platform == Common::kPlatformAmiga && _vm->_game.id == GID_INDY4) {
+ if (_drawScreen == kVerbVirtScreen)
+ amigaMap = _vm->_verbPalette;
+ else
+ amigaMap = _vm->_roomPalette;
}
-#endif
for (y = 0; y < height && y + drawTop < s.h; y++) {
for (x = 0; x < width; x++) {
color = (bits >> (8 - bpp)) & 0xFF;
if (color && y + drawTop >= 0) {
- *dst = cmap[color];
-
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (scale2x)
- dst[1] = dst2[0] = dst2[1] = dst[0];
-#endif
+ if (amigaMap)
+ *dst = amigaMap[cmap[color]];
+ else
+ *dst = cmap[color];
}
dst++;
-
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- if (scale2x) {
- dst++;
- dst2 += 2;
- }
-#endif
-
bits <<= bpp;
numbits -= bpp;
if (numbits == 0) {
@@ -1238,52 +953,86 @@ void CharsetRendererClassic::drawBitsN(const Graphics::Surface &s, byte *dst, co
}
}
dst += pitch;
+ }
+}
+
+CharsetRendererTownsV3::CharsetRendererTownsV3(ScummEngine *vm) : CharsetRendererV3(vm), _sjisCurChar(0) {
+}
+
+int CharsetRendererTownsV3::getCharWidth(uint16 chr) {
+ int spacing = 0;
+
+ if (_vm->_useCJKMode) {
+ if (chr >= 256)
+ spacing = 8;
+ else if (chr >= 128)
+ spacing = 4;
+ }
+
+ if (!spacing)
+ spacing = *(_widthTable + chr);
+
+ return spacing;
+}
+
+int CharsetRendererTownsV3::getFontHeight() {
+ return _vm->_useCJKMode ? 8 : _fontHeight;
+}
+
+void CharsetRendererTownsV3::enableShadow(bool enable) {
+ _shadowColor = 8;
+ _shadowMode = enable;
+
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- dst2 += pitch;
+ _shadowColor = 0x88;
+#ifdef USE_RGB_COLOR
+ if (_vm->_cjkFont)
+ _vm->_cjkFont->setDrawingMode(enable ? Graphics::FontSJIS::kFMTownsShadowMode : Graphics::FontSJIS::kDefaultMode);
+#endif
#endif
- }
}
-void CharsetRendererCommon::drawBits1(const Graphics::Surface &s, byte *dst, const byte *src, int drawTop, int width, int height, uint8 bitDepth,
+void CharsetRendererTownsV3::drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height) {
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- bool scale2x) {
-#else
- bool) {
+#ifdef USE_RGB_COLOR
+ if (_sjisCurChar) {
+ assert(_vm->_cjkFont);
+ _vm->_cjkFont->drawChar(dest, _sjisCurChar, x, y, _color, _shadowColor);
+ return;
+ }
+#endif
+ bool scale2x = ((&dest == &_vm->_textSurface) && (_vm->_textSurfaceMultiplier == 2) && !(_sjisCurChar >= 256 && _vm->_useCJKMode));
#endif
- int y, x;
byte bits = 0;
uint8 col = _color;
- int pitch = s.pitch - width * bitDepth;
- byte *dst2 = dst + s.pitch;
+ int pitch = dest.pitch - width * dest.format.bytesPerPixel;
+ byte *dst = (byte *)dest.getBasePtr(x, y);
+ byte *dst2 = dst + dest.pitch;
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
byte *dst3 = dst2;
byte *dst4 = dst2;
if (scale2x) {
- dst3 = dst2 + s.pitch;
- dst4 = dst3 + s.pitch;
+ dst3 = dst2 + dest.pitch;
+ dst4 = dst3 + dest.pitch;
pitch <<= 1;
}
- if (_vm->_game.platform == Common::kPlatformFMTowns && _vm->_game.version == 5)
- col = _vm->_townsCharsetColorMap[1];
#endif
- for (y = 0; y < height && y + drawTop < s.h; y++) {
+ for (y = 0; y < height && y + drawTop < dest.h; y++) {
for (x = 0; x < width; x++) {
if ((x % 8) == 0)
bits = *src++;
if ((bits & revBitMask(x % 8)) && y + drawTop >= 0) {
- if (bitDepth == 2) {
- if (_shadowMode != kNoShadowMode) {
+ if (dest.format.bytesPerPixel == 2) {
+ if (_shadowMode) {
WRITE_UINT16(dst + 2, _vm->_16BitPalette[_shadowColor]);
- WRITE_UINT16(dst + s.pitch, _vm->_16BitPalette[_shadowColor]);
- if (_shadowMode != kFMTOWNSShadowMode)
- WRITE_UINT16(dst + s.pitch + 2, _vm->_16BitPalette[_shadowColor]);
+ WRITE_UINT16(dst + dest.pitch, _vm->_16BitPalette[_shadowColor]);
}
WRITE_UINT16(dst, _vm->_16BitPalette[_color]);
} else {
- if (_shadowMode != kNoShadowMode) {
+ if (_shadowMode) {
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
if (scale2x) {
dst[2] = dst[3] = dst2[2] = dst2[3] = _shadowColor;
@@ -1292,8 +1041,6 @@ void CharsetRendererCommon::drawBits1(const Graphics::Surface &s, byte *dst, con
#endif
{
dst[1] = dst2[0] = _shadowColor;
- if (_shadowMode != kFMTOWNSShadowMode)
- dst2[1] = _shadowColor;
}
}
dst[0] = col;
@@ -1304,8 +1051,8 @@ void CharsetRendererCommon::drawBits1(const Graphics::Surface &s, byte *dst, con
#endif
}
}
- dst += bitDepth;
- dst2 += bitDepth;
+ dst += dest.format.bytesPerPixel;
+ dst2 += dest.format.bytesPerPixel;
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
if (scale2x) {
dst++;
@@ -1324,41 +1071,90 @@ void CharsetRendererCommon::drawBits1(const Graphics::Surface &s, byte *dst, con
#endif
}
}
+#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
+int CharsetRendererTownsV3::getDrawWidthIntern(uint16 chr) {
+#ifdef USE_RGB_COLOR
+ if (_vm->_useCJKMode && chr > 127) {
+ assert(_vm->_cjkFont);
+ return _vm->_cjkFont->getCharWidth(chr);
+ }
+#endif
+ return CharsetRendererV3::getDrawWidthIntern(chr);
+}
+
+int CharsetRendererTownsV3::getDrawHeightIntern(uint16 chr) {
+#ifdef USE_RGB_COLOR
+ if (_vm->_useCJKMode && chr > 127) {
+ assert(_vm->_cjkFont);
+ return _vm->_cjkFont->getFontHeight();
+ }
+#endif
+ return CharsetRendererV3::getDrawHeightIntern(chr);
+}
+
+void CharsetRendererTownsV3::setDrawCharIntern(uint16 chr) {
+ _sjisCurChar = (_vm->_useCJKMode && chr > 127) ? chr : 0;
+}
+#endif
#ifdef USE_RGB_COLOR
-void CharsetRendererPCE::drawBits1(const Graphics::Surface &s, byte *dst, const byte *src, int drawTop, int width, int height, uint8 bitDepth, bool scalex) {
- int y, x;
- int bitCount = 0;
- byte bits = 0;
+void CharsetRendererPCE::drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height) {
+ byte *dst = (byte *)dest.getBasePtr(x, y);
+ if (_sjisCurChar) {
+ assert(_vm->_cjkFont);
+ uint16 col1 = _color;
+ uint16 col2 = _shadowColor;
+
+ if (dest.format.bytesPerPixel == 2) {
+ col1 = _vm->_16BitPalette[col1];
+ col2 = _vm->_16BitPalette[col2];
+ }
- const bool resetLineBitCount = (_vm->_language != Common::JA_JPN || width != 12);
+ _vm->_cjkFont->drawChar(dst, _sjisCurChar, dest.pitch, dest.format.bytesPerPixel, col1, col2, -1, -1);
+ return;
+ }
- for (y = 0; y < height && y + drawTop < s.h; y++) {
- if (resetLineBitCount)
- bitCount = 0;
+ byte bits = 0;
+
+ for (y = 0; y < height && y + drawTop < dest.h; y++) {
+ int bitCount = 0;
for (x = 0; x < width; x++) {
if ((bitCount % 8) == 0)
bits = *src++;
if ((bits & revBitMask(bitCount % 8)) && y + drawTop >= 0) {
- if (bitDepth == 2) {
- if (_shadowMode != kNoShadowMode) {
- WRITE_UINT16(dst + s.pitch + 2, _vm->_16BitPalette[_shadowColor]);
- }
+ if (dest.format.bytesPerPixel == 2) {
+ if (_shadowMode)
+ WRITE_UINT16(dst + dest.pitch + 2, _vm->_16BitPalette[_shadowColor]);
WRITE_UINT16(dst, _vm->_16BitPalette[_color]);
} else {
- if (_shadowMode != kNoShadowMode) {
- *(dst + s.pitch + 1) = _shadowColor;
- }
+ if (_shadowMode)
+ *(dst + dest.pitch + 1) = _shadowColor;
*dst = _color;
}
}
- dst += bitDepth;
+ dst += dest.format.bytesPerPixel;
bitCount++;
}
- dst += s.pitch - width * bitDepth;
+ dst += dest.pitch - width * dest.format.bytesPerPixel;
}
}
+
+int CharsetRendererPCE::getDrawWidthIntern(uint16 chr) {
+ if (_vm->_useCJKMode && chr > 127)
+ return _vm->_2byteWidth;
+ return CharsetRendererV3::getDrawWidthIntern(chr);
+}
+
+int CharsetRendererPCE::getDrawHeightIntern(uint16 chr) {
+ if (_vm->_useCJKMode && chr > 127)
+ return _vm->_2byteHeight;
+ return CharsetRendererV3::getDrawHeightIntern(chr);
+}
+
+void CharsetRendererPCE::setDrawCharIntern(uint16 chr) {
+ _sjisCurChar = (_vm->_useCJKMode && chr > 127) ? chr : 0;
+}
#endif
#ifdef ENABLE_SCUMM_7_8
@@ -1478,7 +1274,7 @@ void CharsetRendererNut::printChar(int chr, bool ignoreCharsetMask) {
void CharsetRendererNES::printChar(int chr, bool ignoreCharsetMask) {
int width, height, origWidth, origHeight;
VirtScreen *vs;
- byte *charPtr, *dst;
+ byte *charPtr;
// Init it here each time since it is cheap and fixes bug with
// charset after game load
@@ -1518,13 +1314,10 @@ void CharsetRendererNES::printChar(int chr, bool ignoreCharsetMask) {
_textScreenID = vs->number;
}
- if (ignoreCharsetMask || !vs->hasTwoBuffers) {
- dst = vs->getPixels(_left, drawTop);
- drawBits1(*vs, dst, charPtr, drawTop, origWidth, origHeight, vs->format.bytesPerPixel);
- } else {
- dst = (byte *)_vm->_textSurface.pixels + _top * _vm->_textSurface.pitch + _left;
- drawBits1(_vm->_textSurface, dst, charPtr, drawTop, origWidth, origHeight, _vm->_textSurface.format.bytesPerPixel);
- }
+ if (ignoreCharsetMask || !vs->hasTwoBuffers)
+ drawBits1(*vs, _left + vs->xstart, drawTop, charPtr, drawTop, origWidth, origHeight);
+ else
+ drawBits1(_vm->_textSurface, _left, _top, charPtr, drawTop, origWidth, origHeight);
if (_str.left > _left)
_str.left = _left;
@@ -1533,7 +1326,7 @@ void CharsetRendererNES::printChar(int chr, bool ignoreCharsetMask) {
if (_str.right < _left) {
_str.right = _left;
- if (_shadowMode != kNoShadowMode)
+ if (_shadowMode)
_str.right++;
}
@@ -1542,7 +1335,7 @@ void CharsetRendererNES::printChar(int chr, bool ignoreCharsetMask) {
}
void CharsetRendererNES::drawChar(int chr, Graphics::Surface &s, int x, int y) {
- byte *charPtr, *dst;
+ byte *charPtr;
int width, height;
if (!_trTable)
@@ -1552,18 +1345,215 @@ void CharsetRendererNES::drawChar(int chr, Graphics::Surface &s, int x, int y) {
width = getCharWidth(chr);
height = 8;
- dst = (byte *)s.pixels + y * s.pitch + x;
- drawBits1(s, dst, charPtr, y, width, height, s.format.bytesPerPixel);
+ drawBits1(s, x, y, charPtr, y, width, height);
}
-void CharsetRendererNES::drawBits1(const Graphics::Surface &s, byte *dst, const byte *src, int drawTop, int width, int height, uint8 bitDepth, bool scalex) {
+#ifdef USE_RGB_COLOR
+#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
+CharsetRendererTownsClassic::CharsetRendererTownsClassic(ScummEngine *vm) : CharsetRendererClassic(vm), _sjisCurChar(0) {
+}
+
+int CharsetRendererTownsClassic::getCharWidth(uint16 chr) {
+ int spacing = 0;
+
+ if (_vm->_useCJKMode) {
+ if ((chr & 0xff00) == 0xfd00) {
+ chr &= 0xff;
+ } else if (chr >= 256) {
+ spacing = 8;
+ } else if (useFontRomCharacter(chr)) {
+ spacing = 4;
+ }
+
+ if (spacing) {
+ if (_vm->_game.id == GID_MONKEY) {
+ spacing++;
+ if (_curId == 2)
+ spacing++;
+ } else if (_vm->_game.id != GID_INDY4 && _curId == 1) {
+ spacing++;
+ }
+ }
+ }
+
+ if (!spacing) {
+ int offs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
+ if (offs)
+ spacing = _fontPtr[offs] + (signed char)_fontPtr[offs + 2];
+ }
+
+ return spacing;
+}
+
+int CharsetRendererTownsClassic::getFontHeight() {
+ static const uint8 sjisFontHeightM1[] = { 0, 8, 9, 8, 9, 8, 9, 0, 0, 0 };
+ static const uint8 sjisFontHeightM2[] = { 0, 8, 9, 9, 9, 8, 9, 9, 9, 8 };
+ static const uint8 sjisFontHeightI4[] = { 0, 8, 9, 9, 9, 8, 8, 8, 8, 8 };
+ const uint8 *htbl = (_vm->_game.id == GID_MONKEY) ? sjisFontHeightM1 : ((_vm->_game.id == GID_INDY4) ? sjisFontHeightI4 : sjisFontHeightM2);
+ return _vm->_useCJKMode ? htbl[_curId] : _fontHeight;
+}
+
+void CharsetRendererTownsClassic::drawBitsN(const Graphics::Surface&, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height) {
+ if (_sjisCurChar) {
+ assert(_vm->_cjkFont);
+ _vm->_cjkFont->drawChar(_vm->_textSurface, _sjisCurChar, _left * _vm->_textSurfaceMultiplier, (_top - _vm->_screenTop) * _vm->_textSurfaceMultiplier, _vm->_townsCharsetColorMap[1], _shadowColor);
+ return;
+ }
+
+ bool scale2x = (_vm->_textSurfaceMultiplier == 2);
+ dst = (byte *)_vm->_textSurface.pixels + (_top - _vm->_screenTop) * _vm->_textSurface.pitch * _vm->_textSurfaceMultiplier + _left * _vm->_textSurfaceMultiplier;
+
+ int y, x;
+ int color;
+ byte numbits, bits;
+
+ int pitch = _vm->_textSurface.pitch - width;
+
+ assert(bpp == 1 || bpp == 2 || bpp == 4 || bpp == 8);
+ bits = *src++;
+ numbits = 8;
+ byte *cmap = _vm->_charsetColorMap;
+ byte *dst2 = dst;
+
+ if (_vm->_game.platform == Common::kPlatformFMTowns)
+ cmap = _vm->_townsCharsetColorMap;
+ if (scale2x) {
+ dst2 += _vm->_textSurface.pitch;
+ pitch <<= 1;
+ }
+
+ for (y = 0; y < height && y + drawTop < _vm->_textSurface.h; y++) {
+ for (x = 0; x < width; x++) {
+ color = (bits >> (8 - bpp)) & 0xFF;
+
+ if (color && y + drawTop >= 0) {
+ *dst = cmap[color];
+ if (scale2x)
+ dst[1] = dst2[0] = dst2[1] = dst[0];
+ }
+ dst++;
+
+ if (scale2x) {
+ dst++;
+ dst2 += 2;
+ }
+
+ bits <<= bpp;
+ numbits -= bpp;
+ if (numbits == 0) {
+ bits = *src++;
+ numbits = 8;
+ }
+ }
+ dst += pitch;
+ dst2 += pitch;
+ }
+}
+
+bool CharsetRendererTownsClassic::prepareDraw(uint16 chr) {
+ processCharsetColors();
+ bool noSjis = false;
+
+ if (_vm->_game.platform == Common::kPlatformFMTowns && _vm->_useCJKMode) {
+ if ((chr & 0x00ff) == 0x00fd) {
+ chr >>= 8;
+ noSjis = true;
+ }
+ }
+
+ if (useFontRomCharacter(chr) && !noSjis) {
+ setupShadowMode();
+ _charPtr = 0;
+ _sjisCurChar = chr;
+
+ _width = getCharWidth(chr);
+ // For whatever reason MI1 uses a different font width
+ // for alignment calculation and for drawing when
+ // charset 2 is active. This fixes some subtle glitches.
+ if (_vm->_game.id == GID_MONKEY && _curId == 2)
+ _width--;
+ _origWidth = _width;
+
+ _origHeight = _height = getFontHeight();
+ _offsX = _offsY = 0;
+ } else if (_vm->_useCJKMode && (chr >= 128) && !noSjis) {
+ setupShadowMode();
+ _origWidth = _width = _vm->_2byteWidth;
+ _origHeight = _height = _vm->_2byteHeight;
+ _charPtr = _vm->get2byteCharPtr(chr);
+ _offsX = _offsY = 0;
+ if (_shadowMode) {
+ _width++;
+ _height++;
+ }
+ } else {
+ _sjisCurChar = 0;
+ return CharsetRendererClassic::prepareDraw(chr);
+ }
+ return true;
+}
+
+void CharsetRendererTownsClassic::setupShadowMode() {
+ _shadowMode = true;
+ _shadowColor = _vm->_townsCharsetColorMap[0];
+ assert(_vm->_cjkFont);
+
+ if (((_vm->_game.id == GID_MONKEY) && (_curId == 2 || _curId == 4 || _curId == 6)) ||
+ ((_vm->_game.id == GID_MONKEY2) && (_curId != 1 && _curId != 5 && _curId != 9)) ||
+ ((_vm->_game.id == GID_INDY4) && (_curId == 2 || _curId == 3 || _curId == 4))) {
+ _vm->_cjkFont->setDrawingMode(Graphics::FontSJIS::kOutlineMode);
+ } else {
+ _vm->_cjkFont->setDrawingMode(Graphics::FontSJIS::kDefaultMode);
+ }
+
+ _vm->_cjkFont->toggleFlippedMode((_vm->_game.id == GID_MONKEY || _vm->_game.id == GID_MONKEY2) && _curId == 3);
+}
+
+bool CharsetRendererTownsClassic::useFontRomCharacter(uint16 chr) {
+ if (!_vm->_useCJKMode)
+ return false;
+
+ // Some SCUMM 5 games contain hard coded logic to determine whether to use
+ // the SCUMM fonts or the FM-Towns font rom to draw a character. For the other
+ // games we will simply check for a character greater 127.
+ if (chr < 128) {
+ if (((_vm->_game.id == GID_MONKEY2 && _curId != 0) || (_vm->_game.id == GID_INDY4 && _curId != 3)) && (chr > 31 && chr != 94 && chr != 95 && chr != 126 && chr != 127))
+ return true;
+ return false;
+ }
+ return true;
+}
+
+void CharsetRendererTownsClassic::processCharsetColors() {
+ for (int i = 0; i < (1 << _bytesPerPixel); i++) {
+ uint8 c = _vm->_charsetColorMap[i];
+
+ if (c > 16) {
+ uint8 t = (_vm->_currentPalette[c * 3] < 32) ? 4 : 12;
+ t |= ((_vm->_currentPalette[c * 3 + 1] < 32) ? 2 : 10);
+ t |= ((_vm->_currentPalette[c * 3 + 1] < 32) ? 1 : 9);
+ c = t;
+ }
+
+ if (c == 0)
+ c = _vm->_townsOverrideShadowColor;
+
+ c = ((c & 0x0f) << 4) | (c & 0x0f);
+ _vm->_townsCharsetColorMap[i] = c;
+ }
+}
+#endif
+#endif
+
+void CharsetRendererNES::drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height) {
+ byte *dst = (byte *)dest.getBasePtr(x, y);
for (int i = 0; i < 8; i++) {
byte c0 = src[i];
byte c1 = src[i + 8];
for (int j = 0; j < 8; j++)
dst[j] = _vm->_NESPalette[0][((c0 >> (7 - j)) & 1) | (((c1 >> (7 - j)) & 1) << 1) |
(_color ? 12 : 8)];
- dst += s.pitch;
+ dst += dest.pitch;
}
}
diff --git a/engines/scumm/charset.h b/engines/scumm/charset.h
index 4c657b475e..b8f1d84045 100644
--- a/engines/scumm/charset.h
+++ b/engines/scumm/charset.h
@@ -25,6 +25,7 @@
#include "common/scummsys.h"
#include "common/rect.h"
#include "graphics/sjis.h"
+#include "scumm/scumm.h"
#include "scumm/gfx.h"
#include "scumm/saveload.h"
@@ -78,10 +79,6 @@ public:
void addLinebreaks(int a, byte *str, int pos, int maxwidth);
void translateColor();
-#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
- void processTownsCharsetColors(uint8 bytesPerPixel);
-#endif
-
virtual void setCurID(int32 id) = 0;
int getCurID() { return _curId; }
@@ -101,31 +98,29 @@ protected:
int _fontHeight;
int _numChars;
- enum ShadowMode {
- kNoShadowMode,
- kFMTOWNSShadowMode,
- kNormalShadowMode
- };
byte _shadowColor;
- ShadowMode _shadowMode;
-
- void enableShadow(bool enable);
- virtual void drawBits1(const Graphics::Surface &s, byte *dst, const byte *src, int drawTop, int width, int height, uint8 bitDepth, bool scale2x = false);
-
+ bool _shadowMode;
public:
CharsetRendererCommon(ScummEngine *vm);
void setCurID(int32 id);
- int getFontHeight();
+ virtual int getFontHeight();
};
class CharsetRendererClassic : public CharsetRendererCommon {
protected:
- void drawBitsN(const Graphics::Surface &s, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height, bool scale2x = false);
+ virtual void drawBitsN(const Graphics::Surface &s, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height);
+ void printCharIntern(bool is2byte, const byte *charPtr, int origWidth, int origHeight, int width, int height, VirtScreen *vs, bool ignoreCharsetMask);
+ virtual bool prepareDraw(uint16 chr);
+
+ int _width, _height, _origWidth, _origHeight;
+ int _offsX, _offsY;
+ const byte *_charPtr;
- void printCharIntern(bool is2byte, const byte *charPtr, int origWidth, int origHeight, int width, int height, VirtScreen *vs, bool ignoreCharsetMask);
+ // On which virtual screen will be drawn right now
+ VirtScreenNumber _drawScreen;
public:
CharsetRendererClassic(ScummEngine *vm) : CharsetRendererCommon(vm) {}
@@ -134,18 +129,34 @@ public:
void drawChar(int chr, Graphics::Surface &s, int x, int y);
int getCharWidth(uint16 chr);
+};
+
+#ifdef USE_RGB_COLOR
+#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
+class CharsetRendererTownsClassic : public CharsetRendererClassic {
+public:
+ CharsetRendererTownsClassic(ScummEngine *vm);
+
+ int getCharWidth(uint16 chr);
+ int getFontHeight();
- // Some SCUMM 5 games contain hard coded logic to determine whether to use
- // the SCUMM fonts or the FM-Towns font rom to draw a character. For the other
- // games we will simply check for a character greater 127.
- bool useTownsFontRomCharacter(uint16 chr);
+private:
+ void drawBitsN(const Graphics::Surface &s, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height);
+ bool prepareDraw(uint16 chr);
+ void setupShadowMode();
+ bool useFontRomCharacter(uint16 chr);
+ void processCharsetColors();
+
+ uint16 _sjisCurChar;
};
+#endif
+#endif
class CharsetRendererNES : public CharsetRendererCommon {
protected:
byte *_trTable;
- void drawBits1(const Graphics::Surface &s, byte *dst, const byte *src, int drawTop, int width, int height, uint8 bitDepth, bool scale2x = false);
+ void drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height);
public:
CharsetRendererNES(ScummEngine *vm) : CharsetRendererCommon(vm) {}
@@ -160,6 +171,12 @@ public:
class CharsetRendererV3 : public CharsetRendererCommon {
protected:
+ virtual void enableShadow(bool enable);
+ virtual void drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height);
+ virtual int getDrawWidthIntern(uint16 chr);
+ virtual int getDrawHeightIntern(uint16 chr);
+ virtual void setDrawCharIntern(uint16 chr) {}
+
const byte *_widthTable;
public:
@@ -169,16 +186,40 @@ public:
void drawChar(int chr, Graphics::Surface &s, int x, int y);
void setCurID(int32 id);
void setColor(byte color);
+ virtual int getCharWidth(uint16 chr);
+};
+
+class CharsetRendererTownsV3 : public CharsetRendererV3 {
+public:
+ CharsetRendererTownsV3(ScummEngine *vm);
+
int getCharWidth(uint16 chr);
+ int getFontHeight();
+
+private:
+ void enableShadow(bool enable);
+ void drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height);
+#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
+ int getDrawWidthIntern(uint16 chr);
+ int getDrawHeightIntern(uint16 chr);
+ void setDrawCharIntern(uint16 chr);
+#endif
+ uint16 _sjisCurChar;
};
#ifdef USE_RGB_COLOR
class CharsetRendererPCE : public CharsetRendererV3 {
-protected:
- void drawBits1(const Graphics::Surface &s, byte *dst, const byte *src, int drawTop, int width, int height, uint8 bitDepth, bool scale2x = false);
+private:
+ void drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height);
+
+ int getDrawWidthIntern(uint16 chr);
+ int getDrawHeightIntern(uint16 chr);
+ void setDrawCharIntern(uint16 chr);
+
+ uint16 _sjisCurChar;
public:
- CharsetRendererPCE(ScummEngine *vm) : CharsetRendererV3(vm) {}
+ CharsetRendererPCE(ScummEngine *vm) : CharsetRendererV3(vm), _sjisCurChar(0) {}
void setColor(byte color);
};
diff --git a/engines/scumm/costume.cpp b/engines/scumm/costume.cpp
index 4ca4988605..eb3cc3262c 100644
--- a/engines/scumm/costume.cpp
+++ b/engines/scumm/costume.cpp
@@ -545,6 +545,13 @@ void ClassicCostumeRenderer::proc3_ami(Codec1 &v1) {
oldXpos = v1.x;
oldScaleIndexX = _scaleIndexX;
+ // Indy4 Amiga always uses the room map to match colors to the currently
+ // setup palette in the actor code in the original, thus we need to do this
+ // mapping over here too.
+ byte *amigaMap = 0;
+ if (_vm->_game.platform == Common::kPlatformAmiga && _vm->_game.id == GID_INDY4)
+ amigaMap = _vm->_roomPalette;
+
do {
len = *src++;
color = len >> v1.shr;
@@ -556,7 +563,10 @@ void ClassicCostumeRenderer::proc3_ami(Codec1 &v1) {
masked = (y < 0 || y >= _out.h) || (v1.x < 0 || v1.x >= _out.w) || (v1.mask_ptr && (mask[0] & maskbit));
if (color && !masked) {
- *dst = _palette[color];
+ if (amigaMap)
+ *dst = amigaMap[_palette[color]];
+ else
+ *dst = _palette[color];
}
if (_scaleX == 255 || v1.scaletable[_scaleIndexX] < _scaleX) {
diff --git a/engines/scumm/cursor.cpp b/engines/scumm/cursor.cpp
index a8adb4d5c5..36f06a4889 100644
--- a/engines/scumm/cursor.cpp
+++ b/engines/scumm/cursor.cpp
@@ -22,6 +22,9 @@
#include "common/system.h"
#include "common/util.h"
#include "graphics/cursorman.h"
+#ifdef ENABLE_HE
+#include "graphics/wincursor.h"
+#endif
#include "scumm/bomp.h"
#include "scumm/charset.h"
#include "scumm/he/intern_he.h"
@@ -177,12 +180,8 @@ void ScummEngine_v70he::setDefaultCursor() {
0xff, 0xff, 0xff,
0, 0, 0, };
- if (_bytesPerPixel == 2) {
- for (i = 0; i < 1024; i++)
- WRITE_UINT16(_grabbedCursor + i * 2, 5);
- } else {
- memset(_grabbedCursor, 5, sizeof(_grabbedCursor));
- }
+
+ memset(_grabbedCursor, 5, sizeof(_grabbedCursor));
_cursor.hotspotX = _cursor.hotspotY = 2;
src = default_he_cursor;
@@ -195,16 +194,10 @@ void ScummEngine_v70he::setDefaultCursor() {
for (j = 0; j < 32; j++) {
switch ((p & (0x3 << 14)) >> 14) {
case 1:
- if (_bytesPerPixel == 2)
- WRITE_UINT16(_grabbedCursor + 64 * i + j * 2, get16BitColor(palette[4], palette[5], palette[6]));
- else
- _grabbedCursor[32 * i + j] = 0xfe;
+ _grabbedCursor[32 * i + j] = 0xfe;
break;
case 2:
- if (_bytesPerPixel == 2)
- WRITE_UINT16(_grabbedCursor + 64 * i + j * 2, get16BitColor(palette[0], palette[1], palette[2]));
- else
- _grabbedCursor[32 * i + j] = 0xfd;
+ _grabbedCursor[32 * i + j] = 0xfd;
break;
default:
break;
@@ -216,15 +209,63 @@ void ScummEngine_v70he::setDefaultCursor() {
}
}
+ // Since white color position is not guaranteed
+ // we setup our own palette if supported by backend
+ CursorMan.disableCursorPalette(false);
+ CursorMan.replaceCursorPalette(palette, 0xfd, 3);
+
+ updateCursor();
+}
+
+#ifdef ENABLE_HE
+void ScummEngine_v80he::setDefaultCursor() {
+ // v80+ games use the default Windows cursor instead of the usual
+ // default HE cursor.
+ Graphics::Cursor *cursor = Graphics::makeDefaultWinCursor();
+
+ // Clear the cursor
+ if (_bytesPerPixel == 2) {
+ for (int i = 0; i < 1024; i++)
+ WRITE_UINT16(_grabbedCursor + i * 2, 5);
+ } else {
+ memset(_grabbedCursor, 5, sizeof(_grabbedCursor));
+ }
+
+ _cursor.width = cursor->getWidth();
+ _cursor.height = cursor->getHeight();
+ _cursor.hotspotX = cursor->getHotspotX();
+ _cursor.hotspotY = cursor->getHotspotY();
+
+ const byte *surface = cursor->getSurface();
+ const byte *palette = cursor->getPalette();
+
+ for (uint16 y = 0; y < _cursor.height; y++) {
+ for (uint16 x = 0; x < _cursor.width; x++) {
+ byte pixel = *surface++;
+
+ if (pixel != cursor->getKeyColor()) {
+ pixel -= cursor->getPaletteStartIndex();
+
+ if (_bytesPerPixel == 2)
+ WRITE_UINT16(_grabbedCursor + (y * _cursor.width + x) * 2, get16BitColor(palette[pixel * 3], palette[pixel * 3 + 1], palette[pixel * 3 + 2]));
+ else
+ _grabbedCursor[y * _cursor.width + x] = (pixel == 0) ? 0xfd : 0xfe;
+ }
+ }
+ }
+
if (_bytesPerPixel == 1) {
// Since white color position is not guaranteed
// we setup our own palette if supported by backend
CursorMan.disableCursorPalette(false);
- CursorMan.replaceCursorPalette(palette, 0xfd, 3);
+ CursorMan.replaceCursorPalette(palette, 0xfd, cursor->getPaletteCount());
}
+ delete cursor;
+
updateCursor();
}
+#endif
void ScummEngine_v6::setCursorFromImg(uint img, uint room, uint imgindex) {
int w, h;
@@ -568,7 +609,16 @@ void ScummEngine_v5::setBuiltinCursor(int idx) {
for (i = 0; i < 1024; i++)
WRITE_UINT16(_grabbedCursor + i * 2, 0xFF);
} else {
- color = default_cursor_colors[idx];
+ // Indy4 Amiga uses its own color set for the cursor image.
+ // This is patchwork code to make the cursor flash in correct colors.
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ static const uint8 indy4AmigaColors[4] = {
+ 252, 252, 253, 254
+ };
+ color = indy4AmigaColors[idx];
+ } else {
+ color = default_cursor_colors[idx];
+ }
memset(_grabbedCursor, 0xFF, sizeof(_grabbedCursor));
}
diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp
index 18f2f4ddec..6da3578530 100644
--- a/engines/scumm/detection.cpp
+++ b/engines/scumm/detection.cpp
@@ -33,6 +33,8 @@
#include "common/savefile.h"
#include "common/system.h"
+#include "audio/mididrv.h"
+
#include "scumm/detection.h"
#include "scumm/detection_tables.h"
#include "scumm/he/intern_he.h"
@@ -142,6 +144,14 @@ Common::String ScummEngine_v70he::generateFilename(const int room) const {
Common::String result;
char id = 0;
+ Common::String bPattern = _filenamePattern.pattern;
+
+ // Special cases for Blue's games, which share common (b) files
+ if (_game.id == GID_BIRTHDAYYELLOW || _game.id == GID_BIRTHDAYRED)
+ bPattern = "Blue'sBirthday";
+ else if (_game.id == GID_TREASUREHUNT)
+ bPattern = "Blue'sTreasureHunt";
+
switch (_filenamePattern.genMethod) {
case kGenHEMac:
case kGenHEMacNoParens:
@@ -154,13 +164,7 @@ Common::String ScummEngine_v70he::generateFilename(const int room) const {
switch (disk) {
case 2:
id = 'b';
- // Special cases for Blue's games, which share common (b) files
- if (_game.id == GID_BIRTHDAY && !(_game.features & GF_DEMO))
- result = "Blue'sBirthday.(b)";
- else if (_game.id == GID_TREASUREHUNT)
- result = "Blue'sTreasureHunt.(b)";
- else
- result = Common::String::format("%s.(b)", _filenamePattern.pattern);
+ result = bPattern + ".(b)";
break;
case 1:
id = 'a';
@@ -185,10 +189,11 @@ Common::String ScummEngine_v70he::generateFilename(const int room) const {
// For mac they're stored in game binary
result = _filenamePattern.pattern;
} else {
+ Common::String pattern = id == 'b' ? bPattern : _filenamePattern.pattern;
if (_filenamePattern.genMethod == kGenHEMac)
- result = Common::String::format("%s (%c)", _filenamePattern.pattern, id);
+ result = Common::String::format("%s (%c)", pattern.c_str(), id);
else
- result = Common::String::format("%s %c", _filenamePattern.pattern, id);
+ result = Common::String::format("%s %c", pattern.c_str(), id);
}
}
@@ -303,6 +308,46 @@ static void closeDiskImage(ScummDiskImage *img) {
SearchMan.remove("tmpDiskImgDir");
}
+/*
+ * This function tries to detect if a speech file exists.
+ * False doesn't necessarily mean there are no speech files.
+ */
+static bool detectSpeech(const Common::FSList &fslist, const GameSettings *gs) {
+ if (gs->id == GID_MONKEY || gs->id == GID_MONKEY2) {
+ // FMTOWNS monkey and monkey2 games don't have speech but may have .sou files
+ if (gs->platform == Common::kPlatformFMTowns)
+ return false;
+
+ const char *const basenames[] = { gs->gameid, "monster", 0 };
+ static const char *const extensions[] = { "sou",
+#ifdef USE_FLAC
+ "sof",
+#endif
+#ifdef USE_VORBIS
+ "sog",
+#endif
+#ifdef USE_MAD
+ "so3",
+#endif
+ 0 };
+
+ for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
+ if (file->isDirectory())
+ continue;
+
+ for (int i = 0; basenames[i]; ++i) {
+ Common::String basename = Common::String(basenames[i]) + ".";
+
+ for (int j = 0; extensions[j]; ++j) {
+ if ((basename + extensions[j]).equalsIgnoreCase(file->getName()))
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
// The following function tries to detect the language for COMI and DIG
static Common::Language detectLanguage(const Common::FSList &fslist, byte id) {
// First try to detect Chinese translation
@@ -431,7 +476,7 @@ static void computeGameSettingsFromMD5(const Common::FSList &fslist, const GameF
}
}
-static void composeFileHashMap(DescMap &fileMD5Map, const Common::FSList &fslist, int depth, const char **globs) {
+static void composeFileHashMap(DescMap &fileMD5Map, const Common::FSList &fslist, int depth, const char *const *globs) {
if (depth <= 0)
return;
@@ -449,7 +494,7 @@ static void composeFileHashMap(DescMap &fileMD5Map, const Common::FSList &fslist
continue;
bool matched = false;
- for (const char **glob = globs; *glob; glob++)
+ for (const char *const *glob = globs; *glob; glob++)
if (file->getName().matchString(*glob, true)) {
matched = true;
break;
@@ -603,6 +648,10 @@ static void detectGames(const Common::FSList &fslist, Common::List<DetectorResul
// HACK: Perhaps it is some modified translation?
dr.language = detectLanguage(fslist, g->id);
+ // Detect if there are speech files in this unknown game
+ //if (detectSpeech(fslist, g))
+ // dr.game.guioptions &= ~GUIO_NOSPEECH;
+
// Add the game/variant to the candidates list if it is consistent
// with the file(s) we are seeing.
if (testGame(g, fileMD5Map, file))
@@ -952,7 +1001,7 @@ GameList ScummMetaEngine::detectGames(const Common::FSList &fslist) const {
}
}
- dg.setGUIOptions(x->game.guioptions | MidiDriver::musicType2GUIO(x->game.midi));
+ dg.setGUIOptions(x->game.guioptions + MidiDriver::musicType2GUIO(x->game.midi));
dg.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(x->language));
detectedGames.push_back(dg);
diff --git a/engines/scumm/detection.h b/engines/scumm/detection.h
index 720c4bb750..ad8b3cec12 100644
--- a/engines/scumm/detection.h
+++ b/engines/scumm/detection.h
@@ -89,7 +89,7 @@ struct GameSettings {
/**
* Game GUI options. Used to enable/disable certain GUI widgets
*/
- uint32 guioptions;
+ const char *guioptions;
};
enum FilenameGenMethod {
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index e510c46cf2..31ba44b693 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -49,7 +49,7 @@ namespace Scumm {
* This table contains list of directories which could contain game data
* and which should be looked into during detection.
*/
-static const char *directoryGlobs[] = {
+static const char *const directoryGlobs[] = {
"rooms *", // Mac version of indy3/loom
0
};
@@ -179,14 +179,6 @@ static const Engines::ObsoleteGameID obsoleteGameIDsTable[] = {
{NULL, NULL, UNK}
};
-using Common::GUIO_NONE;
-using Common::GUIO_NOLAUNCHLOAD;
-using Common::GUIO_NOMIDI;
-using Common::GUIO_NOSPEECH;
-using Common::GUIO_MIDITOWNS;
-using Common::GUIO_MIDIADLIB;
-using Common::GUIO_MIDIMT32;
-
// 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
// the correct GameSettings for a given game variant.
@@ -207,206 +199,207 @@ using Common::GUIO_MIDIMT32;
// 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_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 | 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 | 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_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_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},
+ {"maniac", "Apple II", 0, GID_MANIAC, 0, 0, MDT_APPLEIIGS, 0, Common::kPlatformApple2GS, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"maniac", "C64", 0, GID_MANIAC, 0, 0, MDT_C64, 0, Common::kPlatformC64, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI) },
+ {"maniac", "V1", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, 0, Common::kPlatformPC, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"maniac", "V1 Demo", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformPC, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"maniac", "NES", 0, GID_MANIAC, 1, 0, MDT_NONE, 0, Common::kPlatformNES, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"maniac", "V2", "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"maniac", "V2 Demo", "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformPC, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+
+ {"zak", "V1", "v1", GID_ZAK, 1, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"zak", "V2", "v2", GID_ZAK, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"zak", "FM-TOWNS", 0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS)},
+
+ {"indy3", "EGA", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, 0, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"indy3", "No AdLib", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"indy3", "VGA", "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, Common::kPlatformPC, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"indy3", "FM-TOWNS", 0, GID_INDY3, 3, 0, MDT_TOWNS, GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS)},
+
+ {"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO1(GUIO_NOSPEECH)},
+ {"loom", "No AdLib", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS, 0, UNK, GUIO2(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},
+ {"loom", "PC-Engine", 0, GID_LOOM, 3, 0, MDT_NONE, GF_AUDIOTRACKS | GF_OLD256 | GF_16BIT_COLOR, Common::kPlatformPCEngine, GUIO2(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 | GUIO_MIDITOWNS},
- {"loom", "VGA", "vga", GID_LOOM, 4, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"loom", "FM-TOWNS", 0, GID_LOOM, 3, 0, MDT_TOWNS, GF_AUDIOTRACKS | GF_OLD256, Common::kPlatformFMTowns, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS)},
+ {"loom", "VGA", "vga", GID_LOOM, 4, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformPC, GUIO2(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},
+ {"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO2(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_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},
+ {"monkey", "VGA", "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO1(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, GUIO1(GUIO_NOSPEECH)},
+ {"monkey", "No AdLib", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR, GF_16COLOR, Common::kPlatformAtariST, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"monkey", "Demo", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"monkey", "CD", 0, GID_MONKEY, 5, 0, MDT_ADLIB, GF_AUDIOTRACKS, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
+ {"monkey", "FM-TOWNS", 0, GID_MONKEY, 5, 0, MDT_TOWNS, GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS)},
+ {"monkey", "SEGA", 0, GID_MONKEY, 5, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformSegaCD, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
- {"monkey2", "", 0, GID_MONKEY2, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH},
- {"monkey2", "FM-TOWNS", 0, GID_MONKEY2, 5, 0, MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_MIDITOWNS | GUIO_MIDIADLIB | GUIO_MIDIMT32},
+ {"monkey2", "", 0, GID_MONKEY2, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO1(GUIO_NOSPEECH)},
+ {"monkey2", "FM-TOWNS", 0, GID_MONKEY2, 5, 0, MDT_PCSPK | MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO4(GUIO_NOSPEECH, GUIO_MIDITOWNS, GUIO_MIDIADLIB, GUIO_MIDIMT32)},
- {"atlantis", "", 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NONE},
- {"atlantis", "Floppy", 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH},
- {"atlantis", "FM-TOWNS", 0, GID_INDY4, 5, 0, MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO_MIDITOWNS | GUIO_MIDIADLIB | GUIO_MIDIMT32},
+ {"atlantis", "", 0, GID_INDY4, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO1(GUIO_NONE)},
+ {"atlantis", "Floppy", 0, GID_INDY4, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO1(GUIO_NOSPEECH)},
+ {"atlantis", "FM-TOWNS", 0, GID_INDY4, 5, 0, MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO3(GUIO_MIDITOWNS, GUIO_MIDIADLIB, GUIO_MIDIMT32)},
- {"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE},
- {"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH},
+ {"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO1(GUIO_NONE)},
+ {"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO1(GUIO_NOSPEECH)},
- {"samnmax", "", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE},
- {"samnmax", "Floppy", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH},
+ {"samnmax", "", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO1(GUIO_NONE)},
+ {"samnmax", "Floppy", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO1(GUIO_NOSPEECH)},
#ifdef ENABLE_SCUMM_7_8
- {"ft", 0, 0, GID_FT, 7, 0, MDT_NONE, 0, UNK, GUIO_NOMIDI},
+ {"ft", 0, 0, GID_FT, 7, 0, MDT_NONE, 0, UNK, GUIO1(GUIO_NOMIDI)},
- {"dig", 0, 0, GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO_NOMIDI},
+ {"dig", 0, 0, GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO1(GUIO_NOMIDI)},
- {"comi", 0, 0, GID_CMI, 8, 0, MDT_NONE, 0, Common::kPlatformWindows, GUIO_NOMIDI},
+ {"comi", 0, 0, GID_CMI, 8, 0, MDT_NONE, 0, Common::kPlatformWindows, GUIO1(GUIO_NOMIDI)},
#endif
// Humongous Entertainment Scumm Version 6
- {"activity", "", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"funpack", 0, 0, GID_FUNPACK, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"fbpack", 0, 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
+ {"activity", "", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"funpack", 0, 0, GID_FUNPACK, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"fbpack", 0, 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
- {"brstorm", 0, 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"fbear", "HE 62", 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"fbear", "HE 70", 0, GID_FBEAR, 6, 70, MDT_NONE, GF_USE_KEY, Common::kPlatformWindows, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"brstorm", 0, 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"fbear", "HE 62", 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"fbear", "HE 70", 0, GID_FBEAR, 6, 70, MDT_NONE, GF_USE_KEY, Common::kPlatformWindows, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"puttmoon", "", 0, GID_PUTTMOON, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"puttmoon", "HE 70", 0, GID_PUTTMOON, 6, 70, MDT_NONE, GF_USE_KEY, Common::kPlatformWindows, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"puttmoon", "", 0, GID_PUTTMOON, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"puttmoon", "HE 70", 0, GID_PUTTMOON, 6, 70, MDT_NONE, GF_USE_KEY, Common::kPlatformWindows, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"puttputt", "HE 60", 0, GID_HEGAME, 6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"puttputt", "HE 61", 0, GID_HEGAME, 6, 61, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"puttputt", "HE 62", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
- {"puttputt", "Demo", 0, GID_PUTTDEMO, 6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD},
+ {"puttputt", "HE 60", 0, GID_HEGAME, 6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"puttputt", "HE 61", 0, GID_HEGAME, 6, 61, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"puttputt", "HE 62", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
+ {"puttputt", "Demo", 0, GID_PUTTDEMO, 6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO1(GUIO_NOLAUNCHLOAD)},
// The following are meant to be generic HE game variants and as such do
// not specify a game ID. Make sure that these are last in the table, else
// they'll override more specific entries that follow later on.
- {"", "HE 70", 0, GID_HEGAME, 6, 70, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"", "HE 70", 0, GID_HEGAME, 6, 70, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
#ifdef ENABLE_HE
// HE CUP demos
- {"", "HE CUP", 0, GID_HECUP, 6, 200, MDT_NONE, 0, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI | GUIO_NOSPEECH},
+ {"", "HE CUP", 0, GID_HECUP, 6, 200, MDT_NONE, 0, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOSPEECH)},
// Humongous Entertainment Scumm Version 7.1
// The first version to use 640x480 resolution and wizImages
// There are also 7.1 versions of freddemo, airdemo and farmdemo
- {"catalog", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"freddi", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"catalog", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"freddi", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Humongous Entertainment Scumm Version 7.2
- {"airport", "", 0, GID_HEGAME, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"airport", "", 0, GID_HEGAME, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Changed o_getResourceSize to cover all resource types
- {"farm", "", 0, GID_HEGAME, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"puttzoo", "", 0, GID_HEGAME, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"farm", "", 0, GID_HEGAME, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"puttzoo", "", 0, GID_HEGAME, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Added VAR_PLATFORM variable
- {"jungle", "", 0, GID_HEGAME, 6, 74, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"jungle", "", 0, GID_HEGAME, 6, 74, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Humongous Entertainment Scumm Version 8.0 ? Scummsrc.80
- {"freddi2", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"pajama", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"freddi2", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"pajama", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"balloon", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"dog", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"maze", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"balloon", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"dog", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"maze", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"water", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"water", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// condMaskCode value changed in setUserCondition & setTalkCondition
- {"putttime", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"socks", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"putttime", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"socks", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Humongous Entertainment Scumm Version 9.0 ? Scummsys.90
- {"baseball", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"thinkerk", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"thinker1", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"spyfox", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"baseball", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"thinkerk", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"thinker1", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"spyfox", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"freddi3", "", 0, GID_FREDDI3, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"freddi3", "HE 99", 0, GID_FREDDI3, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"freddi3", "", 0, GID_FREDDI3, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"freddi3", "HE 99", 0, GID_FREDDI3, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Humongous Entertainment Scumm Version 9.5 ? Scummsys.95
- {"pajama2", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"chase", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"pajama2", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"chase", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Humongous Entertainment Scumm Version 9.8 ? Scummsys.98
// these and later games can easily be identified by the .(a) file instead of a .he1
// and INIB chunk in the .he0
- {"lost", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"lost", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"puttrace", "HE 98", 0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"puttrace", "HE 98.5", 0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"puttrace", "HE 99", 0, GID_PUTTRACE, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"puttrace", "HE 98", 0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"puttrace", "HE 98.5", 0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"puttrace", "HE 99", 0, GID_PUTTRACE, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"bluesabctime", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"BluesBirthday", 0, 0, GID_BIRTHDAY, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"soccer", "", 0, GID_SOCCER, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"bluesabctime", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"BluesBirthday", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"BluesBirthday", "Red", 0, GID_BIRTHDAYRED, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"BluesBirthday", "Yellow", 0, GID_BIRTHDAYYELLOW, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"soccer", "", 0, GID_SOCCER, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Global scripts increased to 2048
- {"blues123time", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"freddi4", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"freddi4", "unenc", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_HE_985, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"blues123time", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"freddi4", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"freddi4", "unenc", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_HE_985, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Humongous Entertainment Scumm Version 9.9 ? Scummsys.99
- {"football", 0, 0, GID_FOOTBALL, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"pajama3", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"puttcircus", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"spyfox2", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"mustard", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"football", 0, 0, GID_FOOTBALL, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"pajama3", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"puttcircus", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"spyfox2", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"mustard", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Added the use of fonts
- {"FreddisFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"SamsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"PuttsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"FreddisFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"SamsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"PuttsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Added the use of smacker videos
- {"BluesTreasureHunt", 0, 0, GID_TREASUREHUNT, 6, 99, MDT_NONE, GF_HE_LOCALIZED | GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"BluesTreasureHunt", 0, 0, GID_TREASUREHUNT, 6, 99, MDT_NONE, GF_HE_LOCALIZED | GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
#ifdef USE_RGB_COLOR
// Added 16bit color
- {"arttime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"baseball2001", 0, 0, GID_BASEBALL2001, 6, 99, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"readtime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"SoccerMLS", 0, 0, GID_SOCCERMLS, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"spyozon", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"arttime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"baseball2001", 0, 0, GID_BASEBALL2001, 6, 99, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"readtime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"SoccerMLS", 0, 0, GID_SOCCERMLS, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"spyozon", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
- {"freddicove", "", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"freddicove", "unenc", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"freddicove", "HE 100", 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"freddicove", "", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"freddicove", "unenc", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"freddicove", "HE 100", 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Restructured the Scumm engine
- {"pjgames", 0, 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"pjgames", 0, 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// Added the use of bink videos
- {"Baseball2003", 0, 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"basketball", 0, 0, GID_BASKETBALL, 6, 100, MDT_NONE, GF_USE_KEY| GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"football2002", 0, 0, GID_FOOTBALL, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"Soccer2004", 0, 0, GID_SOCCER2004, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"Baseball2003", 0, 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"basketball", 0, 0, GID_BASKETBALL, 6, 100, MDT_NONE, GF_USE_KEY| GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"football2002", 0, 0, GID_FOOTBALL, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"Soccer2004", 0, 0, GID_SOCCER2004, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
// U32 code required, for testing only
- {"moonbase", 0, 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"moonbase", "Demo", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR | GF_DEMO, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"moonbase", 0, 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"moonbase", "Demo", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR | GF_DEMO, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
#endif
// The following are meant to be generic HE game variants and as such do
// not specify a game ID. Make sure that these are last in the table, else
// they'll override more specific entries that follow later on.
- {"", "HE 71", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 72", 0, GID_HEGAME, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 73", 0, GID_HEGAME, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 74", 0, GID_HEGAME, 6, 74, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 80", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 85", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 90", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 95", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 98", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 98.5", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 99", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
- {"", "HE 100", 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO_NOLAUNCHLOAD | GUIO_NOMIDI},
+ {"", "HE 71", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 72", 0, GID_HEGAME, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 73", 0, GID_HEGAME, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 74", 0, GID_HEGAME, 6, 74, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 80", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 85", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 90", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 95", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 98", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 98.5", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 99", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
+ {"", "HE 100", 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI)},
#endif
{NULL, NULL, 0, 0, 0, MDT_NONE, 0, 0, UNK, 0}
};
diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp
index f7f0c7d7ec..20aedae089 100644
--- a/engines/scumm/dialogs.cpp
+++ b/engines/scumm/dialogs.cpp
@@ -23,6 +23,7 @@
#include "common/savefile.h"
#include "common/system.h"
#include "common/events.h"
+#include "common/localization.h"
#include "common/translation.h"
#include "graphics/scaler.h"
@@ -171,29 +172,33 @@ static const ResString string_map_table_v6[] = {
};
static const ResString string_map_table_v345[] = {
- {1, "Insert Disk %c and Press Button to Continue."},
- {2, "Unable to Find %s, (%c%d) Press Button."},
- {3, "Error reading disk %c, (%c%d) Press Button."},
- {4, "Game Paused. Press SPACE to Continue."},
- {5, "Are you sure you want to restart? (Y/N)"},
- {6, "Are you sure you want to quit? (Y/N)"},
+ {1, _s("Insert Disk %c and Press Button to Continue.")},
+ {2, _s("Unable to Find %s, (%c%d) Press Button.")},
+ {3, _s("Error reading disk %c, (%c%d) Press Button.")},
+ {4, _s("Game Paused. Press SPACE to Continue.")},
+ // I18N: You may specify 'Yes' symbol at the end of the line, like this:
+ // "Moechten Sie wirklich neu starten? (J/N)J"
+ // Will react to J as 'Yes'
+ {5, _s("Are you sure you want to restart? (Y/N)")},
+ // I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+ {6, _s("Are you sure you want to quit? (Y/N)")},
// Added in SCUMM4
- {7, "Save"},
- {8, "Load"},
- {9, "Play"},
- {10, "Cancel"},
- {11, "Quit"},
- {12, "OK"},
- {13, "Insert save/load game disk"},
- {14, "You must enter a name"},
- {15, "The game was NOT saved (disk full?)"},
- {16, "The game was NOT loaded"},
- {17, "Saving '%s'"},
- {18, "Loading '%s'"},
- {19, "Name your SAVE game"},
- {20, "Select a game to LOAD"},
- {28, "Game title"}
+ {7, _s("Save")},
+ {8, _s("Load")},
+ {9, _s("Play")},
+ {10, _s("Cancel")},
+ {11, _s("Quit")},
+ {12, _s("OK")},
+ {13, _s("Insert save/load game disk")},
+ {14, _s("You must enter a name")},
+ {15, _s("The game was NOT saved (disk full?)")},
+ {16, _s("The game was NOT loaded")},
+ {17, _s("Saving '%s'")},
+ {18, _s("Loading '%s'")},
+ {19, _s("Name your SAVE game")},
+ {20, _s("Select a game to LOAD")},
+ {28, _s("Game title)")}
};
#pragma mark -
@@ -278,7 +283,9 @@ HelpDialog::HelpDialog(const GameSettings &game)
_numPages = ScummHelp::numPages(_game.id);
+ // I18N: Previous page button
_prevButton = new GUI::ButtonWidget(this, "ScummHelp.Prev", _("~P~revious"), 0, kPrevCmd);
+ // I18N: Next page button
_nextButton = new GUI::ButtonWidget(this, "ScummHelp.Next", _("~N~ext"), 0, kNextCmd);
new GUI::ButtonWidget(this, "ScummHelp.Close", _("~C~lose"), 0, GUI::kCloseCmd);
_prevButton->clearFlags(WIDGET_ENABLED);
@@ -429,7 +436,7 @@ const Common::String InfoDialog::queryResString(int stringno) {
else if (_vm->_game.version >= 3)
result = _vm->getStringAddress(string_map_table_v345[stringno - 1].num);
else
- return string_map_table_v345[stringno - 1].string;
+ return _(string_map_table_v345[stringno - 1].string);
if (result && *result == '/') {
_vm->translateText(result, buf);
@@ -437,7 +444,7 @@ const Common::String InfoDialog::queryResString(int stringno) {
}
if (!result || *result == '\0') { // Gracelessly degrade to english :)
- return string_map_table_v345[stringno - 1].string;
+ return _(string_map_table_v345[stringno - 1].string);
}
// Convert to a proper string (take care of FF codes)
@@ -482,10 +489,14 @@ ConfirmDialog::ConfirmDialog(ScummEngine *scumm, int res)
}
void ConfirmDialog::handleKeyDown(Common::KeyState state) {
- if (state.keycode == Common::KEYCODE_n || state.ascii == _noKey) {
+ Common::KeyCode keyYes, keyNo;
+
+ Common::getLanguageYesNo(keyYes, keyNo);
+
+ if (state.keycode == Common::KEYCODE_n || state.ascii == _noKey || state.ascii == keyNo) {
setResult(0);
close();
- } else if (state.keycode == Common::KEYCODE_y || state.ascii == _yesKey) {
+ } else if (state.keycode == Common::KEYCODE_y || state.ascii == _yesKey || state.ascii == keyYes) {
setResult(1);
close();
} else
@@ -582,10 +593,10 @@ void SubtitleSettingsDialog::open() {
}
void SubtitleSettingsDialog::cycleValue() {
- static const char* subtitleDesc[] = {
- "Speech Only",
- "Speech and Subtitles",
- "Subtitles Only"
+ static const char *const subtitleDesc[] = {
+ _s("Speech Only"),
+ _s("Speech and Subtitles"),
+ _s("Subtitles Only")
};
_value += 1;
@@ -593,9 +604,9 @@ void SubtitleSettingsDialog::cycleValue() {
_value = 0;
if (_value == 1 && g_system->getOverlayWidth() <= 320)
- setInfoText("Speech & Subs");
+ setInfoText(_sc("Speech & Subs", "lowres"));
else
- setInfoText(subtitleDesc[_value]);
+ setInfoText(_(subtitleDesc[_value]));
_timer = g_system->getMillis() + 1500;
}
diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp
index f22547f193..a22aa1802f 100644
--- a/engines/scumm/gfx.cpp
+++ b/engines/scumm/gfx.cpp
@@ -1025,6 +1025,16 @@ void ScummEngine::restoreBackground(Common::Rect rect, byte backColor) {
if (rect.left > vs->w)
return;
+ // Indy4 Amiga always uses the room or verb palette map to match colors to
+ // the currently setup palette, thus we need to select it over here too.
+ // Done like the original interpreter.
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ if (vs->number == kVerbVirtScreen)
+ backColor = _verbPalette[backColor];
+ else
+ backColor = _roomPalette[backColor];
+ }
+
// Convert 'rect' to local (virtual screen) coordinates
rect.top -= vs->topline;
rect.bottom -= vs->topline;
@@ -1235,6 +1245,16 @@ void ScummEngine::drawBox(int x, int y, int x2, int y2, int color) {
if ((vs = findVirtScreen(y)) == NULL)
return;
+ // Indy4 Amiga always uses the room or verb palette map to match colors to
+ // the currently setup palette, thus we need to select it over here too.
+ // Done like the original interpreter.
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ if (vs->number == kVerbVirtScreen)
+ color = _verbPalette[color];
+ else
+ color = _roomPalette[color];
+ }
+
if (x > x2)
SWAP(x, x2);
@@ -1872,6 +1892,16 @@ bool Gdi::drawStrip(byte *dstPtr, VirtScreen *vs, int x, int y, const int width,
}
assertRange(0, offset, smapLen-1, "screen strip");
+ // Indy4 Amiga always uses the room or verb palette map to match colors to
+ // the currently setup palette, thus we need to select it over here too.
+ // Done like the original interpreter.
+ if (_vm->_game.platform == Common::kPlatformAmiga && _vm->_game.id == GID_INDY4) {
+ if (vs->number == kVerbVirtScreen)
+ _roomPalette = _vm->_verbPalette;
+ else
+ _roomPalette = _vm->_roomPalette;
+ }
+
return decompressBitmap(dstPtr, vs->pitch, smap_ptr + offset, height);
}
@@ -4111,4 +4141,3 @@ void ScummEngine::unkScreenEffect6() {
}
} // End of namespace Scumm
-
diff --git a/engines/scumm/he/animation_he.cpp b/engines/scumm/he/animation_he.cpp
index 74183c24d3..40e99c26a8 100644
--- a/engines/scumm/he/animation_he.cpp
+++ b/engines/scumm/he/animation_he.cpp
@@ -26,27 +26,42 @@
#include "scumm/he/intern_he.h"
#include "audio/audiostream.h"
+#include "video/smk_decoder.h"
+
+#ifdef USE_BINK
+#include "video/bink_decoder.h"
+#endif
namespace Scumm {
-MoviePlayer::MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer)
- : SmackerDecoder(mixer), _vm(vm), _mixer(mixer) {
+MoviePlayer::MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer) : _vm(vm) {
+#ifdef USE_BINK
+ if (_vm->_game.heversion >= 100 && (_vm->_game.features & GF_16BIT_COLOR))
+ _video = new Video::BinkDecoder();
+ else
+#endif
+ _video = new Video::SmackerDecoder(mixer);
_flags = 0;
_wizResNum = 0;
}
+MoviePlayer::~MoviePlayer() {
+ delete _video;
+}
+
int MoviePlayer::getImageNum() {
- if (!isVideoLoaded())
+ if (!_video->isVideoLoaded())
return 0;
+
return _wizResNum;
}
int MoviePlayer::load(const char *filename, int flags, int image) {
- if (isVideoLoaded())
- close();
+ if (_video->isVideoLoaded())
+ _video->close();
- if (!loadFile(filename)) {
+ if (!_video->loadFile(filename)) {
warning("Failed to load video file %s", filename);
return -1;
}
@@ -54,7 +69,7 @@ int MoviePlayer::load(const char *filename, int flags, int image) {
debug(1, "Playing video %s", filename);
if (flags & 2)
- _vm->_wiz->createWizEmptyImage(image, 0, 0, getWidth(), getHeight());
+ _vm->_wiz->createWizEmptyImage(image, 0, 0, _video->getWidth(), _video->getHeight());
_flags = flags;
_wizResNum = image;
@@ -62,34 +77,59 @@ int MoviePlayer::load(const char *filename, int flags, int image) {
}
void MoviePlayer::copyFrameToBuffer(byte *dst, int dstType, uint x, uint y, uint pitch) {
- uint h = getHeight();
- uint w = getWidth();
+ uint h = _video->getHeight();
+ uint w = _video->getWidth();
+
+ const Graphics::Surface *surface = _video->decodeNextFrame();
+
+ if (!surface)
+ return;
- const Graphics::Surface *surface = decodeNextFrame();
byte *src = (byte *)surface->pixels;
- if (hasDirtyPalette())
- _vm->setPaletteFromPtr(getPalette(), 256);
+ if (_video->hasDirtyPalette())
+ _vm->setPaletteFromPtr(_video->getPalette(), 256);
if (_vm->_game.features & GF_16BIT_COLOR) {
- dst += y * pitch + x * 2;
- do {
- for (uint i = 0; i < w; i++) {
- uint16 color = READ_LE_UINT16(_vm->_hePalettes + _vm->_hePaletteSlot + 768 + src[i] * 2);
- switch (dstType) {
- case kDstScreen:
- WRITE_UINT16(dst + i * 2, color);
- break;
- case kDstResource:
- WRITE_LE_UINT16(dst + i * 2, color);
- break;
- default:
- error("copyFrameToBuffer: Unknown dstType %d", dstType);
+ if (surface->format.bytesPerPixel == 1) {
+ dst += y * pitch + x * 2;
+ do {
+ for (uint i = 0; i < w; i++) {
+ uint16 color = READ_LE_UINT16(_vm->_hePalettes + _vm->_hePaletteSlot + 768 + src[i] * 2);
+ switch (dstType) {
+ case kDstScreen:
+ WRITE_UINT16(dst + i * 2, color);
+ break;
+ case kDstResource:
+ WRITE_LE_UINT16(dst + i * 2, color);
+ break;
+ default:
+ error("copyFrameToBuffer: Unknown dstType %d", dstType);
+ }
}
- }
- dst += pitch;
- src += w;
- } while (--h);
+ dst += pitch;
+ src += w;
+ } while (--h);
+ } else {
+ dst += y * pitch + x * 2;
+ do {
+ for (uint i = 0; i < w; i++) {
+ uint16 color = *((uint16 *)src + i);
+ switch (dstType) {
+ case kDstScreen:
+ WRITE_UINT16(dst + i * 2, color);
+ break;
+ case kDstResource:
+ WRITE_LE_UINT16(dst + i * 2, color);
+ break;
+ default:
+ error("copyFrameToBuffer: Unknown dstType %d", dstType);
+ }
+ }
+ dst += pitch;
+ src += surface->pitch;
+ } while (--h);
+ }
} else {
dst += y * pitch + x;
do {
@@ -101,7 +141,7 @@ void MoviePlayer::copyFrameToBuffer(byte *dst, int dstType, uint x, uint y, uint
}
void MoviePlayer::handleNextFrame() {
- if (!isVideoLoaded())
+ if (!_video->isVideoLoaded())
return;
VirtScreen *pvs = &_vm->_virtscr[kMainVirtScreen];
@@ -115,17 +155,37 @@ void MoviePlayer::handleNextFrame() {
} else if (_flags & 1) {
copyFrameToBuffer(pvs->getBackPixels(0, 0), kDstScreen, 0, 0, pvs->pitch);
- Common::Rect imageRect(getWidth(), getHeight());
+ Common::Rect imageRect(_video->getWidth(), _video->getHeight());
_vm->restoreBackgroundHE(imageRect);
} else {
copyFrameToBuffer(pvs->getPixels(0, 0), kDstScreen, 0, 0, pvs->pitch);
- Common::Rect imageRect(getWidth(), getHeight());
+ Common::Rect imageRect(_video->getWidth(), _video->getHeight());
_vm->markRectAsDirty(kMainVirtScreen, imageRect);
}
- if (endOfVideo())
- close();
+ if (_video->endOfVideo())
+ _video->close();
+}
+
+void MoviePlayer::close() {
+ _video->close();
+}
+
+int MoviePlayer::getWidth() const {
+ return _video->getWidth();
+}
+
+int MoviePlayer::getHeight() const {
+ return _video->getHeight();
+}
+
+int MoviePlayer::getFrameCount() const {
+ return _video->getFrameCount();
+}
+
+int MoviePlayer::getCurFrame() const {
+ return _video->endOfVideo() ? -1 : _video->getCurFrame() + 1;
}
} // End of namespace Scumm
diff --git a/engines/scumm/he/animation_he.h b/engines/scumm/he/animation_he.h
index b3405fead0..7fa31a195d 100644
--- a/engines/scumm/he/animation_he.h
+++ b/engines/scumm/he/animation_he.h
@@ -23,34 +23,41 @@
#if !defined(SCUMM_HE_ANIMATION_H) && defined(ENABLE_HE)
#define SCUMM_HE_ANIMATION_H
-#include "video/smk_decoder.h"
-
#include "audio/mixer.h"
+namespace Video {
+ class VideoDecoder;
+}
+
namespace Scumm {
class ScummEngine_v90he;
-class MoviePlayer : public Video::SmackerDecoder {
- ScummEngine_v90he *_vm;
-
- Audio::Mixer *_mixer;
-
- Audio::SoundHandle _bgSound;
- Audio::AudioStream *_bgSoundStream;
-
- char baseName[40];
- uint32 _flags;
- uint32 _wizResNum;
-
+class MoviePlayer {
public:
MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer);
+ ~MoviePlayer();
int getImageNum();
int load(const char *filename, int flags, int image = 0);
void copyFrameToBuffer(byte *dst, int dstType, uint x, uint y, uint pitch);
void handleNextFrame();
+
+ void close();
+ int getWidth() const;
+ int getHeight() const;
+ int getFrameCount() const;
+ int getCurFrame() const;
+
+private:
+ ScummEngine_v90he *_vm;
+
+ Video::VideoDecoder *_video;
+
+ char baseName[40];
+ uint32 _flags;
+ uint32 _wizResNum;
};
} // End of namespace Scumm
diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h
index c49217b650..cdc5faa084 100644
--- a/engines/scumm/he/intern_he.h
+++ b/engines/scumm/he/intern_he.h
@@ -383,6 +383,8 @@ protected:
void drawLine(int x1, int y1, int x, int unk1, int unk2, int type, int id);
void drawPixel(int x, int y, int flags);
+ virtual void setDefaultCursor();
+
/* HE version 80 script opcodes */
void o80_createSound();
void o80_getFileSize();
@@ -456,6 +458,7 @@ protected:
virtual void saveOrLoad(Serializer *s);
virtual void readMAXS(int blockSize);
+ void setResourceOffHeap(int typeId, int resId, int val);
virtual void processActors();
diff --git a/engines/scumm/he/logic/baseball2001.cpp b/engines/scumm/he/logic/baseball2001.cpp
new file mode 100644
index 0000000000..342423fd79
--- /dev/null
+++ b/engines/scumm/he/logic/baseball2001.cpp
@@ -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.
+ *
+ */
+
+#include "scumm/he/intern_he.h"
+#include "scumm/he/logic_he.h"
+
+namespace Scumm {
+
+/**
+ * Logic code for:
+ * Backyard Baseball 2001
+ */
+class LogicHEbaseball2001 : public LogicHE {
+public:
+ LogicHEbaseball2001(ScummEngine_v90he *vm) : LogicHE(vm) {}
+
+ int versionID();
+ int32 dispatch(int op, int numArgs, int32 *args);
+};
+
+int LogicHEbaseball2001::versionID() {
+ return 1;
+}
+
+int32 LogicHEbaseball2001::dispatch(int op, int numArgs, int32 *args) {
+ int res = 0;
+
+ switch (op) {
+ case 3001:
+ // Check network status
+ break;
+
+ default:
+ LogicHE::dispatch(op, numArgs, args);
+ }
+
+ return res;
+}
+
+LogicHE *makeLogicHEbaseball2001(ScummEngine_v90he *vm) {
+ return new LogicHEbaseball2001(vm);
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/he/logic/basketball.cpp b/engines/scumm/he/logic/basketball.cpp
new file mode 100644
index 0000000000..a4da8e05dc
--- /dev/null
+++ b/engines/scumm/he/logic/basketball.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.
+ *
+ */
+
+#include "scumm/he/intern_he.h"
+#include "scumm/he/logic_he.h"
+
+namespace Scumm {
+
+/**
+ * Logic code for:
+ * Backyard Basketball
+ */
+class LogicHEbasketball : public LogicHE {
+public:
+ LogicHEbasketball(ScummEngine_v90he *vm) : LogicHE(vm) {}
+
+ int versionID();
+ int32 dispatch(int op, int numArgs, int32 *args);
+
+private:
+ int op_1012();
+ int op_1050(int32 *args);
+ int op_1053();
+
+ // op_1050 loads court object data
+ enum CourtObjectType {
+ kObjectTypeBackboard = 1,
+ kObjectTypeRim = 2,
+ kObjectTypeOther = 3,
+ kObjectTypeFloor = 4
+ };
+
+ struct CourtObject {
+ Common::String name;
+ CourtObjectType type;
+ uint32 data[10];
+ };
+
+ Common::Array<CourtObject> _courtObjects;
+ uint32 _backboardObjectLeft, _backboardObjectRight;
+};
+
+int LogicHEbasketball::versionID() {
+ return 1;
+}
+
+int32 LogicHEbasketball::dispatch(int op, int numArgs, int32 *args) {
+ int res = 0;
+
+ switch (op) {
+ case 1001:
+ break;
+
+ case 1006:
+ break;
+
+ case 1011:
+ break;
+
+ case 1012:
+ res = op_1012();
+ break;
+
+ case 1035:
+ break;
+
+ case 1050:
+ res = op_1050(args);
+ break;
+
+ case 1051:
+ break;
+
+ case 1052:
+ break;
+
+ case 1053:
+ res = op_1053();
+ break;
+
+ case 1056:
+ break;
+
+ case 1057:
+ break;
+
+ case 1058:
+ break;
+
+ case 1060:
+ break;
+
+ case 1064:
+ break;
+
+ case 1067:
+ break;
+
+ case 1073:
+ break;
+
+ case 1075:
+ break;
+
+ case 1076:
+ break;
+
+ case 1080:
+ break;
+
+ case 1081:
+ break;
+
+ case 1090:
+ break;
+
+ case 1091:
+ break;
+
+ case 1513:
+ break;
+
+ default:
+ LogicHE::dispatch(op, numArgs, args);
+ }
+
+ return res;
+}
+
+int LogicHEbasketball::op_1012() {
+ writeScummVar(108, 12000);
+ writeScummVar(109, 8000);
+ writeScummVar(110, 760);
+ writeScummVar(111, 4000);
+ writeScummVar(112, 1600);
+ return 1;
+}
+
+int LogicHEbasketball::op_1050(int32 *args) {
+ // This function loads the court data
+ static const char *const courtNames[] = {
+ "Dobbaguchi", "Jocindas", "SandyFlats", "Queens",
+ "Park", "Scheffler", "Polk", "McMillan",
+ "CrownHill", "Memorial", "TechState", "Garden",
+ "Moon", "Barn"
+ };
+
+ Common::String courtFileName = Common::String::format("data/courts/%s.cof", courtNames[args[0] - 1]);
+
+ Common::File file;
+ if (!file.open(courtFileName))
+ error("Could not open file '%s'", courtFileName.c_str());
+
+ debug(0, "Loading court data from '%s'", courtFileName.c_str());
+
+ // First, read in the header
+ file.readUint32LE(); // Header size (?)
+
+ char version[6];
+ file.read(version, 5);
+ version[5] = 0;
+
+ if (strcmp(version, "01.05"))
+ error("Invalid court version field: %s", version);
+
+ uint32 objectCount = file.readUint32LE();
+
+ for (uint32 i = 0; i < objectCount; i++) {
+ char nameBuf[100];
+ memset(nameBuf, 0, sizeof(nameBuf));
+
+ uint32 nameLength = file.readUint32LE();
+ assert(nameLength < sizeof(nameBuf) - 1);
+ file.read(nameBuf, nameLength);
+
+ CourtObject object;
+ object.name = nameBuf;
+ object.type = (CourtObjectType)file.readUint32LE();
+ for (uint32 j = 0; j < 10; j++)
+ object.data[j] = file.readUint32LE();
+
+ debug(1, "Found court object '%s' - Type %d", nameBuf, object.type);
+
+ // Store backboard object indices for later
+ if (object.type == kObjectTypeBackboard) {
+ if (object.data[7] + object.data[4] / 2 >= 6000)
+ _backboardObjectRight = i;
+ else
+ _backboardObjectLeft = i;
+ }
+
+ _courtObjects.push_back(object);
+ }
+
+ // TODO: Some other variables are initialized with constants here
+
+ return 1;
+}
+
+int LogicHEbasketball::op_1053() {
+ _courtObjects.clear();
+ // TODO: This also calls op_1065 with one argument (5)
+
+ return 1;
+}
+
+LogicHE *makeLogicHEbasketball(ScummEngine_v90he *vm) {
+ return new LogicHEbasketball(vm);
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/he/logic/football.cpp b/engines/scumm/he/logic/football.cpp
new file mode 100644
index 0000000000..f86f97eaf7
--- /dev/null
+++ b/engines/scumm/he/logic/football.cpp
@@ -0,0 +1,288 @@
+/* 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.
+ *
+ */
+
+#include "scumm/he/intern_he.h"
+#include "scumm/he/logic_he.h"
+
+namespace Scumm {
+
+/**
+ * Logic code for:
+ * Backyard Football
+ * Backyard Football 2002
+ */
+class LogicHEfootball : public LogicHE {
+public:
+ LogicHEfootball(ScummEngine_v90he *vm) : LogicHE(vm) {}
+
+ int versionID();
+ int32 dispatch(int op, int numArgs, int32 *args);
+
+private:
+ int op_1004(int32 *args);
+ int op_1006(int32 *args);
+ int op_1007(int32 *args);
+ int op_1010(int32 *args);
+ int op_1022(int32 *args);
+ int op_1023(int32 *args);
+ int op_1024(int32 *args);
+};
+
+int LogicHEfootball::versionID() {
+ return 1;
+}
+
+int32 LogicHEfootball::dispatch(int op, int numArgs, int32 *args) {
+ int res = 0;
+
+ switch (op) {
+ case 1004:
+ res = op_1004(args);
+ break;
+
+ case 1006:
+ res = op_1006(args);
+ break;
+
+ case 1007:
+ res = op_1007(args);
+ break;
+
+ case 1010:
+ res = op_1010(args);
+ break;
+
+ case 1022:
+ res = op_1022(args);
+ break;
+
+ case 1023:
+ res = op_1023(args);
+ break;
+
+ case 1024:
+ res = op_1024(args);
+ break;
+
+ case 8221968:
+ // Someone had a fun and used his birthday as opcode number
+ res = getFromArray(args[0], args[1], args[2]);
+ break;
+
+ case 1492: case 1493: case 1494: case 1495: case 1496:
+ case 1497: case 1498: case 1499: case 1500: case 1501:
+ case 1502: case 1503: case 1504: case 1505: case 1506:
+ case 1507: case 1508: case 1509: case 1510: case 1511:
+ case 1512: case 1513: case 1514: case 1555:
+ // DirectPlay-related
+ // 1513: initialize
+ // 1555: set fake lag
+ break;
+
+ case 2200: case 2201: case 2202: case 2203: case 2204:
+ case 2205: case 2206: case 2207: case 2208: case 2209:
+ case 2210: case 2211: case 2212: case 2213: case 2214:
+ case 2215: case 2216: case 2217: case 2218: case 2219:
+ case 2220: case 2221: case 2222: case 2223: case 2224:
+ case 2225: case 2226: case 2227: case 2228:
+ // Boneyards-related
+ break;
+
+ case 3000: case 3001: case 3002: case 3003: case 3004:
+ // Internet-related
+ // 3000: check for updates
+ // 3001: check network status
+ // 3002: autoupdate
+ // 3003: close connection
+ break;
+
+ default:
+ LogicHE::dispatch(op, numArgs, args);
+ warning("Tell sev how to reproduce it (%d)", op);
+ }
+
+ return res;
+}
+
+int LogicHEfootball::op_1004(int32 *args) {
+ // Identical to LogicHEsoccer::op_1004
+ double res, a2, a4, a5;
+
+ a5 = ((double)args[4] - (double)args[1]) / ((double)args[5] - (double)args[2]);
+ a4 = ((double)args[3] - (double)args[0]) / ((double)args[5] - (double)args[2]);
+ a2 = (double)args[2] - (double)args[0] * a4 - args[1] * a5;
+
+ res = (double)args[6] * a4 + (double)args[7] * a5 + a2;
+ writeScummVar(108, (int32)res);
+
+ writeScummVar(109, (int32)a2);
+ writeScummVar(110, (int32)a5);
+ writeScummVar(111, (int32)a4);
+
+ return 1;
+}
+
+int LogicHEfootball::op_1006(int32 *args) {
+ // This seems to be more or less the inverse of op_1010
+ const double a1 = args[1];
+ double res;
+
+ // 2.9411764e-4 = 1/3400
+ // 5.3050399e-2 = 1/18.85 = 20/377
+ // 1.1764706e-2 = 1/85 = 40/3400
+ // 1.2360656e-1 = 377/3050
+ res = (1.0 - a1 * 2.9411764e-4 * 5.3050399e-2) * 1.2360656e-1 * args[0] +
+ a1 * 1.1764706e-2 + 46;
+
+ // Shortened / optimized version of that formula:
+ // res = (377.0 - a1 / 170.0) / 3050.0 * args[0] + a1 / 85.0 + 46;
+
+ writeScummVar(108, (int32)res);
+
+ // 1.2360656e-1 = 377/3050
+ // 1.1588235e-1 = 197/1700 = 394/3400
+ res = 640.0 - args[2] * 1.2360656e-1 - a1 * 1.1588235e-1 - 26;
+
+ writeScummVar(109, (int32)res);
+
+ return 1;
+}
+
+int LogicHEfootball::op_1007(int32 *args) {
+ double res, temp;
+
+ temp = (double)args[1] * 0.32;
+
+ if (temp > 304.0)
+ res = -args[2] * 0.142;
+ else
+ res = args[2] * 0.142;
+
+ res += temp;
+
+ writeScummVar(108, (int32)res);
+
+ res = (1000.0 - args[2]) * 0.48;
+
+ writeScummVar(109, (int32)res);
+
+ return 1;
+}
+
+int LogicHEfootball::op_1010(int32 *args) {
+ // This seems to be more or less the inverse of op_1006
+ double a1 = (640.0 - (double)args[1] - 26.0) / 1.1588235e-1;
+
+ // 2.9411764e-4 = 1/3400
+ // 5.3050399e-2 = 1/18.85 = 20/377
+ // 1.1764706e-2 = 1/85 = 40/3400
+ // 1.2360656e-1 = 377/3050
+ double a0 = ((double)args[0] - 46 - a1 * 1.1764706e-2) /
+ ((1.0 - a1 * 2.9411764e-4 * 5.3050399e-2) * 1.2360656e-1);
+
+ writeScummVar(108, (int32)a0);
+ writeScummVar(109, (int32)a1);
+
+ return 1;
+}
+
+int LogicHEfootball::op_1022(int32 *args) {
+ double res;
+ double var10 = args[4] - args[1];
+ double var8 = args[5] - args[2];
+ double var6 = args[3] - args[0];
+
+ res = sqrt(var8 * var8 + var6 * var6 + var10 * var10);
+
+ if (res >= (double)args[6]) {
+ var8 = (double)args[6] * var8 / res;
+ var10 = (double)args[6] * var10 / res;
+ res = (double)args[6] * var6 / res;
+ }
+
+ writeScummVar(108, (int32)res);
+ writeScummVar(109, (int32)var10);
+ writeScummVar(110, (int32)var8);
+
+ return 1;
+}
+
+int LogicHEfootball::op_1023(int32 *args) {
+ double var10, var18, var20, var28, var30, var30_;
+ double argf[7];
+
+ for (int i = 0; i < 7; i++)
+ argf[i] = args[i];
+
+ var10 = (argf[3] - argf[1]) / (argf[2] - argf[0]);
+ var28 = var10 * var10 + 1;
+ var20 = argf[0] * var10;
+ var18 = (argf[5] + argf[1] + var20) * argf[4] * var10 * 2 +
+ argf[6] * argf[6] * var28 + argf[4] * argf[4] -
+ argf[0] * argf[0] * var10 * var10 -
+ argf[5] * argf[0] * var10 * 2 -
+ argf[5] * argf[1] * 2 -
+ argf[1] * argf[1] - argf[5] * argf[5];
+
+ if (var18 >= 0) {
+ var18 = sqrt(var18);
+
+ var30_ = argf[4] + argf[5] * var10 + argf[1] * var10 + argf[0] * var10 * var10;
+ var30 = (var30_ - var18) / var28;
+ var18 = (var30_ + var18) / var28;
+
+ if ((argf[0] - var30 < 0) && (argf[0] - var18 < 0)) {
+ var30_ = var30;
+ var30 = var18;
+ var18 = var30_;
+ }
+ var28 = var18 * var10 - var20 - argf[1];
+ var20 = var30 * var10 - var20 - argf[1];
+ } else {
+ var18 = 0;
+ var20 = 0;
+ var28 = 0;
+ var30 = 0;
+ }
+
+ writeScummVar(108, (int32)var18);
+ writeScummVar(109, (int32)var28);
+ writeScummVar(110, (int32)var30);
+ writeScummVar(111, (int32)var20);
+
+ return 1;
+}
+
+int LogicHEfootball::op_1024(int32 *args) {
+ writeScummVar(108, 0);
+ writeScummVar(109, 0);
+ writeScummVar(110, 0);
+ writeScummVar(111, 0);
+
+ return 1;
+}
+
+LogicHE *makeLogicHEfootball(ScummEngine_v90he *vm) {
+ return new LogicHEfootball(vm);
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/he/logic/funshop.cpp b/engines/scumm/he/logic/funshop.cpp
new file mode 100644
index 0000000000..8993fedad2
--- /dev/null
+++ b/engines/scumm/he/logic/funshop.cpp
@@ -0,0 +1,216 @@
+/* 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.
+ *
+ */
+
+#include "scumm/he/intern_he.h"
+#include "scumm/he/logic_he.h"
+
+namespace Scumm {
+
+/**
+ * Logic code for:
+ * Freddi Fish's One-Stop Fun Shop
+ * Pajama Sam's One-Stop Fun Shop
+ * Putt-Putt's One-Stop Fun Shop
+ */
+class LogicHEfunshop : public LogicHE {
+public:
+ LogicHEfunshop(ScummEngine_v90he *vm) : LogicHE(vm) {}
+
+ int versionID();
+ int32 dispatch(int op, int numArgs, int32 *args);
+
+private:
+ void op_1004(int32 *args);
+ void op_1005(int32 *args);
+ int checkShape(int32 data0, int32 data1, int32 data4, int32 data5, int32 data2, int32 data3, int32 data6, int32 data7, int32 *x, int32 *y);
+};
+
+int LogicHEfunshop::versionID() {
+ return 1;
+}
+
+int32 LogicHEfunshop::dispatch(int op, int numArgs, int32 *args) {
+ switch (op) {
+ case 1004:
+ op_1004(args);
+ break;
+
+ case 1005:
+ op_1005(args);
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+void LogicHEfunshop::op_1004(int32 *args) {
+ double data[8], at, sq;
+ int32 x, y;
+ int i=0;
+
+ for (i = 0; i <= 6; i += 2) {
+ data[i] = getFromArray(args[0], 0, 519 + i);
+ data[i + 1] = getFromArray(args[0], 0, 519 + i + 1);
+ }
+ int s = checkShape((int32)data[0], (int32)data[1], (int32)data[4], (int32)data[5],
+ (int32)data[2], (int32)data[3], (int32)data[6], (int32)data[7], &x, &y);
+
+ if (s != 1) {
+ error("LogicHEfunshop::op_1004: Your shape has defied the laws of physics");
+ return;
+ }
+
+ for (i = 0; i <= 6; i += 2) {
+ data[i] -= (double)x;
+ data[i + 1] -= (double)y;
+ }
+
+ double a1 = (double)args[1] * DEG2RAD;
+
+ for (i = 0; i <= 6; i += 2) {
+ at = atan2(data[i + 1], data[i]);
+ sq = sqrt(data[i + 1] * data[i + 1] + data[i] * data[i]);
+
+ if (at <= 0)
+ at += 2 * M_PI;
+
+ data[i] = cos(at + a1) * sq;
+ data[i + 1] = sin(at + a1) * sq;
+ }
+
+ double minx = data[0];
+ double miny = data[1];
+
+ for (i = 0; i <= 6; i += 2) {
+ if (data[i] < minx)
+ minx = data[i];
+ if (data[i + 1] < miny)
+ miny = data[i + 1];
+ }
+
+ for (i = 0; i <= 6; i += 2) {
+ data[i] -= minx;
+ data[i + 1] -= miny;
+
+ putInArray(args[0], 0, 519 + i, scummRound(data[i]));
+ putInArray(args[0], 0, 519 + i + 1, scummRound(data[i + 1]));
+ }
+}
+
+void LogicHEfunshop::op_1005(int32 *args) {
+ double data[8];
+ double args1, args2;
+ int i;
+ for (i = 520; i <= 526; i += 2) {
+ data[i - 520] = getFromArray(args[0], 0, i - 1);
+ data[i - 520 + 1] = getFromArray(args[0], 0, i);
+ }
+
+ args1 = (double)args[1] * 0.01 + 1;
+ args2 = (double)args[2] * 0.01 + 1;
+
+ for (i = 0; i < 4; i++) {
+ data[2 * i] *= args1;
+ data[2 * i + 1] *= args2;
+ }
+
+ for (i = 520; i <= 526; i += 2) {
+ putInArray(args[0], 0, i - 1, scummRound(data[i - 520]));
+ putInArray(args[0], 0, i, scummRound(data[i - 520 + 1]));
+ }
+}
+
+int LogicHEfunshop::checkShape(int32 data0, int32 data1, int32 data4, int32 data5, int32 data2, int32 data3, int32 data6, int32 data7, int32 *x, int32 *y) {
+ int32 diff5_1, diff0_4, diff7_3, diff2_6;
+ int32 diff1, diff2;
+ int32 delta, delta2;
+ int32 sum1, sum2;
+
+ diff0_4 = data0 - data4;
+ diff5_1 = data5 - data1;
+ diff1 = data1 * data4 - data0 * data5;
+ sum1 = diff0_4 * data3 + diff1 + diff5_1 * data2;
+ sum2 = diff0_4 * data7 + diff1 + diff5_1 * data6;
+
+ if (sum1 != 0 && sum2 != 0) {
+ sum2 ^= sum1;
+
+ if (sum2 >= 0)
+ return 0;
+ }
+
+ diff2_6 = data2 - data6;
+ diff7_3 = data7 - data3;
+ diff2 = data3 * data6 - data2 * data7;
+ sum1 = diff2_6 * data1 + diff2 + diff7_3 * data0;
+ sum2 = diff2_6 * data5 + diff2 + diff7_3 * data4;
+
+ if (sum1 != 0 && sum2 != 0) {
+ sum2 ^= sum1;
+
+ if (sum2 >= 0)
+ return 0;
+ }
+
+ delta = diff2_6 * diff5_1 - diff0_4 * diff7_3;
+
+ if (delta == 0) {
+ return 2;
+ }
+
+ if (delta < 0) {
+ data7 = -((delta + 1) >> 1);
+ } else {
+ data7 = delta >> 1;
+ }
+
+ delta2 = diff2 * diff0_4 - diff1 * diff2_6;
+
+ if (delta2 < 0) {
+ delta2 -= data7;
+ } else {
+ delta2 += data7;
+ }
+
+ *x = delta2 / delta;
+
+ delta2 = diff1 * diff7_3 - diff2 * diff5_1;
+
+ if (delta2 < 0) {
+ delta2 -= data7;
+ } else {
+ delta2 += data7;
+ }
+
+ *y = delta2 / delta;
+
+ return 1;
+}
+
+LogicHE *makeLogicHEfunshop(ScummEngine_v90he *vm) {
+ return new LogicHEfunshop(vm);
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/he/logic/moonbase.cpp b/engines/scumm/he/logic/moonbase.cpp
new file mode 100644
index 0000000000..fac2ea27ff
--- /dev/null
+++ b/engines/scumm/he/logic/moonbase.cpp
@@ -0,0 +1,50 @@
+/* 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.
+ *
+ */
+
+#include "scumm/he/intern_he.h"
+#include "scumm/he/logic_he.h"
+
+namespace Scumm {
+
+/**
+ * Logic code for:
+ * Moonbase Commander
+ */
+class LogicHEmoonbase : public LogicHE {
+public:
+ LogicHEmoonbase(ScummEngine_v90he *vm) : LogicHE(vm) {}
+
+ int versionID();
+};
+
+int LogicHEmoonbase::versionID() {
+ if (_vm->_game.features & GF_DEMO)
+ return -100;
+ else
+ return 100;
+}
+
+LogicHE *makeLogicHEmoonbase(ScummEngine_v90he *vm) {
+ return new LogicHEmoonbase(vm);
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/he/logic/puttrace.cpp b/engines/scumm/he/logic/puttrace.cpp
new file mode 100644
index 0000000000..ea4397cd97
--- /dev/null
+++ b/engines/scumm/he/logic/puttrace.cpp
@@ -0,0 +1,376 @@
+/* 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.
+ *
+ */
+
+#include "scumm/he/intern_he.h"
+#include "scumm/he/logic_he.h"
+
+namespace Scumm {
+
+/**
+ * Logic code for:
+ * Putt-Putt Enters the Race
+ */
+class LogicHErace : public LogicHE {
+private:
+ float *_userData;
+ double *_userDataD;
+public:
+ LogicHErace(ScummEngine_v90he *vm);
+ ~LogicHErace();
+
+ int versionID();
+ int32 dispatch(int op, int numArgs, int32 *args);
+
+private:
+ int32 op_1003(int32 *args);
+ int32 op_1004(int32 *args);
+ int32 op_1100(int32 *args);
+ int32 op_1101(int32 *args);
+ int32 op_1102(int32 *args);
+ int32 op_1103(int32 *args);
+ int32 op_1110();
+ int32 op_1120(int32 *args);
+ int32 op_1130(int32 *args);
+ int32 op_1140(int32 *args);
+
+ void op_sub1(float arg);
+ void op_sub2(float arg);
+ void op_sub3(float arg);
+};
+
+LogicHErace::LogicHErace(ScummEngine_v90he *vm) : LogicHE(vm) {
+ // Originally it used 0x930 and stored both floats and doubles inside
+ _userData = (float *)calloc(550, sizeof(float));
+ _userDataD = (double *)calloc(30, sizeof(double));
+
+ // FIXME: of the 550 entries in _userData, only 516 till 532 are used
+ // FIXME: similarly, in _userDataD only 9 till 17 are used for computations
+ // (some of the other entries are also set, but never read, hence useless).
+}
+
+LogicHErace::~LogicHErace() {
+ free(_userData);
+ free(_userDataD);
+}
+
+int LogicHErace::versionID() {
+ return 1;
+}
+
+int32 LogicHErace::dispatch(int op, int numArgs, int32 *args) {
+ int32 res;
+
+ switch (op) {
+ case 1003:
+ res = op_1003(args);
+ break;
+
+ case 1004:
+ res = op_1004(args);
+ break;
+
+ case 1100:
+ res = op_1100(args);
+ break;
+
+ case 1101:
+ res = op_1101(args);
+ break;
+
+ case 1102:
+ res = op_1102(args);
+ break;
+
+ case 1103:
+ res = op_1103(args);
+ break;
+
+ case 1110:
+ res = op_1110();
+ break;
+
+ case 1120:
+ res = op_1120(args);
+ break;
+
+ case 1130:
+ res = op_1130(args);
+ break;
+
+ case 1140:
+ res = op_1140(args);
+ break;
+
+ default:
+ res = 0;
+ break;
+
+ }
+
+ return res;
+}
+
+#define RAD2DEG (180 / M_PI)
+#define DEG2RAD (M_PI / 180)
+
+int32 LogicHErace::op_1003(int32 *args) {
+ int value = args[2] ? args[2] : 1;
+
+ writeScummVar(108, (int32)(atan2((double)args[0], (double)args[1]) * RAD2DEG * value));
+
+ return 1;
+}
+
+int32 LogicHErace::op_1004(int32 *args) {
+ int value = args[1] ? args[1] : 1;
+
+ writeScummVar(108, (int32)(sqrt((float)args[0]) * value));
+
+ return 1;
+}
+
+int32 LogicHErace::op_1100(int32 *args) {
+ // _userData 516,517,518 describe a 3D translation?
+ _userData[516] = (float)args[0] / args[10];
+ _userData[517] = (float)args[1] / args[10];
+ _userData[518] = (float)args[2] / args[10];
+
+ // _userData 519,520,521 describe rotation angles around the x,y,z axes?
+ _userData[519] = (float)args[3] / args[10];
+ _userData[520] = (float)args[4] / args[10];
+ _userData[521] = (float)args[5] / args[10];
+
+ op_sub1(_userData[520]);
+ op_sub2(_userData[521]);
+
+ // _userData[532] seems to be some kind of global scale factor
+ _userData[532] = (float)args[10];
+
+ _userData[524] = (float)args[8]; // not used
+ _userData[525] = (float)args[9]; // not used
+ _userData[522] = (float)args[6] / args[10]; // not used
+ _userData[523] = (float)args[7] / args[10]; // only used to compute 528 and 529
+
+ // The following two are some kind of scale factors
+ _userData[526] = (float)args[6] / args[8] / args[10];
+ _userData[527] = (float)args[7] / args[9] / args[10];
+
+ // Set var 108 and 109 -- the value set here corresponds to the values
+ // set by op_1110!
+ writeScummVar(108, (int32)((float)args[6] / args[8] * args[10]));
+ writeScummVar(109, (int32)((float)args[7] / args[9] * args[10]));
+
+ _userData[528] = (float)(_userData[519] - _userData[523] * 0.5);
+ _userData[529] = (float)(_userData[519] + _userData[523] * 0.5);
+
+ writeScummVar(110, (int32)(_userData[528] * args[10]));
+ writeScummVar(111, (int32)(_userData[529] * args[10]));
+
+ // 530 and 531 are only used to set vars 112 and 113, so no need
+ // to store them permanently
+ _userData[530] = (float)(_userData[517] / tan(_userData[529] * DEG2RAD));
+ _userData[531] = (float)(_userData[517] / tan(_userData[528] * DEG2RAD));
+
+ writeScummVar(112, (int32)(_userData[530] * args[10]));
+ writeScummVar(113, (int32)(_userData[531] * args[10]));
+
+ return 1;
+}
+
+int32 LogicHErace::op_1101(int32 *args) {
+ // Update rotation params?
+ int32 retval;
+ float temp;
+
+ temp = args[0] / _userData[532];
+ if (_userData[519] != temp) {
+ _userData[519] = temp;
+ op_sub3(temp);
+ retval = 1;
+ } else {
+ retval = (int32)temp;
+ }
+
+ temp = args[1] / _userData[532];
+ if (_userData[520] != temp) {
+ _userData[520] = temp;
+ op_sub1(temp);
+ retval = 1;
+ }
+
+ temp = args[2] / _userData[532];
+ if (_userData[521] != temp) {
+ _userData[521] = temp;
+ op_sub2(temp);
+ retval = 1;
+ }
+
+ return retval;
+}
+
+int32 LogicHErace::op_1102(int32 *args) {
+ // Update translation params?
+ int32 retval;
+ float temp;
+
+ temp = args[0] / _userData[532];
+ if (_userData[516] != temp) {
+ _userData[516] = temp;
+ retval = 1;
+ } else {
+ retval = (int32)_userData[532];
+ }
+
+ temp = args[1] / _userData[532];
+ if (_userData[517] != temp) {
+ _userData[517] = temp;
+ retval = 1;
+ }
+
+ temp = args[2] / _userData[532];
+ if (_userData[518] != temp) {
+ _userData[518] = temp;
+ retval = 1;
+ }
+
+ return retval;
+}
+
+int32 LogicHErace::op_1103(int32 *args) {
+ double angle = args[0] / args[1] * DEG2RAD;
+
+ writeScummVar(108, (int32)(sin(angle) * args[2]));
+ writeScummVar(109, (int32)(cos(angle) * args[2]));
+
+ return 1;
+}
+
+int32 LogicHErace::op_1110() {
+ writeScummVar(108, (int32)(_userData[526] * _userData[532] * _userData[532]));
+ writeScummVar(109, (int32)(_userData[527] * _userData[532] * _userData[532]));
+ writeScummVar(110, (int32)(_userData[532]));
+
+ return 1;
+}
+
+int32 LogicHErace::op_1120(int32 *args) {
+ double a0, a1, a2;
+ double b0, b1, b2;
+ double res1, res2;
+
+ a0 = args[0] / _userData[532] - _userData[516];
+ a1 = args[1] / _userData[532] - _userData[517];
+ a2 = args[2] / _userData[532] - _userData[518];
+
+ // Perform matrix multiplication (multiplying by a rotation matrix)
+ b2 = a2 * _userDataD[17] + a1 * _userDataD[14] + a0 * _userDataD[11];
+ b1 = a2 * _userDataD[16] + a1 * _userDataD[13] + a0 * _userDataD[10];
+ b0 = a2 * _userDataD[15] + a1 * _userDataD[12] + a0 * _userDataD[9];
+
+ res1 = (atan2(b0, b2) * RAD2DEG) / _userData[526];
+ res2 = (atan2(b1, b2) * RAD2DEG - _userData[528]) / _userData[527];
+
+ writeScummVar(108, (int32)res1);
+ writeScummVar(109, (int32)res2);
+
+ return 1;
+}
+
+int32 LogicHErace::op_1130(int32 *args) {
+ double cs = cos(args[0] / _userData[532] * DEG2RAD);
+ double sn = sin(args[0] / _userData[532] * DEG2RAD);
+
+ writeScummVar(108, (int32)(cs * args[1] + sn * args[2]));
+ writeScummVar(109, (int32)(cs * args[2] - sn * args[1]));
+
+ return 1;
+}
+
+int32 LogicHErace::op_1140(int32 *args) {
+ // This functions seems to perform some kind of projection: We project
+ // the vector (arg2,arg3) onto the vector (arg0,arg1), but also apply
+ // some kind of distortion factor ?!?
+ double x = args[2], y = args[3];
+
+ // We start by normalizing the vector described by arg2 and arg3.
+ // So compute its length and divide the x and y coordinates
+ const double sq = sqrt(x*x + y*y);
+ x /= sq;
+ y /= sq;
+
+ // Compute the scalar product of the vectors (arg0,arg1) and (x,y)
+ const double scalarProduct = x * args[0] + y * args[1];
+
+ // Finally compute the projection of (arg2,arg3) onto (arg0,arg1)
+ double projX = args[0] - 2 * scalarProduct * x;
+ double projY = args[1] - 2 * scalarProduct * y;
+
+ projX = projX * 20.0 / 23.0; // FIXME: Why is this here?
+
+ writeScummVar(108, (int32)projX);
+
+ if (args[3] >= 0) // FIXME: Why is this here?
+ projY = projY * 5.0 / 6.0;
+
+ writeScummVar(109, (int32)projY);
+
+ return 1;
+}
+
+void LogicHErace::op_sub1(float arg) {
+ // Setup a rotation matrix
+ _userDataD[10] = _userDataD[12] = _userDataD[14] = _userDataD[16] = 0;
+ _userDataD[13] = 1;
+
+ _userDataD[9] = cos(arg * DEG2RAD);
+ _userDataD[15] = sin(arg * DEG2RAD);
+ _userDataD[11] = -_userDataD[15];
+ _userDataD[17] = _userDataD[9];
+}
+
+void LogicHErace::op_sub2(float arg) {
+ // Setup a rotation matrix -- but it is NEVER USED!
+ _userDataD[20] = _userDataD[21] = _userDataD[24] = _userDataD[25] = 0;
+ _userDataD[26] = 1;
+
+ _userDataD[19] = sin(arg * DEG2RAD);
+ _userDataD[18] = cos(arg * DEG2RAD);
+ _userDataD[21] = -_userDataD[19];
+ _userDataD[22] = _userDataD[18];
+}
+
+void LogicHErace::op_sub3(float arg) {
+ // Setup a rotation matrix -- but it is NEVER USED!
+ _userDataD[1] = _userDataD[2] = _userDataD[3] = _userDataD[6] = 0;
+ _userDataD[0] = 1;
+
+ _userDataD[4] = cos(arg * DEG2RAD);
+ _userDataD[5] = sin(arg * DEG2RAD);
+ _userDataD[7] = -_userDataD[5];
+ _userDataD[8] = _userDataD[4];
+}
+
+LogicHE *makeLogicHErace(ScummEngine_v90he *vm) {
+ return new LogicHErace(vm);
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/he/logic/soccer.cpp b/engines/scumm/he/logic/soccer.cpp
new file mode 100644
index 0000000000..05f377a736
--- /dev/null
+++ b/engines/scumm/he/logic/soccer.cpp
@@ -0,0 +1,1206 @@
+/* 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.
+ *
+ */
+
+#include "scumm/he/intern_he.h"
+#include "scumm/he/logic_he.h"
+
+namespace Scumm {
+
+/**
+ * Logic code for:
+ * Backyard Soccer
+ * Backyard Soccer MLS Edition
+ * Backyard Soccer 2004
+ */
+class LogicHEsoccer : public LogicHE {
+private:
+ double *_userDataD;
+
+public:
+ LogicHEsoccer(ScummEngine_v90he *vm);
+ ~LogicHEsoccer();
+
+ int versionID();
+ int32 dispatch(int op, int numArgs, int32 *args);
+
+ void beforeBootScript();
+ void initOnce();
+ int startOfFrame();
+
+private:
+ int op_1005(float x1, float y1, float z1, float x2, float y2, float z2, float *nextVelX, float *nextVelY, float *nextVelZ, float *a10);
+ int op_1006(int32 a1, int32 a2, int32 a3, int32 a4);
+ int op_1007(int32 *args);
+ int op_1008(int outArray, int srcX, int srcY, int srcZ, int vecX, int vecY, int vecZ, int airResX, int airResY, int airResZ, int vecNumerator, int vecDenom, int gravityMult, int requiredSegments, int a15, int a16, int a17, int a18, int fieldType);
+ int op_1011(int32 worldPosArray, int32 screenPosArray, int32 a3, int32 closestActorArray, int32 maxDistance, int32 fieldAreaArray);
+ int op_1012(int32 *args);
+ int op_1013(int32 a1, int32 a2, int32 a3);
+ int op_1014(int32 srcX, int32 srcY, int32 srcZ, int32 velX, int32 velY, int32 velZ, int32 outArray, int32 dataArrayId, int32 indexArrayId, int32 requestType, int32 vecNumerator, int32 vecDenom, int32 a13, int32 a14);
+ int op_1016(int32 *args);
+ int op_1017(int32 *args);
+ int op_1019(int32 *args);
+ int op_1021(int32 inX, int32 inY, int32 inZ, int32 velX, int32 velY, int32 velZ, int32 internalUse);
+
+ // op_1007 allocates some arrays
+ // they're then filled by op_1019
+ byte _collisionObjIds[4096], _collisionNodeEnabled[585];
+
+ // op_1011 has a subfunction
+ void calculateDistances(int32 worldPosArray, int32 a2, int32 closestActorArray, int32 maxDistance);
+
+ // array containing collision detection tree
+ bool _collisionTreeAllocated;
+ uint32 *_collisionTree;
+ int addCollisionTreeChild(int depth, int index, int parent);
+
+ // op_1014 has several subops
+ // ...and several sub-subops
+ int generateCollisionObjectList(float srcX, float srcY, float srcZ, float velX, float velY, float velZ);
+ int addFromCollisionTreeNode(int index, int parent, uint32 *indices, int objIndexBase);
+ void addCollisionObj(byte objId);
+ int findCollisionWith(int objId, float inX, float inY, float inZ, float inXVec, float inYVec, float inZVec, float &collideX, float &collideY, float &collideZ, int indexArrayId, int dataArrayId, float *nextVelX, float *nextVelY, float *nextVelZ, float *a15);
+ void getPointsForFace(int faceId, float &x1, float &y1, float &z1, float &x2, float &y2, float &z2, float &x3, float &y3, float &z3, float &x4, float &y4, float &z4, const int *objPoints);
+ void crossProduct(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, float &outX, float &outY, float &outZ);
+ double dotProduct(float a1, float a2, float a3, float a4, float a5, float a6);
+ void sortCollisionList(float *data, int numEntries, int entrySize, int compareOn);
+ int setCollisionOutputData(float *collisionData, int entrySize, int dataArrayId, int indexArrayId, int startX, int startY, int startZ, float a8, int a9, int a10, int a11, int *out);
+
+ // op_1014 sets an array optionally based upon
+ // setCollisionOutputData; it is then used by op_1008
+ int _internalCollisionOutData[10];
+ Common::List<byte> _collisionObjs;
+
+ // op_1021 can (optionally) set two variables for use in op_1008
+ uint32 _var1021[2];
+};
+
+int LogicHEsoccer::versionID() {
+ return 1;
+}
+
+LogicHEsoccer::LogicHEsoccer(ScummEngine_v90he *vm) : LogicHE(vm) {
+ _userDataD = (double *)calloc(1732, sizeof(double));
+ _collisionTree = 0;
+ _collisionTreeAllocated = false;
+}
+
+LogicHEsoccer::~LogicHEsoccer() {
+ free(_userDataD);
+ delete[] _collisionTree;
+}
+
+int32 LogicHEsoccer::dispatch(int op, int numArgs, int32 *args) {
+ int res = 0;
+
+ switch (op) {
+ case 1006:
+ res = op_1006(args[0], args[1], args[2], args[3]);
+ break;
+
+ case 1007:
+ res = op_1007(args);
+ break;
+
+ case 1008:
+ res = op_1008(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], args[16], args[17], args[18]);
+ break;
+
+ case 1011:
+ res = op_1011(args[0], args[1], args[2], args[3], args[4], args[5]);
+ break;
+
+ case 1012:
+ res = op_1012(args);
+ break;
+
+ case 1013:
+ res = op_1013(args[0], args[1], args[2]);
+ break;
+
+ case 1014:
+ res = op_1014(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13]);
+ break;
+
+ case 1016:
+ res = op_1016(args);
+ break;
+
+ case 1017:
+ res = op_1017(args);
+ break;
+
+ case 1019:
+ res = op_1019(args);
+ break;
+
+ case 1021:
+ res = op_1021(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+ break;
+
+ case 1001: case 1002: case 1003: case 1005:
+ case 1009: case 8221968:
+ // In the u32, but unused by any of the soccer scripts
+ // 1005 is called from another opcode, however
+ error("Unused soccer u32 opcode %d called", op);
+
+ case 1004: case 1010: case 1015: case 1018:
+ case 1020:
+ // Used only by the unaccessible in-game editor (so, fall through)
+
+ default:
+ LogicHE::dispatch(op, numArgs, args);
+ }
+
+ return res;
+}
+
+void LogicHEsoccer::beforeBootScript() {
+ _userDataD[530] = 0;
+}
+
+void LogicHEsoccer::initOnce() {
+ // The original sets some paths here that we don't need to worry about
+ _collisionTreeAllocated = false;
+ _userDataD[530] = 0;
+}
+
+int LogicHEsoccer::startOfFrame() {
+ // This variable is some sort of flag that activates this mode
+ int res = (int)_userDataD[530];
+
+ if (res)
+ res = op_1011((int)_userDataD[531], (int)_userDataD[532], (int)_userDataD[533], (int)_userDataD[534], (int)_userDataD[535], (int)_userDataD[536]);
+
+ return res;
+}
+
+int LogicHEsoccer::op_1005(float x1, float y1, float z1, float x2, float y2, float z2, float *nextVelX, float *nextVelY, float *nextVelZ, float *a10) {
+ // Called from op_1014
+
+ double dot = x1 * x2 + y1 * y2 + z1 * z2;
+ *nextVelX = x2 - 2 * dot * x1;
+ *nextVelY = y2 - 2 * dot * y1;
+ *nextVelZ = z2 - 2 * dot * z1;
+ *a10 = 1.0f; // It always does this. How curious!
+
+ return 1;
+}
+
+int LogicHEsoccer::op_1006(int32 a1, int32 a2, int32 a3, int32 a4) {
+ double v1 = a1 * 0.01;
+ double v2 = a2 * 0.01;
+ double v3 = a3 * 0.01;
+ double var108, var109;
+
+ _userDataD[529] = a4;
+
+ var108 = atan2(v1, v3) * _userDataD[523] - a4;
+ var109 = _userDataD[526] - _userDataD[528] - (_userDataD[521] - atan2(_userDataD[524] - v2, v3)) * _userDataD[522];
+
+ writeScummVar(108, (int32)var108);
+ writeScummVar(109, (int32)var109);
+
+ return 1;
+}
+
+int LogicHEsoccer::op_1007(int32 *args) {
+ // Used when the HE logo is shown
+ // This initializes the _userDataD fields that are used in op_1006/op_1011
+
+ float y1 = (double)args[0] / 100.0;
+ float x1 = (double)args[1] / 100.0;
+ float x2 = (double)args[2] / 100.0;
+ float y2 = (double)args[3] / 100.0;
+ float x3 = (double)args[4] / 100.0;
+
+ _userDataD[518] = x2;
+ _userDataD[519] = 2 * atan2(y2, x2 - x3);
+ _userDataD[520] = atan2(y1, x2);
+ _userDataD[521] = atan2(y1, x1);
+ _userDataD[524] = y1;
+ _userDataD[525] = 2 * (_userDataD[521] - _userDataD[520]);
+ _userDataD[526] = args[6];
+ _userDataD[527] = args[5];
+ _userDataD[528] = args[7];
+ _userDataD[522] = _userDataD[526] / _userDataD[525];
+ _userDataD[523] = _userDataD[527] / _userDataD[519];
+
+ // Clear both byte arrays
+ memset(_collisionObjIds, 0, 4096);
+ memset(_collisionNodeEnabled, 0, 585);
+
+ if (!_collisionTreeAllocated)
+ op_1013(4, args[8], args[9]);
+
+ return 1;
+}
+
+static inline double vectorLength(double x, double y, double z) {
+ return sqrt(x * x + y * y + z * z);
+}
+
+int LogicHEsoccer::op_1008(int outArray, int srcX, int srcY, int srcZ, int vecX, int vecY, int vecZ, int airResX, int airResY, int airResZ, int vecNumerator, int vecDenom, int gravityMult, int requiredSegments, int a15, int a16, int a17, int a18, int fieldType) {
+ // Calculate requiredSegments consecutive movement segments, and place
+ // the associated data (positions, vectors, etc) into outArray.
+
+ int loopsSoFar = 0;
+ int segmentsSoFar = 1;
+ int prevVecY = 500;
+ int inX = srcX;
+ int inZ = srcZ;
+ int checkForCollisions = 0;
+
+ while (segmentsSoFar <= requiredSegments) {
+ if (fieldType == 1 && srcZ > 8819)
+ checkForCollisions = 1;
+ else if (fieldType == 2 && (srcX < -2350 || srcX > 2350))
+ checkForCollisions = 1;
+ else if (fieldType == 3 && (srcX < -2350 || srcX > 2350 || srcZ < 6119 || srcZ > 8819))
+ checkForCollisions = 1;
+
+ if (srcY > 0)
+ vecY -= vecNumerator * gravityMult / vecDenom;
+
+ int prevX = srcX;
+ int prevY = srcY;
+ int prevZ = srcZ;
+ srcX += vecNumerator * vecX / vecDenom;
+ srcY += vecNumerator * vecY / vecDenom;
+ srcZ += vecNumerator * vecZ / vecDenom;
+
+ if (srcY > 0) {
+ if (checkForCollisions && op_1014(prevX, prevY, prevZ, vecX, vecY, vecZ, 0, a17, a18, 3, vecNumerator, vecDenom, a15, a16)) {
+ srcX = _internalCollisionOutData[6];
+ srcY = _internalCollisionOutData[7];
+ srcZ = _internalCollisionOutData[8];
+ vecX = _internalCollisionOutData[3];
+ vecY = _internalCollisionOutData[4];
+ vecZ = _internalCollisionOutData[5];
+ putInArray(outArray, segmentsSoFar, 0, loopsSoFar);
+ putInArray(outArray, segmentsSoFar, 1, (int)vectorLength((double)(_internalCollisionOutData[6] - inX), 0.0, (double)(_internalCollisionOutData[8] - inZ)));
+ putInArray(outArray, segmentsSoFar, 2, _internalCollisionOutData[6]);
+ putInArray(outArray, segmentsSoFar, 3, _internalCollisionOutData[7]);
+ putInArray(outArray, segmentsSoFar, 4, _internalCollisionOutData[8]);
+ putInArray(outArray, segmentsSoFar, 5, vecX);
+ putInArray(outArray, segmentsSoFar, 6, vecY);
+ putInArray(outArray, segmentsSoFar++, 7, vecZ);
+ }
+ } else {
+ srcY = 0;
+ int thisVecX = vecX;
+ int thisVecZ = vecZ;
+ vecX = vecX * airResX / 100;
+
+ if (vecY) {
+ int v18 = ABS(vecY);
+ if (v18 > ABS(prevVecY))
+ vecY = ABS(prevVecY);
+ vecY = ABS(airResY * vecY) / 100;
+ }
+
+ vecZ = airResZ * vecZ / 100;
+
+ if (prevVecY >= 0) {
+ if (op_1014(prevX, prevY, prevZ, thisVecX, prevVecY, thisVecZ, 0, a17, a18, 3, vecNumerator, vecDenom, a15, a16)) {
+ srcX = _internalCollisionOutData[6];
+ srcY = _internalCollisionOutData[7];
+ srcZ = _internalCollisionOutData[8];
+ vecX = _internalCollisionOutData[3];
+ vecY = _internalCollisionOutData[4];
+ vecZ = _internalCollisionOutData[5];
+ }
+ } else {
+ if (checkForCollisions) {
+ op_1021(srcX, 0, srcZ, thisVecX, prevVecY, thisVecZ, 1);
+
+ if (op_1014(prevX, prevY, prevZ, thisVecX, prevVecY, thisVecZ, 0, a17, a18, 3, vecNumerator, vecDenom, a15, a16)) {
+ srcX = _internalCollisionOutData[6];
+ srcY = _internalCollisionOutData[7];
+ srcZ = _internalCollisionOutData[8];
+ vecX = _internalCollisionOutData[3];
+ vecY = _internalCollisionOutData[4];
+ vecZ = _internalCollisionOutData[5];
+ } else {
+ // try it with the output of op_1021 instead
+ int tmpVecZ = vecZ + prevZ - _var1021[1];
+ int v20 = ABS(prevVecY);
+
+ if (op_1014(_var1021[0], 0, _var1021[1], vecX + prevX - _var1021[0], v20 - prevY, tmpVecZ, 0, a17, a18, 3, vecNumerator, vecDenom, a15, a16)) {
+ srcX = _internalCollisionOutData[6];
+ srcY = _internalCollisionOutData[7];
+ srcZ = _internalCollisionOutData[8];
+ vecX = _internalCollisionOutData[3];
+ vecY = _internalCollisionOutData[4];
+ vecZ = _internalCollisionOutData[5];
+ }
+ }
+ }
+ }
+
+ prevVecY = vecY;
+ putInArray(outArray, segmentsSoFar, 0, loopsSoFar);
+ putInArray(outArray, segmentsSoFar, 1, (int32)vectorLength(srcX - inX, 0.0, srcZ - inZ));
+ putInArray(outArray, segmentsSoFar, 2, srcX);
+ putInArray(outArray, segmentsSoFar, 3, srcY);
+ putInArray(outArray, segmentsSoFar, 4, srcZ);
+ putInArray(outArray, segmentsSoFar, 5, vecX);
+ putInArray(outArray, segmentsSoFar, 6, vecY);
+ putInArray(outArray, segmentsSoFar++, 7, vecZ);
+ }
+
+ loopsSoFar++;
+ }
+
+ return 1;
+}
+
+int LogicHEsoccer::op_1011(int32 worldPosArray, int32 screenPosArray, int32 a3, int32 closestActorArray, int32 maxDistance, int32 fieldAreaArray) {
+ // This is called on each frame by startOfFrame() if activated by op_1012.
+
+ float objY = 0.0;
+
+ // First, iterate over the field objects and project them onto the screen.
+ for (int i = 0; i < 18; i++) {
+ int rawX = getFromArray(worldPosArray, i, 0);
+ int rawY = getFromArray(worldPosArray, i, 1);
+ int rawZ = getFromArray(worldPosArray, i, 2);
+
+ float objX = (double)rawX / 100.0;
+ objY = (double)rawY / 100.0;
+ float objZ = (double)rawZ / 100.0;
+
+ if (i < 13) {
+ // For the players and the ball: work out the area of the field
+ // this object is in, storing it in an array if provided.
+ int areaX = (rawX + 2750) / 500;
+ areaX = CLIP(areaX, 0, 10);
+
+ int areaZ = (9219 - rawZ) / 500;
+ areaZ = CLIP(areaZ, 0, 6);
+
+ if (fieldAreaArray)
+ putInArray(fieldAreaArray, 0, i, areaX + 11 * areaZ);
+ }
+
+ float v7 = atan2(_userDataD[524] - objY, (double)objZ);
+ int screenY = (int)(_userDataD[526] - (_userDataD[521] - v7) * _userDataD[522] - 300.0);
+ double v9 = _userDataD[523];
+
+ // x/y position of objects
+ putInArray(screenPosArray, i, 0, (int32)(atan2(objX, objZ) * v9 + 640.0));
+ putInArray(screenPosArray, i, 1, screenY);
+
+ double v10 = atan2(_userDataD[524], (double)objZ);
+ int shadowScreenY = (int)(_userDataD[526] - (_userDataD[521] - (float)v10) * _userDataD[522] - 300.0);
+ double v13 = _userDataD[523];
+
+ // x/y position of shadows
+ putInArray(screenPosArray, i + ((_vm->_game.id == GID_SOCCER) ? 20 : 22), 0, (int32)(atan2(objX, objZ) * v13 + 640.0));
+ putInArray(screenPosArray, i + ((_vm->_game.id == GID_SOCCER) ? 20 : 22), 1, shadowScreenY);
+ }
+
+ // soccer only uses one array here
+ // soccermls/soccer2004 use four
+ int start = (_vm->_game.id == GID_SOCCER) ? 19 : 18;
+ int end = (_vm->_game.id == GID_SOCCER) ? 19 : 21;
+
+ // The following loop is doing cursor scaling
+ // The further up on the screen, the smaller the cursor is
+ for (int i = start; i <= end; i++) {
+ int x = getFromArray(screenPosArray, i, 0);
+ int y = getFromArray(screenPosArray, i, 1);
+
+ // This retains objY from (i == 17)?
+ float v16 = _userDataD[524] - objY;
+ float scaledZ = v16 / tan((_userDataD[528] + y - _userDataD[526]) / _userDataD[522] + _userDataD[521]);
+ double scaledX = tan((double)(x - ((_vm->_game.id == GID_SOCCER) ? 0 : 640)) / _userDataD[523]) * scaledZ;
+ putInArray(worldPosArray, i, 0, (int)(scaledX * 100.0));
+ putInArray(worldPosArray, i, 2, (int)(scaledZ * 100.0));
+ }
+
+ calculateDistances(worldPosArray, a3, closestActorArray, maxDistance);
+
+ return 1;
+}
+
+static inline int distance(int a1, int a2, int a3, int a4) {
+ return (int)sqrt((double)((a4 - a3) * (a4 - a3) + (a2 - a1) * (a2 - a1)));
+}
+
+void LogicHEsoccer::calculateDistances(int32 worldPosArray, int32 a2, int32 closestActorArray, int32 maxDistance) {
+ // As you can guess, this is called from op_1011
+ // This seems to be checking distances between the players and the ball
+ // and which distance is the shortest.
+
+ int closestActor[13];
+ int objectX[13];
+ int objectZ[13];
+ int closestDistance[195];
+
+ for (int i = 0; i < 13; i++) {
+ closestActor[i] = 0;
+ objectX[i] = getFromArray(worldPosArray, i, 0);
+ objectZ[i] = getFromArray(worldPosArray, i, 2);
+ }
+
+ // 12 here, 13 up there
+ // Probably 12 for players, 13 for players+ball
+ for (int i = 0; i < 12; i++) {
+ int bestDistance = maxDistance;
+ for (int j = i + 1; j < 13; j++) {
+ closestDistance[i * 15 + j] = distance(objectX[i], objectX[j], objectZ[i], objectZ[j]);
+ putInArray(a2, i, j, closestDistance[i * 15 + j]);
+ putInArray(a2, j, i, closestDistance[i * 15 + j]);
+ if (closestDistance[i * 15 + j] < bestDistance) {
+ bestDistance = closestDistance[i * 15 + j];
+ closestActor[i] = j + 1;
+ closestActor[j] = i + 1;
+ }
+ }
+ }
+
+ int v13 = getFromArray(worldPosArray, 18, 0);
+ int v14 = getFromArray(worldPosArray, 18, 2);
+ int v15 = getFromArray(worldPosArray, 19, 0);
+ int v16 = getFromArray(worldPosArray, 19, 2);
+ int v19[15];
+ int v20[15];
+
+ if (_vm->_game.id == GID_SOCCER) {
+ // soccer gets to be different
+ for (int i = 0; i < 13; i++)
+ v20[i] = distance(v15, objectX[i], v16, objectZ[i]);
+
+ for (int i = 0; i < 13; i++)
+ v19[i] = distance(v13, objectX[i], v14, objectZ[i]);
+ } else {
+ // soccermls and soccer2004 use two other arrays here
+ int v9 = getFromArray(worldPosArray, 20, 0);
+ int v10 = getFromArray(worldPosArray, 20, 2);
+ int v11 = getFromArray(worldPosArray, 21, 0);
+ int v12 = getFromArray(worldPosArray, 21, 2);
+
+ for (int i = 0; i < 6; i++) {
+ v20[i] = distance(v9, objectX[i], v10, objectZ[i]);
+ v19[i] = distance(v13, objectX[i], v14, objectZ[i]);
+ }
+
+ for (int i = 6; i < 13; i++) {
+ v20[i] = distance(v11, objectX[i], v12, objectZ[i]);
+ v19[i] = distance(v15, objectX[i], v16, objectZ[i]);
+ }
+ }
+
+ for (int i = 0; i < 13; i++) {
+ putInArray(a2, 14, i, v20[i]);
+ putInArray(a2, i, 14, v20[i]);
+ putInArray(a2, 13, i, v19[i]);
+ putInArray(a2, i, 13, v19[i]);
+ putInArray(closestActorArray, 0, i, closestActor[i]);
+ }
+}
+
+int LogicHEsoccer::op_1012(int32 *args) {
+ // Used after op_1019
+ // This function activates startOfFrame() to call op_1011
+ // (Possibly field parameters?)
+
+ _userDataD[530] = (args[0] != 0) ? 1 : 0;
+ _userDataD[531] = args[1];
+ _userDataD[532] = args[2];
+ _userDataD[533] = args[3];
+ _userDataD[534] = args[4];
+ _userDataD[535] = args[5];
+ _userDataD[536] = args[6];
+
+ return 1;
+}
+
+int LogicHEsoccer::addCollisionTreeChild(int depth, int index, int parent) {
+ uint32 *dataPtr = _collisionTree + 11 * index;
+
+ /*
+ * This sets up a node of the tree stored in _collisionTree. There are
+ * two sets of parents (at depth 1 and 2), then child nodes at depth
+ * 3 which represent a single collision object.
+ *
+ * 0 = this index, 1 = parent index,
+ * 2-9 = child indices (or all -1 if leaf),
+ * 10 = _collisionObjIds index (if leaf)
+ */
+ dataPtr[0] = index;
+ dataPtr[1] = parent;
+
+ if (depth > 2) {
+ // store the offset into _collisionObjIds (which holds collision object ids),
+ // but subtract 585 first because there are already (8 + 8*8 + 8*8*8 = 584)
+ // indexes at higher levels of the tree, and we want to start at 0
+ dataPtr[10] = 8 * index - 585;
+ for (int i = 0; i < 8; i++)
+ dataPtr[i + 2] = 0xffffffff;
+ } else {
+ for (int i = 0; i < 8; i++)
+ dataPtr[i + 2] = addCollisionTreeChild(depth + 1, i + 8 * index + 1, index);
+ }
+
+ return index;
+}
+
+int LogicHEsoccer::op_1013(int32 a1, int32 a2, int32 a3) {
+ // Initialises _collisionTree, a tree used for collision detection.
+ // It is used by op_1014 to work out which objects to check.
+
+ _collisionTree = new uint32[585 * 11];
+ _collisionTreeAllocated = true;
+ for (int i = 0; i < 585 * 11; i++)
+ _collisionTree[i] = 0;
+
+ for (int i = 0; i < 8; i++)
+ _collisionTree[i + 2] = addCollisionTreeChild(1, i + 1, 0);
+
+ return 1;
+}
+
+int LogicHEsoccer::op_1014(int32 srcX, int32 srcY, int32 srcZ, int32 velX, int32 velY, int32 velZ, int32 outArray, int32 dataArrayId, int32 indexArrayId, int32 requestType, int32 vecNumerator, int32 vecDenom, int32 a13, int32 a14) {
+ // Used many times during a match
+ // And called from op_1008!
+ // This seems to be doing collision handling
+
+ double startX = (double)srcX;
+ double startY = (double)srcY;
+ double startZ = (double)srcZ;
+ double adjustedVelZ = 0.0, adjustedVelY = 0.0, adjustedVelX = 0.0;
+
+ writeScummVar(108, 0);
+ writeScummVar(109, 0);
+
+ switch (requestType) {
+ case 1:
+ case 3:
+ adjustedVelX = (double)velX * (double)vecNumerator / (double)vecDenom / 100.0;
+ adjustedVelY = (double)velY * (double)vecNumerator / (double)vecDenom / 100.0;
+ adjustedVelZ = (double)velZ * (double)vecNumerator / (double)vecDenom / 100.0;
+ break;
+ case 2:
+ // length of movement vector
+ double v15 = vectorLength((double)velX * (double)vecNumerator / (double)vecDenom, (double)velY * (double)vecNumerator / (double)vecDenom, (double)velZ * (double)vecNumerator / (double)vecDenom);
+
+ if (v15 != 0.0) {
+ // add the (scaled) movement vector to the input
+ double v26 = (double)ABS(velX) * (double)vecNumerator / (double)vecDenom * 50.0 / v15;
+ srcX = (int)((double)srcX + v26);
+ double v25 = (double)ABS(velY) * (double)vecNumerator / (double)vecDenom * 50.0 / v15;
+ srcY = (int)((double)srcY + v25);
+ double v24 = (double)ABS(velZ) * (double)vecNumerator / (double)vecDenom * 50.0 / v15;
+ srcZ = (int)((double)srcZ + v24);
+ }
+
+ // srcX = (newX / newZ) * 3869
+ startX = (double)srcX / (double)srcZ * 3869.0;
+ // srcY = (newY - (+524 * 100)) / (newZ * 3869 + (+524 * 100)
+ startY = ((double)srcY - _userDataD[524] * 100.0) / (double)srcZ * 3869.0 + _userDataD[524] * 100.0;
+ // srcZ = 3869
+ startZ = 3869.0;
+ // vectorX = (newX - srcX) / 100
+ adjustedVelX = ((double)srcX - startX) / 100.0;
+ // vectorY = (newY - srcY) / 100
+ adjustedVelY = ((double)srcY - startY) / 100.0;
+ // vectorZ = (newZ - 3869 = srcZ) / 100
+ adjustedVelZ = ((double)srcZ - 3869.0) / 100.0;
+ break;
+ }
+
+ int foundCollision = 0;
+
+ // work out which collision objects we might collide with (if any)
+ if (generateCollisionObjectList(startX, startY, startZ, adjustedVelX, adjustedVelY, adjustedVelZ)) {
+ int collisionId = 0;
+ float v46; // always 1.0 after a collision due to op_1005
+
+ float collisionInfo[42 * 8];
+ memset(collisionInfo, 0, 42 * 8 * sizeof(float));
+
+ // check each potential collision object for an actual collision,
+ // add it to collisionInfo if there is one
+ for (Common::List<byte>::const_iterator it = _collisionObjs.begin(); it != _collisionObjs.end(); it++) {
+ float collideZ, collideY, collideX;
+ float nextVelX, nextVelY, nextVelZ;
+
+ if (findCollisionWith(*it, startX, startY, startZ, adjustedVelX * 100.0, adjustedVelY * 100.0, adjustedVelZ * 100.0, collideX, collideY, collideZ, indexArrayId, dataArrayId, &nextVelX, &nextVelY, &nextVelZ, &v46)) {
+ collisionInfo[collisionId * 8] = *it;
+ collisionInfo[collisionId * 8 + 1] = vectorLength(collideX - startX, collideY - startY, collideZ - startZ);
+ collisionInfo[collisionId * 8 + 2] = collideX;
+ collisionInfo[collisionId * 8 + 3] = collideY;
+ collisionInfo[collisionId * 8 + 4] = collideZ;
+ collisionInfo[collisionId * 8 + 5] = vecDenom * nextVelX / vecNumerator;
+ collisionInfo[collisionId * 8 + 6] = vecDenom * nextVelY / vecNumerator;
+ collisionInfo[collisionId * 8 + 7] = vecDenom * nextVelZ / vecNumerator;
+ foundCollision = 1;
+ collisionId++;
+ }
+ }
+
+ if (foundCollision) {
+ // if we have more than one collision, sort them by distance
+ // to find the closest one
+ if (collisionId != 1)
+ sortCollisionList(collisionInfo, 42, 8, 1);
+
+ int v22, v39, v42;
+ float tmpData[8];
+ int outData[10];
+
+ // output the collision we found
+ switch (requestType) {
+ case 1:
+ for (int i = 0; i < 8; i++)
+ tmpData[i] = collisionInfo[i];
+ v22 = getFromArray(indexArrayId, 0, (int)((tmpData[0] - 1.0) * 4.0));
+ v42 = getFromArray(indexArrayId, 0, (int)((tmpData[0] - 1.0) * 4.0 + 1.0));
+ v39 = getFromArray(indexArrayId, 0, (int)((tmpData[0] - 1.0) * 4.0 + 2.0));
+ setCollisionOutputData(tmpData, 8, dataArrayId, indexArrayId, (int)startX, (int)startY, (int)startZ, v46, v22, v42, v39, outData);
+ for (int i = 0; i < 10; i++)
+ putInArray(outArray, 0, i, outData[i]);
+ break;
+ case 2:
+ // write the object id if collision happened (note that other case can't happen)
+ if (collisionId)
+ writeScummVar(109, (int)collisionInfo[(collisionId - 1) * 8]);
+ else
+ writeScummVar(109, 0);
+ break;
+ case 3:
+ for (int i = 0; i < 8; i++)
+ tmpData[i] = collisionInfo[i];
+ v22 = getFromArray(indexArrayId, 0, (int)((tmpData[0] - 1.0) * 4.0));
+ v42 = getFromArray(indexArrayId, 0, (int)((tmpData[0] - 1.0) * 4.0 + 1.0));
+ v39 = getFromArray(indexArrayId, 0, (int)((tmpData[0] - 1.0) * 4.0 + 2.0));
+ setCollisionOutputData(tmpData, 8, dataArrayId, indexArrayId, (int)startX, (int)startY, (int)startZ, v46, v22, v42, v39, outData);
+ for (int i = 0; i < 10; i++)
+ _internalCollisionOutData[i] = outData[i];
+ break;
+ }
+ }
+ }
+
+ writeScummVar(108, foundCollision);
+
+ _collisionObjs.clear();
+
+ return foundCollision;
+}
+
+int LogicHEsoccer::generateCollisionObjectList(float srcX, float srcY, float srcZ, float velX, float velY, float velZ) {
+ float v36 = srcX / 100.0;
+ float v37 = v36 + 52.0;
+ float destX = v37 + velX;
+
+ int v33, v29;
+
+ if (((int)destX / 52) ^ ((int)v37 / 52)) {
+ v33 = 1;
+ v29 = 1;
+ } else if ((int)v37 / 52) {
+ v29 = 0;
+ v33 = 1;
+ } else {
+ v33 = 0;
+ v29 = 1;
+ }
+
+ uint32 areaEnabled[8];
+ for (int i = 0; i < 4; i++) {
+ areaEnabled[i] = v29;
+ areaEnabled[i + 4] = v33;
+ }
+
+ float v38 = srcY / 100.0;
+ float destY = v38 + velY;
+
+ if (((int)destY / 20) ^ ((int)v38 / 20)) {
+ v33 = 1;
+ v29 = 1;
+ } else if ((int)v38 / 20) {
+ v33 = 1;
+ v29 = 0;
+ } else {
+ v29 = 1;
+ v33 = 0;
+ }
+
+ for (int i = 0; i < 2; i++) {
+ if (areaEnabled[i * 4 + 0])
+ areaEnabled[i * 4 + 0] = v29;
+ if (areaEnabled[i * 4 + 1])
+ areaEnabled[i * 4 + 1] = v29;
+ if (areaEnabled[i * 4 + 2])
+ areaEnabled[i * 4 + 2] = v33;
+ if (areaEnabled[i * 4 + 3])
+ areaEnabled[i * 4 + 3] = v33;
+ }
+
+ float v39 = srcZ / 100.0;
+ float v40 = v39 - 38.69;
+ float destZ = v40 + velZ;
+
+ if (((int)destZ / 36) ^ ((int)v40 / 36)) {
+ v33 = 1;
+ v29 = 1;
+ } else if ((int)v40 / 36) {
+ v29 = 0;
+ v33 = 1;
+ } else {
+ v33 = 0;
+ v29 = 1;
+ }
+
+ for (int i = 0; i <= 6; i += 2) {
+ if (areaEnabled[i])
+ areaEnabled[i] = v29;
+ if (areaEnabled[i + 1])
+ areaEnabled[i + 1] = v33;
+ }
+
+ int objCount = 0;
+
+ for (int i = 0; i < 8; i++) {
+ if (areaEnabled[i]) {
+ uint32 *ptr = _collisionTree + _collisionTree[i + 2] * 11;
+ objCount += addFromCollisionTreeNode(ptr[0], ptr[1], &ptr[2], ptr[10]);
+ }
+ }
+
+ writeScummVar(109, objCount);
+ return objCount;
+}
+
+int LogicHEsoccer::addFromCollisionTreeNode(int index, int parent, uint32 *indices, int objIndexBase) {
+ int objCount = 0;
+
+ if (indices[0] == 0xffffffff) {
+ for (int i = 0; i < 8; i++) {
+ if (_collisionObjIds[i + objIndexBase]) {
+ addCollisionObj(_collisionObjIds[i + objIndexBase]);
+ objCount = 1;
+ }
+ }
+ } else {
+ if (_collisionNodeEnabled[index]) {
+ for (int i = 0; i < 8; i++) {
+ uint32 *ptr = _collisionTree + indices[i] * 11;
+ objCount += addFromCollisionTreeNode(ptr[0], ptr[1], &ptr[2], ptr[10]);
+ }
+ }
+ }
+
+ return objCount;
+}
+
+void LogicHEsoccer::addCollisionObj(byte objId) {
+ // Add objId to the list if not found
+ for (Common::List<byte>::const_iterator it = _collisionObjs.begin(); it != _collisionObjs.end(); it++)
+ if (*it == objId)
+ return;
+
+ _collisionObjs.push_back(objId);
+}
+
+int LogicHEsoccer::findCollisionWith(int objId, float inX, float inY, float inZ, float inXVec, float inYVec, float inZVec, float &collideX, float &collideY, float &collideZ, int indexArrayId, int dataArrayId, float *nextVelX, float *nextVelY, float *nextVelZ, float *a15) {
+ int foundCollision = 0;
+ float inY_plus1 = inY + 1.0;
+ float destX = inX + inXVec;
+ float destY = inY_plus1 + inYVec;
+ float destZ = inZ + inZVec;
+
+ // don't go below the ground!
+ if (inY_plus1 <= 1.0001 && destY < 0.0) {
+ destY = 0.0;
+ inYVec = ABS((int)inYVec);
+ }
+
+ // get the 8 points which define the 6 faces of this object
+ int objIndex = getFromArray(indexArrayId, 0, 4 * objId - 1);
+ int objPoints[24];
+ for (int i = 0; i < 24; i++)
+ objPoints[i] = getFromArray(dataArrayId, 0, objIndex + i);
+
+ for (int faceId = 0; faceId < 6; faceId++) {
+ // This assigns variables from objPoints based on faceId
+ float x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4;
+ float faceCrossX, faceCrossY, faceCrossZ;
+ getPointsForFace(faceId, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, objPoints);
+ crossProduct(x1, y1, z1, x2, y2, z2, x1, y1, z1, x3, y3, z3, faceCrossX, faceCrossY, faceCrossZ);
+
+ float faceArea = sqrt(faceCrossX * faceCrossX + faceCrossY * faceCrossY + faceCrossZ * faceCrossZ);
+
+ // The original did not initialize these variables and would
+ // use them uninitialized if faceArea == 0.0
+ float xMult = 0.0, yMult = 0.0, zMult = 0.0;
+
+ if (faceArea != 0.0) {
+ // UnitCross = Cross/||Cross||
+ xMult = faceCrossX / faceArea;
+ yMult = faceCrossY / faceArea;
+ zMult = faceCrossZ / faceArea;
+ }
+ double scalingMult = 5.0;
+
+ float ZToFacePoint1 = z1 - inZ;
+ float YToFacePoint1 = y1 - inY_plus1;
+ float XToFacePoint1 = x1 - inX;
+ // scalar component of UnitCross in direction of (start -> P1)
+ double ToFacePoint1 = dotProduct(xMult, yMult, zMult, XToFacePoint1, YToFacePoint1, ZToFacePoint1);
+
+ float ZToDest = destZ - inZ;
+ float YToDest = destY - inY_plus1;
+ float XToDest = destX - inX;
+ // scalar component of UnitCross in direction of (start -> dest)
+ double ToDest = dotProduct(xMult, yMult, zMult, XToDest, YToDest, ZToDest);
+
+ if (fabs(ToDest) > 0.00000001)
+ scalingMult = ToFacePoint1 / ToDest;
+
+ if (scalingMult >= 0.0 && fabs(scalingMult) <= 1.0 && ToDest != 0.0) {
+ // calculate where the collision would be, in the plane containing this face
+ double collisionX = inX + (destX - inX) * scalingMult;
+ double collisionY = inY_plus1 + (destY - inY_plus1) * scalingMult + 5.0;
+ double collisionZ = inZ + (destZ - inZ) * scalingMult;
+
+ // now we need to work out whether this point is actually inside the face
+ double dot1 = dotProduct(x2 - x1, y2 - y1, z2 - z1, x3 - x1, y3 - y1, z3 - z1);
+ double sqrt1 = vectorLength(x2 - x1, y2 - y1, z2 - z1);
+ double num1 = dot1 / (vectorLength(x3 - x1, y3 - y1, z3 - z1) * sqrt1);
+ num1 = CLIP<double>(num1, -1.0, 1.0);
+ double faceAngle = acos(num1);
+
+ double dot2 = dotProduct(x2 - x1, y2 - y1, z2 - z1, collisionX - x1, collisionY - y1, collisionZ - z1);
+ double sqrt2 = vectorLength(x2 - x1, y2 - y1, z2 - z1);
+ double num2 = dot2 / (vectorLength(collisionX - x1, collisionY - y1, collisionZ - z1) * sqrt2);
+ num2 = CLIP<double>(num2, -1.0, 1.0);
+ double angle1 = acos(num2);
+
+ double dot3 = dotProduct(x3 - x1, y3 - y1, z3 - z1, collisionX - x1, collisionY - y1, collisionZ - z1);
+ double sqrt3 = vectorLength(x3 - x1, y3 - y1, z3 - z1);
+ double num3 = dot3 / (vectorLength(collisionX - x1, collisionY - y1, collisionZ - z1) * sqrt3);
+ num3 = CLIP<double>(num3, -1.0, 1.0);
+ double angle2 = acos(num3);
+
+ if (angle1 + angle2 - 0.001 <= faceAngle) {
+ double dot4 = dotProduct(x2 - x4, y2 - y4, z2 - z4, x3 - x4, y3 - y4, z3 - z4);
+ double sqrt4 = vectorLength(x2 - x4, y2 - y4, z2 - z4);
+ double num4 = dot4 / (vectorLength(x3 - x4, y3 - y4, z3 - z4) * sqrt4);
+ num4 = CLIP<double>(num4, -1.0, 1.0);
+ faceAngle = acos(num4);
+
+ double dot5 = dotProduct(x2 - x4, y2 - y4, z2 - z4, collisionX - x4, collisionY - y4, collisionZ - z4);
+ double sqrt5 = vectorLength(x2 - x4, y2 - y4, z2 - z4);
+ double num5 = dot5 / (vectorLength(collisionX - x4, collisionY - y4, collisionZ - z4) * sqrt5);
+ num5 = CLIP<double>(num5, -1.0, 1.0);
+ double angle3 = acos(num5);
+
+ double dot6 = dotProduct(x3 - x4, y3 - y4, z3 - z4, collisionX - x4, collisionY - y4, collisionZ - z4);
+ double sqrt6 = vectorLength(x3 - x4, y3 - y4, z3 - z4);
+ double num6 = dot6 / (vectorLength(collisionX - x4, collisionY - y4, collisionZ - z4) * sqrt6);
+ num6 = CLIP<double>(num6, -1.0, 1.0);
+ double angle4 = acos(num6);
+
+ if (angle3 + angle4 - 0.001 <= faceAngle) {
+ // found a collision with this face
+ if (foundCollision) {
+ // if we already found one, is the new one closer?
+ // (except this don't adjust for the modification of collideX/Y/Z..)
+ double ToCollide = vectorLength(inX - collisionX, inY_plus1 - collisionY, inZ - collisionZ);
+ if (vectorLength(inX - collideX, inY_plus1 - collideY, inZ - collideZ) > ToCollide) {
+ collideX = collisionX - xMult * 3.0;
+ collideY = collisionY - yMult * 3.0;
+ collideZ = collisionZ - zMult * 3.0;
+ op_1005(xMult, yMult, zMult, inXVec, inYVec, inZVec, nextVelX, nextVelY, nextVelZ, a15);
+ }
+ } else {
+ collideX = collisionX - xMult * 3.0;
+ collideY = collisionY - yMult * 3.0;
+ collideZ = collisionZ - zMult * 3.0;
+ op_1005(xMult, yMult, zMult, inXVec, inYVec, inZVec, nextVelX, nextVelY, nextVelZ, a15);
+ }
+
+ foundCollision = 1;
+ }
+ }
+ }
+ }
+
+ return foundCollision;
+}
+
+void LogicHEsoccer::getPointsForFace(int faceId, float &x1, float &y1, float &z1, float &x2, float &y2, float &z2, float &x3, float &y3, float &z3, float &x4, float &y4, float &z4, const int *objPoints) {
+ // Note that this originally returned a value, but said value was never used
+ // TODO: This can probably be shortened using a few tables...
+
+ switch (faceId) {
+ case 0:
+ x1 = objPoints[0];
+ y1 = objPoints[1];
+ z1 = objPoints[2];
+ x2 = objPoints[3];
+ y2 = objPoints[4];
+ z2 = objPoints[5];
+ x3 = objPoints[6];
+ y3 = objPoints[7];
+ z3 = objPoints[8];
+ x4 = objPoints[9];
+ y4 = objPoints[10];
+ z4 = objPoints[11];
+ break;
+ case 1:
+ x1 = objPoints[0];
+ y1 = objPoints[1];
+ z1 = objPoints[2];
+ x2 = objPoints[6];
+ y2 = objPoints[7];
+ z2 = objPoints[8];
+ x3 = objPoints[12];
+ y3 = objPoints[13];
+ z3 = objPoints[14];
+ x4 = objPoints[18];
+ y4 = objPoints[19];
+ z4 = objPoints[20];
+ break;
+ case 2:
+ x1 = objPoints[3];
+ y1 = objPoints[4];
+ z1 = objPoints[5];
+ x2 = objPoints[15];
+ y2 = objPoints[16];
+ z2 = objPoints[17];
+ x3 = objPoints[9];
+ y3 = objPoints[10];
+ z3 = objPoints[11];
+ x4 = objPoints[21];
+ y4 = objPoints[22];
+ z4 = objPoints[23];
+ break;
+ case 3:
+ x1 = objPoints[0];
+ y1 = objPoints[1];
+ z1 = objPoints[2];
+ x2 = objPoints[12];
+ y2 = objPoints[13];
+ z2 = objPoints[14];
+ x3 = objPoints[3];
+ y3 = objPoints[4];
+ z3 = objPoints[5];
+ x4 = objPoints[15];
+ y4 = objPoints[16];
+ z4 = objPoints[17];
+ break;
+ case 4:
+ x1 = objPoints[6];
+ y1 = objPoints[7];
+ z1 = objPoints[8];
+ x2 = objPoints[9];
+ y2 = objPoints[10];
+ z2 = objPoints[11];
+ x3 = objPoints[18];
+ y3 = objPoints[19];
+ z3 = objPoints[20];
+ x4 = objPoints[21];
+ y4 = objPoints[22];
+ z4 = objPoints[23];
+ break;
+ case 5:
+ x1 = objPoints[15];
+ y1 = objPoints[16];
+ z1 = objPoints[17];
+ x2 = objPoints[12];
+ y2 = objPoints[13];
+ z2 = objPoints[14];
+ x3 = objPoints[21];
+ y3 = objPoints[22];
+ z3 = objPoints[23];
+ x4 = objPoints[18];
+ y4 = objPoints[19];
+ z4 = objPoints[20];
+ break;
+ }
+}
+
+void LogicHEsoccer::crossProduct(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, float &outX, float &outY, float &outZ) {
+ outX = (y2 - y1) * (z4 - z3) - (y4 - y3) * (z2 - z1);
+ outY = ((x2 - x1) * (z4 - z3) - (x4 - x3) * (z2 - z1)) * -1.0;
+ outZ = (x2 - x1) * (y4 - y3) - (x4 - x3) * (y2 - y1);
+}
+
+double LogicHEsoccer::dotProduct(float a1, float a2, float a3, float a4, float a5, float a6) {
+ return a1 * a4 + a2 * a5 + a3 * a6;
+}
+
+void LogicHEsoccer::sortCollisionList(float *data, int numEntries, int entrySize, int compareOn) {
+ // This takes an input array of collisions, and tries to sort it based on the distance
+ // (index of compareOn, always 1), copying in groups of entrySize, which is always 8
+
+ bool found = true;
+ int entry = 0;
+
+ while (found) {
+ found = false;
+
+ // while we still have entries, and there is an obj id set for the next entry
+ while (entry <= numEntries - 2 && data[(entry + 1) * 8] != 0.0) {
+ // if the current entry has distance 0, or the next entry is closer (distance is less)
+ if (data[compareOn + entry * 8] == 0 || data[compareOn + entry * 8] > data[compareOn + (entry + 1) * 8]) {
+ found = true;
+
+ // swap all data with the next entry
+ for (int i = 0; i < entrySize; i++) {
+ float tmp = data[i + entry * 8];
+ data[i + entry * 8] = data[i + (entry + 1) * 8];
+ data[i + (entry + 1) * 8] = tmp;
+ }
+ }
+
+ entry++;
+ }
+ }
+}
+
+int LogicHEsoccer::setCollisionOutputData(float *collisionData, int entrySize, int dataArrayId, int indexArrayId, int startX, int startY, int startZ, float a8, int a9, int a10, int a11, int *out) {
+ // area-provided data
+ out[0] = a9;
+ out[1] = a10;
+ out[2] = a11;
+ // new velocity, slowed by area-provided value
+ out[3] = (int)(collisionData[5] * (double)a10 / 100.0);
+ out[4] = (int)(collisionData[6] * (double)a10 / 100.0 * a8); // Note: a8 should always be 1
+ out[5] = (int)(collisionData[7] * (double)a10 / 100.0);
+ // new position
+ out[6] = (int)collisionData[2];
+ out[7] = (int)collisionData[3];
+ out[8] = (int)collisionData[4];
+ // collision object id
+ out[9] = (int)collisionData[0];
+ return out[9];
+}
+
+int LogicHEsoccer::op_1016(int32 *args) {
+ // Called when a goal is scored
+
+ int result = 0;
+
+ double v9 = (double)args[1] / 100.0;
+ double v13 = (double)args[2] / 100.0;
+ double v12 = (double)args[3] / 100.0;
+ double v18 = v13 * v13;
+ double v10 = (double)args[0] / 100.0 * (double)args[0] / 100.0;
+ double v11 = v9 * v9;
+ double v19 = (v9 * v9 * v12 * v12 + 2.0 * v9 * v12 * v18 + v18 * v18) * v10 * v10 - (v10 + v11) * v12 * v12 * v10 * v10;
+
+ if (v19 >= 0.0) {
+ double v6 = sqrt(v19);
+ double v17 = ((v9 * v12 + v18) * v10 + v6) / (v10 + v11 + v10 + v11);
+ double v16 = ((v9 * v12 + v18) * v10 - v6) / (v10 + v11 + v10 + v11);
+ double v7, v14;
+
+ if (v17 <= 0.0 || (v7 = sqrt(v17), v14 = acos(v7 / v13), v14 > 0.7853981633974475)) {
+ double v8, v15;
+ if (v16 <= 0.0 || (v8 = sqrt(v16), v15 = acos(v8 / v13), v15 > 0.7853981633974475)) {
+ writeScummVar(108, -1);
+ } else {
+ writeScummVar(108, (int)(v15 / 0.01745329251994328 * 100.0));
+ result = 1;
+ }
+ } else {
+ writeScummVar(108, (int)(v14 / 0.01745329251994328 * 100.0));
+ result = 1;
+ }
+ } else {
+ writeScummVar(108, -1);
+ }
+
+ return result;
+}
+
+int LogicHEsoccer::op_1017(int32 *args) {
+ // Used sporadically during a match (out of bounds?)
+ if (!args[1])
+ args[1] = 1;
+
+ double v3 = asin((double)args[0] / (double)args[1]);
+ writeScummVar(108, (int32)(v3 / 0.01745329251994328 * (double)args[1]));
+
+ return 1;
+}
+
+int LogicHEsoccer::op_1019(int32 *args) {
+ // Used at the beginning of a match
+ // Initializes some arrays with field collision data
+
+ // _collisionObjIds provides object ids for leaf nodes
+ // of the collision tree (_collisionTree).
+ for (int i = 0; i < 4096; i++)
+ _collisionObjIds[i] = getFromArray(args[1], 0, i);
+
+ // _collisionNodeEnabled enables or disables non-leaf nodes
+ // of the collision tree (_collisionTree).
+ for (int i = 0; i < 585; i++)
+ _collisionNodeEnabled[i] = getFromArray(args[0], 0, i);
+
+ // The remaining code of this function was used for the
+ // built-in editor. However, it is incomplete in the
+ // final product, so we do not need to have it.
+
+ return 1;
+}
+
+int LogicHEsoccer::op_1021(int32 inX, int32 inY, int32 inZ, int32 velX, int32 velY, int32 velZ, int32 internalUse) {
+ // Used during a match (ball movement?)
+ // Also called from op_1008
+
+ int outX;
+ if (velX && velY)
+ outX = (int)(((double)inY - (double)velY * (double)inX / (double)velX) * -1.0 * (double)velX / (double)velY);
+ else
+ outX = inX;
+
+ int outZ;
+ if (velZ && velY)
+ outZ = (int)(((double)inY - (double)velY * (double)inZ / (double)velZ) * -1.0 * (double)velZ / (double)velY);
+ else
+ outZ = inZ;
+
+ // The final argument chooses whether to store the results for op_1008 or
+ // store them in SCUMM variables.
+ if (internalUse) {
+ _var1021[0] = outX;
+ _var1021[1] = outZ;
+ } else {
+ writeScummVar(108, outX);
+ writeScummVar(109, outZ);
+ }
+
+ return 1;
+}
+
+LogicHE *makeLogicHEsoccer(ScummEngine_v90he *vm) {
+ return new LogicHEsoccer(vm);
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/he/logic_he.cpp b/engines/scumm/he/logic_he.cpp
index af56bca2ee..a76c393e13 100644
--- a/engines/scumm/he/logic_he.cpp
+++ b/engines/scumm/he/logic_he.cpp
@@ -33,29 +33,10 @@ LogicHE::LogicHE(ScummEngine_v90he *vm) : _vm(vm) {
LogicHE::~LogicHE() {
}
-LogicHErace::LogicHErace(ScummEngine_v90he *vm) : LogicHE(vm) {
- // Originally it used 0x930 and stored both floats and doubles inside
- _userData = (float *)calloc(550, sizeof(float));
- _userDataD = (double *)calloc(30, sizeof(double));
-
- // FIXME: of the 550 entries in _userData, only 516 till 532 are used
- // FIXME: similarly, in _userDataD only 9 till 17 are used for computations
- // (some of the other entries are also set, but never read, hence useless).
-}
-
-LogicHErace::~LogicHErace() {
- free(_userData);
- free(_userDataD);
-}
-
void LogicHE::writeScummVar(int var, int32 value) {
_vm->writeVar(var, value);
}
-static int32 scumm_round(double arg) {
- return (int32)(arg + 0.5);
-}
-
int LogicHE::versionID() {
return 1;
}
@@ -95,1370 +76,34 @@ int32 LogicHE::dispatch(int op, int numArgs, int32 *args) {
return 1;
}
-/***********************
- * Putt-Putt Joins the Race
- *
- */
-
-int LogicHErace::versionID() {
- return 1;
-}
-
-int32 LogicHErace::dispatch(int op, int numArgs, int32 *args) {
- int32 res;
-
- switch (op) {
- case 1003:
- res = op_1003(args);
- break;
-
- case 1004:
- res = op_1004(args);
- break;
-
- case 1100:
- res = op_1100(args);
- break;
-
- case 1101:
- res = op_1101(args);
- break;
-
- case 1102:
- res = op_1102(args);
- break;
-
- case 1103:
- res = op_1103(args);
- break;
-
- case 1110:
- res = op_1110();
- break;
-
- case 1120:
- res = op_1120(args);
- break;
-
- case 1130:
- res = op_1130(args);
- break;
-
- case 1140:
- res = op_1140(args);
- break;
-
- default:
- res = 0;
- break;
-
- }
-
- return res;
-}
-
-#define RAD2DEG (180 / M_PI)
-#define DEG2RAD (M_PI / 180)
-
-int32 LogicHErace::op_1003(int32 *args) {
- int value = args[2] ? args[2] : 1;
-
- writeScummVar(108, (int32)(atan2((double)args[0], (double)args[1]) * RAD2DEG * value));
-
- return 1;
-}
-
-int32 LogicHErace::op_1004(int32 *args) {
- int value = args[1] ? args[1] : 1;
-
- writeScummVar(108, (int32)(sqrt((float)args[0]) * value));
-
- return 1;
-}
-
-int32 LogicHErace::op_1100(int32 *args) {
- // _userData 516,517,518 describe a 3D translation?
- _userData[516] = (float)args[0] / args[10];
- _userData[517] = (float)args[1] / args[10];
- _userData[518] = (float)args[2] / args[10];
-
- // _userData 519,520,521 describe rotation angles around the x,y,z axes?
- _userData[519] = (float)args[3] / args[10];
- _userData[520] = (float)args[4] / args[10];
- _userData[521] = (float)args[5] / args[10];
-
- op_sub1(_userData[520]);
- op_sub2(_userData[521]);
-
- // _userData[532] seems to be some kind of global scale factor
- _userData[532] = (float)args[10];
-
- _userData[524] = (float)args[8]; // not used
- _userData[525] = (float)args[9]; // not used
- _userData[522] = (float)args[6] / args[10]; // not used
- _userData[523] = (float)args[7] / args[10]; // only used to compute 528 and 529
-
- // The following two are some kind of scale factors
- _userData[526] = (float)args[6] / args[8] / args[10];
- _userData[527] = (float)args[7] / args[9] / args[10];
-
- // Set var 108 and 109 -- the value set here corresponds to the values
- // set by op_1110!
- writeScummVar(108, (int32)((float)args[6] / args[8] * args[10]));
- writeScummVar(109, (int32)((float)args[7] / args[9] * args[10]));
-
- _userData[528] = (float)(_userData[519] - _userData[523] * 0.5);
- _userData[529] = (float)(_userData[519] + _userData[523] * 0.5);
-
- writeScummVar(110, (int32)(_userData[528] * args[10]));
- writeScummVar(111, (int32)(_userData[529] * args[10]));
-
- // 530 and 531 are only used to set vars 112 and 113, so no need
- // to store them permanently
- _userData[530] = (float)(_userData[517] / tan(_userData[529] * DEG2RAD));
- _userData[531] = (float)(_userData[517] / tan(_userData[528] * DEG2RAD));
-
- writeScummVar(112, (int32)(_userData[530] * args[10]));
- writeScummVar(113, (int32)(_userData[531] * args[10]));
-
- return 1;
-}
-
-int32 LogicHErace::op_1101(int32 *args) {
- // Update rotation params?
- int32 retval;
- float temp;
-
- temp = args[0] / _userData[532];
- if (_userData[519] != temp) {
- _userData[519] = temp;
- op_sub3(temp);
- retval = 1;
- } else {
- retval = (int32)temp;
- }
-
- temp = args[1] / _userData[532];
- if (_userData[520] != temp) {
- _userData[520] = temp;
- op_sub1(temp);
- retval = 1;
- }
-
- temp = args[2] / _userData[532];
- if (_userData[521] != temp) {
- _userData[521] = temp;
- op_sub2(temp);
- retval = 1;
- }
-
- return retval;
-}
-
-int32 LogicHErace::op_1102(int32 *args) {
- // Update translation params?
- int32 retval;
- float temp;
-
- temp = args[0] / _userData[532];
- if (_userData[516] != temp) {
- _userData[516] = temp;
- retval = 1;
- } else {
- retval = (int32)_userData[532];
- }
-
- temp = args[1] / _userData[532];
- if (_userData[517] != temp) {
- _userData[517] = temp;
- retval = 1;
- }
-
- temp = args[2] / _userData[532];
- if (_userData[518] != temp) {
- _userData[518] = temp;
- retval = 1;
- }
-
- return retval;
-}
-
-int32 LogicHErace::op_1103(int32 *args) {
- double angle = args[0] / args[1] * DEG2RAD;
-
- writeScummVar(108, (int32)(sin(angle) * args[2]));
- writeScummVar(109, (int32)(cos(angle) * args[2]));
-
- return 1;
-}
-
-int32 LogicHErace::op_1110() {
- writeScummVar(108, (int32)(_userData[526] * _userData[532] * _userData[532]));
- writeScummVar(109, (int32)(_userData[527] * _userData[532] * _userData[532]));
- writeScummVar(110, (int32)(_userData[532]));
-
- return 1;
-}
-
-int32 LogicHErace::op_1120(int32 *args) {
- double a0, a1, a2;
- double b0, b1, b2;
- double res1, res2;
-
- a0 = args[0] / _userData[532] - _userData[516];
- a1 = args[1] / _userData[532] - _userData[517];
- a2 = args[2] / _userData[532] - _userData[518];
-
- // Perform matrix multiplication (multiplying by a rotation matrix)
- b2 = a2 * _userDataD[17] + a1 * _userDataD[14] + a0 * _userDataD[11];
- b1 = a2 * _userDataD[16] + a1 * _userDataD[13] + a0 * _userDataD[10];
- b0 = a2 * _userDataD[15] + a1 * _userDataD[12] + a0 * _userDataD[9];
-
- res1 = (atan2(b0, b2) * RAD2DEG) / _userData[526];
- res2 = (atan2(b1, b2) * RAD2DEG - _userData[528]) / _userData[527];
-
- writeScummVar(108, (int32)res1);
- writeScummVar(109, (int32)res2);
-
- return 1;
-}
-
-int32 LogicHErace::op_1130(int32 *args) {
- double cs = cos(args[0] / _userData[532] * DEG2RAD);
- double sn = sin(args[0] / _userData[532] * DEG2RAD);
-
- writeScummVar(108, (int32)(cs * args[1] + sn * args[2]));
- writeScummVar(109, (int32)(cs * args[2] - sn * args[1]));
-
- return 1;
-}
-
-int32 LogicHErace::op_1140(int32 *args) {
- // This functions seems to perform some kind of projection: We project
- // the vector (arg2,arg3) onto the vector (arg0,arg1), but also apply
- // some kind of distortion factor ?!?
- double x = args[2], y = args[3];
-
- // We start by normalizing the vector described by arg2 and arg3.
- // So compute its length and divide the x and y coordinates
- const double sq = sqrt(x*x + y*y);
- x /= sq;
- y /= sq;
-
- // Compute the scalar product of the vectors (arg0,arg1) and (x,y)
- const double scalarProduct = x * args[0] + y * args[1];
-
- // Finally compute the projection of (arg2,arg3) onto (arg0,arg1)
- double projX = args[0] - 2 * scalarProduct * x;
- double projY = args[1] - 2 * scalarProduct * y;
-
- projX = projX * 20.0 / 23.0; // FIXME: Why is this here?
-
- writeScummVar(108, (int32)projX);
-
- if (args[3] >= 0) // FIXME: Why is this here?
- projY = projY * 5.0 / 6.0;
-
- writeScummVar(109, (int32)projY);
-
- return 1;
-}
-
-void LogicHErace::op_sub1(float arg) {
- // Setup a rotation matrix
- _userDataD[10] = _userDataD[12] = _userDataD[14] = _userDataD[16] = 0;
- _userDataD[13] = 1;
-
- _userDataD[9] = cos(arg * DEG2RAD);
- _userDataD[15] = sin(arg * DEG2RAD);
- _userDataD[11] = -_userDataD[15];
- _userDataD[17] = _userDataD[9];
-}
-
-void LogicHErace::op_sub2(float arg) {
- // Setup a rotation matrix -- but it is NEVER USED!
- _userDataD[20] = _userDataD[21] = _userDataD[24] = _userDataD[25] = 0;
- _userDataD[26] = 1;
-
- _userDataD[19] = sin(arg * DEG2RAD);
- _userDataD[18] = cos(arg * DEG2RAD);
- _userDataD[21] = -_userDataD[19];
- _userDataD[22] = _userDataD[18];
-}
-
-void LogicHErace::op_sub3(float arg) {
- // Setup a rotation matrix -- but it is NEVER USED!
- _userDataD[1] = _userDataD[2] = _userDataD[3] = _userDataD[6] = 0;
- _userDataD[0] = 1;
-
- _userDataD[4] = cos(arg * DEG2RAD);
- _userDataD[5] = sin(arg * DEG2RAD);
- _userDataD[7] = -_userDataD[5];
- _userDataD[8] = _userDataD[4];
-}
-
-/***********************
- * Freddi Fish's One-Stop Fun Shop
- * Pajama Sam's One-Stop Fun Shop
- * Putt-Putt's One-Stop Fun Shop
- *
- */
-
-int LogicHEfunshop::versionID() {
- return 1;
-}
-
-int32 LogicHEfunshop::dispatch(int op, int numArgs, int32 *args) {
- switch (op) {
- case 1004:
- op_1004(args);
- break;
-
- case 1005:
- op_1005(args);
- break;
-
- default:
- break;
- }
-
- return 0;
-}
-
-void LogicHEfunshop::op_1004(int32 *args) {
- double data[8], at, sq;
- int32 x, y;
- int i=0;
-
- for (i = 0; i <= 6; i += 2) {
- data[i] = getFromArray(args[0], 0, 519 + i);
- data[i + 1] = getFromArray(args[0], 0, 519 + i + 1);
- }
- int s = checkShape((int32)data[0], (int32)data[1], (int32)data[4], (int32)data[5],
- (int32)data[2], (int32)data[3], (int32)data[6], (int32)data[7], &x, &y);
-
- if (s != 1) {
- error("LogicHEfunshop::op_1004: Your shape has defied the laws of physics");
- return;
- }
-
- for (i = 0; i <= 6; i += 2) {
- data[i] -= (double)x;
- data[i + 1] -= (double)y;
- }
-
- double a1 = (double)args[1] * DEG2RAD;
-
- for (i = 0; i <= 6; i += 2) {
- at = atan2(data[i + 1], data[i]);
- sq = sqrt(data[i + 1] * data[i + 1] + data[i] * data[i]);
-
- if (at <= 0)
- at += 2 * M_PI;
-
- data[i] = cos(at + a1) * sq;
- data[i + 1] = sin(at + a1) * sq;
- }
-
- double minx = data[0];
- double miny = data[1];
-
- for (i = 0; i <= 6; i += 2) {
- if (data[i] < minx)
- minx = data[i];
- if (data[i + 1] < miny)
- miny = data[i + 1];
- }
-
- for (i = 0; i <= 6; i += 2) {
- data[i] -= minx;
- data[i + 1] -= miny;
-
- putInArray(args[0], 0, 519 + i, scumm_round(data[i]));
- putInArray(args[0], 0, 519 + i + 1, scumm_round(data[i + 1]));
- }
-}
-
-void LogicHEfunshop::op_1005(int32 *args) {
- double data[8];
- double args1, args2;
- int i;
- for (i = 520; i <= 526; i += 2) {
- data[i - 520] = getFromArray(args[0], 0, i - 1);
- data[i - 520 + 1] = getFromArray(args[0], 0, i);
- }
-
- args1 = (double)args[1] * 0.01 + 1;
- args2 = (double)args[2] * 0.01 + 1;
-
- for (i = 0; i < 4; i++) {
- data[2 * i] *= args1;
- data[2 * i + 1] *= args2;
- }
-
- for (i = 520; i <= 526; i += 2) {
- putInArray(args[0], 0, i - 1, scumm_round(data[i - 520]));
- putInArray(args[0], 0, i, scumm_round(data[i - 520 + 1]));
- }
-}
-
-int LogicHEfunshop::checkShape(int32 data0, int32 data1, int32 data4, int32 data5, int32 data2, int32 data3, int32 data6, int32 data7, int32 *x, int32 *y) {
- int32 diff5_1, diff0_4, diff7_3, diff2_6;
- int32 diff1, diff2;
- int32 delta, delta2;
- int32 sum1, sum2;
-
- diff0_4 = data0 - data4;
- diff5_1 = data5 - data1;
- diff1 = data1 * data4 - data0 * data5;
- sum1 = diff0_4 * data3 + diff1 + diff5_1 * data2;
- sum2 = diff0_4 * data7 + diff1 + diff5_1 * data6;
-
- if (sum1 != 0 && sum2 != 0) {
- sum2 ^= sum1;
-
- if (sum2 >= 0)
- return 0;
- }
-
- diff2_6 = data2 - data6;
- diff7_3 = data7 - data3;
- diff2 = data3 * data6 - data2 * data7;
- sum1 = diff2_6 * data1 + diff2 + diff7_3 * data0;
- sum2 = diff2_6 * data5 + diff2 + diff7_3 * data4;
-
- if (sum1 != 0 && sum2 != 0) {
- sum2 ^= sum1;
-
- if (sum2 >= 0)
- return 0;
- }
-
- delta = diff2_6 * diff5_1 - diff0_4 * diff7_3;
-
- if (delta == 0) {
- return 2;
- }
-
- if (delta < 0) {
- data7 = -((delta + 1) >> 1);
- } else {
- data7 = delta >> 1;
- }
-
- delta2 = diff2 * diff0_4 - diff1 * diff2_6;
-
- if (delta2 < 0) {
- delta2 -= data7;
- } else {
- delta2 += data7;
- }
-
- *x = delta2 / delta;
-
- delta2 = diff1 * diff7_3 - diff2 * diff5_1;
-
- if (delta2 < 0) {
- delta2 -= data7;
- } else {
- delta2 += data7;
- }
-
- *y = delta2 / delta;
-
- return 1;
-}
-
-/***********************
- * Backyard Football
- * Backyard Football 2002
- * Backyard Football Demo
- *
- */
-
-int LogicHEfootball::versionID() {
- return 1;
-}
-
-int32 LogicHEfootball::dispatch(int op, int numArgs, int32 *args) {
- int res = 0;
-
- switch (op) {
- case 1004:
- res = op_1004(args);
- break;
-
- case 1006:
- res = op_1006(args);
- break;
-
- case 1007:
- res = op_1007(args);
- break;
-
- case 1010:
- res = op_1010(args);
- break;
-
- case 1022:
- res = op_1022(args);
- break;
-
- case 1023:
- res = op_1023(args);
- break;
-
- case 1024:
- res = op_1024(args);
- break;
-
- case 8221968:
- // Someone had a fun and used his birthday as opcode number
- res = getFromArray(args[0], args[1], args[2]);
- break;
-
- case 1492: case 1493: case 1494: case 1495: case 1496:
- case 1497: case 1498: case 1499: case 1500: case 1501:
- case 1502: case 1503: case 1504: case 1505: case 1506:
- case 1507: case 1508: case 1509: case 1510: case 1511:
- case 1512: case 1513: case 1514: case 1555:
- // DirectPlay-related
- // 1513: initialize
- // 1555: set fake lag
- break;
-
- case 2200: case 2201: case 2202: case 2203: case 2204:
- case 2205: case 2206: case 2207: case 2208: case 2209:
- case 2210: case 2211: case 2212: case 2213: case 2214:
- case 2215: case 2216: case 2217: case 2218: case 2219:
- case 2220: case 2221: case 2222: case 2223: case 2224:
- case 2225: case 2226: case 2227: case 2228:
- // Boneyards-related
- break;
-
- case 3000: case 3001: case 3002: case 3003: case 3004:
- // Internet-related
- // 3000: check for updates
- // 3001: check network status
- // 3002: autoupdate
- // 3003: close connection
- break;
-
- default:
- LogicHE::dispatch(op, numArgs, args);
- warning("Tell sev how to reproduce it (%d)", op);
- }
-
- return res;
-}
-
-int LogicHEfootball::op_1004(int32 *args) {
- // Identical to LogicHEsoccer::op_1004
- double res, a2, a4, a5;
-
- a5 = ((double)args[4] - (double)args[1]) / ((double)args[5] - (double)args[2]);
- a4 = ((double)args[3] - (double)args[0]) / ((double)args[5] - (double)args[2]);
- a2 = (double)args[2] - (double)args[0] * a4 - args[1] * a5;
-
- res = (double)args[6] * a4 + (double)args[7] * a5 + a2;
- writeScummVar(108, (int32)res);
-
- writeScummVar(109, (int32)a2);
- writeScummVar(110, (int32)a5);
- writeScummVar(111, (int32)a4);
-
- return 1;
-}
-
-int LogicHEfootball::op_1006(int32 *args) {
- // This seems to be more or less the inverse of op_1010
- const double a1 = args[1];
- double res;
-
- // 2.9411764e-4 = 1/3400
- // 5.3050399e-2 = 1/18.85 = 20/377
- // 1.1764706e-2 = 1/85 = 40/3400
- // 1.2360656e-1 = 377/3050
- res = (1.0 - a1 * 2.9411764e-4 * 5.3050399e-2) * 1.2360656e-1 * args[0] +
- a1 * 1.1764706e-2 + 46;
-
- // Shortened / optimized version of that formula:
- // res = (377.0 - a1 / 170.0) / 3050.0 * args[0] + a1 / 85.0 + 46;
-
- writeScummVar(108, (int32)res);
-
- // 1.2360656e-1 = 377/3050
- // 1.1588235e-1 = 197/1700 = 394/3400
- res = 640.0 - args[2] * 1.2360656e-1 - a1 * 1.1588235e-1 - 26;
-
- writeScummVar(109, (int32)res);
-
- return 1;
-}
-
-int LogicHEfootball::op_1007(int32 *args) {
- double res, temp;
-
- temp = (double)args[1] * 0.32;
-
- if (temp > 304.0)
- res = -args[2] * 0.142;
- else
- res = args[2] * 0.142;
-
- res += temp;
-
- writeScummVar(108, (int32)res);
-
- res = (1000.0 - args[2]) * 0.48;
-
- writeScummVar(109, (int32)res);
-
- return 1;
-}
-
-int LogicHEfootball::op_1010(int32 *args) {
- // This seems to be more or less the inverse of op_1006
- double a1 = (640.0 - (double)args[1] - 26.0) / 1.1588235e-1;
-
- // 2.9411764e-4 = 1/3400
- // 5.3050399e-2 = 1/18.85 = 20/377
- // 1.1764706e-2 = 1/85 = 40/3400
- // 1.2360656e-1 = 377/3050
- double a0 = ((double)args[0] - 46 - a1 * 1.1764706e-2) /
- ((1.0 - a1 * 2.9411764e-4 * 5.3050399e-2) * 1.2360656e-1);
-
- writeScummVar(108, (int32)a0);
- writeScummVar(109, (int32)a1);
-
- return 1;
-}
-
-int LogicHEfootball::op_1022(int32 *args) {
- double res;
- double var10 = args[4] - args[1];
- double var8 = args[5] - args[2];
- double var6 = args[3] - args[0];
-
- res = sqrt(var8 * var8 + var6 * var6 + var10 * var10);
-
- if (res >= (double)args[6]) {
- var8 = (double)args[6] * var8 / res;
- var10 = (double)args[6] * var10 / res;
- res = (double)args[6] * var6 / res;
- }
-
- writeScummVar(108, (int32)res);
- writeScummVar(109, (int32)var10);
- writeScummVar(110, (int32)var8);
-
- return 1;
-}
-
-int LogicHEfootball::op_1023(int32 *args) {
- double var10, var18, var20, var28, var30, var30_;
- double argf[7];
-
- for (int i = 0; i < 7; i++)
- argf[i] = args[i];
-
- var10 = (argf[3] - argf[1]) / (argf[2] - argf[0]);
- var28 = var10 * var10 + 1;
- var20 = argf[0] * var10;
- var18 = (argf[5] + argf[1] + var20) * argf[4] * var10 * 2 +
- argf[6] * argf[6] * var28 + argf[4] * argf[4] -
- argf[0] * argf[0] * var10 * var10 -
- argf[5] * argf[0] * var10 * 2 -
- argf[5] * argf[1] * 2 -
- argf[1] * argf[1] - argf[5] * argf[5];
-
- if (var18 >= 0) {
- var18 = sqrt(var18);
-
- var30_ = argf[4] + argf[5] * var10 + argf[1] * var10 + argf[0] * var10 * var10;
- var30 = (var30_ - var18) / var28;
- var18 = (var30_ + var18) / var28;
-
- if ((argf[0] - var30 < 0) && (argf[0] - var18 < 0)) {
- var30_ = var30;
- var30 = var18;
- var18 = var30_;
- }
- var28 = var18 * var10 - var20 - argf[1];
- var20 = var30 * var10 - var20 - argf[1];
- } else {
- var18 = 0;
- var20 = 0;
- var28 = 0;
- var30 = 0;
- }
-
- writeScummVar(108, (int32)var18);
- writeScummVar(109, (int32)var28);
- writeScummVar(110, (int32)var30);
- writeScummVar(111, (int32)var20);
-
- return 1;
-}
-int LogicHEfootball::op_1024(int32 *args) {
- writeScummVar(108, 0);
- writeScummVar(109, 0);
- writeScummVar(110, 0);
- writeScummVar(111, 0);
-
- return 1;
-}
-
-
-/***********************
- * Backyard Soccer
- *
- */
-
-int LogicHEsoccer::versionID() {
- return 1;
-}
-
-LogicHEsoccer::LogicHEsoccer(ScummEngine_v90he *vm) : LogicHE(vm) {
- _userDataD = (double *)calloc(1732, sizeof(double));
- _intArray1 = 0;
- _intArray2 = 0;
- _intArraysAllocated = false;
- _array1013 = 0;
- _array1013Allocated = false;
-}
-
-LogicHEsoccer::~LogicHEsoccer() {
- free(_userDataD);
- op_1020(); // clear int arrays
- delete[] _array1013;
-}
-
-int32 LogicHEsoccer::dispatch(int op, int numArgs, int32 *args) {
- int res = 0;
-
- switch (op) {
- case 1001:
- res = op_1001(args);
- break;
-
- case 1002:
- res = op_1002(args);
- break;
-
- case 1004:
- res = op_1004(args);
- break;
-
- case 1006:
- res = op_1006(args[0], args[1], args[2], args[3]);
- break;
-
- case 1011:
- // args[4] is ignored!
- // soccer passes the argument, but then ends up not using it
- // Makes sense that they removed it for soccermls
- res = op_1011(args[0], args[1], args[2], args[3], args[5]);
- break;
-
- case 1012:
- res = op_1012(args);
- break;
-
- case 1013:
- res = op_1013(args[0], args[1], args[2]);
- break;
-
- case 1019:
- res = op_1019(args);
- break;
-
- case 1020:
- res = op_1020();
- break;
-
- case 1021:
- res = op_1021(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
- break;
-
- case 8221968:
- // Someone had a fun and used his birthday as opcode number
- res = getFromArray(args[0], args[1], args[2]);
- break;
-
- default:
- // original range is 1001 - 1021
- LogicHE::dispatch(op, numArgs, args);
- }
-
- return res;
-}
-
-void LogicHEsoccer::beforeBootScript() {
- if (_intArraysAllocated)
- op_1020();
-
- _userDataD[530] = 0;
-}
-
-void LogicHEsoccer::initOnce() {
- // The original sets some paths here that we don't need to worry about
- _array1013Allocated = false;
- _userDataD[530] = 0;
-}
-
-int LogicHEsoccer::startOfFrame() {
- // This variable is some sort of flag that activates this mode
- int res = (int)_userDataD[530];
-
- // _userDataD[535] is not used!
- // soccer passes the argument, but then ends up not using it
- // Makes sense that they removed it for soccermls
- if (res)
- res = op_1011((int)_userDataD[531], (int)_userDataD[532], (int)_userDataD[533], (int)_userDataD[534], (int)_userDataD[536]);
-
- return res;
-}
-
-int LogicHEsoccer::op_1001(int32 *args) {
- return (int)(args[0] * sin((float)args[1]));
-}
-
-int LogicHEsoccer::op_1002(int32 *args) {
- return _vm->VAR(2) * args[0];
-}
-
-int LogicHEsoccer::op_1003(int32 *args) {
- double data[6], out[3];
- int i;
-
- for (i = 0; i < 6; i++) {
- data[i] = getFromArray(args[0], 0, i);
- }
-
- out[0] = data[1] * data[5] - data[4] * data[2];
- out[1] = data[5] * data[0] - data[3] * data[2];
- out[2] = data[4] * data[0] - data[3] * data[1];
-
- for (i = 0; i < 3; i++) {
- putInArray(args[0], 0, i, scumm_round(out[i]));
- }
-
- return 1;
-}
-
-int LogicHEsoccer::op_1004(int32 *args) {
- // Identical to LogicHEfootball::op_1004
- double res, a2, a4, a5;
-
- a5 = ((double)args[4] - (double)args[1]) / ((double)args[5] - (double)args[2]);
- a4 = ((double)args[3] - (double)args[0]) / ((double)args[5] - (double)args[2]);
- a2 = (double)args[2] - (double)args[0] * a4 - args[1] * a5;
-
- res = (double)args[6] * a4 + (double)args[7] * a5 + a2;
- writeScummVar(108, (int32)res);
-
- writeScummVar(109, (int32)a2);
- writeScummVar(110, (int32)a5);
- writeScummVar(111, (int32)a4);
-
- return 1;
-}
-
-int LogicHEsoccer::op_1006(int32 a1, int32 a2, int32 a3, int32 a4) {
- double v1 = a1 * 0.01;
- double v2 = a2 * 0.01;
- double v3 = a3 * 0.01;
- double var108, var109;
-
- _userDataD[529] = a4;
-
- var108 = atan2(v1, v3) * _userDataD[523] - a4;
- var109 = _userDataD[526] - _userDataD[528] + (_userDataD[521] - atan2(_userDataD[524] - v2, v3)) * _userDataD[522];
-
- writeScummVar(108, (int32)var108);
- writeScummVar(109, (int32)var109);
-
- return 1;
-}
-
-int LogicHEsoccer::op_1007(int32 *args) {
- // Used when the HE logo is shown
- // This initializes the _userDataD fields that are used in op_1006/op_1011
-
- _intArraysAllocated = false;
- double v14 = (double)args[0] * 0.01;
- double v13 = (double)args[2] * 0.01;
- _userDataD[524] = v14;
- double v12 = atan2(v13, v14);
- _userDataD[520] = v12;
- double v15 = atan2(v13 - (double)args[4] * 0.01, (double)args[3] * 0.01);
- double v19 = v15 * 2.0;
- double v17 = atan2(v13 - (double)args[4] * 0.01, v14);
- _userDataD[519] = v19;
- _userDataD[521] = v17;
- _userDataD[525] = (v17 - v12) * 2.0;
- _userDataD[527] = (double)args[5];
- _userDataD[526] = (double)args[6];
- _userDataD[528] = (double)args[7];
- _userDataD[522] = _userDataD[526] / _userDataD[525];
- _userDataD[523] = _userDataD[527] / _userDataD[519];
- _userDataD[518] = v13;
-
- // Clear both byte arrays
- memset(_byteArray1, 0, 4096);
- memset(_byteArray2, 0, 585);
-
- if (_array1013Allocated == 0 )
- op_1013(4, args[8], args[9]);
-
- return 1;
-}
-
-// Returns the square root of the sum of the squares of the arguments
-static inline double sqrtSquare(double a1, double a2, double a3) {
- return sqrt(a1 * a1 + a2 * a2 + a3 * a3);
-}
-
-int LogicHEsoccer::op_1008(int32 *args) {
- // TODO: Used during a match (kicking?)
-
- return 1;
-}
-
-int LogicHEsoccer::op_1011(int32 a1, int32 a2, int32 a3, int32 a4, int32 a5) {
- // This is called on each frame by startOfFrame() if activated by op_1012.
- // This seems to do player placement!
-
- float v28 = 0.0;
-
- for (int i = 0; i < 18; i++) {
- // These seem to be some sort of percent? of angles?
- int v32 = getFromArray(a1, i, 0);
- int v6 = getFromArray(a1, i, 1);
- int v30 = getFromArray(a1, i, 2);
-
- float v29 = (double)v32 / 100.0;
- v28 = (double)v6 / 100.0;
- float v31 = (double)v30 / 100.0;
-
- if (i < 13) {
- int v25 = ((v32 + 2760) / 500 >= 0) ? ((v32 + 2750) / 500) : 0;
- int v24 = 10;
-
- if (v25 <= 10) {
- int v23 = 0;
- if ((v32 + 2750) / 500 >= 0)
- v23 = (v32 + 2750) / 500;
-
- v24 = v23;
- }
-
- int v22 = 0;
- if ((9219 - v30) / 500 >= 0)
- v22 = (9219 - v30) / 500;
-
- int v21 = 6;
- if (v22 <= 6) {
- int v20 = 0;
- if ((9219 - v30) / 500 >= 0)
- v20 = (9219 - v30) / 500;
- v21 = v20;
- }
-
- if (a5)
- putInArray(a5, 0, i, v24 + 11 * v21);
- }
-
- float v7 = atan2(_userDataD[524] - v28, (double)v31);
- int v8 = (int)(_userDataD[526] - (_userDataD[521] - v7) * _userDataD[522] + 300.0);
-
- double v9 = atan2(_userDataD[523], (double)v31);
- // x/y position?
- putInArray(a2, i, 0, (int32)(v29 * v9 + 640.0));
- putInArray(a2, i, 1, v8);
-
- double v10 = atan2(_userDataD[524], (double)v31);
- int v12 = (int)(_userDataD[526] - (_userDataD[521] - (float)v10) * _userDataD[522] + 300.0);
- double v13 = _userDataD[523];
-
- v29 = atan2(v29, v31);
- // x/y position?
- putInArray(a2, i + 22, 0, (int32)(v29 * v13 + 640.0));
- putInArray(a2, i + 22, 1, v12);
- }
-
- // soccer only uses one array here
- // soccermls/soccer2004 use four
- int start = (_vm->_game.id == GID_SOCCER) ? 19 : 18;
- int end = (_vm->_game.id == GID_SOCCER) ? 19 : 21;
-
- for (int i = start; i <= end; i++) {
- int v14 = getFromArray(a2, i, 0);
- int v15 = getFromArray(a2, i, 1);
-
- // This retains v28 from (i == 17)?
- float v16 = _userDataD[524] - v28;
- float v17 = v16 / tan((_userDataD[528] + v15 - _userDataD[526]) / (_userDataD[522] + _userDataD[521]));
- double v18 = tan((double)(v14 - 640) / _userDataD[523]) * v17;
- putInArray(a1, i, 0, (int)(v18 * 100.0));
- putInArray(a1, i, 2, (int)(v17 * 100.0));
- }
-
- op_1011_sub(a1, a3, a4, a4);
-
- return 1;
-}
-
-static inline int distance(int a1, int a2, int a3, int a4) {
- return (int)sqrt((double)((a4 - a3) * (a4 - a3) + (a2 - a1) * (a2 - a1)));
-}
-
-void LogicHEsoccer::op_1011_sub(int32 a1, int32 a2, int32 a3, int32 a4) {
- // As you can guess, this is called from op_1011
- // This seems to be checking distances between the players and the ball
- // and which distance is the shortest.
-
- int v6[13];
- int v7[13];
- int v8[13];
- int v18[195];
-
- for (int i = 0; i < 13; i++) {
- v6[i] = 0;
- v7[i] = getFromArray(a1, i, 0);
- v8[i] = getFromArray(a1, i, 2);
- }
-
- // 12 here, 13 up there
- // Probably 12 for players, 13 for players+ball
- for (int i = 0; i < 12; i++) {
- int v22 = a4;
- for (int j = i + 1; j < 13; j++) {
- v18[i * 15 + j] = distance(v7[i], v7[j], v8[i], v8[j]);
- putInArray(a2, i, j, v18[i * 15 + j]);
- putInArray(a2, j, i, v18[i * 15 + j]);
- if (v18[i * 15 + j] < v22) {
- v22 = v18[i * 15 + j];
- v6[i] = j + 1;
- v6[j] = i + 1;
- }
- }
- }
-
- int v13 = getFromArray(a1, 18, 0);
- int v14 = getFromArray(a1, 18, 2);
- int v15 = getFromArray(a1, 19, 0);
- int v16 = getFromArray(a1, 19, 2);
- int v19[15];
- int v20[15];
-
- if (_vm->_game.id == GID_SOCCER) {
- // soccer gets to be different
- for (int i = 0; i < 13; i++)
- v20[i] = distance(v13, v7[i], v14, v8[i]);
-
- for (int i = 0; i < 13; i++)
- v19[i] = distance(v15, v7[i], v16, v8[i]);
- } else {
- // soccermls and soccer2004 use two other arrays here
- int v9 = getFromArray(a1, 20, 0);
- int v10 = getFromArray(a1, 20, 2);
- int v11 = getFromArray(a1, 21, 0);
- int v12 = getFromArray(a1, 21, 2);
-
- for (int i = 0; i < 6; i++) {
- v20[i] = distance(v9, v7[i], v10, v8[i]);
- v19[i] = distance(v13, v7[i], v14, v8[i]);
- }
-
- for (int i = 6; i < 13; i++) {
- v20[i] = distance(v11, v7[i], v12, v8[i]);
- v19[i] = distance(v15, v7[i], v16, v8[i]);
- }
- }
-
- for (int i = 0; i < 13; i++) {
- putInArray(a2, 14, i, v20[i]);
- putInArray(a2, i, 14, v20[i]);
- putInArray(a2, 13, i, v19[i]);
- putInArray(a2, i, 13, v19[i]);
- putInArray(a3, 0, i, v6[i]);
- }
-}
-
-int LogicHEsoccer::op_1012(int32 *args) {
- // Used after op_1019
- // This function activates startOfFrame() to call op_1011
- // (Possibly field parameters?)
-
- _userDataD[530] = (args[0] != 0) ? 1 : 0;
- _userDataD[531] = args[1];
- _userDataD[532] = args[2];
- _userDataD[533] = args[3];
- _userDataD[534] = args[4];
- _userDataD[535] = args[5]; // unused!!!
- _userDataD[536] = args[6];
-
- return 1;
-}
-
-// Some strange power operation, ignores negative exponents
-static inline double u32Pow(float a1, int a2) {
- if (a2 < 0)
- return 0.0;
+LogicHE *LogicHE::makeLogicHE(ScummEngine_v90he *vm) {
+ switch (vm->_game.id) {
+ case GID_PUTTRACE:
+ return makeLogicHErace(vm);
- float v4 = 1.0;
+ case GID_FUNSHOP:
+ return makeLogicHEfunshop(vm);
- for (int i = 1; i <= a2; i++)
- v4 *= a1;
+ case GID_FOOTBALL:
+ return makeLogicHEfootball(vm);
- return v4;
-}
+ case GID_SOCCER:
+ case GID_SOCCERMLS:
+ case GID_SOCCER2004:
+ return makeLogicHEsoccer(vm);
-int LogicHEsoccer::op_sub5(int a1, int a2, int a3) {
- byte *v9 = _array1013 + 44 * a2;
+ case GID_BASEBALL2001:
+ return makeLogicHEbaseball2001(vm);
- *((uint32 *)v9 + 4) = a3;
- *((uint32 *)v9) = a2;
+ case GID_BASKETBALL:
+ return makeLogicHEbasketball(vm);
- if (a1 > 2) {
- // Casual observation: 585 is also the size of _byteArray2
- *((uint32 *)v9 + 40) = 8 * a2 - 585;
- for (int i = 0; i < 8; i++)
- *((uint32 *)v9 + 4 * i + 8) = 0xffffffff;
- } else {
- for (int i = 0; i < 8; i++)
- *((uint32 *)v9 + 4 * i + 8) = op_sub5(a1 + 1, i + 8 * a2 + 1, a2);
- }
-
- return a2;
-}
-
-int LogicHEsoccer::op_1013(int32 a1, int32 a2, int32 a3) {
- // Creates _array1013 for *some* purpose
- // _array1013Temp is used again op_1014 for some reason...
- // Seems to be used in op_1015
-
- int v4 = (int)((1.0 - u32Pow(8.0, 4)) / -7.0);
-
- _array1013 = new byte[v4 * 44];
- memset(_array1013, 0, v4 * 44);
- _array1013Allocated = true;
- memset(_array1013Temp, 0, 44);
-
- for (int i = 0; i < 8; i++)
- _array1013Temp[i + 2] = op_sub5(1, i + 1, 0);
-
- // Yes, this is not endian-safe, but should not matter since we're
- // not saving/loading the data anywhere
- memcpy(_array1013, _array1013Temp, 44);
-
- return 1;
-}
-
-int LogicHEsoccer::op_1014(int32 a1, int32 a2, int32 a3, int32 a4, int32 a5, int32 a6, int32 a7, int32 a8, int32 a9, int32 a10, int32 a11, int32 a12, int32 a13, int32 a14) {
- // TODO: Used many times during a match
- // And called from op_1008!
-
- return 1;
-}
-
-int LogicHEsoccer::op_1019(int32 *args) {
- // Used at the beginning of a match
- // Initializes some arrays. Player positions?
-
- // These two arrays are used in op_1014 and op_1015
- for (int i = 0; i < 4096; i++)
- _byteArray1[i] = getFromArray(args[1], 0, i);
-
- for (int i = 0; i < 585; i++)
- _byteArray2[i] = getFromArray(args[0], 0, i);
-
- // Deallocate the two integer arrays
- if (_intArraysAllocated)
- op_1020();
-
- // Reallocate them
- _intArray1 = new uint32[1008];
- _intArray2 = new uint32[168];
- _intArraysAllocated = true;
-
- memset(_intArray1, 0, 4 * 4);
- memset(_intArray2, 0, 24 * 4);
-
- // These two arrays are used in op_1015
- for (int i = 0; i < 42; i++) {
- for (int j = 0; j < 24; j++)
- _intArray1[j + 24 * i] = getFromArray(args[3], 0, j + 24 * i);
-
- for (int j = 0; j < 4; j++)
- _intArray2[j + 4 * i] = getFromArray(args[2], 0, j + 4 * i);
- }
-
- return 1;
-}
-
-int LogicHEsoccer::op_1020() {
- // Deallocate integer arrays
- // The arrays can be allocated in op_1015 or op_1019
-
- delete[] _intArray1; _intArray1 = 0;
- delete[] _intArray2; _intArray2 = 0;
- _intArraysAllocated = false;
-
- return 1;
-}
-
-int LogicHEsoccer::op_1021(int32 a1, int32 a2, int32 a3, int32 a4, int32 a5, int32 a6, int32 a7) {
- // Used during a match (ball movement?)
- // Also called from op_1008
-
- int v10;
- if (a4 && a5)
- v10 = (int)(((double)a2 - (double)a5 * (double)a1 / (double)a4) * -1.0 * (double)a4 / (double)a5);
- else
- v10 = a1;
-
- int v9;
- if (a6 && a5)
- v9 = (int)(((double)a2 - (double)a5 * (double)a3 / (double)a6) * -1.0 * (double)a6 / (double)a5);
- else
- v9 = a3;
-
- // The final argument chooses whether to store the results for op_1008 or
- // store them in SCUMM variables.
- if (a7) {
- _var1021[0] = v10;
- _var1021[1] = v9;
- } else {
- writeScummVar(108, v10);
- writeScummVar(109, v9);
- }
-
- return 1;
-}
-
-/***********************
- * Backyard Baseball 2001
- *
- */
-
-int LogicHEbaseball2001::versionID() {
- return 1;
-}
-
-int32 LogicHEbaseball2001::dispatch(int op, int numArgs, int32 *args) {
- int res = 0;
-
- switch (op) {
- case 3001:
- // Check network status
- break;
-
- default:
- LogicHE::dispatch(op, numArgs, args);
- }
-
- return res;
-}
-
-/***********************
- * Backyard Basketball
- *
- */
-
-int LogicHEbasketball::versionID() {
- return 1;
-}
-
-int32 LogicHEbasketball::dispatch(int op, int numArgs, int32 *args) {
- int res = 0;
-
- switch (op) {
- case 1001:
- break;
-
- case 1006:
- break;
-
- case 1011:
- break;
-
- case 1012:
- break;
-
- case 1035:
- break;
-
- case 1050:
- break;
-
- case 1051:
- break;
-
- case 1052:
- break;
-
- case 1056:
- break;
-
- case 1057:
- break;
-
- case 1058:
- break;
-
- case 1060:
- break;
-
- case 1064:
- break;
-
- case 1067:
- break;
-
- case 1073:
- break;
-
- case 1075:
- break;
-
- case 1076:
- break;
-
- case 1080:
- break;
-
- case 1081:
- break;
-
- case 1090:
- break;
-
- case 1091:
- break;
-
- case 1513:
- break;
+ case GID_MOONBASE:
+ return makeLogicHEmoonbase(vm);
default:
- LogicHE::dispatch(op, numArgs, args);
+ return new LogicHE(vm);
}
-
- return res;
-}
-
-/***********************
- * Moonbase Commander
- *
- */
-
-int LogicHEmoonbase::versionID() {
- if (_vm->_game.features & GF_DEMO)
- return -100;
- else
- return 100;
}
} // End of namespace Scumm
diff --git a/engines/scumm/he/logic_he.h b/engines/scumm/he/logic_he.h
index e05a05f310..893dc81b87 100644
--- a/engines/scumm/he/logic_he.h
+++ b/engines/scumm/he/logic_he.h
@@ -29,15 +29,10 @@ class ScummEngine_v90he;
class LogicHE {
public:
- ScummEngine_v90he *_vm;
+ static LogicHE *makeLogicHE(ScummEngine_v90he *vm);
- LogicHE(ScummEngine_v90he *vm);
virtual ~LogicHE();
- void writeScummVar(int var, int32 value);
- int getFromArray(int arg0, int idx2, int idx1);
- void putInArray(int arg0, int idx2, int idx1, int val);
-
virtual void beforeBootScript() {}
virtual void initOnce() {}
virtual int startOfFrame() { return 1; }
@@ -46,142 +41,30 @@ public:
virtual int versionID();
virtual int32 dispatch(int op, int numArgs, int32 *args);
-};
-class LogicHErace : public LogicHE {
-private:
- float *_userData;
- double *_userDataD;
-public:
- LogicHErace(ScummEngine_v90he *vm);
- ~LogicHErace();
-
- int versionID();
- int32 dispatch(int op, int numArgs, int32 *args);
-
-private:
- int32 op_1003(int32 *args);
- int32 op_1004(int32 *args);
- int32 op_1100(int32 *args);
- int32 op_1101(int32 *args);
- int32 op_1102(int32 *args);
- int32 op_1103(int32 *args);
- int32 op_1110();
- int32 op_1120(int32 *args);
- int32 op_1130(int32 *args);
- int32 op_1140(int32 *args);
-
- void op_sub1(float arg);
- void op_sub2(float arg);
- void op_sub3(float arg);
-};
-
-class LogicHEfunshop : public LogicHE {
-public:
- LogicHEfunshop(ScummEngine_v90he *vm) : LogicHE(vm) {}
-
- int versionID();
- int32 dispatch(int op, int numArgs, int32 *args);
-
-private:
- void op_1004(int32 *args);
- void op_1005(int32 *args);
- int checkShape(int32 data0, int32 data1, int32 data4, int32 data5, int32 data2, int32 data3, int32 data6, int32 data7, int32 *x, int32 *y);
-};
-
-class LogicHEfootball : public LogicHE {
-public:
- LogicHEfootball(ScummEngine_v90he *vm) : LogicHE(vm) {}
-
- int versionID();
- int32 dispatch(int op, int numArgs, int32 *args);
-
-private:
- int op_1004(int32 *args);
- int op_1006(int32 *args);
- int op_1007(int32 *args);
- int op_1010(int32 *args);
- int op_1022(int32 *args);
- int op_1023(int32 *args);
- int op_1024(int32 *args);
-};
-
-class LogicHEsoccer : public LogicHE {
-private:
- double *_userDataD;
-
-public:
- LogicHEsoccer(ScummEngine_v90he *vm);
- ~LogicHEsoccer();
-
- int versionID();
- int32 dispatch(int op, int numArgs, int32 *args);
-
- void beforeBootScript();
- void initOnce();
- int startOfFrame();
-
-private:
- int op_1001(int32 *args);
- int op_1002(int32 *args);
- int op_1003(int32 *args);
- int op_1004(int32 *args);
- int op_1006(int32 a1, int32 a2, int32 a3, int32 a4);
- int op_1007(int32 *args);
- int op_1008(int32 *args);
- int op_1011(int32 a1, int32 a2, int32 a3, int32 a4, int32 a5);
- int op_1012(int32 *args);
- int op_1013(int32 a1, int32 a2, int32 a3);
- int op_1014(int32 a1, int32 a2, int32 a3, int32 a4, int32 a5, int32 a6, int32 a7, int32 a8, int32 a9, int32 a10, int32 a11, int32 a12, int32 a13, int32 a14);
- int op_1019(int32 *args);
- int op_1020();
- int op_1021(int32 a1, int32 a2, int32 a3, int32 a4, int32 a5, int32 a6, int32 a7);
-
- // Two integer arrays are used between some functions
- // Originally, these pointers were in _userData, but we keep them separate
- // Also, doing it that would break things on non 32-bit systems...
- bool _intArraysAllocated;
- uint32 *_intArray1, *_intArray2;
-
- // op_1007 allocates some arrays
- // they're then filled by op_1019
- byte _byteArray1[4096], _byteArray2[585];
-
- // op_1011 has a subfunction
- void op_1011_sub(int32 a1, int32 a2, int32 a3, int32 a4);
-
- // op_1013 creates some array, purpose unknown
- bool _array1013Allocated;
- byte *_array1013;
- uint32 _array1013Temp[11];
- int op_sub5(int a1, int a2, int a3);
-
- // op_1021 can (optionally) set two variables for use in op_1008
- uint32 _var1021[2];
-};
-
-class LogicHEbaseball2001 : public LogicHE {
-public:
- LogicHEbaseball2001(ScummEngine_v90he *vm) : LogicHE(vm) {}
+protected:
+ // Only to be used from makeLogicHE()
+ LogicHE(ScummEngine_v90he *vm);
- int versionID();
- int32 dispatch(int op, int numArgs, int32 *args);
-};
+ ScummEngine_v90he *_vm;
-class LogicHEbasketball : public LogicHE {
-public:
- LogicHEbasketball(ScummEngine_v90he *vm) : LogicHE(vm) {}
+ void writeScummVar(int var, int32 value);
+ int getFromArray(int arg0, int idx2, int idx1);
+ void putInArray(int arg0, int idx2, int idx1, int val);
+ int32 scummRound(double arg) { return (int32)(arg + 0.5); }
- int versionID();
- int32 dispatch(int op, int numArgs, int32 *args);
+ #define RAD2DEG (180 / M_PI)
+ #define DEG2RAD (M_PI / 180)
};
-class LogicHEmoonbase : public LogicHE {
-public:
- LogicHEmoonbase(ScummEngine_v90he *vm) : LogicHE(vm) {}
-
- int versionID();
-};
+// Logic declarations
+LogicHE *makeLogicHErace(ScummEngine_v90he *vm);
+LogicHE *makeLogicHEfunshop(ScummEngine_v90he *vm);
+LogicHE *makeLogicHEfootball(ScummEngine_v90he *vm);
+LogicHE *makeLogicHEsoccer(ScummEngine_v90he *vm);
+LogicHE *makeLogicHEbaseball2001(ScummEngine_v90he *vm);
+LogicHE *makeLogicHEbasketball(ScummEngine_v90he *vm);
+LogicHE *makeLogicHEmoonbase(ScummEngine_v90he *vm);
} // End of namespace Scumm
diff --git a/engines/scumm/he/resource_he.cpp b/engines/scumm/he/resource_he.cpp
index 39240e347f..42748d08ed 100644
--- a/engines/scumm/he/resource_he.cpp
+++ b/engines/scumm/he/resource_he.cpp
@@ -386,6 +386,40 @@ int ScummEngine_v72he::getSoundResourceSize(ResId id) {
return size;
}
+void ScummEngine_v90he::setResourceOffHeap(int typeId, int resId, int val) {
+ debug(0, "setResourceOffHeap: type %d resId %d toggle %d", typeId, resId, val);
+ ResType type;
+
+ switch (typeId) {
+ case 1:
+ type = rtRoom;
+ break;
+ case 2:
+ type = rtScript;
+ break;
+ case 3:
+ type = rtCostume;
+ break;
+ case 4:
+ type = rtSound;
+ break;
+ case 6:
+ type = rtCharset;
+ break;
+ case 19:
+ type = rtImage;
+ break;
+ default:
+ error("setResourceOffHeap: default case %d", typeId);
+ }
+
+ if (val == 1) {
+ _res->setOffHeap(type, resId);
+ } else {
+ _res->setOnHeap(type, resId);
+ }
+}
+
#endif
} // End of namespace Scumm
diff --git a/engines/scumm/he/script_v100he.cpp b/engines/scumm/he/script_v100he.cpp
index e057ab524a..56ea10f507 100644
--- a/engines/scumm/he/script_v100he.cpp
+++ b/engines/scumm/he/script_v100he.cpp
@@ -542,7 +542,7 @@ void ScummEngine_v100he::o100_arrayOps() {
int dim1end, dim1start, dim2end, dim2start;
int id, len, b, c, list[128];
int offs, tmp, tmp2;
- uint tmp3;
+ uint tmp3, type;
byte subOp = fetchScriptByte();
int array = fetchScriptWord();
@@ -625,11 +625,10 @@ void ScummEngine_v100he::o100_arrayOps() {
}
break;
case 132:
- debug(0, "o100_arrayOps: case 132");
- // TODO: Used by Moonbase Commander
+ // TODO: Used by room 2 script 2180 in Moonbase Commander
fetchScriptWord();
fetchScriptWord();
- pop();
+ type = pop();
pop();
pop();
pop();
@@ -646,6 +645,21 @@ void ScummEngine_v100he::o100_arrayOps() {
if (id == 0) {
defineArray(array, kDwordArray, dim2start, dim2end, dim1start, dim1end);
}
+ switch (type) {
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ break;
+ case 4:
+ break;
+ case 5:
+ break;
+ default:
+ error("o100_arrayOps: case 132 unknown type %d)", type);
+ }
+ debug(0, "o100_arrayOps: case 132 type %d", type);
break;
case 133:
b = pop();
@@ -2933,7 +2947,7 @@ void ScummEngine_v100he::o100_getVideoData() {
break;
case 73:
pop();
- push(_moviePlay->endOfVideo() ? -1 : (_moviePlay->getCurFrame() + 1));
+ push(_moviePlay->getCurFrame());
break;
case 84:
pop();
diff --git a/engines/scumm/he/script_v60he.cpp b/engines/scumm/he/script_v60he.cpp
index cf7d9fbd2f..dbeee567bf 100644
--- a/engines/scumm/he/script_v60he.cpp
+++ b/engines/scumm/he/script_v60he.cpp
@@ -94,6 +94,12 @@ int ScummEngine_v60he::convertFilePath(byte *dst, int dstSize) {
debug(1, "convertFilePath: original filePath is %s", dst);
int len = resStrLen(dst);
+
+ // Switch all \ to / for portablity
+ for (int i = 0; i < len; i++)
+ if (dst[i] == '\\')
+ dst[i] = '/';
+
if (_game.platform == Common::kPlatformMacintosh) {
// Remove : prefix in HE71 games
if (dst[0] == ':') {
@@ -107,12 +113,6 @@ int ScummEngine_v60he::convertFilePath(byte *dst, int dstSize) {
if (dst[i] == ':')
dst[i] = '/';
}
- } else {
- // Switch all \ to / for portablity
- for (int i = 0; i < len; i++) {
- if (dst[i] == '\\')
- dst[i] = '/';
- }
}
// Strip path
diff --git a/engines/scumm/he/script_v72he.cpp b/engines/scumm/he/script_v72he.cpp
index 5af4035930..b9f454de0f 100644
--- a/engines/scumm/he/script_v72he.cpp
+++ b/engines/scumm/he/script_v72he.cpp
@@ -1827,10 +1827,19 @@ void ScummEngine_v72he::o72_readINI() {
switch (subOp) {
case 43: // HE 100
case 6: // number
- if (!strcmp((char *)option, "NoPrinting")) {
+ if (!strcmp((char *)option, "DisablePrinting") || !strcmp((char *)option, "NoPrinting")) {
push(1);
} else if (!strcmp((char *)option, "TextOn")) {
push(ConfMan.getBool("subtitles"));
+ } else if (!strcmp((char *)option, "Disk") && (_game.id == GID_BIRTHDAYRED || _game.id == GID_BIRTHDAYYELLOW)) {
+ // WORKAROUND: Override the disk detection
+ // This removes the reliance on having the binary file around (which is
+ // very bad for the Mac version) just for the scripts to figure out if
+ // we're running Yellow or Red
+ if (_game.id == GID_BIRTHDAYRED)
+ push(4);
+ else
+ push(2);
} else {
push(ConfMan.getInt((char *)option));
}
diff --git a/engines/scumm/he/script_v80he.cpp b/engines/scumm/he/script_v80he.cpp
index 7970d7806f..9711f6415b 100644
--- a/engines/scumm/he/script_v80he.cpp
+++ b/engines/scumm/he/script_v80he.cpp
@@ -171,7 +171,10 @@ void ScummEngine_v80he::o80_readConfigFile() {
case 6: // number
ConfFile.getKey((const char *)option, (const char *)section, entry);
- push(atoi(entry.c_str()));
+ if (!strcmp((char *)option, "Benchmark"))
+ push(2);
+ else
+ push(atoi(entry.c_str()));
break;
case 77: // HE 100
case 7: // string
diff --git a/engines/scumm/he/script_v90he.cpp b/engines/scumm/he/script_v90he.cpp
index 6b632d8ff2..877f8b239d 100644
--- a/engines/scumm/he/script_v90he.cpp
+++ b/engines/scumm/he/script_v90he.cpp
@@ -1460,7 +1460,7 @@ void ScummEngine_v90he::o90_getVideoData() {
break;
case 52: // Get current frame
pop();
- push(_moviePlay->endOfVideo() ? -1 : (_moviePlay->getCurFrame() + 1));
+ push(_moviePlay->getCurFrame());
break;
case 63: // Get image number
pop();
@@ -2358,7 +2358,7 @@ void ScummEngine_v90he::o90_kernelSetFunctions() {
_wiz->_rectOverrideEnabled = false;
break;
case 714:
- debug(5, "o90_kernelSetFunctions: case 714: type %d resId %d unk1 %d", args[1], args[2], args[3]);
+ setResourceOffHeap(args[1], args[2], args[3]);
break;
case 1492:
// Remote start script function
diff --git a/engines/scumm/he/sprite_he.cpp b/engines/scumm/he/sprite_he.cpp
index 0b37673e4a..081110c7cd 100644
--- a/engines/scumm/he/sprite_he.cpp
+++ b/engines/scumm/he/sprite_he.cpp
@@ -804,12 +804,18 @@ void Sprite::setSpriteImage(int spriteId, int imageNum) {
if (_spriteTable[spriteId].image) {
_spriteTable[spriteId].imageStateCount = _vm->_wiz->getWizImageStates(_spriteTable[spriteId].image);
- _spriteTable[spriteId].flags |= kSFActive | kSFAutoAnim | kSFMarkDirty | kSFBlitDirectly;
+
+ if (_vm->VAR(139))
+ _spriteTable[spriteId].flags |= kSFActive;
+ else
+ _spriteTable[spriteId].flags |= kSFActive | kSFAutoAnim | kSFMarkDirty | kSFBlitDirectly;
if (_spriteTable[spriteId].image != origResId || _spriteTable[spriteId].imageStateCount != origResWizStates)
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
} else {
- if (_spriteTable[spriteId].flags & kSFImageless)
+ if (_vm->VAR(139))
+ _spriteTable[spriteId].flags &= ~kSFActive;
+ else if (_spriteTable[spriteId].flags & kSFImageless)
_spriteTable[spriteId].flags = 0;
else
_spriteTable[spriteId].flags = kSFChanged | kSFBlitDirectly;
diff --git a/engines/scumm/he/sprite_he.h b/engines/scumm/he/sprite_he.h
index d28c9f1944..be6717faa5 100644
--- a/engines/scumm/he/sprite_he.h
+++ b/engines/scumm/he/sprite_he.h
@@ -218,4 +218,3 @@ private:
} // End of namespace Scumm
#endif
-
diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp
index 4107034fe6..f67922c81c 100644
--- a/engines/scumm/he/wiz_he.cpp
+++ b/engines/scumm/he/wiz_he.cpp
@@ -1755,7 +1755,7 @@ void Wiz::captureWizPolygon(int resNum, int maskNum, int maskState, int id1, int
uint8 *tmpPtr = imageBuffer;
for (i = 0; i < dsth; i++) {
for (j = 0; j < dstw; j++)
- WRITE_UINT16(tmpPtr + j * 2, transColor);
+ WRITE_LE_UINT16(tmpPtr + j * 2, transColor);
tmpPtr += dstpitch;
}
} else {
diff --git a/engines/scumm/help.cpp b/engines/scumm/help.cpp
index ae7a1ad3bc..cfb23a392a 100644
--- a/engines/scumm/help.cpp
+++ b/engines/scumm/help.cpp
@@ -175,6 +175,7 @@ void ScummHelp::updateStrings(byte gameId, byte version, Common::Platform platfo
ADD_BIND("b", _("To Henry / To Indy"));
break;
case GID_LOOM:
+ // I18N: These are different musical notes
ADD_BIND("q, c", _("play C minor on distaff"));
ADD_BIND("w, d", _("play D on distaff"));
ADD_BIND("e, e", _("play E on distaff"));
@@ -238,6 +239,7 @@ void ScummHelp::updateStrings(byte gameId, byte version, Common::Platform platfo
ADD_BIND("e", _("Examine"));
ADD_BIND("t", _("Regular cursor"));
ADD_BIND("i", _("Inventory"));
+ // I18N: Comm is a communication device
ADD_BIND("c", _("Comm"));
break;
case GID_CMI:
diff --git a/engines/scumm/help.h b/engines/scumm/help.h
index 9763da8c00..5ba6bdc65c 100644
--- a/engines/scumm/help.h
+++ b/engines/scumm/help.h
@@ -42,4 +42,3 @@ public:
} // End of namespace Scumm
#endif
-
diff --git a/engines/scumm/imuse/imuse.cpp b/engines/scumm/imuse/imuse.cpp
index 317ef36cb9..27a72c2afe 100644
--- a/engines/scumm/imuse/imuse.cpp
+++ b/engines/scumm/imuse/imuse.cpp
@@ -44,30 +44,31 @@ namespace Scumm {
////////////////////////////////////////
IMuseInternal::IMuseInternal() :
-_native_mt32(false),
-_enable_gs(false),
-_sc55(false),
-_midi_adlib(NULL),
-_midi_native(NULL),
-_sysex(NULL),
-_paused(false),
-_initialized(false),
-_tempoFactor(0),
-_player_limit(ARRAYSIZE(_players)),
-_recycle_players(false),
-_queue_end(0),
-_queue_pos(0),
-_queue_sound(0),
-_queue_adding(0),
-_queue_marker(0),
-_queue_cleared(0),
-_master_volume(0),
-_music_volume(0),
-_trigger_count(0),
-_snm_trigger_index(0) {
- memset(_channel_volume,0,sizeof(_channel_volume));
- memset(_channel_volume_eff,0,sizeof(_channel_volume_eff));
- memset(_volchan_table,0,sizeof(_volchan_table));
+ _native_mt32(false),
+ _enable_gs(false),
+ _sc55(false),
+ _midi_adlib(NULL),
+ _midi_native(NULL),
+ _sysex(NULL),
+ _paused(false),
+ _initialized(false),
+ _tempoFactor(0),
+ _player_limit(ARRAYSIZE(_players)),
+ _recycle_players(false),
+ _queue_end(0),
+ _queue_pos(0),
+ _queue_sound(0),
+ _queue_adding(0),
+ _queue_marker(0),
+ _queue_cleared(0),
+ _master_volume(0),
+ _music_volume(0),
+ _trigger_count(0),
+ _snm_trigger_index(0),
+ _pcSpeaker(false) {
+ memset(_channel_volume, 0, sizeof(_channel_volume));
+ memset(_channel_volume_eff, 0, sizeof(_channel_volume_eff));
+ memset(_volchan_table, 0, sizeof(_volchan_table));
}
IMuseInternal::~IMuseInternal() {
@@ -119,7 +120,7 @@ byte *IMuseInternal::findStartOfSound(int sound, int ct) {
// Check for old-style headers first, like 'RO'
int trFlag = (kMThd | kFORM);
- if (ptr[0] == 'R' && ptr[1] == 'O'&& ptr[2] != 'L')
+ if (ptr[0] == 'R' && ptr[1] == 'O' && ptr[2] != 'L')
return ct == trFlag ? ptr : 0;
if (ptr[4] == 'S' && ptr[5] == 'O')
return ct == trFlag ? ptr + 4 : 0;
@@ -153,22 +154,22 @@ bool IMuseInternal::isMT32(int sound) {
uint32 tag = READ_BE_UINT32(ptr);
switch (tag) {
- case MKTAG('A','D','L',' '):
- case MKTAG('A','S','F','X'): // Special AD class for old AdLib sound effects
- case MKTAG('S','P','K',' '):
+ case MKTAG('A', 'D', 'L', ' '):
+ case MKTAG('A', 'S', 'F', 'X'): // Special AD class for old AdLib sound effects
+ case MKTAG('S', 'P', 'K', ' '):
return false;
- case MKTAG('A','M','I',' '):
- case MKTAG('R','O','L',' '):
+ case MKTAG('A', 'M', 'I', ' '):
+ case MKTAG('R', 'O', 'L', ' '):
return true;
- case MKTAG('M','A','C',' '): // Occurs in the Mac version of FOA and MI2
+ case MKTAG('M', 'A', 'C', ' '): // Occurs in the Mac version of FOA and MI2
return true;
- case MKTAG('G','M','D',' '):
+ case MKTAG('G', 'M', 'D', ' '):
return false;
- case MKTAG('M','I','D','I'): // Occurs in Sam & Max
+ case MKTAG('M', 'I', 'D', 'I'): // Occurs in Sam & Max
// HE games use Roland music
if (ptr[8] == 'H' && ptr[9] == 'S')
return true;
@@ -195,20 +196,20 @@ bool IMuseInternal::isMIDI(int sound) {
uint32 tag = READ_BE_UINT32(ptr);
switch (tag) {
- case MKTAG('A','D','L',' '):
- case MKTAG('A','S','F','X'): // Special AD class for old AdLib sound effects
- case MKTAG('S','P','K',' '):
+ case MKTAG('A', 'D', 'L', ' '):
+ case MKTAG('A', 'S', 'F', 'X'): // Special AD class for old AdLib sound effects
+ case MKTAG('S', 'P', 'K', ' '):
return false;
- case MKTAG('A','M','I',' '):
- case MKTAG('R','O','L',' '):
+ case MKTAG('A', 'M', 'I', ' '):
+ case MKTAG('R', 'O', 'L', ' '):
return true;
- case MKTAG('M','A','C',' '): // Occurs in the Mac version of FOA and MI2
+ case MKTAG('M', 'A', 'C', ' '): // Occurs in the Mac version of FOA and MI2
return true;
- case MKTAG('G','M','D',' '):
- case MKTAG('M','I','D','I'): // Occurs in Sam & Max
+ case MKTAG('G', 'M', 'D', ' '):
+ case MKTAG('M', 'I', 'D', 'I'): // Occurs in Sam & Max
return true;
}
@@ -381,7 +382,8 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) {
for (i = 0; i < ARRAYSIZE(_parts); ++i)
_parts[i].saveLoadWithSerializer(ser);
- { // Load/save the instrument definitions, which were revamped with V11.
+ {
+ // Load/save the instrument definitions, which were revamped with V11.
Part *part = &_parts[0];
if (ser->getVersion() >= VER(11)) {
for (i = ARRAYSIZE(_parts); i; --i, ++part) {
@@ -467,6 +469,10 @@ uint32 IMuseInternal::property(int prop, uint32 value) {
case IMuse::PROP_GAME_ID:
_game_id = value;
break;
+
+ case IMuse::PROP_PC_SPEAKER:
+ _pcSpeaker = (value != 0);
+ break;
}
return 0;
@@ -522,7 +528,7 @@ void IMuseInternal::stopAllSounds() {
int IMuseInternal::getSoundStatus(int sound) const {
Common::StackLock lock(_mutex, "IMuseInternal::getSoundStatus()");
- return getSoundStatus_internal (sound, true);
+ return getSoundStatus_internal(sound, true);
}
int IMuseInternal::getMusicTimer() {
@@ -565,7 +571,7 @@ bool IMuseInternal::startSound_internal(int sound, int offset) {
int i;
ImTrigger *trigger = _snm_triggers;
for (i = ARRAYSIZE(_snm_triggers); i; --i, ++trigger) {
- if (trigger->sound && trigger->id && trigger->command[0] == 8 && trigger->command[1] == sound && getSoundStatus_internal (trigger->sound,true))
+ if (trigger->sound && trigger->id && trigger->command[0] == 8 && trigger->command[1] == sound && getSoundStatus_internal(trigger->sound, true))
return false;
}
@@ -663,9 +669,7 @@ int IMuseInternal::getSoundStatus_internal(int sound, bool ignoreFadeouts) const
return (sound == -1) ? 0 : get_queue_sound_status(sound);
}
-int32 IMuseInternal::doCommand_internal
- (int a, int b, int c, int d, int e, int f, int g, int h)
-{
+int32 IMuseInternal::doCommand_internal(int a, int b, int c, int d, int e, int f, int g, int h) {
int args[8];
args[0] = a;
args[1] = b;
@@ -733,7 +737,7 @@ int32 IMuseInternal::doCommand_internal(int numargs, int a[]) {
}
return -1;
case 13:
- return getSoundStatus_internal (a[1], true);
+ return getSoundStatus_internal(a[1], true);
case 14:
// Sam and Max: Parameter fade
player = findActivePlayer(a[1]);
@@ -779,8 +783,7 @@ int32 IMuseInternal::doCommand_internal(int numargs, int a[]) {
a[0] = 0;
for (i = 0; i < ARRAYSIZE(_snm_triggers); ++i) {
if (_snm_triggers[i].sound == a[1] && _snm_triggers[i].id &&
- (a[3] == -1 || _snm_triggers[i].id == a[3]))
- {
+ (a[3] == -1 || _snm_triggers[i].id == a[3])) {
++a[0];
}
}
@@ -1002,9 +1005,9 @@ int IMuseInternal::get_queue_sound_status(int sound) const {
i = (i + 1) % ARRAYSIZE(_cmd_queue);
}
- for (i = 0; i < ARRAYSIZE (_deferredCommands); ++i) {
+ for (i = 0; i < ARRAYSIZE(_deferredCommands); ++i) {
if (_deferredCommands[i].time_left && _deferredCommands[i].a == 8 &&
- _deferredCommands[i].b == sound) {
+ _deferredCommands[i].b == sound) {
return 2;
}
}
@@ -1213,7 +1216,7 @@ int32 IMuseInternal::ImSetTrigger(int sound, int id, int a, int b, int c, int d,
// NOTE: We ONLY do this if the sound that will trigger the command is actually
// playing. Otherwise, there's a problem when exiting and re-entering the
// Bumpusville mansion. Ref Bug #780918.
- if (trig->command[0] == 8 && getSoundStatus_internal(trig->command[1],true) && getSoundStatus_internal(sound,true))
+ if (trig->command[0] == 8 && getSoundStatus_internal(trig->command[1], true) && getSoundStatus_internal(sound, true))
stopSound_internal(trig->command[1]);
return 0;
}
@@ -1246,8 +1249,7 @@ int32 IMuseInternal::ImFireAllTriggers(int sound) {
return (count > 0) ? 0 : -1;
}
-int IMuseInternal::set_channel_volume(uint chan, uint vol)
-{
+int IMuseInternal::set_channel_volume(uint chan, uint vol) {
if (chan >= 8 || vol > 127)
return -1;
@@ -1427,7 +1429,7 @@ void IMuseInternal::initMT32(MidiDriver *midi) {
// Display a welcome message on MT-32 displays.
memcpy(&buffer[0], "\x41\x10\x16\x12\x20\x00\x00", 7);
memcpy(&buffer[7], " ", 20);
- memcpy(buffer + 7 +(20 - len) / 2, info, len);
+ memcpy(buffer + 7 + (20 - len) / 2, info, len);
byte checksum = 0;
for (int i = 4; i < 27; ++i)
checksum -= buffer[i];
@@ -1473,9 +1475,9 @@ void IMuseInternal::initGM(MidiDriver *midi) {
// Set Channels 1-16 to SC-55 Map, then CM-64/32L Variation
for (i = 0; i < 16; ++i) {
- midi->send(( 127 << 16) | (0 << 8) | (0xB0 | i));
- midi->send(( 1 << 16) | (32 << 8) | (0xB0 | i));
- midi->send(( 0 << 16) | (0 << 8) | (0xC0 | i));
+ midi->send((127 << 16) | (0 << 8) | (0xB0 | i));
+ midi->send((1 << 16) | (32 << 8) | (0xB0 | i));
+ midi->send((0 << 16) | (0 << 8) | (0xC0 | i));
}
debug(2, "GS Program Change: CM-64/32L Map Selected");
@@ -1496,7 +1498,7 @@ void IMuseInternal::initGM(MidiDriver *midi) {
// Set Channels 1-16 Reverb to 64, which is the
// equivalent of MT-32 default Reverb Level 5
for (i = 0; i < 16; ++i)
- midi->send(( 64 << 16) | (91 << 8) | (0xB0 | i));
+ midi->send((64 << 16) | (91 << 8) | (0xB0 | i));
debug(2, "GM Controller 91 Change: Channels 1-16 Reverb Level is 64");
// Set Channels 1-16 Pitch Bend Sensitivity to
@@ -1637,8 +1639,8 @@ void IMuseInternal::reallocateMidiChannels(MidiDriver *midi) {
hipart = NULL;
for (i = 32, part = _parts; i; i--, part++) {
if (part->_player && part->_player->getMidiDriver() == midi &&
- !part->_percussion && part->_on &&
- !part->_mc && part->_pri_eff >= hipri) {
+ !part->_percussion && part->_on &&
+ !part->_mc && part->_pri_eff >= hipri) {
hipri = part->_pri_eff;
hipart = part;
}
@@ -1668,16 +1670,35 @@ void IMuseInternal::reallocateMidiChannels(MidiDriver *midi) {
}
}
-void IMuseInternal::setGlobalAdLibInstrument(byte slot, byte *data) {
+void IMuseInternal::setGlobalInstrument(byte slot, byte *data) {
if (slot < 32) {
- _global_adlib_instruments[slot].adlib(data);
+ if (_pcSpeaker)
+ _global_instruments[slot].pcspk(data);
+ else
+ _global_instruments[slot].adlib(data);
}
}
-void IMuseInternal::copyGlobalAdLibInstrument(byte slot, Instrument *dest) {
+void IMuseInternal::copyGlobalInstrument(byte slot, Instrument *dest) {
if (slot >= 32)
return;
- _global_adlib_instruments[slot].copy_to(dest);
+
+ // Both the AdLib code and the PC Speaker code use an all zero instrument
+ // as default in the original, thus we do the same.
+ // PC Speaker instrument size is 23, while AdLib instrument size is 30.
+ // Thus we just use a 30 byte instrument data array as default.
+ const byte defaultInstr[30] = { 0 };
+
+ if (_global_instruments[slot].isValid()) {
+ // In case we have an valid instrument set up, copy it to the part.
+ _global_instruments[slot].copy_to(dest);
+ } else if (_pcSpeaker) {
+ debug(0, "Trying to use non-existant global PC Speaker instrument %d", slot);
+ dest->pcspk(defaultInstr);
+ } else {
+ debug(0, "Trying to use non-existant global AdLib instrument %d", slot);
+ dest->adlib(defaultInstr);
+ }
}
diff --git a/engines/scumm/imuse/imuse.h b/engines/scumm/imuse/imuse.h
index 8014b13409..23449e470b 100644
--- a/engines/scumm/imuse/imuse.h
+++ b/engines/scumm/imuse/imuse.h
@@ -37,7 +37,7 @@ class Player;
class ScummEngine;
class Serializer;
-typedef void (*sysexfunc) (Player *, const byte *, uint16);
+typedef void (*sysexfunc)(Player *, const byte *, uint16);
/**
* iMuse implementation interface.
@@ -55,7 +55,8 @@ public:
PROP_GS,
PROP_LIMIT_PLAYERS,
PROP_RECYCLE_PLAYERS,
- PROP_GAME_ID
+ PROP_GAME_ID,
+ PROP_PC_SPEAKER
};
public:
@@ -66,7 +67,7 @@ public:
virtual int32 doCommand(int numargs, int args[]) = 0;
virtual int clear_queue() = 0;
virtual uint32 property(int prop, uint32 value) = 0;
- virtual void addSysexHandler (byte mfgID, sysexfunc handler) = 0;
+ virtual void addSysexHandler(byte mfgID, sysexfunc handler) = 0;
public:
virtual void startSoundWithNoteOffset(int sound, int offset) = 0;
diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h
index 6a7b9fc7d9..3b0d36e119 100644
--- a/engines/scumm/imuse/imuse_internal.h
+++ b/engines/scumm/imuse/imuse_internal.h
@@ -135,7 +135,7 @@ struct ImTrigger {
int sound;
byte id;
uint16 expire;
- int command [8];
+ int command[8];
ImTrigger() { memset(this, 0, sizeof(ImTrigger)); }
};
@@ -153,12 +153,12 @@ struct CommandQueue {
//////////////////////////////////////////////////
class Player : public MidiDriver_BASE {
-/*
- * External SysEx handler functions shall each be defined in
- * a separate file. This header file shall be included at the
- * top of the file immediately following this special #define:
- * #define SYSEX_CALLBACK_FUNCTION nameOfHandlerFunction
- */
+ /*
+ * External SysEx handler functions shall each be defined in
+ * a separate file. This header file shall be included at the
+ * top of the file immediately following this special #define:
+ * #define SYSEX_CALLBACK_FUNCTION nameOfHandlerFunction
+ */
#ifdef SYSEX_CALLBACK_FUNCTION
friend void SYSEX_CALLBACK_FUNCTION(Player *, const byte *, uint16);
#endif
@@ -244,7 +244,7 @@ public:
void clear();
void clearLoop();
void fixAfterLoad();
- Part * getActivePart(uint8 part);
+ Part *getActivePart(uint8 part);
uint getBeatIndex();
int8 getDetune() const { return _detune; }
byte getEffectiveVolume() const { return _vol_eff; }
@@ -252,7 +252,7 @@ public:
MidiDriver *getMidiDriver() const { return _midi; }
int getParam(int param, byte chan);
int8 getPan() const { return _pan; }
- Part * getPart(uint8 part);
+ Part *getPart(uint8 part);
byte getPriority() const { return _priority; }
uint getTicksPerBeat() const { return TICKS_PER_BEAT; }
int8 getTranspose() const { return _transpose; }
@@ -342,6 +342,7 @@ struct Part : public Serializable {
void off();
void set_instrument(uint b);
void set_instrument(byte *data);
+ void set_instrument_pcspk(byte *data);
void load_global_instrument(byte b);
void set_transpose(int8 transpose);
@@ -375,12 +376,12 @@ class IMuseInternal : public IMuse {
friend class Player;
friend struct Part;
-/*
- * External SysEx handler functions shall each be defined in
- * a separate file. This header file shall be included at the
- * top of the file immediately following this special #define:
- * #define SYSEX_CALLBACK_FUNCTION nameOfHandlerFunction
- */
+ /*
+ * External SysEx handler functions shall each be defined in
+ * a separate file. This header file shall be included at the
+ * top of the file immediately following this special #define:
+ * #define SYSEX_CALLBACK_FUNCTION nameOfHandlerFunction
+ */
#ifdef SYSEX_CALLBACK_FUNCTION
friend void SYSEX_CALLBACK_FUNCTION(Player *, const byte *, uint16);
#endif
@@ -433,7 +434,8 @@ protected:
Player _players[8];
Part _parts[32];
- Instrument _global_adlib_instruments[32];
+ bool _pcSpeaker;
+ Instrument _global_instruments[32];
CommandQueue _cmd_queue[64];
DeferredCommand _deferredCommands[4];
@@ -449,8 +451,8 @@ protected:
enum ChunkType {
kMThd = 1,
kFORM = 2,
- kMDhd = 4, // Used in MI2 and INDY4. Contain certain start parameters (priority, volume, etc. ) for the player.
- kMDpg = 8 // These chunks exist in DOTT and SAMNMAX. They don't get processed, however.
+ kMDhd = 4, // Used in MI2 and INDY4. Contain certain start parameters (priority, volume, etc. ) for the player.
+ kMDpg = 8 // These chunks exist in DOTT and SAMNMAX. They don't get processed, however.
};
byte *findStartOfSound(int sound, int ct = (kMThd | kFORM));
@@ -498,8 +500,8 @@ protected:
int setImuseMasterVolume(uint vol);
void reallocateMidiChannels(MidiDriver *midi);
- void setGlobalAdLibInstrument(byte slot, byte *data);
- void copyGlobalAdLibInstrument(byte slot, Instrument *dest);
+ void setGlobalInstrument(byte slot, byte *data);
+ void copyGlobalInstrument(byte slot, Instrument *dest);
bool isNativeMT32() { return _native_mt32; }
protected:
diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp
index 5df8407a96..73e7704469 100644
--- a/engines/scumm/imuse/imuse_part.cpp
+++ b/engines/scumm/imuse/imuse_part.cpp
@@ -193,14 +193,18 @@ void Part::set_onoff(bool on) {
}
}
-void Part::set_instrument(byte * data) {
- _instrument.adlib(data);
+void Part::set_instrument(byte *data) {
+ if (_se->_pcSpeaker)
+ _instrument.pcspk(data);
+ else
+ _instrument.adlib(data);
+
if (clearToTransmit())
_instrument.send(_mc);
}
void Part::load_global_instrument(byte slot) {
- _player->_se->copyGlobalAdLibInstrument(slot, &_instrument);
+ _player->_se->copyGlobalInstrument(slot, &_instrument);
if (clearToTransmit())
_instrument.send(_mc);
}
@@ -234,7 +238,7 @@ void Part::noteOn(byte note, byte velocity) {
// should be implemented as a class static var. As it is, using
// a function level static var in most cases is arcane and evil.
static byte prev_vol_eff = 128;
- if (_vol_eff != prev_vol_eff){
+ if (_vol_eff != prev_vol_eff) {
mc->volume(_vol_eff);
prev_vol_eff = _vol_eff;
}
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp
index 61b9cad2cb..73be2174cd 100644
--- a/engines/scumm/imuse/imuse_player.cpp
+++ b/engines/scumm/imuse/imuse_player.cpp
@@ -79,7 +79,7 @@ Player::Player() :
_isMT32(false),
_isMIDI(false),
_se(0),
- _vol_chan(0){
+ _vol_chan(0) {
}
Player::~Player() {
@@ -133,7 +133,7 @@ bool Player::isFadingOut() const {
int i;
for (i = 0; i < ARRAYSIZE(_parameterFaders); ++i) {
if (_parameterFaders[i].param == ParameterFader::pfVolume &&
- _parameterFaders[i].end == 0) {
+ _parameterFaders[i].end == 0) {
return true;
}
}
@@ -371,11 +371,13 @@ void Player::sysEx(const byte *p, uint16 len) {
if (a != IMUSE_SYSEX_ID) {
if (a == ROLAND_SYSEX_ID) {
// Roland custom instrument definition.
- part = getPart(p[0] & 0x0F);
- if (part) {
- part->_instrument.roland(p - 1);
- if (part->clearToTransmit())
- part->_instrument.send(part->_mc);
+ if (_isMIDI || _isMT32) {
+ part = getPart(p[0] & 0x0F);
+ if (part) {
+ part->_instrument.roland(p - 1);
+ if (part->clearToTransmit())
+ part->_instrument.send(part->_mc);
+ }
}
} else if (a == YM2612_SYSEX_ID) {
// FM-TOWNS custom instrument definition
@@ -399,13 +401,13 @@ void Player::sysEx(const byte *p, uint16 len) {
if (!_scanning) {
for (a = 0; a < len + 1 && a < 19; ++a) {
- sprintf((char *)&buf[a*3], " %02X", p[a]);
+ sprintf((char *)&buf[a * 3], " %02X", p[a]);
} // next for
if (a < len + 1) {
- buf[a*3] = buf[a*3+1] = buf[a*3+2] = '.';
+ buf[a * 3] = buf[a * 3 + 1] = buf[a * 3 + 2] = '.';
++a;
} // end if
- buf[a*3] = '\0';
+ buf[a * 3] = '\0';
debugC(DEBUG_IMUSE, "[%02d] SysEx:%s", _id, buf);
}
@@ -814,7 +816,7 @@ int Player::query_part_param(int param, byte chan) {
return part->_vol;
case 16:
// FIXME: Need to know where this occurs...
-error("Trying to cast instrument (%d, %d) -- please tell Fingolfin", param, chan);
+ error("Trying to cast instrument (%d, %d) -- please tell Fingolfin", param, chan);
// In old versions of the code, this used to return part->_program.
// This was changed in revision 2.29 of imuse.cpp (where this code used
// to reside).
@@ -845,9 +847,8 @@ void Player::onTimer() {
uint beat_index = target_tick / TICKS_PER_BEAT + 1;
uint tick_index = target_tick % TICKS_PER_BEAT;
- if (_loop_counter &&(beat_index > _loop_from_beat ||
- (beat_index == _loop_from_beat && tick_index >= _loop_from_tick)))
- {
+ if (_loop_counter && (beat_index > _loop_from_beat ||
+ (beat_index == _loop_from_beat && tick_index >= _loop_from_tick))) {
_loop_counter--;
jump(_track_index, _loop_to_beat, _loop_to_tick);
}
@@ -891,15 +892,15 @@ int Player::addParameterFader(int param, int target, int time) {
// target = target * 128 / 100;
break;
- case 127:
- { // FIXME? I *think* this clears all parameter faders.
- ParameterFader *ptr = &_parameterFaders[0];
- int i;
- for (i = ARRAYSIZE(_parameterFaders); i; --i, ++ptr)
- ptr->param = 0;
- return 0;
- }
- break;
+ case 127: {
+ // FIXME? I *think* this clears all parameter faders.
+ ParameterFader *ptr = &_parameterFaders[0];
+ int i;
+ for (i = ARRAYSIZE(_parameterFaders); i; --i, ++ptr)
+ ptr->param = 0;
+ return 0;
+ }
+ break;
default:
debug(0, "Player::addParameterFader(%d, %d, %d): Unknown parameter", param, target, time);
@@ -1085,7 +1086,7 @@ void Player::saveLoadWithSerializer(Serializer *ser) {
}
ser->saveLoadEntries(this, playerEntries);
ser->saveLoadArrayOf(_parameterFaders, ARRAYSIZE(_parameterFaders),
- sizeof(ParameterFader), parameterFaderEntries);
+ sizeof(ParameterFader), parameterFaderEntries);
return;
}
diff --git a/engines/scumm/imuse/instrument.cpp b/engines/scumm/imuse/instrument.cpp
index 955700fc2b..11bb4e7605 100644
--- a/engines/scumm/imuse/instrument.cpp
+++ b/engines/scumm/imuse/instrument.cpp
@@ -114,14 +114,15 @@ roland_to_gm_map[] = {
// { "trickle4 ", ??? }
};
+// This emulates the percussion bank setup LEC used with the MT-32,
+// where notes 24 - 34 were assigned instruments without reverb.
+// It also fixes problems on GS devices that map sounds to these
+// notes by default.
const byte Instrument::_gmRhythmMap[35] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 40, 41, 66, 47,
- 65, 48, 56};
- // This emulates the percussion bank setup LEC used with the MT-32,
- // where notes 24 - 34 were assigned instruments without reverb.
- // It also fixes problems on GS devices that map sounds to these
- // notes by default.
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 40, 41, 66, 47,
+ 65, 48, 56
+};
class Instrument_Program : public InstrumentInternal {
private:
@@ -136,15 +137,16 @@ public:
void copy_to(Instrument *dest) { dest->program(_program, _mt32); }
bool is_valid() {
return (_program < 128) &&
- ((_native_mt32 == _mt32) || _native_mt32
- ? (MidiDriver::_gmToMt32[_program] < 128)
- : (MidiDriver::_mt32ToGm[_program] < 128)); }
+ ((_native_mt32 == _mt32) || _native_mt32
+ ? (MidiDriver::_gmToMt32[_program] < 128)
+ : (MidiDriver::_mt32ToGm[_program] < 128));
+ }
};
class Instrument_AdLib : public InstrumentInternal {
private:
-#include "common/pack-start.h" // START STRUCT PACKING
+#include "common/pack-start.h" // START STRUCT PACKING
struct AdLibInstrument {
byte flags_1;
@@ -159,13 +161,17 @@ private:
byte waveform_2;
byte feedback;
byte flags_a;
- struct { byte a,b,c,d,e,f,g,h; } extra_a;
+ struct {
+ byte a, b, c, d, e, f, g, h;
+ } extra_a;
byte flags_b;
- struct { byte a,b,c,d,e,f,g,h; } extra_b;
+ struct {
+ byte a, b, c, d, e, f, g, h;
+ } extra_b;
byte duration;
} PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
+#include "common/pack-end.h" // END STRUCT PACKING
AdLibInstrument _instrument;
@@ -181,7 +187,7 @@ public:
class Instrument_Roland : public InstrumentInternal {
private:
-#include "common/pack-start.h" // START STRUCT PACKING
+#include "common/pack-start.h" // START STRUCT PACKING
struct RolandInstrument {
byte roland_id;
@@ -242,11 +248,11 @@ private:
byte checksum;
} PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
+#include "common/pack-end.h" // END STRUCT PACKING
RolandInstrument _instrument;
- char _instrument_name [11];
+ char _instrument_name[11];
uint8 getEquivalentGM();
@@ -259,6 +265,19 @@ public:
bool is_valid() { return (_native_mt32 ? true : (_instrument_name[0] != '\0')); }
};
+class Instrument_PcSpk : public InstrumentInternal {
+public:
+ Instrument_PcSpk(const byte *data);
+ Instrument_PcSpk(Serializer *s);
+ void saveOrLoad(Serializer *s);
+ void send(MidiChannel *mc);
+ void copy_to(Instrument *dest) { dest->pcspk((byte *)&_instrument); }
+ bool is_valid() { return true; }
+
+private:
+ byte _instrument[23];
+};
+
////////////////////////////////////////
//
// Instrument class members
@@ -299,7 +318,15 @@ void Instrument::roland(const byte *instrument) {
_instrument = new Instrument_Roland(instrument);
}
-void Instrument::saveOrLoad (Serializer *s) {
+void Instrument::pcspk(const byte *instrument) {
+ clear();
+ if (!instrument)
+ return;
+ _type = itPcSpk;
+ _instrument = new Instrument_PcSpk(instrument);
+}
+
+void Instrument::saveOrLoad(Serializer *s) {
if (s->isSaving()) {
s->saveByte(_type);
if (_instrument)
@@ -319,6 +346,9 @@ void Instrument::saveOrLoad (Serializer *s) {
case itRoland:
_instrument = new Instrument_Roland(s);
break;
+ case itPcSpk:
+ _instrument = new Instrument_PcSpk(s);
+ break;
default:
warning("No known instrument classification #%d", (int)_type);
_type = itNone;
@@ -333,8 +363,8 @@ void Instrument::saveOrLoad (Serializer *s) {
////////////////////////////////////////
Instrument_Program::Instrument_Program(byte program, bool mt32) :
-_program (program),
-_mt32 (mt32) {
+ _program(program),
+ _mt32(mt32) {
if (program > 127)
_program = 255;
}
@@ -413,7 +443,7 @@ Instrument_Roland::Instrument_Roland(const byte *data) {
Instrument_Roland::Instrument_Roland(Serializer *s) {
_instrument_name[0] = '\0';
if (!s->isSaving())
- saveOrLoad (s);
+ saveOrLoad(s);
else
memset(&_instrument, 0, sizeof(_instrument));
}
@@ -470,4 +500,32 @@ uint8 Instrument_Roland::getEquivalentGM() {
return 255;
}
+////////////////////////////////////////
+//
+// Instrument_PcSpk class members
+//
+////////////////////////////////////////
+
+Instrument_PcSpk::Instrument_PcSpk(const byte *data) {
+ memcpy(_instrument, data, sizeof(_instrument));
+}
+
+Instrument_PcSpk::Instrument_PcSpk(Serializer *s) {
+ if (!s->isSaving())
+ saveOrLoad(s);
+ else
+ memset(_instrument, 0, sizeof(_instrument));
+}
+
+void Instrument_PcSpk::saveOrLoad(Serializer *s) {
+ if (s->isSaving())
+ s->saveBytes(_instrument, sizeof(_instrument));
+ else
+ s->loadBytes(_instrument, sizeof(_instrument));
+}
+
+void Instrument_PcSpk::send(MidiChannel *mc) {
+ mc->sysEx_customInstrument('SPK ', (byte *)&_instrument);
+}
+
} // End of namespace Scumm
diff --git a/engines/scumm/imuse/instrument.h b/engines/scumm/imuse/instrument.h
index 3555d319e6..a855c64155 100644
--- a/engines/scumm/imuse/instrument.h
+++ b/engines/scumm/imuse/instrument.h
@@ -39,7 +39,6 @@ public:
virtual void send(MidiChannel *mc) = 0;
virtual void copy_to(Instrument *dest) = 0;
virtual bool is_valid() = 0;
- virtual operator int() { return 255; }
};
class Instrument {
@@ -52,10 +51,11 @@ public:
itNone = 0,
itProgram = 1,
itAdLib = 2,
- itRoland = 3
+ itRoland = 3,
+ itPcSpk = 4
};
- Instrument() : _type (0), _instrument (0) { }
+ Instrument() : _type(0), _instrument(0) { }
~Instrument() { delete _instrument; }
static void nativeMT32(bool native);
static const byte _gmRhythmMap[35];
@@ -71,6 +71,7 @@ public:
void program(byte program, bool mt32);
void adlib(const byte *instrument);
void roland(const byte *instrument);
+ void pcspk(const byte *instrument);
byte getType() { return _type; }
bool isValid() { return (_instrument ? _instrument->is_valid() : false); }
diff --git a/engines/scumm/imuse/pcspk.cpp b/engines/scumm/imuse/pcspk.cpp
new file mode 100644
index 0000000000..cbf3446f10
--- /dev/null
+++ b/engines/scumm/imuse/pcspk.cpp
@@ -0,0 +1,834 @@
+/* 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.
+ */
+
+#include "scumm/imuse/pcspk.h"
+
+#include "common/util.h"
+
+namespace Scumm {
+
+PcSpkDriver::PcSpkDriver(Audio::Mixer *mixer)
+ : MidiDriver_Emulated(mixer), _pcSpk(mixer->getOutputRate()) {
+}
+
+PcSpkDriver::~PcSpkDriver() {
+ close();
+}
+
+int PcSpkDriver::open() {
+ if (_isOpen)
+ return MERR_ALREADY_OPEN;
+
+ MidiDriver_Emulated::open();
+
+ for (uint i = 0; i < 6; ++i)
+ _channels[i].init(this, i);
+ _activeChannel = 0;
+ _effectTimer = 0;
+ _randBase = 1;
+
+ // We need to take care we only send note frequencies, when the internal
+ // settings actually changed, thus we need some extra state to keep track
+ // of that.
+ _lastActiveChannel = 0;
+ _lastActiveOut = 0;
+
+ // We set the output sound type to music here to allow sound volume
+ // adjustment. The drawback here is that we can not control the music and
+ // sfx separately here. But the AdLib output has the same issue so it
+ // should not be that bad.
+ _mixer->playStream(Audio::Mixer::kMusicSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
+ return 0;
+}
+
+void PcSpkDriver::close() {
+ if (!_isOpen)
+ return;
+ _isOpen = false;
+
+ _mixer->stopHandle(_mixerSoundHandle);
+}
+
+void PcSpkDriver::send(uint32 d) {
+ assert((d & 0x0F) < 6);
+ _channels[(d & 0x0F)].send(d);
+}
+
+void PcSpkDriver::sysEx_customInstrument(byte channel, uint32 type, const byte *instr) {
+ assert(channel < 6);
+ if (type == 'SPK ')
+ _channels[channel].sysEx_customInstrument(type, instr);
+}
+
+MidiChannel *PcSpkDriver::allocateChannel() {
+ for (uint i = 0; i < 6; ++i) {
+ if (_channels[i].allocate())
+ return &_channels[i];
+ }
+
+ return 0;
+}
+
+void PcSpkDriver::generateSamples(int16 *buf, int len) {
+ _pcSpk.readBuffer(buf, len);
+}
+
+void PcSpkDriver::onTimer() {
+ if (!_activeChannel)
+ return;
+
+ for (uint i = 0; i < 6; ++i) {
+ OutputChannel &out = _channels[i]._out;
+
+ if (!out.active)
+ continue;
+
+ if (out.length == 0 || --out.length != 0) {
+ if (out.unkB && out.unkC) {
+ out.unkA += out.unkB;
+ if (out.instrument)
+ out.unkE = ((int8)out.instrument[out.unkA] * out.unkC) >> 4;
+ }
+
+ ++_effectTimer;
+ if (_effectTimer > 3) {
+ _effectTimer = 0;
+
+ if (out.effectEnvelopeA.state)
+ updateEffectGenerator(_channels[i], out.effectEnvelopeA, out.effectDefA);
+ if (out.effectEnvelopeB.state)
+ updateEffectGenerator(_channels[i], out.effectEnvelopeB, out.effectDefB);
+ }
+ } else {
+ out.active = 0;
+ updateNote();
+ return;
+ }
+ }
+
+ if (_activeChannel->_tl) {
+ output((_activeChannel->_out.note << 7) + _activeChannel->_pitchBend + _activeChannel->_out.unk60 + _activeChannel->_out.unkE);
+ } else {
+ _pcSpk.stop();
+ _lastActiveChannel = 0;
+ _lastActiveOut = 0;
+ }
+}
+
+void PcSpkDriver::updateNote() {
+ uint8 priority = 0;
+ _activeChannel = 0;
+ for (uint i = 0; i < 6; ++i) {
+ if (_channels[i]._allocated && _channels[i]._out.active && _channels[i]._priority >= priority) {
+ priority = _channels[i]._priority;
+ _activeChannel = &_channels[i];
+ }
+ }
+
+ if (_activeChannel == 0 || _activeChannel->_tl == 0) {
+ _pcSpk.stop();
+ _lastActiveChannel = 0;
+ _lastActiveOut = 0;
+ } else {
+ output(_activeChannel->_pitchBend + (_activeChannel->_out.note << 7));
+ }
+}
+
+void PcSpkDriver::output(uint16 out) {
+ byte v1 = (out >> 7) & 0xFF;
+ byte v2 = (out >> 2) & 0x1E;
+
+ byte shift = _outputTable1[v1];
+ uint16 indexBase = _outputTable2[v1] << 5;
+ uint16 frequency = _frequencyTable[(indexBase + v2) / 2] >> shift;
+
+ // Only output in case the active channel changed or the frequency changed.
+ // This is not faithful to the original. Since our timings differ we would
+ // get distorted sound otherwise though.
+ if (_lastActiveChannel != _activeChannel || _lastActiveOut != out) {
+ _pcSpk.play(Audio::PCSpeaker::kWaveFormSquare, 1193180 / frequency, -1);
+ _lastActiveChannel = _activeChannel;
+ _lastActiveOut = out;
+ }
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::init(PcSpkDriver *owner, byte channel) {
+ _owner = owner;
+ _channel = channel;
+ _allocated = false;
+ memset(&_out, 0, sizeof(_out));
+}
+
+bool PcSpkDriver::MidiChannel_PcSpk::allocate() {
+ if (_allocated)
+ return false;
+
+ memset(&_out, 0, sizeof(_out));
+ memset(_instrument, 0, sizeof(_instrument));
+ _out.effectDefA.envelope = &_out.effectEnvelopeA;
+ _out.effectDefB.envelope = &_out.effectEnvelopeB;
+
+ _allocated = true;
+ return true;
+}
+
+MidiDriver *PcSpkDriver::MidiChannel_PcSpk::device() {
+ return _owner;
+}
+
+byte PcSpkDriver::MidiChannel_PcSpk::getNumber() {
+ return _channel;
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::release() {
+ _out.active = 0;
+ _allocated = false;
+ _owner->updateNote();
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::send(uint32 b) {
+ uint8 type = b & 0xF0;
+ uint8 p1 = (b >> 8) & 0xFF;
+ uint8 p2 = (b >> 16) & 0xFF;
+
+ switch (type) {
+ case 0x80:
+ noteOff(p1);
+ break;
+
+ case 0x90:
+ if (p2)
+ noteOn(p1, p2);
+ else
+ noteOff(p1);
+ break;
+
+ case 0xB0:
+ controlChange(p1, p2);
+ break;
+
+ case 0xE0:
+ pitchBend((p1 | (p2 << 7)) - 0x2000);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::noteOff(byte note) {
+ if (!_allocated)
+ return;
+
+ if (_sustain) {
+ if (_out.note == note)
+ _out.sustainNoteOff = 1;
+ } else {
+ if (_out.note == note) {
+ _out.active = 0;
+ _owner->updateNote();
+ }
+ }
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::noteOn(byte note, byte velocity) {
+ if (!_allocated)
+ return;
+
+ _out.note = note;
+ _out.sustainNoteOff = 0;
+ _out.length = _instrument[0];
+
+ if (_instrument[4] * 256 < ARRAYSIZE(PcSpkDriver::_outInstrumentData))
+ _out.instrument = _owner->_outInstrumentData + _instrument[4] * 256;
+ else
+ _out.instrument = 0;
+
+ _out.unkA = 0;
+ _out.unkB = _instrument[1];
+ _out.unkC = _instrument[2];
+ _out.unkE = 0;
+ _out.unk60 = 0;
+ _out.active = 1;
+
+ // In case we get a note on event on the last active channel, we reset the
+ // last active channel, thus we assure the frequency is correctly set, even
+ // when the same note was sent.
+ if (_owner->_lastActiveChannel == this) {
+ _owner->_lastActiveChannel = 0;
+ _owner->_lastActiveOut = 0;
+ }
+ _owner->updateNote();
+
+ _out.unkC += PcSpkDriver::getEffectModifier(_instrument[3] + ((velocity & 0xFE) << 4));
+ if (_out.unkC > 63)
+ _out.unkC = 63;
+
+ if ((_instrument[5] & 0x80) != 0)
+ _owner->setupEffects(*this, _out.effectEnvelopeA, _out.effectDefA, _instrument[5], _instrument + 6);
+
+ if ((_instrument[14] & 0x80) != 0)
+ _owner->setupEffects(*this, _out.effectEnvelopeB, _out.effectDefB, _instrument[14], _instrument + 15);
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::programChange(byte program) {
+ // Nothing to implement here, the iMuse code takes care of passing us the
+ // instrument data.
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::pitchBend(int16 bend) {
+ _pitchBend = (bend * _pitchBendFactor) >> 6;
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::controlChange(byte control, byte value) {
+ switch (control) {
+ case 1:
+ if (_out.effectEnvelopeA.state && _out.effectDefA.useModWheel)
+ _out.effectEnvelopeA.modWheelState = (value >> 2);
+ if (_out.effectEnvelopeB.state && _out.effectDefB.useModWheel)
+ _out.effectEnvelopeB.modWheelState = (value >> 2);
+ break;
+
+ case 7:
+ _tl = value;
+ if (_owner->_activeChannel == this) {
+ if (_tl == 0) {
+ _owner->_lastActiveChannel = 0;
+ _owner->_lastActiveOut = 0;
+ _owner->_pcSpk.stop();
+ } else {
+ _owner->output((_out.note << 7) + _pitchBend + _out.unk60 + _out.unkE);
+ }
+ }
+ break;
+
+ case 64:
+ _sustain = value;
+ if (!value && _out.sustainNoteOff) {
+ _out.active = 0;
+ _owner->updateNote();
+ }
+ break;
+
+ case 123:
+ _out.active = 0;
+ _owner->updateNote();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::pitchBendFactor(byte value) {
+ _pitchBendFactor = value;
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::priority(byte value) {
+ _priority = value;
+}
+
+void PcSpkDriver::MidiChannel_PcSpk::sysEx_customInstrument(uint32 type, const byte *instr) {
+ memcpy(_instrument, instr, sizeof(_instrument));
+}
+
+uint8 PcSpkDriver::getEffectModifier(uint16 level) {
+ uint8 base = level / 32;
+ uint8 index = level % 32;
+
+ if (index == 0)
+ return 0;
+
+ return (base * (index + 1)) >> 5;
+}
+
+int16 PcSpkDriver::getEffectModLevel(int16 level, int8 mod) {
+ if (!mod) {
+ return 0;
+ } else if (mod == 31) {
+ return level;
+ } else if (level < -63 || level > 63) {
+ return (mod * (level + 1)) >> 6;
+ } else if (mod < 0) {
+ if (level < 0)
+ return getEffectModifier(((-level) << 5) - mod);
+ else
+ return -getEffectModifier((level << 5) - mod);
+ } else {
+ if (level < 0)
+ return -getEffectModifier(((-level) << 5) + mod);
+ else
+ return getEffectModifier(((-level) << 5) + mod);
+ }
+}
+
+int16 PcSpkDriver::getRandScale(int16 input) {
+ if (_randBase & 1)
+ _randBase = (_randBase >> 1) ^ 0xB8;
+ else
+ _randBase >>= 1;
+
+ return (_randBase * input) >> 8;
+}
+
+void PcSpkDriver::setupEffects(MidiChannel_PcSpk &chan, EffectEnvelope &env, EffectDefinition &def, byte flags, const byte *data) {
+ def.phase = 0;
+ def.useModWheel = flags & 0x40;
+ env.loop = flags & 0x20;
+ def.type = flags & 0x1F;
+
+ env.modWheelSensitivity = 31;
+ if (def.useModWheel)
+ env.modWheelState = chan._modWheel >> 2;
+ else
+ env.modWheelState = 31;
+
+ switch (def.type) {
+ case 0:
+ env.maxLevel = 767;
+ env.startLevel = 383;
+ break;
+
+ case 1:
+ env.maxLevel = 31;
+ env.startLevel = 15;
+ break;
+
+ case 2:
+ env.maxLevel = 63;
+ env.startLevel = chan._out.unkB;
+ break;
+
+ case 3:
+ env.maxLevel = 63;
+ env.startLevel = chan._out.unkC;
+ break;
+
+ case 4:
+ env.maxLevel = 3;
+ env.startLevel = chan._instrument[4];
+ break;
+
+ case 5:
+ env.maxLevel = 62;
+ env.startLevel = 31;
+ env.modWheelState = 0;
+ break;
+
+ case 6:
+ env.maxLevel = 31;
+ env.startLevel = 0;
+ env.modWheelSensitivity = 0;
+ break;
+
+ default:
+ break;
+ }
+
+ startEffect(env, data);
+}
+
+void PcSpkDriver::startEffect(EffectEnvelope &env, const byte *data) {
+ env.state = 1;
+ env.currentLevel = 0;
+ env.modWheelLast = 31;
+ env.duration = data[0] * 63;
+
+ env.stateTargetLevels[0] = data[1];
+ env.stateTargetLevels[1] = data[3];
+ env.stateTargetLevels[2] = data[5];
+ env.stateTargetLevels[3] = data[6];
+
+ env.stateModWheelLevels[0] = data[2];
+ env.stateModWheelLevels[1] = data[4];
+ env.stateModWheelLevels[2] = 0;
+ env.stateModWheelLevels[3] = data[7];
+
+ initNextEnvelopeState(env);
+}
+
+void PcSpkDriver::initNextEnvelopeState(EffectEnvelope &env) {
+ uint8 lastState = env.state - 1;
+
+ uint16 stepCount = _effectEnvStepTable[getEffectModifier(((env.stateTargetLevels[lastState] & 0x7F) << 5) + env.modWheelSensitivity)];
+ if (env.stateTargetLevels[lastState] & 0x80)
+ stepCount = getRandScale(stepCount);
+ if (!stepCount)
+ stepCount = 1;
+
+ env.stateNumSteps = env.stateStepCounter = stepCount;
+
+ int16 totalChange = 0;
+ if (lastState != 2) {
+ totalChange = getEffectModLevel(env.maxLevel, (env.stateModWheelLevels[lastState] & 0x7F) - 31);
+ if (env.stateModWheelLevels[lastState] & 0x80)
+ totalChange = getRandScale(totalChange);
+
+ if (totalChange + env.startLevel > env.maxLevel)
+ totalChange = env.maxLevel - env.startLevel;
+ else if (totalChange + env.startLevel < 0)
+ totalChange = -env.startLevel;
+
+ totalChange -= env.currentLevel;
+ }
+
+ env.changePerStep = totalChange / stepCount;
+ if (totalChange < 0) {
+ totalChange = -totalChange;
+ env.dir = -1;
+ } else {
+ env.dir = 1;
+ }
+ env.changePerStepRem = totalChange % stepCount;
+ env.changeCountRem = 0;
+}
+
+void PcSpkDriver::updateEffectGenerator(MidiChannel_PcSpk &chan, EffectEnvelope &env, EffectDefinition &def) {
+ if (advanceEffectEnvelope(env, def) & 1) {
+ switch (def.type) {
+ case 0: case 1:
+ chan._out.unk60 = def.phase << 4;
+ break;
+
+ case 2:
+ chan._out.unkB = (def.phase & 0xFF) + chan._instrument[1];
+ break;
+
+ case 3:
+ chan._out.unkC = (def.phase & 0xFF) + chan._instrument[2];
+ break;
+
+ case 4:
+ if ((chan._instrument[4] + (def.phase & 0xFF)) * 256 < ARRAYSIZE(_outInstrumentData))
+ chan._out.instrument = _outInstrumentData + (chan._instrument[4] + (def.phase & 0xFF)) * 256;
+ else
+ chan._out.instrument = 0;
+ break;
+
+ case 5:
+ env.modWheelState = (def.phase & 0xFF);
+ break;
+
+ case 6:
+ env.modWheelSensitivity = (def.phase & 0xFF);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+uint8 PcSpkDriver::advanceEffectEnvelope(EffectEnvelope &env, EffectDefinition &def) {
+ if (env.duration != 0) {
+ env.duration -= 17;
+ if (env.duration <= 0) {
+ env.state = 0;
+ return 0;
+ }
+ }
+
+ uint8 changedFlags = 0;
+ int16 newLevel = env.currentLevel + env.changePerStep;
+ env.changeCountRem += env.changePerStepRem;
+ if (env.changeCountRem >= env.stateNumSteps) {
+ env.changeCountRem -= env.stateNumSteps;
+ newLevel += env.dir;
+ }
+
+ if (env.currentLevel != newLevel || env.modWheelLast != env.modWheelState) {
+ env.currentLevel = newLevel;
+ env.modWheelLast = env.modWheelState;
+
+ int16 newPhase = getEffectModLevel(newLevel, env.modWheelState);
+ if (def.phase != newPhase) {
+ changedFlags |= 1;
+ def.phase = newPhase;
+ }
+ }
+
+ --env.stateStepCounter;
+ if (!env.stateStepCounter) {
+ ++env.state;
+ if (env.state > 4) {
+ if (env.loop) {
+ env.state = 1;
+ changedFlags |= 2;
+ } else {
+ env.state = 0;
+ return changedFlags;
+ }
+ }
+
+ initNextEnvelopeState(env);
+ }
+
+ return changedFlags;
+}
+
+const byte PcSpkDriver::_outInstrumentData[1024] = {
+ 0x00, 0x03, 0x06, 0x09, 0x0C, 0x0F, 0x12, 0x15,
+ 0x18, 0x1B, 0x1E, 0x21, 0x24, 0x27, 0x2A, 0x2D,
+ 0x30, 0x33, 0x36, 0x39, 0x3B, 0x3E, 0x41, 0x43,
+ 0x46, 0x49, 0x4B, 0x4E, 0x50, 0x52, 0x55, 0x57,
+ 0x59, 0x5B, 0x5E, 0x60, 0x62, 0x64, 0x66, 0x67,
+ 0x69, 0x6B, 0x6C, 0x6E, 0x70, 0x71, 0x72, 0x74,
+ 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7B,
+ 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
+ 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D,
+ 0x7C, 0x7B, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x76,
+ 0x75, 0x74, 0x72, 0x71, 0x70, 0x6E, 0x6C, 0x6B,
+ 0x69, 0x67, 0x66, 0x64, 0x62, 0x60, 0x5E, 0x5B,
+ 0x59, 0x57, 0x55, 0x52, 0x50, 0x4E, 0x4B, 0x49,
+ 0x46, 0x43, 0x41, 0x3E, 0x3B, 0x39, 0x36, 0x33,
+ 0x30, 0x2D, 0x2A, 0x27, 0x24, 0x21, 0x1E, 0x1B,
+ 0x18, 0x15, 0x12, 0x0F, 0x0C, 0x09, 0x06, 0x03,
+ 0x00, 0xFD, 0xFA, 0xF7, 0xF4, 0xF1, 0xEE, 0xEB,
+ 0xE8, 0xE5, 0xE2, 0xDF, 0xDC, 0xD9, 0xD6, 0xD3,
+ 0xD0, 0xCD, 0xCA, 0xC7, 0xC5, 0xC2, 0xBF, 0xBD,
+ 0xBA, 0xB7, 0xB5, 0xB2, 0xB0, 0xAE, 0xAB, 0xA9,
+ 0xA7, 0xA5, 0xA2, 0xA0, 0x9E, 0x9C, 0x9A, 0x99,
+ 0x97, 0x95, 0x94, 0x92, 0x90, 0x8F, 0x8E, 0x8C,
+ 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, 0x85,
+ 0x84, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, 0x82,
+ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83,
+ 0x84, 0x85, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A,
+ 0x8B, 0x8C, 0x8E, 0x8F, 0x90, 0x92, 0x94, 0x95,
+ 0x97, 0x99, 0x9A, 0x9C, 0x9E, 0xA0, 0xA2, 0xA5,
+ 0xA7, 0xA9, 0xAB, 0xAE, 0xB0, 0xB2, 0xB5, 0xB7,
+ 0xBA, 0xBD, 0xBF, 0xC2, 0xC5, 0xC7, 0xCA, 0xCD,
+ 0xD0, 0xD3, 0xD6, 0xD9, 0xDC, 0xDF, 0xE2, 0xE5,
+ 0xE8, 0xEB, 0xEE, 0xF1, 0xF4, 0xF7, 0xFA, 0xFD,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x29, 0x23, 0xBE, 0x84, 0xE1, 0x6C, 0xD6, 0xAE,
+ 0x52, 0x90, 0x49, 0xF1, 0xF1, 0xBB, 0xE9, 0xEB,
+ 0xB3, 0xA6, 0xDB, 0x3C, 0x87, 0x0C, 0x3E, 0x99,
+ 0x24, 0x5E, 0x0D, 0x1C, 0x06, 0xB7, 0x47, 0xDE,
+ 0xB3, 0x12, 0x4D, 0xC8, 0x43, 0xBB, 0x8B, 0xA6,
+ 0x1F, 0x03, 0x5A, 0x7D, 0x09, 0x38, 0x25, 0x1F,
+ 0x5D, 0xD4, 0xCB, 0xFC, 0x96, 0xF5, 0x45, 0x3B,
+ 0x13, 0x0D, 0x89, 0x0A, 0x1C, 0xDB, 0xAE, 0x32,
+ 0x20, 0x9A, 0x50, 0xEE, 0x40, 0x78, 0x36, 0xFD,
+ 0x12, 0x49, 0x32, 0xF6, 0x9E, 0x7D, 0x49, 0xDC,
+ 0xAD, 0x4F, 0x14, 0xF2, 0x44, 0x40, 0x66, 0xD0,
+ 0x6B, 0xC4, 0x30, 0xB7, 0x32, 0x3B, 0xA1, 0x22,
+ 0xF6, 0x22, 0x91, 0x9D, 0xE1, 0x8B, 0x1F, 0xDA,
+ 0xB0, 0xCA, 0x99, 0x02, 0xB9, 0x72, 0x9D, 0x49,
+ 0x2C, 0x80, 0x7E, 0xC5, 0x99, 0xD5, 0xE9, 0x80,
+ 0xB2, 0xEA, 0xC9, 0xCC, 0x53, 0xBF, 0x67, 0xD6,
+ 0xBF, 0x14, 0xD6, 0x7E, 0x2D, 0xDC, 0x8E, 0x66,
+ 0x83, 0xEF, 0x57, 0x49, 0x61, 0xFF, 0x69, 0x8F,
+ 0x61, 0xCD, 0xD1, 0x1E, 0x9D, 0x9C, 0x16, 0x72,
+ 0x72, 0xE6, 0x1D, 0xF0, 0x84, 0x4F, 0x4A, 0x77,
+ 0x02, 0xD7, 0xE8, 0x39, 0x2C, 0x53, 0xCB, 0xC9,
+ 0x12, 0x1E, 0x33, 0x74, 0x9E, 0x0C, 0xF4, 0xD5,
+ 0xD4, 0x9F, 0xD4, 0xA4, 0x59, 0x7E, 0x35, 0xCF,
+ 0x32, 0x22, 0xF4, 0xCC, 0xCF, 0xD3, 0x90, 0x2D,
+ 0x48, 0xD3, 0x8F, 0x75, 0xE6, 0xD9, 0x1D, 0x2A,
+ 0xE5, 0xC0, 0xF7, 0x2B, 0x78, 0x81, 0x87, 0x44,
+ 0x0E, 0x5F, 0x50, 0x00, 0xD4, 0x61, 0x8D, 0xBE,
+ 0x7B, 0x05, 0x15, 0x07, 0x3B, 0x33, 0x82, 0x1F,
+ 0x18, 0x70, 0x92, 0xDA, 0x64, 0x54, 0xCE, 0xB1,
+ 0x85, 0x3E, 0x69, 0x15, 0xF8, 0x46, 0x6A, 0x04,
+ 0x96, 0x73, 0x0E, 0xD9, 0x16, 0x2F, 0x67, 0x68,
+ 0xD4, 0xF7, 0x4A, 0x4A, 0xD0, 0x57, 0x68, 0x76
+};
+
+const byte PcSpkDriver::_outputTable1[] = {
+ 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, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7
+};
+
+const byte PcSpkDriver::_outputTable2[] = {
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 0, 1, 2, 3,
+ 4, 5, 6, 7
+};
+
+const uint16 PcSpkDriver::_effectEnvStepTable[] = {
+ 1, 2, 4, 5,
+ 6, 7, 8, 9,
+ 10, 12, 14, 16,
+ 18, 21, 24, 30,
+ 36, 50, 64, 82,
+ 100, 136, 160, 192,
+ 240, 276, 340, 460,
+ 600, 860, 1200, 1600
+};
+
+const uint16 PcSpkDriver::_frequencyTable[] = {
+ 0x8E84, 0x8E00, 0x8D7D, 0x8CFA,
+ 0x8C78, 0x8BF7, 0x8B76, 0x8AF5,
+ 0x8A75, 0x89F5, 0x8976, 0x88F7,
+ 0x8879, 0x87FB, 0x877D, 0x8700,
+ 0x8684, 0x8608, 0x858C, 0x8511,
+ 0x8496, 0x841C, 0x83A2, 0x8328,
+ 0x82AF, 0x8237, 0x81BF, 0x8147,
+ 0x80D0, 0x8059, 0x7FE3, 0x7F6D,
+ 0x7EF7, 0x7E82, 0x7E0D, 0x7D99,
+ 0x7D25, 0x7CB2, 0x7C3F, 0x7BCC,
+ 0x7B5A, 0x7AE8, 0x7A77, 0x7A06,
+ 0x7995, 0x7925, 0x78B5, 0x7846,
+ 0x77D7, 0x7768, 0x76FA, 0x768C,
+ 0x761F, 0x75B2, 0x7545, 0x74D9,
+ 0x746D, 0x7402, 0x7397, 0x732C,
+ 0x72C2, 0x7258, 0x71EF, 0x7186,
+ 0x711D, 0x70B5, 0x704D, 0x6FE5,
+ 0x6F7E, 0x6F17, 0x6EB0, 0x6E4A,
+ 0x6DE5, 0x6D7F, 0x6D1A, 0x6CB5,
+ 0x6C51, 0x6BED, 0x6B8A, 0x6B26,
+ 0x6AC4, 0x6A61, 0x69FF, 0x699D,
+ 0x693C, 0x68DB, 0x687A, 0x681A,
+ 0x67BA, 0x675A, 0x66FA, 0x669B,
+ 0x663D, 0x65DF, 0x6581, 0x6523,
+ 0x64C6, 0x6469, 0x640C, 0x63B0,
+ 0x6354, 0x62F8, 0x629D, 0x6242,
+ 0x61E7, 0x618D, 0x6133, 0x60D9,
+ 0x6080, 0x6027, 0x5FCE, 0x5F76,
+ 0x5F1E, 0x5EC6, 0x5E6E, 0x5E17,
+ 0x5DC1, 0x5D6A, 0x5D14, 0x5CBE,
+ 0x5C68, 0x5C13, 0x5BBE, 0x5B6A,
+ 0x5B15, 0x5AC1, 0x5A6E, 0x5A1A,
+ 0x59C7, 0x5974, 0x5922, 0x58CF,
+ 0x587D, 0x582C, 0x57DA, 0x5789,
+ 0x5739, 0x56E8, 0x5698, 0x5648,
+ 0x55F9, 0x55A9, 0x555A, 0x550B,
+ 0x54BD, 0x546F, 0x5421, 0x53D3,
+ 0x5386, 0x5339, 0x52EC, 0x52A0,
+ 0x5253, 0x5207, 0x51BC, 0x5170,
+ 0x5125, 0x50DA, 0x5090, 0x5046,
+ 0x4FFB, 0x4FB2, 0x4F68, 0x4F1F,
+ 0x4ED6, 0x4E8D, 0x4E45, 0x4DFC,
+ 0x4DB5, 0x4D6D, 0x4D25, 0x4CDE,
+ 0x4C97, 0x4C51, 0x4C0A, 0x4BC4,
+ 0x4B7E, 0x4B39, 0x4AF3, 0x4AAE,
+ 0x4A69, 0x4A24, 0x49E0, 0x499C,
+ 0x4958, 0x4914, 0x48D1, 0x488E,
+ 0x484B, 0x4808, 0x47C6, 0x4783
+};
+
+} // End of namespace Scumm
diff --git a/engines/scumm/imuse/pcspk.h b/engines/scumm/imuse/pcspk.h
new file mode 100644
index 0000000000..195bd34b07
--- /dev/null
+++ b/engines/scumm/imuse/pcspk.h
@@ -0,0 +1,160 @@
+/* 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 SCUMM_IMUSE_PCSPK_H
+#define SCUMM_IMUSE_PCSPK_H
+
+#include "audio/softsynth/emumidi.h"
+#include "audio/softsynth/pcspk.h"
+
+namespace Scumm {
+
+class PcSpkDriver : public MidiDriver_Emulated {
+public:
+ PcSpkDriver(Audio::Mixer *mixer);
+ ~PcSpkDriver();
+
+ virtual int open();
+ virtual void close();
+
+ virtual void send(uint32 d);
+ virtual void sysEx_customInstrument(byte channel, uint32 type, const byte *instr);
+
+ virtual MidiChannel *allocateChannel();
+ virtual MidiChannel *getPercussionChannel() { return 0; }
+
+ bool isStereo() const { return _pcSpk.isStereo(); }
+ int getRate() const { return _pcSpk.getRate(); }
+protected:
+ void generateSamples(int16 *buf, int len);
+ void onTimer();
+
+private:
+ Audio::PCSpeaker _pcSpk;
+ int _effectTimer;
+ uint8 _randBase;
+
+ void updateNote();
+ void output(uint16 out);
+
+ static uint8 getEffectModifier(uint16 level);
+ int16 getEffectModLevel(int16 level, int8 mod);
+ int16 getRandScale(int16 input);
+
+ struct EffectEnvelope {
+ uint8 state;
+ int16 currentLevel;
+ int16 duration;
+ int16 maxLevel;
+ int16 startLevel;
+ uint8 loop;
+ uint8 stateTargetLevels[4];
+ uint8 stateModWheelLevels[4];
+ uint8 modWheelSensitivity;
+ uint8 modWheelState;
+ uint8 modWheelLast;
+ int16 stateNumSteps;
+ int16 stateStepCounter;
+ int16 changePerStep;
+ int8 dir;
+ int16 changePerStepRem;
+ int16 changeCountRem;
+ };
+
+ struct EffectDefinition {
+ int16 phase;
+ uint8 type;
+ uint8 useModWheel;
+ EffectEnvelope *envelope;
+ };
+
+ struct OutputChannel {
+ uint8 active;
+ uint8 note;
+ uint8 sustainNoteOff;
+ uint8 length;
+ const uint8 *instrument;
+ uint8 unkA;
+ uint8 unkB;
+ uint8 unkC;
+ int16 unkE;
+ EffectEnvelope effectEnvelopeA;
+ EffectDefinition effectDefA;
+ EffectEnvelope effectEnvelopeB;
+ EffectDefinition effectDefB;
+ int16 unk60;
+ };
+
+ struct MidiChannel_PcSpk : public MidiChannel {
+ virtual MidiDriver *device();
+ virtual byte getNumber();
+ virtual void release();
+
+ virtual void send(uint32 b);
+ virtual void noteOff(byte note);
+ virtual void noteOn(byte note, byte velocity);
+ virtual void programChange(byte program);
+ virtual void pitchBend(int16 bend);
+ virtual void controlChange(byte control, byte value);
+ virtual void pitchBendFactor(byte value);
+ virtual void priority(byte value);
+ virtual void sysEx_customInstrument(uint32 type, const byte *instr);
+
+ void init(PcSpkDriver *owner, byte channel);
+ bool allocate();
+
+ PcSpkDriver *_owner;
+ bool _allocated;
+ byte _channel;
+
+ OutputChannel _out;
+ uint8 _instrument[23];
+ uint8 _programNr;
+ uint8 _priority;
+ uint8 _tl;
+ uint8 _modWheel;
+ uint8 _sustain;
+ uint8 _pitchBendFactor;
+ int16 _pitchBend;
+ };
+
+ void setupEffects(MidiChannel_PcSpk &chan, EffectEnvelope &env, EffectDefinition &def, byte flags, const byte *data);
+ void startEffect(EffectEnvelope &env, const byte *data);
+ void initNextEnvelopeState(EffectEnvelope &env);
+ void updateEffectGenerator(MidiChannel_PcSpk &chan, EffectEnvelope &env, EffectDefinition &def);
+ uint8 advanceEffectEnvelope(EffectEnvelope &env, EffectDefinition &def);
+
+ MidiChannel_PcSpk _channels[6];
+ MidiChannel_PcSpk *_activeChannel;
+
+ MidiChannel_PcSpk *_lastActiveChannel;
+ uint16 _lastActiveOut;
+
+ static const byte _outInstrumentData[1024];
+ static const byte _outputTable1[];
+ static const byte _outputTable2[];
+ static const uint16 _effectEnvStepTable[];
+ static const uint16 _frequencyTable[];
+};
+
+} // End of namespace Scumm
+
+#endif
diff --git a/engines/scumm/imuse/sysex.h b/engines/scumm/imuse/sysex.h
index 7dd38e785e..06ac483afd 100644
--- a/engines/scumm/imuse/sysex.h
+++ b/engines/scumm/imuse/sysex.h
@@ -35,4 +35,3 @@ extern void sysexHandler_SamNMax(Player *, const byte *, uint16);
} // End of namespace Scumm
#endif
-
diff --git a/engines/scumm/imuse/sysex_samnmax.cpp b/engines/scumm/imuse/sysex_samnmax.cpp
index 4c4219e7bb..a4f525da56 100644
--- a/engines/scumm/imuse/sysex_samnmax.cpp
+++ b/engines/scumm/imuse/sysex_samnmax.cpp
@@ -53,8 +53,7 @@ void sysexHandler_SamNMax(Player *player, const byte *msg, uint16 len) {
// something magical is supposed to happen....
for (a = 0; a < ARRAYSIZE(se->_snm_triggers); ++a) {
if (se->_snm_triggers[a].sound == player->_id &&
- se->_snm_triggers[a].id == *p)
- {
+ se->_snm_triggers[a].id == *p) {
se->_snm_triggers[a].sound = se->_snm_triggers[a].id = 0;
se->doCommand(8, se->_snm_triggers[a].command);
break;
diff --git a/engines/scumm/imuse/sysex_scumm.cpp b/engines/scumm/imuse/sysex_scumm.cpp
index c3bec93a60..85ffc86f47 100644
--- a/engines/scumm/imuse/sysex_scumm.cpp
+++ b/engines/scumm/imuse/sysex_scumm.cpp
@@ -49,50 +49,52 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) {
switch (code = *p++) {
case 0:
// Allocate new part.
- // There are 17 bytes of useful information here.
+ // There are 8 bytes (after decoding!) of useful information here.
// Here is what we know about them so far:
- // BYTE 00: Channel #
- // BYTE 02: BIT 01(0x01): Part on?(1 = yes)
+ // BYTE 0: Channel #
+ // BYTE 1: BIT 01(0x01): Part on?(1 = yes)
// BIT 02(0x02): Reverb? (1 = yes) [bug #1088045]
- // BYTE 04: Priority adjustment [guessing]
- // BYTE 05: Volume(upper 4 bits) [guessing]
- // BYTE 06: Volume(lower 4 bits) [guessing]
- // BYTE 07: Pan(upper 4 bits) [bug #1088045]
- // BYTE 08: Pan(lower 4 bits) [bug #1088045]
- // BYTE 09: BIT 04(0x08): Percussion?(1 = yes)
- // BYTE 13: Pitchbend range(upper 4 bits) [bug #1088045]
- // BYTE 14: Pitchbend range(lower 4 bits) [bug #1088045]
- // BYTE 15: Program(upper 4 bits)
- // BYTE 16: Program(lower 4 bits)
-
- // athrxx (05-21-2011):
- // BYTE 9, 10: Transpose (if set to 0x80, this means that part->_transpose_eff will be 0 (also ignoring player->_transpose)
- // BYTE 11, 12: Detune
+ // BYTE 2: Priority adjustment
+ // BYTE 3: Volume [guessing]
+ // BYTE 4: Pan [bug #1088045]
+ // BYTE 5: BIT 8(0x80): Percussion?(1 = yes) [guessed?]
+ // BYTE 5: Transpose, if set to 0x80(=-1) it means no transpose
+ // BYTE 6: Detune
+ // BYTE 7: Pitchbend factor [bug #1088045]
+ // BYTE 8: Program
part = player->getPart(p[0] & 0x0F);
+ player->decode_sysex_bytes(p + 1, buf + 1, len - 1);
if (part) {
- part->set_onoff(p[2] & 0x01);
- part->effectLevel((p[2] & 0x02) ? 127 : 0);
- part->set_pri(p[4]);
- part->volume((p[5] & 0x0F) << 4 |(p[6] & 0x0F));
- part->set_pan((p[7] & 0x0F) << 4 | (p[8] & 0x0F));
- part->_percussion = player->_isMIDI ? ((p[9] & 0x08) > 0) : false;
- part->set_transpose((p[9] & 0x0F) << 4 | (p[10] & 0x0F));
- part->set_detune((p[11] & 0x0F) << 4 | (p[12] & 0x0F));
- part->pitchBendFactor((p[13] & 0x0F) << 4 | (p[14] & 0x0F));
+ part->set_onoff(buf[1] & 0x01);
+ part->effectLevel((buf[1] & 0x02) ? 127 : 0);
+ part->set_pri(buf[2]);
+ part->volume(buf[3]);
+ part->set_pan(buf[4]);
+ part->_percussion = player->_isMIDI ? ((buf[5] & 0x80) > 0) : false;
+ part->set_transpose(buf[5]);
+ part->set_detune(buf[6]);
+ part->pitchBendFactor(buf[7]);
if (part->_percussion) {
if (part->_mc) {
part->off();
se->reallocateMidiChannels(player->_midi);
}
} else {
- // Even in cases where a program does not seem to be specified,
- // i.e. bytes 15 and 16 are 0, we send a program change because
- // 0 is a valid program number. MI2 tests show that in such
- // cases, a regular program change message always seems to follow
- // anyway.
- if (player->_isMIDI)
- part->_instrument.program((p[15] & 0x0F) << 4 |(p[16] & 0x0F), player->_isMT32);
+ if (player->_isMIDI) {
+ // Even in cases where a program does not seem to be specified,
+ // i.e. bytes 15 and 16 are 0, we send a program change because
+ // 0 is a valid program number. MI2 tests show that in such
+ // cases, a regular program change message always seems to follow
+ // anyway.
+ part->_instrument.program(buf[8], player->_isMT32);
+ } else {
+ // Like the original we set up the instrument data of the
+ // specified program here too. In case the global
+ // instrument data is not loaded already, this will take
+ // care of setting a default instrument too.
+ se->copyGlobalInstrument(buf[8], &part->_instrument);
+ }
part->sendAll();
}
}
@@ -113,11 +115,10 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) {
++p; // Skip hardware type
part = player->getPart(a);
if (part) {
- if (len == 62) {
+ if (len == 62 || len == 48) {
player->decode_sysex_bytes(p, buf, len - 2);
part->set_instrument((byte *)buf);
} else {
- // SPK tracks have len == 48 here, and are not supported
part->programChange(254); // Must be invalid, but not 255 (which is reserved)
}
}
@@ -127,7 +128,8 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) {
p += 2; // Skip hardware type and... whatever came right before it
a = *p++;
player->decode_sysex_bytes(p, buf, len - 3);
- se->setGlobalAdLibInstrument(a, buf);
+ if (len == 63 || len == 49)
+ se->setGlobalInstrument(a, buf);
break;
case 33: // Parameter adjust
@@ -185,10 +187,9 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) {
case 80: // Loop
player->decode_sysex_bytes(p + 1, buf, len - 1);
- player->setLoop
- (READ_BE_UINT16(buf), READ_BE_UINT16(buf + 2),
- READ_BE_UINT16(buf + 4), READ_BE_UINT16(buf + 6),
- READ_BE_UINT16(buf + 8));
+ player->setLoop(READ_BE_UINT16(buf), READ_BE_UINT16(buf + 2),
+ READ_BE_UINT16(buf + 4), READ_BE_UINT16(buf + 6),
+ READ_BE_UINT16(buf + 8));
break;
case 81: // End loop
diff --git a/engines/scumm/imuse_digi/dimuse.cpp b/engines/scumm/imuse_digi/dimuse.cpp
index 23f57a01b9..eb3717494f 100644
--- a/engines/scumm/imuse_digi/dimuse.cpp
+++ b/engines/scumm/imuse_digi/dimuse.cpp
@@ -58,7 +58,7 @@ IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, int fps)
memset(_track[l], 0, sizeof(Track));
_track[l]->trackId = l;
}
- _vm->getTimerManager()->installTimerProc(timer_handler, 1000000 / _callbackFps, this);
+ _vm->getTimerManager()->installTimerProc(timer_handler, 1000000 / _callbackFps, this, "IMuseDigital");
_audioNames = NULL;
_numAudioNames = 0;
diff --git a/engines/scumm/imuse_digi/dimuse_codecs.cpp b/engines/scumm/imuse_digi/dimuse_codecs.cpp
index 69cd89320c..6edfe0bd33 100644
--- a/engines/scumm/imuse_digi/dimuse_codecs.cpp
+++ b/engines/scumm/imuse_digi/dimuse_codecs.cpp
@@ -105,7 +105,9 @@ static const byte imxOtherTable[6][64] = {
void releaseImcTables() {
free(_destImcTable);
+ _destImcTable = NULL;
free(_destImcTable2);
+ _destImcTable2 = NULL;
}
void initializeImcTables() {
diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp
index 5eea7acc6b..6d9e1f3f72 100644
--- a/engines/scumm/input.cpp
+++ b/engines/scumm/input.cpp
@@ -324,7 +324,17 @@ void ScummEngine::processInput() {
VAR(VAR_LEFTBTN_HOLD) = (_leftBtnPressed & msDown) != 0;
VAR(VAR_RIGHTBTN_HOLD) = (_rightBtnPressed & msDown) != 0;
- if (_game.version >= 7) {
+ if (_game.heversion >= 72) {
+ // HE72 introduced a flag for whether or not this is a click
+ // or the player is continuing to hold the button down.
+ // 0x80 signifies that the button is continuing to be held down
+ // Backyard Soccer needs this in order to function
+ if (VAR(VAR_LEFTBTN_HOLD) && !(_leftBtnPressed & msClicked))
+ VAR(VAR_LEFTBTN_HOLD) |= 0x80;
+
+ if (VAR(VAR_RIGHTBTN_HOLD) && !(_rightBtnPressed & msClicked))
+ VAR(VAR_RIGHTBTN_HOLD) |= 0x80;
+ } else if (_game.version >= 7) {
VAR(VAR_LEFTBTN_DOWN) = (_leftBtnPressed & msClicked) != 0;
VAR(VAR_RIGHTBTN_DOWN) = (_rightBtnPressed & msClicked) != 0;
}
diff --git a/engines/scumm/insane/insane_enemy.cpp b/engines/scumm/insane/insane_enemy.cpp
index 68766ab72c..913f761f31 100644
--- a/engines/scumm/insane/insane_enemy.cpp
+++ b/engines/scumm/insane/insane_enemy.cpp
@@ -2779,4 +2779,3 @@ int32 Insane::actionEnemy() {
}
}
-
diff --git a/engines/scumm/insane/insane_iact.cpp b/engines/scumm/insane/insane_iact.cpp
index 3592d67c18..48c96b537c 100644
--- a/engines/scumm/insane/insane_iact.cpp
+++ b/engines/scumm/insane/insane_iact.cpp
@@ -520,4 +520,3 @@ void Insane::iactScene21(byte *renderBitmap, int32 codecparam, int32 setupsan12,
}
}
-
diff --git a/engines/scumm/insane/insane_scenes.cpp b/engines/scumm/insane/insane_scenes.cpp
index 841fedafe2..6db1cb5059 100644
--- a/engines/scumm/insane/insane_scenes.cpp
+++ b/engines/scumm/insane/insane_scenes.cpp
@@ -1506,4 +1506,3 @@ void Insane::postCaseMore(byte *renderBitmap, int32 codecparam, int32 setupsan12
}
}
-
diff --git a/engines/scumm/module.mk b/engines/scumm/module.mk
index 1a60564a9e..781ca30459 100644
--- a/engines/scumm/module.mk
+++ b/engines/scumm/module.mk
@@ -27,6 +27,7 @@ MODULE_OBJS := \
imuse/imuse_part.o \
imuse/imuse_player.o \
imuse/instrument.o \
+ imuse/pcspk.o \
imuse/sysex_samnmax.o \
imuse/sysex_scumm.o \
input.o \
@@ -123,7 +124,14 @@ MODULE_OBJS += \
he/script_v90he.o \
he/script_v100he.o \
he/sprite_he.o \
- he/wiz_he.o
+ he/wiz_he.o \
+ he/logic/baseball2001.o \
+ he/logic/basketball.o \
+ he/logic/football.o \
+ he/logic/funshop.o \
+ he/logic/moonbase.o \
+ he/logic/puttrace.o \
+ he/logic/soccer.o
endif
# This module can be built as a plugin
diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp
index 51ba2195d7..2c10758730 100644
--- a/engines/scumm/palette.cpp
+++ b/engines/scumm/palette.cpp
@@ -372,6 +372,143 @@ void ScummEngine::setPaletteFromPtr(const byte *ptr, int numcolor) {
setDirtyColors(firstIndex, numcolor - 1);
}
+void ScummEngine::setAmigaPaletteFromPtr(const byte *ptr) {
+ memcpy(_currentPalette, ptr, 768);
+
+ for (int i = 0; i < 32; ++i) {
+ _shadowPalette[i] = i;
+ _colorUsedByCycle[i] = 0;
+ }
+
+ amigaPaletteFindFirstUsedColor();
+
+ for (int i = 0; i < 64; ++i) {
+ _amigaPalette[i * 3 + 0] = _currentPalette[(i + 16) * 3 + 0] >> 4;
+ _amigaPalette[i * 3 + 1] = _currentPalette[(i + 16) * 3 + 1] >> 4;
+ _amigaPalette[i * 3 + 2] = _currentPalette[(i + 16) * 3 + 2] >> 4;
+ }
+
+ for (int i = 0; i < 256; ++i) {
+ if (i < 16 || i >= _amigaFirstUsedColor) {
+ mapRoomPalette(i);
+ mapVerbPalette(i);
+ } else {
+ int idx = (i - 16) & 31;
+ // We adjust our verb palette map from [0, 31] to [32, 63], since unlike
+ // the original we set up the verb palette at colors [32, 63].
+ // The original instead used two different palettes for the verb virtual
+ // screen and all the rest.
+ if (idx != 17) {
+ _roomPalette[i] = idx;
+ _verbPalette[i] = idx + 32;
+ } else {
+ // In all my tests it seems the colors 0 and 32 in
+ // _amigaPalette are in fact black. Thus 17 is probably black.
+ // For the room map the color 17 is 33 (17+16), for the verb
+ // map it is 65 (17+32).
+ _roomPalette[i] = 0;
+ _verbPalette[i] = 32;
+ }
+ }
+ }
+
+ setDirtyColors(0, 255);
+}
+
+void ScummEngine::amigaPaletteFindFirstUsedColor() {
+ for (_amigaFirstUsedColor = 80; _amigaFirstUsedColor < 256; ++_amigaFirstUsedColor) {
+ // We look for the first used color here. If all color components are
+ // >= 252 the color seems to be unused. Check remapPaletteColor for
+ // the same behavior.
+ if (_currentPalette[_amigaFirstUsedColor * 3 + 0] <= 251
+ || _currentPalette[_amigaFirstUsedColor * 3 + 1] <= 251
+ || _currentPalette[_amigaFirstUsedColor * 3 + 2] <= 251)
+ break;
+ }
+}
+
+void ScummEngine::mapRoomPalette(int idx) {
+ // For Color 33 (which is in fact 17+16) see the special case in
+ // setAmigaPaletteFromPtr.
+ if (idx >= 16 && idx < 48 && idx != 33)
+ _roomPalette[idx] = idx - 16;
+ else
+ _roomPalette[idx] = remapRoomPaletteColor(_currentPalette[idx * 3 + 0] >> 4,
+ _currentPalette[idx * 3 + 1] >> 4,
+ _currentPalette[idx * 3 + 2] >> 4);
+}
+
+static const uint8 amigaWeightTable[16] = {
+ 0, 1, 4, 9, 16, 25, 36, 49,
+ 64, 81, 100, 121, 144, 169, 196, 225
+};
+
+int ScummEngine::remapRoomPaletteColor(int r, int g, int b) {
+ int idx = 0;
+ uint16 minValue = 0xFFFF;
+
+ const byte *pal = _amigaPalette;
+ const byte *cycle = _colorUsedByCycle;
+
+ for (int i = 0; i < 32; ++i) {
+ if (!*cycle++ && i != 17) {
+ int rD = ABS<int>(*pal++ - r);
+ int gD = ABS<int>(*pal++ - g);
+ int bD = ABS<int>(*pal++ - b);
+
+ const uint16 weight = amigaWeightTable[rD] + amigaWeightTable[gD] + amigaWeightTable[bD];
+ if (weight < minValue) {
+ minValue = weight;
+ idx = i;
+ }
+ } else {
+ pal += 3;
+ }
+ }
+
+ return idx;
+}
+
+void ScummEngine::mapVerbPalette(int idx) {
+ // We adjust our verb palette map from [0, 31] to [32, 63], since unlike
+ // the original we set up the verb palette at colors [32, 63].
+ // The original instead used two different palettes for the verb virtual
+ // screen and all the rest.
+ // For Color 65 (which is in fact 17+32) see the special case in
+ // setAmigaPaletteFromPtr.
+ if (idx >= 48 && idx < 80 && idx != 65)
+ _verbPalette[idx] = idx - 16;
+ else
+ _verbPalette[idx] = remapVerbPaletteColor(_currentPalette[idx * 3 + 0] >> 4,
+ _currentPalette[idx * 3 + 1] >> 4,
+ _currentPalette[idx * 3 + 2] >> 4) + 32;
+}
+
+int ScummEngine::remapVerbPaletteColor(int r, int g, int b) {
+ int idx = 0;
+ uint16 minValue = 0xFFFF;
+
+ const byte *pal = _amigaPalette + 32 * 3;
+
+ for (int i = 0; i < 32; ++i) {
+ if (i != 17) {
+ int rD = ABS<int>(*pal++ - r);
+ int gD = ABS<int>(*pal++ - g);
+ int bD = ABS<int>(*pal++ - b);
+
+ const uint16 weight = amigaWeightTable[rD] + amigaWeightTable[gD] + amigaWeightTable[bD];
+ if (weight < minValue) {
+ minValue = weight;
+ idx = i;
+ }
+ } else {
+ pal += 3;
+ }
+ }
+
+ return idx;
+}
+
void ScummEngine::setDirtyColors(int min, int max) {
if (_palDirtyMin > min)
_palDirtyMin = min;
@@ -419,11 +556,26 @@ void ScummEngine::initCycl(const byte *ptr) {
cycl->start = *ptr++;
cycl->end = *ptr++;
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ cycl->start = CLIP(cycl->start - 16, 0, 31);
+ cycl->end = CLIP(cycl->end - 16, 0, 31);
+ }
+
for (int i = cycl->start; i <= cycl->end; ++i) {
_colorUsedByCycle[i] = 1;
}
}
}
+
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ for (int i = 0; i < 256; ++i) {
+ if (i >= 16 && i < _amigaFirstUsedColor)
+ continue;
+
+ if (_colorUsedByCycle[_roomPalette[i]])
+ mapRoomPalette(i);
+ }
+ }
}
void ScummEngine::stopCycle(int i) {
@@ -432,11 +584,25 @@ void ScummEngine::stopCycle(int i) {
assertRange(0, i, 16, "stopCycle: cycle");
if (i != 0) {
_colorCycle[i - 1].delay = 0;
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ cycl = &_colorCycle[i - 1];
+ for (int j = cycl->start; j <= cycl->end && j < 32; ++j) {
+ _shadowPalette[j] = j;
+ _colorUsedByCycle[j] = 0;
+ }
+ }
return;
}
- for (i = 0, cycl = _colorCycle; i < 16; i++, cycl++)
+ for (i = 0, cycl = _colorCycle; i < 16; i++, cycl++) {
cycl->delay = 0;
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ for (int j = cycl->start; j <= cycl->end && j < 32; ++j) {
+ _shadowPalette[j] = j;
+ _colorUsedByCycle[j] = 0;
+ }
+ }
+ }
}
/**
@@ -512,14 +678,18 @@ void ScummEngine::cyclePalette() {
setDirtyColors(cycl->start, cycl->end);
moveMemInPalRes(cycl->start, cycl->end, cycl->flags & 2);
- doCyclePalette(_currentPalette, cycl->start, cycl->end, 3, !(cycl->flags & 2));
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ doCyclePalette(_shadowPalette, cycl->start, cycl->end, 1, !(cycl->flags & 2));
+ } else {
+ doCyclePalette(_currentPalette, cycl->start, cycl->end, 3, !(cycl->flags & 2));
- if (_shadowPalette) {
- if (_game.version >= 7) {
- for (j = 0; j < NUM_SHADOW_PALETTE; j++)
+ if (_shadowPalette) {
+ if (_game.version >= 7) {
+ for (j = 0; j < NUM_SHADOW_PALETTE; j++)
doCycleIndirectPalette(_shadowPalette + j * 256, cycl->start, cycl->end, !(cycl->flags & 2));
- } else {
- doCycleIndirectPalette(_shadowPalette, cycl->start, cycl->end, !(cycl->flags & 2));
+ } else {
+ doCycleIndirectPalette(_shadowPalette, cycl->start, cycl->end, !(cycl->flags & 2));
+ }
}
}
}
@@ -544,6 +714,12 @@ void ScummEngine::palManipulateInit(int resID, int start, int end, int time) {
return;
#endif
+ // This function is actually a nullsub in Indy4 Amiga.
+ // It might very well be a nullsub in other Amiga games, but for now I
+ // limit this to Indy4 Amiga, since that is the only game I can check.
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4)
+ return;
+
byte *string1 = getStringAddress(resID);
byte *string2 = getStringAddress(resID + 1);
byte *string3 = getStringAddress(resID + 2);
@@ -670,6 +846,12 @@ static inline uint colorWeight(int red, int green, int blue) {
}
void ScummEngine::setShadowPalette(int redScale, int greenScale, int blueScale, int startColor, int endColor, int start, int end) {
+ // This function is actually a nullsub in Indy4 Amiga.
+ // It might very well be a nullsub in other Amiga games, but for now I
+ // limit this to Indy4 Amiga, since that is the only game I can check.
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4)
+ return;
+
const byte *basepal = getPalettePtr(_curPalIndex, _roomResource);
const byte *compareptr;
const byte *pal = basepal + start * 3;
@@ -721,62 +903,106 @@ void ScummEngine::setShadowPalette(int redScale, int greenScale, int blueScale,
}
void ScummEngine::darkenPalette(int redScale, int greenScale, int blueScale, int startColor, int endColor) {
- int max;
- if (_game.version >= 5 && _game.version <= 6 && _game.heversion <= 60) {
- max = 252;
- } else {
- max = 255;
- }
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ startColor = CLIP(startColor, 0, 255);
- if (startColor <= endColor) {
- const byte *cptr;
- const byte *palptr;
- int color, idx, j;
+ //bool remappedVerbColors = false;
+ bool remappedRoomColors = false;
+ bool cycleFlag = (blueScale >= 250 && greenScale >= 250 && redScale >= 250);
+
+ const byte *palptr = getPalettePtr(_curPalIndex, _roomResource) + startColor * 3;
+
+ for (int i = startColor; i <= endColor; ++i) {
+ if (i > 16 && i < 48) {
+ if (cycleFlag)
+ _colorUsedByCycle[i - 16] &= ~2;
+ else
+ _colorUsedByCycle[i - 16] |= 2;
+ }
+
+ _currentPalette[i * 3 + 0] = (*palptr++ * redScale) >> 8;
+ _currentPalette[i * 3 + 1] = (*palptr++ * greenScale) >> 8;
+ _currentPalette[i * 3 + 2] = (*palptr++ * blueScale) >> 8;
+ }
- if (_game.heversion >= 90 || _game.version == 8) {
- palptr = _darkenPalette;
+ for (int i = startColor; i <= endColor; ++i) {
+ // Colors 33 (17+16) and 65 (17+32) will never get changed. For
+ // more information about these check setAmigaPaletteFromPtr.
+ if (i >= 16 && i < 48 && i != 33) {
+ remappedRoomColors = true;
+ _amigaPalette[(i - 16) * 3 + 0] = _currentPalette[i * 3 + 0] >> 4;
+ _amigaPalette[(i - 16) * 3 + 1] = _currentPalette[i * 3 + 1] >> 4;
+ _amigaPalette[(i - 16) * 3 + 2] = _currentPalette[i * 3 + 2] >> 4;
+ } else if (i >= 48 && i < 80 && i != 65) {
+ //remappedVerbColors = true;
+ _amigaPalette[(i - 16) * 3 + 0] = _currentPalette[i * 3 + 0] >> 4;
+ _amigaPalette[(i - 16) * 3 + 1] = _currentPalette[i * 3 + 1] >> 4;
+ _amigaPalette[(i - 16) * 3 + 2] = _currentPalette[i * 3 + 2] >> 4;
+ }
+ }
+
+ for (int i = 0; i < 256; ++i) {
+ if (i >= 16 && i < _amigaFirstUsedColor)
+ continue;
+
+ bool inRange = (startColor <= i && i <= endColor);
+ int idx = _roomPalette[i] + 16;
+ bool mappedInRange = (startColor <= idx && idx <= endColor);
+
+ if (inRange != mappedInRange || (remappedRoomColors && cycleFlag))
+ mapRoomPalette(i);
+ }
+
+ setDirtyColors(startColor, endColor);
+ } else {
+ int max;
+ if (_game.version >= 5 && _game.version <= 6 && _game.heversion <= 60) {
+ max = 252;
} else {
- palptr = getPalettePtr(_curPalIndex, _roomResource);
+ max = 255;
}
- for (j = startColor; j <= endColor; j++) {
- idx = (_game.heversion == 70) ? _HEV7ActorPalette[j] : j;
- cptr = palptr + idx * 3;
- if (_game.heversion == 70)
- setDirtyColors(idx, idx);
+ if (startColor <= endColor) {
+ const byte *cptr;
+ const byte *palptr;
+ int color, idx, j;
- // Original FOA Amiga version skips these colors
- // Fixes bug #1206994: "FOA AMIGA: Black cursor and text in Dig Site"
- if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
- if (j < 16) {
- cptr += 3;
- continue;
- }
+ if (_game.heversion >= 90 || _game.version == 8) {
+ palptr = _darkenPalette;
+ } else {
+ palptr = getPalettePtr(_curPalIndex, _roomResource);
}
-
- color = *cptr++;
- color = color * redScale / 0xFF;
- if (color > max)
- color = max;
- _currentPalette[idx * 3 + 0] = color;
-
- color = *cptr++;
- color = color * greenScale / 0xFF;
- if (color > max)
- color = max;
- _currentPalette[idx * 3 + 1] = color;
-
- color = *cptr++;
- color = color * blueScale / 0xFF;
- if (color > max)
- color = max;
- _currentPalette[idx * 3 + 2] = color;
-
- if (_game.features & GF_16BIT_COLOR)
- _16BitPalette[idx] = get16BitColor(_currentPalette[idx * 3 + 0], _currentPalette[idx * 3 + 1], _currentPalette[idx * 3 + 2]);
+ for (j = startColor; j <= endColor; j++) {
+ idx = (_game.heversion == 70) ? _HEV7ActorPalette[j] : j;
+ cptr = palptr + idx * 3;
+
+ if (_game.heversion == 70)
+ setDirtyColors(idx, idx);
+
+ color = *cptr++;
+ color = color * redScale / 0xFF;
+ if (color > max)
+ color = max;
+ _currentPalette[idx * 3 + 0] = color;
+
+ color = *cptr++;
+ color = color * greenScale / 0xFF;
+ if (color > max)
+ color = max;
+ _currentPalette[idx * 3 + 1] = color;
+
+ color = *cptr++;
+ color = color * blueScale / 0xFF;
+ if (color > max)
+ color = max;
+ _currentPalette[idx * 3 + 2] = color;
+
+ if (_game.features & GF_16BIT_COLOR)
+ _16BitPalette[idx] = get16BitColor(_currentPalette[idx * 3 + 0], _currentPalette[idx * 3 + 1], _currentPalette[idx * 3 + 2]);
+ }
+ if (_game.heversion != 70)
+ setDirtyColors(startColor, endColor);
}
- if (_game.heversion != 70)
- setDirtyColors(startColor, endColor);
}
}
@@ -995,6 +1221,41 @@ void ScummEngine::setPalColor(int idx, int r, int g, int b) {
_darkenPalette[idx * 3 + 2] = b;
}
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ // Colors 33 (17+16) and 65 (17+32) will never get changed. For
+ // more information about these check setAmigaPaletteFromPtr.
+ if (idx < 16 || idx >= _amigaFirstUsedColor) {
+ mapRoomPalette(idx);
+ mapVerbPalette(idx);
+ } else if (idx >= 16 && idx < 48 && idx != 33) {
+ _amigaPalette[(idx - 16) * 3 + 0] = _currentPalette[idx * 3 + 0] >> 4;
+ _amigaPalette[(idx - 16) * 3 + 1] = _currentPalette[idx * 3 + 1] >> 4;
+ _amigaPalette[(idx - 16) * 3 + 2] = _currentPalette[idx * 3 + 2] >> 4;
+
+ for (int i = 0; i < 256; ++i) {
+ if (i >= 16 && i < _amigaFirstUsedColor)
+ continue;
+
+ if (idx - 16 == _roomPalette[i])
+ mapRoomPalette(i);
+ }
+ } else if (idx >= 48 && idx < 80 && idx != 65) {
+ _amigaPalette[(idx - 16) * 3 + 0] = _currentPalette[idx * 3 + 0] >> 4;
+ _amigaPalette[(idx - 16) * 3 + 1] = _currentPalette[idx * 3 + 1] >> 4;
+ _amigaPalette[(idx - 16) * 3 + 2] = _currentPalette[idx * 3 + 2] >> 4;
+
+ for (int i = 0; i < 256; ++i) {
+ if (i >= 16 && i < _amigaFirstUsedColor)
+ continue;
+
+ // We do - 16 instead of - 48 like the original, since our
+ // verb palette map is using [32, 63] instead of [0, 31].
+ if (idx - 16 == _verbPalette[i])
+ mapVerbPalette(i);
+ }
+ }
+ }
+
if (_game.features & GF_16BIT_COLOR)
_16BitPalette[idx] = get16BitColor(r, g, b);
@@ -1014,6 +1275,8 @@ void ScummEngine::setCurrentPalette(int palindex) {
towns_setPaletteFromPtr(pals);
#endif
#endif
+ } else if (_game.id == GID_INDY4 && _game.platform == Common::kPlatformAmiga) {
+ setAmigaPaletteFromPtr(pals);
} else {
setPaletteFromPtr(pals);
}
@@ -1069,42 +1332,74 @@ void ScummEngine::updatePalette() {
if (_palDirtyMax == -1)
return;
- bool noir_mode = (_game.id == GID_SAMNMAX && readVar(0x8000));
- int first = _palDirtyMin;
- int num = _palDirtyMax - first + 1;
- int i;
-
byte palette_colors[3 * 256];
byte *p = palette_colors;
+ int first;
+ int num;
- for (i = _palDirtyMin; i <= _palDirtyMax; i++) {
- byte *data;
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ // Indy4 Amiga has a special palette handling scheme
+ first = 0;
+ num = 64;
- if (_game.features & GF_SMALL_HEADER && _game.version > 2)
- data = _currentPalette + _shadowPalette[i] * 3;
- else
- data = _currentPalette + i * 3;
+ for (int i = 0; i < 64; ++i) {
+ byte *data;
- // Sam & Max film noir mode. Convert the colors to grayscale
- // before uploading them to the backend.
+ if (i < 32)
+ data = _amigaPalette + _shadowPalette[i] * 3;
+ else
+ data = _amigaPalette + i * 3;
- if (noir_mode) {
- int r, g, b;
- byte brightness;
+ *p++ = data[0] * 255 / 15;
+ *p++ = data[1] * 255 / 15;
+ *p++ = data[2] * 255 / 15;
+ }
- r = data[0];
- g = data[1];
- b = data[2];
+ // Setup colors for the mouse cursor
+ // Color values taken from Indy4 DOS
+ static const uint8 mouseCursorPalette[] = {
+ 255, 255, 255,
+ 171, 171, 171,
+ 87, 87, 87
+ };
- brightness = (byte)((0.299 * r + 0.587 * g + 0.114 * b) + 0.5);
+ _system->getPaletteManager()->setPalette(mouseCursorPalette, 252, 3);
+ } else {
+ bool noir_mode = (_game.id == GID_SAMNMAX && readVar(0x8000));
+ int i;
- *p++ = brightness;
- *p++ = brightness;
- *p++ = brightness;
- } else {
- *p++ = data[0];
- *p++ = data[1];
- *p++ = data[2];
+ first = _palDirtyMin;
+ num = _palDirtyMax - first + 1;
+
+ for (i = _palDirtyMin; i <= _palDirtyMax; i++) {
+ byte *data;
+
+ if (_game.features & GF_SMALL_HEADER && _game.version > 2)
+ data = _currentPalette + _shadowPalette[i] * 3;
+ else
+ data = _currentPalette + i * 3;
+
+ // Sam & Max film noir mode. Convert the colors to grayscale
+ // before uploading them to the backend.
+
+ if (noir_mode) {
+ int r, g, b;
+ byte brightness;
+
+ r = data[0];
+ g = data[1];
+ b = data[2];
+
+ brightness = (byte)((0.299 * r + 0.587 * g + 0.114 * b) + 0.5);
+
+ *p++ = brightness;
+ *p++ = brightness;
+ *p++ = brightness;
+ } else {
+ *p++ = data[0];
+ *p++ = data[1];
+ *p++ = data[2];
+ }
}
}
@@ -1115,7 +1410,7 @@ void ScummEngine::updatePalette() {
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
if (_game.platform == Common::kPlatformFMTowns) {
p = palette_colors;
- for (i = first; i < first + num; ++i) {
+ for (int i = first; i < first + num; ++i) {
_16BitPalette[i] = get16BitColor(p[0], p[1], p[2]);
p += 3;
}
diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/player_towns.cpp
index dd7630d370..f6f493a1e1 100644
--- a/engines/scumm/player_towns.cpp
+++ b/engines/scumm/player_towns.cpp
@@ -242,7 +242,8 @@ void Player_Towns_v1::startSound(int sound) {
}
velocity = velocity ? velocity >> 2 : ptr[14] >> 1;
- playPcmTrack(sound, ptr + 6, velocity, 64, note ? note : ptr[50], READ_LE_UINT16(ptr + 10));
+ uint16 len = READ_LE_UINT16(ptr) + 2;
+ playPcmTrack(sound, ptr + 6, velocity, 64, note ? note : (len > 50 ? ptr[50] : 60), READ_LE_UINT16(ptr + 10));
} else if (type == 1) {
playEuphonyTrack(sound, ptr + 6);
diff --git a/engines/scumm/player_v2.h b/engines/scumm/player_v2.h
index 14a0b9c1e0..d932585b8e 100644
--- a/engines/scumm/player_v2.h
+++ b/engines/scumm/player_v2.h
@@ -46,10 +46,7 @@ public:
virtual int getSoundStatus(int sound) const;
// AudioStream API
- int readBuffer(int16 *buffer, const int numSamples);
- bool isStereo() const { return true; }
- bool endOfData() const { return false; }
- int getRate() const { return _sampleRate; }
+ virtual int readBuffer(int16 *buffer, const int numSamples);
protected:
unsigned int _update_step;
diff --git a/engines/scumm/player_v2base.h b/engines/scumm/player_v2base.h
index 2f048070ad..eb9ed941ca 100644
--- a/engines/scumm/player_v2base.h
+++ b/engines/scumm/player_v2base.h
@@ -86,9 +86,9 @@ public:
return numSamples;
}
*/
- bool isStereo() const { return true; }
- bool endOfData() const { return false; }
- int getRate() const { return _sampleRate; }
+ virtual bool isStereo() const { return true; }
+ virtual bool endOfData() const { return false; }
+ virtual int getRate() const { return _sampleRate; }
protected:
enum {
diff --git a/engines/scumm/player_v2cms.cpp b/engines/scumm/player_v2cms.cpp
index 21e7f193b5..d4b21774ed 100644
--- a/engines/scumm/player_v2cms.cpp
+++ b/engines/scumm/player_v2cms.cpp
@@ -28,162 +28,49 @@
namespace Scumm {
-#define PROCESS_ATTACK 1
-#define PROCESS_RELEASE 2
-#define PROCESS_SUSTAIN 3
-#define PROCESS_DECAY 4
-#define PROCESS_VIBRATO 5
-
-#define CMS_RATE 22050
-
-static const byte freqTable[] = {
- 3, 10, 17, 24, 31, 38, 45, 51,
- 58, 65, 71, 77, 83, 90, 96, 102,
- 107, 113, 119, 125, 130, 136, 141, 146,
- 151, 157, 162, 167, 172, 177, 181, 186,
- 191, 195, 200, 204, 209, 213, 217, 221,
- 226, 230, 234, 238, 242, 246, 249, 253
-};
-
-/*static const byte amplTable[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0 %
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 10 %
- 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, // 20 %
- 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x20, // 30%
- 0x20, 0x20, 0x30, 0x30, 0x30, 0x30, 0x40, 0x40,
- 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x20, 0x20, // 40 %
- 0x30, 0x30, 0x40, 0x40, 0x40, 0x50, 0x50, 0x60,
- 0x00, 0x00, 0x10, 0x10, 0x20, 0x20, 0x30, 0x30, // 50%
- 0x40, 0x40, 0x50, 0x50, 0x60, 0x60, 0x70, 0x70,
- 0x00, 0x00, 0x10, 0x10, 0x20, 0x30, 0x30, 0x40, // 60 %
- 0x40, 0x50, 0x60, 0x60, 0x70, 0x70, 0x80, 0x90,
- 0x00, 0x00, 0x10, 0x20, 0x20, 0x30, 0x40, 0x40, // 70 %
- 0x50, 0x60, 0x70, 0x70, 0x80, 0x90, 0x90, 0xA0,
- 0x00, 0x00, 0x10, 0x20, 0x30, 0x40, 0x40, 0x50, // 80 %
- 0x60, 0x70, 0x80, 0x80, 0x90, 0xA0, 0xB0, 0xC0,
- 0x00, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, // 90 %
- 0x70, 0x80, 0x90, 0x90, 0xA0, 0xB0, 0xC0, 0xD0,
- 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, // 100 %
- 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0
-};*/
-
-static const byte octaveTable[] = {
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
- 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07,
- 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B,
- 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03,
- 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07,
- 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0B,
- 0x02, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03,
- 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07,
- 0x02, 0x08, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B,
- 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03,
- 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07,
- 0x03, 0x08, 0x03, 0x09, 0x03, 0x0A, 0x03, 0x0B,
- 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03,
- 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07,
- 0x04, 0x08, 0x04, 0x09, 0x04, 0x0A, 0x04, 0x0B,
- 0x05, 0x00, 0x05, 0x01, 0x05, 0x02, 0x05, 0x03,
- 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x07,
- 0x05, 0x08, 0x05, 0x09, 0x05, 0x0A, 0x05, 0x0B,
- 0x06, 0x00, 0x06, 0x01, 0x06, 0x02, 0x06, 0x03,
- 0x06, 0x04, 0x06, 0x05, 0x06, 0x06, 0x06, 0x07,
- 0x06, 0x08, 0x06, 0x09, 0x06, 0x0A, 0x06, 0x0B,
- 0x07, 0x00, 0x07, 0x01, 0x07, 0x02, 0x07, 0x03,
- 0x07, 0x04, 0x07, 0x05, 0x07, 0x06, 0x07, 0x07,
- 0x07, 0x08, 0x07, 0x09, 0x07, 0x0A, 0x07, 0x0B,
- 0x08, 0x00, 0x08, 0x01, 0x08, 0x02, 0x08, 0x03,
- 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x08, 0x07,
- 0x08, 0x08, 0x08, 0x09, 0x08, 0x0A, 0x08, 0x0B,
- 0x09, 0x00, 0x09, 0x01, 0x09, 0x02, 0x09, 0x03,
- 0x09, 0x04, 0x09, 0x05, 0x09, 0x06, 0x09, 0x07,
- 0x09, 0x08, 0x09, 0x09, 0x09, 0x0A, 0x09, 0x0B,
- 0x0A, 0x00, 0x0A, 0x01, 0x0A, 0x02, 0x0A, 0x03,
- 0x0A, 0x04, 0x0A, 0x05, 0x0A, 0x06, 0x0A, 0x07,
- 0x0A, 0x08, 0x0A, 0x09, 0x0A, 0x0A, 0x0A, 0x0B
-};
-
-static const byte attackRate[] = {
- 0, 2, 4, 7, 14, 26, 48, 82,
- 128, 144, 160, 176, 192, 208, 224, 255
-};
-
-static const byte decayRate[] = {
- 0, 1, 2, 3, 4, 6, 12, 24,
- 48, 96, 192, 215, 255, 255, 255, 255
-};
-
-static const byte sustainRate[] = {
- 255, 180, 128, 96, 80, 64, 56, 48,
- 42, 36, 32, 28, 24, 20, 16, 0
-};
-
-static const byte releaseRate[] = {
- 0, 1, 2, 4, 6, 9, 14, 22,
- 36, 56, 80, 100, 120, 140, 160, 255
-};
-
-static const byte volumeTable[] = {
- 0x00, 0x10, 0x10, 0x11, 0x11, 0x21, 0x22, 0x22,
- 0x33, 0x44, 0x55, 0x66, 0x88, 0xAA, 0xCC, 0xFF
-};
-
Player_V2CMS::Player_V2CMS(ScummEngine *scumm, Audio::Mixer *mixer)
- : Player_V2Base(scumm, mixer, true) {
- int i;
-
+ : Player_V2Base(scumm, mixer, true), _cmsVoicesBase(), _cmsVoices(),
+ _cmsChips(), _midiDelay(0), _octaveMask(0), _looping(0), _tempo(0),
+ _tempoSum(0), _midiData(0), _midiSongBegin(0), _musicTimer(0),
+ _musicTimerTicks(0), _voiceTimer(0), _loadedMidiSong(0),
+ _outputTableReady(0), _midiChannel(), _midiChannelUse() {
setMusicVolume(255);
- memset(_cmsVoicesBase, 0, sizeof(Voice)*16);
- memset(_cmsVoices, 0, sizeof(Voice2)*8);
- memset(_cmsChips, 0, sizeof(MusicChip)*2);
- _midiDelay = _octaveMask = _looping = _tempo = 0;
- _midiData = _midiSongBegin = 0;
- _loadedMidiSong = 0;
- memset(_midiChannel, 0, sizeof(Voice2*)*16);
- memset(_midiChannelUse, 0, sizeof(byte)*16);
-
- _cmsVoices[0].amplitudeOutput = &(_cmsChips[0].ampl[0]);
- _cmsVoices[0].freqOutput = &(_cmsChips[0].freq[0]);
- _cmsVoices[0].octaveOutput = &(_cmsChips[0].octave[0]);
- _cmsVoices[1].amplitudeOutput = &(_cmsChips[0].ampl[1]);
- _cmsVoices[1].freqOutput = &(_cmsChips[0].freq[1]);
- _cmsVoices[1].octaveOutput = &(_cmsChips[0].octave[0]);
- _cmsVoices[2].amplitudeOutput = &(_cmsChips[0].ampl[2]);
- _cmsVoices[2].freqOutput = &(_cmsChips[0].freq[2]);
- _cmsVoices[2].octaveOutput = &(_cmsChips[0].octave[1]);
- _cmsVoices[3].amplitudeOutput = &(_cmsChips[0].ampl[3]);
- _cmsVoices[3].freqOutput = &(_cmsChips[0].freq[3]);
- _cmsVoices[3].octaveOutput = &(_cmsChips[0].octave[1]);
- _cmsVoices[4].amplitudeOutput = &(_cmsChips[1].ampl[0]);
- _cmsVoices[4].freqOutput = &(_cmsChips[1].freq[0]);
- _cmsVoices[4].octaveOutput = &(_cmsChips[1].octave[0]);
- _cmsVoices[5].amplitudeOutput = &(_cmsChips[1].ampl[1]);
- _cmsVoices[5].freqOutput = &(_cmsChips[1].freq[1]);
- _cmsVoices[5].octaveOutput = &(_cmsChips[1].octave[0]);
- _cmsVoices[6].amplitudeOutput = &(_cmsChips[1].ampl[2]);
- _cmsVoices[6].freqOutput = &(_cmsChips[1].freq[2]);
- _cmsVoices[6].octaveOutput = &(_cmsChips[1].octave[1]);
- _cmsVoices[7].amplitudeOutput = &(_cmsChips[1].ampl[3]);
- _cmsVoices[7].freqOutput = &(_cmsChips[1].freq[3]);
- _cmsVoices[7].octaveOutput = &(_cmsChips[1].octave[1]);
+ memset(_sfxFreq, 0xFF, sizeof(_sfxFreq));
+ memset(_sfxAmpl, 0x00, sizeof(_sfxAmpl));
+ memset(_sfxOctave, 0x66, sizeof(_sfxOctave));
+
+ _cmsVoices[0].amplitudeOutput = &_cmsChips[0].ampl[0];
+ _cmsVoices[0].freqOutput = &_cmsChips[0].freq[0];
+ _cmsVoices[0].octaveOutput = &_cmsChips[0].octave[0];
+ _cmsVoices[1].amplitudeOutput = &_cmsChips[0].ampl[1];
+ _cmsVoices[1].freqOutput = &_cmsChips[0].freq[1];
+ _cmsVoices[1].octaveOutput = &_cmsChips[0].octave[0];
+ _cmsVoices[2].amplitudeOutput = &_cmsChips[0].ampl[2];
+ _cmsVoices[2].freqOutput = &_cmsChips[0].freq[2];
+ _cmsVoices[2].octaveOutput = &_cmsChips[0].octave[1];
+ _cmsVoices[3].amplitudeOutput = &_cmsChips[0].ampl[3];
+ _cmsVoices[3].freqOutput = &_cmsChips[0].freq[3];
+ _cmsVoices[3].octaveOutput = &_cmsChips[0].octave[1];
+ _cmsVoices[4].amplitudeOutput = &_cmsChips[1].ampl[0];
+ _cmsVoices[4].freqOutput = &_cmsChips[1].freq[0];
+ _cmsVoices[4].octaveOutput = &_cmsChips[1].octave[0];
+ _cmsVoices[5].amplitudeOutput = &_cmsChips[1].ampl[1];
+ _cmsVoices[5].freqOutput = &_cmsChips[1].freq[1];
+ _cmsVoices[5].octaveOutput = &_cmsChips[1].octave[0];
+ _cmsVoices[6].amplitudeOutput = &_cmsChips[1].ampl[2];
+ _cmsVoices[6].freqOutput = &_cmsChips[1].freq[2];
+ _cmsVoices[6].octaveOutput = &_cmsChips[1].octave[1];
+ _cmsVoices[7].amplitudeOutput = &_cmsChips[1].ampl[3];
+ _cmsVoices[7].freqOutput = &_cmsChips[1].freq[3];
+ _cmsVoices[7].octaveOutput = &_cmsChips[1].octave[1];
// inits the CMS Emulator like in the original
_cmsEmu = new CMSEmulator(_sampleRate);
- static const byte cmsInitData[13*2] = {
- 0x1C, 0x02,
- 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00,
- 0x14, 0x3F, 0x15, 0x00, 0x16, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1C, 0x01
- };
-
- i = 0;
- for (int cmsPort = 0x220; i < 2; cmsPort += 2, ++i) {
+ for (int i = 0, cmsPort = 0x220; i < 2; cmsPort += 2, ++i) {
for (int off = 0; off < 13; ++off) {
- _cmsEmu->portWrite(cmsPort+1, cmsInitData[off*2]);
- _cmsEmu->portWrite(cmsPort, cmsInitData[off*2+1]);
+ _cmsEmu->portWrite(cmsPort+1, _cmsInitData[off*2]);
+ _cmsEmu->portWrite(cmsPort, _cmsInitData[off*2+1]);
}
}
@@ -200,6 +87,10 @@ Player_V2CMS::~Player_V2CMS() {
void Player_V2CMS::setMusicVolume(int vol) {
}
+int Player_V2CMS::getMusicTimer() {
+ return _midiData ? _musicTimer : Player_V2Base::getMusicTimer();
+}
+
void Player_V2CMS::stopAllSounds() {
Common::StackLock lock(_mutex);
@@ -211,6 +102,7 @@ void Player_V2CMS::stopAllSounds() {
_midiData = 0;
_midiSongBegin = 0;
_midiDelay = 0;
+ _musicTimer = _musicTimerTicks = 0;
offAllChannels();
}
@@ -244,6 +136,7 @@ void Player_V2CMS::startSound(int nr) {
assert(data);
if (data[6] == 0x80) {
+ _musicTimer = _musicTimerTicks = 0;
loadMidiData(data, nr);
} else {
int cprio = _current_data ? *(_current_data + _header_len) : 0;
@@ -282,7 +175,8 @@ void Player_V2CMS::startSound(int nr) {
}
void Player_V2CMS::loadMidiData(byte *data, int sound) {
- memset(_midiChannelUse, 0, sizeof(byte)*16);
+ memset(_midiChannelUse, 0, sizeof(_midiChannelUse));
+ memset(_midiChannel, 0, sizeof(_midiChannel));
_tempo = data[7];
_looping = data[8];
@@ -299,11 +193,11 @@ void Player_V2CMS::loadMidiData(byte *data, int sound) {
Voice *voiceDef = &_cmsVoicesBase[channel];
byte attackDecay = voice2[10];
- voiceDef->attack = attackRate[attackDecay >> 4];
- voiceDef->decay = decayRate[attackDecay & 0x0F];
+ voiceDef->attack = _attackRate[attackDecay >> 4];
+ voiceDef->decay = _decayRate[attackDecay & 0x0F];
byte sustainRelease = voice2[11];
- voiceDef->sustain = sustainRate[sustainRelease >> 4];
- voiceDef->release = releaseRate[sustainRelease & 0x0F];
+ voiceDef->sustain = _sustainRate[sustainRelease >> 4];
+ voiceDef->release = _releaseRate[sustainRelease & 0x0F];
if (voice2[3] & 0x40) {
voiceDef->vibrato = 0x0301;
@@ -331,12 +225,10 @@ void Player_V2CMS::loadMidiData(byte *data, int sound) {
}
}
- for (int i = 0, channel = 0; i < 8; ++i, channel += 2) {
+ for (int i = 0; i < 8; ++i) {
_cmsVoices[i].chanNumber = 0xFF;
_cmsVoices[i].curVolume = 0;
_cmsVoices[i].nextVoice = 0;
-
- _midiChannel[channel] = 0;
}
_midiDelay = 0;
@@ -351,11 +243,17 @@ int Player_V2CMS::getSoundStatus(int nr) const {
return _current_nr == nr || _next_nr == nr || _loadedMidiSong == nr;
}
-void Player_V2CMS::processMidiData(uint ticks) {
+void Player_V2CMS::processMidiData() {
byte *currentData = _midiData;
byte command = 0x00;
int16 temp = 0;
+ ++_musicTimerTicks;
+ if (_musicTimerTicks > 60) {
+ _musicTimerTicks = 0;
+ ++_musicTimer;
+ }
+
if (!_midiDelay) {
while (true) {
if ((command = *currentData++) == 0xFF) {
@@ -365,6 +263,8 @@ void Player_V2CMS::processMidiData(uint ticks) {
continue;
}
_midiData = _midiSongBegin = 0;
+ _midiDelay = 0;
+ _loadedMidiSong = 0;
offAllChannels();
return;
} else {
@@ -400,7 +300,7 @@ void Player_V2CMS::processMidiData(uint ticks) {
_midiDelay = temp;
}
- _midiDelay -= ticks;
+ --_midiDelay;
if (_midiDelay < 0)
_midiDelay = 0;
@@ -415,27 +315,21 @@ int Player_V2CMS::readBuffer(int16 *buffer, const int numSamples) {
// maybe this needs a complete rewrite
do {
- if (_midiData) {
- --_clkFrequenz;
- if (!(_clkFrequenz & 0x01)) {
- playVoice();
- }
-
- _tempoSum += _tempo;
- // FIXME: _tempoSum is declared as char; on some systems char is unsigned.
- // E.g. on OS X. Hence the following check is always false.
- // Moral of the story: Use uint8, int8 or any of the other types provided by
- // ScummVM if you want to ensure signedness and number of available bits.
- if (_tempoSum < 0) {
- // this have to be called in the same rate as in the original (I think)
- processMidiData(1);
+ if (!(_next_tick >> FIXP_SHIFT)) {
+ if (_midiData) {
+ --_voiceTimer;
+ if (!(_voiceTimer & 0x01))
+ playVoice();
+
+ int newTempoSum = _tempo + _tempoSum;
+ _tempoSum = newTempoSum & 0xFF;
+ if (newTempoSum > 0xFF)
+ processMidiData();
+ } else {
+ nextTick();
+ play();
}
- }
-
- if (!(_next_tick >> FIXP_SHIFT) && !_midiData) {
_next_tick += _tick_len;
- nextTick();
- play();
}
step = len;
@@ -456,99 +350,95 @@ void Player_V2CMS::playVoice() {
}
_octaveMask = 0xF0;
- Voice2 *voice =0;
+ Voice2 *voice = 0;
for (int i = 0; i < 8; ++i) {
voice = &_cmsVoices[i];
_octaveMask = ~_octaveMask;
if (voice->chanNumber != 0xFF) {
processChannel(voice);
- continue;
- }
-
- if (!voice->curVolume) {
- *(voice->amplitudeOutput) = 0;
- }
+ } else {
+ if (!voice->curVolume) {
+ *(voice->amplitudeOutput) = 0;
+ }
- int volume = voice->curVolume - voice->releaseRate;
- voice->curVolume = volume;
+ int volume = voice->curVolume - voice->releaseRate;
+ if (volume < 0)
+ volume = 0;
- if (volume < 0) {
- volume = voice->curVolume = 0;
+ voice->curVolume = volume;
+ *(voice->amplitudeOutput) = ((volume >> 4) | (volume & 0xF0)) & voice->channel;
+ ++_outputTableReady;
}
-
- *(voice->amplitudeOutput) = ((volume >> 4) | (volume & 0xF0)) & voice->channel;
- ++_outputTableReady;
}
}
void Player_V2CMS::processChannel(Voice2 *channel) {
++_outputTableReady;
switch (channel->nextProcessState) {
- case PROCESS_RELEASE:
- processRelease(channel);
- break;
-
- case PROCESS_ATTACK:
+ case Voice2::kEnvelopeAttack:
processAttack(channel);
break;
- case PROCESS_DECAY:
+ case Voice2::kEnvelopeDecay:
processDecay(channel);
break;
- case PROCESS_SUSTAIN:
+ case Voice2::kEnvelopeSustain:
processSustain(channel);
break;
- case PROCESS_VIBRATO:
- processVibrato(channel);
- break;
-
- default:
+ case Voice2::kEnvelopeRelease:
+ processRelease(channel);
break;
}
}
void Player_V2CMS::processRelease(Voice2 *channel) {
- channel->curVolume -= channel->releaseRate;
- if (channel->curVolume < 0)
- channel->curVolume = 0;
+ int newVolume = channel->curVolume - channel->releaseRate;
+ if (newVolume < 0)
+ newVolume = 0;
+
+ channel->curVolume = newVolume;
processVibrato(channel);
}
void Player_V2CMS::processAttack(Voice2 *channel) {
- channel->curVolume += channel->attackRate;
- if (channel->curVolume >= 0) {
- if (channel->curVolume <= channel->maxAmpl)
- return processVibrato(channel);
+ int newVolume = channel->curVolume + channel->attackRate;
+ if (newVolume > channel->maxAmpl) {
+ channel->curVolume = channel->maxAmpl;
+ channel->nextProcessState = Voice2::kEnvelopeDecay;
+ } else {
+ channel->curVolume = newVolume;
}
- channel->curVolume = channel->maxAmpl;
- channel->nextProcessState = PROCESS_DECAY;
+
processVibrato(channel);
}
void Player_V2CMS::processDecay(Voice2 *channel) {
- channel->curVolume -= channel->decayRate;
- if (channel->curVolume >= 0) {
- if (channel->curVolume > channel->sustainRate)
- return processVibrato(channel);
+ int newVolume = channel->curVolume - channel->decayRate;
+ if (newVolume <= channel->sustainRate) {
+ channel->curVolume = channel->sustainRate;
+ channel->nextProcessState = Voice2::kEnvelopeSustain;
+ } else {
+ channel->curVolume = newVolume;
}
- channel->curVolume = channel->sustainRate;
- channel->nextProcessState = PROCESS_SUSTAIN;
+
processVibrato(channel);
}
void Player_V2CMS::processSustain(Voice2 *channel) {
if (channel->unkVibratoRate) {
- int volume = (int)channel->curVolume + (int)channel->unkRate;
+ int16 volume = channel->curVolume + channel->unkRate;
if (volume & 0xFF00) {
- volume = ((~volume) >> 8) & 0xFF;
+ volume = int8(volume >> 8);
+ volume = -volume;
}
+
channel->curVolume = volume;
- --(channel->unkCount);
+ --channel->unkCount;
if (!channel->unkCount) {
- channel->unkRate = ~(channel->unkRate);
+ channel->unkRate = -channel->unkRate;
channel->unkCount = (channel->unkVibratoDepth & 0x0F) << 1;
}
}
@@ -557,12 +447,13 @@ void Player_V2CMS::processSustain(Voice2 *channel) {
void Player_V2CMS::processVibrato(Voice2 *channel) {
if (channel->vibratoRate) {
- uint16 temp = channel->curFreq + channel->curVibratoRate;
+ int16 temp = channel->curFreq + channel->curVibratoRate;
channel->curOctave += (temp & 0xFF00) >> 8;
channel->curFreq = temp & 0xFF;
- --(channel->curVibratoUnk);
+
+ --channel->curVibratoUnk;
if (!channel->curVibratoUnk) {
- channel->curVibratoRate = ~(channel->curVibratoRate);
+ channel->curVibratoRate = -channel->curVibratoRate;
channel->curVibratoUnk = (channel->vibratoDepth & 0x0F) << 1;
}
}
@@ -572,25 +463,16 @@ void Player_V2CMS::processVibrato(Voice2 *channel) {
output = channel->freqOutput;
*output = channel->curFreq;
output = channel->octaveOutput;
- *output = ((((channel->curOctave >> 4) | (channel->curOctave & 0x0F)) & _octaveMask) | ((~_octaveMask) & *output));
+ *output = (((channel->curOctave << 4) | (channel->curOctave & 0x0F)) & _octaveMask) | ((~_octaveMask) & *output);
}
void Player_V2CMS::offAllChannels() {
- warning("offAllChannels STUB");
-/*
- // after using this sound can not be played anymore (since it would deinit the emulator)
- static const byte cmsOffData[10*2] = {
- 0x1C, 0x02,
- 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00,
- 0x14, 0x3F, 0x15, 0x00, 0x16, 0x00
- };
-
for (int cmsPort = 0x220, i = 0; i < 2; cmsPort += 2, ++i) {
- for (int off = 0; off < 10; ++off) {
- _cmsEmu->portWrite(cmsPort+1, cmsOffData[off*2]);
- _cmsEmu->portWrite(cmsPort, cmsOffData[off*2+1]);
+ for (int off = 1; off <= 10; ++off) {
+ _cmsEmu->portWrite(cmsPort+1, _cmsInitData[off*2]);
+ _cmsEmu->portWrite(cmsPort, _cmsInitData[off*2+1]);
}
- }*/
+ }
}
Player_V2CMS::Voice2 *Player_V2CMS::getFreeVoice() {
@@ -637,8 +519,10 @@ void Player_V2CMS::playNote(byte *&data) {
freeVoice->sustainRate = voice->sustain;
freeVoice->releaseRate = voice->release;
freeVoice->octaveAdd = voice->octadd;
- freeVoice->vibratoRate = freeVoice->curVibratoRate = voice->vibrato;
- freeVoice->unkVibratoRate = freeVoice->unkRate = voice->vibrato2;
+ freeVoice->vibratoRate = freeVoice->curVibratoRate = voice->vibrato & 0xFF;
+ freeVoice->vibratoDepth = freeVoice->curVibratoUnk = voice->vibrato >> 8;
+ freeVoice->unkVibratoRate = freeVoice->unkRate = voice->vibrato2 & 0xFF;
+ freeVoice->unkVibratoDepth = freeVoice->unkCount = voice->vibrato2 >> 8;
freeVoice->maxAmpl = 0xFF;
uint8 rate = freeVoice->attackRate;
@@ -650,7 +534,14 @@ void Player_V2CMS::playNote(byte *&data) {
rate -= freeVoice->attackRate;
freeVoice->curVolume = rate;
freeVoice->playingNote = *data;
- int octave = octaveTable[(*data + 3) << 1] + freeVoice->octaveAdd - 3;
+
+ int effectiveNote = freeVoice->playingNote + 3;
+ if (effectiveNote < 0 || effectiveNote >= ARRAYSIZE(_midiNotes)) {
+ warning("Player_V2CMS::playNote: Note %d out of bounds", effectiveNote);
+ effectiveNote = CLIP<int>(effectiveNote, 0, ARRAYSIZE(_midiNotes) - 1);
+ }
+
+ int octave = _midiNotes[effectiveNote].baseOctave + freeVoice->octaveAdd - 3;
if (octave < 0)
octave = 0;
if (octave > 7)
@@ -658,10 +549,10 @@ void Player_V2CMS::playNote(byte *&data) {
if (!octave)
++octave;
freeVoice->curOctave = octave;
- freeVoice->curFreq = freqTable[volume << 2];
+ freeVoice->curFreq = _midiNotes[effectiveNote].frequency;
freeVoice->curVolume = 0;
- freeVoice->nextProcessState = PROCESS_ATTACK;
- if (_lastMidiCommand & 1)
+ freeVoice->nextProcessState = Voice2::kEnvelopeAttack;
+ if (!(_lastMidiCommand & 1))
freeVoice->channel = 0xF0;
else
freeVoice->channel = 0x0F;
@@ -672,35 +563,27 @@ void Player_V2CMS::playNote(byte *&data) {
Player_V2CMS::Voice2 *Player_V2CMS::getPlayVoice(byte param) {
byte channelNum = _lastMidiCommand & 0x0F;
- Voice2 *channel = _midiChannel[channelNum];
+ Voice2 *curVoice = _midiChannel[channelNum];
- if (channel) {
- Voice2 *backUp = 0;
+ if (curVoice) {
+ Voice2 *prevVoice = 0;
while (true) {
- if (channel->playingNote == param)
+ if (curVoice->playingNote == param)
break;
- backUp = channel;
- channel = channel->nextVoice;
- if (!channel)
+ prevVoice = curVoice;
+ curVoice = curVoice->nextVoice;
+ if (!curVoice)
return 0;
}
- Voice2 *backUp2 = channel->nextVoice;
- {
- Voice2 *temp = backUp;
- backUp = channel;
- channel = temp;
- }
- if (channel) {
- channel->nextVoice = backUp2;
- } else {
- _midiChannel[channelNum] = backUp2;
- }
- channel = backUp;
+ if (prevVoice)
+ prevVoice->nextVoice = curVoice->nextVoice;
+ else
+ _midiChannel[channelNum] = curVoice->nextVoice;
}
- return channel;
+ return curVoice;
}
void Player_V2CMS::clearNote(byte *&data) {
@@ -708,22 +591,17 @@ void Player_V2CMS::clearNote(byte *&data) {
if (voice) {
voice->chanNumber = 0xFF;
voice->nextVoice = 0;
- voice->nextProcessState = PROCESS_RELEASE;
+ voice->nextProcessState = Voice2::kEnvelopeRelease;
}
data += 2;
}
void Player_V2CMS::play() {
_octaveMask = 0xF0;
- channel_data *chan = &(_channels[0].d);
+ channel_data *chan = &_channels[0].d;
- static byte volumeReg[4] = { 0x00, 0x00, 0x00, 0x00 };
- static byte octaveReg[4] = { 0x66, 0x66, 0x66, 0x66 };
- static byte freqReg[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
+ byte noiseGen = 3;
- static byte freqEnable = 0x3E;
- static byte noiseEnable = 0x01;
- static byte noiseGen = 0x02;
for (int i = 1; i <= 4; ++i) {
if (chan->time_left) {
uint16 freq = chan->freq;
@@ -733,8 +611,8 @@ void Player_V2CMS::play() {
noiseGen = freq & 0xFF;
} else {
noiseGen = 3;
- freqReg[0] = freqReg[3];
- octaveReg[0] = (octaveReg[0] & 0xF0) | ((octaveReg[1] & 0xF0) >> 4);
+ _sfxFreq[0] = _sfxFreq[3];
+ _sfxOctave[0] = (_sfxOctave[0] & 0xF0) | ((_sfxOctave[1] & 0xF0) >> 4);
}
} else {
if (freq == 0) {
@@ -760,17 +638,18 @@ void Player_V2CMS::play() {
oct |= cmsOct;
oct &= _octaveMask;
- oct |= ((~_octaveMask) & octaveReg[((i & 3) >> 1)]);
- octaveReg[((i & 3) >> 1)] = oct;
+ oct |= (~_octaveMask) & _sfxOctave[(i & 3) >> 1];
+ _sfxOctave[(i & 3) >> 1] = oct;
- freq >>= -(cmsOct-9);
- freqReg[(i&3)] = (-(freq-511)) & 0xFF;
+ freq >>= -(cmsOct - 9);
+ _sfxFreq[i & 3] = (-(freq - 511)) & 0xFF;
}
- volumeReg[i & 3] = volumeTable[chan->volume >> 12];
+ _sfxAmpl[i & 3] = _volumeTable[chan->volume >> 12];
} else {
- volumeReg[i & 3] = 0;
+ _sfxAmpl[i & 3] = 0;
}
- chan = &(_channels[i].d);
+
+ chan = &_channels[i].d;
_octaveMask ^= 0xFF;
}
@@ -778,29 +657,29 @@ void Player_V2CMS::play() {
// the right channels amplitude is set
// with the low value the left channels amplitude
_cmsEmu->portWrite(0x221, 0);
- _cmsEmu->portWrite(0x220, volumeReg[0]);
+ _cmsEmu->portWrite(0x220, _sfxAmpl[0]);
_cmsEmu->portWrite(0x221, 1);
- _cmsEmu->portWrite(0x220, volumeReg[1]);
+ _cmsEmu->portWrite(0x220, _sfxAmpl[1]);
_cmsEmu->portWrite(0x221, 2);
- _cmsEmu->portWrite(0x220, volumeReg[2]);
+ _cmsEmu->portWrite(0x220, _sfxAmpl[2]);
_cmsEmu->portWrite(0x221, 3);
- _cmsEmu->portWrite(0x220, volumeReg[3]);
+ _cmsEmu->portWrite(0x220, _sfxAmpl[3]);
_cmsEmu->portWrite(0x221, 8);
- _cmsEmu->portWrite(0x220, freqReg[0]);
+ _cmsEmu->portWrite(0x220, _sfxFreq[0]);
_cmsEmu->portWrite(0x221, 9);
- _cmsEmu->portWrite(0x220, freqReg[1]);
+ _cmsEmu->portWrite(0x220, _sfxFreq[1]);
_cmsEmu->portWrite(0x221, 10);
- _cmsEmu->portWrite(0x220, freqReg[2]);
+ _cmsEmu->portWrite(0x220, _sfxFreq[2]);
_cmsEmu->portWrite(0x221, 11);
- _cmsEmu->portWrite(0x220, freqReg[3]);
+ _cmsEmu->portWrite(0x220, _sfxFreq[3]);
_cmsEmu->portWrite(0x221, 0x10);
- _cmsEmu->portWrite(0x220, octaveReg[0]);
+ _cmsEmu->portWrite(0x220, _sfxOctave[0]);
_cmsEmu->portWrite(0x221, 0x11);
- _cmsEmu->portWrite(0x220, octaveReg[1]);
+ _cmsEmu->portWrite(0x220, _sfxOctave[1]);
_cmsEmu->portWrite(0x221, 0x14);
- _cmsEmu->portWrite(0x220, freqEnable);
+ _cmsEmu->portWrite(0x220, 0x3E);
_cmsEmu->portWrite(0x221, 0x15);
- _cmsEmu->portWrite(0x220, noiseEnable);
+ _cmsEmu->portWrite(0x220, 0x01);
_cmsEmu->portWrite(0x221, 0x16);
_cmsEmu->portWrite(0x220, noiseGen);
}
@@ -838,4 +717,71 @@ void Player_V2CMS::playMusicChips(const MusicChip *table) {
} while ((cmsPort & 2) == 0);
}
+const Player_V2CMS::MidiNote Player_V2CMS::_midiNotes[132] = {
+ { 3, 0 }, { 31, 0 }, { 58, 0 }, { 83, 0 },
+ { 107, 0 }, { 130, 0 }, { 151, 0 }, { 172, 0 },
+ { 191, 0 }, { 209, 0 }, { 226, 0 }, { 242, 0 },
+ { 3, 1 }, { 31, 1 }, { 58, 1 }, { 83, 1 },
+ { 107, 1 }, { 130, 1 }, { 151, 1 }, { 172, 1 },
+ { 191, 1 }, { 209, 1 }, { 226, 1 }, { 242, 1 },
+ { 3, 2 }, { 31, 2 }, { 58, 2 }, { 83, 2 },
+ { 107, 2 }, { 130, 2 }, { 151, 2 }, { 172, 2 },
+ { 191, 2 }, { 209, 2 }, { 226, 2 }, { 242, 2 },
+ { 3, 3 }, { 31, 3 }, { 58, 3 }, { 83, 3 },
+ { 107, 3 }, { 130, 3 }, { 151, 3 }, { 172, 3 },
+ { 191, 3 }, { 209, 3 }, { 226, 3 }, { 242, 3 },
+ { 3, 4 }, { 31, 4 }, { 58, 4 }, { 83, 4 },
+ { 107, 4 }, { 130, 4 }, { 151, 4 }, { 172, 4 },
+ { 191, 4 }, { 209, 4 }, { 226, 4 }, { 242, 4 },
+ { 3, 5 }, { 31, 5 }, { 58, 5 }, { 83, 5 },
+ { 107, 5 }, { 130, 5 }, { 151, 5 }, { 172, 5 },
+ { 191, 5 }, { 209, 5 }, { 226, 5 }, { 242, 5 },
+ { 3, 6 }, { 31, 6 }, { 58, 6 }, { 83, 6 },
+ { 107, 6 }, { 130, 6 }, { 151, 6 }, { 172, 6 },
+ { 191, 6 }, { 209, 6 }, { 226, 6 }, { 242, 6 },
+ { 3, 7 }, { 31, 7 }, { 58, 7 }, { 83, 7 },
+ { 107, 7 }, { 130, 7 }, { 151, 7 }, { 172, 7 },
+ { 191, 7 }, { 209, 7 }, { 226, 7 }, { 242, 7 },
+ { 3, 8 }, { 31, 8 }, { 58, 8 }, { 83, 8 },
+ { 107, 8 }, { 130, 8 }, { 151, 8 }, { 172, 8 },
+ { 191, 8 }, { 209, 8 }, { 226, 8 }, { 242, 8 },
+ { 3, 9 }, { 31, 9 }, { 58, 9 }, { 83, 9 },
+ { 107, 9 }, { 130, 9 }, { 151, 9 }, { 172, 9 },
+ { 191, 9 }, { 209, 9 }, { 226, 9 }, { 242, 9 },
+ { 3, 10 }, { 31, 10 }, { 58, 10 }, { 83, 10 },
+ { 107, 10 }, { 130, 10 }, { 151, 10 }, { 172, 10 },
+ { 191, 10 }, { 209, 10 }, { 226, 10 }, { 242, 10 }
+};
+
+const byte Player_V2CMS::_attackRate[16] = {
+ 0, 2, 4, 7, 14, 26, 48, 82,
+ 128, 144, 160, 176, 192, 208, 224, 255
+};
+
+const byte Player_V2CMS::_decayRate[16] = {
+ 0, 1, 2, 3, 4, 6, 12, 24,
+ 48, 96, 192, 215, 255, 255, 255, 255
+};
+
+const byte Player_V2CMS::_sustainRate[16] = {
+ 255, 180, 128, 96, 80, 64, 56, 48,
+ 42, 36, 32, 28, 24, 20, 16, 0
+};
+
+const byte Player_V2CMS::_releaseRate[16] = {
+ 0, 1, 2, 4, 6, 9, 14, 22,
+ 36, 56, 80, 100, 120, 140, 160, 255
+};
+
+const byte Player_V2CMS::_volumeTable[16] = {
+ 0x00, 0x10, 0x10, 0x11, 0x11, 0x21, 0x22, 0x22,
+ 0x33, 0x44, 0x55, 0x66, 0x88, 0xAA, 0xCC, 0xFF
+};
+
+const byte Player_V2CMS::_cmsInitData[26] = {
+ 0x1C, 0x02,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00,
+ 0x14, 0x3F, 0x15, 0x00, 0x16, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1C, 0x01
+};
+
} // End of namespace Scumm
diff --git a/engines/scumm/player_v2cms.h b/engines/scumm/player_v2cms.h
index f7dc0c16b1..905c7c141e 100644
--- a/engines/scumm/player_v2cms.h
+++ b/engines/scumm/player_v2cms.h
@@ -42,18 +42,14 @@ public:
virtual void startSound(int sound);
virtual void stopSound(int sound);
virtual void stopAllSounds();
-// virtual int getMusicTimer();
+ virtual int getMusicTimer();
virtual int getSoundStatus(int sound) const;
// AudioStream API
- int readBuffer(int16 *buffer, const int numSamples);
- bool isStereo() const { return true; }
- bool endOfData() const { return false; }
- int getRate() const { return _sampleRate; }
+ virtual int readBuffer(int16 *buffer, const int numSamples);
+ virtual bool isStereo() const { return true; }
-protected:
-
-#include "common/pack-start.h" // START STRUCT PACKING
+private:
struct Voice {
byte attack;
byte decay;
@@ -63,7 +59,7 @@ protected:
int16 vibrato;
int16 vibrato2;
int16 noise;
- } PACKED_STRUCT;
+ };
struct Voice2 {
byte *amplitudeOutput;
@@ -72,12 +68,12 @@ protected:
uint8 channel;
int8 sustainLevel;
- int8 attackRate;
+ uint8 attackRate;
uint8 maxAmpl;
- int8 decayRate;
- int8 sustainRate;
- int8 releaseRate;
- int8 releaseTime;
+ uint8 decayRate;
+ uint8 sustainRate;
+ uint8 releaseRate;
+ uint8 releaseTime;
int8 vibratoRate;
int8 vibratoDepth;
@@ -90,10 +86,17 @@ protected:
int8 unkRate;
int8 unkCount;
- int nextProcessState;
- int8 curVolume;
- int8 curOctave;
- int8 curFreq;
+ enum EnvelopeState {
+ kEnvelopeAttack,
+ kEnvelopeDecay,
+ kEnvelopeSustain,
+ kEnvelopeRelease
+ };
+
+ EnvelopeState nextProcessState;
+ uint8 curVolume;
+ uint8 curOctave;
+ uint8 curFreq;
int8 octaveAdd;
@@ -101,21 +104,20 @@ protected:
Voice2 *nextVoice;
byte chanNumber;
- } PACKED_STRUCT;
+ };
struct MusicChip {
byte ampl[4];
byte freq[4];
byte octave[2];
- } PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
+ };
Voice _cmsVoicesBase[16];
Voice2 _cmsVoices[8];
MusicChip _cmsChips[2];
- int8 _tempo;
- int8 _tempoSum;
+ uint8 _tempo;
+ uint8 _tempoSum;
byte _looping;
byte _octaveMask;
int16 _midiDelay;
@@ -126,11 +128,13 @@ protected:
int _loadedMidiSong;
+ byte _sfxFreq[4], _sfxAmpl[4], _sfxOctave[2];
+
byte _lastMidiCommand;
uint _outputTableReady;
- byte _clkFrequenz;
- byte _restart;
- byte _curSno;
+ byte _voiceTimer;
+
+ int _musicTimer, _musicTimerTicks;
void loadMidiData(byte *data, int sound);
void play();
@@ -147,15 +151,25 @@ protected:
void clearNote(byte *&data);
void offAllChannels();
void playVoice();
- void processMidiData(uint ticks);
+ void processMidiData();
Voice2 *getFreeVoice();
Voice2 *getPlayVoice(byte param);
- // from Player_V2
-protected:
- CMSEmulator *_cmsEmu;
+ struct MidiNote {
+ byte frequency;
+ byte baseOctave;
+ };
+
+ static const MidiNote _midiNotes[132];
+ static const byte _attackRate[16];
+ static const byte _decayRate[16];
+ static const byte _sustainRate[16];
+ static const byte _releaseRate[16];
+ static const byte _volumeTable[16];
+ static const byte _cmsInitData[26];
+ CMSEmulator *_cmsEmu;
};
} // End of namespace Scumm
diff --git a/engines/scumm/resource.cpp b/engines/scumm/resource.cpp
index 10301da3e3..f445a44ded 100644
--- a/engines/scumm/resource.cpp
+++ b/engines/scumm/resource.cpp
@@ -47,7 +47,8 @@ enum {
RF_USAGE = 0x7F,
RF_USAGE_MAX = RF_USAGE,
- RS_MODIFIED = 0x10
+ RS_MODIFIED = 0x10,
+ RF_OFFHEAP = 0x40
};
@@ -993,18 +994,42 @@ void ResourceManager::setModified(ResType type, ResId idx) {
_types[type][idx].setModified();
}
+void ResourceManager::setOffHeap(ResType type, ResId idx) {
+ if (!validateResource("setOffHeap", type, idx))
+ return;
+ _types[type][idx].setOffHeap();
+}
+
+void ResourceManager::setOnHeap(ResType type, ResId idx) {
+ if (!validateResource("setOnHeap", type, idx))
+ return;
+ _types[type][idx].setOnHeap();
+}
+
bool ResourceManager::isModified(ResType type, ResId idx) const {
if (!validateResource("isModified", type, idx))
return false;
return _types[type][idx].isModified();
}
+bool ResourceManager::Resource::isModified() const {
+ return (_status & RS_MODIFIED) != 0;
+}
+
+bool ResourceManager::Resource::isOffHeap() const {
+ return (_status & RF_OFFHEAP) != 0;
+}
+
void ResourceManager::Resource::setModified() {
_status |= RS_MODIFIED;
}
-bool ResourceManager::Resource::isModified() const {
- return (_status & RS_MODIFIED) != 0;
+void ResourceManager::Resource::setOffHeap() {
+ _status |= RF_OFFHEAP;
+}
+
+void ResourceManager::Resource::setOnHeap() {
+ _status &= ~RF_OFFHEAP;
}
void ResourceManager::expireResources(uint32 size) {
@@ -1035,7 +1060,7 @@ void ResourceManager::expireResources(uint32 size) {
while (idx-- > 0) {
Resource &tmp = _types[type][idx];
byte counter = tmp.getResourceCounter();
- if (!tmp.isLocked() && counter >= best_counter && tmp._address && !_vm->isResourceInUse(type, idx)) {
+ if (!tmp.isLocked() && counter >= best_counter && tmp._address && !_vm->isResourceInUse(type, idx) && !tmp.isOffHeap()) {
best_counter = counter;
best_type = type;
best_res = idx;
diff --git a/engines/scumm/resource.h b/engines/scumm/resource.h
index 2e8960717f..aa7f809b76 100644
--- a/engines/scumm/resource.h
+++ b/engines/scumm/resource.h
@@ -138,8 +138,12 @@ public:
void unlock();
bool isLocked() const;
+ // HE specific
void setModified();
bool isModified() const;
+ void setOffHeap();
+ void setOnHeap();
+ bool isOffHeap() const;
};
/**
@@ -192,8 +196,11 @@ public:
void unlock(ResType type, ResId idx);
bool isLocked(ResType type, ResId idx) const;
+ // HE Specific
void setModified(ResType type, ResId idx);
bool isModified(ResType type, ResId idx) const;
+ void setOffHeap(ResType type, ResId idx);
+ void setOnHeap(ResType type, ResId idx);
/**
* This method increments the _expireCounter, and if it overflows (which happens
diff --git a/engines/scumm/room.cpp b/engines/scumm/room.cpp
index 8962a0e971..63cbef8944 100644
--- a/engines/scumm/room.cpp
+++ b/engines/scumm/room.cpp
@@ -552,6 +552,10 @@ void ScummEngine::resetRoomSubBlocks() {
}
}
+ // We need to setup the current palette before initCycl for Indy4 Amiga.
+ if (_PALS_offs || _CLUT_offs)
+ setCurrentPalette(0);
+
// Color cycling
// HE 7.0 games load resources but don't use them.
if (_game.version >= 4 && _game.heversion <= 62) {
@@ -570,9 +574,6 @@ void ScummEngine::resetRoomSubBlocks() {
}
}
#endif
-
- if (_PALS_offs || _CLUT_offs)
- setCurrentPalette(0);
}
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 3cc710c207..3ab13df032 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -30,7 +30,7 @@
#include "scumm/charset.h"
#include "scumm/imuse_digi/dimuse.h"
#include "scumm/imuse/imuse.h"
-#include "player_towns.h"
+#include "scumm/player_towns.h"
#include "scumm/he/intern_he.h"
#include "scumm/object.h"
#include "scumm/resource.h"
@@ -686,12 +686,7 @@ Graphics::Surface *ScummEngine::loadThumbnailFromSlot(const char *target, int sl
Graphics::Surface *thumb = 0;
if (Graphics::checkThumbnailHeader(*in)) {
- thumb = new Graphics::Surface();
- assert(thumb);
- if (!Graphics::loadThumbnail(*in, *thumb)) {
- delete thumb;
- thumb = 0;
- }
+ thumb = Graphics::loadThumbnail(*in);
}
delete in;
@@ -1327,6 +1322,9 @@ void ScummEngine::saveOrLoad(Serializer *s) {
if (_shadowPaletteSize) {
s->saveLoadArrayOf(_shadowPalette, _shadowPaletteSize, 1, sleByte);
// _roomPalette didn't show up until V21 save games
+ // Note that we also save the room palette for Indy4 Amiga, since it
+ // is used as palette map there too, but we do so slightly a bit
+ // further down to group it with the other special palettes needed.
if (s->getVersion() >= VER(21) && _game.version < 5)
s->saveLoadArrayOf(_roomPalette, sizeof(_roomPalette), 1, sleByte);
}
@@ -1353,6 +1351,29 @@ void ScummEngine::saveOrLoad(Serializer *s) {
memset(_colorUsedByCycle, 0, sizeof(_colorUsedByCycle));
}
+ // Indy4 Amiga specific palette tables were not saved before V85
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4) {
+ if (s->getVersion() >= 85) {
+ s->saveLoadArrayOf(_roomPalette, 256, 1, sleByte);
+ s->saveLoadArrayOf(_verbPalette, 256, 1, sleByte);
+ s->saveLoadArrayOf(_amigaPalette, 3 * 64, 1, sleByte);
+
+ // Starting from version 86 we also save the first used color in
+ // the palette beyond the verb palette. For old versions we just
+ // look for it again, which hopefully won't cause any troubles.
+ if (s->getVersion() >= 86) {
+ s->saveLoadArrayOf(&_amigaFirstUsedColor, 1, 2, sleUint16);
+ } else {
+ amigaPaletteFindFirstUsedColor();
+ }
+ } else {
+ warning("Save with old Indiana Jones 4 Amiga palette handling detected");
+ // We need to restore the internal state of the Amiga palette for Indy4
+ // Amiga. This might lead to graphics glitches!
+ setAmigaPaletteFromPtr(_currentPalette);
+ }
+ }
+
//
// Save/load more global object state
//
diff --git a/engines/scumm/saveload.h b/engines/scumm/saveload.h
index 776f40e12b..16c225d20e 100644
--- a/engines/scumm/saveload.h
+++ b/engines/scumm/saveload.h
@@ -47,7 +47,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 84
+#define CURRENT_VER 86
/**
* An auxillary macro, used to specify savegame versions. We use this instead
diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp
index 1ef16d7106..e2d3f40e8e 100644
--- a/engines/scumm/script_v0.cpp
+++ b/engines/scumm/script_v0.cpp
@@ -442,7 +442,7 @@ void ScummEngine_v0::drawSentenceWord(int object, bool usePrep, bool objInInvent
// The prepositions, like the fonts, were hard code in the engine. Thus
// we have to do that, too, and provde localized versions for all the
// languages MM/Zak are available in.
- static const char *prepositions[][5] = {
+ static const char *const prepositions[][5] = {
{ " ", " in", " with", " on", " to" }, // English
{ " ", " mit", " mit", " mit", " zu" }, // German
{ " ", " dans", " avec", " sur", " <" }, // French
diff --git a/engines/scumm/script_v4.cpp b/engines/scumm/script_v4.cpp
index 1302c8c28d..8340f62dbc 100644
--- a/engines/scumm/script_v4.cpp
+++ b/engines/scumm/script_v4.cpp
@@ -68,6 +68,18 @@ void ScummEngine_v4::o4_ifState() {
int a = getVarOrDirectWord(PARAM_1);
int b = getVarOrDirectByte(PARAM_2);
+ // WORKAROUND bug #3306145 (also occurs in original): Some old versions of
+ // Indy3 sometimes fail to allocate IQ points correctly. To quote:
+ // "About the points error leaving Castle Brunwald: It seems to "reversed"!
+ // When you get caught, free yourself and escape, you get 25 IQ points even
+ // though you're not supposed to. However if you escape WITHOUT getting
+ // caught, you get 0 IQ points (supposed to get 25 IQ points)."
+ // This workaround is meant to address that.
+ if (_game.id == GID_INDY3 && a == 367 &&
+ vm.slot[_currentScript].number == 363 && _currentRoom == 25) {
+ b = 0;
+ }
+
jumpRelative(getState(a) == b);
}
diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp
index a6cf504586..6426b75e1e 100644
--- a/engines/scumm/script_v5.cpp
+++ b/engines/scumm/script_v5.cpp
@@ -1799,12 +1799,20 @@ void ScummEngine_v5::o5_roomOps() {
case 13: // SO_SAVE_STRING
{
- // This subopcode is used in Indy 4 to save the IQ points data.
- // No other game uses it. We use this to replace the given filename by
- // one based on the targetname ("TARGET.iq").
- // This way, the iq data of each Indy 4 variant a user might have stays
- // separate. Moreover, the filename now clearly reflects to which target
- // it belongs (as it should).
+ // This subopcode is used in Indy 4 to save the IQ points
+ // data. No other LucasArts game uses it. We use this fact
+ // to substitute a filename based on the targetname
+ // ("TARGET.iq").
+ //
+ // This way, the iq data of each Indy 4 variant stays
+ // separate. Moreover, the filename now clearly reflects to
+ // which target it belongs (as it should).
+ //
+ // In addition, the Monkey Island fan patch (which adds
+ // speech support and more things to MI 1 and 2) uses
+ // this opcode to generate a "monkey.cfg" file containing.
+ // some user controllable settings.
+ // Once more we use a custom filename ("TARGET.cfg").
Common::String filename;
char chr;
@@ -1814,6 +1822,8 @@ void ScummEngine_v5::o5_roomOps() {
if (_game.id == GID_INDY4) {
filename = _targetName + ".iq";
+ } else if (_game.id == GID_MONKEY || _game.id == GID_MONKEY2) {
+ filename = _targetName + ".cfg";
} else {
error("SO_SAVE_STRING: Unsupported filename %s", filename.c_str());
}
@@ -1841,6 +1851,8 @@ void ScummEngine_v5::o5_roomOps() {
if (_game.id == GID_INDY4) {
filename = _targetName + ".iq";
+ } else if (_game.id == GID_MONKEY || _game.id == GID_MONKEY2) {
+ filename = _targetName + ".cfg";
} else {
error("SO_LOAD_STRING: Unsupported filename %s", filename.c_str());
}
@@ -2095,6 +2107,20 @@ void ScummEngine_v5::o5_startScript() {
if (_game.id == GID_ZAK && _game.platform == Common::kPlatformFMTowns && script == 171)
return;
+ // WORKAROUND bug #3306145 (also occurs in original): Some old versions of
+ // Indy3 sometimes fail to allocate IQ points correctly. To quote:
+ // "In the Amiga version you get the 15 points for puzzle 30 if you give the
+ // book or KO the guy. The PC version correctly gives 10 points for puzzle
+ // 29 for KO and 15 for puzzle 30 when giving the book."
+ // This workaround is meant to address that.
+ if (_game.id == GID_INDY3 && vm.slot[_currentScript].number == 106 && script == 125 && VAR(115) != 2) {
+ // If Var[115] != 2, then:
+ // Correct: startScript(125,[29,10]);
+ // Wrong : startScript(125,[30,15]);
+ data[0] = 29;
+ data[1] = 10;
+ }
+
// Method used by original games to skip copy protection scheme
if (!_copyProtection) {
// Copy protection was disabled in LucasArts Classic Adventures (PC Disk)
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index 8f555818f4..45c6e90a08 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
/*
- This file was generated by the md5table tool on Sun Apr 17 10:46:26 2011
+ This file was generated by the md5table tool on Sun Oct 02 03:05:23 2011
DO NOT EDIT MANUALLY!
*/
@@ -99,7 +99,7 @@ static const MD5Table md5table[] = {
{ "1ed22f601f8b3695804a6583cc3083f1", "puttrace", "HE 98.5", "", -1, Common::NL_NLD, Common::kPlatformUnknown },
{ "1f2e62b5a9c50589fc342285a6bb3a27", "freddi", "HE 73", "", -1, Common::HE_ISR, Common::kPlatformWindows },
{ "1fbebd7b2b692df5297870447a80cfed", "atlantis", "Floppy", "Floppy", 12030, Common::DE_DEU, Common::kPlatformPC },
- { "1ff5997c78fbd0a841a75ef15a05d9d5", "BluesBirthday", "", "Red", -1, Common::EN_ANY, Common::kPlatformWindows },
+ { "1ff5997c78fbd0a841a75ef15a05d9d5", "BluesBirthday", "Red", "Red", -1, Common::EN_ANY, Common::kPlatformUnknown },
{ "2012f854d83d9cc6f73b2b544cd8bbf8", "water", "HE 80", "", -1, Common::RU_RUS, Common::kPlatformWindows },
{ "20176076d708bf14407bcc9bdcd7a418", "pajama3", "", "", -1, Common::RU_RUS, Common::kPlatformWindows },
{ "204453e33456c4faa26e276229fe5b76", "spyfox2", "", "Demo", 14689, Common::DE_DEU, Common::kPlatformWindows },
@@ -403,7 +403,7 @@ static const MD5Table md5table[] = {
{ "9781422e4288dbc090720e4563168ba7", "puttzoo", "", "", -1, Common::FR_FRA, Common::kPlatformWindows },
{ "981e1e1891f2be7e25a01f50ae55a5af", "puttrace", "HE 98", "", -1, Common::EN_USA, Common::kPlatformUnknown },
{ "98744fe66ff730e8c2b3b1f58803ab0b", "atlantis", "Floppy", "Demo", -1, Common::EN_ANY, Common::kPlatformPC },
- { "99128b6a5bdd9831d9682fb8b5cbf8d4", "BluesBirthday", "", "Yellow", -1, Common::EN_ANY, Common::kPlatformUnknown },
+ { "99128b6a5bdd9831d9682fb8b5cbf8d4", "BluesBirthday", "Yellow", "Yellow", -1, Common::EN_ANY, Common::kPlatformUnknown },
{ "99a3699f80b8f776efae592b44b9b991", "maniac", "V2", "V2", -1, Common::FR_FRA, Common::kPlatformPC },
{ "99b6f822b0b2612415407865438697d6", "atlantis", "", "Demo", -1, Common::EN_ANY, Common::kPlatformPC },
{ "9b7452b5cd6d3ffb2b2f5118010af84f", "ft", "Demo", "Demo", 116463537, Common::EN_ANY, Common::kPlatformMacintosh },
@@ -578,7 +578,7 @@ static const MD5Table md5table[] = {
{ "e5563c8358443c4352fcddf7402a5e0a", "pajama2", "HE 98.5", "", -1, Common::FR_FRA, Common::kPlatformWindows },
{ "e5c112140ad6574997de033a8e2a2964", "readtime", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown },
{ "e62056ba675ad65d8854ab3c5ad4b3c0", "spyfox2", "", "Mini Game", -1, Common::EN_ANY, Common::kPlatformWindows },
- { "e63a0b9249b5ca4cc4d3ac34305ae360", "freddi", "HE 71", "", -1, Common::NB_NOR, Common::kPlatformWindows },
+ { "e63a0b9249b5ca4cc4d3ac34305ae360", "freddi", "HE 99", "", -1, Common::NB_NOR, Common::kPlatformWindows },
{ "e689bdf67f98b1d760ce4487ec0e8d06", "indy3", "EGA", "EGA", -1, Common::FR_FRA, Common::kPlatformAmiga },
{ "e6cd81b25ab1453a8a6d3482118c391e", "pass", "", "", 7857, Common::EN_ANY, Common::kPlatformPC },
{ "e72bb4c2b613db2cf50f89ff6350e70a", "ft", "", "", -1, Common::ES_ESP, Common::kPlatformUnknown },
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 7b136dc36d..81f6af453c 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -71,6 +71,7 @@
#include "scumm/he/cup_player_he.h"
#include "scumm/util.h"
#include "scumm/verbs.h"
+#include "scumm/imuse/pcspk.h"
#include "backends/audiocd/audiocd.h"
@@ -283,11 +284,13 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_16BitPalette = NULL;
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
_townsScreen = 0;
+#ifdef USE_RGB_COLOR
_cjkFont = 0;
- _cjkChar = 0;
+#endif
#endif
_shadowPalette = NULL;
_shadowPaletteSize = 0;
+ _verbPalette = NULL;
memset(_currentPalette, 0, sizeof(_currentPalette));
memset(_darkenPalette, 0, sizeof(_darkenPalette));
memset(_HEV7ActorPalette, 0, sizeof(_HEV7ActorPalette));
@@ -297,7 +300,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_haveActorSpeechMsg = false;
_useTalkAnims = false;
_defaultTalkDelay = 0;
- _musicType = MDT_NONE;
_saveSound = 0;
memset(_extraBoxFlags, 0, sizeof(_extraBoxFlags));
memset(_scaleSlots, 0, sizeof(_scaleSlots));
@@ -609,6 +611,7 @@ ScummEngine::~ScummEngine() {
_textSurface.free();
free(_shadowPalette);
+ free(_verbPalette);
free(_palManipPalette);
free(_palManipIntermediatePal);
@@ -633,8 +636,10 @@ ScummEngine::~ScummEngine() {
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
delete _townsScreen;
+#ifdef USE_RGB_COLOR
delete _cjkFont;
#endif
+#endif
delete _debugger;
@@ -1350,13 +1355,23 @@ void ScummEngine::setupCharsetRenderer() {
_charset = new CharsetRendererPCE(this);
else
#endif
+ if (_game.platform == Common::kPlatformFMTowns)
+ _charset = new CharsetRendererTownsV3(this);
+ else
_charset = new CharsetRendererV3(this);
#ifdef ENABLE_SCUMM_7_8
} else if (_game.version == 8) {
_charset = new CharsetRendererNut(this);
#endif
} else {
- _charset = new CharsetRendererClassic(this);
+#ifdef USE_RGB_COLOR
+#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
+ if (_game.platform == Common::kPlatformFMTowns)
+ _charset = new CharsetRendererTownsClassic(this);
+ else
+#endif
+#endif
+ _charset = new CharsetRendererClassic(this);
}
}
@@ -1395,6 +1410,10 @@ void ScummEngine::resetScumm() {
_16BitPalette = (uint16 *)calloc(512, sizeof(uint16));
#endif
+ // Indy4 Amiga needs another palette map for the verb area.
+ if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4 && !_verbPalette)
+ _verbPalette = (uint8 *)calloc(256, 1);
+
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
if (_game.platform == Common::kPlatformFMTowns) {
delete _townsScreen;
@@ -1655,43 +1674,8 @@ void ScummEngine_v90he::resetScumm() {
_sprite->resetTables(0);
memset(&_wizParams, 0, sizeof(_wizParams));
- if (_game.heversion >= 98) {
- switch (_game.id) {
- case GID_PUTTRACE:
- _logicHE = new LogicHErace(this);
- break;
-
- case GID_FUNSHOP:
- _logicHE = new LogicHEfunshop(this);
- break;
-
- case GID_FOOTBALL:
- _logicHE = new LogicHEfootball(this);
- break;
-
- case GID_SOCCER:
- case GID_SOCCERMLS:
- case GID_SOCCER2004:
- _logicHE = new LogicHEsoccer(this);
- break;
-
- case GID_BASEBALL2001:
- _logicHE = new LogicHEbaseball2001(this);
- break;
-
- case GID_BASKETBALL:
- _logicHE = new LogicHEbasketball(this);
- break;
-
- case GID_MOONBASE:
- _logicHE = new LogicHEmoonbase(this);
- break;
-
- default:
- _logicHE = new LogicHE(this);
- break;
- }
- }
+ if (_game.heversion >= 98)
+ _logicHE = LogicHE::makeLogicHE(this);
}
void ScummEngine_v99he::resetScumm() {
@@ -1732,40 +1716,36 @@ void ScummEngine::setupMusic(int midi) {
switch (MidiDriver::getMusicType(dev)) {
case MT_NULL:
- _musicType = MDT_NONE;
+ _sound->_musicType = MDT_NONE;
break;
case MT_PCSPK:
- _musicType = MDT_PCSPK;
+ _sound->_musicType = MDT_PCSPK;
break;
case MT_PCJR:
- _musicType = MDT_PCJR;
+ _sound->_musicType = MDT_PCJR;
break;
- //case MT_CMS:
-#if 1
- _musicType = MDT_ADLIB;
-#else
- _musicType = MDT_CMS; // Still has number of bugs, disable by default
-#endif
+ case MT_CMS:
+ _sound->_musicType = MDT_CMS;
break;
case MT_TOWNS:
- _musicType = MDT_TOWNS;
+ _sound->_musicType = MDT_TOWNS;
break;
case MT_ADLIB:
- _musicType = MDT_ADLIB;
+ _sound->_musicType = MDT_ADLIB;
break;
case MT_C64:
- _musicType = MDT_C64;
+ _sound->_musicType = MDT_C64;
break;
case MT_APPLEIIGS:
- _musicType = MDT_APPLEIIGS;
+ _sound->_musicType = MDT_APPLEIIGS;
break;
default:
- _musicType = MDT_MIDI;
+ _sound->_musicType = MDT_MIDI;
break;
}
if ((_game.id == GID_MONKEY_EGA || (_game.id == GID_LOOM && _game.version == 3))
- && (_game.platform == Common::kPlatformPC) && _musicType == MDT_MIDI) {
+ && (_game.platform == Common::kPlatformPC) && _sound->_musicType == MDT_MIDI) {
Common::String fileName;
bool missingFile = false;
if (_game.id == GID_LOOM) {
@@ -1795,7 +1775,7 @@ void ScummEngine::setupMusic(int midi) {
"but %s is missing. Using AdLib instead."), fileName.c_str()),
_("OK"));
dialog.runModal();
- _musicType = MDT_ADLIB;
+ _sound->_musicType = MDT_ADLIB;
}
}
@@ -1809,9 +1789,9 @@ 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_PCJR || _musicType == MDT_CMS) {
+ if (_sound->_musicType == MDT_ADLIB || _sound->_musicType == MDT_PCSPK || _sound->_musicType == MDT_PCJR || _sound->_musicType == MDT_CMS) {
dev = 0;
- _musicType = MDT_NONE;
+ _sound->_musicType = MDT_NONE;
warning("MIDI driver depends on sound mixer, switching to null MIDI driver");
}
}
@@ -1843,9 +1823,9 @@ 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 || _musicType == MDT_PCJR) && (_game.version > 2 && _game.version <= 4)) {
+ } else if ((_sound->_musicType == MDT_PCSPK || _sound->_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) {
+ } else if (_sound->_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.
@@ -1857,14 +1837,16 @@ void ScummEngine::setupMusic(int midi) {
MidiDriver *nativeMidiDriver = 0;
MidiDriver *adlibMidiDriver = 0;
- if (_musicType != MDT_ADLIB && _musicType != MDT_TOWNS)
+ if (_sound->_musicType != MDT_ADLIB && _sound->_musicType != MDT_TOWNS && _sound->_musicType != MDT_PCSPK)
nativeMidiDriver = MidiDriver::createMidi(dev);
if (nativeMidiDriver != NULL && _native_mt32)
nativeMidiDriver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
- bool multi_midi = ConfMan.getBool("multi_midi") && _musicType != MDT_NONE && (midi & MDT_ADLIB);
- if (_musicType == MDT_ADLIB || _musicType == MDT_TOWNS || multi_midi) {
- adlibMidiDriver = MidiDriver::createMidi(MidiDriver::detectDevice(_musicType == MDT_TOWNS ? MDT_TOWNS : MDT_ADLIB));
+ bool multi_midi = ConfMan.getBool("multi_midi") && _sound->_musicType != MDT_NONE && _sound->_musicType != MDT_PCSPK && (midi & MDT_ADLIB);
+ if (_sound->_musicType == MDT_ADLIB || _sound->_musicType == MDT_TOWNS || multi_midi) {
+ adlibMidiDriver = MidiDriver::createMidi(MidiDriver::detectDevice(_sound->_musicType == MDT_TOWNS ? MDT_TOWNS : MDT_ADLIB));
adlibMidiDriver->property(MidiDriver::PROP_OLD_ADLIB, (_game.features & GF_SMALL_HEADER) ? 1 : 0);
+ } else if (_sound->_musicType == MDT_PCSPK) {
+ adlibMidiDriver = new PcSpkDriver(_mixer);
}
_imuse = IMuse::create(_system, nativeMidiDriver, adlibMidiDriver);
@@ -1893,6 +1875,8 @@ void ScummEngine::setupMusic(int midi) {
_imuse->property(IMuse::PROP_LIMIT_PLAYERS, 1);
_imuse->property(IMuse::PROP_RECYCLE_PLAYERS, 1);
}
+ if (_sound->_musicType == MDT_PCSPK)
+ _imuse->property(IMuse::PROP_PC_SPEAKER, 1);
}
}
}
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index 01bde90e1c..d9237b2b30 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -40,15 +40,14 @@
#include "scumm/detection.h"
#include "scumm/script.h"
-#include "audio/mididrv.h"
-
#ifdef __DS__
/* This disables the dual layer mode which is used in FM-Towns versions
* of SCUMM games and which emulates the behavior of the original code.
* The only purpose is code size reduction for certain backends.
- * SCUMM 3 (FM-Towns) games will run in normal (DOS VGA) mode, which should
- * work just fine in most situations. Some glitches might occur. SCUMM 5 games
- * will not work without dual layer (and 16 bit color) support.
+ * SCUMM 3 (FM-Towns) games will run in English in normal (DOS VGA) mode,
+ * which should work just fine in most situations. Some glitches might
+ * occur. Japanese mode and SCUMM 5 FM-Towns games will not work without
+ * dual layer (and 16 bit color) support.
*/
#define DISABLE_TOWNS_DUAL_LAYER_MODE
#endif
@@ -234,7 +233,8 @@ enum ScummGameId {
GID_PUTTMOON,
GID_FUNPACK,
GID_FREDDI3,
- GID_BIRTHDAY,
+ GID_BIRTHDAYRED,
+ GID_BIRTHDAYYELLOW,
GID_TREASUREHUNT,
GID_PUTTRACE,
GID_FUNSHOP, // Used for all three funshops
@@ -345,6 +345,7 @@ class ResourceManager;
class ScummEngine : public Engine {
friend class ScummDebugger;
friend class CharsetRenderer;
+ friend class CharsetRendererTownsClassic;
friend class ResourceManager;
public:
@@ -969,6 +970,7 @@ protected:
void setCurrentPalette(int pal);
void setRoomPalette(int pal, int room);
void setPCEPaletteFromPtr(const byte *ptr);
+ void setAmigaPaletteFromPtr(const byte *ptr);
virtual void setPaletteFromPtr(const byte *ptr, int numcolor = -1);
virtual void setPalColor(int index, int r, int g, int b);
@@ -1064,6 +1066,9 @@ public:
uint16 _hePaletteSlot;
uint16 *_16BitPalette;
+ // Indy4 Amiga specific
+ byte *_verbPalette;
+
protected:
int _shadowPaletteSize;
byte _currentPalette[3 * 256];
@@ -1082,9 +1087,17 @@ protected:
int _saveSound;
bool _native_mt32;
bool _enable_gs;
- MidiDriverFlags _musicType;
bool _copyProtection;
+ // Indy4 Amiga specific
+ uint16 _amigaFirstUsedColor;
+ byte _amigaPalette[3 * 64];
+ void amigaPaletteFindFirstUsedColor();
+ void mapRoomPalette(int idx);
+ int remapRoomPaletteColor(int r, int g, int b);
+ void mapVerbPalette(int idx);
+ int remapVerbPaletteColor(int r, int g, int b);
+
public:
uint16 _extraBoxFlags[65];
@@ -1326,14 +1339,17 @@ public:
// Exists both in V7 and in V72HE:
byte VAR_NUM_GLOBAL_OBJS;
+#ifdef USE_RGB_COLOR
+ // FM-Towns / PC-Engine specific
+ Graphics::FontSJIS *_cjkFont;
+#endif
+
// FM-Towns specific
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
public:
bool towns_isRectInStringBox(int x1, int y1, int x2, int y2);
byte _townsPaletteFlags;
- byte _townsCharsetColorMap[16];
- Graphics::FontSJIS *_cjkFont;
- uint16 _cjkChar;
+ byte _townsCharsetColorMap[16];
protected:
void towns_drawStripToScreen(VirtScreen *vs, int dstX, int dstY, int srcX, int srcY, int w, int h);
diff --git a/engines/scumm/smush/channel.cpp b/engines/scumm/smush/channel.cpp
index 7f71d0549b..7f9ca70080 100644
--- a/engines/scumm/smush/channel.cpp
+++ b/engines/scumm/smush/channel.cpp
@@ -60,6 +60,8 @@ void SmushChannel::processBuffer() {
if (offset < _tbufferSize) {
int new_size = _tbufferSize - offset;
_tbuffer = (byte *)malloc(new_size);
+ // FIXME: _tbuffer might be 0 if new_size is 0.
+ // NB: Also check other "if (_tbuffer)" locations in smush
if (!_tbuffer)
error("smush channel failed to allocate memory");
memcpy(_tbuffer, _sbuffer + offset, new_size);
@@ -97,9 +99,13 @@ void SmushChannel::processBuffer() {
byte *old = _tbuffer;
int32 new_size = _tbufferSize - offset;
_tbuffer = (byte *)malloc(new_size);
- if (!_tbuffer)
- error("smush channel failed to allocate memory");
- memcpy(_tbuffer, old + offset, new_size);
+ // NB: Also check other "if (_tbuffer)" locations in smush
+ if (!_tbuffer) {
+ if (new_size)
+ error("smush channel failed to allocate memory");
+ } else {
+ memcpy(_tbuffer, old + offset, new_size);
+ }
_tbufferSize = new_size;
free(old);
}
diff --git a/engines/scumm/smush/codec37.cpp b/engines/scumm/smush/codec37.cpp
index dcc8ee3c19..344057e3ac 100644
--- a/engines/scumm/smush/codec37.cpp
+++ b/engines/scumm/smush/codec37.cpp
@@ -571,4 +571,3 @@ void Codec37Decoder::decode(byte *dst, const byte *src) {
}
} // End of namespace Scumm
-
diff --git a/engines/scumm/smush/smush_font.cpp b/engines/scumm/smush/smush_font.cpp
index 7765bf1292..5cfa0ea519 100644
--- a/engines/scumm/smush/smush_font.cpp
+++ b/engines/scumm/smush/smush_font.cpp
@@ -258,4 +258,3 @@ void SmushFont::drawStringWrap(const char *str, byte *buffer, int dst_width, int
}
} // End of namespace Scumm
-
diff --git a/engines/scumm/smush/smush_player.cpp b/engines/scumm/smush/smush_player.cpp
index 66502572de..2f4e86bf61 100644
--- a/engines/scumm/smush/smush_player.cpp
+++ b/engines/scumm/smush/smush_player.cpp
@@ -90,13 +90,13 @@ public:
assert(def_end != NULL);
char *id_end = def_end;
- while (id_end >= def_start && !isdigit(*(id_end-1))) {
+ while (id_end >= def_start && !isdigit(static_cast<unsigned char>(*(id_end-1)))) {
id_end--;
}
assert(id_end > def_start);
char *id_start = id_end;
- while (isdigit(*(id_start - 1))) {
+ while (isdigit(static_cast<unsigned char>(*(id_start - 1)))) {
id_start--;
}
diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp
index 27e43b3740..ba8c6e2277 100644
--- a/engines/scumm/sound.cpp
+++ b/engines/scumm/sound.cpp
@@ -84,6 +84,8 @@ Sound::Sound(ScummEngine *parent, Audio::Mixer *mixer)
memset(_soundQue, 0, sizeof(_soundQue));
memset(_soundQue2, 0, sizeof(_soundQue2));
memset(_mouthSyncTimes, 0, sizeof(_mouthSyncTimes));
+
+ _musicType = MDT_NONE;
}
Sound::~Sound() {
@@ -1016,7 +1018,7 @@ void Sound::startCDTimer() {
// appears.
_vm->getTimerManager()->removeTimerProc(&cd_timer_handler);
- _vm->getTimerManager()->installTimerProc(&cd_timer_handler, 100700, _vm);
+ _vm->getTimerManager()->installTimerProc(&cd_timer_handler, 100700, _vm, "scummCDtimer");
}
void Sound::stopCDTimer() {
@@ -1094,7 +1096,7 @@ int ScummEngine::readSoundResource(ResId idx) {
switch (basetag) {
case MKTAG('M','I','D','I'):
case MKTAG('i','M','U','S'):
- if (_musicType != MDT_PCSPK && _musicType != MDT_PCJR) {
+ if (_sound->_musicType != MDT_PCSPK && _sound->_musicType != MDT_PCJR) {
_fileHandle->seek(-8, SEEK_CUR);
_fileHandle->read(_res->createResource(rtSound, idx, total_size + 8), total_size + 8);
return 1;
@@ -1118,7 +1120,7 @@ int ScummEngine::readSoundResource(ResId idx) {
break;
case MKTAG('A','D','L',' '):
pri = 1;
- if (_musicType == MDT_ADLIB || _musicType == MDT_TOWNS)
+ if (_sound->_musicType == MDT_ADLIB || _sound->_musicType == MDT_TOWNS)
pri = 10;
break;
case MKTAG('A','M','I',' '):
@@ -1137,16 +1139,34 @@ int ScummEngine::readSoundResource(ResId idx) {
break;
case MKTAG('S','P','K',' '):
pri = -1;
-// if (_musicType == MDT_PCSPK || _musicType == MDT_PCJR)
-// pri = 11;
+ if (_sound->_musicType == MDT_PCSPK || _sound->_musicType == MDT_PCJR)
+ pri = 11;
break;
}
- if ((_musicType == MDT_PCSPK || _musicType == MDT_PCJR || _musicType == MDT_CMS) && pri != 11)
+ // We only allow SPK resources for PC Speaker and PCJr here
+ // since other resource would sound horribly with their output
+ // drivers.
+ if ((_sound->_musicType == MDT_PCSPK || _sound->_musicType == MDT_PCJR) && pri != 11)
pri = -1;
- debugC(DEBUG_RESOURCE, " tag: %s, total_size=%d, pri=%d", tag2str(tag), size, pri);
+ // We only allow ADL, SBL and TOWS resources when AdLib
+ // or FM-Towns is used as primary audio output. This fixes some
+ // odd sounds when Indy and Sophia leave Atlantis with the
+ // submarine in Indy4. (Easy to check with bootparam 4061 in
+ // the CD version). It seems the game only contains a ROL resource
+ // for sound id 60. Formerly we tried to play that via the AdLib
+ // or FM-Towns audio driver resulting in strange noises. Now we
+ // behave like the original did.
+ // We make an exception for Macintosh, which uses priority 2 for
+ // its sound resources, and Amiga games, which feature only ROL
+ // resources, since we are a doing Midi -> AdLib conversion for
+ // these.
+ if ((_sound->_musicType == MDT_ADLIB || _sound->_musicType == MDT_TOWNS) && pri != 16
+ && pri != 15 && pri != 10 && pri != 2 && _game.platform != Common::kPlatformAmiga)
+ pri = -1;
+ debugC(DEBUG_RESOURCE, " tag: %s, total_size=%d, pri=%d", tag2str(tag), size, pri);
if (pri > best_pri) {
best_pri = pri;
@@ -1984,6 +2004,14 @@ static void convertADResource(ResourceManager *res, const GameSettings& game, Re
break;
case 0x80:
+ // FIXME: This is incorrect. The original uses 0x80 for
+ // looping a single channel. We currently interpret it as stop
+ // thus we won't get looping for sound effects. It should
+ // always jump to the start of the channel.
+ //
+ // Since we convert the data to MIDI and we cannot only loop a
+ // single channel via MIDI fixing this will require some more
+ // thought.
track_time[ch] = -1;
src_ptr ++;
break;
@@ -2074,7 +2102,7 @@ int ScummEngine::readSoundResourceSmallHeader(ResId idx) {
}
}
- if ((_musicType == MDT_PCSPK || _musicType == MDT_PCJR) && wa_offs != 0) {
+ if ((_sound->_musicType == MDT_PCSPK || _sound->_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);
@@ -2083,18 +2111,37 @@ int ScummEngine::readSoundResourceSmallHeader(ResId idx) {
_fileHandle->read(_res->createResource(rtSound, idx, wa_size + 6), wa_size + 6);
}
return 1;
- } else if (_musicType == MDT_CMS && ad_offs != 0) {
+ } else if (_sound->_musicType == MDT_CMS) {
if (_game.features & GF_OLD_BUNDLE) {
- _fileHandle->seek(wa_offs + wa_size + 6, SEEK_SET);
- byte musType = _fileHandle->readByte();
+ bool hasAdLibMusicTrack = false;
+
+ if (ad_offs) {
+ _fileHandle->seek(ad_offs + 4 + 2, SEEK_SET);
+ hasAdLibMusicTrack = (_fileHandle->readByte() == 0x80);
+ }
- if (musType == 0x80) {
+ if (hasAdLibMusicTrack) {
_fileHandle->seek(ad_offs, SEEK_SET);
_fileHandle->read(_res->createResource(rtSound, idx, ad_size), ad_size);
} else {
_fileHandle->seek(wa_offs, SEEK_SET);
_fileHandle->read(_res->createResource(rtSound, idx, wa_size), wa_size);
}
+ } else {
+ bool hasAdLibMusicTrack = false;
+
+ if (ad_offs) {
+ _fileHandle->seek(ad_offs + 2, SEEK_SET);
+ hasAdLibMusicTrack = (_fileHandle->readByte() == 0x80);
+ }
+
+ if (hasAdLibMusicTrack) {
+ _fileHandle->seek(ad_offs - 4, SEEK_SET);
+ _fileHandle->read(_res->createResource(rtSound, idx, ad_size + 4), ad_size + 4);
+ } else {
+ _fileHandle->seek(wa_offs - 6, SEEK_SET);
+ _fileHandle->read(_res->createResource(rtSound, idx, wa_size + 6), wa_size + 6);
+ }
}
} else if (ad_offs != 0) {
// AD resources have a header, instrument definitions and one MIDI track.
diff --git a/engines/scumm/sound.h b/engines/scumm/sound.h
index 03659ceff1..e9a37ac9fa 100644
--- a/engines/scumm/sound.h
+++ b/engines/scumm/sound.h
@@ -24,6 +24,7 @@
#include "common/scummsys.h"
#include "audio/audiostream.h"
+#include "audio/mididrv.h"
#include "audio/mixer.h"
#include "scumm/saveload.h"
@@ -90,6 +91,8 @@ public:
byte _sfxMode;
uint _lastSound;
+ MidiDriverFlags _musicType;
+
public:
Sound(ScummEngine *parent, Audio::Mixer *mixer);
virtual ~Sound();
diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp
index 4b3207c6bf..61bb89328d 100644
--- a/engines/scumm/string.cpp
+++ b/engines/scumm/string.cpp
@@ -1127,8 +1127,6 @@ int ScummEngine::convertMessageToString(const byte *msg, byte *dst, int dstSize)
}
num += (_game.version == 8) ? 4 : 2;
}
- } else if (_game.id == GID_DIG && (chr == 1 || chr == 2 || chr == 3 || chr == 8)) {
- // Skip these characters
} else {
if ((chr != '@') || (_game.id == GID_CMI && _language == Common::ZH_TWN) ||
(_game.id == GID_LOOM && _game.platform == Common::kPlatformPCEngine && _language == Common::JA_JPN) ||
@@ -1142,6 +1140,14 @@ int ScummEngine::convertMessageToString(const byte *msg, byte *dst, int dstSize)
if (dst >= end)
error("convertMessageToString: buffer overflow");
}
+
+ // WORKAROUND: Russian The Dig pads messages with 03. No idea why
+ // it does not work as is with our rendering code, thus fixing it
+ // with a workaround.
+ if (_game.id == GID_DIG) {
+ while (*(dst - 1) == 0x03)
+ dst--;
+ }
*dst = 0;
return dstSize - (end - dst);
@@ -1383,10 +1389,10 @@ void ScummEngine_v7::loadLanguageBundle() {
} else if (*ptr == '#') {
// Number of subtags following a given basetag. We don't need that
// information so we just skip it
- } else if (isdigit(*ptr)) {
+ } else if (isdigit(static_cast<unsigned char>(*ptr))) {
int idx = 0;
// A number (up to three digits)...
- while (isdigit(*ptr)) {
+ while (isdigit(static_cast<unsigned char>(*ptr))) {
idx = idx * 10 + (*ptr - '0');
ptr++;
}
@@ -1424,12 +1430,12 @@ void ScummEngine_v7::loadLanguageBundle() {
for (i = 0; i < _languageIndexSize; i++) {
// First 8 chars in the line give the string ID / 'tag'
int j;
- for (j = 0; j < 8 && !isspace(*ptr); j++, ptr++)
+ for (j = 0; j < 8 && !isspace(static_cast<unsigned char>(*ptr)); j++, ptr++)
_languageIndex[i].tag[j] = toupper(*ptr);
_languageIndex[i].tag[j] = 0;
// After that follows a single space which we skip
- assert(isspace(*ptr));
+ assert(isspace(static_cast<unsigned char>(*ptr)));
ptr++;
// Then comes the translated string: we record an offset to that.
diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp
index 56f8de2ad1..26a6a2f3b1 100644
--- a/engines/scumm/vars.cpp
+++ b/engines/scumm/vars.cpp
@@ -25,9 +25,12 @@
#include "scumm/scumm.h"
#include "scumm/scumm_v0.h"
#include "scumm/scumm_v8.h"
+#include "scumm/sound.h"
#include "scumm/he/intern_he.h"
#include "scumm/he/logic_he.h"
+#include "audio/mididrv.h"
+
namespace Scumm {
void ScummEngine::setupScummVars() {
@@ -704,8 +707,12 @@ void ScummEngine_v99he::resetScummVars() {
VAR(VAR_NUM_UNK) = _numUnk;
if (_game.heversion >= 100 && (_game.features & GF_16BIT_COLOR)) {
- // Disable Bink and Smacker video in 16bit color games
+ // Enable Bink video in 16bit color games
+#ifdef USE_BINK
+ VAR(140) = 1;
+#else
VAR(140) = 0;
+#endif
}
}
#endif
@@ -718,7 +725,7 @@ void ScummEngine::resetScummVars() {
// 2 CMS
// 3 AdLib
// 4 Roland
- switch (_musicType) {
+ switch (_sound->_musicType) {
case MDT_NONE:
case MDT_PCSPK:
VAR(VAR_SOUNDCARD) = 0;
diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp
index 0c1554840e..67ed17c024 100644
--- a/engines/scumm/verbs.cpp
+++ b/engines/scumm/verbs.cpp
@@ -1440,7 +1440,6 @@ void ScummEngine::drawVerb(int verb, int mode) {
}
void ScummEngine::restoreVerbBG(int verb) {
-
VerbSlot *vs;
vs = &_verbs[verb];
diff --git a/engines/sky/autoroute.h b/engines/sky/autoroute.h
index 2d01be01ec..8721ba6c54 100644
--- a/engines/sky/autoroute.h
+++ b/engines/sky/autoroute.h
@@ -56,4 +56,3 @@ private:
} // End of namespace Sky
#endif // AUTOROUTE_H
-
diff --git a/engines/sky/compact.cpp b/engines/sky/compact.cpp
index 84609d5500..fd81cb9bea 100644
--- a/engines/sky/compact.cpp
+++ b/engines/sky/compact.cpp
@@ -471,7 +471,7 @@ uint16 SkyCompact::giveDataListLen(uint16 listNum) {
return _dataListLen[listNum];
}
-const char *SkyCompact::_typeNames[NUM_CPT_TYPES] = {
+const char *const SkyCompact::_typeNames[NUM_CPT_TYPES] = {
"null",
"COMPACT",
"TURNTABLE",
diff --git a/engines/sky/compact.h b/engines/sky/compact.h
index a7b8520539..0bd5b4943b 100644
--- a/engines/sky/compact.h
+++ b/engines/sky/compact.h
@@ -88,7 +88,7 @@ private:
uint16 **_cptTypes;
Common::File *_cptFile;
uint32 _resetDataPos;
- static const char *_typeNames[NUM_CPT_TYPES];
+ static const char *const _typeNames[NUM_CPT_TYPES];
};
} // End of namespace Sky
diff --git a/engines/sky/debug.cpp b/engines/sky/debug.cpp
index ebc1ee377d..a417bc2ece 100644
--- a/engines/sky/debug.cpp
+++ b/engines/sky/debug.cpp
@@ -35,7 +35,7 @@
namespace Sky {
-static const char *logic_table_names[] = {
+static const char *const logic_table_names[] = {
"return",
"Logic::script",
"Logic::auto_route",
@@ -79,7 +79,7 @@ static const char opcode_par[] = {
0
};
-static const char *opcodes[] = {
+static const char *const opcodes[] = {
"push_variable",
"less_than",
"push_number",
@@ -103,7 +103,7 @@ static const char *opcodes[] = {
"restart_script"
};
-static const char *mcodes[] = {
+static const char *const mcodes[] = {
"fn_cache_chip",
"fn_cache_fast",
"fn_draw_screen",
@@ -221,7 +221,7 @@ static const char *mcodes[] = {
"fn_printf"
};
-static const char *scriptVars[] = {
+static const char *const scriptVars[] = {
"result",
"screen",
"logic_list_no",
@@ -1121,12 +1121,12 @@ bool Debugger::Cmd_ReloadGrid(int argc, const char **argv) {
return true;
}
-static const char *logicTypes[] = {
+static const char *const logicTypes[] = {
"(none)", "SCRIPT", "AUTOROUTE", "AR_ANIM", "AR_TURNING", "ALT", "MOD_ANIM", "TURNING", "CURSOR", "TALK", "LISTEN",
"STOPPED", "CHOOSE", "FRAMES", "PAUSE", "WAIT_SYNC", "SIMPLE MOD"
};
-static const char *noYes[] = { "no", "yes" };
+static const char *const noYes[] = { "no", "yes" };
void Debugger::dumpCompact(uint16 cptId) {
uint16 type, size;
diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp
index f3cce06ad6..2699500527 100644
--- a/engines/sky/detection.cpp
+++ b/engines/sky/detection.cpp
@@ -43,21 +43,21 @@ struct SkyVersion {
int dataDiskSize;
const char *extraDesc;
int version;
- uint32 guioptions;
+ const char *guioptions;
};
// TODO: Would be nice if Disk::determineGameVersion() used this table, too.
static const SkyVersion skyVersions[] = {
- { 232, -1, "floppy demo", 272, Common::GUIO_NOSPEECH }, // German
- { 243, -1, "pc gamer demo", 109, Common::GUIO_NOSPEECH },
- { 247, -1, "floppy demo", 267, Common::GUIO_NOSPEECH }, // English
- { 1404, -1, "floppy", 288, Common::GUIO_NOSPEECH },
- { 1413, -1, "floppy", 303, Common::GUIO_NOSPEECH },
- { 1445, 8830435, "floppy", 348, Common::GUIO_NOSPEECH },
- { 1445, -1, "floppy", 331, Common::GUIO_NOSPEECH },
- { 1711, -1, "cd demo", 365, Common::GUIO_NONE },
- { 5099, -1, "cd", 368, Common::GUIO_NONE },
- { 5097, -1, "cd", 372, Common::GUIO_NONE },
+ { 232, -1, "floppy demo", 272, GUIO1(GUIO_NOSPEECH) }, // German
+ { 243, -1, "pc gamer demo", 109, GUIO1(GUIO_NOSPEECH) },
+ { 247, -1, "floppy demo", 267, GUIO1(GUIO_NOSPEECH) }, // English
+ { 1404, -1, "floppy", 288, GUIO1(GUIO_NOSPEECH) },
+ { 1413, -1, "floppy", 303, GUIO1(GUIO_NOSPEECH) },
+ { 1445, 8830435, "floppy", 348, GUIO1(GUIO_NOSPEECH) },
+ { 1445, -1, "floppy", 331, GUIO1(GUIO_NOSPEECH) },
+ { 1711, -1, "cd demo", 365, GUIO1(GUIO_NONE) },
+ { 5099, -1, "cd", 368, GUIO1(GUIO_NONE) },
+ { 5097, -1, "cd", 372, GUIO1(GUIO_NONE) },
{ 0, 0, 0, 0, 0 }
};
@@ -206,7 +206,7 @@ SaveStateList SkyMetaEngine::listSaves(const char *target) const {
// Extract the extension
Common::String ext = file->c_str() + file->size() - 3;
ext.toUppercase();
- if (isdigit(ext[0]) && isdigit(ext[1]) && isdigit(ext[2])){
+ if (isdigit(static_cast<unsigned char>(ext[0])) && isdigit(static_cast<unsigned char>(ext[1])) && isdigit(static_cast<unsigned char>(ext[2]))){
int slotNum = atoi(ext.c_str());
Common::InSaveFile *in = saveFileMan->openForLoading(*file);
if (in) {
diff --git a/engines/sky/disk.cpp b/engines/sky/disk.cpp
index a06c5c9be8..99b707dcf1 100644
--- a/engines/sky/disk.cpp
+++ b/engines/sky/disk.cpp
@@ -32,8 +32,8 @@
namespace Sky {
-static const char *dataFilename = "sky.dsk";
-static const char *dinnerFilename = "sky.dnr";
+static const char *const dataFilename = "sky.dsk";
+static const char *const dinnerFilename = "sky.dnr";
Disk::Disk() {
_dataDiskHandle = new Common::File();
diff --git a/engines/sky/logic.cpp b/engines/sky/logic.cpp
index 616670b0fd..a69ba793f2 100644
--- a/engines/sky/logic.cpp
+++ b/engines/sky/logic.cpp
@@ -1248,6 +1248,17 @@ script:
debug(3, "Doing Script: %d:%d:%x", moduleNo, scriptNo & 0xFFF, offset ? (offset - moduleStart[scriptNo & 0xFFF]) : 0);
+ // WORKAROUND for bug #3149412: "Invalid Mode when giving shades to travel agent"
+ // Using the dark glasses on Trevor (travel agent) multiple times in succession would
+ // wreck the trevor compact's mode, as the script in question doesn't account for using
+ // this item at this point in the game (you will only have it here if you play the game
+ // in an unusual way) and thus would loop indefinitely / never drop out.
+ // To prevent this, we trigger the generic response by pretending we're using an item
+ // which the script /does/ handle.
+ if (scriptNo == TREVOR_SPEECH && _scriptVariables[OBJECT_HELD] == IDO_SHADES)
+ _scriptVariables[OBJECT_HELD] = IDO_GLASS;
+
+
// Check whether we have an offset or what
if (offset)
scriptData = moduleStart + offset;
diff --git a/engines/sky/sound.cpp b/engines/sky/sound.cpp
index e94a2a61d9..a60e3d9e38 100644
--- a/engines/sky/sound.cpp
+++ b/engines/sky/sound.cpp
@@ -872,7 +872,7 @@ static const Sfx fx_orifice_swallow_drip = {
}
};
-static const Sfx *musicList[] = {
+static const Sfx *const musicList[] = {
&fx_press_bang, // 256 banging of the press
&fx_press_hiss, // 257 hissing press
&fx_wind_howl, // 258 howling wind
diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp
index 4ce3e2e88d..324154f709 100644
--- a/engines/sword1/animation.cpp
+++ b/engines/sword1/animation.cpp
@@ -38,7 +38,7 @@
namespace Sword1 {
-static const char *sequenceList[20] = {
+static const char *const sequenceList[20] = {
"ferrari", // 0 CD2 ferrari running down fitz in sc19
"ladder", // 1 CD2 george walking down ladder to dig sc24->sc$
"steps", // 2 CD2 george walking down steps sc23->sc24
@@ -114,7 +114,7 @@ bool MoviePlayer::load(uint32 id) {
int startFrame = strtoul(ptr, const_cast<char **>(&ptr), 10);
int endFrame = strtoul(ptr, const_cast<char **>(&ptr), 10);
- while (*ptr && isspace(*ptr))
+ while (*ptr && isspace(static_cast<unsigned char>(*ptr)))
ptr++;
if (startFrame > endFrame) {
diff --git a/engines/sword1/control.cpp b/engines/sword1/control.cpp
index 36d5a24e99..6e395116f9 100644
--- a/engines/sword1/control.cpp
+++ b/engines/sword1/control.cpp
@@ -122,8 +122,8 @@ ControlButton::ControlButton(uint16 x, uint16 y, uint32 resId, uint8 id, uint8 f
_width = (_width > SCREEN_WIDTH) ? SCREEN_WIDTH : _width;
_height = _resMan->getUint16(tmp->height);
if ((x == 0) && (y == 0)) { // center the frame (used for panels);
- _x = (((640 - _width) / 2) < 0)? 0 : ((640 - _width) / 2);
- _y = (((480 - _height) / 2) < 0)? 0 : ((480 - _height) / 2);
+ _x = (((640 - _width) / 2) < 0) ? 0 : ((640 - _width) / 2);
+ _y = (((480 - _height) / 2) < 0) ? 0 : ((480 - _height) / 2);
}
_dstBuf = screenBuf + _y * SCREEN_WIDTH + _x;
_system = system;
@@ -139,11 +139,11 @@ bool ControlButton::isSaveslot() {
void ControlButton::draw() {
FrameHeader *fHead = _resMan->fetchFrame(_resMan->fetchRes(_resId), _frameIdx);
- uint8 *src = (uint8*)fHead + sizeof(FrameHeader);
+ uint8 *src = (uint8 *)fHead + sizeof(FrameHeader);
uint8 *dst = _dstBuf;
if (SwordEngine::isPsx() && _resId) {
- uint8 *HIFbuf = (uint8*)malloc(_resMan->readUint16(&fHead->height) * _resMan->readUint16(&fHead->width));
+ uint8 *HIFbuf = (uint8 *)malloc(_resMan->readUint16(&fHead->height) * _resMan->readUint16(&fHead->width));
memset(HIFbuf, 0, _resMan->readUint16(&fHead->height) * _resMan->readUint16(&fHead->width));
Screen::decompressHIF(src, HIFbuf);
src = HIFbuf;
@@ -163,24 +163,24 @@ void ControlButton::draw() {
src += _resMan->readUint16(&fHead->width);
}
else if (_resId == SR_DEATHPANEL) { // Check for death panel psx version (which is 1/3 of original width)
- for (uint16 cnt = 0; cnt < _resMan->readUint16(&fHead->height)/2; cnt++) {
+ for (uint16 cnt = 0; cnt < _resMan->readUint16(&fHead->height) / 2; cnt++) {
//Stretched panel is bigger than 640px, check we don't draw outside screen
- for (uint16 cntx = 0; (cntx < (_resMan->readUint16(&fHead->width))/3) && (cntx < (SCREEN_WIDTH-3) ); cntx++)
+ for (uint16 cntx = 0; (cntx < (_resMan->readUint16(&fHead->width)) / 3) && (cntx < (SCREEN_WIDTH - 3)); cntx++)
if (src[cntx]) {
dst[cntx * 3] = src[cntx];
dst[cntx * 3 + 1] = src[cntx];
dst[cntx * 3 + 2] = src[cntx];
}
- dst+= SCREEN_WIDTH;
+ dst += SCREEN_WIDTH;
- for (uint16 cntx = 0; cntx < (_resMan->readUint16(&fHead->width))/3; cntx++)
+ for (uint16 cntx = 0; cntx < (_resMan->readUint16(&fHead->width)) / 3; cntx++)
if (src[cntx]) {
dst[cntx * 3] = src[cntx];
dst[cntx * 3 + 1] = src[cntx];
dst[cntx * 3 + 2] = src[cntx];
}
dst += SCREEN_WIDTH;
- src += _resMan->readUint16(&fHead->width)/3;
+ src += _resMan->readUint16(&fHead->width) / 3;
}
} else { //save slots needs to be multiplied by 2 in height
for (uint16 cnt = 0; cnt < _resMan->readUint16(&fHead->height); cnt++) {
@@ -198,7 +198,7 @@ void ControlButton::draw() {
}
dst += SCREEN_WIDTH;
- src += _resMan->readUint16(&fHead->width)/2;
+ src += _resMan->readUint16(&fHead->width) / 2;
}
}
@@ -242,13 +242,13 @@ Control::Control(Common::SaveFileManager *saveFileMan, ResMan *pResMan, ObjectMa
}
void Control::askForCd() {
- _screenBuf = (uint8*)malloc(640 * 480);
+ _screenBuf = (uint8 *)malloc(640 * 480);
uint32 fontId = SR_FONT;
if (SwordEngine::_systemVars.language == BS1_CZECH)
fontId = CZECH_SR_FONT;
- _font = (uint8*)_resMan->openFetchRes(fontId);
- uint8 *pal = (uint8*)_resMan->openFetchRes(SR_PALETTE);
- uint8 *palOut = (uint8*)malloc(256 * 3);
+ _font = (uint8 *)_resMan->openFetchRes(fontId);
+ uint8 *pal = (uint8 *)_resMan->openFetchRes(SR_PALETTE);
+ uint8 *palOut = (uint8 *)malloc(256 * 3);
for (uint16 cnt = 1; cnt < 256; cnt++) {
palOut[cnt * 3 + 0] = pal[cnt * 3 + 0] << 2;
palOut[cnt * 3 + 1] = pal[cnt * 3 + 1] << 2;
@@ -262,7 +262,7 @@ void Control::askForCd() {
char fName[10];
uint8 textA[50];
sprintf(fName, "cd%d.id", SwordEngine::_systemVars.currentCD);
- sprintf((char*)textA, "%s%d", _lStrings[STR_INSERT_CD_A], SwordEngine::_systemVars.currentCD);
+ sprintf((char *)textA, "%s%d", _lStrings[STR_INSERT_CD_A], SwordEngine::_systemVars.currentCD);
bool notAccepted = true;
bool refreshText = true;
do {
@@ -304,7 +304,7 @@ uint8 Control::runPanel() {
_restoreBuf = NULL;
_keyPressed.reset();
_numButtons = 0;
- _screenBuf = (uint8*)malloc(640 * 480);
+ _screenBuf = (uint8 *)malloc(640 * 480);
memset(_screenBuf, 0, 640 * 480);
_system->copyRectToScreen(_screenBuf, 640, 0, 0, 640, 480);
_sound->quitScreen();
@@ -314,11 +314,11 @@ uint8 Control::runPanel() {
fontId = CZECH_SR_FONT;
redFontId = CZECH_SR_REDFONT;
}
- _font = (uint8*)_resMan->openFetchRes(fontId);
- _redFont = (uint8*)_resMan->openFetchRes(redFontId);
+ _font = (uint8 *)_resMan->openFetchRes(fontId);
+ _redFont = (uint8 *)_resMan->openFetchRes(redFontId);
- uint8 *pal = (uint8*)_resMan->openFetchRes(SR_PALETTE);
- uint8 *palOut = (uint8*)malloc(256 * 3);
+ uint8 *pal = (uint8 *)_resMan->openFetchRes(SR_PALETTE);
+ uint8 *palOut = (uint8 *)malloc(256 * 3);
for (uint16 cnt = 1; cnt < 256; cnt++) {
palOut[cnt * 3 + 0] = pal[cnt * 3 + 0] << 2;
palOut[cnt * 3 + 1] = pal[cnt * 3 + 1] << 2;
@@ -491,7 +491,7 @@ uint8 Control::handleButtonClick(uint8 id, uint8 mode, uint8 *retVal) {
else
return mode;
} else if ((id == BUTTON_RESTORE_PANEL) || (id == BUTTON_SAVE_PANEL) ||
- (id == BUTTON_DONE) || (id == BUTTON_VOLUME_PANEL))
+ (id == BUTTON_DONE) || (id == BUTTON_VOLUME_PANEL))
return id;
else if (id == BUTTON_TEXT) {
SwordEngine::_systemVars.showText ^= 1;
@@ -641,14 +641,14 @@ void Control::handleVolumeClicks() {
clickDest = 2;
else if (ABS(mouseDiffY) <= 8) // right
clickDest = 3;
- else // lower right
+ else // lower right
clickDest = 4;
} else if (mouseDiffX < -8) { // left part
if (mouseDiffY < -8) // upper left
clickDest = 8;
else if (ABS(mouseDiffY) <= 8) // left
clickDest = 7;
- else // lower left
+ else // lower left
clickDest = 6;
} else { // middle
if (mouseDiffY < -8)
@@ -754,9 +754,9 @@ bool Control::getConfirm(const uint8 *title) {
bool Control::keyAccepted(uint16 ascii) {
static const char allowedSpecials[] = ",.:-()?! \"\'";
if (((ascii >= 'A') && (ascii <= 'Z')) ||
- ((ascii >= 'a') && (ascii <= 'z')) ||
- ((ascii >= '0') && (ascii <= '9')) ||
- strchr(allowedSpecials, ascii))
+ ((ascii >= 'a') && (ascii <= 'z')) ||
+ ((ascii >= '0') && (ascii <= '9')) ||
+ strchr(allowedSpecials, ascii))
return true;
else
return false;
@@ -792,7 +792,7 @@ void Control::readSavegameDescriptions() {
char saveName[40];
Common::String pattern = "sword1.???";
Common::StringArray filenames = _saveFileMan->listSavefiles(pattern);
- sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
+ sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
_saveNames.clear();
@@ -811,7 +811,7 @@ void Control::readSavegameDescriptions() {
num++;
Common::InSaveFile *in = _saveFileMan->openForLoading(*file);
if (in) {
- in->readUint32LE(); // header
+ in->readUint32LE(); // header
in->read(saveName, 40);
_saveNames.push_back(saveName);
delete in;
@@ -860,9 +860,9 @@ void Control::checkForOldSaveGames() {
}
GUI::MessageDialog dialog0(
- _("ScummVM found that you have old savefiles for Broken Sword 1 that should be converted.\n"
- "The old save game format is no longer supported, so you will not be able to load your games if you don't convert them.\n\n"
- "Press OK to convert them now, otherwise you will be asked again the next time you start the game.\n"), _("OK"), _("Cancel"));
+ _("ScummVM found that you have old savefiles for Broken Sword 1 that should be converted.\n"
+ "The old save game format is no longer supported, so you will not be able to load your games if you don't convert them.\n\n"
+ "Press OK to convert them now, otherwise you will be asked again the next time you start the game.\n"), _("OK"), _("Cancel"));
int choice = dialog0.runModal();
if (choice == GUI::kMessageCancel) {
@@ -889,8 +889,8 @@ void Control::checkForOldSaveGames() {
}
} while ((ch != 10) && (ch != 255) && (!inf->eos()));
- if (pos > 1) // if the slot has a description
- convertSaveGame(slot, (char*)saveName);
+ if (pos > 1) // if the slot has a description
+ convertSaveGame(slot, (char *)saveName);
slot++;
} while ((ch != 255) && (!inf->eos()));
@@ -906,12 +906,12 @@ void Control::showSavegameNames() {
uint8 textMode = TEXT_LEFT_ALIGN;
uint16 ycoord = _saveButtons[cnt].y + 2;
uint8 str[40];
- sprintf((char*)str, "%d. %s", cnt + _saveScrollPos + 1, _saveNames[cnt + _saveScrollPos].c_str());
+ sprintf((char *)str, "%d. %s", cnt + _saveScrollPos + 1, _saveNames[cnt + _saveScrollPos].c_str());
if (cnt + _saveScrollPos == _selectedSavegame) {
textMode |= TEXT_RED_FONT;
ycoord += 2;
if (_cursorVisible)
- strcat((char*)str, "_");
+ strcat((char *)str, "_");
}
renderText(str, _saveButtons[cnt].x + 6, ycoord, textMode);
}
@@ -1013,7 +1013,7 @@ void Control::renderText(const uint8 *str, uint16 x, uint16 y, uint8 mode) {
uint8 *dst = _screenBuf + y * SCREEN_WIDTH + destX;
FrameHeader *chSpr = _resMan->fetchFrame(font, *str - 32);
- uint8 *sprData = (uint8*)chSpr + sizeof(FrameHeader);
+ uint8 *sprData = (uint8 *)chSpr + sizeof(FrameHeader);
uint8 *HIFbuf = NULL;
if (SwordEngine::isPsx()) { //Text fonts are compressed in psx version
@@ -1056,7 +1056,7 @@ void Control::renderVolumeBar(uint8 id, uint8 volL, uint8 volR) {
uint8 vol = (chCnt == 0) ? volL : volR;
FrameHeader *frHead = _resMan->fetchFrame(_resMan->openFetchRes(SR_VLIGHT), (vol + 15) >> 4);
uint8 *destMem = _screenBuf + destY * SCREEN_WIDTH + destX;
- uint8 *srcMem = (uint8*)frHead + sizeof(FrameHeader);
+ uint8 *srcMem = (uint8 *)frHead + sizeof(FrameHeader);
uint16 barHeight = _resMan->getUint16(frHead->height);
uint8 *psxVolBuf = NULL;
@@ -1135,7 +1135,7 @@ void Control::saveGameToFile(uint8 slot) {
outf->writeUint32LE(Logic::_scriptVars[cnt]);
uint32 playerSize = (sizeof(Object) - 12000) / 4;
- uint32 *playerRaw = (uint32*)cpt;
+ uint32 *playerRaw = (uint32 *)cpt;
for (uint32 cnt2 = 0; cnt2 < playerSize; cnt2++)
outf->writeUint32LE(playerRaw[cnt2]);
outf->finalize();
@@ -1163,7 +1163,7 @@ bool Control::restoreGameFromFile(uint8 slot) {
return false;
}
- inf->skip(40); // skip description
+ inf->skip(40); // skip description
uint8 saveVersion = inf->readByte();
if (saveVersion > SAVEGAME_VERSION) {
@@ -1176,8 +1176,8 @@ bool Control::restoreGameFromFile(uint8 slot) {
Graphics::skipThumbnail(*inf);
- inf->readUint32BE(); // save date
- inf->readUint16BE(); // save time
+ inf->readUint32BE(); // save date
+ inf->readUint16BE(); // save time
if (saveVersion < 2) { // Before version 2 we didn't had play time feature
g_engine->setTotalPlayTime(0);
@@ -1185,14 +1185,14 @@ bool Control::restoreGameFromFile(uint8 slot) {
g_engine->setTotalPlayTime(inf->readUint32BE() * 1000);
}
- _restoreBuf = (uint8*)malloc(
- TOTAL_SECTIONS * 2 +
- NUM_SCRIPT_VARS * 4 +
- (sizeof(Object) - 12000));
+ _restoreBuf = (uint8 *)malloc(
+ TOTAL_SECTIONS * 2 +
+ NUM_SCRIPT_VARS * 4 +
+ (sizeof(Object) - 12000));
- uint16 *liveBuf = (uint16*)_restoreBuf;
- uint32 *scriptBuf = (uint32*)(_restoreBuf + 2 * TOTAL_SECTIONS);
- uint32 *playerBuf = (uint32*)(_restoreBuf + 2 * TOTAL_SECTIONS + 4 * NUM_SCRIPT_VARS);
+ uint16 *liveBuf = (uint16 *)_restoreBuf;
+ uint32 *scriptBuf = (uint32 *)(_restoreBuf + 2 * TOTAL_SECTIONS);
+ uint32 *playerBuf = (uint32 *)(_restoreBuf + 2 * TOTAL_SECTIONS + 4 * NUM_SCRIPT_VARS);
for (cnt = 0; cnt < TOTAL_SECTIONS; cnt++)
liveBuf[cnt] = inf->readUint16LE();
@@ -1215,7 +1215,7 @@ bool Control::restoreGameFromFile(uint8 slot) {
return true;
}
-bool Control::convertSaveGame(uint8 slot, char* desc) {
+bool Control::convertSaveGame(uint8 slot, char *desc) {
char oldFileName[15];
char newFileName[40];
sprintf(oldFileName, "SAVEGAME.%03d", slot);
@@ -1230,8 +1230,8 @@ bool Control::convertSaveGame(uint8 slot, char* desc) {
delete testSave;
Common::String msg = Common::String::format(_("Target new save game already exists!\n"
- "Would you like to keep the old save game (%s) or the new one (%s)?\n"),
- oldFileName, newFileName);
+ "Would you like to keep the old save game (%s) or the new one (%s)?\n"),
+ oldFileName, newFileName);
GUI::MessageDialog dialog0(msg, _("Keep the old one"), _("Keep the new one"));
int choice = dialog0.runModal();
@@ -1299,17 +1299,17 @@ bool Control::convertSaveGame(uint8 slot, char* desc) {
void Control::doRestore() {
uint8 *bufPos = _restoreBuf;
- _objMan->loadLiveList((uint16*)bufPos);
+ _objMan->loadLiveList((uint16 *)bufPos);
bufPos += TOTAL_SECTIONS * 2;
for (uint16 cnt = 0; cnt < NUM_SCRIPT_VARS; cnt++) {
- Logic::_scriptVars[cnt] = *(uint32*)bufPos;
+ Logic::_scriptVars[cnt] = *(uint32 *)bufPos;
bufPos += 4;
}
uint32 playerSize = (sizeof(Object) - 12000) / 4;
- uint32 *playerRaw = (uint32*)_objMan->fetchObject(PLAYER);
+ uint32 *playerRaw = (uint32 *)_objMan->fetchObject(PLAYER);
Object *cpt = _objMan->fetchObject(PLAYER);
for (uint32 cnt2 = 0; cnt2 < playerSize; cnt2++) {
- *playerRaw = *(uint32*)bufPos;
+ *playerRaw = *(uint32 *)bufPos;
playerRaw++;
bufPos += 4;
}
diff --git a/engines/sword1/control.h b/engines/sword1/control.h
index 6c0cf8b1ef..a80ea05b03 100644
--- a/engines/sword1/control.h
+++ b/engines/sword1/control.h
@@ -101,7 +101,7 @@ public:
private:
int displayMessage(const char *altButton, const char *message, ...) GCC_PRINTF(3, 4);
- bool convertSaveGame(uint8 slot, char* desc);
+ bool convertSaveGame(uint8 slot, char *desc);
void showSavegameNames();
void deselectSaveslots();
uint8 *_restoreBuf;
@@ -142,7 +142,7 @@ private:
ControlButton *_buttons[MAX_BUTTONS];
static const ButtonInfo _deathButtons[3], _panelButtons[7], _saveButtons[16], _volumeButtons[4];
static const uint8 _languageStrings[8 * 20][43];
- const uint8 (*_lStrings)[43];
+ const uint8(*_lStrings)[43];
Common::SaveFileManager *_saveFileMan;
ObjectMan *_objMan;
ResMan *_resMan;
@@ -162,4 +162,3 @@ private:
} // End of namespace Sword1
#endif //BSCONTROL_H
-
diff --git a/engines/sword1/debug.h b/engines/sword1/debug.h
index e4f004dc63..1505ae28dd 100644
--- a/engines/sword1/debug.h
+++ b/engines/sword1/debug.h
@@ -39,4 +39,3 @@ private:
} // End of namespace Sword1
#endif // BSDEBUG_H
-
diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp
index 0c1e74082f..9d9f198f8b 100644
--- a/engines/sword1/detection.cpp
+++ b/engines/sword1/detection.cpp
@@ -48,7 +48,7 @@ static const PlainGameDescriptor sword1PSXDemoSettings =
// check these subdirectories (if present)
-static const char *g_dirNames[] = { "clusters", "speech", "english", "italian"};
+static const char *const g_dirNames[] = { "clusters", "speech", "english", "italian"};
#define NUM_COMMON_FILES_TO_CHECK 1
#define NUM_PC_FILES_TO_CHECK 3
@@ -59,7 +59,7 @@ static const char *g_dirNames[] = { "clusters", "speech", "english", "italian"};
#define NUM_MAC_DEMO_FILES_TO_CHECK 1
#define NUM_FILES_TO_CHECK NUM_COMMON_FILES_TO_CHECK + NUM_PC_FILES_TO_CHECK + NUM_MAC_FILES_TO_CHECK + NUM_PSX_FILES_TO_CHECK + NUM_DEMO_FILES_TO_CHECK + NUM_MAC_DEMO_FILES_TO_CHECK + NUM_PSX_DEMO_FILES_TO_CHECK
-static const char *g_filesToCheck[NUM_FILES_TO_CHECK] = { // these files have to be found
+static const char *const g_filesToCheck[NUM_FILES_TO_CHECK] = { // these files have to be found
"swordres.rif", // Mac, PC and PSX version
"general.clu", // PC and PSX version
"compacts.clu", // PC and PSX version
@@ -68,7 +68,7 @@ static const char *g_filesToCheck[NUM_FILES_TO_CHECK] = { // these files have to
"compacts.clm", // Mac version only
"scripts.clm", // Mac version only
"paris2.clm", // Mac version (full game only)
- "cows.mad", // this one should only exist in the demo version
+ "cows.mad", // this one should only exist in the demo version
"scripts.clm", // Mac version both demo and full game
"train.plx", // PSX version only
"speech.dat", // PSX version only
@@ -99,30 +99,30 @@ public:
bool SwordMetaEngine::hasFeature(MetaEngineFeature f) const {
return
- (f == kSupportsListSaves) ||
- (f == kSupportsLoadingDuringStartup) ||
- (f == kSupportsDeleteSave) ||
- (f == kSavesSupportMetaInfo) ||
- (f == kSavesSupportThumbnail) ||
- (f == kSavesSupportCreationDate) ||
- (f == kSavesSupportPlayTime);
+ (f == kSupportsListSaves) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail) ||
+ (f == kSavesSupportCreationDate) ||
+ (f == kSavesSupportPlayTime);
}
bool Sword1::SwordEngine::hasFeature(EngineFeature f) const {
return
- (f == kSupportsRTL) ||
- (f == kSupportsSavingDuringRuntime) ||
- (f == kSupportsLoadingDuringRuntime);
+ (f == kSupportsRTL) ||
+ (f == kSupportsSavingDuringRuntime) ||
+ (f == kSupportsLoadingDuringRuntime);
}
GameList SwordMetaEngine::getSupportedGames() const {
GameList games;
- games.push_back(GameDescriptor(sword1FullSettings, Common::GUIO_NOMIDI));
- games.push_back(GameDescriptor(sword1DemoSettings, Common::GUIO_NOMIDI));
- games.push_back(GameDescriptor(sword1MacFullSettings, Common::GUIO_NOMIDI));
- games.push_back(GameDescriptor(sword1MacDemoSettings, Common::GUIO_NOMIDI));
- games.push_back(GameDescriptor(sword1PSXSettings, Common::GUIO_NOMIDI));
- games.push_back(GameDescriptor(sword1PSXDemoSettings, Common::GUIO_NOMIDI));
+ games.push_back(GameDescriptor(sword1FullSettings, GUIO_NOMIDI));
+ games.push_back(GameDescriptor(sword1DemoSettings, GUIO_NOMIDI));
+ games.push_back(GameDescriptor(sword1MacFullSettings, GUIO_NOMIDI));
+ games.push_back(GameDescriptor(sword1MacDemoSettings, GUIO_NOMIDI));
+ games.push_back(GameDescriptor(sword1PSXSettings, GUIO_NOMIDI));
+ games.push_back(GameDescriptor(sword1PSXDemoSettings, GUIO_NOMIDI));
return games;
}
@@ -198,17 +198,17 @@ GameList SwordMetaEngine::detectGames(const Common::FSList &fslist) const {
psxDemoFilesFound = false;
if (mainFilesFound && pcFilesFound && demoFilesFound)
- detectedGames.push_back(GameDescriptor(sword1DemoSettings, Common::GUIO_NOMIDI));
+ detectedGames.push_back(GameDescriptor(sword1DemoSettings, GUIO1(GUIO_NOMIDI)));
else if (mainFilesFound && pcFilesFound && psxFilesFound)
- detectedGames.push_back(GameDescriptor(sword1PSXSettings, Common::GUIO_NOMIDI));
+ detectedGames.push_back(GameDescriptor(sword1PSXSettings, GUIO1(GUIO_NOMIDI)));
else if (mainFilesFound && pcFilesFound && psxDemoFilesFound)
- detectedGames.push_back(GameDescriptor(sword1PSXDemoSettings, Common::GUIO_NOMIDI));
+ detectedGames.push_back(GameDescriptor(sword1PSXDemoSettings, GUIO1(GUIO_NOMIDI)));
else if (mainFilesFound && pcFilesFound && !psxFilesFound)
- detectedGames.push_back(GameDescriptor(sword1FullSettings, Common::GUIO_NOMIDI));
+ detectedGames.push_back(GameDescriptor(sword1FullSettings, GUIO1(GUIO_NOMIDI)));
else if (mainFilesFound && macFilesFound)
- detectedGames.push_back(GameDescriptor(sword1MacFullSettings, Common::GUIO_NOMIDI));
+ detectedGames.push_back(GameDescriptor(sword1MacFullSettings, GUIO1(GUIO_NOMIDI)));
else if (mainFilesFound && macDemoFilesFound)
- detectedGames.push_back(GameDescriptor(sword1MacDemoSettings, Common::GUIO_NOMIDI));
+ detectedGames.push_back(GameDescriptor(sword1MacDemoSettings, GUIO1(GUIO_NOMIDI)));
return detectedGames;
}
@@ -225,7 +225,7 @@ SaveStateList SwordMetaEngine::listSaves(const char *target) const {
char saveName[40];
Common::StringArray filenames = saveFileMan->listSavefiles("sword1.???");
- sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
+ sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
int slotNum = 0;
for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
@@ -235,7 +235,7 @@ SaveStateList SwordMetaEngine::listSaves(const char *target) const {
if (slotNum >= 0 && slotNum <= 999) {
Common::InSaveFile *in = saveFileMan->openForLoading(*file);
if (in) {
- in->readUint32LE(); // header
+ in->readUint32LE(); // header
in->read(saveName, 40);
saveList.push_back(SaveStateDescriptor(slotNum, saveName));
delete in;
@@ -261,9 +261,9 @@ SaveStateDescriptor SwordMetaEngine::querySaveMetaInfos(const char *target, int
Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(fileName);
if (in) {
- in->skip(4); // header
+ in->skip(4); // header
in->read(name, sizeof(name));
- in->read(&versionSave, 1); // version
+ in->read(&versionSave, 1); // version
SaveStateDescriptor desc(slot, name);
@@ -274,13 +274,7 @@ SaveStateDescriptor SwordMetaEngine::querySaveMetaInfos(const char *target, int
in->skip(1);
if (Graphics::checkThumbnailHeader(*in)) {
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- if (!Graphics::loadThumbnail(*in, *thumbnail)) {
- delete thumbnail;
- thumbnail = 0;
- }
-
+ Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in);
desc.setThumbnail(thumbnail);
}
@@ -329,7 +323,7 @@ Common::Error SwordEngine::loadGameState(int slot) {
reinitialize();
_control->doRestore();
reinitRes();
- return Common::kNoError; // TODO: return success/failure
+ return Common::kNoError; // TODO: return success/failure
}
bool SwordEngine::canLoadGameStateCurrently() {
@@ -339,7 +333,7 @@ bool SwordEngine::canLoadGameStateCurrently() {
Common::Error SwordEngine::saveGameState(int slot, const Common::String &desc) {
_control->setSaveDescription(slot, desc.c_str());
_control->saveGameToFile(slot);
- return Common::kNoError; // TODO: return success/failure
+ return Common::kNoError; // TODO: return success/failure
}
bool SwordEngine::canSaveGameStateCurrently() {
diff --git a/engines/sword1/eventman.cpp b/engines/sword1/eventman.cpp
index d95adebd86..113151bfd5 100644
--- a/engines/sword1/eventman.cpp
+++ b/engines/sword1/eventman.cpp
@@ -44,14 +44,14 @@ void EventManager::checkForEvent(Object *compact) {
if (compact->o_event_list[objCnt].o_event)
for (uint8 globCnt = 0; globCnt < TOTAL_EVENT_SLOTS; globCnt++) {
if (_eventPendingList[globCnt].delay &&
- (_eventPendingList[globCnt].eventNumber == compact->o_event_list[objCnt].o_event)) {
- compact->o_logic = LOGIC_script; //force into script mode
- _eventPendingList[globCnt].delay = 0; //started, so remove from queue
- compact->o_tree.o_script_level++;
- compact->o_tree.o_script_id[compact->o_tree.o_script_level] =
- compact->o_event_list[objCnt].o_event_script;
- compact->o_tree.o_script_pc[compact->o_tree.o_script_level] =
- compact->o_event_list[objCnt].o_event_script;
+ (_eventPendingList[globCnt].eventNumber == compact->o_event_list[objCnt].o_event)) {
+ compact->o_logic = LOGIC_script; //force into script mode
+ _eventPendingList[globCnt].delay = 0; //started, so remove from queue
+ compact->o_tree.o_script_level++;
+ compact->o_tree.o_script_id[compact->o_tree.o_script_level] =
+ compact->o_event_list[objCnt].o_event_script;
+ compact->o_tree.o_script_pc[compact->o_tree.o_script_level] =
+ compact->o_event_list[objCnt].o_event_script;
}
}
}
@@ -60,7 +60,7 @@ void EventManager::checkForEvent(Object *compact) {
bool EventManager::eventValid(int32 event) {
for (uint8 slot = 0; slot < TOTAL_EVENT_SLOTS; slot++)
if ((_eventPendingList[slot].eventNumber == event) &&
- (_eventPendingList[slot].delay))
+ (_eventPendingList[slot].delay))
return true;
return false;
}
@@ -76,15 +76,15 @@ int EventManager::fnCheckForEvent(Object *cpt, int32 id, int32 pause) {
if (cpt->o_event_list[objCnt].o_event)
for (uint8 globCnt = 0; globCnt < TOTAL_EVENT_SLOTS; globCnt++) {
if (_eventPendingList[globCnt].delay &&
- (_eventPendingList[globCnt].eventNumber == cpt->o_event_list[objCnt].o_event)) {
- cpt->o_logic = LOGIC_script; //force into script mode
- _eventPendingList[globCnt].delay = 0; //started, so remove from queue
- cpt->o_tree.o_script_level++;
- cpt->o_tree.o_script_id[cpt->o_tree.o_script_level] =
- cpt->o_event_list[objCnt].o_event_script;
- cpt->o_tree.o_script_pc[cpt->o_tree.o_script_level] =
- cpt->o_event_list[objCnt].o_event_script;
- return SCRIPT_STOP;
+ (_eventPendingList[globCnt].eventNumber == cpt->o_event_list[objCnt].o_event)) {
+ cpt->o_logic = LOGIC_script; //force into script mode
+ _eventPendingList[globCnt].delay = 0; //started, so remove from queue
+ cpt->o_tree.o_script_level++;
+ cpt->o_tree.o_script_id[cpt->o_tree.o_script_level] =
+ cpt->o_event_list[objCnt].o_event_script;
+ cpt->o_tree.o_script_pc[cpt->o_tree.o_script_level] =
+ cpt->o_event_list[objCnt].o_event_script;
+ return SCRIPT_STOP;
}
}
}
diff --git a/engines/sword1/logic.cpp b/engines/sword1/logic.cpp
index 5b42c9340e..d1c69c80ff 100644
--- a/engines/sword1/logic.cpp
+++ b/engines/sword1/logic.cpp
@@ -89,14 +89,14 @@ void Logic::initialize() {
delete _textMan;
_textMan = new Text(_objMan, _resMan,
- (SwordEngine::_systemVars.language == BS1_CZECH) ? true : false);
+ (SwordEngine::_systemVars.language == BS1_CZECH) ? true : false);
_screen->useTextManager(_textMan);
_textRunning = _speechRunning = false;
_speechFinished = true;
}
void Logic::newScreen(uint32 screen) {
- Object *compact = (Object*)_objMan->fetchObject(PLAYER);
+ Object *compact = (Object *)_objMan->fetchObject(PLAYER);
// work around script bug #911508
if (((screen == 25) || (_scriptVars[SCREEN] == 25)) && (_scriptVars[SAND_FLAG] == 4)) {
@@ -115,15 +115,15 @@ void Logic::newScreen(uint32 screen) {
if (SwordEngine::_systemVars.justRestoredGame) { // if we've just restored a game - we want George to be exactly as saved
fnAddHuman(NULL, 0, 0, 0, 0, 0, 0, 0);
if (_scriptVars[GEORGE_WALKING]) { // except that if George was walking when we saveed the game
- fnStandAt(compact, PLAYER, _scriptVars[CHANGE_X], _scriptVars[CHANGE_Y], _scriptVars[CHANGE_DIR], _scriptVars[CHANGE_STANCE], 0,0);
- fnIdle(compact,PLAYER,0,0,0,0,0,0);
+ fnStandAt(compact, PLAYER, _scriptVars[CHANGE_X], _scriptVars[CHANGE_Y], _scriptVars[CHANGE_DIR], _scriptVars[CHANGE_STANCE], 0, 0);
+ fnIdle(compact, PLAYER, 0, 0, 0, 0, 0, 0);
_scriptVars[GEORGE_WALKING] = 0;
}
SwordEngine::_systemVars.justRestoredGame = 0;
_music->startMusic(_scriptVars[CURRENT_MUSIC], 1);
} else { // if we haven't just restored a game, set George to stand, etc
compact->o_screen = _scriptVars[NEW_SCREEN]; //move the mega/player at this point between screens
- fnStandAt(compact, PLAYER, _scriptVars[CHANGE_X], _scriptVars[CHANGE_Y], _scriptVars[CHANGE_DIR], _scriptVars[CHANGE_STANCE], 0,0);
+ fnStandAt(compact, PLAYER, _scriptVars[CHANGE_X], _scriptVars[CHANGE_Y], _scriptVars[CHANGE_DIR], _scriptVars[CHANGE_STANCE], 0, 0);
fnChangeFloor(compact, PLAYER, _scriptVars[CHANGE_PLACE], 0, 0, 0, 0, 0);
}
}
@@ -227,7 +227,7 @@ void Logic::processLogic(Object *compact, uint32 id) {
case LOGIC_restart:
compact->o_tree.o_script_pc[compact->o_tree.o_script_level] = compact->o_tree.o_script_id[compact->o_tree.o_script_level];
compact->o_logic = LOGIC_script;
- logicRet=1;
+ logicRet = 1;
break;
case LOGIC_bookmark:
memcpy(&(compact->o_tree.o_script_level), &(compact->o_bookmark.o_script_level), sizeof(ScriptTree));
@@ -293,41 +293,41 @@ int Logic::logicArAnimate(Object *compact, uint32 id) {
compact->o_status |= STAT_SHRINK;
route = compact->o_route;
- walkPc =compact->o_walk_pc;
- compact->o_frame =route[walkPc].frame;
- compact->o_dir =route[walkPc].dir;
- compact->o_xcoord =route[walkPc].x;
- compact->o_ycoord =route[walkPc].y;
- compact->o_anim_x =compact->o_xcoord;
- compact->o_anim_y =compact->o_ycoord;
+ walkPc = compact->o_walk_pc;
+ compact->o_frame = route[walkPc].frame;
+ compact->o_dir = route[walkPc].dir;
+ compact->o_xcoord = route[walkPc].x;
+ compact->o_ycoord = route[walkPc].y;
+ compact->o_anim_x = compact->o_xcoord;
+ compact->o_anim_y = compact->o_ycoord;
if (((_scriptVars[GEORGE_WALKING] == 2) && (walkPc > 5) && (id == PLAYER) &&
- (route[walkPc - 1].step == 5) && (route[walkPc].step == 0)) ||
- ((_scriptVars[GEORGE_WALKING] == 3) && (id == PLAYER))) {
-
- compact->o_frame = 96 + compact->o_dir; //reset
- if ((compact->o_dir != 2) && (compact->o_dir != 6)) { // on verticals and diagonals stand where george is
- compact->o_xcoord = route[walkPc - 1].x;
- compact->o_ycoord = route[walkPc - 1].y;
- compact->o_anim_x = compact->o_xcoord;
- compact->o_anim_y = compact->o_ycoord;
- }
- compact->o_logic = LOGIC_script;
- compact->o_down_flag = 0; //0 means error
- _scriptVars[GEORGE_WALKING] = 0;
- route[compact->o_walk_pc+1].frame = 512; //end of sequence
- if (_scriptVars[MEGA_ON_GRID] == 2)
- _scriptVars[MEGA_ON_GRID] = 0;
+ (route[walkPc - 1].step == 5) && (route[walkPc].step == 0)) ||
+ ((_scriptVars[GEORGE_WALKING] == 3) && (id == PLAYER))) {
+
+ compact->o_frame = 96 + compact->o_dir; //reset
+ if ((compact->o_dir != 2) && (compact->o_dir != 6)) { // on verticals and diagonals stand where george is
+ compact->o_xcoord = route[walkPc - 1].x;
+ compact->o_ycoord = route[walkPc - 1].y;
+ compact->o_anim_x = compact->o_xcoord;
+ compact->o_anim_y = compact->o_ycoord;
+ }
+ compact->o_logic = LOGIC_script;
+ compact->o_down_flag = 0; //0 means error
+ _scriptVars[GEORGE_WALKING] = 0;
+ route[compact->o_walk_pc + 1].frame = 512; //end of sequence
+ if (_scriptVars[MEGA_ON_GRID] == 2)
+ _scriptVars[MEGA_ON_GRID] = 0;
}
compact->o_walk_pc++;
- if (route[compact->o_walk_pc].frame == 512) { //end of sequence
+ if (route[compact->o_walk_pc].frame == 512) { //end of sequence
compact->o_logic = LOGIC_script;
if (((_scriptVars[GEORGE_WALKING] == 2) || (_scriptVars[GEORGE_WALKING] == 1)) &&
- (id == PLAYER)) {
- _scriptVars[GEORGE_WALKING] = 0;
- if (_scriptVars[MEGA_ON_GRID] == 2)
- _scriptVars[MEGA_ON_GRID] = 0;
+ (id == PLAYER)) {
+ _scriptVars[GEORGE_WALKING] = 0;
+ if (_scriptVars[MEGA_ON_GRID] == 2)
+ _scriptVars[MEGA_ON_GRID] = 0;
}
}
return 0;
@@ -360,16 +360,16 @@ int Logic::speechDriver(Object *compact) {
_speechFinished = true;
}
if (compact->o_anim_resource) {
- uint8 *animData = ((uint8*)_resMan->openFetchRes(compact->o_anim_resource)) + sizeof(Header);
+ uint8 *animData = ((uint8 *)_resMan->openFetchRes(compact->o_anim_resource)) + sizeof(Header);
int32 numFrames = _resMan->readUint32(animData);
animData += 4;
compact->o_anim_pc++; // go to next frame of anim
if (_speechFinished || (compact->o_anim_pc >= numFrames) ||
- (_speechRunning && (_sound->amISpeaking() == 0)))
- compact->o_anim_pc = 0; //set to frame 0, closed mouth
+ (_speechRunning && (_sound->amISpeaking() == 0)))
+ compact->o_anim_pc = 0; //set to frame 0, closed mouth
- AnimUnit *animPtr = (AnimUnit*)(animData + sizeof(AnimUnit) * compact->o_anim_pc);
+ AnimUnit *animPtr = (AnimUnit *)(animData + sizeof(AnimUnit) * compact->o_anim_pc);
if (!(compact->o_status & STAT_SHRINK)) {
compact->o_anim_x = _resMan->getUint32(animPtr->animX);
compact->o_anim_y = _resMan->getUint32(animPtr->animY);
@@ -385,10 +385,10 @@ int Logic::fullAnimDriver(Object *compact) {
compact->o_logic = LOGIC_script;
return 1;
}
- uint8 *data = ((uint8*)_resMan->openFetchRes(compact->o_anim_resource)) + sizeof(Header);
+ uint8 *data = ((uint8 *)_resMan->openFetchRes(compact->o_anim_resource)) + sizeof(Header);
uint32 numFrames = _resMan->readUint32(data);
data += 4;
- AnimUnit *animPtr = (AnimUnit*)(data + compact->o_anim_pc * sizeof(AnimUnit));
+ AnimUnit *animPtr = (AnimUnit *)(data + compact->o_anim_pc * sizeof(AnimUnit));
compact->o_anim_x = compact->o_xcoord = _resMan->getUint32(animPtr->animX);
compact->o_anim_y = compact->o_ycoord = _resMan->getUint32(animPtr->animY);
@@ -407,9 +407,9 @@ int Logic::animDriver(Object *compact) {
compact->o_logic = LOGIC_script;
return 1;
}
- uint8 *data = ((uint8*)_resMan->openFetchRes(compact->o_anim_resource)) + sizeof(Header);
+ uint8 *data = ((uint8 *)_resMan->openFetchRes(compact->o_anim_resource)) + sizeof(Header);
uint32 numFrames = _resMan->readUint32(data);
- AnimUnit *animPtr = (AnimUnit*)(data + 4 + compact->o_anim_pc * sizeof(AnimUnit));
+ AnimUnit *animPtr = (AnimUnit *)(data + 4 + compact->o_anim_pc * sizeof(AnimUnit));
if (!(compact->o_status & STAT_SHRINK)) {
compact->o_anim_x = _resMan->getUint32(animPtr->animX);
@@ -426,9 +426,9 @@ int Logic::animDriver(Object *compact) {
}
void Logic::updateScreenParams() {
- Object *compact = (Object*)_objMan->fetchObject(PLAYER);
+ Object *compact = (Object *)_objMan->fetchObject(PLAYER);
_screen->setScrolling((int16)(compact->o_xcoord - _scriptVars[FEET_X]),
- (int16)(compact->o_ycoord - _scriptVars[FEET_Y]));
+ (int16)(compact->o_ycoord - _scriptVars[FEET_Y]));
}
int Logic::scriptManager(Object *compact, uint32 id) {
@@ -465,7 +465,7 @@ void Logic::runMouseScript(Object *cpt, int32 scriptId) {
}
int Logic::interpretScript(Object *compact, int id, Header *scriptModule, int scriptBase, int scriptNum) {
- int32 *scriptCode = (int32*)(((uint8*)scriptModule) + sizeof(Header));
+ int32 *scriptCode = (int32 *)(((uint8 *)scriptModule) + sizeof(Header));
int32 stack[MAX_STACK_SIZE];
int32 stackIdx = 0;
int32 offset;
@@ -609,7 +609,7 @@ int Logic::interpretScript(Object *compact, int id, Header *scriptModule, int sc
debug(9, "IT_SCRIPTEND");
return 0;
case IT_POPVAR: // pop a variable
- debug(9, "IT_POPVAR: ScriptVars[%d] = %d", scriptCode[pc], stack[stackIdx-1]);
+ debug(9, "IT_POPVAR: ScriptVars[%d] = %d", scriptCode[pc], stack[stackIdx - 1]);
varNum = scriptCode[pc++];
if (SwordEngine::_systemVars.isDemo && SwordEngine::isPc()) {
if (varNum >= 397) // BS1 Demo has different number of script variables
@@ -622,15 +622,15 @@ int Logic::interpretScript(Object *compact, int id, Header *scriptModule, int sc
case IT_POPLONGOFFSET:
offset = scriptCode[pc++];
debug(9, "IT_POPLONGOFFSET: Cpt[%d] = %d", offset, stack[stackIdx - 1]);
- *((int32 *)((uint8*)compact + offset)) = stack[--stackIdx];
+ *((int32 *)((uint8 *)compact + offset)) = stack[--stackIdx];
break;
case IT_PUSHLONGOFFSET:
offset = scriptCode[pc++];
- debug(9, "IT_PUSHLONGOFFSET: PUSH Cpt[%d] (==%d)", offset, *((int32 *)((uint8*)compact + offset)));
- stack[stackIdx++] = *((int32 *)((uint8*)compact + offset));
+ debug(9, "IT_PUSHLONGOFFSET: PUSH Cpt[%d] (==%d)", offset, *((int32 *)((uint8 *)compact + offset)));
+ stack[stackIdx++] = *((int32 *)((uint8 *)compact + offset));
break;
case IT_SKIPONFALSE:
- debug(9, "IT_SKIPONFALSE: %d (%s)", scriptCode[pc], (stack[stackIdx-1] ? "IS TRUE (NOT SKIPPED)" : "IS FALSE (SKIPPED)"));
+ debug(9, "IT_SKIPONFALSE: %d (%s)", scriptCode[pc], (stack[stackIdx - 1] ? "IS TRUE (NOT SKIPPED)" : "IS FALSE (SKIPPED)"));
if (stack[--stackIdx])
pc++;
else
@@ -645,12 +645,12 @@ int Logic::interpretScript(Object *compact, int id, Header *scriptModule, int sc
{
int switchValue = stack[--stackIdx];
int switchCount = scriptCode[pc++];
- int doneSwitch=0;
+ int doneSwitch = 0;
- for (int cnt = 0; (cnt < switchCount) && (doneSwitch==0); cnt++) {
+ for (int cnt = 0; (cnt < switchCount) && (doneSwitch == 0); cnt++) {
if (switchValue == scriptCode[pc]) {
- pc += scriptCode[pc+1];
- doneSwitch=1;
+ pc += scriptCode[pc + 1];
+ doneSwitch = 1;
} else
pc += 2;
}
@@ -659,7 +659,7 @@ int Logic::interpretScript(Object *compact, int id, Header *scriptModule, int sc
}
break;
case IT_SKIPONTRUE: // skip if expression true
- debug(9, "IT_SKIPONTRUE: %d (%s)", scriptCode[pc], (stack[stackIdx-1] ? "IS TRUE (SKIPPED)" : "IS FALSE (NOT SKIPPED)"));
+ debug(9, "IT_SKIPONTRUE: %d (%s)", scriptCode[pc], (stack[stackIdx - 1] ? "IS TRUE (SKIPPED)" : "IS FALSE (NOT SKIPPED)"));
stackIdx--;
if (stack[stackIdx])
pc += scriptCode[pc];
@@ -667,7 +667,7 @@ int Logic::interpretScript(Object *compact, int id, Header *scriptModule, int sc
pc++;
break;
case IT_PRINTF:
- debug(0, "IT_PRINTF(%d)",stack[stackIdx]);
+ debug(0, "IT_PRINTF(%d)", stack[stackIdx]);
break;
case IT_RESTARTSCRIPT:
debug(9, "IT_RESTARTSCRIPT");
@@ -676,16 +676,16 @@ int Logic::interpretScript(Object *compact, int id, Header *scriptModule, int sc
case IT_POPWORDOFFSET:
offset = scriptCode[pc++];
debug(9, "IT_POPWORDOFFSET: Cpt[%d] = %d", offset, stack[stackIdx - 1] & 0xFFFF);
- *((int32 *)((uint8*)compact + offset)) = stack[--stackIdx] & 0xffff;
+ *((int32 *)((uint8 *)compact + offset)) = stack[--stackIdx] & 0xffff;
break;
case IT_PUSHWORDOFFSET:
offset = scriptCode[pc++];
- debug(9, "IT_PUSHWORDOFFSET: PUSH Cpt[%d] == %d", offset, (*((int32 *)((uint8*)compact + offset))) & 0xffff);
- stack[stackIdx++] = (*((int32 *)((uint8*)compact + offset))) & 0xffff;
+ debug(9, "IT_PUSHWORDOFFSET: PUSH Cpt[%d] == %d", offset, (*((int32 *)((uint8 *)compact + offset))) & 0xffff);
+ stack[stackIdx++] = (*((int32 *)((uint8 *)compact + offset))) & 0xffff;
break;
default:
- error("Invalid operator %d",scriptCode[pc-1]);
- return 0; // for compilers that don't support NORETURN
+ error("Invalid operator %d", scriptCode[pc - 1]);
+ return 0; // for compilers that don't support NORETURN
}
}
}
@@ -831,7 +831,7 @@ int Logic::fnAnim(Object *cpt, int32 id, int32 cdt, int32 spr, int32 e, int32 f,
AnimSet *animTab;
if (cdt && (!spr)) {
- animTab = (AnimSet*)((uint8*)_resMan->openFetchRes(cdt) + sizeof(Header));
+ animTab = (AnimSet *)((uint8 *)_resMan->openFetchRes(cdt) + sizeof(Header));
animTab += cpt->o_dir;
cpt->o_anim_resource = _resMan->getUint32(animTab->cdt);
@@ -865,13 +865,13 @@ int Logic::fnSetFrame(Object *cpt, int32 id, int32 cdt, int32 spr, int32 frameNo
AnimUnit *animPtr;
- uint8 *data = (uint8*)_resMan->openFetchRes(cdt);
+ uint8 *data = (uint8 *)_resMan->openFetchRes(cdt);
data += sizeof(Header);
if (frameNo == LAST_FRAME)
frameNo = _resMan->readUint32(data) - 1;
data += 4;
- animPtr = (AnimUnit*)(data + frameNo * sizeof(AnimUnit));
+ animPtr = (AnimUnit *)(data + frameNo * sizeof(AnimUnit));
cpt->o_anim_x = _resMan->getUint32(animPtr->animX);
cpt->o_anim_y = _resMan->getUint32(animPtr->animY);
@@ -895,13 +895,13 @@ int Logic::fnFullAnim(Object *cpt, int32 id, int32 anim, int32 graphic, int32 e,
}
int Logic::fnFullSetFrame(Object *cpt, int32 id, int32 cdt, int32 spr, int32 frameNo, int32 f, int32 z, int32 x) {
- uint8 *data = (uint8*)_resMan->openFetchRes(cdt) + sizeof(Header);
+ uint8 *data = (uint8 *)_resMan->openFetchRes(cdt) + sizeof(Header);
if (frameNo == LAST_FRAME)
frameNo = _resMan->readUint32(data) - 1;
data += 4;
- AnimUnit *animPtr = (AnimUnit*)(data + sizeof(AnimUnit) * frameNo);
+ AnimUnit *animPtr = (AnimUnit *)(data + sizeof(AnimUnit) * frameNo);
cpt->o_anim_x = cpt->o_xcoord = _resMan->getUint32(animPtr->animX);
cpt->o_anim_y = cpt->o_ycoord = _resMan->getUint32(animPtr->animY);
cpt->o_frame = _resMan->getUint32(animPtr->animFrame);
@@ -1115,7 +1115,7 @@ int Logic::fnISpeak(Object *cpt, int32 id, int32 cdt, int32 textNo, int32 spr, i
// first setup the talk animation
if (cdt && (!spr)) { // if 'cdt' is non-zero but 'spr' is zero - 'cdt' is an anim table tag
- AnimSet *animTab = (AnimSet*)((uint8*)_resMan->openFetchRes(cdt) + sizeof(Header));
+ AnimSet *animTab = (AnimSet *)((uint8 *)_resMan->openFetchRes(cdt) + sizeof(Header));
animTab += cpt->o_dir;
cpt->o_anim_resource = _resMan->getUint32(animTab->cdt);
@@ -1152,10 +1152,10 @@ int Logic::fnISpeak(Object *cpt, int32 id, int32 cdt, int32 textNo, int32 spr, i
char *text = _objMan->lockText(textNo);
cpt->o_speech_time = strlen(text) + 5;
- uint32 textCptId = _textMan->lowTextManager((uint8*)text, cpt->o_speech_width, (uint8)cpt->o_speech_pen);
+ uint32 textCptId = _textMan->lowTextManager((uint8 *)text, cpt->o_speech_width, (uint8)cpt->o_speech_pen);
_objMan->unlockText(textNo);
- Object * textCpt = _objMan->fetchObject(textCptId);
+ Object *textCpt = _objMan->fetchObject(textCptId);
textCpt->o_screen = cpt->o_screen;
textCpt->o_target = textCptId;
@@ -1189,8 +1189,8 @@ int Logic::fnISpeak(Object *cpt, int32 id, int32 cdt, int32 textNo, int32 spr, i
textTopMargin = SCREEN_TOP_EDGE + TEXT_MARGIN + _scriptVars[SCROLL_OFFSET_Y];
textBottomMargin = SCREEN_BOTTOM_EDGE - TEXT_MARGIN + _scriptVars[SCROLL_OFFSET_Y] - textSpriteHeight;
- textCpt->o_anim_x = textCpt->o_xcoord = inRange(textLeftMargin, textX, textRightMargin);
- textCpt->o_anim_y = textCpt->o_ycoord = inRange(textTopMargin, textY, textBottomMargin);
+ textCpt->o_anim_x = textCpt->o_xcoord = CLIP<uint16>(textX, textLeftMargin, textRightMargin);
+ textCpt->o_anim_y = textCpt->o_ycoord = CLIP<uint16>(textY, textTopMargin, textBottomMargin);
}
return SCRIPT_STOP;
}
@@ -1247,7 +1247,7 @@ int Logic::fnChangeSpeechText(Object *cpt, int32 id, int32 tar, int32 width, int
//The game is halted for debugging. Maybe we'll remove this later.
int Logic::fnTalkError(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x) {
error("fnTalkError for id %d, instruction %d", id, cpt->o_down_flag);
- return SCRIPT_STOP; // for compilers that don't support NORETURN
+ return SCRIPT_STOP; // for compilers that don't support NORETURN
}
int Logic::fnStartTalk(Object *cpt, int32 id, int32 target, int32 d, int32 e, int32 f, int32 z, int32 x) {
@@ -1414,12 +1414,12 @@ int Logic::fnWalk(Object *cpt, int32 id, int32 x, int32 y, int32 dir, int32 stan
int32 target = _scriptVars[CLICK_ID];
// exceptions: compacts that use hand pointers but are not actually exits
if ((target != LEFT_SCROLL_POINTER) && (target != RIGHT_SCROLL_POINTER) &&
- (target != FLOOR_63) && (target != ROOF_63) && (target != GUARD_ROOF_63) &&
- (target != LEFT_TREE_POINTER_71) && (target != RIGHT_TREE_POINTER_71)) {
+ (target != FLOOR_63) && (target != ROOF_63) && (target != GUARD_ROOF_63) &&
+ (target != LEFT_TREE_POINTER_71) && (target != RIGHT_TREE_POINTER_71)) {
target = _objMan->fetchObject(_scriptVars[CLICK_ID])->o_mouse_on;
if ((target >= SCR_exit0) && (target <= SCR_exit9)) {
- fnStandAt(cpt,id,x,y,dir,stance,0,0);
+ fnStandAt(cpt, id, x, y, dir, stance, 0, 0);
return SCRIPT_STOP;
}
}
@@ -1439,13 +1439,13 @@ int Logic::fnTurn(Object *cpt, int32 id, int32 dir, int32 stance, int32 c, int32
dir = 9;
int route = _router->routeFinder(id, cpt, cpt->o_xcoord, cpt->o_ycoord, dir);
- if (route)
- cpt->o_down_flag = 1; //1 means ok
+ if (route)
+ cpt->o_down_flag = 1; //1 means ok
else
- cpt->o_down_flag = 0; //0 means error
+ cpt->o_down_flag = 0; //0 means error
cpt->o_logic = LOGIC_AR_animate;
- cpt->o_walk_pc = 0; //reset
+ cpt->o_walk_pc = 0; //reset
return SCRIPT_STOP;
}
@@ -1602,7 +1602,7 @@ int Logic::fnStopMusic(Object *cpt, int32 id, int32 a, int32 b, int32 c, int32 d
int Logic::fnInnerSpace(Object *cpt, int32 id, int32 a, int32 b, int32 c, int32 d, int32 z, int32 x) {
error("fnInnerSpace() not working");
- return SCRIPT_STOP; // for compilers that don't support NORETURN
+ return SCRIPT_STOP; // for compilers that don't support NORETURN
}
int Logic::fnSetScreen(Object *cpt, int32 id, int32 target, int32 screen, int32 c, int32 d, int32 z, int32 x) {
@@ -1689,10 +1689,6 @@ int Logic::fnBlack(Object *cpt, int32 id, int32 a, int32 b, int32 c, int32 d, in
return SCRIPT_CONT;
}
-uint16 Logic::inRange(uint16 a, uint16 b, uint16 c) {
- return (a > b)? a : (((b > c) ? c : b));
-}
-
void Logic::startPosCallFn(uint8 fnId, uint32 param1, uint32 param2, uint32 param3) {
Object *obj = NULL;
switch (fnId) {
@@ -1789,7 +1785,7 @@ void Logic::startPositions(uint32 pos) {
if (pos == 0)
pos = 1;
Object *compact = _objMan->fetchObject(PLAYER);
- fnEnterSection(compact, PLAYER, pos, 0, 0, 0, 0, 0); // (automatically opens the compact resource for that section)
+ fnEnterSection(compact, PLAYER, pos, 0, 0, 0, 0, 0); // (automatically opens the compact resource for that section)
SwordEngine::_systemVars.controlPanelMode = CP_NORMAL;
SwordEngine::_systemVars.wantFade = true;
}
diff --git a/engines/sword1/logic.h b/engines/sword1/logic.h
index 13ddbc989b..a146d340cf 100644
--- a/engines/sword1/logic.h
+++ b/engines/sword1/logic.h
@@ -35,7 +35,7 @@ class OSystem;
namespace Sword1 {
#define NON_ZERO_SCRIPT_VARS 95
-#define NUM_SCRIPT_VARS 1179
+#define NUM_SCRIPT_VARS 1179
class SwordEngine;
class Text;
@@ -63,7 +63,7 @@ public:
static uint32 _scriptVars[NUM_SCRIPT_VARS];
// public for mouse (menu looking)
- int cfnPresetScript (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int cfnPresetScript(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
private:
SwordEngine *_vm;
ObjectMan *_objMan;
@@ -97,118 +97,116 @@ private:
void setupMcodeTable();
const BSMcodeTable *_mcodeTable;
- uint16 inRange(uint16 a, uint16 b, uint16 c);
-
//- mcodeTable:
- int fnBackground (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnForeground (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSort (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnNoSprite (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnMegaSet (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnAnim (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSetFrame (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnFullAnim (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnFullSetFrame (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnFadeDown (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnFadeUp (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnCheckFade (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnBackground(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnForeground(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSort(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnNoSprite(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnMegaSet(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnAnim(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSetFrame(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnFullAnim(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnFullSetFrame(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnFadeDown(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnFadeUp(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnCheckFade(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnSetSpritePalette(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnSetWholePalette(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnSetFadeTargetPalette(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnSetPaletteToFade(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnSetPaletteToCut(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnPlaySequence (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
-
- int fnIdle (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnPause (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnPauseSeconds (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnQuit (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnKillId (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSuicide (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnNewScript (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSubScript (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnRestartScript (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSetBookmark (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnGotoBookmark (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSendSync (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnWaitSync (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnPlaySequence(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+
+ int fnIdle(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnPause(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnPauseSeconds(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnQuit(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnKillId(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSuicide(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnNewScript(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSubScript(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnRestartScript(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSetBookmark(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnGotoBookmark(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSendSync(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnWaitSync(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int cfnClickInteract(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int cfnSetScript (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
-
- int fnInteract (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnIssueEvent (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnCheckForEvent (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnWipeHands (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnISpeak (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnTheyDo (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnTheyDoWeWait (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnWeWait (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int cfnSetScript(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+
+ int fnInteract(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnIssueEvent(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnCheckForEvent(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnWipeHands(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnISpeak(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnTheyDo(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnTheyDoWeWait(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnWeWait(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnChangeSpeechText(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnTalkError (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnStartTalk (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnTalkError(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnStartTalk(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnCheckForTextLine(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnAddTalkWaitStatusBit(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnRemoveTalkWaitStatusBit(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnNoHuman (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnAddHuman (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnBlankMouse (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnNormalMouse (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnLockMouse (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnUnlockMouse (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnNoHuman(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnAddHuman(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnBlankMouse(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnNormalMouse(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnLockMouse(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnUnlockMouse(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnSetMousePointer(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
int fnSetMouseLuggage(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnMouseOn (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnMouseOff (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnChooser (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnEndChooser (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnStartMenu (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnEndMenu (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
-
- int cfnReleaseMenu (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
-
- int fnAddSubject (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnAddObject (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnRemoveObject (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnEnterSection (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnLeaveSection (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnChangeFloor (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnWalk (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnTurn (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnStand (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnStandAt (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnFace (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnFaceXy (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnIsFacing (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnGetTo (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnGetToError (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnGetPos (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnGetGamepadXy (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnPlayFx (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnStopFx (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnPlayMusic (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnStopMusic (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnInnerSpace (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnRandom (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSetScreen (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnPreload (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnCheckCD (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnRestartGame (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnQuitGame (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnDeathScreen (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnSetParallax (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnTdebug (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
-
- int fnRedFlash (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnBlueFlash (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnYellow (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnGreen (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnPurple (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
- int fnBlack (Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnMouseOn(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnMouseOff(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnChooser(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnEndChooser(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnStartMenu(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnEndMenu(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+
+ int cfnReleaseMenu(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+
+ int fnAddSubject(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnAddObject(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnRemoveObject(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnEnterSection(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnLeaveSection(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnChangeFloor(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnWalk(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnTurn(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnStand(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnStandAt(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnFace(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnFaceXy(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnIsFacing(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnGetTo(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnGetToError(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnGetPos(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnGetGamepadXy(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnPlayFx(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnStopFx(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnPlayMusic(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnStopMusic(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnInnerSpace(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnRandom(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSetScreen(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnPreload(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnCheckCD(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnRestartGame(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnQuitGame(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnDeathScreen(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnSetParallax(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnTdebug(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+
+ int fnRedFlash(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnBlueFlash(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnYellow(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnGreen(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnPurple(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
+ int fnBlack(Object *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x);
static const uint32 _scriptVarInit[NON_ZERO_SCRIPT_VARS][2];
- static const uint8 *_startData[];
- static const uint8 *_helperData[];
+ static const uint8 *const _startData[];
+ static const uint8 *const _helperData[];
void startPosCallFn(uint8 fnId, uint32 param1, uint32 param2, uint32 param3);
void runStartScript(const uint8 *data);
};
diff --git a/engines/sword1/memman.cpp b/engines/sword1/memman.cpp
index 9fd763084a..19809249b5 100644
--- a/engines/sword1/memman.cpp
+++ b/engines/sword1/memman.cpp
@@ -40,7 +40,7 @@ MemMan::~MemMan() {
void MemMan::alloc(MemHandle *bsMem, uint32 pSize, uint16 pCond) {
_alloced += pSize;
- bsMem->data = (void*)malloc(pSize);
+ bsMem->data = (void *)malloc(pSize);
if (!bsMem->data)
error("MemMan::alloc(): Can't alloc %d bytes of memory.", pSize);
bsMem->cond = pCond;
diff --git a/engines/sword1/memman.h b/engines/sword1/memman.h
index 3f822189eb..7f84720248 100644
--- a/engines/sword1/memman.h
+++ b/engines/sword1/memman.h
@@ -35,9 +35,9 @@ struct MemHandle {
MemHandle *next, *prev;
};
// mem conditions:
-#define MEM_FREED 0
-#define MEM_CAN_FREE 1
-#define MEM_DONT_FREE 2
+#define MEM_FREED 0
+#define MEM_CAN_FREE 1
+#define MEM_DONT_FREE 2
#define MAX_ALLOC (6*1024*1024) // max amount of mem we want to alloc().
diff --git a/engines/sword1/menu.cpp b/engines/sword1/menu.cpp
index 3a99602fec..f61e10106a 100644
--- a/engines/sword1/menu.cpp
+++ b/engines/sword1/menu.cpp
@@ -85,7 +85,7 @@ void MenuIcon::setSelect(bool pSel) {
void MenuIcon::draw(const byte *fadeMask, int8 fadeStatus) {
uint16 x = _menuPos * 40;
- uint16 y = (_menuType == MENU_TOP)?(0):(440);
+ uint16 y = (_menuType == MENU_TOP) ? (0) : (440);
_screen->showFrame(x, y, _resId, _frame + (_selected ? 1 : 0), fadeMask, fadeStatus);
}
@@ -193,7 +193,7 @@ uint8 Menu::checkMenuClick(uint8 menuType) {
_mouse->setLuggage(0, 0);
Logic::_scriptVars[OBJECT_HELD] = 0; // reselected => deselect it
} else { // the player is clicking another item on this one.
- // run its use-script, if there is one
+ // run its use-script, if there is one
Logic::_scriptVars[SECOND_ITEM] = _menuList[cnt];
_mouse->setLuggage(0, 0);
}
diff --git a/engines/sword1/mouse.cpp b/engines/sword1/mouse.cpp
index cbf951aebc..4a62995d96 100644
--- a/engines/sword1/mouse.cpp
+++ b/engines/sword1/mouse.cpp
@@ -47,7 +47,7 @@ Mouse::~Mouse() {
setLuggage(0, 0);
setPointer(0, 0);
- for (uint8 cnt = 0; cnt < 17; cnt++) // close mouse cursor resources
+ for (uint8 cnt = 0; cnt < 17; cnt++) // close mouse cursor resources
_resMan->resClose(MSE_POINTER + cnt);
}
@@ -60,7 +60,7 @@ void Mouse::initialize() {
_mouseOverride = false;
_currentPtrId = _currentLuggageId = 0;
- for (uint8 cnt = 0; cnt < 17; cnt++) // force res manager to keep mouse
+ for (uint8 cnt = 0; cnt < 17; cnt++) // force res manager to keep mouse
_resMan->resOpen(MSE_POINTER + cnt); // cursors in memory all the time
CursorMan.showMouse(false);
@@ -112,7 +112,7 @@ void Mouse::engine(uint16 x, uint16 y, uint16 eventFlags) {
_mouse.y = y;
if (!(Logic::_scriptVars[MOUSE_STATUS] & 1)) { // no human?
_numObjs = 0;
- return; // no human, so we don't want the mouse engine
+ return; // no human, so we don't want the mouse engine
}
if (!Logic::_scriptVars[TOP_MENU_DISABLED]) {
@@ -144,12 +144,12 @@ void Mouse::engine(uint16 x, uint16 y, uint16 eventFlags) {
for (uint16 priority = 0; (priority < 10) && (!touchedId); priority++) {
for (uint16 cnt = 0; (cnt < _numObjs) && (!touchedId); cnt++) {
if ((_objList[cnt].compact->o_priority == priority) &&
- (Logic::_scriptVars[MOUSE_X] >= (uint32)_objList[cnt].compact->o_mouse_x1) &&
- (Logic::_scriptVars[MOUSE_X] <= (uint32)_objList[cnt].compact->o_mouse_x2) &&
- (Logic::_scriptVars[MOUSE_Y] >= (uint32)_objList[cnt].compact->o_mouse_y1) &&
- (Logic::_scriptVars[MOUSE_Y] <= (uint32)_objList[cnt].compact->o_mouse_y2)) {
- touchedId = _objList[cnt].id;
- clicked = cnt;
+ (Logic::_scriptVars[MOUSE_X] >= (uint32)_objList[cnt].compact->o_mouse_x1) &&
+ (Logic::_scriptVars[MOUSE_X] <= (uint32)_objList[cnt].compact->o_mouse_x2) &&
+ (Logic::_scriptVars[MOUSE_Y] >= (uint32)_objList[cnt].compact->o_mouse_y1) &&
+ (Logic::_scriptVars[MOUSE_Y] <= (uint32)_objList[cnt].compact->o_mouse_y2)) {
+ touchedId = _objList[cnt].id;
+ clicked = cnt;
}
}
}
@@ -160,7 +160,7 @@ void Mouse::engine(uint16 x, uint16 y, uint16 eventFlags) {
_getOff = 0;
}
if (touchedId) { // there's something new selected, now.
- if (_objList[clicked].compact->o_mouse_on) //run its get on
+ if (_objList[clicked].compact->o_mouse_on) //run its get on
_logic->runMouseScript(_objList[clicked].compact, _objList[clicked].compact->o_mouse_on);
_getOff = _objList[clicked].compact->o_mouse_off; //setup get-off for later
@@ -197,7 +197,7 @@ void Mouse::createPointer(uint32 ptrId, uint32 luggageId) {
if (ptrId) {
MousePtr *lugg = NULL;
- MousePtr *ptr = (MousePtr*)_resMan->openFetchRes(ptrId);
+ MousePtr *ptr = (MousePtr *)_resMan->openFetchRes(ptrId);
uint16 noFrames = _resMan->getLEUint16(ptr->numFrames);
uint16 ptrSizeX = _resMan->getLEUint16(ptr->sizeX);
uint16 ptrSizeY = _resMan->getLEUint16(ptr->sizeY);
@@ -210,7 +210,7 @@ void Mouse::createPointer(uint32 ptrId, uint32 luggageId) {
ptrSizeY *= 2;
if (luggageId) {
- lugg = (MousePtr*)_resMan->openFetchRes(luggageId);
+ lugg = (MousePtr *)_resMan->openFetchRes(luggageId);
luggSizeX = _resMan->getLEUint16(lugg->sizeX);
luggSizeY = _resMan->getLEUint16(lugg->sizeY);
@@ -223,18 +223,18 @@ void Mouse::createPointer(uint32 ptrId, uint32 luggageId) {
resSizeX = ptrSizeX;
resSizeY = ptrSizeY;
}
- _currentPtr = (MousePtr*)malloc(sizeof(MousePtr) + resSizeX * resSizeY * noFrames);
+ _currentPtr = (MousePtr *)malloc(sizeof(MousePtr) + resSizeX * resSizeY * noFrames);
_currentPtr->hotSpotX = _resMan->getLEUint16(ptr->hotSpotX);
_currentPtr->hotSpotY = _resMan->getLEUint16(ptr->hotSpotY);
_currentPtr->numFrames = noFrames;
_currentPtr->sizeX = resSizeX;
_currentPtr->sizeY = resSizeY;
- uint8 *ptrData = (uint8*)_currentPtr + sizeof(MousePtr);
+ uint8 *ptrData = (uint8 *)_currentPtr + sizeof(MousePtr);
memset(ptrData, 255, resSizeX * resSizeY * noFrames);
if (luggageId) {
uint8 *dstData = ptrData + resSizeX - luggSizeX;
for (uint32 frameCnt = 0; frameCnt < noFrames; frameCnt++) {
- uint8 *luggSrc = (uint8*)lugg + sizeof(MousePtr);
+ uint8 *luggSrc = (uint8 *)lugg + sizeof(MousePtr);
dstData += (resSizeY - luggSizeY) * resSizeX;
for (uint32 cnty = 0; cnty < (uint32)(SwordEngine::isPsx() ? luggSizeY / 2 : luggSizeY); cnty++) {
for (uint32 cntx = 0; cntx < luggSizeX; cntx++)
@@ -256,7 +256,7 @@ void Mouse::createPointer(uint32 ptrId, uint32 luggageId) {
}
uint8 *dstData = ptrData;
- uint8 *srcData = (uint8*)ptr + sizeof(MousePtr);
+ uint8 *srcData = (uint8 *)ptr + sizeof(MousePtr);
for (uint32 frameCnt = 0; frameCnt < noFrames; frameCnt++) {
for (uint32 cnty = 0; cnty < (uint32)(SwordEngine::isPsx() ? ptrSizeY / 2 : ptrSizeY); cnty++) {
for (uint32 cntx = 0; cntx < ptrSizeX; cntx++)
@@ -264,7 +264,7 @@ void Mouse::createPointer(uint32 ptrId, uint32 luggageId) {
dstData[cntx] = srcData[cntx];
if (SwordEngine::isPsx()) {
- dstData +=resSizeX;
+ dstData += resSizeX;
for (uint32 cntx = 0; cntx < ptrSizeX; cntx++)
if (srcData[cntx])
dstData[cntx] = srcData[cntx];
@@ -309,7 +309,7 @@ void Mouse::animate() {
if (_activeFrame == _frame)
return;
- uint8 *ptrData = (uint8*)_currentPtr + sizeof(MousePtr);
+ uint8 *ptrData = (uint8 *)_currentPtr + sizeof(MousePtr);
ptrData += _frame * _currentPtr->sizeX * _currentPtr->sizeY;
CursorMan.replaceCursor(ptrData, _currentPtr->sizeX, _currentPtr->sizeY, _currentPtr->hotSpotX, _currentPtr->hotSpotY, 255);
diff --git a/engines/sword1/mouse.h b/engines/sword1/mouse.h
index 44a6f76ad7..b2a844d0a9 100644
--- a/engines/sword1/mouse.h
+++ b/engines/sword1/mouse.h
@@ -34,22 +34,22 @@ namespace Sword1 {
#define MAX_MOUSE 30
-#define BS1L_BUTTON_DOWN 2
-#define BS1L_BUTTON_UP 4
-#define BS1R_BUTTON_DOWN 8
-#define BS1R_BUTTON_UP 16
-#define BS1_WHEEL_UP 32
-#define BS1_WHEEL_DOWN 64
-#define MOUSE_BOTH_BUTTONS (BS1L_BUTTON_DOWN | BS1R_BUTTON_DOWN)
-#define MOUSE_DOWN_MASK (BS1L_BUTTON_DOWN | BS1R_BUTTON_DOWN)
-#define MOUSE_UP_MASK (BS1L_BUTTON_UP | BS1R_BUTTON_UP)
+#define BS1L_BUTTON_DOWN 2
+#define BS1L_BUTTON_UP 4
+#define BS1R_BUTTON_DOWN 8
+#define BS1R_BUTTON_UP 16
+#define BS1_WHEEL_UP 32
+#define BS1_WHEEL_DOWN 64
+#define MOUSE_BOTH_BUTTONS (BS1L_BUTTON_DOWN | BS1R_BUTTON_DOWN)
+#define MOUSE_DOWN_MASK (BS1L_BUTTON_DOWN | BS1R_BUTTON_DOWN)
+#define MOUSE_UP_MASK (BS1L_BUTTON_UP | BS1R_BUTTON_UP)
struct MouseObj {
int id;
Object *compact;
};
-#include "common/pack-start.h" // START STRUCT PACKING
+#include "common/pack-start.h" // START STRUCT PACKING
struct MousePtr {
uint16 numFrames;
@@ -60,7 +60,7 @@ struct MousePtr {
uint8 dummyData[0x30];
} PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
+#include "common/pack-end.h" // END STRUCT PACKING
class Logic;
class Menu;
diff --git a/engines/sword1/music.cpp b/engines/sword1/music.cpp
index b4656ff89f..c34630aceb 100644
--- a/engines/sword1/music.cpp
+++ b/engines/sword1/music.cpp
@@ -35,7 +35,7 @@
#include "audio/decoders/mp3.h"
#include "audio/decoders/vorbis.h"
#include "audio/decoders/wave.h"
-#include "audio/decoders/vag.h"
+#include "audio/decoders/xa.h"
#define SMP_BUFSIZE 8192
@@ -110,7 +110,7 @@ bool MusicHandle::play(const Common::String &filename, bool loop) {
return true;
}
-bool MusicHandle::playPSX(uint16 id, bool loop) {
+bool MusicHandle::playPSX(uint16 id) {
stop();
if (!_file.isOpen())
@@ -131,7 +131,7 @@ bool MusicHandle::playPSX(uint16 id, bool loop) {
// not over file size
if ((size != 0) && (size != 0xffffffff) && ((int32)(offset + size) <= _file.size())) {
_file.seek(offset, SEEK_SET);
- _audioSource = Audio::makeLoopingAudioStream(Audio::makeVagStream(_file.readStream(size)), loop ? 0 : 1);
+ _audioSource = Audio::makeXAStream(_file.readStream(size), 11025);
fadeUp();
} else {
_audioSource = NULL;
@@ -297,7 +297,7 @@ void Music::startMusic(int32 tuneId, int32 loopFlag) {
the mutex before, to have the soundthread playing normally.
As the corresponding _converter is NULL, the handle will be ignored by the playing thread */
if (SwordEngine::isPsx()) {
- if (_handles[newStream].playPSX(tuneId, loopFlag != 0)) {
+ if (_handles[newStream].playPSX(tuneId)) {
_mutex.lock();
_converter[newStream] = Audio::makeRateConverter(_handles[newStream].getRate(), _mixer->getOutputRate(), _handles[newStream].isStereo(), false);
_mutex.unlock();
diff --git a/engines/sword1/music.h b/engines/sword1/music.h
index 4207019c13..f1366202d7 100644
--- a/engines/sword1/music.h
+++ b/engines/sword1/music.h
@@ -44,7 +44,7 @@ public:
MusicHandle() : _fading(0), _audioSource(NULL) {}
virtual int readBuffer(int16 *buffer, const int numSamples);
bool play(const Common::String &filename, bool loop);
- bool playPSX(uint16 id, bool loop);
+ bool playPSX(uint16 id);
void stop();
void fadeUp();
void fadeDown();
diff --git a/engines/sword1/object.h b/engines/sword1/object.h
index 5a6fd49c0b..0dab5519bd 100644
--- a/engines/sword1/object.h
+++ b/engines/sword1/object.h
@@ -27,100 +27,99 @@
namespace Sword1 {
-#define O_TOTAL_EVENTS 5
-#define O_WALKANIM_SIZE 600 //max number of nodes in router output
-#define O_GRID_SIZE 200
-#define EXTRA_GRID_SIZE 20
+#define O_TOTAL_EVENTS 5
+#define O_WALKANIM_SIZE 600 //max number of nodes in router output
+#define O_GRID_SIZE 200
+#define EXTRA_GRID_SIZE 20
-#include "common/pack-start.h" // START STRUCT PACKING
+#include "common/pack-start.h" // START STRUCT PACKING
-struct OEventSlot { //receiving event list in the compact -
- int32 o_event; //array of these with O_TOTAL_EVENTS elements
- int32 o_event_script;
-} PACKED_STRUCT; // size = 2*int32 = 8 bytes
+struct OEventSlot { //receiving event list in the compact -
+ int32 o_event; //array of these with O_TOTAL_EVENTS elements
+ int32 o_event_script;
+} PACKED_STRUCT; // size = 2*int32 = 8 bytes
-#define TOTAL_script_levels 5
+#define TOTAL_script_levels 5
-struct ScriptTree { //this is a logic tree, used by OBJECTs
- int32 o_script_level; //logic level
- int32 o_script_id[TOTAL_script_levels]; //script id's (are unique to each level)
- int32 o_script_pc[TOTAL_script_levels]; //pc of script for each (if script_manager)
-} PACKED_STRUCT; // size = 11*int32 = 44 bytes
+struct ScriptTree { //this is a logic tree, used by OBJECTs
+ int32 o_script_level; //logic level
+ int32 o_script_id[TOTAL_script_levels]; //script id's (are unique to each level)
+ int32 o_script_pc[TOTAL_script_levels]; //pc of script for each (if script_manager)
+} PACKED_STRUCT; // size = 11*int32 = 44 bytes
struct TalkOffset {
- int32 x;
- int32 y;
-} PACKED_STRUCT; // size = 2*int32 = 8 bytes
+ int32 x;
+ int32 y;
+} PACKED_STRUCT; // size = 2*int32 = 8 bytes
struct WalkData {
- int32 frame;
- int32 x;
- int32 y;
- int32 step;
- int32 dir;
-} PACKED_STRUCT; // size = 5*int32 = 20 bytes
+ int32 frame;
+ int32 x;
+ int32 y;
+ int32 step;
+ int32 dir;
+} PACKED_STRUCT; // size = 5*int32 = 20 bytes
struct Object {
- int32 o_type; // 0 broad description of type - object, floor, etc.
- int32 o_status; // 4 bit flags for logic, graphics, mouse, etc.
- int32 o_logic; // 8 logic type
- int32 o_place; // 12 where is the mega character
- int32 o_down_flag; // 16 pass back down with this - with C possibly both are unnecessary?
- int32 o_target; // 20 target object for the GTM *these are linked to script
- int32 o_screen; // 24 physical screen/section
- int32 o_frame; // 28 frame number &
- int32 o_resource; // 32 id of spr file it comes from
- int32 o_sync; // 36 receive sync here
- int32 o_pause; // 40 logic_engine() pauses these cycles
- int32 o_xcoord; // 44
- int32 o_ycoord; // 48
- int32 o_mouse_x1; // 52 top-left of mouse area is (x1,y1)
- int32 o_mouse_y1; // 56
- int32 o_mouse_x2; // 60 bottom-right of area is (x2,y2) (these coords are inclusive)
- int32 o_mouse_y2; // 64
- int32 o_priority; // 68
- int32 o_mouse_on; // 72
- int32 o_mouse_off; // 76
- int32 o_mouse_click; // 80
- int32 o_interact; // 84
- int32 o_get_to_script; // 88
- int32 o_scale_a; // 92 used by floors
- int32 o_scale_b; // 96
- int32 o_anim_x; // 100
- int32 o_anim_y; // 104
-
- ScriptTree o_tree; // 108 size = 44 bytes
- ScriptTree o_bookmark; // 152 size = 44 bytes
-
- int32 o_dir; // 196
- int32 o_speech_pen; // 200
- int32 o_speech_width; // 204
- int32 o_speech_time; // 208
- int32 o_text_id; // 212 working back from o_ins1
- int32 o_tag; // 216
- int32 o_anim_pc; // 220 position within an animation structure
- int32 o_anim_resource; // 224 cdt or anim table
-
- int32 o_walk_pc; // 228
-
- TalkOffset talk_table[6]; // 232 size = 6*8 bytes = 48
-
- OEventSlot o_event_list[O_TOTAL_EVENTS]; // 280 size = 5*8 bytes = 40
-
- int32 o_ins1; // 320
- int32 o_ins2; // 324
- int32 o_ins3; // 328
-
- int32 o_mega_resource; // 332
- int32 o_walk_resource; // 336
-
- WalkData o_route[O_WALKANIM_SIZE]; // 340 size = 600*20 bytes = 12000
- // mega size = 12340 bytes (+ 8 byte offset table + 20 byte header = 12368)
+ int32 o_type; // 0 broad description of type - object, floor, etc.
+ int32 o_status; // 4 bit flags for logic, graphics, mouse, etc.
+ int32 o_logic; // 8 logic type
+ int32 o_place; // 12 where is the mega character
+ int32 o_down_flag; // 16 pass back down with this - with C possibly both are unnecessary?
+ int32 o_target; // 20 target object for the GTM *these are linked to script
+ int32 o_screen; // 24 physical screen/section
+ int32 o_frame; // 28 frame number &
+ int32 o_resource; // 32 id of spr file it comes from
+ int32 o_sync; // 36 receive sync here
+ int32 o_pause; // 40 logic_engine() pauses these cycles
+ int32 o_xcoord; // 44
+ int32 o_ycoord; // 48
+ int32 o_mouse_x1; // 52 top-left of mouse area is (x1,y1)
+ int32 o_mouse_y1; // 56
+ int32 o_mouse_x2; // 60 bottom-right of area is (x2,y2) (these coords are inclusive)
+ int32 o_mouse_y2; // 64
+ int32 o_priority; // 68
+ int32 o_mouse_on; // 72
+ int32 o_mouse_off; // 76
+ int32 o_mouse_click; // 80
+ int32 o_interact; // 84
+ int32 o_get_to_script; // 88
+ int32 o_scale_a; // 92 used by floors
+ int32 o_scale_b; // 96
+ int32 o_anim_x; // 100
+ int32 o_anim_y; // 104
+
+ ScriptTree o_tree; // 108 size = 44 bytes
+ ScriptTree o_bookmark; // 152 size = 44 bytes
+
+ int32 o_dir; // 196
+ int32 o_speech_pen; // 200
+ int32 o_speech_width; // 204
+ int32 o_speech_time; // 208
+ int32 o_text_id; // 212 working back from o_ins1
+ int32 o_tag; // 216
+ int32 o_anim_pc; // 220 position within an animation structure
+ int32 o_anim_resource; // 224 cdt or anim table
+
+ int32 o_walk_pc; // 228
+
+ TalkOffset talk_table[6]; // 232 size = 6*8 bytes = 48
+
+ OEventSlot o_event_list[O_TOTAL_EVENTS]; // 280 size = 5*8 bytes = 40
+
+ int32 o_ins1; // 320
+ int32 o_ins2; // 324
+ int32 o_ins3; // 328
+
+ int32 o_mega_resource; // 332
+ int32 o_walk_resource; // 336
+
+ WalkData o_route[O_WALKANIM_SIZE]; // 340 size = 600*20 bytes = 12000
+ // mega size = 12340 bytes (+ 8 byte offset table + 20 byte header = 12368)
} PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
+#include "common/pack-end.h" // END STRUCT PACKING
} // End of namespace Sword1
#endif //BSOBJECT_H
-
diff --git a/engines/sword1/objectman.cpp b/engines/sword1/objectman.cpp
index 8de29615d5..ed994a97fa 100644
--- a/engines/sword1/objectman.cpp
+++ b/engines/sword1/objectman.cpp
@@ -39,15 +39,15 @@ void ObjectMan::initialize() {
uint16 cnt;
for (cnt = 0; cnt < TOTAL_SECTIONS; cnt++)
_liveList[cnt] = 0; // we don't need to close the files here. When this routine is
- // called, the memory was flushed() anyways, so these resources
- // already *are* closed.
+ // called, the memory was flushed() anyways, so these resources
+ // already *are* closed.
_liveList[128] = _liveList[129] = _liveList[130] = _liveList[131] = _liveList[133] =
- _liveList[134] = _liveList[145] = _liveList[146] = _liveList[TEXT_sect] = 1;
+ _liveList[134] = _liveList[145] = _liveList[146] = _liveList[TEXT_sect] = 1;
for (cnt = 0; cnt < TOTAL_SECTIONS; cnt++) {
if (_liveList[cnt])
- _cptData[cnt] = (uint8*)_resMan->cptResOpen(_objectList[cnt]) + sizeof(Header);
+ _cptData[cnt] = (uint8 *)_resMan->cptResOpen(_objectList[cnt]) + sizeof(Header);
else
_cptData[cnt] = NULL;
}
@@ -66,7 +66,7 @@ bool ObjectMan::sectionAlive(uint16 section) {
void ObjectMan::megaEntering(uint16 section) {
_liveList[section]++;
if (_liveList[section] == 1)
- _cptData[section] = ((uint8*)_resMan->cptResOpen(_objectList[section])) + sizeof(Header);
+ _cptData[section] = ((uint8 *)_resMan->cptResOpen(_objectList[section])) + sizeof(Header);
}
void ObjectMan::megaLeaving(uint16 section, int id) {
@@ -87,7 +87,7 @@ uint8 ObjectMan::fnCheckForTextLine(uint32 textId) {
return 0; // section does not exist
uint8 lang = SwordEngine::_systemVars.language;
- uint32 *textData = (uint32*)((uint8*)_resMan->openFetchRes(_textList[textId / ITM_PER_SEC][lang]) + sizeof(Header));
+ uint32 *textData = (uint32 *)((uint8 *)_resMan->openFetchRes(_textList[textId / ITM_PER_SEC][lang]) + sizeof(Header));
if ((textId & ITM_ID) < _resMan->readUint32(textData)) {
textData++;
if (textData[textId & ITM_ID])
@@ -99,7 +99,7 @@ uint8 ObjectMan::fnCheckForTextLine(uint32 textId) {
char *ObjectMan::lockText(uint32 textId) {
uint8 lang = SwordEngine::_systemVars.language;
- char *addr = (char*)_resMan->openFetchRes(_textList[textId / ITM_PER_SEC][lang]);
+ char *addr = (char *)_resMan->openFetchRes(_textList[textId / ITM_PER_SEC][lang]);
if (addr == 0)
return _missingSubTitleStr;
addr += sizeof(Header);
@@ -107,12 +107,12 @@ char *ObjectMan::lockText(uint32 textId) {
warning("ObjectMan::lockText(%d): only %d texts in file", textId & ITM_ID, _resMan->readUint32(addr));
textId = 0; // get first line instead
}
- uint32 offset = _resMan->readUint32(addr + ((textId & ITM_ID) + 1)* 4);
+ uint32 offset = _resMan->readUint32(addr + ((textId & ITM_ID) + 1) * 4);
if (offset == 0) {
// Workaround bug for missing sentence in some langages in Syria (see bug #1977094).
// We use the hardcoded text in this case.
if (textId == 2950145)
- return const_cast<char*>(_translationId2950145[lang]);
+ return const_cast<char *>(_translationId2950145[lang]);
warning("ObjectMan::lockText(%d): text number has no text lines", textId);
return _missingSubTitleStr;
@@ -125,7 +125,7 @@ void ObjectMan::unlockText(uint32 textId) {
}
uint32 ObjectMan::lastTextNumber(int section) {
- uint8 *data = (uint8*)_resMan->openFetchRes(_textList[section][SwordEngine::_systemVars.language]) + sizeof(Header);
+ uint8 *data = (uint8 *)_resMan->openFetchRes(_textList[section][SwordEngine::_systemVars.language]) + sizeof(Header);
uint32 result = _resMan->readUint32(data) - 1;
_resMan->resClose(_textList[section][SwordEngine::_systemVars.language]);
return result;
@@ -137,17 +137,17 @@ Object *ObjectMan::fetchObject(uint32 id) {
error("fetchObject: section %d is not open", id / ITM_PER_SEC);
id &= ITM_ID;
// DON'T do endian conversion here. it's already done.
- return (Object*)(addr + *(uint32*)(addr + (id + 1)*4));
+ return (Object *)(addr + * (uint32 *)(addr + (id + 1) * 4));
}
uint32 ObjectMan::fetchNoObjects(int section) {
if (_cptData[section] == NULL)
error("fetchNoObjects: section %d is not open", section);
- return *(uint32*)_cptData[section];
+ return *(uint32 *)_cptData[section];
}
void ObjectMan::closeSection(uint32 screen) {
- if (_liveList[screen] == 0) // close the section that PLAYER has just left, if it's empty now
+ if (_liveList[screen] == 0) // close the section that PLAYER has just left, if it's empty now
_resMan->resClose(_objectList[screen]);
}
@@ -159,7 +159,7 @@ void ObjectMan::loadLiveList(uint16 *src) {
}
_liveList[cnt] = src[cnt];
if (_liveList[cnt])
- _cptData[cnt] = ((uint8*)_resMan->cptResOpen(_objectList[cnt])) + sizeof(Header);
+ _cptData[cnt] = ((uint8 *)_resMan->cptResOpen(_objectList[cnt])) + sizeof(Header);
}
}
@@ -179,7 +179,7 @@ char ObjectMan::_missingSubTitleStr[] = " ";
// is not needed. The English version of the game does not include Portuguese
// so I cannot check.)
-const char *ObjectMan::_translationId2950145[7] = {
+const char *const ObjectMan::_translationId2950145[7] = {
"Oh?", // English (not needed)
"Quoi?", // French
"Oh?", // German
diff --git a/engines/sword1/objectman.h b/engines/sword1/objectman.h
index 23047c14ea..ca3c7c1526 100644
--- a/engines/sword1/objectman.h
+++ b/engines/sword1/objectman.h
@@ -54,12 +54,12 @@ public:
void loadLiveList(uint16 *src);
private:
ResMan *_resMan;
- static const uint32 _objectList[TOTAL_SECTIONS]; //a table of pointers to object files
- static const uint32 _textList[TOTAL_SECTIONS][7]; //a table of pointers to text files
- uint16 _liveList[TOTAL_SECTIONS]; //which sections are active
+ static const uint32 _objectList[TOTAL_SECTIONS]; //a table of pointers to object files
+ static const uint32 _textList[TOTAL_SECTIONS][7]; //a table of pointers to text files
+ uint16 _liveList[TOTAL_SECTIONS]; //which sections are active
uint8 *_cptData[TOTAL_SECTIONS];
static char _missingSubTitleStr[];
- static const char *_translationId2950145[7]; //translation for textId 2950145 (missing from cluster file for some langages)
+ static const char *const _translationId2950145[7]; //translation for textId 2950145 (missing from cluster file for some langages)
};
} // End of namespace Sword1
diff --git a/engines/sword1/resman.cpp b/engines/sword1/resman.cpp
index 807679a40e..878ba8eceb 100644
--- a/engines/sword1/resman.cpp
+++ b/engines/sword1/resman.cpp
@@ -31,14 +31,14 @@
#include "gui/message.h"
namespace Sword1 {
- void guiFatalError(char *msg) {
- // Displays a dialog on-screen before terminating the engine.
- // TODO: We really need to setup a special palette for cases when
- // the engine is erroring before setting one... otherwise invisible cursor :)
-
- GUI::MessageDialog dialog(msg);
- dialog.runModal();
- error("%s", msg);
+void guiFatalError(char *msg) {
+ // Displays a dialog on-screen before terminating the engine.
+ // TODO: We really need to setup a special palette for cases when
+ // the engine is erroring before setting one... otherwise invisible cursor :)
+
+ GUI::MessageDialog dialog(msg);
+ dialog.runModal();
+ error("%s", msg);
}
#define MAX_PATH_LEN 260
@@ -62,7 +62,7 @@ ResMan::~ResMan() {
for (uint32 resCnt = 0; resCnt < group->noRes; resCnt++) {
if (group->resHandle[resCnt].cond == MEM_DONT_FREE) {
warning("ResMan::~ResMan: Resource %02X.%04X.%02X is still open",
- clusCnt + 1, grpCnt, resCnt);
+ clusCnt + 1, grpCnt, resCnt);
}
}
}
@@ -92,7 +92,7 @@ void ResMan::loadCluDescript(const char *fileName) {
_prj.clu = new Clu[_prj.noClu];
memset(_prj.clu, 0, _prj.noClu * sizeof(Clu));
- uint32 *cluIndex = (uint32*)malloc(_prj.noClu * 4);
+ uint32 *cluIndex = (uint32 *)malloc(_prj.noClu * 4);
file.read(cluIndex, _prj.noClu * 4);
for (uint32 clusCnt = 0; clusCnt < _prj.noClu; clusCnt++)
@@ -107,7 +107,7 @@ void ResMan::loadCluDescript(const char *fileName) {
memset(cluster->grp, 0, cluster->noGrp * sizeof(Grp));
cluster->refCount = 0;
- uint32 *grpIndex = (uint32*)malloc(cluster->noGrp * 4);
+ uint32 *grpIndex = (uint32 *)malloc(cluster->noGrp * 4);
file.read(grpIndex, cluster->noGrp * 4);
for (uint32 grpCnt = 0; grpCnt < cluster->noGrp; grpCnt++)
@@ -117,7 +117,7 @@ void ResMan::loadCluDescript(const char *fileName) {
group->resHandle = new MemHandle[group->noRes];
group->offset = new uint32[group->noRes];
group->length = new uint32[group->noRes];
- uint32 *resIdIdx = (uint32*)malloc(group->noRes * 4);
+ uint32 *resIdIdx = (uint32 *)malloc(group->noRes * 4);
file.read(resIdIdx, group->noRes * 4);
for (uint32 resCnt = 0; resCnt < group->noRes; resCnt++) {
@@ -227,7 +227,7 @@ Header *ResMan::lockScript(uint32 scrID) {
#else
openScriptResourceLittleEndian(scrID);
#endif
- return (Header*)resHandle(scrID)->data;
+ return (Header *)resHandle(scrID)->data;
}
void ResMan::unlockScript(uint32 scrID) {
@@ -276,23 +276,23 @@ void ResMan::resClose(uint32 id) {
} else {
handle->refCount--;
if (!handle->refCount)
- _memMan->setCondition( handle, MEM_CAN_FREE);
+ _memMan->setCondition(handle, MEM_CAN_FREE);
}
}
FrameHeader *ResMan::fetchFrame(void *resourceData, uint32 frameNo) {
- uint8 *frameFile = (uint8*)resourceData;
+ uint8 *frameFile = (uint8 *)resourceData;
uint8 *idxData = frameFile + sizeof(Header);
if (_isBigEndian) {
if (frameNo >= READ_BE_UINT32(idxData))
error("fetchFrame:: frame %d doesn't exist in resource.", frameNo);
- frameFile += READ_BE_UINT32(idxData + (frameNo+1) * 4);
+ frameFile += READ_BE_UINT32(idxData + (frameNo + 1) * 4);
} else {
if (frameNo >= READ_LE_UINT32(idxData))
error("fetchFrame:: frame %d doesn't exist in resource.", frameNo);
- frameFile += READ_LE_UINT32(idxData + (frameNo+1) * 4);
+ frameFile += READ_LE_UINT32(idxData + (frameNo + 1) * 4);
}
- return (FrameHeader*)frameFile;
+ return (FrameHeader *)frameFile;
}
Common::File *ResMan::resFile(uint32 id) {
@@ -310,9 +310,9 @@ Common::File *ResMan::resFile(uint32 id) {
// Supposes that big endian means mac cluster file and little endian means PC cluster file.
// This works, but we may want to separate the file name from the endianess or try .CLM extension if opening.clu file fail.
if (_isBigEndian)
- sprintf(fileName, "%s.CLM", _prj.clu[(id >> 24)-1].label);
+ sprintf(fileName, "%s.CLM", _prj.clu[(id >> 24) - 1].label);
else
- sprintf(fileName, "%s.CLU", _prj.clu[(id >> 24)-1].label);
+ sprintf(fileName, "%s.CLU", _prj.clu[(id >> 24) - 1].label);
cluster->file->open(fileName);
if (!cluster->file->isOpen()) {
char msg[512];
@@ -392,7 +392,7 @@ void ResMan::openCptResourceBigEndian(uint32 id) {
if (!handle)
return;
uint32 totSize = handle->size;
- uint32 *data = (uint32*)((uint8*)handle->data + sizeof(Header));
+ uint32 *data = (uint32 *)((uint8 *)handle->data + sizeof(Header));
totSize -= sizeof(Header);
if (totSize & 3)
error("Illegal compact size for id %d: %d", id, totSize);
@@ -420,7 +420,7 @@ void ResMan::openCptResourceLittleEndian(uint32 id) {
if (!handle)
return;
uint32 totSize = handle->size;
- uint32 *data = (uint32*)((uint8*)handle->data + sizeof(Header));
+ uint32 *data = (uint32 *)((uint8 *)handle->data + sizeof(Header));
totSize -= sizeof(Header);
if (totSize & 3)
error("Illegal compact size for id %d: %d", id, totSize);
@@ -448,11 +448,11 @@ void ResMan::openScriptResourceBigEndian(uint32 id) {
if (!handle)
return;
// uint32 totSize = handle->size;
- Header *head = (Header*)handle->data;
+ Header *head = (Header *)handle->data;
head->comp_length = FROM_LE_32(head->comp_length);
head->decomp_length = FROM_LE_32(head->decomp_length);
head->version = FROM_LE_16(head->version);
- uint32 *data = (uint32*)((uint8*)handle->data + sizeof(Header));
+ uint32 *data = (uint32 *)((uint8 *)handle->data + sizeof(Header));
uint32 size = handle->size - sizeof(Header);
if (size & 3)
error("Odd size during script endian conversion. Resource ID =%d, size = %d", id, size);
@@ -480,11 +480,11 @@ void ResMan::openScriptResourceLittleEndian(uint32 id) {
if (!handle)
return;
// uint32 totSize = handle->size;
- Header *head = (Header*)handle->data;
+ Header *head = (Header *)handle->data;
head->comp_length = FROM_BE_32(head->comp_length);
head->decomp_length = FROM_BE_32(head->decomp_length);
head->version = FROM_BE_16(head->version);
- uint32 *data = (uint32*)((uint8*)handle->data + sizeof(Header));
+ uint32 *data = (uint32 *)((uint8 *)handle->data + sizeof(Header));
uint32 size = handle->size - sizeof(Header);
if (size & 3)
error("Odd size during script endian conversion. Resource ID =%d, size = %d", id, size);
@@ -498,34 +498,34 @@ void ResMan::openScriptResourceLittleEndian(uint32 id) {
uint32 ResMan::_srIdList[29] = { // the file numbers differ for the control panel file IDs, so we need this array
- OTHER_SR_FONT, // SR_FONT
- 0x04050000, // SR_BUTTON
- OTHER_SR_REDFONT, // SR_REDFONT
- 0x04050001, // SR_PALETTE
- 0x04050002, // SR_PANEL_ENGLISH
- 0x04050003, // SR_PANEL_FRENCH
- 0x04050004, // SR_PANEL_GERMAN
- 0x04050005, // SR_PANEL_ITALIAN
- 0x04050006, // SR_PANEL_SPANISH
- 0x04050007, // SR_PANEL_AMERICAN
- 0x04050008, // SR_TEXT_BUTTON
- 0x04050009, // SR_SPEED
- 0x0405000A, // SR_SCROLL1
- 0x0405000B, // SR_SCROLL2
- 0x0405000C, // SR_CONFIRM
- 0x0405000D, // SR_VOLUME
- 0x0405000E, // SR_VLIGHT
- 0x0405000F, // SR_VKNOB
- 0x04050010, // SR_WINDOW
- 0x04050011, // SR_SLAB1
- 0x04050012, // SR_SLAB2
- 0x04050013, // SR_SLAB3
- 0x04050014, // SR_SLAB4
- 0x04050015, // SR_BUTUF
- 0x04050016, // SR_BUTUS
- 0x04050017, // SR_BUTDS
- 0x04050018, // SR_BUTDF
- 0x04050019, // SR_DEATHPANEL
+ OTHER_SR_FONT, // SR_FONT
+ 0x04050000, // SR_BUTTON
+ OTHER_SR_REDFONT, // SR_REDFONT
+ 0x04050001, // SR_PALETTE
+ 0x04050002, // SR_PANEL_ENGLISH
+ 0x04050003, // SR_PANEL_FRENCH
+ 0x04050004, // SR_PANEL_GERMAN
+ 0x04050005, // SR_PANEL_ITALIAN
+ 0x04050006, // SR_PANEL_SPANISH
+ 0x04050007, // SR_PANEL_AMERICAN
+ 0x04050008, // SR_TEXT_BUTTON
+ 0x04050009, // SR_SPEED
+ 0x0405000A, // SR_SCROLL1
+ 0x0405000B, // SR_SCROLL2
+ 0x0405000C, // SR_CONFIRM
+ 0x0405000D, // SR_VOLUME
+ 0x0405000E, // SR_VLIGHT
+ 0x0405000F, // SR_VKNOB
+ 0x04050010, // SR_WINDOW
+ 0x04050011, // SR_SLAB1
+ 0x04050012, // SR_SLAB2
+ 0x04050013, // SR_SLAB3
+ 0x04050014, // SR_SLAB4
+ 0x04050015, // SR_BUTUF
+ 0x04050016, // SR_BUTUS
+ 0x04050017, // SR_BUTDS
+ 0x04050018, // SR_BUTDF
+ 0x04050019, // SR_DEATHPANEL
0,
};
diff --git a/engines/sword1/resman.h b/engines/sword1/resman.h
index 82074e5740..49d974c1db 100644
--- a/engines/sword1/resman.h
+++ b/engines/sword1/resman.h
@@ -33,11 +33,11 @@ namespace Sword1 {
#define MAX_LABEL_SIZE (31+1)
#if defined(__PSP__)
-#define MAX_OPEN_CLUS 4 // the PSP can't have more than 8 files open simultaneously
- // since we also need filehandles for music and sometimes savegames
- // set the maximum number of open clusters to 4.
+#define MAX_OPEN_CLUS 4 // the PSP can't have more than 8 files open simultaneously
+ // since we also need filehandles for music and sometimes savegames
+ // set the maximum number of open clusters to 4.
#else
-#define MAX_OPEN_CLUS 8 // don't open more than 8 files at once
+#define MAX_OPEN_CLUS 8 // don't open more than 8 files at once
#endif
struct Grp {
@@ -77,10 +77,10 @@ public:
FrameHeader *fetchFrame(void *resourceData, uint32 frameNo);
uint16 getUint16(uint16 value) {
- return (_isBigEndian) ? FROM_BE_16(value): FROM_LE_16(value);
+ return (_isBigEndian) ? FROM_BE_16(value) : FROM_LE_16(value);
}
uint32 getUint32(uint32 value) {
- return (_isBigEndian) ? FROM_BE_32(value): FROM_LE_32(value);
+ return (_isBigEndian) ? FROM_BE_32(value) : FROM_LE_32(value);
}
uint16 getLEUint16(uint16 value) {
return FROM_LE_16(value);
@@ -89,24 +89,24 @@ public:
return FROM_LE_32(value);
}
uint16 readUint16(const void *ptr) {
- return (_isBigEndian) ? READ_BE_UINT16(ptr): READ_LE_UINT16(ptr);
+ return (_isBigEndian) ? READ_BE_UINT16(ptr) : READ_LE_UINT16(ptr);
}
uint32 readUint32(const void *ptr) {
- return (_isBigEndian) ? READ_BE_UINT32(ptr):READ_LE_UINT32(ptr);
+ return (_isBigEndian) ? READ_BE_UINT32(ptr) : READ_LE_UINT32(ptr);
}
uint32 readLEUint32(const void *ptr) {
return READ_LE_UINT32(ptr);
}
uint16 toUint16(uint16 value) {
- return (_isBigEndian) ? TO_BE_16(value): TO_LE_16(value);
+ return (_isBigEndian) ? TO_BE_16(value) : TO_LE_16(value);
}
uint32 toUint32(uint32 value) {
- return (_isBigEndian) ? TO_BE_32(value): TO_LE_32(value);
+ return (_isBigEndian) ? TO_BE_32(value) : TO_LE_32(value);
}
private:
- uint32 resLength(uint32 id);
+ uint32 resLength(uint32 id);
MemHandle *resHandle(uint32 id);
uint32 resOffset(uint32 id);
Common::File *resFile(uint32 id);
@@ -120,7 +120,7 @@ private:
void freeCluDescript();
Prj _prj;
MemMan *_memMan;
- static const uint32 _scriptList[TOTAL_SECTIONS]; //a table of resource tags
+ static const uint32 _scriptList[TOTAL_SECTIONS]; //a table of resource tags
static uint32 _srIdList[29];
Clu *_openCluStart, *_openCluEnd;
int _openClus;
diff --git a/engines/sword1/router.cpp b/engines/sword1/router.cpp
index aaf475912d..ef07a0bf02 100644
--- a/engines/sword1/router.cpp
+++ b/engines/sword1/router.cpp
@@ -33,25 +33,25 @@
namespace Sword1 {
/****************************************************************************
- * JROUTER.C polygon router with modular walks
- * using a tree of modules
- * 21 july 94
+ * JROUTER.C polygon router with modular walks
+ * using a tree of modules
+ * 21 july 94
* 3 november 94
- * System currently works by scanning grid data and coming up with a ROUTE
+ * System currently works by scanning grid data and coming up with a ROUTE
* as a series of way points(nodes), the smoothest eight directional PATH
- * through these nodes is then found, and a WALK created to fit the PATH.
+ * through these nodes is then found, and a WALK created to fit the PATH.
*
- * Two funtions are called by the user, RouteFinder creates a route as a
- * module list, HardWalk creates an animation list from the module list.
- * The split is only provided to allow the possibility of turning the
- * autorouter over two game cycles.
+ * Two funtions are called by the user, RouteFinder creates a route as a
+ * module list, HardWalk creates an animation list from the module list.
+ * The split is only provided to allow the possibility of turning the
+ * autorouter over two game cycles.
****************************************************************************
*
* Routine timings on osborne 486
*
- * Read floor resource (file already loaded) 112 pixels
+ * Read floor resource (file already loaded) 112 pixels
*
- * Read mega resource (file already loaded) 112 pixels
+ * Read mega resource (file already loaded) 112 pixels
*
*
*
@@ -59,16 +59,16 @@ namespace Sword1 {
*
* Modified 12 Oct 95
*
- * Target Points within 1 pixel of a line are ignored ???
+ * Target Points within 1 pixel of a line are ignored ???
*
- * Modules split into Points within 1 pixel of a line are ignored ???
+ * Modules split into Points within 1 pixel of a line are ignored ???
*
****************************************************************************/
-#define NO_DIRECTIONS 8
-#define SLOW_IN 3
-#define SLOW_OUT 7
-#define ROUTE_END_FLAG 255
+#define NO_DIRECTIONS 8
+#define SLOW_IN 3
+#define SLOW_OUT 7
+#define ROUTE_END_FLAG 255
Router::Router(ObjectMan *pObjMan, ResMan *pResMan) {
_objMan = pObjMan;
@@ -85,9 +85,9 @@ Router::Router(ObjectMan *pObjMan, ResMan *pResMan) {
int32 Router::routeFinder(int32 id, Object *megaObject, int32 x, int32 y, int32 dir) {
/*********************************************************************
- * RouteFinder.C polygon router with modular walks
- * 21 august 94
- * 3 november 94
+ * RouteFinder.C polygon router with modular walks
+ * 21 august 94
+ * 3 november 94
* routeFinder creates a list of modules that enables HardWalk to
* create an animation list.
*
@@ -99,11 +99,11 @@ int32 Router::routeFinder(int32 id, Object *megaObject, int32 x, int32 y, int32
*
* 30 november 94 return values modified
*
- * return 0 = failed to find a route
+ * return 0 = failed to find a route
*
- * 1 = found a route
+ * 1 = found a route
*
- * 2 = mega already at target
+ * 2 = mega already at target
*
*********************************************************************/
@@ -117,7 +117,7 @@ int32 Router::routeFinder(int32 id, Object *megaObject, int32 x, int32 y, int32
walkAnim = megaObject->o_route;
- _framesPerStep = _nWalkFrames/2;
+ _framesPerStep = _nWalkFrames / 2;
_framesPerChar = _nWalkFrames * NO_DIRECTIONS;
// offset pointers added Oct 30 95 JPS
@@ -145,12 +145,12 @@ int32 Router::routeFinder(int32 id, Object *megaObject, int32 x, int32 y, int32
slowOutFrames = 0;
}
-// **************************************************************************
-// All route data now loaded start finding a route
-// **************************************************************************
-// **************************************************************************
-// check if we can get a route through the floor changed 12 Oct95 JPS
-// **************************************************************************
+ // **************************************************************************
+ // All route data now loaded start finding a route
+ // **************************************************************************
+ // **************************************************************************
+ // check if we can get a route through the floor changed 12 Oct95 JPS
+ // **************************************************************************
routeFlag = getRoute();
@@ -220,26 +220,26 @@ int32 Router::routeFinder(int32 id, Object *megaObject, int32 x, int32 y, int32
break;
}
- return routeFlag; // send back null route
+ return routeFlag; // send back null route
}
int32 Router::getRoute() {
/*********************************************************************
- * GetRoute.C extract a path from walk grid
- * 12 october 94
+ * GetRoute.C extract a path from walk grid
+ * 12 october 94
*
* GetRoute currently works by scanning grid data and coming up with
* a ROUTE as a series of way points(nodes).
*
* static routeData _route[O_ROUTE_SIZE];
*
- * return 0 = failed to find a route
+ * return 0 = failed to find a route
*
- * 1 = found a route
+ * 1 = found a route
*
- * 2 = mega already at target
+ * 2 = mega already at target
*
- * 3 = failed to find a route because target was on a line
+ * 3 = failed to find a route because target was on a line
*
*********************************************************************/
@@ -459,7 +459,7 @@ void Router::smoothCheck(int32 &k, int32 best, int32 p, int32 dirS, int32 dirD)
// set up sd0-ss2 to reflect possible movement in each direction
- if (dirS == 0 || dirS == 4) { // vert and diag
+ if (dirS == 0 || dirS == 4) { // vert and diag
ddx = ldx;
ddy = (ldx * _diagonaly) / _diagonalx;
dsy = ldy - ddy;
@@ -492,7 +492,7 @@ void Router::smoothCheck(int32 &k, int32 best, int32 p, int32 dirS, int32 dirD)
}
switch (best) {
- case 0: // halfsquare, diagonal, halfsquare
+ case 0: // halfsquare, diagonal, halfsquare
_smoothPath[k].x = x + dsx / 2;
_smoothPath[k].y = y + dsy / 2;
_smoothPath[k].dir = dirS;
@@ -512,7 +512,7 @@ void Router::smoothCheck(int32 &k, int32 best, int32 p, int32 dirS, int32 dirD)
k++;
break;
- case 1: // square, diagonal
+ case 1: // square, diagonal
_smoothPath[k].x = x + dsx;
_smoothPath[k].y = y + dsy;
_smoothPath[k].dir = dirS;
@@ -526,7 +526,7 @@ void Router::smoothCheck(int32 &k, int32 best, int32 p, int32 dirS, int32 dirD)
k++;
break;
- case 2: // diagonal square
+ case 2: // diagonal square
_smoothPath[k].x = x + ddx;
_smoothPath[k].y = y + ddy;
_smoothPath[k].dir = dirD;
@@ -540,7 +540,7 @@ void Router::smoothCheck(int32 &k, int32 best, int32 p, int32 dirS, int32 dirD)
k++;
break;
- default: // halfdiagonal, square, halfdiagonal
+ default: // halfdiagonal, square, halfdiagonal
_smoothPath[k].x = x + ddx / 2;
_smoothPath[k].y = y + ddy / 2;
_smoothPath[k].dir = dirD;
@@ -627,17 +627,17 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
* fits the smoothPath and uses foot slipping to fit whole steps into
* the route
*
- * Parameters: georgeg, mouseg
- * Returns: rout
+ * Parameters: georgeg, mouseg
+ * Returns: rout
*
* produce a module list from the line data
*********************************************************************/
int32 p;
- int32 lastDir;
- int32 lastRealDir;
- int32 currentDir;
- int32 turnDir;
+ int32 lastDir;
+ int32 lastRealDir;
+ int32 currentDir;
+ int32 turnDir;
int32 scale;
int32 step;
int32 module;
@@ -677,7 +677,7 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// START THE WALK WITH THE FIRST STANDFRAME THIS MAY CAUSE A DELAY
// BUT IT STOPS THE PLAYER MOVING FOR COLLISIONS ARE DETECTED
//****************************************************************************
- module = _framesPerChar + lastDir;
+ module = _framesPerChar + lastDir;
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
walkAnim[stepCount].dir = lastDir;
@@ -694,7 +694,7 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// get the direction to turn
turnDir = currentDir - lastDir;
if (turnDir < 0)
- turnDir += NO_DIRECTIONS;
+ turnDir += NO_DIRECTIONS;
if (turnDir > 4)
turnDir = -1;
@@ -704,10 +704,10 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// rotate to new walk direction
// for george and nico put in a head turn at the start
if ((megaId == GEORGE) || (megaId == NICO)) {
- if (turnDir < 0) { // new frames for turn frames 29oct95jps
- module = turnFramesLeft + lastDir;
+ if (turnDir < 0) { // new frames for turn frames 29oct95jps
+ module = turnFramesLeft + lastDir;
} else {
- module = turnFramesRight + lastDir;
+ module = turnFramesRight + lastDir;
}
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
@@ -720,14 +720,14 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// rotate till were facing new dir then go back 45 degrees
while (lastDir != currentDir) {
lastDir += turnDir;
- if (turnDir < 0) { // new frames for turn frames 29oct95jps
+ if (turnDir < 0) { // new frames for turn frames 29oct95jps
if (lastDir < 0)
- lastDir += NO_DIRECTIONS;
- module = turnFramesLeft + lastDir;
+ lastDir += NO_DIRECTIONS;
+ module = turnFramesLeft + lastDir;
} else {
if (lastDir > 7)
- lastDir -= NO_DIRECTIONS;
- module = turnFramesRight + lastDir;
+ lastDir -= NO_DIRECTIONS;
+ module = turnFramesRight + lastDir;
}
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
@@ -760,17 +760,17 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
lastDir = currentDir;
lastCount = stepCount;
}
- //calculate average amount to lose in each step on the way to the next _node
+ //calculate average amount to lose in each step on the way to the next _node
currentDir = _modularPath[p].dir;
if (currentDir < NO_DIRECTIONS) {
- module = currentDir * _framesPerStep * 2 + _slidyWalkAnimatorState * _framesPerStep;
+ module = currentDir * _framesPerStep * 2 + _slidyWalkAnimatorState * _framesPerStep;
_slidyWalkAnimatorState = !_slidyWalkAnimatorState;
moduleEnd = module + _framesPerStep;
step = 0;
scale = (_scaleA * moduleY + _scaleB);
do {
- module16X += _dx[module]*scale;
- module16Y += _dy[module]*scale;
+ module16X += _dx[module] * scale;
+ module16Y += _dy[module] * scale;
moduleX = module16X >> 16;
moduleY = module16Y >> 16;
walkAnim[stepCount].frame = module;
@@ -781,53 +781,53 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
stepCount += 1;
step += 1;
module += 1;
- } while ( module < moduleEnd);
+ } while (module < moduleEnd);
stepX = _modX[_modularPath[p].dir];
stepY = _modY[_modularPath[p].dir];
- errorX = _modularPath[p].x - moduleX;
+ errorX = _modularPath[p].x - moduleX;
errorX = errorX * stepX;
- errorY = _modularPath[p].y - moduleY;
+ errorY = _modularPath[p].y - moduleY;
errorY = errorY * stepY;
if ((errorX < 0) || (errorY < 0)) {
- _modularPath[p].num = 0; // the end of the path
+ _modularPath[p].num = 0; // the end of the path
// okay those last steps took us past our target but do we want to scoot or moonwalk
frames = stepCount - lastCount;
- errorX = _modularPath[p].x - walkAnim[stepCount-1].x;
- errorY = _modularPath[p].y - walkAnim[stepCount-1].y;
+ errorX = _modularPath[p].x - walkAnim[stepCount - 1].x;
+ errorY = _modularPath[p].y - walkAnim[stepCount - 1].y;
if (frames > _framesPerStep) {
- lastErrorX = _modularPath[p].x - walkAnim[stepCount-7].x;
- lastErrorY = _modularPath[p].y - walkAnim[stepCount-7].y;
- if (stepX==0) {
- if (3*ABS(lastErrorY) < ABS(errorY)) { //the last stop was closest
+ lastErrorX = _modularPath[p].x - walkAnim[stepCount - 7].x;
+ lastErrorY = _modularPath[p].y - walkAnim[stepCount - 7].y;
+ if (stepX == 0) {
+ if (3 * ABS(lastErrorY) < ABS(errorY)) { //the last stop was closest
stepCount -= _framesPerStep;
_slidyWalkAnimatorState = !_slidyWalkAnimatorState;
}
} else {
- if (3*ABS(lastErrorX) < ABS(errorX)) { //the last stop was closest
+ if (3 * ABS(lastErrorX) < ABS(errorX)) { //the last stop was closest
stepCount -= _framesPerStep;
_slidyWalkAnimatorState = !_slidyWalkAnimatorState;
}
}
}
- errorX = _modularPath[p].x - walkAnim[stepCount-1].x;
- errorY = _modularPath[p].y - walkAnim[stepCount-1].y;
+ errorX = _modularPath[p].x - walkAnim[stepCount - 1].x;
+ errorY = _modularPath[p].y - walkAnim[stepCount - 1].y;
// okay we've reached the end but we still have an error
if (errorX != 0) {
frameCount = 0;
frames = stepCount - lastCount;
do {
frameCount += 1;
- walkAnim[lastCount + frameCount - 1].x += errorX*frameCount/frames;
- } while (frameCount<frames);
+ walkAnim[lastCount + frameCount - 1].x += errorX * frameCount / frames;
+ } while (frameCount < frames);
}
if (errorY != 0) {
frameCount = 0;
frames = stepCount - lastCount;
do {
frameCount += 1;
- walkAnim[lastCount + frameCount-1].y += errorY*frameCount/frames;
- } while (frameCount<frames);
+ walkAnim[lastCount + frameCount - 1].y += errorY * frameCount / frames;
+ } while (frameCount < frames);
}
// Now is the time to put in the turn frames for the last turn
if (frames < _framesPerStep)
@@ -858,8 +858,8 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// all turns checked
lastCount = stepCount;
- moduleX = walkAnim[stepCount-1].x;
- moduleY = walkAnim[stepCount-1].y;
+ moduleX = walkAnim[stepCount - 1].x;
+ moduleY = walkAnim[stepCount - 1].y;
module16X = moduleX << 16;
module16Y = moduleY << 16;
}
@@ -879,9 +879,9 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// We've done the walk now put in any turns at the end
- if (_targetDir == NO_DIRECTIONS) { // stand in the last direction
- module = standFrames + lastRealDir;
- _targetDir = lastRealDir;
+ if (_targetDir == NO_DIRECTIONS) { // stand in the last direction
+ module = standFrames + lastRealDir;
+ _targetDir = lastRealDir;
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
walkAnim[stepCount].dir = lastRealDir;
@@ -891,7 +891,7 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
}
if (_targetDir == 9) {
if (stepCount == 0) {
- module = _framesPerChar + lastRealDir;
+ module = _framesPerChar + lastRealDir;
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
walkAnim[stepCount].dir = lastRealDir;
@@ -913,10 +913,10 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// rotate to target direction
// for george and nico put in a head turn at the start
if ((megaId == GEORGE) || (megaId == NICO)) {
- if (turnDir < 0) { // new frames for turn frames 29oct95jps
- module = turnFramesLeft + lastDir;
+ if (turnDir < 0) { // new frames for turn frames 29oct95jps
+ module = turnFramesLeft + lastDir;
} else {
- module = turnFramesRight + lastDir;
+ module = turnFramesRight + lastDir;
}
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
@@ -929,14 +929,14 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
// rotate if we need to
while (lastRealDir != _targetDir) {
lastRealDir += turnDir;
- if (turnDir < 0) { // new frames for turn frames 29oct95jps
+ if (turnDir < 0) { // new frames for turn frames 29oct95jps
if (lastRealDir < 0)
- lastRealDir += NO_DIRECTIONS;
- module = turnFramesLeft + lastRealDir;
+ lastRealDir += NO_DIRECTIONS;
+ module = turnFramesLeft + lastRealDir;
} else {
if (lastRealDir > 7)
- lastRealDir -= NO_DIRECTIONS;
- module = turnFramesRight + lastRealDir;
+ lastRealDir -= NO_DIRECTIONS;
+ module = turnFramesRight + lastRealDir;
}
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
@@ -945,10 +945,10 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
walkAnim[stepCount].y = moduleY;
stepCount += 1;
}
- module = standFrames + lastRealDir;
- walkAnim[stepCount-1].frame = module;
+ module = standFrames + lastRealDir;
+ walkAnim[stepCount - 1].frame = module;
} else { // just stand at the end
- module = standFrames + lastRealDir;
+ module = standFrames + lastRealDir;
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
walkAnim[stepCount].dir = lastRealDir;
@@ -962,7 +962,7 @@ void Router::slidyWalkAnimator(WalkData *walkAnim) {
walkAnim[stepCount].frame = 512;
stepCount += 1;
walkAnim[stepCount].frame = 512;
-// Tdebug("RouteFinder RouteSize is %d", stepCount);
+ //Tdebug("RouteFinder RouteSize is %d", stepCount);
return;
}
@@ -1071,7 +1071,7 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
// start at the begining for a change
lastDir = _modularPath[0].dir;
currentDir = _modularPath[1].dir;
- module = _framesPerChar + lastDir;
+ module = _framesPerChar + lastDir;
moduleX = _startX;
moduleY = _startY;
module16X = moduleX << 16;
@@ -1100,7 +1100,7 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
// get the direction to turn
turnDir = currentDir - lastDir;
if (turnDir < 0)
- turnDir += NO_DIRECTIONS;
+ turnDir += NO_DIRECTIONS;
if (turnDir > 4)
turnDir = -1;
@@ -1110,10 +1110,10 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
// rotate to new walk direction
// for george and nico put in a head turn at the start
if ((megaId == GEORGE) || (megaId == NICO)) {
- if (turnDir < 0) { // new frames for turn frames 29oct95jps
- module = turnFramesLeft + lastDir;
+ if (turnDir < 0) { // new frames for turn frames 29oct95jps
+ module = turnFramesLeft + lastDir;
} else {
- module = turnFramesRight + lastDir;
+ module = turnFramesRight + lastDir;
}
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
@@ -1126,14 +1126,14 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
// rotate till were facing new dir then go back 45 degrees
while (lastDir != currentDir) {
lastDir += turnDir;
- if (turnDir < 0) { // new frames for turn frames 29oct95jps
+ if (turnDir < 0) { // new frames for turn frames 29oct95jps
if (lastDir < 0)
lastDir += NO_DIRECTIONS;
- module = turnFramesLeft + lastDir;
+ module = turnFramesLeft + lastDir;
} else {
if (lastDir > 7)
lastDir -= NO_DIRECTIONS;
- module = turnFramesRight + lastDir;
+ module = turnFramesRight + lastDir;
}
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
@@ -1213,19 +1213,19 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
int32 p;
- for (p = 1; _modularPath[p].dir < NO_DIRECTIONS; ++p) {
+ for (p = 1; _modularPath[p].dir < NO_DIRECTIONS; ++p) {
while (_modularPath[p].num > 0) {
currentDir = _modularPath[p].dir;
if (currentDir < NO_DIRECTIONS) {
- module = currentDir * _framesPerStep * 2 + left * _framesPerStep;
+ module = currentDir * _framesPerStep * 2 + left * _framesPerStep;
left = !left;
moduleEnd = module + _framesPerStep;
step = 0;
scale = (_scaleA * moduleY + _scaleB);
do {
- module16X += _dx[module]*scale;
- module16Y += _dy[module]*scale;
+ module16X += _dx[module] * scale;
+ module16Y += _dy[module] * scale;
moduleX = module16X >> 16;
moduleY = module16Y >> 16;
walkAnim[stepCount].frame = module;
@@ -1236,22 +1236,22 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
stepCount += 1;
module += 1;
step += 1;
- } while ( module < moduleEnd);
- errorX = _modularPath[p].x - moduleX;
+ } while (module < moduleEnd);
+ errorX = _modularPath[p].x - moduleX;
errorX = errorX * _modX[_modularPath[p].dir];
- errorY = _modularPath[p].y - moduleY;
+ errorY = _modularPath[p].y - moduleY;
errorY = errorY * _modY[_modularPath[p].dir];
if ((errorX < 0) || (errorY < 0)) {
_modularPath[p].num = 0;
stepCount -= _framesPerStep;
left = !left;
// Okay this is the end of a section
- moduleX = walkAnim[stepCount-1].x;
- moduleY = walkAnim[stepCount-1].y;
+ moduleX = walkAnim[stepCount - 1].x;
+ moduleY = walkAnim[stepCount - 1].y;
module16X = moduleX << 16;
module16Y = moduleY << 16;
- _modularPath[p].x =moduleX;
- _modularPath[p].y =moduleY;
+ _modularPath[p].x = moduleX;
+ _modularPath[p].y = moduleY;
// Now is the time to put in the turn frames for the last turn
if ((stepCount - lastCount) < _framesPerStep) { // no step taken
currentDir = 99;// this ensures that we don't put in turn frames for this walk or the next
@@ -1350,10 +1350,10 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
stepCount += 1;
}
}
- module = _framesPerChar + _modularPath[p-1].dir;
+ module = _framesPerChar + _modularPath[p - 1].dir;
walkAnim[stepCount].frame = module;
walkAnim[stepCount].step = 0;
- walkAnim[stepCount].dir = _modularPath[p-1].dir;
+ walkAnim[stepCount].dir = _modularPath[p - 1].dir;
walkAnim[stepCount].x = moduleX;
walkAnim[stepCount].y = moduleY;
stepCount += 1;
@@ -1395,7 +1395,7 @@ int32 Router::solidWalkAnimator(WalkData *walkAnim) {
bool Router::scan(int32 level) {
/*********************************************************************
- * Called successively from routeFinder until no more changes take
+ * Called successively from routeFinder until no more changes take
* place in the grid array, ie he best path has been found
*
* Scans through every point in the node array and checks if there is
@@ -1447,7 +1447,7 @@ bool Router::scan(int32 level) {
}
-int32 Router::newCheck(int32 status, int32 x1 , int32 y1 , int32 x2 ,int32 y2) {
+int32 Router::newCheck(int32 status, int32 x1, int32 y1, int32 x2, int32 y2) {
/*********************************************************************
* newCheck routine checks if the route between two points can be
* achieved without crossing any of the bars in the Bars array.
@@ -1531,7 +1531,7 @@ int32 Router::newCheck(int32 status, int32 x1 , int32 y1 , int32 x2 ,int32 y2) {
step2 = check(x1 + ldx / 2, y1, x1 + ldx / 2 + dlx, y2);
if (step2 != 0) {
step3 = check(x1 + ldx / 2 + dlx, y2, x2, y2);
- if (step3 != 0) {
+ if (step3 != 0) {
steps = step1 + step2 + step3;
options |= 1;
}
@@ -1565,8 +1565,8 @@ int32 Router::newCheck(int32 status, int32 x1 , int32 y1 , int32 x2 ,int32 y2) {
ldx = 0;
// options are square, diagonal a code 1 route
- step1 = check(x1 ,y1, x1, y1 + ldy);
- if (step1 != 0) {
+ step1 = check(x1 , y1, x1, y1 + ldy);
+ if (step1 != 0) {
step2 = check(x1, y1 + ldy, x2, y2);
if (step2 != 0) {
steps = step1 + step2;
@@ -1608,7 +1608,7 @@ int32 Router::newCheck(int32 status, int32 x1 , int32 y1 , int32 x2 ,int32 y2) {
step2 = check(x1 + dlx / 2, y1 + dly / 2, x1 + dlx / 2, y1 + ldy + dly / 2);
if (step2 != 0) {
step3 = check(x1 + dlx / 2, y1 + ldy + dly / 2, x2, y2);
- if (step3 != 0) {
+ if (step3 != 0) {
steps = step1 + step2 + step3;
options |= 8;
}
@@ -1659,7 +1659,7 @@ bool Router::lineCheck(int32 x1, int32 y1, int32 x2, int32 y2) {
int32 dirx = x2 - x1;
int32 diry = y2 - y1;
- int32 co = (y1 * dirx) - (x1 * diry); // new line equation
+ int32 co = (y1 * dirx) - (x1 * diry); // new line equation
for (int i = 0; i < _nBars && linesCrossed; i++) {
// skip if not on module
@@ -1668,7 +1668,7 @@ bool Router::lineCheck(int32 x1, int32 y1, int32 x2, int32 y2) {
// but all this arithmetic we must have loads of time
// slope it he slope between the two lines
- int32 slope = (_bars[i].dx * diry) - (_bars[i].dy *dirx);
+ int32 slope = (_bars[i].dx * diry) - (_bars[i].dy * dirx);
// assuming parallel lines don't cross
if (slope != 0) {
// calculate x intercept and check its on both
@@ -1818,50 +1818,50 @@ int32 Router::checkTarget(int32 x, int32 y) {
// ****************************************************************************
int32 Router::LoadWalkResources(Object *megaObject, int32 x, int32 y, int32 dir) {
- WalkGridHeader floorHeader;
- int32 i;
- uint8 *fPolygrid;
- uint8 *fMegaWalkData;
+ WalkGridHeader floorHeader;
+ int32 i;
+ uint8 *fPolygrid;
+ uint8 *fMegaWalkData;
- int32 floorId;
- int32 walkGridResourceId;
+ int32 floorId;
+ int32 walkGridResourceId;
Object *floorObject;
- int32 cnt;
+ int32 cnt;
uint32 cntu;
// load in floor grid for current mega
floorId = megaObject->o_place;
- //floorObject = (object *) Lock_object(floorId);
+ //floorObject = (object *)Lock_object(floorId);
floorObject = _objMan->fetchObject(floorId);
walkGridResourceId = floorObject->o_resource;
//Unlock_object(floorId);
- //ResOpen(walkGridResourceId); // mouse wiggle
- //fPolygrid = ResLock(walkGridResourceId); // mouse wiggle
- fPolygrid = (uint8*)_resMan->openFetchRes(walkGridResourceId);
+ //ResOpen(walkGridResourceId); // mouse wiggle
+ //fPolygrid = ResLock(walkGridResourceId); // mouse wiggle
+ fPolygrid = (uint8 *)_resMan->openFetchRes(walkGridResourceId);
fPolygrid += sizeof(Header);
- memcpy(&floorHeader,fPolygrid,sizeof(WalkGridHeader));
+ memcpy(&floorHeader, fPolygrid, sizeof(WalkGridHeader));
fPolygrid += sizeof(WalkGridHeader);
_nBars = _resMan->getUint32(floorHeader.numBars);
if (_nBars >= O_GRID_SIZE) {
- #ifdef DEBUG //check for id > number in file,
+#ifdef DEBUG //check for id > number in file,
error("RouteFinder Error too many _bars %d", _nBars);
- #endif
+#endif
_nBars = 0;
}
- _nNodes = _resMan->getUint32(floorHeader.numNodes)+1; //array starts at 0 begins at a start _node has nnodes nodes and a target _node
+ _nNodes = _resMan->getUint32(floorHeader.numNodes) + 1; //array starts at 0 begins at a start _node has nnodes nodes and a target _node
if (_nNodes >= O_GRID_SIZE) {
- #ifdef DEBUG //check for id > number in file,
- error("RouteFinder Error too many nodes %d", _nNodes);
- #endif
+#ifdef DEBUG //check for id > number in file,
+ error("RouteFinder Error too many nodes %d", _nNodes);
+#endif
_nNodes = 0;
}
@@ -1883,37 +1883,37 @@ int32 Router::LoadWalkResources(Object *megaObject, int32 x, int32 y, int32 dir)
/*j = 1;// leave _node 0 for start _node
do {
- memmove(&_node[j].x,fPolygrid,2*sizeof(int16));
- fPolygrid += 2*sizeof(int16);
- j ++;
+ memmove(&_node[j].x,fPolygrid,2*sizeof(int16));
+ fPolygrid += 2*sizeof(int16);
+ j ++;
} while (j < _nNodes);//array starts at 0*/
for (cnt = 1; cnt < _nNodes; cnt++) {
_node[cnt].x = _resMan->readUint16(fPolygrid); fPolygrid += 2;
_node[cnt].y = _resMan->readUint16(fPolygrid); fPolygrid += 2;
}
- //ResUnlock(walkGridResourceId); // mouse wiggle
- //ResClose(walkGridResourceId); // mouse wiggle
+ //ResUnlock(walkGridResourceId); // mouse wiggle
+ //ResClose(walkGridResourceId); // mouse wiggle
_resMan->resClose(walkGridResourceId);
// floor grid loaded
-// copy the mega structure into the local variables for use in all subroutines
+ // copy the mega structure into the local variables for use in all subroutines
_startX = megaObject->o_xcoord;
_startY = megaObject->o_ycoord;
_startDir = megaObject->o_dir;
_targetX = x;
- _targetY= y;
+ _targetY = y;
_targetDir = dir;
_scaleA = megaObject->o_scale_a;
_scaleB = megaObject->o_scale_b;
- //ResOpen(megaObject->o_mega_resource); // mouse wiggle
- //fMegaWalkData = ResLock(megaObject->o_mega_resource); // mouse wiggle
- fMegaWalkData = (uint8*)_resMan->openFetchRes(megaObject->o_mega_resource);
+ //ResOpen(megaObject->o_mega_resource); // mouse wiggle
+ //fMegaWalkData = ResLock(megaObject->o_mega_resource); // mouse wiggle
+ fMegaWalkData = (uint8 *)_resMan->openFetchRes(megaObject->o_mega_resource);
// Apparently this resource is in little endian in both the Mac and the PC version
_nWalkFrames = fMegaWalkData[0];
@@ -1945,28 +1945,28 @@ int32 Router::LoadWalkResources(Object *megaObject, int32 x, int32 y, int32 dir)
memmove(&_modY[0],fMegaWalkData,NO_DIRECTIONS*sizeof(int32));
fMegaWalkData += NO_DIRECTIONS*sizeof(int32);*/
- //ResUnlock(megaObject->o_mega_resource); // mouse wiggle
- //ResClose(megaObject->o_mega_resource); // mouse wiggle
+ //ResUnlock(megaObject->o_mega_resource); // mouse wiggle
+ //ResClose(megaObject->o_mega_resource); // mouse wiggle
_resMan->resClose(megaObject->o_mega_resource);
_diagonalx = _modX[3]; //36
_diagonaly = _modY[3]; //8
-// mega data ready
+ // mega data ready
-// finish setting grid by putting mega _node at begining
-// and target _node at end and reset current values
+ // finish setting grid by putting mega _node at begining
+ // and target _node at end and reset current values
_node[0].x = _startX;
_node[0].y = _startY;
_node[0].level = 1;
_node[0].prev = 0;
_node[0].dist = 0;
- i=1;
+ i = 1;
do {
_node[i].level = 0;
_node[i].prev = 0;
_node[i].dist = 9999;
- i=i+1;
+ i = i + 1;
} while (i < _nNodes);
_node[_nNodes].x = _targetX;
_node[_nNodes].y = _targetY;
@@ -2088,12 +2088,12 @@ void Router::extractRoute() {
#define DIAGONALY 8
int whatTarget(int32 startX, int32 startY, int32 destX, int32 destY) {
int tar_dir;
-//setting up
- int deltaX = destX-startX;
- int deltaY = destY-startY;
+ //setting up
+ int deltaX = destX - startX;
+ int deltaY = destY - startY;
int signX = (deltaX > 0);
int signY = (deltaY > 0);
- int slope;
+ int slope;
if ((ABS(deltaY) * DIAGONALX) < (ABS(deltaX) * DIAGONALY / 2))
slope = 0;// its flat
@@ -2103,22 +2103,22 @@ int whatTarget(int32 startX, int32 startY, int32 destX, int32 destY) {
slope = 1;// its diagonal
if (slope == 0) { //flat
- if (signX == 1) // going right
+ if (signX == 1) // going right
tar_dir = 2;
else
tar_dir = 6;
} else if (slope == 2) { //vertical
- if (signY == 1) // going down
+ if (signY == 1) // going down
tar_dir = 4;
else
tar_dir = 0;
} else if (signX == 1) { //right diagonal
- if (signY == 1) // going down
+ if (signY == 1) // going down
tar_dir = 3;
else
tar_dir = 1;
} else { //left diagonal
- if (signY == 1) // going down
+ if (signY == 1) // going down
tar_dir = 5;
else
tar_dir = 7;
diff --git a/engines/sword1/router.h b/engines/sword1/router.h
index 31c4291eed..82724b1e6e 100644
--- a/engines/sword1/router.h
+++ b/engines/sword1/router.h
@@ -27,7 +27,7 @@
namespace Sword1 {
-#include "common/pack-start.h" // START STRUCT PACKING
+#include "common/pack-start.h" // START STRUCT PACKING
struct BarData {
int16 x1;
@@ -38,9 +38,9 @@ struct BarData {
int16 ymin;
int16 xmax;
int16 ymax;
- int16 dx; // x2 - x1
- int16 dy; // y2 - y1
- int32 co; // co = (y1*dx) - (x1*dy) from an equation for a line y*dx = x*dy + co
+ int16 dx; // x2 - x1
+ int16 dy; // y2 - y1
+ int32 co; // co = (y1*dx) - (x1*dy) from an equation for a line y*dx = x*dy + co
} PACKED_STRUCT;
struct NodeData {
@@ -51,13 +51,13 @@ struct NodeData {
int16 dist;
} PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
+#include "common/pack-end.h" // END STRUCT PACKING
struct FloorData {
- int32 nbars;
- BarData *bars;
- int32 nnodes;
- NodeData *node;
+ int32 nbars;
+ BarData *bars;
+ int32 nnodes;
+ NodeData *node;
};
struct RouteData {
@@ -115,24 +115,24 @@ private:
int32 megaId;
- RouteData _route[O_ROUTE_SIZE];
- PathData _smoothPath[O_ROUTE_SIZE];
- PathData _modularPath[O_ROUTE_SIZE];
- int32 _routeLength;
-
- int32 _framesPerStep, _framesPerChar;
- uint8 _nWalkFrames, _nTurnFrames;
- int32 _dx[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR];
- int32 _dy[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR];
- int32 _modX[NO_DIRECTIONS];
- int32 _modY[NO_DIRECTIONS];
- int32 _diagonalx, _diagonaly;
- int32 standFrames;
- int32 turnFramesLeft, turnFramesRight;
- int32 walkFramesLeft, walkFramesRight; // left/right walking turn
- int32 slowInFrames, slowOutFrames;
-
- bool _slidyWalkAnimatorState;
+ RouteData _route[O_ROUTE_SIZE];
+ PathData _smoothPath[O_ROUTE_SIZE];
+ PathData _modularPath[O_ROUTE_SIZE];
+ int32 _routeLength;
+
+ int32 _framesPerStep, _framesPerChar;
+ uint8 _nWalkFrames, _nTurnFrames;
+ int32 _dx[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR];
+ int32 _dy[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR];
+ int32 _modX[NO_DIRECTIONS];
+ int32 _modY[NO_DIRECTIONS];
+ int32 _diagonalx, _diagonaly;
+ int32 standFrames;
+ int32 turnFramesLeft, turnFramesRight;
+ int32 walkFramesLeft, walkFramesRight; // left/right walking turn
+ int32 slowInFrames, slowOutFrames;
+
+ bool _slidyWalkAnimatorState;
int32 LoadWalkResources(Object *mega, int32 x, int32 y, int32 dir);
int32 getRoute();
diff --git a/engines/sword1/screen.cpp b/engines/sword1/screen.cpp
index 1da89a1091..ae128b8c05 100644
--- a/engines/sword1/screen.cpp
+++ b/engines/sword1/screen.cpp
@@ -78,13 +78,9 @@ void Screen::useTextManager(Text *pTextMan) {
_textMan = pTextMan;
}
-int32 Screen::inRange(int32 a, int32 b, int32 c) { // return b(!) so that: a <= b <= c
- return (a > b) ? (a) : ((b < c) ? b : c);
-}
-
void Screen::setScrolling(int16 offsetX, int16 offsetY) {
- offsetX = inRange(0, offsetX, Logic::_scriptVars[MAX_SCROLL_OFFSET_X]);
- offsetY = inRange(0, offsetY, Logic::_scriptVars[MAX_SCROLL_OFFSET_Y]);
+ offsetX = CLIP<int32>(offsetX, 0, Logic::_scriptVars[MAX_SCROLL_OFFSET_X]);
+ offsetY = CLIP<int32>(offsetY, 0, Logic::_scriptVars[MAX_SCROLL_OFFSET_Y]);
if (Logic::_scriptVars[SCROLL_FLAG] == 2) { // first time on this screen - need absolute scroll immediately!
_oldScrollX = Logic::_scriptVars[SCROLL_OFFSET_X] = (uint32)offsetX;
@@ -101,18 +97,18 @@ void Screen::setScrolling(int16 offsetX, int16 offsetY) {
_oldScrollY = Logic::_scriptVars[SCROLL_OFFSET_Y];
int dx = offsetX - Logic::_scriptVars[SCROLL_OFFSET_X];
int dy = offsetY - Logic::_scriptVars[SCROLL_OFFSET_Y];
- int scrlDistX = inRange(-MAX_SCROLL_DISTANCE, (((SCROLL_FRACTION - 1) + ABS(dx)) / SCROLL_FRACTION) * ((dx > 0) ? 1 : -1), MAX_SCROLL_DISTANCE);
- int scrlDistY = inRange(-MAX_SCROLL_DISTANCE, (((SCROLL_FRACTION - 1) + ABS(dy)) / SCROLL_FRACTION) * ((dy > 0) ? 1 : -1), MAX_SCROLL_DISTANCE);
+ int scrlDistX = CLIP<int32>((((SCROLL_FRACTION - 1) + ABS(dx)) / SCROLL_FRACTION) * ((dx > 0) ? 1 : -1), -MAX_SCROLL_DISTANCE, MAX_SCROLL_DISTANCE);
+ int scrlDistY = CLIP<int32>((((SCROLL_FRACTION - 1) + ABS(dy)) / SCROLL_FRACTION) * ((dy > 0) ? 1 : -1), -MAX_SCROLL_DISTANCE, MAX_SCROLL_DISTANCE);
if ((scrlDistX != 0) || (scrlDistY != 0))
_fullRefresh = true;
- Logic::_scriptVars[SCROLL_OFFSET_X] = inRange(0, Logic::_scriptVars[SCROLL_OFFSET_X] + scrlDistX, Logic::_scriptVars[MAX_SCROLL_OFFSET_X]);
- Logic::_scriptVars[SCROLL_OFFSET_Y] = inRange(0, Logic::_scriptVars[SCROLL_OFFSET_Y] + scrlDistY, Logic::_scriptVars[MAX_SCROLL_OFFSET_Y]);
+ Logic::_scriptVars[SCROLL_OFFSET_X] = CLIP<int32>(Logic::_scriptVars[SCROLL_OFFSET_X] + scrlDistX, 0, Logic::_scriptVars[MAX_SCROLL_OFFSET_X]);
+ Logic::_scriptVars[SCROLL_OFFSET_Y] = CLIP<int32>(Logic::_scriptVars[SCROLL_OFFSET_Y] + scrlDistY, 0, Logic::_scriptVars[MAX_SCROLL_OFFSET_Y]);
} else {
// SCROLL_FLAG == 0, this usually means that the screen is smaller than 640x400 and doesn't need scrolling at all
// however, it can also mean that the gamescript overwrote the scrolling flag to take care of scrolling directly,
// (see bug report #1345130) so we ignore the offset arguments in this case
- Logic::_scriptVars[SCROLL_OFFSET_X] = inRange(0, Logic::_scriptVars[SCROLL_OFFSET_X], Logic::_scriptVars[MAX_SCROLL_OFFSET_X]);
- Logic::_scriptVars[SCROLL_OFFSET_Y] = inRange(0, Logic::_scriptVars[SCROLL_OFFSET_Y], Logic::_scriptVars[MAX_SCROLL_OFFSET_Y]);
+ Logic::_scriptVars[SCROLL_OFFSET_X] = CLIP<int32>(Logic::_scriptVars[SCROLL_OFFSET_X], 0, Logic::_scriptVars[MAX_SCROLL_OFFSET_X]);
+ Logic::_scriptVars[SCROLL_OFFSET_Y] = CLIP<int32>(Logic::_scriptVars[SCROLL_OFFSET_Y], 0, Logic::_scriptVars[MAX_SCROLL_OFFSET_Y]);
if ((Logic::_scriptVars[SCROLL_OFFSET_X] != _oldScrollX) || (Logic::_scriptVars[SCROLL_OFFSET_Y] != _oldScrollY)) {
_fullRefresh = true;
_oldScrollX = Logic::_scriptVars[SCROLL_OFFSET_X];
@@ -134,13 +130,13 @@ void Screen::fadeUpPalette() {
}
void Screen::fnSetPalette(uint8 start, uint16 length, uint32 id, bool fadeUp) {
- uint8 *palData = (uint8*)_resMan->openFetchRes(id);
+ uint8 *palData = (uint8 *)_resMan->openFetchRes(id);
if (start == 0) // force color 0 to black
palData[0] = palData[1] = palData[2] = 0;
if (SwordEngine::isMac()) { // see bug #1701058
if (start != 0 && start + length == 256) // and force color 255 to black as well
- palData[(length-1)*3+0] = palData[(length-1)*3+1] = palData[(length-1)*3+2] = 0;
+ palData[(length - 1) * 3 + 0] = palData[(length - 1) * 3 + 1] = palData[(length - 1) * 3 + 2] = 0;
}
for (uint32 cnt = 0; cnt < length; cnt++) {
@@ -172,7 +168,7 @@ bool Screen::showScrollFrame() {
if ((!_fullRefresh) || Logic::_scriptVars[NEW_PALETTE] || _updatePalette)
return false; // don't draw an additional frame if we aren't scrolling or have to change the palette
if ((_oldScrollX == Logic::_scriptVars[SCROLL_OFFSET_X]) &&
- (_oldScrollY == Logic::_scriptVars[SCROLL_OFFSET_Y]))
+ (_oldScrollY == Logic::_scriptVars[SCROLL_OFFSET_Y]))
return false; // check again if we *really* are scrolling.
uint16 avgScrlX = (uint16)(_oldScrollX + Logic::_scriptVars[SCROLL_OFFSET_X]) / 2;
@@ -322,25 +318,25 @@ void Screen::newScreen(uint32 screen) {
if (SwordEngine::isPsx())
flushPsxCache();
- _screenBuf = (uint8*)malloc(_scrnSizeX * _scrnSizeY);
- _screenGrid = (uint8*)malloc(_gridSizeX * _gridSizeY);
+ _screenBuf = (uint8 *)malloc(_scrnSizeX * _scrnSizeY);
+ _screenGrid = (uint8 *)malloc(_gridSizeX * _gridSizeY);
memset(_screenGrid, 0, _gridSizeX * _gridSizeY);
for (cnt = 0; cnt < _roomDefTable[_currentScreen].totalLayers; cnt++) {
// open and lock all resources, will be closed in quitScreen()
- _layerBlocks[cnt] = (uint8*)_resMan->openFetchRes(_roomDefTable[_currentScreen].layers[cnt]);
+ _layerBlocks[cnt] = (uint8 *)_resMan->openFetchRes(_roomDefTable[_currentScreen].layers[cnt]);
if (cnt > 0)
_layerBlocks[cnt] += sizeof(Header);
}
for (cnt = 0; cnt < _roomDefTable[_currentScreen].totalLayers - 1; cnt++) {
// there's no grid for the background layer, so it's totalLayers - 1
- _layerGrid[cnt] = (uint16*)_resMan->openFetchRes(_roomDefTable[_currentScreen].grids[cnt]);
+ _layerGrid[cnt] = (uint16 *)_resMan->openFetchRes(_roomDefTable[_currentScreen].grids[cnt]);
_layerGrid[cnt] += 14;
}
_parallax[0] = _parallax[1] = NULL;
if (_roomDefTable[_currentScreen].parallax[0])
- _parallax[0] = (uint8*)_resMan->openFetchRes(_roomDefTable[_currentScreen].parallax[0]);
+ _parallax[0] = (uint8 *)_resMan->openFetchRes(_roomDefTable[_currentScreen].parallax[0]);
if (_roomDefTable[_currentScreen].parallax[1])
- _parallax[1] = (uint8*)_resMan->openFetchRes(_roomDefTable[_currentScreen].parallax[1]);
+ _parallax[1] = (uint8 *)_resMan->openFetchRes(_roomDefTable[_currentScreen].parallax[1]);
_updatePalette = true;
_fullRefresh = true;
@@ -393,13 +389,13 @@ void Screen::draw() {
src++;
dest++;
}
- }
+ }
} else if (!(SwordEngine::isPsx())) {
memcpy(_screenBuf, _layerBlocks[0], _scrnSizeX * _scrnSizeY);
} else { //We are using PSX version
if (_currentScreen == 45 || _currentScreen == 55 ||
- _currentScreen == 57 || _currentScreen == 63 || _currentScreen == 71) { // Width shrinked backgrounds
+ _currentScreen == 57 || _currentScreen == 63 || _currentScreen == 71) { // Width shrinked backgrounds
if (!_psxCache.decodedBackground)
_psxCache.decodedBackground = psxShrinkedBackgroundToIndexed(_layerBlocks[0], _scrnSizeX, _scrnSizeY);
} else {
@@ -431,7 +427,7 @@ void Screen::draw() {
if (!_psxCache.extPlxCache) {
Common::File parallax;
parallax.open("TRAIN.PLX");
- _psxCache.extPlxCache = (uint8*) malloc(parallax.size());
+ _psxCache.extPlxCache = (uint8 *)malloc(parallax.size());
parallax.read(_psxCache.extPlxCache, parallax.size());
parallax.close();
}
@@ -456,7 +452,7 @@ void Screen::processImage(uint32 id) {
else
frameHead = _resMan->fetchFrame(_resMan->openFetchRes(compact->o_resource), compact->o_frame);
- uint8 *sprData = ((uint8*)frameHead) + sizeof(FrameHeader);
+ uint8 *sprData = ((uint8 *)frameHead) + sizeof(FrameHeader);
uint16 spriteX = compact->o_anim_x;
uint16 spriteY = compact->o_anim_y;
@@ -474,8 +470,8 @@ void Screen::processImage(uint32 id) {
uint8 *tonyBuf = NULL;
uint8 *hifBuf = NULL;
if (SwordEngine::isPsx() && compact->o_type != TYPE_TEXT) { // PSX sprites are compressed with HIF
- hifBuf = (uint8*)malloc(_resMan->readUint16(&frameHead->width) * _resMan->readUint16(&frameHead->height)/2);
- memset(hifBuf, 0x00, (_resMan->readUint16(&frameHead->width) * _resMan->readUint16(&frameHead->height)/2));
+ hifBuf = (uint8 *)malloc(_resMan->readUint16(&frameHead->width) * _resMan->readUint16(&frameHead->height) / 2);
+ memset(hifBuf, 0x00, (_resMan->readUint16(&frameHead->width) * _resMan->readUint16(&frameHead->height) / 2));
decompressHIF(sprData, hifBuf);
sprData = hifBuf;
} else if (frameHead->runTimeComp[3] == '7') { // RLE7 encoded?
@@ -485,7 +481,7 @@ void Screen::processImage(uint32 id) {
decompressRLE0(sprData, _resMan->readUint32(&frameHead->compSize), _rleBuffer);
sprData = _rleBuffer;
} else if (frameHead->runTimeComp[1] == 'I') { // new type
- tonyBuf = (uint8*)malloc(_resMan->readUint16(&frameHead->width) * _resMan->readUint16(&frameHead->height));
+ tonyBuf = (uint8 *)malloc(_resMan->readUint16(&frameHead->width) * _resMan->readUint16(&frameHead->height));
decompressTony(sprData, _resMan->readUint32(&frameHead->compSize), tonyBuf);
sprData = tonyBuf;
}
@@ -538,16 +534,16 @@ void Screen::processImage(uint32 id) {
if ((sprSizeX > 0) && (sprSizeY > 0)) {
if ((!(SwordEngine::isPsx()) || (compact->o_type == TYPE_TEXT)
- || (compact->o_resource == LVSFLY) || (!(compact->o_resource == GEORGE_MEGA) && (sprSizeX < 260))))
+ || (compact->o_resource == LVSFLY) || (!(compact->o_resource == GEORGE_MEGA) && (sprSizeX < 260))))
drawSprite(sprData + incr, spriteX, spriteY, sprSizeX, sprSizeY, sprPitch);
else if (((sprSizeX >= 260) && (sprSizeX < 450)) || ((compact->o_resource == GMWRITH) && (sprSizeX < 515)) // a psx shrinked sprite (1/2 width)
- || ((compact->o_resource == GMPOWER) && (sprSizeX < 515))) // some needs to be hardcoded, headers don't give useful infos
+ || ((compact->o_resource == GMPOWER) && (sprSizeX < 515))) // some needs to be hardcoded, headers don't give useful infos
drawPsxHalfShrinkedSprite(sprData + incr, spriteX, spriteY, sprSizeX / 2, sprSizeY, sprPitch / 2);
else if (sprSizeX >= 450) // A PSX double shrinked sprite (1/3 width)
drawPsxFullShrinkedSprite(sprData + incr, spriteX, spriteY, sprSizeX / 3, sprSizeY, sprPitch / 3);
else // This is for psx half shrinked, walking george and remaining sprites
drawPsxHalfShrinkedSprite(sprData + incr, spriteX, spriteY, sprSizeX, sprSizeY, sprPitch);
- if (!(compact->o_status&STAT_FORE) && !(SwordEngine::isPsx() && (compact->o_resource == MOUBUSY))) // Check fixes moue sprite being masked by layer, happens only on psx
+ if (!(compact->o_status & STAT_FORE) && !(SwordEngine::isPsx() && (compact->o_resource == MOUBUSY))) // Check fixes moue sprite being masked by layer, happens only on psx
verticalMask(spriteX, spriteY, sprSizeX, sprSizeY);
}
@@ -636,8 +632,8 @@ void Screen::renderParallax(uint8 *data) {
if (SwordEngine::isPsx()) //Parallax headers are different in PSX version
fetchPsxParallaxSize(data, &paraSizeX, &paraSizeY);
else {
- header = (ParallaxHeader*)data;
- lineIndexes = (uint32*)(data + sizeof(ParallaxHeader));
+ header = (ParallaxHeader *)data;
+ lineIndexes = (uint32 *)(data + sizeof(ParallaxHeader));
paraSizeX = _resMan->getUint16(header->sizeX);
paraSizeY = _resMan->getUint16(header->sizeY);
}
@@ -832,7 +828,7 @@ void Screen::addToGraphicList(uint8 listId, uint32 objId) {
_sortList[_sortLength].id = objId;
_sortList[_sortLength].y = cpt->o_anim_y; // gives feet coords if boxed mega, otherwise top of sprite box
if (!(cpt->o_status & STAT_SHRINK)) { // not a boxed mega using shrinking
- Header *frameRaw = (Header*)_resMan->openFetchRes(cpt->o_resource);
+ Header *frameRaw = (Header *)_resMan->openFetchRes(cpt->o_resource);
FrameHeader *frameHead = _resMan->fetchFrame(frameRaw, cpt->o_frame);
_sortList[_sortLength].y += _resMan->readUint16(&frameHead->height) - 1; // now pointing to base of sprite
_resMan->resClose(cpt->o_resource);
@@ -845,7 +841,7 @@ void Screen::addToGraphicList(uint8 listId, uint32 objId) {
}
}
-uint8* Screen::psxBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres) {
+uint8 *Screen::psxBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres) {
uint32 xresInTiles = bakXres / 16;
uint32 yresInTiles = ((bakYres / 2) % 16) ? (bakYres / 32) + 1 : (bakYres / 32);
uint32 totTiles = xresInTiles * yresInTiles;
@@ -867,7 +863,7 @@ uint8* Screen::psxBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint
if (isCompressed)
decompressHIF(psxBackground + tileOffset - 4, decomp_tile); //Decompress the tile into decomp_tile
else
- memcpy(decomp_tile, psxBackground + tileOffset - 4, 16*16);
+ memcpy(decomp_tile, psxBackground + tileOffset - 4, 16 * 16);
if (currentTile > 0 && !(currentTile % xresInTiles)) { //Finished a line of tiles, going down
tileYpos++;
@@ -887,7 +883,7 @@ uint8* Screen::psxBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint
}
// needed because some psx backgrounds are half width and half height
-uint8* Screen::psxShrinkedBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres) {
+uint8 *Screen::psxShrinkedBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres) {
uint32 xresInTiles = ((bakXres / 2) % 16) ? (bakXres / 32) + 1 : (bakXres / 32);
uint32 yresInTiles = ((bakYres / 2) % 16) ? (bakYres / 32) + 1 : (bakYres / 32);
uint32 totTiles = xresInTiles * yresInTiles;
@@ -899,7 +895,7 @@ uint8* Screen::psxShrinkedBackgroundToIndexed(uint8 *psxBackground, uint32 bakXr
uint8 *fullres_buffer = (uint8 *)malloc(bakXres * (yresInTiles + 1) * 32);
memset(fullres_buffer, 0, bakXres * (yresInTiles + 1) * 32);
- bool isCompressed = (READ_LE_UINT32(psxBackground) == MKTAG('C','O','M','P'));
+ bool isCompressed = (READ_LE_UINT32(psxBackground) == MKTAG('C', 'O', 'M', 'P'));
totTiles -= xresInTiles;
psxBackground += 4; //We skip the id tag
@@ -1182,7 +1178,7 @@ void Screen::spriteClipAndSet(uint16 *pSprX, uint16 *pSprY, uint16 *pSprWidth, u
if (*pSprWidth && *pSprHeight) {
// sprite will be drawn, so mark it in the grid buffer
uint16 gridH = (*pSprHeight + (sprY & (SCRNGRID_Y - 1)) + (SCRNGRID_Y - 1)) / SCRNGRID_Y;
- uint16 gridW = (*pSprWidth + (sprX & (SCRNGRID_X - 1)) + (SCRNGRID_X - 1)) / SCRNGRID_X;
+ uint16 gridW = (*pSprWidth + (sprX & (SCRNGRID_X - 1)) + (SCRNGRID_X - 1)) / SCRNGRID_X;
if (SwordEngine::isPsx()) {
gridH *= 2; // This will correct the PSX sprite being cut at half height
@@ -1229,10 +1225,10 @@ void Screen::showFrame(uint16 x, uint16 y, uint32 resId, uint32 frameNo, const b
if (resId != 0xffffffff) {
FrameHeader *frameHead = _resMan->fetchFrame(_resMan->openFetchRes(resId), frameNo);
- uint8 *frameData = ((uint8*)frameHead) + sizeof(FrameHeader);
+ uint8 *frameData = ((uint8 *)frameHead) + sizeof(FrameHeader);
if (SwordEngine::isPsx()) { //We need to decompress PSX frames
- uint8 *frameBufferPSX = (uint8 *)malloc(_resMan->getUint16(frameHead->width) * _resMan->getUint16(frameHead->height)/2);
+ uint8 *frameBufferPSX = (uint8 *)malloc(_resMan->getUint16(frameHead->width) * _resMan->getUint16(frameHead->height) / 2);
decompressHIF(frameData, frameBufferPSX);
for (i = 0; i < _resMan->getUint16(frameHead->height) / 2; i++) {
diff --git a/engines/sword1/screen.h b/engines/sword1/screen.h
index ece37b0ecc..7586e937a7 100644
--- a/engines/sword1/screen.h
+++ b/engines/sword1/screen.h
@@ -38,14 +38,14 @@ struct SortSpr {
};
struct RoomDef {
- int totalLayers;
- int sizeX;
- int sizeY;
- int gridWidth; //number of 16*16 grid blocks across - including off screen edges.
- uint32 layers[4];
- uint32 grids[3];
- uint32 palettes[2];
- uint32 parallax[2];
+ int totalLayers;
+ int sizeX;
+ int sizeY;
+ int gridWidth; //number of 16*16 grid blocks across - including off screen edges.
+ uint32 layers[4];
+ uint32 grids[3];
+ uint32 palettes[2];
+ uint32 parallax[2];
};
struct PSXDataCache { // Cache for PSX screen, to avoid decompressing background at every screen update
@@ -68,7 +68,7 @@ struct PSXDataCache { // Cache for PSX screen, to avoid decompressing background
class ResMan;
class ObjectMan;
class Text; // Text objects use sprites that are created internally at run-time
- // the buffer belongs to Text, so we need a reference here.
+ // the buffer belongs to Text, so we need a reference here.
class Screen {
public:
@@ -118,15 +118,14 @@ private:
void drawSprite(uint8 *sprData, uint16 sprX, uint16 sprY, uint16 sprWidth, uint16 sprHeight, uint16 sprPitch);
void drawPsxHalfShrinkedSprite(uint8 *sprData, uint16 sprX, uint16 sprY, uint16 sprWidth, uint16 sprHeight, uint16 sprPitch);
void drawPsxFullShrinkedSprite(uint8 *sprData, uint16 sprX, uint16 sprY, uint16 sprWidth, uint16 sprHeight, uint16 sprPitch);
- uint8* psxBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres);
- uint8* psxShrinkedBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres);
+ uint8 *psxBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres);
+ uint8 *psxShrinkedBackgroundToIndexed(uint8 *psxBackground, uint32 bakXres, uint32 bakYres);
void fetchPsxParallaxSize(uint8 *psxParallax, uint16 *paraSizeX, uint16 *paraSizeY);
void drawPsxParallax(uint8 *psxParallax, uint16 paraScrlX, uint16 scrnScrlX, uint16 scrnWidth);
void decompressRLE7(uint8 *src, uint32 compSize, uint8 *dest);
void decompressRLE0(uint8 *src, uint32 compSize, uint8 *dest);
void decompressTony(uint8 *src, uint32 compSize, uint8 *dest);
void fastShrink(uint8 *src, uint32 width, uint32 height, uint32 scale, uint8 *dest);
- int32 inRange(int32 a, int32 b, int32 c);
void fadePalette();
void flushPsxCache();
@@ -163,12 +162,9 @@ private:
uint8 _fadingStep;
int8 _fadingDirection; // 1 for fade up, -1 for fade down
bool _isBlack; // if the logic already faded down the palette, this is set to show the
- // mainloop that no further fading is necessary.
+ // mainloop that no further fading is necessary.
};
} // End of namespace Sword1
#endif //BSSCREEN_H
-
-
-
diff --git a/engines/sword1/sound.cpp b/engines/sword1/sound.cpp
index f7ab9ca1de..b74cd8c393 100644
--- a/engines/sword1/sound.cpp
+++ b/engines/sword1/sound.cpp
@@ -38,7 +38,7 @@
#include "audio/decoders/raw.h"
#include "audio/decoders/vorbis.h"
#include "audio/decoders/wave.h"
-#include "audio/decoders/vag.h"
+#include "audio/decoders/xa.h"
namespace Sword1 {
@@ -124,10 +124,10 @@ void Sound::checkSpeechFileEndianness() {
size = 2000;
else
size /= 2;
- int16 prev_be_value = (int16)SWAP_BYTES_16(*((uint16*)(data)));
+ int16 prev_be_value = (int16)SWAP_BYTES_16(*((uint16 *)(data)));
for (uint32 i = 1; i < size; ++i) {
- le_diff_sum += fabs((double)(data[i] - data[i-1]));
- int16 be_value = (int16)SWAP_BYTES_16(*((uint16*)(data + i)));
+ le_diff_sum += fabs((double)(data[i] - data[i - 1]));
+ int16 be_value = (int16)SWAP_BYTES_16(*((uint16 *)(data + i)));
be_diff_sum += fabs((double)(be_value - prev_be_value));
prev_be_value = be_value;
}
@@ -187,7 +187,7 @@ void Sound::engine() {
} else {
if (!_mixer->isSoundHandleActive(_fxQueue[cnt2].handle)) { // sound finished
_resMan->resClose(_fxList[_fxQueue[cnt2].id].sampleId);
- if (cnt2 != _endOfQueue-1)
+ if (cnt2 != _endOfQueue - 1)
_fxQueue[cnt2] = _fxQueue[_endOfQueue - 1];
_endOfQueue--;
}
@@ -201,8 +201,8 @@ void Sound::fnStopFx(int32 fxNo) {
if (_fxQueue[cnt].id == (uint32)fxNo) {
if (!_fxQueue[cnt].delay) // sound was started
_resMan->resClose(_fxList[_fxQueue[cnt].id].sampleId);
- if (cnt != _endOfQueue-1)
- _fxQueue[cnt] = _fxQueue[_endOfQueue-1];
+ if (cnt != _endOfQueue - 1)
+ _fxQueue[cnt] = _fxQueue[_endOfQueue - 1];
_endOfQueue--;
return;
}
@@ -243,35 +243,36 @@ void Sound::quitScreen() {
}
void Sound::playSample(QueueElement *elem) {
- uint8 *sampleData = (uint8*)_resMan->fetchRes(_fxList[elem->id].sampleId);
+ uint8 *sampleData = (uint8 *)_resMan->fetchRes(_fxList[elem->id].sampleId);
for (uint16 cnt = 0; cnt < MAX_ROOMS_PER_FX; cnt++) {
if (_fxList[elem->id].roomVolList[cnt].roomNo) {
if ((_fxList[elem->id].roomVolList[cnt].roomNo == (int)Logic::_scriptVars[SCREEN]) ||
- (_fxList[elem->id].roomVolList[cnt].roomNo == -1)) {
-
- uint8 volL = (_fxList[elem->id].roomVolList[cnt].leftVol * 10 * _sfxVolL) / 255;
- uint8 volR = (_fxList[elem->id].roomVolList[cnt].rightVol * 10 * _sfxVolR) / 255;
- int8 pan = (volR - volL) / 2;
- uint8 volume = (volR + volL) / 2;
-
- if (SwordEngine::isPsx()) {
- uint32 size = READ_LE_UINT32(sampleData);
- Audio::AudioStream *audStream = Audio::makeLoopingAudioStream(Audio::makeVagStream(new Common::MemoryReadStream(sampleData + 4, size-4)), (_fxList[elem->id].type == FX_LOOP) ? 0 : 1);
- _mixer->playStream(Audio::Mixer::kSFXSoundType, &elem->handle, audStream, elem->id, volume, pan);
- } else {
- uint32 size = READ_LE_UINT32(sampleData + 0x28);
- uint8 flags;
- if (READ_LE_UINT16(sampleData + 0x22) == 16)
- flags = Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN;
- else
- flags = Audio::FLAG_UNSIGNED;
- if (READ_LE_UINT16(sampleData + 0x16) == 2)
- flags |= Audio::FLAG_STEREO;
- Audio::AudioStream *stream = Audio::makeLoopingAudioStream(
- Audio::makeRawStream(sampleData + 0x2C, size, 11025, flags, DisposeAfterUse::NO),
- (_fxList[elem->id].type == FX_LOOP) ? 0 : 1);
- _mixer->playStream(Audio::Mixer::kSFXSoundType, &elem->handle, stream, elem->id, volume, pan);
- }
+ (_fxList[elem->id].roomVolList[cnt].roomNo == -1)) {
+
+ uint8 volL = (_fxList[elem->id].roomVolList[cnt].leftVol * 10 * _sfxVolL) / 255;
+ uint8 volR = (_fxList[elem->id].roomVolList[cnt].rightVol * 10 * _sfxVolR) / 255;
+ int8 pan = (volR - volL) / 2;
+ uint8 volume = (volR + volL) / 2;
+
+ if (SwordEngine::isPsx()) {
+ // We ignore FX_LOOP as XA has its own looping mechanism
+ uint32 size = READ_LE_UINT32(sampleData);
+ Audio::AudioStream *audStream = Audio::makeXAStream(new Common::MemoryReadStream(sampleData + 4, size - 4), 11025);
+ _mixer->playStream(Audio::Mixer::kSFXSoundType, &elem->handle, audStream, elem->id, volume, pan);
+ } else {
+ uint32 size = READ_LE_UINT32(sampleData + 0x28);
+ uint8 flags;
+ if (READ_LE_UINT16(sampleData + 0x22) == 16)
+ flags = Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN;
+ else
+ flags = Audio::FLAG_UNSIGNED;
+ if (READ_LE_UINT16(sampleData + 0x16) == 2)
+ flags |= Audio::FLAG_STEREO;
+ Audio::AudioStream *stream = Audio::makeLoopingAudioStream(
+ Audio::makeRawStream(sampleData + 0x2C, size, 11025, flags, DisposeAfterUse::NO),
+ (_fxList[elem->id].type == FX_LOOP) ? 0 : 1);
+ _mixer->playStream(Audio::Mixer::kSFXSoundType, &elem->handle, stream, elem->id, volume, pan);
+ }
}
} else
break;
@@ -293,7 +294,7 @@ bool Sound::startSpeech(uint16 roomNo, uint16 localNo) {
uint16 i;
if (!file.open("speech.lis")) {
- warning ("Could not open speech.lis");
+ warning("Could not open speech.lis");
return false;
}
@@ -305,12 +306,12 @@ bool Sound::startSpeech(uint16 roomNo, uint16 localNo) {
file.close();
if (locIndex == 0xFFFFFFFF) {
- warning ("Could not find room %d in speech.lis", roomNo);
+ warning("Could not find room %d in speech.lis", roomNo);
return false;
}
if (!file.open("speech.inf")) {
- warning ("Could not open speech.inf");
+ warning("Could not open speech.inf");
return false;
}
@@ -332,7 +333,7 @@ bool Sound::startSpeech(uint16 roomNo, uint16 localNo) {
}
if (locIndex == 0xFFFFFFFF) {
- warning ("Could not find local number %d in room %d in speech.inf", roomNo, localNo);
+ warning("Could not find local number %d in room %d in speech.inf", roomNo, localNo);
return false;
}
@@ -364,7 +365,7 @@ bool Sound::startSpeech(uint16 roomNo, uint16 localNo) {
_cowFile.seek(index * 2048);
Common::SeekableReadStream *tmp = _cowFile.readStream(sampleSize);
assert(tmp);
- stream = Audio::makeVagStream(tmp);
+ stream = Audio::makeXAStream(tmp, 11025);
_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_speechHandle, stream, SOUND_SPEECH_ID, speechVol, speechPan);
// with compressed audio, we can't calculate the wave volume.
// so default to talking.
@@ -420,7 +421,7 @@ bool Sound::startSpeech(uint16 roomNo, uint16 localNo) {
}
int16 *Sound::uncompressSpeech(uint32 index, uint32 cSize, uint32 *size) {
- uint8 *fBuf = (uint8*)malloc(cSize);
+ uint8 *fBuf = (uint8 *)malloc(cSize);
_cowFile.seek(index);
_cowFile.read(fBuf, cSize);
uint32 headerPos = 0;
@@ -455,7 +456,7 @@ int16 *Sound::uncompressSpeech(uint32 index, uint32 cSize, uint32 *size) {
resSize >>= 1;
} else {
resSize = 0;
- srcData = (int16*)fBuf;
+ srcData = (int16 *)fBuf;
srcPos = headerPos >> 1;
while (srcPos < cSize) {
length = (int16)READ_LE_UINT16(srcData + srcPos);
@@ -471,10 +472,10 @@ int16 *Sound::uncompressSpeech(uint32 index, uint32 cSize, uint32 *size) {
}
}
assert(!(headerPos & 1));
- srcData = (int16*)fBuf;
+ srcData = (int16 *)fBuf;
srcPos = headerPos >> 1;
uint32 dstPos = 0;
- int16 *dstData = (int16*)malloc(resSize * 2);
+ int16 *dstData = (int16 *)malloc(resSize * 2);
int32 samplesLeft = resSize;
while (srcPos < cSize && samplesLeft > 0) {
length = (int16)(_bigEndianSpeech ? READ_BE_UINT16(srcData + srcPos) : READ_LE_UINT16(srcData + srcPos));
@@ -485,7 +486,7 @@ int16 *Sound::uncompressSpeech(uint32 index, uint32 cSize, uint32 *size) {
length = samplesLeft;
int16 value;
if (_bigEndianSpeech) {
- value = (int16)SWAP_BYTES_16(*((uint16*)(srcData + srcPos)));
+ value = (int16)SWAP_BYTES_16(*((uint16 *)(srcData + srcPos)));
} else {
value = srcData[srcPos];
}
@@ -497,7 +498,7 @@ int16 *Sound::uncompressSpeech(uint32 index, uint32 cSize, uint32 *size) {
length = samplesLeft;
if (_bigEndianSpeech) {
for (uint16 cnt = 0; cnt < (uint16)length; cnt++)
- dstData[dstPos++] = (int16)SWAP_BYTES_16(*((uint16*)(srcData + (srcPos++))));
+ dstData[dstPos++] = (int16)SWAP_BYTES_16(*((uint16 *)(srcData + (srcPos++))));
} else {
memcpy(dstData + dstPos, srcData + srcPos, length * 2);
dstPos += length;
@@ -510,7 +511,7 @@ int16 *Sound::uncompressSpeech(uint32 index, uint32 cSize, uint32 *size) {
memset(dstData + dstPos, 0, samplesLeft * 2);
}
if (_cowMode == CowDemo) // demo has wave output size embedded in the compressed data
- *(uint32*)dstData = 0;
+ *(uint32 *)dstData = 0;
free(fBuf);
*size = resSize * 2;
calcWaveVolume(dstData, resSize);
@@ -606,7 +607,7 @@ void Sound::initCowSystem() {
_currentCowFile = SwordEngine::_systemVars.currentCD;
if (!_cowFile.isOpen()) {
if (!_cowFile.open("speech.dat"))
- error ("Could not open speech.dat");
+ error("Could not open speech.dat");
_cowMode = CowPSX;
}
}
@@ -625,7 +626,7 @@ void Sound::initCowSystem() {
// Get data from the external table file
Common::File tableFile;
if (!tableFile.open("speech.tab"))
- error ("Could not open speech.tab");
+ error("Could not open speech.tab");
_cowHeaderSize = tableFile.size();
_cowHeader = (uint32 *)malloc(_cowHeaderSize);
if (_cowHeaderSize & 3)
@@ -634,7 +635,7 @@ void Sound::initCowSystem() {
_cowHeader[cnt] = tableFile.readUint32LE();
} else {
_cowHeaderSize = _cowFile.readUint32LE();
- _cowHeader = (uint32*)malloc(_cowHeaderSize);
+ _cowHeader = (uint32 *)malloc(_cowHeaderSize);
if (_cowHeaderSize & 3)
error("Unexpected cow header size %d", _cowHeaderSize);
for (uint32 cnt = 0; cnt < (_cowHeaderSize / 4) - 1; cnt++)
diff --git a/engines/sword1/sound.h b/engines/sword1/sound.h
index a6313f85eb..112ae5b6aa 100644
--- a/engines/sword1/sound.h
+++ b/engines/sword1/sound.h
@@ -36,9 +36,9 @@ class Mixer;
namespace Sword1 {
-#define TOTAL_FX_PER_ROOM 7 // total loop & random fx per room (see fx_list.c)
-#define MAX_ROOMS_PER_FX 7 // max no. of rooms in the fx's room,vol list
-#define MAX_FXQ_LENGTH 32 // max length of sound queue - ie. max number of fx that can be stored up/playing together
+#define TOTAL_FX_PER_ROOM 7 // total loop & random fx per room (see fx_list.c)
+#define MAX_ROOMS_PER_FX 7 // max no. of rooms in the fx's room,vol list
+#define MAX_FXQ_LENGTH 32 // max length of sound queue - ie. max number of fx that can be stored up/playing together
#define FX_SPOT 1
#define FX_LOOP 2
@@ -105,15 +105,15 @@ private:
bool _waveVolume[WAVE_VOL_TAB_LENGTH];
uint16 _waveVolPos;
Common::File _cowFile;
- uint32 *_cowHeader;
- uint32 _cowHeaderSize;
- uint8 _currentCowFile;
- CowMode _cowMode;
+ uint32 *_cowHeader;
+ uint32 _cowHeaderSize;
+ uint8 _currentCowFile;
+ CowMode _cowMode;
Audio::SoundHandle _speechHandle, _fxHandle;
Common::RandomSource _rnd;
QueueElement _fxQueue[MAX_FXQ_LENGTH];
- uint8 _endOfQueue;
+ uint8 _endOfQueue;
Audio::Mixer *_mixer;
ResMan *_resMan;
bool _bigEndianSpeech;
diff --git a/engines/sword1/staticres.cpp b/engines/sword1/staticres.cpp
index 402e349576..60c6877232 100644
--- a/engines/sword1/staticres.cpp
+++ b/engines/sword1/staticres.cpp
@@ -7055,7 +7055,7 @@ const uint8 g_genWhiteCoat[] = {
INIT_SEQ_END
};
-const uint8 *Logic::_startData[] = {
+const uint8 *const Logic::_startData[] = {
g_startPos0,
g_startPos1,
g_startPos2,
@@ -7139,7 +7139,7 @@ const uint8 *Logic::_startData[] = {
g_startPos80
};
-const uint8 *Logic::_helperData[] = {
+const uint8 *const Logic::_helperData[] = {
g_genIreland,
g_genSyria,
g_genSpain,
diff --git a/engines/sword1/sword1.cpp b/engines/sword1/sword1.cpp
index 23dff4dec2..865e025786 100644
--- a/engines/sword1/sword1.cpp
+++ b/engines/sword1/sword1.cpp
@@ -48,9 +48,9 @@ SystemVars SwordEngine::_systemVars;
SwordEngine::SwordEngine(OSystem *syst)
: Engine(syst) {
- if (!scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1demo") ||
- !scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1psxdemo") ||
- !scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1macdemo"))
+ if (!scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1demo") ||
+ !scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1psxdemo") ||
+ !scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1macdemo"))
_features = GF_DEMO;
else
_features = 0;
@@ -85,11 +85,11 @@ Common::Error SwordEngine::init() {
initGraphics(640, 480, true);
- if ( 0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1mac") ||
- 0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1macdemo") )
+ if (0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1mac") ||
+ 0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1macdemo"))
_systemVars.platform = Common::kPlatformMacintosh;
- else if (0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1psx") ||
- 0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1psxdemo") )
+ else if (0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1psx") ||
+ 0 == scumm_stricmp(ConfMan.get("gameid").c_str(), "sword1psxdemo"))
_systemVars.platform = Common::kPlatformPSX;
else
_systemVars.platform = Common::kPlatformWindows;
@@ -240,7 +240,7 @@ void SwordEngine::flagsToBool(bool *dest, uint8 flags) {
}
}
-static const char *errorMsgs[] = {
+static const char *const errorMsgs[] = {
"The file \"%s\" is missing and the game doesn't work without it.\n"
"Please copy it from CD %d and try starting the game again.\n"
"The Readme file also contains further information.",
@@ -279,18 +279,18 @@ const CdFile SwordEngine::_pcCdFileList[] = {
{ "text.clu", FLAG_CD1 | FLAG_DEMO },
{ "cows.mad", FLAG_DEMO },
{ "speech1.clu", FLAG_SPEECH1 },
- { "speech2.clu", FLAG_SPEECH2 }
+ { "speech2.clu", FLAG_SPEECH2 }
#ifdef USE_FLAC
- ,{ "speech1.clf", FLAG_SPEECH1 },
- { "speech2.clf", FLAG_SPEECH2 }
+ , { "speech1.clf", FLAG_SPEECH1 },
+ { "speech2.clf", FLAG_SPEECH2 }
#endif
#ifdef USE_VORBIS
- ,{ "speech1.clv", FLAG_SPEECH1 },
- { "speech2.clv", FLAG_SPEECH2 }
+ , { "speech1.clv", FLAG_SPEECH1 },
+ { "speech2.clv", FLAG_SPEECH2 }
#endif
#ifdef USE_MAD
- ,{ "speech1.cl3", FLAG_SPEECH1 },
- { "speech2.cl3", FLAG_SPEECH2 }
+ , { "speech1.cl3", FLAG_SPEECH1 },
+ { "speech2.cl3", FLAG_SPEECH2 }
#endif
};
@@ -311,18 +311,18 @@ const CdFile SwordEngine::_macCdFileList[] = {
{ "swordres.rif", FLAG_CD1 | FLAG_DEMO | FLAG_IMMED },
{ "text.clm", FLAG_CD1 | FLAG_DEMO },
{ "speech1.clu", FLAG_SPEECH1 },
- { "speech2.clu", FLAG_SPEECH2 }
+ { "speech2.clu", FLAG_SPEECH2 }
#ifdef USE_FLAC
,{ "speech1.clf", FLAG_SPEECH1 },
- { "speech2.clf", FLAG_SPEECH2 }
+ { "speech2.clf", FLAG_SPEECH2 }
#endif
#ifdef USE_VORBIS
,{ "speech1.clv", FLAG_SPEECH1 },
- { "speech2.clv", FLAG_SPEECH2 }
+ { "speech2.clv", FLAG_SPEECH2 }
#endif
#ifdef USE_MAD
,{ "speech1.cl3", FLAG_SPEECH1 },
- { "speech2.cl3", FLAG_SPEECH2 }
+ { "speech2.cl3", FLAG_SPEECH2 }
#endif
};
@@ -364,7 +364,7 @@ void SwordEngine::showFileErrorMsg(uint8 type, bool *fileExists) {
int msgId = (type == TYPE_IMMED) ? 0 : 2;
if (missCnt == 1) {
sprintf(msg, errorMsgs[msgId],
- _macCdFileList[missNum].name, (_macCdFileList[missNum].flags & FLAG_CD2) ? 2 : 1);
+ _macCdFileList[missNum].name, (_macCdFileList[missNum].flags & FLAG_CD2) ? 2 : 1);
warning("%s", msg);
} else {
char *pos = msg + sprintf(msg, errorMsgs[msgId + 1], missCnt);
@@ -407,7 +407,7 @@ void SwordEngine::showFileErrorMsg(uint8 type, bool *fileExists) {
int msgId = (type == TYPE_IMMED) ? 0 : 2;
if (missCnt == 1) {
sprintf(msg, errorMsgs[msgId],
- _pcCdFileList[missNum].name, (_pcCdFileList[missNum].flags & FLAG_CD2) ? 2 : 1);
+ _pcCdFileList[missNum].name, (_pcCdFileList[missNum].flags & FLAG_CD2) ? 2 : 1);
warning("%s", msg);
} else {
char *pos = msg + sprintf(msg, errorMsgs[msgId + 1], missCnt);
@@ -454,9 +454,9 @@ void SwordEngine::checkCdFiles() { // check if we're running from cd, hdd or wha
if (Common::File::exists(_psxCdFileList[fcnt].name)) {
fileExists[fcnt] = true;
flagsToBool(foundTypes, _psxCdFileList[fcnt].flags);
- if (!(_psxCdFileList[fcnt].flags & FLAG_DEMO))
+ if (!(_psxCdFileList[fcnt].flags & FLAG_DEMO))
isFullVersion = true;
- cd2FilesFound = true;
+ cd2FilesFound = true;
} else {
flagsToBool(missingTypes, _psxCdFileList[fcnt].flags);
fileExists[fcnt] = false;
@@ -486,9 +486,9 @@ void SwordEngine::checkCdFiles() { // check if we're running from cd, hdd or wha
if (foundTypes[TYPE_SPEECH2]) // same for speech2
missingTypes[TYPE_SPEECH2] = false;
- if (isFullVersion) // if this is the full version...
+ if (isFullVersion) // if this is the full version...
missingTypes[TYPE_DEMO] = false; // then we don't need demo files...
- else // and vice versa
+ else // and vice versa
missingTypes[TYPE_SPEECH1] = missingTypes[TYPE_SPEECH2] = missingTypes[TYPE_CD1] = missingTypes[TYPE_CD2] = false;
bool somethingMissing = false;
@@ -526,13 +526,13 @@ void SwordEngine::checkCdFiles() { // check if we're running from cd, hdd or wha
showFileErrorMsg(TYPE_IMMED, fileExists);
} else if ((!missingTypes[TYPE_CD1]) && !cd2FilesFound) {
/* we have all the data from cd one, but not a single one from CD2.
- I'm not sure how we should handle this, for now I'll just assume that the
- user has set up the extrapath correctly and copied the necessary files to HDD.
- A quite optimistic assumption, I'd say. Maybe we should change this for the release
- to warn the user? */
+ I'm not sure how we should handle this, for now I'll just assume that the
+ user has set up the extrapath correctly and copied the necessary files to HDD.
+ A quite optimistic assumption, I'd say. Maybe we should change this for the release
+ to warn the user? */
warning("CD2 data files not found. I hope you know what you're doing and that\n"
- "you have set up the extrapath and additional data correctly.\n"
- "If you didn't, you should better read the ScummVM readme file");
+ "you have set up the extrapath and additional data correctly.\n"
+ "If you didn't, you should better read the ScummVM readme file");
_systemVars.runningFromCd = true;
_systemVars.playSpeech = true;
} else if (missingTypes[TYPE_CD1] || missingTypes[TYPE_CD2]) {
@@ -542,13 +542,13 @@ void SwordEngine::checkCdFiles() { // check if we're running from cd, hdd or wha
// not so important, but there won't be any voices
if (missingTypes[TYPE_SPEECH1] && missingTypes[TYPE_SPEECH2])
warning("Unable to find the speech files. The game will work, but you won't hear any voice output.\n"
- "Please copy the SPEECH.CLU files from both CDs and rename them to SPEECH1.CLU and SPEECH2.CLU,\n"
- "corresponding to the CD number.\n"
- "Please read the ScummVM Readme file for more information");
+ "Please copy the SPEECH.CLU files from both CDs and rename them to SPEECH1.CLU and SPEECH2.CLU,\n"
+ "corresponding to the CD number.\n"
+ "Please read the ScummVM Readme file for more information");
else
warning("Unable to find the speech file from CD %d.\n"
- "You won't hear any voice output in that part of the game.\n"
- "Please read the ScummVM Readme file for more information", missingTypes[TYPE_SPEECH1] ? 1 : 2);
+ "You won't hear any voice output in that part of the game.\n"
+ "Please read the ScummVM Readme file for more information", missingTypes[TYPE_SPEECH1] ? 1 : 2);
} else if (missingTypes[TYPE_DEMO]) {
// for the demo version, we simply expect to have all files immediately
showFileErrorMsg(TYPE_IMMED, fileExists);
@@ -618,9 +618,9 @@ void SwordEngine::checkCd() {
_music->startMusic(0, 0); //
_sound->closeCowSystem(); // close music and sound files before changing CDs
_systemVars.currentCD = needCd; // askForCd will ask the player to insert _systemVars.currentCd,
- _control->askForCd(); // so it has to be updated before calling it.
+ _control->askForCd(); // so it has to be updated before calling it.
}
- } else { // we're running from HDD, we don't have to care about music files and Sound will take care of
+ } else { // we're running from HDD, we don't have to care about music files and Sound will take care of
if (needCd) // switching sound.clu files on Sound::newScreen by itself, so there's nothing to be done.
_systemVars.currentCD = needCd;
else if (_systemVars.currentCD == 0)
@@ -673,7 +673,7 @@ uint8 SwordEngine::mainLoop() {
// The control panel is triggered by F5 or ESC.
else if (((_keyPressed.keycode == Common::KEYCODE_F5 || _keyPressed.keycode == Common::KEYCODE_ESCAPE)
- && (Logic::_scriptVars[MOUSE_STATUS] & 1)) || (_systemVars.controlPanelMode)) {
+ && (Logic::_scriptVars[MOUSE_STATUS] & 1)) || (_systemVars.controlPanelMode)) {
retCode = _control->runPanel();
if (retCode == CONTROL_NOTHING_DONE)
_screen->fullRefresh();
diff --git a/engines/sword1/sword1.h b/engines/sword1/sword1.h
index 2d6db21d19..e973c12754 100644
--- a/engines/sword1/sword1.h
+++ b/engines/sword1/sword1.h
@@ -63,16 +63,16 @@ class Music;
class Control;
struct SystemVars {
- bool runningFromCd;
- uint32 currentCD; // starts at zero, then either 1 or 2 depending on section being played
- uint32 justRestoredGame; // see main() in sword.c & New_screen() in gtm_core.c
-
- uint8 controlPanelMode; // 1 death screen version of the control panel, 2 = successful end of game, 3 = force restart
- bool forceRestart;
- bool wantFade; // when true => fade during scene change, else cut.
- uint8 playSpeech;
- uint8 showText;
- uint8 language;
+ bool runningFromCd;
+ uint32 currentCD; // starts at zero, then either 1 or 2 depending on section being played
+ uint32 justRestoredGame; // see main() in sword.c & New_screen() in gtm_core.c
+
+ uint8 controlPanelMode; // 1 death screen version of the control panel, 2 = successful end of game, 3 = force restart
+ bool forceRestart;
+ bool wantFade; // when true => fade during scene change, else cut.
+ uint8 playSpeech;
+ uint8 showText;
+ uint8 language;
bool isDemo;
Common::Platform platform;
};
@@ -131,18 +131,18 @@ private:
uint16 _mouseState;
Common::KeyState _keyPressed;
- ResMan *_resMan;
- ObjectMan *_objectMan;
- Screen *_screen;
- Mouse *_mouse;
- Logic *_logic;
- Sound *_sound;
- Menu *_menu;
- Music *_music;
- Control *_control;
+ ResMan *_resMan;
+ ObjectMan *_objectMan;
+ Screen *_screen;
+ Mouse *_mouse;
+ Logic *_logic;
+ Sound *_sound;
+ Menu *_menu;
+ Music *_music;
+ Control *_control;
static const uint8 _cdList[TOTAL_SECTIONS];
- static const CdFile _pcCdFileList[];
- static const CdFile _macCdFileList[];
+ static const CdFile _pcCdFileList[];
+ static const CdFile _macCdFileList[];
static const CdFile _psxCdFileList[];
};
diff --git a/engines/sword1/sworddefs.h b/engines/sword1/sworddefs.h
index 15736dcae0..db4146f37e 100644
--- a/engines/sword1/sworddefs.h
+++ b/engines/sword1/sworddefs.h
@@ -29,13 +29,13 @@ namespace Sword1 {
#define LOOPED 1
-#define FRAME_RATE 12 // number of frames per second (max rate)
-#define SCREEN_WIDTH 640
-#define SCREEN_DEPTH 400
-#define SCREEN_LEFT_EDGE 128
-#define SCREEN_RIGHT_EDGE (128+SCREEN_WIDTH-1)
-#define SCREEN_TOP_EDGE 128
-#define SCREEN_BOTTOM_EDGE (128+SCREEN_DEPTH-1)
+#define FRAME_RATE 12 // number of frames per second (max rate)
+#define SCREEN_WIDTH 640
+#define SCREEN_DEPTH 400
+#define SCREEN_LEFT_EDGE 128
+#define SCREEN_RIGHT_EDGE (128+SCREEN_WIDTH-1)
+#define SCREEN_TOP_EDGE 128
+#define SCREEN_BOTTOM_EDGE (128+SCREEN_DEPTH-1)
#define TYPE_FLOOR 1
#define TYPE_MOUSE 2
#define TYPE_SPRITE 3
@@ -81,22 +81,22 @@ namespace Sword1 {
#define TOTAL_subjects (375-256+1)
#define BASE_SUBJECT 256
-#define TOTAL_SECTIONS 150 //number of sections, rooms + mega sections
-#define TOTAL_ROOMS 100 //total number of rooms
-#define ITM_PER_SEC 0x10000 //65536 items per section -> was originally called "SIZE"
-#define ITM_ID 0xFFFF //& with this -> originally "NuSIZE"
+#define TOTAL_SECTIONS 150 //number of sections, rooms + mega sections
+#define TOTAL_ROOMS 100 //total number of rooms
+#define ITM_PER_SEC 0x10000 //65536 items per section -> was originally called "SIZE"
+#define ITM_ID 0xFFFF //& with this -> originally "NuSIZE"
-#define MAX_text_obs 2 //text compacts
-#define TEXT_sect 149 //text compacts exist in section 149, probably after all the megas
+#define MAX_text_obs 2 //text compacts
+#define TEXT_sect 149 //text compacts exist in section 149, probably after all the megas
-#include "common/pack-start.h" // START STRUCT PACKING
+#include "common/pack-start.h" // START STRUCT PACKING
struct Header {
char type[6];
uint16 version;
- uint32 comp_length;
- char compression[4];
- uint32 decomp_length;
+ uint32 comp_length;
+ char compression[4];
+ uint32 decomp_length;
} PACKED_STRUCT;
struct FrameHeader {
@@ -132,7 +132,7 @@ struct WalkGridHeader {
int32 numNodes;
} PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
+#include "common/pack-end.h" // END STRUCT PACKING
enum fileTypes {
TYPE_CD1 = 0,
@@ -144,12 +144,12 @@ enum fileTypes {
};
enum fileFlags {
- FLAG_CD1 = (1 << TYPE_CD1), // this file is on cd1
- FLAG_CD2 = (1 << TYPE_CD2), // this file is on cd2
- FLAG_DEMO = (1 << TYPE_DEMO), // file for the demo version
- FLAG_IMMED = (1 << TYPE_IMMED), // this file is needed immediately, game won't start without it
- FLAG_SPEECH1 = (1 << TYPE_SPEECH1),
- FLAG_SPEECH2 = (1 << TYPE_SPEECH2)
+ FLAG_CD1 = (1 << TYPE_CD1), // this file is on cd1
+ FLAG_CD2 = (1 << TYPE_CD2), // this file is on cd2
+ FLAG_DEMO = (1 << TYPE_DEMO), // file for the demo version
+ FLAG_IMMED = (1 << TYPE_IMMED), // this file is needed immediately, game won't start without it
+ FLAG_SPEECH1 = (1 << TYPE_SPEECH1),
+ FLAG_SPEECH2 = (1 << TYPE_SPEECH2)
};
struct CdFile {
@@ -167,29 +167,29 @@ enum Language {
BS1_PORT
};
-#define SAM 2162689
-#define PLAYER 8388608
-#define GEORGE 8388608
-#define NICO 8454144
-#define BENOIR 8585216
-#define ROSSO 8716288
-#define DUANE 8781824
-#define MOUE 9502720
-#define ALBERT 9568256
+#define SAM 2162689
+#define PLAYER 8388608
+#define GEORGE 8388608
+#define NICO 8454144
+#define BENOIR 8585216
+#define ROSSO 8716288
+#define DUANE 8781824
+#define MOUE 9502720
+#define ALBERT 9568256
-#define STAND 0
-#define UP 0
-#define UP_RIGHT 1
-#define U_R 1
-#define RIGHT 2
-#define DOWN_RIGHT 3
-#define D_R 3
-#define DOWN 4
-#define DOWN_LEFT 5
-#define D_L 5
-#define LEFT 6
-#define UP_LEFT 7
-#define U_L 7
+#define STAND 0
+#define UP 0
+#define UP_RIGHT 1
+#define U_R 1
+#define RIGHT 2
+#define DOWN_RIGHT 3
+#define D_R 3
+#define DOWN 4
+#define DOWN_LEFT 5
+#define D_L 5
+#define LEFT 6
+#define UP_LEFT 7
+#define U_L 7
#define BEER_TOWEL 3
#define HOTEL_KEY 4
@@ -373,10 +373,10 @@ enum Language {
#define IT_MINUS 12
#define IT_AND 13
#define IT_OR 14
-#define IT_GTE 15 // >=
-#define IT_LTE 16 // <=
-#define IT_DEVIDE 17 // <=
-#define IT_GT 18 // >
+#define IT_GTE 15 // >=
+#define IT_LTE 16 // <=
+#define IT_DEVIDE 17 // <=
+#define IT_GT 18 // >
#define IT_SCRIPTEND 20
#define IT_POPVAR 21
diff --git a/engines/sword1/text.cpp b/engines/sword1/text.cpp
index 2d4b07020f..3bd2fdb2e6 100644
--- a/engines/sword1/text.cpp
+++ b/engines/sword1/text.cpp
@@ -35,7 +35,7 @@ namespace Sword1 {
#define OVERLAP 3
#define SPACE ' '
-#define MAX_LINES 30
+#define MAX_LINES 30
Text::Text(ObjectMan *pObjMan, ResMan *pResMan, bool czechVersion) {
@@ -43,7 +43,7 @@ Text::Text(ObjectMan *pObjMan, ResMan *pResMan, bool czechVersion) {
_resMan = pResMan;
_textCount = 0;
_fontId = (czechVersion) ? CZECH_GAME_FONT : GAME_FONT;
- _font = (uint8*)_resMan->openFetchRes(_fontId);
+ _font = (uint8 *)_resMan->openFetchRes(_fontId);
_joinWidth = charWidth(SPACE) - 2 * OVERLAP;
_charHeight = _resMan->getUint16(_resMan->fetchFrame(_font, 0)->height); // all chars have the same height
@@ -86,16 +86,16 @@ void Text::makeTextSprite(uint8 slot, const uint8 *text, uint16 maxWidth, uint8
uint16 sprHeight = _charHeight * numLines;
uint32 sprSize = sprWidth * sprHeight;
assert(!_textBlocks[slot]); // if this triggers, the speechDriver failed to call Text::releaseText.
- _textBlocks[slot] = (FrameHeader*)malloc(sprSize + sizeof(FrameHeader));
+ _textBlocks[slot] = (FrameHeader *)malloc(sprSize + sizeof(FrameHeader));
memcpy(_textBlocks[slot]->runTimeComp, "Nu ", 4);
- _textBlocks[slot]->compSize = 0;
- _textBlocks[slot]->width = _resMan->toUint16(sprWidth);
- _textBlocks[slot]->height = _resMan->toUint16(sprHeight);
- _textBlocks[slot]->offsetX = 0;
- _textBlocks[slot]->offsetY = 0;
+ _textBlocks[slot]->compSize = 0;
+ _textBlocks[slot]->width = _resMan->toUint16(sprWidth);
+ _textBlocks[slot]->height = _resMan->toUint16(sprHeight);
+ _textBlocks[slot]->offsetX = 0;
+ _textBlocks[slot]->offsetY = 0;
- uint8 *linePtr = ((uint8*)_textBlocks[slot]) + sizeof(FrameHeader);
+ uint8 *linePtr = ((uint8 *)_textBlocks[slot]) + sizeof(FrameHeader);
memset(linePtr, NO_COL, sprSize);
for (lineCnt = 0; lineCnt < numLines; lineCnt++) {
uint8 *sprPtr = linePtr + (sprWidth - lines[lineCnt].width) / 2; // center the text
@@ -132,7 +132,7 @@ uint16 Text::analyzeSentence(const uint8 *text, uint16 maxWidth, LineInfo *line)
text++;
wordWidth += OVERLAP; // no overlap on final letter of word!
- if (firstWord) { // first word on first line, so no separating SPACE needed
+ if (firstWord) { // first word on first line, so no separating SPACE needed
line[0].width = wordWidth;
line[0].length = wordLength;
firstWord = false;
@@ -144,7 +144,7 @@ uint16 Text::analyzeSentence(const uint8 *text, uint16 maxWidth, LineInfo *line)
if (line[lineNo].width + spaceNeeded <= maxWidth) {
line[lineNo].width += spaceNeeded;
line[lineNo].length += 1 + wordLength; // NB. space+word characters
- } else { // put word (without separating SPACE) at start of next line
+ } else { // put word (without separating SPACE) at start of next line
lineNo++;
assert(lineNo < MAX_LINES);
line[lineNo].width = wordWidth;
@@ -152,21 +152,21 @@ uint16 Text::analyzeSentence(const uint8 *text, uint16 maxWidth, LineInfo *line)
}
}
}
- return lineNo+1; // return no of lines
+ return lineNo + 1; // return no of lines
}
uint16 Text::copyChar(uint8 ch, uint8 *sprPtr, uint16 sprWidth, uint8 pen) {
FrameHeader *chFrame = _resMan->fetchFrame(_font, ch - SPACE);
- uint8 *chData = ((uint8*)chFrame) + sizeof(FrameHeader);
+ uint8 *chData = ((uint8 *)chFrame) + sizeof(FrameHeader);
uint8 *dest = sprPtr;
uint8 *decBuf = NULL;
uint8 *decChr;
uint16 frameHeight = 0;
if (SwordEngine::isPsx()) {
- frameHeight = _resMan->getUint16(chFrame->height)/2;
+ frameHeight = _resMan->getUint16(chFrame->height) / 2;
if (_fontId == CZECH_GAME_FONT) { //Czech game fonts are compressed
- decBuf = (uint8*) malloc((_resMan->getUint16(chFrame->width))*(_resMan->getUint16(chFrame->height)/2));
+ decBuf = (uint8 *)malloc((_resMan->getUint16(chFrame->width)) * (_resMan->getUint16(chFrame->height) / 2));
Screen::decompressHIF(chData, decBuf);
decChr = decBuf;
} else //Normal game fonts are not compressed
diff --git a/engines/sword1/text.h b/engines/sword1/text.h
index 2224fbcac5..4dcb9e26a7 100644
--- a/engines/sword1/text.h
+++ b/engines/sword1/text.h
@@ -30,17 +30,17 @@ namespace Sword1 {
#define MAX_TEXT_OBS 3
-#define BORDER_COL 200
+#define BORDER_COL 200
#define BORDER_COL_PSX 199
-#define LETTER_COL 193
-#define NO_COL 0 // sprite background - 0 for transparency
+#define LETTER_COL 193
+#define NO_COL 0 // sprite background - 0 for transparency
class ObjectMan;
class ResMan;
struct LineInfo {
- uint16 width; // width of line in pixels
- uint16 length; // length of line in characters
+ uint16 width; // width of line in pixels
+ uint16 length; // length of line in characters
};
class Text {
diff --git a/engines/sword2/controls.cpp b/engines/sword2/controls.cpp
index 6ce447a4cc..3611294eb8 100644
--- a/engines/sword2/controls.cpp
+++ b/engines/sword2/controls.cpp
@@ -477,6 +477,8 @@ void Widget::createSurfaceImage(int state, uint32 res, int x, int y, uint32 pc)
// Points to just after frame header, ie. start of sprite data
_sprites[state].data = frame + FrameHeader::size();
+ _sprites[state].colorTable = colTablePtr;
+ _sprites[state].isText = false;
_vm->_screen->createSurface(&_sprites[state], &_surfaces[state]._surface);
_surfaces[state]._original = true;
diff --git a/engines/sword2/music.cpp b/engines/sword2/music.cpp
index 63116e954a..1bb08fd36f 100644
--- a/engines/sword2/music.cpp
+++ b/engines/sword2/music.cpp
@@ -39,7 +39,7 @@
#include "audio/decoders/vorbis.h"
#include "audio/decoders/flac.h"
#include "audio/decoders/wave.h"
-#include "audio/decoders/vag.h"
+#include "audio/decoders/xa.h"
#include "audio/rate.h"
#include "sword2/sword2.h"
@@ -267,7 +267,7 @@ Audio::AudioStream *makePSXCLUStream(Common::File *file, int size) {
byte *buffer = (byte *)malloc(size);
file->read(buffer, size);
- return Audio::makeVagStream(new Common::MemoryReadStream(buffer, size, DisposeAfterUse::YES));
+ return Audio::makeXAStream(new Common::MemoryReadStream(buffer, size, DisposeAfterUse::YES), 11025);
}
// ----------------------------------------------------------------------------
diff --git a/engines/sword2/render.cpp b/engines/sword2/render.cpp
index 1e068d6061..8bf9d922d5 100644
--- a/engines/sword2/render.cpp
+++ b/engines/sword2/render.cpp
@@ -699,8 +699,6 @@ int32 Screen::initializePsxBackgroundLayer(byte *parallax) {
*/
int32 Screen::initializePsxParallaxLayer(byte *parallax) {
- uint16 plxXres, plxYres;
- uint16 xTiles, yTiles;
uint16 i, j, k;
byte *data;
byte *dst;
@@ -714,10 +712,10 @@ int32 Screen::initializePsxParallaxLayer(byte *parallax) {
return RD_OK;
}
- plxXres = READ_LE_UINT16(parallax);
- plxYres = READ_LE_UINT16(parallax + 2);
- xTiles = READ_LE_UINT16(parallax + 4);
- yTiles = READ_LE_UINT16(parallax + 6);
+ // uint16 plxXres = READ_LE_UINT16(parallax);
+ // uint16 plxYres = READ_LE_UINT16(parallax + 2);
+ uint16 xTiles = READ_LE_UINT16(parallax + 4);
+ uint16 yTiles = READ_LE_UINT16(parallax + 6);
// Beginning of parallax table composed by uint32,
// if word is 0, corresponding tile contains no data and must be skipped,
diff --git a/engines/sword2/sound.cpp b/engines/sword2/sound.cpp
index 19e244e61c..aea33e99e3 100644
--- a/engines/sword2/sound.cpp
+++ b/engines/sword2/sound.cpp
@@ -47,7 +47,7 @@
#include "sword2/sound.h"
#include "audio/decoders/wave.h"
-#include "audio/decoders/vag.h"
+#include "audio/decoders/xa.h"
#define Debug_Printf _vm->_debugger->DebugPrintf
@@ -234,7 +234,7 @@ void Sound::playMovieSound(int32 res, int type) {
Audio::RewindableAudioStream *input = 0;
if (Sword2Engine::isPsx()) {
- input = Audio::makeVagStream(stream);
+ input = Audio::makeXAStream(stream, 11025);
} else {
input = Audio::makeWAVStream(stream, DisposeAfterUse::YES);
}
@@ -361,7 +361,7 @@ int32 Sound::playFx(Audio::SoundHandle *handle, byte *data, uint32 len, uint8 vo
Audio::RewindableAudioStream *input = 0;
if (Sword2Engine::isPsx())
- input = Audio::makeVagStream(stream);
+ input = Audio::makeXAStream(stream, 11025);
else
input = Audio::makeWAVStream(stream, DisposeAfterUse::YES);
diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp
index 87c7c12ad6..b4d4f52a12 100644
--- a/engines/sword2/sword2.cpp
+++ b/engines/sword2/sword2.cpp
@@ -145,7 +145,7 @@ GameList Sword2MetaEngine::detectGames(const Common::FSList &fslist) const {
if (0 == scumm_stricmp(g->detectname, fileName)) {
// Match found, add to list of candidates, then abort inner loop.
- detectedGames.push_back(GameDescriptor(g->gameid, g->description, Common::UNK_LANG, Common::kPlatformUnknown, Common::GUIO_NOMIDI));
+ detectedGames.push_back(GameDescriptor(g->gameid, g->description, Common::UNK_LANG, Common::kPlatformUnknown, GUIO1(GUIO_NOMIDI)));
break;
}
}
diff --git a/engines/sword25/detection.cpp b/engines/sword25/detection.cpp
index b2f5795663..06e4ba2a7d 100644
--- a/engines/sword25/detection.cpp
+++ b/engines/sword25/detection.cpp
@@ -44,7 +44,7 @@ static const char *directoryGlobs[] = {
class Sword25MetaEngine : public AdvancedMetaEngine {
public:
Sword25MetaEngine() : AdvancedMetaEngine(Sword25::gameDescriptions, sizeof(ADGameDescription), sword25Game) {
- _guioptions = Common::GUIO_NOMIDI;
+ _guioptions = GUIO1(GUIO_NOMIDI);
_maxScanDepth = 2;
_directoryGlobs = directoryGlobs;
}
@@ -99,4 +99,3 @@ SaveStateList Sword25MetaEngine::listSaves(const char *target) const {
#else
REGISTER_PLUGIN_STATIC(SWORD25, PLUGIN_TYPE_ENGINE, Sword25MetaEngine);
#endif
-
diff --git a/engines/sword25/detection_tables.h b/engines/sword25/detection_tables.h
index fe9e6e7934..5e0473dee5 100644
--- a/engines/sword25/detection_tables.h
+++ b/engines/sword25/detection_tables.h
@@ -22,11 +22,6 @@
namespace Sword25 {
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-using Common::GUIO_NOSFX;
-using Common::GUIO_NOMUSIC;
-
static const ADGameDescription gameDescriptions[] = {
{
"sword25",
@@ -35,7 +30,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -44,7 +39,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -53,7 +48,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -62,7 +57,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::HU_HUN,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -71,7 +66,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -80,7 +75,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::PL_POL,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -89,7 +84,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::PT_BRA,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -98,7 +93,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::RU_RUS,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"sword25",
@@ -107,7 +102,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformUnknown,
ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
// Extracted version
@@ -121,7 +116,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformUnknown,
GF_EXTRACTED | ADGF_UNSTABLE,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER
};
diff --git a/engines/sword25/fmv/theora_decoder.cpp b/engines/sword25/fmv/theora_decoder.cpp
index 098bd2c6b9..a7ebb5df8c 100644
--- a/engines/sword25/fmv/theora_decoder.cpp
+++ b/engines/sword25/fmv/theora_decoder.cpp
@@ -424,6 +424,12 @@ bool TheoraDecoder::queueAudio() {
if (!_audStream)
return false;
+ // An audio buffer should have been allocated (either in the constructor or after queuing the current buffer)
+ if (!_audiobuf) {
+ warning("[TheoraDecoder::queueAudio] Invalid audio buffer");
+ return false;
+ }
+
bool queuedAudio = false;
for (;;) {
@@ -454,6 +460,11 @@ bool TheoraDecoder::queueAudio() {
// The audio mixer is now responsible for the old audio buffer.
// We need to create a new one.
_audiobuf = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t));
+ if (!_audiobuf) {
+ warning("[TheoraDecoder::queueAudio] Cannot allocate memory for audio buffer");
+ return false;
+ }
+
_audiobufFill = 0;
queuedAudio = true;
}
diff --git a/engines/sword25/gfx/animationtemplateregistry.cpp b/engines/sword25/gfx/animationtemplateregistry.cpp
index 43c099c89d..8184b49eba 100644
--- a/engines/sword25/gfx/animationtemplateregistry.cpp
+++ b/engines/sword25/gfx/animationtemplateregistry.cpp
@@ -34,7 +34,9 @@
#include "sword25/gfx/animationtemplateregistry.h"
#include "sword25/gfx/animationtemplate.h"
+namespace Common {
DECLARE_SINGLETON(Sword25::AnimationTemplateRegistry);
+}
namespace Sword25 {
diff --git a/engines/sword25/gfx/graphicengine.cpp b/engines/sword25/gfx/graphicengine.cpp
index 91133b9fd2..14ba032107 100644
--- a/engines/sword25/gfx/graphicengine.cpp
+++ b/engines/sword25/gfx/graphicengine.cpp
@@ -156,7 +156,7 @@ RenderObjectPtr<Panel> GraphicEngine::getMainPanel() {
}
void GraphicEngine::setVsync(bool vsync) {
- warning("STUB: SetVsync(%d)", vsync);
+ // ScummVM has no concept of VSync
}
bool GraphicEngine::getVsync() const {
diff --git a/engines/sword25/gfx/image/art.cpp b/engines/sword25/gfx/image/art.cpp
index 2df8bd4f3e..2ba102e779 100644
--- a/engines/sword25/gfx/image/art.cpp
+++ b/engines/sword25/gfx/image/art.cpp
@@ -151,6 +151,8 @@ ArtSVP *art_svp_from_vpath(ArtVpath *vpath) {
n_segs_max = 16;
svp = (ArtSVP *)malloc(sizeof(ArtSVP) +
(n_segs_max - 1) * sizeof(ArtSVPSeg));
+ if (!svp)
+ error("[art_svp_from_vpath] Cannot allocate memory");
dir = 0;
n_points = 0;
@@ -167,9 +169,14 @@ ArtSVP *art_svp_from_vpath(ArtVpath *vpath) {
if (points != NULL && n_points >= 2) {
if (n_segs == n_segs_max) {
n_segs_max <<= 1;
- svp = (ArtSVP *)realloc(svp, sizeof(ArtSVP) +
- (n_segs_max - 1) *
- sizeof(ArtSVPSeg));
+ ArtSVP *tmp = (ArtSVP *)realloc(svp, sizeof(ArtSVP) +
+ (n_segs_max - 1) *
+ sizeof(ArtSVPSeg));
+
+ if (!tmp)
+ error("Cannot reallocate memory in art_svp_from_vpath()");
+
+ svp = tmp;
}
svp->segs[n_segs].n_points = n_points;
svp->segs[n_segs].dir = (dir > 0);
@@ -204,9 +211,14 @@ ArtSVP *art_svp_from_vpath(ArtVpath *vpath) {
y = points[n_points - 1].y;
if (n_segs == n_segs_max) {
n_segs_max <<= 1;
- svp = (ArtSVP *)realloc(svp, sizeof(ArtSVP) +
- (n_segs_max - 1) *
- sizeof(ArtSVPSeg));
+ ArtSVP *tmp = (ArtSVP *)realloc(svp, sizeof(ArtSVP) +
+ (n_segs_max - 1) *
+ sizeof(ArtSVPSeg));
+
+ if (!tmp)
+ error("Cannot reallocate memory in art_svp_from_vpath()");
+
+ svp = tmp;
}
svp->segs[n_segs].n_points = n_points;
svp->segs[n_segs].dir = (dir > 0);
@@ -246,9 +258,14 @@ ArtSVP *art_svp_from_vpath(ArtVpath *vpath) {
if (n_points >= 2) {
if (n_segs == n_segs_max) {
n_segs_max <<= 1;
- svp = (ArtSVP *)realloc(svp, sizeof(ArtSVP) +
- (n_segs_max - 1) *
- sizeof(ArtSVPSeg));
+ ArtSVP *tmp = (ArtSVP *)realloc(svp, sizeof(ArtSVP) +
+ (n_segs_max - 1) *
+ sizeof(ArtSVPSeg));
+
+ if (!tmp)
+ error("Cannot reallocate memory in art_svp_from_vpath()");
+
+ svp = tmp;
}
svp->segs[n_segs].n_points = n_points;
svp->segs[n_segs].dir = (dir > 0);
@@ -1026,6 +1043,8 @@ struct _ArtPriPoint {
static ArtPriQ *art_pri_new(void) {
ArtPriQ *result = art_new(ArtPriQ, 1);
+ if (!result)
+ error("[art_pri_new] Cannot allocate memory");
result->n_items = 0;
result->n_items_max = 16;
@@ -1157,8 +1176,13 @@ static int art_svp_writer_rewind_add_segment(ArtSvpWriter *self, int wind_left,
(swr->n_segs_max - 1) *
sizeof(ArtSVPSeg));
swr->svp = svp;
- swr->n_points_max = art_renew(swr->n_points_max, int,
- swr->n_segs_max);
+ int *tmp = art_renew(swr->n_points_max, int,
+ swr->n_segs_max);
+
+ if (!tmp)
+ error("Cannot reallocate memory in art_svp_writer_rewind_add_segment()");
+
+ swr->n_points_max = tmp;
}
seg = &svp->segs[seg_num];
seg->n_points = 1;
@@ -1169,6 +1193,9 @@ static int art_svp_writer_rewind_add_segment(ArtSvpWriter *self, int wind_left,
seg->bbox.x1 = x;
seg->bbox.y1 = y;
seg->points = art_new(ArtPoint, init_n_points_max);
+ if (!seg->points)
+ error("[art_svp_writer_rewind_add_segment] Cannot allocate memory");
+
seg->points[0].x = x;
seg->points[0].y = y;
return seg_num;
@@ -1213,6 +1240,8 @@ ArtSVP *art_svp_writer_rewind_reap(ArtSvpWriter *self) {
ArtSvpWriter *art_svp_writer_rewind_new(ArtWindRule rule) {
ArtSvpWriterRewind *result = art_new(ArtSvpWriterRewind, 1);
+ if (!result)
+ error("[art_svp_writer_rewind_new] Cannot allocate memory");
result->super.add_segment = art_svp_writer_rewind_add_segment;
result->super.add_point = art_svp_writer_rewind_add_point;
@@ -1222,6 +1251,9 @@ ArtSvpWriter *art_svp_writer_rewind_new(ArtWindRule rule) {
result->n_segs_max = 16;
result->svp = (ArtSVP *)malloc(sizeof(ArtSVP) +
(result->n_segs_max - 1) * sizeof(ArtSVPSeg));
+ if (!result->svp)
+ error("[art_svp_writer_rewind_new] Cannot allocate memory");
+
result->svp->n_segs = 0;
result->n_points_max = art_new(int, result->n_segs_max);
@@ -1392,6 +1424,9 @@ static void art_svp_intersect_push_pt(ArtIntersectCtx *ctx, ArtActiveSeg *seg,
seg->y1 = y;
pri_pt = art_new(ArtPriPoint, 1);
+ if (!pri_pt)
+ error("[art_svp_intersect_push_pt] Cannot allocate memory");
+
pri_pt->x = x;
pri_pt->y = y;
pri_pt->user_data = seg;
@@ -1855,6 +1890,8 @@ static void art_svp_intersect_horiz(ArtIntersectCtx *ctx, ArtActiveSeg *seg,
return;
hs = art_new(ArtActiveSeg, 1);
+ if (!hs)
+ error("[art_svp_intersect_horiz] Cannot allocate memory");
hs->flags = ART_ACTIVE_FLAGS_DEL | (seg->flags & ART_ACTIVE_FLAGS_OUT);
if (seg->flags & ART_ACTIVE_FLAGS_OUT) {
@@ -1993,10 +2030,11 @@ static void art_svp_intersect_add_seg(ArtIntersectCtx *ctx, const ArtSVPSeg *in_
ArtActiveSeg *seg = art_new(ArtActiveSeg, 1);
ArtActiveSeg *test;
double x0, y0;
- ArtActiveSeg *beg_range;
ArtActiveSeg *last = NULL;
ArtActiveSeg *left, *right;
ArtPriPoint *pri_pt = art_new(ArtPriPoint, 1);
+ if (!pri_pt)
+ error("[art_svp_intersect_add_seg] Cannot allocate memory");
seg->flags = 0;
seg->in_seg = in_seg;
@@ -2019,7 +2057,6 @@ static void art_svp_intersect_add_seg(ArtIntersectCtx *ctx, const ArtSVPSeg *in_
x0 = in_seg->points[0].x;
y0 = in_seg->points[0].y;
- beg_range = NULL;
for (test = ctx->active_head; test != NULL; test = test->right) {
double d;
int test_bneg = test->flags & ART_ACTIVE_FLAGS_BNEG;
@@ -2166,6 +2203,9 @@ void art_svp_intersector(const ArtSVP *in, ArtSvpWriter *out) {
return;
ctx = art_new(ArtIntersectCtx, 1);
+ if (!ctx)
+ error("[art_svp_intersector] Cannot allocate memory");
+
ctx->in = in;
ctx->out = out;
pq = art_pri_new();
@@ -2178,6 +2218,9 @@ void art_svp_intersector(const ArtSVP *in, ArtSvpWriter *out) {
ctx->in_curs = 0;
first_point = art_new(ArtPriPoint, 1);
+ if (!first_point)
+ error("[art_svp_intersector] Cannot allocate memory");
+
first_point->x = in->segs[0].points[0].x;
first_point->y = in->segs[0].points[0].y;
first_point->user_data = NULL;
@@ -2319,6 +2362,8 @@ static void art_svp_render_delete_active(int *active_segs, int j, int n_active_s
ArtSVPRenderAAIter *art_svp_render_aa_iter(const ArtSVP *svp,
int x0, int y0, int x1, int y1) {
ArtSVPRenderAAIter *iter = art_new(ArtSVPRenderAAIter, 1);
+ if (!iter)
+ error("[art_svp_render_aa_iter] Cannot allocate memory");
iter->svp = svp;
iter->y = y0;
diff --git a/engines/sword25/gfx/image/art.h b/engines/sword25/gfx/image/art.h
index bfeb31cc30..8c9c97bc57 100644
--- a/engines/sword25/gfx/image/art.h
+++ b/engines/sword25/gfx/image/art.h
@@ -51,10 +51,13 @@ namespace Sword25 {
#define art_expand(p, type, max) \
do { \
if(max) {\
- p = art_renew(p, type, max <<= 1); \
+ type *tmp = art_renew(p, type, max <<= 1); \
+ if (!tmp) error("Cannot reallocate memory for art data"); \
+ p = tmp; \
} else { \
max = 1; \
p = art_new(type, 1); \
+ if (!p) error("Cannot allocate memory for art data"); \
} \
} while (0)
diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp
index f5f33d8e02..3b29b0333f 100644
--- a/engines/sword25/gfx/image/renderedimage.cpp
+++ b/engines/sword25/gfx/image/renderedimage.cpp
@@ -72,7 +72,10 @@ static byte *readSavegameThumbnail(const Common::String &filename, uint &fileSiz
// Seek to the actual PNG image
loadString(*file); // Marker (BS25SAVEGAME)
- loadString(*file); // Version
+ Common::String storedVersionID = loadString(*file); // Version
+ if (storedVersionID != "SCUMMVM1")
+ loadString(*file);
+
loadString(*file); // Description
uint32 compressedGamedataSize = atoi(loadString(*file).c_str());
loadString(*file); // Uncompressed game data size
diff --git a/engines/sword25/gfx/image/vectorimage.cpp b/engines/sword25/gfx/image/vectorimage.cpp
index 9235ec2fcf..81f4fc2ad5 100644
--- a/engines/sword25/gfx/image/vectorimage.cpp
+++ b/engines/sword25/gfx/image/vectorimage.cpp
@@ -248,7 +248,7 @@ VectorImage::VectorImage(const byte *pFileData, uint fileSize, bool &success, co
}
// readout SWF size
- Common::Rect movieRect = flashRectToBSRect(bs);
+ flashRectToBSRect(bs);
// Get frame rate and frame count
/* uint32 frameRate = */
@@ -321,6 +321,8 @@ ArtBpath *VectorImage::storeBez(ArtBpath *bez, int lineStyle, int fillStyle0, in
bez[*bezNodes].code = ART_END;
ArtBpath *bez1 = art_new(ArtBpath, *bezNodes + 1);
+ if (!bez1)
+ error("[VectorImage::storeBez] Cannot allocate memory");
for (int i = 0; i <= *bezNodes; i++)
bez1[i] = bez[i];
diff --git a/engines/sword25/gfx/image/vectorimagerenderer.cpp b/engines/sword25/gfx/image/vectorimagerenderer.cpp
index 97dad3346d..6d4dc213f2 100644
--- a/engines/sword25/gfx/image/vectorimagerenderer.cpp
+++ b/engines/sword25/gfx/image/vectorimagerenderer.cpp
@@ -270,6 +270,9 @@ ArtVpath *art_vpath_cat(ArtVpath *a, ArtVpath *b) {
len_a = art_vpath_len(a);
len_b = art_vpath_len(b);
dest = art_new(ArtVpath, len_a + len_b + 1);
+ if (!dest)
+ error("[art_vpath_cat] Cannot allocate memory");
+
p = dest;
for (int i = 0; i < len_a; i++)
@@ -299,6 +302,8 @@ ArtVpath *art_vpath_reverse(ArtVpath *a) {
len = art_vpath_len(a);
dest = art_new(ArtVpath, len + 1);
+ if (!dest)
+ error("[art_vpath_reverse] Cannot allocate memory");
for (i = 0; i < len; i++) {
it = a[len - i - 1];
@@ -371,6 +376,8 @@ void drawBez(ArtBpath *bez1, ArtBpath *bez2, byte *buffer, int width, int height
int size = art_vpath_len(vec);
ArtVpath *vect = art_new(ArtVpath, size + 1);
+ if (!vect)
+ error("[drawBez] Cannot allocate memory");
int k;
for (k = 0; k < size; k++) {
diff --git a/engines/sword25/gfx/staticbitmap.cpp b/engines/sword25/gfx/staticbitmap.cpp
index 60ad94e20f..0ae07b36b5 100644
--- a/engines/sword25/gfx/staticbitmap.cpp
+++ b/engines/sword25/gfx/staticbitmap.cpp
@@ -170,7 +170,10 @@ bool StaticBitmap::unpersist(InputPersistenceBlock &reader) {
result &= Bitmap::unpersist(reader);
Common::String resourceFilename;
reader.readString(resourceFilename);
- result &= initBitmapResource(resourceFilename);
+ // We may not have saves, and we actually do not need to
+ // restore them. So do not even try to load them.
+ if (!resourceFilename.hasPrefix("/saves"))
+ result &= initBitmapResource(resourceFilename);
result &= RenderObject::unpersistChildren(reader);
diff --git a/engines/sword25/kernel/inputpersistenceblock.cpp b/engines/sword25/kernel/inputpersistenceblock.cpp
index c1cd771e39..cdce539c31 100644
--- a/engines/sword25/kernel/inputpersistenceblock.cpp
+++ b/engines/sword25/kernel/inputpersistenceblock.cpp
@@ -35,9 +35,10 @@
namespace Sword25 {
-InputPersistenceBlock::InputPersistenceBlock(const void *data, uint dataLength) :
+InputPersistenceBlock::InputPersistenceBlock(const void *data, uint dataLength, int version) :
_data(static_cast<const byte *>(data), dataLength),
- _errorState(NONE) {
+ _errorState(NONE),
+ _version(version) {
_iter = _data.begin();
}
@@ -54,8 +55,8 @@ void InputPersistenceBlock::read(int16 &value) {
void InputPersistenceBlock::read(signed int &value) {
if (checkMarker(SINT_MARKER)) {
- rawRead(&value, sizeof(signed int));
- value = convertEndianessFromStorageToSystem(value);
+ value = (int32)READ_LE_UINT32(_iter);
+ _iter += 4;
} else {
value = 0;
}
@@ -63,8 +64,8 @@ void InputPersistenceBlock::read(signed int &value) {
void InputPersistenceBlock::read(uint &value) {
if (checkMarker(UINT_MARKER)) {
- rawRead(&value, sizeof(uint));
- value = convertEndianessFromStorageToSystem(value);
+ value = READ_LE_UINT32(_iter);
+ _iter += 4;
} else {
value = 0;
}
@@ -72,8 +73,10 @@ void InputPersistenceBlock::read(uint &value) {
void InputPersistenceBlock::read(float &value) {
if (checkMarker(FLOAT_MARKER)) {
- rawRead(&value, sizeof(float));
- value = convertEndianessFromStorageToSystem(value);
+ uint32 tmp[1];
+ tmp[0] = READ_LE_UINT32(_iter);
+ value = ((float *)tmp)[0];
+ _iter += 4;
} else {
value = 0.0f;
}
@@ -81,12 +84,11 @@ void InputPersistenceBlock::read(float &value) {
void InputPersistenceBlock::read(bool &value) {
if (checkMarker(BOOL_MARKER)) {
- uint uintBool;
- rawRead(&uintBool, sizeof(float));
- uintBool = convertEndianessFromStorageToSystem(uintBool);
+ uint uintBool = READ_LE_UINT32(_iter);
+ _iter += 4;
value = uintBool == 0 ? false : true;
} else {
- value = 0.0f;
+ value = false;
}
}
@@ -116,13 +118,6 @@ void InputPersistenceBlock::readByteArray(Common::Array<byte> &value) {
}
}
-void InputPersistenceBlock::rawRead(void *destPtr, size_t size) {
- if (checkBlockSize(size)) {
- memcpy(destPtr, &*_iter, size);
- _iter += size;
- }
-}
-
bool InputPersistenceBlock::checkBlockSize(int size) {
if (_data.end() - _iter >= size) {
return true;
diff --git a/engines/sword25/kernel/inputpersistenceblock.h b/engines/sword25/kernel/inputpersistenceblock.h
index f643b06bc1..2518d7e32c 100644
--- a/engines/sword25/kernel/inputpersistenceblock.h
+++ b/engines/sword25/kernel/inputpersistenceblock.h
@@ -46,7 +46,7 @@ public:
OUT_OF_SYNC
};
- InputPersistenceBlock(const void *data, uint dataLength);
+ InputPersistenceBlock(const void *data, uint dataLength, int version);
virtual ~InputPersistenceBlock();
void read(int16 &value);
@@ -64,14 +64,17 @@ public:
return _errorState;
}
+ int getVersion() const { return _version; }
+
private:
bool checkMarker(byte marker);
bool checkBlockSize(int size);
- void rawRead(void *destPtr, size_t size);
Common::Array<byte> _data;
Common::Array<byte>::const_iterator _iter;
ErrorState _errorState;
+
+ int _version;
};
} // End of namespace Sword25
diff --git a/engines/sword25/kernel/outputpersistenceblock.cpp b/engines/sword25/kernel/outputpersistenceblock.cpp
index cf28ea401f..e29d956e5f 100644
--- a/engines/sword25/kernel/outputpersistenceblock.cpp
+++ b/engines/sword25/kernel/outputpersistenceblock.cpp
@@ -43,19 +43,23 @@ OutputPersistenceBlock::OutputPersistenceBlock() {
void OutputPersistenceBlock::write(signed int value) {
writeMarker(SINT_MARKER);
- value = convertEndianessFromSystemToStorage(value);
+ value = TO_LE_32(value);
rawWrite(&value, sizeof(value));
}
void OutputPersistenceBlock::write(uint value) {
writeMarker(UINT_MARKER);
- value = convertEndianessFromSystemToStorage(value);
+ value = TO_LE_32(value);
rawWrite(&value, sizeof(value));
}
void OutputPersistenceBlock::write(float value) {
writeMarker(FLOAT_MARKER);
- value = convertEndianessFromSystemToStorage(value);
+ uint32 tmp[1];
+
+ ((float *)tmp)[0] = value;
+ tmp[0] = TO_LE_32(tmp[0]);
+
rawWrite(&value, sizeof(value));
}
@@ -63,7 +67,7 @@ void OutputPersistenceBlock::write(bool value) {
writeMarker(BOOL_MARKER);
uint uintBool = value ? 1 : 0;
- uintBool = convertEndianessFromSystemToStorage(uintBool);
+ uintBool = TO_LE_32(uintBool);
rawWrite(&uintBool, sizeof(uintBool));
}
diff --git a/engines/sword25/kernel/persistenceblock.h b/engines/sword25/kernel/persistenceblock.h
index d8440faa50..8ac3e84a41 100644
--- a/engines/sword25/kernel/persistenceblock.h
+++ b/engines/sword25/kernel/persistenceblock.h
@@ -64,48 +64,6 @@ protected:
BLOCK_MARKER
};
- // -----------------------------------------------------------------------------
- // Endianess Conversions
- // -----------------------------------------------------------------------------
- //
- // Everything is stored in Little Endian
- // Big Endian Systems will need to be byte swapped during both saving and reading of saved values
- //
-
- template<typename T>
- static T convertEndianessFromSystemToStorage(T value) {
- if (isBigEndian())
- reverseByteOrder(&value);
- return value;
- }
-
- template<typename T>
- static T convertEndianessFromStorageToSystem(T value) {
- if (isBigEndian())
- reverseByteOrder(&value);
- return value;
- }
-
-private:
- static bool isBigEndian() {
- uint dummy = 1;
- byte *dummyPtr = reinterpret_cast<byte *>(&dummy);
- return dummyPtr[0] == 0;
- }
-
- template<typename T>
- static void swap(T &one, T &two) {
- T temp = one;
- one = two;
- two = temp;
- }
-
- static void reverseByteOrder(void *ptr) {
- // Reverses the byte order of the 32-bit word pointed to by Ptr
- byte *charPtr = static_cast<byte *>(ptr);
- swap(charPtr[0], charPtr[3]);
- swap(charPtr[1], charPtr[2]);
- }
};
#define CTASSERT(ex) typedef char ctassert_type[(ex) ? 1 : -1]
diff --git a/engines/sword25/kernel/persistenceservice.cpp b/engines/sword25/kernel/persistenceservice.cpp
index c88360e031..27d669caa1 100644
--- a/engines/sword25/kernel/persistenceservice.cpp
+++ b/engines/sword25/kernel/persistenceservice.cpp
@@ -50,7 +50,9 @@ static const char *SAVEGAME_DIRECTORY = "saves";
static const char *FILE_MARKER = "BS25SAVEGAME";
static const uint SLOT_COUNT = 18;
static const uint FILE_COPY_BUFFER_SIZE = 1024 * 10;
-static const char *VERSIONID = "SCUMMVM1";
+static const char *VERSIONIDOLD = "SCUMMVM1";
+static const char *VERSIONID = "SCUMMVM2";
+static const int VERSIONNUM = 2;
#define MAX_SAVEGAME_SIZE 100
@@ -99,6 +101,7 @@ struct SavegameInformation {
bool isOccupied;
bool isCompatible;
Common::String description;
+ int version;
uint gamedataLength;
uint gamedataOffset;
uint gamedataUncompressedLength;
@@ -147,9 +150,15 @@ struct PersistenceService::Impl {
// Read in the header
Common::String storedMarker = loadString(file);
Common::String storedVersionID = loadString(file);
+ if (storedVersionID == VERSIONIDOLD) {
+ curSavegameInfo.version = 1;
+ } else {
+ Common::String versionNum = loadString(file);
+ curSavegameInfo.version = atoi(versionNum.c_str());
+ }
Common::String gameDescription = loadString(file);
- Common::String gameDataLength = loadString(file);
- curSavegameInfo.gamedataLength = atoi(gameDataLength.c_str());
+ Common::String gamedataLength = loadString(file);
+ curSavegameInfo.gamedataLength = atoi(gamedataLength.c_str());
Common::String gamedataUncompressedLength = loadString(file);
curSavegameInfo.gamedataUncompressedLength = atoi(gamedataUncompressedLength.c_str());
@@ -158,7 +167,7 @@ struct PersistenceService::Impl {
// The slot is marked as occupied.
curSavegameInfo.isOccupied = true;
// Check if the saved game is compatible with the current engine version.
- curSavegameInfo.isCompatible = (storedVersionID == Common::String(VERSIONID));
+ curSavegameInfo.isCompatible = (curSavegameInfo.version <= VERSIONNUM);
// Load the save game description.
curSavegameInfo.description = gameDescription;
// The offset to the stored save game data within the file.
@@ -242,6 +251,12 @@ Common::String &PersistenceService::getSavegameFilename(uint slotID) {
return result;
}
+int PersistenceService::getSavegameVersion(uint slotID) {
+ if (!checkslotID(slotID))
+ return -1;
+ return _impl->_savegameInformations[slotID].version;
+}
+
bool PersistenceService::saveGame(uint slotID, const Common::String &screenshotFilename) {
// FIXME: This code is a hack which bypasses the savefile API,
// and should eventually be removed.
@@ -264,6 +279,11 @@ bool PersistenceService::saveGame(uint slotID, const Common::String &screenshotF
file->writeString(VERSIONID);
file->writeByte(0);
+ char buf[20];
+ snprintf(buf, 20, "%d", VERSIONNUM);
+ file->writeString(buf);
+ file->writeByte(0);
+
TimeDate dt;
g_system->getTimeAndDate(dt);
file->writeString(formatTimestamp(dt));
@@ -385,7 +405,7 @@ bool PersistenceService::loadGame(uint slotID) {
memcpy(uncompressedDataBuffer, compressedDataBuffer, uncompressedBufferSize);
}
- InputPersistenceBlock reader(&uncompressedDataBuffer[0], curSavegameInfo.gamedataUncompressedLength);
+ InputPersistenceBlock reader(&uncompressedDataBuffer[0], curSavegameInfo.gamedataUncompressedLength, curSavegameInfo.version);
// Einzelne Engine-Module depersistieren.
bool success = true;
diff --git a/engines/sword25/kernel/persistenceservice.h b/engines/sword25/kernel/persistenceservice.h
index f73962892c..59e0a3661d 100644
--- a/engines/sword25/kernel/persistenceservice.h
+++ b/engines/sword25/kernel/persistenceservice.h
@@ -57,6 +57,7 @@ public:
void reloadSlots();
bool isSlotOccupied(uint slotID);
bool isSavegameCompatible(uint slotID);
+ int getSavegameVersion(uint slotID);
Common::String &getSavegameDescription(uint slotID);
Common::String &getSavegameFilename(uint slotID);
diff --git a/engines/sword25/math/regionregistry.cpp b/engines/sword25/math/regionregistry.cpp
index dff8560205..68c360a5ee 100644
--- a/engines/sword25/math/regionregistry.cpp
+++ b/engines/sword25/math/regionregistry.cpp
@@ -34,7 +34,9 @@
#include "sword25/math/regionregistry.h"
#include "sword25/math/region.h"
+namespace Common {
DECLARE_SINGLETON(Sword25::RegionRegistry);
+}
namespace Sword25 {
diff --git a/engines/sword25/package/packagemanager.h b/engines/sword25/package/packagemanager.h
index c57c30636d..b0c6718008 100644
--- a/engines/sword25/package/packagemanager.h
+++ b/engines/sword25/package/packagemanager.h
@@ -141,6 +141,9 @@ public:
uint fileSize;
char *data = (char *)getFile(fileName, &fileSize);
char *result = (char *)malloc(fileSize + strlen(versionStr) + 1);
+ if (!result)
+ error("[PackageManager::getXmlFile] Cannot allocate memory");
+
strcpy(result, versionStr);
Common::copy(data, data + fileSize, result + strlen(versionStr));
result[fileSize + strlen(versionStr)] = '\0';
diff --git a/engines/sword25/sfx/soundengine.cpp b/engines/sword25/sfx/soundengine.cpp
index 9244137c25..78b2db19eb 100644
--- a/engines/sword25/sfx/soundengine.cpp
+++ b/engines/sword25/sfx/soundengine.cpp
@@ -33,6 +33,8 @@
#include "sword25/sfx/soundengine.h"
#include "sword25/package/packagemanager.h"
#include "sword25/kernel/resource.h"
+#include "sword25/kernel/inputpersistenceblock.h"
+#include "sword25/kernel/outputpersistenceblock.h"
#include "audio/decoders/vorbis.h"
@@ -61,6 +63,8 @@ SoundEngine::SoundEngine(Kernel *pKernel) : ResourceService(pKernel) {
_mixer = g_system->getMixer();
+ _maxHandleId = 1;
+
for (int i = 0; i < SOUND_HANDLES; i++)
_handles[i].type = kFreeHandle;
}
@@ -139,19 +143,24 @@ void SoundEngine::resumeLayer(uint layer) {
SndHandle *SoundEngine::getHandle(uint *id) {
- // NOTE: Index 0 means error. Thus we're not using it
- for (uint i = 1; i < SOUND_HANDLES; i++) {
+ for (uint i = 0; i < SOUND_HANDLES; i++) {
if (_handles[i].type != kFreeHandle && !_mixer->isSoundHandleActive(_handles[i].handle)) {
- debugC(kDebugSound, 5, "Handle %d has finished playing", i);
+ debugC(1, kDebugSound, "Handle %d has finished playing", _handles[i].id);
_handles[i].type = kFreeHandle;
}
}
- for (uint i = 1; i < SOUND_HANDLES; i++) {
+ for (uint i = 0; i < SOUND_HANDLES; i++) {
if (_handles[i].type == kFreeHandle) {
- debugC(kDebugSound, 5, "Allocated handle %d", i);
+ debugC(1, kDebugSound, "Allocated handle %d", _handles[i].id);
+ _handles[i].id = _maxHandleId;
+ _handles[i].type = kAllocatedHandle;
+
if (id)
- *id = i;
+ *id = _maxHandleId;
+
+ _maxHandleId++;
+
return &_handles[i];
}
}
@@ -161,6 +170,17 @@ SndHandle *SoundEngine::getHandle(uint *id) {
return NULL;
}
+SndHandle *SoundEngine::findHandle(uint id) {
+ for (uint i = 0; i < SOUND_HANDLES; i++) {
+ if (_handles[i].id == id)
+ return &_handles[i];
+ }
+
+ warning("Sound::findHandle(): Unknown handle");
+
+ return NULL;
+}
+
Audio::Mixer::SoundType getType(SoundEngine::SOUND_TYPES type) {
switch (type) {
case SoundEngine::MUSIC:
@@ -184,13 +204,27 @@ bool SoundEngine::playSound(const Common::String &fileName, SOUND_TYPES type, fl
return true;
}
-uint SoundEngine::playSoundEx(const Common::String &fileName, SOUND_TYPES type, float volume, float pan, bool loop, int loopStart, int loopEnd, uint layer) {
+uint SoundEngine::playSoundEx(const Common::String &fileName, SOUND_TYPES type, float volume, float pan, bool loop, int loopStart, int loopEnd, uint layer, uint handleId) {
Common::SeekableReadStream *in = Kernel::getInstance()->getPackage()->getStream(fileName);
#ifdef USE_VORBIS
Audio::SeekableAudioStream *stream = Audio::makeVorbisStream(in, DisposeAfterUse::YES);
#endif
- uint id;
- SndHandle *handle = getHandle(&id);
+ uint id = handleId;
+ SndHandle *handle;
+
+ if (handleId == 0x1337)
+ handle = getHandle(&id);
+ else
+ handle = &_handles[handleId];
+
+ handle->fileName = fileName;
+ handle->sndType = type;
+ handle->volume = volume;
+ handle->pan = pan;
+ handle->loop = loop;
+ handle->loopStart = loopStart;
+ handle->loopEnd = loopEnd;
+ handle->layer = layer;
debugC(1, kDebugSound, "SoundEngine::playSoundEx(%s, %d, %f, %f, %d, %d, %d, %d)", fileName.c_str(), type, volume, pan, loop, loopStart, loopEnd, layer);
@@ -202,43 +236,43 @@ uint SoundEngine::playSoundEx(const Common::String &fileName, SOUND_TYPES type,
}
void SoundEngine::setSoundVolume(uint handle, float volume) {
- assert(handle < SOUND_HANDLES);
-
debugC(1, kDebugSound, "SoundEngine::setSoundVolume(%d, %f)", handle, volume);
- _mixer->setChannelVolume(_handles[handle].handle, (byte)(volume * 255));
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle != NULL)
+ _mixer->setChannelVolume(sndHandle->handle, (byte)(volume * 255));
}
void SoundEngine::setSoundPanning(uint handle, float pan) {
- assert(handle < SOUND_HANDLES);
-
debugC(1, kDebugSound, "SoundEngine::setSoundPanning(%d, %f)", handle, pan);
- _mixer->setChannelBalance(_handles[handle].handle, (int8)(pan * 127));
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle != NULL)
+ _mixer->setChannelBalance(sndHandle->handle, (int8)(pan * 127));
}
void SoundEngine::pauseSound(uint handle) {
- assert(handle < SOUND_HANDLES);
-
debugC(1, kDebugSound, "SoundEngine::pauseSound(%d)", handle);
- _mixer->pauseHandle(_handles[handle].handle, true);
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle != NULL)
+ _mixer->pauseHandle(sndHandle->handle, true);
}
void SoundEngine::resumeSound(uint handle) {
- assert(handle < SOUND_HANDLES);
-
debugC(1, kDebugSound, "SoundEngine::resumeSound(%d)", handle);
- _mixer->pauseHandle(_handles[handle].handle, false);
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle != NULL)
+ _mixer->pauseHandle(sndHandle->handle, false);
}
void SoundEngine::stopSound(uint handle) {
- assert(handle < SOUND_HANDLES);
-
debugC(1, kDebugSound, "SoundEngine::stopSound(%d)", handle);
- _mixer->stopHandle(_handles[handle].handle);
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle != NULL)
+ _mixer->stopHandle(sndHandle->handle);
}
bool SoundEngine::isSoundPaused(uint handle) {
@@ -250,23 +284,30 @@ bool SoundEngine::isSoundPaused(uint handle) {
}
bool SoundEngine::isSoundPlaying(uint handle) {
- assert(handle < SOUND_HANDLES);
-
debugC(1, kDebugSound, "SoundEngine::isSoundPlaying(%d)", handle);
- return _mixer->isSoundHandleActive(_handles[handle].handle);
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle == NULL)
+ return false;
+ return _mixer->isSoundHandleActive(sndHandle->handle);
}
float SoundEngine::getSoundVolume(uint handle) {
debugC(1, kDebugSound, "SoundEngine::getSoundVolume(%d)", handle);
- return (float)_mixer->getChannelVolume(_handles[handle].handle) / 255.0;
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle == NULL)
+ return 0.f;
+ return (float)_mixer->getChannelVolume(sndHandle->handle) / 255.0;
}
float SoundEngine::getSoundPanning(uint handle) {
debugC(1, kDebugSound, "SoundEngine::getSoundPanning(%d)", handle);
- return (float)_mixer->getChannelBalance(_handles[handle].handle) / 127.0;
+ SndHandle* sndHandle = findHandle(handle);
+ if (sndHandle == NULL)
+ return 0.f;
+ return (float)_mixer->getChannelBalance(sndHandle->handle) / 127.0;
}
Resource *SoundEngine::loadResource(const Common::String &fileName) {
@@ -284,16 +325,61 @@ bool SoundEngine::canLoadResource(const Common::String &fileName) {
}
-bool SoundEngine::persist(OutputPersistenceBlock &writer) {
- warning("STUB: SoundEngine::persist()");
+ bool SoundEngine::persist(OutputPersistenceBlock &writer) {
+ writer.write(_maxHandleId);
+
+ for (uint i = 0; i < SOUND_HANDLES; i++) {
+ writer.write(_handles[i].id);
+
+ writer.writeString(_handles[i].fileName);
+ writer.write((int)_handles[i].sndType);
+ writer.write(_handles[i].volume);
+ writer.write(_handles[i].pan);
+ writer.write(_handles[i].loop);
+ writer.write(_handles[i].loopStart);
+ writer.write(_handles[i].loopEnd);
+ writer.write(_handles[i].layer);
+ }
return true;
}
bool SoundEngine::unpersist(InputPersistenceBlock &reader) {
- warning("STUB: SoundEngine::unpersist()");
+ _mixer->stopAll();
+
+ if (reader.getVersion() < 2)
+ return true;
+
+ reader.read(_maxHandleId);
+
+ for (uint i = 0; i < SOUND_HANDLES; i++) {
+ reader.read(_handles[i].id);
+
+ Common::String fileName;
+ int sndType;
+ float volume;
+ float pan;
+ bool loop;
+ int loopStart;
+ int loopEnd;
+ uint layer;
+
+ reader.readString(fileName);
+ reader.read(sndType);
+ reader.read(volume);
+ reader.read(pan);
+ reader.read(loop);
+ reader.read(loopStart);
+ reader.read(loopEnd);
+ reader.read(layer);
+
+ if (reader.isGood()) {
+ playSoundEx(fileName, (SOUND_TYPES)sndType, volume, pan, loop, loopStart, loopEnd, layer, i);
+ } else
+ return false;
+ }
- return true;
+ return reader.isGood();
}
diff --git a/engines/sword25/sfx/soundengine.h b/engines/sword25/sfx/soundengine.h
index 4dbd475846..8132ec556e 100644
--- a/engines/sword25/sfx/soundengine.h
+++ b/engines/sword25/sfx/soundengine.h
@@ -58,13 +58,22 @@ namespace Sword25 {
enum sndHandleType {
kFreeHandle,
- kEffectHandle,
- kVoiceHandle
+ kAllocatedHandle
};
struct SndHandle {
Audio::SoundHandle handle;
sndHandleType type;
+ uint32 id;
+
+ Common::String fileName;
+ int sndType;
+ float volume;
+ float pan;
+ bool loop;
+ int loopStart;
+ int loopEnd;
+ uint layer;
};
@@ -176,7 +185,7 @@ public:
* @remark If more control is needed over the playing, eg. changing the sound parameters
* for Volume and Panning, then PlaySoundEx should be used.
*/
- uint playSoundEx(const Common::String &fileName, SOUND_TYPES type, float volume = 1.0f, float pan = 0.0f, bool loop = false, int loopStart = -1, int loopEnd = -1, uint layer = 0);
+ uint playSoundEx(const Common::String &fileName, SOUND_TYPES type, float volume = 1.0f, float pan = 0.0f, bool loop = false, int loopStart = -1, int loopEnd = -1, uint layer = 0, uint handleId = 0x1337);
/**
* Sets the volume of a playing sound
@@ -244,10 +253,13 @@ public:
private:
bool registerScriptBindings();
SndHandle *getHandle(uint *id);
+ SndHandle *findHandle(uint id);
private:
Audio::Mixer *_mixer;
SndHandle _handles[SOUND_HANDLES];
+
+ uint32 _maxHandleId;
};
} // End of namespace Sword25
diff --git a/engines/sword25/sword25.cpp b/engines/sword25/sword25.cpp
index b111746c32..2201188052 100644
--- a/engines/sword25/sword25.cpp
+++ b/engines/sword25/sword25.cpp
@@ -50,7 +50,9 @@
#include "sword25/gfx/animationtemplateregistry.h" // Needed so we can destroy the singleton
#include "sword25/gfx/renderobjectregistry.h" // Needed so we can destroy the singleton
+namespace Common {
DECLARE_SINGLETON(Sword25::RenderObjectRegistry);
+}
#include "sword25/math/regionregistry.h" // Needed so we can destroy the singleton
namespace Sword25 {
diff --git a/engines/sword25/util/lua/lapi.cpp b/engines/sword25/util/lua/lapi.cpp
index ff25cfc653..b97e90012c 100644
--- a/engines/sword25/util/lua/lapi.cpp
+++ b/engines/sword25/util/lua/lapi.cpp
@@ -1074,4 +1074,3 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
lua_unlock(L);
return name;
}
-
diff --git a/engines/sword25/util/lua/lauxlib.cpp b/engines/sword25/util/lua/lauxlib.cpp
index 1261777315..116d19dfce 100644
--- a/engines/sword25/util/lua/lauxlib.cpp
+++ b/engines/sword25/util/lua/lauxlib.cpp
@@ -655,4 +655,3 @@ LUALIB_API lua_State *luaL_newstate (void) {
if (L) lua_atpanic(L, &panic);
return L;
}
-
diff --git a/engines/sword25/util/lua/lauxlib.h b/engines/sword25/util/lua/lauxlib.h
index d58f290527..d3c1d5ca35 100644
--- a/engines/sword25/util/lua/lauxlib.h
+++ b/engines/sword25/util/lua/lauxlib.h
@@ -170,5 +170,3 @@ LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
#define luaL_reg luaL_Reg
#endif
-
-
diff --git a/engines/sword25/util/lua/lbaselib.cpp b/engines/sword25/util/lua/lbaselib.cpp
index 5032e6322a..3f0b645164 100644
--- a/engines/sword25/util/lua/lbaselib.cpp
+++ b/engines/sword25/util/lua/lbaselib.cpp
@@ -651,4 +651,3 @@ LUALIB_API int luaopen_base (lua_State *L) {
luaL_register(L, LUA_COLIBNAME, co_funcs);
return 2;
}
-
diff --git a/engines/sword25/util/lua/lcode.cpp b/engines/sword25/util/lua/lcode.cpp
index 6e7e10017f..ead780d359 100644
--- a/engines/sword25/util/lua/lcode.cpp
+++ b/engines/sword25/util/lua/lcode.cpp
@@ -836,4 +836,3 @@ void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
}
fs->freereg = base + 1; /* free registers with list values */
}
-
diff --git a/engines/sword25/util/lua/ldblib.cpp b/engines/sword25/util/lua/ldblib.cpp
index 618e9a843f..e5cb8231c0 100644
--- a/engines/sword25/util/lua/ldblib.cpp
+++ b/engines/sword25/util/lua/ldblib.cpp
@@ -398,4 +398,3 @@ LUALIB_API int luaopen_debug (lua_State *L) {
luaL_register(L, LUA_DBLIBNAME, dblib);
return 1;
}
-
diff --git a/engines/sword25/util/lua/ldebug.cpp b/engines/sword25/util/lua/ldebug.cpp
index 85c492cc77..e89ae9cad5 100644
--- a/engines/sword25/util/lua/ldebug.cpp
+++ b/engines/sword25/util/lua/ldebug.cpp
@@ -619,4 +619,3 @@ void luaG_runerror (lua_State *L, const char *fmt, ...) {
va_end(argp);
luaG_errormsg(L);
}
-
diff --git a/engines/sword25/util/lua/ldo.cpp b/engines/sword25/util/lua/ldo.cpp
index 49e0881a45..5d9667f4f0 100644
--- a/engines/sword25/util/lua/ldo.cpp
+++ b/engines/sword25/util/lua/ldo.cpp
@@ -534,5 +534,3 @@ int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {
luaZ_freebuffer(L, &p.buff);
return status;
}
-
-
diff --git a/engines/sword25/util/lua/ldo.h b/engines/sword25/util/lua/ldo.h
index 4c97134805..e57b08dec0 100644
--- a/engines/sword25/util/lua/ldo.h
+++ b/engines/sword25/util/lua/ldo.h
@@ -54,4 +54,3 @@ LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop);
#endif
-
diff --git a/engines/sword25/util/lua/lfunc.cpp b/engines/sword25/util/lua/lfunc.cpp
index ce7acf4e77..f8fa19e25a 100644
--- a/engines/sword25/util/lua/lfunc.cpp
+++ b/engines/sword25/util/lua/lfunc.cpp
@@ -171,4 +171,3 @@ const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
}
return NULL; /* not found */
}
-
diff --git a/engines/sword25/util/lua/lgc.cpp b/engines/sword25/util/lua/lgc.cpp
index 71e581ad30..54f7b548dd 100644
--- a/engines/sword25/util/lua/lgc.cpp
+++ b/engines/sword25/util/lua/lgc.cpp
@@ -708,4 +708,3 @@ void luaC_linkupval (lua_State *L, UpVal *uv) {
}
}
}
-
diff --git a/engines/sword25/util/lua/linit.cpp b/engines/sword25/util/lua/linit.cpp
index 93f41d0350..a01f28d1ff 100644
--- a/engines/sword25/util/lua/linit.cpp
+++ b/engines/sword25/util/lua/linit.cpp
@@ -35,4 +35,3 @@ LUALIB_API void luaL_openlibs (lua_State *L) {
lua_call(L, 1, 0);
}
}
-
diff --git a/engines/sword25/util/lua/liolib.cpp b/engines/sword25/util/lua/liolib.cpp
index 6c00de5094..0d27f9677f 100644
--- a/engines/sword25/util/lua/liolib.cpp
+++ b/engines/sword25/util/lua/liolib.cpp
@@ -590,4 +590,3 @@ LUALIB_API int luaopen_io (lua_State *L) {
lua_pop(L, 1); /* pop 'popen' */
return 1;
}
-
diff --git a/engines/sword25/util/lua/llex.cpp b/engines/sword25/util/lua/llex.cpp
index 4d73a6a600..464ab3ec15 100644
--- a/engines/sword25/util/lua/llex.cpp
+++ b/engines/sword25/util/lua/llex.cpp
@@ -188,7 +188,7 @@ static void trydecpoint (LexState *ls, SemInfo *seminfo) {
sprintf(buf, "%.1f", 1.0);
ls->decpoint = '.';
for (i = 0; buf[i]; i++) {
- if (!isspace(buf[i]) && !isdigit(buf[i])) {
+ if (!isspace(static_cast<unsigned char>(buf[i])) && !isdigit(static_cast<unsigned char>(buf[i]))) {
ls->decpoint = buf[i];
break;
}
@@ -472,4 +472,3 @@ void luaX_lookahead (LexState *ls) {
lua_assert(ls->lookahead.token == TK_EOS);
ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);
}
-
diff --git a/engines/sword25/util/lua/lmathlib.cpp b/engines/sword25/util/lua/lmathlib.cpp
index 6c36bbcf4e..c1a645b296 100644
--- a/engines/sword25/util/lua/lmathlib.cpp
+++ b/engines/sword25/util/lua/lmathlib.cpp
@@ -274,4 +274,3 @@ LUALIB_API int luaopen_math (lua_State *L) {
#endif
return 1;
}
-
diff --git a/engines/sword25/util/lua/lmem.cpp b/engines/sword25/util/lua/lmem.cpp
index ccd69357e0..004a467dc8 100644
--- a/engines/sword25/util/lua/lmem.cpp
+++ b/engines/sword25/util/lua/lmem.cpp
@@ -83,4 +83,3 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
g->totalbytes = (g->totalbytes - osize) + nsize;
return block;
}
-
diff --git a/engines/sword25/util/lua/lmem.h b/engines/sword25/util/lua/lmem.h
index 97a888c7f8..6430912b41 100644
--- a/engines/sword25/util/lua/lmem.h
+++ b/engines/sword25/util/lua/lmem.h
@@ -46,4 +46,3 @@ LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,
const char *errormsg);
#endif
-
diff --git a/engines/sword25/util/lua/loadlib.cpp b/engines/sword25/util/lua/loadlib.cpp
index f4cdd70a78..49934ce059 100644
--- a/engines/sword25/util/lua/loadlib.cpp
+++ b/engines/sword25/util/lua/loadlib.cpp
@@ -329,4 +329,3 @@ LUALIB_API int luaopen_package (lua_State *L) {
lua_pop(L, 1);
return 1; /* return 'package' table */
}
-
diff --git a/engines/sword25/util/lua/lobject.h b/engines/sword25/util/lua/lobject.h
index 5418a918b1..70b2c754ea 100644
--- a/engines/sword25/util/lua/lobject.h
+++ b/engines/sword25/util/lua/lobject.h
@@ -378,4 +378,3 @@ LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);
#endif
-
diff --git a/engines/sword25/util/lua/lopcodes.cpp b/engines/sword25/util/lua/lopcodes.cpp
index d9da16f689..255b2029e9 100644
--- a/engines/sword25/util/lua/lopcodes.cpp
+++ b/engines/sword25/util/lua/lopcodes.cpp
@@ -99,4 +99,3 @@ const lu_byte luaP_opmodes[NUM_OPCODES] = {
,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */
,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */
};
-
diff --git a/engines/sword25/util/lua/loslib.cpp b/engines/sword25/util/lua/loslib.cpp
index b61f8c65e1..25bfa2d1b5 100644
--- a/engines/sword25/util/lua/loslib.cpp
+++ b/engines/sword25/util/lua/loslib.cpp
@@ -243,4 +243,3 @@ LUALIB_API int luaopen_os (lua_State *L) {
luaL_register(L, LUA_OSLIBNAME, syslib);
return 1;
}
-
diff --git a/engines/sword25/util/lua/lstate.cpp b/engines/sword25/util/lua/lstate.cpp
index e542bcbacc..26bed7bec2 100644
--- a/engines/sword25/util/lua/lstate.cpp
+++ b/engines/sword25/util/lua/lstate.cpp
@@ -211,4 +211,3 @@ LUA_API void lua_close (lua_State *L) {
luai_userstateclose(L);
close_state(L);
}
-
diff --git a/engines/sword25/util/lua/lstate.h b/engines/sword25/util/lua/lstate.h
index 94a6249461..05ccb43d5e 100644
--- a/engines/sword25/util/lua/lstate.h
+++ b/engines/sword25/util/lua/lstate.h
@@ -166,4 +166,3 @@ LUAI_FUNC lua_State *luaE_newthread (lua_State *L);
LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
#endif
-
diff --git a/engines/sword25/util/lua/lstring.cpp b/engines/sword25/util/lua/lstring.cpp
index cd55cc63bf..046b87ee1c 100644
--- a/engines/sword25/util/lua/lstring.cpp
+++ b/engines/sword25/util/lua/lstring.cpp
@@ -108,4 +108,3 @@ Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
G(L)->mainthread->next = obj2gco(u);
return u;
}
-
diff --git a/engines/sword25/util/lua/lstrlib.cpp b/engines/sword25/util/lua/lstrlib.cpp
index 2a1b8690e2..bcc869cb98 100644
--- a/engines/sword25/util/lua/lstrlib.cpp
+++ b/engines/sword25/util/lua/lstrlib.cpp
@@ -865,4 +865,3 @@ LUALIB_API int luaopen_string (lua_State *L) {
createmetatable(L);
return 1;
}
-
diff --git a/engines/sword25/util/lua/ltablib.cpp b/engines/sword25/util/lua/ltablib.cpp
index 607c09ae71..93be9e6077 100644
--- a/engines/sword25/util/lua/ltablib.cpp
+++ b/engines/sword25/util/lua/ltablib.cpp
@@ -276,4 +276,3 @@ LUALIB_API int luaopen_table (lua_State *L) {
luaL_register(L, LUA_TABLIBNAME, tab_funcs);
return 1;
}
-
diff --git a/engines/sword25/util/lua/ltm.cpp b/engines/sword25/util/lua/ltm.cpp
index 02856a58fc..60ca76689a 100644
--- a/engines/sword25/util/lua/ltm.cpp
+++ b/engines/sword25/util/lua/ltm.cpp
@@ -72,4 +72,3 @@ const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
}
return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);
}
-
diff --git a/engines/sword25/util/lua/luaconf.h b/engines/sword25/util/lua/luaconf.h
index f3509e969b..f5affe9fd7 100644
--- a/engines/sword25/util/lua/luaconf.h
+++ b/engines/sword25/util/lua/luaconf.h
@@ -723,4 +723,3 @@ union luai_Cast { double l_d; long l_l; };
#endif
-
diff --git a/engines/sword25/util/lua/lvm.cpp b/engines/sword25/util/lua/lvm.cpp
index d0f2198651..d538d0b349 100644
--- a/engines/sword25/util/lua/lvm.cpp
+++ b/engines/sword25/util/lua/lvm.cpp
@@ -760,4 +760,3 @@ void luaV_execute (lua_State *L, int nexeccalls) {
}
}
}
-
diff --git a/engines/sword25/util/lua/lzio.cpp b/engines/sword25/util/lua/lzio.cpp
index e1e7b28a29..d05c613897 100644
--- a/engines/sword25/util/lua/lzio.cpp
+++ b/engines/sword25/util/lua/lzio.cpp
@@ -78,5 +78,3 @@ char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {
}
return buff->buffer;
}
-
-
diff --git a/engines/sword25/util/pluto/CHANGELOG b/engines/sword25/util/pluto/CHANGELOG
index e31ed26044..1be321f898 100644
--- a/engines/sword25/util/pluto/CHANGELOG
+++ b/engines/sword25/util/pluto/CHANGELOG
@@ -35,4 +35,3 @@ Earlier versions are changelogged on the LuaForge site.
* Fixed all outstanding 5.0->5.1 conversion issues
* Made heavier use of size_t in preference to int
* Fixed GC/Upval issue (thanks to Eric Jacobs)
-
diff --git a/engines/sword25/util/pluto/FILEFORMAT b/engines/sword25/util/pluto/FILEFORMAT
index b3f10ee603..e7716675c7 100644
--- a/engines/sword25/util/pluto/FILEFORMAT
+++ b/engines/sword25/util/pluto/FILEFORMAT
@@ -165,4 +165,4 @@ struct LocVar {
Object name; /* Name of the local variable */
int startpc; /* Point where variable is active */
int endpc; /* Point where variable is dead */
-}; \ No newline at end of file
+};
diff --git a/engines/sword25/util/pluto/THANKS b/engines/sword25/util/pluto/THANKS
index fea3595dbf..443713fa61 100644
--- a/engines/sword25/util/pluto/THANKS
+++ b/engines/sword25/util/pluto/THANKS
@@ -7,4 +7,3 @@ Goran Adrinek
Eric Jacobs
Anolan Milanes
Malte Thiesen
-
diff --git a/engines/sword25/util/pluto/plzio.cpp b/engines/sword25/util/pluto/plzio.cpp
index 0efc3dfcf2..21f69a9e8d 100644
--- a/engines/sword25/util/pluto/plzio.cpp
+++ b/engines/sword25/util/pluto/plzio.cpp
@@ -72,5 +72,3 @@ char *pdep_openspace (lua_State *L, Mbuffer *buff, size_t n) {
}
return buff->buffer;
}
-
-
diff --git a/engines/teenagent/actor.cpp b/engines/teenagent/actor.cpp
index 717c022c38..cb8c798fb6 100644
--- a/engines/teenagent/actor.cpp
+++ b/engines/teenagent/actor.cpp
@@ -37,7 +37,7 @@ Common::Rect Actor::renderIdle(Graphics::Surface *surface, const Common::Point &
debug(0, "switched to idle animation %u", idle_type);
}
- Resources * res = Resources::instance();
+ Resources *res = Resources::instance();
byte *frames_idle;
do {
frames_idle = res->dseg.ptr(res->dseg.get_word(0x6540 + idle_type * 2)) + index;
@@ -47,7 +47,7 @@ Common::Rect Actor::renderIdle(Graphics::Surface *surface, const Common::Point &
debug(0, "switched to idle animation %u[loop]", idle_type);
index = 3; //put 4th frame (base 1) if idle animation loops
}
- } while(*frames_idle == 0);
+ } while (*frames_idle == 0);
bool mirror = orientation == kActorLeft;
Surface *s = frames + *frames_idle - 1;
diff --git a/engines/teenagent/animation.cpp b/engines/teenagent/animation.cpp
index e945bda1e5..56107b67ca 100644
--- a/engines/teenagent/animation.cpp
+++ b/engines/teenagent/animation.cpp
@@ -106,11 +106,11 @@ void Animation::free() {
index = 0;
}
-void Animation::load(Common::SeekableReadStream *s, Type type) {
+void Animation::load(Common::SeekableReadStream &s, Type type) {
//fixme: do not reload the same animation each time
free();
- if (s == NULL || s->size() <= 1) {
+ if (s.size() <= 1) {
debug(1, "empty animation");
return;
}
@@ -119,29 +119,29 @@ void Animation::load(Common::SeekableReadStream *s, Type type) {
int off = 0;
switch (type) {
case kTypeLan:
- data_size = s->readUint16LE();
- if (s->eos()) {
+ data_size = s.readUint16LE();
+ if (s.eos()) {
debug(1, "empty animation");
return;
}
data_size -= 2;
data = new byte[data_size];
- data_size = s->read(data, data_size);
+ data_size = s.read(data, data_size);
/* for (int i = 0; i < data_size; ++i) {
debug(0, "%02x ", data[i]);
}
debug(0, ", %u frames", data_size / 3);
*/
- frames_count = s->readByte();
+ frames_count = s.readByte();
debug(1, "%u physical frames", frames_count);
if (frames_count == 0)
return;
frames = new Surface[frames_count];
- s->skip(frames_count * 2 - 2); //sizes
- /*pos = */s->readUint16LE();
+ s.skip(frames_count * 2 - 2); //sizes
+ /*pos = */s.readUint16LE();
//debug(0, "pos?: %04x", pos);
for (uint16 i = 0; i < frames_count; ++i) {
@@ -152,15 +152,15 @@ void Animation::load(Common::SeekableReadStream *s, Type type) {
break;
case kTypeInventory: {
- data_size = 3 * s->readByte();
+ data_size = 3 * s.readByte();
data = new byte[data_size];
frames_count = 0;
for (byte i = 0; i < data_size / 3; ++i) {
int idx = i * 3;
/* byte unk = */
- s->readByte();
- data[idx] = s->readByte();
+ s.readByte();
+ data[idx] = s.readByte();
if (data[idx] == 0)
data[idx] = 1; //fixme: investigate
if (data[idx] > frames_count)
@@ -179,17 +179,17 @@ void Animation::load(Common::SeekableReadStream *s, Type type) {
break;
case kTypeVaria:
- frames_count = s->readByte();
+ frames_count = s.readByte();
debug(1, "loading varia resource, %u physical frames", frames_count);
uint16 offset[255];
for (byte i = 0; i < frames_count; ++i) {
- offset[i] = s->readUint16LE();
+ offset[i] = s.readUint16LE();
//debug(0, "%u: %04x", i, offset[i]);
}
frames = new Surface[frames_count];
for (uint16 i = 0; i < frames_count; ++i) {
//debug(0, "%04x", offset[i]);
- s->seek(offset[i] + off);
+ s.seek(offset[i] + off);
frames[i].load(s, Surface::kTypeOns);
}
diff --git a/engines/teenagent/animation.h b/engines/teenagent/animation.h
index e98bb42ea0..6942cc74eb 100644
--- a/engines/teenagent/animation.h
+++ b/engines/teenagent/animation.h
@@ -35,7 +35,7 @@ public:
enum Type {kTypeLan, kTypeVaria, kTypeInventory};
Animation();
- void load(Common::SeekableReadStream *s, Type type = kTypeLan);
+ void load(Common::SeekableReadStream &, Type type = kTypeLan);
void free();
Surface *firstFrame();
diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp
index ae498478a4..f8bb142bd8 100644
--- a/engines/teenagent/callbacks.cpp
+++ b/engines/teenagent/callbacks.cpp
@@ -34,7 +34,7 @@ namespace TeenAgent {
#define INC_FLAG(addr) (++*res->dseg.ptr(addr))
void TeenAgentEngine::rejectMessage() {
- Resources * res = Resources::instance();
+ Resources *res = Resources::instance();
//random reject message:
uint i = _rnd.getRandomNumber(3);
//debug(0, "reject message: %s", (const char *)res->dseg.ptr(res->dseg.get_word(0x339e + 2 * i)));
@@ -46,9 +46,9 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
if (addr == 0)
return false;
- Resources * res = Resources::instance();
+ Resources *res = Resources::instance();
debug(0, "processCallback(%04x)", addr);
- byte * code = res->cseg.ptr(addr);
+ byte *code = res->cseg.ptr(addr);
//try trivial callbacks first
if (code[0] == 0xbb && code[3] == 0xe8 && code[6] == 0xc3) {
@@ -1355,7 +1355,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
inventory->add(11);
disableObject(1);
- byte * scene_15_ons = scene->getOns(15); //patch ons for the scene 15
+ byte *scene_15_ons = scene->getOns(15); //patch ons for the scene 15
scene_15_ons[0] = 0;
byte f = GET_FLAG(0xDB98) + 1;
@@ -2501,7 +2501,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
return true;
case 0x862c:
- displayMessage(CHECK_FLAG(0xDBB0, 1)? 0x4882: 0x3457);
+ displayMessage(CHECK_FLAG(0xDBB0, 1) ? 0x4882 : 0x3457);
return true;
case 0x86a9: //correcting height of the pole with spanner
@@ -2561,7 +2561,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
setOns(4, 0);
{
- Walkbox * w = scene->getWalkbox(0);
+ Walkbox *w = scene->getWalkbox(0);
w->rect.clear();
w->save();
}
@@ -2747,21 +2747,21 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
inventory->remove(36);
SET_FLAG(0xDBAD, 1);
{
- Object * o = scene->getObject(7);
+ Object *o = scene->getObject(7);
o->actor_rect.left = o->actor_rect.right = 297;
o->actor_rect.top = o->actor_rect.bottom = 181;
o->actor_orientation = 1;
o->save();
}
{
- Object * o = scene->getObject(9);
+ Object *o = scene->getObject(9);
o->actor_rect.left = o->actor_rect.right = 297;
o->actor_rect.top = o->actor_rect.bottom = 181;
o->actor_orientation = 1;
o->save();
}
{
- Walkbox * w = scene->getWalkbox(0);
+ Walkbox *w = scene->getWalkbox(0);
w->rect.right = 266;
w->rect.bottom = 193;
w->save();
@@ -3904,7 +3904,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
SET_FLAG(0, 0);
processCallback(0x9a7a);
INC_FLAG(0xDBA6);
- switch(GET_FLAG(0xDBA6)) {
+ switch (GET_FLAG(0xDBA6)) {
case 1:
displayMessage(0x39ae);
break;
@@ -4014,7 +4014,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
moveTo(186, 198, 2, true);
moveTo(220, 198, 4);
{
- Walkbox * w = scene->getWalkbox(0);
+ Walkbox *w = scene->getWalkbox(0);
w->rect.left = 0;
w->rect.bottom = 199;
w->save();
diff --git a/engines/teenagent/console.cpp b/engines/teenagent/console.cpp
index 2f4d7cc9c3..5164b44729 100644
--- a/engines/teenagent/console.cpp
+++ b/engines/teenagent/console.cpp
@@ -25,10 +25,10 @@
namespace TeenAgent {
Console::Console(TeenAgentEngine *engine) : _engine(engine) {
- DCmd_Register("enable_object", WRAP_METHOD(Console, enableObject));
- DCmd_Register("disable_object", WRAP_METHOD(Console, enableObject));
- DCmd_Register("set_ons", WRAP_METHOD(Console, setOns));
- DCmd_Register("set_music", WRAP_METHOD(Console, setMusic));
+ DCmd_Register("enable_object", WRAP_METHOD(Console, enableObject));
+ DCmd_Register("disable_object", WRAP_METHOD(Console, enableObject));
+ DCmd_Register("set_ons", WRAP_METHOD(Console, setOns));
+ DCmd_Register("set_music", WRAP_METHOD(Console, setMusic));
}
bool Console::enableObject(int argc, const char **argv) {
diff --git a/engines/teenagent/detection.cpp b/engines/teenagent/detection.cpp
index 72a338664b..cf58df1344 100644
--- a/engines/teenagent/detection.cpp
+++ b/engines/teenagent/detection.cpp
@@ -54,7 +54,7 @@ static const ADGameDescription teenAgentGameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
{
"teenagent",
@@ -74,13 +74,13 @@ static const ADGameDescription teenAgentGameDescriptions[] = {
Common::CZ_CZE,
Common::kPlatformPC,
ADGF_CD,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER,
};
enum {
- MAX_SAVES = 20
+ MAX_SAVES = 20
};
class TeenAgentMetaEngine : public AdvancedMetaEngine {
@@ -177,9 +177,8 @@ public:
ssd.setDeletableFlag(true);
//checking for the thumbnail
- Common::ScopedPtr<Graphics::Surface> thumb(new Graphics::Surface);
- if (Graphics::loadThumbnail(*in, *thumb))
- ssd.setThumbnail(thumb.release());
+ if (Graphics::Surface *const thumb = Graphics::loadThumbnail(*in))
+ ssd.setThumbnail(thumb);
return ssd;
}
diff --git a/engines/teenagent/font.h b/engines/teenagent/font.h
index 773edaf4e2..5146ace21f 100644
--- a/engines/teenagent/font.h
+++ b/engines/teenagent/font.h
@@ -47,4 +47,3 @@ private:
} // End of namespace TeenAgent
#endif
-
diff --git a/engines/teenagent/inventory.cpp b/engines/teenagent/inventory.cpp
index 4951b2d940..59dd44baa3 100644
--- a/engines/teenagent/inventory.cpp
+++ b/engines/teenagent/inventory.cpp
@@ -43,7 +43,7 @@ Inventory::Inventory(TeenAgentEngine *engine) {
if (!s)
error("no inventory background");
debug(0, "loading inventory background...");
- _background.load(s, Surface::kTypeOns);
+ _background.load(*s, Surface::kTypeOns);
}
uint32 items_size = varia.getSize(4);
@@ -286,10 +286,10 @@ void Inventory::Item::free() {
void Inventory::Item::backgroundEffect(Graphics::Surface *s) {
uint w = _rect.right - _rect.left, h = _rect.bottom - _rect.top;
byte *line = (byte *)s->getBasePtr(_rect.left, _rect.top);
- for(uint y = 0; y < h; ++y, line += s->pitch) {
+ for (uint y = 0; y < h; ++y, line += s->pitch) {
byte *dst = line;
- for(uint x = 0; x < w; ++x, ++dst) {
- *dst = (*dst == 232)? 214: 224;
+ for (uint x = 0; x < w; ++x, ++dst) {
+ *dst = (*dst == 232) ? 214 : 224;
}
}
}
@@ -300,13 +300,13 @@ void Inventory::Item::load(Inventory *inventory, uint item_id) {
if (_animation.empty()) {
debug(0, "loading item %d from offset %x", obj->id, inventory->_offset[obj->id - 1]);
Common::MemoryReadStream s(inventory->_items + inventory->_offset[obj->id - 1], inventory->_offset[obj->id] - inventory->_offset[obj->id - 1]);
- _animation.load(&s, Animation::kTypeInventory);
+ _animation.load(s, Animation::kTypeInventory);
}
} else {
if (_surface.empty()) {
debug(0, "loading item %d from offset %x", obj->id, inventory->_offset[obj->id - 1]);
Common::MemoryReadStream s(inventory->_items + inventory->_offset[obj->id - 1], inventory->_offset[obj->id] - inventory->_offset[obj->id - 1]);
- _surface.load(&s, Surface::kTypeOns);
+ _surface.load(s, Surface::kTypeOns);
}
}
}
diff --git a/engines/teenagent/music.cpp b/engines/teenagent/music.cpp
index 0f70f4b082..6cc2fd8d6b 100644
--- a/engines/teenagent/music.cpp
+++ b/engines/teenagent/music.cpp
@@ -137,7 +137,7 @@ void MusicPlayer::interrupt() {
continue;
}
- setChannelData(chn, (const int8*)_samples[sample].data, NULL, _samples[sample].size, 0);
+ setChannelData(chn, (const int8 *)_samples[sample].data, NULL, _samples[sample].size, 0);
setChannelPeriod(chn, noteToPeriod[((note >> 4) & 0x0F) - 1][(note & 0x0F)]);
}
}
diff --git a/engines/teenagent/objects.cpp b/engines/teenagent/objects.cpp
index 74e3a4944d..748f342d54 100644
--- a/engines/teenagent/objects.cpp
+++ b/engines/teenagent/objects.cpp
@@ -26,7 +26,7 @@
namespace TeenAgent {
-void Rect::load(byte * src) {
+void Rect::load(byte *src) {
_base = src;
Common::MemoryReadStream ins(src, 8);
left = ins.readUint16LE();
@@ -52,7 +52,7 @@ void Rect::render(Graphics::Surface *surface, uint8 color) const {
}
-void Object::load(byte * src) {
+void Object::load(byte *src) {
_base = src;
id = *src++;
@@ -85,10 +85,10 @@ void Object::setName(const Common::String &new_name) {
void Object::dump(int level) const {
debug(level, "object: %u %u [%u,%u,%u,%u], actor: [%u,%u,%u,%u], orientation: %u, name: %s", id, enabled,
- rect.left, rect.top, rect.right, rect.bottom,
- actor_rect.left, actor_rect.top, actor_rect.right, actor_rect.bottom,
- actor_orientation, name.c_str()
- );
+ rect.left, rect.top, rect.right, rect.bottom,
+ actor_rect.left, actor_rect.top, actor_rect.right, actor_rect.bottom,
+ actor_orientation, name.c_str()
+ );
}
Common::String Object::parse_description(const char *name) {
@@ -139,16 +139,16 @@ void UseHotspot::load(byte *src) {
void UseHotspot::dump(int level) const {
debug(level,
- "hotspot: inv_id: %02x, obj_id: %02x, orientation?: %02x, actor position: (%d,%d), callback: %04x",
- inventory_id, object_id, orientation, actor_x, actor_y, callback
- );
+ "hotspot: inv_id: %02x, obj_id: %02x, orientation?: %02x, actor position: (%d,%d), callback: %04x",
+ inventory_id, object_id, orientation, actor_x, actor_y, callback
+ );
}
void Walkbox::dump(int level) const {
debug(level, "walkbox %02x %02x [%d, %d, %d, %d] top: %u, right: %u, bottom: %u, left: %u",
- type, orientation,
- rect.left, rect.top, rect.right, rect.bottom,
- side_hint[0], side_hint[1], side_hint[2], side_hint[3]);
+ type, orientation,
+ rect.left, rect.top, rect.right, rect.bottom,
+ side_hint[0], side_hint[1], side_hint[2], side_hint[3]);
}
void Walkbox::load(byte *src) {
@@ -158,7 +158,7 @@ void Walkbox::load(byte *src) {
orientation = *src++;
rect.load(src);
src += 8;
- for(byte i = 0; i < 4; ++i)
+ for (byte i = 0; i < 4; ++i)
side_hint[i] = *src++;
}
diff --git a/engines/teenagent/objects.h b/engines/teenagent/objects.h
index d1e4388a15..555287fc56 100644
--- a/engines/teenagent/objects.h
+++ b/engines/teenagent/objects.h
@@ -74,7 +74,7 @@ struct Rect {
return x >= left && x <= right && y1 <= bottom && y2 >= top;
}
- inline bool contains(const Rect & rect) const {
+ inline bool contains(const Rect &rect) const {
return rect.left >= left && rect.right <= right && rect.top >= top && rect.bottom <= bottom;
}
@@ -120,7 +120,7 @@ struct Rect {
}
void side(Common::Point &p1, Common::Point &p2, int o, const Common::Point &nearest) const {
- switch(o) {
+ switch (o) {
case kActorLeft:
p1 = Common::Point(left, top);
p2 = Common::Point(left, bottom);
@@ -150,7 +150,7 @@ struct Rect {
}
protected:
- byte * _base;
+ byte *_base;
};
struct Object {
@@ -172,7 +172,7 @@ struct Object {
static Common::String parse_description(const char *name);
protected:
- byte * _base;
+ byte *_base;
};
struct InventoryObject {
@@ -184,7 +184,7 @@ struct InventoryObject {
void load(byte *addr);
protected:
- byte * _base;
+ byte *_base;
};
struct UseHotspot {
@@ -209,7 +209,7 @@ struct Walkbox {
void save() const;
protected:
- byte * _base;
+ byte *_base;
};
struct FadeType {
@@ -220,7 +220,7 @@ struct FadeType {
};
//\todo move it to util.h?
-template<typename T> inline T SIGN (T x) { return (x > 0)? 1: ((x < 0)? -1: 0); }
+template<typename T> inline T SIGN(T x) { return (x > 0) ? 1 : ((x < 0) ? -1 : 0); }
} // End of namespace TeenAgent
diff --git a/engines/teenagent/pack.cpp b/engines/teenagent/pack.cpp
index aada922f7d..5302e2eceb 100644
--- a/engines/teenagent/pack.cpp
+++ b/engines/teenagent/pack.cpp
@@ -179,7 +179,7 @@ bool MemoryPack::open(const Common::String &filename) {
uint32 MemoryPack::getSize(uint32 id) const {
--id;
- return id < chunks.size()? chunks[id].size: 0;
+ return id < chunks.size() ? chunks[id].size : 0;
}
uint32 MemoryPack::read(uint32 id, byte *dst, uint32 size) const {
diff --git a/engines/teenagent/pack.h b/engines/teenagent/pack.h
index 09168676e2..1d6c471554 100644
--- a/engines/teenagent/pack.h
+++ b/engines/teenagent/pack.h
@@ -85,8 +85,13 @@ class MemoryPack : public Pack {
byte *data;
uint32 size;
inline Chunk(): data(0), size(0) {}
- inline Chunk(const Chunk &c): data(c.data), size(c.size) { c.reset(); }
- inline Chunk& operator=(const Chunk &c) { data = c.data; size = c.size; c.reset(); return *this; }
+ inline Chunk(const Chunk &c) : data(c.data), size(c.size) { c.reset(); }
+ inline Chunk &operator=(const Chunk &c) {
+ data = c.data;
+ size = c.size;
+ c.reset();
+ return *this;
+ }
inline ~Chunk() { delete[] data; }
inline void reset() const {
Chunk *c = const_cast<Chunk *>(this);
diff --git a/engines/teenagent/resources.cpp b/engines/teenagent/resources.cpp
index 9e69383215..597ca670c0 100644
--- a/engines/teenagent/resources.cpp
+++ b/engines/teenagent/resources.cpp
@@ -106,13 +106,20 @@ void Resources::loadOff(Graphics::Surface &surface, byte *palette, int id) {
error("invalid background %d", id);
return;
}
- byte buf[64768];
- off.read(id, buf, sizeof(buf));
+
+ const uint bufferSize = 64768;
+ byte *buf = (byte *)malloc(bufferSize);
+ if (!buf)
+ error("[Resources::loadOff] Cannot allocate buffer");
+
+ off.read(id, buf, bufferSize);
byte *src = buf;
byte *dst = (byte *)surface.pixels;
memcpy(dst, src, 64000);
memcpy(palette, buf + 64000, 768);
+
+ free(buf);
}
Common::SeekableReadStream *Resources::loadLan(uint32 id) const {
diff --git a/engines/teenagent/scene.cpp b/engines/teenagent/scene.cpp
index 4be6c9c31a..e8c2dec4fa 100644
--- a/engines/teenagent/scene.cpp
+++ b/engines/teenagent/scene.cpp
@@ -38,9 +38,9 @@
namespace TeenAgent {
Scene::Scene(TeenAgentEngine *engine, OSystem *system) : intro(false), _id(0), ons(0),
- orientation(kActorRight), actor_talking(false),
- message_timer(0), message_first_frame(0), message_last_frame(0), message_animation(NULL),
- current_event(SceneEvent::kNone), hide_actor(false), callback(0), callback_timer(0), _idle_timer(0) {
+ orientation(kActorRight), actor_talking(false),
+ message_timer(0), message_first_frame(0), message_last_frame(0), message_animation(NULL),
+ current_event(SceneEvent::kNone), hide_actor(false), callback(0), callback_timer(0), _idle_timer(0) {
_engine = engine;
_system = system;
@@ -57,7 +57,7 @@ Scene::Scene(TeenAgentEngine *engine, OSystem *system) : intro(false), _id(0), o
if (!s)
error("invalid resource data");
- teenagent.load(s, Animation::kTypeVaria);
+ teenagent.load(*s, Animation::kTypeVaria);
if (teenagent.empty())
error("invalid mark animation");
@@ -65,7 +65,7 @@ Scene::Scene(TeenAgentEngine *engine, OSystem *system) : intro(false), _id(0), o
if (!s)
error("invalid resource data");
- teenagent_idle.load(s, Animation::kTypeVaria);
+ teenagent_idle.load(*s, Animation::kTypeVaria);
if (teenagent_idle.empty())
error("invalid mark animation");
@@ -100,13 +100,13 @@ bool Scene::findPath(Scene::Path &p, const Common::Point &src, const Common::Poi
p.push_back(dst);
Common::List<uint> boxes;
- for(uint i = 0; i < scene_walkboxes.size(); ++i) {
- const Walkbox & w = scene_walkboxes[i];
+ for (uint i = 0; i < scene_walkboxes.size(); ++i) {
+ const Walkbox &w = scene_walkboxes[i];
if (!w.rect.in(src) && !w.rect.in(dst))
boxes.push_back(i);
}
- for(Path::iterator i = p.begin(); i != p.end() && !boxes.empty(); ) {
+ for (Path::iterator i = p.begin(); i != p.end() && !boxes.empty();) {
Path::iterator next = i;
++next;
if (next == p.end())
@@ -116,8 +116,8 @@ bool Scene::findPath(Scene::Path &p, const Common::Point &src, const Common::Poi
debug(1, "%d,%d -> %d,%d", p1.x, p1.y, p2.x, p2.y);
Common::List<uint>::iterator wi;
- for(wi = boxes.begin(); wi != boxes.end(); ++wi) {
- const Walkbox & w = scene_walkboxes[*wi];
+ for (wi = boxes.begin(); wi != boxes.end(); ++wi) {
+ const Walkbox &w = scene_walkboxes[*wi];
int mask = w.rect.intersects_line(p1, p2);
if (mask == 0) {
continue;
@@ -279,7 +279,7 @@ void Scene::loadObjectData() {
byte *fade_table = res->dseg.ptr(res->dseg.get_word(0x663e + i * 2));
Common::Array<FadeType> &scene_fades = fades[i];
- while(READ_LE_UINT16(fade_table) != 0xffff) {
+ while (READ_LE_UINT16(fade_table) != 0xffff) {
FadeType fade;
fade.load(fade_table);
fade_table += 9;
@@ -340,7 +340,7 @@ void Scene::loadOns() {
for (uint32 i = 0; i < ons_count; ++i) {
Common::ScopedPtr<Common::SeekableReadStream> s(res->ons.getStream(on_id[i]));
if (s) {
- ons[i].load(s, Surface::kTypeOns);
+ ons[i].load(*s, Surface::kTypeOns);
}
}
}
@@ -363,7 +363,7 @@ void Scene::loadLans() {
Common::ScopedPtr<Common::SeekableReadStream> s(res->loadLan000(res_id));
if (s) {
- animation[i].load(s, Animation::kTypeLan);
+ animation[i].load(*s, Animation::kTypeLan);
if (bxv != 0 && bxv != 0xff)
animation[i].id = bxv;
}
@@ -402,17 +402,17 @@ void Scene::init(int id, const Common::Point &pos) {
Common::ScopedPtr<Common::SeekableReadStream> stream(res->on.getStream(id));
int sub_hack = 0;
if (id == 7) { //something patched in the captains room
- switch(res->dseg.get_byte(0xdbe6)) {
- case 2:
- break;
- case 1:
- sub_hack = 1;
- break;
- default:
- sub_hack = 2;
+ switch (res->dseg.get_byte(0xdbe6)) {
+ case 2:
+ break;
+ case 1:
+ sub_hack = 1;
+ break;
+ default:
+ sub_hack = 2;
}
}
- on.load(stream, SurfaceList::kTypeOn, sub_hack);
+ on.load(*stream, SurfaceList::kTypeOn, sub_hack);
loadOns();
loadLans();
@@ -428,37 +428,37 @@ void Scene::init(int id, const Common::Point &pos) {
}
void Scene::playAnimation(byte idx, uint id, bool loop, bool paused, bool ignore) {
- debug(0, "playAnimation(%u, %u, loop:%s, paused:%s, ignore:%s)", idx, id, loop?"true":"false", paused?"true":"false", ignore?"true":"false");
+ debug(0, "playAnimation(%u, %u, loop:%s, paused:%s, ignore:%s)", idx, id, loop ? "true" : "false", paused ? "true" : "false", ignore ? "true" : "false");
assert(idx < 4);
Common::ScopedPtr<Common::SeekableReadStream> s(Resources::instance()->loadLan(id + 1));
if (!s)
error("playing animation %u failed", id);
- custom_animation[idx].load(s);
+ custom_animation[idx].load(*s);
custom_animation[idx].loop = loop;
custom_animation[idx].paused = paused;
custom_animation[idx].ignore = ignore;
}
void Scene::playActorAnimation(uint id, bool loop, bool ignore) {
- debug(0, "playActorAnimation(%u, loop:%s, ignore:%s)", id, loop?"true":"false", ignore?"true":"false");
+ debug(0, "playActorAnimation(%u, loop:%s, ignore:%s)", id, loop ? "true" : "false", ignore ? "true" : "false");
Common::ScopedPtr<Common::SeekableReadStream> s(Resources::instance()->loadLan(id + 1));
if (!s)
error("playing animation %u failed", id);
- actor_animation.load(s);
+ actor_animation.load(*s);
actor_animation.loop = loop;
actor_animation.ignore = ignore;
actor_animation.id = id;
}
-Animation * Scene::getAnimation(byte slot) {
+Animation *Scene::getAnimation(byte slot) {
assert(slot < 4);
return custom_animation + slot;
}
byte Scene::peekFlagEvent(uint16 addr) const {
- for(EventList::const_iterator i = events.reverse_begin(); i != events.end(); --i) {
+ for (EventList::const_iterator i = events.reverse_begin(); i != events.end(); --i) {
const SceneEvent &e = *i;
if (e.type == SceneEvent::kSetFlag && e.callback == addr)
return e.color;
@@ -497,7 +497,7 @@ bool Scene::processEvent(const Common::Event &event) {
return false;
case Common::EVENT_KEYDOWN:
- switch(event.kbd.keycode) {
+ switch (event.kbd.keycode) {
case Common::KEYCODE_ESCAPE:
case Common::KEYCODE_SPACE: {
if (intro && event.kbd.keycode == Common::KEYCODE_ESCAPE) {
@@ -535,7 +535,7 @@ bool Scene::processEvent(const Common::Event &event) {
uint feature = event.kbd.keycode - '1';
if (feature < DebugFeatures::kMax) {
debug_features.feature[feature] = !debug_features.feature[feature];
- debug(0, "switched feature %u %s", feature, debug_features.feature[feature] ? "on": "off");
+ debug(0, "switched feature %u %s", feature, debug_features.feature[feature] ? "on" : "off");
}
}
break;
@@ -557,10 +557,9 @@ struct ZOrderCmp {
int Scene::lookupZoom(uint y) const {
Resources *res = Resources::instance();
- for(byte *zoom_table = res->dseg.ptr(res->dseg.get_word(0x70f4 + (_id - 1) * 2));
- zoom_table[0] != 0xff && zoom_table[1] != 0xff;
- zoom_table += 2
- ) {
+ for (byte *zoom_table = res->dseg.ptr(res->dseg.get_word(0x70f4 + (_id - 1) * 2));
+ zoom_table[0] != 0xff && zoom_table[1] != 0xff;
+ zoom_table += 2) {
//debug(0, "%d %d->%d", y, zoom_table[0], zoom_table[1]);
if (y <= zoom_table[0]) {
//debug(0, "%d %d->%d", y, zoom_table[0], zoom_table[1]);
@@ -575,9 +574,9 @@ void Scene::paletteEffect(byte step) {
Resources *res = Resources::instance();
byte *src = res->dseg.ptr(0x6609);
byte *dst = palette + 3 * 0xf2;
- for(byte i = 0; i < 0xd; ++i) {
- for(byte c = 0; c < 3; ++c, ++src)
- *dst++ = *src > step? *src - step: 0;
+ for (byte i = 0; i < 0xd; ++i) {
+ for (byte c = 0; c < 3; ++c, ++src)
+ *dst++ = *src > step ? *src - step : 0;
}
}
@@ -586,7 +585,7 @@ byte Scene::findFade() const {
return 0;
const Common::Array<FadeType> &scene_fades = fades[_id - 1];
- for(uint i = 0; i < scene_fades.size(); ++i) {
+ for (uint i = 0; i < scene_fades.size(); ++i) {
const FadeType &fade = scene_fades[i];
if (fade.rect.in(position)) {
return fade.value;
@@ -599,8 +598,8 @@ bool Scene::render(bool tick_game, bool tick_mark, uint32 delta) {
Resources *res = Resources::instance();
bool busy;
bool restart;
- uint32 game_delta = tick_game? 1: 0;
- uint32 mark_delta = tick_mark? 1: 0;
+ uint32 game_delta = tick_game ? 1 : 0;
+ uint32 mark_delta = tick_mark ? 1 : 0;
do {
restart = false;
@@ -616,7 +615,7 @@ bool Scene::render(bool tick_game, bool tick_mark, uint32 delta) {
}
}
- switch(current_event.type) {
+ switch (current_event.type) {
case SceneEvent::kCredits: {
_system->fillScreen(0);
///\todo: optimize me
@@ -729,7 +728,7 @@ bool Scene::render(bool tick_game, bool tick_mark, uint32 delta) {
Surface *mark = actor_animation.currentFrame(game_delta);
int horizon = position.y;
- for(z_order_it = z_order.begin(); z_order_it != z_order.end(); ++z_order_it) {
+ for (z_order_it = z_order.begin(); z_order_it != z_order.end(); ++z_order_it) {
Surface *s = *z_order_it;
if (s->y + s->h > horizon)
break;
@@ -770,16 +769,16 @@ bool Scene::render(bool tick_game, bool tick_mark, uint32 delta) {
if (tick_mark) {
int speed_x = zoom / 32; //8 * zoom / 256
- int speed_y = (o == kActorDown || o == kActorUp? 2: 1) * zoom / 256;
+ int speed_y = (o == kActorDown || o == kActorUp ? 2 : 1) * zoom / 256;
if (speed_x == 0)
speed_x = 1;
if (speed_y == 0)
speed_y = 1;
- position.y += (ABS(dp.y) < speed_y? dp.y: SIGN(dp.y) * speed_y);
- position.x += (o == kActorDown || o == kActorUp)?
- (ABS(dp.x) < speed_y? dp.x: SIGN(dp.x) * speed_y):
- (ABS(dp.x) < speed_x? dp.x: SIGN(dp.x) * speed_x);
+ position.y += (ABS(dp.y) < speed_y ? dp.y : SIGN(dp.y) * speed_y);
+ position.x += (o == kActorDown || o == kActorUp) ?
+ (ABS(dp.x) < speed_y ? dp.x : SIGN(dp.x) * speed_y) :
+ (ABS(dp.x) < speed_x ? dp.x : SIGN(dp.x) * speed_x);
}
_idle_timer = 0;
@@ -815,11 +814,11 @@ bool Scene::render(bool tick_game, bool tick_mark, uint32 delta) {
//removed mark == null. In final scene of chapter 2 mark rendered above table.
//if it'd cause any bugs, add hack here. (_id != 23 && mark == NULL)
if (on_enabled &&
- debug_features.feature[DebugFeatures::kShowOn]) {
+ debug_features.feature[DebugFeatures::kShowOn]) {
on.render(surface, actor_animation_position);
}
- for(; z_order_it != z_order.end(); ++z_order_it) {
+ for (; z_order_it != z_order.end(); ++z_order_it) {
Surface *s = *z_order_it;
s->render(surface);
}
@@ -862,7 +861,7 @@ bool Scene::render(bool tick_game, bool tick_mark, uint32 delta) {
}
Common::Point last_p = position;
- for(Path::const_iterator p = path.begin(); p != path.end(); ++p) {
+ for (Path::const_iterator p = path.begin(); p != path.end(); ++p) {
const Common::Point dp(p->x - last_p.x, p->y - last_p.y);
if (dp.x != 0) {
surface->hLine(last_p.x, last_p.y, p->x, 0xfe);
@@ -929,7 +928,7 @@ bool Scene::processEventQueue() {
ptr[on_id] = current_event.color;
} else {
on_enabled = current_event.color != 0;
- debug(0, "%s on rendering", on_enabled? "enabling": "disabling");
+ debug(0, "%s on rendering", on_enabled ? "enabling" : "disabling");
}
loadOns();
current_event.clear();
@@ -983,85 +982,85 @@ bool Scene::processEventQueue() {
case SceneEvent::kCreditsMessage:
case SceneEvent::kMessage: {
- message = current_event.message;
- message_animation = NULL;
- if (current_event.first_frame) {
- message_timer = 0;
- message_first_frame = current_event.first_frame;
- message_last_frame = current_event.last_frame;
- if (current_event.slot > 0) {
- message_animation = custom_animation + (current_event.slot - 1);
- //else if (!animation[current_event.slot].empty())
- // message_animation = animation + current_event.slot;
- } else
- message_animation = &actor_animation;
- debug(0, "async message %d-%d (slot %u)", message_first_frame, message_last_frame, current_event.slot);
- } else {
- message_timer = current_event.timer? current_event.timer * 110: messageDuration(message);
- message_first_frame = message_last_frame = 0;
- }
- Common::Point p;
- if (current_event.dst.x == 0 && current_event.dst.y == 0) {
- p = Common::Point((actor_animation_position.left + actor_animation_position.right) / 2,
- actor_animation_position.top);
- } else {
- p = current_event.dst;
- }
+ message = current_event.message;
+ message_animation = NULL;
+ if (current_event.first_frame) {
+ message_timer = 0;
+ message_first_frame = current_event.first_frame;
+ message_last_frame = current_event.last_frame;
+ if (current_event.slot > 0) {
+ message_animation = custom_animation + (current_event.slot - 1);
+ //else if (!animation[current_event.slot].empty())
+ // message_animation = animation + current_event.slot;
+ } else
+ message_animation = &actor_animation;
+ debug(0, "async message %d-%d (slot %u)", message_first_frame, message_last_frame, current_event.slot);
+ } else {
+ message_timer = current_event.timer ? current_event.timer * 110 : messageDuration(message);
+ message_first_frame = message_last_frame = 0;
+ }
+ Common::Point p;
+ if (current_event.dst.x == 0 && current_event.dst.y == 0) {
+ p = Common::Point((actor_animation_position.left + actor_animation_position.right) / 2,
+ actor_animation_position.top);
+ } else {
+ p = current_event.dst;
+ }
- byte message_slot = current_event.slot;
- if (message_slot != 0) {
- --message_slot;
- assert(message_slot < 4);
- const Surface *s = custom_animation[message_slot].currentFrame(0);
- if (s == NULL)
- s = animation[message_slot].currentFrame(0);
- if (s != NULL) {
- p.x = s->x + s->w / 2;
- p.y = s->y;
- } else
- warning("no animation in slot %u", message_slot);
- }
- message_pos = messagePosition(message, p);
- message_color = current_event.color;
+ byte message_slot = current_event.slot;
+ if (message_slot != 0) {
+ --message_slot;
+ assert(message_slot < 4);
+ const Surface *s = custom_animation[message_slot].currentFrame(0);
+ if (s == NULL)
+ s = animation[message_slot].currentFrame(0);
+ if (s != NULL) {
+ p.x = s->x + s->w / 2;
+ p.y = s->y;
+ } else
+ warning("no animation in slot %u", message_slot);
+ }
+ message_pos = messagePosition(message, p);
+ message_color = current_event.color;
- if (message_first_frame)
- current_event.clear(); //async message, clearing event
+ if (message_first_frame)
+ current_event.clear(); //async message, clearing event
}
break;
case SceneEvent::kPlayAnimation: {
- byte slot = current_event.slot & 7; //0 - mark's
- if (current_event.animation != 0) {
- debug(0, "playing animation %u in slot %u(%02x)", current_event.animation, slot, current_event.slot);
- if (slot != 0) {
- --slot;
- assert(slot < 4);
- playAnimation(slot, current_event.animation, (current_event.slot & 0x80) != 0, (current_event.slot & 0x40) != 0, (current_event.slot & 0x20) != 0);
- } else
- actor_talking = true;
- } else {
- if (slot != 0) {
- --slot;
- debug(0, "cancelling animation in slot %u", slot);
- assert(slot < 4);
- custom_animation[slot].free();
- } else
- actor_talking = true;
- }
- current_event.clear();
+ byte slot = current_event.slot & 7; //0 - mark's
+ if (current_event.animation != 0) {
+ debug(0, "playing animation %u in slot %u(%02x)", current_event.animation, slot, current_event.slot);
+ if (slot != 0) {
+ --slot;
+ assert(slot < 4);
+ playAnimation(slot, current_event.animation, (current_event.slot & 0x80) != 0, (current_event.slot & 0x40) != 0, (current_event.slot & 0x20) != 0);
+ } else
+ actor_talking = true;
+ } else {
+ if (slot != 0) {
+ --slot;
+ debug(0, "cancelling animation in slot %u", slot);
+ assert(slot < 4);
+ custom_animation[slot].free();
+ } else
+ actor_talking = true;
+ }
+ current_event.clear();
}
break;
case SceneEvent::kPauseAnimation: {
- byte slot = current_event.slot & 7; //0 - mark's
- if (slot != 0) {
- --slot;
- debug(1, "pause animation in slot %u", slot);
- custom_animation[slot].paused = (current_event.slot & 0x80) != 0;
- } else {
- actor_talking = false;
- }
- current_event.clear();
+ byte slot = current_event.slot & 7; //0 - mark's
+ if (slot != 0) {
+ --slot;
+ debug(1, "pause animation in slot %u", slot);
+ custom_animation[slot].paused = (current_event.slot & 0x80) != 0;
+ } else {
+ actor_talking = false;
+ }
+ current_event.clear();
}
break;
@@ -1097,8 +1096,8 @@ bool Scene::processEventQueue() {
obj->enabled = current_event.color;
obj->save();
current_event.clear();
- }
- break;
+ }
+ break;
case SceneEvent::kHideActor:
hide_actor = current_event.color != 0;
@@ -1141,7 +1140,7 @@ bool Scene::processEventQueue() {
break;
case SceneEvent::kFade:
- _fade_timer = current_event.orientation != 0? 5: -5;
+ _fade_timer = current_event.orientation != 0 ? 5 : -5;
current_event.clear();
break;
@@ -1177,9 +1176,9 @@ bool Scene::processEventQueue() {
void Scene::setPalette(unsigned mul) {
//debug(0, "setPalette(%u)", mul);
- byte p[3*256];
+ byte p[3 * 256];
- for (int i = 0; i < 3*256; ++i) {
+ for (int i = 0; i < 3 * 256; ++i) {
p[i] = (unsigned)palette[i] * mul;
}
@@ -1206,7 +1205,7 @@ Object *Scene::getObject(int id, int scene_id) {
Common::Point Scene::messagePosition(const Common::String &str, Common::Point message_position) {
Resources *res = Resources::instance();
int lines = 1;
- for(uint i = 0; i < str.size(); ++i)
+ for (uint i = 0; i < str.size(); ++i)
if (str[i] == '\n')
++lines;
@@ -1247,7 +1246,7 @@ void Scene::displayMessage(const Common::String &str, byte color, const Common::
//assert(!str.empty());
//debug(0, "displayMessage: %s", str.c_str());
message = str;
- message_pos = (pos.x | pos.y)? pos: messagePosition(str, position);
+ message_pos = (pos.x | pos.y) ? pos : messagePosition(str, position);
message_color = color;
message_timer = messageDuration(message);
}
@@ -1256,7 +1255,7 @@ void Scene::clear() {
clearMessage();
events.clear();
current_event.clear();
- for(int i = 0; i < 4; ++i) {
+ for (int i = 0; i < 4; ++i) {
animation[i].free();
custom_animation[i].free();
}
diff --git a/engines/teenagent/scene.h b/engines/teenagent/scene.h
index bc101847fa..32e784bb60 100644
--- a/engines/teenagent/scene.h
+++ b/engines/teenagent/scene.h
@@ -43,30 +43,30 @@ class Dialog;
struct SceneEvent {
enum Type {
- kNone, //0
- kMessage,
- kWalk,
- kPlayAnimation,
- kPlayActorAnimation, //4
- kPauseAnimation,
- kClearAnimations,
- kLoadScene,
- kSetOn, //8
- kSetLan,
- kPlayMusic,
- kPlaySound,
- kEnableObject, //12
- kHideActor,
- kWaitForAnimation,
- kWaitLanAnimationFrame,
- kCreditsMessage, //16
- kCredits,
- kTimer,
- kEffect,
- kFade,
- kWait,
- kSetFlag,
- kQuit
+ kNone, //0
+ kMessage,
+ kWalk,
+ kPlayAnimation,
+ kPlayActorAnimation, //4
+ kPauseAnimation,
+ kClearAnimations,
+ kLoadScene,
+ kSetOn, //8
+ kSetLan,
+ kPlayMusic,
+ kPlaySound,
+ kEnableObject, //12
+ kHideActor,
+ kWaitForAnimation,
+ kWaitLanAnimationFrame,
+ kCreditsMessage, //16
+ kCredits,
+ kTimer,
+ kEffect,
+ kFade,
+ kWait,
+ kSetFlag,
+ kQuit
} type;
Common::String message;
@@ -93,8 +93,8 @@ struct SceneEvent {
byte object;
SceneEvent(Type type_) :
- type(type_), message(), color(0xd1), slot(0), animation(0), timer(0), orientation(0), dst(),
- scene(0), ons(0), lan(0), music(0), sound(0), object(0) {}
+ type(type_), message(), color(0xd1), slot(0), animation(0), timer(0), orientation(0), dst(),
+ scene(0), ons(0), lan(0), music(0), sound(0), object(0) {}
void clear() {
type = kNone;
@@ -119,8 +119,8 @@ struct SceneEvent {
void dump() const {
debug(0, "event[%d]: \"%s\"[%02x], slot: %d, animation: %u, timer: %u, dst: (%d, %d) [%u], scene: %u, ons: %u, lan: %u, object: %u, music: %u, sound: %u",
- (int)type, message.c_str(), color, slot, animation, timer, dst.x, dst.y, orientation, scene, ons, lan, object, music, sound
- );
+ (int)type, message.c_str(), color, slot, animation, timer, dst.x, dst.y, orientation, scene, ons, lan, object, music, sound
+ );
}
};
@@ -144,7 +144,7 @@ public:
void setOrientation(uint8 o) { orientation = o; }
void push(const SceneEvent &event);
byte peekFlagEvent(uint16 addr) const;
- SceneEvent::Type last_event_type() const { return !events.empty()? events.back().type: SceneEvent::kNone; }
+ SceneEvent::Type last_event_type() const { return !events.empty() ? events.back().type : SceneEvent::kNone; }
bool processEvent(const Common::Event &event);
@@ -160,9 +160,9 @@ public:
Object *findObject(const Common::Point &point);
void loadObjectData();
- Animation * getAnimation(byte slot);
- inline Animation * getActorAnimation() { return &actor_animation; }
- inline const Common::String& getMessage() const { return message; }
+ Animation *getAnimation(byte slot);
+ inline Animation *getActorAnimation() { return &actor_animation; }
+ inline const Common::String &getMessage() const { return message; }
void setPalette(unsigned mul);
int lookupZoom(uint y) const;
@@ -219,7 +219,7 @@ private:
uint message_timer;
byte message_first_frame;
byte message_last_frame;
- Animation * message_animation;
+ Animation *message_animation;
typedef Common::List<SceneEvent> EventList;
EventList events;
@@ -240,17 +240,17 @@ private:
struct DebugFeatures {
enum {
- kShowBack,
- kShowLan,
- kShowOns,
- kShowOn,
- kHidePath,
- kMax
+ kShowBack,
+ kShowLan,
+ kShowOns,
+ kShowOn,
+ kHidePath,
+ kMax
};
bool feature[kMax];
DebugFeatures() {
- for(uint i = 0; i < kMax; ++i) {
+ for (uint i = 0; i < kMax; ++i) {
feature[i] = true;
}
}
diff --git a/engines/teenagent/surface.cpp b/engines/teenagent/surface.cpp
index 2e23c7a8ed..63312990ee 100644
--- a/engines/teenagent/surface.cpp
+++ b/engines/teenagent/surface.cpp
@@ -33,26 +33,26 @@ Surface::~Surface() {
free();
}
-void Surface::load(Common::SeekableReadStream *stream, Type type) {
+void Surface::load(Common::SeekableReadStream &stream, Type type) {
//debug(0, "load()");
free();
x = y = 0;
- uint16 w_ = stream->readUint16LE();
- uint16 h_ = stream->readUint16LE();
+ uint16 w_ = stream.readUint16LE();
+ uint16 h_ = stream.readUint16LE();
if (type != kTypeLan) {
- uint16 pos = stream->readUint16LE();
+ uint16 pos = stream.readUint16LE();
x = pos % 320;
y = pos / 320;
}
//debug(0, "declared info: %ux%u (%04xx%04x) -> %u,%u", w_, h_, w_, h_, x, y);
- if (stream->eos() || w_ == 0)
+ if (stream.eos() || w_ == 0)
return;
- if (w_ * h_ > stream->size()) {
+ if (w_ * h_ > stream.size()) {
debug(0, "invalid surface %ux%u -> %u,%u", w_, h_, x, y);
return;
}
@@ -60,7 +60,7 @@ void Surface::load(Common::SeekableReadStream *stream, Type type) {
//debug(0, "creating surface %ux%u -> %u,%u", w_, h_, x, y);
create(w_, h_, Graphics::PixelFormat::createFormatCLUT8());
- stream->read(pixels, w_ * h_);
+ stream.read(pixels, w_ * h_);
}
Common::Rect Surface::render(Graphics::Surface *surface, int dx, int dy, bool mirror, Common::Rect src_rect, uint zoom) const {
@@ -94,7 +94,7 @@ Common::Rect Surface::render(Graphics::Surface *surface, int dx, int dy, bool mi
for (int i = src_rect.top; i < src_rect.bottom; ++i) {
byte *dst = dst_base;
for (int j = src_rect.left; j < src_rect.right; ++j) {
- byte p = src[(mirror? w - j - 1: j)];
+ byte p = src[(mirror ? w - j - 1 : j)];
if (p != 0xff)
*dst++ = p;
else
@@ -105,10 +105,10 @@ Common::Rect Surface::render(Graphics::Surface *surface, int dx, int dy, bool mi
}
} else {
byte *dst = (byte *)surface->getBasePtr(dst_rect.left, dst_rect.top);
- for(int i = 0; i < dst_rect.height(); ++i) {
+ for (int i = 0; i < dst_rect.height(); ++i) {
for (int j = 0; j < dst_rect.width(); ++j) {
int px = j * 256 / zoom;
- const byte *src = (const byte *)getBasePtr(src_rect.left + (mirror? w - px - 1: px), src_rect.top + i * 256 / zoom);
+ const byte *src = (const byte *)getBasePtr(src_rect.left + (mirror ? w - px - 1 : px), src_rect.top + i * 256 / zoom);
byte p = *src;
if (p != 0xff)
dst[j] = p;
diff --git a/engines/teenagent/surface.h b/engines/teenagent/surface.h
index 5f74176c68..1771b2d683 100644
--- a/engines/teenagent/surface.h
+++ b/engines/teenagent/surface.h
@@ -26,7 +26,7 @@
#include "graphics/surface.h"
namespace Common {
- class SeekableReadStream;
+class SeekableReadStream;
}
namespace TeenAgent {
@@ -40,7 +40,7 @@ public:
Surface();
~Surface();
- void load(Common::SeekableReadStream *stream, Type type);
+ void load(Common::SeekableReadStream &, Type type);
Common::Rect render(Graphics::Surface *surface, int dx = 0, int dy = 0, bool mirror = false, Common::Rect src_rect = Common::Rect(), uint zoom = 256) const;
bool empty() const { return pixels == NULL; }
diff --git a/engines/teenagent/surface_list.cpp b/engines/teenagent/surface_list.cpp
index e98153a935..31387ac3cb 100644
--- a/engines/teenagent/surface_list.cpp
+++ b/engines/teenagent/surface_list.cpp
@@ -31,11 +31,11 @@ SurfaceList::~SurfaceList() {
free();
}
-void SurfaceList::load(Common::SeekableReadStream *stream, Type type, int sub_hack) {
+void SurfaceList::load(Common::SeekableReadStream &stream, Type type, int sub_hack) {
free();
- byte fn = stream->readByte();
- if (stream->eos())
+ byte fn = stream.readByte();
+ if (stream.eos())
return;
surfaces_n = fn - sub_hack;
@@ -47,11 +47,11 @@ void SurfaceList::load(Common::SeekableReadStream *stream, Type type, int sub_ha
surfaces = new Surface[surfaces_n];
for (byte i = 0; i < surfaces_n; ++i) {
- uint offset = stream->readUint16LE();
- uint pos = stream->pos();
- stream->seek(offset);
+ uint offset = stream.readUint16LE();
+ uint pos = stream.pos();
+ stream.seek(offset);
surfaces[i].load(stream, Surface::kTypeOns);
- stream->seek(pos);
+ stream.seek(pos);
}
}
@@ -61,8 +61,8 @@ void SurfaceList::free() {
surfaces_n = 0;
}
-void SurfaceList::render(Graphics::Surface *surface, const Common::Rect & clip) const {
- for(uint i = 0; i < surfaces_n; ++i) {
+void SurfaceList::render(Graphics::Surface *surface, const Common::Rect &clip) const {
+ for (uint i = 0; i < surfaces_n; ++i) {
const Surface &s = surfaces[i];
Common::Rect r(s.x, s.y, s.x + s.w, s.y + s.h);
if (r.bottom < clip.bottom || !clip.intersects(r))
diff --git a/engines/teenagent/surface_list.h b/engines/teenagent/surface_list.h
index d949a722d6..2d7be0d52b 100644
--- a/engines/teenagent/surface_list.h
+++ b/engines/teenagent/surface_list.h
@@ -33,16 +33,15 @@ public:
SurfaceList();
~SurfaceList();
- void load(Common::SeekableReadStream *stream, Type type, int sub_hack = 0);
+ void load(Common::SeekableReadStream &, Type type, int sub_hack = 0);
void free();
- void render(Graphics::Surface *surface, const Common::Rect & clip) const;
+ void render(Graphics::Surface *surface, const Common::Rect &clip) const;
protected:
- Surface * surfaces;
+ Surface *surfaces;
uint surfaces_n;
};
}
#endif
-
diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp
index 724f75be2f..fb228ef2fc 100644
--- a/engines/teenagent/teenagent.cpp
+++ b/engines/teenagent/teenagent.cpp
@@ -49,7 +49,7 @@ namespace TeenAgent {
TeenAgentEngine::TeenAgentEngine(OSystem *system, const ADGameDescription *gd)
: Engine(system), action(kActionNone), _gameDescription(gd),
- _rnd("teenagent") {
+ _rnd("teenagent") {
music = new MusicPlayer();
console = 0;
@@ -70,10 +70,8 @@ bool TeenAgentEngine::trySelectedObject() {
debug(0, "checking active object %u on %u", inv->id, dst_object->id);
//mouse time challenge hack:
- if (
- (res->dseg.get_byte(0) == 1 && inv->id == 49 && dst_object->id == 5) ||
- (res->dseg.get_byte(0) == 2 && inv->id == 29 && dst_object->id == 5)
- ) {
+ if ((res->dseg.get_byte(0) == 1 && inv->id == 49 && dst_object->id == 5) ||
+ (res->dseg.get_byte(0) == 2 && inv->id == 29 && dst_object->id == 5)) {
//putting rock into hole or superglue on rock
processCallback(0x8d57);
return true;
@@ -176,12 +174,12 @@ void TeenAgentEngine::init() {
_mark_delay = 80;
_game_delay = 110;
- Resources * res = Resources::instance();
+ Resources *res = Resources::instance();
use_hotspots.resize(42);
byte *scene_hotspots = res->dseg.ptr(0xbb87);
for (byte i = 0; i < 42; ++i) {
Common::Array<UseHotspot> & hotspots = use_hotspots[i];
- byte * hotspots_ptr = res->dseg.ptr(READ_LE_UINT16(scene_hotspots + i * 2));
+ byte *hotspots_ptr = res->dseg.ptr(READ_LE_UINT16(scene_hotspots + i * 2));
while (*hotspots_ptr) {
UseHotspot h;
h.load(hotspots_ptr);
@@ -206,8 +204,7 @@ void TeenAgentEngine::deinit() {
Common::Error TeenAgentEngine::loadGameState(int slot) {
debug(0, "loading from slot %d", slot);
- Common::ScopedPtr<Common::InSaveFile>
- in(_saveFileMan->openForLoading(Common::String::format("teenagent.%02d", slot)));
+ Common::ScopedPtr<Common::InSaveFile> in(_saveFileMan->openForLoading(Common::String::format("teenagent.%02d", slot)));
if (!in)
in.reset(_saveFileMan->openForLoading(Common::String::format("teenagent.%d", slot)));
@@ -216,14 +213,22 @@ Common::Error TeenAgentEngine::loadGameState(int slot) {
Resources *res = Resources::instance();
- assert(res->dseg.size() >= 0x6478 + 0x777a);
- char data[0x777a];
+ const uint dataSize = 0x777a;
+ assert(res->dseg.size() >= 0x6478 + dataSize);
+
+ char *data = (char *)malloc(dataSize);
+ if (!data)
+ error("[TeenAgentEngine::loadGameState] Cannot allocate buffer");
+
in->seek(0);
- if (in->read(data, 0x777a) != 0x777a) {
+ if (in->read(data, dataSize) != dataSize) {
+ free(data);
return Common::kReadingFailed;
}
- memcpy(res->dseg.ptr(0x6478), data, sizeof(data));
+ memcpy(res->dseg.ptr(0x6478), data, dataSize);
+
+ free(data);
scene->clear();
inventory->activate(false);
@@ -267,7 +272,7 @@ int TeenAgentEngine::skipEvents() const {
Common::EventManager *_event = _system->getEventManager();
Common::Event event;
while (_event->pollEvent(event)) {
- switch(event.type) {
+ switch (event.type) {
case Common::EVENT_QUIT:
case Common::EVENT_RTL:
return -1;
@@ -276,8 +281,8 @@ int TeenAgentEngine::skipEvents() const {
case Common::EVENT_RBUTTONDOWN:
return 1;
case Common::EVENT_KEYDOWN:
- if (event.kbd.ascii)
- return 1;
+ if (event.kbd.ascii)
+ return 1;
default:
break;
}
@@ -290,21 +295,36 @@ bool TeenAgentEngine::showCDLogo() {
if (!cdlogo.exists("cdlogo.res") || !cdlogo.open("cdlogo.res"))
return true;
- byte bg[0xfa00];
- byte palette[3*256];
+ const uint bgSize = 0xfa00;
+ const uint paletteSize = 3 * 256;
+
+ byte *bg = (byte *)malloc(bgSize);
+ if (!bg)
+ error("[TeenAgentEngine::showCDLogo] Cannot allocate background buffer");
+
+ byte *palette = (byte *)malloc(paletteSize);
+ if (!palette) {
+ free(bg);
+ error("[TeenAgentEngine::showCDLogo] Cannot allocate palette buffer");
+ }
- cdlogo.read(bg, sizeof(bg));
- cdlogo.read(palette, sizeof(palette));
- for (uint c = 0; c < 3*256; ++c)
+ cdlogo.read(bg, bgSize);
+ cdlogo.read(palette, paletteSize);
+
+ for (uint c = 0; c < paletteSize; ++c)
palette[c] *= 4;
+
_system->getPaletteManager()->setPalette(palette, 0, 0x100);
_system->copyRectToScreen(bg, 320, 0, 0, 320, 200);
_system->updateScreen();
- for(uint i = 0; i < 20; ++i) {
+ free(bg);
+ free(palette);
+
+ for (uint i = 0; i < 20; ++i) {
int r = skipEvents();
if (r != 0)
- return r > 0? true: false;
+ return r > 0 ? true : false;
_system->delayMillis(100);
}
cdlogo.close();
@@ -317,43 +337,66 @@ bool TeenAgentEngine::showLogo() {
if (!logo.open("unlogic.res"))
return true;
- byte bg[0xfa00];
- byte palette[3*256];
-
Common::ScopedPtr<Common::SeekableReadStream> frame(logo.getStream(1));
if (!frame)
return true;
- frame->read(bg, sizeof(bg));
- frame->read(palette, sizeof(palette));
- for (uint c = 0; c < 3*256; ++c)
+ const uint bgSize = 0xfa00;
+ const uint paletteSize = 3 * 256;
+
+ byte *bg = (byte *)malloc(bgSize);
+ if (!bg)
+ error("[TeenAgentEngine::showLogo] Cannot allocate background buffer");
+
+ byte *palette = (byte *)malloc(paletteSize);
+ if (!palette) {
+ free(bg);
+ error("[TeenAgentEngine::showLogo] Cannot allocate palette buffer");
+ }
+
+ frame->read(bg, bgSize);
+ frame->read(palette, paletteSize);
+
+ for (uint c = 0; c < paletteSize; ++c)
palette[c] *= 4;
+
_system->getPaletteManager()->setPalette(palette, 0, 0x100);
+ free(palette);
+
uint n = logo.fileCount();
- for(uint f = 0; f < 4; ++f)
- for(uint i = 2; i <= n; ++i) {
+ for (uint f = 0; f < 4; ++f)
+ for (uint i = 2; i <= n; ++i) {
{
int r = skipEvents();
- if (r != 0)
- return r > 0? true: false;
+ if (r != 0) {
+ free(bg);
+ return r > 0 ? true : false;
+ }
}
_system->copyRectToScreen(bg, 320, 0, 0, 320, 200);
frame.reset(logo.getStream(i));
- if (!frame)
+ if (!frame) {
+ free(bg);
return true;
+ }
Surface s;
- s.load(frame, Surface::kTypeOns);
- if (s.empty())
+ s.load(*frame, Surface::kTypeOns);
+ if (s.empty()) {
+ free(bg);
return true;
+ }
_system->copyRectToScreen((const byte *)s.pixels, s.w, s.x, s.y, s.w, s.h);
_system->updateScreen();
_system->delayMillis(100);
}
+
+ free(bg);
+
return true;
}
@@ -364,29 +407,53 @@ bool TeenAgentEngine::showMetropolis() {
FilePack varia;
varia.open("varia.res");
- byte palette[3*256];
+ const uint paletteSize = 3 * 256;
+ byte *palette = (byte *)malloc(paletteSize);
+ if (!palette)
+ error("[TeenAgentEngine::showMetropolis] Cannot allocate palette buffer");
+
{
Common::ScopedPtr<Common::SeekableReadStream> s(varia.getStream(5));
- s->read(palette, sizeof(palette));
- for (uint c = 0; c < 3*256; ++c)
+ s->read(palette, paletteSize);
+ for (uint c = 0; c < paletteSize; ++c)
palette[c] *= 4;
}
_system->getPaletteManager()->setPalette(palette, 0, 0x100);
- byte varia_6[21760], varia_9[18302];
- varia.read(6, varia_6, sizeof(varia_6));
- varia.read(9, varia_9, sizeof(varia_9));
+ free(palette);
- byte colors[56 * 160 * 2];
- memset(colors, 0, sizeof(colors));
+ const uint varia6Size = 21760;
+ const uint varia9Size = 18302;
+ byte *varia_6 = (byte *)malloc(varia6Size);
+ byte *varia_9 = (byte *)malloc(varia9Size);
+ if (!varia_6 || !varia_9) {
+ free(varia_6);
+ free(varia_9);
+
+ error("[TeenAgentEngine::showMetropolis] Cannot allocate buffer");
+ }
+
+ varia.read(6, varia_6, varia6Size);
+ varia.read(9, varia_9, varia9Size);
+
+ const uint colorsSize = 56 * 160 * 2;
+ byte *colors = (byte *)malloc(colorsSize);
+ if (!colors)
+ error("[TeenAgentEngine::showMetropolis] Cannot allocate colors buffer");
+
+ memset(colors, 0, colorsSize);
int logo_y = -56;
- for(uint f = 0; f < 300; ++f) {
+ for (uint f = 0; f < 300; ++f) {
{
int r = skipEvents();
- if (r != 0)
- return r > 0? true: false;
+ if (r != 0) {
+ free(varia_6);
+ free(varia_9);
+ free(colors);
+ return r > 0 ? true : false;
+ }
}
Graphics::Surface *surface = _system->lockScreen();
@@ -397,19 +464,19 @@ bool TeenAgentEngine::showMetropolis() {
{
//generate colors matrix
memmove(colors + 320, colors + 480, 8480);
- for(uint c = 0; c < 17; ++c) {
+ for (uint c = 0; c < 17; ++c) {
byte x = (_rnd.getRandomNumber(184) + 5) & 0xff;
uint offset = 8800 + _rnd.getRandomNumber(158);
colors[offset++] = x;
colors[offset++] = x;
}
- for(uint y = 1; y < 56; ++y) {
- for(uint x = 1; x < 160; ++x) {
+ for (uint y = 1; y < 56; ++y) {
+ for (uint x = 1; x < 160; ++x) {
uint offset = y * 160 + x;
uint v =
- (uint)colors[offset - 161] + colors[offset - 160] + colors[offset - 159] +
- (uint)colors[offset - 1] + colors[offset + 1] +
- (uint)colors[offset + 161] + colors[offset + 160] + colors[offset + 159];
+ (uint)colors[offset - 161] + colors[offset - 160] + colors[offset - 159] +
+ (uint)colors[offset - 1] + colors[offset + 1] +
+ (uint)colors[offset + 161] + colors[offset + 160] + colors[offset + 159];
v >>= 3;
colors[offset + 8960] = v;
}
@@ -419,8 +486,8 @@ bool TeenAgentEngine::showMetropolis() {
byte *dst = (byte *)surface->getBasePtr(0, 131);
byte *src = varia_6;
- for(uint y = 0; y < 68; ++y) {
- for(uint x = 0; x < 320; ++x) {
+ for (uint y = 0; y < 68; ++y) {
+ for (uint x = 0; x < 320; ++x) {
if (*src++ == 1) {
*dst++ = colors[19 * 160 + y / 2 * 160 + x / 2];
} else
@@ -430,9 +497,9 @@ bool TeenAgentEngine::showMetropolis() {
_system->unlockScreen();
_system->copyRectToScreen(
- varia_9 + (logo_y < 0? -logo_y * 320: 0), 320,
- 0, logo_y >= 0? logo_y: 0,
- 320, logo_y >= 0? 57: 57 + logo_y);
+ varia_9 + (logo_y < 0 ? -logo_y * 320 : 0), 320,
+ 0, logo_y >= 0 ? logo_y : 0,
+ 320, logo_y >= 0 ? 57 : 57 + logo_y);
if (logo_y < 82 - 57)
++logo_y;
@@ -441,6 +508,11 @@ bool TeenAgentEngine::showMetropolis() {
_system->updateScreen();
_system->delayMillis(100);
}
+
+ free(varia_6);
+ free(varia_9);
+ free(colors);
+
return true;
}
@@ -507,12 +579,12 @@ Common::Error TeenAgentEngine::run() {
switch (event.type) {
case Common::EVENT_KEYDOWN:
if ((event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_d) ||
- event.kbd.ascii == '~' || event.kbd.ascii == '#') {
+ event.kbd.ascii == '~' || event.kbd.ascii == '#') {
console->attach();
} else if (event.kbd.hasFlags(0) && event.kbd.keycode == Common::KEYCODE_F5) {
openMainMenuDialog();
} if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_f) {
- _mark_delay = _mark_delay == 80? 40: 80;
+ _mark_delay = _mark_delay == 80 ? 40 : 80;
debug(0, "mark_delay = %u", _mark_delay);
}
break;
@@ -604,7 +676,7 @@ Common::Error TeenAgentEngine::run() {
}
}
- inventory->render(surface, tick_game? 1: 0);
+ inventory->render(surface, tick_game ? 1 : 0);
_system->unlockScreen();
@@ -614,7 +686,7 @@ Common::Error TeenAgentEngine::run() {
uint32 next_tick = MIN(game_timer, mark_timer);
if (next_tick > 0) {
- _system->delayMillis(next_tick > 40? 40: next_tick);
+ _system->delayMillis(next_tick > 40 ? 40 : next_tick);
}
} while (!shouldQuit());
@@ -726,7 +798,7 @@ void TeenAgentEngine::displayCredits() {
event.dst.y = 200;
int lines = 1;
- for(uint i = 0; i < event.message.size(); ++i)
+ for (uint i = 0; i < event.message.size(); ++i)
if (event.message[i] == '\n')
++lines;
event.dst.x = (320 - Resources::instance()->font7.render(NULL, 0, 0, event.message, 0xd1)) / 2;
@@ -779,7 +851,7 @@ void TeenAgentEngine::moveRel(int16 x, int16 y, byte o, bool warp) {
void TeenAgentEngine::playAnimation(uint16 id, byte slot, bool async, bool ignore, bool loop) {
SceneEvent event(SceneEvent::kPlayAnimation);
event.animation = id;
- event.slot = (slot + 1) | (ignore? 0x20: 0) | (loop? 0x80: 0);
+ event.slot = (slot + 1) | (ignore ? 0x20 : 0) | (loop ? 0x80 : 0);
scene->push(event);
if (!async)
waitAnimation();
@@ -788,7 +860,7 @@ void TeenAgentEngine::playAnimation(uint16 id, byte slot, bool async, bool ignor
void TeenAgentEngine::playActorAnimation(uint16 id, bool async, bool ignore) {
SceneEvent event(SceneEvent::kPlayActorAnimation);
event.animation = id;
- event.slot = ignore? 0x20: 0;
+ event.slot = ignore ? 0x20 : 0;
scene->push(event);
if (!async)
waitAnimation();
@@ -815,7 +887,7 @@ void TeenAgentEngine::loadScene(byte id, uint16 x, uint16 y, byte o) {
void TeenAgentEngine::enableOn(bool enable) {
SceneEvent event(SceneEvent::kSetOn);
event.ons = 0;
- event.color = enable? 1: 0;
+ event.color = enable ? 1 : 0;
scene->push(event);
}
diff --git a/engines/teenagent/teenagent.h b/engines/teenagent/teenagent.h
index a054f72d25..737f07ba85 100644
--- a/engines/teenagent/teenagent.h
+++ b/engines/teenagent/teenagent.h
@@ -122,7 +122,7 @@ public:
Scene *scene;
Inventory *inventory;
MusicPlayer *music;
- Console * console;
+ Console *console;
void setMusic(byte id);
diff --git a/engines/testbed/config-params.cpp b/engines/testbed/config-params.cpp
index 9a5062185b..d7ead48f63 100644
--- a/engines/testbed/config-params.cpp
+++ b/engines/testbed/config-params.cpp
@@ -24,7 +24,9 @@
#include "testbed/config-params.h"
+namespace Common {
DECLARE_SINGLETON(Testbed::ConfigParams);
+}
namespace Testbed {
diff --git a/engines/testbed/detection.cpp b/engines/testbed/detection.cpp
index b869bb8ebb..356d75f7ea 100644
--- a/engines/testbed/detection.cpp
+++ b/engines/testbed/detection.cpp
@@ -40,7 +40,7 @@ static const ADGameDescription testbedDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER
};
diff --git a/engines/testbed/misc.cpp b/engines/testbed/misc.cpp
index 034d3eb27e..aee3ccd294 100644
--- a/engines/testbed/misc.cpp
+++ b/engines/testbed/misc.cpp
@@ -110,7 +110,7 @@ TestExitStatus MiscTests::testDateTime() {
TestExitStatus MiscTests::testTimers() {
int valToModify = 0;
- if (g_system->getTimerManager()->installTimerProc(timerCallback, 100000, &valToModify)) {
+ if (g_system->getTimerManager()->installTimerProc(timerCallback, 100000, &valToModify, "testbedTimer")) {
g_system->delayMillis(150);
g_system->getTimerManager()->removeTimerProc(timerCallback);
@@ -133,7 +133,7 @@ TestExitStatus MiscTests::testMutexes() {
SharedVars sv = {1, 1, true, g_system->createMutex()};
- if (g_system->getTimerManager()->installTimerProc(criticalSection, 100000, &sv)) {
+ if (g_system->getTimerManager()->installTimerProc(criticalSection, 100000, &sv, "testbedMutex")) {
g_system->delayMillis(150);
}
diff --git a/engines/tinsel/actors.cpp b/engines/tinsel/actors.cpp
index 4e9847f8b4..acacd89667 100644
--- a/engines/tinsel/actors.cpp
+++ b/engines/tinsel/actors.cpp
@@ -314,10 +314,19 @@ static void ActorRestoredProcess(CORO_PARAM, const void *param) {
// get the stuff copied to process when it was created
const RATP_INIT *r = (const RATP_INIT *)param;
+ bool isSavegame = r->pic->resumeState == RES_SAVEGAME;
CORO_BEGIN_CODE(_ctx);
_ctx->pic = RestoreInterpretContext(r->pic);
+
+ // The newly added check here specially sets the process to RES_NOT when loading a savegame.
+ // This is needed particularly for the Psychiatrist scene in Discworld 1 - otherwise Rincewind
+ // can't go upstairs without leaving the building and returning. If this patch causes problems
+ // in other scenes, an added check for the hCode == 1174490602 could be added.
+ if (isSavegame && TinselV1)
+ _ctx->pic->resumeState = RES_NOT;
+
CORO_INVOKE_1(Interpret, _ctx->pic);
// If it gets here, actor's code has run to completion
@@ -326,8 +335,10 @@ static void ActorRestoredProcess(CORO_PARAM, const void *param) {
CORO_END_CODE;
}
-void RestoreActorProcess(int id, INT_CONTEXT *pic) {
+void RestoreActorProcess(int id, INT_CONTEXT *pic, bool savegameFlag) {
RATP_INIT r = { pic, id };
+ if (savegameFlag)
+ pic->resumeState = RES_SAVEGAME;
g_scheduler->createProcess(PID_TCODE, ActorRestoredProcess, &r, sizeof(r));
}
diff --git a/engines/tinsel/actors.h b/engines/tinsel/actors.h
index e707db77ba..6ebe32505a 100644
--- a/engines/tinsel/actors.h
+++ b/engines/tinsel/actors.h
@@ -156,7 +156,7 @@ struct Z_POSITIONS {
int z;
};
-void RestoreActorProcess(int id, INT_CONTEXT *pic);
+void RestoreActorProcess(int id, INT_CONTEXT *pic, bool savegameFlag);
int SaveActors(PSAVED_ACTOR sActorInfo);
void RestoreActors(int numActors, PSAVED_ACTOR sActorInfo);
diff --git a/engines/tinsel/adpcm.cpp b/engines/tinsel/adpcm.cpp
index 4ea835586b..ca3150ca3d 100644
--- a/engines/tinsel/adpcm.cpp
+++ b/engines/tinsel/adpcm.cpp
@@ -61,7 +61,7 @@ void Tinsel_ADPCMStream::readBufferTinselHeader() {
int16 Tinsel_ADPCMStream::decodeTinsel(int16 code, double eVal) {
double sample;
- sample = (double) code;
+ sample = (double)code;
sample *= eVal * _status.predictor;
sample += (_status.d0 * _status.K0) + (_status.d1 * _status.K1);
diff --git a/engines/tinsel/config.cpp b/engines/tinsel/config.cpp
index fd278db972..050573028a 100644
--- a/engines/tinsel/config.cpp
+++ b/engines/tinsel/config.cpp
@@ -76,6 +76,9 @@ void Config::writeToDisk() {
case TXT_ITALIAN:
lang = Common::IT_ITA;
break;
+ case TXT_US:
+ lang = Common::EN_USA;
+ break;
default:
lang = Common::EN_ANY;
}
@@ -132,6 +135,9 @@ void Config::readFromDisk() {
case Common::IT_ITA:
_language = TXT_ITALIAN;
break;
+ case Common::EN_USA:
+ _language = TXT_US;
+ break;
default:
_language = TXT_ENGLISH;
}
diff --git a/engines/tinsel/coroutine.cpp b/engines/tinsel/coroutine.cpp
index 998d98b52a..ef0097f043 100644
--- a/engines/tinsel/coroutine.cpp
+++ b/engines/tinsel/coroutine.cpp
@@ -80,4 +80,3 @@ CoroBaseContext::~CoroBaseContext() {
}
} // End of namespace Tinsel
-
diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp
index 9c52305a1c..1fce032633 100644
--- a/engines/tinsel/detection.cpp
+++ b/engines/tinsel/detection.cpp
@@ -322,9 +322,21 @@ int TinselMetaEngine::getMaximumSaveSlot() const { return 99; }
void TinselMetaEngine::removeSaveState(const char *target, int slot) const {
Tinsel::setNeedLoad();
- Tinsel::getList(g_system->getSavefileManager(), target);
+ // Same issue here as with loadGameState(): we need the physical savegame
+ // slot. Refer to bug #3387551.
+ int listSlot = -1;
+ const int numStates = Tinsel::getList(g_system->getSavefileManager(), target);
+ for (int i = 0; i < numStates; ++i) {
+ const char *fileName = Tinsel::ListEntry(i, Tinsel::LE_NAME);
+ const int saveSlot = atoi(fileName + strlen(fileName) - 3);
+
+ if (saveSlot == slot) {
+ listSlot = i;
+ break;
+ }
+ }
- g_system->getSavefileManager()->removeSavefile(Tinsel::ListEntry(slot, Tinsel::LE_NAME));
+ g_system->getSavefileManager()->removeSavefile(Tinsel::ListEntry(listSlot, Tinsel::LE_NAME));
Tinsel::setNeedLoad();
Tinsel::getList(g_system->getSavefileManager(), target);
}
diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h
index 116322aa89..64a0af8404 100644
--- a/engines/tinsel/detection_tables.h
+++ b/engines/tinsel/detection_tables.h
@@ -22,11 +22,6 @@
namespace Tinsel {
-using Common::GUIO_NONE;
-using Common::GUIO_NOSPEECH;
-using Common::GUIO_NOSFX;
-using Common::GUIO_NOMUSIC;
-
static const TinselGameDescription gameDescriptions[] = {
// Note: The following is the (hopefully) definitive list of version details:
@@ -48,7 +43,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NOSPEECH | GUIO_NOSFX | GUIO_NOMUSIC
+ GUIO3(GUIO_NOSPEECH, GUIO_NOSFX, GUIO_NOMUSIC)
},
GID_DW1,
0,
@@ -67,7 +62,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -87,7 +82,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformMacintosh,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -111,7 +106,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_DW1,
0,
@@ -134,7 +129,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_DW1,
0,
@@ -157,7 +152,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_DW1,
0,
@@ -180,7 +175,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_DROPLANGUAGE,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_DW1,
0,
@@ -196,7 +191,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NOSPEECH
+ GUIO1(GUIO_NOSPEECH)
},
GID_DW1,
0,
@@ -214,8 +209,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -236,8 +231,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::IT_ITA,
Common::kPlatformPC,
- ADGF_DROPLANGUAGE,
- GUIO_NONE
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -261,8 +256,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::FR_FRA,
Common::kPlatformPC,
- ADGF_DROPLANGUAGE,
- GUIO_NONE
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -285,8 +280,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformPC,
- ADGF_DROPLANGUAGE,
- GUIO_NONE
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -308,8 +303,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::IT_ITA,
Common::kPlatformPC,
- ADGF_DROPLANGUAGE,
- GUIO_NONE
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -331,8 +326,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::ES_ESP,
Common::kPlatformPC,
- ADGF_DROPLANGUAGE,
- GUIO_NONE
+ ADGF_DROPLANGUAGE | ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -351,8 +346,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -371,8 +366,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::HE_ISR,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -390,8 +385,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPSX,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -414,7 +409,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPSX,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -434,8 +429,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -456,8 +451,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformMacintosh,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -475,8 +470,8 @@ static const TinselGameDescription gameDescriptions[] = {
AD_ENTRY1s("dw.scn", "6182c7986eaec893c62fb6ea13a9f225", 774556),
Common::DE_DEU,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -496,8 +491,8 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::RU_RUS,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NONE
+ ADGF_CD,
+ GUIO1(GUIO_NONE)
},
GID_DW1,
0,
@@ -517,7 +512,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
@@ -537,7 +532,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_GRB,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
@@ -557,7 +552,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::EN_USA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
@@ -577,7 +572,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
@@ -597,7 +592,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
@@ -618,7 +613,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
@@ -638,7 +633,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
@@ -659,7 +654,7 @@ static const TinselGameDescription gameDescriptions[] = {
Common::RU_RUS,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
GID_DW2,
0,
diff --git a/engines/tinsel/pcode.h b/engines/tinsel/pcode.h
index 971a42d7bd..5d16dae432 100644
--- a/engines/tinsel/pcode.h
+++ b/engines/tinsel/pcode.h
@@ -37,7 +37,7 @@ namespace Tinsel {
struct INV_OBJECT;
enum RESUME_STATE {
- RES_NOT, RES_1, RES_2
+ RES_NOT, RES_1, RES_2, RES_SAVEGAME
};
enum {
diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp
index 7a973ba4be..a0801d8247 100644
--- a/engines/tinsel/saveload.cpp
+++ b/engines/tinsel/saveload.cpp
@@ -84,6 +84,8 @@ extern void syncPolyInfo(Common::Serializer &s);
extern int sceneCtr;
+extern bool ASceneIsSaved;
+
//----------------- LOCAL DEFINES --------------------
struct SaveGameHeader {
@@ -154,8 +156,15 @@ static bool syncSaveGameHeader(Common::Serializer &s, SaveGameHeader &hdr) {
syncTime(s, hdr.dateTime);
int tmp = hdr.size - s.bytesSynced();
+
+ // NOTE: We can't use SAVEGAME_ID here when attempting to remove a saved game from the launcher,
+ // as there is no TinselEngine initialized then. This means that we can't check if this is a DW1
+ // or DW2 savegame in this case, but it doesn't really matter, as the saved game is about to be
+ // deleted anyway. Refer to bug #3387551.
+ bool correctID = _vm ? (hdr.id == SAVEGAME_ID) : (hdr.id == DW1_SAVEGAME_ID || hdr.id == DW2_SAVEGAME_ID);
+
// Perform sanity check
- if (tmp < 0 || hdr.id != SAVEGAME_ID || hdr.ver > CURRENT_VER || hdr.size > 1024)
+ if (tmp < 0 || !correctID || hdr.ver > CURRENT_VER || hdr.size > 1024)
return false;
// Skip over any extra bytes
s.skip(tmp);
@@ -431,6 +440,11 @@ static void DoSync(Common::Serializer &s) {
SAVED_DATA *sdPtr = SaveSceneSsData;
for (int i = 0; i < *SaveSceneSsCount; ++i, ++sdPtr)
syncSavedData(s, *sdPtr);
+
+ // Flag that there is a saved scene to return to. Note that in this context 'saved scene'
+ // is a stored scene to return to from another scene, such as from the Summoning Book close-up
+ // in Discworld 1 to whatever scene Rincewind was in prior to that
+ ASceneIsSaved = true;
}
if (!TinselV2)
diff --git a/engines/tinsel/savescn.cpp b/engines/tinsel/savescn.cpp
index 89d68a611e..39a8033d45 100644
--- a/engines/tinsel/savescn.cpp
+++ b/engines/tinsel/savescn.cpp
@@ -83,7 +83,7 @@ extern SRSTATE SRstate;
// FIXME: Avoid non-const global vars
-static bool ASceneIsSaved = false;
+bool ASceneIsSaved = false;
static int savedSceneCount = 0;
@@ -281,7 +281,7 @@ void ResumeInterprets() {
if (TinselV2)
RestoreProcess(&rsd->SavedICInfo[i]);
else
- RestoreActorProcess(rsd->SavedICInfo[i].idActor, &rsd->SavedICInfo[i]);
+ RestoreActorProcess(rsd->SavedICInfo[i].idActor, &rsd->SavedICInfo[i], rsd == &sgData);
break;
case GS_POLYGON:
diff --git a/engines/tinsel/sound.cpp b/engines/tinsel/sound.cpp
index bf48dd1511..130928d885 100644
--- a/engines/tinsel/sound.cpp
+++ b/engines/tinsel/sound.cpp
@@ -41,8 +41,9 @@
#include "audio/decoders/flac.h"
#include "audio/decoders/mp3.h"
#include "audio/decoders/raw.h"
-#include "audio/decoders/vag.h"
#include "audio/decoders/vorbis.h"
+#include "audio/decoders/xa.h"
+
#include "gui/message.h"
@@ -106,8 +107,8 @@ bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::Sound
error(FILE_IS_CORRUPT, _vm->getSampleFile(sampleLanguage));
if (TinselV1PSX) {
- // Read the stream and create a VAG Audio stream
- Audio::AudioStream *vagStream = Audio::makeVagStream(_sampleStream.readStream(sampleLen), 44100);
+ // Read the stream and create a XA ADPCM audio stream
+ Audio::AudioStream *xaStream = Audio::makeXAStream(_sampleStream.readStream(sampleLen), 44100);
// FIXME: Should set this in a different place ;)
_vm->_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, _vm->_config->_soundVolume);
@@ -115,7 +116,7 @@ bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::Sound
_vm->_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, _vm->_config->_voiceVolume);
// Play the audio stream
- _vm->_mixer->playStream(type, &curChan.handle, vagStream);
+ _vm->_mixer->playStream(type, &curChan.handle, xaStream);
} else {
// allocate a buffer
byte *sampleBuf = (byte *)malloc(sampleLen);
diff --git a/engines/tinsel/strres.h b/engines/tinsel/strres.h
index a63824a863..f6e86951b6 100644
--- a/engines/tinsel/strres.h
+++ b/engines/tinsel/strres.h
@@ -96,4 +96,3 @@ SCNHANDLE LanguageFlag(LANGUAGE thisOne);
} // End of namespace Tinsel
#endif
-
diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp
index 80f02ff8d1..635845ab26 100644
--- a/engines/tinsel/tinsel.cpp
+++ b/engines/tinsel/tinsel.cpp
@@ -778,7 +778,7 @@ static const GameSettings tinselSettings[] = {
// For the languages, refer to the LANGUAGE enum in dw.h
-const char *TinselEngine::_sampleIndices[][3] = {
+const char *const TinselEngine::_sampleIndices[][3] = {
{ "english.idx", "english1.idx", "english2.idx" }, // English
{ "french.idx", "french1.idx", "french2.idx" }, // French
{ "german.idx", "german1.idx", "german2.idx" }, // German
@@ -789,7 +789,7 @@ const char *TinselEngine::_sampleIndices[][3] = {
{ "english.idx", "english1.idx", "english2.idx" }, // Japanese (FIXME: not sure if this is correct)
{ "us.idx", "us1.idx", "us2.idx" } // US English
};
-const char *TinselEngine::_sampleFiles[][3] = {
+const char *const TinselEngine::_sampleFiles[][3] = {
{ "english.smp", "english1.smp", "english2.smp" }, // English
{ "french.smp", "french1.smp", "french2.smp" }, // French
{ "german.smp", "german1.smp", "german2.smp" }, // German
@@ -800,7 +800,7 @@ const char *TinselEngine::_sampleFiles[][3] = {
{ "english.smp", "english1.smp", "english2.smp" }, // Japanese (FIXME: not sure if this is correct)
{ "us.smp", "us1.smp", "us2.smp" }, // US English
};
-const char *TinselEngine::_textFiles[][3] = {
+const char *const TinselEngine::_textFiles[][3] = {
{ "english.txt", "english1.txt", "english2.txt" }, // English
{ "french.txt", "french1.txt", "french2.txt" }, // French
{ "german.txt", "german1.txt", "german2.txt" }, // German
diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h
index 30b060766e..59344c44f4 100644
--- a/engines/tinsel/tinsel.h
+++ b/engines/tinsel/tinsel.h
@@ -31,9 +31,6 @@
#include "common/random.h"
#include "common/util.h"
-#include "audio/mididrv.h"
-#include "audio/mixer.h"
-
#include "engines/engine.h"
#include "tinsel/debugger.h"
#include "tinsel/graphics.h"
@@ -53,6 +50,7 @@ namespace Tinsel {
class BMVPlayer;
class Config;
+class MidiDriver;
class MidiMusicPlayer;
class PCMMusicPlayer;
class Scheduler;
@@ -158,9 +156,9 @@ class TinselEngine : public Engine {
Console *_console;
Scheduler *_scheduler;
- static const char *_sampleIndices[][3];
- static const char *_sampleFiles[][3];
- static const char *_textFiles[][3];
+ static const char *const _sampleIndices[][3];
+ static const char *const _sampleFiles[][3];
+ static const char *const _textFiles[][3];
protected:
diff --git a/engines/toon/anim.cpp b/engines/toon/anim.cpp
index 23bd0f6487..a529001af5 100644
--- a/engines/toon/anim.cpp
+++ b/engines/toon/anim.cpp
@@ -271,6 +271,18 @@ void Animation::applyPalette(int32 offset, int32 srcOffset, int32 numEntries) {
_vm->setPaletteEntries(_palette + srcOffset, offset, numEntries);
}
+Common::Rect Animation::getFrameRect(int32 frame) {
+ debugC(4, kDebugAnim, "getFrameRect(%d)", frame);
+ if ((frame < 0) || (frame >= _numFrames)) {
+ return Common::Rect();
+ }
+
+ if (_frames[frame]._ref != -1)
+ frame = _frames[frame]._ref;
+
+ return Common::Rect(_frames[frame]._x1, _frames[frame]._y1, _frames[frame]._x2, _frames[frame]._y2);
+}
+
int32 Animation::getFrameWidth(int32 frame) {
debugC(4, kDebugAnim, "getFrameWidth(%d)", frame);
if ((frame < 0) || (frame >= _numFrames))
@@ -681,7 +693,7 @@ AnimationManager::AnimationManager(ToonEngine *vm) : _vm(vm) {
bool AnimationManager::hasInstance(AnimationInstance* instance) {
for (uint32 i = 0; i < _instances.size(); i++) {
- if(_instances[i] == instance)
+ if (_instances[i] == instance)
return true;
}
return false;
@@ -697,7 +709,7 @@ void AnimationManager::addInstance(AnimationInstance *instance) {
// if the instance already exists, we skip the add
for (uint32 i = 0; i < _instances.size(); i++) {
- if(_instances[i] == instance)
+ if (_instances[i] == instance)
return;
}
diff --git a/engines/toon/anim.h b/engines/toon/anim.h
index 13c501b910..4b95b6cf40 100644
--- a/engines/toon/anim.h
+++ b/engines/toon/anim.h
@@ -68,6 +68,7 @@ public:
void drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask, int32 scale);
void drawStrip(int32 offset = 0);
void applyPalette(int32 offset, int32 srcOffset, int32 numEntries);
+ Common::Rect getFrameRect(int32 frame);
int32 getFrameWidth(int32 frame);
int32 getFrameHeight(int32 frame);
int32 getWidth() const;
diff --git a/engines/toon/audio.cpp b/engines/toon/audio.cpp
index 0bf3316209..5b2d06b74d 100644
--- a/engines/toon/audio.cpp
+++ b/engines/toon/audio.cpp
@@ -65,7 +65,7 @@ void AudioManager::muteMusic(bool muted) {
}
void AudioManager::muteVoice(bool muted) {
- if(voiceStillPlaying() && _channels[2]) {
+ if (voiceStillPlaying() && _channels[2]) {
_channels[2]->setVolume(muted ? 0 : 255);
}
_voiceMuted = muted;
@@ -272,7 +272,7 @@ AudioStreamInstance::~AudioStreamInstance() {
int AudioStreamInstance::readBuffer(int16 *buffer, const int numSamples) {
debugC(5, kDebugAudio, "readBuffer(buffer, %d)", numSamples);
- if(_stopped)
+ if (_stopped)
return 0;
handleFade(numSamples);
@@ -598,7 +598,7 @@ void AudioManager::updateAmbientSFX()
for (int32 i = 0; i < 4; i++) {
AudioAmbientSFX* ambient = &_ambientSFXs[i];
if (ambient->_enabled && (ambient->_channel < 0 || !(_channels[ambient->_channel] && _channels[ambient->_channel]->isPlaying()))) {
- if(ambient->_mode == 1) {
+ if (ambient->_mode == 1) {
if (_vm->randRange(0, 32767) < ambient->_delay) {
ambient->_channel = playSFX(ambient->_id, ambient->_volume, false);
}
@@ -613,4 +613,3 @@ void AudioManager::updateAmbientSFX()
}
} // End of namespace Toon
-
diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp
index 06c6e21d21..7d9a31c170 100644
--- a/engines/toon/character.cpp
+++ b/engines/toon/character.cpp
@@ -596,7 +596,8 @@ int32 Character::getId() {
void Character::save(Common::WriteStream *stream) {
debugC(1, kDebugCharacter, "save(stream)");
- stream->writeSint32LE(_flags);
+ // we have to save visibility too, put in flags to not invalidate old savegames.
+ stream->writeSint32LE(_flags | ((_visible == false) ? 0x100 : 0));
stream->writeSint32LE(_x);
stream->writeSint32LE(_y);
stream->writeSint32LE(_z);
@@ -633,6 +634,12 @@ void Character::load(Common::ReadStream *stream) {
if (_sceneAnimationId > -1) {
setAnimationInstance(_vm->getSceneAnimation(_sceneAnimationId)->_animInstance);
}
+
+ // "not visible" flag.
+ if (_flags & 0x100) {
+ _flags &= ~0x100;
+ setVisible(false);
+ }
}
void Character::setAnimScript(int32 animScriptId) {
@@ -1102,4 +1109,3 @@ void Character::updateIdle() {
}
}
} // End of namespace Toon
-
diff --git a/engines/toon/detection.cpp b/engines/toon/detection.cpp
index 810a37720a..2afcb589b7 100644
--- a/engines/toon/detection.cpp
+++ b/engines/toon/detection.cpp
@@ -35,8 +35,6 @@ static const PlainGameDescriptor toonGames[] = {
namespace Toon {
-using Common::GUIO_NONE;
-
static const ADGameDescription gameDescriptions[] = {
{
"toon", "",
@@ -46,7 +44,7 @@ static const ADGameDescription gameDescriptions[] = {
{"study.svl", 0, "281efa3f33f6712c0f641a605f4d40fd", 2511090},
AD_LISTEND
},
- Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO_NONE
+ Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO1(GUIO_NONE)
},
{
"toon", "",
@@ -56,7 +54,7 @@ static const ADGameDescription gameDescriptions[] = {
{"study.svl", 0, "df056b94ea83f1ed92a539cf636053ab", 2542668},
AD_LISTEND
},
- Common::FR_FRA, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO_NONE
+ Common::FR_FRA, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO1(GUIO_NONE)
},
{
"toon", "",
@@ -66,7 +64,7 @@ static const ADGameDescription gameDescriptions[] = {
{"study.svl", 0, "72fe96a9e10967d3138e918295babc42", 2910283},
AD_LISTEND
},
- Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO_NONE
+ Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO1(GUIO_NONE)
},
{
"toon", "",
@@ -76,7 +74,7 @@ static const ADGameDescription gameDescriptions[] = {
{"study.svl", 0, "b6b1ee2d9d94d53d305856039ab7bde7", 2634620},
AD_LISTEND
},
- Common::ES_ESP, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO_NONE
+ Common::ES_ESP, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO1(GUIO_NONE)
},
{
"toon", "",
@@ -86,7 +84,7 @@ static const ADGameDescription gameDescriptions[] = {
{"generic.svl", 0, "5eb99850ada22f0b8cf6392262d4dd07", 9404599},
AD_LISTEND
},
- Common::DE_DEU, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE
+ Common::DE_DEU, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NONE)
},
{
"toon", "",
@@ -95,7 +93,7 @@ static const ADGameDescription gameDescriptions[] = {
{"generic.svl", 0, "5c42724bb93b360dca7044d6b7ef26e5", 7739319},
AD_LISTEND
},
- Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE
+ Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER
@@ -224,12 +222,7 @@ SaveStateDescriptor ToonMetaEngine::querySaveMetaInfos(const char *target, int s
SaveStateDescriptor desc(slot, saveName);
- Graphics::Surface *thumbnail = new Graphics::Surface();
- assert(thumbnail);
- if (!Graphics::loadThumbnail(*file, *thumbnail)) {
- delete thumbnail;
- thumbnail = 0;
- }
+ Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*file);
desc.setThumbnail(thumbnail);
desc.setDeletableFlag(true);
diff --git a/engines/toon/drew.cpp b/engines/toon/drew.cpp
index 89438fb35c..df5cfcfa03 100644
--- a/engines/toon/drew.cpp
+++ b/engines/toon/drew.cpp
@@ -129,4 +129,3 @@ void CharacterDrew::resetScale()
setPosition(_x, _y);
}
} // End of namespace Toon
-
diff --git a/engines/toon/font.cpp b/engines/toon/font.cpp
index 4c491ae2b3..63304c905f 100644
--- a/engines/toon/font.cpp
+++ b/engines/toon/font.cpp
@@ -21,6 +21,7 @@
*/
#include "common/debug.h"
+#include "common/rect.h"
#include "toon/font.h"
@@ -80,7 +81,7 @@ void FontRenderer::renderText(int32 x, int32 y, Common::String origText, int32 m
x -= xx / 2;
}
- _vm->addDirtyRect(x, y, x + xx + 2, y + yy);
+ _vm->addDirtyRect(x, y, x + xx, y + yy);
int32 curX = x;
int32 curY = y;
@@ -110,6 +111,7 @@ void FontRenderer::computeSize(Common::String origText, int32 *retX, int32 *retY
int32 lineHeight = 0;
int32 totalHeight = 0;
int32 totalWidth = 0;
+ int32 lastLineHeight = 0;
const byte *text = (const byte *)origText.c_str();
while (*text) {
@@ -122,17 +124,25 @@ void FontRenderer::computeSize(Common::String origText, int32 *retX, int32 *retY
totalHeight += lineHeight;
lineHeight = 0;
lineWidth = 0;
+ lastLineHeight = 0;
} else {
curChar = textToFont(curChar);
int32 charWidth = _currentFont->getFrameWidth(curChar) - 1;
int32 charHeight = _currentFont->getFrameHeight(curChar);
lineWidth += charWidth;
lineHeight = MAX(lineHeight, charHeight);
+
+ // The character may be offset, so the height doesn't
+ // really tell how far it will stick out. For now,
+ // assume we only need to take the lower bound into
+ // consideration.
+ Common::Rect charRect = _currentFont->getFrameRect(curChar);
+ lastLineHeight = MAX<int32>(lastLineHeight, charRect.bottom);
}
text++;
}
- totalHeight += lineHeight;
+ totalHeight += lastLineHeight;
totalWidth = MAX(totalWidth, lineWidth);
*retX = totalWidth;
diff --git a/engines/toon/hotspot.cpp b/engines/toon/hotspot.cpp
index 62458ad800..ee81b87417 100644
--- a/engines/toon/hotspot.cpp
+++ b/engines/toon/hotspot.cpp
@@ -149,4 +149,3 @@ HotspotData *Hotspots::Get(int32 id) {
}
} // End of namespace Toon
-
diff --git a/engines/toon/movie.cpp b/engines/toon/movie.cpp
index 2318eaaac7..7637f4e62f 100644
--- a/engines/toon/movie.cpp
+++ b/engines/toon/movie.cpp
@@ -94,7 +94,7 @@ void Movie::play(Common::String video, int32 flags) {
_vm->getAudioManager()->setMusicVolume(0);
_decoder->loadFile(video.c_str());
playVideo(isFirstIntroVideo);
- _vm->flushPalette(false);
+ _vm->flushPalette(true);
if (flags & 1)
_vm->getAudioManager()->setMusicVolume(_vm->getAudioManager()->isMusicMuted() ? 0 : 255);
_decoder->close();
@@ -103,7 +103,6 @@ void Movie::play(Common::String video, int32 flags) {
bool Movie::playVideo(bool isFirstIntroVideo) {
debugC(1, kDebugMovie, "playVideo(isFirstIntroVideo: %d)", isFirstIntroVideo);
-
while (!_vm->shouldQuit() && !_decoder->endOfVideo()) {
if (_decoder->needsUpdate()) {
const Graphics::Surface *frame = _decoder->decodeNextFrame();
diff --git a/engines/toon/path.cpp b/engines/toon/path.cpp
index dde7be07d0..60ca007930 100644
--- a/engines/toon/path.cpp
+++ b/engines/toon/path.cpp
@@ -28,54 +28,69 @@ namespace Toon {
PathFindingHeap::PathFindingHeap() {
_count = 0;
- _alloc = 0;
+ _size = 0;
_data = NULL;
}
PathFindingHeap::~PathFindingHeap() {
- delete[] _data;
+ free(_data);
}
-int32 PathFindingHeap::init(int32 size) {
+void PathFindingHeap::init(int32 size) {
debugC(1, kDebugPath, "init(%d)", size);
+ _size = size;
- delete[] _data;
- _data = new HeapDataGrid[size * 2];
- memset(_data, 0, sizeof(HeapDataGrid) * size * 2);
+ free(_data);
+ _data = (HeapDataGrid *)malloc(sizeof(HeapDataGrid) * _size);
+ memset(_data, 0, sizeof(HeapDataGrid) * _size);
_count = 0;
- _alloc = size;
- return size;
}
-int32 PathFindingHeap::unload() {
- delete[] _data;
+void PathFindingHeap::unload() {
+ _count = 0;
+ _size = 0;
+ free(_data);
_data = NULL;
- return 0;
}
-int32 PathFindingHeap::clear() {
- //debugC(1, kDebugPath, "clear()");
+void PathFindingHeap::clear() {
+ debugC(1, kDebugPath, "clear()");
_count = 0;
- memset(_data, 0, sizeof(HeapDataGrid) * _alloc * 2);
- return 1;
+ memset(_data, 0, sizeof(HeapDataGrid) * _size);
}
-int32 PathFindingHeap::push(int32 x, int32 y, int32 weight) {
- //debugC(6, kDebugPath, "push(%d, %d, %d)", x, y, weight);
+void PathFindingHeap::push(int32 x, int32 y, int32 weight) {
+ debugC(2, kDebugPath, "push(%d, %d, %d)", x, y, weight);
+
+ if (_count == _size) {
+ // Increase size by 50%
+ int newSize = _size + (_size >> 1) + 1;
+ HeapDataGrid *newData;
+
+ newData = (HeapDataGrid *)realloc(_data, sizeof(HeapDataGrid) * newSize);
+ if (newData == NULL) {
+ warning("Aborting attempt to push onto PathFindingHeap at maximum size: %d", _count);
+ return;
+ }
+
+ memset(newData + _size, 0, sizeof(HeapDataGrid) * (newSize - _size));
+ _data = newData;
+ _size = newSize;
+ }
- _count++;
_data[_count]._x = x;
_data[_count]._y = y;
_data[_count]._weight = weight;
+ _count++;
- int32 lMax = _count;
+ int32 lMax = _count-1;
int32 lT = 0;
while (1) {
- lT = lMax / 2;
- if (lT < 1)
+ if (lMax <= 0)
break;
+ lT = (lMax-1) / 2;
if (_data[lT]._weight > _data[lMax]._weight) {
HeapDataGrid temp;
@@ -87,31 +102,31 @@ int32 PathFindingHeap::push(int32 x, int32 y, int32 weight) {
break;
}
}
- return 1;
}
-int32 PathFindingHeap::pop(int32 *x, int32 *y, int32 *weight) {
- //debugC(6, kDebugPath, "pop(x, y, weight)");
+void PathFindingHeap::pop(int32 *x, int32 *y, int32 *weight) {
+ debugC(2, kDebugPath, "pop(x, y, weight)");
- if (!_count)
- return 0;
+ if (!_count) {
+ warning("Attempt to pop empty PathFindingHeap!");
+ return;
+ }
- *x = _data[1]._x;
- *y = _data[1]._y;
- *weight = _data[1]._weight;
+ *x = _data[0]._x;
+ *y = _data[0]._y;
+ *weight = _data[0]._weight;
- _data[1] = _data[_count];
- _count--;
+ _data[0] = _data[--_count];
if (!_count)
- return 0;
+ return;
- int32 lMin = 1;
- int32 lT = 1;
+ int32 lMin = 0;
+ int32 lT = 0;
while (1) {
- lT = lMin << 1;
- if (lT <= _count) {
- if (lT < _count) {
+ lT = (lMin << 1) + 1;
+ if (lT < _count) {
+ if (lT < _count-1) {
if (_data[lT + 1]._weight < _data[lT]._weight)
lT++;
}
@@ -129,7 +144,6 @@ int32 PathFindingHeap::pop(int32 *x, int32 *y, int32 *weight) {
break;
}
}
- return 0;
}
PathFinding::PathFinding(ToonEngine *vm) : _vm(vm) {
@@ -164,7 +178,7 @@ bool PathFinding::isLikelyWalkable(int32 x, int32 y) {
}
bool PathFinding::isWalkable(int32 x, int32 y) {
- //debugC(6, kDebugPath, "isWalkable(%d, %d)", x, y);
+ debugC(2, kDebugPath, "isWalkable(%d, %d)", x, y);
bool maskWalk = (_currentMask->getData(x, y) & 0x1f) > 0;
@@ -299,7 +313,7 @@ int32 PathFinding::findPath(int32 x, int32 y, int32 destx, int32 desty) {
_heap->push(curX, curY, abs(destx - x) + abs(desty - y));
int wei = 0;
- while (_heap->_count) {
+ while (_heap->getCount()) {
wei = 0;
_heap->pop(&curX, &curY, &curWeight);
int curNode = curX + curY * _width;
@@ -342,8 +356,15 @@ next:
curX = destx;
curY = desty;
- int32 retPathX[4096];
- int32 retPathY[4096];
+ int32 *retPathX = (int32 *)malloc(4096 * sizeof(int32));
+ int32 *retPathY = (int32 *)malloc(4096 * sizeof(int32));
+ if (!retPathX || !retPathY) {
+ free(retPathX);
+ free(retPathY);
+
+ error("[PathFinding::findPath] Cannot allocate pathfinding buffers");
+ }
+
int32 numpath = 0;
retPathX[numpath] = curX;
@@ -377,8 +398,12 @@ next:
}
}
- if (bestX < 0 || bestY < 0)
+ if (bestX < 0 || bestY < 0) {
+ free(retPathX);
+ free(retPathY);
+
return 0;
+ }
retPathX[numpath] = bestX;
retPathY[numpath] = bestY;
@@ -389,6 +414,10 @@ next:
memcpy(_tempPathX, retPathX, sizeof(int32) * numpath);
memcpy(_tempPathY, retPathY, sizeof(int32) * numpath);
+
+ free(retPathX);
+ free(retPathY);
+
return true;
}
@@ -396,6 +425,9 @@ next:
curY = bestY;
}
+ free(retPathX);
+ free(retPathY);
+
return false;
}
@@ -406,11 +438,7 @@ void PathFinding::init(Picture *mask) {
_height = mask->getHeight();
_currentMask = mask;
_heap->unload();
- // In order to reduce memory fragmentation on small devices, we use the maximum
- // possible size here which is TOON_BACKBUFFER_WIDTH. Even though this is
- // 1280 as opposed to the possible 640, it actually helps memory allocation on
- // those devices.
- _heap->init(TOON_BACKBUFFER_WIDTH * _height); // should really be _width
+ _heap->init(500);
delete[] _gridTemp;
_gridTemp = new int32[_width*_height];
}
diff --git a/engines/toon/path.h b/engines/toon/path.h
index 329127c9ce..2de58064f0 100644
--- a/engines/toon/path.h
+++ b/engines/toon/path.h
@@ -38,17 +38,18 @@ public:
PathFindingHeap();
~PathFindingHeap();
- int32 _alloc;
- int32 _count;
-
- int32 push(int32 x, int32 y, int32 weight);
- int32 pop(int32 *x, int32 *y, int32 *weight);
- int32 init(int32 size);
- int32 clear();
- int32 unload();
+ void push(int32 x, int32 y, int32 weight);
+ void pop(int32 *x, int32 *y, int32 *weight);
+ void init(int32 size);
+ void clear();
+ void unload();
+ int32 getCount() { return _count; }
private:
HeapDataGrid *_data;
+
+ int32 _size;
+ int32 _count;
};
class PathFinding {
diff --git a/engines/toon/picture.cpp b/engines/toon/picture.cpp
index 0257964fb5..6367165d6f 100644
--- a/engines/toon/picture.cpp
+++ b/engines/toon/picture.cpp
@@ -29,16 +29,14 @@
namespace Toon {
-bool Picture::loadPicture(Common::String file, bool totalPalette /*= false*/) {
- debugC(1, kDebugPicture, "loadPicture(%s, %d)", file.c_str(), (totalPalette) ? 1 : 0);
+bool Picture::loadPicture(Common::String file) {
+ debugC(1, kDebugPicture, "loadPicture(%s)", file.c_str());
uint32 size = 0;
uint8 *fileData = _vm->resources()->getFileData(file, &size);
if (!fileData)
return false;
- _useFullPalette = totalPalette;
-
uint32 compId = READ_BE_UINT32(fileData);
switch (compId) {
@@ -57,6 +55,8 @@ bool Picture::loadPicture(Common::String file, bool totalPalette /*= false*/) {
// do we have a palette ?
_paletteEntries = (dstsize & 0x7ff) / 3;
+ _useFullPalette = (_paletteEntries == 256);
+ // _useFullPalette = true;
if (_paletteEntries) {
_palette = new uint8[_paletteEntries * 3];
memcpy(_palette, _data + dstsize - (dstsize & 0x7ff), _paletteEntries * 3);
@@ -70,7 +70,8 @@ bool Picture::loadPicture(Common::String file, bool totalPalette /*= false*/) {
uint32 decSize = READ_LE_UINT32(fileData + 10);
_data = new uint8[decSize + 100];
_paletteEntries = READ_LE_UINT16(fileData + 14) / 3;
-
+ _useFullPalette = (_paletteEntries == 256);
+
if (_paletteEntries) {
_palette = new uint8[_paletteEntries * 3];
memcpy(_palette, fileData + 16, _paletteEntries * 3);
@@ -322,7 +323,7 @@ void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable
int32 rx = bx >> 16;
int32 ry = by >> 16;
- if( rx >= 0 && rx < _width-1 && ry >= 0 && ry < _height) { // sanity check: some lines in the game
+ if ( rx >= 0 && rx < _width-1 && ry >= 0 && ry < _height) { // sanity check: some lines in the game
// were drawing outside the screen causing corruption
if (!walkable) {
_data[_width * ry + rx] &= 0xe0;
diff --git a/engines/toon/picture.h b/engines/toon/picture.h
index 23edbc91da..ee0e006702 100644
--- a/engines/toon/picture.h
+++ b/engines/toon/picture.h
@@ -38,7 +38,7 @@ class Picture {
public:
Picture(ToonEngine *vm);
~Picture();
- bool loadPicture(Common::String file, bool totalPalette = false);
+ bool loadPicture(Common::String file);
void setupPalette();
void draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy);
void drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int32 dx, int32 dy, Common::Array<Common::Rect>& rectArray);
diff --git a/engines/toon/resource.cpp b/engines/toon/resource.cpp
index cef916c7de..384a363d7d 100644
--- a/engines/toon/resource.cpp
+++ b/engines/toon/resource.cpp
@@ -41,7 +41,7 @@ Resources::~Resources() {
delete temp;
}
- while(!_pakFiles.empty()) {
+ while (!_pakFiles.empty()) {
PakFile *temp = _pakFiles.back();
_pakFiles.pop_back();
delete temp;
diff --git a/engines/toon/script.cpp b/engines/toon/script.cpp
index eed781295a..69ae727bb5 100644
--- a/engines/toon/script.cpp
+++ b/engines/toon/script.cpp
@@ -502,4 +502,3 @@ void EMCInterpreter::loadState(EMCState *script, Common::ReadStream *stream) {
}
} // End of namespace Toon
-
diff --git a/engines/toon/script.h b/engines/toon/script.h
index 9dd00dca80..8ef085f383 100644
--- a/engines/toon/script.h
+++ b/engines/toon/script.h
@@ -148,4 +148,3 @@ private:
} // End of namespace Toon
#endif
-
diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp
index 005a299502..e9b7534198 100644
--- a/engines/toon/script_func.cpp
+++ b/engines/toon/script_func.cpp
@@ -223,7 +223,7 @@ ScriptFunc::ScriptFunc(ToonEngine *vm) {
}
ScriptFunc::~ScriptFunc(void) {
- while(!_opcodes.empty()) {
+ while (!_opcodes.empty()) {
const OpcodeV2 *temp = _opcodes.back();
_opcodes.pop_back();
delete temp;
@@ -655,13 +655,15 @@ int32 ScriptFunc::sys_Cmd_Set_Flux_Facing_Point(EMCState *state) {
int32 fx = stackPos(0);
int32 fy = stackPos(1);
_vm->getFlux()->setFacing(_vm->getFlux()->getFacingFromDirection(fx - _vm->getFlux()->getX(), fy - _vm->getFlux()->getY()));
- _vm->getFlux()->playStandingAnim();
+ if (_vm->getFlux()->getFlag() == 0) // don't reset the animation unless Flux is in idle mode
+ _vm->getFlux()->playStandingAnim();
return 1;
}
int32 ScriptFunc::sys_Cmd_Set_Flux_Facing(EMCState *state) {
_vm->getFlux()->forceFacing(stackPos(0));
- _vm->getFlux()->playStandingAnim();
+ if (_vm->getFlux()->getFlag() == 0) // don't reset the animation unless Flux is in idle mode
+ _vm->getFlux()->playStandingAnim();
return 0;
}
@@ -990,7 +992,7 @@ int32 ScriptFunc::sys_Cmd_Set_Scene_Animation_Active_Flag(EMCState *state) {
if (sceneAnim->_active) {
sceneAnim->_animInstance->setVisible(activeFlag > 0);
- if(activeFlag) {
+ if (activeFlag) {
_vm->getAnimationManager()->addInstance(sceneAnim->_animInstance);
}
}
diff --git a/engines/toon/tools.cpp b/engines/toon/tools.cpp
index c2ee8acf8a..added39940 100644
--- a/engines/toon/tools.cpp
+++ b/engines/toon/tools.cpp
@@ -383,7 +383,7 @@ int32 RncDecoder::unpackM1(const void *input, uint16 inputSize, void *output) {
uint16 b;
if (_inputByteLeft <= 2)
b = 0;
- else if(_inputByteLeft == 3)
+ else if (_inputByteLeft == 3)
b = *(_srcPtr + 2);
else
b = READ_LE_UINT16(_srcPtr + 2);
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index cb41db1967..b3ab591ba7 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -191,11 +191,11 @@ void ToonEngine::parseInput() {
_audioManager->stopCurrentVoice();
}
if (event.kbd.keycode == Common::KEYCODE_F5 && !hasModifier) {
- if(canSaveGameStateCurrently())
+ if (canSaveGameStateCurrently())
saveGame(-1, Common::String());
}
if (event.kbd.keycode == Common::KEYCODE_F6 && !hasModifier) {
- if(canLoadGameStateCurrently())
+ if (canLoadGameStateCurrently())
loadGame(-1);
}
if (event.kbd.ascii == 't' && !hasModifier) {
@@ -509,7 +509,7 @@ void ToonEngine::copyToVirtualScreen(bool updateScreen) {
Common::Rect rect = _oldDirtyRects[i];
rect.translate(-state()->_currentScrollValue, 0);
offX = 0;
- if(rect.right <= 0)
+ if (rect.right <= 0)
continue;
if (rect.left < 0) {
offX = -rect.left;
@@ -614,7 +614,7 @@ struct MainMenuEntry {
bool ToonEngine::showMainmenu(bool &loadedGame) {
Picture *mainmenuPicture = new Picture(this);
- mainmenuPicture->loadPicture("TITLESCR.CPS", true);
+ mainmenuPicture->loadPicture("TITLESCR.CPS");
mainmenuPicture->setupPalette();
flushPalette(false);
@@ -663,7 +663,7 @@ bool ToonEngine::showMainmenu(bool &loadedGame) {
while (!clickRelease) {
- if(_dirtyAll) {
+ if (_dirtyAll) {
mainmenuPicture->draw(*_mainSurface, 0, 0, 0, 0);
addDirtyRect(0, 0, TOON_SCREEN_WIDTH, TOON_SCREEN_HEIGHT);
} else {
@@ -690,6 +690,11 @@ bool ToonEngine::showMainmenu(bool &loadedGame) {
}
}
+ if (_needPaletteFlush) {
+ flushPalette(false);
+ _needPaletteFlush = false;
+ }
+
parseInput();
copyToVirtualScreen(true);
_system->delayMillis(17);
@@ -931,7 +936,7 @@ ToonEngine::~ToonEngine() {
delete _animationManager;
delete _moviePlayer;
- if(_mainSurface) {
+ if (_mainSurface) {
_mainSurface->free();
delete _mainSurface;
}
@@ -1498,7 +1503,7 @@ void ToonEngine::clickEvent() {
if (leftButton)
createMouseItem(104);
else
- characterTalk(518);
+ characterTalk(1104);
}
}
if (_currentHotspotItem == -4) {
@@ -1547,7 +1552,7 @@ void ToonEngine::clickEvent() {
return;
}
} else {
- if (!_drew->walkTo(_mouseX, _mouseY)) {
+ if (!_drew->walkTo(_mouseX + _gameState->_currentScrollValue, _mouseY)) {
// walk was canceled ?
return;
}
@@ -2600,7 +2605,7 @@ int32 ToonEngine::showInventory() {
delete _inventoryPicture;
_inventoryPicture = new Picture(this);
fadeOut(5);
- _inventoryPicture->loadPicture("SACK128.CPS", true);
+ _inventoryPicture->loadPicture("SACK128.CPS");
_inventoryPicture->setupPalette();
dirtyAllScreen();
@@ -2695,7 +2700,7 @@ int32 ToonEngine::showInventory() {
}
renderInventory();
-
+ _system->delayMillis(10);
}
_gameState->_currentScrollValue = oldScrollValue;
@@ -2786,7 +2791,7 @@ void ToonEngine::showCutaway(Common::String cutawayPicture) {
if (cutawayPicture == "") {
cutawayPicture = Common::String(_gameState->_locations[_gameState->_currentScene]._cutaway) + ".CPS";
}
- _currentCutaway->loadPicture(cutawayPicture, false);
+ _currentCutaway->loadPicture(cutawayPicture);
_currentCutaway->setupPalette();
_oldScrollValue = _gameState->_currentScrollValue;
_gameState->_currentScrollValue = 0;
@@ -3418,7 +3423,7 @@ void ToonEngine::viewInventoryItem(Common::String str, int32 lineId, int32 itemD
fadeOut(5);
Picture *pic = new Picture(this);
- pic->loadPicture(str, false);
+ pic->loadPicture(str);
pic->setupPalette();
dirtyAllScreen();
flushPalette();
@@ -4672,7 +4677,7 @@ void ToonEngine::makeLineWalkable(int32 x, int32 y, int32 x2, int32 y2) {
}
void ToonEngine::playRoomMusic() {
- if(_gameState->_inConversation) {
+ if (_gameState->_inConversation) {
const char* music = getSpecialConversationMusic(_gameState->_currentConversationId);
if (music) {
_audioManager->playMusic(_gameState->_locations[_gameState->_currentScene]._name, music);
diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp
index 0684144473..a42d765056 100644
--- a/engines/touche/detection.cpp
+++ b/engines/touche/detection.cpp
@@ -37,8 +37,6 @@ static const PlainGameDescriptor toucheGames[] = {
namespace Touche {
-using Common::GUIO_NONE;
-
static const ADGameDescription gameDescriptions[] = {
{ // retail version
"touche",
@@ -47,7 +45,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{ // retail version - tracker item #1601818
"touche",
@@ -56,7 +54,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{ // retail version
"touche",
@@ -65,7 +63,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{ // retail version - tracker item #1598643
"touche",
@@ -74,7 +72,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{ // retail version - tracker item #1681643
"touche",
@@ -83,7 +81,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{ // fan-made translation (http://www.iagtg.net/) - tracker item #1602360
"touche",
@@ -92,7 +90,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::IT_ITA,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{ // retail version - tracker item #1800500
"touche",
@@ -101,7 +99,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::PL_POL,
Common::kPlatformPC,
ADGF_NO_FLAGS,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{ // demo version
"touche",
@@ -110,7 +108,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- GUIO_NONE
+ GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER
};
diff --git a/engines/touche/menu.cpp b/engines/touche/menu.cpp
index f469a95803..c58e2f1a33 100644
--- a/engines/touche/menu.cpp
+++ b/engines/touche/menu.cpp
@@ -103,7 +103,7 @@ struct MenuData {
void addCharToDescription(int slot, char chr) {
char *description = saveLoadDescriptionsTable[slot];
int descriptionLen = strlen(description);
- if (descriptionLen < 32 && isprint(chr)) {
+ if (descriptionLen < 32 && isprint(static_cast<unsigned char>(chr))) {
description[descriptionLen] = chr;
description[descriptionLen + 1] = 0;
}
diff --git a/engines/touche/resource.cpp b/engines/touche/resource.cpp
index 8f4752e912..6df6fc0e5f 100644
--- a/engines/touche/resource.cpp
+++ b/engines/touche/resource.cpp
@@ -468,14 +468,22 @@ void ToucheEngine::res_loadSprite(int num, int index) {
if (size > spr->size) {
debug(8, "Reallocating memory for sprite %d (index %d), %d bytes needed", num, index, size - spr->size);
spr->size = size;
- if (spr->ptr) {
- spr->ptr = (uint8 *)realloc(spr->ptr, size);
- } else {
- spr->ptr = (uint8 *)malloc(size);
- }
- if (!spr->ptr) {
- error("Unable to reallocate memory for sprite %d (%d bytes)", num, size);
+
+ uint8 *buffer = NULL;
+ if (spr->ptr)
+ buffer = (uint8 *)realloc(spr->ptr, size);
+
+ if (!buffer) {
+ // Free previously allocated sprite (when realloc failed)
+ free(spr->ptr);
+
+ buffer = (uint8 *)malloc(size);
}
+
+ if (!buffer)
+ error("[ToucheEngine::res_loadSprite] Unable to reallocate memory for sprite %d (%d bytes)", num, size);
+
+ spr->ptr = buffer;
}
for (int i = 0; i < _currentImageHeight; ++i) {
res_decodeScanLineImageRLE(spr->ptr + _currentImageWidth * i, _currentImageWidth);
diff --git a/engines/tsage/blue_force/blueforce_dialogs.cpp b/engines/tsage/blue_force/blueforce_dialogs.cpp
new file mode 100644
index 0000000000..86feceb015
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_dialogs.cpp
@@ -0,0 +1,434 @@
+/* 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.
+ *
+ */
+
+#include "common/translation.h"
+
+#include "gui/dialog.h"
+#include "gui/widget.h"
+
+#include "tsage/tsage.h"
+#include "tsage/core.h"
+#include "tsage/dialogs.h"
+#include "tsage/staticres.h"
+#include "tsage/globals.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/ringworld/ringworld_logic.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/**
+ * This dialog implements the right-click dialog
+ */
+RightClickDialog::RightClickDialog() : GfxDialog() {
+ // Setup button areas
+ _rectList1[0] = Rect(7, 50, 41, 67);
+ _rectList1[1] = Rect(13, 27, 50, 50);
+ _rectList1[2] = Rect(49, 27, 84, 50);
+ _rectList1[3] = Rect(56, 50, 90, 67);
+ _rectList1[4] = Rect(26, 68, 69, 99);
+
+ _rectList3[0] = Rect(12, 49, 27, 64);
+ _rectList3[1] = Rect(27, 31, 42, 46);
+ _rectList3[2] = Rect(56, 31, 71, 46);
+ _rectList3[3] = Rect(72, 50, 87, 65);
+ _rectList3[4] = Rect(41, 81, 56, 96);
+
+ // Set the palette and change the cursor
+ GfxSurface cursor = surfaceFromRes(1, 5, 9);
+ BF_GLOBALS._events.setCursor(cursor);
+
+ setPalette();
+
+ // Get the dialog image
+ _surface = surfaceFromRes(1, 1, 1);
+
+ // Set the dialog position
+ Rect dialogRect;
+ dialogRect.resize(_surface, 0, 0, 100);
+ dialogRect.center(g_globals->_events._mousePos.x, g_globals->_events._mousePos.y);
+
+ // Ensure the dialog will be entirely on-screen
+ Rect screenRect = g_globals->gfxManager()._bounds;
+ screenRect.collapse(4, 4);
+ dialogRect.contain(screenRect);
+
+ // Load selected button images
+ _btnImages.setVisage(1, 2);
+
+ _bounds = dialogRect;
+ _gfxManager._bounds = _bounds;
+
+ _highlightedAction = -1;
+ _selectedAction = -1;
+}
+
+RightClickDialog::~RightClickDialog() {
+}
+
+void RightClickDialog::draw() {
+ // Save the covered background area
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds);
+
+ // Draw the dialog image
+ g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top);
+
+ // Pre-process rect lists
+ for (int idx = 0; idx < 5; ++idx) {
+ _rectList2[idx] = _rectList1[idx];
+ _rectList4[idx] = _rectList3[idx];
+
+ _rectList2[idx].translate(_bounds.left, _bounds.top);
+ _rectList4[idx].translate(_bounds.left, _bounds.top);
+ }
+}
+
+bool RightClickDialog::process(Event &event) {
+ switch (event.eventType) {
+ case EVENT_MOUSE_MOVE: {
+ // Check whether a button is highlighted
+ int buttonIndex = 0;
+ while ((buttonIndex < 5) && !_rectList1[buttonIndex].contains(event.mousePos))
+ ++buttonIndex;
+ if (buttonIndex == 5)
+ buttonIndex = -1;
+
+ // If selection has changed, handle it
+ if (buttonIndex != _highlightedAction) {
+ if (_highlightedAction != -1) {
+ // Another button was previously selected, so restore dialog
+ _gfxManager.copyFrom(_surface, 0, 0);
+ }
+
+ if (buttonIndex != -1) {
+ // Draw newly selected button
+ GfxSurface btn = _btnImages.getFrame(buttonIndex + 1);
+ _gfxManager.copyFrom(btn, _rectList3[buttonIndex].left, _rectList3[buttonIndex].top);
+ }
+
+ _highlightedAction = buttonIndex;
+ }
+
+ event.handled = true;
+ return true;
+ }
+
+ case EVENT_BUTTON_DOWN:
+ // Specify the selected action
+ _selectedAction = (_highlightedAction == -1) ? 5 : _highlightedAction;
+ event.handled = true;
+ return true;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+void RightClickDialog::execute() {
+ // Draw the dialog
+ draw();
+
+ // Dialog event handler loop
+ _gfxManager.activate();
+
+ while (!g_vm->shouldQuit() && (_selectedAction == -1)) {
+ Event evt;
+ while (g_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) {
+ evt.mousePos.x -= _bounds.left;
+ evt.mousePos.y -= _bounds.top;
+
+ process(evt);
+ }
+
+ g_system->delayMillis(10);
+ g_system->updateScreen();
+ }
+
+ // Execute the specified action
+ CursorType cursorNum = CURSOR_NONE;
+ switch (_selectedAction) {
+ case 0:
+ // Walk action
+ cursorNum = BF_GLOBALS._player._canWalk ? CURSOR_WALK : CURSOR_USE;
+ break;
+ case 1:
+ // Use action
+ cursorNum = CURSOR_USE;
+ break;
+ case 2:
+ // Look action
+ cursorNum = CURSOR_LOOK;
+ break;
+ case 3:
+ // Talk action
+ cursorNum = CURSOR_TALK;
+ break;
+ case 4:
+ // Options dialog
+ break;
+ }
+
+ if (cursorNum != CURSOR_NONE)
+ BF_GLOBALS._events.setCursor(cursorNum);
+
+ _gfxManager.deactivate();
+}
+
+/*--------------------------------------------------------------------------*/
+
+AmmoBeltDialog::AmmoBeltDialog() : GfxDialog() {
+ _cursorNum = BF_GLOBALS._events.getCursor();
+ _inDialog = -1;
+ _closeFlag = false;
+
+ // Get the dialog image
+ _surface = surfaceFromRes(9, 5, 2);
+
+ // Set the dialog position
+ _dialogRect.resize(_surface, 0, 0, 100);
+ _dialogRect.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
+
+ _bounds = _dialogRect;
+ _gfxManager._bounds = _bounds;
+ _savedArea = NULL;
+
+ // Set up area rects
+ _gunRect.set(0, 0, 82, 48);
+ _clip1Rect.set(90, 6, _bounds.width(), 39);
+ _clip2Rect.set(90, 40, _bounds.width(), _bounds.height());
+ _loadedRect.set(50, 40, 60, 50);
+}
+
+AmmoBeltDialog::~AmmoBeltDialog() {
+ BF_GLOBALS._events.setCursor(_cursorNum);
+}
+
+void AmmoBeltDialog::execute() {
+ // Draw the dialog
+ draw();
+
+ // Dialog event handler loop
+ _gfxManager.activate();
+
+ while (!g_vm->shouldQuit() && !_closeFlag) {
+ Event evt;
+ while (g_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) {
+ evt.mousePos.x -= _bounds.left;
+ evt.mousePos.y -= _bounds.top;
+
+ process(evt);
+ }
+
+ g_system->delayMillis(10);
+ g_system->updateScreen();
+ }
+
+ _gfxManager.deactivate();
+}
+
+bool AmmoBeltDialog::process(Event &event) {
+ switch (event.eventType) {
+ case EVENT_MOUSE_MOVE: {
+ // Handle updating cursor depending on whether cursor is in dialog or not
+ int inDialog = Rect(0, 0, _bounds.width(), _bounds.height()).contains(event.mousePos);
+ if (inDialog != _inDialog) {
+ // Update cursor
+ BF_GLOBALS._events.setCursor(inDialog ? CURSOR_USE : CURSOR_EXIT);
+ _inDialog = inDialog;
+ }
+ return true;
+ }
+
+ case EVENT_BUTTON_DOWN:
+ if (!_inDialog)
+ // Clicked outside dialog, so flag to close it
+ _closeFlag = true;
+ else {
+ int v = (BF_GLOBALS.getFlag(fGunLoaded) ? 1 : 0) * (BF_GLOBALS.getFlag(fLoadedSpare) ? 2 : 1);
+
+ // Handle first clip
+ if ((v != 1) && _clip1Rect.contains(event.mousePos)) {
+ if (BF_GLOBALS.getFlag(fGunLoaded)) {
+ event.mousePos.x = event.mousePos.y = 0;
+ }
+
+ BF_GLOBALS.setFlag(fGunLoaded);
+ BF_GLOBALS.clearFlag(fLoadedSpare);
+ }
+
+ // Handle second clip
+ if ((v != 2) && _clip2Rect.contains(event.mousePos)) {
+ if (BF_GLOBALS.getFlag(fGunLoaded)) {
+ event.mousePos.x = event.mousePos.y = 0;
+ }
+
+ BF_GLOBALS.setFlag(fGunLoaded);
+ BF_GLOBALS.setFlag(fLoadedSpare);
+ }
+
+ if (_gunRect.contains(event.mousePos) && BF_GLOBALS.getFlag(fGunLoaded)) {
+ BF_GLOBALS.clearFlag(fGunLoaded);
+ v = (BF_GLOBALS.getFlag(fGunLoaded) ? 1 : 0) * (BF_GLOBALS.getFlag(fLoadedSpare) ? 2 : 1);
+
+ if (v != 2)
+ BF_GLOBALS.clearFlag(fLoadedSpare);
+ }
+
+ draw();
+ }
+
+ return true;
+
+ case EVENT_KEYPRESS:
+ if ((event.kbd.keycode == Common::KEYCODE_ESCAPE) || (event.kbd.keycode == Common::KEYCODE_RETURN)) {
+ // Escape pressed, so flag to close dialog
+ _closeFlag = true;
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+void AmmoBeltDialog::draw() {
+ Rect bounds = _bounds;
+
+ if (!_savedArea) {
+ // Save the covered background area
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds);
+ } else {
+ bounds.moveTo(0, 0);
+ }
+
+ // Draw the dialog image
+ g_globals->gfxManager().copyFrom(_surface, bounds.left, bounds.top);
+
+ // Setup clip flags
+ bool clip1 = true, clip2 = true;
+ bool gunLoaded = BF_GLOBALS.getFlag(fGunLoaded);
+ if (gunLoaded) {
+ // A clip is currently loaded. Hide the appropriate clip
+ if (BF_GLOBALS.getFlag(fLoadedSpare))
+ clip2 = false;
+ else
+ clip1 = false;
+ }
+
+ // Draw the first clip if necessary
+ if (clip1) {
+ GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip1Bullets);
+ _clip1Rect.resize(clipSurface, _clip1Rect.left, _clip1Rect.top, 100);
+ g_globals->gfxManager().copyFrom(clipSurface, bounds.left + _clip1Rect.left,
+ bounds.top + _clip1Rect.top);
+ }
+
+ // Draw the second clip if necessary
+ if (clip2) {
+ GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip2Bullets);
+ _clip2Rect.resize(clipSurface, _clip2Rect.left, _clip2Rect.top, 100);
+ g_globals->gfxManager().copyFrom(clipSurface, bounds.left + _clip2Rect.left,
+ bounds.top + _clip2Rect.top);
+ }
+
+ // If a clip is loaded, draw the 'loaded' portion of the gun
+ if (gunLoaded) {
+ GfxSurface loadedSurface = surfaceFromRes(9, 7, 1);
+ _loadedRect.resize(loadedSurface, _loadedRect.left, _loadedRect.top, 100);
+ g_globals->gfxManager().copyFrom(loadedSurface, bounds.left + _loadedRect.left,
+ bounds.top + _loadedRect.top);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+RadioConvDialog::RadioConvDialog() : GfxDialog() {
+ int idx;
+
+ // Set up the list of buttons
+ int maxWidth = 0;
+ for (idx = 0; idx < 8; ++idx) {
+ _buttons[idx].setText(RADIO_BTN_LIST[idx]);
+ maxWidth = MAX(maxWidth, (int)_buttons[idx]._bounds.width());
+
+ add(&_buttons[idx]);
+ }
+
+ // Set up the button positions and add them to the dialog
+ for (idx = 0; idx < 8; ++idx) {
+ _buttons[idx]._bounds.moveTo((idx % 2) * maxWidth + 2,
+ idx / 2 * _buttons[idx]._bounds.height() + 2);
+ _buttons[idx]._bounds.setWidth(maxWidth);
+
+ add(&_buttons[idx]);
+ }
+
+ // Set the dialog size and position
+ setDefaults();
+ setTopLeft(8, 92);
+
+ BF_GLOBALS._events.setCursor(CURSOR_ARROW);
+}
+
+RadioConvDialog::~RadioConvDialog() {
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+}
+
+int RadioConvDialog::execute() {
+ GfxButton *btn = GfxDialog::execute();
+
+ // Get which button was pressed
+ int btnIndex = -1;
+ for (int idx = 0; idx < 8; ++idx) {
+ if (btn == &_buttons[idx]) {
+ btnIndex = idx;
+ break;
+ }
+ }
+
+ return btnIndex;
+}
+
+int RadioConvDialog::show() {
+ // Show the dialog
+ RadioConvDialog *dlg = new RadioConvDialog();
+ dlg->draw();
+
+ int btnIndex = dlg->execute();
+
+ // Close the dialog
+ dlg->remove();
+ delete dlg;
+
+ return btnIndex;
+}
+
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_dialogs.h b/engines/tsage/blue_force/blueforce_dialogs.h
new file mode 100644
index 0000000000..ca51c97aa2
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_dialogs.h
@@ -0,0 +1,92 @@
+/* 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 TSAGE_BLUEFORCE_DIALOGS_H
+#define TSAGE_BLUEFORCE_DIALOGS_H
+
+#include "gui/options.h"
+#include "tsage/dialogs.h"
+#include "tsage/events.h"
+#include "tsage/graphics.h"
+#include "common/list.h"
+#include "common/rect.h"
+#include "common/system.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class RightClickDialog : public GfxDialog {
+private:
+ GfxSurface _surface;
+ Visage _btnImages;
+ Rect _rectList1[5];
+ Rect _rectList2[5];
+ Rect _rectList3[5];
+ Rect _rectList4[5];
+
+ int _highlightedAction;
+ int _selectedAction;
+public:
+ RightClickDialog();
+ ~RightClickDialog();
+
+ virtual void draw();
+ virtual bool process(Event &event);
+ void execute();
+};
+
+class AmmoBeltDialog : public GfxDialog {
+private:
+ GfxSurface _surface;
+ Visage _cursorImages;
+ Rect _dialogRect, _loadedRect, _gunRect, _clip1Rect, _clip2Rect;
+ CursorType _cursorNum;
+ int _inDialog;
+ bool _closeFlag;
+public:
+ AmmoBeltDialog();
+ ~AmmoBeltDialog();
+
+ virtual void draw();
+ virtual bool process(Event &event);
+ void execute();
+};
+
+class RadioConvDialog : public GfxDialog {
+private:
+ GfxButton _buttons[8];
+public:
+ RadioConvDialog();
+ virtual ~RadioConvDialog();
+ int execute();
+
+ static int show();
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
new file mode 100644
index 0000000000..130cf557b2
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -0,0 +1,1548 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/blue_force/blueforce_scenes0.h"
+#include "tsage/blue_force/blueforce_scenes1.h"
+#include "tsage/blue_force/blueforce_scenes2.h"
+#include "tsage/blue_force/blueforce_scenes3.h"
+#include "tsage/blue_force/blueforce_scenes4.h"
+#include "tsage/blue_force/blueforce_scenes5.h"
+#include "tsage/blue_force/blueforce_scenes6.h"
+#include "tsage/blue_force/blueforce_scenes7.h"
+#include "tsage/blue_force/blueforce_scenes8.h"
+#include "tsage/blue_force/blueforce_scenes9.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/graphics.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+void BlueForceGame::start() {
+ // Start the game
+ g_globals->_sceneManager.changeScene(20);
+}
+
+Scene *BlueForceGame::createScene(int sceneNumber) {
+ switch (sceneNumber) {
+ /* Scene Group #0 */
+ case 20:
+ // Tsunami Title Screen
+ return new Scene20();
+ case 50:
+ // Map screen
+ return new Scene50();
+ case 60:
+ // Motorcycle
+ return new Scene60();
+ /* Scene Group #1 */
+ case 100:
+ // Tsnunami Title Screen #2
+ return new Scene100();
+ case 109:
+ // Introduction - Bar Room
+ return new Scene109();
+ case 110:
+ // Introduction - Outside the bar
+ return new Scene110();
+ case 114:
+ // Outside Tony's Bar
+ return new Scene114();
+ case 115:
+ // Inside Tony's Bar
+ return new Scene115();
+ case 125:
+ // Intro - Chase in the city
+ return new Scene125();
+ case 140:
+ // Intro - Burglar near the House
+ return new Scene140();
+ case 150:
+ // Intro - Burglar inside the house
+ return new Scene150();
+ case 160:
+ // Intro - Burial
+ return new Scene160();
+ case 180:
+ // Front of Home
+ return new Scene180();
+ case 190:
+ // Front of Police Station
+ return new Scene190();
+ case 200:
+ // Credits - Motorcycle Training
+ return new Scene200();
+ case 210:
+ // Credits - Car Training
+ return new Scene210();
+ case 220:
+ // Credits - Martial Arts
+ return new Scene220();
+ case 225:
+ // Credits - Gun Training
+ return new Scene225();
+ case 265:
+ // Intro - Graduation Article
+ return new Scene265();
+ case 270:
+ // Living Room & Kitchen
+ return new Scene270();
+ case 271:
+ // Living Room & Kitchen #2
+ return new Scene271();
+ case 280:
+ // Bedroom Flashback cut-scene
+ return new Scene280();
+ case 300:
+ // Outside Police Station
+ return new Scene300();
+ case 315:
+ // Inside Police Station
+ return new Scene315();
+ case 325:
+ // Police Station Conference Room
+ return new Scene325();
+ case 330:
+ // Approaching Marina
+ return new Scene330();
+ case 340:
+ // Marina, Domestic Disturbance
+ return new Scene340();
+ case 342:
+ // Marina, Normal
+ return new Scene342();
+ case 350:
+ // Marina, Outside Boat
+ return new Scene350();
+ case 355:
+ // Future Wave Exterior
+ return new Scene355();
+ case 360:
+ // Future Wave Interior
+ return new Scene360();
+ case 370:
+ // Future Wave Bedroom
+ return new Scene370();
+ case 380:
+ // Outside City Hall & Jail
+ return new Scene380();
+ case 385:
+ // City Hall
+ return new Scene385();
+ case 390:
+ // City Jail
+ return new Scene390();
+ case 410:
+ // Traffic Stop Gang Members
+ return new Scene410();
+ case 415:
+ // Searching Truck
+ return new Scene415();
+ case 440:
+ // Outside Alleycat Bowl
+ return new Scene440();
+ case 450:
+ // Inside Alleycat Bowl
+ return new Scene450();
+ case 550:
+ // Outside Bikini Hut
+ return new Scene550();
+ case 551:
+ // Outside Bikini Hut (Drunk Stop)
+ return new Scene551();
+ case 560:
+ // Study
+ return new Scene560();
+ case 570:
+ // Computer
+ return new Scene570();
+ case 580:
+ // Child Protective Services Parking Lot
+ return new Scene580();
+ case 590:
+ // Child Protective Services
+ return new Scene590();
+ case 600:
+ // Crash cut-scene
+ return new Scene600();
+ case 620:
+ // Hospital cut-scene
+ return new Scene620();
+ case 666:
+ // Death scene
+ return new Scene666();
+ case 690:
+ // Decking
+ return new Scene690();
+ case 710:
+ // Beach
+ return new Scene710();
+ case 800:
+ // Jamison & Ryan
+ return new Scene800();
+ case 810:
+ // Lyle's Office
+ return new Scene810();
+ case 820:
+ // Microfiche Reader
+ return new Scene820();
+ case 830:
+ // Outside Boat Rentals
+ return new Scene830();
+ case 840:
+ // Boat Rentals
+ return new Scene840();
+ case 850:
+ // Boat Leaving/Entering Marina
+ return new Scene850();
+ case 860:
+ // Boat Entering Cove
+ return new Scene860();
+ case 870:
+ // Cove Beach
+ return new Scene870();
+ case 880:
+ // Beach Path
+ return new Scene880();
+ case 900:
+ // Outside the Warehouse
+ return new Scene900();
+ case 910:
+ // Inside the Warehouse
+ return new Scene910();
+ case 920:
+ // Inside the Warehouse: Secret room
+ return new Scene920();
+ case 930:
+ // Inside the caravan
+ return new Scene930();
+ case 935:
+ // Hidden in the wardrobe
+ return new Scene935();
+ case 940:
+ // Jail ending animation
+ return new Scene940();
+ default:
+ error("Unknown scene number - %d", sceneNumber);
+ break;
+ }
+}
+
+/**
+ * Returns true if it is currently okay to restore a game
+ */
+bool BlueForceGame::canLoadGameStateCurrently() {
+ return true;
+}
+
+/**
+ * Returns true if it is currently okay to save the game
+ */
+bool BlueForceGame::canSaveGameStateCurrently() {
+ return true;
+}
+
+void BlueForceGame::rightClick() {
+ RightClickDialog *dlg = new RightClickDialog();
+ dlg->execute();
+ delete dlg;
+}
+
+void BlueForceGame::processEvent(Event &event) {
+ if (event.eventType == EVENT_KEYPRESS) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_F1:
+ // F1 - Help
+ MessageDialog::show(HELP_MSG, OK_BTN_STRING);
+ break;
+
+ case Common::KEYCODE_F2:
+ // F2 - Sound Options
+ SoundDialog::execute();
+ break;
+
+ case Common::KEYCODE_F3:
+ // F3 - Quit
+ quitGame();
+ event.handled = false;
+ break;
+
+ case Common::KEYCODE_F4:
+ // F4 - Restart
+ restartGame();
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F7:
+ // F7 - Restore
+ restoreGame();
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F10:
+ // F10 - Pause
+ GfxDialog::setPalette();
+ MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING);
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+AObjectArray::AObjectArray(): EventHandler() {
+ _inUse = false;
+ clear();
+}
+
+void AObjectArray::clear() {
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i)
+ _objList[i] = NULL;
+}
+
+void AObjectArray::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i)
+ SYNC_POINTER(_objList[i]);
+}
+
+void AObjectArray::process(Event &event) {
+ if (_inUse)
+ error("Array error");
+ _inUse = true;
+
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
+ if (_objList[i])
+ _objList[i]->process(event);
+ }
+
+ _inUse = false;
+}
+
+void AObjectArray::dispatch() {
+ if (_inUse)
+ error("Array error");
+ _inUse = true;
+
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
+ if (_objList[i])
+ _objList[i]->dispatch();
+ }
+
+ _inUse = false;
+}
+
+int AObjectArray::getNewIndex() {
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
+ if (!_objList[i])
+ return i;
+ }
+ error("AObjectArray too full.");
+}
+
+void AObjectArray::add(EventHandler *obj) {
+ int idx = getNewIndex();
+ _objList[idx] = obj;
+}
+
+void AObjectArray::remove(EventHandler *obj) {
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
+ if (_objList[i] == obj) {
+ _objList[i] = NULL;
+ return;
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Timer::Timer() {
+ _endFrame = 0;
+ _endHandler = NULL;
+ _tickAction = NULL;
+}
+
+void Timer::remove() {
+ _endFrame = 0;
+ _endHandler = NULL;
+
+ ((Scene100 *)BF_GLOBALS._sceneManager._scene)->removeTimer(this);
+}
+
+void Timer::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+ SYNC_POINTER(_tickAction);
+ SYNC_POINTER(_endHandler);
+ s.syncAsUint32LE(_endFrame);
+}
+
+void Timer::signal() {
+ assert(_endHandler);
+ EventHandler *item = _endHandler;
+ remove();
+ item->signal();
+}
+
+void Timer::dispatch() {
+ if (_tickAction)
+ _tickAction->dispatch();
+
+ if (_endFrame) {
+ uint32 frameNumber = BF_GLOBALS._events.getFrameNumber();
+ if (frameNumber > _endFrame)
+ // Timer has expired
+ signal();
+ }
+}
+
+void Timer::set(uint32 delay, EventHandler *endHandler) {
+ assert(delay != 0);
+
+ _endFrame = BF_GLOBALS._sceneHandler->getFrameDifference() + delay;
+ _endHandler = endHandler;
+
+ ((SceneExt *)BF_GLOBALS._sceneManager._scene)->addTimer(this);
+}
+
+/*--------------------------------------------------------------------------*/
+
+TimerExt::TimerExt(): Timer() {
+ _action = NULL;
+}
+
+void TimerExt::set(uint32 delay, EventHandler *endHandler, Action *newAction) {
+ _newAction = newAction;
+ Timer::set(delay, endHandler);
+}
+
+void TimerExt::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+ SYNC_POINTER(_action);
+}
+
+void TimerExt::remove() {
+ _action = NULL;
+ Timer::remove();
+}
+
+void TimerExt::signal() {
+ EventHandler *endHandler = _endHandler;
+ Action *newAction = _newAction;
+ remove();
+
+ // If the end action doesn't have an action anymore, set it to the specified new action
+ assert(endHandler);
+ if (!endHandler->_action)
+ endHandler->setAction(newAction);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void SceneItemType2::startMove(SceneObject *sceneObj, va_list va) {
+}
+
+/*--------------------------------------------------------------------------*/
+
+void NamedObject::postInit(SceneObjectList *OwnerList) {
+ _lookLineNum = _talkLineNum = _useLineNum = -1;
+ SceneObject::postInit();
+}
+
+void NamedObject::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_resNum);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_talkLineNum);
+ s.syncAsSint16LE(_useLineNum);
+}
+
+bool NamedObject::startAction(CursorType action, Event &event) {
+ bool handled = true;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_lookLineNum == -1)
+ handled = false;
+ else
+ SceneItem::display2(_resNum, _lookLineNum);
+ break;
+ case CURSOR_USE:
+ if (_useLineNum == -1)
+ handled = false;
+ else
+ SceneItem::display2(_resNum, _useLineNum);
+ break;
+ case CURSOR_TALK:
+ if (_talkLineNum == -1)
+ handled = false;
+ else
+ SceneItem::display2(_resNum, _talkLineNum);
+ break;
+ default:
+ handled = false;
+ break;
+ }
+
+ if (!handled)
+ handled = ((SceneExt *)BF_GLOBALS._sceneManager._scene)->display(action);
+ return handled;
+}
+
+void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ switch (mode) {
+ case 2:
+ g_globals->_sceneItems.push_front(this);
+ break;
+ case 4:
+ g_globals->_sceneItems.addBefore(item, this);
+ break;
+ case 5:
+ g_globals->_sceneItems.addAfter(item, this);
+ break;
+ default:
+ g_globals->_sceneItems.push_back(this);
+ break;
+ }
+}
+
+void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+}
+
+/*--------------------------------------------------------------------------*/
+
+CountdownObject::CountdownObject(): NamedObject() {
+ _countDown = 0;
+}
+
+void CountdownObject::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_countDown);
+}
+
+void CountdownObject::dispatch() {
+ int frameNum = _frame;
+ SceneObject::dispatch();
+
+ if ((frameNum != _frame) && (_countDown > 0)) {
+ if (--_countDown == 0) {
+ animate(ANIM_MODE_NONE, 0);
+ _frame = 1;
+ }
+ }
+}
+
+void CountdownObject::fixCountdown(int mode, ...) {
+ if (mode == 8) {
+ va_list va;
+ va_start(va, mode);
+
+ _countDown = va_arg(va, int);
+ animate(ANIM_MODE_8, _countDown, NULL);
+ va_end(va);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+FollowerObject::FollowerObject(): NamedObject() {
+ _object = NULL;
+}
+
+void FollowerObject::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ SYNC_POINTER(_object);
+}
+
+void FollowerObject::remove() {
+ NamedObject::remove();
+ _object = NULL;
+}
+
+void FollowerObject::dispatch() {
+ SceneObject::dispatch();
+ assert(_object);
+
+ if ((_object->_flags & OBJFLAG_HIDE) || ((_object->_visage != 307) &&
+ ((_object->_visage != 308) || (_object->_strip != 1)))) {
+ hide();
+ } else if ((_object->_visage != 308) || (_object->_strip != 1)) {
+ show();
+ setStrip(_object->_strip);
+ setPosition(_object->_position, _object->_yDiff);
+ }
+}
+
+void FollowerObject::reposition() {
+ assert(_object);
+ setStrip(_object->_strip);
+ setPosition(_object->_position, _object->_yDiff);
+ NamedObject::reposition();
+}
+
+void FollowerObject::setup(SceneObject *object, int visage, int frameNum, int yDiff) {
+ SceneObject::postInit();
+ _object = object;
+ _yDiff = yDiff;
+ setVisage(visage);
+ setFrame(frameNum);
+
+ dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+FocusObject::FocusObject(): NamedObject() {
+ _img = surfaceFromRes(1, 5, 7);
+}
+
+void FocusObject::postInit(SceneObjectList *OwnerList) {
+ NamedObject::postInit(OwnerList);
+ _resNum = 560;
+ _lookLineNum = 43;
+ _talkLineNum = 44;
+ _useLineNum = -1;
+ _v90 = 0;
+ _v92 = 1;
+
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ scene->_focusObject = this;
+ BF_GLOBALS._sceneItems.push_front(this);
+}
+
+void FocusObject::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_v90);
+ s.syncAsSint16LE(_v92);
+}
+
+void FocusObject::remove() {
+ BF_GLOBALS._sceneItems.remove(this);
+
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ if (scene->_focusObject == this)
+ scene->_focusObject = NULL;
+
+ BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor());
+ NamedObject::remove();
+}
+
+void FocusObject::process(Event &event) {
+ if (BF_GLOBALS._player._enabled) {
+ if (_bounds.contains(event.mousePos)) {
+ // Reset the cursor back to normal
+ BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor());
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
+ (event.btnState == 3)) {
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+ event.handled = true;
+ }
+ } else if (event.mousePos.y < 168) {
+ // Change the cursor to an 'Exit' image
+ BF_GLOBALS._events.setCursor(_img);
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ // Remove the object from display
+ event.handled = true;
+ remove();
+ }
+ }
+ }
+
+ if (_action)
+ _action->process(event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SceneExt::SceneExt(): Scene() {
+ _stripManager._onBegin = SceneExt::startStrip;
+ _stripManager._onEnd = SceneExt::endStrip;
+
+ _field372 = _field37A = 0;
+ _savedPlayerEnabled = false;
+ _savedUiEnabled = false;
+ _savedCanWalk = false;
+ _focusObject = NULL;
+ _cursorVisage.setVisage(1, 8);
+}
+
+void SceneExt::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit(OwnerList);
+ if (BF_GLOBALS._dayNumber) {
+ // Blank out the bottom portion of the screen
+ BF_GLOBALS._interfaceY = UI_INTERFACE_Y;
+
+ Rect r(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT);
+ BF_GLOBALS.gfxManager().getSurface().fillRect(r, 0);
+ }
+}
+
+void SceneExt::remove() {
+ T2_GLOBALS._uiElements.hide();
+ T2_GLOBALS._uiElements.resetClear();
+
+ // Below code originally in Blue Force Scene::remove(). Placed here to avoid contaminating
+ // core class with Blue Force specific code
+ if (_action) {
+ if (_action->_endHandler)
+ _action->_endHandler = NULL;
+ _action->remove();
+ }
+
+ _focusObject = NULL;
+}
+
+void SceneExt::process(Event &event) {
+ _objArray2.process(event);
+ if (!event.handled)
+ Scene::process(event);
+}
+
+void SceneExt::dispatch() {
+ _timerList.dispatch();
+
+ if (_field37A) {
+ if ((--_field37A == 0) && BF_GLOBALS._dayNumber) {
+ if (T2_GLOBALS._uiElements._active && BF_GLOBALS._player._enabled) {
+ T2_GLOBALS._uiElements.show();
+ }
+
+ _field37A = 0;
+ }
+ }
+
+ Scene::dispatch();
+}
+
+void SceneExt::loadScene(int sceneNum) {
+ Scene::loadScene(sceneNum);
+
+ _v51C34.top = 0;
+ _v51C34.bottom = 300;
+}
+
+void SceneExt::checkGun() {
+ // Remove a bullet from the currently loaded clip
+ if (BF_GLOBALS.getFlag(fLoadedSpare) && (BF_GLOBALS._clip2Bullets > 0)) {
+ if (--BF_GLOBALS._clip2Bullets == 0)
+ BF_GLOBALS.clearFlag(fGunLoaded);
+ } else {
+ if (BF_GLOBALS._clip1Bullets > 0)
+ --BF_GLOBALS._clip1Bullets;
+
+ if (!BF_GLOBALS._clip1Bullets)
+ BF_GLOBALS.clearFlag(fGunLoaded);
+ }
+
+ BF_GLOBALS._sound3.play(4);
+}
+
+bool SceneExt::display(CursorType action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2));
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2) + 6);
+ break;
+ case CURSOR_TALK:
+ SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2) + 3);
+ break;
+ case INV_COLT45:
+ gunDisplay();
+ break;
+ default:
+ if (action < BF_LAST_INVENT)
+ SceneItem::display2(9002, (int)action);
+ else
+ return false;
+ break;
+ }
+
+ return true;
+}
+
+void SceneExt::fadeOut() {
+ uint32 black = 0;
+ BF_GLOBALS._scenePalette.fade((const byte *)&black, false, 100);
+}
+
+void SceneExt::gunDisplay() {
+ if (!BF_GLOBALS.getFlag(gunDrawn)) {
+ // Gun not drawn
+ SceneItem::display2(1, BF_GLOBALS.getFlag(fCanDrawGun) ? 0 : 4);
+ } else if (!BF_GLOBALS.getFlag(fGunLoaded)) {
+ // Gun not loaded
+ SceneItem::display2(1, 1);
+ } else if (!BF_GLOBALS.getHasBullets()) {
+ // Out of ammunition
+ SceneItem::display2(1, 2);
+ } else {
+ // Check scene for whether gun can fire
+ checkGun();
+ }
+}
+
+void SceneExt::startStrip() {
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ scene->_field372 = 1;
+ scene->_savedPlayerEnabled = BF_GLOBALS._player._enabled;
+
+ if (scene->_savedPlayerEnabled) {
+ scene->_savedUiEnabled = BF_GLOBALS._player._uiEnabled;
+ scene->_savedCanWalk = BF_GLOBALS._player._canWalk;
+ BF_GLOBALS._player.disableControl();
+
+ if (!BF_GLOBALS._v50696 && T2_GLOBALS._uiElements._active)
+ T2_GLOBALS._uiElements.hide();
+ }
+}
+
+void SceneExt::endStrip() {
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ scene->_field372 = 0;
+
+ if (scene->_savedPlayerEnabled) {
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._uiEnabled = scene->_savedUiEnabled;
+ BF_GLOBALS._player._canWalk = scene->_savedCanWalk;
+
+ if (!BF_GLOBALS._v50696 && T2_GLOBALS._uiElements._active)
+ T2_GLOBALS._uiElements.show();
+ }
+}
+
+void SceneExt::clearScreen() {
+ BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
+}
+
+/*--------------------------------------------------------------------------*/
+
+PalettedScene::PalettedScene(): SceneExt() {
+ _field794 = 0;
+}
+
+void PalettedScene::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field794);
+}
+
+void PalettedScene::postInit(SceneObjectList *OwnerList) {
+ _field794 = 0;
+ _palette._field412 = 1;
+ SceneExt::postInit(OwnerList);
+}
+
+void PalettedScene::remove() {
+ SceneExt::remove();
+ if (_field794 == 1) {
+ for (SynchronizedList<SceneObject *>::iterator i = BF_GLOBALS._sceneObjects->begin();
+ i != BF_GLOBALS._sceneObjects->end(); ++i)
+ (*i)->remove();
+
+ BF_GLOBALS._sceneObjects->draw();
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager._hasPalette = true;
+ }
+
+ BF_GLOBALS._scenePalette._field412 = 0;
+}
+
+PaletteFader *PalettedScene::addFader(const byte *arrBufferRGB, int step, Action *action) {
+ _field794 = 1;
+ return BF_GLOBALS._scenePalette.addFader(arrBufferRGB, 1, step, action);
+}
+
+void PalettedScene::add2Faders(const byte *arrBufferRGB, int step, int paletteNum, Action *action) {
+ BF_GLOBALS._scenePalette.addFader(arrBufferRGB, 1, 100, NULL);
+ _palette.loadPalette(paletteNum);
+ _palette.loadPalette(2);
+ BF_GLOBALS._scenePalette.addFader(_palette._palette, 256, step, action);
+}
+
+void PalettedScene::transition(const byte *arrBufferRGB, int percent, int paletteNum, Action *action, int fromColor1, int fromColor2, int toColor1, int toColor2, bool flag) {
+ byte tmpPalette[768];
+
+ _palette.loadPalette(paletteNum);
+ _palette.loadPalette(2);
+ if (flag) {
+ for (int i = fromColor1; i <= fromColor2; i++) {
+ tmpPalette[(3 * i)] = BF_GLOBALS._scenePalette._palette[(3 * i)];
+ tmpPalette[(3 * i) + 1] = BF_GLOBALS._scenePalette._palette[(3 * i) + 1];
+ tmpPalette[(3 * i) + 2] = BF_GLOBALS._scenePalette._palette[(3 * i) + 2];
+ }
+ } else {
+ for (int i = fromColor1; i <= fromColor2; i++) {
+ tmpPalette[(3 * i)] = _palette._palette[(3 * i)];
+ tmpPalette[(3 * i) + 1] = _palette._palette[(3 * i) + 1];
+ tmpPalette[(3 * i) + 2] = _palette._palette[(3 * i) + 2];
+ }
+ }
+
+ for (int i = toColor1; i <= toColor2; i++) {
+ tmpPalette[i * 3] = _palette._palette[i * 3] - ((_palette._palette[i * 3] - arrBufferRGB[i * 3]) * (100 - percent)) / 100;
+ tmpPalette[i * 3 + 1] = _palette._palette[i * 3 + 1] - ((_palette._palette[i * 3 + 1] - arrBufferRGB[i * 3 + 1]) * (100 - percent)) / 100;
+ tmpPalette[i * 3 + 2] = _palette._palette[i * 3 + 2] - ((_palette._palette[i * 3 + 2] - arrBufferRGB[i * 3 + 2]) * (100 - percent)) / 100;
+ }
+
+ BF_GLOBALS._scenePalette.addFader((const byte *)tmpPalette, 256, 100, action);
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+void SceneHandlerExt::postInit(SceneObjectList *OwnerList) {
+ SceneHandler::postInit(OwnerList);
+
+ // Load the low end palette data
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ BF_GLOBALS._scenePalette.refresh();
+}
+
+void SceneHandlerExt::process(Event &event) {
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ if (scene && scene->_focusObject)
+ scene->_focusObject->process(event);
+
+ if (T2_GLOBALS._uiElements._active) {
+ T2_GLOBALS._uiElements.process(event);
+ if (event.handled)
+ return;
+ }
+
+ // If the strip proxy is currently being controlled by the strip manager,
+ // then pass all events to it first
+ if (BF_GLOBALS._stripProxy._action) {
+ BF_GLOBALS._stripProxy._action->process(event);
+ if (event.handled)
+ return;
+ }
+
+ // If the user clicks the button whislt the introduction is active, prompt for playing the game
+ if ((BF_GLOBALS._dayNumber == 0) && (event.eventType == EVENT_BUTTON_DOWN)) {
+ // Prompt user for whether to start play or watch introduction
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+
+ if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {
+ // Start the game
+ BF_GLOBALS._dayNumber = 1;
+ BF_GLOBALS._sceneManager.changeScene(190);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ }
+
+ event.handled = true;
+ }
+
+ SceneHandler::process(event);
+}
+
+void SceneHandlerExt::playerAction(Event &event) {
+ if (BF_GLOBALS._events.getCursor() == INV_DOG_WHISTLE) {
+ SceneItem::display2(1, 6);
+ event.handled = true;
+ }
+}
+
+void SceneHandlerExt::processEnd(Event &event) {
+ // Check for a fallback text display for the given cursor/item being used in the scene
+ if (!event.handled && BF_GLOBALS._sceneManager._scene) {
+ CursorType cursor = BF_GLOBALS._events.getCursor();
+ if (((SceneExt *)BF_GLOBALS._sceneManager._scene)->display(cursor))
+ event.handled = true;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+BlueForceInvObjectList::BlueForceInvObjectList():
+ _none(9, 5, 1),
+ _colt45(9, 1, 1),
+ _ammoClip(9, 4, 2),
+ _spareClip(9, 4, 3),
+ _handcuffs(9, 1, 4),
+ _greensGun(9, 1, 5),
+ _ticketBook(9, 1, 6),
+ _mirandaCard(9, 1, 7),
+ _forestRap(9, 1, 8),
+ _greenId(9, 1, 9),
+ _baseballCard(9, 1, 10),
+ _bookingGreen(9, 1, 11),
+ _flare(9, 1, 12),
+ _cobbRap(9, 1, 13),
+ _bullet22(9, 1, 14),
+ _autoRifle(9, 1, 15),
+ _wig(9, 1, 16),
+ _frankieId(9, 1, 17),
+ _tyroneId(9, 1, 18),
+ _snub22(9, 1, 19),
+ _bug(1, 1, 1),
+ _bookingFrankie(9, 2, 1),
+ _bookingGang(9, 2, 2),
+ _fbiTeletype(9, 2, 3),
+ _daNote(9, 2, 4),
+ _printOut(9, 2, 5),
+ _warehouseKeys(9, 2, 6),
+ _centerPunch(9, 2, 7),
+ _tranqGun(9, 2, 8),
+ _hook(9, 2, 9),
+ _rags(9, 2, 10),
+ _jar(9, 2, 11),
+ _screwdriver(9, 2, 12),
+ _dFloppy(9, 2, 13),
+ _blankDisk(9, 2, 14),
+ _stick(9, 2, 15),
+ _crate1(9, 2, 16),
+ _crate2(9, 2, 17),
+ _shoebox(9, 2, 18),
+ _badge(9, 2, 19),
+ _bug2(1, 1, 1),
+ _rentalCoupon(9, 3, 1),
+ _nickel(9, 3, 2),
+ _lyleCard(9, 3, 3),
+ _carterNote(9, 3, 4),
+ _mugshot(9, 3, 5),
+ _clipping(9, 3, 6),
+ _microfilm(9, 3, 7),
+ _waveKeys(9, 3, 8),
+ _rentalKeys(9, 3, 9),
+ _napkin(9, 3, 10),
+ _dmvPrintout(9, 3, 11),
+ _fishingNet(9, 3, 12),
+ _id(9, 3, 13),
+ _bullets9mm(9, 3, 14),
+ _schedule(9, 3, 15),
+ _grenades(9, 3, 16),
+ _yellowCord(9, 3, 17),
+ _halfYellowCord(9, 3, 18),
+ _blackCord(9, 3, 19),
+ _bug3(1, 1, 1),
+ _halfBlackCord(9, 4, 1),
+ _warrant(9, 4, 2),
+ _jacket(9, 4, 3),
+ _greensKnife(9, 4, 4),
+ _dogWhistle(9, 4, 5),
+ _ammoBelt(9, 1, 2),
+ _alleyCatKey(9, 4, 7) {
+
+ // Add the items to the list
+ _itemList.push_back(&_none);
+ _itemList.push_back(&_colt45);
+ _itemList.push_back(&_ammoClip);
+ _itemList.push_back(&_spareClip);
+ _itemList.push_back(&_handcuffs);
+ _itemList.push_back(&_greensGun);
+ _itemList.push_back(&_ticketBook);
+ _itemList.push_back(&_mirandaCard);
+ _itemList.push_back(&_forestRap);
+ _itemList.push_back(&_greenId);
+ _itemList.push_back(&_baseballCard);
+ _itemList.push_back(&_bookingGreen);
+ _itemList.push_back(&_flare);
+ _itemList.push_back(&_cobbRap);
+ _itemList.push_back(&_bullet22);
+ _itemList.push_back(&_autoRifle);
+ _itemList.push_back(&_wig);
+ _itemList.push_back(&_frankieId);
+ _itemList.push_back(&_tyroneId);
+ _itemList.push_back(&_snub22);
+ _itemList.push_back(&_bug);
+ _itemList.push_back(&_bookingFrankie);
+ _itemList.push_back(&_bookingGang);
+ _itemList.push_back(&_fbiTeletype);
+ _itemList.push_back(&_daNote);
+ _itemList.push_back(&_printOut);
+ _itemList.push_back(&_warehouseKeys);
+ _itemList.push_back(&_centerPunch);
+ _itemList.push_back(&_tranqGun);
+ _itemList.push_back(&_hook);
+ _itemList.push_back(&_rags);
+ _itemList.push_back(&_jar);
+ _itemList.push_back(&_screwdriver);
+ _itemList.push_back(&_dFloppy);
+ _itemList.push_back(&_blankDisk);
+ _itemList.push_back(&_stick);
+ _itemList.push_back(&_crate1);
+ _itemList.push_back(&_crate2);
+ _itemList.push_back(&_shoebox);
+ _itemList.push_back(&_badge);
+ _itemList.push_back(&_bug2);
+ _itemList.push_back(&_rentalCoupon);
+ _itemList.push_back(&_nickel);
+ _itemList.push_back(&_lyleCard);
+ _itemList.push_back(&_carterNote);
+ _itemList.push_back(&_mugshot);
+ _itemList.push_back(&_clipping);
+ _itemList.push_back(&_microfilm);
+ _itemList.push_back(&_waveKeys);
+ _itemList.push_back(&_rentalKeys);
+ _itemList.push_back(&_napkin);
+ _itemList.push_back(&_dmvPrintout);
+ _itemList.push_back(&_fishingNet);
+ _itemList.push_back(&_id);
+ _itemList.push_back(&_bullets9mm);
+ _itemList.push_back(&_schedule);
+ _itemList.push_back(&_grenades);
+ _itemList.push_back(&_yellowCord);
+ _itemList.push_back(&_halfYellowCord);
+ _itemList.push_back(&_blackCord);
+ _itemList.push_back(&_bug3);
+ _itemList.push_back(&_halfBlackCord);
+ _itemList.push_back(&_warrant);
+ _itemList.push_back(&_jacket);
+ _itemList.push_back(&_greensKnife);
+ _itemList.push_back(&_dogWhistle);
+ _itemList.push_back(&_ammoBelt);
+ _itemList.push_back(&_alleyCatKey);
+}
+
+void BlueForceInvObjectList::reset() {
+ // Reset all object scene numbers
+ SynchronizedList<InvObject *>::iterator i;
+ for (i = _itemList.begin(); i != _itemList.end(); ++i) {
+ (*i)->_sceneNumber = 0;
+ }
+
+ // Set up default inventory
+ setObjectScene(INV_COLT45, 1);
+ setObjectScene(INV_HANDCUFFS, 1);
+ setObjectScene(INV_AMMO_BELT, 1);
+ setObjectScene(INV_ID, 1);
+
+ // Set default room for other objects
+ setObjectScene(INV_TICKET_BOOK, 60);
+ setObjectScene(INV_MIRANDA_CARD, 60);
+ setObjectScene(INV_FOREST_RAP, 320);
+ setObjectScene(INV_GREEN_ID, 370);
+ setObjectScene(INV_BASEBALL_CARD, 840);
+ setObjectScene(INV_BOOKING_GREEN, 390);
+ setObjectScene(INV_FLARE, 355);
+ setObjectScene(INV_COBB_RAP, 810);
+ setObjectScene(INV_22_BULLET, 415);
+ setObjectScene(INV_AUTO_RIFLE, 415);
+ setObjectScene(INV_WIG, 415);
+ setObjectScene(INV_FRANKIE_ID, 410);
+ setObjectScene(INV_TYRONE_ID, 410);
+ setObjectScene(INV_22_SNUB, 410);
+ setObjectScene(INV_FBI_TELETYPE, 320);
+ setObjectScene(INV_DA_NOTE, 320);
+ setObjectScene(INV_PRINT_OUT, 570);
+ setObjectScene(INV_WAREHOUSE_KEYS, 360);
+ setObjectScene(INV_CENTER_PUNCH, 0);
+ setObjectScene(INV_TRANQ_GUN, 830);
+ setObjectScene(INV_HOOK, 350);
+ setObjectScene(INV_RAGS, 870);
+ setObjectScene(INV_JAR, 870);
+ setObjectScene(INV_SCREWDRIVER, 355);
+ setObjectScene(INV_D_FLOPPY, 570);
+ setObjectScene(INV_BLANK_DISK, 560);
+ setObjectScene(INV_STICK, 710);
+ setObjectScene(INV_CRATE1, 710);
+ setObjectScene(INV_CRATE2, 870);
+ setObjectScene(INV_SHOEBOX, 270);
+ setObjectScene(INV_BADGE, 560);
+ setObjectScene(INV_RENTAL_COUPON, 0);
+ setObjectScene(INV_NICKEL, 560);
+ setObjectScene(INV_LYLE_CARD, 270);
+ setObjectScene(INV_CARTER_NOTE, 830);
+ setObjectScene(INV_MUG_SHOT, 810);
+ setObjectScene(INV_CLIPPING, 810);
+ setObjectScene(INV_MICROFILM, 810);
+ setObjectScene(INV_WAVE_KEYS, 840);
+ setObjectScene(INV_RENTAL_KEYS, 840);
+ setObjectScene(INV_NAPKIN, 115);
+ setObjectScene(INV_DMV_PRINTOUT, 810);
+ setObjectScene(INV_FISHING_NET, 830);
+ setObjectScene(INV_9MM_BULLETS, 930);
+ setObjectScene(INV_SCHEDULE, 930);
+ setObjectScene(INV_GRENADES, 355);
+ setObjectScene(INV_GREENS_KNIFE, 370);
+ setObjectScene(INV_JACKET, 880);
+ setObjectScene(INV_DOG_WHISTLE, 880);
+ setObjectScene(INV_YELLOW_CORD, 910);
+ setObjectScene(INV_BLACK_CORD, 910);
+
+ // Set up the select item handler method
+ T2_GLOBALS._onSelectItem = SelectItem;
+}
+
+void BlueForceInvObjectList::setObjectScene(int objectNum, int sceneNumber) {
+ // Find the appropriate object
+ int num = objectNum;
+ SynchronizedList<InvObject *>::iterator i = _itemList.begin();
+ while (num-- > 0) ++i;
+ (*i)->_sceneNumber = sceneNumber;
+
+ // If the item is the currently active one, default back to the use cursor
+ if (BF_GLOBALS._events.getCursor() == objectNum)
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+
+ // Update the user interface if necessary
+ T2_GLOBALS._uiElements.updateInventory();
+}
+
+void BlueForceInvObjectList::alterInventory(int mode) {
+ // Check for existing specific items in player's inventory
+ bool hasPrintout = getObjectScene(INV_PRINT_OUT) == 1;
+ bool hasRags = getObjectScene(INV_RAGS) == 1;
+ bool hasJar = getObjectScene(INV_JAR) == 1;
+ bool hasNickel = getObjectScene(INV_NICKEL) == 1;
+ bool hasCrate1 = getObjectScene(INV_CRATE1) == 1; //di
+ bool hasForestRap = getObjectScene(INV_FOREST_RAP) == 1;
+ bool hasRentalCoupon = getObjectScene(INV_RENTAL_COUPON) == 1; //si
+ bool hasWarehouseKeys = getObjectScene(INV_WAREHOUSE_KEYS) == 1;
+ bool hasCobbRap = getObjectScene(INV_COBB_RAP) == 1;
+ bool hasHook = getObjectScene(INV_HOOK) == 1;
+ bool hasMugShot = getObjectScene(INV_MUG_SHOT) == 1;
+
+ // Remove any items currently in player's inventory
+ SynchronizedList<InvObject *>::iterator i;
+ for (i = _itemList.begin(); i != _itemList.end(); ++i) {
+ if ((*i)->_sceneNumber == 1)
+ (*i)->_sceneNumber = 0;
+ }
+
+ // Give basic set of items back into inventory
+ setObjectScene(INV_COLT45, 1);
+ setObjectScene(INV_HANDCUFFS, 1);
+ setObjectScene(INV_AMMO_BELT, 1);
+ setObjectScene(INV_ID, 1);
+
+ // Reset ticket book and miranda card back to motorcycle
+ setObjectScene(INV_TICKET_BOOK, 60);
+ setObjectScene(INV_MIRANDA_CARD, 60);
+
+ BF_GLOBALS._v4CEC4 = 0;
+
+ switch (mode) {
+ case 2:
+ if (hasPrintout)
+ setObjectScene(INV_PRINT_OUT, 1);
+ if (hasNickel)
+ setObjectScene(INV_NICKEL, 1);
+ if (hasForestRap)
+ setObjectScene(INV_FOREST_RAP, 1);
+ if (hasCrate1)
+ setObjectScene(INV_CRATE1, 1);
+ if (hasRentalCoupon)
+ setObjectScene(INV_RENTAL_COUPON, 1);
+ if (hasHook)
+ setObjectScene(INV_HOOK, 1);
+ break;
+ case 3:
+ if (hasPrintout)
+ setObjectScene(INV_PRINT_OUT, 1);
+ if (hasNickel)
+ setObjectScene(INV_NICKEL, 1);
+ if (hasForestRap)
+ setObjectScene(INV_FOREST_RAP, 1);
+ if (hasCrate1)
+ setObjectScene(INV_CRATE1, 1);
+ if (hasRentalCoupon)
+ setObjectScene(INV_RENTAL_COUPON, 1);
+ if (hasCobbRap)
+ setObjectScene(INV_COBB_RAP, 1);
+ if (hasHook)
+ setObjectScene(INV_HOOK, 1);
+ if (hasMugShot)
+ setObjectScene(INV_MUG_SHOT, 1);
+ break;
+ case 4:
+ if (hasNickel)
+ setObjectScene(INV_NICKEL, 1);
+ if (hasRentalCoupon)
+ setObjectScene(INV_RENTAL_COUPON, 1);
+ if (hasHook)
+ setObjectScene(INV_HOOK, 1);
+ break;
+ case 5:
+ if (hasRags)
+ setObjectScene(INV_RAGS, 1);
+ if (hasJar)
+ setObjectScene(INV_JAR, 1);
+ if (hasRentalCoupon)
+ setObjectScene(INV_RENTAL_COUPON, 1);
+ if (hasWarehouseKeys)
+ setObjectScene(INV_WAREHOUSE_KEYS, 1);
+ break;
+ default:
+ break;
+ }
+}
+
+/**
+ * When an inventory item is selected, check if it's the gun belt, since that has a specific dialog
+ */
+bool BlueForceInvObjectList::SelectItem(int objectNumber) {
+ if (objectNumber == INV_AMMO_BELT) {
+ AmmoBeltDialog *dlg = new AmmoBeltDialog();
+ dlg->execute();
+ delete dlg;
+
+ return true;
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+NamedHotspot::NamedHotspot() : SceneHotspot() {
+ _resNum = 0;
+ _lookLineNum = _useLineNum = _talkLineNum = -1;
+}
+
+bool NamedHotspot::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_WALK:
+ // Nothing
+ return false;
+ case CURSOR_LOOK:
+ if (_lookLineNum == -1)
+ return SceneHotspot::startAction(action, event);
+
+ SceneItem::display2(_resNum, _lookLineNum);
+ return true;
+ case CURSOR_USE:
+ if (_useLineNum == -1)
+ return SceneHotspot::startAction(action, event);
+
+ SceneItem::display2(_resNum, _useLineNum);
+ return true;
+ case CURSOR_TALK:
+ if (_talkLineNum == -1)
+ return SceneHotspot::startAction(action, event);
+
+ SceneItem::display2(_resNum, _talkLineNum);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
+ setBounds(ys, xe, ye, xs);
+ _resNum = resnum;
+ _lookLineNum = lookLineNum;
+ _useLineNum = useLineNum;
+ _talkLineNum = -1;
+ g_globals->_sceneItems.addItems(this, NULL);
+}
+
+void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
+ setBounds(bounds);
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ switch (mode) {
+ case 2:
+ g_globals->_sceneItems.push_front(this);
+ break;
+ case 4:
+ g_globals->_sceneItems.addBefore(item, this);
+ break;
+ case 5:
+ g_globals->_sceneItems.addAfter(item, this);
+ break;
+ default:
+ g_globals->_sceneItems.push_back(this);
+ break;
+ }
+}
+
+void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) {
+ _sceneRegionId = sceneRegionId;
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ // Handle adding hotspot to scene items list as necessary
+ switch (mode) {
+ case 2:
+ GLOBALS._sceneItems.push_front(this);
+ break;
+ case 3:
+ break;
+ default:
+ GLOBALS._sceneItems.push_back(this);
+ break;
+ }
+}
+
+void NamedHotspot::synchronize(Serializer &s) {
+ SceneHotspot::synchronize(s);
+ s.syncAsSint16LE(_resNum);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_useLineNum);
+
+ if (g_vm->getGameID() == GType_BlueForce)
+ s.syncAsSint16LE(_talkLineNum);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void SceneMessage::remove() {
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ if (scene->_focusObject == this)
+ scene->_focusObject = NULL;
+
+ Action::remove();
+}
+
+void SceneMessage::signal() {
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_focusObject = this;
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+ draw();
+ setDelay(180);
+ break;
+ case 1:
+ clear();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void SceneMessage::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) ||
+ ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_RETURN))) {
+ signal();
+ }
+}
+
+
+void SceneMessage::draw() {
+ GfxSurface &surface = BF_GLOBALS._screenSurface;
+
+ // Clear the game area
+ surface.fillRect(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 0);
+
+ // Disable scene fade in
+ BF_GLOBALS._paneRefreshFlag[0] = 0;
+
+ // Set up the font
+ GfxFont &font = BF_GLOBALS._gfxManagerInstance._font;
+ BF_GLOBALS._scenePalette.setEntry(font._colors.foreground, 255, 255, 255);
+ BF_GLOBALS._scenePalette.setPalette(font._colors.foreground, 1);
+
+ // Write out the message
+ Rect textRect(0, UI_INTERFACE_Y / 2 - (font.getHeight() / 2), SCREEN_WIDTH,
+ UI_INTERFACE_Y / 2 + (font.getHeight() / 2));
+ BF_GLOBALS._gfxManagerInstance._font.writeLines(_message.c_str(), textRect, ALIGN_CENTER);
+
+ // TODO: Ideally, saving and loading should be disabled here until the message display is complete
+}
+
+void SceneMessage::clear() {
+ // Fade out the text display
+ static const uint32 black = 0;
+ BF_GLOBALS._scenePalette.fade((const byte *)&black, false, 100);
+
+ // Refresh the background
+ BF_GLOBALS._paneRefreshFlag[0] = 0;
+
+ // Set up to fade in the game scene
+ g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ g_globals->_sceneManager._hasPalette = true;
+}
+
+IntroSceneText::IntroSceneText(): SceneText() {
+ _action = NULL;
+ _frameNumber = 0;
+ _diff = 0;
+}
+
+void IntroSceneText::setup(const Common::String &msg, Action *action) {
+ _frameNumber = BF_GLOBALS._events.getFrameNumber();
+ _diff = 180;
+ _action = action;
+ _fontNumber = 4;
+ _width = 300;
+ _textMode = ALIGN_CENTER;
+ _color1 = BF_GLOBALS._scenePalette._colors.background;
+ _color2 = _color3 = 0;
+
+ SceneText::setup(msg);
+
+ // Center the text on-screen
+ reposition();
+ _bounds.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
+
+ // Set the new position
+ _position.x = _bounds.left;
+ _position.y = _bounds.top;
+}
+
+void IntroSceneText::synchronize(Serializer &s) {
+ SceneText::synchronize(s);
+ SYNC_POINTER(_action);
+ s.syncAsUint32LE(_frameNumber);
+ s.syncAsSint16LE(_diff);
+}
+
+void IntroSceneText::dispatch() {
+ if (_diff) {
+ uint32 frameNumber = BF_GLOBALS._events.getFrameNumber();
+ if (_frameNumber < frameNumber) {
+ _diff -= frameNumber - _frameNumber;
+ _frameNumber = frameNumber;
+
+ if (_diff <= 0) {
+ // Time has expired, so remove the text and signal the designated action
+ remove();
+ if (_action)
+ _action->signal();
+ }
+ }
+ }
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h
new file mode 100644
index 0000000000..1b161bce06
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_logic.h
@@ -0,0 +1,394 @@
+/* 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 TSAGE_BLUEFORCE_LOGIC_H
+#define TSAGE_BLUEFORCE_LOGIC_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+#define BF_INVENTORY (*((::TsAGE::BlueForce::BlueForceInvObjectList *)g_globals->_inventory))
+
+class BlueForceGame: public Game {
+public:
+ virtual void start();
+ virtual Scene *createScene(int sceneNumber);
+ virtual void rightClick();
+ virtual void processEvent(Event &event);
+ virtual bool canSaveGameStateCurrently();
+ virtual bool canLoadGameStateCurrently();
+};
+
+#define OBJ_ARRAY_SIZE 10
+class AObjectArray: public EventHandler {
+public:
+ EventHandler *_objList[OBJ_ARRAY_SIZE];
+ bool _inUse;
+ int getNewIndex();
+public:
+ AObjectArray();
+ void clear();
+
+ virtual Common::String getClassName() { return "AObjectArray"; }
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+ virtual void dispatch();
+
+ void add(EventHandler *obj);
+ void remove(EventHandler *obj);
+};
+
+class Timer: public EventHandler {
+public:
+ Action *_tickAction;
+ EventHandler *_endHandler;
+ uint32 _endFrame;
+public:
+ Timer();
+ void set(uint32 delay, EventHandler *endHandler);
+
+ virtual Common::String getClassName() { return "Timer"; }
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class TimerExt: public Timer {
+public:
+ Action *_newAction;
+public:
+ TimerExt();
+ void set(uint32 delay, EventHandler *endHandler, Action *action);
+
+ virtual Common::String getClassName() { return "TimerExt"; }
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void signal();
+};
+
+
+class SceneHotspotExt: public SceneHotspot {
+public:
+ int _state;
+
+ SceneHotspotExt() { _state = 0; }
+ virtual Common::String getClassName() { return "SceneHotspotExt"; }
+ virtual void synchronize(Serializer &s) {
+ SceneHotspot::synchronize(s);
+ s.syncAsSint16LE(_state);
+ }
+};
+
+class SceneItemType2: public SceneHotspot {
+public:
+ virtual void startMove(SceneObject *sceneObj, va_list va);
+};
+
+class NamedObject: public SceneObject {
+public:
+ int _resNum;
+ int _lookLineNum, _talkLineNum, _useLineNum;
+
+ virtual Common::String getClassName() { return "NamedObject"; }
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual bool startAction(CursorType action, Event &event);
+
+ void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
+ void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+};
+
+class NamedObjectExt: public NamedObject {
+public:
+ int _flag;
+
+ NamedObjectExt() { _flag = 0; }
+ virtual Common::String getClassName() { return "NamedObjectExt"; }
+ virtual void synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_flag);
+ }
+};
+
+class NamedObject2: public NamedObject {
+public:
+ int _v1, _v2;
+
+ NamedObject2() { _v1 = _v2 = 0; }
+ virtual Common::String getClassName() { return "NamedObject2"; }
+ virtual void synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_v1);
+ s.syncAsSint16LE(_v2);
+ }
+};
+
+class CountdownObject: public NamedObject {
+public:
+ int _countDown;
+ CountdownObject();
+ void fixCountdown(int mode, ...);
+
+ virtual Common::String getClassName() { return "CountdownObject"; }
+ virtual void synchronize(Serializer &s);
+ virtual void dispatch();
+};
+
+class FollowerObject: public NamedObject {
+public:
+ SceneObject *_object;
+ FollowerObject();
+
+ virtual Common::String getClassName() { return "FollowerObject"; }
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void dispatch();
+ virtual void reposition();
+
+ void setup(SceneObject *object, int visage, int frameNum, int yDiff);
+};
+
+class FocusObject: public NamedObject {
+public:
+ int _v90, _v92;
+ GfxSurface _img;
+
+ FocusObject();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void process(Event &event);
+};
+
+enum ExitFrame { EXITFRAME_N = 1, EXITFRAME_NE = 2, EXITFRAME_E = 3, EXITFRAME_SE = 4,
+ EXITFRAME_S = 5, EXITFRAME_SW = 6, EXITFRAME_W = 7, EXITFRAME_NW = 8 };
+
+class SceneExt: public Scene {
+private:
+ static void startStrip();
+ static void endStrip();
+public:
+ AObjectArray _timerList, _objArray2;
+ int _field372;
+ bool _savedPlayerEnabled;
+ bool _savedUiEnabled;
+ bool _savedCanWalk;
+ int _field37A;
+
+ EventHandler *_focusObject;
+ Visage _cursorVisage;
+
+ Rect _v51C34;
+public:
+ SceneExt();
+
+ virtual Common::String getClassName() { return "SceneExt"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void loadScene(int sceneNum);
+ virtual void checkGun();
+
+ void addTimer(EventHandler *timer) { _timerList.add(timer); }
+ void removeTimer(EventHandler *timer) { _timerList.remove(timer); }
+ bool display(CursorType action);
+ void fadeOut();
+ void gunDisplay();
+ void clearScreen();
+};
+
+class PalettedScene: public SceneExt {
+public:
+ ScenePalette _palette;
+ int _field794;
+public:
+ PalettedScene();
+
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ PaletteFader *addFader(const byte *arrBufferRGB, int step, Action *action);
+ void add2Faders(const byte *arrBufferRGB, int step, int paletteNum, Action *action);
+ void transition(const byte *arrBufferRGB, int arg8, int paletteNum, Action *action, int fromColor1, int fromColor2, int toColor1, int toColor2, bool flag);
+};
+
+class SceneHandlerExt: public SceneHandler {
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void process(Event &event);
+
+ virtual void playerAction(Event &event);
+ virtual void processEnd(Event &event);
+};
+
+class BlueForceInvObjectList : public InvObjectList {
+private:
+ static bool SelectItem(int objectNumber);
+public:
+ InvObject _none;
+ InvObject _colt45;
+ InvObject _ammoClip;
+ InvObject _spareClip;
+ InvObject _handcuffs;
+ InvObject _greensGun;
+ InvObject _ticketBook;
+ InvObject _mirandaCard;
+ InvObject _forestRap;
+ InvObject _greenId;
+ InvObject _baseballCard;
+ InvObject _bookingGreen;
+ InvObject _flare;
+ InvObject _cobbRap;
+ InvObject _bullet22;
+ InvObject _autoRifle;
+ InvObject _wig;
+ InvObject _frankieId;
+ InvObject _tyroneId;
+ InvObject _snub22;
+ InvObject _bug;
+ InvObject _bookingFrankie;
+ InvObject _bookingGang;
+ InvObject _fbiTeletype;
+ InvObject _daNote;
+ InvObject _printOut;
+ InvObject _warehouseKeys;
+ InvObject _centerPunch;
+ InvObject _tranqGun;
+ InvObject _hook;
+ InvObject _rags;
+ InvObject _jar;
+ InvObject _screwdriver;
+ InvObject _dFloppy;
+ InvObject _blankDisk;
+ InvObject _stick;
+ InvObject _crate1;
+ InvObject _crate2;
+ InvObject _shoebox;
+ InvObject _badge;
+ InvObject _bug2;
+ InvObject _rentalCoupon;
+ InvObject _nickel;
+ InvObject _lyleCard;
+ InvObject _carterNote;
+ InvObject _mugshot;
+ InvObject _clipping;
+ InvObject _microfilm;
+ InvObject _waveKeys;
+ InvObject _rentalKeys;
+ InvObject _napkin;
+ InvObject _dmvPrintout;
+ InvObject _fishingNet;
+ InvObject _id;
+ InvObject _bullets9mm;
+ InvObject _schedule;
+ InvObject _grenades;
+ InvObject _yellowCord;
+ InvObject _halfYellowCord;
+ InvObject _blackCord;
+ InvObject _bug3;
+ InvObject _halfBlackCord;
+ InvObject _warrant;
+ InvObject _jacket;
+ InvObject _greensKnife;
+ InvObject _dogWhistle;
+ InvObject _ammoBelt;
+ InvObject _alleyCatKey;
+
+ BlueForceInvObjectList();
+ void reset();
+ void setObjectScene(int objectNum, int sceneNumber);
+ void alterInventory(int mode);
+
+ virtual Common::String getClassName() { return "BlueForceInvObjectList"; }
+};
+
+class NamedHotspot : public SceneHotspot {
+public:
+ int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
+ NamedHotspot();
+
+
+ virtual bool startAction(CursorType action, Event &event);
+ virtual Common::String getClassName() { return "NamedHotspot"; }
+ virtual void synchronize(Serializer &s);
+ virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
+ virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
+ virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode);
+};
+
+class NamedHotspotExt : public NamedHotspot {
+public:
+ int _flag;
+ NamedHotspotExt() { _flag = 0; }
+
+ virtual Common::String getClassName() { return "NamedHotspot"; }
+ virtual void synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+ s.syncAsSint16LE(_flag);
+ }
+};
+
+class SceneMessage: public Action {
+private:
+ Common::String _message;
+
+ void draw();
+ void clear();
+public:
+ void setup(const Common::String &msg) { _message = msg; }
+
+ virtual Common::String getClassName() { return "SceneMessage"; }
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class IntroSceneText: public SceneText {
+public:
+ Action *_action;
+ uint32 _frameNumber;
+ int _diff;
+public:
+ IntroSceneText();
+ void setup(const Common::String &msg, Action *action);
+
+ virtual Common::String getClassName() { return "BFIntroText"; }
+ virtual void synchronize(Serializer &s);
+ virtual void dispatch();
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp
new file mode 100644
index 0000000000..bb283d051e
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes0.cpp
@@ -0,0 +1,1136 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes0.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 20 - Tsunami Title Screen
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene20::Action1::signal() {
+ Scene20 *scene = (Scene20 *)BF_GLOBALS._sceneManager._scene;
+ static byte black[3] = { 0, 0, 0 };
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(2);
+ break;
+ case 1:
+ _sound.play(1);
+ BF_GLOBALS._scenePalette.addRotation(64, 127, -1, 1, this);
+ break;
+ case 2:
+ scene->_object1.setVisage(22);
+ scene->_object1._strip = 1;
+ scene->_object1._frame = 1;
+ scene->_object1.changeZoom(100);
+
+ scene->_object2.setVisage(22);
+ scene->_object2._strip = 2;
+ scene->_object2._frame = 1;
+ scene->_object2.changeZoom(100);
+
+ scene->_object3.setVisage(22);
+ scene->_object3._strip = 3;
+ scene->_object3._frame = 1;
+ scene->_object3.changeZoom(100);
+
+ scene->_object4.setVisage(22);
+ scene->_object4._strip = 4;
+ scene->_object4._frame = 1;
+ scene->_object4.changeZoom(100);
+
+ scene->_object5.setVisage(22);
+ scene->_object5._strip = 5;
+ scene->_object5._frame = 1;
+ scene->_object5.changeZoom(100);
+
+ scene->_object6.setVisage(22);
+ scene->_object6._strip = 6;
+ scene->_object6._frame = 1;
+ scene->_object6.changeZoom(100);
+
+ scene->_object7.setVisage(22);
+ scene->_object7._strip = 7;
+ scene->_object7._frame = 1;
+ scene->_object7.changeZoom(100);
+
+ scene->_object8.setVisage(22);
+ scene->_object8._strip = 8;
+ scene->_object8._frame = 1;
+ scene->_object8.changeZoom(100);
+
+ setDelay(1);
+ break;
+ case 3:
+ BF_GLOBALS._scenePalette.addFader(scene->_scenePalette._palette, 256, 8, this);
+ break;
+ case 4:
+ setDelay(60);
+ break;
+ case 5:
+ scene->_object2.animate(ANIM_MODE_5, NULL);
+ scene->_object3.animate(ANIM_MODE_5, NULL);
+ scene->_object4.animate(ANIM_MODE_5, NULL);
+ scene->_object5.animate(ANIM_MODE_5, NULL);
+ scene->_object6.animate(ANIM_MODE_5, NULL);
+ scene->_object7.animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ setDelay(120);
+ break;
+ case 7:
+ BF_GLOBALS._scenePalette.addFader(black, 1, 5, this);
+ break;
+ case 8:
+ BF_GLOBALS._sceneManager.changeScene(100);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene20::postInit(SceneObjectList *OwnerList) {
+ loadScene(20);
+ Scene::postInit();
+ setZoomPercents(60, 85, 200, 100);
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
+
+ _scenePalette.loadPalette(1);
+ _scenePalette.loadPalette(22);
+
+ _object1.postInit();
+ _object1.setVisage(21);
+ _object1._strip = 1;
+ _object1._frame = 1;
+ _object1.animate(ANIM_MODE_NONE, NULL);
+ _object1.setPosition(Common::Point(62, 85));
+ _object1.changeZoom(100);
+
+ _object2.postInit();
+ _object2.setVisage(21);
+ _object2._strip = 2;
+ _object2._frame = 1;
+ _object2.animate(ANIM_MODE_NONE, NULL);
+ _object2.setPosition(Common::Point(27, 94));
+ _object2.changeZoom(100);
+
+ _object3.postInit();
+ _object3.setVisage(21);
+ _object3._strip = 2;
+ _object3._frame = 2;
+ _object3.animate(ANIM_MODE_NONE, NULL);
+ _object3.setPosition(Common::Point(68, 94));
+ _object3.changeZoom(100);
+
+ _object4.postInit();
+ _object4.setVisage(21);
+ _object4._strip = 2;
+ _object4._frame = 3;
+ _object4.animate(ANIM_MODE_NONE, NULL);
+ _object4.setPosition(Common::Point(110, 94));
+ _object4.changeZoom(100);
+
+ _object5.postInit();
+ _object5.setVisage(21);
+ _object5._strip = 2;
+ _object5._frame = 4;
+ _object5.animate(ANIM_MODE_NONE, NULL);
+ _object5.setPosition(Common::Point(154, 94));
+ _object5.changeZoom(100);
+
+ _object6.postInit();
+ _object6.setVisage(21);
+ _object6._strip = 2;
+ _object6._frame = 5;
+ _object6.animate(ANIM_MODE_NONE, NULL);
+ _object6.setPosition(Common::Point(199, 94));
+ _object6.changeZoom(100);
+
+ _object7.postInit();
+ _object7.setVisage(21);
+ _object7._strip = 2;
+ _object7._frame = 6;
+ _object7.animate(ANIM_MODE_NONE, NULL);
+ _object7.setPosition(Common::Point(244, 94));
+ _object7.changeZoom(100);
+
+ _object8.postInit();
+ _object8.setVisage(21);
+ _object8._strip = 2;
+ _object8._frame = 7;
+ _object8.animate(ANIM_MODE_NONE, NULL);
+ _object8.setPosition(Common::Point(286, 94));
+ _object8.changeZoom(100);
+
+ setAction(&_action1);
+ BF_GLOBALS._dialogCenter.y = 165;
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 50 - Map Screen
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene50::Tooltip::Tooltip(): SavedObject() {
+ _newSceneNumber = _locationId = 0;
+}
+
+void Scene50::Tooltip::synchronize(Serializer &s) {
+ SavedObject::synchronize(s);
+ _bounds.synchronize(s);
+ s.syncString(_msg);
+}
+
+void Scene50::Tooltip2::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1: {
+ Common::Point pt(410, 181);
+ NpcMover *mover = new NpcMover();
+ ((SceneObject *)_owner)->addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _owner->remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene50::Tooltip2::dispatch() {
+ Action::dispatch();
+ SceneObject *owner = (SceneObject *)_owner;
+
+ if ((_actionIndex == 2) && (owner->_percent < 100)) {
+ owner->changeZoom(owner->_percent + 1);
+ }
+}
+
+void Scene50::Tooltip::set(const Rect &bounds, int v60, const Common::String &msg, int v62) {
+ _bounds = bounds;
+ _newSceneNumber = v60;
+ _msg = msg;
+ _locationId = v62;
+}
+
+void Scene50::Tooltip::update() {
+ // Set up the text object for the scene with the appropriate settings
+ Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene;
+ scene->_text._fontNumber = 10;
+ scene->_text._color1 = BF_GLOBALS._scenePalette._colors.foreground;
+ scene->_text._color2 = BF_GLOBALS._scenePalette._colors.background;
+ scene->_text.setup(_msg);
+
+ int yp = (scene->_text._textSurface.getBounds().height() == 0) ? _bounds.bottom : _bounds.top;
+ scene->_text.setPosition(Common::Point(_bounds.left, yp));
+}
+
+void Scene50::Tooltip::highlight(bool btnDown) {
+ Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene;
+
+ scene->_field382 = _newSceneNumber;
+ if ((scene->_field380 != 0) || (scene->_field380 != _newSceneNumber))
+ update();
+
+ if (btnDown) {
+ if ((BF_GLOBALS._bookmark == bCalledToDrunkStop) && BF_GLOBALS.getFlag(beenToJRDay2))
+ scene->_sceneNumber = 600;
+ else if (BF_GLOBALS._bookmark == bBookedGreen)
+ scene->_sceneNumber = 410;
+ else {
+ BF_GLOBALS._driveToScene = _newSceneNumber;
+
+ switch (BF_GLOBALS._driveFromScene) {
+ case 330:
+ case 340:
+ case 342:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._mapLocationId = _locationId;
+
+ if (BF_GLOBALS._driveToScene != 330) {
+ scene->_sceneNumber = 330;
+ } else {
+ scene->_sceneNumber = (BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) ||
+ (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) ? 342 : 340;
+ }
+ break;
+
+ case 410:
+ case 551:
+ if (BF_GLOBALS.getFlag((BF_GLOBALS._driveFromScene == 410) ? fSearchedTruck : didDrunk)) {
+ BF_GLOBALS._mapLocationId = _locationId;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneNumber = _newSceneNumber;
+ } else {
+ BF_GLOBALS._deathReason = 4;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ return;
+ }
+ break;
+
+ case 300:
+ if (_locationId == 1) {
+ BF_GLOBALS._driveToScene = 300;
+ _newSceneNumber = 300;
+ }
+ // Deliberate fall through to default
+ default:
+ BF_GLOBALS._mapLocationId = _locationId;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneNumber = _newSceneNumber;
+ break;
+ }
+ }
+
+ // Signal the scene to change to the new scene
+ scene->_sceneMode = 1;
+ scene->signal();
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene50::Scene50(): SceneExt() {
+ _field382 = 0;
+ _field380 = 0;
+}
+
+void Scene50::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+
+ BF_GLOBALS._interfaceY = 200;
+ T2_GLOBALS._uiElements._active = false;
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(830);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.setPosition(Common::Point(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2));
+ BF_GLOBALS._player.hide();
+ BF_GLOBALS._player.disableControl();
+
+ BF_GLOBALS._scrollFollower = NULL;
+ _text._color1 = 19;
+ _text._color2 = 9;
+ _text._color3 = 9;
+ _text._width = 75;
+ _text._fontNumber = 4;
+ _text._textMode = ALIGN_LEFT;
+ _text.fixPriority(256);
+
+ // Set all the hotspots
+ _location3.set(Rect(10, 92, 24, 105), 180, GRANDMA_FRANNIE, 4);
+ _location2.set(Rect(443, 149, 508, 178), 330, MARINA, 2);
+ _location1.set(Rect(573, 103, 604, 130), 190, POLICE_DEPARTMENT, 1);
+ _location4.set(Rect(313, 21, 325, 33), 114, TONYS_BAR, 8);
+ _location8.set(Rect(69, 79, 82, 88), 580, CHILD_PROTECTIVE_SERVICES, 256);
+ _location6.set(Rect(242, 131, 264, 144), 440, ALLEY_CAT, 64);
+ _location5.set(Rect(383, 57, 402, 70), 380, CITY_HALL_JAIL, 32);
+ _location7.set(Rect(128, 32, 143, 42), 800, JAMISON_RYAN, 128);
+ _location9.set(Rect(349, 125, 359, 132),
+ (BF_GLOBALS._bookmark == bInspectionDone) || (BF_GLOBALS._bookmark == bCalledToDrunkStop) ? 551 : 550,
+ BIKINI_HUT, 16);
+
+ _item.setBounds(Rect(0, 0, SCREEN_WIDTH * 2, SCREEN_HEIGHT));
+ BF_GLOBALS._sceneItems.push_back(&_item);
+
+ // Find the location to start at
+ int selectedTooltip = BF_GLOBALS._mapLocationId;
+ Tooltip *tooltip = NULL;
+ int xp = 0;
+
+ switch (selectedTooltip) {
+ case 1:
+ tooltip = &_location1;
+ xp = 588;
+ break;
+ case 2:
+ tooltip = &_location2;
+ xp = 475;
+ break;
+ case 4:
+ tooltip = &_location3;
+ xp = 17;
+ break;
+ case 8:
+ tooltip = &_location4;
+ xp = 319;
+ break;
+ case 32:
+ tooltip = &_location5;
+ xp = 392;
+ break;
+ case 64:
+ tooltip = &_location6;
+ xp = 253;
+ break;
+ case 128:
+ tooltip = &_location7;
+ xp = 135;
+ break;
+ case 16:
+ tooltip = &_location9;
+ xp = 354;
+ break;
+ case 256:
+ tooltip = &_location8;
+ xp = 75;
+ break;
+ }
+
+ _timer.set(240, this);
+ _sceneBounds.center(xp, SCREEN_HEIGHT / 2);
+ loadScene(55);
+ _sceneMode = 2;
+
+ loadBackground(xp - 160, 0);
+ tooltip->update();
+}
+
+void Scene50::remove() {
+ // Blank out the screen
+ clearScreen();
+ BF_GLOBALS._scrollFollower = &BF_GLOBALS._player;
+
+ SceneExt::remove();
+ T2_GLOBALS._uiElements._active = true;
+}
+
+void Scene50::signal() {
+ if (_sceneMode == 1) {
+ // Destination selected
+ if ((BF_GLOBALS._driveFromScene == 551) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
+ BF_GLOBALS.clearFlag(f1015Drunk);
+ BF_GLOBALS.clearFlag(f1027Drunk);
+ BF_GLOBALS.clearFlag(f1035Drunk);
+ BF_GLOBALS.clearFlag(f1097Drunk);
+ BF_GLOBALS.clearFlag(f1098Drunk);
+ }
+
+ if ((BF_GLOBALS._driveFromScene == 410) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
+ BF_GLOBALS.setFlag(125);
+ }
+
+ if ((BF_GLOBALS._driveFromScene == 340) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
+ BF_GLOBALS.setFlag(123);
+ }
+
+ if ((BF_GLOBALS._driveFromScene == 380) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
+ if (BF_GLOBALS._bookmark >= bLauraToParamedics)
+ BF_GLOBALS.setFlag(f1098Marina);
+ if (BF_GLOBALS._bookmark >= bStoppedFrankie)
+ BF_GLOBALS.setFlag(f1098Frankie);
+ if (BF_GLOBALS._bookmark == bArrestedGreen) {
+ BF_GLOBALS._deathReason = 19;
+ _sceneNumber = 666;
+ }
+ }
+
+ if ((_sceneNumber == 551) && BF_GLOBALS.getFlag(fHasDrivenFromDrunk))
+ _sceneNumber = 550;
+
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(_sceneNumber);
+
+ } else if (_sceneMode == 2) {
+ // Initial delay complete, time to switch to interactive mode
+ _text.remove();
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+ _sceneMode = 0;
+ _field380 = 0;
+ }
+}
+
+void Scene50::process(Event &event) {
+ SceneExt::process(event);
+ Common::Point pt(event.mousePos.x + _sceneBounds.left, event.mousePos.y + _sceneBounds.top);
+ bool mouseDown = false;
+ _field382 = 0;
+
+ if ((event.mousePos.x > 270 && (_sceneBounds.right < (SCREEN_WIDTH * 2))))
+ loadBackground(4, 0);
+ else if ((event.mousePos.x < 50) && (_sceneBounds.left > 0))
+ loadBackground(-4, 0);
+ else
+ mouseDown = event.eventType == EVENT_BUTTON_DOWN;
+
+ if (BF_GLOBALS._player._uiEnabled) {
+ Tooltip *tooltipList[9] = { &_location1, &_location2, &_location3, &_location4,
+ &_location5, &_location6, &_location7, &_location8, &_location9 };
+
+ for (int idx = 0; idx < 9; ++idx) {
+ if (tooltipList[idx]->_bounds.contains(pt)) {
+ // Found a tooltip to highlight
+ tooltipList[idx]->highlight(mouseDown);
+ return;
+ }
+ }
+
+ // No hotspot selected, so remove any current tooltip display
+ _text.remove();
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 60 - Motorcycle
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene60::Ignition::startAction(CursorType action, Event &event) {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(60, 15);
+ break;
+ default:
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ if (BF_GLOBALS.getFlag(onDuty) && check1())
+ return true;
+ break;
+ case 2:
+ if (BF_GLOBALS.getFlag(onDuty) && check2())
+ return true;
+ }
+
+ BF_GLOBALS._sound1.play(BF_GLOBALS.getFlag(fWithLyle) ? 80 : 31);
+ BF_GLOBALS._sound1.holdAt(1);
+ scene->fadeOut();
+ BF_GLOBALS._sceneManager.changeScene(50);
+ break;
+ }
+
+ return true;
+}
+
+bool Scene60::Ignition::check1() {
+ if (BF_GLOBALS._bookmark >= bStoppedFrankie) {
+ BF_GLOBALS._v5098C |= 1;
+ return false;
+ } else {
+ if ((BF_GLOBALS._bookmark == bBookedGreen) && BF_GLOBALS.getFlag(fArrivedAtGangStop)) {
+ BF_GLOBALS.set2Flags(f1035Frankie);
+ BF_GLOBALS._sceneManager.changeScene(410);
+ }
+
+ if (BF_GLOBALS._bookmark >= bLauraToParamedics) {
+ if (BF_GLOBALS.getFlag(fLeftTraceIn910)) {
+ if (BF_GLOBALS._bookmark < bBookedGreen) {
+ BF_GLOBALS._bookmark = bBookedGreen;
+ BF_GLOBALS.clearFlag(fCalledBackup);
+ BF_GLOBALS.set2Flags(f1035Frankie);
+ return false;
+ } else if (BF_GLOBALS._bookmark == bBookedGreen) {
+ if (!BF_GLOBALS.getFlag(fCalledBackup))
+ BF_GLOBALS.setFlag(f1035Frankie);
+
+ BF_GLOBALS._sceneManager.changeScene(410);
+ return true;
+ }
+ }
+
+ } else if (BF_GLOBALS._bookmark < bStartOfGame) {
+ // Should never reach here
+ } else if (BF_GLOBALS._bookmark < bCalledToDomesticViolence) {
+ if ((BF_GLOBALS._v5098C >> 1) & 1)
+ BF_GLOBALS.setFlag(fLateToMarina);
+ else
+ BF_GLOBALS._v5098C |= 2;
+ } else {
+ int v = (((BF_GLOBALS._v5098C >> 2) & 15) + 1) & 15;
+ BF_GLOBALS._v5098C = (BF_GLOBALS._v5098C & 0xC3) | (v << 2);
+
+ if ((v != 1) && (v != 2)) {
+ BF_GLOBALS._deathReason = 19;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ return true;
+ }
+ }
+ }
+
+ BF_GLOBALS._v5098C |= 1;
+ return false;
+}
+
+bool Scene60::Ignition::check2() {
+ switch (BF_GLOBALS._bookmark) {
+ case bInspectionDone:
+ if (BF_GLOBALS._v5098D & 1) {
+ BF_GLOBALS.setFlag(fLateToDrunkStop);
+ } else {
+ BF_GLOBALS._v5098D |= 1;
+ }
+ break;
+ case bCalledToDrunkStop:
+ BF_GLOBALS.setFlag(fHasDrivenFromDrunk);
+ break;
+ default:
+ break;
+ }
+
+ BF_GLOBALS._v5098C |= 0x80;
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene60::Item3::startAction(CursorType action, Event &event) {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+ scene->fadeOut();
+ BF_GLOBALS._sceneManager.changeScene(scene->_newScene);
+ return true;
+}
+
+bool Scene60::Radio::startAction(CursorType action, Event &event) {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch(action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(60, 0);
+ break;
+ case CURSOR_USE:
+ case CURSOR_TALK:
+ scene->_sound.play(32);
+ scene->setAction(&scene->_action1);
+ break;
+ default:
+ SceneItem::display2(60, 1);
+ break;
+ }
+ return true;
+}
+
+bool Scene60::Compartment::startAction(CursorType action, Event &event) {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch(action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(60, 8);
+ break;
+ case CURSOR_USE:
+ if ((BF_INVENTORY.getObjectScene(INV_TICKET_BOOK) == 1) &&
+ (BF_INVENTORY.getObjectScene(INV_MIRANDA_CARD) == 1)) {
+ SceneItem::display2(60, 9);
+ }
+ break;
+ case CURSOR_TALK:
+ SceneItem::display2(60, 10);
+ break;
+ case INV_TICKET_BOOK:
+ SceneItem::display2(60, 11);
+ scene->_ticketBook.show();
+ BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60);
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+ BF_GLOBALS._sceneItems.addBefore(&scene->_radio, &scene->_ticketBook);
+ break;
+ case INV_MIRANDA_CARD:
+ SceneItem::display2(60, 12);
+ scene->_mirandaCard.show();
+ BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 60);
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+ BF_GLOBALS._sceneItems.addAfter(&scene->_compartmentDoor, &scene->_mirandaCard);
+ break;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene60::MirandaCard::startAction(CursorType action, Event &event) {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(60, 5);
+ return true;
+ case CURSOR_USE:
+ if (BF_INVENTORY.getObjectScene(INV_MIRANDA_CARD) == 60) {
+ SceneItem::display2(60, 6);
+ BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 1);
+ if (!BF_GLOBALS.getFlag(fGotPointsForTktBook)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_GLOBALS.setFlag(fGotPointsForTktBook);
+ }
+
+ scene->_mirandaCard.hide();
+ BF_GLOBALS._sceneItems.remove(&scene->_mirandaCard);
+ }
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(60, 7);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene60::TicketBook::startAction(CursorType action, Event &event) {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(60, 2);
+ return true;
+ case CURSOR_USE:
+ if (BF_INVENTORY.getObjectScene(INV_TICKET_BOOK) == 60) {
+ scene->_ticketBook.hide();
+ BF_GLOBALS._sceneItems.remove(&scene->_ticketBook);
+ SceneItem::display2(60, 3);
+ BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 1);
+ if (!BF_GLOBALS.getFlag(fShotNicoIn910)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_GLOBALS.setFlag(fShotNicoIn910);
+ }
+ }
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(60, 4);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene60::CompartmentDoor::startAction(CursorType action, Event &event) {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(60, 13);
+ return true;
+ case CURSOR_USE:
+ if (_flag) {
+ _flag = false;
+ BF_GLOBALS._player.disableControl();
+ Common::Point pt(308, 165);
+ NpcMover *mover = new NpcMover();
+ addMover(mover, &pt, scene);
+ } else {
+ _flag = true;
+ BF_GLOBALS._player.disableControl();
+ Common::Point pt(288, 165);
+ NpcMover *mover = new NpcMover();
+ addMover(mover, &pt, scene);
+ }
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(60, 14);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene60::Action1::signal() {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(2);
+ break;
+ case 1:
+ scene->_stripManager.start(634, this);
+ break;
+ case 2:
+ _state = useRadio();
+ setDelay(4);
+ break;
+ case 3:
+ switch (_state) {
+ case 1:
+ if (BF_GLOBALS.removeFlag(fCan1004Marina)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 606;
+ } else if (BF_GLOBALS.removeFlag(fCan1004Drunk)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 606;
+ } else {
+ _state = 611;
+ }
+ break;
+ case 2:
+ _state = 612;
+ break;
+ case 3:
+ if (BF_GLOBALS.removeFlag(f1015Marina)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 613;
+ } else if (BF_GLOBALS.removeFlag(f1015Frankie)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 614;
+ } else if (BF_GLOBALS.removeFlag(f1015Drunk)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 615;
+ } else {
+ _state = 616;
+ }
+ break;
+ case 4:
+ if (BF_GLOBALS.removeFlag(f1027Marina)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _actionIndex = 5;
+ _state = 617;
+ } else if (BF_GLOBALS.removeFlag(f1027Frankie)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _actionIndex = 5;
+ _state = 618;
+ } else if (BF_GLOBALS.removeFlag(f1015Drunk)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _actionIndex = 5;
+ _state = 619;
+ } else {
+ _state = 620;
+ }
+ break;
+ case 5:
+ if (BF_GLOBALS.removeFlag(f1035Marina)) {
+ BF_GLOBALS.setFlag(fCalledBackup);
+ T2_GLOBALS._uiElements.addScore(50);
+ _state = 621;
+ } else if (BF_GLOBALS.removeFlag(f1035Frankie)) {
+ BF_GLOBALS.setFlag(fCalledBackup);
+ T2_GLOBALS._uiElements.addScore(50);
+ _actionIndex = 5;
+ _state = 622;
+ } else if (BF_GLOBALS.removeFlag(f1035Drunk)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 623;
+ } else {
+ _state = 624;
+ }
+ break;
+ case 6:
+ if (BF_GLOBALS.removeFlag(f1097Marina)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 625;
+ } else if (BF_GLOBALS.removeFlag(f1097Frankie)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _actionIndex = 5;
+ _state = 626;
+ } else if (BF_GLOBALS.removeFlag(f1097Drunk)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 627;
+ } else {
+ _state = 628;
+ }
+ break;
+ case 7:
+ if (BF_GLOBALS.removeFlag(f1098Marina)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 629;
+ } else if (BF_GLOBALS.removeFlag(f1098Frankie)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 630;
+ } else if (BF_GLOBALS.removeFlag(f1098Drunk)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ _state = 631;
+ } else {
+ _state = 632;
+ }
+ break;
+ case 0:
+ default:
+ _state = 610;
+ break;
+ }
+
+ scene->_stripManager.start(_state, this);
+ break;
+ case 4:
+ remove();
+ case 5:
+ setDelay(120);
+ break;
+ case 6:
+ _actionIndex = 4;
+ scene->_stripManager.start(633, this);
+ break;
+ }
+}
+
+int Scene60::Action1::useRadio() {
+ return RadioConvDialog::show();
+}
+
+void Scene60::Action2::signal() {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ scene->_sound.play(32);
+ setDelay(2);
+ break;
+ case 1:
+ BF_GLOBALS._bookmark = bStartOfGame;
+ BF_GLOBALS.set2Flags(f1035Marina);
+ scene->_stripManager.start(60, this);
+ break;
+ case 2:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene60::Action3::signal() {
+ Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ scene->_sound.play(32);
+ setDelay(2);
+ break;
+ case 1:
+ BF_GLOBALS._bookmark = bInspectionDone;
+ BF_GLOBALS.set2Flags(f1035Drunk);
+ BF_GLOBALS.setFlag(fCan1004Drunk);
+ scene->_stripManager.start(71, this);
+ break;
+ case 2:
+ scene->_field1222 = true;
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene60::Scene60(): SceneExt() {
+ _newScene = 0;
+ _sceneNumber = 0;
+ _visage = 0;
+ _cursorId = CURSOR_NONE;
+ _field1222 = false;
+}
+
+void Scene60::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_newScene);
+ s.syncAsSint16LE(_sceneNumber);
+ s.syncAsSint16LE(_visage);
+ s.syncAsSint16LE(_cursorId);
+ s.syncAsSint16LE(_field1222);
+}
+
+void Scene60::postInit(SceneObjectList *OwnerList) {
+ _newScene = BF_GLOBALS._driveFromScene = BF_GLOBALS._sceneManager._previousScene;
+
+ // Set up which scene background to use
+ switch (_newScene) {
+ case 300:
+ _sceneNumber = 1301;
+ break;
+ case 380:
+ _sceneNumber = 1380;
+ break;
+ case 410:
+ _sceneNumber = 1410;
+ break;
+ case 551:
+ _sceneNumber = 1550;
+ break;
+ case 550:
+ _sceneNumber = 1555;
+ break;
+ case 580:
+ _sceneNumber = 1580;
+ break;
+ case 800:
+ _sceneNumber = 1810;
+ break;
+ default:
+ _sceneNumber = 60;
+ break;
+ }
+
+ if (_sceneNumber == 1550) {
+ if (BF_GLOBALS.getFlag(fHasDrivenFromDrunk))
+ _sceneNumber = 1555;
+ else {
+ _object1.postInit();
+ _object1.setVisage(1550);
+ _object1.animate(ANIM_MODE_2);
+ _object1.setPosition(Common::Point(158, 18));
+ }
+ }
+
+ loadScene(_sceneNumber);
+
+ if ((_sceneNumber == 1810) && (BF_GLOBALS._dayNumber > 1) &&
+ (BF_GLOBALS._dayNumber < 5) && !BF_GLOBALS.getFlag(fWithLyle) &&
+ ((BF_GLOBALS._dayNumber != 4) && (BF_GLOBALS._bookmark >= bEndDayThree))) {
+ _car.setup(1810, 1, 1, 164, 131, 1);
+ }
+
+ if ((_sceneNumber == 1410) && (BF_GLOBALS._bookmark == bBookedGreen) &&
+ !BF_GLOBALS.getFlag(fDriverOutOfTruck)) {
+ _object1.postInit();
+ _object1.setVisage(410);
+ _object1.setStrip(6);
+ _object1.setPosition(Common::Point(135, 47));
+ }
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _visage = 62;
+ _ignition._sceneRegionId = 22;
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ _visage = 63;
+ _ignition._sceneRegionId = 20;
+ } else {
+ _visage = 61;
+ _ignition._sceneRegionId = 28;
+ }
+ _dashboard.setup(_visage, 1, 1, 160, 168, 100);
+ _cursorId = CURSOR_USE;
+
+ if (_visage == 63) {
+ _compartmentDoor.postInit();
+ _compartmentDoor.setVisage(60);
+ _compartmentDoor.setStrip(1);
+ _compartmentDoor.setFrame(1);
+ _compartmentDoor.setPosition(Common::Point(288, 165));
+ _compartmentDoor.setPriority(250);
+ _compartmentDoor._flag = true;
+ BF_GLOBALS._sceneItems.push_back(&_compartmentDoor);
+
+ _mirandaCard.postInit();
+ _mirandaCard.setVisage(60);
+ _mirandaCard.setStrip(2);
+ _mirandaCard.setFrame(2);
+ _mirandaCard.setPosition(Common::Point(280, 160));
+
+ if (BF_INVENTORY.getObjectScene(INV_MIRANDA_CARD) == 60) {
+ _mirandaCard.show();
+ BF_GLOBALS._sceneItems.push_back(&_mirandaCard);
+ } else {
+ _mirandaCard.hide();
+ }
+
+ _ticketBook.postInit();
+ _ticketBook.setVisage(60);
+ _ticketBook.setStrip(2);
+ _ticketBook.setFrame(1);
+ _ticketBook.setPosition(Common::Point(289, 161));
+
+ if (BF_INVENTORY.getObjectScene(INV_TICKET_BOOK) == 60) {
+ _ticketBook.show();
+ BF_GLOBALS._sceneItems.push_back(&_ticketBook);
+ } else {
+ _ticketBook.hide();
+ }
+ }
+
+ _item3._sceneRegionId = 7;
+ _radio._sceneRegionId = 12;
+ _compartment._sceneRegionId = 14;
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeRadioSpeaker);
+
+ if (BF_GLOBALS.getFlag(onDuty) && !BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._sceneItems.push_back(&_radio);
+ BF_GLOBALS._sceneItems.push_back(&_compartment);
+ }
+
+ BF_GLOBALS._sceneItems.push_back(&_ignition);
+ BF_GLOBALS._sceneItems.push_back(&_item3);
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ if (BF_GLOBALS.getFlag(onDuty) && (BF_GLOBALS._v5098C & 1) &&
+ (BF_GLOBALS._bookmark < bStartOfGame) && (BF_GLOBALS._sceneManager._previousScene != 342)) {
+ setAction(&_action2);
+ if (BF_GLOBALS._sceneManager._previousScene == 342)
+ _newScene = 340;
+ }
+ break;
+ case 2:
+ if (BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._v5098C >> 7) & 1) &&
+ (BF_GLOBALS._sceneManager._previousScene != 550) &&
+ (BF_GLOBALS._bookmark < bInspectionDone)) {
+ setAction(&_action3);
+ }
+ }
+}
+
+void Scene60::remove() {
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._events.setCursor(_cursorId);
+
+ if (_cursorId == CURSOR_EXIT)
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+}
+
+void Scene60::signal() {
+ ++_sceneMode;
+ BF_GLOBALS._player.enableControl();
+}
+
+void Scene60::dispatch() {
+ SceneExt::dispatch();
+
+ int idx = BF_GLOBALS._sceneRegions.indexOf(Common::Point(
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.left + BF_GLOBALS._events._mousePos.x,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + BF_GLOBALS._events._mousePos.y));
+
+ if (idx == _item3._sceneRegionId) {
+ if (BF_GLOBALS._events.getCursor() != CURSOR_EXIT) {
+ _cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(CURSOR_EXIT);
+ }
+ } else {
+ if (BF_GLOBALS._events.getCursor() == CURSOR_EXIT) {
+ BF_GLOBALS._events.setCursor(_cursorId);
+ }
+ }
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h
new file mode 100644
index 0000000000..103e5f0a4c
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes0.h
@@ -0,0 +1,190 @@
+/* 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 TSAGE_BLUEFORCE_SCENES0_H
+#define TSAGE_BLUEFORCE_SCENES0_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene20 : public SceneExt {
+ /* Actions */
+ class Action1 : public Action {
+ private:
+ ASoundExt _sound;
+ public:
+ virtual void signal();
+ };
+public:
+ Action1 _action1;
+ ScenePalette _scenePalette;
+ SceneObject _object1, _object2, _object3, _object4;
+ SceneObject _object5, _object6, _object7, _object8;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene50: public SceneExt {
+ class Tooltip: public SavedObject {
+ public:
+ Rect _bounds;
+ Common::String _msg;
+ int _newSceneNumber;
+ int _locationId;
+ public:
+ Tooltip();
+ void set(const Rect &bounds, int v60, const Common::String &msg, int v62);
+ void update();
+ void highlight(bool btnDown);
+
+ virtual Common::String getClassName() { return "Scene50_Tooltip"; }
+ virtual void synchronize(Serializer &s);
+ };
+ class Tooltip2: public Action {
+ public:
+ Tooltip2(): Action() {}
+
+ virtual Common::String getClassName() { return "Scene50_Tooltip2"; }
+ virtual void signal();
+ virtual void dispatch();
+ };
+public:
+ int _field380, _field382;
+ int _sceneNumber;
+ SceneText _text;
+ SceneItemType2 _item;
+ Tooltip _location1, _location2, _location3, _location4, _location5;
+ Tooltip _location6, _location7, _location8, _location9;
+ Timer _timer;
+public:
+ Scene50();
+ virtual Common::String getClassName() { return "Scene50"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene60 : public SceneExt {
+ /* Items */
+ class Ignition: public NamedHotspot {
+ private:
+ bool check1();
+ bool check2();
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item3: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Radio: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Compartment: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class MirandaCard: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class TicketBook: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class CompartmentDoor: public NamedObject {
+ public:
+ bool _flag;
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public ActionExt {
+ private:
+ int useRadio();
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ NamedObject _object1;
+ MirandaCard _mirandaCard;
+ TicketBook _ticketBook;
+ CompartmentDoor _compartmentDoor;
+ SceneObject _dashboard;
+ BackgroundSceneObject _car;
+ NamedHotspot _item1;
+ Ignition _ignition;
+ Item3 _item3;
+ Radio _radio;
+ Compartment _compartment;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeRadio _jakeRadioSpeaker;
+ ASound _sound;
+ int _newScene;
+ int _sceneNumber;
+ int _visage;
+ CursorType _cursorId;
+ bool _field1222;
+
+ Scene60();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
new file mode 100644
index 0000000000..e977d5fbca
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -0,0 +1,3399 @@
+/* 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.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "tsage/blue_force/blueforce_scenes1.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/globals.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 100 - Tsunami Title Screen #2
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene100::Text::dispatch() {
+ SceneText::dispatch();
+
+ // Keep the second text string below the first one
+ Scene100 *scene = (Scene100 *)BF_GLOBALS._sceneManager._scene;
+ Common::Point &pt = scene->_action1._sceneText1._position;
+ scene->_action1._sceneText2.setPosition(Common::Point(pt.x,
+ pt.y + scene->_action1._textHeight));
+}
+
+
+void Scene100::Action1::signal() {
+ static byte black[3] = { 0, 0, 0 };
+
+ switch (_actionIndex++) {
+ case 0:
+ _state = 0;
+ setDelay(6);
+ break;
+ case 1: {
+ Common::String msg1 = g_resourceManager->getMessage(100, _state++);
+ if (msg1.compareTo("LASTCREDIT")) {
+ Common::String msg2 = g_resourceManager->getMessage(100, _state++);
+ setTextStrings(msg1, msg2, this);
+ --_actionIndex;
+ } else {
+ setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this);
+
+ Common::Point pt(_sceneText1._position.x, 80);
+ NpcMover *mover = new NpcMover();
+ _sceneText1.addMover(mover, &pt, this);
+ }
+ break;
+ }
+ case 2:
+ setDelay(600);
+ break;
+ case 3:
+ BF_GLOBALS._sound1.fade(0, 10, 10, 1, this);
+ GLOBALS._scenePalette.addFader(black, 1, 2, NULL);
+ break;
+ case 4:
+ error("??exit");
+ break;
+ }
+}
+
+void Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) {
+ // Set data for first text control
+ _sceneText1._fontNumber = 10;
+ _sceneText1._width = 160;
+ _sceneText1._textMode = ALIGN_RIGHT;
+ _sceneText1._color1 = BF_GLOBALS._scenePalette._colors.foreground;
+ _sceneText1._color2 = BF_GLOBALS._scenePalette._colors.background;
+ _sceneText1._color3 = BF_GLOBALS._scenePalette._colors.foreground;
+ _sceneText1.setup(msg1);
+ _sceneText1.fixPriority(255);
+ _sceneText1.setPosition(Common::Point(
+ (SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202));
+ _sceneText1._moveRate = 30;
+ _sceneText1._moveDiff.y = 1;
+
+ // Set data for second text control
+ _sceneText2._fontNumber = 10;
+ _sceneText2._width = _sceneText1._width;
+ _sceneText2._textMode = _sceneText1._textMode;
+ _sceneText2._color1 = _sceneText1._color1;
+ _sceneText2._color2 = 31;
+ _sceneText2._color3 = _sceneText1._color3;
+ _sceneText2.setup(msg2);
+ _sceneText2.fixPriority(255);
+ GfxSurface textSurface = _sceneText2.getFrame();
+ _sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202));
+ _sceneText2._moveRate = 30;
+ _sceneText2._moveDiff.y = 1;
+
+ _textHeight = textSurface.getBounds().height();
+ int yp = -(_textHeight * 2);
+
+ Common::Point pt(_sceneText1._position.x, yp);
+ NpcMover *mover = new NpcMover();
+ _sceneText1.addMover(mover, &pt, action);
+}
+
+void Scene100::Action2::signal() {
+ Scene100 *scene = (Scene100 *)g_globals->_sceneManager._scene;
+ static byte black[3] = {0, 0, 0};
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._scenePalette.addFader(black, 1, -2, this);
+ break;
+ case 1:
+ setDelay(180);
+ break;
+ case 2: {
+ const char *SEEN_INTRO = "seen_intro";
+ if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) {
+ // First time being played, so will need to show the intro
+ ConfMan.setBool(SEEN_INTRO, true);
+ ConfMan.flushToDisk();
+ } else {
+ // Prompt user for whether to start play or watch introduction
+ g_globals->_player.enableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
+
+ if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {
+ // Signal to start the game
+ scene->_index = 190;
+ remove();
+ return;
+ }
+ }
+
+ // At this point the introduction needs to start
+ g_globals->_scenePalette.addFader(black, 1, 2, this);
+ break;
+ }
+ case 3:
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene100::Scene100(): SceneExt() {
+ _index = 0;
+}
+
+void Scene100::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ if (BF_GLOBALS._dayNumber < 6) {
+ // Title
+ loadScene(100);
+ } else {
+ // Credits
+ loadScene(101);
+ }
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
+
+ g_globals->_player.postInit();
+ g_globals->_player.hide();
+ g_globals->_player.disableControl();
+ _index = 109;
+
+ if (BF_GLOBALS._dayNumber < 6) {
+ // Title
+ BF_GLOBALS._sound1.play(2);
+ setAction(&_action2, this);
+ } else {
+ // Credits
+ BF_GLOBALS._sound1.play(118);
+ setAction(&_action1, this);
+ }
+}
+
+void Scene100::signal() {
+ ++_sceneMode;
+ if (BF_GLOBALS._dayNumber < 6) {
+ BF_GLOBALS._scenePalette.clearListeners();
+ BF_GLOBALS._scenePalette.loadPalette(100);
+ BF_GLOBALS._sceneManager.changeScene(_index);
+ } else {
+ if (_sceneMode > 1)
+ BF_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+ setAction(this, &_action1, this);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 109 - Introduction Bar Room
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene109::Action1::signal() {
+ Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ BF_GLOBALS._sound1.play(12);
+ BF_GLOBALS._sceneObjects->draw();
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ BF_GLOBALS._scenePalette.refresh();
+ setDelay(10);
+ break;
+ case 2:
+ scene->_text.setup(BF_19840515, this);
+ break;
+ case 3:
+ BF_GLOBALS._v51C44 = 1;
+ scene->loadScene(115);
+
+ scene->_protaginist2.show();
+ scene->_protaginist2.setPriority(133);
+ scene->_protaginist1.show();
+ scene->_bartender.show();
+ scene->_object1.show();
+ scene->_drunk.show();
+ scene->_drunk.setAction(&scene->_action3);
+ scene->_object2.show();
+ scene->_object9.show();
+ scene->_object9.setAction(&scene->_action2);
+
+ BF_GLOBALS._v501FC = 170;
+ setDelay(60);
+ break;
+ case 4:
+ // Start drinking
+ scene->_bartender.setAction(&scene->_sequenceManager4, NULL, 109, &scene->_bartender, &scene->_object2, NULL);
+ scene->_protaginist1.setAction(&scene->_sequenceManager5, NULL, 107, &scene->_protaginist1, NULL);
+ scene->_protaginist2.setAction(&scene->_sequenceManager6, this, 106, &scene->_protaginist2, NULL);
+ break;
+ case 5:
+ // Open briefcase and pass over disk
+ setAction(&scene->_sequenceManager6, this, 105, &scene->_object10, NULL);
+ break;
+ case 6:
+ // Protaginist 2 walk to the bar
+ scene->_object10.remove();
+ setAction(&scene->_sequenceManager6, this, 100, &scene->_protaginist2, NULL);
+ break;
+ case 7:
+ // Two thugs enter and walk to table
+ scene->_object7.setAction(&scene->_sequenceManager7, NULL, 103, &scene->_object7, NULL);
+ scene->_object5.setAction(&scene->_sequenceManager8, this, 102, &scene->_object5, NULL);
+ scene->_protaginist2.setAction(&scene->_sequenceManager6, NULL, 104, &scene->_protaginist2, &scene->_bartender, NULL);
+ break;
+ case 8:
+ // Protaginist 1 leaves, protaginist 2 stands up
+ setAction(&scene->_sequenceManager8, this, 101, &scene->_object5, &scene->_protaginist1, NULL);
+ break;
+ case 9:
+ // Shots fired!
+ scene->_protaginist1.setAction(&scene->_sequenceManager5, this, 98, &scene->_protaginist1, NULL);
+ scene->_object7.setAction(&scene->_sequenceManager7, NULL, 99, &scene->_object7, NULL);
+ break;
+ case 10:
+ // End scene
+ scene->_sceneMode = 1;
+ remove();
+ break;
+ }
+}
+
+void Scene109::Action2::signal() {
+ Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
+ scene->setAction(&scene->_sequenceManager2, this, 3117, &scene->_object9, NULL);
+}
+
+void Scene109::Action3::signal() {
+ Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
+ scene->setAction(&scene->_sequenceManager3, this, 108, &scene->_drunk, NULL);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene109::Scene109(): PalettedScene() {
+}
+
+void Scene109::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit(OwnerList);
+ loadScene(999);
+
+ _protaginist2.postInit();
+ _protaginist2.setVisage(119);
+ _protaginist2.setFrame(11);
+ _protaginist2.fixPriority(133);
+ _protaginist2.setPosition(Common::Point(165, 124));
+ _protaginist2.hide();
+
+ _protaginist1.postInit();
+ _protaginist1.setVisage(118);
+ _protaginist1.setStrip(1);
+ _protaginist1.setFrame(8);
+ _protaginist1.fixPriority(132);
+ _protaginist1.setPosition(Common::Point(143, 125));
+ _protaginist1.hide();
+
+ _bartender.postInit();
+ _bartender.setVisage(121);
+ _bartender.setStrip(2);
+ _bartender.setFrame(1);
+ _bartender.setPriority(-1);
+ _bartender.setPosition(Common::Point(92, 64));
+ _bartender.hide();
+
+ _object1.postInit();
+ _object1.setVisage(121);
+ _object1.setStrip(6);
+ _object1.setFrame(1);
+ _object1.setPriority(-1);
+ _object1.setPosition(Common::Point(110, 64));
+ _object1.hide();
+
+ _drunk.postInit();
+ _drunk.setVisage(120);
+ _drunk.setStrip(2);
+ _drunk.setFrame(5);
+ _drunk.setPriority(-1);
+ _drunk.setPosition(Common::Point(127, 97));
+ _drunk.hide();
+
+ _object2.postInit();
+ _object2.setVisage(121);
+ _object2.setStrip(5);
+ _object2.setFrame(1);
+ _object2.setPriority(-1);
+ _object2.setPosition(Common::Point(104, 64));
+ _object2.hide();
+
+ _object9.postInit();
+ _object9.setVisage(115);
+ _object9.setStrip(4);
+ _object9.setFrame(1);
+ _object9.setPosition(Common::Point(262, 29));
+ _object9.hide();
+
+ _object5.postInit();
+ _object5.hide();
+
+ _object7.postInit();
+ _object7.hide();
+
+ _object10.postInit();
+ _object10.hide();
+
+ BF_GLOBALS._player.disableControl();
+ setAction(&_action1, this);
+}
+
+void Scene109::signal() {
+ if (_sceneMode == 1) {
+ BF_GLOBALS._scenePalette.clearListeners();
+ BF_GLOBALS._sceneManager.changeScene(110);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 110 - Intro - Outside the bar
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene110::Action1::signal() {
+ Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ scene->_object8.show();
+ scene->_object7.show();
+ scene->_object1.show();
+ scene->_object4.show();
+ scene->_object5.show();
+ scene->_object6.show();
+ scene->_object9.show();
+ scene->_object10.show();
+ BF_GLOBALS._v51C44 = 1;
+ scene->loadScene(110);
+ setDelay(10);
+ break;
+ case 2:
+ BF_GLOBALS._v51C44 = 1;
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3: {
+ Common::Point pt(123, 121);
+ NpcMover *mover = new NpcMover();
+ scene->_object4.addMover(mover, &pt, this);
+ }
+ // No break on purpose
+ case 7:
+ setDelay(30);
+ break;
+ case 4:
+ // Guy running to the moto
+ scene->_object1.animate(ANIM_MODE_6, NULL);
+ break;
+ case 5:
+ scene->_object4.setStrip(2);
+ scene->_object4.setPosition(Common::Point(117, 106));
+ scene->_object4.animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ // Play "Vroum"
+ scene->_sound.play(31);
+ // The guy starts the engine
+ scene->_object4.setStrip(3);
+ scene->_object4._frame = 1;
+ scene->_object4.animate(ANIM_MODE_5, NULL);
+ // The guy looks behind him
+ scene->_object2.setPosition(Common::Point(227, 190));
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 8:
+ scene->_object2.animate(ANIM_MODE_6, this);
+ break;
+ case 9:
+ scene->_object2.remove();
+ scene->_object4.remove();
+ scene->_object5.setStrip(4);
+ scene->_object5.setFrame2(5);
+ scene->_object5.setPosition(Common::Point(105, 120));
+ setDelay(10);
+ scene->_object6.setPosition(Common::Point(127, 96));
+ scene->_object6.animate(ANIM_MODE_2, NULL);
+ scene->_object6.setAction(&scene->_action2);
+ scene->_sound.play(22);
+ break;
+ case 10:
+ scene->_object8.setAction(&scene->_action4);
+ scene->_object5.setFrame2(3);
+ scene->_object5.setPosition(Common::Point(87, 120));
+ setDelay(8);
+ break;
+ case 11:
+ scene->_object5.setFrame2(4);
+ scene->_object5.setPosition(Common::Point(62, 122));
+ setDelay(6);
+ break;
+ case 12:
+ scene->_object5.setFrame2(5);
+ scene->_object5.setPosition(Common::Point(35, 120));
+ scene->_object5.fixPriority(70);
+ setDelay(4);
+ break;
+ case 13:
+ scene->_object5.setFrame2(6);
+ scene->_object5.setPosition(Common::Point(22, 111));
+ setDelay(2);
+ break;
+ case 14:
+ scene->_object5.setFrame2(7);
+ scene->_object5.setPosition(Common::Point(19, 99));
+ setDelay(2);
+ break;
+ case 15:
+ scene->_object5.setFrame2(8);
+ scene->_object5.setPosition(Common::Point(54, 76));
+ setDelay(1);
+ break;
+ case 16: {
+ Common::Point pt(182, 54);
+ NpcMover *mover = new NpcMover();
+ scene->_object5.addMover(mover, &pt, this);
+ }
+ break;
+ case 17:
+ scene->_object5.remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene110::Action2::signal() {
+ Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ Common::Point pt(152, 94);
+ NpcMover *mover = new NpcMover();
+ scene->_object6.addMover(mover, &pt, this);
+ }
+ break;
+ case 1: {
+ Common::Point pt(167, 108);
+ NpcMover *mover = new NpcMover();
+ scene->_object6.addMover(mover, &pt, this);
+ }
+ break;
+ case 2: {
+ Common::Point pt(172, 109);
+ NpcMover *mover = new NpcMover();
+ scene->_object6.addMover(mover, &pt, this);
+ }
+ break;
+ case 3: {
+ Common::Point pt(179, 117);
+ NpcMover *mover = new NpcMover();
+ scene->_object6.addMover(mover, &pt, this);
+ }
+ break;
+ case 4:
+ setDelay(30);
+ break;
+ case 5:
+ scene->_object6.animate(ANIM_MODE_NONE, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene110::Action3::signal() {
+ Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_object7.setPosition(scene->_object7._position);
+ scene->_object1.setFrame(2);
+ setDelay(1);
+ break;
+ case 2:
+ scene->_object1.setFrame(3);
+ setDelay(1);
+ break;
+ case 3:
+ scene->_object1.setFrame(4);
+ scene->_object7.animate(ANIM_MODE_5, this);
+ break;
+ case 4: {
+ scene->_object1.animate(ANIM_MODE_6, NULL);
+ scene->_object7.setPosition(Common::Point(205, 99));
+ scene->_object7.setStrip(2);
+ scene->_object7.animate(ANIM_MODE_1, NULL);
+ scene->_object7.changeZoom(90);
+ Common::Point pt(151, 88);
+ NpcMover *mover = new NpcMover();
+ scene->_object7.addMover(mover, &pt, this);
+ }
+ break;
+ case 5:
+ scene->_object7.fixPriority(76);
+ scene->_object7.setStrip(3);
+ scene->_object7.changeZoom(90);
+ scene->_object7.setFrame(1);
+ scene->_object7.animate(ANIM_MODE_5, this);
+ scene->_object10.animate(ANIM_MODE_5, NULL);
+ break;
+ case 6:
+ scene->_object7.fixPriority(73);
+ scene->_object10.animate(ANIM_MODE_6, this);
+ break;
+ case 7: {
+ scene->_object7._yDiff = 1000;
+ scene->_object10.remove();
+ scene->_object9.setFrame2(2);
+ Common::Point pt(230, 53);
+ NpcMover *mover = new NpcMover();
+ scene->_object9.addMover(mover, &pt, this);
+ scene->_sound.play(23);
+ }
+ break;
+ case 8:
+ scene->_object9.remove();
+ BF_GLOBALS._sceneManager.changeScene(125);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene110::Action3::dispatch() {
+ Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene;
+
+ Action::dispatch();
+ if ((_actionIndex == 5) && (scene->_object7._percent > 80))
+ scene->_object7.changeZoom(scene->_object7._percent - 1);
+}
+
+void Scene110::Action4::signal() {
+ Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object8.setPosition(scene->_object8._position);
+ scene->_object1.setFrame(2);
+ setDelay(1);
+ break;
+ case 1:
+ scene->_object1.setFrame(3);
+ setDelay(1);
+ break;
+ case 2: {
+ scene->_object1.setFrame(4);
+ scene->_object8.fixPriority(90);
+ Common::Point pt(194, 119);
+ NpcMover *mover = new NpcMover();
+ scene->_object8.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ scene->_object1.animate(ANIM_MODE_6, NULL);
+ scene->_object8.setPosition(Common::Point(186, 117));
+ scene->_object8.setStrip(2);
+ scene->_object8.setFrame(1);
+ scene->_object3.setPosition(scene->_object3._position);
+ scene->_object3.setFrame(1);
+ setDelay(7);
+ break;
+ case 4:
+ scene->_object8.setFrame2(2);
+ scene->_object3.setFrame(3);
+ setDelay(7);
+ break;
+ case 5:
+ scene->_object8.setFrame2(3);
+ scene->_object3.setFrame(3);
+ setDelay(7);
+ scene->_object6.remove();
+ break;
+ case 6:
+ scene->_object8.setFrame2(4);
+ scene->_object3.setFrame(4);
+ setDelay(7);
+ break;
+ case 7:
+ scene->_object8.setFrame2(5);
+ scene->_object3.setFrame(5);
+ setDelay(7);
+ break;
+ case 8:
+ scene->_object8.setFrame2(7);
+ scene->_object3.setFrame(6);
+ setDelay(30);
+ break;
+ case 9: {
+ scene->_object3.remove();
+ scene->_object8.setFrame2(-1);
+ scene->_object8.setPosition(Common::Point(176, 105));
+ scene->_object8.animate(ANIM_MODE_1, NULL);
+ scene->_object8.setStrip(3);
+ Common::Point pt(141, 94);
+ NpcMover *mover = new NpcMover();
+ scene->_object8.addMover(mover, &pt, this);
+ scene->_object7.setAction(&scene->_action3);
+ }
+ break;
+ case 10: {
+ scene->_object8.fixPriority(77);
+ Common::Point pt(78, 76);
+ NpcMover *mover = new NpcMover();
+ scene->_object8.addMover(mover, &pt, this);
+ }
+ break;
+ case 11: {
+ scene->_object8.setPosition(Common::Point(87, 76));
+ scene->_object8.fixPriority(71);
+ scene->_object8.setStrip(6);
+ scene->_object8.changeZoom(75);
+ Common::Point pt(103, 74);
+ NpcMover *mover = new NpcMover();
+ scene->_object8.addMover(mover, &pt, this);
+ }
+ break;
+ case 12:
+ scene->_object8.setPosition(Common::Point(119, 59));
+ scene->_object8.setStrip(5);
+ scene->_object8.changeZoom(100);
+ scene->_object8.animate(ANIM_MODE_5, this);
+ break;
+ case 13:
+ scene->_object8.setPosition(Common::Point(119, 59), 300);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene110::Action4::dispatch() {
+ Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene;
+
+ Action::dispatch();
+ if ((_actionIndex > 9) && (_actionIndex < 12) && (scene->_object8._percent > 80))
+ scene->_object8.changeZoom(scene->_object8._percent - 1);
+}
+
+void Scene110::Action5::signal() {
+ Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object3.setPosition(scene->_object3._position);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ scene->_object3.remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene110::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(999);
+ _object8.postInit();
+ _object8.setVisage(112);
+ _object8.setPosition(Common::Point(239, 98), 300);
+ _object8.setFrame(1);
+ _object8.setStrip(1);
+ _object8.changeZoom(90);
+ _object8.fixPriority(90);
+ _object8.animate(ANIM_MODE_1, NULL);
+ _object8._moveDiff.x = 7;
+ _object8._moveDiff.y = 3;
+ _object8.hide();
+
+ _object3.postInit();
+ _object3.setVisage(112);
+ _object3.setPosition(Common::Point(247, 190), 300);
+ _object3.setFrame(1);
+ _object3.setStrip(4);
+ _object3.changeZoom(100);
+ _object3.fixPriority(255);
+
+ _object7.postInit();
+ _object7.setVisage(113);
+ _object7.setPosition(Common::Point(236, 86), 300);
+ _object7._frame = 1;
+ _object7.setStrip(1);
+ _object7.changeZoom(110);
+ _object7.fixPriority(89);
+ _object7._moveDiff.x = 7;
+ _object7._moveDiff.y = 3;
+ _object7.hide();
+
+ _object1.postInit();
+ _object1.setVisage(110);
+ _object1.setPosition(Common::Point(216, 88), 0);
+ _object1._frame = 1;
+ _object1.setStrip(1);
+ _object1.changeZoom(100);
+ _object1.fixPriority(83);
+ _object1.hide();
+
+ _object2.postInit();
+ _object2.setVisage(111);
+ _object2.setPosition(Common::Point(527, 190), 0);
+ _object2._frame = 1;
+ _object2.fixPriority(250);
+ _object2.setStrip(5);
+ _object2.changeZoom(100);
+
+ _object4.postInit();
+ _object4.setVisage(111);
+ _object4.setPosition(Common::Point(253, 98), 0);
+ _object4._frame = 1;
+ _object4.setStrip(1);
+ _object4.changeZoom(100);
+ _object4.fixPriority(90);
+ _object4.animate(ANIM_MODE_1, NULL);
+ _object4._moveDiff.x = 10;
+ _object4._moveDiff.y = 10;
+ _object4.hide();
+
+ _object5.postInit();
+ _object5.setVisage(111);
+ _object5.setPosition(Common::Point(114, 119), 0);
+ _object5.setFrame2(1);
+ _object5.setStrip(7);
+ _object5.fixPriority(70);
+ _object5.changeZoom(100);
+ _object5._moveDiff.x = 20;
+ _object5._moveDiff.y = 20;
+ _object5.hide();
+
+ _object6.postInit();
+ _object6.setVisage(111);
+ _object6.setPosition(Common::Point(527, 96), 0);
+ _object6._frame = 1;
+ _object6.setStrip(6);
+ _object6.changeZoom(100);
+ _object6.fixPriority(238);
+ _object6._moveDiff.x = 10;
+ _object6._moveDiff.y = 10;
+ _object6.hide();
+
+ _object9.postInit();
+ _object9.setVisage(110);
+ _object9.setPosition(Common::Point(148, 69), 0);
+ _object9._frame = 1;
+ _object9.setStrip(2);
+ _object9.changeZoom(100);
+ _object9.fixPriority(72);
+ _object9._moveDiff.x = 10;
+ _object9._moveDiff.y = 10;
+ _object9.hide();
+
+ _object10.postInit();
+ _object10.setVisage(110);
+ _object10._frame = 1;
+ _object10.setStrip(3);
+ _object10.changeZoom(100);
+ _object10.fixPriority(74);
+ _object10._moveDiff.x = 10;
+ _object10._moveDiff.y = 10;
+ _object10.setPosition(_object9._position);
+ _object10.hide();
+
+ setAction(&_action1);
+}
+/*--------------------------------------------------------------------------
+ * Scene 114 - Outside the Bar
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene114::Vechile::startAction(CursorType action, Event &event) {
+ Scene114 *scene = (Scene114 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(114, 0);
+ return true;
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1142;
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ scene->_lyle.fixPriority(-1);
+ scene->setAction(&scene->_sequenceManager1, scene, 1142, &BF_GLOBALS._player, &scene->_lyle, NULL);
+ } else {
+ Common::Point pt(155, 111);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene114::Door::startAction(CursorType action, Event &event) {
+ Scene114 *scene = (Scene114 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(114, 1);
+ return true;
+ case CURSOR_USE:
+ BF_GLOBALS._walkRegions.proc2(2);
+ BF_GLOBALS._player.disableControl();
+ scene->_lyle.fixPriority(-1);
+ scene->_sceneMode = 1140;
+ scene->setAction(&scene->_sequenceManager1, scene, 1140, &BF_GLOBALS._player, this, &scene->_lyle, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+void Scene114::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+
+ BF_GLOBALS._sound1.fadeSound(33);
+ loadScene(110);
+
+ setZoomPercents(85, 80, 105, 100);
+ BF_GLOBALS._walkRegions.proc1(9);
+ BF_GLOBALS._walkRegions.proc1(22);
+
+ _door.postInit();
+ _door.setVisage(110);
+ _door.setPosition(Common::Point(216, 88));
+ BF_GLOBALS._sceneItems.push_front(&_door);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(1358);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setPosition(Common::Point(155, 111));
+ BF_GLOBALS._player._moveDiff.x = 3;
+ BF_GLOBALS._player._moveDiff.y = 2;
+ BF_GLOBALS._player.changeZoom(-1);
+
+ _lyle.postInit();
+ _lyle.setVisage(1359);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setPosition(Common::Point(-118, -146));
+ _lyle.changeZoom(-1);
+ _lyle._moveDiff.x = 2;
+ _lyle._moveDiff.y = 1;
+ _lyle.hide();
+ _lyle.setDetails(114, 2, -1, -1, 1, NULL);
+
+ _vechile.postInit();
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _vechile.setVisage(444);
+ _vechile.setPosition(Common::Point(127, 78));
+ _vechile.fixPriority(20);
+ BF_GLOBALS._player.setPosition(Common::Point(139, 79));
+ _lyle.setPosition(Common::Point(86, 79));
+ _lyle.show();
+ } else {
+ _vechile.setVisage(380);
+ _vechile.setPosition(Common::Point(128, 125));
+ _vechile.setFrame(1);
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ _vechile.setStrip(2);
+ _vechile.changeZoom(70);
+ BF_GLOBALS._player.setVisage(352);
+ } else {
+ _vechile.setStrip(1);
+ _vechile.changeZoom(77);
+ }
+ BF_GLOBALS._walkRegions.proc1(17);
+ }
+ BF_GLOBALS._sceneItems.push_front(&_vechile);
+ BF_GLOBALS._walkRegions.proc1(2);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 115) {
+ BF_GLOBALS._player.setPosition(Common::Point(219, 100));
+ BF_GLOBALS._player.setStrip(6);
+ _lyle.setPosition(Common::Point(253, 110));
+ _lyle.fixPriority(108);
+ _lyle.setStrip(6);
+ BF_GLOBALS._player.enableControl();
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _sceneMode = 1141;
+ setAction(&_sequenceManager1, this, 1141, &_lyle, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 114, 3, -1, -1, 1, NULL);
+}
+
+void Scene114::signal() {
+ switch (_sceneMode) {
+ case 1140:
+ BF_GLOBALS._sceneManager.changeScene(115);
+ break;
+ case 1141:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 1142:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 115 - Inside Tony's bar
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene115::Object1::startAction(CursorType action, Event &event) {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display(115, 8, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_TALK:
+ if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(1174, scene);
+ } else if (scene->_field31E8 == 0) {
+ if (BF_GLOBALS.getFlag(fShowedIdToKate)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(1159, scene);
+ } else {
+ scene->_sceneMode = 1167;
+ scene->setAction(&scene->_action6);
+ }
+ } else
+ scene->setAction(&scene->_action7);
+ return true;
+ case INV_MUG_SHOT:
+ if (scene->_field31E8 == 0) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ if (BF_GLOBALS._v4CEAA == 0)
+ scene->_stripManager.start(1167, scene);
+ else if (BF_GLOBALS.getFlag(fShowedIdToKate))
+ scene->_stripManager.start(1159, scene);
+ else if (BF_GLOBALS.getFlag(fMugOnKate))
+ scene->_stripManager.start(1159, scene);
+ else {
+ scene->_sceneMode = 9999;
+ scene->setAction(&scene->_action6);
+ }
+ } else
+ SceneItem::display(115, 44, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case INV_ID:
+ if (scene->_field31E8 == 0) {
+ if (BF_GLOBALS._v4CEAA == 0) {
+ scene->_sceneMode = 1167;
+ scene->setAction(&scene->_action6);
+ } else if (BF_GLOBALS.getFlag(fShowedIdToKate)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(1159, scene);
+ } else {
+ BF_GLOBALS.setFlag(fShowedIdToKate);
+ scene->setAction(&scene->_action8);
+ }
+ } else
+ SceneItem::display(115, 44, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene115::Object2::startAction(CursorType action, Event &event) {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display(115, 7, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_TALK:
+ if (BF_GLOBALS._dayNumber == 3) {
+ if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1)
+ scene->_sceneMode = 1173;
+ else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) {
+ if (BF_GLOBALS.getFlag(fTalkedToTony))
+ scene->_sceneMode = 1151;
+ else if (BF_GLOBALS._v4CEAA == 0) {
+ scene->_sceneMode = 1150;
+ BF_GLOBALS.setFlag(fTalkedToTony);
+ } else
+ scene->_sceneMode = 1151;
+ } else if (_field15F8 == 0) {
+ _field15F8++;
+ scene->_sceneMode = 1171;
+ } else
+ scene->_sceneMode = 1172;
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ if (scene->_field31EA == 0) {
+ scene->_field31EA = 1;
+ scene->_sceneMode = 1169;
+ } else
+ scene->_sceneMode = 1170;
+ } else if (scene->_field31EA == 0) {
+ scene->_sceneMode = 1171;
+ scene->_field31EA = 1;
+ } else
+ scene->_sceneMode = 1172;
+
+ scene->setAction(&scene->_action9);
+ return true;
+ case INV_FOREST_RAP:
+ if (BF_GLOBALS.getFlag(onDuty))
+ scene->_sceneMode = 1178;
+ else
+ scene->_sceneMode = 1180;
+ scene->setAction(&scene->_action9);
+ return true;
+ case INV_COBB_RAP:
+ if (BF_GLOBALS.getFlag(onDuty))
+ scene->_sceneMode = 1177;
+ else if (BF_GLOBALS._v4CEAA == 0)
+ scene->_sceneMode = 1179;
+ else
+ scene->_sceneMode = 1154;
+
+ scene->setAction(&scene->_action9);
+ return true;
+ case INV_MUG_SHOT:
+ scene->setAction(&scene->_action2);
+ return true;
+ case INV_ID:
+ if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) {
+ scene->_sceneMode = 1173;
+ scene->setAction(&scene->_action9);
+ } else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) {
+ if (BF_GLOBALS.getFlag(fTalkedToTony)) {
+ scene->_sceneMode = 1151;
+ scene->setAction(&scene->_action9);
+ } else {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fTalkedToTony);
+ if (BF_GLOBALS._v4CEAA == 0) {
+ scene->_sceneMode = 1150;
+ scene->setAction(&scene->_action9);
+ } else {
+ BF_GLOBALS._v4CEAA = 1;
+ scene->setAction(&scene->_action2);
+ }
+ }
+ } else if (_field15F8 == 0) {
+ _field15F8++;
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ scene->_sceneMode = 1182;
+ scene->setAction(&scene->_action9);
+ } else {
+ scene->_sceneMode = 1171;
+ scene->setAction(&scene->_action9);
+ }
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ scene->_sceneMode = 1183;
+ scene->setAction(&scene->_action9);
+ } else {
+ scene->_sceneMode = 1172;
+ scene->setAction(&scene->_action9);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene115::Object3::startAction(CursorType action, Event &event) {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display(115, 9, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display(115, 23, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_TALK: {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ Common::Point pt(160, 110);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+ return true;
+ }
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene115::Object4::startAction(CursorType action, Event &event) {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display(115, 42, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_TALK:
+ scene->_sceneMode = 0;
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.updateAngle(_position);
+ scene->_stripManager.start(1184, scene);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+void Scene115::Item1::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ if (_field1F8A == 2)
+ _field1F8A = 0;
+
+ if (_field1F8A == 1) {
+ _field1F8A = 2;
+ setAction(&_sequenceManager6, this, 118, &scene->_object12, &scene->_object11, NULL);
+ }
+}
+
+bool Scene115::Item1::startAction(CursorType action, Event &event) {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (_field1F8A == 0) {
+ _field1F8A = 1;
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_action4);
+ } else
+ SceneItem::display(_resNum, 37, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ } else
+ return NamedHotspot::startAction(action, event);
+}
+
+void Scene115::Item1::synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+ s.syncAsSint16LE(_field1F8A);
+}
+
+Scene115::Item1::Item1() {
+ _field1F8A = 0;
+}
+
+void Scene115::EventHandler1::dispatch() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ if (BF_GLOBALS._player.getRegionIndex() == 27) {
+ scene->_object1.setAction(&scene->_action5);
+ scene->removeTimer(this);
+ }
+}
+
+bool Scene115::Item10::startAction(CursorType action, Event &event) {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ scene->_object4.setStrip2(6);
+ Common::Point pt(-20, 122);
+ NpcMover *mover = new NpcMover();
+ scene->_object4.addMover(mover, &pt, NULL);
+ }
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1150;
+ scene->setAction(&scene->_sequenceManager1, scene, 1150, &BF_GLOBALS._player, NULL);
+ return true;
+}
+
+bool Scene115::Item14::startAction(CursorType action, Event &event) {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display(115, 10, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_object3))
+ SceneItem::display(115, 23, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ else
+ SceneItem::display(115, 43, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+void Scene115::Action1::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ _actionIndex = 2 + BF_GLOBALS._randomSource.getRandomNumber(1);
+ setDelay(BF_GLOBALS._randomSource.getRandomNumber(180));
+ break;
+ case 2:
+ _actionIndex = 1;
+ setAction(&scene->_sequenceManager2, this, 115, &scene->_object3, &scene->_object8, &scene->_object9, &scene->_object10, NULL);
+ break;
+ case 3:
+ _actionIndex = 1;
+ setAction(&scene->_sequenceManager2, this, 116, &scene->_object3, &scene->_object8, &scene->_object9, &scene->_object10, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene115::Action2::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._v4CEAA < 3) {
+ if (scene->_object2._position.x > 67) {
+ scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_object2, NULL);
+ } else if (scene->_object2._position.x != 67) {
+ scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_object2, NULL);
+ }
+ }
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player);
+ break;
+ case 1:
+ BF_GLOBALS._v4CEAA++;
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ if (BF_GLOBALS.getFlag(fTalkedToTony)) {
+ switch (BF_GLOBALS._v4CEAA) {
+ case 1:
+ T2_GLOBALS._uiElements.addScore(30);
+ scene->_stripManager.start(1181, this);
+ break;
+ case 2:
+ scene->_stripManager.start(1176, this);
+ break;
+ default:
+ scene->_stripManager.start(1155, this);
+ break;
+ }
+ } else {
+ scene->_stripManager.start(1175, this);
+ }
+ } else {
+ if (BF_GLOBALS.getFlag(fTalkedToTony)) {
+ switch (BF_GLOBALS._v4CEAA) {
+ case 1:
+ T2_GLOBALS._uiElements.addScore(30);
+ scene->_stripManager.start(1153, this);
+ break;
+ case 2:
+ scene->_stripManager.start(1154, this);
+ break;
+ default:
+ scene->_stripManager.start(1155, this);
+ break;
+ }
+ } else {
+ scene->_stripManager.start(1152, this);
+ }
+ }
+ break;
+ case 2:
+ if (BF_GLOBALS._v4CEAA == 3)
+ scene->_object2.setAction(&scene->_sequenceManager3, NULL, 3119, &scene->_object2, NULL);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ default:
+ break;
+ }
+}
+
+void Scene115::Action3::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ setAction(&scene->_sequenceManager4, this, 3117, &scene->_object7, NULL);
+}
+
+void Scene115::Action4::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(145, 107);
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 1:
+ BF_GLOBALS._player.setStrip(4);
+ SceneItem::display(115, 27, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ scene->_object12.animate(ANIM_MODE_NONE);
+ setDelay(10);
+ break;
+ case 2:
+ setAction(&scene->_sequenceManager1, this, 117, &scene->_object12, &scene->_object11, NULL);
+ break;
+ case 3:
+ scene->_sound1.play(81, &scene->_item1, 127);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ default:
+ break;
+ }
+}
+
+void Scene115::Action5::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (scene->_item1._field1F8A == 0) {
+ setAction(&scene->_sequenceManager5, this, 1115, &scene->_object1, NULL);
+ } else {
+ _actionIndex--;
+ setDelay(120);
+ }
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager5, this, 117, &scene->_object12, &scene->_object11, NULL);
+ break;
+ case 2:
+ scene->_sound1.play(81, &scene->_item1, 127);
+ scene->_item1._field1F8A = 1;
+ setDelay(3);
+ break;
+ case 3:
+ setAction(&scene->_sequenceManager5, this, 1116, &scene->_object1, NULL);
+ break;
+ case 4:
+ scene->_field31E8 = 0;
+ remove();
+ default:
+ break;
+ }
+}
+
+void Scene115::Action6::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 2115, &scene->_object1, &BF_GLOBALS._player, NULL);
+ break;
+ case 1:
+ if (scene->_sceneMode == 9999) {
+ setAction(&scene->_sequenceManager1, this, 4115, &scene->_object1, &BF_GLOBALS._player, NULL);
+ _actionIndex--;
+ scene->_sceneMode = 1166;
+ } else {
+ scene->_stripManager.start(scene->_sceneMode, this);
+ }
+ break;
+ case 2:
+ scene->_object1.setVisage(131);
+ scene->_object1.setStrip(1);
+ scene->_object1.setFrame(1);
+ scene->_object1.setPosition(Common::Point(122, 97));
+ BF_GLOBALS._player.enableControl();
+ remove();
+ default:
+ break;
+ }
+}
+
+void Scene115::Action7::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ BF_GLOBALS._player.disableControl();
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(142, 105);
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.setStrip(4);
+ if (BF_GLOBALS._v4CEB0 == 0)
+ scene->_stripManager.start(1156, this);
+ else
+ scene->_stripManager.start(1157, this);
+ BF_GLOBALS._v4CEB0++;
+ break;
+ case 2:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene115::Action8::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setAction(&scene->_sequenceManager1, this, 2115, &scene->_object1, &BF_GLOBALS._player, NULL);
+ break;
+ case 1:
+ T2_GLOBALS._uiElements.addScore(30);
+ setAction(&scene->_sequenceManager1, this, 4115, &scene->_object1, &BF_GLOBALS._player, NULL);
+ break;
+ case 2:
+ scene->_stripManager.start(1160, this);
+ break;
+ case 3:
+ scene->_stripManager.start(1161, this);
+ break;
+ case 4:
+ BF_GLOBALS.setFlag(fGivenNapkin);
+ setAction(&scene->_sequenceManager1, this, 2117, &scene->_object1, &BF_GLOBALS._player, &scene->_object13, NULL);
+ break;
+ case 5:
+ BF_INVENTORY.setObjectScene(INV_NAPKIN, 1);
+ T2_GLOBALS._uiElements.addScore(10);
+ scene->_object1.setVisage(131);
+ scene->_object1.setStrip(1);
+ scene->_object1.setFrame(1);
+ scene->_object1.setPosition(Common::Point(122, 97));
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene115::Action9::signal() {
+ Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ if (scene->_object2._position.x > 67)
+ scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_object2, NULL);
+ else if (scene->_object2._position.x != 67)
+ scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_object2, NULL);
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player, NULL);
+ break;
+ case 1:
+ scene->_stripManager.start(scene->_sceneMode, this);
+ break;
+ case 2:
+ scene->_object2.setAction(&scene->_sequenceManager3, this, 3119, &scene->_object2, NULL);
+ break;
+ case 3:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ default:
+ break;
+ }
+}
+
+Scene115::Scene115() : SceneExt () {
+ _field168A = _field31E8 = _field31EA = 0;
+}
+
+void Scene115::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+
+ BF_GLOBALS._sound1.fadeSound(15);
+ loadScene(115);
+ setZoomPercents(98, 85, 115, 100);
+ _field31E8 = 0;
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_kateSpeaker);
+ _stripManager.addSpeaker(&_tonySpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ _object6.postInit();
+ _object6.setVisage(121);
+ _object6.setPosition(Common::Point(82, 66));
+ _object6._frame = 1;
+ _object6.setStrip(5);
+ _object6.changeZoom(100);
+ _object6.fixPriority(95);
+
+ _object5.postInit();
+ _object5.setVisage(121);
+ _object5.setPosition(Common::Point(111, 64));
+ _object5._frame = 1;
+ _object5.setStrip(6);
+ _object5.changeZoom(100);
+ _object5.fixPriority(95);
+
+ // Bartender
+ _object2.postInit();
+ _object2.setVisage(132);
+ _object2.setPosition(Common::Point(74, 66));
+ _object2.setStrip(3);
+ _object2.setFrame(1);
+ _object2.fixPriority(95);
+ _object2.animate(ANIM_MODE_2, NULL);
+ _object2._numFrames = 5;
+ _object2._field15F8 = 0;
+ _field31EA = 0;
+
+ //Neon sign
+ _object7.postInit();
+ _object7.setVisage(115);
+ _object7.setStrip(4);
+ _object7.setFrame(1);
+ _object7.setPosition(Common::Point(262, 29));
+ _object7.setAction(&_action3);
+
+ _object11.postInit();
+ _object11.hide();
+
+ _object12.postInit();
+ _object12.hide();
+
+ _object13.postInit();
+ _object13.hide();
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(129);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.changeZoom(-1);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _object4.postInit();
+ _object4.setVisage(469);
+ _object4.animate(ANIM_MODE_1, NULL);
+ _object4.setStrip2(1);
+ _object4.setPosition(Common::Point(-20, 155));
+ Common::Point destPos(17, 118);
+ NpcMover *mover = new NpcMover();
+ _object4.addMover(mover, &destPos, NULL);
+ BF_GLOBALS._sceneItems.push_front(&_object4);
+ BF_GLOBALS._walkRegions.proc1(1);
+ } else if (BF_GLOBALS.getFlag(onDuty))
+ BF_GLOBALS._player.setVisage(1341);
+
+ if (BF_GLOBALS._dayNumber == 3) {
+ _object3.postInit();
+ _object3.setVisage(123);
+ _object3.setPosition(Common::Point(212, 108));
+ _object3.setAction(&_action1);
+ _field168A = 0;
+ BF_GLOBALS._sceneItems.push_front(&_object3);
+
+ _object8.postInit();
+ _object8.setVisage(115);
+ _object8.setPosition(Common::Point(330, 87));
+ _object8.setStrip(3);
+ _object8.fixPriority(112);
+
+ _object9.postInit();
+ _object9.setVisage(115);
+ _object9.setPosition(Common::Point(330, 87));
+ _object9.setStrip(3);
+ _object9.fixPriority(112);
+
+ _object10.postInit();
+ _object10.setVisage(115);
+ _object10.setPosition(Common::Point(330, 87));
+ _object10.setStrip(3);
+ _object10.fixPriority(112);
+
+ if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) {
+ _object1.postInit();
+ _object1.setVisage(131);
+ _object1.setPosition(Common::Point(122, 97));
+ _object1.setStrip(1);
+ _object1.setFrame(1);
+ _object1.changeZoom(100);
+ _object1.fixPriority(95);
+ BF_GLOBALS._sceneItems.push_front(&_object1);
+ }
+ addTimer(&_eventHandler1);
+ }
+ BF_GLOBALS._sceneItems.push_front(&_object2);
+
+ _item11.setDetails(16, 115, 4, 15, 21, 1);
+ _item12.setDetails(20, 115, 5, 15, 21, 1);
+ _item13.setDetails(31, 115, 6, 16, 22, 1);
+ _item14._sceneRegionId = 13;
+ BF_GLOBALS._sceneItems.push_front(&_item14);
+ _item10.setDetails(Rect(0, 147, 30, 167), 115, -1, -1, -1, 1, NULL);
+ // SUB_177B8
+ addTimer(&_item1);
+ _item1.setDetails(Rect(147, 45, 179, 91), 115, 25, 26, 27, 1, NULL);
+ //
+ _item6.setDetails(Rect(107, 43, 122, 61), 115, 28, 29, 30, 1, NULL);
+ _item7.setDetails(Rect(180, 33, 230, 63), 115, 31, 32, 33, 1, NULL);
+ _item8.setDetails(Rect( 0, 35, 96, 66), 115, 34, 35, 36, 1, NULL);
+ _item2.setDetails(Rect( 0, 65, 135, 95), 115, 0, 12, 18, 1, NULL);
+ _item4.setDetails(Rect(104, 0, 150, 90), 115, 2, 14, 20, 1, NULL);
+ _item5.setDetails(Rect(148, 0, 320, 93), 115, 3, 14, 20, 1, NULL);
+ _item3.setDetails(Rect( 0, 95, 320, 168), 115, 1, 13, 19, 1, NULL);
+ _item9.setDetails(Rect( 0, 0, 320, 168), 115, 11, 17, 24, 1, NULL);
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 5115;
+ setAction(&_sequenceManager1, this, 5115, &BF_GLOBALS._player, NULL);
+}
+
+void Scene115::signal() {
+ switch (_sceneMode) {
+
+ case 1150:
+ BF_GLOBALS._sceneManager.changeScene(114);
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(_object3._position);
+ SceneItem::display(115, 38 + _field168A, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ _field168A++;
+ if (_field168A >= 4)
+ _field168A = 0;
+ // No break on purpose
+ case 0:
+ // No break on purpose
+ case 5115:
+ // No break on purpose
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene115::process(Event &event) {
+ SceneExt::process(event);
+ if (!BF_GLOBALS._player._enabled)
+ return;
+ if (event.mousePos.y >= 167)
+ return;
+ if (_item10._bounds.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+}
+
+void Scene115::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field168A);
+ s.syncAsSint16LE(_field31E8);
+ s.syncAsSint16LE(_field31EA);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 125 - Intro - Chase in the city
+ *
+ *--------------------------------------------------------------------------*/
+void Scene125::Action1::signal() {
+ Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 1: {
+ Common::Point destPos(214, 105);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 2:
+ owner->animate(ANIM_MODE_4, 4, 1, this);
+ break;
+ case 3:
+ owner->setFrame(5);
+ scene->_object2.show();
+ setDelay(180);
+ break;
+ case 4: {
+ Common::Point destPos(311, 85);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 5:
+ owner->remove();
+ break;
+ case 0:
+ // No break on purpose
+ default:
+ break;
+ }
+}
+
+void Scene125::Action2::signal() {
+ Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ scene->_action1.signal();
+ setDelay(20);
+ break;
+ case 2: {
+ BF_GLOBALS._v501FA = 10;
+ BF_GLOBALS._v51C44 = 1;
+ Common::Point destPos(202, 94);
+ NpcMover *mover = new NpcMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 3: {
+ scene->_action3.signal();
+ Common::Point destPos(280, 84);
+ NpcMover *mover = new NpcMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 4:
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 5: {
+ Common::Point destPos(375, 111);
+ NpcMover *mover = new NpcMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 6:
+ BF_GLOBALS._player.setStrip(2);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 7: {
+ Common::Point destPos(347, 139);
+ NpcMover *mover = new NpcMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 8:
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 9: {
+ Common::Point destPos(107, 75);
+ NpcMover *mover = new NpcMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ BF_GLOBALS._player.setPriority(80);
+ break;
+ }
+ case 10:
+ BF_GLOBALS._player.setStrip(4);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 11: {
+ BF_GLOBALS._player.setPriority(64);
+ Common::Point destPos(229, 61);
+ NpcMover *mover = new NpcMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 12:
+ scene->_action3.signal();
+ BF_GLOBALS._player.remove();
+ default:
+ break;
+ }
+}
+
+void Scene125::Action2::dispatch() {
+ Action::dispatch();
+
+ if ((_actionIndex == 10) && (BF_GLOBALS._player._percent > 80))
+ BF_GLOBALS._player.changeZoom(BF_GLOBALS._player._percent - 1);
+
+ if ((_actionIndex == 12) && (BF_GLOBALS._player._percent > 50))
+ BF_GLOBALS._player.changeZoom(BF_GLOBALS._player._percent - 1);
+}
+
+void Scene125::Action3::signal() {
+ Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1: {
+ Common::Point destPos(202, 94);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 2: {
+ Common::Point destPos(275, 84);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 3:
+ scene->_soundExt2.fadeSound(20);
+ owner->fixPriority(70);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 4: {
+ Common::Point destPos(375, 111);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 5:
+ owner->setStrip(2);
+ owner->setFrame(1);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 6: {
+ Common::Point destPos(347, 145);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 7:
+ owner->setStrip(3);
+ owner->setFrame(1);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 8: {
+ Common::Point destPos(96, 71);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ owner->_moveDiff.x = 6;
+ owner->_moveDiff.y = 6;
+ owner->setPriority(80);
+ break;
+ }
+ case 9:
+ owner->setPosition(Common::Point(85, 76));
+ owner->setStrip(4);
+ owner->setFrame(1);
+ owner->changeZoom(100);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 10: {
+ scene->_action5.signal();
+ scene->_soundExt1.play(25);
+ Common::Point destPos(154, 94);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 11:
+ break;
+ case 12:
+ scene->_object1.setPosition(owner->_position);
+ scene->_object1.changeZoom(2);
+ scene->_object1.show();
+ setDelay(1);
+ case 13:
+ BF_GLOBALS._sound1.play(6);
+ scene->_object1.changeZoom(4);
+ scene->_object1.setPosition(Common::Point(148, 88));
+ setDelay(1);
+ break;
+ case 14:
+ scene->_object1.changeZoom(8);
+ scene->_object1.setPosition(Common::Point(167, 97));
+ setDelay(1);
+ break;
+ case 15:
+ scene->_object1.changeZoom(16);
+ scene->_object1.setPosition(Common::Point(197, 104));
+ scene->_object4.show();
+ scene->_object3.show();
+ scene->_object4.changeZoom(16);
+ scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 9, scene->_object1._position.y - 8));
+ scene->_object3.changeZoom(16);
+ scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 5, scene->_object1._position.y - 8));
+ setDelay(1);
+ break;
+ case 16:
+ scene->_object1.changeZoom(32);
+ scene->_object1.setPosition(Common::Point(197, 104));
+ scene->_object4.changeZoom(32);
+ scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 17, scene->_object1._position.y - 15));
+ scene->_object3.changeZoom(32);
+ scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 12, scene->_object1._position.y - 15));
+ setDelay(1);
+ break;
+ case 17:
+ scene->_object1.changeZoom(64);
+ scene->_object1.setPosition(Common::Point(198, 114));
+ scene->_object4.changeZoom(64);
+ scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 34, scene->_object1._position.y - 29));
+ scene->_object3.changeZoom(64);
+ scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 23, scene->_object1._position.y - 29));
+ setDelay(1);
+ break;
+ case 18:
+ scene->_object1.changeZoom(100);
+ scene->_object1.setPosition(Common::Point(160, 112));
+ scene->_object4.changeZoom(100);
+ scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 51, scene->_object1._position.y - 45));
+ scene->_object3.changeZoom(100);
+ scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 42, scene->_object1._position.y - 45));
+ scene->_object4.animate(ANIM_MODE_5, this);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ setDelay(1);
+ break;
+ case 19:
+ break;
+ case 20:
+ setDelay(30);
+ break;
+ case 21:
+ BF_GLOBALS._sceneManager.changeScene(140);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene125::Action3::dispatch() {
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ Action::dispatch();
+
+ if ((_actionIndex == 9) && (owner->_percent > 70))
+ owner->changeZoom(owner->_percent - 1);
+}
+
+void Scene125::Action4::signal() {
+ Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(180);
+ break;
+ case 1: {
+ owner->setPriority(scene->_object2._priority - 1);
+ Common::Point destPos(66, 168);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 2:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 3: {
+ Common::Point destPos(307, 106);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 4:
+ owner->remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene125::Action4::dispatch() {
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ Action::dispatch();
+
+ if ((_actionIndex == 4) && (owner->_percent > 80))
+ owner->changeZoom(owner->_percent - 1);
+}
+
+void Scene125::Action5::signal() {
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ if (_actionIndex++ == 1) {
+ Common::Point destPos(162, 103);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ }
+}
+
+void Scene125::Action6::signal() {
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1: {
+ Common::Point destPos(410, 181);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 2:
+ owner->remove();
+ default:
+ break;
+ }
+}
+
+void Scene125::Action6::dispatch() {
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ Action::dispatch();
+
+ if ((_actionIndex == 2) && (owner->_percent < 100))
+ owner->changeZoom(owner->_percent + 1);
+}
+
+void Scene125::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(120);
+
+ _object4.postInit();
+ _object4.setVisage(124);
+ _object4.setPosition(Common::Point(0, 0));
+ _object4.setStrip(1);
+ _object4.setFrame(1);
+ _object4.fixPriority(251);
+ _object4.hide();
+
+ _object3.postInit();
+ _object3.setVisage(124);
+ _object3.setPosition(Common::Point(0, 0));
+ _object3.setStrip(2);
+ _object3.setFrame(1);
+ _object3.fixPriority(251);
+ _object3.hide();
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(127);
+ BF_GLOBALS._player.setPosition(Common::Point(160, 110));
+ BF_GLOBALS._player.setStrip(1);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.changeZoom(100);
+ BF_GLOBALS._player.fixPriority(68);
+ BF_GLOBALS._player._moveDiff.x = 6;
+ BF_GLOBALS._player._moveDiff.y = 6;
+ BF_GLOBALS._player.disableControl();
+
+ _object5.postInit();
+ _object5.setVisage(128);
+ _object5.setPosition(Common::Point(150, 117));
+ _object5.fixPriority(68);
+ _object5._moveDiff.x = 6;
+ _object5._moveDiff.y = 6;
+
+ _object9.postInit();
+ _object9.setVisage(126);
+ _object9.setPosition(Common::Point(124, 106));
+ _object9.setStrip(4);
+ _object9.fixPriority(90);
+ _object9._moveDiff.x = 3;
+ _object9._moveDiff.y = 3;
+
+ _object1.postInit();
+ _object1.setVisage(130);
+ _object1.setPosition(Common::Point(139, 88));
+ _object1.setStrip(1);
+ _object1.setFrame(1);
+ _object1.changeZoom(100);
+ _object1.fixPriority(250);
+ _object1.hide();
+
+ _object8.postInit();
+ _object8.setVisage(126);
+ _object8.setPosition(Common::Point(89, 181));
+ _object8.setStrip(3);
+ _object8._moveDiff.x = 6;
+ _object8._moveDiff.y = 6;
+
+ _object6.postInit();
+ _object6.setVisage(126);
+ _object6.setPosition(Common::Point(289, 128));
+ _object6.fixPriority(69);
+ _object6._moveDiff.x = 6;
+ _object6._moveDiff.y = 6;
+ _object6.setAction(&_action1);
+
+ _object2.postInit();
+ _object2.setVisage(126);
+ _object2.setPosition(Common::Point(214, 105));
+ _object2.setStrip(2);
+ _object2.setFrame(1);
+ _object2.changeZoom(100);
+ _object2.fixPriority(63);
+ _object2.hide();
+
+ _object7.postInit();
+ _object7.setVisage(126);
+ _object7.setPosition(Common::Point(87, 76));
+ _object7.setStrip(6);
+ _object7.setFrame(6);
+ _object7.changeZoom(80);
+ _object7._moveDiff.x = 4;
+ _object7._moveDiff.y = 4;
+ _object7.setAction(&_action6);
+
+ BF_GLOBALS._sound1.play(5);
+ setAction(&_action2);
+ _object5.setAction(&_action3);
+ _object8.setAction(&_action4);
+ _object9.setAction(&_action5);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 140 - Intro - Near the house
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene140::Action1::signal() {
+ Scene140 *scene = (Scene140 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->loadScene(999);
+ setDelay(2);
+ break;
+ case 1:
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ BF_GLOBALS._scenePalette.refresh();
+ scene->_text.setup(BF_19840518, this);
+ break;
+ case 2:
+ scene->_object1.show();
+ scene->loadScene(140);
+ setDelay(1);
+ break;
+ case 3: {
+ Common::Point destPos(236, 144);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ owner->_numFrames = 7;
+ break;
+ }
+ case 4:
+ owner->setStrip(3);
+ owner->setFrame(1);
+ owner->_numFrames = 5;
+ owner->setPosition(Common::Point(226, 143));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ owner->setStrip(4);
+ owner->setFrame(1);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ scene->_object1.animate(ANIM_MODE_5, this);
+ owner->setStrip(1);
+ owner->setFrame(1);
+ break;
+ case 7:
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(owner->_position.x, owner->_position.y + 1));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 8:
+ owner->animate(ANIM_MODE_6, this);
+ owner->_numFrames = 10;
+ break;
+ case 9:
+ owner->_numFrames = 5;
+ owner->setPosition(Common::Point(217, 117));
+ owner->setStrip(2);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 10:
+ owner->setPosition(Common::Point(212, 117));
+ setDelay(10);
+ // No break on purpose
+ case 11:
+ owner->setPosition(owner->_position, 1000);
+ setDelay(60);
+ break;
+ case 12:
+ BF_GLOBALS._sound1.play(8);
+ setDelay(60);
+ // No break on purpose
+ case 13:
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(150);
+ default:
+ break;
+ }
+}
+
+void Scene140::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(999);
+
+ _object2.postInit();
+ _object2.setVisage(141);
+ _object2.setPosition(Common::Point(333, 149));
+ _object2.setStrip(5);
+ _object2.animate(ANIM_MODE_1, NULL);
+ _object2._moveDiff.x = 3;
+
+ _object1.postInit();
+ _object1.setVisage(141);
+ _object1.setPosition(Common::Point(202, 115));
+ _object1.setFrame(1);
+ _object1.setStrip(6);
+ _object1.changeZoom(100);
+ _object1.hide();
+
+ BF_GLOBALS._v5020C = 0;
+ BF_GLOBALS._v501F8 = 300;
+ BF_GLOBALS._v501FC = 90;
+ BF_GLOBALS._sound1.play(7);
+
+ _object2.setAction(&_action1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 150 - Intro - Burglar inside the house
+ *
+ *--------------------------------------------------------------------------*/
+void Scene150::Action1::signal() {
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+ static uint32 v50B96 = 0;
+
+ switch (_actionIndex++) {
+ case 0:
+ _actionIndex = 5;
+ _object2.postInit();
+ _object2.setVisage(150);
+ _object2.setStrip(3);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(148, 126));
+ _object2.changeZoom(100);
+ setDelay(10);
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ owner->_frame = 1;
+ owner->setStrip(4);
+ owner->animate(ANIM_MODE_4, 3, 1, this);
+ break;
+ case 3:
+ owner->animate(ANIM_MODE_5, this);
+ _object2.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ _object2.remove();
+ break;
+ case 5:
+ owner->_numFrames = 8;
+ owner->_frame = 1;
+ owner->setStrip(2);
+ owner->animate(ANIM_MODE_4, 14, 1, this);
+ break;
+ case 6:
+ owner->fixPriority(119);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 7:
+ setDelay(60);
+ break;
+ case 8:
+ BF_GLOBALS._sound1.stop();
+ // No break on purpose
+ case 9:
+ _sound1.play(8);
+ setDelay(30);
+ break;
+ case 10:
+ BF_GLOBALS._scenePalette.addFader((const byte *)&v50B96, 1, 2, this);
+ break;
+ case 11:
+ BF_GLOBALS._sound1.play(9);
+ BF_GLOBALS._sceneManager.changeScene(160);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene150::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(150);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setPosition(Common::Point(160, 100));
+ BF_GLOBALS._player._moveDiff.x = 15;
+ BF_GLOBALS._player.hide();
+
+ _object1.postInit();
+ _object1.setVisage(150);
+ _object1.setPosition(Common::Point(158, 119));
+ _object1._numFrames = 5;
+ _object1.fixPriority(121);
+ _object1.setAction(&_action1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 160 - Intro - Burial
+ *
+ *--------------------------------------------------------------------------*/
+void Scene160::Action1::signal() {
+ Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1:
+ scene->_kid.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ // No break on purpose
+ case 10:
+ scene->_grandma.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ // No break on purpose
+ case 6:
+ scene->_kid.animate(ANIM_MODE_6, this);
+ break;
+ case 4:
+ scene->_kid.setPosition(Common::Point(scene->_kid._position.x - 2, scene->_kid._position.y + 19));
+ scene->_kid.setFrame(1);
+ scene->_kid.setStrip(2);
+ scene->_kid.animate(ANIM_MODE_5, this);
+
+ scene->_kidBody.setPosition(scene->_kid._position);
+ scene->_kidBody.setFrame(1);
+ scene->_kidBody.setStrip(3);
+ break;
+ case 5:
+ setDelay(60);
+ break;
+ case 7:
+ scene->_kidBody.remove();
+ scene->_kid.setStrip(6);
+ scene->_kid.setFrame(1);
+ scene->_kid.setPosition(Common::Point(scene->_kid._position.x - 4, scene->_kid._position.y + 19));
+ scene->_grandma.animate(ANIM_MODE_6, this);
+ scene->_grandma._numFrames = 7;
+ break;
+ case 8:
+ scene->_grandma.setStrip(2);
+ scene->_grandma.setFrame(1);
+ scene->_grandma.animate(ANIM_MODE_5, this);
+ break;
+ case 9:
+ setDelay(120);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene160::Action2::signal() {
+ Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+ static uint32 v50BAB = 0;
+ static uint32 v50BC3 = 0;
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ owner->_numFrames = 8;
+ break;
+ case 2:
+ owner->setStrip(2);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(scene->_flag._position.x + 56, scene->_flag._position.y + 2));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ owner->setStrip(3);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(scene->_flag._position.x + 26, scene->_flag._position.y - 8));
+ owner->animate(ANIM_MODE_4, 8, 1, this);
+ break;
+ case 4:
+ scene->_flag.remove();
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ owner->setVisage(162);
+ owner->setStrip(1);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(owner->_position.x + 27, owner->_position.y + 11));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ owner->setStrip(2);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(owner->_position.x - 42, owner->_position.y + 15));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 7:
+ owner->setStrip(3);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(owner->_position.x + 1, owner->_position.y));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 8:
+ owner->setStrip(4);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(owner->_position.x - 3, owner->_position.y - 1));
+
+ scene->_leftOfficer.show();
+ scene->_leftOfficer.setStrip(1);
+ scene->_leftOfficer.setFrame(1);
+ scene->_leftOfficer.setPosition(Common::Point(owner->_position.x + 8, owner->_position.y - 39));
+ scene->_leftOfficer._numFrames = 5;
+ scene->_leftOfficer.animate(ANIM_MODE_5, this);
+ break;
+ case 9:
+ setDelay(30);
+ break;
+ case 10:
+ scene->_leftOfficer.hide();
+ owner->setVisage(163);
+ owner->setStrip(2);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(owner->_position.x + 39, owner->_position.y));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 11:
+ scene->_leftOfficer.fixPriority(owner->_priority + 1);
+ setDelay(60);
+ break;
+ case 12:
+ scene->_leftOfficer.show();
+ scene->_leftOfficer.setPosition(Common::Point(owner->_position.x - 32, owner->_position.y - 38));
+ scene->_leftOfficer.setStrip(3);
+ scene->_leftOfficer.setFrame(1);
+
+ owner->setVisage(165);
+ owner->setPosition(Common::Point(owner->_position.x + 6, owner->_position.y - 3));
+ owner->setStrip(1);
+ owner->setFrame(1);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 13: {
+ owner->setStrip(2);
+ owner->setFrame(1);
+ owner->changeZoom(110);
+ owner->animate(ANIM_MODE_1, NULL);
+ Common::Point destPos(scene->_kid._position.x - 25, scene->_kid._position.y + 15);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 14:
+ owner->changeZoom(100);
+ owner->setStrip(5);
+ owner->setFrame(1);
+ scene->_kid.animate(ANIM_MODE_4, 5, 1, this);
+ break;
+ case 15:
+ owner->animate(ANIM_MODE_5, this);
+ scene->_kid.animate(ANIM_MODE_5, NULL);
+ break;
+ case 16:
+ owner->setStrip(6);
+ owner->setFrame(1);
+ owner->setPosition(Common::Point(owner->_position.x - 8, owner->_position.y + 3));
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 17:
+ setDelay(70);
+ break;
+ case 18:
+ owner->animate(ANIM_MODE_6, this);
+ break;
+ case 19:
+ setDelay(120);
+ break;
+ case 20:
+ BF_GLOBALS._sound1.changeSound(10);
+ BF_GLOBALS._scenePalette.addFader((const byte *)&v50BAB, 1, 2, this);
+ break;
+ case 21:
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ scene->loadScene(999);
+ setDelay(2);
+ break;
+ case 22:
+ scene->_sceneBounds.set(0, 0, 320, 200);
+ scene->_text.setup(BF_11_YEARS, this);
+ break;
+ case 23:
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ scene->loadScene(165);
+ BF_GLOBALS._scenePalette.addFader((const byte *)&v50BC3, 1, -5, this);
+ break;
+ case 24:
+ setDelay(900);
+ break;
+ case 25:
+ BF_GLOBALS._sound1.fade(0, 10, 10, true, this);
+// FIXME: Currently, fade() doesn't end properly with this song,
+// thus never returns here. This hack skips the wait and changes
+// directly to the next scene
+// Start of hack
+// break;
+// case 26:
+ setDelay(5);
+ BF_GLOBALS._sound1.stop();
+// End of hack
+
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(200);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene160::Action2::process(Event &event) {
+ if ((event.handled) || (event.eventType == 5))
+ return;
+
+ if (_actionIndex == 25) {
+ event.handled = true;
+ setDelay(1);
+ }
+}
+
+void Scene160::Action3::signal() {
+ Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_text.setup(BF_3_DAYS, this);
+ break;
+ case 1: {
+ Common::Point destPos(720, 100);
+ NpcMover *mover = new NpcMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 2:
+ scene->_action1.signal();
+ scene->_action2.signal();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene160::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(160);
+ _sceneBounds.moveTo(0, 0);
+
+ BF_GLOBALS._scenePalette.loadPalette(2);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setPosition(Common::Point(160, 100));
+ BF_GLOBALS._player._moveDiff.x = 15;
+ BF_GLOBALS._player.hide();
+
+ _grandma.postInit();
+ _grandma.setVisage(54);
+ _grandma.setPosition(Common::Point(712, 97));
+ _grandma.fixPriority(66);
+
+ _kid.postInit();
+ _kid.setPosition(Common::Point(732, 65));
+ _kid.setVisage(164);
+ _kid.setStrip(4);
+ _kid.fixPriority(68);
+
+ _kidBody.postInit();
+ _kidBody.setPosition(Common::Point(_kid._position.x, _kid._position.y));
+ _kidBody.setVisage(164);
+ _kidBody.setStrip(5);
+ _kidBody.fixPriority(68);
+
+ _flag.postInit();
+ _flag.setPosition(Common::Point(645, 116));
+ _flag.setVisage(161);
+ _flag.setStrip(4);
+ _flag.fixPriority(80);
+
+ _rightOfficer.postInit();
+ _rightOfficer.setVisage(161);
+ _rightOfficer.setPosition(Common::Point(_flag._position.x + 58, _flag._position.y + 11));
+ _rightOfficer.fixPriority(81);
+
+ _leftOfficer.postInit();
+ _leftOfficer.setVisage(163);
+ _leftOfficer.setPosition(Common::Point(620, 79));
+ _leftOfficer.setStrip(3);
+ _leftOfficer.fixPriority(81);
+ _leftOfficer.hide();
+
+ _rightOfficer.setAction(&_action2);
+ _grandma.setAction(&_action1);
+ setAction(&_action3);
+
+ _sceneBounds.center(BF_GLOBALS._player._position.x, BF_GLOBALS._player._position.y);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 180 - Front of Home
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene180::Vechile::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE) {
+ BF_GLOBALS._sceneManager.changeScene(60);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene180::GarageExit::startAction(CursorType action, Event &event) {
+ Scene180 *scene = (Scene180 *)BF_GLOBALS._sceneManager._scene;
+
+ if (scene->_garageExit.contains(event.mousePos)) {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 256, 114);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene180::Scene180(): SceneExt() {
+ _fieldC56 = 0;
+}
+
+void Scene180::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_fieldC56);
+}
+
+void Scene180::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+
+ if (((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) ||
+ ((BF_GLOBALS._bookmark == bDroppedOffLyle) && (BF_GLOBALS._dayNumber == 3)) ||
+ ((BF_GLOBALS._bookmark == bDoneAtLyles) && (BF_GLOBALS._dayNumber == 4)))
+ loadScene(999);
+ else
+ loadScene(1180);
+ _garageExit.setDetails(Rect(243, 93, 275, 122), 180, -1, -1, -1, 1, NULL);
+ _gameTextSpeaker._textPos.y = 180;
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _fieldC56 = 0;
+ setZoomPercents(121, 60, 125, 70);
+
+ if ((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) {
+ BF_GLOBALS._v501FC = 87;
+ BF_GLOBALS._v501FA = _sceneBounds.left + 10;
+ // CHECKME: BF_GLOBALS._v50206 = 18; ??
+ _sceneMessage.setup(THE_NEXT_DAY);
+ _sceneMode = 6;
+ setAction(&_sceneMessage, this);
+ BF_GLOBALS._driveFromScene = 4;
+ BF_GLOBALS._driveToScene = 4;
+ BF_GLOBALS._mapLocationId = 4;
+ } else if (((BF_GLOBALS._bookmark == bDroppedOffLyle) && (BF_GLOBALS._dayNumber == 3)) ||
+ ((BF_GLOBALS._bookmark == bDoneAtLyles) && (BF_GLOBALS._dayNumber == 4))) {
+ BF_GLOBALS._v501FC = 87;
+ BF_GLOBALS._v501FA = _sceneBounds.left + 10;
+ // CHECKME: BF_GLOBALS._v50206 = 18; ??
+ _sceneMessage.setup(THE_NEXT_DAY);
+ _sceneMode = 6;
+ setAction(&_sceneMessage, this);
+ } else if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._player.setPosition(Common::Point(0, 150));
+ _vechile.postInit();
+ _garageExit.postInit();
+
+ BF_GLOBALS._driveToScene = 190;
+ BF_GLOBALS._sound1.play(31);
+ BF_GLOBALS._sound1.holdAt(1);
+ _sceneMode = 1800;
+
+ setAction(&_sequenceManager, this, 1800, &_vechile, &_object1, NULL);
+ } else if (BF_GLOBALS._driveFromScene == 180) {
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(831);
+ BF_GLOBALS._player.setPosition(Common::Point(285, 125));
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._strip = 3;
+ BF_GLOBALS._player.changeZoom(-1);
+
+ _vechile.postInit();
+ _vechile.setVisage(580);
+ _vechile.setStrip(2);
+ _vechile.setPosition(Common::Point(262, 131));
+ _vechile.setZoom(65);
+ _vechile.setDetails(180, 33, 34, 35, 1, NULL);
+
+ _object1.postInit();
+ _object1.setVisage(182);
+ _object1.setStrip(2);
+ _object1.setPosition(Common::Point(258, 122));
+ _object1.setFrame(6);
+
+ BF_GLOBALS._driveFromScene = 0;
+ BF_GLOBALS._player.enableControl();
+ } else if (BF_GLOBALS._driveToScene != 180) {
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.disableControl();
+
+ _vechile.postInit();
+ _vechile.setDetails(180, 33, 34, 35, 1, NULL);
+
+ _object1.postInit();
+
+ BF_GLOBALS._driveFromScene = 4;
+ BF_GLOBALS._driveToScene = 4;
+ BF_GLOBALS._mapLocationId = 4;
+
+ BF_GLOBALS._sound1.fadeSound(33);
+ _sceneMode = 1801;
+ setAction(&_sequenceManager, this, 1801, &BF_GLOBALS._player, &_vechile, &_object1, NULL);
+ } else {
+ BF_GLOBALS._driveFromScene = 0;
+ if (!BF_GLOBALS.getFlag(onDuty) && !BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._player.setPosition(Common::Point(0, 150));
+
+ _object1.postInit();
+ _object1.setVisage(182);
+ _object1.setStrip(2);
+ _object1.setPosition(Common::Point(258, 122));
+
+ _vechile.postInit();
+ _vechile.setVisage(181);
+ _vechile.setStrip(2);
+ _vechile.changeZoom(80);
+ _vechile.fixPriority(150);
+ _vechile._moveDiff = Common::Point(40, 5);
+ _vechile.setPosition(Common::Point(-25, 171));
+
+ _fieldC56 = 1;
+
+ BF_GLOBALS._sound1.play(29);
+ _sceneMode = 1;
+ ADD_MOVER(_vechile, 259, 150);
+ } else {
+ BF_GLOBALS._player.setPosition(Common::Point(0, 150));
+
+ _object1.postInit();
+ _object1.setVisage(182);
+ _object1.setStrip(2);
+ _object1.setPosition(Common::Point(258, 122));
+
+ _vechile.postInit();
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._sound1.play(29);
+
+ _vechile.setVisage(191);
+ _vechile.setStrip(3);
+ _vechile._frame = 5;
+ _vechile.changeZoom(75);
+
+ _fieldC56 = 1;
+ _vechile._moveDiff.x = 45;
+ } else {
+ _vechile.setVisage(444);
+ _vechile.setStrip(2);
+ _vechile.changeZoom(85);
+
+ _fieldC56 = 3;
+ _vechile._moveDiff.x = 30;
+ }
+
+ _vechile.fixPriority(150);
+ _vechile._moveDiff.y = 5;
+ _vechile.setPosition(Common::Point(-25, 171));
+
+ _sceneMode = 3;
+ ADD_MOVER(_vechile, 258, 145);
+ }
+ }
+
+ if (_sceneMode != 6) {
+ _frontDoor.setDetails(Rect(183, 92, 218, 122), 180, 27, 28, 29, 1, NULL);
+ _driveway.setDetails(8, 180, 36, 37, 38, 1);
+ _street.setDetails(1, 180, 21, 22, 23, 1);
+ _lawn.setDetails(3, 180, 18, 19, 20, 1);
+ _bushes.setDetails(4, 180, 15, 16, 17, 1);
+ _palms.setDetails(6, 180, 12, 13, 14, 1);
+ _garage.setDetails(Rect(241, 85, 319, 121), 180, 30, 31, 32, 1, NULL);
+ _fence.setDetails(Rect(0, 109, 21, 125), 180, 9, 10, 11, 1, NULL);
+ _house.setDetails(5, 180, 24, 25, 26, 1);
+ _steps.setDetails(7, 180, 6, 7, 8, 1);
+ _curb.setDetails(2, 180, 3, 4, 5, 1);
+ _sky.setDetails(Rect(0, 0, 319, 190), 180, 0, 1, 2, 1, NULL);
+ }
+}
+
+void Scene180::signal() {
+ switch (_sceneMode) {
+ case 1:
+ _fieldC56 = 0;
+ switch (BF_GLOBALS._bookmark) {
+ case bFlashBackThree:
+ BF_GLOBALS._bookmark = bDroppedOffLyle;
+ _sceneMode = 7;
+ break;
+ case bDoneWithIsland:
+ BF_GLOBALS._bookmark = bDoneAtLyles;
+ _sceneMode = 8;
+ break;
+ default:
+ _sceneMode = 1802;
+ break;
+ }
+
+ setAction(&_sequenceManager, this, 1802, &_vechile, &_object1, NULL);
+ break;
+ case 2:
+ _fieldC56 = 0;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._driveToScene);
+ break;
+ case 3:
+ _fieldC56 = 0;
+ BF_GLOBALS._sound1.stop();
+ _stripManager.start(1800, this);
+ _sceneMode = 4;
+ break;
+ case 4:
+ _sceneMode = 5;
+ BF_GLOBALS._sound1.fadeSound(29);
+ ADD_MOVER(_vechile, 340, 140);
+ _vechile._moveDiff.y = 1;
+ break;
+ case 5:
+ BF_GLOBALS._sceneManager.changeScene(50);
+ break;
+ case 6:
+ loadScene(1180);
+ BF_GLOBALS._sound1.fadeSound(33);
+
+ switch (BF_GLOBALS._bookmark) {
+ case bLyleStoppedBy:
+ BF_GLOBALS._dayNumber = 2;
+ BF_INVENTORY.alterInventory(2);
+ break;
+ case bDroppedOffLyle:
+ BF_GLOBALS._dayNumber = 4;
+ BF_INVENTORY.alterInventory(4);
+ break;
+ case bDoneAtLyles:
+ BF_GLOBALS._dayNumber = 5;
+ BF_INVENTORY.alterInventory(5);
+ break;
+ default:
+ break;
+ }
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.disableControl();
+
+ _vechile.postInit();
+ _vechile.setDetails(180, 33, 34, 35, 1, NULL);
+
+ _object1.postInit();
+ _sceneMode = 1801;
+ setAction(&_sequenceManager, this, 1801, &BF_GLOBALS._player, &_vechile, &_object1, NULL);
+
+ _frontDoor.setDetails(Rect(183, 92, 218, 122), 180, 27, 28, 29, 1, NULL);
+ _driveway.setDetails(8, 180, 36, 37, 38, 1);
+ _street.setDetails(1, 180, 21, 22, 23, 1);
+ _lawn.setDetails(3, 180, 18, 19, 20, 1);
+ _bushes.setDetails(4, 180, 15, 16, 17, 1);
+ _palms.setDetails(6, 180, 12, 13, 14, 1);
+ _garage.setDetails(Rect(241, 85, 319, 121), 180, 30, 31, 32, 1, NULL);
+ _fence.setDetails(Rect(0, 109, 21, 125), 180, 9, 10, 11, 1, NULL);
+ _house.setDetails(4, 180, 24, 25, 26, 1);
+ _steps.setDetails(7, 180, 6, 7, 8, 1);
+ _curb.setDetails(2, 180, 3, 4, 5, 1);
+ _sky.setDetails(Rect(0, 0, 319, 190), 180, 0, 1, 2, 1, NULL);
+ break;
+ case 7:
+ BF_INVENTORY.setObjectScene(INV_COBB_RAP, 0);
+ BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 0);
+ BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 0);
+ BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 0);
+ BF_INVENTORY.setObjectScene(INV_NAPKIN, 0);
+ BF_INVENTORY.setObjectScene(INV_9MM_BULLETS, 0);
+ BF_INVENTORY.setObjectScene(INV_SCHEDULE, 0);
+ BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 0);
+
+ BF_GLOBALS._sceneManager.changeScene(180);
+ break;
+ case 8:
+ if (BF_GLOBALS.getFlag(fLeftTraceIn900) || BF_GLOBALS.getFlag(fGotPointsForSearchingDA) ||
+ BF_GLOBALS.getFlag(fLeftTraceIn920)) {
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._driveToScene = 0;
+ BF_GLOBALS._driveFromScene = 0;
+ BF_GLOBALS._sceneManager.changeScene(271);
+ } else {
+ BF_GLOBALS._sceneManager.changeScene(180);
+ }
+ break;
+ case 1800:
+ _fieldC56 = 2;
+ _vechile._moveDiff.x = 10;
+ _sceneMode = 2;
+ ADD_MOVER(_vechile, -25, 171);
+ break;
+ case 1801:
+ BF_GLOBALS._player._strip = 3;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 1802:
+ BF_GLOBALS._sound1.release();
+ BF_GLOBALS._driveToScene = 0;
+ BF_GLOBALS._driveFromScene = 0;
+ BF_GLOBALS._sceneManager.changeScene(270);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene180::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ if (_vechile.contains(event.mousePos)) {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ } else if (_garageExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene180::dispatch() {
+ switch (_fieldC56) {
+ case 1:
+ if (_vechile._mover && (_vechile._percent > 50))
+ _vechile.changeZoom(_vechile._percent - 1);
+ if (_vechile._moveDiff.x > 15)
+ --_vechile._moveDiff.x;
+ break;
+ case 2:
+ if (_vechile._mover && (_vechile._percent < 100))
+ _vechile.changeZoom(_vechile._percent + 1);
+ if (_vechile._moveDiff.x < 35)
+ ++_vechile._moveDiff.x;
+ break;
+ case 3:
+ if (_vechile._mover && (_vechile._percent > 70))
+ _vechile.changeZoom(_vechile._percent - 1);
+ if (_vechile._moveDiff.x > 15)
+ --_vechile._moveDiff.x;
+ break;
+ default:
+ break;
+ }
+
+ SceneExt::dispatch();
+
+ if (!_action && (BF_GLOBALS._player._position.y < 120)) {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._driveToScene = 0;
+ BF_GLOBALS._driveFromScene = 0;
+
+ if (BF_GLOBALS.getFlag(fLeftTraceIn900) || BF_GLOBALS.getFlag(fGotPointsForSearchingDA) ||
+ BF_GLOBALS.getFlag(fLeftTraceIn920))
+ BF_GLOBALS._sceneManager.changeScene(271);
+ else
+ BF_GLOBALS._sceneManager.changeScene(270);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 190 - Front of Police Station
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene190::Object4::startAction(CursorType action, Event &event) {
+ Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE: {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 13;
+ Common::Point pt(62, 96);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+ return true;
+ }
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene190::Item1::startAction(CursorType action, Event &event) {
+ Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ scene->setAction(&scene->_action1);
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene190::Item2::startAction(CursorType action, Event &event) {
+ Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ scene->_stripManager.start(1900, scene);
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene190::Exit::startAction(CursorType action, Event &event) {
+ Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
+
+ Common::Point pt(316, 91);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene190::Action1::signal() {
+ Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(2);
+ break;
+ case 1: {
+ ADD_MOVER(BF_GLOBALS._player, 165, 91);
+ break;
+ }
+ case 2:
+ scene->_sound.play(82);
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ ADD_MOVER(BF_GLOBALS._player, 180, 86);
+ break;
+ case 4:
+ scene->_sound.play(82);
+ scene->_object2.animate(ANIM_MODE_6, this);
+ break;
+ case 5:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(315);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene190::Scene190(): SceneExt() {
+ _fieldB52 = true;
+ _cursorVisage.setVisage(1, 8);
+}
+
+void Scene190::postInit(SceneObjectList *OwnerList) {
+ BF_GLOBALS._dialogCenter.y = 100;
+ if ((BF_GLOBALS._sceneManager._previousScene == 100) ||
+ (BF_GLOBALS._sceneManager._previousScene == 20)) {
+// clearScreen();
+ }
+ if (BF_GLOBALS._dayNumber == 0)
+ // If at start of game, change to first day
+ BF_GLOBALS._dayNumber = 1;
+
+ // Load the scene data
+ loadScene(190);
+ BF_GLOBALS._scenePalette.loadPalette(2);
+
+ _stripManager.addSpeaker(&_speaker);
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.disableControl();
+
+ // Initialise objects
+ _object2.postInit();
+ _object2.setVisage(190);
+ _object2.setStrip(1);
+ _object2.setPosition(Common::Point(179, 88));
+
+ _object3.postInit();
+ _object3.setVisage(190);
+ _object3.setStrip(2);
+ _object3.fixPriority(200);
+ _object3.setPosition(Common::Point(170, 31));
+ _object3.animate(ANIM_MODE_7, 0, NULL);
+ _object3.setDetails(190, 8, 26, 19, 1, NULL);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._player.setVisage(303);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
+
+ _object4.postInit();
+ _object4.setVisage(444);
+ _object4.setFrame(2);
+ _object4.setPosition(Common::Point(54, 114));
+ _object4.setDetails(190, -1, -1, -1, 1, NULL);
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 300: {
+ _sceneMode = 12;
+ BF_GLOBALS._player.setPosition(Common::Point(316, 91));
+ ADD_MOVER(BF_GLOBALS._player, 305, 91);
+ break;
+ }
+ case 315:
+ _sceneMode = 1901;
+ setAction(&_sequenceManager, this, 1901, &BF_GLOBALS._player, &_object2, NULL);
+ break;
+ case 50:
+ case 60:
+ default:
+ _fieldB52 = false;
+ BF_GLOBALS._player.setPosition(Common::Point(62, 96));
+ BF_GLOBALS._player._strip = 3;
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+ } else {
+ BF_GLOBALS._player.setVisage(BF_GLOBALS._player._visage);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 300: {
+ if (!BF_GLOBALS.getFlag(onBike)) {
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
+ _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 11 : 12;
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1304 : 303);
+ BF_GLOBALS._player.setPosition(Common::Point(316, 91));
+ ADD_MOVER(BF_GLOBALS._player, 305, 91);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 193 : 191;
+ setAction(&_sequenceManager, this, 193, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ }
+ case 315:
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
+ _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 1900 : 1901;
+ setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_object2, NULL);
+ break;
+ case 50:
+ case 60:
+ default:
+ BF_GLOBALS.setFlag(onBike);
+ BF_GLOBALS._player.disableControl();
+ T2_GLOBALS._uiElements._active = true;
+ _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 192 : 190;
+ setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
+ break;
+ }
+ }
+
+ if (BF_GLOBALS.getFlag(onBike)) {
+ BF_GLOBALS._sound1.play(BF_GLOBALS.getFlag(onDuty) ? 37 : 29);
+ } else if (BF_GLOBALS._sceneManager._previousScene != 300) {
+ BF_GLOBALS._sound1.play(33);
+ }
+
+ _exit.setDetails(Rect(310, 50, 320, 125), 190, -1, -1, -1, 1, NULL);
+ _item2.setDetails(Rect(108, 1, 111, 94), 190, 7, 11, 18, 1, NULL);
+ _item4.setDetails(2, 190, 5, 10, 16, 1);
+ _item3.setDetails(1, 190, 4, 10, 15, 1);
+ _item8.setDetails(6, 190, 20, 21, 22, 1);
+ _item1.setDetails(7, 190, 1, 10, -1, 1);
+ _item7.setDetails(5, 190, 0, 10, 12, 1);
+ _item6.setDetails(4, 190, 2, 10, 13, 1);
+ _item5.setDetails(3, 190, 3, 10, 14, 1);
+ _item9.setDetails(Rect(0, 0, 89, 68), 190, 6, 10, 17, 1, NULL);
+ _item10.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 190, 23, -1, -1, 1, NULL);
+}
+
+void Scene190::signal() {
+ switch (_sceneMode) {
+ case 10:
+ if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne))
+ BF_GLOBALS._sound1.changeSound(49);
+ BF_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 11:
+ case 12:
+ case 1900:
+ case 1901:
+ BF_GLOBALS._player.enableControl();
+ _fieldB52 = false;
+ break;
+ case 13:
+ case 191:
+ case 193:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 190:
+ case 192:
+ BF_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 0:
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene190::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(3);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene190::dispatch() {
+ SceneExt::dispatch();
+
+ if (!_action && !_fieldB52 && (BF_GLOBALS._player._position.x >= 310)
+ && !BF_GLOBALS.getFlag(onBike)) {
+ // Handle walking off to the right side of the screen
+ BF_GLOBALS._player.disableControl();
+ _fieldB52 = true;
+ _sceneMode = 10;
+
+ ADD_MOVER(BF_GLOBALS._player, 330, BF_GLOBALS._player._position.y);
+ }
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes1.h b/engines/tsage/blue_force/blueforce_scenes1.h
new file mode 100644
index 0000000000..bdf414ec9b
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes1.h
@@ -0,0 +1,488 @@
+/* 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 TSAGE_BLUEFORCE_SCENES1_H
+#define TSAGE_BLUEFORCE_SCENES1_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene100: public SceneExt {
+ /* Support classes */
+ class Text: public SceneText {
+ public:
+ virtual Common::String getClassName() { return "BF100Text"; }
+ virtual void dispatch();
+ };
+
+ /* Actions */
+ class Action1: public ActionExt {
+ private:
+ void setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action);
+ public:
+ Text _sceneText1;
+ SceneText _sceneText2;
+ int _textHeight;
+
+ virtual Common::String getClassName() { return "BF100Action1"; }
+ virtual void synchronize(Serializer &s) {
+ ActionExt::synchronize(s);
+ s.syncAsSint16LE(_textHeight);
+ }
+ virtual void signal();
+ };
+ class Action2: public ActionExt {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ Action2 _action2;
+ ScenePalette _scenePalette;
+ NamedObject _object1, _object2, _object3, _object4, _object5;
+ int _index;
+
+ Scene100();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene109: public PalettedScene {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ SequenceManager _sequenceManager4, _sequenceManager5, _sequenceManager6;
+ SequenceManager _sequenceManager7, _sequenceManager8;
+ SceneObject _object1, _object2, _protaginist2, _protaginist1, _object5;
+ SceneObject _drunk, _object7, _bartender, _object9, _object10;
+ IntroSceneText _text;
+ Action1 _action1;
+ Action _action2, _action3;
+public:
+ Scene109();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene110: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action5: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ NamedObject _object1, _object2, _object3, _object4, _object5, _object6, _object7, _object8, _object9, _object10;
+ ASound _sound;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene114: public SceneExt {
+ /* Objects */
+ class Vechile: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Door: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager1;
+ Vechile _vechile;
+ Door _door;
+ NamedObject _lyle;
+ NamedHotspot _item1;
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene115: public SceneExt {
+ /* Objects */
+ class Object1: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object2: public NamedObject {
+ public:
+ int _field15F8;
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object3: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object4: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Custom class */
+ class EventHandler1: public EventHandler {
+ public:
+ virtual Common::String getClassName() { return "Scene115_EventHandler1"; }
+ virtual void dispatch();
+ };
+
+ /* Items */
+ class Item1: public NamedHotspot {
+ SequenceManager _sequenceManager6;
+ public:
+ int _field1F8A;
+
+ Item1();
+ virtual bool startAction(CursorType action, Event &event);
+ virtual void signal();
+ virtual void synchronize(Serializer &s);
+ };
+ class Item10: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item14: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action9: public Action {
+ public:
+ virtual void signal();
+ };
+
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ SequenceManager _sequenceManager3;
+ SequenceManager _sequenceManager4;
+ SequenceManager _sequenceManager5;
+ Object1 _object1;
+ Object2 _object2;
+ Object3 _object3;
+ Object4 _object4;
+ SceneObject _object5, _object6, _object7, _object8, _object9;
+ SceneObject _object10, _object11, _object12, _object13;
+ Item1 _item1;
+ EventHandler1 _eventHandler1;
+ NamedHotspot _item2, _item3, _item4, _item5, _item6, _item7, _item8, _item9;
+ Item10 _item10;
+ NamedHotspot _item11, _item12, _item13;
+ Item14 _item14;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Action8 _action8;
+ Action9 _action9;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerKate _kateSpeaker;
+ SpeakerTony _tonySpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ ASound _sound1;
+ int _field168A;
+ int _field31E8;
+ int _field31EA;
+public:
+ Scene115();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene125: public SceneExt {
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action5: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6: public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+
+public:
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ NamedObject _object1, _object2, _object3, _object4, _object5;
+ NamedObject _object6, _object7, _object8, _object9;
+ ASoundExt _soundExt1;
+ ASoundExt _soundExt2;
+
+ void postInit(SceneObjectList *OwnerList);
+};
+
+class Scene140: public SceneExt {
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ Action1 _action1;
+ ASoundExt _soundExt1;
+ NamedObject _object1;
+ NamedObject _object2;
+ IntroSceneText _text;
+
+ void postInit(SceneObjectList *OwnerList);
+};
+
+class Scene150: public SceneExt {
+ class Action1: public Action {
+ NamedObject _object2;
+ ASound _sound1;
+ public:
+ virtual void signal();
+ };
+public:
+ NamedObject _object1;
+ Action1 _action1;
+
+ void postInit(SceneObjectList *OwnerList);
+};
+
+class Scene160: public SceneExt {
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ virtual void process(Event &event);
+ };
+ class Action3: public ActionExt {
+ public:
+ virtual void signal();
+ };
+public:
+ NamedObject _flag, _kid, _kidBody, _leftOfficer, _grandma, _rightOfficer;
+ ASound _sound1;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ IntroSceneText _text;
+
+ void postInit(SceneObjectList *OwnerList);
+};
+
+class Scene180: public SceneExt {
+ /* Objects */
+ class Vechile: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class GarageExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ NamedObject _object1;
+ Vechile _vechile;
+ NamedHotspot _driveway, _garage, _frontDoor, _house, _street;
+ NamedHotspot _lawn, _bushes, _palms, _fence, _steps;
+ NamedHotspot _curb, _sky;
+ GarageExit _garageExit;
+ ASoundExt _sound1;
+ SceneMessage _sceneMessage;
+ int _fieldC56;
+
+ Scene180();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene190: public SceneExt {
+ /* Objects */
+ class Object4: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ FollowerObject _object1;
+ NamedObject _object2, _object3;
+ Object4 _object4;
+ Item1 _item1;
+ Item2 _item2;
+ NamedHotspot _item3, _item4, _item5, _item6;
+ NamedHotspot _item7, _item8, _item9, _item10;
+ Exit _exit;
+ Action1 _action1;
+ ASoundExt _sound;
+ SpeakerGameText _speaker;
+ bool _fieldB52;
+
+ Scene190();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_fieldB52);
+ }
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp
new file mode 100644
index 0000000000..3af02bd463
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes2.cpp
@@ -0,0 +1,1853 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes2.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 200 - Credits - Motorcycle Training
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene200::Action1::signal() {
+ Scene200 *scene = (Scene200 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ assert(owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1:
+ BF_GLOBALS._scenePalette.loadPalette(235);
+ BF_GLOBALS._scenePalette.refresh();
+ _state = 0;
+ setDelay(30);
+ break;
+ case 2:
+ assert(_owner);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ if (++_state < 2) {
+ scene->_action2.signal();
+ owner->setFrame(1);
+ _actionIndex = 2;
+ }
+ setDelay(2);
+ break;
+ case 4: {
+ PaletteRotation *rot;
+ rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
+ rot->setDelay(10);
+ rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
+ rot->setDelay(10);
+
+ scene->setAction(&scene->_sequenceManager, this, 201, &scene->_object1, &scene->_object2,
+ &scene->_object3, &scene->_object4, &scene->_object5, &scene->_object6, NULL);
+ break;
+ }
+ case 5:
+ BF_GLOBALS._sceneManager.changeScene(210);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene200::Action2::signal() {
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+ assert(owner);
+
+ switch (_actionIndex++) {
+ case 1:
+ owner->setPosition(owner->_position, 0);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ owner->setPosition(owner->_position, 1000);
+ owner->setFrame(1);
+ _actionIndex = 0;
+ setDelay(1);
+ break;
+ default:
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+void Scene200::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(200);
+ setZoomPercents(0, 100, 200, 100);
+ BF_GLOBALS._sound1.play(3);
+
+ _object10.postInit();
+ _object10.setVisage(200);
+ _object10.setPosition(Common::Point(114, 102));
+ _object10.setStrip(2);
+ _object10.setFrame(1);
+ _object10.changeZoom(100);
+
+ _object1.postInit();
+ _object1.hide();
+ _object2.postInit();
+ _object2.hide();
+ _object3.postInit();
+ _object3.hide();
+ _object4.postInit();
+ _object4.hide();
+ _object5.postInit();
+ _object5.hide();
+ _object6.postInit();
+ _object6.hide();
+
+ _object11.postInit();
+ _object11.setVisage(200);
+ _object11.setPosition(Common::Point(96, 112), 1000);
+ _object11.setStrip(3);
+ _object11.setFrame(1);
+ _object11.changeZoom(100);
+
+ _object10.setAction(&_action1);
+ _object11.setAction(&_action2);
+}
+
+void Scene200::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 210 - Credits - Car Training
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene210::Action1::signal() {
+ Scene210 *scene = (Scene210 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(_owner);
+ assert(owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ PaletteRotation *rot;
+ rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
+ rot->setDelay(10);
+ rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
+ rot->setDelay(10);
+
+ scene->setAction(&scene->_sequenceManager, this, 210, &scene->_object10, &scene->_object11,
+ &scene->_object12, &scene->_object13, &scene->_object14, &scene->_object15, NULL);
+ break;
+ }
+ case 3:
+ BF_GLOBALS._sceneManager.changeScene(220);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene210::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(210);
+
+// FIXME: This fixes an obvious glitch during scene transition.
+// Shouldn't it be included in the 2 previous functions?
+ clearScreen();
+//
+
+ BF_GLOBALS._scenePalette.loadPalette(235);
+ BF_GLOBALS._scenePalette.refresh();
+
+ _object9.postInit();
+ _object9.setVisage(210);
+ _object9.setPosition(Common::Point(146, 151));
+ _object9.setStrip(1);
+ _object9.setFrame(1);
+ _object9.changeZoom(100);
+ _object9.setAction(&_action1);
+
+ _object10.postInit();
+ _object10.hide();
+ _object11.postInit();
+ _object11.hide();
+ _object12.postInit();
+ _object12.hide();
+ _object13.postInit();
+ _object13.hide();
+ _object14.postInit();
+ _object14.hide();
+ _object15.postInit();
+ _object15.hide();
+}
+
+void Scene210::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 220 - Credits - Martial Arts
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene220::Action1::signal() {
+ Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1:
+ BF_GLOBALS._scenePalette.loadPalette(235);
+ BF_GLOBALS._scenePalette.refresh();
+ setDelay(30);
+ break;
+ case 2:
+ BF_GLOBALS._scenePalette.clearListeners();
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_object2.setVisage(221);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(178, 122));
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ BF_GLOBALS._scenePalette.refresh();
+ BF_GLOBALS._scenePalette.loadPalette(235);
+ BF_GLOBALS._scenePalette.refresh();
+ setDelay(5);
+ break;
+ case 5:
+ scene->_object1.remove();
+
+ scene->_object2.setVisage(222);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(164, 138));
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ scene->_object2.setVisage(223);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(164, 139));
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 7:
+ scene->_object2.setVisage(230);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(168, 136));
+ scene->_object2.animate(ANIM_MODE_4, 13, 1, this);
+ break;
+ case 8:
+ scene->_object2.animate(ANIM_MODE_5, this);
+
+ scene->_object3.postInit();
+ scene->_object3.setVisage(231);
+ scene->_object3.setPosition(Common::Point(65, 179));
+ scene->_object3.setStrip(1);
+ scene->_object3.setFrame(1);
+ scene->_object3.changeZoom(100);
+ scene->_object3.setAction(&scene->_action2, this);
+ break;
+ case 9:
+ break;
+ case 10:
+ scene->_object2.setVisage(224);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(148, 143));
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 11: {
+ PaletteRotation *rot;
+ rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
+ rot->setDelay(10);
+ rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
+ rot->setDelay(10);
+
+ scene->setAction(&scene->_sequenceManager, this, 220, &scene->_object4, &scene->_object5,
+ &scene->_object6, &scene->_object7, &scene->_object8, &scene->_object9, NULL);
+ break;
+ }
+ case 12:
+ scene->_object2.setVisage(232);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(146, 143));
+ scene->_object2._numFrames = 5;
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 13:
+ scene->_object2.setVisage(228);
+ scene->_object2.setFrame(1);
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 14:
+ scene->_object2.setVisage(229);
+ scene->_object2.setFrame(1);
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 15:
+ BF_GLOBALS._sceneManager.changeScene(225);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene220::Action2::signal() {
+ Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object3.setPosition(scene->_object3._position);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ setDelay(50);
+ break;
+ case 2:
+ scene->_object3.remove();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene220::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(220);
+
+// FIXME: This fixes an obvious glitch during scene transition.
+// Shouldn't it be included in the 2 previous functions?
+ clearScreen();
+//
+
+ _object2.postInit();
+ _object2.setVisage(220);
+ _object2.setPosition(Common::Point(182, 122));
+ _object2.setStrip(1);
+ _object2.setFrame(1);
+ _object2.changeZoom(100);
+
+ _object1.postInit();
+ _object1.setVisage(220);
+ _object1.setPosition(Common::Point(164, 138));
+ _object1.setStrip(2);
+ _object1.setFrame(1);
+ _object1.changeZoom(100);
+
+ _object4.postInit();
+ _object4.hide();
+ _object5.postInit();
+ _object5.hide();
+ _object6.postInit();
+ _object6.hide();
+ _object7.postInit();
+ _object7.hide();
+ _object8.postInit();
+ _object8.hide();
+ _object9.postInit();
+ _object9.hide();
+
+ _object2.setAction(&_action1);
+}
+
+void Scene220::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 225 - Credits - Gun Training
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene225::Action1::signal() {
+ Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ BF_GLOBALS._scenePalette.loadPalette(235);
+ BF_GLOBALS._scenePalette.refresh();
+ setDelay(5);
+ break;
+ case 2:
+ owner->animate(ANIM_MODE_4, 7, 1, this);
+ break;
+ case 3:
+ scene->_object8.animate(ANIM_MODE_5, this);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ scene->_object8.remove();
+ break;
+ case 5:
+ scene->_action3.signal();
+ break;
+ case 6:
+ owner->setPosition(Common::Point(owner->_position.x, owner->_position.y - 4));
+ owner->setStrip(2);
+ owner->setFrame(1);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 7:
+ scene->_action2.signal();
+ break;
+ case 8:
+ owner->animate(ANIM_MODE_6, this);
+ break;
+ case 9:
+ owner->setPosition(Common::Point(owner->_position.x - 2, owner->_position.y - 1));
+ owner->setStrip(3);
+ owner->setFrame(1);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 10: {
+ owner->setPosition(Common::Point(owner->_position.x + 10, owner->_position.y + 4));
+ owner->setStrip(4);
+ owner->setFrame(1);
+ owner->fixPriority(116);
+ owner->animate(ANIM_MODE_1, NULL);
+
+ Common::Point destPos(138, 117);
+ NpcMover *mover = new NpcMover();
+ owner->addMover(mover, &destPos, this);
+ break;
+ }
+ case 11: {
+ owner->setPosition(Common::Point(owner->_position.x - 12, owner->_position.y - 1));
+ owner->setStrip(5);
+ owner->setFrame(1);
+ owner->_moveDiff.x = 8;
+
+ Common::Point destPos(402, 116);
+ NpcMover *mover2 = new NpcMover();
+ owner->addMover(mover2, &destPos, this);
+
+ BF_GLOBALS._player.setPosition(Common::Point(owner->_position.x, 0));
+ ADD_MOVER_NULL(BF_GLOBALS._player, 500, 0);
+ break;
+ }
+ case 12:
+ owner->setVisage(1227);
+ owner->setStrip(1);
+ owner->setFrame(1);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 13:
+ owner->setStrip(2);
+ owner->setFrame(4);
+ scene->_action4.signal();
+ break;
+ case 14:
+ owner->animate(ANIM_MODE_6, this);
+ break;
+ case 15:
+ scene->_action6.signal();
+ break;
+ case 16:
+ owner->animate(ANIM_MODE_4, 4, 1, this);
+ break;
+ case 17:
+ owner->setFrame(6);
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 18:
+ scene->_action5.signal();
+ break;
+ case 19:
+ owner->animate(ANIM_MODE_4, 4, -1, this);
+ break;
+ case 20:
+ PaletteRotation *rot;
+ rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
+ rot->setDelay(10);
+ rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
+ rot->setDelay(10);
+
+ scene->setAction(&scene->_sequenceManager, this, 225, &scene->_object15, &scene->_object16,
+ &scene->_object17, &scene->_object18, &scene->_object19, &scene->_object20, NULL);
+ break;
+ case 21:
+ scene->_object21.hide();
+ BF_GLOBALS._player._moveDiff.x = 5;
+ BF_GLOBALS._sceneManager.changeScene(265);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene225::Action2::signal() {
+ Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ owner->setStrip(3);
+ owner->setFrame(2);
+ scene->_action1.signal();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene225::Action3::signal() {
+ Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ owner->setStrip(3);
+ owner->setFrame(1);
+ scene->_action1.signal();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene225::Action4::signal() {
+ Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ owner->setStrip(5);
+ owner->setFrame(4);
+ scene->_action1.signal();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene225::Action5::signal() {
+ Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ owner->setStrip(3);
+ owner->setFrame(6);
+ scene->_action1.signal();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene225::Action6::signal() {
+ Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
+ SceneObject *owner = static_cast<SceneObject *>(this->_owner);
+
+ switch (_actionIndex++) {
+ case 0:
+ break;
+ case 1:
+ owner->animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ owner->setStrip(3);
+ owner->setFrame(3);
+ scene->_action1.signal();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene225::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(1225);
+ loadBackground(-320, 0);
+
+ _object8.postInit();
+ _object8.setVisage(1225);
+ _object8.setPosition(Common::Point(114, 119));
+ _object8._frame = 1;
+ _object8.setStrip(2);
+ _object8.changeZoom(100);
+
+ _object9.postInit();
+ _object9.setVisage(1226);
+ _object9.setPosition(Common::Point(83, 128));
+ _object9.setStrip(1);
+ _object9.changeZoom(100);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setPosition(Common::Point(83, 0));
+ BF_GLOBALS._player.hide();
+
+ _object10.postInit();
+ _object10.setVisage(1225);
+ _object10.setPosition(Common::Point(237, 29));
+ _object10.setStrip(1);
+ _object10._frame = 1;
+ _object10.changeZoom(100);
+ _object10._numFrames = 2;
+
+ _object11.postInit();
+ _object11.setVisage(1225);
+ _object11.setPosition(Common::Point(290, 47));
+ _object11.setStrip(1);
+ _object11._frame = 1;
+ _object11.changeZoom(100);
+ _object11._numFrames = 2;
+
+ _object12.postInit();
+ _object12.setVisage(1225);
+ _object12.setPosition(Common::Point(368, 35));
+ _object12.setStrip(4);
+ _object12._frame = 1;
+ _object12.changeZoom(100);
+ _object12._numFrames = 2;
+
+ _object13.postInit();
+ _object13.setVisage(1225);
+ _object13.setPosition(Common::Point(416, 33));
+ _object13.setStrip(1);
+ _object13._frame = 1;
+ _object13.changeZoom(100);
+ _object13._numFrames = 2;
+
+ _object14.postInit();
+ _object14.setVisage(1225);
+ _object14.setPosition(Common::Point(476, 30));
+ _object14.setStrip(1);
+ _object14._frame = 1;
+ _object14.changeZoom(100);
+ _object14._numFrames = 2;
+
+ _object21.postInit();
+ _object21.setVisage(235);
+ _object21.setStrip(1);
+ _object21._frame = 1;
+ _object21.setPosition(Common::Point(498, 41));
+ _object21.changeZoom(100);
+ _object21.hide();
+
+ _object15.postInit();
+ _object15.hide();
+ _object16.postInit();
+ _object16.hide();
+ _object17.postInit();
+ _object17.hide();
+ _object18.postInit();
+ _object18.hide();
+ _object19.postInit();
+ _object19.hide();
+ _object20.postInit();
+ _object20.hide();
+
+ _object9.setAction(&_action1);
+ _object10.setAction(&_action2);
+ _object11.setAction(&_action3);
+ _object12.setAction(&_action4);
+ _object13.setAction(&_action5);
+ _object14.setAction(&_action6);
+}
+
+void Scene225::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 265 - Intro - Graduation Article
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene265::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ setDelay(30);
+ break;
+ case 1:
+ BF_GLOBALS._scenePalette.refresh();
+ setDelay(240);
+ break;
+ case 2:
+ ADD_MOVER(BF_GLOBALS._player, 160, 280);
+ break;
+ case 3:
+ // Wait until sound finishes playing
+ if (BF_GLOBALS._sound1.isPlaying())
+ _actionIndex = 3;
+ setDelay(1);
+ break;
+ case 4:
+ BF_GLOBALS._dayNumber = 1;
+ BF_GLOBALS._sceneManager.changeScene(190);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene265::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(265);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setPosition(Common::Point(160, 100));
+ BF_GLOBALS._player.hide();
+ setAction(&_action1);
+}
+
+void Scene265::remove() {
+ clearScreen();
+ SceneExt::remove();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 270 - Living Room & Kitchen
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene270::Action1::signal() {
+ Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
+
+ scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene270::Lyle::startAction(CursorType action, Event &event) {
+ Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ scene->_field21A0 = 1;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2706;
+
+ if (scene->_field380 == 1) {
+ scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL);
+ } else {
+ scene->signal();
+ }
+ return true;
+ case INV_CRATE1:
+ scene->_field21A0 = 2;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2706;
+
+ if (scene->_field380 == 1) {
+ scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, NULL);
+ } else {
+ scene->signal();
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene270::Grandma::startAction(CursorType action, Event &event) {
+ Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ // Day 1
+ if (scene->_field380 == 1) {
+ scene->_stripManager.start((scene->_grandma._position.x == 157) ? 2712 : 2723, &BF_GLOBALS._stripProxy);
+ } else if (BF_GLOBALS._bookmark == bBookedFrankieEvidence) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2710;
+ scene->setAction(&scene->_sequenceManager1, scene, 2710, &BF_GLOBALS._player, &scene->_grandma, NULL);
+ } else if (BF_GLOBALS.getFlag(onDuty) || (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) == 2) ||
+ (scene->_field386 != 0)) {
+ scene->_stripManager.start(2723, &BF_GLOBALS._stripProxy);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2715;
+ scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, &scene->_grandma, NULL);
+ }
+ return true;
+ case 3:
+ // Day 3
+ if (scene->_field380 == 1) {
+ scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy);
+ } else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) {
+ scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2713;
+ scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_grandma, NULL);
+ }
+ return true;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene270::Item::startAction(CursorType action, Event &event) {
+ Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (scene->_field380 == 0)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_object2.postInit();
+ scene->_object2.hide();
+ scene->_sceneMode = 2705;
+ scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object2, NULL);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene270::Exit::startAction(CursorType action, Event &event) {
+ Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
+
+ if (!_action && !scene->_field384 && !scene->_field386) {
+ if (scene->_field380 == 1) {
+ scene->_tempPos = Common::Point(320, 140);
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 2706;
+ scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL);
+ } else {
+ ADD_PLAYER_MOVER(320, 140);
+ }
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene270::Scene270(): SceneExt() {
+ _field380 = _field382 =_field384 = _field386 = 0;
+ _field219A = _tempPos.x = _tempPos.y = _field21A0 = 0;
+ _sceneMode = 0;
+}
+
+void Scene270::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field380);
+ s.syncAsSint16LE(_field382);
+ s.syncAsSint16LE(_field384);
+ s.syncAsSint16LE(_field386);
+ s.syncAsSint16LE(_field219A);
+ s.syncAsSint16LE(_tempPos.x);
+ s.syncAsSint16LE(_tempPos.y);
+ s.syncAsSint16LE(_field21A0);
+}
+
+void Scene270::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(270);
+ setZoomPercents(120, 90, 130, 100);
+
+ if (BF_GLOBALS._sceneManager._previousScene != 560)
+ BF_GLOBALS._sound1.fadeSound(26);
+
+ _exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL);
+
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._dayNumber = 1;
+ BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2);
+ BF_INVENTORY.setObjectScene(INV_CRATE1, 1);
+ BF_GLOBALS._sceneManager._previousScene = 710;
+ }
+
+ if (((BF_GLOBALS._bookmark >= bLauraToParamedics) && (BF_GLOBALS._dayNumber == 1) &&
+ (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2) &&
+ (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 1)) ||
+ ((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3))) {
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.proc1(19);
+
+ _grandma.postInit();
+ _grandma.setVisage(274);
+ _grandma.setPosition(Common::Point(157, 132));
+ _grandma._numFrames = 5;
+ _grandma.animate(ANIM_MODE_2, NULL);
+ _grandma.fixPriority(129);
+ }
+
+ if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) {
+ _grandma.postInit();
+ }
+
+ if (BF_GLOBALS._sceneManager._previousScene == 710) {
+ _skip.postInit();
+ _laura.postInit();
+ _lyle.postInit();
+ _grandma.postInit();
+ }
+
+ _stripManager.addSpeaker(&_grandmaSpeaker);
+ _stripManager.addSpeaker(&_lyleSpeaker);
+ _stripManager.addSpeaker(&_jakeSpeaker);
+ _stripManager.addSpeaker(&_skipSpeaker);
+ _stripManager.addSpeaker(&_lauraSpeaker);
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+
+ _tv.postInit();
+ _tv.setVisage(270);
+ _tv.setPosition(Common::Point(264, 74));
+ _tv.setStrip(5);
+ _tv.fixPriority(132);
+ _tv._numFrames = 3;
+ _tv.setAction(&_action1);
+
+ _fireplace.postInit();
+ _fireplace.setVisage(270);
+ _fireplace.setStrip(2);
+ _fireplace.setPosition(Common::Point(302, 121));
+ _fireplace.fixPriority(132);
+ _fireplace.animate(ANIM_MODE_2, NULL);
+
+ _fridge.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
+ _object3.setDetails(270, 12, 13, 14, 1, NULL);
+ _laura.setDetails(270, 15, -1, -1, 1, NULL);
+ _skip.setDetails(270, 14, -1, -1, 1, NULL);
+ _lyle.setDetails(270, 34, 35, 36, 1, NULL);
+ _tv.setDetails(270, 3, 4, 5, 1, NULL);
+ _fireplace.setDetails(270, 6, 7, 8, 1, NULL);
+
+ if ((BF_GLOBALS._sceneManager._previousScene == 710) && (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard)) {
+ _grandma.setDetails(270, 15, 16, 17, 1, NULL);
+ } else {
+ _grandma.setDetails(270, 40, 16, 17, 1, NULL);
+ }
+
+ _afgan.setDetails(4, 270, 27, 28, 29, 1);
+ _couch.setDetails(1, 270, 18, 19, 20, 1);
+ _photos.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL);
+ _appliances.setDetails(3, 270, 24, 25, 26, 1);
+ _ivy.setDetails(2, 270, 30, 31, 32, 1);
+ _background.setDetails(Rect(0, 0, 320, 168), 270, 0, 1, 2, 1, NULL);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player._moveDiff.x = 8;
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.disableControl();
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 560:
+ if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) {
+ _field219A = 1;
+ BF_GLOBALS._player._moveDiff.x = 5;
+ _field386 = 0;
+
+ _grandma.animate(ANIM_MODE_1, NULL);
+ setAction(&_sequenceManager1, NULL, 2720, &BF_GLOBALS._player, &_grandma, NULL);
+ BF_GLOBALS._bookmark = bLyleStoppedBy;
+ } else {
+ _sceneMode = 2700;
+ setAction(&_sequenceManager1, this, 2700, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 690:
+ BF_GLOBALS._player.setPosition(Common::Point(-13, 162));
+ _sceneMode = 2702;
+ setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
+ break;
+ case 710:
+ BF_GLOBALS._player._moveDiff.x = 6;
+ _sceneMode = 2717;
+ setAction(&_sequenceManager1, this, 2717, &BF_GLOBALS._player, &_laura, &_skip, &_lyle, &_grandma, NULL);
+ break;
+ default:
+ _sceneMode = 2701;
+ setAction(&_sequenceManager1, this, 2701, &BF_GLOBALS._player, NULL);
+ break;
+ }
+}
+
+void Scene270::signal() {
+ switch (_sceneMode) {
+ case 10:
+ _sceneMode = 2702;
+ setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
+ break;
+ case 11:
+ BF_GLOBALS._player._strip = 8;
+ BF_GLOBALS._player._frame = 1;
+
+ if (_field382) {
+ _sceneMode = 2719;
+ _stripManager.start(2720, this);
+ } else {
+ _field382 = 1;
+ _sceneMode = 13;
+ _stripManager.start(2718, this);
+ }
+ break;
+ case 12:
+ BF_GLOBALS._player._strip = 8;
+ BF_GLOBALS._player._frame = 1;
+ _sceneMode = 13;
+ _stripManager.start(2719, this);
+ break;
+ case 13:
+ case 2713:
+ case 2715:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2700:
+ _field219A = 1;
+ BF_GLOBALS._player._strip = 6;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2701:
+ BF_GLOBALS._player._strip = 2;
+ BF_GLOBALS._player.enableControl();
+ _field219A = 1;
+ break;
+ case 2702:
+ BF_GLOBALS._player._strip = 1;
+ BF_GLOBALS._player.enableControl();
+ _field219A = 1;
+ break;
+ case 2705:
+ _field380 = 1;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2706:
+ BF_GLOBALS._player.changeZoom(-1);
+ _object2.remove();
+ _field380 = 0;
+
+ switch (_field21A0) {
+ case 1:
+ _sceneMode = 11;
+ ADD_PLAYER_MOVER(192, 135);
+ break;
+ case 2:
+ if (BF_GLOBALS.getFlag(shownLyleCrate1Day1)) {
+ SceneItem::display2(270, 37);
+ BF_GLOBALS._player.enableControl();
+ } else {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(shownLyleCrate1Day1);
+ _sceneMode = 12;
+ ADD_PLAYER_MOVER(192, 135);
+ }
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y);
+ break;
+ }
+
+ _field21A0 = 0;
+ break;
+ case 2710:
+ BF_GLOBALS._bookmark = bEndOfWorkDayOne;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2711:
+ BF_GLOBALS._player.setPosition(Common::Point(150, 300));
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(180);
+ BF_GLOBALS._bookmark = bLyleStoppedBy;
+ break;
+ case 2712:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(180);
+ break;
+ case 2714:
+ BF_GLOBALS._sceneManager.changeScene(560);
+ break;
+ case 2717:
+ _sceneMode = 2718;
+ _lyle.setFrame2(-1);
+ setAction(&_sequenceManager1, this, 2718, &BF_GLOBALS._player, &_laura, &_skip,
+ &_lyle, &_grandma, NULL);
+ break;
+ case 2718:
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.proc1(19);
+
+ _field219A = 1;
+ BF_GLOBALS._bookmark = bTalkedToGrannyAboutSkipsCard;
+
+ _grandma.setStrip(8);
+ _grandma._frame = 5;
+ _field384 = 1;
+ _field384 = 1;
+
+ BF_GLOBALS._player._moveDiff.x = 8;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2719:
+ _sceneMode = 13;
+ _field384 = 0;
+ BF_GLOBALS._player._moveDiff.x = 6;
+
+ _lyle.setFrame2(-1);
+ setAction(&_sequenceManager1, this, 2719, &BF_GLOBALS._player, &_lyle, &_grandma, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene270::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
+ (_field380 == 1) && !_action) {
+ _tempPos = event.mousePos;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2706;
+ setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object2, NULL);
+ event.handled = true;
+ }
+
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1)) &&
+ !_field384 && !_field386) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene270::dispatch() {
+ if (_field384) {
+ _lyle.updateAngle(BF_GLOBALS._player._position);
+
+ if (_lyle._angle < 110)
+ _lyle.setFrame2(4);
+ else if (_lyle._angle < 180)
+ _lyle.setFrame2(3);
+ else if (_lyle._angle < 250)
+ _lyle.setFrame2(2);
+ else
+ _lyle.setFrame2(1);
+ }
+
+ if (_field386) {
+ if (BF_GLOBALS._player._position.x > 290) {
+ _grandma.setFrame(6);
+ } else if (BF_GLOBALS._player._position.x > 274) {
+ _grandma.setFrame(5);
+ } else if (BF_GLOBALS._player._position.x > 258) {
+ _grandma.setFrame(4);
+ } else if (BF_GLOBALS._player._position.x > 242) {
+ _grandma.setFrame(3);
+ } else if (BF_GLOBALS._player._position.x > 226) {
+ _grandma.setFrame(2);
+ } else if (BF_GLOBALS._player._position.x > 210) {
+ if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame > 1))
+ _grandma.animate(ANIM_MODE_6, NULL);
+ } else {
+ if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame < 3))
+ _grandma.animate(ANIM_MODE_4, 3, 1, NULL);
+ }
+ }
+
+ if (!_action && _field219A) {
+ if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 125)) {
+ _field219A = 0;
+ BF_GLOBALS._player.disableControl();
+ if (!_field384) {
+ BF_GLOBALS._sceneManager.changeScene(560);
+ } else {
+ BF_GLOBALS._player.addMover(NULL);
+ SceneItem::display2(270, 38);
+ _sceneMode = 2700;
+ ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y + 15);
+ }
+ }
+
+ if (BF_GLOBALS._player._position.x <= 20) {
+ _field219A = 0;
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.addMover(NULL);
+ BF_GLOBALS._player._strip = 3;
+ BF_GLOBALS._player._frame = 1;
+
+ if (BF_GLOBALS._sceneObjects->contains(&_grandma)) {
+ _sceneMode = 10;
+ _stripManager.start(2711, this);
+ } else {
+ SceneItem::display2(270, 33);
+ _sceneMode = 2702;
+ setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
+ }
+ }
+
+ if (BF_GLOBALS._player._position.x > 310) {
+ _field219A = 0;
+ BF_GLOBALS._player.disableControl();
+ if (!_field384 && !_field386) {
+ _sceneMode = 2712;
+ setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.addMover(NULL);
+ BF_GLOBALS._player._strip = 2;
+ BF_GLOBALS._player._frame = 1;
+ SceneItem::display2(270, !_field384 ? 39 : 38);
+ _sceneMode = 2701;
+
+ ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y);
+ }
+ }
+ }
+
+ SceneExt::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 271 - Living Room & Kitchen #2
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene271::Action1::signal() {
+ Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
+
+ scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene271::Object12::startAction(CursorType action, Event &event) {
+ Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (BF_GLOBALS._dayNumber == 1) {
+ if (!BF_GLOBALS.getFlag(onDuty) && (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2)) {
+ scene->_sceneMode = 2715;
+ scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, NULL);
+ return true;
+ }
+ } else if (BF_GLOBALS._dayNumber == 3) {
+ if (scene->_field796 == 1) {
+ scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy);
+ return true;
+ } else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) {
+ scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy);
+ return true;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2713;
+ scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_object12, NULL);
+ BF_GLOBALS.setFlag(fGotGreen355fTalkedToGrannyDay3);
+ return true;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene271::Item::startAction(CursorType action, Event &event) {
+ Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && !scene->_field796) {
+ BF_GLOBALS._player.disableControl();
+ scene->_object1.postInit();
+ scene->_object1.hide();
+
+ scene->_sceneMode = 2705;
+ scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object1, NULL);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene271::Exit::startAction(CursorType action, Event &event) {
+ Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
+
+ if (!scene->_action) {
+ if (scene->_field796 == 1) {
+ scene->_tempPos = Common::Point(320, 140);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2706;
+ scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object1, NULL);
+ } else {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 320, 140);
+ }
+ }
+
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene271::Scene271() {
+ _field796 = _field2E16 = 0;
+ _tempPos.x = _tempPos.y = 0;
+ _rect1 = Rect(236, 120, 266, 130);
+}
+
+void Scene271::synchronize(Serializer &s) {
+ PalettedScene::synchronize(s);
+
+ s.syncAsSint16LE(_field796);
+ s.syncAsSint16LE(_field2E16);
+ s.syncAsSint16LE(_tempPos.x);
+ s.syncAsSint16LE(_tempPos.y);
+ _rect1.synchronize(s);
+}
+
+void Scene271::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ loadScene(270);
+ setZoomPercents(120, 80, 140, 100);
+ BF_GLOBALS._sound1.fadeSound(26);
+
+ _stripManager.addSpeaker(&_grandmaSpeaker);
+ _stripManager.addSpeaker(&_lyleSpeaker);
+ _stripManager.addSpeaker(&_jakeSpeaker);
+ _stripManager.addSpeaker(&_skipSpeaker);
+ _stripManager.addSpeaker(&_lauraSpeaker);
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_granTextSpeaker);
+ _stripManager.addSpeaker(&_lyleTextSpeaker);
+
+ _exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL);
+
+ _tv.postInit();
+ _tv.setVisage(270);
+ _tv.setPosition(Common::Point(264, 74));
+ _tv.setStrip(5);
+ _tv.fixPriority(132);
+ _tv._numFrames = 3;
+ _tv.setAction(&_action1);
+
+ if ((BF_GLOBALS._sceneManager._previousScene != 280) && (BF_GLOBALS._sceneManager._previousScene != 620)) {
+ _object10.postInit();
+ _object10.setVisage(270);
+ _object10.setStrip(2);
+ _object10.setPosition(Common::Point(302, 121));
+ _object10.fixPriority(132);
+ _object10.animate(ANIM_MODE_2, NULL);
+ }
+
+ _object5.postInit();
+ _object5.hide();
+
+ _item5.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
+ _object6.setDetails(270, 12, 13, 14, 1, NULL);
+ _object7.setDetails(270, 15, -1, -1, 1, NULL);
+ _object8.setDetails(270, 14, -1, -1, 1, NULL);
+ _object11.setDetails(270, -1, -1, -1, 1, NULL);
+ _tv.setDetails(270, 3, 4, 5, 1, NULL);
+ _object10.setDetails(270, 6, 7, 8, 1, NULL);
+ _object12.setDetails(270, 15, 16, 17, 1, NULL);
+ _item3.setDetails(4, 270, 27, 28, 29, 1);
+ _item1.setDetails(1, 270, 18, 19, 20, 1);
+ _item6.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL);
+ _item2.setDetails(3, 270, 24, 25, 26, 1);
+ _item4.setDetails(2, 270, 30, 31, 32, 1);
+ _item11.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 270, 0, 1, 2, 1, NULL);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player._moveDiff.x = 8;
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.disableControl();
+
+ _field796 = 0;
+ _sceneMode = 0;
+ _field2E16 = 0;
+
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._dayNumber = 1;
+ BF_GLOBALS._sceneManager.changeScene(180);
+ }
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 180:
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.proc1(19);
+
+ BF_GLOBALS._player.setVisage(151);
+ BF_GLOBALS._player.setPosition(Common::Point(348, 151));
+
+ _object12.postInit();
+ _object12.setVisage(274);
+ _object12.setPosition(Common::Point(157, 132));
+ _object12._numFrames = 5;
+ _object12.animate(ANIM_MODE_2, NULL);
+ break;
+ case 280:
+ BF_GLOBALS._player.setVisage(271);
+ BF_GLOBALS._player.setStrip(5);
+ BF_GLOBALS._player._frame = 6;
+ BF_GLOBALS._player.setPosition(Common::Point(228, 138));
+
+ _object1.postInit();
+ _object1.setPosition(Common::Point(340, 100));
+
+ _object11.postInit();
+ _object11.setVisage(272);
+ _object11.setStrip(1);
+ _object11._frame = 2;
+ _object11.setPosition(Common::Point(35, 136));
+
+ _object6.postInit();
+ _object6.hide();
+
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.proc1(19);
+
+ _object12.postInit();
+ _object12.setVisage(274);
+ _object12.setPosition(Common::Point(157, 132));
+ _object12.animate(ANIM_MODE_2, NULL);
+ _object12._numFrames = 5;
+ _object12.fixPriority(120);
+ _field796 = 1;
+ break;
+ case 590:
+ BF_GLOBALS._player.setVisage(275);
+ BF_GLOBALS._player.setStrip(5);
+ BF_GLOBALS._player.setPosition(Common::Point(58, 133));
+ BF_GLOBALS._player.changeZoom(-1);
+
+ _object8.postInit();
+ _object8.setVisage(279);
+ _object8.setPosition(Common::Point(87, 127));
+ _object8.fixPriority(146);
+
+ _object7.postInit();
+ _object7.setVisage(277);
+ _object7.setStrip(7);
+ _object7.setPosition(Common::Point(48, 149));
+
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.proc1(19);
+
+ _object12.postInit();
+ _object12.setVisage(276);
+ _object12.setPosition(Common::Point(129, 130));
+
+ _object2.postInit();
+ _object2.setVisage(270);
+ _object2.setStrip(3);
+ _object2.setFrame(2);
+ _object2.setPosition(Common::Point(62, 101));
+ _object2.fixPriority(145);
+
+ _object3.postInit();
+ _object3.setVisage(270);
+ _object3.setStrip(3);
+ _object3.setFrame(3);
+ _object3.setPosition(Common::Point(90, 104));
+ _object3.fixPriority(132);
+
+ _object4.postInit();
+ _object4.setVisage(270);
+ _object4.setStrip(3);
+ _object4.setFrame(4);
+ _object4.setPosition(Common::Point(132, 87));
+ _object4.fixPriority(1);
+ break;
+ default:
+ BF_GLOBALS._player.setVisage(271);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.setPosition(Common::Point(239, 145));
+
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.proc1(19);
+
+ _object12.postInit();
+ _object12.setVisage(274);
+ _object12.setPosition(Common::Point(157, 132));
+ _object12.animate(ANIM_MODE_2, NULL);
+ _object12._numFrames = 5;
+
+ _object1.postInit();
+ _object1.setVisage(271);
+ _object1.setStrip(4);
+ _object1.setPosition(Common::Point(220, 117));
+ _object1.fixPriority(145);
+ break;
+ }
+
+ _sceneMode = 11;
+
+ static uint32 black = 0;
+ add2Faders((const byte *)&black, 2, 270, this);
+}
+
+void Scene271::signal() {
+ static uint32 black = 0;
+
+ switch (_sceneMode) {
+ case 10:
+ _sceneMode = 2702;
+ setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
+ break;
+ case 11:
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 180:
+ _sceneMode = 2716;
+ setAction(&_sequenceManager1, this, 2716, &BF_GLOBALS._player, &_object12, NULL);
+ break;
+ case 280:
+ BF_GLOBALS._dayNumber = 3;
+ BF_INVENTORY.alterInventory(3);
+
+ _sceneMode = 2707;
+ setAction(&_sequenceManager1, this, 2707, &BF_GLOBALS._player, &_object1, &_object11, &_object5, &_object6, NULL);
+ break;
+ case 590:
+ _sceneMode = 2704;
+ setAction(&_sequenceManager1, this, 2704, &BF_GLOBALS._player, &_object12, &_object7, &_object8, NULL);
+ break;
+ default:
+ _object11.postInit();
+ _object11.setPosition(Common::Point(340, 100));
+ BF_GLOBALS._sound1.play(36);
+
+ _sceneMode = 2709;
+ setAction(&_sequenceManager1, this, 2709, &BF_GLOBALS._player, &_object1, &_object12, &_object11, NULL);
+ break;
+ }
+ break;
+ case 12:
+ BF_GLOBALS._v51C44 = 0;
+ BF_GLOBALS._sound1.changeSound(67);
+ BF_GLOBALS._sceneManager.changeScene(280);
+ break;
+ case 13:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 2702:
+ BF_GLOBALS._player._strip = 1;
+ BF_GLOBALS._player.enableControl();
+ _field2E16 = 1;
+ break;
+ case 2704:
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(690);
+ break;
+ case 2705:
+ _field796 = 1;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2706:
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.enableControl();
+
+ _object1.remove();
+ _field796 = 0;
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y);
+ break;
+ case 2707:
+ BF_GLOBALS._player.enableControl();
+ _field796 = 1;
+ _field2E16 = 1;
+
+ _object1.remove();
+ _object11.remove();
+
+ BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 1);
+ break;
+ case 2709:
+ BF_GLOBALS._sound1.play(68);
+ _sceneMode = 12;
+ addFader((const byte *)&black, 2, this);
+ break;
+ case 2712:
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(180);
+ break;
+ case 2713:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2714:
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(560);
+ break;
+ case 2715:
+ break;
+ case 2716:
+ BF_GLOBALS._deathReason = 24;
+ _sceneMode = 13;
+ addFader((const byte *)&black, 2, this);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene271::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
+ (_field796 == 1) && (!_action)) {
+ _tempPos = event.mousePos;
+ BF_GLOBALS._player.disableControl();
+
+ _sceneMode = 2706;
+ setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object1, NULL);
+ event.handled = true;
+ }
+
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < UI_INTERFACE_Y)) {
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_E);
+ BF_GLOBALS._events.setCursor(cursor);
+ } else {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene271::dispatch() {
+ if (!_action && (_field2E16 == 1)) {
+ if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 120)) {
+ _field2E16 = 0;
+ BF_GLOBALS._sceneManager.changeScene(560);
+ }
+
+ if (BF_GLOBALS._player._position.x <= 20) {
+ _field2E16 = 0;
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player._mover->remove();
+ BF_GLOBALS._player._strip = 3;
+ BF_GLOBALS._player._frame = 1;
+
+ if (BF_GLOBALS._sceneObjects->contains(&_object12)) {
+ _sceneMode = 10;
+ _stripManager.start(2711, this);
+ } else {
+ SceneItem::display2(270, 33);
+ _sceneMode = 2702;
+ setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
+ }
+ }
+
+ if (BF_GLOBALS._player._position.x >= 300) {
+ _field2E16 = 0;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2712;
+ setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL);
+ }
+ }
+
+ SceneExt::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 280 - Bedroom Flashback cut-scene
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene280::Action1::signal() {
+ Scene280 *scene = (Scene280 *)BF_GLOBALS._sceneManager._scene;
+ static uint32 black = 0;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_jake.postInit();
+ scene->_jake.setVisage(283);
+ scene->_jake.setPosition(Common::Point(331, 200));
+ scene->_jake.animate(ANIM_MODE_1, NULL);
+ scene->_jake.setStrip(1);
+ ADD_MOVER(scene->_jake, 189, 131);
+ break;
+ case 1:
+ scene->_jake.setStrip(2);
+ scene->_jake.setFrame(1);
+ scene->_jake.animate(ANIM_MODE_8, NULL);
+ scene->_jake._numFrames = 5;
+
+ scene->_stripManager.start(2800, this);
+ break;
+ case 2:
+ scene->_jake.animate(ANIM_MODE_5, NULL);
+ scene->_dad.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_jake.setStrip(4);
+ scene->_jake.setFrame(1);
+ scene->_dad.setStrip(2);
+ scene->_jake.setFrame(1);
+ scene->_dad.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ scene->_dad.setStrip(3);
+ scene->_dad.setFrame(1);
+ scene->_dad.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ scene->_object4.hide();
+ scene->_dad.setVisage(282);
+ scene->_dad.setStrip(1);
+ scene->_dad.setFrame(1);
+ scene->_dad._numFrames = 5;
+ scene->_dad.animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ scene->_stripManager.start(2801, this);
+ break;
+ case 7:
+ scene->_mum.postInit();
+ scene->_mum.setVisage(282);
+ scene->_mum.setStrip(2);
+ scene->_mum.setFrame(1);
+ scene->_mum.fixPriority(1);
+ scene->_mum.setPosition(Common::Point(160, 138));
+
+ scene->_jake.setStrip(3);
+ scene->_jake.setFrame(1);
+ scene->_jake.animate(ANIM_MODE_5, this);
+
+ scene->_dad._numFrames = 10;
+ scene->_dad.setVisage(284);
+ scene->_dad.setStrip(1);
+ scene->_dad.fixPriority(-1);
+ scene->_dad.setPosition(Common::Point(174, 136));
+ scene->_dad.setFrame(1);
+ scene->_dad.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER(scene->_dad, 438, 320);
+ break;
+ case 8:
+ scene->_mum.animate(ANIM_MODE_4, 5, 1, this);
+ break;
+ case 9:
+ scene->_sceneMode = 2;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ scene->addFader((const byte *)&black, 2, scene);
+
+ scene->_jake.remove();
+ scene->_mum.animate(ANIM_MODE_5, NULL);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene280::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
+ loadScene(280);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+
+ _dad.postInit();
+ _dad.setVisage(281);
+ _dad.setPosition(Common::Point(160, 138));
+ _dad.fixPriority(1);
+
+ _object4.postInit();
+ _object4.setVisage(280);
+ _object4.setPosition(Common::Point(139, 141));
+
+ const uint32 black = 0;
+ add2Faders((const byte *)&black, 2, 280, this);
+ _sceneMode = 1;
+ setAction(&_action1);
+}
+
+void Scene280::signal() {
+ if (_sceneMode == 2)
+ BF_GLOBALS._sceneManager.changeScene(271);
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes2.h b/engines/tsage/blue_force/blueforce_scenes2.h
new file mode 100644
index 0000000000..17e749d7a1
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes2.h
@@ -0,0 +1,298 @@
+/* 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 TSAGE_BLUEFORCE_SCENES2_H
+#define TSAGE_BLUEFORCE_SCENES2_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class IntroObject: public NamedObject {
+};
+
+class Scene200: public SceneExt {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ Action2 _action2;
+ NamedObject _object1, _object2, _object3, _object4, _object5, _object6;
+ IntroObject _object7, _object8, _object9;
+ NamedObject _object10, _object11;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+};
+
+class Scene210: public SceneExt {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ IntroObject _object1, _object2, _object3, _object4;
+ IntroObject _object5, _object6, _object7, _object8;
+ NamedObject _object9, _object10, _object11, _object12;
+ NamedObject _object13, _object14, _object15;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+};
+
+class Scene220: public SceneExt {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ Action2 _action2;
+ NamedObject _object1, _object2, _object3, _object4, _object5;
+ NamedObject _object6, _object7, _object8, _object9;
+ IntroObject _object10, _object11, _object12, _object13;
+ IntroObject _object14, _object15, _object16;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+};
+
+class Scene225: public SceneExt {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ IntroObject _object1, _object2, _object3, _object4;
+ IntroObject _object5, _object6, _object7;
+ NamedObject _object8, _object9, _object10, _object11, _object12;
+ NamedObject _object13, _object14, _object15, _object16;
+ NamedObject _object17, _object18, _object19;
+ NamedObject _object20, _object21;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+};
+
+class Scene265: public SceneExt {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+public:
+ Action1 _action1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+};
+
+class Scene270: public SceneExt {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Grandma: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ SpeakerGrandma _grandmaSpeaker;
+ SpeakerLyle _lyleSpeaker;
+ SpeakerJake _jakeSpeaker;
+ SpeakerLaura _lauraSpeaker;
+ SpeakerSkip _skipSpeaker;
+ SpeakerGameText _gameTextSpeaker;
+ Action1 _action1;
+ NamedObject _object1, _object2, _object3, _laura;
+ NamedObject _skip, _tv, _fireplace;
+ Lyle _lyle;
+ Grandma _grandma;
+ Item _couch, _afgan;
+ NamedHotspot _appliances;
+ NamedHotspot _ivy, _fridge, _photos, _item8, _item9;
+ NamedHotspot _item10, _item11, _background;
+ Exit _exit;
+ int _field380, _field382, _field384, _field386;
+ int _field219A, _field21A0;
+ Common::Point _tempPos;
+
+ Scene270();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene271: public PalettedScene {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Object12: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ SpeakerGrandma _grandmaSpeaker;
+ SpeakerLyle _lyleSpeaker;
+ SpeakerJake _jakeSpeaker;
+ SpeakerLaura _lauraSpeaker;
+ SpeakerSkip _skipSpeaker;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerGranText _granTextSpeaker;
+ SpeakerLyleText _lyleTextSpeaker;
+
+ NamedObject _object1, _object2, _object3, _object4, _object5;
+ NamedObject _object6, _object7, _object8, _tv, _object10;
+ NamedObject _object11;
+ Object12 _object12;
+ Item _item1, _item3;
+ NamedHotspot _item2, _item4, _item5, _item6, _item7;
+ NamedHotspot _item8, _item9, _item10, _item11;
+ Exit _exit;
+ Action1 _action1;
+ Rect _rect1;
+ int _field796, _field2E16;
+ Common::Point _tempPos;
+
+ Scene271();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene280: public PalettedScene {
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+public:
+ Action1 _action1;
+ SpeakerGameText _gameTextSpeaker;
+ NamedObject _jake, _dad, _mum, _object4;
+
+ void postInit(SceneObjectList *OwnerList);
+ virtual void signal();
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp
new file mode 100644
index 0000000000..1fa27ccb27
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes3.cpp
@@ -0,0 +1,5930 @@
+/* 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.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "tsage/blue_force/blueforce_scenes3.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/globals.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 300 - Outside Police Station
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene300::Object::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_TALK) {
+ Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+ scene->_stripManager.start(_stripNumber, scene);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene300::Object19::startAction(CursorType action, Event &event) {
+ if ((action != CURSOR_USE) || !BF_GLOBALS.getFlag(onDuty)) {
+ return NamedObject::startAction(action, event);
+ } else if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._bookmark >= bEndDayOne)) {
+ Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+ setAction(&scene->_action4);
+ } else {
+ SceneItem::display2(300, 33);
+ }
+
+ return true;
+}
+
+bool Scene300::Item1::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE) {
+ Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 305;
+ scene->setAction(&scene->_sequenceManager1, scene, 305, &BF_GLOBALS._player,
+ &scene->_object8, NULL);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene300::Item2::startAction(CursorType action, Event &event) {
+ if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) {
+ Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+ scene->setAction(&scene->_sequenceManager1, scene, 304, &scene->_object11, NULL);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene300::Item14::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 151, 54);
+ return true;
+}
+
+bool Scene300::Item15::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 316, 90);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene300::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(1);
+ break;
+ case 1:
+ if (BF_GLOBALS.getFlag(fWithLyle))
+ SceneItem::display2(666, 27);
+ else
+ SceneItem::display2(300, 0);
+ setDelay(1);
+ break;
+ case 2: {
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 8,
+ BF_GLOBALS._player._position.y);
+ break;
+ }
+ case 3:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene300::Action2::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(1);
+ break;
+ case 1:
+ SceneItem::display2(300, 28);
+ setDelay(1);
+ break;
+ case 2: {
+ ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 8,
+ BF_GLOBALS._player._position.y);
+ break;
+ }
+ case 3:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene300::Action3::signal() {
+ Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(1);
+ break;
+ case 1:
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 306, &BF_GLOBALS._player,
+ &scene->_object8, NULL);
+ break;
+ case 2:
+ SceneItem::display2(300, 35);
+ setDelay(1);
+ break;
+ case 3:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene300::Action4::signal() {
+ Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(1);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager1, this, 316, &BF_GLOBALS._player, &scene->_object19, NULL);
+ break;
+ case 2:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 3:
+ setAction(&scene->_sequenceManager1, this, 319, &scene->_object19, NULL);
+ break;
+ case 4:
+ BF_GLOBALS.setFlag(2);
+ BF_GLOBALS._sceneManager.changeScene(190);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene300::Action5::signal() {
+ Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ scene->_field2760 = 1;
+ setDelay(1);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager1, this, 1306, &scene->_object1, &scene->_object8, NULL);
+ break;
+ case 2:
+ scene->_stripManager.start(3004, this);
+ break;
+ case 3: {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 186, 140);
+ break;
+ }
+ case 4:
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene300::Scene300(): SceneExt(), _object13(3000), _object14(3001), _object15(3002),
+ _object16(3003) {
+ _field2760 = _field2762 = 0;
+}
+
+void Scene300::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(300);
+
+ // Add the speakers
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_sutterSpeaker);
+ _stripManager.addSpeaker(&_dougSpeaker);
+ _stripManager.addSpeaker(&_jakeSpeaker);
+
+ _field2762 = 0;
+ _item14.setDetails(Rect(144, 27, 160, 60), 300, -1, -1, -1, 1, NULL);
+ _item15.setDetails(Rect(310, 76, SCREEN_WIDTH, 105), 300, -1, -1, -1, 1, NULL);
+
+ // Setup the player
+ int playerVisage = BF_GLOBALS._player._visage;
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(playerVisage);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.setPosition(Common::Point(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2));
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
+ BF_GLOBALS._player.disableControl();
+
+ _object8.postInit();
+ _object8.setVisage(301);
+ _object8.setStrip(2);
+ _object8.setPosition(Common::Point(300, 77));
+
+ if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._bookmark < bEndDayOne)) {
+ _object17.postInit();
+ _object17.setVisage(301);
+ _object17.setStrip(1);
+ _object17.setPosition(Common::Point(87, 88));
+ _object17.setDetails(300, 11, 13, 2, 1, NULL);
+
+ _object18.postInit();
+ _object18.setVisage(301);
+ _object18.setStrip(1);
+ _object18.setPosition(Common::Point(137, 92));
+ _object18.setDetails(300, 11, 13, 3, 1, NULL);
+ }
+
+ _object19.postInit();
+ _object19.setVisage(301);
+ _object19.setStrip(1);
+ _object19.setPosition(Common::Point(175, 99));
+ _object19.setDetails(300, 11, 13, 34, 1, NULL);
+
+ _object11.postInit();
+ _object11.setVisage(301);
+ _object11.setStrip(8);
+ _object11.setPosition(Common::Point(265, 91));
+ _object11.hide();
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 50:
+ case 60:
+ BF_GLOBALS.clearFlag(onBike);
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 318;
+ setAction(&_sequenceManager1, this, 318, &BF_GLOBALS._player, &_object19, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 300;
+ setAction(&_sequenceManager1, this, 1300, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 190:
+ _sceneMode = 0;
+ if (!BF_GLOBALS.getFlag(2)) {
+ _sceneMode = 7308;
+ BF_GLOBALS._player.setPosition(Common::Point(175, 50));
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 123, 71);
+
+ if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne))
+ setup();
+ } else if (!BF_GLOBALS.getFlag(3)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 300;
+ setAction(&_sequenceManager1, this, 300, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 318;
+ setAction(&_sequenceManager1, this, 318, &BF_GLOBALS._player, &_object19, NULL);
+ }
+ break;
+ case 315:
+ BF_GLOBALS._player.setPosition(Common::Point(305, 66));
+ if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._bookmark >= bEndDayOne)) {
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1304 : 303);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL);
+ } else {
+ BF_GLOBALS._player.setVisage(1304);
+ setup();
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL);
+ }
+ break;
+ default:
+ _sceneMode = 0;
+ BF_GLOBALS._player.setVisage(1304);
+ BF_GLOBALS._player.disableControl();
+ setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL);
+ break;
+ }
+
+ _item10.setDetails(4, 300, 7, 13, 16, 1);
+ _item11.setDetails(2, 300, 9, 13, 18, 1);
+ _item12.setDetails(5, 300, 10, 13, 19, 1);
+ _item13.setDetails(3, 300, 25, 26, 27, 1);
+ _item2.setDetails(Rect(266, 54, 272, 59), 300, -1, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(262, 47, 299, 76), 300, 1, 13, -1, 1, NULL);
+ _item4.setDetails(Rect(0, 85, SCREEN_WIDTH - 1, UI_INTERFACE_Y - 1), 300, 6, 13, 15, 1, NULL);
+ _item7.setDetails(Rect(219, 46, 251, 74), 300, 22, 23, 24, 1, NULL);
+ _item8.setDetails(Rect(301, 53, 319, 78), 300, 22, 23, 24, 1, NULL);
+ _item5.setDetails(Rect(179, 44, 200, 55), 300, 8, 13, 17, 1, NULL);
+ _item6.setDetails(Rect(210, 46, 231, 55), 300, 8, 13, 17, 1, NULL);
+ _item3.setDetails(Rect(160, 0, SCREEN_WIDTH - 1, 75), 300, 4, 13, 14, 1, NULL);
+ _item9.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 300, 29, 30, 31, 1, NULL);
+}
+
+void Scene300::signal() {
+ switch (_sceneMode) {
+ case 300:
+ BF_GLOBALS._sound1.fadeSound(33);
+ BF_GLOBALS.clearFlag(onBike);
+ _sceneMode = 0;
+
+ if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark != bNone)) {
+ signal();
+ } else {
+ _stripManager.start(3005, this);
+ }
+ break;
+ case 301:
+ if (_field2760) {
+ _sceneMode = 1302;
+ signal();
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1302;
+ setAction(&_sequenceManager1, this, 306, &_object1, &_object8, NULL);
+ }
+
+ _object12.show();
+ _object5.dispatch();
+ BF_GLOBALS._player.hide();
+ break;
+ case 303:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2307;
+ setAction(&_sequenceManager1, this, 303, &_object13, &_object1, NULL);
+ break;
+ case 305:
+ if ((BF_GLOBALS._dayNumber == 4) || (BF_GLOBALS._dayNumber == 5)) {
+ _sceneMode = 0;
+ setAction(&_action3);
+ } else {
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(315);
+ }
+ break;
+ case 309:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3307;
+ setAction(&_sequenceManager1, this, 309, &_object14, &_object1, NULL);
+ break;
+ case 310:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4307;
+ setAction(&_sequenceManager1, this, 310, &_object12, &_object1, NULL);
+ break;
+ case 311:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 5307;
+ setAction(&_sequenceManager1, this, 311, &_object15, &_object1, NULL);
+ break;
+ case 312:
+ case 5307:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1305;
+ setAction(&_sequenceManager1, this, 312, &_object1, &_object16, NULL);
+ break;
+ case 317:
+ BF_GLOBALS.setFlag(2);
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 318:
+ BF_GLOBALS.clearFlag(onBike);
+ _sceneMode = 0;
+ signal();
+ break;
+ case 1302:
+ _field2762 = 0;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1308;
+ setAction(&_sequenceManager1, this, 302, &_object1, NULL);
+ break;
+ case 1305:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1313;
+ setAction(&_sequenceManager1, this, 305, &_object1, &_object8, NULL);
+ BF_GLOBALS._player.show();
+ _object12.hide();
+ break;
+ case 1307:
+ case 2308:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 303;
+ setAction(&_sequenceManager1, this, 308, &_object14, NULL);
+ break;
+ case 1308:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1307;
+ setAction(&_sequenceManager1, this, 308, &_object13, NULL);
+ break;
+ case 1313:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ _object15.setAction(&_sequenceManager4, NULL, 315, &_object15, &_object16, NULL);
+ _object13.setAction(&_sequenceManager2, NULL, 313, &_object13, &_object17, NULL);
+ _object14.setAction(&_sequenceManager3, this, 314, &_object14, &_object18, NULL);
+
+ BF_GLOBALS._bookmark = bEndDayOne;
+ BF_GLOBALS._sound1.changeSound(33);
+ break;
+ case 2307:
+ case 3308:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 309;
+ setAction(&_sequenceManager1, this, 308, &_object12, NULL);
+ break;
+ case 3307:
+ _object9.postInit();
+ _object9.hide();
+ _object10.postInit();
+ _object10.hide();
+
+ if (BF_GLOBALS.getFlag(1)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4308;
+ setAction(&_sequenceManager1, this, 6307, &_object2, &_object1, &_object9, &_object10, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4308;
+ setAction(&_sequenceManager1, this, 7307, &_object12, &_object1, &_object9, &_object10, NULL);
+ }
+ break;
+ case 4307:
+ case 5308:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 311;
+ setAction(&_sequenceManager1, this, 308, &_object16, NULL);
+ break;
+ case 4308:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 310;
+ setAction(&_sequenceManager1, this, 308, &_object15, NULL);
+ break;
+ case 6308:
+ BF_GLOBALS._sceneManager.changeScene(190);
+ break;
+ case 7308:
+ if (_field2762) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 301;
+ setAction(&_sequenceManager1, this, 301, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 0:
+ default:
+ if (_field2762) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 301;
+ setAction(&_sequenceManager1, this, 301, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ }
+}
+
+void Scene300::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_item14.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NE);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if (_item15.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene300::dispatch() {
+ SceneExt::dispatch();
+
+ if (!_action) {
+ int regionIndex = BF_GLOBALS._player.getRegionIndex();
+ if ((regionIndex == 1) && (_field2762 == 1)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 301;
+ setAction(&_sequenceManager1, this, 301, &BF_GLOBALS._player, NULL);
+ }
+
+ if ((BF_GLOBALS._player._position.y < 59) && (BF_GLOBALS._player._position.x > 137) &&
+ (_sceneMode != 6308) && (_sceneMode != 7308)) {
+ BF_GLOBALS._v4CEA4 = 3;
+ _sceneMode = 6308;
+ BF_GLOBALS._player.disableControl();
+ ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 20,
+ BF_GLOBALS._player._position.y - 5);
+ }
+
+ if (BF_GLOBALS._player._position.x <= 5)
+ setAction(&_action2);
+
+ if (BF_GLOBALS._player._position.x >= 315) {
+ if (BF_GLOBALS.getFlag(onDuty) || (BF_GLOBALS._bookmark == bNone) || BF_GLOBALS.getFlag(fWithLyle)) {
+ setAction(&_action1);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 317;
+ setAction(&_sequenceManager1, this, 1301, &BF_GLOBALS._player, NULL);
+ }
+ }
+ }
+}
+
+void Scene300::setup() {
+ _object13.postInit();
+ _object13.setVisage(307);
+ _object13.setStrip(6);
+ _object13.setPosition(Common::Point(156, 134));
+ _object13._moveDiff = Common::Point(3, 1);
+ _object3.setup(&_object13, 306, 1, 29);
+
+ _object14.postInit();
+ _object14.setVisage(307);
+ _object14.setStrip(6);
+ _object14.setPosition(Common::Point(171, 137));
+ _object14._moveDiff = Common::Point(3, 1);
+ _object4.setup(&_object14, 306, 2, 29);
+
+ _object12.postInit();
+ _object12.setVisage(307);
+ _object12.setStrip(6);
+ _object12.setPosition(Common::Point(186, 140));
+ _object12._moveDiff = Common::Point(3, 1);
+ _object5.setup(&_object12, 306, 2, 29);
+ _object12.hide();
+
+ _object15.postInit();
+ _object15.setVisage(307);
+ _object15.setStrip(6);
+ _object15.setPosition(Common::Point(201, 142));
+ _object15._moveDiff = Common::Point(3, 1);
+ _object6.setup(&_object15, 306, 3, 29);
+
+ _object16.postInit();
+ _object16.setVisage(307);
+ _object16.setStrip(6);
+ _object16.setPosition(Common::Point(216, 145));
+ _object16._moveDiff = Common::Point(3, 1);
+ _object7.setup(&_object16, 306, 1, 29);
+
+ _object1.postInit();
+ _object1.setVisage(307);
+ _object1.setStrip(6);
+ _object1.setPosition(Common::Point(305, 66));
+ _object1._moveDiff = Common::Point(3, 1);
+ _object1.setObjectWrapper(new SceneObjectWrapper());
+ _object1.animate(ANIM_MODE_1, NULL);
+ _object2.setup(&_object1, 306, 4, 9);
+
+ BF_GLOBALS._sceneItems.addItems(&_object13, &_object14, &_object15, &_object16, NULL);
+ _timer.set(3600, this, &_action5);
+
+ _field2760 = 0;
+ _field2762 = 1;
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 315 - Inside Police Station
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene315::Barry::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+ scene->_currentCursor = action;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_field1B60 || scene->_field1B64)
+ SceneItem::display2(320, 51);
+ else
+ NamedHotspot::startAction(action, event);
+ break;
+ case CURSOR_TALK:
+ if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._sceneManager._previousScene == 325))
+ NamedHotspot::startAction(action, event);
+ else {
+ if (!BF_GLOBALS.getFlag(onDuty))
+ scene->_stripNumber = 3172;
+ else if (BF_GLOBALS.getFlag(fTalkedToBarry))
+ scene->_stripNumber = 3166;
+ else if (BF_GLOBALS.getFlag(fTalkedToLarry))
+ scene->_stripNumber = 3164;
+ else
+ scene->_stripNumber = 3165;
+
+ scene->setAction(&scene->_action1);
+ BF_GLOBALS.setFlag(fTalkedToBarry);
+ }
+ break;
+ case INV_GREENS_GUN:
+ case INV_GREENS_KNIFE:
+ BF_GLOBALS._player.disableControl();
+ if (BF_INVENTORY._bookingGreen._sceneNumber == 390) {
+ scene->_stripNumber = 3174;
+ scene->setAction(&scene->_action1);
+ } else {
+ ++scene->_field1B62;
+ scene->_stripNumber = (action == INV_GREENS_GUN) ? 3168 : 0;
+ scene->_sceneMode = 3153;
+ scene->setAction(&scene->_sequenceManager, scene, 3153, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case INV_FOREST_RAP:
+ BF_GLOBALS._player.disableControl();
+ scene->_stripNumber = BF_GLOBALS.getFlag(onDuty) ? 3178 : 3173;
+ scene->setAction(&scene->_action1);
+ break;
+ case INV_GREEN_ID:
+ case INV_FRANKIE_ID:
+ case INV_TYRONE_ID:
+ BF_GLOBALS._player.disableControl();
+ scene->_stripNumber = 3175;
+ scene->setAction(&scene->_action1);
+ break;
+ case INV_BOOKING_GREEN:
+ case INV_BOOKING_FRANKIE:
+ case INV_BOOKING_GANG:
+ BF_GLOBALS._player.disableControl();
+ scene->_stripNumber = 3167;
+ scene->setAction(&scene->_action1);
+ break;
+ case INV_COBB_RAP:
+ if (BF_INVENTORY._mugshot._sceneNumber == 1)
+ NamedHotspot::startAction(action, event);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3169;
+ if (BF_GLOBALS._dayNumber > 2)
+ scene->_stripNumber = 3176;
+ else if (BF_GLOBALS.getFlag(onDuty))
+ scene->_stripNumber = 3177;
+ else
+ scene->_stripNumber = 3170;
+ scene->setAction(&scene->_action1);
+ }
+ break;
+ case INV_22_BULLET:
+ case INV_AUTO_RIFLE:
+ case INV_WIG:
+ case INV_22_SNUB:
+ BF_GLOBALS._player.disableControl();
+ if ((BF_GLOBALS.getFlag(fCuffedFrankie) && (BF_INVENTORY._bookingFrankie._sceneNumber == 0)) ||
+ (!BF_GLOBALS.getFlag(fCuffedFrankie) && (BF_INVENTORY._bookingGang._sceneNumber == 0))) {
+ scene->_stripNumber = 3174;
+ scene->setAction(&scene->_action1);
+ } else {
+ ++scene->_field1B66;
+ if (!scene->_field1B6C && (scene->_field1B66 == 1)) {
+ scene->_field1B6C = 1;
+ scene->_stripNumber = 3169;
+ } else {
+ scene->_stripNumber = 0;
+ }
+
+ scene->_sceneMode = 3153;
+ scene->setAction(&scene->_sequenceManager, scene, 3153, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+
+ return true;
+}
+
+bool Scene315::SutterSlot::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+ scene->_currentCursor = action;
+
+ switch (action) {
+ case INV_GREENS_GUN:
+ case INV_22_BULLET:
+ case INV_AUTO_RIFLE:
+ case INV_WIG:
+ case INV_22_SNUB:
+ SceneItem::display2(315, 30);
+ break;
+ case INV_GREEN_ID:
+ case INV_FRANKIE_ID:
+ case INV_TYRONE_ID:
+ BF_GLOBALS._player.disableControl();
+ scene->_stripNumber = 3175;
+ scene->setAction(&scene->_action1);
+ break;
+ case INV_BOOKING_GREEN:
+ case INV_BOOKING_FRANKIE:
+ case INV_BOOKING_GANG:
+ if (action == INV_BOOKING_GREEN)
+ ++scene->_field1B62;
+ else
+ ++scene->_field1B66;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 12;
+ scene->setAction(&scene->_sequenceManager, scene, 3154, &BF_GLOBALS._player, NULL);
+ break;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+
+ return true;
+}
+
+bool Scene315::Sign::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.addMover(NULL);
+ scene->_object9.postInit();
+ scene->_object9.hide();
+ scene->_sceneMode = 3167;
+ scene->setAction(&scene->_sequenceManager, scene, 3167, &scene->_object9, this, NULL);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene315::BulletinBoard::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ BF_GLOBALS._player.addMover(NULL);
+ scene->_stripManager.start(3154, &BF_GLOBALS._stripProxy);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene315::CleaningKit::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == INV_COLT45) && BF_GLOBALS.getFlag(onDuty)) {
+ if (!BF_GLOBALS.getFlag(onDuty))
+ SceneItem::display2(315, 27);
+ else if (BF_GLOBALS.getHasBullets()) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3162;
+ scene->setAction(&scene->_sequenceManager, scene, 3162, &BF_GLOBALS._player, NULL);
+ } else if (BF_GLOBALS.getFlag(fGunLoaded))
+ SceneItem::display2(315, 46);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3159;
+ scene->setAction(&scene->_sequenceManager, scene, 3159, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene315::BriefingMaterial::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return NamedHotspot::startAction(action, event);
+ else if (BF_INVENTORY._forestRap._sceneNumber == 1) {
+ SceneItem::display2(315, 37);
+ return true;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3158;
+ scene->setAction(&scene->_sequenceManager, scene, 3158, &BF_GLOBALS._player, NULL);
+ return true;
+ }
+}
+
+bool Scene315::WestExit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 190, 75);
+ return true;
+}
+
+bool Scene315::SouthWestExit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, event.mousePos.x, event.mousePos.y);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene315::BulletinMemo::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ scene->_stripManager.start(3157, &BF_GLOBALS._stripProxy);
+ return true;
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(fGotPointsForCleaningGun)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_GLOBALS.setFlag(fGotPointsForCleaningGun);
+ }
+ BF_GLOBALS._player.addMover(NULL);
+ scene->_stripManager.start(3159, &BF_GLOBALS._stripProxy);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene315::Object2::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ BF_GLOBALS._player.disableControl();
+ scene->_object9.postInit();
+ scene->_object9.hide();
+ scene->_sceneMode = 3157;
+ scene->setAction(&scene->_sequenceManager, scene, 3157, &BF_GLOBALS._player, &scene->_object9, NULL);
+ return true;
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3156;
+ scene->setAction(&scene->_sequenceManager, scene, BF_GLOBALS.getFlag(onDuty) ? 3156 : 3168,
+ &BF_GLOBALS._player, this, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene315::ATFMemo::startAction(CursorType action, Event &event) {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ BF_GLOBALS._player.addMover(NULL);
+ scene->_stripManager.start(3156, &BF_GLOBALS._stripProxy);
+ return true;
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(fGotPointsForMemo)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForMemo);
+ }
+
+ BF_GLOBALS._player.addMover(NULL);
+ scene->_stripManager.start(3158, &BF_GLOBALS._stripProxy);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene315::Action1::signal() {
+ Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 128, 128);
+ break;
+ case 1:
+ BF_GLOBALS._player.changeAngle(315);
+ setDelay(2);
+ break;
+ case 2:
+ scene->_stripManager.start(scene->_stripNumber, this);
+ break;
+ case 3:
+ if (scene->_sceneMode == 3169) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 1);
+ }
+
+ remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene315::Scene315() {
+ BF_GLOBALS._v51C44 = 1;
+ _field1B6C = _field139C = 0;
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+
+ BF_GLOBALS.clearFlag(fCanDrawGun);
+ _field1B68 = true;
+ _field1B6A = false;
+ _field1B60 = _field1B62 = 0;
+ _field1B64 = _field1B66 = 0;
+}
+
+void Scene315::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field1390);
+ s.syncAsSint16LE(_stripNumber);
+ s.syncAsSint16LE(_field1398);
+ s.syncAsSint16LE(_field1B60);
+ s.syncAsSint16LE(_field1B62);
+ s.syncAsSint16LE(_field1B64);
+ s.syncAsSint16LE(_field1B66);
+ s.syncAsSint16LE(_field1B6C);
+ s.syncAsSint16LE(_field139C);
+ s.syncAsByte(_field1B68);
+ s.syncAsByte(_field1B6A);
+ s.syncAsSint16LE(_currentCursor);
+}
+
+void Scene315::postInit(SceneObjectList *OwnerList) {
+ loadScene(315);
+
+ if (BF_GLOBALS._sceneManager._previousScene != 325)
+ BF_GLOBALS._sound1.fadeSound(11);
+
+ setZoomPercents(67, 72, 124, 100);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_sutterSpeaker);
+ _stripManager.addSpeaker(&_harrisonSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_jailerSpeaker);
+
+ _object8.postInit();
+ _object8.setVisage(315);
+ _object8.setPosition(Common::Point(272, 69));
+
+ if (BF_GLOBALS._bookmark >= bLauraToParamedics) {
+ _atfMemo.postInit();
+ _atfMemo.setVisage(315);
+ _atfMemo.setPosition(Common::Point(167, 53));
+ _atfMemo.setStrip(4);
+ _atfMemo.setFrame(4);
+ _atfMemo.fixPriority(82);
+ _atfMemo.setDetails(315, -1, -1, -1, 1, NULL);
+ }
+
+ if (BF_GLOBALS._dayNumber == 1) {
+ if (BF_GLOBALS._bookmark >= bLauraToParamedics) {
+ _bulletinMemo.postInit();
+ _bulletinMemo.setVisage(315);
+ _bulletinMemo.setPosition(Common::Point(156, 51));
+ _bulletinMemo.setStrip(4);
+ _bulletinMemo.setFrame(2);
+ _bulletinMemo.fixPriority(82);
+ _bulletinMemo.setDetails(315, -1, -1, -1, 1, NULL);
+ }
+ } else if ((BF_INVENTORY._daNote._sceneNumber != 1) && (BF_GLOBALS._dayNumber < 3)) {
+ _object2.postInit();
+ _object2.setVisage(315);
+ _object2.setStrip(3);
+ _object2.setFrame(2);
+ _object2.setPosition(Common::Point(304, 31));
+ _object2.fixPriority(70);
+ _object2.setDetails(315, 3, 4, -1, 1, NULL);
+ }
+
+ _sutterSlot.setDetails(12, 315, 35, -1, 36, 1);
+ _bulletinBoard.setDetails(3, 315, -1, -1, -1, 1);
+ _barry.setDetails(4, 315, 10, 11, 12, 1);
+ _item3.setDetails(2, 315, 0, 1, 2, 1);
+ _sign.setDetails(Rect(190, 17, 208, 30), 315, -1, -1, -1, 1, NULL);
+ _westExit.setDetails(Rect(184, 31, 211, 80), 315, -1, -1, -1, 1, NULL);
+ _swExit.setDetails(Rect(0, 157, 190, 167), 315, -1, -1, -1, 1, NULL);
+
+ if (!BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._bookmark == bNone) || (BF_GLOBALS._bookmark == bLyleStoppedBy))) {
+ _field1398 = 1;
+ BF_GLOBALS.setFlag(onDuty);
+ } else {
+ _field1398 = 0;
+ }
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.disableControl();
+
+ if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._sceneManager._previousScene != 325)) {
+ _object4.postInit();
+ _object4.setVisage(316);
+ _object4.setPosition(Common::Point(99, 82));
+ _object4.fixPriority(95);
+
+ _object5.postInit();
+ _object5.setVisage(395);
+ _object5.setStrip(2);
+ _object5.setPosition(Common::Point(96, 86));
+ }
+
+ // Set up evidence objects in inventory
+ if (BF_INVENTORY._bookingGreen.inInventory())
+ ++_field1B60;
+ if (BF_INVENTORY._greensGun.inInventory())
+ ++_field1B60;
+ if (BF_INVENTORY._greensKnife.inInventory())
+ ++_field1B60;
+
+ if (BF_INVENTORY._bullet22.inInventory())
+ ++_field1B64;
+ if (BF_INVENTORY._autoRifle.inInventory())
+ ++_field1B64;
+ if (BF_INVENTORY._wig.inInventory())
+ ++_field1B64;
+ if (BF_INVENTORY._bookingFrankie.inInventory())
+ ++_field1B64;
+ if (BF_INVENTORY._bookingGang.inInventory())
+ ++_field1B64;
+ if (BF_INVENTORY._snub22.inInventory())
+ ++_field1B64;
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 190:
+ if (_field1398)
+ _field1B6A = true;
+ _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 3150 : 3165;
+ setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
+ break;
+ case 325:
+ T2_GLOBALS._uiElements._active = false;
+ _object6.postInit();
+ _object7.postInit();
+ _object8.setFrame(8);
+ _sceneMode = (BF_GLOBALS._dayNumber == 1) ? 3152 : 3155;
+ setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_object6,
+ &_object7, &_object8, NULL);
+ break;
+ case 300:
+ default:
+ if (_field1398)
+ _field1B6A = true;
+ if (!BF_GLOBALS.getFlag(onDuty))
+ _sceneMode = 3166;
+ else if (!_field1398)
+ _sceneMode = 3164;
+ else
+ _sceneMode = 3163;
+
+ setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
+ break;
+ }
+
+ if (_field1B6A) {
+ _object8.setFrame(8);
+ } else {
+ BF_GLOBALS._walkRegions.proc1(4);
+ }
+
+ _briefingMaterial.setDetails(24, 315, 38, 39, 40, 1);
+ _cleaningKit.setDetails(14, 315, 24, 25, 26, 1);
+ _item7.setDetails(5, 315, 8, 9, -1, 1);
+ _item6.setDetails(6, 315, 5, 6, 7, 1);
+ _item10.setDetails(8, 315, 13, -1, -1, 1);
+ _item11.setDetails(9, 315, 14, -1, -1, 1);
+ _item8.setDetails(7, 315, 15, 16, 17, 1);
+ _item9.setDetails(10, 315, 18, 19, 20, 1);
+}
+
+void Scene315::signal() {
+ int ctr = 0;
+
+ switch (_sceneMode) {
+ case 0:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 10:
+ if (_field1B62) {
+ if (_field1B62 >= _field1B60)
+ BF_GLOBALS.setFlag(fLeftTraceIn910);
+ else
+ ++ctr;
+ }
+
+ if (_field1B66) {
+ if (_field1B66 < _field1B64)
+ ++ctr;
+ else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence)
+ BF_GLOBALS._bookmark = bBookedFrankieEvidence;
+ }
+
+ if (ctr) {
+ BF_GLOBALS._deathReason = 20;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ } else {
+ BF_GLOBALS._sceneManager.changeScene(300);
+ }
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ break;
+ case 11:
+ if (_field1B62) {
+ if (_field1B62 >= _field1B60)
+ BF_GLOBALS.setFlag(fLeftTraceIn910);
+ else
+ ++ctr;
+ }
+
+ if (_field1B66) {
+ if (_field1B66 < _field1B64)
+ ++ctr;
+ else if (BF_GLOBALS._bookmark < bBookedFrankie)
+ BF_GLOBALS._bookmark = bBookedFrankie;
+ else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence)
+ BF_GLOBALS._bookmark = bBookedFrankie;
+ }
+
+ if (ctr == 1) {
+ BF_GLOBALS._deathReason = 20;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(666);
+ } else if ((BF_GLOBALS._bookmark != bBookedFrankie) || !BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(190);
+ } else {
+ BF_GLOBALS._bookmark = bBookedFrankieEvidence;
+ _field139C = 0;
+ BF_GLOBALS.clearFlag(onDuty);
+ BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60);
+ BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 60);
+ _sceneMode = 3165;
+ setAction(&_sequenceManager, this, 3165, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 12:
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene((int)_currentCursor, 315);
+
+ if (!_field1B64 || (_field1B66 != _field1B64))
+ BF_GLOBALS._player.enableControl();
+ else {
+ _field139C = 1;
+ _stripNumber = 3171;
+ setAction(&_action1);
+ }
+ break;
+ case 3150:
+ case 3164:
+ case 3165:
+ case 3166:
+ BF_GLOBALS._player.enableControl();
+ _field1B68 = false;
+ break;
+ case 3151:
+ BF_GLOBALS._sceneManager.changeScene(325);
+ break;
+ case 3152:
+ BF_GLOBALS._walkRegions.proc1(4);
+ _object7.remove();
+ _object6.remove();
+
+ BF_GLOBALS._player.enableControl();
+ _field1B68 = false;
+ BF_GLOBALS._walkRegions.proc1(4);
+ T2_GLOBALS._uiElements._active = true;
+ T2_GLOBALS._uiElements.show();
+ break;
+ case 3153:
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene((int)_currentCursor, 315);
+
+ if (_stripNumber != 0)
+ setAction(&_action1);
+ else if (!_field1B64 || (_field1B66 != _field1B64))
+ BF_GLOBALS._player.enableControl();
+ else {
+ _stripNumber = 3171;
+ setAction(&_action1);
+ _field139C = 1;
+ }
+ break;
+ case 3155:
+ BF_GLOBALS._player.enableControl();
+ _field1B68 = false;
+ BF_GLOBALS._walkRegions.proc1(4);
+ T2_GLOBALS._uiElements._active = true;
+ T2_GLOBALS._uiElements.show();
+ break;
+ case 3156:
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_INVENTORY.setObjectScene(INV_DA_NOTE, 1);
+ _object2.remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3157:
+ BF_GLOBALS._player.enableControl();
+ _object9.remove();
+ break;
+ case 3158:
+ BF_GLOBALS._player.enableControl();
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 1);
+ break;
+ case 3159:
+ if (!BF_GLOBALS.getFlag(fBookedGreenEvidence)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fBookedGreenEvidence);
+ }
+ BF_GLOBALS.setFlag(gunClean);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3161:
+ BF_GLOBALS._deathReason = 21;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 3162:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3161;
+ setAction(&_sequenceManager, this, 3161, &BF_GLOBALS._player, NULL);
+ BF_GLOBALS.setFlag(fShotSuttersDesk);
+ break;
+ case 3163:
+ _sceneMode = 3150;
+ setAction(&_sequenceManager, this, 3150, &BF_GLOBALS._player, NULL);
+ break;
+ case 3167:
+ BF_GLOBALS._player.enableControl();
+ _object9.remove();
+ break;
+ case 3154:
+ default:
+ break;
+ }
+}
+
+void Scene315::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_swExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if ((BF_GLOBALS._bookmark != bBookedFrankie) && _westExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene315::dispatch() {
+ SceneExt::dispatch();
+
+ if (_field1B68)
+ return;
+
+ if (_field1B6A) {
+ if (BF_GLOBALS._player._position.y < 69) {
+ BF_GLOBALS._player.disableControl();
+ _field1B68 = true;
+ _sceneMode = 3151;
+ setAction(&_sequenceManager, this, 3151, &BF_GLOBALS._player, NULL);
+ } else if (BF_GLOBALS._player.getRegionIndex() == 1) {
+ BF_GLOBALS._player.disableControl();
+ _field1B68 = true;
+ SceneItem::display2(315, 28);
+ _sceneMode = 3150;
+ ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 30,
+ BF_GLOBALS._player._position.y + 15);
+ } else if (BF_GLOBALS._player._position.y > 156) {
+ BF_GLOBALS._player.disableControl();
+ _field1B68 = true;
+ SceneItem::display2(315, 28);
+ _sceneMode = 3150;
+ ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 30,
+ BF_GLOBALS._player._position.y - 24);
+ }
+ } else if (BF_GLOBALS._player.getRegionIndex() == 1) {
+ BF_GLOBALS._player.disableControl();
+ _field1B68 = true;
+ _sceneMode = 11;
+ ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 30,
+ BF_GLOBALS._player._position.y - 5);
+ } else if (BF_GLOBALS._player._position.y > 156) {
+ BF_GLOBALS._player.disableControl();
+ _field1B68 = true;
+
+ if (_field139C) {
+ SceneItem::display2(315, 45);
+ _sceneMode = 3150;
+ ADD_MOVER(BF_GLOBALS._player, 112, 152);
+ } else {
+ _sceneMode = 10;
+ ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 150,
+ BF_GLOBALS._player._position.y + 120);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 325 - Police Station Conference Room
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene325::Item1::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_EXIT) {
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._sceneManager.changeScene(315);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene325::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(325);
+ BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS.clearFlag(fCanDrawGun);
+
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+
+ // Add the speakers
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_PSutterSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.hide();
+
+ if (BF_GLOBALS._dayNumber == 1) {
+ _object1.postInit();
+ _object1.setVisage(325);
+ _object1.setStrip(8);
+ _object1.setPosition(Common::Point(128, 44));
+ } else {
+ _object1.postInit();
+ _object1.setVisage(325);
+ _object1.setStrip(8);
+ _object1.setFrame(2);
+ _object1.setPosition(Common::Point(132, 28));
+
+ _object2.postInit();
+ _object2.setVisage(325);
+ _object2.setStrip(8);
+ _object2.setFrame(3);
+ _object2.setPosition(Common::Point(270, 24));
+ }
+
+ _object3.postInit();
+ _object3.setVisage(335);
+ _object3.setStrip(4);
+ _object3.setPosition(Common::Point(202, 122));
+
+ _object4.postInit();
+ _object4.setVisage(335);
+ _object4.setStrip(2);
+ _object4.setPosition(Common::Point(283, 102));
+
+ _object5.postInit();
+ _object5.setVisage(335);
+ _object5.setStrip(1);
+ _object5.setPosition(Common::Point(135, 167));
+
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 560, -1, -1, -1, 1, NULL);
+ BF_GLOBALS._player.disableControl();
+
+ _sceneMode = (BF_GLOBALS._dayNumber == 1) ? 3250 : 3251;
+ setAction(&_sequenceManager, this, _sceneMode, &_object3, &_object4, &_object5, NULL);
+}
+
+void Scene325::signal() {
+ BF_GLOBALS._player._uiEnabled = 0;
+ BF_GLOBALS._player._canWalk = true;
+ BF_GLOBALS._player._enabled = true;
+ BF_GLOBALS._events.setCursor(CURSOR_EXIT);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 330 - Approaching Marina
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene330::Timer1::signal() {
+ PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(240, 254, 1);
+ rotation->setDelay(25);
+ remove();
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene330::Scene330() {
+ _seqNumber = 0;
+}
+
+void Scene330::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_seqNumber);
+}
+
+void Scene330::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ BF_GLOBALS._sound1.changeSound(35);
+ _sound1.fadeSound(35);
+
+ loadScene(850);
+ _timer.set(2, NULL);
+
+ if (BF_GLOBALS._dayNumber >= 4) {
+ _object2.postInit();
+ _object2.setVisage(851);
+ _object2.setPosition(Common::Point(120, 112));
+ }
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 850 : 852);
+ BF_GLOBALS._player.setStrip(2);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.hide();
+ if (BF_GLOBALS.getFlag(fWithLyle))
+ BF_GLOBALS._player.setStrip(5);
+
+ if ((BF_GLOBALS._dayNumber == 1) && BF_GLOBALS.getFlag(fBackupArrived340)) {
+ _object1.postInit();
+ _object1.setVisage(850);
+ _object1.setStrip(6);
+ _object1.setFrame(1);
+ _object1.setPosition(Common::Point(47, 169));
+ _object1.animate(ANIM_MODE_2);
+ }
+
+ if (BF_GLOBALS._sceneManager._previousScene == 50) {
+ // Coming from map
+ if ((BF_GLOBALS._driveFromScene == 340) || (BF_GLOBALS._driveFromScene == 342) ||
+ (BF_GLOBALS._driveFromScene == 330)) {
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _seqNumber = 3304;
+ } else {
+ _seqNumber = 3302;
+ _sound2.play(123);
+ BF_GLOBALS.setFlag(onBike);
+ }
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _seqNumber = 3303;
+ } else {
+ _sound2.play(123);
+ _seqNumber = 3301;
+
+ if ((BF_GLOBALS._dayNumber == 1) && (BF_GLOBALS._bookmark >= bStartOfGame) &&
+ (BF_GLOBALS._bookmark < bCalledToDomesticViolence)) {
+ BF_GLOBALS._player.animate(ANIM_MODE_2);
+ }
+ }
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _seqNumber = 3303;
+ } else {
+ _seqNumber = 3301;
+ _sound2.play(123);
+
+ if ((BF_GLOBALS._dayNumber == 1) && (BF_GLOBALS._bookmark >= bStartOfGame) &&
+ (BF_GLOBALS._bookmark < bCalledToDomesticViolence)) {
+ BF_GLOBALS._player.animate(ANIM_MODE_2);
+ }
+ }
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, _seqNumber, &BF_GLOBALS._player, NULL);
+}
+
+void Scene330::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+void Scene330::signal() {
+ if ((BF_GLOBALS._driveFromScene == 330) || (BF_GLOBALS._driveFromScene == 340) ||
+ (BF_GLOBALS._driveFromScene == 342)) {
+ // Leaving marina
+ if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) ||
+ (BF_GLOBALS._bookmark >= bCalledToDomesticViolence))
+ // Leave scene normally
+ BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._driveToScene);
+ else {
+ // Player leaves with domestic violence unresolved
+ BF_GLOBALS._player.hide();
+ BF_GLOBALS._deathReason = 4;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ }
+ } else {
+ // Arriving at marina
+ BF_GLOBALS.clearFlag(onBike);
+
+ if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) ||
+ (BF_GLOBALS._bookmark >= bCalledToDomesticViolence))
+ BF_GLOBALS._sceneManager.changeScene(342);
+ else
+ BF_GLOBALS._sceneManager.changeScene(340);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 340 - Marina, Domestic Disturbance
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene340::Child::startAction(CursorType action, Event &event) {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(340, 5);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(340, 14);
+ return true;
+ case CURSOR_TALK:
+ if (!BF_GLOBALS.getFlag(fBackupArrived340) || (BF_GLOBALS._marinaWomanCtr < 3) || !BF_GLOBALS.getFlag(fGotAllSkip340))
+ scene->setAction(&scene->_action3);
+ else
+ scene->setAction(&scene->_action2);
+ return true;
+ case INV_COLT45:
+ scene->gunDisplay();
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene340::Woman::startAction(CursorType action, Event &event) {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(340, 4);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(340, 13);
+ return true;
+ case CURSOR_TALK:
+ if (!BF_GLOBALS.getFlag(fBackupArrived340) || (BF_GLOBALS._marinaWomanCtr < 3) || !BF_GLOBALS.getFlag(fGotAllSkip340))
+ scene->setAction(&scene->_action1);
+ else
+ scene->setAction(&scene->_action2);
+ return true;
+ case INV_COLT45:
+ scene->gunDisplay();
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene340::Harrison::startAction(CursorType action, Event &event) {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(340, 6);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(340, 15);
+ return true;
+ case CURSOR_TALK:
+ scene->setAction(&scene->_action5);
+ return true;
+ case INV_COLT45:
+ scene->gunDisplay();
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene340::Item1::startAction(CursorType action, Event &event) {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == INV_COLT45) {
+ scene->gunDisplay();
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene340::WestExit::startAction(CursorType action, Event &event) {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ if (BF_GLOBALS.getFlag(fBackupArrived340)) {
+ scene->setAction(&scene->_action6);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4;
+ setAction(&scene->_sequenceManager1, scene, 1348, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+}
+
+bool Scene340::SouthWestExit::startAction(CursorType action, Event &event) {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3;
+ setAction(&scene->_sequenceManager1, scene, 1340, &BF_GLOBALS._player, NULL);
+ return true;
+}
+
+bool Scene340::NorthExit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 254, 106);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene340::Action1::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ BF_GLOBALS._player.disableControl();
+ ADD_PLAYER_MOVER(64, 155);
+ break;
+ }
+ case 1:
+ BF_GLOBALS._player.changeAngle(45);
+ setDelay(3);
+ break;
+ case 2:
+ if (!BF_GLOBALS._marinaWomanCtr) {
+ setAction(&scene->_action8, this);
+ } else if (!_action) {
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this,
+ MIN(BF_GLOBALS._marinaWomanCtr, 3) + 2340, &scene->_woman, &scene->_child,
+ &scene->_object4, NULL);
+ }
+ break;
+ case 3:
+ if ((BF_GLOBALS._marinaWomanCtr != 1) || BF_GLOBALS.getFlag(fCalledBackup)) {
+ setDelay(3);
+ } else {
+ scene->_sound1.play(8);
+ scene->_stripManager.start(3413, this);
+ }
+ break;
+ case 4:
+ if (BF_GLOBALS._marinaWomanCtr == 1)
+ ++BF_GLOBALS._marinaWomanCtr;
+
+ if (BF_GLOBALS.getFlag(fBackupArrived340)) {
+ scene->_field2654 = 1;
+ scene->_harrison.setPosition(Common::Point(46, 154));
+ BF_GLOBALS._walkRegions.proc1(19);
+ } else if (BF_GLOBALS.getFlag(fCalledBackup)) {
+ scene->_timer1.set(40, &scene->_harrison, &scene->_action4);
+ }
+
+ ++BF_GLOBALS._marinaWomanCtr;
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene340::Action2::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ ADD_PLAYER_MOVER(64, 155);
+ break;
+ }
+ case 1:
+ BF_GLOBALS._player.changeAngle(45);
+ setDelay(3);
+ break;
+ case 2:
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager3, this, 1341, &scene->_woman, &scene->_child, NULL);
+ break;
+ case 3:
+ scene->_woman.remove();
+ scene->_child.remove();
+ BF_GLOBALS.setFlag(fToldToLeave340);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene340::Action3::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ ADD_PLAYER_MOVER(64, 155);
+ break;
+ }
+ case 1:
+ BF_GLOBALS._player.changeAngle(45);
+ setDelay(3);
+ break;
+ case 2:
+ scene->_stripManager.start(scene->_field2652 + 3404, this);
+ break;
+ case 3:
+ if (++scene->_field2652 > 2) {
+ if (!BF_GLOBALS.getFlag(fGotAllSkip340))
+ BF_GLOBALS.setFlag(fGotAllSkip340);
+ scene->_field2652 = 0;
+ }
+
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene340::Action4::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (!_action) {
+ BF_GLOBALS._player.disableControl();
+ setDelay(3);
+ } else {
+ scene->_timer1.set(30, &scene->_harrison, &scene->_action4);
+ remove();
+ }
+ break;
+ case 1:
+ BF_GLOBALS.setFlag(fBackupArrived340);
+ scene->_field2654 = 1;
+ setDelay(3);
+ break;
+ case 2:
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager3, this, 1347, &scene->_harrison, NULL);
+ break;
+ case 3:
+ BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene340::Action5::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ if (scene->_field2654) {
+ ADD_PLAYER_MOVER(64, 155);
+ } else {
+ BF_GLOBALS._player.changeAngle(45);
+ setDelay(3);
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(scene->_harrison._position);
+ setDelay(3);
+ break;
+ case 2:
+ setDelay(15);
+ break;
+ case 3:
+ if (BF_GLOBALS.getFlag(fBriefedBackup))
+ scene->_stripManager.start(3416, this);
+ else {
+ BF_GLOBALS.setFlag(fBriefedBackup);
+ scene->_stripManager.start(3407, this);
+ }
+ break;
+ case 4:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene340::Action6::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ ADD_PLAYER_MOVER(10, 110);
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(scene->_harrison._position);
+ scene->_harrison.updateAngle(BF_GLOBALS._player._position);
+ scene->_stripManager.start(3415, this);
+ break;
+ case 2: {
+ ADD_MOVER(BF_GLOBALS._player, -8, 110);
+ break;
+ }
+ case 3:
+ scene->_sceneMode = 4;
+ scene->signal();
+ remove();
+ break;
+ }
+}
+
+void Scene340::Action7::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ ADD_PLAYER_MOVER(254, 121);
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(scene->_harrison._position);
+ scene->_stripManager.start(BF_GLOBALS.getFlag(fBriefedBackup) ? 3414 : 3417, this);
+ break;
+ case 2:
+ BF_GLOBALS.setFlag(fBackupIn350);
+ BF_GLOBALS._sceneManager.changeScene(350);
+ break;
+ }
+}
+
+void Scene340::Action8::signal() {
+ Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_stripManager.start(3400, this);
+ break;
+ case 1:
+ setDelay(2);
+ break;
+ case 2:
+ scene->_object4.setPriority(250);
+ scene->_object4.setPosition(Common::Point(138, 130));
+ scene->_object4.setVisage(347);
+ scene->_object4.setStrip(6);
+ scene->_object4.setFrame(1);
+ scene->_object4._numFrames = 2;
+ scene->_object4.animate(ANIM_MODE_5, NULL);
+ scene->_object4.show();
+ break;
+ case 3:
+ scene->_object4.hide();
+
+ scene->_woman.setPriority(123);
+ scene->_woman.setPosition(Common::Point(88, 143));
+ scene->_woman.setVisage(344);
+ scene->_woman.setStrip(2);
+ scene->_woman.setFrame(1);
+ scene->_woman.changeZoom(100);
+ scene->_woman._numFrames = 10;
+ scene->_woman._moveRate = 10;
+ scene->_woman._moveDiff = Common::Point(3, 2);
+ scene->_woman.show();
+
+ scene->_child.setPriority(120);
+ scene->_child.setPosition(Common::Point(81, 143));
+ scene->_child.setVisage(347);
+ scene->_child.setStrip(3);
+ scene->_child.setFrame(1);
+ scene->_child.changeZoom(100);
+ scene->_child._numFrames = 10;
+ scene->_child._moveRate = 10;
+ scene->_child.show();
+
+ setDelay(6);
+ break;
+ case 4:
+ remove();
+ break;
+ }
+}
+
+void Scene340::Action8::process(Event &event) {
+ if ((_actionIndex != 3) || (event.eventType == EVENT_NONE))
+ Action::process(event);
+ else if (event.eventType == EVENT_BUTTON_DOWN) {
+ event.handled = true;
+ setDelay(2);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene340::Timer2::signal() {
+ PaletteRotation *item;
+
+ item = BF_GLOBALS._scenePalette.addRotation(235, 239, 1);
+ item->setDelay(30);
+ item = BF_GLOBALS._scenePalette.addRotation(247, 249, 1);
+ item->setDelay(30);
+ item = BF_GLOBALS._scenePalette.addRotation(240, 246, 1);
+ item->setDelay(30);
+ item = BF_GLOBALS._scenePalette.addRotation(252, 254, 1);
+ item->setDelay(30);
+
+ remove();
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene340::Scene340(): PalettedScene() {
+ _seqNumber1 = _field2652 = _field2654 = 0;
+}
+
+void Scene340::synchronize(Serializer &s) {
+ PalettedScene::synchronize(s);
+
+ s.syncAsSint16LE(_seqNumber1);
+ s.syncAsSint16LE(_field2652);
+ s.syncAsSint16LE(_field2654);
+}
+
+void Scene340::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ loadScene(340);
+ setZoomPercents(126, 70, 162, 100);
+
+ BF_GLOBALS._walkRegions.proc1(13);
+ BF_GLOBALS._walkRegions.proc1(15);
+ _timer2.set(2, NULL);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+
+ _field2652 = 0;
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ _westExit.setDetails(Rect(0, 76, 19, 115), 340, -1, -1, -1, 1, NULL);
+ _swExit.setDetails(15, 340, -1, -1, -1, 1);
+ _northExit.setDetails(16, 340, -1, -1, -1, 1);
+
+ BF_GLOBALS._player._regionBitList = 0x10000;
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129);
+ BF_GLOBALS._player._moveDiff = Common::Point(5, 2);
+
+ if (BF_GLOBALS._dayNumber < 5) {
+ _object5.postInit();
+ _object5.setVisage(340);
+ _object5.setStrip(4);
+ _object5.setPosition(Common::Point(259, 61));
+ }
+
+ if (!BF_GLOBALS.getFlag(fToldToLeave340)) {
+ _woman.postInit();
+ _woman.setVisage(344);
+ _woman.setStrip(3);
+ _woman.setFrame(1);
+ _woman.fixPriority(123);
+ _woman.setPosition(Common::Point(88, 143));
+
+ _object4.postInit();
+ _object4.hide();
+
+ _child.postInit();
+ _child.setVisage(347);
+ _child.setStrip(3);
+ _child.setFrame(1);
+ _child.fixPriority(120);
+ _child.setPosition(Common::Point(81, 143));
+
+ _woman.setAction(&_sequenceManager2, NULL, 348, &_woman, &_child, &_object4, NULL);
+ BF_GLOBALS._sceneItems.addItems(&_child, &_woman, NULL);
+
+ _stripManager.addSpeaker(&_jordanSpeaker);
+ _stripManager.addSpeaker(&_skipBSpeaker);
+
+ BF_GLOBALS.set2Flags(f1097Marina);
+ }
+
+ if (BF_GLOBALS.getFlag(fCalledBackup)) {
+ _harrison.postInit();
+ _harrison.setVisage(326);
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+ _harrison.animate(ANIM_MODE_1, NULL);
+ _harrison.setPosition(Common::Point(-60, 219));
+ BF_GLOBALS._sceneItems.push_back(&_harrison);
+
+ _stripManager.addSpeaker(&_harrisonSpeaker);
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ _field2654 = 0;
+ _harrison.setVisage(1355);
+ _harrison.setPosition(Common::Point(289, 112));
+ _harrison.changeAngle(225);
+ _harrison.setFrame(1);
+ _harrison.fixPriority(75);
+
+ BF_GLOBALS._walkRegions.proc1(23);
+ } else if (BF_GLOBALS.getFlag(fBackupArrived340)) {
+ _field2654 = 1;
+ _harrison.setPosition(Common::Point(46, 154));
+ BF_GLOBALS._walkRegions.proc1(19);
+ } else if (BF_GLOBALS.getFlag(fCalledBackup) && (BF_GLOBALS._marinaWomanCtr > 0)) {
+ _timer1.set(900, &_harrison, &_action4);
+ }
+ }
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 350:
+ _seqNumber1 = 1342;
+ break;
+ case 830:
+ BF_GLOBALS._player._regionBitList |= 0x800;
+ _seqNumber1 = 1343;
+ break;
+ case 60:
+ _seqNumber1 = 342;
+ break;
+ default:
+ _sound1.fadeSound(35);
+ BF_GLOBALS._sound1.fadeSound((BF_GLOBALS._bookmark < bStartOfGame) ||
+ (BF_GLOBALS._bookmark > bCalledToDomesticViolence) ? 10 : 19);
+ _seqNumber1 = 342;
+ break;
+ }
+
+ _item3.setDetails(7, 340, 3, 9, 12, 1);
+ _item2.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, 39), 340, 2, 8, 11, 1, NULL);
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 340, 1, 7, 10, 1, NULL);
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, _seqNumber1, &BF_GLOBALS._player, NULL);
+}
+
+void Scene340::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ PalettedScene::remove();
+}
+
+void Scene340::signal() {
+ switch (_sceneMode) {
+ case 1:
+ case 2:
+ BF_GLOBALS._sceneManager.changeScene(350);
+ break;
+ case 3:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 4:
+ BF_GLOBALS._sceneManager.changeScene(830);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene340::process(Event &event) {
+ // Check for gun being clicked on player
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
+ BF_GLOBALS._player.contains(event.mousePos)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ SceneItem::display2(350, 26);
+
+ signal();
+ event.handled = true;
+ }
+
+ if (!event.handled) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_westExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if (_swExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if (_northExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+ }
+}
+
+void Scene340::dispatch() {
+ SceneExt::dispatch();
+ int idx = BF_GLOBALS._player.getRegionIndex();
+
+ if (idx == 20) {
+ BF_GLOBALS._player.updateZoom();
+ BF_GLOBALS._player.fixPriority(75);
+ }
+ if (idx == 26) {
+ BF_GLOBALS._player.updateZoom();
+ }
+ if (idx == 31) {
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.fixPriority(-1);
+ }
+
+ if (BF_GLOBALS._player._regionIndex == 16) {
+ BF_GLOBALS._player._regionBitList &= ~0x10000;
+
+ if (!BF_GLOBALS.getFlag(fBackupArrived340)) {
+ _sceneMode = 1;
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 254, 110);
+ } else if (!BF_GLOBALS.getFlag(fBackupIn350)) {
+ setAction(&_action7);
+ } else {
+ _sceneMode = 1;
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 254, 110);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 342 - Marina, Normal
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene342::Lyle::startAction(CursorType action, Event &event) {
+ Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(340, 16);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(340, 15);
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(340, 17);
+ return true;
+ case INV_COLT45:
+ scene->gunDisplay();
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene342::Item1::startAction(CursorType action, Event &event) {
+ Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case INV_COLT45:
+ scene->gunDisplay();
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene342::WestExit::startAction(CursorType action, Event &event) {
+ Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4;
+ setAction(&scene->_sequenceManager1, scene, 1348, &BF_GLOBALS._player, NULL);
+ return true;
+}
+
+bool Scene342::SouthWestExit::startAction(CursorType action, Event &event) {
+ Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3;
+ setAction(&scene->_sequenceManager1, scene, 1340, &BF_GLOBALS._player, NULL);
+ return true;
+}
+
+bool Scene342::NorthExit::startAction(CursorType action, Event &event) {
+ Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene;
+
+ scene->_sceneMode = 1;
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 254, 106);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene342::Timer1::signal() {
+ PaletteRotation *item;
+
+ item = BF_GLOBALS._scenePalette.addRotation(235, 239, 1);
+ item->setDelay(30);
+ item = BF_GLOBALS._scenePalette.addRotation(247, 249, 1);
+ item->setDelay(30);
+ item = BF_GLOBALS._scenePalette.addRotation(240, 246, 1);
+ item->setDelay(30);
+ item = BF_GLOBALS._scenePalette.addRotation(252, 254, 1);
+ item->setDelay(30);
+
+ remove();
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene342::Scene342(): PalettedScene() {
+ _field1A1A = 0;
+}
+
+void Scene342::synchronize(Serializer &s) {
+ PalettedScene::synchronize(s);
+
+ s.syncAsSint16LE(_field1A1A);
+}
+
+void Scene342::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ loadScene(340);
+ setZoomPercents(126, 70, 162, 100);
+
+ BF_GLOBALS._walkRegions.proc1(13);
+ BF_GLOBALS._walkRegions.proc1(15);
+
+ _field1A1A = 0;
+ _timer1.set(2, NULL);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ _westExit.setDetails(Rect(0, 76, 19, 115), 340, -1, -1, -1, 1, NULL);
+ _swExit.setDetails(15, 340, -1, -1, -1, 1);
+ _northExit.setDetails(16, 340, -1, -1, -1, 1);
+
+ if (BF_GLOBALS._dayNumber < 5) {
+ _object3.postInit();
+ _object3.setVisage(340);
+ _object3.setStrip(4);
+ _object3.setPosition(Common::Point(259, 61));
+ }
+
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._player.setVisage(1341);
+ BF_GLOBALS._player._moveDiff = Common::Point(5, 2);
+ } else {
+ BF_GLOBALS._player.setVisage(129);
+ BF_GLOBALS._player._moveDiff = Common::Point(5, 2);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle.setVisage(469);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.hide();
+ }
+ }
+
+ switch (BF_GLOBALS._randomSource.getRandomNumber(2)) {
+ case 0:
+ _object2.setPosition(Common::Point(46, 59));
+ ADD_MOVER_NULL(_object2, 300, -10);
+ break;
+ case 1:
+ _object2.setPosition(Common::Point(311, 57));
+ ADD_MOVER_NULL(_object2, 140, -10);
+ break;
+ case 2:
+ _object2.setPosition(Common::Point(-5, 53));
+ ADD_MOVER_NULL(_object2, 170, -10);
+ break;
+ default:
+ break;
+ }
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 50:
+ case 60:
+ case 330:
+ if (BF_GLOBALS._sceneManager._previousScene != 60) {
+ _sound1.fadeSound(35);
+ BF_GLOBALS._sound1.fadeSound((BF_GLOBALS._bookmark < bStartOfGame) ||
+ (BF_GLOBALS._bookmark > bCalledToDomesticViolence) ? 10 : 19);
+ }
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+
+ setAction(&_sequenceManager1, this, 346, &_lyle, NULL);
+ BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 342, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 342, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 350:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 1342, &BF_GLOBALS._player, NULL);
+ break;
+ default:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 1343, &BF_GLOBALS._player, NULL);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.setPosition(Common::Point(-21, 118));
+ _lyle.setStrip(5);
+ _lyle.setFrame(1);
+ _lyle.setPriority(75);
+ _lyle.setZoom(75);
+ _lyle.setAction(&_sequenceManager2, NULL, 347, &_lyle, NULL);
+ BF_GLOBALS._sceneItems.push_back(&_lyle);
+ }
+ break;
+ }
+
+ _item3.setDetails(7, 340, 3, 9, 12, 1);
+ _item2.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, 39), 340, 2, 8, 11, 1, NULL);
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 340, 1, 7, 10, 1, NULL);
+}
+
+void Scene342::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ PalettedScene::remove();
+}
+
+void Scene342::signal() {
+ switch (_sceneMode) {
+ case 1:
+ ADD_PLAYER_MOVER(254, 106);
+ BF_GLOBALS._sceneManager.changeScene(350);
+ break;
+ case 3:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 4:
+ BF_GLOBALS._sceneManager.changeScene(830);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene342::process(Event &event) {
+ // Check for gun being clicked on player
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
+ BF_GLOBALS._player.contains(event.mousePos)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ SceneItem::display2(350, 26);
+
+ signal();
+ event.handled = true;
+ }
+
+ if (!event.handled) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_westExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if (_swExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if (_northExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+ }
+}
+
+void Scene342::dispatch() {
+ SceneExt::dispatch();
+ int idx = BF_GLOBALS._player.getRegionIndex();
+
+ if (idx == 20) {
+ BF_GLOBALS._player.updateZoom();
+ BF_GLOBALS._player.fixPriority(75);
+ }
+ if (idx == 26) {
+ BF_GLOBALS._player.updateZoom();
+ }
+ if (idx == 31) {
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.fixPriority(-1);
+ }
+
+ if (idx == 16) {
+ BF_GLOBALS._player.enableControl();
+ ADD_PLAYER_MOVER(254, 110);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 350 - Marina, Outside Boat
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene350::FireBox::startAction(CursorType action, Event &event) {
+ Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(350, 20);
+ return true;
+ case CURSOR_USE: {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3;
+
+ Common::Point pt(76, 154);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+ return true;
+ }
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+void Scene350::Yacht::synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+ s.syncAsSint16LE(_flag);
+}
+
+bool Scene350::Yacht::startAction(CursorType action, Event &event) {
+ Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if ((BF_GLOBALS._dayNumber != 1) || !BF_GLOBALS.getFlag(onDuty) || (BF_GLOBALS._bookmark < bStartOfGame)) {
+ if ((BF_GLOBALS._dayNumber == 1) || (BF_GLOBALS._dayNumber == 4)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager1, scene, 3512, &BF_GLOBALS._player, &scene->_yachtDoor, NULL);
+ return true;
+ }
+ } else {
+ _flag = true;
+ scene->_sceneMode = 1;
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(gunDrawn) ? 3504 : 3505,
+ &BF_GLOBALS._player, &scene->_yachtDoor, NULL);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene350::SouthWestExit::startAction(CursorType action, Event &event) {
+ BF_GLOBALS._player.disableControl();
+
+ Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene;
+ scene->_sceneMode = 2;
+
+ if (BF_GLOBALS.getFlag(fBackupIn350))
+ scene->setAction(&scene->_sequenceManager1, scene, 3507, &BF_GLOBALS._player, &scene->_harrison, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 3510, &BF_GLOBALS._player, NULL);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene350::Hook::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(350, 30);
+ return true;
+ case CURSOR_USE:
+ BF_INVENTORY.setObjectScene(INV_HOOK, 1);
+ if (!BF_GLOBALS.getFlag(hookPoints)) {
+ BF_GLOBALS.setFlag(hookPoints);
+ T2_GLOBALS._uiElements.addScore(30);
+ }
+ remove();
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene350::FireboxInset::startAction(CursorType action, Event &event) {
+ Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(350, BF_INVENTORY.getObjectScene(INV_HOOK) ? 29 : 28);
+ return true;
+ case CURSOR_USE:
+ scene->_fireBoxInset.remove();
+ return true;
+ case INV_HOOK:
+ BF_INVENTORY.setObjectScene(INV_HOOK, 350);
+
+ scene->_hook.postInit();
+ scene->_hook.setVisage(350);
+ scene->_hook.setStrip(5);
+ scene->_hook.fixPriority(201);
+ scene->_hook.setPosition(Common::Point(106, 146));
+ BF_GLOBALS._sceneItems.push_front(&scene->_hook);
+ return true;
+ default:
+ return FocusObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene350::Timer1::signal() {
+ PaletteRotation *rot;
+ rot = BF_GLOBALS._scenePalette.addRotation(233, 235, 1);
+ rot->setDelay(40);
+ rot = BF_GLOBALS._scenePalette.addRotation(236, 238, 1);
+ rot->setDelay(20);
+ rot = BF_GLOBALS._scenePalette.addRotation(239, 241, 1);
+ rot->setDelay(20);
+ rot = BF_GLOBALS._scenePalette.addRotation(242, 244, 1);
+ rot->setDelay(12);
+
+ remove();
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene350::Scene350(): SceneExt() {
+ _field1D44 = _field1D46 = 0;
+}
+
+void Scene350::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(350);
+ setZoomPercents(90, 80, 143, 100);
+ _sound1.fadeSound(35);
+ _timer1.set(2, NULL);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 352 : 1358);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.setPosition(Common::Point(99, 152));
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
+
+ _yacht._flag = false;
+ _swExit.setDetails(Rect(0, 160, SCREEN_WIDTH, UI_INTERFACE_Y - 1), 350, -1, -1, -1, 1, NULL);
+
+ if ((BF_GLOBALS._dayNumber != 1) && (BF_GLOBALS._dayNumber != 4)) {
+ _yacht.setDetails(28, 350, 15, 16, 17, 1);
+ } else {
+ _yachtDoor.postInit();
+ _yachtDoor.setVisage(350);
+ _yachtDoor.setStrip(3);
+ _yachtDoor.setFrame(1);
+ _yachtDoor.fixPriority(72);
+ _yachtDoor.setPosition(Common::Point(40, 74));
+
+ _yachtBody.setup(350, 1, 1, 129, 142, 255);
+
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ _harrison.postInit();
+ _harrison.setVisage(1355);
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+ _harrison.animate(ANIM_MODE_1, NULL);
+ _harrison.changeZoom(-1);
+ _harrison.setDetails(350, 12, 13, 14, 1, NULL);
+ _harrison._moveDiff = Common::Point(2, 1);
+
+ _stripManager.addSpeaker(&_harrisonSpeaker);
+ }
+
+ if (BF_GLOBALS._bookmark < bStartOfGame) {
+ // Setup scene in debug mode
+ _yacht.setDetails(28, 350, 6, 18, 19, 1);
+ } else {
+ _yacht.setDetails(28, 350, 6, BF_GLOBALS.getFlag(bStartOfGame) ? 7 : 18, 8, 1);
+ }
+ }
+
+ _fireBox._sceneRegionId = 5;
+ BF_GLOBALS._sceneItems.push_back(&_fireBox);
+ _item4.setDetails(15, 350, 0, 1, 2, 1);
+ BF_GLOBALS._sceneItems.push_back(&_yacht);
+
+ _item3.setDetails(7, 350, 23, 24, 25, 1);
+ _item2.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, 31), 350, 3, 4, 5, 1, NULL);
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 350, 0, 1, 2, 1, NULL);
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 370:
+ BF_GLOBALS._player.enableControl();
+ T2_GLOBALS._uiElements._active = true;
+ T2_GLOBALS._uiElements.show();
+ // Deliberate fall-through
+ case 355:
+ if (BF_GLOBALS.getFlag(onDuty) && BF_GLOBALS.getFlag(gunDrawn))
+ BF_GLOBALS._player.setVisage(351);
+
+ BF_GLOBALS._player.setPosition(Common::Point(22, 91));
+ BF_GLOBALS._player.changeAngle(225);
+ break;
+ default:
+ BF_GLOBALS.clearFlag(gunDrawn);
+
+ if ((BF_GLOBALS._dayNumber == 1) && (BF_GLOBALS._bookmark < bCalledToDomesticViolence) &&
+ BF_GLOBALS.getFlag(fBackupIn350)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 3509, &_harrison, NULL);
+ BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 3508, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 3508, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ }
+}
+
+void Scene350::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+void Scene350::signal() {
+ switch (_sceneMode) {
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(355);
+ break;
+ case 2:
+ BF_GLOBALS._sceneManager.changeScene((BF_GLOBALS._dayNumber != 1) ||
+ (BF_GLOBALS._bookmark < bStartOfGame) || (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) ? 342 : 340);
+ break;
+ case 3:
+ BF_GLOBALS._player.setStrip(8);
+
+ _fireBoxInset.postInit();
+ _fireBoxInset.setVisage(350);
+ _fireBoxInset.setStrip(4);
+ _fireBoxInset.fixPriority(200);
+ _fireBoxInset.setPosition(Common::Point(85, 166));
+ BF_GLOBALS._sceneItems.push_front(&_fireBoxInset);
+
+ if (BF_INVENTORY.getObjectScene(INV_HOOK) == 350) {
+ _hook.postInit();
+ _hook.setVisage(350);
+ _hook.setStrip(5);
+ _hook.fixPriority(201);
+ _hook.setPosition(Common::Point(106, 146));
+ BF_GLOBALS._sceneItems.push_front(&_hook);
+ }
+
+ BF_GLOBALS._player.enableControl();
+ _sound2.play(97);
+ break;
+ default:
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ _harrison.updateAngle(BF_GLOBALS._player._position);
+ BF_GLOBALS._walkRegions.proc1(19);
+ }
+
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene350::process(Event &event) {
+ // Check for gun being clicked on player
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
+ BF_GLOBALS._player.contains(event.mousePos)) {
+ BF_GLOBALS._player.disableControl();
+
+ if (!BF_GLOBALS.getFlag(onDuty)) {
+ // Player not on duty
+ SceneItem::display2(350, 26);
+ signal();
+ } else if (BF_GLOBALS.getFlag(gunDrawn)) {
+ // Holster the gun
+ BF_GLOBALS.clearFlag(gunDrawn);
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 3501, &BF_GLOBALS._player, NULL);
+
+ if (BF_GLOBALS.getFlag(fBackupIn350))
+ _harrison.setAction(&_sequenceManager3, NULL, 3503, &_harrison, NULL);
+ } else {
+ // Drawn the gun
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 3500, &BF_GLOBALS._player, NULL);
+
+ if (BF_GLOBALS.getFlag(fBackupIn350))
+ _harrison.setAction(&_sequenceManager3, NULL, 3502, &_harrison, NULL);
+
+ BF_GLOBALS.setFlag(gunDrawn);
+ }
+
+ event.handled = true;
+ }
+
+ if (!event.handled) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_swExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+ }
+}
+
+void Scene350::checkGun() {
+ if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) ||
+ (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) || BF_GLOBALS.getFlag(fRandomShot350)) {
+ SceneItem::display2(350, 27);
+ } else {
+ BF_GLOBALS.setFlag(fRandomShot350);
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 3511, &BF_GLOBALS._player, NULL);
+ } else {
+ _stripManager.start(3502, this);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 355 - Future Wave Exterior
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene355::Doorway::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_v1);
+ s.syncAsSint16LE(_v2);
+ s.syncAsSint16LE(_v3);
+}
+
+bool Scene355::Doorway::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 9);
+ return true;
+ case CURSOR_USE:
+ if (!scene->_modeFlag) {
+ scene->_sceneMode = 9984;
+ scene->signal();
+ } else {
+ scene->setMode(true, 9984);
+ }
+ return true;
+ case CURSOR_TALK:
+ if (BF_GLOBALS._dayNumber >= 5) {
+ switch (_v2) {
+ case 0:
+ ++_v2;
+ BF_GLOBALS._sound1.play(109);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+
+ BF_GLOBALS.setFlag(fTookTrailerAmmo);
+ scene->_stripManager.start(3575, scene);
+ scene->_lyle._flag = 1;
+ return true;
+ case 1:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(3573, scene);
+ return true;
+ default:
+ break;
+ }
+ } else if (!BF_GLOBALS.getFlag(greenTaken) && (BF_GLOBALS._dayNumber == 1)) {
+ scene->_sceneMode = 1357;
+ BF_GLOBALS._player.disableControl();
+ scene->_stripManager.start(3550, scene);
+ return true;
+ }
+ break;
+ case INV_WAVE_KEYS:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3562;
+ scene->setAction(&scene->_sequenceManager, scene, 3562, &BF_GLOBALS._player, NULL);
+ _v3 = !_v3 ? 1 : 0;
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene355::Locker::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 51);
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS._dayNumber < 5)
+ SceneItem::display2(355, 46);
+ else if (BF_INVENTORY.getObjectScene(INV_FLARE) != 355)
+ SceneItem::display2(355, 45);
+ else if (scene->_modeFlag)
+ scene->setMode(true, 9996);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9996;
+
+ if (scene->_nextSceneMode) {
+ scene->_nextSceneMode = 0;
+ scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL);
+ } else {
+ scene->signal();
+ }
+ }
+ return true;
+ case INV_SCREWDRIVER:
+ if (scene->_modeFlag)
+ scene->setMode(true, 9996);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9996;
+ if (!scene->_nextSceneMode)
+ scene->signal();
+ else {
+ scene->_nextSceneMode = 0;
+ scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL);
+ }
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene355::LockerInset::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_frame == 1)
+ SceneItem::display2(355, 46);
+ else
+ SceneItem::display2(355, BF_GLOBALS._sceneObjects->contains(&scene->_object5) ? 26 : 47);
+ return true;
+ case CURSOR_USE:
+ if (_frame == 1) {
+ SceneItem::display2(355, 23);
+ return true;
+ }
+ return true;
+ case INV_SCREWDRIVER:
+ scene->_sound2.play(104);
+ BF_INVENTORY.setObjectScene(INV_SCREWDRIVER, 999);
+ setFrame(2);
+
+ scene->_object9.postInit();
+ scene->_object9.setVisage(378);
+ scene->_object9.setPosition(Common::Point(83, 100));
+ scene->_object9.fixPriority(100);
+
+ scene->_object5.postInit();
+ scene->_object5.setVisage(2356);
+ scene->_object5.setStrip(3);
+ scene->_object5.setPosition(Common::Point(67, 85));
+ scene->_object5.fixPriority(255);
+ BF_GLOBALS._sceneItems.push_front(&scene->_object5);
+
+ SceneItem::display2(355, 27);
+ scene->_locker.setFrame(2);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene355::Object5::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 30);
+ return true;
+ case CURSOR_USE:
+ BF_INVENTORY.setObjectScene(INV_FLARE, 1);
+ T2_GLOBALS._uiElements.addScore(30);
+
+ scene->_object9.remove();
+ remove();
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene355::Green::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 34);
+ return true;
+ case CURSOR_USE:
+ if (scene->_modeFlag)
+ SceneItem::display2(355, 35);
+ else if (!_flag)
+ SceneItem::display2(355, 38);
+ else if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 1)
+ SceneItem::display2(355, 49);
+ else {
+ BF_GLOBALS._player._regionBitList |= 0x10;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9985;
+ scene->setAction(&scene->_sequenceManager, scene, 3557, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ case CURSOR_TALK:
+ scene->_sceneMode = 0;
+ if (BF_INVENTORY.getObjectScene(INV_GRENADES) != 355) {
+ scene->_stripManager.start(3584, scene);
+ } else if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) {
+ return false;
+ } else {
+ switch (BF_GLOBALS._greenDay5TalkCtr++) {
+ case 0:
+ scene->_stripManager.start(3565, scene);
+ break;
+ case 1:
+ scene->_stripManager.start(3567, scene);
+ break;
+ default:
+ scene->_stripManager.start(3571, scene);
+ break;
+ }
+ }
+ return true;
+
+ default:
+ if ((action < BF_LAST_INVENT) && scene->_modeFlag) {
+ SceneItem::display2(355, 35);
+ return true;
+ }
+
+ switch (action) {
+ case INV_COLT45:
+ if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355)
+ SceneItem::display2(355, 39);
+ else if (!BF_GLOBALS.getFlag(fGunLoaded))
+ SceneItem::display2(1, 1);
+ else if (!BF_GLOBALS.getFlag(gunDrawn))
+ SceneItem::display2(1, 0);
+ else {
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_lyle))
+ scene->_lyle.setAction(NULL);
+
+ BF_GLOBALS._player.disableControl();
+ scene->_green.setStrip(1);
+ scene->_green.setFrame(1);
+ scene->_sceneMode = 9981;
+ scene->signal();
+ }
+ return true;
+ case INV_HANDCUFFS:
+ if (BF_GLOBALS._greenDay5TalkCtr <= 1)
+ SceneItem::display2(355, 38);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9979;
+ scene->setAction(&scene->_sequenceManager, scene, 4551, &BF_GLOBALS._player, this, NULL);
+ BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 355);
+ T2_GLOBALS._uiElements.addScore(50);
+ _flag = 1;
+ BF_GLOBALS._bookmark = bInvestigateBoat;
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene355::Lyle::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_green)) {
+ scene->_stripManager.start((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355) ? 3578 : 3577, scene);
+ } else {
+ switch (_flag) {
+ case 0:
+ scene->_stripManager.start(3574, scene);
+ break;
+ case 1:
+ scene->_stripManager.start(3576, scene);
+ break;
+ case 2:
+ scene->_stripManager.start(3563, scene);
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene355::Object8::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 0);
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9999;
+ scene->_stripManager.start(3559, scene);
+ return true;
+ } else if (BF_GLOBALS._dayNumber < 5) {
+ SceneItem::display2(355, 52);
+ return true;
+ }
+ break;
+ case INV_COLT45:
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ scene->_sceneMode = 9997;
+ scene->_stripManager.start(3561, scene);
+ } else {
+ SceneItem::display2(1, 4);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene355::Item1::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 28);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(355, 37);
+ return true;
+ case INV_RENTAL_KEYS:
+ if (scene->_modeFlag) {
+ scene->_sceneMode = 9980;
+ scene->signal();
+ } else if (!scene->_nextSceneMode)
+ SceneItem::display2(355, 36);
+ else
+ scene->setMode(false, 9980);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene355::Item2::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9999;
+ scene->_stripManager.start(3559, scene);
+ } else {
+ if (scene->_action) {
+ scene->_sceneMode = 0;
+ scene->_action->remove();
+ }
+
+ BF_GLOBALS._sceneManager.changeScene(350);
+ }
+ return true;
+}
+
+bool Scene355::Item3::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 33);
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS._dayNumber < 5)
+ SceneItem::display2(355, 21);
+ else if (scene->_modeFlag)
+ scene->setMode(true, 9987);
+ else {
+ scene->_sceneMode = 9987;
+ scene->signal();
+ }
+ return true;
+ case INV_FLARE:
+ scene->_sound2.play(105);
+ _state = 3554;
+ break;
+ case INV_RAGS:
+ _state = 3559;
+ break;
+ case INV_JAR:
+ _state = 3558;
+ break;
+ default:
+ return SceneHotspotExt::startAction(action, event);
+ }
+
+ // Handling for inventory objects
+ BF_INVENTORY.setObjectScene(action, 0);
+ if (scene->_modeFlag)
+ scene->setMode(true, 9986);
+ else {
+ scene->_sceneMode = 9986;
+ scene->signal();
+ }
+
+ scene->_nextSceneMode = 0;
+ return true;
+}
+
+bool Scene355::Item4::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 31);
+ return true;
+ case CURSOR_USE:
+ if ((BF_GLOBALS._dayNumber < 5) || (BF_INVENTORY.getObjectScene(INV_GRENADES) != 355))
+ SceneItem::display2(355, 21);
+ else if (scene->_modeFlag)
+ scene->setMode(true, 9987);
+ else {
+ scene->_sceneMode = 9987;
+ scene->signal();
+ }
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+
+bool Scene355::Pouch::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 355) {
+ SceneItem::display2(355, 29);
+ return true;
+ }
+ break;
+ case CURSOR_USE:
+ if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 355) {
+ if (scene->_modeFlag) {
+ scene->_sceneMode = 9992;
+ scene->signal();
+ } else if (!scene->_nextSceneMode) {
+ scene->setMode(false, 9992);
+ } else {
+ scene->_sceneMode = 9977;
+ scene->_nextSceneMode = 0;
+ scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL);
+ }
+ } else {
+ SceneItem::display2(355, 45);
+ }
+ return true;
+ case INV_RENTAL_KEYS:
+ if (scene->_modeFlag) {
+ scene->_sceneMode = 9980;
+ scene->signal();
+ } else if (!scene->_nextSceneMode) {
+ scene->setMode(false, 9980);
+ } else {
+ SceneItem::display2(355, 36);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene355::Item11::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_WALK:
+ return (BF_GLOBALS._bookmark == bStartOfGame) || (BF_GLOBALS._bookmark == bCalledToDomesticViolence) ||
+ (BF_GLOBALS._bookmark == bArrestedGreen);
+ case CURSOR_LOOK:
+ SceneItem::display2(355, 7);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(355, 8);
+ return true;
+ case CURSOR_TALK:
+ if (BF_GLOBALS._dayNumber == 5) {
+ switch (scene->_doorway._v2) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ BF_GLOBALS.setFlag(fTookTrailerAmmo);
+ scene->_stripManager.start(3575, scene);
+ scene->_lyle._flag = 1;
+ scene->_doorway._v2 = 1;
+ break;
+ case 1:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(3573, scene);
+ break;
+ default:
+ return false;
+ }
+ } else {
+ if (!BF_GLOBALS.getFlag(onDuty))
+ return false;
+ scene->_sceneMode = 1357;
+ BF_GLOBALS._player.disableControl();
+ scene->_stripManager.start(3550, scene);
+ }
+ return true;
+ case INV_COLT45:
+ if (!BF_GLOBALS.getFlag(fBackupIn350) || !BF_GLOBALS.getFlag(gunDrawn) || !BF_GLOBALS.getFlag(fGunLoaded))
+ SceneItem::display2(1, 4);
+ else {
+ scene->_sceneMode = 9997;
+ BF_GLOBALS._player.disableControl();
+ scene->_stripManager.start(3561, scene);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene355::RentalExit::startAction(CursorType action, Event &event) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ if (!BF_GLOBALS.getFlag(gunDrawn)) {
+ if (scene->_modeFlag)
+ scene->setMode(true, 0);
+ else if (!scene->_nextSceneMode)
+ scene->setMode(false, 0);
+ else {
+ scene->_nextSceneMode = 0;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9991;
+ scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL);
+ }
+ }
+
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene355::Action1::signal() {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3600 * (BF_GLOBALS._randomSource.getRandomNumber(1) + 1));
+ break;
+ case 1:
+ _actionIndex = 0;
+ scene->_lyle.animate(ANIM_MODE_8, 1, this);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene355::Action2::signal() {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_stripManager.start((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) ? 3566 : 3568, this);
+ break;
+ case 2:
+ scene->_sceneMode = 9979;
+ scene->signal();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene355::Scene355(): PalettedScene() {
+ _nextSceneMode = 0;
+ _modeFlag = false;
+}
+
+void Scene355::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_nextSceneMode);
+ s.syncAsSint16LE(_modeFlag);
+}
+
+void Scene355::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 5;
+
+ if (BF_GLOBALS._dayNumber == 5) {
+ loadScene(356);
+ BF_GLOBALS._player._regionBitList &= ~0x10;
+ } else {
+ loadScene(355);
+ }
+
+ _sound1.fadeSound(35);
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+ _stripManager.addSpeaker(&_harrisonSpeaker);
+ _stripManager.addSpeaker(&_greenSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ if (!BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._player.setVisage(368);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ } else if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS._player.setVisage(356);
+ BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount());
+ } else {
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setVisage(356);
+ BF_GLOBALS._player.setStrip(7);
+ }
+
+ if (BF_GLOBALS.getFlag(greenTaken)) {
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.setPosition(Common::Point(244, 140));
+ } else {
+ BF_GLOBALS._player.setPosition(Common::Point(244, 132));
+ }
+
+ BF_GLOBALS._player._moveDiff = Common::Point(6, 4);
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+
+ _item4._sceneRegionId = 17;
+ BF_GLOBALS._sceneItems.push_back(&_item4);
+
+ _locker.postInit();
+ _locker.setVisage(2356);
+ _locker.setPosition(Common::Point(88, 99));
+
+ if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 999) {
+ _locker.setFrame(2);
+
+ if (BF_INVENTORY.getObjectScene(INV_FLARE) == 355) {
+ _object9.postInit();
+ _object9.setVisage(378);
+ _object9.setPosition(Common::Point(83, 100));
+ _object9.fixPriority(100);
+ }
+ }
+ BF_GLOBALS._sceneItems.push_back(&_locker);
+
+ _doorway.postInit();
+ _doorway.setVisage(355);
+ _doorway.setPosition(Common::Point(193, 105));
+ _doorway.fixPriority(18);
+ _doorway._v1 = 0;
+ _doorway._v3 = 0;
+ BF_GLOBALS._sceneItems.push_back(&_doorway);
+
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ if (!BF_GLOBALS.getFlag(onDuty))
+ _doorway._v3 = 1;
+ else if (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 320)
+ _doorway._v3 = 1;
+ break;
+ case 2:
+ case 3:
+ case 4:
+ _doorway._v3 = 1;
+ break;
+ default:
+ break;
+ }
+
+ if (BF_GLOBALS._dayNumber == 5)
+ _doorway._v2 = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0;
+
+ _object8.postInit();
+ _object8.setVisage(355);
+ if (BF_GLOBALS._dayNumber == 5) {
+ _object8.setStrip(3);
+ _object8.setPosition(Common::Point(103, 148));
+ _object8.hide();
+ } else {
+ _object8.setStrip(2);
+ _object8.setPosition(Common::Point(142, 151));
+ _object8.fixPriority(247);
+ }
+
+ switch (BF_GLOBALS._dayNumber) {
+ case 2:
+ case 3:
+ case 4:
+ break;
+ case 5:
+ BF_GLOBALS._player.enableControl();
+ _modeFlag = true;
+ BF_GLOBALS._player.setPosition(Common::Point(133, 173));
+ BF_GLOBALS._player.fixPriority(249);
+ BF_GLOBALS._player.setStrip(7);
+
+ if (BF_GLOBALS._bookmark == bDoneAtLyles)
+ BF_GLOBALS._bookmark = bEndDayFour;
+
+ _pouch.setDetails(Rect(22, 136, 46, 146), 355, 43, -1, -1, 1, NULL);
+ _nextSceneMode = 0;
+
+ if (!BF_GLOBALS.getFlag(fLyleOnIsland)) {
+ _lyle.postInit();
+ _lyle.setVisage(847);
+ _lyle.setPosition(Common::Point(296, 97));
+ _lyle.setStrip(1);
+ _lyle.setAction(&_action1);
+ _lyle._flag = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0;
+ _lyle.setDetails(355, 40, 42, 41, 1, NULL);
+ }
+
+ if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) &&
+ (BF_INVENTORY.getObjectScene(INV_FLARE) == 0)) {
+ BF_GLOBALS._sound1.changeSound(103);
+
+ _object9.postInit();
+ _object9.setVisage(2357);
+ _object9.setStrip(2);
+ _object9.setPosition(Common::Point(231, 19));
+ _object9.animate(ANIM_MODE_2);
+
+ _object11.postInit();
+ _object11.setVisage(2357);
+ _object11.setStrip(6);
+ _object11.setPosition(Common::Point(183, 39));
+ _object11.animate(ANIM_MODE_2);
+
+ _doorway.setPosition(Common::Point(146, 107));
+ _doorway._v3 = 0;
+ _doorway._v2 = 2;
+ _lyle._flag = 2;
+
+ _green.postInit();
+ BF_GLOBALS._sceneItems.push_back(&_green);
+
+ if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) {
+ _green.setVisage(376);
+ _green.setStrip(1);
+ _green.setPosition(Common::Point(193, 88));
+ _green._flag = 0;
+ } else {
+ _green._flag = 1;
+
+ if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 1) {
+ _green.setVisage(373);
+ _green.setStrip(5);
+ _green.setPosition(Common::Point(238, 142));
+ } else {
+ _green.setVisage(375);
+ _green.setStrip(1);
+ _green.setFrame(_green.getFrameCount());
+ _green.setPosition(Common::Point(193, 147));
+ }
+ }
+
+ if ((BF_GLOBALS._bookmark == bFinishedWGreen) && BF_GLOBALS._sceneObjects->contains(&_lyle) &&
+ !BF_GLOBALS.getFlag(iWasAmbushed)) {
+ BF_GLOBALS.setFlag(iWasAmbushed);
+ BF_GLOBALS._player.disableControl();
+
+ _sceneMode = 0;
+ _stripManager.start(3582, this);
+ }
+ }
+ break;
+ default:
+ if (!BF_GLOBALS.getFlag(greenTaken)) {
+ _harrison.postInit();
+ _harrison.setPosition(Common::Point(152, 131));
+ _harrison.animate(ANIM_MODE_1, NULL);
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ _harrison.setVisage(357);
+ _harrison.setStrip(2);
+ } else {
+ _harrison.setVisage(1363);
+ _harrison.setStrip(3);
+ }
+
+ _harrison.hide();
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ _harrison.show();
+ BF_GLOBALS._sceneItems.push_back(&_harrison);
+ }
+
+ _sceneMode = 1355;
+ setAction(&_sequenceManager, this, 1355, NULL);
+ }
+ break;
+ }
+
+ _item3._sceneRegionId = 18;
+ _harrison.setDetails(355, 18, 20, 19, 1, NULL);
+ _item6.setDetails(10, 355, 2, -1, 14, 1);
+ _item7.setDetails(11, 355, 3, -1, 15, 1);
+ _item8.setDetails(12, 355, 4, -1, 8, 1);
+ _item9.setDetails(13, 355, 5, -1, -1, 1);
+ _item10.setDetails(15, 355, 10, -1, 11, 1);
+ _item1._sceneRegionId = 22;
+ BF_GLOBALS._sceneItems.addItems(&_item3, &_item6, &_item7, &_item8, &_item9, &_item10, &_item1, NULL);
+
+ if (BF_GLOBALS._dayNumber == 5) {
+ _rentalExit.setBounds(Rect(115, 101, 186, 154));
+ BF_GLOBALS._sceneItems.push_front(&_rentalExit);
+ } else {
+ _item2.setDetails(Rect(273, 53, 320, 101), 355, -1, -1, -1, 2, NULL);
+ }
+
+ _item11.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ BF_GLOBALS._sceneItems.push_back(&_item11);
+}
+
+void Scene355::signal() {
+ static uint32 black = 0;
+
+ switch (_sceneMode) {
+ case 12:
+ SceneItem::display2(355, 22);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 1355:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9999;
+ _stripManager.start(BF_GLOBALS.getFlag(fBackupIn350) ? 3559 : 3554, this);
+ break;
+ case 1356:
+ switch (_doorway._v1) {
+ case 0:
+ ++_doorway._v1;
+ _sceneMode = 9999;
+ _stripManager.start(3550, this);
+ break;
+ case 1:
+ _sceneMode = 9999;
+ _stripManager.start(3551, this);
+ ++_doorway._v1;
+ break;
+ default:
+ break;
+ }
+ break;
+ case 2357:
+ _harrison.animate(ANIM_MODE_1, NULL);
+ // Deliberate fall-through
+ case 1357:
+ BF_GLOBALS._player.enableControl();
+ if (BF_GLOBALS.getFlag(gunDrawn))
+ BF_GLOBALS._player._canWalk = false;
+ break;
+ case 1359:
+ BF_GLOBALS._sceneManager.changeScene(360);
+ break;
+ case 2358:
+ if (!BF_GLOBALS.getFlag(fBackupIn350))
+ BF_GLOBALS._sceneManager.changeScene(360);
+ else {
+ _sceneMode = 1359;
+ setAction(&_sequenceManager, this, BF_GLOBALS.getFlag(gunDrawn) ? 1359 : 3550, &_harrison, NULL);
+ }
+ break;
+ case 3553:
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ break;
+ case 3554:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9988;
+ setAction(&_sequenceManager, this, 3554, &BF_GLOBALS._player, NULL);
+ break;
+ case 3556:
+ if (BF_GLOBALS._player._angle == 45) {
+ _sceneMode = 4554;
+ signal();
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4554;
+ setAction(&_sequenceManager, this, 3556, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 3558:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9988;
+ setAction(&_sequenceManager, this, 3558, &BF_GLOBALS._player, NULL);
+ break;
+ case 3559:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9988;
+ setAction(&_sequenceManager, this, 3559, &BF_GLOBALS._player, NULL);
+ break;
+ case 3561:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1357;
+ setAction(&_sequenceManager, this, 3561, &BF_GLOBALS._player, NULL);
+ break;
+ case 3562:
+ if (!BF_GLOBALS.getFlag(unlockBoat)) {
+ BF_GLOBALS.setFlag(unlockBoat);
+ T2_GLOBALS._uiElements.addScore(10);
+ }
+
+ SceneItem::display2(355, !_doorway._v3 ? 24 : 25);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 4550:
+ T2_GLOBALS._uiElements.addScore(50);
+ _object10.remove();
+ BF_GLOBALS._sound1.play(90);
+ BF_GLOBALS._player._regionBitList |= 0x10;
+
+ _doorway._v3 = 0;
+ _doorway._v2 = 2;
+ _lyle._flag = 2;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 4552:
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 4554:
+ BF_GLOBALS._player.disableControl();
+ switch (_nextSceneMode) {
+ case 9980:
+ _sceneMode = 9980;
+ break;
+ case 9992:
+ _sceneMode = 9992;
+ break;
+ default:
+ _sceneMode = 0;
+ break;
+ }
+ setAction(&_sequenceManager, this, 4554, &BF_GLOBALS._player, NULL);
+ _nextSceneMode = 0;
+ _modeFlag = true;
+ break;
+ case 9977:
+ setMode(false, 9992);
+ break;
+ case 9979:
+ _sceneMode = 0;
+ signal();
+ break;
+ case 9980:
+ _sceneMode = 9982;
+ ADD_MOVER(BF_GLOBALS._player, 64, 173);
+ break;
+ case 9981:
+ _sceneMode = 9994;
+ _green.animate(ANIM_MODE_5, NULL);
+ addFader((const byte *)&black, 10, this);
+ break;
+ case 9982:
+ _sceneMode = 9983;
+ if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355) {
+ if (BF_GLOBALS.getFlag(fLyleOnIsland)) {
+ BF_GLOBALS._player.updateAngle(_green._position);
+ _stripManager.start(3581, this);
+ } else {
+ BF_GLOBALS._player.updateAngle(_lyle._position);
+ _stripManager.start(3570, this);
+ }
+ } else {
+ if (BF_GLOBALS.getFlag(fLyleOnIsland)) {
+ if (BF_GLOBALS._sceneObjects->contains(&_green)) {
+ BF_INVENTORY.setObjectScene(INV_GRENADES, 860);
+ _stripManager.start(3583, this);
+ } else {
+ signal();
+ }
+ } else {
+ BF_GLOBALS._player.updateAngle(_lyle._position);
+ _stripManager.start(BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 3579 : 3580, this);
+ }
+ }
+ break;
+ case 9983:
+ BF_GLOBALS._sceneManager.changeScene(860);
+ break;
+ case 9984:
+ if (BF_GLOBALS._dayNumber == 5) {
+ _sceneMode = 0;
+ switch (_doorway._v2) {
+ case 0:
+ BF_GLOBALS._sound1.play(109);
+ BF_GLOBALS.setFlag(fTookTrailerAmmo);
+ _stripManager.start(3575, this);
+ _lyle._flag = 1;
+ ++_doorway._v2;
+ break;
+ case 1:
+ _stripManager.start(3573, this);
+ break;
+ default:
+ SceneItem::display2(355, 21);
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+ } else if (BF_GLOBALS.getFlag(greenTaken) || (BF_GLOBALS._dayNumber > 1)) {
+ if (_doorway._v3) {
+ SceneItem::display2(355, 23);
+ _sceneMode = 0;
+ signal();
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2358;
+ setAction(&_sequenceManager, this, 3551, &BF_GLOBALS._player, &_doorway, NULL);
+ }
+ } else if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1356;
+ setAction(&_sequenceManager, this, 1358, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1356;
+ setAction(&_sequenceManager, this, 1356, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 9985:
+ _sceneMode = 0;
+ _stripManager.start(3569, this);
+ BF_INVENTORY.setObjectScene(INV_GRENADES, 1);
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_GLOBALS._player._regionBitList |= 0x10;
+ break;
+ case 9986:
+ if (_nextSceneMode) {
+ _sceneMode = _item3._state;
+ signal();
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = _item3._state;
+ setAction(&_sequenceManager, this, 3553, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 9987:
+ if (_nextSceneMode) {
+ _nextSceneMode = 0;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3555;
+ setAction(&_sequenceManager, this, 3555, &BF_GLOBALS._player, NULL);
+ } else {
+ _nextSceneMode = 1;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3553;
+ setAction(&_sequenceManager, this, 3553, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 9988:
+ T2_GLOBALS._uiElements.addScore(30);
+ if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) &&
+ (BF_INVENTORY.getObjectScene(INV_FLARE) == 0)) {
+ _green.postInit();
+ _green.setVisage(373);
+ _green.setPosition(Common::Point(-10, -10));
+ _green._flag = 0;
+
+ _object9.postInit();
+ _object9.setPosition(Common::Point(-10, -10));
+ _object10.postInit();
+ _object10.setPosition(Common::Point(-10, -10));
+ _object11.postInit();
+ _object11.setPosition(Common::Point(-10, -10));
+
+ BF_GLOBALS._sceneItems.push_front(&_green);
+ BF_GLOBALS.setFlag(fTookTrailerAmmo);
+ BF_GLOBALS._sound1.fade(0, 5, 60, true, NULL);
+ _sceneMode = 4550;
+
+ setAction(&_sequenceManager, this, 4550, &_doorway, &_green, &_object9, &_object10, &_object11, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 9989:
+ _lockerInset.postInit();
+ _lockerInset.setVisage(2356);
+ _lockerInset.setStrip(2);
+ BF_GLOBALS._sceneItems.push_front(&_lockerInset);
+
+ if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 999) {
+ _lockerInset.setFrame(2);
+ if (BF_INVENTORY.getObjectScene(INV_FLARE) == 355) {
+ _object5.postInit();
+ _object5.setVisage(2356);
+ _object5.setStrip(3);
+ _object5.setPosition(Common::Point(67, 85));
+ _object5.fixPriority(255);
+ BF_GLOBALS._sceneItems.push_front(&_object5);
+ }
+ } else {
+ _lockerInset.setFrame(1);
+ }
+
+ _lockerInset.setPosition(Common::Point(82, 115));
+ _lockerInset.fixPriority(254);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9990:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3556;
+ ADD_PLAYER_MOVER(145, 145);
+ break;
+ case 9991:
+ setMode(false, 0);
+ break;
+ case 9992:
+ _sceneMode = 9993;
+ ADD_PLAYER_MOVER(59, 174);
+ break;
+ case 9993:
+ BF_INVENTORY.setObjectScene(INV_SCREWDRIVER, 1);
+ SceneItem::display2(355, 29);
+ T2_GLOBALS._uiElements.addScore(30);
+ _sceneMode = 0;
+ signal();
+ break;
+ case 9996: {
+ _sceneMode = 9989;
+ ADD_PLAYER_MOVER(116, 146);
+ break;
+ }
+ case 9997:
+ _sceneMode = 9999;
+ _doorway._v1 = 2;
+ _stripManager.start(3562, this);
+ break;
+ case 9998:
+ error("Talkdoor state");
+ break;
+ case 9999:
+ if (_doorway._v1 != 2) {
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ } else if (BF_GLOBALS.getFlag(gunDrawn)) {
+ _sceneMode = 2358;
+ setAction(&_sequenceManager, this, 2359, &BF_GLOBALS._player, &_doorway, &_harrison, NULL);
+ } else {
+ _sceneMode = 2358;
+ setAction(&_sequenceManager, this, 2358, &BF_GLOBALS._player, &_doorway, &_harrison, NULL);
+ }
+ break;
+ case 0:
+ case 3555:
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene355::process(Event &event) {
+ if (BF_GLOBALS._dayNumber != 5) {
+ // Handling for earlier days
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_rentalExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+
+ if ((_sceneMode != 2357) && (_sceneMode != 1357) && !BF_GLOBALS.getFlag(greenTaken) &&
+ (event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45)) {
+ if (BF_GLOBALS._player.contains(event.mousePos)) {
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS.clearFlag(gunDrawn);
+ _sceneMode = 2357;
+ setAction(&_sequenceManager, this, 2357, &BF_GLOBALS._player, &_harrison, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1357;
+ setAction(&_sequenceManager, this, 1357, &BF_GLOBALS._player, &_harrison, NULL);
+ BF_GLOBALS.setFlag(gunDrawn);
+ }
+ } else {
+ _item11.startAction(INV_COLT45, event);
+ }
+ event.handled = true;
+ }
+ } else {
+ // Day 5 handling
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on the exit to the rental boat
+ if (_rentalExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(!_modeFlag ? EXITFRAME_SW : EXITFRAME_NE);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+
+ // Special handling of actions
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ switch (BF_GLOBALS._events.getCursor()) {
+ case INV_COLT45:
+ if (BF_GLOBALS._player.contains(event.mousePos)) {
+ BF_GLOBALS._player.addMover(NULL);
+
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS.clearFlag(gunDrawn);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1357;
+ setAction(&_sequenceManager, this, 3560, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS.setFlag(gunDrawn);
+ if (_modeFlag) {
+ setMode(true, 3561);
+ } else {
+ _sceneMode = 3561;
+ signal();
+ }
+ }
+ }
+ break;
+ case CURSOR_WALK:
+ if (BF_GLOBALS.getFlag(gunDrawn))
+ event.handled = true;
+ break;
+ case CURSOR_LOOK:
+ case CURSOR_TALK:
+ break;
+ case CURSOR_USE:
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ SceneItem::display2(355, 50);
+ event.handled = true;
+ }
+ break;
+ default:
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ SceneItem::display2(355, 50);
+ event.handled = true;
+ }
+ break;
+ }
+ }
+ }
+
+ PalettedScene::process(event);
+}
+
+void Scene355::dispatch() {
+ PalettedScene::dispatch();
+ if (BF_GLOBALS._sceneObjects->contains(&_lyle)) {
+ _lyle.updateAngle(BF_GLOBALS._player._position);
+ }
+
+ if (!_action && (BF_GLOBALS._player.getRegionIndex() == 20)) {
+ ADD_MOVER(BF_GLOBALS._player, 238, 142);
+ }
+}
+
+void Scene355::setMode(bool mode, int sceneMode) {
+ Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene;
+
+ if (mode) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = sceneMode;
+ setAction(&scene->_sequenceManager, this, 4553, &BF_GLOBALS._player, NULL);
+ _modeFlag = false;
+ } else {
+ _sceneMode = 9990;
+ _nextSceneMode = sceneMode;
+ signal();
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 360 - Future Wave Interior
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene360::Item1::startAction(CursorType action, Event &event) {
+ Scene360 *scene = (Scene360 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 9);
+ return true;
+ case CURSOR_TALK:
+ scene->_sceneMode = 3607;
+ BF_GLOBALS._player.disableControl();
+ scene->_stripManager.start(3550, this);
+ return true;
+ case INV_COLT45:
+ SceneItem::display2(1, 4);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene360::Item2::startAction(CursorType action, Event &event) {
+ Scene360 *scene = (Scene360 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 10);
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS._dayNumber != 4)
+ SceneItem::display2(360, 5);
+ else
+ scene->setAction(&scene->_action1);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene360::Item3::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 11);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(360, 12);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene360::Barometer::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 15);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(360, 16);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene360::SlidingDoor::startAction(CursorType action, Event &event) {
+ Scene360 *scene = (Scene360 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 0);
+ return true;
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(greenTaken)) {
+ scene->_sceneMode = 3611;
+ setAction(&scene->_sequenceManager1, scene, 3611, &BF_GLOBALS._player, this, NULL);
+ } else {
+ scene->_sceneMode = 3604;
+ setAction(&scene->_sequenceManager1, scene, 3604, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ case CURSOR_TALK:
+ scene->_sceneMode = 3607;
+ BF_GLOBALS._player.disableControl();
+ scene->_stripManager.start(3550, scene);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene360::Window::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 13);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(360, 14);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene360::Object4::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 3);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(360, 2);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene360::BsseballCards::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (event.mousePos.x >= (_bounds.left + _bounds.width() / 2))
+ SceneItem::display2(360, 4);
+ else
+ SceneItem::display2(360, 22);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(360, 2);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene360::Object6::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 6);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(360, 7);
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(360, 8);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene360::Object7::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(360, 1);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(360, 21);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene360::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ ADD_PLAYER_MOVER(153, 115);
+ break;
+ case 1:
+ BF_GLOBALS._player.setStrip(7);
+ if (BF_INVENTORY.getObjectScene(INV_WAREHOUSE_KEYS) == 360) {
+ SceneItem::display2(360, 20);
+ BF_INVENTORY.setObjectScene(INV_WAREHOUSE_KEYS, 1);
+ T2_GLOBALS._uiElements.addScore(30);
+ } else {
+ SceneItem::display2(360, 5);
+ }
+
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene360::Scene360() {
+ _field380 = 0;
+}
+
+void Scene360::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field380);
+}
+
+void Scene360::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(760);
+ setZoomPercents(108, 90, 135, 100);
+ _sound1.play(125);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_harrisonSpeaker);
+ _stripManager.addSpeaker(&_greenSpeaker);
+
+ _item2._sceneRegionId = 11;
+ BF_GLOBALS._sceneItems.push_back(&_item2);
+
+ _slidingDoor.postInit();
+ _slidingDoor.setVisage(760);
+ _slidingDoor.setPosition(Common::Point(42, 120));
+ _slidingDoor.setStrip(2);
+ _slidingDoor.fixPriority(85);
+ BF_GLOBALS._sceneItems.push_back(&_slidingDoor);
+
+ _window.postInit();
+ _window.setVisage(760);
+ _window.setStrip(4);
+ _window.setPosition(Common::Point(176, 43));
+ _window.fixPriority(10);
+ _window._numFrames = 2;
+ _window.animate(ANIM_MODE_8, 0, NULL);
+ BF_GLOBALS._sceneItems.push_back(&_window);
+
+ _object4.postInit();
+ _object4.setVisage(760);
+ _object4.setStrip(5);
+ _object4.setPosition(Common::Point(157, 75));
+ _object4.fixPriority(50);
+ BF_GLOBALS._sceneItems.push_back(&_object4);
+
+ if (BF_GLOBALS._dayNumber <= 1) {
+ _object7.postInit();
+ _object7.setVisage(760);
+ _object7.setStrip(1);
+ _object7.setPosition(Common::Point(246, 105));
+ _object7.fixPriority(50);
+ BF_GLOBALS._sceneItems.push_back(&_object7);
+
+ _baseballCards.postInit();
+ _baseballCards.setVisage(760);
+ _baseballCards.setStrip(6);
+ _baseballCards.setPosition(Common::Point(159, 115));
+ _baseballCards.fixPriority(50);
+ BF_GLOBALS._sceneItems.push_back(&_baseballCards);
+ }
+
+ BF_GLOBALS._player.postInit();
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS._player.setVisage(1351);
+ BF_GLOBALS._player._moveDiff.x = 5;
+ } else {
+ BF_GLOBALS._player.setVisage(361);
+ BF_GLOBALS._player._moveDiff.x = 6;
+ }
+ } else {
+ BF_GLOBALS._player.setVisage(368);
+ BF_GLOBALS._player._moveDiff.x = 6;
+ }
+
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.setPosition(Common::Point(340, 160));
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._moveDiff.y = 4;
+ BF_GLOBALS._player.enableControl();
+
+ if (BF_GLOBALS._sceneManager._previousScene == 370) {
+ BF_GLOBALS._player.setPosition(Common::Point(62, 122));
+ } else {
+ BF_GLOBALS._player.setPosition(Common::Point(253, 135));
+ BF_GLOBALS._player.setStrip(2);
+
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ _object6.postInit();
+ _object6.setVisage(BF_GLOBALS.getFlag(gunDrawn) ? 363 : 1363);
+ _object6.animate(ANIM_MODE_1, NULL);
+ _object6.setObjectWrapper(new SceneObjectWrapper());
+ _object6.setPosition(Common::Point(235, 150));
+ _object6.setStrip(2);
+ BF_GLOBALS._sceneItems.push_back(&_object6);
+ }
+
+ _sceneMode = 3607;
+ if (BF_GLOBALS.getFlag(greenTaken)) {
+ _slidingDoor.setPosition(Common::Point(42, 120));
+ } else {
+ BF_GLOBALS._player.disableControl();
+
+ _object2.postInit();
+ _object2.setPosition(Common::Point(-40, -40));
+
+ _slidingDoor.setPosition(Common::Point(6, 130));
+ _slidingDoor.setAction(&_sequenceManager1, this, 3606, &_slidingDoor, &_object7, NULL);
+ }
+ }
+
+ _barometer._sceneRegionId = 9;
+ BF_GLOBALS._sceneItems.push_back(&_barometer);
+ _item3._sceneRegionId = 10;
+ BF_GLOBALS._sceneItems.push_back(&_item3);
+ _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y));
+ BF_GLOBALS._sceneItems.push_back(&_item1);
+}
+
+void Scene360::signal() {
+ switch (_sceneMode) {
+ case 3600:
+ case 3611:
+ BF_GLOBALS._sceneManager.changeScene(370);
+ break;
+ case 3602:
+ BF_GLOBALS.setFlag(gunDrawn);
+ BF_GLOBALS._deathReason = BF_GLOBALS.getFlag(fBackupIn350) ? 2 : 1;
+ BF_GLOBALS._player.setPosition(Common::Point(BF_GLOBALS._player._position.x - 20,
+ BF_GLOBALS._player._position.y));
+ _sceneMode = 3610;
+ setAction(&_sequenceManager1, this, 3610, &_slidingDoor, &_object2, &BF_GLOBALS._player, NULL);
+ break;
+ case 3603:
+ _sceneMode = 3605;
+ setAction(&_sequenceManager1, this, 3605, &BF_GLOBALS._player, &_slidingDoor, NULL);
+ break;
+ case 3604:
+ _sceneMode = BF_GLOBALS.getFlag(fBackupIn350) ? 3603 : 3605;
+ setAction(&_sequenceManager1, this, _sceneMode, &_object6, NULL);
+ break;
+ case 3605:
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ _sceneMode = 3600;
+ setAction(&_sequenceManager1, this, 3600, NULL);
+ } else {
+ BF_GLOBALS._deathReason = BF_GLOBALS.getFlag(fBackupIn350) ? 2 : 1;
+ _sceneMode = 3610;
+ setAction(&_sequenceManager1, this, 3601, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 3607:
+ case 3609:
+ _object6.setVisage(1363);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3608:
+ BF_GLOBALS._sceneManager.changeScene(355);
+ break;
+ case 3610:
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 9998:
+ BF_GLOBALS._player.setVisage(1351);
+ BF_GLOBALS._player._moveDiff.x = 5;
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9999:
+ BF_GLOBALS._player.setVisage(361);
+ BF_GLOBALS._player._moveDiff.x = 6;
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene360::process(Event &event) {
+ SceneExt::process(event);
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
+ BF_GLOBALS._player.contains(event.mousePos) && !BF_GLOBALS.getFlag(greenTaken)) {
+ // Player clicked gun on themselves
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ // Handle holstering gun
+ if (BF_GLOBALS._player._position.x <= 160)
+ SceneItem::display2(360, 18);
+ else {
+ if (BF_GLOBALS.getFlag(fBackupIn350))
+ SceneItem::display2(360, 19);
+
+ BF_GLOBALS.clearFlag(gunDrawn);
+ _sceneMode = 9999;
+ BF_GLOBALS._player.setVisage(1361);
+ BF_GLOBALS._player.addMover(NULL);
+ BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount());
+ BF_GLOBALS._player.animate(ANIM_MODE_6, this);
+
+ _object6.setVisage(1363);
+ }
+ } else {
+ // Handle drawing gun
+ if (BF_GLOBALS.getFlag(fBackupIn350))
+ SceneItem::display2(360, 19);
+
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.addMover(NULL);
+ BF_GLOBALS._player.setVisage(1361);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+
+ BF_GLOBALS.setFlag(gunDrawn);
+ _sceneMode = 9998;
+ _object6.setVisage(363);
+ }
+
+ event.handled = true;
+ }
+}
+
+void Scene360::dispatch() {
+ SceneExt::dispatch();
+
+ if (!_action) {
+ if (BF_GLOBALS._player.getRegionIndex() == 8) {
+ // Leaving the boat
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ BF_GLOBALS._player.addMover(NULL);
+ _sceneMode = 3609;
+ setAction(&_sequenceManager1, this, 3609, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._sceneManager.changeScene(355);
+ }
+ }
+
+ if ((BF_GLOBALS._player._position.x <= 168) && !BF_GLOBALS.getFlag(greenTaken) &&
+ !BF_GLOBALS.getFlag(gunDrawn)) {
+ // Moving to doorway without drawn gun before Green is captured
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.addMover(NULL);
+ _sceneMode = 3602;
+ setAction(&_sequenceManager1, this, 3602, &_slidingDoor, &_object2, &BF_GLOBALS._player, NULL);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 370 - Future Wave Bedroom
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene370::GreensGun::startAction(CursorType action, Event &event) {
+ Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(370, 4);
+ return true;
+ case CURSOR_USE:
+ if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) || BF_GLOBALS.getFlag(greenTaken)) {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._walkRegions.proc2(3);
+ scene->_sceneMode = 3711;
+ scene->setAction(&scene->_sequenceManager, scene, 3711, &BF_GLOBALS._player, this, NULL);
+ } else {
+ SceneItem::display2(370, 5);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene370::Green::startAction(CursorType action, Event &event) {
+ Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(370, (_v2 < 3) ? 10 : 0);
+ return true;
+ case CURSOR_USE:
+ if (_v2 != 3)
+ SceneItem::display2(370, 1);
+ else if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1)
+ SceneItem::display2(370, 26);
+ else if (BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 1) {
+ scene->_sceneMode = 2;
+ scene->_stripManager.start(3717, scene);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._walkRegions.proc2(3);
+ scene->_sceneMode = 3715;
+ scene->setAction(&scene->_sequenceManager, scene, 3715, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+ switch (_v2) {
+ case 0:
+ ++_v2;
+ scene->_sceneMode = 3706;
+ scene->setAction(&scene->_sequenceManager, scene, 3706, NULL);
+ break;
+ case 1:
+ ++_v2;
+ scene->_sceneMode = 3707;
+
+ scene->_object5.postInit();
+ scene->_object5.setVisage(362);
+ scene->_object5.setStrip(3);
+ scene->_object5.setPosition(scene->_harrison._position);
+ scene->_object5.hide();
+
+ scene->setAction(&scene->_sequenceManager, scene, 3707, &scene->_harrison, &scene->_object5, NULL);
+ break;
+ case 2:
+ ++_v2;
+ scene->_sceneMode = 3708;
+ scene->setAction(&scene->_sequenceManager, scene, 3708, this, &scene->_laura, &scene->_harrison,
+ &scene->_object5, &scene->_greensGun, NULL);
+ break;
+ case 3:
+ scene->_sceneMode = BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1 ? 3713 : 2;
+ scene->_stripManager.start(3717, scene);
+ break;
+ default:
+ break;
+ }
+ return true;
+ case INV_COLT45:
+ if ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 370) || (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 1))
+ SceneItem::display2(370, 28);
+ else if (!BF_GLOBALS.getHasBullets())
+ SceneItem::display2(1, 1);
+ else {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._deathReason = 9;
+ scene->_sceneMode = 3702;
+ scene->setAction(&scene->_sequenceManager, scene, 3702, &BF_GLOBALS._player, this, &scene->_harrison, NULL);
+ }
+ return true;
+ case INV_HANDCUFFS:
+ if (_v2 != 3)
+ SceneItem::display2(370, 2);
+ else {
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3704;
+ scene->setAction(&scene->_sequenceManager, scene, 3704, &BF_GLOBALS._player, this, &scene->_harrison, NULL);
+ }
+ return true;
+ case INV_MIRANDA_CARD:
+ if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1)
+ SceneItem::display2(370, 5);
+ else if (BF_GLOBALS.getFlag(readGreenRights))
+ SceneItem::display2(390, 15);
+ else {
+ BF_GLOBALS.setFlag(readGreenRights);
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.updateAngle(this->_position);
+ scene->_sceneMode = 3717;
+ scene->setAction(&scene->_sequenceManager, scene, 3717, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject2::startAction(action, event);
+}
+
+bool Scene370::Harrison::startAction(CursorType action, Event &event) {
+ Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(370, 8);
+ return true;
+ case CURSOR_TALK:
+ if (scene->_green._v2 != 3) {
+ scene->_sceneMode = 3;
+ scene->_stripManager.start(3714, scene);
+ } else if ((BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 1) ||
+ ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 1) && BF_GLOBALS._sceneObjects->contains(&scene->_laura))) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3716;
+ scene->setAction(&scene->_sequenceManager, scene, 3716, &BF_GLOBALS._player, &scene->_green, this, NULL);
+ } else {
+ BF_GLOBALS._player.updateAngle(this->_position);
+ scene->_stripManager.start(3715, scene);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene370::Laura::startAction(CursorType action, Event &event) {
+ Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(370, 11);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(370, BF_GLOBALS._sceneObjects->contains(&scene->_green) ? 12 : 13);
+ return true;
+ case CURSOR_TALK:
+ if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3705;
+ scene->setAction(&scene->_sequenceManager, scene, 3705, &BF_GLOBALS._player, this, NULL);
+ return true;
+ }
+ // Deliberate fall-through
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene370::Item1::startAction(CursorType action, Event &event) {
+ Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(370, 15);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(370, 16);
+ return true;
+ case INV_COLT45:
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_green) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 370)) {
+ scene->_green.setAction(NULL);
+ scene->_sceneMode = 3703;
+ scene->setAction(&scene->_sequenceManager, scene, 3703, &BF_GLOBALS._player, &scene->_green, &scene->_harrison, NULL);
+ return true;
+ }
+ // Deliberate fall-through
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene370::Item6::startAction(CursorType action, Event &event) {
+ Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(370, 14);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(370, 29);
+ return true;
+ case INV_COLT45:
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_green) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 370) &&
+ (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_green.setAction(NULL);
+ scene->_sceneMode = 3703;
+ scene->setAction(&scene->_sequenceManager, scene, 3703, &BF_GLOBALS._player, &scene->_green, &scene->_harrison, NULL);
+ return true;
+ }
+ // Deliberate fall-through
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+
+bool Scene370::Exit::startAction(CursorType action, Event &event) {
+ Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
+
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_green))
+ return false;
+ else {
+ ADD_PLAYER_MOVER(event.mousePos.x, event.mousePos.y);
+ return true;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene370::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(370);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_lauraSpeaker);
+ _stripManager.addSpeaker(&_lauraHeldSpeaker);
+ _stripManager.addSpeaker(&_greenSpeaker);
+ _stripManager.addSpeaker(&_harrisonSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(1351);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setStrip(8);
+ BF_GLOBALS._player.setPosition(Common::Point(310, 153));
+ BF_GLOBALS._player._moveDiff = Common::Point(7, 2);
+ BF_GLOBALS._player.disableControl();
+
+ if (BF_GLOBALS.getFlag(greenTaken)) {
+ // Green has already been arrested
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368);
+ BF_GLOBALS._player._moveDiff.x = 6;
+ BF_GLOBALS._player.enableControl();
+ } else {
+ // Hostage scene setup
+ _green.postInit();
+ _green.setVisage(373);
+ _green.setStrip(2);
+ _green._numFrames = 5;
+ _green.setPosition(Common::Point(164, 137));
+ _green.animate(ANIM_MODE_7, 0, NULL);
+ _green.fixPriority(125);
+ BF_GLOBALS._sceneItems.push_back(&_green);
+
+ _laura.postInit();
+ _laura.setVisage(374);
+ _laura.setStrip(2);
+ _laura.setPosition(_green._position);
+ _laura.hide();
+ _laura.animate(ANIM_MODE_1, NULL);
+
+ _harrison.postInit();
+ _harrison.setVisage(372);
+ _harrison.setPosition(Common::Point(256, 166));
+ BF_GLOBALS._sceneItems.push_back(&_harrison);
+
+ _sceneMode = 3700;
+ setAction(&_sequenceManager, this, 3700, NULL);
+ }
+
+ if ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 320) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 1)) {
+ _greensGun.postInit();
+ _greensGun.setVisage(362);
+ _greensGun.setStrip(6);
+ _greensGun.setPosition(_green._position);
+ _greensGun.fixPriority(149);
+ _greensGun.hide();
+ }
+
+ if ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 370) && (BF_GLOBALS._dayNumber == 1)) {
+ _greensGun.setPosition(Common::Point(172, 137));
+ _greensGun.show();
+ BF_GLOBALS._sceneItems.push_front(&_greensGun);
+ }
+
+ _item1._sceneRegionId = 8;
+ BF_GLOBALS._sceneItems.push_back(&_item1);
+ _item2.setDetails(9, 370, 17, -1, 18, 1);
+ _item3.setDetails(10, 370, 19, -1, 20, 1);
+ _item4.setDetails(11, 370, 21, -1, 22, 1);
+ _item5.setDetails(12, 370, 23, -1, 24, 1);
+ _exit.setDetails(Rect(316, 133, 320, 166), 360, -1, -1, -1, 1, NULL);
+ _item6.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+
+ BF_GLOBALS._sceneItems.push_back(&_item6);
+ BF_GLOBALS._sceneItems.remove(&BF_GLOBALS._player);
+ BF_GLOBALS._sceneItems.push_back(&BF_GLOBALS._player);
+}
+
+void Scene370::signal() {
+ switch (_sceneMode) {
+ case 1:
+ BF_GLOBALS._bookmark = bArrestedGreen;
+ BF_GLOBALS._sceneManager.changeScene(350);
+ break;
+ case 2:
+ case 3717:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3:
+ break;
+ case 3707:
+ _object5.setDetails(370, 6, -1, 7, 1, NULL);
+ BF_GLOBALS._sceneItems.push_back(&_object5);
+ // Deliberate fall-through
+ case 3700:
+ case 3706:
+ _green.setAction(&_sequenceManager, this, 3701, NULL);
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ break;
+ case 3701:
+ BF_GLOBALS._player.disableControl();
+ setAction(&_sequenceManager, this, 3710, NULL);
+ break;
+ case 3702:
+ // Player tried to shoot Green
+ BF_GLOBALS._deathReason = 2;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 3703:
+ // Player dropped his gun
+ BF_GLOBALS._deathReason = 9;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 3704:
+ BF_GLOBALS.clearFlag(gunDrawn);
+ BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 390);
+ BF_GLOBALS._player.setVisage(361);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setStrip(3);
+
+ BF_GLOBALS._sceneItems.push_front(&_laura);
+ BF_GLOBALS._walkRegions.proc1(3);
+ _harrison.setAction(NULL);
+ BF_GLOBALS._player.enableControl();
+
+ BF_GLOBALS.set2Flags(f1015Marina);
+ BF_GLOBALS.set2Flags(f1027Marina);
+ BF_GLOBALS.set2Flags(f1098Marina);
+ break;
+ case 3705:
+ _laura.remove();
+ BF_GLOBALS._walkRegions.proc2(6);
+ BF_GLOBALS._walkRegions.proc2(1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3708:
+ _sound1.play(6);
+ BF_GLOBALS._sound1.changeSound(35);
+ BF_INVENTORY.setObjectScene(INV_GREENS_GUN, 370);
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_GLOBALS._sceneItems.push_front(&_greensGun);
+
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+
+ _sceneMode = 0;
+ _object5.remove();
+ _green.setAction(NULL);
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.proc1(1);
+ break;
+ case 3709:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3713;
+ setAction(&_sequenceManager, this, 3713, NULL);
+ break;
+ case 3710:
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ _sceneMode = 3701;
+ _green.setAction(&_sequenceManager, this, 3701, NULL);
+ break;
+ case 3711:
+ BF_GLOBALS._walkRegions.proc1(3);
+ BF_INVENTORY.setObjectScene(INV_GREENS_GUN, 1);
+ T2_GLOBALS._uiElements.addScore(30);
+ _greensGun.remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3712:
+ T2_GLOBALS._uiElements._active = false;
+ T2_GLOBALS._uiElements.hide();
+
+ if (BF_GLOBALS._sceneObjects->contains(&_greensGun))
+ _greensGun.remove();
+ _sceneMode = 1;
+ setAction(&_sequenceManager, this, 3714, NULL);
+ break;
+ case 3713:
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ break;
+ case 3715:
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_INVENTORY.setObjectScene(INV_GREEN_ID, 1);
+ BF_INVENTORY.setObjectScene(INV_GREENS_KNIFE, 1);
+ BF_GLOBALS._walkRegions.proc1(3);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3716:
+ BF_GLOBALS.clearFlag(fCalledBackup);
+ BF_GLOBALS.clearFlag(fBackupIn350);
+ BF_GLOBALS.clearFlag(fBackupArrived340);
+ BF_GLOBALS.setFlag(greenTaken);
+ BF_GLOBALS.setFlag(fToldToLeave340);
+
+ BF_GLOBALS._bookmark = bCalledToDomesticViolence;
+ _harrison.remove();
+ _green.remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene370::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene370::dispatch() {
+ SceneExt::dispatch();
+
+ if ((BF_GLOBALS._player._position.x >= 316) && !BF_GLOBALS._sceneObjects->contains(&_laura) &&
+ !BF_GLOBALS._sceneObjects->contains(&_green)) {
+ if (BF_GLOBALS._bookmark < bArrestedGreen) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3712;
+ setAction(&_sequenceManager, this, 3712, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._sound1.fadeSound(35);
+ BF_GLOBALS._sceneManager.changeScene(360);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 380 - Outside City Hall & Jail
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene380::Vechile::startAction(CursorType action, Event &event) {
+ Scene380 *scene = (Scene380 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 3802, &BF_GLOBALS._player, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene380::Door::startAction(CursorType action, Event &event) {
+ Scene380 *scene = (Scene380 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 3800, &BF_GLOBALS._player, &scene->_door, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene380::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(380);
+ setZoomPercents(68, 80, 131, 100);
+
+ BF_GLOBALS._sound1.fadeSound(33);
+ BF_GLOBALS._walkRegions.proc1(9);
+
+ _door.postInit();
+ _door.setVisage(380);
+ _door.setStrip(4);
+ _door.setPosition(Common::Point(132, 66));
+ _door.setDetails(380, 12, 13, -1, 1, NULL);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.changeZoom(-1);
+
+ _vechile.postInit();
+ _vechile.setVisage(380);
+ _vechile.fixPriority(109);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ // Show vechile as car
+ _vechile.setStrip(3);
+ _vechile.setPosition(Common::Point(273, 125));
+ _vechile.setDetails(580, 2, 3, -1, 1, NULL);
+
+ BF_GLOBALS._player.setVisage(129);
+ BF_GLOBALS._walkRegions.proc1(12);
+ BF_GLOBALS._walkRegions.proc1(18);
+ BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.proc1(20);
+ BF_GLOBALS._walkRegions.proc1(25);
+ BF_GLOBALS._walkRegions.proc1(26);
+ BF_GLOBALS._walkRegions.proc1(27);
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ // Show on duty motorcycle
+ _vechile.setStrip(2);
+ _vechile.setDetails(300, 11, 13, -1, 1, NULL);
+ _vechile.setPosition(Common::Point(252, 115));
+
+ BF_GLOBALS._player.setVisage(1341);
+ } else {
+ // Show off duty motorcycle
+ _vechile.setStrip(1);
+ _vechile.setDetails(580, 0, 1, -1, 1, NULL);
+ _vechile.setPosition(Common::Point(249, 110));
+
+ BF_GLOBALS._player.setVisage(129);
+ }
+
+ BF_GLOBALS._player.updateAngle(_vechile._position);
+ BF_GLOBALS._sceneItems.push_back(&_door);
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 50:
+ case 60:
+ case 330:
+ case 370:
+ BF_GLOBALS._player.setPosition(Common::Point(251, 100));
+ BF_GLOBALS._player._strip = 3;
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 3801, &BF_GLOBALS._player, &_door, NULL);
+ break;
+ }
+
+ _item1.setDetails(7, 380, 0, 1, 2, 1);
+ _item2.setDetails(9, 380, 3, 4, 5, 1);
+ _item3.setDetails(17, 380, 6, 7, 8, 1);
+ _item4.setDetails(20, 380, 9, 10, 11, 1);
+ _item5.setDetails(15, 380, 14, 15, 16, 1);
+ _item6.setDetails(4, 380, 17, 18, 19, 1);
+ _item7.setDetails(19, 380, 20, 4, 21, 1);
+ _item8.setDetails(18, 380, 22, 23, 24, 1);
+ _item9.setDetails(6, 380, 25, 26, 27, 1);
+}
+
+void Scene380::signal() {
+ switch (_sceneMode) {
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 2:
+ BF_GLOBALS._sceneManager.changeScene(385);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 385 - City Hall
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene385::Action1::signal() {
+ Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+
+ switch (scene->_talkAction) {
+ case 0:
+ error("Bugs::talkscript385");
+ break;
+ case 3850:
+ case 3851:
+ case 3852:
+ case 3853:
+ case 3854:
+ case 3855:
+ case 3856:
+ case 3857:
+ case 3863:
+ case 3866: {
+ ADD_PLAYER_MOVER(187, 144);
+ break;
+ }
+ default: {
+ ADD_PLAYER_MOVER(231, 158);
+ break;
+ }
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.changeAngle(45);
+ setDelay(3);
+ break;
+ case 2:
+ scene->_stripManager.start(scene->_talkAction, this);
+ break;
+ case 3:
+ if (scene->_talkAction)
+ scene->_dezi.animate(ANIM_MODE_5, NULL);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene385::Action2::signal() {
+ Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ ADD_PLAYER_MOVER(231, 158);
+ break;
+ }
+ case 1:
+ BF_GLOBALS._player.updateAngle(BF_GLOBALS._player._position);
+ setDelay(3);
+ break;
+ case 2:
+ scene->_stripManager.start(3864, this);
+ break;
+ case 3:
+ scene->_jim.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ scene->_jim.setStrip(4);
+ scene->_jim.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ scene->_stripManager.start(3865, this);
+ break;
+ case 6:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene385::Door::startAction(CursorType action, Event &event) {
+ Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ BF_GLOBALS._walkRegions.proc2(6);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3850;
+ scene->setAction(&scene->_sequenceManager, scene, 3850, &BF_GLOBALS._player, this, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene385::Jim::startAction(CursorType action, Event &event) {
+ Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (scene->_jimFlag) {
+ scene->_talkAction = 3867;
+ scene->setAction(&scene->_action1);
+ } else {
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ scene->_talkAction = 3858;
+ break;
+ case 2:
+ scene->_talkAction = 3859;
+ break;
+ case 3:
+ scene->_talkAction = 3860;
+ break;
+ case 4:
+ scene->_talkAction = 3861;
+ break;
+ default:
+ BF_GLOBALS._deziTopic = 3;
+ scene->_talkAction = 3868;
+ break;
+ }
+
+ scene->_jimFlag = 1;
+ scene->setAction(&scene->_action1);
+ }
+ return true;
+ case INV_PRINT_OUT:
+ if (!BF_GLOBALS.getFlag(fGotPointsForMCard)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.getFlag(fGotPointsForMCard);
+
+ scene->setAction(&scene->_action2);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene385::Dezi::startAction(CursorType action, Event &event) {
+ Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (BF_GLOBALS._deziTopic == 3) {
+ scene->_talkAction = 3857;
+ } else {
+ BF_GLOBALS._deziTopic = 3;
+
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ if (BF_GLOBALS._deziTopic++ == 0) {
+ scene->_talkAction = 3850;
+ } else {
+ BF_GLOBALS._deziTopic = 3;
+ scene->_talkAction = 3851;
+ }
+ break;
+ case 2:
+ if (BF_GLOBALS._deziTopic++ == 0) {
+ scene->_talkAction = 3852;
+ } else {
+ BF_GLOBALS._deziTopic = 3;
+ scene->_talkAction = 3853;
+ }
+ break;
+ case 3:
+ if (BF_GLOBALS._deziTopic++ == 0) {
+ scene->_talkAction = 3854;
+ } else {
+ BF_GLOBALS._deziTopic = 3;
+ scene->_talkAction = 3855;
+ }
+ break;
+ case 4:
+ BF_GLOBALS._deziTopic = 3;
+ scene->_talkAction = 3856;
+ break;
+ default:
+ BF_GLOBALS._deziTopic = 3;
+ scene->_talkAction = 3868;
+ break;
+ }
+ }
+
+ scene->setAction(&scene->_action1);
+ return true;
+ case INV_PRINT_OUT:
+ scene->_talkAction = 3863;
+ scene->setAction(&scene->_action1);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene385::Exit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 100, BF_GLOBALS._player._position.y + 100);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+
+Scene385::Scene385(): SceneExt() {
+ _talkAction = _jimFlag = 0;
+}
+
+void Scene385::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_talkAction);
+ s.syncAsSint16LE(_jimFlag);
+}
+
+void Scene385::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+
+ _exit.setDetails(Rect(0, 162, 320, 167), 385, -1, -1, -1, 1, NULL);
+ BF_GLOBALS._sound1.fadeSound(119);
+
+ loadScene(385);
+ setZoomPercents(115, 90, 145, 100);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jake385Speaker);
+ _stripManager.addSpeaker(&_jimSpeaker);
+ _stripManager.addSpeaker(&_deziSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.enableControl();
+
+ _item3.setDetails(1, 385, 5, -1, -1, 1);
+ _item2.setDetails(2, 385, 7, -1, -1, 1);
+ _item1.setDetails(3, 385, 6, -1, 6, 1);
+ _item5.setDetails(4, 385, 14, -1, -1, 1);
+
+ _jim.postInit();
+ _jim.setVisage(385);
+ _jim.setStrip(3);
+ _jim.setPosition(Common::Point(304, 113));
+ _jim.setDetails(385, 1, -1, 2, 1, NULL);
+
+ _dezi.postInit();
+ _dezi.setVisage(385);
+ _dezi.setStrip(2);
+ _dezi.setPosition(Common::Point(235, 93));
+ _dezi.fixPriority(120);
+ _dezi.setDetails(385, 3, -1, 2, 1, NULL);
+
+ _door.postInit();
+ _door.setVisage(385);
+ _door.setPosition(Common::Point(107, 27));
+ _door.setDetails(385, 0, -1, -1, 1, NULL);
+
+ BF_GLOBALS._walkRegions.proc1(6);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 390) {
+ BF_GLOBALS._player.setPosition(Common::Point(109, 119));
+ } else {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setPosition(Common::Point(15, 250));
+ _sceneMode = 3852;
+ setAction(&_sequenceManager, this, 3852, &BF_GLOBALS._player, NULL);
+ }
+
+ _item4.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 385, 4, -1, -1, 1, NULL);
+}
+
+void Scene385::signal() {
+ switch (_sceneMode) {
+ case 3850:
+ BF_GLOBALS._sceneManager.changeScene(390);
+ break;
+ case 3851:
+ BF_GLOBALS._sceneManager.changeScene(380);
+ break;
+ case 3852:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene385::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene385::dispatch() {
+ SceneExt::dispatch();
+
+ if (!_action && (BF_GLOBALS._player._position.y > 162)) {
+ // Leaving by exit
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3851;
+ setAction(&_sequenceManager, this, 3851, &BF_GLOBALS._player, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 390 - City Jail
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene390::Action1::signal() {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1:
+ switch (scene->_sceneMode) {
+ case 3900:
+ case 3905:
+ case 3906:
+ case 3913:
+ case 3914:
+ case 3916:
+ case 3917: {
+ ADD_PLAYER_MOVER(75, 122);
+ break;
+ }
+ default: {
+ ADD_PLAYER_MOVER(147, 133);
+ break;
+ }
+ }
+ break;
+ case 2:
+ switch (scene->_sceneMode) {
+ case 3900:
+ case 3905:
+ case 3906:
+ case 3913:
+ case 3914:
+ case 3916:
+ case 3917: {
+ BF_GLOBALS._player.changeAngle(315);
+ break;
+ }
+ default: {
+ BF_GLOBALS._player.changeAngle(90);
+ break;
+ }
+ }
+ setDelay(1);
+ break;
+ case 3:
+ scene->_stripManager.start(scene->_sceneMode, this);
+ break;
+ case 4:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene390::BookingForms::startAction(CursorType action, Event &event) {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_flag) {
+ SceneItem::display2(390, 16);
+ } else if (!BF_GLOBALS.getFlag(onDuty)) {
+ SceneItem::display2(390, 22);
+ } else if (((BF_GLOBALS._bookmark < bLauraToParamedics) && BF_GLOBALS.getFlag(greenTaken)) ||
+ ((BF_GLOBALS._bookmark >= bStoppedFrankie) && !BF_GLOBALS.getFlag(frankInJail) && (BF_GLOBALS._dayNumber == 1))) {
+ BF_GLOBALS._player.disableControl();
+ ++_flag;
+ scene->_sceneMode = 3902;
+ setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL);
+ } else {
+ SceneItem::display2(390, 23);
+ }
+ return true;
+ default:
+ return NamedHotspotExt::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene390::Green::startAction(CursorType action, Event &event) {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (!_flag) {
+ ++_flag;
+ scene->_sceneMode = 3901;
+ } else {
+ scene->_sceneMode = 3902;
+ }
+ scene->setAction(&scene->_action1);
+ return true;
+ case INV_MIRANDA_CARD:
+ if (BF_GLOBALS.getFlag(readGreenRights)) {
+ SceneItem::display2(390, 15);
+ } else {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(readGreenRights);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3904;
+
+ scene->setAction(&scene->_sequenceManager, scene, 3904, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ default:
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+bool Scene390::Object2::startAction(CursorType action, Event &event) {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (!_flag)
+ break;
+
+ if (!BF_GLOBALS.getFlag(onDuty)) {
+ scene->_sceneMode = 3917;
+ } else if (BF_GLOBALS.getFlag(fTalkedToBarry) && !BF_GLOBALS.getFlag(fTalkedToLarry)) {
+ scene->_sceneMode = 3913;
+ } else if (!BF_GLOBALS.getFlag(fTalkedToLarry)) {
+ scene->_sceneMode = 3914;
+ } else {
+ ++_flag;
+
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_green)) {
+ scene->_sceneMode = 3900;
+ } else if (!BF_GLOBALS._sceneObjects->contains(&scene->_green)) {
+ scene->_sceneMode = 3905;
+ } else if (BF_GLOBALS.getFlag(fCuffedFrankie)) {
+ scene->_sceneMode = 3906;
+ } else {
+ scene->_sceneMode = 3916;
+ }
+ }
+
+ BF_GLOBALS.setFlag(fTalkedToLarry);
+ scene->setAction(&scene->_action1);
+ return true;
+ case INV_BOOKING_GREEN:
+ if (BF_GLOBALS._bookmark >= bLauraToParamedics)
+ SceneItem::display2(390, 21);
+ else {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._bookmark = bLauraToParamedics;
+ scene->_sceneMode = 3905;
+
+ BF_INVENTORY.setObjectScene(INV_GREEN_ID, 390);
+ if (BF_GLOBALS.getFlag(fLeftTraceIn910))
+ BF_GLOBALS.clearFlag(fLeftTraceIn910);
+
+ scene->setAction(&scene->_sequenceManager, scene, 3905, &BF_GLOBALS._player, this, NULL);
+ BF_GLOBALS.clearFlag(f1015Marina);
+ BF_GLOBALS.clearFlag(f1027Marina);
+ BF_GLOBALS.clearFlag(f1035Marina);
+ }
+ return true;
+ case INV_BOOKING_FRANKIE:
+ case INV_BOOKING_GANG:
+ if (BF_GLOBALS.getFlag(frankInJail)) {
+ SceneItem::display2(390, 21);
+ } else {
+ scene->_sceneMode = 3905;
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_sequenceManager, scene, 3905, &BF_GLOBALS._player, this, NULL);
+
+ BF_INVENTORY.setObjectScene(INV_FRANKIE_ID, 390);
+ BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 390);
+ BF_GLOBALS.clearFlag(frankInJail);
+ BF_GLOBALS.clearFlag(f1015Frankie);
+ BF_GLOBALS.clearFlag(f1027Frankie);
+ BF_GLOBALS.clearFlag(f1035Frankie);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObjectExt::startAction(action, event);
+}
+
+bool Scene390::Object3::startAction(CursorType action, Event &event) {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case INV_GREEN_ID:
+ scene->_sceneMode = 3903;
+ setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL);
+ remove();
+ BF_INVENTORY.setObjectScene(INV_BOOKING_GREEN, 1);
+ return true;
+ case INV_FRANKIE_ID:
+ BF_INVENTORY.setObjectScene(INV_BOOKING_FRANKIE, 1);
+ scene->_sceneMode = 3903;
+ setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL);
+ remove();
+ return true;
+ case INV_TYRONE_ID:
+ scene->_sceneMode = 3903;
+ setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL);
+ remove();
+ BF_INVENTORY.setObjectScene(INV_BOOKING_GANG, 1);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene390::GangMember1::startAction(CursorType action, Event &event) {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ scene->_sceneMode = 3908;
+ scene->setAction(&scene->_action1);
+ return true;
+ case INV_MIRANDA_CARD:
+ if (BF_GLOBALS.getFlag(readFrankRights)) {
+ SceneItem::display2(390, 15);
+ } else {
+ BF_GLOBALS.setFlag(readFrankRights);
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 3904;
+ scene->setAction(&scene->_sequenceManager, scene, 3907, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene390::GangMember2::startAction(CursorType action, Event &event) {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ scene->_sceneMode = 3909;
+ scene->setAction(&scene->_action1);
+ return true;
+ case INV_MIRANDA_CARD:
+ if (BF_GLOBALS.getFlag(readFrankRights)) {
+ SceneItem::display2(390, 15);
+ } else {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(readFrankRights);
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 3904;
+ scene->setAction(&scene->_sequenceManager, scene, 3907, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene390::Door::startAction(CursorType action, Event &event) {
+ Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if ((BF_INVENTORY.getObjectScene(INV_BOOKING_GREEN) == 1) && (BF_INVENTORY.getObjectScene(INV_GREEN_ID) == 1)) {
+ scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy);
+ } else if ((BF_INVENTORY.getObjectScene(INV_BOOKING_FRANKIE) == 1) && (BF_INVENTORY.getObjectScene(INV_FRANKIE_ID) == 1)) {
+ scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy);
+ } else if ((BF_INVENTORY.getObjectScene(INV_BOOKING_GANG) == 1) && (BF_INVENTORY.getObjectScene(INV_TYRONE_ID) == 1)) {
+ scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3900;
+ scene->setAction(&scene->_sequenceManager, scene, 3900, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene390::postInit(TsAGE::SceneObjectList *OwnerList) {
+ BF_GLOBALS._sound1.play(17);
+ SceneExt::postInit();
+ setZoomPercents(105, 85, 130, 100);
+ loadScene(390);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_greenSpeaker);
+ _stripManager.addSpeaker(&_jailerSpeaker);
+ _stripManager.addSpeaker(&_shooterSpeaker);
+ _stripManager.addSpeaker(&_driverSpeaker);
+
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS.setFlag(onDuty);
+ BF_GLOBALS._bookmark = bStoppedFrankie;
+ BF_GLOBALS.clearFlag(frankInJail);
+ BF_GLOBALS.setFlag(fTalkedToBarry);
+ BF_INVENTORY.setObjectScene(INV_22_SNUB, 1);
+ }
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setPosition(Common::Point(147, 114));
+ BF_GLOBALS._player.setStrip(6);
+ BF_GLOBALS._player.changeZoom(-1);
+
+ _object2.postInit();
+ _object2.setVisage(395);
+ _object2.setStrip(2);
+ _object2.setPosition(Common::Point(38, 84));
+ _object2.fixPriority(50);
+ _object2._flag = 0;
+ _object2.setDetails(390, 10, 17, 10, 1, NULL);
+
+ _door.postInit();
+ _door.setVisage(390);
+ _door.setStrip(2);
+ _door.setPosition(Common::Point(151, 18));
+ _door.setDetails(390, 5, -1, -1, 1, NULL);
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3901;
+ setAction(&_sequenceManager, this, 3901, &BF_GLOBALS._player, NULL);
+
+ if ((BF_GLOBALS._bookmark < bLauraToParamedics) && BF_GLOBALS.getFlag(greenTaken)) {
+ _green.postInit();
+ _green.setVisage(392);
+ _green.setPosition(Common::Point(241, 164));
+ _green.fixPriority(153);
+ _green.setDetails(390, 12, -1, 13, 1, NULL);
+ _green._flag = 0;
+ }
+
+ if ((BF_GLOBALS._bookmark >= bStoppedFrankie) && !BF_GLOBALS.getFlag(frankInJail) && (BF_GLOBALS._dayNumber == 1)) {
+ _gangMember1.postInit();
+ _gangMember1.setVisage(396);
+ _gangMember1.setPosition(Common::Point(273, 169));
+ _gangMember1.fixPriority(152);
+ _gangMember1._flag = 0;
+ _gangMember1.setDetails(390, 19, -1, 20, 1, NULL);
+
+ _gangMember2.postInit();
+ _gangMember2.setVisage(396);
+ _gangMember2.setStrip(2);
+ _gangMember2.setPosition(Common::Point(241, 153));
+ _gangMember2.fixPriority(152);
+ _gangMember2._flag = 0;
+ _gangMember2.setDetails(390, 19, -1, 20, 1, NULL);
+ }
+
+ _item1.setDetails(Rect(22, 40, 77, 67), 390, 0, -1, 1, 1, NULL);
+ _bookingForms.setDetails(Rect(89, 46, 110, 65), 390, 2, -1, -1, 1, NULL);
+ _item3.setDetails(Rect(193, 0, 320, 165), 390, 4, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(0, 0, 320, 170), 390, 7, -1, -1, 1, NULL);
+}
+
+void Scene390::signal() {
+ switch (_sceneMode) {
+ case 3900:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(385);
+ break;
+ case 3901:
+ case 3904:
+ if ((BF_INVENTORY.getObjectScene(INV_22_SNUB) == 410) && BF_GLOBALS._sceneObjects->contains(&_gangMember1)) {
+ _sceneMode = 3906;
+ setAction(&_sequenceManager, this, 3906, &BF_GLOBALS._player, &_object2, NULL);
+ } else if ((BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 370) && BF_GLOBALS._sceneObjects->contains(&_green)) {
+ _sceneMode = 3906;
+ setAction(&_sequenceManager, this, 3906, &BF_GLOBALS._player, &_object2, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 3902:
+ SceneItem::display2(390, 3);
+
+ _object3.postInit();
+ _object3.setVisage(390);
+ _object3.setPosition(Common::Point(250, 60));
+ _object3.fixPriority(255);
+ _object3.setDetails(390, 8, -1, 9, 2, NULL);
+
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3903:
+ SceneItem::display2(390, 18);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3905:
+ T2_GLOBALS._uiElements.addScore(30);
+ _object2.remove();
+ BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3906:
+ BF_GLOBALS._deathReason = 18;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ }
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h
new file mode 100644
index 0000000000..2982fd3306
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes3.h
@@ -0,0 +1,893 @@
+/* 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 TSAGE_BLUEFORCE_SCENES3_H
+#define TSAGE_BLUEFORCE_SCENES3_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene300: public SceneExt {
+ /* Objects */
+ class Object: public NamedObject {
+ public:
+ int _stripNumber;
+ public:
+ Object(int stripNumber) { _stripNumber = stripNumber; }
+
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object19: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item14: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item15: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5: public Action {
+ public:
+ virtual void signal();
+ };
+private:
+ void setup();
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ SequenceManager _sequenceManager3, _sequenceManager4;
+ NamedObject _object1;
+ FollowerObject _object2, _object3, _object4, _object5, _object6, _object7;
+ SceneObject _object8, _object9, _object10;
+ NamedObject _object11, _object12;
+ Object _object13, _object14, _object15, _object16;
+ NamedObject _object17, _object18;
+ Object19 _object19;
+ Item1 _item1;
+ Item2 _item2;
+ NamedHotspot _item3, _item4, _item5, _item6, _item7;
+ NamedHotspot _item8, _item9, _item10, _item11;
+ NamedHotspot _item12, _item13;
+ Item14 _item14;
+ Item15 _item15;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerSutter _sutterSpeaker;
+ SpeakerDoug _dougSpeaker;
+ SpeakerJakeNoHead _jakeSpeaker;
+ TimerExt _timer;
+ int _field2760, _field2762;
+
+ Scene300();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene315: public SceneExt {
+ /* Objects */
+ class BulletinMemo: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object2: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class ATFMemo: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Barry: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SutterSlot: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Sign: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class BulletinBoard: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class CleaningKit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class BriefingMaterial: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class WestExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SouthWestExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerSutter _sutterSpeaker;
+ SpeakerHarrison _harrisonSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerJailer _jailerSpeaker;
+ Barry _barry;
+ SutterSlot _sutterSlot;
+ NamedHotspot _item3;
+ Sign _sign;
+ BulletinBoard _bulletinBoard;
+ BulletinMemo _bulletinMemo;
+ Object2 _object2;
+ ATFMemo _atfMemo;
+ SceneObject _object4, _object5, _object6;
+ SceneObject _object7, _object8, _object9;
+ NamedHotspot _item6, _item7, _item8, _item9;
+ NamedHotspot _item10, _item11, _item12, _item13;
+ CleaningKit _cleaningKit;
+ BriefingMaterial _briefingMaterial;
+ WestExit _westExit;
+ SouthWestExit _swExit;
+ Action1 _action1;
+ int _field1390;
+ int _stripNumber;
+ int _field1398;
+ int _field1B60, _field1B62, _field1B64;
+ int _field1B66, _field1B6C, _field139C;
+ bool _field1B68, _field1B6A;
+ CursorType _currentCursor;
+
+ Scene315();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene325: public SceneExt {
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerPSutter _PSutterSpeaker;
+ Item1 _item1;
+ NamedObject _object1, _object2, _object3, _object4, _object5;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene330: public SceneExt {
+ class Timer1: public Timer {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ NamedObject _object1;
+ SceneObject _object2;
+ ASoundExt _sound1, _sound2;
+ Timer1 _timer;
+ int _seqNumber;
+
+ Scene330();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene340: public PalettedScene {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8: public Action {
+ public:
+ virtual void signal();
+ void process(Event &event);
+ };
+
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class WestExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SouthWestExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class NorthExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Child: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Woman: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Harrison: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Timers */
+ class Timer2: public Timer {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ Child _child;
+ Woman _woman;
+ Harrison _harrison;
+ SceneObject _object4, _object5;
+ Item1 _item1;
+ NamedHotspot _item2, _item3;
+ WestExit _westExit;
+ SouthWestExit _swExit;
+ NorthExit _northExit;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Action8 _action8;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJordan _jordanSpeaker;
+ SpeakerSkipB _skipBSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerHarrison _harrisonSpeaker;
+ ASoundExt _sound1, _sound2;
+ TimerExt _timer1;
+ Timer2 _timer2;
+ int _seqNumber1, _field2652, _field2654;
+
+ Scene340();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene342: public PalettedScene {
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class WestExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SouthWestExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class NorthExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Timers */
+ class Timer1: public Timer {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ Lyle _lyle;
+ NamedObject _object2;
+ SceneObject _object3, _object4;
+ Item1 _item1;
+ NamedHotspot _item2, _item3;
+ WestExit _westExit;
+ SouthWestExit _swExit;
+ NorthExit _northExit;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ ASoundExt _sound1;
+ Timer1 _timer1;
+ int _field1A1A;
+
+ Scene342();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene350: public SceneExt {
+ /* Items */
+ class FireBox: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Yacht: public NamedHotspot {
+ public:
+ bool _flag;
+
+ virtual Common::String getClassName() { return "Scene350_Item6"; }
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SouthWestExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Hook: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class FireboxInset: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Timers */
+ class Timer1: public Timer {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ NamedObject _harrison;
+ SceneObject _yachtDoor;
+ BackgroundSceneObject _yachtBody;
+ Hook _hook;
+ FireboxInset _fireBoxInset;
+ NamedHotspot _item1, _item2, _item3, _item4;
+ FireBox _fireBox;
+ Yacht _yacht;
+ SouthWestExit _swExit;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerHarrison _harrisonSpeaker;
+ ASoundExt _sound1, _sound2;
+ Timer1 _timer1;
+ int _field1D44, _field1D46;
+
+ Scene350();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void checkGun();
+};
+
+class Scene355: public PalettedScene {
+ /* Objects */
+ class Doorway: public NamedObject {
+ public:
+ int _v1, _v2, _v3;
+
+ Doorway() { _v1 = _v2 = _v3 = 0; }
+ virtual Common::String getClassName() { return "Scene355_Doorway"; }
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Locker: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class LockerInset: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object5: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Green: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Lyle: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object8: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item1: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item3: public SceneHotspotExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item4: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Pouch: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item11: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class RentalExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerHarrison _harrisonSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ SpeakerGreen _greenSpeaker;
+ NamedObject _harrison;
+ Doorway _doorway;
+ Locker _locker;
+ LockerInset _lockerInset;
+ Object5 _object5;
+ Green _green;
+ Lyle _lyle;
+ Object8 _object8;
+ NamedObject _object9, _object10, _object11;
+ Item1 _item1;
+ Item2 _item2;
+ Item3 _item3;
+ Item4 _item4;
+ Pouch _pouch;
+ NamedHotspot _item6, _item7, _item8;
+ NamedHotspot _item9, _item10;
+ Item11 _item11;
+ RentalExit _rentalExit;
+ ASoundExt _sound1, _sound2, _sound3;
+ Action1 _action1;
+ Action2 _action2;
+ int _nextSceneMode;
+ bool _modeFlag;
+
+ Scene355();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+
+ void setMode(bool mode, int sceneMode);
+};
+
+class Scene360: public SceneExt {
+ /* Objects */
+ class SlidingDoor: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Window: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object4: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class BsseballCards: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object6: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object7: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item1: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item3: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Barometer: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerHarrison _harrisonSpeaker;
+ SpeakerGreen _greenSpeaker;
+ SlidingDoor _slidingDoor;
+ SceneObject _object2;
+ Window _window;
+ Object4 _object4;
+ BsseballCards _baseballCards;
+ Object6 _object6;
+ Object7 _object7;
+ Item1 _item1;
+ Item2 _item2;
+ Item3 _item3;
+ Barometer _barometer;
+ Action1 _action1;
+ ASound _sound1;
+ int _field380;
+
+ Scene360();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene370: public SceneExt {
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item6: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class GreensGun: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Green: public NamedObject2 {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Harrison: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Laura: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Speakers */
+ class SpeakerLaura370: public SpeakerLaura {
+ public:
+ virtual void setText(const Common::String &msg);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerLaura _lauraSpeaker;
+ SpeakerLauraHeld _lauraHeldSpeaker;
+ SpeakerGreen _greenSpeaker;
+ SpeakerHarrison _harrisonSpeaker;
+ GreensGun _greensGun;
+ Green _green;
+ Harrison _harrison;
+ Laura _laura;
+ NamedObject _object5;
+ SceneObject _object6;
+ Item1 _item1;
+ NamedHotspot _item2, _item3, _item4, _item5;
+ Item6 _item6;
+ Exit _exit;
+ ASound _sound1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene380: public SceneExt {
+ /* Objects */
+ class Vechile: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Door: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ Vechile _vechile;
+ Door _door;
+ NamedHotspot _item1, _item2, _item3, _item4, _item5;
+ NamedHotspot _item6, _item7, _item8, _item9;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene385: public SceneExt {
+ /* Items */
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Door: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Jim: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Dezi: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ Action2 _action2;
+ Door _door;
+ Jim _jim;
+ Dezi _dezi;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJim _jimSpeaker;
+ SpeakerDezi _deziSpeaker;
+ SpeakerJake385 _jake385Speaker;
+ NamedHotspot _item1, _item2, _item3, _item4, _item5;
+ Exit _exit;
+ int _talkAction, _jimFlag;
+
+ Scene385();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene390: public SceneExt {
+ /* Items */
+ class BookingForms: public NamedHotspotExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Green: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object2: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object3: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class GangMember1: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class GangMember2: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Door: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerGreen _greenSpeaker;
+ SpeakerJailer _jailerSpeaker;
+ SpeakerDriver _driverSpeaker;
+ SpeakerShooter _shooterSpeaker;
+ Action1 _action1;
+ Green _green;
+ Object2 _object2;
+ Object3 _object3;
+ GangMember1 _gangMember1;
+ GangMember2 _gangMember2;
+ Door _door;
+ NamedHotspot _item1, _item3, _item4;
+ BookingForms _bookingForms;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes4.cpp b/engines/tsage/blue_force/blueforce_scenes4.cpp
new file mode 100644
index 0000000000..814a2fff7f
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes4.cpp
@@ -0,0 +1,1674 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes4.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 410 - Traffic Stop Gang Members
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene410::Action1::signal() {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (scene->_field1FB6++) {
+ case 0:
+ if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
+ setDelay(3);
+ } else {
+ scene->_sceneMode = 4101;
+ scene->_stripManager.start(4103, scene);
+ }
+ break;
+ case 1:
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4104, scene);
+ break;
+ case 2:
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4105, scene);
+ break;
+ default:
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4106, scene);
+ break;
+ }
+}
+
+void Scene410::Action2::signal() {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+ BF_GLOBALS._player.disableControl();
+
+ switch (scene->_talkCount++) {
+ case 0:
+ scene->_sceneMode = 4105;
+ scene->_stripManager.start(BF_GLOBALS.getFlag(fTalkedShooterNoBkup) ? 4123 : 4107, scene);
+ break;
+ case 1:
+ scene->_sceneMode = 4110;
+ scene->_stripManager.start(4102, scene);
+ break;
+ case 2:
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4108, scene);
+ break;
+ case 3:
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4109, scene);
+ break;
+ case 4:
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4110, scene);
+ break;
+ default:
+ SceneItem::display(410, 11, SET_WIDTH, 300,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 10,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 13, SET_EXT_BGCOLOR, 82,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene410::Action3::signal() {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+ if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager1, scene, 4102, &scene->_passenger, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS.setFlag(fTalkedShooterNoBkup);
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4107, scene);
+ }
+}
+
+void Scene410::Action4::signal() {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (scene->_field1FC4 == 0) {
+ ADD_PLAYER_MOVER(114, 133);
+ } else {
+ ADD_PLAYER_MOVER(195, 139);
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(scene->_passenger._position);
+ setDelay(3);
+ break;
+ case 2:
+ setDelay(3);
+ break;
+ case 3:
+ if (BF_GLOBALS.getFlag(fCalledBackup))
+ scene->setAction(&scene->_action2);
+ else
+ scene->setAction(&scene->_action3);
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene410::Action5::signal() {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (scene->_field1FC4 == 0) {
+ ADD_PLAYER_MOVER(114, 133);
+ } else {
+ ADD_PLAYER_MOVER(195, 139);
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(scene->_passenger._position);
+ setDelay(3);
+ break;
+ case 2:
+ setDelay(3);
+ break;
+ case 3:
+ if (BF_GLOBALS.getFlag(fCalledBackup))
+ scene->setAction(&scene->_action2);
+ else
+ scene->setAction(&scene->_action3);
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene410::Action6::signal() {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (scene->_field1FC4 == 0) {
+ ADD_PLAYER_MOVER(114, 133);
+ } else {
+ ADD_PLAYER_MOVER(126, 99);
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(scene->_driver._position);
+ setDelay(3);
+ break;
+ case 2:
+ setDelay(3);
+ break;
+ case 3:
+ if (BF_GLOBALS.getFlag(fCalledBackup))
+ scene->setAction(&scene->_action1);
+ else
+ scene->setAction(&scene->_action4);
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene410::Action7::signal() {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(2);
+ break;
+ case 1:
+ BF_GLOBALS._bookmark = bStoppedFrankie;
+ BF_GLOBALS.set2Flags(f1098Frankie);
+ BF_GLOBALS.clearFlag(f1098Marina);
+ scene->_stripManager.start(4113, this);
+ break;
+ case 2:
+ case 4:
+ setDelay(2);
+ break;
+ case 3:
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
+ scene->setAction(&scene->_sequenceManager1, this, 4112, &scene->_driver, &scene->_passenger,
+ &scene->_harrison, NULL);
+ break;
+ case 5:
+ T2_GLOBALS._uiElements.addScore(30);
+ setAction(&scene->_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL);
+ BF_GLOBALS._player.disableControl();
+ break;
+ case 6:
+ scene->_sceneMode = 3;
+ scene->signal();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene410::Motorcycle::startAction(CursorType action, Event &event) {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(fCalledBackup)) {
+ scene->_sceneMode = 4103;
+ scene->signal();
+ } else if (BF_GLOBALS.getFlag(fSearchedTruck) && !BF_GLOBALS._sceneObjects->contains(&scene->_harrison)) {
+ scene->_sceneMode = 4103;
+ scene->signal();
+ } else if (scene->_field1FBC != 0) {
+ SceneItem::display2(410, 12);
+ } else {
+ scene->_sceneMode = 4103;
+ scene->signal();
+ }
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene410::TruckFront::startAction(CursorType action, Event &event) {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if ((BF_GLOBALS._bookmark < bStoppedFrankie) && (!scene->_field1FBC || !scene->_field1FBA))
+ break;
+ else if (BF_GLOBALS.getFlag(fSearchedTruck))
+ SceneItem::display2(410, 13);
+ else if (BF_GLOBALS.getFlag(fGangInCar)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ scene->_sceneMode = 4118;
+ scene->signal();
+ } else {
+ scene->setAction(&scene->_action7);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene410::Driver::startAction(CursorType action, Event &event) {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(fCalledBackup)) {
+ if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
+ scene->setAction(&scene->_action4);
+ } else {
+ SceneItem::display2(410, 7);
+ }
+ } else if (!scene->_field1FBC) {
+ SceneItem::display2(410, 7);
+ } else if (!scene->_field1FC0) {
+ scene->_sceneMode = 4124;
+ scene->_field1FC0 = 1;
+ T2_GLOBALS._uiElements.addScore(30);
+ scene->signal();
+ } else {
+ break;
+ }
+ return true;
+ case CURSOR_TALK:
+ BF_GLOBALS._player.setAction(&scene->_action6);
+ return true;
+ case INV_HANDCUFFS:
+ if (BF_GLOBALS.getFlag(fCalledBackup)) {
+ if ((scene->_talkCount < 5) || (scene->_field1FB6 < 1) || (scene->_field1FBC != 0))
+ break;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4123;
+ scene->_stripManager.start(4125, scene);
+ scene->_field1FBC = 1;
+ T2_GLOBALS._uiElements.addScore(30);
+ } else {
+ if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
+ scene->setAction(&scene->_action4);
+ } else {
+ break;
+ }
+ }
+ return true;
+ case INV_TICKET_BOOK:
+ if (!BF_GLOBALS.getFlag(fDriverOutOfTruck)) {
+ return startAction(CURSOR_TALK, event);
+ } else if (!scene->_field1FC4) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_passenger, &BF_GLOBALS._player, NULL);
+ } else if ((scene->_field1FBC != 0) || (scene->_field1FC2 != 0)) {
+ break;
+ } else {
+ scene->_field1FC2 = 1;
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4127;
+ scene->setAction(&scene->_sequenceManager1, scene, 4127, &BF_GLOBALS._player, &scene->_driver, NULL);
+ }
+ return true;
+ case INV_MIRANDA_CARD:
+ if (scene->_field1FBC == 0)
+ return false;
+
+ if (BF_GLOBALS.getFlag(readFrankRights)) {
+ SceneItem::display2(390, 15);
+ } else {
+ BF_GLOBALS.setFlag(readFrankRights);
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+
+ // TODO: Original code pushes a copy of the entirety of object1 onto stack
+ scene->setAction(&scene->_sequenceManager1, scene, 4126, &BF_GLOBALS._player, &scene->_driver, NULL);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene410::Passenger::startAction(CursorType action, Event &event) {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(fCalledBackup)) {
+ if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
+ scene->setAction(&scene->_action3);
+ } else {
+ SceneItem::display2(410, 5);
+ }
+ } else if (!scene->_field1FBA) {
+ SceneItem::display2(410, 5);
+ } else if (!scene->_field1FBE) {
+ scene->_sceneMode = 4121;
+ scene->_field1FBE = 1;
+ T2_GLOBALS._uiElements.addScore(50);
+ scene->signal();
+ } else {
+ break;
+ }
+ return true;
+ case CURSOR_TALK:
+ scene->setAction(&scene->_action5);
+ return true;
+ case INV_HANDCUFFS:
+ if (BF_GLOBALS.getFlag(fCalledBackup)) {
+ if ((scene->_talkCount < 5) || (scene->_field1FBA != 0))
+ break;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9;
+ Common::Point destPos(195, 139);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, scene);
+ } else if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
+ scene->setAction(&scene->_action3);
+ } else {
+ break;
+ }
+ return true;
+ case INV_MIRANDA_CARD:
+ if (!scene->_field1FBA)
+ break;
+
+ if (BF_GLOBALS.getFlag(readFrankRights)) {
+ SceneItem::display2(390, 15);
+ } else {
+ BF_GLOBALS.setFlag(readFrankRights);
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 0;
+ scene->setAction(&scene->_sequenceManager1, scene, 4125, &BF_GLOBALS._player,
+ &scene->_passenger, NULL);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene410::Harrison::startAction(CursorType action, Event &event) {
+ Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (BF_GLOBALS._bookmark == bStoppedFrankie) {
+ if (BF_GLOBALS.getFlag(fSearchedTruck)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8;
+
+ Common::Point destPos(147, 143);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, scene);
+ } else {
+ SceneItem::display2(350, 13);
+ }
+ } else if ((scene->_field1FBA != 0) && (scene->_field1FBC != 0)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4112;
+ scene->_stripManager.start(4113, scene);
+ BF_GLOBALS._bookmark = bStoppedFrankie;
+ BF_GLOBALS.set2Flags(f1098Frankie);
+ BF_GLOBALS.clearFlag(f1098Marina);
+ } else if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) ||
+ (!scene->_field1FBA && (scene->_talkCount < 5))) {
+ SceneItem::display2(350, 13);
+ } else if (!scene->_field1FBA) {
+ if (scene->_field1FBA)
+ error("Error - want to cuff shooter, but he's cuffed already");
+
+ BF_GLOBALS._player.disableControl();
+ scene->_field1FBA = 1;
+ scene->_field1FBE = 1;
+ BF_GLOBALS._walkRegions.proc2(22);
+ scene->_sceneMode = 4122;
+ scene->_stripManager.start(4112, scene);
+ } else if (scene->_field1FB6 < 1) {
+ break;
+ } else if (scene->_field1FBC != 0) {
+ error("Error - want to cuff driver, but he's cuffed already");
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_field1FBC = 1;
+ scene->_field1FC0 = 1;
+ BF_GLOBALS._walkRegions.proc2(22);
+ scene->_sceneMode = 4109;
+ scene->_stripManager.start(4112, scene);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+Scene410::Scene410(): SceneExt() {
+ _field1FB6 = _talkCount = _field1FBA = _field1FBC = 0;
+ _field1FBE = _field1FC0 = _field1FC2 = _field1FC4 = 0;
+}
+
+void Scene410::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field1FB6);
+ s.syncAsSint16LE(_talkCount);
+ s.syncAsSint16LE(_field1FBA);
+ s.syncAsSint16LE(_field1FBC);
+ s.syncAsSint16LE(_field1FBE);
+ s.syncAsSint16LE(_field1FC0);
+ s.syncAsSint16LE(_field1FC2);
+ s.syncAsSint16LE(_field1FC4);
+}
+
+void Scene410::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(410);
+ setZoomPercents(74, 75, 120, 100);
+
+ if (BF_GLOBALS._sceneManager._previousScene != 60)
+ _sound1.fadeSound(11);
+ BF_GLOBALS._driveToScene = 64;
+ BF_GLOBALS._mapLocationId = 64;
+ BF_GLOBALS.setFlag(fArrivedAtGangStop);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_harrisonSpeaker);
+ _stripManager.addSpeaker(&_shooterSpeaker);
+ _stripManager.addSpeaker(&_driverSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(1341);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.changeAngle(90);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setPosition(Common::Point(114, 133));
+ BF_GLOBALS._player.changeZoom(-1);
+
+ _motorcycle.setDetails(8, 410, 15, -1, -1, 1);
+
+ _passenger.postInit();
+ _passenger.setVisage(415);
+ _passenger.setStrip(1);
+ _passenger.setPosition(Common::Point(278, 92));
+ _passenger.setDetails(410, 4, -1, 5, 1, NULL);
+
+ _driver.postInit();
+ _driver.setVisage(416);
+ _driver.setStrip(2);
+ _driver.setPosition(Common::Point(244, 85));
+ _driver.setDetails(410, 6, -1, 7, 1, NULL);
+ _driver.changeZoom(-1);
+
+ _object5.postInit();
+ _object5.setVisage(410);
+ _object5.setStrip(2);
+ _object5.setPosition(Common::Point(282, 96));
+
+ _object6.postInit();
+ _object6.setVisage(410);
+ _object6.setStrip(4);
+ _object6.setPosition(Common::Point(240, 43));
+
+ _truckFront.setDetails(6, 410, 3, -1, -1, 1);
+ _truckBack.setDetails(7, 410, 3, -1, -1, 1);
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 415:
+ BF_GLOBALS.setFlag(fSearchedTruck);
+ BF_GLOBALS._player.setPosition(Common::Point(210, 90));
+
+ _passenger.remove();
+ _driver.remove();
+ BF_GLOBALS._walkRegions.proc1(21);
+ BF_GLOBALS._walkRegions.proc1(22);
+
+ _harrison.postInit();
+ _harrison.setVisage(343);
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+ _harrison.animate(ANIM_MODE_1, NULL);
+ _harrison.setDetails(350, 12, 13, 14, 1, NULL);
+ _harrison.setPosition(Common::Point(97, 185));
+ _harrison.changeZoom(-1);
+
+ _patrolCar.postInit();
+ _patrolCar.setVisage(410);
+ _patrolCar.setDetails(410, 8, 9, 10, 1, NULL);
+ _patrolCar.fixPriority(148);
+ _patrolCar.setPosition(Common::Point(39, 168));
+
+ _field1FC4 = 1;
+ _sceneMode = 0;
+ signal();
+ break;
+ case 60:
+ if (BF_GLOBALS.getFlag(fSearchedTruck)) {
+ _passenger.remove();
+ _driver.remove();
+ _sceneMode = 0;
+ } else {
+ _field1FC4 = BF_GLOBALS._v50CC8;
+ _field1FBA = BF_GLOBALS._v50CC2;
+ _talkCount = BF_GLOBALS._v50CC6;
+ _field1FB6 = BF_GLOBALS._v50CC4;
+
+ _passenger.setVisage(418);
+ _passenger.setStrip(6);
+ _passenger.setPosition(Common::Point(227, 137));
+
+ if (_talkCount > 0) {
+ _passenger.setVisage(415);
+ _passenger.setStrip(2);
+ _passenger.setFrame(5);
+ }
+ if (_field1FBA) {
+ _passenger.setVisage(415);
+ _passenger.setStrip(6);
+ _passenger.setFrame(8);
+ }
+
+ BF_GLOBALS._walkRegions.proc1(16);
+ if (BF_GLOBALS.getFlag(fDriverOutOfTruck)) {
+ _driver.setVisage(417);
+ _driver.setStrip(1);
+ _driver.setPosition(Common::Point(152, 97));
+
+ BF_GLOBALS._walkRegions.proc1(7);
+ }
+
+ if (BF_GLOBALS.getFlag(fCalledBackup)) {
+ BF_GLOBALS._walkRegions.proc1(21);
+ BF_GLOBALS._walkRegions.proc1(22);
+
+ _harrison.postInit();
+ _harrison.setVisage(343);
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+ _harrison.animate(ANIM_MODE_1, NULL);
+ _harrison.setDetails(350, 12, 13, 14, 1, NULL);
+ BF_GLOBALS._sceneItems.addBefore(&_driver, &_harrison);
+
+ _harrison.setPosition(Common::Point(-10, 124));
+ _harrison.changeZoom(-1);
+
+ _patrolCar.postInit();
+ _patrolCar.setVisage(410);
+ _patrolCar.setDetails(410, 8, 9, 10, 1, NULL);
+ _patrolCar.fixPriority(148);
+
+ if (_field1FC4) {
+ _harrison.setPosition(Common::Point(108, 112));
+ _patrolCar.fixPriority(148);
+ _patrolCar.setPosition(Common::Point(39, 168));
+
+ _sceneMode = 0;
+ } else {
+ _sceneMode = 4104;
+ }
+ } else {
+ _sceneMode = 0;
+ }
+
+ _field1FC4 = 1;
+ }
+ break;
+ case 50:
+ default:
+ BF_GLOBALS.setFlag(onDuty);
+ _sound1.play(21);
+ _sceneMode = 4100;
+ break;
+ }
+
+ signal();
+
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 410, 0, 1, 2, 1, NULL);
+}
+
+void Scene410::signal() {
+ switch (_sceneMode) {
+ case 1:
+ BF_GLOBALS.set2Flags(f1097Frankie);
+ BF_GLOBALS.clearFlag(f1097Marina);
+
+ BF_GLOBALS._v50CC8 = _field1FC4;
+ BF_GLOBALS._v50CC2 = _field1FBA;
+ BF_GLOBALS._v50CC6 = _talkCount;
+ BF_GLOBALS._v50CC4 = _field1FB6;
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 2:
+ BF_GLOBALS._deathReason = 3;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 3:
+ BF_GLOBALS._sceneManager.changeScene(415);
+ break;
+ case 5:
+ BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 315);
+ _sceneMode = 0;
+ BF_GLOBALS.set2Flags(f1015Frankie);
+ BF_GLOBALS.clearFlag(f1015Marina);
+ signal();
+ break;
+ case 6:
+ BF_INVENTORY.setObjectScene(INV_22_SNUB, 1);
+ BF_INVENTORY.setObjectScene(INV_FRANKIE_ID, 1);
+ BF_GLOBALS.set2Flags(f1027Frankie);
+ BF_GLOBALS.clearFlag(f1027Marina);
+ _sceneMode = 0;
+ signal();
+ break;
+ case 7:
+ BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 1);
+ signal();
+ break;
+ case 8:
+ BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._player.changeAngle(225);
+ _harrison.changeAngle(45);
+ _sceneMode = 4114;
+ _stripManager.start(4120, this);
+ break;
+ case 9:
+ _sceneMode = 4106;
+ _stripManager.start(4111, this);
+ _field1FBA = 1;
+ BF_GLOBALS.setFlag(fCuffedFrankie);
+ T2_GLOBALS._uiElements.addScore(30);
+ break;
+ case 10:
+ BF_GLOBALS._player.updateAngle(_harrison._position);
+ _sceneMode = 0;
+ break;
+ case 4100:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4100, &_passenger, &_object5, NULL);
+ BF_GLOBALS._walkRegions.proc1(16);
+ break;
+ case 4101:
+ // Driver gets out of the car
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4101, &_driver, &_object6, NULL);
+ BF_GLOBALS.setFlag(fDriverOutOfTruck);
+ BF_GLOBALS._walkRegions.proc1(7);
+ break;
+ case 4103:
+ // Click on moto to ask for backup
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1;
+ setAction(&_sequenceManager1, this, 4103, &BF_GLOBALS._player, NULL);
+ break;
+ case 4104:
+ // After call for backup, patrol car is coming
+ _field1FC4 = 1;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4104, &_patrolCar, &_harrison, NULL);
+ break;
+ case 4105:
+ // Second guy gets nervous
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4105, &_passenger, NULL);
+ break;
+ case 4106:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4119;
+ setAction(&_sequenceManager1, this, 4106, &_passenger, NULL);
+ break;
+ case 4107:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 5;
+ setAction(&_sequenceManager1, this, 4107, &BF_GLOBALS._player, &_passenger, NULL);
+ break;
+ case 4108:
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
+ BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.proc2(16);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4108, &_harrison, NULL);
+ break;
+ case 4109:
+ if ((BF_GLOBALS._player._position.x > 116) && (BF_GLOBALS._player._position.x != 195) &&
+ (BF_GLOBALS._player._position.y != 139)) {
+ ADD_PLAYER_MOVER(195, 139);
+ }
+
+ BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4109, &_driver, &_harrison, NULL);
+ break;
+ case 4110:
+ // Harrisson takes care of the driver
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4110, &_harrison, &_driver, NULL);
+ break;
+ case 4112:
+ BF_GLOBALS.setFlag(fGangInCar);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4108;
+ setAction(&_sequenceManager1, this, 4112, &_driver, &_passenger, &_harrison, NULL);
+ break;
+ case 4114:
+ BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4116;
+ setAction(&_sequenceManager1, this, 4114, &_harrison, &_patrolCar, NULL);
+ break;
+ case 4116:
+ BF_GLOBALS._walkRegions.proc2(21);
+ BF_GLOBALS._walkRegions.proc2(22);
+ _harrison.remove();
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4116, &_patrolCar, NULL);
+ break;
+ case 4118:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3;
+ setAction(&_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL);
+ break;
+ case 4119:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 4107;
+ setAction(&_sequenceManager1, this, 4119, &BF_GLOBALS._player, &_passenger, NULL);
+ break;
+ case 4121:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 6;
+ setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_passenger, NULL);
+ break;
+ case 4122:
+ BF_GLOBALS._walkRegions.proc2(22);
+ BF_INVENTORY.setObjectScene(INV_22_SNUB, 0);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 4122, &_passenger, &_harrison, NULL);
+ break;
+ case 4123:
+ BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 0);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 5;
+ setAction(&_sequenceManager1, this, 4123, &_driver, &BF_GLOBALS._player, NULL);
+ break;
+ case 4124:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 7;
+ setAction(&_sequenceManager1, this, 4124, &_driver, &BF_GLOBALS._player, NULL);
+ break;
+ case 4127:
+ SceneItem::display2(410, 16);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 0:
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene410::process(Event &event) {
+ // Check for gun being clicked on player
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
+ BF_GLOBALS._player.contains(event.mousePos) && !BF_GLOBALS.getFlag(fCalledBackup)) {
+ if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
+ if (!_action) {
+ event.handled = true;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager1, this, 4102, &_passenger, &BF_GLOBALS._player, NULL);
+ }
+ } else if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
+ if (!_action) {
+ _sceneMode = 1;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager1, this, 4120, &_passenger, &BF_GLOBALS._player, NULL);
+ }
+ }
+ }
+
+ if (!event.handled)
+ SceneExt::process(event);
+}
+
+void Scene410::dispatch() {
+ SceneExt::dispatch();
+ if ((_sceneMode == 4112) || (_sceneMode == 4101)) {
+ _harrison.updateAngle(_driver._position);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 415 - Searching Truck
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene415::GunInset::startAction(CursorType action, Event &event) {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (BF_GLOBALS.getFlag(fGotAutoWeapon)) {
+ FocusObject::startAction(action, event);
+ } else {
+ remove();
+ scene->_gunAndWig.remove();
+ }
+ return true;
+ } else {
+ return FocusObject::startAction(action, event);
+ }
+}
+
+bool Scene415::GunAndWig::startAction(CursorType action, Event &event) {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ NamedObject::startAction(action, event);
+ BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 1);
+ BF_INVENTORY.setObjectScene(INV_WIG, 1);
+ BF_GLOBALS.setFlag(fGotAutoWeapon);
+ T2_GLOBALS._uiElements.addScore(30);
+
+ remove();
+ return true;
+ case INV_FOREST_RAP:
+ if (scene->_fieldE14)
+ break;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4126, scene);
+ T2_GLOBALS._uiElements.addScore(50);
+ scene->_fieldE14 = true;
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene415::BulletsInset::startAction(CursorType action, Event &event) {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (BF_GLOBALS.getFlag(fGotAutoWeapon)) {
+ FocusObject::startAction(action, event);
+ } else {
+ remove();
+ scene->_theBullets.remove();
+ }
+ return true;
+ } else {
+ return FocusObject::startAction(action, event);
+ }
+}
+
+bool Scene415::DashDrawer::startAction(CursorType action, Event &event) {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) {
+ scene->showBullets();
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene415::TheBullets::startAction(CursorType action, Event &event) {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ NamedObject::startAction(action, event);
+ BF_INVENTORY.setObjectScene(INV_22_BULLET, 1);
+ BF_GLOBALS.setFlag(fGotBulletsFromDash);
+ T2_GLOBALS._uiElements.addScore(30);
+
+ remove();
+ scene->_dashDrawer.remove();
+ return true;
+ case INV_FOREST_RAP:
+ if (scene->_fieldE16) {
+ SceneItem::display2(415, 35);
+ return true;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(4122, scene);
+ T2_GLOBALS._uiElements.addScore(50);
+ scene->_fieldE16 = true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene415::Lever::startAction(CursorType action, Event &event) {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (BF_GLOBALS.getFlag(fGotAutoWeapon)) {
+ SceneItem::display2(415, 20);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_object6, NULL);
+ }
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene415::Scene415(): SceneExt() {
+ _fieldE14 = _fieldE16 = false;
+}
+
+void Scene415::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_fieldE14);
+ s.syncAsSint16LE(_fieldE16);
+}
+
+void Scene415::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(415);
+
+ _stripManager.addSpeaker(&_jakeRadioSpeaker);
+
+ _dashDrawer.postInit();
+ _dashDrawer.setVisage(411);
+ _dashDrawer.setStrip(3);
+ _dashDrawer.setPosition(Common::Point(151, 97));
+ _dashDrawer.setDetails(415, 22, -1, -1, 1, NULL);
+
+ _object6.postInit();
+ _object6.setVisage(419);
+ _object6.setStrip(1);
+ _object6.setPosition(Common::Point(306, 116));
+ _object6.fixPriority(80);
+
+ _windowLever.setDetails(16, 415, 25, -1, 26, 1);
+ _item7.setDetails(17, 415, 32, -1, 33, 1);
+ _seatBelt.setDetails(14, 415, 29, -1, 30, 1);
+ _lever.setDetails(19, 415, 23, 24, -1, 1);
+ _seat.setDetails(18, 415, 3, 4, 2, 1);
+ _dashboard.setDetails(20, 415, 11, 12, 19, 1);
+ _steeringWheel.setDetails(15, 415, 5, 6, 7, 1);
+ _horn.setDetails(31, 415, 8, 9, 10, 1);
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 415, 0, 1, 2, 1, NULL);
+
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+
+ signal();
+}
+
+void Scene415::signal() {
+ switch (_sceneMode) {
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(410);
+ break;
+ case 2:
+ showGunAndWig();
+ _sceneMode = 0;
+ signal();
+ break;
+ case 0:
+ default:
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+void Scene415::dispatch() {
+ SceneExt::dispatch();
+ if (BF_GLOBALS.getFlag(fGotAutoWeapon) && BF_GLOBALS.getFlag(fGotBulletsFromDash)) {
+ _sceneMode = 1;
+ signal();
+ }
+}
+
+void Scene415::showBullets() {
+ _bulletsInset.postInit();
+ _bulletsInset.setVisage(411);
+ _bulletsInset.setStrip(1);
+ _bulletsInset.setPosition(Common::Point(158, 100));
+ _bulletsInset.setDetails(415, -1, -1, -1);
+
+ _theBullets.postInit();
+ _theBullets.setVisage(411);
+ _theBullets.setStrip(1);
+ _theBullets.setFrame(2);
+ _theBullets.setPosition(Common::Point(184, 86));
+ _theBullets.fixPriority(105);
+ _theBullets.setDetails(415, 16, 17, 18, 1, NULL);
+ BF_GLOBALS._sceneItems.remove(&_theBullets);
+ BF_GLOBALS._sceneItems.push_front(&_theBullets);
+}
+
+void Scene415::showGunAndWig() {
+ _gunInset.postInit();
+ _gunInset.setVisage(411);
+ _gunInset.setStrip(2);
+ _gunInset.setPosition(Common::Point(158, 100));
+ _gunInset.setDetails(415, -1, -1, -1);
+
+ _gunAndWig.postInit();
+ _gunAndWig.setVisage(411);
+ _gunAndWig.setStrip(2);
+ _gunAndWig.setFrame(2);
+ _gunAndWig.setPosition(Common::Point(159, 88));
+ _gunAndWig.fixPriority(105);
+ _gunAndWig.setDetails(415, 13, 14, 15, 1, NULL);
+
+ BF_GLOBALS._sceneItems.remove(&_gunAndWig);
+ BF_GLOBALS._sceneItems.push_front(&_gunAndWig);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 440 - Outside Alleycat Bowl
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene440::Doorway::startAction(CursorType action, Event &event) {
+ Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(440, 1);
+ return true;
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4400;
+ scene->setAction(&scene->_sequenceManager, scene, 4400, &BF_GLOBALS._player, this, &scene->_lyle, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene440::Vechile::startAction(CursorType action, Event &event) {
+ Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ SceneItem::display2(440, 3);
+ } else {
+ SceneItem::display2(440, 2);
+ }
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4403;
+ scene->setAction(&scene->_sequenceManager, scene, 4403, &BF_GLOBALS._player, &scene->_lyle, NULL);
+ } else {
+ BF_GLOBALS._sceneManager.changeScene(60);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene440::Lyle::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(440, 4);
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(440, 5);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene440::Item1::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(440, 0);
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene440::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(440);
+ setZoomPercents(75, 60, 120, 100);
+ BF_GLOBALS._sound1.fadeSound(33);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(303);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setPosition(Common::Point(203, 113));
+
+ _vechile.postInit();
+
+ _lyle.postInit();
+ _lyle.setVisage(835);
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.setPosition(Common::Point(-40, -10));
+ _lyle.changeZoom(-1);
+ _lyle.hide();
+ BF_GLOBALS._sceneItems.push_back(&_lyle);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _vechile.setVisage(444);
+ _vechile.setFrame(2);
+ _vechile.setPosition(Common::Point(147, 128));
+ _vechile.fixPriority(114);
+
+ BF_GLOBALS._player.setVisage(303);
+ BF_GLOBALS._player.setPosition(Common::Point(187, 104));
+
+ _lyle.setPosition(Common::Point(135, 128));
+ _lyle.show();
+
+ BF_GLOBALS._walkRegions.proc1(12);
+ BF_GLOBALS._walkRegions.proc1(13);
+ } else {
+ _vechile.setPosition(Common::Point(169, 121));
+ _vechile.fixPriority(117);
+
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ _vechile.setVisage(440);
+ _vechile.setStrip(1);
+
+ BF_GLOBALS._player.setVisage(304);
+ BF_GLOBALS._player.setStrip(3);
+ } else {
+ _vechile.setVisage(580);
+ _vechile.setStrip(2);
+ _vechile.setFrame(3);
+
+ BF_GLOBALS._player.setVisage(303);
+ }
+ }
+
+ BF_GLOBALS._sceneItems.push_back(&_vechile);
+ BF_GLOBALS._walkRegions.proc1(11);
+
+ _doorway.postInit();
+ _doorway.setVisage(440);
+ _doorway.setStrip(5);
+ _doorway.setPosition(Common::Point(198, 91));
+ _doorway.fixPriority(80);
+ BF_GLOBALS._sceneItems.push_back(&_doorway);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 450) {
+ _lyle.setPosition(Common::Point(143, 93));
+ _lyle.setStrip(5);
+ _lyle.fixPriority(90);
+
+ _doorway.setFrame(_doorway.getFrameCount());
+ _sceneMode = 4401;
+ setAction(&_sequenceManager, this, 4401, &BF_GLOBALS._player, &_doorway, NULL);
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _sceneMode = 4402;
+ setAction(&_sequenceManager, this, 4402, &_lyle, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+
+ _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y - 1));
+ BF_GLOBALS._sceneItems.push_back(&_item1);
+}
+
+void Scene440::signal() {
+ switch (_sceneMode) {
+ case 4400:
+ BF_GLOBALS._sceneManager.changeScene(450);
+ break;
+ case 4401:
+ BF_GLOBALS._player.fixPriority(-1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 4402:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 4403:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 450 - Inside Alleycat Bowl
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene450::Weasel::startAction(CursorType action, Event &event) {
+ Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(450, 0);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(450, 1);
+ return true;
+ case CURSOR_TALK:
+ case INV_ID:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4504;
+ if (_flag) {
+ scene->setAction(&scene->_sequenceManager, scene, 4515, &BF_GLOBALS._player, this, NULL);
+ } else {
+ ++_flag;
+ scene->setAction(&scene->_sequenceManager, scene, 4504, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ case INV_FOREST_RAP:
+ BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 450);
+ BF_GLOBALS._player.disableControl();
+ T2_GLOBALS._uiElements.addScore(30);
+
+ scene->_sceneMode = 4505;
+ scene->setAction(&scene->_sequenceManager, scene, 4505, &BF_GLOBALS._player, this,
+ &scene->_counterDoor, &scene->_object2, NULL);
+ return true;
+ default:
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+bool Scene450::PinBoy::startAction(CursorType action, Event &event) {
+ Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(450, 4);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(450, 5);
+ return true;
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4502;
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ scene->setAction(&scene->_sequenceManager, scene, 4516, &BF_GLOBALS._player, this, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager, scene, 4502, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ case INV_NAPKIN:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4509;
+ scene->setAction(&scene->_sequenceManager, scene, 4509, &BF_GLOBALS._player, this, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene450::Manager::startAction(CursorType action, Event &event) {
+ Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(450, 6);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(450, 7);
+ return true;
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(takenWeasel) && !BF_GLOBALS.getFlag(gotTrailer450)) {
+ BF_GLOBALS.setFlag(gotTrailer450);
+ scene->_sceneMode = 4517;
+ scene->setAction(&scene->_sequenceManager, scene, 4517, &BF_GLOBALS._player, this,
+ &scene->_door, NULL);
+ } else {
+ animate(ANIM_MODE_8, 1, NULL);
+
+ if (scene->_field19AC) {
+ scene->_sceneMode = 2;
+ if (scene->_field19AE) {
+ scene->_stripManager.start(4521, scene);
+ } else {
+ scene->_field19AE = 1;
+ scene->_stripManager.start(4512, scene);
+ }
+ } else {
+ scene->_sceneMode = 4506;
+ if (scene->_field19AE) {
+ scene->setAction(&scene->_sequenceManager, scene, 4518, &BF_GLOBALS._player, this, NULL);
+ } else {
+ scene->_sceneMode = 4506;
+ scene->_field19AE = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 4506, &BF_GLOBALS._player, this, NULL);
+ }
+ }
+ }
+ return true;
+ case INV_FOREST_RAP:
+ SceneItem::display2(450, 19);
+ return true;
+ case INV_NAPKIN:
+ animate(ANIM_MODE_8, 1, NULL);
+ BF_GLOBALS._player.disableControl();
+
+ if (BF_GLOBALS.getFlag(showEugeneNapkin)) {
+ SceneItem::display2(450, 16);
+ BF_GLOBALS._player.enableControl();
+ } else {
+ BF_GLOBALS.setFlag(showEugeneNapkin);
+
+ if (!BF_GLOBALS.getFlag(showEugeneID)) {
+ scene->_sceneMode = 4513;
+ scene->setAction(&scene->_sequenceManager, scene, 4513, &BF_GLOBALS._player, this, NULL);
+ } else if (BF_GLOBALS.getFlag(fMgrCallsWeasel)) {
+ SceneItem::display2(450, 16);
+ BF_GLOBALS._player.enableControl();
+ } else {
+ T2_GLOBALS._uiElements.addScore(30);
+ scene->_sceneMode = 4510;
+ BF_INVENTORY.setObjectScene(INV_NAPKIN, 450);
+ scene->setAction(&scene->_sequenceManager, scene, 4510, &BF_GLOBALS._player, this, NULL);
+ }
+ }
+ return true;
+ case INV_ID:
+ if (BF_GLOBALS.getFlag(takenWeasel)) {
+ return startAction(CURSOR_TALK, event);
+ } else {
+ animate(ANIM_MODE_8, 1, NULL);
+ BF_GLOBALS._player.disableControl();
+
+ if (!BF_GLOBALS.getFlag(showEugeneID))
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(showEugeneID);
+
+ if ((BF_GLOBALS.getFlag(showRapEugene) || BF_GLOBALS.getFlag(showEugeneNapkin)) &&
+ !BF_GLOBALS.getFlag(fMgrCallsWeasel)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ scene->_sceneMode = 4511;
+ scene->setAction(&scene->_sequenceManager, scene, 4511, &BF_GLOBALS._player, this, NULL);
+ } else {
+ scene->_sceneMode = 4506;
+ scene->setAction(&scene->_sequenceManager, scene, 4512, &BF_GLOBALS._player, this, NULL);
+ }
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene450::Exit::startAction(CursorType action, Event &event) {
+ Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
+
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4501;
+ scene->signal();
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene450::Scene450(): SceneExt() {
+ _field19AC = _field19AE = 0;
+}
+
+void Scene450::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field19AC);
+ s.syncAsSint16LE(_field19AE);
+}
+
+void Scene450::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(450);
+ setZoomPercents(110, 90, 155, 115);
+ BF_GLOBALS._sound1.fadeSound(13);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_eugeneSpeaker);
+ _stripManager.addSpeaker(&_billySpeaker);
+ _stripManager.addSpeaker(&_weaselSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setPosition(Common::Point(-30, 155));
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.disableControl();
+
+ _door.postInit();
+ _door.setVisage(450);
+ _door.setStrip(2);
+ _door.setPosition(Common::Point(72, 80));
+ _door.setDetails(450, 15, -1, 13, 1, NULL);
+
+ _counterDoor.postInit();
+ _counterDoor.setVisage(450);
+ _counterDoor.setPosition(Common::Point(39, 104));
+ _counterDoor.fixPriority(100);
+ _counterDoor.setDetails(450, 12, -1, 13, 1, NULL);
+
+ if (BF_GLOBALS._dayNumber != 3) {
+ _pinBoy.postInit();
+ _pinBoy.setVisage(463);
+ _pinBoy.setPosition(Common::Point(138, 121));
+ _pinBoy.fixPriority(100);
+ _pinBoy.setFrame(_pinBoy.getFrameCount());
+ BF_GLOBALS._sceneItems.push_back(&_pinBoy);
+ } else if (!BF_GLOBALS.getFlag(fWithLyle) || !BF_GLOBALS.getFlag(fGivenNapkin) ||
+ (BF_INVENTORY.getObjectScene(INV_CARAVAN_KEY) == 1)) {
+ _pinBoy.postInit();
+ _pinBoy.setVisage(463);
+ _pinBoy.setPosition(Common::Point(138, 121));
+ _pinBoy.fixPriority(100);
+ _pinBoy.setFrame(_pinBoy.getFrameCount());
+ BF_GLOBALS._sceneItems.push_back(&_pinBoy);
+ } else {
+ _manager.postInit();
+ _manager.setVisage(467);
+ _manager.setPosition(Common::Point(138, 121));
+ _manager.changeZoom(-1);
+ _manager.fixPriority(100);
+ BF_GLOBALS._sceneItems.push_back(&_manager);
+
+ if (!BF_GLOBALS.getFlag(takenWeasel)) {
+ _object2.postInit();
+ _object2.setVisage(469);
+ _object2.animate(ANIM_MODE_1, NULL);
+ _object2.setObjectWrapper(new SceneObjectWrapper());
+ _object2.setPosition(Common::Point(-30, 126));
+ ADD_MOVER_NULL(_object2, 27, 126);
+ _object2.changeZoom(-1);
+ _object2.setDetails(450, 2, 18, 3, 1, NULL);
+
+ BF_GLOBALS._walkRegions.proc1(4);
+
+ _weasel.postInit();
+ _weasel.setVisage(466);
+ _weasel.animate(ANIM_MODE_1, NULL);
+ _weasel.setObjectWrapper(new SceneObjectWrapper());
+ _weasel.setPosition(Common::Point(70, 80));
+ _weasel.setStrip(5);
+ _weasel.changeZoom(90);
+ _weasel.fixPriority(65);
+ _weasel._flag = 0;
+ BF_GLOBALS._sceneItems.push_back(&_weasel);
+ }
+ }
+
+ _sceneMode = 4500;
+ setAction(&_sequenceManager, this, 4500, &BF_GLOBALS._player, NULL);
+
+ _exit.setDetails(Rect(0, 100, 4, 167), 450, -1, -1, -1, 1, NULL);
+ _counter.setDetails(8, 450, 8, -1, 9, 1);
+ _shelf.setDetails(Rect(114, 10, 179, 77), 450, 10, -1, 11, 1, NULL);
+ _interior.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 450, 14, -1, -1, 1, NULL);
+}
+
+void Scene450::signal() {
+ switch (_sceneMode) {
+ case 450:
+ case 451:
+ BF_GLOBALS._sceneManager.changeScene(440);
+ break;
+ case 4501:
+ if (BF_GLOBALS._sceneObjects->contains(&_object2)) {
+ _sceneMode = 450;
+ ADD_MOVER(_object2, -20, 135);
+ } else {
+ _sceneMode = 451;
+ ADD_PLAYER_MOVER(0, 160);
+ }
+ break;
+ case 4503:
+ _weasel.fixPriority(100);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 4505:
+ BF_GLOBALS.setFlag(takenWeasel);
+ _weasel.remove();
+ _object2.remove();
+ BF_GLOBALS._walkRegions.proc2(4);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 4507:
+ case 4510:
+ case 4511:
+ BF_GLOBALS.setFlag(fMgrCallsWeasel);
+ _field19AC = 1;
+ _sceneMode = 4503;
+ setAction(&_sequenceManager, this, 4503, &_weasel, &_door, &_manager, NULL);
+ break;
+ case 4508:
+ _manager.remove();
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ break;
+ case 4517:
+ BF_GLOBALS.setFlag(gotTrailer450);
+ BF_INVENTORY.setObjectScene(INV_CARAVAN_KEY, 1);
+ _sceneMode = 4508;
+ setAction(&_sequenceManager, this, 4508, &BF_GLOBALS._player, &_manager, &_door, NULL);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene450::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes4.h b/engines/tsage/blue_force/blueforce_scenes4.h
new file mode 100644
index 0000000000..6c40211f28
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes4.h
@@ -0,0 +1,268 @@
+/* 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 TSAGE_BLUEFORCE_SCENES4_H
+#define TSAGE_BLUEFORCE_SCENES4_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene410: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7: public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Driver: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Passenger: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Harrison: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Motorcycle: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class TruckFront: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ Driver _driver;
+ Passenger _passenger;
+ Harrison _harrison;
+ NamedObject _patrolCar, _object5, _object6;
+ NamedHotspot _background;
+ Motorcycle _motorcycle;
+ NamedHotspot _truckBack;
+ TruckFront _truckFront;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerHarrison _harrisonSpeaker;
+ SpeakerDriver _driverSpeaker;
+ SpeakerShooter _shooterSpeaker;
+ ASoundExt _sound1;
+ int _field1FB6, _talkCount, _field1FBA;
+ int _field1FBC, _field1FBE;
+ int _field1FC0, _field1FC2, _field1FC4;
+
+ Scene410();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene415: public SceneExt {
+ /* Objects */
+ class GunInset: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class GunAndWig: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class BulletsInset: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class DashDrawer: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class TheBullets: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Lever: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+private:
+ void showBullets();
+ void showGunAndWig();
+public:
+ SequenceManager _sequenceManager;
+ GunInset _gunInset;
+ GunAndWig _gunAndWig;
+ BulletsInset _bulletsInset;
+ DashDrawer _dashDrawer;
+ TheBullets _theBullets;
+ NamedObject _object6;
+ NamedHotspot _item1, _steeringWheel, _horn, _dashboard;
+ NamedHotspot _seat, _windowLever, _item7, _seatBelt;
+ Lever _lever;
+ SpeakerJakeRadio _jakeRadioSpeaker;
+ bool _fieldE14, _fieldE16;
+
+ Scene415();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene440: public SceneExt {
+ /* Objects */
+ class Doorway: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Vechile: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ Doorway _doorway;
+ Vechile _vechile;
+ Lyle _lyle;
+ Item1 _item1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene450: public SceneExt {
+ /* Objects */
+ class Weasel: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object2: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class PinBoy: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Manager: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerEugene _eugeneSpeaker;
+ SpeakerWeasel _weaselSpeaker;
+ SpeakerBilly _billySpeaker;
+ Weasel _weasel;
+ NamedObject _object2;
+ PinBoy _pinBoy;
+ Manager _manager;
+ NamedObject _door, _counterDoor;
+ Exit _exit;
+ NamedHotspot _interior, _shelf, _counter;
+ int _field19AC, _field19AE;
+
+ Scene450();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp
new file mode 100644
index 0000000000..500cad60b1
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes5.cpp
@@ -0,0 +1,2555 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes5.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 550 - Outside Bikini Hut
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene550::Action1::signal() {
+ Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(5);
+ break;
+ case 1:
+ scene->_stripManager.start(scene->_sceneMode, this);
+ break;
+ case 2:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene550::Lyle::startAction(CursorType action, Event &event) {
+ Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
+ (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
+ if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) &&
+ (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
+ BF_GLOBALS.setFlag(fToldLyleOfSchedule);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5501;
+ scene->setAction(&scene->_sequenceManager, scene, 5514, &BF_GLOBALS._player, this, NULL);
+ } else {
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(5509, scene);
+ }
+ } else if (BF_GLOBALS._sceneManager._previousScene == 930) {
+ scene->_sceneMode = 5512;
+ scene->setAction(&scene->_action1);
+ } else {
+ scene->_sceneMode = BF_INVENTORY.getObjectScene(INV_CARAVAN_KEY) == 1 ? 5513 : 5512;
+ scene->setAction(&scene->_action1);
+ }
+ return true;
+ case INV_SCHEDULE:
+ BF_GLOBALS.setFlag(fToldLyleOfSchedule);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5501;
+ scene->setAction(&scene->_sequenceManager, scene, 5514, &BF_GLOBALS._player, this, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene550::CaravanDoor::startAction(CursorType action, Event &event) {
+ Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(550, 0);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(550, 7);
+ return true;
+ case INV_CARAVAN_KEY:
+ if ((BF_GLOBALS._dayNumber != 3) || !BF_GLOBALS.getFlag(fWithLyle))
+ SceneItem::display2(550, 33);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5500;
+ scene->setAction(&scene->_sequenceManager, scene, 5500, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene550::Vechile::startAction(CursorType action, Event &event) {
+ Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(550, 3);
+ return true;
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5510;
+ scene->setAction(&scene->_sequenceManager, scene, BF_GLOBALS.getFlag(fWithLyle) ? 5510 : 5515,
+ &BF_GLOBALS._player, this, NULL);
+ } else if (BF_GLOBALS.getFlag(fToldLyleOfSchedule)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 5501, &BF_GLOBALS._player, NULL);
+ } else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
+ (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
+ if (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1) {
+ scene->_sceneMode = 5501;
+ scene->_stripManager.start(5511, scene);
+ } else {
+ scene->_sceneMode = 0;
+ scene->_stripManager.start(5509, scene);
+ }
+ } else if (BF_GLOBALS._sceneManager._previousScene == 930) {
+ scene->_sceneMode = 5512;
+ scene->setAction(&scene->_action1);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 5501, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene550::postInit(SceneObjectList *OwnerList) {
+ BF_GLOBALS._sound1.fadeSound(16);
+
+ if ((BF_GLOBALS._bookmark == bInspectionDone) && !BF_GLOBALS.getFlag(fHasDrivenFromDrunk)) {
+ _sceneMode = 1;
+ signal();
+ return;
+ }
+
+ SceneExt::postInit();
+ loadScene(550);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setPosition(Common::Point(160, 100));
+ BF_GLOBALS._player._moveDiff = Common::Point(2, 1);
+ BF_GLOBALS._player.enableControl();
+
+ _caravanDoor.postInit();
+ _caravanDoor.setVisage(550);
+ _caravanDoor.setPosition(Common::Point(34, 66));
+ BF_GLOBALS._sceneItems.push_back(&_caravanDoor);
+
+ _vechile.postInit();
+ _vechile.fixPriority(70);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._walkRegions.proc1(10);
+ BF_GLOBALS._walkRegions.proc1(11);
+
+ _vechile.setVisage(444);
+ _vechile.setStrip(4);
+ _vechile.setFrame2(2);
+ _vechile.setPosition(Common::Point(110, 85));
+ _vechile.fixPriority(76);
+
+ _lyle.postInit();
+ _lyle.setVisage(835);
+ _lyle.setPosition(Common::Point(139, 83));
+ _lyle.setDetails(550, 29, 30, 31, 1, NULL);
+ _lyle.setStrip(8);
+
+ BF_GLOBALS._player.setVisage(303);
+ BF_GLOBALS._player.setPosition(Common::Point(89, 76));
+ BF_GLOBALS._player.updateAngle(_lyle._position);
+ } else {
+ BF_GLOBALS._walkRegions.proc1(12);
+
+ _vechile.setPosition(Common::Point(205, 77));
+ _vechile.changeZoom(80);
+
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ _vechile.setVisage(301);
+ _vechile.setStrip(1);
+
+ BF_GLOBALS._player.setVisage(304);
+ } else {
+ _vechile.setVisage(580);
+ _vechile.setStrip(2);
+ _vechile.setFrame(2);
+
+ BF_GLOBALS._player.setVisage(303);
+ }
+ }
+
+ BF_GLOBALS._sceneItems.push_back(&_vechile);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 930) {
+ _caravanDoor.setFrame(_caravanDoor.getFrameCount());
+ BF_GLOBALS._player.disableControl();
+
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 5512, &BF_GLOBALS._player, &_caravanDoor, NULL);
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 5502, &BF_GLOBALS._player, &_vechile, NULL);
+ } else if (!BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._player.setPosition(Common::Point(185, 70));
+ } else if (BF_GLOBALS._bookmark == bFlashBackOne) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 5513, &_lyle, NULL);
+ } else {
+ _sceneMode = 0;
+ }
+
+ _item2.setDetails(Rect(0, 26, 53, 67), 550, 1, -1, 2, 1, NULL);
+ _item3.setDetails(Rect(53, 12, 173, 65), 550, 4, -1, 5, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 170), 550, 6, -1, -1, 1, NULL);
+}
+
+void Scene550::signal() {
+ switch (_sceneMode) {
+ case 0:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(551);
+ break;
+ case 2:
+ case 5510:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 3:
+ BF_GLOBALS._driveFromScene = 16;
+ BF_GLOBALS._driveToScene = 128;
+ BF_GLOBALS._mapLocationId = 128;
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(800);
+ break;
+ case 5500:
+ BF_GLOBALS._sceneManager.changeScene(930);
+ break;
+ case 5501:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3;
+ setAction(&_sequenceManager, this, 5501, &BF_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 551 - Outside Bikini Hut (Drunk Stop)
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene551::Action2::signal() {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._walkRegions.proc2(18);
+ BF_GLOBALS._walkRegions.proc2(4);
+ scene->_field1CD2 = 1;
+
+ scene->_harrison.setObjectWrapper(new SceneObjectWrapper());
+ scene->_harrison.animate(ANIM_MODE_1, NULL);
+
+ BF_GLOBALS._player.setVisage(304);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ if (scene->_drunkStanding._flag != 1) {
+ ADD_PLAYER_MOVER_THIS(scene->_harrison, 126, 85);
+ } else {
+ ADD_PLAYER_MOVER_THIS(scene->_harrison, 88, 91);
+ }
+ break;
+ case 1:
+ scene->_harrison.updateAngle(BF_GLOBALS._player._position);
+
+ if (scene->_drunkStanding._flag == 1) {
+ BF_GLOBALS._walkRegions.proc1(4);
+ ADD_PLAYER_MOVER(71, 97);
+ } else {
+ ADD_PLAYER_MOVER(141, 87);
+ }
+ break;
+ case 2:
+ scene->_harrison.updateAngle(BF_GLOBALS._player._position);
+ BF_GLOBALS._player.updateAngle(scene->_harrison._position);
+ setDelay(10);
+ break;
+ case 3:
+ scene->_stripManager.start(scene->_harrison._flag, this);
+ break;
+ case 4:
+ scene->_field1CD2 = 0;
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene551::Vechile::startAction(CursorType action, Event &event) {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(550, 3);
+ return true;
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(didDrunk)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, this, NULL);
+ } else if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) == 1) {
+ BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0);
+ scene->_harrison._flag = 5505;
+ scene->setAction(&scene->_action2, scene);
+ scene->_sceneMode = 5509;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene551::DrunkStanding::startAction(CursorType action, Event &event) {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(550, 15);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(550, 16);
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(550, 17);
+ return true;
+ case INV_HANDCUFFS:
+ scene->_harrison.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS.set2Flags(f1098Drunk);
+ BF_GLOBALS.setFlag(didDrunk);
+ _flag = 2;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5509;
+
+ scene->setAction(&scene->_sequenceManager, scene, 5509, &BF_GLOBALS._player, this, &scene->_harrison, NULL);
+ BF_GLOBALS.set2Flags(f1015Drunk);
+ return true;
+ default:
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+bool Scene551::Drunk::startAction(CursorType action, Event &event) {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ switch (_flag) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ scene->setAction(&scene->_sequenceManager, scene, 5505, &BF_GLOBALS._player, &scene->_object15, NULL);
+ break;
+ case 1:
+ SceneItem::display2(550, 11);
+ break;
+ case 2:
+ SceneItem::display2(550, 12);
+ break;
+ case 3:
+ SceneItem::display2(550, 27);
+ break;
+ }
+ return true;
+ case CURSOR_USE:
+ switch (_flag) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(fTalkedToDrunkInCar)) {
+ scene->_sceneMode = 5508;
+ scene->setAction(&scene->_sequenceManager, scene, 5508, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS.setFlag(fTalkedToDrunkInCar);
+ scene->_sceneMode = 16;
+ scene->setAction(&scene->_sequenceManager, scene, 5504, &BF_GLOBALS._player, &scene->_object15, NULL);
+ }
+ break;
+ case 2:
+ SceneItem::display2(550, 13);
+ break;
+ case 3:
+ SceneItem::display2(550, 27);
+ break;
+ default:
+ break;
+ }
+ return true;
+ case CURSOR_TALK:
+ if (_flag)
+ break;
+ BF_GLOBALS._player.disableControl();
+
+ if (BF_GLOBALS.getFlag(fTalkedToDrunkInCar)) {
+ scene->_sceneMode = 5508;
+ scene->setAction(&scene->_sequenceManager, scene, 5508, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS.setFlag(fTalkedToDrunkInCar);
+ scene->_sceneMode = 0;
+ scene->setAction(&scene->_sequenceManager, scene, 5504, &BF_GLOBALS._player, &scene->_object15, NULL);
+ }
+ return true;
+ case INV_CENTER_PUNCH:
+ if (_flag) {
+ SceneItem::display2(550, 14);
+ } else {
+ BF_GLOBALS.set2Flags(f1098Drunk);
+ BF_GLOBALS.setFlag(didDrunk);
+ _flag = 1;
+ T2_GLOBALS._uiElements.addScore(30);
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5506;
+ scene->setAction(&scene->_sequenceManager, scene, 5506, &BF_GLOBALS._player, this,
+ &scene->_object12, NULL);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObjectExt::startAction(action, event);
+}
+
+bool Scene551::PatrolCarTrunk::startAction(CursorType action, Event &event) {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) != 1) {
+ BF_GLOBALS._walkRegions.proc2(18);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 5503, &BF_GLOBALS._player, &scene->_harrison, this, NULL);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+void Scene551::TrunkInset::remove() {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+ scene->_trunkKits.remove();
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 0;
+ scene->setAction(&scene->_sequenceManager, scene, 5516, &scene->_harrison,
+ &scene->_patrolCarTrunk, NULL);
+
+ FocusObject::remove();
+}
+
+bool Scene551::TrunkInset::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(550, 18);
+ return true;
+ case CURSOR_USE:
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene551::TrunkKits::startAction(CursorType action, Event &event) {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ Rect tempRect = _bounds;
+ tempRect.collapse(10, 6);
+ if (!tempRect.contains(event.mousePos))
+ return false;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ switch (_frame) {
+ case 1:
+ SceneItem::display2(550, 19);
+ break;
+ case 2:
+ SceneItem::display2(550, 20);
+ break;
+ case 3:
+ SceneItem::display2(550, 21);
+ break;
+ default:
+ break;
+ }
+ return true;
+ case CURSOR_USE:
+ if (event.mousePos.y < _bounds.top) {
+ setFrame(1);
+ } else if ((event.mousePos.x < (_bounds.left - 25)) && (_frame > 1)) {
+ SceneItem::display2(550, 28);
+ } else {
+ switch (_frame) {
+ case 1:
+ setFrame(BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) == 1 ? 3 : 2);
+ break;
+ case 2:
+ if (!BF_GLOBALS.getFlag(fShowedBluePrint)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fShowedBluePrint);
+ }
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5520;
+ scene->setAction(&scene->_sequenceManager, scene, 5520, &BF_GLOBALS._player, NULL);
+ BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 1);
+ setFrame(3);
+ break;
+ case 3:
+ setFrame(1);
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+ case INV_CENTER_PUNCH:
+ SceneItem::display2(550, 22);
+ BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0);
+ setFrame(2);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene551::Harrison::startAction(CursorType action, Event &event) {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(550, 23);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(550, 24);
+ return true;
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+
+ if (scene->_drunkStanding._flag == 1) {
+ _flag = 5508;
+ } else if (!scene->_field1CD0) {
+ _flag = 5502;
+ } else {
+ scene->_field1CD0 = 1;
+ _flag = 5500;
+ }
+ scene->setAction(&scene->_action2);
+ return true;
+ default:
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene551::Item4::startAction(CursorType action, Event &event) {
+ Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(550, 34);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, &scene->_vechile2, NULL);
+ return true;
+ default:
+ return false;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene551::Scene551(): Scene550() {
+ _field1CD0 = _field1CD2 = 0;
+}
+
+void Scene551::synchronize(Serializer &s) {
+ Scene550::synchronize(s);
+ s.syncAsSint16LE(_field1CD0);
+ s.syncAsSint16LE(_field1CD2);
+}
+
+void Scene551::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(550);
+ BF_GLOBALS._walkRegions.load(551);
+ BF_GLOBALS._sound1.fadeSound(16);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_gigglesSpeaker);
+ _stripManager.addSpeaker(&_drunkSpeaker);
+
+ if (BF_GLOBALS.getFlag(fHasLeftDrunk)) {
+ _item4.setBounds(Rect(0, 0, 320, 170));
+ BF_GLOBALS._sceneItems.push_back(&_item4);
+ }
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setPosition(Common::Point(160, 100));
+ BF_GLOBALS._player._moveDiff = Common::Point(2, 1);
+ BF_GLOBALS._player.enableControl();
+
+ _caravanDoor.postInit();
+ _caravanDoor.setVisage(550);
+ _caravanDoor.setPosition(Common::Point(34, 66));
+ BF_GLOBALS._sceneItems.push_back(&_caravanDoor);
+
+ _vechile2.postInit();
+ _vechile2.setVisage(301);
+ _vechile2.setStrip(1);
+ _vechile2.setPosition(Common::Point(205, 77));
+ _vechile2.fixPriority(70);
+ _vechile2.changeZoom(80);
+ BF_GLOBALS._sceneItems.push_back(&_vechile2);
+
+ BF_GLOBALS._walkRegions.proc1(14);
+
+ _drunk.postInit();
+ _drunk.setVisage(550);
+ _drunk.setStrip(3);
+ _drunk.fixPriority(84);
+ _drunk.setPosition(Common::Point(29, 92));
+ _drunk._flag = 0;
+ BF_GLOBALS._sceneItems.push_back(&_drunk);
+
+ _object12.postInit();
+ _object12.setVisage(550);
+ _object12.setStrip(7);
+ _object12.setPosition(Common::Point(29, 92));
+ _object12.hide();
+
+ _object13.postInit();
+ _object13.setVisage(550);
+ _object13.setStrip(2);
+ _object13.setPosition(Common::Point(29, 92));
+ _object13.fixPriority(82);
+ _object13.setDetails(550, 8, -1, 9, 1, NULL);
+
+ if (BF_GLOBALS.getFlag(didDrunk)) {
+ _drunk._flag = 3;
+ _drunk.setStrip(3);
+
+ _object12.show();
+ _object12.setDetails(550, 25, -1, 26, 1, NULL);
+ BF_GLOBALS._sceneItems.push_front(&_object12);
+
+ _harrison.postInit();
+ _harrison.setVisage(304);
+ _harrison.setPosition(Common::Point(67, 102));
+ _harrison.setStrip(8);
+ _harrison.setFrame(1);
+ _harrison._flag = 1;
+ BF_GLOBALS._sceneItems.push_back(&_harrison);
+
+ _object14.postInit();
+ _object14.setVisage(550);
+ _object14.setStrip(5);
+ _object14.animate(ANIM_MODE_2, NULL);
+ _object14.fixPriority(80);
+ _object14.setPosition(Common::Point(122, 57));
+
+ _object11.postInit();
+ _object11.setVisage(550);
+ _object11.setStrip(2);
+ _object11.setFrame(2);
+ _object11.setPosition(Common::Point(116, 84));
+ _object11.fixPriority(77);
+ _object11.setDetails(550, 32, -1, 10, 1, NULL);
+
+ _drunkStanding.postInit();
+ _drunkStanding._flag = 0;
+ _drunkStanding.setVisage(554);
+ _drunkStanding.setStrip(7);
+ _drunkStanding.setFrame(8);
+ _drunkStanding.fixPriority(83);
+ _drunkStanding.setPosition(Common::Point(57, 99));
+ } else {
+ _harrison.postInit();
+ _harrison.setVisage(304);
+ _harrison.setPosition(Common::Point(126, 83));
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+ _harrison._flag = 0;
+ _harrison._moveDiff = Common::Point(2, 1);
+ BF_GLOBALS._sceneItems.push_back(&_harrison);
+
+ _object14.postInit();
+ _object14.setVisage(550);
+ _object14.setStrip(5);
+ _object14.animate(ANIM_MODE_2, NULL);
+ _object14.fixPriority(80);
+ _object14.setPosition(Common::Point(122, 57));
+
+ _patrolCarTrunk.postInit();
+ _patrolCarTrunk.setVisage(550);
+ _patrolCarTrunk.setStrip(4);
+ _patrolCarTrunk.setFrame(1);
+ _patrolCarTrunk.setPosition(Common::Point(149, 69));
+ _patrolCarTrunk.fixPriority(79);
+ _patrolCarTrunk.setDetails(550, 18, -1, 9, 1, NULL);
+
+ _object11.postInit();
+ _object11.setVisage(550);
+ _object11.setStrip(2);
+ _object11.setFrame(2);
+ _object11.setPosition(Common::Point(116, 84));
+ _object11.fixPriority(77);
+ _object11.setDetails(550, 32, -1, 10, 1, NULL);
+
+ _drunkStanding.postInit();
+ _drunkStanding._flag = 0;
+ _drunkStanding.setVisage(554);
+ _drunkStanding.fixPriority(83);
+ _drunkStanding.setPosition(Common::Point(47, 93));
+
+ _object15.postInit();
+ _object15.setVisage(552);
+ _object15.setPosition(Common::Point(59, 94));
+ _object15.fixPriority(200);
+ _object15.hide();
+ }
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3;
+ setAction(&_sequenceManager, this, 5502, &BF_GLOBALS._player, &_vechile2, NULL);
+
+ _item2.setDetails(Rect(0, 26, 53, 67), 550, 1, -1, 2, 1, NULL);
+ _item3.setDetails(Rect(53, 12, 173, 65), 550, 4, -1, 5, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 170), 550, 6, -1, -1, 1, NULL);
+}
+
+void Scene551::signal() {
+ switch (_sceneMode) {
+ case 0:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 1:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS.set2Flags(f1027Drunk);
+ BF_GLOBALS.set2Flags(f1097Drunk);
+
+ if (BF_GLOBALS.getFlag(didDrunk))
+ BF_GLOBALS.setFlag(f1098Drunk);
+
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 2:
+ BF_GLOBALS._walkRegions.proc1(18);
+
+ _trunkInset.postInit();
+ _trunkInset.setVisage(553);
+ _trunkInset.setPosition(Common::Point(59, 92));
+ _trunkInset.fixPriority(252);
+ BF_GLOBALS._sceneItems.push_front(&_trunkInset);
+
+ _trunkKits.postInit();
+ _trunkKits.setVisage(553);
+ _trunkKits.setStrip(2);
+ _trunkKits.setPosition(Common::Point(57, 73));
+ _trunkKits.fixPriority(254);
+ BF_GLOBALS._sceneItems.push_front(&_trunkKits);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 3:
+ if (BF_GLOBALS.getFlag(talkedToHarrisAboutDrunk)) {
+ BF_GLOBALS._player.enableControl();
+ } else {
+ BF_GLOBALS.setFlag(talkedToHarrisAboutDrunk);
+ _harrison._flag = 5500;
+ setAction(&_action2);
+ }
+ break;
+ case 5506:
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+ ADD_PLAYER_MOVER_NULL(_harrison, 88, 91);
+
+ _object12.show();
+ _object12.setDetails(550, 25, -1, 26, 1, NULL);
+ BF_GLOBALS._sceneItems.push_front(&_object12);
+ BF_GLOBALS._player.enableControl();
+
+ _sceneMode = 5507;
+ setAction(&_sequenceManager, this, 5507, &BF_GLOBALS._player, &_drunk, &_drunkStanding, NULL);
+ break;
+ case 5507:
+ BF_GLOBALS._walkRegions.proc1(2);
+ BF_GLOBALS._walkRegions.proc1(4);
+
+ _drunkStanding._flag = 1;
+ BF_GLOBALS._sceneItems.push_front(&_drunkStanding);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 5508:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 5505, &BF_GLOBALS._player, &_object15, NULL);
+ break;
+ case 5509:
+ BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 5510;
+ setAction(&_sequenceManager, this, 5510, &BF_GLOBALS._player, &_vechile2, NULL);
+ break;
+ case 5510:
+ BF_GLOBALS._bookmark = bCalledToDrunkStop;
+ if (BF_GLOBALS.getFlag(didDrunk))
+ BF_GLOBALS.setFlag(fHasLeftDrunk);
+
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 5520:
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ _harrison.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene551::dispatch() {
+ SceneExt::dispatch();
+
+ if ((_drunkStanding._flag != 2) && !_harrison._mover && !_field1CD2)
+ _harrison.updateAngle(BF_GLOBALS._player._position);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 550 - Study
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene560::Action1::signal() {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ ADD_MOVER(BF_GLOBALS._player, 105, 140);
+ break;
+ case 2:
+ scene->_deskChair.hide();
+
+ BF_GLOBALS._player.changeZoom(81);
+ BF_GLOBALS._player.setVisage(561);
+ BF_GLOBALS._player.setStrip(2);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.setPosition(Common::Point(96, 138));
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_deskChair.setVisage(561);
+ scene->_deskChair.setFrame(BF_GLOBALS._player._frame);
+ scene->_deskChair.setStrip(BF_GLOBALS._player._strip);
+ scene->_deskChair.setPosition(BF_GLOBALS._player._position);
+
+ scene->_field380 = 1;
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene560::Action2::signal() {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(10);
+ break;
+ case 1:
+ scene->_deskChair.hide();
+
+ BF_GLOBALS._player.setVisage(561);
+ BF_GLOBALS._player.setStrip(2);
+ BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount());
+ BF_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 2:
+ scene->_field380 = 0;
+ scene->_deskChair.setPosition(Common::Point(81, 149));
+ scene->_deskChair.setVisage(561);
+ scene->_deskChair.setStrip(3);
+ scene->_deskChair.setFrame(1);
+ scene->_deskChair.fixPriority(151);
+ scene->_deskChair.show();
+
+ BF_GLOBALS._player.setVisage(563);
+ BF_GLOBALS._player.setPosition(Common::Point(105, 140));
+ BF_GLOBALS._player.fixPriority(-1);
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, this);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.enableControl();
+ ADD_PLAYER_MOVER(scene->_destPosition.x, scene->_destPosition.y);
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene560::Action3::signal() {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ setDelay(10);
+ break;
+ case 1:
+ if (scene->_field380) {
+ setDelay(10);
+ } else {
+ setAction(&scene->_action1, this);
+ }
+ break;
+ case 2:
+ BF_GLOBALS._sceneManager.changeScene(570);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene560::PicturePart::startAction(CursorType action, Event &event) {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (scene->_field380) {
+ SceneItem::display2(560, 54);
+ } else if ((scene->_sceneMode != 4) && (scene->_sceneMode != 3)) {
+ scene->_sceneMode = _flag + 4;
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(139, 106);
+ BF_GLOBALS._player.addMover(mover, &destPos, scene);
+ }
+ return true;
+ default:
+ return NamedHotspotExt::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene560::DeskChair::startAction(CursorType action, Event &event) {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && !scene->_field380) {
+ scene->setAction(&scene->_action1);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene560::Box::startAction(CursorType action, Event &event) {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_field380) {
+ SceneItem::display2(560, 54);
+ } else {
+ scene->_sceneMode = 9;
+ Common::Point destPos(289, 108);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, scene);
+ }
+ return true;
+ default:
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+void Scene560::SafeInset::postInit(SceneObjectList *OwnerList) {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+ FocusObject::postInit();
+
+ _cursorVisage.setVisage(1, 5);
+
+ if (BF_GLOBALS._safeCombination == 172) {
+ setFrame(2);
+ if (BF_INVENTORY.getObjectScene(INV_NICKEL) == 560) {
+ scene->_nickel.postInit();
+ scene->_nickel.setVisage(560);
+ scene->_nickel.setStrip(2);
+ scene->_nickel.setFrame(3);
+ scene->_nickel.fixPriority(252);
+ scene->_nickel.setPosition(Common::Point(181, 140));
+ scene->_nickel.setDetails(560, 47, 48, -1, 1, NULL);
+ BF_GLOBALS._sceneItems.remove(&scene->_nickel);
+ BF_GLOBALS._sceneItems.push_front(&scene->_nickel);
+ }
+ } else {
+ setFrame(1);
+ _item1.setDetails(Rect(143, 68, 159, 85), 560, 49, 50, -1, 1, NULL);
+ _item2.setDetails(Rect(159, 68, 175, 85), 560, 49, 50, -1, 1, NULL);
+ _item3.setDetails(Rect(175, 68, 191, 85), 560, 49, 50, -1, 1, NULL);
+ _item4.setDetails(Rect(143, 86, 159, 102), 560, 49, 50, -1, 1, NULL);
+ _item5.setDetails(Rect(159, 86, 175, 102), 560, 49, 50, -1, 1, NULL);
+ _item6.setDetails(Rect(175, 86, 191, 102), 560, 49, 50, -1, 1, NULL);
+
+ BF_GLOBALS._sceneItems.remove(&_item1);
+ BF_GLOBALS._sceneItems.remove(&_item2);
+ BF_GLOBALS._sceneItems.remove(&_item3);
+ BF_GLOBALS._sceneItems.remove(&_item4);
+ BF_GLOBALS._sceneItems.remove(&_item5);
+ BF_GLOBALS._sceneItems.remove(&_item6);
+ BF_GLOBALS._sceneItems.push_front(&_item6);
+ BF_GLOBALS._sceneItems.push_front(&_item5);
+ BF_GLOBALS._sceneItems.push_front(&_item4);
+ BF_GLOBALS._sceneItems.push_front(&_item3);
+ BF_GLOBALS._sceneItems.push_front(&_item2);
+ BF_GLOBALS._sceneItems.push_front(&_item1);
+
+ _item1._flag = 1;
+ _item2._flag = 2;
+ _item3._flag = 3;
+ _item4._flag = 4;
+ _item5._flag = 5;
+ _item6._flag = 6;
+
+ _digit2.postInit();
+ _digit2.setVisage(560);
+ _digit2.setStrip(3);
+ _digit2.setPosition(Common::Point(151, 94));
+ _digit2.fixPriority(252);
+
+ _digit1.postInit();
+ _digit1.setVisage(560);
+ _digit1.setStrip(3);
+ _digit1.setPosition(Common::Point(167, 94));
+ _digit1.fixPriority(252);
+
+ _digit0.postInit();
+ _digit0.setVisage(560);
+ _digit0.setStrip(3);
+ _digit0.setPosition(Common::Point(183, 94));
+ _digit0.fixPriority(252);
+
+ int amount = (BF_GLOBALS._safeCombination != 0) ? BF_GLOBALS._safeCombination : 1000;
+
+ // Get digit 0 portion
+ int remainder = amount % 10;
+ amount /= 10;
+ _digit0.setFrame(!remainder ? 10 : remainder);
+
+ // Get digit 1 portion
+ remainder = amount % 10;
+ amount /= 10;
+ _digit1.setFrame(!remainder ? 10 : remainder);
+
+ // Get digit 2 portion
+ remainder = amount % 10;
+ _digit2.setFrame(!remainder ? 10 : remainder);
+ }
+}
+
+void Scene560::SafeInset::remove() {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ _item1.remove();
+ _item2.remove();
+ _item3.remove();
+ _item4.remove();
+ _item5.remove();
+ _item6.remove();
+ _digit2.remove();
+ _digit1.remove();
+ _digit0.remove();
+
+ scene->_nickel.remove();
+
+ if (BF_GLOBALS._events.getCursor() == CURSOR_USE) {
+ GfxSurface cursor = _cursorVisage.getFrame(2);
+ BF_GLOBALS._events.setCursor(cursor);
+ }
+
+ FocusObject::remove();
+}
+
+void Scene560::SafeInset::signal() {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ // Recalculate the new total
+ int total = 0;
+ if (_digit2._frame < 10)
+ total = _digit2._frame * 100;
+ if (_digit1._frame < 10)
+ total += _digit1._frame * 10;
+ if (_digit0._frame < 10)
+ total += _digit0._frame;
+
+ BF_GLOBALS._safeCombination = !total ? 1000 : total;
+
+ // Check if the combination is correct
+ if (total == 172) {
+ BF_GLOBALS._sceneObjects->draw();
+
+ if (!BF_GLOBALS.getFlag(fGotPointsForBank)) {
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_GLOBALS.setFlag(fGotPointsForBank);
+ }
+
+ setFrame(2);
+ GfxSurface cursor = _cursorVisage.getFrame(2);
+ BF_GLOBALS._events.setCursor(cursor);
+
+ _item1.remove();
+ _item2.remove();
+ _item3.remove();
+ _item4.remove();
+ _item5.remove();
+ _item6.remove();
+ _digit2.remove();
+ _digit1.remove();
+ _digit0.remove();
+
+ if (BF_INVENTORY.getObjectScene(INV_NICKEL) == 560) {
+ // Nickel is still in the safe, show it
+ scene->_nickel.postInit();
+ scene->_nickel.setVisage(560);
+ scene->_nickel.setStrip(2);
+ scene->_nickel.setFrame(3);
+ scene->_nickel.fixPriority(252);
+ scene->_nickel.setPosition(Common::Point(181, 140));
+ scene->_nickel.setDetails(560, 47, 48, -1, 1, NULL);
+ BF_GLOBALS._sceneItems.remove(&scene->_nickel);
+ BF_GLOBALS._sceneItems.push_front(&scene->_nickel);
+ }
+ }
+}
+void Scene560::SafeInset::process(Event &event) {
+ if (_bounds.contains(event.mousePos)) {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ if (cursorId == CURSOR_USE) {
+ // Instead of standard cursor, use special hand cursor
+ GfxSurface cursor = _cursorVisage.getFrame(6);
+ BF_GLOBALS._events.setCursor(cursor);
+ } else {
+ // Set cursor again just in case Exit cursor was showing
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
+ (event.btnState == 3)) {
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+ event.handled = true;
+ }
+ } else {
+ GfxSurface cursor = _cursorVisage.getFrame(7);
+ BF_GLOBALS._events.setCursor(cursor);
+
+ if ((event.mousePos.y < UI_INTERFACE_Y) && (event.eventType == EVENT_BUTTON_DOWN)) {
+ // Leave the safe view
+ event.handled = true;
+ remove();
+ }
+ }
+}
+
+bool Scene560::SafeInset::Item::startAction(CursorType action, Event &event) {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ switch (_flag) {
+ case 1: {
+ int newFrame = scene->_safeInset._digit2._frame + 1;
+ if (newFrame == 11)
+ newFrame = 1;
+
+ scene->_safeInset._digit2.setFrame(newFrame);
+ break;
+ }
+ case 2: {
+ int newFrame = scene->_safeInset._digit1._frame + 1;
+ if (newFrame == 11)
+ newFrame = 1;
+
+ scene->_safeInset._digit1.setFrame(newFrame);
+ break;
+ }
+ case 3: {
+ int newFrame = scene->_safeInset._digit0._frame + 1;
+ if (newFrame == 11)
+ newFrame = 1;
+
+ scene->_safeInset._digit0.setFrame(newFrame);
+ break;
+ }
+ case 4: {
+ int newFrame = scene->_safeInset._digit2._frame - 1;
+ if (newFrame == 0)
+ newFrame = 10;
+
+ scene->_safeInset._digit2.setFrame(newFrame);
+ break;
+ }
+ case 5: {
+ int newFrame = scene->_safeInset._digit1._frame - 1;
+ if (newFrame == 0)
+ newFrame = 10;
+
+ scene->_safeInset._digit1.setFrame(newFrame);
+ break;
+ }
+ case 6: {
+ int newFrame = scene->_safeInset._digit0._frame - 1;
+ if (newFrame == 0)
+ newFrame = 10;
+
+ scene->_safeInset._digit0.setFrame(newFrame);
+ break;
+ }
+ default:
+ break;
+ }
+
+ scene->_safeInset.signal();
+ scene->_sound1.play(75);
+ return true;
+ default:
+ return NamedHotspotExt::startAction(action, event);
+ }
+}
+
+bool Scene560::Nickel::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE) {
+ BF_INVENTORY.setObjectScene(INV_NICKEL, 1);
+ T2_GLOBALS._uiElements.addScore(10);
+ remove();
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+void Scene560::BoxInset::postInit(SceneObjectList *OwnerList) {
+ FocusObject::postInit();
+ _item1.setDetails(Rect(110, 48, 189, 102), 560, 43, 44, -1, 1, NULL);
+ BF_GLOBALS._sceneItems.remove(&_item1);
+ BF_GLOBALS._sceneItems.push_front(&_item1);
+}
+
+void Scene560::BoxInset::remove() {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ if (scene->_sceneMode != 3)
+ scene->_sceneMode = 0;
+
+ _item1.remove();
+ FocusObject::remove();
+}
+
+bool Scene560::BoxInset::Item1::startAction(CursorType action, Event &event) {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForBox)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_GLOBALS.setFlag(fGotPointsForBox);
+ }
+
+ scene->_safeInset.postInit();
+ scene->_safeInset.setVisage(560);
+ scene->_safeInset.setStrip(2);
+ scene->_safeInset.setPosition(Common::Point(160, 141));
+ scene->_safeInset.fixPriority(251);
+ scene->_safeInset.setDetails(560, 45, 46, -1);
+
+ scene->_sceneMode = 3;
+ scene->_boxInset.remove();
+
+ GfxSurface cursor = surfaceFromRes(1, 5, 6);
+ BF_GLOBALS._events.setCursor(cursor);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene560::Computer::startAction(CursorType action, Event &event) {
+ Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (BF_GLOBALS._bookmark < bTalkedToGrannyAboutSkipsCard) {
+ SceneItem::display2(666, 24);
+ } else {
+ scene->setAction(&scene->_action3);
+ }
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene560::Scene560(): SceneExt() {
+ _field380 = _field11EA = 0;
+}
+
+void Scene560::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(560);
+ setZoomPercents(100, 60, 168, 90);
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+
+ _picture1.setDetails(Rect(121, 16, 139, 35), 560, -1, -1, -1, 1, NULL);
+ _picture2.setDetails(Rect(139, 16, 157, 35), 560, -1, -1, -1, 1, NULL);
+ _picture3.setDetails(Rect(121, 35, 139, 54), 560, -1, -1, -1, 1, NULL);
+ _picture4.setDetails(Rect(139, 35, 157, 54), 560, -1, -1, -1, 1, NULL);
+ _picture1._flag = 3;
+ _picture2._flag = 4;
+ _picture3._flag = 2;
+ _picture4._flag = 1;
+
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 3;
+
+ if (BF_GLOBALS._bookmark >= bTalkedToGrannyAboutSkipsCard) {
+ _box.postInit();
+ _box.setVisage(560);
+ _box.setStrip(4);
+ _box.setFrame(1);
+ _box.setPosition(Common::Point(295, 37));
+ _box.setDetails(560, 41, 42, -1, 1, NULL);
+ }
+
+ _deskChair.postInit();
+ _deskChair.setVisage(561);
+ _deskChair.setStrip(3);
+ _deskChair.setPosition(Common::Point(81, 149));
+ _deskChair.fixPriority(151);
+ _deskChair.changeZoom(81);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 570) {
+ // Returning from using computer
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+
+ _deskChair.hide();
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(561);
+ BF_GLOBALS._player.setStrip(2);
+ BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount());
+ BF_GLOBALS._player._moveDiff.x = 11;
+ BF_GLOBALS._player.setPosition(Common::Point(96, 138));
+ BF_GLOBALS._player.changeZoom(81);
+
+ _deskChair.setFrame(BF_GLOBALS._player._frame);
+ _deskChair.setStrip(BF_GLOBALS._player._strip);
+ _deskChair.setPosition(BF_GLOBALS._player._position);
+
+ _field11EA = 0;
+ _field380 = 1;
+ } else {
+ // Entering study through doorway
+ _field11EA = 0;
+ _field380 = 0;
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(563);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setPosition(Common::Point(79, 110));
+ BF_GLOBALS._player._moveDiff.x = 11;
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.disableControl();
+
+ _sceneMode = 10;
+ ADD_MOVER(BF_GLOBALS._player, 85, 115);
+ }
+
+ _computer.setDetails(Rect(16, 77, 58, 107), 560, 2, -1, -1, 1, NULL);
+ _deskChair.setDetails(560, 3, -1, -1, 1, NULL);
+ _chair.setDetails(Rect(163, 64, 196, 102), 560, 13, 25, 36, 1, NULL);
+ _lamp.setDetails(Rect(197, 43, 214, 56), 560, 7, 19, 30, 1, NULL);
+ _item4.setDetails(Rect(121, 18, 156, 54), 560, 8, 20, 31, 1, NULL);
+ _trophy.setDetails(Rect(259, 52, 275, 63), 560, 10, 22, 33, 1, NULL);
+ _watercolours.setDetails(Rect(214, 48, 239, 64), 560, 12, 24, 35, 1, NULL);
+ _fileCabinets.setDetails(Rect(0, 47, 49, 100), 560, 14, 26, 37, 1, NULL);
+ _certificate.setDetails(Rect(280, 51, 292, 62), 560, 11, 23, 34, 1, NULL);
+ _bookcase.setDetails(Rect(176, 0, 319, 103), 560, 9, 21, 32, 1, NULL);
+ _desk.setDetails(1, 560, 6, 10, 29, 1);
+ _item12.setDetails(Rect(62, 16, 96, 101), 560, 51, 52, 53, 1, NULL);
+ _carpet.setDetails(Rect(0, 103, 319, 167), 560, 5, 16, 28, 1, NULL);
+ _office.setDetails(Rect(0, 0, 320, 168), 560, 4, -1, -1, 1, NULL);
+
+ BF_GLOBALS._player.enableControl();
+}
+
+void Scene560::signal() {
+ switch (_sceneMode) {
+ case 1:
+ _object6.hide();
+ _object6.remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ BF_GLOBALS._player._strip = 4;
+ BF_GLOBALS._player._frame = 1;
+ BF_GLOBALS._player.disableControl();
+
+ _object6.postInit();
+ _object6.setVisage(560);
+ _object6.setStrip(1);
+ _object6.setFrame(_sceneMode - 4);
+ _object6.setPosition(Common::Point(160, 141));
+ _object6.fixPriority(250);
+ _stripManager.start(_sceneMode + 5595, this);
+ _sceneMode = 1;
+ break;
+ case 9:
+ // Clicked on the Baseball Cards Box
+ _object6._strip = 4;
+ _object6._frame = 1;
+
+ if (BF_GLOBALS._safeCombination == 172) {
+ if (_sceneMode != 3) {
+ _safeInset.postInit();
+ _safeInset.setVisage(560);
+ _safeInset.setStrip(2);
+ _safeInset.setPosition(Common::Point(160, 141));
+ _safeInset.fixPriority(251);
+ _safeInset.setDetails(560, 45, 46, -1);
+
+ _sceneMode = 3;
+ }
+ } else if ((_sceneMode != 3) && (_sceneMode != 4)) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForPunch)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_GLOBALS.setFlag(fGotPointsForPunch);
+ }
+
+ _boxInset.postInit();
+ _boxInset.setVisage(560);
+ _boxInset.setStrip(2);
+ _boxInset.setFrame(4);
+ _boxInset.setPosition(Common::Point(160, 141));
+ _boxInset.fixPriority(251);
+ _boxInset.setDetails(560, 43, 44, -1);
+
+ _sceneMode = 4;
+ }
+ break;
+ case 10:
+ _field11EA = 0;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 11:
+ BF_GLOBALS._sceneManager.changeScene(270);
+ break;
+ }
+}
+
+void Scene560::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
+ (_field380 == 1) && !_action) {
+ _destPosition = event.mousePos;
+ BF_GLOBALS._player.disableControl();
+ setAction(&_action2);
+
+ event.handled = true;
+ }
+
+ SceneExt::process(event);
+}
+
+void Scene560::dispatch() {
+ if (!_field11EA && (BF_GLOBALS._player._position.y < 105)) {
+ _field11EA = 1;
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._sceneManager.changeScene(270);
+ }
+
+ SceneExt::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 570 - Computer
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene570::PasswordEntry::PasswordEntry(): EventHandler() {
+ _passwordStr = SCENE570_PASSWORD;
+}
+
+void Scene570::PasswordEntry::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+ s.syncString(_entryBuffer);
+}
+
+void Scene570::PasswordEntry::postInit(SceneObjectList *OwnerList) {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+
+ scene->_sceneMode = 10;
+ scene->_object3.setStrip(6);
+ scene->_object3.setFrame(1);
+ scene->_object3.fixPriority(3);
+
+ _passwordText._color1 = 22;
+ _passwordText._color2 = 9;
+ _passwordText._color3 = 9;
+ _passwordText._width = 128;
+ _passwordText._fontNumber = 9000;
+ _passwordText.setPosition(Common::Point(165, 40));
+ _passwordText.fixPriority(255);
+ _passwordText.setup(_passwordStr);
+
+ _entryText._color1 = 22;
+ _entryText._color2 = 9;
+ _entryText._color3 = 9;
+ _entryText._width = 128;
+ _entryText._fontNumber = 9000;
+ _entryText.setPosition(Common::Point(220, 40));
+ _entryText.fixPriority(255);
+ _entryText.setup(_entryBuffer);
+}
+
+void Scene570::PasswordEntry::process(Event &event) {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ bool entryChanged = false;
+
+ switch (event.eventType) {
+ case EVENT_KEYPRESS: {
+ int key = toupper(event.kbd.ascii);
+ scene->_sound1.play(72);
+
+ if ((event.kbd.keycode == Common::KEYCODE_BACKSPACE) || (event.kbd.keycode == Common::KEYCODE_DELETE)) {
+ // Delete a key from the entry
+ if (_entryBuffer.size() > 0)
+ _entryBuffer.deleteLastChar();
+ entryChanged = true;
+ } else if (event.kbd.keycode == Common::KEYCODE_RETURN) {
+ // Finished entering password
+ _passwordText.remove();
+ _entryText.remove();
+
+ checkPassword();
+ remove();
+ } else if ((key >= 32) || (key <= 126)) {
+ // Valid character pressed
+ if (_entryBuffer.size() < 10)
+ _entryBuffer += (char)key;
+ event.handled = true;
+ entryChanged = true;
+ }
+ break;
+ }
+ case EVENT_BUTTON_DOWN:
+ event.handled = true;
+ break;
+ default:
+ break;
+ }
+
+ if (entryChanged) {
+ _entryText._color1 = 22;
+ _entryText._color2 = 9;
+ _entryText._color3 = 9;
+ _entryText._width = 128;
+ _entryText._fontNumber = 9000;
+ _entryText.setPosition(Common::Point(213, 40));
+ _entryText.fixPriority(255);
+ _entryText.setup(_entryBuffer);
+
+ // Pad entered text with spaces to make up the allowed width and then display
+ Common::String msg = _entryBuffer;
+ while (msg.size() < 10)
+ msg += " ";
+ _entryText.setup(msg);
+ }
+}
+
+void Scene570::PasswordEntry::checkPassword() {
+ // Check if the password is correctly entered as 'JACKIE' or, as a nod to the
+ // reimplementation in ScummVM, as the project name.
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+
+ if (!_entryBuffer.compareTo("JACKIE") || !_entryBuffer.compareTo("SCUMMVM")) {
+ // Password was correct
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS._player.disableControl();
+ scene->_sound1.play(73);
+
+ T2_GLOBALS._uiElements.hide();
+ T2_GLOBALS._uiElements._active = false;
+ scene->_sceneMode = 5701;
+ scene->setAction(&scene->_sequenceManager, scene, 5701, &scene->_object3, NULL);
+ } else {
+ // Password was incorrect
+ _entryBuffer = "";
+
+ scene->_object3.fixPriority(1);
+ scene->_iconManager.refreshList();
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+ scene->_sceneMode = 0;
+ }
+}
+
+Scene570::IconManager::IconManager(): EventHandler() {
+ _mode = _selectedFolder = _fieldAA = _fieldAC = 0;
+}
+
+void Scene570::IconManager::remove() {
+ _object1.remove();
+ EventHandler::remove();
+}
+
+void Scene570::IconManager::setup(int mode) {
+ _mode = mode;
+ _selectedFolder = 0;
+
+ _object1.postInit();
+ _object1.setVisage(572);
+ _object1.fixPriority(2);
+ _object1.setFrame((mode == 1) ? 4 : 5);
+ EventHandler::postInit();
+}
+
+void Scene570::IconManager::hideList() {
+ SynchronizedList<Icon *>::iterator i;
+ for (i = _list.begin(); i != _list.end(); ++i) {
+ (*i)->_sceneText.remove();
+ }
+}
+
+void Scene570::IconManager::refreshList() {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+
+ _object1.setPosition(Common::Point(163, 19));
+ scene->_object3.setStrip(4);
+
+ // Clear any current icons
+ SynchronizedList<Icon *>::iterator i;
+ for (i = _list.begin(); i != _list.end(); ++i) {
+ Icon *item = *i;
+
+ item->setVisage(572);
+ item->setStrip(1);
+ item->fixPriority(2);
+ item->setPosition(Common::Point(330, 100));
+ item->_sceneText.remove();
+ }
+
+ // Refresh the list
+ int iconIndex = 0, folderIndex = 0;
+ for (i = _list.begin(); i != _list.end(); ++i) {
+ Icon *item = *i;
+
+ if (item->_iconId == 1) {
+ // Folder
+ int parentId = item->_parentFolderId;
+ item->setFrame((_selectedFolder == (item->_folderId - 1)) ? 1 : 8);
+ item->setPosition(Common::Point(168 + parentId * 11, folderIndex * 8 + 27));
+ item->_sceneText.setPosition(Common::Point(175 + parentId * 11, folderIndex * 8 + 21));
+ item->_sceneText.setup(item->_text);
+ ++folderIndex;
+ } else if (item->_parentFolderId == _selectedFolder) {
+ item->setPosition(Common::Point(229, 27 + iconIndex * 12));
+
+ switch (item->_iconId) {
+ case 2:
+ item->setFrame(9);
+ break;
+ case 3:
+ item->setFrame(7);
+ break;
+ case 5:
+ item->setFrame(10);
+ break;
+ case 6:
+ item->setFrame(11);
+ break;
+ case 7:
+ item->setFrame(12);
+ break;
+ default:
+ break;
+ }
+
+ item->_sceneText.setPosition(Common::Point(236, iconIndex * 12 + 22));
+ item->_sceneText.setup(item->_text);
+ ++iconIndex;
+ }
+ }
+}
+
+void Scene570::IconManager::addItem(Icon *item) {
+ item->_mode = _mode;
+ _list.push_back(item);
+}
+
+Scene570::Icon::Icon(): NamedObject() {
+ _iconId = _folderId = 0;
+}
+
+void Scene570::Icon::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_iconId);
+ s.syncAsSint16LE(_folderId);
+ s.syncAsSint16LE(_parentFolderId);
+ s.syncAsSint16LE(_mode);
+}
+
+void Scene570::Icon::remove() {
+ _sceneText.remove();
+ NamedObject::remove();
+}
+
+bool Scene570::Icon::startAction(CursorType action, Event &event) {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ switch (_iconId) {
+ case 1:
+ SceneItem::display2(570, 9);
+ break;
+ case 2:
+ SceneItem::display2(570, 10);
+ break;
+ case 3:
+ SceneItem::display2(570, 4);
+ break;
+ case 5:
+ SceneItem::display2(570, 11);
+ break;
+ case 6:
+ SceneItem::display2(570, 12);
+ break;
+ case 7:
+ SceneItem::display2(570, 13);
+ break;
+ default:
+ break;
+ }
+ return true;
+ case CURSOR_USE:
+ // Select the given icon
+ scene->_sound1.play(73);
+ switch (_iconId) {
+ case 1:
+ // Folder, so select it
+ scene->_iconManager._selectedFolder = _folderId - 1;
+ scene->_iconManager.refreshList();
+ break;
+ case 2:
+ scene->_iconManager.hideList();
+ scene->_sceneMode = 5702;
+ scene->setAction(&scene->_sequenceManager, scene, 5702, &scene->_object3, NULL);
+ break;
+ case 3:
+ scene->_iconManager.hideList();
+ scene->_passwordEntry.postInit();
+ break;
+ case 5:
+ SceneItem::display2(570, 5);
+ break;
+ case 6:
+ scene->_iconManager.hideList();
+ switch (_folderId) {
+ case 8:
+ T2_GLOBALS._uiElements.hide();
+ T2_GLOBALS._uiElements._active = false;
+ scene->_sceneMode = 5705;
+ scene->setAction(&scene->_sequenceManager, scene, 5705, &scene->_object3, NULL);
+ break;
+ case 10:
+ T2_GLOBALS._uiElements.hide();
+ T2_GLOBALS._uiElements._active = false;
+ scene->_sceneMode = 5706;
+ scene->setAction(&scene->_sequenceManager, scene, 5706, &scene->_object3, NULL);
+ break;
+ case 12:
+ T2_GLOBALS._uiElements.hide();
+ T2_GLOBALS._uiElements._active = false;
+ scene->_sceneMode = 5707;
+ scene->setAction(&scene->_sequenceManager, scene, 5707, &scene->_object3, NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 7:
+ scene->_iconManager.hideList();
+ T2_GLOBALS._uiElements.hide();
+ T2_GLOBALS._uiElements._active = false;
+ scene->_sceneMode = 5704;
+ scene->setAction(&scene->_sequenceManager, scene, 5704, &scene->_object3, NULL);
+ break;
+ }
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(570, 15);
+ return true;
+ case CURSOR_PRINTER:
+ switch (_iconId) {
+ case 1:
+ // Folder - "You can't print that"
+ SceneItem::display2(570, 8);
+ break;
+ case 7:
+ scene->_sound1.play(74);
+ if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 570) {
+ SceneItem::display2(570, 6);
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 1);
+ } else {
+ SceneItem::display2(570, 7);
+ }
+ break;
+ default:
+ // You don't want to print that
+ SceneItem::display2(570, 18);
+ break;
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+void Scene570::Icon::setDetails(int iconId, int folderId, int parentFolderId, int unused, const Common::String &msg) {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ NamedObject::postInit();
+
+ _iconId = iconId;
+ _folderId = folderId;
+ _parentFolderId = parentFolderId;
+ _text = msg;
+
+ _sceneText._color1 = 22;
+ _sceneText._color2 = 9;
+ _sceneText._color3 = 9;
+ _sceneText._width = 128;
+ _sceneText._fontNumber = 9000;
+ _sceneText.fixPriority(2);
+
+ BF_GLOBALS._sceneItems.push_front(this);
+ scene->_iconManager.addItem(this);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene570::PowerSwitch::startAction(CursorType action, Event &event) {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_object4._flag == 1) {
+ setFrame(1);
+ scene->_object3.remove();
+ } else {
+ if (!BF_GLOBALS.getFlag(fGotPointsForCoin)) {
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_GLOBALS.setFlag(fGotPointsForCoin);
+ }
+
+ scene->_sound1.play(70);
+ scene->_object4._flag = 1;
+ setFrame(2);
+
+ scene->_object3.postInit();
+ scene->_object3.fixPriority(1);
+ scene->_object3.setDetails(570, 16, 15, 17);
+ BF_GLOBALS._sceneItems.remove(&scene->_object3);
+ BF_GLOBALS._sceneItems.push_front(&scene->_object3);
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5700;
+ setAction(&scene->_sequenceManager, scene, 5700, &scene->_object3, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene570::PrinterIcon::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE) {
+ BF_GLOBALS._events.setCursor(CURSOR_PRINTER);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+void Scene570::Object3::remove() {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ scene->_object4._flag = 0;
+
+ scene->_printerIcon.remove();
+ scene->_iconManager.remove();
+ scene->_folder1.remove();
+ scene->_folder2.remove();
+ scene->_folder3.remove();
+ scene->_folder4.remove();
+ scene->_icon1.remove();
+ scene->_icon2.remove();
+ scene->_icon3.remove();
+ scene->_icon4.remove();
+ scene->_icon5.remove();
+ scene->_icon6.remove();
+ scene->_icon7.remove();
+ scene->_icon8.remove();
+ scene->_icon9.remove();
+
+ FocusObject::remove();
+ BF_GLOBALS._sceneManager.changeScene(560);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene570::FloppyDrive::startAction(CursorType action, Event &event) {
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (BF_INVENTORY.getObjectScene(INV_D_FLOPPY) == 571) {
+ BF_INVENTORY.setObjectScene(INV_D_FLOPPY, 1);
+ scene->_iconManager.refreshList();
+ SceneItem::display2(570, 2);
+ } else {
+ SceneItem::display2(570, 3);
+ }
+ return true;
+ case INV_D_FLOPPY:
+ BF_INVENTORY.setObjectScene(INV_D_FLOPPY, 571);
+ scene->_iconManager.refreshList();
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene570::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(570);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+
+ _object4._flag = 0;
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player.hide();
+
+ _powerSwitch.postInit();
+ _powerSwitch.setVisage(570);
+ _powerSwitch.setStrip(4);
+ _powerSwitch.setFrame(1);
+ _powerSwitch.setPosition(Common::Point(163, 131));
+ _powerSwitch.setDetails(570, 1, 15, -1, 1, NULL);
+
+ _floppyDrive.setDetails(Rect(258, 111, 303, 120), 570, 0, 15, -1, 1, NULL);
+ _item11.setDetails(0, 570, 15, 15, 15, 1);
+ _monitor.setDetails(1, 570, 19, 20, 21, 1);
+ _item3.setDetails(2, 570, 22, 23, 24, 1);
+ _case.setDetails(3, 570, 25, 26, 27, 1);
+ _keyboard.setDetails(4, 570, 28, 29, 30, 1);
+ _desk.setDetails(5, 570, 31, 32, 33, 1);
+ _printer.setDetails(7, 570, 37, 38, 39, 1);
+ _window.setDetails(8, 570, 40, 41, 42, 1);
+ _plant.setDetails(9, 570, 43, 44, 45, 1);
+
+ if ((BF_GLOBALS._dayNumber == 1) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)) {
+ _object4.postInit();
+ _object4.setVisage(574);
+ _object4.setPosition(Common::Point(90, 84));
+ }
+}
+
+void Scene570::signal() {
+ switch (_sceneMode) {
+ case 5700:
+ _object3.setStrip(4);
+ _object3.setFrame(1);
+
+ _printerIcon.postInit();
+ _printerIcon.setVisage(572);
+ _printerIcon.setFrame(3);
+ _printerIcon.setPosition(Common::Point(172, 71));
+ _printerIcon.fixPriority(2);
+ _printerIcon.setDetails(570, 14, 15, -1, 2, NULL);
+
+ _iconManager.setup(2);
+ _folder1.setDetails(1, 1, 0, 2, SCENE570_C_DRIVE);
+ _folder2.setDetails(1, 2, 1, 2, SCENE570_RING);
+ _folder3.setDetails(1, 3, 1, 2, SCENE570_PROTO);
+ _folder4.setDetails(1, 4, 1, 2, SCENE570_WACKY);
+
+ if (!BF_GLOBALS.getFlag(fDecryptedBluePrints))
+ _icon1.setDetails(3, 5, 0, 2, SCENE570_COBB);
+ _icon2.setDetails(2, 7, 0, 2, SCENE570_LETTER);
+ if (BF_GLOBALS.getFlag(fDecryptedBluePrints))
+ _icon3.setDetails(7, 6, 0, 2, SCENE570_COBB);
+
+ _icon4.setDetails(6, 8, 1, 2, SCENE570_RINGEXE);
+ _icon5.setDetails(5, 9, 1, 2, SCENE570_RINGDATA);
+ _icon6.setDetails(6, 10, 2, 2, SCENE570_PROTOEXE);
+ _icon7.setDetails(5, 11, 2, 2, SCENE570_PROTODATA);
+ _icon8.setDetails(6, 12, 3, 2, SCENE570_WACKYEXE);
+ _icon9.setDetails(5, 13, 3, 2, SCENE570_WACKYDATA);
+
+ _iconManager.refreshList();
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 5701:
+ BF_GLOBALS.setFlag(fDecryptedBluePrints);
+ _iconManager._list.remove(&_icon1);
+ _icon1.remove();
+
+ _object3.setVisage(572);
+ _object3.setStrip(4);
+ _object3.setFrame(1);
+ _object3.fixPriority(1);
+
+ _icon3.setDetails(7, 6, 0, 2, SCENE570_COBB);
+ _iconManager.refreshList();
+ T2_GLOBALS._uiElements._active = true;
+ T2_GLOBALS._uiElements.show();
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 5704:
+ case 5705:
+ case 5706:
+ case 5707:
+ T2_GLOBALS._uiElements._active = true;
+ T2_GLOBALS._uiElements.show();
+ _object3.setPosition(Common::Point(220, 75));
+ _object3.setVisage(572);
+ _object3.setStrip(4);
+ _object3.setFrame(1);
+ // Deliberate fall-through
+ case 5702:
+ case 5703:
+ _object3.fixPriority(1);
+ _iconManager.refreshList();
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene570::process(Event &event) {
+ SceneExt::process(event);
+
+ if (!event.handled && (_sceneMode == 10))
+ // Password entry active, so pass events to it
+ _passwordEntry.process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 580 - Child Protective Services Parking Lot
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene580::Vechile::startAction(CursorType action, Event &event) {
+ Scene580 *scene = (Scene580 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 5800, &BF_GLOBALS._player, NULL);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene580::Door::startAction(CursorType action, Event &event) {
+ Scene580 *scene = (Scene580 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5802;
+ scene->setAction(&scene->_sequenceManager, scene, 5802, &BF_GLOBALS._player, this, NULL);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene580::Lyle::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(580, 7);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene580::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(580);
+ setZoomPercents(45, 95, 55, 100);
+ BF_GLOBALS._sound1.changeSound(33);
+
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._moveDiff = Common::Point(2, 1);
+
+ _door.postInit();
+ _door.setVisage(580);
+ _door.setStrip(4);
+ _door.setPosition(Common::Point(168, 41));
+ _door.hide();
+ _door.setDetails(580, 5, -1, -1, 1, NULL);
+
+ _vechile.postInit();
+ _vechile.setVisage(580);
+ _vechile.fixPriority(65);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle.setVisage(835);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle._moveDiff = Common::Point(2, 1);
+ _lyle.setPosition(Common::Point(149, 70));
+ BF_GLOBALS._sceneItems.push_back(&_lyle);
+
+ _vechile.changeZoom(90);
+ _vechile.setStrip(3);
+ _vechile.setPosition(Common::Point(165, 76));
+ _vechile.setDetails(580, 2, 3, -1, 1, NULL);
+ _vechile.setVisage(303);
+
+ BF_GLOBALS._player.setVisage(303);
+
+ BF_GLOBALS._walkRegions.proc1(8);
+ BF_GLOBALS._walkRegions.proc1(9);
+ BF_GLOBALS._walkRegions.proc1(10);
+ BF_GLOBALS._walkRegions.proc1(11);
+ } else {
+ _vechile.setPosition(Common::Point(159, 72));
+
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ _vechile.setStrip(1);
+ _vechile.setFrame(2);
+ _vechile.setDetails(300, 11, 13, -1, 1, NULL);
+
+ BF_GLOBALS._player.setVisage(304);
+ } else {
+ _vechile.setStrip(2);
+ _vechile.setFrame(3);
+ _vechile.setDetails(580, 0, 1, -1, 1, NULL);
+
+ BF_GLOBALS._player.setVisage(303);
+ }
+ }
+
+ BF_GLOBALS._player.updateAngle(_vechile._position);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 590) {
+ // Leaving Services
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 5801, &BF_GLOBALS._player, NULL);
+ } else {
+ // Arriving at parking lot
+ BF_GLOBALS._player.setPosition(Common::Point(177, 58));
+ signal();
+ }
+
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 580, 6, -1, -1, 1, NULL);
+}
+
+void Scene580::signal() {
+ switch (_sceneMode) {
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 5802:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(590);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene580::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
+ BF_GLOBALS._player.contains(event.mousePos)) {
+ BF_GLOBALS._player.disableControl();
+ SceneItem::display2(350, 26);
+
+ _sceneMode = 0;
+ signal();
+ event.handled = true;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 590 - Child Protective Services
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene590::Laura::startAction(CursorType action, Event &event) {
+ Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (!scene->_field17DC)
+ scene->_stripNumber = 5905;
+ else if (!scene->_field17DE) {
+ if (scene->_field17E2) {
+ scene->_stripNumber = 5907;
+ } else {
+ scene->_field17E2 = 1;
+ scene->_stripNumber = 5906;
+ }
+ }
+
+ scene->setAction(&scene->_action1);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene590::Skip::startAction(CursorType action, Event &event) {
+ Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) == 1) {
+ scene->_stripNumber = !scene->_field17DC ? 5903 : 5902;
+ } else {
+ scene->_stripNumber = !scene->_field17DC ? 5901 : 5902;
+ }
+
+ scene->setAction(&scene->_action1);
+ scene->_field17DC = 1;
+ return true;
+ case INV_BASEBALL_CARD:
+ scene->_field17DE = 1;
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2);
+ BF_GLOBALS._player.disableControl();
+
+ scene->_stripNumber = !scene->_field17DC ? 5900 : 5904;
+ scene->_field17DC = 1;
+ scene->setAction(&scene->_action2);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene590::Exit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 100, BF_GLOBALS._player._position.y + 75);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene590::Action1::signal() {
+ Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ ADD_PLAYER_MOVER(220, 132);
+ break;
+ case 1:
+ scene->_stripManager.start(scene->_stripNumber, this);
+ break;
+ case 2:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene590::Action2::signal() {
+ Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 220, 132);
+ break;
+ }
+ case 1:
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 220, 132);
+ break;
+ case 2:
+ BF_GLOBALS._player.setVisage(381);
+ BF_GLOBALS._player.setStrip(2);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.setPosition(Common::Point(257, 130));
+ BF_GLOBALS._player.animate(ANIM_MODE_4, 3, 1, this);
+
+ scene->_skip.setStrip(2);
+ scene->_skip.animate(ANIM_MODE_5, NULL);
+ break;
+ case 3:
+ scene->_skip.animate(ANIM_MODE_6, NULL);
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ scene->_skip.setStrip(1);
+ scene->_skip.animate(ANIM_MODE_1, NULL);
+
+ BF_GLOBALS._player.setVisage(368);
+ BF_GLOBALS._player.setStrip(7);
+ BF_GLOBALS._player.setPosition(Common::Point(238, 131));
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ scene->_stripManager.start(scene->_stripNumber, this);
+ break;
+ case 5:
+ scene->_sceneMode = 3;
+ scene->signal();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene590::Scene590(): PalettedScene() {
+ _field17DC = _field17DE = _stripNumber = _field17E2 = 0;
+}
+
+void Scene590::synchronize(Serializer &s) {
+ PalettedScene::synchronize(s);
+ s.syncAsSint16LE(_field17DC);
+ s.syncAsSint16LE(_field17DE);
+ s.syncAsSint16LE(_stripNumber);
+ s.syncAsSint16LE(_field17E2);
+}
+
+void Scene590::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ loadScene(590);
+
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ _sound1.play(18);
+ _sound1.fade(100, 5, 10, false, NULL);
+
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._dayNumber = 1;
+ BF_GLOBALS._bookmark = bEndOfWorkDayOne;
+ BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 1);
+ }
+
+ _exit.setDetails(Rect(0, 157, 182, 167), 590, -1, -1, -1, 1, NULL);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setPosition(Common::Point(0, 190));
+
+ _stripManager.addSpeaker(&_skipSpeaker);
+ _stripManager.addSpeaker(&_lauraSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._player.setVisage(361);
+ BF_GLOBALS._player._moveDiff = Common::Point(6, 2);
+ } else {
+ BF_GLOBALS._player.setVisage(368);
+ BF_GLOBALS._player._moveDiff = Common::Point(6, 2);
+
+ if ((BF_GLOBALS._bookmark >= bEndOfWorkDayOne) && (BF_GLOBALS._bookmark < bLyleStoppedBy)) {
+ _skip.postInit();
+ _skip.setVisage(693);
+ _skip.setPosition(Common::Point(271, 117));
+ _skip.setDetails(590, 26, -1, 27, 1, NULL);
+
+ _laura.postInit();
+ _laura.setVisage(692);
+ _laura.setPosition(Common::Point(248, 115));
+ _laura.setDetails(590, 24, -1, 25, 1, NULL);
+ }
+ }
+
+ _item2.setDetails(1, 590, 0, -1, 12, 1);
+ _item3.setDetails(3, 590, 2, -1, 14, 1);
+ _item4.setDetails(20, 590, 3, -1, 15, 1);
+ _item5.setDetails(22, 590, 4, -1, 16, 1);
+ _item6.setDetails(7, 590, 6, -1, 17, 1);
+ _item7.setDetails(7, 590, 6, -1, 18, 1);
+ _item8.setDetails(9, 590, 7, -1, 19, 1);
+ _item9.setDetails(11, 590, 8, -1, 20, 1);
+ _item10.setDetails(13, 590, 9, -1, 21, 1);
+ _item11.setDetails(15, 590, 10, -1, 22, 1);
+ _item12.setDetails(17, 590, 11, -1, 23, 1);
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 5900, &BF_GLOBALS._player, NULL);
+}
+
+void Scene590::signal() {
+ static uint32 black = 0;
+
+ switch (_sceneMode) {
+ case 1:
+ _sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(271);
+ break;
+ case 2:
+ _sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(580);
+ break;
+ case 3:
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 0, 170);
+
+ _skip.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER_NULL(_skip, 0, 170);
+
+ _laura.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER_NULL(_laura, 0, 170);
+
+ _sceneMode = 1;
+ addFader((byte *)&black, 2, this);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene590::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene590::dispatch() {
+ if (!_action && (BF_GLOBALS._player._position.x < 182) && (BF_GLOBALS._player._position.y > 158)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager, this, 5901, &BF_GLOBALS._player, NULL);
+ }
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes5.h b/engines/tsage/blue_force/blueforce_scenes5.h
new file mode 100644
index 0000000000..34328ab9e8
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes5.h
@@ -0,0 +1,407 @@
+/* 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 TSAGE_BLUEFORCE_SCENES5_H
+#define TSAGE_BLUEFORCE_SCENES5_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene550: public SceneExt {
+ /* Objects */
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class CaravanDoor: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Vechile: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public ActionExt {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Lyle _lyle;
+ CaravanDoor _caravanDoor;
+ Vechile _vechile;
+ NamedHotspot _item1, _item2, _item3;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ Action1 _action1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene551: public Scene550 {
+ /* Objects */
+ class Vechile: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class DrunkStanding: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Drunk: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class PatrolCarTrunk: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class TrunkInset: public FocusObject {
+ public:
+ virtual void remove();
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class TrunkKits: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Harrison: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Item4: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SpeakerDrunk _drunkSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerGiggles _gigglesSpeaker;
+ Vechile _vechile2;
+ DrunkStanding _drunkStanding;
+ Drunk _drunk;
+ PatrolCarTrunk _patrolCarTrunk;
+ TrunkInset _trunkInset;
+ TrunkKits _trunkKits;
+ Harrison _harrison;
+ NamedObject _object11, _object12, _object13;
+ SceneObject _object14, _object15;
+ Item4 _item4;
+ Action2 _action2;
+ int _field1CD0, _field1CD2;
+
+ Scene551();
+ virtual void synchronize(Serializer &s);
+ void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene560: public SceneExt {
+ /* Objects */
+ class DeskChair: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Box: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SafeInset: public FocusObject {
+ /* Items */
+ class Item: public NamedHotspotExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ public:
+ NamedObject _digit0, _digit1, _digit2;
+ Item _item1, _item2, _item3, _item4, _item5, _item6;
+ Visage _cursorVisage;
+
+ virtual Common::String getClassName() { return "Scene560_SafeInset"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ };
+ class Nickel: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class BoxInset: public FocusObject {
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ public:
+ Item1 _item1;
+
+ virtual Common::String getClassName() { return "Scene560_BoxInset"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ };
+
+ /* Item groups */
+ class PicturePart: public NamedHotspotExt {
+ public:
+ virtual Common::String getClassName() { return "Scene560_PicturePart"; }
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Computer: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ SpeakerGameText _gameTextSpeaker;
+ DeskChair _deskChair;
+ Box _box;
+ SafeInset _safeInset;
+ Nickel _nickel;
+ BoxInset _boxInset;
+ NamedObject _object6;
+ PicturePart _picture1, _picture2, _picture3, _picture4;
+ Computer _computer;
+ NamedHotspot _chair, _lamp, _item4, _trophy, _watercolours, _fileCabinets;
+ NamedHotspot _certificate, _bookcase, _desk, _carpet, _item12, _office;
+ ASound _sound1;
+ int _field380, _field11EA;
+ Common::Point _destPosition;
+
+ Scene560();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene570: public SceneExt {
+ /* Custom classes */
+ class PasswordEntry: public EventHandler {
+ private:
+ void checkPassword();
+ public:
+ SceneText _passwordText, _entryText;
+ Common::String _passwordStr, _entryBuffer;
+
+ PasswordEntry();
+ virtual Common::String getClassName() { return "Scene570_PasswordEntry"; }
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void process(Event &event);
+ };
+ class Icon: public NamedObject {
+ public:
+ SceneText _sceneText;
+ int _iconId, _folderId, _parentFolderId, _mode;
+ Common::String _text;
+
+ Icon();
+ virtual Common::String getClassName() { return "Scene570_Custom2"; }
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual bool startAction(CursorType action, Event &event);
+
+ void setDetails(int iconId, int folderId, int parentFolderId, int unused, const Common::String &msg);
+ };
+ class IconManager: public EventHandler {
+ public:
+ NamedObject _object1;
+ SynchronizedList<Icon *> _list;
+ int _mode, _selectedFolder, _fieldAA, _fieldAC;
+
+ IconManager();
+ virtual void remove();
+
+ void setup(int mode);
+ void hideList();
+ void refreshList();
+ void addItem(Icon *item);
+ };
+
+ /* Objects */
+ class PowerSwitch: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class PrinterIcon: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object3: public FocusObject {
+ public:
+ virtual void remove();
+ };
+
+ /* Items */
+ class FloppyDrive: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ PasswordEntry _passwordEntry;
+ PowerSwitch _powerSwitch;
+ PrinterIcon _printerIcon;
+ Object3 _object3;
+ NamedObjectExt _object4;
+ Icon _folder1, _folder2, _folder3, _folder4;
+ Icon _icon1, _icon2, _icon3, _icon4, _icon5;
+ Icon _icon6, _icon7, _icon8, _icon9;
+ IconManager _iconManager;
+ FloppyDrive _floppyDrive;
+ NamedHotspot _monitor, _item3, _case, _keyboard, _desk;
+ NamedHotspot _item7, _printer, _window, _plant, _item11;
+ ASound _sound1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene580: public SceneExt {
+ /* Objects */
+ class Vechile: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Door: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ Vechile _vechile;
+ Door _door;
+ Lyle _lyle;
+ NamedHotspot _item1;
+ SpeakerGameText _gameTextSpeaker;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene590: public PalettedScene {
+ /* Objects */
+ class Laura: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Skip: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Laura _laura;
+ Skip _skip;
+ SceneObject _object3;
+ Exit _exit;
+ NamedHotspot _item2, _item3, _item4, _item5, _item6, _item7;
+ NamedHotspot _item8, _item9, _item10, _item11, _item12;
+ SpeakerSkip _skipSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLaura _lauraSpeaker;
+ ASoundExt _sound1;
+ Action1 _action1;
+ Action2 _action2;
+ int _field17DC, _field17DE, _stripNumber, _field17E2;
+
+ Scene590();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp
new file mode 100644
index 0000000000..56fdec47cd
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes6.cpp
@@ -0,0 +1,515 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes6.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 600 - Crash cut-scene
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene600::Action1::signal() {
+ Scene600 *scene = (Scene600 *)BF_GLOBALS._sceneManager._scene;
+ static const uint32 black = 0;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(2);
+ break;
+ case 1:
+ BF_GLOBALS._sound1.play(57);
+ setDelay(120);
+ break;
+ case 2:
+ scene->_sound1.play(59);
+ setAction(&scene->_sequenceManager, this, 600, &scene->_object2, &scene->_object1,
+ &BF_GLOBALS._player, &scene->_object3, NULL);
+ break;
+ case 3:
+ BF_GLOBALS._sound1.play(61);
+ setDelay(180);
+ break;
+ case 4:
+ setDelay(180);
+ break;
+ case 5: {
+ BF_GLOBALS._player.remove();
+ scene->_object1.remove();
+ scene->_object2.remove();
+ scene->_object3.remove();
+
+ for (int percent = 100; percent >= 0; percent -= 5) {
+ BF_GLOBALS._scenePalette.fade((const byte *)&black, false, percent);
+ g_system->delayMillis(10);
+ }
+
+ SynchronizedList<SceneObject *>::iterator i;
+ for (i = BF_GLOBALS._sceneObjects->begin(); i != BF_GLOBALS._sceneObjects->end(); ++i) {
+ SceneObject *pObj = *i;
+ pObj->addMover(NULL);
+ pObj->setObjectWrapper(NULL);
+ pObj->animate(ANIM_MODE_NONE, NULL);
+ }
+
+ BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
+ BF_GLOBALS._v51C44 = 1;
+ scene->loadScene(999);
+ setDelay(5);
+ break;
+ }
+ case 6:
+ setDelay(5);
+ break;
+ case 7:
+ BF_GLOBALS._v51C44 = 0;
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene600::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(600);
+ setZoomPercents(0, 100, 200, 100);
+ _sceneBounds.moveTo(320, 0);
+
+ _sound1.play(58);
+ _sound1.holdAt(1);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.hide();
+ BF_GLOBALS._player.setPosition(Common::Point(639, 0));
+ BF_GLOBALS._player.disableControl();
+
+ _object3.postInit();
+ _object3.hide();
+ _object2.postInit();
+
+ _object1.postInit();
+ _object1.setVisage(600);
+ _object1.setStrip(7);
+ _object1.setPosition(Common::Point(417, 82));
+
+ BF_GLOBALS.clearFlag(onDuty);
+ BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60);
+ BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 60);
+ _sceneMode = 600;
+
+ setAction(&_action1, this);
+}
+
+void Scene600::signal() {
+ BF_GLOBALS._sceneManager.changeScene(620);
+}
+
+// WORKAROUND: Fix for original game bug where the global scrolling object follower
+// remains set to an object within the scene that is no longer active
+void Scene600::remove() {
+ BF_GLOBALS._scrollFollower = &BF_GLOBALS._player;
+
+ SceneExt::remove();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 620 - Hospital cut-scene
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene620::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(999);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setVisage(621);
+ BF_GLOBALS._player.setPosition(Common::Point(47, 96));
+
+ static const uint32 black = 0;
+ add2Faders((const byte *)&black, 2, 621, this);
+}
+
+void Scene620::signal() {
+ static const uint32 black = 0;
+
+ switch (_sceneMode++) {
+ case 0:
+ case 3:
+ case 9:
+ case 12:
+ _timer1.set(60, this);
+ break;
+ case 1:
+ case 4:
+ case 7:
+ case 10:
+ case 13:
+ case 16:
+ case 19:
+ addFader((const byte *)&black, 2, this);
+ break;
+ case 2:
+ BF_GLOBALS._player.remove();
+ _object1.postInit();
+ _object1.setVisage(622);
+ _object1.setPosition(Common::Point(101, 41));
+ addFader((const byte *)&black, 2, this);
+ break;
+ case 5:
+ _object1.remove();
+
+ _object2.postInit();
+ _object2.setVisage(623);
+ _object2.setPosition(Common::Point(216, 4));
+ add2Faders((const byte *)&black, 2, 623, this);
+ break;
+ case 6:
+ _object2.animate(ANIM_MODE_5, this);
+ break;
+ case 8:
+ _object2.remove();
+
+ _object3.postInit();
+ _object3.setVisage(624);
+ _object3.setFrame(1);
+ _object3.setPosition(Common::Point(28, 88));
+ add2Faders((const byte *)&black, 2, 624, this);
+ break;
+ case 11:
+ _object3.remove();
+
+ _object4.postInit();
+ _object4.setVisage(625);
+ _object4.setPosition(Common::Point(168, 8));
+ add2Faders((const byte *)&black, 2, 625, this);
+ break;
+ case 14:
+ _object4.remove();
+
+ _object5.postInit();
+ _object5.setVisage(626);
+ _object5.setPosition(Common::Point(249, 183));
+ add2Faders((const byte *)&black, 2, 626, this);
+ break;
+ case 15:
+ _object5.animate(ANIM_MODE_5, this);
+ break;
+ case 17:
+ _object5.remove();
+
+ _object6.postInit();
+ _object6.setVisage(627);
+ _object6.setPosition(Common::Point(65, 24));
+ add2Faders((const byte *)&black, 2, 627, this);
+ break;
+ case 18:
+ _object6.animate(ANIM_MODE_5, this);
+ break;
+ case 20:
+ _object6.remove();
+ BF_GLOBALS._bookmark = bArrestedDrunk;
+ BF_GLOBALS._v4CEB6 = 0;
+ BF_GLOBALS._dayNumber = 3;
+ BF_GLOBALS._sceneManager.changeScene(271);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 666 - Death Scene
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene666::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.hide();
+ setDelay(6);
+ break;
+ case 1:
+ BF_GLOBALS._game->restartGame();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene666::Item1::startAction(CursorType action, Event &event) {
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene666::postInit(SceneObjectList *OwnerList) {
+ BF_GLOBALS._sound1.play(27);
+ SceneExt::postInit();
+ BF_GLOBALS._interfaceY = 200;
+ loadScene(999);
+ BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
+
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._dayNumber = 1;
+ BF_GLOBALS._deathReason = BF_GLOBALS._randomSource.getRandomNumber(23);
+ }
+
+ BF_GLOBALS._scenePalette.loadPalette(BF_GLOBALS._sceneManager._previousScene);
+ T2_GLOBALS._uiElements._active = false;
+
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 666, -1, -1, -1, 1, NULL);
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 271) {
+ setAction(&_action1);
+ } else {
+ switch (BF_GLOBALS._deathReason) {
+ case 4:
+ case 18:
+ case 19:
+ case 20:
+ BF_GLOBALS._scenePalette.loadPalette(668);
+ BF_GLOBALS._player.setVisage(668);
+ BF_GLOBALS._player.setStrip2(1);
+ BF_GLOBALS._player.setPosition(Common::Point(77, 155));
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ BF_GLOBALS._scenePalette.loadPalette(900);
+ BF_GLOBALS._scenePalette.refresh();
+ BF_GLOBALS._player.setVisage(666);
+ BF_GLOBALS._player.setPosition(Common::Point(60, 160));
+ signal();
+ break;
+ case 7:
+ case 11:
+ case 12:
+ case 22:
+ BF_GLOBALS._scenePalette.loadPalette(667);
+ BF_GLOBALS._scenePalette.refresh();
+
+ _object1.postInit();
+ _object2.postInit();
+ _object3.postInit();
+ setAction(&_sequenceManager, this, 6660, &BF_GLOBALS._player, &_object1, &_object2,
+ &_object3, NULL);
+ break;
+ case 13:
+ case 14:
+ BF_GLOBALS._scenePalette.loadPalette(665);
+ BF_GLOBALS._scenePalette.refresh();
+ BF_GLOBALS._player.setVisage(665);
+ BF_GLOBALS._player.setPosition(Common::Point(80, 140));
+ signal();
+ break;
+ case 24:
+ BF_GLOBALS._player.setVisage(664);
+ BF_GLOBALS._player.setPosition(Common::Point(70, 160));
+ signal();
+ break;
+ default:
+ BF_GLOBALS._scenePalette.loadPalette(669);
+ BF_GLOBALS._scenePalette.refresh();
+ BF_GLOBALS._player.setVisage(669);
+ BF_GLOBALS._player.setStrip(1);
+ BF_GLOBALS._player.setPosition(Common::Point(27, 27));
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ }
+ }
+}
+
+void Scene666::remove() {
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._scrollFollower = &BF_GLOBALS._player;
+ SceneExt::remove();
+ T2_GLOBALS._uiElements._active = true;
+}
+
+void Scene666::signal() {
+ BF_GLOBALS._player.enableControl();
+ Rect textRect, sceneBounds;
+
+ _text._color1 = 19;
+ _text._color2 = 9;
+ _text._color3 = 13;
+ _text._fontNumber = 4;
+ _text._width = 150;
+
+ Common::String msg = g_resourceManager->getMessage(666, BF_GLOBALS._deathReason);
+ sceneBounds = BF_GLOBALS._sceneManager._scene->_sceneBounds;
+ sceneBounds.collapse(4, 2);
+ BF_GLOBALS.gfxManager()._font.getStringBounds(msg.c_str(), textRect, _text._width);
+ textRect.moveTo(160, 10);
+ textRect.contain(sceneBounds);
+
+ _text.setup(msg);
+ _text.setPosition(Common::Point(textRect.left, textRect.top));
+ _text.setPriority(255);
+ _text.show();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 690 - Decking
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene690::Object1::startAction(CursorType action, Event &event) {
+ Scene690 *scene = (Scene690 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (scene->_object2._strip == 1)) {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._walkRegions.proc2(1);
+ BF_GLOBALS._walkRegions.proc2(6);
+ scene->_sceneMode = 6901;
+ scene->setAction(&scene->_sequenceManager, scene, 6901, &BF_GLOBALS._player,
+ &scene->_object2, &scene->_object1, &scene->_object4, &scene->_object5, NULL);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene690::Object2::startAction(CursorType action, Event &event) {
+ Scene690 *scene = (Scene690 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_object2._strip == 3) {
+ scene->_object6.postInit();
+ scene->_object6.hide();
+ scene->_object6.fixPriority(1);
+ scene->_object6.setDetails(690, 21, 17, 23, 1, NULL);
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 6902;
+ scene->setAction(&scene->_sequenceManager, scene, 6902, &BF_GLOBALS._player,
+ &scene->_object2, &scene->_object6, NULL);
+ return true;
+ }
+ break;
+ case CURSOR_TALK:
+ scene->_stripManager.start(6900, &BF_GLOBALS._stripProxy);
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene690::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(690);
+ setZoomPercents(125, 80, 140, 100);
+ BF_GLOBALS._sound1.fadeSound(48);
+
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+
+ _stripManager.addSpeaker(&_jakeSpeaker);
+
+ _object1.postInit();
+ _object1.setVisage(690);
+ _object1.setStrip2(2);
+ _object1.fixPriority(188);
+ _object1.setPosition(Common::Point(50, 166));
+ _object1.setDetails(690, 4, 17, 26, 1, NULL);
+
+ _object3.postInit();
+ _object3.setVisage(690);
+ _object3.fixPriority(100);
+ _object3.setPosition(Common::Point(238, 125));
+ _object3.setDetails(690, 7, 17, 28, 1, NULL);
+
+ _object2.postInit();
+ _object2.setVisage(694);
+ _object2.setStrip2(3);
+ _object2.fixPriority(125);
+ _object2.setPosition(Common::Point(100, 134));
+ _object2.setDetails(690, 12, -1, 11, 1, NULL);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player._moveDiff.x = 8;
+
+ _object4.postInit();
+ _object4.setDetails(690, 13, -1, -1, 1, NULL);
+
+ _object5.postInit();
+ _object5.setDetails(690, 14, -1, -1, 1, NULL);
+
+ _sceneMode = 6903;
+ setAction(&_sequenceManager, this, 6903, &BF_GLOBALS._player, &_object3, &_object4, &_object5, NULL);
+
+ _item1.setDetails(Rect(45, 28, 74, 48), 690, 0, 15, 20, 1, NULL);
+ _item2.setDetails(Rect(0, 0, 129, 78), 690, 1, 15, 20, 1, NULL);
+ _item9.setDetails(Rect(4, 26, 35, 143), 690, 29, 17, 22, 1, NULL);
+ _item10.setDetails(Rect(87, 29, 109, 112), 690, 29, 17, 22, 1, NULL);
+ _item11.setDetails(Rect(135, 30, 160, 120), 690, 29, 17, 22, 1, NULL);
+ _item3.setDetails(Rect(37, 89, 84, 117), 690, 2, 16, 21, 1, NULL);
+ _item4.setDetails(Rect(123, 98, 201, 131), 690, 5, -1, -1, 1, NULL);
+ _item7.setDetails(Rect(285, 95, 303, 133), 690, 8, -1, 25, 1, NULL);
+ _item16.setDetails(Rect(166, 35, 210, 116), 690, 32, -1, -1, 1, NULL);
+ _item6.setDetails(Rect(255, 44, 289, 130), 690, 7, 17, 24, 1, NULL);
+ _item8.setDetails(Rect(299, 44, 314, 53), 690, 27, 15, -1, 1, NULL);
+ _item5.setDetails(Rect(130, 20, 319, 135), 690, 6, 16, 28, 1, NULL);
+ _item12.setDetails(1, 690, 10, -1, -1, 1);
+ _item13.setDetails(2, 690, 30, -1, -1, 1);
+ _item14.setDetails(3, 690, 31, -1, -1, 1);
+ _item15.setDetails(4, 690, 9, -1, -1, 1);
+ _item17.setDetails(Rect(143, 0, 182, 14), 690, 33, -1, -1, 1, NULL);
+}
+
+void Scene690::signal() {
+ switch (_sceneMode) {
+ case 6901:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(710);
+ break;
+ case 6902:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 6903:
+ BF_GLOBALS._walkRegions.proc1(1);
+ BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes6.h b/engines/tsage/blue_force/blueforce_scenes6.h
new file mode 100644
index 0000000000..e354e9e069
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes6.h
@@ -0,0 +1,125 @@
+/* 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 TSAGE_BLUEFORCE_SCENES6_H
+#define TSAGE_BLUEFORCE_SCENES6_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene600 : public SceneExt {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ ASoundExt _sound1;
+ NamedObject _object1, _object2, _object3;
+ BackgroundSceneObject _object4, _object5;
+ BackgroundSceneObject _object6, _object7, _object8;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void remove();
+};
+
+class Scene620 : public PalettedScene {
+public:
+ SequenceManager _sequenceManager;
+ Timer _timer1;
+ NamedObject _object1, _object2, _object3;
+ NamedObject _object4, _object5, _object6;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene666 : public SceneExt {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ Action1 _action1;
+ SequenceManager _sequenceManager;
+ NamedObject _object1, _object2, _object3;
+ Item1 _item1;
+ SceneText _text;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+
+class Scene690 : public SceneExt {
+ /* Objects */
+ class Object1: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object2: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ Object1 _object1;
+ Object2 _object2;
+ NamedObject _object3, _object4, _object5, _object6;
+ NamedHotspot _item1, _item2, _item3, _item4, _item5;
+ NamedHotspot _item6, _item7, _item8, _item9, _item10;
+ NamedHotspot _item11, _item12, _item13, _item14, _item15;
+ NamedHotspot _item16, _item17;
+ SpeakerJake _jakeSpeaker;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes7.cpp b/engines/tsage/blue_force/blueforce_scenes7.cpp
new file mode 100644
index 0000000000..2ced7ce08c
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes7.cpp
@@ -0,0 +1,277 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes7.h"
+#include "tsage/globals.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 710 - Beach
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene710::Timer1::signal() {
+ PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(136, 138, -1);
+ rotation->setDelay(25);
+ rotation = BF_GLOBALS._scenePalette.addRotation(146, 148, -1);
+ rotation->setDelay(30);
+ rotation = BF_GLOBALS._scenePalette.addRotation(187, 191, -1);
+ rotation->setDelay(35);
+ rotation = BF_GLOBALS._scenePalette.addRotation(245, 246, -1);
+ rotation->setDelay(20);
+ remove();
+}
+
+void Scene710::Action1::signal() {
+ Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ _state = 7104;
+ if (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)
+ _state = 7105;
+ setDelay(3);
+ break;
+ case 1: {
+ ADD_MOVER(BF_GLOBALS._player, scene->_laura._position.x + 8, scene->_laura._position.y + 8);
+ break;
+ }
+ case 2:
+ BF_GLOBALS._player._strip = 2;
+ scene->_stripManager.start(_state, this);
+ break;
+ case 3:
+ if (_state != 7105)
+ BF_GLOBALS._player.enableControl();
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 7106;
+ scene->setAction(&scene->_sequenceManager1, scene, 7106, &BF_GLOBALS._player, &scene->_laura, &scene->_kid, &scene->_dog, NULL);
+ }
+ if (_state < 7104) {
+ _state++;
+ if ((_state == 7104) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1))
+ _state = 7105;
+ }
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+// Laura
+bool Scene710::Object3::startAction(CursorType action, Event &event) {
+ Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ BF_GLOBALS._player.setAction(&scene->_action1);
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene710::Object4::startAction(CursorType action, Event &event) {
+ Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_LOOK) && (scene->_kid._position.x < 0)) {
+ SceneItem::display2(710, 13);
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+//Stick
+bool Scene710::Object5::startAction(CursorType action, Event &event) {
+ Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (scene->_v1D64 <= 2)
+ return NamedObject::startAction(action, event);
+ else {
+ SceneItem::display2(710, 3);
+ scene->_v1D66 = 1;
+ return true;
+ }
+ case CURSOR_USE:
+ if ((scene->_kid._position.x < 0) && (scene->_v1D62 == 1)) {
+ scene->_v1D64++;
+ if (scene->_v1D66 == 0) {
+ BF_GLOBALS._player.disableControl();
+ scene->_v1D62 = 0;
+ scene->_sceneMode = 7105;
+ scene->setAction(&scene->_sequenceManager1, scene, 7105, &BF_GLOBALS._player, &scene->_stick, &scene->_dog, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 7101;
+ scene->setAction(&scene->_sequenceManager1, scene, 7101, &BF_GLOBALS._player, &scene->_dog, &scene->_stick, NULL);
+ }
+ return true;
+ }
+ // No break on purpose
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+void Scene710::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(710);
+ _sceneBounds.moveTo(320, 0);
+
+ BF_GLOBALS._sound1.fadeSound(14);
+ _soundExt1.fadeSound(48);
+ _v51C34.set(40, 0, 280, 240);
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.hide();
+ BF_GLOBALS._player._moveDiff = Common::Point(4, 2);
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+ _stripManager.addSpeaker(&_jakeSpeaker);
+ _stripManager.addSpeaker(&_skipSpeaker);
+ _stripManager.addSpeaker(&_lauraSpeaker);
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+
+ _kid.postInit();
+ _kid._moveDiff = Common::Point(4, 2);
+ _laura.postInit();
+ _laura._moveDiff = Common::Point(4, 2);
+ _dog.postInit();
+ _dog._moveDiff = Common::Point(4, 2);
+ _stick.postInit();
+ _stick.setVisage(710);
+ _stick.setStrip(2);
+ _stick.animate(ANIM_MODE_2, NULL);
+ _stick.setPosition(Common::Point(650, 160));
+ _stick._moveDiff.x = 16;
+ _stick.setDetails(710, 4, -1, -1, 1, NULL);
+ _laura.setDetails(710, 2, -1, -1, 1, NULL);
+ _kid.setDetails(710, 6, -1, -1, 1, NULL);
+ _dog.setDetails(710, 0, -1, -1, 1, NULL);
+
+ _item1.setDetails(Rect(555, 68, 583, 101), 710, 7, 23, -1, 1, NULL);
+ _item2.setDetails(Rect(583, 46, 611, 78), 710, 7, 23, -1, 1, NULL);
+ _item3.setDetails(Rect(611, 24, 639, 56), 710, 7, 23, -1, 1, NULL);
+ _item6.setDetails(1, 710, 9, 1, -1, 1);
+ _item4.setDetails(2, 710, 8, 14, -1, 1);
+ _item5.setDetails(3, 710, 10, 16, -1, 1);
+ _item8.setDetails(Rect(222, 18, 249, 42), 710, 12, 18, -1, 1, NULL);
+ _item7.setDetails(Rect(0, 0, 640, 52), 710, 11, 17, -1, 1, NULL);
+ _item9.setDetails(Rect(0, 0, 640, 128), 710, 5, 15, -1, 1, NULL);
+
+ _v1D62 = _v1D64 = _v1D66 = _v1D68 = 0;
+ _action1._state = 7100;
+ _timer1.set(2, NULL);
+ _sceneMode = 7100;
+ setAction(&_sequenceManager1, this, 7100, &BF_GLOBALS._player, &_laura, &_kid, &_dog, NULL);
+}
+
+void Scene710::signal() {
+ switch (_sceneMode) {
+ case 0:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 7100:
+ BF_GLOBALS._player.enableControl();
+ _sceneMode = 7102;
+ setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
+ break;
+ case 7101:
+ BF_GLOBALS._player.enableControl();
+ BF_INVENTORY.setObjectScene(INV_CRATE1, 1);
+ _stick.remove();
+ BF_GLOBALS._walkRegions.proc2(2);
+ break;
+ case 7102:
+ _stick.setPosition(Common::Point(100, 122));
+ _stick.animate(ANIM_MODE_NONE, NULL);
+ _stick._strip = 2;
+ if (_v1D64 <= 2)
+ _stick._frame = 2;
+ else {
+ if (_v1D64 == 3) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ _stripManager.start(7108, this);
+ }
+ _stick._frame = 1;
+ }
+ _v1D62 = 1;
+ BF_GLOBALS._walkRegions.proc1(2);
+ if ((_v1D68 != 0) && (_sceneMode != 0))
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 7103:
+ if (BF_GLOBALS._player._position.x > 179) {
+ _sceneMode = 7102;
+ setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
+ } else {
+ _sceneMode = 7104;
+ setAction(&_sequenceManager3, this, 7104, &_kid, NULL);
+ }
+ break;
+ case 7105:
+ _v1D68 = 1;
+ // No break on purpose
+ case 7104:
+ _sceneMode = 7102;
+ setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
+ BF_GLOBALS._walkRegions.proc2(2);
+ break;
+ case 7106:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(270);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene710::dispatch() {
+ if ((_kid._position.x > 0) && (_v1D62 == 1) && (_sceneMode != 7106)) {
+ _v1D62 = 0;
+ _sceneMode = 7103;
+ setAction(&_sequenceManager1, this, 7103, &_kid, &_stick, &_dog, NULL);
+ }
+ SceneExt::dispatch();
+}
+
+void Scene710::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_v1D62);
+ s.syncAsSint16LE(_v1D64);
+ s.syncAsSint16LE(_v1D66);
+ s.syncAsSint16LE(_v1D68);
+}
+
+
+} // End of namespace BlueForce
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes7.h b/engines/tsage/blue_force/blueforce_scenes7.h
new file mode 100644
index 0000000000..91bd1e537f
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes7.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.
+ *
+ */
+
+#ifndef TSAGE_BLUEFORCE_SCENES7_H
+#define TSAGE_BLUEFORCE_SCENES7_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene710: public SceneExt {
+ // Actions
+ class Action1: public ActionExt {
+ public:
+ void signal();
+ };
+ // Timers
+ class Timer1: public Timer {
+ public:
+ void signal();
+ };
+ // Objects
+ class Object3: public NamedObject {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Object4: public NamedObject {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Object5: public NamedObject {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ SequenceManager _sequenceManager3;
+ Timer1 _timer1;
+ SpeakerJake _jakeSpeaker;
+ SpeakerLaura _lauraSpeaker;
+ SpeakerSkip _skipSpeaker;
+ SpeakerGameText _gameTextSpeaker;
+ Action1 _action1;
+ NamedObject _object1;
+ NamedObject _kid;
+ Object3 _laura;
+ Object4 _dog;
+ Object5 _stick;
+ ASoundExt _soundExt1;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ NamedHotspot _item8;
+ NamedHotspot _item9;
+ int _v1D62, _v1D64, _v1D66, _v1D68;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+} // End of namespace BlueForce
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp
new file mode 100644
index 0000000000..c81f3b8d65
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes8.cpp
@@ -0,0 +1,3612 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes8.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 800 - Jamison & Ryan
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene800::Item1::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(800, 11);
+ return true;
+ } else {
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene800::Item2::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(800, 1);
+ return true;
+ } else {
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene800::Doorway::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(800, 4);
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS._dayNumber == 5)
+ SceneItem::display2(800, 14);
+ else if (BF_GLOBALS._dayNumber < 2)
+ SceneItem::display2(800, BF_GLOBALS.getFlag(onDuty) ? 6 : 15);
+ else if (((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && (BF_GLOBALS._dayNumber == 3)) ||
+ (BF_GLOBALS._bookmark == bDoneWithIsland))
+ SceneItem::display2(800, 5);
+ else {
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ ADD_PLAYER_MOVER_NULL(scene->_lyle, 277, 145);
+ }
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8000;
+ setAction(&scene->_sequenceManager, scene, 8000, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene800::Car1::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(800, 2);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(800, 3);
+ return true;
+ case INV_TICKET_BOOK:
+ if (BF_GLOBALS.getFlag(ticketVW))
+ SceneItem::display2(800, 12);
+ else if (!BF_GLOBALS.getFlag(onDuty))
+ SceneItem::display2(800, 13);
+ else {
+ BF_GLOBALS.setFlag(ticketVW);
+ BF_GLOBALS._player.disableControl();
+ T2_GLOBALS._uiElements.addScore(30);
+ scene->_sceneMode = 8005;
+ scene->setAction(&scene->_action1);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene800::Motorcycle::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(800, 0);
+ return true;
+ case CURSOR_USE:
+ if (BF_GLOBALS.getFlag(fWithLyle))
+ SceneItem::display2(800, 8);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8002;
+ setAction(&scene->_sequenceManager, scene, 8002, &BF_GLOBALS._player, this, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene800::Lyle::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(800, 7);
+ return true;
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8001;
+ scene->_stripManager.start(8003, scene);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene800::Car2::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(800, 9);
+ return true;
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(fWithLyle))
+ SceneItem::display2(800, 10);
+ else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8003;
+ setAction(&scene->_sequenceManager, scene, 8003, &BF_GLOBALS._player, &scene->_lyle, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene800::Action1::signal() {
+ Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ BF_GLOBALS._player.disableControl();
+ ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 95, 153);
+ break;
+ }
+ case 1: {
+ ADD_MOVER(BF_GLOBALS._player, 70, 157);
+ break;
+ }
+ case 2:
+ BF_GLOBALS._player.setVisage(800);
+ BF_GLOBALS._player.setStrip(1);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.fixPriority(200);
+ BF_GLOBALS._player.animate(ANIM_MODE_4, 16, 1, this);
+ break;
+ case 3:
+ scene->_object6.postInit();
+ scene->_object6.setVisage(800);
+ scene->_object6.setStrip(2);
+ scene->_object6.setFrame(2);
+ scene->_object6.setPosition(Common::Point(58, 135));
+ scene->_object6.fixPriority(170);
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ BF_GLOBALS._player.setVisage(352);
+ BF_GLOBALS._player.setStrip(2);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.fixPriority(-1);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER(BF_GLOBALS._player, 89, 154);
+ break;
+ case 5:
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ }
+
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene800::postInit(SceneObjectList *OwnerList) {
+ loadScene(800);
+ SceneExt::postInit();
+ setZoomPercents(130, 50, 155, 100);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(1358);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.setPosition(Common::Point(319, 144));
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ BF_GLOBALS._player.changeZoom(-1);
+
+ _motorcycle.postInit();
+ _motorcycle.setVisage(301);
+ _motorcycle.setPosition(Common::Point(319, 162));
+
+ if ((BF_GLOBALS._dayNumber >= 2) && (BF_GLOBALS._dayNumber < 5)) {
+ _car2.postInit();
+ _car2.setVisage(444);
+ _car2.setStrip(3);
+ _car2.setFrame(2);
+ _car2.setPosition(Common::Point(237, 161));
+ _car2.changeZoom(110);
+ _car2.fixPriority(158);
+ BF_GLOBALS._sceneItems.push_back(&_car2);
+
+ BF_GLOBALS._walkRegions.proc1(8);
+ }
+
+ if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) {
+ _car2.remove();
+ BF_GLOBALS._walkRegions.proc2(8);
+ }
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle.setVisage(1359);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setPosition(Common::Point(210, 160));
+ _lyle.changeZoom(-1);
+ BF_GLOBALS._sceneItems.push_back(&_lyle);
+
+ _motorcycle.setVisage(580);
+ _motorcycle.setStrip(2);
+ _motorcycle.setFrame(2);
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ BF_GLOBALS._player.setVisage(352);
+ } else {
+ _motorcycle.setVisage(580);
+ _motorcycle.setStrip(2);
+ _motorcycle.setFrame(2);
+ }
+ BF_GLOBALS._sceneItems.push_back(&_motorcycle);
+
+ _doorway.postInit();
+ _doorway.setVisage(800);
+ _doorway.setStrip(3);
+ _doorway.setPosition(Common::Point(287, 140));
+ BF_GLOBALS._sceneItems.push_back(&_doorway);
+
+ _car1.postInit();
+ _car1.setVisage(800);
+ _car1.setStrip(2);
+ _car1.setFrame(1);
+ _car1.setPosition(Common::Point(58, 163));
+ BF_GLOBALS._sceneItems.push_back(&_car1);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 810) {
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._player.setPosition(Common::Point(271, 148));
+ BF_GLOBALS._player.enableControl();
+ } else {
+ BF_GLOBALS._player.changeZoom(75);
+ BF_GLOBALS._player.setPosition(Common::Point(275, 135));
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8001;
+ setAction(&_sequenceManager, this, 8001, &BF_GLOBALS._player, &_doorway, NULL);
+ }
+ } else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && (BF_GLOBALS._bookmark < bFlashBackThree)) {
+ BF_GLOBALS._bookmark = bFlashBackThree;
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setPosition(Common::Point(231, 150));
+ BF_GLOBALS._player.setStrip(3);
+
+ _lyle.setPosition(Common::Point(244, 162));
+ _lyle.setStrip(4);
+ _sceneMode = 8004;
+ setAction(&_sequenceManager, this, 8004, &_lyle, &_doorway, NULL);
+ } else {
+ BF_GLOBALS._player.updateAngle(_motorcycle._position);
+ BF_GLOBALS._player.enableControl();
+ }
+
+ _item2.setBounds(Rect(47, 26, 319, 143));
+ BF_GLOBALS._sceneItems.push_back(&_item2);
+ _item1.setBounds(Rect(0, 0, 320, 165));
+ BF_GLOBALS._sceneItems.push_back(&_item1);
+
+ BF_GLOBALS._sound1.fadeSound(33);
+}
+
+void Scene800::signal() {
+ switch (_sceneMode) {
+ case 8000:
+ BF_GLOBALS._sceneManager.changeScene(810);
+ break;
+ case 8001:
+ case 8005:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8002:
+ case 8003:
+ BF_GLOBALS._sceneManager.changeScene(60);
+ break;
+ case 8004:
+ BF_GLOBALS.clearFlag(fWithLyle);
+ _lyle.remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene800::dispatch() {
+ SceneExt::dispatch();
+ if (BF_GLOBALS._player.getRegionIndex() == 7) {
+ BF_GLOBALS._player.updateZoom();
+ } else {
+ BF_GLOBALS._player.changeZoom(-1);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 810 - Lyle's Office
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene810::Action1::signal() {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (scene->_lyle._position.x == 115) {
+ ADD_PLAYER_MOVER(174, 142);
+ } else if (scene->_lyle._position.x < 160) {
+ ADD_PLAYER_MOVER(scene->_lyle._position.x + 20, scene->_lyle._position.y + 15);
+ } else {
+ ADD_PLAYER_MOVER(scene->_lyle._position.x - 20, scene->_lyle._position.y + 15);
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.updateAngle(scene->_lyle._position);
+ scene->_stripManager.start(scene->_sceneMode, this);
+ break;
+ case 2:
+ if (BF_GLOBALS.getFlag(shownFax) && (BF_GLOBALS._dayNumber == 3) && !BF_GLOBALS.getFlag(fWithLyle))
+ BF_GLOBALS.setFlag(showMugAround);
+
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene810::Action2::signal() {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (!BF_GLOBALS.getFlag(shownLyleCrate1Day1))
+ T2_GLOBALS._uiElements.addScore(30);
+
+ if (scene->_lyle._position.x == 115) {
+ ADD_PLAYER_MOVER(174, 142);
+ } else {
+ ADD_PLAYER_MOVER(193, 105);
+ }
+ break;
+ case 1:
+ BF_GLOBALS._player.setStrip(8);
+ if (scene->_lyle._position.x != 115)
+ _actionIndex = 3;
+
+ if (BF_GLOBALS.getFlag(shownLyleCrate1Day1)) {
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ scene->_stripManager.start(8138, this);
+ } else {
+ scene->_stripManager.start((BF_GLOBALS._dayNumber == 3) ? 8110 : 8126, this);
+ }
+ } else if (BF_GLOBALS._dayNumber >= 3) {
+ scene->_stripManager.start(8110, this);
+ } else {
+ scene->_stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8140 : 8128, this);
+ }
+ break;
+ case 2:
+ setAction(&scene->_sequenceManager1, this, 8117, &scene->_lyle, &scene->_chair, NULL);
+ break;
+ case 3:
+ BF_GLOBALS._walkRegions.proc2(4);
+ ADD_PLAYER_MOVER_THIS(scene->_lyle, 27, 124);
+ break;
+ case 4:
+ scene->_lyle.setVisage(813);
+ scene->_lyle.setStrip(2);
+ scene->_lyle.setFrame(1);
+
+ ADD_PLAYER_MOVER(84, 113);
+ break;
+ case 5:
+ BF_GLOBALS._player.setStrip(8);
+ scene->_lyle.animate(ANIM_MODE_4, 5, 1, this);
+ break;
+ case 6:
+ scene->_lyle.animate(ANIM_MODE_5, NULL);
+ scene->_stripManager.start(8111, this);
+ break;
+ case 7:
+ scene->_lyle.setVisage(845);
+ scene->_lyle.setStrip(1);
+ scene->_lyle.setFrame(1);
+ scene->_lyle.animate(ANIM_MODE_1, NULL);
+
+ scene->_stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8137 : 8112, this);
+ break;
+ case 8:
+ BF_GLOBALS._walkRegions.proc1(13);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene810::Lyle::startAction(CursorType action, Event &event) {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 26);
+ return true;
+
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.updateAngle(_position);
+
+ switch (BF_GLOBALS._dayNumber) {
+ case 4:
+ scene->_sceneMode = (BF_INVENTORY.getObjectScene(INV_AUTO_RIFLE) == 810) ? 8001 : 8123;
+ break;
+ case 2:
+ if (BF_GLOBALS.getFlag(shownFax))
+ scene->_sceneMode = 8151;
+ else if (BF_GLOBALS.getFlag(onDuty)) {
+ if (BF_GLOBALS.getFlag(shownLyleCrate1)) {
+ scene->_sceneMode = BF_GLOBALS.getFlag(shownLyleCrate1Day1) ? 8145 : 8154;
+ } else if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLylePO)) {
+ scene->_sceneMode = 8145;
+ } else if (!_flag) {
+ ++_flag;
+ scene->_sceneMode = 8139;
+ } else {
+ scene->_sceneMode = 8152;
+ }
+ } else {
+ if (BF_GLOBALS.getFlag(shownLyleCrate1)) {
+ scene->_sceneMode = BF_GLOBALS.getFlag(shownLyleCrate1Day1) ? 8133 : 8153;
+ } else if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLylePO)) {
+ scene->_sceneMode = 8133;
+ } else if (!_flag) {
+ ++_flag;
+ scene->_sceneMode = 8127;
+ } else {
+ scene->_sceneMode = 8152;
+ }
+ }
+ break;
+ default:
+ if (BF_GLOBALS.getFlag(shownFax))
+ scene->_sceneMode = 8146;
+ else if (BF_GLOBALS.getFlag(shownLylePO) || BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLyleCrate1))
+ scene->_sceneMode = 8108;
+ else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1)
+ scene->_sceneMode = 8107;
+ else
+ scene->_sceneMode = 8155;
+ break;
+ }
+
+ scene->setAction(&scene->_action1);
+ return true;
+
+ case INV_FOREST_RAP:
+ if (BF_GLOBALS.getFlag(shownLyleRapsheet))
+ scene->_sceneMode = 8148;
+ else {
+ BF_GLOBALS.setFlag(shownLyleRapsheet);
+ if (BF_GLOBALS._dayNumber != 2) {
+ scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8122 : 8101;
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8142 : 8143;
+ } else {
+ scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8130 : 8131;
+ }
+ }
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_action1);
+ return true;
+
+ case INV_COBB_RAP:
+ if (BF_GLOBALS.getFlag(shownFax)) {
+ scene->_sceneMode = 8151;
+ } else {
+ BF_GLOBALS.setFlag(shownFax);
+ scene->_sceneMode = 8118;
+ }
+
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_action1);
+ return true;
+
+ case INV_AUTO_RIFLE:
+ BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 810);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8116;
+ scene->setAction(&scene->_sequenceManager1, scene, 8116, &BF_GLOBALS._player, NULL);
+ return true;
+
+ case INV_PRINT_OUT:
+ if (BF_GLOBALS.getFlag(shownLylePO)) {
+ scene->_sceneMode = 8149;
+ } else if (!BF_GLOBALS.getFlag(shownLylePO)) {
+ if (!BF_GLOBALS.getFlag(shownFax)) {
+ // WORKAROUND: Original did not do a 'not', but I think this is correct
+ BF_GLOBALS.setFlag(shownFax);
+ scene->_sceneMode = 8125;
+ } else if (BF_GLOBALS.getFlag(shownLyleRapsheet)) {
+ scene->_sceneMode = 8104;
+ } else {
+ scene->_sceneMode = 8121;
+ }
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ scene->_sceneMode = 8141;
+ } else {
+ if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLyleCrate1))
+ scene->_sceneMode = 8129;
+ else
+ scene->_sceneMode = 8121;
+ }
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_action1);
+ return true;
+
+ case INV_CRATE1:
+ if (BF_GLOBALS.getFlag(shownLyleCrate1)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8147;
+ scene->setAction(&scene->_action1);
+ } else {
+ BF_GLOBALS.setFlag(shownLyleCrate1);
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_action2);
+ }
+ return true;
+
+ default:
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+bool Scene810::Chair::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 28);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 29);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene810::Object3::startAction(CursorType action, Event &event) {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 30);
+ return true;
+ case CURSOR_USE:
+ if (!BF_GLOBALS.getFlag(seenFolder)) {
+ BF_GLOBALS.setFlag(seenFolder);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8104;
+ scene->setAction(&scene->_sequenceManager1, scene, 8104, &BF_GLOBALS._player, this, NULL);
+ } else if (BF_INVENTORY.getObjectScene(INV_MICROFILM) == 810) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8114;
+ scene->setAction(&scene->_sequenceManager1, scene, 8114, &BF_GLOBALS._player, NULL);
+ } else {
+ SceneItem::display2(810, 38);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene810::FaxMachineInset::startAction(CursorType action, Event &event) {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_WALK:
+ return true;
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 32);
+ return true;
+ case CURSOR_USE:
+ if (scene->_rect3.contains(event.mousePos)) {
+ if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) {
+ T2_GLOBALS._uiElements.addScore(50);
+ scene->_sound1.play(77);
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 8109;
+ scene->setAction(&scene->_sequenceManager1, scene, 8109, &BF_GLOBALS._player,
+ &scene->_object6, &scene->_object5, NULL);
+ scene->_fieldA70 = 1;
+ scene->_fieldA74 = 1;
+ remove();
+ } else {
+ SceneItem::display2(810, 39);
+ }
+ }
+
+ if (scene->_rect1.contains(event.mousePos) || scene->_rect2.contains(event.mousePos)) {
+ if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) {
+ scene->_sound1.play(77);
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 8109;
+ scene->setAction(&scene->_sequenceManager1, scene, 8109, &BF_GLOBALS._player,
+ &scene->_object6, &scene->_object5, NULL);
+ scene->_fieldA74 = 1;
+ remove();
+ } else {
+ SceneItem::display2(810, 39);
+ }
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene810::Object5::startAction(CursorType action, Event &event) {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 33);
+ return true;
+ case CURSOR_USE: {
+ scene->_sceneMode = 8195;
+ BF_GLOBALS._player.disableControl();
+
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(67, 111);
+ BF_GLOBALS._player.addMover(mover, &destPos, scene);
+ return true;
+ }
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene810::Object7::startAction(CursorType action, Event &event) {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8113;
+ scene->setAction(&scene->_sequenceManager1, scene, 8113, &BF_GLOBALS._player, NULL);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene810::Map::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 0);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 1);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Window::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 2);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 3);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Bookcase::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 4);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 5);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::FaxMachine::startAction(CursorType action, Event &event) {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 6);
+ return true;
+ case CURSOR_USE:
+ if (scene->_fieldA74 == 1) {
+ scene->_object5.startAction(action, event);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8105;
+
+ Common::Point destPos(67, 111);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, scene);
+ }
+ return true;
+ case INV_PRINT_OUT:
+ if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1)
+ SceneItem::display2(810, 31);
+ else {
+ BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 811);
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 811;
+
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_lyle)) {
+ scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(onDuty) ? 8108 : 8105,
+ &BF_GLOBALS._player, &scene->_object6, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 8111, &BF_GLOBALS._player,
+ &scene->_object6, NULL);
+ }
+ }
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::GarbageCan::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 8);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 9);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::FileCabinets::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 10);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 11);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::CoffeeMaker::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 12);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 13);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Shelves::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 14);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 15);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::MicroficheReader::startAction(CursorType action, Event &event) {
+ Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 16);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 17);
+ return true;
+ case INV_MICROFILM:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8106;
+ scene->setAction(&scene->_sequenceManager1, scene, 8106, &BF_GLOBALS._player, NULL);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Item10::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 18);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 19);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Pictures::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 20);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 21);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Item12::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 22);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 23);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Background::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 24);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Desk::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(810, 36);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(810, 37);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene810::Exit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER(event.mousePos.x + 30, event.mousePos.y);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene810::Scene810(): SceneExt() {
+ _fieldA70 = _fieldA74 = 0;
+ _rect1 = Rect(68, 12, 120, 22);
+ _rect2 = Rect(59, 27, 117, 37);
+ _rect3 = Rect(49, 43, 112, 54);
+}
+
+void Scene810::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_fieldA70);
+ s.syncAsSint16LE(_fieldA72);
+ s.syncAsSint16LE(_fieldA74);
+}
+
+void Scene810::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(810);
+ setZoomPercents(90, 80, 135, 100);
+ if (BF_GLOBALS._sceneManager._previousScene != 820)
+ BF_GLOBALS._sound1.fadeSound(76);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ BF_GLOBALS._player.enableControl();
+
+ if (BF_GLOBALS._dayNumber == 2)
+ BF_GLOBALS.setFlag(beenToJRDay2);
+
+ if (BF_GLOBALS._dayNumber == 3) {
+ _object3.postInit();
+ _object3.setVisage(810);
+ _object3.setStrip(3);
+ _object3.setPosition(Common::Point(154, 97));
+ _object3.fixPriority(128);
+ BF_GLOBALS._sceneItems.push_back(&_object3);
+ }
+
+ if (BF_GLOBALS._dayNumber == 4) {
+ BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 0);
+ BF_INVENTORY.setObjectScene(INV_COBB_RAP, 0);
+ BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 0);
+ BF_INVENTORY.setObjectScene(INV_CRATE1, 0);
+ }
+
+ _desk._sceneRegionId = 12;
+ BF_GLOBALS._sceneItems.push_back(&_desk);
+
+ _lyle.postInit();
+ _lyle.setVisage(812);
+ _lyle.setPosition(Common::Point(115, 112));
+ _lyle._moveDiff = Common::Point(4, 2);
+ _lyle.changeZoom(-1);
+ _lyle._flag = 0;
+ BF_GLOBALS._sceneItems.push_back(&_lyle);
+
+ _chair.postInit();
+ _chair.setVisage(810);
+ _chair.setStrip(2);
+ _chair.setPosition(Common::Point(113, 126));
+ _chair.hide();
+ BF_GLOBALS._sceneItems.push_back(&_chair);
+
+ _object6.postInit();
+ _object6.setVisage(810);
+ _object6.setStrip(6);
+ _object6.setPosition(Common::Point(51, 65));
+ _object6._numFrames = 3;
+ _object6.hide();
+
+ _object5.postInit();
+ _object5.setVisage(810);
+ _object5.setStrip(5);
+ _object5.setPosition(Common::Point(58, 82));
+ _object5._numFrames = 3;
+ _object5.fixPriority(108);
+ _object5.hide();
+
+ if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) {
+ _object5.show();
+ BF_GLOBALS._sceneItems.push_back(&_object5);
+ }
+
+ if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) {
+ _lyle.remove();
+ _chair.show();
+ }
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 820:
+ BF_GLOBALS._player.setStrip(7);
+ BF_GLOBALS._player.setPosition(Common::Point(278, 116));
+
+ _lyle.setVisage(845);
+ _lyle.setPosition(Common::Point(340, 175));
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+
+ _chair.show();
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8107;
+ setAction(&_sequenceManager1, this, 8107, &BF_GLOBALS._player, &_lyle, NULL);
+ break;
+ case 935:
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._scenePalette.loadPalette(2);
+ _lyle.remove();
+
+ BF_GLOBALS._player.setPosition(Common::Point(174, 142));
+ BF_GLOBALS._player.setStrip(8);
+ BF_GLOBALS._player.enableControl();
+
+ _chair.remove();
+ break;
+ default:
+ BF_GLOBALS._player.setPosition(Common::Point(340, 180));
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8100;
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.setVisage(845);
+ _lyle.setPosition(Common::Point(340, 175));
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+
+ _chair.show();
+ _sceneMode = 8196;
+ setAction(&_sequenceManager1, NULL, 8100, &BF_GLOBALS._player, NULL);
+ _lyle.setAction(&_sequenceManager2, this, 8107, &BF_GLOBALS._player, &_lyle, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 8100, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ }
+
+ _exit.setDetails(Rect(315, 117, 320, 154), 810, -1, -1, -1, 1, NULL);
+ _map.setBounds(Rect(10, 10, 81, 52));
+ _window.setBounds(Rect(96, 10, 155, 49));
+ _bookcase.setBounds(Rect(5, 70, 74, 105));
+ _garbageCan.setBounds(Rect(84, 118, 101, 142));
+ _fileCabinets.setBounds(Rect(203, 41, 255, 100));
+ _coffeeMaker.setBounds(Rect(182, 54, 202, 89));
+ _shelves.setBounds(Rect(265, 10, 319, 41));
+ _microficheReader.setBounds(Rect(283, 47, 314, 73));
+
+ _faxMachine._sceneRegionId = 8;
+ BF_GLOBALS._sceneItems.push_back(&_faxMachine);
+ _item10._sceneRegionId = 9;
+ BF_GLOBALS._sceneItems.push_back(&_item10);
+ _pictures._sceneRegionId = 10;
+ BF_GLOBALS._sceneItems.push_back(&_pictures);
+ _item12._sceneRegionId = 8;
+ BF_GLOBALS._sceneItems.push_back(&_item12);
+
+ BF_GLOBALS._sceneItems.addItems(&_microficheReader, &_map, &_window, &_bookcase, &_garbageCan,
+ &_fileCabinets, &_coffeeMaker, &_shelves, &_background, NULL);
+ _background.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y));
+}
+
+void Scene810::signal() {
+ switch (_sceneMode) {
+ case 811:
+ case 8105:
+ _faxMachineInset.postInit();
+ _faxMachineInset.setVisage(810);
+ _faxMachineInset.setPosition(Common::Point(77, 94));
+ _faxMachineInset.setStrip(8);
+ _faxMachineInset.fixPriority(250);
+ BF_GLOBALS._sceneItems.push_back(&_faxMachineInset);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8100:
+ if (BF_GLOBALS.getFlag(examinedFile810)) {
+ if ((BF_GLOBALS._dayNumber == 4) && BF_GLOBALS._sceneObjects->contains(&_lyle)) {
+ _sceneMode = 8115;
+ setAction(&_sequenceManager1, this, 8115, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ } else {
+ if ((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS._sceneObjects->contains(&_lyle)) {
+ _sceneMode = 8103;
+ setAction(&_sequenceManager1, this, 8103, &BF_GLOBALS._player, &_lyle, &_chair, NULL);
+ } else if (BF_GLOBALS.getFlag(shownLyleCrate1Day1) && !BF_GLOBALS.getFlag(shownLyleCrate1)) {
+ BF_GLOBALS.setFlag(shownLyleCrate1);
+ setAction(&_action2);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ }
+ break;
+ case 8101:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(800);
+ break;
+ case 8103:
+ _lyle.remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8104:
+ BF_GLOBALS.setFlag(examinedFile810);
+ _object7.postInit();
+ _object7.setVisage(810);
+ _object7.setPosition(Common::Point(54, 101));
+ _object7.fixPriority(200);
+ BF_GLOBALS._sceneItems.push_front(&_object7);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8106:
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(INV_MICROFILM, 820);
+ BF_GLOBALS._sceneManager.changeScene(820);
+ break;
+ case 8107:
+ if (BF_GLOBALS.getFlag(shownFax)) {
+ BF_GLOBALS.setFlag(showMugAround);
+ } else {
+ BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 8109:
+ _object6.setFrame(1);
+ BF_GLOBALS._sceneItems.push_front(&_object5);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8110:
+ case 8115:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8112:
+ BF_GLOBALS.setFlag(fWithLyle);
+ BF_GLOBALS._sceneManager.changeScene(800);
+ break;
+ case 8113:
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(935);
+ break;
+ case 8114:
+ T2_GLOBALS._uiElements.addScore(10);
+ BF_INVENTORY.setObjectScene(INV_MICROFILM, 1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8116:
+ BF_GLOBALS._bookmark = bDoneWithIsland;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8195:
+ BF_GLOBALS._player.setStrip(8);
+ BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 1);
+ if (_fieldA70 == 1) {
+ BF_INVENTORY.setObjectScene(INV_COBB_RAP, 1);
+ _sceneMode = 8110;
+ if (BF_GLOBALS._sceneObjects->contains(&_lyle)) {
+ _sceneMode = 8198;
+ BF_GLOBALS.setFlag(shownFax);
+ _stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8135 : 8106, this);
+ } else {
+ _stripManager.start(8117, this);
+ }
+ } else {
+ SceneItem::display2(810, 34);
+ BF_GLOBALS._player.enableControl();
+ }
+
+ _fieldA74 = 0;
+ _object5.hide();
+ _object5.setFrame(1);
+ break;
+ case 8196:
+ BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8198:
+ if (BF_GLOBALS._dayNumber == 3) {
+ BF_GLOBALS.setFlag(showMugAround);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene810::process(Event &event) {
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+
+ if (!event.handled)
+ SceneExt::process(event);
+}
+
+void Scene810::dispatch() {
+ SceneExt::dispatch();
+
+ if (BF_GLOBALS._sceneObjects->contains(&_lyle) && (BF_GLOBALS._player._position.x != 115) && !_lyle._mover) {
+ _lyle.updateAngle(BF_GLOBALS._player._position);
+ }
+
+ if (BF_GLOBALS._sceneObjects->contains(&_faxMachineInset) && (BF_GLOBALS._player._position.x != 67) &&
+ (BF_GLOBALS._player._position.y != 111)) {
+ _faxMachineInset.remove();
+ }
+
+ if (!_action) {
+ if (BF_GLOBALS.getFlag(showMugAround)) {
+ if (_lyle._position.y == 115) {
+ BF_GLOBALS._player.disableControl();
+
+ _sceneMode = 8110;
+ setAction(&_sequenceManager1, this, 8117, &_lyle, &_chair, NULL);
+ } else {
+ BF_GLOBALS.clearFlag(showMugAround);
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._walkRegions.proc2(4);
+ BF_GLOBALS._walkRegions.proc2(13);
+
+ _sceneMode = 8112;
+ setAction(&_sequenceManager1, this, 8112, &BF_GLOBALS._player, &_lyle, NULL);
+ }
+ }
+
+ if (BF_GLOBALS._player._position.x >= 318) {
+ BF_GLOBALS._player.disableControl();
+
+ if ((BF_GLOBALS._dayNumber == 3) && !BF_GLOBALS.getFlag(examinedFile810)) {
+ SceneItem::display2(810, 35);
+ _sceneMode = 8100;
+ setAction(&_sequenceManager1, this, 8100, &BF_GLOBALS._player, NULL);
+ } else {
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ BF_GLOBALS._walkRegions.proc2(4);
+ BF_GLOBALS._walkRegions.proc2(13);
+
+ ADD_MOVER_NULL(_lyle, 320, 155);
+ }
+
+ _sceneMode = 8101;
+ setAction(&_sequenceManager1, this, 8101, &BF_GLOBALS._player, NULL);
+ }
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 820 - Microfiche Reader
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene820::PowerButton::startAction(CursorType action, Event &event) {
+ Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(820, 5);
+ return true;
+ case CURSOR_USE:
+ scene->_sound1.play(69);
+ if (_flags & OBJFLAG_HIDING) {
+ scene->_pageNumber = 0;
+ show();
+ BF_GLOBALS._scenePalette.loadPalette(821);
+ BF_GLOBALS._scenePalette.refresh();
+
+ SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
+ SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END);
+ } else {
+ BF_GLOBALS._scenePalette.loadPalette(820);
+ BF_GLOBALS._scenePalette.refresh();
+
+ scene->_object4.remove();
+ scene->_object5.remove();
+
+ SceneItem::display(0, 0);
+ hide();
+
+ BF_GLOBALS._sceneManager.changeScene(810);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene820::BackButton::startAction(CursorType action, Event &event) {
+ Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(820, 7);
+ return true;
+ case CURSOR_USE:
+ // WORKAROUND: The original game had a bug where you could see the microfiche text by directly
+ // using the paging buttons, but then you had to use the power button twice to 'turn on' the
+ // reader and then off again. This check prevents the paging buttons being used until the
+ // reader is properly turned on.
+ if (scene->_powerButton._flags & OBJFLAG_HIDING)
+ return true;
+
+ scene->_sound1.play(72);
+ show();
+ scene->_sceneMode = 8200;
+ scene->setAction(&scene->_sequenceManager, scene, 8200, NULL);
+
+ if (scene->_pageNumber)
+ --scene->_pageNumber;
+ if (scene->_pageNumber == 3) {
+ scene->_object4.hide();
+ scene->_object5.hide();
+ }
+
+ SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
+ SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene820::ForwardButton::startAction(CursorType action, Event &event) {
+ Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(820, 6);
+ return true;
+ case CURSOR_USE:
+ // WORKAROUND: The original game had a bug where you could see the microfiche text by directly
+ // using the paging buttons, but then you had to use the power button twice to 'turn on' the
+ // reader and then off again. This check prevents the paging buttons being used until the
+ // reader is properly turned on.
+ if (scene->_powerButton._flags & OBJFLAG_HIDING)
+ return true;
+
+ scene->_sound1.play(72);
+ show();
+ scene->_sceneMode = 8200;
+ scene->setAction(&scene->_sequenceManager, scene, 8200, NULL);
+
+ if (scene->_pageNumber < 4)
+ ++scene->_pageNumber;
+
+ SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
+ SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END);
+
+ if (scene->_pageNumber == 4) {
+ scene->_object4.show();
+ scene->_object5.show();
+ }
+
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene820::Scene820(): SceneExt() {
+ _pageNumber = 0;
+}
+
+void Scene820::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_pageNumber);
+}
+
+void Scene820::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(820);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+
+ _powerButton.postInit();
+ _powerButton.setVisage(820);
+ _powerButton.setPosition(Common::Point(42, 163));
+ _powerButton.hide();
+ BF_GLOBALS._sceneItems.push_back(&_powerButton);
+
+ _backButton.postInit();
+ _backButton.setVisage(820);
+ _backButton.setStrip(2);
+ _backButton.setPosition(Common::Point(278, 155));
+ _backButton.hide();
+ BF_GLOBALS._sceneItems.push_back(&_backButton);
+
+ _forwardButton.postInit();
+ _forwardButton.setVisage(820);
+ _forwardButton.setStrip(3);
+ _forwardButton.setPosition(Common::Point(278, 164));
+ _forwardButton.hide();
+ BF_GLOBALS._sceneItems.push_back(&_forwardButton);
+
+ _object4.postInit();
+ _object4.setVisage(821);
+ _object4.setPosition(Common::Point(96, 130));
+ _object4.hide();
+
+ _object5.postInit();
+ _object5.setVisage(821);
+ _object5.setStrip(2);
+ _object5.setPosition(Common::Point(223, 130));
+ _object5.hide();
+
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 820, -1, -1, -1, 1, NULL);
+}
+
+void Scene820::signal() {
+ if (_sceneMode == 8200) {
+ _forwardButton.hide();
+ _backButton.hide();
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 830 - Outside Boat Rentals
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene830::Lyle::startAction(CursorType action, Event &event) {
+ Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (scene->_field18AA) {
+ scene->_stripManager.start(8304, &BF_GLOBALS._stripProxy);
+ } else {
+ scene->_stripManager.start(8303, &BF_GLOBALS._stripProxy);
+ ++scene->_field18AA;
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene830::Door::startAction(CursorType action, Event &event) {
+ Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (BF_GLOBALS._dayNumber == 2) {
+ scene->_sceneMode = 14;
+ Common::Point pt(186, 102);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, NULL);
+ return true;
+ }
+ break;
+ case CURSOR_USE:
+ if (BF_GLOBALS._dayNumber == 2) {
+ scene->_sceneMode = 14;
+ Common::Point pt(186, 102);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, NULL);
+ } else if (scene->_field18A4) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 832;
+
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ scene->setAction(&scene->_sequenceManager, scene, 8302, &BF_GLOBALS._player, &scene->_door, NULL);
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ scene->_sceneMode = 11;
+ scene->setAction(&scene->_sequenceManager, scene, 8308, &BF_GLOBALS._player, &scene->_door, &scene->_lyle, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager, scene, 832, &BF_GLOBALS._player, &scene->_door, NULL);
+ }
+ } else {
+ scene->_stripManager.start(8305, &BF_GLOBALS._stripProxy);
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 192, 145);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene830::RentalBoat::startAction(CursorType action, Event &event) {
+ Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == INV_RENTAL_KEYS) {
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ scene->_sceneMode = 8300;
+ scene->setAction(&scene->_sequenceManager, scene, 8300, &BF_GLOBALS._player, &scene->_lyle, NULL);
+ } else {
+ scene->_sceneMode = 834;
+ scene->setAction(&scene->_sequenceManager, scene, 834, &BF_GLOBALS._player, &scene->_rentalBoat, NULL);
+ }
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene830::Object5::startAction(CursorType action, Event &event) {
+ Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8307;
+ scene->setAction(&scene->_sequenceManager, scene, 8307, &BF_GLOBALS._player, &scene->_object5, NULL);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene830::SouthEastExit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x + 80, BF_GLOBALS._player._position.y + 100);
+ return true;
+}
+
+bool Scene830::NoteBoard::startAction(CursorType action, Event &event) {
+ Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_object6)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8309;
+ scene->setAction(&scene->_sequenceManager, scene, 8309, &BF_GLOBALS._player, NULL);
+ return true;
+ }
+ break;
+ case CURSOR_USE:
+ if (BF_GLOBALS._sceneObjects->contains(&scene->_object6)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8305;
+ scene->setAction(&scene->_sequenceManager, scene, 8305, &BF_GLOBALS._player, &scene->_object6, NULL);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene830::Scene830(): PalettedScene() {
+ _field18A4 = _field18A6 = _field18A8 = _field18AA = _field18AC = 0;
+}
+
+void Scene830::synchronize(Serializer &s) {
+ PalettedScene::synchronize(s);
+ s.syncAsByte(_field18A4);
+ s.syncAsByte(_field18A6);
+ s.syncAsByte(_field18A8);
+ s.syncAsByte(_field18AA);
+ s.syncAsByte(_field18AC);
+}
+
+void Scene830::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ loadScene(830);
+ _sound1.fadeSound(35);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._sceneManager._previousScene = 340;
+ BF_GLOBALS._dayNumber = 1;
+ BF_GLOBALS.setFlag(fWithLyle);
+ }
+
+ _field18A8 = (BF_GLOBALS._dayNumber <= 3) ? 0 : 1;
+ _field18AC = 0;
+ BF_GLOBALS.clearFlag(fCanDrawGun);
+
+ _seExit.setDetails(Rect(183, 161, 320, 167), 830, -1, -1, -1, 1, NULL);
+
+ PaletteRotation *rot = BF_GLOBALS._scenePalette.addRotation(184, 189, 1);
+ rot->setDelay(30);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.disableControl();
+
+ if (_field18A8) {
+ _rentalBoat.postInit();
+ _rentalBoat.setVisage(830);
+ _rentalBoat.setStrip(1);
+ _rentalBoat.setPosition(Common::Point(271, 146));
+ _rentalBoat.fixPriority(90);
+ _rentalBoat.setDetails(830, 0, 1, 2, 1, NULL);
+ }
+
+ _door.postInit();
+ _door.setVisage(830);
+ _door.setDetails(830, 3, 4, -1, 1, NULL);
+ _door.setStrip((BF_GLOBALS._dayNumber == 2) ? 4 : 3);
+ _door.setPosition(Common::Point(182, 97));
+
+ _field18A4 = 1;
+ _noteBoard.setDetails(1, 830, 30, 31, 32, 1);
+
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ if ((BF_GLOBALS._bookmark >= bEndOfWorkDayOne) && (BF_INVENTORY.getObjectScene(INV_CARTER_NOTE) != 1) &&
+ (BF_INVENTORY.getObjectScene(INV_CARTER_NOTE) != 3)) {
+ _object6.postInit();
+ _object6.setVisage(830);
+ _object6.setStrip(4);
+ _object6.setFrame(2);
+ _object6.setPosition(Common::Point(302, 124));
+ }
+ break;
+ case 4:
+ if (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 830) {
+ _object5.postInit();
+ _object5.setVisage(830);
+ _object5.setStrip(2);
+ _object5.setFrame(2);
+ _object5.setPosition(Common::Point(126, 133));
+ _object5.setDetails(830, 7, 8, -1, 1, NULL);
+ }
+ break;
+ case 5:
+ if ((BF_GLOBALS._sceneManager._previousScene == 840) && (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) &&
+ !BF_GLOBALS.getFlag(fWithLyle)) {
+ _field18A4 = 0;
+
+ _lyle.postInit();
+// _lyle._flags = OBJFLAG_CHECK_REGION;
+ _lyle.setVisage(835);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setStrip(4);
+ _lyle.setPosition(Common::Point(180, 154));
+ _lyle._moveDiff = Common::Point(2, 0);
+ _lyle.setDetails(830, 28, -1, 29, 1, NULL);
+
+ _field18AC = 1;
+ }
+ break;
+ }
+
+ _item2.setDetails(7, 830, 9, 10, 11, 1);
+ _item4.setDetails(2, 830, 12, 13, 14, 1);
+ _item5.setDetails(3, 830, 15, 16, 17, 1);
+ _item6.setDetails(4, 830, 18, 19, 20, 1);
+ _item7.setDetails(5, 830, 21, 22, 23, 1);
+ _item8.setDetails(6, 830, 24, 25, 26, 1);
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 840:
+ _sceneMode = 833;
+ if (BF_GLOBALS.getFlag(onDuty)) {
+ setAction(&_sequenceManager, this, 8304, &BF_GLOBALS._player, &_door, NULL);
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle._moveDiff = Common::Point(2, 0);
+ _sceneMode = 837;
+ setAction(&_sequenceManager, this, 837, &_lyle, &_door, &BF_GLOBALS._player, NULL);
+ } else {
+ setAction(&_sequenceManager, this, 833, &BF_GLOBALS._player, &_door, NULL);
+ }
+ break;
+ case 850:
+ BF_GLOBALS._player.setVisage(831);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player._moveDiff = Common::Point(2, 0);
+ BF_GLOBALS._player.setPosition(Common::Point(220, 122));
+ BF_GLOBALS._player.enableControl();
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle.setVisage(835);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setStrip(3);
+ _lyle._moveDiff = Common::Point(2, 0);
+ _lyle.setPosition(Common::Point(224, 126));
+ }
+
+ if ((BF_GLOBALS._bookmark == bEndDayThree) && (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 1)) {
+ BF_INVENTORY.setObjectScene(INV_FISHING_NET, 0);
+ BF_INVENTORY.setObjectScene(INV_HOOK, 0);
+ }
+ break;
+ case 340:
+ case 830:
+ default:
+ _sceneMode = 830;
+ setAction(&_sequenceManager, this, BF_GLOBALS.getFlag(onDuty) ? 8303 : 830, &BF_GLOBALS._player, NULL);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle.setVisage(835);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setPosition(Common::Point(SCREEN_WIDTH, SCREEN_HEIGHT));
+ _lyle._moveDiff = Common::Point(2, 0);
+ ADD_MOVER(_lyle, 280, 160);
+ }
+ break;
+ }
+
+ _field18A6 = 1;
+}
+
+void Scene830::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ PalettedScene::remove();
+}
+
+void Scene830::signal() {
+ static uint32 black = 0;
+
+ switch (_sceneMode) {
+ case 11:
+ _sceneMode = 832;
+ BF_GLOBALS._scenePalette.clearListeners();
+ addFader((const byte *)&black, 5, this);
+ BF_GLOBALS._v51C44 = 0;
+ break;
+ case 12:
+ _sceneMode = 831;
+ BF_GLOBALS._scenePalette.clearListeners();
+ addFader((const byte *)&black, 5, this);
+ BF_GLOBALS._v51C44 = 0;
+ break;
+ case 13:
+ BF_GLOBALS._sceneManager.changeScene(850);
+ break;
+ case 14:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8312;
+
+ _object1.postInit();
+ setAction(&_sequenceManager, this, 8312, &_object1, NULL);
+ break;
+ case 830:
+ _field18A6 = 1;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 831:
+ case 8306:
+ BF_GLOBALS._sceneManager.changeScene((BF_GLOBALS._bookmark < bStartOfGame) ||
+ (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) ? 342 : 340);
+ break;
+ case 832:
+ BF_GLOBALS._sceneManager.changeScene(840);
+ break;
+ case 833:
+ if (_field18AC) {
+ BF_GLOBALS.setFlag(fWithLyle);
+ _sceneMode = 8311;
+ setAction(&_sequenceManager, this, 8311, &BF_GLOBALS._player, &_lyle, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._strip = 3;
+ BF_GLOBALS._player._frame = 1;
+ }
+ break;
+ case 834:
+ BF_GLOBALS._sceneManager.changeScene(850);
+ break;
+ case 837:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8300:
+ _sceneMode = 13;
+ BF_GLOBALS._scenePalette.clearListeners();
+ addFader((const byte *)&black, 5, this);
+ break;
+ case 8305:
+ _object6.remove();
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._strip = 7;
+
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(INV_CARTER_NOTE, 1);
+ break;
+ case 8307:
+ BF_GLOBALS._player.enableControl();
+ _object5.remove();
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1);
+ break;
+ case 8309:
+ case 8311:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8312:
+ _object1.remove();
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene830::process(Event &event) {
+ if (BF_GLOBALS._player._enabled && (event.eventType == EVENT_BUTTON_DOWN) &&
+ (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && !_field18A4) {
+ _stripManager.start(8306, &BF_GLOBALS._stripProxy);
+ event.handled = true;
+ }
+
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_seExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SE);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene830::dispatch() {
+ SceneExt::dispatch();
+
+ if (!_action && _field18A6 && (BF_GLOBALS._player._position.y > 160)) {
+ if (!_field18A4) {
+ _stripManager.start(8305, &BF_GLOBALS._player);
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 192, 145);
+ } else if ((BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) && (BF_GLOBALS._bookmark == bEndDayThree)) {
+ BF_GLOBALS._player.disableControl();
+ SceneItem::display2(830, 27);
+ _field18A6 = 0;
+ _sceneMode = 830;
+ ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y - 10);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _field18A6 = 0;
+ _sceneMode = 831;
+ ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x + 40, BF_GLOBALS._player._position.y + 40);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ ADD_MOVER_NULL(_lyle, SCREEN_WIDTH, SCREEN_HEIGHT);
+ if (_lyle._position.y < 160)
+ _sceneMode = 12;
+ }
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 840 - Boat Rentals
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene840::BoatKeysInset::postInit(SceneObjectList *OwnerList) {
+ FocusObject::postInit(OwnerList);
+
+ if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) != 1) {
+ _rentalKeys.postInit();
+ _rentalKeys.setVisage(840);
+ _rentalKeys.setStrip(2);
+ _rentalKeys.setFrame(3);
+ _rentalKeys.setPosition(Common::Point(120, 132));
+ _rentalKeys.fixPriority(255);
+ _rentalKeys.setDetails(840, 52, 8, -1, 2, NULL);
+ }
+
+ if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) != 1) {
+ _waveKeys.postInit();
+ _waveKeys.setVisage(840);
+ _waveKeys.setStrip(2);
+ _waveKeys.setFrame(2);
+ _waveKeys.setPosition(Common::Point(201, 91));
+ _waveKeys.fixPriority(255);
+ _waveKeys.setDetails(840, 53, 8, -1, 2, NULL);
+ }
+
+ _v1B4 = _v1B6 = 0;
+}
+
+void Scene840::BoatKeysInset::remove() {
+ Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene;
+
+ _rentalKeys.remove();
+ _waveKeys.remove();
+ FocusObject::remove();
+ BF_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 8412;
+ scene->setAction(&scene->_sequenceManager1, scene, 8412, &BF_GLOBALS._player, NULL);
+}
+
+void Scene840::BoatKeysInset::process(Event &event) {
+ if (BF_GLOBALS._player._enabled) {
+ if (_bounds.contains(event.mousePos)) {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (cursorId == CURSOR_WALK) && (event.btnState == 3)) {
+ BF_GLOBALS._events.setCursor(CURSOR_USE);
+ event.handled = true;
+ }
+ } else if (event.mousePos.y < 168) {
+ BF_GLOBALS._events.setCursor(_img);
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ event.handled = true;
+ remove();
+ }
+ }
+ }
+
+ FocusObject::process(event);
+}
+
+bool Scene840::BoatKeysInset::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if ((event.mousePos.y > 43) && (event.mousePos.y < 92)) {
+ if (event.mousePos.x < 135) {
+ SceneItem::display2(840, 54);
+ return true;
+ } else if (event.mousePos.x < 183) {
+ SceneItem::display2(840, 57);
+ return true;
+ }
+ } else if ((event.mousePos.y > 91) && (event.mousePos.y < 132)) {
+ if (event.mousePos.x > 182) {
+ SceneItem::display2(840, 58);
+ return true;
+ } else if (event.mousePos.x > 134) {
+ SceneItem::display2(840, 57);
+ return true;
+ }
+ }
+ break;
+ case INV_WAVE_KEYS:
+ if ((BF_GLOBALS._dayNumber != 4) || (BF_GLOBALS._bookmark != bEndDayThree))
+ SceneItem::display2(840, 47);
+ else {
+ T2_GLOBALS._uiElements.addScore(50);
+
+ if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) {
+ // Replace rental keys
+ _rentalKeys.postInit();
+ _rentalKeys.setVisage(840);
+ _rentalKeys.setStrip(2);
+ _rentalKeys.setFrame(3);
+ _rentalKeys.setPosition(Common::Point(120, 132));
+ _rentalKeys.fixPriority(255);
+ _rentalKeys.setDetails(840, 52, 8, -1, 2, NULL);
+ }
+
+ if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1) {
+ // Replace wave keys
+ _waveKeys.postInit();
+ _waveKeys.setVisage(840);
+ _waveKeys.setStrip(2);
+ _waveKeys.setFrame(2);
+ _waveKeys.setPosition(Common::Point(201, 91));
+ _waveKeys.fixPriority(255);
+ _waveKeys.setDetails(840, 53, 8, -1, 2, NULL);
+ }
+
+ BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 0);
+ BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 0);
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return FocusObject::startAction(action, event);
+}
+
+bool Scene840::BoatKeysInset::RentalKeys::startAction(CursorType action, Event &event) {
+ Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark >= bEndDayThree)) {
+ SceneItem::display2(840, 9);
+ } else {
+ SceneItem::display2(840, 55);
+ BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 1);
+ T2_GLOBALS._uiElements.addScore(30);
+
+ scene->_boatKeysInset._v1B4 = 1;
+ remove();
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene840::BoatKeysInset::WaveKeys::startAction(CursorType action, Event &event) {
+ Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_field1AC2) {
+ SceneItem::display2(840, 56);
+ BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 1);
+ T2_GLOBALS._uiElements.addScore(50);
+ scene->_boatKeysInset._v1B6 = 1;
+ remove();
+ } else {
+ SceneItem::display2(840, 9);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene840::BoatKeys::startAction(CursorType action, Event &event) {
+ Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ scene->_object1.postInit();
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8410;
+ scene->setAction(&scene->_sequenceManager1, scene, 8410, &scene->_object1, &BF_GLOBALS._player, NULL);
+ return true;
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8411;
+ scene->setAction(&scene->_sequenceManager1, scene, 8411, &BF_GLOBALS._player, NULL);
+ return true;
+ case INV_WAVE_KEYS:
+ case INV_RENTAL_KEYS:
+ if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark == bEndDayThree)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8417;
+ scene->setAction(&scene->_sequenceManager1, scene, 8417, &BF_GLOBALS._player, NULL);
+ } else {
+ SceneItem::display2(840, 47);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene840::Carter::startAction(CursorType action, Event &event) {
+ Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+
+ if ((BF_GLOBALS._player._position.x != 219) || (BF_GLOBALS._player._position.y != 129)) {
+ Common::Point pt(219, 129);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+ } else {
+ scene->signal();
+ }
+ return true;
+ case INV_RENTAL_COUPON: {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 6;
+
+ Common::Point pt(219, 129);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+ return true;
+ }
+ case INV_NICKEL:
+ ++BF_GLOBALS._v4CEB6;
+ BF_GLOBALS._player.disableControl();
+
+ if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForCombo)) {
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_GLOBALS.setFlag(fGotPointsForCombo);
+ }
+ }
+
+ scene->_sceneMode = 8407;
+ scene->setAction(&scene->_sequenceManager1, scene, 8407, &BF_GLOBALS._player, NULL);
+ return true;
+ case INV_CARTER_NOTE:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8402;
+
+ if (!BF_GLOBALS._v4CEB6) {
+ scene->setAction(&scene->_sequenceManager1, scene, 8402, &BF_GLOBALS._player, &scene->_carter, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 8414, &BF_GLOBALS._player, &scene->_carter, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene840::Coins::startAction(CursorType action, Event &event) {
+ Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8404;
+ scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(onDuty) ? 8415 : 8404,
+ &BF_GLOBALS._player, NULL);
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene840::Exit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 315, 150);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene840::Scene840(): PalettedScene() {
+ _field1ABC = 1;
+ _field1ABE = 0;
+ _field1AC0 = 0;
+ _field1AC2 = 0;
+ _field1AC4 = 0;
+ _field1AC6 = (BF_GLOBALS._dayNumber > 3) ? 1 : 0;
+}
+
+void Scene840::synchronize(Serializer &s) {
+ PalettedScene::synchronize(s);
+
+ s.syncAsSint16LE(_field1ABA);
+ s.syncAsSint16LE(_field1ABC);
+ s.syncAsSint16LE(_field1ABE);
+ s.syncAsSint16LE(_field1AC0);
+ s.syncAsSint16LE(_field1AC2);
+ s.syncAsSint16LE(_field1AC4);
+ s.syncAsSint16LE(_field1AC6);
+}
+
+void Scene840::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit(OwnerList);
+ BF_GLOBALS._sound1.changeSound(41);
+ loadScene(840);
+ _field1ABA = 0;
+
+ if (BF_GLOBALS._dayNumber == 0) {
+ // Debugging mode setup
+ BF_GLOBALS._dayNumber = 4;
+ BF_INVENTORY.setObjectScene(INV_NICKEL, 1);
+ BF_INVENTORY.setObjectScene(INV_RENTAL_COUPON, 1);
+ }
+
+ setZoomPercents(0, 90, 110, 100);
+ _exit.setDetails(Rect(310, 133, 320, 167), 840, -1, -1, -1, 1, NULL);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_jakeUniformSpeaker);
+ _stripManager.addSpeaker(&_carterSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player._moveDiff.x = BF_GLOBALS.getFlag(onDuty) ? 8 : 7;
+
+ _doors.postInit();
+ _doors.setVisage(840);
+ _doors.setStrip(3);
+ _doors.setPosition(Common::Point(157, 81));
+ _doors.setDetails(840, 0, 1, 2, 1, NULL);
+
+ _carter.postInit();
+ _carter.setVisage(843);
+ _carter.setStrip(6);
+ _carter.fixPriority(110);
+ _carter.setPosition(Common::Point(262, 128));
+ _carter.changeZoom(-1);
+
+ _item14.setDetails(1, 840, 29, 30, 31, 1);
+ _item2.setDetails(Rect(6, 5, 85, 31), 840, 16, 14, 12, 1, NULL);
+ _item3.setDetails(Rect(91, 7, 102, 26), 840, 17, 14, 12, 1, NULL);
+ _item4.setDetails(Rect(6, 49, 80, 67), 840, 18, 15, 13, 1, NULL);
+ _item5.setDetails(Rect(80, 29, 100, 65), 840, 19, 15, 13, 1, NULL);
+ _item6.setDetails(Rect(104, 32, 127, 78), 840, 20, 15, 13, 1, NULL);
+ _item7.setDetails(Rect(1, 106, 35, 166), 840, 21, 15, 13, 1, NULL);
+ _item9.setDetails(Rect(205, 17, 251, 60), 840, 23, 15, 13, 1, NULL);
+ _item10.setDetails(Rect(199, 56, 236, 80), 840, 24, 14, 12, 1, NULL);
+ _item11.setDetails(Rect(256, 94, 319, 118), 840, 25, 15, 13, 1, NULL);
+ _item18.setDetails(6, 840, 38, 39, 40, 1);
+ _carter.setDetails(840, 3, 4, 5, 1, NULL);
+ _item8.setDetails(Rect(259, 4, 319, 87), 840, 22, 15, 13, 1, NULL);
+ _item15.setDetails(2, 840, 32, 33, 34, 1);
+ _coins.setDetails(3, 840, -1, 6, 7, 1);
+ _item16.setDetails(4, 840, 44, 45, 46, 1);
+ _item17.setDetails(5, 840, 26, 27, 28, 1);
+ _item12.setDetails(7, 840, 35, 36, 37, 1);
+ _item13.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 840, 41, 42, 43, 1, NULL);
+
+ if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) {
+ _boatKeys.postInit();
+ _boatKeys.setVisage(840);
+ _boatKeys.setStrip(4);
+ _boatKeys.setFrame(1);
+ _boatKeys.setPosition(Common::Point(250, 83));
+ _boatKeys.fixPriority(120);
+ _boatKeys.setDetails(840, -1, 8, 9, 2, NULL);
+ _field1AC0 = 1;
+ }
+
+ _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 8401 : 8400;
+ setAction(&_sequenceManager1, this, _sceneMode, &BF_GLOBALS._player, NULL);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle.setAction(&_sequenceManager2, NULL, 8405, &_lyle, NULL);
+ }
+}
+
+void Scene840::signal() {
+ switch (_sceneMode) {
+ case 1:
+ // Talking to Carter
+ BF_GLOBALS._player._strip = 7;
+ BF_GLOBALS._player._frame = 1;
+ _sceneMode = 3;
+
+ switch (BF_GLOBALS._dayNumber) {
+ case 1:
+ if (_field1ABA == 1) {
+ _stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8430 : 8406, this);
+ } else if (!BF_GLOBALS.getFlag(onDuty)) {
+ _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8400 : 8406, this);
+ } else if (BF_GLOBALS._bookmark < bStartOfGame) {
+ _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8429 : 8430, this);
+ } else if (BF_GLOBALS._bookmark < bCalledToDomesticViolence) {
+ _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8402 : 8401, this);
+ } else {
+ _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8404 : 8403, this);
+ }
+ break;
+ case 2:
+ _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8405 : 8430, this);
+ break;
+ case 3:
+ if (!BF_GLOBALS._v4CEB6) {
+ _stripManager.start(BF_GLOBALS.getFlag(fWithLyle) ? 8409 : 8411, this);
+ } else if (_field1ABA == 1) {
+ _stripManager.start(8406, this);
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8415 : 8414, this);
+ } else {
+ _stripManager.start(8413, this);
+ }
+
+ BF_GLOBALS.setFlag(fTalkedCarterDay3);
+ break;
+ case 4:
+ if (!BF_GLOBALS._v4CEB6) {
+ if (BF_GLOBALS.getFlag(fTalkedCarterDay3)) {
+ if (BF_GLOBALS.getFlag(fWithLyle))
+ _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8415 : 8414, this);
+ else
+ _stripManager.start(8413, this);
+ } else if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8431 : 8409, this);
+ } else {
+ _stripManager.start(8411, this);
+ }
+ } else if (_field1ABA == 1) {
+ _stripManager.start(8406, this);
+ } else if (!BF_GLOBALS.getFlag(fWithLyle)) {
+ _stripManager.start(8413, this);
+ } else {
+ _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8415 : 8414, this);
+ }
+ break;
+ case 5:
+ _stripManager.start((_field1ABA == 1) ? 8406 : 8413, this);
+ break;
+ default:
+ break;
+ }
+
+ _field1ABA = 1;
+ break;
+ case 2:
+ BF_GLOBALS._sceneManager.changeScene(830);
+ BF_GLOBALS._sound1.changeSound(10);
+ break;
+ case 3:
+ case 8404:
+ case 8416:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 4:
+ _sceneMode = 8403;
+ _boatKeys.postInit();
+ _boatKeys.setDetails(840, -1, 8, 9, 2, NULL);
+ setAction(&_sequenceManager1, this, 8403, &_carter, &_boatKeys, NULL);
+ break;
+ case 5:
+ _sceneMode = 8408;
+ setAction(&_sequenceManager1, this, 8408, &BF_GLOBALS._player, &_carter, &_doors, NULL);
+ _field1AC2 = 1;
+ break;
+ case 6:
+ BF_GLOBALS._player._strip = 7;
+ BF_GLOBALS._player._frame = 1;
+
+ if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark >= bEndDayThree)) {
+ _stripManager.start(8440, this);
+ _sceneMode = 3;
+ } else if (BF_GLOBALS._sceneObjects->contains(&_boatKeys)) {
+ _stripManager.start(8442, this);
+ _sceneMode = 3;
+ } else if (_field1AC6) {
+ _sceneMode = 4;
+ _stripManager.start(BF_GLOBALS.getFlag(fWithLyle) ? 8424 : 8410, this);
+ } else {
+ _sceneMode = 3;
+ _stripManager.start(8436, this);
+ }
+ break;
+ case 8400:
+ case 8401:
+ BF_GLOBALS._player._strip = 7;
+ BF_GLOBALS._player._frame = 1;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 8402:
+ BF_GLOBALS._player.enableControl();
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(INV_CARTER_NOTE, 3);
+ BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 1);
+ BF_INVENTORY.setObjectScene(INV_RENTAL_COUPON, 1);
+ break;
+ case 8403:
+ T2_GLOBALS._uiElements.addScore(30);
+ _sceneMode = 3;
+ _field1AC0 = 1;
+ _stripManager.start(8441, this);
+ break;
+ case 8407:
+ if (((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark >= bEndDayThree)) ||
+ (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1)) {
+ _sceneMode = 8416;
+ setAction(&_sequenceManager1, this, 8416, &BF_GLOBALS._player, NULL);
+ } else {
+ _stripManager.start(_field1ABE + 8419, this);
+ _sceneMode = 5;
+
+ if (++_field1ABE == 4)
+ _field1ABE = 1;
+ }
+ break;
+ case 8408:
+ if (_field1AC0) {
+ BF_GLOBALS._player.enableControl();
+ } else {
+ _sceneMode = 8409;
+ setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL);
+ }
+ break;
+ case 8409:
+ _field1AC2 = 0;
+ _sceneMode = 3;
+ _stripManager.start(8423, this);
+ break;
+ case 8410:
+ BF_GLOBALS._player.enableControl();
+ _object1.remove();
+ break;
+ case 8411:
+ BF_GLOBALS._player.enableControl();
+ _boatKeysInset.postInit();
+ _boatKeysInset.setVisage(840);
+ _boatKeysInset.setStrip(2);
+ _boatKeysInset.setPosition(Common::Point(160, 140));
+ _boatKeysInset.fixPriority(254);
+ _boatKeysInset.setDetails(840, 50, 8, 51);
+ break;
+ case 8412:
+ if (_boatKeysInset._v1B6) {
+ _sceneMode = 8409;
+ setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL);
+ } else if (!_boatKeysInset._v1B4) {
+ BF_GLOBALS._player.enableControl();
+ } else {
+ _sceneMode = 3;
+ _field1AC0 = 1;
+
+ if (BF_GLOBALS._dayNumber == 5) {
+ _stripManager.start(8425, this);
+ } else {
+ _stripManager.start(BF_GLOBALS.getFlag(INV_NICKEL) ? 8417 : 8416, this);
+ }
+ }
+ break;
+ case 8413:
+ T2_GLOBALS._uiElements.addScore(50);
+ _sceneMode = 8409;
+ setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL);
+ break;
+ case 8417:
+ _field1ABA = 1;
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 0);
+ BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 0);
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene840::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene840::dispatch() {
+ SceneExt::dispatch();
+
+ if (_field1ABC && (BF_GLOBALS._player._position.x > 310) && !_action) {
+ _field1ABC = 0;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ ADD_PLAYER_MOVER(350, 150);
+
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.setAction(&_sequenceManager2, NULL, 8406, &_lyle, NULL);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 850 - Boat Leaving/Entering Marina
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene850::Timer1::signal() {
+ PaletteRotation *rot = BF_GLOBALS._scenePalette.addRotation(240, 254, 1);
+ rot->setDelay(25);
+
+ remove();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene850::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(850);
+ BF_GLOBALS._sound1.fadeSound(35);
+
+ BF_GLOBALS._player.disableControl();
+ _timer.set(2, NULL);
+
+ _object1.postInit();
+ if (BF_GLOBALS._sceneManager._previousScene == 830) {
+ _sceneMode = 8500;
+ setAction(&_sequenceManager, this, 8500, &_object1, NULL);
+ } else {
+ BF_GLOBALS._sound1.changeSound(10);
+ _sceneMode = 8501;
+ setAction(&_sequenceManager, this, 8501, &_object1, NULL);
+ }
+}
+
+void Scene850::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+void Scene850::signal() {
+ switch (_sceneMode) {
+ case 8500:
+ BF_GLOBALS._sceneManager.changeScene(860);
+ break;
+ case 8501:
+ BF_GLOBALS._sceneManager.changeScene(830);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 860 - Boat Entering Cove
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene860::Action1::signal() {
+ Scene860 *scene = (Scene860 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_sound1.play(88);
+ scene->_sound1.holdAt(1);
+
+ if (scene->_field888 == scene->_field886) {
+ ++_actionIndex;
+ signal();
+ } else {
+ BF_GLOBALS._player.addMover(NULL);
+ BF_GLOBALS._player.setStrip((scene->_field886 == 1) ? 4 : 5);
+ scene->_field888 = scene->_field886;
+
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player._numFrames = 9;
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ }
+ break;
+ case 1:
+ if (scene->_field886 == 1) {
+ BF_GLOBALS._player._position.x += 5;
+ BF_GLOBALS._player.setStrip(3);
+ } else {
+ BF_GLOBALS._player._position.x -= 5;
+ BF_GLOBALS._player.setStrip(2);
+ }
+ signal();
+ // Deliberate fall-through
+ case 2:
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER_NULL(BF_GLOBALS._player, scene->_destPos.x, scene->_destPos.y);
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene860::Scene860(): SceneExt() {
+ _field87E = _field880 = 0;
+ _destPos.x = _destPos.y = 0;
+ _field886 = _field888 = 0;
+
+ _swRect = Rect(37, 102, 175, 128);
+ _neRect = Rect(259, 50, 320, 84);
+}
+
+void Scene860::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field87E);
+ s.syncAsSint16LE(_field880);
+ s.syncAsSint16LE(_destPos.x);
+ s.syncAsSint16LE(_destPos.y);
+ s.syncAsSint16LE(_field886);
+ s.syncAsSint16LE(_field888);
+
+ _swRect.synchronize(s);
+ _neRect.synchronize(s);
+ _yachtRect.synchronize(s);
+}
+
+void Scene860::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(880);
+
+ BF_GLOBALS._sound1.changeSound(90);
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._dayNumber = 1;
+ BF_GLOBALS.setFlag(fBlowUpGoon);
+ }
+
+ if (BF_GLOBALS.getFlag(fBlowUpGoon)) {
+ _deadBody.postInit();
+ _deadBody.setVisage(875);
+ _deadBody.setStrip(7);
+ _deadBody.setFrame2(_deadBody.getFrameCount());
+ _deadBody.fixPriority(130);
+ _deadBody.setPosition(Common::Point(255, 148));
+ }
+
+ if (BF_GLOBALS._dayNumber == 5) {
+ _object2.postInit();
+ _object2.setVisage(880);
+ _object2.setPosition(Common::Point(196, 81));
+ BF_GLOBALS._sceneItems.push_back(&_object2);
+ _object2.setDetails(860, 0, 1, -1, 1, NULL);
+ _object2.fixPriority(20);
+
+ _neRect = Rect(0, 0, 0, 0);
+ _yachtRect = Rect(180, 66, 219, 79);
+ }
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(880);
+ BF_GLOBALS._player._moveDiff = Common::Point(1, 1);
+ BF_GLOBALS._player._moveRate = 20;
+
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player._canWalk = false;
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 355:
+ if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 860) {
+ _sceneMode = 8610;
+ setAction(&_sequenceManager, this, 8610, &BF_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 8609;
+ setAction(&_sequenceManager, this, 8609, &BF_GLOBALS._player, NULL);
+ _field87E = 0;
+ _field880 = 1;
+ _field888 = 1;
+ }
+ break;
+ case 870:
+ _sound1.play(89);
+ _sound1.holdAt(1);
+ _sceneMode = 8608;
+ setAction(&_sequenceManager, this, 8608, &BF_GLOBALS._player, NULL);
+ _field880 = 0;
+ _field87E = 2;
+ _field888 = 1;
+ break;
+ default:
+ _sound1.play(89);
+ _sound1.holdAt(1);
+ _sceneMode = 8607;
+ setAction(&_sequenceManager, this, 8607, &BF_GLOBALS._player, NULL);
+ _field87E = 0;
+ _field880 = 2;
+ _field888 = 1;
+ break;
+ }
+}
+
+void Scene860::signal() {
+ switch (_sceneMode) {
+ case 8601:
+ case 8606:
+ BF_GLOBALS._sceneManager.changeScene(870);
+ break;
+ case 8602:
+ case 8604:
+ BF_GLOBALS._sceneManager.changeScene(355);
+ break;
+ case 8603:
+ case 8605:
+ BF_GLOBALS._sceneManager.changeScene(850);
+ break;
+ case 8607:
+ case 8608:
+ case 8609:
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._canWalk = false;
+ break;
+ case 8610:
+ BF_GLOBALS._deathReason = 22;
+ BF_GLOBALS._sceneManager.changeScene(866);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene860::process(Event &event) {
+ if (_swRect.contains(event.mousePos)) {
+ GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(cursor);
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) {
+ event.handled = true;
+ _field886 = 2;
+ _destPos = Common::Point(119, 126);
+ _field87E = 0;
+ setAction(&_action1);
+ }
+ } else if (_neRect.contains(event.mousePos)) {
+ GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_NE);
+ BF_GLOBALS._events.setCursor(cursor);
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) {
+ event.handled = true;
+ _field886 = 1;
+ _destPos = Common::Point(266, 56);
+ _field87E = 2;
+ setAction(&_action1);
+ }
+ } else if (_yachtRect.contains(event.mousePos)) {
+ GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_NW);
+ BF_GLOBALS._events.setCursor(cursor);
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) {
+ event.handled = true;
+ _field886 = (BF_GLOBALS._player._position.y <= 78) ? 2 : 1;
+ _destPos = Common::Point(212, 78);
+ _field87E = 1;
+ setAction(&_action1);
+ }
+ } else {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+}
+
+void Scene860::dispatch() {
+ if (_action) {
+ _action->dispatch();
+ } else if (_swRect.contains(BF_GLOBALS._player._position) && (_field87E == 0)) {
+ _sound1.play(88);
+ BF_GLOBALS._sceneManager.changeScene(870);
+ } else if (_neRect.contains(BF_GLOBALS._player._position) && (_field87E == 2)) {
+ _sound1.release();
+ BF_GLOBALS._sceneManager.changeScene(850);
+ } else if (_yachtRect.contains(BF_GLOBALS._player._position) && (_field87E == 1)) {
+ _sound1.play(88);
+ BF_GLOBALS._sceneManager.changeScene(355);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 870 - Cove Beach
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene870::Lyle::startAction(CursorType action, Event &event) {
+ Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ if (BF_GLOBALS.getFlag(fTookTrailerAmmo)) {
+ scene->startStrip((BF_GLOBALS._bookmark >= bFinishedWGreen) ? 8704 : 8701);
+ } else {
+ scene->startStrip(8700);
+ }
+ return true;
+ } else {
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+bool Scene870::Green::startAction(CursorType action, Event &event) {
+ Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ if (!BF_GLOBALS.getFlag(fLyleOnIsland) && !scene->_field1664 && (BF_GLOBALS._bookmark == bFinishedWGreen)) {
+ scene->startStrip(8703);
+ ++scene->_field1664;
+ } else {
+ scene->startStrip(8705);
+ }
+ return true;
+ } else {
+ return NamedObjectExt::startAction(action, event);
+ }
+}
+
+void Scene870::CrateInset::postInit(SceneObjectList *OwnerList) {
+ Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene;
+
+ FocusObject::postInit();
+ setVisage(870);
+ setStrip(5);
+ setFrame(scene->_field1662);
+ setPosition(Common::Point(160, 130));
+ fixPriority(250);
+
+ if (scene->_field1662 == 3) {
+ initContents();
+ }
+}
+
+void Scene870::CrateInset::initContents() {
+ Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene;
+
+ if (BF_INVENTORY.getObjectScene(INV_JAR) == 870) {
+ // Jar still in crate, so display it
+ _jar.postInit();
+ _jar.setVisage(870);
+ _jar.setStrip(4);
+ _jar.setFrame(5);
+ _jar.setPosition(Common::Point(scene->_crateInset._position.x + 5,
+ scene->_crateInset._position.y - 26));
+ _jar.fixPriority(251);
+ _jar.setDetails(870, 39, 40, 41, 1, NULL);
+ BF_GLOBALS._sceneItems.remove(&_jar);
+ BF_GLOBALS._sceneItems.push_front(&_jar);
+ }
+
+ if (BF_INVENTORY.getObjectScene(INV_RAGS) == 870) {
+ // Rags still in crate, so display it
+ _rags.postInit();
+ _rags.setVisage(870);
+ _rags.setStrip(4);
+ _rags.setFrame(6);
+ _rags.setPosition(Common::Point(scene->_crateInset._position.x - 18,
+ scene->_crateInset._position.y - 18));
+ _rags.fixPriority(251);
+ _rags.setDetails(870, 42, 43, 44, 1, NULL);
+ BF_GLOBALS._sceneItems.remove(&_rags);
+ BF_GLOBALS._sceneItems.push_front(&_rags);
+ }
+}
+
+void Scene870::CrateInset::remove() {
+ _jar.remove();
+ _rags.remove();
+ FocusObject::remove();
+}
+
+bool Scene870::CrateInset::startAction(CursorType action, Event &event) {
+ Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_WALK:
+ return true;
+ case CURSOR_LOOK:
+ if (scene->_field1662 != 2)
+ break;
+
+ scene->_field1662 = 3;
+ setFrame(3);
+ initContents();
+ return true;
+ case CURSOR_USE:
+ if (scene->_field1662 == 2) {
+ setFrame(1);
+ scene->_field1662 = 1;
+ } else {
+ setFrame(2);
+ scene->_field1662 = 2;
+ _jar.remove();
+ _rags.remove();
+ }
+ return true;
+ default:
+ break;
+ }
+
+ return FocusObject::startAction(action, event);
+}
+
+bool Scene870::CrateInset::Jar::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE) {
+ BF_INVENTORY.setObjectScene(INV_JAR, 1);
+ remove();
+ T2_GLOBALS._uiElements.addScore(30);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene870::CrateInset::Rags::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE) {
+ BF_INVENTORY.setObjectScene(INV_RAGS, 1);
+ remove();
+ T2_GLOBALS._uiElements.addScore(30);
+ return true;
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene870::Boat::startAction(CursorType action, Event &event) {
+ if (action == INV_RENTAL_KEYS) {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._sceneManager.changeScene(860);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene870::Crate::startAction(CursorType action, Event &event) {
+ Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ Common::Point destPos(163, 164);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &destPos, scene);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene870::Exit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER(event.mousePos.x, event.mousePos.y);
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene870::Action1::signal() {
+ Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ scene->_yacht.setStrip(6);
+ scene->_yacht.setFrame(1);
+ scene->_yacht._numFrames = 6;
+ scene->_yacht.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene870::Scene870(): SceneExt() {
+ _field1662 = 1;
+ _field1664 = 0;
+}
+
+void Scene870::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field1662);
+ s.syncAsSint16LE(_field1664);
+}
+
+void Scene870::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(870);
+ BF_GLOBALS._sound1.changeSound(90);
+
+ PaletteRotation *rot;
+ rot = BF_GLOBALS._scenePalette.addRotation(235, 235, 1);
+ rot->setDelay(10);
+ rot = BF_GLOBALS._scenePalette.addRotation(237, 238, 1);
+ rot->setDelay(40);
+ rot = BF_GLOBALS._scenePalette.addRotation(242, 243, 1);
+ rot->setDelay(30);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_greenSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 5;
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(831);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player._moveDiff = Common::Point(2, 1);
+
+ _exit.setDetails(Rect(305, 150, 320, 168), 870, -1, -1, -1, 1, NULL);
+ _lumber.setDetails(9, 870, 36, 37, 38, 1);
+ _firePit.setDetails(8, 870, 9, 10, 11, 1);
+
+ if (BF_GLOBALS._dayNumber == 5) {
+ if (!BF_GLOBALS.getFlag(fLyleOnIsland) && (BF_GLOBALS._bookmark != bFinishedWGreen) &&
+ (!BF_GLOBALS.getFlag(fTookTrailerAmmo) || (BF_GLOBALS._bookmark >= bInvestigateBoat))) {
+ _lyle.postInit();
+ _lyle.setVisage(835);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle._moveDiff = Common::Point(2, 1);
+ _lyle.setDetails(870, 27, 28, 29, 1, NULL);
+ }
+
+ _yacht.postInit();
+ _yacht.setVisage(870);
+ _yacht.setStrip(4);
+ _yacht.setFrame(4);
+ _yacht.setPosition(Common::Point(232, 19));
+ _yacht.setDetails(870, 30, 31, 32, 1, NULL);
+
+ if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_FLARE) == 0) &&
+ (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355)) {
+ _green.postInit();
+ _green.setVisage(870);
+ _green.setStrip(7);
+ _green.setPosition(Common::Point(127, 109));
+
+ if (BF_GLOBALS._bookmark == bFinishedWGreen) {
+ _green.setDetails(870, 51, 54, 53, 1, NULL);
+ } else {
+ _green.setDetails(870, 51, 52, 53, 1, NULL);
+ }
+ }
+ }
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 355:
+ _object6.postInit();
+ _object6.setVisage(870);
+ _object6.setPosition(Common::Point(142, 154));
+ _object6.fixPriority(148);
+
+ BF_GLOBALS._player.remove();
+ _lyle.remove();
+ setAction(&_action1);
+ break;
+ case 880:
+ if (BF_GLOBALS._sceneObjects->contains(&_lyle)) {
+ _lyle.setPosition(Common::Point(330, 169));
+ ADD_PLAYER_MOVER_NULL(_lyle, 303, 169);
+ }
+
+ BF_GLOBALS._player.setPosition(Common::Point(330, 139));
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8700;
+ setAction(&_sequenceManager, this, 8700, &BF_GLOBALS._player, NULL);
+ break;
+ default:
+ if (BF_GLOBALS._sceneObjects->contains(&_lyle)) {
+ _lyle.setPosition(Common::Point(156, 148));
+ _lyle.fixPriority(149);
+ }
+
+ if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) &&
+ (BF_INVENTORY.getObjectScene(INV_GRENADES) == 355)) {
+ _object4.postInit();
+ _object4.hide();
+ _object5.postInit();
+ _object5.hide();
+
+ BF_GLOBALS._deathReason = 7;
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager, this, 8703, &BF_GLOBALS._player, &_lyle, &_green,
+ &_object4, &_object5, NULL);
+ } else {
+ BF_GLOBALS._player.changeAngle(135);
+ BF_GLOBALS._player.setPosition(Common::Point(214, 139));
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ }
+
+ _boat.setDetails(7, 870, 3, 4, 5, 1);
+ _crate.setDetails(14, 870, 12, 13, 14, 1);
+ _water.setDetails(5, 870, 24, 25, 26, 1);
+ _palmTrees.setDetails(4, 870, 45, 46, 47, 1);
+ _sand.setDetails(3, 870, 21, 22, 23, 1);
+ _boulders.setDetails(2, 870, 18, 19, 20, 1);
+ _farShore.setDetails(1, 870, 48, 49, 50, 1);
+}
+
+void Scene870::startStrip(int stripNumber) {
+ _sceneMode = 3;
+ BF_GLOBALS._player.disableControl();
+ _stripManager.start(stripNumber, this);
+}
+
+void Scene870::remove() {
+ BF_GLOBALS._scenePalette.clearListeners();
+ SceneExt::remove();
+}
+
+void Scene870::signal() {
+ switch (_sceneMode) {
+ case 0:
+ case 3:
+ case 8700:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 1:
+ _crateInset.postInit();
+ _crateInset.setDetails(870, -1, -1, -1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 2:
+ _yacht.setStrip(6);
+ _yacht.setFrame(1);
+ _yacht._numFrames = 6;
+ _yacht.animate(ANIM_MODE_5, this);
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 8701:
+ BF_GLOBALS._sceneManager.changeScene(880);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene870::process(Event &event) {
+ SceneExt::process(event);
+
+ if (!event.handled && BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_exit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene870::dispatch() {
+ SceneExt::dispatch();
+
+ if (BF_GLOBALS._sceneObjects->contains(&_lyle) && _lyle.isNoMover()) {
+ _lyle.updateAngle(BF_GLOBALS._player._position);
+ }
+
+ if (!_action && (BF_GLOBALS._player._position.x > 305)) {
+ if (BF_GLOBALS._sceneObjects->contains(&_lyle)) {
+ _lyle.animate(ANIM_MODE_1, NULL);
+ ADD_PLAYER_MOVER_NULL(_lyle, BF_GLOBALS._player._position.x, BF_GLOBALS._player._position.y + 5);
+ }
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8701;
+ setAction(&_sequenceManager, this, 8701, &BF_GLOBALS._player, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 880 - Beach Path
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene880::Action1::signal() {
+ Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _actionIndex = 1 + BF_GLOBALS._randomSource.getRandomNumber(1);
+ setDelay(BF_GLOBALS._randomSource.getRandomNumber(90));
+ break;
+ case 1:
+ _actionIndex = 0;
+ scene->_sequenceManager2._onCallback = SequenceManager_callbackProc;
+ setAction(&scene->_sequenceManager2, this, 8811, &scene->_object4, NULL);
+ break;
+ case 2:
+ _actionIndex = 1;
+ setAction(&scene->_sequenceManager2, this, 8814, &scene->_object4, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene880::Action1::SequenceManager_callbackProc(int v1, int v2) {
+ int idx = BF_GLOBALS._randomSource.getRandomNumber(2);
+ Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (idx) {
+ case 0:
+ scene->_object5.show();
+ break;
+ case 1:
+ scene->_object6.show();
+ break;
+ case 2:
+ scene->_object7.show();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene880::Object4::startAction(CursorType action, Event &event) {
+ Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (!scene->_seqNumber)
+ break;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 8815;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_seqNumber, &BF_GLOBALS._player, NULL);
+ return true;
+ case CURSOR_TALK:
+ if (scene->_sceneMode != 2)
+ break;
+
+ scene->_stripManager.start(8800, &BF_GLOBALS._stripProxy);
+ return true;
+ case INV_COLT45:
+ if (scene->_sceneMode != 2)
+ break;
+
+ scene->gunDisplay();
+ return true;
+ default:
+ break;
+ }
+
+ return NamedObject::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene880::NorthExit::startAction(CursorType action, Event &event) {
+ ADD_PLAYER_MOVER(40, 113);
+ return true;
+}
+
+bool Scene880::SouthEastExit::startAction(CursorType action, Event &event) {
+ Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene;
+
+ if (scene->_sceneMode == 2)
+ return false;
+ else {
+ ADD_PLAYER_MOVER(300, 158);
+ return true;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene880::Scene880(): SceneExt() {
+ _seqNumber = 0;
+}
+
+void Scene880::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_seqNumber);
+}
+
+void Scene880::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(880);
+
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 5;
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(1358);
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ BF_GLOBALS._player.disableControl();
+
+ _northExit.setDetails(Rect(25, 99, 54, 127), 880, -1, -1, -1, 1, NULL);
+ _seExit.setDetails(Rect(279, 150, 320, 167), 880, -1, -1, -1, 1, NULL);
+
+ if (BF_GLOBALS._dayNumber == 5) {
+ BF_GLOBALS._sound1.changeSound(107);
+ _object1.postInit();
+ _object1.hide();
+
+ if ((BF_GLOBALS._bookmark != bFinishedWGreen) && (BF_GLOBALS._bookmark >= bInvestigateBoat) &&
+ BF_GLOBALS.getFlag(fTookTrailerAmmo)) {
+ BF_GLOBALS.setFlag(fLyleOnIsland);
+ }
+
+ _object2.postInit();
+ _object2.setVisage(880);
+ _object2.setPosition(Common::Point(209, 76));
+ _object2.setDetails(880, 4, 5, 6, 1, NULL);
+
+ _object4.postInit();
+ _object4.setVisage(875);
+ _object4.setDetails(880, 7, -1, 9, 1, NULL);
+
+ _object5.postInit();
+ _object5.setVisage(874);
+ _object5.setStrip(2);
+ _object5.setFrame(2);
+ _object5.fixPriority(118);
+ _object5.setPosition(Common::Point(55, 117));
+ _object5.hide();
+
+ _object6.postInit();
+ _object6.setVisage(874);
+ _object6.setStrip(3);
+ _object6.setFrame(2);
+ _object6.fixPriority(118);
+ _object6.setPosition(Common::Point(60, 109));
+ _object6.hide();
+
+ _object7.postInit();
+ _object7.setVisage(874);
+ _object7.setStrip(4);
+ _object7.setFrame(2);
+ _object7.fixPriority(118);
+ _object7.setPosition(Common::Point(57, 100));
+ _object7.hide();
+
+ if (BF_GLOBALS.getFlag(fShootGoon)) {
+ _object4.setStrip(6);
+ _object4.setFrame2(_object4.getFrameCount());
+ _object4.fixPriority(160);
+ _object4.setPosition(Common::Point(255, 148));
+
+ _seqNumber = 8816;
+ } else if (BF_GLOBALS.getFlag(fBlowUpGoon)) {
+ _object4.setStrip(7);
+ _object4.setFrame2(_object4.getFrameCount());
+ _object4.fixPriority(130);
+ _object4.setPosition(Common::Point(255, 148));
+
+ _seqNumber = 8815;
+ } else {
+ _object4.setStrip(2);
+ _object4.setPosition(Common::Point(258, 147));
+
+ _object3.postInit();
+ _object3.setVisage(871);
+ _object3.setStrip(4);
+ _object3.hide();
+
+ _seqNumber = 0;
+ }
+ } else if (BF_GLOBALS._sceneManager._previousScene != 900) {
+ BF_GLOBALS._sound1.changeSound(91);
+ }
+
+ switch (BF_GLOBALS._sceneManager._previousScene) {
+ case 900:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 8802, &BF_GLOBALS._player, NULL);
+ break;
+ default:
+ BF_GLOBALS._player.disableControl();
+
+ if (BF_GLOBALS._dayNumber != 5) {
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 8800, &BF_GLOBALS._player, NULL);
+ } else if ((BF_GLOBALS._bookmark > bFinishedWGreen) || (_seqNumber != 0)) {
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 8800, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._bookmark = bFinishedWGreen;
+ _sceneMode = 8805;
+ setAction(&_sequenceManager1, this, 8805, &BF_GLOBALS._player, &_object1, &_object4, NULL);
+ }
+ break;
+ }
+
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 880, 0, -1, -1, 1, NULL);
+}
+
+void Scene880::signal() {
+ switch (_sceneMode) {
+ case 0:
+ case 2:
+ BF_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ BF_GLOBALS._player.fixPriority(-1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 3:
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_GLOBALS.clearFlag(gunDrawn);
+ BF_INVENTORY.setObjectScene(INV_GRENADES, 880);
+ _sceneMode = 0;
+ signal();
+ break;
+ case 4:
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.clearFlag(gunDrawn);
+ _sceneMode = 0;
+ signal();
+ break;
+ case 6:
+ BF_GLOBALS._deathReason = 10;
+ BF_GLOBALS.clearFlag(gunDrawn);
+
+ if (_object4._action) {
+ handleAction(_object4._action);
+ }
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 1;
+ setAction(&_sequenceManager1, this, 8806, &BF_GLOBALS._player, &_object4, NULL);
+ break;
+ case 7:
+ BF_GLOBALS.clearFlag(gunDrawn);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8801;
+ setAction(&_sequenceManager1, this, 8801, &BF_GLOBALS._player, NULL);
+ break;
+ case 8801:
+ BF_GLOBALS._sceneManager.changeScene(870);
+ break;
+ case 8803:
+ BF_GLOBALS._sceneManager.changeScene(900);
+ break;
+ case 8805:
+ _object4.setAction(&_action1);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager1, this, 8807, &BF_GLOBALS._player, NULL);
+ BF_GLOBALS.setFlag(gunDrawn);
+ break;
+ case 8815:
+ if (BF_INVENTORY.getObjectScene(INV_DOG_WHISTLE) == 880) {
+ BF_INVENTORY.setObjectScene(INV_DOG_WHISTLE, 1);
+ T2_GLOBALS._uiElements.addScore(30);
+
+ SceneItem::display2(880, 13);
+ } else {
+ SceneItem::display2(880, 12);
+ }
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene880::process(Event &event) {
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ // Check if the cursor is on an exit
+ if (_northExit.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if (_seExit.contains(event.mousePos) && (_sceneMode != 2)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SE);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ // In case an exit cursor was being shown, restore the previously selected cursor
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ switch (BF_GLOBALS._events.getCursor()) {
+ case INV_COLT45:
+ if (_sceneMode != 2) {
+ _sceneMode = 0;
+ SceneItem::display2(880, 11);
+ signal();
+ } else if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS.clearFlag(gunDrawn);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 6;
+ setAction(&_sequenceManager1, this, 8812, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager1, this, 8807, &BF_GLOBALS._player, NULL);
+ }
+
+ event.handled = true;
+ break;
+ case INV_GRENADES:
+ if (_sceneMode == 2) {
+ if (event.mousePos.x >= 150) {
+ BF_GLOBALS.setFlag(fBlowUpGoon);
+ _seqNumber = 8815;
+ if (_object4._action)
+ handleAction(_object4._action);
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3;
+ setAction(&_sequenceManager1, this, 8809, &BF_GLOBALS._player, &_object3, &_object4, NULL);
+ } else {
+ if (_object4._action)
+ handleAction(_object4._action);
+
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._deathReason = 11;
+ _sceneMode = 1;
+ setAction(&_sequenceManager1, this, 8810, &BF_GLOBALS._player, &_object3, NULL);
+ }
+ event.handled = true;
+ }
+ break;
+ case CURSOR_WALK:
+ if (_sceneMode == 2) {
+ event.handled = true;
+ BF_GLOBALS._player.disableControl();
+
+ _sceneMode = (event.mousePos.y <= BF_GLOBALS._player._position.y) ? 7 : 6;
+ setAction(&_sequenceManager1, this, 8812, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ SceneExt::process(event);
+}
+
+void Scene880::handleAction(Action *action) {
+ if (action->_action)
+ // Work down into sub-actions
+ handleAction(action->_action);
+
+ if (action->_owner) {
+ action->_owner->_action = NULL;
+ action->_owner = NULL;
+ }
+}
+
+void Scene880::dispatch() {
+ SceneExt::dispatch();
+
+ if (!_action) {
+ if ((BF_GLOBALS._player._position.y <= 123) && (BF_GLOBALS._player._priority != 5)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8801;
+ setAction(&_sequenceManager1, this, 8801, &BF_GLOBALS._player, NULL);
+ }
+
+ if ((BF_GLOBALS._player._position.x >= 275) && (BF_GLOBALS._player._position.y > 155)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 8803;
+ setAction(&_sequenceManager1, this, 8803, &BF_GLOBALS._player, NULL);
+ }
+ }
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes8.h b/engines/tsage/blue_force/blueforce_scenes8.h
new file mode 100644
index 0000000000..ef5ef81563
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes8.h
@@ -0,0 +1,568 @@
+/* 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 TSAGE_BLUEFORCE_SCENES8_H
+#define TSAGE_BLUEFORCE_SCENES8_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene800: public SceneExt {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Items */
+ class Item1: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Doorway: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Car1: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Motorcycle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Car2: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ Action1 _action1;
+ SequenceManager _sequenceManager;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ SpeakerGameText _gameTextSpeaker;
+ Doorway _doorway;
+ Car1 _car1;
+ Motorcycle _motorcycle;
+ Lyle _lyle;
+ Car2 _car2;
+ NamedObject _object6;
+ Item1 _item1;
+ Item2 _item2;
+ SceneText _text;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene810: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Items */
+ class Map: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Window: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Bookcase: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class FaxMachine: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class GarbageCan: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class FileCabinets: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class CoffeeMaker: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Shelves: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class MicroficheReader: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item10: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Pictures: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item12: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Background: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Desk: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Lyle: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Chair: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object3: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class FaxMachineInset: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object5: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object7: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ Action1 _action1;
+ Action2 _action2;
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ Lyle _lyle;
+ Chair _chair;
+ Object3 _object3;
+ FaxMachineInset _faxMachineInset;
+ Object5 _object5;
+ NamedObject _object6;
+ Object7 _object7;
+ Map _map;
+ Window _window;
+ Bookcase _bookcase;
+ FaxMachine _faxMachine;
+ GarbageCan _garbageCan;
+ FileCabinets _fileCabinets;
+ CoffeeMaker _coffeeMaker;
+ Shelves _shelves;
+ MicroficheReader _microficheReader;
+ Item10 _item10;
+ Pictures _pictures;
+ Item12 _item12;
+ Background _background;
+ Desk _desk;
+ Exit _exit;
+ ASoundExt _sound1;
+ Rect _rect1, _rect2, _rect3;
+ int _fieldA70, _fieldA72, _fieldA74;
+
+ Scene810();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene820: public SceneExt {
+ /* Objects */
+ class PowerButton: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class ForwardButton: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class BackButton: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ ASoundExt _sound1;
+ SpeakerGameText _gameTextSpeaker;
+ PowerButton _powerButton;
+ BackButton _backButton;
+ ForwardButton _forwardButton;
+ NamedObject _object4, _object5;
+ NamedHotspot _item1;
+ int _pageNumber;
+
+ Scene820();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene830: public PalettedScene {
+ /* Items */
+ class SouthEastExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class NoteBoard: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Door: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class RentalBoat: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object5: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ NamedObject _object1, _lyle, _object6;
+ Door _door;
+ RentalBoat _rentalBoat;
+ Object5 _object5;
+ SouthEastExit _seExit;
+ NoteBoard _noteBoard;
+ NamedHotspot _item2, _item4, _item5;
+ NamedHotspot _item6, _item7, _item8;
+ ASoundExt _sound1;
+ int _field18A4, _field18A6, _field18A8, _field18AA, _field18AC;
+
+ Scene830();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene840: public PalettedScene {
+ /* Items */
+ class Coins: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class BoatKeysInset: public FocusObject {
+ class RentalKeys: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class WaveKeys: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ public:
+ RentalKeys _rentalKeys;
+ WaveKeys _waveKeys;
+ int _v1B4, _v1B6;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class BoatKeys: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Carter: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ NamedObject _object1;
+ BoatKeysInset _boatKeysInset;
+ NamedObject _doors;
+ BoatKeys _boatKeys;
+ Carter _carter;
+ NamedObject _lyle;
+ Coins _coins;
+ NamedHotspot _item2, _item3, _item4, _item5, _item6;
+ NamedHotspot _item7, _item8, _item9, _item10, _item11;
+ NamedHotspot _item12, _item13, _item14, _item15;
+ NamedHotspot _item16, _item17, _item18;
+ Exit _exit;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerJakeUniform _jakeUniformSpeaker;
+ SpeakerCarter _carterSpeaker;
+ int _field1ABA, _field1ABC, _field1ABE, _field1AC0;
+ int _field1AC2, _field1AC4, _field1AC6;
+
+ Scene840();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene850: public SceneExt {
+ /* Timers */
+ class Timer1: public Timer {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ Timer1 _timer;
+ NamedObject _object1;
+ ASoundExt _sound1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene860: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SequenceManager _sequenceManager;
+ NamedObject _deadBody, _object2;
+ NamedHotspot _item1;
+ Action1 _action1;
+ Rect _swRect, _neRect, _yachtRect;
+ ASoundExt _sound1;
+ int _field87E, _field880, _field886, _field888;
+ Common::Point _destPos;
+
+ Scene860();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene870: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Lyle: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Green: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class CrateInset: public FocusObject {
+ class Jar: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Rags: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ private:
+ void initContents();
+ public:
+ Jar _jar;
+ Rags _rags;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class Boat: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Crate: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Exit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ SpeakerGreen _greenSpeaker;
+ Boat _boat;
+ Crate _crate;
+ Exit _exit;
+ NamedObject _yacht;
+ Lyle _lyle;
+ Green _green;
+ NamedObject _object4, _object5, _object6;
+ CrateInset _crateInset;
+ NamedHotspot _lumber, _firePit, _water, _boulders;
+ NamedHotspot _palmTrees, _sand, _farShore, _item11;
+ Action1 _action1;
+ int _field1662, _field1664;
+
+ Scene870();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+
+ void startStrip(int stripNumber);
+};
+
+class Scene880: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ private:
+ static void SequenceManager_callbackProc(int v1, int v2);
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Object4: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Items */
+ class NorthExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SouthEastExit: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+private:
+ static void handleAction(Action *action);
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ Action1 _action1;
+ NamedObject _object1, _object2, _object3;
+ Object4 _object4;
+ NamedObject _object5, _object6, _object7;
+ NamedHotspot _background;
+ NorthExit _northExit;
+ SouthEastExit _seExit;
+ int _seqNumber;
+
+ Scene880();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp
new file mode 100644
index 0000000000..545edb91d6
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes9.cpp
@@ -0,0 +1,3892 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes9.h"
+#include "tsage/globals.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+/*--------------------------------------------------------------------------
+ * Scene 900 - Outside Warehouse
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene900::Item1::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(900, 6);
+ return true;
+ } else {
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+bool Scene900::Item4::startAction(CursorType action, Event &event) {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9001;
+ Common::Point pt(0, 117);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, scene);
+
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+bool Scene900::Gate::startAction(CursorType action, Event &event) {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (BF_GLOBALS._v4CEC0 == 0) {
+ return NamedObject::startAction(action, event);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._v4CEC0 == 2) {
+ scene->_sceneMode = 9006;
+ BF_GLOBALS._v4CEC0 = 1;
+ scene->setAction(&scene->_sequenceManager1, scene, 9006, &BF_GLOBALS._player, this, NULL);
+ } else {
+ BF_GLOBALS._v4CEC0 = 2;
+ if (scene->_dog._flag == false) {
+ BF_GLOBALS._player.setAction(&scene->_action4);
+ } else {
+ scene->_sceneMode = 9005;
+ scene->setAction(&scene->_sequenceManager1, scene, 9005, &BF_GLOBALS._player, this, NULL);
+ BF_GLOBALS._walkRegions.proc2(24);
+ }
+ }
+ return true;
+ }
+ break;
+ case INV_WAREHOUSE_KEYS:
+ if (BF_GLOBALS._v4CEC0 == 2) {
+ SceneItem::display2(900, 14);
+ } else {
+ if (BF_GLOBALS._v4CEC0 == 0) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForUnlockGate)) {
+ BF_GLOBALS.setFlag(fGotPointsForUnlockGate);
+ T2_GLOBALS._uiElements.addScore(30);
+ }
+ BF_GLOBALS._v4CEC0 = 1;
+ } else {
+ if (!BF_GLOBALS.getFlag(fGotPointsForLockGate)) {
+ if (BF_GLOBALS._bookmark == bEndDayThree) {
+ BF_GLOBALS.setFlag(fGotPointsForLockGate);
+ T2_GLOBALS._uiElements.addScore(30);
+ }
+ }
+ BF_GLOBALS._v4CEC0 = 0;
+ }
+ scene->_sceneMode = 9004;
+ BF_GLOBALS._player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9004, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene900::Door::startAction(CursorType action, Event &event) {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (BF_GLOBALS._v4CEC0 == 2) {
+ if (_flag) {
+ SceneItem::display2(900, 1);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._walkRegions.proc2(26);
+ scene->_sceneMode = 9007;
+ scene->setAction(&scene->_sequenceManager1, scene, 9007, &BF_GLOBALS._player, &scene->_door, this, NULL);
+ }
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+ break;
+ case INV_WAREHOUSE_KEYS:
+ if (BF_GLOBALS._v4CEC0 == 2) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9012;
+ scene->setAction(&scene->_sequenceManager1, scene, 9012, &BF_GLOBALS._player, &scene->_door, NULL);
+ } else
+ SceneItem::display2(900, 5);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene900::Dog::startAction(CursorType action, Event &event) {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(900, 8);
+ return true;
+ case CURSOR_USE:
+ SceneItem::display2(900, 9);
+ return true;
+ case INV_HOOK:
+ if (_flag) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9010;
+ scene->setAction(&scene->_sequenceManager1, scene, 9010, &BF_GLOBALS._player, &scene->_object5, this, NULL);
+ } else
+ SceneItem::display2(900, 23);
+ return true;
+ case INV_FISHING_NET:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setAction(&scene->_action2);
+ return true;
+ case INV_DOG_WHISTLE:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setAction(&scene->_action3);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene900::Lyle::startAction(CursorType action, Event &event) {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ if (!_action) {
+ if (scene->_dog._flag) {
+ if (BF_GLOBALS._v4CEC0 == 0)
+ scene->_stripManager.start(9004, &BF_GLOBALS._stripProxy);
+ else {
+ if (scene->_door._flag == 1) {
+ if (BF_GLOBALS._v4CEC0 == 2)
+ scene->_stripManager.start(9005, &BF_GLOBALS._stripProxy);
+ else
+ scene->_stripManager.start(9001, &BF_GLOBALS._stripProxy);
+ } else
+ scene->_stripManager.start(9001, &BF_GLOBALS._stripProxy);
+ }
+ } else {
+ if (scene->_field1974)
+ scene->_stripManager.start(9003, &BF_GLOBALS._stripProxy);
+ else {
+ ++scene->_field1974;
+ scene->_stripManager.start(9002, &BF_GLOBALS._stripProxy);
+ }
+ }
+ }
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+bool Scene900::Body::startAction(CursorType action, Event &event) {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9016;
+ scene->setAction(&scene->_sequenceManager1, scene, 9016, &BF_GLOBALS._player, NULL);
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+void Scene900::Action1::signal() {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if (scene->_dog._flag == 0) {
+ scene->_dog.setStrip(3);
+ if ((BF_GLOBALS._randomSource.getRandomNumber(3) == 1) || (BF_GLOBALS._player._position.x > 790) || (scene->_field1976 != 0)) {
+ Common::Point pt(864, 130);
+ NpcMover *mover = new NpcMover();
+ scene->_dog.addMover(mover, &pt, this);
+ } else {
+ _actionIndex = 4;
+ Common::Point pt(775, 107);
+ NpcMover *mover = new NpcMover();
+ scene->_dog.addMover(mover, &pt, this);
+ }
+ }
+ break;
+ case 1:
+ scene->_dog.setPosition(Common::Point(864, 117));
+ scene->_dog.setStrip(7);
+ scene->_dog.setFrame(1);
+ scene->_dog.animate(ANIM_MODE_5, this);
+ if (BF_GLOBALS._randomSource.getRandomNumber(3) == 1)
+ scene->_sound1.play(92);
+ else
+ scene->_sound1.play(44);
+ if ((BF_GLOBALS._player._position.x > 750) || (scene->_field1976 != 0))
+ _actionIndex = 7;
+ break;
+ case 2:
+ scene->_dog.animate(ANIM_MODE_6, this);
+ break;
+ case 3: {
+ scene->_dog.setStrip(3);
+ scene->_dog.setPosition(Common::Point(864, 130));
+ scene->_dog.fixPriority(122);
+ scene->_dog.animate(ANIM_MODE_1, NULL);
+ Common::Point pt(775, 107);
+ NpcMover *mover = new NpcMover();
+ scene->_dog.addMover(mover, &pt, this);
+ break;
+ }
+ case 6:
+ _actionIndex = 0;
+ // No break on purpose
+ case 4:
+ setDelay(30);
+ break;
+ case 5: {
+ scene->_dog.setStrip(4);
+ Common::Point pt(940, 145);
+ NpcMover *mover = new NpcMover();
+ scene->_dog.addMover(mover, &pt, this);
+ break;
+ }
+ case 7:
+ _actionIndex = 7;
+ setDelay(5);
+ if (BF_GLOBALS._player._position.x < 790)
+ _actionIndex = 2;
+ if (scene->_field1976 != 0)
+ _actionIndex = 8;
+ break;
+ case 8:
+ scene->_dog.setStrip(1);
+ scene->_dog.setFrame(7);
+ scene->_dog.animate(ANIM_MODE_6, NULL);
+ break;
+ case 9:
+ scene->_field1976 = 0;
+ scene->_dog._flag = 0;
+ _actionIndex = 7;
+ scene->_dog.setStrip(1);
+ scene->_dog.setFrame(1);
+ scene->_dog.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene900::Action2::signal() {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_field1976 = 1;
+ if (scene->_dog._action->getActionIndex() != 8)
+ _actionIndex = 0;
+ setDelay(5);
+ break;
+ case 1:
+ scene->_object5.postInit();
+ scene->_object5.setVisage(902);
+ scene->_object5.setStrip(2);
+ scene->_object5.setPosition(Common::Point(-20, -20));
+ scene->_object5._moveDiff.y = 10;
+ setAction(&scene->_sequenceManager1, this, 9009, &BF_GLOBALS._player, &scene->_object5, &scene->_dog, NULL);
+ BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900);
+ break;
+ case 2:
+ BF_GLOBALS._player._strip = 7;
+ if (!BF_GLOBALS.getFlag(fGotPointsForTrapDog)) {
+ BF_GLOBALS.setFlag(fGotPointsForTrapDog);
+ T2_GLOBALS._uiElements.addScore(50);
+ }
+ SceneItem::display2(900, 10);
+ scene->_dog._flag = 1;
+ scene->_dog.fixPriority(130);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene900::Action3::signal() {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if ((BF_GLOBALS._player._position.x < 790) && (!BF_GLOBALS._player._mover)) {
+ Common::Point pt(821, 136);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, 0);
+ }
+ if (scene->_dog._action->getActionIndex() != 7) {
+ _actionIndex = 0;
+ }
+ setDelay(5);
+ break;
+ case 1:
+ if (scene->_dog._strip == 3) {
+ _actionIndex = 3;
+ Common::Point pt(775, 107);
+ NpcMover *mover = new NpcMover();
+ scene->_dog.addMover(mover, &pt, this);
+ } else
+ scene->_dog.animate(ANIM_MODE_6, this);
+ break;
+ case 2: {
+ scene->_dog.setStrip(3);
+ scene->_dog.setPosition(Common::Point(864, 130));
+ scene->_dog.fixPriority(122);
+ scene->_dog.animate(ANIM_MODE_1, NULL);
+ Common::Point pt(775, 107);
+ NpcMover *mover = new NpcMover();
+ scene->_dog.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ scene->_dog.remove();
+ scene->_dog._flag = 1;
+ SceneItem::display2(900, 24);
+ if (!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) {
+ BF_GLOBALS.setFlag(fGotPointsForLockWarehouse);
+ T2_GLOBALS._uiElements.addScore(10);
+ }
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene900::Action4::signal() {
+ Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_field1976 = 1;
+ if (scene->_dog._action->getActionIndex() != 8)
+ _actionIndex = 0;
+ setDelay(5);
+ break;
+ case 1:
+ scene->setAction(&scene->_sequenceManager1, this, 9005, &BF_GLOBALS._player, &scene->_gate, NULL);
+ break;
+ case 2:
+ scene->setAction(&scene->_sequenceManager1, this, 9008, &BF_GLOBALS._player, &scene->_dog, NULL);
+ break;
+ case 3:
+ BF_GLOBALS._deathReason = 5;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene900::Scene900(): PalettedScene() {
+ _field1974 = _field1976 = 0;
+}
+
+void Scene900::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit(OwnerList);
+ loadScene(900);
+
+ if (BF_GLOBALS._sceneManager._previousScene == 910)
+ BF_GLOBALS._sound1.changeSound(91);
+ _field1974 = 0;
+ _field1976 = 0;
+ T2_GLOBALS._uiElements._active = true;
+ BF_GLOBALS.clearFlag(fCanDrawGun);
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._dayNumber = 4;
+ BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1);
+ BF_INVENTORY.setObjectScene(INV_HOOK, 1);
+ }
+ _dog._flag = 0;
+ if (BF_GLOBALS._bookmark >= bFinishedWGreen) {
+ _body.postInit();
+ _body.fixPriority(120);
+ _body.setVisage(901);
+ _body.setPosition(Common::Point(159,128));
+ _body.setDetails(900, 15, 16, 17, ANIM_MODE_1, NULL);
+ }
+ if (BF_GLOBALS._sceneManager._previousScene == 910) {
+ _sceneBounds.moveTo(639, 0);
+
+ BF_GLOBALS._v4CEC0 = 2;
+ BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900);
+ _dog._flag = 1;
+ }
+ if (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900)
+ _dog._flag = 1;
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+
+ _item4.setDetails(Rect(0, 85, 20, 130), 900, -1, -1, -1, 1, 0);
+ BF_GLOBALS._player.postInit();
+
+ _dog.postInit();
+ _dog.setVisage(902);
+ _dog.setPosition(Common::Point(845, 135));
+ _dog.fixPriority(122);
+ _dog.setDetails(900, 8, -1, 9, 1, NULL);
+
+ if (_dog._flag == 0) {
+ _dog.animate(ANIM_MODE_1, NULL);
+ _dog.setAction(&_action1);
+ } else {
+ _dog.setAction(&_action1);
+ _dog.fixPriority(130);
+ if (BF_GLOBALS._dayNumber == 4) {
+ _dog.setPosition(Common::Point(879, 120));
+ _dog.setStrip(2);
+ } else {
+ _dog.setPosition(Common::Point(864, 117));
+ _dog.setStrip(6);
+ _dog.setFrame(6);
+ }
+ }
+
+ _gate.postInit();
+ _gate.setVisage(900);
+ _gate.setStrip(2);
+
+ if (BF_GLOBALS._v4CEC0 == 2)
+ _gate.setPosition(Common::Point(758, 127));
+ else {
+ BF_GLOBALS._walkRegions.proc1(24);
+ _gate.setPosition(Common::Point(804, 132));
+ }
+
+ if (BF_GLOBALS._dayNumber == 5)
+ BF_GLOBALS._v4CEC8 = 0;
+
+ if ((BF_GLOBALS._v4CEC8 == 0) && (BF_GLOBALS.getFlag(fWithLyle))) {
+ _object4.postInit();
+ _object4.setVisage(900);
+ _object4.setStrip(3);
+ _object4.fixPriority(1);
+ _object4.setPosition(Common::Point(866, 117));
+ }
+
+ _door.postInit();
+ _door.setVisage(900);
+
+ if (BF_GLOBALS._v4CEC8 == 0)
+ _door.setStrip(4);
+ else
+ _door.setStrip(1);
+
+ _door.setPosition(Common::Point(847, 45));
+ _door._flag = 1;
+
+ if ((BF_GLOBALS._sceneManager._previousScene == 880) || (BF_GLOBALS._sceneManager._previousScene != 910)) {
+ BF_GLOBALS._walkRegions.proc1(26);
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._bookmark == bFinishedWGreen) {
+ _sceneMode = 9013;
+ _lyle.postInit();
+ _lyle._moveDiff.y = 7;
+ _lyle._flags |= OBJFLAG_CHECK_REGION;
+ _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL);
+ _lyleHatSpeaker._xp = 210;
+ _jakeJacketSpeaker._xp = 75;
+ setAction(&_sequenceManager1, this, 9013, &BF_GLOBALS._player, &_lyle, NULL);
+ BF_GLOBALS._bookmark = bAmbushed;
+ BF_GLOBALS.setFlag(fWithLyle);
+ } else {
+ if (BF_GLOBALS._bookmark > bFinishedWGreen) {
+ _lyle.postInit();
+ _lyle.setVisage(811);
+ _lyle.setPosition(Common::Point(780, 153));
+ _lyle._moveDiff.y = 7;
+ _lyle._flags |= 0x1000;
+ _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL);
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ }
+
+ _sceneMode = 9000;
+ setAction(&_sequenceManager1, this, 9000, &BF_GLOBALS._player, NULL);
+ }
+ } else {
+ _door._flag = 0;
+ _door.setFrame(_door.getFrameCount());
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9002;
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ _lyle.postInit();
+ _lyle._flags |= 0x1000;
+ _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL);
+ setAction(&_sequenceManager1, this, 9014, &BF_GLOBALS._player, &_door, &_lyle, NULL);
+ } else
+ setAction(&_sequenceManager1, this, 9002, &BF_GLOBALS._player, &_door, NULL);
+ }
+
+ _gate.setDetails(900, 0, -1, 1, 1, 0);
+ _door.setDetails(900, 2, -1, 5, 1, 0);
+ _item2.setDetails(Rect(0, 0, 225, 21), 666, 25, -1, -1, 1, NULL);
+ _item3.setDetails(Rect(37, 21, 324, 50), 666, 26, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 960, 200), 900, 7, -1, -1, 1, NULL);
+}
+
+void Scene900::signal() {
+ static uint32 v50E8B = 0;
+
+ switch (_sceneMode++) {
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(910);
+ break;
+ case 3:
+ BF_GLOBALS._walkRegions.proc1(24);
+ _sceneMode = 9004;
+ setAction(&_sequenceManager1, this, 9006, &BF_GLOBALS._player, &_gate, NULL);
+ break;
+ case 9000:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9001:
+ if ((BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) || (BF_GLOBALS._v4CEC0 != 0) ||
+ (_door._flag == 0))
+ BF_GLOBALS.setFlag(fLeftTraceIn900);
+ else
+ BF_GLOBALS.clearFlag(fLeftTraceIn900);
+
+ BF_GLOBALS._sceneManager.changeScene(880);
+ break;
+ case 9002:
+ BF_GLOBALS._walkRegions.proc1(26);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9004:
+ if (BF_GLOBALS._v4CEC0 == 0)
+ SceneItem::display2(900, 3);
+ else
+ SceneItem::display2(900, 4);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9005:
+ if (_dog._flag == 0)
+ BF_GLOBALS._player.setAction(&_action4);
+ else
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9006:
+ BF_GLOBALS._walkRegions.proc1(24);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9007:
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ Common::Point pt(862, 119);
+ PlayerMover *mover = new PlayerMover();
+ _lyle.addMover(mover, &pt, NULL);
+ _sceneMode = 1;
+ addFader((const byte *)&v50E8B, 5, this);
+ } else
+ BF_GLOBALS._sceneManager.changeScene(910);
+ break;
+ case 9008:
+ BF_GLOBALS._deathReason = 5;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 9010:
+ _sound1.play(92);
+ if (BF_GLOBALS._v4CEC0 == 2) {
+ _sceneMode = 9008;
+ setAction(&_sequenceManager1, this, 9008, &BF_GLOBALS._player, &_dog, NULL);
+ } else {
+ BF_GLOBALS._player._strip = 7;
+ _action1.setActionIndex(9);
+ _dog.signal();
+ if ((!BF_GLOBALS.getFlag(fGotPointsForFreeDog)) && (BF_GLOBALS._bookmark == bEndDayThree)) {
+ BF_GLOBALS.setFlag(fGotPointsForFreeDog);
+ T2_GLOBALS._uiElements.addScore(50);
+ }
+ BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1);
+ SceneItem::display2(900, 11);
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 9012:
+ if (_door._flag == 0) {
+ SceneItem::display2(900, 12);
+ _door._flag = 1;
+ if ((!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) && (BF_GLOBALS._bookmark == bEndDayThree)) {
+ BF_GLOBALS.setFlag(fGotPointsForLockWarehouse);
+ T2_GLOBALS._uiElements.addScore(30);
+ }
+ } else {
+ SceneItem::display2(900, 13);
+ _door._flag = 0;
+ if (!BF_GLOBALS.getFlag(fGotPointsForUnlockWarehouse)) {
+ BF_GLOBALS.setFlag(fGotPointsForUnlockWarehouse);
+ T2_GLOBALS._uiElements.addScore(30);
+ }
+ }
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9013:
+ _lyleHatSpeaker._xp = 75;
+ _jakeJacketSpeaker._xp = 210;
+ _lyle.setAction(&_sequenceManager2, &_lyle, 9015, &_lyle, NULL);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9016:
+ if ((BF_GLOBALS._clip1Bullets == 0) && (BF_GLOBALS._clip2Bullets == 0)){
+ BF_GLOBALS._clip1Bullets = 8;
+ BF_GLOBALS._clip1Bullets = 8;
+ SceneItem::display2(900, 25);
+ } else if (BF_GLOBALS._clip1Bullets == 0) {
+ BF_GLOBALS._clip1Bullets = 8;
+ SceneItem::display2(900, 26);
+ } else if (BF_GLOBALS._clip2Bullets == 0) {
+ BF_GLOBALS._clip2Bullets = 8;
+ SceneItem::display2(900, 26);
+ } else
+ SceneItem::display2(900, 27);
+
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene900::process(Event &event) {
+ SceneExt::process(event);
+
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ if (_item4.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+}
+
+void Scene900::dispatch() {
+ SceneExt::dispatch();
+
+ if (BF_GLOBALS.getFlag(fWithLyle) && _lyle.isNoMover()) {
+ _lyle.updateAngle(BF_GLOBALS._player._position);
+ }
+
+ if (!_action) {
+ if ((BF_GLOBALS._player._position.x <= 20) && (BF_GLOBALS._player._position.y < 130)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9001;
+ setAction(&_sequenceManager1, this, 9001, &BF_GLOBALS._player, NULL);
+ }
+ }
+}
+
+void Scene900::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_field1974);
+ s.syncAsSint16LE(_field1976);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 910 - Inside the warehouse
+ *
+ *--------------------------------------------------------------------------*/
+/* Actions */
+void Scene910::Action1::signal() {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex - 1) {
+ case 0:
+ scene->_vent.setStrip(1);
+ scene->_vent.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ if (scene->_vent._strip == 2)
+ scene->_vent.setFrame(4);
+ scene->_vent.setStrip(1);
+ scene->_vent.animate(ANIM_MODE_6, NULL);
+ break;
+ case 2:
+ scene->_vent.setStrip(2);
+ scene->_vent.animate(ANIM_MODE_2, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene910::Action2::signal() {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object7.postInit();
+ scene->_object7.setVisage(919);
+ scene->_object7.setPosition(Common::Point(267, 51));
+ scene->_object7.fixPriority(40);
+ signal();
+ break;
+ case 1:
+ scene->_object7.hide();
+ setDelay(600);
+ break;
+ case 2:
+ scene->_object7.setStrip(BF_GLOBALS._randomSource.getRandomNumber(3) + 2);
+ scene->_object7.setFrame(1);
+ scene->_object7.show();
+ setDelay(6);
+ break;
+ case 3:
+ _actionIndex = 1;
+ scene->_object7.setStrip(BF_GLOBALS._randomSource.getRandomNumber(3) + 2);
+ scene->_object7.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ break;
+ }
+}
+
+/* Objects */
+
+void Scene910::Lyle::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_field90);
+}
+
+bool Scene910::Lyle::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (BF_GLOBALS._v4CEE2 == 0)
+ return NamedObject::startAction(action, event);
+ else
+ return false;
+ } else if (action == CURSOR_TALK) {
+ if ((BF_GLOBALS._v4CEE0 != 0) || (BF_GLOBALS._v4CEE2 != 0)) {
+ scene->_stripManager.start(9100 + _field90, &BF_GLOBALS._stripProxy);
+ if (_field90 < 1)
+ _field90++;
+ return true;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9130;
+ if (BF_GLOBALS.getFlag(gunDrawn))
+ scene->setAction(&scene->_sequenceManager1, scene, 9138, &BF_GLOBALS._player, &scene->_lyle, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 9130, &BF_GLOBALS._player, &scene->_lyle, NULL);
+ return true;
+ }
+ } else {
+ return NamedObject::startAction(action, event);
+ }
+}
+
+bool Scene910::Nico::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_field2DDA = 6;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ return true;
+ break;
+ case CURSOR_TALK:
+ if (BF_GLOBALS._v4CEE2 >= 4)
+ return NamedObject::startAction(action, event);
+
+ if (BF_GLOBALS._v4CEE6 < 4)
+ BF_GLOBALS._v4CEE6++;
+
+ if (BF_GLOBALS._v4CEE6 == 2) {
+ scene->_sceneMode = 13;
+ scene->_stripManager.start(9105, scene);
+ } else
+ scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy);
+ return true;
+ break;
+ case 1:
+ if (BF_GLOBALS._v4CEE2 > 1) {
+ if (BF_GLOBALS._v4CEE2 != 4) {
+ if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())) {
+ if (scene->_field2DE0 == 0) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9126;
+ scene->setAction(&scene->_sequenceManager1, scene, 9126, &scene->_nico, NULL);
+ return NamedObject::startAction(action, event);
+ } else {
+ scene->_stripManager.start(9117, &BF_GLOBALS._stripProxy);
+ return NamedObject::startAction(action, event);
+ }
+ } else
+ return NamedObject::startAction(action, event);
+ } else {
+ SceneItem::display(910, 90, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ }
+ } else {
+ if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9125;
+ scene->setAction(&scene->_sequenceManager1, scene, 9125, &scene->_nico, NULL);
+ }
+ return NamedObject::startAction(action, event);
+ }
+ break;
+ case 39:
+ case 53:
+ if (BF_GLOBALS._v4CEE2 >= 4)
+ return NamedObject::startAction(action, event);
+
+ if (BF_GLOBALS._v4CEE6 < 4)
+ BF_GLOBALS._v4CEE6++;
+
+ if (BF_GLOBALS._v4CEE6 == 2) {
+ scene->_sceneMode = 13;
+ scene->_stripManager.start(9105, scene);
+ } else
+ scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy);
+
+ return true;
+ break;
+ case 57:
+ if (BF_GLOBALS._v4CEE2 < 4) {
+ BF_GLOBALS._player.disableControl();
+ scene->_yellowCord.fixPriority(121);
+ scene->_field2DDA = 10;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+
+ return true;
+ } else {
+ SceneItem::display(910, 95, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+
+ return true;
+ }
+ break;
+ case 58:
+ if (BF_GLOBALS._v4CECC == 1)
+ SceneItem::display(910, 84, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ else
+ SceneItem::display(910, 82, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ break;
+ case 59:
+ case 61:
+ SceneItem::display(910, 83, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ break;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene910::Stuart::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ scene->_field2DDA = 7;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ return true;
+ break;
+ case CURSOR_TALK:
+ if (BF_GLOBALS._v4CEE8 < 3)
+ BF_GLOBALS._v4CEE8++;
+
+ scene->_stripManager.start(9107 + BF_GLOBALS._v4CEE8, &BF_GLOBALS._stripProxy);
+ return true;
+ break;
+ case 1:
+ if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())){
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._v4CEE4 == 2) {
+ scene->_sceneMode = 9132;
+ scene->setAction(&scene->_sequenceManager1, scene, 9132, &scene->_stuart, NULL);
+ return NamedObject::startAction(action, event);
+ } else {
+ if (scene->_field2DE0 == 0) {
+ scene->_sceneMode = 9132;
+ scene->setAction(&scene->_sequenceManager1, scene, 9132, &scene->_stuart, NULL);
+ } else
+ scene->_stripManager.start(9117, &BF_GLOBALS._stripProxy);
+ return NamedObject::startAction(action, event);
+ }
+ } else
+ return NamedObject::startAction(action, event);
+ break;
+ case 57:
+ if (BF_GLOBALS._v4CECC == 1) {
+ SceneItem::display(910, 84, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._v4CEE2 == 4) {
+ scene->_field2DDA = 11;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ return true;
+ } else {
+ scene->_field2DDA = 12;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ return true;
+ }
+ }
+ break;
+ case 58:
+ if (BF_GLOBALS._v4CECC == 1) {
+ SceneItem::display(910, 84, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_field2DDA = 11;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ return true;
+ }
+ break;
+ case 59:
+ case 61:
+ SceneItem::display(910, 83, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ break;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene910::Forbes::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._walkRegions.proc2(1);
+ BF_GLOBALS._walkRegions.proc2(16);
+ scene->_sceneMode = 9140;
+ scene->setAction(&scene->_sequenceManager1, scene, 9140, &scene->_forbes, &BF_GLOBALS._player, &scene->_lyle, NULL);
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+void Scene910::PowerCord::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_field90);
+ s.syncAsSint16LE(_field92);
+}
+
+bool Scene910::PowerCord::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ // the last check is used in order to replace a check on CURSOR_1000, which is replaced
+ // directly by its sub-check. All items have an id inferior to 100h.
+ if ((action == CURSOR_LOOK) || (action == CURSOR_TALK) || (action < CURSOR_WALK)) {
+ if (_field90 == 1)
+ return false;
+ if ((_field92 != 1) || (BF_GLOBALS._v4CEE0 == 0 ))
+ return NamedObject::startAction(action, event);
+ return false;
+ } else if (action == CURSOR_USE) {
+ if (_field90 == 0) {
+ if ((BF_GLOBALS._v4CEE0 == 0) || (_field92 != 1)) {
+ BF_GLOBALS._player.disableControl();
+ if (_field92 == 1) {
+ scene->_field2DDA = 8;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ _field90 = 1;
+ return true;
+ } else {
+ scene->_destPos = Common::Point(151, 186);
+ scene->_field2DDA = 4;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ _field90 = 1;
+ return true;
+ }
+ } else
+ return false;
+ } else if (_field90 == 1)
+ return false;
+ else
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+void Scene910::PowerCord::init(int val) {
+ NamedObject::postInit();
+
+ _field92 = val;
+ _field90 = 0;
+}
+
+bool Scene910::BreakerBox::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (BF_GLOBALS._v4CEC8 == 0)
+ SceneItem::display2(910, 7);
+ else
+ SceneItem::display2(910, 6);
+ return true;
+ break;
+ case CURSOR_USE:
+ if (scene->_lyle._position.x == 115) {
+ SceneItem::display2(910, 62);
+ return true;
+ } else if (scene->_sceneMode != 9120) {
+ if (BF_GLOBALS._v4CEE2 == 1) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9118;
+ scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL);
+ return true;
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9102;
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ scene->_field2DDA = 1;
+ scene->_sceneMode = 9123;
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ return true;
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 9102, &BF_GLOBALS._player, NULL);
+ return true;
+ }
+ }
+ } else {
+ SceneItem::display(910, 62, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ }
+ break;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene910::FakeWall::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == INV_YELLOW_CORD) {
+ BF_GLOBALS._player.disableControl();
+ scene->_destPos = Common::Point(285, 114);
+ scene->_field2DDA = 9;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+void Scene910::BreakerBoxInset::postInit(SceneObjectList *OwnerList) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ FocusObject::postInit();
+ _resNum = 910;
+ _lookLineNum = 7;
+ _useLineNum = 8;
+ BF_GLOBALS._sceneItems.push_back(this);
+ scene->_field2DD8 = 0;
+
+ _object13.setupBreaker(115, 44, 1, BF_GLOBALS._v4CECE[0]);
+ _object14.setupBreaker(116, 63, 2, BF_GLOBALS._v4CECE[1]);
+ _object15.setupBreaker(116, 69, 2, BF_GLOBALS._v4CECE[2]);
+ _object16.setupBreaker(115, 76, 1, BF_GLOBALS._v4CECE[3]);
+ _object17.setupBreaker(115, 95, 1, BF_GLOBALS._v4CECE[4]);
+ _object18.setupBreaker(116, 114, 2, BF_GLOBALS._v4CECE[5]);
+ _object19.setupBreaker(116, 120, 2, BF_GLOBALS._v4CECE[6]);
+ _object20.setupBreaker(188, 45, 2, BF_GLOBALS._v4CECE[7]);
+ _object21.setupBreaker(188, 51, 2, BF_GLOBALS._v4CECE[8]);
+ _object22.setupBreaker(179, 59, 1, BF_GLOBALS._v4CECE[9]);
+ _object23.setupBreaker(187, 78, 2, BF_GLOBALS._v4CECE[10]);
+ _object24.setupBreaker(187, 84, 2, BF_GLOBALS._v4CECE[11]);
+
+ _object25.subEBBDC(178, 90, 1, BF_GLOBALS._v4CECE[12]);
+ _object26.subEBBDC(178, 108, 2, BF_GLOBALS._v4CECE[13]);
+}
+
+void Scene910::BreakerBoxInset::remove() {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ _object13.remove();
+ _object14.remove();
+ _object15.remove();
+ _object16.remove();
+ _object17.remove();
+ _object18.remove();
+ _object19.remove();
+ _object20.remove();
+ _object21.remove();
+ _object22.remove();
+ _object23.remove();
+ _object24.remove();
+ _object25.remove();
+ _object26.remove();
+ _object27.remove();
+ _object28.remove();
+
+ if ((BF_GLOBALS._v4CECE[13] < 4) && (scene->_breakerBox._frame > 1))
+ scene->_breakerBox.animate(ANIM_MODE_6, NULL);
+
+ FocusObject::remove();
+}
+
+void Scene910::Object13::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_field90);
+ s.syncAsSint16LE(_field92);
+}
+
+bool Scene910::Object13::startAction(CursorType action, Event &event) {
+ static uint32 black = 0;
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ int8 var2;
+
+ if (_field92 == 1)
+ var2 = 12;
+ else
+ var2 = 7;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display(910, 9, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_USE:
+ scene->_sound2.play(101);
+ if (event.mousePos.x <= _position.x + var2) {
+ if (_field92 != 1) {
+ if (_frame > 6)
+ setFrame(_frame - 1);
+ } else {
+ if (_frame > 1)
+ setFrame(_frame - 1);
+ }
+ } else {
+ if (_field92 == 1) {
+ if (_frame < 3)
+ setFrame(_frame + 1);
+ } else {
+ if (_frame < 8)
+ setFrame(_frame + 1);
+ }
+ }
+
+ if (_field92 != 1)
+ BF_GLOBALS._v4CECE[_field90 - 1] = (_field90 + 251) % 256;
+ else
+ BF_GLOBALS._v4CECE[_field90 - 1] = _field90;
+
+ switch (_field90) {
+ case 1:
+ if (BF_GLOBALS._v4CEE2 < 1) {
+ if (_frame == 2) {
+ if (!BF_GLOBALS.getFlag(81)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(81);
+ }
+ scene->_sceneMode = 0;
+ if (BF_GLOBALS._dayNumber == 5) {
+ if (BF_GLOBALS._v4CEE2 == 0) {
+ scene->_breakerBoxInset.remove();
+ // _objectList.draw();
+ BF_GLOBALS._player.disableControl();
+ scene->_lyle.setVisage(912);
+ scene->_object7.remove();
+ scene->_action2.remove();
+ scene->_nico.postInit();
+ scene->_sceneMode = 9129;
+ scene->setAction(&scene->_sequenceManager1, scene, 9129, &BF_GLOBALS._player, &scene->_nico, NULL);
+ } else if (BF_GLOBALS._v4CEE2 == 2) {
+ scene->_breakerBoxInset.remove();
+ // _objectList.draw();
+ BF_GLOBALS._player.disableControl();
+ scene->_lyle.setVisage(911);
+ scene->_lyle.setStrip(4);
+ scene->_nico.setVisage(923);
+ scene->_nico.setStrip(2);
+ scene->_stuart.setVisage(923);
+ scene->_stuart.setStrip(3);
+ scene->_sceneMode = 9134;
+ scene->setAction(&scene->_sequenceManager1, scene, 9134, &BF_GLOBALS._player, &scene->_nico, &scene->_lyle, NULL);
+ }
+ }
+ BF_GLOBALS._v4CEC8 = 1;
+ scene->_object5.show();
+ if (scene->_sceneMode == 0) {
+ BF_GLOBALS._player.setVisage(911);
+ scene->_lyle.setVisage(912);
+ }
+ scene->transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, 0);
+ BF_GLOBALS._scenePalette.signalListeners();
+ // _objectList.draw();
+ } else {
+ if (BF_GLOBALS._v4CEC8 == 1) {
+ if (!BF_GLOBALS.getFlag(78)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(78);
+ }
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._v4CEC8 = 0;
+ scene->_sceneMode = 2;
+ scene->transition((const byte *)&black, 30, 910, scene, 0, 111, 112, 255, 0);
+ }
+ }
+ } else
+ SceneItem::display(910, 97, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case 4:
+ if (_frame == 2) {
+ if (BF_GLOBALS._v4CECE[4] == 2) {
+ scene->_action1.setActionIndex(2);
+ scene->_action1.signal();
+ }
+ } else if (scene->_action1.getActionIndex() == 2) {
+ scene->_action1.setActionIndex(1);
+ scene->_action1.signal();
+ }
+ return true;
+ case 5:
+ if (_frame == 2) {
+ if (BF_GLOBALS._v4CECE[3] == 2) {
+ scene->_action1.setActionIndex(2);
+ scene->_action1.signal();
+ }
+ } else if (scene->_action1.getActionIndex() == 2) {
+ scene->_action1.setActionIndex(1);
+ scene->_action1.signal();
+ }
+ return true;
+ case 15:
+ if ((BF_GLOBALS._v4CECA == 2) && (BF_GLOBALS._v4CECE[17] == 1)) {
+ if (_frame == 7)
+ scene->subE83E1();
+ else
+ scene->subE82BD();
+ }
+ return true;
+ default:
+ return true;
+ }
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+void Scene910::Object13::remove() {
+ BF_GLOBALS._sceneItems.remove(this);
+ SceneObject::remove();
+}
+
+void Scene910::Object13::setupBreaker(int x, int y, int mode, int8 frameNumber) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ NamedObject::postInit();
+ _field92 = mode;
+ scene->_field2DD8++;
+ _field90 = scene->_field2DD8;
+ setVisage(910);
+
+ if (mode == 1) {
+ setStrip(8);
+ setFrame(frameNumber);
+ } else if (mode == 2) {
+ setStrip(7);
+ setFrame(frameNumber + 5);
+ }
+
+ fixPriority(252);
+ setPosition(Common::Point(x, y));
+ BF_GLOBALS._sceneItems.push_front(this);
+}
+
+void Scene910::Object25::synchronize(Serializer &s) {
+ NamedObject::synchronize(s);
+ s.syncAsSint16LE(_field90);
+ s.syncAsSint16LE(_field92);
+}
+
+bool Scene910::Object25::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_field92 == 1)
+ SceneItem::display2(910, 10);
+ else
+ SceneItem::display2(910, 11);
+ return true;
+ case CURSOR_USE:
+ _field92 = BF_GLOBALS._v4CECE[_field90 + 11];
+ switch (_field92 - 1) {
+ case 0:
+ _field92 = 2;
+ setStrip(7);
+ setFrame(1);
+ if (_field90 == 1) {
+ scene->_field2DD8 = 14;
+ scene->_breakerBoxInset._object27.setupBreaker(182, 92, 2, BF_GLOBALS._v4CECE[14]);
+ } else {
+ scene->_field2DD8 = 15;
+ scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]);
+ }
+ SceneItem::display2(910, 12);
+ break;
+ case 1:
+ _field92 = 3;
+ setStrip(6);
+ setFrame(3);
+ if (_field90 == 1)
+ scene->_breakerBoxInset._object27.remove();
+ else
+ scene->_breakerBoxInset._object28.remove();
+ break;
+ case 2:
+ _field92 = 2;
+ setStrip(7);
+ setFrame(1);
+ if (_field90 == 1) {
+ scene->_field2DD8 = 14;
+ scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._v4CECE[14]);
+ } else {
+ scene->_field2DD8 = 15;
+ scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]);
+ }
+ break;
+ case 3:
+ SceneItem::display2(910, 13);
+ break;
+ default:
+ break;
+ }
+
+ BF_GLOBALS._v4CECE[_field90 + 11] = _field92;
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+void Scene910::Object25::remove() {
+ BF_GLOBALS._sceneItems.remove(this);
+ SceneObject::remove();
+}
+
+void Scene910::Object25::subEBBDC(int x, int y, int arg8, int argA) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ NamedObject::postInit();
+ scene->_field2DD8++;
+ _field90 = arg8;
+ _field92 = argA;
+ setVisage(910);
+
+ if ((_field92 != 2) && (_field92 != 4)) {
+ setStrip(6);
+ setFrame(3);
+ } else {
+ setStrip(7);
+ setFrame(1);
+ if (_field90 == 1) {
+ scene->_field2DD8 = 14;
+ scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._v4CECE[14]);
+ } else {
+ scene->_field2DD8 = 15;
+ scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]);
+ }
+ }
+
+ fixPriority(251);
+ setPosition(Common::Point(x, y));
+ BF_GLOBALS._sceneItems.push_front(this);
+}
+
+bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display(910, 14, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ case CURSOR_USE:
+ switch (_frame - _field90 - 2) {
+ case 0:
+ SceneItem::display(910, 15, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ break;
+ case 1:
+ if (BF_GLOBALS._v4CECA == 1) {
+ BF_GLOBALS._v4CECA = 0;
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1);
+ BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 910);
+ } else if (BF_GLOBALS._v4CECA == 2) {
+ BF_GLOBALS._v4CECA = 1;
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1);
+ scene->_blackCord.setPosition(Common::Point(540, 100));
+ }
+ setFrame(_field90 + 2);
+ break;
+ case 2:
+ if (BF_GLOBALS._v4CECC == 1) {
+ BF_GLOBALS._v4CECC = 0;
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1);
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910);
+ } else if (BF_GLOBALS._v4CECC == 2) {
+ BF_GLOBALS._v4CECC = 1;
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1);
+ scene->_yellowCord.setPosition(Common::Point(540, 100));
+ }
+ setFrame(_field90 + 2);
+ break;
+ case 3:
+ if ((_position.x - 12) - (5 * _field90) < event.mousePos.x) {
+ if (BF_GLOBALS._v4CECA == 1) {
+ BF_GLOBALS._v4CECA = 0;
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1);
+ BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 910);
+ scene->_blackCord.setPosition(Common::Point(540, 100));
+ } else if (BF_GLOBALS._v4CECA == 2) {
+ BF_GLOBALS._v4CECA = 1;
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1);
+ scene->_blackCord.setPosition(Common::Point(540, 100));
+ }
+ setFrame(_field90 + 4);
+ } else {
+ if (BF_GLOBALS._v4CECC == 1) {
+ BF_GLOBALS._v4CECC = 0;
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1);
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910);
+ } else if (BF_GLOBALS._v4CECC == 2) {
+ BF_GLOBALS._v4CECC = 1;
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1);
+ scene->_yellowCord.setPosition(Common::Point(540, 100));
+ }
+ setFrame(_field90 + 3);
+ }
+ default:
+ break;
+ }
+ BF_GLOBALS._v4CECE[_field90 + 15] = _frame;
+ if (_field90 == 0) {
+ if (_frame == 2)
+ BF_GLOBALS._v4CECE[13] = 2;
+ else
+ BF_GLOBALS._v4CECE[13] = 4;
+ }
+ return true;
+ case INV_HALF_YELLOW_CORD:
+ if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == _field90 + 2) {
+ SceneItem::display(910, 85, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ }
+ if (BF_GLOBALS._v4CEE2 == 3) {
+ SceneItem::display(910, 84, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ }
+ // no break on purpose
+ case INV_YELLOW_CORD:
+ if (BF_GLOBALS._v4CECC == 0) {
+ BF_GLOBALS._v4CECC = 1;
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, _field90 + 2);
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1);
+ } else if (BF_GLOBALS._v4CECC == 1) {
+ BF_GLOBALS._v4CECC = 2;
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, _field90 + 2);
+ scene->_yellowCord.setStrip(4);
+ scene->_yellowCord.setFrame(2);
+ scene->_yellowCord.setPosition(Common::Point(135, 93));
+ scene->_yellowCord.fixPriority(50);
+ }
+ if (_frame - _field90 == 2)
+ setFrame(_field90 + 4);
+ else if (_frame - _field90 == 3)
+ setFrame(_field90 + 5);
+ BF_GLOBALS._v4CECE[15 + _field90] = _frame;
+ BF_GLOBALS._v4CECE[_field90 + 15] = _frame;
+ if (_field90 == 0) {
+ if (_frame == 2)
+ BF_GLOBALS._v4CECE[13] = 2;
+ else
+ BF_GLOBALS._v4CECE[13] = 4;
+ }
+ return true;
+ case INV_HALF_BLACK_CORD:
+ if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == _field90 + 2) {
+ SceneItem::display(910, 85, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+ }
+ //No break on purpose
+ case INV_BLACK_CORD:
+ if (BF_GLOBALS._v4CECA == 0) {
+ if (_field90 == 1) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForBlackCord);
+ }
+ } else {
+ if (!BF_GLOBALS.getFlag(fGotPointsForGeneratorPlug)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForGeneratorPlug);
+ }
+ }
+ BF_GLOBALS._v4CECA = 1;
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, _field90 + 2);
+ BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1);
+ } else if (BF_GLOBALS._v4CECA == 1) {
+ if (_field90 == 1) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForBlackCord);
+ }
+ } else {
+ if (!BF_GLOBALS.getFlag(fGotPointsForGeneratorPlug)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForGeneratorPlug);
+ }
+ }
+ BF_GLOBALS._v4CECA = 2;
+ BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, _field90 + 2);
+ scene->_blackCord.setStrip(4);
+ scene->_blackCord.setFrame(1);
+ scene->_blackCord.setPosition(Common::Point(135, 93));
+ scene->_blackCord.fixPriority(50);
+ scene->_blackCord.show();
+ scene->_blackCord._field90 = 1;
+ if (BF_GLOBALS._v4CECE[17] == 1) {
+ if (BF_GLOBALS._v4CECE[14] == 2)
+ scene->subE83E1();
+ else
+ scene->subE82BD();
+ }
+ }
+ if (_frame - _field90 == 2)
+ setFrame(_field90 + 3);
+ else if (_frame - _field90 == 4)
+ setFrame(_field90 + 5);
+ BF_GLOBALS._v4CECE[15 + _field90] = _frame;
+ BF_GLOBALS._v4CECE[_field90 + 15] = _frame;
+ if (_field90 == 0) {
+ if (_frame == 2)
+ BF_GLOBALS._v4CECE[13] = 2;
+ else
+ BF_GLOBALS._v4CECE[13] = 4;
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ }
+}
+
+void Scene910::BlackPlug::init(int x, int y, int arg8, int8 argA) {
+ NamedObject::postInit();
+ _field90 = arg8;
+ _field92 = argA;
+ setVisage(910);
+ if (_field90 == 0)
+ setStrip(7);
+ else
+ setStrip(3);
+ setFrame(argA);
+ fixPriority(251);
+ setPosition(Common::Point(x, y));
+ BF_GLOBALS._sceneItems.push_front(this);
+}
+
+void Scene910::BlackPlug::remove() {
+ BF_GLOBALS._sceneItems.remove(this);
+ SceneObject::remove();
+}
+
+void Scene910::GeneratorInset::postInit(SceneObjectList *OwnerList) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ FocusObject::postInit();
+ _resNum = 910;
+ _lookLineNum = 99;
+ _useLineNum = 87;
+ BF_GLOBALS._sceneItems.push_front(this);
+
+ scene->_field2DD8 = 16;
+ _blackPlug.init(142, 86, 1, BF_GLOBALS._v4CECE[16]);
+
+ scene->_field2DD8 = 17;
+ _powerButton.init(BF_GLOBALS._v4CECE[17]);
+}
+
+void Scene910::GeneratorInset::remove() {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 12;
+ BF_GLOBALS._player.animate(ANIM_MODE_6, scene);
+ _blackPlug.remove();
+ _powerButton.remove();
+ FocusObject::remove();
+}
+
+bool Scene910::PowerButton::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (_frame == 4) {
+ scene->_sound1.play(100);
+ scene->_sound1.holdAt(1);
+ if (!BF_GLOBALS.getFlag(77)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(77);
+ }
+ setFrame(5);
+ _object32.setFrame(7);
+ if (BF_GLOBALS._v4CECA == 2) {
+ if (BF_GLOBALS._v4CECE[14] == 2)
+ scene->subE83E1();
+ else
+ scene->subE82BD();
+ }
+ } else {
+ scene->_sound1.release();
+ if (BF_GLOBALS._bookmark == 21) {
+ if (!BF_GLOBALS.getFlag(82)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(82);
+ }
+ }
+ setFrame(4);
+ _object32.setFrame(6);
+ }
+ BF_GLOBALS._v4CECE[17] = (_frame + 252) % 256;
+ return true;
+ } else
+ return NamedObject::startAction(action, event);
+}
+
+void Scene910::PowerButton::remove() {
+ _object32.remove();
+ SceneObject::remove();
+}
+
+void Scene910::PowerButton::init(int frame) {
+ NamedObject::postInit();
+ setVisage(910);
+ setStrip(6);
+ setFrame(frame + 4);
+ setPosition(Common::Point(159, 83));
+ fixPriority(251);
+ _object32.postInit();
+ _object32.setVisage(910);
+ _object32.setStrip(6);
+ _object32.setFrame(6 + frame);
+ _object32.setPosition(Common::Point(166, 84));
+ _object32.fixPriority(251);
+ BF_GLOBALS._sceneItems.push_front(this);
+}
+
+bool Scene910::Generator::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (scene->_lyle._position.x == 115)
+ SceneItem::display(910, 62, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ else if (BF_GLOBALS._v4CEE2 == 1) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9118;
+ scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 9103;
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ scene->_sceneMode = 9123;
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ } else
+ scene->setAction(&scene->_sequenceManager1, scene, 9103, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene910::Item2::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action == 59) {
+ BF_GLOBALS._player.disableControl();
+ scene->_destPos = Common::Point(151, 186);
+ scene->_field2DDA = 5;
+ scene->_sceneMode = 9123;
+ if (BF_GLOBALS._player._visage == 1911)
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ else
+ scene->signal();
+ return true;
+ } else
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene910::Item3::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_TALK) && (BF_GLOBALS._v4CEE2 == 4) && (BF_GLOBALS._v4CEE4 == 0)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 15;
+ scene->_stripManager.start(9102, scene);
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+bool Scene910::Item9::startAction(CursorType action, Event &event) {
+ if (BF_GLOBALS._v4CEE0 == 0)
+ return NamedHotspot::startAction(action, event);
+ else
+ return false;
+}
+
+bool Scene910::Item15::startAction(CursorType action, Event &event) {
+ if (BF_GLOBALS._v4CEC8 == 0)
+ return false;
+
+ if ((action == CURSOR_LOOK) || (action == CURSOR_USE) || (action == CURSOR_TALK))
+ return NamedHotspot::startAction(action, event);
+
+ if (action >= CURSOR_WALK)
+ return false;
+
+ SceneItem::display(910, 2, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ return true;
+}
+
+bool Scene910::Item16::startAction(CursorType action, Event &event) {
+ Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((BF_GLOBALS._v4CEE0 == 0) || (BF_GLOBALS._v4CEE2 != 0))
+ return false;
+
+ if (BF_GLOBALS._player._visage == 1911) {
+ BF_GLOBALS._player.disableControl();
+ scene->_destPos = Common::Point(292, 100);
+ scene->_field2DDA = 0;
+ scene->_sceneMode = 9123;
+ scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
+ } else {
+ Common::Point pt(292, 100);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, NULL);
+ }
+
+ return true;
+}
+
+bool Scene910::Item17::startAction(CursorType action, Event &event) {
+ Common::Point pt(15, 159);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, NULL);
+
+ return true;
+}
+
+void Scene910::remove() {
+ PalettedScene::remove();
+}
+
+void Scene910::synchronize(Serializer &s) {
+ PalettedScene::synchronize(s);
+
+ s.syncAsSint16LE(_field2DDA);
+ s.syncAsSint16LE(_field2DD8);
+ s.syncAsSint16LE(_field2DE0);
+ s.syncAsSint16LE(_field2DE2);
+ s.syncAsSint16LE(_field2DE4);
+ s.syncAsSint16LE(_destPos.x);
+ s.syncAsSint16LE(_destPos.y);
+}
+
+void Scene910::postInit(SceneObjectList *OwnerList) {
+ uint32 unk_50E94 = 0, unk_50E90 = 0;
+ uint32 unk_50E98 = 0, unk_50E9C = 0;
+
+ PalettedScene::postInit(OwnerList);
+ loadScene(910);
+
+ BF_GLOBALS._sound1.changeSound(99);
+ BF_GLOBALS._v51C44 = 0;
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ _stripManager.addSpeaker(&_lyleHatSpeaker);
+ _stripManager.addSpeaker(&_fbiSpeaker);
+ _stripManager.addSpeaker(&_nicoSpeaker);
+ _stripManager.addSpeaker(&_daSpeaker);
+ BF_GLOBALS._player.postInit();
+
+ if (BF_GLOBALS._v4CEC8 == 0)
+ BF_GLOBALS._player.setVisage(129);
+ else
+ BF_GLOBALS._player.setVisage(911);
+
+ BF_GLOBALS._player.setPosition(Common::Point(330, 190));
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.disableControl();
+
+ _vent.postInit();
+ _vent.setVisage(910);
+ if ((BF_GLOBALS._v4CECE[3] == 2) && (BF_GLOBALS._v4CECE[4] == 2)) {
+ _action1.setActionIndex(4);
+ } else {
+ _vent.animate(ANIM_MODE_2, NULL);
+ _vent.setStrip(2);
+ }
+ _vent.setPosition(Common::Point(98, 34));
+ _vent.setAction(&_action1);
+
+ _breakerBox.postInit();
+ _breakerBox.setVisage(910);
+ _breakerBox.setStrip(5);
+ _breakerBox.setFrame(1);
+ _breakerBox.setPosition(Common::Point(91, 66));
+
+ _fakeWall.postInit();
+ _fakeWall.setVisage(910);
+ _fakeWall.setStrip(8);
+ _fakeWall.setFrame(4);
+ _fakeWall.fixPriority(48);
+
+ _yellowCord.init(1);
+ _yellowCord.setVisage(910);
+ _yellowCord.setStrip(6);
+ _yellowCord.setFrame(2);
+ _yellowCord.fixPriority(50);
+
+ _blackCord.init(2);
+ _blackCord.setVisage(910);
+ _blackCord.setStrip(6);
+ _blackCord.setFrame(1);
+ _blackCord.setPosition(Common::Point(114, 149));
+ _blackCord.fixPriority(246);
+
+ if (BF_GLOBALS._dayNumber < 5)
+ _item17.setDetails(Rect(0, 149, 29, 167), 910, -1, -1, -1, 1, NULL);
+
+ if (BF_GLOBALS._v4CEE2 == 0)
+ _item16.setDetails(Rect(265, 18, 319, 102), 910, -1, -1, -1, 1, NULL);
+
+ _breakerBox.setDetails(910, 6, -1, -1, 1, NULL);
+ _item15.setDetails(Rect(0, 0, 320, 170), 910, 0, 1, 2, 1, NULL);
+ _yellowCord.setDetails(910, 52, 53, -1, 1, NULL);
+ _blackCord.setDetails(910, 54, 55, -1, 1, NULL);
+ _item2.setDetails(3, 910, 22, -1, 24, 1);
+ _item4.setDetails(1, 910, 16, 17, 18, 1);
+ _item8.setDetails(4, 910, 25, 26, 27, 1);
+ _item6.setDetails(Rect(37, 58, 42, 67), 910, 34, 35, 36, 1, NULL);
+ _item7.setDetails(Rect(114, 53, 135, 87), 910, 37, 38, 39, 1, NULL);
+ _generator.setDetails(Rect(146, 67, 184, 93), 910, 40, 41, 42, 1, NULL);
+ _item9.setDetails(Rect(266, 39, 274, 70), 910, 43, 44, 45, 1, NULL);
+ _item10.setDetails(Rect(276, 27, 288, 83), 910, 46, 47, 48, 1, NULL);
+ _item11.setDetails(Rect(295, 42, 312, 87), 910, 49, 50, 51, 1, NULL);
+ _fakeWall.setDetails(910, 28, -1, 30, 1, NULL);
+ _item3.setDetails(7, 910, 59, 60, 61, 1);
+ _item5.setDetails(2, 910, 19, 20, 21, 1);
+ _backWall.setDetails(6, 910, 28, 29, 30, 1);
+ _item13.setDetails(5, 910, 31, 32, 33, 1);
+ _item14.setDetails(Rect(0, 0, 320, 170), 910, 3, 4, 5, 1, NULL);
+ if (BF_GLOBALS._dayNumber == 0) {
+ BF_GLOBALS._dayNumber = 5;
+ BF_GLOBALS._sceneManager._previousScene = 900;
+ BF_GLOBALS.setFlag(7);
+ }
+
+ if ( (BF_GLOBALS._sceneManager._previousScene == 910)
+ || (BF_GLOBALS._sceneManager._previousScene == 190)
+ || (BF_GLOBALS._sceneManager._previousScene == 300)) {
+ BF_GLOBALS._sceneManager._previousScene = 900;
+ BF_GLOBALS._v4CEE2 = 0;
+ BF_GLOBALS._v4CEE4 = 0;
+ }
+
+ _field2DE0 = 0;
+ _field2DE2 = 0;
+ _field2DE4 = 0;
+ BF_GLOBALS.clearFlag(34);
+ _lyle._position.x = 0;
+
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._sceneManager._previousScene == 900)){
+ BF_GLOBALS.setFlag(34);
+ BF_GLOBALS._v4CEC8 = 0;
+ BF_GLOBALS._player.setVisage(129);
+
+ _lyle.postInit();
+ _lyle.setVisage(811);
+ _lyle.setPosition(Common::Point(-52, 217));
+ _lyle.animate(ANIM_MODE_1, NULL);
+ _lyle.setObjectWrapper(new SceneObjectWrapper());
+ _lyle._field90 = 0;
+ _lyle.setDetails(910, 69, 70, 71, 5, &_item4);
+
+ BF_GLOBALS._v4CECE[0] = 3;
+ BF_GLOBALS._v4CECE[12] = 2;
+ BF_GLOBALS._v4CECE[13] = 4;
+ BF_GLOBALS._v4CECE[14] = 3;
+ BF_GLOBALS._v4CECE[15] = 3;
+ BF_GLOBALS._v4CECE[16] = 4;
+ BF_GLOBALS._v4CECE[17] = 1;
+ BF_GLOBALS._v4CECA = 2;
+ BF_GLOBALS._v4CEE0 = 1;
+ _yellowCord.setPosition(Common::Point(291, -30));
+ BF_GLOBALS._v4CECC = 0;
+ }
+
+ if (BF_GLOBALS._sceneManager._previousScene == 920) {
+ BF_GLOBALS.setFlag(34);
+ BF_GLOBALS._player.setPosition(Common::Point(276, 119));
+ BF_GLOBALS._player.setStrip(6);
+ if (BF_GLOBALS._v4CECC == 0)
+ _yellowCord.setPosition(Common::Point(291, -30));
+
+ if (BF_GLOBALS._dayNumber == 5) {
+ _nico.postInit();
+ _nico.setVisage(914);
+ _nico.setStrip(5);
+ _nico.setFrame(8);
+ _nico.setPosition(Common::Point(263, 120));
+ _nico.setDetails(910, 63, 64, 65, 5, &_item4);
+
+ _stuart.postInit();
+ _stuart.setVisage(918);
+ _stuart.setStrip(4);
+ _stuart.setFrame(1);
+ _stuart.setPosition(Common::Point(291, 127));
+ _stuart.setDetails(910, 66, 67, 68, 5, &_nico);
+
+ _lyle.postInit();
+ _lyle.setVisage(916);
+ _lyle.setPosition(Common::Point(155, 113));
+ _lyle.setStrip(3);
+ _lyle.setFrame(3);
+ _lyle._field90 = 1;
+ _lyle.setDetails(910, 69, 70, 71, 5, &_item4);
+ }
+ BF_GLOBALS._player.enableControl();
+ } else if (BF_GLOBALS._sceneManager._previousScene == 935) {
+ BF_GLOBALS.setFlag(34);
+ BF_GLOBALS._v4CEC8 = 0;
+ _lyle.postInit();
+ _lyle.setVisage(916);
+ _lyle.setPosition(Common::Point(155, 113));
+ _lyle.setStrip(3);
+ _lyle.setFrame(3);
+ _lyle._field90 = 1;
+ _lyle.setDetails(910, 69, 70 ,71 , 5, &_item4);
+
+ BF_GLOBALS._walkRegions.proc1(15);
+ BF_GLOBALS._walkRegions.proc1(16);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.proc1(10);
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS._player.setVisage(1911);
+ BF_GLOBALS._player.animate(ANIM_MODE_NONE, 0, NULL);
+ BF_GLOBALS._player.setFrame(7);
+ }
+ BF_GLOBALS._player.setPosition(Common::Point(174, 157));
+ BF_GLOBALS._player._strip = 7;
+ _nico.postInit();
+ _nico.setVisage(913);
+ _nico.setPosition(Common::Point(262, 124));
+ _nico.setStrip(6);
+ BF_GLOBALS._v4CEE6 = 0;
+ BF_GLOBALS._v4CEE2 = 1;
+ _nico.setDetails(910, 63, 64, 67, 5, &_item4);
+ BF_GLOBALS._v4CECA = 2;
+ if (BF_GLOBALS._v4CECC == 0)
+ _yellowCord.setPosition(Common::Point(291, -30));
+ _sceneMode = 11;
+ if (BF_GLOBALS._v4CEC8 == 0)
+ add2Faders((const byte *)&unk_50E94, 2, 913, this);
+ else
+ add2Faders((const byte *)&unk_50E90, 2, 911, this);
+ } else {
+ BF_GLOBALS.clearFlag(8);
+ BF_GLOBALS._player.disableControl();
+ }
+
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)){
+ _object7.postInit();
+ _object7.setAction(&_action2);
+ }
+
+ if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 1)
+ _yellowCord.setPosition(Common::Point(540, 100));
+
+ if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 1)
+ _blackCord.setPosition(Common::Point(540, 100));
+
+ if (BF_GLOBALS._v4CECC == 2) {
+ _yellowCord.setStrip(4);
+ _yellowCord.setFrame(2);
+ _yellowCord.setPosition(Common::Point(135, 93));
+ _yellowCord.setPriority(50);
+ _yellowCord._field90 = 1;
+
+ _breakerBox.setFrame(3);
+ }
+
+ if (BF_GLOBALS._v4CECA == 2) {
+ _blackCord.setStrip(4);
+ _blackCord.setFrame(1);
+ _blackCord.setPosition(Common::Point(135, 93));
+ _blackCord.fixPriority(50);
+ _blackCord._field90 = 1;
+
+ _breakerBox.setFrame(3);
+ }
+
+ _object5.postInit();
+ _object5.setVisage(919);
+ _object5.setStrip(5);
+ _object5.setPosition(Common::Point(286, 129));
+ _object5.fixPriority(1);
+
+ if (BF_GLOBALS._v4CEC8 == 0)
+ _object5.hide();
+
+ if (BF_GLOBALS._v4CEE0 == 0) {
+ _object5.setFrame(1);
+ _fakeWall.setPosition(Common::Point(292, 107));
+ if (BF_GLOBALS._v4CECC != 2)
+ _yellowCord.setPosition(Common::Point(288, 57));
+ BF_GLOBALS._walkRegions.proc1(10);
+ } else {
+ _object5.setFrame(6);
+ _fakeWall.setPosition(Common::Point(295, 20));
+ _fakeWall.hide();
+ if (BF_GLOBALS._v4CECC != 2)
+ _yellowCord.setPosition(Common::Point(291, -30));
+ BF_GLOBALS._walkRegions.proc1(10);
+ }
+
+ if (BF_GLOBALS._v4CECE[17] != 0) {
+ _sound1.play(100);
+ _sound1.holdAt(1);
+ }
+
+ if (BF_GLOBALS._sceneManager._previousScene != 935) {
+ _sceneMode = 11;
+ if (BF_GLOBALS._v4CEC8 == 0)
+ add2Faders((const byte *)&unk_50E9C, 10, 910, this);
+ else
+ add2Faders((const byte *)&unk_50E98, 10, 911, this);
+ }
+}
+
+void Scene910::signal() {
+ static uint32 black = 0;
+
+ switch (_sceneMode) {
+ case 2:
+ _sceneMode = 3;
+ _timer1.set(60, this);
+ break;
+ case 3:
+ _sceneMode = 4;
+ transition((const byte *)&black, 35, 910, this, 0, 111, 112, 255, false);
+ break;
+ case 4:
+ _sceneMode = 5;
+ _timer1.set(30, this);
+ break;
+ case 5:
+ _sceneMode = 6;
+ transition((const byte *)&black, 40, 910, this, 0, 111, 112, 255, false);
+ break;
+ case 6:
+ _sceneMode = 7;
+ _timer1.set(60, this);
+ break;
+ case 7:
+ BF_GLOBALS._player.setVisage(129);
+ _lyle.setVisage(811);
+ _object5.hide();
+ _sceneMode = 8;
+ transition((const byte *)&black, 95, 910, this, 0, 111, 112, 255, false);
+ break;
+ case 8:
+ _sceneMode = 9;
+ _timer1.set(30, this);
+ break;
+ case 9:
+ _sceneMode = 0;
+ transition((const byte *)&black, 100, 910, this, 0, 111, 112, 255, false);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 10:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._v51C44 = 0;
+ BF_GLOBALS._sceneManager.changeScene(935);
+ break;
+ case 11:
+ if (BF_GLOBALS._sceneManager._previousScene == 900) {
+ if (BF_GLOBALS._v4CEC8 != 0)
+ transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, false);
+ if (BF_GLOBALS.getFlag(fWithLyle)) {
+ NpcMover *mover = new NpcMover();
+ Common::Point destPos(22, 157);
+ _lyle.addMover(mover, &destPos, NULL);
+ }
+
+ _sceneMode = 9100;
+ setAction(&_sequenceManager1, this, 9100, &BF_GLOBALS._player, NULL);
+ } else if (BF_GLOBALS._sceneManager._previousScene == 935) {
+ _sceneMode = 9146;
+ _stripManager.start(9103, this);
+ }
+ break;
+ case 12:
+ BF_GLOBALS._player.setVisage(129);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setStrip(7);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 13:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9117, &_nico, NULL);
+ BF_GLOBALS._v4CEE2 = 2;
+ // No break on purpose
+ case 15:
+ _stuart.postInit();
+ _stuart.setDetails(910, 66, 67, 68, 5, &_nico);
+ BF_GLOBALS._v4CEE8 = 0;
+ _sceneMode = 9121;
+ setAction(&_sequenceManager1, this, 9121, &_stuart, NULL);
+ break;
+ case 14:
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(940);
+ break;
+ case 16:
+ _lyle._field90 = 1;
+ _sceneMode = 10;
+ addFader((const byte *)&black, 2, this);
+ BF_GLOBALS._v4CEE2 = 1;
+ BF_GLOBALS._walkRegions.proc1(16);
+ BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._sceneItems.remove(&_item16);
+ break;
+ case 17:
+ BF_GLOBALS._player._strip = 7;
+ BF_GLOBALS._player._frame = 1;
+ if (_field2DE2 == 0) {
+ _field2DE2 = 1;
+ if (BF_GLOBALS._v4CEE2 == 4) {
+ _sceneMode = 9149;
+ setAction(&_sequenceManager1, this, 9149, &BF_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 9141;
+ setAction(&_sequenceManager1, this, 9141, &BF_GLOBALS._player, &_nico, NULL);
+ }
+ } else {
+ SceneItem::display(910, 91, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 18:
+ BF_GLOBALS._player._strip = 7;
+ BF_GLOBALS._player._frame = 1;
+ if (BF_GLOBALS._v4CEE4 == 3) {
+ if (_field2DE4 == 0) {
+ _field2DE4 = 1;
+ _sceneMode = 9142;
+ setAction(&_sequenceManager1, this, 9142, &BF_GLOBALS._player, &_stuart, NULL);
+ } else {
+ SceneItem::display(910, 92, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ BF_GLOBALS._player.enableControl();
+ }
+ } else {
+ SceneItem::display(910, 94, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 19:
+ BF_GLOBALS._deathReason = 14;
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 20:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9100:
+ if (BF_GLOBALS._dayNumber == 5)
+ BF_GLOBALS._walkRegions.proc1(1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9101:
+ if ((BF_GLOBALS._v4CEE0 == 0) && (BF_GLOBALS._v4CEC8 != 0) && (BF_GLOBALS._v4CECE[17] == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910) && (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 910))
+ BF_GLOBALS.clearFlag(fGotPointsForSearchingDA);
+ else
+ BF_GLOBALS.setFlag(fGotPointsForSearchingDA);
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(900);
+ break;
+ case 9102:
+ if ((BF_GLOBALS._v4CECE[13] < 4) && (_breakerBox._frame == 1))
+ _breakerBox.animate(ANIM_MODE_5, NULL);
+
+ BF_GLOBALS._player.enableControl();
+ _breakerBoxInset.postInit();
+ _breakerBoxInset.setVisage(910);
+ _breakerBoxInset.setStrip(3);
+ _breakerBoxInset.setFrame(1);
+ _breakerBoxInset.setPosition(Common::Point(160, 130));
+ _breakerBoxInset.fixPriority(250);
+ break;
+ case 9103:
+ BF_GLOBALS._player.enableControl();
+ _generatorInset.postInit();
+ _generatorInset.setVisage(910);
+ _generatorInset.setStrip(3);
+ _generatorInset.setFrame(2);
+ _generatorInset.setPosition(Common::Point(160, 130));
+ _generatorInset.fixPriority(250);
+ break;
+ case 9110:
+ if (!BF_GLOBALS.getFlag(fGotPointsForCrate)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForCrate);
+ }
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1);
+ _blackCord.setPosition(Common::Point(540, 100));
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9111:
+ if ((BF_GLOBALS._bookmark == bEndDayThree) && (!BF_GLOBALS.getFlag(fGotPointsForGeneratorOff))) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForGeneratorOff);
+ }
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 910);
+ _blackCord.setStrip(6);
+ _blackCord.setFrame(1);
+ _blackCord.setPosition(Common::Point(114, 149));
+ _blackCord.fixPriority(249);
+ BF_GLOBALS._v4CECA = 0;
+ _blackCord._field90 = 0;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9112:
+ BF_GLOBALS._player._strip = 4;
+ BF_GLOBALS._player._frame = 1;
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1);
+ _yellowCord.setPosition(Common::Point(540, 100));
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9113:
+ BF_GLOBALS._player._strip = 4;
+ BF_GLOBALS._player._frame = 1;
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 910);
+ _yellowCord.setStrip(6);
+ _yellowCord.setFrame(2);
+ _yellowCord.setPosition(Common::Point(_fakeWall._position.x - 4, _fakeWall._position.y - 50));
+ _yellowCord.fixPriority(50);
+ BF_GLOBALS._v4CECC = 0;
+ _yellowCord._field90 = 0;
+ _yellowCord.show();
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9114:
+ _fakeWall.hide();
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) {
+ BF_GLOBALS._player.disableControl();
+ _nico.postInit();
+ _nico.setDetails(910, 63, 64, 65, 5, &_item4);
+ BF_GLOBALS._v4CEE6 = 0;
+ _object7.postInit();
+ _action2.remove();
+ _sceneMode = 9116;
+ setAction(&_sequenceManager1, this, 9116, &_nico, NULL);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 9115:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9116:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 16;
+ _stripManager.start(9119, this);
+ break;
+ case 9118:
+ // No break on purpose
+ case 9137:
+ BF_GLOBALS._deathReason = 16;
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 9119:
+ if (!BF_GLOBALS.getFlag(fGotPointsForCordOnForklift)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForCordOnForklift);
+ }
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0);
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9120:
+ BF_GLOBALS._walkRegions.proc1(7);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9121:
+ _item3.setDetails(7, 910, 96, 60, 61, 3);
+ BF_GLOBALS._v4CEE4 = 2;
+ if (BF_GLOBALS._v4CEE2 == 4) {
+ _sceneMode = 20;
+ _stripManager.start(9115, this);
+ } else {
+ BF_GLOBALS._player.enableControl();
+ }
+ break;
+ case 9123:
+ BF_GLOBALS.clearFlag(gunDrawn);
+ switch (_field2DDA - 1) {
+ case 0:
+ _sceneMode = 9102;
+ setAction(&_sequenceManager1, this, 9102, &BF_GLOBALS._player, NULL);
+ break;
+ case 1:
+ _sceneMode = 9103;
+ setAction(&_sequenceManager1, this, 9103, &BF_GLOBALS._player, NULL);
+ break;
+ case 2:
+ _sceneMode = 9143;
+ setAction(&_sequenceManager1, this, 9143, &BF_GLOBALS._player, NULL);
+ break;
+ case 3:
+ _sceneMode = 9110;
+ setAction(&_sequenceManager1, this, 9110, &BF_GLOBALS._player, &_blackCord, NULL);
+ break;
+ case 4:
+ _sceneMode = 9111;
+ setAction(&_sequenceManager1, this, 9111, &BF_GLOBALS._player, &_blackCord, NULL);
+ break;
+ case 5:
+ switch (BF_GLOBALS._v4CEE2 - 1) {
+ case 0:
+ _sceneMode = 9118;
+ setAction(&_sequenceManager1, this, 9118, &BF_GLOBALS._player, &_nico, NULL);
+ break;
+ case 1:
+ _sceneMode = 9148;
+ setAction(&_sequenceManager1, this, 9148, &BF_GLOBALS._player, &_nico, NULL);
+ break;
+ case 2:
+ // No break on purpose
+ case 3: {
+ _sceneMode = 17;
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(232, 138);
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ }
+ default:
+ break;
+ }
+ break;
+ case 6: {
+ _sceneMode = 18;
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(248, 137);
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 7: {
+ _sceneMode = 9112;
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(285, 114);
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 8: {
+ _sceneMode = 9113;
+ PlayerMover *mover = new PlayerMover();
+ Common::Point destPos(285, 114);
+ BF_GLOBALS._player.addMover(mover, &destPos, this);
+ break;
+ }
+ case 9:
+ _sceneMode = 9119;
+ setAction(&_sequenceManager1, this, 9119, &BF_GLOBALS._player, &_nico, &_yellowCord, NULL);
+ break;
+ case 10:
+ _yellowCord.fixPriority(127);
+ if (_yellowCord._position.x != 267)
+ _yellowCord.hide();
+ _sceneMode = 9136;
+ setAction(&_sequenceManager1, this, 9136, &BF_GLOBALS._player, &_stuart, &_yellowCord, NULL);
+ BF_GLOBALS._v4CEE4 = 3;
+ break;
+ case 11:
+ _sceneMode = 9137;
+ setAction(&_sequenceManager1, this, 9137, &BF_GLOBALS._player, &_nico, NULL);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &_destPos, NULL);
+ break;
+ }
+ break;
+ case 9124:
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS.setFlag(gunDrawn);
+ break;
+ case 9125:
+ BF_GLOBALS.setFlag(fBackupAt340);
+ BF_GLOBALS._v4CEE2 = 4;
+ _stuart.postInit();
+ _nico.setDetails(910, 72, 73, 74, 3, NULL);
+ _stuart.setDetails(910, 66, 67, 68, 5, &_nico);
+ BF_GLOBALS._v4CEE8 = 0;
+ _sceneMode = 9121;
+ setAction(&_sequenceManager1, this, 9121, &_stuart, NULL);
+ break;
+ case 9126:
+ _sceneMode = 19;
+ if (BF_GLOBALS._v4CEE4 == 0)
+ signal();
+ else
+ _stripManager.start(9115, this);
+ break;
+ case 9129:
+ // No break on purpose
+ case 9134:
+ BF_GLOBALS._deathReason = 17;
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 9130:
+ _lyle.setAction(&_sequenceManager2, NULL, 9133, &_lyle, NULL);
+ BF_GLOBALS._v4CECE[14] = 3;
+ subE82BD();
+ BF_GLOBALS._walkRegions.proc1(15);
+ break;
+ case 9132:
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._v4CEE4 = 4;
+ BF_GLOBALS._deathReason = 13;
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 9135:
+ BF_GLOBALS._deathReason = 15;
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 9136:
+ if (!BF_GLOBALS.getFlag(fGotPointsForCuffingNico)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForCuffingNico);
+ }
+ _lyle.setAction(&_sequenceManager2, NULL, 9131, &_lyle, NULL);
+ BF_GLOBALS._walkRegions.proc2(16);
+ if (BF_GLOBALS._v4CEE2 == 4)
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0);
+ else
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910);
+ _forbes.postInit();
+ _forbes.setDetails(910, 86, 87, 88, 4, &_item8);
+ _sceneMode = 9139;
+ setAction(&_sequenceManager1, this, 9139, &_forbes, &BF_GLOBALS._player, NULL);
+ break;
+ case 9139:
+ BF_GLOBALS._walkRegions.proc1(4);
+ _field2DE0 = 1;
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9140:
+ _sceneMode = 14;
+ addFader((const byte *)&black, 2, this);
+ break;
+ case 9141:
+ BF_INVENTORY.setObjectScene(INV_22_SNUB, 1);
+ if (!BF_GLOBALS.getFlag(fGotPointsForCuffingDA)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForCuffingDA);
+ }
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9142:
+ BF_GLOBALS._player.enableControl();
+ if (!BF_GLOBALS.getFlag(fGotPointsForSearchingNico)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForSearchingNico);
+ }
+ break;
+ case 9143:
+ if (BF_GLOBALS._v4CEE2 == 0) {
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(920);
+ } else {
+ SceneItem::display(910, 89, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ _sceneMode = 9144;
+ setAction(&_sequenceManager1, this, 9144, &BF_GLOBALS._player, NULL);
+ }
+ break;
+ case 9144:
+ // No break on purpose
+ case 9146:
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9148:
+ BF_GLOBALS._deathReason = 23;
+ BF_GLOBALS._v51C44 = 1;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ break;
+ case 9149:
+ SceneItem::display(910, 74, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ BF_INVENTORY.setObjectScene(INV_22_SNUB, 1);
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player.setVisage(129);
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player._strip = 7;
+ BF_GLOBALS._player._frame = 1;
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene910::process(Event &event) {
+ SceneExt::process(event);
+ if ((!BF_GLOBALS._player._enabled) || (event.mousePos.y >= 167))
+ return;
+
+ if (!_focusObject) {
+ if (_item17._bounds.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+ BF_GLOBALS._events.setCursor(surface);
+ } else if ((BF_GLOBALS._v4CEE0 == 0) || (BF_GLOBALS._v4CEE2 != 0)) {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ } else if (!_item16._bounds.contains(event.mousePos)) {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ } else {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW);
+ BF_GLOBALS._events.setCursor(surface);
+ }
+ }
+
+ if (event.eventType != EVENT_BUTTON_DOWN)
+ return;
+
+ switch (BF_GLOBALS._events.getCursor()) {
+ case INV_COLT45:
+ if (!BF_GLOBALS._player._bounds.contains(event.mousePos))
+ break;
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ BF_GLOBALS._player.disableControl();
+ _destPos = BF_GLOBALS._player._position;
+ _sceneMode = 9123;
+ setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL);
+ event.handled = true;
+ } else if (BF_GLOBALS._v4CEE2 <= 1) {
+ if (BF_GLOBALS.getFlag(fCanDrawGun)) {
+ BF_GLOBALS._player.addMover(NULL);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9124;
+ setAction(&_sequenceManager1, this, 9124, &BF_GLOBALS._player, NULL);
+ } else
+ SceneItem::display(1, 4, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ } else
+ SceneItem::display(910, 81, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ event.handled = true;
+ break;
+ case CURSOR_WALK:
+ if (BF_GLOBALS._v4CEE2 == 1) {
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._player._visage == 1911) {
+ BF_GLOBALS._player.disableControl();
+ _destPos = event.mousePos;
+ _field2DDA = 0;
+ _sceneMode = 9123;
+ setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 9118;
+ setAction(&_sequenceManager1, this, 9118, &BF_GLOBALS._player, &_nico, NULL);
+ event.handled = true;
+ }
+ } else if (BF_GLOBALS._player._visage == 1911) {
+ BF_GLOBALS._player.disableControl();
+ _destPos = event.mousePos;
+ _field2DDA = 0;
+ _sceneMode = 9123;
+ setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL);
+ }
+ default:
+ break;
+ }
+}
+
+void Scene910::dispatch() {
+ SceneExt::dispatch();
+ if (_action)
+ return;
+
+ if ((_sceneMode != 14) && (BF_GLOBALS._player._position.x < 30) && (BF_GLOBALS._player._position.y > 148)) {
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._dayNumber != 5) {
+ _sceneMode = 9101;
+ setAction(&_sequenceManager1, this, 9101, &BF_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 9146;
+ if (BF_GLOBALS._v4CEE0 == 0)
+ setAction(&_sequenceManager1, this, 9146, &BF_GLOBALS._player, NULL);
+ else
+ setAction(&_sequenceManager1, this, 9145, &BF_GLOBALS._player, NULL);
+ }
+ }
+
+ if ((BF_GLOBALS._player._position.x > 265) && (BF_GLOBALS._player._position.y < 102) && (BF_GLOBALS._v4CEE0 != 0) && (_sceneMode != 9143)) {
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(gunDrawn)) {
+ _field2DDA = 3;
+ _sceneMode = 9123;
+ setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL);
+ } else if (BF_GLOBALS._v4CEE2 == 0) {
+ _sceneMode = 9143;
+ setAction(&_sequenceManager1, this, 9143, &BF_GLOBALS._player, NULL);
+ } else {
+ SceneItem::display(910, 98, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ _sceneMode = 9144;
+ setAction(&_sequenceManager1, this, 9144, &BF_GLOBALS._player, NULL);
+ }
+ }
+
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._player._position.x > 250) && (_sceneMode != 9135) && (_sceneMode != 11) && (BF_GLOBALS._v4CEE0 != 0) && (BF_GLOBALS._v4CEE2 == 0)) {
+ BF_GLOBALS._player.disableControl();
+ _object7.remove();
+ _nico.remove();
+ _nico.postInit();
+ _nico.setDetails(910, 63, 64, 65, 5, &_item4);
+ _sceneMode = 9135;
+ setAction(&_sequenceManager1, this, 9135, &BF_GLOBALS._player, &_nico, NULL);
+ }
+
+}
+
+void Scene910::checkGun() {
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0) && (BF_GLOBALS._v4CEE0 != 0))
+ SceneItem::display(910, 70, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ else
+ SceneExt::checkGun();
+}
+
+void Scene910::subE82BD() {
+ if (BF_GLOBALS._v4CEE0 != 0)
+ return;
+
+ if (! BF_GLOBALS.getFlag(fGotPointsForLightsOn)) {
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_GLOBALS.setFlag(fGotPointsForLightsOn);
+ }
+ BF_GLOBALS._v4CEE0 = 1;
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._walkRegions.proc2(10);
+ _sceneMode = 9114;
+ _sound2.play(42);
+ if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910))
+ setAction(&_sequenceManager1, this, 9127, &_fakeWall, &_yellowCord, &_object5, NULL);
+ else
+ setAction(&_sequenceManager1, this, 9114, &_fakeWall, &_object5, NULL);
+}
+
+void Scene910::subE83E1() {
+ if (BF_GLOBALS._v4CEE0 != 0) {
+ _fakeWall.show();
+ if ((BF_GLOBALS._bookmark == 21) && (!BF_GLOBALS.getFlag(80))) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(80);
+ }
+ BF_GLOBALS._v4CEE0 = 0;
+ BF_GLOBALS._walkRegions.proc1(10);
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9115;
+ _sound2.play(42);
+ if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(57) == 910))
+ setAction(&_sequenceManager1, this, 9128, &_fakeWall, &_yellowCord, &_object5, NULL);
+ else
+ setAction(&_sequenceManager1, this, 9115, &_fakeWall, &_object5, NULL);
+ }
+
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) {
+ // _objectList.draw();
+ if (BF_GLOBALS._sceneObjects->contains(&_breakerBoxInset))
+ _breakerBoxInset.remove();
+ if (BF_GLOBALS._sceneObjects->contains(&_generatorInset))
+ _generatorInset.remove();
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9120;
+ BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9120, &BF_GLOBALS._player, &_lyle, NULL);
+ BF_GLOBALS._walkRegions.proc2(1);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 920 - Inside Warehouse: Secret Room
+ *
+ *--------------------------------------------------------------------------*/
+// Crate
+bool Scene920::Item1::startAction(CursorType action, Event &event) {
+ Scene920 *scene = (Scene920 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if ((BF_GLOBALS.getFlag(fCrateOpen)) && (BF_GLOBALS._player._visage == 921)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_crateWindow.postInit();
+ scene->_sceneMode = 9204;
+ if (!BF_GLOBALS.getFlag(fGotPointsForBoots)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(fGotPointsForBoots);
+ }
+ scene->setAction(&scene->_sequenceManager1, scene, 9204, &BF_GLOBALS._player, &scene->_crateWindow, NULL);
+ return true;
+ } else
+ return NamedHotspot::startAction(action, event);
+ break;
+ case CURSOR_USE:
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS.getFlag(fCrateOpen)) {
+ if (BF_GLOBALS._player._visage == 921) {
+ if ((BF_INVENTORY.getObjectScene(15) != 1) && (BF_GLOBALS.getFlag(fSawGuns))) {
+ scene->_sceneMode = 9207;
+ scene->setAction(&scene->_sequenceManager1, scene, 9207, &BF_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 9203;
+ scene->setAction(&scene->_sequenceManager1, scene, 9203, &BF_GLOBALS._player, &scene->_crateTop, NULL);
+ BF_GLOBALS.clearFlag(fCrateOpen);
+ }
+ } else {
+ scene->_sceneMode = 9205;
+ scene->setAction(&scene->_sequenceManager1, scene, 9205, &BF_GLOBALS._player, NULL);
+ }
+ } else {
+ scene->_sceneMode = 9202;
+ scene->setAction(&scene->_sequenceManager1, scene, 9202, &BF_GLOBALS._player, &scene->_crateTop, NULL);
+ BF_GLOBALS.setFlag(fCrateOpen);
+ }
+ return true;
+ break;
+ default:
+ return NamedHotspot::startAction(action, event);
+ break;
+ }
+}
+
+// North Exit
+bool Scene920::Item8::startAction(CursorType action, Event &event) {
+ Scene920 *scene = (Scene920 *)BF_GLOBALS._sceneManager._scene;
+
+ BF_GLOBALS._player.disableControl();
+ if (BF_GLOBALS._player._visage == 921) {
+ scene->_sceneMode = 10;
+ scene->setAction(&scene->_sequenceManager1, scene, 9206, &BF_GLOBALS._player, NULL);
+ // TO BE CHECKED: Original code uses a variable to store the address of scene instance.
+ // As it's used later a coordinates to create a playermover, I don't understand.
+ // On the other hand, it's not really important as just after the hero leaves the scene
+ // so the variable is no longer used.
+ // scene->_oldCoord = &scene;
+ _field10 = 1;
+ } else {
+ scene->_sceneMode = 9201;
+ scene->setAction(&scene->_sequenceManager1, scene, 9201, &BF_GLOBALS._player, NULL);
+ }
+ return true;
+}
+
+void Scene920::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(920);
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_jakeJacketSpeaker);
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 4;
+ BF_GLOBALS._player.postInit();
+ if (BF_GLOBALS._v4CEC8 != 0) {
+ _doorway.postInit();
+ _doorway.setVisage(922);
+ _doorway.setStrip(2);
+ _doorway.fixPriority(1);
+ _doorway.setPosition(Common::Point(145, 82));
+ }
+
+ _crateTop.postInit();
+ _crateTop.setVisage(922);
+ if (BF_GLOBALS.getFlag(fCrateOpen)) {
+ _crateTop.setStrip(3);
+ _crateTop.setFrame(5);
+ }
+
+ _crateTop.setPosition(Common::Point(158, 107));
+ _crateTop.fixPriority(130);
+
+ _exitN.setDetails(Rect(116, 12, 165, 81), 920, -1, -1, -1, 1, NULL);
+ _item6.setDetails(6, 920, 15, 16, 17, 1);
+ _item4.setDetails(5, 920, 12, 13, 14, 1);
+ _item7.setDetails(4, 920, 9, 10, 11, 1);
+ _item5.setDetails(3, 920, 6, 7, 8, 1);
+ _crate.setDetails(2, 920, 3, 4, 5, 1);
+ _item3.setDetails(1, 920, 3, 4, 5, 1);
+ _item2.setDetails(Rect(0, 0, 320, 200), 920, 0, 1, 2, 1, NULL);
+
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9200;
+ setAction(&_sequenceManager1, this, 9200, &BF_GLOBALS._player, NULL);
+}
+
+void Scene920::signal() {
+ switch (_sceneMode) {
+ case 10:
+ _sceneMode = 9201;
+ setAction(&_sequenceManager1, this, 9201, &BF_GLOBALS._player, NULL);
+ break;
+ case 9201:
+ if (BF_GLOBALS.getFlag(fCrateOpen))
+ BF_GLOBALS.setFlag(fLeftTraceIn920);
+ else
+ BF_GLOBALS.clearFlag(fLeftTraceIn920);
+ BF_GLOBALS._sceneManager.changeScene(910);
+ break;
+ case 9204:
+ _crateWindow.remove();
+ BF_GLOBALS.setFlag(fSawGuns);
+ BF_GLOBALS._player.enableControl();
+ break;
+ case 9206: {
+ BF_GLOBALS._player.enableControl();
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &_oldCoord, NULL);
+ break;
+ }
+ case 9207:
+ BF_GLOBALS._player.enableControl();
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(15, 1);
+ BF_GLOBALS._bookmark = bEndDayThree;
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+void Scene920::process(Event &event) {
+ SceneExt::process(event);
+ if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
+ if (_exitN.contains(event.mousePos)) {
+ GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N);
+ BF_GLOBALS._events.setCursor(surface);
+ } else {
+ CursorType cursorId = BF_GLOBALS._events.getCursor();
+ BF_GLOBALS._events.setCursor(cursorId);
+ }
+ }
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && (BF_GLOBALS._player._visage == 921)) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9206;
+ setAction(&_sequenceManager1, this, 9206, &BF_GLOBALS._player, NULL);
+ _oldCoord = event.mousePos;
+ event.handled = true;
+ }
+}
+
+void Scene920::dispatch() {
+ SceneExt::dispatch();
+ if ((_action == 0) && (BF_GLOBALS._player._position.y < 75)) {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._sceneManager.changeScene(910);
+ }
+}
+
+void Scene920::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_oldCoord.x);
+ s.syncAsSint16LE(_oldCoord.y);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 930 - Inside the caravan
+ *
+ *--------------------------------------------------------------------------*/
+/* Objects */
+bool Scene930::Object1::startAction(CursorType action, Event &event) {
+// Small box
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+ bool result;
+
+ if ((action == CURSOR_USE) && (!BF_GLOBALS.getFlag(93))) {
+ scene->setAction(&scene->_action2);
+ result = true;
+ } else
+ result = NamedObject::startAction(action, event);
+
+ return result;
+}
+
+bool Scene930::Object2::startAction(CursorType action, Event &event) {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return NamedObject::startAction(action, event);
+
+ NamedObject::startAction(action, event);
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(54, 1);
+ BF_GLOBALS.setFlag(93);
+ remove();
+ scene->_box.remove();
+ return true;
+}
+
+bool Scene930::Object3::startAction(CursorType action, Event &event) {
+// Boots
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return NamedObject::startAction(action, event);
+
+ if (scene->_v141C == 0)
+ scene->setAction(&scene->_action1);
+ return true;
+}
+
+bool Scene930::Object4::startAction(CursorType action, Event &event) {
+// Boot window
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_WALK:
+ return true;
+ case CURSOR_LOOK:
+ if (BF_GLOBALS._bookmark >= bFlashBackTwo) {
+ _lookLineNum = 94;
+ return NamedObject::startAction(action, event);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ NamedObject::startAction(action, event);
+ BF_GLOBALS._bookmark = bFlashBackTwo;
+ scene->_sceneMode = 2;
+ scene->signal();
+ return true;
+ }
+ break;
+ case CURSOR_USE:
+ if (BF_GLOBALS._bookmark >= bFlashBackTwo) {
+ _lookLineNum = 71;
+ NamedObject::startAction(action, event);
+ scene->subF3D6F();
+ remove();
+ } else
+ NamedObject::startAction(action, event);
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+void Scene930::Object4::remove() {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ if (scene->_v141C && !BF_GLOBALS._sceneObjects->contains(&scene->_object5)) {
+ scene->_boots.setAction(&scene->_action3);
+ }
+
+ FocusObject::remove();
+}
+
+bool Scene930::Object5::startAction(CursorType action, Event &event) {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_WALK:
+ return true;
+ case CURSOR_USE:
+ if (BF_INVENTORY.getObjectScene(55) == 1)
+ return NamedObject::startAction(action, event);
+ if (scene->_v141A == 0) {
+ animate(ANIM_MODE_4, getFrameCount() - 1, 1, NULL);
+ scene->_v141A = 1;
+ _lookLineNum = 76;
+ _useLineNum = 78;
+ } else {
+ T2_GLOBALS._uiElements.addScore(50);
+ BF_INVENTORY.setObjectScene(55, 1);
+ setFrame2(getFrameCount());
+ _lookLineNum = 92;
+ _useLineNum = -1;
+ }
+ return true;
+ default:
+ return NamedObject::startAction(action, event);
+ break;
+ }
+}
+
+void Scene930::Object5::remove() {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+ scene->_boots.setAction(&scene->_action3);
+
+ FocusObject::remove();
+}
+
+/* Items */
+bool Scene930::Item1::startAction(CursorType action, Event &event) {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_WALK) || (action == CURSOR_USE)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager1, scene, 9301, &BF_GLOBALS._player, NULL);
+ return true;
+ } else
+ return NamedHotspot::startAction(action, event);
+}
+
+/* Actions */
+void Scene930::Action1::signal() {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ BF_GLOBALS._player.disableControl();
+ scene->_v141C = 1;
+ break;
+ case 1: {
+ Common::Point pt(50, 142);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ BF_GLOBALS._player.changeAngle(270);
+ setDelay(10);
+ break;
+ case 3:
+ BF_GLOBALS._player.changeZoom(110);
+ BF_GLOBALS._player.setVisage(931);
+ BF_GLOBALS._player.setStrip(1);
+ BF_GLOBALS._player.setFrame(1);
+ BF_GLOBALS._player.animate(ANIM_MODE_4, 4, 1, this);
+ break;
+ case 4:
+ scene->_boots.setFrame(2);
+ BF_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ scene->showBootWindow();
+ if (!BF_GLOBALS.getFlag(72)) {
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_GLOBALS.setFlag(72);
+ }
+ SceneItem::display(0, 312);
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+void Scene930::Action2::signal() {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ BF_GLOBALS._player.disableControl();
+ break;
+ case 1: {
+ Common::Point pt(176, 137);
+ PlayerMover *mover = new PlayerMover();
+ BF_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ setDelay(10);
+ break;
+ case 3:
+ SceneItem::display(930, scene->_box._useLineNum, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ scene->subF3C07();
+ BF_GLOBALS._player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene930::Action3::signal() {
+ Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS._player.animate(ANIM_MODE_4, 4, -1, this);
+ break;
+ case 1:
+ scene->_boots.setFrame(1);
+ BF_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 2:
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.setVisage(368);
+ BF_GLOBALS._player.setStrip(6);
+ BF_GLOBALS._player.setFrame(1);
+ scene->_v141C = 0;
+ remove();
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene930::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ loadScene(930);
+
+ BF_GLOBALS._sound1.changeSound(85);
+ if (BF_GLOBALS._dayNumber == 0)
+ BF_GLOBALS._dayNumber = 1;
+ setZoomPercents(83, 75, 140, 100);
+ _v141A = 0;
+ _v141C = 0;
+ if (BF_INVENTORY.getObjectScene(54) != 1) {
+ _box.postInit();
+ _box.setVisage(930);
+ _box.setStrip(1);
+ _box.setPosition(Common::Point(223, 21));
+ _box.setDetails(930, 66, 67, 68, 1, NULL);
+ }
+ _boots.postInit();
+ _boots.setVisage(930);
+ _boots.setStrip(2);
+ _boots.setPosition(Common::Point(9, 161));
+ _boots.fixPriority(120);
+ _boots.setDetails(930, 62, 63, 64, 1, NULL);
+
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(368);
+ BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ BF_GLOBALS._player.setPosition(Common::Point(170, 92));
+ BF_GLOBALS._player.fixPriority(80);
+ BF_GLOBALS._player.changeZoom(-1);
+ BF_GLOBALS._player.enableControl();
+
+ _item1.setDetails( 1, 930, 0, 1, 2, 1);
+ _item2.setDetails( 2, 930, 4, 5, 6, 1);
+ _item3.setDetails( 3, 930, 8, 9, 10, 1);
+ _item4.setDetails( 4, 930, 12, 13, 14, 1);
+ _item5.setDetails( 5, 930, 16, 17, 18, 1);
+ _item6.setDetails( 20, 930, 20, 21, 22, 1);
+ _item7.setDetails( 6, 930, 23, 24, 25, 1);
+ _item8.setDetails( 7, 930, 26, 27, 28, 1);
+ _item21.setDetails( 8, 930, 89, 90, 91, 1);
+ _item9.setDetails( 9, 930, 29, 30, 31, 1);
+ _item20.setDetails(10, 930, 86, 87, 88, 1);
+ _item10.setDetails(11, 930, 33, 34, 35, 1);
+ _item11.setDetails(12, 930, 37, 38, 39, 1);
+ _item13.setDetails(13, 930, 40, 41, 42, 1);
+ _item14.setDetails(14, 930, 44, 45, 46, 1);
+ _item15.setDetails(15, 930, 48, 49, 50, 1);
+ _item16.setDetails(16, 930, 52, 53, 54, 1);
+ _item17.setDetails(17, 930, 56, 57, 58, 1);
+ _item12.setDetails(18, 930, 59, 60, 61, 1);
+ _item18.setDetails(19, 930, 80, 81, 82, 1);
+ _item19.setDetails(21, 930, 83, 84, 85, 1);
+
+ if (BF_GLOBALS._sceneManager._previousScene != 935) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager1, this, 9300, &BF_GLOBALS._player, NULL);
+ } else {
+ _v141C = 1;
+ BF_GLOBALS._player.animate(ANIM_MODE_NONE);
+ BF_GLOBALS._player.setPosition(Common::Point(50, 142));
+ BF_GLOBALS._player.setVisage(931);
+ BF_GLOBALS._player.setStrip(1);
+ BF_GLOBALS._player.setFrame(9);
+ BF_GLOBALS._player.fixPriority(-1);
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player.changeZoom(110);
+ _boots.setFrame(2);
+ showBootWindow();
+ }
+
+}
+
+void Scene930::signal() {
+ static uint32 v50EC4 = 0;
+
+ switch (_sceneMode++) {
+ case 1:
+ BF_GLOBALS._sceneManager.changeScene(550);
+ break;
+ case 2:
+ _sceneMode = 3;
+ SceneItem::display(930, 95, SET_WIDTH, 312,
+ SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+ signal();
+ break;
+ case 3:
+ _sceneMode = 4;
+ addFader((const byte *)&v50EC4, 5, this);
+ break;
+ case 4:
+ BF_GLOBALS._sceneManager.changeScene(935);
+ break;
+ default:
+ BF_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene930::dispatch() {
+ SceneExt::dispatch();
+}
+
+void Scene930::showBootWindow() {
+ _bootsWindow.postInit();
+ _bootsWindow.setVisage(930);
+ _bootsWindow.setStrip(3);
+ _bootsWindow.setFrame2(1);
+ _bootsWindow.fixPriority(260);
+ _bootsWindow.setPosition(Common::Point(147, 128));
+ _bootsWindow.setDetails(930, 69, 70, 93);
+}
+
+void Scene930::subF3C07() {
+ _object2.postInit();
+ _object2.setVisage(930);
+ _object2.setStrip(1);
+ _object2.setFrame2(2);
+ _object2.fixPriority(260);
+ _object2.setPosition(Common::Point(147, 128));
+ _object2.setDetails(930, 73, 74, 75);
+}
+
+void Scene930::subF3D6F() {
+ _object5.postInit();
+ _object5.setVisage(930);
+ _object5.setStrip(3);
+ if (BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) {
+ _object5.setFrame(_object5.getFrameCount());
+ _object5.setDetails(930, 92, 77, -1);
+ } else if (_v141A == 0) {
+ _object5.setFrame(2);
+ _object5.setDetails(930, 93, 77, -1);
+ } else {
+ _object5.setFrame(_object5.getFrameCount());
+ _object5.setDetails(930, 76, 77, 78);
+ }
+
+ _object5.fixPriority(260);
+ _object5.setPosition(Common::Point(147, 128));
+}
+
+void Scene930::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_v141A);
+ s.syncAsSint16LE(_v141C);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 935 - Hidden in the wardrobe
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene935::Action1::signal() {
+ Scene935 *scene = (Scene935 *)BF_GLOBALS._sceneManager._scene;
+ static uint32 v50ECC = 0, v50EEA = 0, v50EEE = 0, v50F26 = 0, v50F2A = 0, v50F62 = 0, v50F66 = 0, v50F6A = 0;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->addFader((const byte *)&v50ECC, 100, this);
+ break;
+ case 1:
+ scene->_visualSpeaker.setText("Jake! Hide in the closet!");
+ for (int i = 1; i < 21; i++)
+ scene->transition((const byte *)&v50EEA, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
+ setDelay(3);
+ break;
+ case 2:
+ scene->addFader((const byte *)&v50EEE, 5, this);
+ break;
+ case 3:
+ scene->_visualSpeaker.removeText();
+ scene->_visualSpeaker._textPos.y = scene->_sceneBounds.top + 80;
+ scene->_visualSpeaker._color1 = 252;
+ scene->_visualSpeaker._color1 = 251;
+ scene->_visualSpeaker.setText("Jake! Hide in the closet!");
+ setDelay(3);
+ break;
+ case 4:
+ scene->_visualSpeaker.setText("Jake! Hide in the closet!");
+ for (int i = 1; i < 21; i++)
+ scene->transition((const byte *)&v50F26, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
+ setDelay(3);
+ break;
+ case 5:
+ scene->addFader((const byte *)&v50F2A, 5, this);
+ break;
+ case 6:
+ scene->_visualSpeaker.removeText();
+ scene->_visualSpeaker._textPos.y = scene->_sceneBounds.top + 150;
+ scene->_visualSpeaker._color1 = 250;
+ scene->_visualSpeaker._color1 = 249;
+ scene->_visualSpeaker.setText("Jake! Hide in the closet!");
+ setDelay(3);
+ break;
+ case 7:
+ scene->_visualSpeaker.setText("Jake! Hide in the closet!");
+ for (int i = 1; i < 21; i++)
+ scene->transition((const byte *)&v50F62, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
+ setDelay(3);
+ break;
+ case 8:
+ scene->addFader((const byte *)&v50F66, 5, this);
+ break;
+ case 9:
+ scene->_visualSpeaker.removeText();
+ setDelay(3);
+ break;
+ case 10:
+ scene->_sceneMode = 1;
+ scene->add2Faders((const byte *)&v50F6A, 5, 935, scene);
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene935::postInit(SceneObjectList *OwnerList) {
+ PalettedScene::postInit();
+ loadScene(935);
+
+ BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._player.disableControl();
+ _visualSpeaker._textMode = ALIGN_CENTER;
+ _visualSpeaker._hideObjects = false;
+ _visualSpeaker._color1 = 254;
+ _visualSpeaker._color2 = 253;
+ _visualSpeaker._textPos.y = _sceneBounds.top + 18;
+ _visualSpeaker._textWidth = 300;
+ _visualSpeaker._textPos.x = _sceneBounds.left + 10;
+ setAction(&_action1);
+ BF_GLOBALS._sound1.fadeSound(67);
+}
+
+void Scene935::remove() {
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._scrollFollower = &BF_GLOBALS._player;
+ PalettedScene::remove();
+}
+
+void Scene935::signal() {
+ static uint32 v50EC8 = 0;
+
+ switch (_sceneMode) {
+ case 1:
+ _object1.postInit();
+ if (BF_GLOBALS._sceneManager._previousScene == 810) {
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 9352;
+ setAction(&_sequenceManager, this, 9350, &_object1, NULL);
+ } else if (BF_GLOBALS._sceneManager._previousScene == 930) {
+ _object3.postInit();
+ _object3.setVisage(938);
+ _object3.fixPriority(255);
+ _object3.setPosition(Common::Point(260, -4));
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 9354, &_object1, &_object3, NULL);
+ } else {
+ _sceneMode = 9351;
+ setAction(&_sequenceManager, this, 9350, &_object1, NULL);
+ }
+ break;
+ case 2:
+ BF_GLOBALS._sound1.play(68);
+ _sceneMode = 0;
+ addFader((const byte *)&v50EC8, 5, this);
+ break;
+ case 3:
+ _sceneMode = 2;
+ _object1.animate(ANIM_MODE_6, NULL);
+ signal();
+ break;
+ case 9351:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager, this, 9351, &_object1, NULL);
+ if (BF_GLOBALS._sceneManager._previousScene == 910)
+ _sceneMode = 9353;
+ break;
+ case 9352:
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 2;
+ setAction(&_sequenceManager, this, 9352, &_object1, NULL);
+ break;
+ case 9353:
+ _object2.postInit();
+ BF_GLOBALS._player.disableControl();
+ _sceneMode = 3;
+ setAction(&_sequenceManager, this, 9353, &_object1, &_object2, NULL);
+ break;
+ default:
+ BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._sceneManager._previousScene);
+ break;
+ }
+}
+
+void Scene935::dispatch() {
+ SceneExt::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 940 - Jail ending animation
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene940::Item1::startAction(CursorType action, Event &event) {
+ return true;
+}
+
+void Scene940::Action1::signal() {
+ Scene940 *scene = (Scene940 *)BF_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 0:
+ _actionIndex = 2;
+ setDelay(60);
+ break;
+ case 2:
+ _actionIndex = 941;
+ if (BF_GLOBALS.getFlag(fBackupAt340)) {
+ // WORKAROUND: If the player shot Nico, the alternate text was previously going off-screen
+ scene->_gameTextSpeaker1._offsetPos.y -= 10;
+ scene->_stripManager.start(9408, this);
+ } else
+ scene->_stripManager.start(9400, this);
+ break;
+ case 5:
+ setActionIndex(948);
+ setDelay(90);
+ scene->_object2.remove();
+ scene->_object3.remove();
+ scene->_object4.remove();
+ scene->_object5.remove();
+ scene->_object6.remove();
+ scene->_object7.remove();
+ scene->_object8.remove();
+ scene->_object9.remove();
+ scene->_object10.remove();
+ break;
+ case 99:
+ BF_GLOBALS._sound1.play(117);
+ BF_GLOBALS._sceneManager.changeScene(100);
+ remove();
+ break;
+ case 941:
+ scene->_gameTextSpeaker1._textWidth = 312;
+ _actionIndex = 944;
+ setAction(&scene->_sequenceManager1, this, 941, &BF_GLOBALS._player, NULL);
+ break;
+ case 942:
+ _actionIndex = 955;
+ setAction(&scene->_sequenceManager1, this, 942, &scene->_object2, NULL);
+ break;
+ case 943:
+ _actionIndex = 946;
+ setAction(&scene->_sequenceManager1, this, 943, &scene->_object3, NULL);
+ break;
+ case 944:
+ scene->_object4.setAction(&scene->_sequenceManager2, NULL, 944, &scene->_object4, &scene->_object5);
+ _actionIndex = 945;
+ setDelay(3);
+ break;
+ case 945:
+ scene->_object6.setAction(&scene->_sequenceManager3, NULL, 945, &scene->_object6, &scene->_object10, NULL);
+ _actionIndex = 943;
+ setDelay(3);
+ break;
+ case 946:
+ _actionIndex = 942;
+ setAction(&scene->_sequenceManager1, this, 946, &scene->_object7, &scene->_object8, NULL);
+ break;
+ case 947:
+ _actionIndex = 5;
+ setAction(&scene->_sequenceManager1, this, 947, &scene->_object1, &scene->_object11, &scene->_object12, &scene->_object13, NULL);
+ break;
+ case 948:
+ scene->_gameTextSpeaker1._textPos.x = scene->_sceneBounds.left + 10;
+ scene->_object17.postInit();
+ scene->_object17.hide();
+ scene->_object18.postInit();
+ scene->_object18.hide();
+ _actionIndex = 960;
+ setAction(&scene->_sequenceManager1, this, 948, &scene->_object11, &scene->_object12, &scene->_object13, &scene->_object1, &scene->_object14, NULL);
+ break;
+ case 949:
+ _actionIndex = 950;
+ setAction(&scene->_sequenceManager1, this, 949, &scene->_object17, &scene->_object18, &scene->_object1, &scene->_object12, &scene->_object13, &scene->_object15, NULL);
+ scene->_object11.setAction(&scene->_sequenceManager2, NULL, 952, &scene->_object11, NULL);
+ break;
+ case 950:
+ _actionIndex = 951;
+ setAction(&scene->_sequenceManager1, this, 950, &scene->_object17, &scene->_object18, &scene->_object1, &scene->_object13, &scene->_object16, NULL);
+ scene->_object12.setAction(&scene->_sequenceManager3, NULL, 953, &scene->_object12, NULL);
+ break;
+ case 951:
+ scene->_object13.setAction(&scene->_sequenceManager4, NULL, 954, &scene->_object13, NULL);
+ scene->_object11.setAction(&scene->_sequenceManager2, NULL, 952, &scene->_object11, NULL);
+ scene->_stripManager.start(9407, this);
+ setActionIndex(99);
+ break;
+ case 955:
+ scene->_object2.remove();
+ _actionIndex = 956;
+ setAction(&scene->_sequenceManager1, this, 955, &BF_GLOBALS._player, NULL);
+ break;
+ case 956:
+ _actionIndex = 947;
+ setAction(&scene->_sequenceManager1, this, 956, &scene->_object3, NULL);
+ scene->_object11.postInit();
+ scene->_object11.setVisage(943);
+ scene->_object11.setStrip(1);
+ scene->_object11.setPosition(Common::Point(-8, 178));
+ scene->_object12.postInit();
+ scene->_object12.setVisage(942);
+ scene->_object12.setStrip(1);
+ scene->_object12.setPosition(Common::Point(-41, 181));
+ scene->_object13.postInit();
+ scene->_object13.setVisage(944);
+ scene->_object13.setStrip(2);
+ scene->_object13.setPosition(Common::Point(-74, 179));
+ scene->_object1.postInit();
+ scene->_object1.setVisage(948);
+ scene->_object1.setStrip(2);
+ scene->_object1.setPosition(Common::Point(-107, 180));
+ scene->_object14.postInit();
+ scene->_object14.setVisage(949);
+ scene->_object14.setStrip(1);
+ scene->_object14.setFrame(3);
+ scene->_object14.setPosition(Common::Point(234, 75));
+ scene->_object15.postInit();
+ scene->_object15.setVisage(949);
+ scene->_object15.setStrip(1);
+ scene->_object15.setFrame(2);
+ scene->_object15.setPosition(Common::Point(144, 76));
+ scene->_object16.postInit();
+ scene->_object16.setVisage(949);
+ scene->_object16.setStrip(1);
+ scene->_object16.setFrame(1);
+ scene->_object16.setPosition(Common::Point(45, 77));
+ break;
+ case 960:
+ _actionIndex = 949;
+ setAction(&scene->_sequenceManager1, this, 960, &scene->_object11, &scene->_object17, &scene->_object18, &scene->_object1, &scene->_object14, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene940::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(940);
+
+ BF_GLOBALS._sound1.play(115);
+ BF_GLOBALS._dayNumber = 6;
+ BF_GLOBALS._interfaceY = 200;
+ T2_GLOBALS._uiElements._active = false;
+
+ _gameTextSpeaker2._speakerName = "SENTTEXT";
+ _gameTextSpeaker2._color1 = 104;
+ _gameTextSpeaker2._textMode = ALIGN_CENTER;
+ _stripManager.addSpeaker(&_gameTextSpeaker1);
+ _stripManager.addSpeaker(&_gameTextSpeaker2);
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(941);
+ BF_GLOBALS._player.setStrip(1);
+ BF_GLOBALS._player.setFrame(7);
+ BF_GLOBALS._player.setPosition(Common::Point(563, 80));
+ BF_GLOBALS._player.disableControl();
+ _object3.postInit();
+ _object3.setVisage(944);
+ _object3.setStrip(3);
+ _object3.setFrame(3);
+ _object3.setPosition(Common::Point(626, 78));
+ _object3.fixPriority(0);
+ _object2.postInit();
+ _object2.setVisage(944);
+ _object2.setStrip(3);
+ _object2.setFrame(6);
+ _object2.setPosition(Common::Point(378, 136));
+ _object2.setZoom(80);
+ _object2.fixPriority(0);
+ _object4.postInit();
+ _object4.setVisage(945);
+ _object4.setStrip(6);
+ _object4.setPosition(Common::Point(361, 70));
+ _object4.setZoom(80);
+ _object4.fixPriority(0);
+ _object5.postInit();
+ _object5.setVisage(945);
+ _object5.setStrip(7);
+ _object5.setPosition(Common::Point(366, 39));
+ _object5.setZoom(80);
+ _object5.fixPriority(3);
+ _object6.postInit();
+ _object6.setVisage(945);
+ _object6.setStrip(4);
+ _object6.setPosition(Common::Point(432, 70));
+ _object6.setZoom(65);
+ _object6.fixPriority(0);
+ _object7.postInit();
+ _object7.setVisage(945);
+ _object7.setStrip(1);
+ _object7.setPosition(Common::Point(423, 131));
+ _object7.setZoom(65);
+ _object7.fixPriority(0);
+ _object8.postInit();
+ _object8.setVisage(945);
+ _object8.setStrip(2);
+ _object8.setPosition(Common::Point(420, 99));
+ _object8.setZoom(65);
+ _object8.fixPriority(3);
+ _object9.postInit();
+ _object9.setVisage(945);
+ _object9.setStrip(3);
+ _object9.setPosition(Common::Point(458, 65));
+ _object9.setZoom(55);
+ _object9.fixPriority(0);
+ _object10.postInit();
+ _object10.setVisage(945);
+ _object10.setStrip(3);
+ _object10.setFrame(2);
+ _object10.setPosition(Common::Point(465, 118));
+ _object10.setZoom(55);
+ _object10.fixPriority(0);
+ _item1.setBounds(Rect(0, 0, 320, 200));
+ BF_GLOBALS._sceneItems.push_back(&_item1);
+ _sceneBounds.moveTo(320, 0);
+ _gameTextSpeaker1._textPos.x = _sceneBounds.left + 10;
+ _gameTextSpeaker1._color1 = 16;
+ _gameTextSpeaker1._textWidth = 265;
+ setAction(&_action1);
+}
+
+void Scene940::remove() {
+ // clearScren();
+ BF_GLOBALS._scrollFollower = &BF_GLOBALS._player;
+ SceneExt::remove();
+ T2_GLOBALS._uiElements._active = true;
+}
+
+} // End of namespace BlueForce
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes9.h b/engines/tsage/blue_force/blueforce_scenes9.h
new file mode 100644
index 0000000000..b0761713b1
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes9.h
@@ -0,0 +1,498 @@
+/* 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 TSAGE_BLUEFORCE_SCENES9_H
+#define TSAGE_BLUEFORCE_SCENES9_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class Scene900: public PalettedScene {
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item4: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ /* Objects */
+ class Gate: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Door: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Dog: public NamedObjectExt {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Lyle: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Body: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ Item1 _item1;
+ Gate _gate;
+ Door _door;
+ Dog _dog;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedObject _object4;
+ NamedObject _object5;
+ Lyle _lyle;
+ Body _body;
+ Item4 _item4;
+ ASoundExt _sound1;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ int _field1974;
+ int _field1976;
+
+ Scene900();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene910: public PalettedScene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ /* Objects */
+ class Lyle: public NamedObject {
+ public:
+ int _field90;
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Nico: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Stuart: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Forbes: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class PowerCord: public NamedObject {
+ public:
+ int _field90, _field92;
+
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ void init(int val);
+
+ };
+ class BreakerBox: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class FakeWall: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Object13: public NamedObject {
+ protected:
+ int _field90, _field92;
+ public:
+ void setupBreaker(int x, int y, int mode, int8 frameNumber);
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ virtual void remove();
+ };
+
+ class BlackPlug: public Object13 {
+ public:
+ void init(int x, int y, int arg8, int8 argA);
+ virtual bool startAction(CursorType action, Event &event);
+ virtual void remove();
+ };
+
+ class Object25: public NamedObject {
+ int _field90, _field92;
+ public:
+ void subEBBDC(int x, int y, int arg8, int argA);
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ virtual void remove();
+ };
+
+ class BreakerBoxInset: public FocusObject {
+ Object13 _object13, _object14, _object15, _object16, _object17, _object18;
+ Object13 _object19, _object20, _object21, _object22, _object23, _object24;
+ Object25 _object25, _object26;
+ public:
+ Object13 _object27;
+ BlackPlug _object28;
+ virtual Common::String getClassName() { return "Scene910_object12"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ };
+
+ class PowerButton: public NamedObject {
+ public:
+ NamedObject _object32;
+ virtual void remove();
+ virtual bool startAction(CursorType action, Event &event);
+ void init(int frame);
+ };
+
+ class GeneratorInset: public FocusObject {
+ BlackPlug _blackPlug;
+ PowerButton _powerButton;
+ public:
+ virtual Common::String getClassName() { return "Scene910_object29"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ };
+
+ /* Items */
+ class Generator: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item3: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item9: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item15: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item16: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item17: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ int _field2DDA, _field2DD8, _field2DE0, _field2DE2, _field2DE4;
+ Common::Point _destPos;
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+ SpeakerLyleHat _lyleHatSpeaker;
+ SpeakerFBI _fbiSpeaker;
+ SpeakerNico _nicoSpeaker;
+ SpeakerDA _daSpeaker;
+ Action1 _action1;
+ Action2 _action2;
+ Timer _timer1;
+ Lyle _lyle;
+ Nico _nico;
+ Stuart _stuart;
+ Forbes _forbes;
+ NamedObject _object5, _vent, _object7;
+ PowerCord _blackCord, _yellowCord;
+ BreakerBox _breakerBox;
+ FakeWall _fakeWall;
+ BreakerBoxInset _breakerBoxInset;
+ GeneratorInset _generatorInset;
+ NamedObject _object30, _object31, _object32;
+ Generator _generator;
+ Item2 _item2;
+ Item3 _item3;
+ NamedHotspot _item4, _item5, _item6, _item7, _item8;
+ Item9 _item9, _item10;
+ NamedHotspot _item11, _backWall, _item13, _item14;
+ Item15 _item15;
+ Item16 _item16;
+ Item17 _item17;
+ ASoundExt _sound1, _sound2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void checkGun();
+ void subE82BD();
+ void subE83E1();
+};
+
+class Scene920: public SceneExt {
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item8: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ SequenceManager _sequenceManager1;
+ SpeakerGameText _gameTextSpeaker;
+ SpeakerJakeJacket _jakeJacketSpeaker;
+
+ Item1 _crate;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ NamedObject _crateTop;
+ NamedObject _crateWindow;
+ NamedObject _doorway;
+ Item8 _exitN;
+ Common::Point _oldCoord;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene930: public PalettedScene {
+ /* Objects */
+ class Object1: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object2: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object3: public NamedObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object4: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ virtual void remove();
+ };
+ class Object5: public FocusObject {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ virtual void remove();
+ };
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ void showBootWindow();
+ void subF3C07();
+ void subF3D6F();
+public:
+ SequenceManager _sequenceManager1;
+ Object1 _box;
+ Object2 _object2;
+ Object3 _boots;
+ Object4 _bootsWindow;
+ Object5 _object5;
+
+ Item1 _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ NamedHotspot _item8;
+ NamedHotspot _item9;
+ NamedHotspot _item10;
+ NamedHotspot _item11;
+ NamedHotspot _item12;
+ NamedHotspot _item13;
+ NamedHotspot _item14;
+ NamedHotspot _item15;
+ NamedHotspot _item16;
+ NamedHotspot _item17;
+ NamedHotspot _item18;
+ NamedHotspot _item19;
+ NamedHotspot _item20;
+ NamedHotspot _item21;
+
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+
+ SpeakerGameText gameTextSpeaker;
+
+ int _v141A;
+ int _v141C;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene935: public PalettedScene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ NamedObject _object1;
+ NamedObject _object2;
+ NamedObject _object3;
+ Action1 _action1;
+ VisualSpeaker _visualSpeaker;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene940: public SceneExt {
+ /* Items */
+ class Item1: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ SequenceManager _sequenceManager3;
+ SequenceManager _sequenceManager4;
+ NamedObject _object1;
+ NamedObject _object2;
+ NamedObject _object3;
+ NamedObject _object4;
+ NamedObject _object5;
+ NamedObject _object6;
+ NamedObject _object7;
+ NamedObject _object8;
+ NamedObject _object9;
+ NamedObject _object10;
+ NamedObject _object11;
+ NamedObject _object12;
+ NamedObject _object13;
+ NamedObject _object14;
+ NamedObject _object15;
+ NamedObject _object16;
+ NamedObject _object17;
+ NamedObject _object18;
+ Item1 _item1;
+ Action1 _action1;
+
+ SpeakerGameText _gameTextSpeaker1;
+ SpeakerGameText _gameTextSpeaker2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+};
+
+} // End of namespace BlueForce
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_speakers.cpp b/engines/tsage/blue_force/blueforce_speakers.cpp
new file mode 100644
index 0000000000..8af18b43b8
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_speakers.cpp
@@ -0,0 +1,1023 @@
+/* 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.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_speakers.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/graphics.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+VisualSpeaker::VisualSpeaker(): Speaker() {
+ _textWidth = 312;
+ _color1 = 19;
+ _hideObjects = false;
+ _removeObject1 = false;
+ _removeObject2 = false;
+ _xp = 160;
+ _fontNumber = 4;
+ _color2 = 82;
+ _offsetPos = Common::Point(4, 170);
+ _numFrames = 0;
+}
+
+void VisualSpeaker::remove() {
+ if (_removeObject2)
+ _object2.remove();
+ if (_removeObject1)
+ _object1.remove();
+
+ Speaker::remove();
+}
+
+void VisualSpeaker::synchronize(Serializer &s) {
+ Speaker::synchronize(s);
+
+ s.syncAsByte(_removeObject1);
+ s.syncAsByte(_removeObject2);
+ s.syncAsSint16LE(_xp);
+ s.syncAsSint16LE(_numFrames);
+ s.syncAsSint16LE(_offsetPos.x);
+ s.syncAsSint16LE(_offsetPos.y);
+}
+
+void VisualSpeaker::proc12(Action *action) {
+ Speaker::proc12(action);
+ _textPos = Common::Point(_offsetPos.x + BF_GLOBALS._sceneManager._scene->_sceneBounds.left,
+ _offsetPos.y + BF_GLOBALS._sceneManager._scene->_sceneBounds.top);
+ _numFrames = 0;
+}
+
+void VisualSpeaker::setText(const Common::String &msg) {
+ _objectList.draw();
+ BF_GLOBALS._sceneObjects->draw();
+
+ _sceneText._color1 = _color1;
+ _sceneText._color2 = _color2;
+ _sceneText._color3 = _color3;
+ _sceneText._width = _textWidth;
+ _sceneText._fontNumber = _fontNumber;
+ _sceneText._textMode = _textMode;
+ _sceneText.setup(msg);
+
+ // Get the string bounds
+ GfxFont f;
+ f.setFontNumber(_fontNumber);
+ Rect bounds;
+ f.getStringBounds(msg.c_str(), bounds, _textWidth);
+
+ // Set the position for the text
+ switch (_textMode) {
+ case ALIGN_LEFT:
+ case ALIGN_JUSTIFIED:
+ _sceneText.setPosition(_textPos);
+ break;
+ case ALIGN_CENTER:
+ _sceneText.setPosition(Common::Point(_textPos.x + (_textWidth - bounds.width()) / 2, _textPos.y));
+ break;
+ case ALIGN_RIGHT:
+ _sceneText.setPosition(Common::Point(_textPos.x + _textWidth - bounds.width(), _textPos.y));
+ break;
+ default:
+ break;
+ }
+
+ // Ensure the text is in the foreground
+ _sceneText.fixPriority(256);
+
+ // Count the number of words (by spaces) in the string
+ const char *s = msg.c_str();
+ int spaceCount = 0;
+ while (*s) {
+ if (*s++ == ' ')
+ ++spaceCount;
+ }
+
+ _numFrames = spaceCount * 3 + 2;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGameText::SpeakerGameText(): VisualSpeaker() {
+ _speakerName = "GAMETEXT";
+ _color1 = 8;
+ _color2 = 19;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSutter::SpeakerSutter() {
+ _speakerName = "SUTTER";
+ _color1 = 20;
+ _color2 = 22;
+ _textMode = ALIGN_CENTER;
+}
+
+void SpeakerSutter::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(329);
+ _object1.setStrip2(2);
+ _object1.fixPriority(254);
+ _object1.changeZoom(100);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(329);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerDoug::SpeakerDoug(): VisualSpeaker() {
+ _color1 = 32;
+ _speakerName = "DOUG";
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJakeNoHead::SpeakerJakeNoHead(): VisualSpeaker() {
+ _color1 = 13;
+ _speakerName = "JAKE_NO_HEAD";
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerHarrison::SpeakerHarrison(): VisualSpeaker() {
+ _color1 = 32;
+ _speakerName = "HARRISON";
+}
+
+void SpeakerHarrison::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(325);
+ _object1.setStrip2(7);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 277,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.fixPriority(255);
+ _object2.setVisage(325);
+ _object2.setStrip2(6);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 277,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJake::SpeakerJake(): VisualSpeaker() {
+ _color1 = 13;
+ _color2 = 7;
+ _speakerName = "JAKE";
+}
+
+void SpeakerJake::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(1001);
+ _object1.setStrip2(2);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 38,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(1001);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 38,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJakeJacket::SpeakerJakeJacket(): VisualSpeaker() {
+ _color1 = 13;
+ _color2 = 7;
+ _speakerName = "JAKEJACKET";
+}
+
+void SpeakerJakeJacket::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(1001);
+ _object1.setStrip2(4);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(1001);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJakeUniform::SpeakerJakeUniform(): VisualSpeaker() {
+ _color1 = 13;
+ _color2 = 7;
+ _speakerName = "JAKEUNIFORM";
+}
+
+void SpeakerJakeUniform::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(1001);
+ _object1.setStrip2(3);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(1001);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJailer::SpeakerJailer(): VisualSpeaker() {
+ _color1 = 13;
+ _color2 = 7;
+ _speakerName = "JAILER";
+}
+
+void SpeakerJailer::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(395);
+ _object1.setStrip(6);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(395);
+ _object2.setStrip(5);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGreen::SpeakerGreen(): VisualSpeaker() {
+ _color1 = 96;
+ _color2 = 99;
+ _speakerName = "GREEN";
+}
+
+void SpeakerGreen::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(373);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPSutter::SpeakerPSutter(): VisualSpeaker() {
+ _color1 = 20;
+ _color2 = 22;
+ _speakerName = "PSUTTER";
+}
+
+void SpeakerPSutter::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(335);
+ _object2.setStrip2(3);
+ _object2.fixPriority(200);
+ _object2.setPosition(Common::Point(202, 48));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJakeRadio::SpeakerJakeRadio(): VisualSpeaker() {
+ _color1 = 13;
+ _color2 = 7;
+ _speakerName = "JAKE_RADIO";
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerLyleHat::SpeakerLyleHat(): VisualSpeaker() {
+ _color1 = 29;
+ _color2 = 89;
+ _xp = 75;
+ _speakerName = "LYLEHAT";
+}
+
+void SpeakerLyleHat::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(278);
+ _object1.setStrip2(4);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(278);
+ _object2.setStrip2(2);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJordan::SpeakerJordan(): VisualSpeaker() {
+ _color1 = 96;
+ _color2 = 93;
+ _speakerName = "JORDAN";
+}
+
+void SpeakerJordan::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(344);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 78));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSkip::SpeakerSkip(): VisualSpeaker() {
+ _color1 = 80;
+ _color2 = 82;
+ _speakerName = "SKIP";
+}
+
+void SpeakerSkip::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(345);
+ _object1.setStrip2(4);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 282,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(345);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 282,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSkipB::SpeakerSkipB(): VisualSpeaker() {
+ _color1 = 80;
+ _color2 = 82;
+ _speakerName = "SKIPB";
+}
+
+void SpeakerSkipB::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(347);
+ _object1.setStrip2(2);
+ _object1.setFrame2(3);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 37,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(347);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 37,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCarter::SpeakerCarter(): VisualSpeaker() {
+ _color1 = 89;
+ _color2 = 95;
+ _speakerName = "CARTER";
+}
+
+void SpeakerCarter::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(844);
+ _object1.setStrip2(8);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(78, 166));
+
+ _object2.postInit();
+ _object2.setVisage(844);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(78, 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerDriver::SpeakerDriver(): VisualSpeaker() {
+ _color1 = 43;
+ _color2 = 70;
+ _speakerName = "DRIVER";
+}
+
+void SpeakerDriver::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(416);
+ _object1.setStrip2(8);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 263,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(416);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 263,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerShooter::SpeakerShooter(): VisualSpeaker() {
+ _color1 = 43;
+ _color2 = 70;
+ _speakerName = "SHOOTER";
+}
+
+void SpeakerShooter::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(418);
+ _object1.setStrip2(7);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 268,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(418);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 268,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJim::SpeakerJim(): VisualSpeaker() {
+ _color1 = 32;
+ _speakerName = "JIM";
+}
+
+void SpeakerJim::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(385);
+ _object1.setStrip(7);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(262, 166));
+
+ _object2.postInit();
+ _object2.setVisage(385);
+ _object2.setStrip2(6);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(262, 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerDezi::SpeakerDezi(): VisualSpeaker() {
+ _color1 = 21;
+ _speakerName = "DEZI";
+}
+
+void SpeakerDezi::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(385);
+ _object2.setStrip2(5);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(252, 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJake385::SpeakerJake385(): VisualSpeaker() {
+ _color1 = 13;
+ _speakerName = "JAKE_385";
+}
+
+void SpeakerJake385::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(1001);
+ _object1.setStrip2(BF_GLOBALS.getFlag(onDuty) ? 3 : 4);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(42, 166));
+
+ _object2.postInit();
+ _object2.setVisage(1001);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(42, 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerLaura::SpeakerLaura(): VisualSpeaker() {
+ _color1 = 97;
+ _color2 = 105;
+ _speakerName = "LAURA";
+}
+
+void SpeakerLaura::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(345);
+ _object2.setStrip2(2);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 38,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerLauraHeld::SpeakerLauraHeld(): VisualSpeaker() {
+ _color1 = 97;
+ _color2 = 105;
+ _speakerName = "LAURAHELD";
+}
+
+void SpeakerLauraHeld::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(374);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 120,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 120));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerEugene::SpeakerEugene(): VisualSpeaker() {
+ _color1 = 20;
+ _color2 = 22;
+ _speakerName = "EUGENE";
+}
+
+void SpeakerEugene::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(465);
+ _object1.setStrip2(3);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(465);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerWeasel::SpeakerWeasel(): VisualSpeaker() {
+ _color1 = 8;
+ _color2 = 5;
+ _speakerName = "WEASEL";
+}
+
+void SpeakerWeasel::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(464);
+ _object1.setStrip2(3);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(464);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerBilly::SpeakerBilly(): VisualSpeaker() {
+ _color1 = 20;
+ _color2 = 22;
+ _speakerName = "BILLY";
+}
+
+void SpeakerBilly::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(463);
+ _object1.setStrip2(7);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(463);
+ _object2.setStrip2(6);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 167));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerDrunk::SpeakerDrunk(): VisualSpeaker() {
+ _color1 = 21;
+ _speakerName = "DRUNK";
+}
+
+void SpeakerDrunk::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(556);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 52,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGiggles::SpeakerGiggles(): VisualSpeaker() {
+ _color1 = 32;
+
+ _speakerName = "GIGGLES";
+}
+
+void SpeakerGiggles::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(557);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 262,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerFBI::SpeakerFBI(): VisualSpeaker() {
+ _color1 = 27;
+ _color2 = 89;
+
+ _speakerName = "FBI";
+}
+
+void SpeakerFBI::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(837);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 267,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerNico::SpeakerNico(): VisualSpeaker() {
+ _color1 = 105;
+ _color2 = 102;
+
+ _speakerName = "NICO";
+}
+
+void SpeakerNico::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(905);
+ _object1.setStrip2(2);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 262,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(905);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 262,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerDA::SpeakerDA(): VisualSpeaker() {
+ _color1 = 82;
+ _color2 = 80;
+
+ _speakerName = "DA";
+}
+
+void SpeakerDA::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(915);
+ _object1.setStrip2(8);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 84,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(915);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 84,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGrandma::SpeakerGrandma(): VisualSpeaker() {
+ _color1 = 20;
+ _color2 = 23;
+
+ _speakerName = "GRANDMA";
+}
+
+void SpeakerGrandma::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(274);
+ _object1.setStrip2(4);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 43,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(274);
+ _object2.setStrip2(3);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 43,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerLyle::SpeakerLyle(): VisualSpeaker() {
+ _color1 = 29;
+ _color2 = 89;
+
+ _speakerName = "LYLE";
+}
+
+void SpeakerLyle::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(278);
+ _object1.setStrip2(3);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 75,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(278);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 75,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGranText::SpeakerGranText(): VisualSpeaker() {
+ _color1 = 20;
+ _color2 = 23;
+
+ _speakerName = "GRANTEXT";
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerLyleText::SpeakerLyleText(): VisualSpeaker() {
+ _color1 = 29;
+ _color2 = 89;
+
+ _speakerName = "LYLETEXT";
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerKate::SpeakerKate(): VisualSpeaker() {
+ _color1 = 108;
+
+ _speakerName = "KATE";
+}
+
+void SpeakerKate::setText(const Common::String &msg) {
+ _removeObject1 = _removeObject2 = true;
+
+ _object1.postInit();
+ _object1.setVisage(122);
+ _object1.setStrip2(8);
+ _object1.fixPriority(254);
+ _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 270,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2.postInit();
+ _object2.setVisage(122);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 270,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ _object2._numFrames = 7;
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerTony::SpeakerTony(): VisualSpeaker() {
+ _color1 = 108;
+ _color2 = 8;
+
+ _speakerName = "TONY";
+}
+
+void SpeakerTony::setText(const Common::String &msg) {
+ _removeObject2 = true;
+
+ _object2.postInit();
+ _object2.setVisage(132);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 62,
+ BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+ VisualSpeaker::setText(msg);
+ _object2.fixCountdown(8, _numFrames);
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_speakers.h b/engines/tsage/blue_force/blueforce_speakers.h
new file mode 100644
index 0000000000..508279a929
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_speakers.h
@@ -0,0 +1,359 @@
+/* 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 TSAGE_BLUEFORCE_SPEAKERS_H
+#define TSAGE_BLUEFORCE_SPEAKERS_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/blue_force/blueforce_logic.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class VisualSpeaker: public Speaker {
+public:
+ NamedObject _object1;
+ CountdownObject _object2;
+ bool _removeObject1, _removeObject2;
+ int _xp;
+ int _numFrames;
+ Common::Point _offsetPos;
+public:
+ VisualSpeaker();
+
+ virtual Common::String getClassName() { return "VisualSpeaker"; }
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void proc12(Action *action);
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerGameText: public VisualSpeaker {
+public:
+ SpeakerGameText();
+
+ virtual Common::String getClassName() { return "SpeakerGameText"; }
+};
+
+class SpeakerSutter: public VisualSpeaker {
+public:
+ SpeakerSutter();
+
+ virtual Common::String getClassName() { return "SpeakerSutter"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerDoug: public VisualSpeaker {
+public:
+ SpeakerDoug();
+
+ virtual Common::String getClassName() { return "SpeakerDoug"; }
+};
+
+class SpeakerJakeNoHead: public VisualSpeaker {
+public:
+ SpeakerJakeNoHead();
+
+ virtual Common::String getClassName() { return "SpeakerJakeNoHead"; }
+};
+
+class SpeakerHarrison: public VisualSpeaker {
+public:
+ SpeakerHarrison();
+
+ virtual Common::String getClassName() { return "SpeakerHarrison"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJake: public VisualSpeaker {
+public:
+ SpeakerJake();
+
+ virtual Common::String getClassName() { return "SpeakerJake"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJakeJacket: public VisualSpeaker {
+public:
+ SpeakerJakeJacket();
+
+ virtual Common::String getClassName() { return "SpeakerJakeJacket"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJakeUniform: public VisualSpeaker {
+public:
+ SpeakerJakeUniform();
+
+ virtual Common::String getClassName() { return "SpeakerJakeUniform"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJailer: public VisualSpeaker {
+public:
+ SpeakerJailer();
+
+ virtual Common::String getClassName() { return "SpeakerJailer"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerGreen: public VisualSpeaker {
+public:
+ SpeakerGreen();
+
+ virtual Common::String getClassName() { return "SpeakerGreen"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerPSutter: public VisualSpeaker {
+public:
+ SpeakerPSutter();
+
+ virtual Common::String getClassName() { return "SpeakerPSutter"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJakeRadio: public VisualSpeaker {
+public:
+ SpeakerJakeRadio();
+
+ virtual Common::String getClassName() { return "SpeakerJakeRadio"; }
+};
+
+class SpeakerLyleHat: public VisualSpeaker {
+public:
+ SpeakerLyleHat();
+
+ virtual Common::String getClassName() { return "SpeakerLyleHat"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJordan: public VisualSpeaker {
+public:
+ SpeakerJordan();
+
+ virtual Common::String getClassName() { return "SpeakerJordan"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSkip: public VisualSpeaker {
+public:
+ SpeakerSkip();
+
+ virtual Common::String getClassName() { return "SpeakerSkip"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSkipB: public VisualSpeaker {
+public:
+ SpeakerSkipB();
+
+ virtual Common::String getClassName() { return "SpeakerSkipB"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCarter: public VisualSpeaker {
+public:
+ SpeakerCarter();
+
+ virtual Common::String getClassName() { return "SpeakerCarter"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerDriver: public VisualSpeaker {
+public:
+ SpeakerDriver();
+
+ virtual Common::String getClassName() { return "SpeakerDriver"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerShooter: public VisualSpeaker {
+public:
+ SpeakerShooter();
+
+ virtual Common::String getClassName() { return "SpeakerShooter"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJim: public VisualSpeaker {
+public:
+ SpeakerJim();
+
+ virtual Common::String getClassName() { return "SpeakerJim"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerDezi: public VisualSpeaker {
+public:
+ SpeakerDezi();
+
+ virtual Common::String getClassName() { return "SpeakerDezi"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJake385: public VisualSpeaker {
+public:
+ SpeakerJake385();
+
+ virtual Common::String getClassName() { return "SpeakerJake385"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerLaura: public VisualSpeaker {
+public:
+ SpeakerLaura();
+
+ virtual Common::String getClassName() { return "SpeakerLaura"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerLauraHeld: public VisualSpeaker {
+public:
+ SpeakerLauraHeld();
+
+ virtual Common::String getClassName() { return "SpeakerLaura"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerEugene: public VisualSpeaker {
+public:
+ SpeakerEugene();
+
+ virtual Common::String getClassName() { return "SpeakerEugene"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerWeasel: public VisualSpeaker {
+public:
+ SpeakerWeasel();
+
+ virtual Common::String getClassName() { return "SpeakerWeasel"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerBilly: public VisualSpeaker {
+public:
+ SpeakerBilly();
+
+ virtual Common::String getClassName() { return "SpeakerBilly"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerDrunk: public VisualSpeaker {
+public:
+ SpeakerDrunk();
+
+ virtual Common::String getClassName() { return "SpeakerDrunk"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerGiggles: public VisualSpeaker {
+public:
+ SpeakerGiggles();
+
+ virtual Common::String getClassName() { return "SpeakerGiggles"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerFBI: public VisualSpeaker {
+public:
+ SpeakerFBI();
+
+ virtual Common::String getClassName() { return "FBI"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerNico: public VisualSpeaker {
+public:
+ SpeakerNico();
+
+ virtual Common::String getClassName() { return "NICO"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerDA: public VisualSpeaker {
+public:
+ SpeakerDA();
+
+ virtual Common::String getClassName() { return "DA"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerGrandma: public VisualSpeaker {
+public:
+ SpeakerGrandma();
+
+ virtual Common::String getClassName() { return "SpeakerGrandma"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerLyle: public VisualSpeaker {
+public:
+ SpeakerLyle();
+
+ virtual Common::String getClassName() { return "SpeakerLyle"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerGranText: public VisualSpeaker {
+public:
+ SpeakerGranText();
+
+ virtual Common::String getClassName() { return "SpeakerGranText"; }
+};
+
+class SpeakerLyleText: public VisualSpeaker {
+public:
+ SpeakerLyleText();
+
+ virtual Common::String getClassName() { return "SpeakerLyleText"; }
+};
+
+class SpeakerKate: public VisualSpeaker {
+public:
+ SpeakerKate();
+
+ virtual Common::String getClassName() { return "SpeakerKate"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerTony: public VisualSpeaker {
+public:
+ SpeakerTony();
+
+ virtual Common::String getClassName() { return "SpeakerTony"; }
+ virtual void setText(const Common::String &msg);
+};
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/blueforce_logic.cpp b/engines/tsage/blueforce_logic.cpp
deleted file mode 100644
index d266d5e1d9..0000000000
--- a/engines/tsage/blueforce_logic.cpp
+++ /dev/null
@@ -1,120 +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.
- *
- */
-
-#include "tsage/blueforce_logic.h"
-#include "tsage/scenes.h"
-#include "tsage/tsage.h"
-#include "tsage/staticres.h"
-
-namespace tSage {
-
-void BlueForceGame::start() {
- // Start the game
- _globals->_sceneManager.changeScene(20);
-
- _globals->_events.setCursor(CURSOR_WALK);
-}
-
-Scene *BlueForceGame::createScene(int sceneNumber) {
- switch (sceneNumber) {
- case 20:
- case 50:
- case 60:
- error("Scene group 0 not implemented");
- case 100:
- case 109:
- case 110:
- case 114:
- case 115:
- case 125:
- case 140:
- case 150:
- case 160:
- case 180:
- case 190:
- error("Scene group 1 not implemented");
- case 200:
- case 210:
- case 220:
- case 225:
- case 265:
- case 270:
- case 271:
- case 280:
- error("Scene group 2 not implemented");
- case 300:
- case 315:
- case 325:
- case 330:
- case 340:
- case 342:
- case 350:
- case 355:
- case 360:
- case 370:
- case 380:
- case 385:
- case 390:
- error("Scene group 3 not implemented");
- case 410:
- case 415:
- case 440:
- case 450:
- error("Scene group 4 not implemented");
- case 550:
- case 551:
- case 560:
- case 570:
- case 580:
- case 590:
- error("Scene group 5 not implemented");
- case 600:
- case 620:
- case 666:
- case 690:
- error("Scene group 6 not implemented");
- case 710:
- error("Scene group 7 not implemented");
- case 800:
- case 810:
- case 820:
- case 830:
- case 840:
- case 850:
- case 860:
- case 870:
- case 880:
- error("Scene group 8 not implemented");
- case 900:
- case 910:
- case 920:
- case 930:
- case 935:
- case 940:
- error("Scene group 9 not implemented");
- default:
- error("Unknown scene number - %d", sceneNumber);
- break;
- }
-}
-
-} // End of namespace tSage
diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp
index b475310533..d86548bd4b 100644
--- a/engines/tsage/converse.cpp
+++ b/engines/tsage/converse.cpp
@@ -26,7 +26,7 @@
#include "tsage/globals.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
#define STRIP_WORD_DELAY 30
@@ -34,12 +34,13 @@ namespace tSage {
SequenceManager::SequenceManager() : Action() {
Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
_sequenceData.clear();
- _field24 = 0;
+ _fontNum = 0;
_sequenceOffset = 0;
_resNum = 0;
_field26 = 0;
_objectIndex = 0;
_keepActive = false;
+ _onCallback = NULL;
setup();
}
@@ -56,7 +57,7 @@ void SequenceManager::synchronize(Serializer &s) {
s.syncAsSint32LE(_resNum);
s.syncAsSint32LE(_sequenceOffset);
s.syncAsByte(_keepActive);
- s.syncAsSint32LE(_field24);
+ s.syncAsSint32LE(_fontNum);
s.syncAsSint32LE(_field26);
s.syncAsSint32LE(_objectIndex);
@@ -77,7 +78,7 @@ void SequenceManager::remove() {
_sequenceData.clear();
}
- if (_globals->_sceneObjects->contains(&_sceneText))
+ if (g_globals->_sceneObjects->contains(&_sceneText))
_sceneText.remove();
Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
@@ -85,7 +86,7 @@ void SequenceManager::remove() {
}
void SequenceManager::signal() {
- if (_globals->_sceneObjects->contains(&_sceneText))
+ if (g_globals->_sceneObjects->contains(&_sceneText))
_sceneText.hide();
bool continueFlag = true;
@@ -98,8 +99,6 @@ void SequenceManager::signal() {
}
uint16 idx = static_cast<uint16>(getNextValue() - 32000);
- if (idx > 34)
- continue;
int16 v1, v2, v3;
switch (idx) {
@@ -144,8 +143,8 @@ void SequenceManager::signal() {
v1 = getNextValue();
v3 = getNextValue();
v2 = getNextValue();
- _globals->_sceneManager._scene->_sceneBounds.moveTo(v3, v2);
- _globals->_sceneManager._scene->loadScene(v1);
+ g_globals->_sceneManager._scene->_sceneBounds.moveTo(v3, v2);
+ g_globals->_sceneManager._scene->loadScene(v1);
break;
case 10: {
int resNum= getNextValue();
@@ -225,7 +224,7 @@ void SequenceManager::signal() {
int minPercent = getNextValue();
int yEnd = getNextValue();
int maxPercent = getNextValue();
- _globals->_sceneManager._scene->setZoomPercents(yStart, minPercent, yEnd, maxPercent);
+ g_globals->_sceneManager._scene->setZoomPercents(yStart, minPercent, yEnd, maxPercent);
break;
}
case 26:
@@ -253,7 +252,7 @@ void SequenceManager::signal() {
break;
case 30:
v1 = getNextValue();
- _globals->_scrollFollower = (v1 == -1) ? NULL : _objectList[v1];
+ g_globals->_scrollFollower = (v1 == -1) ? NULL : _objectList[v1];
break;
case 31:
_sceneObject->setObjectWrapper(new SceneObjectWrapper());
@@ -267,7 +266,7 @@ void SequenceManager::signal() {
setDelay(1);
else {
_sceneText.remove();
- _globals->_sceneManager._scene->_stripManager.start(v1, this);
+ g_globals->_sceneManager._scene->_stripManager.start(v1, this);
}
break;
case 34: {
@@ -284,6 +283,33 @@ void SequenceManager::signal() {
_objectList[objIndex3], _objectList[objIndex4], _objectList[objIndex5], _objectList[objIndex6], NULL);
break;
}
+ /* Following indexes were introduced for Blue Force */
+ case 35:
+ v1 = getNextValue();
+ _sceneObject->updateAngle(_objectList[v1]->_position);
+ break;
+ case 36:
+ _sceneObject->animate(ANIM_MODE_9, NULL);
+ break;
+ case 37:
+ v1 = getNextValue();
+ v2 = getNextValue();
+ if (_onCallback)
+ _onCallback(v1, v2);
+ break;
+ case 38: {
+ int resNum = getNextValue();
+ int lineNum = getNextValue();
+ int fontNum = getNextValue();
+ int color1 = getNextValue();
+ int color2 = getNextValue();
+ int color3 = getNextValue();
+ int xp = getNextValue();
+ int yp = getNextValue();
+ int width = getNextValue();
+ setMessage(resNum, lineNum, fontNum, color1, color2, color3, Common::Point(xp, yp), width);
+ break;
+ }
default:
error("SequenceManager::signal - Unknown action %d at offset %xh", idx, _sequenceOffset - 2);
break;
@@ -293,7 +319,7 @@ void SequenceManager::signal() {
void SequenceManager::process(Event &event) {
if (((event.eventType == EVENT_BUTTON_DOWN) || (event.eventType == EVENT_KEYPRESS)) &&
- !event.handled && _globals->_sceneObjects->contains(&_sceneText)) {
+ !event.handled && g_globals->_sceneObjects->contains(&_sceneText)) {
// Remove the text item
_sceneText.remove();
setDelay(2);
@@ -308,8 +334,8 @@ void SequenceManager::attached(EventHandler *newOwner, EventHandler *endHandler,
// Get the sequence number to use
_resNum = va_arg(va, int);
- byte *seqData = _resourceManager->getResource(RES_SEQUENCE, _resNum, 0);
- uint seqSize = _vm->_memoryManager.getSize(seqData);
+ byte *seqData = g_resourceManager->getResource(RES_SEQUENCE, _resNum, 0);
+ uint seqSize = g_vm->_memoryManager.getSize(seqData);
_sequenceData.resize(seqSize);
Common::copy(seqData, seqData + seqSize, &_sequenceData[0]);
@@ -337,21 +363,26 @@ uint16 SequenceManager::getNextValue() {
}
void SequenceManager::setMessage(int resNum, int lineNum, int color, const Common::Point &pt, int width) {
- _sceneText._color1 = color;
- _sceneText._color2 = 0;
- _sceneText._color3 = 0;
- _sceneText._fontNumber = 2;
+ setMessage(resNum, lineNum, 2, color, 0, 0, pt, width);
+}
+
+void SequenceManager::setMessage(int resNum, int lineNum, int fontNum, int color1, int color2, int color3,
+ const Common::Point &pt, int width) {
+ _sceneText._color1 = color1;
+ _sceneText._color2 = color2;
+ _sceneText._color3 = color3;
+ _sceneText._fontNumber = fontNum;
_sceneText._width = width;
// Get the display message
- Common::String msg = _resourceManager->getMessage(resNum, lineNum);
+ Common::String msg = g_resourceManager->getMessage(resNum, lineNum);
// Set the text message
_sceneText.setup(msg);
// Move the text to the correct position
Rect textRect = _sceneText._bounds;
- Rect sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
+ Rect sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
sceneBounds.collapse(4, 2);
textRect.moveTo(pt);
textRect.contain(sceneBounds);
@@ -374,14 +405,14 @@ void SequenceManager::setMessage(int resNum, int lineNum, int color, const Commo
}
SequenceManager *SequenceManager::globalManager() {
- return &_globals->_sequenceManager;
+ return &g_globals->_sequenceManager;
}
/*--------------------------------------------------------------------------*/
ConversationChoiceDialog::ConversationChoiceDialog() {
_stdColor = 23;
- _highlightColor = _globals->_scenePalette._colors.background;
+ _highlightColor = g_globals->_scenePalette._colors.background;
_fontNumber = 1;
}
@@ -412,17 +443,17 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) {
// Draw the dialog
draw();
- _globals->_events.showCursor();
+ g_globals->_events.showCursor();
// Event handling loop
Event event;
- while (!_vm->getEventManager()->shouldQuit()) {
- while (!_globals->_events.getEvent(event, EVENT_KEYPRESS | EVENT_BUTTON_DOWN | EVENT_MOUSE_MOVE) &&
- !_vm->getEventManager()->shouldQuit()) {
+ while (!g_vm->shouldQuit()) {
+ while (!g_globals->_events.getEvent(event, EVENT_KEYPRESS | EVENT_BUTTON_DOWN | EVENT_MOUSE_MOVE) &&
+ !g_vm->shouldQuit()) {
g_system->delayMillis(10);
g_system->updateScreen();
}
- if (_vm->getEventManager()->shouldQuit())
+ if (g_vm->shouldQuit())
break;
if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode >= Common::KEYCODE_1) &&
@@ -473,7 +504,7 @@ void ConversationChoiceDialog::draw() {
// Make a backup copy of the area the dialog will occupy
Rect tempRect = _bounds;
tempRect.collapse(-10, -10);
- _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), tempRect);
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), tempRect);
// Fill in the contents of the entire dialog
_gfxManager._bounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
@@ -527,6 +558,8 @@ void Obj44::synchronize(Serializer &s) {
StripManager::StripManager() {
_callbackObject = NULL;
_activeSpeaker = NULL;
+ _onBegin = NULL;
+ _onEnd = NULL;
reset();
}
@@ -534,12 +567,14 @@ StripManager::~StripManager() {
}
void StripManager::start(int stripNum, EventHandler *owner, StripCallback *callback) {
+ if (_onBegin)
+ _onBegin();
reset();
_stripNum = stripNum;
_callbackObject = callback;
- _sceneNumber = _globals->_sceneManager._scene->_screenNumber;
- _sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
+ _sceneNumber = g_globals->_sceneManager._scene->_screenNumber;
+ _sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
_script.clear();
assert(owner);
@@ -568,8 +603,8 @@ void StripManager::reset() {
void StripManager::load() {
// Get the script
- byte *script = _resourceManager->getResource(RES_STRIP, _stripNum, 2);
- uint scriptSize = _vm->_memoryManager.getSize(script);
+ byte *script = g_resourceManager->getResource(RES_STRIP, _stripNum, 2);
+ uint scriptSize = g_vm->_memoryManager.getSize(script);
_script.resize(scriptSize);
Common::copy(script, script + scriptSize, &_script[0]);
@@ -577,8 +612,8 @@ void StripManager::load() {
DEALLOCATE(script);
// Get the object list
- byte *obj44List = _resourceManager->getResource(RES_STRIP, _stripNum, 1);
- int dataSize = _vm->_memoryManager.getSize(obj44List);
+ byte *obj44List = g_resourceManager->getResource(RES_STRIP, _stripNum, 1);
+ int dataSize = g_vm->_memoryManager.getSize(obj44List);
assert((dataSize % 0x44) == 0);
byte *dataP = obj44List;
@@ -642,11 +677,14 @@ void StripManager::remove() {
if (_activeSpeaker)
_activeSpeaker->remove();
- if (_sceneNumber != _globals->_sceneManager._scene->_screenNumber) {
- _globals->_sceneManager._scene->_sceneBounds = _sceneBounds;
- _globals->_sceneManager._scene->loadScene(_sceneNumber);
+ if (_sceneNumber != g_globals->_sceneManager._scene->_screenNumber) {
+ g_globals->_sceneManager._scene->_sceneBounds = _sceneBounds;
+ g_globals->_sceneManager._scene->loadScene(_sceneNumber);
}
+ if (_onEnd)
+ _onEnd();
+
Action::remove();
}
@@ -706,9 +744,9 @@ void StripManager::signal() {
_activeSpeaker->remove();
_activeSpeaker = speakerP;
- if ((_activeSpeaker->_newSceneNumber == -1) && (_globals->_sceneManager._scene->_screenNumber != _sceneNumber)) {
- _globals->_sceneManager._scene->_sceneBounds = _sceneBounds;
- _globals->_sceneManager._scene->loadScene(_sceneNumber);
+ if ((_activeSpeaker->_newSceneNumber == -1) && (g_globals->_sceneManager._scene->_screenNumber != _sceneNumber)) {
+ g_globals->_sceneManager._scene->_sceneBounds = _sceneBounds;
+ g_globals->_sceneManager._scene->loadScene(_sceneNumber);
}
_activeSpeaker->proc12(this);
@@ -801,7 +839,7 @@ Speaker::Speaker() : EventHandler() {
_textPos = Common::Point(10, 20);
_fontNumber = 2;
_textMode = ALIGN_LEFT;
- _color1 = _color2 = _color3 = _globals->_scenePalette._colors.foreground;
+ _color1 = _color2 = _color3 = g_globals->_scenePalette._colors.foreground;
_action = NULL;
_speakerName = "SPEAKER";
}
@@ -834,9 +872,9 @@ void Speaker::remove() {
void Speaker::proc12(Action *action) {
_action = action;
if (_newSceneNumber != -1) {
- _oldSceneNumber = _globals->_sceneManager._sceneNumber;
- _sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
- _globals->_sceneManager._scene->loadScene(_newSceneNumber);
+ _oldSceneNumber = g_globals->_sceneManager._sceneNumber;
+ _sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
+ g_globals->_sceneManager._scene->loadScene(_newSceneNumber);
}
if (_hideObjects)
@@ -844,14 +882,14 @@ void Speaker::proc12(Action *action) {
_objectList.activate();
// Draw the speaker objects without any fading
- FadeMode fadeMode = _globals->_sceneManager._fadeMode;
- _globals->_sceneManager._fadeMode = FADEMODE_IMMEDIATE;
- _globals->_sceneObjects->draw();
- _globals->_sceneManager._fadeMode = fadeMode;
+ FadeMode fadeMode = g_globals->_sceneManager._fadeMode;
+ g_globals->_sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+ g_globals->_sceneObjects->draw();
+ g_globals->_sceneManager._fadeMode = fadeMode;
}
void Speaker::setText(const Common::String &msg) {
- _globals->_sceneObjects->draw();
+ g_globals->_sceneObjects->draw();
_sceneText._color1 = _color1;
_sceneText._color2 = _color2;
@@ -904,16 +942,16 @@ void ScreenSpeaker::setText(const Common::String &msg) {
gfxMan._font.setFontNumber(_fontNumber);
Rect textRect;
- _globals->gfxManager().getStringBounds(msg.c_str(), textRect, _textWidth);
+ g_globals->gfxManager().getStringBounds(msg.c_str(), textRect, _textWidth);
if (_npc) {
textRect.center(_npc->_position.x, _npc->_bounds.top - (textRect.height() / 2 + 10));
} else {
- textRect.center(_globals->_sceneManager._scene->_sceneBounds.left +
- (_globals->_sceneManager._scene->_sceneBounds.width() / 2),
- _globals->_sceneManager._scene->_sceneBounds.top);
+ textRect.center(g_globals->_sceneManager._scene->_sceneBounds.left +
+ (g_globals->_sceneManager._scene->_sceneBounds.width() / 2),
+ g_globals->_sceneManager._scene->_sceneBounds.top);
}
- Rect rect2 = _globals->_sceneManager._scene->_sceneBounds;
+ Rect rect2 = g_globals->_sceneManager._scene->_sceneBounds;
rect2.collapse(10, 6);
textRect.contain(rect2);
@@ -929,14 +967,14 @@ void ScreenSpeaker::setText(const Common::String &msg) {
void SpeakerAction::signal() {
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(60) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(60) + 60);
break;
case 1:
static_cast<SceneObject *>(_owner)->setFrame(1);
static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_5, this, NULL);
break;
case 2:
- setDelay(_globals->_randomSource.getRandomNumber(10));
+ setDelay(g_globals->_randomSource.getRandomNumber(10));
_actionIndex = 0;
break;
default:
@@ -954,4 +992,4 @@ void AnimatedSpeaker::removeText() {
_objectList.draw();
}
-} // end of namespace tSage
+} // end of namespace TsAGE
diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h
index 13c490e995..f82c07a7dd 100644
--- a/engines/tsage/converse.h
+++ b/engines/tsage/converse.h
@@ -27,31 +27,36 @@
#include "tsage/dialogs.h"
#include "tsage/sound.h"
-namespace tSage {
+namespace TsAGE {
class StripCallback : public Action {
public:
virtual void stripCallback(int v) = 0;
};
+typedef void (*SequenceCallback)(int v1, int v2);
+
class SequenceManager : public Action {
private:
void setup();
uint16 getNextValue();
void setMessage(int resNum, int lineNum, int color, const Common::Point &pt, int width);
+ void setMessage(int resNum, int lineNum, int fontNum, int color1, int color2, int color3,
+ const Common::Point &pt, int width);
SequenceManager *globalManager();
public:
SceneText _sceneText;
int _resNum;
uint _sequenceOffset;
bool _keepActive;
- int _field24;
+ int _fontNum;
int _field26;
Common::Array<byte> _sequenceData;
int _objectIndex;
SceneObject *_sceneObject;
SceneObject *_objectList[6];
ASound _soundHandler;
+ SequenceCallback _onCallback;
public:
SequenceManager();
@@ -185,6 +190,8 @@ public:
virtual void synchronize(Serializer &s);
};
+typedef void (*StripProc)();
+
class StripManager : public Action {
private:
void reset();
@@ -206,6 +213,8 @@ public:
int _field2E8;
Common::Array<Obj44> _obj44List;
Common::Array<byte> _script;
+ StripProc _onBegin;
+ StripProc _onEnd;
public:
StripManager();
virtual ~StripManager();
@@ -222,6 +231,6 @@ public:
void addSpeaker(Speaker *speaker);
};
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 76714a6f10..a56b30ad4d 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -22,6 +22,7 @@
#include "common/system.h"
#include "common/config-manager.h"
+#include "common/util.h"
#include "engines/engine.h"
#include "graphics/palette.h"
#include "tsage/tsage.h"
@@ -32,8 +33,9 @@
#include "tsage/staticres.h"
#include "tsage/globals.h"
#include "tsage/sound.h"
+#include "tsage/blue_force/blueforce_logic.h"
-namespace tSage {
+namespace TsAGE {
// The engine uses ScumMVM screen buffering, so all logic is hardcoded to use pane buffer 0
#define CURRENT_PANENUM 0
@@ -48,21 +50,47 @@ InvObject::InvObject(int sceneNumber, int rlbNum, int cursorNum, CursorType curs
// Decode the image for the inventory item to get it's display bounds
uint size;
- byte *imgData = _resourceManager->getSubResource(_displayResNum, _rlbNum, _cursorNum, &size);
+ byte *imgData = g_resourceManager->getSubResource(_displayResNum, _rlbNum, _cursorNum, &size);
GfxSurface s = surfaceFromRes(imgData);
_bounds = s.getBounds();
DEALLOCATE(imgData);
}
+InvObject::InvObject(int visage, int strip, int frame) {
+ assert(g_vm->getGameID() == GType_BlueForce);
+ _visage = visage;
+ _strip = strip;
+ _frame = frame;
+ _sceneNumber = 0;
+ _iconResNum = 10;
+}
+
+InvObject::InvObject(int strip, int frame) {
+ assert(g_vm->getGameID() == GType_Ringworld2);
+ _strip = strip;
+ _frame = frame;
+
+ _visage = 0;
+ _sceneNumber = 0;
+ _iconResNum = 10;
+}
+
void InvObject::setCursor() {
- _globals->_events._currentCursor = _cursorId;
+ if (g_vm->getGameID() == GType_BlueForce) {
+ // Blue Force cursor handling
+ _cursorId = (CursorType)BF_GLOBALS._inventory->indexOf(this);
+ g_globals->_events.setCursor(_cursorId);
+ } else {
+ // Ringworld cursor handling
+ g_globals->_events._currentCursor = _cursorId;
- if (_iconResNum != -1) {
- GfxSurface s = surfaceFromRes(_iconResNum, _rlbNum, _cursorNum);
+ if (_iconResNum != -1) {
+ GfxSurface s = surfaceFromRes(_iconResNum, _rlbNum, _cursorNum);
- Graphics::Surface src = s.lockSurface();
- _globals->_events.setCursor(src, s._transColor, s._centroid, _cursorId);
+ Graphics::Surface src = s.lockSurface();
+ g_globals->_events.setCursor(src, s._transColor, s._centroid, _cursorId);
+ }
}
}
@@ -77,6 +105,31 @@ void InvObjectList::synchronize(Serializer &s) {
SYNC_POINTER(_selectedItem);
}
+int InvObjectList::indexOf(InvObject *obj) const {
+ int idx = 0;
+ SynchronizedList<InvObject *>::const_iterator i;
+
+ for (i = _itemList.begin(); i != _itemList.end(); ++i, ++idx) {
+ if ((*i) == obj)
+ return idx;
+ }
+
+ return -1;
+}
+
+InvObject *InvObjectList::getItem(int objectNum) {
+ SynchronizedList<InvObject *>::const_iterator i = _itemList.begin();
+ while (objectNum-- > 0)
+ ++i;
+
+ return *i;
+}
+
+int InvObjectList::getObjectScene(int objectNum) {
+ InvObject *obj = getItem(objectNum);
+ return obj->_sceneNumber;
+}
+
/*--------------------------------------------------------------------------*/
void EventHandler::dispatch() {
@@ -128,7 +181,7 @@ void Action::remove() {
_owner->_action = NULL;
_owner = NULL;
} else {
- _globals->_sceneManager.removeAction(this);
+ g_globals->_sceneManager.removeAction(this);
}
_attached = false;
@@ -146,7 +199,7 @@ void Action::dispatch() {
_action->dispatch();
if (_delayFrames) {
- uint32 frameNumber = _globals->_events.getFrameNumber();
+ uint32 frameNumber = g_globals->_events.getFrameNumber();
if (frameNumber >= _startFrame) {
_delayFrames -= frameNumber - _startFrame;
@@ -162,7 +215,7 @@ void Action::dispatch() {
void Action::attached(EventHandler *newOwner, EventHandler *endHandler, va_list va) {
_actionIndex = 0;
_delayFrames = 0;
- _startFrame = _globals->_events.getFrameNumber();
+ _startFrame = g_globals->_events.getFrameNumber();
_owner = newOwner;
_endHandler = endHandler;
_attached = true;
@@ -171,7 +224,7 @@ void Action::attached(EventHandler *newOwner, EventHandler *endHandler, va_list
void Action::setDelay(int numFrames) {
_delayFrames = numFrames;
- _startFrame = _globals->_events.getFrameNumber();
+ _startFrame = g_globals->_events.getFrameNumber();
}
/*--------------------------------------------------------------------------*/
@@ -279,8 +332,12 @@ void ObjectMover::dispatch() {
void ObjectMover::setup(const Common::Point &destPos) {
_sceneObject->calcAngle(destPos);
- if ((_sceneObject->_objectWrapper) && !(_sceneObject->_flags & OBJFLAG_SUPPRESS_DISPATCH))
- _sceneObject->_objectWrapper->dispatch();
+ if ((_sceneObject->_objectWrapper) && !(_sceneObject->_flags & OBJFLAG_SUPPRESS_DISPATCH)) {
+ if (g_vm->getGameID() == GType_Ringworld)
+ _sceneObject->_objectWrapper->dispatch();
+ else
+ _sceneObject->updateAngle(destPos);
+ }
// Get the difference
int diffX = destPos.x - _sceneObject->_position.x;
@@ -439,8 +496,8 @@ void PlayerMover::endMove() {
}
// Set up the new interim destination along the route
- _globals->_walkRegions._routeEnds.moveSrc = _globals->_walkRegions._routeEnds.moveDest;
- _globals->_walkRegions._routeEnds.moveDest = _routeList[_routeIndex];
+ g_globals->_walkRegions._routeEnds.moveSrc = g_globals->_walkRegions._routeEnds.moveDest;
+ g_globals->_walkRegions._routeEnds.moveDest = _routeList[_routeIndex];
setup(_routeList[_routeIndex]);
dispatch();
}
@@ -448,18 +505,18 @@ void PlayerMover::endMove() {
void PlayerMover::setDest(const Common::Point &destPos) {
_routeList[0] = _sceneObject->_position;
- if (_globals->_walkRegions._resNum == -1) {
+ if (g_globals->_walkRegions._resNum == -1) {
// Scene has no walk regions defined, so player can walk anywhere directly
_routeList[0] = destPos;
_routeList[1] = Common::Point(ROUTE_END_VAL, ROUTE_END_VAL);
} else {
// Figure out a path to the destination (or as close as possible to it)
- pathfind(_routeList, _sceneObject->_position, destPos, _globals->_walkRegions._routeEnds);
+ pathfind(_routeList, _sceneObject->_position, destPos, g_globals->_walkRegions._routeEnds);
}
_routeIndex = 0;
- _globals->_walkRegions._routeEnds.moveSrc = _sceneObject->_position;
- _globals->_walkRegions._routeEnds.moveDest = _routeList[0];
+ g_globals->_walkRegions._routeEnds.moveSrc = _sceneObject->_position;
+ g_globals->_walkRegions._routeEnds.moveDest = _routeList[0];
setup(_routeList[0]);
}
@@ -472,7 +529,7 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo
Common::Point objPos;
// Get the region the source is in
- int srcRegion = _globals->_walkRegions.indexOf(srcPos);
+ int srcRegion = g_globals->_walkRegions.indexOf(srcPos);
if (srcRegion == -1) {
srcRegion = findClosestRegion(srcPos, regionIndexes);
}
@@ -481,7 +538,7 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo
routeRegions[0] = 0;
while (!routeRegions[0]) {
// Check the destination region
- int destRegion = _globals->_walkRegions.indexOf(destPos, &regionIndexes);
+ int destRegion = g_globals->_walkRegions.indexOf(destPos, &regionIndexes);
if ((srcRegion == -1) && (destRegion == -1)) {
// Both source and destination are outside walkable areas
@@ -492,14 +549,14 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo
Common::Point newPos;
findLinePoint(&tempRouteEnds, &objPos, 1, &newPos);
- int srcId = _globals->_walkRegions.indexOf(newPos);
+ int srcId = g_globals->_walkRegions.indexOf(newPos);
if (srcId == -1) {
tempRouteEnds.moveDest = tempRouteEnds.moveSrc;
tempRouteEnds.moveSrc = routeEnds.moveDest;
findLinePoint(&tempRouteEnds, &objPos, 1, &newPos);
- srcRegion = _globals->_walkRegions.indexOf(newPos);
+ srcRegion = g_globals->_walkRegions.indexOf(newPos);
if (srcRegion == -1)
srcRegion = checkMover(srcPos, destPos);
@@ -532,8 +589,8 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo
}
// field 0 holds the start, and field 1 holds the destination
- WRField18 &currSrcField = _globals->_walkRegions._field18[0];
- WRField18 &currDestField = _globals->_walkRegions._field18[1];
+ WRField18 &currSrcField = g_globals->_walkRegions._field18[0];
+ WRField18 &currDestField = g_globals->_walkRegions._field18[1];
currSrcField._pt1 = srcPos;
currSrcField._pt2 = srcPos;
@@ -551,11 +608,11 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo
int breakEntry2 = routeRegions[idx + 1];
int listIndex = 0;
- while (_globals->_walkRegions._idxList[_globals->_walkRegions[breakEntry]._idxListIndex + listIndex] !=
+ while (g_globals->_walkRegions._idxList[g_globals->_walkRegions[breakEntry]._idxListIndex + listIndex] !=
breakEntry2)
++listIndex;
- tempList[idx] = _globals->_walkRegions._idxList2[_globals->_walkRegions[breakEntry]._idxList2Index
+ tempList[idx] = g_globals->_walkRegions._idxList2[g_globals->_walkRegions[breakEntry]._idxList2Index
+ listIndex];
++endIndex;
@@ -566,8 +623,8 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo
int thisIdx = tempList[listIndex];
int nextIdx = tempList[listIndex + 1];
- WRField18 &thisField = _globals->_walkRegions._field18[thisIdx];
- WRField18 &nextField = _globals->_walkRegions._field18[nextIdx];
+ WRField18 &thisField = g_globals->_walkRegions._field18[thisIdx];
+ WRField18 &nextField = g_globals->_walkRegions._field18[nextIdx];
if (sub_F8E5_calculatePoint(currSrcField._pt1, nextField._pt1,
thisField._pt1, thisField._pt2) &&
@@ -616,8 +673,8 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo
}
int PlayerMover::regionIndexOf(const Common::Point &pt) {
- for (uint idx = 0; idx < _globals->_walkRegions._regionList.size(); ++idx) {
- if (_globals->_walkRegions._regionList[idx].contains(pt))
+ for (uint idx = 0; idx < g_globals->_walkRegions._regionList.size(); ++idx) {
+ if (g_globals->_walkRegions._regionList[idx].contains(pt))
return idx + 1;
}
@@ -737,14 +794,14 @@ int PlayerMover::checkMover(Common::Point &srcPos, const Common::Point &destPos)
_sceneObject->_mover->dispatch();
// Scan walk regions for point
- for (uint idx = 0; idx < _globals->_walkRegions._regionList.size(); ++idx) {
- if (_globals->_walkRegions[idx].contains(_sceneObject->_position)) {
+ for (uint idx = 0; idx < g_globals->_walkRegions._regionList.size(); ++idx) {
+ if (g_globals->_walkRegions[idx].contains(_sceneObject->_position)) {
regionIndex = idx + 1;
srcPos = _sceneObject->_position;
break;
}
}
- } while ((regionIndex == 0) && (_sceneObject->_mover) && !_vm->shouldQuit());
+ } while ((regionIndex == 0) && (_sceneObject->_mover) && !g_vm->shouldQuit());
_sceneObject->_position = objPos;
_sceneObject->_regionBitList = regionBitList;
@@ -799,14 +856,14 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg
return 32000;
}
- WalkRegion &srcWalkRegion = _globals->_walkRegions[srcRegion];
+ WalkRegion &srcWalkRegion = g_globals->_walkRegions[srcRegion];
int distance;
if (!routeList[0]) {
// The route is empty (new route).
distance = 0;
} else {
// Find the distance from the last region in the route.
- WalkRegion &region = _globals->_walkRegions[routeList[*routeList]];
+ WalkRegion &region = g_globals->_walkRegions[routeList[*routeList]];
distance = findDistance(srcWalkRegion._pt, region._pt);
}
@@ -827,7 +884,7 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg
int foundIndex = 0;
int idx = 0;
int currDest;
- while ((currDest = _globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + idx]) != 0) {
+ while ((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + idx]) != 0) {
if (currDest == destRegion) {
foundIndex = idx;
break;
@@ -838,7 +895,7 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg
// Check every connected region until we find a route to the destination (or we have no more to check).
int bestDistance = 31990;
- while (((currDest = _globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) {
+ while (((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) {
int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute);
if ((newDistance <= bestDistance) || foundRoute) {
@@ -999,7 +1056,7 @@ void PaletteModifierCached::synchronize(Serializer &s) {
PaletteRotation::PaletteRotation() : PaletteModifierCached() {
_percent = 0;
_delayCtr = 0;
- _frameNumber = _globals->_events.getFrameNumber();
+ _frameNumber = g_globals->_events.getFrameNumber();
}
void PaletteRotation::synchronize(Serializer &s) {
@@ -1017,7 +1074,7 @@ void PaletteRotation::synchronize(Serializer &s) {
void PaletteRotation::signal() {
if (_delayCtr) {
- uint32 frameNumber = _globals->_events.getFrameNumber();
+ uint32 frameNumber = g_globals->_events.getFrameNumber();
if (frameNumber >= _frameNumber) {
_delayCtr = frameNumber - _frameNumber;
@@ -1161,6 +1218,20 @@ void PaletteFader::remove() {
action->signal();
}
+void PaletteFader::setPalette(ScenePalette *palette, int step) {
+ if (step < 0) {
+ // Reverse step means moving from dest palette to source, so swap the two palettes
+ byte tempPal[256 * 3];
+ Common::copy(&palette->_palette[0], &palette->_palette[256 * 3], &tempPal[0]);
+ Common::copy(&this->_palette[0], &this->_palette[256 * 3], &palette->_palette[0]);
+ Common::copy(&tempPal[0], &tempPal[256 * 3], &this->_palette[0]);
+
+ step = -step;
+ }
+
+ PaletteModifierCached::setPalette(palette, step);
+}
+
/*--------------------------------------------------------------------------*/
ScenePalette::ScenePalette() {
@@ -1184,7 +1255,7 @@ ScenePalette::ScenePalette(int paletteNum) {
}
bool ScenePalette::loadPalette(int paletteNum) {
- byte *palData = _resourceManager->getResource(RES_PALETTE, paletteNum, 0, true);
+ byte *palData = g_resourceManager->getResource(RES_PALETTE, paletteNum, 0, true);
if (!palData)
return false;
@@ -1224,6 +1295,15 @@ void ScenePalette::setPalette(int index, int count) {
}
/**
+ * Set a palette entry
+ */
+void ScenePalette::setEntry(int index, uint r, uint g, uint b) {
+ _palette[index * 3] = r;
+ _palette[index * 3 + 1] = g;
+ _palette[index * 3 + 2] = b;
+}
+
+/**
* Returns the palette index with the closest matching color to that specified
* @param r R component
* @param g G component
@@ -1314,7 +1394,7 @@ PaletteRotation *ScenePalette::addRotation(int start, int end, int rotationMode,
return obj;
}
-PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int percent, Action *action) {
+PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int step, Action *action) {
PaletteFader *fader = new PaletteFader();
fader->_action = action;
for (int i = 0; i < 256 * 3; i += 3) {
@@ -1326,8 +1406,8 @@ PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int
arrBufferRGB += 3;
}
- fader->setPalette(this, percent);
- _globals->_scenePalette._listeners.push_back(fader);
+ fader->setPalette(this, step);
+ g_globals->_scenePalette._listeners.push_back(fader);
return fader;
}
@@ -1335,7 +1415,7 @@ PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int
void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) {
ScenePalette tempPalette;
- if (_globals->_sceneManager._hasPalette) {
+ if (g_globals->_sceneManager._hasPalette) {
if ((fadeMode == FADEMODE_GRADUAL) || (fadeMode == FADEMODE_IMMEDIATE)) {
// Fade out any active palette
tempPalette.getPalette();
@@ -1348,13 +1428,17 @@ void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) {
g_system->delayMillis(10);
}
} else {
- _globals->_scenePalette.refresh();
- _globals->_sceneManager._hasPalette = false;
+ g_globals->_scenePalette.refresh();
+ g_globals->_sceneManager._hasPalette = false;
}
}
- _globals->_screenSurface.copyFrom(_globals->_sceneManager._scene->_backSurface,
- bounds, Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), NULL);
+ Rect tempRect = bounds;
+ if (g_vm->getGameID() != GType_Ringworld)
+ tempRect.setHeight(BF_GLOBALS._interfaceY);
+
+ g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface,
+ tempRect, Rect(0, 0, tempRect.width(), tempRect.height()), NULL);
for (SynchronizedList<PaletteModifier *>::iterator i = tempPalette._listeners.begin(); i != tempPalette._listeners.end(); ++i)
delete *i;
@@ -1395,7 +1479,20 @@ void SceneItem::synchronize(Serializer &s) {
}
void SceneItem::remove() {
- _globals->_sceneItems.remove(this);
+ g_globals->_sceneItems.remove(this);
+}
+
+bool SceneItem::startAction(CursorType action, Event &event) {
+ if (g_vm->getGameID() == GType_Ringworld) {
+ doAction(action);
+ return true;
+ } else if ((action == CURSOR_LOOK) || (action == CURSOR_USE) || (action == CURSOR_TALK) ||
+ (action < CURSOR_LOOK)) {
+ doAction(action);
+ return true;
+ } else {
+ return false;
+ }
}
void SceneItem::doAction(int action) {
@@ -1423,21 +1520,25 @@ void SceneItem::doAction(int action) {
}
bool SceneItem::contains(const Common::Point &pt) {
- const Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
+ const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
if (_sceneRegionId == 0)
return _bounds.contains(pt.x + sceneBounds.left, pt.y + sceneBounds.top);
else
- return _globals->_sceneRegions.indexOf(Common::Point(pt.x + sceneBounds.left,
+ return g_globals->_sceneRegions.indexOf(Common::Point(pt.x + sceneBounds.left,
pt.y + sceneBounds.top)) == _sceneRegionId;
}
void SceneItem::display(int resNum, int lineNum, ...) {
- Common::String msg = !resNum ? Common::String() : _resourceManager->getMessage(resNum, lineNum);
+ Common::String msg = (!resNum || (resNum == -1)) ? Common::String() :
+ g_resourceManager->getMessage(resNum, lineNum);
- if (_globals->_sceneObjects->contains(&_globals->_sceneText)) {
- _globals->_sceneText.remove();
- _globals->_sceneObjects->draw();
+ if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active)
+ T2_GLOBALS._uiElements.hide();
+
+ if (g_globals->_sceneObjects->contains(&g_globals->_sceneText)) {
+ g_globals->_sceneText.remove();
+ g_globals->_sceneObjects->draw();
}
GfxFontBackup font;
@@ -1445,12 +1546,15 @@ void SceneItem::display(int resNum, int lineNum, ...) {
Rect textRect;
int maxWidth = 120;
bool keepOnscreen = false;
- bool centerText = true;
+ bool centerText = g_vm->getGameID() == GType_Ringworld;
- if (resNum) {
+ if (resNum != 0) {
va_list va;
va_start(va, lineNum);
+ if (resNum == -1)
+ msg = Common::String(va_arg(va, const char *));
+
int mode;
do {
// Get next instruction
@@ -1460,7 +1564,7 @@ void SceneItem::display(int resNum, int lineNum, ...) {
case SET_WIDTH:
// Set width
maxWidth = va_arg(va, int);
- _globals->_sceneText._width = maxWidth;
+ g_globals->_sceneText._width = maxWidth;
break;
case SET_X:
// Set the X Position
@@ -1472,21 +1576,21 @@ void SceneItem::display(int resNum, int lineNum, ...) {
break;
case SET_FONT:
// Set the font number
- _globals->_sceneText._fontNumber = va_arg(va, int);
- _globals->gfxManager()._font.setFontNumber(_globals->_sceneText._fontNumber);
+ g_globals->_sceneText._fontNumber = va_arg(va, int);
+ g_globals->gfxManager()._font.setFontNumber(g_globals->_sceneText._fontNumber);
break;
case SET_BG_COLOR: {
// Set the background color
int bgColor = va_arg(va, int);
- _globals->gfxManager()._font._colors.background = bgColor;
+ g_globals->gfxManager()._font._colors.background = bgColor;
if (!bgColor)
- _globals->gfxManager().setFillFlag(false);
+ g_globals->gfxManager().setFillFlag(false);
break;
}
case SET_FG_COLOR:
// Set the foreground color
- _globals->_sceneText._color1 = va_arg(va, int);
- _globals->gfxManager()._font._colors.foreground = _globals->_sceneText._color1;
+ g_globals->_sceneText._color1 = va_arg(va, int);
+ g_globals->gfxManager()._font._colors.foreground = g_globals->_sceneText._color1;
break;
case SET_KEEP_ONSCREEN:
// Suppresses immediate display
@@ -1495,15 +1599,15 @@ void SceneItem::display(int resNum, int lineNum, ...) {
case SET_EXT_BGCOLOR: {
// Set secondary bg color
int v = va_arg(va, int);
- _globals->_sceneText._color2 = v;
- _globals->gfxManager()._font._colors2.background = v;
+ g_globals->_sceneText._color2 = v;
+ g_globals->gfxManager()._font._colors2.background = v;
break;
}
case SET_EXT_FGCOLOR: {
// Set secondary fg color
int v = va_arg(va, int);
- _globals->_sceneText._color3 = v;
- _globals->gfxManager()._font._colors.foreground = v;
+ g_globals->_sceneText._color3 = v;
+ g_globals->gfxManager()._font._colors.foreground = v;
break;
}
case SET_POS_MODE:
@@ -1512,7 +1616,7 @@ void SceneItem::display(int resNum, int lineNum, ...) {
break;
case SET_TEXT_MODE:
// Set the text mode
- _globals->_sceneText._textMode = (TextAlign)va_arg(va, int);
+ g_globals->_sceneText._textMode = (TextAlign)va_arg(va, int);
break;
default:
break;
@@ -1524,27 +1628,27 @@ void SceneItem::display(int resNum, int lineNum, ...) {
if (resNum) {
// Get required bounding size
- _globals->gfxManager().getStringBounds(msg.c_str(), textRect, maxWidth);
+ g_globals->gfxManager().getStringBounds(msg.c_str(), textRect, maxWidth);
textRect.center(pos.x, pos.y);
- textRect.contain(_globals->gfxManager()._bounds);
+ textRect.contain(g_globals->gfxManager()._bounds);
if (centerText) {
- _globals->_sceneText._color1 = _globals->_sceneText._color2;
- _globals->_sceneText._color2 = 0;
- _globals->_sceneText._color3 = 0;
+ g_globals->_sceneText._color1 = g_globals->_sceneText._color2;
+ g_globals->_sceneText._color2 = 0;
+ g_globals->_sceneText._color3 = 0;
}
- _globals->_sceneText.setup(msg);
+ g_globals->_sceneText.setup(msg);
if (centerText) {
- _globals->_sceneText.setPosition(Common::Point(
- _globals->_sceneManager._scene->_sceneBounds.left + textRect.left,
- _globals->_sceneManager._scene->_sceneBounds.top + textRect.top), 0);
+ g_globals->_sceneText.setPosition(Common::Point(
+ g_globals->_sceneManager._scene->_sceneBounds.left + textRect.left,
+ g_globals->_sceneManager._scene->_sceneBounds.top + textRect.top), 0);
} else {
- _globals->_sceneText.setPosition(pos, 0);
+ g_globals->_sceneText.setPosition(pos, 0);
}
- _globals->_sceneText.fixPriority(255);
- _globals->_sceneObjects->draw();
+ g_globals->_sceneText.fixPriority(255);
+ g_globals->_sceneObjects->draw();
}
// Unless the flag is set to keep the message on-screen, show it until a mouse or keypress, then remove it
@@ -1552,77 +1656,98 @@ void SceneItem::display(int resNum, int lineNum, ...) {
Event event;
// Keep event on-screen until a mouse or keypress
- while (!_vm->getEventManager()->shouldQuit() && !_globals->_events.getEvent(event,
+ while (!g_vm->shouldQuit() && !g_globals->_events.getEvent(event,
EVENT_BUTTON_DOWN | EVENT_KEYPRESS)) {
g_system->updateScreen();
g_system->delayMillis(10);
}
- _globals->_sceneText.remove();
+ g_globals->_sceneText.remove();
}
-}
-/*--------------------------------------------------------------------------*/
+ if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) {
+ // Show user interface
+ T2_GLOBALS._uiElements.show();
-void SceneHotspot::doAction(int action) {
- switch ((int)action) {
- case CURSOR_LOOK:
- display(1, 0, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
- break;
- case CURSOR_USE:
- display(1, 5, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
- break;
- case CURSOR_TALK:
- display(1, 15, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ // Re-show the cursor
+ BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor());
+ }
+}
+
+void SceneItem::display2(int resNum, int lineNum) {
+ switch (g_vm->getGameID()) {
+ case GType_BlueForce:
+ display(resNum, lineNum, SET_WIDTH, 312,
+ SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
break;
- case CURSOR_WALK:
+ case GType_Ringworld2:
+ display(resNum, lineNum, SET_WIDTH, 280, SET_X, 20, SET_Y, 20, SET_EXT_BGCOLOR, 60, LIST_END);
break;
default:
- display(2, action, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
break;
}
}
+void SceneItem::display(const Common::String &msg) {
+ assert(g_vm->getGameID() == GType_BlueForce);
+
+ display(-1, -1, msg.c_str(),
+ SET_WIDTH, 312,
+ SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
+ SET_EXT_FGCOLOR, 13, LIST_END);
+}
+
/*--------------------------------------------------------------------------*/
-void NamedHotspot::doAction(int action) {
+bool SceneHotspot::startAction(CursorType action, Event &event) {
switch (action) {
- case CURSOR_WALK:
- // Nothing
- break;
+ case GType_BlueForce: {
+ BlueForce::SceneExt *scene = (BlueForce::SceneExt *)BF_GLOBALS._sceneManager._scene;
+ assert(scene);
+ return scene->display(action);
+ }
+ default:
+ return SceneItem::startAction(action, event);
+ }
+}
+
+void SceneHotspot::doAction(int action) {
+ switch ((int)action) {
case CURSOR_LOOK:
- if (_lookLineNum == -1)
- SceneHotspot::doAction(action);
+ if (g_vm->getGameID() == GType_BlueForce)
+ SceneItem::display(LOOK_SCENE_HOTSPOT);
else
- SceneItem::display(_resnum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ display(1, 0, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
break;
case CURSOR_USE:
- if (_useLineNum == -1)
- SceneHotspot::doAction(action);
+ if (g_vm->getGameID() == GType_BlueForce)
+ SceneItem::display(USE_SCENE_HOTSPOT);
+ else
+ display(1, 5, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ break;
+ case CURSOR_TALK:
+ if (g_vm->getGameID() == GType_BlueForce)
+ SceneItem::display(TALK_SCENE_HOTSPOT);
else
- SceneItem::display(_resnum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ display(1, 15, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ break;
+ case CURSOR_WALK:
break;
default:
- SceneHotspot::doAction(action);
+ if (g_vm->getGameID() == GType_BlueForce)
+ SceneItem::display(DEFAULT_SCENE_HOTSPOT);
+ else
+ display(2, action, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
break;
}
}
-void NamedHotspot::setup(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
- setBounds(ys, xe, ye, xs);
- _resnum = resnum;
- _lookLineNum = lookLineNum;
- _useLineNum = useLineNum;
- _globals->_sceneItems.addItems(this, NULL);
-}
-
-void NamedHotspot::synchronize(Serializer &s) {
- SceneHotspot::synchronize(s);
- s.syncAsSint16LE(_resnum);
- s.syncAsSint16LE(_lookLineNum);
- s.syncAsSint16LE(_useLineNum);
-}
-
/*--------------------------------------------------------------------------*/
void SceneObjectWrapper::setSceneObject(SceneObject *so) {
@@ -1641,12 +1766,17 @@ void SceneObjectWrapper::remove() {
}
void SceneObjectWrapper::dispatch() {
+ if (g_vm->getGameID() == GType_Ringworld)
+ check();
+}
+
+void SceneObjectWrapper::check() {
_visageImages.setVisage(_sceneObject->_visage);
- int frameCount = _visageImages.getFrameCount();
+ int visageCount = _visageImages.getFrameCount();
int angle = _sceneObject->_angle;
int strip = _sceneObject->_strip;
- if (frameCount == 4) {
+ if (visageCount == 4) {
if ((angle > 314) || (angle < 45))
strip = 4;
if ((angle > 44) && (angle < 135))
@@ -1655,7 +1785,7 @@ void SceneObjectWrapper::dispatch() {
strip = 3;
if ((angle >= 225) && (angle < 315))
strip = 2;
- } else if (frameCount == 8) {
+ } else if (visageCount == 8) {
if ((angle > 330) || (angle < 30))
strip = 4;
if ((angle >= 30) && (angle < 70))
@@ -1674,8 +1804,8 @@ void SceneObjectWrapper::dispatch() {
strip = 8;
}
- if (strip > frameCount)
- strip = frameCount;
+ if (strip > visageCount)
+ strip = visageCount;
_sceneObject->setStrip(strip);
}
@@ -1699,9 +1829,12 @@ SceneObject::SceneObject() : SceneHotspot() {
_sceneRegionId = 0;
_percent = 100;
_flags |= OBJFLAG_PANES;
+ _priority = 0;
_frameChange = 0;
_visage = 0;
+ _strip = 0;
+ _frame = 0;
}
SceneObject::SceneObject(const SceneObject &so) : SceneHotspot() {
@@ -1745,7 +1878,7 @@ void SceneObject::animEnded() {
int SceneObject::changeFrame() {
int frameNum = _frame;
- uint32 mouseCtr = _globals->_events.getFrameNumber();
+ uint32 mouseCtr = g_globals->_events.getFrameNumber();
if ((_updateStartFrame <= mouseCtr) || (_animateMode == ANIM_MODE_1)) {
if (_numFrames > 0) {
@@ -1856,7 +1989,7 @@ void SceneObject::addMover(ObjectMover *mover, ...) {
if (mover) {
// Set up the assigned mover
- _walkStartFrame = _globals->_events.getFrameNumber();
+ _walkStartFrame = g_globals->_events.getFrameNumber();
if (_moveRate != 0)
_walkStartFrame = 60 / _moveRate;
@@ -1879,7 +2012,7 @@ void SceneObject::getHorizBounds() {
}
int SceneObject::getRegionIndex() {
- return _globals->_sceneRegions.indexOf(_position);
+ return g_globals->_sceneRegions.indexOf(_position);
}
int SceneObject::checkRegion(const Common::Point &pt) {
@@ -1890,7 +2023,7 @@ int SceneObject::checkRegion(const Common::Point &pt) {
Common::Point savedPos = _position;
_position = pt;
- int regIndex = _globals->_sceneRegions.indexOf(pt);
+ int regIndex = g_globals->_sceneRegions.indexOf(pt);
if (_regionBitList & (1 << regIndex))
regionIndex = regIndex;
@@ -1912,13 +2045,13 @@ int SceneObject::checkRegion(const Common::Point &pt) {
newY -= _yDiff;
SynchronizedList<SceneObject *>::iterator i;
- for (i = _globals->_sceneObjects->begin(); (regionIndex == 0) && (i != _globals->_sceneObjects->end()); ++i) {
+ for (i = g_globals->_sceneObjects->begin(); (regionIndex == 0) && (i != g_globals->_sceneObjects->end()); ++i) {
if ((*i) && ((*i)->_flags & OBJFLAG_CHECK_REGION)) {
int objYDiff = (*i)->_position.y - _yDiff;
if ((objYDiff >= yPos) && (objYDiff <= newY) &&
((*i)->_xs < tempRect.right) && ((*i)->_xe > tempRect.left)) {
// Found index
- regionIndex = -1; //****DEBUG*** = *i;
+ regionIndex = (*i)->_regionIndex;
break;
}
}
@@ -1929,7 +2062,7 @@ int SceneObject::checkRegion(const Common::Point &pt) {
void SceneObject::animate(AnimateMode animMode, ...) {
_animateMode = animMode;
- _updateStartFrame = _globals->_events.getFrameNumber();
+ _updateStartFrame = g_globals->_events.getFrameNumber();
if (_numFrames)
_updateStartFrame += 60 / _numFrames;
@@ -1988,6 +2121,7 @@ void SceneObject::animate(AnimateMode animMode, ...) {
break;
case ANIM_MODE_8:
+ case ANIM_MODE_9:
_field68 = va_arg(va, int);
_endAction = va_arg(va, Action *);
_frameChange = 1;
@@ -2004,9 +2138,19 @@ SceneObject *SceneObject::clone() const {
}
void SceneObject::checkAngle(const SceneObject *obj) {
- _angle = GfxManager::getAngle(_position, obj->_position);
+ checkAngle(obj->_position);
+}
- if (_objectWrapper)
+void SceneObject::checkAngle(const Common::Point &pt) {
+ int angleAmount = GfxManager::getAngle(_position, pt);
+ if (angleAmount != -1) {
+ _angle = angleAmount;
+
+ if (_animateMode == ANIM_MODE_9)
+ _angle = (angleAmount + 180) % 360;
+ }
+
+ if (_objectWrapper && (g_vm->getGameID() == GType_Ringworld))
_objectWrapper->dispatch();
}
@@ -2063,7 +2207,7 @@ void SceneObject::synchronize(Serializer &s) {
void SceneObject::postInit(SceneObjectList *OwnerList) {
if (!OwnerList)
- OwnerList = _globals->_sceneObjects;
+ OwnerList = g_globals->_sceneObjects;
if (!OwnerList->contains(this)) {
_percent = 100;
@@ -2091,7 +2235,7 @@ void SceneObject::postInit(SceneObjectList *OwnerList) {
void SceneObject::remove() {
SceneItem::remove();
- if (_globals->_sceneObjects->contains(this))
+ if (g_globals->_sceneObjects->contains(this))
// For objects in the object list, flag the object for removal in the next drawing, so that
// the drawing code has a chance to restore the area previously covered by the object
_flags |= OBJFLAG_PANES | OBJFLAG_REMOVE | OBJFLAG_HIDE;
@@ -2101,7 +2245,7 @@ void SceneObject::remove() {
}
void SceneObject::dispatch() {
- uint32 currTime = _globals->_events.getFrameNumber();
+ uint32 currTime = g_globals->_events.getFrameNumber();
if (_action)
_action->dispatch();
@@ -2145,7 +2289,7 @@ void SceneObject::dispatch() {
int frameNum = 0;
do {
int count = getFrameCount();
- frameNum = _globals->_randomSource.getRandomNumber(count - 1);
+ frameNum = g_globals->_randomSource.getRandomNumber(count - 1);
} while (frameNum == _frame);
setFrame(frameNum);
@@ -2174,7 +2318,25 @@ void SceneObject::dispatch() {
} else {
setFrame(changeFrame());
}
+ break;
+
+ case ANIM_MODE_9:
+ if (_frame == _endFrame) {
+ if (_frameChange != -1) {
+ _frameChange = -1;
+ _strip = ((_strip - 1) ^ 1) + 1;
+ _endFrame = 1;
+ } else if ((_field68 == 0) || (--_field68 != 0)) {
+ _frameChange = 1;
+ _endFrame = getFrameCount();
+ setFrame(changeFrame());
+ } else {
+ animEnded();
+ }
+ } else {
+ setFrame(changeFrame());
+ }
break;
default:
@@ -2185,7 +2347,7 @@ void SceneObject::dispatch() {
// Handle updating the zoom and/or priority
if (!(_flags & OBJFLAG_ZOOMED)) {
int yp = CLIP((int)_position.y, 0, 255);
- setZoom(_globals->_sceneManager._scene->_zoomPercents[yp]);
+ setZoom(g_globals->_sceneManager._scene->_zoomPercents[yp]);
}
if (!(_flags & OBJFLAG_FIXED_PRIORITY)) {
setPriority(_position.y);
@@ -2199,12 +2361,8 @@ void SceneObject::calcAngle(const Common::Point &pt) {
}
void SceneObject::removeObject() {
- _globals->_sceneItems.remove(this);
- _globals->_sceneObjects->remove(this);
-
- if (_visage) {
- _visage = 0;
- }
+ g_globals->_sceneItems.remove(this);
+ g_globals->_sceneObjects->remove(this);
if (_objectWrapper) {
_objectWrapper->remove();
@@ -2236,11 +2394,11 @@ void SceneObject::reposition() {
*/
void SceneObject::draw() {
Rect destRect = _bounds;
- destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left,
- -_globals->_sceneManager._scene->_sceneBounds.top);
- Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_priority);
+ destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
+ -g_globals->_sceneManager._scene->_sceneBounds.top);
+ Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority);
GfxSurface frame = getFrame();
- _globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
+ g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
}
/**
@@ -2249,20 +2407,32 @@ void SceneObject::draw() {
*/
void SceneObject::updateScreen() {
Rect srcRect = _paneRects[CURRENT_PANENUM];
- const Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
+ const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
srcRect.left = (srcRect.left / 4) * 4;
srcRect.right = ((srcRect.right + 3) / 4) * 4;
- srcRect.clip(_globals->_sceneManager._scene->_sceneBounds);
+ srcRect.clip(g_globals->_sceneManager._scene->_sceneBounds);
if (srcRect.isValidRect()) {
Rect destRect = srcRect;
destRect.translate(-sceneBounds.left, -sceneBounds.top);
- srcRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
+ srcRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y);
- _globals->_screenSurface.copyFrom(_globals->_sceneManager._scene->_backSurface, srcRect, destRect);
+ g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface, srcRect, destRect);
}
}
+void SceneObject::updateAngle(const Common::Point &pt) {
+ checkAngle(pt);
+ if (_objectWrapper)
+ _objectWrapper->check();
+}
+
+void SceneObject::changeAngle(int angle) {
+ _angle = angle;
+ if (_objectWrapper)
+ _objectWrapper->check();
+}
+
void SceneObject::setup(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority) {
postInit();
setVisage(visage);
@@ -2272,6 +2442,33 @@ void SceneObject::setup(int visage, int stripFrameNum, int frameNum, int posX, i
fixPriority(priority);
}
+void SceneObject::setup(int visage, int stripFrameNum, int frameNum) {
+ postInit();
+ setVisage(visage);
+ setStrip(stripFrameNum);
+ setFrame(frameNum);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void BackgroundSceneObject::postInit(SceneObjectList *OwnerList) {
+ SceneObjectList dummyList;
+ SceneObjectList *pList = !g_globals->_sceneManager._scene ? &dummyList :
+ &g_globals->_sceneManager._scene->_bgSceneObjects;
+
+ SceneObject::postInit(pList);
+}
+
+void BackgroundSceneObject::draw() {
+ assert(g_globals->_sceneManager._scene);
+ Rect destRect = _bounds;
+ destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
+ -g_globals->_sceneManager._scene->_sceneBounds.top);
+ Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority);
+ GfxSurface frame = getFrame();
+ g_globals->_sceneManager._scene->_backSurface.copyFrom(frame, destRect, priorityRegion);
+}
+
/*--------------------------------------------------------------------------*/
void SceneObjectList::draw() {
@@ -2282,27 +2479,27 @@ void SceneObjectList::draw() {
if (_objList.size() == 0) {
// Alternate draw mode
- if (_globals->_paneRefreshFlag[paneNum] == 1) {
+ if (g_globals->_paneRefreshFlag[paneNum] == 1) {
// Load the background
- _globals->_sceneManager._scene->refreshBackground(0, 0);
+ g_globals->_sceneManager._scene->refreshBackground(0, 0);
- Rect tempRect = _globals->_sceneManager._scene->_sceneBounds;
- tempRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
- ScenePalette::changeBackground(tempRect, _globals->_sceneManager._fadeMode);
+ Rect tempRect = g_globals->_sceneManager._scene->_sceneBounds;
+ tempRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y);
+ ScenePalette::changeBackground(tempRect, g_globals->_sceneManager._fadeMode);
} else {
- _globals->_paneRegions[CURRENT_PANENUM].draw();
+ g_globals->_paneRegions[CURRENT_PANENUM].draw();
}
- _globals->_paneRegions[CURRENT_PANENUM].setRect(0, 0, 0, 0);
- _globals->_sceneManager.fadeInIfNecessary();
+ g_globals->_paneRegions[CURRENT_PANENUM].setRect(0, 0, 0, 0);
+ g_globals->_sceneManager.fadeInIfNecessary();
} else {
// If there is a scroll follower, check whether it has moved off-screen
- if (_globals->_scrollFollower) {
- const Rect &scrollerRect = _globals->_sceneManager._scrollerRect;
+ if (g_globals->_scrollFollower) {
+ const Rect &scrollerRect = g_globals->_sceneManager._scrollerRect;
Common::Point objPos(
- _globals->_scrollFollower->_position.x - _globals->_sceneManager._scene->_sceneBounds.left,
- _globals->_scrollFollower->_position.y - _globals->_sceneManager._scene->_sceneBounds.top);
+ g_globals->_scrollFollower->_position.x - g_globals->_sceneManager._scene->_sceneBounds.left,
+ g_globals->_scrollFollower->_position.y - g_globals->_sceneManager._scene->_sceneBounds.top);
int loadCount = 0;
if (objPos.x >= scrollerRect.right) {
@@ -2323,21 +2520,21 @@ void SceneObjectList::draw() {
}
if (loadCount > 0)
- _globals->_sceneManager.setBgOffset(Common::Point(xAmount, yAmount), loadCount);
+ g_globals->_sceneManager.setBgOffset(Common::Point(xAmount, yAmount), loadCount);
}
- if (_globals->_sceneManager._sceneLoadCount > 0) {
- --_globals->_sceneManager._sceneLoadCount;
- _globals->_sceneManager._scene->loadBackground(_globals->_sceneManager._sceneBgOffset.x,
- _globals->_sceneManager._sceneBgOffset.y);
+ if (g_globals->_sceneManager._sceneLoadCount > 0) {
+ --g_globals->_sceneManager._sceneLoadCount;
+ g_globals->_sceneManager._scene->loadBackground(g_globals->_sceneManager._sceneBgOffset.x,
+ g_globals->_sceneManager._sceneBgOffset.y);
}
// Set up the flag mask
uint32 flagMask = (paneNum == 0) ? OBJFLAG_PANE_0 : OBJFLAG_PANE_1;
// Initial loop to set up object list and update object position, priority, and flags
- for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin();
- i != _globals->_sceneObjects->end(); ++i) {
+ for (SynchronizedList<SceneObject *>::iterator i = g_globals->_sceneObjects->begin();
+ i != g_globals->_sceneObjects->end(); ++i) {
SceneObject *obj = *i;
objList.push_back(obj);
@@ -2350,10 +2547,10 @@ void SceneObjectList::draw() {
// Handle updating object priority
if (!(obj->_flags & OBJFLAG_FIXED_PRIORITY)) {
obj->_priority = MIN((int)obj->_position.y,
- (int)_globals->_sceneManager._scene->_backgroundBounds.bottom - 1);
+ (int)g_globals->_sceneManager._scene->_backgroundBounds.bottom - 1);
}
- if ((_globals->_paneRefreshFlag[paneNum] != 0) || !_globals->_paneRegions[paneNum].empty()) {
+ if ((g_globals->_paneRefreshFlag[paneNum] != 0) || !g_globals->_paneRegions[paneNum].empty()) {
obj->_flags |= flagMask;
}
}
@@ -2362,20 +2559,20 @@ void SceneObjectList::draw() {
checkIntersection(objList, objList.size(), CURRENT_PANENUM);
sortList(objList);
- if (_globals->_paneRefreshFlag[paneNum] == 1) {
+ if (g_globals->_paneRefreshFlag[paneNum] == 1) {
// Load the background
- _globals->_sceneManager._scene->refreshBackground(0, 0);
+ g_globals->_sceneManager._scene->refreshBackground(0, 0);
}
- _globals->_sceneManager._scene->_sceneBounds.left &= ~3;
- _globals->_sceneManager._scene->_sceneBounds.right &= ~3;
- _globals->_sceneOffset.x &= ~3;
+ g_globals->_sceneManager._scene->_sceneBounds.left &= ~3;
+ g_globals->_sceneManager._scene->_sceneBounds.right &= ~3;
+ g_globals->_sceneOffset.x &= ~3;
- if (_globals->_paneRefreshFlag[paneNum] != 0) {
+ if (g_globals->_paneRefreshFlag[paneNum] != 0) {
// Change the background
- Rect tempRect = _globals->_sceneManager._scene->_sceneBounds;
- tempRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
- ScenePalette::changeBackground(tempRect, _globals->_sceneManager._fadeMode);
+ Rect tempRect = g_globals->_sceneManager._scene->_sceneBounds;
+ tempRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y);
+ ScenePalette::changeBackground(tempRect, g_globals->_sceneManager._fadeMode);
} else {
for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
SceneObject *obj = objList[objIndex];
@@ -2384,10 +2581,10 @@ void SceneObjectList::draw() {
obj->updateScreen();
}
- _globals->_paneRegions[paneNum].draw();
+ g_globals->_paneRegions[paneNum].draw();
}
- _globals->_paneRegions[paneNum].setRect(0, 0, 0, 0);
+ g_globals->_paneRegions[paneNum].setRect(0, 0, 0, 0);
redraw:
// Main draw loop
for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
@@ -2400,9 +2597,9 @@ redraw:
}
// Update the palette
- _globals->_sceneManager.fadeInIfNecessary();
- _globals->_sceneManager._loadMode = 0;
- _globals->_paneRefreshFlag[paneNum] = 0;
+ g_globals->_sceneManager.fadeInIfNecessary();
+ g_globals->_sceneManager._loadMode = 0;
+ g_globals->_paneRefreshFlag[paneNum] = 0;
// Loop through the object list, removing any objects and refreshing the screen as necessary
for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
@@ -2485,9 +2682,9 @@ void SceneObjectList::sortList(Common::Array<SceneObject *> &ObjList) {
}
void SceneObjectList::activate() {
- SceneObjectList *objectList = _globals->_sceneObjects;
- _globals->_sceneObjects = this;
- _globals->_sceneObjects_queue.push_front(this);
+ SceneObjectList *objectList = g_globals->_sceneObjects;
+ g_globals->_sceneObjects = this;
+ g_globals->_sceneObjects_queue.push_front(this);
// Flag all the objects as modified
SynchronizedList<SceneObject *>::iterator i;
@@ -2504,19 +2701,19 @@ void SceneObjectList::activate() {
}
void SceneObjectList::deactivate() {
- if (_globals->_sceneObjects_queue.size() <= 1)
+ if (g_globals->_sceneObjects_queue.size() <= 1)
return;
- SceneObjectList *objectList = *_globals->_sceneObjects_queue.begin();
- _globals->_sceneObjects_queue.pop_front();
- _globals->_sceneObjects = *_globals->_sceneObjects_queue.begin();
+ SceneObjectList *objectList = *g_globals->_sceneObjects_queue.begin();
+ g_globals->_sceneObjects_queue.pop_front();
+ g_globals->_sceneObjects = *g_globals->_sceneObjects_queue.begin();
SynchronizedList<SceneObject *>::iterator i;
for (i = objectList->begin(); i != objectList->end(); ++i) {
if (!((*i)->_flags & OBJFLAG_CLONED)) {
SceneObject *sceneObj = (*i)->clone();
sceneObj->_flags |= OBJFLAG_HIDE | OBJFLAG_REMOVE | OBJFLAG_CLONED;
- _globals->_sceneObjects->push_front(sceneObj);
+ g_globals->_sceneObjects->push_front(sceneObj);
}
}
}
@@ -2545,6 +2742,14 @@ void SceneText::setup(const Common::String &msg) {
gfxMan.activate();
Rect textRect;
+ if ((g_vm->getGameID() != GType_Ringworld) && g_globals->_sceneObjects->contains(this) &&
+ (_flags & OBJFLAG_REMOVE)) {
+ // Trying to setup a SceneText scheduled to be removed, so remove it now
+ _bounds.expandPanes();
+ this->removeObject();
+ g_globals->_sceneObjects->remove(this);
+ }
+
gfxMan._font.setFontNumber(_fontNumber);
gfxMan._font._colors.foreground = _color1;
gfxMan._font._colors2.background = _color2;
@@ -2582,12 +2787,21 @@ void SceneText::synchronize(Serializer &s) {
_textSurface.synchronize(s);
}
+void SceneText::updateScreen() {
+ // FIXME: Hack for Blue Force to handle not refreshing the screen if the user interface
+ // has been re-activated after showing some scene text
+ if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < UI_INTERFACE_Y) ||
+ !T2_GLOBALS._uiElements._visible)
+ SceneObject::updateScreen();
+}
+
/*--------------------------------------------------------------------------*/
Visage::Visage() {
- _resNum = 0;
- _rlbNum = 0;
+ _resNum = -1;
+ _rlbNum = -1;
_data = NULL;
+ _flipHoriz = false;
}
Visage::Visage(const Visage &v) {
@@ -2595,7 +2809,7 @@ Visage::Visage(const Visage &v) {
_rlbNum = v._rlbNum;
_data = v._data;
if (_data)
- _vm->_memoryManager.incLocks(_data);
+ g_vm->_memoryManager.incLocks(_data);
}
Visage &Visage::operator=(const Visage &s) {
@@ -2603,7 +2817,7 @@ Visage &Visage::operator=(const Visage &s) {
_rlbNum = s._rlbNum;
_data = s._data;
if (_data)
- _vm->_memoryManager.incLocks(_data);
+ g_vm->_memoryManager.incLocks(_data);
return *this;
}
@@ -2613,7 +2827,37 @@ void Visage::setVisage(int resNum, int rlbNum) {
_resNum = resNum;
_rlbNum = rlbNum;
DEALLOCATE(_data);
- _data = _resourceManager->getResource(RES_VISAGE, resNum, rlbNum);
+
+ if (g_vm->getGameID() == GType_Ringworld) {
+ // In Ringworld, we immediately get the data
+ _data = g_resourceManager->getResource(RES_VISAGE, resNum, rlbNum);
+ } else {
+ // Games after Ringworld have an extra indirection via the visage index file
+ byte *indexData = g_resourceManager->getResource(RES_VISAGE, resNum, 9999);
+ if (rlbNum == 9999) {
+ _data = indexData;
+ } else {
+ if (rlbNum == 0)
+ rlbNum = 1;
+
+ // Check how many slots there are
+ uint16 count = READ_LE_UINT16(indexData);
+ if (rlbNum > count)
+ rlbNum = count;
+
+ // Get the flags/rlbNum to use
+ uint32 v = READ_LE_UINT32(indexData + (rlbNum - 1) * 4 + 2);
+ int flags = v >> 30;
+
+ if (flags & 3) {
+ rlbNum = (int)(v & 0xff);
+ }
+ _flipHoriz = flags & 1;
+
+ _data = g_resourceManager->getResource(RES_VISAGE, resNum, rlbNum);
+ }
+ }
+
assert(_data);
}
}
@@ -2632,17 +2876,33 @@ GfxSurface Visage::getFrame(int frameNum) {
int offset = READ_LE_UINT32(_data + 2 + frameNum * 4);
byte *frameData = _data + offset;
- return surfaceFromRes(frameData);
+ GfxSurface result = surfaceFromRes(frameData);
+ if (_flipHoriz) flip(result);
+ return result;
}
int Visage::getFrameCount() const {
return READ_LE_UINT16(_data);
}
+void Visage::flip(GfxSurface &gfxSurface) {
+ Graphics::Surface s = gfxSurface.lockSurface();
+
+ for (int y = 0; y < s.h; ++y) {
+ // Flip the line
+ byte *lineP = (byte *)s.getBasePtr(0, y);
+ for (int x = 0; x < (s.w / 2); ++x)
+ SWAP(lineP[x], lineP[s.w - x - 1]);
+ }
+
+ gfxSurface.unlockSurface();
+}
+
/*--------------------------------------------------------------------------*/
Player::Player(): SceneObject() {
_canWalk = false;
+ _enabled = false;
_uiEnabled = false;
_field8C = 0;
}
@@ -2661,35 +2921,63 @@ void Player::postInit(SceneObjectList *OwnerList) {
void Player::disableControl() {
_canWalk = false;
_uiEnabled = false;
- _globals->_events.setCursor(CURSOR_NONE);
+ g_globals->_events.setCursor(CURSOR_NONE);
+ _enabled = false;
+
+ if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active)
+ T2_GLOBALS._uiElements.hide();
}
void Player::enableControl() {
+ CursorType cursor;
+
_canWalk = true;
_uiEnabled = true;
- _globals->_events.setCursor(CURSOR_WALK);
+ _enabled = true;
- switch (_globals->_events.getCursor()) {
- case CURSOR_WALK:
- case CURSOR_LOOK:
- case CURSOR_USE:
- case CURSOR_TALK:
- _globals->_events.setCursor(_globals->_events.getCursor());
+ switch (g_vm->getGameID()) {
+ case GType_BlueForce:
+ case GType_Ringworld2:
+ cursor = g_globals->_events.getCursor();
+ g_globals->_events.setCursor(cursor);
+
+ if (T2_GLOBALS._uiElements._active)
+ T2_GLOBALS._uiElements.show();
break;
+
default:
- _globals->_events.setCursor(CURSOR_WALK);
+ // Ringworld
+ g_globals->_events.setCursor(CURSOR_WALK);
+
+ switch (g_globals->_events.getCursor()) {
+ case CURSOR_WALK:
+ case CURSOR_LOOK:
+ case CURSOR_USE:
+ case CURSOR_TALK:
+ g_globals->_events.setCursor(g_globals->_events.getCursor());
+ break;
+ default:
+ g_globals->_events.setCursor(CURSOR_WALK);
+ break;
+ }
break;
}
}
void Player::process(Event &event) {
+ if ((g_vm->getGameID() != GType_Ringworld) && _action)
+ _action->process(event);
+
if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN) &&
- (_globals->_events.getCursor() == CURSOR_WALK) && _globals->_player._canWalk &&
- (_position != event.mousePos) && _globals->_sceneObjects->contains(this)) {
+ (g_globals->_events.getCursor() == CURSOR_WALK) && g_globals->_player._canWalk &&
+ (_position != event.mousePos) && g_globals->_sceneObjects->contains(this)) {
+
+ if ((g_vm->getGameID() == GType_BlueForce) && !BF_GLOBALS._player._enabled)
+ return;
PlayerMover *newMover = new PlayerMover();
- Common::Point destPos(event.mousePos.x + _globals->_sceneManager._scene->_sceneBounds.left,
- event.mousePos.y + _globals->_sceneManager._scene->_sceneBounds.top);
+ Common::Point destPos(event.mousePos.x + g_globals->_sceneManager._scene->_sceneBounds.left,
+ event.mousePos.y + g_globals->_sceneManager._scene->_sceneBounds.top);
addMover(newMover, &destPos, NULL);
event.handled = true;
@@ -2702,6 +2990,9 @@ void Player::synchronize(Serializer &s) {
s.syncAsByte(_canWalk);
s.syncAsByte(_uiEnabled);
s.syncAsSint16LE(_field8C);
+
+ if (g_vm->getGameID() == GType_BlueForce)
+ s.syncAsByte(_enabled);
}
/*--------------------------------------------------------------------------*/
@@ -2709,7 +3000,7 @@ void Player::synchronize(Serializer &s) {
Region::Region(int resNum, int rlbNum, ResourceType ctlType) {
_regionId = rlbNum;
- byte *regionData = _resourceManager->getResource(ctlType, resNum, rlbNum);
+ byte *regionData = g_resourceManager->getResource(ctlType, resNum, rlbNum);
assert(regionData);
load(regionData);
@@ -2844,7 +3135,7 @@ LineSliceSet Region::mergeSlices(const LineSliceSet &set1, const LineSliceSet &s
* Copies the background covered by the given region to the screen surface
*/
void Region::draw() {
- Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
+ Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
for (int yp = sceneBounds.top; yp < sceneBounds.bottom; ++yp) {
// Generate a line slice set
@@ -2859,10 +3150,10 @@ void Region::draw() {
rect1.right = (rect1.right + 3) & ~3;
Rect rect2 = rect1;
- rect1.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
+ rect1.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y);
rect2.translate(-sceneBounds.left, -sceneBounds.top);
- _globals->gfxManager().getSurface().copyFrom(_globals->_sceneManager._scene->_backSurface,
+ g_globals->gfxManager().getSurface().copyFrom(g_globals->_sceneManager._scene->_backSurface,
rect1, rect2);
}
}
@@ -2927,8 +3218,8 @@ void Region::uniteRect(const Rect &rect) {
void SceneRegions::load(int sceneNum) {
clear();
- bool altRegions = _vm->getFeatures() & GF_ALT_REGIONS;
- byte *regionData = _resourceManager->getResource(RES_CONTROL, sceneNum, altRegions ? 1 : 9999, true);
+ bool altRegions = g_vm->getFeatures() & GF_ALT_REGIONS;
+ byte *regionData = g_resourceManager->getResource(RES_CONTROL, sceneNum, altRegions ? 1 : 9999, true);
if (regionData) {
int regionCount = READ_LE_UINT16(regionData);
@@ -3149,7 +3440,7 @@ void WalkRegions::load(int sceneNum) {
clear();
_resNum = sceneNum;
- if (_vm->getFeatures() & GF_ALT_REGIONS) {
+ if (g_vm->getFeatures() & GF_ALT_REGIONS) {
loadRevised();
} else {
loadOriginal();
@@ -3160,7 +3451,7 @@ void WalkRegions::load(int sceneNum) {
* This version handles loading walk regions for Ringworld floppy version and Demo #1
*/
void WalkRegions::loadOriginal() {
- byte *regionData = _resourceManager->getResource(RES_WALKRGNS, _resNum, 1, true);
+ byte *regionData = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 1, true);
if (!regionData) {
// No data, so return
_resNum = -1;
@@ -3171,8 +3462,8 @@ void WalkRegions::loadOriginal() {
int dataSize;
// Load the field 18 list
- dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 2);
- dataSize = _vm->_memoryManager.getSize(dataP);
+ dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 2);
+ dataSize = g_vm->_memoryManager.getSize(dataP);
assert(dataSize % 10 == 0);
byte *p = dataP;
@@ -3185,8 +3476,8 @@ void WalkRegions::loadOriginal() {
DEALLOCATE(dataP);
// Load the idx list
- dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 3);
- dataSize = _vm->_memoryManager.getSize(dataP);
+ dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 3);
+ dataSize = g_vm->_memoryManager.getSize(dataP);
assert(dataSize % 2 == 0);
p = dataP;
@@ -3196,8 +3487,8 @@ void WalkRegions::loadOriginal() {
DEALLOCATE(dataP);
// Load the secondary idx list
- dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 4);
- dataSize = _vm->_memoryManager.getSize(dataP);
+ dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 4);
+ dataSize = g_vm->_memoryManager.getSize(dataP);
assert(dataSize % 2 == 0);
p = dataP;
@@ -3207,7 +3498,7 @@ void WalkRegions::loadOriginal() {
DEALLOCATE(dataP);
// Handle the loading of the actual regions themselves
- dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 5);
+ dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 5);
byte *pWalkRegion = regionData + 16;
byte *srcP = dataP;
@@ -3238,7 +3529,7 @@ void WalkRegions::loadOriginal() {
* version, it may also be used by future game titles
*/
void WalkRegions::loadRevised() {
- byte *regionData = _resourceManager->getResource(RES_WALKRGNS, _resNum, 2, true);
+ byte *regionData = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 2, true);
if (!regionData) {
// No data, so return
_resNum = -1;
@@ -3321,8 +3612,8 @@ void ScenePriorities::load(int resNum) {
_resNum = resNum;
clear();
- bool altMode = (_vm->getFeatures() & GF_ALT_REGIONS) != 0;
- byte *regionData = _resourceManager->getResource(RES_PRIORITY, resNum, altMode ? 1 : 9999, true);
+ bool altMode = (g_vm->getFeatures() & GF_ALT_REGIONS) != 0;
+ byte *regionData = g_resourceManager->getResource(RES_PRIORITY, resNum, altMode ? 1 : 9999, true);
if (!regionData)
return;
@@ -3346,8 +3637,11 @@ void ScenePriorities::load(int resNum) {
Region *ScenePriorities::find(int priority) {
// If no priority regions are loaded, then return the placeholder region
- if (empty())
- return &_defaultPriorityRegion;
+ if (empty()) {
+ if (g_vm->getGameID() == GType_Ringworld)
+ return &_defaultPriorityRegion;
+ return NULL;
+ }
if (priority > 255)
priority = 255;
@@ -3400,8 +3694,8 @@ GameHandler::GameHandler() : EventHandler() {
}
GameHandler::~GameHandler() {
- if (_globals)
- _globals->_game->removeHandler(this);
+ if (g_globals)
+ g_globals->_game->removeHandler(this);
}
void GameHandler::execute() {
@@ -3426,93 +3720,142 @@ void GameHandler::synchronize(Serializer &s) {
SceneHandler::SceneHandler() {
_saveGameSlot = -1;
_loadGameSlot = -1;
+ _prevFrameNumber = 0;
}
void SceneHandler::registerHandler() {
postInit();
- _globals->_game->addHandler(this);
+ g_globals->_game->addHandler(this);
+}
+
+uint32 SceneHandler::getFrameDifference() {
+ return GLOBALS._events.getFrameNumber() - _prevFrameNumber;
}
void SceneHandler::postInit(SceneObjectList *OwnerList) {
_delayTicks = 2;
- _globals->_scenePalette.loadPalette(0);
- _globals->_scenePalette.refresh();
+ g_globals->_scenePalette.loadPalette(0);
+ g_globals->_scenePalette.refresh();
- _globals->_soundManager.postInit();
- _globals->_soundManager.buildDriverList(true);
- _globals->_soundManager.installConfigDrivers();
+ g_globals->_soundManager.postInit();
+ g_globals->_soundManager.buildDriverList(true);
+ g_globals->_soundManager.installConfigDrivers();
- _globals->_game->start();
+ g_globals->_game->start();
}
void SceneHandler::process(Event &event) {
// Main keypress handler
if (!event.handled) {
- _globals->_game->processEvent(event);
+ g_globals->_game->processEvent(event);
if (event.eventType == EVENT_KEYPRESS)
- _globals->_events.setCursorFromFlag();
+ g_globals->_events.setCursorFromFlag();
}
// Check for displaying right-click dialog
if ((event.eventType == EVENT_BUTTON_DOWN) && (event.btnState == BTNSHIFT_RIGHT) &&
- _globals->_player._uiEnabled) {
- RightClickDialog *dlg = new RightClickDialog();
- dlg->execute();
- delete dlg;
+ g_globals->_player._uiEnabled) {
+ g_globals->_game->rightClick();
event.handled = true;
return;
}
// If there is an active scene, pass the event to it
- if (_globals->_sceneManager._scene)
- _globals->_sceneManager._scene->process(event);
+ if (g_globals->_sceneManager._scene)
+ g_globals->_sceneManager._scene->process(event);
if (!event.handled) {
// Separate check for F5 - Save key
if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_F5)) {
// F5 - Save
- _globals->_game->saveGame();
+ g_globals->_game->saveGame();
event.handled = true;
- _globals->_events.setCursorFromFlag();
+ g_globals->_events.setCursorFromFlag();
}
// Check for debugger
if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_d) &&
(event.kbd.flags & Common::KBD_CTRL)) {
// Attach to the debugger
- _vm->_debugger->attach();
- _vm->_debugger->onFrame();
+ g_vm->_debugger->attach();
+ g_vm->_debugger->onFrame();
+ }
+
+ if ((event.eventType == EVENT_KEYPRESS) && g_globals->_player._enabled && g_globals->_player._canWalk) {
+ // Keyboard shortcuts for different actions
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_w:
+ g_globals->_events.setCursor(CURSOR_WALK);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_l:
+ g_globals->_events.setCursor(CURSOR_LOOK);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_u:
+ g_globals->_events.setCursor(CURSOR_USE);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_t:
+ g_globals->_events.setCursor(CURSOR_TALK);
+ event.handled = true;
+ break;
+ default:
+ break;
+ }
}
// Mouse press handling
- if (_globals->_player._uiEnabled && (event.eventType == EVENT_BUTTON_DOWN) &&
- !_globals->_sceneItems.empty()) {
+ bool enabled = (g_vm->getGameID() == GType_BlueForce) ? g_globals->_player._enabled :
+ g_globals->_player._uiEnabled;
+ if (enabled && (event.eventType == EVENT_BUTTON_DOWN) && !g_globals->_sceneItems.empty()) {
+ // Check if the mouse is on the player
+ if (g_globals->_player.contains(event.mousePos)) {
+ playerAction(event);
+ if (event.handled)
+ return;
+ }
+
// Scan the item list to find one the mouse is within
- SynchronizedList<SceneItem *>::iterator i = _globals->_sceneItems.begin();
- while ((i != _globals->_sceneItems.end()) && !(*i)->contains(event.mousePos))
- ++i;
-
- if (i != _globals->_sceneItems.end()) {
- // Pass the action to the item
- (*i)->doAction(_globals->_events.getCursor());
- event.handled = _globals->_events.getCursor() != CURSOR_WALK;
-
- if (_globals->_player._uiEnabled && _globals->_player._canWalk &&
- (_globals->_events.getCursor() != CURSOR_LOOK)) {
- _globals->_events.setCursor(CURSOR_WALK);
- } else if (_globals->_player._canWalk && (_globals->_events.getCursor() != CURSOR_LOOK)) {
- _globals->_events.setCursor(CURSOR_WALK);
- } else if (_globals->_player._uiEnabled && (_globals->_events.getCursor() != CURSOR_LOOK)) {
- _globals->_events.setCursor(CURSOR_USE);
+ SynchronizedList<SceneItem *>::iterator i;
+ for (i = g_globals->_sceneItems.begin(); i != g_globals->_sceneItems.end(); ++i) {
+ if ((*i)->contains(event.mousePos)) {
+ // Pass the action to the item
+ bool handled = (*i)->startAction(g_globals->_events.getCursor(), event);
+ if (!handled)
+ // Item wasn't handled, keep scanning
+ continue;
+
+ if ((g_vm->getGameID() == GType_Ringworld) || (g_globals->_events.getCursor() == CURSOR_9999)) {
+ event.handled = g_globals->_events.getCursor() != CURSOR_WALK;
+
+ if (g_globals->_player._uiEnabled && g_globals->_player._canWalk &&
+ (g_globals->_events.getCursor() != CURSOR_LOOK)) {
+ g_globals->_events.setCursor(CURSOR_WALK);
+ } else if (g_globals->_player._canWalk && (g_globals->_events.getCursor() != CURSOR_LOOK)) {
+ g_globals->_events.setCursor(CURSOR_WALK);
+ } else if (g_globals->_player._uiEnabled && (g_globals->_events.getCursor() != CURSOR_LOOK)) {
+ g_globals->_events.setCursor(CURSOR_USE);
+ }
+
+ if (g_vm->getGameID() == GType_BlueForce)
+ event.handled = true;
+ } else if (g_vm->getGameID() != GType_Ringworld) {
+ event.handled = true;
+ }
+ break;
}
}
- // Handle player processing
- _globals->_player.process(event);
+ // Handle any fallback text display
+ processEnd(event);
}
+
+ // Handle player processing
+ g_globals->_player.process(event);
}
}
@@ -3521,7 +3864,7 @@ void SceneHandler::dispatch() {
if (_saveGameSlot != -1) {
int saveSlot = _saveGameSlot;
_saveGameSlot = -1;
- Common::Error err = _saver->save(saveSlot, _saveName);
+ Common::Error err = g_saver->save(saveSlot, _saveName);
// FIXME: Make use of the description string in err to enhance
// the error reported to the user.
if (err.getCode() != Common::kNoError)
@@ -3530,40 +3873,49 @@ void SceneHandler::dispatch() {
if (_loadGameSlot != -1) {
int loadSlot = _loadGameSlot;
_loadGameSlot = -1;
- _saver->restore(loadSlot);
- _globals->_events.setCursorFromFlag();
+ g_saver->restore(loadSlot);
+ g_globals->_events.setCursorFromFlag();
}
- _globals->_soundManager.dispatch();
- _globals->_scenePalette.signalListeners();
+ g_globals->_soundManager.dispatch();
+ g_globals->_scenePalette.signalListeners();
// Dispatch to any objects registered in the scene
- _globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
+ g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
// If a scene is active, then dispatch to it
- if (_globals->_sceneManager._scene)
- _globals->_sceneManager._scene->dispatch();
+ if (g_globals->_sceneManager._scene)
+ g_globals->_sceneManager._scene->dispatch();
// Not actually used
//_eventListeners.forEach(SceneHandler::handleListener);
- // Handle pending eents
+ // Handle pending events
Event event;
- while (_globals->_events.getEvent(event))
+ if (g_globals->_events.getEvent(event)) {
+ // Process pending events
+ do {
+ process(event);
+ } while (g_globals->_events.getEvent(event));
+ } else if (g_vm->getGameID() == GType_BlueForce) {
+ // For Blue Force, 'none' events need to be generated in the absence of any
+ event.eventType = EVENT_NONE;
+ event.mousePos = g_globals->_events._mousePos;
process(event);
+ }
// Handle drawing the contents of the scene
- if (_globals->_sceneManager._scene)
- _globals->_sceneObjects->draw();
+ if (g_globals->_sceneManager._scene)
+ g_globals->_sceneObjects->draw();
// Check to see if any scene change is required
- _globals->_sceneManager.checkScene();
+ g_globals->_sceneManager.checkScene();
// Signal the ScummVM debugger
- _vm->_debugger->onFrame();
+ g_vm->_debugger->onFrame();
// Delay between frames
- _globals->_events.delay(_delayTicks);
+ g_globals->_events.delay(_delayTicks);
}
void SceneHandler::dispatchObject(EventHandler *obj) {
@@ -3573,4 +3925,4 @@ void SceneHandler::dispatchObject(EventHandler *obj) {
void SceneHandler::saveListener(Serializer &ser) {
}
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index b86e2f63fe..0137134583 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -34,7 +34,7 @@
#include "tsage/resources.h"
#include "tsage/saveload.h"
-namespace tSage {
+namespace TsAGE {
#define MAX_FLAGS 256
@@ -55,8 +55,14 @@ public:
CursorType _cursorId;
Common::String _description;
int _iconResNum;
+
+ int _visage;
+ int _strip;
+ int _frame;
public:
InvObject(int sceneNumber, int rlbNum, int cursorNum, CursorType cursorId, const Common::String description);
+ InvObject(int visage, int strip, int frame);
+ InvObject(int visage, int strip);
bool inInventory() const { return _sceneNumber == 1; }
void setCursor();
@@ -73,6 +79,9 @@ public:
InvObject *_selectedItem;
InvObjectList();
+ int indexOf(InvObject *obj) const;
+ InvObject *getItem(int objectNum);
+ int getObjectScene(int objectNum);
virtual Common::String getClassName() { return "InvObjectList"; }
virtual void synchronize(Serializer &s);
@@ -157,6 +166,18 @@ public:
int _state;
};
+#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+ g_globals->_player.addMover(mover, &pt, this); }
+#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+ OBJ.addMover(mover, &pt, NULL); }
+#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+ OBJ.addMover(mover, &pt, this); }
+
+#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
+ OBJ.addMover(mover, &pt, this); }
+#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
+ OBJ.addMover(mover, &pt, NULL); }
+
class ObjectMover : public EventHandler {
public:
Common::Point _destPosition;
@@ -287,7 +308,7 @@ public:
PaletteModifierCached();
- void setPalette(ScenePalette *palette, int step);
+ virtual void setPalette(ScenePalette *palette, int step);
virtual Common::String getClassName() { return "PaletteModifierCached"; }
virtual void synchronize(Serializer &s);
};
@@ -323,6 +344,7 @@ public:
virtual void synchronize(Serializer &s);
virtual void signal();
virtual void remove();
+ virtual void setPalette(ScenePalette *palette, int step);
};
/*--------------------------------------------------------------------------*/
@@ -350,13 +372,14 @@ public:
bool loadPalette(int paletteNum);
void refresh();
void setPalette(int index, int count);
+ void setEntry(int index, uint r, uint g, uint b);
uint8 indexOf(uint r, uint g, uint b, int threshold = 0xffff);
void getPalette(int start = 0, int count = 256);
void signalListeners();
void clearListeners();
void fade(const byte *adjustData, bool fullAdjust, int percent);
PaletteRotation *addRotation(int start, int end, int rotationMode, int duration = 0, Action *action = NULL);
- PaletteFader *addFader(const byte *arrBufferRGB, int palSize, int percent, Action *action);
+ PaletteFader *addFader(const byte *arrBufferRGB, int palSize, int step, Action *action);
static void changeBackground(const Rect &bounds, FadeMode fadeMode);
@@ -393,16 +416,15 @@ public:
virtual Common::String getClassName() { return "SceneItem"; }
virtual void remove();
virtual void destroy() {}
- virtual void startMover(CursorType action) { doAction(action); }
+ virtual bool startAction(CursorType action, Event &event);
virtual void doAction(int action);
bool contains(const Common::Point &pt);
void setBounds(const Rect &newBounds) { _bounds = newBounds; }
void setBounds(const int ys, const int xe, const int ye, const int xs) { _bounds = Rect(MIN(xs, xe), MIN(ys, ye), MAX(xs, xe), MAX(ys, ye)); }
static void display(int resNum, int lineNum, ...);
- static void display2(int resNum, int lineNum) {
- display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
- }
+ static void display2(int resNum, int lineNum);
+ static void display(const Common::String &msg);
};
class SceneItemExt : public SceneItem {
@@ -419,33 +441,28 @@ public:
class SceneHotspot : public SceneItem {
public:
SceneHotspot() : SceneItem() {}
-
+ virtual bool startAction(CursorType action, Event &event);
virtual Common::String getClassName() { return "SceneHotspot"; }
virtual void doAction(int action);
};
-class NamedHotspot : public SceneHotspot {
-public:
- int _resnum, _lookLineNum, _useLineNum;
- NamedHotspot() : SceneHotspot() {}
-
- void setup(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
- virtual void doAction(int action);
- virtual Common::String getClassName() { return "NamedHotspot"; }
- virtual void synchronize(Serializer &s);
-};
-
enum AnimateMode {ANIM_MODE_NONE = 0, ANIM_MODE_1 = 1, ANIM_MODE_2 = 2, ANIM_MODE_3 = 3,
- ANIM_MODE_4 = 4, ANIM_MODE_5 = 5, ANIM_MODE_6 = 6, ANIM_MODE_7 = 7, ANIM_MODE_8 = 8};
+ ANIM_MODE_4 = 4, ANIM_MODE_5 = 5, ANIM_MODE_6 = 6, ANIM_MODE_7 = 7, ANIM_MODE_8 = 8,
+ // Introduced in Blue Force
+ ANIM_MODE_9 = 9
+};
class SceneObject;
class Visage {
private:
byte *_data;
+
+ void flip(GfxSurface &s);
public:
int _resNum;
int _rlbNum;
+ bool _flipHoriz;
public:
Visage();
Visage(const Visage &v);
@@ -454,7 +471,7 @@ public:
void setVisage(int resNum, int rlbNum = 9999);
GfxSurface getFrame(int frameNum);
int getFrameCount() const;
- Visage &operator=(const Visage &s);
+ Visage &operator=(const Visage &gfxSurface);
};
class SceneObjectWrapper : public EventHandler {
@@ -467,6 +484,7 @@ public:
virtual ~SceneObjectWrapper() {}
void setSceneObject(SceneObject *so);
+ void check();
virtual void synchronize(Serializer &s);
virtual Common::String getClassName() { return "SceneObjectWrapper"; }
@@ -487,7 +505,6 @@ private:
int getNewFrame();
void animEnded();
int changeFrame();
- bool isNoMover() const { return !_mover || (_regionIndex > 0); }
public:
uint32 _updateStartFrame;
uint32 _walkStartFrame;
@@ -537,10 +554,12 @@ public:
void animate(AnimateMode animMode, ...);
SceneObject *clone() const;
void checkAngle(const SceneObject *obj);
+ void checkAngle(const Common::Point &pt);
void hide();
void show();
int getSpliceArea(const SceneObject *obj);
int getFrameCount();
+ bool isNoMover() const { return !_mover || (_regionIndex > 0); }
virtual void synchronize(Serializer &s);
virtual Common::String getClassName() { return "SceneObject"; }
@@ -555,18 +574,19 @@ public:
virtual void draw();
virtual void proc19() {}
virtual void updateScreen();
+ // New methods introduced by Blue Force
+ virtual void updateAngle(const Common::Point &pt);
+ virtual void changeAngle(int angle);
+
void setup(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority);
+ void setup(int visage, int stripFrameNum, int frameNum);
};
-class SceneObjectExt : public SceneObject {
+class BackgroundSceneObject: public SceneObject {
public:
- int _state;
-
- virtual void synchronize(Serializer &s) {
- SceneObject::synchronize(s);
- s.syncAsSint16LE(_state);
- }
- virtual Common::String getClassName() { return "SceneObjectExt"; }
+ virtual Common::String getClassName() { return "BackgroundSceneObject"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void draw();
};
class SceneText : public SceneObject {
@@ -587,6 +607,7 @@ public:
virtual void synchronize(Serializer &s);
virtual Common::String getClassName() { return "SceneText"; }
virtual GfxSurface getFrame() { return _textSurface; }
+ virtual void updateScreen();
};
class Player : public SceneObject {
@@ -594,6 +615,7 @@ public:
bool _canWalk;
bool _uiEnabled;
int _field8C;
+ bool _enabled;
public:
Player();
@@ -695,13 +717,14 @@ public:
SynchronizedList<SceneObject *>::iterator begin() { return _objList.begin(); }
SynchronizedList<SceneObject *>::iterator end() { return _objList.end(); }
int size() const { return _objList.size(); }
- bool contains(SceneObject *sceneObj) { return tSage::contains(_objList, sceneObj); }
+ bool contains(SceneObject *sceneObj) { return TsAGE::contains(_objList, sceneObj); }
void push_back(SceneObject *sceneObj) { _objList.push_back(sceneObj); }
void push_front(SceneObject *sceneObj) { _objList.push_front(sceneObj); }
void remove(SceneObject *sceneObj) {
_objList.remove(sceneObj);
_listAltered = true;
}
+ void clear() { _objList.clear(); }
};
class ScenePriorities : public Common::List<Region> {
@@ -788,6 +811,8 @@ public:
assert((idx >= 1) && (idx <= (int)_regionList.size()));
return _regionList[idx - 1];
}
+ void proc1(int v) { warning("TODO: WalkRegions::proc1"); }
+ void proc2(int v) { warning("TODO: WalkRegions::proc2"); }
};
/*--------------------------------------------------------------------------*/
@@ -827,9 +852,14 @@ public:
int _loadGameSlot;
int _delayTicks;
Common::String _saveName;
+ uint32 _prevFrameNumber;
+protected:
+ virtual void playerAction(Event &event) {}
+ virtual void processEnd(Event &event) {}
public:
SceneHandler();
void registerHandler();
+ uint32 getFrameDifference();
virtual Common::String getClassName() { return "SceneHandler"; }
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -840,6 +870,6 @@ public:
static void saveListener(Serializer &ser);
};
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp
index 9277fd429a..a0e8b9edba 100644
--- a/engines/tsage/debugger.cpp
+++ b/engines/tsage/debugger.cpp
@@ -23,21 +23,23 @@
#include "tsage/debugger.h"
#include "tsage/globals.h"
#include "tsage/graphics.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
-namespace tSage {
+namespace TsAGE {
Debugger::Debugger() : GUI::Debugger() {
DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
DCmd_Register("scene", WRAP_METHOD(Debugger, Cmd_Scene));
DCmd_Register("walk_regions", WRAP_METHOD(Debugger, Cmd_WalkRegions));
DCmd_Register("priority_regions", WRAP_METHOD(Debugger, Cmd_PriorityRegions));
+ DCmd_Register("scene_regions", WRAP_METHOD(Debugger, Cmd_SceneRegions));
DCmd_Register("setflag", WRAP_METHOD(Debugger, Cmd_SetFlag));
DCmd_Register("getflag", WRAP_METHOD(Debugger, Cmd_GetFlag));
DCmd_Register("clearflag", WRAP_METHOD(Debugger, Cmd_ClearFlag));
DCmd_Register("listobjects", WRAP_METHOD(Debugger, Cmd_ListObjects));
DCmd_Register("moveobject", WRAP_METHOD(Debugger, Cmd_MoveObject));
DCmd_Register("hotspots", WRAP_METHOD(Debugger, Cmd_Hotspots));
+ DCmd_Register("sound", WRAP_METHOD(Debugger, Cmd_Sound));
}
static int strToInt(const char *s) {
@@ -66,9 +68,9 @@ bool Debugger::Cmd_Scene(int argc, const char **argv) {
}
if (argc == 3)
- _globals->_sceneManager._sceneNumber = strToInt(argv[2]);
+ g_globals->_sceneManager._sceneNumber = strToInt(argv[2]);
- _globals->_sceneManager.changeScene(strToInt(argv[1]));
+ g_globals->_sceneManager.changeScene(strToInt(argv[1]));
return false;
}
@@ -85,20 +87,20 @@ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) {
int color = 16;
// Lock the background surface for access
- Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface();
+ Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface();
// Loop through drawing each walk region in a different color to the background surface
Common::String regionsDesc;
- for (uint regionIndex = 0; regionIndex < _globals->_walkRegions._regionList.size(); ++regionIndex, ++color) {
- WalkRegion &wr = _globals->_walkRegions._regionList[regionIndex];
+ for (uint regionIndex = 0; regionIndex < g_globals->_walkRegions._regionList.size(); ++regionIndex, ++color) {
+ WalkRegion &wr = g_globals->_walkRegions._regionList[regionIndex];
for (int yp = wr._bounds.top; yp < wr._bounds.bottom; ++yp) {
LineSliceSet sliceSet = wr.getLineSlices(yp);
for (uint idx = 0; idx < sliceSet.items.size(); ++idx)
- destSurface.hLine(sliceSet.items[idx].xs - _globals->_sceneOffset.x, yp,
- sliceSet.items[idx].xe - _globals->_sceneOffset.x, color);
+ destSurface.hLine(sliceSet.items[idx].xs - g_globals->_sceneOffset.x, yp,
+ sliceSet.items[idx].xe - g_globals->_sceneOffset.x, color);
}
regionsDesc += Common::String::format("Region #%d d bounds=%d,%d,%d,%d\n",
@@ -106,12 +108,12 @@ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) {
}
// Release the surface
- _globals->_sceneManager._scene->_backSurface.unlockSurface();
+ g_globals->_sceneManager._scene->_backSurface.unlockSurface();
// Mark the scene as requiring a full redraw
- _globals->_paneRefreshFlag[0] = 2;
+ g_globals->_paneRefreshFlag[0] = 2;
- DebugPrintf("Total regions = %d\n", _globals->_walkRegions._regionList.size());
+ DebugPrintf("Total regions = %d\n", g_globals->_walkRegions._regionList.size());
DebugPrintf("%s\n", regionsDesc.c_str());
return false;
@@ -132,12 +134,12 @@ bool Debugger::Cmd_PriorityRegions(int argc, const char **argv) {
int count = 0;
// Lock the background surface for access
- Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface();
+ Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface();
- Common::List<Region>::iterator i = _globals->_sceneManager._scene->_priorities.begin();
+ Common::List<Region>::iterator i = g_globals->_sceneManager._scene->_priorities.begin();
Common::String regionsDesc;
- for (; i != _globals->_sceneManager._scene->_priorities.end(); ++i, ++color, ++count) {
+ for (; i != g_globals->_sceneManager._scene->_priorities.end(); ++i, ++color, ++count) {
Region &r = *i;
if ((regionNum == 0) || (regionNum == (count + 1))) {
@@ -145,8 +147,8 @@ bool Debugger::Cmd_PriorityRegions(int argc, const char **argv) {
byte *destP = (byte *)destSurface.getBasePtr(0, y);
for (int x = 0; x < destSurface.w; ++x) {
- if (r.contains(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + x,
- _globals->_sceneManager._scene->_sceneBounds.top + y)))
+ if (r.contains(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + x,
+ g_globals->_sceneManager._scene->_sceneBounds.top + y)))
*destP = color;
++destP;
}
@@ -158,10 +160,63 @@ bool Debugger::Cmd_PriorityRegions(int argc, const char **argv) {
}
// Release the surface
- _globals->_sceneManager._scene->_backSurface.unlockSurface();
+ g_globals->_sceneManager._scene->_backSurface.unlockSurface();
// Mark the scene as requiring a full redraw
- _globals->_paneRefreshFlag[0] = 2;
+ g_globals->_paneRefreshFlag[0] = 2;
+
+ DebugPrintf("Total regions = %d\n", count);
+ DebugPrintf("%s", regionsDesc.c_str());
+
+ return true;
+}
+
+/*
+ * This command draws the scene regions onto the screen. These are the regions
+ * used by hotspots that have non-rectangular areas.
+ */
+bool Debugger::Cmd_SceneRegions(int argc, const char **argv) {
+ int regionNum = 0;
+
+ // Check for an optional specific region to display
+ if (argc == 2)
+ regionNum = strToInt(argv[1]);
+
+ // Color index to use for the first priority region
+ int color = 16;
+ int count = 0;
+
+ // Lock the background surface for access
+ Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface();
+
+ Common::List<Region>::iterator i = g_globals->_sceneRegions.begin();
+ Common::String regionsDesc;
+
+ for (; i != g_globals->_sceneRegions.end(); ++i, ++color, ++count) {
+ Region &r = *i;
+
+ if ((regionNum == 0) || (regionNum == (count + 1))) {
+ for (int y = 0; y < destSurface.h; ++y) {
+ byte *destP = (byte *)destSurface.getBasePtr(0, y);
+
+ for (int x = 0; x < destSurface.w; ++x) {
+ if (r.contains(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + x,
+ g_globals->_sceneManager._scene->_sceneBounds.top + y)))
+ *destP = color;
+ ++destP;
+ }
+ }
+ }
+
+ regionsDesc += Common::String::format("Region id = %d bounds=%d,%d,%d,%d\n",
+ r._regionId, r._bounds.left, r._bounds.top, r._bounds.right, r._bounds.bottom);
+ }
+
+ // Release the surface
+ g_globals->_sceneManager._scene->_backSurface.unlockSurface();
+
+ // Mark the scene as requiring a full redraw
+ g_globals->_paneRefreshFlag[0] = 2;
DebugPrintf("Total regions = %d\n", count);
DebugPrintf("%s", regionsDesc.c_str());
@@ -180,7 +235,7 @@ bool Debugger::Cmd_SetFlag(int argc, const char **argv) {
}
int flagNum = strToInt(argv[1]);
- _globals->setFlag(flagNum);
+ g_globals->setFlag(flagNum);
return true;
}
@@ -195,7 +250,7 @@ bool Debugger::Cmd_GetFlag(int argc, const char **argv) {
}
int flagNum = strToInt(argv[1]);
- DebugPrintf("Value: %d\n", _globals->getFlag(flagNum));
+ DebugPrintf("Value: %d\n", g_globals->getFlag(flagNum));
return true;
}
@@ -210,7 +265,7 @@ bool Debugger::Cmd_ClearFlag(int argc, const char **argv) {
}
int flagNum = strToInt(argv[1]);
- _globals->clearFlag(flagNum);
+ g_globals->clearFlag(flagNum);
return true;
}
@@ -389,31 +444,32 @@ bool Debugger::Cmd_MoveObject(int argc, const char **argv) {
*/
bool Debugger::Cmd_Hotspots(int argc, const char **argv) {
int colIndex = 16;
- const Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
+ const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
// Lock the background surface for access
- Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface();
+ Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface();
// Iterate through the scene items
SynchronizedList<SceneItem *>::iterator i;
- for (i = _globals->_sceneItems.reverse_begin(); i != _globals->_sceneItems.end(); --i, ++colIndex) {
+ for (i = g_globals->_sceneItems.reverse_begin(); i != g_globals->_sceneItems.end(); --i, ++colIndex) {
SceneItem *o = *i;
// Draw the contents of the hotspot area
if (o->_sceneRegionId == 0) {
// Scene item doesn't use a region, so fill in the entire area
- destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top,
- o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex);
+ if ((o->_bounds.right > o->_bounds.left) && (o->_bounds.bottom > o->_bounds.top))
+ destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top,
+ o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex);
} else {
// Scene uses a region, so get it and use it to fill out only the correct parts
- SceneRegions::iterator ri = _globals->_sceneRegions.begin();
- while ((ri != _globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId))
+ SceneRegions::iterator ri = g_globals->_sceneRegions.begin();
+ while ((ri != g_globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId))
++ri;
- if (ri != _globals->_sceneRegions.end()) {
+ if (ri != g_globals->_sceneRegions.end()) {
// Fill out the areas defined by the region
Region &r = *ri;
-
+
for (int y = r._bounds.top; y < r._bounds.bottom; ++y) {
LineSliceSet set = r.getLineSlices(y);
@@ -426,13 +482,26 @@ bool Debugger::Cmd_Hotspots(int argc, const char **argv) {
}
// Release the surface
- _globals->_sceneManager._scene->_backSurface.unlockSurface();
+ g_globals->_sceneManager._scene->_backSurface.unlockSurface();
// Mark the scene as requiring a full redraw
- _globals->_paneRefreshFlag[0] = 2;
+ g_globals->_paneRefreshFlag[0] = 2;
return false;
}
+/**
+ * Play the specified sound
+ */
+bool Debugger::Cmd_Sound(int argc, const char **argv) {
+ if (argc != 2) {
+ DebugPrintf("Usage: %s <sound number>\n", argv[0]);
+ return true;
+ }
+
+ int soundNum = strToInt(argv[1]);
+ g_globals->_soundHandler.play(soundNum);
+ return false;
+}
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/debugger.h b/engines/tsage/debugger.h
index 3c14cd7bed..fcdbc2d243 100644
--- a/engines/tsage/debugger.h
+++ b/engines/tsage/debugger.h
@@ -26,7 +26,7 @@
#include "common/scummsys.h"
#include "gui/debugger.h"
-namespace tSage {
+namespace TsAGE {
class Debugger : public GUI::Debugger {
public:
@@ -37,15 +37,16 @@ protected:
bool Cmd_Scene(int argc, const char **argv);
bool Cmd_WalkRegions(int argc, const char **argv);
bool Cmd_PriorityRegions(int argc, const char **argv);
+ bool Cmd_SceneRegions(int argc, const char **argv);
bool Cmd_SetFlag(int argc, const char **argv);
bool Cmd_GetFlag(int argc, const char **argv);
bool Cmd_ClearFlag(int argc, const char **argv);
bool Cmd_ListObjects(int argc, const char **argv);
bool Cmd_MoveObject(int argc, const char **argv);
-
bool Cmd_Hotspots(int argc, const char **argv);
+ bool Cmd_Sound(int argc, const char **argv);
};
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/detection.cpp b/engines/tsage/detection.cpp
index aaa9030a04..12add10c58 100644
--- a/engines/tsage/detection.cpp
+++ b/engines/tsage/detection.cpp
@@ -30,7 +30,7 @@
#include "tsage/tsage.h"
-namespace tSage {
+namespace TsAGE {
struct tSageGameDescription {
ADGameDescription desc;
@@ -55,12 +55,13 @@ Common::String TSageEngine::getPrimaryFilename() const {
return Common::String(_gameDescription->desc.filesDescriptions[0].fileName);
}
-} // End of namespace tSage
+} // End of namespace TsAGE
static const PlainGameDescriptor tSageGameTitles[] = {
- { "tsage", "Unknown Tsunami TSAGE-based Game" },
- { "ring", "Ringworld: Revenge of the Patriarch" },
+ { "tsage", "Tsunami TsAGE-based Game" },
+ { "ringworld", "Ringworld: Revenge of the Patriarch" },
{ "blueforce", "Blue Force" },
+ { "ringworld2", "Return to Ringworld" },
{ 0, 0 }
};
@@ -72,10 +73,10 @@ enum {
class TSageMetaEngine : public AdvancedMetaEngine {
public:
- TSageMetaEngine() : AdvancedMetaEngine(tSage::gameDescriptions, sizeof(tSage::tSageGameDescription), tSageGameTitles) {
+ TSageMetaEngine() : AdvancedMetaEngine(TsAGE::gameDescriptions, sizeof(TsAGE::tSageGameDescription), tSageGameTitles) {
_md5Bytes = 5000;
_singleid = "tsage";
- _guioptions = Common::GUIO_NOSPEECH;
+ _guioptions = GUIO1(GUIO_NOSPEECH);
}
virtual const char *getName() const {
@@ -103,7 +104,7 @@ public:
virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
if (desc) {
- *engine = new tSage::TSageEngine(syst, (const tSage::tSageGameDescription *)desc);
+ *engine = new TsAGE::TSageEngine(syst, (const TsAGE::tSageGameDescription *)desc);
}
return desc != 0;
}
@@ -118,7 +119,7 @@ public:
Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern);
sort(filenames.begin(), filenames.end());
- tSage::tSageSavegameHeader header;
+ TsAGE::tSageSavegameHeader header;
SaveStateList saveList;
for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
@@ -129,8 +130,10 @@ public:
Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file);
if (in) {
- if (tSage::Saver::readSavegameHeader(in, header)) {
+ if (TsAGE::Saver::readSavegameHeader(in, header)) {
saveList.push_back(SaveStateDescriptor(slot, header.saveName));
+
+ header.thumbnail->free();
delete header.thumbnail;
}
@@ -154,22 +157,25 @@ public:
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const {
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
generateGameStateFileName(target, slot));
- assert(f);
-
- tSage::tSageSavegameHeader header;
- tSage::Saver::readSavegameHeader(f, header);
- delete f;
-
- // Create the return descriptor
- SaveStateDescriptor desc(slot, header.saveName);
- desc.setDeletableFlag(true);
- desc.setWriteProtectedFlag(false);
- desc.setThumbnail(header.thumbnail);
- desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
- desc.setSaveTime(header.saveHour, header.saveMinutes);
- desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME);
-
- return desc;
+
+ if (f) {
+ TsAGE::tSageSavegameHeader header;
+ TsAGE::Saver::readSavegameHeader(f, header);
+ delete f;
+
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header.saveName);
+ desc.setDeletableFlag(true);
+ desc.setWriteProtectedFlag(false);
+ desc.setThumbnail(header.thumbnail);
+ desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
+ desc.setSaveTime(header.saveHour, header.saveMinutes);
+ desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME);
+
+ return desc;
+ }
+
+ return SaveStateDescriptor();
}
};
diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h
index 8b80edf89d..360dbac0ae 100644
--- a/engines/tsage/detection_tables.h
+++ b/engines/tsage/detection_tables.h
@@ -20,20 +20,34 @@
*
*/
-namespace tSage {
+namespace TsAGE {
static const tSageGameDescription gameDescriptions[] = {
- // Ringworld CD and First Wave versions
+ // Ringworld English CD and First Wave versions
{
{
- "ring",
+ "ringworld",
"CD",
AD_ENTRY1s("ring.rlb", "466f0e6492d9d0f34d35c5cd088de90f", 37847618),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_UNSTABLE,
- Common::GUIO_NOSPEECH | Common::GUIO_NOSFX
+ ADGF_CD,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
+ },
+ GType_Ringworld,
+ GF_CD | GF_ALT_REGIONS
+ },
+ // Ringworld Spanish CD
+ {
+ {
+ "ringworld",
+ "CD",
+ AD_ENTRY1s("ring.rlb", "cb8bba91b30cd172712371d7123bd763", 7427980),
+ Common::ES_ESP,
+ Common::kPlatformPC,
+ ADGF_CD,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_Ringworld,
GF_CD | GF_ALT_REGIONS
@@ -41,13 +55,13 @@ static const tSageGameDescription gameDescriptions[] = {
// Ringworld English Floppy version
{
{
- "ring",
+ "ringworld",
"Floppy",
AD_ENTRY1s("ring.rlb", "7b7f0c5b37b58fa5ec06ebb2ca0d0d9d", 8438770),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_UNSTABLE,
- Common::GUIO_NOSPEECH | Common::GUIO_NOSFX
+ ADGF_NO_FLAGS,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_Ringworld,
GF_FLOPPY
@@ -55,13 +69,13 @@ static const tSageGameDescription gameDescriptions[] = {
// Ringworld English Floppy Demo #1 version
{
{
- "ring",
+ "ringworld",
"Floppy Demo",
AD_ENTRY1s("tsage.rlb", "3b3604a97c06c91f3735d3e9d341f63f", 833453),
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- Common::GUIO_NOSPEECH | Common::GUIO_NOSFX
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_Ringworld,
GF_FLOPPY | GF_DEMO
@@ -70,13 +84,13 @@ static const tSageGameDescription gameDescriptions[] = {
// Ringworld English Floppy Demo #2 version
{
{
- "ring",
+ "ringworld",
"Floppy Demo",
AD_ENTRY1s("demoring.rlb", "64050e1806203b15bb03876140eb4f56", 832206),
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO,
- Common::GUIO_NOSPEECH | Common::GUIO_NOSFX
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_Ringworld,
GF_FLOPPY | GF_DEMO | GF_ALT_REGIONS
@@ -92,7 +106,7 @@ static const tSageGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_UNSTABLE,
- Common::GUIO_NOSPEECH | Common::GUIO_NOSFX
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_BlueForce,
GF_FLOPPY
@@ -106,11 +120,11 @@ static const tSageGameDescription gameDescriptions[] = {
AD_ENTRY1s("blue.rlb", "17eabb456cb1546c66baf1aff387ba6a", 10032614),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_NOSFX
+ ADGF_UNSTABLE,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_BlueForce,
- GF_FLOPPY
+ GF_FLOPPY | GF_ALT_REGIONS
},
// Blue Force CD and First Wave use the same files
{
@@ -120,13 +134,29 @@ static const tSageGameDescription gameDescriptions[] = {
AD_ENTRY1s("blue.rlb", "99983f48cb218f1f3760cf2f9a7ef11d", 63863322),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH | Common::GUIO_NOSFX
+ ADGF_CD | ADGF_UNSTABLE,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_BlueForce,
- GF_CD
+ GF_CD | GF_ALT_REGIONS
},
+
+ // Return to Ringworld
+ {
+ {
+ "ringworld2",
+ "CD",
+ AD_ENTRY1s("r2rw.rlb", "df6c25622387007788ca36d99362c1f0", 47586928),
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ ADGF_CD | ADGF_UNSTABLE,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
+ },
+ GType_Ringworld2,
+ GF_CD | GF_ALT_REGIONS
+ },
+
{ AD_TABLE_END_MARKER, 0, 0 }
};
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp
index 86fbbc8e43..002835e76b 100644
--- a/engines/tsage/dialogs.cpp
+++ b/engines/tsage/dialogs.cpp
@@ -30,9 +30,9 @@
#include "tsage/dialogs.h"
#include "tsage/staticres.h"
#include "tsage/globals.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
-namespace tSage {
+namespace TsAGE {
/*--------------------------------------------------------------------------*/
@@ -64,16 +64,16 @@ MessageDialog::MessageDialog(const Common::String &message, const Common::String
setDefaults();
// Set the dialog's center
- setCenter(_globals->_dialogCenter.x, _globals->_dialogCenter.y);
+ setCenter(g_globals->_dialogCenter.x, g_globals->_dialogCenter.y);
}
int MessageDialog::show(const Common::String &message, const Common::String &btn1Message, const Common::String &btn2Message) {
// Ensure that the cursor is the arrow
- _globals->_events.setCursor(CURSOR_ARROW);
+ g_globals->_events.setCursor(CURSOR_ARROW);
int result = show2(message, btn1Message, btn2Message);
- _globals->_events.setCursorFromFlag();
+ g_globals->_events.setCursorFromFlag();
return result;
}
@@ -109,186 +109,6 @@ ConfigDialog::ConfigDialog() : GUI::OptionsDialog("", "GlobalConfig") {
/*--------------------------------------------------------------------------*/
-#define BUTTON_WIDTH 28
-#define BUTTON_HEIGHT 29
-
-RightClickButton::RightClickButton(int buttonIndex, int xp, int yp) : GfxButton() {
- _buttonIndex = buttonIndex;
- this->_bounds.left = xp;
- this->_bounds.top = yp;
- this->_bounds.setWidth(BUTTON_WIDTH);
- this->_bounds.setHeight(BUTTON_HEIGHT);
- _savedButton = NULL;
-}
-
-void RightClickButton::highlight() {
- if (_savedButton) {
- // Button was previously highlighted, so de-highlight by restoring saved area
- _globals->gfxManager().copyFrom(*_savedButton, _bounds.left, _bounds.top);
- delete _savedButton;
- _savedButton = NULL;
- } else {
- // Highlight button by getting the needed highlighted image resource
- _savedButton = Surface_getArea(_globals->gfxManager().getSurface(), _bounds);
-
- uint size;
- byte *imgData = _resourceManager->getSubResource(7, 2, _buttonIndex, &size);
-
- GfxSurface btnSelected = surfaceFromRes(imgData);
- _globals->gfxManager().copyFrom(btnSelected, _bounds.left, _bounds.top);
-
- DEALLOCATE(imgData);
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-/**
- * This dialog implements the right-click dialog
- */
-RightClickDialog::RightClickDialog() : GfxDialog(),
- _walkButton(1, 48, 12), _lookButton(2, 31, 29), _useButton(3, 65, 29),
- _talkButton(4, 14, 47), _inventoryButton(5, 48, 47), _optionsButton(6, 83, 47) {
- Rect rectArea, dialogRect;
-
- // Set the palette and change the cursor
- _gfxManager.setDialogPalette();
- _globals->_events.setCursor(CURSOR_ARROW);
-
- // Get the dialog image
- _surface = surfaceFromRes(7, 1, 1);
-
- // Set the dialog position
- dialogRect.resize(_surface, 0, 0, 100);
- dialogRect.center(_globals->_events._mousePos.x, _globals->_events._mousePos.y);
-
- // Ensure the dialog will be entirely on-screen
- Rect screenRect = _globals->gfxManager()._bounds;
- screenRect.collapse(4, 4);
- dialogRect.contain(screenRect);
-
- _bounds = dialogRect;
- _gfxManager._bounds = _bounds;
-
- _highlightedButton = NULL;
- _selectedAction = -1;
-}
-
-RightClickDialog::~RightClickDialog() {
-}
-
-RightClickButton *RightClickDialog::findButton(const Common::Point &pt) {
- RightClickButton *btnList[] = { &_walkButton, &_lookButton, &_useButton, &_talkButton, &_inventoryButton, &_optionsButton };
-
- for (int i = 0; i < 6; ++i) {
- btnList[i]->_owner = this;
-
- if (btnList[i]->_bounds.contains(pt))
- return btnList[i];
- }
-
- return NULL;
-}
-
-void RightClickDialog::draw() {
- // Save the covered background area
- _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds);
-
- // Draw the dialog image
- _globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top);
-}
-
-bool RightClickDialog::process(Event &event) {
- switch (event.eventType) {
- case EVENT_MOUSE_MOVE: {
- // Check whether a button is highlighted
- RightClickButton *btn = findButton(event.mousePos);
-
- if (btn != _highlightedButton) {
- // De-highlight any previously selected button
- if (_highlightedButton) {
- _highlightedButton->highlight();
- _highlightedButton = NULL;
- }
- if (btn) {
- // Highlight the new button
- btn->highlight();
- _highlightedButton = btn;
- }
- }
- event.handled = true;
- return true;
- }
-
- case EVENT_BUTTON_DOWN:
- // If a button is highlighted, then flag the selected button index
- if (_highlightedButton)
- _selectedAction = _highlightedButton->_buttonIndex;
- else
- _selectedAction = _lookButton._buttonIndex;
- event.handled = true;
- return true;
-
- default:
- break;
- }
-
- return false;
-}
-
-void RightClickDialog::execute() {
- // Draw the dialog
- draw();
-
- // Dialog event handler loop
- _gfxManager.activate();
-
- while (!_vm->getEventManager()->shouldQuit() && (_selectedAction == -1)) {
- Event evt;
- while (_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) {
- evt.mousePos.x -= _bounds.left;
- evt.mousePos.y -= _bounds.top;
-
- process(evt);
- }
-
- g_system->delayMillis(10);
- g_system->updateScreen();
- }
-
- // Execute the specified action
- switch (_selectedAction) {
- case 1:
- // Look action
- _globals->_events.setCursor(CURSOR_LOOK);
- break;
- case 2:
- // Walk action
- _globals->_events.setCursor(CURSOR_WALK);
- break;
- case 3:
- // Use cursor
- _globals->_events.setCursor(CURSOR_USE);
- break;
- case 4:
- // Talk cursor
- _globals->_events.setCursor(CURSOR_TALK);
- break;
- case 5:
- // Inventory dialog
- InventoryDialog::show();
- break;
- case 6:
- // Dialog options
- OptionsDialog::show();
- break;
- }
-
- _gfxManager.deactivate();
-}
-
-/*--------------------------------------------------------------------------*/
-
void ModalDialog::draw() {
// Set the palette for use in the dialog
setPalette();
@@ -296,7 +116,7 @@ void ModalDialog::draw() {
// Make a backup copy of the area the dialog will occupy
Rect tempRect = _bounds;
tempRect.collapse(-10, -10);
- _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), tempRect);
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), tempRect);
_gfxManager.activate();
@@ -318,7 +138,7 @@ void ModalDialog::drawFrame() {
_bounds.collapse(-10, -10);
// Fill the dialog area
- _globals->gfxManager().fillRect(origRect, 54);
+ g_globals->gfxManager().fillRect(origRect, 54);
// Draw top line
GfxSurface surface = surfaceFromRes(8, 1, 7);
@@ -465,14 +285,14 @@ void InventoryDialog::execute() {
bool lookFlag = false;
_gfxManager.activate();
- while (!_vm->getEventManager()->shouldQuit()) {
+ while (!g_vm->shouldQuit()) {
// Get events
Event event;
- while (!_globals->_events.getEvent(event) && !_vm->getEventManager()->shouldQuit()) {
+ while (!g_globals->_events.getEvent(event) && !g_vm->shouldQuit()) {
g_system->delayMillis(10);
g_system->updateScreen();
}
- if (_vm->getEventManager()->shouldQuit())
+ if (g_vm->shouldQuit())
break;
hiliteObj = NULL;
@@ -499,18 +319,18 @@ void InventoryDialog::execute() {
if (hiliteObj == &_btnOk) {
// Ok button clicked
if (lookFlag)
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
break;
} else if (hiliteObj == &_btnLook) {
// Look button clicked
if (_btnLook._message == LOOK_BTN_STRING) {
_btnLook._message = PICK_BTN_STRING;
lookFlag = 1;
- _globals->_events.setCursor(CURSOR_LOOK);
+ g_globals->_events.setCursor(CURSOR_LOOK);
} else {
_btnLook._message = LOOK_BTN_STRING;
lookFlag = 0;
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
}
hiliteObj->draw();
@@ -518,7 +338,7 @@ void InventoryDialog::execute() {
// Inventory item selected
InvObject *invObject = static_cast<GfxInvImage *>(hiliteObj)->_invObject;
if (lookFlag) {
- _globals->_screenSurface.displayText(invObject->_description);
+ g_globals->_screenSurface.displayText(invObject->_description);
} else {
RING_INVENTORY._selectedItem = invObject;
invObject->setCursor();
@@ -540,19 +360,20 @@ void OptionsDialog::show() {
if (btn == &dlg->_btnQuit) {
// Quit game
if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) {
- _vm->quitGame();
+ g_vm->quitGame();
}
} else if (btn == &dlg->_btnRestart) {
// Restart game
- _globals->_game->restartGame();
+ g_globals->_game->restartGame();
} else if (btn == &dlg->_btnSound) {
// Sound dialog
+ SoundDialog::execute();
} else if (btn == &dlg->_btnSave) {
// Save button
- _globals->_game->saveGame();
+ g_globals->_game->saveGame();
} else if (btn == &dlg->_btnRestore) {
// Restore button
- _globals->_game->restoreGame();
+ g_globals->_game->restoreGame();
}
dlg->remove();
@@ -594,5 +415,14 @@ OptionsDialog::OptionsDialog() {
setCenter(160, 100);
}
+/*--------------------------------------------------------------------------*/
+
+void SoundDialog::execute() {
+ ConfigDialog *dlg = new ConfigDialog();
+ dlg->runModal();
+ delete dlg;
+ g_globals->_soundManager.syncSounds();
+ g_globals->_events.setCursorFromFlag();
+}
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/dialogs.h b/engines/tsage/dialogs.h
index a50307f775..35ed60ba1a 100644
--- a/engines/tsage/dialogs.h
+++ b/engines/tsage/dialogs.h
@@ -30,7 +30,7 @@
#include "common/rect.h"
#include "common/system.h"
-namespace tSage {
+namespace TsAGE {
class MessageDialog : public GfxDialog {
public:
@@ -49,35 +49,6 @@ public:
ConfigDialog();
};
-class RightClickButton : public GfxButton {
-private:
- GfxSurface *_savedButton;
-public:
- int _buttonIndex;
-
- RightClickButton(int buttonIndex, int xp, int yp);
- ~RightClickButton() { delete _savedButton; }
-
- virtual void highlight();
-};
-
-class RightClickDialog : public GfxDialog {
-private:
- GfxSurface _surface;
- RightClickButton *_highlightedButton;
- int _selectedAction;
- RightClickButton _walkButton, _lookButton, _useButton, _talkButton, _inventoryButton, _optionsButton;
-
- RightClickButton *findButton(const Common::Point &pt);
-public:
- RightClickDialog();
- ~RightClickDialog();
-
- virtual void draw();
- virtual bool process(Event &event);
- void execute();
-};
-
/*--------------------------------------------------------------------------*/
class ModalDialog : public GfxDialog {
@@ -128,6 +99,13 @@ public:
static void show();
};
-} // End of namespace tSage
+/*--------------------------------------------------------------------------*/
+
+class SoundDialog {
+public:
+ static void execute();
+};
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp
index a24f65421b..073cbc35b9 100644
--- a/engines/tsage/events.cpp
+++ b/engines/tsage/events.cpp
@@ -31,7 +31,7 @@
#include "tsage/tsage.h"
#include "tsage/globals.h"
-namespace tSage {
+namespace TsAGE {
EventsClass::EventsClass() {
_currentCursor = CURSOR_NONE;
@@ -39,7 +39,8 @@ EventsClass::EventsClass() {
_frameNumber = 0;
_priorFrameTime = 0;
_prevDelayFrame = 0;
- _saver->addListener(this);
+ g_saver->addListener(this);
+ g_saver->addLoadNotifier(&EventsClass::loadNotifierProc);
}
bool EventsClass::pollEvent() {
@@ -78,7 +79,7 @@ bool EventsClass::pollEvent() {
void EventsClass::waitForPress(int eventMask) {
Event evt;
- while (!_vm->getEventManager()->shouldQuit() && !getEvent(evt, eventMask))
+ while (!g_vm->shouldQuit() && !getEvent(evt, eventMask))
g_system->delayMillis(10);
}
@@ -86,7 +87,7 @@ void EventsClass::waitForPress(int eventMask) {
* Standard event retrieval, which only returns keyboard and mouse clicks
*/
bool EventsClass::getEvent(Event &evt, int eventMask) {
- while (pollEvent() && !_vm->getEventManager()->shouldQuit()) {
+ while (pollEvent() && !g_vm->shouldQuit()) {
evt.handled = false;
evt.eventType = EVENT_NONE;
evt.mousePos = _event.mouse;
@@ -142,43 +143,76 @@ void EventsClass::setCursor(CursorType cursorType) {
return;
_lastCursor = cursorType;
- _globals->clearFlag(122);
+ g_globals->clearFlag(122);
CursorMan.showMouse(true);
const byte *cursor;
bool delFlag = true;
uint size;
+ bool questionEnabled = false;
switch (cursorType) {
case CURSOR_NONE:
// No cursor
- _globals->setFlag(122);
+ g_globals->setFlag(122);
- if (_vm->getFeatures() & GF_DEMO) {
+ if ((g_vm->getFeatures() & GF_DEMO) || (g_vm->getGameID() != GType_Ringworld)) {
CursorMan.showMouse(false);
return;
}
- cursor = _resourceManager->getSubResource(4, 1, 6, &size);
+ cursor = g_resourceManager->getSubResource(4, 1, 6, &size);
break;
case CURSOR_LOOK:
// Look cursor
- cursor = _resourceManager->getSubResource(4, 1, 5, &size);
+ if (g_vm->getGameID() == GType_BlueForce) {
+ cursor = g_resourceManager->getSubResource(1, 5, 3, &size);
+ } else if (g_vm->getGameID() == GType_Ringworld2) {
+ cursor = g_resourceManager->getSubResource(5, 1, 5, &size);
+ } else {
+ cursor = g_resourceManager->getSubResource(4, 1, 5, &size);
+ }
_currentCursor = CURSOR_LOOK;
break;
case CURSOR_USE:
// Use cursor
- cursor = _resourceManager->getSubResource(4, 1, 4, &size);
+ if (g_vm->getGameID() == GType_BlueForce) {
+ cursor = g_resourceManager->getSubResource(1, 5, 2, &size);
+ } else if (g_vm->getGameID() == GType_Ringworld2) {
+ cursor = g_resourceManager->getSubResource(5, 1, 4, &size);
+ } else {
+ cursor = g_resourceManager->getSubResource(4, 1, 4, &size);
+ }
_currentCursor = CURSOR_USE;
break;
case CURSOR_TALK:
// Talk cursor
- cursor = _resourceManager->getSubResource(4, 1, 3, &size);
+ if (g_vm->getGameID() == GType_BlueForce) {
+ cursor = g_resourceManager->getSubResource(1, 5, 4, &size);
+ } else if (g_vm->getGameID() == GType_Ringworld2) {
+ cursor = g_resourceManager->getSubResource(5, 1, 6, &size);
+ } else {
+ cursor = g_resourceManager->getSubResource(4, 1, 3, &size);
+ }
_currentCursor = CURSOR_TALK;
break;
+ case CURSOR_EXIT:
+ // Exit cursor (Blue Force)
+ assert(g_vm->getGameID() == GType_BlueForce);
+ cursor = g_resourceManager->getSubResource(1, 5, 7, &size);
+ _currentCursor = CURSOR_EXIT;
+ break;
+
+ case CURSOR_PRINTER:
+ // Printer cursor (Blue Force)
+ assert(g_vm->getGameID() == GType_BlueForce);
+ cursor = g_resourceManager->getSubResource(1, 7, 6, &size);
+ _currentCursor = CURSOR_PRINTER;
+ break;
+
case CURSOR_ARROW:
// Arrow cursor
cursor = CURSOR_ARROW_DATA;
@@ -187,10 +221,22 @@ void EventsClass::setCursor(CursorType cursorType) {
case CURSOR_WALK:
default:
- // Walk cursor
- cursor = CURSOR_WALK_DATA;
- _currentCursor = CURSOR_WALK;
- delFlag = false;
+ if (g_vm->getGameID() == GType_BlueForce) {
+ if (cursorType == CURSOR_WALK) {
+ cursor = g_resourceManager->getSubResource(1, 5, 1, &size);
+ } else {
+ // Inventory icon
+ cursor = g_resourceManager->getSubResource(10, ((int)cursorType - 1) / 20 + 1,
+ ((int)cursorType - 1) % 20 + 1, &size);
+ questionEnabled = true;
+ }
+ _currentCursor = cursorType;
+ } else {
+ // For Ringworld, always treat as the walk cursor
+ cursor = CURSOR_WALK_DATA;
+ _currentCursor = CURSOR_WALK;
+ delFlag = false;
+ }
break;
}
@@ -204,6 +250,10 @@ void EventsClass::setCursor(CursorType cursorType) {
if (delFlag)
DEALLOCATE(cursor);
+
+ // For Blue Force, enable the question button when an inventory icon is selected
+ if (g_vm->getGameID() == GType_BlueForce)
+ T2_GLOBALS._uiElements._question.setEnabled(questionEnabled);
}
void EventsClass::pushCursor(CursorType cursorType) {
@@ -214,22 +264,22 @@ void EventsClass::pushCursor(CursorType cursorType) {
switch (cursorType) {
case CURSOR_NONE:
// No cursor
- cursor = _resourceManager->getSubResource(4, 1, 6, &size);
+ cursor = g_resourceManager->getSubResource(4, 1, 6, &size);
break;
case CURSOR_LOOK:
// Look cursor
- cursor = _resourceManager->getSubResource(4, 1, 5, &size);
+ cursor = g_resourceManager->getSubResource(4, 1, 5, &size);
break;
case CURSOR_USE:
// Use cursor
- cursor = _resourceManager->getSubResource(4, 1, 4, &size);
+ cursor = g_resourceManager->getSubResource(4, 1, 4, &size);
break;
case CURSOR_TALK:
// Talk cursor
- cursor = _resourceManager->getSubResource(4, 1, 3, &size);
+ cursor = g_resourceManager->getSubResource(4, 1, 3, &size);
break;
case CURSOR_ARROW:
@@ -269,6 +319,17 @@ void EventsClass::setCursor(Graphics::Surface &cursor, int transColor, const Com
_currentCursor = cursorId;
}
+void EventsClass::setCursor(GfxSurface &cursor) {
+ // TODO: Find proper parameters for this form in Blue Force
+ Graphics::Surface s = cursor.lockSurface();
+
+ const byte *cursorData = (const byte *)s.getBasePtr(0, 0);
+ CursorMan.replaceCursor(cursorData, cursor.getBounds().width(), cursor.getBounds().height(),
+ cursor._centroid.x, cursor._centroid.y, cursor._transColor);
+
+ _lastCursor = CURSOR_NONE;
+}
+
void EventsClass::setCursorFromFlag() {
setCursor(isCursorVisible() ? _currentCursor : CURSOR_NONE);
}
@@ -277,12 +338,14 @@ void EventsClass::showCursor() {
setCursor(_currentCursor);
}
-void EventsClass::hideCursor() {
+CursorType EventsClass::hideCursor() {
+ CursorType oldCursor = _currentCursor;
setCursor(CURSOR_NONE);
+ return oldCursor;
}
bool EventsClass::isCursorVisible() const {
- return !_globals->getFlag(122);
+ return !g_globals->getFlag(122);
}
/**
@@ -315,4 +378,13 @@ void EventsClass::listenerSynchronize(Serializer &s) {
}
}
-} // end of namespace tSage
+void EventsClass::loadNotifierProc(bool postFlag) {
+ if (postFlag) {
+ if (g_globals->_events._lastCursor == CURSOR_NONE)
+ g_globals->_events._lastCursor = g_globals->_events._currentCursor;
+ else
+ g_globals->_events._lastCursor = CURSOR_NONE;
+ }
+}
+
+} // end of namespace TsAGE
diff --git a/engines/tsage/events.h b/engines/tsage/events.h
index a13455d378..874020f140 100644
--- a/engines/tsage/events.h
+++ b/engines/tsage/events.h
@@ -29,7 +29,7 @@
#include "graphics/surface.h"
#include "tsage/saveload.h"
-namespace tSage {
+namespace TsAGE {
enum EventType {EVENT_NONE = 0, EVENT_BUTTON_DOWN = 1, EVENT_BUTTON_UP = 2, EVENT_KEYPRESS = 4,
EVENT_MOUSE_MOVE = 8};
@@ -37,6 +37,7 @@ enum EventType {EVENT_NONE = 0, EVENT_BUTTON_DOWN = 1, EVENT_BUTTON_UP = 2, EVEN
enum ButtonShiftFlags {BTNSHIFT_LEFT = 0, BTNSHIFT_RIGHT = 3, BTNSHIFT_MIDDLE = 4};
// Intrinisc game delay between execution frames. This runs at 60Hz
+#define GAME_FRAME_RATE 60
#define GAME_FRAME_TIME (1000 / 60)
class GfxManager;
@@ -53,6 +54,7 @@ public:
};
enum CursorType {
+ // Ringworld objects
OBJECT_STUNNER = 0, OBJECT_SCANNER = 1, OBJECT_STASIS_BOX = 2,
OBJECT_INFODISK = 3, OBJECT_STASIS_NEGATOR = 4, OBJECT_KEY_DEVICE = 5, OBJECT_MEDKIT = 6,
OBJECT_LADDER = 7, OBJECT_ROPE = 8, OBJECT_KEY = 9, OBJECT_TRANSLATOR = 10, OBJECT_ALE = 11,
@@ -62,10 +64,42 @@ enum CursorType {
OBJECT_NULLIFIER = 25, OBJECT_PEG = 26, OBJECT_VIAL = 27, OBJECT_JACKET = 28,
OBJECT_TUNIC2 = 29, OBJECT_BONE = 30, OBJECT_EMPTY_JAR = 31, OBJECT_JAR = 32,
+ // Blue Force objects
+ INV_NONE = 0, INV_COLT45 = 1, INV_AMMO_CLIP = 2, INV_SPARE_CLIP = 3, INV_HANDCUFFS = 4,
+ INV_GREENS_GUN = 5, INV_TICKET_BOOK = 6, INV_MIRANDA_CARD = 7, INV_FOREST_RAP = 8,
+ INV_GREEN_ID = 9, INV_BASEBALL_CARD = 10, INV_BOOKING_GREEN = 11, INV_FLARE = 12,
+ INV_COBB_RAP = 13, INV_22_BULLET = 14, INV_AUTO_RIFLE = 15, INV_WIG = 16, INV_FRANKIE_ID = 17,
+ INV_TYRONE_ID = 18, INV_22_SNUB = 19, INV_BOOKING_FRANKIE = 21, INV_BOOKING_GANG = 22,
+ INV_FBI_TELETYPE = 23, INV_DA_NOTE = 24, INV_PRINT_OUT = 25, INV_WAREHOUSE_KEYS = 26,
+ INV_CENTER_PUNCH = 27, INV_TRANQ_GUN = 28, INV_HOOK = 29, INV_RAGS = 30, INV_JAR = 31,
+ INV_SCREWDRIVER = 32, INV_D_FLOPPY = 33, INV_BLANK_DISK = 34, INV_STICK = 35,
+ INV_CRATE1 = 36, INV_CRATE2 = 37, INV_SHOEBOX = 38, INV_BADGE = 39, INV_RENTAL_COUPON = 41,
+ INV_NICKEL = 42, INV_LYLE_CARD = 43, INV_CARTER_NOTE = 44, INV_MUG_SHOT = 45,
+ INV_CLIPPING = 46, INV_MICROFILM = 47, INV_WAVE_KEYS = 48, INV_RENTAL_KEYS = 49,
+ INV_NAPKIN = 50, INV_DMV_PRINTOUT = 51, INV_FISHING_NET = 52, INV_ID = 53,
+ INV_9MM_BULLETS = 54, INV_SCHEDULE = 55, INV_GRENADES = 56, INV_YELLOW_CORD = 57,
+ INV_HALF_YELLOW_CORD = 58, INV_BLACK_CORD = 59, INV_HALF_BLACK_CORD = 61, INV_WARRANT = 62,
+ INV_JACKET = 63, INV_GREENS_KNIFE = 64, INV_DOG_WHISTLE = 65, INV_AMMO_BELT = 66,
+ INV_CARAVAN_KEY = 67, BF_LAST_INVENT = 68,
+
+ // Ringworld 2 objects
+ R2_1 = 1, R2_2 = 2, R2_3 = 3, R2_STEPPING_DISKS = 4, R2_5 = 5, R2_6 = 6, R2_7 = 7,
+ R2_8 = 8, R2_9 = 9, R2_10 = 10, R2_11 = 11, R2_12 = 12, R2_13 = 13, R2_14 = 14,
+ R2_15 = 15, R2_16 = 16, R2_17 = 17, R2_18 = 18, R2_19 = 19, R2_20 = 20, R2_21 = 21,
+ R2_22 = 22, R2_23 = 23, R2_24 = 24, R2_25 = 25, R2_26 = 26, R2_27 = 27, R2_28 = 28,
+ R2_29 = 29, R2_30 = 30, R2_31 = 31, R2_32 = 32, R2_33 = 33, R2_34 = 34, R2_35 = 35,
+ R2_36 = 36, R2_37 = 37, R2_38 = 38, R2_39 = 39, R2_40 = 40, R2_41 = 41, R2_42 = 42,
+ R2_43 = 43, R2_44 = 44, R2_45 = 45, R2_46 = 46, R2_47 = 47, R2_48 = 48, R2_49 = 49,
+ R2_50 = 50, R2_51 = 51, R2_52 = 52,
+
+ // Cursors
CURSOR_WALK = 0x100, CURSOR_LOOK = 0x200, CURSOR_700 = 700, CURSOR_USE = 0x400, CURSOR_TALK = 0x800,
+ CURSOR_1000 = 0x1000, CURSOR_PRINTER = 0x4000, CURSOR_EXIT = 0x7004, CURSOR_9999 = 9999,
CURSOR_NONE = -1, CURSOR_CROSSHAIRS = -2, CURSOR_ARROW = -3
};
+class GfxSurface;
+
class EventsClass : public SaveListener {
private:
Common::Event _event;
@@ -83,10 +117,11 @@ public:
void pushCursor(CursorType cursorType);
void popCursor();
void setCursor(Graphics::Surface &cursor, int transColor, const Common::Point &hotspot, CursorType cursorId);
+ void setCursor(GfxSurface &cursor);
void setCursorFromFlag();
CursorType getCursor() const { return _currentCursor; }
void showCursor();
- void hideCursor();
+ CursorType hideCursor();
bool isCursorVisible() const;
bool pollEvent();
@@ -97,10 +132,13 @@ public:
Common::EventType type() { return _event.type; }
uint32 getFrameNumber() const { return _frameNumber; }
void delay(int numFrames);
+ bool isInventoryIcon() const { return _currentCursor < 256; }
+ void proc1() { warning("TODO: EventsClass::proc1"); }
virtual void listenerSynchronize(Serializer &s);
+ static void loadNotifierProc(bool postFlag);
};
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index 34b26ec311..7711e7fba7 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -22,14 +22,15 @@
#include "tsage/globals.h"
#include "tsage/tsage.h"
-#include "tsage/blueforce_logic.h"
-#include "tsage/ringworld_demo.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/ringworld/ringworld_demo.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
-namespace tSage {
+namespace TsAGE {
-Globals *_globals = NULL;
-ResourceManager *_resourceManager = NULL;
+Globals *g_globals = NULL;
+ResourceManager *g_resourceManager = NULL;
/*--------------------------------------------------------------------------*/
@@ -51,12 +52,12 @@ static SavedObject *classFactoryProc(const Common::String &className) {
/*--------------------------------------------------------------------------*/
Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface),
- _randomSource("tsage"), _unkColor1(0), _unkColor2(255), _unkColor3(255) {
+ _randomSource("tsage"), _color1(0), _color2(255), _color3(255) {
reset();
_stripNum = 0;
_gfxEdgeAdjust = 3;
- if (_vm->getFeatures() & GF_DEMO) {
+ if (g_vm->getFeatures() & GF_DEMO) {
_gfxFontNumber = 0;
_gfxColors.background = 6;
_gfxColors.foreground = 0;
@@ -64,18 +65,34 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_fontColors.foreground = 6;
_dialogCenter.y = 80;
// Workaround in order to use later version of the engine
- _unkColor1 = _gfxColors.foreground;
- _unkColor2 = _gfxColors.foreground;
- _unkColor3 = _gfxColors.foreground;
- } else if ((_vm->getGameID() == GType_Ringworld) && (_vm->getFeatures() & GF_CD)) {
+ _color1 = _gfxColors.foreground;
+ _color2 = _gfxColors.foreground;
+ _color3 = _gfxColors.foreground;
+ } else if (g_vm->getGameID() == GType_BlueForce) {
+ // Blue Force
+ _gfxFontNumber = 0;
+ _gfxColors.background = 89;
+ _gfxColors.foreground = 83;
+ _fontColors.background = 88;
+ _fontColors.foreground = 92;
+ _dialogCenter.y = 140;
+ } else if (g_vm->getGameID() == GType_Ringworld2) {
+ // Return to Ringworld
+ _gfxFontNumber = 2;
+ _gfxColors.background = 89;
+ _gfxColors.foreground = 83;
+ _fontColors.background = 88;
+ _fontColors.foreground = 92;
+ _dialogCenter.y = 140;
+ } else if ((g_vm->getGameID() == GType_Ringworld) && (g_vm->getFeatures() & GF_CD)) {
_gfxFontNumber = 50;
_gfxColors.background = 53;
_gfxColors.foreground = 0;
_fontColors.background = 51;
_fontColors.foreground = 54;
- _unkColor1 = 18;
- _unkColor2 = 18;
- _unkColor3 = 18;
+ _color1 = 18;
+ _color2 = 18;
+ _color3 = 18;
} else {
_gfxFontNumber = 50;
_gfxColors.background = 53;
@@ -83,9 +100,9 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_fontColors.background = 51;
_fontColors.foreground = 54;
// Workaround in order to use later version of the engine
- _unkColor1 = _gfxColors.foreground;
- _unkColor2 = _gfxColors.foreground;
- _unkColor3 = _gfxColors.foreground;
+ _color1 = _gfxColors.foreground;
+ _color2 = _gfxColors.foreground;
+ _color3 = _gfxColors.foreground;
}
_screenSurface.setScreenSurface();
_gfxManagers.push_back(&_gfxManagerInstance);
@@ -100,31 +117,42 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_scrollFollower = NULL;
_inventory = NULL;
- switch (_vm->getGameID()) {
+ switch (g_vm->getGameID()) {
case GType_Ringworld:
- if (!(_vm->getFeatures() & GF_DEMO)) {
- _inventory = new RingworldInvObjectList();
- _game = new RingworldGame();
+ if (!(g_vm->getFeatures() & GF_DEMO)) {
+ _inventory = new Ringworld::RingworldInvObjectList();
+ _game = new Ringworld::RingworldGame();
} else {
- _game = new RingworldDemoGame();
+ _game = new Ringworld::RingworldDemoGame();
}
+ _sceneHandler = new SceneHandler();
break;
case GType_BlueForce:
- _game = new BlueForceGame();
+ _game = new BlueForce::BlueForceGame();
+ _inventory = new BlueForce::BlueForceInvObjectList();
+ _sceneHandler = new BlueForce::SceneHandlerExt();
+ break;
+
+ case GType_Ringworld2:
+ _inventory = new Ringworld2::Ringworld2InvObjectList();
+ _game = new Ringworld2::Ringworld2Game();
+ _sceneHandler = new SceneHandler();
break;
}
}
Globals::~Globals() {
+ _scenePalette.clearListeners();
delete _inventory;
+ delete _sceneHandler;
delete _game;
- _globals = NULL;
+ g_globals = NULL;
}
void Globals::reset() {
Common::set_to(&_flags[0], &_flags[MAX_FLAGS], false);
- _saver->addFactory(classFactoryProc);
+ g_saver->addFactory(classFactoryProc);
}
void Globals::synchronize(Serializer &s) {
@@ -142,9 +170,9 @@ void Globals::synchronize(Serializer &s) {
s.syncAsSint32LE(_fontColors.foreground);
if (s.getVersion() >= 4) {
- s.syncAsByte(_unkColor1);
- s.syncAsByte(_unkColor2);
- s.syncAsByte(_unkColor3);
+ s.syncAsByte(_color1);
+ s.syncAsByte(_color2);
+ s.syncAsByte(_color3);
}
s.syncAsSint16LE(_dialogCenter.x); s.syncAsSint16LE(_dialogCenter.y);
@@ -166,5 +194,175 @@ void Globals::dispatchSounds() {
Common::for_each(_sounds.begin(), _sounds.end(), Globals::dispatchSound);
}
+/*--------------------------------------------------------------------------*/
+
+void TsAGE2Globals::reset() {
+ Globals::reset();
+
+ // Reset the inventory
+ T2_GLOBALS._uiElements.updateInventory();
+ T2_GLOBALS._uiElements._scoreValue = 0;
+ T2_GLOBALS._uiElements._active = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+namespace BlueForce {
+
+BlueForceGlobals::BlueForceGlobals(): TsAGE2Globals() {
+}
+
+void BlueForceGlobals::synchronize(Serializer &s) {
+ Globals::synchronize(s);
+
+ s.syncAsSint16LE(_dayNumber);
+ s.syncAsSint16LE(_v4CEA4);
+ s.syncAsSint16LE(_v4CEAA);
+ s.syncAsSint16LE(_marinaWomanCtr);
+ s.syncAsSint16LE(_v4CEB0);
+ s.syncAsSint16LE(_v4CEB6);
+ s.syncAsSint16LE(_safeCombination);
+ s.syncAsSint16LE(_v4CEC0);
+ s.syncAsSint16LE(_greenDay5TalkCtr);
+ s.syncAsSint16LE(_v4CEC4);
+ s.syncAsSint16LE(_v4CEC8);
+ s.syncAsSint16LE(_v4CECA);
+ s.syncAsSint16LE(_v4CECC);
+ for (int i = 0; i < 18; i++)
+ s.syncAsByte(_v4CECE[i]);
+ s.syncAsSint16LE(_v4CEE0);
+ s.syncAsSint16LE(_v4CEE2);
+ s.syncAsSint16LE(_v4CEE4);
+ s.syncAsSint16LE(_v4CEE6);
+ s.syncAsSint16LE(_v4CEE8);
+ s.syncAsSint16LE(_deziTopic);
+ s.syncAsSint16LE(_deathReason);
+ s.syncAsSint16LE(_driveFromScene);
+ s.syncAsSint16LE(_driveToScene);
+ s.syncAsSint16LE(_v501F8);
+ s.syncAsSint16LE(_v501FA);
+ s.syncAsSint16LE(_v501FC);
+ s.syncAsSint16LE(_v5020C);
+ s.syncAsSint16LE(_v50696);
+ s.syncAsSint16LE(_v5098C);
+ s.syncAsSint16LE(_v5098D);
+ s.syncAsSint16LE(_v50CC2);
+ s.syncAsSint16LE(_v50CC4);
+ s.syncAsSint16LE(_v50CC6);
+ s.syncAsSint16LE(_v50CC8);
+ s.syncAsSint16LE(_v51C42);
+ s.syncAsSint16LE(_v51C44);
+ s.syncAsSint16LE(_interfaceY);
+ s.syncAsSint16LE(_bookmark);
+ s.syncAsSint16LE(_mapLocationId);
+ s.syncAsSint16LE(_clip1Bullets);
+ s.syncAsSint16LE(_clip2Bullets);
+}
+
+void BlueForceGlobals::reset() {
+ TsAGE2Globals::reset();
+ _scenePalette.clearListeners();
+
+ _scrollFollower = &_player;
+ _bookmark = bNone;
+
+ // Reset the inventory
+ ((BlueForceInvObjectList *)_inventory)->reset();
+
+ _mapLocationId = 1;
+ _driveFromScene = 300;
+ _driveToScene = 0;
+
+ _interfaceY = UI_INTERFACE_Y;
+ _dayNumber = 0;
+ _v4CEA4 = 0;
+ _v4CEAA = 0;
+ _marinaWomanCtr = 0;
+ _v4CEB0 = 0;
+ _v4CEB6 = 0;
+ _safeCombination = 0;
+ _v4CEC0 = 0;
+ _greenDay5TalkCtr = 0;
+ _v4CEC4 = 0;
+ _v4CEC8 = 1;
+ _v4CECA = 0;
+ _v4CECC = 0;
+ _v4CECE[0] = 2;
+ _v4CECE[1] = 2;
+ _v4CECE[2] = 2;
+ _v4CECE[3] = 1;
+ _v4CECE[4] = 2;
+ _v4CECE[5] = 2;
+ _v4CECE[6] = 2;
+ _v4CECE[7] = 2;
+ _v4CECE[8] = 2;
+ _v4CECE[9] = 2;
+ _v4CECE[10] = 2;
+ _v4CECE[11] = 2;
+ _v4CECE[12] = 1;
+ _v4CECE[13] = 1;
+ _v4CECE[14] = 2;
+ _v4CECE[15] = 2;
+ _v4CECE[16] = 3;
+ _v4CECE[17] = 0;
+ _v4CEE0 = 0;
+ _v4CEE2 = 0;
+ _v4CEE4 = 0;
+ _v4CEE6 = 0;
+ _v4CEE8 = 0;
+ _deziTopic = 0;
+ _deathReason = 0;
+ _v501F8 = 0;
+ _v501FA = 0;
+ _v501FC = 0;
+ _v5020C = 0;
+ _v50696 = 0;
+ _v5098C = 0;
+ _v5098D = 0;
+ _v50CC2 = 0;
+ _v50CC4 = 0;
+ _v50CC6 = 0;
+ _v50CC8 = 0;
+ _v51C42 = 0;
+ _v51C44 = 1;
+ _clip1Bullets = 8;
+ _clip2Bullets = 8;
+}
+
+bool BlueForceGlobals::getHasBullets() {
+ if (!getFlag(fGunLoaded))
+ return false;
+ return BF_GLOBALS.getFlag(fLoadedSpare) ? (_clip2Bullets > 0) : (_clip1Bullets > 0);
+}
+
+void BlueForceGlobals::set2Flags(int flagNum) {
+ if (!getFlag(flagNum + 1)) {
+ setFlag(flagNum + 1);
+ setFlag(flagNum);
+ }
+}
+
+bool BlueForceGlobals::removeFlag(int flagNum) {
+ bool result = getFlag(flagNum);
+ clearFlag(flagNum);
+ return result;
+}
+
+} // end of namespace BlueForce
+
+namespace Ringworld2 {
+
+void Ringworld2Globals::reset() {
+ Globals::reset();
+
+ // Reset the inventory
+ R2_INVENTORY.reset();
+ T2_GLOBALS._uiElements.updateInventory();
+ T2_GLOBALS._uiElements._active = false;
+}
+
+
+
+} // end of namespace Ringworld2
-} // end of namespace tSage
+} // end of namespace TsAGE
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index 7cfec718e2..a5293a5ad1 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -30,8 +30,9 @@
#include "tsage/events.h"
#include "tsage/sound.h"
#include "tsage/saveload.h"
+#include "tsage/user_interface.h"
-namespace tSage {
+namespace TsAGE {
class Globals : public SavedObject {
private:
@@ -40,7 +41,7 @@ public:
GfxSurface _screenSurface;
GfxManager _gfxManagerInstance;
Common::List<GfxManager *> _gfxManagers;
- SceneHandler _sceneHandler;
+ SceneHandler *_sceneHandler;
Game *_game;
EventsClass _events;
SceneManager _sceneManager;
@@ -54,7 +55,7 @@ public:
int _gfxFontNumber;
GfxColors _gfxColors;
GfxColors _fontColors;
- byte _unkColor1, _unkColor2, _unkColor3;
+ byte _color1, _color2, _color3;
SoundManager _soundManager;
Common::Point _dialogCenter;
WalkRegions _walkRegions;
@@ -76,7 +77,6 @@ public:
Globals();
~Globals();
- void reset();
void setFlag(int flagNum) {
assert((flagNum >= 0) && (flagNum < MAX_FLAGS));
_flags[flagNum] = true;
@@ -93,15 +93,160 @@ public:
GfxManager &gfxManager() { return **_gfxManagers.begin(); }
virtual Common::String getClassName() { return "Globals"; }
virtual void synchronize(Serializer &s);
+ virtual void reset();
+
void dispatchSounds();
};
-extern Globals *_globals;
+typedef bool (*SelectItemProc)(int objectNumber);
+
+/**
+ * The following class represents common globals that were introduced after the release of Ringworld.
+ */
+class TsAGE2Globals: public Globals {
+public:
+ UIElements _uiElements;
+ SelectItemProc _onSelectItem;
+ int _interfaceY;
+
+ TsAGE2Globals() { _onSelectItem = NULL; }
+ virtual void reset();
+};
+
+extern Globals *g_globals;
-// Note: Currently this can't be part of the _globals structure, since it needs to be constructed
+#define GLOBALS (*::TsAGE::g_globals)
+#define T2_GLOBALS (*((::TsAGE::TsAGE2Globals *)g_globals))
+#define BF_GLOBALS (*((::TsAGE::BlueForce::BlueForceGlobals *)g_globals))
+#define R2_GLOBALS (*((::TsAGE::Ringworld2::Ringworld2Globals *)g_globals))
+
+// Note: Currently this can't be part of the g_globals structure, since it needs to be constructed
// prior to many of the fields in Globals execute their constructors
-extern ResourceManager *_resourceManager;
+extern ResourceManager *g_resourceManager;
+
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+enum Bookmark {
+ bNone,
+ bStartOfGame, bCalledToDomesticViolence, bArrestedGreen, bLauraToParamedics,
+ bBookedGreen, bStoppedFrankie, bBookedFrankie, bBookedFrankieEvidence,
+ bEndOfWorkDayOne, bTalkedToGrannyAboutSkipsCard, bLyleStoppedBy, bEndDayOne,
+ bInspectionDone, bCalledToDrunkStop, bArrestedDrunk, bEndDayTwo,
+ bFlashBackOne, bFlashBackTwo, bFlashBackThree, bDroppedOffLyle, bEndDayThree,
+ bDoneWithIsland, bDoneAtLyles, bEndDayFour, bInvestigateBoat, bFinishedWGreen,
+ bAmbushed, bAmbushOver, bEndOfGame
+};
+
+enum Flag {
+ JAKE_FILE_COPIED, gunClean, onBike, onDuty, fShowedIdToKate, fLateToMarina,
+ fCalledBackup, fWithLyle, gunDrawn, fBackupArrived340, fBriefedBackup,
+ fGotAllSkip340, fToldToLeave340, fBackupIn350, fNetInBoat, fForbesWaiting,
+ fWithCarter, fTalkedToTony, fMugOnKate, takenWeasel, gotTrailer450,
+ showEugeneNapkin, showRapEugene, fMgrCallsWeasel, fCarterMetLyle,
+ fGunLoaded, fLoadedSpare, showEugeneID, fRandomShot350, examinedFile810,
+ shownLyleCrate1, shownLyleRapsheet, shownLyleDisk, shownLylePO,
+ fCanDrawGun, fGotAutoWeapon, fGotBulletsFromDash, fShotSuttersDesk,
+ greenTaken, fLateToDrunkStop, didDrunk, fSearchedTruck, seenFolder,
+ showMugAround, frankInJail, fTalkedCarterDay3, fDecryptedBluePrints,
+ fTalkedToDrunkInCar, fToldLyleOfSchedule, fTalkedShooterNoBkup,
+ fTalkedDriverNoBkup, fDriverOutOfTruck, readGreenRights, readFrankRights,
+ talkedToHarrisAboutDrunk, unlockBoat, fShootGoon, fBlowUpGoon,
+ fTalkedToBarry, fTalkedToLarry, fLeftTraceIn920, fLeftTraceIn900,
+ fBackupAt340, fShotNicoIn910, fGotPointsForTktBook, fGotPointsForMCard,
+ fShowedBluePrint, fGotPointsForPunch, fGotPointsForBox, fGotPointsForBank,
+ fGotPointsForCombo, fGotPointsForCoin, fGotPointsForCPU, fGotPointsForBoots,
+ fGotPointsForCrate, fGotPointsForBlackCord, fGotPointsForGeneratorPlug,
+ fGotPointsForFuseBoxPlug, fGotPointsForStartGenerator, fGotPointsForLightsOn,
+ fGotPointsForOpeningDoor, fGotPointsForClosingDoor, fGotPointsForLightsOff,
+ fGotPointsForGeneratorOff, fGotPointsForCordOnForklift, fGotPointsForCuffingNico,
+ fGotPointsForCuffingDA, fGotPointsForSearchingNico, fGotPointsForSearchingDA,
+ fLeftTraceIn910, fBookedGreenEvidence, fGotPointsForCleaningGun,
+ fGotPointsForMemo, fGotPointsForFBI, fTookTrailerAmmo, fAlertedGreen355,
+ fGotGreen355fTalkedToGrannyDay3, shownFax, beenToJRDay2, shownLyleCrate1Day1,
+ fLyleOnIsland, iWasAmbushed, fGangInCar, fArrivedAtGangStop, ticketVW,
+ f1015Marina, fCan1015Marina, f1015Frankie, fCan1015Frankie, f1015Drunk,
+ fCan1015Drunk, f1027Marina, fCan1027Marina, f1027Frankie, fCan1027Frankie,
+ f1027Drunk, fCan1027Drunk, f1035Marina, fCan1035Marina, f1035Frankie,
+ fCan1035Frankie, f1035Drunk, fCan1035Drunk, f1097Marina, fCan1097Marina,
+ f1097Frankie, fCan1097Frankie, f1097Drunk, fCan1097Drunk, f1098Marina,
+ fCan1098Marina, f1098Frankie, fCan1098Frankie, f1098Drunk, fCan1098Drunk,
+ fCuffedFrankie, fGotPointsForTrapDog, fGotPointsForUnlockGate,
+ fGotPointsForUnlockWarehouse, fGotPointsForLockWarehouse, fGotPointsForLockGate,
+ fGotPointsForFreeDog, fGotPointsForWhistleDog, fGivenNapkin, fCan1004Marina,
+ fCan1004Drunk, fHasLeftDrunk, fHasDrivenFromDrunk, fCrateOpen, fSawGuns,
+ hookPoints
+};
+
+class BlueForceGlobals: public TsAGE2Globals {
+public:
+ ASoundExt _sound1, _sound2, _sound3;
+ StripProxy _stripProxy;
+ int _dayNumber;
+ int _v4CEA4;
+ int _v4CEAA;
+ int _marinaWomanCtr;
+ int _v4CEB0;
+ int _v4CEB6;
+ int _safeCombination;
+ int _v4CEC0;
+ int _greenDay5TalkCtr;
+ int _v4CEC4;
+ int _v4CEC8;
+ int _v4CECA;
+ int _v4CECC;
+ int8 _v4CECE[18];
+ int _v4CEE0;
+ int _v4CEE2;
+ int _v4CEE4;
+ int _v4CEE6;
+ int _v4CEE8;
+ int _deziTopic;
+ int _deathReason;
+ int _driveFromScene;
+ int _driveToScene;
+ int _v501F8;
+ int _v501FA;
+ int _v501FC;
+ int _v5020C;
+ int _v50696;
+ uint8 _v5098C;
+ uint8 _v5098D;
+ int _v50CC2;
+ int _v50CC4;
+ int _v50CC6;
+ int _v50CC8;
+ int _v51C42;
+ int _v51C44;
+ Bookmark _bookmark;
+ int _mapLocationId;
+ int _clip1Bullets, _clip2Bullets;
+
+ BlueForceGlobals();
+ bool getHasBullets();
+
+ virtual Common::String getClassName() { return "BFGlobals"; }
+ virtual void synchronize(Serializer &s);
+ virtual void reset();
+ void set2Flags(int flagNum);
+ bool removeFlag(int flagNum);
+};
+
+} // End of namespace BlueForce
+
+namespace Ringworld2 {
+
+class Ringworld2Globals: public TsAGE2Globals {
+public:
+ ASoundExt _sound1, _sound2, _sound3, _sound4;
+
+ virtual void reset();
+};
+
+} // End of namespace Ringworld2
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp
index 1d432724dc..4b2da0b456 100644
--- a/engines/tsage/graphics.cpp
+++ b/engines/tsage/graphics.cpp
@@ -30,7 +30,7 @@
#include "graphics/surface.h"
#include "tsage/globals.h"
-namespace tSage {
+namespace TsAGE {
/**
* Creates a new graphics surface with the specified area of another surface
@@ -120,7 +120,7 @@ GfxSurface surfaceFromRes(const byte *imgData) {
GfxSurface surfaceFromRes(int resNum, int rlbNum, int subNum) {
uint size;
- byte *imgData = _resourceManager->getSubResource(resNum, rlbNum, subNum, &size);
+ byte *imgData = g_resourceManager->getSubResource(resNum, rlbNum, subNum, &size);
GfxSurface surface = surfaceFromRes(imgData);
DEALLOCATE(imgData);
@@ -202,8 +202,8 @@ void Rect::resize(const GfxSurface &surface, int xp, int yp, int percent) {
* Expands the pane region to contain the specified Rect
*/
void Rect::expandPanes() {
- _globals->_paneRegions[0].uniteRect(*this);
- _globals->_paneRegions[1].uniteRect(*this);
+ g_globals->_paneRegions[0].uniteRect(*this);
+ g_globals->_paneRegions[1].uniteRect(*this);
}
/**
@@ -326,7 +326,7 @@ void GfxSurface::synchronize(Serializer &s) {
s.syncAsSint16LE(zero);
}
} else {
- int w, h;
+ int w = 0, h = 0;
s.syncAsSint16LE(w);
s.syncAsSint16LE(h);
@@ -408,7 +408,7 @@ bool GfxSurface::displayText(const Common::String &msg, const Common::Point &pt)
// Write for a mouse or keypress
Event event;
- while (!_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !_vm->getEventManager()->shouldQuit())
+ while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit())
;
// Restore the display area
@@ -423,15 +423,15 @@ bool GfxSurface::displayText(const Common::String &msg, const Common::Point &pt)
* Loads a quarter of a screen from a resource
*/
void GfxSurface::loadScreenSection(Graphics::Surface &dest, int xHalf, int yHalf, int xSection, int ySection) {
- int screenNum = _globals->_sceneManager._scene->_activeScreenNumber;
+ int screenNum = g_globals->_sceneManager._scene->_activeScreenNumber;
Rect updateRect(0, 0, 160, 100);
updateRect.translate(xHalf * 160, yHalf * 100);
- int xHalfCount = (_globals->_sceneManager._scene->_backgroundBounds.right + 159) / 160;
- int yHalfCount = (_globals->_sceneManager._scene->_backgroundBounds.bottom + 99) / 100;
+ int xHalfCount = (g_globals->_sceneManager._scene->_backgroundBounds.right + 159) / 160;
+ int yHalfCount = (g_globals->_sceneManager._scene->_backgroundBounds.bottom + 99) / 100;
if (xSection < xHalfCount && ySection < yHalfCount) {
int rlbNum = xSection * yHalfCount + ySection;
- byte *data = _resourceManager->getResource(RES_BITMAP, screenNum, rlbNum);
+ byte *data = g_resourceManager->getResource(RES_BITMAP, screenNum, rlbNum);
for (int y = 0; y < updateRect.height(); ++y) {
byte *pSrc = data + y * 160;
@@ -582,8 +582,8 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Regi
while (tempSrc < (pSrc + destBounds.width())) {
if (!priorityRegion || !priorityRegion->contains(Common::Point(
- xp + _globals->_sceneManager._scene->_sceneBounds.left,
- destBounds.top + y + _globals->_sceneManager._scene->_sceneBounds.top))) {
+ xp + g_globals->_sceneManager._scene->_sceneBounds.left,
+ destBounds.top + y + g_globals->_sceneManager._scene->_sceneBounds.top))) {
if (*tempSrc != src._transColor)
*tempDest = *tempSrc;
}
@@ -609,7 +609,7 @@ void GfxSurface::draw(const Common::Point &pt, Rect *rect) {
*rect = tempRect;
} else {
// Draw image
- _globals->gfxManager().copyFrom(*this, tempRect, NULL);
+ g_globals->gfxManager().copyFrom(*this, tempRect, NULL);
}
}
@@ -623,12 +623,12 @@ GfxElement::GfxElement() {
void GfxElement::setDefaults() {
_flags = 0;
- _fontNumber = _globals->_gfxFontNumber;
- _colors = _globals->_gfxColors;
- _fontColors = _globals->_fontColors;
- _unkColor1 = _globals->_unkColor1;
- _unkColor2 = _globals->_unkColor2;
- _unkColor3 = _globals->_unkColor3;
+ _fontNumber = g_globals->_gfxFontNumber;
+ _colors = g_globals->_gfxColors;
+ _fontColors = g_globals->_fontColors;
+ _color1 = g_globals->_color1;
+ _color2 = g_globals->_color2;
+ _color3 = g_globals->_color3;
}
/**
@@ -636,13 +636,13 @@ void GfxElement::setDefaults() {
*/
void GfxElement::highlight() {
// Get a lock on the surface
- GfxManager &gfxManager = _globals->gfxManager();
+ GfxManager &gfxManager = g_globals->gfxManager();
Graphics::Surface surface = gfxManager.lockSurface();
// Scan through the contents of the element, switching any occurances of the foreground
// color with the background color and vice versa
Rect tempRect(_bounds);
- tempRect.collapse(_globals->_gfxEdgeAdjust - 1, _globals->_gfxEdgeAdjust - 1);
+ tempRect.collapse(g_globals->_gfxEdgeAdjust - 1, g_globals->_gfxEdgeAdjust - 1);
for (int yp = tempRect.top; yp < tempRect.bottom; ++yp) {
byte *lineP = (byte *)surface.getBasePtr(tempRect.left, yp);
@@ -661,7 +661,7 @@ void GfxElement::highlight() {
*/
void GfxElement::drawFrame() {
// Get a lock on the surface and save the active font
- GfxManager &gfxManager = _globals->gfxManager();
+ GfxManager &gfxManager = g_globals->gfxManager();
gfxManager.lockSurface();
uint8 bgColor, fgColor;
@@ -674,7 +674,7 @@ void GfxElement::drawFrame() {
}
Rect tempRect = _bounds;
- tempRect.collapse(_globals->_gfxEdgeAdjust, _globals->_gfxEdgeAdjust);
+ tempRect.collapse(g_globals->_gfxEdgeAdjust, g_globals->_gfxEdgeAdjust);
tempRect.collapse(-1, -1);
gfxManager.fillRect(tempRect, _colors.background);
@@ -715,10 +715,10 @@ bool GfxElement::focusedEvent(Event &event) {
// HACK: It should use the GfxManager object to figure out the relative
// position, but for now this seems like the easiest way.
- int xOffset = mousePos.x - _globals->_events._mousePos.x;
- int yOffset = mousePos.y - _globals->_events._mousePos.y;
+ int xOffset = mousePos.x - g_globals->_events._mousePos.x;
+ int yOffset = mousePos.y - g_globals->_events._mousePos.y;
- while (event.eventType != EVENT_BUTTON_UP && !_vm->getEventManager()->shouldQuit()) {
+ while (event.eventType != EVENT_BUTTON_UP && !g_vm->shouldQuit()) {
g_system->delayMillis(10);
if (_bounds.contains(mousePos)) {
@@ -733,7 +733,7 @@ bool GfxElement::focusedEvent(Event &event) {
highlight();
}
- if (_globals->_events.getEvent(event, EVENT_MOUSE_MOVE | EVENT_BUTTON_UP)) {
+ if (g_globals->_events.getEvent(event, EVENT_MOUSE_MOVE | EVENT_BUTTON_UP)) {
if (event.eventType == EVENT_MOUSE_MOVE) {
mousePos.x = event.mousePos.x + xOffset;
mousePos.y = event.mousePos.y + yOffset;
@@ -769,7 +769,7 @@ void GfxImage::setDefaults() {
// Decode the image
uint size;
- byte *imgData = _resourceManager->getSubResource(_resNum, _rlbNum, _cursorNum, &size);
+ byte *imgData = g_resourceManager->getSubResource(_resNum, _rlbNum, _cursorNum, &size);
_surface = surfaceFromRes(imgData);
DEALLOCATE(imgData);
@@ -781,9 +781,9 @@ void GfxImage::setDefaults() {
void GfxImage::draw() {
Rect tempRect = _bounds;
- tempRect.translate(_globals->gfxManager()._topLeft.x, _globals->gfxManager()._topLeft.y);
+ tempRect.translate(g_globals->gfxManager()._topLeft.x, g_globals->gfxManager()._topLeft.y);
- _globals->gfxManager().copyFrom(_surface, tempRect);
+ g_globals->gfxManager().copyFrom(_surface, tempRect);
}
/*--------------------------------------------------------------------------*/
@@ -805,7 +805,7 @@ void GfxMessage::setDefaults() {
GfxElement::setDefaults();
GfxFontBackup font;
- GfxManager &gfxManager = _globals->gfxManager();
+ GfxManager &gfxManager = g_globals->gfxManager();
Rect tempRect;
gfxManager._font.setFontNumber(this->_fontNumber);
@@ -818,15 +818,15 @@ void GfxMessage::setDefaults() {
void GfxMessage::draw() {
GfxFontBackup font;
- GfxManager &gfxManager = _globals->gfxManager();
+ GfxManager &gfxManager = g_globals->gfxManager();
// Set the font and color
gfxManager.setFillFlag(false);
gfxManager._font.setFontNumber(_fontNumber);
- gfxManager._font._colors.foreground = this->_unkColor1;
- gfxManager._font._colors2.background = this->_unkColor2;
- gfxManager._font._colors2.foreground = this->_unkColor3;
+ gfxManager._font._colors.foreground = this->_color1;
+ gfxManager._font._colors2.background = this->_color2;
+ gfxManager._font._colors2.foreground = this->_color3;
// Display the text
gfxManager._font.writeLines(_message.c_str(), _bounds, _textAlign);
@@ -838,7 +838,7 @@ void GfxButton::setDefaults() {
GfxElement::setDefaults();
GfxFontBackup font;
- GfxManager &gfxManager = _globals->gfxManager();
+ GfxManager &gfxManager = g_globals->gfxManager();
Rect tempRect;
// Get the string bounds and round up the x end to a multiple of 16
@@ -847,8 +847,8 @@ void GfxButton::setDefaults() {
tempRect.right = ((tempRect.right + 15) / 16) * 16;
// Set the button bounds
- tempRect.collapse(-_globals->_gfxEdgeAdjust, -_globals->_gfxEdgeAdjust);
- if (_vm->getFeatures() & GF_CD)
+ tempRect.collapse(-g_globals->_gfxEdgeAdjust, -g_globals->_gfxEdgeAdjust);
+ if (g_vm->getFeatures() & GF_CD)
--tempRect.top;
tempRect.moveTo(_bounds.left, _bounds.top);
_bounds = tempRect;
@@ -857,7 +857,7 @@ void GfxButton::setDefaults() {
void GfxButton::draw() {
// Get a lock on the surface and save the active font
GfxFontBackup font;
- GfxManager &gfxManager = _globals->gfxManager();
+ GfxManager &gfxManager = g_globals->gfxManager();
gfxManager.lockSurface();
// Draw a basic frame for the button
@@ -867,14 +867,14 @@ void GfxButton::draw() {
gfxManager._font.setFontNumber(_fontNumber);
//
- gfxManager._font._colors.foreground = this->_unkColor1;
- gfxManager._font._colors2.background = this->_unkColor2;
- gfxManager._font._colors2.foreground = this->_unkColor3;
+ gfxManager._font._colors.foreground = this->_color1;
+ gfxManager._font._colors2.background = this->_color2;
+ gfxManager._font._colors2.foreground = this->_color3;
// Display the button's text
Rect tempRect(_bounds);
- tempRect.collapse(_globals->_gfxEdgeAdjust, _globals->_gfxEdgeAdjust);
- if (_vm->getFeatures() & GF_CD)
+ tempRect.collapse(g_globals->_gfxEdgeAdjust, g_globals->_gfxEdgeAdjust);
+ if (g_vm->getFeatures() & GF_CD)
++tempRect.top;
gfxManager._font.writeLines(_message.c_str(), tempRect, ALIGN_CENTER);
@@ -936,14 +936,14 @@ void GfxDialog::setDefaults() {
// Set the dialog boundaries
_gfxManager._bounds = tempRect;
- tempRect.collapse(-_globals->_gfxEdgeAdjust * 2, -_globals->_gfxEdgeAdjust * 2);
+ tempRect.collapse(-g_globals->_gfxEdgeAdjust * 2, -g_globals->_gfxEdgeAdjust * 2);
_bounds = tempRect;
}
void GfxDialog::remove() {
if (_savedArea) {
// Restore the area the dialog covered
- _globals->_gfxManagerInstance.copyFrom(*_savedArea, _bounds.left, _bounds.top);
+ g_globals->_gfxManagerInstance.copyFrom(*_savedArea, _bounds.left, _bounds.top);
delete _savedArea;
_savedArea = NULL;
@@ -954,7 +954,7 @@ void GfxDialog::draw() {
Rect tempRect(_bounds);
// Make a backup copy of the area the dialog will occupy
- _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds);
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds);
// Set the palette for use in the dialog
setPalette();
@@ -966,7 +966,7 @@ void GfxDialog::draw() {
drawFrame();
// Reset the dialog's graphics manager to only draw within the dialog boundaries
- tempRect.translate(_globals->_gfxEdgeAdjust * 2, _globals->_gfxEdgeAdjust * 2);
+ tempRect.translate(g_globals->_gfxEdgeAdjust * 2, g_globals->_gfxEdgeAdjust * 2);
_gfxManager._bounds = tempRect;
// Draw each element in the dialog in order
@@ -1003,7 +1003,7 @@ void GfxDialog::addElements(GfxElement *ge, ...) {
}
void GfxDialog::setTopLeft(int xp, int yp) {
- _bounds.moveTo(xp - _globals->_gfxEdgeAdjust * 2, yp - _globals->_gfxEdgeAdjust * 2);
+ _bounds.moveTo(xp - g_globals->_gfxEdgeAdjust * 2, yp - g_globals->_gfxEdgeAdjust * 2);
}
void GfxDialog::setCenter(int xp, int yp) {
@@ -1029,9 +1029,9 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) {
GfxButton *selectedButton = NULL;
bool breakFlag = false;
- while (!_vm->getEventManager()->shouldQuit() && !breakFlag) {
+ while (!g_vm->shouldQuit() && !breakFlag) {
Event event;
- while (_globals->_events.getEvent(event) && !breakFlag) {
+ while (g_globals->_events.getEvent(event) && !breakFlag) {
// Adjust mouse positions to be relative within the dialog
event.mousePos.x -= _gfxManager._bounds.left;
event.mousePos.y -= _gfxManager._bounds.top;
@@ -1069,17 +1069,28 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) {
}
void GfxDialog::setPalette() {
- _globals->_scenePalette.loadPalette(0);
- _globals->_scenePalette.setPalette(0, 1);
- _globals->_scenePalette.setPalette(_globals->_scenePalette._colors.foreground, 1);
- _globals->_scenePalette.setPalette(_globals->_fontColors.background, 1);
- _globals->_scenePalette.setPalette(_globals->_fontColors.foreground, 1);
- _globals->_scenePalette.setPalette(255, 1);
+ if (g_vm->getGameID() == GType_BlueForce) {
+ g_globals->_scenePalette.loadPalette(2);
+ g_globals->_scenePalette.setPalette(0, 1);
+ g_globals->_scenePalette.setPalette(g_globals->_gfxColors.background, 1);
+ g_globals->_scenePalette.setPalette(g_globals->_gfxColors.foreground, 1);
+ g_globals->_scenePalette.setPalette(g_globals->_fontColors.background, 1);
+ g_globals->_scenePalette.setPalette(g_globals->_fontColors.foreground, 1);
+ g_globals->_scenePalette.setEntry(255, 0xff, 0xff, 0xff);
+ g_globals->_scenePalette.setPalette(255, 1);
+ } else {
+ g_globals->_scenePalette.loadPalette(0);
+ g_globals->_scenePalette.setPalette(0, 1);
+ g_globals->_scenePalette.setPalette(g_globals->_scenePalette._colors.foreground, 1);
+ g_globals->_scenePalette.setPalette(g_globals->_fontColors.background, 1);
+ g_globals->_scenePalette.setPalette(g_globals->_fontColors.foreground, 1);
+ g_globals->_scenePalette.setPalette(255, 1);
+ }
}
/*--------------------------------------------------------------------------*/
-GfxManager::GfxManager() : _surface(_globals->_screenSurface), _oldManager(NULL) {
+GfxManager::GfxManager() : _surface(g_globals->_screenSurface), _oldManager(NULL) {
_font.setOwner(this);
_font._fillFlag = false;
_bounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
@@ -1098,19 +1109,19 @@ void GfxManager::setDefaults() {
_pane0Rect4 = screenBounds;
_font._edgeSize = Common::Point(1, 1);
- _font._colors = _globals->_fontColors;
- _font.setFontNumber(_globals->_gfxFontNumber);
+ _font._colors = g_globals->_fontColors;
+ _font.setFontNumber(g_globals->_gfxFontNumber);
}
void GfxManager::activate() {
- assert(!contains(_globals->_gfxManagers, this));
- _globals->_gfxManagers.push_front(this);
+ assert(!contains(g_globals->_gfxManagers, this));
+ g_globals->_gfxManagers.push_front(this);
}
void GfxManager::deactivate() {
// Assert that there will still be another manager, and we're correctly removing our own
- assert((_globals->_gfxManagers.size() > 1) && (&_globals->gfxManager() == this));
- _globals->_gfxManagers.pop_front();
+ assert((g_globals->_gfxManagers.size() > 1) && (&g_globals->gfxManager() == this));
+ g_globals->_gfxManagers.pop_front();
}
int GfxManager::getStringWidth(const char *s, int numChars) {
@@ -1148,7 +1159,7 @@ void GfxManager::setDialogPalette() {
// Get the main palette information
byte palData[256 * 3];
uint count, start;
- _resourceManager->getPalette(0, &palData[0], &start, &count);
+ g_resourceManager->getPalette(0, &palData[0], &start, &count);
g_system->getPaletteManager()->setPalette(&palData[0], start, count);
// Miscellaneous
@@ -1183,7 +1194,7 @@ int GfxManager::getAngle(const Common::Point &p1, const Common::Point &p2) {
GfxFont::GfxFont() {
- _fontNumber = (_vm->getFeatures() & GF_DEMO) ? 0 : 50;
+ _fontNumber = (g_vm->getFeatures() & GF_DEMO) ? 0 : 50;
_numChars = 0;
_bpp = 0;
_fontData = NULL;
@@ -1207,9 +1218,9 @@ void GfxFont::setFontNumber(uint32 fontNumber) {
_fontNumber = fontNumber;
- _fontData = _resourceManager->getResource(RES_FONT, _fontNumber, 0, true);
+ _fontData = g_resourceManager->getResource(RES_FONT, _fontNumber, 0, true);
if (!_fontData)
- _fontData = _resourceManager->getResource(RES_FONT, _fontNumber, 0);
+ _fontData = g_resourceManager->getResource(RES_FONT, _fontNumber, 0);
_numChars = READ_LE_UINT16(_fontData + 4);
_fontSize.y = READ_LE_UINT16(_fontData + 6);
@@ -1498,18 +1509,18 @@ void GfxFont::writeLines(const char *s, const Rect &bounds, TextAlign align) {
/*--------------------------------------------------------------------------*/
GfxFontBackup::GfxFontBackup() {
- _edgeSize = _globals->gfxManager()._font._edgeSize;
- _position = _globals->gfxManager()._font._position;
- _colors = _globals->gfxManager()._font._colors;
- _fontNumber = _globals->gfxManager()._font._fontNumber;
+ _edgeSize = g_globals->gfxManager()._font._edgeSize;
+ _position = g_globals->gfxManager()._font._position;
+ _colors = g_globals->gfxManager()._font._colors;
+ _fontNumber = g_globals->gfxManager()._font._fontNumber;
}
GfxFontBackup::~GfxFontBackup() {
- _globals->gfxManager()._font.setFontNumber(_fontNumber);
- _globals->gfxManager()._font._edgeSize = _edgeSize;
- _globals->gfxManager()._font._position = _position;
- _globals->gfxManager()._font._colors = _colors;
+ g_globals->gfxManager()._font.setFontNumber(_fontNumber);
+ g_globals->gfxManager()._font._edgeSize = _edgeSize;
+ g_globals->gfxManager()._font._position = _position;
+ g_globals->gfxManager()._font._colors = _colors;
}
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h
index e09e1093a3..06b482d7b5 100644
--- a/engines/tsage/graphics.h
+++ b/engines/tsage/graphics.h
@@ -30,7 +30,7 @@
#include "common/system.h"
#include "graphics/surface.h"
-namespace tSage {
+namespace TsAGE {
class GfxSurface;
class Region;
@@ -177,7 +177,7 @@ public:
uint16 _fontNumber;
GfxColors _colors;
GfxColors _fontColors;
- byte _unkColor1, _unkColor2, _unkColor3;
+ byte _color1, _color2, _color3;
uint16 _keycode;
public:
GfxElement();
@@ -343,6 +343,6 @@ GfxSurface *Surface_getArea(GfxSurface &src, const Rect &bounds);
GfxSurface surfaceFromRes(const byte *imgData);
GfxSurface surfaceFromRes(int resNum, int rlbNum, int subNum);
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk
index aefc8b0992..0ea8916647 100644
--- a/engines/tsage/module.mk
+++ b/engines/tsage/module.mk
@@ -1,7 +1,19 @@
MODULE := engines/tsage
MODULE_OBJS := \
- blueforce_logic.o \
+ blue_force/blueforce_dialogs.o \
+ blue_force/blueforce_logic.o \
+ blue_force/blueforce_scenes0.o \
+ blue_force/blueforce_scenes1.o \
+ blue_force/blueforce_scenes2.o \
+ blue_force/blueforce_scenes3.o \
+ blue_force/blueforce_scenes4.o \
+ blue_force/blueforce_scenes5.o \
+ blue_force/blueforce_scenes6.o \
+ blue_force/blueforce_scenes7.o \
+ blue_force/blueforce_scenes8.o \
+ blue_force/blueforce_scenes9.o \
+ blue_force/blueforce_speakers.o \
converse.o \
core.o \
debugger.o \
@@ -11,27 +23,32 @@ MODULE_OBJS := \
globals.o \
graphics.o \
resources.o \
- ringworld_demo.o \
- ringworld_logic.o \
- ringworld_scenes1.o \
- ringworld_scenes2.o \
- ringworld_scenes3.o \
- ringworld_scenes4.o \
- ringworld_scenes5.o \
- ringworld_scenes6.o \
- ringworld_scenes8.o \
- ringworld_scenes10.o \
+ ringworld/ringworld_demo.o \
+ ringworld/ringworld_dialogs.o \
+ ringworld/ringworld_logic.o \
+ ringworld/ringworld_scenes1.o \
+ ringworld/ringworld_scenes2.o \
+ ringworld/ringworld_scenes3.o \
+ ringworld/ringworld_scenes4.o \
+ ringworld/ringworld_scenes5.o \
+ ringworld/ringworld_scenes6.o \
+ ringworld/ringworld_scenes8.o \
+ ringworld/ringworld_scenes10.o \
+ ringworld/ringworld_speakers.o \
+ ringworld2/ringworld2_dialogs.o \
+ ringworld2/ringworld2_logic.o \
+ ringworld2/ringworld2_scenes0.o \
saveload.o \
scenes.o \
sound.o \
staticres.o \
- tsage.o
+ tsage.o \
+ user_interface.o
# This module can be built as a plugin
ifeq ($(ENABLE_TSAGE), DYNAMIC_PLUGIN)
PLUGIN := 1
endif
-# Include common rules
+# Include common rules
include $(srcdir)/rules.mk
-
diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp
index d24c564a1f..652ab32350 100644
--- a/engines/tsage/resources.cpp
+++ b/engines/tsage/resources.cpp
@@ -28,7 +28,7 @@
#include "tsage/resources.h"
#include "tsage/tsage.h"
-namespace tSage {
+namespace TsAGE {
MemoryManager::MemoryManager() {
@@ -237,8 +237,13 @@ byte *TLib::getResource(uint16 id, bool suppressErrors) {
uint16 ctrCurrent = 0x102, ctrMax = 0x200;
uint16 word_48050 = 0, currentToken = 0, word_48054 =0;
byte byte_49068 = 0, byte_49069 = 0;
- DecodeReference table[0x1000];
- for (int i = 0; i < 0x1000; ++i) {
+
+ const uint tableSize = 0x1000;
+ DecodeReference *table = (DecodeReference *)malloc(tableSize * sizeof(DecodeReference));
+ if (!table)
+ error("[TLib::getResource] Cannot allocate table buffer");
+
+ for (uint i = 0; i < tableSize; ++i) {
table[i].vByte = table[i].vWord = 0;
}
Common::Stack<uint16> tokenList;
@@ -302,6 +307,8 @@ byte *TLib::getResource(uint16 id, bool suppressErrors) {
}
}
+ free(table);
+
assert(bytesWritten == re->uncompressedSize);
delete compStream;
return dataOut;
@@ -347,6 +354,8 @@ void TLib::loadIndex() {
se.resNum = resNum;
se.resType = (ResourceType)(configId & 0x1f);
se.fileOffset = (((configId >> 5) & 0x7ff) << 16) | fileOffset;
+ if (g_vm->getGameID() == GType_Ringworld2)
+ se.fileOffset <<= 4;
_sections.push_back(se);
}
@@ -431,7 +440,7 @@ ResourceManager::~ResourceManager() {
void ResourceManager::addLib(const Common::String &libName) {
assert(_libList.size() < 5);
- _libList.push_back(new TLib(_vm->_memoryManager, libName));
+ _libList.push_back(new TLib(g_vm->_memoryManager, libName));
}
byte *ResourceManager::getResource(uint16 id, bool suppressErrors) {
@@ -497,4 +506,4 @@ Common::String ResourceManager::getMessage(int resNum, int lineNum, bool suppres
return result;
}
-} // end of namespace tSage
+} // end of namespace TsAGE
diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h
index efbb86b24e..8f90b21908 100644
--- a/engines/tsage/resources.h
+++ b/engines/tsage/resources.h
@@ -33,7 +33,7 @@
#include "common/util.h"
#include "graphics/surface.h"
-namespace tSage {
+namespace TsAGE {
// Magic number used by original game to identify valid memory blocks
const uint32 MEMORY_ENTRY_ID = 0xE11DA722;
@@ -42,7 +42,10 @@ const int MEMORY_POOL_SIZE = 1000;
enum ResourceType { RES_LIBRARY, RES_STRIP, RES_IMAGE, RES_PALETTE, RES_VISAGE, RES_SOUND, RES_MESSAGE,
RES_FONT, RES_POINTER, RES_BANK, RES_SND_DRIVER, RES_PRIORITY, RES_CONTROL, RES_WALKRGNS,
- RES_BITMAP, RES_SAVE, RES_SEQUENCE };
+ RES_BITMAP, RES_SAVE, RES_SEQUENCE,
+ // Return to Ringworld specific resource types
+ RT17, RT18, RT19, RT20, RT21, RT22, RT23, RT24, RT25, RT26, RT27, RT28, RT29, RT30, RT31
+};
class MemoryHeader {
public:
@@ -175,6 +178,6 @@ public:
};
-} // end of namespace tSage
+} // end of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld/ringworld_demo.cpp
index b24fec98f9..fedb19c804 100644
--- a/engines/tsage/ringworld_demo.cpp
+++ b/engines/tsage/ringworld/ringworld_demo.cpp
@@ -20,18 +20,20 @@
*
*/
-#include "tsage/ringworld_demo.h"
+#include "tsage/ringworld/ringworld_demo.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
void RingworldDemoGame::start() {
// Start the demo's single scene
- _globals->_sceneManager.changeScene(1);
+ g_globals->_sceneManager.changeScene(1);
- _globals->_events.setCursor(CURSOR_NONE);
+ g_globals->_events.setCursor(CURSOR_NONE);
}
Scene *RingworldDemoGame::createScene(int sceneNumber) {
@@ -39,13 +41,21 @@ Scene *RingworldDemoGame::createScene(int sceneNumber) {
return new RingworldDemoScene();
}
+bool RingworldDemoGame::canLoadGameStateCurrently() {
+ return false;
+}
+
+bool RingworldDemoGame::canSaveGameStateCurrently() {
+ return false;
+}
+
void RingworldDemoGame::quitGame() {
if (MessageDialog::show(DEMO_EXIT_MSG, EXIT_BTN_STRING, DEMO_BTN_STRING) == 0)
- _vm->quitGame();
+ g_vm->quitGame();
}
void RingworldDemoGame::pauseGame() {
- _globals->_events.setCursor(CURSOR_ARROW);
+ g_globals->_events.setCursor(CURSOR_ARROW);
MessageDialog *dlg = new MessageDialog(DEMO_PAUSED_MSG, EXIT_BTN_STRING, DEMO_RESUME_BTN_STRING);
dlg->draw();
@@ -53,10 +63,10 @@ void RingworldDemoGame::pauseGame() {
bool exitFlag = selectedButton != &dlg->_btn2;
delete dlg;
- _globals->_events.hideCursor();
+ g_globals->_events.hideCursor();
if (exitFlag)
- _vm->quitGame();
+ g_vm->quitGame();
}
void RingworldDemoGame::processEvent(Event &event) {
@@ -72,8 +82,8 @@ void RingworldDemoGame::processEvent(Event &event) {
ConfigDialog *dlg = new ConfigDialog();
dlg->runModal();
delete dlg;
- _globals->_soundManager.syncSounds();
- _globals->_events.setCursorFromFlag();
+ g_globals->_soundManager.syncSounds();
+ g_globals->_events.setCursorFromFlag();
break;
}
@@ -117,4 +127,6 @@ void RingworldDemoScene::process(Event &event) {
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_demo.h b/engines/tsage/ringworld/ringworld_demo.h
index 3e7431e107..7c0ac39285 100644
--- a/engines/tsage/ringworld_demo.h
+++ b/engines/tsage/ringworld/ringworld_demo.h
@@ -30,7 +30,11 @@
#include "tsage/globals.h"
#include "tsage/sound.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class RingworldDemoGame: public Game {
private:
@@ -40,6 +44,8 @@ public:
virtual Scene *createScene(int sceneNumber);
virtual void quitGame();
virtual void processEvent(Event &event);
+ virtual bool canSaveGameStateCurrently();
+ virtual bool canLoadGameStateCurrently();
};
class RingworldDemoScene: public Scene {
@@ -54,6 +60,8 @@ public:
virtual void signal();
};
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld/ringworld_dialogs.cpp b/engines/tsage/ringworld/ringworld_dialogs.cpp
new file mode 100644
index 0000000000..9d1a7effc2
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_dialogs.cpp
@@ -0,0 +1,222 @@
+/* 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.
+ *
+ */
+
+#include "common/translation.h"
+
+#include "gui/dialog.h"
+#include "gui/widget.h"
+
+#include "tsage/tsage.h"
+#include "tsage/core.h"
+#include "tsage/dialogs.h"
+#include "tsage/staticres.h"
+#include "tsage/globals.h"
+#include "tsage/ringworld/ringworld_dialogs.h"
+#include "tsage/ringworld/ringworld_logic.h"
+
+namespace TsAGE {
+
+namespace Ringworld {
+
+/*--------------------------------------------------------------------------*/
+
+#define BUTTON_WIDTH 28
+#define BUTTON_HEIGHT 29
+
+RightClickButton::RightClickButton(int buttonIndex, int xp, int yp) : GfxButton() {
+ _buttonIndex = buttonIndex;
+ this->_bounds.left = xp;
+ this->_bounds.top = yp;
+ this->_bounds.setWidth(BUTTON_WIDTH);
+ this->_bounds.setHeight(BUTTON_HEIGHT);
+ _savedButton = NULL;
+}
+
+void RightClickButton::highlight() {
+ if (_savedButton) {
+ // Button was previously highlighted, so de-highlight by restoring saved area
+ g_globals->gfxManager().copyFrom(*_savedButton, _bounds.left, _bounds.top);
+ delete _savedButton;
+ _savedButton = NULL;
+ } else {
+ // Highlight button by getting the needed highlighted image resource
+ _savedButton = Surface_getArea(g_globals->gfxManager().getSurface(), _bounds);
+
+ uint size;
+ byte *imgData = g_resourceManager->getSubResource(7, 2, _buttonIndex, &size);
+
+ GfxSurface btnSelected = surfaceFromRes(imgData);
+ g_globals->gfxManager().copyFrom(btnSelected, _bounds.left, _bounds.top);
+
+ DEALLOCATE(imgData);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+/**
+ * This dialog implements the right-click dialog
+ */
+RightClickDialog::RightClickDialog() : GfxDialog(),
+ _walkButton(1, 48, 12), _lookButton(2, 31, 29), _useButton(3, 65, 29),
+ _talkButton(4, 14, 47), _inventoryButton(5, 48, 47), _optionsButton(6, 83, 47) {
+ Rect rectArea, dialogRect;
+
+ // Set the palette and change the cursor
+ _gfxManager.setDialogPalette();
+ g_globals->_events.setCursor(CURSOR_ARROW);
+
+ // Get the dialog image
+ _surface = surfaceFromRes(7, 1, 1);
+
+ // Set the dialog position
+ dialogRect.resize(_surface, 0, 0, 100);
+ dialogRect.center(g_globals->_events._mousePos.x, g_globals->_events._mousePos.y);
+
+ // Ensure the dialog will be entirely on-screen
+ Rect screenRect = g_globals->gfxManager()._bounds;
+ screenRect.collapse(4, 4);
+ dialogRect.contain(screenRect);
+
+ _bounds = dialogRect;
+ _gfxManager._bounds = _bounds;
+
+ _highlightedButton = NULL;
+ _selectedAction = -1;
+}
+
+RightClickDialog::~RightClickDialog() {
+}
+
+RightClickButton *RightClickDialog::findButton(const Common::Point &pt) {
+ RightClickButton *btnList[] = { &_walkButton, &_lookButton, &_useButton, &_talkButton, &_inventoryButton, &_optionsButton };
+
+ for (int i = 0; i < 6; ++i) {
+ btnList[i]->_owner = this;
+
+ if (btnList[i]->_bounds.contains(pt))
+ return btnList[i];
+ }
+
+ return NULL;
+}
+
+void RightClickDialog::draw() {
+ // Save the covered background area
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds);
+
+ // Draw the dialog image
+ g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top);
+}
+
+bool RightClickDialog::process(Event &event) {
+ switch (event.eventType) {
+ case EVENT_MOUSE_MOVE: {
+ // Check whether a button is highlighted
+ RightClickButton *btn = findButton(event.mousePos);
+
+ if (btn != _highlightedButton) {
+ // De-highlight any previously selected button
+ if (_highlightedButton) {
+ _highlightedButton->highlight();
+ _highlightedButton = NULL;
+ }
+ if (btn) {
+ // Highlight the new button
+ btn->highlight();
+ _highlightedButton = btn;
+ }
+ }
+ event.handled = true;
+ return true;
+ }
+
+ case EVENT_BUTTON_DOWN:
+ // If a button is highlighted, then flag the selected button index
+ if (_highlightedButton)
+ _selectedAction = _highlightedButton->_buttonIndex;
+ else
+ _selectedAction = _lookButton._buttonIndex;
+ event.handled = true;
+ return true;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+void RightClickDialog::execute() {
+ // Draw the dialog
+ draw();
+
+ // Dialog event handler loop
+ _gfxManager.activate();
+
+ while (!g_vm->shouldQuit() && (_selectedAction == -1)) {
+ Event evt;
+ while (g_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) {
+ evt.mousePos.x -= _bounds.left;
+ evt.mousePos.y -= _bounds.top;
+
+ process(evt);
+ }
+
+ g_system->delayMillis(10);
+ g_system->updateScreen();
+ }
+
+ // Execute the specified action
+ switch (_selectedAction) {
+ case 1:
+ // Look action
+ g_globals->_events.setCursor(CURSOR_LOOK);
+ break;
+ case 2:
+ // Walk action
+ g_globals->_events.setCursor(CURSOR_WALK);
+ break;
+ case 3:
+ // Use cursor
+ g_globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 4:
+ // Talk cursor
+ g_globals->_events.setCursor(CURSOR_TALK);
+ break;
+ case 5:
+ // Inventory dialog
+ InventoryDialog::show();
+ break;
+ case 6:
+ // Dialog options
+ OptionsDialog::show();
+ break;
+ }
+
+ _gfxManager.deactivate();
+}
+
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld/ringworld_dialogs.h b/engines/tsage/ringworld/ringworld_dialogs.h
new file mode 100644
index 0000000000..11a8f10e70
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_dialogs.h
@@ -0,0 +1,70 @@
+/* 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 TSAGE_RINGWORLD_DIALOGS_H
+#define TSAGE_RINGWORLD_DIALOGS_H
+
+#include "gui/options.h"
+#include "tsage/events.h"
+#include "tsage/graphics.h"
+#include "common/list.h"
+#include "common/rect.h"
+#include "common/system.h"
+
+namespace TsAGE {
+
+namespace Ringworld {
+
+class RightClickButton : public GfxButton {
+private:
+ GfxSurface *_savedButton;
+public:
+ int _buttonIndex;
+
+ RightClickButton(int buttonIndex, int xp, int yp);
+ ~RightClickButton() { delete _savedButton; }
+
+ virtual void highlight();
+};
+
+class RightClickDialog : public GfxDialog {
+private:
+ GfxSurface _surface;
+ RightClickButton *_highlightedButton;
+ int _selectedAction;
+ RightClickButton _walkButton, _lookButton, _useButton, _talkButton, _inventoryButton, _optionsButton;
+
+ RightClickButton *findButton(const Common::Point &pt);
+public:
+ RightClickDialog();
+ ~RightClickDialog();
+
+ virtual void draw();
+ virtual bool process(Event &event);
+ void execute();
+};
+
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
new file mode 100644
index 0000000000..ad67b66f69
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -0,0 +1,691 @@
+/* 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.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld/ringworld_demo.h"
+#include "tsage/ringworld/ringworld_dialogs.h"
+#include "tsage/ringworld/ringworld_scenes1.h"
+#include "tsage/ringworld/ringworld_scenes2.h"
+#include "tsage/ringworld/ringworld_scenes3.h"
+#include "tsage/ringworld/ringworld_scenes4.h"
+#include "tsage/ringworld/ringworld_scenes5.h"
+#include "tsage/ringworld/ringworld_scenes6.h"
+#include "tsage/ringworld/ringworld_scenes8.h"
+#include "tsage/ringworld/ringworld_scenes10.h"
+
+namespace TsAGE {
+
+namespace Ringworld {
+
+Scene *RingworldGame::createScene(int sceneNumber) {
+ switch (sceneNumber) {
+ /* Scene group 1 */
+ // Kziniti Palace (Introduction)
+ case 10: return new Scene10();
+ // Outer Space (Introduction)
+ case 15: return new Scene15();
+ // Cut-scenes for Ch'mee house in distance
+ case 20: return new Scene20();
+ // Outside Ch'mee residence
+ case 30: return new Scene30();
+ // Chmeee Home
+ case 40: return new Scene40();
+ // By Flycycles
+ case 50: return new Scene50();
+ // Flycycle controls
+ case 60: return new Scene60();
+ // Shipyard Entrance
+ case 90: return new Scene90();
+ // Ship Close-up
+ case 95: return new Scene95();
+ // Sunflower navigation sequence
+ case 6100: return new Scene6100();
+
+ /* Scene group 2 */
+ // Title screen
+ case 1000: return new Scene1000();
+ // Fleeing planet cutscene
+ case 1001: return new Scene1001();
+ // Unused
+ case 1250: return new Scene1250();
+ // Ringworld Wall
+ case 1400: return new Scene1400();
+ // Ringworld Space-port
+ case 1500: return new Scene1500();
+
+ /* Scene group 3 - Part #1 */
+ // Cockpit cutscenes
+ case 2000: return new Scene2000();
+ // Starcraft - Cockpit
+ case 2100: return new Scene2100();
+ // Encyclopedia
+ case 2120: return new Scene2120();
+ // Starcraft - Level 2
+ case 2150: return new Scene2150();
+ // Starcraft - AutoDoc
+ case 2200: return new Scene2200();
+ // Stasis Field Map
+ case 2222: return new Scene2222();
+ // Starcraft - Quinn's Room
+ case 2230: return new Scene2230();
+
+ /* Scene group 3 - Part #2 */
+ // Starcraft - Storage Room
+ case 2280: return new Scene2280();
+ // Starcraft - Hanger Bay
+ case 2300: return new Scene2300();
+ // Starcraft - Copy Protection Screen
+ case 2310: return new Scene2310();
+ // Starcraft - Lander Bay
+ case 2320: return new Scene2320();
+ // Scene 2400 - Descending in Lander
+ case 2400: return new Scene2400();
+
+ /* Scene group 4 */
+ // Ringworld Scan
+ case 3500: return new Scene3500();
+ // Remote Viewer
+ case 3700: return new Scene3700();
+
+ /* Scene group 5 */
+ // Village
+ case 4000: return new Scene4000();
+ // Village - Outside Lander
+ case 4010: return new Scene4010();
+ // Village - Puzzle Board
+ case 4025: return new Scene4025();
+ // Village - Temple Antechamber
+ case 4045: return new Scene4045();
+ // Village - Temple
+ case 4050: return new Scene4050();
+ // Village - Hut
+ case 4100: return new Scene4100();
+ // Village - Bedroom
+ case 4150: return new Scene4150();
+ // Village - Near Slaver Ship
+ case 4250: return new Scene4250();
+ // Village - Slaver Ship
+ case 4300: return new Scene4300();
+ // Village - Slaver Ship Keypad
+ case 4301: return new Scene4301();
+
+ /* Scene group 6 */
+ // Caverns - Entrance
+ case 5000: return new Scene5000();
+ // Caverns
+ case 5100: return new Scene5100();
+ // Caverns - Throne-room
+ case 5200: return new Scene5200();
+ // Caverns - Pit
+ case 5300: return new Scene5300();
+
+ /* Scene group 8 */
+ // Landing near beach
+ case 7000: return new Scene7000();
+ // Underwater: swimming
+ case 7100: return new Scene7100();
+ // Underwater: Entering the cave
+ case 7200: return new Scene7200();
+ // Underwater: Lord Poria
+ case 7300: return new Scene7300();
+ // Floating Buildings: Outside
+ case 7600: return new Scene7600();
+ // Floating Buildings: In the lab
+ case 7700: return new Scene7700();
+
+ /* Scene group 10 */
+ // Near beach: Slave washing clothes
+ case 9100: return new Scene9100();
+ // Castle: Outside the bulwarks
+ case 9150: return new Scene9150();
+ // Castle: Near the fountain
+ case 9200: return new Scene9200();
+ // Castle: In front of a large guarded door
+ case 9300: return new Scene9300();
+ // Castle: In a hallway
+ case 9350: return new Scene9350();
+ // Castle: In a hallway
+ case 9360: return new Scene9360();
+ // Castle: Black-Smith room
+ case 9400: return new Scene9400();
+ // Castle: Dining room
+ case 9450: return new Scene9450();
+ // Castle: Bedroom
+ case 9500: return new Scene9500();
+ // Castle: Balcony
+ case 9700: return new Scene9700();
+ // Castle: In the garden
+ case 9750: return new Scene9750();
+ // Castle: Dressing room
+ case 9850: return new Scene9850();
+ // Ending
+ case 9900: return new Scene9900();
+ // Space travel
+ case 9999: return new Scene9999();
+
+ default:
+ error("Unknown scene number - %d", sceneNumber);
+ break;
+ }
+}
+
+/**
+ * Returns true if it is currently okay to restore a game
+ */
+bool RingworldGame::canLoadGameStateCurrently() {
+ return !g_globals->getFlag(50);
+}
+
+/**
+ * Returns true if it is currently okay to save the game
+ */
+bool RingworldGame::canSaveGameStateCurrently() {
+ return !g_globals->getFlag(50);
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayHotspot::DisplayHotspot(int regionId, ...) {
+ _sceneRegionId = regionId;
+
+ // Load up the actions
+ va_list va;
+ va_start(va, regionId);
+
+ int param = va_arg(va, int);
+ while (param != LIST_END) {
+ _actions.push_back(param);
+ param = va_arg(va, int);
+ }
+
+ va_end(va);
+}
+
+bool DisplayHotspot::performAction(int action) {
+ for (uint i = 0; i < _actions.size(); i += 3) {
+ if (_actions[i] == action) {
+ display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayObject::DisplayObject(int firstAction, ...) {
+ // Load up the actions
+ va_list va;
+ va_start(va, firstAction);
+
+ int param = firstAction;
+ while (param != LIST_END) {
+ _actions.push_back(param);
+ param = va_arg(va, int);
+ }
+
+ va_end(va);
+}
+
+bool DisplayObject::performAction(int action) {
+ for (uint i = 0; i < _actions.size(); i += 3) {
+ if (_actions[i] == action) {
+ display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SceneArea::SceneArea() {
+ _savedArea = NULL;
+ _pt.x = _pt.y = 0;
+}
+
+SceneArea::~SceneArea() {
+ delete _savedArea;
+}
+
+void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) {
+ _resNum = resNum;
+ _rlbNum = rlbNum;
+ _subNum = subNum;
+ _actionId = actionId;
+
+ _surface = surfaceFromRes(resNum, rlbNum, subNum);
+}
+
+void SceneArea::draw2() {
+ _surface.draw(Common::Point(_bounds.left, _bounds.top));
+}
+
+void SceneArea::display() {
+ _bounds.left = _pt.x - (_surface.getBounds().width() / 2);
+ _bounds.top = _pt.y + 1 - _surface.getBounds().height();
+ _bounds.setWidth(_surface.getBounds().width());
+ _bounds.setHeight(_surface.getBounds().height());
+
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds);
+ draw2();
+}
+
+void SceneArea::restore() {
+ assert(_savedArea);
+ _savedArea->draw(Common::Point(_bounds.left, _bounds.top));
+ delete _savedArea;
+ _savedArea = NULL;
+}
+
+void SceneArea::draw(bool flag) {
+ _surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum);
+ _surface.draw(Common::Point(_bounds.left, _bounds.top));
+}
+
+void SceneArea::wait() {
+ // Wait until a mouse or keypress
+ Event event;
+ while (!g_vm->shouldQuit() && !g_globals->_events.getEvent(event)) {
+ g_system->updateScreen();
+ g_system->delayMillis(10);
+ }
+
+ SynchronizedList<SceneItem *>::iterator ii;
+ for (ii = g_globals->_sceneItems.begin(); ii != g_globals->_sceneItems.end(); ++ii) {
+ SceneItem *sceneItem = *ii;
+ if (sceneItem->contains(event.mousePos)) {
+ sceneItem->doAction(_actionId);
+ break;
+ }
+ }
+
+ g_globals->_events.setCursor(CURSOR_ARROW);
+}
+
+void SceneArea::synchronize(Serializer &s) {
+ if (s.getVersion() >= 2)
+ SavedObject::synchronize(s);
+
+ s.syncAsSint16LE(_pt.x);
+ s.syncAsSint16LE(_pt.y);
+ s.syncAsSint32LE(_resNum);
+ s.syncAsSint32LE(_rlbNum);
+ s.syncAsSint32LE(_subNum);
+ s.syncAsSint32LE(_actionId);
+ _bounds.synchronize(s);
+}
+
+/*--------------------------------------------------------------------------*/
+
+RingworldInvObjectList::RingworldInvObjectList() :
+ _stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."),
+ _scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."),
+ _stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."),
+ _infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."),
+ _stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."),
+ _keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."),
+ _medkit(2280, 1, 7, OBJECT_MEDKIT, "Your medkit."),
+ _ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."),
+ _rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."),
+ _key(7700, 1, 11, OBJECT_KEY, "A key."),
+ _translator(7700, 1, 13, OBJECT_TRANSLATOR, "The dolphin translator box."),
+ _ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."),
+ _paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."),
+ _waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."),
+ _stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."),
+ _ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."),
+ _cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."),
+ _tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."),
+ _candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."),
+ _straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."),
+ _scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."),
+ _sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."),
+ _helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."),
+ _items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."),
+ _concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."),
+ _nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."),
+ _peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."),
+ _vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."),
+ _jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."),
+ _tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."),
+ _bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."),
+ _jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."),
+ _emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") {
+
+ // Add the items to the list
+ _itemList.push_back(&_stunner);
+ _itemList.push_back(&_scanner);
+ _itemList.push_back(&_stasisBox);
+ _itemList.push_back(&_infoDisk);
+ _itemList.push_back(&_stasisNegator);
+ _itemList.push_back(&_keyDevice);
+ _itemList.push_back(&_medkit);
+ _itemList.push_back(&_ladder);
+ _itemList.push_back(&_rope);
+ _itemList.push_back(&_key);
+ _itemList.push_back(&_translator);
+ _itemList.push_back(&_ale);
+ _itemList.push_back(&_paper);
+ _itemList.push_back(&_waldos);
+ _itemList.push_back(&_stasisBox2);
+ _itemList.push_back(&_ring);
+ _itemList.push_back(&_cloak);
+ _itemList.push_back(&_tunic);
+ _itemList.push_back(&_candle);
+ _itemList.push_back(&_straw);
+ _itemList.push_back(&_scimitar);
+ _itemList.push_back(&_sword);
+ _itemList.push_back(&_helmet);
+ _itemList.push_back(&_items);
+ _itemList.push_back(&_concentrator);
+ _itemList.push_back(&_nullifier);
+ _itemList.push_back(&_peg);
+ _itemList.push_back(&_vial);
+ _itemList.push_back(&_jacket);
+ _itemList.push_back(&_tunic2);
+ _itemList.push_back(&_bone);
+ _itemList.push_back(&_jar);
+ _itemList.push_back(&_emptyJar);
+
+ _selectedItem = NULL;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void RingworldGame::start() {
+ // Set some default flags
+ g_globals->setFlag(12);
+ g_globals->setFlag(34);
+
+ // Set the screen to scroll in response to the player moving off-screen
+ g_globals->_scrollFollower = &g_globals->_player;
+
+ // Set the object's that will be in the player's inventory by default
+ RING_INVENTORY._stunner._sceneNumber = 1;
+ RING_INVENTORY._scanner._sceneNumber = 1;
+ RING_INVENTORY._ring._sceneNumber = 1;
+
+ int slot = -1;
+
+ if (ConfMan.hasKey("save_slot")) {
+ slot = ConfMan.getInt("save_slot");
+ Common::String file = g_vm->generateSaveName(slot);
+ Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file);
+ if (in)
+ delete in;
+ else
+ slot = -1;
+ }
+
+ if (slot >= 0)
+ g_globals->_sceneHandler->_loadGameSlot = slot;
+ else
+ // Switch to the title screen
+ g_globals->_sceneManager.setNewScene(1000);
+
+ g_globals->_events.showCursor();
+}
+
+void RingworldGame::restart() {
+ g_globals->_scenePalette.clearListeners();
+ g_globals->_soundHandler.stop();
+
+ // Reset the flags
+ g_globals->reset();
+ g_globals->setFlag(34);
+
+ // Clear save/load slots
+ g_globals->_sceneHandler->_saveGameSlot = -1;
+ g_globals->_sceneHandler->_loadGameSlot = -1;
+
+ g_globals->_stripNum = 0;
+ g_globals->_events.setCursor(CURSOR_WALK);
+
+ // Reset item properties
+ RING_INVENTORY._stunner._sceneNumber = 1;
+ RING_INVENTORY._scanner._sceneNumber = 1;
+ RING_INVENTORY._stasisBox._sceneNumber = 5200;
+ RING_INVENTORY._infoDisk._sceneNumber = 40;
+ RING_INVENTORY._stasisNegator._sceneNumber = 0;
+ RING_INVENTORY._keyDevice._sceneNumber = 0;
+ RING_INVENTORY._medkit._sceneNumber = 2280;
+ RING_INVENTORY._ladder._sceneNumber = 4100;
+ RING_INVENTORY._rope._sceneNumber = 4150;
+ RING_INVENTORY._key._sceneNumber = 7700;
+ RING_INVENTORY._translator._sceneNumber = 2150;
+ RING_INVENTORY._paper._sceneNumber = 7700;
+ RING_INVENTORY._waldos._sceneNumber = 0;
+ RING_INVENTORY._ring._sceneNumber = 1;
+ RING_INVENTORY._stasisBox2._sceneNumber = 8100;
+ RING_INVENTORY._cloak._sceneNumber = 9850;
+ RING_INVENTORY._tunic._sceneNumber = 9450;
+ RING_INVENTORY._candle._sceneNumber = 9500;
+ RING_INVENTORY._straw._sceneNumber = 9400;
+ RING_INVENTORY._scimitar._sceneNumber = 9850;
+ RING_INVENTORY._sword._sceneNumber = 9850;
+ RING_INVENTORY._helmet._sceneNumber = 9500;
+ RING_INVENTORY._items._sceneNumber = 4300;
+ RING_INVENTORY._concentrator._sceneNumber = 4300;
+ RING_INVENTORY._nullifier._sceneNumber = 4300;
+ RING_INVENTORY._peg._sceneNumber = 4045;
+ RING_INVENTORY._vial._sceneNumber = 5100;
+ RING_INVENTORY._jacket._sceneNumber = 9850;
+ RING_INVENTORY._tunic2._sceneNumber = 9850;
+ RING_INVENTORY._bone._sceneNumber = 5300;
+ RING_INVENTORY._jar._sceneNumber = 7700;
+ RING_INVENTORY._emptyJar._sceneNumber = 7700;
+ RING_INVENTORY._selectedItem = NULL;
+
+ // Change to the first game scene
+ g_globals->_sceneManager.changeScene(30);
+}
+
+void RingworldGame::endGame(int resNum, int lineNum) {
+ g_globals->_events.setCursor(CURSOR_WALK);
+ Common::String msg = g_resourceManager->getMessage(resNum, lineNum);
+ bool savesExist = g_saver->savegamesExist();
+
+ if (!savesExist) {
+ // No savegames exist, so prompt the user to restart or quit
+ if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0)
+ g_vm->quitGame();
+ else
+ restart();
+ } else {
+ // Savegames exist, so prompt for Restore/Restart
+ bool breakFlag;
+ do {
+ if (g_vm->shouldQuit()) {
+ breakFlag = true;
+ } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) {
+ restart();
+ breakFlag = true;
+ } else {
+ handleSaveLoad(false, g_globals->_sceneHandler->_loadGameSlot, g_globals->_sceneHandler->_saveName);
+ breakFlag = g_globals->_sceneHandler->_loadGameSlot >= 0;
+ }
+ } while (!breakFlag);
+ }
+
+ g_globals->_events.setCursorFromFlag();
+}
+
+void RingworldGame::processEvent(Event &event) {
+ if (event.eventType == EVENT_KEYPRESS) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_F1:
+ // F1 - Help
+ MessageDialog::show(HELP_MSG, OK_BTN_STRING);
+ break;
+
+ case Common::KEYCODE_F2:
+ // F2 - Sound Options
+ SoundDialog::execute();
+ break;
+
+ case Common::KEYCODE_F3:
+ // F3 - Quit
+ quitGame();
+ event.handled = false;
+ break;
+
+ case Common::KEYCODE_F4:
+ // F4 - Restart
+ restartGame();
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F7:
+ // F7 - Restore
+ restoreGame();
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F10:
+ // F10 - Pause
+ GfxDialog::setPalette();
+ MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING);
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void RingworldGame::rightClick() {
+ RightClickDialog *dlg = new RightClickDialog();
+ dlg->execute();
+ delete dlg;
+}
+
+/*--------------------------------------------------------------------------*/
+
+NamedHotspot::NamedHotspot() : SceneHotspot() {
+ _resNum = 0;
+ _lookLineNum = _useLineNum = _talkLineNum = -1;
+}
+
+void NamedHotspot::doAction(int action) {
+ switch (action) {
+ case CURSOR_WALK:
+ // Nothing
+ return;
+ case CURSOR_LOOK:
+ if (_lookLineNum == -1)
+ break;
+
+ SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return;
+ case CURSOR_USE:
+ if (_useLineNum == -1)
+ break;
+
+ SceneItem::display(_resNum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return;
+ case CURSOR_TALK:
+ if (_talkLineNum == -1)
+ break;
+
+ SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return;
+ default:
+ break;
+ }
+
+ SceneHotspot::doAction(action);
+}
+
+void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
+ setBounds(ys, xe, ye, xs);
+ _resNum = resnum;
+ _lookLineNum = lookLineNum;
+ _useLineNum = useLineNum;
+ _talkLineNum = -1;
+ g_globals->_sceneItems.addItems(this, NULL);
+}
+
+void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
+ setBounds(bounds);
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ switch (mode) {
+ case 2:
+ g_globals->_sceneItems.push_front(this);
+ break;
+ case 4:
+ g_globals->_sceneItems.addBefore(item, this);
+ break;
+ case 5:
+ g_globals->_sceneItems.addAfter(item, this);
+ break;
+ default:
+ g_globals->_sceneItems.push_back(this);
+ break;
+ }
+}
+
+void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) {
+ _sceneRegionId = sceneRegionId;
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ // Handle adding hotspot to scene items list as necessary
+ switch (mode) {
+ case 2:
+ GLOBALS._sceneItems.push_front(this);
+ break;
+ case 3:
+ break;
+ default:
+ GLOBALS._sceneItems.push_back(this);
+ break;
+ }
+}
+
+void NamedHotspot::synchronize(Serializer &s) {
+ SceneHotspot::synchronize(s);
+ s.syncAsSint16LE(_resNum);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_useLineNum);
+
+ if (g_vm->getGameID() == GType_BlueForce)
+ s.syncAsSint16LE(_talkLineNum);
+}
+
+
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h
new file mode 100644
index 0000000000..6f6a66cc26
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_logic.h
@@ -0,0 +1,191 @@
+/* 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 TSAGE_RINGWORLD_LOGIC_H
+#define TSAGE_RINGWORLD_LOGIC_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
+
+class SceneFactory {
+public:
+ static Scene *createScene(int sceneNumber);
+};
+
+class DisplayHotspot : public SceneObject {
+private:
+ Common::Array<int> _actions;
+ bool performAction(int action);
+public:
+ DisplayHotspot(int regionId, ...);
+
+ virtual void doAction(int action) {
+ if (!performAction(action))
+ SceneHotspot::doAction(action);
+ }
+};
+
+class DisplayObject : public SceneObject {
+private:
+ Common::Array<int> _actions;
+ bool performAction(int action);
+public:
+ DisplayObject(int firstAction, ...);
+
+ virtual void doAction(int action) {
+ if (!performAction(action))
+ SceneHotspot::doAction(action);
+ }
+};
+
+class SceneObjectExt : public SceneObject {
+public:
+ int _state;
+
+ virtual void synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_state);
+ }
+ virtual Common::String getClassName() { return "SceneObjectExt"; }
+};
+
+class SceneArea : public SavedObject {
+public:
+ GfxSurface _surface;
+ GfxSurface *_savedArea;
+ Common::Point _pt;
+ int _resNum;
+ int _rlbNum;
+ int _subNum;
+ int _actionId;
+ Rect _bounds;
+public:
+ SceneArea();
+ ~SceneArea();
+
+ void setup(int resNum, int rlbNum, int subNum, int actionId);
+ void draw2();
+ void display();
+ void restore();
+
+ virtual void synchronize(Serializer &s);
+ virtual void draw(bool flag);
+ virtual void wait();
+};
+
+/*--------------------------------------------------------------------------*/
+
+class RingworldInvObjectList : public InvObjectList {
+public:
+ InvObject _stunner;
+ InvObject _scanner;
+ InvObject _stasisBox;
+ InvObject _infoDisk;
+ InvObject _stasisNegator;
+ InvObject _keyDevice;
+ InvObject _medkit;
+ InvObject _ladder;
+ InvObject _rope;
+ InvObject _key;
+ InvObject _translator;
+ InvObject _ale;
+ InvObject _paper;
+ InvObject _waldos;
+ InvObject _stasisBox2;
+ InvObject _ring;
+ InvObject _cloak;
+ InvObject _tunic;
+ InvObject _candle;
+ InvObject _straw;
+ InvObject _scimitar;
+ InvObject _sword;
+ InvObject _helmet;
+ InvObject _items;
+ InvObject _concentrator;
+ InvObject _nullifier;
+ InvObject _peg;
+ InvObject _vial;
+ InvObject _jacket;
+ InvObject _tunic2;
+ InvObject _bone;
+ InvObject _jar;
+ InvObject _emptyJar;
+public:
+ RingworldInvObjectList();
+
+ virtual Common::String getClassName() { return "RingworldInvObjectList"; }
+};
+
+#define RING_INVENTORY (*((::TsAGE::Ringworld::RingworldInvObjectList *)g_globals->_inventory))
+
+class RingworldGame: public Game {
+public:
+ virtual void start();
+ virtual void restart();
+ virtual void endGame(int resNum, int lineNum);
+
+ virtual Scene *createScene(int sceneNumber);
+ virtual void processEvent(Event &event);
+ virtual void rightClick();
+ virtual bool canSaveGameStateCurrently();
+ virtual bool canLoadGameStateCurrently();
+};
+
+class NamedHotspot : public SceneHotspot {
+public:
+ int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
+ NamedHotspot();
+
+ virtual void doAction(int action);
+ virtual Common::String getClassName() { return "NamedHotspot"; }
+ virtual void synchronize(Serializer &s);
+ virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
+ virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
+ virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode);
+};
+
+class NamedHotspotExt : public NamedHotspot {
+public:
+ int _flag;
+ NamedHotspotExt() { _flag = 0; }
+
+ virtual Common::String getClassName() { return "NamedHotspot"; }
+ virtual void synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+ s.syncAsSint16LE(_flag);
+ }
+};
+
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp
index 7fe2610fd7..4d9d565705 100644
--- a/engines/tsage/ringworld_scenes1.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes1.cpp
@@ -20,12 +20,14 @@
*
*/
-#include "tsage/ringworld_scenes1.h"
+#include "tsage/ringworld/ringworld_scenes1.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
/*--------------------------------------------------------------------------
* Scene 10 - Kziniti Palace (Introduction)
@@ -33,14 +35,14 @@ namespace tSage {
*--------------------------------------------------------------------------*/
void Scene10::Action1::signal() {
- Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene;
+ Scene10 *scene = (Scene10 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(6);
break;
case 1:
- _globals->_scenePalette.addRotation(240, 254, -1);
+ g_globals->_scenePalette.addRotation(240, 254, -1);
scene->_stripManager.start(10, this);
break;
case 2:
@@ -98,21 +100,21 @@ void Scene10::Action1::signal() {
scene->_object4.animate(ANIM_MODE_6, this);
break;
case 10:
- _globals->_soundHandler.fadeOut(this);
+ g_globals->_soundHandler.fadeOut(this);
break;
case 11:
- _globals->_scenePalette.clearListeners();
- _globals->_sceneManager.changeScene(15);
+ g_globals->_scenePalette.clearListeners();
+ g_globals->_sceneManager.changeScene(15);
break;
}
}
void Scene10::Action2::signal() {
- Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene;
+ Scene10 *scene = (Scene10 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(179));
+ setDelay(g_globals->_randomSource.getRandomNumber(179));
break;
case 1:
scene->_object3.setFrame(1);
@@ -181,11 +183,11 @@ void Scene10::postInit(SceneObjectList *OwnerList) {
_object6.animate(ANIM_MODE_2, NULL);
_object6._numFrames = 5;
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
setAction(&_action1);
- _globals->_soundHandler.play(5);
+ g_globals->_soundHandler.play(5);
}
void Scene10::stripCallback(int v) {
@@ -211,7 +213,7 @@ void Scene10::stripCallback(int v) {
*--------------------------------------------------------------------------*/
void Scene15::Action1::signal() {
- Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene;
+ Scene15 *scene = (Scene15 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -237,13 +239,13 @@ void Scene15::Action1::signal() {
}
case 3:
SceneItem::display(0, 0);
- _globals->_sceneManager.changeScene(20);
+ g_globals->_sceneManager.changeScene(20);
break;
}
}
void Scene15::Action1::dispatch() {
- Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene;
+ Scene15 *scene = (Scene15 *)g_globals->_sceneManager._scene;
if (scene->_object1._position.y < 100)
scene->_object1.changeZoom(100 - scene->_object1._position.y);
@@ -256,7 +258,7 @@ void Scene15::postInit(SceneObjectList *OwnerList) {
loadScene(15);
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _globals->_soundHandler.play(6);
+ g_globals->_soundHandler.play(6);
setAction(&_action1);
}
@@ -266,7 +268,7 @@ void Scene15::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene20::Action1::signal() {
- Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+ Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -276,11 +278,11 @@ void Scene20::Action1::signal() {
scene->_stripManager.start(20, this);
break;
case 2:
- _globals->_soundHandler.fadeOut(this);
+ g_globals->_soundHandler.fadeOut(this);
break;
case 3:
- _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
- _globals->_sceneManager.changeScene(30); // First game scene
+ g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ g_globals->_sceneManager.changeScene(30); // First game scene
break;
default:
break;
@@ -288,7 +290,7 @@ void Scene20::Action1::signal() {
}
void Scene20::Action2::signal() {
- Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+ Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene;
NpcMover *npcMover;
switch (_actionIndex++) {
@@ -303,51 +305,51 @@ void Scene20::Action2::signal() {
case 2: {
NpcMover *mover = new NpcMover();
Common::Point pt(455, 77);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
ObjectMover2 *mover2 = new ObjectMover2();
- scene->_SceneObjectExt.addMover(mover2, 5, 10, &_globals->_player);
+ scene->_SceneObjectExt.addMover(mover2, 5, 10, &g_globals->_player);
ObjectMover2 *mover3 = new ObjectMover2();
- scene->_sceneObject3.addMover(mover3, 10, 15, &_globals->_player);
+ scene->_sceneObject3.addMover(mover3, 10, 15, &g_globals->_player);
break;
}
case 3: {
npcMover = new NpcMover();
Common::Point pt(557, 100);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 4: {
npcMover = new NpcMover();
Common::Point pt(602, 90);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 5: {
npcMover = new NpcMover();
Common::Point pt(618, 90);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 6: {
npcMover = new NpcMover();
Common::Point pt(615, 81);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 7: {
npcMover = new NpcMover();
Common::Point pt(588, 79);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 8:
scene->_sound.release();
- _globals->_soundHandler.fadeOut(this);
+ g_globals->_soundHandler.fadeOut(this);
break;
case 9:
SceneItem::display(0, 0, LIST_END);
- _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
- _globals->_sceneManager.changeScene(40);
+ g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ g_globals->_sceneManager.changeScene(40);
break;
default:
break;
@@ -355,7 +357,7 @@ void Scene20::Action2::signal() {
}
void Scene20::Action3::signal() {
- Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+ Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene;
NpcMover *npcMover;
switch (_actionIndex++) {
@@ -365,47 +367,47 @@ void Scene20::Action3::signal() {
case 1: {
npcMover = new NpcMover();
Common::Point pt(615, 81);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
ObjectMover2 *mover1 = new ObjectMover2();
- scene->_SceneObjectExt.addMover(mover1, 5, 10, &_globals->_player);
+ scene->_SceneObjectExt.addMover(mover1, 5, 10, &g_globals->_player);
ObjectMover2 *mover2 = new ObjectMover2();
- scene->_sceneObject3.addMover(mover2, 20, 25, &_globals->_player);
+ scene->_sceneObject3.addMover(mover2, 20, 25, &g_globals->_player);
break;
}
case 2: {
npcMover = new NpcMover();
Common::Point pt(618, 90);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 3: {
- _globals->_player._moveDiff = Common::Point(10, 10);
+ g_globals->_player._moveDiff = Common::Point(10, 10);
scene->_SceneObjectExt._moveDiff = Common::Point(10, 10);
scene->_sceneObject3._moveDiff = Common::Point(10, 10);
npcMover = new NpcMover();
Common::Point pt(445, 132);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 4: {
npcMover = new NpcMover();
Common::Point pt(151, 137);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 5: {
npcMover = new NpcMover();
Common::Point pt(-15, 137);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 6:
scene->_sound.play(60, this, 127);
- _globals->_soundHandler.release();
+ g_globals->_soundHandler.release();
break;
case 7:
- _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
- _globals->_sceneManager.changeScene(90);
+ g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ g_globals->_sceneManager.changeScene(90);
break;
default:
break;
@@ -413,7 +415,7 @@ void Scene20::Action3::signal() {
}
void Scene20::Action4::signal() {
- Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+ Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene;
NpcMover *npcMover;
switch (_actionIndex++) {
@@ -423,20 +425,20 @@ void Scene20::Action4::signal() {
case 1: {
npcMover = new NpcMover();
Common::Point pt(486, 134);
- _globals->_player.addMover(npcMover, &pt, this);
+ g_globals->_player.addMover(npcMover, &pt, this);
ObjectMover2 *mover1 = new ObjectMover2();
- scene->_SceneObjectExt.addMover(mover1, 20, 35, &_globals->_player);
+ scene->_SceneObjectExt.addMover(mover1, 20, 35, &g_globals->_player);
break;
}
case 2: {
- _globals->_player._moveDiff = Common::Point(12, 12);
+ g_globals->_player._moveDiff = Common::Point(12, 12);
scene->_SceneObjectExt._moveDiff = Common::Point(12, 12);
NpcMover *mover1 = new NpcMover();
Common::Point pt(486, 134);
scene->_sceneObject3.addMover(mover1, &pt, this);
NpcMover *mover2 = new NpcMover();
pt = Common::Point(-15, 134);
- _globals->_player.addMover(mover2, &pt, NULL);
+ g_globals->_player.addMover(mover2, &pt, NULL);
NpcMover *mover3 = new NpcMover();
pt = Common::Point(-15, 134);
scene->_SceneObjectExt.addMover(mover3, &pt, NULL);
@@ -483,7 +485,7 @@ void Scene20::Action4::signal() {
scene->_sceneObject5._moveDiff.x = 48;
ObjectMover3 *mover = new ObjectMover3();
- scene->_sceneObject5.addMover(mover, &_globals->_player, 4, this);
+ scene->_sceneObject5.addMover(mover, &g_globals->_player, 4, this);
break;
}
case 6: {
@@ -492,24 +494,24 @@ void Scene20::Action4::signal() {
scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL);
scene->_sceneObject5.remove();
- _globals->_player.setVisage(21);
- _globals->_player.setStrip(1);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
- _globals->_player._moveDiff.x = 4;
+ g_globals->_player.setVisage(21);
+ g_globals->_player.setStrip(1);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player._moveDiff.x = 4;
npcMover = new NpcMover();
- Common::Point pt(_globals->_player._position.x - 25, _globals->_player._position.y + 5);
- _globals->_player.addMover(npcMover, &pt, this);
+ Common::Point pt(g_globals->_player._position.x - 25, g_globals->_player._position.y + 5);
+ g_globals->_player.addMover(npcMover, &pt, this);
break;
}
case 7:
- _globals->_player.setStrip(2);
- _globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
scene->_sound.play(77, this, 127);
break;
case 8:
- _globals->_game->endGame(20, 0);
+ g_globals->_game->endGame(20, 0);
break;
default:
break;
@@ -527,15 +529,15 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerQText);
_stripManager.addSpeaker(&_speakerGameText);
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
- if (_globals->_sceneManager._previousScene == 30) {
+ if (g_globals->_sceneManager._previousScene == 30) {
// Cut scene: Assassins are coming
- _globals->_player.postInit();
- _globals->_player.setVisage(20);
- _globals->_player.setPosition(Common::Point(405, 69));
- _globals->_player._moveDiff = Common::Point(10, 10);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(20);
+ g_globals->_player.setPosition(Common::Point(405, 69));
+ g_globals->_player._moveDiff = Common::Point(10, 10);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
_SceneObjectExt.postInit();
_SceneObjectExt.setVisage(20);
@@ -549,21 +551,21 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
_SceneObjectExt._moveDiff = Common::Point(10, 10);
_sceneObject3._moveDiff = Common::Point(10, 10);
- _globals->_soundHandler.play(20);
+ g_globals->_soundHandler.play(20);
_sound.play(21);
_sound.holdAt(true);
setAction(&_action2);
_sceneBounds = Rect(320, 0, 640, 200);
- } else if (_globals->_sceneManager._previousScene == 60) {
+ } else if (g_globals->_sceneManager._previousScene == 60) {
// Evasion
_sound.play(30);
- _globals->_player.postInit();
- _globals->_player.setVisage(20);
- _globals->_player.setPosition(Common::Point(588, 79));
- _globals->_player._moveDiff = Common::Point(5, 5);
- _globals->_player.fixPriority(50);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(20);
+ g_globals->_player.setPosition(Common::Point(588, 79));
+ g_globals->_player._moveDiff = Common::Point(5, 5);
+ g_globals->_player.fixPriority(50);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
_SceneObjectExt.postInit();
_SceneObjectExt.setVisage(20);
@@ -576,28 +578,28 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
_sceneObject3.setPosition(Common::Point(595, 79));
_sceneObject3.animate(ANIM_MODE_1, NULL);
- if ((_globals->getFlag(120) && _globals->getFlag(116)) ||
- (_globals->getFlag(117) && _globals->getFlag(119))) {
+ if ((g_globals->getFlag(120) && g_globals->getFlag(116)) ||
+ (g_globals->getFlag(117) && g_globals->getFlag(119))) {
// Successful evasion
setAction(&_action3);
- } else if (_globals->getFlag(104)) {
+ } else if (g_globals->getFlag(104)) {
_sceneMode = 21;
- setAction(&_sequenceManager, this, 21, &_globals->_player, &_SceneObjectExt, NULL);
+ setAction(&_sequenceManager, this, 21, &g_globals->_player, &_SceneObjectExt, NULL);
} else {
// Failed evasion
_sceneObject3._moveDiff = Common::Point(8, 8);
setAction(&_action4);
}
- _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+ _sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y);
} else {
// Intro: Quinn looking at the monaster
- _globals->_player.postInit();
- _globals->_player.setVisage(2640);
- _globals->_player.animate(ANIM_MODE_NONE, NULL);
- _globals->_player.setStrip2(1);
- _globals->_player.setFrame2(4);
- _globals->_player.fixPriority(200);
- _globals->_player.setPosition(Common::Point(425, 233));
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2640);
+ g_globals->_player.animate(ANIM_MODE_NONE, NULL);
+ g_globals->_player.setStrip2(1);
+ g_globals->_player.setFrame2(4);
+ g_globals->_player.fixPriority(200);
+ g_globals->_player.setPosition(Common::Point(425, 233));
setAction(&_action1);
_speakerQText.setTextPos(Common::Point(350, 20));
@@ -605,17 +607,17 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
_speakerGameText.setTextPos(Common::Point(350, 20));
_speakerGameText._textWidth = 260;
- _globals->_soundHandler.play(8);
+ g_globals->_soundHandler.play(8);
_sceneBounds = Rect(320, 0, 640, 200);
}
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
loadScene(20);
}
void Scene20::signal() {
if (_sceneMode == 21)
- _globals->_sceneManager.changeScene(90);
+ g_globals->_sceneManager.changeScene(90);
}
/*--------------------------------------------------------------------------
@@ -629,7 +631,7 @@ void Scene30::BeamObject::doAction(int action) {
else if (action == CURSOR_LOOK)
display2(30, 2);
else if (action == CURSOR_USE) {
- Scene30 *parent = (Scene30 *)_globals->_sceneManager._scene;
+ Scene30 *parent = (Scene30 *)g_globals->_sceneManager._scene;
parent->setAction(&parent->_beamAction);
} else
SceneObject::doAction(action);
@@ -647,38 +649,38 @@ void Scene30::DoorObject::doAction(int action) {
}
void Scene30::BeamAction::signal() {
- Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+ Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
// Disable control and move player to the doorway beam
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
NpcMover *mover = new NpcMover();
Common::Point pt(114, 198);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
// Perform the animation of player raising hand
- _globals->_player.setVisage(31);
- _globals->_player.setStrip(1);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(31);
+ g_globals->_player.setStrip(1);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
// Hide the beam and lower the player's hand
scene->_sound.play(10, NULL, 127);
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
scene->_beam.remove();
break;
case 3: {
// Bring the Kzin to the doorway
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(7);
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(7);
scene->_kzin.postInit();
scene->_kzin.setVisage(2801);
scene->_kzin.animate(ANIM_MODE_1, NULL);
@@ -687,7 +689,7 @@ void Scene30::BeamAction::signal() {
NpcMover *mover = new NpcMover();
Common::Point pt(158, 170);
scene->_kzin.addMover(mover, &pt, this);
- _globals->_sceneItems.push_front(&scene->_kzin);
+ g_globals->_sceneItems.push_front(&scene->_kzin);
break;
}
@@ -700,7 +702,7 @@ void Scene30::BeamAction::signal() {
case 5:
// Run the Kzin's talk sequence
scene->_sound.play(13, NULL, 127);
- _globals->_soundHandler.play(12, NULL, 127);
+ g_globals->_soundHandler.play(12, NULL, 127);
scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this);
break;
@@ -713,7 +715,7 @@ void Scene30::BeamAction::signal() {
// Re-activate player control
scene->_sceneMode = 31;
scene->_kzin.setAction(&scene->_kzinAction);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
// End this action
remove();
@@ -725,19 +727,19 @@ void Scene30::BeamAction::signal() {
}
void Scene30::KzinAction::signal() {
- Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+ Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(1200);
break;
case 1:
- _globals->_soundHandler.fadeOut(NULL);
- _globals->_player.disableControl();
- setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL);
+ g_globals->_soundHandler.fadeOut(NULL);
+ g_globals->_player.disableControl();
+ setAction(&scene->_sequenceManager, g_globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL);
break;
case 2:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
default:
@@ -746,28 +748,28 @@ void Scene30::KzinAction::signal() {
}
void Scene30::RingAction::signal() {
- Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+ Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_kzin.setAction(NULL);
NpcMover *mover = new NpcMover();
Common::Point pt(114, 198);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
- _globals->_player.checkAngle(&scene->_kzin);
+ g_globals->_player.checkAngle(&scene->_kzin);
scene->_stripManager.start(32, this);
break;
case 2: {
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
NpcMover *mover = new NpcMover();
Common::Point pt(143, 177);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
@@ -783,7 +785,7 @@ void Scene30::RingAction::signal() {
scene->_kzin.addMover(kzinMover, &pt, this);
NpcMover *playerMover = new NpcMover();
pt = Common::Point(335, 36);
- _globals->_player.addMover(playerMover, &pt, this);
+ g_globals->_player.addMover(playerMover, &pt, this);
break;
}
@@ -791,7 +793,7 @@ void Scene30::RingAction::signal() {
break;
case 6:
- _globals->_sceneManager.changeScene(20);
+ g_globals->_sceneManager.changeScene(20);
break;
default:
@@ -800,19 +802,19 @@ void Scene30::RingAction::signal() {
}
void Scene30::TalkAction::signal() {
- Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+ Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_kzin.setAction(NULL);
NpcMover *mover = new NpcMover();
Common::Point pt(114, 198);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
- _globals->_player.checkAngle(&scene->_kzin);
+ g_globals->_player.checkAngle(&scene->_kzin);
scene->_stripManager.start(34, this);
break;
case 2:
@@ -820,7 +822,7 @@ void Scene30::TalkAction::signal() {
break;
case 3:
scene->_kzin.setAction(&scene->_kzinAction);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
default:
@@ -831,7 +833,7 @@ void Scene30::TalkAction::signal() {
/*--------------------------------------------------------------------------*/
void Scene30::KzinObject::doAction(int action) {
- Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+ Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -851,7 +853,7 @@ void Scene30::KzinObject::doAction(int action) {
display2(30, 10);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_talkAction);
break;
default:
@@ -879,19 +881,19 @@ void Scene30::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerSText);
_stripManager.addSpeaker(&_speakerQText);
_speakerSText._npc = &_kzin;
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
// Setup player
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setStrip(7);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(114, 198));
- _globals->_player.changeZoom(75);
- _globals->_player.enableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setStrip(7);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(114, 198));
+ g_globals->_player.changeZoom(75);
+ g_globals->_player.enableControl();
// Set up beam object
_beam.postInit();
@@ -909,7 +911,7 @@ void Scene30::postInit(SceneObjectList *OwnerList) {
_courtyardHotspot.setBounds(Rect(0, 0, 320, 200));
// Add the objects and hotspots to the scene
- _globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot,
+ g_globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot,
&_courtyardHotspot, NULL);
// Load the scene data
@@ -925,12 +927,12 @@ void Scene30::signal() {
_beam.setStrip(2);
_beam.setPosition(Common::Point(124, 178));
_beam.fixPriority(188);
- _globals->_sceneItems.push_front(&_beam);
- _globals->_player.enableControl();
+ g_globals->_sceneItems.push_front(&_beam);
+ g_globals->_player.enableControl();
} else if (_sceneMode == 32) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 31;
- setAction(&_sequenceManager, _globals->_sceneManager._scene, 31, &_kzin, &_door, NULL);
+ setAction(&_sequenceManager, g_globals->_sceneManager._scene, 31, &_kzin, &_door, NULL);
}
}
@@ -940,14 +942,14 @@ void Scene30::signal() {
*--------------------------------------------------------------------------*/
void Scene40::Action1::signal() {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(120);
break;
case 1:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(40, this);
break;
case 2:
@@ -960,7 +962,7 @@ void Scene40::Action1::signal() {
case 3:
scene->_doorway.hide();
scene->_dyingKzin.setPosition(Common::Point(296, 62));
- _globals->_player.animate(ANIM_MODE_5, NULL);
+ g_globals->_player.animate(ANIM_MODE_5, NULL);
scene->_object1.setVisage(43);
scene->_object1.setStrip(3);
scene->_object1.animate(ANIM_MODE_5, NULL);
@@ -1024,8 +1026,8 @@ void Scene40::Action1::signal() {
break;
}
case 12: {
- _globals->_soundHandler.play(26);
- _globals->_player._uiEnabled = true;
+ g_globals->_soundHandler.play(26);
+ g_globals->_player._uiEnabled = true;
scene->_assassin.setVisage(42);
scene->_assassin.setPosition(Common::Point(4, 191));
scene->_assassin.setStrip(1);
@@ -1046,41 +1048,41 @@ void Scene40::Action1::signal() {
scene->_soundHandler.play(28);
break;
case 15:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_object1.setVisage(40);
scene->_object1.setStrip(4);
scene->_object1.setFrame(1);
scene->_object1.animate(ANIM_MODE_5, NULL);
- _globals->_player.setVisage(40);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(40);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 16:
- _globals->_soundHandler.play(77, this);
+ g_globals->_soundHandler.play(77, this);
break;
case 17:
- _globals->_game->endGame(40, 20);
+ g_globals->_game->endGame(40, 20);
remove();
break;
}
}
void Scene40::Action2::signal() {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (scene->_assassin._position.x < 229)
_actionIndex = 0;
setDelay(1);
break;
case 1:
scene->_assassin.animate(ANIM_MODE_NONE, NULL);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2: {
scene->_soundHandler.play(28);
@@ -1107,19 +1109,19 @@ void Scene40::Action2::signal() {
RING_INVENTORY._infoDisk._sceneNumber = 40;
break;
case 4:
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 5: {
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(1);
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(1);
Common::Point pt(230, 195);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 6: {
- _globals->_player.setStrip(7);
+ g_globals->_player.setStrip(7);
scene->_object1.setVisage(2806);
scene->_object1.animate(ANIM_MODE_1, NULL);
SceneObjectWrapper *wrapper = new SceneObjectWrapper();
@@ -1141,45 +1143,45 @@ void Scene40::Action2::signal() {
case 9:
scene->_dyingKzin.setAction(&scene->_action7);
scene->_object1.remove();
- _globals->_stripNum = 88;
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.enableControl();
+ g_globals->_stripNum = 88;
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.enableControl();
scene->_assassin.setAction(&scene->_action8);
break;
}
}
void Scene40::Action3::signal() {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.setAction(NULL);
- _globals->_stripNum = 99;
- _globals->_player.disableControl();
+ g_globals->_player.setAction(NULL);
+ g_globals->_stripNum = 99;
+ g_globals->_player.disableControl();
Common::Point pt(240, 195);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
- _globals->_player.setVisage(5010);
- _globals->_player._strip = 2;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_4, 5, 1, this);
+ g_globals->_player.setVisage(5010);
+ g_globals->_player._strip = 2;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_4, 5, 1, this);
break;
case 2:
scene->_assassin.setStrip(2);
scene->_assassin.setFrame(1);
RING_INVENTORY._infoDisk._sceneNumber = 1;
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 3:
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(7);
- _globals->_stripNum = 88;
- _globals->_player.enableControl();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(7);
+ g_globals->_stripNum = 88;
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -1190,22 +1192,22 @@ void Scene40::Action4::signal() {
case 0: {
Common::Point pt(178, 190);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
- _globals->_stripNum = 88;
- _globals->_player.enableControl();
+ g_globals->_stripNum = 88;
+ g_globals->_player.enableControl();
break;
}
}
void Scene40::Action5::signal() {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(119) + 120);
+ setDelay(g_globals->_randomSource.getRandomNumber(119) + 120);
break;
case 1:
scene->_object2.animate(ANIM_MODE_8, 1, this);
@@ -1214,7 +1216,7 @@ void Scene40::Action5::signal() {
}
void Scene40::Action6::signal() {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -1251,17 +1253,17 @@ void Scene40::Action6::signal() {
}
void Scene40::Action7::signal() {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(499) + 500);
+ setDelay(g_globals->_randomSource.getRandomNumber(499) + 500);
break;
case 1:
scene->_object7.postInit();
scene->_object7.setVisage(46);
- if (_globals->_randomSource.getRandomNumber(32767) >= 16384) {
+ if (g_globals->_randomSource.getRandomNumber(32767) >= 16384) {
scene->_object7.setStrip(3);
scene->_object7.setPosition(Common::Point(15, 185));
} else {
@@ -1280,16 +1282,16 @@ void Scene40::Action7::signal() {
}
void Scene40::Action8::signal() {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(300);
break;
case 1:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
- if ((_globals->_player._position.y >= 197) || (_globals->_player._visage)) {
+ if ((g_globals->_player._position.y >= 197) || (g_globals->_player._visage)) {
_actionIndex = 1;
setDelay(30);
} else {
@@ -1299,7 +1301,7 @@ void Scene40::Action8::signal() {
scene->_doorway.fixPriority(200);
scene->_doorway._moveRate = 60;
- if (_globals->_player._position.x >= 145) {
+ if (g_globals->_player._position.x >= 145) {
scene->_doorway.fixPriority(-1);
scene->_doorway.setPosition(Common::Point(6, 157));
} else {
@@ -1307,7 +1309,7 @@ void Scene40::Action8::signal() {
}
scene->_doorway._moveDiff = Common::Point(40, 40);
- Common::Point pt(_globals->_player._position.x, _globals->_player._position.y - 18);
+ Common::Point pt(g_globals->_player._position.x, g_globals->_player._position.y - 18);
NpcMover *mover = new NpcMover();
scene->_doorway.addMover(mover, &pt, this);
scene->_doorway.animate(ANIM_MODE_5, NULL);
@@ -1315,21 +1317,39 @@ void Scene40::Action8::signal() {
break;
case 2:
scene->_doorway.remove();
- _globals->_player.setVisage(40);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(40);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 3:
- _globals->_soundHandler.play(77, this);
+ g_globals->_soundHandler.play(77, this);
break;
case 4:
- _globals->_game->endGame(40, 45);
+ g_globals->_game->endGame(40, 45);
remove();
break;
}
}
+void Scene40::Action8::dispatch() {
+ if (_action)
+ _action->dispatch();
+
+ if (_delayFrames) {
+ uint32 frameNumber = g_globals->_events.getFrameNumber();
+ if ((_startFrame + 60) < frameNumber) {
+ --_delayFrames;
+ _startFrame = frameNumber;
+
+ if (_delayFrames <= 0) {
+ _delayFrames = 0;
+ signal();
+ }
+ }
+ }
+}
+
/*--------------------------------------------------------------------------*/
void Scene40::DyingKzin::doAction(int action) {
@@ -1353,14 +1373,14 @@ void Scene40::DyingKzin::doAction(int action) {
}
void Scene40::Assassin::doAction(int action) {
- Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+ Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
if (scene->_assassin._visage == 44)
SceneItem::display2(40, 21);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(230, 187);
NpcMover *mover = new NpcMover();
addMover(mover, &pt, NULL);
@@ -1382,7 +1402,7 @@ void Scene40::Assassin::doAction(int action) {
else if (RING_INVENTORY._infoDisk._sceneNumber == 1)
SceneItem::display2(40, 19);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setAction(&scene->_action3);
}
break;
@@ -1401,7 +1421,7 @@ void Scene40::Item2::doAction(int action) {
switch (action) {
case OBJECT_STUNNER:
SceneItem::display2(40, 35);
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
break;
case OBJECT_SCANNER:
SceneItem::display2(40, 34);
@@ -1416,7 +1436,7 @@ void Scene40::Item2::doAction(int action) {
SceneItem::display2(40, 37);
break;
default:
- SceneItem::doAction(action);
+ SceneHotspot::doAction(action);
break;
}
}
@@ -1425,7 +1445,7 @@ void Scene40::Item6::doAction(int action) {
switch (action) {
case OBJECT_STUNNER:
SceneItem::display2(40, 25);
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
break;
case OBJECT_SCANNER:
SceneItem::display2(40, 42);
@@ -1437,7 +1457,7 @@ void Scene40::Item6::doAction(int action) {
SceneItem::display2(40, 36);
break;
default:
- SceneItem::doAction(action);
+ SceneHotspot::doAction(action);
break;
}
}
@@ -1446,7 +1466,7 @@ void Scene40::Item6::doAction(int action) {
Scene40::Scene40() :
_item1(2, OBJECT_SCANNER, 40, 24, OBJECT_STUNNER, 40, 25, CURSOR_LOOK, 40, 7, CURSOR_USE, 40, 16, LIST_END),
- _item3(5, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END),
+ _item3(5, OBJECT_SCANNER, 40, 28, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 2, CURSOR_USE, 40, 30, LIST_END),
_item4(6, OBJECT_SCANNER, 40, 31, OBJECT_STUNNER, 40, 32, CURSOR_LOOK, 40, 5, CURSOR_USE, 40, 33, LIST_END),
_item5(0, CURSOR_LOOK, 40, 11, LIST_END),
_item7(4, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END),
@@ -1458,7 +1478,7 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _globals->_stripNum = 99;
+ g_globals->_stripNum = 99;
_stripManager.addSpeaker(&_speakerQR);
_stripManager.addSpeaker(&_speakerSL);
@@ -1468,19 +1488,19 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
_speakerGameText._color1 = 9;
_speakerGameText.setTextPos(Common::Point(160, 30));
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
_speakerSText._npc = &_object1;
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(130, 220));
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(130, 220));
+ g_globals->_player.disableControl();
- if (_globals->_sceneManager._previousScene == 20) {
- _globals->_soundHandler.play(24);
- _globals->_player.setVisage(43);
+ if (g_globals->_sceneManager._previousScene == 20) {
+ g_globals->_soundHandler.play(24);
+ g_globals->_player.setVisage(43);
_object1.postInit();
_object1.setVisage(41);
@@ -1502,7 +1522,7 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
_assassin.postInit();
_assassin.setPosition(Common::Point(-40, 191));
- _globals->_sceneItems.push_back(&_assassin);
+ g_globals->_sceneItems.push_back(&_assassin);
_dyingKzin.postInit();
_dyingKzin.setVisage(40);
@@ -1537,8 +1557,8 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
_assassin.setStrip(2);
}
- _globals->_sceneItems.push_back(&_assassin);
- _globals->_player.setPosition(Common::Point(170, 220));
+ g_globals->_sceneItems.push_back(&_assassin);
+ g_globals->_player.setPosition(Common::Point(170, 220));
setAction(&_action4);
}
@@ -1547,24 +1567,24 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
_item6._sceneRegionId = 3;
_item2._sceneRegionId = 7;
- _globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4,
+ g_globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4,
&_item6, &_item7, &_item5, NULL);
}
void Scene40::signal() {
if (_sceneMode == 41)
- _globals->_sceneManager.changeScene(50);
+ g_globals->_sceneManager.changeScene(50);
}
void Scene40::dispatch() {
- if ((_globals->_stripNum == 88) && (_globals->_player._position.y >= 197)) {
- _globals->_player.disableControl();
- _globals->_stripNum = 0;
- _globals->_player.setAction(NULL);
+ if ((g_globals->_stripNum == 88) && (g_globals->_player._position.y >= 197)) {
+ g_globals->_player.disableControl();
+ g_globals->_stripNum = 0;
+ g_globals->_player.setAction(NULL);
_sceneMode = 41;
- setAction(&_sequenceManager, this, 41, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 41, &g_globals->_player, NULL);
- if (_globals->_sceneManager._previousScene == 20) {
+ if (g_globals->_sceneManager._previousScene == 20) {
_dyingKzin.setAction(&_action6);
}
}
@@ -1578,49 +1598,49 @@ void Scene40::dispatch() {
*--------------------------------------------------------------------------*/
void Scene50::Action1::signal() {
- Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+ Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setAction(&scene->_sequenceManager, this, 54, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 54, &g_globals->_player, NULL);
break;
case 1:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(63, this);
break;
case 2:
if (scene->_stripManager._field2E8 != 107) {
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
} else {
Common::Point pt(282, 139);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
}
break;
case 3:
- _globals->_stripNum = -1;
- _globals->_sceneManager.changeScene(60);
+ g_globals->_stripNum = -1;
+ g_globals->_sceneManager.changeScene(60);
break;
}
}
void Scene50::Action2::signal() {
- Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+ Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_stripManager.start(66, this);
break;
case 1: {
Common::Point pt(141, 142);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_sceneManager.changeScene(40);
+ g_globals->_sceneManager.changeScene(40);
remove();
break;
}
@@ -1629,14 +1649,14 @@ void Scene50::Action2::signal() {
void Scene50::Action3::signal() {
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(136, 185);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
- _globals->_sceneManager.changeScene(60);
+ g_globals->_sceneManager.changeScene(60);
remove();
break;
}
@@ -1645,7 +1665,7 @@ void Scene50::Action3::signal() {
/*--------------------------------------------------------------------------*/
void Scene50::Object1::doAction(int action) {
- Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+ Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -1661,7 +1681,7 @@ void Scene50::Object1::doAction(int action) {
SceneItem::display2(50, 21);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 52;
scene->setAction(&scene->_sequenceManager, scene, 52, NULL);
break;
@@ -1672,7 +1692,7 @@ void Scene50::Object1::doAction(int action) {
}
void Scene50::Object2::doAction(int action) {
- Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+ Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -1686,7 +1706,7 @@ void Scene50::Object2::doAction(int action) {
break;
case OBJECT_INFODISK:
case CURSOR_USE:
- _globals->_stripNum = 50;
+ g_globals->_stripNum = 50;
scene->setAction(&scene->_action3);
break;
default:
@@ -1696,7 +1716,7 @@ void Scene50::Object2::doAction(int action) {
}
void Scene50::Object3::doAction(int action) {
- Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+ Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -1713,7 +1733,7 @@ void Scene50::Object3::doAction(int action) {
SceneItem::display2(50, 8);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 52;
scene->setAction(&scene->_sequenceManager, scene, 52, NULL);
break;
@@ -1724,7 +1744,7 @@ void Scene50::Object3::doAction(int action) {
}
void Scene50::Object4::doAction(int action) {
- Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+ Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -1738,10 +1758,10 @@ void Scene50::Object4::doAction(int action) {
break;
case OBJECT_INFODISK:
case CURSOR_USE:
- _globals->_player.disableControl();
- _globals->_stripNum = 0;
+ g_globals->_player.disableControl();
+ g_globals->_stripNum = 0;
scene->_sceneMode = 51;
- scene->setAction(&scene->_sequenceManager, scene, 51, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 51, &g_globals->_player, NULL);
break;
default:
SceneHotspot::doAction(action);
@@ -1770,20 +1790,20 @@ void Scene50::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerQText);
_stripManager.addSpeaker(&_speakerSText);
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player._canWalk = false;
- _globals->_player.changeZoom(75);
- _globals->_player._moveDiff.y = 3;
-
- if (_globals->_sceneManager._previousScene == 40) {
- _globals->_player.setPosition(Common::Point(128, 123));
- } else if (_globals->_stripNum == 50) {
- _globals->_player.setPosition(Common::Point(136, 185));
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player._canWalk = false;
+ g_globals->_player.changeZoom(75);
+ g_globals->_player._moveDiff.y = 3;
+
+ if (g_globals->_sceneManager._previousScene == 40) {
+ g_globals->_player.setPosition(Common::Point(128, 123));
+ } else if (g_globals->_stripNum == 50) {
+ g_globals->_player.setPosition(Common::Point(136, 185));
} else {
- _globals->_player.setPosition(Common::Point(270, 143));
+ g_globals->_player.setPosition(Common::Point(270, 143));
}
_object2.postInit();
@@ -1804,37 +1824,37 @@ void Scene50::postInit(SceneObjectList *OwnerList) {
_object4.setPosition(Common::Point(295, 144));
_object4.fixPriority(178);
- _globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL);
+ g_globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL);
- if (!_globals->getFlag(101)) {
- _globals->_player.disableControl();
- _globals->setFlag(101);
+ if (!g_globals->getFlag(101)) {
+ g_globals->_player.disableControl();
+ g_globals->setFlag(101);
setAction(&_action1);
} else {
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
- if (_globals->_sceneManager._previousScene == 40) {
- _globals->_player.disableControl();
+ if (g_globals->_sceneManager._previousScene == 40) {
+ g_globals->_player.disableControl();
_sceneMode = 54;
- setAction(&_sequenceManager, this, 54, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 54, &g_globals->_player, NULL);
}
}
_item0.setBounds(Rect(200, 0, 320, 200));
- _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL);
+ g_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL);
}
void Scene50::signal() {
switch (_sceneMode) {
case 51:
- _globals->_sceneManager.changeScene(60);
+ g_globals->_sceneManager.changeScene(60);
break;
case 55:
- _globals->_sceneManager.changeScene(40);
+ g_globals->_sceneManager.changeScene(40);
break;
case 52:
case 54:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -1842,13 +1862,13 @@ void Scene50::signal() {
void Scene50::dispatch() {
Scene::dispatch();
- if ((_sceneMode != 55) && _doorwayRect.contains(_globals->_player._position)) {
+ if ((_sceneMode != 55) && _doorwayRect.contains(g_globals->_player._position)) {
// Player in house doorway, start player moving to within
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 55;
Common::Point pt(89, 111);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
}
}
@@ -1858,7 +1878,7 @@ void Scene50::dispatch() {
*--------------------------------------------------------------------------*/
void Scene60::Action1::signal() {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1882,7 +1902,7 @@ void Scene60::Action1::signal() {
scene->_controlButton.animate(ANIM_MODE_2, NULL);
- if (!_globals->getFlag(83)) {
+ if (!g_globals->getFlag(83)) {
scene->_message.postInit();
scene->_message.setVisage(60);
scene->_message.setStrip2(3);
@@ -1891,18 +1911,18 @@ void Scene60::Action1::signal() {
scene->_message.animate(ANIM_MODE_2, NULL);
scene->_message._numFrames = 5;
- _globals->_sceneItems.push_front(&scene->_message);
+ g_globals->_sceneItems.push_front(&scene->_message);
scene->_soundHandler2.play(38);
}
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 3:
scene->_soundHandler2.play(37);
scene->loadScene(65);
scene->_message.remove();
- if (_globals->_sceneObjects->contains(&scene->_redLights))
+ if (g_globals->_sceneObjects->contains(&scene->_redLights))
scene->_redLights.remove();
scene->_controlButton.remove();
@@ -1931,15 +1951,15 @@ void Scene60::Action1::signal() {
scene->_rose.setFrame(1);
scene->_rose.setPosition(Common::Point(145, 165));
- _globals->_sceneItems.push_front(&scene->_nextButton);
- _globals->_sceneItems.push_front(&scene->_prevButton);
- _globals->_sceneItems.push_front(&scene->_exitButton);
+ g_globals->_sceneItems.push_front(&scene->_nextButton);
+ g_globals->_sceneItems.push_front(&scene->_prevButton);
+ g_globals->_sceneItems.push_front(&scene->_exitButton);
setDelay(10);
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 4:
- _globals->setFlag(90);
+ g_globals->setFlag(90);
// Deliberate fall-through
case 5:
case 6:
@@ -1947,13 +1967,13 @@ void Scene60::Action1::signal() {
SceneItem::display(60, _actionIndex - 4, SET_Y, 40, SET_X, 25, SET_FONT, 75,
SET_EXT_BGCOLOR, -1, SET_FG_COLOR, 34, SET_POS_MODE, 0,
SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END);
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 9:
- _globals->_player._uiEnabled = false;
+ g_globals->_player._uiEnabled = false;
RING_INVENTORY._infoDisk._sceneNumber = 1;
- if (_globals->_sceneObjects->contains(&scene->_message))
+ if (g_globals->_sceneObjects->contains(&scene->_message))
scene->_message.remove();
scene->_controlButton.animate(ANIM_MODE_NONE);
@@ -1973,14 +1993,14 @@ void Scene60::Action1::signal() {
scene->_masterButton.setFrame(1);
scene->_masterButton._state = 0;
- _globals->clearFlag(103);
- _globals->clearFlag(!_globals->_stripNum ? 116 : 119);
+ g_globals->clearFlag(103);
+ g_globals->clearFlag(!g_globals->_stripNum ? 116 : 119);
break;
case 10:
setDelay(60);
break;
case 11:
- _globals->_player._uiEnabled = true;
+ g_globals->_player._uiEnabled = true;
scene->_floppyDrive.remove();
remove();
break;
@@ -1991,7 +2011,7 @@ void Scene60::Action1::signal() {
}
void Scene60::Action2::signal() {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2002,7 +2022,7 @@ void Scene60::Action2::signal() {
scene->_stripManager.start(66, this);
break;
case 3:
- _globals->_sceneManager.changeScene(50);
+ g_globals->_sceneManager.changeScene(50);
break;
}
}
@@ -2010,7 +2030,7 @@ void Scene60::Action2::signal() {
/*--------------------------------------------------------------------------*/
void Scene60::PrevObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 16);
@@ -2028,7 +2048,7 @@ void Scene60::PrevObject::doAction(int action) {
}
void Scene60::NextObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 17);
@@ -2045,7 +2065,7 @@ void Scene60::NextObject::doAction(int action) {
}
void Scene60::ExitObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 18);
@@ -2076,8 +2096,8 @@ void Scene60::ExitObject::doAction(int action) {
scene->_masterButton.setStrip(8);
scene->_masterButton.setPosition(Common::Point(143, 105));
- _globals->_sceneItems.push_front(&scene->_masterButton);
- _globals->_sceneItems.push_front(&scene->_slaveButton);
+ g_globals->_sceneItems.push_front(&scene->_masterButton);
+ g_globals->_sceneItems.push_front(&scene->_slaveButton);
scene->_redLights.postInit();
scene->_redLights.setVisage(60);
@@ -2091,14 +2111,14 @@ void Scene60::ExitObject::doAction(int action) {
if (scene->_masterButton._state)
scene->_masterButton.setFrame(2);
- _globals->_sceneItems.push_front(&scene->_item1);
- _globals->_sceneItems.push_front(&scene->_controlButton);
- _globals->_sceneItems.push_front(&scene->_slaveButton);
- _globals->_sceneItems.push_front(&scene->_masterButton);
- _globals->_sceneItems.push_back(&scene->_item2);
+ g_globals->_sceneItems.push_front(&scene->_item1);
+ g_globals->_sceneItems.push_front(&scene->_controlButton);
+ g_globals->_sceneItems.push_front(&scene->_slaveButton);
+ g_globals->_sceneItems.push_front(&scene->_masterButton);
+ g_globals->_sceneItems.push_back(&scene->_item2);
- _globals->gfxManager()._font.setFontNumber(2);
- _globals->_sceneText._fontNumber = 2;
+ g_globals->gfxManager()._font.setFontNumber(2);
+ g_globals->_sceneText._fontNumber = 2;
scene->_action1.setActionIndex(2);
scene->_action1.setDelay(1);
@@ -2110,20 +2130,20 @@ void Scene60::ExitObject::doAction(int action) {
}
void Scene60::MessageObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 9);
} else if (action == CURSOR_USE) {
scene->_action1.setDelay(1);
- _globals->setFlag(83);
+ g_globals->setFlag(83);
} else {
SceneHotspot::doAction(action);
}
}
void Scene60::ControlObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 11);
@@ -2131,9 +2151,9 @@ void Scene60::ControlObject::doAction(int action) {
if (_animateMode == ANIM_MODE_NONE)
SceneItem::display2(60, 14);
else if (!scene->_slaveButton._state) {
- _globals->_soundHandler.play(40);
- _globals->_soundHandler.holdAt(true);
- _globals->_sceneManager.changeScene(20);
+ g_globals->_soundHandler.play(40);
+ g_globals->_soundHandler.holdAt(true);
+ g_globals->_sceneManager.changeScene(20);
} else {
scene->_sceneMode = 15;
setAction(&scene->_sequenceManager, scene, 62, NULL);
@@ -2144,7 +2164,7 @@ void Scene60::ControlObject::doAction(int action) {
}
void Scene60::SlaveObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 8);
@@ -2154,14 +2174,14 @@ void Scene60::SlaveObject::doAction(int action) {
else if (_state) {
scene->_soundHandler3.stop();
animate(ANIM_MODE_6, NULL);
- _globals->clearFlag(102);
- _globals->clearFlag(!_globals->_stripNum ? 117 : 120);
+ g_globals->clearFlag(102);
+ g_globals->clearFlag(!g_globals->_stripNum ? 117 : 120);
_state = 0;
scene->_sceneMode = 9998;
} else {
scene->_soundHandler3.play(39);
- _globals->setFlag(102);
- _globals->setFlag(!_globals->_stripNum ? 117 : 120);
+ g_globals->setFlag(102);
+ g_globals->setFlag(!g_globals->_stripNum ? 117 : 120);
animate(ANIM_MODE_5, NULL);
_state = 1;
scene->_sceneMode = 9998;
@@ -2174,7 +2194,7 @@ void Scene60::SlaveObject::doAction(int action) {
}
void Scene60::MasterObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 7);
@@ -2187,15 +2207,15 @@ void Scene60::MasterObject::doAction(int action) {
scene->_soundHandler3.stop();
animate(ANIM_MODE_6, NULL);
_state = 0;
- _globals->clearFlag(103);
- _globals->clearFlag(!_globals->_stripNum ? 116 : 119);
+ g_globals->clearFlag(103);
+ g_globals->clearFlag(!g_globals->_stripNum ? 116 : 119);
scene->_sceneMode = 9998;
} else {
scene->_soundHandler3.play(39);
animate(ANIM_MODE_5, NULL);
_state = 1;
- _globals->setFlag(103);
- _globals->setFlag(!_globals->_stripNum ? 116 : 119);
+ g_globals->setFlag(103);
+ g_globals->setFlag(!g_globals->_stripNum ? 116 : 119);
scene->_sceneMode = 9998;
}
@@ -2206,12 +2226,12 @@ void Scene60::MasterObject::doAction(int action) {
}
void Scene60::FloppyDrive::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 13);
} else if (action == CURSOR_USE) {
- _globals->setFlag(!_globals->_stripNum ? 118 : 121);
+ g_globals->setFlag(!g_globals->_stripNum ? 118 : 121);
scene->setAction(&scene->_action1);
} else {
SceneHotspot::doAction(action);
@@ -2221,12 +2241,12 @@ void Scene60::FloppyDrive::doAction(int action) {
/*--------------------------------------------------------------------------*/
void Scene60::Item1::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_INFODISK:
RING_INVENTORY._infoDisk._sceneNumber = 60;
- _globals->setFlag(!_globals->_stripNum ? 118 : 121);
+ g_globals->setFlag(!g_globals->_stripNum ? 118 : 121);
scene->_sceneMode = 0;
scene->setAction(&scene->_action1);
break;
@@ -2235,14 +2255,14 @@ void Scene60::Item1::doAction(int action) {
break;
case CURSOR_USE:
if (RING_INVENTORY._infoDisk._sceneNumber == 60) {
- if (_globals->getFlag(118) && !_globals->_stripNum) {
- _globals->clearFlag(118);
+ if (g_globals->getFlag(118) && !g_globals->_stripNum) {
+ g_globals->clearFlag(118);
scene->setAction(&scene->_action1);
scene->_action1.setActionIndex(9);
scene->_action1.setDelay(1);
}
- if (_globals->getFlag(121) && !_globals->_stripNum) {
- _globals->clearFlag(121);
+ if (g_globals->getFlag(121) && !g_globals->_stripNum) {
+ g_globals->clearFlag(121);
scene->setAction(&scene->_action1);
scene->_action1.setActionIndex(9);
scene->_action1.setDelay(1);
@@ -2260,7 +2280,7 @@ void Scene60::Item1::doAction(int action) {
}
void Scene60::Item::doAction(int action) {
- Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2271,7 +2291,7 @@ void Scene60::Item::doAction(int action) {
setAction(&scene->_sequenceManager, this, 62, NULL);
break;
default:
- SceneItem::doAction(action);
+ SceneHotspot::doAction(action);
break;
}
}
@@ -2292,8 +2312,8 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerQText);
_stripManager.addSpeaker(&_speakerSText);
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
_slaveButton.postInit();
_slaveButton.setVisage(60);
@@ -2307,19 +2327,19 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
_masterButton.setPosition(Common::Point(143, 105));
_masterButton._state = 0;
- _globals->_sceneItems.push_back(&_masterButton);
- _globals->_sceneItems.push_back(&_slaveButton);
+ g_globals->_sceneItems.push_back(&_masterButton);
+ g_globals->_sceneItems.push_back(&_slaveButton);
_controlButton.postInit();
_controlButton.setVisage(60);
_controlButton.setStrip(5);
_controlButton.setPosition(Common::Point(233, 143));
- _globals->_sceneItems.push_back(&_controlButton);
+ g_globals->_sceneItems.push_back(&_controlButton);
- if (_globals->_stripNum == -1) {
- _globals->_stripNum = 0;
+ if (g_globals->_stripNum == -1) {
+ g_globals->_stripNum = 0;
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9999;
setAction(&_sequenceManager, this, 61, NULL);
}
@@ -2327,18 +2347,18 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
_item1.setBounds(Rect(130, 55, 174, 70));
_item2.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- if (_globals->_stripNum == 0) {
- if (_globals->getFlag(117)) {
+ if (g_globals->_stripNum == 0) {
+ if (g_globals->getFlag(117)) {
_slaveButton._state = 1;
_slaveButton.setFrame(2);
}
- if (_globals->getFlag(116)) {
+ if (g_globals->getFlag(116)) {
_masterButton._state = 1;
_masterButton.setFrame(2);
}
- if (_globals->getFlag(118)) {
+ if (g_globals->getFlag(118)) {
_controlButton.animate(ANIM_MODE_2, NULL);
_redLights.postInit();
@@ -2348,7 +2368,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
_soundHandler1.play(35);
- if (!_globals->getFlag(83)) {
+ if (!g_globals->getFlag(83)) {
_message.postInit();
_message.setVisage(60);
_message.setStrip2(3);
@@ -2356,23 +2376,23 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
_message.setPosition(Common::Point(148, 85));
_message.animate(ANIM_MODE_2, NULL);
_message._numFrames = 5;
- _globals->_sceneItems.push_front(&_message);
+ g_globals->_sceneItems.push_front(&_message);
_soundHandler2.play(38);
}
}
} else {
- if (_globals->getFlag(120)) {
+ if (g_globals->getFlag(120)) {
_slaveButton._state = 1;
_slaveButton.setFrame(2);
}
- if (_globals->getFlag(119)) {
+ if (g_globals->getFlag(119)) {
_masterButton._state = 1;
_masterButton.setFrame(2);
}
- if (_globals->getFlag(121)) {
+ if (g_globals->getFlag(121)) {
_controlButton.animate(ANIM_MODE_2, NULL);
_redLights.postInit();
@@ -2383,7 +2403,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
_soundHandler1.play(35);
- if (!_globals->getFlag(83)) {
+ if (!g_globals->getFlag(83)) {
_message.postInit();
_message.setVisage(60);
_message.setStrip2(3);
@@ -2391,24 +2411,24 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
_message.setPosition(Common::Point(148, 85));
_message.animate(ANIM_MODE_2, NULL);
_message._numFrames = 5;
- _globals->_sceneItems.push_front(&_message);
+ g_globals->_sceneItems.push_front(&_message);
_soundHandler2.play(38);
}
}
}
- _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6,
+ g_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6,
&_item1, &_item2, NULL);
}
void Scene60::signal() {
if (_sceneMode != 0) {
if (_sceneMode == 9998) {
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
} else if (_sceneMode == 9999) {
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
_gfxButton.setText(EXIT_MSG);
_gfxButton._bounds.center(160, 193);
@@ -2416,7 +2436,7 @@ void Scene60::signal() {
_gfxButton._bounds.expandPanes();
} else {
SceneItem::display2(60, _sceneMode);
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
}
}
}
@@ -2426,7 +2446,7 @@ void Scene60::process(Event &event) {
if (_screenNumber == 60) {
if (_gfxButton.process(event))
- _globals->_sceneManager.changeScene(50);
+ g_globals->_sceneManager.changeScene(50);
}
}
@@ -2436,15 +2456,15 @@ void Scene60::process(Event &event) {
*--------------------------------------------------------------------------*/
void Scene90::Action1::signal() {
- Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+ Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(10);
break;
case 1:
- _globals->_scenePalette.addRotation(64, 72, -1);
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_scenePalette.addRotation(64, 72, -1);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(90, this);
break;
case 2:
@@ -2466,17 +2486,17 @@ void Scene90::Action1::signal() {
if (scene->_stripManager._field2E8 == 220)
scene->_stripManager.start(91, this, scene);
else {
- scene->_stripManager.start(_globals->getFlag(104) ? 93 : 92, this, scene);
+ scene->_stripManager.start(g_globals->getFlag(104) ? 93 : 92, this, scene);
_actionIndex = 7;
}
break;
case 6:
scene->_object2.animate(ANIM_MODE_NONE);
- _globals->_player._uiEnabled = true;
+ g_globals->_player._uiEnabled = true;
break;
case 7:
scene->_object2.animate(ANIM_MODE_NONE);
- _globals->_soundHandler.play(56);
+ g_globals->_soundHandler.play(56);
scene->_object3.animate(ANIM_MODE_5, this);
break;
case 8: {
@@ -2498,7 +2518,7 @@ void Scene90::Action1::signal() {
PlayerMover2 *mover = new PlayerMover2();
scene->_object1.addMover(mover, 10, 15, &scene->_object5);
- if (!_globals->getFlag(104)) {
+ if (!g_globals->getFlag(104)) {
mover = new PlayerMover2();
scene->_object4.addMover(mover, 10, 15, &scene->_object1);
}
@@ -2506,17 +2526,17 @@ void Scene90::Action1::signal() {
break;
}
case 11:
- _globals->_soundHandler.play(57);
- _globals->_soundHandler.play(68);
+ g_globals->_soundHandler.play(57);
+ g_globals->_soundHandler.play(68);
scene->_object3.animate(ANIM_MODE_6, NULL);
- SceneItem::display(90, _globals->getFlag(104) ? 15 : 14,
+ SceneItem::display(90, g_globals->getFlag(104) ? 15 : 14,
SET_EXT_BGCOLOR, 13, SET_KEEP_ONSCREEN, -1, SET_X, 120, SET_Y, 20, LIST_END);
break;
case 12:
SceneItem::display(0, 0);
- _globals->_scenePalette.clearListeners();
- _globals->_sceneManager.changeScene(95);
+ g_globals->_scenePalette.clearListeners();
+ g_globals->_sceneManager.changeScene(95);
break;
}
}
@@ -2524,14 +2544,14 @@ void Scene90::Action1::signal() {
/*--------------------------------------------------------------------------*/
void Scene90::Object1::doAction(int action) {
- Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+ Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(90, 7);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 97;
setAction(&scene->_sequenceManager, scene, 97, this, NULL);
break;
@@ -2542,12 +2562,12 @@ void Scene90::Object1::doAction(int action) {
}
void Scene90::Object2::doAction(int action) {
- Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+ Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_object6.postInit();
scene->_object6.setVisage(90);
scene->_object6.setStrip(6);
@@ -2563,7 +2583,7 @@ void Scene90::Object2::doAction(int action) {
SceneItem::display2(90, 8);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setAction(&scene->_sequenceManager, scene, 96, this, NULL);
break;
default:
@@ -2584,10 +2604,10 @@ Scene90::Scene90() :
}
void Scene90::stripCallback(int v) {
- Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+ Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene;
if (v == 1)
- scene->_object2.animate(ANIM_MODE_7, NULL);
+ scene->_object2.animate(ANIM_MODE_7, 0, NULL);
else if (v == 2)
scene->_object2.animate(ANIM_MODE_NONE);
}
@@ -2615,7 +2635,7 @@ void Scene90::postInit(SceneObjectList *OwnerList) {
_object5._moveDiff = Common::Point(22, 22);
_object5.setPosition(Common::Point(151, 177));
_object5.changeZoom(-1);
- _globals->_sceneItems.push_back(&_object5);
+ g_globals->_sceneItems.push_back(&_object5);
_object1.postInit();
_object1.setVisage(2337);
@@ -2624,9 +2644,9 @@ void Scene90::postInit(SceneObjectList *OwnerList) {
_object1._moveDiff = Common::Point(20, 20);
_object1.setPosition(Common::Point(212, 183));
_object1.changeZoom(-1);
- _globals->_sceneItems.push_back(&_object1);
+ g_globals->_sceneItems.push_back(&_object1);
- if (!_globals->getFlag(104)) {
+ if (!g_globals->getFlag(104)) {
_object4.postInit();
_object4.setVisage(2331);
_object4.setObjectWrapper(new SceneObjectWrapper());
@@ -2634,7 +2654,7 @@ void Scene90::postInit(SceneObjectList *OwnerList) {
_object4._moveDiff = Common::Point(20, 20);
_object4.setPosition(Common::Point(251, 207));
_object4.changeZoom(-1);
- _globals->_sceneItems.push_back(&_object4);
+ g_globals->_sceneItems.push_back(&_object4);
}
_object2.postInit();
@@ -2642,17 +2662,17 @@ void Scene90::postInit(SceneObjectList *OwnerList) {
_object2.animate(ANIM_MODE_1, NULL);
_object2.setPosition(Common::Point(315, 185));
_object2._strip = 2;
- _globals->_sceneItems.push_back(&_object2);
+ g_globals->_sceneItems.push_back(&_object2);
_object3.postInit();
_object3.setVisage(90);
_object3.animate(ANIM_MODE_1, NULL);
_object3.setPosition(Common::Point(196, 181));
_object3.fixPriority(175);
- _globals->_sceneItems.push_back(&_object3);
+ g_globals->_sceneItems.push_back(&_object3);
- _globals->_player.disableControl();
- _globals->_soundHandler.play(55);
+ g_globals->_player.disableControl();
+ g_globals->_soundHandler.play(55);
_soundHandler1.play(52);
_soundHandler1.holdAt(true);
@@ -2662,21 +2682,21 @@ void Scene90::postInit(SceneObjectList *OwnerList) {
_item1.setBounds(Rect(271, 65, 271, 186));
_item2.setBounds(Rect(0, 17, 124, 77));
- _globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL);
+ g_globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL);
}
void Scene90::signal() {
switch (_sceneMode) {
case 91:
_sceneMode = 92;
- _globals->_soundHandler.play(77, this);
+ g_globals->_soundHandler.play(77, this);
break;
case 92:
- _globals->_scenePalette.clearListeners();
- _globals->_game->endGame(90, 6);
+ g_globals->_scenePalette.clearListeners();
+ g_globals->_game->endGame(90, 6);
break;
case 96:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 97:
_stripManager._field2E8 = 0;
@@ -2694,7 +2714,7 @@ void Scene90::signal() {
*--------------------------------------------------------------------------*/
void Scene95::Action1::signal() {
- Scene95 *scene = (Scene95 *)_globals->_sceneManager._scene;
+ Scene95 *scene = (Scene95 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2719,7 +2739,7 @@ void Scene95::Action1::signal() {
Common::Point pt1(5, 198);
NpcMover *mover1 = new NpcMover();
- _globals->_player.addMover(mover1, &pt1, this);
+ g_globals->_player.addMover(mover1, &pt1, this);
Common::Point pt2(9, 190);
NpcMover *mover2 = new NpcMover();
@@ -2731,7 +2751,7 @@ void Scene95::Action1::signal() {
Common::Point pt1(235, 72);
PlayerMover *mover1 = new PlayerMover();
- _globals->_player.addMover(mover1, &pt1, NULL);
+ g_globals->_player.addMover(mover1, &pt1, NULL);
Common::Point pt2(235, 72);
PlayerMover *mover2 = new PlayerMover();
@@ -2762,8 +2782,8 @@ void Scene95::Action1::signal() {
break;
case 7: {
SceneItem::display(0, 0);
- _globals->_player.setVisage(92);
- _globals->_player.setPosition(Common::Point(-25, 200));
+ g_globals->_player.setVisage(92);
+ g_globals->_player.setPosition(Common::Point(-25, 200));
scene->_object1.setVisage(91);
scene->_object1.setPosition(Common::Point(-22, 220));
@@ -2771,7 +2791,7 @@ void Scene95::Action1::signal() {
Common::Point pt1(5, 198);
NpcMover *mover1 = new NpcMover();
- _globals->_player.addMover(mover1, &pt1, this);
+ g_globals->_player.addMover(mover1, &pt1, this);
Common::Point pt2(9, 190);
NpcMover *mover2 = new NpcMover();
@@ -2781,7 +2801,7 @@ void Scene95::Action1::signal() {
case 8: {
Common::Point pt1(108, 112);
PlayerMover *mover1 = new PlayerMover();
- _globals->_player.addMover(mover1, &pt1, this);
+ g_globals->_player.addMover(mover1, &pt1, this);
Common::Point pt2(108, 112);
PlayerMover *mover2 = new PlayerMover();
@@ -2789,7 +2809,7 @@ void Scene95::Action1::signal() {
break;
}
case 9:
- _globals->_sceneManager.changeScene(2300);
+ g_globals->_sceneManager.changeScene(2300);
break;
}
}
@@ -2804,14 +2824,14 @@ void Scene95::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(100, 10, 200, 100);
- _globals->_player.postInit();
- _globals->_player.setVisage(2337);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player._strip = 4;
- _globals->_player._moveDiff = Common::Point(30, 30);
- _globals->_player.setPosition(Common::Point(-35, 200));
- _globals->_player.changeZoom(-1);
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2337);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player._strip = 4;
+ g_globals->_player._moveDiff = Common::Point(30, 30);
+ g_globals->_player.setPosition(Common::Point(-35, 200));
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.disableControl();
_object1.postInit();
_object1.setVisage(2333);
@@ -2835,7 +2855,7 @@ void Scene95::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene6100::Action1::signal() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2852,7 +2872,7 @@ void Scene6100::Action1::signal() {
}
void Scene6100::Action2::signal() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2869,7 +2889,7 @@ void Scene6100::Action2::signal() {
}
void Scene6100::Action3::signal() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2877,9 +2897,9 @@ void Scene6100::Action3::signal() {
setDelay(60);
break;
case 1:
- _globals->_scenePalette.clearListeners();
+ g_globals->_scenePalette.clearListeners();
scene->_fadePercent = 100;
- _globals->_scenePalette.refresh();
+ g_globals->_scenePalette.refresh();
scene->loadScene(9997);
scene->_object1.hide();
scene->_object2.hide();
@@ -2890,7 +2910,7 @@ void Scene6100::Action3::signal() {
scene->_rocks.hide();
scene->_sceneText.hide();
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(8120, this);
break;
case 2:
@@ -2898,12 +2918,12 @@ void Scene6100::Action3::signal() {
break;
case 3:
scene->showMessage(NULL, 0, NULL);
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(8130, this);
break;
case 4:
- _globals->setFlag(76);
- _globals->_sceneManager.changeScene(
+ g_globals->setFlag(76);
+ g_globals->_sceneManager.changeScene(
(scene->_stripManager._field2E8 == 135) ? 6100 : 2320);
remove();
break;
@@ -2911,7 +2931,7 @@ void Scene6100::Action3::signal() {
}
void Scene6100::Action4::signal() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2928,7 +2948,7 @@ void Scene6100::Action4::signal() {
}
void Scene6100::Action5::dispatch() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
FloatSet zeroSet;
const double MULTIPLY_FACTOR = 0.01744; // 2 * pi / 360
@@ -2978,9 +2998,9 @@ void Scene6100::Action5::dispatch() {
if (idx != 3) {
scene->_objList[idx]->_floats._float1 =
- _globals->_randomSource.getRandomNumber(199);
+ g_globals->_randomSource.getRandomNumber(199);
scene->_objList[idx]->_floats._float2 =
- _globals->_randomSource.getRandomNumber(999) + 750.0;
+ g_globals->_randomSource.getRandomNumber(999) + 750.0;
scene->_objList[idx]->_floats.proc1(
-(scene->_turnAmount * 10 + scene->_angle) * MULTIPLY_FACTOR);
@@ -3002,34 +3022,34 @@ void Scene6100::Action5::dispatch() {
scene->_soundHandler.play(233);
scene->showMessage(NULL, 0, NULL);
- if (!_globals->getFlag(76))
+ if (!g_globals->getFlag(76))
scene->_probe.setAction(&scene->_action1);
break;
case 1:
scene->_soundHandler.play(233);
scene->showMessage(NULL, 0, NULL);
- if (!_globals->getFlag(76))
+ if (!g_globals->getFlag(76))
scene->_probe.setAction(&scene->_action2);
break;
case 2:
scene->_soundHandler.play(234);
scene->showMessage(NULL, 0, NULL);
- if (!_globals->getFlag(76))
+ if (!g_globals->getFlag(76))
scene->_probe.setAction(NULL);
scene->setAction(&scene->_action3);
break;
}
- _globals->_scenePalette.clearListeners();
+ g_globals->_scenePalette.clearListeners();
scene->_fadePercent = 0;
}
}
}
void Scene6100::GetBoxAction::signal() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -3042,7 +3062,7 @@ void Scene6100::GetBoxAction::signal() {
}
case 1: {
scene->showMessage(SCENE6100_TAKE_CONTROLS, 35, this);
- _globals->_scenePalette.clearListeners();
+ g_globals->_scenePalette.clearListeners();
Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y - 10);
NpcMover *mover = new NpcMover();
@@ -3061,13 +3081,13 @@ void Scene6100::GetBoxAction::signal() {
break;
case 5:
scene->showMessage(NULL, 0, NULL);
- _globals->_sceneManager.changeScene(2320);
+ g_globals->_sceneManager.changeScene(2320);
remove();
}
}
void Scene6100::GetBoxAction::dispatch() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
if (!scene->_probe._mover && (scene->_getBoxAction._actionIndex >= 1)) {
if (scene->_getBoxAction._actionIndex == 1) {
@@ -3093,7 +3113,7 @@ void Scene6100::Action7::signal() {
setDelay(90);
break;
case 2:
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_sceneManager.changeScene(2100);
remove();
break;
}
@@ -3105,16 +3125,16 @@ void Scene6100::Object::synchronize(Serializer &s) {
SceneObject::synchronize(s);
// Save the double fields of the FloatSet
- s.syncBytes((byte *)&_floats._float1, sizeof(double));
- s.syncBytes((byte *)&_floats._float2, sizeof(double));
- s.syncBytes((byte *)&_floats._float3, sizeof(double));
- s.syncBytes((byte *)&_floats._float4, sizeof(double));
+ s.syncAsDouble(_floats._float1);
+ s.syncAsDouble(_floats._float2);
+ s.syncAsDouble(_floats._float3);
+ s.syncAsDouble(_floats._float4);
}
/*--------------------------------------------------------------------------*/
void Scene6100::ProbeMover::dispatch() {
- Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene;
if (!dontMove()) {
if (scene->_speed > 0) {
@@ -3148,10 +3168,10 @@ Scene6100::Scene6100(): Scene() {
_angle = 0;
_msgActive = false;
- _globals->_sceneHandler._delayTicks = 8;
+ g_globals->_sceneHandler->_delayTicks = 8;
- _globals->_player.disableControl();
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.disableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
}
void Scene6100::synchronize(Serializer &s) {
@@ -3220,10 +3240,10 @@ void Scene6100::postInit(SceneObjectList *OwnerList) {
int baseVal = 2000;
for (int idx = 0; idx < 3; ++idx) {
- _objList[idx]->_floats._float1 = _globals->_randomSource.getRandomNumber(999);
+ _objList[idx]->_floats._float1 = g_globals->_randomSource.getRandomNumber(999);
_objList[idx]->_floats._float2 = baseVal;
_objList[idx]->_floats._float3 = 0.0;
- baseVal += _globals->_randomSource.getRandomNumber(499);
+ baseVal += g_globals->_randomSource.getRandomNumber(499);
_objList[idx]->postInit();
_objList[idx]->setVisage(6100);
@@ -3231,23 +3251,23 @@ void Scene6100::postInit(SceneObjectList *OwnerList) {
_objList[idx]->_strip = 2;
_objList[idx]->setPosition(Common::Point(
- _globals->_randomSource.getRandomNumber(319), 60));
+ g_globals->_randomSource.getRandomNumber(319), 60));
_objList[idx]->fixPriority(1);
_objList[idx]->changeZoom(-1);
}
setAction(&_action5);
- _globals->_scenePalette.addRotation(96, 143, -1);
+ g_globals->_scenePalette.addRotation(96, 143, -1);
- if (!_globals->getFlag(76))
+ if (!g_globals->getFlag(76))
_probe.setAction(&_action4);
- _globals->_soundHandler.play(231);
+ g_globals->_soundHandler.play(231);
}
void Scene6100::remove() {
- _globals->_player.disableControl();
- _globals->_scenePalette.clearListeners();
+ g_globals->_player.disableControl();
+ g_globals->_scenePalette.clearListeners();
Scene::remove();
}
@@ -3274,18 +3294,18 @@ void Scene6100::dispatch() {
_probe._action->dispatch();
// Handle mouse controlling the turning
- int changeAmount = (_globals->_events._mousePos.x - 160) / -20;
+ int changeAmount = (g_globals->_events._mousePos.x - 160) / -20;
_turnAmount += (changeAmount - _turnAmount) / 2;
if (_fadePercent < 100) {
_fadePercent += 10;
if (_fadePercent >= 100) {
- _globals->_scenePalette.addRotation(96, 143, -1);
+ g_globals->_scenePalette.addRotation(96, 143, -1);
_fadePercent = 100;
}
byte adjustData[] = {0xff, 0xff, 0xff, 0};
- _globals->_scenePalette.fade(adjustData, false, _fadePercent);
+ g_globals->_scenePalette.fade(adjustData, false, _fadePercent);
}
if (_action != &_action3) {
@@ -3324,4 +3344,6 @@ void Scene6100::showMessage(const Common::String &msg, int color, Action *action
}
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h
index 283cf68e07..bb98c89a8c 100644
--- a/engines/tsage/ringworld_scenes1.h
+++ b/engines/tsage/ringworld/ringworld_scenes1.h
@@ -24,7 +24,8 @@
#define TSAGE_RINGWORLD_SCENES1_H
#include "common/scummsys.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
#include "tsage/converse.h"
#include "tsage/events.h"
#include "tsage/core.h"
@@ -32,7 +33,11 @@
#include "tsage/globals.h"
#include "tsage/sound.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class Scene10 : public Scene {
/* Actions */
@@ -201,6 +206,7 @@ class Scene40 : public Scene {
class Action8 : public Action {
public:
virtual void signal();
+ virtual void dispatch();
};
/* Objects */
@@ -214,15 +220,15 @@ class Scene40 : public Scene {
};
/* Items */
- class Item2 : public SceneItem {
+ class Item2 : public SceneHotspot {
public:
virtual void doAction(int action);
};
- class Item6 : public SceneItem {
+ class Item6 : public SceneHotspot {
public:
virtual void doAction(int action);
};
- class Item8 : public SceneItem {
+ class Item8 : public SceneHotspot {
public:
virtual void doAction(int action);
};
@@ -532,6 +538,8 @@ public:
};
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp
index ba4060548e..5aeb127915 100644
--- a/engines/tsage/ringworld_scenes10.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes10.cpp
@@ -21,12 +21,14 @@
*/
#include "graphics/cursorman.h"
-#include "tsage/ringworld_scenes10.h"
+#include "tsage/ringworld/ringworld_scenes10.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
Scene2::Scene2() : Scene() {
_sceneState = 0;
@@ -35,55 +37,56 @@ Scene2::Scene2() : Scene() {
/*--------------------------------------------------------------------------*/
void Object9350::postInit(SceneObjectList *OwnerList) {
- //SceneObject::postInit(&_globals->_sceneManager._altSceneObjects);
+ //SceneObject::postInit(&g_globals->_sceneManager._bgSceneObjects);
SceneObject::postInit(OwnerList);
}
void Object9350::draw() {
reposition();
Rect destRect = _bounds;
- destRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
- Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_globals->_sceneManager._scene->_stripManager._stripNum);
+ destRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y);
+ Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(g_globals->_sceneManager._scene->_stripManager._stripNum);
GfxSurface frame = getFrame();
- _globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
+ g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
}
/*--------------------------------------------------------------------------
* Scene 9100 - Near beach: Slave washing clothes
*
*--------------------------------------------------------------------------*/
+// Slave hotspot
void Scene9100::SceneHotspot1::doAction(int action) {
- Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+ Scene9100 *scene = (Scene9100 *)g_globals->_sceneManager._scene;
if (action == CURSOR_TALK) {
- if (_globals->getFlag(23)) {
- _globals->_player.disableControl();
+ if (g_globals->getFlag(23)) {
+ g_globals->_player.disableControl();
scene->_sceneMode = 9104;
} else {
- _globals->setFlag(23);
- _globals->_player.disableControl();
+ g_globals->setFlag(23);
+ g_globals->_player.disableControl();
scene->_sceneMode = 9105;
}
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, &scene->_object5, &scene->_object6, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &g_globals->_player, &scene->_object5, &scene->_object6, NULL);
} else {
NamedHotspot::doAction(action);
}
}
void Scene9100::dispatch() {
- Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+ Scene9100 *scene = (Scene9100 *)g_globals->_sceneManager._scene;
if (!_action) {
- if (_globals->_player._position.x < 25) {
- _globals->_player.disableControl();
- if (!_globals->getFlag(23) || _globals->getFlag(11))
+ if (g_globals->_player._position.x < 25) {
+ g_globals->_player.disableControl();
+ if (!g_globals->getFlag(23) || g_globals->getFlag(11))
_sceneMode = 9106;
else {
_sceneMode = 9108;
- _globals->setFlag(11);
+ g_globals->setFlag(11);
}
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &g_globals->_player, NULL);
}
} else {
Scene::dispatch();
@@ -91,23 +94,23 @@ void Scene9100::dispatch() {
}
void Scene9100::signal() {
- Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+ Scene9100 *scene = (Scene9100 *)g_globals->_sceneManager._scene;
switch (scene->_sceneMode) {
case 9102:
case 9106:
case 9108:
- _globals->_sceneManager.changeScene(9150);
+ g_globals->_sceneManager.changeScene(9150);
break;
case 9105:
- _sceneHotspot3.remove();
+ _hotspotCleanedClothes.remove();
// No break on purpose
case 9103:
case 9104:
case 9107:
case 9109:
default:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -123,7 +126,7 @@ void Scene9100::postInit(SceneObjectList *OwnerList) {
_object1.animate(ANIM_MODE_2, NULL);
_object1.fixPriority(10);
- _globals->_player.postInit();
+ g_globals->_player.postInit();
_object2.postInit();
_object2.hide();
@@ -137,39 +140,39 @@ void Scene9100::postInit(SceneObjectList *OwnerList) {
_object5.postInit();
_object5.hide();
- if (!_globals->getFlag(23)) {
+ if (!g_globals->getFlag(23)) {
_object6.postInit();
_object6.setVisage(9111);
_object6.setStrip(6);
_object6.setFrame(1);
_object6.setPosition(Common::Point(138, 166));
- _sceneHotspot3.setup(145, 125, 166, 156, 9100, 40, 43);
- }
- _sceneHotspot1.setup(140, 176, 185, 215, 9100, 36, 37);
- _sceneHotspot2.setup(161, 138, 182, 175, 9100, 38, 39);
- _sceneHotspot4.setup(37, 196, 47, 320, 9100, 44, -1);
- _sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46);
- _sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48);
-
- _globals->_soundHandler.play(251);
- if (_globals->_sceneManager._previousScene == 9150) {
- if (_globals->getFlag(20)) {
- _globals->_player.disableControl();
- if (_globals->getFlag(11))
+ _hotspotCleanedClothes.setDetails(145, 125, 166, 156, 9100, 40, 43);
+ }
+ _hotspotSlave.setDetails(140, 176, 185, 215, 9100, 36, 37);
+ _hotspotSoiledClothes.setDetails(161, 138, 182, 175, 9100, 38, 39);
+ _hotspotIsland.setDetails(37, 196, 47, 320, 9100, 44, -1);
+ _hotspotBoulders.setDetails(69, 36, 121, 272, 9100, 45, 46);
+ _hotspotTrees.setDetails(127, 0, 200, 52, 9100, 47, 48);
+
+ g_globals->_soundHandler.play(251);
+ if (g_globals->_sceneManager._previousScene == 9150) {
+ if (g_globals->getFlag(20)) {
+ g_globals->_player.disableControl();
+ if (g_globals->getFlag(11))
_sceneMode = 9107;
else
_sceneMode = 9109;
- setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object5, NULL);
+ setAction(&_sequenceManager, this, _sceneMode, &g_globals->_player, &_object5, NULL);
} else {
_sceneMode = 9103;
- _globals->_player.disableControl();
- setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
- _globals->setFlag(20);
+ g_globals->_player.disableControl();
+ setAction(&_sequenceManager, this, _sceneMode, &g_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
+ g_globals->setFlag(20);
}
} else {
_sceneMode = 9102;
- _globals->_player.disableControl();
- setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
+ g_globals->_player.disableControl();
+ setAction(&_sequenceManager, this, _sceneMode, &g_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
}
}
@@ -180,7 +183,7 @@ void Scene9100::postInit(SceneObjectList *OwnerList) {
void Scene9150::Object3::signal() {
switch (_signalFlag++) {
case 0:
- _timer = 10 + _globals->_randomSource.getRandomNumber(90);
+ _timer = 10 + g_globals->_randomSource.getRandomNumber(90);
break;
default:
animate(ANIM_MODE_5, this);
@@ -199,15 +202,15 @@ void Scene9150::signal() {
switch (_sceneMode) {
case 9151:
case 9157:
- _globals->_sceneManager.changeScene(9100);
+ g_globals->_sceneManager.changeScene(9100);
break;
case 9153:
- _globals->_sceneManager.changeScene(9300);
+ g_globals->_sceneManager.changeScene(9300);
break;
case 9152:
case 9155:
case 9156:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 9154:
default:
@@ -227,21 +230,21 @@ void Scene9150::dispatch() {
if (_action) {
_action->dispatch();
} else {
- if (_globals->_player._position.x >= 160) {
- if (_globals->_player._position.x > 630) {
- _globals->_player.disableControl();
+ if (g_globals->_player._position.x >= 160) {
+ if (g_globals->_player._position.x > 630) {
+ g_globals->_player.disableControl();
_sceneMode = 9157;
- setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, NULL);
}
} else {
- _globals->_player.disableControl();
- if (_globals->getFlag(11)) {
- _globals->_soundHandler.play(286);
+ g_globals->_player.disableControl();
+ if (g_globals->getFlag(11)) {
+ g_globals->_soundHandler.play(286);
_sceneMode = 9153;
} else {
_sceneMode = 9156;
}
- setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, NULL);
}
}
}
@@ -249,7 +252,7 @@ void Scene9150::dispatch() {
void Scene9150::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _globals->_player.postInit();
+ g_globals->_player.postInit();
_object3.postInit();
_sceneState = 1;
@@ -259,37 +262,37 @@ void Scene9150::postInit(SceneObjectList *OwnerList) {
_object3.setPosition(Common::Point(312, 95));
_object3.signal();
- _sceneHotspot1.setup(0, 0, 200, 94, 9150, 46, -1);
- _sceneHotspot2.setup(51, 90, 118, 230, 9150, 47, -1);
- _sceneHotspot3.setup(182, 104, 200, 320, 9150, 48, 49);
- _sceneHotspot4.setup(103, 292, 152, 314, 9150, 50, 51);
- _sceneHotspot5.setup(115, 350, 160, 374, 9150, 52, 53);
- _sceneHotspot6.setup(0, 471, 200, 531, 9150, 54, 55);
- _sceneHotspot7.setup(170, 320, 185, 640, 9150, 56, -1);
- _sceneHotspot9.setup(157, 107, 186, 320, 9150, 56, -1);
- _sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1);
- _sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59);
-
- _globals->_soundHandler.play(285);
- _globals->_player.disableControl();
-
- if (_globals->getFlag(20)) {
+ _sceneHotspot1.setDetails(0, 0, 200, 94, 9150, 46, -1);
+ _sceneHotspot2.setDetails(51, 90, 118, 230, 9150, 47, -1);
+ _sceneHotspot3.setDetails(182, 104, 200, 320, 9150, 48, 49);
+ _sceneHotspot4.setDetails(103, 292, 152, 314, 9150, 50, 51);
+ _sceneHotspot5.setDetails(115, 350, 160, 374, 9150, 52, 53);
+ _sceneHotspot6.setDetails(0, 471, 200, 531, 9150, 54, 55);
+ _sceneHotspot7.setDetails(170, 320, 185, 640, 9150, 56, -1);
+ _sceneHotspot9.setDetails(157, 107, 186, 320, 9150, 56, -1);
+ _sceneHotspot8.setDetails(133, 584, 142, 640, 9150, 57, -1);
+ _sceneHotspot10.setDetails(83, 304, 103, 323, 9150, 58, 59);
+
+ g_globals->_soundHandler.play(285);
+ g_globals->_player.disableControl();
+
+ if (g_globals->getFlag(20)) {
// Walking alone
- _globals->_scrollFollower = &_globals->_player;
- if (_globals->getFlag(11))
+ g_globals->_scrollFollower = &g_globals->_player;
+ if (g_globals->getFlag(11))
// Hero wearing peasan suit
_sceneMode = 9155;
else
// Hero wearing Purple suit
_sceneMode = 9152;
- setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, NULL);
} else {
// Walking with the tiger
_sceneMode = 9151;
_object2.postInit();
_object2.hide();
_object1.postInit();
- setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, &_object1, &_object2, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, &_object1, &_object2, NULL);
}
}
@@ -298,22 +301,22 @@ void Scene9150::postInit(SceneObjectList *OwnerList) {
*
*--------------------------------------------------------------------------*/
void Scene9200::SceneHotspot1::doAction(int action) {
- Scene9200 *scene = (Scene9200 *)_globals->_sceneManager._scene;
+ Scene9200 *scene = (Scene9200 *)g_globals->_sceneManager._scene;
if (action == OBJECT_TUNIC) {
- _globals->_player.disableControl();
- if (_globals->getFlag(93)) {
+ g_globals->_player.disableControl();
+ if (g_globals->getFlag(93)) {
scene->_sceneState = 9214;
- scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9214, &g_globals->_player, &scene->_object2, NULL);
} else {
- _globals->setFlag(93);
+ g_globals->setFlag(93);
scene->_sceneState = 9213;
- scene->setAction(&scene->_sequenceManager, scene, 9213, &_globals->_player, &scene->_object2, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9213, &g_globals->_player, &scene->_object2, NULL);
}
} else if (action <= 100) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneState = 9214;
- scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9214, &g_globals->_player, &scene->_object2, NULL);
} else {
NamedHotspot::doAction(action);
}
@@ -322,15 +325,15 @@ void Scene9200::SceneHotspot1::doAction(int action) {
void Scene9200::signal() {
switch (_sceneState++) {
case 9207:
- _globals->_sceneManager.changeScene(9700);
+ g_globals->_sceneManager.changeScene(9700);
break;
case 9208:
case 9211:
case 9212:
- _globals->_sceneManager.changeScene(9500);
+ g_globals->_sceneManager.changeScene(9500);
break;
case 9209:
- _globals->_sceneManager.changeScene(9360);
+ g_globals->_sceneManager.changeScene(9360);
break;
case 9210:
_hotspot1.remove();
@@ -342,7 +345,7 @@ void Scene9200::signal() {
case 9205:
case 9206:
default:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -358,30 +361,30 @@ void Scene9200::dispatch() {
if (_action) {
_action->dispatch();
} else {
- if ( (_globals->_player._position.x <= 0) || ((_globals->_player._position.x < 100) && (_globals->_player._position.y > 199))) {
- _globals->_player.disableControl();
+ if ( (g_globals->_player._position.x <= 0) || ((g_globals->_player._position.x < 100) && (g_globals->_player._position.y > 199))) {
+ g_globals->_player.disableControl();
_sceneState = 9209;
- setAction(&_sequenceManager, this, 9209, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9209, &g_globals->_player, &_object2, &_object3, NULL);
} else {
- if (rect9200.contains(_globals->_player._position)) {
- if (_globals->getFlag(93)) {
- if (_globals->getFlag(86)) {
+ if (rect9200.contains(g_globals->_player._position)) {
+ if (g_globals->getFlag(93)) {
+ if (g_globals->getFlag(86)) {
_sceneState = 9215;
- setAction(&_sequenceManager, this, 9215, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9215, &g_globals->_player, &_object2, &_object3, NULL);
} else {
_sceneState = 9208;
- setAction(&_sequenceManager, this, 9208, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9208, &g_globals->_player, &_object2, &_object3, NULL);
}
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneState = 9204;
- setAction(&_sequenceManager, this, 9204, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9204, &g_globals->_player, &_object2, &_object3, NULL);
}
} else {
- if (_globals->_player._position.y < 140) {
- _globals->_player.disableControl();
+ if (g_globals->_player._position.y < 140) {
+ g_globals->_player.disableControl();
_sceneState = 9207;
- setAction(&_sequenceManager, this, 9207, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9207, &g_globals->_player, &_object2, &_object3, NULL);
}
}
}
@@ -392,7 +395,7 @@ void Scene9200::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(130, 50, 200, 150);
- _globals->_player.postInit();
+ g_globals->_player.postInit();
_object3.postInit();
_object3.hide();
_object1.postInit();
@@ -408,63 +411,63 @@ void Scene9200::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerGR);
_stripManager.addSpeaker(&_speakerGText);
- if (!_globals->getFlag(86)) {
+ if (!g_globals->getFlag(86)) {
_object2.postInit();
- _hotspot1.setup(96, 194, 160, 234, 9200, 29, 31);
+ _hotspot1.setDetails(96, 194, 160, 234, 9200, 29, 31);
}
- _hotspot2.setup(164, 0, 200, 282, 9200, 0, 1);
- _hotspot3.setup(140, 39, 165, 153, 9200, 2, 3);
- _hotspot4.setup(92, 122, 139, 152, 9200, 4, 5);
- _hotspot5.setup(33, 20, 142, 115, 9200, 6, 7);
- _hotspot6.setup(104, 235, 153, 265, 9200, 8, 9);
- _hotspot7.setup(107, 262, 153, 286, 9200, 10, 11);
- _hotspot8.setup(69, 276, 164, 320, 9200, 12, 13);
+ _hotspot2.setDetails(164, 0, 200, 282, 9200, 0, 1);
+ _hotspot3.setDetails(140, 39, 165, 153, 9200, 2, 3);
+ _hotspot4.setDetails(92, 122, 139, 152, 9200, 4, 5);
+ _hotspot5.setDetails(33, 20, 142, 115, 9200, 6, 7);
+ _hotspot6.setDetails(104, 235, 153, 265, 9200, 8, 9);
+ _hotspot7.setDetails(107, 262, 153, 286, 9200, 10, 11);
+ _hotspot8.setDetails(69, 276, 164, 320, 9200, 12, 13);
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.disableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.disableControl();
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 9500:
- if (_globals->getFlag(85)) {
+ if (g_globals->getFlag(85)) {
if (RING_INVENTORY._helmet._sceneNumber == 1) {
- _globals->setFlag(86);
- _globals->_player.disableControl();
+ g_globals->setFlag(86);
+ g_globals->_player.disableControl();
_sceneState = 9210;
- setAction(&_sequenceManager, this, 9210, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9210, &g_globals->_player, &_object2, &_object3, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneState = 9212;
- setAction(&_sequenceManager, this, 9212, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9212, &g_globals->_player, &_object2, &_object3, NULL);
}
} else {
if (RING_INVENTORY._helmet._sceneNumber == 1) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneState = 9211;
- setAction(&_sequenceManager, this, 9211, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9211, &g_globals->_player, &_object2, &_object3, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneState = 9202;
- setAction(&_sequenceManager, this, 9202, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9202, &g_globals->_player, &_object2, &_object3, NULL);
}
}
break;
case 9700:
- if (_globals->getFlag(86)) {
+ if (g_globals->getFlag(86)) {
_sceneState = 9206;
- setAction(&_sequenceManager, this, 9206, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9206, &g_globals->_player, &_object2, &_object3, NULL);
} else {
_sceneState = 9203;
- setAction(&_sequenceManager, this, 9203, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9203, &g_globals->_player, &_object2, &_object3, NULL);
}
break;
case 9360:
default:
- if (_globals->getFlag(86)) {
+ if (g_globals->getFlag(86)) {
_sceneState = 9205;
- setAction(&_sequenceManager, this, 9205, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9205, &g_globals->_player, &_object2, &_object3, NULL);
} else {
_sceneState = 9201;
- setAction(&_sequenceManager, this, 9201, &_globals->_player, &_object2, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9201, &g_globals->_player, &_object2, &_object3, NULL);
}
break;
}
@@ -477,14 +480,14 @@ void Scene9200::postInit(SceneObjectList *OwnerList) {
void Scene9300::signal() {
switch (_sceneMode++) {
case 9301:
- _globals->setFlag(84);
+ g_globals->setFlag(84);
// No break on purpose
case 9303:
- _globals->_soundHandler.play(295);
- _globals->_sceneManager.changeScene(9350);
+ g_globals->_soundHandler.play(295);
+ g_globals->_sceneManager.changeScene(9350);
break;
case 9302:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
default:
break;
@@ -494,10 +497,10 @@ void Scene9300::signal() {
void Scene9300::dispatch() {
if (_action) {
_action->dispatch();
- } else if (_globals->_player._position.y < 145) {
- _globals->_player.disableControl();
+ } else if (g_globals->_player._position.y < 145) {
+ g_globals->_player.disableControl();
_sceneMode = 9303;
- setAction(&_sequenceManager, this, 9303, &_globals->_player, &_object1, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9303, &g_globals->_player, &_object1, &_object2, NULL);
}
}
@@ -506,34 +509,34 @@ void Scene9300::postInit(SceneObjectList *OwnerList) {
setZoomPercents(130, 75, 230, 150);
_sceneMode = 0;
- _globals->_player.postInit();
- _globals->_player.changeZoom(-1);
+ g_globals->_player.postInit();
+ g_globals->_player.changeZoom(-1);
_object1.postInit();
_object2.postInit();
- _globals->_soundHandler.play(289);
-
- _hotspot1.setup(35, 142, 76, 212, 9300, 0, 1);
- _hotspot2.setup(28, 90, 81, 143, 9300, 2, 3);
- _hotspot3.setup(78, 142, 146, 216, 9300, 4, 5);
- _hotspot4.setup(3, 43, 91, 74, 9300, 6, 7);
- _hotspot5.setup(82, 19, 157, 65, 9300, 8, 9);
- _hotspot6.setup(5, 218, 84, 274, 9300, 10, 11);
- _hotspot7.setup(86, 233, 168, 293, 9300, 12, 13);
- _hotspot8.setup(157, 0, 200, 230, 9300, 14, 15);
- _hotspot9.setup(169, 227, 200, 320, 9300, 16, 17);
- _hotspot10.setup(145, 97, 166, 225, 9300, 18, 19);
- _hotspot11.setup(81, 75, 145, 145, 9300, 20, 21);
- _hotspot12.setup(0, 0, 94, 35, 9300, 22, 23);
- _hotspot13.setup(12, 268, 149, 320, 9300, 24, 25);
-
- if (_globals->_sceneManager._previousScene == 9350) {
- _globals->_player.disableControl();
+ g_globals->_soundHandler.play(289);
+
+ _hotspot1.setDetails(35, 142, 76, 212, 9300, 0, 1);
+ _hotspot2.setDetails(28, 90, 81, 143, 9300, 2, 3);
+ _hotspot3.setDetails(78, 142, 146, 216, 9300, 4, 5);
+ _hotspot4.setDetails(3, 43, 91, 74, 9300, 6, 7);
+ _hotspot5.setDetails(82, 19, 157, 65, 9300, 8, 9);
+ _hotspot6.setDetails(5, 218, 84, 274, 9300, 10, 11);
+ _hotspot7.setDetails(86, 233, 168, 293, 9300, 12, 13);
+ _hotspot8.setDetails(157, 0, 200, 230, 9300, 14, 15);
+ _hotspot9.setDetails(169, 227, 200, 320, 9300, 16, 17);
+ _hotspot10.setDetails(145, 97, 166, 225, 9300, 18, 19);
+ _hotspot11.setDetails(81, 75, 145, 145, 9300, 20, 21);
+ _hotspot12.setDetails(0, 0, 94, 35, 9300, 22, 23);
+ _hotspot13.setDetails(12, 268, 149, 320, 9300, 24, 25);
+
+ if (g_globals->_sceneManager._previousScene == 9350) {
+ g_globals->_player.disableControl();
_sceneMode = 9302;
- setAction(&_sequenceManager, this, 9302, &_globals->_player, &_object1, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9302, &g_globals->_player, &_object1, &_object2, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9301;
- setAction(&_sequenceManager, this, 9301, &_globals->_player, &_object1, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9301, &g_globals->_player, &_object1, &_object2, NULL);
}
}
@@ -548,17 +551,17 @@ void Scene9350::signal() {
case 9352:
case 9353:
case 9354:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 9355:
- _globals->_sceneManager.changeScene(9300);
+ g_globals->_sceneManager.changeScene(9300);
break;
case 9356:
- _globals->_sceneManager.changeScene(9360);
+ g_globals->_sceneManager.changeScene(9360);
break;
case 9357:
case 9359:
- _globals->_sceneManager.changeScene(9400);
+ g_globals->_sceneManager.changeScene(9400);
break;
default:
break;
@@ -567,18 +570,18 @@ void Scene9350::signal() {
void Scene9350::dispatch() {
if (_action == 0) {
- if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) {
- _globals->_player.disableControl();
+ if ((g_globals->_player._position.x > 300) && (g_globals->_player._position.y < 160)) {
+ g_globals->_player.disableControl();
_sceneState = 9356;
- setAction(&_sequenceManager, this, 9356, &_globals->_player, &_object2, NULL);
- } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 9356, &g_globals->_player, &_object2, NULL);
+ } else if ((g_globals->_player._position.x > 110) && (g_globals->_player._position.y >= 195)) {
+ g_globals->_player.disableControl();
_sceneState = 9357;
- setAction(&_sequenceManager, this, 9357, &_globals->_player, &_object2, NULL);
- } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 9357, &g_globals->_player, &_object2, NULL);
+ } else if ((g_globals->_player._position.x < 10) || ((g_globals->_player._position.x <= 110) && (g_globals->_player._position.y >= 195))) {
+ g_globals->_player.disableControl();
_sceneState = 9355;
- setAction(&_sequenceManager, this, 9355, &_globals->_player, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9355, &g_globals->_player, &_object2, NULL);
}
} else {
Scene::dispatch();
@@ -588,37 +591,37 @@ void Scene9350::dispatch() {
void Scene9350::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(95, 80, 200, 100);
- _globals->_player.postInit();
+ g_globals->_player.postInit();
_object1.setup(9351, 1, 3, 139, 97, 0);
- _sceneHotspot1.setup(42, 0, 97, 60, 9350, 0, -1);
- _sceneHotspot2.setup(37, 205, 82, 256, 9350, 0, -1);
- _sceneHotspot3.setup(29, 93, 92, 174, 9350, 1, -1);
- _sceneHotspot4.setup(0, 308, 109, 320, 9350, 2, -1);
- _sceneHotspot5.setup(0, 0, 200, 320, 9350, 3, -1);
+ _sceneHotspot1.setDetails(42, 0, 97, 60, 9350, 0, -1);
+ _sceneHotspot2.setDetails(37, 205, 82, 256, 9350, 0, -1);
+ _sceneHotspot3.setDetails(29, 93, 92, 174, 9350, 1, -1);
+ _sceneHotspot4.setDetails(0, 308, 109, 320, 9350, 2, -1);
+ _sceneHotspot5.setDetails(0, 0, 200, 320, 9350, 3, -1);
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.disableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.disableControl();
- if (_globals->_sceneManager._previousScene == 9360) {
- _globals->_player.disableControl();
+ if (g_globals->_sceneManager._previousScene == 9360) {
+ g_globals->_player.disableControl();
_sceneState = 9352;
- setAction(&_sequenceManager, this, 9352, &_globals->_player, &_object2, NULL);
- } else if (_globals->_sceneManager._previousScene == 9400) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 9352, &g_globals->_player, &_object2, NULL);
+ } else if (g_globals->_sceneManager._previousScene == 9400) {
+ g_globals->_player.disableControl();
_sceneState = 9353;
- setAction(&_sequenceManager, this, 9353, &_globals->_player, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9353, &g_globals->_player, &_object2, NULL);
} else {
- if (_globals->getFlag(84)) {
- _globals->clearFlag(84);
+ if (g_globals->getFlag(84)) {
+ g_globals->clearFlag(84);
_object2.postInit();
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneState = 9359;
- setAction(&_sequenceManager, this, 9359, &_globals->_player, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9359, &g_globals->_player, &_object2, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneState = 9354;
- setAction(&_sequenceManager, this, 9354, &_globals->_player, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9354, &g_globals->_player, &_object2, NULL);
}
}
}
@@ -634,16 +637,16 @@ void Scene9360::signal() {
case 9362:
case 9363:
case 9364:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 9365:
- _globals->_sceneManager.changeScene(9350);
+ g_globals->_sceneManager.changeScene(9350);
break;
case 9366:
- _globals->_sceneManager.changeScene(9200);
+ g_globals->_sceneManager.changeScene(9200);
break;
case 9367:
- _globals->_sceneManager.changeScene(9450);
+ g_globals->_sceneManager.changeScene(9450);
break;
default:
break;
@@ -652,18 +655,18 @@ void Scene9360::signal() {
void Scene9360::dispatch() {
if (_action == 0) {
- if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) {
- _globals->_player.disableControl();
+ if ((g_globals->_player._position.x > 300) && (g_globals->_player._position.y < 160)) {
+ g_globals->_player.disableControl();
_sceneState = 9366;
- setAction(&_sequenceManager, this, 9366, &_globals->_player, NULL);
- } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 9366, &g_globals->_player, NULL);
+ } else if ((g_globals->_player._position.x > 110) && (g_globals->_player._position.y >= 195)) {
+ g_globals->_player.disableControl();
_sceneState = 9367;
- setAction(&_sequenceManager, this, 9367, &_globals->_player, NULL);
- } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 9367, &g_globals->_player, NULL);
+ } else if ((g_globals->_player._position.x < 10) || ((g_globals->_player._position.x <= 110) && (g_globals->_player._position.y >= 195))) {
+ g_globals->_player.disableControl();
_sceneState = 9365;
- setAction(&_sequenceManager, this, 9365, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 9365, &g_globals->_player, NULL);
}
} else {
Scene::dispatch();
@@ -673,30 +676,30 @@ void Scene9360::dispatch() {
void Scene9360::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(95, 80, 200, 100);
- _globals->_player.postInit();
-
- _hotspot1.setup(37, 92, 93, 173, 9360, 0, 1);
- _hotspot2.setup(42, 0, 100, 63, 9360, 2, -1);
- _hotspot3.setup(36, 205, 82, 260, 9360, 3, -1);
- _hotspot4.setup(103, 2, 200, 320, 9360, 4, -1);
- _hotspot5.setup(0, 0, 37, 320, 9360, 4, -1);
- _hotspot6.setup(35, 61, 103, 92, 9360, 4, -1);
- _hotspot7.setup(33, 174, 93, 207, 9360, 4, -1);
- _hotspot8.setup(28, 257, 149, 320, 9360, 4, -1);
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.disableControl();
- if (_globals->_sceneManager._previousScene == 9350) {
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+
+ _hotspot1.setDetails(37, 92, 93, 173, 9360, 0, 1);
+ _hotspot2.setDetails(42, 0, 100, 63, 9360, 2, -1);
+ _hotspot3.setDetails(36, 205, 82, 260, 9360, 3, -1);
+ _hotspot4.setDetails(103, 2, 200, 320, 9360, 4, -1);
+ _hotspot5.setDetails(0, 0, 37, 320, 9360, 4, -1);
+ _hotspot6.setDetails(35, 61, 103, 92, 9360, 4, -1);
+ _hotspot7.setDetails(33, 174, 93, 207, 9360, 4, -1);
+ _hotspot8.setDetails(28, 257, 149, 320, 9360, 4, -1);
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.disableControl();
+ if (g_globals->_sceneManager._previousScene == 9350) {
+ g_globals->_player.disableControl();
_sceneState = 9364;
- setAction(&_sequenceManager, this, 9364, &_globals->_player, NULL);
- } else if (_globals->_sceneManager._previousScene == 9450) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 9364, &g_globals->_player, NULL);
+ } else if (g_globals->_sceneManager._previousScene == 9450) {
+ g_globals->_player.disableControl();
_sceneState = 9363;
- setAction(&_sequenceManager, this, 9363, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 9363, &g_globals->_player, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneState = 9362;
- setAction(&_sequenceManager, this, 9362, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 9362, &g_globals->_player, NULL);
}
_object1.setup(9351, 1, 1, 131, 90, 0);
}
@@ -710,22 +713,22 @@ Scene9400::Scene9400() {
}
void Scene9400::SceneHotspot7::doAction(int action) {
- Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene;
+ Scene9400 *scene = (Scene9400 *)g_globals->_sceneManager._scene;
if ((action == CURSOR_USE) && (RING_INVENTORY._straw._sceneNumber != 1)) {
scene->_sceneState = 1;
RING_INVENTORY._straw._sceneNumber = 1;
- scene->setAction(&scene->_sequenceManager, scene, 9408, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9408, &g_globals->_player, NULL);
} else {
NamedHotspot::doAction(action);
}
}
void Scene9400::SceneHotspot8::doAction(int action) {
- Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene;
+ Scene9400 *scene = (Scene9400 *)g_globals->_sceneManager._scene;
if (action == CURSOR_TALK) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneState = 2;
scene->signal();
} else {
@@ -742,7 +745,7 @@ void Scene9400::signal() {
case 1:
_object1._numFrames = 6;
_object1.animate(ANIM_MODE_2, NULL);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 2:
_object1.animate(ANIM_MODE_5, this);
@@ -752,10 +755,10 @@ void Scene9400::signal() {
break;
case 4:
_object1.animate(ANIM_MODE_2, this);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 9350:
- _globals->_sceneManager.changeScene(9350);
+ g_globals->_sceneManager.changeScene(9350);
break;
default:
break;
@@ -772,13 +775,13 @@ void Scene9400::dispatch() {
_field1032 = 0;
}
if (_action == 0) {
- if (_globals->_player._position.y < 120) {
+ if (g_globals->_player._position.y < 120) {
_sceneState = 9350;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setAction(&_action1);
Common::Point pt(-45, 88);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
}
} else {
Scene::dispatch();
@@ -789,35 +792,35 @@ void Scene9400::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
_screenNumber = 9400;
setZoomPercents(0, 100, 200, 100);
- _globals->_player.postInit();
+ g_globals->_player.postInit();
_object1.postInit();
_object3.postInit();
_speakerQText._textPos.x = 20;
- _hotspot7.setup(157, 66, 180, 110, 9400, 21, 23);
- _hotspot5.setup(130, 133, 152, 198, 9400, 22, -1);
- _hotspot1.setup(33, 280, 69, 297, 9400, 1, 2);
- _hotspot2.setup(73, 96, 87, 159, 9400, 3, 4);
- _hotspot3.setup(89, 253, 111, 305, 9400, 5, 6);
- _hotspot4.setup(46, 0, 116, 35, 9400, 7, 8);
- _hotspot8.setup(58, 169, 122, 200, 9400, 9, 10);
- _hotspot6.setup(0, 0, 199, 319, 9400, 16, 0);
+ _hotspot7.setDetails(157, 66, 180, 110, 9400, 21, 23);
+ _hotspot5.setDetails(130, 133, 152, 198, 9400, 22, -1);
+ _hotspot1.setDetails(33, 280, 69, 297, 9400, 1, 2);
+ _hotspot2.setDetails(73, 96, 87, 159, 9400, 3, 4);
+ _hotspot3.setDetails(89, 253, 111, 305, 9400, 5, 6);
+ _hotspot4.setDetails(46, 0, 116, 35, 9400, 7, 8);
+ _hotspot8.setDetails(58, 169, 122, 200, 9400, 9, 10);
+ _hotspot6.setDetails(0, 0, 199, 319, 9400, 16, 0);
_stripManager.addSpeaker(&_speakerQText);
_stripManager.addSpeaker(&_speakerOR);
_stripManager.addSpeaker(&_speakerOText);
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.disableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.disableControl();
- // Useless check (skipped) : if (_globals->_sceneManager._previousScene == 9350)
+ // Useless check (skipped) : if (g_globals->_sceneManager._previousScene == 9350)
_sceneState = 2;
- if (!_globals->getFlag(89)) {
- _globals->setFlag(89);
+ if (!g_globals->getFlag(89)) {
+ g_globals->setFlag(89);
_sceneState = 0;
}
- setAction(&_sequenceManager, this, 9400, &_globals->_player, &_object1, &_object3, NULL);
+ setAction(&_sequenceManager, this, 9400, &g_globals->_player, &_object1, &_object3, NULL);
}
void Scene9400::synchronize(Serializer &s) {
@@ -831,7 +834,7 @@ void Scene9400::synchronize(Serializer &s) {
*
*--------------------------------------------------------------------------*/
void Scene9450::Object2::signal() {
- Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+ Scene9450 *scene = (Scene9450 *)g_globals->_sceneManager._scene;
this->setAction(&scene->_sequenceManager3, this, 9458, this, &scene->_object1, NULL);
}
@@ -842,29 +845,29 @@ void Scene9450::Object3::dispatch() {
}
void Scene9450::Hotspot1::doAction(int action) {
- Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+ Scene9450 *scene = (Scene9450 *)g_globals->_sceneManager._scene;
if (action == CURSOR_USE) {
if (scene->_object2._action)
scene->_object2._action->remove();
scene->_sceneMode = 9459;
- _globals->_player.disableControl();
- scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL);
+ g_globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &g_globals->_player, NULL);
} else {
NamedHotspot::doAction(action);
}
}
void Scene9450::Hotspot3::doAction(int action) {
- Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+ Scene9450 *scene = (Scene9450 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_CLOAK:
case OBJECT_JACKET:
case OBJECT_TUNIC2:
scene->_sceneMode = 9460;
- _globals->_player.disableControl();
- scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL);
+ g_globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9460, &g_globals->_player, &scene->_object2, &scene->_object1, NULL);
break;
case OBJECT_TUNIC:
SceneItem::display(9450, 49, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
@@ -881,14 +884,14 @@ void Scene9450::Hotspot3::doAction(int action) {
if (scene->_object2._action)
scene->_object2._action->remove();
scene->_sceneMode = 9459;
- _globals->_player.disableControl();
- scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL);
+ g_globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &g_globals->_player, NULL);
} else if ((RING_INVENTORY._cloak._sceneNumber != 1) && (RING_INVENTORY._jacket._sceneNumber != 1) && (RING_INVENTORY._tunic2._sceneNumber != 1)) {
SceneItem::display(9450, 38, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
} else {
scene->_sceneMode = 9460;
- _globals->_player.disableControl();
- scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL);
+ g_globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9460, &g_globals->_player, &scene->_object2, &scene->_object1, NULL);
}
break;
default:
@@ -909,8 +912,8 @@ void Scene9450::signal() {
setAction(&_sequenceManager1, this, 9457, &_object2, &_object1, &_object3, NULL);
break;
case 9451:
- if (_globals->getFlag(87)) {
- _globals->_player.enableControl();
+ if (g_globals->getFlag(87)) {
+ g_globals->_player.enableControl();
} else {
_sceneMode = 1001;
if (_object2._action)
@@ -925,20 +928,20 @@ void Scene9450::signal() {
setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL);
break;
case 9453:
- _globals->_sceneManager.changeScene(9360);
+ g_globals->_sceneManager.changeScene(9360);
break;
case 9459:
RING_INVENTORY._tunic._sceneNumber = 1;
_object2.signal();
- _globals->_player.enableControl();
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.enableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
_hotspot1.remove();
break;
case 1006:
- _globals->setFlag(87);
+ g_globals->setFlag(87);
// No break on purpose
default:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -947,14 +950,14 @@ void Scene9450::dispatch() {
if (_action) {
_action->dispatch();
} else {
- if ((_globals->_player._position.y < 98) && (_globals->_player._position.x > 241) && (_globals->_player._position.x < 282)) {
- _globals->_player.disableControl();
+ if ((g_globals->_player._position.y < 98) && (g_globals->_player._position.x > 241) && (g_globals->_player._position.x < 282)) {
+ g_globals->_player.disableControl();
_sceneMode = 9452;
- setAction(&_sequenceManager1, this, 9452, &_globals->_player, NULL);
- } else if ((_globals->_player._position.y < 99) && (_globals->_player._position.x > 68) && (_globals->_player._position.x < 103)) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager1, this, 9452, &g_globals->_player, NULL);
+ } else if ((g_globals->_player._position.y < 99) && (g_globals->_player._position.x > 68) && (g_globals->_player._position.x < 103)) {
+ g_globals->_player.disableControl();
_sceneMode = 9453;
- setAction(&_sequenceManager1, this, 9453, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, 9453, &g_globals->_player, NULL);
}
}
}
@@ -962,18 +965,18 @@ void Scene9450::dispatch() {
void Scene9450::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(84, 75, 167, 150);
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.postInit();
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.postInit();
_object2.postInit();
_object1.postInit();
_object1.hide();
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9451;
- setAction(&_sequenceManager1, this, 9451, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, 9451, &g_globals->_player, NULL);
- if (_globals->getFlag(87)) {
+ if (g_globals->getFlag(87)) {
if (RING_INVENTORY._tunic._sceneNumber == 1) {
_object2.signal();
} else {
@@ -990,23 +993,23 @@ void Scene9450::postInit(SceneObjectList *OwnerList) {
}
if (RING_INVENTORY._tunic._sceneNumber != 1)
- _hotspot1.setup(123, 139, 138, 170, 9450, 37, -1);
-
- _hotspot2.setup(153, 102, 176, 141, 9450, 39, 40);
- _hotspot3.setup(97, 198, 130, 229, 9450, 41, 42);
- _hotspot15.setup(131, 190, 145, 212, 9450, 43, 44);
- _hotspot4.setup(33, 144, 105, 192, 9450, 0, 1);
- _hotspot5.setup(20, 236, 106, 287, 9450, 2, 3);
- _hotspot6.setup(137, 119, 195, 320, 9450, 4, 5);
- _hotspot7.setup(20, 59, 99, 111, 9450, 6, -1);
- _hotspot8.setup(110, 0, 199, 117, 9450, 7, 8);
- _hotspot9.setup(101, 104, 130, 174, 9450, 9, 10);
- _hotspot10.setup(110, 246, 149, 319, 9450, 11, 12);
- _hotspot11.setup(16, 34, 74, 62, 6450, 13, 14);
- _hotspot12.setup(19, 108, 72, 134, 9450, 15, 16);
- _hotspot13.setup(18, 215, 71, 237, 9450, 17, 18);
- _hotspot14.setup(15, 288, 76, 314, 9450, 19, 20);
- _hotspot16.setup(0, 0, 200, 320, 9450, 46, -1);
+ _hotspot1.setDetails(123, 139, 138, 170, 9450, 37, -1);
+
+ _hotspot2.setDetails(153, 102, 176, 141, 9450, 39, 40);
+ _hotspot3.setDetails(97, 198, 130, 229, 9450, 41, 42);
+ _hotspot15.setDetails(131, 190, 145, 212, 9450, 43, 44);
+ _hotspot4.setDetails(33, 144, 105, 192, 9450, 0, 1);
+ _hotspot5.setDetails(20, 236, 106, 287, 9450, 2, 3);
+ _hotspot6.setDetails(137, 119, 195, 320, 9450, 4, 5);
+ _hotspot7.setDetails(20, 59, 99, 111, 9450, 6, -1);
+ _hotspot8.setDetails(110, 0, 199, 117, 9450, 7, 8);
+ _hotspot9.setDetails(101, 104, 130, 174, 9450, 9, 10);
+ _hotspot10.setDetails(110, 246, 149, 319, 9450, 11, 12);
+ _hotspot11.setDetails(16, 34, 74, 62, 6450, 13, 14);
+ _hotspot12.setDetails(19, 108, 72, 134, 9450, 15, 16);
+ _hotspot13.setDetails(18, 215, 71, 237, 9450, 17, 18);
+ _hotspot14.setDetails(15, 288, 76, 314, 9450, 19, 20);
+ _hotspot16.setDetails(0, 0, 200, 320, 9450, 46, -1);
}
/*--------------------------------------------------------------------------
@@ -1014,67 +1017,67 @@ void Scene9450::postInit(SceneObjectList *OwnerList) {
*
*--------------------------------------------------------------------------*/
void Scene9500::Hotspot1::doAction(int action) {
- Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+ Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene;
if (action == OBJECT_SWORD) {
scene->_sceneMode = 9510;
- _globals->setFlag(92);
+ g_globals->setFlag(92);
RING_INVENTORY._sword._sceneNumber = 9500;
- _globals->_player.disableControl();
- _globals->_sceneItems.remove(this);
- scene->_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
- scene->setAction(&scene->_sequenceManager, scene, 9510, &_globals->_player, &scene->_object2, NULL);
+ g_globals->_player.disableControl();
+ g_globals->_sceneItems.remove(this);
+ scene->_hotspot2.setDetails(87, 294, 104, 314, 9400, 17, -1);
+ scene->setAction(&scene->_sequenceManager, scene, 9510, &g_globals->_player, &scene->_object2, NULL);
} else {
NamedHotspot::doAction(action);
}
}
void Scene9500::Hotspot2::doAction(int action) {
- Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+ Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene;
if (action == CURSOR_USE) {
scene->_sceneMode = 9511;
- _globals->_player.disableControl();
- _globals->_sceneItems.remove(this);
- scene->setAction(&scene->_sequenceManager, scene, 9511, &_globals->_player, &scene->_object2, NULL);
+ g_globals->_player.disableControl();
+ g_globals->_sceneItems.remove(this);
+ scene->setAction(&scene->_sequenceManager, scene, 9511, &g_globals->_player, &scene->_object2, NULL);
} else {
NamedHotspot::doAction(action);
}
}
void Scene9500::Hotspot3::doAction(int action) {
- Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+ Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene;
if ((action == CURSOR_USE) && (RING_INVENTORY._candle._sceneNumber != 1)){
scene->_sceneMode = 9505;
- _globals->_player.disableControl();
- _globals->_sceneItems.remove(this);
- scene->setAction(&scene->_sequenceManager, scene, 9505, &_globals->_player, &scene->_candle, NULL);
+ g_globals->_player.disableControl();
+ g_globals->_sceneItems.remove(this);
+ scene->setAction(&scene->_sequenceManager, scene, 9505, &g_globals->_player, &scene->_candle, NULL);
} else {
NamedHotspot::doAction(action);
}
}
void Scene9500::Hotspot4::doAction(int action) {
- Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+ Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene;
if (action == OBJECT_CANDLE) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (RING_INVENTORY._straw._sceneNumber == 9500) {
scene->_sceneMode = 9506;
- _globals->_sceneItems.remove(&scene->_hotspot5);
- _globals->_sceneItems.remove(this);
- scene->setAction(&scene->_sequenceManager, scene, 9506, &_globals->_player, &scene->_object3, NULL);
+ g_globals->_sceneItems.remove(&scene->_hotspot5);
+ g_globals->_sceneItems.remove(this);
+ scene->setAction(&scene->_sequenceManager, scene, 9506, &g_globals->_player, &scene->_object3, NULL);
RING_INVENTORY._candle._sceneNumber = 9850;
} else {
scene->_sceneMode = 9507;
- scene->setAction(&scene->_sequenceManager, scene, 9507, &_globals->_player, &scene->_object3, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9507, &g_globals->_player, &scene->_object3, NULL);
}
} else if (action == OBJECT_STRAW) {
scene->_sceneMode = 9512;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
RING_INVENTORY._straw._sceneNumber = 9500;
- scene->setAction(&scene->_sequenceManager, scene, 9512, &_globals->_player, &scene->_object3, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9512, &g_globals->_player, &scene->_object3, NULL);
} else {
NamedHotspot::doAction(action);
}
@@ -1083,35 +1086,35 @@ void Scene9500::Hotspot4::doAction(int action) {
void Scene9500::signal() {
switch (_sceneMode) {
case 9503:
- _globals->_sceneManager.changeScene(9200);
- _globals->_soundHandler.play(295);
+ g_globals->_sceneManager.changeScene(9200);
+ g_globals->_soundHandler.play(295);
break;
case 9504:
- _globals->_sceneManager.changeScene(9850);
+ g_globals->_sceneManager.changeScene(9850);
break;
case 9505:
_candle.setStrip(2);
RING_INVENTORY._candle._sceneNumber = 1;
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 9506:
- _globals->setFlag(85);
- _globals->_player.enableControl();
+ g_globals->setFlag(85);
+ g_globals->_player.enableControl();
break;
case 9511:
RING_INVENTORY._helmet._sceneNumber = 1;
- _globals->_player.enableControl();
- if (!_globals->getFlag(51)) {
- _globals->setFlag(51);
- _globals->_player.disableControl();
+ g_globals->_player.enableControl();
+ if (!g_globals->getFlag(51)) {
+ g_globals->setFlag(51);
+ g_globals->_player.disableControl();
_sceneMode = 9514;
- setAction(&_sequenceManager, this, 9514, &_globals->_player, NULL, NULL, NULL, NULL);
+ setAction(&_sequenceManager, this, 9514, &g_globals->_player, NULL, NULL, NULL, NULL);
}
break;
case 0:
case 9514:
default:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -1120,14 +1123,14 @@ void Scene9500::dispatch() {
if (_action) {
_action->dispatch();
} else {
- if (_globals->_player._position.y >= 199) {
- _globals->_player.disableControl();
+ if (g_globals->_player._position.y >= 199) {
+ g_globals->_player.disableControl();
_sceneMode = 9503;
- setAction(&_sequenceManager, this, 9503, &_globals->_player, NULL, NULL, NULL, NULL);
- } else if (_globals->_player._position.y < 127) {
- _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 9503, &g_globals->_player, NULL, NULL, NULL, NULL);
+ } else if (g_globals->_player._position.y < 127) {
+ g_globals->_player.disableControl();
_sceneMode = 9504;
- setAction(&_sequenceManager, this, 9504, &_globals->_player, NULL, NULL, NULL, NULL);
+ setAction(&_sequenceManager, this, 9504, &g_globals->_player, NULL, NULL, NULL, NULL);
}
}
@@ -1141,8 +1144,8 @@ void Scene9500::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(110, 75, 200, 150);
- _globals->_player.postInit();
- _globals->_soundHandler.play(305);
+ g_globals->_player.postInit();
+ g_globals->_soundHandler.play(305);
_candle.postInit();
_candle.setVisage(9500);
@@ -1162,7 +1165,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) {
_object3._strip = 2;
_object3._frame = 9;
_object3.setPosition(Common::Point(168, 128));
- if (_globals->getFlag(85)) {
+ if (g_globals->getFlag(85)) {
_object3.setVisage(9500);
_object3.setStrip(4);
_object3.animate(ANIM_MODE_8, 0, NULL);
@@ -1172,61 +1175,61 @@ void Scene9500::postInit(SceneObjectList *OwnerList) {
_object2.postInit();
_object2.hide();
- if (_globals->getFlag(92)) {
+ if (g_globals->getFlag(92)) {
_object2.show();
_object2.setVisage(9501);
_object2.setStrip(1);
_object2.setFrame(_object2.getFrameCount());
_object2.setPosition(Common::Point(303, 130));
_object2.fixPriority(132);
- if (RING_INVENTORY._helmet._sceneNumber == 1) {
- _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
+ if (RING_INVENTORY._helmet._sceneNumber != 1) {
+ _hotspot2.setDetails(87, 294, 104, 314, 9400, 17, -1);
} else {
_object2.setStrip(2);
_object2.setFrame(1);
}
} else {
- _hotspot1.setup(105, 295, 134, 313, 9500, 9, 10);
+ _hotspot1.setDetails(105, 295, 134, 313, 9500, 9, 10);
}
- _hotspot17.setup(101, 293, 135, 315, 9500, 9, 10);
- _hotspot3.setup(84, 12, 107, 47, 9500, 15, 15);
- _hotspot6.setup(93, 11, 167, 46, 9500, 0, 1);
- _hotspot7.setup(100, 70, 125, 139, 9500, 2, 3);
+ _hotspot17.setDetails(101, 293, 135, 315, 9500, 9, 10);
+ _hotspot3.setDetails(84, 12, 107, 47, 9500, 15, 15);
+ _hotspot6.setDetails(93, 11, 167, 46, 9500, 0, 1);
+ _hotspot7.setDetails(100, 70, 125, 139, 9500, 2, 3);
- if (!_globals->getFlag(85)) {
- _hotspot5.setup(111, 68, 155, 244, 9500, 17, -1);
- _hotspot4.setup(57, 71, 120, 126, 9500, 16, -1);
+ if (!g_globals->getFlag(85)) {
+ _hotspot5.setDetails(111, 68, 155, 244, 9500, 17, -1);
+ _hotspot4.setDetails(57, 71, 120, 126, 9500, 16, -1);
}
- _hotspot8.setup(60, 24, 90, 53, 9500, 4, 5);
- _hotspot9.setup(72, 143, 93, 163, 9500, 4, 5);
- _hotspot10.setup(70, 205, 92, 228, 9500, 4, 5);
- _hotspot11.setup(66, 291, 90, 317, 9500, 4, 5);
- _hotspot12.setup(22, 58, 101, 145, 9500, 6, 7);
- _hotspot13.setup(121, 57, 163, 249, 9500, 6, 7);
- _hotspot14.setup(115, 133, 135, 252, 9500, 6, 7);
- _hotspot15.setup(55, 240, 125, 254, 9500, 6, 7);
- _hotspot16.setup(53, 251, 132, 288, 9500, 8, -1);
- _hotspot19.setup(101, 207, 120, 225, 9500, 9, 10);
- _hotspot18.setup(98, 144, 117, 162, 9500, 9, 10);
- _hotspot20.setup(102, 27, 132, 50, 9500, 9, 10);
+ _hotspot8.setDetails(60, 24, 90, 53, 9500, 4, 5);
+ _hotspot9.setDetails(72, 143, 93, 163, 9500, 4, 5);
+ _hotspot10.setDetails(70, 205, 92, 228, 9500, 4, 5);
+ _hotspot11.setDetails(66, 291, 90, 317, 9500, 4, 5);
+ _hotspot12.setDetails(22, 58, 101, 145, 9500, 6, 7);
+ _hotspot13.setDetails(121, 57, 163, 249, 9500, 6, 7);
+ _hotspot14.setDetails(115, 133, 135, 252, 9500, 6, 7);
+ _hotspot15.setDetails(55, 240, 125, 254, 9500, 6, 7);
+ _hotspot16.setDetails(53, 251, 132, 288, 9500, 8, -1);
+ _hotspot19.setDetails(101, 207, 120, 225, 9500, 9, 10);
+ _hotspot18.setDetails(98, 144, 117, 162, 9500, 9, 10);
+ _hotspot20.setDetails(102, 27, 132, 50, 9500, 9, 10);
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.disableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.disableControl();
- if ((_globals->_sceneManager._previousScene == 9200) || (_globals->_sceneManager._previousScene != 9850)) {
+ if ((g_globals->_sceneManager._previousScene == 9200) || (g_globals->_sceneManager._previousScene != 9850)) {
_sceneMode = 0;
if (RING_INVENTORY._helmet._sceneNumber != 1) {
- setAction(&_sequenceManager, this, 9501, &_globals->_player, &_candle, NULL);
+ setAction(&_sequenceManager, this, 9501, &g_globals->_player, &_candle, NULL);
} else {
RING_INVENTORY._helmet._sceneNumber = 9500;
- _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
- setAction(&_sequenceManager, this, 9513, &_globals->_player, &_object2, NULL);
+ _hotspot2.setDetails(87, 294, 104, 314, 9400, 17, -1);
+ setAction(&_sequenceManager, this, 9513, &g_globals->_player, &_object2, NULL);
}
} else {
_sceneMode = 0;
- setAction(&_sequenceManager, this, 9502, &_globals->_player, &_candle, NULL);
+ setAction(&_sequenceManager, this, 9502, &g_globals->_player, &_candle, NULL);
}
}
@@ -1237,7 +1240,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) {
void Scene9700::signal() {
switch (_sceneMode ++) {
case 9703:
- _globals->setFlag(88);
+ g_globals->setFlag(88);
// No break on purpose
case 9701:
case 9702:
@@ -1245,13 +1248,13 @@ void Scene9700::signal() {
_gfxButton1._bounds.center(50, 190);
_gfxButton1.draw();
_gfxButton1._bounds.expandPanes();
- _globals->_player.enableControl();
- _globals->_player._canWalk = false;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player.enableControl();
+ g_globals->_player._canWalk = false;
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 9704:
- _globals->_soundHandler.play(323);
- _globals->_sceneManager.changeScene(9750);
+ g_globals->_soundHandler.play(323);
+ g_globals->_sceneManager.changeScene(9750);
break;
}
}
@@ -1260,17 +1263,17 @@ void Scene9700::process(Event &event) {
Scene::process(event);
if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) {
if (_gfxButton1.process(event)) {
- _globals->_sceneManager.changeScene(9200);
- } else if (_globals->_events._currentCursor == OBJECT_SCANNER) {
+ g_globals->_sceneManager.changeScene(9200);
+ } else if (g_globals->_events._currentCursor == OBJECT_SCANNER) {
event.handled = true;
if (RING_INVENTORY._helmet._sceneNumber == 1) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9704;
- setAction(&_sequenceManager, this, 9704, &_globals->_player, &_object1, NULL);
+ setAction(&_sequenceManager, this, 9704, &g_globals->_player, &_object1, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9703;
- setAction(&_sequenceManager, this, 9703, &_globals->_player, &_object1, NULL);
+ setAction(&_sequenceManager, this, 9703, &g_globals->_player, &_object1, NULL);
}
}
}
@@ -1280,25 +1283,25 @@ void Scene9700::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _sceneHotspot1.setup(84, 218, 151, 278, 9700, 14, -1);
- _sceneHotspot2.setup(89, 11, 151, 121, 9700, 14, -1);
- _sceneHotspot3.setup(69, 119, 138, 216, 9700, 15, 16);
- _sceneHotspot4.setup(34, 13, 88, 116, 9700, 17, -1);
- _sceneHotspot5.setup(52, 119, 68, 204, 9700, 17, -1);
- _sceneHotspot6.setup(0, 22, 56, 275, 9700, 18, -1);
+ _sceneHotspot1.setDetails(84, 218, 151, 278, 9700, 14, -1);
+ _sceneHotspot2.setDetails(89, 11, 151, 121, 9700, 14, -1);
+ _sceneHotspot3.setDetails(69, 119, 138, 216, 9700, 15, 16);
+ _sceneHotspot4.setDetails(34, 13, 88, 116, 9700, 17, -1);
+ _sceneHotspot5.setDetails(52, 119, 68, 204, 9700, 17, -1);
+ _sceneHotspot6.setDetails(0, 22, 56, 275, 9700, 18, -1);
_object1.postInit();
_object1.hide();
- _globals->_player.postInit();
- if (!_globals->getFlag(97)) {
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ if (!g_globals->getFlag(97)) {
+ g_globals->_player.disableControl();
_sceneMode = 9701;
- setAction(&_sequenceManager, this, 9701, &_globals->_player, &_object1, NULL);
- _globals->setFlag(97);
+ setAction(&_sequenceManager, this, 9701, &g_globals->_player, &_object1, NULL);
+ g_globals->setFlag(97);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9702;
- setAction(&_sequenceManager, this, 9702, &_globals->_player, &_object1, NULL);
+ setAction(&_sequenceManager, this, 9702, &g_globals->_player, &_object1, NULL);
}
}
@@ -1309,10 +1312,10 @@ void Scene9700::postInit(SceneObjectList *OwnerList) {
void Scene9750::signal() {
switch (_sceneMode ++) {
case 9751:
- _globals->_soundHandler.fadeOut(this);
+ g_globals->_soundHandler.fadeOut(this);
break;
case 9752:
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_sceneManager.changeScene(2100);
default:
break;
}
@@ -1327,14 +1330,14 @@ void Scene9750::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _globals->_player.postInit();
+ g_globals->_player.postInit();
_object1.postInit();
_object1.hide();
_object2.postInit();
_object2.hide();
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9751;
- setAction(&_sequenceManager, this, 9751, &_globals->_player, &_object1, &_object2, NULL);
+ setAction(&_sequenceManager, this, 9751, &g_globals->_player, &_object1, &_object2, NULL);
}
@@ -1369,19 +1372,19 @@ void Scene9850::Object7::doAction(int action) {
// Hair covered tunic
void Scene9850::Hotspot12::doAction(int action) {
- Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+ Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene;
if (action == CURSOR_USE) {
if (RING_INVENTORY._tunic2._sceneNumber != 1) {
RING_INVENTORY._tunic2._sceneNumber = 1;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 9858;
- scene->setAction(&scene->_sequenceManager, scene, 9858, &_globals->_player, &scene->_objTunic2, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9858, &g_globals->_player, &scene->_objTunic2, NULL);
} else {
RING_INVENTORY._tunic2._sceneNumber = 9850;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 9861;
- scene->setAction(&scene->_sequenceManager, scene, 9861, &_globals->_player, &scene->_objTunic2, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9861, &g_globals->_player, &scene->_objTunic2, NULL);
}
} else if ((action != CURSOR_LOOK) || (RING_INVENTORY._tunic2._sceneNumber != 1)) {
NamedHotspot::doAction(action);
@@ -1391,19 +1394,19 @@ void Scene9850::Hotspot12::doAction(int action) {
}
void Scene9850::Hotspot14::doAction(int action) {
- Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+ Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene;
if (action == CURSOR_USE) {
if (RING_INVENTORY._jacket._sceneNumber != 1) {
RING_INVENTORY._jacket._sceneNumber = 1;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 9857;
- scene->setAction(&scene->_sequenceManager, scene, 9857, &_globals->_player, &scene->_objJacket, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9857, &g_globals->_player, &scene->_objJacket, NULL);
} else {
RING_INVENTORY._jacket._sceneNumber = 9850;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 9860;
- scene->setAction(&scene->_sequenceManager, scene, 9860, &_globals->_player, &scene->_objJacket, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9860, &g_globals->_player, &scene->_objJacket, NULL);
}
} else if ((action != CURSOR_LOOK) || (RING_INVENTORY._jacket._sceneNumber != 1)) {
NamedHotspot::doAction(action);
@@ -1413,19 +1416,19 @@ void Scene9850::Hotspot14::doAction(int action) {
}
void Scene9850::Hotspot16::doAction(int action) {
- Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+ Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene;
if (action == CURSOR_USE) {
if (RING_INVENTORY._cloak._sceneNumber != 1) {
RING_INVENTORY._cloak._sceneNumber = 1;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 9862;
- scene->setAction(&scene->_sequenceManager, scene, 9862, &_globals->_player, &scene->_objCloak, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9862, &g_globals->_player, &scene->_objCloak, NULL);
} else {
RING_INVENTORY._cloak._sceneNumber = 9850;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 9859;
- scene->setAction(&scene->_sequenceManager, scene, 9859, &_globals->_player, &scene->_objCloak, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 9859, &g_globals->_player, &scene->_objCloak, NULL);
}
} else if ((action != CURSOR_LOOK) || (RING_INVENTORY._cloak._sceneNumber != 1)) {
NamedHotspot::doAction(action);
@@ -1435,7 +1438,7 @@ void Scene9850::Hotspot16::doAction(int action) {
}
void Scene9850::Hotspot17::doAction(int action) {
- Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+ Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene;
if (action == OBJECT_SCANNER) {
SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
@@ -1447,7 +1450,7 @@ void Scene9850::Hotspot17::doAction(int action) {
}
void Scene9850::Hotspot18::doAction(int action) {
- Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+ Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene;
if (action == OBJECT_SCANNER) {
SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
@@ -1459,7 +1462,7 @@ void Scene9850::Hotspot18::doAction(int action) {
}
void Scene9850::Hotspot19::doAction(int action) {
- Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+ Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene;
if (action == OBJECT_SCANNER) {
SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
@@ -1472,20 +1475,20 @@ void Scene9850::Hotspot19::doAction(int action) {
// Arrow on Statue
void Scene9850::Hotspot20::doAction(int action) {
- Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+ Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene;
if (action == CURSOR_USE) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (scene->_objSword._state == 0) {
if (RING_INVENTORY._scimitar._sceneNumber == 9850)
scene->_objScimitar.show();
if (RING_INVENTORY._sword._sceneNumber == 9850)
scene->_objSword.show();
scene->_sceneMode = 11;
- setAction(&scene->_sequenceManager, scene, 9853, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
+ setAction(&scene->_sequenceManager, scene, 9853, &g_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
} else {
scene->_sceneMode = 10;
- setAction(&scene->_sequenceManager, scene, 9854, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
+ setAction(&scene->_sequenceManager, scene, 9854, &g_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
}
scene->_objSword._state ^= 1;
} else {
@@ -1501,26 +1504,26 @@ void Scene9850::signal() {
_objScimitar.hide();
if (RING_INVENTORY._sword._sceneNumber == 9850)
_objSword.hide();
- _globals->_sceneItems.remove(&_objScimitar);
- _globals->_sceneItems.remove(&_objSword);
- _globals->_sceneItems.addItems(&_hotspot19, NULL);
- _globals->_player.enableControl();
+ g_globals->_sceneItems.remove(&_objScimitar);
+ g_globals->_sceneItems.remove(&_objSword);
+ g_globals->_sceneItems.addItems(&_hotspot19, NULL);
+ g_globals->_player.enableControl();
break;
case 11:
// Hidden closet opened
if (RING_INVENTORY._scimitar._sceneNumber == 9850)
- _globals->_sceneItems.addItems(&_objScimitar, NULL);
+ g_globals->_sceneItems.addItems(&_objScimitar, NULL);
if (RING_INVENTORY._sword._sceneNumber == 9850)
- _globals->_sceneItems.addItems(&_objSword, NULL);
- _globals->_sceneItems.remove(&_hotspot19);
- _globals->_player.enableControl();
+ g_globals->_sceneItems.addItems(&_objSword, NULL);
+ g_globals->_sceneItems.remove(&_hotspot19);
+ g_globals->_player.enableControl();
break;
case 9500:
- _globals->_sceneManager.changeScene(_sceneMode - 1);
+ g_globals->_sceneManager.changeScene(_sceneMode - 1);
break;
case 0:
default:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -1529,7 +1532,7 @@ void Scene9850::process(Event &event) {
Scene::process(event);
if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_4)) {
event.handled = true;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (_objSword._state == 0) {
_sceneMode = 0;
setAction(&_sequenceManager, this, 9853, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL);
@@ -1544,10 +1547,10 @@ void Scene9850::process(Event &event) {
void Scene9850::dispatch() {
if (_action) {
_action->dispatch();
- } else if (_globals->_player._position.y >= 198) {
- _globals->_player.disableControl();
+ } else if (g_globals->_player._position.y >= 198) {
+ g_globals->_player.disableControl();
_sceneMode = 9500;
- setAction(&_sequenceManager, this, 9852, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 9852, &g_globals->_player, NULL);
}
}
@@ -1615,31 +1618,31 @@ void Scene9850::postInit(SceneObjectList *OwnerList) {
_objSword.hide();
}
- _spotLever.setup(30, 251, 45, 270, 9850, 26, -1);
- _hotspot1.setup(123, 0, 200, 320, 9850, 0, 1);
- _hotspot2.setup(107, 87, 133, 308, 9850, 0, 1);
- _hotspot3.setup(2, 28, 53, 80, 9850, 2, 3);
- _hotspot4.setup(13, 0, 55, 27, 9850, 2, 3);
- _hotspot5.setup(8, 74, 27, 91, 9850, 4, 5);
- _hotspot17.setup(61, 0, 125, 28, 9850, 6, 7);
- _hotspot18.setup(51, 95, 105, 145, 9850, 6, 7);
- _hotspot19.setup(56, 28, 115, 97, 9850, 6, 8);
- _hotspot6.setup(0, 223, 115, 257, 9850, 9, 10);
- _hotspot7.setup(15, 254, 33, 268, 9850, 9, -1);
- _hotspot8.setup(17, 218, 37, 233, 9850, 9, 10);
- _hotspot9.setup(8, 113, 26, 221, 9850, 11, 12);
- _hotspot10.setup(14, 94, 53, 112, 9850, 13, 14);
- _hotspot11.setup(5, 269, 29, 303, 9850, 15, 16);
- _hotspot12.setup(43, 278, 91, 317, 9850, 17, 18);
- _hotspot13.setup(47, 263, 112, 282, 9850, 19, 20);
- _hotspot14.setup(43, 188, 86, 224, 9850, 21, 22);
- _hotspot15.setup(43, 162, 92, 191, 9850, 23, 24);
- _hotspot16.setup(40, 146, 90, 169, 9850, 25, -1);
-
- _globals->_player.postInit();
- _globals->_player.disableControl();
+ _spotLever.setDetails(30, 251, 45, 270, 9850, 26, -1);
+ _hotspot1.setDetails(123, 0, 200, 320, 9850, 0, 1);
+ _hotspot2.setDetails(107, 87, 133, 308, 9850, 0, 1);
+ _hotspot3.setDetails(2, 28, 53, 80, 9850, 2, 3);
+ _hotspot4.setDetails(13, 0, 55, 27, 9850, 2, 3);
+ _hotspot5.setDetails(8, 74, 27, 91, 9850, 4, 5);
+ _hotspot17.setDetails(61, 0, 125, 28, 9850, 6, 7);
+ _hotspot18.setDetails(51, 95, 105, 145, 9850, 6, 7);
+ _hotspot19.setDetails(56, 28, 115, 97, 9850, 6, 8);
+ _hotspot6.setDetails(0, 223, 115, 257, 9850, 9, 10);
+ _hotspot7.setDetails(15, 254, 33, 268, 9850, 9, -1);
+ _hotspot8.setDetails(17, 218, 37, 233, 9850, 9, 10);
+ _hotspot9.setDetails(8, 113, 26, 221, 9850, 11, 12);
+ _hotspot10.setDetails(14, 94, 53, 112, 9850, 13, 14);
+ _hotspot11.setDetails(5, 269, 29, 303, 9850, 15, 16);
+ _hotspot12.setDetails(43, 278, 91, 317, 9850, 17, 18);
+ _hotspot13.setDetails(47, 263, 112, 282, 9850, 19, 20);
+ _hotspot14.setDetails(43, 188, 86, 224, 9850, 21, 22);
+ _hotspot15.setDetails(43, 162, 92, 191, 9850, 23, 24);
+ _hotspot16.setDetails(40, 146, 90, 169, 9850, 25, -1);
+
+ g_globals->_player.postInit();
+ g_globals->_player.disableControl();
_sceneMode = 0;
- setAction(&_sequenceManager, this, 9851, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 9851, &g_globals->_player, NULL);
}
/*--------------------------------------------------------------------------
@@ -1650,7 +1653,7 @@ void Scene9900::strAction1::signal() {
const byte mask1[3] = {0xff, 0xff, 0xff};
const byte mask2[3] = {0, 0, 0};
- Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene;
+ Scene9900 *scene = (Scene9900 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1662,23 +1665,23 @@ void Scene9900::strAction1::signal() {
_object9.fixPriority(250);
_object9.setPosition(Common::Point(171, 59));
_object9.animate(ANIM_MODE_5, NULL);
- _globals->_scenePalette.addRotation(67, 111, 1, 1, this);
+ g_globals->_scenePalette.addRotation(67, 111, 1, 1, this);
scene->_object2.hide();
break;
case 1:
_palette1.getPalette();
- _globals->_scenePalette.addFader(&mask1[0], 1, 10, this);
+ g_globals->_scenePalette.addFader(&mask1[0], 1, 10, this);
break;
case 2:
_object9.remove();
- _globals->_scenePalette.addFader(&mask2[0], 1, 5, this);
+ g_globals->_scenePalette.addFader(&mask2[0], 1, 5, this);
break;
case 3:
- _globals->_soundHandler.play(377);
+ g_globals->_soundHandler.play(377);
setDelay(120);
break;
case 4:
- _globals->_scenePalette.addFader(_palette1._palette, 256, 1, this);
+ g_globals->_scenePalette.addFader(_palette1._palette, 256, 1, this);
break;
case 5:
remove();
@@ -1700,7 +1703,7 @@ void Scene9900::strAction2::signal() {
_var3 = 0;
// No break on purpose
case 1: {
- Common::String msg = _resourceManager->getMessage(8030, _lineNum++);
+ Common::String msg = g_resourceManager->getMessage(8030, _lineNum++);
if (msg.compareTo("LASTCREDIT")) {
if (_var3) {
// Not used?
@@ -1738,7 +1741,7 @@ void Scene9900::strAction2::signal() {
_txtArray2[_txtArray1Index]._fontNumber = 2;
_txtArray2[_txtArray1Index]._color1 = 23;
- msg = _resourceManager->getMessage(8030, _lineNum++);
+ msg = g_resourceManager->getMessage(8030, _lineNum++);
_txtArray2[_txtArray1Index].setup(msg);
_txtArray2[_txtArray1Index]._moveRate = 20;
_txtArray2[_txtArray1Index]._moveDiff.y = 2;
@@ -1746,7 +1749,8 @@ void Scene9900::strAction2::signal() {
frameWidth = _txtArray2[_txtArray1Index].getFrame().getBounds().width();
_txtArray2[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200 + frameHeight));
} else {
- _globals->_player.enableControl();
+ // WORKAROUND: Fix inventory becoming available at end of credits
+ g_globals->_events.setCursor(CURSOR_WALK);
_actionIndex = 3;
signal();
}
@@ -1801,21 +1805,21 @@ void Scene9900::strAction3::signal() {
case 0:
_palette2.getPalette();
_palette3.loadPalette(2003);
- _globals->_scenePalette.addFader(_palette3._palette, 256, 5, this);
+ g_globals->_scenePalette.addFader(_palette3._palette, 256, 5, this);
break;
case 1:
- _globals->_scenePalette.addFader(&mask3[0], 1, 10, this);
+ g_globals->_scenePalette.addFader(&mask3[0], 1, 10, this);
break;
case 2:
- _globals->_scenePalette.addFader(&mask4[0], 1, 1, this);
+ g_globals->_scenePalette.addFader(&mask4[0], 1, 1, this);
break;
case 3:
_palette2.loadPalette(17);
- _globals->_sceneManager._scene->loadScene(17);
- _globals->_scenePalette.addFader(_palette2._palette, 256, 5, this);
+ g_globals->_sceneManager._scene->loadScene(17);
+ g_globals->_scenePalette.addFader(_palette2._palette, 256, 5, this);
break;
case 4:
- _globals->_game->endGame(9900, 61);
+ g_globals->_game->endGame(9900, 61);
remove();
default:
break;
@@ -1855,40 +1859,40 @@ void Scene9900::signal() {
switch (_sceneMode){
case 150:
- _globals->_soundHandler.play(380);
+ g_globals->_soundHandler.play(380);
_object8.postInit();
_object8.setVisage(2002);
_object8.setStrip(1);
_object8.setFrame(1);
_object8.fixPriority(200);
_object8.setPosition(Common::Point(64, 199));
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9908;
setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 162:
warning("TBC: shutdown();");
- _globals->_game->quitGame();
+ g_globals->_game->quitGame();
break;
case 9901:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9906;
setAction(&_sequenceManager, this, 9906, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 9902:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9901;
setAction(&_sequenceManager, this, 9901, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 9903:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9902;
setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 9904:
- _globals->_soundHandler.play(390);
+ g_globals->_soundHandler.play(390);
_sceneMode = 9912;
setAction(&_strAction2, this);
break;
@@ -1898,50 +1902,50 @@ void Scene9900::signal() {
break;
case 9906:
if (_object8._state == 0) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9913;
setAction(&_sequenceManager, this, 9913, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9905;
setAction(&_sequenceManager, this, 9905, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
}
break;
case 9907:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9903;
setAction(&_sequenceManager, this, 9903, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 9908:
_object8.remove();
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9904;
setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 9909:
- _globals->_soundHandler.play(375);
- _globals->_player.disableControl();
+ g_globals->_soundHandler.play(375);
+ g_globals->_player.disableControl();
_sceneMode = 9907;
setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 9910:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9911;
setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 9911:
- _globals->_soundHandler.play(367);
- _globals->_player.disableControl();
+ g_globals->_soundHandler.play(367);
+ g_globals->_player.disableControl();
_sceneMode = 9909;
setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 9912:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9912;
setAction(&_sequenceManager, this, 9912, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
_sceneMode = 162;
- _globals->_player.enableControl();
- _globals->_player._canWalk = false;
+ g_globals->_player.enableControl();
+ g_globals->_player._canWalk = false;
break;
case 9913:
_sceneMode = 200;
@@ -1957,10 +1961,10 @@ void Scene9900::process(Event &event) {
return;
Scene::process(event);
if (_sceneMode == 9906) {
- if ((event.eventType == EVENT_BUTTON_DOWN) && (_globals->_events.getCursor() == OBJECT_ITEMS)) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (g_globals->_events.getCursor() == OBJECT_ITEMS)) {
_object8._state = 1;
RING_INVENTORY._items._sceneNumber = 9900;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
}
}
}
@@ -1992,7 +1996,7 @@ void Scene9900::postInit(SceneObjectList *OwnerList) {
RING_INVENTORY._items._description = Common::String("One of the items from the stasis ship. The other is on the Lance's bridge.");
_stripManager.addSpeaker(&_speakerMR);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 9910;
setAction(&_sequenceManager, this, 9910, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
}
@@ -2008,7 +2012,7 @@ void Scene9999::Action1::signal() {
setDelay(600);
break;
case 1:
- _globals->_sceneManager.changeScene(3500);
+ g_globals->_sceneManager.changeScene(3500);
break;
default:
break;
@@ -2027,8 +2031,8 @@ void Scene9999::Action2::signal() {
setDelay(300);
break;
case 2:
- _globals->_stripNum = 3600;
- _globals->_sceneManager.changeScene(3600);
+ g_globals->_stripNum = 3600;
+ g_globals->_sceneManager.changeScene(3600);
default:
break;
}
@@ -2044,14 +2048,14 @@ void Scene9999::postInit(SceneObjectList *OwnerList) {
_object1.setStrip2(3);
_object1.setPosition(Common::Point(160, 152));
- _globals->_player.postInit();
- _globals->_player.setVisage(1303);
- _globals->_player.setStrip2(1);
- _globals->_player.fixPriority(250);
- _globals->_player.animate(ANIM_MODE_2, NULL);
- _globals->_player.setPosition(Common::Point(194, 98));
- _globals->_player._numFrames = 20;
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(1303);
+ g_globals->_player.setStrip2(1);
+ g_globals->_player.fixPriority(250);
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player.setPosition(Common::Point(194, 98));
+ g_globals->_player._numFrames = 20;
+ g_globals->_player.disableControl();
_object2.postInit();
_object2.setVisage(1303);
@@ -2067,22 +2071,24 @@ void Scene9999::postInit(SceneObjectList *OwnerList) {
_object3.setPosition(Common::Point(292, 149));
_object3.setAction(&_action3);
- if (_globals->_sceneManager._previousScene == 3500)
+ if (g_globals->_sceneManager._previousScene == 3500)
setAction(&_action2);
else
setAction(&_action1);
- _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y);
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
- if (_globals->_sceneManager._previousScene == 3500)
- _globals->_stripNum = 2222;
+ if (g_globals->_sceneManager._previousScene == 3500)
+ g_globals->_stripNum = 2222;
else
- _globals->_stripNum = 2121;
+ g_globals->_stripNum = 2121;
- _globals->_soundHandler.play(118);
+ g_globals->_soundHandler.play(118);
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h
index 33b16d0014..0193d5af63 100644
--- a/engines/tsage/ringworld_scenes10.h
+++ b/engines/tsage/ringworld/ringworld_scenes10.h
@@ -24,13 +24,18 @@
#define TSAGE_RINGWORLD_SCENES10_H
#include "common/scummsys.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
#include "tsage/events.h"
#include "tsage/core.h"
#include "tsage/scenes.h"
#include "tsage/globals.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class SceneObject9150 : public SceneObject {
public:
@@ -75,12 +80,12 @@ public:
SceneObject _object4;
SceneObject _object5;
SceneObject _object6;
- SceneHotspot1 _sceneHotspot1;
- NamedHotspot _sceneHotspot2;
- NamedHotspot _sceneHotspot3;
- NamedHotspot _sceneHotspot4;
- NamedHotspot _sceneHotspot5;
- NamedHotspot _sceneHotspot6;
+ SceneHotspot1 _hotspotSlave;
+ NamedHotspot _hotspotSoiledClothes;
+ NamedHotspot _hotspotCleanedClothes;
+ NamedHotspot _hotspotIsland;
+ NamedHotspot _hotspotBoulders;
+ NamedHotspot _hotspotTrees;
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
@@ -526,7 +531,8 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
};
+} // End of namespace Ringworld
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_scenes2.cpp b/engines/tsage/ringworld/ringworld_scenes2.cpp
index 0154123c3d..e07c9253e6 100644
--- a/engines/tsage/ringworld_scenes2.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes2.cpp
@@ -21,12 +21,14 @@
*/
#include "common/config-manager.h"
-#include "tsage/ringworld_scenes2.h"
+#include "tsage/ringworld/ringworld_scenes2.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
/*--------------------------------------------------------------------------
* Scene 1000 - Title Screen
@@ -34,11 +36,11 @@ namespace tSage {
*--------------------------------------------------------------------------*/
void Scene1000::Action1::signal() {
- Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene;
+ Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(10);
break;
case 1:
@@ -61,7 +63,7 @@ void Scene1000::Action1::signal() {
break;
}
case 3:
- _globals->_sceneManager.changeScene(1400);
+ g_globals->_sceneManager.changeScene(1400);
break;
}
@@ -70,7 +72,7 @@ void Scene1000::Action1::signal() {
void Scene1000::Action2::signal() {
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(10);
break;
case 1:
@@ -80,7 +82,7 @@ void Scene1000::Action2::signal() {
break;
case 2:
SceneItem::display(0, 0);
- _globals->_sceneManager.changeScene(2000);
+ g_globals->_sceneManager.changeScene(2000);
break;
default:
break;
@@ -88,11 +90,11 @@ void Scene1000::Action2::signal() {
}
void Scene1000::Action3::signal() {
- Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene;
+ Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_sceneManager._scene->loadBackground(0, 0);
+ g_globals->_sceneManager._scene->loadBackground(0, 0);
setDelay(60);
break;
case 1: {
@@ -106,11 +108,11 @@ void Scene1000::Action3::signal() {
setDelay(60);
break;
case 4:
- _globals->_player.show();
+ g_globals->_player.show();
setDelay(240);
break;
case 5: {
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
const char *SEEN_INTRO = "seen_intro";
if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) {
@@ -121,31 +123,31 @@ void Scene1000::Action3::signal() {
setDelay(1);
} else {
// Prompt user for whether to start play or watch introduction
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {
_actionIndex = 20;
- _globals->_soundHandler.fadeOut(this);
+ g_globals->_soundHandler.fadeOut(this);
} else {
setDelay(1);
}
}
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
break;
}
case 6: {
scene->_object3.remove();
- _globals->_player.setStrip2(2);
+ g_globals->_player.setStrip2(2);
NpcMover *mover = new NpcMover();
Common::Point pt(480, 100);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 7:
- _globals->_scenePalette.loadPalette(1002);
- _globals->_scenePalette.refresh();
- _globals->_scenePalette.addRotation(80, 95, -1);
+ g_globals->_scenePalette.loadPalette(1002);
+ g_globals->_scenePalette.refresh();
+ g_globals->_scenePalette.addRotation(80, 95, -1);
scene->_object3.postInit();
scene->_object3.setVisage(1002);
scene->_object3.setStrip(1);
@@ -214,14 +216,14 @@ void Scene1000::Action3::signal() {
break;
case 18:
zoom(false);
- _globals->_scenePalette.clearListeners();
- _globals->_soundHandler.fadeOut(this);
+ g_globals->_scenePalette.clearListeners();
+ g_globals->_soundHandler.fadeOut(this);
break;
case 19:
- _globals->_sceneManager.changeScene(10);
+ g_globals->_sceneManager.changeScene(10);
break;
case 20:
- _globals->_sceneManager.changeScene(30);
+ g_globals->_sceneManager.changeScene(30);
break;
default:
break;
@@ -229,19 +231,19 @@ void Scene1000::Action3::signal() {
}
void Scene1000::Action3::zoom(bool up) {
- Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene;
+ Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene;
if (up) {
- while ((scene->_object3._percent < 100) && !_vm->shouldQuit()) {
+ while ((scene->_object3._percent < 100) && !g_vm->shouldQuit()) {
scene->_object3.changeZoom(MIN(scene->_object3._percent + 5, 100));
- _globals->_sceneObjects->draw();
- _globals->_events.delay(1);
+ g_globals->_sceneObjects->draw();
+ g_globals->_events.delay(1);
}
} else {
- while ((scene->_object3._percent > 0) && !_vm->shouldQuit()) {
+ while ((scene->_object3._percent > 0) && !g_vm->shouldQuit()) {
scene->_object3.changeZoom(MAX(scene->_object3._percent - 5, 0));
- _globals->_sceneObjects->draw();
- _globals->_events.delay(1);
+ g_globals->_sceneObjects->draw();
+ g_globals->_events.delay(1);
}
}
}
@@ -253,7 +255,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) {
setZoomPercents(0, 100, 200, 100);
loadScene(1000);
- if (_globals->_sceneManager._previousScene == 2000) {
+ if (g_globals->_sceneManager._previousScene == 2000) {
setZoomPercents(150, 10, 180, 100);
_object1.postInit();
_object1.setVisage(1001);
@@ -264,12 +266,12 @@ void Scene1000::postInit(SceneObjectList *OwnerList) {
setAction(&_action2);
- _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
- _globals->_soundHandler.play(114);
- } else if (_globals->_sceneManager._previousScene == 2222) {
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_soundHandler.play(114);
+ } else if (g_globals->_sceneManager._previousScene == 2222) {
setZoomPercents(150, 10, 180, 100);
_object1.postInit();
_object1.setVisage(1001);
@@ -278,28 +280,28 @@ void Scene1000::postInit(SceneObjectList *OwnerList) {
_object1._moveDiff = Common::Point(2, 2);
_object1.setPosition(Common::Point(120, 180));
- _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
setAction(&_action1);
} else {
- _globals->_soundHandler.play(4);
+ g_globals->_soundHandler.play(4);
setZoomPercents(0, 10, 30, 100);
_object3.postInit();
_object3.setVisage(1050);
_object3.changeZoom(-1);
_object3.setPosition(Common::Point(158, 0));
- _globals->_player.postInit();
- _globals->_player.setVisage(1050);
- _globals->_player.setStrip(3);
- _globals->_player.setPosition(Common::Point(160, 191));
- _globals->_player._moveDiff.x = 12;
- _globals->_player.hide();
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(1050);
+ g_globals->_player.setStrip(3);
+ g_globals->_player.setPosition(Common::Point(160, 191));
+ g_globals->_player._moveDiff.x = 12;
+ g_globals->_player.hide();
+ g_globals->_player.disableControl();
- _globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y);
+ g_globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y);
setAction(&_action3);
}
@@ -311,7 +313,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene1001::Action1::signal() {
- Scene1001 *scene = (Scene1001 *)_globals->_sceneManager._scene;
+ Scene1001 *scene = (Scene1001 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -476,9 +478,9 @@ void Scene1001::Action1::signal() {
setDelay(30);
break;
case 19: {
- _globals->_soundHandler.play(91);
+ g_globals->_soundHandler.play(91);
byte adjustData[4] = {0xff, 0xff, 0xff, 0};
- _globals->_scenePalette.fade(adjustData, false, 0);
+ g_globals->_scenePalette.fade(adjustData, false, 0);
scene->_object1._strip = 7;
scene->_object1._frame = 1;
@@ -488,8 +490,8 @@ void Scene1001::Action1::signal() {
break;
}
case 20:
- _globals->_scenePalette.loadPalette(16);
- _globals->_scenePalette.refresh();
+ g_globals->_scenePalette.loadPalette(16);
+ g_globals->_scenePalette.refresh();
setDelay(6);
break;
case 21:
@@ -497,14 +499,14 @@ void Scene1001::Action1::signal() {
scene->_object1.animate(ANIM_MODE_5, this);
break;
case 22:
- _globals->_soundHandler.play(92);
+ g_globals->_soundHandler.play(92);
scene->_stripManager.start(111, this);
break;
case 23:
setDelay(60);
break;
case 24:
- _globals->_sceneManager.changeScene(2000);
+ g_globals->_sceneManager.changeScene(2000);
break;
}
}
@@ -527,7 +529,7 @@ void Scene1001::postInit(SceneObjectList *OwnerList) {
_object3.setStrip2(4);
_object3.setPosition(Common::Point(61, 177));
- _globals->_soundHandler.play(85);
+ g_globals->_soundHandler.play(85);
setAction(&_action1);
}
@@ -538,11 +540,11 @@ void Scene1001::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene1250::Action1::signal() {
- Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+ Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(120) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(120) + 60);
break;
case 1:
scene->_object1.animate(ANIM_MODE_5, this);
@@ -552,11 +554,11 @@ void Scene1250::Action1::signal() {
}
void Scene1250::Action2::signal() {
- Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+ Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- switch (_globals->_randomSource.getRandomNumber(2)) {
+ switch (g_globals->_randomSource.getRandomNumber(2)) {
case 0:
scene->_object2.setPosition(Common::Point(163, 75));
break;
@@ -578,7 +580,7 @@ void Scene1250::Action2::signal() {
}
void Scene1250::Action3::signal() {
- Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+ Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -591,13 +593,13 @@ void Scene1250::Action3::signal() {
setDelay(6);
break;
case 3:
- _globals->_sceneManager.changeScene(1000);
+ g_globals->_sceneManager.changeScene(1000);
break;
}
}
void Scene1250::Action4::signal() {
- Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+ Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -610,7 +612,7 @@ void Scene1250::Action4::signal() {
setDelay(6);
break;
case 3:
- _globals->_sceneManager.changeScene(2000);
+ g_globals->_sceneManager.changeScene(2000);
break;
}
}
@@ -641,14 +643,14 @@ void Scene1250::postInit(SceneObjectList *OwnerList) {
_object2._frame = 1;
_object2.setAction(&_action2);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
- if ((_globals->_sceneManager._previousScene != 2000) || (_globals->_stripNum != 1250)) {
+ if ((g_globals->_sceneManager._previousScene != 2000) || (g_globals->_stripNum != 1250)) {
setAction(&_action4);
} else {
setAction(&_action3);
- _globals->_soundHandler.play(114);
+ g_globals->_soundHandler.play(114);
}
}
@@ -658,7 +660,7 @@ void Scene1250::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene1400::Action1::signal() {
- Scene1400 *scene = (Scene1400 *)_globals->_sceneManager._scene;
+ Scene1400 *scene = (Scene1400 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -669,23 +671,23 @@ void Scene1400::Action1::signal() {
Common::Point pt(160, 700);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2: {
- _globals->_player.setStrip2(3);
- _globals->_player.changeZoom(100);
+ g_globals->_player.setStrip2(3);
+ g_globals->_player.changeZoom(100);
Common::Point pt(160, 100);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
SceneItem::display(0, 0);
setDelay(360);
break;
}
case 3:
- SceneItem::display(1400, 2, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80,
+ SceneItem::display(1400, 2, SET_X, 60, SET_Y, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80,
SET_FONT, 2, SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
setDelay(420);
break;
@@ -694,7 +696,7 @@ void Scene1400::Action1::signal() {
setDelay(360);
break;
case 5:
- SceneItem::display(1400, 3, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80,
+ SceneItem::display(1400, 3, SET_X, 60, SET_Y, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80,
SET_FONT, 2, SET_FG_COLOR, 23, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
setDelay(360);
break;
@@ -702,25 +704,25 @@ void Scene1400::Action1::signal() {
SceneItem::display(0, 0);
break;
case 7: {
- _globals->_player._frame = 1;
- _globals->_player.setStrip2(1);
- _globals->_player._numFrames = 5;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player._frame = 1;
+ g_globals->_player.setStrip2(1);
+ g_globals->_player._numFrames = 5;
+ g_globals->_player.animate(ANIM_MODE_5, this);
Common::Point pt(205, 70);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, NULL);
- _globals->_sceneManager._fadeMode = FADEMODE_NONE;
+ g_globals->_player.addMover(mover, &pt, NULL);
+ g_globals->_sceneManager._fadeMode = FADEMODE_NONE;
scene->loadScene(1402);
break;
}
case 8:
- _globals->_player.setStrip2(2);
- _globals->_player._numFrames = 10;
- _globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player.setStrip2(2);
+ g_globals->_player._numFrames = 10;
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
- SceneItem::display(1400, 4, SET_X, 30, SET_Y, _globals->_player._position.y + 10, SET_FONT, 2,
+ SceneItem::display(1400, 4, SET_X, 30, SET_Y, g_globals->_player._position.y + 10, SET_FONT, 2,
SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
setDelay(300);
break;
@@ -728,16 +730,16 @@ void Scene1400::Action1::signal() {
SceneItem::display(0, 0);
Common::Point pt(450, 45);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 10:
- _globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180);
- _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
- _globals->_stripNum = 1500;
- _globals->_soundHandler.stop();
+ g_globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180);
+ g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ g_globals->_stripNum = 1500;
+ g_globals->_soundHandler.stop();
- _globals->_sceneManager.changeScene(1500);
+ g_globals->_sceneManager.changeScene(1500);
break;
}
}
@@ -746,41 +748,41 @@ void Scene1400::Action1::dispatch() {
Action::dispatch();
if ((_actionIndex > 3) && (_actionIndex < 9))
- _globals->_sceneText.setPosition(Common::Point(60, _globals->_sceneManager._scene->_sceneBounds.bottom - 80));
+ g_globals->_sceneText.setPosition(Common::Point(60, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80));
- if ((_actionIndex <= 2) && (_globals->_player._percent > 22))
- _globals->_player.changeZoom(100 - (800 - _globals->_player._position.y));
+ if ((_actionIndex <= 2) && (g_globals->_player._percent > 22))
+ g_globals->_player.changeZoom(100 - (800 - g_globals->_player._position.y));
- if ((_actionIndex >= 9) && (_globals->_player._percent > 22))
- _globals->_player.changeZoom(100 - (_globals->_player._position.x - 205));
+ if ((_actionIndex >= 9) && (g_globals->_player._percent > 22))
+ g_globals->_player.changeZoom(100 - (g_globals->_player._position.x - 205));
}
/*--------------------------------------------------------------------------*/
void Scene1400::postInit(SceneObjectList *OwnerList) {
- if (_globals->_stripNum != 1400) {
+ if (g_globals->_stripNum != 1400) {
loadScene(1401);
} else {
loadScene(1402);
}
Scene::postInit();
- _globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180);
- _globals->_player.postInit();
- _globals->_player.setVisage(1401);
- _globals->_player.animate(ANIM_MODE_2, 0);
- _globals->_player.setStrip2(4);
- _globals->_player.fixPriority(4);
- _globals->_player.disableControl();
+ g_globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(1401);
+ g_globals->_player.animate(ANIM_MODE_2, 0);
+ g_globals->_player.setStrip2(4);
+ g_globals->_player.fixPriority(4);
+ g_globals->_player.disableControl();
- _globals->_player._moveDiff = Common::Point(4, 2);
- _globals->_player.setPosition(Common::Point(160, 800));
- _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.y = (_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100;
+ g_globals->_player._moveDiff = Common::Point(4, 2);
+ g_globals->_player.setPosition(Common::Point(160, 800));
+ g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position);
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.y = (g_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100;
setAction(&_action1);
- _globals->_soundHandler.play(118);
+ g_globals->_soundHandler.play(118);
}
/*--------------------------------------------------------------------------
@@ -789,7 +791,7 @@ void Scene1400::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene1500::Action1::signal() {
- Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene;
+ Scene1500 *scene = (Scene1500 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -854,17 +856,17 @@ void Scene1500::Action1::signal() {
scene->_soundHandler.play(124, this);
break;
case 8:
- _globals->_soundHandler.play(126, this);
+ g_globals->_soundHandler.play(126, this);
break;
case 9:
- _globals->_soundHandler.play(127);
- _globals->_sceneManager.changeScene(2000);
+ g_globals->_soundHandler.play(127);
+ g_globals->_sceneManager.changeScene(2000);
break;
}
}
void Scene1500::Action2::signal() {
- Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene;
+ Scene1500 *scene = (Scene1500 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -895,8 +897,8 @@ void Scene1500::Action2::signal() {
}
case 3:
scene->_soundHandler.release();
- _globals->_stripNum = 1505;
- _globals->_sceneManager.changeScene(2400);
+ g_globals->_stripNum = 1505;
+ g_globals->_sceneManager.changeScene(2400);
break;
}
}
@@ -907,8 +909,8 @@ void Scene1500::postInit(SceneObjectList *OwnerList) {
loadScene(1500);
Scene::postInit();
- if ((_globals->_stripNum == 1500) || ((_globals->_stripNum != 1504) && (_globals->_stripNum != 2751))) {
- _globals->_soundHandler.play(120);
+ if ((g_globals->_stripNum == 1500) || ((g_globals->_stripNum != 1504) && (g_globals->_stripNum != 2751))) {
+ g_globals->_soundHandler.play(120);
setZoomPercents(105, 20, 145, 100);
setAction(&_action1);
@@ -925,4 +927,6 @@ void Scene1500::postInit(SceneObjectList *OwnerList) {
}
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes2.h b/engines/tsage/ringworld/ringworld_scenes2.h
index 93a8f04fd4..382d9d4157 100644
--- a/engines/tsage/ringworld_scenes2.h
+++ b/engines/tsage/ringworld/ringworld_scenes2.h
@@ -24,13 +24,18 @@
#define TSAGE_RINGWORLD_SCENES2_H
#include "common/scummsys.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
#include "tsage/events.h"
#include "tsage/core.h"
#include "tsage/scenes.h"
#include "tsage/globals.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class Scene1000 : public Scene {
/* Actions */
@@ -142,8 +147,8 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
};
+} // End of namespace Ringworld
-
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld/ringworld_scenes3.cpp
index 824a96a18b..81190aea7b 100644
--- a/engines/tsage/ringworld_scenes3.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes3.cpp
@@ -21,12 +21,14 @@
*/
#include "common/config-manager.h"
-#include "tsage/ringworld_scenes3.h"
+#include "tsage/ringworld/ringworld_scenes3.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
/*--------------------------------------------------------------------------
* Scene 2000 - Cockpit cutscenes
@@ -34,7 +36,7 @@ namespace tSage {
*--------------------------------------------------------------------------*/
void Scene2000::Action1::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -47,82 +49,82 @@ void Scene2000::Action1::signal() {
setDelay(4);
break;
case 3:
- _globals->_stripNum = 0;
- _globals->_sceneManager.changeScene(1250);
+ g_globals->_stripNum = 0;
+ g_globals->_sceneManager.changeScene(1250);
break;
}
}
void Scene2000::Action2::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_object2.animate(ANIM_MODE_6, NULL);
- setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(179) + 60);
break;
case 1:
- setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
- if (_globals->_randomSource.getRandomNumber(4) >= 2)
+ setDelay(g_globals->_randomSource.getRandomNumber(179) + 60);
+ if (g_globals->_randomSource.getRandomNumber(4) >= 2)
_actionIndex = 0;
break;
case 2:
- setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
- _actionIndex = _globals->_randomSource.getRandomNumber(1);
+ setDelay(g_globals->_randomSource.getRandomNumber(179) + 60);
+ _actionIndex = g_globals->_randomSource.getRandomNumber(1);
break;
}
}
void Scene2000::Action3::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_object6.animate(ANIM_MODE_5, NULL);
- setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(179) + 60);
break;
case 1:
scene->_object6.animate(ANIM_MODE_6, NULL);
- setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(179) + 60);
_actionIndex = 0;
break;
}
}
void Scene2000::Action4::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_object4.animate(ANIM_MODE_5, NULL);
- setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(179) + 60);
break;
case 1:
scene->_object4.animate(ANIM_MODE_6, NULL);
- setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(179) + 60);
_actionIndex = 0;
break;
}
}
void Scene2000::Action5::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_object3.animate(ANIM_MODE_5, NULL);
- setDelay(_globals->_randomSource.getRandomNumber(125) + 300);
+ setDelay(g_globals->_randomSource.getRandomNumber(125) + 300);
break;
case 1:
scene->_object3.animate(ANIM_MODE_6, NULL);
- setDelay(_globals->_randomSource.getRandomNumber(125) + 300);
+ setDelay(g_globals->_randomSource.getRandomNumber(125) + 300);
_actionIndex = 0;
break;
}
}
void Scene2000::Action6::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -133,7 +135,7 @@ void Scene2000::Action6::signal() {
scene->_stripManager.start(2000, this);
break;
case 2:
- _globals->_soundHandler.play(81);
+ g_globals->_soundHandler.play(81);
scene->_object6.postInit();
scene->_object6.setVisage(2003);
scene->_object6.setAction(NULL);
@@ -148,15 +150,15 @@ void Scene2000::Action6::signal() {
scene->_object6.animate(ANIM_MODE_6, this);
break;
case 5:
- _globals->_soundHandler.play(80);
+ g_globals->_soundHandler.play(80);
scene->_object6.remove();
- _globals->_sceneManager.changeScene(1001);
+ g_globals->_sceneManager.changeScene(1001);
break;
}
}
void Scene2000::Action7::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -169,13 +171,13 @@ void Scene2000::Action7::signal() {
setDelay(3);
break;
case 3:
- _globals->_sceneManager.changeScene(2222);
+ g_globals->_sceneManager.changeScene(2222);
break;
}
}
void Scene2000::Action8::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -188,14 +190,14 @@ void Scene2000::Action8::signal() {
setDelay(10);
break;
case 3:
- _globals->_stripNum = 2005;
- _globals->_sceneManager.changeScene(1000);
+ g_globals->_stripNum = 2005;
+ g_globals->_sceneManager.changeScene(1000);
break;
}
}
void Scene2000::Action9::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -208,8 +210,8 @@ void Scene2000::Action9::signal() {
setDelay(3);
break;
case 3:
- _globals->_stripNum = 2008;
- _globals->_sceneManager.changeScene(9999);
+ g_globals->_stripNum = 2008;
+ g_globals->_sceneManager.changeScene(9999);
break;
}
}
@@ -228,14 +230,14 @@ void Scene2000::Action10::signal() {
break;
case 3:
SceneItem::display(0, 0);
- _globals->_stripNum = 0;
- _globals->_sceneManager.changeScene(9999);
+ g_globals->_stripNum = 0;
+ g_globals->_sceneManager.changeScene(9999);
break;
}
}
void Scene2000::Action11::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -248,35 +250,35 @@ void Scene2000::Action11::signal() {
scene->_stripManager.start(2077, this);
break;
case 3:
- _globals->_stripNum = 0;
- _globals->_sceneManager.changeScene(1400);
+ g_globals->_stripNum = 0;
+ g_globals->_sceneManager.changeScene(1400);
break;
}
}
void Scene2000::Action12::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(60);
break;
case 1:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(2020, this);
break;
case 2:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(10);
break;
case 3:
- _globals->_sceneManager.changeScene(2300);
+ g_globals->_sceneManager.changeScene(2300);
break;
}
}
void Scene2000::Action13::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -287,18 +289,18 @@ void Scene2000::Action13::signal() {
break;
case 2:
SceneItem::display(0, 0);
- _globals->_stripNum = 2751;
- _globals->_sceneManager.changeScene(1500);
+ g_globals->_stripNum = 2751;
+ g_globals->_sceneManager.changeScene(1500);
break;
}
}
void Scene2000::Action14::signal() {
- Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+ Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(30);
break;
case 1:
@@ -308,12 +310,12 @@ void Scene2000::Action14::signal() {
setDelay(60);
break;
case 3:
- _globals->_soundHandler.play(99);
+ g_globals->_soundHandler.play(99);
scene->_object8.show();
scene->_object8.animate(ANIM_MODE_5, this);
break;
case 4:
- _globals->_soundHandler.play(12);
+ g_globals->_soundHandler.play(12);
scene->_object8.setStrip(2);
scene->_object8.setFrame(1);
scene->_object9.show();
@@ -324,7 +326,7 @@ void Scene2000::Action14::signal() {
scene->_stripManager.start(2001, this, scene);
break;
case 6:
- _globals->_soundHandler.fadeOut(0/* was false */);
+ g_globals->_soundHandler.fadeOut(NULL);
scene->_object8.setStrip(1);
scene->_object8.setFrame(scene->_object8.getFrameCount());
scene->_object8.animate(ANIM_MODE_6, this);
@@ -333,7 +335,7 @@ void Scene2000::Action14::signal() {
scene->_object10.remove();
break;
case 7:
- _globals->_soundHandler.play(111);
+ g_globals->_soundHandler.play(111);
scene->_object8.remove();
setDelay(5);
break;
@@ -341,8 +343,8 @@ void Scene2000::Action14::signal() {
scene->_stripManager.start(2071, this);
break;
case 9:
- _globals->_stripNum = 1250;
- _globals->_sceneManager.changeScene(1000);
+ g_globals->_stripNum = 1250;
+ g_globals->_sceneManager.changeScene(1000);
break;
}
}
@@ -384,7 +386,7 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {
_object2.setPosition(Common::Point(43, 115));
_object2.setAction(&_action2);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_object6.postInit();
_object6.setVisage(2003);
@@ -413,7 +415,7 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {
_object10.fixPriority(195);
_object10.hide();
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 1000:
setAction(&_action7);
break;
@@ -425,11 +427,11 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {
setAction(&_action13);
break;
case 2200:
- _globals->_soundHandler.play(111);
+ g_globals->_soundHandler.play(111);
setAction(&_action14);
break;
case 2222:
- _globals->_soundHandler.play(115);
+ g_globals->_soundHandler.play(115);
setAction(&_action8);
break;
case 3500:
@@ -437,28 +439,28 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {
break;
default:
_object6.remove();
- _globals->_soundHandler.play(80);
+ g_globals->_soundHandler.play(80);
setAction(&_action6);
break;
}
_soundHandler1.play(78);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
void Scene2000::stripCallback(int v) {
switch (v) {
case 0:
_object9.setStrip(3);
- _object9.animate(ANIM_MODE_7, NULL);
+ _object9.animate(ANIM_MODE_7, 0, NULL);
_object10.setStrip(6);
_object10.setFrame(1);
_object10.animate(ANIM_MODE_5, NULL);
break;
case 1:
_object10.setStrip(5);
- _object10.animate(ANIM_MODE_7, NULL);
+ _object10.animate(ANIM_MODE_7, 0, NULL);
_object9.setStrip(4);
_object9.setFrame(1);
_object9.animate(ANIM_MODE_5, NULL);
@@ -483,22 +485,22 @@ void Scene2000::stripCallback(int v) {
*--------------------------------------------------------------------------*/
void Scene2100::Action1::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (!scene->_sitFl)
setDelay(1);
else {
- setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL);
scene->_sitFl = 0;
}
break;
case 1: {
Common::Point pt(157, 62);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
@@ -508,15 +510,15 @@ void Scene2100::Action1::signal() {
case 3: {
Common::Point pt(157, 56);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 4:
- _globals->_player._strip = 3;
+ g_globals->_player._strip = 3;
setDelay(3);
break;
case 5:
- _globals->_player.fixPriority(1);
+ g_globals->_player.fixPriority(1);
scene->_area1.display();
scene->_area2.display();
scene->_area3.display();
@@ -524,12 +526,12 @@ void Scene2100::Action1::signal() {
scene->_area1.draw(true);
_state = 0;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
- while (!_state && !_vm->getEventManager()->shouldQuit()) {
+ while (!_state && !g_vm->shouldQuit()) {
// Wait for an event
Event event;
- if (!_globals->_events.getEvent(event)) {
+ if (!g_globals->_events.getEvent(event)) {
g_system->updateScreen();
g_system->delayMillis(10);
continue;
@@ -568,37 +570,37 @@ void Scene2100::Action1::signal() {
if (_state == 2100) {
Common::Point pt(157, 65);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
} else {
- _globals->_sceneManager.changeScene(_state);
+ g_globals->_sceneManager.changeScene(_state);
}
break;
case 7:
- _globals->_player.fixPriority(-1);
+ g_globals->_player.fixPriority(-1);
scene->_soundHandler.play(162);
scene->_object1.animate(ANIM_MODE_6, this);
break;
case 8:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene2100::Action2::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_object3._numFrames = 5;
- setDelay(_globals->_randomSource.getRandomNumber(59));
+ setDelay(g_globals->_randomSource.getRandomNumber(59));
break;
case 1:
scene->_object3.animate(ANIM_MODE_5, this);
break;
case 2:
- setDelay(_globals->_randomSource.getRandomNumber(59));
+ setDelay(g_globals->_randomSource.getRandomNumber(59));
break;
case 3:
scene->_object3.animate(ANIM_MODE_6, this);
@@ -608,12 +610,12 @@ void Scene2100::Action2::signal() {
}
void Scene2100::Action3::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
case 2:
- setDelay(_globals->_randomSource.getRandomNumber(119));
+ setDelay(g_globals->_randomSource.getRandomNumber(119));
break;
case 1:
scene->_object2.animate(ANIM_MODE_5, this);
@@ -626,64 +628,64 @@ void Scene2100::Action3::signal() {
}
void Scene2100::Action4::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (!scene->_sitFl)
setDelay(1);
else
- setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL);
break;
case 1: {
Common::Point pt(80, 66);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_player.setVisage(2109);
- _globals->_player._frame = 1;
- _globals->_player._strip = 2;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2109);
+ g_globals->_player._frame = 1;
+ g_globals->_player._strip = 2;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 3:
- _globals->_sceneManager.changeScene(2120);
+ g_globals->_sceneManager.changeScene(2120);
break;
}
}
void Scene2100::Action5::signal() {
// Quinn enters the cokpit after Seeker decided to enter the cave alone
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(30);
break;
case 1:
- setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL);
break;
case 2: {
Common::Point pt(272, 127);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3:
- _globals->_player.checkAngle(&scene->_object3);
+ g_globals->_player.checkAngle(&scene->_object3);
setDelay(30);
break;
case 4:
- _globals->_sceneManager.changeScene(3700);
+ g_globals->_sceneManager.changeScene(3700);
break;
}
}
void Scene2100::Action6::signal() {
// Seeker stands up and walks to the elevator
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -715,50 +717,50 @@ void Scene2100::Action6::signal() {
}
void Scene2100::Action7::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(60);
break;
case 1:
- setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL);
break;
case 2:
- setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, NULL);
break;
case 3:
- _globals->_sceneManager.changeScene(8100);
+ g_globals->_sceneManager.changeScene(8100);
break;
}
}
void Scene2100::Action8::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(60);
break;
case 1:
- setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL);
break;
case 2: {
Common::Point pt(200, 174);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3:
- _globals->_player.checkAngle(&scene->_object3);
+ g_globals->_player.checkAngle(&scene->_object3);
scene->_stripManager.start((RING_INVENTORY._translator._sceneNumber == 1) ? 7720 : 7710, this);
break;
case 4:
if (RING_INVENTORY._translator._sceneNumber != 1)
- _globals->_sceneManager.changeScene(7600);
+ g_globals->_sceneManager.changeScene(7600);
else {
- _globals->setFlag(24);
- _globals->_player.enableControl();
+ g_globals->setFlag(24);
+ g_globals->_player.enableControl();
remove();
}
break;
@@ -766,7 +768,7 @@ void Scene2100::Action8::signal() {
}
void Scene2100::Action9::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -786,14 +788,14 @@ void Scene2100::Action9::signal() {
scene->_stripManager.start(6051, this, scene);
break;
case 4:
- scene->_soundHandler.fadeOut(0/* was false */);
+ scene->_soundHandler.fadeOut(NULL);
scene->_object4.setStrip(1);
scene->_object4.setFrame(scene->_object4.getFrameCount());
scene->_object4.animate(ANIM_MODE_6, this);
break;
case 5:
scene->_object4.hide();
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(6010, this);
break;
case 6:
@@ -806,20 +808,20 @@ void Scene2100::Action9::signal() {
}
void Scene2100::Action10::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(60);
break;
case 1:
- setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL);
break;
case 2: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(155, 64);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3:
@@ -851,10 +853,10 @@ void Scene2100::Action10::signal() {
scene->_object1.animate(ANIM_MODE_5, this);
break;
case 6: {
- _globals->_player.fixPriority(1);
+ g_globals->_player.fixPriority(1);
Common::Point pt(144, 54);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 7: {
@@ -870,8 +872,8 @@ void Scene2100::Action10::signal() {
break;
}
case 8:
- _globals->_player.fixPriority(1);
- _globals->_player.setStrip(1);
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setStrip(1);
scene->_object3.fixPriority(1);
scene->_object3.setStrip(2);
scene->_object2.fixPriority(2);
@@ -884,16 +886,16 @@ void Scene2100::Action10::signal() {
scene->_object1.animate(ANIM_MODE_6, this);
break;
case 10:
- _globals->setFlag(70);
- _globals->_stripNum = 2101;
- _globals->_sceneManager.changeScene(2320);
+ g_globals->setFlag(70);
+ g_globals->_stripNum = 2101;
+ g_globals->_sceneManager.changeScene(2320);
break;
}
}
void Scene2100::Action11::signal() {
// Miranda stands up and walks to the elevator
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -951,16 +953,16 @@ void Scene2100::Action11::signal() {
case 7:
scene->_object3.remove();
scene->_object2.remove();
- _globals->setFlag(70);
- _globals->_stripNum = 2102;
- _globals->_player.enableControl();
- _globals->_player._canWalk = false;
+ g_globals->setFlag(70);
+ g_globals->_stripNum = 2102;
+ g_globals->_player.enableControl();
+ g_globals->_player._canWalk = false;
break;
}
}
void Scene2100::Action12::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -976,7 +978,7 @@ void Scene2100::Action12::signal() {
case 3: {
Common::Point pt1(158, 74);
NpcMover *mover1 = new NpcMover();
- _globals->_player.addMover(mover1, &pt1, this);
+ g_globals->_player.addMover(mover1, &pt1, this);
Common::Point pt2(158, 68);
NpcMover *mover2 = new NpcMover();
@@ -987,10 +989,10 @@ void Scene2100::Action12::signal() {
scene->_soundHandler.play(162);
scene->_object1.animate(ANIM_MODE_6, NULL);
- _globals->_player.fixPriority(-1);
+ g_globals->_player.fixPriority(-1);
Common::Point pt1(277, 84);
PlayerMover *mover1 = new PlayerMover();
- _globals->_player.addMover(mover1, &pt1, this);
+ g_globals->_player.addMover(mover1, &pt1, this);
scene->_object2.fixPriority(-1);
Common::Point pt2(255, 76);
@@ -999,29 +1001,29 @@ void Scene2100::Action12::signal() {
break;
}
case 6:
- _globals->_player.setStrip(4);
+ g_globals->_player.setStrip(4);
scene->_object2.setStrip(4);
setDelay(60);
break;
case 7:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(6052, this);
break;
case 8:
if (scene->_stripManager._field2E8 == 320)
- _globals->setFlag(74);
+ g_globals->setFlag(74);
setDelay(30);
break;
case 9:
- _globals->_events.setCursor(OBJECT_STUNNER);
+ g_globals->_events.setCursor(OBJECT_STUNNER);
scene->_object2.setAction(&scene->_action13);
setDelay(60);
break;
case 10:
- if (_globals->getFlag(74))
+ if (g_globals->getFlag(74))
setDelay(1);
else
- setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2101, &g_globals->_player, NULL);
break;
case 11:
scene->_stripManager.start(2170, this);
@@ -1030,14 +1032,14 @@ void Scene2100::Action12::signal() {
setDelay(5);
break;
case 13:
- scene->_stripManager.start(_globals->getFlag(74) ? 2172 : 2174, this);
+ scene->_stripManager.start(g_globals->getFlag(74) ? 2172 : 2174, this);
break;
case 14:
- if (_globals->getFlag(74)) {
- _globals->_stripNum = 6100;
- _globals->_sceneManager.changeScene(2320);
+ if (g_globals->getFlag(74)) {
+ g_globals->_stripNum = 6100;
+ g_globals->_sceneManager.changeScene(2320);
} else {
- _globals->_sceneManager.changeScene(6100);
+ g_globals->_sceneManager.changeScene(6100);
}
remove();
break;
@@ -1045,7 +1047,7 @@ void Scene2100::Action12::signal() {
}
void Scene2100::Action13::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1080,17 +1082,17 @@ void Scene2100::Action13::signal() {
}
void Scene2100::Action14::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(6);
break;
case 1:
- setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL);
break;
case 2:
- setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2101, &g_globals->_player, NULL);
break;
case 3:
scene->_stripManager.start(6008, this);
@@ -1105,7 +1107,7 @@ void Scene2100::Action14::signal() {
scene->_stripManager.start(6009, this, scene);
break;
case 6:
- scene->_soundHandler.fadeOut(0/* was false */);
+ scene->_soundHandler.fadeOut(NULL);
scene->_object4.setStrip(1);
scene->_object4.setFrame(scene->_object4.getFrameCount());
scene->_object4.animate(ANIM_MODE_6, this);
@@ -1158,14 +1160,14 @@ void Scene2100::Action14::signal() {
setDelay(90);
break;
case 15:
- _globals->_sceneManager.changeScene(7000);
+ g_globals->_sceneManager.changeScene(7000);
remove();
break;
}
}
void Scene2100::Action15::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1230,7 +1232,7 @@ void Scene2100::Action15::signal() {
}
void Scene2100::Action16::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1241,13 +1243,13 @@ void Scene2100::Action16::signal() {
scene->_stripManager.start(7001, this);
break;
case 2:
- setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL);
break;
case 3: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(155, 63);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 5:
@@ -1257,12 +1259,12 @@ void Scene2100::Action16::signal() {
case 6: {
Common::Point pt(160, 54);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 7:
- _globals->_player.fixPriority(1);
- _globals->_player.setStrip(3);
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setStrip(3);
setDelay(45);
break;
case 8:
@@ -1270,26 +1272,26 @@ void Scene2100::Action16::signal() {
scene->_object1.animate(ANIM_MODE_6, this);
break;
case 9:
- _globals->setFlag(15);
- _globals->setFlag(36);
- _globals->_sceneManager.changeScene(7000);
+ g_globals->setFlag(15);
+ g_globals->setFlag(36);
+ g_globals->_sceneManager.changeScene(7000);
remove();
break;
}
}
void Scene2100::Action17::signal() {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(60);
break;
case 1:
- setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL);
break;
case 2:
- setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 2101, &g_globals->_player, NULL);
break;
case 3:
scene->_stripManager.start(7070, this);
@@ -1315,7 +1317,7 @@ void Scene2100::Action17::signal() {
break;
case 8:
RING_INVENTORY._stasisNegator._sceneNumber = 1;
- _globals->_sceneManager.changeScene(9100);
+ g_globals->_sceneManager.changeScene(9100);
remove();
break;
}
@@ -1324,17 +1326,17 @@ void Scene2100::Action17::signal() {
/*--------------------------------------------------------------------------*/
void Scene2100::Hotspot2::doAction(int action) {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2100, 3);
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2100, 29);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action4);
}
break;
@@ -1346,17 +1348,17 @@ void Scene2100::Hotspot2::doAction(int action) {
void Scene2100::Hotspot3::doAction(int action) {
// Computer, on the left
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2100, 4);
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2100, 29);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action4);
}
break;
@@ -1381,17 +1383,17 @@ void Scene2100::Hotspot4::doAction(int action) {
}
void Scene2100::Hotspot8::doAction(int action) {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2100, 12);
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2100, 29);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action4);
}
break;
@@ -1403,7 +1405,7 @@ void Scene2100::Hotspot8::doAction(int action) {
void Scene2100::Hotspot10::doAction(int action) {
// Quinn's Console
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1411,15 +1413,15 @@ void Scene2100::Hotspot10::doAction(int action) {
break;
case CURSOR_USE:
if (scene->_sitFl) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2102;
- scene->setAction(&scene->_sequenceManager, scene, 2102, &_globals->_player, NULL);
- } else if (_globals->getFlag(13)) {
+ scene->setAction(&scene->_sequenceManager, scene, 2102, &g_globals->_player, NULL);
+ } else if (g_globals->getFlag(13)) {
SceneItem::display2(2100, 28);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2101;
- scene->setAction(&scene->_sequenceManager, scene, 2101, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 2101, &g_globals->_player, NULL);
}
break;
default:
@@ -1431,13 +1433,13 @@ void Scene2100::Hotspot10::doAction(int action) {
void Scene2100::Hotspot14::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(0))
+ if (g_globals->getFlag(0))
SceneItem::display2(2100, 19);
else
SceneItem::display2(2100, 18);
break;
case CURSOR_USE:
- if (_globals->getFlag(1))
+ if (g_globals->getFlag(1))
SceneItem::display2(2100, 21);
else
SceneItem::display2(2100, 20);
@@ -1450,7 +1452,7 @@ void Scene2100::Hotspot14::doAction(int action) {
void Scene2100::Object1::doAction(int action) {
// Elevator
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1466,29 +1468,29 @@ void Scene2100::Object1::doAction(int action) {
}
void Scene2100::Object2::doAction(int action) {
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2100, 30);
break;
case CURSOR_TALK:
- if (_globals->getFlag(72)) {
- _globals->_player.disableControl();
- if (!_globals->getFlag(52)) {
+ if (g_globals->getFlag(72)) {
+ g_globals->_player.disableControl();
+ if (!g_globals->getFlag(52)) {
scene->_sceneMode = 2111;
scene->setAction(&scene->_sequenceManager, scene, 2111, NULL);
} else {
- scene->_sceneMode = _globals->getFlag(53) ? 2112 : 2110;
+ scene->_sceneMode = g_globals->getFlag(53) ? 2112 : 2110;
scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, NULL);
}
- } else if (_globals->getFlag(13)) {
+ } else if (g_globals->getFlag(13)) {
SceneItem::display2(2100, 31);
- } else if (_globals->getFlag(14)) {
+ } else if (g_globals->getFlag(14)) {
SceneItem::display2(2100, 32);
} else {
- _globals->setFlag(14);
- _globals->_player.disableControl();
+ g_globals->setFlag(14);
+ g_globals->_player.disableControl();
scene->_sceneMode = 2108;
scene->setAction(&scene->_sequenceManager, scene, 2109, NULL);
}
@@ -1501,19 +1503,19 @@ void Scene2100::Object2::doAction(int action) {
void Scene2100::Object3::doAction(int action) {
// Miranda
- Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+ Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(59))
+ if (g_globals->getFlag(59))
SceneItem::display2(2100, 34);
else
error("***I have no response.");
break;
case CURSOR_TALK:
- if (_globals->getFlag(59)) {
- _globals->_player.disableControl();
+ if (g_globals->getFlag(59)) {
+ g_globals->_player.disableControl();
scene->_sceneMode = 2108;
scene->setAction(&scene->_sequenceManager, scene, 2108, NULL);
} else {
@@ -1564,7 +1566,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerHText);
_stripManager.addSpeaker(&_speakerGameText);
_speakerMText._npc = &_object3;
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
_speakerSText._npc = &_object2;
_object1.postInit();
@@ -1644,7 +1646,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
_hotspot15.setBounds(Rect(14, 90, 46, 107));
_hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- if (!_globals->getFlag(36) && !_globals->getFlag(70) && !_globals->getFlag(43)) {
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(70) && !g_globals->getFlag(43)) {
_object3.postInit();
_object3.setPosition(Common::Point(246, 156));
_object3.animate(ANIM_MODE_NONE, NULL);
@@ -1653,10 +1655,10 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
_object3.setVisage(2107);
_object3.setStrip(1);
_object3.setAction(&_action2);
- _globals->_sceneItems.push_back(&_object3);
+ g_globals->_sceneItems.push_back(&_object3);
}
- if (!_globals->getFlag(59) && !_globals->getFlag(70) && !_globals->getFlag(37) && !_globals->getFlag(114)) {
+ if (!g_globals->getFlag(59) && !g_globals->getFlag(70) && !g_globals->getFlag(37) && !g_globals->getFlag(114)) {
_object2.postInit();
_object2.setVisage(2108);
_object2._strip = 3;
@@ -1665,50 +1667,50 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
_object2.changeZoom(100);
_object2.fixPriority(113);
_object2.setAction(&_action3);
- _globals->_sceneItems.push_back(&_object2);
+ g_globals->_sceneItems.push_back(&_object2);
}
- _globals->_sceneItems.addItems(&_hotspot15, &_hotspot11, &_hotspot10, &_hotspot9, &_hotspot14,
+ g_globals->_sceneItems.addItems(&_hotspot15, &_hotspot11, &_hotspot10, &_hotspot9, &_hotspot14,
&_hotspot13, &_hotspot12, &_hotspot8, &_object1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5,
&_hotspot6, &_hotspot7, &_hotspot1, NULL);
- _globals->_player.postInit();
- if (_globals->getFlag(13)) {
- _globals->_player.setVisage(2170);
- _globals->_player._moveDiff.y = 1;
+ g_globals->_player.postInit();
+ if (g_globals->getFlag(13)) {
+ g_globals->_player.setVisage(2170);
+ g_globals->_player._moveDiff.y = 1;
} else {
- _globals->_player.setVisage(0);
- _globals->_player._moveDiff.y = 3;
+ g_globals->_player.setVisage(0);
+ g_globals->_player._moveDiff.y = 3;
}
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._moveDiff.x = 4;
- _globals->_player.changeZoom(-1);
- _globals->_player.disableControl();
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._moveDiff.x = 4;
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.disableControl();
_sitFl = 0;
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 2120:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
_object1.fixPriority(-1);
- _globals->_player.fixPriority(-1);
- _globals->_player.setPosition(Common::Point(80, 66));
- _globals->_player.enableControl();
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.setPosition(Common::Point(80, 66));
+ g_globals->_player.enableControl();
break;
case 2150:
- _globals->_player.fixPriority(1);
- _globals->_player.setPosition(Common::Point(157, 56));
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setPosition(Common::Point(157, 56));
_sceneMode = 2104;
- setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL);
+ setAction(&_sequenceManager, this, 2104, &g_globals->_player, &_object1, NULL);
break;
case 2222:
- if (_globals->_sceneObjects->contains(&_object3))
+ if (g_globals->_sceneObjects->contains(&_object3))
_object3.remove();
- _globals->_player.fixPriority(1);
- _globals->_player.setPosition(Common::Point(144, 55));
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setPosition(Common::Point(144, 55));
_object2.setVisage(2806);
_object2.changeZoom(-1);
@@ -1721,12 +1723,12 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
setAction(&_action12);
break;
case 2320:
- if (_globals->_stripNum == 2321) {
- if (_globals->_sceneObjects->contains(&_object3))
+ if (g_globals->_stripNum == 2321) {
+ if (g_globals->_sceneObjects->contains(&_object3))
_object3.remove();
- _globals->_player.fixPriority(1);
- _globals->_player.setPosition(Common::Point(144, 55));
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setPosition(Common::Point(144, 55));
_object2.postInit();
_object2.setVisage(2806);
@@ -1739,9 +1741,9 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
_object2.animate(ANIM_MODE_1, NULL);
setAction(&_action12);
- } else if (_globals->_stripNum == 6100) {
- _globals->_player.setPosition(Common::Point(157, 56));
- _globals->_player.fixPriority(1);
+ } else if (g_globals->_stripNum == 6100) {
+ g_globals->_player.setPosition(Common::Point(157, 56));
+ g_globals->_player.fixPriority(1);
_object4.postInit();
_object4.setVisage(2102);
@@ -1750,27 +1752,27 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
setAction(&_action14);
} else {
- _globals->_player.disableControl();
- _globals->_player.fixPriority(1);
- _globals->_player.setPosition(Common::Point(157, 56));
+ g_globals->_player.disableControl();
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setPosition(Common::Point(157, 56));
_sceneMode = 2104;
- setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL);
+ setAction(&_sequenceManager, this, 2104, &g_globals->_player, &_object1, NULL);
}
break;
case 3700:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
Scene::setZoomPercents(80, 75, 100, 90);
- if (_globals->_sceneObjects->contains(&_object2))
+ if (g_globals->_sceneObjects->contains(&_object2))
_object2.remove();
- _globals->_player._angle = 225;
- _globals->_player.setStrip(6);
- _globals->_player.setFrame(1);
- _globals->_player.fixPriority(-1);
- _globals->_player.setPosition(Common::Point(272, 127));
+ g_globals->_player._angle = 225;
+ g_globals->_player.setStrip(6);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.setPosition(Common::Point(272, 127));
_object3.setPosition(Common::Point(246, 156));
_object3.fixPriority(156);
@@ -1778,15 +1780,15 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
setAction(&_sequenceManager, this, 2105, &_object3, NULL);
break;
case 4250:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
- _globals->clearFlag(43);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
+ g_globals->clearFlag(43);
- _globals->_player.setVisage(2104);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(65, 149));
- _globals->_player.fixPriority(152);
- _globals->_player.setStrip(2);
+ g_globals->_player.setVisage(2104);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(65, 149));
+ g_globals->_player.fixPriority(152);
+ g_globals->_player.setStrip(2);
_object4.postInit();
_object4.setVisage(2102);
@@ -1797,16 +1799,16 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
setAction(&_sequenceManager, this, 2107, &_object4, NULL);
break;
case 5000:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
- if (_globals->_sceneObjects->contains(&_object2))
+ if (g_globals->_sceneObjects->contains(&_object2))
_object2.remove();
- _globals->_player.setStrip(3);
- _globals->_player.setFrame(1);
- _globals->_player.fixPriority(1);
- _globals->_player.setPosition(Common::Point(157, 56));
+ g_globals->_player.setStrip(3);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setPosition(Common::Point(157, 56));
_object3.setPosition(Common::Point(246, 156));
_object3.fixPriority(156);
@@ -1814,13 +1816,13 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
setAction(&_action5);
break;
case 5100:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
- _globals->_player.setVisage(2104);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(65, 149));
- _globals->_player.fixPriority(152);
- _globals->_player.setStrip(2);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
+ g_globals->_player.setVisage(2104);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(65, 149));
+ g_globals->_player.fixPriority(152);
+ g_globals->_player.setStrip(2);
_sitFl = 1;
@@ -1833,67 +1835,67 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
setAction(&_action9);
break;
case 7000:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
if (RING_INVENTORY._stasisBox2._sceneNumber == 1) {
- _globals->_player.fixPriority(1);
- _globals->_player.setPosition(Common::Point(157, 56));
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setPosition(Common::Point(157, 56));
_object4.postInit();
_object4.setVisage(2102);
_object4.setPosition(Common::Point(160, 199));
_object4.hide();
- _globals->clearFlag(15);
- _globals->clearFlag(109);
- _globals->clearFlag(72);
+ g_globals->clearFlag(15);
+ g_globals->clearFlag(109);
+ g_globals->clearFlag(72);
setAction(&_action17);
} else {
- _globals->_player.setVisage(2104);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(65, 149));
- _globals->_player.fixPriority(152);
- _globals->_player.setStrip(2);
+ g_globals->_player.setVisage(2104);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(65, 149));
+ g_globals->_player.fixPriority(152);
+ g_globals->_player.setStrip(2);
_sitFl = 1;
setAction(&_action16);
}
break;
case 7600:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
- if (_globals->_sceneObjects->contains(&_object2))
+ if (g_globals->_sceneObjects->contains(&_object2))
_object2.remove();
- _globals->_player.fixPriority(1);
- _globals->_player.setPosition(Common::Point(157, 56));
+ g_globals->_player.fixPriority(1);
+ g_globals->_player.setPosition(Common::Point(157, 56));
setAction(&_action8);
break;
case 8100:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
- _globals->_player.setVisage(2104);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(65, 149));
- _globals->_player.fixPriority(152);
- _globals->_player.setStrip(2);
+ g_globals->_player.setVisage(2104);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(65, 149));
+ g_globals->_player.fixPriority(152);
+ g_globals->_player.setStrip(2);
_sceneMode = 2106;
setAction(&_sequenceManager, this, 2106, NULL);
break;
case 9750:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
- _globals->_player.setVisage(2104);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(65, 149));
- _globals->_player.fixPriority(152);
- _globals->_player.setStrip(2);
+ g_globals->_player.setVisage(2104);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(65, 149));
+ g_globals->_player.fixPriority(152);
+ g_globals->_player.setStrip(2);
_object4.postInit();
_object4.setVisage(2102);
@@ -1904,22 +1906,22 @@ void Scene2100::postInit(SceneObjectList *OwnerList) {
setAction(&_sequenceManager, this, 2103, &_object4, NULL);
break;
default:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
- _globals->_player._uiEnabled = true;
+ g_globals->_player._uiEnabled = true;
break;
}
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
void Scene2100::stripCallback(int v) {
switch (v) {
case 1:
_object4._numFrames = 4;
- _object4.animate(ANIM_MODE_7, NULL);
+ _object4.animate(ANIM_MODE_7, 0, NULL);
break;
case 2:
_object4.animate(ANIM_MODE_NONE, NULL);
@@ -1931,22 +1933,22 @@ void Scene2100::signal() {
switch (_sceneMode) {
case 2101:
_sitFl = 1;
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 2102:
_sitFl = 0;
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 2103:
- _globals->_stripNum = 9000;
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_stripNum = 9000;
+ g_globals->_sceneManager.changeScene(4000);
break;
case 2106:
- _globals->_sceneManager.changeScene(7000);
+ g_globals->_sceneManager.changeScene(7000);
break;
case 2107:
- _globals->_sceneManager.changeScene(5000);
+ g_globals->_sceneManager.changeScene(5000);
break;
case 2104:
case 2105:
@@ -1954,7 +1956,7 @@ void Scene2100::signal() {
case 2110:
case 2111:
case 2112:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -2007,12 +2009,12 @@ Scene2120::Action1::Action1() {
}
void Scene2120::Action1::signal() {
- Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene;
+ Scene2120 *scene = (Scene2120 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(30);
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
break;
case 1:
// First page of index
@@ -2045,10 +2047,10 @@ void Scene2120::Action1::signal() {
}
void Scene2120::Action1::dispatch() {
- Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene;
+ Scene2120 *scene = (Scene2120 *)g_globals->_sceneManager._scene;
Event event;
- if (_globals->_events.getEvent(event) && (event.eventType == EVENT_BUTTON_DOWN)) {
+ if (g_globals->_events.getEvent(event) && (event.eventType == EVENT_BUTTON_DOWN)) {
if (scene->_listRect.contains(event.mousePos) && (scene->_dbMode != 2)) {
scene->_topicArrowHotspot.setPosition(Common::Point(scene->_topicArrowHotspot._position.x, event.mousePos.y));
}
@@ -2064,8 +2066,8 @@ void Scene2120::Action1::dispatch() {
else
scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 44) / 8 + 16;
- if ((scene->_subjectIndex == 27) && _globals->getFlag(70))
- _globals->setFlag(75);
+ if ((scene->_subjectIndex == 27) && g_globals->getFlag(70))
+ g_globals->setFlag(75);
scene->_topicArrowHotspot.hide();
scene->_prevDbMode = scene->_dbMode;
@@ -2142,9 +2144,9 @@ void Scene2120::Action1::dispatch() {
setAction(NULL);
SceneItem::display(0, 0);
- _globals->_gfxManagerInstance._font.setFontNumber(2);
- _globals->_sceneText._fontNumber = 2;
- _globals->_sceneManager.changeScene(_globals->_sceneManager._previousScene);
+ g_globals->_gfxManagerInstance._font.setFontNumber(2);
+ g_globals->_sceneText._fontNumber = 2;
+ g_globals->_sceneManager.changeScene(g_globals->_sceneManager._previousScene);
} else {
// Exit out of topic display to index
SceneItem::display(0, 0);
@@ -2182,7 +2184,7 @@ Scene2120::Scene2120(): Scene() {
void Scene2120::postInit(SceneObjectList *OwnerList) {
loadScene(2120);
setZoomPercents(0, 100, 200, 100);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_subjectButton.setBounds(Rect(266, 13, 320, 56));
_nextPageButton.setBounds(Rect(266, 56, 320, 98));
@@ -2201,8 +2203,8 @@ void Scene2120::postInit(SceneObjectList *OwnerList) {
_arrowHotspot.setPosition(Common::Point(400, 200));
setAction(&_action1);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
void Scene2120::synchronize(Serializer &s) {
@@ -2221,14 +2223,14 @@ void Scene2120::synchronize(Serializer &s) {
*--------------------------------------------------------------------------*/
void Scene2150::Action1::signal() {
- Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+ Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(158, 103);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
@@ -2236,15 +2238,15 @@ void Scene2150::Action1::signal() {
scene->_hotspot1.animate(ANIM_MODE_5, this);
break;
case 2: {
- _globals->_player.setStrip2(4);
+ g_globals->_player.setStrip2(4);
Common::Point pt(158, 95);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3:
- _globals->_player.setStrip2(-1);
- _globals->_player._strip = 3;
+ g_globals->_player.setStrip2(-1);
+ g_globals->_player._strip = 3;
setDelay(10);
break;
case 4:
@@ -2255,12 +2257,12 @@ void Scene2150::Action1::signal() {
scene->_area2.draw(true);
_state = 0;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
- while (!_state && !_vm->getEventManager()->shouldQuit()) {
+ while (!_state && !g_vm->shouldQuit()) {
// Wait for an event
Event event;
- if (!_globals->_events.getEvent(event)) {
+ if (!g_globals->_events.getEvent(event)) {
g_system->updateScreen();
g_system->delayMillis(10);
continue;
@@ -2299,10 +2301,10 @@ void Scene2150::Action1::signal() {
if (_state == 2150) {
Common::Point pt(158, 103);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
} else {
- _globals->_sceneManager.changeScene(_state);
+ g_globals->_sceneManager.changeScene(_state);
}
break;
case 6:
@@ -2310,28 +2312,28 @@ void Scene2150::Action1::signal() {
scene->_hotspot1.animate(ANIM_MODE_6, this);
break;
case 7:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene2150::Action2::signal() {
- Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+ Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(47, 85);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
- _globals->_player.setVisage(2152);
- _globals->_player.setFrame(1);
- _globals->_player.setStrip(8);
- _globals->_player.animate(ANIM_MODE_8, 1, this);
+ g_globals->_player.setVisage(2152);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setStrip(8);
+ g_globals->_player.animate(ANIM_MODE_8, 1, this);
scene->_soundHandler.play(163);
break;
@@ -2340,7 +2342,7 @@ void Scene2150::Action2::signal() {
scene->_hotspot10.animate(ANIM_MODE_5, this);
break;
case 3:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start((RING_INVENTORY._ale._sceneNumber == 2150) ? 2151 : 2152, this);
break;
case 4:
@@ -2356,21 +2358,21 @@ void Scene2150::Action2::signal() {
scene->_hotspot14.setFrame(scene->_stripManager._field2E8 - 5);
}
- _globals->_player.setFrame(1);
- _globals->_player.setStrip(7);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setStrip(7);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 5:
scene->_soundHandler.play(164);
scene->_hotspot10.animate(ANIM_MODE_6, NULL);
scene->_hotspot14.remove();
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 6:
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.enableControl();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.enableControl();
remove();
break;
@@ -2380,7 +2382,7 @@ void Scene2150::Action2::signal() {
/*--------------------------------------------------------------------------*/
void Scene2150::Hotspot1::doAction(int action) {
- Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+ Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2396,16 +2398,16 @@ void Scene2150::Hotspot1::doAction(int action) {
}
void Scene2150::Hotspot2::doAction(int action) {
- Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+ Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2150, 1);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2156;
- scene->setAction(&scene->_sequenceManager, scene, 2156, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 2156, &g_globals->_player, this, NULL);
break;
default:
SceneHotspot::doAction(action);
@@ -2414,16 +2416,16 @@ void Scene2150::Hotspot2::doAction(int action) {
}
void Scene2150::Hotspot4::doAction(int action) {
- Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+ Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2150, 3);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2155;
- scene->setAction(&scene->_sequenceManager, scene, 2155, &_globals->_player, &scene->_hotspot4, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 2155, &g_globals->_player, &scene->_hotspot4, NULL);
break;
default:
SceneHotspot::doAction(action);
@@ -2432,19 +2434,19 @@ void Scene2150::Hotspot4::doAction(int action) {
}
void Scene2150::Hotspot7::doAction(int action) {
- Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+ Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2150, 7);
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2150, 19);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2154;
- scene->setAction(&scene->_sequenceManager, scene, 2154, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 2154, &g_globals->_player, NULL);
}
break;
default:
@@ -2454,14 +2456,14 @@ void Scene2150::Hotspot7::doAction(int action) {
}
void Scene2150::Hotspot10::doAction(int action) {
- Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+ Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2150, 10);
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2150, 19);
else
scene->setAction(&scene->_action2);
@@ -2542,60 +2544,60 @@ void Scene2150::postInit(SceneObjectList *OwnerList) {
_hotspot10.setStrip(5);
_hotspot10.setPosition(Common::Point(59, 56));
- _globals->_player.postInit();
- _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.fixPriority(-1);
- _globals->_player.changeZoom(-1);
- _globals->_player._moveDiff.y = 3;
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(g_globals->getFlag(13) ? 2170 : 0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player._moveDiff.y = 3;
_hotspot8.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
_hotspot9.setBounds(Rect(133, 0, 198, 91));
_hotspot11.setBounds(Rect(142, 119, 176, 158));
- _globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5,
+ g_globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5,
&_hotspot6, &_hotspot7, &_hotspot10, &_hotspot9, &_hotspot11, &_hotspot8, NULL);
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 2120:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
- _globals->_player.setPosition(Common::Point(108, 99));
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
+ g_globals->_player.setPosition(Common::Point(108, 99));
break;
case 2200:
- _globals->_player.disableControl();
- _globals->_player.setPosition(Common::Point(159, 240));
+ g_globals->_player.disableControl();
+ g_globals->_player.setPosition(Common::Point(159, 240));
_sceneMode = 2152;
- setAction(&_sequenceManager, this, 2152, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 2152, &g_globals->_player, NULL);
break;
case 2280:
- _globals->_player.disableControl();
- _globals->_player._angle = 180;
- _globals->_player.setPosition(Common::Point(265, 80));
+ g_globals->_player.disableControl();
+ g_globals->_player._angle = 180;
+ g_globals->_player.setPosition(Common::Point(265, 80));
_hotspot2._frame = _hotspot2.getFrameCount();
_sceneMode = 2157;
setAction(&_sequenceManager, this, 2157, &_hotspot2, NULL);
break;
case 2230:
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player._strip = 4;
- _globals->_player.setPosition(Common::Point(229, 139));
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player._strip = 4;
+ g_globals->_player.setPosition(Common::Point(229, 139));
break;
case 2100:
default:
- _globals->_player.disableControl();
- _globals->_player.setPosition(Common::Point(158, 95));
- _globals->_player.setStrip(3);
+ g_globals->_player.disableControl();
+ g_globals->_player.setPosition(Common::Point(158, 95));
+ g_globals->_player.setStrip(3);
_sceneMode = 2151;
- setAction(&_sequenceManager, this, 2151, &_globals->_player, &_hotspot1, NULL);
+ setAction(&_sequenceManager, this, 2151, &g_globals->_player, &_hotspot1, NULL);
break;
}
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
void Scene2150::synchronize(Serializer &s) {
@@ -2607,22 +2609,22 @@ void Scene2150::synchronize(Serializer &s) {
void Scene2150::signal() {
switch (_sceneMode) {
case 2151:
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.enableControl();
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.enableControl();
break;
case 2152:
case 2153:
case 2157:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 2154:
- _globals->_sceneManager.changeScene(2120);
+ g_globals->_sceneManager.changeScene(2120);
break;
case 2155:
- _globals->_sceneManager.changeScene(2230);
+ g_globals->_sceneManager.changeScene(2230);
break;
case 2156:
- _globals->_sceneManager.changeScene(2280);
+ g_globals->_sceneManager.changeScene(2280);
break;
}
}
@@ -2631,22 +2633,22 @@ void Scene2150::dispatch() {
Scene::dispatch();
if (!_action) {
- if (_rect1.contains(_globals->_player._position)) {
- _globals->_player.disableControl();
+ if (_rect1.contains(g_globals->_player._position)) {
+ g_globals->_player.disableControl();
_sceneMode = 2156;
- setAction(&_sequenceManager, this, 2156, &_globals->_player, &_hotspot2, NULL);
+ setAction(&_sequenceManager, this, 2156, &g_globals->_player, &_hotspot2, NULL);
}
- if (_rect2.contains(_globals->_player._position)) {
- _globals->_player.disableControl();
+ if (_rect2.contains(g_globals->_player._position)) {
+ g_globals->_player.disableControl();
_sceneMode = 2155;
- setAction(&_sequenceManager, this, 2155, &_globals->_player, &_hotspot4, NULL);
+ setAction(&_sequenceManager, this, 2155, &g_globals->_player, &_hotspot4, NULL);
}
- if (_globals->_player._position.y >= 196) {
- _globals->_player.disableControl();
+ if (g_globals->_player._position.y >= 196) {
+ g_globals->_player.disableControl();
SceneItem::display2(2150, 20);
_sceneMode = 2153;
- setAction(&_sequenceManager, this, 2153, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 2153, &g_globals->_player, NULL);
}
}
}
@@ -2657,7 +2659,7 @@ void Scene2150::dispatch() {
*--------------------------------------------------------------------------*/
void Scene2200::Action1::signal() {
- Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+ Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2668,14 +2670,14 @@ void Scene2200::Action1::signal() {
break;
case 2:
SceneItem::display2(2200, 7);
- _globals->_sceneManager.changeScene(2150);
+ g_globals->_sceneManager.changeScene(2150);
remove();
break;
}
}
void Scene2200::Action2::signal() {
- Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+ Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2692,20 +2694,20 @@ void Scene2200::Action2::signal() {
setDelay(30);
break;
case 4:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(2040, this, scene);
break;
case 5:
scene->_hotspot4.setStrip(4);
scene->_hotspot4.animate(ANIM_MODE_NONE, NULL);
- _globals->_player._uiEnabled = true;
+ g_globals->_player._uiEnabled = true;
remove();
break;
}
}
void Scene2200::Action3::signal() {
- Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+ Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -2713,7 +2715,7 @@ void Scene2200::Action3::signal() {
scene->_hotspot4.setStrip(4);
scene->_hotspot4.animate(ANIM_MODE_NONE, NULL);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_hotspot2.postInit();
scene->_hotspot2.setVisage(2201);
@@ -2732,16 +2734,16 @@ void Scene2200::Action3::signal() {
setDelay(120);
break;
case 2:
- if (_globals->getFlag(83)) {
+ if (g_globals->getFlag(83)) {
_actionIndex = 8;
setDelay(5);
} else {
- for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin();
- i != _globals->_sceneObjects->end(); ++i) {
+ for (SynchronizedList<SceneObject *>::iterator i = g_globals->_sceneObjects->begin();
+ i != g_globals->_sceneObjects->end(); ++i) {
(*i)->hide();
}
- _globals->_sceneManager._scene->loadScene(66);
+ g_globals->_sceneManager._scene->loadScene(66);
scene->_hotspot6.postInit();
scene->_hotspot6.setVisage(66);
@@ -2773,12 +2775,12 @@ void Scene2200::Action3::signal() {
setDelay(5);
break;
case 7:
- for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin();
- i != _globals->_sceneObjects->end(); ++i)
+ for (SynchronizedList<SceneObject *>::iterator i = g_globals->_sceneObjects->begin();
+ i != g_globals->_sceneObjects->end(); ++i)
(*i)->show();
scene->_hotspot6.remove();
- _globals->_sceneManager._scene->loadScene(2200);
+ g_globals->_sceneManager._scene->loadScene(2200);
setDelay(5);
break;
case 8:
@@ -2789,7 +2791,7 @@ void Scene2200::Action3::signal() {
scene->_hotspot4.animate(ANIM_MODE_NONE, NULL);
break;
case 10:
- _globals->_sceneManager.changeScene(2000);
+ g_globals->_sceneManager.changeScene(2000);
remove();
break;
}
@@ -2806,7 +2808,7 @@ void Scene2200::Action3::process(Event &event) {
}
void Scene2200::Action4::signal() {
- Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+ Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2821,7 +2823,7 @@ void Scene2200::Action4::signal() {
setDelay(10);
break;
case 3:
- _globals->_player._uiEnabled = true;
+ g_globals->_player._uiEnabled = true;
remove();
break;
}
@@ -2830,7 +2832,7 @@ void Scene2200::Action4::signal() {
/*--------------------------------------------------------------------------*/
void Scene2200::Hotspot3::doAction(int action) {
- Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+ Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2840,7 +2842,7 @@ void Scene2200::Hotspot3::doAction(int action) {
SceneItem::display2(2200, 11);
break;
case CURSOR_TALK:
- _globals->_player._uiEnabled = false;
+ g_globals->_player._uiEnabled = false;
scene->setAction(&scene->_action4);
break;
default:
@@ -2850,7 +2852,7 @@ void Scene2200::Hotspot3::doAction(int action) {
}
void Scene2200::Hotspot5::doAction(int action) {
- Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+ Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2861,7 +2863,7 @@ void Scene2200::Hotspot5::doAction(int action) {
break;
case CURSOR_TALK:
scene->_sceneMode = 2201;
- _globals->_player._uiEnabled = false;
+ g_globals->_player._uiEnabled = false;
scene->setAction(&scene->_sequenceManager, scene, 2201, NULL);
break;
default:
@@ -2871,19 +2873,19 @@ void Scene2200::Hotspot5::doAction(int action) {
}
void Scene2200::Hotspot9::doAction(int action) {
- Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+ Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(2200, _globals->getFlag(8) ? 1 : 0);
+ SceneItem::display2(2200, g_globals->getFlag(8) ? 1 : 0);
break;
case CURSOR_USE:
SceneItem::display2(2200, 3);
break;
case OBJECT_INFODISK:
- if (_globals->_sceneManager._previousScene == 2310) {
+ if (g_globals->_sceneManager._previousScene == 2310) {
scene->_soundHandler2.play(35);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action3);
}
break;
@@ -2915,7 +2917,7 @@ void Scene2200::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerMR);
_stripManager.addSpeaker(&_speakerGameText);
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
_speakerSText._npc = &_hotspot5;
_speakerMText._npc = &_hotspot3;
@@ -2931,21 +2933,21 @@ void Scene2200::postInit(SceneObjectList *OwnerList) {
_hotspot8.setPosition(Common::Point(96, 184));
_hotspot8.fixPriority(236);
- _globals->_player.postInit();
- _globals->_player.setVisage(2640);
- _globals->_player.setFrame2(3);
- _globals->_player.setPosition(Common::Point(110, 233));
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2640);
+ g_globals->_player.setFrame2(3);
+ g_globals->_player.setPosition(Common::Point(110, 233));
+ g_globals->_player.disableControl();
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 2150:
_hotspot5.remove();
_hotspot8.remove();
break;
case 4000:
- _globals->_soundHandler.play(100);
- _globals->_soundHandler.holdAt(true);
- _globals->_player.remove();
+ g_globals->_soundHandler.play(100);
+ g_globals->_soundHandler.holdAt(true);
+ g_globals->_player.remove();
_hotspot5.remove();
_hotspot8.remove();
@@ -2975,20 +2977,20 @@ void Scene2200::postInit(SceneObjectList *OwnerList) {
_hotspot3.postInit();
_hotspot3.setVisage(2215);
_hotspot3.setPosition(Common::Point(144, 132));
- _globals->_sceneItems.push_back(&_hotspot3);
+ g_globals->_sceneItems.push_back(&_hotspot3);
_hotspot4.postInit();
_hotspot4.setVisage(2215);
_hotspot4._strip = 2;
_hotspot4.setPosition(Common::Point(120, 78));
_hotspot4.fixPriority(255);
- _globals->_sceneItems.push_back(&_hotspot4);
+ g_globals->_sceneItems.push_back(&_hotspot4);
_soundHandler1.play(101);
_soundHandler2.play(100);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.holdAt(true);
- _globals->_sceneItems.push_back(&_hotspot5);
+ g_globals->_sceneItems.push_back(&_hotspot5);
setAction(&_action2);
break;
}
@@ -2997,9 +2999,9 @@ void Scene2200::postInit(SceneObjectList *OwnerList) {
_hotspot9.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
_hotspot10.setBounds(Rect(87, 43, 149, 109));
- _globals->_sceneItems.addItems(&_hotspot10, &_hotspot9, NULL);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneItems.addItems(&_hotspot10, &_hotspot9, NULL);
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
void Scene2200::stripCallback(int v) {
@@ -3022,15 +3024,15 @@ void Scene2200::synchronize(Serializer &s) {
void Scene2200::signal() {
if ((_sceneMode == 2201) || (_sceneMode == 2202))
- _globals->_player._uiEnabled = true;
+ g_globals->_player._uiEnabled = true;
}
void Scene2200::dispatch() {
Scene::dispatch();
if (!_action) {
- if (_exitRect.contains(_globals->_player._position))
- _globals->_sceneManager.changeScene(2150);
+ if (_exitRect.contains(g_globals->_player._position))
+ g_globals->_sceneManager.changeScene(2150);
}
}
@@ -3040,7 +3042,7 @@ void Scene2200::dispatch() {
*--------------------------------------------------------------------------*/
void Scene2222::Action1::signal() {
- Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene;
+ Scene2222 *scene = (Scene2222 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -3053,13 +3055,13 @@ void Scene2222::Action1::signal() {
setDelay(30);
break;
case 3:
- _globals->_sceneManager.changeScene(1000);
+ g_globals->_sceneManager.changeScene(1000);
break;
}
}
void Scene2222::Action2::signal() {
- Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene;
+ Scene2222 *scene = (Scene2222 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -3072,8 +3074,8 @@ void Scene2222::Action2::signal() {
setDelay(120);
break;
case 3:
- _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ g_globals->_sceneManager.changeScene(2100);
break;
}
}
@@ -3081,7 +3083,7 @@ void Scene2222::Action2::signal() {
/*--------------------------------------------------------------------------*/
void Scene2222::postInit(SceneObjectList *OwnerList) {
- loadScene((_globals->_sceneManager._previousScene == 2000) ? 3400 : 3450);
+ loadScene((g_globals->_sceneManager._previousScene == 2000) ? 3400 : 3450);
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
@@ -3121,7 +3123,7 @@ void Scene2222::postInit(SceneObjectList *OwnerList) {
_hotspot5.setFrame(5);
_hotspot5.animate(ANIM_MODE_2, 0);
- if (_globals->_sceneManager._previousScene == 2100) {
+ if (g_globals->_sceneManager._previousScene == 2100) {
_hotspot1.setPosition(Common::Point(61, 101));
_hotspot2.setPosition(Common::Point(239, 149));
_hotspot3.setPosition(Common::Point(184, 85));
@@ -3140,10 +3142,10 @@ void Scene2222::postInit(SceneObjectList *OwnerList) {
}
_soundHandler.play(116);
- _globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position);
+ g_globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
@@ -3153,7 +3155,7 @@ void Scene2222::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene2230::Action1::signal() {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -3172,7 +3174,7 @@ void Scene2230::Action1::signal() {
case 1: {
Common::Point pt(84, 74);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
@@ -3181,20 +3183,20 @@ void Scene2230::Action1::signal() {
case 3: {
Common::Point pt(63, 60);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 4:
scene->_hotspot1.animate(ANIM_MODE_6, this);
break;
case 5:
- _globals->_sceneManager.changeScene(2150);
+ g_globals->_sceneManager.changeScene(2150);
break;
}
}
void Scene2230::Action2::signal() {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -3208,67 +3210,67 @@ void Scene2230::Action2::signal() {
}
break;
case 1: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_field30A = 1;
- _globals->_player._regionBitList |= ~0x80;
+ g_globals->_player._regionBitList |= ~0x80;
Common::Point pt(160, 96);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_player.setVisage(2235);
- _globals->_player.setStrip2(1);
- _globals->_player.fixPriority(100);
- _globals->_player._frame = 1;
- _globals->_player.setPosition(Common::Point(200, 68));
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2235);
+ g_globals->_player.setStrip2(1);
+ g_globals->_player.fixPriority(100);
+ g_globals->_player._frame = 1;
+ g_globals->_player.setPosition(Common::Point(200, 68));
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 3:
scene->_soundHandler.play(157);
- _globals->_player._moveDiff = Common::Point(1, 1);
- _globals->_player.setAction(&scene->_action4);
- _globals->_player._uiEnabled = true;
+ g_globals->_player._moveDiff = Common::Point(1, 1);
+ g_globals->_player.setAction(&scene->_action4);
+ g_globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
remove();
break;
}
}
void Scene2230::Action3::signal() {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.setAction(NULL);
- _globals->_player._moveDiff = Common::Point(5, 3);
- _globals->_player.setStrip2(_globals->_player._strip);
+ g_globals->_player.setAction(NULL);
+ g_globals->_player._moveDiff = Common::Point(5, 3);
+ g_globals->_player.setStrip2(g_globals->_player._strip);
Common::Point pt(190, 74);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
scene->_soundHandler.stop();
break;
}
case 1:
- _globals->_player._strip = 3;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player._strip = 3;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- _globals->_player._regionBitList |= 0x80;
+ g_globals->_player._regionBitList |= 0x80;
scene->_field30A = 0;
- _globals->_player.setVisage(0);
- _globals->_player.setStrip2(-1);
- _globals->_player.fixPriority(-1);
- _globals->_player.setPosition(Common::Point(164, 96));
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._canWalk = true;
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setStrip2(-1);
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.setPosition(Common::Point(164, 96));
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._canWalk = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
remove();
}
}
@@ -3276,16 +3278,16 @@ void Scene2230::Action3::signal() {
void Scene2230::Action4::signal() {
switch (_actionIndex++) {
case 0:
- Common::Point pt(190 + _globals->_randomSource.getRandomNumber(9), 68);
+ Common::Point pt(190 + g_globals->_randomSource.getRandomNumber(9), 68);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
_actionIndex = 0;
break;
}
}
void Scene2230::Action5::signal() {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -3299,22 +3301,22 @@ void Scene2230::Action5::signal() {
}
break;
case 1: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(209, 124);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_player.fixPriority(1430);
- _globals->_player.setVisage(2232);
- _globals->_player._strip = 1;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.fixPriority(1430);
+ g_globals->_player.setVisage(2232);
+ g_globals->_player._strip = 1;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 3:
- _globals->_events.setCursor(CURSOR_USE);
- _globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player._uiEnabled = true;
scene->_field30A = 2;
remove();
break;
@@ -3322,32 +3324,32 @@ void Scene2230::Action5::signal() {
}
void Scene2230::Action6::signal() {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player._strip = 2;
- _globals->_player._frame = 1;
- _globals->_player.fixPriority(-1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player._strip = 2;
+ g_globals->_player._frame = 1;
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 1:
scene->_field30A = 0;
- _globals->_player.setVisage(0);
- _globals->_player._strip = 1;
- _globals->_player._canWalk = true;
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setVisage(0);
+ g_globals->_player._strip = 1;
+ g_globals->_player._canWalk = true;
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
remove();
break;
}
}
void Scene2230::Action7::signal() {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
switch (scene->_field30A) {
case 1:
@@ -3364,7 +3366,7 @@ void Scene2230::Action7::signal() {
case 1: {
Common::Point pt(140, 119);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2: {
@@ -3387,23 +3389,23 @@ void Scene2230::Action7::signal() {
scene->_hotspot8._frame = 2;
break;
case 4:
- _globals->_sceneItems.push_front(&scene->_hotspot10);
- _globals->_sceneItems.push_front(&scene->_hotspot11);
- _globals->_sceneItems.push_front(&scene->_hotspot12);
+ g_globals->_sceneItems.push_front(&scene->_hotspot10);
+ g_globals->_sceneItems.push_front(&scene->_hotspot11);
+ g_globals->_sceneItems.push_front(&scene->_hotspot12);
scene->_hotspot2.remove();
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene2230::Action8::signal() {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
switch (scene->_field30A) {
case 1:
@@ -3420,13 +3422,13 @@ void Scene2230::Action8::signal() {
case 1: {
Common::Point pt(140, 119);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2: {
- _globals->_sceneItems.remove(&scene->_hotspot10);
- _globals->_sceneItems.remove(&scene->_hotspot11);
- _globals->_sceneItems.remove(&scene->_hotspot12);
+ g_globals->_sceneItems.remove(&scene->_hotspot10);
+ g_globals->_sceneItems.remove(&scene->_hotspot11);
+ g_globals->_sceneItems.remove(&scene->_hotspot12);
switch (scene->_field30A) {
case 1:
@@ -3462,7 +3464,7 @@ void Scene2230::Action8::signal() {
}
case 5:
scene->_hotspot8.setStrip2(1);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
@@ -3473,7 +3475,7 @@ void Scene2230::Action8::signal() {
/*--------------------------------------------------------------------------*/
void Scene2230::Hotspot1::doAction(int action) {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -3491,13 +3493,13 @@ void Scene2230::Hotspot1::doAction(int action) {
void Scene2230::Hotspot3::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(4))
+ if (g_globals->getFlag(4))
SceneItem::display2(2230, 1);
else {
SceneItem::display2(2230, 1);
SceneItem::display2(2230, 2);
SceneItem::display2(2230, 3);
- _globals->setFlag(4);
+ g_globals->setFlag(4);
}
break;
default:
@@ -3509,14 +3511,14 @@ void Scene2230::Hotspot3::doAction(int action) {
void Scene2230::Hotspot4::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(30))
+ if (g_globals->getFlag(30))
SceneItem::display2(2230, 6);
- else if (_globals->getFlag(29)) {
+ else if (g_globals->getFlag(29)) {
SceneItem::display2(2230, 5);
- _globals->setFlag(30);
+ g_globals->setFlag(30);
} else {
SceneItem::display2(2230, 4);
- _globals->setFlag(29);
+ g_globals->setFlag(29);
}
break;
case CURSOR_USE:
@@ -3531,10 +3533,10 @@ void Scene2230::Hotspot4::doAction(int action) {
void Scene2230::Hotspot5::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(5))
+ if (g_globals->getFlag(5))
SceneItem::display2(2230, 9);
else {
- _globals->setFlag(5);
+ g_globals->setFlag(5);
SceneItem::display2(2230, 8);
}
break;
@@ -3545,21 +3547,21 @@ void Scene2230::Hotspot5::doAction(int action) {
}
void Scene2230::Hotspot6::doAction(int action) {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(6))
+ if (g_globals->getFlag(6))
SceneItem::display2(2230, 11);
else {
- _globals->setFlag(6);
+ g_globals->setFlag(6);
SceneItem::display2(2230, 10);
}
break;
case CURSOR_USE:
if (scene->_field30A == 1)
scene->setAction(&scene->_action3);
- else if (_globals->getFlag(13))
+ else if (g_globals->getFlag(13))
SceneItem::display2(2230, 28);
else
scene->setAction(&scene->_action2);
@@ -3571,21 +3573,21 @@ void Scene2230::Hotspot6::doAction(int action) {
}
void Scene2230::Hotspot7::doAction(int action) {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(7))
+ if (g_globals->getFlag(7))
SceneItem::display2(2230, 13);
else {
- _globals->setFlag(6);
+ g_globals->setFlag(6);
SceneItem::display2(2230, 12);
}
break;
case CURSOR_USE:
if (scene->_field30A == 2)
scene->setAction(&scene->_action6);
- else if (_globals->getFlag(13))
+ else if (g_globals->getFlag(13))
SceneItem::display2(2230, 29);
else
scene->setAction(&scene->_action5);
@@ -3597,22 +3599,22 @@ void Scene2230::Hotspot7::doAction(int action) {
}
void Scene2230::Hotspot8::doAction(int action) {
- Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+ Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
if (scene->_hotspot8._strip == 1) {
- if (_globals->getFlag(22))
+ if (g_globals->getFlag(22))
SceneItem::display2(2230, 19);
else {
- _globals->setFlag(22);
+ g_globals->setFlag(22);
SceneItem::display2(2230, 14);
}
} else {
- if (_globals->getFlag(25))
+ if (g_globals->getFlag(25))
SceneItem::display2(2230, 21);
else {
- _globals->setFlag(25);
+ g_globals->setFlag(25);
SceneItem::display2(2230, 20);
}
}
@@ -3632,10 +3634,10 @@ void Scene2230::Hotspot8::doAction(int action) {
void Scene2230::Hotspot10::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(26))
+ if (g_globals->getFlag(26))
SceneItem::display2(2230, 25);
else {
- _globals->setFlag(26);
+ g_globals->setFlag(26);
SceneItem::display2(2230, 24);
}
break;
@@ -3651,10 +3653,10 @@ void Scene2230::Hotspot10::doAction(int action) {
void Scene2230::Hotspot11::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(27))
+ if (g_globals->getFlag(27))
SceneItem::display2(2230, 23);
else {
- _globals->setFlag(27);
+ g_globals->setFlag(27);
SceneItem::display2(2230, 22);
}
break;
@@ -3670,10 +3672,10 @@ void Scene2230::Hotspot11::doAction(int action) {
void Scene2230::Hotspot12::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(28))
+ if (g_globals->getFlag(28))
SceneItem::display2(2230, 27);
else {
- _globals->setFlag(28);
+ g_globals->setFlag(28);
SceneItem::display2(2230, 26);
}
break;
@@ -3714,17 +3716,17 @@ void Scene2230::postInit(SceneObjectList *OwnerList) {
_rect1 = Rect(59, 64, 89, 74);
- _globals->_player.postInit();
- _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0);
- _globals->_player.animate(ANIM_MODE_1, 0);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(80, 80));
- _globals->_player._moveDiff.y = 3;
- _globals->_player._regionBitList |= 0x80;
- _globals->_player.changeZoom(-1);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(g_globals->getFlag(13) ? 2170 : 0);
+ g_globals->_player.animate(ANIM_MODE_1, 0);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(80, 80));
+ g_globals->_player._moveDiff.y = 3;
+ g_globals->_player._regionBitList |= 0x80;
+ g_globals->_player.changeZoom(-1);
_field30A = 0;
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
_hotspot5.setBounds(Rect(108, 34, 142, 76));
_hotspot4.setBounds(Rect(92, 14, 106, 57));
@@ -3735,11 +3737,11 @@ void Scene2230::postInit(SceneObjectList *OwnerList) {
_hotspot11.setBounds(Rect(158, 109, 164, 115));
_hotspot12.setBounds(Rect(170, 109, 177, 115));
- _globals->_sceneItems.addItems(&_hotspot8, &_hotspot5, &_hotspot4, &_hotspot6, &_hotspot7,
+ g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot5, &_hotspot4, &_hotspot6, &_hotspot7,
&_hotspot1, &_hotspot3, NULL);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
void Scene2230::synchronize(Serializer &s) {
@@ -3752,7 +3754,7 @@ void Scene2230::dispatch() {
Scene::dispatch();
if (!_action) {
- if (_rect1.contains(_globals->_player._position))
+ if (_rect1.contains(g_globals->_player._position))
setAction(&_action1);
}
}
@@ -3763,14 +3765,14 @@ void Scene2230::dispatch() {
*--------------------------------------------------------------------------*/
void Scene2280::Action1::signal() {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(192, 97);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
@@ -3780,90 +3782,90 @@ void Scene2280::Action1::signal() {
case 2: {
Common::Point pt(218, 87);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3:
- _globals->_player.setStrip(3);
+ g_globals->_player.setStrip(3);
setDelay(10);
break;
case 4:
- _globals->_player.fixPriority(1);
+ g_globals->_player.fixPriority(1);
scene->_soundHandler.play(162);
scene->_hotspot16.animate(ANIM_MODE_6, this);
break;
case 5:
- _globals->_sceneManager.changeScene(7000);
+ g_globals->_sceneManager.changeScene(7000);
break;
}
}
void Scene2280::Action2::signal() {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(94, 117);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
scene->_soundHandler.play(265);
- _globals->_player.setVisage(2162);
- _globals->_player._frame = 1;
- _globals->_player._strip = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2162);
+ g_globals->_player._frame = 1;
+ g_globals->_player._strip = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
scene->_hotspot8.remove();
scene->_hotspot10.remove();
break;
case 2:
- _globals->_player._frame = 1;
- _globals->_player._strip = 2;
- _globals->_player.animate(ANIM_MODE_4, 3, 1, this);
+ g_globals->_player._frame = 1;
+ g_globals->_player._strip = 2;
+ g_globals->_player.animate(ANIM_MODE_4, 3, 1, this);
break;
case 3:
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.animate(ANIM_MODE_5, this);
scene->_hotspot12.remove();
break;
case 4:
scene->_soundHandler.play(266);
- _globals->_player.setVisage(2170);
- _globals->_player._frame = 1;
- _globals->_player._strip = 4;
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._moveDiff = Common::Point(4, 1);
+ g_globals->_player.setVisage(2170);
+ g_globals->_player._frame = 1;
+ g_globals->_player._strip = 4;
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._moveDiff = Common::Point(4, 1);
- _globals->setFlag(13);
+ g_globals->setFlag(13);
SceneItem::display2(2280, 37);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene2280::Action3::signal() {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(94, 117);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
scene->_soundHandler.play(265);
- _globals->_player.setVisage(2162);
- _globals->_player._frame = 6;
- _globals->_player._strip = 2;
- _globals->_player.animate(ANIM_MODE_4, 3, -1, this);
+ g_globals->_player.setVisage(2162);
+ g_globals->_player._frame = 6;
+ g_globals->_player._strip = 2;
+ g_globals->_player.animate(ANIM_MODE_4, 3, -1, this);
break;
case 2:
scene->_hotspot12.postInit();
@@ -3873,13 +3875,13 @@ void Scene2280::Action3::signal() {
scene->_hotspot12.setPosition(Common::Point(88, 76));
scene->_hotspot12.fixPriority(1);
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 3:
- _globals->_player._strip = 1;
- _globals->_player._frame = 12;
+ g_globals->_player._strip = 1;
+ g_globals->_player._frame = 12;
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 4:
scene->_hotspot8.postInit();
@@ -3900,22 +3902,22 @@ void Scene2280::Action3::signal() {
scene->_hotspot10.changeZoom(100);
scene->_hotspot10.fixPriority(1);
- _globals->clearFlag(13);
+ g_globals->clearFlag(13);
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._strip = 4;
- _globals->_player._moveDiff = Common::Point(3, 5);
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._strip = 4;
+ g_globals->_player._moveDiff = Common::Point(3, 5);
SceneItem::display2(2280, 38);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene2280::Action4::signal() {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -3924,24 +3926,24 @@ void Scene2280::Action4::signal() {
case 51: {
Common::Point pt(163, 67);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 6:
case 50: {
Common::Point pt(173, 63);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
}
break;
}
case 1:
- _globals->_player.setVisage(2161);
- _globals->_player._strip = 1;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2161);
+ g_globals->_player._strip = 1;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
switch (_state) {
@@ -3964,7 +3966,7 @@ void Scene2280::Action4::signal() {
scene->_hotspot17.fixPriority(1);
RING_INVENTORY._medkit._sceneNumber = 2280;
- _globals->_sceneItems.push_front(&scene->_hotspot17);
+ g_globals->_sceneItems.push_front(&scene->_hotspot17);
break;
case 51:
scene->_hotspot18.postInit();
@@ -3977,17 +3979,17 @@ void Scene2280::Action4::signal() {
scene->_hotspot18.fixPriority(1);
RING_INVENTORY._scanner._sceneNumber = 2280;
- _globals->_sceneItems.push_front(&scene->_hotspot18);
+ g_globals->_sceneItems.push_front(&scene->_hotspot18);
break;
}
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 3:
- _globals->_player.enableControl();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._strip = 2;
+ g_globals->_player.enableControl();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._strip = 2;
remove();
break;
@@ -3997,24 +3999,24 @@ void Scene2280::Action4::signal() {
/*--------------------------------------------------------------------------*/
void Scene2280::Hotspot1::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(16))
+ if (g_globals->getFlag(16))
SceneItem::display2(2280, 22);
else {
- _globals->setFlag(16);
+ g_globals->setFlag(16);
SceneItem::display2(2230, 21);
}
break;
case CURSOR_USE:
- if (!_globals->getFlag(15))
+ if (!g_globals->getFlag(15))
SceneItem::display2(2280, 23);
- else if (!_globals->getFlag(13))
+ else if (!g_globals->getFlag(13))
SceneItem::display2(2280, 46);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action1);
}
break;
@@ -4027,10 +4029,10 @@ void Scene2280::Hotspot1::doAction(int action) {
void Scene2280::Hotspot2::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(2))
+ if (g_globals->getFlag(2))
SceneItem::display2(2280, 1);
else {
- _globals->setFlag(2);
+ g_globals->setFlag(2);
SceneItem::display2(2280, 0);
}
break;
@@ -4046,10 +4048,10 @@ void Scene2280::Hotspot2::doAction(int action) {
void Scene2280::Hotspot4::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(21))
+ if (g_globals->getFlag(21))
SceneItem::display2(2280, 33);
else {
- _globals->setFlag(21);
+ g_globals->setFlag(21);
SceneItem::display2(2280, 32);
}
break;
@@ -4063,31 +4065,31 @@ void Scene2280::Hotspot4::doAction(int action) {
}
void Scene2280::Hotspot7::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2280, 24);
break;
case OBJECT_SCANNER:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2280, 43);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_action4._state = 51;
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_events._currentCursor = CURSOR_700;
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events._currentCursor = CURSOR_700;
scene->setAction(&scene->_action4);
}
break;
case OBJECT_MEDKIT:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2280, 43);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_action4._state = 50;
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_events._currentCursor = CURSOR_700;
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events._currentCursor = CURSOR_700;
scene->setAction(&scene->_action4);
}
break;
@@ -4098,14 +4100,14 @@ void Scene2280::Hotspot7::doAction(int action) {
}
void Scene2280::Hotspot8::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2280, 3);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action2);
break;
default:
@@ -4115,14 +4117,14 @@ void Scene2280::Hotspot8::doAction(int action) {
}
void Scene2280::Hotspot10::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2280, 4);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action2);
break;
default:
@@ -4132,14 +4134,14 @@ void Scene2280::Hotspot10::doAction(int action) {
}
void Scene2280::Hotspot12::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2280, 11);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action2);
break;
default:
@@ -4149,15 +4151,15 @@ void Scene2280::Hotspot12::doAction(int action) {
}
void Scene2280::Hotspot14::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2280, 3);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
- if (_globals->getFlag(13))
+ g_globals->_player.disableControl();
+ if (g_globals->getFlag(13))
scene->setAction(&scene->_action3);
else
scene->setAction(&scene->_action2);
@@ -4169,22 +4171,22 @@ void Scene2280::Hotspot14::doAction(int action) {
}
void Scene2280::Hotspot17::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(18))
+ if (g_globals->getFlag(18))
SceneItem::display2(2280, 26);
else {
- _globals->setFlag(18);
+ g_globals->setFlag(18);
SceneItem::display2(2280, 25);
}
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2280, 29);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_action4._state = 6;
scene->setAction(&scene->_action4);
}
@@ -4196,22 +4198,22 @@ void Scene2280::Hotspot17::doAction(int action) {
}
void Scene2280::Hotspot18::doAction(int action) {
- Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+ Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(19))
+ if (g_globals->getFlag(19))
SceneItem::display2(2280, 28);
else {
- _globals->setFlag(19);
+ g_globals->setFlag(19);
SceneItem::display2(2280, 27);
}
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2280, 29);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_action4._state = 1;
scene->setAction(&scene->_action4);
}
@@ -4252,7 +4254,7 @@ void Scene2280::postInit(SceneObjectList *OwnerList) {
_hotspot17.setPosition(Common::Point(162, 39));
_hotspot17.fixPriority(1);
- _globals->_sceneItems.push_back(&_hotspot17);
+ g_globals->_sceneItems.push_back(&_hotspot17);
}
if (RING_INVENTORY._scanner._sceneNumber == 2280) {
@@ -4263,10 +4265,10 @@ void Scene2280::postInit(SceneObjectList *OwnerList) {
_hotspot17.setPosition(Common::Point(152, 43));
_hotspot17.fixPriority(1);
- _globals->_sceneItems.push_back(&_hotspot17);
+ g_globals->_sceneItems.push_back(&_hotspot17);
}
- if (!_globals->getFlag(13)) {
+ if (!g_globals->getFlag(13)) {
_hotspot8.postInit();
_hotspot8.setVisage(2280);
_hotspot8._strip = 2;
@@ -4287,7 +4289,7 @@ void Scene2280::postInit(SceneObjectList *OwnerList) {
_hotspot12.setPosition(Common::Point(88, 76));
_hotspot12.fixPriority(1);
- _globals->_sceneItems.addItems(&_hotspot8, &_hotspot10, &_hotspot12, NULL);
+ g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot10, &_hotspot12, NULL);
}
_hotspot14.setBounds(Rect(70, 50, 90, 104));
@@ -4320,47 +4322,47 @@ void Scene2280::postInit(SceneObjectList *OwnerList) {
_exitRect = Rect(145, 180, 195, 195);
- _globals->_player.postInit();
- _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(146, 161));
- _globals->_player.changeZoom(-1);
- _globals->_player._moveDiff = Common::Point(4, 3);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(g_globals->getFlag(13) ? 2170 : 0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(146, 161));
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player._moveDiff = Common::Point(4, 3);
- if ((_globals->_sceneManager._previousScene != 7300) && (_globals->_sceneManager._previousScene != 7000)) {
- _globals->_player.enableControl();
+ if ((g_globals->_sceneManager._previousScene != 7300) && (g_globals->_sceneManager._previousScene != 7000)) {
+ g_globals->_player.enableControl();
} else {
- _globals->setFlag(109);
- _globals->_player.fixPriority(76);
- _globals->_player.disableControl();
+ g_globals->setFlag(109);
+ g_globals->_player.fixPriority(76);
+ g_globals->_player.disableControl();
_sceneMode = 2281;
- setAction(&_sequenceManager, this, 2281, &_globals->_player, &_hotspot16, NULL);
+ setAction(&_sequenceManager, this, 2281, &g_globals->_player, &_hotspot16, NULL);
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
}
- _globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7,
+ g_globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7,
&_hotspot6, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot1, &_hotspot16, &_hotspot15, NULL);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
}
void Scene2280::signal() {
if (_sceneMode == 2281) {
- _globals->_player.fixPriority(-1);
- _globals->_player.enableControl();
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.enableControl();
}
}
void Scene2280::dispatch() {
Scene::dispatch();
if (!_action) {
- if (_exitRect.contains(_globals->_player._position))
- _globals->_sceneManager.changeScene(2150);
+ if (_exitRect.contains(g_globals->_player._position))
+ g_globals->_sceneManager.changeScene(2150);
}
}
@@ -4376,7 +4378,7 @@ void Scene2280::synchronize(Serializer &s) {
void Scene2300::Action1::signal() {
// Quinn and Seeker
- Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+ Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -4403,8 +4405,8 @@ void Scene2300::Action1::signal() {
}
case 3:
setDelay(2);
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_WALK);
break;
case 4: {
scene->_hotspot5.setVisage(93);
@@ -4429,23 +4431,23 @@ void Scene2300::Action1::signal() {
}
case 6:
scene->_soundHandler1.play(28);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_hotspot2.setVisage(40);
scene->_hotspot2.setStrip(4);
scene->_hotspot2.setFrame(1);
scene->_hotspot2.animate(ANIM_MODE_5, NULL);
- _globals->_player.setVisage(40);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(40);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 7:
- _globals->_soundHandler.play(77, this);
+ g_globals->_soundHandler.play(77, this);
break;
case 8:
- _globals->_game->endGame(2300, 0);
+ g_globals->_game->endGame(2300, 0);
remove();
break;
case 9:
@@ -4457,17 +4459,17 @@ void Scene2300::Action1::signal() {
scene->_hotspot5.animate(ANIM_MODE_NONE, NULL);
scene->_hotspot6.animate(ANIM_MODE_NONE, NULL);
- _globals->_player.disableControl();
- _globals->_player.setVisage(2672);
- _globals->_player._strip = 5;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.disableControl();
+ g_globals->_player.setVisage(2672);
+ g_globals->_player._strip = 5;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 10:
- _globals->_player.setVisage(2674);
- _globals->_player._strip = 5;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2674);
+ g_globals->_player._strip = 5;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 11:
scene->_soundHandler1.play(28);
@@ -4481,17 +4483,17 @@ void Scene2300::Action1::signal() {
scene->_hotspot5.fixPriority(20);
scene->_hotspot6.fixPriority(20);
- _globals->_player.setVisage(2672);
- _globals->_player._strip = 5;
- _globals->_player._frame = _globals->_player.getFrameCount();
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.setVisage(2672);
+ g_globals->_player._strip = 5;
+ g_globals->_player._frame = g_globals->_player.getFrameCount();
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 12:
scene->_soundHandler1.play(77);
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(4);
- _globals->_player._uiEnabled = false;
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(4);
+ g_globals->_player._uiEnabled = false;
setDelay(60);
break;
case 13:
@@ -4504,7 +4506,7 @@ void Scene2300::Action1::signal() {
case 15: {
Common::Point pt1(101, 148);
PlayerMover *mover1 = new PlayerMover();
- _globals->_player.addMover(mover1, &pt1, this);
+ g_globals->_player.addMover(mover1, &pt1, this);
Common::Point pt2(scene->_hotspot5._position.x + 5, scene->_hotspot5._position.y + 5);
NpcMover *mover2 = new NpcMover();
@@ -4512,7 +4514,7 @@ void Scene2300::Action1::signal() {
break;
}
case 16:
- _globals->_sceneManager.changeScene(2000);
+ g_globals->_sceneManager.changeScene(2000);
remove();
break;
}
@@ -4520,29 +4522,29 @@ void Scene2300::Action1::signal() {
void Scene2300::Action2::signal() {
// Miranda tearing cables
- Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+ Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(30);
break;
case 1: {
Common::Point pt(153, 135);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(2030, this);
break;
case 3:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
setDelay(600);
break;
case 4: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_hotspot2.postInit();
scene->_hotspot2.setVisage(2801);
@@ -4580,34 +4582,34 @@ void Scene2300::Action2::signal() {
scene->_stripManager.start(2035, this);
break;
case 10:
- _globals->_sceneManager.changeScene(2310);
+ g_globals->_sceneManager.changeScene(2310);
break;
}
}
void Scene2300::Action3::signal() {
// Stunned Miranda
- Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+ Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
Common::Point pt(153, 135);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
- _globals->_player.disableControl();
- _globals->_player.setVisage(2672);
- _globals->_player._strip = 2;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.disableControl();
+ g_globals->_player.setVisage(2672);
+ g_globals->_player._strip = 2;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- _globals->_player.setVisage(2674);
- _globals->_player._strip = 2;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2674);
+ g_globals->_player._strip = 2;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 3:
scene->_soundHandler1.play(97);
@@ -4617,30 +4619,30 @@ void Scene2300::Action3::signal() {
scene->_hotspot7._frame = 1;
scene->_hotspot7.animate(ANIM_MODE_5, this);
- _globals->_player.setVisage(2672);
- _globals->_player._strip = 2;
- _globals->_player._frame = _globals->_player.getFrameCount();
- _globals->_player.animate(ANIM_MODE_6, NULL);
+ g_globals->_player.setVisage(2672);
+ g_globals->_player._strip = 2;
+ g_globals->_player._frame = g_globals->_player.getFrameCount();
+ g_globals->_player.animate(ANIM_MODE_6, NULL);
break;
case 4:
scene->_soundHandler2.play(97);
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(1);
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(1);
scene->_stripManager.start(2034, this);
break;
case 5:
setDelay(10);
break;
case 6:
- _globals->_sceneManager.changeScene(2310);
+ g_globals->_sceneManager.changeScene(2310);
break;
}
}
void Scene2300::Action4::signal() {
// Ennemies coming
- Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+ Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -4679,12 +4681,12 @@ void Scene2300::Action4::signal() {
void Scene2300::Hotspot5::doAction(int action) {
// Ennemies
- Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+ Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
- _globals->_player.disableControl();
- _globals->_player.addMover(NULL);
+ g_globals->_player.disableControl();
+ g_globals->_player.addMover(NULL);
scene->_action1.setActionIndex(9);
scene->_action1.setDelay(1);
break;
@@ -4702,7 +4704,7 @@ void Scene2300::Hotspot5::doAction(int action) {
void Scene2300::Hotspot7::doAction(int action) {
// Miranda
- Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+ Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -4747,8 +4749,8 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {
_hotspot8.setVisage(2301);
_hotspot8.setPosition(Common::Point(288, 74));
- _globals->_soundHandler.play(96);
- if (_globals->_sceneManager._previousScene == 2000) {
+ g_globals->_soundHandler.play(96);
+ if (g_globals->_sceneManager._previousScene == 2000) {
_hotspot8.remove();
_hotspot9.postInit();
@@ -4764,13 +4766,13 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {
_hotspot10._frame = _hotspot10.getFrameCount();
_hotspot10.setPosition(Common::Point(292, 113));
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.setPosition(Common::Point(109, 139));
- _globals->_player.changeZoom(40);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setPosition(Common::Point(109, 139));
+ g_globals->_player.changeZoom(40);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.disableControl();
_hotspot7.postInit();
_hotspot7.setVisage(2302);
@@ -4780,7 +4782,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {
_soundHandler1.play(95);
_soundHandler2.play(96);
- _globals->_sceneItems.push_back(&_hotspot7);
+ g_globals->_sceneItems.push_back(&_hotspot7);
setAction(&_action2);
} else {
@@ -4805,13 +4807,13 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {
_hotspot1.setPosition(Common::Point(255, 190));
_hotspot1.changeZoom(40);
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.setPosition(Common::Point(203, 191));
- _globals->_player.changeZoom(40);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setPosition(Common::Point(203, 191));
+ g_globals->_player.changeZoom(40);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.disableControl();
_hotspot5.postInit();
_hotspot5.setVisage(91);
@@ -4827,7 +4829,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {
_hotspot6.changeZoom(40);
_hotspot6.setObjectWrapper(new SceneObjectWrapper());
- _globals->_sceneItems.push_back(&_hotspot5);
+ g_globals->_sceneItems.push_back(&_hotspot5);
setAction(&_action1);
}
@@ -4837,7 +4839,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) {
_hotspot14._sceneRegionId = 11;
_hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- _globals->_sceneItems.addItems(&_hotspot12, &_hotspot11, &_hotspot13, &_hotspot14, &_hotspot15, NULL);
+ g_globals->_sceneItems.addItems(&_hotspot12, &_hotspot11, &_hotspot13, &_hotspot14, &_hotspot15, NULL);
}
/*--------------------------------------------------------------------------
@@ -4891,20 +4893,20 @@ void Scene2310::postInit(SceneObjectList *OwnerList) {
_wireList[idx].setPosition(pointList[idx]);
}
- _globals->_player.disableControl();
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.disableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
- if (_vm->getFeatures() & GF_CD)
- _pageIndex = _globals->_randomSource.getRandomNumber(14) + 2;
+ if (g_vm->getFeatures() & GF_CD)
+ _pageIndex = g_globals->_randomSource.getRandomNumber(14) + 2;
else
- _pageIndex = _globals->_randomSource.getRandomNumber(19) + 1;
+ _pageIndex = g_globals->_randomSource.getRandomNumber(19) + 1;
signal();
}
void Scene2310::signal() {
switch (_sceneMode++) {
case 0: {
- Common::String fmtString = _resourceManager->getMessage(2300, 22);
+ Common::String fmtString = g_resourceManager->getMessage(2300, 22);
Common::String msg = Common::String::format(fmtString.c_str(), _pageList[_pageIndex]._pageNumber);
_sceneText._width = 280;
@@ -4917,18 +4919,18 @@ void Scene2310::signal() {
break;
}
case 1: {
- Common::String msg = _resourceManager->getMessage(2300, 23);
+ Common::String msg = g_resourceManager->getMessage(2300, 23);
_sceneText.setup(msg);
_sceneText.fixPriority(255);
_sceneText.setPosition(Common::Point(30, 170));
- _globals->_sceneObjects->draw();
- _globals->_events.waitForPress();
+ g_globals->_sceneObjects->draw();
+ g_globals->_events.waitForPress();
_sceneText.hide();
- _globals->_sceneObjects->draw();
+ g_globals->_sceneObjects->draw();
- _globals->_sceneManager.changeScene(2200);
+ g_globals->_sceneManager.changeScene(2200);
break;
}
}
@@ -4964,11 +4966,11 @@ void Scene2310::process(Event &event) {
if (idx != 5) {
_wireList[idx].hide();
- _globals->_sceneObjects->draw();
+ g_globals->_sceneObjects->draw();
_wireList[idx].setFrame(frameNum);
_wireList[idx].show();
- _globals->_sceneObjects->draw();
+ g_globals->_sceneObjects->draw();
}
} else {
// End the moving of the currently active wire
@@ -5001,7 +5003,7 @@ void Scene2310::process(Event &event) {
void Scene2310::dispatch() {
if (_wireIndex != 5) {
for (int idx = 0; idx < 5; ++idx) {
- if (_rectList[idx].contains(_globals->_events._mousePos)) {
+ if (_rectList[idx].contains(g_globals->_events._mousePos)) {
_wireList[_wireIndex].setFrame(idx + 2);
return;
}
@@ -5026,12 +5028,12 @@ int Scene2310::findObject(int objIndex) {
*--------------------------------------------------------------------------*/
void Scene2320::Action1::signal() {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(10);
- if (_globals->_sceneManager._previousScene == 2120)
+ if (g_globals->_sceneManager._previousScene == 2120)
_actionIndex = 3;
break;
case 1: {
@@ -5058,7 +5060,7 @@ void Scene2320::Action1::signal() {
}
void Scene2320::Action2::signal() {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -5078,13 +5080,13 @@ void Scene2320::Action2::signal() {
}
void Scene2320::Action3::signal() {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
Common::Point pt(320, 86);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 1:
@@ -5094,12 +5096,12 @@ void Scene2320::Action3::signal() {
case 2: {
Common::Point pt(320, 79);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3:
- _globals->_player.fixPriority(scene->_hotspot6._priority - 1);
- _globals->_player._strip = 3;
+ g_globals->_player.fixPriority(scene->_hotspot6._priority - 1);
+ g_globals->_player._strip = 3;
setDelay(10);
break;
case 4:
@@ -5110,12 +5112,12 @@ void Scene2320::Action3::signal() {
scene->_area3.draw(true);
_state = 0;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
- while (!_state && !_vm->getEventManager()->shouldQuit()) {
+ while (!_state && !g_vm->shouldQuit()) {
// Wait for an event
Event event;
- if (!_globals->_events.getEvent(event)) {
+ if (!g_globals->_events.getEvent(event)) {
g_system->updateScreen();
g_system->delayMillis(10);
continue;
@@ -5152,13 +5154,13 @@ void Scene2320::Action3::signal() {
break;
case 5: {
if (_state == 2320)
- _globals->_player.fixPriority(-1);
+ g_globals->_player.fixPriority(-1);
else
- _globals->_sceneManager.changeScene(_state);
+ g_globals->_sceneManager.changeScene(_state);
Common::Point pt(320, 86);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 6:
@@ -5166,7 +5168,7 @@ void Scene2320::Action3::signal() {
scene->_hotspot6.animate(ANIM_MODE_6, this);
break;
case 7:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -5174,28 +5176,28 @@ void Scene2320::Action3::signal() {
void Scene2320::Action4::signal() {
// Fly Cycle actions
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1: {
Common::Point pt(213, 84);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
case 16:
- _globals->_player.setVisage(2109);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2109);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 3:
- _globals->_player.animate(ANIM_MODE_6, NULL);
+ g_globals->_player.animate(ANIM_MODE_6, NULL);
setAction(&scene->_action2, this);
break;
case 4: {
@@ -5220,63 +5222,63 @@ void Scene2320::Action4::signal() {
}
case 6: {
scene->_hotspot16.fixPriority(-1);
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
Common::Point pt(233, 176);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 7: {
Common::Point pt(291, 194);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 8:
- _globals->_player.setStrip(5);
- _globals->_player.setFrame(1);
+ g_globals->_player.setStrip(5);
+ g_globals->_player.setFrame(1);
setDelay(13);
break;
case 9:
// Quinn sits in the flycycle
scene->_hotspot16.hide();
- _globals->_player.setVisage(2323);
- _globals->_player.setPosition(Common::Point(303, 176));
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2323);
+ g_globals->_player.setPosition(Common::Point(303, 176));
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 10:
- if (_globals->getFlag(109)) {
- _globals->_soundHandler.play(40);
- _globals->_soundHandler.holdAt(true);
+ if (g_globals->getFlag(109)) {
+ g_globals->_soundHandler.play(40);
+ g_globals->_soundHandler.holdAt(true);
Common::Point pt(303, 240);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
} else {
setDelay(3);
}
break;
case 11:
- if (_globals->getFlag(109)) {
- _globals->_sceneManager.changeScene(7600);
+ if (g_globals->getFlag(109)) {
+ g_globals->_sceneManager.changeScene(7600);
} else {
SceneItem::display2(2320, 19);
setDelay(3);
}
break;
case 12:
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 13:
- _globals->_player.setVisage(0);
- _globals->_player.setPosition(Common::Point(291, 194));
- _globals->_player.setStrip(5);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setPosition(Common::Point(291, 194));
+ g_globals->_player.setStrip(5);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
scene->_hotspot16.show();
setDelay(3);
@@ -5284,17 +5286,17 @@ void Scene2320::Action4::signal() {
case 14: {
Common::Point pt(233, 176);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 15: {
Common::Point pt(213, 85);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 17: {
- _globals->_player.animate(ANIM_MODE_6, NULL);
+ g_globals->_player.animate(ANIM_MODE_6, NULL);
scene->_hotspot16.fixPriority(160);
Common::Point pt(320, 121);
@@ -5320,9 +5322,9 @@ void Scene2320::Action4::signal() {
break;
}
case 20:
- _globals->_player.enableControl();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.enableControl();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
scene->_hotspot13.fixPriority(1);
remove();
@@ -5331,11 +5333,11 @@ void Scene2320::Action4::signal() {
}
void Scene2320::Action5::signal() {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
ADD_PLAYER_MOVER(163, 126);
break;
case 1:
@@ -5345,29 +5347,29 @@ void Scene2320::Action5::signal() {
setDelay(2);
break;
case 3:
- if (!_globals->getFlag(59))
+ if (!g_globals->getFlag(59))
setDelay(10);
else
scene->_stripManager.start(2323, this);
break;
case 4:
- _globals->_player.setVisage(2347);
- _globals->_player.setStrip(1);
- _globals->_player.setFrame(1);
- _globals->_player.fixPriority(137);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2347);
+ g_globals->_player.setStrip(1);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.fixPriority(137);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 5:
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 6:
- if (_globals->getFlag(72))
- _globals->_sceneManager.changeScene(7000);
- else if (_globals->getFlag(59))
- _globals->_sceneManager.changeScene(5000);
- else if (!_globals->getFlag(43) || (RING_INVENTORY._ale._sceneNumber != 1))
+ if (g_globals->getFlag(72))
+ g_globals->_sceneManager.changeScene(7000);
+ else if (g_globals->getFlag(59))
+ g_globals->_sceneManager.changeScene(5000);
+ else if (!g_globals->getFlag(43) || (RING_INVENTORY._ale._sceneNumber != 1))
setDelay(10);
else {
scene->_hotspot11.setAction(NULL);
@@ -5379,7 +5381,7 @@ void Scene2320::Action5::signal() {
NpcMover *mover = new NpcMover();
scene->_hotspot11.addMover(mover, &pt, NULL);
- _globals->clearFlag(43);
+ g_globals->clearFlag(43);
scene->_stripManager.start(2325, this);
}
break;
@@ -5387,82 +5389,82 @@ void Scene2320::Action5::signal() {
setDelay(10);
break;
case 8:
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_sceneManager.changeScene(4000);
break;
}
}
void Scene2320::Action6::signal() {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(30);
break;
case 1:
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 2:
- _globals->_player.setStrip(1);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.setStrip(1);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 3:
- _globals->_player.setVisage(0);
- _globals->_player.setStrip(3);
- _globals->_player.fixPriority(-1);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setStrip(3);
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
setDelay(60);
break;
case 4:
- if ((_globals->_sceneManager._previousScene != 4000) || _globals->getFlag(43))
+ if ((g_globals->_sceneManager._previousScene != 4000) || g_globals->getFlag(43))
setDelay(3);
- else if (_globals->getFlag(35)) {
- _globals->setFlag(43);
+ else if (g_globals->getFlag(35)) {
+ g_globals->setFlag(43);
scene->_stripManager.start(4200, this);
- _globals->setFlag(69);
- } else if (_globals->getFlag(36)) {
+ g_globals->setFlag(69);
+ } else if (g_globals->getFlag(36)) {
setDelay(3);
} else {
- _globals->setFlag(43);
+ g_globals->setFlag(43);
scene->_stripManager.start(4210, this);
break;
}
break;
case 5:
- if (_globals->_sceneObjects->contains(&scene->_hotspot11)) {
+ if (g_globals->_sceneObjects->contains(&scene->_hotspot11)) {
scene->_hotspot11.setAction(&scene->_action1);
- if (_globals->_sceneObjects->contains(&scene->_hotspot10)) {
+ if (g_globals->_sceneObjects->contains(&scene->_hotspot10)) {
ADD_MOVER(scene->_hotspot10, 491, 160);
} else {
setDelay(60);
}
- _globals->_sceneItems.push_front(&scene->_hotspot11);
+ g_globals->_sceneItems.push_front(&scene->_hotspot11);
} else {
setDelay(3);
}
break;
case 6:
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player.enableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene2320::Action7::signal() {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(30);
break;
case 1:
- _globals->_soundHandler.play(162);
+ g_globals->_soundHandler.play(162);
scene->_hotspot6.animate(ANIM_MODE_5, this);
break;
case 2:
@@ -5471,8 +5473,8 @@ void Scene2320::Action7::signal() {
scene->_hotspot11.fixPriority(-1);
ADD_MOVER_NULL(scene->_hotspot11, 346, 85);
- _globals->_player.fixPriority(-1);
- ADD_MOVER(_globals->_player, 297, 89);
+ g_globals->_player.fixPriority(-1);
+ ADD_MOVER(g_globals->_player, 297, 89);
break;
case 3:
ADD_PLAYER_MOVER(462, 182);
@@ -5483,17 +5485,17 @@ void Scene2320::Action7::signal() {
case 5:
ADD_MOVER(scene->_hotspot11, 500, 164);
ADD_MOVER(scene->_hotspot10, 382, 93);
- _globals->_player.setStrip(3);
+ g_globals->_player.setStrip(3);
break;
case 6:
ADD_MOVER_NULL(scene->_hotspot10, 491, 160);
- ADD_MOVER(_globals->_player, 391, 88);
+ ADD_MOVER(g_globals->_player, 391, 88);
break;
case 7:
ADD_PLAYER_MOVER(462, 182);
break;
case 8:
- _globals->_player.setStrip(7);
+ g_globals->_player.setStrip(7);
setDelay(15);
break;
case 9:
@@ -5506,14 +5508,14 @@ void Scene2320::Action7::signal() {
scene->_stripManager.start(6022, this);
break;
case 12:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
RING_INVENTORY._stasisBox._sceneNumber = 2320;
break;
}
}
void Scene2320::Action8::signal() {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -5523,24 +5525,24 @@ void Scene2320::Action8::signal() {
ADD_PLAYER_MOVER(462, 182);
break;
case 2:
- _globals->_player.setStrip(7);
+ g_globals->_player.setStrip(7);
setDelay(5);
break;
case 3:
- scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10));
- scene->_stripManager.start(_globals->getFlag(75) ? 6030 : 2320, this);
+ scene->_speakerGameText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 30, 10));
+ scene->_stripManager.start(g_globals->getFlag(75) ? 6030 : 2320, this);
break;
case 4:
- if (_globals->getFlag(75))
+ if (g_globals->getFlag(75))
setDelay(3);
else
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 5:
RING_INVENTORY._stasisBox._sceneNumber = 2320;
scene->_sceneMode = 2326;
- scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10));
- scene->setAction(&scene->_sequenceManager1, scene, 2326, &_globals->_player, &scene->_hotspot11, NULL);
+ scene->_speakerGameText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 30, 10));
+ scene->setAction(&scene->_sequenceManager1, scene, 2326, &g_globals->_player, &scene->_hotspot11, NULL);
break;
}
}
@@ -5548,16 +5550,16 @@ void Scene2320::Action8::signal() {
/*--------------------------------------------------------------------------*/
void Scene2320::Hotspot5::doAction(int action) {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2320, 13);
break;
case CURSOR_USE:
- if (_globals->getFlag(70))
+ if (g_globals->getFlag(70))
SceneItem::display2(2320, 33);
- else if (_globals->getFlag(13))
+ else if (g_globals->getFlag(13))
SceneItem::display2(2320, 18);
else
scene->setAction(&scene->_action5);
@@ -5569,14 +5571,14 @@ void Scene2320::Hotspot5::doAction(int action) {
}
void Scene2320::Hotspot6::doAction(int action) {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2320, 2);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action3);
break;
default:
@@ -5586,7 +5588,7 @@ void Scene2320::Hotspot6::doAction(int action) {
}
void Scene2320::Hotspot8::doAction(int action) {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -5594,7 +5596,7 @@ void Scene2320::Hotspot8::doAction(int action) {
break;
case CURSOR_USE:
scene->_sceneMode = 2336;
- scene->setAction(&scene->_sequenceManager1, scene, 2336, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 2336, &g_globals->_player, this, NULL);
break;
default:
SceneHotspot::doAction(action);
@@ -5604,21 +5606,21 @@ void Scene2320::Hotspot8::doAction(int action) {
void Scene2320::Hotspot10::doAction(int action) {
// Seeker
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2320, 26);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2329;
- if (_globals->getFlag(13)) {
+ if (g_globals->getFlag(13)) {
scene->_stripManager.start(2337, scene);
- } else if (_globals->getFlag(70)) {
+ } else if (g_globals->getFlag(70)) {
scene->setAction(&scene->_action8);
- } else if (_globals->getFlag(109)) {
+ } else if (g_globals->getFlag(109)) {
scene->setAction(&scene->_sequenceManager1, scene, 2337, NULL);
} else if (!_state) {
++_state;
@@ -5634,29 +5636,29 @@ void Scene2320::Hotspot10::doAction(int action) {
}
void Scene2320::Hotspot11::doAction(int action) {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2320, 25);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2329;
- if (_globals->getFlag(13)) {
- _globals->_player.disableControl();
+ if (g_globals->getFlag(13)) {
+ g_globals->_player.disableControl();
scene->_sceneMode = 5000;
scene->_stripManager.start(2336, scene);
- } else if (_globals->getFlag(70)) {
+ } else if (g_globals->getFlag(70)) {
scene->setAction(&scene->_action8);
} else {
scene->_sceneMode = 2329;
if (RING_INVENTORY._ale._sceneNumber == 1) {
scene->setAction(&scene->_sequenceManager1, scene, 2329, NULL);
- } else if (!_globals->getFlag(110)) {
- _globals->setFlag(110);
+ } else if (!g_globals->getFlag(110)) {
+ g_globals->setFlag(110);
scene->setAction(&scene->_sequenceManager1, scene, 2330, NULL);
} else if (RING_INVENTORY._peg._sceneNumber != 1) {
scene->setAction(&scene->_sequenceManager1, scene, 2331, NULL);
@@ -5675,19 +5677,19 @@ void Scene2320::Hotspot11::doAction(int action) {
}
void Scene2320::Hotspot12::doAction(int action) {
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2320, 5);
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2320, 24);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 2322;
- scene->setAction(&scene->_sequenceManager1, scene, 2322, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 2322, &g_globals->_player, NULL);
}
break;
default:
@@ -5698,23 +5700,23 @@ void Scene2320::Hotspot12::doAction(int action) {
void Scene2320::Hotspot14::doAction(int action) {
// Right Console
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2320, 17);
break;
case CURSOR_USE:
- if (_globals->getFlag(24)) {
- _globals->clearFlag(24);
- _globals->_player.disableControl();
+ if (g_globals->getFlag(24)) {
+ g_globals->clearFlag(24);
+ g_globals->_player.disableControl();
scene->_hotspot8.postInit();
scene->_hotspot8.setVisage(2345);
scene->_hotspot8.setPosition(Common::Point(634, 65));
scene->_hotspot8.hide();
- _globals->_sceneItems.push_front(&scene->_hotspot8);
+ g_globals->_sceneItems.push_front(&scene->_hotspot8);
RING_INVENTORY._waldos._sceneNumber = 2320;
scene->_hotspot9.postInit();
@@ -5731,11 +5733,11 @@ void Scene2320::Hotspot14::doAction(int action) {
scene->_hotspot16.hide();
scene->_sceneMode = 2324;
- scene->setAction(&scene->_sequenceManager1, scene, 2324, &_globals->_player, &scene->_hotspot7,
+ scene->setAction(&scene->_sequenceManager1, scene, 2324, &g_globals->_player, &scene->_hotspot7,
&scene->_hotspot8, &scene->_hotspot9, &scene->_hotspot16, NULL);
- } else if (_globals->getFlag(13)) {
+ } else if (g_globals->getFlag(13)) {
SceneItem::display2(2320, 24);
- } else if (!_globals->getFlag(76)) {
+ } else if (!g_globals->getFlag(76)) {
SceneItem::display2(2320, 28);
} else if (!RING_INVENTORY._waldos._sceneNumber) {
SceneItem::display2(2320, 27);
@@ -5751,14 +5753,14 @@ void Scene2320::Hotspot14::doAction(int action) {
void Scene2320::Hotspot15::doAction(int action) {
// Left console (Flycycle console)
- Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+ Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(2320, 16);
break;
case CURSOR_USE:
- if (_globals->getFlag(13))
+ if (g_globals->getFlag(13))
SceneItem::display2(2320, 24);
else
scene->setAction(&scene->_action4);
@@ -5806,7 +5808,7 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerGameText);
_speakerMText._npc = &_hotspot11;
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
_hotspotPtr = &_hotspot10;
_hotspot6.postInit();
@@ -5836,33 +5838,33 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_hotspot8.setPosition(Common::Point(541, 103));
_hotspot8.fixPriority(201);
- _globals->_sceneItems.push_back(&_hotspot8);
+ g_globals->_sceneItems.push_back(&_hotspot8);
}
- if (_globals->getFlag(43)) {
+ if (g_globals->getFlag(43)) {
_hotspot11.postInit();
_hotspot11.setVisage(2705);
_hotspot11._strip = 3;
_hotspot11.setPosition(Common::Point(510, 156));
- _globals->_sceneItems.push_back(&_hotspot11);
+ g_globals->_sceneItems.push_back(&_hotspot11);
_hotspot11._state = 0;
_hotspot11.setAction(&_action1);
}
- _globals->_player.postInit();
- if (_globals->getFlag(13))
- _globals->_player.setVisage(2170);
+ g_globals->_player.postInit();
+ if (g_globals->getFlag(13))
+ g_globals->_player.setVisage(2170);
else
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(320, 79));
- _globals->_player.fixPriority(10);
- _globals->_player.changeZoom(-1);
- _globals->_player._moveDiff.y = 3;
- _globals->_player.disableControl();
-
- if (_globals->getFlag(114)) {
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(320, 79));
+ g_globals->_player.fixPriority(10);
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player._moveDiff.y = 3;
+ g_globals->_player.disableControl();
+
+ if (g_globals->getFlag(114)) {
_hotspot10.postInit();
_hotspot10.setVisage(2806);
_hotspot10.setPosition(Common::Point(481, 162));
@@ -5870,10 +5872,10 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_hotspot10.setStrip(5);
_hotspot10._state = 0;
- _globals->_sceneItems.push_back(&_hotspot10);
+ g_globals->_sceneItems.push_back(&_hotspot10);
}
- if (_globals->getFlag(70)) {
+ if (g_globals->getFlag(70)) {
_hotspot11.postInit();
_hotspot11.setVisage(2705);
_hotspot11.setPosition(Common::Point(500, 164));
@@ -5884,20 +5886,20 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_hotspot10.changeZoom(-1);
_hotspot10.setStrip(5);
- _globals->_sceneItems.addItems(&_hotspot11, &_hotspot10, NULL);
+ g_globals->_sceneItems.addItems(&_hotspot11, &_hotspot10, NULL);
}
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 2120:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
- _globals->_player.fixPriority(-1);
- _globals->_player.setPosition(Common::Point(389, 72));
- _globals->_player.enableControl();
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.setPosition(Common::Point(389, 72));
+ g_globals->_player.enableControl();
break;
case 4000:
- if (!_globals->getFlag(36) && !_globals->getFlag(43)) {
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) {
_hotspot11.postInit();
_hotspot11.setVisage(2705);
_hotspot11.setPosition(Common::Point(178, 118));
@@ -5907,25 +5909,25 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
case 4250:
case 5000:
case 7000:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
- if ((_globals->_sceneManager._previousScene == 7000) && !_globals->getFlag(80))
- _globals->setFlag(36);
-
- _globals->_player.disableControl();
- _globals->_player.animate(ANIM_MODE_NONE, NULL);
- _globals->_player.setObjectWrapper(NULL);
- _globals->_player.setVisage(2347);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(5);
- _globals->_player.fixPriority(137);
- _globals->_player.setPosition(Common::Point(165, 132));
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
+ if ((g_globals->_sceneManager._previousScene == 7000) && !g_globals->getFlag(80))
+ g_globals->setFlag(36);
+
+ g_globals->_player.disableControl();
+ g_globals->_player.animate(ANIM_MODE_NONE, NULL);
+ g_globals->_player.setObjectWrapper(NULL);
+ g_globals->_player.setVisage(2347);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(5);
+ g_globals->_player.fixPriority(137);
+ g_globals->_player.setPosition(Common::Point(165, 132));
setAction(&_action6);
break;
case 6100:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
_hotspot8.postInit();
_hotspot8.setVisage(2345);
@@ -5933,19 +5935,19 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_hotspot8.hide();
_sceneMode = 2325;
- setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);
+ setAction(&_sequenceManager1, this, 2325, &g_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);
break;
case 7600:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
_soundHandler.play(21);
- _globals->_player.setVisage(2323);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(_globals->_player.getFrameCount());
- _globals->_player.setPosition(Common::Point(303, 176));
- _globals->_player.fixPriority(-1);
- _globals->_player.disableControl();
+ g_globals->_player.setVisage(2323);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(g_globals->_player.getFrameCount());
+ g_globals->_player.setPosition(Common::Point(303, 176));
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.disableControl();
_hotspot13.setPosition(Common::Point(319, 199));
@@ -5957,14 +5959,14 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_hotspot16.hide();
_sceneMode = 2338;
- setAction(&_sequenceManager1, this, 2338, &_globals->_player, &_hotspot16, &_hotspot13, NULL);
+ setAction(&_sequenceManager1, this, 2338, &g_globals->_player, &_hotspot16, &_hotspot13, NULL);
break;
default:
- switch (_globals->_stripNum) {
+ switch (g_globals->_stripNum) {
case 2101:
- _globals->_player.disableControl();
- _globals->_player.setStrip(3);
- _globals->_player.setPosition(Common::Point(307, 84));
+ g_globals->_player.disableControl();
+ g_globals->_player.setStrip(3);
+ g_globals->_player.setPosition(Common::Point(307, 84));
_hotspot11.postInit();
_hotspot11.setVisage(2705);
@@ -5992,21 +5994,21 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_hotspot8.hide();
_sceneMode = 2325;
- setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);
+ setAction(&_sequenceManager1, this, 2325, &g_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);
break;
default:
- _globals->_soundHandler.play(160);
- _globals->_soundHandler.holdAt(true);
+ g_globals->_soundHandler.play(160);
+ g_globals->_soundHandler.holdAt(true);
_sceneMode = 2321;
- _globals->_player.setStrip(3);
- setAction(&_sequenceManager1, this, 2321, &_globals->_player, &_hotspot6, NULL);
+ g_globals->_player.setStrip(3);
+ setAction(&_sequenceManager1, this, 2321, &g_globals->_player, &_hotspot6, NULL);
break;
}
}
- _globals->_stripNum = 0;
- _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
+ g_globals->_stripNum = 0;
+ g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position);
loadScene(2320);
_hotspot14._sceneRegionId = 8;
@@ -6017,7 +6019,7 @@ void Scene2320::postInit(SceneObjectList *OwnerList) {
_hotspot5.setBounds(Rect(104, 122, 174, 157));
_hotspot15.setBounds(Rect(191, 53, 205, 63));
- _globals->_sceneItems.addItems(&_hotspot14, &_hotspot15, &_hotspot5, &_hotspot6, &_hotspot12,
+ g_globals->_sceneItems.addItems(&_hotspot14, &_hotspot15, &_hotspot5, &_hotspot6, &_hotspot12,
&_hotspot13, &_hotspot4, &_hotspot3, &_hotspot2, &_hotspot1, NULL);
}
@@ -6031,40 +6033,40 @@ void Scene2320::signal() {
case 2321:
case 2327:
case 2329:
- if (_globals->getFlag(43) && !_hotspot11._action)
+ if (g_globals->getFlag(43) && !_hotspot11._action)
_hotspot11.setAction(&_action1);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 2322:
- _globals->_sceneManager.changeScene(2120);
+ g_globals->_sceneManager.changeScene(2120);
break;
case 2323:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
break;
case 2338:
case 2324:
_hotspot16.remove();
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 2325:
- _globals->setFlag(76);
- _globals->clearFlag(70);
- _globals->_stripNum = 6100;
- _globals->_sceneManager.changeScene(2100);
+ g_globals->setFlag(76);
+ g_globals->clearFlag(70);
+ g_globals->_stripNum = 6100;
+ g_globals->_sceneManager.changeScene(2100);
break;
case 2326:
- _globals->clearFlag(70);
+ g_globals->clearFlag(70);
RING_INVENTORY._nullifier._sceneNumber = 1;
- _globals->_stripNum = 2321;
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_stripNum = 2321;
+ g_globals->_sceneManager.changeScene(2100);
break;
case 2336:
- _globals->setFlag(77);
+ g_globals->setFlag(77);
RING_INVENTORY._waldos._sceneNumber = 1;
_hotspot8.remove();
break;
case 5000:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
@@ -6080,32 +6082,32 @@ void Scene2400::Action1::signal() {
setDelay(60);
break;
case 1:
- ADD_MOVER(_globals->_player, 160, 71);
+ ADD_MOVER(g_globals->_player, 160, 71);
break;
case 2:
- ADD_MOVER(_globals->_player, 160, 360);
+ ADD_MOVER(g_globals->_player, 160, 360);
break;
case 3:
- _globals->_player._moveDiff = Common::Point(1, 1);
- ADD_MOVER(_globals->_player, 140, 375);
+ g_globals->_player._moveDiff = Common::Point(1, 1);
+ ADD_MOVER(g_globals->_player, 140, 375);
break;
case 4:
- ADD_MOVER(_globals->_player, 87, 338);
+ ADD_MOVER(g_globals->_player, 87, 338);
break;
case 5:
- _globals->_player.hide();
+ g_globals->_player.hide();
setDelay(60);
break;
case 6:
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_sceneManager.changeScene(4000);
break;
}
}
void Scene2400::Action1::dispatch() {
Action::dispatch();
- if ((_actionIndex == 4) && (_globals->_player._percent > 5))
- _globals->_player.changeZoom(_globals->_player._percent - 2);
+ if ((_actionIndex == 4) && (g_globals->_player._percent > 5))
+ g_globals->_player.changeZoom(g_globals->_player._percent - 2);
}
/*--------------------------------------------------------------------------*/
@@ -6115,19 +6117,21 @@ void Scene2400::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _globals->_player.postInit();
- _globals->_player.setVisage(2410);
- _globals->_player.setPosition(Common::Point(340, -10));
- _globals->_player.animate(ANIM_MODE_2, NULL);
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2410);
+ g_globals->_player.setPosition(Common::Point(340, -10));
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player.disableControl();
setAction(&_action1);
- _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y);
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
- _globals->_soundHandler.play(153);
+ g_globals->_soundHandler.play(153);
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes3.h b/engines/tsage/ringworld/ringworld_scenes3.h
index 711360c190..682ef44fc6 100644
--- a/engines/tsage/ringworld_scenes3.h
+++ b/engines/tsage/ringworld/ringworld_scenes3.h
@@ -26,9 +26,14 @@
#include "common/scummsys.h"
#include "tsage/core.h"
#include "tsage/converse.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class Scene2000 : public Scene {
/* Actions */
@@ -890,6 +895,8 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
};
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_scenes4.cpp b/engines/tsage/ringworld/ringworld_scenes4.cpp
index 838769e4af..98bf0158e7 100644
--- a/engines/tsage/ringworld_scenes4.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes4.cpp
@@ -21,12 +21,14 @@
*/
#include "common/config-manager.h"
-#include "tsage/ringworld_scenes4.h"
+#include "tsage/ringworld/ringworld_scenes4.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
/*--------------------------------------------------------------------------
* Scene 3500 - Ringworld Scan
@@ -34,7 +36,7 @@ namespace tSage {
*--------------------------------------------------------------------------*/
void Scene3500::Action1::signal() {
- Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene;
+ Scene3500 *scene = (Scene3500 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -47,13 +49,13 @@ void Scene3500::Action1::signal() {
setDelay(3);
break;
case 3:
- _globals->_sceneManager.changeScene(9999);
+ g_globals->_sceneManager.changeScene(9999);
break;
}
}
void Scene3500::Action2::signal() {
- Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene;
+ Scene3500 *scene = (Scene3500 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -66,7 +68,7 @@ void Scene3500::Action2::signal() {
setDelay(3);
break;
case 3:
- _globals->_sceneManager.changeScene(2012);
+ g_globals->_sceneManager.changeScene(2012);
break;
}
}
@@ -74,17 +76,17 @@ void Scene3500::Action2::signal() {
/*--------------------------------------------------------------------------*/
void Scene3500::postInit(SceneObjectList *OwnerList) {
- loadScene((_globals->_stripNum == 3600) ? 3600 : 3500);
+ loadScene((g_globals->_stripNum == 3600) ? 3600 : 3500);
Scene::postInit();
_stripManager.addSpeaker(&_speakerQText);
_stripManager.addSpeaker(&_speakerMText);
_stripManager.addSpeaker(&_speakerSText);
- _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
- _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160;
+ g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
+ g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160;
- setAction((_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1);
+ setAction((g_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1);
}
/*--------------------------------------------------------------------------
@@ -100,7 +102,7 @@ Scene3700::Viewer::Viewer() {
_frameList[0] = 1;
for (int idx = 1; idx <= 3; ++idx)
- _frameList[idx] = _globals->_randomSource.getRandomNumber(4) + 1;
+ _frameList[idx] = g_globals->_randomSource.getRandomNumber(4) + 1;
_active = true;
_countdownCtr = 0;
@@ -130,7 +132,7 @@ void Scene3700::Viewer::dispatch() {
int newFrame;
do {
- newFrame = _globals->_randomSource.getRandomNumber(4) + 1;
+ newFrame = g_globals->_randomSource.getRandomNumber(4) + 1;
} while (newFrame == _frameList[2]);
_frameList[1] = newFrame;
@@ -144,27 +146,27 @@ void Scene3700::Viewer::reposition() {
}
void Scene3700::Viewer::draw() {
- Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(1);
+ Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(1);
for (int idx = 0; idx < 4; ++idx) {
Visage &v = (idx == 0) ? _images1 : _images2;
GfxSurface img = v.getFrame(_frameList[idx]);
Rect destRect = img.getBounds();
- destRect.resize(img, (_position.x - _globals->_sceneOffset.x),
- (_position.y - _globals->_sceneOffset.y - _yDiff), _percentList[idx]);
+ destRect.resize(img, (_position.x - g_globals->_sceneOffset.x),
+ (_position.y - g_globals->_sceneOffset.y - _yDiff), _percentList[idx]);
- destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left,
- -_globals->_sceneManager._scene->_sceneBounds.top);
+ destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
+ -g_globals->_sceneManager._scene->_sceneBounds.top);
- _globals->gfxManager().copyFrom(img, destRect, priorityRegion);
+ g_globals->gfxManager().copyFrom(img, destRect, priorityRegion);
}
}
/*--------------------------------------------------------------------------*/
void Scene3700::Action1::signal() {
- Scene3700 *scene = (Scene3700 *)_globals->_sceneManager._scene;
+ Scene3700 *scene = (Scene3700 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -216,18 +218,18 @@ void Scene3700::Action1::signal() {
case 8:
scene->_hotspot1.remove();
scene->_hotspot2.show();
- _globals->setFlag(59);
+ g_globals->setFlag(59);
setDelay(30);
break;
case 9:
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_sceneManager.changeScene(2100);
break;
}
}
/*--------------------------------------------------------------------------*/
-void Scene3700::postInit(tSage::SceneObjectList *OwnerList) {
+void Scene3700::postInit(TsAGE::SceneObjectList *OwnerList) {
Scene::postInit();
loadScene(3700);
@@ -244,7 +246,9 @@ void Scene3700::postInit(tSage::SceneObjectList *OwnerList) {
_viewer.setPosition(Common::Point(195, 83));
setAction(&_action1);
- _globals->_soundHandler.play(195);
+ g_globals->_soundHandler.play(195);
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes4.h b/engines/tsage/ringworld/ringworld_scenes4.h
index 0b575d02d3..64706805bc 100644
--- a/engines/tsage/ringworld_scenes4.h
+++ b/engines/tsage/ringworld/ringworld_scenes4.h
@@ -26,9 +26,14 @@
#include "common/scummsys.h"
#include "tsage/core.h"
#include "tsage/converse.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class Scene3500 : public Scene {
/* Actions */
@@ -87,6 +92,8 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
};
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp
index fccc7e1b50..3cf1207e9e 100644
--- a/engines/tsage/ringworld_scenes5.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes5.cpp
@@ -21,12 +21,14 @@
*/
#include "common/config-manager.h"
-#include "tsage/ringworld_scenes5.h"
+#include "tsage/ringworld/ringworld_scenes5.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
/*--------------------------------------------------------------------------
* Scene 4000 - Village
@@ -35,7 +37,7 @@ namespace tSage {
void Scene4000::Action1::signal() {
// Quinn has the peg. Everybody enter the screen.
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
@@ -50,10 +52,10 @@ void Scene4000::Action1::signal() {
scene->_hotspot5.addMover(mover, &pt, this);
RING_INVENTORY._ale._sceneNumber = 0;
- _globals->clearFlag(42);
- _globals->clearFlag(36);
- _globals->clearFlag(43);
- _globals->clearFlag(37);
+ g_globals->clearFlag(42);
+ g_globals->clearFlag(36);
+ g_globals->clearFlag(43);
+ g_globals->clearFlag(37);
break;
}
case 1: {
@@ -83,7 +85,7 @@ void Scene4000::Action1::signal() {
ADD_PLAYER_MOVER_THIS(scene->_miranda, 266, 169);
- ADD_PLAYER_MOVER_NULL(_globals->_player, 241, 155);
+ ADD_PLAYER_MOVER_NULL(g_globals->_player, 241, 155);
break;
}
case 2:
@@ -102,14 +104,14 @@ void Scene4000::Action1::signal() {
ADD_MOVER_NULL(scene->_hotspot5, -40, 86);
break;
case 5:
- _globals->_soundHandler.play(155);
- _globals->setFlag(43);
- _globals->setFlag(114);
+ g_globals->_soundHandler.play(155);
+ g_globals->setFlag(43);
+ g_globals->setFlag(114);
scene->_stripManager.start(4430, this);
break;
case 6:
ADD_PLAYER_MOVER_THIS(scene->_olo, 277, 175);
- ADD_PLAYER_MOVER_NULL(_globals->_player, 258, 187);
+ ADD_PLAYER_MOVER_NULL(g_globals->_player, 258, 187);
break;
case 7:
scene->_stripManager.start(4440, this);
@@ -118,8 +120,8 @@ void Scene4000::Action1::signal() {
setDelay(30);
break;
case 9:
- _globals->setFlag(96);
- _globals->_sceneManager.changeScene(4025);
+ g_globals->setFlag(96);
+ g_globals->_sceneManager.changeScene(4025);
break;
}
}
@@ -127,11 +129,11 @@ void Scene4000::Action1::signal() {
void Scene4000::Action2::signal() {
// Quinn, Seeker and Miranda walks down to the village
// Then, they talk to Rock, and enter the priest hut
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager1, this, 4001, &g_globals->_player, NULL);
scene->_hotspot5.postInit();
scene->_hotspot5.setVisage(2801);
@@ -144,13 +146,13 @@ void Scene4000::Action2::signal() {
scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL);
break;
case 1:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_lander.remove();
ADD_MOVER(scene->_guardRock, scene->_hotspot5._position.x + 30, scene->_hotspot5._position.y - 10);
break;
case 2:
- _globals->_player.checkAngle(&scene->_guardRock);
+ g_globals->_player.checkAngle(&scene->_guardRock);
scene->_hotspot5.checkAngle(&scene->_guardRock);
scene->_miranda.checkAngle(&scene->_guardRock);
scene->_stripManager.start(4000, this);
@@ -163,7 +165,7 @@ void Scene4000::Action2::signal() {
ADD_MOVER(scene->_hotspot2, 116, 160);
ADD_MOVER(scene->_hotspot5, 116, 160);
- _globals->setFlag(37);
+ g_globals->setFlag(37);
break;
case 4:
break;
@@ -176,14 +178,14 @@ void Scene4000::Action2::signal() {
ADD_PLAYER_MOVER_NULL(scene->_miranda, 210, 133);
break;
case 7:
- _globals->_sceneManager.changeScene(4045);
+ g_globals->_sceneManager.changeScene(4045);
break;
}
}
void Scene4000::Action3::signal() {
// The guard walks to the left and exits the screen
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -202,19 +204,19 @@ void Scene4000::Action3::signal() {
void Scene4000::Action4::signal() {
// Quinn ties the rope to the rock
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player._uiEnabled = false;
- ADD_MOVER(_globals->_player, 257, 57);
+ g_globals->_player._uiEnabled = false;
+ ADD_MOVER(g_globals->_player, 257, 57);
break;
case 1:
- _globals->_player.setVisage(4008);
- _globals->_player.setPosition(Common::Point(258, 83));
- _globals->_player._frame = 1;
- _globals->_player._strip = 3;
- _globals->_player.animate(ANIM_MODE_4, 2, 1, this);
+ g_globals->_player.setVisage(4008);
+ g_globals->_player.setPosition(Common::Point(258, 83));
+ g_globals->_player._frame = 1;
+ g_globals->_player._strip = 3;
+ g_globals->_player.animate(ANIM_MODE_4, 2, 1, this);
break;
case 2:
scene->_rope.postInit();
@@ -224,16 +226,16 @@ void Scene4000::Action4::signal() {
scene->_rope.setPosition(Common::Point(268, 44));
RING_INVENTORY._rope._sceneNumber = 4000;
- _globals->_events.setCursor(CURSOR_USE);
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 3:
- _globals->_player.setVisage(2602);
- _globals->_player.setPosition(Common::Point(257, 57));
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._uiEnabled = true;
+ g_globals->_player.setVisage(2602);
+ g_globals->_player.setPosition(Common::Point(257, 57));
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._uiEnabled = true;
- _globals->setFlag(41);
+ g_globals->setFlag(41);
remove();
break;
}
@@ -241,15 +243,15 @@ void Scene4000::Action4::signal() {
void Scene4000::Action5::signal() {
// Chat with Miranda
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(15);
break;
case 1:
- scene->_stripManager.start(_globals->_stripNum, this);
+ scene->_stripManager.start(g_globals->_stripNum, this);
break;
case 2:
setDelay(10);
@@ -260,7 +262,7 @@ void Scene4000::Action5::signal() {
scene->_hotspot8.setFrame2(-1);
scene->_hotspot8.setAction(&scene->_action3);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -269,102 +271,102 @@ void Scene4000::Action5::signal() {
void Scene4000::Action6::signal() {
// Quinn and Miranda enter the screen and walk to the village.
// Rock comes and notices the alcohol. They all enter his hut.
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(30);
break;
case 1:
- setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager1, this, 4001, &g_globals->_player, NULL);
- if (!_globals->getFlag(36))
+ if (!g_globals->getFlag(36))
scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL);
break;
case 2:
- _globals->_player.disableControl();
- ADD_MOVER(scene->_guardRock, _globals->_player._position.x + 30, _globals->_player._position.y - 5);
+ g_globals->_player.disableControl();
+ ADD_MOVER(scene->_guardRock, g_globals->_player._position.x + 30, g_globals->_player._position.y - 5);
break;
case 3:
- scene->_stripManager.start(_globals->getFlag(35) ? 4500 : 4502, this);
+ scene->_stripManager.start(g_globals->getFlag(35) ? 4500 : 4502, this);
break;
case 4:
- _globals->clearFlag(35);
+ g_globals->clearFlag(35);
ADD_MOVER_NULL(scene->_guardRock, 292, 138);
ADD_PLAYER_MOVER(283, 147);
- if (!_globals->getFlag(36))
+ if (!g_globals->getFlag(36))
ADD_PLAYER_MOVER_NULL(scene->_miranda, 280, 150);
RING_INVENTORY._ale._sceneNumber = 4100;
break;
case 5:
- _globals->_sceneManager.changeScene(4100);
+ g_globals->_sceneManager.changeScene(4100);
break;
}
}
void Scene4000::Action7::signal() {
// Climb down left Chimney using a rope
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_rope.setFrame(1);
- ADD_MOVER(_globals->_player, 247, 53);
+ ADD_MOVER(g_globals->_player, 247, 53);
break;
case 1:
- _globals->_player.setVisage(4008);
- _globals->_player.setStrip(4);
- _globals->_player.setFrame(1);
- _globals->_player.fixPriority(16);
- _globals->_player.setPosition(Common::Point(260, 55));
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(4008);
+ g_globals->_player.setStrip(4);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.fixPriority(16);
+ g_globals->_player.setPosition(Common::Point(260, 55));
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- _globals->_sceneManager.changeScene(4050);
+ g_globals->_sceneManager.changeScene(4050);
break;
}
}
void Scene4000::Action8::signal() {
// Climb down right Chimney using a rope
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
- if (_globals->getFlag(41))
+ g_globals->_player.disableControl();
+ if (g_globals->getFlag(41))
scene->_rope.setFrame(2);
- ADD_MOVER(_globals->_player, 289, 53);
+ ADD_MOVER(g_globals->_player, 289, 53);
break;
case 1:
- _globals->_player.setVisage(4008);
- _globals->_player.setStrip(5);
- _globals->_player.fixPriority(16);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(283, 52));
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(4008);
+ g_globals->_player.setStrip(5);
+ g_globals->_player.fixPriority(16);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(283, 52));
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- _globals->_player.remove();
+ g_globals->_player.remove();
setDelay(60);
break;
case 3:
- _globals->_soundHandler.play(170);
+ g_globals->_soundHandler.play(170);
scene->_smoke2.setVisage(4000);
scene->_smoke2.setStrip(6);
scene->_smoke2.animate(ANIM_MODE_2, NULL);
setDelay(60);
break;
case 4:
- _globals->_soundHandler.play(77, this);
+ g_globals->_soundHandler.play(77, this);
break;
case 5:
- _globals->_game->endGame(4000, 15);
+ g_globals->_game->endGame(4000, 15);
remove();
break;
}
@@ -374,7 +376,7 @@ void Scene4000::Action9::signal() {
// Villager animations
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(119) + 240);
+ setDelay(g_globals->_randomSource.getRandomNumber(119) + 240);
break;
case 1:
static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_8, 1, this);
@@ -387,7 +389,7 @@ void Scene4000::Action10::signal() {
// Villager animations
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(119) + 240);
+ setDelay(g_globals->_randomSource.getRandomNumber(119) + 240);
break;
case 1:
static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_8, 1, this);
@@ -397,11 +399,11 @@ void Scene4000::Action10::signal() {
}
void Scene4000::Action11::signal() {
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
ADD_MOVER(scene->_lander, -30, 70);
break;
case 1:
@@ -415,7 +417,7 @@ void Scene4000::Action11::signal() {
scene->_hotspot5._moveDiff.x = 4;
scene->_hotspot5.setPosition(Common::Point(-8, 88));
- setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager1, this, 4001, &g_globals->_player, NULL);
scene->_miranda.setPosition(Common::Point(-210, 139));
scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL);
@@ -432,33 +434,33 @@ void Scene4000::Action11::signal() {
scene->_soundHandler1.stop();
scene->_forceField.remove();
- ADD_MOVER(_globals->_player, 340, 163);
+ ADD_MOVER(g_globals->_player, 340, 163);
ADD_MOVER_NULL(scene->_miranda, 340, 169);
ADD_MOVER_NULL(scene->_hotspot5, 340, 165);
break;
case 6:
- _globals->_sceneManager.changeScene(4250);
+ g_globals->_sceneManager.changeScene(4250);
break;
}
}
void Scene4000::Action12::signal() {
// Quinn enter Rock's hut
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(5);
break;
case 1:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(4015, this);
break;
case 2:
- _globals->setFlag(32);
+ g_globals->setFlag(32);
if (scene->_stripManager._field2E8 == 275) {
- _globals->setFlag(82);
+ g_globals->setFlag(82);
ADD_MOVER_NULL(scene->_guardRock, 292, 138);
ADD_PLAYER_MOVER(283, 147);
} else {
@@ -467,7 +469,7 @@ void Scene4000::Action12::signal() {
break;
case 3:
if (scene->_stripManager._field2E8 == 275) {
- _globals->_sceneManager.changeScene(4100);
+ g_globals->_sceneManager.changeScene(4100);
} else {
ADD_PLAYER_MOVER_THIS(scene->_guardRock, 300, 132);
}
@@ -477,8 +479,8 @@ void Scene4000::Action12::signal() {
scene->_stripManager.start(4020, this);
break;
case 5:
- _globals->setFlag(35);
- _globals->_player.enableControl();
+ g_globals->setFlag(35);
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -486,11 +488,11 @@ void Scene4000::Action12::signal() {
void Scene4000::Action13::signal() {
// Lander is landing
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
@@ -500,7 +502,7 @@ void Scene4000::Action13::signal() {
break;
case 2:
scene->_soundHandler2.release();
- _globals->_sceneManager.changeScene(4010);
+ g_globals->_sceneManager.changeScene(4010);
break;
}
}
@@ -508,7 +510,7 @@ void Scene4000::Action13::signal() {
/*--------------------------------------------------------------------------*/
void Scene4000::Miranda::doAction(int action) {
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -518,28 +520,28 @@ void Scene4000::Miranda::doAction(int action) {
SceneItem::display2(4000, 29);
break;
case CURSOR_TALK:
- if (_globals->getFlag(31)) {
- if (!_globals->getFlag(111)) {
- _globals->setFlag(111);
- _globals->_stripNum = 4070;
- } else if (!_globals->getFlag(33))
- _globals->_stripNum = 4094;
- else if (!_globals->getFlag(112)) {
- _globals->setFlag(112);
- _globals->_stripNum = 4300;
- } else if (!_globals->getFlag(113)) {
- _globals->setFlag(113);
- _globals->_stripNum = 4093;
+ if (g_globals->getFlag(31)) {
+ if (!g_globals->getFlag(111)) {
+ g_globals->setFlag(111);
+ g_globals->_stripNum = 4070;
+ } else if (!g_globals->getFlag(33))
+ g_globals->_stripNum = 4094;
+ else if (!g_globals->getFlag(112)) {
+ g_globals->setFlag(112);
+ g_globals->_stripNum = 4300;
+ } else if (!g_globals->getFlag(113)) {
+ g_globals->setFlag(113);
+ g_globals->_stripNum = 4093;
} else
- _globals->_stripNum = 4094;
+ g_globals->_stripNum = 4094;
} else {
- if (!_globals->getFlag(33))
- _globals->_stripNum = 4094;
- else if (!_globals->getFlag(112)) {
- _globals->setFlag(112);
- _globals->_stripNum = 4300;
+ if (!g_globals->getFlag(33))
+ g_globals->_stripNum = 4094;
+ else if (!g_globals->getFlag(112)) {
+ g_globals->setFlag(112);
+ g_globals->_stripNum = 4300;
} else
- _globals->_stripNum = 4094;
+ g_globals->_stripNum = 4094;
}
scene->setAction(&scene->_action5);
@@ -552,7 +554,7 @@ void Scene4000::Miranda::doAction(int action) {
void Scene4000::Hotspot8::doAction(int action) {
// Guard
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -567,20 +569,20 @@ void Scene4000::Hotspot8::doAction(int action) {
else {
switch (_ctr) {
case 0:
- _globals->_stripNum = 4090;
+ g_globals->_stripNum = 4090;
break;
case 1:
- _globals->_stripNum = 4091;
+ g_globals->_stripNum = 4091;
break;
case 2:
- _globals->_stripNum = 4092;
+ g_globals->_stripNum = 4092;
break;
default:
SceneItem::display2(4000, 34);
break;
}
- if (_globals->_stripNum) {
+ if (g_globals->_stripNum) {
setAction(NULL);
addMover(NULL);
++_ctr;
@@ -612,20 +614,20 @@ void Scene4000::GuardRock::doAction(int action) {
}
void Scene4000::Ladder::doAction(int action) {
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4000, 30);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
- if (_globals->getFlag(40)) {
+ g_globals->_player.disableControl();
+ if (g_globals->getFlag(40)) {
scene->_sceneMode = 4005;
- scene->setAction(&scene->_sequenceManager1, scene, 4005, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 4005, &g_globals->_player, NULL);
} else {
scene->_sceneMode = 4004;
- scene->setAction(&scene->_sequenceManager1, scene, 4004, &_globals->_player, &scene->_ladder, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 4004, &g_globals->_player, &scene->_ladder, NULL);
}
break;
default:
@@ -635,7 +637,7 @@ void Scene4000::Ladder::doAction(int action) {
}
void Scene4000::TheTech::doAction(int action) {
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -648,15 +650,15 @@ void Scene4000::TheTech::doAction(int action) {
SceneItem::display2(4000, 20);
break;
case CURSOR_USE:
- if (_globals->getFlag(40))
+ if (g_globals->getFlag(40))
SceneItem::display2(4000, 37);
else {
- _globals->_player.disableControl();
- if (_globals->_sceneObjects->contains(&scene->_miranda))
- _globals->clearFlag(96);
+ g_globals->_player.disableControl();
+ if (g_globals->_sceneObjects->contains(&scene->_miranda))
+ g_globals->clearFlag(96);
scene->_sceneMode = 4012;
- scene->setAction(&scene->_sequenceManager1, scene, 4012, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 4012, &g_globals->_player, NULL);
}
break;
default:
@@ -667,14 +669,14 @@ void Scene4000::TheTech::doAction(int action) {
void Scene4000::Hotspot13::doAction(int action) {
// Rock between the two chimneys
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4000, 21);
break;
case OBJECT_ROPE:
- if (_globals->getFlag(40))
+ if (g_globals->getFlag(40))
scene->setAction(&scene->_action4);
else
SceneItem::display2(4000, 22);
@@ -687,7 +689,7 @@ void Scene4000::Hotspot13::doAction(int action) {
void Scene4000::Hotspot::doAction(int action) {
// Wall between the two doors
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -700,16 +702,16 @@ void Scene4000::Hotspot::doAction(int action) {
SceneItem::display2(4000, 18);
break;
case OBJECT_LADDER: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_ladder.postInit();
scene->_ladder.setVisage(4000);
scene->_ladder.setStrip(5);
scene->_ladder.setPosition(Common::Point(245, 147));
scene->_ladder.hide();
- _globals->_sceneItems.push_front(&scene->_ladder);
+ g_globals->_sceneItems.push_front(&scene->_ladder);
- if (_globals->_sceneObjects->contains(&scene->_hotspot8)) {
+ if (g_globals->_sceneObjects->contains(&scene->_hotspot8)) {
scene->_hotspot8.setAction(NULL);
Common::Point pt(118, 145);
NpcMover *mover = new NpcMover();
@@ -717,7 +719,7 @@ void Scene4000::Hotspot::doAction(int action) {
}
scene->_sceneMode = 4004;
- scene->setAction(&scene->_sequenceManager1, scene, 4011, &_globals->_player, &scene->_ladder, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 4011, &g_globals->_player, &scene->_ladder, NULL);
break;
}
default:
@@ -728,14 +730,14 @@ void Scene4000::Hotspot::doAction(int action) {
void Scene4000::Hotspot17::doAction(int action) {
// Left Chimney
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4000, 23);
break;
case CURSOR_USE:
- if (_globals->getFlag(40))
+ if (g_globals->getFlag(40))
scene->setAction(&scene->_action7);
else
SceneItem::display2(4000, 24);
@@ -748,14 +750,14 @@ void Scene4000::Hotspot17::doAction(int action) {
void Scene4000::Hotspot18::doAction(int action) {
// Right Chimney
- Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+ Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4000, 36);
break;
case CURSOR_USE:
- if (_globals->getFlag(40))
+ if (g_globals->getFlag(40))
scene->setAction(&scene->_action8);
else
SceneItem::display2(4000, 24);
@@ -770,7 +772,7 @@ void Scene4000::Hotspot23::doAction(int action) {
// Door of the temple
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(4000, _globals->getFlag(31) ? 10 : 9);
+ SceneItem::display2(4000, g_globals->getFlag(31) ? 10 : 9);
break;
default:
SceneHotspot::doAction(action);
@@ -815,7 +817,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_speakerSText._npc = &_hotspot5;
_speakerMText._npc = &_miranda;
_speakerPText._npc = &_olo;
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
_hotspot13.setBounds(Rect(263, 41, 278, 55));
_hotspot14.setBounds(Rect(96 /*140*/, 177, 140 /*96*/, 204));
@@ -866,7 +868,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_theTech.fixPriority(200);
_theTech.setPosition(Common::Point(281, 176));
- if (_globals->getFlag(34)) {
+ if (g_globals->getFlag(34)) {
_soundHandler1.play(156);
_forceField.postInit();
@@ -876,16 +878,16 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_forceField.fixPriority(200);
_forceField.animate(ANIM_MODE_8, 0, NULL);
- _globals->_sceneItems.push_back(&_forceField);
+ g_globals->_sceneItems.push_back(&_forceField);
}
- _globals->_player.postInit();
- _globals->_player.setVisage(2602);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(-28, 86));
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2602);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(-28, 86));
- if (!_globals->getFlag(36) && !_globals->getFlag(43)) {
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) {
_miranda.postInit();
_miranda.setVisage(2701);
_miranda.animate(ANIM_MODE_1, NULL);
@@ -893,14 +895,14 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_miranda._moveDiff = Common::Point(4, 2);
_miranda.setPosition(Common::Point(-210, 139));
- _globals->_sceneItems.push_back(&_miranda);
+ g_globals->_sceneItems.push_back(&_miranda);
}
- _globals->clearFlag(40);
+ g_globals->clearFlag(40);
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 2320:
- _globals->_soundHandler.play(155);
+ g_globals->_soundHandler.play(155);
if (RING_INVENTORY._ale._sceneNumber == 1) {
_guardRock.postInit();
@@ -911,17 +913,17 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
setAction(&_action6);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 4001;
- setAction(&_sequenceManager1, this, 4001, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, 4001, &g_globals->_player, NULL);
- if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(43))
_miranda.setAction(&_sequenceManager2, NULL, 4002, &_miranda, NULL);
}
- if (_globals->getFlag(42))
+ if (g_globals->getFlag(42))
_hotspot8.setAction(&_action3);
- else if (_globals->getFlag(91))
+ else if (g_globals->getFlag(91))
_hotspot8.remove();
break;
@@ -948,12 +950,12 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
if (RING_INVENTORY._ladder._sceneNumber == 4000)
_hotspot8.remove();
- _globals->_player.setPosition(Common::Point(260, 185));
+ g_globals->_player.setPosition(Common::Point(260, 185));
- if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(43))
_miranda.setPosition(Common::Point(246, 146));
- if (_globals->getFlag(96)) {
+ if (g_globals->getFlag(96)) {
_olo.postInit();
_olo.setVisage(4006);
_olo.animate(ANIM_MODE_1, NULL);
@@ -961,7 +963,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_olo.setPosition(Common::Point(290, 163));
}
- if (_globals->_stripNum == 4025) {
+ if (g_globals->_stripNum == 4025) {
_soundHandler1.play(182);
_forceField.remove();
@@ -972,9 +974,9 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_hotspot5._moveDiff.x = 4;
_hotspot5.setPosition(Common::Point(-18, 86));
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
- if (!_globals->getFlag(96)) {
+ if (!g_globals->getFlag(96)) {
_olo.postInit();
_olo.setVisage(4006);
_olo.animate(ANIM_MODE_1, NULL);
@@ -988,17 +990,17 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_sceneMode = 4003;
setAction(&_sequenceManager1, this, 4003, &_hotspot5, NULL);
- } else if (_globals->getFlag(96)) {
- _globals->_player.disableControl();
+ } else if (g_globals->getFlag(96)) {
+ g_globals->_player.disableControl();
_sceneMode = 4013;
setAction(&_sequenceManager1, this, 4013, &_olo, NULL);
}
- _globals->clearFlag(96);
+ g_globals->clearFlag(96);
break;
case 4045:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
if (RING_INVENTORY._ladder._sceneNumber != 4000) {
_hotspot8.setVisage(4017);
@@ -1007,13 +1009,13 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_hotspot8.setAction(&_action3);
}
- _globals->_player.setPosition(Common::Point(208, 153));
- if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ g_globals->_player.setPosition(Common::Point(208, 153));
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(43))
_miranda.setPosition(Common::Point(246, 146));
- if (_globals->getFlag(39)) {
+ if (g_globals->getFlag(39)) {
// Ollo follows Quinn and gives explanations on the Tech.
- _globals->clearFlag(39);
+ g_globals->clearFlag(39);
_olo.postInit();
_olo.setVisage(4006);
@@ -1022,14 +1024,14 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_olo.setPosition(Common::Point(219, 150));
_sceneMode = 4010;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
// This is the buggy animation where Miranda comments the Tech even
// if she's not in the room but in the lander.
- setAction(&_sequenceManager1, this, 4010, &_globals->_player, &_olo, NULL);
+ setAction(&_sequenceManager1, this, 4010, &g_globals->_player, &_olo, NULL);
}
- if (_globals->_stripNum == 4000) {
- _globals->_stripNum = 0;
+ if (g_globals->_stripNum == 4000) {
+ g_globals->_stripNum = 0;
_guardRock.postInit();
_guardRock.setVisage(4001);
@@ -1043,21 +1045,21 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
break;
case 4050:
- _globals->_soundHandler.play(155);
- _globals->_player.disableControl();
+ g_globals->_soundHandler.play(155);
+ g_globals->_player.disableControl();
- if (_globals->_stripNum == 4050) {
- _globals->_player.setVisage(4008);
- _globals->_player.setStrip(4);
- _globals->_player.setFrame(_globals->_player.getFrameCount());
- _globals->_player.fixPriority(16);
- _globals->_player.setPosition(Common::Point(260, 55));
+ if (g_globals->_stripNum == 4050) {
+ g_globals->_player.setVisage(4008);
+ g_globals->_player.setStrip(4);
+ g_globals->_player.setFrame(g_globals->_player.getFrameCount());
+ g_globals->_player.fixPriority(16);
+ g_globals->_player.setPosition(Common::Point(260, 55));
_sceneMode = 4007;
- setAction(&_sequenceManager1, this, 4007, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, 4007, &g_globals->_player, NULL);
} else {
- _globals->_player.setPosition(Common::Point(208, 153));
- _globals->_player.enableControl();
+ g_globals->_player.setPosition(Common::Point(208, 153));
+ g_globals->_player.enableControl();
}
if (RING_INVENTORY._ladder._sceneNumber != 4000)
@@ -1065,22 +1067,22 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
break;
case 4100:
- _globals->_player.enableControl();
- _globals->_player.setPosition(Common::Point(270, 155));
+ g_globals->_player.enableControl();
+ g_globals->_player.setPosition(Common::Point(270, 155));
- if (_globals->getFlag(42) && (RING_INVENTORY._ladder._sceneNumber != 4000)) {
+ if (g_globals->getFlag(42) && (RING_INVENTORY._ladder._sceneNumber != 4000)) {
_hotspot8.setVisage(4017);
_hotspot8.animate(ANIM_MODE_1, NULL);
_hotspot8.setPosition(Common::Point(244, 151));
_hotspot8.setAction(&_action3);
}
- if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(43))
_miranda.setPosition(Common::Point(246, 146));
break;
default:
- _globals->_soundHandler.play(155);
+ g_globals->_soundHandler.play(155);
_lander.postInit();
_lander.setVisage(4002);
@@ -1090,7 +1092,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_lander.setPosition(Common::Point(130, -1));
_lander.animate(ANIM_MODE_2, NULL);
- if (_globals->_stripNum == 9000) {
+ if (g_globals->_stripNum == 9000) {
_olo.postInit();
_olo.setVisage(4006);
_olo.setPosition(Common::Point(235, 153));
@@ -1113,7 +1115,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_forceField.fixPriority(200);
_forceField.animate(ANIM_MODE_8, 0, NULL);
} else {
- if (!_globals->getFlag(37)) {
+ if (!g_globals->getFlag(37)) {
_hotspot2.postInit();
_hotspot2.setVisage(4018);
_hotspot2._strip = 1;
@@ -1134,7 +1136,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_ladder.setStrip(5);
_ladder.setPosition(Common::Point(245, 147));
- _globals->_sceneItems.push_back(&_ladder);
+ g_globals->_sceneItems.push_back(&_ladder);
}
if (RING_INVENTORY._rope._sceneNumber == 4000) {
@@ -1145,7 +1147,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
_rope.setPosition(Common::Point(268, 44));
}
- _globals->_sceneItems.addItems(&_hotspot8, &_hotspot17, &_hotspot18, &_hotspot14, &_hotspot15,
+ g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot17, &_hotspot18, &_hotspot14, &_hotspot15,
&_hotspot16, &_theTech, &_hotspot13, &_hotspot21, &_hotspot20, &_hotspot22, &_hotspot23,
&_hotspot24, &_hotspot25, &_hotspot19, &_hotspot26, NULL);
}
@@ -1153,51 +1155,51 @@ void Scene4000::postInit(SceneObjectList *OwnerList) {
void Scene4000::signal() {
switch (_sceneMode) {
case 4010:
- _globals->setFlag(38);
+ g_globals->setFlag(38);
_olo.remove();
// Deliberate fall-through
case 4001:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 4002:
case 4011:
break;
case 4003:
_sceneMode = 4014;
- setAction(&_sequenceManager1, this, 4014, &_globals->_player, &_hotspot5, NULL);
+ setAction(&_sequenceManager1, this, 4014, &g_globals->_player, &_hotspot5, NULL);
break;
case 4004:
RING_INVENTORY._ladder._sceneNumber = 4000;
// Deliberate fall-through
case 4007:
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
- _globals->setFlag(40);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
+ g_globals->setFlag(40);
break;
case 4005:
- _globals->_player.enableControl();
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->clearFlag(40);
+ g_globals->_player.enableControl();
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->clearFlag(40);
break;
case 4006:
- _globals->_sceneManager.changeScene(4045);
+ g_globals->_sceneManager.changeScene(4045);
break;
case 4008:
- _globals->_sceneManager.changeScene(2320);
+ g_globals->_sceneManager.changeScene(2320);
break;
case 4009:
- _globals->_sceneManager.changeScene(2200);
+ g_globals->_sceneManager.changeScene(2200);
break;
case 4012:
- _globals->_player.checkAngle(&_theTech);
- _globals->_sceneManager.changeScene(4025);
+ g_globals->_player.checkAngle(&_theTech);
+ g_globals->_sceneManager.changeScene(4025);
break;
case 4013:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
_olo.remove();
break;
case 4014:
- _globals->_sceneManager.changeScene(4250);
+ g_globals->_sceneManager.changeScene(4250);
break;
case 4015:
ADD_MOVER_NULL(_miranda, 0, _miranda._position.y - 5);
@@ -1208,14 +1210,14 @@ void Scene4000::signal() {
void Scene4000::dispatch() {
Scene::dispatch();
- if ((_globals->_player.getRegionIndex() == 10) || (_globals->_player.getRegionIndex() == 6))
- _globals->_player.fixPriority(200);
- if (_globals->_player.getRegionIndex() == 11)
- _globals->_player.fixPriority(-1);
- if (_globals->_player.getRegionIndex() == 5)
- _globals->_player.fixPriority(94);
+ if ((g_globals->_player.getRegionIndex() == 10) || (g_globals->_player.getRegionIndex() == 6))
+ g_globals->_player.fixPriority(200);
+ if (g_globals->_player.getRegionIndex() == 11)
+ g_globals->_player.fixPriority(-1);
+ if (g_globals->_player.getRegionIndex() == 5)
+ g_globals->_player.fixPriority(94);
- if (_globals->_sceneObjects->contains(&_hotspot5)) {
+ if (g_globals->_sceneObjects->contains(&_hotspot5)) {
if ((_hotspot5.getRegionIndex() == 10) || (_hotspot5.getRegionIndex() == 6))
_hotspot5.fixPriority(200);
if (_hotspot5.getRegionIndex() == 11)
@@ -1224,10 +1226,10 @@ void Scene4000::dispatch() {
_hotspot5.fixPriority(94);
}
- if (_globals->_sceneObjects->contains(&_miranda)) {
+ if (g_globals->_sceneObjects->contains(&_miranda)) {
if (!_miranda._mover)
- _miranda.checkAngle(&_globals->_player);
- if (!_action && _globals->_player.getRegionIndex() == 23) {
+ _miranda.checkAngle(&g_globals->_player);
+ if (!_action && g_globals->_player.getRegionIndex() == 23) {
ADD_MOVER_NULL(_miranda, 204, 186);
}
@@ -1240,30 +1242,30 @@ void Scene4000::dispatch() {
}
if (!_action) {
- if ((RING_INVENTORY._peg._sceneNumber == 1) && _globals->getFlag(34) &&
- _globals->getFlag(37) && !_globals->getFlag(40)) {
- _globals->_player.disableControl();
+ if ((RING_INVENTORY._peg._sceneNumber == 1) && g_globals->getFlag(34) &&
+ g_globals->getFlag(37) && !g_globals->getFlag(40)) {
+ g_globals->_player.disableControl();
_soundHandler1.play(177);
- _globals->_soundHandler.play(178);
+ g_globals->_soundHandler.play(178);
setAction(&_action1);
}
- if (_globals->_player.getRegionIndex() == 2)
- _globals->_sceneManager.changeScene(4045);
- if (_globals->_player.getRegionIndex() == 15)
- _globals->_sceneManager.changeScene(4100);
+ if (g_globals->_player.getRegionIndex() == 2)
+ g_globals->_sceneManager.changeScene(4045);
+ if (g_globals->_player.getRegionIndex() == 15)
+ g_globals->_sceneManager.changeScene(4100);
- if ((_globals->_player._position.x <= 5) && (_globals->_player._position.y < 100)) {
- _globals->_player.disableControl();
+ if ((g_globals->_player._position.x <= 5) && (g_globals->_player._position.y < 100)) {
+ g_globals->_player.disableControl();
- if (!_globals->_sceneObjects->contains(&_miranda) || (_miranda._position.y <= 100)) {
+ if (!g_globals->_sceneObjects->contains(&_miranda) || (_miranda._position.y <= 100)) {
_sceneMode = 4008;
- setAction(&_sequenceManager1, this, 4008, &_globals->_player, NULL);
+ setAction(&_sequenceManager1, this, 4008, &g_globals->_player, NULL);
} else {
_sceneMode = 4015;
- _globals->_player.addMover(NULL);
- setAction(&_sequenceManager1, this, 4015, &_globals->_player, &_miranda, NULL);
+ g_globals->_player.addMover(NULL);
+ setAction(&_sequenceManager1, this, 4015, &g_globals->_player, &_miranda, NULL);
}
}
}
@@ -1284,14 +1286,14 @@ void Scene4010::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerMText);
_speakerSText._npc = &_hotspot1;
_speakerMText._npc = &_hotspot2;
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(-38, 175));
- _globals->_player.changeZoom(75);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(-38, 175));
+ g_globals->_player.changeZoom(75);
_hotspot2.postInit();
_hotspot2.setVisage(2705);
@@ -1308,12 +1310,12 @@ void Scene4010::postInit(SceneObjectList *OwnerList) {
_hotspot1.animate(ANIM_MODE_1, NULL);
_hotspot1.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.disableControl();
- setAction(&_sequenceManager, this, 4017, &_globals->_player, &_hotspot1, &_hotspot2, NULL);
+ g_globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 4017, &g_globals->_player, &_hotspot1, &_hotspot2, NULL);
}
void Scene4010::signal() {
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_sceneManager.changeScene(4000);
}
/*--------------------------------------------------------------------------
@@ -1322,7 +1324,7 @@ void Scene4010::signal() {
*--------------------------------------------------------------------------*/
void Scene4025::Action1::signal() {
- Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+ Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1362,15 +1364,15 @@ void Scene4025::Action1::signal() {
break;
case 2:
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
remove();
break;
}
}
void Scene4025::Action2::signal() {
- Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+ Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1406,8 +1408,8 @@ void Scene4025::Action2::signal() {
scene->_armHotspot.animate(ANIM_MODE_5, this);
break;
case 2:
- _globals->_player._uiEnabled = true;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player._uiEnabled = true;
+ g_globals->_events.setCursor(CURSOR_USE);
remove();
break;
}
@@ -1416,14 +1418,14 @@ void Scene4025::Action2::signal() {
void Scene4025::Action3::signal() {
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
- _globals->_scenePalette.addRotation(64, 111, -1);
+ g_globals->_player.disableControl();
+ g_globals->_scenePalette.addRotation(64, 111, -1);
setDelay(120);
break;
case 1:
- _globals->clearFlag(34);
- _globals->_stripNum = 4025;
- _globals->_sceneManager.changeScene(4000);
+ g_globals->clearFlag(34);
+ g_globals->_stripNum = 4025;
+ g_globals->_sceneManager.changeScene(4000);
break;
}
}
@@ -1439,7 +1441,7 @@ void Scene4025::Hole::synchronize(Serializer &s) {
}
void Scene4025::Hole::doAction(int action) {
- Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+ Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1449,15 +1451,15 @@ void Scene4025::Hole::doAction(int action) {
if (!scene->_pegPtr && !_pegPtr) {
setAction(&scene->_sequenceManager, scene, 4028, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_holePtr = this;
scene->setAction(&scene->_action2);
}
break;
case OBJECT_PEG:
if (!scene->_pegPtr2) {
- _globals->_player.disableControl();
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player.disableControl();
+ g_globals->_events.setCursor(CURSOR_USE);
RING_INVENTORY._peg._sceneNumber = 4025;
scene->_pegPtr = &scene->_peg5;
@@ -1481,14 +1483,14 @@ void Scene4025::Peg::synchronize(Serializer &s) {
}
void Scene4025::Peg::doAction(int action) {
- Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+ Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4025, 1);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_pegPtr = this;
scene->setAction(&scene->_action1);
break;
@@ -1507,7 +1509,7 @@ void Scene4025::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
_pegPtr = _pegPtr2 = NULL;
_peg1.postInit();
@@ -1607,11 +1609,11 @@ void Scene4025::postInit(SceneObjectList *OwnerList) {
_armHotspot.setStrip(3);
_armHotspot.setFrame(4);
- _globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5,
+ g_globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5,
&_peg1, &_peg2, &_peg3, &_peg4, &_peg5, NULL);
- _globals->_player._uiEnabled = true;
- _globals->_player.disableControl();
+ g_globals->_player._uiEnabled = true;
+ g_globals->_player.disableControl();
setAction(&_sequenceManager, this, 4026, NULL);
}
@@ -1623,7 +1625,7 @@ void Scene4025::synchronize(Serializer &s) {
}
void Scene4025::remove() {
- _globals->_scenePalette.clearListeners();
+ g_globals->_scenePalette.clearListeners();
Scene::remove();
}
@@ -1636,10 +1638,10 @@ void Scene4025::signal() {
_gfxButton._bounds.expandPanes();
}
- _globals->_player._uiEnabled = true;
+ g_globals->_player._uiEnabled = true;
}
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
}
void Scene4025::process(Event &event) {
@@ -1649,7 +1651,7 @@ void Scene4025::process(Event &event) {
if (RING_INVENTORY._peg._sceneNumber == 4025)
RING_INVENTORY._peg._sceneNumber = 1;
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_sceneManager.changeScene(4000);
}
}
@@ -1667,15 +1669,15 @@ void Scene4025::dispatch() {
*--------------------------------------------------------------------------*/
void Scene4045::Action1::signal() {
- Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+ Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(60);
break;
case 1:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(4040, this, scene);
break;
case 2:
@@ -1689,52 +1691,52 @@ void Scene4045::Action1::signal() {
scene->_hotspot4.animate(ANIM_MODE_6, this);
break;
case 5:
- ADD_MOVER(_globals->_player, 150, 300);
+ ADD_MOVER(g_globals->_player, 150, 300);
break;
case 6:
- _globals->_stripNum = 4000;
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_stripNum = 4000;
+ g_globals->_sceneManager.changeScene(4000);
remove();
break;
}
}
void Scene4045::Action2::signal() {
- Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+ Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(15);
break;
case 1:
- scene->_stripManager.start(_globals->_stripNum, this, scene);
+ scene->_stripManager.start(g_globals->_stripNum, this, scene);
break;
case 2:
scene->_olloFace.animate(ANIM_MODE_NONE, NULL);
setDelay(10);
break;
case 3:
- if (_globals->getFlag(38)) {
- _globals->_player.enableControl();
+ if (g_globals->getFlag(38)) {
+ g_globals->_player.enableControl();
remove();
} else {
- ADD_MOVER(_globals->_player, 150, 300);
+ ADD_MOVER(g_globals->_player, 150, 300);
}
break;
case 4:
- _globals->setFlag(39);
- _globals->_sceneManager.changeScene(4000);
+ g_globals->setFlag(39);
+ g_globals->_sceneManager.changeScene(4000);
break;
}
}
void Scene4045::Action3::signal() {
- Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+ Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_hotspot4.animate(ANIM_MODE_5, this);
break;
case 1:
@@ -1743,10 +1745,10 @@ void Scene4045::Action3::signal() {
case 2:
scene->_hotspot4.animate(ANIM_MODE_6, NULL);
scene->_olloFace.animate(ANIM_MODE_NONE, NULL);
- ADD_MOVER(_globals->_player, 91, 1264);
+ ADD_MOVER(g_globals->_player, 91, 1264);
break;
case 3:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -1755,7 +1757,7 @@ void Scene4045::Action3::signal() {
/*--------------------------------------------------------------------------*/
void Scene4045::OlloStand::doAction(int action) {
- Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+ Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
@@ -1772,20 +1774,20 @@ void Scene4045::OlloStand::doAction(int action) {
setStrip(6);
animate(ANIM_MODE_NONE, NULL);
}
- if (_globals->_player._position.y < 135) {
+ if (g_globals->_player._position.y < 135) {
scene->_sceneMode = 4046;
_numFrames = 10;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
- scene->setAction(&scene->_sequenceManager, this, 4046, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, this, 4046, &g_globals->_player, this, NULL);
} else {
- if (!_globals->getFlag(31)) {
- _globals->setFlag(31);
- _globals->_stripNum = 4080;
- } else if (!_globals->getFlag(38))
- _globals->_stripNum = 4060;
+ if (!g_globals->getFlag(31)) {
+ g_globals->setFlag(31);
+ g_globals->_stripNum = 4080;
+ } else if (!g_globals->getFlag(38))
+ g_globals->_stripNum = 4060;
else
- _globals->_stripNum = 4503;
+ g_globals->_stripNum = 4503;
scene->setAction(&scene->_action2);
}
@@ -1797,7 +1799,7 @@ void Scene4045::OlloStand::doAction(int action) {
}
void Scene4045::Miranda::doAction(int action) {
- Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+ Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1805,7 +1807,7 @@ void Scene4045::Miranda::doAction(int action) {
break;
case CURSOR_TALK:
scene->_sceneMode = 4102;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_sequenceManager, scene, 4104, NULL);
break;
default:
@@ -1815,22 +1817,22 @@ void Scene4045::Miranda::doAction(int action) {
}
void Scene4045::Necklace::doAction(int action) {
- Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+ Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4045, 17);
break;
case CURSOR_USE:
- if (_globals->_player._position.y < 135) {
+ if (g_globals->_player._position.y < 135) {
SceneItem::display2(4045, 16);
RING_INVENTORY._peg._sceneNumber = 1;
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
remove();
} else {
scene->_sceneMode = 4047;
- _globals->_player.disableControl();
- scene->setAction(&scene->_sequenceManager, scene, 4047, &_globals->_player, &scene->_olloStand, NULL);
+ g_globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager, scene, 4047, &g_globals->_player, &scene->_olloStand, NULL);
}
break;
default:
@@ -1875,13 +1877,13 @@ void Scene4045::postInit(SceneObjectList *OwnerList) {
_flame.setPosition(Common::Point(47, 111));
_flame.animate(ANIM_MODE_2, NULL);
_flame.fixPriority(156);
- _globals->_sceneItems.push_back(&_flame);
+ g_globals->_sceneItems.push_back(&_flame);
- _globals->_player.postInit();
- _globals->_player.setVisage(4200);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._moveDiff = Common::Point(7, 4);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(4200);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._moveDiff = Common::Point(7, 4);
_olloStand.postInit();
_olloStand.setVisage(4051);
@@ -1891,10 +1893,10 @@ void Scene4045::postInit(SceneObjectList *OwnerList) {
_olloFace.setStrip(4);
_olloFace.fixPriority(152);
- if(_globals->_sceneManager._previousScene == 4050) {
- _globals->_soundHandler.play(155);
- _globals->_player.setPosition(Common::Point(72, 128));
- _globals->_player.enableControl();
+ if(g_globals->_sceneManager._previousScene == 4050) {
+ g_globals->_soundHandler.play(155);
+ g_globals->_player.setPosition(Common::Point(72, 128));
+ g_globals->_player.enableControl();
_olloStand.setStrip(5);
_olloStand.setPosition(Common::Point(173, 99));
@@ -1908,13 +1910,13 @@ void Scene4045::postInit(SceneObjectList *OwnerList) {
_necklace.setVisage(4045);
_necklace.setStrip(2);
_necklace.setPosition(Common::Point(108, 82));
- _globals->_sceneItems.push_back(&_necklace);
+ g_globals->_sceneItems.push_back(&_necklace);
}
} else {
- _globals->_player.setPosition(Common::Point(108, 192));
- _globals->_player.setStrip(4);
+ g_globals->_player.setPosition(Common::Point(108, 192));
+ g_globals->_player.setStrip(4);
- if (!_globals->getFlag(36) && !_globals->getFlag(43)) {
+ if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) {
_miranda.postInit();
_miranda.setVisage(4102);
_miranda.animate(ANIM_MODE_NONE, NULL);
@@ -1923,10 +1925,10 @@ void Scene4045::postInit(SceneObjectList *OwnerList) {
_miranda.changeZoom(-1);
_miranda.setPosition(Common::Point(66, 209));
- _globals->_sceneItems.push_back(&_miranda);
+ g_globals->_sceneItems.push_back(&_miranda);
}
- if (_globals->getFlag(31)) {
+ if (g_globals->getFlag(31)) {
// Olo asleep
_olloStand.setVisage(4051);
_olloStand.setStrip(5);
@@ -1941,7 +1943,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) {
_necklace.setVisage(4045);
_necklace.setStrip(2);
_necklace.setPosition(Common::Point(108, 82));
- _globals->_sceneItems.push_back(&_necklace);
+ g_globals->_sceneItems.push_back(&_necklace);
}
} else {
_olloStand.setPosition(Common::Point(186, 149));
@@ -1953,14 +1955,14 @@ void Scene4045::postInit(SceneObjectList *OwnerList) {
_hotspot4.setPosition(Common::Point(202, 80));
_olloFace.setPosition(Common::Point(192, 77));
- _globals->setFlag(31);
+ g_globals->setFlag(31);
setAction(&_action1);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
}
}
- _globals->_sceneItems.addItems(&_olloStand, &_hotspot7, &_hotspot8, &_hotspot9, &_hotspot10,
+ g_globals->_sceneItems.addItems(&_olloStand, &_hotspot7, &_hotspot8, &_hotspot9, &_hotspot10,
&_hotspot13, &_hotspot11, &_hotspot12, &_hotspot14, NULL);
}
@@ -1982,34 +1984,34 @@ void Scene4045::signal() {
_olloFace.animate(ANIM_MODE_NONE, NULL);
break;
case 4050:
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_sceneManager.changeScene(4000);
break;
case 4102:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
void Scene4045::dispatch() {
if (!_action) {
- if (_globals->_player.getRegionIndex() == 8) {
- _globals->_player.addMover(NULL);
+ if (g_globals->_player.getRegionIndex() == 8) {
+ g_globals->_player.addMover(NULL);
if (_olloStand._strip != 1) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 4046;
_olloStand._numFrames = 10;
- setAction(&_sequenceManager, this, 4046, &_globals->_player, &_olloStand, NULL);
+ setAction(&_sequenceManager, this, 4046, &g_globals->_player, &_olloStand, NULL);
} else {
setAction(&_action3);
}
}
- if (_globals->_player.getRegionIndex() == 10)
- _globals->_sceneManager.changeScene(4050);
- if (_globals->_player._position.y >= 196) {
+ if (g_globals->_player.getRegionIndex() == 10)
+ g_globals->_sceneManager.changeScene(4050);
+ if (g_globals->_player._position.y >= 196) {
_sceneMode = 4050;
- _globals->_player.disableControl();
- setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL);
+ g_globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 4105, &g_globals->_player, NULL);
}
}
@@ -2023,21 +2025,21 @@ void Scene4045::dispatch() {
void Scene4050::Action1::signal() {
// "Map" on the wall
- Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+ Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1: {
Common::Point pt(204, 152);
PlayerMover *mover = new PlayerMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_player.checkAngle(&scene->_hotspot17);
+ g_globals->_player.checkAngle(&scene->_hotspot17);
scene->_hotspot14.postInit();
scene->_hotspot14.setVisage(4050);
@@ -2047,11 +2049,11 @@ void Scene4050::Action1::signal() {
setDelay(10);
break;
case 3:
- _globals->_events.waitForPress();
- _globals->setFlag(45);
+ g_globals->_events.waitForPress();
+ g_globals->setFlag(45);
scene->_hotspot14.remove();
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -2061,34 +2063,34 @@ void Scene4050::Action2::signal() {
// Climb down the rope
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(120);
break;
case 1:
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- _globals->_player.setVisage(4202);
- _globals->_player.changeZoom(100);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(192, 130));
+ g_globals->_player.setVisage(4202);
+ g_globals->_player.changeZoom(100);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(192, 130));
- ADD_MOVER(_globals->_player, 215, 130);
+ ADD_MOVER(g_globals->_player, 215, 130);
break;
case 3:
- _globals->_player.setVisage(4052);
- _globals->_player.setStrip(5);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(236, 130));
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(4052);
+ g_globals->_player.setStrip(5);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(236, 130));
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 4:
- _globals->_player.setVisage(4202);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setPosition(Common::Point(210, 185));
- _globals->_player.fixPriority(-1);
- _globals->_player.enableControl();
+ g_globals->_player.setVisage(4202);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setPosition(Common::Point(210, 185));
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -2101,51 +2103,51 @@ void Scene4050::Action3::signal() {
ADD_PLAYER_MOVER(210, 185);
break;
case 1:
- _globals->_player.fixPriority(200);
- _globals->_player.setVisage(4052);
- _globals->_player.setStrip(5);
- _globals->_player.changeZoom(100);
- _globals->_player.setFrame(_globals->_player.getFrameCount());
- _globals->_player.setPosition(Common::Point(236, 130));
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.fixPriority(200);
+ g_globals->_player.setVisage(4052);
+ g_globals->_player.setStrip(5);
+ g_globals->_player.changeZoom(100);
+ g_globals->_player.setFrame(g_globals->_player.getFrameCount());
+ g_globals->_player.setPosition(Common::Point(236, 130));
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 2:
- _globals->_player.setVisage(4202);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(215, 130));
- ADD_MOVER(_globals->_player, 212, 130);
+ g_globals->_player.setVisage(4202);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(215, 130));
+ ADD_MOVER(g_globals->_player, 212, 130);
break;
case 3:
- _globals->_stripNum = 4050;
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_stripNum = 4050;
+ g_globals->_sceneManager.changeScene(4000);
break;
}
}
void Scene4050::Action4::signal() {
- Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+ Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
- ADD_MOVER(_globals->_player, 189, 135);
- _globals->_player.fixPriority(200);
+ g_globals->_player.disableControl();
+ ADD_MOVER(g_globals->_player, 189, 135);
+ g_globals->_player.fixPriority(200);
break;
case 1:
- _globals->_player._moveDiff.y = 3;
- _globals->_player.setStrip2(3);
- _globals->_player._frame = 1;
- _globals->_player.setPosition(Common::Point(189, 129));
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player._moveDiff.y = 3;
+ g_globals->_player.setStrip2(3);
+ g_globals->_player._frame = 1;
+ g_globals->_player.setPosition(Common::Point(189, 129));
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- _globals->_player.setVisage(4202);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(192, 130));
- _globals->_player.changeZoom(100);
- ADD_MOVER(_globals->_player, 215, 130);
+ g_globals->_player.setVisage(4202);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(192, 130));
+ g_globals->_player.changeZoom(100);
+ ADD_MOVER(g_globals->_player, 215, 130);
scene->_hotspot16.postInit();
scene->_hotspot16.setVisage(4052);
@@ -2155,18 +2157,18 @@ void Scene4050::Action4::signal() {
ADD_MOVER(scene->_hotspot16, 172, 188);
break;
case 3:
- _globals->_player.setVisage(4052);
- _globals->_player.setStrip(5);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(238, 130));
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(4052);
+ g_globals->_player.setStrip(5);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(238, 130));
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 4:
- _globals->_player.setVisage(4052);
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(216, 184));
- _globals->_player.fixPriority(-1);
+ g_globals->_player.setVisage(4052);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(216, 184));
+ g_globals->_player.fixPriority(-1);
break;
case 5:
scene->_hotspot16.setStrip2(4);
@@ -2175,12 +2177,12 @@ void Scene4050::Action4::signal() {
break;
case 6:
scene->_hotspot16.animate(ANIM_MODE_5, NULL);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 7:
- _globals->_player.setVisage(4202);
- _globals->_player.setStrip(6);
- _globals->_player.setFrame(1);
+ g_globals->_player.setVisage(4202);
+ g_globals->_player.setStrip(6);
+ g_globals->_player.setFrame(1);
scene->_stripManager.start(4051, this);
break;
@@ -2188,7 +2190,7 @@ void Scene4050::Action4::signal() {
setDelay(15);
break;
case 9:
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_sceneManager.changeScene(4000);
break;
}
}
@@ -2196,14 +2198,14 @@ void Scene4050::Action4::signal() {
/*--------------------------------------------------------------------------*/
void Scene4050::Hotspot15::doAction(int action) {
- Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+ Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4050, 14);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setAction(&scene->_action3);
break;
default:
@@ -2213,7 +2215,7 @@ void Scene4050::Hotspot15::doAction(int action) {
}
void Scene4050::Hotspot17::doAction(int action) {
- Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+ Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2255,50 +2257,50 @@ void Scene4050::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerQText);
_stripManager.addSpeaker(&_speakerGameText);
- _globals->_player.postInit();
+ g_globals->_player.postInit();
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 4000:
- if (_globals->getFlag(41)) {
+ if (g_globals->getFlag(41)) {
// Using a rope
_hotspot15.postInit();
_hotspot15.setVisage(4054);
_hotspot15.setPosition(Common::Point(206, 103));
- _globals->_sceneItems.push_back(&_hotspot15);
+ g_globals->_sceneItems.push_back(&_hotspot15);
- _globals->_player.setVisage(4008);
- _globals->_player.setPosition(Common::Point(206, 62));
- _globals->_player.changeZoom(130);
- _globals->_player.fixPriority(200);
- _globals->_player.setStrip(2);
+ g_globals->_player.setVisage(4008);
+ g_globals->_player.setPosition(Common::Point(206, 62));
+ g_globals->_player.changeZoom(130);
+ g_globals->_player.fixPriority(200);
+ g_globals->_player.setStrip(2);
setAction(&_action2);
- _globals->_soundHandler.play(175);
+ g_globals->_soundHandler.play(175);
} else {
// Without the rope
- _globals->_player.setVisage(5315);
- _globals->_player.setPosition(Common::Point(189, 83));
- _globals->_player.changeZoom(130);
- _globals->_player.setStrip2(2);
- _globals->_player._moveDiff.y = 10;
- _globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player.setVisage(5315);
+ g_globals->_player.setPosition(Common::Point(189, 83));
+ g_globals->_player.changeZoom(130);
+ g_globals->_player.setStrip2(2);
+ g_globals->_player._moveDiff.y = 10;
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
setAction(&_action4);
- _globals->_soundHandler.play(176);
+ g_globals->_soundHandler.play(176);
}
break;
case 4045:
_hotspot15.postInit();
_hotspot15.setVisage(4054);
_hotspot15.setPosition(Common::Point(206, 103));
- _globals->_sceneItems.push_back(&_hotspot15);
+ g_globals->_sceneItems.push_back(&_hotspot15);
- _globals->_player.setVisage(4202);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(193, 193));
+ g_globals->_player.setVisage(4202);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(193, 193));
- _globals->_soundHandler.play(175);
+ g_globals->_soundHandler.play(175);
break;
default:
break;
@@ -2327,25 +2329,25 @@ void Scene4050::postInit(SceneObjectList *OwnerList) {
_hotspot11.setBounds(Rect(263, 105, 279, 147));
_hotspot12.setBounds(Rect(258, 154, 307, 180));
- _globals->_sceneItems.addItems(&_hotspot17, &_hotspot12, &_hotspot11, &_hotspot10, &_hotspot13,
+ g_globals->_sceneItems.addItems(&_hotspot17, &_hotspot12, &_hotspot11, &_hotspot10, &_hotspot13,
&_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot8, &_hotspot9,
&_hotspot7, &_hotspot1, NULL);
}
void Scene4050::signal() {
if (_sceneMode == 4050)
- _globals->_sceneManager.changeScene(4045);
+ g_globals->_sceneManager.changeScene(4045);
}
void Scene4050::dispatch() {
if (!_action) {
- if ((_globals->_player._canWalk) && (_globals->_player._position.y > 196)) {
+ if ((g_globals->_player._canWalk) && (g_globals->_player._position.y > 196)) {
_sceneMode = 4050;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
Common::Point pt(160, 275);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
}
}
Scene::dispatch();
@@ -2357,28 +2359,28 @@ void Scene4050::dispatch() {
*--------------------------------------------------------------------------*/
void Scene4100::Action1::signal() {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(10);
break;
case 1:
- scene->_stripManager.start(_globals->_stripNum, this);
+ scene->_stripManager.start(g_globals->_stripNum, this);
break;
case 2:
setDelay(30);
break;
case 3:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene4100::Action2::signal() {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2409,12 +2411,12 @@ void Scene4100::Action2::signal() {
void Scene4100::Action3::signal() {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->clearFlag(43);
- _globals->setFlag(36);
+ g_globals->clearFlag(43);
+ g_globals->setFlag(36);
setDelay(15);
break;
case 1:
@@ -2430,7 +2432,7 @@ void Scene4100::Action3::signal() {
setDelay(15);
break;
case 5:
- _globals->_sceneManager.changeScene(4150);
+ g_globals->_sceneManager.changeScene(4150);
break;
default:
break;
@@ -2439,7 +2441,7 @@ void Scene4100::Action3::signal() {
void Scene4100::Action4::signal() {
// Rock getting drunk
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2454,26 +2456,26 @@ void Scene4100::Action4::signal() {
scene->_hotspot1.animate(ANIM_MODE_5, this);
break;
case 3:
- _globals->clearFlag(43);
- _globals->setFlag(42);
+ g_globals->clearFlag(43);
+ g_globals->setFlag(42);
scene->_stripManager.start(4119, this);
break;
case 4:
setDelay(15);
break;
case 5:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene4100::Action5::signal() {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
ADD_PLAYER_MOVER(58, 151);
break;
case 1:
@@ -2486,10 +2488,10 @@ void Scene4100::Action5::signal() {
scene->_ladder.setPosition(Common::Point(49, 144));
RING_INVENTORY._ladder._sceneNumber = 4100;
- _globals->_sceneItems.push_front(&scene->_ladder);
+ g_globals->_sceneItems.push_front(&scene->_ladder);
}
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -2497,16 +2499,16 @@ void Scene4100::Action5::signal() {
void Scene4100::Action6::signal() {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_stripManager.start(4103, this);
ADD_PLAYER_MOVER(245, 167);
break;
case 1:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -2515,39 +2517,39 @@ void Scene4100::Action6::signal() {
/*--------------------------------------------------------------------------*/
void Scene4100::Hotspot1::doAction(int action) {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
SceneItem::display2(4100, 16);
break;
case OBJECT_ALE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action3);
break;
case CURSOR_LOOK:
- SceneItem::display2(4100, _globals->getFlag(42) ? 24 : 12);
+ SceneItem::display2(4100, g_globals->getFlag(42) ? 24 : 12);
break;
case CURSOR_USE:
SceneItem::display2(4100, 22);
break;
case CURSOR_TALK:
if (RING_INVENTORY._peg._sceneNumber == 1) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 4109;
scene->setAction(&scene->_sequenceManager, scene, 4109, NULL);
- } else if (_globals->getFlag(42)) {
+ } else if (g_globals->getFlag(42)) {
scene->_sceneMode = 4102;
scene->setAction(&scene->_sequenceManager, scene, 4102, NULL);
} else {
- if (_globals->getFlag(33))
- _globals->_stripNum = 4077;
- else if (_globals->getFlag(82)) {
- _globals->clearFlag(82);
- _globals->_stripNum = 4100;
+ if (g_globals->getFlag(33))
+ g_globals->_stripNum = 4077;
+ else if (g_globals->getFlag(82)) {
+ g_globals->clearFlag(82);
+ g_globals->_stripNum = 4100;
} else {
- _globals->_stripNum = 4075;
- _globals->setFlag(33);
+ g_globals->_stripNum = 4075;
+ g_globals->setFlag(33);
}
scene->setAction(&scene->_action1);
@@ -2571,7 +2573,7 @@ void Scene4100::Hotspot2::doAction(int action) {
}
void Scene4100::Miranda::doAction(int action) {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2588,15 +2590,15 @@ void Scene4100::Miranda::doAction(int action) {
}
void Scene4100::Ladder::doAction(int action) {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4100, 2);
break;
case CURSOR_USE:
- if (_globals->getFlag(42)) {
- _globals->_player.disableControl();
+ if (g_globals->getFlag(42)) {
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action5);
} else {
scene->_sceneMode = 4102;
@@ -2613,14 +2615,14 @@ void Scene4100::Ladder::doAction(int action) {
Exit hotspot, South
*/
void Scene4100::Hotspot14::doAction(int action) {
- Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+ Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4100, 0);
break;
case OBJECT_LADDER:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action5);
break;
default:
@@ -2657,13 +2659,13 @@ void Scene4100::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerML);
_stripManager.addSpeaker(&_speakerQR);
- _globals->_player.postInit();
- _globals->_player.setVisage(4200);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(4);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(88, 180));
- _globals->_player._moveDiff = Common::Point(7, 4);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(4200);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(4);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(88, 180));
+ g_globals->_player._moveDiff = Common::Point(7, 4);
_hotspot1.postInit();
_hotspot1.setVisage(4102);
@@ -2682,18 +2684,18 @@ void Scene4100::postInit(SceneObjectList *OwnerList) {
_hotspot4.setStrip2(2);
_hotspot4.setPosition(Common::Point(152, 167));
- if (_globals->getFlag(36)) {
+ if (g_globals->getFlag(36)) {
_hotspot1.setVisage(4105);
_hotspot1.setStrip(1);
_hotspot1.setFrame(4);
- } else if (!_globals->getFlag(43)) {
+ } else if (!g_globals->getFlag(43)) {
_miranda.postInit();
_miranda.setVisage(4102);
_miranda.setStrip2(3);
_miranda.setFrame(2);
_miranda.setPosition(Common::Point(65, 188));
- _globals->_sceneItems.push_back(&_miranda);
+ g_globals->_sceneItems.push_back(&_miranda);
}
if (RING_INVENTORY._ladder._sceneNumber == 4100) {
@@ -2701,7 +2703,7 @@ void Scene4100::postInit(SceneObjectList *OwnerList) {
_ladder.setVisage(4101);
_ladder.setPosition(Common::Point(49, 144));
- _globals->_sceneItems.push_back(&_ladder);
+ g_globals->_sceneItems.push_back(&_ladder);
}
_hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
@@ -2713,41 +2715,41 @@ void Scene4100::postInit(SceneObjectList *OwnerList) {
_hotspot12.setBounds(Rect(229, 59, 256, 122));
_hotspot13.setBounds(Rect(255, 152, 286, 183));
- _globals->_sceneItems.addItems(&_hotspot3, &_hotspot1, &_hotspot13, &_hotspot12, &_hotspot4,
+ g_globals->_sceneItems.addItems(&_hotspot3, &_hotspot1, &_hotspot13, &_hotspot12, &_hotspot4,
&_hotspot11, &_hotspot9, &_hotspot7, &_hotspot10, &_hotspot8, &_hotspot14, NULL);
- if (_globals->_sceneManager._previousScene == 4150) {
- _globals->_soundHandler.play(155);
+ if (g_globals->_sceneManager._previousScene == 4150) {
+ g_globals->_soundHandler.play(155);
- if (!_globals->getFlag(42)) {
+ if (!g_globals->getFlag(42)) {
_hotspot1.setVisage(4104);
_hotspot1.setPosition(Common::Point(152, 118));
_hotspot1.setStrip2(-1);
_hotspot1.setFrame2(-1);
_hotspot1.setFrame(1);
- _globals->_player.setStrip(2);
- _globals->_player.disableControl();
+ g_globals->_player.setStrip(2);
+ g_globals->_player.disableControl();
setAction(&_action4);
- _globals->clearFlag(43);
+ g_globals->clearFlag(43);
} else {
// Workaround: In the original, the mouse is hidden when Quinn
// goes back to scene 4150 then to scene 4100. This enables everything.
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
}
- _globals->_player.setPosition(Common::Point(252, 139));
- _globals->_player.setStrip(2);
+ g_globals->_player.setPosition(Common::Point(252, 139));
+ g_globals->_player.setStrip(2);
} else {
- if ((RING_INVENTORY._ale._sceneNumber == 4100) && !_globals->getFlag(42)) {
- _globals->_player.disableControl();
+ if ((RING_INVENTORY._ale._sceneNumber == 4100) && !g_globals->getFlag(42)) {
+ g_globals->_player.disableControl();
setAction(&_action3);
}
- if (_globals->getFlag(35)) {
- _globals->_player.disableControl();
+ if (g_globals->getFlag(35)) {
+ g_globals->_player.disableControl();
_sceneMode = 4101;
- setAction(&_sequenceManager, this, 4101, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 4101, &g_globals->_player, NULL);
}
}
}
@@ -2755,28 +2757,28 @@ void Scene4100::postInit(SceneObjectList *OwnerList) {
void Scene4100::signal() {
switch (_sceneMode) {
case 4101:
- _globals->_sceneManager.changeScene(4000);
+ g_globals->_sceneManager.changeScene(4000);
break;
case 4102:
case 4103:
case 4109:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
}
}
void Scene4100::dispatch() {
if (!_action) {
- if ((_globals->_player.getRegionIndex() == 15) && !_globals->getFlag(42))
+ if ((g_globals->_player.getRegionIndex() == 15) && !g_globals->getFlag(42))
setAction(&_action6);
- if (_globals->_player.getRegionIndex() == 8)
- _globals->_sceneManager.changeScene(4150);
+ if (g_globals->_player.getRegionIndex() == 8)
+ g_globals->_sceneManager.changeScene(4150);
- if (_globals->_player._position.y >= 196) {
- _globals->_player.disableControl();
+ if (g_globals->_player._position.y >= 196) {
+ g_globals->_player.disableControl();
_sceneMode = 4101;
- setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 4105, &g_globals->_player, NULL);
}
}
@@ -2789,7 +2791,7 @@ void Scene4100::dispatch() {
*--------------------------------------------------------------------------*/
void Scene4150::Action1::signal() {
- Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+ Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene;
byte adjustData[4] = {0, 0, 0, 0};
switch (_actionIndex++) {
@@ -2807,7 +2809,7 @@ void Scene4150::Action1::signal() {
break;
case 4: {
for (int idx = 100; idx >= 0; idx -= 5) {
- _globals->_scenePalette.fade(adjustData, false, idx);
+ g_globals->_scenePalette.fade(adjustData, false, idx);
g_system->updateScreen();
g_system->delayMillis(10);
}
@@ -2826,8 +2828,8 @@ void Scene4150::Action1::signal() {
break;
}
case 5:
- _globals->_scenePalette.loadPalette(4150);
- _globals->_scenePalette.refresh();
+ g_globals->_scenePalette.loadPalette(4150);
+ g_globals->_scenePalette.refresh();
setDelay(60);
break;
case 6:
@@ -2835,7 +2837,7 @@ void Scene4150::Action1::signal() {
break;
case 7:
for (int idx = 100; idx >= 0; idx -= 5) {
- _globals->_scenePalette.fade(adjustData, false, idx);
+ g_globals->_scenePalette.fade(adjustData, false, idx);
g_system->updateScreen();
g_system->delayMillis(10);
}
@@ -2847,28 +2849,28 @@ void Scene4150::Action1::signal() {
scene->_hotspot1.setFrame(1);
scene->_hotspot1.show();
- _globals->_player.setVisage(4200);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(3);
- _globals->_player.setPosition(Common::Point(139, 166));
- _globals->_player._moveDiff = Common::Point(7, 3);
- _globals->_player.show();
+ g_globals->_player.setVisage(4200);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(3);
+ g_globals->_player.setPosition(Common::Point(139, 166));
+ g_globals->_player._moveDiff = Common::Point(7, 3);
+ g_globals->_player.show();
setDelay(120);
break;
case 8:
- _globals->_scenePalette.loadPalette(4150);
- _globals->_scenePalette.refresh();
+ g_globals->_scenePalette.loadPalette(4150);
+ g_globals->_scenePalette.refresh();
setDelay(30);
break;
case 9:
scene->_stripManager.start(4523, this);
break;
case 10:
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player._moveDiff = Common::Point(7, 4);
- _globals->_player.setStrip(3);
- _globals->_player.enableControl();
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player._moveDiff = Common::Point(7, 4);
+ g_globals->_player.setStrip(3);
+ g_globals->_player.enableControl();
remove();
break;
@@ -2876,7 +2878,7 @@ void Scene4150::Action1::signal() {
}
void Scene4150::Action2::signal() {
- Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+ Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -2888,10 +2890,10 @@ void Scene4150::Action2::signal() {
scene->_hotspot1.setFrame(1);
scene->_hotspot1.animate(ANIM_MODE_5, this);
- _globals->_player.animate(ANIM_MODE_5, NULL);
+ g_globals->_player.animate(ANIM_MODE_5, NULL);
break;
case 2:
- _globals->_player.hide();
+ g_globals->_player.hide();
scene->_hotspot1.setVisage(4153);
scene->_hotspot1.setStrip(1);
scene->_hotspot1.setFrame(1);
@@ -2904,15 +2906,15 @@ void Scene4150::Action2::signal() {
}
void Scene4150::Action3::signal() {
- Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+ Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(15);
break;
case 1:
- _globals->_player.checkAngle(&scene->_hotspot3);
+ g_globals->_player.checkAngle(&scene->_hotspot3);
if (RING_INVENTORY._rope._sceneNumber == 1) {
scene->_hotspot3.postInit();
@@ -2920,13 +2922,13 @@ void Scene4150::Action3::signal() {
scene->_hotspot3.setPosition(Common::Point(175, 70));
RING_INVENTORY._rope._sceneNumber = 4150;
- _globals->_sceneItems.push_front(&scene->_hotspot3);
+ g_globals->_sceneItems.push_front(&scene->_hotspot3);
} else {
RING_INVENTORY._rope._sceneNumber = 1;
scene->_hotspot3.remove();
}
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -2935,7 +2937,7 @@ void Scene4150::Action3::signal() {
/*--------------------------------------------------------------------------*/
void Scene4150::HotspotGroup1::doAction(int action) {
- Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+ Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2950,8 +2952,8 @@ void Scene4150::HotspotGroup1::doAction(int action) {
void Scene4150::HotspotGroup3::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(4150, _globals->getFlag(46) ? 9 : 8);
- _globals->setFlag(46);
+ SceneItem::display2(4150, g_globals->getFlag(46) ? 9 : 8);
+ g_globals->setFlag(46);
break;
case CURSOR_USE:
SceneItem::display2(4150, 30);
@@ -2962,8 +2964,8 @@ void Scene4150::HotspotGroup3::doAction(int action) {
void Scene4150::HotspotGroup6::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(4150, _globals->getFlag(47) ? 16 : 15);
- _globals->setFlag(47);
+ SceneItem::display2(4150, g_globals->getFlag(47) ? 16 : 15);
+ g_globals->setFlag(47);
break;
case CURSOR_USE:
SceneItem::display2(4150, 31);
@@ -2972,7 +2974,7 @@ void Scene4150::HotspotGroup6::doAction(int action) {
}
void Scene4150::Hotspot3::doAction(int action) {
- Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+ Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -3029,31 +3031,31 @@ void Scene4150::postInit(SceneObjectList *OwnerList) {
_hotspot1.postInit();
_hotspot1.setPosition(Common::Point(177, 201));
- if (_globals->getFlag(44)) {
- _globals->_player.postInit();
- _globals->_player.setVisage(4200);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setStrip(2);
- _globals->_player.setPosition(Common::Point(328, 160));
- _globals->_player._moveDiff = Common::Point(7, 4);
- _globals->_player.disableControl();
+ if (g_globals->getFlag(44)) {
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(4200);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setPosition(Common::Point(328, 160));
+ g_globals->_player._moveDiff = Common::Point(7, 4);
+ g_globals->_player.disableControl();
_sceneMode = 4151;
- setAction(&_sequenceManager, this, 4151, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 4151, &g_globals->_player, NULL);
_hotspot1.setVisage(4157);
_hotspot1.setPosition(Common::Point(177, 201));
} else {
- _globals->_player.postInit();
- _globals->_player.setVisage(4154);
- _globals->_player._canWalk = false;
- _globals->_player.setPosition(Common::Point(198, 202));
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(4154);
+ g_globals->_player._canWalk = false;
+ g_globals->_player.setPosition(Common::Point(198, 202));
+ g_globals->_player.disableControl();
_hotspot1.setVisage(4152);
setAction(&_action1);
- _globals->setFlag(44);
+ g_globals->setFlag(44);
}
if (RING_INVENTORY._rope._sceneNumber == 4150) {
@@ -3061,10 +3063,10 @@ void Scene4150::postInit(SceneObjectList *OwnerList) {
_hotspot3.setVisage(4150);
_hotspot3.setPosition(Common::Point(175, 70));
- _globals->_sceneItems.push_back(&_hotspot3);
+ g_globals->_sceneItems.push_back(&_hotspot3);
}
- _globals->_sceneItems.push_back(&_hotspot1);
+ g_globals->_sceneItems.push_back(&_hotspot1);
_hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
_hotspot6.setBounds(Rect(28, 121, 80, 148));
@@ -3089,32 +3091,32 @@ void Scene4150::postInit(SceneObjectList *OwnerList) {
_hotspot25.setBounds(Rect(183, 155, 316, 190));
_hotspot26.setBounds(Rect(98, 169, 238, 198));
- _globals->_sceneItems.addItems(&_hotspot24, &_hotspot23, &_hotspot13, &_hotspot25,
+ g_globals->_sceneItems.addItems(&_hotspot24, &_hotspot23, &_hotspot13, &_hotspot25,
&_hotspot26, &_hotspot19, &_hotspot22, &_hotspot20, &_hotspot17, &_hotspot16,
&_hotspot15, &_hotspot11, &_hotspot14, &_hotspot18, &_hotspot21, &_hotspot12,
&_hotspot10, &_hotspot9, &_hotspot8, &_hotspot7, &_hotspot6, &_hotspot2,
&_hotspot5, NULL);
- _globals->_soundHandler.play(165);
+ g_globals->_soundHandler.play(165);
_soundHandler.play(311);
}
void Scene4150::signal() {
if (_sceneMode == 4151)
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
else if (_sceneMode == 4152)
- _globals->_sceneManager.changeScene(4100);
+ g_globals->_sceneManager.changeScene(4100);
}
void Scene4150::dispatch() {
Scene::dispatch();
- if (!_action && (_globals->_player._position.x >= 316)) {
- _globals->_soundHandler.fadeOut(NULL);
+ if (!_action && (g_globals->_player._position.x >= 316)) {
+ g_globals->_soundHandler.fadeOut(NULL);
_soundHandler.fadeOut(NULL);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 4152;
- setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 4152, &g_globals->_player, NULL);
}
}
@@ -3124,15 +3126,15 @@ void Scene4150::dispatch() {
*--------------------------------------------------------------------------*/
void Scene4250::Action1::signal() {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
- ADD_MOVER_NULL(_globals->_player, 6, 190);
+ ADD_MOVER_NULL(g_globals->_player, 6, 190);
ADD_MOVER_NULL(scene->_hotspot3, 9, 195);
ADD_MOVER(scene->_hotspot1, 12, 185);
break;
@@ -3155,44 +3157,44 @@ void Scene4250::Action1::signal() {
scene->_stripManager.start(4470, this);
break;
case 8:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene4250::Action2::signal() {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
ADD_PLAYER_MOVER(247, 182);
break;
case 1:
- _globals->_player.setVisage(2670);
- _globals->_player.changeZoom(50);
- _globals->_player.setStrip(3);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2670);
+ g_globals->_player.changeZoom(50);
+ g_globals->_player.setStrip(3);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) {
+ if ((g_globals->_stripNum == 9000) || (g_globals->_stripNum == 4300)) {
scene->_stripManager.start(4205, this);
} else {
scene->_stripManager.start(4490, this);
}
break;
case 3:
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 4:
- _globals->_player.setVisage(2602);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.changeZoom(70);
+ g_globals->_player.setVisage(2602);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.changeZoom(70);
- if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) {
- _globals->_player.enableControl();
+ if ((g_globals->_stripNum == 9000) || (g_globals->_stripNum == 4300)) {
+ g_globals->_player.enableControl();
remove();
} else {
ADD_PLAYER_MOVER(6, 180);
@@ -3206,19 +3208,19 @@ void Scene4250::Action2::signal() {
ADD_MOVER_NULL(scene->_hotspot5, -30, 195);
break;
case 6:
- _globals->clearFlag(59);
- _globals->clearFlag(70);
- _globals->clearFlag(37);
- _globals->clearFlag(114);
- _globals->clearFlag(36);
- _globals->clearFlag(43);
- _globals->_sceneManager.changeScene(2100);
+ g_globals->clearFlag(59);
+ g_globals->clearFlag(70);
+ g_globals->clearFlag(37);
+ g_globals->clearFlag(114);
+ g_globals->clearFlag(36);
+ g_globals->clearFlag(43);
+ g_globals->_sceneManager.changeScene(2100);
break;
}
}
void Scene4250::Action3::signal() {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -3228,46 +3230,46 @@ void Scene4250::Action3::signal() {
scene->_stripManager.start(4480, this);
break;
case 2:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene4250::Action4::signal() {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
- _globals->_player.addMover(NULL);
+ g_globals->_player.addMover(NULL);
scene->_stripManager.start((RING_INVENTORY._helmet._sceneNumber == 4250) ? 4259 : 4256, this);
break;
case 2:
- ADD_PLAYER_MOVER(_globals->_player._position.x + 5, _globals->_player._position.y);
+ ADD_PLAYER_MOVER(g_globals->_player._position.x + 5, g_globals->_player._position.y);
break;
case 3:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene4250::Action5::signal() {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
scene->_hotspot4.fixPriority(195);
scene->_hotspot1.fixPriority(105);
- ADD_MOVER_NULL(_globals->_player, 6, 185);
+ ADD_MOVER_NULL(g_globals->_player, 6, 185);
ADD_MOVER_NULL(scene->_hotspot4, 9, 190);
ADD_MOVER(scene->_hotspot1, 12, 180);
break;
@@ -3280,7 +3282,7 @@ void Scene4250::Action5::signal() {
scene->_hotspot4.fixPriority(-1);
scene->_hotspot1.setStrip(5);
scene->_hotspot4.setStrip(7);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -3289,15 +3291,15 @@ void Scene4250::Action5::signal() {
/*--------------------------------------------------------------------------*/
void Scene4250::Hotspot1::doAction(int action) {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 19 : 14);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
- if (!_globals->_sceneObjects->contains(&scene->_hotspot4)) {
+ g_globals->_player.disableControl();
+ if (!g_globals->_sceneObjects->contains(&scene->_hotspot4)) {
scene->setAction(&scene->_action3);
} else {
scene->_sceneMode = 4260;
@@ -3306,7 +3308,7 @@ void Scene4250::Hotspot1::doAction(int action) {
scene->setAction(&scene->_sequenceManager, scene, 4265, this, NULL);
} else {
scene->setAction(&scene->_sequenceManager, scene,
- _globals->_sceneObjects->contains(&scene->_hotspot6) ? 4260 : 4262, this, NULL);
+ g_globals->_sceneObjects->contains(&scene->_hotspot6) ? 4260 : 4262, this, NULL);
}
}
break;
@@ -3330,7 +3332,7 @@ void Scene4250::Hotspot1::doAction(int action) {
void Scene4250::Hotspot2::doAction(int action) {
//Ship with stasis field
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -3338,19 +3340,19 @@ void Scene4250::Hotspot2::doAction(int action) {
SceneItem::display2(4250, 16);
break;
case OBJECT_SCANNER:
- if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300))
+ if ((g_globals->_stripNum == 9000) || (g_globals->_stripNum == 4300))
scene->setAction(&scene->_action2);
- else if (_globals->getFlag(55))
+ else if (g_globals->getFlag(55))
SceneItem::display2(4250, 17);
else {
- _globals->setFlag(55);
+ g_globals->setFlag(55);
scene->setAction(&scene->_action2);
}
break;
case OBJECT_STASIS_NEGATOR:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 4252;
- scene->setAction(&scene->_sequenceManager, scene, 4252, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 4252, &g_globals->_player, this, NULL);
break;
default:
SceneHotspot::doAction(action);
@@ -3359,7 +3361,7 @@ void Scene4250::Hotspot2::doAction(int action) {
}
void Scene4250::Hotspot4::doAction(int action) {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -3378,8 +3380,8 @@ void Scene4250::Hotspot4::doAction(int action) {
SceneHotspot::doAction(action);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
- if (!_globals->_sceneObjects->contains(&scene->_hotspot6)) {
+ g_globals->_player.disableControl();
+ if (!g_globals->_sceneObjects->contains(&scene->_hotspot6)) {
scene->_sceneMode = 4254;
scene->setAction(&scene->_sequenceManager, scene, 4263, NULL);
} else {
@@ -3401,7 +3403,7 @@ void Scene4250::Hotspot4::doAction(int action) {
}
void Scene4250::Hotspot6::doAction(int action) {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -3414,17 +3416,17 @@ void Scene4250::Hotspot6::doAction(int action) {
SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 20 : 3);
break;
case OBJECT_HELMET:
- _globals->_soundHandler.play(354);
- _globals->_player.disableControl();
+ g_globals->_soundHandler.play(354);
+ g_globals->_player.disableControl();
RING_INVENTORY._helmet._sceneNumber = 4250;
if (RING_INVENTORY._concentrator._sceneNumber == 1) {
- if (_globals->getFlag(115)) {
+ if (g_globals->getFlag(115)) {
scene->_sceneMode = 4269;
scene->setAction(&scene->_sequenceManager, scene, 4269, this, NULL);
} else {
- _globals->setFlag(115);
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->setFlag(115);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_sceneMode = 4256;
scene->setAction(&scene->_sequenceManager, scene, 4256, this, NULL);
}
@@ -3435,20 +3437,20 @@ void Scene4250::Hotspot6::doAction(int action) {
scene->_sceneMode = 4268;
scene->setAction(&scene->_sequenceManager, scene, 4268, this, NULL);
} else {
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
ADD_MOVER_NULL(scene->_hotspot1, 241, 169);
scene->_sceneMode = 4261;
- scene->setAction(&scene->_sequenceManager, scene, 4261, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 4261, &g_globals->_player, this, NULL);
}
break;
case OBJECT_NULLIFIER:
if (RING_INVENTORY._helmet._sceneNumber == 4250) {
- _globals->_soundHandler.play(353);
- _globals->_player.disableControl();
+ g_globals->_soundHandler.play(353);
+ g_globals->_player.disableControl();
RING_INVENTORY._helmet._sceneNumber = 1;
scene->_sceneMode = 4257;
- scene->setAction(&scene->_sequenceManager, scene, 4257, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 4257, &g_globals->_player, this, NULL);
} else {
SceneItem::display2(4250, 4);
}
@@ -3457,7 +3459,7 @@ void Scene4250::Hotspot6::doAction(int action) {
if (RING_INVENTORY._helmet._sceneNumber == 4250)
doAction(OBJECT_HELMET);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 4264;
scene->setAction(&scene->_sequenceManager, scene, 4264, this, NULL);
}
@@ -3466,7 +3468,7 @@ void Scene4250::Hotspot6::doAction(int action) {
if (RING_INVENTORY._helmet._sceneNumber == 4250)
doAction(OBJECT_HELMET);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if ((RING_INVENTORY._items._sceneNumber != 1) || (RING_INVENTORY._concentrator._sceneNumber != 1)) {
scene->_sceneMode = 4258;
scene->setAction(&scene->_sequenceManager, scene, 4258, this, NULL);
@@ -3478,7 +3480,7 @@ void Scene4250::Hotspot6::doAction(int action) {
scene->_hotspot2.hide();
scene->_sceneMode = 4259;
- scene->setAction(&scene->_sequenceManager, scene, 4259, &_globals->_player, this, &scene->_hotspot2, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 4259, &g_globals->_player, this, &scene->_hotspot2, NULL);
}
}
break;
@@ -3489,12 +3491,12 @@ void Scene4250::Hotspot6::doAction(int action) {
}
void Scene4250::Hotspot8::doAction(int action) {
- Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+ Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
case CURSOR_USE:
- _globals->_sceneManager.changeScene(4300);
+ g_globals->_sceneManager.changeScene(4300);
break;
case OBJECT_SCANNER:
SceneItem::display2(4250, 24);
@@ -3503,7 +3505,7 @@ void Scene4250::Hotspot8::doAction(int action) {
SceneItem::display2(4250, 25);
break;
case OBJECT_STASIS_NEGATOR:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 4270;
scene->setAction(&scene->_sequenceManager, scene,
(RING_INVENTORY._helmet._sceneNumber == 4250) ? 4270 : 4271, NULL);
@@ -3520,7 +3522,7 @@ Scene4250::Scene4250() :
_hotspot7(0, CURSOR_LOOK, 4250, 0, LIST_END) {
}
-void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
+void Scene4250::postInit(TsAGE::SceneObjectList *OwnerList) {
loadScene(4250);
Scene::postInit();
setZoomPercents(160, 90, 185, 100);
@@ -3540,13 +3542,13 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
_speakerPText.setTextPos(Common::Point(40, 100));
_hotspot8._sceneRegionId = 16;
- _globals->_player.postInit();
- _globals->_player.setVisage(2602);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(-13, 190));
- _globals->_player.changeZoom(-1);
- _globals->_player._moveDiff = Common::Point(4, 1);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2602);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(-13, 190));
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player._moveDiff = Common::Point(4, 1);
_hotspot1.postInit();
_hotspot1.setVisage(2801);
@@ -3555,9 +3557,9 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
_hotspot1.setPosition(Common::Point(-18, 185));
_hotspot1.changeZoom(-1);
_hotspot1._moveDiff = Common::Point(4, 1);
- _globals->_sceneItems.push_back(&_hotspot1);
+ g_globals->_sceneItems.push_back(&_hotspot1);
- if (_globals->_sceneManager._previousScene == 4300) {
+ if (g_globals->_sceneManager._previousScene == 4300) {
_hotspot5.postInit();
_hotspot5.setVisage(4250);
_hotspot5.setPosition(Common::Point(268, 168));
@@ -3571,13 +3573,13 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
_hotspot4.setStrip(2);
_hotspot4._moveDiff = Common::Point(4, 1);
_hotspot4.changeZoom(70);
- _globals->_sceneItems.push_back(&_hotspot4);
+ g_globals->_sceneItems.push_back(&_hotspot4);
_hotspot1.setPosition(Common::Point(197, 173));
_hotspot1.changeZoom(70);
- _globals->_player.setPosition(Common::Point(252, 176));
- _globals->_player.changeZoom(70);
+ g_globals->_player.setPosition(Common::Point(252, 176));
+ g_globals->_player.changeZoom(70);
_hotspot6.postInit();
_hotspot6.setVisage(4302);
@@ -3592,32 +3594,32 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
_hotspot6.setFrame(_hotspot6.getFrameCount());
}
- if (_globals->getFlag(98)) {
- _globals->_sceneItems.push_front(&_hotspot6);
+ if (g_globals->getFlag(98)) {
+ g_globals->_sceneItems.push_front(&_hotspot6);
} else {
_hotspot6.hide();
- if ((_globals->_stripNum == 4300) || (_globals->_stripNum == 4301)) {
- _globals->setFlag(98);
- _globals->_player.setVisage(4302);
- _globals->_player.setStrip(5);
- _globals->_player.changeZoom(50);
- _globals->_player.disableControl();
+ if ((g_globals->_stripNum == 4300) || (g_globals->_stripNum == 4301)) {
+ g_globals->setFlag(98);
+ g_globals->_player.setVisage(4302);
+ g_globals->_player.setStrip(5);
+ g_globals->_player.changeZoom(50);
+ g_globals->_player.disableControl();
_hotspot4.setPosition(Common::Point(239, 195));
_sceneMode = 4253;
- _globals->_sceneItems.push_front(&_hotspot6);
+ g_globals->_sceneItems.push_front(&_hotspot6);
- setAction(&_sequenceManager, this, 4253, &_globals->_player, &_hotspot6, &_hotspot4, NULL);
+ setAction(&_sequenceManager, this, 4253, &g_globals->_player, &_hotspot6, &_hotspot4, NULL);
}
}
- } else if (_globals->_stripNum == 9000) {
+ } else if (g_globals->_stripNum == 9000) {
_hotspot4.postInit();
_hotspot4.setVisage(2701);
_hotspot4.animate(ANIM_MODE_1, NULL);
_hotspot4.setObjectWrapper(new SceneObjectWrapper());
_hotspot4.setPosition(Common::Point(-15, 195));
_hotspot4._moveDiff = Common::Point(4, 1);
- _globals->_sceneItems.push_back(&_hotspot4);
+ g_globals->_sceneItems.push_back(&_hotspot4);
setAction(&_action5);
} else {
@@ -3630,13 +3632,13 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
_hotspot3._moveDiff = Common::Point(4, 1);
setAction(&_action1);
- _globals->clearFlag(43);
- _globals->clearFlag(114);
- _globals->clearFlag(36);
+ g_globals->clearFlag(43);
+ g_globals->clearFlag(114);
+ g_globals->clearFlag(36);
}
- if (_globals->getFlag(17)) {
- _globals->_sceneItems.push_back(&_hotspot8);
+ if (g_globals->getFlag(17)) {
+ g_globals->_sceneItems.push_back(&_hotspot8);
} else {
_hotspot2.postInit();
_hotspot2.setVisage(4251);
@@ -3645,27 +3647,27 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
_hotspot2.setFrame(1);
_hotspot2.setPosition(Common::Point(267, 172));
- _globals->_sceneItems.push_back(&_hotspot2);
+ g_globals->_sceneItems.push_back(&_hotspot2);
}
_hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- _globals->_sceneItems.push_back(&_hotspot7);
- _globals->_soundHandler.play(185);
+ g_globals->_sceneItems.push_back(&_hotspot7);
+ g_globals->_soundHandler.play(185);
}
void Scene4250::signal() {
switch (_sceneMode) {
case 4252:
- _globals->setFlag(17);
- _globals->_sceneManager.changeScene(4301);
+ g_globals->setFlag(17);
+ g_globals->_sceneManager.changeScene(4301);
break;
case 4253:
- if (_globals->_stripNum == 4301) {
+ if (g_globals->_stripNum == 4301) {
_sceneMode = 4261;
ADD_MOVER_NULL(_hotspot1, 241, 169);
- setAction(&_sequenceManager, this, 4261, &_globals->_player, &_hotspot6, NULL);
+ setAction(&_sequenceManager, this, 4261, &g_globals->_player, &_hotspot6, NULL);
} else {
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
}
break;
case 4254:
@@ -3680,15 +3682,15 @@ void Scene4250::signal() {
case 4268:
case 4269:
case 4270:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 4259:
- _globals->_soundHandler.play(360);
- _globals->_sceneManager.changeScene(9900);
+ g_globals->_soundHandler.play(360);
+ g_globals->_sceneManager.changeScene(9900);
break;
case 4261:
RING_INVENTORY._keyDevice._sceneNumber = 1;
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 4255:
case 4262:
@@ -3699,13 +3701,13 @@ void Scene4250::signal() {
}
void Scene4250::dispatch() {
- if (_globals->_player.getRegionIndex() == 8)
- _globals->_player.changeZoom(90 - (_globals->_player._position.y - 153));
- if (_globals->_player.getRegionIndex() == 12)
- _globals->_player.changeZoom(70);
- if (_globals->_player.getRegionIndex() == 15) {
- _globals->_player.changeZoom(-1);
- _globals->_player.fixPriority(-1);
+ if (g_globals->_player.getRegionIndex() == 8)
+ g_globals->_player.changeZoom(90 - (g_globals->_player._position.y - 153));
+ if (g_globals->_player.getRegionIndex() == 12)
+ g_globals->_player.changeZoom(70);
+ if (g_globals->_player.getRegionIndex() == 15) {
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.fixPriority(-1);
}
if (_hotspot1.getRegionIndex() == 8)
@@ -3729,11 +3731,11 @@ void Scene4250::dispatch() {
Scene::dispatch();
if (!_action) {
- if (!_globals->getFlag(55) && (_globals->_player.getRegionIndex() == 12)) {
+ if (!g_globals->getFlag(55) && (g_globals->_player.getRegionIndex() == 12)) {
setAction(&_action4);
}
- if (_globals->_sceneObjects->contains(&_hotspot6) && (_globals->_player.getRegionIndex() == 12))
+ if (g_globals->_sceneObjects->contains(&_hotspot6) && (g_globals->_player.getRegionIndex() == 12))
setAction(&_action4);
}
}
@@ -3744,17 +3746,17 @@ void Scene4250::dispatch() {
*--------------------------------------------------------------------------*/
void Scene4300::Action1::signal() {
- Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+ Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->setFlag(56);
- _globals->_scenePalette.addRotation(240, 254, -1);
+ g_globals->setFlag(56);
+ g_globals->_scenePalette.addRotation(240, 254, -1);
scene->_hotspot7.animate(ANIM_MODE_6, this);
- _globals->_soundHandler.play(164);
+ g_globals->_soundHandler.play(164);
break;
case 1:
- _globals->_soundHandler.play(340);
+ g_globals->_soundHandler.play(340);
scene->_soundHandler1.play(341);
scene->_hotspot1.remove();
setDelay(3);
@@ -3793,10 +3795,10 @@ void Scene4300::Action1::signal() {
scene->_stripManager.start(8015, this, scene);
break;
case 9:
- _globals->_soundHandler.play(350);
- _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
- _globals->_events.setCursor(CURSOR_USE);
- _globals->_player.enableControl();
+ g_globals->_soundHandler.play(350);
+ g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ g_globals->_events.setCursor(CURSOR_USE);
+ g_globals->_player.enableControl();
remove();
break;
@@ -3804,7 +3806,7 @@ void Scene4300::Action1::signal() {
}
void Scene4300::Action2::signal() {
- Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+ Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -3814,7 +3816,7 @@ void Scene4300::Action2::signal() {
scene->_stripManager.start(8016, this, scene);
break;
case 2:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -3839,11 +3841,11 @@ void Scene4300::Hotspot8::doAction(int action) {
break;
case OBJECT_KEY_DEVICE:
RING_INVENTORY._keyDevice._sceneNumber = 4300;
- _globals->_scenePalette.addRotation(240, 254, -1);
+ g_globals->_scenePalette.addRotation(240, 254, -1);
animate(ANIM_MODE_5, NULL);
- _globals->setFlag(99);
- _globals->_sceneItems.push_back(this);
+ g_globals->setFlag(99);
+ g_globals->_sceneItems.push_back(this);
break;
default:
SceneHotspot::doAction(action);
@@ -3885,14 +3887,14 @@ void Scene4300::Hotspot9::doAction(int action) {
void Scene4300::Hotspot10::doAction(int action) {
// Alien
- Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+ Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4300, 2);
break;
case CURSOR_TALK:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action2);
break;
case OBJECT_SCANNER:
@@ -3903,9 +3905,9 @@ void Scene4300::Hotspot10::doAction(int action) {
break;
case CURSOR_USE:
case OBJECT_HELMET:
- _globals->_stripNum = (action == CURSOR_USE) ? 4300 : 4301;
- _globals->_events.setCursor(CURSOR_NONE);
- _globals->_sceneManager.changeScene(4250);
+ g_globals->_stripNum = (action == CURSOR_USE) ? 4300 : 4301;
+ g_globals->_events.setCursor(CURSOR_NONE);
+ g_globals->_sceneManager.changeScene(4250);
break;
default:
SceneHotspot::doAction(action);
@@ -3914,11 +3916,11 @@ void Scene4300::Hotspot10::doAction(int action) {
}
void Scene4300::Hotspot15::signal() {
- Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+ Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene;
scene->_soundHandler2.play(345);
- _strip = (_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1;
+ _strip = (g_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1;
if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) ||
(RING_INVENTORY._concentrator._sceneNumber == 1)) {
setStrip(1);
@@ -3930,7 +3932,7 @@ void Scene4300::Hotspot15::signal() {
}
void Scene4300::Hotspot16::doAction(int action) {
- Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+ Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -3958,7 +3960,7 @@ void Scene4300::Hotspot16::doAction(int action) {
}
void Scene4300::Hotspot17::doAction(int action) {
- Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+ Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -3968,7 +3970,7 @@ void Scene4300::Hotspot17::doAction(int action) {
if (RING_INVENTORY._stasisBox2._sceneNumber != 4300)
SceneItem::display2(4300, 13);
else {
- _globals->_scenePalette.clearListeners();
+ g_globals->_scenePalette.clearListeners();
remove();
SceneItem::display2(4300, 12);
@@ -3983,7 +3985,7 @@ void Scene4300::Hotspot17::doAction(int action) {
break;
case OBJECT_STASIS_BOX2:
scene->_soundHandler1.play(352);
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
scene->_sceneMode = 4303;
scene->setAction(&scene->_sequenceManager, scene, 4303, this, NULL);
@@ -4031,27 +4033,27 @@ void Scene4300::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerMText);
_stripManager.addSpeaker(&_speakerFLText);
- _hotspot11.setup(76, 97, 102, 127, 4300, 5, 6);
+ _hotspot11.setDetails(76, 97, 102, 127, 4300, 5, 6);
_hotspot7.postInit();
_hotspot7.setPosition(Common::Point(90, 128));
_hotspot7.setVisage(4303);
_hotspot7.fixPriority(250);
- _globals->_sceneItems.push_back(&_hotspot7);
+ g_globals->_sceneItems.push_back(&_hotspot7);
- _hotspot9.setup(120, 49, 174, 91, 4300, -1, -1);
+ _hotspot9.setDetails(120, 49, 174, 91, 4300, -1, -1);
_hotspot15.postInit();
_hotspot15.setVisage(4300);
_hotspot15.setPosition(Common::Point(149, 79));
_hotspot15.signal();
- if (!_globals->getFlag(99)) {
+ if (!g_globals->getFlag(99)) {
_hotspot8.postInit();
_hotspot8.setVisage(4300);
_hotspot8.setStrip(3);
_hotspot8.setPosition(Common::Point(196, 47));
- _globals->_sceneItems.push_back(&_hotspot8);
+ g_globals->_sceneItems.push_back(&_hotspot8);
}
if (RING_INVENTORY._concentrator._sceneNumber == 4300) {
@@ -4064,15 +4066,15 @@ void Scene4300::postInit(SceneObjectList *OwnerList) {
if (RING_INVENTORY._stasisBox2._sceneNumber == 4300)
_hotspot17.setFrame(_hotspot17.getFrameCount());
- _globals->_sceneItems.push_back(&_hotspot17);
+ g_globals->_sceneItems.push_back(&_hotspot17);
}
- if (!_globals->getFlag(98)) {
+ if (!g_globals->getFlag(98)) {
_hotspot10.postInit();
_hotspot10.setVisage(4302);
_hotspot10.setPosition(Common::Point(244, 179));
_hotspot10.fixPriority(100);
- _globals->_sceneItems.push_back(&_hotspot10);
+ g_globals->_sceneItems.push_back(&_hotspot10);
_hotspot12.postInit();
_hotspot12.setVisage(4302);
@@ -4097,11 +4099,11 @@ void Scene4300::postInit(SceneObjectList *OwnerList) {
_hotspot16.setPosition(Common::Point(169, 141));
_hotspot16.fixPriority(1);
_hotspot16.setStrip(4);
- _globals->_sceneItems.push_back(&_hotspot16);
+ g_globals->_sceneItems.push_back(&_hotspot16);
}
- if (_globals->_sceneManager._previousScene == 4301) {
- _globals->_player.disableControl();
+ if (g_globals->_sceneManager._previousScene == 4301) {
+ g_globals->_player.disableControl();
_hotspot7.setFrame(_hotspot7.getFrameCount());
_hotspot1.postInit();
@@ -4141,15 +4143,15 @@ void Scene4300::postInit(SceneObjectList *OwnerList) {
setAction(&_action1);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 4304;
setAction(&_sequenceManager, this, 4304, NULL);
}
_hotspot10.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
_hotspot19._sceneRegionId = 0;
- _globals->_sceneItems.push_back(&_hotspot19);
- _globals->_sceneItems.push_back(&_hotspot18);
+ g_globals->_sceneItems.push_back(&_hotspot19);
+ g_globals->_sceneItems.push_back(&_hotspot18);
}
void Scene4300::stripCallback(int v) {
@@ -4165,7 +4167,7 @@ void Scene4300::stripCallback(int v) {
}
void Scene4300::remove() {
- _globals->_scenePalette.clearListeners();
+ g_globals->_scenePalette.clearListeners();
Scene::remove();
}
@@ -4174,7 +4176,7 @@ void Scene4300::signal() {
case 4302:
RING_INVENTORY._items._sceneNumber = 1;
_hotspot16.remove();
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 4303:
RING_INVENTORY._stasisBox2._sceneNumber = 4300;
@@ -4193,8 +4195,8 @@ void Scene4300::signal() {
_gfxButton.draw();
_gfxButton._bounds.expandPanes();
- _globals->_player.enableControl();
- _globals->_scenePalette.addRotation(240, 254, -1);
+ g_globals->_player.enableControl();
+ g_globals->_scenePalette.addRotation(240, 254, -1);
break;
}
}
@@ -4207,7 +4209,7 @@ void Scene4300::dispatch() {
void Scene4300::process(Event &event) {
Scene::process(event);
if (_gfxButton.process(event))
- _globals->_sceneManager.changeScene(4250);
+ g_globals->_sceneManager.changeScene(4250);
}
/*--------------------------------------------------------------------------
@@ -4223,8 +4225,8 @@ void Scene4301::Action1::synchronize(Serializer &s) {
}
void Scene4301::Action1::remove() {
- Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
- _globals->_player.enableControl();
+ Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene;
+ g_globals->_player.enableControl();
for (_state = 0; _state < 6; ++_state)
_buttonList[_state].remove();
@@ -4237,7 +4239,7 @@ void Scene4301::Action1::remove() {
}
void Scene4301::Action1::signal() {
- Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
+ Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -4245,8 +4247,8 @@ void Scene4301::Action1::signal() {
scene->_hotspot1.animate(ANIM_MODE_5, this);
break;
case 1:
- _globals->_soundHandler.play(335);
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_soundHandler.play(335);
+ g_globals->_events.setCursor(CURSOR_USE);
scene->_hotspot2.postInit();
scene->_hotspot2.setVisage(4303);
@@ -4269,7 +4271,7 @@ void Scene4301::Action1::signal() {
break;
case 10:
// Puzzle: Wrong code
- _globals->_events.setCursor(CURSOR_NONE);
+ g_globals->_events.setCursor(CURSOR_NONE);
scene->_soundHandler.play(337);
if (scene->_hotspot3._flags & OBJFLAG_HIDE)
scene->_hotspot3.show();
@@ -4290,11 +4292,11 @@ void Scene4301::Action1::signal() {
_actionIndex = 2;
_state = 0;
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 20:
// Puzzle: Correct code
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_soundHandler.play(339);
scene->_hotspot3._frame = 3;
if (scene->_hotspot3._flags & OBJFLAG_HIDE)
@@ -4317,7 +4319,7 @@ void Scene4301::Action1::signal() {
void Scene4301::Action1::process(Event &event) {
// Puzzle
- Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
+ Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene;
Rect buttonsRect;
Action::process(event);
@@ -4372,10 +4374,10 @@ void Scene4301::Action1::process(Event &event) {
void Scene4301::Hotspot4::doAction(int action) {
// Hatch near door
- Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
+ Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene;
if (action == CURSOR_USE) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action1);
} else {
NamedHotspot::doAction(action);
@@ -4405,14 +4407,14 @@ void Scene4301::Hotspot5::doAction(int action) {
/*--------------------------------------------------------------------------*/
void Scene4301::postInit(SceneObjectList *OwnerList) {
- _globals->setFlag(50);
+ g_globals->setFlag(50);
loadScene(4301);
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
_field68E = false;
RING_INVENTORY._stasisBox2._sceneNumber = 1;
- _hotspot4.setup(97, 76, 127, 102, 4300, 5, 6);
+ _hotspot4.setDetails(97, 76, 127, 102, 4300, 5, 6);
_hotspot1.postInit();
_hotspot1.setPosition(Common::Point(90, 128));
@@ -4422,9 +4424,9 @@ void Scene4301::postInit(SceneObjectList *OwnerList) {
_hotspot1.fixPriority(250);
_hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- _globals->_sceneItems.push_back(&_hotspot5);
+ g_globals->_sceneItems.push_back(&_hotspot5);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
}
void Scene4301::dispatch() {
@@ -4432,10 +4434,12 @@ void Scene4301::dispatch() {
_action->dispatch();
} else if (_field68E) {
_field68E = 0;
- _globals->clearFlag(50);
- _globals->_sceneManager._fadeMode = FADEMODE_NONE;
- _globals->_sceneManager.setNewScene(4300);
+ g_globals->clearFlag(50);
+ g_globals->_sceneManager._fadeMode = FADEMODE_NONE;
+ g_globals->_sceneManager.setNewScene(4300);
}
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h
index c3ae9f4aa9..80e67755bd 100644
--- a/engines/tsage/ringworld_scenes5.h
+++ b/engines/tsage/ringworld/ringworld_scenes5.h
@@ -26,9 +26,14 @@
#include "common/scummsys.h"
#include "tsage/core.h"
#include "tsage/converse.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class Scene4000 : public Scene {
/* Actions */
@@ -687,7 +692,8 @@ public:
}
};
+} // End of namespace Ringworld
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp
index 68c184196c..57a073caee 100644
--- a/engines/tsage/ringworld_scenes6.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes6.cpp
@@ -20,12 +20,14 @@
*
*/
-#include "tsage/ringworld_scenes6.h"
+#include "tsage/ringworld/ringworld_scenes6.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
/*--------------------------------------------------------------------------
* Scene 5000 - Caverns - Entrance
@@ -34,7 +36,7 @@ namespace tSage {
void Scene5000::Action1::signal() {
// Ship landing
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -86,7 +88,7 @@ void Scene5000::Action1::signal() {
}
void Scene5000::Action1::dispatch() {
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
Action::dispatch();
if (_actionIndex == 3) {
@@ -110,83 +112,83 @@ void Scene5000::Action1::dispatch() {
}
void Scene5000::Action2::signal() {
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.setPosition(Common::Point(217, 76));
+ g_globals->_player.setPosition(Common::Point(217, 76));
setDelay(10);
break;
case 1:
- _globals->_player.setStrip2(3);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- ADD_MOVER(_globals->_player, 214, 89);
+ g_globals->_player.setStrip2(3);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER(g_globals->_player, 214, 89);
break;
case 2:
- if (!_globals->getFlag(59))
+ if (!g_globals->getFlag(59))
setAction(&scene->_action3, this);
- _globals->_player.fixPriority(15);
- ADD_MOVER(_globals->_player, 208, 100);
+ g_globals->_player.fixPriority(15);
+ ADD_MOVER(g_globals->_player, 208, 100);
break;
case 3:
- ADD_MOVER(_globals->_player, 213, 98);
+ ADD_MOVER(g_globals->_player, 213, 98);
break;
case 4:
- _globals->_player.fixPriority(20);
- ADD_MOVER(_globals->_player, 215, 115);
+ g_globals->_player.fixPriority(20);
+ ADD_MOVER(g_globals->_player, 215, 115);
break;
case 5:
- _globals->_player.changeZoom(47);
- ADD_MOVER(_globals->_player, 220, 125);
+ g_globals->_player.changeZoom(47);
+ ADD_MOVER(g_globals->_player, 220, 125);
break;
case 6:
- ADD_MOVER(_globals->_player, 229, 115);
+ ADD_MOVER(g_globals->_player, 229, 115);
break;
case 7:
- _globals->_player.changeZoom(-1);
- _globals->_player.fixPriority(35);
- ADD_MOVER(_globals->_player, 201, 166);
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.fixPriority(35);
+ ADD_MOVER(g_globals->_player, 201, 166);
break;
case 8:
- _globals->_player.updateZoom();
- ADD_MOVER(_globals->_player, 205, 146);
+ g_globals->_player.updateZoom();
+ ADD_MOVER(g_globals->_player, 205, 146);
break;
case 9:
- _globals->_player.changeZoom(-1);
- _globals->_player.fixPriority(50);
- ADD_MOVER(_globals->_player, 220, 182);
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.fixPriority(50);
+ ADD_MOVER(g_globals->_player, 220, 182);
break;
case 10:
- _globals->_player.updateZoom();
- ADD_MOVER(_globals->_player, 208, 163);
+ g_globals->_player.updateZoom();
+ ADD_MOVER(g_globals->_player, 208, 163);
break;
case 11:
- _globals->_player.changeZoom(-1);
- _globals->_player.setStrip2(-1);
- _globals->_player.fixPriority(-1);
- ADD_MOVER(_globals->_player, 208, 175);
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.setStrip2(-1);
+ g_globals->_player.fixPriority(-1);
+ ADD_MOVER(g_globals->_player, 208, 175);
break;
case 12:
- _globals->_player.setStrip(8);
- _globals->_player.setFrame(1);
+ g_globals->_player.setStrip(8);
+ g_globals->_player.setFrame(1);
setDelay(10);
break;
case 13:
- if (!_globals->_sceneObjects->contains(&scene->_hotspot7))
+ if (!g_globals->_sceneObjects->contains(&scene->_hotspot7))
setDelay(10);
break;
case 14:
setDelay(30);
break;
case 15:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene5000::Action3::signal() {
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -204,7 +206,7 @@ void Scene5000::Action3::signal() {
scene->_hotspot7.animate(ANIM_MODE_1, NULL);
ADD_MOVER(scene->_hotspot7, 214, 89);
- _globals->_sceneItems.push_front(&scene->_hotspot7);
+ g_globals->_sceneItems.push_front(&scene->_hotspot7);
break;
case 2:
scene->_hotspot7.changeZoom(-1);
@@ -260,116 +262,116 @@ void Scene5000::Action3::signal() {
}
void Scene5000::Action4::signal() {
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(1);
break;
case 1:
- _globals->_player.fixPriority(50);
- _globals->_player.setStrip2(4);
- ADD_MOVER(_globals->_player, 210, 182);
+ g_globals->_player.fixPriority(50);
+ g_globals->_player.setStrip2(4);
+ ADD_MOVER(g_globals->_player, 210, 182);
break;
case 2:
- ADD_MOVER(_globals->_player, 205, 146);
+ ADD_MOVER(g_globals->_player, 205, 146);
break;
case 3:
- _globals->_player.fixPriority(35);
- ADD_MOVER(_globals->_player, 201, 166);
+ g_globals->_player.fixPriority(35);
+ ADD_MOVER(g_globals->_player, 201, 166);
break;
case 4:
- ADD_MOVER(_globals->_player, 229, 115);
+ ADD_MOVER(g_globals->_player, 229, 115);
break;
case 5:
- _globals->_player.fixPriority(20);
- _globals->_player.changeZoom(47);
- ADD_MOVER(_globals->_player, 220, 125);
+ g_globals->_player.fixPriority(20);
+ g_globals->_player.changeZoom(47);
+ ADD_MOVER(g_globals->_player, 220, 125);
break;
case 6:
- ADD_MOVER(_globals->_player, 215, 115);
+ ADD_MOVER(g_globals->_player, 215, 115);
break;
case 7:
- _globals->_player.changeZoom(-1);
- ADD_MOVER(_globals->_player, 213, 98);
+ g_globals->_player.changeZoom(-1);
+ ADD_MOVER(g_globals->_player, 213, 98);
break;
case 8:
- _globals->_player.fixPriority(15);
- ADD_MOVER(_globals->_player, 208, 100);
+ g_globals->_player.fixPriority(15);
+ ADD_MOVER(g_globals->_player, 208, 100);
break;
case 9:
- ADD_MOVER(_globals->_player, 214, 89);
+ ADD_MOVER(g_globals->_player, 214, 89);
break;
case 10:
- ADD_MOVER(_globals->_player, 217, 76);
+ ADD_MOVER(g_globals->_player, 217, 76);
break;
case 11:
- _globals->_player.hide();
+ g_globals->_player.hide();
setDelay(60);
break;
case 12:
- if (!_globals->_sceneObjects->contains(&scene->_hotspot7))
- _globals->_sceneManager.changeScene(2320);
+ if (!g_globals->_sceneObjects->contains(&scene->_hotspot7))
+ g_globals->_sceneManager.changeScene(2320);
remove();
break;
}
}
void Scene5000::Action5::signal() {
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
- ADD_MOVER(_globals->_player, 91, 155);
+ g_globals->_player.disableControl();
+ ADD_MOVER(g_globals->_player, 91, 155);
break;
case 1:
- _globals->_player.setVisage(2670);
- _globals->_player._strip = 4;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2670);
+ g_globals->_player._strip = 4;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
- SceneItem::display2(5000, _globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13);
- _globals->_player.animate(ANIM_MODE_6, this);
+ SceneItem::display2(5000, g_globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13);
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 3:
- _globals->_player.setVisage(0);
- _globals->_player._strip = 8;
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setVisage(0);
+ g_globals->_player._strip = 8;
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
}
}
void Scene5000::Action6::signal() {
// Discussion between the hero and Seeker, then the hero goes back to the lander
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
scene->_stripManager.start(2150, this);
break;
case 2:
- _globals->_events.setCursor(CURSOR_NONE);
+ g_globals->_events.setCursor(CURSOR_NONE);
scene->setAction(&scene->_sequenceManager, this, 5001, &scene->_hotspot7, NULL);
break;
case 3:
ADD_PLAYER_MOVER(208, 163);
break;
case 4:
- _globals->_player.fixPriority(50);
- _globals->_player.setStrip2(4);
- ADD_MOVER(_globals->_player, 210, 182);
+ g_globals->_player.fixPriority(50);
+ g_globals->_player.setStrip2(4);
+ ADD_MOVER(g_globals->_player, 210, 182);
break;
case 5:
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_sceneManager.changeScene(2100);
break;
}
}
@@ -377,7 +379,7 @@ void Scene5000::Action6::signal() {
/*--------------------------------------------------------------------------*/
void Scene5000::Hotspot7::doAction(int action) {
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -394,7 +396,7 @@ void Scene5000::Hotspot7::doAction(int action) {
void Scene5000::Hotspot8::doAction(int action) {
// Cave
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -413,9 +415,9 @@ void Scene5000::Hotspot8::doAction(int action) {
}
void Scene5000::HotspotGroup1::doAction(int action) {
- Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
- if (_globals->_sceneObjects->contains(&scene->_hotspot7))
+ if (g_globals->_sceneObjects->contains(&scene->_hotspot7))
scene->setAction(&scene->_action6);
else
SceneItem::display2(5000, 11);
@@ -444,13 +446,13 @@ void Scene5000::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerSText);
_stripManager.addSpeaker(&_speakerQText);
- _globals->_player.postInit();
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player._moveDiff = Common::Point(4, 2);
- _globals->_player.changeZoom(-1);
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player._moveDiff = Common::Point(4, 2);
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.disableControl();
_hotspot1.postInit();
_hotspot1.setVisage(5001);
@@ -516,14 +518,14 @@ void Scene5000::postInit(SceneObjectList *OwnerList) {
_hotspot16.setBounds(Rect(0, 86, 319, 200));
_hotspot12.setBounds(Rect(230, 143, 244, 150));
- _globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13,
+ g_globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13,
&_hotspot14, &_hotspot12, &_hotspot15, &_hotspot17, &_hotspot18, &_hotspot16, NULL);
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 1000:
case 2100:
case 2320:
- if (_globals->getFlag(59)) {
+ if (g_globals->getFlag(59)) {
_hotspot1.setPosition(Common::Point(233, 90));
_hotspot1.changeZoom(100);
_hotspot1.show();
@@ -533,21 +535,21 @@ void Scene5000::postInit(SceneObjectList *OwnerList) {
_hotspot5.setPosition(Common::Point(218, 76));
_hotspot5.show();
- _globals->_player.setPosition(Common::Point(217, -10));
- _globals->_player.disableControl();
+ g_globals->_player.setPosition(Common::Point(217, -10));
+ g_globals->_player.disableControl();
setAction(&_action2);
} else {
- _globals->_player.setPosition(Common::Point(217, -10));
+ g_globals->_player.setPosition(Common::Point(217, -10));
_hotspot1.setPosition(Common::Point(320, -10));
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setAction(&_action1);
}
break;
default:
- _globals->_player.disableControl();
- _globals->_player.setPosition(Common::Point(0, 146));
+ g_globals->_player.disableControl();
+ g_globals->_player.setPosition(Common::Point(0, 146));
_hotspot1.changeZoom(100);
_hotspot1.setPosition(Common::Point(233, 90));
@@ -557,11 +559,11 @@ void Scene5000::postInit(SceneObjectList *OwnerList) {
_hotspot5.show();
_sceneMode = 5004;
- setAction(&_sequenceManager, this, 5004, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 5004, &g_globals->_player, NULL);
break;
}
- _globals->_soundHandler.play(190);
+ g_globals->_soundHandler.play(190);
}
void Scene5000::signal() {
@@ -569,10 +571,10 @@ void Scene5000::signal() {
case 5002:
case 5003:
case 5004:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 5005:
- _globals->_sceneManager.changeScene(5100);
+ g_globals->_sceneManager.changeScene(5100);
break;
}
}
@@ -581,29 +583,29 @@ void Scene5000::dispatch() {
Scene::dispatch();
if (!_action) {
- if (!_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 10)) {
- _globals->_player.disableControl();
+ if (!g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 10)) {
+ g_globals->_player.disableControl();
_sceneMode = 5005;
- setAction(&_sequenceManager, this, 5005, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 5005, &g_globals->_player, NULL);
}
- if (_globals->_player.getRegionIndex() == 8) {
- _globals->_player.disableControl();
+ if (g_globals->_player.getRegionIndex() == 8) {
+ g_globals->_player.disableControl();
- if (_globals->_sceneObjects->contains(&_hotspot7)) {
+ if (g_globals->_sceneObjects->contains(&_hotspot7)) {
_sceneMode = 5003;
- _globals->_player.addMover(NULL);
- setAction(&_sequenceManager, this, 5003, &_globals->_player, NULL);
+ g_globals->_player.addMover(NULL);
+ setAction(&_sequenceManager, this, 5003, &g_globals->_player, NULL);
} else {
setAction(&_action4);
}
}
- if (_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 15)) {
+ if (g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 15)) {
_sceneMode = 5002;
- _globals->_player.disableControl();
- _globals->_player.addMover(NULL);
- setAction(&_sequenceManager, this, 5002, &_globals->_player, NULL);
+ g_globals->_player.disableControl();
+ g_globals->_player.addMover(NULL);
+ setAction(&_sequenceManager, this, 5002, &g_globals->_player, NULL);
}
}
}
@@ -615,26 +617,26 @@ void Scene5000::dispatch() {
void Scene5100::Action1::signal() {
// Quinn enters the cave for the first time
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(5);
break;
case 1:
- ADD_MOVER(_globals->_player, 1111, 165);
+ ADD_MOVER(g_globals->_player, 1111, 165);
break;
case 2:
- _globals->_player.setStrip(6);
- _globals->_player.setFrame(1);
+ g_globals->_player.setStrip(6);
+ g_globals->_player.setFrame(1);
setDelay(60);
break;
case 3:
- if (_globals->getFlag(10)) {
- _globals->_player.enableControl();
+ if (g_globals->getFlag(10)) {
+ g_globals->_player.enableControl();
remove();
} else {
- _globals->setFlag(10);
+ g_globals->setFlag(10);
scene->_stripManager.start(5102, this);
}
break;
@@ -648,7 +650,7 @@ void Scene5100::Action1::signal() {
scene->_hotspot5.animate(ANIM_MODE_1, NULL);
scene->_hotspot5.fixPriority(10);
- _globals->_sceneItems.push_front(&scene->_hotspot5);
+ g_globals->_sceneItems.push_front(&scene->_hotspot5);
ADD_MOVER(scene->_hotspot5, 999, 14);
break;
case 5:
@@ -657,7 +659,7 @@ void Scene5100::Action1::signal() {
scene->_hotspot5.animate(ANIM_MODE_5, this);
break;
case 6:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -665,11 +667,11 @@ void Scene5100::Action1::signal() {
void Scene5100::Action2::signal() {
// Quinn and Seeker exit the cave
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(5);
break;
case 1:
@@ -691,13 +693,13 @@ void Scene5100::Action2::signal() {
scene->_stripManager.start(5129, this);
break;
case 3:
- if (_globals->_player._position.x >= 966) {
+ if (g_globals->_player._position.x >= 966) {
ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155);
} else {
ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 966, 185);
}
- if (_globals->_player._position.x >= 966) {
+ if (g_globals->_player._position.x >= 966) {
setDelay(1);
} else {
ADD_PLAYER_MOVER(966, 190);
@@ -708,40 +710,40 @@ void Scene5100::Action2::signal() {
ADD_PLAYER_MOVER(1215, 155);
break;
case 5:
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_sceneManager.changeScene(2100);
break;
}
}
void Scene5100::Action3::signal() {
// Quinns shots flesheater
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->setFlag(62);
- _globals->_player.disableControl();
- _globals->_player.addMover(NULL);
+ g_globals->setFlag(62);
+ g_globals->_player.disableControl();
+ g_globals->_player.addMover(NULL);
scene->_hotspot2.addMover(NULL);
scene->_hotspot3.addMover(NULL);
- _globals->_player.setVisage(2672);
+ g_globals->_player.setVisage(2672);
- if (static_cast<SceneObject *>(_owner)->_position.x >= _globals->_player._position.x)
- _globals->_player._strip = 4;
+ if (static_cast<SceneObject *>(_owner)->_position.x >= g_globals->_player._position.x)
+ g_globals->_player._strip = 4;
else
- _globals->_player._strip = 3;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player._strip = 3;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 1:
- _globals->_player.setVisage(2674);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setVisage(2674);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 2:
scene->_soundHandler.play(28);
- if (static_cast<SceneObject *>(_owner)->_position.x < _globals->_player._position.x) {
+ if (static_cast<SceneObject *>(_owner)->_position.x < g_globals->_player._position.x) {
scene->_hotspot2.setVisage(5130);
scene->_hotspot2._strip = 1;
scene->_hotspot2._frame = 1;
@@ -762,35 +764,35 @@ void Scene5100::Action3::signal() {
}
- _globals->_player.setVisage(2672);
- _globals->_player._frame = _globals->_player.getFrameCount();
- _globals->_player.animate(ANIM_MODE_6, this);
+ g_globals->_player.setVisage(2672);
+ g_globals->_player._frame = g_globals->_player.getFrameCount();
+ g_globals->_player.animate(ANIM_MODE_6, this);
break;
case 3:
break;
case 4:
SceneItem::display2(5100, 38);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
- _globals->_player.setVisage(0);
- _globals->_player._strip = 8;
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setVisage(0);
+ g_globals->_player._strip = 8;
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
remove();
break;
}
}
void Scene5100::Action4::signal() {
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_soundHandler.play(208);
SceneItem::display2(5100, 15);
ObjectMover3 *mover = new ObjectMover3();
- scene->_hotspot2.addMover(mover, &_globals->_player, 20, this);
+ scene->_hotspot2.addMover(mover, &g_globals->_player, 20, this);
break;
}
case 1:
@@ -804,18 +806,18 @@ void Scene5100::Action4::signal() {
setDelay(15);
break;
case 3:
- _globals->_sceneManager.changeScene(5200);
+ g_globals->_sceneManager.changeScene(5200);
break;
}
}
void Scene5100::Action5::signal() {
// Quinns forgot the statis box in the throne room, and goes back
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(60);
break;
case 1:
@@ -826,7 +828,7 @@ void Scene5100::Action5::signal() {
break;
case 3:
scene->_sceneMode = 5106;
- scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot14, NULL);
break;
}
}
@@ -835,11 +837,11 @@ void Scene5100::Action5::signal() {
void Scene5100::HotspotGroup1::doAction(int action) {
// Flesh Eaters
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(5100, _globals->getFlag(62) ? 41 : 26);
+ SceneItem::display2(5100, g_globals->getFlag(62) ? 41 : 26);
break;
case CURSOR_USE:
SceneItem::display2(5100, 11);
@@ -848,7 +850,7 @@ void Scene5100::HotspotGroup1::doAction(int action) {
SceneItem::display2(5100, 17);
break;
case OBJECT_STUNNER:
- if (_globals->getFlag(62))
+ if (g_globals->getFlag(62))
SceneItem::display2(5100, 42);
else
setAction(&scene->_action3);
@@ -860,16 +862,16 @@ void Scene5100::HotspotGroup1::doAction(int action) {
}
void Scene5100::Hotspot4::doAction(int action) {
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(5100, 31);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5110;
- scene->setAction(&scene->_sequenceManager, scene, 5110, &_globals->_player, this, &scene->_hotspot7, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5110, &g_globals->_player, this, &scene->_hotspot7, NULL);
break;
case CURSOR_TALK:
SceneItem::display2(5100, 34);
@@ -888,11 +890,11 @@ void Scene5100::Hotspot4::doAction(int action) {
void Scene5100::HotspotGroup2::doAction(int action) {
// Bat
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(5100, _globals->getFlag(108) ? 47 : 23);
+ SceneItem::display2(5100, g_globals->getFlag(108) ? 47 : 23);
break;
case CURSOR_USE:
SceneItem::display2(5100, 29);
@@ -901,7 +903,7 @@ void Scene5100::HotspotGroup2::doAction(int action) {
if (_position.x >= 600)
SceneItem::display2(5100, 28);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5114;
scene->setAction(&scene->_sequenceManager, scene, 5114, NULL);
}
@@ -917,16 +919,16 @@ void Scene5100::HotspotGroup2::doAction(int action) {
void Scene5100::Hotspot9::doAction(int action) {
// Rope
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(5100, 32);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5117;
- scene->setAction(&scene->_sequenceManager, scene, 5117, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5117, &g_globals->_player, NULL);
break;
case OBJECT_STUNNER:
SceneItem::display2(5100, 35);
@@ -935,9 +937,9 @@ void Scene5100::Hotspot9::doAction(int action) {
SceneItem::display2(5100, 44);
break;
case OBJECT_BONE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5116;
- scene->setAction(&scene->_sequenceManager, scene, 5116, &_globals->_player, this, &scene->_hotspot10,
+ scene->setAction(&scene->_sequenceManager, scene, 5116, &g_globals->_player, this, &scene->_hotspot10,
&scene->_hotspot4, NULL);
break;
default:
@@ -948,19 +950,19 @@ void Scene5100::Hotspot9::doAction(int action) {
void Scene5100::Hotspot17::doAction(int action) {
// Rock blocking pit entrance
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(5100, 18);
break;
case CURSOR_USE:
- if (_globals->getFlag(67))
+ if (g_globals->getFlag(67))
SceneItem::display2(5100, 19);
else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5101;
- scene->setAction(&scene->_sequenceManager, scene, 5101, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5101, &g_globals->_player, this, NULL);
}
break;
default:
@@ -972,7 +974,7 @@ void Scene5100::Hotspot17::doAction(int action) {
void Scene5100::Hotspot18::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->_sceneManager._previousScene != 5000) {
+ if (g_globals->_sceneManager._previousScene != 5000) {
SceneItem::display2(5100, 3);
} else {
switch (_index1) {
@@ -1014,21 +1016,21 @@ void Scene5100::Hotspot18::doAction(int action) {
void Scene5100::Hotspot19::doAction(int action) {
// Pillar
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(5100, _globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20);
+ SceneItem::display2(5100, g_globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5106;
- if (_globals->getFlag(66))
- scene->setAction(&scene->_sequenceManager, scene, 5113, &_globals->_player, NULL);
+ if (g_globals->getFlag(66))
+ scene->setAction(&scene->_sequenceManager, scene, 5113, &g_globals->_player, NULL);
else {
- _globals->setFlag(66);
- scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL);
+ g_globals->setFlag(66);
+ scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot14, NULL);
}
break;
default:
@@ -1038,21 +1040,21 @@ void Scene5100::Hotspot19::doAction(int action) {
}
void Scene5100::Hotspot20::doAction(int action) {
- Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+ Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(5100, 21);
break;
case CURSOR_USE:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
- if (_globals->getFlag(67)) {
+ if (g_globals->getFlag(67)) {
scene->_sceneMode = 5112;
- scene->setAction(&scene->_sequenceManager, scene, 5112, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5112, &g_globals->_player, NULL);
} else {
scene->_sceneMode = 5101;
- scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot17, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot17, NULL);
}
break;
default:
@@ -1078,17 +1080,17 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerSText);
_stripManager.addSpeaker(&_speakerGameText);
_stripManager.addSpeaker(&_speakerBatText);
- _speakerQText._npc = &_globals->_player;
- _speakerMText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
+ _speakerMText._npc = &g_globals->_player;
_speakerSText._npc = &_hotspot8;
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.disableControl();
- if ((!_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
+ if ((!g_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
_hotspot14.postInit();
_hotspot14.setVisage(5101);
_hotspot14.setPosition(Common::Point(498, 147));
@@ -1101,7 +1103,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot17._strip = 2;
_hotspot17.fixPriority(200);
- if (_globals->getFlag(67))
+ if (g_globals->getFlag(67))
_hotspot17.setPosition(Common::Point(554, 192));
else
_hotspot17.setPosition(Common::Point(539, 179));
@@ -1109,26 +1111,26 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot19.setBounds(Rect(488, 115, 508, 148));
_hotspot21.setBounds(Rect(1150, 85, 1173, 112));
_hotspot20.setBounds(Rect(517, 193, 562, 200));
- _globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL);
+ g_globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL);
- if (_globals->getFlag(67)) {
- _globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL);
+ if (g_globals->getFlag(67)) {
+ g_globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL);
} else {
- _globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL);
+ g_globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL);
}
- if (!_globals->getFlag(105)) {
+ if (!g_globals->getFlag(105)) {
_hotspot4.postInit();
_hotspot4.setVisage(5363);
_hotspot4.setPosition(Common::Point(1025, 65));
_hotspot4.setStrip(4);
_hotspot4.animate(ANIM_MODE_7, 0, NULL);;
- _globals->_sceneItems.push_back(&_hotspot4);
+ g_globals->_sceneItems.push_back(&_hotspot4);
_hotspot9.postInit();
_hotspot9.setVisage(5363);
_hotspot9.setPosition(Common::Point(966, 120));
- _globals->_sceneItems.push_back(&_hotspot9);
+ g_globals->_sceneItems.push_back(&_hotspot9);
_hotspot10.postInit();
_hotspot10.setVisage(5363);
@@ -1140,26 +1142,26 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot6.setPosition(Common::Point(1017, 34));
_hotspot6._strip = 4;
_hotspot6._frame = _hotspot6.getFrameCount();
- _globals->_sceneItems.push_back(&_hotspot6);
+ g_globals->_sceneItems.push_back(&_hotspot6);
}
_hotspot16._sceneRegionId = 15;
- _globals->_sceneItems.push_back(&_hotspot16);
+ g_globals->_sceneItems.push_back(&_hotspot16);
- if (!_globals->getFlag(62)) {
+ if (!g_globals->getFlag(62)) {
_hotspot2.postInit();
_hotspot2.setVisage(5110);
_hotspot2.animate(ANIM_MODE_1, NULL);
_hotspot2._moveDiff.x = 4;
- _globals->_sceneItems.push_back(&_hotspot2);
+ g_globals->_sceneItems.push_back(&_hotspot2);
_hotspot3.postInit();
_hotspot3.setVisage(5110);
_hotspot3.animate(ANIM_MODE_1, NULL);
_hotspot3._moveDiff.x = 4;
- _globals->_sceneItems.push_back(&_hotspot3);
+ g_globals->_sceneItems.push_back(&_hotspot3);
- if (_globals->getFlag(61)) {
+ if (g_globals->getFlag(61)) {
_hotspot2.setPosition(Common::Point(483, 189));
_hotspot3.setPosition(Common::Point(811, 182));
} else {
@@ -1168,35 +1170,35 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
}
}
- if (_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) &&
- _globals->getFlag(107) && _globals->getFlag(67)) {
+ if (g_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) &&
+ g_globals->getFlag(107) && g_globals->getFlag(67)) {
_hotspot8.postInit();
_hotspot8.setVisage(2806);
_hotspot8.setPosition(Common::Point(557, 178));
_hotspot8.animate(ANIM_MODE_1, NULL);
_hotspot8.setObjectWrapper(new SceneObjectWrapper());
- _globals->clearFlag(59);
+ g_globals->clearFlag(59);
}
- switch (_globals->_sceneManager._previousScene) {
+ switch (g_globals->_sceneManager._previousScene) {
case 5000:
default:
- _globals->_player.setPosition(Common::Point(1184, 160));
+ g_globals->_player.setPosition(Common::Point(1184, 160));
setAction(&_action1);
break;
case 5200:
- if (_globals->_stripNum == 5200) {
- _globals->_player.setVisage(5101);
- _globals->_player.fixPriority(200);
- _globals->_player.setStrip(5);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(513, 199));
+ if (g_globals->_stripNum == 5200) {
+ g_globals->_player.setVisage(5101);
+ g_globals->_player.fixPriority(200);
+ g_globals->_player.setStrip(5);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(513, 199));
_sceneMode = 5108;
- setAction(&_sequenceManager, this, 5108, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 5108, &g_globals->_player, NULL);
} else {
- _globals->_player.setPosition(Common::Point(20, 175));
+ g_globals->_player.setPosition(Common::Point(20, 175));
_hotspot13.postInit();
_hotspot13.setVisage(5110);
@@ -1211,7 +1213,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot11.animate(ANIM_MODE_1, NULL);
ObjectMover2 *mover = new ObjectMover2();
- _hotspot11.addMover(mover, 15, 20, &_globals->_player);
+ _hotspot11.addMover(mover, 15, 20, &g_globals->_player);
_hotspot12.postInit();
_hotspot12.setVisage(5110);
@@ -1221,51 +1223,51 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot12.animate(ANIM_MODE_1, NULL);
ObjectMover2 *mover2 = new ObjectMover2();
- _hotspot12.addMover(mover2, 25, 50, &_globals->_player);
+ _hotspot12.addMover(mover2, 25, 50, &g_globals->_player);
_hotspot17.setPosition(Common::Point(554, 182));
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 5105;
- setAction(&_sequenceManager, this, 5105, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 5105, &g_globals->_player, NULL);
}
break;
case 5300:
- switch (_globals->_stripNum) {
+ switch (g_globals->_stripNum) {
case 5300:
_sceneMode = 5111;
- _globals->_player.setVisage(5101);
- _globals->_player.setStrip(6);
- _globals->_player.fixPriority(170);
- _globals->_player.setPosition(Common::Point(1168, 110));
+ g_globals->_player.setVisage(5101);
+ g_globals->_player.setStrip(6);
+ g_globals->_player.fixPriority(170);
+ g_globals->_player.setPosition(Common::Point(1168, 110));
- setAction(&_sequenceManager, this, 5111, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 5111, &g_globals->_player, NULL);
_hotspot8.setPosition(Common::Point(1107, 178));
break;
case 5302:
- _globals->_player.setPosition(Common::Point(512, 190));
+ g_globals->_player.setPosition(Common::Point(512, 190));
- if (_globals->_sceneObjects->contains(&_hotspot8))
+ if (g_globals->_sceneObjects->contains(&_hotspot8))
setAction(&_action2);
else
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 5303:
_hotspot8.setVisage(5102);
_hotspot8.setPosition(Common::Point(533, 172));
- _globals->_player.setPosition(Common::Point(512, 190));
+ g_globals->_player.setPosition(Common::Point(512, 190));
setAction(&_action2);
break;
}
- if (_globals->getFlag(108)) {
+ if (g_globals->getFlag(108)) {
_hotspot6.postInit();
_hotspot6.setVisage(5362);
_hotspot6.setPosition(Common::Point(542, 19));
_hotspot6.setStrip(6);
_hotspot6.setFrame(1);
- _globals->_sceneItems.push_back(&_hotspot6);
+ g_globals->_sceneItems.push_back(&_hotspot6);
} else if (RING_INVENTORY._vial._sceneNumber != 5100) {
_hotspot6.postInit();
_hotspot6.setVisage(5362);
@@ -1273,13 +1275,13 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot6.fixPriority(170);
_hotspot6.setStrip(6);
_hotspot6.setFrame(1);
- _globals->_sceneItems.push_back(&_hotspot6);
+ g_globals->_sceneItems.push_back(&_hotspot6);
}
break;
}
_hotspot18.setBounds(Rect(0, 0, 1280, 200));
- _globals->_sceneItems.push_back(&_hotspot18);
+ g_globals->_sceneItems.push_back(&_hotspot18);
_hotspot15.postInit();
_hotspot15.setVisage(5140);
@@ -1287,41 +1289,41 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot15.setPosition(Common::Point(977, 173));
_hotspot15.fixPriority(1);
- _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
+ g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position);
loadScene(5100);
- _globals->_soundHandler.play(205);
+ g_globals->_soundHandler.play(205);
}
void Scene5100::signal() {
switch (_sceneMode) {
case 5101:
case 5112:
- _globals->setFlag(67);
- _globals->_sceneManager.changeScene(5300);
+ g_globals->setFlag(67);
+ g_globals->_sceneManager.changeScene(5300);
break;
case 5102:
case 5114:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 5103:
- if (_globals->getFlag(61)) {
+ if (g_globals->getFlag(61)) {
SceneItem::display2(5100, 46);
- _globals->_sceneManager.changeScene(5300);
+ g_globals->_sceneManager.changeScene(5300);
} else {
SceneItem::display2(5100, 45);
- _globals->_sceneManager.changeScene(5200);
+ g_globals->_sceneManager.changeScene(5200);
}
break;
case 5105:
- _globals->_sceneManager.changeScene(5300);
+ g_globals->_sceneManager.changeScene(5300);
break;
case 5106:
- _globals->_stripNum = 5111;
- _globals->_sceneManager.changeScene(5200);
+ g_globals->_stripNum = 5111;
+ g_globals->_sceneManager.changeScene(5200);
break;
case 5108:
- if (!_globals->getFlag(60))
- _globals->_player.enableControl();
+ if (!g_globals->getFlag(60))
+ g_globals->_player.enableControl();
else if (RING_INVENTORY._stasisBox._sceneNumber == 1)
setAction(&_action2);
else
@@ -1329,78 +1331,78 @@ void Scene5100::signal() {
break;
case 5110:
SceneItem::display2(5100, 30);
- _globals->_player._angle = 325;
- _globals->_player.enableControl();
+ g_globals->_player._angle = 325;
+ g_globals->_player.enableControl();
break;
case 5111:
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setVisage(0);
- _globals->_player.setStrip(6);
- _globals->_player.fixPriority(-1);
- _globals->_player.animate(ANIM_MODE_1, NULL);
-
- if ((RING_INVENTORY._vial._sceneNumber != 5100) && !_globals->getFlag(108)) {
- _globals->setFlag(108);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setStrip(6);
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+
+ if ((RING_INVENTORY._vial._sceneNumber != 5100) && !g_globals->getFlag(108)) {
+ g_globals->setFlag(108);
_sceneMode = 5130;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
- _speakerBatText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 20, 30));
- setAction(&_sequenceManager, this, 5130, &_globals->_player, &_hotspot6, NULL);
- } else if (_globals->_sceneObjects->contains(&_hotspot8)) {
+ _speakerBatText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 20, 30));
+ setAction(&_sequenceManager, this, 5130, &g_globals->_player, &_hotspot6, NULL);
+ } else if (g_globals->_sceneObjects->contains(&_hotspot8)) {
setAction(&_action2);
} else {
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
}
break;
case 5116:
- _globals->setFlag(105);
+ g_globals->setFlag(105);
RING_INVENTORY._bone._sceneNumber = 0;
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setVisage(0);
- _globals->_player.setStrip(6);
- _globals->_player.fixPriority(-1);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setVisage(0);
+ g_globals->_player.setStrip(6);
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
// No break on purpose
case 5117:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 5130:
_hotspot6.setVisage(5362);
_hotspot6.setPosition(Common::Point(542, 25));
_hotspot6.setStrip(6);
_hotspot6.setFrame(1);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 5150:
- _globals->clearFlag(60);
- _globals->_sceneManager.changeScene(5300);
+ g_globals->clearFlag(60);
+ g_globals->_sceneManager.changeScene(5300);
break;
}
}
void Scene5100::dispatch() {
// Flesheater trap
- if (_hotspot15._bounds.contains(_globals->_player._position) && !_globals->_player._visage) {
- _globals->_player.disableControl();
- _globals->_player.addMover(NULL);
+ if (_hotspot15._bounds.contains(g_globals->_player._position) && !g_globals->_player._visage) {
+ g_globals->_player.disableControl();
+ g_globals->_player.addMover(NULL);
_soundHandler.play(207);
_sceneMode = 5103;
- setAction(&_sequenceManager, this, (_globals->_player._position.x >= 966) ? 5104 : 5103,
- &_globals->_player, &_hotspot15, NULL);
+ setAction(&_sequenceManager, this, (g_globals->_player._position.x >= 966) ? 5104 : 5103,
+ &g_globals->_player, &_hotspot15, NULL);
}
- if (_globals->getFlag(61) && !_globals->getFlag(62) &&
- ((_globals->_player._position.x - _hotspot2._position.x) < 160) &&
- (_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) {
+ if (g_globals->getFlag(61) && !g_globals->getFlag(62) &&
+ ((g_globals->_player._position.x - _hotspot2._position.x) < 160) &&
+ (g_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) {
setAction(NULL);
_sceneMode = 5150;
_soundHandler.play(208);
if (RING_INVENTORY._vial._sceneNumber == 5100) {
- _globals->_player.addMover(NULL);
- _globals->_player.disableControl();
+ g_globals->_player.addMover(NULL);
+ g_globals->_player.disableControl();
SceneItem::display2(5100, 39);
}
@@ -1408,28 +1410,28 @@ void Scene5100::dispatch() {
_hotspot3.setStrip2(2);
ObjectMover3 *mover1 = new ObjectMover3();
- _hotspot2.addMover(mover1, &_globals->_player, 20, this);
+ _hotspot2.addMover(mover1, &g_globals->_player, 20, this);
ObjectMover3 *mover2 = new ObjectMover3();
- _hotspot3.addMover(mover2, &_globals->_player, 20, this);
+ _hotspot3.addMover(mover2, &g_globals->_player, 20, this);
}
if (!_action) {
- if (((_globals->_player._position.x - _hotspot2._position.x) < 130) && !_globals->getFlag(61)) {
- _globals->_player._canWalk = false;
- _globals->_player.addMover(NULL);
+ if (((g_globals->_player._position.x - _hotspot2._position.x) < 130) && !g_globals->getFlag(61)) {
+ g_globals->_player._canWalk = false;
+ g_globals->_player.addMover(NULL);
Common::Point pt(20, 25);
PlayerMover2 *mover = new PlayerMover2();
- _hotspot3.addMover(mover, &pt, &_globals->_player);
+ _hotspot3.addMover(mover, &pt, &g_globals->_player);
setAction(&_action4);
}
- if ((_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= _globals->_player._position.x)
- _globals->_sceneManager.changeScene(5000);
+ if ((g_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= g_globals->_player._position.x)
+ g_globals->_sceneManager.changeScene(5000);
- if (_globals->_player.getRegionIndex() == 8) {
+ if (g_globals->_player.getRegionIndex() == 8) {
_sceneMode = 5114;
- setAction(&_sequenceManager, this, 5115, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 5115, &g_globals->_player, NULL);
}
}
@@ -1442,11 +1444,11 @@ void Scene5100::dispatch() {
*--------------------------------------------------------------------------*/
void Scene5200::Action1::signal() {
- Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+ Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(59) + 120);
+ setDelay(g_globals->_randomSource.getRandomNumber(59) + 120);
break;
case 1:
scene->_hotspot3.animate(ANIM_MODE_8, 1, this);
@@ -1457,30 +1459,30 @@ void Scene5200::Action1::signal() {
void Scene5200::Action2::signal() {
// Quinn obtains the stasis box from the flesheater throne room
- Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+ Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
ADD_PLAYER_MOVER(92, 52);
break;
case 1:
- _globals->_player.setVisage(5202);
- _globals->_player._strip = 4;
- _globals->_player._frame = 1;
- _globals->_player.animate(ANIM_MODE_4, 3, 1, this);
+ g_globals->_player.setVisage(5202);
+ g_globals->_player._strip = 4;
+ g_globals->_player._frame = 1;
+ g_globals->_player.animate(ANIM_MODE_4, 3, 1, this);
break;
case 2:
scene->_soundHandler.stop();
scene->_hotspot14.remove();
RING_INVENTORY._stasisBox._sceneNumber = 1;
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 3:
- _globals->_player.setVisage(0);
- _globals->_player._strip = 3;
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setVisage(0);
+ g_globals->_player._strip = 3;
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
scene->_hotspot8.animate(ANIM_MODE_2, NULL);
ADD_MOVER(scene->_hotspot8, 141, 77);
@@ -1493,7 +1495,7 @@ void Scene5200::Action2::signal() {
scene->_hotspot8.animate(ANIM_MODE_5, this);
break;
case 5:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -1502,28 +1504,28 @@ void Scene5200::Action2::signal() {
void Scene5200::Action3::signal() {
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(5);
break;
case 1:
ADD_PLAYER_MOVER(285, 62);
break;
case 2:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene5200::Action4::signal() {
- Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+ Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(120);
break;
case 1:
- _globals->_soundHandler.play(209);
+ g_globals->_soundHandler.play(209);
scene->_stripManager.start(5202, this, scene);
break;
case 2:
@@ -1539,7 +1541,7 @@ void Scene5200::Action4::signal() {
setDelay(60);
break;
case 6:
- _globals->_sceneManager.changeScene(5100);
+ g_globals->_sceneManager.changeScene(5100);
break;
}
}
@@ -1560,7 +1562,7 @@ void Scene5200::Hotspot9::doAction(int action) {
SceneItem::display2(5200, 14);
break;
default:
- SceneItem::doAction(action);
+ SceneHotspot::doAction(action);
break;
}
}
@@ -1582,7 +1584,7 @@ void Scene5200::Hotspot10::doAction(int action) {
}
void Scene5200::Hotspot14::doAction(int action) {
- Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+ Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1636,33 +1638,33 @@ void Scene5200::postInit(SceneObjectList *OwnerList) {
_hotspot8._strip = 1;
_hotspot8.setPosition(Common::Point(96, 53));
_hotspot8.fixPriority(90);
- _globals->_sceneItems.push_back(&_hotspot14);
+ g_globals->_sceneItems.push_back(&_hotspot14);
}
- if (_globals->_stripNum == 5111) {
+ if (g_globals->_stripNum == 5111) {
// Happens when the player enters the throne room via the secret passage,
// after talking with the bat. No NPCs are around and the player can
// obtain the stasis box.
- _globals->_soundHandler.play(205);
- _globals->_player.disableControl();
-
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.changeZoom(75);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip(1);
- _globals->_player.setFrame(3);
- _globals->_player.setPosition(Common::Point(307, 62));
+ g_globals->_soundHandler.play(205);
+ g_globals->_player.disableControl();
+
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.changeZoom(75);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip(1);
+ g_globals->_player.setFrame(3);
+ g_globals->_player.setPosition(Common::Point(307, 62));
setAction(&_action3);
} else {
// Happens when the player is captured by the flesh eaters the first time.
- _globals->_player.postInit();
- _globals->_player.setVisage(2640);
- _globals->_player._strip = 1;
- _globals->_player._frame = 4;
- _globals->_player.setPosition(Common::Point(105, 199));
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2640);
+ g_globals->_player._strip = 1;
+ g_globals->_player._frame = 4;
+ g_globals->_player.setPosition(Common::Point(105, 199));
_hotspot5.postInit();
_hotspot5.setVisage(5210);
@@ -1706,8 +1708,8 @@ void Scene5200::postInit(SceneObjectList *OwnerList) {
_hotspot4.setPosition(Common::Point(146, 110));
_hotspot4.fixPriority(90);
- _globals->_player.disableControl();
- _globals->setFlag(61);
+ g_globals->_player.disableControl();
+ g_globals->setFlag(61);
setAction(&_action4);
}
@@ -1718,8 +1720,8 @@ void Scene5200::postInit(SceneObjectList *OwnerList) {
_hotspot12._sceneRegionId = 10;
_hotspot13._sceneRegionId = 8;
- _globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL);
- _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
+ g_globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL);
+ g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position);
loadScene(5200);
}
@@ -1737,9 +1739,9 @@ void Scene5200::stripCallback(int v) {
void Scene5200::dispatch() {
Scene::dispatch();
- if (!_action && (_globals->_player.getRegionIndex() == 12)) {
- _globals->_stripNum = 5200;
- _globals->_sceneManager.changeScene(5100);
+ if (!_action && (g_globals->_player.getRegionIndex() == 12)) {
+ g_globals->_stripNum = 5200;
+ g_globals->_sceneManager.changeScene(5100);
}
}
@@ -1750,11 +1752,11 @@ void Scene5200::dispatch() {
void Scene5300::Action1::signal() {
// Seeker waking up
- Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+ Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
@@ -1765,30 +1767,30 @@ void Scene5300::Action1::signal() {
case 2:
scene->_hotspot2.animate(ANIM_MODE_NONE, NULL);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setStrip2(-1);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- ADD_MOVER(_globals->_player, 85, 170);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setStrip2(-1);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ ADD_MOVER(g_globals->_player, 85, 170);
break;
case 3:
scene->_hotspot2.fixPriority(-1);
- _globals->_player.checkAngle(&scene->_hotspot2);
+ g_globals->_player.checkAngle(&scene->_hotspot2);
setAction(&scene->_sequenceManager, this, 5305, &scene->_hotspot2, NULL);
break;
case 4:
scene->_stripManager.start(5316, this);
break;
case 5:
- if (!_globals->getFlag(106) || !_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
- _globals->_player.enableControl();
+ if (!g_globals->getFlag(106) || !g_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
+ g_globals->_player.enableControl();
remove();
} else {
- _globals->setFlag(60);
+ g_globals->setFlag(60);
scene->_hotspot2._numFrames = 10;
- if (_globals->getFlag(67)) {
+ if (g_globals->getFlag(67)) {
scene->_sceneMode = 5310;
- scene->setAction(&scene->_sequenceManager, scene, 5310, &_globals->_player, &scene->_hotspot2, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5310, &g_globals->_player, &scene->_hotspot2, NULL);
} else {
scene->_sceneMode = 5347;
scene->setAction(&scene->_sequenceManager, scene, 5347, NULL);
@@ -1799,46 +1801,46 @@ void Scene5300::Action1::signal() {
}
void Scene5300::Action2::signal() {
- Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+ Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(60);
break;
case 1:
- _globals->setFlag(60);
+ g_globals->setFlag(60);
scene->_stripManager.start(5328, this);
break;
case 2:
if (RING_INVENTORY._stasisBox._sceneNumber == 1) {
- _globals->_stripNum = 5303;
+ g_globals->_stripNum = 5303;
setDelay(5);
} else {
- _globals->_stripNum = 5302;
+ g_globals->_stripNum = 5302;
scene->_stripManager.start(5329, this);
}
break;
case 3:
- _globals->_sceneManager.changeScene(5100);
+ g_globals->_sceneManager.changeScene(5100);
remove();
break;
}
}
void Scene5300::Action3::signal() {
- Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+ Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(30);
break;
case 1:
- scene->_stripManager.start(_globals->_stripNum, this);
+ scene->_stripManager.start(g_globals->_stripNum, this);
break;
case 2:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -1847,14 +1849,14 @@ void Scene5300::Action3::signal() {
/*--------------------------------------------------------------------------*/
void Scene5300::Hotspot1::doAction(int action) {
- Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+ Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(5300, 24);
break;
case CURSOR_TALK:
- _globals->_stripNum = 5312;
+ g_globals->_stripNum = 5312;
scene->setAction(&scene->_action3);
break;
default:
@@ -1864,37 +1866,37 @@ void Scene5300::Hotspot1::doAction(int action) {
}
void Scene5300::Hotspot2::doAction(int action) {
// Seeker
- Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+ Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(5300, 23);
break;
case CURSOR_USE:
- if (!_globals->getFlag(106)) {
- _globals->_player.disableControl();
+ if (!g_globals->getFlag(106)) {
+ g_globals->_player.disableControl();
scene->_sceneMode = 5302;
- scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL);
} else {
- SceneItem::display2(5300, _globals->getFlag(107) ? 25 : 20);
+ SceneItem::display2(5300, g_globals->getFlag(107) ? 25 : 20);
}
break;
case CURSOR_TALK:
- if (!_globals->getFlag(106)) {
- _globals->_player.disableControl();
+ if (!g_globals->getFlag(106)) {
+ g_globals->_player.disableControl();
scene->_sceneMode = 5302;
- scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL);
- } else if (!_globals->getFlag(107)) {
+ scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL);
+ } else if (!g_globals->getFlag(107)) {
SceneItem::display2(5300, 11);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (RING_INVENTORY._stasisBox._sceneNumber != 1) {
scene->_sceneMode = 5316;
scene->setAction(&scene->_sequenceManager, scene, 5316, NULL);
} else {
- _globals->setFlag(60);
- if (_globals->getFlag(67)) {
+ g_globals->setFlag(60);
+ if (g_globals->getFlag(67)) {
scene->_sceneMode = 5315;
scene->setAction(&scene->_sequenceManager, scene, 5315, this, NULL);
} else {
@@ -1905,29 +1907,29 @@ void Scene5300::Hotspot2::doAction(int action) {
}
break;
case OBJECT_SCANNER:
- SceneItem::display2(5300, _globals->getFlag(107) ? 10 : 9);
+ SceneItem::display2(5300, g_globals->getFlag(107) ? 10 : 9);
break;
case OBJECT_MEDKIT:
- if (_globals->getFlag(106))
+ if (g_globals->getFlag(106))
SceneItem::display2(5300, 7);
else {
- _globals->setFlag(106);
- _globals->_player.disableControl();
+ g_globals->setFlag(106);
+ g_globals->_player.disableControl();
scene->_sceneMode = 5303;
- scene->setAction(&scene->_sequenceManager, scene, 5303, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5303, &g_globals->_player, NULL);
}
break;
case OBJECT_VIAL:
- if (_globals->getFlag(107)) {
+ if (g_globals->getFlag(107)) {
SceneItem::display2(5300, 8);
} else {
RING_INVENTORY._vial._sceneNumber = 5300;
- _globals->setFlag(107);
- _globals->_player.disableControl();
+ g_globals->setFlag(107);
+ g_globals->_player.disableControl();
scene->_sceneMode = 5304;
- scene->setAction(&scene->_sequenceManager, scene, 5304, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5304, &g_globals->_player, NULL);
}
break;
default:
@@ -1938,7 +1940,7 @@ void Scene5300::Hotspot2::doAction(int action) {
void Scene5300::Hotspot5::doAction(int action) {
// Sharp bone
- Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+ Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1946,10 +1948,10 @@ void Scene5300::Hotspot5::doAction(int action) {
break;
case CURSOR_USE:
RING_INVENTORY._bone._sceneNumber = 1;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5309;
- scene->setAction(&scene->_sequenceManager, scene, 5309, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5309, &g_globals->_player, this, NULL);
break;
default:
SceneHotspot::doAction(action);
@@ -1959,26 +1961,26 @@ void Scene5300::Hotspot5::doAction(int action) {
void Scene5300::Hotspot6::doAction(int action) {
// Left Hole
- Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+ Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1))
+ if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1))
SceneItem::display2(5300, 4);
else
SceneItem::display2(5300, 26);
break;
case CURSOR_USE:
- if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) {
- _globals->_player.disableControl();
+ if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) {
+ g_globals->_player.disableControl();
scene->_sceneMode = 5301;
- scene->setAction(&scene->_sequenceManager, scene, 5301, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 5301, &g_globals->_player, NULL);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 5307;
RING_INVENTORY._vial._sceneNumber = 1;
- scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &_globals->_player,
+ scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &g_globals->_player,
&scene->_hotspot4, NULL);
}
break;
@@ -1991,19 +1993,19 @@ void Scene5300::Hotspot6::doAction(int action) {
void Scene5300::Hotspot7::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(63))
+ if (g_globals->getFlag(63))
SceneItem::display2(5300, 2);
else {
- _globals->setFlag(63);
+ g_globals->setFlag(63);
SceneItem::display2(5300, 0);
SceneItem::display2(5300, 1);
}
break;
case CURSOR_USE:
- if (_globals->getFlag(64))
+ if (g_globals->getFlag(64))
SceneItem::display2(5300, 15);
else {
- _globals->setFlag(64);
+ g_globals->setFlag(64);
SceneItem::display2(5300, 14);
}
break;
@@ -2016,7 +2018,7 @@ void Scene5300::Hotspot7::doAction(int action) {
void Scene5300::Hotspot8::doAction(int action) {
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(5300, _globals->getFlag(65) ? 6 : 5);
+ SceneItem::display2(5300, g_globals->getFlag(65) ? 6 : 5);
break;
case CURSOR_USE:
SceneItem::display2(5300, 18);
@@ -2048,7 +2050,7 @@ void Scene5300::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerSText);
_stripManager.addSpeaker(&_speakerGameText);
- if (_globals->getFlag(106) && _globals->getFlag(107)) {
+ if (g_globals->getFlag(106) && g_globals->getFlag(107)) {
_hotspot2.postInit();
_hotspot2.setVisage(2806);
_hotspot2.setObjectWrapper(new SceneObjectWrapper());
@@ -2075,13 +2077,13 @@ void Scene5300::postInit(SceneObjectList *OwnerList) {
_hotspot4.animate(ANIM_MODE_2, NULL);
_hotspot4.hide();
- if (_globals->getFlag(67)) {
- _globals->_player.postInit();
- _globals->_player.setVisage(5316);
- _globals->_player.setPosition(Common::Point(191, 27));
- _globals->_player.disableControl();
+ if (g_globals->getFlag(67)) {
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(5316);
+ g_globals->_player.setPosition(Common::Point(191, 27));
+ g_globals->_player.disableControl();
- if (_globals->getFlag(107) && _globals->getFlag(106)) {
+ if (g_globals->getFlag(107) && g_globals->getFlag(106)) {
_hotspot2.setVisage(2806);
_hotspot2.postInit();
_hotspot2.setObjectWrapper(new SceneObjectWrapper());
@@ -2089,14 +2091,14 @@ void Scene5300::postInit(SceneObjectList *OwnerList) {
setAction(&_action2);
} else {
- _globals->_player.setVisage(5315);
- _globals->_player.setPosition(Common::Point(204, 86));
- _globals->_player.animate(ANIM_MODE_2, NULL);
- _globals->_player.setStrip2(1);
- _globals->_player._moveDiff.y = 12;
+ g_globals->_player.setVisage(5315);
+ g_globals->_player.setPosition(Common::Point(204, 86));
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player.setStrip2(1);
+ g_globals->_player._moveDiff.y = 12;
_sceneMode = 5308;
- setAction(&_sequenceManager, this, 5308, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 5308, &g_globals->_player, NULL);
}
} else {
_hotspot3.postInit();
@@ -2105,16 +2107,16 @@ void Scene5300::postInit(SceneObjectList *OwnerList) {
_hotspot3.fixPriority(1);
_hotspot3.animate(ANIM_MODE_NONE, NULL);
- _globals->_player.postInit();
- _globals->_player.setVisage(5315);
- _globals->_player.setPosition(Common::Point(204, 86));
- _globals->_player.animate(ANIM_MODE_2, NULL);
- _globals->_player.setStrip2(1);
- _globals->_player._moveDiff.y = 12;
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(5315);
+ g_globals->_player.setPosition(Common::Point(204, 86));
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player.setStrip2(1);
+ g_globals->_player._moveDiff.y = 12;
+ g_globals->_player.disableControl();
_sceneMode = 5306;
- setAction(&_sequenceManager, this, 5306, &_globals->_player, &_hotspot3, NULL);
+ setAction(&_sequenceManager, this, 5306, &g_globals->_player, &_hotspot3, NULL);
}
_field1B0A = 1;
@@ -2123,22 +2125,22 @@ void Scene5300::postInit(SceneObjectList *OwnerList) {
_hotspot5.setVisage(5301);
_hotspot5.setStrip(2);
_hotspot5.setPosition(Common::Point(190, 147));
- _globals->_sceneItems.push_back(&_hotspot5);
+ g_globals->_sceneItems.push_back(&_hotspot5);
}
_hotspot6.setBounds(Rect(74, 51, 114, 69));
_hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
_hotspot8._sceneRegionId = 8;
- _globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL);
- _globals->_soundHandler.play(212);
+ g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL);
+ g_globals->_soundHandler.play(212);
}
void Scene5300::signal() {
switch (_sceneMode) {
case 5301:
- _globals->_stripNum = 5300;
- _globals->_sceneManager.changeScene(5100);
+ g_globals->_stripNum = 5300;
+ g_globals->_sceneManager.changeScene(5100);
break;
case 5307:
_soundHandler.fadeOut(NULL);
@@ -2147,31 +2149,31 @@ void Scene5300::signal() {
case 5308:
case 5316:
case 5347:
- _globals->_player.setStrip2(-1);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.enableControl();
+ g_globals->_player.setStrip2(-1);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.enableControl();
break;
case 5303:
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.enableControl();
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.enableControl();
- if (_globals->getFlag(107))
+ if (g_globals->getFlag(107))
setAction(&_action1);
else
SceneItem::display2(5300, 28);
break;
case 5304:
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.enableControl();
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.enableControl();
- if (_globals->getFlag(106))
+ if (g_globals->getFlag(106))
setAction(&_action1);
else
SceneItem::display2(5300, 28);
break;
case 5306:
- _globals->clearFlag(67);
- _globals->_player.setStrip2(-1);
+ g_globals->clearFlag(67);
+ g_globals->_player.setStrip2(-1);
if ((RING_INVENTORY._vial._sceneNumber == 1) || (RING_INVENTORY._vial._sceneNumber == 5300))
_stripManager.start(5303, this);
@@ -2181,7 +2183,7 @@ void Scene5300::signal() {
break;
case 5309:
_hotspot5.remove();
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 5310:
_hotspot2.fixPriority(41);
@@ -2190,11 +2192,12 @@ void Scene5300::signal() {
setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL);
break;
case 5315:
- _globals->_stripNum = 5302;
- _globals->_sceneManager.changeScene(5100);
+ g_globals->_stripNum = 5302;
+ g_globals->_sceneManager.changeScene(5100);
break;
}
}
+} // End of namespace Ringworld
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes6.h b/engines/tsage/ringworld/ringworld_scenes6.h
index 2e99f5ab87..bf353de415 100644
--- a/engines/tsage/ringworld_scenes6.h
+++ b/engines/tsage/ringworld/ringworld_scenes6.h
@@ -24,13 +24,18 @@
#define TSAGE_RINGWORLD_SCENES6_H
#include "common/scummsys.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
#include "tsage/events.h"
#include "tsage/core.h"
#include "tsage/scenes.h"
#include "tsage/globals.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class Scene5000 : public Scene {
/* Actions */
@@ -324,7 +329,8 @@ public:
}
};
+} // End of namespace Ringworld
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld/ringworld_scenes8.cpp
index 2b329b958a..f8fb8b01e7 100644
--- a/engines/tsage/ringworld_scenes8.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes8.cpp
@@ -21,12 +21,14 @@
*/
#include "graphics/cursorman.h"
-#include "tsage/ringworld_scenes8.h"
+#include "tsage/ringworld/ringworld_scenes8.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
void NamedHotspotMult::synchronize(Serializer &s) {
SceneHotspot::synchronize(s);
@@ -49,11 +51,11 @@ void SceneObject7700::synchronize(Serializer &s) {
void Scene7000::Action1::signal() {
// Quinn walks from the lander to the seaside (action6) then discuss with Skeenar
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
@@ -67,7 +69,7 @@ void Scene7000::Action1::signal() {
scene->_object1.animate(ANIM_MODE_5, this);
scene->_object1.setPosition(Common::Point(151, 182));
scene->_object1.fixPriority(205);
- _globals->_sceneItems.push_front(&scene->_object1);
+ g_globals->_sceneItems.push_front(&scene->_object1);
break;
case 3:
scene->_object1._numFrames = 4;
@@ -80,7 +82,7 @@ void Scene7000::Action1::signal() {
setDelay(3);
break;
case 5:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -89,25 +91,25 @@ void Scene7000::Action1::signal() {
/*--------------------------------------------------------------------------*/
void Scene7000::Action2::signal() {
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
- _globals->_player.addMover(NULL);
- _globals->_player.setVisage(7006);
- _globals->_player.setStrip(1);
- _globals->_player.setFrame(1);
- _globals->_player.setPosition(Common::Point(_globals->_player._position.x, _globals->_player._position.y + 13));
- _globals->_player.changeZoom(68);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.addMover(NULL);
+ g_globals->_player.setVisage(7006);
+ g_globals->_player.setStrip(1);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.setPosition(Common::Point(g_globals->_player._position.x, g_globals->_player._position.y + 13));
+ g_globals->_player.changeZoom(68);
+ g_globals->_player.animate(ANIM_MODE_5, this);
scene->_object1.remove();
break;
case 2:
- _globals->_sceneManager.changeScene(7100);
+ g_globals->_sceneManager.changeScene(7100);
remove();
break;
}
@@ -116,7 +118,7 @@ void Scene7000::Action2::signal() {
/*--------------------------------------------------------------------------*/
void Scene7000::Action3::dispatch() {
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
Action::dispatch();
if (_actionIndex == 4)
@@ -127,7 +129,7 @@ void Scene7000::Action3::dispatch() {
void Scene7000::Action3::signal() {
// Lander is landing
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -163,7 +165,7 @@ void Scene7000::Action3::signal() {
}
case 4:
scene->_object4.remove();
- _globals->_sceneManager.changeScene(2100);
+ g_globals->_sceneManager.changeScene(2100);
remove();
break;
}
@@ -172,11 +174,11 @@ void Scene7000::Action3::signal() {
/*--------------------------------------------------------------------------*/
void Scene7000::Action4::signal() {
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_object1.animate(ANIM_MODE_6, this);
break;
case 1:
@@ -184,7 +186,7 @@ void Scene7000::Action4::signal() {
setDelay(300);
break;
case 2:
- _globals->_soundHandler.play(252);
+ g_globals->_soundHandler.play(252);
scene->_object1.show();
scene->_object1.setStrip(3);
scene->_object1.setFrame(1);
@@ -193,8 +195,8 @@ void Scene7000::Action4::signal() {
case 3:
scene->_object1.setStrip(4);
scene->_object1.animate(ANIM_MODE_8, 0, NULL);
- _globals->setFlag(81);
- _globals->_player.enableControl();
+ g_globals->setFlag(81);
+ g_globals->_player.enableControl();
remove();
break;
}
@@ -203,18 +205,18 @@ void Scene7000::Action4::signal() {
/*--------------------------------------------------------------------------*/
void Scene7000::Action5::signal() {
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0: {
NpcMover *playerMover = new NpcMover();
Common::Point pt(88, 121);
- _globals->_player.addMover(playerMover, &pt, this);
+ g_globals->_player.addMover(playerMover, &pt, this);
break;
}
case 1:
- _globals->_player.checkAngle(&scene->_object1);
- _globals->_soundHandler.play(252);
+ g_globals->_player.checkAngle(&scene->_object1);
+ g_globals->_soundHandler.play(252);
scene->_object1.setStrip(2);
scene->_stripManager.start(7015, this);
break;
@@ -227,34 +229,34 @@ void Scene7000::Action5::signal() {
scene->_object1.remove();
NpcMover *mover = new NpcMover();
Common::Point pt(31, 94);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 4: {
NpcMover *mover = new NpcMover();
Common::Point pt(11, 94);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 5: {
- _globals->_player.fixPriority(10);
+ g_globals->_player.fixPriority(10);
NpcMover *mover = new NpcMover();
Common::Point pt(11, 89);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 6: {
NpcMover *mover = new NpcMover();
Common::Point pt(41, 89);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 7:
- _globals->clearFlag(36);
- _globals->clearFlag(37);
- _globals->clearFlag(72);
- _globals->clearFlag(13);
- _globals->_sceneManager.changeScene(2100);
+ g_globals->clearFlag(36);
+ g_globals->clearFlag(37);
+ g_globals->clearFlag(72);
+ g_globals->clearFlag(13);
+ g_globals->_sceneManager.changeScene(2100);
break;
}
}
@@ -265,43 +267,43 @@ void Scene7000::Action6::signal() {
// Quinn walks from the lander to the seaside
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1: {
NpcMover *mover = new NpcMover();
Common::Point pt(12, 91);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2: {
NpcMover *mover = new NpcMover();
Common::Point pt(8, 91);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3: {
NpcMover *mover = new NpcMover();
Common::Point pt(31, 96);
- _globals->_player.addMover(mover, &pt, this);
- _globals->_player.fixPriority(-1);
+ g_globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.fixPriority(-1);
break;
}
case 4: {
NpcMover *mover = new NpcMover();
Common::Point pt(83, 117);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 5: {
NpcMover *mover = new NpcMover();
Common::Point pt(95, 121);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 6:
- _globals->_player.setStrip(3);
- _globals->_player.setFrame(1);
+ g_globals->_player.setStrip(3);
+ g_globals->_player.setFrame(1);
remove();
break;
}
@@ -312,7 +314,7 @@ void Scene7000::Action6::signal() {
void Scene7000::Action7::signal() {
switch (_actionIndex++) {
case 0:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
setDelay(3);
break;
case 1:
@@ -321,33 +323,33 @@ void Scene7000::Action7::signal() {
case 2: {
NpcMover *mover = new NpcMover();
Common::Point pt(31, 94);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3: {
NpcMover *mover = new NpcMover();
Common::Point pt(11, 94);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 4: {
- _globals->_player.fixPriority(10);
+ g_globals->_player.fixPriority(10);
NpcMover *mover = new NpcMover();
Common::Point pt(11, 89);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 5: {
NpcMover *mover = new NpcMover();
Common::Point pt(41, 89);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 6:
- if (_globals->getFlag(13))
- _globals->_sceneManager.changeScene(2280);
+ if (g_globals->getFlag(13))
+ g_globals->_sceneManager.changeScene(2280);
else
- _globals->_sceneManager.changeScene(2320);
+ g_globals->_sceneManager.changeScene(2320);
break;
}
}
@@ -365,84 +367,84 @@ void Scene7000::Hotspot1::doAction(int action) {
void Scene7000::Object1::doAction(int action) {
// Skeenar
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_TRANSLATOR:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
RING_INVENTORY._translator._sceneNumber = 7000;
if ((RING_INVENTORY._waldos._sceneNumber != 7000) && (RING_INVENTORY._jar._sceneNumber != 7000)) {
scene->_sceneMode = 7004;
- scene->setAction(&scene->_sequenceManager, scene, 7004, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7004, &g_globals->_player, this, NULL);
} else if (RING_INVENTORY._waldos._sceneNumber != 7000) {
scene->_sceneMode = 7011;
- scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7010, &g_globals->_player, &scene->_object1, NULL);
} else if (RING_INVENTORY._jar._sceneNumber != 7000) {
scene->_sceneMode = 7012;
- scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7010, &g_globals->_player, &scene->_object1, NULL);
} else {
scene->_sceneMode = 7015;
- scene->setAction(&scene->_sequenceManager, scene, 7017, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7017, &g_globals->_player, NULL);
}
break;
case OBJECT_WALDOS:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
RING_INVENTORY._waldos._sceneNumber = 7000;
if (RING_INVENTORY._translator._sceneNumber == 7000) {
if (RING_INVENTORY._jar._sceneNumber == 7000) {
scene->_sceneMode = 7015;
- scene->setAction(&scene->_sequenceManager, scene, 7015, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7015, &g_globals->_player, NULL);
} else {
scene->_sceneMode = 7006;
- scene->setAction(&scene->_sequenceManager, scene, 7006, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7006, &g_globals->_player, NULL);
}
} else {
scene->_sceneMode = 7009;
- scene->setAction(&scene->_sequenceManager, scene, 7009, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7009, &g_globals->_player, NULL);
}
break;
case OBJECT_JAR:
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
RING_INVENTORY._jar._sceneNumber = 7000;
if (RING_INVENTORY._translator._sceneNumber == 7000) {
if (RING_INVENTORY._waldos._sceneNumber != 7000) {
scene->_sceneMode = 7007;
- scene->setAction(&scene->_sequenceManager, scene, 7007, &_globals->_player, &scene->_object1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7007, &g_globals->_player, &scene->_object1, NULL);
} else {
scene->_sceneMode = 7015;
- scene->setAction(&scene->_sequenceManager, scene, 7016, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7016, &g_globals->_player, NULL);
}
} else {
scene->_sceneMode = 7008;
- scene->setAction(&scene->_sequenceManager, scene, 7008, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7008, &g_globals->_player, NULL);
}
break;
case CURSOR_LOOK:
- if (_globals->getFlag(81))
+ if (g_globals->getFlag(81))
SceneItem::display2(7000, 1);
else
SceneItem::display2(7000, 0);
break;
case CURSOR_USE:
- if (_globals->getFlag(81)) {
+ if (g_globals->getFlag(81)) {
RING_INVENTORY._stasisBox2._sceneNumber = 1;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action5);
} else {
SceneItem::display2(7000, 5);
}
break;
case CURSOR_TALK:
- if (_globals->getFlag(81)) {
+ if (g_globals->getFlag(81)) {
RING_INVENTORY._stasisBox2._sceneNumber = 1;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action5);
- } else if (_globals->getFlag(52)) {
+ } else if (g_globals->getFlag(52)) {
scene->_sceneMode = 7005;
scene->setAction(&scene->_sequenceManager, scene, 7013, NULL);
- } else if (_globals->getFlag(13)) {
+ } else if (g_globals->getFlag(13)) {
scene->_sceneMode = 7002;
scene->setAction(&scene->_sequenceManager, scene, 7014, NULL);
} else {
@@ -459,25 +461,25 @@ void Scene7000::Object1::doAction(int action) {
/*--------------------------------------------------------------------------*/
void Scene7000::dispatch() {
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
if (!_action) {
- if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 8) {
- if (!_globals->getFlag(13)) {
- _globals->_player.disableControl();
- _globals->_player.addMover(NULL);
+ if (g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 8) {
+ if (!g_globals->getFlag(13)) {
+ g_globals->_player.disableControl();
+ g_globals->_player.addMover(NULL);
SceneItem::display2(7000, 3);
_sceneMode = 7001;
- setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL);
- } else if (!_globals->getFlag(52)) {
+ setAction(&scene->_sequenceManager, this, 7001, &g_globals->_player, NULL);
+ } else if (!g_globals->getFlag(52)) {
setAction(&_action2);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
_sceneMode = 7003;
- setAction(&scene->_sequenceManager, this, 7003, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 7003, &g_globals->_player, NULL);
}
}
- if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 9)
+ if (g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 9)
scene->setAction(&scene->_action7);
}
Scene::dispatch();
@@ -496,7 +498,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerQR);
_speakerSKText._npc = &_object1;
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
_object5.postInit();
_object5.setVisage(7001);
@@ -526,7 +528,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {
_object8.setPosition(Common::Point(176, 175));
_object8.fixPriority(1);
- if (_globals->getFlag(72)) {
+ if (g_globals->getFlag(72)) {
_object3.postInit();
_object3.setVisage(5001);
_object3.setStrip2(1);
@@ -536,7 +538,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {
_object1.postInit();
_object1.setVisage(7003);
- if (_globals->getFlag(81))
+ if (g_globals->getFlag(81))
_object1.setStrip(4);
else
_object1.setStrip(2);
@@ -544,20 +546,20 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {
_object1._numFrames = 4;
_object1.changeZoom(45);
_object1.animate(ANIM_MODE_8, 0, NULL);
- _globals->_sceneItems.push_back(&_object1);
+ g_globals->_sceneItems.push_back(&_object1);
}
_soundHandler.play(251);
- if (_globals->_sceneManager._previousScene == 2100) {
- if (_globals->getFlag(72)) {
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ if (g_globals->_sceneManager._previousScene == 2100) {
+ if (g_globals->getFlag(72)) {
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
SceneObjectWrapper *wrapper = new SceneObjectWrapper();
- _globals->_player.setObjectWrapper(wrapper);
- _globals->_player.setPosition(Common::Point(57, 94));
- _globals->_player.changeZoom(-1);
- _globals->_player.fixPriority(10);
- if (_globals->getFlag(81)) {
+ g_globals->_player.setObjectWrapper(wrapper);
+ g_globals->_player.setPosition(Common::Point(57, 94));
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.fixPriority(10);
+ if (g_globals->getFlag(81)) {
setAction(&_action4);
} else {
_object1.setPosition(Common::Point(151, 182));
@@ -565,8 +567,8 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {
setAction(&_action1);
}
} else {
- _globals->_soundHandler.play(250);
- _globals->setFlag(72);
+ g_globals->_soundHandler.play(250);
+ g_globals->setFlag(72);
_object3.postInit();
_object3.setVisage(5001);
@@ -576,36 +578,36 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {
_object3.changeZoom(-1);
setAction(&_action3);
}
- } else if (_globals->_sceneManager._previousScene == 2280) {
- _globals->_player.postInit();
- _globals->_player.setVisage(2170);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setPosition(Common::Point(57, 94));
- _globals->_player.changeZoom(-1);
- _globals->_player.fixPriority(10);
- _globals->_player.disableControl();
+ } else if (g_globals->_sceneManager._previousScene == 2280) {
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2170);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setPosition(Common::Point(57, 94));
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.fixPriority(10);
+ g_globals->_player.disableControl();
_sceneMode = 7001;
setAction(&_action6, this);
- if (!_globals->getFlag(81)) {
+ if (!g_globals->getFlag(81)) {
_object1.setPosition(Common::Point(151, 182));
_object1.changeZoom(100);
}
_object8.remove();
_object9.remove();
- } else if (_globals->_sceneManager._previousScene == 2320) {
- _globals->_player.postInit();
- _globals->_player.setVisage(0);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ } else if (g_globals->_sceneManager._previousScene == 2320) {
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(0);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
SceneObjectWrapper *wrapper = new SceneObjectWrapper();
- _globals->_player.setObjectWrapper(wrapper);
- _globals->_player.setPosition(Common::Point(57, 94));
- _globals->_player.changeZoom(-1);
- _globals->_player.fixPriority(10);
+ g_globals->_player.setObjectWrapper(wrapper);
+ g_globals->_player.setPosition(Common::Point(57, 94));
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.fixPriority(10);
_sceneMode = 7001;
setAction(&_action6, this);
} else {
- _globals->setFlag(72);
+ g_globals->setFlag(72);
_object3.postInit();
_object3.setVisage(5001);
@@ -613,18 +615,18 @@ void Scene7000::postInit(SceneObjectList *OwnerList) {
_object3.setPosition(Common::Point(307, 0));
_soundHandler.play(151);
_soundHandler.holdAt(true);
- _globals->_soundHandler.play(250);
+ g_globals->_soundHandler.play(250);
setAction(&_action3);
}
_hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- _globals->_sceneItems.push_back(&_hotspot1);
+ g_globals->_sceneItems.push_back(&_hotspot1);
}
/*--------------------------------------------------------------------------*/
void Scene7000::signal() {
- Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene;
switch (_sceneMode) {
case 7001:
case 7002:
@@ -634,19 +636,19 @@ void Scene7000::signal() {
case 7007:
case 7008:
case 7009:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 7003:
_sceneMode = 7001;
- setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 7001, &g_globals->_player, NULL);
break;
case 7011:
_sceneMode = 7005;
- setAction(&scene->_sequenceManager, this, 7005, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 7005, &g_globals->_player, NULL);
break;
case 7012:
_sceneMode = 7005;
- setAction(&scene->_sequenceManager, this, 7012, &_globals->_player, NULL);
+ setAction(&scene->_sequenceManager, this, 7012, &g_globals->_player, NULL);
break;
case 7015:
setAction(&_action4);
@@ -661,7 +663,7 @@ void Scene7000::signal() {
*--------------------------------------------------------------------------*/
void Scene7100::Action3::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -681,11 +683,11 @@ void Scene7100::Action3::signal() {
}
void Scene7100::Action4::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(1) + 1);
+ setDelay(g_globals->_randomSource.getRandomNumber(1) + 1);
break;
case 1: {
scene->_object5.setStrip(3);
@@ -709,7 +711,7 @@ void Scene7100::Action4::signal() {
}
void Scene7100::Action5::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -744,7 +746,7 @@ void Scene7100::Action5::signal() {
}
void Scene7100::Action6::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -799,7 +801,7 @@ void Scene7100::Action6::signal() {
}
void Scene7100::Action7::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -827,7 +829,7 @@ void Scene7100::Action7::signal() {
}
void Scene7100::Action8::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -925,7 +927,7 @@ void Scene7100::Action8::signal() {
}
void Scene7100::Action9::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -970,7 +972,7 @@ void Scene7100::Action9::signal() {
}
void Scene7100::Action10::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -990,7 +992,7 @@ void Scene7100::Action10::signal() {
}
void Scene7100::Action11::signal() {
- Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+ Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -999,19 +1001,19 @@ void Scene7100::Action11::signal() {
case 1: {
Common::Point pt(154, 175);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
ObjectMover2 *mover2 = new ObjectMover2();
- scene->_object1.addMover(mover2, 25, 35, &_globals->_player);
+ scene->_object1.addMover(mover2, 25, 35, &g_globals->_player);
break;
}
case 2: {
Common::Point pt(700, 155);
NpcMover *mover = new NpcMover();
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 3:
- _globals->_sceneManager.changeScene(7200);
+ g_globals->_sceneManager.changeScene(7200);
remove();
break;
}
@@ -1117,14 +1119,14 @@ void Scene7100::postInit(SceneObjectList *OwnerList) {
_object25.setAction(&_action10, NULL);
// Swimmer 1
- _globals->_player.postInit();
- _globals->_player.setVisage(7101);
- _globals->_player.animate(ANIM_MODE_2, NULL);
- _globals->_player._moveDiff.x = 4;
- _globals->_player._moveDiff.y = 2;
- _globals->_player.setPosition(Common::Point(135, 135));
- _globals->_player.fixPriority(200);
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(7101);
+ g_globals->_player.animate(ANIM_MODE_2, NULL);
+ g_globals->_player._moveDiff.x = 4;
+ g_globals->_player._moveDiff.y = 2;
+ g_globals->_player.setPosition(Common::Point(135, 135));
+ g_globals->_player.fixPriority(200);
+ g_globals->_player.disableControl();
// Swimmer 2
_object1.postInit();
@@ -1137,7 +1139,7 @@ void Scene7100::postInit(SceneObjectList *OwnerList) {
setAction(&_action11);
_soundHandler1.play(270);
_soundHandler2.play(275);
- _globals->_soundHandler.play(270);
+ g_globals->_soundHandler.play(270);
}
/*--------------------------------------------------------------------------
* Scene 7200 - Underwater: Entering the cave
@@ -1145,7 +1147,7 @@ void Scene7100::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene7200::Action1::signal() {
- Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene;
+ Scene7200 *scene = (Scene7200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1157,13 +1159,13 @@ void Scene7200::Action1::signal() {
scene->_swimmer.addMover(mover1, &pt1, this);
Common::Point pt2(207, 138);
PlayerMover *mover2 = new PlayerMover();
- _globals->_player.addMover(mover2, &pt2, this);
+ g_globals->_player.addMover(mover2, &pt2, this);
break;
}
case 2:
break;
case 3:
- _globals->_sceneManager.changeScene(7300);
+ g_globals->_sceneManager.changeScene(7300);
remove();
break;
}
@@ -1172,7 +1174,7 @@ void Scene7200::Action1::signal() {
/*--------------------------------------------------------------------------*/
void Scene7200::Action2::signal() {
- Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene;
+ Scene7200 *scene = (Scene7200 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1286,13 +1288,13 @@ void Scene7200::postInit(SceneObjectList *OwnerList) {
_object9._numFrames = 3;
// Orange swimmer
- _globals->_player.postInit();
- _globals->_player.setVisage(7110);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setZoom(50);
- _globals->_player.setPosition(Common::Point(-18, 16));
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(7110);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setZoom(50);
+ g_globals->_player.setPosition(Common::Point(-18, 16));
+ g_globals->_player.disableControl();
_swimmer.postInit();
_swimmer.setVisage(7101);
@@ -1311,7 +1313,7 @@ void Scene7200::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
void Scene7300::Action1::signal() {
- Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+ Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1325,18 +1327,18 @@ void Scene7300::Action1::signal() {
case 4: {
NpcMover *mover = new NpcMover();
Common::Point pt(102, 122);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 5:
- _globals->_player.setStrip(2);
- _globals->_player.setFrame(1);
- _globals->_player.animate(ANIM_MODE_5, this);
+ g_globals->_player.setStrip(2);
+ g_globals->_player.setFrame(1);
+ g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 6:
- _globals->_player.setStrip(3);
- _globals->_player._numFrames = 5;
- _globals->_player.animate(ANIM_MODE_2, this);
+ g_globals->_player.setStrip(3);
+ g_globals->_player._numFrames = 5;
+ g_globals->_player.animate(ANIM_MODE_2, this);
if (RING_INVENTORY._translator._sceneNumber == 1)
scene->_stripManager.start(7310, this);
else
@@ -1344,10 +1346,10 @@ void Scene7300::Action1::signal() {
break;
case 7:
setDelay(3);
- _globals->_soundHandler.fadeOut(NULL);
+ g_globals->_soundHandler.fadeOut(NULL);
break;
case 8:
- _globals->_sceneManager.changeScene(2280);
+ g_globals->_sceneManager.changeScene(2280);
break;
}
}
@@ -1355,7 +1357,7 @@ void Scene7300::Action1::signal() {
/*--------------------------------------------------------------------------*/
void Scene7300::Action2::signal() {
- Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+ Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1363,7 +1365,7 @@ void Scene7300::Action2::signal() {
break;
case 1:
NpcMover *mover1 = new NpcMover();
- Common::Point pt(_globals->_randomSource.getRandomNumber(3) + 203, _globals->_randomSource.getRandomNumber(3) + 96);
+ Common::Point pt(g_globals->_randomSource.getRandomNumber(3) + 203, g_globals->_randomSource.getRandomNumber(3) + 96);
scene->_object3.addMover(mover1, &pt, this);
_actionIndex = 0;
break;
@@ -1373,7 +1375,7 @@ void Scene7300::Action2::signal() {
/*--------------------------------------------------------------------------*/
void Scene7300::Action3::signal() {
- Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+ Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
@@ -1381,7 +1383,7 @@ void Scene7300::Action3::signal() {
break;
case 1:
NpcMover *mover1 = new NpcMover();
- Common::Point pt(_globals->_randomSource.getRandomNumber(5) + 76, _globals->_randomSource.getRandomNumber(5) + 78);
+ Common::Point pt(g_globals->_randomSource.getRandomNumber(5) + 76, g_globals->_randomSource.getRandomNumber(5) + 78);
scene->_object1.addMover(mover1, &pt, this);
_actionIndex = 0;
break;
@@ -1404,7 +1406,7 @@ void Scene7300::Action4::signal() {
/*--------------------------------------------------------------------------*/
void Scene7300::dispatch() {
- Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+ Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene;
scene->_object4.setPosition(Common::Point(scene->_object3._position.x + 15, scene->_object3._position.y + 61));
scene->_object2.setPosition(Common::Point(scene->_object1._position.x + 1, scene->_object1._position.y - 31));
@@ -1419,9 +1421,9 @@ void Scene7300::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(60, 85, 200, 100);
- _globals->setFlag(52);
- _globals->setFlag(24);
- _globals->setFlag(109);
+ g_globals->setFlag(52);
+ g_globals->setFlag(24);
+ g_globals->setFlag(109);
_stripManager.addSpeaker(&_speakerPOR);
_stripManager.addSpeaker(&_speakerPOText);
@@ -1448,11 +1450,11 @@ void Scene7300::postInit(SceneObjectList *OwnerList) {
_object3._moveRate = 2;
_object3.setAction(&_action2);
- _globals->_player.postInit();
- _globals->_player.setVisage(7305);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setPosition(Common::Point(-100, 100));
- _globals->_player.disableControl();
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(7305);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setPosition(Common::Point(-100, 100));
+ g_globals->_player.disableControl();
_object1.postInit();
_object1.setVisage(7312);
@@ -1497,7 +1499,7 @@ void Scene7300::postInit(SceneObjectList *OwnerList) {
_object8._numFrames = 2;
setAction(&_action1);
- _globals->_soundHandler.play(272);
+ g_globals->_soundHandler.play(272);
}
/*--------------------------------------------------------------------------
@@ -1513,11 +1515,11 @@ void Scene7600::Action1::signal() {
case 1: {
PlayerMover *mover = new PlayerMover();
Common::Point pt(389, 57);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_sceneManager.changeScene(7700);
+ g_globals->_sceneManager.changeScene(7700);
break;
}
}
@@ -1532,11 +1534,11 @@ void Scene7600::Action2::signal() {
case 1: {
NpcMover *mover = new NpcMover();
Common::Point pt(-30, 195);
- _globals->_player.addMover(mover, &pt, this);
+ g_globals->_player.addMover(mover, &pt, this);
break;
}
case 2:
- _globals->_sceneManager.changeScene(2320);
+ g_globals->_sceneManager.changeScene(2320);
remove();
break;
}
@@ -1583,23 +1585,23 @@ void Scene7600::postInit(SceneObjectList *OwnerList) {
_object6.setPosition(Common::Point(379, 191));
_object6.fixPriority(1);
- _globals->_player.postInit();
- _globals->_player.setVisage(2333);
- _globals->_player.animate(ANIM_MODE_1, NULL);
- _globals->_player.setObjectWrapper(new SceneObjectWrapper());
- _globals->_player.setStrip(1);
- _globals->_player._moveDiff = Common::Point(16, 16);
- _globals->_player.changeZoom(-1);
- _globals->_player.disableControl();
-
- if (_globals->_sceneManager._previousScene == 7700) {
- _globals->_player.setPosition(Common::Point(389, 57));
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(2333);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ g_globals->_player.setStrip(1);
+ g_globals->_player._moveDiff = Common::Point(16, 16);
+ g_globals->_player.changeZoom(-1);
+ g_globals->_player.disableControl();
+
+ if (g_globals->_sceneManager._previousScene == 7700) {
+ g_globals->_player.setPosition(Common::Point(389, 57));
setAction(&_action2);
} else {
- _globals->_player.setPosition(Common::Point(-50, 195));
+ g_globals->_player.setPosition(Common::Point(-50, 195));
setAction(&_action1);
}
- _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+ _sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y);
loadScene(7600);
_soundHandler2.play(255);
_soundHandler1.play(251);
@@ -1616,11 +1618,11 @@ void Scene7700::Action1::signal() {
case 0: {
PlayerMover *mover1 = new PlayerMover();
Common::Point pt = Common::Point(fmtObj->_position.x, fmtObj->_position.y + 30);
- _globals->_player.addMover(mover1, &pt, this);
+ g_globals->_player.addMover(mover1, &pt, this);
break;
}
case 1:
- _globals->_player.checkAngle(fmtObj);
+ g_globals->_player.checkAngle(fmtObj);
if (fmtObj->_state == 0)
fmtObj->animate(ANIM_MODE_5, this);
else
@@ -1633,11 +1635,11 @@ void Scene7700::Action1::signal() {
}
void Scene7700::Action2::signal() {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
case 2:
- setDelay(_globals->_randomSource.getRandomNumber(60) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(60) + 60);
break;
case 1:
scene->_prof.animate(ANIM_MODE_7, 0, NULL);
@@ -1651,7 +1653,7 @@ void Scene7700::Action2::signal() {
}
void Scene7700::Action3::signal() {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_object15.animate(ANIM_MODE_5, this);
@@ -1673,14 +1675,14 @@ void Scene7700::Action3::signal() {
scene->_object8._numFrames = 3;
break;
case 3:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene7700::Action4::signal() {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 2:
scene->_object13.remove();
@@ -1699,21 +1701,21 @@ void Scene7700::Action4::signal() {
case 3:
CursorMan.showMouse(true);
SceneItem::display2(7700, 11);
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
remove();
break;
}
}
void Scene7700::Action5::signal() {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(240));
+ setDelay(g_globals->_randomSource.getRandomNumber(240));
break;
case 1: {
- scene->_cloud.setFrame(_globals->_randomSource.getRandomNumber(1) + 1);
- scene->_cloud.setPosition(Common::Point(133, 145 + _globals->_randomSource.getRandomNumber(54)));
+ scene->_cloud.setFrame(g_globals->_randomSource.getRandomNumber(1) + 1);
+ scene->_cloud.setPosition(Common::Point(133, 145 + g_globals->_randomSource.getRandomNumber(54)));
Common::Point pt(360, scene->_cloud._position.y);
NpcMover *mover = new NpcMover();
@@ -1725,7 +1727,7 @@ void Scene7700::Action5::signal() {
}
void Scene7700::Action6::signal() {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(5);
@@ -1771,7 +1773,7 @@ void Scene7700::SceneHotspot2::doAction(int action) {
}
void Scene7700::SceneHotspot3::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_KEY:
@@ -1785,13 +1787,13 @@ void Scene7700::SceneHotspot3::doAction(int action) {
SceneItem::display2(7700, 53);
break;
case CURSOR_USE:
- if (!_globals->getFlag(78)) {
+ if (!g_globals->getFlag(78)) {
scene->_sceneMode = 7712;
scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
} else if (RING_INVENTORY._key._sceneNumber == 7700) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 7705;
- scene->setAction(&scene->_sequenceManager, scene, 7705, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7705, &g_globals->_player, NULL);
}
break;
default:
@@ -1801,14 +1803,14 @@ void Scene7700::SceneHotspot3::doAction(int action) {
}
void Scene7700::SceneHotspot4::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(7700, 12);
break;
case CURSOR_USE:
- if (!_globals->getFlag(78)) {
+ if (!g_globals->getFlag(78)) {
scene->_sceneMode = 7712;
scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
} else {
@@ -1822,18 +1824,18 @@ void Scene7700::SceneHotspot4::doAction(int action) {
}
void Scene7700::SceneHotspot5::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(7700, 28);
break;
case CURSOR_USE:
- if (_globals->getFlag(78)) {
+ if (g_globals->getFlag(78)) {
if (RING_INVENTORY._paper._sceneNumber == 7700) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 7708;
- scene->setAction(&scene->_sequenceManager, scene, 7708, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7708, &g_globals->_player, NULL);
}
} else {
scene->_sceneMode = 7712;
@@ -1866,7 +1868,7 @@ void Scene7700::SceneItem7::doAction(int action) {
}
void Scene7700::SceneHotspot8::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1892,7 +1894,7 @@ void Scene7700::SceneHotspot8::doAction(int action) {
}
void Scene7700::SceneHotspot9::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1917,7 +1919,7 @@ void Scene7700::SceneHotspot9::doAction(int action) {
} else {
scene->_field97B++;
if (scene->_field97B == 3) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action3);
}
}
@@ -1935,13 +1937,13 @@ void Scene7700::SceneItem10::doAction(int action) {
}
void Scene7700::Object1::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(7700, _lookLineNum);
} else if (action == CURSOR_USE) {
- if (_globals->getFlag(78)) {
- _globals->_player.disableControl();
+ if (g_globals->getFlag(78)) {
+ g_globals->_player.disableControl();
scene->setAction(&scene->_action1, this);
} else {
scene->_sceneMode = 7712;
@@ -1973,20 +1975,20 @@ void Scene7700::Object1::signal() {
} else {
_state = 0;
}
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
}
void Scene7700::Object3::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(7700, 34);
} else if (action == CURSOR_USE) {
- if (_globals->getFlag(78)) {
+ if (g_globals->getFlag(78)) {
if (scene->_object3._frame == 1) {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 7707;
- scene->setAction(&scene->_sequenceManager, scene, 7707, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7707, &g_globals->_player, this, NULL);
} else {
SceneItem::display2(7700, 60);
}
@@ -2000,17 +2002,17 @@ void Scene7700::Object3::doAction(int action) {
}
void Scene7700::Object7::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
- if (_globals->getFlag(78))
+ if (g_globals->getFlag(78))
SceneItem::display2(7700, 45);
else
SceneItem::display2(7700, 44);
break;
case CURSOR_USE:
- if (_globals->getFlag(78)) {
+ if (g_globals->getFlag(78)) {
SceneItem::display2(7701, 41);
} else {
scene->_sceneMode = 7712;
@@ -2018,10 +2020,10 @@ void Scene7700::Object7::doAction(int action) {
}
break;
case CURSOR_TALK:
- if (_globals->getFlag(78)) {
+ if (g_globals->getFlag(78)) {
SceneItem::display2(7702, 1);
} else {
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
if (_state == 0) {
_state = 1;
scene->_sceneMode = 7703;
@@ -2033,13 +2035,13 @@ void Scene7700::Object7::doAction(int action) {
}
break;
case OBJECT_STUNNER:
- if (!_globals->getFlag(78)) {
- _globals->_soundHandler.stop();
- _globals->setFlag(78);
+ if (!g_globals->getFlag(78)) {
+ g_globals->_soundHandler.stop();
+ g_globals->setFlag(78);
setAction(NULL);
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 7704;
- scene->setAction(&scene->_sequenceManager, scene, 7704, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7704, &g_globals->_player, this, NULL);
}
break;
default:
@@ -2049,7 +2051,7 @@ void Scene7700::Object7::doAction(int action) {
}
void Scene7700::Object8::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) {
if (_strip == 3) {
@@ -2069,10 +2071,10 @@ void Scene7700::Object8::doAction(int action) {
scene->_gfxButton._bounds.center(140, 189);
scene->_gfxButton.draw();
- _globals->_sceneItems.push_front(&scene->_sceneItem10);
- _globals->_sceneItems.push_front(&scene->_object9);
- _globals->_player._canWalk = false;
- } else if (_globals->getFlag(78)) {
+ g_globals->_sceneItems.push_front(&scene->_sceneItem10);
+ g_globals->_sceneItems.push_front(&scene->_object9);
+ g_globals->_player._canWalk = false;
+ } else if (g_globals->getFlag(78)) {
scene->_object15.postInit();
scene->_object15.setVisage(7701);
scene->_object15.setPosition(Common::Point(140, 165));
@@ -2088,11 +2090,11 @@ void Scene7700::Object8::doAction(int action) {
scene->_object19.setStrip(6);
scene->_object19.setPosition(Common::Point(140, 192));
- _globals->_sceneItems.push_front(&scene->_sceneItem10);
- _globals->_sceneItems.push_front(&scene->_sceneHotspot8);
- _globals->_sceneItems.push_front(&scene->_sceneHotspot9);
- _globals->_events.setCursor(CURSOR_WALK);
- _globals->_player._canWalk = false;
+ g_globals->_sceneItems.push_front(&scene->_sceneItem10);
+ g_globals->_sceneItems.push_front(&scene->_sceneHotspot8);
+ g_globals->_sceneItems.push_front(&scene->_sceneHotspot9);
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_player._canWalk = false;
} else {
scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
}
@@ -2102,7 +2104,7 @@ void Scene7700::Object8::doAction(int action) {
}
void Scene7700::Object9::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -2116,19 +2118,19 @@ void Scene7700::Object9::doAction(int action) {
break;
case OBJECT_KEY:
if (_frame == 1) {
- if (!_globals->getFlag(80)) {
+ if (!g_globals->getFlag(80)) {
scene->_object10.postInit();
scene->_object10.setVisage(7701);
scene->_object10.setStrip(4);
scene->_object10.setPosition(Common::Point(159, 136));
- _globals->_sceneItems.push_front(&scene->_object10);
+ g_globals->_sceneItems.push_front(&scene->_object10);
scene->_object10.fixPriority(240);
}
scene->_soundHandler.play(262);
scene->_object14.animate(ANIM_MODE_5, NULL);
}
- _globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_events.setCursor(CURSOR_WALK);
break;
default:
SceneHotspot::doAction(action);
@@ -2136,14 +2138,14 @@ void Scene7700::Object9::doAction(int action) {
}
void Scene7700::Object10::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(7700, 50);
} else if (action == CURSOR_USE) {
- _globals->_player._canWalk = true;
+ g_globals->_player._canWalk = true;
RING_INVENTORY._translator._sceneNumber = 1;
- _globals->setFlag(80);
+ g_globals->setFlag(80);
scene->_sceneItem10.remove();
scene->_gfxButton._bounds.expandPanes();
scene->_object14.remove();
@@ -2155,7 +2157,7 @@ void Scene7700::Object10::doAction(int action) {
}
void Scene7700::Object11::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_SCANNER:
@@ -2174,18 +2176,18 @@ void Scene7700::Object11::doAction(int action) {
if (_frame != 1) {
SceneItem::display2(7701, 8);
} else {
- _globals->setFlag(49);
- _globals->_player.disableControl();
+ g_globals->setFlag(49);
+ g_globals->_player.disableControl();
scene->_sceneMode = 7706;
- scene->setAction(&scene->_sequenceManager, scene, 7706, &_globals->_player, this, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7706, &g_globals->_player, this, NULL);
}
break;
case OBJECT_EMPTY_JAR:
RING_INVENTORY._emptyJar._sceneNumber = 0;
RING_INVENTORY._jar._sceneNumber = 1;
- _globals->_player.disableControl();
+ g_globals->_player.disableControl();
scene->_sceneMode = 7710;
- scene->setAction(&scene->_sequenceManager, scene, 7710, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7710, &g_globals->_player, NULL);
break;
default:
SceneHotspot::doAction(action);
@@ -2193,14 +2195,14 @@ void Scene7700::Object11::doAction(int action) {
}
void Scene7700::Object12::doAction(int action) {
- Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene;
if (action == CURSOR_LOOK) {
SceneItem::display2(7700, 15);
} else if (action == CURSOR_USE) {
- if (_globals->getFlag(78)) {
+ if (g_globals->getFlag(78)) {
scene->_sceneMode = 7713;
- scene->setAction(&scene->_sequenceManager, scene, 7713, &_globals->_player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 7713, &g_globals->_player, NULL);
} else {
scene->_sceneMode = 7712;
scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
@@ -2213,46 +2215,46 @@ void Scene7700::Object12::doAction(int action) {
void Scene7700::signal() {
switch (_sceneMode) {
case 7701:
- _globals->_player.fixPriority(-1);
- _globals->_player.setStrip2(-1);
- if (_globals->getFlag(78)) {
- _globals->_player.enableControl();
+ g_globals->_player.fixPriority(-1);
+ g_globals->_player.setStrip2(-1);
+ if (g_globals->getFlag(78)) {
+ g_globals->_player.enableControl();
} else {
_sceneMode = 7711;
setAction(&_sequenceManager, this, 7711, NULL);
}
break;
case 7702:
- _soundHandler.fadeOut(0);
- _globals->_sceneManager.changeScene(7600);
+ g_globals->_soundHandler.fadeOut(NULL);
+ g_globals->_sceneManager.changeScene(7600);
break;
case 7703:
case 7706:
case 7707:
case 7711:
case 7712:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 7704:
- _globals->_soundHandler.play(256);
+ g_globals->_soundHandler.play(256);
_prof.setStrip2(4);
_prof.setFrame2(1);
_prof.setPosition(Common::Point(159, 87));
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 7705:
RING_INVENTORY._key._sceneNumber = 1;
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 7708:
RING_INVENTORY._paper._sceneNumber = 1;
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
break;
case 7709:
- _globals->_events.setCursor(CURSOR_USE);
+ g_globals->_events.setCursor(CURSOR_USE);
break;
case 7710:
- _globals->_player.enableControl();
+ g_globals->_player.enableControl();
SceneItem::display2(7700, 62);
break;
case 7713:
@@ -2267,23 +2269,23 @@ void Scene7700::signal() {
void Scene7700::process(Event &event) {
Scene::process(event);
- if (contains<SceneItem *>(_globals->_sceneItems, &_sceneItem10)) {
+ if (contains<SceneItem *>(g_globals->_sceneItems, &_sceneItem10)) {
if (_gfxButton.process(event)) {
_sceneItem10.remove();
_object15.remove();
_object9.remove();
- if (_globals->_sceneObjects->contains(&_object10))
+ if (g_globals->_sceneObjects->contains(&_object10))
_object10.remove();
- if (_globals->_sceneObjects->contains(&_object14))
+ if (g_globals->_sceneObjects->contains(&_object14))
_object14.remove();
_object19.remove();
_gfxButton._bounds.expandPanes();
- _globals->_player._canWalk = true;
+ g_globals->_player._canWalk = true;
}
}
if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_p)) {
event.handled = true;
- if (!_globals->_sceneObjects->contains(&_easterEgg1)) {
+ if (!g_globals->_sceneObjects->contains(&_easterEgg1)) {
_easterEgg1.postInit();
_easterEgg1.setVisage(7708);
_easterEgg1.setPosition(Common::Point(163, 50));
@@ -2295,15 +2297,15 @@ void Scene7700::process(Event &event) {
}
void Scene7700::dispatch() {
- if ((_globals->_sceneRegions.indexOf(_globals->_player._position) == 6) || (_globals->_player._position.x < 10))
- _globals->_player.changeZoom(100 - ((_globals->_player._position.y - 68) / 2));
+ if ((g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 6) || (g_globals->_player._position.x < 10))
+ g_globals->_player.changeZoom(100 - ((g_globals->_player._position.y - 68) / 2));
else
- _globals->_player.changeZoom(-1);
+ g_globals->_player.changeZoom(-1);
- if ((_action == 0) && (_globals->_sceneRegions.indexOf(_globals->_player._position) == 30)) {
- _globals->_player.disableControl();
+ if ((_action == 0) && (g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 30)) {
+ g_globals->_player.disableControl();
_sceneMode = 7702;
- setAction(&_sequenceManager, this, 7702, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 7702, &g_globals->_player, NULL);
}
Scene::dispatch();
}
@@ -2312,33 +2314,33 @@ void Scene7700::postInit(SceneObjectList *OwnerList) {
loadScene(7700);
Scene::postInit();
setZoomPercents(100, 80, 200, 100);
- _globals->setFlag(53);
+ g_globals->setFlag(53);
_field97B = 0;
_field979 = 0;
_field977 = 0;
_stripManager.addSpeaker(&_speakerEText);
_stripManager.addSpeaker(&_speakerQText);
- _speakerQText._npc = &_globals->_player;
+ _speakerQText._npc = &g_globals->_player;
_speakerEText._npc = &_prof;
- _globals->_player.postInit();
- _globals->_player.setVisage(4201);
- _globals->_player.animate(ANIM_MODE_1, NULL);
+ g_globals->_player.postInit();
+ g_globals->_player.setVisage(4201);
+ g_globals->_player.animate(ANIM_MODE_1, NULL);
SceneObjectWrapper *wrapper = new SceneObjectWrapper();
- _globals->_player.setObjectWrapper(wrapper);
- _globals->_player.setPosition(Common::Point(-19, 68));
- _globals->_player.setStrip2(7);
- _globals->_player.fixPriority(95);
- _globals->_player.changeZoom(80);
- _globals->_player._moveDiff.x = 6;
- _globals->_player._moveDiff.y = 3;
- _globals->_player.disableControl();
+ g_globals->_player.setObjectWrapper(wrapper);
+ g_globals->_player.setPosition(Common::Point(-19, 68));
+ g_globals->_player.setStrip2(7);
+ g_globals->_player.fixPriority(95);
+ g_globals->_player.changeZoom(80);
+ g_globals->_player._moveDiff.x = 6;
+ g_globals->_player._moveDiff.y = 3;
+ g_globals->_player.disableControl();
_prof.postInit();
_prof.setVisage(7706);
- if (_globals->getFlag(78)) {
+ if (g_globals->getFlag(78)) {
_prof.setStrip2(4);
_prof.fixPriority(80);
_prof.setPosition(Common::Point(159, 87));
@@ -2412,7 +2414,7 @@ void Scene7700::postInit(SceneObjectList *OwnerList) {
_cork.setVisage(7703);
_cork.setPosition(Common::Point(32, 128));
- if (_globals->getFlag(49))
+ if (g_globals->getFlag(49))
_cork.setFrame(_cork.getFrameCount());
if (RING_INVENTORY._emptyJar._sceneNumber == 7700) {
@@ -2420,7 +2422,7 @@ void Scene7700::postInit(SceneObjectList *OwnerList) {
_emptyJar.setVisage(7700);
_emptyJar.setStrip(8);
_emptyJar.setPosition(Common::Point(189, 48));
- _globals->_sceneItems.addItems(&_emptyJar, NULL);
+ g_globals->_sceneItems.addItems(&_emptyJar, NULL);
}
_sceneHotspot1._sceneRegionId = 28;
_sceneHotspot2._sceneRegionId = 6;
@@ -2511,16 +2513,16 @@ void Scene7700::postInit(SceneObjectList *OwnerList) {
_sceneHotspot36._useLineNum = 39;
_sceneHotspot36._lookLineNum = 42;
- _globals->_sceneItems.addItems(&_prof, &_sceneHotspot35, &_object8, &_sceneHotspot34, &_sceneHotspot33, &_sceneHotspot32, NULL);
- _globals->_sceneItems.addItems(&_sceneHotspot31, &_sceneHotspot30, &_sceneHotspot29, &_sceneHotspot5, &_sceneHotspot28, &_sceneHotspot27, NULL);
- _globals->_sceneItems.addItems(&_sceneHotspot26, &_sceneHotspot25, &_sceneHotspot24, &_sceneHotspot23, &_sceneHotspot22, &_sceneHotspot21, NULL);
- _globals->_sceneItems.addItems(&_sceneHotspot20, &_sceneHotspot19, &_sceneHotspot18, &_sceneHotspot17, &_sceneHotspot4, &_sceneHotspot3, NULL);
- _globals->_sceneItems.addItems(&_sceneHotspot16, &_sceneHotspot15, &_sceneHotspot2, &_sceneHotspot14, &_cork, &_sceneHotspot1, NULL);
- _globals->_sceneItems.addItems(&_sceneHotspot13, &_sceneHotspot12, &_sceneHotspot11, &_object2, &_object1, &_object3, NULL);
- _globals->_sceneItems.addItems(&_object6, &_object5, &_object4, &_sceneHotspot6, &_sceneHotspot36, &_sceneItem7, NULL);
+ g_globals->_sceneItems.addItems(&_prof, &_sceneHotspot35, &_object8, &_sceneHotspot34, &_sceneHotspot33, &_sceneHotspot32, NULL);
+ g_globals->_sceneItems.addItems(&_sceneHotspot31, &_sceneHotspot30, &_sceneHotspot29, &_sceneHotspot5, &_sceneHotspot28, &_sceneHotspot27, NULL);
+ g_globals->_sceneItems.addItems(&_sceneHotspot26, &_sceneHotspot25, &_sceneHotspot24, &_sceneHotspot23, &_sceneHotspot22, &_sceneHotspot21, NULL);
+ g_globals->_sceneItems.addItems(&_sceneHotspot20, &_sceneHotspot19, &_sceneHotspot18, &_sceneHotspot17, &_sceneHotspot4, &_sceneHotspot3, NULL);
+ g_globals->_sceneItems.addItems(&_sceneHotspot16, &_sceneHotspot15, &_sceneHotspot2, &_sceneHotspot14, &_cork, &_sceneHotspot1, NULL);
+ g_globals->_sceneItems.addItems(&_sceneHotspot13, &_sceneHotspot12, &_sceneHotspot11, &_object2, &_object1, &_object3, NULL);
+ g_globals->_sceneItems.addItems(&_object6, &_object5, &_object4, &_sceneHotspot6, &_sceneHotspot36, &_sceneItem7, NULL);
_sceneMode = 7701;
- setAction(&_sequenceManager, this, 7701, &_globals->_player, NULL);
+ setAction(&_sequenceManager, this, 7701, &g_globals->_player, NULL);
_soundHandler.play(256);
}
@@ -2542,4 +2544,6 @@ void Scene7700::synchronize(Serializer &s) {
}
}
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h
index fe9560d9d8..84178c36f9 100644
--- a/engines/tsage/ringworld_scenes8.h
+++ b/engines/tsage/ringworld/ringworld_scenes8.h
@@ -24,13 +24,18 @@
#define TSAGE_RINGWORLD_SCENES8_H
#include "common/scummsys.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
#include "tsage/events.h"
#include "tsage/core.h"
#include "tsage/scenes.h"
#include "tsage/globals.h"
-namespace tSage {
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
class NamedHotspotMult : public SceneHotspot {
public:
@@ -485,6 +490,8 @@ public:
virtual void synchronize(Serializer &s);
};
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_speakers.cpp
index 58501172af..dc80df40a3 100644
--- a/engines/tsage/ringworld_logic.cpp
+++ b/engines/tsage/ringworld/ringworld_speakers.cpp
@@ -20,313 +20,15 @@
*
*/
-#include "common/config-manager.h"
-#include "common/translation.h"
-#include "gui/saveload.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
+#include "tsage/graphics.h"
#include "tsage/staticres.h"
-#include "tsage/ringworld_demo.h"
-#include "tsage/ringworld_scenes1.h"
-#include "tsage/ringworld_scenes2.h"
-#include "tsage/ringworld_scenes3.h"
-#include "tsage/ringworld_scenes4.h"
-#include "tsage/ringworld_scenes5.h"
-#include "tsage/ringworld_scenes6.h"
-#include "tsage/ringworld_scenes8.h"
-#include "tsage/ringworld_scenes10.h"
-
-namespace tSage {
-
-Scene *RingworldGame::createScene(int sceneNumber) {
- switch (sceneNumber) {
- /* Scene group 1 */
- // Kziniti Palace (Introduction)
- case 10: return new Scene10();
- // Outer Space (Introduction)
- case 15: return new Scene15();
- // Cut-scenes for Ch'mee house in distance
- case 20: return new Scene20();
- // Outside Ch'mee residence
- case 30: return new Scene30();
- // Chmeee Home
- case 40: return new Scene40();
- // By Flycycles
- case 50: return new Scene50();
- // Flycycle controls
- case 60: return new Scene60();
- // Shipyard Entrance
- case 90: return new Scene90();
- // Ship Close-up
- case 95: return new Scene95();
- // Sunflower navigation sequence
- case 6100: return new Scene6100();
-
- /* Scene group 2 */
- // Title screen
- case 1000: return new Scene1000();
- // Fleeing planet cutscene
- case 1001: return new Scene1001();
- // Unused
- case 1250: return new Scene1250();
- // Ringworld Wall
- case 1400: return new Scene1400();
- // Ringworld Space-port
- case 1500: return new Scene1500();
-
- /* Scene group 3 - Part #1 */
- // Cockpit cutscenes
- case 2000: return new Scene2000();
- // Starcraft - Cockpit
- case 2100: return new Scene2100();
- // Encyclopedia
- case 2120: return new Scene2120();
- // Starcraft - Level 2
- case 2150: return new Scene2150();
- // Starcraft - AutoDoc
- case 2200: return new Scene2200();
- // Stasis Field Map
- case 2222: return new Scene2222();
- // Starcraft - Quinn's Room
- case 2230: return new Scene2230();
-
- /* Scene group 3 - Part #2 */
- // Starcraft - Storage Room
- case 2280: return new Scene2280();
- // Starcraft - Hanger Bay
- case 2300: return new Scene2300();
- // Starcraft - Copy Protection Screen
- case 2310: return new Scene2310();
- // Starcraft - Lander Bay
- case 2320: return new Scene2320();
- // Scene 2400 - Descending in Lander
- case 2400: return new Scene2400();
-
- /* Scene group 4 */
- // Ringworld Scan
- case 3500: return new Scene3500();
- // Remote Viewer
- case 3700: return new Scene3700();
-
- /* Scene group 5 */
- // Village
- case 4000: return new Scene4000();
- // Village - Outside Lander
- case 4010: return new Scene4010();
- // Village - Puzzle Board
- case 4025: return new Scene4025();
- // Village - Temple Antechamber
- case 4045: return new Scene4045();
- // Village - Temple
- case 4050: return new Scene4050();
- // Village - Hut
- case 4100: return new Scene4100();
- // Village - Bedroom
- case 4150: return new Scene4150();
- // Village - Near Slaver Ship
- case 4250: return new Scene4250();
- // Village - Slaver Ship
- case 4300: return new Scene4300();
- // Village - Slaver Ship Keypad
- case 4301: return new Scene4301();
-
- /* Scene group 6 */
- // Caverns - Entrance
- case 5000: return new Scene5000();
- // Caverns
- case 5100: return new Scene5100();
- // Caverns - Throne-room
- case 5200: return new Scene5200();
- // Caverns - Pit
- case 5300: return new Scene5300();
-
- /* Scene group 8 */
- // Landing near beach
- case 7000: return new Scene7000();
- // Underwater: swimming
- case 7100: return new Scene7100();
- // Underwater: Entering the cave
- case 7200: return new Scene7200();
- // Underwater: Lord Poria
- case 7300: return new Scene7300();
- // Floating Buildings: Outside
- case 7600: return new Scene7600();
- // Floating Buildings: In the lab
- case 7700: return new Scene7700();
-
- /* Scene group 10 */
- // Near beach: Slave washing clothes
- case 9100: return new Scene9100();
- // Castle: Outside the bulwarks
- case 9150: return new Scene9150();
- // Castle: Near the fountain
- case 9200: return new Scene9200();
- // Castle: In front of a large guarded door
- case 9300: return new Scene9300();
- // Castle: In a hallway
- case 9350: return new Scene9350();
- // Castle: In a hallway
- case 9360: return new Scene9360();
- // Castle: Black-Smith room
- case 9400: return new Scene9400();
- // Castle: Dining room
- case 9450: return new Scene9450();
- // Castle: Bedroom
- case 9500: return new Scene9500();
- // Castle: Balcony
- case 9700: return new Scene9700();
- // Castle: In the garden
- case 9750: return new Scene9750();
- // Castle: Dressing room
- case 9850: return new Scene9850();
- // Ending
- case 9900: return new Scene9900();
- // Space travel
- case 9999: return new Scene9999();
- default:
- error("Unknown scene number - %d", sceneNumber);
- break;
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-DisplayHotspot::DisplayHotspot(int regionId, ...) {
- _sceneRegionId = regionId;
-
- // Load up the actions
- va_list va;
- va_start(va, regionId);
-
- int param = va_arg(va, int);
- while (param != LIST_END) {
- _actions.push_back(param);
- param = va_arg(va, int);
- }
-
- va_end(va);
-}
-
-bool DisplayHotspot::performAction(int action) {
- for (uint i = 0; i < _actions.size(); i += 3) {
- if (_actions[i] == action) {
- display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
- return true;
- }
- }
-
- return false;
-}
-
-/*--------------------------------------------------------------------------*/
-
-DisplayObject::DisplayObject(int firstAction, ...) {
- // Load up the actions
- va_list va;
- va_start(va, firstAction);
-
- int param = firstAction;
- while (param != LIST_END) {
- _actions.push_back(param);
- param = va_arg(va, int);
- }
-
- va_end(va);
-}
-
-bool DisplayObject::performAction(int action) {
- for (uint i = 0; i < _actions.size(); i += 3) {
- if (_actions[i] == action) {
- display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
- return true;
- }
- }
-
- return false;
-}
-
-/*--------------------------------------------------------------------------*/
-
-SceneArea::SceneArea() {
- _savedArea = NULL;
- _pt.x = _pt.y = 0;
-}
-
-SceneArea::~SceneArea() {
- delete _savedArea;
-}
-
-void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) {
- _resNum = resNum;
- _rlbNum = rlbNum;
- _subNum = subNum;
- _actionId = actionId;
-
- _surface = surfaceFromRes(resNum, rlbNum, subNum);
-}
-
-void SceneArea::draw2() {
- _surface.draw(Common::Point(_bounds.left, _bounds.top));
-}
-
-void SceneArea::display() {
- _bounds.left = _pt.x - (_surface.getBounds().width() / 2);
- _bounds.top = _pt.y + 1 - _surface.getBounds().height();
- _bounds.setWidth(_surface.getBounds().width());
- _bounds.setHeight(_surface.getBounds().height());
-
- _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds);
- draw2();
-}
-
-void SceneArea::restore() {
- assert(_savedArea);
- _savedArea->draw(Common::Point(_bounds.left, _bounds.top));
- delete _savedArea;
- _savedArea = NULL;
-}
-
-void SceneArea::draw(bool flag) {
- _surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum);
- _surface.draw(Common::Point(_bounds.left, _bounds.top));
-}
-
-void SceneArea::wait() {
- // Wait until a mouse or keypress
- Event event;
- while (!_vm->getEventManager()->shouldQuit() && !_globals->_events.getEvent(event)) {
- g_system->updateScreen();
- g_system->delayMillis(10);
- }
+namespace TsAGE {
- SynchronizedList<SceneItem *>::iterator ii;
- for (ii = _globals->_sceneItems.begin(); ii != _globals->_sceneItems.end(); ++ii) {
- SceneItem *sceneItem = *ii;
- if (sceneItem->contains(event.mousePos)) {
- sceneItem->doAction(_actionId);
- break;
- }
- }
-
- _globals->_events.setCursor(CURSOR_ARROW);
-}
-
-void SceneArea::synchronize(Serializer &s) {
- if (s.getVersion() >= 2)
- SavedObject::synchronize(s);
-
- s.syncAsSint16LE(_pt.x);
- s.syncAsSint16LE(_pt.y);
- s.syncAsSint32LE(_resNum);
- s.syncAsSint32LE(_rlbNum);
- s.syncAsSint32LE(_subNum);
- s.syncAsSint32LE(_actionId);
- _bounds.synchronize(s);
-}
-
-/*--------------------------------------------------------------------------*/
+namespace Ringworld {
SpeakerGText::SpeakerGText() {
_speakerName = "GTEXT";
@@ -349,7 +51,7 @@ void SpeakerGText::setText(const Common::String &msg) {
// Set the text
Rect textRect;
- _globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth);
+ g_globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth);
textRect.center(_sceneObject._position.x, _sceneObject._position.y);
_textPos.x = textRect.left;
Speaker::setText(msg);
@@ -372,13 +74,13 @@ SpeakerPOR::SpeakerPOR() {
void SpeakerPOR::SpeakerAction1::signal(){
switch (_actionIndex++) {
case 0:
- setDelay(_globals->_randomSource.getRandomNumber(60) + 60);
+ setDelay(g_globals->_randomSource.getRandomNumber(60) + 60);
break;
case 1:
static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_5, this, NULL);
break;
case 2:
- setDelay(_globals->_randomSource.getRandomNumber(10));
+ setDelay(g_globals->_randomSource.getRandomNumber(10));
_actionIndex = 0;
break;
default:
@@ -1198,293 +900,6 @@ void SpeakerBatR::setText(const Common::String &msg) {
Speaker::setText(msg);
}
-/*--------------------------------------------------------------------------*/
-
-RingworldInvObjectList::RingworldInvObjectList() :
- _stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."),
- _scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."),
- _stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."),
- _infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."),
- _stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."),
- _keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."),
- _medkit(2280, 1, 7, OBJECT_MEDKIT, "Your medkit."),
- _ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."),
- _rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."),
- _key(7700, 1, 11, OBJECT_KEY, "A key."),
- _translator(7700, 1, 13, OBJECT_TRANSLATOR, "The dolphin translator box."),
- _ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."),
- _paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."),
- _waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."),
- _stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."),
- _ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."),
- _cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."),
- _tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."),
- _candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."),
- _straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."),
- _scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."),
- _sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."),
- _helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."),
- _items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."),
- _concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."),
- _nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."),
- _peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."),
- _vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."),
- _jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."),
- _tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."),
- _bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."),
- _jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."),
- _emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") {
-
- // Add the items to the list
- _itemList.push_back(&_stunner);
- _itemList.push_back(&_scanner);
- _itemList.push_back(&_stasisBox);
- _itemList.push_back(&_infoDisk);
- _itemList.push_back(&_stasisNegator);
- _itemList.push_back(&_keyDevice);
- _itemList.push_back(&_medkit);
- _itemList.push_back(&_ladder);
- _itemList.push_back(&_rope);
- _itemList.push_back(&_key);
- _itemList.push_back(&_translator);
- _itemList.push_back(&_ale);
- _itemList.push_back(&_paper);
- _itemList.push_back(&_waldos);
- _itemList.push_back(&_stasisBox2);
- _itemList.push_back(&_ring);
- _itemList.push_back(&_cloak);
- _itemList.push_back(&_tunic);
- _itemList.push_back(&_candle);
- _itemList.push_back(&_straw);
- _itemList.push_back(&_scimitar);
- _itemList.push_back(&_sword);
- _itemList.push_back(&_helmet);
- _itemList.push_back(&_items);
- _itemList.push_back(&_concentrator);
- _itemList.push_back(&_nullifier);
- _itemList.push_back(&_peg);
- _itemList.push_back(&_vial);
- _itemList.push_back(&_jacket);
- _itemList.push_back(&_tunic2);
- _itemList.push_back(&_bone);
- _itemList.push_back(&_jar);
- _itemList.push_back(&_emptyJar);
-
- _selectedItem = NULL;
-}
-
-/*--------------------------------------------------------------------------*/
-
-void RingworldGame::restartGame() {
- if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1)
- _globals->_game->restart();
-}
-
-void RingworldGame::saveGame() {
- if (!_vm->canSaveGameStateCurrently())
- MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING);
- else {
- // Show the save dialog
- handleSaveLoad(true, _globals->_sceneHandler._saveGameSlot, _globals->_sceneHandler._saveName);
- }
-}
-
-void RingworldGame::restoreGame() {
- if (!_vm->canLoadGameStateCurrently())
- MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING);
- else {
- // Show the load dialog
- handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
- }
-}
-
-void RingworldGame::quitGame() {
- if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1)
- _vm->quitGame();
-}
-
-void RingworldGame::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) {
- const EnginePlugin *plugin = 0;
- EngineMan.findGame(_vm->getGameId(), &plugin);
- GUI::SaveLoadChooser *dialog;
- if (saveFlag)
- dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"));
- else
- dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"));
-
- dialog->setSaveMode(saveFlag);
-
- saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
- saveName = dialog->getResultString();
-
- delete dialog;
-}
-
-void RingworldGame::start() {
- // Set some default flags
- _globals->setFlag(12);
- _globals->setFlag(34);
-
- // Set the screen to scroll in response to the player moving off-screen
- _globals->_scrollFollower = &_globals->_player;
-
- // Set the object's that will be in the player's inventory by default
- RING_INVENTORY._stunner._sceneNumber = 1;
- RING_INVENTORY._scanner._sceneNumber = 1;
- RING_INVENTORY._ring._sceneNumber = 1;
-
- int slot = -1;
-
- if (ConfMan.hasKey("save_slot")) {
- slot = ConfMan.getInt("save_slot");
- Common::String file = _vm->generateSaveName(slot);
- Common::InSaveFile *in = _vm->_system->getSavefileManager()->openForLoading(file);
- if (in)
- delete in;
- else
- slot = -1;
- }
-
- if (slot >= 0)
- _globals->_sceneHandler._loadGameSlot = slot;
- else
- // Switch to the title screen
- _globals->_sceneManager.setNewScene(1000);
-
- _globals->_events.showCursor();
-}
-
-void RingworldGame::restart() {
- _globals->_scenePalette.clearListeners();
- _globals->_soundHandler.stop();
-
- // Reset the flags
- _globals->reset();
- _globals->setFlag(34);
-
- // Clear save/load slots
- _globals->_sceneHandler._saveGameSlot = -1;
- _globals->_sceneHandler._loadGameSlot = -1;
-
- _globals->_stripNum = 0;
- _globals->_events.setCursor(CURSOR_WALK);
-
- // Reset item properties
- RING_INVENTORY._stunner._sceneNumber = 1;
- RING_INVENTORY._scanner._sceneNumber = 1;
- RING_INVENTORY._stasisBox._sceneNumber = 5200;
- RING_INVENTORY._infoDisk._sceneNumber = 40;
- RING_INVENTORY._stasisNegator._sceneNumber = 0;
- RING_INVENTORY._keyDevice._sceneNumber = 0;
- RING_INVENTORY._medkit._sceneNumber = 2280;
- RING_INVENTORY._ladder._sceneNumber = 4100;
- RING_INVENTORY._rope._sceneNumber = 4150;
- RING_INVENTORY._key._sceneNumber = 7700;
- RING_INVENTORY._translator._sceneNumber = 2150;
- RING_INVENTORY._paper._sceneNumber = 7700;
- RING_INVENTORY._waldos._sceneNumber = 0;
- RING_INVENTORY._ring._sceneNumber = 1;
- RING_INVENTORY._stasisBox2._sceneNumber = 8100;
- RING_INVENTORY._cloak._sceneNumber = 9850;
- RING_INVENTORY._tunic._sceneNumber = 9450;
- RING_INVENTORY._candle._sceneNumber = 9500;
- RING_INVENTORY._straw._sceneNumber = 9400;
- RING_INVENTORY._scimitar._sceneNumber = 9850;
- RING_INVENTORY._sword._sceneNumber = 9850;
- RING_INVENTORY._helmet._sceneNumber = 9500;
- RING_INVENTORY._items._sceneNumber = 4300;
- RING_INVENTORY._concentrator._sceneNumber = 4300;
- RING_INVENTORY._nullifier._sceneNumber = 4300;
- RING_INVENTORY._peg._sceneNumber = 4045;
- RING_INVENTORY._vial._sceneNumber = 5100;
- RING_INVENTORY._jacket._sceneNumber = 9850;
- RING_INVENTORY._tunic2._sceneNumber = 9850;
- RING_INVENTORY._bone._sceneNumber = 5300;
- RING_INVENTORY._jar._sceneNumber = 7700;
- RING_INVENTORY._emptyJar._sceneNumber = 7700;
- RING_INVENTORY._selectedItem = NULL;
-
- // Change to the first game scene
- _globals->_sceneManager.changeScene(30);
-}
-
-void RingworldGame::endGame(int resNum, int lineNum) {
- _globals->_events.setCursor(CURSOR_WALK);
- Common::String msg = _resourceManager->getMessage(resNum, lineNum);
- bool savesExist = _saver->savegamesExist();
-
- if (!savesExist) {
- // No savegames exist, so prompt the user to restart or quit
- if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0)
- _vm->quitGame();
- else
- restart();
- } else {
- // Savegames exist, so prompt for Restore/Restart
- bool breakFlag;
- do {
- if (_vm->shouldQuit()) {
- breakFlag = true;
- } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) {
- restart();
- breakFlag = true;
- } else {
- handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
- breakFlag = _globals->_sceneHandler._loadGameSlot >= 0;
- }
- } while (!breakFlag);
- }
-
- _globals->_events.setCursorFromFlag();
-}
-
-void RingworldGame::processEvent(Event &event) {
- if (event.eventType == EVENT_KEYPRESS) {
- switch (event.kbd.keycode) {
- case Common::KEYCODE_F1:
- // F1 - Help
- MessageDialog::show(HELP_MSG, OK_BTN_STRING);
- break;
-
- case Common::KEYCODE_F2: {
- // F2 - Sound Options
- ConfigDialog *dlg = new ConfigDialog();
- dlg->runModal();
- delete dlg;
- _globals->_soundManager.syncSounds();
- _globals->_events.setCursorFromFlag();
- break;
- }
-
- case Common::KEYCODE_F3:
- // F3 - Quit
- quitGame();
- event.handled = false;
- break;
-
- case Common::KEYCODE_F4:
- // F4 - Restart
- restartGame();
- _globals->_events.setCursorFromFlag();
- break;
-
- case Common::KEYCODE_F7:
- // F7 - Restore
- restoreGame();
- _globals->_events.setCursorFromFlag();
- break;
-
- case Common::KEYCODE_F10:
- // F10 - Pause
- GfxDialog::setPalette();
- MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING);
- _globals->_events.setCursorFromFlag();
- break;
-
- default:
- break;
- }
- }
-}
+} // End of namespace Ringworld
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld_logic.h b/engines/tsage/ringworld/ringworld_speakers.h
index 19b0f10b42..305984a184 100644
--- a/engines/tsage/ringworld_logic.h
+++ b/engines/tsage/ringworld/ringworld_speakers.h
@@ -20,87 +20,22 @@
*
*/
-#ifndef TSAGE_RINGWORLD_LOGIC_H
-#define TSAGE_RINGWORLD_LOGIC_H
+#ifndef TSAGE_RINGWORLD_SPEAKERS_H
+#define TSAGE_RINGWORLD_SPEAKERS_H
#include "common/scummsys.h"
+#include "tsage/converse.h"
#include "tsage/events.h"
#include "tsage/core.h"
#include "tsage/scenes.h"
#include "tsage/globals.h"
+#include "tsage/ringworld/ringworld_logic.h"
-namespace tSage {
+namespace TsAGE {
-#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
- _globals->_player.addMover(mover, &pt, this); }
-#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
- OBJ.addMover(mover, &pt, NULL); }
-#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
- OBJ.addMover(mover, &pt, this); }
+namespace Ringworld {
-#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
- OBJ.addMover(mover, &pt, this); }
-#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
- OBJ.addMover(mover, &pt, NULL); }
-
-
-class SceneFactory {
-public:
- static Scene *createScene(int sceneNumber);
-};
-
-class DisplayHotspot : public SceneObject {
-private:
- Common::Array<int> _actions;
- bool performAction(int action);
-public:
- DisplayHotspot(int regionId, ...);
-
- virtual void doAction(int action) {
- if (!performAction(action))
- SceneHotspot::doAction(action);
- }
-};
-
-class DisplayObject : public SceneObject {
-private:
- Common::Array<int> _actions;
- bool performAction(int action);
-public:
- DisplayObject(int firstAction, ...);
-
- virtual void doAction(int action) {
- if (!performAction(action))
- SceneHotspot::doAction(action);
- }
-};
-
-class SceneArea : public SavedObject {
-public:
- GfxSurface _surface;
- GfxSurface *_savedArea;
- Common::Point _pt;
- int _resNum;
- int _rlbNum;
- int _subNum;
- int _actionId;
- Rect _bounds;
-public:
- SceneArea();
- ~SceneArea();
-
- void setup(int resNum, int rlbNum, int subNum, int actionId);
- void draw2();
- void display();
- void restore();
-
- virtual void synchronize(Serializer &s);
- virtual void draw(bool flag);
- virtual void wait();
-};
-
-/*--------------------------------------------------------------------------*/
-// Ringworld specific game speakers
+using namespace TsAGE;
class SpeakerGText : public Speaker {
public:
@@ -395,67 +330,8 @@ public:
virtual void setText(const Common::String &msg);
};
-/*--------------------------------------------------------------------------*/
-
-class RingworldInvObjectList : public InvObjectList {
-public:
- InvObject _stunner;
- InvObject _scanner;
- InvObject _stasisBox;
- InvObject _infoDisk;
- InvObject _stasisNegator;
- InvObject _keyDevice;
- InvObject _medkit;
- InvObject _ladder;
- InvObject _rope;
- InvObject _key;
- InvObject _translator;
- InvObject _ale;
- InvObject _paper;
- InvObject _waldos;
- InvObject _stasisBox2;
- InvObject _ring;
- InvObject _cloak;
- InvObject _tunic;
- InvObject _candle;
- InvObject _straw;
- InvObject _scimitar;
- InvObject _sword;
- InvObject _helmet;
- InvObject _items;
- InvObject _concentrator;
- InvObject _nullifier;
- InvObject _peg;
- InvObject _vial;
- InvObject _jacket;
- InvObject _tunic2;
- InvObject _bone;
- InvObject _jar;
- InvObject _emptyJar;
-public:
- RingworldInvObjectList();
-
- virtual Common::String getClassName() { return "RingworldInvObjectList"; }
-};
-
-#define RING_INVENTORY (*((RingworldInvObjectList *)_globals->_inventory))
-
-class RingworldGame: public Game {
-protected:
- virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName);
-public:
- virtual void start();
- virtual void restart();
- virtual void restartGame();
- virtual void saveGame();
- virtual void restoreGame();
- virtual void quitGame();
- virtual void endGame(int resNum, int lineNum);
-
- virtual Scene *createScene(int sceneNumber);
- virtual void processEvent(Event &event);
-};
-
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.cpp b/engines/tsage/ringworld2/ringworld2_dialogs.cpp
new file mode 100644
index 0000000000..8d4863f332
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_dialogs.cpp
@@ -0,0 +1,193 @@
+/* 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.
+ *
+ */
+
+#include "common/translation.h"
+
+#include "gui/dialog.h"
+#include "gui/widget.h"
+
+#include "tsage/tsage.h"
+#include "tsage/core.h"
+#include "tsage/dialogs.h"
+#include "tsage/staticres.h"
+#include "tsage/globals.h"
+#include "tsage/ringworld2/ringworld2_dialogs.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+/**
+ * This dialog implements the right-click dialog
+ */
+RightClickDialog::RightClickDialog() : GfxDialog() {
+ // Setup button positions
+ _btnList[0] = Common::Point(48, 12);
+ _btnList[1] = Common::Point(31, 29);
+ _btnList[2] = Common::Point(65, 29);
+ _btnList[3] = Common::Point(14, 47);
+ _btnList[4] = Common::Point(48, 47);
+ _btnList[5] = Common::Point(83, 47);
+
+ // Set the palette and change the cursor
+ BF_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+ setPalette();
+
+ // Get the dialog image and selected button images
+ if (R2_GLOBALS._sceneManager._sceneNumber == 2900) {
+ _surface = surfaceFromRes(2902, 1, 1);
+ _btnImages.setVisage(2902, 2);
+ } else {
+ _surface = surfaceFromRes(1, 1, 1);
+ _btnImages.setVisage(1, 2);
+ }
+
+ // Set the dialog position
+ Rect dialogRect;
+ dialogRect.resize(_surface, 0, 0, 100);
+ dialogRect.center(g_globals->_events._mousePos.x, g_globals->_events._mousePos.y);
+
+ // Ensure the dialog will be entirely on-screen
+ Rect screenRect = g_globals->gfxManager()._bounds;
+ screenRect.collapse(4, 4);
+ dialogRect.contain(screenRect);
+
+ _bounds = dialogRect;
+ _gfxManager._bounds = _bounds;
+
+ _highlightedAction = -1;
+ _selectedAction = -1;
+}
+
+RightClickDialog::~RightClickDialog() {
+}
+
+void RightClickDialog::draw() {
+ // Save the covered background area
+ _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds);
+
+ // Draw the dialog image
+ g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top);
+}
+
+bool RightClickDialog::process(Event &event) {
+ switch (event.eventType) {
+ case EVENT_MOUSE_MOVE: {
+ // Check whether a button is highlighted
+ int buttonIndex;
+ for (buttonIndex = 6; buttonIndex >= 0; --buttonIndex) {
+ Rect tempRect(0, 0, 28, 29);
+ tempRect.moveTo(_btnList[buttonIndex].x, _btnList[buttonIndex].y);
+
+ if (tempRect.contains(event.mousePos))
+ break;
+ }
+ // If selection has changed, handle it
+ if (buttonIndex != _highlightedAction) {
+ if (_highlightedAction != -1) {
+ // Another button was previously selected, so restore dialog
+ _gfxManager.copyFrom(_surface, 0, 0);
+ }
+
+ if (buttonIndex != -1) {
+ // Draw newly selected button
+ GfxSurface btn = _btnImages.getFrame(buttonIndex + 1);
+ _gfxManager.copyFrom(btn, _btnList[buttonIndex].x, _btnList[buttonIndex].y);
+ }
+
+ _highlightedAction = buttonIndex;
+ }
+
+ event.handled = true;
+ return true;
+ }
+
+ case EVENT_BUTTON_DOWN:
+ // Specify the selected action
+ _selectedAction = (_highlightedAction == -1) ? 999 : _highlightedAction;
+ event.handled = true;
+ return true;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+void RightClickDialog::execute() {
+ // Draw the dialog
+ draw();
+
+ // Dialog event handler loop
+ _gfxManager.activate();
+
+ while (!g_vm->shouldQuit() && (_selectedAction == -1)) {
+ Event evt;
+ while (g_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) {
+ evt.mousePos.x -= _bounds.left;
+ evt.mousePos.y -= _bounds.top;
+
+ process(evt);
+ }
+
+ g_system->delayMillis(10);
+ g_system->updateScreen();
+ }
+
+ // Execute the specified action
+ CursorType cursorNum = CURSOR_NONE;
+ switch (_selectedAction) {
+ case 0:
+ // Look action
+ cursorNum = CURSOR_LOOK;
+ break;
+ case 1:
+ // Walk action
+ cursorNum = CURSOR_WALK;
+ break;
+ case 2:
+ // Use action
+ cursorNum = CURSOR_USE;
+ break;
+ case 3:
+ // Talk action
+ cursorNum = CURSOR_TALK;
+ break;
+ case 4:
+ // Change player
+ break;
+ case 5:
+ // Options dialog
+ break;
+ }
+
+ if (cursorNum != CURSOR_NONE)
+ BF_GLOBALS._events.setCursor(cursorNum);
+
+ _gfxManager.deactivate();
+}
+
+} // End of namespace Ringworld2
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.h b/engines/tsage/ringworld2/ringworld2_dialogs.h
new file mode 100644
index 0000000000..bbc35da3ea
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_dialogs.h
@@ -0,0 +1,66 @@
+/* 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 TSAGE_RINGWORLD2_DIALOGS_H
+#define TSAGE_RINGWORLD2_DIALOGS_H
+
+#include "gui/options.h"
+#include "tsage/dialogs.h"
+#include "tsage/events.h"
+#include "tsage/graphics.h"
+#include "common/list.h"
+#include "common/rect.h"
+#include "common/system.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+class RightClickDialog : public GfxDialog {
+private:
+ GfxSurface _surface;
+ Visage _btnImages;
+ Common::Point _btnList[6];
+
+ Rect _rectList1[5];
+ Rect _rectList2[5];
+ Rect _rectList3[5];
+ Rect _rectList4[5];
+
+ int _highlightedAction;
+ int _selectedAction;
+public:
+ RightClickDialog();
+ ~RightClickDialog();
+
+ virtual void draw();
+ virtual bool process(Event &event);
+ void execute();
+};
+
+} // End of namespace Ringworld2
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
new file mode 100644
index 0000000000..0bdcf36d0c
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -0,0 +1,761 @@
+/* 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.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
+#include "tsage/ringworld2/ringworld2_dialogs.h"
+#include "tsage/ringworld2/ringworld2_scenes0.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+Scene *Ringworld2Game::createScene(int sceneNumber) {
+ switch (sceneNumber) {
+ /* Scene group #0 */
+ // Quinn's room
+ case 100: return new Scene100();
+
+ default:
+ error("Unknown scene number - %d", sceneNumber);
+ break;
+ }
+}
+
+/**
+ * Returns true if it is currently okay to restore a game
+ */
+bool Ringworld2Game::canLoadGameStateCurrently() {
+ return true;
+}
+
+/**
+ * Returns true if it is currently okay to save the game
+ */
+bool Ringworld2Game::canSaveGameStateCurrently() {
+ return true;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SceneExt::SceneExt(): Scene() {
+ _stripManager._onBegin = SceneExt::startStrip;
+ _stripManager._onEnd = SceneExt::endStrip;
+
+ _field372 = _field37A = 0;
+ _savedPlayerEnabled = false;
+ _savedUiEnabled = false;
+ _savedCanWalk = false;
+ _focusObject = NULL;
+}
+
+void SceneExt::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit(OwnerList);
+
+ // Exclude the bottom area of the screen to allow room for the UI
+ T2_GLOBALS._interfaceY = UI_INTERFACE_Y;
+}
+
+void SceneExt::remove() {
+/*
+ R2_GLOBALS._uiElements.hide();
+ R2_GLOBALS._uiElements.resetClear();
+
+ if (_action) {
+ if (_action->_endHandler)
+ _action->_endHandler = NULL;
+ _action->remove();
+ }
+
+ _focusObject = NULL;
+*/
+}
+
+void SceneExt::process(Event &event) {
+ if (!event.handled)
+ Scene::process(event);
+}
+
+void SceneExt::dispatch() {
+/*
+ _timerList.dispatch();
+
+ if (_field37A) {
+ if ((--_field37A == 0) && R2_GLOBALS._dayNumber) {
+ if (R2_GLOBALS._uiElements._active && R2_GLOBALS._player._enabled) {
+ R2_GLOBALS._uiElements.show();
+ }
+
+ _field37A = 0;
+ }
+ }
+*/
+ Scene::dispatch();
+}
+
+void SceneExt::loadScene(int sceneNum) {
+ Scene::loadScene(sceneNum);
+
+ _v51C34.top = 0;
+ _v51C34.bottom = 300;
+}
+
+bool SceneExt::display(CursorType action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2));
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2) + 6);
+ break;
+ case CURSOR_TALK:
+ SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2) + 3);
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
+void SceneExt::fadeOut() {
+ uint32 black = 0;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, false, 100);
+}
+
+void SceneExt::startStrip() {
+ SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene;
+ scene->_field372 = 1;
+ scene->_savedPlayerEnabled = R2_GLOBALS._player._enabled;
+
+ if (scene->_savedPlayerEnabled) {
+ scene->_savedUiEnabled = R2_GLOBALS._player._uiEnabled;
+ scene->_savedCanWalk = R2_GLOBALS._player._canWalk;
+ R2_GLOBALS._player.disableControl();
+/*
+ if (!R2_GLOBALS._v50696 && R2_GLOBALS._uiElements._active)
+ R2_GLOBALS._uiElements.hide();
+*/
+ }
+}
+
+void SceneExt::endStrip() {
+ SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene;
+ scene->_field372 = 0;
+
+ if (scene->_savedPlayerEnabled) {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._uiEnabled = scene->_savedUiEnabled;
+ R2_GLOBALS._player._canWalk = scene->_savedCanWalk;
+/*
+ if (!R2_GLOBALS._v50696 && R2_GLOBALS._uiElements._active)
+ R2_GLOBALS._uiElements.show();
+*/
+ }
+}
+
+void SceneExt::clearScreen() {
+ R2_GLOBALS._screenSurface.fillRect(R2_GLOBALS._screenSurface.getBounds(), 0);
+}
+
+void SceneExt::refreshBackground(int xAmount, int yAmount) {
+ switch (_activeScreenNumber) {
+ case 700:
+ case 1020:
+ case 1100:
+ case 1700:
+ case 2600:
+ case 2950:
+ case 3100:
+ case 3101:
+ case 3275:
+ case 3600:
+ // Use traditional style sectioned screen loading
+ Scene::refreshBackground(xAmount, yAmount);
+ return;
+ default:
+ // Break out to new style screen loading
+ break;
+ }
+
+ /* New style background loading */
+
+ // Get the screen data
+ byte *dataP = g_resourceManager->getResource(RT18, _activeScreenNumber, 0);
+ int screenSize = g_vm->_memoryManager.getSize(dataP);
+
+ // Lock the background for update
+ Graphics::Surface s = _backSurface.lockSurface();
+ assert(screenSize == (s.w * s.h));
+
+ // Copy the data
+ byte *destP = (byte *)s.getBasePtr(0, 0);
+ Common::copy(dataP, dataP + (s.w * s.h), destP);
+ _backSurface.unlockSurface();
+
+ // Free the resource data
+ DEALLOCATE(dataP);
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayHotspot::DisplayHotspot(int regionId, ...) {
+ _sceneRegionId = regionId;
+
+ // Load up the actions
+ va_list va;
+ va_start(va, regionId);
+
+ int param = va_arg(va, int);
+ while (param != LIST_END) {
+ _actions.push_back(param);
+ param = va_arg(va, int);
+ }
+
+ va_end(va);
+}
+
+bool DisplayHotspot::performAction(int action) {
+ for (uint i = 0; i < _actions.size(); i += 3) {
+ if (_actions[i] == action) {
+ display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayObject::DisplayObject(int firstAction, ...) {
+ // Load up the actions
+ va_list va;
+ va_start(va, firstAction);
+
+ int param = firstAction;
+ while (param != LIST_END) {
+ _actions.push_back(param);
+ param = va_arg(va, int);
+ }
+
+ va_end(va);
+}
+
+bool DisplayObject::performAction(int action) {
+ for (uint i = 0; i < _actions.size(); i += 3) {
+ if (_actions[i] == action) {
+ display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+Ringworld2InvObjectList::Ringworld2InvObjectList():
+ _none(1, 1),
+ _inv1(1, 2),
+ _inv2(1, 3),
+ _inv3(1, 4),
+ _steppingDisks(1, 5),
+ _inv5(1, 6),
+ _inv6(1, 7),
+ _inv7(1, 8),
+ _inv8(1, 9),
+ _inv9(1, 10),
+ _inv10(1, 11),
+ _inv11(1, 12),
+ _inv12(1, 13),
+ _inv13(1, 14),
+ _inv14(1, 15),
+ _inv15(1, 16),
+ _inv16(1, 17),
+ _inv17(2, 2),
+ _inv18(2, 3),
+ _inv19(2, 4),
+ _inv20(2, 5),
+ _inv21(2, 5),
+ _inv22(2, 6),
+ _inv23(2, 7),
+ _inv24(2, 8),
+ _inv25(2, 9),
+ _inv26(2, 10),
+ _inv27(2, 11),
+ _inv28(2, 12),
+ _inv29(2, 13),
+ _inv30(2, 14),
+ _inv31(2, 15),
+ _inv32(2, 16),
+ _inv33(3, 2),
+ _inv34(3, 3),
+ _inv35(3, 4),
+ _inv36(3, 5),
+ _inv37(3, 6),
+ _inv38(3, 7),
+ _inv39(1, 10),
+ _inv40(3, 8),
+ _inv41(3, 9),
+ _inv42(3, 10),
+ _inv43(3, 11),
+ _inv44(3, 12),
+ _inv45(3, 13),
+ _inv46(3, 17),
+ _inv47(3, 14),
+ _inv48(3, 14),
+ _inv49(3, 15),
+ _inv50(3, 15),
+ _inv51(3, 17),
+ _inv52(4, 2) {
+
+ // Add the items to the list
+ _itemList.push_back(&_none);
+ _itemList.push_back(&_inv1);
+ _itemList.push_back(&_inv2);
+ _itemList.push_back(&_inv3);
+ _itemList.push_back(&_steppingDisks);
+ _itemList.push_back(&_inv5);
+ _itemList.push_back(&_inv6);
+ _itemList.push_back(&_inv7);
+ _itemList.push_back(&_inv8);
+ _itemList.push_back(&_inv9);
+ _itemList.push_back(&_inv10);
+ _itemList.push_back(&_inv11);
+ _itemList.push_back(&_inv12);
+ _itemList.push_back(&_inv13);
+ _itemList.push_back(&_inv14);
+ _itemList.push_back(&_inv15);
+ _itemList.push_back(&_inv16);
+ _itemList.push_back(&_inv17);
+ _itemList.push_back(&_inv18);
+ _itemList.push_back(&_inv19);
+ _itemList.push_back(&_inv20);
+ _itemList.push_back(&_inv21);
+ _itemList.push_back(&_inv22);
+ _itemList.push_back(&_inv23);
+ _itemList.push_back(&_inv24);
+ _itemList.push_back(&_inv25);
+ _itemList.push_back(&_inv26);
+ _itemList.push_back(&_inv27);
+ _itemList.push_back(&_inv28);
+ _itemList.push_back(&_inv29);
+ _itemList.push_back(&_inv30);
+ _itemList.push_back(&_inv31);
+ _itemList.push_back(&_inv32);
+ _itemList.push_back(&_inv33);
+ _itemList.push_back(&_inv34);
+ _itemList.push_back(&_inv35);
+ _itemList.push_back(&_inv36);
+ _itemList.push_back(&_inv37);
+ _itemList.push_back(&_inv38);
+ _itemList.push_back(&_inv39);
+ _itemList.push_back(&_inv40);
+ _itemList.push_back(&_inv41);
+ _itemList.push_back(&_inv42);
+ _itemList.push_back(&_inv43);
+ _itemList.push_back(&_inv44);
+ _itemList.push_back(&_inv45);
+ _itemList.push_back(&_inv46);
+ _itemList.push_back(&_inv47);
+ _itemList.push_back(&_inv48);
+ _itemList.push_back(&_inv49);
+ _itemList.push_back(&_inv50);
+ _itemList.push_back(&_inv51);
+ _itemList.push_back(&_inv52);
+
+ _selectedItem = NULL;
+}
+
+void Ringworld2InvObjectList::reset() {
+ // Reset all object scene numbers
+ SynchronizedList<InvObject *>::iterator i;
+ for (i = _itemList.begin(); i != _itemList.end(); ++i) {
+ (*i)->_sceneNumber = 0;
+ }
+
+ // Set up default inventory
+ setObjectScene(R2_1, 800);
+ setObjectScene(R2_2, 400);
+ setObjectScene(R2_3, 100);
+ setObjectScene(R2_STEPPING_DISKS, 100);
+ setObjectScene(R2_5, 400);
+ setObjectScene(R2_6, 400);
+ setObjectScene(R2_7, 500);
+ setObjectScene(R2_8, 700);
+ setObjectScene(R2_9, 800);
+ setObjectScene(R2_10, 100);
+ setObjectScene(R2_11, 400);
+ setObjectScene(R2_12, 500);
+ setObjectScene(R2_13, 1550);
+ setObjectScene(R2_14, 850);
+ setObjectScene(R2_15, 850);
+ setObjectScene(R2_16, 0);
+ setObjectScene(R2_17, 1550);
+ setObjectScene(R2_18, 1550);
+ setObjectScene(R2_19, 1550);
+ setObjectScene(R2_20, 500);
+ setObjectScene(R2_21, 500);
+ setObjectScene(R2_22, 1550);
+ setObjectScene(R2_23, 1580);
+ setObjectScene(R2_24, 9999);
+ setObjectScene(R2_25, 1550);
+ setObjectScene(R2_26, 1550);
+ setObjectScene(R2_27, 1580);
+ setObjectScene(R2_28, 1550);
+ setObjectScene(R2_29, 2525);
+ setObjectScene(R2_30, 2440);
+ setObjectScene(R2_31, 2455);
+ setObjectScene(R2_32, 2535);
+ setObjectScene(R2_33, 2530);
+ setObjectScene(R2_34, 1950);
+ setObjectScene(R2_35, 1950);
+ setObjectScene(R2_36, 9999);
+ setObjectScene(R2_37, 2430);
+ setObjectScene(R2_38, 9999);
+ setObjectScene(R2_39, 2);
+ setObjectScene(R2_40, 9999);
+ setObjectScene(R2_41, 3150);
+ setObjectScene(R2_42, 0);
+ setObjectScene(R2_43, 3260);
+ setObjectScene(R2_44, 2);
+ setObjectScene(R2_45, 1550);
+ setObjectScene(R2_46, 0);
+ setObjectScene(R2_47, 3150);
+ setObjectScene(R2_48, 2435);
+ setObjectScene(R2_49, 2440);
+ setObjectScene(R2_50, 2435);
+ setObjectScene(R2_51, 1580);
+ setObjectScene(R2_52, 3260);
+}
+
+void Ringworld2InvObjectList::setObjectScene(int objectNum, int sceneNumber) {
+ // Find the appropriate object
+ int num = objectNum;
+ SynchronizedList<InvObject *>::iterator i = _itemList.begin();
+ while (num-- > 0) ++i;
+ (*i)->_sceneNumber = sceneNumber;
+
+ // If the item is the currently active one, default back to the use cursor
+ if (R2_GLOBALS._events.getCursor() == objectNum)
+ R2_GLOBALS._events.setCursor(CURSOR_USE);
+
+ // Update the user interface if necessary
+ T2_GLOBALS._uiElements.updateInventory();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Ringworld2Game::start() {
+ int slot = -1;
+
+ if (ConfMan.hasKey("save_slot")) {
+ slot = ConfMan.getInt("save_slot");
+ Common::String file = g_vm->generateSaveName(slot);
+ Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file);
+ if (in)
+ delete in;
+ else
+ slot = -1;
+ }
+
+ if (slot >= 0)
+ g_globals->_sceneHandler->_loadGameSlot = slot;
+ else {
+ // Switch to the first game scene
+ g_globals->_events.setCursor(CURSOR_WALK);
+ g_globals->_sceneManager.setNewScene(100);
+ }
+
+ g_globals->_events.showCursor();
+}
+
+void Ringworld2Game::restart() {
+ g_globals->_scenePalette.clearListeners();
+ g_globals->_soundHandler.stop();
+
+ // Change to the first game scene
+ g_globals->_sceneManager.changeScene(100);
+}
+
+void Ringworld2Game::endGame(int resNum, int lineNum) {
+ g_globals->_events.setCursor(CURSOR_WALK);
+ Common::String msg = g_resourceManager->getMessage(resNum, lineNum);
+ bool savesExist = g_saver->savegamesExist();
+
+ if (!savesExist) {
+ // No savegames exist, so prompt the user to restart or quit
+ if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0)
+ g_vm->quitGame();
+ else
+ restart();
+ } else {
+ // Savegames exist, so prompt for Restore/Restart
+ bool breakFlag;
+ do {
+ if (g_vm->shouldQuit()) {
+ breakFlag = true;
+ } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) {
+ restart();
+ breakFlag = true;
+ } else {
+ handleSaveLoad(false, g_globals->_sceneHandler->_loadGameSlot, g_globals->_sceneHandler->_saveName);
+ breakFlag = g_globals->_sceneHandler->_loadGameSlot >= 0;
+ }
+ } while (!breakFlag);
+ }
+
+ g_globals->_events.setCursorFromFlag();
+}
+
+void Ringworld2Game::processEvent(Event &event) {
+ if (event.eventType == EVENT_KEYPRESS) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_F1:
+ // F1 - Help
+// MessageDialog::show(HELP_MSG, OK_BTN_STRING);
+ break;
+
+ case Common::KEYCODE_F2:
+ // F2 - Sound Options
+ SoundDialog::execute();
+ break;
+
+ case Common::KEYCODE_F3:
+ // F3 - Quit
+ quitGame();
+ event.handled = false;
+ break;
+
+ case Common::KEYCODE_F4:
+ // F4 - Restart
+ restartGame();
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F7:
+ // F7 - Restore
+ restoreGame();
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F10:
+ // F10 - Pause
+ GfxDialog::setPalette();
+ MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING);
+ g_globals->_events.setCursorFromFlag();
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Ringworld2Game::rightClick() {
+ RightClickDialog *dlg = new RightClickDialog();
+ dlg->execute();
+ delete dlg;
+}
+
+/*--------------------------------------------------------------------------*/
+
+NamedHotspot::NamedHotspot() : SceneHotspot() {
+ _resNum = 0;
+ _lookLineNum = _useLineNum = _talkLineNum = -1;
+}
+
+bool NamedHotspot::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_WALK:
+ // Nothing
+ return false;
+ case CURSOR_LOOK:
+ if (_lookLineNum == -1)
+ return SceneHotspot::startAction(action, event);
+
+ SceneItem::display2(_resNum, _lookLineNum);
+ return true;
+ case CURSOR_USE:
+ if (_useLineNum == -1)
+ return SceneHotspot::startAction(action, event);
+
+ SceneItem::display2(_resNum, _useLineNum);
+ return true;
+ case CURSOR_TALK:
+ if (_talkLineNum == -1)
+ return SceneHotspot::startAction(action, event);
+
+ SceneItem::display2(_resNum, _talkLineNum);
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
+ setBounds(ys, xe, ye, xs);
+ _resNum = resnum;
+ _lookLineNum = lookLineNum;
+ _useLineNum = useLineNum;
+ _talkLineNum = -1;
+ g_globals->_sceneItems.addItems(this, NULL);
+}
+
+void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
+ setBounds(bounds);
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ switch (mode) {
+ case 2:
+ g_globals->_sceneItems.push_front(this);
+ break;
+ case 4:
+ g_globals->_sceneItems.addBefore(item, this);
+ break;
+ case 5:
+ g_globals->_sceneItems.addAfter(item, this);
+ break;
+ default:
+ g_globals->_sceneItems.push_back(this);
+ break;
+ }
+}
+
+void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) {
+ _sceneRegionId = sceneRegionId;
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ // Handle adding hotspot to scene items list as necessary
+ switch (mode) {
+ case 2:
+ GLOBALS._sceneItems.push_front(this);
+ break;
+ case 3:
+ break;
+ default:
+ GLOBALS._sceneItems.push_back(this);
+ break;
+ }
+}
+
+void NamedHotspot::synchronize(Serializer &s) {
+ SceneHotspot::synchronize(s);
+ s.syncAsSint16LE(_resNum);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_useLineNum);
+
+ if (g_vm->getGameID() == GType_BlueForce)
+ s.syncAsSint16LE(_talkLineNum);
+}
+
+void SceneActor::postInit(SceneObjectList *OwnerList) {
+ _lookLineNum = _talkLineNum = _useLineNum = -1;
+ SceneObject::postInit();
+}
+
+void SceneActor::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_resNum);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_talkLineNum);
+ s.syncAsSint16LE(_useLineNum);
+
+ s.syncAsSint16LE(_effect);
+ s.syncAsSint16LE(_shade);
+}
+
+bool SceneActor::startAction(CursorType action, Event &event) {
+ bool handled = true;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_lookLineNum == -1)
+ handled = false;
+ else
+ SceneItem::display2(_resNum, _lookLineNum);
+ break;
+ case CURSOR_USE:
+ if (_useLineNum == -1)
+ handled = false;
+ else
+ SceneItem::display2(_resNum, _useLineNum);
+ break;
+ case CURSOR_TALK:
+ if (_talkLineNum == -1)
+ handled = false;
+ else
+ SceneItem::display2(_resNum, _talkLineNum);
+ break;
+ default:
+ handled = false;
+ break;
+ }
+
+ if (!handled)
+ handled = ((SceneExt *)R2_GLOBALS._sceneManager._scene)->display(action);
+ return handled;
+}
+
+void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ switch (mode) {
+ case 2:
+ g_globals->_sceneItems.push_front(this);
+ break;
+ case 4:
+ g_globals->_sceneItems.addBefore(item, this);
+ break;
+ case 5:
+ g_globals->_sceneItems.addAfter(item, this);
+ break;
+ default:
+ g_globals->_sceneItems.push_back(this);
+ break;
+ }
+}
+
+void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+}
+
+
+} // End of namespace Ringworld2
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h
new file mode 100644
index 0000000000..bfb3281d5d
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_logic.h
@@ -0,0 +1,250 @@
+/* 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 TSAGE_RINGWORLD2_LOGIC_H
+#define TSAGE_RINGWORLD2_LOGIC_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+#define R2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory))
+
+class SceneFactory {
+public:
+ static Scene *createScene(int sceneNumber);
+};
+
+class SceneExt: public Scene {
+private:
+ static void startStrip();
+ static void endStrip();
+public:
+ int _field372;
+ bool _savedPlayerEnabled;
+ bool _savedUiEnabled;
+ bool _savedCanWalk;
+ int _field37A;
+
+ SceneObject *_focusObject;
+ Visage _cursorVisage;
+
+ Rect _v51C34;
+public:
+ SceneExt();
+
+ virtual Common::String getClassName() { return "SceneExt"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void loadScene(int sceneNum);
+ virtual void refreshBackground(int xAmount, int yAmount);
+
+ bool display(CursorType action);
+ void fadeOut();
+ void clearScreen();
+};
+
+class DisplayHotspot : public SceneObject {
+private:
+ Common::Array<int> _actions;
+ bool performAction(int action);
+public:
+ DisplayHotspot(int regionId, ...);
+
+ virtual void doAction(int action) {
+ if (!performAction(action))
+ SceneHotspot::doAction(action);
+ }
+};
+
+class DisplayObject : public SceneObject {
+private:
+ Common::Array<int> _actions;
+ bool performAction(int action);
+public:
+ DisplayObject(int firstAction, ...);
+
+ virtual void doAction(int action) {
+ if (!performAction(action))
+ SceneHotspot::doAction(action);
+ }
+};
+
+class SceneObjectExt : public SceneObject {
+public:
+ int _state;
+
+ virtual void synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_state);
+ }
+ virtual Common::String getClassName() { return "SceneObjectExt"; }
+};
+
+/*--------------------------------------------------------------------------*/
+
+class Ringworld2InvObjectList : public InvObjectList {
+public:
+ InvObject _none;
+ InvObject _inv1;
+ InvObject _inv2;
+ InvObject _inv3;
+ InvObject _steppingDisks;
+ InvObject _inv5;
+ InvObject _inv6;
+ InvObject _inv7;
+ InvObject _inv8;
+ InvObject _inv9;
+ InvObject _inv10;
+ InvObject _inv11;
+ InvObject _inv12;
+ InvObject _inv13;
+ InvObject _inv14;
+ InvObject _inv15;
+ InvObject _inv16;
+ InvObject _inv17;
+ InvObject _inv18;
+ InvObject _inv19;
+ InvObject _inv20;
+ InvObject _inv21;
+ InvObject _inv22;
+ InvObject _inv23;
+ InvObject _inv24;
+ InvObject _inv25;
+ InvObject _inv26;
+ InvObject _inv27;
+ InvObject _inv28;
+ InvObject _inv29;
+ InvObject _inv30;
+ InvObject _inv31;
+ InvObject _inv32;
+ InvObject _inv33;
+ InvObject _inv34;
+ InvObject _inv35;
+ InvObject _inv36;
+ InvObject _inv37;
+ InvObject _inv38;
+ InvObject _inv39;
+ InvObject _inv40;
+ InvObject _inv41;
+ InvObject _inv42;
+ InvObject _inv43;
+ InvObject _inv44;
+ InvObject _inv45;
+ InvObject _inv46;
+ InvObject _inv47;
+ InvObject _inv48;
+ InvObject _inv49;
+ InvObject _inv50;
+ InvObject _inv51;
+ InvObject _inv52;
+
+ Ringworld2InvObjectList();
+ void reset();
+ void setObjectScene(int objectNum, int sceneNumber);
+
+ virtual Common::String getClassName() { return "Ringworld2InvObjectList"; }
+};
+
+#define RING2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory))
+
+class Ringworld2Game: public Game {
+public:
+ virtual void start();
+ virtual void restart();
+ virtual void endGame(int resNum, int lineNum);
+
+ virtual Scene *createScene(int sceneNumber);
+ virtual void processEvent(Event &event);
+ virtual void rightClick();
+ virtual bool canSaveGameStateCurrently();
+ virtual bool canLoadGameStateCurrently();
+};
+
+class NamedHotspot : public SceneHotspot {
+public:
+ int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
+ NamedHotspot();
+
+ virtual bool startAction(CursorType action, Event &event);
+ virtual Common::String getClassName() { return "NamedHotspot"; }
+ virtual void synchronize(Serializer &s);
+ virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
+ virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
+ virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode = 0);
+};
+
+class NamedHotspotExt : public NamedHotspot {
+public:
+ int _flag;
+ NamedHotspotExt() { _flag = 0; }
+
+ virtual Common::String getClassName() { return "NamedHotspot"; }
+ virtual void synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+ s.syncAsSint16LE(_flag);
+ }
+};
+
+class SceneActor: public SceneObject {
+public:
+ int _resNum;
+ int _lookLineNum, _talkLineNum, _useLineNum;
+ int _effect, _shade;
+
+ virtual Common::String getClassName() { return "SceneActor"; }
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual bool startAction(CursorType action, Event &event);
+
+ void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
+ void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+};
+
+class SceneActorExt: public SceneActor {
+public:
+ int _state;
+
+ SceneActorExt() { _state = 0; }
+ virtual Common::String getClassName() { return "SceneActorExt"; }
+ virtual void synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+ s.syncAsSint16LE(_state);
+ }
+};
+
+
+} // End of namespace Ringworld2
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
new file mode 100644
index 0000000000..526bf6e3c9
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.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.
+ *
+ */
+
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_scenes0.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+/*--------------------------------------------------------------------------
+ * Scene 100 - Quinn's Room
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene100::Object7::startAction(CursorType action, Event &event) {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_state) {
+ SceneItem::display2(100, 6);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 101;
+ scene->setAction(&scene->_sequenceManager1, scene, 101, &R2_GLOBALS._player, this, NULL);
+ }
+ return true;
+ case CURSOR_TALK:
+ if (_state) {
+ SceneItem::display2(100, 26);
+ _state = 0;
+ scene->_object10.setFrame(1);
+ } else {
+ SceneItem::display2(100, 27);
+ _state = 1;
+ scene->_object10.setFrame(2);
+ }
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene100::Object8::startAction(CursorType action, Event &event) {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ if (_strip == 2) {
+ scene->_sceneMode = 108;
+ scene->_object3.postInit();
+ scene->_object9.postInit();
+
+ if (R2_INVENTORY.getObjectScene(R2_3) == 1) {
+ scene->_object9.setup(100, 7, 2);
+ } else {
+ scene->_object9.setup(100, 7, 1);
+ scene->_object9.setDetails(100, 21, 22, 23, 2, NULL);
+ }
+
+ scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_object3,
+ &scene->_object9, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 109;
+ scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_object3,
+ &scene->_object9, &R2_GLOBALS._player, NULL);
+ }
+ return true;
+ case CURSOR_TALK:
+ R2_GLOBALS._player.disableControl();
+
+ if (_strip == 2) {
+ SceneItem::display2(100, 18);
+ scene->_sceneMode = 102;
+ scene->_object3.postInit();
+ scene->_object9.postInit();
+
+ if (R2_INVENTORY.getObjectScene(R2_3) == 1) {
+ scene->_object9.setup(100, 7, 2);
+ } else {
+ scene->_object9.setup(100, 7, 1);
+ scene->_object9.setDetails(100, 21, 22, 23, 2, NULL);
+ }
+
+ scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_object3,
+ &scene->_object9, NULL);
+ } else {
+ SceneItem::display2(100, 19);
+ scene->_sceneMode = 103;
+ scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_object3,
+ &scene->_object9, NULL);
+ }
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene100::Object9::startAction(CursorType action, Event &event) {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 107;
+ scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_object9, NULL);
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene100::Object10::startAction(CursorType action, Event &event) {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(100, _state ? 24 : 25);
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(100, _state ? 26 : 27);
+ return true;
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 110;
+ scene->setAction(&scene->_sequenceManager1, scene, 110, &R2_GLOBALS._player, NULL);
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene100::SteppingDisks::startAction(CursorType action, Event &event) {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 111;
+ scene->setAction(&scene->_sequenceManager1, scene, 111, &R2_GLOBALS._player, this, NULL);
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene100::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(100);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+
+ if (R2_GLOBALS._sceneManager._previousScene != 125)
+ R2_GLOBALS._sound1.play(10);
+
+ _object7.postInit();
+ _object7._state = 0;
+ _object7.setVisage(100);
+ _object7.setPosition(Common::Point(160, 84));
+ _object7.setDetails(100, 3, 4, 5, 1, NULL);
+
+ _object10.postInit();
+ _object10.setup(100, 2, 1);
+ _object10.setDetails(100, -1, -1, -1, 1, NULL);
+
+ _object8.postInit();
+ _object8.setup(100, 2, 3);
+ _object8.setPosition(Common::Point(175, 157));
+ _object8.setDetails(100, 17, 18, 20, 1, NULL);
+
+ _object1.postInit();
+ _object1.setup(100, 3, 1);
+ _object1.setPosition(Common::Point(89, 79));
+ _object1.fixPriority(250);
+ _object1.animate(ANIM_MODE_2, NULL);
+ _object1._numFrames = 3;
+
+ _object2.postInit();
+ _object2.setup(100, 3, 1);
+ _object2.setPosition(Common::Point(89, 147));
+ _object2.fixPriority(250);
+ _object2.animate(ANIM_MODE_7, 0, NULL);
+ _object2._numFrames = 3;
+
+ _object6.postInit();
+ _object6.setVisage(101);
+ _object6.setPosition(Common::Point(231, 126));
+ _object6.fixPriority(10);
+ _object6.setDetails(100, 37, -1, 39, 1, NULL);
+
+ if (R2_INVENTORY.getObjectScene(R2_STEPPING_DISKS) == 100) {
+ _steppingDisks.postInit();
+ _steppingDisks.setup(100, 8, 1);
+ _steppingDisks.setPosition(Common::Point(274, 130));
+ _steppingDisks.setDetails(100, 40, -1, 42, 1, NULL);
+ }
+
+ _item5.setDetails(11, 100, 14, 15, 16);
+ _item4.setDetails(12, 100, 11, -1, 13);
+ _item3.setDetails(13, 100, 8, 9, 10);
+ _item2.setDetails(14, 100, 34, -1, 36);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 100, 0, 1, -1, 1, NULL);
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 50:
+ case 180:
+ _object5.postInit();
+ _object4.postInit();
+ _sceneMode = 104;
+ setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_object6, &_object4, &_object5, NULL);
+ break;
+ case 125:
+ _sceneMode = 100;
+ setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL);
+ break;
+ case 200:
+ _sceneMode = 100;
+ setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_object7, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(180, 100));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene100::remove() {
+ R2_GLOBALS._sound1.play(10);
+ SceneExt::remove();
+}
+
+void Scene100::signal() {
+ switch (_sceneMode) {
+ case 101:
+ R2_GLOBALS._sceneManager.changeScene(200);
+ break;
+ case 103:
+ case 109:
+ _object8.setStrip(2);
+ _object8.setFrame(3);
+
+ _object3.remove();
+ _object9.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 104:
+ _sceneMode = 0;
+ _object5.remove();
+ _object4.remove();
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player.fixPriority(-1);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 105:
+ R2_GLOBALS._sceneManager.changeScene(125);
+ break;
+ case 107:
+ R2_GLOBALS._sceneItems.remove(&_object9);
+
+ _object9.setFrame(2);
+ R2_INVENTORY.setObjectScene(3, 1);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 110:
+ if (_object7._state) {
+ _object7._state = 0;
+ _object10.setFrame(1);
+ } else {
+ _object7._state = 1;
+ _object10.setFrame(2);
+ }
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene100::dispatch() {
+/*
+ int regionIndex = R2_GLOBALS._player.getRegionIndex();
+ if (regionIndex == 13)
+ R2_GLOBALS._player._shade = 4;
+
+ if ((R2_GLOBALS._player._visage == 13) || (R2_GLOBALS._player._visage == 101))
+ (R2_GLOBALS._player._shade = 0;
+*/
+ SceneExt::dispatch();
+
+ if ((_sceneMode == 101) && (_object7._frame == 2) && (_object8._strip == 5)) {
+ _object8.setAction(&_sequenceManager2, NULL, 103, &_object8, &_object3, &_object9, NULL);
+ }
+}
+
+} // End of namespace Ringworld2
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h
new file mode 100644
index 0000000000..c51b044137
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.h
@@ -0,0 +1,84 @@
+/* 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 TSAGE_RINGWORLD2_SCENES0_H
+#define TSAGE_RINGWORLD2_SCENES0_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+class Scene100: public SceneExt {
+ /* Objects */
+ class Object7: public SceneActorExt {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Object8: public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Object9: public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Object10: public SceneActorExt {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class SteppingDisks: public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+public:
+ NamedHotspot _item1, _item2, _item3, _item4, _item5;
+ SceneActor _object1, _object2, _object3, _object4, _object5;
+ SceneActor _object6;
+ Object7 _object7;
+ Object8 _object8;
+ Object9 _object9;
+ Object10 _object10;
+ SteppingDisks _steppingDisks;
+ SequenceManager _sequenceManager1, _sequenceManager2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+} // End of namespace Ringworld2
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp
index 522e40c236..db52050b03 100644
--- a/engines/tsage/saveload.cpp
+++ b/engines/tsage/saveload.cpp
@@ -21,23 +21,25 @@
*/
#include "common/savefile.h"
+#include "common/mutex.h"
#include "graphics/palette.h"
#include "graphics/scaler.h"
#include "graphics/thumbnail.h"
#include "tsage/globals.h"
#include "tsage/saveload.h"
+#include "tsage/sound.h"
#include "tsage/tsage.h"
-namespace tSage {
+namespace TsAGE {
-Saver *_saver;
+Saver *g_saver;
SavedObject::SavedObject() {
- _saver->addObject(this);
+ g_saver->addObject(this);
}
SavedObject::~SavedObject() {
- _saver->removeObject(this);
+ g_saver->removeObject(this);
}
/*--------------------------------------------------------------------------*/
@@ -50,7 +52,7 @@ Saver::Saver() {
Saver::~Saver() {
// Internal validation that no saved object is still present
int totalLost = 0;
- for (SynchronizedList<SavedObject *>::iterator i = _saver->_objList.begin(); i != _saver->_objList.end(); ++i) {
+ for (SynchronizedList<SavedObject *>::iterator i = g_saver->_objList.begin(); i != g_saver->_objList.end(); ++i) {
SavedObject *so = *i;
if (so)
++totalLost;
@@ -70,7 +72,7 @@ void Serializer::syncPointer(SavedObject **ptr, Common::Serializer::Version minV
if (isSaving()) {
// Get the object index for the given pointer and write it out
if (*ptr) {
- idx = _saver->blockIndexOf(*ptr);
+ idx = g_saver->blockIndexOf(*ptr);
assert(idx > 0);
}
syncAsUint32LE(idx);
@@ -80,7 +82,7 @@ void Serializer::syncPointer(SavedObject **ptr, Common::Serializer::Version minV
*ptr = NULL;
if (idx > 0)
// For non-zero (null) pointers, create a record for later resolving it to an address
- _saver->addSavedObjectPtr(ptr, idx);
+ g_saver->addSavedObjectPtr(ptr, idx);
}
}
@@ -101,10 +103,24 @@ void Serializer::validate(int v, Common::Serializer::Version minVersion,
error("Savegame is corrupt");
}
+#define DOUBLE_PRECISION 1000000000
+
+void Serializer::syncAsDouble(double &v) {
+ int32 num = (int32)(v);
+ uint32 fraction = (uint32)((v - (int32)v) * DOUBLE_PRECISION);
+
+ syncAsSint32LE(num);
+ syncAsUint32LE(fraction);
+
+ if (isLoading())
+ v = num + (double)fraction / DOUBLE_PRECISION;
+}
+
/*--------------------------------------------------------------------------*/
Common::Error Saver::save(int slot, const Common::String &saveName) {
assert(!getMacroRestoreFlag());
+ Common::StackLock slock1(g_globals->_soundManager._serverDisabledMutex);
// Signal any objects registered for notification
_saveNotifiers.notify(false);
@@ -113,8 +129,12 @@ Common::Error Saver::save(int slot, const Common::String &saveName) {
_macroSaveFlag = true;
_saveSlot = slot;
+ // Try and create the save file
+ Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(g_vm->generateSaveName(slot));
+ if (!saveFile)
+ return Common::kCreatingFileFailed;
+
// Set up the serializer
- Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(_vm->generateSaveName(slot));
Serializer serializer(NULL, saveFile);
serializer.setSaveVersion(TSAGE_SAVEGAME_VERSION);
@@ -149,6 +169,7 @@ Common::Error Saver::save(int slot, const Common::String &saveName) {
Common::Error Saver::restore(int slot) {
assert(!getMacroRestoreFlag());
+ Common::StackLock slock1(g_globals->_soundManager._serverDisabledMutex);
// Signal any objects registered for notification
_loadNotifiers.notify(false);
@@ -159,7 +180,10 @@ Common::Error Saver::restore(int slot) {
_unresolvedPtrs.clear();
// Set up the serializer
- Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(_vm->generateSaveName(slot));
+ Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(g_vm->generateSaveName(slot));
+ if (!saveFile)
+ return Common::kReadingFailed;
+
Serializer serializer(saveFile, NULL);
// Read in the savegame header
@@ -205,7 +229,7 @@ Common::Error Saver::restore(int slot) {
// Final post-restore notifications
_macroRestoreFlag = false;
- _loadNotifiers.notify(false);
+ _loadNotifiers.notify(true);
return Common::kNoError;
}
@@ -232,12 +256,9 @@ bool Saver::readSavegameHeader(Common::InSaveFile *in, tSageSavegameHeader &head
while ((ch = (char)in->readByte()) != '\0') header.saveName += ch;
// Get the thumbnail
- header.thumbnail = new Graphics::Surface();
- if (!Graphics::loadThumbnail(*in, *header.thumbnail)) {
- delete header.thumbnail;
- header.thumbnail = NULL;
+ header.thumbnail = Graphics::loadThumbnail(*in);
+ if (!header.thumbnail)
return false;
- }
// Read in save date/time
header.saveYear = in->readSint16LE();
@@ -265,10 +286,10 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h
// Create a thumbnail and save it
Graphics::Surface *thumb = new Graphics::Surface();
- Graphics::Surface s = _globals->_screenSurface.lockSurface();
+ Graphics::Surface s = g_globals->_screenSurface.lockSurface();
::createThumbnail(thumb, (const byte *)s.pixels, SCREEN_WIDTH, SCREEN_HEIGHT, thumbPalette);
Graphics::saveThumbnail(*out, *thumb);
- _globals->_screenSurface.unlockSurface();
+ g_globals->_screenSurface.unlockSurface();
delete thumb;
// Write out the save date/time
@@ -279,7 +300,7 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h
out->writeSint16LE(td.tm_mday);
out->writeSint16LE(td.tm_hour);
out->writeSint16LE(td.tm_min);
- out->writeUint32LE(_globals->_events.getFrameNumber());
+ out->writeUint32LE(g_globals->_events.getFrameNumber());
}
/**
@@ -321,7 +342,7 @@ void Saver::removeObject(SavedObject *obj) {
* Returns true if any savegames exist
*/
bool Saver::savegamesExist() const {
- Common::String slot1Name = _vm->generateSaveName(1);
+ Common::String slot1Name = g_vm->generateSaveName(1);
Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slot1Name);
bool result = saveFile != NULL;
@@ -396,4 +417,4 @@ void Saver::resolveLoadPointers() {
error("Could not resolve savegame block pointers");
}
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h
index c1c2851f28..52b23413d4 100644
--- a/engines/tsage/saveload.h
+++ b/engines/tsage/saveload.h
@@ -29,11 +29,11 @@
#include "common/savefile.h"
#include "common/serializer.h"
-namespace tSage {
+namespace TsAGE {
typedef void (*SaveNotifierFn)(bool postFlag);
-#define TSAGE_SAVEGAME_VERSION 5
+#define TSAGE_SAVEGAME_VERSION 7
class SavedObject;
@@ -77,6 +77,7 @@ public:
Common::Serializer::Version maxVersion = kLastVersion);
void validate(int v, Common::Serializer::Version minVersion = 0,
Common::Serializer::Version maxVersion = kLastVersion);
+ void syncAsDouble(double &v);
};
/*--------------------------------------------------------------------------*/
@@ -137,6 +138,18 @@ public:
}
}
}
+
+ void addBefore(T existingItem, T newItem) {
+ typename SynchronizedList<T>::iterator i = this->begin();
+ while ((i != this->end()) && (*i != existingItem)) ++i;
+ this->insert(i, newItem);
+ }
+ void addAfter(T existingItem, T newItem) {
+ typename SynchronizedList<T>::iterator i = this->begin();
+ while ((i != this->end()) && (*i != existingItem)) ++i;
+ if (i != this->end()) ++i;
+ this->insert(i, newItem);
+ }
};
/**
@@ -219,8 +232,8 @@ public:
void listObjects();
};
-extern Saver *_saver;
+extern Saver *g_saver;
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index 6352918e39..686b8725f5 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -20,13 +20,17 @@
*
*/
+#include "common/config-manager.h"
+#include "common/translation.h"
+#include "gui/saveload.h"
#include "tsage/scenes.h"
#include "tsage/globals.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
#include "tsage/tsage.h"
#include "tsage/saveload.h"
+#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
SceneManager::SceneManager() {
_scene = NULL;
@@ -36,8 +40,9 @@ SceneManager::SceneManager() {
_previousScene = 0;
_fadeMode = FADEMODE_GRADUAL;
_scrollerRect = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
- _saver->addListener(this);
+ g_saver->addListener(this);
_objectCount = 0;
+ _loadMode = 0;
}
SceneManager::~SceneManager() {
@@ -45,7 +50,7 @@ SceneManager::~SceneManager() {
}
void SceneManager::setNewScene(int sceneNumber) {
- warning("SetNewScene(%d)", sceneNumber);
+ debug(1, "SetNewScene(%d)", sceneNumber);
_nextSceneNumber = sceneNumber;
}
@@ -55,7 +60,7 @@ void SceneManager::checkScene() {
_nextSceneNumber = -1;
}
- _globals->dispatchSounds();
+ g_globals->dispatchSounds();
}
void SceneManager::sceneChange() {
@@ -68,24 +73,16 @@ void SceneManager::sceneChange() {
}
// Clear the scene objects
- SynchronizedList<SceneObject *>::iterator io = _globals->_sceneObjects->begin();
- while (io != _globals->_sceneObjects->end()) {
- SceneObject *sceneObj = *io;
- ++io;
- sceneObj->removeObject();
- }
-
- // Clear the secondary scene object list
- io = _globals->_sceneManager._altSceneObjects.begin();
- while (io != _globals->_sceneManager._altSceneObjects.end()) {
+ SynchronizedList<SceneObject *>::iterator io = g_globals->_sceneObjects->begin();
+ while (io != g_globals->_sceneObjects->end()) {
SceneObject *sceneObj = *io;
++io;
sceneObj->removeObject();
}
// Clear the hotspot list
- SynchronizedList<SceneItem *>::iterator ii = _globals->_sceneItems.begin();
- while (ii != _globals->_sceneItems.end()) {
+ SynchronizedList<SceneItem *>::iterator ii = g_globals->_sceneItems.begin();
+ while (ii != g_globals->_sceneItems.end()) {
SceneItem *sceneItem = *ii;
++ii;
sceneItem->remove();
@@ -110,47 +107,47 @@ void SceneManager::sceneChange() {
// Ensure that the same number of objects are registered now as when the scene started
if (_objectCount > 0) {
- assert(_objectCount == _saver->getObjectCount());
+ assert(_objectCount == g_saver->getObjectCount());
}
- _objectCount = _saver->getObjectCount();
- _globals->_sceneHandler._delayTicks = 2;
+ _objectCount = g_saver->getObjectCount();
+ g_globals->_sceneHandler->_delayTicks = 2;
// Instantiate and set the new scene
_scene = getNewScene();
- if (!_saver->getMacroRestoreFlag())
+ if (!g_saver->getMacroRestoreFlag())
_scene->postInit();
else
_scene->loadScene(activeScreenNumber);
}
Scene *SceneManager::getNewScene() {
- return _globals->_game->createScene(_nextSceneNumber);
+ return g_globals->_game->createScene(_nextSceneNumber);
}
void SceneManager::fadeInIfNecessary() {
if (_hasPalette) {
uint32 adjustData = 0;
for (int percent = 0; percent < 100; percent += 5) {
- if (_globals->_sceneManager._fadeMode == FADEMODE_IMMEDIATE)
+ if (g_globals->_sceneManager._fadeMode == FADEMODE_IMMEDIATE)
percent = 100;
- _globals->_scenePalette.fade((const byte *)&adjustData, false, percent);
+ g_globals->_scenePalette.fade((const byte *)&adjustData, false, percent);
g_system->updateScreen();
g_system->delayMillis(10);
}
- _globals->_scenePalette.refresh();
+ g_globals->_scenePalette.refresh();
_hasPalette = false;
}
}
void SceneManager::changeScene(int newSceneNumber) {
- warning("changeScene(%d)", newSceneNumber);
+ debug(1, "changeScene(%d)", newSceneNumber);
// Fade out the scene
ScenePalette scenePalette;
uint32 adjustData = 0;
- _globals->_scenePalette.clearListeners();
+ g_globals->_scenePalette.clearListeners();
scenePalette.getPalette();
for (int percent = 100; percent >= 0; percent -= 5) {
@@ -160,7 +157,7 @@ void SceneManager::changeScene(int newSceneNumber) {
// Stop any objects that were animating
SynchronizedList<SceneObject *>::iterator i;
- for (i = _globals->_sceneObjects->begin(); i != _globals->_sceneObjects->end(); ++i) {
+ for (i = g_globals->_sceneObjects->begin(); i != g_globals->_sceneObjects->end(); ++i) {
SceneObject *sceneObj = *i;
Common::Point pt(0, 0);
sceneObj->addMover(NULL, &pt);
@@ -171,37 +168,42 @@ void SceneManager::changeScene(int newSceneNumber) {
}
// Blank out the screen
- _globals->_screenSurface.fillRect(_globals->_screenSurface.getBounds(), 0);
+ g_globals->_screenSurface.fillRect(g_globals->_screenSurface.getBounds(), 0);
+
+ // If there are any fading sounds, wait until fading is complete
+ while (g_globals->_soundManager.isFading()) {
+ g_system->delayMillis(10);
+ }
// Set the new scene to be loaded
setNewScene(newSceneNumber);
}
void SceneManager::setup() {
- _saver->addLoadNotifier(SceneManager::loadNotifier);
+ g_saver->addLoadNotifier(SceneManager::loadNotifier);
setBackSurface();
}
void SceneManager::setBackSurface() {
- int size = _globals->_sceneManager._scene->_backgroundBounds.width() *
- _globals->_sceneManager._scene->_backgroundBounds.height();
+ int size = g_globals->_sceneManager._scene->_backgroundBounds.width() *
+ g_globals->_sceneManager._scene->_backgroundBounds.height();
if (size > 96000) {
- if (_globals->_sceneManager._scene->_backgroundBounds.width() <= SCREEN_WIDTH) {
+ if (g_globals->_sceneManager._scene->_backgroundBounds.width() <= SCREEN_WIDTH) {
// Standard size creation
- _globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT * 3 / 2);
- _globals->_sceneManager._scrollerRect = Rect(0, 30, SCREEN_WIDTH, SCREEN_HEIGHT - 30);
+ g_globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT * 3 / 2);
+ g_globals->_sceneManager._scrollerRect = Rect(0, 30, SCREEN_WIDTH, SCREEN_HEIGHT - 30);
} else {
// Wide screen needs extra space to allow for scrolling
- _globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH * 3 / 2, SCREEN_HEIGHT);
- _globals->_sceneManager._scrollerRect = Rect(80, 0, SCREEN_WIDTH - 80, SCREEN_HEIGHT);
+ g_globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH * 3 / 2, SCREEN_HEIGHT);
+ g_globals->_sceneManager._scrollerRect = Rect(80, 0, SCREEN_WIDTH - 80, SCREEN_HEIGHT);
}
} else {
- _globals->_sceneManager._scene->_backSurface.create(
- _globals->_sceneManager._scene->_backgroundBounds.width(),
- _globals->_sceneManager._scene->_backgroundBounds.height()
+ g_globals->_sceneManager._scene->_backSurface.create(
+ g_globals->_sceneManager._scene->_backgroundBounds.width(),
+ g_globals->_sceneManager._scene->_backgroundBounds.height()
);
- _globals->_sceneManager._scrollerRect = Rect(80, 20, SCREEN_WIDTH - 80, SCREEN_HEIGHT - 20);
+ g_globals->_sceneManager._scrollerRect = Rect(80, 20, SCREEN_WIDTH - 80, SCREEN_HEIGHT - 20);
}
}
@@ -210,9 +212,9 @@ void SceneManager::saveListener(int saveMode) {
void SceneManager::loadNotifier(bool postFlag) {
if (postFlag) {
- if (_globals->_sceneManager._scene->_activeScreenNumber != -1)
- _globals->_sceneManager._scene->loadSceneData(_globals->_sceneManager._scene->_activeScreenNumber);
- _globals->_sceneManager._hasPalette = true;
+ if (g_globals->_sceneManager._scene->_activeScreenNumber != -1)
+ g_globals->_sceneManager._scene->loadSceneData(g_globals->_sceneManager._scene->_activeScreenNumber);
+ g_globals->_sceneManager._hasPalette = true;
}
}
@@ -224,22 +226,29 @@ void SceneManager::setBgOffset(const Common::Point &pt, int loadCount) {
void SceneManager::listenerSynchronize(Serializer &s) {
s.validate("SceneManager");
- if (s.isLoading() && !_globals->_sceneManager._scene)
+ if (s.isLoading() && !g_globals->_sceneManager._scene)
// Loading a savegame straight from the launcher, so instantiate a blank placeholder scene
// in order for the savegame loading to work correctly
- _globals->_sceneManager._scene = new Scene();
+ g_globals->_sceneManager._scene = new Scene();
+
+ // Depreciated: the background scene objects used to be located here
+ uint32 unused = 0;
+ s.syncAsUint32LE(unused);
- _altSceneObjects.synchronize(s);
s.syncAsSint32LE(_sceneNumber);
- s.syncAsUint16LE(_globals->_sceneManager._scene->_activeScreenNumber);
+ s.syncAsUint16LE(g_globals->_sceneManager._scene->_activeScreenNumber);
if (s.isLoading()) {
changeScene(_sceneNumber);
- checkScene();
+
+ if (_nextSceneNumber != -1) {
+ sceneChange();
+ _nextSceneNumber = -1;
+ }
}
- _globals->_sceneManager._scrollerRect.synchronize(s);
- SYNC_POINTER(_globals->_scrollFollower);
+ g_globals->_sceneManager._scrollerRect.synchronize(s);
+ SYNC_POINTER(g_globals->_scrollFollower);
s.syncAsSint16LE(_loadMode);
}
@@ -248,6 +257,7 @@ void SceneManager::listenerSynchronize(Serializer &s) {
Scene::Scene() : _sceneBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT),
_backgroundBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) {
_sceneMode = 0;
+ _activeScreenNumber = 0;
_oldSceneBounds = Rect(4000, 4000, 4100, 4100);
Common::set_to(&_zoomPercents[0], &_zoomPercents[256], 0);
}
@@ -273,6 +283,9 @@ void Scene::synchronize(Serializer &s) {
s.syncAsUint16LE(_enabledSections[i]);
for (int i = 0; i < 256; ++i)
s.syncAsSint16LE(_zoomPercents[i]);
+
+ if (s.getVersion() >= 7)
+ _bgSceneObjects.synchronize(s);
}
void Scene::postInit(SceneObjectList *OwnerList) {
@@ -292,10 +305,10 @@ void Scene::dispatch() {
}
void Scene::loadScene(int sceneNum) {
- warning("loadScene(%d)", sceneNum);
+ debug(1, "loadScene(%d)", sceneNum);
_screenNumber = sceneNum;
- if (_globals->_scenePalette.loadPalette(sceneNum))
- _globals->_sceneManager._hasPalette = true;
+ if (g_globals->_scenePalette.loadPalette(sceneNum))
+ g_globals->_sceneManager._hasPalette = true;
loadSceneData(sceneNum);
}
@@ -303,20 +316,48 @@ void Scene::loadScene(int sceneNum) {
void Scene::loadSceneData(int sceneNum) {
_activeScreenNumber = sceneNum;
- // Get the basic scene size
- byte *data = _resourceManager->getResource(RES_BITMAP, sceneNum, 9999);
- _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2));
- _globals->_sceneManager._scene->_sceneBounds.contain(_backgroundBounds);
- DEALLOCATE(data);
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ // Most scenes in Ringworld 2 don't have a scene size resource, but rather just have
+ // a standard 320x200 size. Only read the scene size data for the specific few scenes
+ switch (sceneNum) {
+ case 700:
+ case 1020:
+ case 1100:
+ case 1700:
+ case 2600:
+ case 2950:
+ case 3100:
+ case 3101:
+ case 3275:
+ case 3600: {
+ // Get the basic scene size from the resource
+ byte *data = g_resourceManager->getResource(RES_BITMAP, sceneNum, 9999);
+ _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2));
+ DEALLOCATE(data);
+ break;
+ }
+ default:
+ // For all other scenes, use a standard screen size
+ _backgroundBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+ break;
+ }
+ } else {
+ // Get the basic scene size
+ byte *data = g_resourceManager->getResource(RES_BITMAP, sceneNum, 9999);
+ _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2));
+ DEALLOCATE(data);
+ }
+
+ g_globals->_sceneManager._scene->_sceneBounds.contain(_backgroundBounds);
// Set up a surface for storing the scene background
SceneManager::setBackSurface();
// Load the data lists for the scene
- _globals->_walkRegions.load(sceneNum);
+ g_globals->_walkRegions.load(sceneNum);
// Load the item regions of the scene
- _globals->_sceneRegions.load(sceneNum);
+ g_globals->_sceneRegions.load(sceneNum);
// Load the priority regions
_priorities.load(sceneNum);
@@ -324,13 +365,13 @@ void Scene::loadSceneData(int sceneNum) {
// Initialize the section enabled list
Common::set_to(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff);
- _globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160;
- _globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100;
- _globals->_paneRefreshFlag[0] = 1;
- _globals->_paneRefreshFlag[1] = 1;
- _globals->_sceneManager._loadMode = 1;
- _globals->_sceneManager._sceneLoadCount = 0;
- _globals->_sceneManager._sceneBgOffset = Common::Point(0, 0);
+ g_globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160;
+ g_globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100;
+ g_globals->_paneRefreshFlag[0] = 1;
+ g_globals->_paneRefreshFlag[1] = 1;
+ g_globals->_sceneManager._loadMode = 1;
+ g_globals->_sceneManager._sceneLoadCount = 0;
+ g_globals->_sceneManager._sceneBgOffset = Common::Point(0, 0);
// Load the background for the scene
loadBackground(0, 0);
@@ -342,35 +383,35 @@ void Scene::loadBackground(int xAmount, int yAmount) {
_sceneBounds.contain(_backgroundBounds);
_sceneBounds.left &= ~3;
_sceneBounds.right &= ~3;
- _globals->_sceneOffset.x &= ~3;
+ g_globals->_sceneOffset.x &= ~3;
if ((_sceneBounds.top != _oldSceneBounds.top) || (_sceneBounds.left != _oldSceneBounds.left)) {
- if (_globals->_sceneManager._loadMode == 0) {
- _globals->_paneRefreshFlag[0] = 2;
- _globals->_paneRefreshFlag[1] = 2;
- _globals->_sceneManager._loadMode = 2;
+ if (g_globals->_sceneManager._loadMode == 0) {
+ g_globals->_paneRefreshFlag[0] = 2;
+ g_globals->_paneRefreshFlag[1] = 2;
+ g_globals->_sceneManager._loadMode = 2;
}
_oldSceneBounds = _sceneBounds;
}
- _globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160;
- _globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100;
+ g_globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160;
+ g_globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100;
if ((_backgroundBounds.width() / 160) == 3)
- _globals->_sceneOffset.x = 0;
+ g_globals->_sceneOffset.x = 0;
if ((_backgroundBounds.height() / 100) == 3)
- _globals->_sceneOffset.y = 0;
+ g_globals->_sceneOffset.y = 0;
- if ((_globals->_sceneOffset.x != _globals->_prevSceneOffset.x) ||
- (_globals->_sceneOffset.y != _globals->_prevSceneOffset.y)) {
+ if ((g_globals->_sceneOffset.x != g_globals->_prevSceneOffset.x) ||
+ (g_globals->_sceneOffset.y != g_globals->_prevSceneOffset.y)) {
// Change has happend, so refresh background
- _globals->_prevSceneOffset = _globals->_sceneOffset;
+ g_globals->_prevSceneOffset = g_globals->_sceneOffset;
refreshBackground(xAmount, yAmount);
}
}
void Scene::refreshBackground(int xAmount, int yAmount) {
- if (_globals->_sceneManager._scene->_activeScreenNumber == -1)
+ if (g_globals->_sceneManager._scene->_activeScreenNumber == -1)
return;
// Set the quadrant ranges
@@ -415,6 +456,11 @@ void Scene::refreshBackground(int xAmount, int yAmount) {
(xSectionSrc + 1) * 160, (ySectionSrc + 1) * 100);
Rect destBounds(xSectionDest * 160, ySectionDest * 100,
(xSectionDest + 1) * 160, (ySectionDest + 1) * 100);
+ if (g_vm->getGameID() == GType_BlueForce) {
+ // For Blue Force, if the scene has an interface area, exclude it from the copy
+ srcBounds.bottom = MIN<int16>(srcBounds.bottom, BF_GLOBALS._interfaceY);
+ destBounds.bottom = MIN<int16>(destBounds.bottom, BF_GLOBALS._interfaceY);
+ }
_backSurface.copyFrom(_backSurface, srcBounds, destBounds);
}
@@ -427,28 +473,27 @@ void Scene::refreshBackground(int xAmount, int yAmount) {
}
if (changedFlag) {
- drawAltObjects();
+ drawBackgroundObjects();
}
}
-void Scene::drawAltObjects() {
+void Scene::drawBackgroundObjects() {
Common::Array<SceneObject *> objList;
// Initial loop to set the priority for entries in the list
- for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneManager._altSceneObjects.begin();
- i != _globals->_sceneManager._altSceneObjects.end(); ++i) {
+ for (SynchronizedList<SceneObject *>::iterator i = _bgSceneObjects.begin(); i != _bgSceneObjects.end(); ++i) {
SceneObject *obj = *i;
objList.push_back(obj);
// Handle updating object priority
if (!(obj->_flags & OBJFLAG_FIXED_PRIORITY)) {
obj->_priority = MIN((int)obj->_position.y - 1,
- (int)_globals->_sceneManager._scene->_backgroundBounds.bottom);
+ (int)g_globals->_sceneManager._scene->_backgroundBounds.bottom);
}
}
// Sort the list by priority
- _globals->_sceneManager._altSceneObjects.sortList(objList);
+ _bgSceneObjects.sortList(objList);
// Drawing loop
for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
@@ -494,6 +539,51 @@ void Scene::setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent
/*--------------------------------------------------------------------------*/
+void Game::restartGame() {
+ if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1)
+ g_globals->_game->restart();
+}
+
+void Game::saveGame() {
+ if (!g_vm->canSaveGameStateCurrently())
+ MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING);
+ else {
+ // Show the save dialog
+ handleSaveLoad(true, g_globals->_sceneHandler->_saveGameSlot, g_globals->_sceneHandler->_saveName);
+ }
+}
+
+void Game::restoreGame() {
+ if (!g_vm->canLoadGameStateCurrently())
+ MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING);
+ else {
+ // Show the load dialog
+ handleSaveLoad(false, g_globals->_sceneHandler->_loadGameSlot, g_globals->_sceneHandler->_saveName);
+ }
+}
+
+void Game::quitGame() {
+ if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1)
+ g_vm->quitGame();
+}
+
+void Game::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) {
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(g_vm->getGameId(), &plugin);
+ GUI::SaveLoadChooser *dialog;
+ if (saveFlag)
+ dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"));
+ else
+ dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"));
+
+ dialog->setSaveMode(saveFlag);
+
+ saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ saveName = dialog->getResultString();
+
+ delete dialog;
+}
+
void Game::execute() {
// Main game loop
bool activeFlag = false;
@@ -507,7 +597,7 @@ void Game::execute() {
activeFlag = true;
}
}
- } while (activeFlag && !_vm->getEventManager()->shouldQuit());
+ } while (activeFlag && !g_vm->shouldQuit());
}
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h
index 5845efaec9..2daa71ba98 100644
--- a/engines/tsage/scenes.h
+++ b/engines/tsage/scenes.h
@@ -29,11 +29,11 @@
#include "tsage/core.h"
#include "tsage/saveload.h"
-namespace tSage {
+namespace TsAGE {
class Scene : public StripCallback {
private:
- void drawAltObjects();
+ void drawBackgroundObjects();
public:
int _field12;
int _screenNumber;
@@ -48,6 +48,7 @@ public:
int _enabledSections[256];
int _zoomPercents[256];
ScenePriorities _priorities;
+ SceneObjectList _bgSceneObjects;
int _fieldA;
int _fieldE;
@@ -62,17 +63,18 @@ public:
virtual void process(Event &event);
virtual void dispatch();
virtual void loadScene(int sceneNum);
+ virtual void refreshBackground(int xAmount, int yAmount);
void setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent);
void loadBackground(int xAmount, int yAmount);
- void refreshBackground(int xAmount, int yAmount);
+
void loadSceneData(int sceneNum);
};
class SceneManager : public GameHandler, public SaveListener {
private:
- void disposeRegions() {
- // No need to do anything, since regions will be freed automatically when the scene is
+ void disposeRegions() {
+ // No need to do anything, since regions will be freed automatically when the scene is
}
Scene *getNewScene();
public:
@@ -86,7 +88,6 @@ public:
Common::Point _sceneBgOffset;
int _sceneLoadCount;
Rect _scrollerRect;
- SceneObjectList _altSceneObjects;
int _objectCount;
public:
SceneManager();
@@ -115,7 +116,7 @@ protected:
SynchronizedList<GameHandler *> _handlers;
static bool notLockedFn(GameHandler *g);
- virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) {}
+ virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName);
public:
virtual ~Game() {}
@@ -125,15 +126,18 @@ public:
void execute();
virtual void start() = 0;
virtual void restart() {}
- virtual void restartGame() {}
- virtual void saveGame() {}
- virtual void restoreGame() {}
- virtual void quitGame() {}
+ virtual void restartGame();
+ virtual void saveGame();
+ virtual void restoreGame();
+ virtual void quitGame();
virtual void endGame(int resNum, int lineNum) {}
virtual Scene *createScene(int sceneNumber) = 0;
virtual void processEvent(Event &event) {}
+ virtual void rightClick() {}
+ virtual bool canSaveGameStateCurrently() = 0;
+ virtual bool canLoadGameStateCurrently() = 0;
};
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp
index dc7b6599ed..b61e63236b 100644
--- a/engines/tsage/sound.cpp
+++ b/engines/tsage/sound.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "audio/decoders/raw.h"
#include "common/config-manager.h"
#include "tsage/core.h"
#include "tsage/globals.h"
@@ -27,7 +28,7 @@
#include "tsage/graphics.h"
#include "tsage/tsage.h"
-namespace tSage {
+namespace TsAGE {
static SoundManager *_soundManager = NULL;
@@ -44,7 +45,6 @@ SoundManager::SoundManager() {
_groupsAvail = 0;
_newVolume = _masterVol = 127;
- _suspendedCount = 0;
_driversDetected = false;
_needToRethink = false;
@@ -53,6 +53,9 @@ SoundManager::SoundManager() {
SoundManager::~SoundManager() {
if (__sndmgrReady) {
+ Common::StackLock slock(_serverDisabledMutex);
+ g_vm->_mixer->stopAll();
+
for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ) {
Sound *s = *i;
++i;
@@ -64,6 +67,16 @@ SoundManager::~SoundManager() {
delete driver;
}
_sfTerminate();
+
+// g_system->getTimerManager()->removeTimerProc(_sfUpdateCallback);
+ }
+
+ // Free any allocated voice type structures
+ for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) {
+ if (sfManager()._voiceTypeStructPtrs[idx]) {
+ delete sfManager()._voiceTypeStructPtrs[idx];
+ sfManager()._voiceTypeStructPtrs[idx] = NULL;
+ }
}
_soundManager = NULL;
@@ -71,9 +84,16 @@ SoundManager::~SoundManager() {
void SoundManager::postInit() {
if (!__sndmgrReady) {
- _saver->addSaveNotifier(&SoundManager::saveNotifier);
- _saver->addLoadNotifier(&SoundManager::loadNotifier);
- _saver->addListener(this);
+ g_saver->addSaveNotifier(&SoundManager::saveNotifier);
+ g_saver->addLoadNotifier(&SoundManager::loadNotifier);
+ g_saver->addListener(this);
+
+
+// I originally separated the sound manager update method into a separate thread, since
+// it handles updates for both music and Fx. However, since Adlib updates also get done in a
+// thread, and doesn't get too far ahead, I've left it to the AdlibSoundDriver class to
+// call the update method, rather than having it be called separately
+// g_system->getTimerManager()->installTimerProc(_sfUpdateCallback, 1000000 / SOUND_FREQUENCY, NULL, "tsageSoundUpdate");
__sndmgrReady = true;
}
}
@@ -119,7 +139,10 @@ Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) {
assert(__sndmgrReady);
_availableDrivers.clear();
- // Build up a list of available drivers. Currently we only implement an Adlib driver
+ // Build up a list of available drivers. Currently we only implement an Adlib music
+ // and SoundBlaster FX driver
+
+ // Adlib driver
SoundDriverEntry sd;
sd.driverNum = ADLIB_DRIVER_NUM;
sd.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED;
@@ -129,12 +152,23 @@ Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) {
sd.longDescription = "3812fm";
_availableDrivers.push_back(sd);
+ // SoundBlaster entry
+ SoundDriverEntry sdFx;
+ sdFx.driverNum = SBLASTER_DRIVER_NUM;
+ sdFx.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED;
+ sdFx.field2 = 0;
+ sdFx.field6 = 15000;
+ sdFx.shortDescription = "SndBlast";
+ sdFx.longDescription = "SoundBlaster";
+ _availableDrivers.push_back(sdFx);
+
_driversDetected = true;
return _availableDrivers;
}
void SoundManager::installConfigDrivers() {
installDriver(ADLIB_DRIVER_NUM);
+ installDriver(SBLASTER_DRIVER_NUM);
}
Common::List<SoundDriverEntry> &SoundManager::getDriverList(bool detectFlag) {
@@ -177,7 +211,7 @@ void SoundManager::installDriver(int driverNum) {
case ROLAND_DRIVER_NUM:
case ADLIB_DRIVER_NUM: {
// Handle loading bank infomation
- byte *bankData = _resourceManager->getResource(RES_BANK, driverNum, 0, true);
+ byte *bankData = g_resourceManager->getResource(RES_BANK, driverNum, 0, true);
if (bankData) {
// Install the patch bank data
_sfInstallPatchBank(driver, bankData);
@@ -199,8 +233,14 @@ void SoundManager::installDriver(int driverNum) {
* Instantiate a driver class for the specified driver number
*/
SoundDriver *SoundManager::instantiateDriver(int driverNum) {
- assert(driverNum == ADLIB_DRIVER_NUM);
- return new AdlibSoundDriver();
+ switch (driverNum) {
+ case ADLIB_DRIVER_NUM:
+ return new AdlibSoundDriver();
+ case SBLASTER_DRIVER_NUM:
+ return new SoundBlasterDriver();
+ default:
+ error("Unknown sound driver - %d", driverNum);
+ }
}
/**
@@ -328,9 +368,6 @@ void SoundManager::rethinkVoiceTypes() {
}
void SoundManager::_sfSoundServer() {
- Common::StackLock slock1(sfManager()._serverDisabledMutex);
- Common::StackLock slock2(sfManager()._serverSuspendedMutex);
-
if (sfManager()._needToRethink) {
_sfRethinkVoiceTypes();
sfManager()._needToRethink = false;
@@ -342,13 +379,25 @@ void SoundManager::_sfSoundServer() {
if (sfManager()._newVolume != sfManager()._masterVol)
_sfSetMasterVol(sfManager()._newVolume);
+ // If a time index has been set for any sound, fast forward to it
+ SynchronizedList<Sound *>::iterator i;
+ for (i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) {
+ Sound *s = *i;
+ if (s->_newTimeIndex != 0) {
+ s->mute(true);
+ s->_soSetTimeIndex(s->_newTimeIndex);
+ s->mute(false);
+ s->_newTimeIndex = 0;
+ }
+ }
+
// Handle any fading if necessary
_sfProcessFading();
// Poll all sound drivers in case they need it
- for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin();
- i != sfManager()._installedDrivers.end(); ++i) {
- (*i)->poll();
+ for (Common::List<SoundDriver *>::iterator j = sfManager()._installedDrivers.begin();
+ j != sfManager()._installedDrivers.end(); ++j) {
+ (*j)->poll();
}
}
@@ -410,6 +459,22 @@ void SoundManager::_sfProcessFading() {
}
}
+bool SoundManager::isFading() {
+ Common::StackLock slock(sfManager()._serverSuspendedMutex);
+
+ // Loop through any active sounds to see if any are being actively faded
+ Common::List<Sound *>::iterator i = sfManager()._playList.begin();
+ while (i != sfManager()._playList.end()) {
+ Sound *s = *i;
+ ++i;
+
+ if (s->_fadeDest != -1)
+ return true;
+ }
+
+ return false;
+}
+
void SoundManager::_sfUpdateVoiceStructs() {
for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) {
VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex];
@@ -474,7 +539,7 @@ void SoundManager::saveNotifier(bool postFlag) {
}
void SoundManager::saveNotifierProc(bool postFlag) {
- warning("TODO: SoundManager::saveNotifierProc");
+ // Nothing needs to be done when saving the game
}
void SoundManager::loadNotifier(bool postFlag) {
@@ -482,12 +547,37 @@ void SoundManager::loadNotifier(bool postFlag) {
}
void SoundManager::loadNotifierProc(bool postFlag) {
- warning("TODO: SoundManager::loadNotifierProc");
+ if (!postFlag) {
+ // Stop any currently playing sounds
+ if (__sndmgrReady) {
+ Common::StackLock slock(_serverDisabledMutex);
+
+ for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ) {
+ Sound *s = *i;
+ ++i;
+ s->stop();
+ }
+ }
+ } else {
+ // Savegame is now loaded, so iterate over the sound list to prime any sounds as necessary
+ for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
+ Sound *s = *i;
+ s->orientAfterRestore();
+ }
+ }
}
void SoundManager::listenerSynchronize(Serializer &s) {
s.validate("SoundManager");
- warning("TODO: SoundManager listenerSynchronise");
+ assert(__sndmgrReady && _driversDetected);
+
+ if (s.getVersion() < 6)
+ return;
+
+ Common::StackLock slock(_serverDisabledMutex);
+ _playList.synchronize(s);
+
+ _soundList.synchronize(s);
}
/*--------------------------------------------------------------------------*/
@@ -626,11 +716,11 @@ void SoundManager::_sfRethinkSoundDrivers() {
byteVal = *groupData;
groupData += 2;
- for (idx = 0; idx < byteVal; ++idx) {
+ for (int entryIndez = 0; entryIndez < byteVal; ++entryIndez) {
VoiceStructEntry ve;
memset(&ve, 0, sizeof(VoiceStructEntry));
- ve._voiceNum = idx;
+ ve._voiceNum = entryIndez;
ve._driver = driver;
ve._type1._field4 = -1;
ve._type1._field5 = 0;
@@ -1128,8 +1218,7 @@ void SoundManager::_sfRethinkVoiceTypes() {
if (!vse2._sound && (vse2._sound3 == sound) && (vse2._channelNum3 == channelNum)) {
vse2._sound = sound;
vse2._channelNum = channelNum;
- vse._channelNum = vse2._channelNum2;
- vse._priority = vse2._priority2;
+ vse2._priority = vse._priority2;
vse._sound2 = NULL;
break;
}
@@ -1150,7 +1239,7 @@ void SoundManager::_sfRethinkVoiceTypes() {
vse2._sound = vse._sound2;
vse2._channelNum = vse._channelNum2;
vse2._priority = vse._priority2;
- vse._field4 = -1;
+ vse2._field4 = -1;
vse2._field5 = 0;
vse2._field6 = 0;
@@ -1175,7 +1264,7 @@ void SoundManager::_sfRethinkVoiceTypes() {
SoundDriver *driver = vs->_entries[idx]._driver;
assert(driver);
- driver->updateVoice(voiceIndex);
+ driver->updateVoice(vs->_entries[idx]._voiceNum);
}
}
}
@@ -1188,7 +1277,7 @@ void SoundManager::_sfUpdateVolume(Sound *sound) {
}
void SoundManager::_sfDereferenceAll() {
- // Orignal used handles for both the driver list and voiceStructPtrs list. This method then refreshed
+ // Orignal used handles for both the driver list and voiceTypeStructPtrs list. This method then refreshed
// pointer lists based on the handles. Since in ScummVM we're just using pointers directly, this
// method doesn't need any implementation
}
@@ -1273,11 +1362,10 @@ void SoundManager::_sfExtractGroupMask() {
bool SoundManager::_sfInstallDriver(SoundDriver *driver) {
if (!driver->open())
return false;
-
- driver->setUpdateCallback(_sfUpdateCallback, (void *)&sfManager());
+
sfManager()._installedDrivers.push_back(driver);
driver->_groupOffset = driver->getGroupData();
- driver->_groupMask = READ_LE_UINT32(driver->_groupOffset);
+ driver->_groupMask = driver->_groupOffset->groupMask;
_sfExtractGroupMask();
_sfRethinkSoundDrivers();
@@ -1295,7 +1383,7 @@ void SoundManager::_sfUnInstallDriver(SoundDriver *driver) {
}
void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) {
- driver->installPatch(bankData, _vm->_memoryManager.getSize(bankData));
+ driver->installPatch(bankData, g_vm->_memoryManager.getSize(bankData));
}
/**
@@ -1379,6 +1467,7 @@ Sound::Sound() {
_fadeCounter = 0;
_stopAfterFadeFlag = false;
_timer = 0;
+ _newTimeIndex = 0;
_loopTimer = 0;
_trackInfo._numTracks = 0;
_primed = false;
@@ -1411,13 +1500,43 @@ Sound::~Sound() {
stop();
}
+void Sound::synchronize(Serializer &s) {
+ if (s.getVersion() < 6)
+ return;
+
+ assert(!_remoteReceiver);
+
+ s.syncAsSint16LE(_soundResID);
+ s.syncAsByte(_primed);
+ s.syncAsByte(_stoppedAsynchronously);
+ s.syncAsSint16LE(_group);
+ s.syncAsSint16LE(_sndResPriority);
+ s.syncAsSint16LE(_fixedPriority);
+ s.syncAsSint16LE(_sndResLoop);
+ s.syncAsSint16LE(_fixedLoop);
+ s.syncAsSint16LE(_priority);
+ s.syncAsSint16LE(_volume);
+ s.syncAsSint16LE(_loop);
+ s.syncAsSint16LE(_pausedCount);
+ s.syncAsSint16LE(_mutedCount);
+ s.syncAsSint16LE(_hold);
+ s.syncAsSint16LE(_cueValue);
+ s.syncAsSint16LE(_fadeDest);
+ s.syncAsSint16LE(_fadeSteps);
+ s.syncAsUint32LE(_fadeTicks);
+ s.syncAsUint32LE(_fadeCounter);
+ s.syncAsByte(_stopAfterFadeFlag);
+ s.syncAsUint32LE(_timer);
+ s.syncAsSint16LE(_loopTimer);
+}
+
void Sound::play(int soundNum) {
prime(soundNum);
_soundManager->addToPlayList(this);
}
void Sound::stop() {
- _globals->_soundManager.removeFromPlayList(this);
+ g_globals->_soundManager.removeFromPlayList(this);
_unPrime();
}
@@ -1436,11 +1555,12 @@ void Sound::_prime(int soundResID, bool dontQueue) {
if (_primed)
unPrime();
+ _soundResID = soundResID;
if (_soundResID != -1) {
// Sound number specified
_isEmpty = false;
_remoteReceiver = NULL;
- byte *soundData = _resourceManager->getResource(RES_SOUND, soundResID, 0);
+ byte *soundData = g_resourceManager->getResource(RES_SOUND, soundResID, 0);
_soundManager->checkResVersion(soundData);
_group = _soundManager->determineGroup(soundData);
_sndResPriority = _soundManager->extractPriority(soundData);
@@ -1448,7 +1568,7 @@ void Sound::_prime(int soundResID, bool dontQueue) {
_soundManager->extractTrackInfo(&_trackInfo, soundData, _group);
for (int idx = 0; idx < _trackInfo._numTracks; ++idx) {
- _channelData[idx] = _resourceManager->getResource(RES_SOUND, soundResID, _trackInfo._chunks[idx]);
+ _channelData[idx] = g_resourceManager->getResource(RES_SOUND, soundResID, _trackInfo._chunks[idx]);
}
DEALLOCATE(soundData);
@@ -1501,12 +1621,13 @@ void Sound::orientAfterDriverChange() {
_trackInfo._numTracks = 0;
_primed = false;
_prime(_soundResID, true);
+
setTimeIndex(timeIndex);
}
}
void Sound::orientAfterRestore() {
- if (_isEmpty) {
+ if (!_isEmpty) {
int timeIndex = getTimeIndex();
_primed = false;
_prime(_soundResID, true);
@@ -1546,7 +1667,7 @@ bool Sound::isMuted() const {
}
void Sound::pause(bool flag) {
- Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex);
+ Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex);
if (flag)
++_pausedCount;
@@ -1557,7 +1678,7 @@ void Sound::pause(bool flag) {
}
void Sound::mute(bool flag) {
- Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex);
+ Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex);
if (flag)
++_mutedCount;
@@ -1568,7 +1689,7 @@ void Sound::mute(bool flag) {
}
void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag) {
- Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex);
+ Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex);
if (fadeDest > 127)
fadeDest = 127;
@@ -1585,11 +1706,8 @@ void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeF
}
void Sound::setTimeIndex(uint32 timeIndex) {
- if (_primed) {
- mute(true);
- _soSetTimeIndex(timeIndex);
- mute(false);
- }
+ if (_primed)
+ _newTimeIndex = timeIndex;
}
uint32 Sound::getTimeIndex() const {
@@ -1665,12 +1783,13 @@ void Sound::_soPrimeSound(bool dontQueue) {
}
_timer = 0;
+ _newTimeIndex = 0;
_loopTimer = 0;
_soPrimeChannelData();
}
void Sound::_soSetTimeIndex(uint timeIndex) {
- Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex);
+ Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex);
if (timeIndex != _timer) {
_soundManager->_soTimeIndexFlag = true;
@@ -1685,6 +1804,8 @@ void Sound::_soSetTimeIndex(uint timeIndex) {
_soundManager->_needToRethink = true;
break;
}
+
+ --timeIndex;
}
_soundManager->_soTimeIndexFlag = false;
@@ -1868,11 +1989,11 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) {
b &= 0x7f;
if (channelNum != -1) {
- if (voiceType == VOICETYPE_1) {
+ if (voiceType != VOICETYPE_0) {
if (chFlags & 0x10)
- _soProc42(vtStruct, channelNum, chVoiceType, v);
+ _soPlaySound2(vtStruct, channelData, channelNum, chVoiceType, v);
else
- _soProc32(vtStruct, channelNum, chVoiceType, v, b);
+ _soPlaySound(vtStruct, channelData, channelNum, chVoiceType, v, b);
} else if (voiceNum != -1) {
assert(driver);
driver->proc20(voiceNum, chVoiceType);
@@ -2040,7 +2161,7 @@ void Sound::_soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceTyp
}
}
-void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1) {
+void Sound::_soPlaySound(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0, int v1) {
int entryIndex = _soFindSound(vtStruct, channelNum);
if (entryIndex != -1) {
SoundDriver *driver = vtStruct->_entries[entryIndex]._driver;
@@ -2050,11 +2171,11 @@ void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice
vtStruct->_entries[entryIndex]._type1._field4 = v0;
vtStruct->_entries[entryIndex]._type1._field5 = 0;
- driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum], v0, v1);
+ driver->playSound(channelData, 0, _chProgram[channelNum], vtStruct->_entries[entryIndex]._voiceNum, v0, v1);
}
}
-void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0) {
+void Sound::_soPlaySound2(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0) {
for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) {
const byte *instrument = _channelData[trackCtr];
if ((*(instrument + 13) == v0) && (*instrument == 1)) {
@@ -2063,13 +2184,15 @@ void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice
if (entryIndex != -1) {
SoundDriver *driver = vtStruct->_entries[entryIndex]._driver;
assert(driver);
+ byte *trackData = _channelData[trackCtr];
vtStruct->_entries[entryIndex]._type1._field6 = 0;
vtStruct->_entries[entryIndex]._type1._field4 = v0;
vtStruct->_entries[entryIndex]._type1._field5 = 0;
- driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, v0, 0x7F);
- driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0);
+ int v1, v2;
+ driver->playSound(trackData, 14, -1, vtStruct->_entries[entryIndex]._voiceNum, v0, 0x7F);
+ driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0, &v1, &v2);
}
break;
}
@@ -2196,11 +2319,34 @@ void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) {
vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1);
vtStruct->_entries[entryIndex]._type1._field5 = 0;
- driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f);
+ int v1, v2;
+ driver->playSound(channelData, 14, -1, vtStruct->_entries[entryIndex]._voiceNum, *(channelData + 1), 0x7f);
+ driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, *(channelData + 1), _loop ? 1 : 0,
+ &v1, &v2);
+ _trkState[trackIndex] = 2;
}
} else {
+ for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) {
+ VoiceStructEntry &vte = vtStruct->_entries[entryIndex];
+ VoiceStructEntryType1 &vse = vte._type1;
+ if ((vse._sound == this) && (vse._channelNum == channel) && (vse._field4 == *(channelData + 1))) {
+ SoundDriver *driver = vte._driver;
+
+ int isEnded, resetTimer;
+ driver->proc42(vte._voiceNum, vtStruct->_total, _loop ? 1 : 0, &isEnded, &resetTimer);
+ if (isEnded) {
+ _trkState[trackIndex] = 0;
+ } else if (resetTimer) {
+ _timer = 0;
+ }
+ return;
+ }
+ }
+ _trkState[trackIndex] = 0;
}
+ } else {
+ _trkState[trackIndex] = 0;
}
}
}
@@ -2246,13 +2392,13 @@ int Sound::_soFindSound(VoiceTypeStruct *vtStruct, int channelNum) {
ASound::ASound(): EventHandler() {
_action = NULL;
_cueValue = -1;
- if (_globals)
- _globals->_sounds.push_back(this);
+ if (g_globals)
+ g_globals->_sounds.push_back(this);
}
ASound::~ASound() {
- if (_globals)
- _globals->_sounds.remove(this);
+ if (g_globals)
+ g_globals->_sounds.remove(this);
}
void ASound::synchronize(Serializer &s) {
@@ -2286,7 +2432,7 @@ void ASound::dispatch() {
}
}
-void ASound::play(int soundNum, Action *action, int volume) {
+void ASound::play(int soundNum, EventHandler *action, int volume) {
_action = action;
_cueValue = 0;
@@ -2310,13 +2456,47 @@ void ASound::unPrime() {
_action = NULL;
}
-void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action) {
+void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, EventHandler *action) {
if (action)
_action = action;
_sound.fade(fadeDest, fadeSteps, fadeTicks, stopAfterFadeFlag);
}
+void ASound::fadeSound(int soundNum) {
+ play(soundNum, NULL, 0);
+ fade(127, 5, 1, false, NULL);
+}
+
+/*--------------------------------------------------------------------------*/
+
+ASoundExt::ASoundExt(): ASound() {
+ _soundNum = 0;
+}
+
+void ASoundExt::synchronize(Serializer &s) {
+ ASound::synchronize(s);
+ s.syncAsSint16LE(_soundNum);
+}
+
+void ASoundExt::signal() {
+ if (_soundNum != 0) {
+ fadeSound(_soundNum);
+ }
+}
+
+void ASoundExt::fadeOut2(EventHandler *action) {
+ fade(0, 10, 10, true, action);
+}
+
+void ASoundExt::changeSound(int soundNum) {
+ if (isPlaying()) {
+ _soundNum = soundNum;
+ fadeOut2(this);
+ } else {
+ fadeSound(soundNum);
+ }
+}
/*--------------------------------------------------------------------------*/
@@ -2355,8 +2535,6 @@ const int v440D4[48] = {
};
AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
- _upCb = NULL;
- _upRef = NULL;
_minVersion = 0x102;
_maxVersion = 0x10A;
_masterVolume = 0;
@@ -2366,9 +2544,17 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
_groupData.v2 = 0;
_groupData.pData = &adlib_group_data[0];
- _mixer = _vm->_mixer;
+ _mixer = g_vm->_mixer;
_sampleRate = _mixer->getOutputRate();
- _opl = makeAdLibOPL(_sampleRate);
+ _opl = OPL::Config::create();
+ assert(_opl);
+ _opl->init(_sampleRate);
+
+ _samplesTillCallback = 0;
+ _samplesTillCallbackRemainder = 0;
+ _samplesPerCallback = getRate() / CALLBACKS_PER_SECOND;
+ _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND;
+
_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false);
@@ -2387,7 +2573,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
AdlibSoundDriver::~AdlibSoundDriver() {
DEALLOCATE(_patchData);
_mixer->stopHandle(_soundHandle);
- OPLDestroy(_opl);
+ delete _opl;
}
bool AdlibSoundDriver::open() {
@@ -2413,10 +2599,7 @@ void AdlibSoundDriver::close() {
bool AdlibSoundDriver::reset() {
write(1, 0x20);
- write(4, 0x80);
-
- write(2, 1);
- write(4, 1);
+ write(1, 0x20);
return true;
}
@@ -2441,7 +2624,7 @@ int AdlibSoundDriver::setMasterVolume(int volume) {
return oldVolume;
}
-void AdlibSoundDriver::proc32(int channel, int program, int v0, int v1) {
+void AdlibSoundDriver::playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1) {
if (program == -1)
return;
@@ -2500,7 +2683,16 @@ void AdlibSoundDriver::setPitch(int channel, int pitchBlend) {
void AdlibSoundDriver::write(byte reg, byte value) {
_portContents[reg] = value;
- OPLWriteReg(_opl, reg, value);
+ _queue.push(RegisterValue(reg, value));
+}
+
+void AdlibSoundDriver::flush() {
+ Common::StackLock slock(SoundManager::sfManager()._serverDisabledMutex);
+
+ while (!_queue.empty()) {
+ RegisterValue v = _queue.pop();
+ _opl->writeReg(v._regNum, v._value);
+ }
}
void AdlibSoundDriver::updateChannelVolume(int channelNum) {
@@ -2624,33 +2816,138 @@ void AdlibSoundDriver::setFrequency(int channel) {
}
int AdlibSoundDriver::readBuffer(int16 *buffer, const int numSamples) {
- update(buffer, numSamples);
+ Common::StackLock slock1(SoundManager::sfManager()._serverDisabledMutex);
+ Common::StackLock slock2(SoundManager::sfManager()._serverSuspendedMutex);
+
+ int32 samplesLeft = numSamples;
+ memset(buffer, 0, sizeof(int16) * numSamples);
+ while (samplesLeft) {
+ if (!_samplesTillCallback) {
+ SoundManager::_sfUpdateCallback(NULL);
+ flush();
+
+ _samplesTillCallback = _samplesPerCallback;
+ _samplesTillCallbackRemainder += _samplesPerCallbackRemainder;
+ if (_samplesTillCallbackRemainder >= CALLBACKS_PER_SECOND) {
+ _samplesTillCallback++;
+ _samplesTillCallbackRemainder -= CALLBACKS_PER_SECOND;
+ }
+ }
+
+ int32 render = MIN<int>(samplesLeft, _samplesTillCallback);
+ samplesLeft -= render;
+ _samplesTillCallback -= render;
+
+ _opl->readBuffer(buffer, render);
+ buffer += render;
+ }
return numSamples;
}
-void AdlibSoundDriver::update(int16 *buf, int len) {
- static int samplesLeft = 0;
- while (len != 0) {
- int count = samplesLeft;
- if (count > len) {
- count = len;
- }
- samplesLeft -= count;
- len -= count;
- YM3812UpdateOne(_opl, buf, count);
- if (samplesLeft == 0) {
- if (_upCb) {
- (*_upCb)(_upRef);
- }
- samplesLeft = _sampleRate / 50;
- }
- buf += count;
+/*--------------------------------------------------------------------------*/
+
+
+SoundBlasterDriver::SoundBlasterDriver(): SoundDriver() {
+ _minVersion = 0x102;
+ _maxVersion = 0x10A;
+ _masterVolume = 0;
+
+ _groupData.groupMask = 1;
+ _groupData.v1 = 0x3E;
+ _groupData.v2 = 0;
+ static byte const group_data[] = { 3, 1, 1, 0, 0xff };
+ _groupData.pData = group_data;
+
+ _mixer = g_vm->_mixer;
+ _sampleRate = _mixer->getOutputRate();
+ _audioStream = NULL;
+ _channelData = NULL;
+}
+
+SoundBlasterDriver::~SoundBlasterDriver() {
+ _mixer->stopHandle(_soundHandle);
+}
+
+bool SoundBlasterDriver::open() {
+ return true;
+}
+
+void SoundBlasterDriver::close() {
+}
+
+bool SoundBlasterDriver::reset() {
+ return true;
+}
+
+const GroupData *SoundBlasterDriver::getGroupData() {
+ return &_groupData;
+}
+
+int SoundBlasterDriver::setMasterVolume(int volume) {
+ int oldVolume = _masterVolume;
+ _masterVolume = volume;
+
+ return oldVolume;
+}
+
+void SoundBlasterDriver::playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1) {
+ if (program != -1)
+ return;
+
+ assert(channel == 0);
+
+ // If sound data has been previously set, then release it
+ if (_channelData)
+ updateVoice(channel);
+
+ // Set the new channel data
+ _channelData = channelData + dataOffset;
+
+ // Make a copy of the buffer
+ int dataSize = g_vm->_memoryManager.getSize(channelData);
+ byte *soundData = (byte *)malloc(dataSize - dataOffset);
+ Common::copy(_channelData, _channelData + (dataSize - dataOffset), soundData);
+
+ _audioStream = Audio::makeQueuingAudioStream(11025, false);
+ _audioStream->queueBuffer(soundData, dataSize - dataOffset, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+
+ // Start the new sound
+ if (!_mixer->isSoundHandleActive(_soundHandle))
+ _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, _audioStream);
+}
+
+void SoundBlasterDriver::updateVoice(int channel) {
+ // Stop the playing voice
+ if (_mixer->isSoundHandleActive(_soundHandle))
+ _mixer->stopHandle(_soundHandle);
+
+ _audioStream = NULL;
+ _channelData = NULL;
+}
+
+void SoundBlasterDriver::proc38(int channel, int cmd, int value) {
+ if (cmd == 7) {
+ // Set channel volume
+ _channelVolume = value;
+ _mixer->setChannelVolume(_soundHandle, (byte)MIN(255, value * 2));
}
}
-void AdlibSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) {
- _upCb = upCb;
- _upRef = ref;
+void SoundBlasterDriver::proc42(int channel, int cmd, int value, int *v1, int *v2) {
+ // TODO: v2 is used for flagging a reset of the timer. I'm not sure if it's needed
+ *v1 = 0;
+ *v2 = 0;
+
+ // Note: Checking whether a playing Fx sound had finished was originally done in another
+ // method in the sample playing code. But since we're using the ScummVM audio soundsystem,
+ // it's easier simply to do the check right here
+ if (_audioStream && (_audioStream->numQueuedStreams() == 0)) {
+ updateVoice(channel);
+ }
+
+ if (!_channelData)
+ // Flag that sound isn't playing
+ *v1 = 1;
}
-} // End of namespace tSage
+} // End of namespace TsAGE
diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h
index 9a8cfb3cfc..2c5d2ac951 100644
--- a/engines/tsage/sound.h
+++ b/engines/tsage/sound.h
@@ -25,6 +25,7 @@
#include "common/scummsys.h"
#include "common/mutex.h"
+#include "common/queue.h"
#include "audio/audiostream.h"
#include "audio/fmopl.h"
#include "audio/mixer.h"
@@ -32,13 +33,15 @@
#include "tsage/saveload.h"
#include "tsage/core.h"
-namespace tSage {
+namespace TsAGE {
class Sound;
#define SOUND_ARR_SIZE 16
#define ROLAND_DRIVER_NUM 2
#define ADLIB_DRIVER_NUM 3
+#define SBLASTER_DRIVER_NUM 4
+#define CALLBACKS_PER_SECOND 60
struct trackInfoStruct {
int _numTracks;
@@ -65,6 +68,15 @@ struct GroupData {
const byte *pData;
};
+struct RegisterValue {
+ uint8 _regNum;
+ uint8 _value;
+
+ RegisterValue(int regNum, int value) {
+ _regNum = regNum; _value = value;
+ }
+};
+
class SoundDriver {
public:
Common::String _shortDescription, _longDescription;
@@ -73,10 +85,6 @@ public:
uint32 _groupMask;
const GroupData *_groupOffset;
int _driverResID;
-
- typedef void (*UpdateCallback)(void *);
- UpdateCallback _upCb;
- void *_upRef;
public:
SoundDriver();
virtual ~SoundDriver() {};
@@ -100,14 +108,12 @@ public:
virtual void setProgram(int channel, int program) {} // Method #13
virtual void setVolume1(int channel, int v2, int v3, int volume) {}
virtual void setPitchBlend(int channel, int pitchBlend) {} // Method #15
- virtual void proc32(int channel, int program, int v0, int v1) {}// Method #16
+ virtual void playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1) {}// Method #16
virtual void updateVoice(int channel) {} // Method #17
virtual void proc36() {} // Method #18
virtual void proc38(int channel, int cmd, int value) {} // Method #19
virtual void setPitch(int channel, int pitchBlend) {} // Method #20
- virtual void proc42(int channel, int v0, int v1) {} // Method #21
-
- virtual void setUpdateCallback(UpdateCallback upCb, void *ref) {}
+ virtual void proc42(int channel, int cmd, int value, int *v1, int *v2) {} // Method #21
};
struct VoiceStructEntryType0 {
@@ -123,7 +129,6 @@ struct VoiceStructEntryType0 {
int _channelNum3;
int _priority3;
int _field1A;
- int _field1B;
};
struct VoiceStructEntryType1 {
@@ -166,7 +171,7 @@ private:
public:
bool __sndmgrReady;
int _ourSndResVersion, _ourDrvResVersion;
- Common::List<Sound *> _playList;
+ SynchronizedList<Sound *> _playList;
Common::List<SoundDriver *> _installedDrivers;
VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE];
uint32 _groupsAvail;
@@ -174,9 +179,8 @@ public:
int _newVolume;
Common::Mutex _serverDisabledMutex;
Common::Mutex _serverSuspendedMutex;
- int _suspendedCount;
bool _driversDetected;
- Common::List<Sound *> _soundList;
+ SynchronizedList<Sound *> _soundList;
Common::List<SoundDriverEntry> _availableDrivers;
bool _needToRethink;
// Misc flags
@@ -221,6 +225,7 @@ public:
int getMasterVol() const;
void loadSound(int soundNum, bool showErrors);
void unloadSound(int soundNum);
+ bool isFading();
// _sf methods
static SoundManager &sfManager();
@@ -255,7 +260,6 @@ class Sound: public EventHandler {
private:
void _prime(int soundResID, bool dontQueue);
void _unPrime();
- void orientAfterRestore();
public:
bool _stoppedAsynchronously;
int _soundResID;
@@ -276,7 +280,8 @@ public:
int _fadeTicks;
int _fadeCounter;
bool _stopAfterFadeFlag;
- uint _timer;
+ uint32 _timer;
+ uint32 _newTimeIndex;
int _loopTimer;
int _chProgram[SOUND_ARR_SIZE];
int _chModulation[SOUND_ARR_SIZE];
@@ -306,6 +311,9 @@ public:
Sound();
~Sound();
+ void synchronize(Serializer &s);
+ void orientAfterRestore();
+
void play(int soundResID);
void stop();
void prime(int soundResID);
@@ -342,8 +350,8 @@ public:
void _soRemoteReceive();
void _soServiceTrackType0(int trackIndex, const byte *channelData);
void _soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0);
- void _soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1);
- void _soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0);
+ void _soPlaySound(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0, int v1);
+ void _soPlaySound2(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0);
void _soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int cmd, int value);
void _soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend);
void _soDoTrackCommand(int channelNum, int command, int value);
@@ -357,7 +365,7 @@ public:
class ASound: public EventHandler {
public:
Sound _sound;
- Action *_action;
+ EventHandler *_action;
int _cueValue;
ASound();
@@ -365,7 +373,7 @@ public:
virtual void synchronize(Serializer &s);
virtual void dispatch();
- void play(int soundNum, Action *action = NULL, int volume = 127);
+ void play(int soundNum, EventHandler *action = NULL, int volume = 127);
void stop();
void prime(int soundNum, Action *action = NULL);
void unPrime();
@@ -377,7 +385,7 @@ public:
bool isMuted() const { return _sound.isMuted(); }
void pause(bool flag) { _sound.pause(flag); }
void mute(bool flag) { _sound.mute(flag); }
- void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action);
+ void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, EventHandler *action);
void fadeIn() { fade(127, 5, 10, false, NULL); }
void fadeOut(Action *action) { fade(0, 5, 10, true, action); }
void setTimeIndex(uint32 timeIndex) { _sound.setTimeIndex(timeIndex); }
@@ -390,8 +398,23 @@ public:
int getVol() const { return _sound.getVol(); }
void holdAt(int v) { _sound.holdAt(v); }
void release() { _sound.release(); }
+ void fadeSound(int soundNum);
};
+class ASoundExt: public ASound {
+public:
+ int _soundNum;
+
+ ASoundExt();
+ void fadeOut2(EventHandler *action);
+ void changeSound(int soundNum);
+
+ virtual Common::String getClassName() { return "ASoundExt"; }
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+};
+
+
#define ADLIB_CHANNEL_COUNT 9
class AdlibSoundDriver: public SoundDriver, Audio::AudioStream {
@@ -404,6 +427,11 @@ private:
byte _portContents[256];
const byte *_patchData;
int _masterVolume;
+ Common::Queue<RegisterValue> _queue;
+ int _samplesTillCallback;
+ int _samplesTillCallbackRemainder;
+ int _samplesPerCallback;
+ int _samplesPerCallbackRemainder;
bool _channelVoiced[ADLIB_CHANNEL_COUNT];
int _channelVolume[ADLIB_CHANNEL_COUNT];
@@ -417,6 +445,7 @@ private:
void write(byte reg, byte value);
+ void flush();
void updateChannelVolume(int channel);
void setVoice(int channel);
void clearVoice(int channel);
@@ -432,11 +461,10 @@ public:
virtual const GroupData *getGroupData();
virtual void installPatch(const byte *data, int size);
virtual int setMasterVolume(int volume);
- virtual void proc32(int channel, int program, int v0, int v1);
+ virtual void playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1);
virtual void updateVoice(int channel);
virtual void proc38(int channel, int cmd, int value);
virtual void setPitch(int channel, int pitchBlend);
- virtual void setUpdateCallback(UpdateCallback upCb, void *ref);
// AudioStream interface
virtual int readBuffer(int16 *buffer, const int numSamples);
@@ -447,6 +475,33 @@ public:
void update(int16 *buf, int len);
};
-} // End of namespace tSage
+class SoundBlasterDriver: public SoundDriver {
+private:
+ GroupData _groupData;
+ Audio::Mixer *_mixer;
+ Audio::SoundHandle _soundHandle;
+ Audio::QueuingAudioStream *_audioStream;
+ int _sampleRate;
+
+ byte _masterVolume;
+ byte _channelVolume;
+ const byte *_channelData;
+public:
+ SoundBlasterDriver();
+ virtual ~SoundBlasterDriver();
+
+ virtual bool open();
+ virtual void close();
+ virtual bool reset();
+ virtual const GroupData *getGroupData();
+ virtual int setMasterVolume(int volume);
+ virtual void playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1);
+ virtual void updateVoice(int channel);
+ virtual void proc38(int channel, int cmd, int value);
+ virtual void proc42(int channel, int cmd, int value, int *v1, int *v2);
+};
+
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/staticres.cpp b/engines/tsage/staticres.cpp
index 9f36268ce3..c98d9d2e53 100644
--- a/engines/tsage/staticres.cpp
+++ b/engines/tsage/staticres.cpp
@@ -22,7 +22,7 @@
#include "tsage/staticres.h"
-namespace tSage {
+namespace TsAGE {
const byte CURSOR_ARROW_DATA[] = {
15, 0, 15, 0, 0, 0, 0, 0, 9, 0,
@@ -72,13 +72,8 @@ const char *DEFAULT_SCENE_HOTSPOT = "That accomplishes nothing.";
const char *SAVE_ERROR_MSG = "Error occurred saving game. Please do not try to restore this game!";
const char *SAVING_NOT_ALLOWED_MSG = "Saving is not allowed at this time.";
const char *RESTORING_NOT_ALLOWED_MSG = "Restoring is not allowed at this time.";
-const char *RESTART_CONFIRM_MSG = "Do you want to restart your game?";
-const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?";
const char *INV_EMPTY_MSG = "You have nothing in your possesion.";
-const char *HELP_MSG = "Ringworld\rRevenge of the Patriarch\x14\rScummVM Version\r\r\
-\x01 Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\
-F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game";
const char *QUIT_CONFIRM_MSG = "Do you want to quit playing this game?";
const char *RESTART_MSG = "Do you want to restart this game?";
const char *GAME_PAUSED_MSG = "Game is paused.";
@@ -93,9 +88,19 @@ const char *SOUND_BTN_STRING = "Sound";
const char *RESUME_BTN_STRING = " Resume \rplay";
const char *LOOK_BTN_STRING = "Look";
const char *PICK_BTN_STRING = "Pick";
+
+
+namespace Ringworld {
+
+// Dialog resources
+const char *HELP_MSG = "Ringworld\rRevenge of the Patriarch\x14\rScummVM Version\r\r\
+\x01 Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\
+F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game";
+const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?";
const char *START_PLAY_BTN_STRING = " Start Play ";
const char *INTRODUCTION_BTN_STRING = "Introduction";
+// Scene specific resources
const char *EXIT_MSG = " EXIT ";
const char *SCENE6100_CAREFUL = "Be careful! The probe cannot handle too much of that.";
const char *SCENE6100_TOUGHER = "Hey! This is tougher than it looks!";
@@ -118,4 +123,61 @@ const char *EXIT_BTN_STRING = "Exit";
const char *DEMO_BTN_STRING = "Demo";
const char *DEMO_RESUME_BTN_STRING = "Resume";
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+namespace BlueForce {
+
+// Dialog resources
+const char *HELP_MSG = "Blue Force\x14\rScummVM Version\r\r\
+Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\
+F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game";
+const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?";
+const char *START_PLAY_BTN_STRING = " Play ";
+const char *INTRODUCTION_BTN_STRING = " Watch ";
+
+// Blue Force general messages
+const char *BF_NAME = "Blue Force";
+const char *BF_COPYRIGHT = " Copyright, 1993 Tsunami Media, Inc.";
+const char *BF_ALL_RIGHTS_RESERVED = "All Rights Reserved";
+const char *BF_19840518 = "May 18, 1984";
+const char *BF_19840515 = "May 15, 1984";
+const char *BF_3_DAYS = "Three days later";
+const char *BF_11_YEARS = "Eleven years later.";
+const char *BF_NEXT_DAY = "The Next Day";
+const char *BF_ACADEMY = "Here we are at the Academy";
+
+// Scene 50 hotspots
+const char *GRANDMA_FRANNIE = "Grandma Frannie";
+const char *MARINA = "Marina";
+const char *POLICE_DEPARTMENT = "Police Department";
+const char *TONYS_BAR = "Tony's Bar";
+const char *CHILD_PROTECTIVE_SERVICES = "Child Protective Services";
+const char *ALLEY_CAT = "Alley Cat";
+const char *CITY_HALL_JAIL = "City Hall & Jail";
+const char *JAMISON_RYAN = "Jamison & Ryan";
+const char *BIKINI_HUT = "Bikini Hut";
+
+// Scene 60 radio messages
+const char *RADIO_BTN_LIST[8] = { "10-2 ", "10-4 ", "10-13", "10-15", "10-27", "10-35", "10-97", "10-98" };
+
+// Scene 570 computer messageS
+const char *SCENE570_PASSWORD = "PASSWORD -> ";
+const char *SCENE570_C_DRIVE = "C:\\";
+const char *SCENE570_RING = "RING";
+const char *SCENE570_PROTO = "PROTO";
+const char *SCENE570_WACKY = "WACKY";
+const char *SCENE570_COBB = "COBB";
+const char *SCENE570_LETTER = "LETTER";
+const char *SCENE570_RINGEXE = "RINGEXE";
+const char *SCENE570_RINGDATA = "RINGDATA";
+const char *SCENE570_PROTOEXE = "PROTOEXE";
+const char *SCENE570_PROTODATA = "PROTODATA";
+const char *SCENE570_WACKYEXE = "WACKYEXE";
+const char *SCENE570_WACKYDATA = "WACKYDATA";
+
+// Scene 180 messages
+const char *THE_NEXT_DAY = "The Next Day";
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/staticres.h b/engines/tsage/staticres.h
index fa93511779..203fa1481d 100644
--- a/engines/tsage/staticres.h
+++ b/engines/tsage/staticres.h
@@ -25,7 +25,7 @@
#include "common/scummsys.h"
-namespace tSage {
+namespace TsAGE {
extern const byte CURSOR_ARROW_DATA[];
@@ -39,11 +39,8 @@ extern const char *DEFAULT_SCENE_HOTSPOT;
extern const char *SAVE_ERROR_MSG;
extern const char *SAVING_NOT_ALLOWED_MSG;
extern const char *RESTORING_NOT_ALLOWED_MSG;
-extern const char *RESTART_CONFIRM_MSG;
-extern const char *WATCH_INTRO_MSG;
// Dialogs
-extern const char *HELP_MSG;
extern const char *QUIT_CONFIRM_MSG;
extern const char *RESTART_MSG;
extern const char *GAME_PAUSED_MSG;
@@ -59,6 +56,12 @@ extern const char *RESUME_BTN_STRING;
extern const char *LOOK_BTN_STRING;
extern const char *PICK_BTN_STRING;
extern const char *INV_EMPTY_MSG;
+
+namespace Ringworld {
+
+// Dialog resources
+extern const char *HELP_MSG;
+extern const char *WATCH_INTRO_MSG;
extern const char *START_PLAY_BTN_STRING;
extern const char *INTRODUCTION_BTN_STRING;
@@ -86,6 +89,60 @@ extern const char *EXIT_BTN_STRING;
extern const char *DEMO_BTN_STRING;
extern const char *DEMO_RESUME_BTN_STRING;
-} // End of namespace tSage
+} // End of namespace Ringworld
+
+namespace BlueForce {
+
+// Dialog resources
+extern const char *HELP_MSG;
+extern const char *WATCH_INTRO_MSG;
+extern const char *START_PLAY_BTN_STRING;
+extern const char *INTRODUCTION_BTN_STRING;
+
+// Blue Force messages
+extern const char *BF_NAME;
+extern const char *BF_COPYRIGHT;
+extern const char *BF_ALL_RIGHTS_RESERVED;
+extern const char *BF_19840518;
+extern const char *BF_19840515;
+extern const char *BF_3_DAYS;
+extern const char *BF_11_YEARS;
+extern const char *BF_NEXT_DAY;
+extern const char *BF_ACADEMY;
+
+// Scene 50 tooltips
+extern const char *GRANDMA_FRANNIE;
+extern const char *MARINA;
+extern const char *POLICE_DEPARTMENT;
+extern const char *TONYS_BAR;
+extern const char *CHILD_PROTECTIVE_SERVICES;
+extern const char *ALLEY_CAT;
+extern const char *CITY_HALL_JAIL;
+extern const char *JAMISON_RYAN;
+extern const char *BIKINI_HUT;
+
+extern const char *SCENE570_PASSWORD;
+extern const char *SCENE570_C_DRIVE;
+extern const char *SCENE570_RING;
+extern const char *SCENE570_PROTO;
+extern const char *SCENE570_WACKY;
+extern const char *SCENE570_COBB;
+extern const char *SCENE570_LETTER;
+extern const char *SCENE570_RINGEXE;
+extern const char *SCENE570_RINGDATA;
+extern const char *SCENE570_PROTOEXE;
+extern const char *SCENE570_PROTODATA;
+extern const char *SCENE570_WACKYEXE;
+extern const char *SCENE570_WACKYDATA;
+
+// Scene 60 radio dispatch buttons
+extern const char *RADIO_BTN_LIST[8];
+
+// Scene 180 message
+extern const char *THE_NEXT_DAY;
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp
index 41f3d58897..7e7198fc2b 100644
--- a/engines/tsage/tsage.cpp
+++ b/engines/tsage/tsage.cpp
@@ -30,13 +30,13 @@
#include "tsage/resources.h"
#include "tsage/globals.h"
-namespace tSage {
+namespace TsAGE {
-TSageEngine *_vm = NULL;
+TSageEngine *g_vm = NULL;
TSageEngine::TSageEngine(OSystem *system, const tSageGameDescription *gameDesc) : Engine(system),
_gameDescription(gameDesc) {
- _vm = this;
+ g_vm = this;
DebugMan.addDebugChannel(kRingDebugScripts, "scripts", "Scripts debugging");
_debugger = new Debugger();
}
@@ -61,45 +61,64 @@ bool TSageEngine::hasFeature(EngineFeature f) const {
}
void TSageEngine::initialize() {
- _saver = new Saver();
+ g_saver = new Saver();
// Set up the resource manager
- _resourceManager = new ResourceManager();
- if (_vm->getFeatures() & GF_DEMO) {
+ g_resourceManager = new ResourceManager();
+ if (g_vm->getFeatures() & GF_DEMO) {
// Add the single library file associated with the demo
- _resourceManager->addLib(getPrimaryFilename());
- } else if (_vm->getGameID() == GType_Ringworld) {
- _resourceManager->addLib("RING.RLB");
- _resourceManager->addLib("TSAGE.RLB");
- } else if (_vm->getGameID() == GType_BlueForce) {
- _resourceManager->addLib("BLUE.RLB");
- if (_vm->getFeatures() & GF_FLOPPY) {
- _resourceManager->addLib("FILES.RLB");
- _resourceManager->addLib("TSAGE.RLB");
+ g_resourceManager->addLib(getPrimaryFilename());
+ g_globals = new Globals();
+
+ } else if (g_vm->getGameID() == GType_Ringworld) {
+ g_resourceManager->addLib("RING.RLB");
+ g_resourceManager->addLib("TSAGE.RLB");
+ g_globals = new Globals();
+
+ } else if (g_vm->getGameID() == GType_BlueForce) {
+ g_resourceManager->addLib("BLUE.RLB");
+ if (g_vm->getFeatures() & GF_FLOPPY) {
+ g_resourceManager->addLib("FILES.RLB");
+ g_resourceManager->addLib("TSAGE.RLB");
}
+ g_globals = new BlueForce::BlueForceGlobals();
+
+ // Setup the user interface
+ T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y - 2));
+
+ // Reset all global variables
+ BF_GLOBALS.reset();
+ } else if (g_vm->getGameID() == GType_Ringworld2) {
+ g_resourceManager->addLib("R2RW.RLB");
+ g_globals = new Ringworld2::Ringworld2Globals();
+
+ // Setup the user interface
+ T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y - 2));
+
+ // Reset all global variables
+ R2_GLOBALS.reset();
}
- _globals = new Globals();
- _globals->gfxManager().setDefaults();
+ g_globals->gfxManager().setDefaults();
// Setup sound settings
syncSoundSettings();
}
void TSageEngine::deinitialize() {
- delete _globals;
- delete _resourceManager;
- delete _saver;
- _resourceManager = NULL;
- _saver = NULL;
+ delete g_globals;
+ delete g_resourceManager;
+ delete g_saver;
+ g_resourceManager = NULL;
+ g_saver = NULL;
}
Common::Error TSageEngine::run() {
// Basic initialisation
initialize();
- _globals->_sceneHandler.registerHandler();
- _globals->_game->execute();
+ g_globals->_sceneHandler->registerHandler();
+ g_globals->_game->execute();
deinitialize();
return Common::kNoError;
@@ -109,28 +128,28 @@ Common::Error TSageEngine::run() {
* Returns true if it is currently okay to restore a game
*/
bool TSageEngine::canLoadGameStateCurrently() {
- return (_globals->getFlag(50) == 0);
+ return (g_globals != NULL) && (g_globals->_game != NULL) && g_globals->_game->canLoadGameStateCurrently();
}
/**
* Returns true if it is currently okay to save the game
*/
bool TSageEngine::canSaveGameStateCurrently() {
- return (_globals->getFlag(50) == 0);
+ return (g_globals != NULL) && (g_globals->_game != NULL) && g_globals->_game->canSaveGameStateCurrently();
}
/**
* Load the savegame at the specified slot index
*/
Common::Error TSageEngine::loadGameState(int slot) {
- return _saver->restore(slot);
+ return g_saver->restore(slot);
}
/**
* Save the game to the given slot index, and with the given name
*/
Common::Error TSageEngine::saveGameState(int slot, const Common::String &desc) {
- return _saver->save(slot, desc);
+ return g_saver->save(slot, desc);
}
/**
@@ -144,7 +163,11 @@ Common::String TSageEngine::generateSaveName(int slot) {
void TSageEngine::syncSoundSettings() {
Engine::syncSoundSettings();
- _globals->_soundManager.syncSounds();
+ g_globals->_soundManager.syncSounds();
}
-} // End of namespace tSage
+bool TSageEngine::shouldQuit() {
+ return getEventManager()->shouldQuit() || getEventManager()->shouldRTL();
+}
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h
index f004c7f625..eb36cf0790 100644
--- a/engines/tsage/tsage.h
+++ b/engines/tsage/tsage.h
@@ -36,11 +36,12 @@
#include "tsage/resources.h"
-namespace tSage {
+namespace TsAGE {
enum {
GType_Ringworld = 0,
- GType_BlueForce = 1
+ GType_BlueForce = 1,
+ GType_Ringworld2 = 2
};
enum {
@@ -62,6 +63,7 @@ struct tSageGameDescription;
#define SCREEN_HEIGHT 200
#define SCREEN_CENTER_X 160
#define SCREEN_CENTER_Y 100
+#define UI_INTERFACE_Y 168
class TSageEngine : public Engine {
private:
@@ -78,6 +80,7 @@ public:
uint32 getGameID() const;
uint32 getFeatures() const;
Common::String getPrimaryFilename() const;
+ bool shouldQuit();
virtual Common::Error init();
virtual Common::Error run();
@@ -92,12 +95,12 @@ public:
void deinitialize();
};
-extern TSageEngine *_vm;
+extern TSageEngine *g_vm;
-#define ALLOCATE_HANDLE(x) _vm->_memoryManager.allocate(x)
-#define ALLOCATE(x) _vm->_memoryManager.allocate2(x)
-#define DEALLOCATE(x) _vm->_memoryManager.deallocate(x)
+#define ALLOCATE_HANDLE(x) g_vm->_memoryManager.allocate(x)
+#define ALLOCATE(x) g_vm->_memoryManager.allocate2(x)
+#define DEALLOCATE(x) g_vm->_memoryManager.deallocate(x)
-} // End of namespace tSage
+} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/user_interface.cpp b/engines/tsage/user_interface.cpp
new file mode 100644
index 0000000000..b7f96b3806
--- /dev/null
+++ b/engines/tsage/user_interface.cpp
@@ -0,0 +1,529 @@
+/* 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.
+ *
+ */
+
+#include "tsage/user_interface.h"
+#include "tsage/core.h"
+#include "tsage/tsage.h"
+#include "tsage/blue_force/blueforce_dialogs.h"
+#include "tsage/blue_force/blueforce_logic.h"
+
+namespace TsAGE {
+
+void StripProxy::process(Event &event) {
+ if (_action)
+ _action->process(event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void UIElement::synchronize(Serializer &s) {
+ BackgroundSceneObject::synchronize(s);
+ s.syncAsSint16LE(_field88);
+ s.syncAsSint16LE(_enabled);
+ s.syncAsSint16LE(_frameNum);
+}
+
+void UIElement::setup(int visage, int stripNum, int frameNum, int posX, int posY, int priority) {
+ _field88 = 0;
+ _frameNum = frameNum;
+ _enabled = true;
+
+ SceneObject::setup(visage, stripNum, frameNum, posX, posY, priority);
+}
+
+void UIElement::setEnabled(bool flag) {
+ if (_enabled != flag) {
+ _enabled = flag;
+ setFrame(_enabled ? _frameNum : _frameNum + 2);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void UIQuestion::process(Event &event) {
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ CursorType currentCursor = GLOBALS._events.getCursor();
+ GLOBALS._events.hideCursor();
+ showDescription(currentCursor);
+
+ event.handled = true;
+ }
+}
+
+void UIQuestion::showDescription(CursorType cursor) {
+ if (cursor == INV_FOREST_RAP) {
+ // Forest rap item has a graphical display
+ showItem(5, 1, 1);
+ } else {
+ // Display object description
+ SceneItem::display2(9001, (int)cursor);
+ }
+}
+
+void UIQuestion::setEnabled(bool flag) {
+ if (_enabled != flag) {
+ UIElement::setEnabled(flag);
+ T2_GLOBALS._uiElements.draw();
+ }
+}
+
+void UIQuestion::showItem(int resNum, int rlbNum, int frameNum) {
+ GfxDialog::setPalette();
+
+ // Get the item to display
+ GfxSurface objImage = surfaceFromRes(resNum, rlbNum, frameNum);
+ Rect imgRect;
+ imgRect.resize(objImage, 0, 0, 100);
+ imgRect.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
+
+ // Save the area behind where the image will be displayed
+ GfxSurface *savedArea = Surface_getArea(BF_GLOBALS.gfxManager().getSurface(), imgRect);
+
+ // Draw the image
+ BF_GLOBALS.gfxManager().copyFrom(objImage, imgRect);
+
+ // Wait for a press
+ BF_GLOBALS._events.waitForPress();
+
+ // Restore the old area
+ BF_GLOBALS.gfxManager().copyFrom(*savedArea, imgRect);
+ delete savedArea;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void UIScore::postInit(SceneObjectList *OwnerList) {
+ int xp = 266;
+ _digit3.setup(1, 6, 1, xp, 180, 255);
+ _digit3.reposition();
+ xp += 7;
+ _digit2.setup(1, 6, 1, xp, 180, 255);
+ _digit2.reposition();
+ xp += 7;
+ _digit1.setup(1, 6, 1, xp, 180, 255);
+ _digit1.reposition();
+ xp += 7;
+ _digit0.setup(1, 6, 1, xp, 180, 255);
+ _digit0.reposition();
+}
+
+void UIScore::draw() {
+ _digit3.draw();
+ _digit2.draw();
+ _digit1.draw();
+ _digit0.draw();
+}
+
+void UIScore::updateScore() {
+ int score = T2_GLOBALS._uiElements._scoreValue;
+
+ _digit3.setFrame(score / 1000 + 1); score %= 1000;
+ _digit2.setFrame(score / 100 + 1); score %= 100;
+ _digit1.setFrame(score / 10 + 1); score %= 10;
+ _digit0.setFrame(score + 1);
+}
+
+/*--------------------------------------------------------------------------*/
+
+UIInventorySlot::UIInventorySlot(): UIElement() {
+ _objIndex = 0;
+ _object = NULL;
+}
+
+void UIInventorySlot::synchronize(Serializer &s) {
+ UIElement::synchronize(s);
+ s.syncAsSint16LE(_objIndex);
+ SYNC_POINTER(_object);
+}
+
+void UIInventorySlot::process(Event &event) {
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ event.handled = true;
+
+ // Check if game has a select item handler, and if so, give it a chance to check
+ // whether something special happens when the item is selected
+ if (!T2_GLOBALS._onSelectItem || !T2_GLOBALS._onSelectItem((CursorType)_objIndex))
+ _object->setCursor();
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+UIInventoryScroll::UIInventoryScroll() {
+ _isLeft = false;
+}
+
+void UIInventoryScroll::synchronize(Serializer &s) {
+ UIElement::synchronize(s);
+ s.syncAsSint16LE(_isLeft);
+}
+
+void UIInventoryScroll::process(Event &event) {
+ switch (event.eventType) {
+ case EVENT_BUTTON_DOWN:
+ // Draw the button as selected
+ toggle(true);
+
+ event.handled = true;
+ break;
+ case EVENT_BUTTON_UP:
+ // Restore unselected version
+ toggle(false);
+
+ // Scroll the inventory as necessary
+ T2_GLOBALS._uiElements.scrollInventory(_isLeft);
+ event.handled = true;
+ break;
+ default:
+ break;
+ }
+}
+
+void UIInventoryScroll::toggle(bool pressed) {
+ if (_enabled) {
+ setFrame(pressed ? (_frameNum + 1) : _frameNum);
+ T2_GLOBALS._uiElements.draw();
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+UICollection::UICollection(): EventHandler() {
+ _clearScreen = false;
+ _visible = false;
+ _cursorChanged = false;
+}
+
+void UICollection::setup(const Common::Point &pt) {
+ _position = pt;
+ _bounds.left = _bounds.right = pt.x;
+ _bounds.top = _bounds.bottom = pt.y;
+}
+
+void UICollection::hide() {
+ erase();
+ _visible = false;
+}
+
+void UICollection::show() {
+ _visible = true;
+ draw();
+}
+
+void UICollection::erase() {
+ if (_clearScreen) {
+ Rect tempRect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT);
+ BF_GLOBALS._screenSurface.fillRect(tempRect, 0);
+ BF_GLOBALS._sceneManager._scene->_backSurface.fillRect(tempRect, 0);
+ _clearScreen = false;
+ }
+}
+
+void UICollection::resetClear() {
+ _clearScreen = false;
+}
+
+void UICollection::draw() {
+ if (_visible) {
+ // Temporarily reset the sceneBounds when drawing UI elements to force them on-screen
+ Rect savedBounds = g_globals->_sceneManager._scene->_sceneBounds;
+ g_globals->_sceneManager._scene->_sceneBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+
+ // Draw the elements onto the background
+ for (uint idx = 0; idx < _objList.size(); ++idx)
+ _objList[idx]->draw();
+
+ // Draw the resulting UI onto the screen
+ BF_GLOBALS._screenSurface.copyFrom(BF_GLOBALS._sceneManager._scene->_backSurface,
+ Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT),
+ Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT));
+
+ _clearScreen = 1;
+ g_globals->_sceneManager._scene->_sceneBounds = savedBounds;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+UIElements::UIElements(): UICollection() {
+ _cursorVisage.setVisage(1, 5);
+ g_saver->addLoadNotifier(&UIElements::loadNotifierProc);
+ _characterIndex = 0;
+}
+
+void UIElements::synchronize(Serializer &s) {
+ UICollection::synchronize(s);
+
+ s.syncAsSint16LE(_slotStart);
+ s.syncAsSint16LE(_scoreValue);
+ s.syncAsByte(_active);
+
+ int count = _itemList.size();
+ s.syncAsSint16LE(count);
+ if (s.isLoading()) {
+ // Load in item list
+ _itemList.clear();
+
+ for (int idx = 0; idx < count; ++idx) {
+ int itemId;
+ s.syncAsSint16LE(itemId);
+ _itemList.push_back(itemId);
+ }
+ } else {
+ // Save item list
+ for (int idx = 0; idx < count; ++idx) {
+ int itemId = _itemList[idx];
+ s.syncAsSint16LE(itemId);
+ }
+ }
+
+ if (g_vm->getGameID() == GType_Ringworld2)
+ s.syncAsSint16LE(_characterIndex);
+}
+
+void UIElements::process(Event &event) {
+ if (_clearScreen && BF_GLOBALS._player._enabled && (BF_GLOBALS._sceneManager._sceneNumber != 50)) {
+ if (_bounds.contains(event.mousePos)) {
+ // Cursor inside UI area
+ if (!_cursorChanged) {
+ if (BF_GLOBALS._events.isInventoryIcon()) {
+ // Inventory icon being displayed, so leave alone
+ } else {
+ // Change to the inventory use cursor
+ GfxSurface surface = _cursorVisage.getFrame(6);
+ BF_GLOBALS._events.setCursor(surface);
+ }
+ _cursorChanged = true;
+ }
+
+ // Pass event to any element that the cursor falls on
+ for (int idx = (int)_objList.size() - 1; idx >= 0; --idx) {
+ if (_objList[idx]->_bounds.contains(event.mousePos) && _objList[idx]->_enabled) {
+ _objList[idx]->process(event);
+ if (event.handled)
+ break;
+ }
+ }
+
+ if (event.eventType == EVENT_BUTTON_DOWN)
+ event.handled = true;
+
+ } else if (_cursorChanged) {
+ // Cursor outside UI area, so reset as necessary
+ BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor());
+ _cursorChanged = false;
+/*
+ SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ if (scene->_focusObject) {
+ GfxSurface surface = _cursorVisage.getFrame(7);
+ BF_GLOBALS._events.setCursor(surface);
+ }
+*/
+ }
+ }
+}
+
+void UIElements::setup(const Common::Point &pt) {
+ _slotStart = 0;
+ _itemList.clear();
+ _scoreValue = 0;
+ _active = true;
+ UICollection::setup(pt);
+ hide();
+
+ _background.setup(1, 3, 1, 0, 0, 255);
+ add(&_background);
+
+ // Set up the inventory slots
+ int xp = 0;
+ for (int idx = 0; idx < 4; ++idx) {
+ UIElement *item = NULL;
+ switch (idx) {
+ case 0:
+ item = &_slot1;
+ break;
+ case 1:
+ item = &_slot2;
+ break;
+ case 2:
+ item = &_slot3;
+ break;
+ case 3:
+ item = &_slot4;
+ break;
+ }
+
+ xp = idx * 63 + 2;
+ if (g_vm->getGameID() == GType_BlueForce) {
+ item->setup(9, 1, idx, xp, 4, 255);
+ } else {
+ item->setup(7, 1, idx, xp, 4, 255);
+ }
+ add(item);
+ }
+
+ // Setup bottom-right hand buttons
+ xp += 62;
+ int yp = (g_vm->getGameID() == GType_BlueForce) ? 16 : 17;
+ _question.setup(1, 4, 7, xp, yp, 255);
+ _question.setEnabled(false);
+ add(&_question);
+
+ xp += 21;
+ _scrollLeft.setup(1, 4, 1, xp, yp, 255);
+ add(&_scrollLeft);
+ _scrollLeft._isLeft = true;
+
+ xp += 22;
+ _scrollRight.setup(1, 4, 4, xp, yp, 255);
+ add(&_scrollRight);
+ _scrollRight._isLeft = false;
+
+ switch (g_vm->getGameID()) {
+ case GType_BlueForce:
+ // Set up the score
+ _score.postInit();
+ add(&_score);
+ case GType_Ringworld2:
+ // Set up the character display
+ _character.setup(1, 5, _characterIndex, 285, 11, 255);
+ add(&_character);
+ break;
+ default:
+ break;
+ }
+
+ // Set interface area
+ _bounds = Rect(0, UI_INTERFACE_Y - 1, SCREEN_WIDTH, SCREEN_HEIGHT);
+
+ updateInventory();
+}
+
+void UIElements::add(UIElement *obj) {
+ // Add object
+ assert(_objList.size() < 12);
+ _objList.push_back(obj);
+
+ obj->setPosition(Common::Point(_bounds.left + obj->_position.x, _bounds.top + obj->_position.y));
+ obj->reposition();
+
+ GfxSurface s = obj->getFrame();
+ s.draw(obj->_position);
+}
+
+/**
+ * Handles updating the visual inventory in the user interface
+ */
+void UIElements::updateInventory() {
+ _score.updateScore();
+ updateInvList();
+
+ // Enable scroll buttons if the player has more than four items
+ if (_itemList.size() > 4) {
+ _scrollLeft.setEnabled(true);
+ _scrollRight.setEnabled(true);
+ } else {
+ _scrollLeft.setEnabled(false);
+ _scrollRight.setEnabled(false);
+ }
+
+ // Handle cropping the slots start within inventory
+ int lastPage = (_itemList.size() - 1) / 4 + 1;
+ if (_slotStart < 0)
+ _slotStart = lastPage - 1;
+ else if (_slotStart > (lastPage - 1))
+ _slotStart = 0;
+
+ // Handle refreshing slot graphics
+ UIInventorySlot *slotList[4] = { &_slot1, &_slot2, &_slot3, &_slot4 };
+
+ // Loop through the inventory objects
+ SynchronizedList<InvObject *>::iterator i;
+ int objIndex = 0;
+ for (i = BF_INVENTORY._itemList.begin(); i != BF_INVENTORY._itemList.end(); ++i, ++objIndex) {
+ InvObject *obj = *i;
+
+ // Check whether the object is in any of the four inventory slots
+ for (int slotIndex = 0; slotIndex < 4; ++slotIndex) {
+ int idx = _slotStart * 4 + slotIndex;
+ int objectIdx = (idx < (int)_itemList.size()) ? _itemList[idx] : 0;
+
+ if (objectIdx == objIndex) {
+ UIInventorySlot *slot = slotList[slotIndex];
+
+ slot->_objIndex = objIndex;
+ slot->_object = obj;
+ slot->setVisage(obj->_visage);
+ slot->setStrip(obj->_strip);
+ slot->setFrame(obj->_frame);
+ }
+ }
+ }
+
+ // Refresh the display if necessary
+ if (_active)
+ draw();
+}
+
+/**
+ * Update the list of the indexes of items in the player's inventory
+ */
+void UIElements::updateInvList() {
+ // Update the index list of items in the player's inventory
+ _itemList.clear();
+
+ SynchronizedList<InvObject *>::iterator i;
+ int itemIndex = 0;
+ for (i = BF_GLOBALS._inventory->_itemList.begin(); i != BF_GLOBALS._inventory->_itemList.end(); ++i, ++itemIndex) {
+ InvObject *invObject = *i;
+ if (invObject->inInventory())
+ _itemList.push_back(itemIndex);
+ }
+}
+
+/**
+ * Set the game score
+ */
+void UIElements::addScore(int amount) {
+ _scoreValue += amount;
+ BF_GLOBALS._sound2.play(0);
+ updateInventory();
+}
+
+/*
+ * Scroll the inventory slots
+ */
+void UIElements::scrollInventory(bool isLeft) {
+ if (isLeft)
+ --_slotStart;
+ else
+ ++_slotStart;
+
+ updateInventory();
+}
+
+void UIElements::loadNotifierProc(bool postFlag) {
+ if (postFlag && T2_GLOBALS._uiElements._active)
+ T2_GLOBALS._uiElements.show();
+}
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/user_interface.h b/engines/tsage/user_interface.h
new file mode 100644
index 0000000000..94a2444e39
--- /dev/null
+++ b/engines/tsage/user_interface.h
@@ -0,0 +1,150 @@
+/* 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 TSAGE_USER_INTERFACE_H
+#define TSAGE_USER_INTERFACE_H
+
+#include "common/scummsys.h"
+#include "tsage/core.h"
+#include "tsage/graphics.h"
+#include "tsage/sound.h"
+
+namespace TsAGE {
+
+class StripProxy: public EventHandler {
+public:
+ virtual void process(Event &event);
+};
+
+class UIElement: public BackgroundSceneObject {
+public:
+ int _field88;
+ bool _enabled;
+ int _frameNum;
+
+ virtual Common::String getClassName() { return "UIElement"; }
+ virtual void synchronize(Serializer &s);
+
+ void setup(int visage, int stripNum, int frameNum, int posX, int posY, int priority);
+ void setEnabled(bool flag);
+};
+
+// This class implements the Question mark button
+class UIQuestion: public UIElement {
+private:
+ void showDescription(CursorType item);
+ void showItem(int resNum, int rlbNum, int frameNum);
+public:
+ virtual void process(Event &event);
+ void setEnabled(bool flag);
+};
+
+// This class implements the score counter
+class UIScore: public UIElement {
+private:
+ void showDescription(int lineNum);
+public:
+ UIElement _digit3, _digit2, _digit1, _digit0;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void draw();
+
+ void updateScore();
+};
+
+class UIInventorySlot: public UIElement {
+public:
+ int _objIndex;
+ InvObject *_object;
+
+ UIInventorySlot();
+ virtual Common::String getClassName() { return "UIInventorySlot"; }
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+};
+
+class UIInventoryScroll: public UIElement {
+private:
+ void toggle(bool pressed);
+public:
+ bool _isLeft;
+
+ UIInventoryScroll();
+ virtual Common::String getClassName() { return "UIInventoryScroll"; }
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+};
+
+class UICollection: public EventHandler {
+protected:
+ void erase();
+public:
+ Common::Point _position;
+ Rect _bounds;
+ bool _visible;
+ bool _clearScreen;
+ bool _cursorChanged;
+ Common::Array<UIElement *> _objList;
+
+ UICollection();
+ void setup(const Common::Point &pt);
+ void hide();
+ void show();
+ void resetClear();
+ void draw();
+};
+
+class UIElements: public UICollection {
+private:
+ void add(UIElement *obj);
+ void updateInvList();
+public:
+ UIElement _background;
+ UIQuestion _question;
+ UIScore _score;
+ UIInventorySlot _slot1, _slot2, _slot3, _slot4;
+ UIInventoryScroll _scrollLeft, _scrollRight;
+ ASound _sound;
+ int _slotStart, _scoreValue;
+ bool _active;
+ Common::Array<int> _itemList;
+ Visage _cursorVisage;
+ UIElement _character;
+ int _characterIndex;
+
+ UIElements();
+ virtual Common::String getClassName() { return "UIElements"; }
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL) { error("Wrong init() called"); }
+ virtual void process(Event &event);
+
+ void setup(const Common::Point &pt);
+ void updateInventory();
+ void addScore(int amount);
+ void scrollInventory(bool isLeft);
+
+ static void loadNotifierProc(bool postFlag);
+};
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tucker/detection.cpp b/engines/tucker/detection.cpp
index 4a3313e3f7..77c84b281c 100644
--- a/engines/tucker/detection.cpp
+++ b/engines/tucker/detection.cpp
@@ -43,7 +43,7 @@ static const ADGameDescription tuckerGameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformPC,
Tucker::kGameFlagNoSubtitles,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"tucker",
@@ -52,7 +52,7 @@ static const ADGameDescription tuckerGameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
Tucker::kGameFlagEncodedData,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"tucker",
@@ -61,7 +61,7 @@ static const ADGameDescription tuckerGameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformPC,
Tucker::kGameFlagEncodedData,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"tucker",
@@ -70,7 +70,7 @@ static const ADGameDescription tuckerGameDescriptions[] = {
Common::DE_DEU,
Common::kPlatformPC,
Tucker::kGameFlagEncodedData,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"tucker",
@@ -79,7 +79,7 @@ static const ADGameDescription tuckerGameDescriptions[] = {
Common::PL_POL,
Common::kPlatformPC,
0,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"tucker",
@@ -88,7 +88,7 @@ static const ADGameDescription tuckerGameDescriptions[] = {
Common::CZ_CZE,
Common::kPlatformPC,
Tucker::kGameFlagEncodedData,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
{
"tucker",
@@ -97,7 +97,7 @@ static const ADGameDescription tuckerGameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | Tucker::kGameFlagDemo,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
},
AD_TABLE_END_MARKER
};
@@ -109,7 +109,7 @@ static const ADGameDescription tuckerDemoGameDescription = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_DEMO | Tucker::kGameFlagDemo | Tucker::kGameFlagIntroOnly,
- Common::GUIO_NONE
+ GUIO1(GUIO_NONE)
};
class TuckerMetaEngine : public AdvancedMetaEngine {
diff --git a/engines/tucker/staticres.cpp b/engines/tucker/staticres.cpp
index ef778b6f54..388f5ba05c 100644
--- a/engines/tucker/staticres.cpp
+++ b/engines/tucker/staticres.cpp
@@ -340,7 +340,7 @@ const SoundSequenceDataList AnimationSequencePlayer::_soundSeqDataList[] = {
{ 0, 0, 4, 0, 7, _soundDataSeq19_20 }
};
-const char *AnimationSequencePlayer::_audioFileNamesTable[] = {
+const char *const AnimationSequencePlayer::_audioFileNamesTable[] = {
"demomenu.raw",
"demorolc.raw",
"fx101.wav",
diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h
index e676369427..3daf75d44a 100644
--- a/engines/tucker/tucker.h
+++ b/engines/tucker/tucker.h
@@ -989,7 +989,7 @@ private:
Audio::SoundHandle _musicHandle;
static const SoundSequenceDataList _soundSeqDataList[];
- static const char *_audioFileNamesTable[];
+ static const char *const _audioFileNamesTable[];
};
} // namespace Tucker
diff --git a/graphics/cursor.h b/graphics/cursor.h
new file mode 100644
index 0000000000..b04d9c04e2
--- /dev/null
+++ b/graphics/cursor.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.
+ *
+ */
+
+#ifndef GRAPHICS_CURSOR_H
+#define GRAPHICS_CURSOR_H
+
+#include "common/scummsys.h"
+
+namespace Graphics {
+
+/**
+ * A simple cursor representation
+ * TODO: Switch to using Graphics::Surface instead of a byte*
+ */
+class Cursor {
+public:
+ Cursor() {}
+ virtual ~Cursor() {}
+
+ /** Return the cursor's width. */
+ virtual uint16 getWidth() const = 0;
+ /** Return the cursor's height. */
+ virtual uint16 getHeight() const = 0;
+ /** Return the cursor's hotspot's x coordinate. */
+ virtual uint16 getHotspotX() const = 0;
+ /** Return the cursor's hotspot's y coordinate. */
+ virtual uint16 getHotspotY() const = 0;
+ /** Return the cursor's transparent key. */
+ virtual byte getKeyColor() const = 0;
+
+ /** Return the cursor's surface. */
+ virtual const byte *getSurface() const = 0;
+
+ /** Return the cursor's palette in RGB format. */
+ virtual const byte *getPalette() const = 0;
+ /** Return the starting index of the palette. */
+ virtual byte getPaletteStartIndex() const = 0;
+ /** Return the number of colors in the palette. */
+ virtual uint16 getPaletteCount() const = 0;
+};
+
+} // End of namespace Graphics
+
+#endif
diff --git a/graphics/cursorman.cpp b/graphics/cursorman.cpp
index a5498903e2..1d4e482bf4 100644
--- a/graphics/cursorman.cpp
+++ b/graphics/cursorman.cpp
@@ -24,7 +24,9 @@
#include "common/system.h"
#include "common/stack.h"
+namespace Common {
DECLARE_SINGLETON(Graphics::CursorManager);
+}
namespace Graphics {
diff --git a/graphics/dither.cpp b/graphics/dither.cpp
deleted file mode 100644
index 3876db152b..0000000000
--- a/graphics/dither.cpp
+++ /dev/null
@@ -1,313 +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.
- */
-
-#include "graphics/dither.h"
-
-#include "common/endian.h"
-#include "common/stream.h"
-
-namespace Graphics {
-
-PaletteLUT::PaletteLUT(byte depth, PaletteFormat format) {
- assert((depth > 1) && (depth < 9));
-
- // For adjusting depth
- _depth1 = depth;
- _depth2 = 2 * _depth1;
- _shift = 8 - _depth1;
-
- // The table's dimensions
- _dim1 = (1 << _depth1);
- _dim2 = _dim1 * _dim1;
- _dim3 = _dim1 * _dim1 * _dim1;
-
- _format = format;
-
- // What's already built
- _got = _dim1;
- _gots = new byte[_dim1];
-
- // The lookup table
- _lut = new byte[_dim3];
-
- memset(_lutPal, 0, 768);
- memset(_realPal, 0, 768);
- memset(_gots, 1, _dim1);
-}
-
-void PaletteLUT::setPalette(const byte *palette, PaletteFormat format,
- byte depth, int transp) {
-
- assert((depth > 1) && (depth < 9));
-
- _transp = transp;
-
- int shift = 8 - depth;
-
- // Checking for the table's and the palette's pixel format
- if ((_format == kPaletteRGB) && (format == kPaletteYUV)) {
- byte *newPal = _realPal;
- const byte *oldPal = palette;
- for (int i = 0; i < 256; i++, newPal += 3, oldPal += 3)
- YUV2RGB(oldPal[0] << shift, oldPal[1] << shift, oldPal[2] << shift,
- newPal[0], newPal[1], newPal[2]);
- } else if ((_format == kPaletteYUV) && (format == kPaletteRGB)) {
- byte *newPal = _realPal;
- const byte *oldPal = palette;
- for (int i = 0; i < 256; i++, newPal += 3, oldPal += 3)
- RGB2YUV(oldPal[0] << shift, oldPal[1] << shift, oldPal[2] << shift,
- newPal[0], newPal[1], newPal[2]);
- } else
- memcpy(_realPal, palette, 768);
-
- // Using the specified depth for the lookup
- byte *newPal = _lutPal, *oldPal = _realPal;
- for (int i = 0; i < 768; i++)
- *newPal++ = (*oldPal++) >> _shift;
-
- // Everything has to be rebuilt
- _got = 0;
- memset(_gots, 0, _dim1);
-}
-
-PaletteLUT::~PaletteLUT() {
- delete[] _lut;
- delete[] _gots;
-}
-
-void PaletteLUT::buildNext() {
- if (_got >= _dim1)
- return;
-
- build(_got++);
-}
-
-#define SQR(x) ((x) * (x))
-// Building one "slice"
-void PaletteLUT::build(int d1) {
- // First dimension
- byte *lut = _lut + d1 * _dim2;
-
- // Second dimension
- for (uint32 j = 0; j < _dim1; j++) {
- // Third dimension
- for (uint32 k = 0; k < _dim1; k++) {
- const byte *p = _lutPal;
- uint32 d = 0xFFFFFFFF;
- byte n = 0;
-
- // Going over every palette entry, searching for the closest
- for (int c = 0; c < 256; c++, p += 3) {
- // Ignore the transparent color
- if (c == _transp)
- continue;
-
- uint32 di = SQR(d1 - p[0]) + SQR(j - p[1]) + SQR(k - p[2]);
- if (di < d) {
- d = di;
- n = c;
- if (d == 0)
- break;
- }
- }
-
- *lut++ = n;
- }
- }
-
- // Got this slice now
- _gots[d1] = 1;
-}
-
-inline int PaletteLUT::getIndex(byte c1, byte c2, byte c3) const {
- return ((c1 >> _shift) << _depth2) | ((c2 >> _shift) << _depth1) | (c3 >> _shift);
-}
-
-void PaletteLUT::getEntry(byte index, byte &c1, byte &c2, byte &c3) const {
- c1 = _realPal[index * 3 + 0];
- c2 = _realPal[index * 3 + 1];
- c3 = _realPal[index * 3 + 2];
-}
-
-byte PaletteLUT::findNearest(byte c1, byte c2, byte c3) {
- return _lut[getIndex(c1, c2, c3)];
-}
-
-byte PaletteLUT::findNearest(byte c1, byte c2, byte c3, byte &nC1, byte &nC2, byte &nC3) {
- // If we don't have the required "slice" yet, build it
- if (!_gots[c1 >> _shift])
- build(c1 >> _shift);
-
- int palIndex = _lut[getIndex(c1, c2, c3)];
- int i = palIndex * 3;
-
- nC1 = _realPal[i + 0];
- nC2 = _realPal[i + 1];
- nC3 = _realPal[i + 2];
-
- return palIndex;
-}
-
-bool PaletteLUT::save(Common::WriteStream &stream) {
- // The table has to be completely built before we can save
- while (_got < _dim1)
- buildNext();
-
- stream.writeUint32BE(MKTAG('P','L','U','T')); // Magic
- stream.writeUint32BE(kVersion);
- stream.writeByte(_depth1);
- if (stream.write(_realPal, 768) != 768)
- return false;
- if (stream.write(_lutPal, 768) != 768)
- return false;
- if (stream.write(_lut, _dim3) != _dim3)
- return false;
- if (!stream.flush())
- return false;
-
- if (stream.err())
- return false;
-
- return true;
-}
-
-bool PaletteLUT::load(Common::SeekableReadStream &stream) {
- // _realPal + _lutPal + _lut + _depth1 + magic + version
- int32 needSize = 768 + 768 + _dim3 + 1 + 4 + 4;
-
- if ((stream.size() - stream.pos()) < needSize)
- return false;
-
- // Magic
- if (stream.readUint32BE() != MKTAG('P','L','U','T'))
- return false;
-
- if (stream.readUint32BE() != kVersion)
- return false;
-
- byte depth1 = stream.readByte();
-
- if (depth1 != _depth1)
- return false;
-
- if (stream.read(_realPal, 768) != 768)
- return false;
- if (stream.read(_lutPal, 768) != 768)
- return false;
- if (stream.read(_lut, _dim3) != _dim3)
- return false;
-
- _got = _dim1;
- memset(_gots, 1, _dim1);
-
- return true;
-}
-
-SierraLight::SierraLight(int16 width, PaletteLUT *palLUT) {
- assert(width > 0);
-
- _width = width;
- _palLUT = palLUT;
-
- // Big buffer for the errors of the current and next line
- _errorBuf = new int32[3 * (2 * (_width + 2*1))];
- memset(_errorBuf, 0, (3 * (2 * (_width + 2*1))) * sizeof(int32));
-
- _curLine = 0;
- _errors[0] = _errorBuf + 3;
- _errors[1] = _errors[0] + 3 * (_width + 2*1);
-}
-
-SierraLight::~SierraLight() {
- delete[] _errorBuf;
-}
-
-void SierraLight::newFrame() {
- _curLine = 0;
- memset(_errors[0], 0, 3 * _width * sizeof(int32));
- memset(_errors[1], 0, 3 * _width * sizeof(int32));
-}
-
-void SierraLight::nextLine() {
- // Clear the finished line, it will become the last line in the buffer
- memset(_errors[_curLine], 0, 3 * _width * sizeof(int32));
-
- _curLine = (_curLine + 1) % 2;
-}
-
-byte SierraLight::dither(byte c1, byte c2, byte c3, uint32 x) {
- assert(_palLUT);
- assert(x < (uint32)_width);
-
- int32 eC1, eC2, eC3;
-
- getErrors(x, eC1, eC2, eC3);
-
- // Apply error on values
- c1 = CLIP<int>(c1 + eC1, 0, 255);
- c2 = CLIP<int>(c2 + eC2, 0, 255);
- c3 = CLIP<int>(c3 + eC3, 0, 255);
-
- // Find color
- byte newC1, newC2, newC3;
- byte newPixel = _palLUT->findNearest(c1, c2, c3, newC1, newC2, newC3);
-
- // Calculate new error
- eC1 = c1 - newC1;
- eC2 = c2 - newC2;
- eC3 = c3 - newC3;
-
- // Add them
- addErrors(x, eC1, eC2, eC3);
-
- return newPixel;
-}
-
-inline void SierraLight::getErrors(uint32 x, int32 &eC1, int32 &eC2, int32 &eC3) {
- int32 *errCur = _errors[_curLine];
-
- x *= 3;
- eC1 = errCur[x + 0] >> 2;
- eC2 = errCur[x + 1] >> 2;
- eC3 = errCur[x + 2] >> 2;
-}
-
-inline void SierraLight::addErrors(uint32 x, int32 eC1, int32 eC2, int32 eC3) {
- int32 *errCur = _errors[_curLine];
- int32 *errNext = _errors[(_curLine + 1) % 2];
-
- // Indices for current error
- int x0 = 3 * (x + 1);
- int x1 = 3 * (x + 0);
- int x2 = 3 * (x - 1);
-
- errCur [x0 + 0] += eC1 << 1;
- errCur [x0 + 1] += eC2 << 1;
- errCur [x0 + 2] += eC3 << 1;
- errNext[x1 + 0] += eC1;
- errNext[x1 + 1] += eC2;
- errNext[x1 + 2] += eC3;
- errNext[x2 + 0] += eC1;
- errNext[x2 + 1] += eC2;
- errNext[x2 + 2] += eC3;
-}
-
-} // End of namespace Graphics
diff --git a/graphics/dither.h b/graphics/dither.h
deleted file mode 100644
index dbde03df82..0000000000
--- a/graphics/dither.h
+++ /dev/null
@@ -1,195 +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.
- */
-
-#ifndef GRAPHICS_DITHER_H
-#define GRAPHICS_DITHER_H
-
-#include "common/util.h"
-
-namespace Common {
-class SeekableReadStream;
-class WriteStream;
-}
-
-namespace Graphics {
-
-/** A palette lookup table to find the nearest matching entry of a fixed palette to a true color.
- *
- * The table can be build up in slices, one slice consisting of all entries for
- * one value of the first color component.
- */
-class PaletteLUT {
-public:
- /** Palette format. */
- enum PaletteFormat {
- kPaletteRGB, ///< Palette in RGB colorspace
- kPaletteYUV ///< Palette in YUV colorspace
- };
-
- /** Converting a color from YUV to RGB colorspace. */
- inline static void YUV2RGB(byte y, byte u, byte v, byte &r, byte &g, byte &b) {
- r = CLIP<int>(y + ((1357 * (v - 128)) >> 10), 0, 255);
- g = CLIP<int>(y - (( 691 * (v - 128)) >> 10) - ((333 * (u - 128)) >> 10), 0, 255);
- b = CLIP<int>(y + ((1715 * (u - 128)) >> 10), 0, 255);
- }
- /** Converting a color from RGB to YUV colorspace. */
- inline static void RGB2YUV(byte r, byte g, byte b, byte &y, byte &u, byte &v) {
- y = CLIP<int>( ((r * 306) >> 10) + ((g * 601) >> 10) + ((b * 117) >> 10) , 0, 255);
- u = CLIP<int>(-((r * 172) >> 10) - ((g * 340) >> 10) + ((b * 512) >> 10) + 128, 0, 255);
- v = CLIP<int>( ((r * 512) >> 10) - ((g * 429) >> 10) - ((b * 83) >> 10) + 128, 0, 255);
- }
-
- /** Create a lookup table of a given depth and palette format.
- *
- * @param depth How many bits of each color component to consider.
- * @param format The format the palette should be in.
- */
- PaletteLUT(byte depth, PaletteFormat format);
- ~PaletteLUT();
-
- /** Setting a palette.
- *
- * Any already built slices will be purged.
- *
- * @param palette The palette, plain 256 * 3 color components.
- * @param format The format the palette is in.
- * @param depth The number of significant bits in each color component.
- * @param transp An index that's seen as transparent and therefore ignored.
- */
- void setPalette(const byte *palette, PaletteFormat format, byte depth, int transp = -1);
-
- /** Build the next slice.
- *
- * This will build the next slice, if any.
- */
- void buildNext();
-
- /** Querying the color components to a given palette entry index. */
- void getEntry(byte index, byte &c1, byte &c2, byte &c3) const;
- /** Finding the nearest matching entry.
- *
- * @param c1 The first component of the wanted color.
- * @param c2 The second component of the wanted color.
- * @param c3 The third component of the wanted color.
- * @return The palette entry matching the wanted color best.
- */
- byte findNearest(byte c1, byte c2, byte c3);
- /** Finding the nearest matching entry, together with its color components.
- *
- * @param c1 The first component of the wanted color.
- * @param c2 The second component of the wanted color.
- * @param c3 The third component of the wanted color.
- * @paran nC1 The first component of the found color.
- * @paran nC2 The second component of the found color.
- * @paran nC3 The third component of the found color.
- * @return The palette entry matching the wanted color best.
- */
- byte findNearest(byte c1, byte c2, byte c3, byte &nC1, byte &nC2, byte &nC3);
-
- /** Save the table to a stream.
- *
- * This will build the whole table first.
- */
- bool save(Common::WriteStream &stream);
- /** Load the table from a stream. */
- bool load(Common::SeekableReadStream &stream);
-
-private:
- static const uint32 kVersion = 1;
-
- byte _depth1; ///< The table's depth for one dimension.
- byte _depth2; ///< The table's depth for two dimensions.
- byte _shift; ///< Amount to shift to adjust for the table's depth.
-
- uint32 _dim1; ///< The table's entry offset for one dimension.
- uint32 _dim2; ///< The table's entry offset for two dimensions.
- uint32 _dim3; ///< The table's entry offset for three dimensions.
-
- int _transp; ///< The transparent palette index.
-
- PaletteFormat _format; ///< The table's palette format.
- byte _lutPal[768]; ///< The palette used for looking up a color.
- byte _realPal[768]; ///< The original palette.
-
- uint32 _got; ///< Number of slices generated.
- byte *_gots; ///< Map of generated slices.
- byte *_lut; ///< The lookup table.
-
- /** Building a specified slice. */
- void build(int d1);
- /** Calculates the index into the lookup table for a given color. */
- inline int getIndex(byte c1, byte c2, byte c3) const;
-};
-
-/** The Sierra-2-4A ("Filter Light") error distribution dithering algorithm.
- *
- * The image will be dithered line by line and pixel by pixel, without earlier
- * values having to be changed.
-*/
-class SierraLight {
-public:
- /** Constructor.
- *
- * @param width The width of the image to dither.
- * @param palLUT The palette to which to dither.
- */
- SierraLight(int16 width, PaletteLUT *palLUT);
- ~SierraLight();
-
- /** Signals that a new frame or image is about to be dithered.
- *
- * This clears all collected errors, so that a new image (of the same
- * height and with the same palette) can be dithered.
- */
- void newFrame();
- /** Signals that a new line is about the begin.
- *
- * The current line's errors will be forgotten and values collected for the
- * next line will now count as the current line's.
- */
- void nextLine();
- /** Dither a pixel.
- *
- * @param c1 The first color component of the pixel.
- * @param c2 The second color component of the pixel.
- * @param c3 The third color component of the pixel.
- * @param x The pixel's x coordinate within the image.
- */
- byte dither(byte c1, byte c2, byte c3, uint32 x);
-
-protected:
- int16 _width; ///< The image's width.
-
- PaletteLUT *_palLUT; ///< The palette against which to dither.
-
- int32 *_errorBuf; ///< Big buffer for all collected errors.
- int32 *_errors[2]; ///< Pointers into the error buffer for two lines.
- int _curLine; ///< Which one is the current line?
-
- /** Querying a pixel's errors. */
- inline void getErrors(uint32 x, int32 &eC1, int32 &eC2, int32 &eC3);
- /** Adding a pixel's errors. */
- inline void addErrors(uint32 x, int32 eC1, int32 eC2, int32 eC3);
-};
-
-} // End of namespace Graphics
-
-#endif
diff --git a/graphics/font.cpp b/graphics/font.cpp
index cdf9090625..3f7152a95e 100644
--- a/graphics/font.cpp
+++ b/graphics/font.cpp
@@ -19,771 +19,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "common/stream.h"
-#include "common/file.h"
-#include "common/endian.h"
+#include "graphics/font.h"
+
#include "common/array.h"
-#include "common/textconsole.h"
#include "common/util.h"
-#include "graphics/font.h"
-#include "graphics/surface.h"
namespace Graphics {
-void free_font(NewFontData *pf);
-
-NewFont::~NewFont() {
- if (_font) {
- free_font(_font);
- }
-}
-
-int NewFont::getCharWidth(byte chr) const {
- // If no width table is specified, return the maximum width
- if (!_desc.width)
- return _desc.maxwidth;
- // If this character is not included in the font, use the default char.
- if (chr < _desc.firstchar || _desc.firstchar + _desc.size < chr) {
- chr = _desc.defaultchar;
- }
- return _desc.width[chr - _desc.firstchar];
-}
-
-
-template <typename PixelType>
-void drawCharIntern(byte *ptr, uint pitch, const bitmap_t *src, int h, int minX, int maxX, const PixelType color) {
- const bitmap_t maxXMask = ~((1 << (16-maxX)) - 1);
- while (h-- > 0) {
- bitmap_t buffer = READ_UINT16(src);
- src++;
-
- buffer &= maxXMask;
- buffer <<= minX;
- PixelType *tmp = (PixelType *)ptr;
- while (buffer != 0) {
- if ((buffer & 0x8000) != 0)
- *tmp = color;
- tmp++;
- buffer <<= 1;
- }
-
- ptr += pitch;
- }
-}
-
-void NewFont::drawChar(Surface *dst, byte chr, const int tx, const int ty, const uint32 color) const {
- assert(dst != 0);
-
- assert(_desc.bits != 0 && _desc.maxwidth <= 16);
- assert(dst->format.bytesPerPixel == 1 || dst->format.bytesPerPixel == 2);
-
- // If this character is not included in the font, use the default char.
- if (chr < _desc.firstchar || chr >= _desc.firstchar + _desc.size) {
- chr = _desc.defaultchar;
- }
-
- chr -= _desc.firstchar;
-
- int bbw, bbh, bbx, bby;
-
- // Get the bounding box of the character
- if (!_desc.bbx) {
- bbw = _desc.fbbw;
- bbh = _desc.fbbh;
- bbx = _desc.fbbx;
- bby = _desc.fbby;
- } else {
- bbw = _desc.bbx[chr].w;
- bbh = _desc.bbx[chr].h;
- bbx = _desc.bbx[chr].x;
- bby = _desc.bbx[chr].y;
- }
-
- byte *ptr = (byte *)dst->getBasePtr(tx + bbx, ty + _desc.ascent - bby - bbh);
-
- const bitmap_t *tmp = _desc.bits + (_desc.offset ? _desc.offset[chr] : (chr * _desc.fbbh));
-
- int y = MIN(bbh, ty + _desc.ascent - bby);
- tmp += bbh - y;
- y -= MAX(0, ty + _desc.ascent - bby - dst->h);
-
- if (dst->format.bytesPerPixel == 1)
- drawCharIntern<byte>(ptr, dst->pitch, tmp, y, MAX(0, -(tx + bbx)), MIN(bbw, dst->w - tx - bbx), color);
- else if (dst->format.bytesPerPixel == 2)
- drawCharIntern<uint16>(ptr, dst->pitch, tmp, y, MAX(0, -(tx + bbx)), MIN(bbw, dst->w - tx - bbx), color);
-}
-
-
-#pragma mark -
-
-/* BEGIN font.h*/
-/* bitmap_t helper macros*/
-#define BITMAP_WORDS(x) (((x)+15)/16) /* image size in words*/
-#define BITMAP_BYTES(x) (BITMAP_WORDS(x)*sizeof(bitmap_t))
-#define BITMAP_BITSPERIMAGE (sizeof(bitmap_t) * 8)
-#define BITMAP_BITVALUE(n) ((bitmap_t) (((bitmap_t) 1) << (n)))
-#define BITMAP_FIRSTBIT (BITMAP_BITVALUE(BITMAP_BITSPERIMAGE - 1))
-#define BITMAP_TESTBIT(m) ((m) & BITMAP_FIRSTBIT)
-#define BITMAP_SHIFTBIT(m) ((bitmap_t) ((m) << 1))
-
-/* builtin C-based proportional/fixed font structure */
-/* based on The Microwindows Project http://microwindows.org */
-struct NewFontData {
- char * name; /* font name*/
- int maxwidth; /* max width in pixels*/
- int height; /* height in pixels*/
- int ascent; /* ascent (baseline) height*/
- int firstchar; /* first character in bitmap*/
- int size; /* font size in glyphs*/
- bitmap_t* bits; /* 16-bit right-padded bitmap data*/
- unsigned long* offset; /* offsets into bitmap data*/
- unsigned char* width; /* character widths or NULL if fixed*/
- BBX* bbx; /* character bounding box or NULL if fixed */
- int defaultchar; /* default char (not glyph index)*/
- long bits_size; /* # words of bitmap_t bits*/
-
- /* unused by runtime system, read in by convbdf*/
- char * facename; /* facename of font*/
- char * copyright; /* copyright info for loadable fonts*/
- int pixel_size;
- int descent;
- int fbbw, fbbh, fbbx, fbby;
-};
-/* END font.h*/
-
-#define isprefix(buf,str) (!strncmp(buf, str, strlen(str)))
-#define strequal(s1,s2) (!strcmp(s1, s2))
-
-#define EXTRA 300
-
-int start_char = 0;
-int limit_char = 255;
-
-NewFontData* bdf_read_font(Common::SeekableReadStream &fp);
-int bdf_read_header(Common::SeekableReadStream &fp, NewFontData* pf);
-int bdf_read_bitmaps(Common::SeekableReadStream &fp, NewFontData* pf);
-char * bdf_getline(Common::SeekableReadStream &fp, char *buf, int len);
-bitmap_t bdf_hexval(unsigned char *buf);
-
-void free_font(NewFontData* pf) {
- if (!pf)
- return;
- free(pf->name);
- free(pf->facename);
- free(pf->bits);
- free(pf->offset);
- free(pf->width);
- free(pf->bbx);
- free(pf);
-}
-
-/* build incore structure from .bdf file*/
-NewFontData* bdf_read_font(Common::SeekableReadStream &fp) {
- NewFontData* pf;
- uint32 pos = fp.pos();
-
- pf = (NewFontData*)calloc(1, sizeof(NewFontData));
- if (!pf)
- goto errout;
-
- if (!bdf_read_header(fp, pf)) {
- warning("Error reading font header");
- goto errout;
- }
-
- fp.seek(pos, SEEK_SET);
-
- if (!bdf_read_bitmaps(fp, pf)) {
- warning("Error reading font bitmaps");
- goto errout;
- }
-
- return pf;
-
- errout:
- free_font(pf);
- return NULL;
-}
-
-/* read bdf font header information, return 0 on error*/
-int bdf_read_header(Common::SeekableReadStream &fp, NewFontData* pf) {
- int encoding = 0;
- int nchars = 0, maxwidth, maxheight;
- int firstchar = 65535;
- int lastchar = -1;
- char buf[256];
- char facename[256];
- char copyright[256];
-
- /* set certain values to errors for later error checking*/
- pf->defaultchar = -1;
- pf->ascent = -1;
- pf->descent = -1;
-
- for (;;) {
- if (!bdf_getline(fp, buf, sizeof(buf))) {
- warning("Error: EOF on file");
- return 0;
- }
-
- /* note: the way sscanf is used here ensures that a terminating null
- character is automatically added. Refer to:
- http://pubs.opengroup.org/onlinepubs/009695399/functions/fscanf.html */
-
- if (isprefix(buf, "FONT ")) { /* not required*/
- if (sscanf(buf, "FONT %[^\n]", facename) != 1) {
- warning("Error: bad 'FONT'");
- return 0;
- }
- pf->facename = strdup(facename);
- continue;
- }
- if (isprefix(buf, "COPYRIGHT ")) { /* not required*/
- if (sscanf(buf, "COPYRIGHT \"%[^\"]", copyright) != 1) {
- warning("Error: bad 'COPYRIGHT'");
- return 0;
- }
- pf->copyright = strdup(copyright);
- continue;
- }
- if (isprefix(buf, "DEFAULT_CHAR ")) { /* not required*/
- if (sscanf(buf, "DEFAULT_CHAR %d", &pf->defaultchar) != 1) {
- warning("Error: bad 'DEFAULT_CHAR'");
- return 0;
- }
- }
- if (isprefix(buf, "FONT_DESCENT ")) {
- if (sscanf(buf, "FONT_DESCENT %d", &pf->descent) != 1) {
- warning("Error: bad 'FONT_DESCENT'");
- return 0;
- }
- continue;
- }
- if (isprefix(buf, "FONT_ASCENT ")) {
- if (sscanf(buf, "FONT_ASCENT %d", &pf->ascent) != 1) {
- warning("Error: bad 'FONT_ASCENT'");
- return 0;
- }
- continue;
- }
- if (isprefix(buf, "FONTBOUNDINGBOX ")) {
- if (sscanf(buf, "FONTBOUNDINGBOX %d %d %d %d",
- &pf->fbbw, &pf->fbbh, &pf->fbbx, &pf->fbby) != 4) {
- warning("Error: bad 'FONTBOUNDINGBOX'");
- return 0;
- }
- continue;
- }
- if (isprefix(buf, "CHARS ")) {
- if (sscanf(buf, "CHARS %d", &nchars) != 1) {
- warning("Error: bad 'CHARS'");
- return 0;
- }
- continue;
- }
-
- /*
- * Reading ENCODING is necessary to get firstchar/lastchar
- * which is needed to pre-calculate our offset and widths
- * array sizes.
- */
- if (isprefix(buf, "ENCODING ")) {
- if (sscanf(buf, "ENCODING %d", &encoding) != 1) {
- warning("Error: bad 'ENCODING'");
- return 0;
- }
- if (encoding >= 0 &&
- encoding <= limit_char &&
- encoding >= start_char) {
-
- if (firstchar > encoding)
- firstchar = encoding;
- if (lastchar < encoding)
- lastchar = encoding;
- }
- continue;
- }
- if (strequal(buf, "ENDFONT"))
- break;
- }
-
- /* calc font height*/
- if (pf->ascent < 0 || pf->descent < 0 || firstchar < 0) {
- warning("Error: Invalid BDF file, requires FONT_ASCENT/FONT_DESCENT/ENCODING");
- return 0;
- }
- pf->height = pf->ascent + pf->descent;
-
- /* calc default char*/
- if (pf->defaultchar < 0 ||
- pf->defaultchar < firstchar ||
- pf->defaultchar > limit_char )
- pf->defaultchar = firstchar;
-
- /* calc font size (offset/width entries)*/
- pf->firstchar = firstchar;
- pf->size = lastchar - firstchar + 1;
-
- /* use the font boundingbox to get initial maxwidth*/
- /*maxwidth = pf->fbbw - pf->fbbx;*/
- maxwidth = pf->fbbw;
- maxheight = pf->fbbh;
-
- /* initially use font bounding box for bits allocation*/
- pf->bits_size = nchars * BITMAP_WORDS(maxwidth) * maxheight;
-
- /* allocate bits, offset, and width arrays*/
- pf->bits = (bitmap_t *)malloc(pf->bits_size * sizeof(bitmap_t) + EXTRA);
- pf->offset = (unsigned long *)malloc(pf->size * sizeof(unsigned long));
- pf->width = (unsigned char *)malloc(pf->size * sizeof(unsigned char));
- pf->bbx = (BBX *)malloc(pf->size * sizeof(BBX));
-
- if (!pf->bits || !pf->offset || !pf->width) {
- warning("Error: no memory for font load");
- return 0;
- }
-
- return 1;
-}
-
-/* read bdf font bitmaps, return 0 on error*/
-int bdf_read_bitmaps(Common::SeekableReadStream &fp, NewFontData* pf) {
- long ofs = 0;
- int maxwidth = 0;
- int i, k, encoding = 0, width = 0;
- int bbw = 0, bbh = 0, bbx = 0, bby = 0;
- int proportional = 0;
- int need_bbx = 0;
- int encodetable = 0;
- long l;
- char buf[256];
-
- /* initially mark offsets as not used*/
- for (i = 0; i < pf->size; ++i)
- pf->offset[i] = (unsigned long)-1;
-
- for (;;) {
- if (!bdf_getline(fp, buf, sizeof(buf))) {
- warning("Error: EOF on file");
- return 0;
- }
- if (isprefix(buf, "STARTCHAR")) {
- encoding = width = bbw = bbh = bbx = bby = -1;
- continue;
- }
- if (isprefix(buf, "ENCODING ")) {
- if (sscanf(buf, "ENCODING %d", &encoding) != 1) {
- warning("Error: bad 'ENCODING'");
- return 0;
- }
- if (encoding < start_char || encoding > limit_char)
- encoding = -1;
- continue;
- }
- if (isprefix(buf, "DWIDTH ")) {
- if (sscanf(buf, "DWIDTH %d", &width) != 1) {
- warning("Error: bad 'DWIDTH'");
- return 0;
- }
- /* use font boundingbox width if DWIDTH <= 0*/
- if (width <= 0)
- width = pf->fbbw - pf->fbbx;
- continue;
- }
- if (isprefix(buf, "BBX ")) {
- if (sscanf(buf, "BBX %d %d %d %d", &bbw, &bbh, &bbx, &bby) != 4) {
- warning("Error: bad 'BBX'");
- return 0;
- }
- continue;
- }
- if (strequal(buf, "BITMAP")) {
- bitmap_t *ch_bitmap = pf->bits + ofs;
- int ch_words;
-
- if (encoding < 0)
- continue;
-
- /* set bits offset in encode map*/
- if (pf->offset[encoding-pf->firstchar] != (unsigned long)-1) {
- warning("Error: duplicate encoding for character %d (0x%02x), ignoring duplicate",
- encoding, encoding);
- continue;
- }
- pf->offset[encoding-pf->firstchar] = ofs;
- pf->width[encoding-pf->firstchar] = width;
-
- pf->bbx[encoding-pf->firstchar].w = bbw;
- pf->bbx[encoding-pf->firstchar].h = bbh;
- pf->bbx[encoding-pf->firstchar].x = bbx;
- pf->bbx[encoding-pf->firstchar].y = bby;
-
- if (width > maxwidth)
- maxwidth = width;
-
- /* clear bitmap*/
- memset(ch_bitmap, 0, BITMAP_BYTES(bbw) * bbh);
-
- ch_words = BITMAP_WORDS(bbw);
-
- /* read bitmaps*/
- for (i = 0; i < bbh; ++i) {
- if (!bdf_getline(fp, buf, sizeof(buf))) {
- warning("Error: EOF reading BITMAP data");
- return 0;
- }
- if (isprefix(buf, "ENDCHAR"))
- break;
-
- for (k = 0; k < ch_words; ++k) {
- bitmap_t value;
-
- value = bdf_hexval((unsigned char *)buf);
- if (bbw > 8) {
- WRITE_UINT16(ch_bitmap, value);
- } else {
- WRITE_UINT16(ch_bitmap, value << 8);
- }
- ch_bitmap++;
- }
- }
-
- ofs += ch_words * bbh;
- continue;
- }
- if (strequal(buf, "ENDFONT"))
- break;
- }
-
- /* set max width*/
- pf->maxwidth = maxwidth;
-
- /* change unused offset/width values to default char values*/
- for (i = 0; i < pf->size; ++i) {
- int defchar = pf->defaultchar - pf->firstchar;
-
- if (pf->offset[i] == (unsigned long)-1) {
- pf->offset[i] = pf->offset[defchar];
- pf->width[i] = pf->width[defchar];
- pf->bbx[i].w = pf->bbx[defchar].w;
- pf->bbx[i].h = pf->bbx[defchar].h;
- pf->bbx[i].x = pf->bbx[defchar].x;
- pf->bbx[i].y = pf->bbx[defchar].y;
- }
- }
-
- /* determine whether font doesn't require encode table*/
- l = 0;
- for (i = 0; i < pf->size; ++i) {
- if (pf->offset[i] != (unsigned long)l) {
- encodetable = 1;
- break;
- }
- l += BITMAP_WORDS(pf->bbx[i].w) * pf->bbx[i].h;
- }
- if (!encodetable) {
- free(pf->offset);
- pf->offset = NULL;
- }
-
- /* determine whether font is fixed-width*/
- for (i = 0; i < pf->size; ++i) {
- if (pf->width[i] != maxwidth) {
- proportional = 1;
- break;
- }
- }
- if (!proportional) {
- free(pf->width);
- pf->width = NULL;
- }
-
- /* determine if the font needs a bbx table */
- for (i = 0; i < pf->size; ++i) {
- if (pf->bbx[i].w != pf->fbbw || pf->bbx[i].h != pf->fbbh || pf->bbx[i].x != pf->fbbx || pf->bbx[i].y != pf->fbby) {
- need_bbx = 1;
- break;
- }
- }
- if (!need_bbx) {
- free(pf->bbx);
- pf->bbx = NULL;
- }
-
- /* reallocate bits array to actual bits used*/
- if (ofs < pf->bits_size) {
- bitmap_t *tmp = (bitmap_t *)realloc(pf->bits, ofs * sizeof(bitmap_t));
- if (tmp != NULL || ofs == 0)
- pf->bits = tmp;
- else
- error("bdf_read_bitmaps: Error while reallocating memory");
- pf->bits_size = ofs;
- }
- else {
- if (ofs > pf->bits_size) {
- warning("Warning: DWIDTH spec > max FONTBOUNDINGBOX");
- if (ofs > pf->bits_size+EXTRA) {
- warning("Error: Not enough bits initially allocated");
- return 0;
- }
- pf->bits_size = ofs;
- }
- }
-
- return 1;
-}
-
-/* read the next non-comment line, returns buf or NULL if EOF*/
-// TODO: Can we use SeekableReadStream::readLine instead?
-char *bdf_getline(Common::SeekableReadStream &fp, char *buf, int len) {
- int c;
- char *b;
-
- for (;;) {
- b = buf;
- while (!fp.eos()) {
- c = fp.readByte();
- if (c == '\r')
- continue;
- if (c == '\n')
- break;
- if (b - buf >= (len - 1))
- break;
- *b++ = c;
- }
- *b = '\0';
- if (fp.eos() && b == buf)
- return NULL;
- if (b != buf && !isprefix(buf, "COMMENT"))
- break;
- }
- return buf;
-}
-
-/* return hex value of buffer */
-bitmap_t bdf_hexval(unsigned char *buf) {
- bitmap_t val = 0;
-
- for (unsigned char *ptr = buf; *ptr; ptr++) {
- int c = *ptr;
-
- if (c >= '0' && c <= '9')
- c -= '0';
- else if (c >= 'A' && c <= 'F')
- c = c - 'A' + 10;
- else if (c >= 'a' && c <= 'f')
- c = c - 'a' + 10;
- else
- c = 0;
- val = (val << 4) | c;
- }
- return val;
-}
-
-NewFont *NewFont::loadFont(Common::SeekableReadStream &stream) {
- NewFontData *data = bdf_read_font(stream);
- if (!data || stream.err()) {
- free_font(data);
- return 0;
- }
-
- FontDesc desc;
- desc.name = data->name;
- desc.maxwidth = data->maxwidth;
- desc.height = data->height;
- desc.fbbw = data->fbbw;
- desc.fbbh = data->fbbh;
- desc.fbbx = data->fbbx;
- desc.fbby = data->fbby;
- desc.ascent = data->ascent;
- desc.firstchar = data->firstchar;
- desc.size = data->size;
- desc.bits = data->bits;
- desc.offset = data->offset;
- desc.width = data->width;
- desc.bbx = data->bbx;
- desc.defaultchar = data->defaultchar;
- desc.bits_size = data->bits_size;
-
- return new NewFont(desc, data);
-}
-
-bool NewFont::cacheFontData(const NewFont &font, const Common::String &filename) {
- Common::DumpFile cacheFile;
- if (!cacheFile.open(filename)) {
- warning("Couldn't open file '%s' for writing", filename.c_str());
- return false;
- }
-
- cacheFile.writeUint16BE(font._desc.maxwidth);
- cacheFile.writeUint16BE(font._desc.height);
- cacheFile.writeUint16BE(font._desc.fbbw);
- cacheFile.writeUint16BE(font._desc.fbbh);
- cacheFile.writeSint16BE(font._desc.fbbx);
- cacheFile.writeSint16BE(font._desc.fbby);
- cacheFile.writeUint16BE(font._desc.ascent);
- cacheFile.writeUint16BE(font._desc.firstchar);
- cacheFile.writeUint16BE(font._desc.size);
- cacheFile.writeUint16BE(font._desc.defaultchar);
- cacheFile.writeUint32BE(font._desc.bits_size);
-
- for (long i = 0; i < font._desc.bits_size; ++i) {
- cacheFile.writeUint16BE(font._desc.bits[i]);
- }
-
- if (font._desc.offset) {
- cacheFile.writeByte(1);
- for (int i = 0; i < font._desc.size; ++i) {
- cacheFile.writeUint32BE(font._desc.offset[i]);
- }
- } else {
- cacheFile.writeByte(0);
- }
-
- if (font._desc.width) {
- cacheFile.writeByte(1);
- for (int i = 0; i < font._desc.size; ++i) {
- cacheFile.writeByte(font._desc.width[i]);
- }
- } else {
- cacheFile.writeByte(0);
- }
-
- if (font._desc.bbx) {
- cacheFile.writeByte(1);
- for (int i = 0; i < font._desc.size; ++i) {
- cacheFile.writeByte(font._desc.bbx[i].w);
- cacheFile.writeByte(font._desc.bbx[i].h);
- cacheFile.writeByte(font._desc.bbx[i].x);
- cacheFile.writeByte(font._desc.bbx[i].y);
- }
- } else {
- cacheFile.writeByte(0);
- }
-
- return !cacheFile.err();
-}
-
-NewFont *NewFont::loadFromCache(Common::SeekableReadStream &stream) {
- NewFont *font = 0;
-
- NewFontData *data = (NewFontData *)malloc(sizeof(NewFontData));
- if (!data)
- return 0;
-
- memset(data, 0, sizeof(NewFontData));
-
- data->maxwidth = stream.readUint16BE();
- data->height = stream.readUint16BE();
- data->fbbw = stream.readUint16BE();
- data->fbbh = stream.readUint16BE();
- data->fbbx = stream.readSint16BE();
- data->fbby = stream.readSint16BE();
- data->ascent = stream.readUint16BE();
- data->firstchar = stream.readUint16BE();
- data->size = stream.readUint16BE();
- data->defaultchar = stream.readUint16BE();
- data->bits_size = stream.readUint32BE();
-
- data->bits = (bitmap_t *)malloc(sizeof(bitmap_t) * data->bits_size);
- if (!data->bits) {
- free(data);
- return 0;
- }
-
- for (long i = 0; i < data->bits_size; ++i) {
- data->bits[i] = stream.readUint16BE();
- }
-
- bool hasOffsetTable = (stream.readByte() != 0);
- if (hasOffsetTable) {
- data->offset = (unsigned long *)malloc(sizeof(unsigned long) * data->size);
- if (!data->offset) {
- free(data->bits);
- free(data);
- return 0;
- }
-
- for (int i = 0; i < data->size; ++i) {
- data->offset[i] = stream.readUint32BE();
- }
- }
-
- bool hasWidthTable = (stream.readByte() != 0);
- if (hasWidthTable) {
- data->width = (unsigned char *)malloc(sizeof(unsigned char) * data->size);
- if (!data->width) {
- free(data->bits);
- free(data->offset);
- free(data);
- return 0;
- }
-
- for (int i = 0; i < data->size; ++i) {
- data->width[i] = stream.readByte();
- }
- }
-
- bool hasBBXTable = (stream.readByte() != 0);
- if (hasBBXTable) {
- data->bbx = (BBX *)malloc(sizeof(BBX) * data->size);
- if (!data->bbx) {
- free(data->bits);
- free(data->offset);
- free(data->width);
- free(data);
- return 0;
- }
-
- for (int i = 0; i < data->size; ++i) {
- data->bbx[i].w = (int8)stream.readByte();
- data->bbx[i].h = (int8)stream.readByte();
- data->bbx[i].x = (int8)stream.readByte();
- data->bbx[i].y = (int8)stream.readByte();
- }
- }
-
- if (stream.err() || stream.eos()) {
- free(data->bits);
- free(data->offset);
- free(data->width);
- free(data);
- return 0;
- }
-
- FontDesc desc;
- desc.name = data->name;
- desc.maxwidth = data->maxwidth;
- desc.height = data->height;
- desc.fbbw = data->fbbw;
- desc.fbbh = data->fbbh;
- desc.fbbx = data->fbbx;
- desc.fbby = data->fbby;
- desc.ascent = data->ascent;
- desc.firstchar = data->firstchar;
- desc.size = data->size;
- desc.bits = data->bits;
- desc.offset = data->offset;
- desc.width = data->width;
- desc.bbx = data->bbx;
- desc.defaultchar = data->defaultchar;
- desc.bits_size = data->bits_size;
-
- font = new NewFont(desc, data);
- if (!font) {
- free(data->bits);
- free(data->offset);
- free(data->width);
- free(data);
- return 0;
- }
-
- return font;
-}
-
-#pragma mark -
-
-
int Font::getStringWidth(const Common::String &str) const {
int space = 0;
@@ -944,7 +186,7 @@ int Font::wordWrapText(const Common::String &str, int maxWidth, Common::Array<Co
if (lineWidth > 0) {
wrapper.add(line, lineWidth);
// Trim left side
- while (tmpStr.size() && isspace(tmpStr[0])) {
+ while (tmpStr.size() && isspace(static_cast<unsigned char>(tmpStr[0]))) {
tmpWidth -= getCharWidth(tmpStr[0]);
tmpStr.deleteChar(0);
}
diff --git a/graphics/font.h b/graphics/font.h
index dc75f86e1f..9c0b4affc1 100644
--- a/graphics/font.h
+++ b/graphics/font.h
@@ -25,7 +25,6 @@
#include "common/str.h"
namespace Common {
-class SeekableReadStream;
template<class T> class Array;
}
@@ -114,68 +113,6 @@ public:
int wordWrapText(const Common::String &str, int maxWidth, Common::Array<Common::String> &lines) const;
};
-typedef uint16 bitmap_t; /* bitmap image unit size*/
-
-struct BBX {
- int8 w;
- int8 h;
- int8 x;
- int8 y;
-};
-
-/* builtin C-based proportional/fixed font structure */
-/* based on The Microwindows Project http://microwindows.org */
-struct FontDesc {
- const char * name; /* font name*/
- int maxwidth; /* max width in pixels*/
- int height; /* height in pixels*/
- int fbbw, fbbh, fbbx, fbby; /* max bounding box */
- int ascent; /* ascent (baseline) height*/
- int firstchar; /* first character in bitmap*/
- int size; /* font size in glyphs*/
- const bitmap_t* bits; /* 16-bit right-padded bitmap data*/
- const unsigned long* offset; /* offsets into bitmap data*/
- const unsigned char* width; /* character widths or NULL if fixed*/
- const BBX* bbx; /* character bounding box or NULL if fixed */
- int defaultchar; /* default char (not glyph index)*/
- long bits_size; /* # words of bitmap_t bits*/
-};
-
-struct NewFontData;
-
-class NewFont : public Font {
-protected:
- FontDesc _desc;
- NewFontData *_font;
-
-public:
- NewFont(const FontDesc &desc, NewFontData *font = 0) : _desc(desc), _font(font) {}
- ~NewFont();
-
- virtual int getFontHeight() const { return _desc.height; }
- virtual int getMaxCharWidth() const { return _desc.maxwidth; }
-
- virtual int getCharWidth(byte chr) const;
- virtual void drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const;
-
- static NewFont *loadFont(Common::SeekableReadStream &stream);
- static bool cacheFontData(const NewFont &font, const Common::String &filename);
- static NewFont *loadFromCache(Common::SeekableReadStream &stream);
-};
-
-#define DEFINE_FONT(n) \
- const NewFont *n = 0; \
- void create_##n() { \
- n = new NewFont(desc); \
- }
-
-#define FORWARD_DECLARE_FONT(n) \
- extern const NewFont *n; \
- extern void create_##n()
-
-#define INIT_FONT(n) \
- create_##n()
-
} // End of namespace Graphics
#endif
diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp
index f40cf97602..a10d27a2b0 100644
--- a/graphics/fontman.cpp
+++ b/graphics/fontman.cpp
@@ -19,11 +19,15 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "graphics/font.h"
#include "graphics/fontman.h"
+#include "graphics/font.h"
+#include "graphics/fonts/bdf.h"
+
#include "common/translation.h"
+namespace Common {
DECLARE_SINGLETON(Graphics::FontManager);
+}
namespace Graphics {
@@ -75,6 +79,26 @@ bool FontManager::assignFontToName(const Common::String &name, const Font *font)
return true;
}
+bool FontManager::setFont(FontUsage usage, const Font *font) {
+ switch (usage) {
+ case kConsoleFont:
+ delete g_consolefont;
+ g_consolefont = (const BdfFont *)font;
+ break;
+ case kGUIFont:
+ delete g_sysfont;
+ g_sysfont = (const BdfFont *)font;
+ break;
+ case kBigGUIFont:
+ delete g_sysfont_big;
+ g_sysfont_big = (const BdfFont *)font;
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
void FontManager::removeFontName(const Common::String &name) {
Common::String lowercaseName = name;
lowercaseName.toLowercase();
diff --git a/graphics/fontman.h b/graphics/fontman.h
index 858a733d45..09c1a198ff 100644
--- a/graphics/fontman.h
+++ b/graphics/fontman.h
@@ -60,6 +60,16 @@ public:
bool assignFontToName(const Common::String &name, const Font *font);
/**
+ * Associates a BDF font object with an 'usage'. This is useful for platforms
+ * with a screen DPI much larger than a regular desktop workstation.
+ *
+ * @param name the name of the font
+ * @param font the font object
+ * @return true on success, false on failure
+ */
+ bool setFont(FontUsage usage, const Font *font);
+
+ /**
* Removes binding from name to font
*
* @param name name which should be removed
diff --git a/graphics/fonts/bdf.cpp b/graphics/fonts/bdf.cpp
new file mode 100644
index 0000000000..58c48ed877
--- /dev/null
+++ b/graphics/fonts/bdf.cpp
@@ -0,0 +1,796 @@
+/* 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.
+ */
+
+#include "graphics/fonts/bdf.h"
+
+#include "common/file.h"
+#include "common/endian.h"
+#include "common/textconsole.h"
+
+#include "graphics/surface.h"
+
+namespace Graphics {
+
+void free_font(BdfFontData *pf);
+
+BdfFont::~BdfFont() {
+ if (_font) {
+ free_font(_font);
+ }
+}
+
+int BdfFont::getFontHeight() const {
+ return _desc.height;
+}
+
+int BdfFont::getMaxCharWidth() const {
+ return _desc.maxwidth;
+}
+
+int BdfFont::getCharWidth(byte chr) const {
+ // If no width table is specified, return the maximum width
+ if (!_desc.width)
+ return _desc.maxwidth;
+ // If this character is not included in the font, use the default char.
+ if (chr < _desc.firstchar || _desc.firstchar + _desc.size < chr) {
+ chr = _desc.defaultchar;
+ }
+ return _desc.width[chr - _desc.firstchar];
+}
+
+
+template<typename PixelType>
+void drawCharIntern(byte *ptr, uint pitch, const bitmap_t *src, int h, int minX, int maxX, const PixelType color) {
+ const bitmap_t maxXMask = ~((1 << (16 - maxX)) - 1);
+ while (h-- > 0) {
+ bitmap_t buffer = READ_UINT16(src);
+ src++;
+
+ buffer &= maxXMask;
+ buffer <<= minX;
+ PixelType *tmp = (PixelType *)ptr;
+ while (buffer != 0) {
+ if ((buffer & 0x8000) != 0)
+ *tmp = color;
+ tmp++;
+ buffer <<= 1;
+ }
+
+ ptr += pitch;
+ }
+}
+
+void BdfFont::drawChar(Surface *dst, byte chr, const int tx, const int ty, const uint32 color) const {
+ assert(dst != 0);
+
+ // asserting _desc.maxwidth <= 50: let the theme designer decide what looks best
+ assert(_desc.bits != 0 && _desc.maxwidth <= 50);
+ assert(dst->format.bytesPerPixel == 1 || dst->format.bytesPerPixel == 2);
+
+ // If this character is not included in the font, use the default char.
+ if (chr < _desc.firstchar || chr >= _desc.firstchar + _desc.size) {
+ chr = _desc.defaultchar;
+ }
+
+ chr -= _desc.firstchar;
+
+ int bbw, bbh, bbx, bby;
+
+ // Get the bounding box of the character
+ if (!_desc.bbx) {
+ bbw = _desc.fbbw;
+ bbh = _desc.fbbh;
+ bbx = _desc.fbbx;
+ bby = _desc.fbby;
+ } else {
+ bbw = _desc.bbx[chr].w;
+ bbh = _desc.bbx[chr].h;
+ bbx = _desc.bbx[chr].x;
+ bby = _desc.bbx[chr].y;
+ }
+
+ byte *ptr = (byte *)dst->getBasePtr(tx + bbx, ty + _desc.ascent - bby - bbh);
+
+ const bitmap_t *tmp = _desc.bits + (_desc.offset ? _desc.offset[chr] : (chr * _desc.fbbh));
+
+ int y = MIN(bbh, ty + _desc.ascent - bby);
+ tmp += bbh - y;
+ y -= MAX(0, ty + _desc.ascent - bby - dst->h);
+
+ if (dst->format.bytesPerPixel == 1)
+ drawCharIntern<byte>(ptr, dst->pitch, tmp, y, MAX(0, -(tx + bbx)), MIN(bbw, dst->w - tx - bbx), color);
+ else if (dst->format.bytesPerPixel == 2)
+ drawCharIntern<uint16>(ptr, dst->pitch, tmp, y, MAX(0, -(tx + bbx)), MIN(bbw, dst->w - tx - bbx), color);
+}
+
+
+#pragma mark -
+
+/* BEGIN font.h*/
+/* bitmap_t helper macros*/
+#define BITMAP_WORDS(x) (((x)+15)/16) /* image size in words*/
+#define BITMAP_BYTES(x) (BITMAP_WORDS(x)*sizeof(bitmap_t))
+#define BITMAP_BITSPERIMAGE (sizeof(bitmap_t) * 8)
+#define BITMAP_BITVALUE(n) ((bitmap_t) (((bitmap_t) 1) << (n)))
+#define BITMAP_FIRSTBIT (BITMAP_BITVALUE(BITMAP_BITSPERIMAGE - 1))
+#define BITMAP_TESTBIT(m) ((m) & BITMAP_FIRSTBIT)
+#define BITMAP_SHIFTBIT(m) ((bitmap_t) ((m) << 1))
+
+/* builtin C-based proportional/fixed font structure */
+/* based on The Microwindows Project http://microwindows.org */
+struct BdfFontData {
+ char *name; /* font name */
+ int maxwidth; /* max width in pixels */
+ int height; /* height in pixels */
+ int ascent; /* ascent (baseline) height */
+ int firstchar; /* first character in bitmap */
+ int size; /* font size in glyphs */
+ bitmap_t *bits; /* 16-bit right-padded bitmap data */
+ unsigned long *offset; /* offsets into bitmap data */
+ unsigned char *width; /* character widths or NULL if fixed */
+ BBX *bbx; /* character bounding box or NULL if fixed */
+ int defaultchar; /* default char (not glyph index) */
+ long bits_size; /* # words of bitmap_t bits */
+
+ /* unused by runtime system, read in by convbdf */
+ char *facename; /* facename of font */
+ char *copyright; /* copyright info for loadable fonts */
+ int pixel_size;
+ int descent;
+ int fbbw, fbbh, fbbx, fbby;
+};
+/* END font.h */
+
+#define isprefix(buf,str) (!strncmp(buf, str, strlen(str)))
+#define strequal(s1,s2) (!strcmp(s1, s2))
+
+#define EXTRA 300
+
+int start_char = 0;
+int limit_char = 255;
+
+BdfFontData *bdf_read_font(Common::SeekableReadStream &fp);
+int bdf_read_header(Common::SeekableReadStream &fp, BdfFontData *pf);
+int bdf_read_bitmaps(Common::SeekableReadStream &fp, BdfFontData *pf);
+char *bdf_getline(Common::SeekableReadStream &fp, char *buf, int len);
+bitmap_t bdf_hexval(unsigned char *buf);
+
+void free_font(BdfFontData *pf) {
+ if (!pf)
+ return;
+ free(pf->name);
+ free(pf->facename);
+ free(pf->copyright);
+ free(pf->bits);
+ free(pf->offset);
+ free(pf->width);
+ free(pf->bbx);
+ free(pf);
+}
+
+/* build incore structure from .bdf file*/
+BdfFontData *bdf_read_font(Common::SeekableReadStream &fp) {
+ BdfFontData *pf;
+ uint32 pos = fp.pos();
+
+ pf = (BdfFontData *)calloc(1, sizeof(BdfFontData));
+ if (!pf)
+ goto errout;
+
+ if (!bdf_read_header(fp, pf)) {
+ warning("Error reading font header");
+ goto errout;
+ }
+
+ fp.seek(pos, SEEK_SET);
+
+ if (!bdf_read_bitmaps(fp, pf)) {
+ warning("Error reading font bitmaps");
+ goto errout;
+ }
+
+ return pf;
+
+errout:
+ free_font(pf);
+ return NULL;
+}
+
+/* read bdf font header information, return 0 on error*/
+int bdf_read_header(Common::SeekableReadStream &fp, BdfFontData *pf) {
+ int encoding = 0;
+ int nchars = 0, maxwidth, maxheight;
+ int firstchar = 65535;
+ int lastchar = -1;
+ char buf[256];
+ char facename[256];
+ char copyright[256];
+ memset(facename, 0, sizeof(facename));
+ memset(copyright, 0, sizeof(copyright));
+
+ /* set certain values to errors for later error checking*/
+ pf->defaultchar = -1;
+ pf->ascent = -1;
+ pf->descent = -1;
+
+ for (;;) {
+ if (!bdf_getline(fp, buf, sizeof(buf))) {
+ warning("Error: EOF on file");
+ return 0;
+ }
+
+ /* note: the way sscanf is used here ensures that a terminating null
+ character is automatically added. Refer to:
+ http://pubs.opengroup.org/onlinepubs/009695399/functions/fscanf.html */
+
+ if (isprefix(buf, "FONT ")) { /* not required*/
+ if (sscanf(buf, "FONT %[^\n]", facename) != 1) {
+ warning("Error: bad 'FONT'");
+ return 0;
+ }
+
+ pf->facename = strdup(facename);
+ continue;
+ }
+ if (isprefix(buf, "COPYRIGHT ")) { /* not required*/
+ if (sscanf(buf, "COPYRIGHT \"%[^\"]", copyright) != 1) {
+ warning("Error: bad 'COPYRIGHT'");
+ return 0;
+ }
+
+ pf->copyright = strdup(copyright);
+ continue;
+ }
+ if (isprefix(buf, "DEFAULT_CHAR ")) { /* not required*/
+ if (sscanf(buf, "DEFAULT_CHAR %d", &pf->defaultchar) != 1) {
+ warning("Error: bad 'DEFAULT_CHAR'");
+ return 0;
+ }
+ }
+ if (isprefix(buf, "FONT_DESCENT ")) {
+ if (sscanf(buf, "FONT_DESCENT %d", &pf->descent) != 1) {
+ warning("Error: bad 'FONT_DESCENT'");
+ return 0;
+ }
+ continue;
+ }
+ if (isprefix(buf, "FONT_ASCENT ")) {
+ if (sscanf(buf, "FONT_ASCENT %d", &pf->ascent) != 1) {
+ warning("Error: bad 'FONT_ASCENT'");
+ return 0;
+ }
+ continue;
+ }
+ if (isprefix(buf, "FONTBOUNDINGBOX ")) {
+ if (sscanf(buf, "FONTBOUNDINGBOX %d %d %d %d",
+ &pf->fbbw, &pf->fbbh, &pf->fbbx, &pf->fbby) != 4) {
+ warning("Error: bad 'FONTBOUNDINGBOX'");
+ return 0;
+ }
+ continue;
+ }
+ if (isprefix(buf, "CHARS ")) {
+ if (sscanf(buf, "CHARS %d", &nchars) != 1) {
+ warning("Error: bad 'CHARS'");
+ return 0;
+ }
+ continue;
+ }
+
+ /*
+ * Reading ENCODING is necessary to get firstchar/lastchar
+ * which is needed to pre-calculate our offset and widths
+ * array sizes.
+ */
+ if (isprefix(buf, "ENCODING ")) {
+ if (sscanf(buf, "ENCODING %d", &encoding) != 1) {
+ warning("Error: bad 'ENCODING'");
+ return 0;
+ }
+ if (encoding >= 0 &&
+ encoding <= limit_char &&
+ encoding >= start_char) {
+
+ if (firstchar > encoding)
+ firstchar = encoding;
+ if (lastchar < encoding)
+ lastchar = encoding;
+ }
+ continue;
+ }
+ if (strequal(buf, "ENDFONT"))
+ break;
+ }
+
+ /* calc font height*/
+ if (pf->ascent < 0 || pf->descent < 0 || firstchar < 0) {
+ warning("Error: Invalid BDF file, requires FONT_ASCENT/FONT_DESCENT/ENCODING");
+ return 0;
+ }
+ pf->height = pf->ascent + pf->descent;
+
+ /* calc default char*/
+ if (pf->defaultchar < 0 ||
+ pf->defaultchar < firstchar ||
+ pf->defaultchar > limit_char)
+ pf->defaultchar = firstchar;
+
+ /* calc font size (offset/width entries)*/
+ pf->firstchar = firstchar;
+ pf->size = lastchar - firstchar + 1;
+
+ /* use the font boundingbox to get initial maxwidth*/
+ /*maxwidth = pf->fbbw - pf->fbbx;*/
+ maxwidth = pf->fbbw;
+ maxheight = pf->fbbh;
+
+ /* initially use font bounding box for bits allocation*/
+ pf->bits_size = nchars * BITMAP_WORDS(maxwidth) * maxheight;
+
+ /* allocate bits, offset, and width arrays*/
+ pf->bits = (bitmap_t *)malloc(pf->bits_size * sizeof(bitmap_t) + EXTRA);
+ pf->offset = (unsigned long *)malloc(pf->size * sizeof(unsigned long));
+ pf->width = (unsigned char *)malloc(pf->size * sizeof(unsigned char));
+ pf->bbx = (BBX *)malloc(pf->size * sizeof(BBX));
+
+ if (!pf->bits || !pf->offset || !pf->width) {
+ warning("Error: no memory for font load");
+ return 0;
+ }
+
+ return 1;
+}
+
+/* read bdf font bitmaps, return 0 on error*/
+int bdf_read_bitmaps(Common::SeekableReadStream &fp, BdfFontData *pf) {
+ long ofs = 0;
+ int maxwidth = 0;
+ int i, k, encoding = 0, width = 0;
+ int bbw = 0, bbh = 0, bbx = 0, bby = 0;
+ int proportional = 0;
+ int need_bbx = 0;
+ int encodetable = 0;
+ long l;
+ char buf[256];
+
+ /* initially mark offsets as not used*/
+ for (i = 0; i < pf->size; ++i)
+ pf->offset[i] = (unsigned long)-1;
+
+ for (;;) {
+ if (!bdf_getline(fp, buf, sizeof(buf))) {
+ warning("Error: EOF on file");
+ return 0;
+ }
+ if (isprefix(buf, "STARTCHAR")) {
+ encoding = width = bbw = bbh = bbx = bby = -1;
+ continue;
+ }
+ if (isprefix(buf, "ENCODING ")) {
+ if (sscanf(buf, "ENCODING %d", &encoding) != 1) {
+ warning("Error: bad 'ENCODING'");
+ return 0;
+ }
+ if (encoding < start_char || encoding > limit_char)
+ encoding = -1;
+ continue;
+ }
+ if (isprefix(buf, "DWIDTH ")) {
+ if (sscanf(buf, "DWIDTH %d", &width) != 1) {
+ warning("Error: bad 'DWIDTH'");
+ return 0;
+ }
+ /* use font boundingbox width if DWIDTH <= 0*/
+ if (width <= 0)
+ width = pf->fbbw - pf->fbbx;
+ continue;
+ }
+ if (isprefix(buf, "BBX ")) {
+ if (sscanf(buf, "BBX %d %d %d %d", &bbw, &bbh, &bbx, &bby) != 4) {
+ warning("Error: bad 'BBX'");
+ return 0;
+ }
+ continue;
+ }
+ if (strequal(buf, "BITMAP")) {
+ bitmap_t *ch_bitmap = pf->bits + ofs;
+ int ch_words;
+
+ if (encoding < 0)
+ continue;
+
+ /* set bits offset in encode map*/
+ if (pf->offset[encoding - pf->firstchar] != (unsigned long)-1) {
+ warning("Error: duplicate encoding for character %d (0x%02x), ignoring duplicate",
+ encoding, encoding);
+ continue;
+ }
+ pf->offset[encoding - pf->firstchar] = ofs;
+ pf->width[encoding - pf->firstchar] = width;
+
+ pf->bbx[encoding - pf->firstchar].w = bbw;
+ pf->bbx[encoding - pf->firstchar].h = bbh;
+ pf->bbx[encoding - pf->firstchar].x = bbx;
+ pf->bbx[encoding - pf->firstchar].y = bby;
+
+ if (width > maxwidth)
+ maxwidth = width;
+
+ /* clear bitmap*/
+ memset(ch_bitmap, 0, BITMAP_BYTES(bbw) * bbh);
+
+ ch_words = BITMAP_WORDS(bbw);
+
+ /* read bitmaps*/
+ for (i = 0; i < bbh; ++i) {
+ if (!bdf_getline(fp, buf, sizeof(buf))) {
+ warning("Error: EOF reading BITMAP data");
+ return 0;
+ }
+ if (isprefix(buf, "ENDCHAR"))
+ break;
+
+ for (k = 0; k < ch_words; ++k) {
+ bitmap_t value;
+
+ value = bdf_hexval((unsigned char *)buf);
+ if (bbw > 8) {
+ WRITE_UINT16(ch_bitmap, value);
+ } else {
+ WRITE_UINT16(ch_bitmap, value << 8);
+ }
+ ch_bitmap++;
+ }
+ }
+
+ ofs += ch_words * bbh;
+ continue;
+ }
+ if (strequal(buf, "ENDFONT"))
+ break;
+ }
+
+ /* set max width*/
+ pf->maxwidth = maxwidth;
+
+ /* change unused offset/width values to default char values*/
+ for (i = 0; i < pf->size; ++i) {
+ int defchar = pf->defaultchar - pf->firstchar;
+
+ if (pf->offset[i] == (unsigned long)-1) {
+ pf->offset[i] = pf->offset[defchar];
+ pf->width[i] = pf->width[defchar];
+ pf->bbx[i].w = pf->bbx[defchar].w;
+ pf->bbx[i].h = pf->bbx[defchar].h;
+ pf->bbx[i].x = pf->bbx[defchar].x;
+ pf->bbx[i].y = pf->bbx[defchar].y;
+ }
+ }
+
+ /* determine whether font doesn't require encode table*/
+ l = 0;
+ for (i = 0; i < pf->size; ++i) {
+ if (pf->offset[i] != (unsigned long)l) {
+ encodetable = 1;
+ break;
+ }
+ l += BITMAP_WORDS(pf->bbx[i].w) * pf->bbx[i].h;
+ }
+ if (!encodetable) {
+ free(pf->offset);
+ pf->offset = NULL;
+ }
+
+ /* determine whether font is fixed-width*/
+ for (i = 0; i < pf->size; ++i) {
+ if (pf->width[i] != maxwidth) {
+ proportional = 1;
+ break;
+ }
+ }
+ if (!proportional) {
+ free(pf->width);
+ pf->width = NULL;
+ }
+
+ /* determine if the font needs a bbx table */
+ for (i = 0; i < pf->size; ++i) {
+ if (pf->bbx[i].w != pf->fbbw || pf->bbx[i].h != pf->fbbh || pf->bbx[i].x != pf->fbbx || pf->bbx[i].y != pf->fbby) {
+ need_bbx = 1;
+ break;
+ }
+ }
+ if (!need_bbx) {
+ free(pf->bbx);
+ pf->bbx = NULL;
+ }
+
+ /* reallocate bits array to actual bits used*/
+ if (ofs < pf->bits_size) {
+ bitmap_t *tmp = (bitmap_t *)realloc(pf->bits, ofs * sizeof(bitmap_t));
+ if (tmp != NULL || ofs == 0)
+ pf->bits = tmp;
+ else
+ error("bdf_read_bitmaps: Error while reallocating memory");
+ pf->bits_size = ofs;
+ } else {
+ if (ofs > pf->bits_size) {
+ warning("Warning: DWIDTH spec > max FONTBOUNDINGBOX");
+ if (ofs > pf->bits_size + EXTRA) {
+ warning("Error: Not enough bits initially allocated");
+ return 0;
+ }
+ pf->bits_size = ofs;
+ }
+ }
+
+ return 1;
+}
+
+/* read the next non-comment line, returns buf or NULL if EOF*/
+// TODO: Can we use SeekableReadStream::readLine instead?
+char *bdf_getline(Common::SeekableReadStream &fp, char *buf, int len) {
+ int c;
+ char *b;
+
+ for (;;) {
+ b = buf;
+ while (!fp.eos()) {
+ c = fp.readByte();
+ if (c == '\r')
+ continue;
+ if (c == '\n')
+ break;
+ if (b - buf >= (len - 1))
+ break;
+ *b++ = c;
+ }
+ *b = '\0';
+ if (fp.eos() && b == buf)
+ return NULL;
+ if (b != buf && !isprefix(buf, "COMMENT"))
+ break;
+ }
+ return buf;
+}
+
+/* return hex value of buffer */
+bitmap_t bdf_hexval(unsigned char *buf) {
+ bitmap_t val = 0;
+
+ for (unsigned char *ptr = buf; *ptr; ptr++) {
+ int c = *ptr;
+
+ if (c >= '0' && c <= '9')
+ c -= '0';
+ else if (c >= 'A' && c <= 'F')
+ c = c - 'A' + 10;
+ else if (c >= 'a' && c <= 'f')
+ c = c - 'a' + 10;
+ else
+ c = 0;
+ val = (val << 4) | c;
+ }
+ return val;
+}
+
+BdfFont *BdfFont::loadFont(Common::SeekableReadStream &stream) {
+ BdfFontData *data = bdf_read_font(stream);
+ if (!data || stream.err()) {
+ free_font(data);
+ return 0;
+ }
+
+ BdfFontDesc desc;
+ desc.name = data->name;
+ desc.maxwidth = data->maxwidth;
+ desc.height = data->height;
+ desc.fbbw = data->fbbw;
+ desc.fbbh = data->fbbh;
+ desc.fbbx = data->fbbx;
+ desc.fbby = data->fbby;
+ desc.ascent = data->ascent;
+ desc.firstchar = data->firstchar;
+ desc.size = data->size;
+ desc.bits = data->bits;
+ desc.offset = data->offset;
+ desc.width = data->width;
+ desc.bbx = data->bbx;
+ desc.defaultchar = data->defaultchar;
+ desc.bits_size = data->bits_size;
+
+ return new BdfFont(desc, data);
+}
+
+bool BdfFont::cacheFontData(const BdfFont &font, const Common::String &filename) {
+ Common::DumpFile cacheFile;
+ if (!cacheFile.open(filename)) {
+ warning("Couldn't open file '%s' for writing", filename.c_str());
+ return false;
+ }
+
+ cacheFile.writeUint16BE(font._desc.maxwidth);
+ cacheFile.writeUint16BE(font._desc.height);
+ cacheFile.writeUint16BE(font._desc.fbbw);
+ cacheFile.writeUint16BE(font._desc.fbbh);
+ cacheFile.writeSint16BE(font._desc.fbbx);
+ cacheFile.writeSint16BE(font._desc.fbby);
+ cacheFile.writeUint16BE(font._desc.ascent);
+ cacheFile.writeUint16BE(font._desc.firstchar);
+ cacheFile.writeUint16BE(font._desc.size);
+ cacheFile.writeUint16BE(font._desc.defaultchar);
+ cacheFile.writeUint32BE(font._desc.bits_size);
+
+ for (long i = 0; i < font._desc.bits_size; ++i) {
+ cacheFile.writeUint16BE(font._desc.bits[i]);
+ }
+
+ if (font._desc.offset) {
+ cacheFile.writeByte(1);
+ for (int i = 0; i < font._desc.size; ++i) {
+ cacheFile.writeUint32BE(font._desc.offset[i]);
+ }
+ } else {
+ cacheFile.writeByte(0);
+ }
+
+ if (font._desc.width) {
+ cacheFile.writeByte(1);
+ for (int i = 0; i < font._desc.size; ++i) {
+ cacheFile.writeByte(font._desc.width[i]);
+ }
+ } else {
+ cacheFile.writeByte(0);
+ }
+
+ if (font._desc.bbx) {
+ cacheFile.writeByte(1);
+ for (int i = 0; i < font._desc.size; ++i) {
+ cacheFile.writeByte(font._desc.bbx[i].w);
+ cacheFile.writeByte(font._desc.bbx[i].h);
+ cacheFile.writeByte(font._desc.bbx[i].x);
+ cacheFile.writeByte(font._desc.bbx[i].y);
+ }
+ } else {
+ cacheFile.writeByte(0);
+ }
+
+ return !cacheFile.err();
+}
+
+BdfFont *BdfFont::loadFromCache(Common::SeekableReadStream &stream) {
+ BdfFont *font = 0;
+
+ BdfFontData *data = (BdfFontData *)malloc(sizeof(BdfFontData));
+ if (!data)
+ return 0;
+
+ memset(data, 0, sizeof(BdfFontData));
+
+ data->maxwidth = stream.readUint16BE();
+ data->height = stream.readUint16BE();
+ data->fbbw = stream.readUint16BE();
+ data->fbbh = stream.readUint16BE();
+ data->fbbx = stream.readSint16BE();
+ data->fbby = stream.readSint16BE();
+ data->ascent = stream.readUint16BE();
+ data->firstchar = stream.readUint16BE();
+ data->size = stream.readUint16BE();
+ data->defaultchar = stream.readUint16BE();
+ data->bits_size = stream.readUint32BE();
+
+ data->bits = (bitmap_t *)malloc(sizeof(bitmap_t) * data->bits_size);
+ if (!data->bits) {
+ free(data);
+ return 0;
+ }
+
+ for (long i = 0; i < data->bits_size; ++i) {
+ data->bits[i] = stream.readUint16BE();
+ }
+
+ bool hasOffsetTable = (stream.readByte() != 0);
+ if (hasOffsetTable) {
+ data->offset = (unsigned long *)malloc(sizeof(unsigned long) * data->size);
+ if (!data->offset) {
+ free(data->bits);
+ free(data);
+ return 0;
+ }
+
+ for (int i = 0; i < data->size; ++i) {
+ data->offset[i] = stream.readUint32BE();
+ }
+ }
+
+ bool hasWidthTable = (stream.readByte() != 0);
+ if (hasWidthTable) {
+ data->width = (unsigned char *)malloc(sizeof(unsigned char) * data->size);
+ if (!data->width) {
+ free(data->bits);
+ free(data->offset);
+ free(data);
+ return 0;
+ }
+
+ for (int i = 0; i < data->size; ++i) {
+ data->width[i] = stream.readByte();
+ }
+ }
+
+ bool hasBBXTable = (stream.readByte() != 0);
+ if (hasBBXTable) {
+ data->bbx = (BBX *)malloc(sizeof(BBX) * data->size);
+ if (!data->bbx) {
+ free(data->bits);
+ free(data->offset);
+ free(data->width);
+ free(data);
+ return 0;
+ }
+
+ for (int i = 0; i < data->size; ++i) {
+ data->bbx[i].w = (int8)stream.readByte();
+ data->bbx[i].h = (int8)stream.readByte();
+ data->bbx[i].x = (int8)stream.readByte();
+ data->bbx[i].y = (int8)stream.readByte();
+ }
+ }
+
+ if (stream.err() || stream.eos()) {
+ free(data->bits);
+ free(data->offset);
+ free(data->width);
+ free(data);
+ return 0;
+ }
+
+ BdfFontDesc desc;
+ desc.name = data->name;
+ desc.maxwidth = data->maxwidth;
+ desc.height = data->height;
+ desc.fbbw = data->fbbw;
+ desc.fbbh = data->fbbh;
+ desc.fbbx = data->fbbx;
+ desc.fbby = data->fbby;
+ desc.ascent = data->ascent;
+ desc.firstchar = data->firstchar;
+ desc.size = data->size;
+ desc.bits = data->bits;
+ desc.offset = data->offset;
+ desc.width = data->width;
+ desc.bbx = data->bbx;
+ desc.defaultchar = data->defaultchar;
+ desc.bits_size = data->bits_size;
+
+ font = new BdfFont(desc, data);
+ if (!font) {
+ free(data->bits);
+ free(data->offset);
+ free(data->width);
+ free(data);
+ return 0;
+ }
+
+ return font;
+}
+
+} // End of namespace Graphics
diff --git a/graphics/fonts/bdf.h b/graphics/fonts/bdf.h
new file mode 100644
index 0000000000..0d60693736
--- /dev/null
+++ b/graphics/fonts/bdf.h
@@ -0,0 +1,99 @@
+/* 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 GRAPHICS_FONTS_BDF_H
+#define GRAPHICS_FONTS_BDF_H
+
+#include "common/system.h"
+
+#include "graphics/font.h"
+
+namespace Common {
+class SeekableReadStream;
+}
+
+namespace Graphics {
+
+typedef uint16 bitmap_t; /* bitmap image unit size*/
+
+struct BBX {
+ int8 w;
+ int8 h;
+ int8 x;
+ int8 y;
+};
+
+/* builtin C-based proportional/fixed font structure */
+/* based on The Microwindows Project http://microwindows.org */
+struct BdfFontDesc {
+ const char *name; /* font name */
+ int maxwidth; /* max width in pixels */
+ int height; /* height in pixels */
+ int fbbw, fbbh, fbbx, fbby; /* max bounding box */
+ int ascent; /* ascent (baseline) height */
+ int firstchar; /* first character in bitmap */
+ int size; /* font size in glyphs */
+ const bitmap_t *bits; /* 16-bit right-padded bitmap data */
+ const unsigned long *offset; /* offsets into bitmap data */
+ const unsigned char *width; /* character widths or NULL if fixed */
+ const BBX *bbx; /* character bounding box or NULL if fixed */
+ int defaultchar; /* default char (not glyph index) */
+ long bits_size; /* # words of bitmap_t bits */
+};
+
+struct BdfFontData;
+
+class BdfFont : public Font {
+protected:
+ BdfFontDesc _desc;
+ BdfFontData *_font;
+
+public:
+ BdfFont(const BdfFontDesc &desc, BdfFontData *font = 0) : _desc(desc), _font(font) {}
+ ~BdfFont();
+
+ virtual int getFontHeight() const;
+ virtual int getMaxCharWidth() const;
+
+ virtual int getCharWidth(byte chr) const;
+ virtual void drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const;
+
+ static BdfFont *loadFont(Common::SeekableReadStream &stream);
+ static bool cacheFontData(const BdfFont &font, const Common::String &filename);
+ static BdfFont *loadFromCache(Common::SeekableReadStream &stream);
+};
+
+#define DEFINE_FONT(n) \
+ const BdfFont *n = 0; \
+ void create_##n() { \
+ n = new BdfFont(desc); \
+ }
+
+#define FORWARD_DECLARE_FONT(n) \
+ extern const BdfFont *n; \
+ extern void create_##n()
+
+#define INIT_FONT(n) \
+ create_##n()
+
+} // End of namespace Graphics
+
+#endif
diff --git a/graphics/fonts/consolefont.cpp b/graphics/fonts/consolefont.cpp
index 65ccd3ec70..5b4768327a 100644
--- a/graphics/fonts/consolefont.cpp
+++ b/graphics/fonts/consolefont.cpp
@@ -1,5 +1,5 @@
/* Generated by convbdf on Sat Jun 17 01:37:46 2006. */
-#include "graphics/font.h"
+#include "graphics/fonts/bdf.h"
/* Font information:
name: 5x8-L1
@@ -5635,7 +5635,7 @@ static const unsigned long _sysfont_offset[] = {
};
/* Exported structure definition. */
-static const FontDesc desc = {
+static const BdfFontDesc desc = {
"5x8-L1",
5,
8,
diff --git a/graphics/fonts/newfont.cpp b/graphics/fonts/newfont.cpp
index 0327c0997a..f02baba2de 100644
--- a/graphics/fonts/newfont.cpp
+++ b/graphics/fonts/newfont.cpp
@@ -1,5 +1,5 @@
/* Generated by convbdf on Sat Jun 17 01:34:15 2006. */
-#include "graphics/font.h"
+#include "graphics/fonts/bdf.h"
/* Font information:
name: clR6x12-L1
@@ -7419,7 +7419,7 @@ static const unsigned long _sysfont_offset[] = {
};
/* Exported structure definition. */
-static const FontDesc desc = {
+static const BdfFontDesc desc = {
"clR6x12-L1",
6,
12,
diff --git a/graphics/fonts/newfont_big.cpp b/graphics/fonts/newfont_big.cpp
index 7b15a6ab38..59c54a4551 100644
--- a/graphics/fonts/newfont_big.cpp
+++ b/graphics/fonts/newfont_big.cpp
@@ -1,5 +1,5 @@
/* Generated by convbdf on Tue Jun 13 00:00:22 2006. */
-#include "graphics/font.h"
+#include "graphics/fonts/bdf.h"
/* Font information:
name: helvB12-L1
@@ -5523,7 +5523,7 @@ static const BBX _sysfont_bbx[] = {
};
/* Exported structure definition. */
-static const FontDesc desc = {
+static const BdfFontDesc desc = {
"helvB12-L1",
13,
14,
diff --git a/graphics/fonts/winfont.cpp b/graphics/fonts/winfont.cpp
index 8b60f8aa6b..3bad92236d 100644
--- a/graphics/fonts/winfont.cpp
+++ b/graphics/fonts/winfont.cpp
@@ -120,15 +120,18 @@ bool WinFont::loadFromNE(const Common::String &fileName, const WinFontDirEntry &
}
bool WinFont::loadFromPE(const Common::String &fileName, const WinFontDirEntry &dirEntry) {
- Common::PEResources exe;
+ Common::PEResources *exe = new Common::PEResources();
- if (!exe.loadFromEXE(fileName))
+ if (!exe->loadFromEXE(fileName)) {
+ delete exe;
return false;
+ }
// Let's pull out the font directory
- Common::SeekableReadStream *fontDirectory = exe.getResource(Common::kPEFontDir, Common::String("FONTDIR"));
+ Common::SeekableReadStream *fontDirectory = exe->getResource(Common::kPEFontDir, Common::String("FONTDIR"));
if (!fontDirectory) {
warning("No font directory in '%s'", fileName.c_str());
+ delete exe;
return false;
}
@@ -139,18 +142,21 @@ bool WinFont::loadFromPE(const Common::String &fileName, const WinFontDirEntry &
// Couldn't match the face name
if (fontId == 0xffffffff) {
warning("Could not find face '%s' in '%s'", dirEntry.faceName.c_str(), fileName.c_str());
+ delete exe;
return false;
}
// Actually go get our font now...
- Common::SeekableReadStream *fontStream = exe.getResource(Common::kPEFont, fontId);
+ Common::SeekableReadStream *fontStream = exe->getResource(Common::kPEFont, fontId);
if (!fontStream) {
warning("Could not find font %d in %s", fontId, fileName.c_str());
+ delete exe;
return false;
}
bool ok = loadFromFNT(*fontStream);
delete fontStream;
+ delete exe;
return ok;
}
diff --git a/graphics/imagedec.h b/graphics/imagedec.h
index da45ecca4f..e839d097b2 100644
--- a/graphics/imagedec.h
+++ b/graphics/imagedec.h
@@ -64,4 +64,3 @@ public:
} // End of namespace Graphics
#endif
-
diff --git a/graphics/maccursor.h b/graphics/maccursor.h
index cca7f3456b..f5efc20655 100644
--- a/graphics/maccursor.h
+++ b/graphics/maccursor.h
@@ -28,18 +28,19 @@
* - scumm
*/
-#include "common/stream.h"
-
#ifndef GRAPHICS_MACCURSOR_H
#define GRAPHICS_MACCURSOR_H
+#include "common/stream.h"
+
+#include "graphics/cursor.h"
+
namespace Graphics {
/**
* A Mac crsr or CURS cursor
- * TODO: Think about making a base class with WinCursor
*/
-class MacCursor {
+class MacCursor : public Cursor {
public:
MacCursor();
~MacCursor();
@@ -56,7 +57,10 @@ public:
byte getKeyColor() const { return 0xFF; }
const byte *getSurface() const { return _surface; }
+
const byte *getPalette() const { return _palette; }
+ byte getPaletteStartIndex() const { return 0; }
+ uint16 getPaletteCount() const { return 256; }
/** Read the cursor's data out of a stream. */
bool readFromStream(Common::SeekableReadStream &stream, bool forceMonochrome = false);
diff --git a/graphics/module.mk b/graphics/module.mk
index 32658c96bd..02c88d98ba 100644
--- a/graphics/module.mk
+++ b/graphics/module.mk
@@ -3,9 +3,9 @@ MODULE := graphics
MODULE_OBJS := \
conversion.o \
cursorman.o \
- dither.o \
font.o \
fontman.o \
+ fonts/bdf.o \
fonts/consolefont.o \
fonts/newfont_big.o \
fonts/newfont.o \
diff --git a/graphics/pict.cpp b/graphics/pict.cpp
index 80bcb7a71e..0f4dcd463f 100644
--- a/graphics/pict.cpp
+++ b/graphics/pict.cpp
@@ -45,10 +45,169 @@ PictDecoder::~PictDecoder() {
delete _jpeg;
}
+#define OPCODE(a, b, c) _opcodes.push_back(PICTOpcode(a, &PictDecoder::b, c))
+
+void PictDecoder::setupOpcodesCommon() {
+ OPCODE(0x0000, o_nop, "NOP");
+ OPCODE(0x0001, o_clip, "Clip");
+ OPCODE(0x0003, o_txFont, "TxFont");
+ OPCODE(0x0004, o_txFace, "TxFace");
+ OPCODE(0x0007, o_pnSize, "PnSize");
+ OPCODE(0x000D, o_txSize, "TxSize");
+ OPCODE(0x0010, o_txRatio, "TxRatio");
+ OPCODE(0x0011, o_versionOp, "VersionOp");
+ OPCODE(0x001E, o_nop, "DefHilite");
+ OPCODE(0x0028, o_longText, "LongText");
+ OPCODE(0x00A1, o_longComment, "LongComment");
+ OPCODE(0x00FF, o_opEndPic, "OpEndPic");
+ OPCODE(0x0C00, o_headerOp, "HeaderOp");
+}
+
+void PictDecoder::setupOpcodesNormal() {
+ setupOpcodesCommon();
+ OPCODE(0x0098, on_packBitsRect, "PackBitsRect");
+ OPCODE(0x009A, on_directBitsRect, "DirectBitsRect");
+ OPCODE(0x8200, on_compressedQuickTime, "CompressedQuickTime");
+}
+
+void PictDecoder::setupOpcodesQuickTime() {
+ setupOpcodesCommon();
+ OPCODE(0x0098, oq_packBitsRect, "PackBitsRect");
+ OPCODE(0x009A, oq_directBitsRect, "DirectBitsRect");
+ OPCODE(0x8200, oq_compressedQuickTime, "CompressedQuickTime");
+}
+
+#undef OPCODE
+
+void PictDecoder::o_nop(Common::SeekableReadStream *) {
+ // Nothing to do
+}
+
+void PictDecoder::o_clip(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->skip(stream->readUint16BE() - 2);
+}
+
+void PictDecoder::o_txFont(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->readUint16BE();
+}
+
+void PictDecoder::o_txFace(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->readByte();
+}
+
+void PictDecoder::o_pnSize(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->readUint16BE();
+ stream->readUint16BE();
+}
+
+void PictDecoder::o_txSize(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->readUint16BE();
+}
+
+void PictDecoder::o_txRatio(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->readUint16BE();
+ stream->readUint16BE();
+ stream->readUint16BE();
+ stream->readUint16BE();
+}
+
+void PictDecoder::o_versionOp(Common::SeekableReadStream *stream) {
+ // We only support v2 extended
+ if (stream->readUint16BE() != 0x02FF)
+ error("Unknown PICT version");
+}
+
+void PictDecoder::o_longText(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->readUint16BE();
+ stream->readUint16BE();
+ stream->skip(stream->readByte());
+}
+
+void PictDecoder::o_longComment(Common::SeekableReadStream *stream) {
+ // Ignore
+ stream->readUint16BE();
+ stream->skip(stream->readUint16BE());
+}
+
+void PictDecoder::o_opEndPic(Common::SeekableReadStream *stream) {
+ // We've reached the end of the picture
+ _continueParsing = false;
+}
+
+void PictDecoder::o_headerOp(Common::SeekableReadStream *stream) {
+ // Read the basic header, but we don't really have to do anything with it
+ /* uint16 version = */ stream->readUint16BE();
+ stream->readUint16BE(); // Reserved
+ /* uint32 hRes = */ stream->readUint32BE();
+ /* uint32 vRes = */ stream->readUint32BE();
+ Common::Rect origResRect;
+ origResRect.top = stream->readUint16BE();
+ origResRect.left = stream->readUint16BE();
+ origResRect.bottom = stream->readUint16BE();
+ origResRect.right = stream->readUint16BE();
+ stream->readUint32BE(); // Reserved
+}
+
+void PictDecoder::on_packBitsRect(Common::SeekableReadStream *stream) {
+ // Unpack data (8bpp or lower)
+ unpackBitsRect(stream, true);
+}
+
+void PictDecoder::on_directBitsRect(Common::SeekableReadStream *stream) {
+ // Unpack data (16bpp or higher)
+ unpackBitsRect(stream, false);
+}
+
+void PictDecoder::on_compressedQuickTime(Common::SeekableReadStream *stream) {
+ // OK, here's the fun. We get to completely change how QuickDraw draws
+ // the data in PICT files.
+
+ // Swap out the opcodes to the new ones
+ _opcodes.clear();
+ setupOpcodesQuickTime();
+
+ // We set up the surface for JPEG here too
+ if (!_outputSurface)
+ _outputSurface = new Graphics::Surface();
+ _outputSurface->create(_imageRect.width(), _imageRect.height(), _pixelFormat);
+
+ // We'll decode the first QuickTime data from here, but the QuickTime-specific
+ // opcodes will take over from here on out. Normal opcodes, signing off.
+ decodeCompressedQuickTime(stream);
+}
+
+void PictDecoder::oq_packBitsRect(Common::SeekableReadStream *stream) {
+ // Skip any data here (8bpp or lower)
+ skipBitsRect(stream, true);
+}
+
+void PictDecoder::oq_directBitsRect(Common::SeekableReadStream *stream) {
+ // Skip any data here (16bpp or higher)
+ skipBitsRect(stream, false);
+}
+
+void PictDecoder::oq_compressedQuickTime(Common::SeekableReadStream *stream) {
+ // Just pass the data along
+ decodeCompressedQuickTime(stream);
+}
+
Surface *PictDecoder::decodeImage(Common::SeekableReadStream *stream, byte *palette) {
assert(stream);
+ // Initialize opcodes to their normal state
+ _opcodes.clear();
+ setupOpcodesNormal();
+
_outputSurface = 0;
+ _continueParsing = true;
+ memset(_palette, 0, sizeof(_palette));
uint16 fileSize = stream->readUint16BE();
@@ -63,70 +222,41 @@ Surface *PictDecoder::decodeImage(Common::SeekableReadStream *stream, byte *pale
_imageRect.bottom = stream->readUint16BE();
_imageRect.right = stream->readUint16BE();
_imageRect.debugPrint(0, "PICT Rect:");
- _isPaletted = false;
// NOTE: This is only a subset of the full PICT format.
- // - Only V2 Images Supported
+ // - Only V2 (Extended) Images Supported
// - CompressedQuickTime (JPEG) compressed data is supported
// - DirectBitsRect/PackBitsRect compressed data is supported
- for (uint32 opNum = 0; !stream->eos() && !stream->err() && stream->pos() < stream->size(); opNum++) {
+ for (uint32 opNum = 0; !stream->eos() && !stream->err() && stream->pos() < stream->size() && _continueParsing; opNum++) {
+ // PICT v2 opcodes are two bytes
uint16 opcode = stream->readUint16BE();
- debug(2, "Found PICT opcode %04x", opcode);
if (opNum == 0 && opcode != 0x0011)
- error ("Cannot find PICT version opcode");
+ error("Cannot find PICT version opcode");
else if (opNum == 1 && opcode != 0x0C00)
- error ("Cannot find PICT header opcode");
-
- if (opcode == 0x0000) { // Nop
- stream->readUint16BE(); // Unknown
- } else if (opcode == 0x0001) { // Clip
- // Ignore
- uint16 clipSize = stream->readUint16BE();
- stream->seek(clipSize - 2, SEEK_CUR);
- } else if (opcode == 0x0007) { // PnSize
- // Ignore
- stream->readUint16BE();
- stream->readUint16BE();
- } else if (opcode == 0x0011) { // VersionOp
- uint16 version = stream->readUint16BE();
- if (version != 0x02FF)
- error ("Unknown PICT version");
- } else if (opcode == 0x001E) { // DefHilite
- // Ignore, Contains no Data
- } else if (opcode == 0x0098) { // PackBitsRect
- decodeDirectBitsRect(stream, true);
- _isPaletted = true;
- } else if (opcode == 0x009A) { // DirectBitsRect
- decodeDirectBitsRect(stream, false);
- } else if (opcode == 0x00A1) { // LongComment
- stream->readUint16BE();
- uint16 dataSize = stream->readUint16BE();
- stream->seek(dataSize, SEEK_CUR);
- } else if (opcode == 0x00FF) { // OpEndPic
- stream->readUint16BE();
- break;
- } else if (opcode == 0x0C00) { // HeaderOp
- /* uint16 version = */ stream->readUint16BE();
- stream->readUint16BE(); // Reserved
- /* uint32 hRes = */ stream->readUint32BE();
- /* uint32 vRes = */ stream->readUint32BE();
- Common::Rect origResRect;
- origResRect.top = stream->readUint16BE();
- origResRect.left = stream->readUint16BE();
- origResRect.bottom = stream->readUint16BE();
- origResRect.right = stream->readUint16BE();
- stream->readUint32BE(); // Reserved
- } else if (opcode == 0x8200) { // CompressedQuickTime
- decodeCompressedQuickTime(stream);
- break;
- } else {
- warning("Unknown PICT opcode %04x", opcode);
+ error("Cannot find PICT header opcode");
+
+ // Since opcodes are word-aligned, we need to mark our starting
+ // position here.
+ uint32 startPos = stream->pos();
+
+ for (uint32 i = 0; i < _opcodes.size(); i++) {
+ if (_opcodes[i].op == opcode) {
+ debug(4, "Running PICT opcode %04x '%s'", opcode, _opcodes[i].desc);
+ (this->*(_opcodes[i].proc))(stream);
+ break;
+ } else if (i == _opcodes.size() - 1) {
+ // Unknown opcode; attempt to continue forward
+ warning("Unknown PICT opcode %04x", opcode);
+ }
}
+
+ // Align
+ stream->skip((stream->pos() - startPos) & 1);
}
// If we got a palette throughout this nonsense, go and grab it
- if (palette && _isPaletted)
+ if (palette)
memcpy(palette, _palette, 256 * 3);
return _outputSurface;
@@ -155,21 +285,18 @@ PictDecoder::PixMap PictDecoder::readPixMap(Common::SeekableReadStream *stream,
return pixMap;
}
-struct DirectBitsRectData {
+struct PackBitsRectData {
PictDecoder::PixMap pixMap;
Common::Rect srcRect;
Common::Rect dstRect;
uint16 mode;
};
-void PictDecoder::decodeDirectBitsRect(Common::SeekableReadStream *stream, bool hasPalette) {
+void PictDecoder::unpackBitsRect(Common::SeekableReadStream *stream, bool hasPalette) {
static const PixelFormat directBitsFormat16 = PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
- // Clear the palette
- memset(_palette, 0, sizeof(_palette));
-
- DirectBitsRectData directBitsData;
- directBitsData.pixMap = readPixMap(stream, !hasPalette);
+ PackBitsRectData packBitsData;
+ packBitsData.pixMap = readPixMap(stream, !hasPalette);
// Read in the palette if there is one present
if (hasPalette) {
@@ -186,54 +313,60 @@ void PictDecoder::decodeDirectBitsRect(Common::SeekableReadStream *stream, bool
}
}
- directBitsData.srcRect.top = stream->readUint16BE();
- directBitsData.srcRect.left = stream->readUint16BE();
- directBitsData.srcRect.bottom = stream->readUint16BE();
- directBitsData.srcRect.right = stream->readUint16BE();
- directBitsData.dstRect.top = stream->readUint16BE();
- directBitsData.dstRect.left = stream->readUint16BE();
- directBitsData.dstRect.bottom = stream->readUint16BE();
- directBitsData.dstRect.right = stream->readUint16BE();
- directBitsData.mode = stream->readUint16BE();
+ packBitsData.srcRect.top = stream->readUint16BE();
+ packBitsData.srcRect.left = stream->readUint16BE();
+ packBitsData.srcRect.bottom = stream->readUint16BE();
+ packBitsData.srcRect.right = stream->readUint16BE();
+ packBitsData.dstRect.top = stream->readUint16BE();
+ packBitsData.dstRect.left = stream->readUint16BE();
+ packBitsData.dstRect.bottom = stream->readUint16BE();
+ packBitsData.dstRect.right = stream->readUint16BE();
+ packBitsData.mode = stream->readUint16BE();
- uint16 width = directBitsData.srcRect.width();
- uint16 height = directBitsData.srcRect.height();
+ uint16 width = packBitsData.srcRect.width();
+ uint16 height = packBitsData.srcRect.height();
byte bytesPerPixel = 0;
- if (directBitsData.pixMap.pixelSize <= 8)
+ if (packBitsData.pixMap.pixelSize <= 8)
bytesPerPixel = 1;
- else if (directBitsData.pixMap.pixelSize == 32)
- bytesPerPixel = 3;
+ else if (packBitsData.pixMap.pixelSize == 32)
+ bytesPerPixel = packBitsData.pixMap.cmpCount;
else
- bytesPerPixel = directBitsData.pixMap.pixelSize / 8;
+ bytesPerPixel = packBitsData.pixMap.pixelSize / 8;
_outputSurface = new Graphics::Surface();
_outputSurface->create(width, height, (bytesPerPixel == 1) ? PixelFormat::createFormatCLUT8() : _pixelFormat);
- byte *buffer = new byte[width * height * bytesPerPixel];
+
+ // Create an temporary buffer, but allocate a bit more than we need to avoid overflow
+ // (align it to the next highest two-byte packed boundary, which may be more unpacked,
+ // as m68k and therefore QuickDraw is word-aligned)
+ byte *buffer = new byte[width * height * bytesPerPixel + (8 * 2 / packBitsData.pixMap.pixelSize)];
// Read in amount of data per row
- for (uint16 i = 0; i < directBitsData.pixMap.bounds.height(); i++) {
+ for (uint16 i = 0; i < packBitsData.pixMap.bounds.height(); i++) {
// NOTE: Compression 0 is "default". The format in SCI games is packed when 0.
// In the future, we may need to have something to set the "default" packing
// format, but this is good for now.
- if (directBitsData.pixMap.packType == 1 || directBitsData.pixMap.rowBytes < 8) { // Unpacked, Pad-Byte (on 24-bit)
+ if (packBitsData.pixMap.packType == 1 || packBitsData.pixMap.rowBytes < 8) { // Unpacked, Pad-Byte (on 24-bit)
// TODO: Finish this. Hasn't been needed (yet).
error("Unpacked DirectBitsRect data (padded)");
- } else if (directBitsData.pixMap.packType == 2) { // Unpacked, No Pad-Byte (on 24-bit)
+ } else if (packBitsData.pixMap.packType == 2) { // Unpacked, No Pad-Byte (on 24-bit)
// TODO: Finish this. Hasn't been needed (yet).
error("Unpacked DirectBitsRect data (not padded)");
- } else if (directBitsData.pixMap.packType == 0 || directBitsData.pixMap.packType > 2) { // Packed
- uint16 byteCount = (directBitsData.pixMap.rowBytes > 250) ? stream->readUint16BE() : stream->readByte();
- decodeDirectBitsLine(buffer + i * _outputSurface->w * bytesPerPixel, directBitsData.pixMap.rowBytes, stream->readStream(byteCount), directBitsData.pixMap.pixelSize, bytesPerPixel);
+ } else if (packBitsData.pixMap.packType == 0 || packBitsData.pixMap.packType > 2) { // Packed
+ uint16 byteCount = (packBitsData.pixMap.rowBytes > 250) ? stream->readUint16BE() : stream->readByte();
+ unpackBitsLine(buffer + i * _outputSurface->w * bytesPerPixel, packBitsData.pixMap.rowBytes, stream->readStream(byteCount), packBitsData.pixMap.pixelSize, bytesPerPixel);
}
}
- if (bytesPerPixel == 1) {
+ switch (bytesPerPixel) {
+ case 1:
// Just copy to the image
memcpy(_outputSurface->pixels, buffer, _outputSurface->w * _outputSurface->h);
- } else if (bytesPerPixel == 2) {
+ break;
+ case 2:
// Convert from 16-bit to whatever surface we need
for (uint16 y = 0; y < _outputSurface->h; y++) {
for (uint16 x = 0; x < _outputSurface->w; x++) {
@@ -246,7 +379,8 @@ void PictDecoder::decodeDirectBitsRect(Common::SeekableReadStream *stream, bool
*((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.RGBToColor(r, g, b);
}
}
- } else {
+ break;
+ case 3:
// Convert from 24-bit (planar!) to whatever surface we need
for (uint16 y = 0; y < _outputSurface->h; y++) {
for (uint16 x = 0; x < _outputSurface->w; x++) {
@@ -259,12 +393,28 @@ void PictDecoder::decodeDirectBitsRect(Common::SeekableReadStream *stream, bool
*((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.RGBToColor(r, g, b);
}
}
+ break;
+ case 4:
+ // Convert from 32-bit (planar!) to whatever surface we need
+ for (uint16 y = 0; y < _outputSurface->h; y++) {
+ for (uint16 x = 0; x < _outputSurface->w; x++) {
+ byte r = *(buffer + y * _outputSurface->w * 4 + x);
+ byte g = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w + x);
+ byte b = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 2 + x);
+ byte a = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 3 + x);
+ if (_pixelFormat.bytesPerPixel == 2)
+ *((uint16 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.ARGBToColor(r, g, b, a);
+ else
+ *((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.ARGBToColor(r, g, b, a);
+ }
+ }
+ break;
}
delete[] buffer;
}
-void PictDecoder::decodeDirectBitsLine(byte *out, uint32 length, Common::SeekableReadStream *data, byte bitsPerPixel, byte bytesPerPixel) {
+void PictDecoder::unpackBitsLine(byte *out, uint32 length, Common::SeekableReadStream *data, byte bitsPerPixel, byte bytesPerPixel) {
uint32 dataDecoded = 0;
byte bytesPerDecode = (bytesPerPixel == 2) ? 2 : 1;
@@ -294,16 +444,63 @@ void PictDecoder::decodeDirectBitsLine(byte *out, uint32 length, Common::Seekabl
}
}
- // HACK: rowBytes is in 32-bit, but the data is 24-bit...
+ // HACK: Even if the data is 24-bit, rowBytes is still 32-bit
if (bytesPerPixel == 3)
dataDecoded += length / 4;
if (length != dataDecoded)
- warning("Mismatched DirectBits read (%d/%d)", dataDecoded, length);
+ warning("Mismatched PackBits read (%d/%d)", dataDecoded, length);
delete data;
}
+void PictDecoder::skipBitsRect(Common::SeekableReadStream *stream, bool hasPalette) {
+ // Step through a PackBitsRect/DirectBitsRect function
+
+ if (!hasPalette)
+ stream->readUint32BE();
+
+ uint16 rowBytes = stream->readUint16BE();
+ uint16 height = stream->readUint16BE();
+ stream->readUint16BE();
+ height = stream->readUint16BE() - height;
+ stream->readUint16BE();
+
+ uint16 packType;
+ uint16 pixelSize;
+
+ // Top two bits signify PixMap vs BitMap
+ if (rowBytes & 0xC000) {
+ // PixMap
+ stream->readUint16BE();
+ packType = stream->readUint16BE();
+ stream->skip(14);
+ pixelSize = stream->readUint16BE();
+ stream->skip(16);
+
+ if (hasPalette) {
+ stream->readUint32BE();
+ stream->readUint16BE();
+ stream->skip((stream->readUint16BE() + 1) * 8);
+ }
+
+ rowBytes &= 0x3FFF;
+ } else {
+ // BitMap
+ packType = 0;
+ pixelSize = 1;
+ }
+
+ stream->skip(18);
+
+ for (uint16 i = 0; i < height; i++) {
+ if (packType == 1 || packType == 2 || rowBytes < 8)
+ error("Unpacked PackBitsRect data");
+ else if (packType == 0 || packType > 2)
+ stream->skip((rowBytes > 250) ? stream->readUint16BE() : stream->readByte());
+ }
+}
+
void PictDecoder::outputPixelBuffer(byte *&out, byte value, byte bitsPerPixel) {
switch (bitsPerPixel) {
case 1:
@@ -326,18 +523,50 @@ void PictDecoder::outputPixelBuffer(byte *&out, byte value, byte bitsPerPixel) {
// Compressed QuickTime details can be found here:
// http://developer.apple.com/legacy/mac/library/#documentation/QuickTime/Rm/CompressDecompress/ImageComprMgr/B-Chapter/2TheImageCompression.html
// http://developer.apple.com/legacy/mac/library/#documentation/QuickTime/Rm/CompressDecompress/ImageComprMgr/F-Chapter/6WorkingwiththeImage.html
-// I'm just ignoring that because Myst ME uses none of that extra stuff. The offset is always the same.
void PictDecoder::decodeCompressedQuickTime(Common::SeekableReadStream *stream) {
+ // First, read all the fields from the opcode
uint32 dataSize = stream->readUint32BE();
uint32 startPos = stream->pos();
- Common::SeekableReadStream *jpegStream = new Common::SeekableSubReadStream(stream, stream->pos() + 156, stream->pos() + dataSize);
+ /* uint16 version = */ stream->readUint16BE();
+
+ // Read in the display matrix
+ uint32 matrix[3][3];
+ for (uint32 i = 0; i < 3; i++)
+ for (uint32 j = 0; j < 3; j++)
+ matrix[i][j] = stream->readUint32BE();
+
+ // We currently only support offseting images vertically from the matrix
+ uint16 xOffset = 0;
+ uint16 yOffset = matrix[2][1] >> 16;
+
+ uint32 matteSize = stream->readUint32BE();
+ stream->skip(8); // matte rect
+ /* uint16 transferMode = */ stream->readUint16BE();
+ stream->skip(8); // src rect
+ /* uint32 accuracy = */ stream->readUint32BE();
+ uint32 maskSize = stream->readUint32BE();
+
+ // Skip the matte and mask
+ stream->skip(matteSize + maskSize);
+
+ // Now we've reached the image descriptor, so read the relevant data from that
+ uint32 idStart = stream->pos();
+ uint32 idSize = stream->readUint32BE();
+ stream->skip(40); // miscellaneous stuff
+ uint32 jpegSize = stream->readUint32BE();
+ stream->skip(idSize - (stream->pos() - idStart)); // more useless stuff
+
+ Common::SeekableReadStream *jpegStream = new Common::SeekableSubReadStream(stream, stream->pos(), stream->pos() + jpegSize);
if (!_jpeg->read(jpegStream))
error("PictDecoder::decodeCompressedQuickTime(): Could not decode JPEG data");
- _outputSurface = _jpeg->getSurface(_pixelFormat);
+ Graphics::Surface *jpegSurface = _jpeg->getSurface(_pixelFormat);
+
+ for (uint16 y = 0; y < jpegSurface->h; y++)
+ memcpy(_outputSurface->getBasePtr(0 + xOffset, y + yOffset), jpegSurface->getBasePtr(0, y), jpegSurface->w * _pixelFormat.bytesPerPixel);
stream->seek(startPos + dataSize);
delete jpegStream;
diff --git a/graphics/pict.h b/graphics/pict.h
index 485c88b733..b426c6ee35 100644
--- a/graphics/pict.h
+++ b/graphics/pict.h
@@ -23,6 +23,7 @@
#ifndef GRAPHICS_PICT_H
#define GRAPHICS_PICT_H
+#include "common/array.h"
#include "common/rect.h"
#include "common/scummsys.h"
@@ -37,6 +38,8 @@ namespace Graphics {
class JPEG;
struct Surface;
+#define DECLARE_OPCODE(x) void x(Common::SeekableReadStream *stream)
+
class PictDecoder {
public:
PictDecoder(Graphics::PixelFormat pixelFormat);
@@ -70,13 +73,56 @@ private:
byte _palette[256 * 3];
bool _isPaletted;
Graphics::Surface *_outputSurface;
+ bool _continueParsing;
- void decodeDirectBitsRect(Common::SeekableReadStream *stream, bool hasPalette);
- void decodeDirectBitsLine(byte *out, uint32 length, Common::SeekableReadStream *data, byte bitsPerPixel, byte bytesPerPixel);
+ // Utility Functions
+ void unpackBitsRect(Common::SeekableReadStream *stream, bool hasPalette);
+ void unpackBitsLine(byte *out, uint32 length, Common::SeekableReadStream *data, byte bitsPerPixel, byte bytesPerPixel);
+ void skipBitsRect(Common::SeekableReadStream *stream, bool hasPalette);
void decodeCompressedQuickTime(Common::SeekableReadStream *stream);
void outputPixelBuffer(byte *&out, byte value, byte bitsPerPixel);
+
+ // Opcodes
+ typedef void (PictDecoder::*OpcodeProcPICT)(Common::SeekableReadStream *stream);
+ struct PICTOpcode {
+ PICTOpcode() { op = 0; proc = 0; desc = 0; }
+ PICTOpcode(uint16 o, OpcodeProcPICT p, const char *d) { op = o; proc = p; desc = d; }
+ uint16 op;
+ OpcodeProcPICT proc;
+ const char *desc;
+ };
+ Common::Array<PICTOpcode> _opcodes;
+
+ // Common Opcodes
+ void setupOpcodesCommon();
+ DECLARE_OPCODE(o_nop);
+ DECLARE_OPCODE(o_clip);
+ DECLARE_OPCODE(o_txFont);
+ DECLARE_OPCODE(o_txFace);
+ DECLARE_OPCODE(o_pnSize);
+ DECLARE_OPCODE(o_txSize);
+ DECLARE_OPCODE(o_txRatio);
+ DECLARE_OPCODE(o_versionOp);
+ DECLARE_OPCODE(o_longText);
+ DECLARE_OPCODE(o_longComment);
+ DECLARE_OPCODE(o_opEndPic);
+ DECLARE_OPCODE(o_headerOp);
+
+ // Regular-mode Opcodes
+ void setupOpcodesNormal();
+ DECLARE_OPCODE(on_packBitsRect);
+ DECLARE_OPCODE(on_directBitsRect);
+ DECLARE_OPCODE(on_compressedQuickTime);
+
+ // QuickTime-mode Opcodes
+ void setupOpcodesQuickTime();
+ DECLARE_OPCODE(oq_packBitsRect);
+ DECLARE_OPCODE(oq_directBitsRect);
+ DECLARE_OPCODE(oq_compressedQuickTime);
};
+#undef DECLARE_OPCODE
+
} // End of namespace Graphics
#endif
diff --git a/graphics/png.cpp b/graphics/png.cpp
index 6ffc53bd92..2189fd333f 100644
--- a/graphics/png.cpp
+++ b/graphics/png.cpp
@@ -166,18 +166,26 @@ Graphics::Surface *PNG::getSurface(const PixelFormat &format) {
}
} else {
byte index, r, g, b;
+ uint32 mask = (0xff >> (8 - _header.bitDepth)) << (8 - _header.bitDepth);
// Convert the indexed surface to the target pixel format
for (uint16 i = 0; i < output->h; i++) {
- bool otherPixel = false;
+ int data = 0;
+ int bitCount = 8;
+ byte *src1 = src;
for (uint16 j = 0; j < output->w; j++) {
- if (_header.bitDepth != 4)
- index = *src;
- else if (!otherPixel)
- index = (*src) >> 4;
- else
- index = (*src) & 0xf;
+ if (bitCount == 8) {
+ data = *src;
+ src++;
+ }
+
+ index = (data & mask) >> (8 - _header.bitDepth);
+ data = (data << _header.bitDepth) & 0xff;
+ bitCount -= _header.bitDepth;
+
+ if (bitCount == 0)
+ bitCount = 8;
r = _palette[index * 4 + 0];
g = _palette[index * 4 + 1];
@@ -188,14 +196,8 @@ Graphics::Surface *PNG::getSurface(const PixelFormat &format) {
*((uint16 *)output->getBasePtr(j, i)) = format.ARGBToColor(a, r, g, b);
else
*((uint32 *)output->getBasePtr(j, i)) = format.ARGBToColor(a, r, g, b);
-
- if (_header.bitDepth != 4 || otherPixel)
- src++;
- otherPixel = !otherPixel;
}
- // The surface is a whole scanline wide, skip the rest of it.
- if (_header.bitDepth == 4)
- src += output->w / 2 + output->w % 2;
+ src = src1 + output->w;
}
}
diff --git a/graphics/primitives.h b/graphics/primitives.h
index 6055404b96..0ab2dabcd8 100644
--- a/graphics/primitives.h
+++ b/graphics/primitives.h
@@ -30,4 +30,3 @@ void drawThickLine(int x0, int y0, int x1, int y1, int thickness, int color, voi
} // End of namespace Graphics
#endif
-
diff --git a/graphics/scaler.cpp b/graphics/scaler.cpp
index a35fb9046e..9ade0e6c57 100644
--- a/graphics/scaler.cpp
+++ b/graphics/scaler.cpp
@@ -24,6 +24,7 @@
#include "graphics/scaler/scalebit.h"
#include "common/util.h"
#include "common/system.h"
+#include "common/textconsole.h"
int gBitFormat = 565;
@@ -90,6 +91,9 @@ void InitLUT(Graphics::PixelFormat format) {
if (RGBtoYUV == 0)
RGBtoYUV = (uint32 *)malloc(65536 * sizeof(uint32));
+ if (!RGBtoYUV)
+ error("[InitLUT] Cannot allocate memory for YUV/LUT buffers");
+
for (int color = 0; color < 65536; ++color) {
format.colorToRGB(color, r, g, b);
Y = (r + g + b) >> 2;
diff --git a/graphics/scaler/aspect.cpp b/graphics/scaler/aspect.cpp
index b12fac418b..7ad37b1ba8 100644
--- a/graphics/scaler/aspect.cpp
+++ b/graphics/scaler/aspect.cpp
@@ -292,4 +292,3 @@ void Normal2xAspect(const uint8 *srcPtr,
}
#endif // USE_ARM_SCALER_ASM
-
diff --git a/graphics/scaler/hq2x_i386.asm b/graphics/scaler/hq2x_i386.asm
index 9393f00e01..4f8e0713b7 100644
--- a/graphics/scaler/hq2x_i386.asm
+++ b/graphics/scaler/hq2x_i386.asm
@@ -1901,4 +1901,3 @@ FuncTable2:
%ifidn __OUTPUT_FORMAT__,elf
section .note.GNU-stack noalloc noexec nowrite progbits
%endif
-
diff --git a/graphics/scaler/hq3x_i386.asm b/graphics/scaler/hq3x_i386.asm
index 92c0058711..209a7b8a34 100644
--- a/graphics/scaler/hq3x_i386.asm
+++ b/graphics/scaler/hq3x_i386.asm
@@ -2477,4 +2477,3 @@ FuncTable2:
%ifidn __OUTPUT_FORMAT__,elf
section .note.GNU-stack noalloc noexec nowrite progbits
%endif
-
diff --git a/graphics/scaler/scale2x.cpp b/graphics/scaler/scale2x.cpp
index ec2aa2086e..ac2dbadefa 100644
--- a/graphics/scaler/scale2x.cpp
+++ b/graphics/scaler/scale2x.cpp
@@ -500,4 +500,3 @@ void scale2x_32_mmx(scale2x_uint32* dst0, scale2x_uint32* dst1, const scale2x_ui
}
#endif
-
diff --git a/graphics/scaler/scale2x.h b/graphics/scaler/scale2x.h
index a6365c113e..b0c887d43c 100644
--- a/graphics/scaler/scale2x.h
+++ b/graphics/scaler/scale2x.h
@@ -66,4 +66,3 @@ extern "C" void scale2x_32_arm(scale2x_uint32* dst0, scale2x_uint32* dst1, const
#endif
#endif
-
diff --git a/graphics/scaler/scale3x.cpp b/graphics/scaler/scale3x.cpp
index 788c8694c5..4ce738a37a 100644
--- a/graphics/scaler/scale3x.cpp
+++ b/graphics/scaler/scale3x.cpp
@@ -220,4 +220,3 @@ void scale3x_32_def(scale3x_uint32* dst0, scale3x_uint32* dst1, scale3x_uint32*
scale3x_32_def_center(dst1, src0, src1, src2, count);
scale3x_32_def_border(dst2, src2, src1, src0, count);
}
-
diff --git a/graphics/scaler/scale3x.h b/graphics/scaler/scale3x.h
index 671a207570..ad5604d086 100644
--- a/graphics/scaler/scale3x.h
+++ b/graphics/scaler/scale3x.h
@@ -38,4 +38,3 @@ void scale3x_16_def(scale3x_uint16* dst0, scale3x_uint16* dst1, scale3x_uint16*
void scale3x_32_def(scale3x_uint32* dst0, scale3x_uint32* dst1, scale3x_uint32* dst2, const scale3x_uint32* src0, const scale3x_uint32* src1, const scale3x_uint32* src2, unsigned count);
#endif
-
diff --git a/graphics/scaler/scalebit.cpp b/graphics/scaler/scalebit.cpp
index c6d2a0d752..c8b54f4b25 100644
--- a/graphics/scaler/scalebit.cpp
+++ b/graphics/scaler/scalebit.cpp
@@ -340,4 +340,3 @@ void scale(unsigned scale, void* void_dst, unsigned dst_slice, const void* void_
break;
}
}
-
diff --git a/graphics/scaler/scalebit.h b/graphics/scaler/scalebit.h
index dd46883f97..6e4a30caf0 100644
--- a/graphics/scaler/scalebit.h
+++ b/graphics/scaler/scalebit.h
@@ -40,4 +40,3 @@ int scale_precondition(unsigned scale, unsigned pixel, unsigned width, unsigned
void scale(unsigned scale, void* void_dst, unsigned dst_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height);
#endif
-
diff --git a/graphics/scaler/thumbnail_intern.cpp b/graphics/scaler/thumbnail_intern.cpp
index 154763070a..ef540b8cd8 100644
--- a/graphics/scaler/thumbnail_intern.cpp
+++ b/graphics/scaler/thumbnail_intern.cpp
@@ -236,4 +236,3 @@ bool createThumbnail(Graphics::Surface *surf, const uint8 *pixels, int w, int h,
return createThumbnail(*surf, screen);
}
-
diff --git a/graphics/sjis.cpp b/graphics/sjis.cpp
index 09e1746df4..33f0e562cb 100644
--- a/graphics/sjis.cpp
+++ b/graphics/sjis.cpp
@@ -40,13 +40,30 @@ FontSJIS *FontSJIS::createFont(const Common::Platform platform) {
// Try the font ROM of the specified platform
if (platform == Common::kPlatformFMTowns) {
ret = new FontTowns();
- if (ret && ret->loadData())
- return ret;
+ if (ret) {
+ if (ret->loadData())
+ return ret;
+ }
delete ret;
- }
+ } else if (platform == Common::kPlatformPCEngine) {
+ ret = new FontPCEngine();
+ if (ret) {
+ if (ret->loadData())
+ return ret;
+ }
+ delete ret;
+ } // TODO: PC98 font rom support
+ /* else if (platform == Common::kPlatformPC98) {
+ ret = new FontPC98();
+ if (ret) {
+ if (ret->loadData())
+ return ret;
+ }
+ delete ret;
+ }*/
// Try ScummVM's font.
- ret = new FontSjisSVM();
+ ret = new FontSjisSVM(platform);
if (ret && ret->loadData())
return ret;
delete ret;
@@ -58,21 +75,76 @@ void FontSJIS::drawChar(Graphics::Surface &dst, uint16 ch, int x, int y, uint32
drawChar(dst.getBasePtr(x, y), ch, dst.pitch, dst.format.bytesPerPixel, c1, c2, dst.w - x, dst.h - y);
}
+FontSJISBase::FontSJISBase()
+ : _drawMode(kDefaultMode), _flippedMode(false), _fontWidth(16), _fontHeight(16), _bitPosNewLineMask(0) {
+}
+
+void FontSJISBase::setDrawingMode(DrawingMode mode) {
+ if (hasFeature(1 << mode))
+ _drawMode = mode;
+ else
+ warning("Unsupported drawing mode selected");
+}
+
+void FontSJISBase::toggleFlippedMode(bool enable) {
+ if (hasFeature(kFeatFlipped))
+ _flippedMode = enable;
+ else
+ warning("Flipped mode unsupported by this font");
+}
+
+uint FontSJISBase::getFontHeight() const {
+ switch (_drawMode) {
+ case kOutlineMode:
+ return _fontHeight + 2;
+
+ case kDefaultMode:
+ return _fontHeight;
+
+ default:
+ return _fontHeight + 1;
+ }
+}
+
+uint FontSJISBase::getMaxFontWidth() const {
+ switch (_drawMode) {
+ case kOutlineMode:
+ return _fontWidth + 2;
+
+ case kDefaultMode:
+ return _fontWidth;
+
+ default:
+ return _fontWidth + 1;
+ }
+}
+
+uint FontSJISBase::getCharWidth(uint16 ch) const {
+ if (isASCII(ch))
+ return ((_drawMode == kOutlineMode) ? 10 : (_drawMode == kDefaultMode ? 8 : 9));
+ else
+ return getMaxFontWidth();
+}
+
template<typename Color>
void FontSJISBase::blitCharacter(const uint8 *glyph, const int w, const int h, uint8 *dst, int pitch, Color c) const {
+ uint8 bitPos = 0;
+ uint8 mask = 0;
+
for (int y = 0; y < h; ++y) {
Color *d = (Color *)dst;
dst += pitch;
- uint8 mask = 0;
+ bitPos &= _bitPosNewLineMask;
for (int x = 0; x < w; ++x) {
- if (!(x % 8))
+ if (!(bitPos % 8))
mask = *glyph++;
if (mask & 0x80)
*d = c;
++d;
+ ++bitPos;
mask <<= 1;
}
}
@@ -146,14 +218,14 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1,
int outlineExtraWidth = 2, outlineExtraHeight = 2;
int outlineXOffset = 0, outlineYOffset = 0;
- if (is8x16(ch)) {
- glyphSource = getCharData8x16(ch);
+ if (isASCII(ch)) {
+ glyphSource = getCharData(ch);
width = 8;
- height = 16;
+ height = _fontHeight;
} else {
glyphSource = getCharData(ch);
- width = 16;
- height = 16;
+ width = _fontWidth;
+ height = _fontHeight;
}
if (maxW != -1 && maxW < width) {
@@ -193,10 +265,10 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1,
blitCharacter<uint8>(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 1, pitch, c1);
} else {
if (_drawMode != kDefaultMode) {
- blitCharacter<uint8>(glyphSource, width - outlineXOffset, height, ((uint8*)dst) + 1, pitch, c2);
- blitCharacter<uint8>(glyphSource, width, height - outlineYOffset, ((uint8*)dst) + pitch, pitch, c2);
+ blitCharacter<uint8>(glyphSource, width - outlineXOffset, height, ((uint8 *)dst) + 1, pitch, c2);
+ blitCharacter<uint8>(glyphSource, width, height - outlineYOffset, ((uint8 *)dst) + pitch, pitch, c2);
if (_drawMode == kShadowMode)
- blitCharacter<uint8>(glyphSource, width - outlineXOffset, height - outlineYOffset, ((uint8*)dst) + pitch + 1, pitch, c2);
+ blitCharacter<uint8>(glyphSource, width - outlineXOffset, height - outlineYOffset, ((uint8 *)dst) + pitch + 1, pitch, c2);
}
blitCharacter<uint8>(glyphSource, width, height, (uint8 *)dst, pitch, c1);
@@ -207,10 +279,10 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1,
blitCharacter<uint16>(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 2, pitch, c1);
} else {
if (_drawMode != kDefaultMode) {
- blitCharacter<uint16>(glyphSource, width - outlineXOffset, height, ((uint8*)dst) + 2, pitch, c2);
- blitCharacter<uint16>(glyphSource, width, height - outlineYOffset, ((uint8*)dst) + pitch, pitch, c2);
+ blitCharacter<uint16>(glyphSource, width - outlineXOffset, height, ((uint8 *)dst) + 2, pitch, c2);
+ blitCharacter<uint16>(glyphSource, width, height - outlineYOffset, ((uint8 *)dst) + pitch, pitch, c2);
if (_drawMode == kShadowMode)
- blitCharacter<uint16>(glyphSource, width - outlineXOffset, height - outlineYOffset, ((uint8*)dst) + pitch + 2, pitch, c2);
+ blitCharacter<uint16>(glyphSource, width - outlineXOffset, height - outlineYOffset, ((uint8 *)dst) + pitch + 2, pitch, c2);
}
blitCharacter<uint16>(glyphSource, width, height, (uint8 *)dst, pitch, c1);
@@ -220,14 +292,7 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1,
}
}
-uint FontSJISBase::getCharWidth(uint16 ch) const {
- if (is8x16(ch))
- return (_drawMode == kOutlineMode) ? 10 : (_drawMode == kDefaultMode ? 8 : 9);
- else
- return getMaxFontWidth();
-}
-
-bool FontSJISBase::is8x16(uint16 ch) const {
+bool FontSJISBase::isASCII(uint16 ch) const {
if (ch >= 0xFF)
return false;
else if (ch <= 0x7F || (ch >= 0xA1 && ch <= 0xDF))
@@ -253,105 +318,211 @@ bool FontTowns::loadData() {
}
const uint8 *FontTowns::getCharData(uint16 ch) const {
- uint8 f = ch & 0xFF;
- uint8 s = ch >> 8;
-
- // copied from scumm\charset.cpp
- enum {
- KANA = 0,
- KANJI = 1,
- EKANJI = 2
- };
+ if (ch < kFont8x16Chars) {
+ return _fontData8x16 + ch * 16;
+ } else {
+ uint8 f = ch & 0xFF;
+ uint8 s = ch >> 8;
+
+ // moved from scumm\charset.cpp
+ enum {
+ KANA = 0,
+ KANJI = 1,
+ EKANJI = 2
+ };
+
+ int base = s - ((s + 1) % 32);
+ int c = 0, p = 0, chunk_f = 0, chunk = 0, cr = 0, kanjiType = KANA;
+
+ if (f >= 0x81 && f <= 0x84) kanjiType = KANA;
+ if (f >= 0x88 && f <= 0x9f) kanjiType = KANJI;
+ if (f >= 0xe0 && f <= 0xea) kanjiType = EKANJI;
+
+ if ((f > 0xe8 || (f == 0xe8 && base >= 0x9f)) || (f > 0x90 || (f == 0x90 && base >= 0x9f))) {
+ c = 48; //correction
+ p = -8; //correction
+ }
- int base = s - ((s + 1) % 32);
- int c = 0, p = 0, chunk_f = 0, chunk = 0, cr = 0, kanjiType = KANA;
+ if (kanjiType == KANA) {//Kana
+ chunk_f = (f - 0x81) * 2;
+ } else if (kanjiType == KANJI) {//Standard Kanji
+ p += f - 0x88;
+ chunk_f = c + 2 * p;
+ } else if (kanjiType == EKANJI) {//Enhanced Kanji
+ p += f - 0xe0;
+ chunk_f = c + 2 * p;
+ }
- if (f >= 0x81 && f <= 0x84) kanjiType = KANA;
- if (f >= 0x88 && f <= 0x9f) kanjiType = KANJI;
- if (f >= 0xe0 && f <= 0xea) kanjiType = EKANJI;
+ // Base corrections
+ if (base == 0x7f && s == 0x7f)
+ base -= 0x20;
+ if (base == 0x9f && s == 0xbe)
+ base += 0x20;
+ if (base == 0xbf && s == 0xde)
+ base += 0x20;
+ //if (base == 0x7f && s == 0x9e)
+ // base += 0x20;
+
+ switch (base) {
+ case 0x3f:
+ cr = 0; //3f
+ if (kanjiType == KANA) chunk = 1;
+ else if (kanjiType == KANJI) chunk = 31;
+ else if (kanjiType == EKANJI) chunk = 111;
+ break;
+ case 0x5f:
+ cr = 0; //5f
+ if (kanjiType == KANA) chunk = 17;
+ else if (kanjiType == KANJI) chunk = 47;
+ else if (kanjiType == EKANJI) chunk = 127;
+ break;
+ case 0x7f:
+ cr = -1; //80
+ if (kanjiType == KANA) chunk = 9;
+ else if (kanjiType == KANJI) chunk = 63;
+ else if (kanjiType == EKANJI) chunk = 143;
+ break;
+ case 0x9f:
+ cr = 1; //9e
+ if (kanjiType == KANA) chunk = 2;
+ else if (kanjiType == KANJI) chunk = 32;
+ else if (kanjiType == EKANJI) chunk = 112;
+ break;
+ case 0xbf:
+ cr = 1; //be
+ if (kanjiType == KANA) chunk = 18;
+ else if (kanjiType == KANJI) chunk = 48;
+ else if (kanjiType == EKANJI) chunk = 128;
+ break;
+ case 0xdf:
+ cr = 1; //de
+ if (kanjiType == KANA) chunk = 10;
+ else if (kanjiType == KANJI) chunk = 64;
+ else if (kanjiType == EKANJI) chunk = 144;
+ break;
+ default:
+ debug(4, "Invalid Char! f %x s %x base %x c %d p %d", f, s, base, c, p);
+ }
- if ((f > 0xe8 || (f == 0xe8 && base >= 0x9f)) || (f > 0x90 || (f == 0x90 && base >= 0x9f))) {
- c = 48; //correction
- p = -8; //correction
+ debug(6, "Kanji: %c%c f 0x%x s 0x%x base 0x%x c %d p %d chunk %d cr %d index %d", f, s, f, s, base, c, p, chunk, cr, ((chunk_f + chunk) * 32 + (s - base)) + cr);
+ const int chunkNum = (((chunk_f + chunk) * 32 + (s - base)) + cr);
+ if (chunkNum < 0 || chunkNum >= kFont16x16Chars)
+ return 0;
+ else
+ return _fontData16x16 + chunkNum * 32;
}
+}
- if (kanjiType == KANA) {//Kana
- chunk_f = (f - 0x81) * 2;
- } else if (kanjiType == KANJI) {//Standard Kanji
- p += f - 0x88;
- chunk_f = c + 2 * p;
- } else if (kanjiType == EKANJI) {//Enhanced Kanji
- p += f - 0xe0;
- chunk_f = c + 2 * p;
- }
+bool FontTowns::hasFeature(int feat) const {
+ static const int features = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow | kFeatFlipped;
+ return (features & feat) ? true : false;
+}
- // Base corrections
- if (base == 0x7f && s == 0x7f)
- base -= 0x20;
- if (base == 0x9f && s == 0xbe)
- base += 0x20;
- if (base == 0xbf && s == 0xde)
- base += 0x20;
- //if (base == 0x7f && s == 0x9e)
- // base += 0x20;
-
- switch (base) {
- case 0x3f:
- cr = 0; //3f
- if (kanjiType == KANA) chunk = 1;
- else if (kanjiType == KANJI) chunk = 31;
- else if (kanjiType == EKANJI) chunk = 111;
- break;
- case 0x5f:
- cr = 0; //5f
- if (kanjiType == KANA) chunk = 17;
- else if (kanjiType == KANJI) chunk = 47;
- else if (kanjiType == EKANJI) chunk = 127;
- break;
- case 0x7f:
- cr = -1; //80
- if (kanjiType == KANA) chunk = 9;
- else if (kanjiType == KANJI) chunk = 63;
- else if (kanjiType == EKANJI) chunk = 143;
- break;
- case 0x9f:
- cr = 1; //9e
- if (kanjiType == KANA) chunk = 2;
- else if (kanjiType == KANJI) chunk = 32;
- else if (kanjiType == EKANJI) chunk = 112;
- break;
- case 0xbf:
- cr = 1; //be
- if (kanjiType == KANA) chunk = 18;
- else if (kanjiType == KANJI) chunk = 48;
- else if (kanjiType == EKANJI) chunk = 128;
- break;
- case 0xdf:
- cr = 1; //de
- if (kanjiType == KANA) chunk = 10;
- else if (kanjiType == KANJI) chunk = 64;
- else if (kanjiType == EKANJI) chunk = 144;
- break;
- default:
- debug(4, "Invalid Char! f %x s %x base %x c %d p %d", f, s, base, c, p);
+// PC-Engine ROM font
+
+bool FontPCEngine::loadData() {
+ Common::SeekableReadStream *data = SearchMan.createReadStreamForMember("pce.cdbios");
+ if (!data)
+ return false;
+
+ data->seek((data->size() & 0x200) ? 0x30200 : 0x30000);
+ data->read(_fontData12x12, kFont12x12Chars * 18);
+
+ _fontWidth = _fontHeight = 12;
+ _bitPosNewLineMask = _fontWidth & 7;
+
+ bool retValue = !data->err();
+ delete data;
+ return retValue;
+}
+
+const uint8 *FontPCEngine::getCharData(uint16 ch) const {
+ // Converts sjis code to pce font offset
+ // (moved from scumm\charset.cpp).
+ // rangeTbl maps SJIS char-codes to the PCE System Card font rom.
+ // Each pair {<upperBound>,<lowerBound>} in the array represents a SJIS range.
+ const int rangeCnt = 45;
+ static const uint16 rangeTbl[rangeCnt][2] = {
+ // Symbols
+ { 0x8140, 0x817E }, { 0x8180, 0x81AC },
+ // 0-9
+ { 0x824F, 0x8258 },
+ // Latin upper
+ { 0x8260, 0x8279 },
+ // Latin lower
+ { 0x8281, 0x829A },
+ // Kana
+ { 0x829F, 0x82F1 }, { 0x8340, 0x837E }, { 0x8380, 0x8396},
+ // Greek upper
+ { 0x839F, 0x83B6 },
+ // Greek lower
+ { 0x83BF, 0x83D6 },
+ // Cyrillic upper
+ { 0x8440, 0x8460 },
+ // Cyrillic lower
+ { 0x8470, 0x847E }, { 0x8480, 0x8491},
+ // Kanji
+ { 0x889F, 0x88FC },
+ { 0x8940, 0x897E }, { 0x8980, 0x89FC },
+ { 0x8A40, 0x8A7E }, { 0x8A80, 0x8AFC },
+ { 0x8B40, 0x8B7E }, { 0x8B80, 0x8BFC },
+ { 0x8C40, 0x8C7E }, { 0x8C80, 0x8CFC },
+ { 0x8D40, 0x8D7E }, { 0x8D80, 0x8DFC },
+ { 0x8E40, 0x8E7E }, { 0x8E80, 0x8EFC },
+ { 0x8F40, 0x8F7E }, { 0x8F80, 0x8FFC },
+ { 0x9040, 0x907E }, { 0x9080, 0x90FC },
+ { 0x9140, 0x917E }, { 0x9180, 0x91FC },
+ { 0x9240, 0x927E }, { 0x9280, 0x92FC },
+ { 0x9340, 0x937E }, { 0x9380, 0x93FC },
+ { 0x9440, 0x947E }, { 0x9480, 0x94FC },
+ { 0x9540, 0x957E }, { 0x9580, 0x95FC },
+ { 0x9640, 0x967E }, { 0x9680, 0x96FC },
+ { 0x9740, 0x977E }, { 0x9780, 0x97FC },
+ { 0x9840, 0x9872 }
+ };
+
+ ch = (ch << 8) | (ch >> 8);
+ int offset = 0;
+ for (int i = 0; i < rangeCnt; ++i) {
+ if (ch >= rangeTbl[i][0] && ch <= rangeTbl[i][1]) {
+ return _fontData12x12 + 18 * (offset + ch - rangeTbl[i][0]);
+ break;
+ }
+ offset += rangeTbl[i][1] - rangeTbl[i][0] + 1;
}
- debug(6, "Kanji: %c%c f 0x%x s 0x%x base 0x%x c %d p %d chunk %d cr %d index %d", f, s, f, s, base, c, p, chunk, cr, ((chunk_f + chunk) * 32 + (s - base)) + cr);
- const int chunkNum = (((chunk_f + chunk) * 32 + (s - base)) + cr);
- if (chunkNum < 0 || chunkNum >= kFont16x16Chars)
- return 0;
- else
- return _fontData16x16 + chunkNum * 32;
+ debug(4, "Invalid Char: 0x%x", ch);
+ return 0;
}
-const uint8 *FontTowns::getCharData8x16(uint16 c) const {
- if (c >= kFont8x16Chars)
- return 0;
- return _fontData8x16 + c * 16;
+bool FontPCEngine::hasFeature(int feat) const {
+ // Outline mode not supported due to use of _bitPosNewLineMask. This could be implemented,
+ // but is not needed for any particular target at the moment.
+ // Flipped mode is also not supported since the hard coded table (taken from SCUMM 5 FM-TOWNS)
+ // is set up for font sizes of 8/16. This mode is also not required at the moment, since
+ // there aren't any SCUMM 5 PC-Engine games.
+ static const int features = kFeatDefault | kFeatShadow | kFeatFMTownsShadow;
+ return (features & feat) ? true : false;
}
// ScummVM SJIS font
+FontSjisSVM::FontSjisSVM(const Common::Platform platform)
+ : _fontData16x16(0), _fontData16x16Size(0), _fontData8x16(0), _fontData8x16Size(0),
+ _fontData12x12(0), _fontData12x12Size(0) {
+
+ if (platform == Common::kPlatformPCEngine) {
+ _fontWidth = 12;
+ _fontHeight = 12;
+ }
+}
+
+FontSjisSVM::~FontSjisSVM() {
+ delete[] _fontData16x16;
+ delete[] _fontData8x16;
+ delete[] _fontData12x12;
+}
+
bool FontSjisSVM::loadData() {
Common::SeekableReadStream *data = SearchMan.createReadStreamForMember("SJIS.FNT");
if (!data)
@@ -360,29 +531,40 @@ bool FontSjisSVM::loadData() {
uint32 magic1 = data->readUint32BE();
uint32 magic2 = data->readUint32BE();
- if (magic1 != MKTAG('S','C','V','M') || magic2 != MKTAG('S','J','I','S')) {
+ if (magic1 != MKTAG('S', 'C', 'V', 'M') || magic2 != MKTAG('S', 'J', 'I', 'S')) {
delete data;
return false;
}
uint32 version = data->readUint32BE();
- if (version != 2) {
+ if (version != kSjisFontVersion) {
+ warning("SJIS font version mismatch, expected: %d found: %u", kSjisFontVersion, version);
delete data;
return false;
}
uint numChars16x16 = data->readUint16BE();
uint numChars8x16 = data->readUint16BE();
+ uint numChars12x12 = data->readUint16BE();
+
+ if (_fontWidth == 16) {
+ _fontData16x16Size = numChars16x16 * 32;
+ _fontData16x16 = new uint8[_fontData16x16Size];
+ assert(_fontData16x16);
+ data->read(_fontData16x16, _fontData16x16Size);
+
+ _fontData8x16Size = numChars8x16 * 16;
+ _fontData8x16 = new uint8[numChars8x16 * 16];
+ assert(_fontData8x16);
+ data->read(_fontData8x16, _fontData8x16Size);
+ } else {
+ data->skip(numChars16x16 * 32);
+ data->skip(numChars8x16 * 16);
- _fontData16x16Size = numChars16x16 * 32;
- _fontData16x16 = new uint8[_fontData16x16Size];
- assert(_fontData16x16);
- data->read(_fontData16x16, _fontData16x16Size);
-
- _fontData8x16Size = numChars8x16 * 16;
- _fontData8x16 = new uint8[numChars8x16 * 16];
- assert(_fontData8x16);
-
- data->read(_fontData8x16, _fontData8x16Size);
+ _fontData12x12Size = numChars12x12 * 24;
+ _fontData12x12 = new uint8[_fontData12x12Size];
+ assert(_fontData12x12);
+ data->read(_fontData12x12, _fontData12x12Size);
+ }
bool retValue = !data->err();
delete data;
@@ -390,52 +572,87 @@ bool FontSjisSVM::loadData() {
}
const uint8 *FontSjisSVM::getCharData(uint16 c) const {
- const uint8 fB = c & 0xFF;
- const uint8 sB = c >> 8;
+ if (_fontWidth == 12)
+ return getCharDataPCE(c);
+ else
+ return getCharDataDefault(c);
+}
- // We only allow 2 byte SJIS characters.
- if (fB <= 0x80 || fB >= 0xF0 || (fB >= 0xA0 && fB <= 0xDF) || sB == 0x7F)
+bool FontSjisSVM::hasFeature(int feat) const {
+ // Flipped mode is not supported since the hard coded table (taken from SCUMM 5 FM-TOWNS)
+ // is set up for font sizes of 8/16. This mode is also not required at the moment, since
+ // there aren't any SCUMM 5 PC-Engine games.
+ static const int features16 = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow | kFeatFlipped;
+ static const int features12 = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow;
+ return (((_fontWidth == 12) ? features12 : features16) & feat) ? true : false;
+}
+
+const uint8 *FontSjisSVM::getCharDataPCE(uint16 c) const {
+ if (isASCII(c))
return 0;
- int base = fB;
- base -= 0x81;
- if (base >= 0x5F)
- base -= 0x40;
+ const uint8 fB = c & 0xFF;
+ const uint8 sB = c >> 8;
- int index = sB;
- index -= 0x40;
- if (index >= 0x3F)
- --index;
+ int base, index;
+ mapKANJIChar(fB, sB, base, index);
- // Another check if the passed character was an
- // correctly encoded SJIS character.
- if (index < 0 || index >= 0xBC || base < 0)
+ if (base == -1)
return 0;
- const uint offset = (base * 0xBC + index) * 32;
- assert(offset + 16 <= _fontData16x16Size);
- return _fontData16x16 + offset;
+ const uint offset = (base * 0xBC + index) * 24;
+ assert(offset + 16 <= _fontData12x12Size);
+ return _fontData12x12 + offset;
}
-const uint8 *FontSjisSVM::getCharData8x16(uint16 c) const {
+const uint8 *FontSjisSVM::getCharDataDefault(uint16 c) const {
const uint8 fB = c & 0xFF;
const uint8 sB = c >> 8;
- if (!is8x16(c) || sB)
- return 0;
+ if (isASCII(c)) {
+ int index = fB;
+
+ // half-width katakana
+ if (fB >= 0xA1 && fB <= 0xDF)
+ index -= 0x21;
+
+ const uint offset = index * 16;
+ assert(offset <= _fontData8x16Size);
+ return _fontData8x16 + offset;
+ } else {
+ int base, index;
+ mapKANJIChar(fB, sB, base, index);
+
+ if (base == -1)
+ return 0;
+
+ const uint offset = (base * 0xBC + index) * 32;
+ assert(offset + 16 <= _fontData16x16Size);
+ return _fontData16x16 + offset;
+ }
+}
+
+void FontSjisSVM::mapKANJIChar(const uint8 fB, const uint8 sB, int &base, int &index) const {
+ base = index = -1;
- int index = fB;
+ // We only allow 2 byte SJIS characters.
+ if (fB <= 0x80 || fB >= 0xF0 || (fB >= 0xA0 && fB <= 0xDF) || sB == 0x7F)
+ return;
+
+ base = fB - 0x81;
+ if (base >= 0x5F)
+ base -= 0x40;
- // half-width katakana
- if (fB >= 0xA1 && fB <= 0xDF)
- index -= 0x21;
+ index = sB - 0x40;
+ if (index >= 0x3F)
+ --index;
- const uint offset = index * 16;
- assert(offset <= _fontData8x16Size);
- return _fontData8x16 + offset;
+ // Another check if the passed character was an
+ // correctly encoded SJIS character.
+ if (index < 0 || index >= 0xBC || base < 0)
+ base = index = -1;
}
} // End of namespace Graphics
#endif // defined(GRAPHICS_SJIS_H)
-
diff --git a/graphics/sjis.h b/graphics/sjis.h
index 0c3b057cc4..f96eef6ad1 100644
--- a/graphics/sjis.h
+++ b/graphics/sjis.h
@@ -75,7 +75,7 @@ public:
virtual bool loadData() = 0;
/**
- * Enable drawing with outline or shadow.
+ * Enable drawing with outline or shadow if supported by the Font.
*
* After changing outline state, getFontHeight and getMaxFontWidth / getCharWidth might return
* different values!
@@ -90,11 +90,17 @@ public:
virtual void setDrawingMode(DrawingMode mode) {}
/**
- * Enable flipped character drawing (e.g. in the MI1 circus scene after Guybrush gets shot out of the cannon).
+ * Enable flipped character drawing if supported by the Font (e.g. in the MI1 circus scene after Guybrush gets shot out of the cannon).
*/
virtual void toggleFlippedMode(bool enable) {}
/**
+ * Set spacing between characters and lines. This affects font height / char width
+ */
+ virtual void setCharSpacing(int spacing) {}
+ virtual void setLineSpacing(int spacing) {}
+
+ /**
* Returns the height of the font.
*/
virtual uint getFontHeight() const = 0;
@@ -123,30 +129,30 @@ public:
* @param bpp bytes per pixel of the destination buffer
* @param c1 forground color
* @param c2 outline color
- * @param maxW max draw width (to ensure that character drawing takes place within surface boundaries)
- * @param maxH max draw height (to ensure that character drawing takes place within surface boundaries)
+ * @param maxW max draw width (to ensure that character drawing takes place within surface boundaries), -1 = no check
+ * @param maxH max draw height (to ensure that character drawing takes place within surface boundaries), -1 = no check
*/
- virtual void drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2, int maxW = -1, int maxH = -1) const = 0;
+ virtual void drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2, int maxW, int maxH) const = 0;
};
/**
- * A base class to render 16x16 (2 byte chars), 8x16 (1 byte chars) monochrome SJIS fonts.
+ * A base class to render monochrome SJIS fonts.
*/
class FontSJISBase : public FontSJIS {
public:
- FontSJISBase() : _drawMode(kDefaultMode), _flippedMode(false) {}
+ FontSJISBase();
- void setDrawingMode(DrawingMode mode) { _drawMode = mode; }
+ virtual void setDrawingMode(DrawingMode mode);
- void toggleFlippedMode(bool enable) { _flippedMode = enable; }
+ virtual void toggleFlippedMode(bool enable);
- uint getFontHeight() const { return (_drawMode == kOutlineMode) ? 18 : (_drawMode == kDefaultMode ? 16 : 17); }
+ virtual uint getFontHeight() const;
- uint getMaxFontWidth() const { return (_drawMode == kOutlineMode) ? 18 : (_drawMode == kDefaultMode ? 16 : 17); }
+ virtual uint getMaxFontWidth() const;
- uint getCharWidth(uint16 ch) const;
+ virtual uint getCharWidth(uint16 ch) const;
- void drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2, int maxW = -1, int maxH = -1) const;
+ virtual void drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2, int maxW, int maxH) const;
private:
template<typename Color>
void blitCharacter(const uint8 *glyph, const int w, const int h, uint8 *dst, int pitch, Color c) const;
@@ -161,17 +167,28 @@ private:
protected:
DrawingMode _drawMode;
bool _flippedMode;
-
- bool is8x16(uint16 ch) const;
+ int _fontWidth, _fontHeight;
+ uint8 _bitPosNewLineMask;
+
+ bool isASCII(uint16 ch) const;
virtual const uint8 *getCharData(uint16 c) const = 0;
- virtual const uint8 *getCharData8x16(uint16 c) const = 0;
+
+ enum DrawingFeature {
+ kFeatDefault = 1 << 0,
+ kFeatOutline = 1 << 1,
+ kFeatShadow = 1 << 2,
+ kFeatFMTownsShadow = 1 << 3,
+ kFeatFlipped = 1 << 4
+ };
+
+ virtual bool hasFeature(int feat) const = 0;
};
/**
* FM-TOWNS ROM based SJIS compatible font.
*
- * This is used in KYRA and SCI.
+ * This is used in KYRA, SCUMM and SCI.
*/
class FontTowns : public FontSJISBase {
public:
@@ -188,8 +205,32 @@ private:
uint8 _fontData16x16[kFont16x16Chars * 32];
uint8 _fontData8x16[kFont8x16Chars * 32];
- const uint8 *getCharData(uint16 c) const;
- const uint8 *getCharData8x16(uint16 c) const;
+ virtual const uint8 *getCharData(uint16 c) const;
+
+ bool hasFeature(int feat) const;
+};
+
+/**
+ * PC-Engine System Card based SJIS compatible font.
+ *
+ * This is used in LOOM.
+ */
+class FontPCEngine : public FontSJISBase {
+public:
+ /**
+ * Loads the ROM data from "pce.cdbios".
+ */
+ bool loadData();
+private:
+ enum {
+ kFont12x12Chars = 3418
+ };
+
+ uint8 _fontData12x12[kFont12x12Chars * 18];
+
+ virtual const uint8 *getCharData(uint16 c) const;
+
+ bool hasFeature(int feat) const;
};
/**
@@ -197,8 +238,8 @@ private:
*/
class FontSjisSVM : public FontSJISBase {
public:
- FontSjisSVM() : _fontData16x16(0), _fontData16x16Size(0), _fontData8x16(0), _fontData8x16Size(0) {}
- ~FontSjisSVM() { delete[] _fontData16x16; delete[] _fontData8x16; }
+ FontSjisSVM(const Common::Platform platform);
+ ~FontSjisSVM();
/**
* Load the font data from "SJIS.FNT".
@@ -211,8 +252,21 @@ private:
uint8 *_fontData8x16;
uint _fontData8x16Size;
- const uint8 *getCharData(uint16 c) const;
- const uint8 *getCharData8x16(uint16 c) const;
+ uint8 *_fontData12x12;
+ uint _fontData12x12Size;
+
+ virtual const uint8 *getCharData(uint16 c) const;
+
+ bool hasFeature(int feat) const;
+
+ const uint8 *getCharDataPCE(uint16 c) const;
+ const uint8 *getCharDataDefault(uint16 c) const;
+
+ void mapKANJIChar(const uint8 fB, const uint8 sB, int &base, int &index) const;
+
+ enum {
+ kSjisFontVersion = 3
+ };
};
// TODO: Consider adding support for PC98 ROM
@@ -222,4 +276,3 @@ private:
#endif
#endif // engine and dynamic plugins guard
-
diff --git a/graphics/surface.cpp b/graphics/surface.cpp
index 0fad25734c..e0b25f22e9 100644
--- a/graphics/surface.cpp
+++ b/graphics/surface.cpp
@@ -56,8 +56,10 @@ void Surface::create(uint16 width, uint16 height, const PixelFormat &f) {
format = f;
pitch = w * format.bytesPerPixel;
- pixels = calloc(width * height, format.bytesPerPixel);
- assert(pixels);
+ if (width && height) {
+ pixels = calloc(width * height, format.bytesPerPixel);
+ assert(pixels);
+ }
}
void Surface::free() {
diff --git a/graphics/thumbnail.cpp b/graphics/thumbnail.cpp
index 5fad25967e..db61d828d2 100644
--- a/graphics/thumbnail.cpp
+++ b/graphics/thumbnail.cpp
@@ -94,23 +94,24 @@ bool skipThumbnail(Common::SeekableReadStream &in) {
return true;
}
-bool loadThumbnail(Common::SeekableReadStream &in, Graphics::Surface &to) {
+Graphics::Surface *loadThumbnail(Common::SeekableReadStream &in) {
ThumbnailHeader header;
if (!loadHeader(in, header, true))
- return false;
+ return 0;
if (header.bpp != 2) {
warning("trying to load thumbnail with unsupported bit depth %d", header.bpp);
- return false;
+ return 0;
}
Graphics::PixelFormat format = g_system->getOverlayFormat();
- to.create(header.width, header.height, format);
+ Graphics::Surface *const to = new Graphics::Surface();
+ to->create(header.width, header.height, format);
- OverlayColor *pixels = (OverlayColor *)to.pixels;
- for (int y = 0; y < to.h; ++y) {
- for (int x = 0; x < to.w; ++x) {
+ OverlayColor *pixels = (OverlayColor *)to->pixels;
+ for (int y = 0; y < to->h; ++y) {
+ for (int x = 0; x < to->w; ++x) {
uint8 r, g, b;
colorToRGB<ColorMasks<565> >(in.readUint16BE(), r, g, b);
@@ -119,7 +120,7 @@ bool loadThumbnail(Common::SeekableReadStream &in, Graphics::Surface &to) {
}
}
- return true;
+ return to;
}
bool saveThumbnail(Common::WriteStream &out) {
@@ -166,4 +167,3 @@ bool saveThumbnail(Common::WriteStream &out, const Graphics::Surface &thumb) {
}
} // End of namespace Graphics
-
diff --git a/graphics/thumbnail.h b/graphics/thumbnail.h
index bf48fd1189..df99568f42 100644
--- a/graphics/thumbnail.h
+++ b/graphics/thumbnail.h
@@ -53,7 +53,7 @@ bool skipThumbnail(Common::SeekableReadStream &in);
* The loaded thumbnail will be automatically converted to the
* current overlay pixelformat.
*/
-bool loadThumbnail(Common::SeekableReadStream &in, Graphics::Surface &to);
+Graphics::Surface *loadThumbnail(Common::SeekableReadStream &in);
/**
* Saves a thumbnail to the given write stream.
@@ -69,4 +69,3 @@ bool saveThumbnail(Common::WriteStream &out, const Graphics::Surface &thumb);
} // End of namespace Graphics
#endif
-
diff --git a/graphics/wincursor.cpp b/graphics/wincursor.cpp
index 6208f5f053..2db72a2874 100644
--- a/graphics/wincursor.cpp
+++ b/graphics/wincursor.cpp
@@ -308,4 +308,61 @@ WinCursorGroup *WinCursorGroup::createCursorGroup(Common::PEResources &exe, cons
return group;
}
+/**
+ * The default Windows cursor
+ */
+class DefaultWinCursor : public Cursor {
+public:
+ DefaultWinCursor() {}
+ ~DefaultWinCursor() {}
+
+ uint16 getWidth() const { return 12; }
+ uint16 getHeight() const { return 20; }
+ uint16 getHotspotX() const { return 0; }
+ uint16 getHotspotY() const { return 0; }
+ byte getKeyColor() const { return 0; }
+
+ const byte *getSurface() const {
+ static const byte defaultCursor[] = {
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0,
+ 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0,
+ 1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0,
+ 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+ 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0,
+ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0,
+ 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
+ 1, 2, 2, 2, 1, 2, 2, 1, 0, 0, 0, 0,
+ 1, 2, 2, 1, 1, 2, 2, 1, 0, 0, 0, 0,
+ 1, 2, 1, 0, 1, 1, 2, 2, 1, 0, 0, 0,
+ 1, 1, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0
+ };
+
+ return defaultCursor;
+ }
+
+ const byte *getPalette() const {
+ static const byte bwPalette[] = {
+ 0x00, 0x00, 0x00, // Black
+ 0xFF, 0xFF, 0xFF // White
+ };
+
+ return bwPalette;
+ }
+ byte getPaletteStartIndex() const { return 1; }
+ uint16 getPaletteCount() const { return 2; }
+};
+
+Cursor *makeDefaultWinCursor() {
+ return new DefaultWinCursor();
+}
+
} // End of namespace Graphics
diff --git a/graphics/wincursor.h b/graphics/wincursor.h
index 86693db88b..e6b35dc80c 100644
--- a/graphics/wincursor.h
+++ b/graphics/wincursor.h
@@ -26,6 +26,8 @@
#include "common/array.h"
#include "common/winexe.h"
+#include "graphics/cursor.h"
+
namespace Common {
class NEResources;
class PEResources;
@@ -35,7 +37,7 @@ class SeekableReadStream;
namespace Graphics {
/** A Windows cursor. */
-class WinCursor {
+class WinCursor : public Cursor {
public:
WinCursor();
~WinCursor();
@@ -52,7 +54,10 @@ public:
byte getKeyColor() const;
const byte *getSurface() const { return _surface; }
+
const byte *getPalette() const { return _palette; }
+ byte getPaletteStartIndex() const { return 0; }
+ uint16 getPaletteCount() const { return 256; }
/** Read the cursor's data out of a stream. */
bool readFromStream(Common::SeekableReadStream &stream);
@@ -97,6 +102,13 @@ struct WinCursorGroup {
static WinCursorGroup *createCursorGroup(Common::PEResources &exe, const Common::WinResourceID &id);
};
+/**
+ * Create a Cursor for the default Windows cursor.
+ *
+ * @note The calling code is responsible for deleting the returned pointer.
+ */
+Cursor *makeDefaultWinCursor();
+
} // End of namespace Graphics
#endif
diff --git a/graphics/yuv_to_rgb.cpp b/graphics/yuv_to_rgb.cpp
index 037ea9a007..feda48bf6d 100644
--- a/graphics/yuv_to_rgb.cpp
+++ b/graphics/yuv_to_rgb.cpp
@@ -8,19 +8,16 @@
* 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$
- *
*/
// The YUV to RGB conversion code is derived from SDL's YUV overlay code, which
@@ -189,7 +186,9 @@ const YUVToRGBLookup *YUVToRGBManager::getLookup(Graphics::PixelFormat format) {
} // End of namespace Graphics
+namespace Common {
DECLARE_SINGLETON(Graphics::YUVToRGBManager);
+}
#define YUVToRGBMan (Graphics::YUVToRGBManager::instance())
diff --git a/graphics/yuv_to_rgb.h b/graphics/yuv_to_rgb.h
index 9b561f2002..2d3b9e634e 100644
--- a/graphics/yuv_to_rgb.h
+++ b/graphics/yuv_to_rgb.h
@@ -8,24 +8,22 @@
* 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$
- *
*/
/**
* @file
* YUV to RGB conversion used in engines:
+ * - scumm (he)
* - sword25
*/
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index 73c1835c9e..cf16eec238 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -33,6 +33,7 @@
#include "graphics/imagedec.h"
#include "graphics/surface.h"
#include "graphics/VectorRenderer.h"
+#include "graphics/fonts/bdf.h"
#include "gui/widget.h"
#include "gui/ThemeEngine.h"
@@ -589,7 +590,7 @@ bool ThemeEngine::addFont(TextData textId, const Common::String &file) {
#ifdef USE_TRANSLATION
TransMan.setLanguage("C");
#endif
- warning("Failed to load localized font '%s'. Using non-localized font and default GUI language instead", file.c_str());
+ warning("Failed to load localized font '%s'. Using non-localized font and default GUI language instead", localized.c_str());
}
}
}
@@ -659,6 +660,8 @@ bool ThemeEngine::addDrawData(const Common::String &data, bool cached) {
void ThemeEngine::loadTheme(const Common::String &themeId) {
unloadTheme();
+ debug(6, "Loading theme %s", themeId.c_str());
+
if (themeId == "builtin") {
_themeOk = loadDefaultXML();
} else {
@@ -1394,7 +1397,7 @@ const Graphics::Font *ThemeEngine::loadFontFromArchive(const Common::String &fil
if (_themeArchive)
stream = _themeArchive->createReadStreamForMember(filename);
if (stream) {
- font = Graphics::NewFont::loadFont(*stream);
+ font = Graphics::BdfFont::loadFont(*stream);
delete stream;
}
@@ -1408,7 +1411,7 @@ const Graphics::Font *ThemeEngine::loadCachedFontFromArchive(const Common::Strin
if (_themeArchive)
stream = _themeArchive->createReadStreamForMember(filename);
if (stream) {
- font = Graphics::NewFont::loadFromCache(*stream);
+ font = Graphics::BdfFont::loadFromCache(*stream);
delete stream;
}
@@ -1422,7 +1425,7 @@ const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) {
if (!cacheFilename.empty()) {
if (fontFile.open(cacheFilename)) {
- font = Graphics::NewFont::loadFromCache(fontFile);
+ font = Graphics::BdfFont::loadFromCache(fontFile);
}
if (font)
@@ -1434,7 +1437,7 @@ const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) {
// normal open
if (fontFile.open(filename)) {
- font = Graphics::NewFont::loadFont(fontFile);
+ font = Graphics::BdfFont::loadFont(fontFile);
}
if (!font) {
@@ -1443,7 +1446,7 @@ const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) {
if (font) {
if (!cacheFilename.empty()) {
- if (!Graphics::NewFont::cacheFontData(*(const Graphics::NewFont *)font, cacheFilename)) {
+ if (!Graphics::BdfFont::cacheFontData(*(const Graphics::BdfFont *)font, cacheFilename)) {
warning("Couldn't create cache file for font '%s'", filename.c_str());
}
}
diff --git a/gui/console.cpp b/gui/console.cpp
index b656d23a09..dc2c5c4f33 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -665,12 +665,11 @@ int ConsoleDialog::printFormat(int dummy, const char *format, ...) {
}
int ConsoleDialog::vprintFormat(int dummy, const char *format, va_list argptr) {
- char buf[2048];
+ Common::String buf = Common::String::vformat(format, argptr);
- int count = vsnprintf(buf, sizeof(buf), format, argptr);
- buf[sizeof(buf)-1] = 0; // ensure termination
- print(buf);
- return count;
+ print(buf.c_str());
+
+ return buf.size();
}
void ConsoleDialog::printChar(int c) {
diff --git a/gui/credits.h b/gui/credits.h
index 5bc6d56ff4..3a7e77c146 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -2,9 +2,20 @@
static const char *credits[] = {
"C1""ScummVM Team",
"",
-"C1""Project Leaders",
+"C1""Project Leader",
"C0""Eugene Sandulenko",
"",
+"C1""PR Office",
+"C0""Arnaud Boutonn\351",
+"C2""Public Relations Officer, Project Administrator",
+"C0""Eugene Sandulenko",
+"C2""Project Leader",
+"",
+"C1""Core Team",
+"C0""Willem Jan Palenstijn",
+"C0""Eugene Sandulenko",
+"C0""Johannes Schickel",
+"",
"C1""Retired Project Leaders",
"C0""James Brown",
"C0""Vincent Hamm",
@@ -25,7 +36,6 @@ static const char *credits[] = {
"C0""Max Horn",
"C2""(retired)",
"C0""Travis Howell",
-"C2""(retired)",
"C0""Pawel Kolodziejski",
"C2""Codecs, iMUSE, Smush, etc.",
"C0""Gregory Montoir",
@@ -38,7 +48,6 @@ static const char *credits[] = {
"C0""Jonathan Gray",
"C2""(retired)",
"C0""Travis Howell",
-"C2""(retired)",
"C0""Gregory Montoir",
"C0""Eugene Sandulenko",
"",
@@ -48,6 +57,7 @@ static const char *credits[] = {
"C0""Filippos Karapetis",
"C0""Pawel Kolodziejski",
"C0""Walter van Niftrik",
+"C2""(retired)",
"C0""Kari Salminen",
"C0""Eugene Sandulenko",
"C0""David Symonds",
@@ -57,12 +67,15 @@ static const char *credits[] = {
"C0""Torbj\366rn Andersson",
"C0""Paul Gilbert",
"C0""Travis Howell",
-"C2""(retired)",
"C0""Oliver Kiehl",
"C2""(retired)",
"C0""Ludvig Strigeus",
"C2""(retired)",
"",
+"C1""CGE",
+"C0""Arnaud Boutonn\351",
+"C0""Paul Gilbert",
+"",
"C1""Cine",
"C0""Vincent Hamm",
"C2""(retired)",
@@ -85,8 +98,9 @@ static const char *credits[] = {
"C0""Pawel Kolodziejski",
"",
"C1""DreamWeb",
-"C0""Vladimir Menshakov",
"C0""Torbj\366rn Andersson",
+"C0""Bertrand Augereau",
+"C0""Vladimir Menshakov",
"",
"C1""Gob",
"C0""Torbj\366rn Andersson",
@@ -161,6 +175,7 @@ static const char *credits[] = {
"C0""Filippos Karapetis",
"C0""Martin Kiewitz",
"C0""Walter van Niftrik",
+"C2""(retired)",
"C0""Willem Jan Palenstijn",
"C0""Jordi Vilalta Prat",
"C0""Lars Skovlund",
@@ -188,12 +203,12 @@ static const char *credits[] = {
"C2""(retired)",
"",
"C1""Sword25",
-"C0""Eugene Sandulenko",
-"C0""Filippos Karapetis",
+"C0""Torbj\366rn Andersson",
+"C0""Paul Gilbert",
"C0""Max Horn",
"C2""(retired)",
-"C0""Paul Gilbert",
-"C0""Torbj\366rn Andersson",
+"C0""Filippos Karapetis",
+"C0""Eugene Sandulenko",
"",
"C1""TeenAgent",
"C0""Robert Megone",
@@ -218,8 +233,8 @@ static const char *credits[] = {
"C0""Gregory Montoir",
"",
"C1""TsAGE",
-"C0""Paul Gilbert",
"C0""Arnaud Boutonn\351",
+"C0""Paul Gilbert",
"",
"C1""Tucker",
"C0""Gregory Montoir",
@@ -230,6 +245,9 @@ static const char *credits[] = {
"C0""Andre Heider",
"C0""Angus Lees",
"",
+"C1""BADA",
+"C0""Chris Warren-Smith",
+"",
"C1""Dreamcast",
"C0""Marcus Comstedt",
"",
@@ -244,11 +262,15 @@ static const char *credits[] = {
"",
"C1""Maemo",
"C0""Frantisek Dufka",
+"C2""(retired)",
+"C0""Tarek Soliman",
"",
"C1""Nintendo 64",
"C0""Fabio Battaglia",
"",
"C1""Nintendo DS",
+"C0""Bertrand Augereau",
+"C2""HQ software scaler",
"C0""Neil Millstone",
"",
"C1""OpenPandora",
@@ -267,8 +289,8 @@ static const char *credits[] = {
"C0""Max Lingua",
"",
"C1""PSP (PlayStation Portable)",
-"C0""Joost Peters",
"C0""Yotam Barnoy",
+"C0""Joost Peters",
"",
"C1""SDL (Win/Linux/OS X/etc.)",
"C0""Max Horn",
@@ -419,7 +441,6 @@ static const char *credits[] = {
"",
"C1""Win32",
"C0""Travis Howell",
-"C2""(retired)",
"",
"C1""Win64",
"C0""Chris Gray",
@@ -481,16 +502,16 @@ static const char *credits[] = {
"C1""Websites (design)",
"C0""Dob\363 Bal\341zs",
"C2""Website design",
+"C0""William Claydon",
+"C2""Skins for doxygen, buildbot and wiki",
"C0""Yaroslav Fedevych",
"C2""HTML/CSS for the website",
-"C0""David Jensen",
-"C2""SVG logo conversion",
"C0""Jean Marc Gimenez",
"C2""ScummVM logo",
+"C0""David Jensen",
+"C2""SVG logo conversion",
"C0""Raina",
"C2""ScummVM forum buttons",
-"C0""William Claydon",
-"C2""Skins for doxygen, buildbot and wiki",
"",
"C1""Code contributions",
"C0""Ori Avtalion",
@@ -529,7 +550,7 @@ static const char *credits[] = {
"C2""Initial MI1 CD music support",
"C0""Quietust",
"C2""Sound support for Amiga SCUMM V2/V3 games, MM NES support",
-"C0""segra",
+"C0""Robert Crossfield",
"C2""Improved support for Apple II/C64 versions of MM",
"C0""Andreas R\366ver",
"C2""Broken Sword I & II MPEG2 cutscene support",
@@ -541,76 +562,76 @@ static const char *credits[] = {
"C2""SDL-based OpenGL renderer",
"",
"C1""FreeSCI Contributors",
-"C0""Anders Baden Nielsen",
-"C2""PPC testing",
-"C0""Bas Zoetekouw",
-"C2""Man pages, debian package management, CVS maintenance",
-"C0""Carl Muckenhoupt",
-"C2""Sources to the SCI resource viewer tools that started it all",
+"C0""Francois-R Boyer",
+"C2""MT-32 information and mapping code",
+"C0""Rainer Canavan",
+"C2""IRIX MIDI driver and bug fixes",
+"C0""Xiaojun Chen",
+"C0""Paul David Doherty",
+"C2""Game version information",
+"C0""Vyacheslav Dikonov",
+"C2""Config script improvements",
+"C0""Ruediger Hanke",
+"C2""Port to the MorphOS platform",
+"C0""Matt Hargett",
+"C2""Clean-ups, bugfixes, Hardcore QA, Win32",
+"C0""Max Horn",
+"C2""SetJump implementation",
+"C0""Ravi I.",
+"C2""SCI0 sound resource specification",
+"C0""Emmanuel Jeandel",
+"C2""Bugfixes and bug reports",
+"C0""Dmitry Jemerov",
+"C2""Port to the Win32 platform, numerous bugfixes",
"C0""Chris Kehler",
"C2""Makefile enhancements",
-"C0""Christoph Reichenbach",
-"C2""UN*X code, VM/Graphics/Sound/other infrastructure",
"C0""Christopher T. Lansdown",
"C2""Original CVS maintainer, Alpha compatibility fixes",
+"C0""Sergey Lapin",
+"C2""Port of Carl's type 2 decompression code",
+"C0""Rickard Lind",
+"C2""MT-32->GM MIDI mapping magic, sound research",
+"C0""Hubert Maier",
+"C2""AmigaOS 4 port",
+"C0""Johannes Manhave",
+"C2""Document format translation",
"C0""Claudio Matsuoka",
"C2""CVS snapshots, daily builds, BeOS and cygwin ports",
"C0""Dark Minister",
"C2""SCI research (bytecode and parser)",
-"C0""Dmitry Jemerov",
-"C2""Port to the Win32 platform, numerous bugfixes",
-"C0""Emmanuel Jeandel",
-"C2""Bugfixes and bug reports",
-"C0""Francois-R Boyer",
-"C2""MT-32 information and mapping code",
+"C0""Carl Muckenhoupt",
+"C2""Sources to the SCI resource viewer tools that started it all",
+"C0""Anders Baden Nielsen",
+"C2""PPC testing",
+"C0""Walter van Niftrik",
+"C2""Ports to the Dreamcast and GP32 platforms",
+"C0""Rune Orsval",
+"C2""Configuration file editor",
+"C0""Solomon Peachy",
+"C2""SDL ports and much of the sound subsystem",
+"C0""Robey Pointer",
+"C2""Bug tracking system hosting",
+"C0""Magnus Reftel",
+"C2""Heap implementation, Python class viewer, bugfixes",
+"C0""Christoph Reichenbach",
+"C2""UN*X code, VM/Graphics/Sound/other infrastructure",
"C0""George Reid",
"C2""FreeBSD package management",
-"C0""Hubert Maier",
-"C2""AmigaOS 4 port",
+"C0""Lars Skovlund",
+"C2""Project maintenance, most documentation, bugfixes, SCI1 support",
+"C0""Rink Springer",
+"C2""Port to the DOS platform, several bug fixes",
+"C0""Rainer De Temple",
+"C2""SCI research",
+"C0""Sean Terrell",
"C0""Hugues Valois",
"C2""Game selection menu",
-"C0""Johannes Manhave",
-"C2""Document format translation",
"C0""Jordi Vilalta",
"C2""Numerous code and website clean-up patches",
-"C0""Lars Skovlund",
-"C2""Project maintenance, most documentation, bugfixes, SCI1 support",
-"C0""Magnus Reftel",
-"C2""Heap implementation, Python class viewer, bugfixes",
-"C0""Matt Hargett",
-"C2""Clean-ups, bugfixes, Hardcore QA, Win32",
-"C0""Max Horn",
-"C2""SetJump implementation",
-"C0""Paul David Doherty",
-"C2""Game version information",
"C0""Petr Vyhnak",
"C2""The DCL-INFLATE algorithm, many Win32 improvements",
-"C0""Rainer Canavan",
-"C2""IRIX MIDI driver and bug fixes",
-"C0""Rainer De Temple",
-"C2""SCI research",
-"C0""Ravi I.",
-"C2""SCI0 sound resource specification",
-"C0""Ruediger Hanke",
-"C2""Port to the MorphOS platform",
-"C0""Rune Orsval",
-"C2""Configuration file editor",
-"C0""Rickard Lind",
-"C2""MT-32->GM MIDI mapping magic, sound research",
-"C0""Rink Springer",
-"C2""Port to the DOS platform, several bug fixes",
-"C0""Robey Pointer",
-"C2""Bug tracking system hosting",
-"C0""Sergey Lapin",
-"C2""Port of Carl's type 2 decompression code",
-"C0""Solomon Peachy",
-"C2""SDL ports and much of the sound subsystem",
-"C0""Vyacheslav Dikonov",
-"C2""Config script improvements",
-"C0""Walter van Niftrik",
-"C2""Ports to the Dreamcast and GP32 platforms",
-"C0""Xiaojun Chen",
-"C0""Sean Terrell",
+"C0""Bas Zoetekouw",
+"C2""Man pages, debian package management, CVS maintenance",
"C0""Special thanks to Prof. Dr. Gary Nutt for allowing the FreeSCI VM extension as a course project in his Advanced OS course.",
"C0""",
"C0""Special thanks to Bob Heitman and Corey Cole for their support of FreeSCI.",
diff --git a/gui/debugger.h b/gui/debugger.h
index b74b0d6f0f..3a587d2723 100644
--- a/gui/debugger.h
+++ b/gui/debugger.h
@@ -26,6 +26,7 @@
#include "common/ptr.h"
#include "common/hashmap.h"
#include "common/hash-str.h"
+#include "common/array.h"
namespace GUI {
diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp
index af1852d56d..212d68430c 100644
--- a/gui/gui-manager.cpp
+++ b/gui/gui-manager.cpp
@@ -39,7 +39,9 @@
#include "graphics/cursorman.h"
+namespace Common {
DECLARE_SINGLETON(GUI::GuiManager);
+}
namespace GUI {
diff --git a/gui/launcher.cpp b/gui/launcher.cpp
index 6920e0ccd2..8e94c140a4 100644
--- a/gui/launcher.cpp
+++ b/gui/launcher.cpp
@@ -252,7 +252,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
else
_globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _c("Override global MIDI settings", "lowres"), 0, kCmdGlobalMIDIOverride);
- if (_guioptions & Common::GUIO_NOMIDI)
+ if (_guioptions.contains(GUIO_NOMIDI))
_globalMIDIOverride->setEnabled(false);
addMIDIControls(tab, "GameOptions_MIDI.");
@@ -267,7 +267,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
else
_globalMT32Override = new CheckboxWidget(tab, "GameOptions_MT32.EnableTabCheckbox", _c("Override global MT-32 settings", "lowres"), 0, kCmdGlobalMT32Override);
- //if (_guioptions & Common::GUIO_NOMIDI)
+ //if (_guioptions.contains(GUIO_NOMIDI))
// _globalMT32Override->setEnabled(false);
addMT32Controls(tab, "GameOptions_MT32.");
@@ -1038,7 +1038,7 @@ void LauncherDialog::updateButtons() {
bool en = enable;
if (item >= 0)
- en = !(Common::checkGameGUIOption(Common::GUIO_NOLAUNCHLOAD, ConfMan.get("guioptions", _domains[item])));
+ en = !(Common::checkGameGUIOption(GUIO_NOLAUNCHLOAD, ConfMan.get("guioptions", _domains[item])));
if (en != _loadButton->isEnabled()) {
_loadButton->setEnabled(en);
@@ -1052,7 +1052,7 @@ void LauncherDialog::updateButtons() {
const char *newAddButtonLabel = massAdd
? (lowRes ? _c("Mass Add...", "lowres") : _("Mass Add..."))
- : (lowRes ? _c("Add Game...", "lowres") : _("Add Game..."));
+ : (lowRes ? _c("~A~dd Game...", "lowres") : _("~A~dd Game..."));
if (_addButton->getLabel() != newAddButtonLabel)
_addButton->setLabel(newAddButtonLabel);
diff --git a/gui/options.cpp b/gui/options.cpp
index 3cc2eea6b9..67204fc343 100644
--- a/gui/options.cpp
+++ b/gui/options.cpp
@@ -141,7 +141,7 @@ void OptionsDialog::init() {
_oldTheme = g_gui.theme()->getThemeId();
// Retrieve game GUI options
- _guioptions = 0;
+ _guioptions = "";
if (ConfMan.hasKey("guioptions", _domain)) {
_guioptionsString = ConfMan.get("guioptions", _domain);
_guioptions = parseGameGUIOptions(_guioptionsString);
@@ -155,7 +155,7 @@ void OptionsDialog::open() {
setResult(0);
// Retrieve game GUI options
- _guioptions = 0;
+ _guioptions = "";
if (ConfMan.hasKey("guioptions", _domain)) {
_guioptionsString = ConfMan.get("guioptions", _domain);
_guioptions = parseGameGUIOptions(_guioptionsString);
@@ -595,11 +595,15 @@ void OptionsDialog::setAudioSettingsState(bool enabled) {
_midiPopUpDesc->setEnabled(enabled);
_midiPopUp->setEnabled(enabled);
- uint32 allFlags = MidiDriver::musicType2GUIO((uint32)-1);
+ Common::String allFlags = MidiDriver::musicType2GUIO((uint32)-1);
+ char opt[256];
+
+ strncpy(opt, _guioptions.c_str(), 256);
+ bool hasMidiDefined = (strtok(opt, allFlags.c_str()) != NULL);
if (_domain != Common::ConfigManager::kApplicationDomain && // global dialog
- (_guioptions & allFlags) && // No flags are specified
- !(_guioptions & Common::GUIO_MIDIADLIB)) {
+ hasMidiDefined && // No flags are specified
+ !(_guioptions.contains(GUIO_MIDIADLIB))) {
_oplPopUpDesc->setEnabled(false);
_oplPopUp->setEnabled(false);
} else {
@@ -611,7 +615,7 @@ void OptionsDialog::setAudioSettingsState(bool enabled) {
}
void OptionsDialog::setMIDISettingsState(bool enabled) {
- if (_guioptions & Common::GUIO_NOMIDI)
+ if (_guioptions.contains(GUIO_NOMIDI))
enabled = false;
_gmDevicePopUpDesc->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false);
@@ -649,7 +653,7 @@ void OptionsDialog::setVolumeSettingsState(bool enabled) {
_enableVolumeSettings = enabled;
ena = enabled && !_muteCheckbox->getState();
- if (_guioptions & Common::GUIO_NOMUSIC)
+ if (_guioptions.contains(GUIO_NOMUSIC))
ena = false;
_musicVolumeDesc->setEnabled(ena);
@@ -657,7 +661,7 @@ void OptionsDialog::setVolumeSettingsState(bool enabled) {
_musicVolumeLabel->setEnabled(ena);
ena = enabled && !_muteCheckbox->getState();
- if (_guioptions & Common::GUIO_NOSFX)
+ if (_guioptions.contains(GUIO_NOSFX))
ena = false;
_sfxVolumeDesc->setEnabled(ena);
@@ -665,7 +669,7 @@ void OptionsDialog::setVolumeSettingsState(bool enabled) {
_sfxVolumeLabel->setEnabled(ena);
ena = enabled && !_muteCheckbox->getState();
- if (_guioptions & Common::GUIO_NOSPEECH)
+ if (_guioptions.contains(GUIO_NOSPEECH))
ena = false;
_speechVolumeDesc->setEnabled(ena);
@@ -680,14 +684,14 @@ void OptionsDialog::setSubtitleSettingsState(bool enabled) {
_enableSubtitleSettings = enabled;
ena = enabled;
- if ((_guioptions & Common::GUIO_NOSUBTITLES) || (_guioptions & Common::GUIO_NOSPEECH))
+ if ((_guioptions.contains(GUIO_NOSUBTITLES)) || (_guioptions.contains(GUIO_NOSPEECH)))
ena = false;
_subToggleGroup->setEnabled(ena);
_subToggleDesc->setEnabled(ena);
ena = enabled;
- if (_guioptions & Common::GUIO_NOSUBTITLES)
+ if (_guioptions.contains(GUIO_NOSUBTITLES))
ena = false;
_subSpeedDesc->setEnabled(ena);
@@ -741,22 +745,26 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref
_midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound card emulator"));
// Populate it
- uint32 allFlags = MidiDriver::musicType2GUIO((uint32)-1);
+ Common::String allFlags = MidiDriver::musicType2GUIO((uint32)-1);
+ char opt[256];
+
+ strncpy(opt, _guioptions.c_str(), 256);
+ bool hasMidiDefined = (strtok(opt, allFlags.c_str()) != NULL);
const MusicPlugin::List p = MusicMan.getPlugins();
for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) {
MusicDevices i = (**m)->getDevices();
for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) {
- const uint32 deviceGuiOption = MidiDriver::musicType2GUIO(d->getMusicType());
+ Common::String deviceGuiOption = MidiDriver::musicType2GUIO(d->getMusicType());
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 && d->getMusicType() != MT_PC98)
- || (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) // No flags are specified
- || (_guioptions & deviceGuiOption) // flag is present
+ || (_domain != Common::ConfigManager::kApplicationDomain && !hasMidiDefined) // No flags are specified
+ || (_guioptions.contains(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))
+ || (deviceGuiOption.contains(GUIO_MIDIGM) && (_guioptions.contains(GUIO_MIDIMT32)))
|| d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device
_midiPopUp->appendEntry(d->getCompleteName(), d->getHandle());
}
@@ -997,9 +1005,9 @@ void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String se
}
int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) {
- if (_guioptions & Common::GUIO_NOSUBTITLES)
+ if (_guioptions.contains(GUIO_NOSUBTITLES))
return kSubtitlesSpeech; // Speech only
- if (_guioptions & Common::GUIO_NOSPEECH)
+ if (_guioptions.contains(GUIO_NOSPEECH))
return kSubtitlesSubs; // Subtitles only
if (!subtitles && !speech_mute) // Speech only
diff --git a/gui/options.h b/gui/options.h
index f17669a3cc..c6b1d328c1 100644
--- a/gui/options.h
+++ b/gui/options.h
@@ -172,7 +172,7 @@ protected:
//
// Game GUI options
//
- uint32 _guioptions;
+ Common::String _guioptions;
Common::String _guioptionsString;
//
diff --git a/gui/saveload.cpp b/gui/saveload.cpp
index 460246e5fc..ae950a21fb 100644
--- a/gui/saveload.cpp
+++ b/gui/saveload.cpp
@@ -131,7 +131,7 @@ void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 da
if (_list->isEditable() || !_list->getSelectedString().empty()) {
_list->endEditMode();
if (!_saveList.empty()) {
- setResult(atoi(_saveList[selItem].save_slot().c_str()));
+ setResult(_saveList[selItem].getSaveSlot());
_resultString = _list->getSelectedString();
}
close();
@@ -141,7 +141,7 @@ void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 da
case kChooseCmd:
_list->endEditMode();
if (!_saveList.empty()) {
- setResult(atoi(_saveList[selItem].save_slot().c_str()));
+ setResult(_saveList[selItem].getSaveSlot());
_resultString = _list->getSelectedString();
}
close();
@@ -154,7 +154,7 @@ void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 da
MessageDialog alert(_("Do you really want to delete this savegame?"),
_("Delete"), _("Cancel"));
if (alert.runModal() == GUI::kMessageOK) {
- (*_plugin)->removeSaveState(_target.c_str(), atoi(_saveList[selItem].save_slot().c_str()));
+ (*_plugin)->removeSaveState(_target.c_str(), _saveList[selItem].getSaveSlot());
setResult(-1);
_list->setSelected(-1);
@@ -240,11 +240,11 @@ void SaveLoadChooser::updateSelection(bool redraw) {
_time->setLabel(_("No time saved"));
_playtime->setLabel(_("No playtime saved"));
- if (selItem >= 0 && !_list->getSelectedString().empty() && _metaInfoSupport) {
- SaveStateDescriptor desc = (*_plugin)->querySaveMetaInfos(_target.c_str(), atoi(_saveList[selItem].save_slot().c_str()));
+ if (selItem >= 0 && _metaInfoSupport) {
+ SaveStateDescriptor desc = (*_plugin)->querySaveMetaInfos(_target.c_str(), _saveList[selItem].getSaveSlot());
- isDeletable = desc.getBool("is_deletable") && _delSupport;
- isWriteProtected = desc.getBool("is_write_protected");
+ isDeletable = desc.getDeletableFlag() && _delSupport;
+ isWriteProtected = desc.getWriteProtectedFlag();
// Don't allow the user to change the description of write protected games
if (isWriteProtected)
@@ -259,16 +259,19 @@ void SaveLoadChooser::updateSelection(bool redraw) {
}
if (_saveDateSupport) {
- if (desc.contains("save_date"))
- _date->setLabel(_("Date: ") + desc.getVal("save_date"));
+ const Common::String &saveDate = desc.getSaveDate();
+ if (!saveDate.empty())
+ _date->setLabel(_("Date: ") + saveDate);
- if (desc.contains("save_time"))
- _time->setLabel(_("Time: ") + desc.getVal("save_time"));
+ const Common::String &saveTime = desc.getSaveTime();
+ if (!saveTime.empty())
+ _time->setLabel(_("Time: ") + saveTime);
}
if (_playTimeSupport) {
- if (desc.contains("play_time"))
- _playtime->setLabel(_("Playtime: ") + desc.getVal("play_time"));
+ const Common::String &playTime = desc.getPlayTime();
+ if (!playTime.empty())
+ _playtime->setLabel(_("Playtime: ") + playTime);
}
}
@@ -326,25 +329,25 @@ void SaveLoadChooser::updateSaveList() {
ListWidget::ColorList colors;
for (SaveStateList::const_iterator x = _saveList.begin(); x != _saveList.end(); ++x) {
// Handle gaps in the list of save games
- saveSlot = atoi(x->save_slot().c_str());
+ saveSlot = x->getSaveSlot();
if (curSlot < saveSlot) {
while (curSlot < saveSlot) {
SaveStateDescriptor dummySave(curSlot, "");
_saveList.insert_at(curSlot, dummySave);
- saveNames.push_back(dummySave.description());
+ saveNames.push_back(dummySave.getDescription());
colors.push_back(ThemeEngine::kFontColorNormal);
curSlot++;
}
// Sync the save list iterator
for (x = _saveList.begin(); x != _saveList.end(); ++x) {
- if (atoi(x->save_slot().c_str()) == saveSlot)
+ if (x->getSaveSlot() == saveSlot)
break;
}
}
// Show "Untitled savestate" for empty/whitespace savegame descriptions
- Common::String description = x->description();
+ Common::String description = x->getDescription();
Common::String trimmedDescription = description;
trimmedDescription.trim();
if (trimmedDescription.empty()) {
diff --git a/gui/themebrowser.cpp b/gui/themebrowser.cpp
index 831cee1996..c22603b822 100644
--- a/gui/themebrowser.cpp
+++ b/gui/themebrowser.cpp
@@ -117,4 +117,3 @@ void ThemeBrowser::updateListing() {
}
} // End of namespace GUI
-
diff --git a/gui/themebrowser.h b/gui/themebrowser.h
index 9da57622db..daea3836fc 100644
--- a/gui/themebrowser.h
+++ b/gui/themebrowser.h
@@ -54,4 +54,3 @@ private:
} // End of namespace GUI
#endif
-
diff --git a/gui/themes/fonts/topaz/README.ScummVM b/gui/themes/fonts/topaz/README.ScummVM
index 3beea8a048..55b0b16856 100644
--- a/gui/themes/fonts/topaz/README.ScummVM
+++ b/gui/themes/fonts/topaz/README.ScummVM
@@ -3,4 +3,3 @@ You will find detailed information in topazLT.readme.
The Parallaction engine in ScummVM uses this font's bitmap, namely file topazlt/8.
Data has been extracted and placed in the array named _amigaTopazFont which can be found in engines/parallaction/staticres.cpp.
-
diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat
index f218747182..770f76ddf1 100644
--- a/gui/themes/translations.dat
+++ b/gui/themes/translations.dat
Binary files differ
diff --git a/gui/widget.cpp b/gui/widget.cpp
index 8420391a3f..c4d288eb11 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -298,6 +298,10 @@ void ButtonWidget::drawWidget() {
g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), _label, _state, getFlags());
}
+void ButtonWidget::setLabel(const Common::String &label) {
+ StaticTextWidget::setLabel(cleanupHotkey(label));
+}
+
#pragma mark -
PicButtonWidget::PicButtonWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd, uint8 hotkey)
diff --git a/gui/widget.h b/gui/widget.h
index 70f2da4c98..acd575a90b 100644
--- a/gui/widget.h
+++ b/gui/widget.h
@@ -186,6 +186,8 @@ public:
void setCmd(uint32 cmd) { _cmd = cmd; }
uint32 getCmd() const { return _cmd; }
+ void setLabel(const Common::String &label);
+
void handleMouseUp(int x, int y, int button, int clickCount);
void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); draw(); }
void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); draw(); }
diff --git a/gui/widgets/scrollbar.cpp b/gui/widgets/scrollbar.cpp
index cc8e587668..e0dbcec59c 100644
--- a/gui/widgets/scrollbar.cpp
+++ b/gui/widgets/scrollbar.cpp
@@ -55,7 +55,7 @@ static void upArrowRepeater(void *ref) {
sb->checkBounds(old_pos);
g_system->getTimerManager()->removeTimerProc(&upArrowRepeater);
- g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/10, ref);
+ g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/10, ref, "guiScrollBarUp");
}
static void downArrowRepeater(void *ref) {
@@ -66,7 +66,7 @@ static void downArrowRepeater(void *ref) {
sb->checkBounds(old_pos);
g_system->getTimerManager()->removeTimerProc(&downArrowRepeater);
- g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/10, ref);
+ g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/10, ref, "guiScrollBarDown");
}
void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) {
@@ -80,12 +80,12 @@ void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount)
// Up arrow
_currentPos--;
_draggingPart = kUpArrowPart;
- g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/2, this);
+ g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/2, this, "guiScrollBarUp");
} else if (y >= _h - UP_DOWN_BOX_HEIGHT) {
// Down arrow
_currentPos++;
_draggingPart = kDownArrowPart;
- g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/2, this);
+ g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/2, this, "guiScrollBarDown");
} else if (y < _sliderPos) {
_currentPos -= _entriesPerPage - 1;
} else if (y >= _sliderPos + _sliderHeight) {
diff --git a/icons/count.ico b/icons/count.ico
new file mode 100644
index 0000000000..73e399e394
--- /dev/null
+++ b/icons/count.ico
Binary files differ
diff --git a/icons/scummvm.ico b/icons/scummvm.ico
index 0142e90f14..0283e8432e 100644
--- a/icons/scummvm.ico
+++ b/icons/scummvm.ico
Binary files differ
diff --git a/icons/scummvm.svg b/icons/scummvm.svg
index 8fcdf6af40..abf5b79e07 100644
--- a/icons/scummvm.svg
+++ b/icons/scummvm.svg
@@ -108,4 +108,4 @@
id="image5920"
x="9"
y="26.110352"
- style="display:inline" /></g></svg> \ No newline at end of file
+ style="display:inline" /></g></svg>
diff --git a/po/POTFILES b/po/POTFILES
index 3ffb587f01..6ce26a0539 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -63,6 +63,7 @@ backends/keymapper/remap-dialog.cpp
backends/midi/windows.cpp
backends/platform/ds/arm9/source/dsoptions.cpp
backends/platform/iphone/osys_events.cpp
+backends/platform/sdl/macosx/appmenu_osx.mm
backends/graphics/surfacesdl/surfacesdl-graphics.cpp
backends/graphics/opengl/opengl-graphics.cpp
backends/graphics/openglsdl/openglsdl-graphics.cpp
@@ -77,3 +78,6 @@ backends/platform/wince/wince-sdl.cpp
backends/events/default/default-events.cpp
backends/events/gph/gph-events.cpp
backends/events/openpandora/op-events.cpp
+backends/updates/macosx/macosx-updates.mm
+backends/platform/bada/form.cpp
+backends/events/maemosdl/maemosdl-events.cpp
diff --git a/po/ca_ES.po b/po/ca_ES.po
index d837be093f..5d76935a21 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2010-09-21 23:12+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-04 20:51+0100\n"
"Last-Translator: Jordi Vilalta Prat <jvprat@jvprat.com>\n"
"Language-Team: Catalan <scummvm-devel@lists.sf.net>\n"
+"Language: Catalan\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Catalan\n"
#: gui/about.cpp:91
#, c-format
@@ -43,10 +43,11 @@ msgid "Go up"
msgstr "Amunt"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -56,50 +57,51 @@ msgstr "Cancel·la"
msgid "Choose"
msgstr "Escull"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Tanca"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Clic del ratolí"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Mostra el teclat"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
-msgstr "Remapeja les tecles"
+msgstr "Assigna les tecles"
#: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145
msgid "Choose an action to map"
-msgstr "Sel·leccioneu una acció a mapejar"
+msgstr "Sel·leccioneu una acció a assignar"
#: gui/KeysDialog.cpp:41
msgid "Map"
-msgstr "Mapeja"
+msgstr "Assigna"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "D'acord"
#: gui/KeysDialog.cpp:49
msgid "Select an action and click 'Map'"
-msgstr "Seleccioneu una acció i cliqueu 'Mapeja'"
+msgstr "Seleccioneu una acció i cliqueu 'Assigna'"
#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141
#, c-format
@@ -342,7 +344,7 @@ msgstr ""
msgid "~Q~uit"
msgstr "~T~anca"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Surt de ScummVM"
@@ -350,7 +352,7 @@ msgstr "Surt de ScummVM"
msgid "A~b~out..."
msgstr "~Q~uant a..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Quant a ScummVM"
@@ -378,7 +380,7 @@ msgstr "~C~arrega..."
msgid "Load savegame for selected game"
msgstr "Carrega una partida pel joc seleccionat"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~A~fegeix Joc..."
@@ -404,7 +406,7 @@ msgstr ""
"Elimina un joc de la llista. Els fitxers de dades del joc es mantenen "
"intactes"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~fegeix Joc..."
@@ -432,14 +434,14 @@ msgid "Clear value"
msgstr "Neteja el valor"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Carrega partida:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Carrega"
@@ -453,17 +455,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Sí"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "No"
@@ -501,37 +503,29 @@ msgstr "Afegeix Jocs"
msgid "Mass Add..."
msgstr "Addició Massiva..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Afegeix Joc..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Afegeix Joc..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... progrés ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "S'ha acabat la cerca!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
-msgstr ""
+msgstr "S'han trobat %d jocs nous, s'han ignorat %d jocs afegits prèviament."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "S'han cercat %d directoris ..."
-#: gui/massadd.cpp:253
-#, fuzzy, c-format
+#: gui/massadd.cpp:268
+#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "S'han trobat %d jocs nous ..."
+msgstr ""
+"S'han trobat %d jocs nous, s'han ignorat %d jocs afegits anteriorment ..."
#: gui/options.cpp:72
msgid "Never"
@@ -581,19 +575,19 @@ msgstr "Cap"
#: gui/options.cpp:372
msgid "Failed to apply some of the graphic options changes:"
-msgstr ""
+msgstr "No s'han pogut aplicar alguns canvis de les opcions gràfiques:"
#: gui/options.cpp:384
msgid "the video mode could not be changed."
-msgstr ""
+msgstr "no s'ha pogut canviar el mode de vídeo"
#: gui/options.cpp:390
msgid "the fullscreen setting could not be changed"
-msgstr ""
+msgstr "no s'ha pogut canviar l'ajust de pantalla completa"
#: gui/options.cpp:396
msgid "the aspect ratio setting could not be changed"
-msgstr ""
+msgstr "no s'ha pogut canviar l'ajust de la correcció d'aspecte"
#: gui/options.cpp:705
msgid "Graphics mode:"
@@ -605,11 +599,11 @@ msgstr "Mode de pintat:"
#: gui/options.cpp:716 gui/options.cpp:717
msgid "Special dithering modes supported by some games"
-msgstr "Modes de dispersió especials suportats per alguns jocs"
+msgstr "Modes de tramat especials suportats per alguns jocs"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Mode pantalla completa"
@@ -623,11 +617,11 @@ msgstr "Corregeix la relació d'aspecte per jocs de 320x200"
#: gui/options.cpp:730
msgid "EGA undithering"
-msgstr ""
+msgstr "Elimina el tramat d'EGA"
#: gui/options.cpp:730
msgid "Enable undithering in EGA games that support it"
-msgstr ""
+msgstr "Activa l'eliminació del tramat en els jocs EGA que ho suportin"
#: gui/options.cpp:738
msgid "Preferred Device:"
@@ -686,11 +680,11 @@ msgstr ""
#: gui/options.cpp:799
msgid "Don't use General MIDI music"
-msgstr ""
+msgstr "No utilitzis música General MIDI"
#: gui/options.cpp:810 gui/options.cpp:871
msgid "Use first available device"
-msgstr ""
+msgstr "Utilitza el primer dispositiu disponible"
#: gui/options.cpp:822
msgid "SoundFont:"
@@ -755,9 +749,8 @@ msgstr ""
"Roland MT-32"
#: gui/options.cpp:861
-#, fuzzy
msgid "Don't use Roland MT-32 music"
-msgstr "Roland MT-32 real (sense emulació GM)"
+msgstr "No utilitzis música de Roland MT-32"
#: gui/options.cpp:888
msgid "Text and Speech:"
@@ -904,9 +897,8 @@ msgid "Language of ScummVM GUI"
msgstr "Idioma de la interfície d'usuari de ScummVM"
#: gui/options.cpp:1295
-#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
-msgstr "Heu de reiniciar ScummVM perquè tots els canvis tingui efecte."
+msgstr "Heu de reiniciar ScummVM perquè tots els canvis tinguin efecte."
#: gui/options.cpp:1308
msgid "Select directory for savegames"
@@ -958,19 +950,19 @@ msgstr "Suprimeix"
msgid "Do you really want to delete this savegame?"
msgstr "Realment voleu suprimir aquesta partida?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Data: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Hora: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Temps de joc: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Partida sense títol"
@@ -978,79 +970,76 @@ msgstr "Partida sense títol"
msgid "Select a Theme"
msgstr "Seleccioneu un Tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "GFX desactivats"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desactivats"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Pintat estàndard (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Estàndard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Pintat amb antialias (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Amb antialias (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "El motor no suporta el nivell de depuració '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menú"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Salta"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausa"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Salta la línia"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Error al executar el joc:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "No s'ha pogut trobar cap motor capaç d'executar el joc seleccionat"
#: common/error.cpp:38
msgid "No error"
-msgstr ""
+msgstr "Cap error"
#: common/error.cpp:40
-#, fuzzy
msgid "Game data not found"
msgstr "No s'han trobat les dades del joc"
#: common/error.cpp:42
-#, fuzzy
msgid "Game id not supported"
msgstr "Identificador de joc no suportat"
#: common/error.cpp:44
-#, fuzzy
msgid "Unsupported color mode"
msgstr "Mode de color no suportat"
@@ -1063,7 +1052,6 @@ msgid "Write permission denied"
msgstr "S'ha denegat el permís d'escriptura"
#: common/error.cpp:52
-#, fuzzy
msgid "Path does not exist"
msgstr "El camí no existeix"
@@ -1080,9 +1068,8 @@ msgid "Cannot create file"
msgstr "No s'ha pogut crear el fitxer"
#: common/error.cpp:61
-#, fuzzy
msgid "Reading data failed"
-msgstr "Ha fallat la lectura"
+msgstr "Ha fallat la lectura de dades"
#: common/error.cpp:63
msgid "Writing data failed"
@@ -1090,36 +1077,35 @@ msgstr "Ha fallat l'escriptura de dades"
#: common/error.cpp:66
msgid "Could not find suitable engine plugin"
-msgstr ""
+msgstr "No s'ha pogut trobar un connector de motor apropiat"
#: common/error.cpp:68
-#, fuzzy
msgid "Engine plugin does not support save states"
-msgstr "El motor no suporta el nivell de depuració '%s'"
+msgstr "El connector de motor no suporta el nivell partides desades'"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "Cancel·lat per l'usuari"
#: common/error.cpp:75
-#, fuzzy
msgid "Unknown error"
msgstr "Error desconegut"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules Verd"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules Àmbar"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules Verd"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules Àmbar"
@@ -1127,15 +1113,16 @@ msgstr "Hercules Àmbar"
#: engines/advancedDetector.cpp:296
#, c-format
msgid "The game in '%s' seems to be unknown."
-msgstr ""
+msgstr "El joc a '%s' sembla ser desconegut."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
+"Informeu de la següent informació a l'equip de ScummVM juntament amb el"
#: engines/advancedDetector.cpp:299
msgid "of the game you tried to add and its version/language/etc.:"
-msgstr ""
+msgstr "nom del joc que heu provat d'afegir i la seva versió/llengua/etc.:"
#: engines/dialogs.cpp:84
msgid "~R~esume"
@@ -1171,17 +1158,17 @@ msgid "~R~eturn to Launcher"
msgstr "~R~etorna al Llançador"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Desa la partida:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Desa"
@@ -1191,40 +1178,40 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
+"Aquest motor no ofereix ajuda dins el joc. Consulteu el fitxer README per a "
+"la informació bàsica i les instruccions sobre com obtenir més assistència."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~D~'acord"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~C~ancel·la"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~ecles"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
-msgstr ""
+msgstr "No s'ha pogut iniciar el format de color."
-#: engines/engine.cpp:228
-#, fuzzy
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
-msgstr "Mode de vídeo actual:"
+msgstr "No s'ha pogut canviar al mode de vídeo: '"
-#: engines/engine.cpp:237
-#, fuzzy
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
-msgstr "Correcció de la relació d'aspecte"
+msgstr "No s'ha pogut aplicar la configuració de la relació d'aspecte."
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
-msgstr ""
+msgstr "No s'ha pogut aplicar l'ajust de pantalla completa."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1232,8 +1219,13 @@ msgid ""
"the data files to your hard disk instead.\n"
"See the README file for details."
msgstr ""
+"Sembla que esteu jugant a aquest joc\n"
+"directament des del CD. Això causa\n"
+"problemes i es recomana que copieu\n"
+"els fitxers de dades al disc dur.\n"
+"Consulteu el fitxer README per a més detalls."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1241,62 +1233,167 @@ msgid ""
"order to listen to the game's music.\n"
"See the README file for details."
msgstr ""
+"Aquest joc té pistes d'àudio al disc. Aquestes\n"
+"pistes s'han d'extreure del disc utilitzant una\n"
+"eina d'extracció d'àudio de CD apropiada per\n"
+"tal de poder sentir la música del joc.\n"
+"Consulteu el fitxer README per a més detalls."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"AVÍS: El joc que esteu a punt d'iniciar encara no està completament suportat "
+"pel ScummVM. Com a tal, probablement serà inestable, i pot ser que les "
+"partides que deseu no funcionin en versions futures de ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "Inicia de totes maneres"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Inseriu el disc %c i premeu un botó per continuar."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "No s'ha pogut trobar %s, (%c%d) Premeu un botó."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Error llegint el disc %c, (%c%d) Premeu un botó."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Joc pausat. Premeu ESPAI per continuar."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Esteu segur de voler reiniciar? (S/N)S"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Esteu segur de voler sortir? (S/N)S"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Jugar"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Surt"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Inseriu el disc de partides desades"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Heu d'introduir un nom"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "La partida NO s'ha desat (el disc està ple?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "La partida NO s'ha desat"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "Desant '%s'"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "Carregant '%s'"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "Anomeneu la partida DESADA"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Seleccioneu una partida per CARREGAR"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "Títol del joc)"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~A~nterior"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~S~egüent"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~T~anca"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Només veus"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Veu i subtítols"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Només subtítols"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Veus i sub."
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
-msgstr ""
+msgstr "Comandes comuns de teclat:"
#: engines/scumm/help.cpp:74
msgid "Save / Load dialog"
-msgstr ""
+msgstr "Diàleg de desat / càrrega"
#: engines/scumm/help.cpp:76
-#, fuzzy
msgid "Skip line of text"
-msgstr "Salta la línia"
+msgstr "Salta la línia de text"
#: engines/scumm/help.cpp:77
msgid "Esc"
-msgstr ""
+msgstr "Esc"
#: engines/scumm/help.cpp:77
-#, fuzzy
msgid "Skip cutscene"
-msgstr "Salta la línia"
+msgstr "Salta la seqüència de video"
#: engines/scumm/help.cpp:78
-#, fuzzy
msgid "Space"
-msgstr "Veus"
+msgstr "Espai"
#: engines/scumm/help.cpp:78
-#, fuzzy
msgid "Pause game"
-msgstr "Desa la partida:"
+msgstr "Pausa la partida"
#: engines/scumm/help.cpp:79 engines/scumm/help.cpp:84
#: engines/scumm/help.cpp:95 engines/scumm/help.cpp:96
@@ -1304,515 +1401,495 @@ msgstr "Desa la partida:"
#: engines/scumm/help.cpp:99 engines/scumm/help.cpp:100
#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102
msgid "Ctrl"
-msgstr ""
+msgstr "Ctrl"
#: engines/scumm/help.cpp:79
-#, fuzzy
msgid "Load game state 1-10"
-msgstr "Carrega partida:"
+msgstr "Carrega partida 1-10"
#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100
#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102
msgid "Alt"
-msgstr ""
+msgstr "Alt"
#: engines/scumm/help.cpp:80
-#, fuzzy
msgid "Save game state 1-10"
-msgstr "Desa la partida:"
-
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Surt"
+msgstr "Desa partida 1-10"
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
-msgstr ""
+msgstr "Intro"
#: engines/scumm/help.cpp:86
msgid "Toggle fullscreen"
-msgstr ""
+msgstr "Commuta la pantalla completa"
#: engines/scumm/help.cpp:87
-#, fuzzy
msgid "Music volume up / down"
-msgstr "Volum de música:"
+msgstr "Puja / Baixa el volum de la música"
#: engines/scumm/help.cpp:88
msgid "Text speed slower / faster"
-msgstr ""
+msgstr "Velocitat de text més lenta / més ràpida"
#: engines/scumm/help.cpp:89
msgid "Simulate left mouse button"
-msgstr ""
+msgstr "Simula el botó esquerre del ratolí"
#: engines/scumm/help.cpp:90
msgid "Tab"
-msgstr ""
+msgstr "Tab"
#: engines/scumm/help.cpp:90
msgid "Simulate right mouse button"
-msgstr ""
+msgstr "Simula el botó dret del ratolí"
#: engines/scumm/help.cpp:93
msgid "Special keyboard commands:"
-msgstr ""
+msgstr "Comandes especials de teclat:"
#: engines/scumm/help.cpp:94
-#, fuzzy
msgid "Show / Hide console"
-msgstr "Mostra/Oculta el cursor"
+msgstr "Mostra / Oculta la consola"
#: engines/scumm/help.cpp:95
msgid "Start the debugger"
-msgstr ""
+msgstr "Inicia el depurador"
#: engines/scumm/help.cpp:96
msgid "Show memory consumption"
-msgstr ""
+msgstr "Mostra el consum de memòria"
#: engines/scumm/help.cpp:97
msgid "Run in fast mode (*)"
-msgstr ""
+msgstr "Executa en mode ràpid (*)"
#: engines/scumm/help.cpp:98
msgid "Run in really fast mode (*)"
-msgstr ""
+msgstr "Executa en mode realment ràpid (*)"
#: engines/scumm/help.cpp:99
msgid "Toggle mouse capture"
-msgstr ""
+msgstr "Commuta la captura del ratolí"
#: engines/scumm/help.cpp:100
msgid "Switch between graphics filters"
-msgstr ""
+msgstr "Commuta entre els filtres gràfics"
#: engines/scumm/help.cpp:101
msgid "Increase / Decrease scale factor"
-msgstr ""
+msgstr "Augmenta / Disminueix el factor d'escala"
#: engines/scumm/help.cpp:102
-#, fuzzy
msgid "Toggle aspect-ratio correction"
-msgstr "Correcció de la relació d'aspecte"
+msgstr "Commuta la correcció de la relació d'aspecte"
#: engines/scumm/help.cpp:107
msgid "* Note that using ctrl-f and"
-msgstr ""
+msgstr "* Tingueu en compte que no es"
#: engines/scumm/help.cpp:108
msgid " ctrl-g are not recommended"
-msgstr ""
+msgstr " recomana utilitzar ctrl-f i ctrl-g"
#: engines/scumm/help.cpp:109
msgid " since they may cause crashes"
-msgstr ""
+msgstr " ja que poden provocar errors o"
#: engines/scumm/help.cpp:110
msgid " or incorrect game behavior."
-msgstr ""
+msgstr " comportament del joc incorrecte."
#: engines/scumm/help.cpp:114
msgid "Spinning drafts on the keyboard:"
-msgstr ""
+msgstr "Filant des del teclat:"
#: engines/scumm/help.cpp:116
-#, fuzzy
msgid "Main game controls:"
-msgstr "Canvia les opcions del joc"
+msgstr "Controls principals del joc:"
#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136
#: engines/scumm/help.cpp:161
-#, fuzzy
msgid "Push"
-msgstr "Pausa"
+msgstr "Empeny"
#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137
#: engines/scumm/help.cpp:162
msgid "Pull"
-msgstr ""
+msgstr "Estira"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
-msgstr ""
+msgstr "Dóna"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
-msgstr ""
+msgstr "Obre"
#: engines/scumm/help.cpp:126
-#, fuzzy
msgid "Go to"
-msgstr "Amunt"
+msgstr "Vés a"
#: engines/scumm/help.cpp:127
msgid "Get"
-msgstr ""
+msgstr "Obté"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
-msgstr ""
+msgstr "Utilitza"
#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141
msgid "Read"
-msgstr ""
+msgstr "Llegeix"
#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147
msgid "New kid"
-msgstr ""
+msgstr "Nou noi"
#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153
#: engines/scumm/help.cpp:171
msgid "Turn on"
-msgstr ""
+msgstr "Engega"
#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154
#: engines/scumm/help.cpp:172
-#, fuzzy
msgid "Turn off"
-msgstr "So engegat/parat"
+msgstr "Apaga"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
-msgstr ""
+msgstr "Vés a"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
-msgstr ""
+msgstr "Agafa"
#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169
msgid "What is"
-msgstr ""
+msgstr "Què és"
#: engines/scumm/help.cpp:146
msgid "Unlock"
-msgstr ""
+msgstr "Desbloqueja"
#: engines/scumm/help.cpp:149
msgid "Put on"
-msgstr ""
+msgstr "Posa a"
#: engines/scumm/help.cpp:150
msgid "Take off"
-msgstr ""
+msgstr "Aixecar el vol"
#: engines/scumm/help.cpp:156
msgid "Fix"
-msgstr ""
+msgstr "Arregla"
#: engines/scumm/help.cpp:158
-#, fuzzy
msgid "Switch"
-msgstr "Veus"
+msgstr "Commuta"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
-msgstr ""
+msgstr "Mira"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
-msgstr ""
+msgstr "Parla"
#: engines/scumm/help.cpp:174
-#, fuzzy
msgid "Travel"
-msgstr "Desa"
+msgstr "Viatja"
#: engines/scumm/help.cpp:175
msgid "To Henry / To Indy"
-msgstr ""
+msgstr "A en Henry / A l'Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
-msgstr ""
+msgstr "toca un Do menor amb la filosa"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
-msgstr ""
+msgstr "toca un Re amb la filosa"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
-msgstr ""
+msgstr "toca un Mi amb la filosa"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
-msgstr ""
+msgstr "toca un Fa amb la filosa"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
-msgstr ""
+msgstr "toca un Sol amb la filosa"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
-msgstr ""
+msgstr "toca un La amb la filosa"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
-msgstr ""
+msgstr "toca un Si amb la filosa"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
-msgstr ""
+msgstr "toca un Do major amb la filosa"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
-msgstr ""
+msgstr "empentar"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
-msgstr ""
+msgstr "estirar"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
-msgstr ""
+msgstr "Parla amb"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
-msgstr ""
+msgstr "Mira"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
-msgstr ""
+msgstr "engega"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
-msgstr ""
+msgstr "apaga"
-#: engines/scumm/help.cpp:216
-#, fuzzy
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
-msgstr "Tecles"
+msgstr "Tecla amunt"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
-msgstr ""
+msgstr "Remarcar el diàleg anterior"
-#: engines/scumm/help.cpp:217
-#, fuzzy
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
-msgstr "Avall"
+msgstr "Tecla avall"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
-msgstr ""
+msgstr "Remarcar el diàleg següent"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
-msgstr ""
+msgstr "Camina"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
-msgstr ""
+msgstr "Inventari"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
-msgstr ""
+msgstr "Objecte"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
-msgstr ""
+msgstr "Blanc i negre / Color"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
-msgstr ""
+msgstr "Ulls"
-#: engines/scumm/help.cpp:232
-#, fuzzy
+#: engines/scumm/help.cpp:233
msgid "Tongue"
-msgstr "Zona"
+msgstr "Llengua"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
-msgstr ""
+msgstr "Cop de puny"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
-msgstr ""
+msgstr "Puntada"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
-msgstr ""
+msgstr "Examina"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
-msgstr ""
+msgstr "Cursor normal"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
-msgstr ""
+msgstr "Comunicador"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
-msgstr ""
+msgstr "Desa / Carrega / Opcions"
-#: engines/scumm/help.cpp:253
-#, fuzzy
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
-msgstr "Canvia les opcions del joc"
+msgstr "Altres controls del joc"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
-msgstr ""
+msgstr "Inventari:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
-msgstr ""
+msgstr "Desplaça la llista amunt"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
-msgstr ""
+msgstr "Desplaça la llista avall"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
-msgstr ""
+msgstr "Element superior esquerre"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
-msgstr ""
+msgstr "Element inferior esquerre"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
-msgstr ""
+msgstr "Element superior dret"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
-msgstr ""
+msgstr "Element inferior dret"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
-msgstr ""
+msgstr "Element mig esquerre"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
-msgstr ""
+msgstr "Element mig dret"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
-#, fuzzy
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
-msgstr "Commuta el personatge"
+msgstr "Canvia els personatges:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
-msgstr ""
+msgstr "Segon noi"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
-msgstr ""
+msgstr "Tercer noi"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
-msgstr ""
+msgstr "Controls de lluita (teclat numèric):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
-msgstr ""
+msgstr "Pas enrere"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
-msgstr ""
+msgstr "Bloqueig alt"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
-msgstr ""
+msgstr "Bloqueig mig"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
-msgstr ""
+msgstr "Bloqueig baix"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
-msgstr ""
+msgstr "Puntada alta"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
-msgstr ""
+msgstr "Puntada mitja"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
-msgstr ""
+msgstr "Puntada baixa"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
-msgstr ""
+msgstr "Aquests són per l'Indy a l'esquerra."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
-msgstr ""
+msgstr "Quan l'Indy és a la dreta,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
-msgstr ""
+msgstr "el 7, el 4 i l'1 s'intercanvien amb"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
-msgstr ""
+msgstr "el 9, el 6 i el 3, respectivament."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
-msgstr ""
+msgstr "Controls del biplà (teclat numèric):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
-msgstr ""
+msgstr "Vola amunt i a l'esquerra"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
-msgstr ""
+msgstr "Vola a l'esquerra"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
-msgstr ""
+msgstr "Vola avall i a l'esquerra"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
-msgstr ""
+msgstr "Vola amunt"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
-msgstr ""
+msgstr "Vola recte"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
-msgstr ""
+msgstr "Vola avall"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
-msgstr ""
+msgstr "Vola amunt i a la dreta"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
-msgstr ""
+msgstr "Vola a la dreta"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
-msgstr ""
+msgstr "Vola avall i a la dreta"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
+"El suport de MIDI natiu requereix l'actualització Roland de LucasArts,\n"
+"però no s'ha trobat %s. S'utilitzarà AdLib."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1823,7 +1900,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1834,7 +1911,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1845,78 +1922,71 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
"directory inside the Tentacle game directory."
msgstr ""
+"Normalment, en aquest punt s'engegaria el Maniac Mansion. Però ScummVM no ho "
+"fa encara. Per jugar-hi, aneu a 'Afegir joc' al menú principal de ScummVM i "
+"seleccioneu el directori 'Maniac' de dins del directori del joc Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "Mode ~Z~ip activat"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "~T~ransicions activades"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "~D~escarta la pàgina"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "~M~ostra el mapa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enú Principal"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~E~fecte de l'aigua activat"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
-msgstr "Desa la partida:"
+msgstr "Recupera la partida:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Restaura"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
-msgstr ""
+msgstr "No s'ha trobat el fitxer d'escena '%s'!"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
-#, fuzzy
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
-msgstr ""
-"No s'ha pogut carregar l'estat del joc del fitxer:\n"
-"\n"
-"%s"
+msgstr "No s'ha pogut carregar l'estat del joc del fitxer."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
-#, fuzzy
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
-msgstr ""
-"No s'ha pogut desar l'estat del joc al fitxer:\n"
-"\n"
-"%s"
+msgstr "No s'ha pogut desar l'estat del joc al fitxer."
#: engines/gob/inter_v5.cpp:107
-#, fuzzy
msgid "Failed to delete file."
-msgstr ""
-"No s'ha pogut desar l'estat del joc al fitxer:\n"
-"\n"
-"%s"
+msgstr "No s'ha pogut esborrar el fitxer."
-#: engines/groovie/script.cpp:417
-#, fuzzy
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
-msgstr ""
-"No s'ha pogut desar l'estat del joc al fitxer:\n"
-"\n"
-"%s"
+msgstr "No s'ha pogut desar l'estat del joc"
#: engines/kyra/sound_midi.cpp:475
msgid ""
@@ -1926,36 +1996,46 @@ msgid ""
"General MIDI ones. After all it might happen\n"
"that a few tracks will not be correctly played."
msgstr ""
+"Sembla que esteu utilitzant un dispositiu General\n"
+"MIDI, però el joc només suporta MIDI de Roland\n"
+"MT32. Intentarem convertir els instruments de\n"
+"Roland MT32 als de General MIDI. És possible\n"
+"que algunes pistes no es reprodueixin correctament."
#: engines/m4/m4_menus.cpp:138
-#, fuzzy
msgid "Save game failed!"
-msgstr "Desa la partida:"
+msgstr "No s'ha pogut desar la partida!"
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
"Please download it from www.scummvm.org"
msgstr ""
+"No s'ha pogut trobar el fitxer \"sky.cpt\"!\n"
+"Baixeu-lo de www.scummvm.org"
#: engines/sky/compact.cpp:141
msgid ""
"The \"sky.cpt\" file has an incorrect size.\n"
"Please (re)download it from www.scummvm.org"
msgstr ""
+"El fitxer \"sky.cpt\" té una mida incorrecta.\n"
+"Torneu a baixar-lo de www.scummvm.org"
#: engines/sword1/animation.cpp:344 engines/sword2/animation.cpp:379
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
+"S'han trobat escenes en DXA, però s'ha compilat el ScummVM sense suport de "
+"zlib"
#: engines/sword1/animation.cpp:354 engines/sword2/animation.cpp:389
msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
+msgstr "Les escenes MPEG2 ja no estan suportades"
#: engines/sword1/animation.cpp:359 engines/sword2/animation.cpp:397
#, c-format
msgid "Cutscene '%s' not found"
-msgstr ""
+msgstr "No s'ha trobat l'escena '%s'"
#: engines/sword1/control.cpp:863
msgid ""
@@ -1967,6 +2047,13 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
+"El ScummVM ha trobat que teniu partides desades antigues de Broken Sword 1 "
+"que s'haurien de convertir.\n"
+"El format de les partides desades antigues no està suportat, per la qual "
+"cosa no podreu carregar aquestes partides si no les convertiu.\n"
+"\n"
+"Premeu D'Acord per convertir-les ara, en cas contrari se us tornarà a "
+"demanar la propera vegada que engegueu el joc.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -1974,18 +2061,20 @@ msgid ""
"Target new save game already exists!\n"
"Would you like to keep the old save game (%s) or the new one (%s)?\n"
msgstr ""
+"La nova partida guardada d'aquest joc ja existeix!\n"
+"Voleu conservar la partida guardada antiga (%s) o la nova (%s)?\n"
#: engines/sword1/control.cpp:1235
msgid "Keep the old one"
-msgstr ""
+msgstr "Mantingues el vell"
#: engines/sword1/control.cpp:1235
msgid "Keep the new one"
-msgstr ""
+msgstr "Mantingues el nou"
#: engines/sword1/logic.cpp:1633
msgid "This is the end of the Broken Sword 1 Demo"
-msgstr ""
+msgstr "Aquest és el final de la Demo del Broken Sword 1"
#: engines/parallaction/saveload.cpp:133
#, c-format
@@ -1993,16 +2082,16 @@ msgid ""
"Can't save game in slot %i\n"
"\n"
msgstr ""
+"No s'ha pogut desar a l'espai %i\n"
+"\n"
#: engines/parallaction/saveload.cpp:211
-#, fuzzy
msgid "Loading game..."
-msgstr "Carrega partida:"
+msgstr "Carregant la partida..."
#: engines/parallaction/saveload.cpp:226
-#, fuzzy
msgid "Saving game..."
-msgstr "Desa la partida:"
+msgstr "Desant la partida..."
#: engines/parallaction/saveload.cpp:279
msgid ""
@@ -2013,10 +2102,17 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
+"El ScummVM ha trobat que teniu partides desades antigues de Nippon Safes que "
+"s'haurien de reanomenar.\n"
+"El noms antics de les partides desades no estan suportats, per la qual cosa "
+"no podreu carregar aquestes partides si no les convertiu.\n"
+"\n"
+"Premeu D'Acord per convertir-les ara, en cas contrari se us tornarà a "
+"demanar la propera vegada.\n"
#: engines/parallaction/saveload.cpp:326
msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
+msgstr "ScummVM ha convertit satisfactòriament totes les partides desades."
#: engines/parallaction/saveload.cpp:328
msgid ""
@@ -2025,6 +2121,10 @@ msgid ""
"\n"
"Please report to the team."
msgstr ""
+"ScummVM ha mostrat avisos a la finestra de consola i no es pot garantir que "
+"tots els fitxers s'hagin convertit.\n"
+"\n"
+"Informeu-ne a l'equip."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2032,35 +2132,48 @@ msgstr "Emulador OPL de MAME"
#: audio/fmopl.cpp:51
msgid "DOSBox OPL emulator"
-msgstr "Emulador OPL DOSBox"
+msgstr "Emulador OPL de DOSBox"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"No s'ha pogut trobar el dispositiu d'àudio seleccionat '%s' (p.e. pot estar "
+"desactivat o desconnectat)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "Provant de recórrer al següent dispositiu disponible..."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"No es pot utilitzar el dispositiu d'àudio seleccionat '%s'. Vegeu el fitxer "
+"de registre per a més informació."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"No s'ha pogut trobar el dispositiu d'àudio preferit '%s' (p.e. pot estar "
+"desactivat o desconnectat)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"No es pot utilitzar el dispositiu d'àudio preferit '%s'. Vegeu el fitxer de "
+"registre per a més informació."
#: audio/null.h:43
msgid "No music"
@@ -2083,7 +2196,6 @@ msgid "C64 Audio Emulator"
msgstr "Emulador d'àudio C64"
#: audio/softsynth/mt32.cpp:329
-#, fuzzy
msgid "Initializing MT-32 Emulator"
msgstr "Iniciant l'Emulador de MT-32"
@@ -2101,7 +2213,7 @@ msgstr "Emulador d'IBM PCjr"
#: backends/keymapper/remap-dialog.cpp:47
msgid "Keymap:"
-msgstr "Mapa de teclat:"
+msgstr "Assignacions de teclat:"
#: backends/keymapper/remap-dialog.cpp:64
msgid " (Active)"
@@ -2192,14 +2304,12 @@ msgid "Disable power off"
msgstr "Desactiva l'apagat automàtic"
#: backends/platform/iphone/osys_events.cpp:338
-#, fuzzy
msgid "Mouse-click-and-drag mode enabled."
-msgstr "Mode Touchpad activat."
+msgstr "S'ha activat el mode de clic-i-arrossega."
#: backends/platform/iphone/osys_events.cpp:340
-#, fuzzy
msgid "Mouse-click-and-drag mode disabled."
-msgstr "Mode Touchpad desactivat."
+msgstr "S'ha desactivat el mode clic-i-arrossega."
#: backends/platform/iphone/osys_events.cpp:351
msgid "Touchpad mode enabled."
@@ -2209,6 +2319,27 @@ msgstr "Mode Touchpad activat."
msgid "Touchpad mode disabled."
msgstr "Mode Touchpad desactivat."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "Amaga ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Oculta els altres"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Mostra-ho tot"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Finestra"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Minimitza"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (sense escalar)"
@@ -2218,56 +2349,52 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (no escalat)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
-msgstr "Correcció de la relació d'aspecte"
+msgstr "S'ha activat la correcció de la relació d'aspecte"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
-msgstr "Correcció de la relació d'aspecte"
+msgstr "S'ha desactivat la correcció de la relació d'aspecte"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
-msgstr ""
+msgstr "Filtre de gràfics actiu:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
-msgstr "Mode de pintat:"
+msgstr "Mode de finestra"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
-msgstr ""
+msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
-msgstr ""
+msgstr "OpenGL Conserva"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
-msgstr ""
+msgstr "OpenGL Original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
-#, fuzzy
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
-msgstr "Mode de vídeo actual:"
+msgstr "Mode de vídeo actual"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
-msgstr ""
+msgstr "Escala actual"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
-msgstr ""
+msgstr "Mode de filtre actiu: Lineal"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
-msgstr ""
+msgstr "Mode de filtre actiu: Pròxim"
#: backends/platform/symbian/src/SymbianActions.cpp:38
#: backends/platform/wince/CEActionsSmartphone.cpp:39
@@ -2292,11 +2419,13 @@ msgstr "Dreta"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Clic esquerre"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Clic dret"
@@ -2337,7 +2466,7 @@ msgstr "Teclat virtual"
#: backends/platform/symbian/src/SymbianActions.cpp:56
msgid "Key mapper"
-msgstr "Mapejador de tecles"
+msgstr "Assignador de tecles"
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
msgid "Do you want to quit ?"
@@ -2460,17 +2589,15 @@ msgid "Network down"
msgstr "Xarxa inactiva"
#: backends/platform/wii/options.cpp:178
-#, fuzzy
msgid "Initializing network"
msgstr "Iniciant la xarxa"
#: backends/platform/wii/options.cpp:182
-#, fuzzy
msgid "Timeout while initializing network"
msgstr "S'ha excedit el temps d'iniciació de la xarxa"
#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
+#, c-format
msgid "Network not initialized (%d)"
msgstr "Xarxa no iniciada (%d)"
@@ -2527,13 +2654,13 @@ msgstr "Cursor Esquerra"
msgid "Cursor Right"
msgstr "Cursor Dreta"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Voleu carregar o desar el joc?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Esteu segur de voler sortir? "
@@ -2545,102 +2672,129 @@ msgstr "Teclat"
msgid "Rotate"
msgstr "Rotar"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Utilitzant el controlador SDL "
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Pantalla "
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Voleu fer una cerca automàtica?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
-msgstr ""
+msgstr "Assigna l'acció del clic dret"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
-msgstr ""
+msgstr "Heu d'assignar una tecla a l'acció 'Clic dret' per jugar a aquest joc"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
-msgstr ""
+msgstr "Assigna l'acció d'ocultar la barra d'eines"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
+"Heu d'assignar una tecla a l'acció 'Ocultar la barra d'eines' per jugar a "
+"aquest joc"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
-msgstr ""
+msgstr "Assigna l'acció d'Ampliar el Zoom (opcional)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
-msgstr ""
+msgstr "Assigna l'acció de Reduir el Zoom (opcional)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
+"No us oblideu d'assignar una tecla a l'acció 'Ocultar la barra d'eines' per "
+"veure l'inventari complet"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Do you really want to return to the Launcher?"
-msgstr "Realment voleu suprimir aquesta partida?"
+msgstr "Realment voleu tornar al Llançador?"
#: backends/events/default/default-events.cpp:222
msgid "Launcher"
-msgstr ""
+msgstr "Llançador"
#: backends/events/default/default-events.cpp:244
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "Vols sortir?"
+msgstr "Estàs segur de voler sortir?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
+msgstr "'Mode Toc' de pantalla tàctil - Clic esquerre"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
+msgstr "'Mode Toc' de pantalla tàctil - Clic dret"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
+msgstr "'Mode Toc' de pantalla tàctil - Flotant (sense clic)"
-#: backends/events/gph/gph-events.cpp:390
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
-msgstr "Volum"
+msgstr "Volum màxim"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
-msgstr ""
+msgstr "Pujant el volum"
-#: backends/events/gph/gph-events.cpp:398
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
-msgstr "Volum"
+msgstr "Volum mínim"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
-msgstr ""
+msgstr "Baixant el volum"
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Comprova les actualitzacions..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "Un clic dret"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "Només mou"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "Tecla d'escapada"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "Menú del joc"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "Mostra el teclat numèric"
-#~ msgid "Discovered %d new games."
-#~ msgstr "S'han trobat %d jocs nous."
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "Controla el ratolí"
-#~ msgid "FM Towns Emulator"
-#~ msgstr "Emulador de FM Towns"
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "Clicat activat"
-#~ msgid "Invalid Path"
-#~ msgstr "Camí incorrecte"
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "Clicat desactivat"
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index aad7110daf..7593f08c86 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -5,16 +5,16 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: ScummVM 1.3.0svn\n"
+"Project-Id-Version: ScummVM 1.4.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-06-14 15:04+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-05 18:43+0100\n"
"Last-Translator: Zbynìk Schwarz <zbynek.schwarz@gmail.com>\n"
"Language-Team: \n"
+"Language: Cesky\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Cesky\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
"X-Poedit-Language: Czech\n"
"X-Poedit-Country: CZECH REPUBLIC\n"
@@ -23,7 +23,7 @@ msgstr ""
#: gui/about.cpp:91
#, c-format
msgid "(built on %s)"
-msgstr "(sestaveno na %s)"
+msgstr "(sestaveno %s)"
#: gui/about.cpp:98
msgid "Features compiled in:"
@@ -47,10 +47,11 @@ msgid "Go up"
msgstr "Jít nahoru"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -60,22 +61,22 @@ msgstr "Zru¹it"
msgid "Choose"
msgstr "Zvolit"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Zavøít"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Kliknutí my¹í"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Zobrazit klávesnici"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Pøemapovat klávesy"
@@ -88,16 +89,17 @@ msgid "Map"
msgstr "Mapovat"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -343,7 +345,7 @@ msgstr "Toto ID hry je u¾ zabrané. Vyberte si, prosím, jiné."
msgid "~Q~uit"
msgstr "~U~konèit"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Ukonèit ScummVM"
@@ -351,7 +353,7 @@ msgstr "Ukonèit ScummVM"
msgid "A~b~out..."
msgstr "~O~ Programu..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "O ScummVM"
@@ -379,7 +381,7 @@ msgstr "~N~ahrát..."
msgid "Load savegame for selected game"
msgstr "Nahrát ulo¾enou pozici pro zvolenou hru"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~P~øidat hru..."
@@ -403,7 +405,7 @@ msgstr "~O~dstranit Hru"
msgid "Remove game from the list. The game data files stay intact"
msgstr "Odstranit hru ze seznamu. Herní data zùstanou zachována"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~P~øidat hru..."
@@ -431,14 +433,14 @@ msgid "Clear value"
msgstr "Vyèistit hodnotu"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Nahrát hru:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Nahrát"
@@ -452,17 +454,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Ano"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Ne"
@@ -499,34 +501,25 @@ msgstr "Hromadné Pøidání..."
msgid "Mass Add..."
msgstr "Hromadné Pøidání..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Pøidat Hru..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Pøidat Hru..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... prùbìh ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Hledání dokonèeno!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "Objeveno %d nových her, ignorováno %d døíve pøidaných her."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "Prohledáno %d adresáøù..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Objeveno %d nových her, ignorováno %d døíve pøidaných her ..."
@@ -606,8 +599,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Speciální re¾imy chvìní podporované nìkterými hrami"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Re¾im celé obrazovky"
@@ -947,19 +940,19 @@ msgstr "Smazat"
msgid "Do you really want to delete this savegame?"
msgstr "Opravdu chcete tuto ulo¾enou hru vymazat"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Datum:"
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Èas:"
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Doba hraní:"
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Bezejmenný ulo¾ený stav"
@@ -967,60 +960,60 @@ msgstr "Bezejmenný ulo¾ený stav"
msgid "Select a Theme"
msgstr "Vyberte Vzhled"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "GFX zakázáno"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX zakázáno"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standardní Vykreslovaè (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standardní (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Vykreslovaè s vyhlazenými hranami (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "S vyhlazenými hranami (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Jádro nepodporuje úroveò ladìní '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Pøeskoèit"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pauza"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Pøeskoèit øádek"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Chyba pøi spu¹tìní hry:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Nelze nalézt ¾ádné jádro schopné vybranou hru spustit"
@@ -1082,26 +1075,27 @@ msgstr "Zás. modul jádra nepodporuje ulo¾ené stavy"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "Zru¹eno u¾ivatelem"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "Neznámá chyba"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules Zelená"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules Jantarová"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules Zelená"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules Jantarová"
@@ -1153,17 +1147,17 @@ msgid "~R~eturn to Launcher"
msgstr "~N~ávrat do Spou¹tìèe"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Ulo¾it hru:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Ulo¾it"
@@ -1177,37 +1171,37 @@ msgstr ""
"prohlédnìte si README pro základní informace a pro instrukce jak získat "
"dal¹í pomoc."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~Z~ru¹it"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~K~lávesy"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr "Nelze zavést barevný formát."
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
msgstr "Nelze pøepnout na re¾im obrazu: '"
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
msgstr "Nelze pou¾ít nastavení pomìru stran."
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr "Nelze pou¾ít nastavení celé obrazovky."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1221,7 +1215,7 @@ msgstr ""
"datové soubory na Vá¹ pevný disk.\n"
"Pro podrobnosti si pøeètìte README."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1235,30 +1229,134 @@ msgstr ""
"abyste mohli poslouchat hudbu ve høe.\n"
"Pro podrobnosti si pøeètìte README."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"VAROVÁNÍ: Hra, kterou se chystáte spustit, není je¹tì plnì podporována "
+"ScummVM. Proto je mo¾né, ¾e bude nestabilní a jakékoli ulo¾ené hry nemusí "
+"fungovat v budoucích verzích ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "Pøesto spustit"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Vlo¾te Disk %c a Stisknìte Tlaèítko Pro Poraèování."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "Nelze Najít %s, (%c%d) Stsikìte Tlaèítko."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Chyba pøi ètení disku %c, (%c%d) Stisknìte Tlaèítko."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Hra Pozastavena. Stisknìte MEZERNÍK pro pokraèování."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Jste si jisti, ¾e chcete restartovat? (A/N)A"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Jste si jisti, ¾e chcete odejít? (A/N)A"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Hrát"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Ukonèit"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Vlo¾te herní disk pro ulo¾ení/naètení"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Musíte zadat jméno"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "Hra NEBYLA ulo¾ena (plný disk?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "Hra NEBYLA naètena"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "Ukládám '%s'"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "Naèítám '%s'"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "Pojmenujte svoji ULO®ENOU hru"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Vyberte hru k NAÈTENÍ"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "Název hry"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~P~øedchozí"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~D~al¹í"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~Z~avøít"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Pouze Øeè"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Øeè a Titulky"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Pouze Titulky"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Øeè a Titulky"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Bì¾né klávesové pøíkazy"
@@ -1309,14 +1407,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Ulo¾it stav hry 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Ukonèit"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1420,14 +1510,14 @@ msgid "Pull"
msgstr "Táhnout"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Dát"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Otevøít"
@@ -1440,9 +1530,9 @@ msgid "Get"
msgstr "Vzít"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Pou¾ít"
@@ -1465,13 +1555,13 @@ msgid "Turn off"
msgstr "Vypnout"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Pøejít na"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Sebrat"
@@ -1499,11 +1589,11 @@ msgstr "Spravit"
msgid "Switch"
msgstr "Pøepnout"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Dívat se"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Mluvit"
@@ -1515,270 +1605,272 @@ msgstr "Cestovat"
msgid "To Henry / To Indy"
msgstr "Henrymu / Indymu"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "zahrát c moll na pøeslici"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "zahrát D na pøeslici"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "zahrát E na pøeslici"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "zahrát F na pøeslici"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "zahrát G na pøeslici"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "zahrát A na pøeslici"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "zahrát B na pøeslici"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "zahrát C dur na pøeslici"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "tlaèIt"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "táhnout (©kubnout)"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Mluvit s"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Dívat se na"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "zapnouT"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "vypnoUt"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "KlávesaNahoru"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Zvýraznit pøedchozí dialog"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "KlávesaDolù"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Zvýraznit následující dialog"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Jít"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventáø"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objekt"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Èernobílé / Barva"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Oèi"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Jazyk"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Udeøit"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Kopnout"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Prohlédnout"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Obyèejný kurzor"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Komunikace"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Ulo¾it / Nahrát / Volby"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Dal¹í ovládací prvky hry"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventáø:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Posunout seznam nahoru"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Posunout seznam dolu"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Polo¾ka vlevo nahoøe"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Polo¾ka vlevo dole"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Polo¾ka vpravo nahoøe"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Polo¾ka vpravo dole"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Polo¾ka vlevo uprostøed"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Polo¾ka vpravo uprostøed"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Mìnìní postav:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Druhé dítì"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Tøetí dítì"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Ovládání boje (num. kláv.)"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Ustoupit"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Bránit nahoøe"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Bránit uprostøed"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Bránit dole"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Udeøit nahoru"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Udeøit doprostøed"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Udeøit dolù"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Tyto jsou pro Indyho nalevo."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Kdy¾ je Indy napravo,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "71 4 a 1 jsou zamìnìny s"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6 a 3, v tomto poøadí."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Kontrola dvojplo¹níku (numerická klávesnice)"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Letìt doprava nahoru"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Letìt doleva"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Letìt doleva dolù"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Letìt nahoru"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Letìt rovnì"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Letìt dolù"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Letìt doprava nahoru"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Letìt doprava"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Letìt doprava dolù"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -1787,7 +1879,7 @@ msgstr ""
"Pøirozená podpora MIDI vy¾aduje Aktualizaci Roland od LucasArts,\n"
"ale %s chybí. Místo toho je pou¾it AdLib."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1798,7 +1890,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1809,7 +1901,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1820,7 +1912,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1830,45 +1922,51 @@ msgstr ""
"Abyste toto mohli hrát, pøejdìte do 'Pøidat Hru' v poèáteèním menu ScummVM a "
"vyberte adresáø 'Maniac' uvnitø herního adresáøe Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "~R~e¾im Svi¹tìní Aktivován"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "~P~øechody zapnuty"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr "~Z~ahodit Stránku"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr "~Z~obrazit Mapu"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~H~lavní Menu"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~E~fekt Vody Zapnut"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Obnovit hru"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Obnovit"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr "Soubor videa '%s' nenalezen'"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
msgstr "Nelze naèíst stav hry ze souboru."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
msgstr "Nelze ulo¾it stav hry do souboru."
@@ -1876,7 +1974,7 @@ msgstr "Nelze ulo¾it stav hry do souboru."
msgid "Failed to delete file."
msgstr "Nelze smazat soubor."
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
msgstr "Nelze ulo¾it hru."
@@ -2023,41 +2121,46 @@ msgstr "MAME OPL Emulátor"
msgid "DOSBox OPL emulator"
msgstr "DOSBox OPL Emulátor"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-"Zvolené zaøízení '%s' nebylo nalezeno (napø. mù¾e být vypnuto nebo "
-"odpojeno). Pokus o navrácení na nejbli¾¹í dostupné zaøízení..."
+"Zvolené zvukové zaøízení '%s' nebylo nalezeno (napø. mù¾e být vypnuto nebo "
+"odpojeno)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "Pokus o navrácení na nejbli¾¹í dostupné zaøízení..."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-"Zvolené zaøízení '%s' nelze pou¾ít.. Podívejte se na záznam pro více "
-"informací. Pokus o navrácení na nejbli¾¹í dostupné zaøízení..."
+"Zvolené zvukové zaøízení '%s' nelze pou¾ít. Podívejte se na záznam pro více "
+"informací."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-"Upøednostòované zaøízení '%s' nebylo nalezeno (napø. mù¾e být vypnuto nebo "
-"odpojeno). Pokus o navrácení na nejbli¾¹í dostupné zaøízení..."
+"Upøednostòované zvukové zaøízení '%s' nebylo nalezeno (napø. mù¾e být "
+"vypnuto nebo odpojeno)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-"Upøednostòované zaøízení '%s' nelze pou¾ít. Podívejte se na záznam pro více "
-"informací. Pokus o navrácení na nejbli¾¹í dostupné zaøízení..."
+"Upøednostòované zvukové zaøízení '%s' nelze pou¾ít. Podívejte se na záznam "
+"pro více informací."
#: audio/null.h:43
msgid "No music"
@@ -2203,6 +2306,27 @@ msgstr "Touchpad re¾im zapnut"
msgid "Touchpad mode disabled."
msgstr "Touchpad re¾im vypnut"
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "Skrýt ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Skrýt Ostatní"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Zobrazit V¹e"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Okno"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Minimalizovat"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normální (bez zmìny velikosti)"
@@ -2212,50 +2336,50 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normální (bez zmìny velikosti)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
msgstr "Povolena korekce pomìru stran"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
msgstr "Zakázána korekce pomìru stran"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
msgstr "Aktivní grafický filtr:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
msgstr "Re¾im do okna"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normální"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Zachovávající"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Pùvodní"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
msgstr "Souèasný re¾im obrazu"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr "Souèasná velikost"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr "Aktivní re¾im filtru: Lineární"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr "Aktivní re¾im filtru: Nejbli¾¹í"
@@ -2282,11 +2406,13 @@ msgstr "Doprava"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Levé Kliknutí"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Pravé kliknutí"
@@ -2515,13 +2641,13 @@ msgstr "©ipka Doleva"
msgid "Cursor Right"
msgstr "©ipka Doprava"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Chcete hru nahrát nebo ulo¾it?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Jste si jisti, ¾e chcete odejít ? "
@@ -2533,47 +2659,47 @@ msgstr "Klávesnice"
msgid "Rotate"
msgstr "Otáèet"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Pou¾ívá ovladaè SDL"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Displej"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Chcete provést automatické hledání ?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Mapovat èinnost pravé kliknutí"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Musíte namapovat klávesu pro èinnost 'Pravé Kliknutí', abyste tuto hru mohli "
"hrát"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Mapovat èinnost skrýt panel nástrojù"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Musíte namapovat klávesu pro èinnost 'Skrýt Panel nástrojù', abyste tuto hru "
"mohli hrát"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Namapovat èinnost Pøiblí¾it Nahoru (nepovinné)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Namapovat èinnost Pøiblí¾it Dolù (nepovinné)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2592,40 +2718,83 @@ msgstr "Spou¹tìè"
msgid "Do you really want to quit?"
msgstr "Opravdu chcete skonèit?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Levé Kliknutí"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Pravé Kliknutí"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Najetí (Bez Kliknutí)"
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
msgstr "Maximální Hlasitost"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr "Zvy¹uji Hlasitost"
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
msgstr "Minimální Hlasitost"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr "Sni¾uji Hlasitost"
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Zkontrolovat Aktualizace..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "Pravé kliknutí jednou"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "Pouze Pohyb"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "Klávesa Escape"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "Menu Hry"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "Zobrazit Klávesnici"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "Ovládání My¹i"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "Kliknutí Povoleno"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "Kliknutí Zakázáno"
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Pøidat Hru..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Pøidat Hru..."
+
#~ msgid ""
#~ "Your game version has been detected using filename matching as a variant "
#~ "of %s."
diff --git a/po/da_DA.po b/po/da_DA.po
index 9bb43f7784..6a151fc2f8 100644
--- a/po/da_DA.po
+++ b/po/da_DA.po
@@ -1,19 +1,19 @@
-# Copyright (C) 2010 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Steffen Nyeland <steffen@nyeland.dk>, 2010.
-#
+# Copyright (C) 2010 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Steffen Nyeland <steffen@nyeland.dk>, 2010.
+#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
"PO-Revision-Date: 2011-01-08 22:53+0100\n"
"Last-Translator: Steffen Nyeland <steffen@nyeland.dk>\n"
"Language-Team: Steffen Nyeland <steffen@nyeland.dk>\n"
+"Language: Dansk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Dansk\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: gui/about.cpp:91
@@ -43,10 +43,11 @@ msgid "Go up"
msgstr "Gå op"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -56,22 +57,22 @@ msgstr "Fortryd"
msgid "Choose"
msgstr "Vælg"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Luk"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Muse klik"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Vis tastatur"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Kortlæg taster"
@@ -84,16 +85,17 @@ msgid "Map"
msgstr "Kortlæg"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -341,7 +343,7 @@ msgstr "Dette spil ID er allerede i brug. Vælg venligst et andet."
msgid "~Q~uit"
msgstr "~A~fslut"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Afslut ScummVM"
@@ -349,7 +351,7 @@ msgstr "Afslut ScummVM"
msgid "A~b~out..."
msgstr "~O~m..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Om ScummVM"
@@ -377,7 +379,7 @@ msgstr "~H~ent..."
msgid "Load savegame for selected game"
msgstr "Hent gemmer for det valgte spil"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~T~ilføj spil..."
@@ -401,7 +403,7 @@ msgstr "~F~jern spil"
msgid "Remove game from the list. The game data files stay intact"
msgstr "Fjerner spil fra listen. Spillets data filer forbliver uberørt"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~T~ilføj spil..."
@@ -429,14 +431,14 @@ msgid "Clear value"
msgstr "Slet værdi"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Indlæs spil:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Indlæs"
@@ -450,17 +452,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Ja"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Nej"
@@ -498,34 +500,25 @@ msgstr "Tilføj flere..."
msgid "Mass Add..."
msgstr "Tilføj flere..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Tilføj spil..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Tilføj spil..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... fremskridt ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Skan gennemført!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "Gennemset %d biblioteker ..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, fuzzy, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Fundet %d nye spil ..."
@@ -605,8 +598,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Speciel farvereduceringstilstand understøttet a nogle spil"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Fuldskærms tilstand"
@@ -945,19 +938,19 @@ msgstr "Slet"
msgid "Do you really want to delete this savegame?"
msgstr "Vil du virkelig slette denne gemmer?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Dato:"
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Tid:"
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Spilletid:"
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Unavngivet gemmetilstand"
@@ -965,60 +958,60 @@ msgstr "Unavngivet gemmetilstand"
msgid "Select a Theme"
msgstr "Vælg et tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "Deaktiveret GFX"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktiveret GFX"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standard renderer (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Antialias renderer (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Antialias (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motor understøtter ikke fejlfindingsniveau '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Spring over"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Spring linje over"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Fejl ved kørsel af spil:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Kunne ikke finde nogen motor istand til at afvikle det valgte spil"
@@ -1093,20 +1086,21 @@ msgstr ""
msgid "Unknown error"
msgstr "Ukendt fejl"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules grøn"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules brun"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules grøn"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules brun"
@@ -1158,17 +1152,17 @@ msgid "~R~eturn to Launcher"
msgstr "~R~etur til oversigt"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Gemmer:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Gem"
@@ -1179,39 +1173,39 @@ msgid ""
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~F~ortryd"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~aster"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
#, fuzzy
msgid "Could not switch to video mode: '"
msgstr "Aktuel videotilstand:"
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
#, fuzzy
msgid "Could not apply aspect ratio setting."
msgstr "Skift billedformat korrektion"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1220,7 +1214,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1229,30 +1223,138 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
msgstr ""
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr ""
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+#, fuzzy
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr " Er du sikker på at du vil afslutte ? "
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+#, fuzzy
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr " Er du sikker på at du vil afslutte ? "
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Afslut"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:200
+#, fuzzy
+msgid "Select a game to LOAD"
+msgstr "Vælg et tema"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr ""
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "Fo~r~rige"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~N~æste"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~L~uk"
+#: engines/scumm/dialogs.cpp:597
+#, fuzzy
+msgid "Speech Only"
+msgstr "Tale"
+
+#: engines/scumm/dialogs.cpp:598
+#, fuzzy
+msgid "Speech and Subtitles"
+msgstr "Undertekster"
+
+#: engines/scumm/dialogs.cpp:599
+#, fuzzy
+msgid "Subtitles Only"
+msgstr "Undertekster"
+
+#: engines/scumm/dialogs.cpp:607
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Tale"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Almindelige tastatur kommandoer:"
@@ -1303,14 +1405,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Gem spil tilstand 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Afslut"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1415,14 +1509,14 @@ msgid "Pull"
msgstr "Træk"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Giv"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Åbn"
@@ -1435,9 +1529,9 @@ msgid "Get"
msgstr "Tag"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Brug"
@@ -1460,13 +1554,13 @@ msgid "Turn off"
msgstr "Sluk"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Gå til"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Tag op"
@@ -1494,11 +1588,11 @@ msgstr "Lav"
msgid "Switch"
msgstr "Skift"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Se"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Tal"
@@ -1510,277 +1604,279 @@ msgstr "Rejs"
msgid "To Henry / To Indy"
msgstr "Til Henry / Til Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "spil C-mol på rok"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "spil D på rok"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "spil E på rok"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "spil F på rok"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "spil G på rok"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "spil A på rok"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "spil H på rok"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "spil C-dur på rok"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Skub"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "træk (Y)"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Tal til"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Lur på"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "tæNd"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "sluk (F)"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "TastOp"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Fremhæv forrige dialog"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "TastNed"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Fremhæv næste dialog"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Gå"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Oversigt"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objekt"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Sort og hvid / Farve"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Øjne"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Tunge"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Slag"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Spark"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Undersøg"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Normal markør"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Komm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Gem / Hent / Indstillinger"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Andre spil kontroller"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Oversigt:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Rul liste op"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Rul liste ned"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Øverste venstre punkt"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Nederste højre punkt"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Øverste højre punkt"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Nederste venstre punkt"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Midterste højre punkt"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Midterste højre punkt"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Skift personer:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Andet barn"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Tredie barn"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Kamp kontroller (numtast):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Skridt tilbage"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Blokér højt"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Blokér midtfor"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Blokér lavt"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Slå højt"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Slå midtfor"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Slå lavt"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Disse er for Indy til venstre"
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Når Indy er til højre,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4 og 1 bliver bytte med"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "repektivt 9, 6 og 3."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Biplan kontroller (numtast):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Flyv øverst til venste"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Flyv til venstre"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Flyv nederst til venstre"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Flyv opad"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Flyv ligeud"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Flyv nedad"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Flyv øverst til højre"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Flyv til højre"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Flyv nederst til højre"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1791,7 +1887,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1802,7 +1898,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1813,48 +1909,55 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
"directory inside the Tentacle game directory."
msgstr ""
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "~Z~ip tilstand aktiveret"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "~O~vergange aktiveret"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr ""
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+#, fuzzy
+msgid "~M~ain Menu"
+msgstr "ScummVM Hovedmenu"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~V~andeffekter aktiveret"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Gendan spil:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Gendan"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr ""
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
#, fuzzy
msgid "Failed to load game state from file."
msgstr ""
@@ -1862,7 +1965,7 @@ msgstr ""
"\n"
"%s"
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
#, fuzzy
msgid "Failed to save game state to file."
msgstr ""
@@ -1878,7 +1981,7 @@ msgstr ""
"\n"
"%s"
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
#, fuzzy
msgid "Failed to save game"
msgstr ""
@@ -2002,32 +2105,37 @@ msgstr "MAME OPL emulator"
msgid "DOSBox OPL emulator"
msgstr "DOSBox OPL emulator"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr ""
+
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
#: audio/null.h:43
@@ -2177,6 +2285,29 @@ msgstr "Pegeplade tilstand aktiveret."
msgid "Touchpad mode disabled."
msgstr "Pegeplade tilstand deaktiveret."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+#, fuzzy
+msgid "Hide ScummVM"
+msgstr "Afslut ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+#, fuzzy
+msgid "Window"
+msgstr "Windows MIDI"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr ""
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (ingen skalering)"
@@ -2186,55 +2317,55 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (ingen skalering)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
#, fuzzy
msgid "Enabled aspect ratio correction"
msgstr "Skift billedformat korrektion"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
#, fuzzy
msgid "Disabled aspect ratio correction"
msgstr "Skift billedformat korrektion"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
#, fuzzy
msgid "Active graphics filter:"
msgstr "Skift mellem grafik filtre"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
#, fuzzy
msgid "Windowed mode"
msgstr "Rendere tilstand:"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Bevar"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
#, fuzzy
msgid "Current display mode"
msgstr "Aktuel videotilstand:"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr ""
@@ -2261,11 +2392,13 @@ msgstr "Højre"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Venstre klik"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Højre klik"
@@ -2496,13 +2629,13 @@ msgstr "Pil til venstre"
msgid "Cursor Right"
msgstr "Pil til højre"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Vil du hente eller gemme spillet?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Er du sikker på at du vil afslutte ? "
@@ -2514,46 +2647,46 @@ msgstr "Tastatur"
msgid "Rotate"
msgstr "Drej"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Brug SDL driver"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Vis"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Vil du udføre en automatisk skanning ?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Tildel højreklikshandling"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Du skal tildele en tast til 'Højreklik' handlingen for at spille dette spil"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Tildel \"skjul værktøjslinje\" handling"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Du skal tildele en tast til 'Skjul værktøjslinje' handlingen for at spille "
"dette spil"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Tildel Formindsk handling (valgfri)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Tildel Forstør handling (valgfri)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2575,42 +2708,89 @@ msgstr "Slag"
msgid "Do you really want to quit?"
msgstr "Vil du afslutte?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr ""
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
#, fuzzy
msgid "Maximum Volume"
msgstr "Lydstyrke"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
#, fuzzy
msgid "Minimal Volume"
msgstr "Lydstyrke"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr ""
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr ""
+
+#: backends/platform/bada/form.cpp:269
+#, fuzzy
+msgid "Right Click Once"
+msgstr "Højre klik"
+
+#: backends/platform/bada/form.cpp:277
+#, fuzzy
+msgid "Move Only"
+msgstr "Tale"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:296
+#, fuzzy
+msgid "Game Menu"
+msgstr "Spil"
+
+#: backends/platform/bada/form.cpp:301
+#, fuzzy
+msgid "Show Keypad"
+msgstr "Vis tastatur"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr ""
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Tilføj spil..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Tilføj spil..."
+
#~ msgid "Discovered %d new games."
#~ msgstr "Fundet %d nye spil."
diff --git a/po/de_DE.po b/po/de_DE.po
index d823212316..8abe17df4a 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -1,21 +1,21 @@
-# German translation for ScummVM.
-# Copyright (C) 2010-2011 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Lothar Serra Mari <Lothar@Windowsbase.de> & Simon Sawatzki <SimSaw@gmx.de>, 2010.
-#
+# German translation for ScummVM.
+# Copyright (C) 2010-2011 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Simon Sawatzki <SimSaw@gmx.de>, Lothar Serra Mari <Lothar@Windowsbase.de>, 2011.
+#
msgid ""
msgstr ""
-"Project-Id-Version: ScummVM 1.3.0svn\n"
+"Project-Id-Version: ScummVM 1.4.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-06-20 09:45+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-15 18:15+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-Team: Simon Sawatzki <SimSaw@gmx.de> (Lead), Lothar Serra Mari "
+"<Lothar@Windowsbase.de> (Contributor)\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:91
@@ -45,10 +45,11 @@ msgid "Go up"
msgstr "Pfad hoch"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -58,22 +59,22 @@ msgstr "Abbrechen"
msgid "Choose"
msgstr "Auswählen"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Schließen"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Mausklick"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Tastatur anzeigen"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Tasten neu zuweisen"
@@ -86,16 +87,17 @@ msgid "Map"
msgstr "Zuweisen"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -343,7 +345,7 @@ msgstr "Diese Spielkennung ist schon vergeben. Bitte eine andere wählen."
msgid "~Q~uit"
msgstr "~B~eenden"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "ScummVM beenden"
@@ -351,7 +353,7 @@ msgstr "ScummVM beenden"
msgid "A~b~out..."
msgstr "Übe~r~"
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Über ScummVM"
@@ -379,7 +381,7 @@ msgstr "~L~aden..."
msgid "Load savegame for selected game"
msgstr "Spielstand für ausgewähltes Spiel laden"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "Spiel ~h~inzufügen"
@@ -405,7 +407,7 @@ msgstr "Spiel ~e~ntfernen"
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:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~H~inzufügen"
@@ -433,14 +435,14 @@ msgid "Clear value"
msgstr "Wert löschen"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Spiel laden:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Laden"
@@ -454,17 +456,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Ja"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Nein"
@@ -502,34 +504,25 @@ msgstr "Durchsuchen"
msgid "Mass Add..."
msgstr "Durchsuchen"
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Hinzufügen"
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Spiel hinzufügen"
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... läuft..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Suchlauf abgeschlossen!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "%d neue Spiele gefunden, %d bereits hinzugefügte Spiele ignoriert."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d Ordner durchsucht..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "%d neue Spiele gefunden, %d bereits hinzugefügte Spiele ignoriert..."
@@ -611,8 +604,8 @@ msgstr ""
"Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt."
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Vollbildmodus"
@@ -935,7 +928,7 @@ msgstr "Verzeichnis für zusätzliche Dateien auswählen"
msgid "Select directory for plugins"
msgstr "Verzeichnis für Erweiterungen auswählen"
-# Nicht übersetzen, da diese Nachricht nur für nicht-lateinische Sprachen relevant ist.
+# Nicht übersetzen, da diese Nachricht nur für nicht-lateinische Sprachen relevant ist.
#: gui/options.cpp:1389
msgid ""
"The theme you selected does not support your current language. If you want "
@@ -962,19 +955,19 @@ msgstr "Löschen"
msgid "Do you really want to delete this savegame?"
msgstr "Diesen Spielstand wirklich löschen?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Datum: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Zeit: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Spieldauer: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Unbenannt"
@@ -982,60 +975,60 @@ msgstr "Unbenannt"
msgid "Select a Theme"
msgstr "Thema auswählen"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "GFX ausgeschaltet"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX ausgeschaltet"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standard-Renderer (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Kantenglättung (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Kantenglättung (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Engine unterstützt den Debug-Level \"%s\" nicht."
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menü"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Überspringen"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Zeile überspringen"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Fehler beim Ausführen des Spiels:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Konnte keine Spiel-Engine finden, die dieses Spiel starten kann."
@@ -1097,26 +1090,27 @@ msgstr "Engine-Plugin unterstützt keine Speicherstände."
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "Abbruch durch Benutzer"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "Unbekannter Fehler"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules-Grün"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules-Bernsteingelb"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules-Grün"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules-Gelb"
@@ -1129,7 +1123,7 @@ msgstr "Das Spiel im Verzeichnis \"%s\" scheint nicht bekannt zu sein."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
-"Bitte berichten Sie die folgenden Daten auf Englisch an das ScummVM-Team "
+"Bitte geben Sie die folgenden Daten auf Englisch an das ScummVM-Team weiter "
"sowie"
#: engines/advancedDetector.cpp:299
@@ -1172,17 +1166,17 @@ msgid "~R~eturn to Launcher"
msgstr "Zur Spiele~l~iste"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Speichern:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Speichern"
@@ -1192,41 +1186,41 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
-"Leider bietet diese Engine keine Spielhilfe. Bitte lesen Sie die LIESMICH-"
+"Leider bietet diese Engine keine Spielhilfe. Bitte lesen Sie die Liesmich-"
"Datei für grundlegende Informationen und Anweisungen dazu, wie man an "
"weitere Hilfe gelangt."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~A~bbrechen"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~asten"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr "Konnte Farbenformat nicht initialisieren."
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
msgstr "Konnte nicht zu Grafikmodus wechseln: '"
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
msgstr "Konnte Einstellung für Seitenverhältniskorrektur nicht anwenden."
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr "Konnte Einstellung für Vollbildmodus nicht anwenden."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1239,10 +1233,10 @@ msgstr ""
"führen und es wird deshalb empfohlen, die\n"
"Dateien des Spiels auf die Festplatte zu\n"
"kopieren und von dort aus zu spielen.\n"
-"Lesen Sie die LIESMICH-Datei für\n"
+"Lesen Sie die Liesmich-Datei für\n"
"weitere Informationen."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1255,32 +1249,137 @@ msgstr ""
"geeigneten Extrahierungsprogramms für\n"
"Audio-CDs beschafft werden, um diese im\n"
"Spiel hören zu können. Lesen Sie die\n"
-"LIESMICH-Datei für weitere Informationen."
+"Liesmich-Datei für weitere Informationen."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"WARNUNG: Das Spiel, welches Sie starten wollen, wird noch nicht vollständig "
+"von ScummVM unterstützt. Somit ist es wahrscheinlich, dass es instabil ist "
+"und jegliche Spielstände, die Sie erstellen, könnten in zukünftigen "
+"Versionen von ScummVM nicht mehr funktionieren."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "Trotzdem starten"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Bitte Disk %c einlegen und Taste drücken"
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "Kann %s (%c%d) nicht finden, bitte Taste drücken."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Fehler beim Lesen von Disk %c (%c%d), bitte Taste drücken."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Spielpause. Zum Weiterspielen Leertaste drücken."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Möchten Sie wirklich neu starten? (J/N)J"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Möchten Sie wirklich beenden? (J/N)J"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Spielen"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Beenden"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Legen Sie eine Spielstand-Disk ein."
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Sie müssen eine Bezeichnung eingeben."
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "Spiel wurde NICHT gespeichert. (Datenträger voll?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "Spiel wurde NICHT geladen."
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "Speichere \"%s\""
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "Lade \"%s\""
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "Name für Spielstand eingeben"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Spielstand zum LADEN auswählen"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "Spieltitel)"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~Z~urück"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~W~eiter"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~S~chließen"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Nur Sprachausgabe"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Sprachausgabe und Untertitel"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Nur Untertitel"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Sprache & Text"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Allgemeine Tastenbefehle:"
@@ -1331,14 +1430,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Spielstand 1-10 speichern"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Beenden"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1442,14 +1533,14 @@ msgid "Pull"
msgstr "Ziehe"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Gib"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Öffne"
@@ -1462,9 +1553,9 @@ msgid "Get"
msgstr "Nimm"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Benutze"
@@ -1487,13 +1578,13 @@ msgid "Turn off"
msgstr "Schalt aus"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Gehe zu"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Nimm"
@@ -1521,11 +1612,11 @@ msgstr "Reparier"
msgid "Switch"
msgstr "Wechsle"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Schau"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Rede"
@@ -1537,270 +1628,272 @@ msgstr "Reise"
msgid "To Henry / To Indy"
msgstr "Zu Henry/Zu Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "spiele tiefes C auf Stab"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "spiele D auf Stab"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "spiele E auf Stab"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "spiele F auf Stab"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "spiele G auf Stab"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "spiele A auf Stab"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "spiele B auf Stab"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "spiele hohes C auf Stab"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Drücke"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Ziehe"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Rede mit"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Schau an"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Mach an"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Mach aus"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Hoch-Taste"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Vorige Dialogwahl markieren"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Runter-Taste"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Nächste Dialogwahl markieren"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Gehe"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventar"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objekt"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Graustufen-Modus/Farbe"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Augen"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Zunge"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Schlage"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Tritt"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Betrachte"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Normaler Mauszeiger"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Kommunikation"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Speichern / Laden / Optionen"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Weitere Steuerung:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventar:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Liste hochblättern"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Liste runterblättern"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Oberer linker Gegenstand"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Unterer linker Gegenstand"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Oberer rechter Gegenstand"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Unterer rechter Gegenstand"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Mittlerer linker Gegenstand"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Mittlerer rechter Gegenstand"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Figuren wechseln:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Zweites Kind"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Drittes Kind"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Kampfsteuerung (Ziffernblock):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Schritt zurück"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Deckung oben"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Deckung Mitte"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Deckung unten"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Schlag oben"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Schlag Mitte"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Schlag unten"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Dies gilt für Indy links."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Wenn Indy rechts steht,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "werden 7, 4 und 1 je mit"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6 und 3 vertauscht."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Doppeldecker (Ziffernblock):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Nach oben links fliegen"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Nach links fliegen"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Nach unten links fliegen"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Nach oben fliegen"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Geradeaus fliegen"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Nach unten fliegen"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Nach oben rechts fliegen"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Nach rechts fliegen"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Nach unten rechts fliegen"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -1809,7 +1902,7 @@ msgstr ""
"Systemeigene MIDI-Ünterstützung erfordert das Roland-Upgrade von LucasArts,\n"
"aber %s fehlt. Stattdessen wird AdLib verwendet."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1820,7 +1913,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1831,7 +1924,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1842,7 +1935,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1853,45 +1946,51 @@ msgstr ""
"im Startmenü von ScummVM und wählen das Verzeichnis \"Maniac\" im "
"Verzeichnis dieses Spiels aus."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
-msgstr "~Z~ip-Modus aktiviert"
+msgstr "Schneller ~R~aumwechsel aktiviert"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "Über~g~änge aktiviert"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "Seite ~w~egwerfen"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "~K~arte anzeigen"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Haupt~m~enü"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~W~assereffekt aktiviert"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Spiel laden:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Laden"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr "Zwischensequenz \"%s\" nicht gefunden!"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
msgstr "Konnte Spielstand aus Datei nicht laden."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
msgstr "Konnte Spielstand nicht in Datei speichern."
@@ -1899,7 +1998,7 @@ msgstr "Konnte Spielstand nicht in Datei speichern."
msgid "Failed to delete file."
msgstr "Konnte Datei nicht löschen."
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
msgstr "Konnte Spielstand nicht speichern."
@@ -2042,6 +2141,7 @@ msgstr ""
"ScummVM hat ein paar Warnungen im Konsolenfenster ausgegeben und kann nicht "
"gewährleisten, dass alle Speicherstände umgewandelt wurden.\n"
"\n"
+"Bitte berichten Sie dies dem Team auf Englisch."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2051,45 +2151,46 @@ msgstr "MAME-OPL-Emulator"
msgid "DOSBox OPL emulator"
msgstr "DOSBox-OPL-Emulator"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
"Das ausgewählte Audiogerät \"%s\" wurde nicht gefunden (könnte "
-"beispielsweise ausgeschaltet oder nicht angeschlossen sein). Es wird "
-"versucht, auf das nächste verfügbare Gerät zurückzugreifen."
+"beispielsweise ausgeschaltet oder nicht angeschlossen sein)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "Es wird versucht, auf das nächste verfügbare Gerät zurückzugreifen."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
"Das ausgewählte Audiogerät \"%s\" kann nicht verwendet werden. Schauen Sie "
-"für weitere Informationen in der Log-Datei nach. Es wird versucht, auf das "
-"nächste verfügbare Gerät zurückzugreifen."
+"für weitere Informationen in der Log-Datei nach."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
"Das bevorzugte Audiogerät \"%s\" wurde nicht gefunden (könnte beispielsweise "
-"ausgeschaltet oder nicht angeschlossen sein). Es wird versucht, auf das "
-"nächste verfügbare Gerät zurückzugreifen."
+"ausgeschaltet oder nicht angeschlossen sein)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
"Das bevorzugte Audiogerät \"%s\" kann nicht verwendet werden. Schauen Sie "
-"für weitere Informationen in der Log-Datei nach. Es wird versucht, auf das "
-"nächste verfügbare Gerät zurückzugreifen."
+"für weitere Informationen in der Log-Datei nach."
#: audio/null.h:43
msgid "No music"
@@ -2235,6 +2336,27 @@ msgstr "Touchpad-Modus aktiviert."
msgid "Touchpad mode disabled."
msgstr "Touchpad-Modus ausgeschaltet."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "ScummVM verbergen"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Andere verbergen"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Alles zeigen"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Fenster"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Minimieren"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (keine Skalierung)"
@@ -2244,50 +2366,50 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal ohn.Skalieren"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
msgstr "Seitenverhältniskorrektur an"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
msgstr "Seitenverhältniskorrektur aus"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
msgstr "Aktiver Grafikfilter:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
msgstr "Fenstermodus"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
-msgstr ""
+msgstr "OpenGL: normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
-msgstr ""
+msgstr "OpenGL: beibehalten"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
-msgstr ""
+msgstr "OpenGL: original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
msgstr "Aktueller Grafikmodus"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr "Aktueller Vergrößerungsfaktor"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr "Aktiver Filtermodus: linear"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr "Aktiver Filtermodus: nächste Nachbarn"
@@ -2314,11 +2436,13 @@ msgstr "Rechts"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Linksklick"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Rechtsklick"
@@ -2547,13 +2671,13 @@ msgstr "Zeiger nach links"
msgid "Cursor Right"
msgstr "Zeiger nach rechts"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Möchten Sie ein Spiel laden oder speichern?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Möchten Sie wirklich beenden? "
@@ -2565,47 +2689,47 @@ msgstr "Tastatur"
msgid "Rotate"
msgstr "Drehen"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Verwende SDL-Treiber "
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Anzeige "
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Möchten Sie eine automatische Suche durchführen?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Aktion \"Rechtsklick\" zuweisen"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Sie müssen der Aktion \"Rechtsklick\" eine Taste zuweisen, um dieses Spiel "
"spielen zu können."
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Aktion \"Werkzeugleiste verbergen\" zuweisen"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Sie müssen der Aktion \"Werkzeugleiste verbergen\" eine Taste zuweisen, um "
"dieses Spiel spielen zu können."
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Aktion \"Herauszoomen\" zuweisen (optional)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Aktion \"Hineinzoomen\" zuweisen (optional)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2624,40 +2748,76 @@ msgstr "Spieleliste"
msgid "Do you really want to quit?"
msgstr "Möchten Sie wirklich beenden?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr "Berührungsbildschirm-Tipp-Modus - Linksklick"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr "Berührungsbildschirm-Tipp-Modus - Rechtsklick"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr "Berührungsbildschirm-Tipp-Modus - schweben (kein Klick)"
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
msgstr "Höchste Lautstärke"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr "Lautstärke höher"
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
msgstr "Niedrigste Lautstärke"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr "Lautstärke niedriger"
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Suche nach Aktualisierungen..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "Einmal Rechtsklick"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "Nur bewegen"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "Escape-Taste"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "Spielmenü"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "Ziffernblock zeigen"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "Maus steuern"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "Klicken aktiviert"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "Klicken deaktiviert"
+
#~ msgid ""
#~ "Your game version has been detected using filename matching as a variant "
#~ "of %s."
@@ -2665,20 +2825,5 @@ msgstr "Lautstärke niedriger"
#~ "Ihre Spielversion wurde durch Dateinamen-Übereinstimmung als Variante von "
#~ "%s erkannt."
-#~ msgid "If this is an original and unmodified version, please report any"
-#~ msgstr ""
-#~ "Sollte es sich hierbei um eine unmodifizierte Originalversion handeln,"
-
-#~ msgid "information previously printed by ScummVM to the team."
-#~ msgstr ""
-#~ "so teilen Sie bitte dem Team die von ScummVM zuvor ausgegebenen Daten auf "
-#~ "Englisch mit."
-
#~ msgid "Command line argument not processed"
#~ msgstr "Argument in Kommandozeile nicht verarbeitet"
-
-#~ msgid "FM Towns Emulator"
-#~ msgstr "FM-Towns-Emulator"
-
-#~ msgid "Invalid Path"
-#~ msgstr "Ungültiges Verzeichnis"
diff --git a/po/es_ES.po b/po/es_ES.po
index 730b8d48b0..2346d46c3b 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -1,20 +1,20 @@
# Spanish translation for ScummVM.
# Copyright (C) 2010-2011 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
-# Tomás Maidagan, 2010.
+# Tomás Maidagan, 2011.
#
msgid ""
msgstr ""
-"Project-Id-Version: ScummVM 1.3.0svn\n"
+"Project-Id-Version: ScummVM 1.4.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-05-08 13:31+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-15 13:40+0100\n"
"Last-Translator: Tomás Maidagan\n"
"Language-Team: \n"
+"Language: Espanol\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Espanol\n"
#: gui/about.cpp:91
#, c-format
@@ -43,10 +43,11 @@ msgid "Go up"
msgstr "Arriba"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -56,22 +57,22 @@ msgstr "Cancelar"
msgid "Choose"
msgstr "Aceptar"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Cerrar"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Clic de ratón"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Mostrar el teclado"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Asignar teclas"
@@ -84,16 +85,17 @@ msgid "Map"
msgstr "Asignar"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "Aceptar"
@@ -341,7 +343,7 @@ msgstr "Esta ID ya está siendo usada. Por favor, elige otra."
msgid "~Q~uit"
msgstr "~S~alir"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Cerrar ScummVM"
@@ -349,7 +351,7 @@ msgstr "Cerrar ScummVM"
msgid "A~b~out..."
msgstr "Acerca ~d~e"
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Acerca de ScummVM"
@@ -377,7 +379,7 @@ msgstr "~C~argar..."
msgid "Load savegame for selected game"
msgstr "Cargar partida del juego seleccionado"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~A~ñadir juego..."
@@ -401,7 +403,7 @@ msgstr "E~l~iminar juego"
msgid "Remove game from the list. The game data files stay intact"
msgstr "Eliminar el juego de la lista. Los archivos no se borran"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~ñadir..."
@@ -429,14 +431,14 @@ msgid "Clear value"
msgstr "Eliminar valor"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Cargar juego:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Cargar"
@@ -450,17 +452,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Sí"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "No"
@@ -498,37 +500,32 @@ msgstr "Añad. varios"
msgid "Mass Add..."
msgstr "Añadir varios..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Añadir..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Añadir juego..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... progreso..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "¡Búsqueda completada!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
+"Se han encontrado %d juegos nuevos, se han ignorado %d juegos añadidos "
+"previamente."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "Se ha buscado en %d directorios..."
-#: gui/massadd.cpp:253
-#, fuzzy, c-format
+#: gui/massadd.cpp:268
+#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "Se han encontrado %d juegos nuevos..."
+msgstr ""
+"Se han encontrado %d juegos nuevos, se han ignorado %d juegos añadidos "
+"previamente..."
#: gui/options.cpp:72
msgid "Never"
@@ -578,19 +575,19 @@ msgstr "Ninguno"
#: gui/options.cpp:372
msgid "Failed to apply some of the graphic options changes:"
-msgstr ""
+msgstr "Fallo al aplicar algunos cambios en las opciones gráficas:"
#: gui/options.cpp:384
msgid "the video mode could not be changed."
-msgstr ""
+msgstr "no se ha podido cambiar el modo de vídeo."
#: gui/options.cpp:390
msgid "the fullscreen setting could not be changed"
-msgstr ""
+msgstr "no se ha podido cambiar el ajuste de pantalla completa"
#: gui/options.cpp:396
msgid "the aspect ratio setting could not be changed"
-msgstr ""
+msgstr "no se ha podido cambiar el ajuste de corrección de aspecto"
#: gui/options.cpp:705
msgid "Graphics mode:"
@@ -605,8 +602,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Modos especiales de expansión soportados por algunos juegos"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Pantalla completa"
@@ -900,9 +897,8 @@ msgid "Language of ScummVM GUI"
msgstr "Idioma de la interfaz de ScummVM"
#: gui/options.cpp:1295
-#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
-msgstr "Tienes que reiniciar ScummVM para aplicar los cambios."
+msgstr "Tienes que reiniciar ScummVM para que los cambios surjan efecto."
#: gui/options.cpp:1308
msgid "Select directory for savegames"
@@ -953,19 +949,19 @@ msgstr "Borrar"
msgid "Do you really want to delete this savegame?"
msgstr "¿Seguro que quieres borrar esta partida?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Fecha: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Hora: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Tiempo: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Partida sin nombre"
@@ -973,60 +969,60 @@ msgstr "Partida sin nombre"
msgid "Select a Theme"
msgstr "Selecciona un tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "GFX desactivados"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desactivados"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Estándar (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Estándar (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Suavizado (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Suavizado (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "El motor no soporta el nivel de debug '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menú"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Saltar"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausar"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Saltar frase"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Error al ejecutar el juego:"
-#: base/main.cpp:456
+#: base/main.cpp:463
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"
@@ -1088,26 +1084,27 @@ msgstr "El plugin del motor no es compatible con partidas guardadas"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "Cancel·lat per l'usuari"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "Error desconocido"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules verde"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules ámbar"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules verde"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules ámbar"
@@ -1115,15 +1112,15 @@ msgstr "Hercules ámbar"
#: engines/advancedDetector.cpp:296
#, c-format
msgid "The game in '%s' seems to be unknown."
-msgstr ""
+msgstr "El juego en '%s' parece ser desconocido."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
-msgstr ""
+msgstr "Por favor, envía al equipo de ScummVM esta información junto al nombre"
#: engines/advancedDetector.cpp:299
msgid "of the game you tried to add and its version/language/etc.:"
-msgstr ""
+msgstr "del juego que has intentado añadir y su versión/idioma/etc.:"
#: engines/dialogs.cpp:84
msgid "~R~esume"
@@ -1159,17 +1156,17 @@ msgid "~R~eturn to Launcher"
msgstr "~V~olver al lanzador"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Guardar partida"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Guardar"
@@ -1179,40 +1176,41 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
+"Lo sentimos, aún no hay ayuda disponible para este juego. Por favor, "
+"consulta el archivo README para encontrar información básica e instrucciones "
+"para obtener más ayuda."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~S~í"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~C~ancelar"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
-msgstr ""
+msgstr "No se ha podido iniciar el formato de color."
-#: engines/engine.cpp:228
-#, fuzzy
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
-msgstr "Modo de vídeo actual:"
+msgstr "No se ha podido cambiar al modo de video: '"
-#: engines/engine.cpp:237
-#, fuzzy
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
-msgstr "Corrección de aspecto"
+msgstr "No se ha podido aplicar el ajuste de corrección de aspecto"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
-msgstr ""
+msgstr "No se ha podido aplicar el ajuste de pantalla completa."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1220,8 +1218,13 @@ msgid ""
"the data files to your hard disk instead.\n"
"See the README file for details."
msgstr ""
+"Parece que estás ejecutando este juego\n"
+"directamente desde el CD. Esto puede\n"
+"provocar problemas, así que es recomendable\n"
+"copiar los archivos del juego al disco duro.\n"
+"Consulta el archivo README para más detalles."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1229,38 +1232,147 @@ msgid ""
"order to listen to the game's music.\n"
"See the README file for details."
msgstr ""
+"Este juego incluye pistas de audio en el disco.\n"
+"Es necesario extraer estas pistas utilizando un\n"
+"programa de extracción de CD audio para\n"
+"poder escuchar la música del juego.\n"
+"Consulta el archivo README para más detalles."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"AVISO: El juego que vas a ejecutar aún no es totalmente compatible con "
+"ScummVM. Por lo tanto, puede que sea inestable, y que las partidas que "
+"guardes no funcionen en versiones futuras de ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "Jugar de todos modos"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Inserta el disco %c y pulsa un botón para continuar."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "No se ha podido encontrar %s, (%c%d) Pulsa un botón."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Error leyendo el disco %c, (%c%d) Pulsa un botón."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Juego pausado. Pulsa Espacio para continuar."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "¿Seguro que quieres reiniciar? (S/N)"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "¿Seguro que quieres salir? (S/N)"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Jugar"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Salir"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Inserta el disco de las partidas guardadas"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Tienes que introducir un nombre"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "La partida no se ha guardado (¿disco lleno?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "La partida no se ha cargado"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "Guardando '%s'"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "Cargando '%s'"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "Pon nombre a tu partida"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Selecciona un juego para cargar"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "Título del juego)"
-#: engines/scumm/dialogs.cpp:281
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~A~nterior"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "Si~g~uiente"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "Cerra~r~"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Solo voces"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Voces y subtítulos"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Solo subtítulos"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Voces y sub."
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Comandos básicos de teclado:"
#: engines/scumm/help.cpp:74
msgid "Save / Load dialog"
-msgstr "Pantalla de Guardar / Cargar"
+msgstr "Pantalla de guardar / cargar"
#: engines/scumm/help.cpp:76
msgid "Skip line of text"
@@ -1304,14 +1416,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Guardar partida 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Salir"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1393,9 +1497,8 @@ msgid " since they may cause crashes"
msgstr " provocar cuelgues o un"
#: engines/scumm/help.cpp:110
-#, fuzzy
msgid " or incorrect game behavior."
-msgstr " funcionamiento incorrecto del juego"
+msgstr " funcionamiento incorrecto del juego."
#: engines/scumm/help.cpp:114
msgid "Spinning drafts on the keyboard:"
@@ -1416,14 +1519,14 @@ msgid "Pull"
msgstr "Tirar"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Dar"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Abrir"
@@ -1436,9 +1539,9 @@ msgid "Get"
msgstr "Coger"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Usar"
@@ -1461,13 +1564,13 @@ msgid "Turn off"
msgstr "Apagar"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Ir a"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Recoger"
@@ -1495,11 +1598,11 @@ msgstr "Arreglar"
msgid "Switch"
msgstr "Cambiar"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Mirar"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Hablar"
@@ -1511,277 +1614,281 @@ msgstr "Viajar"
msgid "To Henry / To Indy"
msgstr "Henry / Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "Tocar C menor con el bastón"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "Tocar D con el bastón"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "Tocar E con el bastón"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "Tocar F con el bastón"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "Tocar G con el bastón"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "Tocar A con el bastón"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "Tocar B con el bastón"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "Tocar C mayor con el bastón"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Empujar"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Tirar"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Hablar con"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Mirar"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Encender"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Apagar"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Arriba"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Seleccionar diálogo anterior"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Abajo"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Seleccionar diálogo siguiente"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Caminar"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventario"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objeto"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Blanco y negro / Color"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Ojos"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Lengua"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Puñetazo"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Patada"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Examinar"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Cursor normal"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Guardar / Cargar / Opciones"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Otros controles:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventario:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Subir"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Bajar"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Objeto superior izquierdo"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Objeto inferior izquierdo"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Objeto superior derecho"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Objeto inferior derecho"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Objeto izquierdo del medio"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Objeto derecho del medio"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Cambiar personaje:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Segundo chaval"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Tercer chaval"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
-msgstr "Controles de lucha (tecl. num.)"
+msgstr "Controles de lucha (tecl. num.):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Retroceder"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Bloqueo alto"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Bloqueo medio"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Bloqueo bajo"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Puñetazo alto"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Puñetazo medio"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Puñetazo bajo"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Válidos cuando Indy está a la izquierda."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Cuando Indy está a la derecha,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4 y 1 se cambian por"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6 y 3, respectivamente."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Controles del biplano (tecl. num.)"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Volar arriba y a la izquierda"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Volar a la izquierda"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Volar abajo y a la izquierda"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Volar arriba"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Volar recto"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Volar abajo"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Volar arriba y a la derecha"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Volar a la derecha"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Volar abajo y a la derecha"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
+"El soporte MIDI nativo requiere la actualización Roland de LucasArts,\n"
+"pero %s no está disponible. Se usará AdLib."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1792,7 +1899,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1803,7 +1910,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1814,7 +1921,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1824,71 +1931,61 @@ msgstr ""
"permite. Para jugar, ve a 'Añadir juego' en el menú de inicio de ScummVM y "
"selecciona el directorio 'Maniac', dentro del directorio de DOTT."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "Modo ~Z~ip activado"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "Tra~n~siciones activadas"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "~T~irar página"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "~M~ostrar el mapa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enú principal"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "Efecto ag~u~a activado"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Cargar partida:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Cargar"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
-msgstr ""
+msgstr "No se ha encontrado el vídeo '%s'"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
-#, fuzzy
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
-msgstr ""
-"Fallo al cargar desde el archivo:\n"
-"\n"
-"%s"
+msgstr "Fallo al cargar el estado del juego desde el archivo."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
-#, fuzzy
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
-msgstr ""
-"Fallo al guardar en el archivo:\n"
-"\n"
-"%s"
+msgstr "Fallo al guardar el estado del juego en el archivo."
#: engines/gob/inter_v5.cpp:107
-#, fuzzy
msgid "Failed to delete file."
-msgstr ""
-"Fallo al guardar en el archivo:\n"
-"\n"
-"%s"
+msgstr "Fallo al borrar el archivo."
-#: engines/groovie/script.cpp:417
-#, fuzzy
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
-msgstr ""
-"Fallo al guardar en el archivo:\n"
-"\n"
-"%s"
+msgstr "Fallo al guardar la partida"
#: engines/kyra/sound_midi.cpp:475
msgid ""
@@ -1898,36 +1995,45 @@ msgid ""
"General MIDI ones. After all it might happen\n"
"that a few tracks will not be correctly played."
msgstr ""
+"Estás usando un dispositivo General Midi,\n"
+"pero el juego solo soporta MIDI Roland MT32.\n"
+"Intentamos adaptar los instrumentos Roland MT32\n"
+"a los de General MIDI, pero es posible que algunas\n"
+"de las pistas no se reproduzcan correctamente."
#: engines/m4/m4_menus.cpp:138
-#, fuzzy
msgid "Save game failed!"
-msgstr "Guardar partida"
+msgstr "No se ha podido guardar la partida."
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
"Please download it from www.scummvm.org"
msgstr ""
+"No se ha encontrado el archivo \"sky.cpt\"\n"
+"Por favor, bájalo de www.scummvm.org"
#: engines/sky/compact.cpp:141
msgid ""
"The \"sky.cpt\" file has an incorrect size.\n"
"Please (re)download it from www.scummvm.org"
msgstr ""
+"El archivo \"sky.cpt\" tiene un tamaño incorrecto.\n"
+"Por favor, vuelve a bajarlo de www.scummvm.org"
#: engines/sword1/animation.cpp:344 engines/sword2/animation.cpp:379
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
+"Se han encontrado vídeos DXA, pero se ha compilado ScummVM sin soporte zlib"
#: engines/sword1/animation.cpp:354 engines/sword2/animation.cpp:389
msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
+msgstr "Los vídeos MPEG2 ya no son compatibles"
#: engines/sword1/animation.cpp:359 engines/sword2/animation.cpp:397
#, c-format
msgid "Cutscene '%s' not found"
-msgstr ""
+msgstr "No se ha encontrado el vídeo '%s'"
#: engines/sword1/control.cpp:863
msgid ""
@@ -1939,6 +2045,13 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
+"ScummVM ha detectado que tienes partidas guardadas antiguas de Broken Sword "
+"1, que deben ser actualizadas.\n"
+"El formato antiguo ya no es compatible, así que no podrás cargar tus "
+"partidos si no las actualizas.\n"
+"\n"
+"Pulsa Aceptar para actualizarlas, si no lo haces este mensaje volverá a "
+"aparecer la próxima vez.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -1946,18 +2059,20 @@ msgid ""
"Target new save game already exists!\n"
"Would you like to keep the old save game (%s) or the new one (%s)?\n"
msgstr ""
+"¡La partida guardada ya existe!\n"
+"¿Quieres conservar la partida guardada antigua (%s) o la nueva (%s)?\n"
#: engines/sword1/control.cpp:1235
msgid "Keep the old one"
-msgstr ""
+msgstr "Conservar la antigua"
#: engines/sword1/control.cpp:1235
msgid "Keep the new one"
-msgstr ""
+msgstr "Conservar la nueva"
#: engines/sword1/logic.cpp:1633
msgid "This is the end of the Broken Sword 1 Demo"
-msgstr ""
+msgstr "Este es el final de la demo de Broken Sword 1"
#: engines/parallaction/saveload.cpp:133
#, c-format
@@ -1965,16 +2080,16 @@ msgid ""
"Can't save game in slot %i\n"
"\n"
msgstr ""
+"No se puede guardar en la ranura %i\n"
+"\n"
#: engines/parallaction/saveload.cpp:211
-#, fuzzy
msgid "Loading game..."
-msgstr "Cargar juego:"
+msgstr "Cargando partida..."
#: engines/parallaction/saveload.cpp:226
-#, fuzzy
msgid "Saving game..."
-msgstr "Guardar partida"
+msgstr "Guardando partida..."
#: engines/parallaction/saveload.cpp:279
msgid ""
@@ -1985,10 +2100,17 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
+"ScummVM ha detectado que tienes partidas guardadas de Nippon Safes que hay "
+"que renombrar.\n"
+"Los nombres antiguos ya no son compatibles, así que no podrás cargar tus "
+"partidas hasta que los actualices.\n"
+"\n"
+"Pulsa Aceptar para actualizarlos, si no lo haces este mensaje volverá a "
+"aparecer la próxima vez.\n"
#: engines/parallaction/saveload.cpp:326
msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
+msgstr "ScummVM ha convertido todas las partidas guardadas correctamente."
#: engines/parallaction/saveload.cpp:328
msgid ""
@@ -1997,6 +2119,10 @@ msgid ""
"\n"
"Please report to the team."
msgstr ""
+"ScummVM ha mostrado avisos en la ventana de la consola y no puede garantizar "
+"que se hayan convertido todos tus archivos.\n"
+"\n"
+"Por favor, contacta con el equipo."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2006,33 +2132,46 @@ msgstr "Emulador OPL de MAME"
msgid "DOSBox OPL emulator"
msgstr "Emulador OPL de DOSBox"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"El dispositivo de sonido seleccionado, '%s', no se ha podido encontrar "
+"(puede estar apagado o desconectado)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "Recorriendo al siguiente dispositivo disponible..."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"El dispositivo de sonido seleccionado, '%s', no se puede utilizar. Consulta "
+"el registro para más información."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"El dispositivo de sonido preferido, '%s', no se ha podido encontrar (puede "
+"estar apagado o desconectado)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"El dispositivo de sonido preferido, '%s', no se puede utilizar. Consulta el "
+"registro para más información."
#: audio/null.h:43
msgid "No music"
@@ -2055,9 +2194,8 @@ msgid "C64 Audio Emulator"
msgstr "Emulador de C64 Audio"
#: audio/softsynth/mt32.cpp:329
-#, fuzzy
msgid "Initializing MT-32 Emulator"
-msgstr "Iniciando emulador de MT-32"
+msgstr "Iniciando el emulador de MT-32"
#: audio/softsynth/mt32.cpp:543
msgid "MT-32 Emulator"
@@ -2164,14 +2302,12 @@ msgid "Disable power off"
msgstr "Desactivar apagado"
#: backends/platform/iphone/osys_events.cpp:338
-#, fuzzy
msgid "Mouse-click-and-drag mode enabled."
-msgstr "Modo Touchpad activado."
+msgstr "Modo clic-de-ratón-y-arrastrar activado."
#: backends/platform/iphone/osys_events.cpp:340
-#, fuzzy
msgid "Mouse-click-and-drag mode disabled."
-msgstr "Modo Touchpad desactivado."
+msgstr "Modo clic-de-ratón-y-arrastrar desactivado."
#: backends/platform/iphone/osys_events.cpp:351
msgid "Touchpad mode enabled."
@@ -2181,6 +2317,27 @@ msgstr "Modo Touchpad activado."
msgid "Touchpad mode disabled."
msgstr "Modo Touchpad desactivado."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "Oculta ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Ocultar otros"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Mostrar todo"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Ventana"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Minimizar"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (sin reescalado)"
@@ -2190,57 +2347,52 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
-msgstr "Corrección de aspecto"
+msgstr "Activar la corrección de aspecto"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
-msgstr "Corrección de aspecto"
+msgstr "Desactivar la corrección de aspecto"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
-msgstr "Alternar entre filtros gráficos"
+msgstr "Filtro de gráficos activo:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
-msgstr "Renderizado:"
+msgstr "Modo ventana"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Conservar"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
-#, fuzzy
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
-msgstr "Modo de vídeo actual:"
+msgstr "Modo de vídeo actual"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
-msgstr ""
+msgstr "Escala actual"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
-msgstr ""
+msgstr "Modo de filtro activo: lineal"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
-msgstr ""
+msgstr "Modo de filtro activo: el más cercano"
#: backends/platform/symbian/src/SymbianActions.cpp:38
#: backends/platform/wince/CEActionsSmartphone.cpp:39
@@ -2265,11 +2417,13 @@ msgstr "Derecha"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Clic izquierdo"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Clic derecho"
@@ -2330,7 +2484,7 @@ msgstr "Doble golpe"
#: backends/platform/wii/options.cpp:60
msgid "Horizontal underscan:"
-msgstr "Underscan horizontal"
+msgstr "Underscan horizontal:"
#: backends/platform/wii/options.cpp:66
msgid "Vertical underscan:"
@@ -2390,7 +2544,7 @@ msgstr "Contraseña:"
#: backends/platform/wii/options.cpp:121
msgid "Init network"
-msgstr "Inicializar red"
+msgstr "Iniciar red"
#: backends/platform/wii/options.cpp:123
msgid "Mount SMB"
@@ -2433,19 +2587,17 @@ msgid "Network down"
msgstr "Red desconectada"
#: backends/platform/wii/options.cpp:178
-#, fuzzy
msgid "Initializing network"
-msgstr "Inicializando red"
+msgstr "Iniciando la red"
#: backends/platform/wii/options.cpp:182
-#, fuzzy
msgid "Timeout while initializing network"
-msgstr "Se ha excedido el tiempo de inicialización de red"
+msgstr "Se ha excedido el tiempo de iniciación de red"
#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
+#, c-format
msgid "Network not initialized (%d)"
-msgstr "Red no inicializada (%d)"
+msgstr "Red no iniciada (%d)"
#: backends/platform/wince/CEActionsPocket.cpp:46
msgid "Hide Toolbar"
@@ -2500,13 +2652,13 @@ msgstr "Izquierda"
msgid "Cursor Right"
msgstr "Derecha"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "¿Quieres cargar o guardar el juego?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr "¿Seguro que quieres salir?"
@@ -2518,46 +2670,46 @@ msgstr "Teclado"
msgid "Rotate"
msgstr "Rotar"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
-msgstr "Usando driver SDL"
+msgstr "Usando el controlador SDL"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Pantalla"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "¿Quieres realizar una búsqueda automática?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Asignar acción 'Clic derecho'"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Debes asignar una tecla a la acción 'Clic derecho' para jugar a este juego"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Asignar acción 'Ocultar barra de tareas'"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Debes asignar una tecla a la acción 'Ocultar barra de tareas' para jugar a "
"este juego"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Asignar acción 'Zoom' (opcional)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Asignar acción 'Disminuir zoom' (opcional)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2565,64 +2717,83 @@ msgstr ""
"todo el inventario"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Do you really want to return to the Launcher?"
-msgstr "¿Seguro que quieres borrar esta partida?"
+msgstr "¿Seguro que quieres volver al Lanzador?"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Launcher"
-msgstr "Puñetazo"
+msgstr "Lanzador"
#: backends/events/default/default-events.cpp:244
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "¿Quieres salir?"
+msgstr "¿Realmente quieres salir?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
+msgstr "'Modo toque' de pantalla táctil - Clic izquierdo"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
+msgstr "'Modo toque' de pantalla táctil - Clic derecho"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
+msgstr "'Modo toque' de pantalla táctil - Flotante (sin clic)"
-#: backends/events/gph/gph-events.cpp:390
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
-msgstr "Volumen"
+msgstr "Volumen máximo"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
-msgstr ""
+msgstr "Aumentando el volumen"
-#: backends/events/gph/gph-events.cpp:398
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
-msgstr "Volumen"
+msgstr "Volumen mínimo"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
-msgstr ""
+msgstr "Bajando el volumen"
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Comprobando las actualizaciones..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "Un clic derecho"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "Solo mover"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "Tecla Escape"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "Menú del juego"
-#~ msgid "Discovered %d new games."
-#~ msgstr "Se han encontrado %d juegos nuevos."
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "Mostrar el teclado numérico"
-#~ msgid "Command line argument not processed"
-#~ msgstr "Argumento no válido de la línea de comando"
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "Control del ratón"
-#~ msgid "FM Towns Emulator"
-#~ msgstr "Emulador de FM Towns"
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "Clic activado"
-#~ msgid "Invalid Path"
-#~ msgstr "Ruta no válida"
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "Clic desactivado"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index cfb0c0a45b..1385f27ba6 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -1,14 +1,14 @@
# French translation for ScummVM.
# Copyright (C) 2010-2011 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
-# Thierry Crozat <criezy@scummvm.org>, 2010.
+# Thierry Crozat <criezy@scummvm.org>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-05-02 19:50+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-23 14:52+0100\n"
"Last-Translator: Thierry Crozat <criezy@scummvm.org>\n"
"Language-Team: French <scummvm-devel@lists.sf.net>\n"
"MIME-Version: 1.0\n"
@@ -44,10 +44,11 @@ msgid "Go up"
msgstr "Remonter"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -57,22 +58,22 @@ msgstr "Annuler"
msgid "Choose"
msgstr "Choisir"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Fermer"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Clic de souris"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Afficher le clavier"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Changer l'affectation des touches"
@@ -85,16 +86,17 @@ msgid "Map"
msgstr "Affecter"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -342,7 +344,7 @@ msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp."
msgid "~Q~uit"
msgstr "~Q~uitter"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Quitter ScummVM"
@@ -350,7 +352,7 @@ msgstr "Quitter ScummVM"
msgid "A~b~out..."
msgstr "À ~P~ropos..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "À propos de ScummVM"
@@ -378,7 +380,7 @@ msgstr "~C~harger"
msgid "Load savegame for selected game"
msgstr "Charge une sauvegarde pour le jeu sélectionné"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~A~jouter..."
@@ -403,7 +405,7 @@ msgstr "~S~upprimer"
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:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~jouter..."
@@ -431,14 +433,14 @@ msgid "Clear value"
msgstr "Effacer la valeur"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Charger le jeu:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Charger"
@@ -452,17 +454,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Oui"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Non"
@@ -500,37 +502,29 @@ msgstr "Ajout Massif..."
msgid "Mass Add..."
msgstr "Ajout Massif..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Ajouter..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Ajouter..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... en cours ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Examen terminé!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
-msgstr ""
+msgstr "%d nouveaux jeux trouvés, %d jeux ignorés (déjà ajoutés précédemment)."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d répertoires examinés ..."
-#: gui/massadd.cpp:253
-#, fuzzy, c-format
+#: gui/massadd.cpp:268
+#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "%d nouveaux jeux trouvés ..."
+msgstr ""
+"%d nouveaux jeux trouvés, %d jeux ignorés (déjà ajouté précédemment) ..."
#: gui/options.cpp:72
msgid "Never"
@@ -580,19 +574,19 @@ msgstr "Aucune"
#: gui/options.cpp:372
msgid "Failed to apply some of the graphic options changes:"
-msgstr ""
+msgstr "Certaines options graphiques n'ont pu être changées:"
#: gui/options.cpp:384
msgid "the video mode could not be changed."
-msgstr ""
+msgstr "le mode vidéo n'a pu être changé."
#: gui/options.cpp:390
msgid "the fullscreen setting could not be changed"
-msgstr ""
+msgstr "le mode plein écran n'a pu être changé."
#: gui/options.cpp:396
msgid "the aspect ratio setting could not be changed"
-msgstr ""
+msgstr "la correction de rapport d'aspect n'a pu être changée."
#: gui/options.cpp:705
msgid "Graphics mode:"
@@ -607,8 +601,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Mode spécial de tramage supporté par certains jeux"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Plein écran"
@@ -903,7 +897,6 @@ msgid "Language of ScummVM GUI"
msgstr "Langue de l'interface graphique de ScummVM"
#: gui/options.cpp:1295
-#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
msgstr ""
"Vous devez relancer ScummVM pour que le changement soit pris en compte."
@@ -958,19 +951,19 @@ msgstr "Supprimer"
msgid "Do you really want to delete this savegame?"
msgstr "Voulez-vous vraiment supprimer cette sauvegarde?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Date: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Heure: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Durée de jeu: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Sauvegarde sans nom"
@@ -978,60 +971,60 @@ msgstr "Sauvegarde sans nom"
msgid "Select a Theme"
msgstr "Sélectionnez un Thème"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "GFX désactivé"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX désactivé"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Rendu Standard (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Rendu Anti-crénelé (16 bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Anti-crénelé (16 bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Le niveau de debug '%s' n'est pas supporté par ce moteur de jeu"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Passer"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Mettre en pause"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Passer la phrase"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Erreur lors de l'éxécution du jeu:"
-#: base/main.cpp:456
+#: base/main.cpp:463
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é"
@@ -1093,26 +1086,27 @@ msgstr "Ce moteur de jeu ne supporte pas les sauvegardes"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "Annuler par l'utilisateur"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "Erreur inconnue"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules Vert"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules Ambre"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules Vert"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules Ambre"
@@ -1120,15 +1114,17 @@ msgstr "Hercules Ambre"
#: engines/advancedDetector.cpp:296
#, c-format
msgid "The game in '%s' seems to be unknown."
-msgstr ""
+msgstr "Le jeu dans '%s' n'est pas reconnu."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
+"Veuillez reporter les informations suivantes à l'équipe ScummVM ainsi que le "
+"nom"
#: engines/advancedDetector.cpp:299
msgid "of the game you tried to add and its version/language/etc.:"
-msgstr ""
+msgstr "du jeu que vous avez essayé d'ajouter, sa version, le langage, etc..."
#: engines/dialogs.cpp:84
msgid "~R~esume"
@@ -1164,17 +1160,17 @@ msgid "~R~eturn to Launcher"
msgstr "Retour au ~L~anceur"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Sauvegarde:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Sauver"
@@ -1184,40 +1180,41 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
+"Désolé, il n'y a pas d'aide disponible dans ce jeu actuellement. Lisez le "
+"fichier README pour les informations de base et les instructions pour "
+"obtenir de l'aide supplémentaire."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~A~nnuler"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~ouches"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
-msgstr ""
+msgstr "Impossible d'initialiser le format des couleurs."
-#: engines/engine.cpp:228
-#, fuzzy
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
-msgstr "Mode vidéo actuel"
+msgstr "Impossible de changer le mode vidéo à: '"
-#: engines/engine.cpp:237
-#, fuzzy
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
-msgstr "Changer correction du rapport d'aspect"
+msgstr "Impossible d'appliquer la correction du rapport d'aspect."
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
-msgstr ""
+msgstr "Impossible d'appliquer l'option plein écran."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1225,8 +1222,13 @@ msgid ""
"the data files to your hard disk instead.\n"
"See the README file for details."
msgstr ""
+"Il semble que vous essayez de jouez directement\n"
+"depuis le CD. Cela peut occasionner des problèmes\n"
+"et il est donc recommandé de copier les fichier de\n"
+"données du jeu sur votre disque dur.\n"
+"Lisez le fichier README pour plus de détails."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1234,31 +1236,140 @@ msgid ""
"order to listen to the game's music.\n"
"See the README file for details."
msgstr ""
+"Ce jeu possède des pistes audio sur le CD. Pour\n"
+"profiter de la musique, ces pistes doivent être\n"
+"extraite du CD et réencodée en utilisant un\n"
+"logiciel approprié.\n"
+"Lisez le fichier README pour plus de détails."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"Attention:le jeu que vous vous apprêtez à jouer n'est pas encore "
+"complètement supporté par ScummVM. Il est donc instable et les sauvegardes "
+"peuvent ne pas marcher avec une future version de ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "Jouer quand même"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Insérer le Disque %c et appuyer sur le Bouton pour Continuer."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "Impossible de trouver %s, (%c%d) Appuyer sur le Bouton."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Erreur lors de la lecture du disque %c, (%c%d). Appuyer sur le Bouton."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Jeu en pause. Appuyer sur Espace pour Reprendre."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Voulez-vous vraiment recommencer? (O/N)O"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Voulez-vous vraiment quitter? (O/N)O"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Jouer"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Quitter"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Insérer le disque de sauvegarde/chargement"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Vous devez entrer un nom"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "Le jeu n'a pu être sauvé (disque plein?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "Le jeu n'a pu être chargé"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "Sauvegarde de '%s'"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "Chargement de '%s'"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "Donnez un nom à votre sauvegarde"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Sélectionnez un jeu à charger"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "Nom du jeu)"
-#: engines/scumm/dialogs.cpp:281
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~P~récédent"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~S~uivant"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~F~ermer"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Voix"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Voix et Sous-titres"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Sous-titres"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Voix & ST"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Commandes clavier communes:"
@@ -1309,14 +1420,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Écrire sauvegarde 1-10:"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Quitter"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Entrer"
@@ -1398,9 +1501,8 @@ msgid " since they may cause crashes"
msgstr " elle peut causer des plantages ou"
#: engines/scumm/help.cpp:110
-#, fuzzy
msgid " or incorrect game behavior."
-msgstr " un comportement incorrect du jeu"
+msgstr " ou comportement incorrect du jeu."
#: engines/scumm/help.cpp:114
msgid "Spinning drafts on the keyboard:"
@@ -1421,14 +1523,14 @@ msgid "Pull"
msgstr "Tirer"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Donner"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Ouvrir"
@@ -1441,9 +1543,9 @@ msgid "Get"
msgstr "Prendre"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Utiliser"
@@ -1466,13 +1568,13 @@ msgid "Turn off"
msgstr "Éteindre"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Aller"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Prendre"
@@ -1500,11 +1602,11 @@ msgstr "Réparer"
msgid "Switch"
msgstr "Commuter"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Regarder"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Parler"
@@ -1516,277 +1618,281 @@ msgstr "Voyager"
msgid "To Henry / To Indy"
msgstr "Henry / Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "jouer Do mineur sur la quenouille"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "jouer Ré sur la quenouille"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "jouer Mi sur la quenouille"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "jouer Fa sur la quenouille"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "jouer Sol sur la quenouille"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "jouer La sur la quenouille"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "jouer Si sur la quenouille"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "jouer Do Majeur sur la quenouille"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Pousser"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Tirer"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Parler à"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Regarder"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Allumer"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Éteindre"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Touche Haut"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Sélectionner le dialogue précédent"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Touche Bas"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Sélectionner le dialogue suivant"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Marcher"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventaire"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objet"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Noir et Blanc / Couleur"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Yeux"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Langue"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Frapper"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Coup de pied"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Examiner"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Curseur normal"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Sauvegarder / Charger / Options"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Autres controles du jeu:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventaires:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Faire défiler vers le haut"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Faire défiler vers le bas"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Élément en haut à gauche"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Élément en bas à gauche"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Élément en haut à droite"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Élément en bas à droite"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Élément au milieu à gauche"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Élément au milieu à droite"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Changer de personnage"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Second enfant"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Troisième enfant"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Controles de combat (pavet numérique):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Pas en arrière"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Bloquer haut"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Bloquer milieu"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Bloquer bas"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Fraper haut"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Frapper milieu"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Frapper bas"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Correct quand Indy est à gauche."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Quand Indy est à droite, 7, 4 et 1"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "sont interverties avec 9, 6 et 3"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "respectivement."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Controles du biplane (paver numérique):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Voler vers le haut à gauche"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Voler vers la gauche"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Voler vers le bas à gauche"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Voler vers le haut"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Voler tout droit"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Voler vers le bas"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Voler vers le haut à droite"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Voler vers la droite"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Voler vers la bas à droite"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
+"Support MIDI natif requière la mise à jour Roland de LucasArt,\n"
+"mais %s manque. Utilise AdLib à la place."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1797,7 +1903,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1808,7 +1914,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1819,7 +1925,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1830,71 +1936,61 @@ msgstr ""
"choisissez 'Ajouter...' dans le Lanceur de ScummVM et sélectionnez le "
"répertoire 'Maniac Mansion' dans le répertoire du jeu Day Of The Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "Mode ~Z~ip Activé"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
-msgstr "T~r~ansitions activé"
+msgstr "T~r~ansitions activées"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "~L~acher la Page"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "Afficher la Carte"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enu Principal"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~E~ffets de l'Eau Activés"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Charger le jeu:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Charger"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
-msgstr ""
+msgstr "Fichier de séquence '%s' non trouvé!"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
-#, fuzzy
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
-msgstr ""
-"Échec du chargement de l'état du jeu depuis le fichier:\n"
-"\n"
-"%s"
+msgstr "Échec du chargement de l'état du jeu depuis le disque."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
-#, fuzzy
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
-msgstr ""
-"Échec de l'enregistrement de l'état du jeu dans le fichier:\n"
-"\n"
-"%s"
+msgstr "Échec de l'enregistrement de l'état du jeu sur le disque."
#: engines/gob/inter_v5.cpp:107
-#, fuzzy
msgid "Failed to delete file."
-msgstr ""
-"Échec de l'enregistrement de l'état du jeu dans le fichier:\n"
-"\n"
-"%s"
+msgstr "Échec de la suppression du fichier."
-#: engines/groovie/script.cpp:417
-#, fuzzy
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
-msgstr ""
-"Échec de l'enregistrement de l'état du jeu dans le fichier:\n"
-"\n"
-"%s"
+msgstr "Échec de la sauvegarde."
#: engines/kyra/sound_midi.cpp:475
msgid ""
@@ -1904,36 +2000,46 @@ msgid ""
"General MIDI ones. After all it might happen\n"
"that a few tracks will not be correctly played."
msgstr ""
+"Il semble que vous utilisiez un périphérique General MIDI,\n"
+"mais ce jeu ne support que le MIDI Roland MT32.\n"
+"Nous essayons d'associer les instruments Roland MT32 auxinstruments General "
+"MIDI. Mais il est possible que quelquespistes ne soient pas jouées "
+"correctement."
#: engines/m4/m4_menus.cpp:138
-#, fuzzy
msgid "Save game failed!"
-msgstr "Sauvegarde:"
+msgstr "Échec de la sauvegarde!"
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
"Please download it from www.scummvm.org"
msgstr ""
+"Fichier \"sky.cpt\" manquant\n"
+"Vous pouvez le télécharger sur www.scummvm.org"
#: engines/sky/compact.cpp:141
msgid ""
"The \"sky.cpt\" file has an incorrect size.\n"
"Please (re)download it from www.scummvm.org"
msgstr ""
+"Le fichier \"sky.cpt\" a une taille incorrecte.\n"
+"Vous pouvez le (re)télécharger sur www.scummvm.org"
#: engines/sword1/animation.cpp:344 engines/sword2/animation.cpp:379
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
+"Les séquences DXA sont présente mais ScummVM a été compilé sans le support "
+"zlib."
#: engines/sword1/animation.cpp:354 engines/sword2/animation.cpp:389
msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
+msgstr "Les séquences MPEG2 ne sont plus supportées"
#: engines/sword1/animation.cpp:359 engines/sword2/animation.cpp:397
#, c-format
msgid "Cutscene '%s' not found"
-msgstr ""
+msgstr "Séquence '%s' non trouvé"
#: engines/sword1/control.cpp:863
msgid ""
@@ -1945,6 +2051,13 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
+"ScummVM a trouvé des anciens fichiers de sauvegarde pour Broken Sword 1 qui "
+"ont besoin d'être convertis.\n"
+"L'ancien format de sauvegarde n'est plus supporté, donc vous ne pourrez pas "
+"les charger si vous ne les convertissez pas.\n"
+"\n"
+"Appuyer sur OK pour les convertir maintenant, sinon le même message "
+"s'affichera la prochaine fois que vous démarrerez le jeu.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -1952,18 +2065,20 @@ msgid ""
"Target new save game already exists!\n"
"Would you like to keep the old save game (%s) or the new one (%s)?\n"
msgstr ""
+"La sauvegarde cible existe déjà!\n"
+"Voulez-vous conserver l'ancienne sauvegarde (%s) ou la nouvelle (%s)?\n"
#: engines/sword1/control.cpp:1235
msgid "Keep the old one"
-msgstr ""
+msgstr "Garde l'ancienne"
#: engines/sword1/control.cpp:1235
msgid "Keep the new one"
-msgstr ""
+msgstr "Garder la nouvelle"
#: engines/sword1/logic.cpp:1633
msgid "This is the end of the Broken Sword 1 Demo"
-msgstr ""
+msgstr "C'est la fin de la démo des Chevaliers de Baphomet"
#: engines/parallaction/saveload.cpp:133
#, c-format
@@ -1971,16 +2086,16 @@ msgid ""
"Can't save game in slot %i\n"
"\n"
msgstr ""
+"Erreur lors de la sauvegarde dans l'emplacement %i\n"
+"\n"
#: engines/parallaction/saveload.cpp:211
-#, fuzzy
msgid "Loading game..."
-msgstr "Charger le jeu:"
+msgstr "Chargement en cours..."
#: engines/parallaction/saveload.cpp:226
-#, fuzzy
msgid "Saving game..."
-msgstr "Sauvegarde:"
+msgstr "Sauvegarde en cours..."
#: engines/parallaction/saveload.cpp:279
msgid ""
@@ -1991,10 +2106,17 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
+"ScummVM a trouvé des anciens fichiers de sauvegarde pour Nippon Safes qui "
+"ont besoin d'être convertis.\n"
+"L'ancien format de sauvegarde n'est plus supporté, donc vous ne pourrez pas "
+"les charger si vous ne les convertissez pas.\n"
+"\n"
+"Appuyer sur OK pour les convertir maintenant, sinon le même message "
+"s'affichera la prochaine fois que vous démarrerez le jeu.\n"
#: engines/parallaction/saveload.cpp:326
msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
+msgstr "ScummVM a converti avec succès vos anciennes sauvegardes."
#: engines/parallaction/saveload.cpp:328
msgid ""
@@ -2003,6 +2125,8 @@ msgid ""
"\n"
"Please report to the team."
msgstr ""
+"ScummVM a affiché des messages d'avertissements dans votre fenêtre de "
+"console et ne peut pas garantir que tous les fichiers ont été convertis."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2012,33 +2136,46 @@ msgstr "Émulateur MAME OPL"
msgid "DOSBox OPL emulator"
msgstr "Émulateur DOSBox OPL"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"Le périphérique audio sélectionné '%s' n'a pas été trouvé (il est peut-être "
+"éteint ou débranché)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "Essaye d'utiliser le prochain périphérique disponible..."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"The selected audio device '%s' ne peut pas être utilisé. Voir le fichier de "
+"log pour plus de détails."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"Le périphérique audio préféré '%s' n'a pas été trouvé (il est peut-être "
+"éteint ou débranché)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"Le périphérique audio préféré '%s' ne peut pas être utilisé. Voir le fichier "
+"de log pour plus de détails."
#: audio/null.h:43
msgid "No music"
@@ -2061,7 +2198,6 @@ msgid "C64 Audio Emulator"
msgstr "Émulateur C64 Audio"
#: audio/softsynth/mt32.cpp:329
-#, fuzzy
msgid "Initializing MT-32 Emulator"
msgstr "Initialisation de l'Émulateur MT-32"
@@ -2170,14 +2306,12 @@ msgid "Disable power off"
msgstr "Désactivé l'extinction"
#: backends/platform/iphone/osys_events.cpp:338
-#, fuzzy
msgid "Mouse-click-and-drag mode enabled."
-msgstr "Mode touchpad activé"
+msgstr "Mode souris-cliquer-et-déplacer activé"
#: backends/platform/iphone/osys_events.cpp:340
-#, fuzzy
msgid "Mouse-click-and-drag mode disabled."
-msgstr "Mode touchpad désactivé"
+msgstr "Mode souris-cliquer-et-déplacer désactivé"
#: backends/platform/iphone/osys_events.cpp:351
msgid "Touchpad mode enabled."
@@ -2187,6 +2321,27 @@ msgstr "Mode touchpad activé"
msgid "Touchpad mode disabled."
msgstr "Mode touchpad désactivé"
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "Cacher ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Masquer les Autres"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Tout Afficher"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Fenêtre"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Minimiser"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (échelle d'origine)"
@@ -2196,57 +2351,52 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
-msgstr "Changer correction du rapport d'aspect"
+msgstr "Activer la correction du rapport d'aspect"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
-msgstr "Changer correction du rapport d'aspect"
+msgstr "Désactiver la correction du rapport d'aspect"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
-msgstr "Changer de filtre graphique"
+msgstr "Mode graphique actif:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
-msgstr "Mode de rendu:"
+msgstr "Mode Fenêtre"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Préserve"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Originel"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
-#, fuzzy
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
msgstr "Mode vidéo actuel"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
-msgstr ""
+msgstr "Échelle actuelle"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
-msgstr ""
+msgstr "Filtre actif: Linéaire"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
-msgstr ""
+msgstr "Filtre actif: Plus proche"
#: backends/platform/symbian/src/SymbianActions.cpp:38
#: backends/platform/wince/CEActionsSmartphone.cpp:39
@@ -2271,11 +2421,13 @@ msgstr "Droite"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Clic Gauche"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Clic Droit"
@@ -2439,17 +2591,15 @@ msgid "Network down"
msgstr "Réseau déconnecté"
#: backends/platform/wii/options.cpp:178
-#, fuzzy
msgid "Initializing network"
msgstr "Initialisation du réseau"
#: backends/platform/wii/options.cpp:182
-#, fuzzy
msgid "Timeout while initializing network"
msgstr "Dépassement du délai lors de l'initialisation du réseau"
#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
+#, c-format
msgid "Network not initialized (%d)"
msgstr "Réseau non initialisé (%d)"
@@ -2506,13 +2656,13 @@ msgstr "Gauche"
msgid "Cursor Right"
msgstr "Droit"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Voulez-vous charger ou enregistrer le jeu?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr "Voulez-vous vraiment quitter?"
@@ -2524,47 +2674,47 @@ msgstr "Clavier"
msgid "Rotate"
msgstr "Pivoter"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Utilise le pilote SDL"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Affichage"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Voulez-vous exécuter une recherche automatique?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Affecter l'action 'Clic Droit'"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Vous devez affecter une touche à l'action de 'Clic Droit' pour pouvoir jouer "
"à ce jeu"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Affecter l'action 'Cacher Bar d'Outils'"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Vous devez affecter une touche à l'action 'Cacher Bar d'Outils' pour pouvoir "
"jouer à ce jeu"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Affecter l'action 'Dézoomer' (optionnelle)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Affecter l'action 'Zoomer' (optionnelle)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2572,55 +2722,93 @@ msgstr ""
"pouvoir voir entièrement l'inventaire"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Do you really want to return to the Launcher?"
-msgstr "Voulez-vous vraiment supprimer cette sauvegarde?"
+msgstr "Voulez-vous vraiment retourner au Lanceur?"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Launcher"
-msgstr "Frapper"
+msgstr "Lanceur"
#: backends/events/default/default-events.cpp:244
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "Voulez-vous quitter?"
+msgstr "Voulez-vous vraiment quitter?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
+msgstr "Touchscreen 'Tap Mode' - Clic Gauche"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
+msgstr "Touchscreen 'Tap Mode' - Clic Droit"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
+msgstr "Touchscreen 'Tap Mode' - Déplacer sans cliquer"
-#: backends/events/gph/gph-events.cpp:390
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
-msgstr "Volume"
+msgstr "Volume Maximum"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
-msgstr ""
+msgstr "Augmentation Volume"
-#: backends/events/gph/gph-events.cpp:398
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
-msgstr "Volume"
+msgstr "Volume Minimum"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
-msgstr ""
+msgstr "Diminution Volume"
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Recherche des mises à jour..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "Simple Clic Droit"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "Déplacer Uniquement"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "Touche d'échappement"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "Menu du Jeu"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "Afficher le clavier"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "Contrôles la Souris"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "Clic Activé"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "Clic Désactivé"
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Ajouter..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Ajouter..."
#~ msgid "Discovered %d new games."
#~ msgstr "%d nouveaux jeux trouvés."
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 4663df0ded..57a7a5acc0 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-06-21 09:54+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-06 11:24+0100\n"
"Last-Translator: Gruby <grubycza@hotmail.com>\n"
"Language-Team: Hungarian\n"
+"Language: Magyar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Magyar\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Poedit-Language: Hungarian\n"
"X-Poedit-Country: HUNGARY\n"
@@ -47,10 +47,11 @@ msgid "Go up"
msgstr "Feljebb"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -60,22 +61,22 @@ msgstr "Mégse"
msgid "Choose"
msgstr "Választ"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Bezár"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Egérkattintás"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Billentyûzet beállítások"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Billentyûk átállítása"
@@ -88,16 +89,17 @@ msgid "Map"
msgstr "Kiosztás"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -165,7 +167,7 @@ msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
-"A játék nyelve. Ne állítsd át a pl. Spanyol nyelvû játékodat Angolra nyelvre"
+"A játék nyelve. Ne állítsd át a pl. Spanyol nyelvû játékodat Angol nyelvre"
#: gui/launcher.cpp:184 gui/launcher.cpp:198 gui/options.cpp:74
#: gui/options.cpp:708 gui/options.cpp:718 gui/options.cpp:1149
@@ -343,7 +345,7 @@ msgstr "Ez a játékazonosító ID már foglalt, Válassz egy másikat."
msgid "~Q~uit"
msgstr "Kilépés"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "ScummVM bezárása"
@@ -351,7 +353,7 @@ msgstr "ScummVM bezárása"
msgid "A~b~out..."
msgstr "Névjegy"
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "ScummVM névjegy"
@@ -379,7 +381,7 @@ msgstr "Betöltés"
msgid "Load savegame for selected game"
msgstr "Kimentett játékállás betöltése"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "Játék hozzáadás"
@@ -403,7 +405,7 @@ msgstr "Játék törlése"
msgid "Remove game from the list. The game data files stay intact"
msgstr "Törli a játék nevét a listáról. A játékfájlok megmaradnak"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "Játék hozzáadás"
@@ -431,14 +433,14 @@ msgid "Clear value"
msgstr "Érték törlése"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Játék betöltése:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Betöltés"
@@ -452,17 +454,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Igen"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Nem"
@@ -500,34 +502,25 @@ msgstr "Masszív mód..."
msgid "Mass Add..."
msgstr "Masszív mód..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Játék hozzáadás"
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Játék hozzáadás"
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... folyamatban ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Vizsgálat kész!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "%d új játékot találtam, %d elõzõleg hozzáadott játék kihagyva..."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d Mappa átvizsgálva..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "%d új játékot találtam, %d elõzõleg hozzáadott játék kihagyva..."
@@ -607,8 +600,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Néhány játék támogatja a speciális árnyalási módokat"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Teljesképernyõs mód:"
@@ -946,19 +939,19 @@ msgstr "Töröl"
msgid "Do you really want to delete this savegame?"
msgstr "Biztos hogy törölni akarod ezt a játékállást?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Dátum:"
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Idõ:"
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Játékidõ:"
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Névtelen játékállás"
@@ -966,60 +959,60 @@ msgstr "Névtelen játékállás"
msgid "Select a Theme"
msgstr "Válassz témát"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "GFX letiltva"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX letiltva"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standard leképezõ (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Élsimításos leképezõ (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Élsimított (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "A motor nem támogatja a '%s' debug szintet"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menü"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Tovább"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Szünet"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Sor átlépése"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Hiba a játék futtatásakor:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Nem található olyan játékmotor ami a választott játékot támogatja"
@@ -1087,20 +1080,21 @@ msgstr "Felhasználói megszakítás"
msgid "Unknown error"
msgstr "Ismeretlen hiba"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules Zöld"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules Sárga"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules Zöld"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules Sárga"
@@ -1152,17 +1146,17 @@ msgid "~R~eturn to Launcher"
msgstr "Visszatérés az indítóba"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Játék mentése:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Mentés"
@@ -1175,37 +1169,37 @@ msgstr ""
"Sajnálom, a motor jelenleg nem tartalmaz játék közbeni súgót. Olvassd el a "
"README-t az alap információkról, és hogy hogyan segíthetsz a késõbbiekben."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "Mégse"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "Billentyük"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr "Szín formátum nincs alkalmazva"
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
msgstr "Videómód nincs átállítva: ' "
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
msgstr "Méretarány korrekció nem változott."
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr "Teljesképernyõs beállítás nincs alkalmazva"
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1219,7 +1213,7 @@ msgstr ""
"adatfájljait a merevlemezedre.\n"
"Nézd meg a README fájlt a részletekért."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1233,7 +1227,7 @@ msgstr ""
"hogy a játék zenéje hallható legyen.\n"
"Nézd meg a README fájlt a részletekért."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1243,23 +1237,124 @@ msgstr ""
"ScummVM. Számíts rá hogy nem stabilan fut, és a mentések nem mûködnek a "
"jövõbeni ScummVM verziókkal."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
msgstr "Indítás így is"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Helyezd be a %c lemezt és gombnyomás a folytatáshoz."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "%s, (%c%d) nem található. Nyomj egy billentyût."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Hiba a %c, (%c%d) lemez olvasásakor. Nyomj egy billentyût."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Játék szünetel. SPACE a folytatáshoz."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Biztos hogy újra akarod indítani? (Y/N)"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Biztos hogy ki akarsz lépni? (Y/N)"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Játék"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Kilépés"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Helyezd be a játékmentés lemezt"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Meg kell adnod egy nevet"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "A játék NINCS mentve (Megtelt a lemez?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "A játék NINCS betöltve"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "'%s' Mentése"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "'%s' Betöltése"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "JátékMENTÉS neve"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Válassz egy játékot Betöltésre"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "Játék címe)"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "Elõzõ"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "Következõ"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "Bezár"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Csak beszéd"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Beszéd és felirat"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Csak felirat"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Beszéd & Felir"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Általános billentyûparancsok:"
@@ -1310,14 +1405,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "1-10 Játékállás mentése"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Kilépés"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1421,14 +1508,14 @@ msgid "Pull"
msgstr "Húz"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Ad"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Nyit"
@@ -1441,9 +1528,9 @@ msgid "Get"
msgstr "Vesz"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Használ"
@@ -1466,13 +1553,13 @@ msgid "Turn off"
msgstr "Kikapcsol"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Odamegy"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Felvesz"
@@ -1500,11 +1587,11 @@ msgstr "Javít"
msgid "Switch"
msgstr "Kapcsol"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Megnéz"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Beszél"
@@ -1516,270 +1603,272 @@ msgstr "Utazás"
msgid "To Henry / To Indy"
msgstr "Henrytõl / Indytõl"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "C moll játék a bottal"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "Játék D-ben a bottal"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "Játék E-ben a bottal"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "Játék F-ben a bottal"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "Játék G-ben a bottal"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "Játék A-ban a bottal"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "Játék B-ben a bottal"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "C dúr játék a bottal"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Megtol"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "húz (Ránt)"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Beszél"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Megnézi"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Bekapcsol"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Kikapcsol"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "FelGomb"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Elõzõ dialógus kiemelése"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "LeGomb"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Következõ dialógus kiemelése"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Megy"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Tárgylista"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Tárgy"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Fekete fehér / Színes"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Szemek"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Nyelv"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Megüt"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Megüt"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Vizsgál"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Szabvány kurzor"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Ment / Tölt / Opciók"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Egyébb játékvezérlõk:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Tárgylista:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Listagörgetés fel"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Listagörgetés le"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Bal felsõ tárgy"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Bal alsó tárgy"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Jobb felsõ tárgy"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Jobb alsó tárgy"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Bal középsõ tárgy"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Jobb középsõ tárgy"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Karakterek cseréje:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Második gyerek"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Harmadik gyerek"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Verekedés irányítók (numpad):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Hátralép"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Felsõ védés"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Védés középen"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Alsó védés"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Felsõ ütés"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Ütés középen"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Alsó ütés"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Indytõl balra levõ."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Indytõl jobbra levõ,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4, és 1 átkapcsolva"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6, és 3-ra, egyenként."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Repülõ vezérlõk (numpad):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Balra fel repülés"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Balra repülés"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Balra le repülés"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Repülés fel"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Repülés elõre"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Repülés le"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Jobbra fel repülés"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Jobbra repülés"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Jobbra le repülés"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -1788,7 +1877,7 @@ msgstr ""
"Native MIDI támogatáshoz kell a Roland Upgrade a LucasArts-tól,\n"
"a %s hiányzik. AdLib-ot használok helyette."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1799,7 +1888,7 @@ msgstr ""
"\n"
"%s fájlba nem sikerült"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1810,7 +1899,7 @@ msgstr ""
"\n"
"%s fájlból nem sikerült"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1821,7 +1910,7 @@ msgstr ""
"\n"
"%s fájlba elkészült"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1831,45 +1920,51 @@ msgstr ""
"játszani akarsz vele menj a ScummVM fõmenüben a 'Játék hozzáadás' ra és "
"válaszd a 'Maniac' mappát a 'Tentacle' könyvtárában."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "~Z~ip Mód aktiválva"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "Átmenetek engedélyezve"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr "Oldal~D~obás"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr "~S~ Térkép"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Fõ~M~enü"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "Vízeffektus engedélyezve"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Játékmenet visszaállítása:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Visszaállítás"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr "'%s' átvezetõ fájl nem található"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
msgstr "Játékállás betöltése fájlból nem sikerült."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
msgstr "Játékállás mentése fájlba nem sikerült."
@@ -1877,7 +1972,7 @@ msgstr "Játékállás mentése fájlba nem sikerült."
msgid "Failed to delete file."
msgstr "Fájl törlés sikertelen."
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
msgstr "Játék mentés nem sikerült"
@@ -2024,41 +2119,44 @@ msgstr "MAME OPL emulátor"
msgid "DOSBox OPL emulator"
msgstr "DOSBox OPL emulátor"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-"A kiválasztott '%s' hangeszköz nem található. (Lekapcsoltad, vagy kihúztad). "
-"A következõ elérhetõ eszköz keresése..."
+"A kiválasztott '%s' hangeszköz nem található (Lekapcsoltad, vagy kihúztad)."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "A következõ elérhetõ eszköz keresése..."
+
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
"A kiválasztott '%s' hangeszköz nem használható. Bõvebb információ a "
-"naplófájlban. A következõ elérhetõ eszköz keresése..."
+"naplófájlban."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-"Az elsõdleges '%s' hangeszköz nem található. (Lekapcsoltad, vagy kihúztad). "
-"A következõ elérhetõ eszköz keresése..."
+"Az elsõdleges '%s' hangeszköz nem található (Lekapcsoltad, vagy kihúztad)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
"Az elsõdleges '%s' hangeszköz nem használható. Bõvebb információ a "
-"naplófájlban. A következõ elérhetõ eszköz keresése..."
+"naplófájlban."
#: audio/null.h:43
msgid "No music"
@@ -2204,6 +2302,27 @@ msgstr "Touchpad mód engedélyezve."
msgid "Touchpad mode disabled."
msgstr "Touchpad mód letiltva."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "ScummVM elrejtése"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Többi elrejtése"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Mutasd mind"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Ablak"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Kis méret"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normál (nincs átméretezés)"
@@ -2213,50 +2332,50 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normál (nincs átméretezés)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
msgstr "Méretarány korrekció engedélyezve"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
msgstr "Méretarány korrekció letiltva"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
msgstr "Aktív grafikus szûrõk:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
msgstr "Ablakos mód"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normál"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Megtartott"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Eredeti"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
msgstr "Jelenlegi videómód"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr "Aktuális méretezés"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr "Aktív filter mód: Lineáris"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr "Aktív filter mód: Közelítõ"
@@ -2283,11 +2402,13 @@ msgstr "Jobb"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Bal katt"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Jobb katt"
@@ -2516,13 +2637,13 @@ msgstr "Kurzor Bal"
msgid "Cursor Right"
msgstr "Kurzor Jobb"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Játékállás betöltése vagy mentése?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Biztos hogy ki akarsz lépni ? "
@@ -2534,43 +2655,43 @@ msgstr "Billentyûzet"
msgid "Rotate"
msgstr "Forgatás"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "SDL meghajtó használata"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Kijelzõ"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "El akarod kezdeni az automatikus vizsgálatot ?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Jobbkatt mûvelet gomb"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr "Válassz egy billentyût a 'Jobbkatt' mûvelethez"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Eszköztár rejtés gomb"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr "Válassz egy billentyût az 'Eszköztár rejtés' mûvelethez"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Nagyítás mûvelet (opcionális)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Kicsinyítés mûvelet (opcionális)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2589,40 +2710,83 @@ msgstr "Indítópult"
msgid "Do you really want to quit?"
msgstr "Biztos hogy ki akarsz lépni ?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr "Érintõképernyõ 'Tap Mód' - Bal katt"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr "Érintõképernyõ 'Tap Mód' - Jobb katt"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr "Érintõképernyõ 'Tap Mód' - Lebegõ (Nincs katt)"
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
msgstr "Maximum Hangerõ"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr "Hangerõ növelése"
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
msgstr "Minimum Hangerõ"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr "Hangerõ csökkentése"
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Frissítések keresése..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "Jobb katt egyszer"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "Csak lépés"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "Escape gomb"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "Játék Menü"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "Kézi billentyûzet"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "Egér irányitás"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "Kattintás engedve"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "Kattintás tiltva"
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Játék hozzáadás"
+
+#~ msgid "Add Game..."
+#~ msgstr "Játék hozzáadás"
+
#~ msgid ""
#~ "Your game version has been detected using filename matching as a variant "
#~ "of %s."
diff --git a/po/it_IT.po b/po/it_IT.po
index 1386e41973..2bfa8c0c16 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-04-24 14:46+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-08 17:29+0100\n"
"Last-Translator: Matteo 'Maff' Angelino <matteo.maff at gmail dot com>\n"
"Language-Team: Italian\n"
+"Language: Italiano\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Italiano\n"
#: gui/about.cpp:91
#, c-format
@@ -43,10 +43,11 @@ msgid "Go up"
msgstr "Su"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -56,22 +57,22 @@ msgstr "Annulla"
msgid "Choose"
msgstr "Scegli"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Chiudi"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Clic del mouse"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Mostra tastiera"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Riprogramma tasti"
@@ -84,16 +85,17 @@ msgid "Map"
msgstr "Mappa"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -340,7 +342,7 @@ msgstr "Questo ID di gioco è già in uso. Si prega di sceglierne un'altro."
msgid "~Q~uit"
msgstr "C~h~iudi"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Chiudi ScummVM"
@@ -348,7 +350,7 @@ msgstr "Chiudi ScummVM"
msgid "A~b~out..."
msgstr "~I~nfo..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Informazioni su ScummVM"
@@ -376,7 +378,7 @@ msgstr "~C~arica..."
msgid "Load savegame for selected game"
msgstr "Carica un salvataggio del gioco selezionato"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~A~ggiungi gioco..."
@@ -400,7 +402,7 @@ msgstr "~R~imuovi gioco"
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:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~gg. gioco..."
@@ -428,14 +430,14 @@ msgid "Clear value"
msgstr "Cancella"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Carica gioco:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Carica"
@@ -449,17 +451,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Sì"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "No"
@@ -500,37 +502,28 @@ msgstr "Agg. massa..."
msgid "Mass Add..."
msgstr "Agg. in massa..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Agg. gioco..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Aggiungi gioco..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... progresso ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Scansione completa!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
-msgstr ""
+msgstr "Rilevati %d nuovi giochi, ignorati %d giochi aggiunti in precedenza."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d cartelle analizzate..."
-#: gui/massadd.cpp:253
-#, fuzzy, c-format
+#: gui/massadd.cpp:268
+#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "Rilevati %d nuovi giochi..."
+msgstr "Rilevati %d nuovi giochi, ignorati %d giochi aggiunti in precedenza..."
#: gui/options.cpp:72
msgid "Never"
@@ -580,19 +573,19 @@ msgstr "Nessuno"
#: gui/options.cpp:372
msgid "Failed to apply some of the graphic options changes:"
-msgstr ""
+msgstr "Impossibile applicare alcuni dei cambiamenti nelle opzioni grafiche."
#: gui/options.cpp:384
msgid "the video mode could not be changed."
-msgstr ""
+msgstr "impossibile modificare la modalità video."
#: gui/options.cpp:390
msgid "the fullscreen setting could not be changed"
-msgstr ""
+msgstr "impossibile modificare l'impostazione schermo intero"
#: gui/options.cpp:396
msgid "the aspect ratio setting could not be changed"
-msgstr ""
+msgstr "impossibile modificare l'impostazione proporzioni"
#: gui/options.cpp:705
msgid "Graphics mode:"
@@ -607,8 +600,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Modalità di resa grafica speciali supportate da alcuni giochi"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Modalità a schermo intero"
@@ -901,7 +894,6 @@ msgid "Language of ScummVM GUI"
msgstr "Lingua dell'interfaccia grafica di ScummVM"
#: gui/options.cpp:1295
-#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto."
@@ -953,19 +945,19 @@ msgstr "Elimina"
msgid "Do you really want to delete this savegame?"
msgstr "Sei sicuro di voler eliminare questo salvataggio?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Data: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Ora: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Tempo di gioco: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Salvataggio senza titolo"
@@ -973,60 +965,60 @@ msgstr "Salvataggio senza titolo"
msgid "Select a Theme"
msgstr "Seleziona un tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "Grafica disattivata"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Grafica disattivata"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Renderer standard (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Renderer con antialiasing (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Con antialiasing (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Il motore non supporta il livello di debug '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Salta"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausa"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Salta battuta"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Errore nell'esecuzione del gioco:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr ""
"Impossibile trovare un motore in grado di eseguire il gioco selezionato"
@@ -1089,26 +1081,27 @@ msgstr "Il plugin del motore non supporta i salvataggi"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "Utente cancellato"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "Errore sconosciuto"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules verde"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules ambra"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules verde"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules ambra"
@@ -1116,15 +1109,15 @@ msgstr "Hercules ambra"
#: engines/advancedDetector.cpp:296
#, c-format
msgid "The game in '%s' seems to be unknown."
-msgstr ""
+msgstr "Il gioco in '%s' sembra essere sconosciuto."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
-msgstr ""
+msgstr "Per favore, riporta i seguenti dati al team di ScummVM con il nome"
#: engines/advancedDetector.cpp:299
msgid "of the game you tried to add and its version/language/etc.:"
-msgstr ""
+msgstr "del gioco che hai provato ad aggiungere e la sua versione/lingua/ecc.:"
#: engines/dialogs.cpp:84
msgid "~R~esume"
@@ -1160,17 +1153,17 @@ msgid "~R~eturn to Launcher"
msgstr "~V~ai a elenco giochi"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Salva gioco:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Salva"
@@ -1180,40 +1173,41 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
+"Siamo spiacenti, ma l'attuale motore non prevede aiuto all'interno del "
+"gioco. Si prega di consultare il file README per le informazioni di base e "
+"per le istruzioni su come ottenere ulteriore assistenza."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~A~nnulla"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~asti"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
-msgstr ""
+msgstr "Impossibile inizializzare il formato colore."
-#: engines/engine.cpp:228
-#, fuzzy
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
-msgstr "Modalità video attuale:"
+msgstr "Impossibile cambiare la modalità video: '"
-#: engines/engine.cpp:237
-#, fuzzy
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
-msgstr "Cambia correzione proporzioni"
+msgstr "Impossibile applicare l'impostazione proporzioni"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
-msgstr ""
+msgstr "Impossibile applicare l'impostazione schermo intero."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1221,8 +1215,13 @@ msgid ""
"the data files to your hard disk instead.\n"
"See the README file for details."
msgstr ""
+"Sembra che tu stia giocando direttamente\n"
+"dal CD. È una tipica causa di problemi,\n"
+"ed è quindi consigliato copiare i file di gioco\n"
+"sull'hard disk.\n"
+"Vedi il file README per i dettagli."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1230,31 +1229,140 @@ msgid ""
"order to listen to the game's music.\n"
"See the README file for details."
msgstr ""
+"Questo gioco ha tracce audio sul CD. Tali\n"
+"tracce devono essere estratte dal disco con\n"
+"uno strumento appropriato per poter sentire\n"
+"la musica del gioco.\n"
+"Vedi il file README per i dettagli."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"ATTENZIONE: il gioco che stai avviando non è completamente supportato da "
+"ScummVM. È quindi possibile che sia instabile, e i salvataggi potrebbero non "
+"funzionare con future versioni di ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "Avvia comunque"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Inserisci il disco %c e premi un pulsante per continuare."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "Impossibile trovare %s, (%c%d) Premere un pulsante."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Errore nella lettura del disco %c, (%c%d) Premere un pulsante."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Gioco in pausa. Premere SPAZIO per continuare."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Sei sicuro di voler riavviare? (Y/N)"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Sei sicuro di voler uscire? (Y/N)"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Gioca"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Esci"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Inserire il disco dei salvataggi"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Devi inserire un nome"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "Il gioco NON è stato salvato (disco pieno?)"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "Il gioco NON è stato caricato"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "Salvataggio di '%s' in corso"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "Caricamento di '%s' in corso"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "Dai un nome al SALVATAGGIO"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Seleziona un gioco da caricare"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "titolo gioco)"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~P~recedenti"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~S~uccessivi"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~C~hiudi"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Solo voci"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Voci e testo"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Solo testo"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Voci e testo"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Comandi da tastiera comuni:"
@@ -1305,14 +1413,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Salva nella posizione 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Esci"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Invio"
@@ -1394,9 +1494,8 @@ msgid " since they may cause crashes"
msgstr " potrebbe causare blocchi o un"
#: engines/scumm/help.cpp:110
-#, fuzzy
msgid " or incorrect game behavior."
-msgstr " comportamento errato del gioco."
+msgstr " o comportamento errato del gioco."
#: engines/scumm/help.cpp:114
msgid "Spinning drafts on the keyboard:"
@@ -1417,14 +1516,14 @@ msgid "Pull"
msgstr "Tira"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Dai"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Apri"
@@ -1437,9 +1536,9 @@ msgid "Get"
msgstr "Prendi"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Usa"
@@ -1462,13 +1561,13 @@ msgid "Turn off"
msgstr "Spegni"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Cammina verso"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Raccogli"
@@ -1496,11 +1595,11 @@ msgstr "Ripara"
msgid "Switch"
msgstr "Sposta"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Guarda"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Parla"
@@ -1512,277 +1611,281 @@ msgstr "Viaggio"
msgid "To Henry / To Indy"
msgstr "A Henry / a Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "suona Do (C) minore sul bastone"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "suona Re (D) sul bastone"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "suona Mi (E) sul bastone"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "suona Fa (F) sul bastone"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "suona Sol (G) sul bastone"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "suona La (A) sul bastone"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "suona Si (B) sul bastone"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "suona Do (C) maggiore sul bastone"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Premi"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Tira"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Parla con"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Esamina"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Accendi"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Spegni"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Tasto su"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Evidenzia dialogo precedente"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Tasto giù"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Evidenzia dialogo successivo"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Cammina"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventario"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Oggetto"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Bianco e nero / colori"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Occhi"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Lingua"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Pugno"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Calcio"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Esamina"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Cursore normale"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Salva / Carica / Opzioni"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Altre opzioni di gioco:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventario:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Scorri lista verso l'alto"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Scorri lista verso il basso"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Oggetto in alto a sinistra"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Oggetto in basso a sinistra"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Oggetto in alto a destra"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Oggetto in basso a destra"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Oggetto al centro a sinistra"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Oggetto al centro a destra"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Cambio personaggio:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Secondo ragazzo"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Terzo ragazzo"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Controlli di combattimento (tastierino numerico):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Passo indietro"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Para in alto"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Para al centro"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Para in basso"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Colpisci in alto"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Colpisci al centro"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Colpisci in basso"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Questi sono i controlli quando"
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Indy è sulla sinistra. Quando è"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "sulla destra, 7, 4 e 1 sostituiscono"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "rispettivamente 9, 6 e 3."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Controlli biplano (tastierino numerico):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Vola in alto a sinistra"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Vola a sinistra"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Vola in basso a sinistra"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Vola in alto"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Vola diritto"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Vola in basso"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Vola in alto a destra"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Vola a destra"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Vola in basso a destra"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
+"Il supporto nativo MIDI richiede il Roland Upgrade della LucasArts,\n"
+"ma %s non è presente. Verrà usato AdLib."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1793,7 +1896,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1804,7 +1907,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1815,7 +1918,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1826,71 +1929,61 @@ msgstr ""
"principale di ScummVM e seleziona la cartella \"Maniac\" all'interno della "
"cartella di Day Of The Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "Modalità ~Z~ip attivata"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "~T~ransizioni attive"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "~L~ascia pagina"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "~M~ostra mappa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enu principale"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~E~ffetto acqua attivo"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Ripristina gioco:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Ripristina"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
-msgstr ""
+msgstr "File della scena di intermezzo '%s' non trovato!"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
-#, fuzzy
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
-msgstr ""
-"Impossibile caricare il gioco dal file:\n"
-"\n"
-"%s"
+msgstr "Impossibile caricare il gioco dal file."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
-#, fuzzy
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
-msgstr ""
-"Impossibile salvare il gioco nel file:\n"
-"\n"
-"%s"
+msgstr "Impossibile salvare il gioco nel file."
#: engines/gob/inter_v5.cpp:107
-#, fuzzy
msgid "Failed to delete file."
-msgstr ""
-"Impossibile salvare il gioco nel file:\n"
-"\n"
-"%s"
+msgstr "Impossibile eliminare il file."
-#: engines/groovie/script.cpp:417
-#, fuzzy
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
-msgstr ""
-"Impossibile salvare il gioco nel file:\n"
-"\n"
-"%s"
+msgstr "Impossibile salvare il gioco"
#: engines/kyra/sound_midi.cpp:475
msgid ""
@@ -1900,36 +1993,46 @@ msgid ""
"General MIDI ones. After all it might happen\n"
"that a few tracks will not be correctly played."
msgstr ""
+"Sembra che tu stia utilizzanto un dispositivo\n"
+"General MIDI, ma il gioco supporta solo Roland\n"
+"MT32 MIDI. Tenteremo di mappare gli strumenti\n"
+"Roland MT32 in quelli General MIDI. Alcune tracce\n"
+"potrebbero non essere riprodotte correttamente."
#: engines/m4/m4_menus.cpp:138
-#, fuzzy
msgid "Save game failed!"
-msgstr "Salva gioco:"
+msgstr "Salvataggio fallito!"
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
"Please download it from www.scummvm.org"
msgstr ""
+"Impossibile trovare il file \"sky.cpt\"!\n"
+"Si prega di scaricarlo da www.scummvm.org"
#: engines/sky/compact.cpp:141
msgid ""
"The \"sky.cpt\" file has an incorrect size.\n"
"Please (re)download it from www.scummvm.org"
msgstr ""
+"Il file \"sky.cpt\" non ha una dimensione corretta.\n"
+"Si prega di (ri)scaricarlo da www.scummvm.org"
#: engines/sword1/animation.cpp:344 engines/sword2/animation.cpp:379
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
+"Sono state trovare scene di intermezzo DXA ma ScummVM è stato compilato "
+"senza il supporto zlib"
#: engines/sword1/animation.cpp:354 engines/sword2/animation.cpp:389
msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
+msgstr "Le scene di intermezzo MPEG2 non sono più supportate"
#: engines/sword1/animation.cpp:359 engines/sword2/animation.cpp:397
#, c-format
msgid "Cutscene '%s' not found"
-msgstr ""
+msgstr "Scena di intermezzo '%s' non trovata"
#: engines/sword1/control.cpp:863
msgid ""
@@ -1941,6 +2044,13 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
+"ScummVM ha trovato vecchi salvataggi per Broken Sword 1 che dovrebbero "
+"essere convertiti.\n"
+"Il vecchio formato di salvataggio non è più supportato, quindi non potrai "
+"caricare i tuoi salvataggi senza prima convertirli.\n"
+"\n"
+"Premi OK per convertirli adesso, altrimenti ti verrà richiesto al prossimo "
+"avvio del gioco.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -1948,18 +2058,20 @@ msgid ""
"Target new save game already exists!\n"
"Would you like to keep the old save game (%s) or the new one (%s)?\n"
msgstr ""
+"La destinazione del nuovo salvataggio già esiste!\n"
+"Vuoi mantenere il vecchio salvataggio (%s) o quello nuovo (%s)?\n"
#: engines/sword1/control.cpp:1235
msgid "Keep the old one"
-msgstr ""
+msgstr "Mantieni quello vecchio"
#: engines/sword1/control.cpp:1235
msgid "Keep the new one"
-msgstr ""
+msgstr "Mantieni quello nuovo"
#: engines/sword1/logic.cpp:1633
msgid "This is the end of the Broken Sword 1 Demo"
-msgstr ""
+msgstr "Questa è la fine della demo di Broken Sword 1"
#: engines/parallaction/saveload.cpp:133
#, c-format
@@ -1967,16 +2079,16 @@ msgid ""
"Can't save game in slot %i\n"
"\n"
msgstr ""
+"Impossibile salvare nella posizione %i\n"
+"\n"
#: engines/parallaction/saveload.cpp:211
-#, fuzzy
msgid "Loading game..."
-msgstr "Carica gioco:"
+msgstr "Caricamento..."
#: engines/parallaction/saveload.cpp:226
-#, fuzzy
msgid "Saving game..."
-msgstr "Salva gioco:"
+msgstr "Salvataggio..."
#: engines/parallaction/saveload.cpp:279
msgid ""
@@ -1987,10 +2099,17 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
+"ScummVM ha trovato vecchi salvataggi per Nippon Safes che dovrebbero essere "
+"rinominati.\n"
+"I vecchi nomi non sono più supportati, quindi non potrai caricare i tuoi "
+"salvataggi senza prima convertirli.\n"
+"\n"
+"Premi OK per convertirli adesso, altrimenti ti verrà richiesto la prossima "
+"volta.\n"
#: engines/parallaction/saveload.cpp:326
msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
+msgstr "ScummVM ha convertito con successo tutti i tuoi salvataggi."
#: engines/parallaction/saveload.cpp:328
msgid ""
@@ -1999,6 +2118,10 @@ msgid ""
"\n"
"Please report to the team."
msgstr ""
+"ScummVM ha stampato alcuni avvisi nella finestra console e non può garantire "
+"l'avvenuta conversione di tutti i tuoi file.\n"
+"\n"
+"Per favore, contatta il team."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2008,33 +2131,46 @@ msgstr "Emulatore OPL MAME"
msgid "DOSBox OPL emulator"
msgstr "Emulatore OPL DOSBox"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"Il dispositivo audio selezionato '%s' non è stato trovato (potrebbe essere "
+"spento o scollegato)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "Tentativo di ripristinare il primo dispositivo disponibile..."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"Il dispositivo audio selezionato '%s' non può essere usato. Vedi il file log "
+"per maggiori informazioni."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"Il dispositivo audio preferito '%s' non è stato trovato (potrebbe essere "
+"spento o scollegato)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"Il dispositivo audio preferito '%s' non può essere usato. Vedi il file log "
+"per maggiori informazioni."
#: audio/null.h:43
msgid "No music"
@@ -2057,7 +2193,6 @@ msgid "C64 Audio Emulator"
msgstr "Emulatore audio C64"
#: audio/softsynth/mt32.cpp:329
-#, fuzzy
msgid "Initializing MT-32 Emulator"
msgstr "Avvio in corso dell'emulatore MT-32"
@@ -2166,14 +2301,12 @@ msgid "Disable power off"
msgstr "Disattiva spegnimento in chiusura"
#: backends/platform/iphone/osys_events.cpp:338
-#, fuzzy
msgid "Mouse-click-and-drag mode enabled."
-msgstr "Modalità touchpad attivata."
+msgstr "Modalità mouse-clicca-e-trascina attivata."
#: backends/platform/iphone/osys_events.cpp:340
-#, fuzzy
msgid "Mouse-click-and-drag mode disabled."
-msgstr "Modalità touchpad disattivata."
+msgstr "Modalità mouse-clicca-e-trascina disattivata."
#: backends/platform/iphone/osys_events.cpp:351
msgid "Touchpad mode enabled."
@@ -2183,6 +2316,27 @@ msgstr "Modalità touchpad attivata."
msgid "Touchpad mode disabled."
msgstr "Modalità touchpad disattivata."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "Nascondi ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Nascondi altri"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Mostra tutti"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Finestra"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Minimizza"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normale (nessun ridimensionamento)"
@@ -2192,57 +2346,52 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normale (no ridim.)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
-msgstr "Cambia correzione proporzioni"
+msgstr "Correzione proporzioni attivata"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
-msgstr "Cambia correzione proporzioni"
+msgstr "Correzione proporzioni disattivata"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
-msgstr "Cambia filtro grafico"
+msgstr "Filtro grafico attivo:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
-msgstr "Resa grafica:"
+msgstr "Modalità finestra"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Conserve"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
-#, fuzzy
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
-msgstr "Modalità video attuale:"
+msgstr "Modalità visualizzazione attuale"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
-msgstr ""
+msgstr "Dimensioni attuali"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
-msgstr ""
+msgstr "Modalità filtro attiva: Lineare"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
-msgstr ""
+msgstr "Modalità filtro attiva: Più vicino"
#: backends/platform/symbian/src/SymbianActions.cpp:38
#: backends/platform/wince/CEActionsSmartphone.cpp:39
@@ -2267,11 +2416,13 @@ msgstr "Destra"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Clic sinistro"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Clic destro"
@@ -2435,17 +2586,15 @@ msgid "Network down"
msgstr "Rete disattivata"
#: backends/platform/wii/options.cpp:178
-#, fuzzy
msgid "Initializing network"
msgstr "Avvio rete in corso"
#: backends/platform/wii/options.cpp:182
-#, fuzzy
msgid "Timeout while initializing network"
-msgstr "Attesa per l'avvio della rete"
+msgstr "Tempo scaduto per l'avvio della rete"
#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
+#, c-format
msgid "Network not initialized (%d)"
msgstr "Rete non avviata (%d)"
@@ -2502,13 +2651,13 @@ msgstr "Cursore a sinistra"
msgid "Cursor Right"
msgstr "Cursore a destra"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Vuoi caricare o salvare il gioco?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Sei sicuro di voler uscire? "
@@ -2520,45 +2669,45 @@ msgstr "Tastiera"
msgid "Rotate"
msgstr "Rotazione"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Utilizzo del driver SDL "
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Visualizza "
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Vuoi eseguire una scansione automatica?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Mappa l'azione del tasto destro"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr "Devi mappare un tasto per l'azione \"Tasto destro\" per giocare"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Mappa l'azione nascondi barra degli strumenti"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Devi mappare un tasto per l'azione \"Nascondi barra degli strumenti\" per "
"giocare"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Mappa l'azione Zoom Up (opzionale)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Mappa l'azione Zoom Down (opzionale)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2566,56 +2715,98 @@ msgstr ""
"strumenti\" per vedere l'intero inventario"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Do you really want to return to the Launcher?"
-msgstr "Sei sicuro di voler eliminare questo salvataggio?"
+msgstr "Sei sicuro di voler tornare all'elenco giochi?"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Launcher"
-msgstr "Pugno"
+msgstr "Elenco giochi"
#: backends/events/default/default-events.cpp:244
-#, fuzzy
msgid "Do you really want to quit?"
msgstr "Sei sicuro di voler uscire?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
+msgstr "Touchscreen 'Tap Mode' - Clic sinistro"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
+msgstr "Touchscreen 'Tap Mode' - Clic destro"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
+msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (nessun clic)"
-#: backends/events/gph/gph-events.cpp:390
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
-msgstr "Volume"
+msgstr "Volume massimo"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
-msgstr ""
+msgstr "Aumento volume"
-#: backends/events/gph/gph-events.cpp:398
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
-msgstr "Volume"
+msgstr "Volume minimo"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
+msgstr "Diminuzione volume"
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Cerca aggiornamenti..."
+
+#: backends/platform/bada/form.cpp:269
+#, fuzzy
+msgid "Right Click Once"
+msgstr "Clic destro"
+
+#: backends/platform/bada/form.cpp:277
+#, fuzzy
+msgid "Move Only"
+msgstr "Solo voci"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
msgstr ""
+#: backends/platform/bada/form.cpp:296
+#, fuzzy
+msgid "Game Menu"
+msgstr "Gioco"
+
+#: backends/platform/bada/form.cpp:301
+#, fuzzy
+msgid "Show Keypad"
+msgstr "Mostra tastiera"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr ""
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Agg. gioco..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Aggiungi gioco..."
+
#~ msgid "Discovered %d new games."
#~ msgstr "Rilevati %d nuovi giochi."
diff --git a/po/module.mk b/po/module.mk
index d2d6127321..ef3e0589fc 100644
--- a/po/module.mk
+++ b/po/module.mk
@@ -2,7 +2,7 @@ POTFILE := $(srcdir)/po/scummvm.pot
POFILES := $(wildcard $(srcdir)/po/*.po)
updatepot:
- xgettext -f $(srcdir)/po/POTFILES -D $(srcdir) -d scummvm --c++ -k_ -k_s -k_c:1,2c -k_sc:1,2c \
+ xgettext -f $(srcdir)/po/POTFILES -D $(srcdir) -d scummvm --c++ -k_ -k_s -k_c:1,2c -k_sc:1,2c --add-comments=I18N\
-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)_
diff --git a/po/nb_NO.po b/po/nb_NO.po
index eb895ed8c4..bfe0da8997 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -1,20 +1,20 @@
-# Norwegian (Bokmaal) translation for ScummVM.
-# Copyright (C) 2010 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010.
-#
+# Norwegian (Bokmaal) translation for ScummVM.
+# Copyright (C) 2010 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010.
+#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
"PO-Revision-Date: 2011-04-25 22:56+0100\n"
"Last-Translator: Einar Johan T. Sømåen <einarjohants@gmail.com>\n"
"Language-Team: somaen <einarjohants@gmail.com>\n"
+"Language: Norsk (bokmaal)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Norsk (bokmaal)\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Poedit-Language: Norsk Bokmål\n"
"X-Poedit-Country: NORWAY\n"
@@ -47,10 +47,11 @@ msgid "Go up"
msgstr "Gå tilbake"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -60,22 +61,22 @@ msgstr "Avbryt"
msgid "Choose"
msgstr "Velg"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Lukk"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Musklikk"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Vis tastatur"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Omkoble taster"
@@ -88,16 +89,17 @@ msgid "Map"
msgstr "Koble"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -345,7 +347,7 @@ msgstr "Denne spill-IDen er allerede i bruk. Vennligst velg en annen."
msgid "~Q~uit"
msgstr "~A~vslutt"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Avslutt ScummVM"
@@ -353,7 +355,7 @@ msgstr "Avslutt ScummVM"
msgid "A~b~out..."
msgstr "~O~m..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Om ScummVM"
@@ -381,7 +383,7 @@ msgstr "~Å~pne..."
msgid "Load savegame for selected game"
msgstr "Åpne lagret spill for det valgte spillet"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~L~egg til spill..."
@@ -405,7 +407,7 @@ msgstr "~F~jern spill"
msgid "Remove game from the list. The game data files stay intact"
msgstr "Fjern spill fra listen. Spilldataene forblir intakte"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~L~egg til spill..."
@@ -433,14 +435,14 @@ msgid "Clear value"
msgstr "Tøm verdi"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Åpne spill:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Åpne"
@@ -454,17 +456,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Ja"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Nei"
@@ -502,34 +504,25 @@ msgstr "Legg til flere..."
msgid "Mass Add..."
msgstr "Legg til flere..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Legg til spill..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Legg til spill..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... fremdrift ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Søk fullført!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "Sjekket %d mapper ..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, fuzzy, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Fant %d nye spill ..."
@@ -609,8 +602,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Spesiel dithering-modus støttet av enkelte spill"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Fullskjermsmodus"
@@ -949,19 +942,19 @@ msgstr "Slett"
msgid "Do you really want to delete this savegame?"
msgstr "Vil du virkelig slette dette lagrede spillet?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Dato: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Tid: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Spilltid: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Ikke navngitt spilltilstand"
@@ -969,60 +962,60 @@ msgstr "Ikke navngitt spilltilstand"
msgid "Select a Theme"
msgstr "Velg et tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standard Tegner (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Antialiased Tegner (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Antialiased (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motoren støtter ikke debug-nivå '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Meny"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Hopp over"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Hopp over linje"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Problem ved kjøring av spill:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Kunne ikke finne noen motor som kunne kjøre det valgte spillet"
@@ -1090,20 +1083,21 @@ msgstr ""
msgid "Unknown error"
msgstr "Ukjent feil"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules Grønn"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules Oransje"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules Grønn"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules Oransje"
@@ -1155,17 +1149,17 @@ msgid "~R~eturn to Launcher"
msgstr "~T~ilbake til oppstarter"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Lagret spill:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Lagre"
@@ -1176,39 +1170,39 @@ msgid ""
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~A~vbryt"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~aster"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
#, fuzzy
msgid "Could not switch to video mode: '"
msgstr "Nåværende videomodus:"
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
#, fuzzy
msgid "Could not apply aspect ratio setting."
msgstr "Veksle aspekt-rate korrigering"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1217,7 +1211,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1226,30 +1220,138 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
msgstr ""
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr ""
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+#, fuzzy
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr " Er du sikker på at du vil avslutte ?"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+#, fuzzy
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr " Er du sikker på at du vil avslutte ?"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Avslutt"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:200
+#, fuzzy
+msgid "Select a game to LOAD"
+msgstr "Velg et tema"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr ""
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~F~orrige"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~N~este"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~L~ukk"
+#: engines/scumm/dialogs.cpp:597
+#, fuzzy
+msgid "Speech Only"
+msgstr "Tale"
+
+#: engines/scumm/dialogs.cpp:598
+#, fuzzy
+msgid "Speech and Subtitles"
+msgstr "Undertekster"
+
+#: engines/scumm/dialogs.cpp:599
+#, fuzzy
+msgid "Subtitles Only"
+msgstr "Undertekster"
+
+#: engines/scumm/dialogs.cpp:607
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Tale"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Vanlige tastaturkommandoer:"
@@ -1300,14 +1402,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Lagre spilltilstand 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Avslutt"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1412,14 +1506,14 @@ msgid "Pull"
msgstr "Dra"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Gi"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Åpne"
@@ -1432,9 +1526,9 @@ msgid "Get"
msgstr "Få"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Bruk"
@@ -1457,13 +1551,13 @@ msgid "Turn off"
msgstr "Slå av"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Gå til"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Plukk opp"
@@ -1491,11 +1585,11 @@ msgstr "Fiks"
msgid "Switch"
msgstr "Bytt"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Kikk"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Snakk"
@@ -1507,277 +1601,279 @@ msgstr "Reis"
msgid "To Henry / To Indy"
msgstr "Til Henry / Til Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "Spill C moll på distaffen"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "spill D på distaffen"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "spill E på distaffen"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "spill F på distaffen"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "spill G på distaffen"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "spill A på distaffen"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "spill H på distaffen"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "spill C dur på distaffen"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Dytt"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Dra"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Snakk til"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Se på"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Slå på"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Slå av"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Ned-tast"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Merk forrige dialog"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Opp-tast"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Merk neste dialog"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Gå"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventar"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Gjenstand"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Svart/Hvitt / Farger"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Øyne"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Tunge"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Slå"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Spark"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Undersøk"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Vanlig muspeker"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Lagre / Åpne / Valg"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Andre spillkontroller"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventar:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Bla liste opp"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Bla liste ned"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Øvre venstre gjenstand"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Nedre venstre gjenstand"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Øvre høyre gjenstand"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Nedre høyre gjenstand"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Midtre venstre gjenstand"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Midtre høyre gjenstand"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Bytte av karakterer:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Andre unge"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Tredje unge"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Kampkontroller (talltastatur)"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Bakoversteg"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Høy blokk"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Mid-blokk"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Lav blokk"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Slå høyt"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Slå midje"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Slå lavt"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Gjelder når Indy er til venstre."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Når Indy er til høyre,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "Byttes 7, 4, og 1 med"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "henholdsvis 9, 6, og 3."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Flykontroller (talltastatur)"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Fly til øvre venstre"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Fly til venstre"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Fly til nedre venstre"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Fly oppover"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Fly rett"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Fly ned"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Fly til øvre høyre"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Fly til høyre"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Fly til nedre høyre"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1788,7 +1884,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1799,7 +1895,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1810,7 +1906,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1820,41 +1916,48 @@ msgstr ""
"ennå. Så, for å spille Maniac Mansion, gå til 'Legg til spill' i ScummVM-"
"hovedmenyen og velg 'Maniac'-undermappa i Tentacle-mappa."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "~Z~ipmodus aktivert"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "~O~verganger aktivert"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr ""
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+#, fuzzy
+msgid "~M~ain Menu"
+msgstr "ScummVM Hovedmeny"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~V~anneffekt aktivert"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Gjennopprett spill:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Gjenopprett"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr ""
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
#, fuzzy
msgid "Failed to load game state from file."
msgstr ""
@@ -1862,7 +1965,7 @@ msgstr ""
"\n"
"%s"
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
#, fuzzy
msgid "Failed to save game state to file."
msgstr ""
@@ -1878,7 +1981,7 @@ msgstr ""
"\n"
"%s"
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
#, fuzzy
msgid "Failed to save game"
msgstr ""
@@ -2002,32 +2105,37 @@ msgstr "MAME OPL emulator"
msgid "DOSBox OPL emulator"
msgstr "DOSBox OPL emulator"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr ""
+
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
#: audio/null.h:43
@@ -2177,6 +2285,29 @@ msgstr "Touchpad-modus aktivert."
msgid "Touchpad mode disabled."
msgstr "Touchpad-modus deaktivert."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+#, fuzzy
+msgid "Hide ScummVM"
+msgstr "Avslutt ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+#, fuzzy
+msgid "Window"
+msgstr "Windows MIDI"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr ""
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (ingen skalering)"
@@ -2186,55 +2317,55 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (ingen skalering)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
#, fuzzy
msgid "Enabled aspect ratio correction"
msgstr "Veksle aspekt-rate korrigering"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
#, fuzzy
msgid "Disabled aspect ratio correction"
msgstr "Veksle aspekt-rate korrigering"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
#, fuzzy
msgid "Active graphics filter:"
msgstr "Bytt grafikkfiltre"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
#, fuzzy
msgid "Windowed mode"
msgstr "Tegnemodus:"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Bevar"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
#, fuzzy
msgid "Current display mode"
msgstr "Nåværende videomodus:"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr ""
@@ -2261,11 +2392,13 @@ msgstr "Høyre"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Venstreklikk"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Høyreklikk"
@@ -2497,13 +2630,13 @@ msgstr "Peker venstre"
msgid "Cursor Right"
msgstr "Peker høyre"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Vil du åpne eller lagre spillet?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Er du sikker på at du vil avslutte ?"
@@ -2515,46 +2648,46 @@ msgstr "Tastatur"
msgid "Rotate"
msgstr "Roter"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Bruk SDL-driver"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Skjerm"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Vil du utføre et automatisk søk?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Koble handling til høyreklikk"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Du må koble en tast til handlingen 'Høyreklikk' for å spille dette spillet"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Koble skjul-verktøylinje-handlingen"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Du må koble en tast til 'Skjul verktøylinje'-handlingen for å spille dette "
"spillet"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Koble handlingen Zoom Opp (valgfritt)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Koble handlingen Zoom Ned (valgfritt)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2576,42 +2709,89 @@ msgstr "Slå"
msgid "Do you really want to quit?"
msgstr "Vil du avslutte?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr ""
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
#, fuzzy
msgid "Maximum Volume"
msgstr "Volum"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
#, fuzzy
msgid "Minimal Volume"
msgstr "Volum"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr ""
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr ""
+
+#: backends/platform/bada/form.cpp:269
+#, fuzzy
+msgid "Right Click Once"
+msgstr "Høyreklikk"
+
+#: backends/platform/bada/form.cpp:277
+#, fuzzy
+msgid "Move Only"
+msgstr "Tale"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:296
+#, fuzzy
+msgid "Game Menu"
+msgstr "Spill"
+
+#: backends/platform/bada/form.cpp:301
+#, fuzzy
+msgid "Show Keypad"
+msgstr "Vis tastatur"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr ""
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Legg til spill..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Legg til spill..."
+
#~ msgid "Discovered %d new games."
#~ msgstr "Oppdaget %d nye spill."
diff --git a/po/nn_NO.po b/po/nn_NO.po
index ff43eb2a17..e7da5a8946 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -1,20 +1,20 @@
-# Norwegian (Nynorsk) translation for ScummVM.
-# Copyright (C) 2010 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010.
-#
+# Norwegian (Nynorsk) translation for ScummVM.
+# Copyright (C) 2010 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010.
+#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
"PO-Revision-Date: 2011-04-25 23:07+0100\n"
"Last-Translator: Einar Johan T. Sømåen <einarjohants@gmail.com>\n"
"Language-Team: somaen <einarjohants@gmail.com>\n"
+"Language: Norsk (nynorsk)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Norsk (nynorsk)\n"
"X-Poedit-Language: Norwegian Nynorsk\n"
"X-Poedit-SourceCharset: iso-8859-1\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
@@ -47,10 +47,11 @@ msgid "Go up"
msgstr "Gå tilbake"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -60,22 +61,22 @@ msgstr "Avbryt"
msgid "Choose"
msgstr "Vel"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Steng"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Musklikk"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Syn Tastatur"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Omkople tastar"
@@ -88,16 +89,17 @@ msgid "Map"
msgstr "Kople"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -345,7 +347,7 @@ msgstr ""
msgid "~Q~uit"
msgstr "~A~vslutt"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Avslutt ScummVM"
@@ -353,7 +355,7 @@ msgstr "Avslutt ScummVM"
msgid "A~b~out..."
msgstr "~O~m..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Om ScummVM"
@@ -381,7 +383,7 @@ msgstr "~Å~pne..."
msgid "Load savegame for selected game"
msgstr "Åpne eit lagra spel for the velde spelet"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~L~egg til spel..."
@@ -405,7 +407,7 @@ msgstr "~F~jern spel"
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~L~egg til spel..."
@@ -433,14 +435,14 @@ msgid "Clear value"
msgstr "Tøm verdi"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Åpne spel:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Åpne"
@@ -452,17 +454,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Ja"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Nei"
@@ -501,34 +503,25 @@ msgstr "Legg til fleire..."
msgid "Mass Add..."
msgstr "Legg til fleire..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Legg til spill..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Legg til spill..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... fremdrift ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Søk fullført!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "Søkt i %d mappar ..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, fuzzy, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Oppdaga %d nye spel ..."
@@ -608,8 +601,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Spesielle dithering-modus som støttast av nokre spel"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Fullskjermsmodus"
@@ -946,19 +939,19 @@ msgstr "Slett"
msgid "Do you really want to delete this savegame?"
msgstr "Vil du verkeleg slette det lagra spelet?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Dato: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Tid: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Speletid: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Ikkje navngjeven speltilstand"
@@ -966,60 +959,60 @@ msgstr "Ikkje navngjeven speltilstand"
msgid "Select a Theme"
msgstr "Vel eit tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standard Teiknar (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Antialiased Teiknar (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Antialiased (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motoren støttar ikkje debug-nivå '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Meny"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Hopp over"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Hopp over linje"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Feil under køyring av spel:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Kunne ikkje finne nokon motor som kunne køyre det velde spelet."
@@ -1088,20 +1081,21 @@ msgstr ""
msgid "Unknown error"
msgstr "Ukjend feil"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules Grønn"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules Raudgul"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules Grønn"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules Raudgul"
@@ -1155,17 +1149,17 @@ msgid "~R~eturn to Launcher"
msgstr "~T~ilbake til oppstarter"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Lagra spel:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Lagre"
@@ -1176,39 +1170,39 @@ msgid ""
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~A~vbryt"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~astar"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
#, fuzzy
msgid "Could not switch to video mode: '"
msgstr "Gjeldende videomodus:"
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
#, fuzzy
msgid "Could not apply aspect ratio setting."
msgstr "Veksle aspekt-korrigering"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1217,7 +1211,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1226,30 +1220,138 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
msgstr ""
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr ""
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+#, fuzzy
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Er du sikker på at du vil avslutte?"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+#, fuzzy
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Er du sikker på at du vil avslutte?"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Avslutt"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:200
+#, fuzzy
+msgid "Select a game to LOAD"
+msgstr "Vel eit tema"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr ""
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~F~orrige"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~N~este"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~L~ukk"
+#: engines/scumm/dialogs.cpp:597
+#, fuzzy
+msgid "Speech Only"
+msgstr "Tale"
+
+#: engines/scumm/dialogs.cpp:598
+#, fuzzy
+msgid "Speech and Subtitles"
+msgstr "Teksting"
+
+#: engines/scumm/dialogs.cpp:599
+#, fuzzy
+msgid "Subtitles Only"
+msgstr "Teksting"
+
+#: engines/scumm/dialogs.cpp:607
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Tale"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Vanlege tastaturkommandoar:"
@@ -1300,14 +1402,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Lagre speltilstand 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Avslutt"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1412,14 +1506,14 @@ msgid "Pull"
msgstr "Dra"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Gi"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Åpne"
@@ -1432,9 +1526,9 @@ msgid "Get"
msgstr "Få"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Nytt"
@@ -1457,13 +1551,13 @@ msgid "Turn off"
msgstr "Slå av"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Gå til"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Plukk opp"
@@ -1491,11 +1585,11 @@ msgstr "Fiks"
msgid "Switch"
msgstr "Bytt"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Kikk"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Snakk"
@@ -1507,277 +1601,279 @@ msgstr "Reis"
msgid "To Henry / To Indy"
msgstr "Til Henry / Til Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "spel C moll på distaffen "
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "spel D på distaffen"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "spel E på distaffen"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "spel F på distaffen"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "spel G på distaffen"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "spel A på distaffen"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "spel H på distaffen"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "spel C dur på distaffen"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Dytt"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Dra"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Snakk til"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Se på"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Slå på"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Slå av"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Opp-tast"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Merk forrige dialog"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Ned-tast"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Merk neste dialog"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Gå"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventar"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objekt"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Svart-Kvitt / Fargar"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Auger"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Tunge"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Slå"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Spark"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Undersøk"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Vanleg peikar"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Åpne / Lagre / Val"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Andre spelkontrollar:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventar:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Bla liste opp"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Bla liste ned"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Øvre venstre gjenstand"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Nedre venstre gjenstand"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Øvre høgre gjenstand"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Nedre høgre gjenstand"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Midtre venstre gjenstand"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Midtre høgre gjenstand"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Veksle karakterar:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Andre unge"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Tredje unge"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Kampkontrollar (taltastatur)"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Bakoversteg"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Høg blokk"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Midt blokk"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Lav blokk"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Høgt slag"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Midtslag"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Lavt slag"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Gjeld Indy på Venstre side."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Med Indy på høgre side,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "byttast 7, 4, og 1 med"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6, og 3, henhaldsvis."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Flykontrollar (taltastatur)"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Fly til øvre venstre"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Fly til venstre"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Fly til nedre venstre"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Fly oppover"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Fly rett"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Fly ned"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Fly til øvre høgre"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Fly til høgre"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Fly til nedre høgre"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1785,7 +1881,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1793,7 +1889,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1801,7 +1897,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1811,45 +1907,52 @@ msgstr ""
"det enno. For å spele Maniac Mansion, gå til 'Legg til spel' i ScummVM-"
"menyen og vel 'Maniac'-undermappa i 'Tentacle'-mappa."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "~Z~ipmodus aktivert"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "~O~vergangar aktivert"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr ""
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+#, fuzzy
+msgid "~M~ain Menu"
+msgstr "ScummVM Hovudmeny"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~V~anneffekt aktivert"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Gjenopprett spel:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Gjenopprett"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr ""
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
msgstr ""
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
msgstr ""
@@ -1857,7 +1960,7 @@ msgstr ""
msgid "Failed to delete file."
msgstr ""
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
#, fuzzy
msgid "Failed to save game"
msgstr "Full speltittel:"
@@ -1978,32 +2081,37 @@ msgstr "MAME OPL emulator"
msgid "DOSBox OPL emulator"
msgstr "DOSBox OPL emulator"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr ""
+
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
#: audio/null.h:43
@@ -2151,6 +2259,29 @@ msgstr ""
msgid "Touchpad mode disabled."
msgstr ""
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+#, fuzzy
+msgid "Hide ScummVM"
+msgstr "Avslutt ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+#, fuzzy
+msgid "Window"
+msgstr "Windows MIDI"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr ""
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (inga skalering)"
@@ -2160,55 +2291,55 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (inga skalering)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
#, fuzzy
msgid "Enabled aspect ratio correction"
msgstr "Veksle aspekt-korrigering"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
#, fuzzy
msgid "Disabled aspect ratio correction"
msgstr "Veksle aspekt-korrigering"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
#, fuzzy
msgid "Active graphics filter:"
msgstr "Veksle grafikkfiltre"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
#, fuzzy
msgid "Windowed mode"
msgstr "Teiknemodus:"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Bevar"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
#, fuzzy
msgid "Current display mode"
msgstr "Gjeldende videomodus:"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr ""
@@ -2235,11 +2366,13 @@ msgstr "Høgre"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Venstreklikk"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Høgreklikk"
@@ -2470,13 +2603,13 @@ msgstr "Peikar venstre"
msgid "Cursor Right"
msgstr "Peikar høgre"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Vil du åpne eller lagre spelet?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr "Er du sikker på at du vil avslutte?"
@@ -2488,44 +2621,44 @@ msgstr "Tastatur"
msgid "Rotate"
msgstr "Roter"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Nyttar SDL-drivar"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Skjerm"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Vil du utføre eit automatisk søk?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Kople høgreklikkshandling"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Du må kople ein tast til 'Høgreklikk'-handlinga for å spele dette spelet"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Kople skjul-verktøylinje-handlinga"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr "Du må kople ein tast til 'Skjul verktøylinje' for å spele dette spelet"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Kople Zoom Opp-handling (valfri)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Kople Zoom Ned-handling (valfri)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2547,42 +2680,89 @@ msgstr "Slå"
msgid "Do you really want to quit?"
msgstr "Vil du avslutte?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr ""
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
#, fuzzy
msgid "Maximum Volume"
msgstr "Volum"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
#, fuzzy
msgid "Minimal Volume"
msgstr "Volum"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr ""
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr ""
+
+#: backends/platform/bada/form.cpp:269
+#, fuzzy
+msgid "Right Click Once"
+msgstr "Høgreklikk"
+
+#: backends/platform/bada/form.cpp:277
+#, fuzzy
+msgid "Move Only"
+msgstr "Tale"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:296
+#, fuzzy
+msgid "Game Menu"
+msgstr "Spel"
+
+#: backends/platform/bada/form.cpp:301
+#, fuzzy
+msgid "Show Keypad"
+msgstr "Syn tastatur"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr ""
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Legg til spill..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Legg til spill..."
+
#~ msgid "Discovered %d new games."
#~ msgstr "Oppdaga %d nye spel."
diff --git a/po/pl_PL.po b/po/pl_PL.po
index 12d53847f5..513ac79ce4 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -1,20 +1,20 @@
-# Polish translation for ScummVM.
-# Copyright (C) 2010-2011 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Grajpopolsku.pl <grajpopolsku@gmail.com>, 2011.
-#
+# Polish translation for ScummVM.
+# Copyright (C) 2010-2011 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Grajpopolsku.pl <grajpopolsku@gmail.com>, 2011.
+#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
"PO-Revision-Date: 2011-05-02 12:09+0100\n"
"Last-Translator: \n"
"Language-Team: Grajpopolsku.pl <grajpopolsku@gmail.com>\n"
+"Language: Polski\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Polski\n"
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-Language: Polish\n"
@@ -47,10 +47,11 @@ msgid "Go up"
msgstr "W górê"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -60,22 +61,22 @@ msgstr "Anuluj"
msgid "Choose"
msgstr "Wybierz"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Zamknij"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Klikniêcie"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Wy¶wietl klawiaturê"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Dostosuj klawisze"
@@ -88,16 +89,17 @@ msgid "Map"
msgstr "Przypisz"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -343,7 +345,7 @@ msgstr "Identyfikator jest ju¿ zajêty. Wybierz inny."
msgid "~Q~uit"
msgstr "~Z~akoñcz"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Zakoñcz ScummVM"
@@ -351,7 +353,7 @@ msgstr "Zakoñcz ScummVM"
msgid "A~b~out..."
msgstr "I~n~formacje..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "O ScummVM"
@@ -379,7 +381,7 @@ msgstr "~W~czytaj..."
msgid "Load savegame for selected game"
msgstr "Wczytaj zapis wybranej gry"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~D~odaj grê..."
@@ -403,7 +405,7 @@ msgstr "~U~suñ grê"
msgid "Remove game from the list. The game data files stay intact"
msgstr "Usuwa grê z listy. Pliki gry pozostaj± nietkniête"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~D~odaj grê..."
@@ -431,14 +433,14 @@ msgid "Clear value"
msgstr "Wyczy¶æ"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Wczytaj grê:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Wczytaj"
@@ -451,17 +453,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Tak"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Nie"
@@ -498,34 +500,25 @@ msgstr "Masowe dodawanie..."
msgid "Mass Add..."
msgstr "Masowe dodawanie..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Dodaj grê..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Dodaj grê..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... postêp ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Skanowanie zakoñczone!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "Przeskanowano %d katalogów ..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, fuzzy, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Wykryto %d nowych gier..."
@@ -605,8 +598,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Specjalne tryby ditheringu wspierane przez niektóre gry"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Tryb pe³noekranowy"
@@ -949,19 +942,19 @@ msgstr "Skasuj"
msgid "Do you really want to delete this savegame?"
msgstr "Na pewno chcesz skasowaæ ten zapis?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Data: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Czas: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Czas gry: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Zapis bez nazwy"
@@ -969,60 +962,60 @@ msgstr "Zapis bez nazwy"
msgid "Select a Theme"
msgstr "Wybierz styl"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "Wy³±czona grafika"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Wy³±czona grafika"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standardowy renderer (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standardowy (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Wyg³adzany renderer (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Wyg³adzany (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Silnik nie wspiera poziomu debugowania '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Pomiñ"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Wstrzymaj"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Pomiñ liniê"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "B³±d podczas uruchamiania gry:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Nie uda³o siê znale¼æ silnika zdolnego do uruchomienia zaznaczonej gry"
@@ -1090,20 +1083,21 @@ msgstr ""
msgid "Unknown error"
msgstr "Nieznany b³±d"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Zielony Hercules"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Bursztynowy Hercules"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Zielony Hercules"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Bursztynowy Hercules"
@@ -1155,17 +1149,17 @@ msgid "~R~eturn to Launcher"
msgstr "~P~owrót do launchera"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Zapis:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Zapisz"
@@ -1176,39 +1170,39 @@ msgid ""
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~A~nuluj"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~K~lawisze"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
#, fuzzy
msgid "Could not switch to video mode: '"
msgstr "Obecny tryb wideo:"
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
#, fuzzy
msgid "Could not apply aspect ratio setting."
msgstr "W³±cz/wy³±cz korekcjê formatu obrazu"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1217,7 +1211,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1226,30 +1220,138 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
msgstr ""
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr ""
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+#, fuzzy
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr " Na pewno chcesz wyj¶æ? "
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+#, fuzzy
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr " Na pewno chcesz wyj¶æ? "
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Zakoñcz"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:200
+#, fuzzy
+msgid "Select a game to LOAD"
+msgstr "Wybierz styl"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr ""
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~P~oprzedni"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~N~astêpny"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~Z~amknij"
+#: engines/scumm/dialogs.cpp:597
+#, fuzzy
+msgid "Speech Only"
+msgstr "Mowa"
+
+#: engines/scumm/dialogs.cpp:598
+#, fuzzy
+msgid "Speech and Subtitles"
+msgstr "Napisy"
+
+#: engines/scumm/dialogs.cpp:599
+#, fuzzy
+msgid "Subtitles Only"
+msgstr "Napisy"
+
+#: engines/scumm/dialogs.cpp:607
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Mowa"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Skróty klawiaturowe:"
@@ -1300,14 +1402,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Zapisz stan gry 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Zakoñcz"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1412,14 +1506,14 @@ msgid "Pull"
msgstr "Poci±gnij"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Daj"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Otwórz"
@@ -1432,9 +1526,9 @@ msgid "Get"
msgstr "We¼"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "U¿yj"
@@ -1457,13 +1551,13 @@ msgid "Turn off"
msgstr "Wy³±cz"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Podejd¼ do"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Podnie¶"
@@ -1491,11 +1585,11 @@ msgstr "Napraw"
msgid "Switch"
msgstr "Prze³±cz"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Spójrz"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Rozmawiaj"
@@ -1507,277 +1601,279 @@ msgstr "Podró¿uj"
msgid "To Henry / To Indy"
msgstr "Do Henry'ego / Do Indy'ego"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "zagraj c-moll na k±dzieli"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "zagraj D na k±dzieli"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "zagraj E na k±dzieli"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "zagraj F na k±dzieli"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "zagraj G na k±dzieli"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "zagraj A na k±dzieli"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "zagraj B na k±dzieli"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "zagraj C-dur na k±dzieli"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "pchnj"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "poci±gnij (Yank)"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Rozmawiaj z"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Spójrz na"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "w³±cz"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "wy³±cz"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Strza³ka do góry"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Pod¶wietl poprzedni dialog"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Strza³ka w dó³"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Pod¶wietl nastêpny dialog"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Id¼"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Ekwipunek"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Przedmiot"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Czarno-bia³y / Kolorowy"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Oczy"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Jêzyk"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Piê¶æ"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Kopniêcie"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Zbadaj"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Zwyk³y kursor"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Zapis / Odczyt / Opcje"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Reszta sterowania gry:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Ekwipunek:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Przewiñ listê do góry"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Przewiñ listê w dó³"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Przedmiot u góry, z lewej"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Przedmiot na dole, z lewej"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Przedmiot u góry, z prawej"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Przedmiot na dole, z prawej"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Przedmiot na ¶rodku, z lewej"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Przedmiot na ¶rodku, z prawej"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Zmiana postaci:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Drugi dzieciak"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Trzeci dzieciak"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Sterowanie podczas walki (klaw. num.):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Odsuñ siê"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Wysoki blok"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "¦rodkowy blok"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Dolny blok"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Wysokie uderzenie"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "¦rodkowe uderzenie"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Niskie uderzenie"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Te s± dla Indy'ego po lewej."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Kiedy Indy jest po prawej,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4, i 1 zostaj± zamienione"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "na 9, 6 i 3."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Sterowanie dwup³atowcem (klaw. num.):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Leæ do góry, w lewo"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Leæ w lewo"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Leæ na dó³, w lewo"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Leæ do góry"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Leæ prosto"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Leæ w dó³"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Leæ do góry, w prawo"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Leæ w prawo"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Leæ w dó³, w prawo"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1788,7 +1884,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1799,7 +1895,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1810,7 +1906,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1820,41 +1916,48 @@ msgstr ""
"tego nie obs³uguje. Aby zagraæ, u¿yj \"Dodaj grê...\" z menu startowego "
"ScummVM i wybierz podkatalog \"Maniac\" z katalogu gry Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "~T~ryb zip aktywny"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "~P~rzej¶cia w³±czone"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr ""
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+#, fuzzy
+msgid "~M~ain Menu"
+msgstr "G³ówne menu ScummVM"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~E~fekty wody w³±czone"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Wznów grê:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Wznów"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr ""
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
#, fuzzy
msgid "Failed to load game state from file."
msgstr ""
@@ -1862,7 +1965,7 @@ msgstr ""
"\n"
"%s"
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
#, fuzzy
msgid "Failed to save game state to file."
msgstr ""
@@ -1878,7 +1981,7 @@ msgstr ""
"\n"
"%s"
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
#, fuzzy
msgid "Failed to save game"
msgstr ""
@@ -2002,32 +2105,37 @@ msgstr "Emulator OPL MAME"
msgid "DOSBox OPL emulator"
msgstr "Emulator OPL DOSBox"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr ""
+
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
#: audio/null.h:43
@@ -2177,6 +2285,29 @@ msgstr "Tryb touchpada w³±czony."
msgid "Touchpad mode disabled."
msgstr "Tryb touchpada wy³±czony."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+#, fuzzy
+msgid "Hide ScummVM"
+msgstr "Zakoñcz ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+#, fuzzy
+msgid "Window"
+msgstr "Windows MIDI"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr ""
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Zwyk³y (bez skalowania)"
@@ -2186,55 +2317,55 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Zwyk³y (bez skalowania)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
#, fuzzy
msgid "Enabled aspect ratio correction"
msgstr "W³±cz/wy³±cz korekcjê formatu obrazu"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
#, fuzzy
msgid "Disabled aspect ratio correction"
msgstr "W³±cz/wy³±cz korekcjê formatu obrazu"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
#, fuzzy
msgid "Active graphics filter:"
msgstr "Prze³±czaj pomiêdzy filtrami grafiki"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
#, fuzzy
msgid "Windowed mode"
msgstr "Renderer:"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL - normalny"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL - zachow."
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL - pierw."
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
#, fuzzy
msgid "Current display mode"
msgstr "Obecny tryb wideo:"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr ""
@@ -2261,11 +2392,13 @@ msgstr "W prawo"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Klikniêcie LPM"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Klikniêcie PPM"
@@ -2496,13 +2629,13 @@ msgstr "Kursor w lewo"
msgid "Cursor Right"
msgstr "Kursor w prawo"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Chcesz wczytaæ b±d¼ zapisaæ grê?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Na pewno chcesz wyj¶æ? "
@@ -2514,43 +2647,43 @@ msgstr "Klawiatura"
msgid "Rotate"
msgstr "Obrót"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "U¿yj sterownika SDL "
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Obraz "
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Wykonaæ automatyczne skanowanie?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Przypisz dzia³anie PPM"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr "Musisz przypisaæ klawisz do 'PPM', by zagraæ w tê grê"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Przypisz chowanie paska narzêdzi"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr "Musisz przypisaæ przycisk 'Schowaj pasek narzêdzi', by zagraæ w tê grê"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Przypisz Przybli¿anie (opcjonalne)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Przypisz Oddalenie (opcjonalne)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2572,42 +2705,89 @@ msgstr "Piê¶æ"
msgid "Do you really want to quit?"
msgstr "Chcesz wyj¶æ?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr ""
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
#, fuzzy
msgid "Maximum Volume"
msgstr "G³o¶no¶æ"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
#, fuzzy
msgid "Minimal Volume"
msgstr "G³o¶no¶æ"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr ""
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr ""
+
+#: backends/platform/bada/form.cpp:269
+#, fuzzy
+msgid "Right Click Once"
+msgstr "Klikniêcie PPM"
+
+#: backends/platform/bada/form.cpp:277
+#, fuzzy
+msgid "Move Only"
+msgstr "Mowa"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:296
+#, fuzzy
+msgid "Game Menu"
+msgstr "Gra"
+
+#: backends/platform/bada/form.cpp:301
+#, fuzzy
+msgid "Show Keypad"
+msgstr "Poka¿ klawiaturê"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr ""
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Dodaj grê..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Dodaj grê..."
+
#~ msgid "Discovered %d new games."
#~ msgstr "Wykryto %d nowych gier."
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 2ea8bfe237..07073644a4 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-05-03 19:11-0300\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-10-21 21:30-0300\n"
"Last-Translator: Saulo Benigno <saulobenigno@gmail.com>\n"
"Language-Team: ScummBR (www.scummbr.com) <scummbr@yahoo.com.br>\n"
"MIME-Version: 1.0\n"
@@ -47,10 +47,11 @@ msgid "Go up"
msgstr "Acima"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -60,22 +61,22 @@ msgstr "Cancelar"
msgid "Choose"
msgstr "Escolher"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Fechar"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Clique do mouse"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Mostrar teclado"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Remapear teclas"
@@ -88,16 +89,17 @@ msgid "Map"
msgstr "Mapear"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -343,7 +345,7 @@ msgstr "Este código já esta sendo utilizado. Por favor, escolha outro."
msgid "~Q~uit"
msgstr "~S~air"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Sair do ScummVM"
@@ -351,7 +353,7 @@ msgstr "Sair do ScummVM"
msgid "A~b~out..."
msgstr "So~b~re..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Sobre o ScumnmVM"
@@ -379,7 +381,7 @@ msgstr "~C~arregar"
msgid "Load savegame for selected game"
msgstr "Carregar jogo salvo do jogo selecionado"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "~A~dicionar Jogo..."
@@ -404,7 +406,7 @@ msgid "Remove game from the list. The game data files stay intact"
msgstr ""
"Remover jogo da lista. Os arquivos de dados do jogo permanecem intactos"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~dicionar Jogo..."
@@ -432,14 +434,14 @@ msgid "Clear value"
msgstr "Limpar valor"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Carregar jogo:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Carregar"
@@ -453,17 +455,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Sim"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Não"
@@ -502,37 +504,32 @@ msgstr "Multi-Adição..."
msgid "Mass Add..."
msgstr "Multi-Adição..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Adicionar Jogo..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Adicionar Jogo..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... progresso ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Busca completa!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
+"Encontrado(s) %d novo(s) jogo(s, ignorados %d previamente adicionados "
+"jogos..."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d pasta(s) pesquisada(s)"
-#: gui/massadd.cpp:253
-#, fuzzy, c-format
+#: gui/massadd.cpp:268
+#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "Encontrado(s) %d novo(s) jogo(s)"
+msgstr ""
+"Encontrado(s) %d novo(s) jogo(s, ignorados %d previamente adicionados "
+"jogos..."
#: gui/options.cpp:72
msgid "Never"
@@ -582,19 +579,19 @@ msgstr "Nenhum(a)"
#: gui/options.cpp:372
msgid "Failed to apply some of the graphic options changes:"
-msgstr ""
+msgstr "Falha ao aplicar algumas mudanças nas opções de gráfico:"
#: gui/options.cpp:384
msgid "the video mode could not be changed."
-msgstr ""
+msgstr "o modo de vídeo não pôde ser alterado."
#: gui/options.cpp:390
msgid "the fullscreen setting could not be changed"
-msgstr ""
+msgstr "a configuração de tela cheia não pôde ser mudada"
#: gui/options.cpp:396
msgid "the aspect ratio setting could not be changed"
-msgstr ""
+msgstr "a configuração de proporção não pôde ser mudada"
#: gui/options.cpp:705
msgid "Graphics mode:"
@@ -609,8 +606,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Modos especiais de dithering suportados por alguns jogos"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Modo Tela Cheia"
@@ -902,7 +899,6 @@ msgid "Language of ScummVM GUI"
msgstr "Linguagem do ScummVM GUI"
#: gui/options.cpp:1295
-#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Você tem que reiniciar o ScummVM para funcionar."
@@ -954,19 +950,19 @@ msgstr "Excluir"
msgid "Do you really want to delete this savegame?"
msgstr "Você realmente quer excluir este jogo salvo?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Data:"
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Hora:"
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Tempo de jogo:"
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Não-titulado arquivo de save"
@@ -974,60 +970,60 @@ msgstr "Não-titulado arquivo de save"
msgid "Select a Theme"
msgstr "Selecione um Tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "GFX desabilitado"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desabilitado"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Renderizador padrão (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Padrão (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Renderizador Anti-Serrilhamento (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Anti-Serrilhamento (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
-msgstr "Essa engine não suporta o nível de debug '%s'"
+msgstr "Esse programa não suporta o nível de debug '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Pular"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausar"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Pula linha"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Erro ao executar o jogo:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr ""
"Não foi possível encontrar qualquer programa capaz de rodar o jogo "
@@ -1083,34 +1079,35 @@ msgstr "Falha na gravação"
#: common/error.cpp:66
msgid "Could not find suitable engine plugin"
-msgstr "Não foi possível encontrar engine adequada"
+msgstr "Não foi possível encontrar programa adequado"
#: common/error.cpp:68
msgid "Engine plugin does not support save states"
-msgstr "A engine atual não suporta salvar o progresso do jogo"
+msgstr "O programa atual não suporta salvar o progresso do jogo"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "Usuário cancelou"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "Erro desconhecido"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules Green"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules Amber"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules Green"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules Amber"
@@ -1118,15 +1115,16 @@ msgstr "Hercules Amber"
#: engines/advancedDetector.cpp:296
#, c-format
msgid "The game in '%s' seems to be unknown."
-msgstr ""
+msgstr "O jogo em '% s' parece ser desconhecido."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
+"Por favor, informe os seguintes dados para a equipe ScummVM junto com o nome"
#: engines/advancedDetector.cpp:299
msgid "of the game you tried to add and its version/language/etc.:"
-msgstr ""
+msgstr "do jogo que você tentou adicionar e sua versão/idioma/etc.:"
#: engines/dialogs.cpp:84
msgid "~R~esume"
@@ -1162,17 +1160,17 @@ msgid "~R~eturn to Launcher"
msgstr "~V~oltar ao menu"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Salvar jogo:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Salvar"
@@ -1182,40 +1180,41 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
+"Desculpe, este programa não fornece atualmente ajuda internamente no jogo. "
+"Por favor, consulte o README para obter informações básicas, e para obter "
+"instruções sobre como obter assistência adicional."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "~C~ancelar"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
-msgstr ""
+msgstr "Não foi possível inicializar o formato de cor."
-#: engines/engine.cpp:228
-#, fuzzy
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
-msgstr "Modo de vídeo atual:"
+msgstr "Não foi possível alternar o modo de vídeo atual:"
-#: engines/engine.cpp:237
-#, fuzzy
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
-msgstr "Habilita correção de proporção"
+msgstr "Não foi possível aplicar a correção de proporção"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
-msgstr ""
+msgstr "Não foi possível aplicar a configuração de tela cheia."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1223,8 +1222,13 @@ msgid ""
"the data files to your hard disk instead.\n"
"See the README file for details."
msgstr ""
+"Você parece estar jogando este jogo\n"
+"a partir do CD. Isso é conhecido por causar problemas,\n"
+"e por isso é recomendável que você copie\n"
+"os arquivos de dados para o disco rígido.\n"
+"Consulte o arquivo README para mais detalhes."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1232,31 +1236,140 @@ msgid ""
"order to listen to the game's music.\n"
"See the README file for details."
msgstr ""
+"Este jogo tem faixas de áudio em seu disco. Estas\n"
+"faixas precisam ser gravadas do disco usando\n"
+"uma ferramenta de extração de áudio do CD apropriada\n"
+"para ouvir a música do jogo.\n"
+"Consulte o arquivo README para mais detalhes."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"AVISO: O jogo que você está prestes a começar ainda não é totalmente "
+"suportado pelo ScummVM. Como tal, é provável que seja instável, e qualquer "
+"jogo salvo que você fizer pode não funcionar em futuras versões do ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "Iniciar de qualquer maneira"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "Insera o Disk %c e Pressione o Botão para Continuar."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "Incapaz de encontrar %s, (%c%d) Pressione o Botão."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "Erro de leitura do disco %c, (%c%d) Pressione o Botão."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "Jogo pausado. Pressione ESPAÇO para continuar."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Tem certeza de que deseja reiniciar? (S/N)S"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Tem certeza de que deseja sair? (S/N)S"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "Jogar"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Sair"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "Insira o disco para salvar/carregar o jogo"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "Você deve digitar um nome"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "O jogo NÃO foi salvo (disco cheio?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "O jogo NÃO foi carregado"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "Salvando '%s'"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "Carregando '%s'"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "Dê um nome ao seu SAVE"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "Selecione um jogo para CARREGAR"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "Título do jogo)"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~A~nterior"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~P~róximo"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~F~echar"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "Somente Voz"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "Voz e Legendas"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "Somente Legendas"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Voz e Legendas"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Comandos de teclado comuns:"
@@ -1307,14 +1420,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Salvar estado do jogo 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Sair"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1396,9 +1501,8 @@ msgid " since they may cause crashes"
msgstr " visto que poderá causar travas"
#: engines/scumm/help.cpp:110
-#, fuzzy
msgid " or incorrect game behavior."
-msgstr " ou procedimentos estranhos nos jogos."
+msgstr " ou procedimentos estranhos nos jogos."
#: engines/scumm/help.cpp:114
msgid "Spinning drafts on the keyboard:"
@@ -1419,14 +1523,14 @@ msgid "Pull"
msgstr "Puxar"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Dar"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Abrir"
@@ -1439,9 +1543,9 @@ msgid "Get"
msgstr "Pegar"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Usar"
@@ -1464,13 +1568,13 @@ msgid "Turn off"
msgstr "Desligar"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Andar até"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Pegar"
@@ -1498,11 +1602,11 @@ msgstr "Consertar"
msgid "Switch"
msgstr "Trocar"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Olhar"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Falar"
@@ -1514,277 +1618,282 @@ msgstr "Viajar"
msgid "To Henry / To Indy"
msgstr "Para Henry / Para Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "toca dó menor no fio"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "toca D no fio"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "toca E no fio"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "toca F no fio"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "toca G no fio"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "toca A no fio"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "toca B no fio"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "toca dó maior no fio"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Empurrar"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Puxar"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Falar"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Olhar para"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Ligar"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Desligar"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "TeclaCima"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Destacar diálogo anterior"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "TeclaBaixo"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Destacar próximo diálogo"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Andar"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventário"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objeto"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Preto e Branco / Cor"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Olhos"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Língua"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Soco"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Chute"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Examinar"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Cursor normal"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comunicador"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Salvar / Carregar / Opções"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Outros controles do jogo:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventário:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Subir na lista"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Descer na lista"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Item da esquerda superior"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Item da esquerda inferior"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Item da direita superior"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Item da direita inferior"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Item do meio na esquerda"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Item do meio na direita"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Trocando personagens:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Segunda criança"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Terceira criança"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Controle de luta (teclado numérico):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Passo para trás"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Defender em cima"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Defender no meio"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Defender embaixo"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Soco em cima"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Soco no meio"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Soco embaixo"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Estes são para o Indy na esquerda."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "Quando Indy estiver na direita,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4 e 1 são trocados por"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6 e 3, respectivamente."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Controles do avião (teclado numérico)"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Voar para esquerda superior"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Voar para esquerda"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Voar para esquerda inferior"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Voar para cima"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Voar reto"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Voar para baixo"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Voar para direita superior"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Voar para direita"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Voar para direita inferior"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
+"O suporte nativo MIDI requer a atualização do sistema Roland pela "
+"LucasArts,\n"
+"mas %s está faltando. Utilizando AdLib ao invés."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1795,7 +1904,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1806,7 +1915,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1817,7 +1926,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1828,50 +1937,54 @@ msgstr ""
"adicione o jogo normalmente no ScummVM. Ele se encontra em um diretório "
"dentro da pasta do jogo Day of the Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "Modo ~Z~ip ativado"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "Modo ~T~ransições ativado"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "~S~oltar Página"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "~E~xibir Mapa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enu Principal ScummVM"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "Modo ~E~feitos de água ativado"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Restaurar jogo:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Restaurar"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
-msgstr ""
+msgstr "Arquivo de vídeo '%s' não encontrado!"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
-#, fuzzy
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
msgstr ""
"Falha ao carregar o estado do jogo a partir do arquivo:\n"
"\n"
"%s"
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
-#, fuzzy
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
msgstr ""
"Falha ao salvar o estado do jogo para o arquivo:\n"
@@ -1879,20 +1992,12 @@ msgstr ""
"%s"
#: engines/gob/inter_v5.cpp:107
-#, fuzzy
msgid "Failed to delete file."
-msgstr ""
-"Falha ao salvar o estado do jogo para o arquivo:\n"
-"\n"
-"%s"
+msgstr "Falha ao excluir arquivo."
-#: engines/groovie/script.cpp:417
-#, fuzzy
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
-msgstr ""
-"Falha ao salvar o estado do jogo para o arquivo:\n"
-"\n"
-"%s"
+msgstr "Falha ao salvar o jogo"
#: engines/kyra/sound_midi.cpp:475
msgid ""
@@ -1902,36 +2007,46 @@ msgid ""
"General MIDI ones. After all it might happen\n"
"that a few tracks will not be correctly played."
msgstr ""
+"Você parece estar usando um dispositivo General MIDI,\n"
+"mas, o jogo só suporta Roland MT32 MIDI.\n"
+"Tentamos mapear os instrumentos Roland MT32 para\n"
+"o modelo General MIDI. Talvez possa acontecer\n"
+"que algumas faixas não sejam corretamente tocadas."
#: engines/m4/m4_menus.cpp:138
-#, fuzzy
msgid "Save game failed!"
-msgstr "Salvar jogo:"
+msgstr "Falha ao salvar jogo!"
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
"Please download it from www.scummvm.org"
msgstr ""
+"Não é possível localizar o arquivo \"sky.cpt\"\n"
+"Por favor, faça o download em www.scummvm.org"
#: engines/sky/compact.cpp:141
msgid ""
"The \"sky.cpt\" file has an incorrect size.\n"
"Please (re)download it from www.scummvm.org"
msgstr ""
+"O arquivo \"sky.cpt\" possui um tamanho incorreto.\n"
+"Por favor, refaça o download em www.scummvm.org"
#: engines/sword1/animation.cpp:344 engines/sword2/animation.cpp:379
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
+"Vídeos no formato DXA foram encontrados, mas o ScummVM foi compilado sem "
+"suporte a zlib"
#: engines/sword1/animation.cpp:354 engines/sword2/animation.cpp:389
msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
+msgstr "Vídeos em MPEG2 não são mais suportados"
#: engines/sword1/animation.cpp:359 engines/sword2/animation.cpp:397
#, c-format
msgid "Cutscene '%s' not found"
-msgstr ""
+msgstr "Vídeo '%s' não encontrado"
#: engines/sword1/control.cpp:863
msgid ""
@@ -1943,6 +2058,13 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
+"ScummVM encontrou que você tem jogos salvos velhos do Broken Sword 1 que "
+"devem ser convertidos.\n"
+"O formato antigo do jogo salvo não é mais suportado, então você não será "
+"capaz de carregar os seus jogos se você não convertê-los.\n"
+"\n"
+"Pressione OK para convertê-los agora, caso contrário você será solicitado "
+"novamente na próxima vez que você iniciar o jogo.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -1950,18 +2072,20 @@ msgid ""
"Target new save game already exists!\n"
"Would you like to keep the old save game (%s) or the new one (%s)?\n"
msgstr ""
+"Já existe um jogo salvo no destino!\n"
+"Você gostaria de manter o jogo salvo (%s) ou o novo (%s)?\n"
#: engines/sword1/control.cpp:1235
msgid "Keep the old one"
-msgstr ""
+msgstr "Mantenha o antigo"
#: engines/sword1/control.cpp:1235
msgid "Keep the new one"
-msgstr ""
+msgstr "Mantenha o novo"
#: engines/sword1/logic.cpp:1633
msgid "This is the end of the Broken Sword 1 Demo"
-msgstr ""
+msgstr "Este é o fim do demo de Broken Sword 1"
#: engines/parallaction/saveload.cpp:133
#, c-format
@@ -1969,16 +2093,16 @@ msgid ""
"Can't save game in slot %i\n"
"\n"
msgstr ""
+"Não é possível salvar o jogo na posição %i\n"
+"\n"
#: engines/parallaction/saveload.cpp:211
-#, fuzzy
msgid "Loading game..."
-msgstr "Carregar jogo:"
+msgstr "Carregando jogo..."
#: engines/parallaction/saveload.cpp:226
-#, fuzzy
msgid "Saving game..."
-msgstr "Salvar jogo:"
+msgstr "Salvando jogo..."
#: engines/parallaction/saveload.cpp:279
msgid ""
@@ -1989,10 +2113,17 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
+"ScummVM encontrou que você tem jogos salvos antigos do Nippon Safes que "
+"devem ser renomeados.\n"
+"Os nomes antigos não são mais suportados, assim você não será capaz de "
+"carregar os seus jogos se você não convertê-los.\n"
+"\n"
+"Pressione OK para convertê-los agora, caso contrário você será solicitado na "
+"próxima vez.\n"
#: engines/parallaction/saveload.cpp:326
msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
+msgstr "ScummVM converteu com êxito todos os seus jogos salvos."
#: engines/parallaction/saveload.cpp:328
msgid ""
@@ -2001,6 +2132,10 @@ msgid ""
"\n"
"Please report to the team."
msgstr ""
+"ScummVM exibiu alguns avisos na sua janela do console e não pode garantir "
+"todos os seus arquivos foram convertidos.\n"
+"\n"
+"Por favor, reporte para a equipe."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2010,33 +2145,46 @@ msgstr "Emulador MAME OPL"
msgid "DOSBox OPL emulator"
msgstr "Emulador DOSBox OPL"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"O dispositivo de áudio selecionado '%s' não foi encontrado (ex: pode estar "
+"desligado ou desconectado)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "Tentando retornar para o próximo dispositivo disponível..."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"O dispositivo de áudio selecionado '%s' não pode ser usado. Veja o arquivo "
+"de log para mais informações."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"O dispositivo de áudio preferido '%s' não foi encontrado (ex: pode estar "
+"desligado ou desconectado)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"O dispositivo de áudio preferido '%s' não pode ser usado. Veja o arquivo de "
+"log para mais informações."
#: audio/null.h:43
msgid "No music"
@@ -2059,7 +2207,6 @@ msgid "C64 Audio Emulator"
msgstr "Emulador Som C64"
#: audio/softsynth/mt32.cpp:329
-#, fuzzy
msgid "Initializing MT-32 Emulator"
msgstr "Inicializando Emulador MT-32"
@@ -2168,14 +2315,12 @@ msgid "Disable power off"
msgstr "Desativar desligamento"
#: backends/platform/iphone/osys_events.cpp:338
-#, fuzzy
msgid "Mouse-click-and-drag mode enabled."
-msgstr "Modo Touchpad ligado."
+msgstr "Modo clique-e-arraste do mouse ligado."
#: backends/platform/iphone/osys_events.cpp:340
-#, fuzzy
msgid "Mouse-click-and-drag mode disabled."
-msgstr "Modo Touchpad desligado."
+msgstr "Modo clique-e-arraste do mouse desligado."
#: backends/platform/iphone/osys_events.cpp:351
msgid "Touchpad mode enabled."
@@ -2185,6 +2330,27 @@ msgstr "Modo Touchpad ligado."
msgid "Touchpad mode disabled."
msgstr "Modo Touchpad desligado."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "Ocultar ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "Ocultar Outros"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "Exibir Todos"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "Janela"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "Minimizar"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normal (sem escala)"
@@ -2194,57 +2360,52 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (sem escala)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
-msgstr "Habilita correção de proporção"
+msgstr "Correção de proporção habilitada"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
-msgstr "Habilita correção de proporção"
+msgstr "Correção de proporção desabilitada"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
-msgstr "Alterna entre os filtros gráficos"
+msgstr "Ativa os filtros gráficos"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
-msgstr "Renderização"
+msgstr "Modo janela"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL Normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL Conserve"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
-#, fuzzy
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
-msgstr "Modo de vídeo atual:"
+msgstr "Modo de vídeo atual"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
-msgstr ""
+msgstr "Escala atual"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
-msgstr ""
+msgstr "Filtro de imagem ativo: Linear"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
-msgstr ""
+msgstr "Filtro de imagem ativo: Nearest"
#: backends/platform/symbian/src/SymbianActions.cpp:38
#: backends/platform/wince/CEActionsSmartphone.cpp:39
@@ -2269,11 +2430,13 @@ msgstr "Direita"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Clique com o botão esquerdo"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Clique com o botão direito"
@@ -2437,17 +2600,15 @@ msgid "Network down"
msgstr "Conexão caiu"
#: backends/platform/wii/options.cpp:178
-#, fuzzy
msgid "Initializing network"
msgstr "Inicialização de rede"
#: backends/platform/wii/options.cpp:182
-#, fuzzy
msgid "Timeout while initializing network"
msgstr "Tempo limite para iniciar a conexão de rede"
#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
+#, c-format
msgid "Network not initialized (%d)"
msgstr "Rede não inicializada (%d)"
@@ -2504,13 +2665,13 @@ msgstr "Cursor para a esquerda"
msgid "Cursor Right"
msgstr "Cursor para a direita"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Você deseja carregar ou salvar o jogo?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " Tem certeza de que deseja sair? "
@@ -2522,46 +2683,46 @@ msgstr "Teclado"
msgid "Rotate"
msgstr "Rotacionar"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Usando driver SDL"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Tela"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Você quer executar uma busca automática?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Mapear ação \"Clique da Direita\""
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Você precisa mapear uma tecla para ação do \"Clique da Direita\" nesse jogo"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Mapear \"Ocultar barra de ferramentas\""
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Você precisa mapear uma tecla para ação do \"Ocultar barra de ferramentas\" "
"nesse jogo"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Mapear Zoom para Cima (opcional)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Mapear Zoom para Baixo (opcional)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2569,55 +2730,93 @@ msgstr ""
"para ver todo o seu inventário"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Do you really want to return to the Launcher?"
-msgstr "Você realmente quer excluir este jogo salvo?"
+msgstr "Você realmente deseja voltar para o menu principal?"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Launcher"
-msgstr "Soco"
+msgstr "Menu principal"
#: backends/events/default/default-events.cpp:244
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "Você deseja sair ?"
+msgstr "Você realmente deseja sair?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
+msgstr "Touchscreen 'Modo Toque' - Clique Esquerdo"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
+msgstr "Touchscreen 'Modo Toque' - Clique Direito"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
+msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)"
-#: backends/events/gph/gph-events.cpp:390
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
-msgstr "Volume"
+msgstr "Volume máximo"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
-msgstr ""
+msgstr "Aumentando Volume"
-#: backends/events/gph/gph-events.cpp:398
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
-msgstr "Volume"
+msgstr "Volume mínimo"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
-msgstr ""
+msgstr "Diminuindo Volume"
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "Procurar por Atualizações..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "Clique com o botão direito apenas uma vez"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "Apenas mover"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "Tecla Escape"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "Menu do jogo"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "Mostrar teclado"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "Controle do Mouse"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "Clicando Habilitado"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "Clicando Desabilitado"
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Adicionar Jogo..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Adicionar Jogo..."
#~ msgid "Discovered %d new games."
#~ msgstr "Encontrado(s) %d novo(s) jogo(s)"
diff --git a/po/ru_RU.po b/po/ru_RU.po
index ae5bbdb448..9ff97d9282 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -1,22 +1,22 @@
-# Russian translation for ScummVM.
-# Copyright (C) 2010-2011 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Eugene Sandulenko <sev@scummvm.org>, 2010.
-#
+# Russian translation for ScummVM.
+# Copyright (C) 2010-2011 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Eugene Sandulenko <sev@scummvm.org>, 2010.
+#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2010-06-13 20:55+0300\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-08-20 13:22+0200\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:91
#, c-format
@@ -45,10 +45,11 @@ msgid "Go up"
msgstr "²ÒÕàå"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -58,22 +59,22 @@ msgstr "¾âÜÕÝÐ"
msgid "Choose"
msgstr "²ëÑàÐâì"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "·ÐÚàëâì"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "ºÛØÚ Üëèìî"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "¿ÕàÕÝÐ×ÝÐçØâì ÚÛÐÒØèØ"
@@ -86,16 +87,17 @@ msgid "Map"
msgstr "½Ð×ÝÐçØâì"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -164,8 +166,7 @@ msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
-"Ï×ëÚ ØÓàë. ¸×ÜÕÝÕÝØÕ íâÞÓÞ ßÐàÐÜÕâàÐ ÝÕ ßàÕÒàÐâØâ ØÓàã ÝÐ ÐÝÓÛØÙáÚÞÜ Ò "
-"àãááÚãî"
+"Ï×ëÚ ØÓàë. ¸×ÜÕÝÕÝØÕ íâÞÙ ÝÐáâàÞÙÚØ ÝÕ ßàÕÒàÐâØâ ØÓàã ÝÐ ÐÝÓÛØÙáÚÞÜ Ò àãááÚãî"
#: gui/launcher.cpp:184 gui/launcher.cpp:198 gui/options.cpp:74
#: gui/options.cpp:708 gui/options.cpp:718 gui/options.cpp:1149
@@ -343,7 +344,7 @@ msgstr "ÍâÞâ ID ØÓàë ãÖÕ ØáßÞÛì×ãÕâáï. ¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔàãÓÞÙ."
msgid "~Q~uit"
msgstr "~²~ëåÞÔ"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "²ëåÞÔ Ø× ScummVM"
@@ -351,17 +352,17 @@ msgstr "²ëåÞÔ Ø× ScummVM"
msgid "A~b~out..."
msgstr "¾ ß~à~ÞÓàÐÜÜÕ..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "¾ ßàÞÓàÐÜÜÕ ScummVM"
#: gui/launcher.cpp:557
msgid "~O~ptions..."
-msgstr "~¾~ßæØØ..."
+msgstr "~½~ÐáâàÞÙÚØ..."
#: gui/launcher.cpp:557
msgid "Change global ScummVM options"
-msgstr "¸×ÜÕÝØâì ÓÛÞÑÐÛìÝëÕ ÞßæØØ ScummVM"
+msgstr "¸×ÜÕÝØâì ÓÛÞÑÐÛìÝëÕ ÝÐáâàÞÙÚØ ScummVM"
#: gui/launcher.cpp:559
msgid "~S~tart"
@@ -379,9 +380,9 @@ msgstr "~·~ÐÓàã×Øâì..."
msgid "Load savegame for selected game"
msgstr "·ÐÓàã×Øâì áÞåàÝÕÝØÕ ÔÛï ÒëÑàÐÝÝÞÙ ØÓàë"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
-msgstr "~´~ÞÑ. ØÓàã..."
+msgstr "~´~ÞÑÐÒØâì ØÓàã..."
#: gui/launcher.cpp:567 gui/launcher.cpp:574
msgid "Hold Shift for Mass Add"
@@ -389,11 +390,11 @@ msgstr "ÃÔÕàÖØÒÐÙâÕ ÚÛÐÒØèã Shift ÔÛï âÞÓÞ, çâÞÑë ÔÞÑÐÒØâì ÝÕáÚÞÛìÚÞ ØÓà"
#: gui/launcher.cpp:569
msgid "~E~dit Game..."
-msgstr "¾~ß~æØØ ØÓàë..."
+msgstr "½~Ð~áâàÞÙÚØ ØÓàë..."
#: gui/launcher.cpp:569 gui/launcher.cpp:576
msgid "Change game options"
-msgstr "¸×ÜÕÝØâì ÞßæØØ ØÓàë"
+msgstr "¸×ÜÕÝØâì ÝÐáâàÞÙÚØ ØÓàë"
#: gui/launcher.cpp:571
msgid "~R~emove Game"
@@ -403,7 +404,7 @@ msgstr "~Ã~ÔÐÛØâì ØÓàã"
msgid "Remove game from the list. The game data files stay intact"
msgstr "ÃÔÐÛØâì ØÓàã Ø× áßØáÚÐ. ½Õ ãÔÐÛïÕâ ØÓàã á ÖÕáâÚÞÓÞ ÔØáÚÐ"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~´~ÞÑ. ØÓàã..."
@@ -411,7 +412,7 @@ msgstr "~´~ÞÑ. ØÓàã..."
#: gui/launcher.cpp:576
msgctxt "lowres"
msgid "~E~dit Game..."
-msgstr "¾~ß~æØØ ØÓàë..."
+msgstr "½~Ð~á. ØÓàë..."
#: gui/launcher.cpp:578
msgctxt "lowres"
@@ -431,14 +432,14 @@ msgid "Clear value"
msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "·ÐÓàã×Øâì ØÓàã:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "·ÐÓàã×Øâì"
@@ -452,17 +453,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "´Ð"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "½Õâ"
@@ -499,37 +500,28 @@ msgstr "¼ÝÞÓÞ ØÓà..."
msgid "Mass Add..."
msgstr "¼ÝÞÓÞ ØÓà..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "½ÞÒÐï ØÓàÐ"
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "½ÞÒÐï ØÓàÐ..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... Øéã ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "¿ÞØáÚ ×ÐÚÞÝçÕÝ!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
-msgstr ""
+msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà, ßàÞßãéÕÝÞ %d àÐÝÕÕ ÔÞÑÐÒÛÕÝÝëå ØÓà."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "¿àÞáÜÞâàÕÝÞ %d ÔØàÕÚâÞàØÙ ..."
-#: gui/massadd.cpp:253
-#, fuzzy, c-format
+#: gui/massadd.cpp:268
+#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà ..."
+msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà, ßàÞßãéÕÝÞ %d àÐÝÕÕ ÔÞÑÐÒÛÕÝÝëå ØÓà ..."
#: gui/options.cpp:72
msgid "Never"
@@ -579,19 +571,19 @@ msgstr "½Õ ×ÐÔÐÝ"
#: gui/options.cpp:372
msgid "Failed to apply some of the graphic options changes:"
-msgstr ""
+msgstr "½Õ ãÔÐÛÞáì ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï ÝÕÚâÞàëå ÓàÐäØçÕáÚØå ÝÐáâàÞÕÚ:"
#: gui/options.cpp:384
msgid "the video mode could not be changed."
-msgstr ""
+msgstr "ÒØÔÕÞàÕÖØÜ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ."
#: gui/options.cpp:390
msgid "the fullscreen setting could not be changed"
-msgstr ""
+msgstr "ßÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ"
#: gui/options.cpp:396
msgid "the aspect ratio setting could not be changed"
-msgstr ""
+msgstr "àÕÖØÜ ÚÞààÕÚâØàÞÒÚØ áÞÞâÝÞèÕÝØï áâÞàÞÝ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ"
#: gui/options.cpp:705
msgid "Graphics mode:"
@@ -606,8 +598,8 @@ msgid "Special dithering modes supported by some games"
msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ"
@@ -904,7 +896,6 @@ msgid "Language of ScummVM GUI"
msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM"
#: gui/options.cpp:1295
-#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï."
@@ -956,19 +947,19 @@ msgstr "ÃÔÐÛØâì"
msgid "Do you really want to delete this savegame?"
msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì íâÞ áÞåàÐÝÕÝØÕ?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "´ÐâÐ: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "²àÕÜï: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "²àÕÜï ØÓàë: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "ÁÞåàÐÝÕÝØÕ ÑÕ× ØÜÕÝØ"
@@ -976,60 +967,60 @@ msgstr "ÁÞåàÐÝÕÝØÕ ÑÕ× ØÜÕÝØ"
msgid "Select a Theme"
msgstr "²ëÑÕàØâÕ âÕÜã"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäØÚØ"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäØÚØ"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "´ÒØÖÞÚ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ãàÞÒÕÝì ÞâÛÐÔÚØ '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "¼ÕÝî"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "¿àÞßãáâØâì"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "¿Ðã×Ð"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "¿àÞßãáâØâì áâàÞÚã"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "¾èØÑÚÐ ×ÐßãáÚÐ ØÓàë:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "½Õ ÜÞÓã ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë"
@@ -1091,26 +1082,27 @@ msgstr "´ÒØÖÞÚ ÝÕ ßÞÔÔÕàÖØÒÐÕâ áÞåàÐÝÕÝØï"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "¿àÕàÒÐÝÞ ßÞÛì×ÞÒÐâÕÛÕÜ"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "½ÕØ×ÒÕáâÝÐï ÞèØÑÚÐ"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules ·ÕÛñÝëÙ"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Hercules ÏÝâÐàÝëÙ"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules ·ÕÛñÝëÙ"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Hercules ÏÝâÐàÝëÙ"
@@ -1118,15 +1110,16 @@ msgstr "Hercules ÏÝâÐàÝëÙ"
#: engines/advancedDetector.cpp:296
#, c-format
msgid "The game in '%s' seems to be unknown."
-msgstr ""
+msgstr "ºÐÖÕâáï, çâÞ ØÓàÐ '%s' Õéñ ÝÕØ×ÒÕáâÝÐ."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
+"¿ÞÖÐÛãÙáâÐ, ßÕàÕÔÐÙâÕ áÛÕÔãîéØÕ ÔÐÝÝëÕ ÚÞÜÐÝÔÕ ScummVM ÒÜÕáâÕ á ÝÐ×ÒÐÝØÕÜ"
#: engines/advancedDetector.cpp:299
msgid "of the game you tried to add and its version/language/etc.:"
-msgstr ""
+msgstr "ØÓàë, ÚÞâÞàãî Òë ßëâÐÕâÕáì ÔÞÑÐÒØâì, Ø ãÚÐÖØâÕ Õñ ÒÕàáØî, ï×ëÚ Ø â.Ô."
#: engines/dialogs.cpp:84
msgid "~R~esume"
@@ -1162,17 +1155,17 @@ msgid "~R~eturn to Launcher"
msgstr "~²~ ÓÛÐÒÝÞÕ ÜÕÝî"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "ÁÞåàÐÝØâì ØÓàã:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "ÁÞåàÐÝØâì"
@@ -1182,40 +1175,41 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
+"¿àÞáØÜ ßàÞéÕÝØï, ÝÞ íâÞâ ÔÒØÖÞÕ ßÞÚÐ ÝÕ ßàÕÔÞáâÐÒÛïÕâ ßÞÜÞéØ ÒÝãâàØ ØÓàë. "
+"¿ÞÖÐÛãÙáâÐ, ÞÑàÐâØâÕáì Ò äÐÙÛ README ×Ð ÑÐ×ÞÒÞÙ ØÝäÞàÜÐæØÕÙ, Ð âÐÚÖÕ "
+"ØÝáâàãÚæØïÜØ Þ âÞÜ, ÚÐÚ ßÞÛãçØâì ÔÐÛìÝÕÙèãî ßÞÜÞéì."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "¾~â~ÜÕÝÐ"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~º~ÛÐÒØèØ"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
-msgstr ""
+msgstr "½Õ ÜÞÓã ØÝØæØÐÛØ×ØàÞÒÐâì äÞàÜÐâ æÒÕâÐ."
-#: engines/engine.cpp:228
-#, fuzzy
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
-msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ:"
+msgstr "½Õ ãÔÐÛÞáì ßÕàÕÚÛîçØâì ÒØÔÕÞàÕÖØÜ: '"
-#: engines/engine.cpp:237
-#, fuzzy
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
-msgstr "¿ÕàÕÚÛîçÕÝØÕ ÚÞààÕÚæØØ áÞÞâÝÞèÕÝØï áâÞàÞÝ"
+msgstr "½Õ ãÔÐÛÞáì ØáßÞÛì×ÞÒÐâì ÚÞààÕÚæØî áÞÞâÝÞèÕÝØï áâÞàÞÝ."
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
-msgstr ""
+msgstr "½Õ ÜÞÓã ßàØÜÕÝØâì ßÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1223,8 +1217,13 @@ msgid ""
"the data files to your hard disk instead.\n"
"See the README file for details."
msgstr ""
+"ºÐÖÕâáï, Òë ßëâÐÕâÕáì ×ÐßãáâØâì íâã ØÓàã ßàïÜÞ\n"
+"á CD. ÍâÞ ÞÑëçÝÞ Òë×ëÒÐÕâ ßàÞÑÛÕÜë, Ø ßÞíâÞÜã\n"
+"Üë àÕÚÞÜÕÝÔãÕÜ áÚÞßØàÞÒÐâì äÐÙÛë ÔÐÝÝëå ØÓàë\n"
+"ÝÐ ÖñáâÚØÙ ÔØáÚ. ¿ÞÔàÞÑÝÞáâØ ÜÞÖÝÞ ÝÐÙâØ Ò\n"
+"äÐÙÛÕ README."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1232,31 +1231,141 @@ msgid ""
"order to listen to the game's music.\n"
"See the README file for details."
msgstr ""
+"´ØáÚ íâÞÙ ØÓàë áÞÔÕàÖØâ ×ÒãÚÞÒëÕ ÔÞàÞÖÚØ. ¸å\n"
+"ÝÕÞÑåÞÔØÜÞ ßÕàÕßØáÐâì á ÔØáÚÐ á ßÞÜÞéìî\n"
+"áÞÞâÒÕâáâÒãîéÕÙ ßàÞÓàÐÜÜë ÔÛï ÚÞßØàÞÒÐÝØï\n"
+"ÐãÔØÞ ÔØáÚÞÒ, Ø âÞÛìÚÞ ßÞáÛÕ íâÞÓÞ Ò ØÓàÕ\n"
+"ßÞïÒØâáï Üã×ëÚÐ. ¿ÞÔàÞÑÝÞáâØ ÜÞÖÝÞ ÝÐÙâØ Ò\n"
+"äÐÙÛÕ README."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"¿Àµ´Ã¿Àµ¶´µ½¸µ: ¸ÓàÐ, ÚÞâÞàãî Òë áÞÑØàÐÕâÕáì ×ÐßãáâØâì Õéñ ÝÕ ßÞÔÔÕàÖØÒÐÕâáï "
+"ScummVM ßÞÛÝÞáâìî. ¾ÝÐ áÚÞàÕÕ ÒáÕÓÞ ÝÕ ÑãÔÕâ àÐÑÞâÐâì áâÐÑØÛìÝÞ, Ø "
+"áÞåàÐÝÕÝØï ØÓà ÜÞÓãâ ÝÕ àÐÑÞâÐâì Ò ÑãÔãéØå ÒÕàáØïå ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "²áñ àÐÒÝÞ ×ÐßãáâØâì"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "²áâÐÒìâÕ ÔØáÚ %c Ø ÝÐÖÜØâÕ ÚÛÐÒØèã çâÞÑë ßàÞÔÞÛÖØâì."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "½Õ ãÔÐÛÞáì ÝÐÙâØ %s, (%c%d) ½ÐÖÜØâÕ ÚÛÐÒØèã."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "¾èØÑÚÐ çâÕÝØï ÔØáÚÐ %c, (%c%d) ½ÐÖÜØâÕ ÚÛÐÒØèã."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "¸ÓàÐ ÞáâÐÝÞÒÛÕÝÐ. ½ÐÖÜØâÕ ßàÞÑÕÛ çâÞÑë ßàÞÔÞÛÖØâì."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "²ë ãÒÕàÕÝë, çâÞ åÞâØâÕ ÝÐçÐâì áÝÞÒÐ? (Y/N)"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "²ë ãÒÕàÕÝë, çâÞ åÞâØâÕ ÒëÙâØ? (Y/N)"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "¸ÓàÐâì"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "²ëåÞÔ"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "²áâÐÒìâÕ ÔØáÚ á áÞåàÐÝÕÝØïÜØ"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "²ë ÔÞÛÖÝë ÒÒÕáâØ ØÜï"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "¸ÓàÐ ½µ ±Ë»° ×ÐßØáÐÝÐ (ÔØáÚ ßÞÛÞÝ?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "¸ÓàÐ ½µ ±Ë»° ×ÐÓàãÖÕÝÐ"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "ÁÞåàÐÝïî '%s'"
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "·ÐÓàãÖÐî '%s'"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "½Ð×ÞÒØâÕ áÞåàÐÝÕÝØÕ ØÓàë"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "²ëÑÕàØâÕ ØÓàã ÔÛï ×ÐÓàã×ÚØ"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "½Ð×ÒÐÝØÕ ØÓàë)"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~¿~àÕÔ"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~Á~ÛÕÔ"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~·~ÐÚàëâì"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "ÂÞÛìÚÞ Þ×ÒãçÚÐ"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "¾×ÒãçÚÐ Ø áãÑâØâàë"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "ÂÞÛìÚÞ áãÑâØâàë"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "¾×ÒãçÚÐ Ø âÕÚáâ"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "¾ÑéØÕ ÚÛÐÒØÐâãàÝëÕ ÚÞÜÐÝÔë:"
@@ -1307,14 +1416,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "ÁÞåàÐÝØâì ØÓàã 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "²ëåÞÔ"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "²ÒÞÔ"
@@ -1325,11 +1426,11 @@ msgstr "¿ÕàÕÚÛîçØâì ÝÐ ÒÕáì íÚàÐÝ"
#: engines/scumm/help.cpp:87
msgid "Music volume up / down"
-msgstr "³àÞÜÚÞáâì Üã×ëÚØ ãÒÕÛØçØâì/ãÜÕÝìèØâì"
+msgstr "³àÞÜÚÞáâì Üã×ëÚØ ãÒÕÛØçØâì / ãÜÕÝìèØâì"
#: engines/scumm/help.cpp:88
msgid "Text speed slower / faster"
-msgstr "ÁÚÞàÞáâì âÕÚáâÐ ÑëáâàÕÕ/ÜÕÔÛÕÝÝÕÕ"
+msgstr "ÁÚÞàÞáâì âÕÚáâÐ ÑëáâàÕÕ / ÜÕÔÛÕÝÝÕÕ"
#: engines/scumm/help.cpp:89
msgid "Simulate left mouse button"
@@ -1349,7 +1450,7 @@ msgstr "ÁßÕæØÐÛìÝÒÕ ÚÛÐÒØÐâãàÝëÕ ÚÞÜÐÝÔë:"
#: engines/scumm/help.cpp:94
msgid "Show / Hide console"
-msgstr "¿ÞÚÐ×Ðâì/ÃÑàÐâì ÚÞÝáÞÛì"
+msgstr "¿ÞÚÐ×Ðâì / ÃÑàÐâì ÚÞÝáÞÛì"
#: engines/scumm/help.cpp:95
msgid "Start the debugger"
@@ -1396,7 +1497,6 @@ msgid " since they may cause crashes"
msgstr " âÐÚ ÚÐÚ ÞÝØ ÜÞÓãâ ßàØÒÕáâØ Ú"
#: engines/scumm/help.cpp:110
-#, fuzzy
msgid " or incorrect game behavior."
msgstr " ÝÕÒÕàÝÞÙ àÐÑÞâÕ ØÓàë."
@@ -1419,14 +1519,14 @@ msgid "Pull"
msgstr "ÂïÝãâì"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "´Ðâì"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "¾âÚàëâì"
@@ -1439,9 +1539,9 @@ msgid "Get"
msgstr "²×ïâì"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "¸áßÞÛì×ÞÒÐâì"
@@ -1464,13 +1564,13 @@ msgid "Turn off"
msgstr "²ëÚÛîçØâì"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "¸ÔâØ Ú"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "¿ÞÔÝïâì"
@@ -1498,11 +1598,11 @@ msgstr "¸áßàÐÒØâì"
msgid "Switch"
msgstr "¿ÕàÕÚÛîçØâì"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "ÁÜÞâàÕâì"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "³ÞÒÞàØâì"
@@ -1514,277 +1614,281 @@ msgstr "¿ãâÕèÕáâÒÞÒÐâì"
msgid "To Henry / To Indy"
msgstr "³ÕÝàØ/¸ÝÔØ"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "ØÓàÐâì ÔÞ ÜØÝÞà ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "ØÓàÐâì àÕ ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "ØÓàÐâì ÜØ ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "ØÓàÐâì äÐ ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "ØÓàÐâì áÞÛì ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "ØÓàÐâì Ûï ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "ØÓàÐâì áØ ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "ØÓàÐâì ÔÞ ÜÐÖÞà ÝÐ ßàïÛÚÕ"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "âÞÛÚÐâì"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "âïÝãâì (æÕßÛïâì)"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "³ÞÒÞàØâì á"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "ÁÜÞâàÕâì ÝÐ"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "ÒÚÛîçØâì"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "ÒëÚÛîçØâì"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "²ÒÕàå"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "¿ÞÔáÒÕâØâì ßàÕÔëÔãéØÙ ÔØÐÛÞÓ"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "²ÝØ×"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "¿ÞÔáÒÕâØâì áÛÕÔãîéØÙ ÔØÐÛÞÓ"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "¸ÔâØ"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "¸ÝÒÕÝâÐàì"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "¾ÑêÕÚâ"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
-msgstr "ÇÕàÝÞ-ÑÕÛëÙ/ÆÒÕâÝÞÙ"
+msgstr "ÇÕàÝÞ-ÑÕÛëÙ / ÆÒÕâÝÞÙ"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "³ÛÐ×Ð"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Ï×ëÚ"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "ÃÔÐà"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "½ÞÓÞÙ"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "¿àÞÒÕàØâì"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "¾ÑëçÝëÙ ÚãàáÞà"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "ºÞÜÜ"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
-msgstr "·ÐÓàã×Øâì/ÁÞåàÐÝØâì/½ÐáâàÞÙÚØ"
+msgstr "·ÐÓàã×Øâì / ÁÞåàÐÝØâì / ½ÐáâàÞÙÚØ"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "¾áâÐÛìÝÞÕ ãßàÐÒÛÕÝØÕ ØÓàÞÙ:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "¸ÝÒÕÝâÐàì:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "¿àÞÚàãâØâì áßØáÞÚ ÒÒÕàå"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "¿àÞÚàãâØâì áßØáÞÚ ÒÝØ×"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "²ÕàåÝØÙ ÛÕÒëÙ ßàÕÔÜÕâ"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "½ØÖÝØÙ ÛÕÒëÙ ßàÕÔÜÕâ"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "²ÕàåÝØÙ ßàÐÒëÙ ßàÕÔÜÕâ"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "½ØÖÝØÙ ßàÐÒëÙ ßàÕÔÜÕâ"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "ÁàÕÔÝØÙ ÛÕÒëÙ ßàÕÔÜÕâ"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "ÁàÕÔÝØÙ ßàÐÒëÙ ßàÕÔÜÕâ"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "ÁÜÕÝÐ ÓÕàÞï:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "²âÞàÞÙ ÓÕàÞÙ"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "ÂàÕâØÙ ÓÕàÞÙ"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "ÃßàÐÒÛÕÝØÕ ÑÞÕÜ (æØäàÞÒëÕ ÚÛÐÒØèØ)"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "ÈÐÓ ÝÐ×ÐÔ"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "·ÐéØâÐ áÒÕàåã"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "·ÐéØâÐ ßÞáÕàÕÔØÝÕ"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "·ÐéØâÐ áÝØ×ã"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "ÃÔÐà áÒÕàåã"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "ÃÔÐà ßÞáÕàÕÔØÝÕ"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "ÃÔÐà áÝØ×ã"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "ÍâÞ ÚÞÓÔÐ ¸ÝÔØ áÛÕÒÐ."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "ºÞÓÔÐ ¸ÝÔØ áßàÐÒÐ,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4 Ø 1 ÜÕÝïîâáï á"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6 Ø 3 áÞÞâÒÕâáâÒÕÝÝÞ."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "ÃßàÐÒÛÕÝØÕ áÐÜÞÛñâÞÜ (æØäàÞÒëÕ ÚÛÐÒØèØ)"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "»ÕâÕâì ÒÛÕÒÞ-ÒÒÕàå"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "»ÕâÕâì ÒÛÕÒÞ"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "»ÕâÕâì ÒÛÕÒÞ-ÒÝØ×"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "»ÕâÕâì ÒÒÕàå"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "»ÕâÕâì ßàïÜÞ"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "»ÕâÕâì ÒÝØ×"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "»ÕâÕâì ÒßàÐÒÞ-ÒÒÕàå"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "»ÕâÕâì ÒßàÐÒÞ"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "»ÕâÕâì ÒßàÐÒÞ-ÒÝØ×"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
+"ÀÕÖØÜ \"àÞÔÝÞÓÞ\" MIDI âàÕÑãÕâ ÞÑÝÞÒÛÕÝØÕ Roland Upgrade Þâ\n"
+"LucasArts, ÝÞ ÝÕ åÒÐâÐÕâ %s. ¿ÕàÕÚÛîçÐîáì ÝÐ AdLib."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1795,7 +1899,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1806,7 +1910,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1817,81 +1921,71 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
"directory inside the Tentacle game directory."
msgstr ""
-"ÁÕÙçÐá ÔÞÛÖÝÐ ×ÐßãáâØâìáï ØÓàÐ Maniax Mansion. ½Þ ScummVM ßÞÚÐ íâÞ ÝÕ ãÜÕÕâ. "
-"ÇâÞÑë áëÓàÐâì, ÝÐÖÜØâÕ '½ÞÒÐï ØÓàÐ' Ò áâÐàâÞÒÞÜ ÜÕÝî ScummVM, Ð ×ÐâÕÜ "
+"ÁÕÙçÐá ÔÞÛÖÝÐ ×ÐßãáâØâìáï ØÓàÐ Maniac Mansion. ½Þ ScummVM ßÞÚÐ íâÞÓÞ ÝÕ "
+"ãÜÕÕâ. ÇâÞÑë áëÓàÐâì, ÝÐÖÜØâÕ '½ÞÒÐï ØÓàÐ' Ò áâÐàâÞÒÞÜ ÜÕÝî ScummVM, Ð ×ÐâÕÜ "
"ÒëÑÕàØâÕ ÔØàÕÚâÞàØî Maniac ÒÝãâàØ ÔØàÕÚâÞàØØ á ØÓàÞÙ Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "ÀÕÖØÜ ÑëáâàÞÓÞ ßÕàÕåÞÔÐ ÐÚâØÒØàÞÒÐÝ"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "¿ÕàÕåÞÔë ÐÚâØÒØàÞÒÐÝë"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "²ëÑàÞáØâì áâàÐÝØæã"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "¿ÞÚÐ×Ðâì ÚÐàâã"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "³ÛÐÒÝÞÕ ÜÕÝî"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "ÍääÕÚâë ÒÞÔë ÒÚÛîçÕÝë"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
-msgstr "²ÞááâÐÝÞÒØâì ØÓàã: "
+msgstr "²ÞááâÐÝÞÒØâì ØÓàã:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "²ÞááâÒÝÞÒØâì"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
-msgstr ""
+msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ÝÐÙÔÕÝ!"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
-#, fuzzy
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
-msgstr ""
-"½Õ ãÔÐÛÞáì ×ÐÓàã×Øâì ØÓàã Ø× äÐÙÛÐ:\n"
-"\n"
-"%s"
+msgstr "½Õ ãÔÐÛÞáì ×ÐÓàã×Øâì áÞåàÐÝñÝÝãî ØÓàã Ø× äÐÙÛÐ."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
-#, fuzzy
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
-msgstr ""
-"½Õ ãÔÐÛÞáì ×ÐßØáÐâì ØÓàã Ò äÐÙÛ:\n"
-"\n"
-"%s"
+msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã Ò äÐÙÛ."
#: engines/gob/inter_v5.cpp:107
-#, fuzzy
msgid "Failed to delete file."
-msgstr ""
-"½Õ ãÔÐÛÞáì ×ÐßØáÐâì ØÓàã Ò äÐÙÛ:\n"
-"\n"
-"%s"
+msgstr "½Õ ãÔÐÛÞáì ãÔÐÛØâì äÐÙÛ."
-#: engines/groovie/script.cpp:417
-#, fuzzy
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
-msgstr ""
-"½Õ ãÔÐÛÞáì ×ÐßØáÐâì ØÓàã Ò äÐÙÛ:\n"
-"\n"
-"%s"
+msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã"
#: engines/kyra/sound_midi.cpp:475
msgid ""
@@ -1901,36 +1995,46 @@ msgid ""
"General MIDI ones. After all it might happen\n"
"that a few tracks will not be correctly played."
msgstr ""
+"ºÐÖÕâáï, Òë ßëâÐÕâÕáì ØáßÞÛì×ÞÒÐâì ãáâàÞÙáâÒÞ\n"
+"General MIDI, ÝÞ íâÐ ØÓàÐ ßÞÔÔÕàÖØÒÐÕâ âÞÛìÚÞ\n"
+"Roland MT32 MIDI. ¼ë ßÞßàÞÑãÕÜ ßÞÔÞÑàÐâì General\n"
+"MIDI ØÝáâàãÜÕÝâë, ßÞåÞÖØÕ ÝÐ Roland MT32, ÝÞ\n"
+"ÜÞÖÕâ âÐÚ ßÞÛãçØâìáï, çâÞ ÝÕÚÞâÞàëÕ âàÕÚØ ÑãÔãâ\n"
+"áëÓàÐÝë ÝÕÒÕàÝÞ."
#: engines/m4/m4_menus.cpp:138
-#, fuzzy
msgid "Save game failed!"
-msgstr "ÁÞåàÐÝØâì ØÓàã:"
+msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã!"
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
"Please download it from www.scummvm.org"
msgstr ""
+"¾âáãâáâÒãÕâ äÐÙÛ sky.cpt!\n"
+"¿ÞÖÐÛãÙáâÐ, áÚÐçÐÙâÕ ÕÓÞ á www.scummvm.org"
#: engines/sky/compact.cpp:141
msgid ""
"The \"sky.cpt\" file has an incorrect size.\n"
"Please (re)download it from www.scummvm.org"
msgstr ""
+"ÄÐÙÛ sky.cpt ØÜÕÕâ ÝÕÒÕàÝëÙ àÐ×ÜÕà.\n"
+"¿ÞÖÐÛãÙáâÐ, áÚÐçÐÙâÕ ÕÓÞ ×ÐÝÞÒÞ á www.scummvm.org"
#: engines/sword1/animation.cpp:344 engines/sword2/animation.cpp:379
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
+"½ÐÙÔÕÝë ×ÐáâÐÒÚØ Ò äÞàÜÐâÕ DXA, ÝÞ ScummVM ÑëÛ áÞÑàÐÝ ÑÕ× ßÞÔÔÕàÖÚØ zlib"
#: engines/sword1/animation.cpp:354 engines/sword2/animation.cpp:389
msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
+msgstr "·ÐáâÐÒÚØ Ò äÞàÜÐâÕ MPEG2 ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐîâáï"
#: engines/sword1/animation.cpp:359 engines/sword2/animation.cpp:397
#, c-format
msgid "Cutscene '%s' not found"
-msgstr ""
+msgstr "·ÐáâÐÒÚÐ '%s' ÝÕ ÝÐÙÔÕÝÐ"
#: engines/sword1/control.cpp:863
msgid ""
@@ -1942,6 +2046,12 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
+"ScummVM ÞÑÝÐàãÖØÛ ã ÒÐá áÞåàÐÝÕÝØï ØÓàë ÁÛÞÜÐÝÝëÙ ¼Õç Ò áâÐàÞÜ äÞàÜÐâÕ.\n"
+"ÁâÐàëÙ äÞàÜÐâ ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐÕâáï, Ø çâÞÑë ×ÐÓàã×Øâì áÞåàÐÝÕÝØï, ÞÝØ "
+"ÔÞÛÖÝë Ñëâì ßÕàÕÒÕÔÕÝë Ò ÝÞÒëÙ äÞàÜÐâ.\n"
+"\n"
+"½ÐÖÜØâÕ ¾º, çâÞÑë ßÕàÕÒÕáâØ Øå Ò ÝÞÒëÙ äÞàÜÐâ áÕÙçÐá, Ò ßàÞâØÒÝÞÜ áÛãçÐÕ íâÞ "
+"áÞÞÑéÕÝØÕ ßÞïÒØâáï áÝÞÒÐ ßàØ áÛÕÔãîéÕÜ ×ÐßãáÚÕ ØÓàë.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -1949,18 +2059,20 @@ msgid ""
"Target new save game already exists!\n"
"Would you like to keep the old save game (%s) or the new one (%s)?\n"
msgstr ""
+"ÁÞåàÐÝÕÝØÕ ØÓàë á âÐÚØÜ ØÜÕÝÕÜ ãÖÕ áãéÕáâÒãÕâ!\n"
+"²ë åÞâØâÕ ÞáâÐÒØâì áâÐàÞÕ ÝÐ×ÒÐÝØÕ (%s) ØÛØ áÔÕÛÐâì ÝÞÒÞÕ (%s)?\n"
#: engines/sword1/control.cpp:1235
msgid "Keep the old one"
-msgstr ""
+msgstr "¾áâÐÒØâì áâÐàÞÕ"
#: engines/sword1/control.cpp:1235
msgid "Keep the new one"
-msgstr ""
+msgstr "ÁÔÕÛÐâì ÝÞÒÞÕ"
#: engines/sword1/logic.cpp:1633
msgid "This is the end of the Broken Sword 1 Demo"
-msgstr ""
+msgstr "ÍâÞ ×ÐÒÕàèÕÝØÕ ÔÕÜÞ ÁÛÞÜÐÝÝÞÓÞ ¼ÕçÐ 1"
#: engines/parallaction/saveload.cpp:133
#, c-format
@@ -1968,16 +2080,16 @@ msgid ""
"Can't save game in slot %i\n"
"\n"
msgstr ""
+"½Õ ÜÞÓã áÞåàÐÝØâì ØÓàã Ò ßÞ×ØæØî %i\n"
+"\n"
#: engines/parallaction/saveload.cpp:211
-#, fuzzy
msgid "Loading game..."
-msgstr "·ÐÓàã×Øâì ØÓàã:"
+msgstr "·ÐÓàãÖÐî ØÓàã..."
#: engines/parallaction/saveload.cpp:226
-#, fuzzy
msgid "Saving game..."
-msgstr "ÁÞåàÐÝØâì ØÓàã:"
+msgstr "ÁÞåàÐÝïî ØÓàã..."
#: engines/parallaction/saveload.cpp:279
msgid ""
@@ -1988,10 +2100,16 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
+"ScummVM ÞÑÝÐàãÖØÛ ã ÒÐá áâÐàëÕ áÞåàÐÝÕÝØï ØÓàë Nippon Safes, ÚÞâÞàëÕ "
+"ÝÕÞÑåÞÔØÜÞ ßÕàÕØÜÕÝÞÒÐâì.ÁâÐàëÕ ÝÐ×ÒÐÝØï ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐîâáï, Ø ßÞíâÞÜã "
+"Òë ÝÕ áÜÞÖÕâÕ ×ÐÓàã×Øâì áÞåàÐÝÕÝØï, ÕáÛØ ÝÕ ßÕàÕØÜÕÝãÕâÕ Øå.\n"
+"\n"
+"½ÐÖÜØâÕ ¾º, çâÞÑë ßÕàÕØÜÕÝÞÒÐâì Øå áÕÙçÐá, Ò ßàÞâØÒÝÞÜ áÛãçÐÕ íâÞ ÖÕ "
+"áÞÞÑéÕÝØÕ ßÞïÒØâáï ßàØ áÛÕÔãîéÕÜ ×ÐßãáÚÕ ØÓàë.\n"
#: engines/parallaction/saveload.cpp:326
msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
+msgstr "ScummVM ãáßÕèÝÞ ßàÕÞÑàÐ×ÞÒÐÛ ÒáÕ ÒÐèØ áÞåàÐÝÕÝØï ØÓà."
#: engines/parallaction/saveload.cpp:328
msgid ""
@@ -2000,6 +2118,10 @@ msgid ""
"\n"
"Please report to the team."
msgstr ""
+"ScummVM ÝÐßØáÐÛ ÝÕáÚÞÛìÚÞ ßàÕÔãßàÕÖÔÕÝØÙ Ò ÞÚÝÞ ÚÞÝáÞÛØ, Ø ÝÕ áÜÞÓ "
+"ßàÕÞÑàÐ×ÞÒÐâì ÒáÕ äÐÙÛë.\n"
+"\n"
+"¿ÞÖÐÛãÙáâÐ, áÞÞÑéØâÕ ÞÑ íâÞÜ ÚÞÜÐÝÔÕ ScummVM."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2009,33 +2131,46 @@ msgstr "ÍÜãÛïâÞà MAME OPL"
msgid "DOSBox OPL emulator"
msgstr "ÍÜãÛïâÞà DOSBox OPL"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"²ëÑàÐÝÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÑëÛÞ ÝÐÙÔÕÝÞ (ÒÞ×ÜÞÖÝÞ ÞÝÞ ÒëÚÛîçÕÝÞ "
+"ØÛØ ÝÕ ßÞÔÚÛîçÕÝÞ)."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "¿ëâÐîáì ØáßÞÛì×ÞÒÐâì ÔàãÓÞÕ ÔÞáâãßÝÞÕ ãáâàÞÙáâÒÞ..."
+
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"²ëÑàÐÝÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÜÞÖÕâ Ñëâì ØáßÞÛì×ÞÒÐÝÞ. ÁÜÞâàØâÕ äÐÙÛ "
+"ßàÞâÞÚÞÛÐ ÔÛï ÑÞÛÕÕ ßÞÔàÞÑÝÞÙ ØÝäÞàÜÐæØØ."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"¿àÕÔßÞçâØâÕÛìÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÑëÛÞ ÝÐÙÔÕÝÞ (ÒÞ×ÜÞÖÝÞ ÞÝÞ "
+"ÒëÚÛîçÕÝÞ ØÛØ ÝÕ ßÞÔÚÛîçÕÝÞ)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"¿àÕÔßÞçâØâÕÛìÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÜÞÖÕâ Ñëâì ØáßÞÛì×ÞÒÐÝÞ. "
+"ÁÜÞâàØâÕ äÐÙÛ ßàÞâÞÚÞÛÐ ÔÛï ÑÞÛÕÕ ßÞÔàÞÑÝÞÙ ØÝäÞàÜÐæØØ."
#: audio/null.h:43
msgid "No music"
@@ -2058,7 +2193,6 @@ msgid "C64 Audio Emulator"
msgstr "ÍÜãÛïâÞà ×ÒãÚÐ C64"
#: audio/softsynth/mt32.cpp:329
-#, fuzzy
msgid "Initializing MT-32 Emulator"
msgstr "½ÐáâàÐØÒÐî íÜãÛïâÞà MT-32"
@@ -2167,14 +2301,12 @@ msgid "Disable power off"
msgstr "·ÐßàÕâØâì ÒëÚÛîçÕÝØÕ"
#: backends/platform/iphone/osys_events.cpp:338
-#, fuzzy
msgid "Mouse-click-and-drag mode enabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒÚÛîçÕÝ."
+msgstr "ÀÕÖØÜ ÜëèØ ÝÐÖÐâì-Ø-âïÝãâì ÒÚÛîçÕÝ."
#: backends/platform/iphone/osys_events.cpp:340
-#, fuzzy
msgid "Mouse-click-and-drag mode disabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒëÚÛîçÕÝ."
+msgstr "ÀÕÖØÜ ÜëèØ ÝÐÖÐâì-Ø-âïÝãâì ÒëÚÛîçÕÝ."
#: backends/platform/iphone/osys_events.cpp:351
msgid "Touchpad mode enabled."
@@ -2184,6 +2316,27 @@ msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒÚÛîçÕÝ."
msgid "Touchpad mode disabled."
msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒëÚÛîçÕÝ."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "ÁßàïâÐâì ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "ÁßàïâÐâì ´àãÓØÕ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "¿ÞÚÐ×Ðâì Òáñ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "¾ÚÝÞ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "¼ØÝØÜØ×ØàÞÒÐâì"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "±Õ× ãÒÕÛØçÕÝØï"
@@ -2193,57 +2346,52 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "±Õ× ãÒÕÛØçÕÝØï"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
-msgstr "¿ÕàÕÚÛîçÕÝØÕ ÚÞààÕÚæØØ áÞÞâÝÞèÕÝØï áâÞàÞÝ"
+msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒÚÛîçÕÝÐ"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
-msgstr "¿ÕàÕÚÛîçÕÝØÕ ÚÞààÕÚæØØ áÞÞâÝÞèÕÝØï áâÞàÞÝ"
+msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒëÚÛîçÕÝÐ"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
-msgstr "¿ÕàÕÚÛîçÕÝØÕ ÜÕÖÔã ÓàÐäØçÕáÚØÜØ äØÛìâàÐÜØ"
+msgstr "°ÚâØÒÝëÙ ÓàÐäØçÕáÚØÙ äØÛìâà:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
-msgstr "ÀÕÖØÜ àÐáâàÐ:"
+msgstr "¾ÚÞÝÝëÙ àÕÖØÜ"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL ÑÕ× ãÒÕÛØçÕÝØï"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL á áÞåàÐÝÕÝØÕÜ"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL Ø×ÝÐçÐÛìÝëÙ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
-#, fuzzy
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
-msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ:"
+msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
-msgstr ""
+msgstr "ÂÕÚãéØÙ ÜÐáèâÐÑ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
-msgstr ""
+msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: »ØÝÕÙÝëÙ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
-msgstr ""
+msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: ±ÛØÖÐÙèØÙ"
#: backends/platform/symbian/src/SymbianActions.cpp:38
#: backends/platform/wince/CEActionsSmartphone.cpp:39
@@ -2268,11 +2416,13 @@ msgstr "²ßàÐÒÞ"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "»ÕÒëÙ éÕÛçÞÚ"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "¿àÐÒëÙ éÕÛçÞÚ"
@@ -2317,7 +2467,7 @@ msgstr "½Ð×ÝÐçÕÝØÕ ÚÛÐÒØè"
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
msgid "Do you want to quit ?"
-msgstr "²ë åÞâØâÕ ÒëÙâØ?"
+msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒëÙâØ?"
#: backends/platform/wii/options.cpp:51
msgid "Video"
@@ -2436,17 +2586,15 @@ msgid "Network down"
msgstr "ÁÕâì ÒëÚÛîçÕÝÐ"
#: backends/platform/wii/options.cpp:178
-#, fuzzy
msgid "Initializing network"
msgstr "½ÐáâàÐØÒÐî áÕâì"
#: backends/platform/wii/options.cpp:182
-#, fuzzy
msgid "Timeout while initializing network"
msgstr "²àÕÜï ßÞÔÚÛîçÕÝØï Ú áÕâØ ØáâÕÚÛÞ"
#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
+#, c-format
msgid "Network not initialized (%d)"
msgstr "ÁÕâì ÝÕ ÝÐáâàÞØÛÐáì (%d)"
@@ -2503,13 +2651,13 @@ msgstr "ºãàáÞà ÒÛÕÒÞ"
msgid "Cursor Right"
msgstr "ºãàáÞà ÒßàÐÒÞ"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "²ë åÞâØâÕ ×ÐÓàã×Øâì ÛØÑÞ áÞåàÐÝØâì ØÓàã?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " ²ë ãÒÕàÕÝë, çâÞ åÞâØâÕ ÒëÙâØ? "
@@ -2521,43 +2669,43 @@ msgstr "ºÛÐÒØÐâãàÐ"
msgid "Rotate"
msgstr "¿ÞÒÕàÝãâì"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "¸áßÞÛì×ãî ÔàÐÙÒÕà SDL "
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "¿ÞÚÐ×Ðâì "
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "²ë åÞâØâÕ ßàÞØ×ÒÕáâØ ÐÒâÞÜÐâØçÕáÚØÙ ßÞØáÚ?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ßÞ ßàÐÒÞÜã éÕÛçÚã"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr "²ë ÔÞÛÖÝë ÝÐ×ÝÐçØâì ÚÛÐÒØèã ÝÐ ÔÕÙáâÒØÕ 'Right Click' ÔÛï íâÞÙ ØÓàë"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ 'áßàïâÐâì ßÐÝÕÛì ØÝáâàãÜÕÝâÞÒ'"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr "²ë ÔÞÛÖÝë ÝÐ×ÝÐçØâì ÚÛÐÒØèã ÝÐ ÔÕÙâáâÒØÕ 'Hide toolbar' ÔÛï íâÞÙ ØÓàë"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ÃÒÕÛØçØâì ¼ÐáèâÐÑ (ÝÕÞÑï×ÐâÕÛìÝÞ)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ÃÜÕÝìèØâì ¼ÐáèâÐÑ (ÝÕÞÑï×ÐâÕÛìÝÞ)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2565,55 +2713,93 @@ msgstr ""
"ØÝÒÕÝâÐàì Ò ØÓàÕ"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Do you really want to return to the Launcher?"
-msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì íâÞ áÞåàÐÝÕÝØÕ?"
+msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒÕàÝãâìáï Ò ÓÛÐÒÝÞÕ ÜÕÝî?"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Launcher"
-msgstr "ÃÔÐà"
+msgstr "³ÛÐÒÝÞÕ ÜÕÝî"
#: backends/events/default/default-events.cpp:244
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "²ë åÞâØâÕ ÒëÙâØ?"
+msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒëÙâØ?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
+msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - »ÕÒëÙ ÚÛØÚ"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
+msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÐÒëÙ ÚÛØÚ"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
+msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÞÛñâ (ÑÕ× ÚÛØÚÐ)"
-#: backends/events/gph/gph-events.cpp:390
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
-msgstr "³àÞÜÚÞáâì"
+msgstr "¼ÐÚáØÜÐÛìÝÐï ÓàÞÜÚÞáâì"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
-msgstr ""
+msgstr "ÃÒÕÛØçÕÝØÕ ÓàÞÜÚÞáâØ"
-#: backends/events/gph/gph-events.cpp:398
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
-msgstr "³àÞÜÚÞáâì"
+msgstr "¼ØÝØÜÐÛìÝÐï ÓàÞÜÚÞáâì"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
-msgstr ""
+msgstr "ÃÜÕÝìèÕÝØÕ ÓàÞÜÚÞáâØ"
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "¿àÞÒÕàïî ÞÑÝÞÒÛÕÝØï..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "¾ÔØÝ ßàÐÒëÙ éÕÛçÞÚ"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "ÂÞÛìÚÞ ßÕàÕÜÕáâØâì"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "ºÛÐÒØèÐ ESC"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "¼ÕÝî ØÓàë"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "ÃßàÐÒÛÕÝØÕ Üëèìî"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "ÉÕÛçÚØ ÒÚÛîçÕÝë"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "ÉÕÛçÚØ ÒëÚÛîçÕÝë"
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "´ÞÑ. ØÓàã"
+
+#~ msgid "Add Game..."
+#~ msgstr "´ÞÑÐÒØâì ØÓàã..."
#~ msgid "Discovered %d new games."
#~ msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà."
diff --git a/po/scummvm.pot b/po/scummvm.pot
index 7abb933cb1..a94e0ab705 100644
--- a/po/scummvm.pot
+++ b/po/scummvm.pot
@@ -8,10 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.4.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\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"
+"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -43,10 +44,11 @@ msgid "Go up"
msgstr ""
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -56,22 +58,22 @@ msgstr ""
msgid "Choose"
msgstr ""
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr ""
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr ""
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr ""
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr ""
@@ -84,16 +86,17 @@ msgid "Map"
msgstr ""
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr ""
@@ -337,7 +340,7 @@ msgstr ""
msgid "~Q~uit"
msgstr ""
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr ""
@@ -345,7 +348,7 @@ msgstr ""
msgid "A~b~out..."
msgstr ""
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr ""
@@ -373,7 +376,7 @@ msgstr ""
msgid "Load savegame for selected game"
msgstr ""
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr ""
@@ -397,7 +400,7 @@ msgstr ""
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr ""
@@ -425,14 +428,14 @@ msgid "Clear value"
msgstr ""
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr ""
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr ""
@@ -444,17 +447,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr ""
@@ -491,34 +494,25 @@ msgstr ""
msgid "Mass Add..."
msgstr ""
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr ""
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr ""
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr ""
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr ""
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr ""
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
@@ -598,8 +592,8 @@ msgid "Special dithering modes supported by some games"
msgstr ""
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr ""
@@ -931,19 +925,19 @@ msgstr ""
msgid "Do you really want to delete this savegame?"
msgstr ""
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr ""
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr ""
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr ""
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr ""
@@ -951,60 +945,60 @@ msgstr ""
msgid "Select a Theme"
msgstr ""
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr ""
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr ""
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr ""
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr ""
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr ""
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr ""
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr ""
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr ""
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr ""
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr ""
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr ""
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr ""
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr ""
@@ -1072,20 +1066,21 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr ""
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr ""
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr ""
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr ""
@@ -1137,17 +1132,17 @@ msgid "~R~eturn to Launcher"
msgstr ""
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr ""
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr ""
@@ -1158,37 +1153,37 @@ msgid ""
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr ""
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr ""
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr ""
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
msgstr ""
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
msgstr ""
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1197,7 +1192,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1206,30 +1201,131 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
msgstr ""
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr ""
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr ""
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr ""
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr ""
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr ""
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr ""
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr ""
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr ""
@@ -1280,14 +1376,6 @@ msgstr ""
msgid "Save game state 1-10"
msgstr ""
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr ""
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr ""
@@ -1391,14 +1479,14 @@ msgid "Pull"
msgstr ""
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr ""
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr ""
@@ -1411,9 +1499,9 @@ msgid "Get"
msgstr ""
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr ""
@@ -1436,13 +1524,13 @@ msgid "Turn off"
msgstr ""
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr ""
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr ""
@@ -1470,11 +1558,11 @@ msgstr ""
msgid "Switch"
msgstr ""
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr ""
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr ""
@@ -1486,277 +1574,279 @@ msgstr ""
msgid "To Henry / To Indy"
msgstr ""
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr ""
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr ""
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr ""
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr ""
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr ""
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr ""
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr ""
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr ""
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr ""
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr ""
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr ""
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr ""
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr ""
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr ""
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr ""
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr ""
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr ""
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr ""
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr ""
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr ""
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr ""
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr ""
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr ""
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr ""
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr ""
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr ""
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr ""
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr ""
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr ""
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr ""
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr ""
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr ""
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr ""
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr ""
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr ""
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr ""
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr ""
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr ""
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr ""
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr ""
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr ""
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr ""
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr ""
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr ""
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr ""
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr ""
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr ""
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr ""
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr ""
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr ""
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr ""
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr ""
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr ""
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr ""
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr ""
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr ""
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr ""
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr ""
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr ""
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr ""
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr ""
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr ""
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr ""
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr ""
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr ""
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1764,7 +1854,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1772,7 +1862,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1780,52 +1870,58 @@ msgid ""
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
"directory inside the Tentacle game directory."
msgstr ""
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr ""
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr ""
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr ""
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr ""
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr ""
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr ""
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr ""
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr ""
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
msgstr ""
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
msgstr ""
@@ -1833,7 +1929,7 @@ msgstr ""
msgid "Failed to delete file."
msgstr ""
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
msgstr ""
@@ -1950,32 +2046,37 @@ msgstr ""
msgid "DOSBox OPL emulator"
msgstr ""
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
+msgstr ""
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
msgstr ""
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
#: audio/null.h:43
@@ -2122,6 +2223,27 @@ msgstr ""
msgid "Touchpad mode disabled."
msgstr ""
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr ""
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr ""
@@ -2131,50 +2253,50 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
msgstr ""
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr ""
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr ""
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr ""
@@ -2201,11 +2323,13 @@ msgstr ""
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr ""
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr ""
@@ -2434,13 +2558,13 @@ msgstr ""
msgid "Cursor Right"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr ""
@@ -2452,43 +2576,43 @@ msgstr ""
msgid "Rotate"
msgstr ""
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr ""
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr ""
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2505,36 +2629,72 @@ msgstr ""
msgid "Do you really want to quit?"
msgstr ""
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr ""
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr ""
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr ""
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr ""
diff --git a/po/se_SE.po b/po/se_SE.po
index 7301fd52d1..d4ce073feb 100644
--- a/po/se_SE.po
+++ b/po/se_SE.po
@@ -1,20 +1,20 @@
-# Swedish translation for ScummVM.
-# Copyright (C) 2011 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Hampus Flink <hampus.flink@gmail.com>, 2011.
-#
+# Swedish translation for ScummVM.
+# Copyright (C) 2011 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Hampus Flink <hampus.flink@gmail.com>, 2011.
+#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
"PO-Revision-Date: 2011-05-02 13:07+0100\n"
"Last-Translator: Hampus Flink <hampus.flink@gmail.com>\n"
"Language-Team: \n"
+"Language: Svenska\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Svenska\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Poedit-Language: Swedish\n"
"X-Poedit-Country: SWEDEN\n"
@@ -48,10 +48,11 @@ msgid "Go up"
msgstr "Uppåt"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -61,22 +62,22 @@ msgstr "Avbryt"
msgid "Choose"
msgstr "Välj"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "Stäng"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "Musklick"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "Visa tangentbord"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "Ställ in tangenter"
@@ -89,16 +90,17 @@ msgid "Map"
msgstr "Ställ in"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -346,7 +348,7 @@ msgstr "Detta ID-namn är upptaget. Var god välj ett annat."
msgid "~Q~uit"
msgstr "~A~vsluta"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
msgstr "Avsluta ScummVM"
@@ -354,7 +356,7 @@ msgstr "Avsluta ScummVM"
msgid "A~b~out..."
msgstr "O~m~..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "Om ScummVM"
@@ -382,7 +384,7 @@ msgstr "~L~adda..."
msgid "Load savegame for selected game"
msgstr "Ladda spardata för det valda spelet"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
msgstr "Lä~g~g till spel..."
@@ -406,7 +408,7 @@ msgstr "~R~adera spel"
msgid "Remove game from the list. The game data files stay intact"
msgstr "Radera spelet från listan. Spelets datafiler påverkas inte."
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "Lä~g~g till spel..."
@@ -434,14 +436,14 @@ msgid "Clear value"
msgstr "Töm sökfältet"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "Ladda spel:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "Ladda"
@@ -455,17 +457,17 @@ msgstr ""
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "Ja"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "Nej"
@@ -503,34 +505,25 @@ msgstr "Masstillägg..."
msgid "Mass Add..."
msgstr "Masstillägg..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "Lägg till spel..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "Lägg till spel..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... progression ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "Scanning färdig!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "Kataloger scannade: %d ..."
-#: gui/massadd.cpp:253
+#: gui/massadd.cpp:268
#, fuzzy, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Nya spel upptäckta: %d ..."
@@ -610,8 +603,8 @@ msgid "Special dithering modes supported by some games"
msgstr "Speciella gitterlägen stödda av vissa spel"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "Fullskärmsläge"
@@ -954,19 +947,19 @@ msgstr "Radera"
msgid "Do you really want to delete this savegame?"
msgstr "Vill du verkligen radera den här spardatan?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "Datum:"
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "Tid:"
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "Speltid:"
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "Namnlös spardata"
@@ -974,60 +967,60 @@ msgstr "Namnlös spardata"
msgid "Select a Theme"
msgstr "Välj ett tema"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "Inaktiverad GFX"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Inaktiverad GFX"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "Standard rendering (16 bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "Standard (16 bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "Antialiserad rendering (16 bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "Antialiserad (16 bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motorn stöder inte debug-nivå '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "Meny"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Skippa"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Paus"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "Skippa rad"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "Fel under körning av spel:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "Kunde inte hitta en motor kapabel till att köra det valda spelet"
@@ -1098,20 +1091,21 @@ msgstr ""
msgid "Unknown error"
msgstr "Okänt fel"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Herkules grön"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
msgstr "Herkules bärnsten"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Herkules grön"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
msgstr "Herkules bärnsten"
@@ -1163,17 +1157,17 @@ msgid "~R~eturn to Launcher"
msgstr "Åte~r~vänd till launcher"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "Spara spelet:"
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "Spara"
@@ -1184,39 +1178,39 @@ msgid ""
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "A~v~bryt"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~T~angenter"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:228
+#: engines/engine.cpp:241
#, fuzzy
msgid "Could not switch to video mode: '"
msgstr "Aktivt videoläge:"
-#: engines/engine.cpp:237
+#: engines/engine.cpp:250
#, fuzzy
msgid "Could not apply aspect ratio setting."
msgstr "Korrektion av bildförhållande på/av"
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1225,7 +1219,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1234,30 +1228,138 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
msgstr ""
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr ""
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+#, fuzzy
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "Är du säker på att du vill avsluta?"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+#, fuzzy
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "Är du säker på att du vill avsluta?"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "Avsluta"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:200
+#, fuzzy
+msgid "Select a game to LOAD"
+msgstr "Välj ett tema"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr ""
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~F~öregående"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~N~ästa"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~S~täng"
+#: engines/scumm/dialogs.cpp:597
+#, fuzzy
+msgid "Speech Only"
+msgstr "Tal"
+
+#: engines/scumm/dialogs.cpp:598
+#, fuzzy
+msgid "Speech and Subtitles"
+msgstr "Undertexter"
+
+#: engines/scumm/dialogs.cpp:599
+#, fuzzy
+msgid "Subtitles Only"
+msgstr "Undertexter"
+
+#: engines/scumm/dialogs.cpp:607
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "Tal"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "Vanliga kortkommandon:"
@@ -1308,14 +1410,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "Spara speldata 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "Avsluta"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1420,14 +1514,14 @@ msgid "Pull"
msgstr "Dra"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "Ge"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "Öppna"
@@ -1440,9 +1534,9 @@ msgid "Get"
msgstr "Ta emot"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "Använd"
@@ -1465,13 +1559,13 @@ msgid "Turn off"
msgstr "Stäng av"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "Gå till"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "Ta"
@@ -1499,11 +1593,11 @@ msgstr "Laga"
msgid "Switch"
msgstr "Byt"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "Titta"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "Tala"
@@ -1515,277 +1609,279 @@ msgstr "Res"
msgid "To Henry / To Indy"
msgstr "Till Henry / Till Indy"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "spela C-moll på staven"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "spela D på staven"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "spela E på staven"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "spela F på staven"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "spela G på staven"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "spela A på staven"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "spela H på staven"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "spela C-dur på staven"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "Tryck"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "Dra"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "Tala med"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "Titta på"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "Sätt på"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "Stäng av"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "Piltangent upp"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "Markera föreg. dialog"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "Piltangent ned"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "Markera nästa dialog"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "Gå"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "Inventarie"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "Objekt"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
msgstr "Svartvitt / Färg"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "Ögon"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
msgstr "Tunga"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "Slå"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "Sparka"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "Undersök"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "Vanlig pekare"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
msgstr "Comm"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
msgstr "Spara / Ladda / Inst."
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
msgstr "Övriga spelkontroller:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "Inventarie:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "Bläddra listan uppåt"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "Bläddra listan nedåt"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "Övre vänstra föremålet"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "Nedre vänstra föremålet"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "Övre högra föremålet"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "Nedre högra föremålet"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "Mellersta vänstra föremålet"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "Mellersta högra föremålet"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
msgstr "Byta karaktärer:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "Andra ungen"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "Tredje ungen"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "Slagsmålskontroller (nr. tangenter)"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "Steg bakåt"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
msgstr "Blockera högt"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "Blockera midjehöjd"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
msgstr "Blockera lågt"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
msgstr "Slå högt"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "Slå midjehöjd"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
msgstr "Slå lågt"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "Gäller när Indy står till vänster."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "När Indy står till höger byter"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4 och 1 plats med"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6 och 3."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "Biplanskontroller (nr. tangenter)"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "Flyg åt övre vänster"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "Flyg åt vänster"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
msgstr "Flyg åt nedre vänster"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "Flyg uppåt"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "Flyg rakt fram"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "Flyg nedåt"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "Flyg åt övre höger"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "Flyg åt höger"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "Flyg åt nedre höger"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1796,7 +1892,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1807,7 +1903,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1818,7 +1914,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1828,41 +1924,48 @@ msgstr ""
"än. För att spela spelet, gå till \"Lägg till spel\" i ScummVM:s huvudmeny "
"och välj \"Maniac\"-katalogen inuti \"Tentacle\" katalogen."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "~Z~ipläge aktiverat"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "Öv~e~rgångar aktiverade"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
msgstr ""
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:105
+#, fuzzy
+msgid "~M~ain Menu"
+msgstr "ScummVM huvudmeny"
+
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
msgstr "~V~atteneffekt aktiverad"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
msgstr "Återställ spel:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "Återställ"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
msgstr ""
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
+#: engines/tinsel/saveload.cpp:482
#, fuzzy
msgid "Failed to load game state from file."
msgstr ""
@@ -1870,7 +1973,7 @@ msgstr ""
"\n"
"%s"
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
#, fuzzy
msgid "Failed to save game state to file."
msgstr ""
@@ -1886,7 +1989,7 @@ msgstr ""
"\n"
"%s"
-#: engines/groovie/script.cpp:417
+#: engines/groovie/script.cpp:420
#, fuzzy
msgid "Failed to save game"
msgstr ""
@@ -2010,32 +2113,37 @@ msgstr "MAME OPL-emulator"
msgid "DOSBox OPL emulator"
msgstr "DOSBox OPL-emulator"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr ""
+
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
#: audio/null.h:43
@@ -2185,6 +2293,29 @@ msgstr "Touchpad-läge aktiverat."
msgid "Touchpad mode disabled."
msgstr "Touchpad-läge inaktiverat."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+#, fuzzy
+msgid "Hide ScummVM"
+msgstr "Avsluta ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+#, fuzzy
+msgid "Window"
+msgstr "Windows MIDI"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr ""
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "Normalt (ingen skalning)"
@@ -2194,55 +2325,55 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normalt (ingen skalning)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
#, fuzzy
msgid "Enabled aspect ratio correction"
msgstr "Korrektion av bildförhållande på/av"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
#, fuzzy
msgid "Disabled aspect ratio correction"
msgstr "Korrektion av bildförhållande på/av"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
#, fuzzy
msgid "Active graphics filter:"
msgstr "Växla grafikfilter"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
#, fuzzy
msgid "Windowed mode"
msgstr "Renderingsläge:"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL normal"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
msgstr "OpenGL konservation"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
msgstr "OpenGL original"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
#, fuzzy
msgid "Current display mode"
msgstr "Aktivt videoläge:"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
msgstr ""
@@ -2269,11 +2400,13 @@ msgstr "Höger"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "Vänsterklick"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "Högerklick"
@@ -2504,13 +2637,13 @@ msgstr "Pekare vänster"
msgid "Cursor Right"
msgstr "Pekare höger"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "Vill du ladda eller spara spelet?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr "Är du säker på att du vill avsluta?"
@@ -2522,46 +2655,46 @@ msgstr "Tangentbord"
msgid "Rotate"
msgstr "Rotera"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "Använd SDL-driver"
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "Skärm"
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "Vill du utföra en automatisk scan?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "Ställ in högerklick"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
"Du måste välja en tangent för \"Högerklick\" för att spela det här spelet"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "Ställ in göm verktygsrad"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"Du måste välja en tangent för \"Göm verktygsrad\" för att spela det här "
"spelet"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
msgstr "Ställ in Zooma up (valfritt)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
msgstr "Ställ in Zooma ned (valfritt)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2583,42 +2716,89 @@ msgstr "Slå"
msgid "Do you really want to quit?"
msgstr "Vill du avsluta?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr ""
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr ""
-#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:362
#, fuzzy
msgid "Maximum Volume"
msgstr "Volym"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
msgstr ""
-#: backends/events/gph/gph-events.cpp:398
+#: backends/events/gph/gph-events.cpp:370
#, fuzzy
msgid "Minimal Volume"
msgstr "Volym"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
msgstr ""
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr ""
+
+#: backends/platform/bada/form.cpp:269
+#, fuzzy
+msgid "Right Click Once"
+msgstr "Högerklick"
+
+#: backends/platform/bada/form.cpp:277
+#, fuzzy
+msgid "Move Only"
+msgstr "Tal"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/bada/form.cpp:296
+#, fuzzy
+msgid "Game Menu"
+msgstr "Spel"
+
+#: backends/platform/bada/form.cpp:301
+#, fuzzy
+msgid "Show Keypad"
+msgstr "Visa tangentbord"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr ""
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "Lägg till spel..."
+
+#~ msgid "Add Game..."
+#~ msgstr "Lägg till spel..."
+
#~ msgid "Discovered %d new games."
#~ msgstr "Nya spel upptäckta: %d."
diff --git a/po/uk_UA.po b/po/uk_UA.po
index 0d94a6320f..3acd9c3d80 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -1,22 +1,22 @@
-# Ukrainian translation for ScummVM.
-# Copyright (C) 2010-2011 ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# Lubomyr Lisen, 2010.
-#
+# Ukrainian translation for ScummVM.
+# Copyright (C) 2010-2011 ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# Lubomyr Lisen, 2010.
+#
msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2011-06-20 23:09+0100\n"
-"PO-Revision-Date: 2011-03-26 22:38+0200\n"
-"Last-Translator: Lubomyr Lisen\n"
+"POT-Creation-Date: 2011-10-19 13:42+0100\n"
+"PO-Revision-Date: 2011-08-20 13:30+0200\n"
+"Last-Translator: Eugene Sandulenko\n"
"Language-Team: Ukrainian\n"
+"Language: Ukrainian\n"
"MIME-Version: 1.0\n"
"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:91
#, c-format
@@ -33,7 +33,7 @@ msgstr "´ÞáâãßÝö ÔÒØÖÚØ:"
#: gui/browser.cpp:66
msgid "Go up"
-msgstr "²ÒÕàå"
+msgstr "²ÓÞàã"
#: gui/browser.cpp:66 gui/browser.cpp:68
msgid "Go to previous directory level"
@@ -42,13 +42,14 @@ msgstr "¿ÕàÕÙâØ ÝÐ ßÐßÚã àöÒÝÕÜ ÒØéÕ"
#: gui/browser.cpp:68
msgctxt "lowres"
msgid "Go up"
-msgstr "²ÒÕàå"
+msgstr "²ÓÞàã"
#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:312 gui/massadd.cpp:92 gui/options.cpp:1178
+#: gui/launcher.cpp:312 gui/massadd.cpp:94 gui/options.cpp:1178
#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54
-#: engines/engine.cpp:408 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:48
+#: engines/engine.cpp:436 engines/scumm/dialogs.cpp:190
+#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:48
#: backends/events/default/default-events.cpp:222
#: backends/events/default/default-events.cpp:244
msgid "Cancel"
@@ -58,22 +59,22 @@ msgstr "²öÔÜöÝÐ"
msgid "Choose"
msgstr "²ØÑàÐâØ"
-#: gui/gui-manager.cpp:114 engines/scumm/help.cpp:125
+#: gui/gui-manager.cpp:116 engines/scumm/help.cpp:125
#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:190 engines/scumm/help.cpp:208
+#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
#: backends/keymapper/remap-dialog.cpp:52
msgid "Close"
msgstr "·ÐÚàØâØ"
-#: gui/gui-manager.cpp:117
+#: gui/gui-manager.cpp:119
msgid "Mouse click"
msgstr "ºÛöÚ ÜØèÚÞî"
-#: gui/gui-manager.cpp:120 base/main.cpp:280
+#: gui/gui-manager.cpp:122 base/main.cpp:283
msgid "Display keyboard"
msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
-#: gui/gui-manager.cpp:123 base/main.cpp:283
+#: gui/gui-manager.cpp:125 base/main.cpp:286
msgid "Remap keys"
msgstr "¿ÕàÕßàØ×ÝÐçØâØ ÚÛÐÒöèö"
@@ -86,16 +87,17 @@ msgid "Map"
msgstr "¿àØ×ÝÐçØâØ"
#: gui/KeysDialog.cpp:42 gui/launcher.cpp:313 gui/launcher.cpp:936
-#: gui/launcher.cpp:940 gui/massadd.cpp:89 gui/options.cpp:1179
-#: engines/engine.cpp:346 engines/engine.cpp:357 engines/scumm/scumm.cpp:1796
-#: engines/agos/animation.cpp:545 engines/groovie/script.cpp:417
-#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
-#: engines/sword1/animation.cpp:344 engines/sword1/animation.cpp:354
-#: engines/sword1/animation.cpp:360 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:379
-#: engines/sword2/animation.cpp:389 engines/sword2/animation.cpp:398
-#: engines/parallaction/saveload.cpp:281 backends/platform/wii/options.cpp:47
-#: backends/platform/wince/CELauncherDialog.cpp:52
+#: gui/launcher.cpp:940 gui/massadd.cpp:91 gui/options.cpp:1179
+#: engines/engine.cpp:359 engines/engine.cpp:370 engines/scumm/dialogs.cpp:192
+#: engines/scumm/scumm.cpp:1776 engines/agos/animation.cpp:551
+#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:344
+#: engines/sword1/animation.cpp:354 engines/sword1/animation.cpp:360
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:379 engines/sword2/animation.cpp:389
+#: engines/sword2/animation.cpp:398 engines/parallaction/saveload.cpp:281
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
msgid "OK"
msgstr "OK"
@@ -164,7 +166,8 @@ msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
-"¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ßÐàÐÜÕâàã ÝÕ ßÕàÕâÒÞàØâì Óàã ÐÝÓÛöÙáìÚÞî Ò ãÚàÐ÷ÝáìÚã"
+"¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ÝÐÛÐèâãÒÐÝÝï ÝÕ ßÕàÕâÒÞàØâì Óàã ÐÝÓÛöÙáìÚÞî ÝÐ "
+"ãÚàÐ÷ÝáìÚã"
#: gui/launcher.cpp:184 gui/launcher.cpp:198 gui/options.cpp:74
#: gui/options.cpp:708 gui/options.cpp:718 gui/options.cpp:1149
@@ -178,7 +181,7 @@ msgstr "¿ÛÐâäÞàÜÐ:"
#: gui/launcher.cpp:194 gui/launcher.cpp:196 gui/launcher.cpp:197
msgid "Platform the game was originally designed for"
-msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ïÚÞ÷ ÓàÐ ÑãÛÐ áßÞçÐâÚã àÞ×àÞÑÛÕÝÐ"
+msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ïÚÞ÷ Óàã ÑãÛÞ àÞ×àÞÑÛÕÝÞ ßÞçÐâÚÞÒÞ"
#: gui/launcher.cpp:196
msgctxt "lowres"
@@ -222,7 +225,7 @@ msgstr "³ãçÝöáâì"
#: gui/launcher.cpp:236 gui/options.cpp:1048
msgctxt "lowres"
msgid "Volume"
-msgstr "³ãçÝ-âì"
+msgstr "³ãçÝ."
#: gui/launcher.cpp:239
msgid "Override global volume settings"
@@ -270,12 +273,12 @@ msgstr "ÈÛïåØ"
#: gui/launcher.cpp:288
msgid "Game Path:"
-msgstr "ÈÛïå ÔÞ ÓàØ: "
+msgstr "ÈÛïå ÔÞ ÓàØ:"
#: gui/launcher.cpp:290
msgctxt "lowres"
msgid "Game Path:"
-msgstr "ÈÛïå ÔÞ ÓàØ: "
+msgstr "ÈÛïå ÔÞ ÓàØ:"
#: gui/launcher.cpp:295 gui/options.cpp:1091
msgid "Extra Path:"
@@ -292,7 +295,7 @@ msgstr "´ÞÔ. èÛïå:"
#: gui/launcher.cpp:302 gui/options.cpp:1079
msgid "Save Path:"
-msgstr "ÈÛïå ×ÑÕà.: "
+msgstr "ÈÛïå ×ÑÕà.:"
#: gui/launcher.cpp:302 gui/launcher.cpp:304 gui/launcher.cpp:305
#: gui/options.cpp:1079 gui/options.cpp:1081 gui/options.cpp:1082
@@ -302,7 +305,7 @@ msgstr "²ÚÐ×ãô èÛïå ÔÞ ×ÑÕàÕÖÕÝì ÓàØ"
#: gui/launcher.cpp:304 gui/options.cpp:1081
msgctxt "lowres"
msgid "Save Path:"
-msgstr "ÈÛïå ×ÑÕà.: "
+msgstr "ÈÛïå ×ÑÕà.:"
#: gui/launcher.cpp:321 gui/launcher.cpp:404 gui/launcher.cpp:453
#: gui/options.cpp:1088 gui/options.cpp:1094 gui/options.cpp:1101
@@ -342,25 +345,25 @@ msgstr "ÆÕÙ ID ÓàØ ÒÖÕ ÒØÚÞàØáâÞÒãôâìáï. ±ãÔì ÛÐáÚÐ, ÒØÑÕàöâì öÝèØÙ."
msgid "~Q~uit"
msgstr "~²~ØåöÔ"
-#: gui/launcher.cpp:555
+#: gui/launcher.cpp:555 backends/platform/sdl/macosx/appmenu_osx.mm:80
msgid "Quit ScummVM"
-msgstr "²ØåöÔ × ScummVM"
+msgstr "²ØåöÔ ×ö ScummVM"
#: gui/launcher.cpp:556
msgid "A~b~out..."
msgstr "¿àÞ ß~à~ÞÓàÐÜã..."
-#: gui/launcher.cpp:556
+#: gui/launcher.cpp:556 backends/platform/sdl/macosx/appmenu_osx.mm:61
msgid "About ScummVM"
msgstr "¿àÞ ScummVM"
#: gui/launcher.cpp:557
msgid "~O~ptions..."
-msgstr "~¾~ßæö÷..."
+msgstr "~½~ÐÛÐèâãÒÐÝÝï"
#: gui/launcher.cpp:557
msgid "Change global ScummVM options"
-msgstr "·ÜöÝØâØ ÓÛÞÑÐÛìÝö Þßæö÷ ScummVM"
+msgstr "·ÜöÝØâØ ÓÛÞÑÐÛìÝö ÝÐÛÐèâãÒÐÝÝï ScummVM"
#: gui/launcher.cpp:559
msgid "~S~tart"
@@ -372,15 +375,15 @@ msgstr "·ÐßãáâØâØ ÒØÑàÐÝã Óàã"
#: gui/launcher.cpp:562
msgid "~L~oad..."
-msgstr "~·~ÐÒÐÝ..."
+msgstr "~·~ÐÒÐÝâÐÖØâØ..."
#: gui/launcher.cpp:562
msgid "Load savegame for selected game"
msgstr "·ÐÒÐÝâÐÖØâØ ×ÑÕàÕÖÕÝÝï ÔÛï ÒØÑàÐÝÞ÷ ÓàØ"
-#: gui/launcher.cpp:567
+#: gui/launcher.cpp:567 gui/launcher.cpp:1055
msgid "~A~dd Game..."
-msgstr "~´~ÞÔ. Óàã..."
+msgstr "~´~ÞÔÐâØ Óàã..."
#: gui/launcher.cpp:567 gui/launcher.cpp:574
msgid "Hold Shift for Mass Add"
@@ -388,11 +391,11 @@ msgstr "ÃâàØÜãÙâÕ ÚÛÐÒöèã Shift ÔÛï âÞÓÞ, éÞÑ ÔÞÔÐâØ ÔÕÚöÛìÚÐ öÓÞà"
#: gui/launcher.cpp:569
msgid "~E~dit Game..."
-msgstr "ÀÕÔÐ~Ó~. Óàã..."
+msgstr "ÀÕÔÐ~Ó~ãÒÐâØ Óàã"
#: gui/launcher.cpp:569 gui/launcher.cpp:576
msgid "Change game options"
-msgstr "·ÜöÝØâØ Þßæö÷ ÓàØ"
+msgstr "·ÜöÝØâØ ÝÐÛÐèâãÒÐÝÝï ÓàØ"
#: gui/launcher.cpp:571
msgid "~R~emove Game"
@@ -402,7 +405,7 @@ msgstr "~²~ØÔÐÛØâØ Óàã"
msgid "Remove game from the list. The game data files stay intact"
msgstr "²ØÔÐÛØâØ Óàã ×ö áßØáÚã. ½Õ ÒØÔÐÛïô Óàã × ÖÞàáâÚÞÓÞ ÔØáÚã"
-#: gui/launcher.cpp:574
+#: gui/launcher.cpp:574 gui/launcher.cpp:1055
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~´~ÞÔÐâØ Óàã..."
@@ -430,14 +433,14 @@ msgid "Clear value"
msgstr "¾çØáâØâØ ×ÝÐçÕÝÝï"
#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
+#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216
msgid "Load game:"
msgstr "·ÐÒÐÝâÐÖØâØ Óàã:"
-#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255
-#: engines/mohawk/riven.cpp:711 engines/cruise/menu.cpp:216
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: gui/launcher.cpp:615 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
+#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716
+#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Load"
msgstr "·ÐÒÐÝâÐÖØâØ"
@@ -446,22 +449,22 @@ msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
msgstr ""
-"ÇØ ÒØ ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ÔÕâÕÚâÞà ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ "
+"ÇØ ÒØ ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ßÞèãÚ ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ "
"ÒÕÛØÚã ÚöÛìÚöáâì öÓÞà."
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Yes"
msgstr "ÂÐÚ"
#: gui/launcher.cpp:724 gui/launcher.cpp:872
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "No"
msgstr "½ö"
@@ -498,37 +501,28 @@ msgstr "´ÞÔ. ÑÐÓÐâÞ..."
msgid "Mass Add..."
msgstr "´ÞÔ. ÑÐÓÐâÞ..."
-#: gui/launcher.cpp:1055
-msgctxt "lowres"
-msgid "Add Game..."
-msgstr "´ÞÔÐâØ Óàã..."
-
-#: gui/launcher.cpp:1055
-msgid "Add Game..."
-msgstr "´ÞÔÐâØ Óàã..."
-
-#: gui/massadd.cpp:76 gui/massadd.cpp:79
+#: gui/massadd.cpp:78 gui/massadd.cpp:81
msgid "... progress ..."
msgstr "... ßÞèãÚ ..."
-#: gui/massadd.cpp:243
+#: gui/massadd.cpp:258
msgid "Scan complete!"
msgstr "¿ÞèãÚ ×ÐÚöÝçÕÝÞ!"
-#: gui/massadd.cpp:246
+#: gui/massadd.cpp:261
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
-msgstr ""
+msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà, ßàÞßãéÕÝÞ %d ßÞßÕàÕÔÝìÞ ÔÞÔÐÝØå öÓÞà."
-#: gui/massadd.cpp:250
+#: gui/massadd.cpp:265
#, c-format
msgid "Scanned %d directories ..."
msgstr "¿àÞÓÛïÝãâÞ %d ßÐßÞÚ ..."
-#: gui/massadd.cpp:253
-#, fuzzy, c-format
+#: gui/massadd.cpp:268
+#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà ..."
+msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà, ßàÞßãéÕÝÞ %d ßÞßÕàÕÔÝìÞ ÔÞÔÐÝØå öÓÞà ..."
#: gui/options.cpp:72
msgid "Never"
@@ -578,19 +572,19 @@ msgstr "½Õ ×ÐÔÐÝØÙ"
#: gui/options.cpp:372
msgid "Failed to apply some of the graphic options changes:"
-msgstr ""
+msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ÔÕïÚö ×ö ×ÜöÝ ÓàÐäöçÝØå ÝÐÛÐèâãÒÐÝì:"
#: gui/options.cpp:384
msgid "the video mode could not be changed."
-msgstr ""
+msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ ÓàÐäöçÝØÙ àÕÖØÜ."
#: gui/options.cpp:390
msgid "the fullscreen setting could not be changed"
-msgstr ""
+msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ àÕÖØÜ ßÞÒÝÞÓÞ ÕÚàÐÝã"
#: gui/options.cpp:396
msgid "the aspect ratio setting could not be changed"
-msgstr ""
+msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ àÕÖØÜ ÚÞàÕÚæö÷ áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ"
#: gui/options.cpp:705
msgid "Graphics mode:"
@@ -605,8 +599,8 @@ msgid "Special dithering modes supported by some games"
msgstr "ÁßÕæöÐÛìÝö àÕÖØÜØ àÐáâàãÒÐÝÝï, ïÚö ßöÔâàØÜãîâì ÔÕïÚö öÓàØ"
#: gui/options.cpp:726
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2252
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:460
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
msgid "Fullscreen mode"
msgstr "¿ÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ"
@@ -624,11 +618,11 @@ msgstr "EGA ÑÕ× àÐáâàãÒÐÝÝï"
#: gui/options.cpp:730
msgid "Enable undithering in EGA games that support it"
-msgstr "²öÜÚÝãâØ ÑÕ× àÐáâàãÒÐÝÝï Ò EGA öÓàÐå ïÚö ßöÔâàØÜãîâì æÕ"
+msgstr "²öÜÚÝãâØ àÐáâàãÒÐÝÝï Ò EGA öÓàÐå ïÚö æÕ ßöÔâàØÜãîâì"
#: gui/options.cpp:738
msgid "Preferred Device:"
-msgstr "³ÞÛÞÒÝ. ßàØáâàöÙ:"
+msgstr "ÃßÞÔÞÑÐÝØÙ ßàØáâàöÙ:"
#: gui/options.cpp:738
msgid "Music Device:"
@@ -636,7 +630,7 @@ msgstr "¼ã×Øç. ßàØáâàöÙ:"
#: gui/options.cpp:738 gui/options.cpp:740
msgid "Specifies preferred sound device or sound card emulator"
-msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ"
+msgstr "²ÚÐ×ãô ãßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ"
#: gui/options.cpp:738 gui/options.cpp:740 gui/options.cpp:741
msgid "Specifies output sound device or sound card emulator"
@@ -645,7 +639,7 @@ msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ"
#: gui/options.cpp:740
msgctxt "lowres"
msgid "Preferred Dev.:"
-msgstr "ÀÕÚÞÜ. ßàØáâàöÙ:"
+msgstr "ÃßÞÔÞÑ. ßàØáâàöÙ:"
#: gui/options.cpp:740
msgctxt "lowres"
@@ -678,11 +672,11 @@ msgstr "¿àØáâàöÙ GM:"
#: gui/options.cpp:788
msgid "Specifies default sound device for General MIDI output"
-msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÔÛï MIDI"
+msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÔÛï General MIDI"
#: gui/options.cpp:799
msgid "Don't use General MIDI music"
-msgstr "½Õ ÒØÚÞàØáâÞÒãÒÐâØ General MIDI Üã×ØÚã"
+msgstr "½Õ ÒØÚÞàØáâÞÒãÒÐâØ Üã×ØÚã General MIDI"
#: gui/options.cpp:810 gui/options.cpp:871
msgid "Use first available device"
@@ -695,7 +689,7 @@ msgstr "SoundFont:"
#: gui/options.cpp:822 gui/options.cpp:824 gui/options.cpp:825
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
-"SoundFont ßöÔâàØÜãôâìáï ÔÕïÚØÜØ ×ÒãÚÞÒØÜØ ÚÐàâÐÜØ, Fluidsynth ö Timidity"
+"SoundFont ßöÔâàØÜãôâìáï ÔÕïÚØÜØ ×ÒãÚÞÒØÜØ ÚÐàâÐÜØ, Fluidsynth âÐ Timidity"
#: gui/options.cpp:824
msgctxt "lowres"
@@ -721,8 +715,8 @@ msgstr "¿àØáâàöÙ MT-32:"
#: gui/options.cpp:842
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
-"²ÚÐ×ãô ×ÒãÚÞÒØÙ ßàØáâàöÙ ßÞ ãÜÞÒçÐÝÝî ÔÛï ÒØÒÞÔã ÝÐ Roland MT-32/LAPC1/CM32l/"
-"CM64"
+"²ÚÐ×ãô ×ÒãÚÞÒØÙ ßàØáâàöÙ ×Ð ãÜÞÒçÐÝÝïÜ ÔÛï ÒØÒÞÔã ÝÐ Roland MT-32/LAPC1/"
+"CM32l/CM64"
#: gui/options.cpp:847
msgid "True Roland MT-32 (disable GM emulation)"
@@ -733,8 +727,8 @@ msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
msgstr ""
-"²öÔÜöâìâÕ, ïÚéÞ ã ÒÐá ßöÔÚÛîçÕÝØÙ Roland-áãÜöáÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ö ÒØ "
-"åÞçÕâÕ ÙÞÓÞ ÒØÚÞàØáâÐâØ"
+"²öÔÜöâìâÕ, ïÚéÞ ã ÒÐá ßöÔÚÛîçÕÝÞ Roland-áãÜöáÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ö ÒØ "
+"åÞçÕâÕ ÙÞÓÞ ÒØÚÞàØáâÞÒãÒÐâØ"
#: gui/options.cpp:849
msgctxt "lowres"
@@ -748,7 +742,7 @@ msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ Roland GS"
#: gui/options.cpp:852
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr ""
-"²ØÜØÚÐô ÜÐßöÝÓ General MIDI ÔÛï öÓÞà ö× ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32"
+"²ØÜØÚÐô ÜÐßöÝÓ General MIDI ÔÛï öÓÞà ×ö ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32"
#: gui/options.cpp:861
msgid "Don't use Roland MT-32 music"
@@ -825,7 +819,7 @@ msgstr "³ãçÝöáâì áßÕæöÐÛìÝØå ×ÒãÚÞÒØå ÕäÕÚâöÒ"
#: gui/options.cpp:936
msgctxt "lowres"
msgid "SFX volume:"
-msgstr "³ãçÝöá. ÕäÕÚâöÒ:"
+msgstr "³ãçÝ. ÕäÕÚâöÒ:"
#: gui/options.cpp:944
msgid "Speech volume:"
@@ -834,7 +828,7 @@ msgstr "³ãçÝöáâì Þ×ÒãçÚØ:"
#: gui/options.cpp:946
msgctxt "lowres"
msgid "Speech volume:"
-msgstr "³ãçÝöá. Þ×ÒãçÚØ:"
+msgstr "³ãçÝ. Þ×ÒãçÚØ:"
#: gui/options.cpp:1085
msgid "Theme Path:"
@@ -848,8 +842,8 @@ msgstr "ÈÛïå ÔÞ âÕÜ:"
#: gui/options.cpp:1091 gui/options.cpp:1093 gui/options.cpp:1094
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
-"²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ÒØÚÞàØáâÞÒãÒÐÝØå ãáöÜÐ öÓàÐÜØ ÐÑÞ "
-"ScummVM"
+"²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ïÚö ÒØÚÞàØáâÞÒãîâìáï ãáöÜÐ öÓàÐÜØ "
+"ÐÑÞ ScummVM"
#: gui/options.cpp:1098
msgid "Plugins Path:"
@@ -899,7 +893,6 @@ msgid "Language of ScummVM GUI"
msgstr "¼ÞÒÐ ÓàÐäöçÝÞÓÞ öÝâÕàäÕÙáã ScummVM"
#: gui/options.cpp:1295
-#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "²Ø ßÞÒØÝÝö ßÕàÕ×ÐßãáâØâØ ScummVM éÞÑ ×ÐáâÞáãÒÐâØ ×ÜöÝØ."
@@ -933,11 +926,11 @@ msgstr ""
#: gui/saveload.cpp:58 gui/saveload.cpp:239
msgid "No date saved"
-msgstr "´ÐâÐ ÝÕ ×ÐßØáÐÝÐ"
+msgstr "´Ðâã ÝÕ ×ÐßØáÐÝÞ"
#: gui/saveload.cpp:59 gui/saveload.cpp:240
msgid "No time saved"
-msgstr "ÇÐá ÝÕ ×ÐßØáÐÝØÙ"
+msgstr "ÇÐá ÝÕ ×ÐßØáÐÝÞ"
#: gui/saveload.cpp:60 gui/saveload.cpp:241
msgid "No playtime saved"
@@ -951,19 +944,19 @@ msgstr "²ØÔÐÛØâØ"
msgid "Do you really want to delete this savegame?"
msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐÛØâØ æÕ ×ÑÕàÕÖÕÝÝï?"
-#: gui/saveload.cpp:263
+#: gui/saveload.cpp:264
msgid "Date: "
msgstr "´ÐâÐ: "
-#: gui/saveload.cpp:266
+#: gui/saveload.cpp:268
msgid "Time: "
msgstr "ÇÐá: "
-#: gui/saveload.cpp:271
+#: gui/saveload.cpp:274
msgid "Playtime: "
msgstr "ÇÐá ÓàØ: "
-#: gui/saveload.cpp:284 gui/saveload.cpp:351
+#: gui/saveload.cpp:287 gui/saveload.cpp:354
msgid "Untitled savestate"
msgstr "·ÑÕàÕÖÕÝÝï ÑÕ× öÜÕÝö"
@@ -971,60 +964,60 @@ msgstr "·ÑÕàÕÖÕÝÝï ÑÕ× öÜÕÝö"
msgid "Select a Theme"
msgstr "²ØÑÕàöâì âÕÜã"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäöÚØ"
-#: gui/ThemeEngine.cpp:327
+#: gui/ThemeEngine.cpp:328
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäöÚØ"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard Renderer (16bpp)"
msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: gui/ThemeEngine.cpp:328
+#: gui/ThemeEngine.cpp:329
msgid "Standard (16bpp)"
msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased Renderer (16bpp)"
msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)"
-#: gui/ThemeEngine.cpp:330
+#: gui/ThemeEngine.cpp:331
msgid "Antialiased (16bpp)"
msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)"
-#: base/main.cpp:200
+#: base/main.cpp:203
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "´ÒØÖÞÚ ÝÕ ßöÔâàØÜãô àöÒÕÝì ÒöÔÛÐÔÚØ '%s'"
-#: base/main.cpp:268
+#: base/main.cpp:271
msgid "Menu"
msgstr "¼ÕÝî"
-#: base/main.cpp:271 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "¿àÞßãáâØâØ"
-#: base/main.cpp:274 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:277 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "¿Ðã×Ð"
-#: base/main.cpp:277
+#: base/main.cpp:280
msgid "Skip line"
msgstr "¿àÞßãáâØâØ àïÔÞÚ"
-#: base/main.cpp:432
+#: base/main.cpp:439
msgid "Error running game:"
msgstr "¿ÞÜØÛÚÐ ×ÐßãáÚã ÓàØ:"
-#: base/main.cpp:456
+#: base/main.cpp:463
msgid "Could not find any engine capable of running the selected game"
msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ"
@@ -1038,7 +1031,7 @@ msgstr "½ÕÜÐô äÐÙÛöÒ ÓàØ"
#: common/error.cpp:42
msgid "Game id not supported"
-msgstr "Game Id ÝÕ ßöÔâàØÜãôâìáï"
+msgstr "Game id ÝÕ ßöÔâàØÜãôâìáï"
#: common/error.cpp:44
msgid "Unsupported color mode"
@@ -1078,50 +1071,51 @@ msgstr "¿ÞÜØÛÚÐ ×ÐßØáã ÔÐÝØå"
#: common/error.cpp:66
msgid "Could not find suitable engine plugin"
-msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÝÕÞÑåöÔÕÞÓÞ ÒâãÛÚÐ ÔÛï ÔÒØÖÚÐ."
+msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÝÕÞÑåöÔÝÞÓÞ ÒâãÛÚÐ ÔÛï ÔÒØÖÚÐ"
#: common/error.cpp:68
msgid "Engine plugin does not support save states"
-msgstr "´ÒØÖÞÚ ÝÕ ßöÔâàØÜãô àöÒÕÝì ÒöÔÛÐÔÚØ '%s'"
+msgstr "²âãÛÞÚ ÔÒØÖÚÐ ÝÕ ßöÔâàØÜãô ×ÑÕàÕÖÕÝÝï öÓÞà"
#: common/error.cpp:71
msgid "User canceled"
-msgstr ""
+msgstr "²öÔÜöÝÕÝÞ ÚÞàØáâãÒÐçÕÜ"
#: common/error.cpp:75
msgid "Unknown error"
msgstr "½ÕÒöÔÞÜÐ ßÞÜØÛÚÐ"
-#: common/util.cpp:274
+#. I18N: Hercules is graphics card name
+#: common/util.cpp:275
msgid "Hercules Green"
msgstr "Hercules ·ÕÛÕÝØÙ"
-#: common/util.cpp:275
+#: common/util.cpp:276
msgid "Hercules Amber"
-msgstr "Hercules ÏÝâÐàÝØÙ"
+msgstr "Hercules ±ãàèâØÝÝØÙ"
-#: common/util.cpp:282
+#: common/util.cpp:283
msgctxt "lowres"
msgid "Hercules Green"
msgstr "Hercules ·ÕÛÕÝØÙ"
-#: common/util.cpp:283
+#: common/util.cpp:284
msgctxt "lowres"
msgid "Hercules Amber"
-msgstr "Hercules ÏÝâÐàÝØÙ"
+msgstr "Hercules ±ãàèâØÝÝØÙ"
#: engines/advancedDetector.cpp:296
#, c-format
msgid "The game in '%s' seems to be unknown."
-msgstr ""
+msgstr "³àÐ ã '%s' ÝÕÒöÔÞÜÐ."
#: engines/advancedDetector.cpp:297
msgid "Please, report the following data to the ScummVM team along with name"
-msgstr ""
+msgstr "±ãÔì ÛÐáÚÐ, ßÕàÕÔÐÙâÕ ÝØÖçÕÝÐÒÕÔÕÝã öÝäÞàÜÐæöî ÚÞÜÐÝÔö ScummVM àÐ×ÞÜ ×"
#: engines/advancedDetector.cpp:299
msgid "of the game you tried to add and its version/language/etc.:"
-msgstr ""
+msgstr "ÝÐ×ÒÞî ÓàØ, ïÚã ÒØ ÝÐÜÐÓÐôâÕáì ÔÞÔÐâØ, Ð âÐÚÞÖ ÷÷ ÒÕàáöî/ÜÞÒã/âÐ öÝèÕ:"
#: engines/dialogs.cpp:84
msgid "~R~esume"
@@ -1137,7 +1131,7 @@ msgstr "~·~ÐßØáÐâØ"
#: engines/dialogs.cpp:94
msgid "~O~ptions"
-msgstr "~¾~ßæö÷"
+msgstr "~½~ÐÛÐèâãÒÐÝÝï"
#: engines/dialogs.cpp:99
msgid "~H~elp"
@@ -1157,17 +1151,17 @@ msgid "~R~eturn to Launcher"
msgstr "~¿~ÞÒÕà.Ò ÓÞÛÞÒÝÕ ÜÕÝî"
#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/sci/engine/kfile.cpp:578
msgid "Save game:"
msgstr "·ÑÕàÕÓâØ Óàã: "
-#: engines/dialogs.cpp:116 engines/cruise/menu.cpp:214
-#: engines/sci/engine/kfile.cpp:575
+#: engines/dialogs.cpp:116 engines/scumm/dialogs.cpp:187
+#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:578
#: backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
-#: backends/platform/wince/CEActionsPocket.cpp:264
+#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Save"
msgstr "·ÐßØáÐâØ"
@@ -1177,40 +1171,41 @@ msgid ""
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
+"²ØÑÐçâÕ, æÕÙ ÔÒØÖÞÚ ÝÕ ßöÔâàØÜãô ÔÞÒöÔÚã ßÞ öÓàÐÜ. ±ãÔì-ÛÐáÚÐ, ÔØÒöâìáï äÐÙÛ "
+"README ÔÛï ÞáÝÞÒÝÞ÷ öÝÞàÜÐæö÷, Ð âÐÚÞÖ öÝáâàãÚæöÙ, ïÚ ÞâàØÜÐâØ ßÞÔÐÛìèã "
+"ÔÞßÞÜÞÓã."
-#: engines/dialogs.cpp:312 engines/mohawk/dialogs.cpp:100
-#: engines/mohawk/dialogs.cpp:152
+#: engines/dialogs.cpp:316 engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:174
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:313 engines/mohawk/dialogs.cpp:101
-#: engines/mohawk/dialogs.cpp:153
+#: engines/dialogs.cpp:317 engines/mohawk/dialogs.cpp:110
+#: engines/mohawk/dialogs.cpp:175
msgid "~C~ancel"
msgstr "²ö~Ô~ÜöÝÐ"
-#: engines/dialogs.cpp:316
+#: engines/dialogs.cpp:320
msgid "~K~eys"
msgstr "~º~ÛÐÒöèö"
-#: engines/engine.cpp:220
+#: engines/engine.cpp:233
msgid "Could not initialize color format."
-msgstr ""
+msgstr "½Õ ÜÞÖã ÝÐÛÐèâãÒÐâØ äÞàÜÐâ ÚÞÛìÞàã."
-#: engines/engine.cpp:228
-#, fuzzy
+#: engines/engine.cpp:241
msgid "Could not switch to video mode: '"
-msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ:"
+msgstr "½Õ ÒÔÐÛÞáï ßÕàÕÚÛîçØâØ ÒöÔÕÞàÕÖØÜ: '"
-#: engines/engine.cpp:237
-#, fuzzy
+#: engines/engine.cpp:250
msgid "Could not apply aspect ratio setting."
-msgstr "ºÞàÕÚæöï áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ"
+msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ÚÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ."
-#: engines/engine.cpp:242
+#: engines/engine.cpp:255
msgid "Could not apply fullscreen setting."
-msgstr ""
+msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ßÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ."
-#: engines/engine.cpp:342
+#: engines/engine.cpp:355
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1218,8 +1213,13 @@ msgid ""
"the data files to your hard disk instead.\n"
"See the README file for details."
msgstr ""
+"²Ø ÝÐÜÐÓÐôâÕáì ÓàÐâØ Óàã ÑÕ×ßÞáÕàÕÔÝìÞ × CD\n"
+"²öÔÞÜÞ, éÞ æÕ ßàØ×ÒÞÔØâì ÔÞ ßàÞÑÛÕÜ, ö âÞÜã\n"
+"àÕÚÞÜÕÝÔÞÒÐÝÞ, éÞÑØ ²Ø áÚÞßöîÒÐÛØ äÐÙÛØ ÔÐÝØå\n"
+"ÓàØ ÝÐ ÖÞàáâÚØÙ ÔØáÚ.\n"
+"´ØÒöâìáï äÐÙÛ README ÔÛï ßÞÔÐÛìèØå öÝáâàãÚæöÙ."
-#: engines/engine.cpp:353
+#: engines/engine.cpp:366
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1227,38 +1227,147 @@ msgid ""
"order to listen to the game's music.\n"
"See the README file for details."
msgstr ""
+"Æï ÓàÐ ÜÐô ÐãÔöÞÔÞàöÖÚØ ÝÐ ÔØáÚã. §å ßÞâàöÑÝÞ\n"
+"ßÕàÕßØáÐâØ × ÔØáÚã × ÔÞßÞÜÞÓÞî ÒöÔßÞÒöÔÝÞ÷\n"
+"ßàÞÓàÐÜØ ÔÛï ÚÞßöîÒÐÝÝï ÐãÔöÞ × CD ÔØáÚöÒ, ÔÛï\n"
+"âÞÓÞ, éÞÑ ÜÞÖÝÐ ÑãÛÞ áÛãåÐâØ Üã×ØÚã ã Óàö.\n"
+"´ØÒöâìáï äÐÙÛ README ÔÛï ßÞÔÐÛìèØå öÝáâàãÚæöÙ."
-#: engines/engine.cpp:405
+#: engines/engine.cpp:433
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
+"¿¾¿µÀµ´¶µ½½Ï: ³àÐ, ïÚã ÒØ åÞçÕâÕ ×ÐßãáâØâØ, éÕ ÝÕ ßöÔâàØÜãôâìáï ßÞÒÝöáâî "
+"ScummVM. ÁÚÞàèÕ ×Ð ÒáÕ ÒÞÝÐ ÝÕ ÑãÔÕ ßàÐæîÒÐâØ áâÐÑöÛìÝÞ, ö ×ÑÕàÕÖÕÝÝï öÓÞà, "
+"ïÚö ÒØ ×àÞÑØâÕ, ÜÞÖãâì ÝÕ ßàÐæîÒÐâØ ã ßÞÔÐÛìèØå ÒÕàáöïå ScummVM."
-#: engines/engine.cpp:408
+#: engines/engine.cpp:436
msgid "Start anyway"
-msgstr ""
+msgstr "²áÕ ÞÔÝÞ ×ÐßãáâØâØ"
+
+#: engines/scumm/dialogs.cpp:175
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr "²áâÐÒâÕ ÔØáÚ %c âÐ ÝÐâØáÝöâì ÚÛÐÒöèã ÔÛï ßàÞÔÞÒÖÕÝÝï."
+
+#: engines/scumm/dialogs.cpp:176
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr "½Õ ÒÔÐÛÞáï ×ÝÐÙâØ %s, (%c%d) ½ÐâØáÝöâì ÚÛÐÒöèã."
+
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr "¿ÞÜØÛÚÐ çØâÐÝÝï ÔØáÚã %c, (%c%d) ½ÐâØáÝöâì ÚÛÐÒöèã."
+
+#: engines/scumm/dialogs.cpp:178
+msgid "Game Paused. Press SPACE to Continue."
+msgstr "¦Óàã ßàØ×ãßØÝÕÝÞ. ½ÐâØáÝöâì ßàÞÑöÛ ÔÛï ßàÞÔÞÒÖÕÝÝï."
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:182
+msgid "Are you sure you want to restart? (Y/N)"
+msgstr "²Ø ãßÕÒÝÕÝö, éÞ åÞçÕâÕ àÞ×ßÞçÐâØ áßÞçÐâÚã? (Y/N)"
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:184
+msgid "Are you sure you want to quit? (Y/N)"
+msgstr "²Ø ãßÕÒÝÕÝö, éÞ åÞçÕâÕ ÒØÙâØ? (Y/N)"
+
+#: engines/scumm/dialogs.cpp:189
+msgid "Play"
+msgstr "³àÐâØ"
+
+#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: backends/events/default/default-events.cpp:244
+msgid "Quit"
+msgstr "²ØåöÔ"
+
+#: engines/scumm/dialogs.cpp:193
+msgid "Insert save/load game disk"
+msgstr "²áâÐÒâÕ ÔØáÚ ×ö ×ÑÕàÕÖÕÝÝïÜ öÓÞà"
+
+#: engines/scumm/dialogs.cpp:194
+msgid "You must enter a name"
+msgstr "²Ø ÜãáØâÕ ÒÒÕáâØ öÜ'ï"
+
+#: engines/scumm/dialogs.cpp:195
+msgid "The game was NOT saved (disk full?)"
+msgstr "³àã ½µ ±Ã»¾ ×ÐßØáÐÝÞ (ÔØáÚ ßÞÒÝØÙ?)"
+
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT loaded"
+msgstr "³àã ½µ ±Ã»¾ ×ÐÒÐÝâÐÖÕÝÞ"
+
+#: engines/scumm/dialogs.cpp:197
+#, c-format
+msgid "Saving '%s'"
+msgstr "·ÐßØáãî '%s'"
-#: engines/scumm/dialogs.cpp:281
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Loading '%s'"
+msgstr "·ÐÒÐÝâÐÖãî '%s'"
+
+#: engines/scumm/dialogs.cpp:199
+msgid "Name your SAVE game"
+msgstr "½Ð×ÞÒöâì áÒÞô ×ÑÕàÕÖÕÝÝï öÓàØ"
+
+#: engines/scumm/dialogs.cpp:200
+msgid "Select a game to LOAD"
+msgstr "²ØÑÕàöâì Óàã ÔÛï ×ÐÒÐÝâÐÖÕÝÝï"
+
+#: engines/scumm/dialogs.cpp:201
+msgid "Game title)"
+msgstr "½Ð×ÒÐ ÓàØ)"
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:287
msgid "~P~revious"
msgstr "~¿~ÞßÕà"
-#: engines/scumm/dialogs.cpp:282
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:289
msgid "~N~ext"
msgstr "~½~Ðáâ"
-#: engines/scumm/dialogs.cpp:283
+#: engines/scumm/dialogs.cpp:290
#: backends/platform/ds/arm9/source/dsoptions.cpp:56
msgid "~C~lose"
msgstr "~·~ÐÚàØâØ"
+#: engines/scumm/dialogs.cpp:597
+msgid "Speech Only"
+msgstr "ÂöÛìÚØ Þ×ÒãçÚÐ"
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech and Subtitles"
+msgstr "¾×ÒãçÚÐ âÐ áãÑâØâàØ"
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Subtitles Only"
+msgstr "ÂöÛìÚØ áãÑâØâàØ"
+
+#: engines/scumm/dialogs.cpp:607
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr "¾×ÒãçÚÐ âÐ âÕÚáâ"
+
#: engines/scumm/help.cpp:73
msgid "Common keyboard commands:"
msgstr "¾áÝÞÒÝö ÚÞÜÐÝÔØ ÚÛÐÒöÐâãàØ:"
#: engines/scumm/help.cpp:74
msgid "Save / Load dialog"
-msgstr "´öÐÛÞÓ ×ÑÕàÕÖÕÝÝï/×ÐÒÐÝâÐÖÕÝÝï"
+msgstr "´öÐÛÞÓ ×ÑÕàÕÖÕÝÝï / ×ÐÒÐÝâÐÖÕÝÝï"
#: engines/scumm/help.cpp:76
msgid "Skip line of text"
@@ -1302,14 +1411,6 @@ msgstr "Alt"
msgid "Save game state 1-10"
msgstr "·ÑÕàÕÓâØ áâÐÝ ÓàØ 1-10"
-#: engines/scumm/help.cpp:82 engines/scumm/help.cpp:84
-#: backends/platform/symbian/src/SymbianActions.cpp:52
-#: backends/platform/wince/CEActionsPocket.cpp:44
-#: backends/platform/wince/CEActionsSmartphone.cpp:52
-#: backends/events/default/default-events.cpp:244
-msgid "Quit"
-msgstr "²ØåöÔ"
-
#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
msgid "Enter"
msgstr "Enter"
@@ -1320,11 +1421,11 @@ msgstr "ÃÒöÜÚÝãâØ ßÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ"
#: engines/scumm/help.cpp:87
msgid "Music volume up / down"
-msgstr "³ãçÝöáâì Üã×ØÚØ ÒØéÕ/ÝØÖçÕ"
+msgstr "³ãçÝöáâì Üã×ØÚØ ÒØéÕ / ÝØÖçÕ"
#: engines/scumm/help.cpp:88
msgid "Text speed slower / faster"
-msgstr "ÈÒØÔÚöáâì âÕÚáâã ßÞÒöÛìÝöèÕ/èÒØÔèÕ"
+msgstr "ÈÒØÔÚöáâì âÕÚáâã ßÞÒöÛìÝöèÕ / èÒØÔèÕ"
#: engines/scumm/help.cpp:89
msgid "Simulate left mouse button"
@@ -1344,7 +1445,7 @@ msgstr "ÁßÕæöÐÛìÝö ÚÞÜÐÝÔØ ÚÛÐÒöÐâãàØ:"
#: engines/scumm/help.cpp:94
msgid "Show / Hide console"
-msgstr "¿ÞÚÐ×ÐâØ/cåÞÒÐâØ ÚÞÝáÞÛì"
+msgstr "¿ÞÚÐ×ÐâØ / cåÞÒÐâØ ÚÞÝáÞÛì"
#: engines/scumm/help.cpp:95
msgid "Start the debugger"
@@ -1360,7 +1461,7 @@ msgstr "²ØÚÞÝÐâØ Ò èÒØÔÚÞÜã àÕÖØÜö (*)"
#: engines/scumm/help.cpp:98
msgid "Run in really fast mode (*)"
-msgstr "²ØÚÞÝÐâØ Ò ÔöÙáÝÞ èÒØÔÚÞÜã àÕÖØÜö (*)"
+msgstr "²ØÚÞÝÐâØ Ò ÔãÖÕ èÒØÔÚÞÜã àÕÖØÜö (*)"
#: engines/scumm/help.cpp:99
msgid "Toggle mouse capture"
@@ -1372,7 +1473,7 @@ msgstr "¿ÕàÕÚÛîçÕÝÝï ÜöÖ ÓàÐäöçÝØÜØ äöÛìâàÐÜØ"
#: engines/scumm/help.cpp:101
msgid "Increase / Decrease scale factor"
-msgstr "·ÑöÛìèÕÝÝï/×ÜÕÝèÕÝÝï ÜÐáèâÐÑã"
+msgstr "·ÑöÛìèÕÝÝï / ·ÜÕÝèÕÝÝï ÜÐáèâÐÑã"
#: engines/scumm/help.cpp:102
msgid "Toggle aspect-ratio correction"
@@ -1391,7 +1492,6 @@ msgid " since they may cause crashes"
msgstr " ÞáÚöÛìÚØ ÒÞÝØ ÜÞÖãâì ÒØÚÛØÚÐâØ ×ÑÞ÷"
#: engines/scumm/help.cpp:110
-#, fuzzy
msgid " or incorrect game behavior."
msgstr " ÐÑÞ ÝÕßàÐÒØÛìÝã ßÞÒÕÔöÝÚã ÓàØ."
@@ -1414,14 +1514,14 @@ msgid "Pull"
msgstr "ÂïÓâØ"
#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:196
-#: engines/scumm/help.cpp:206
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
msgid "Give"
msgstr "´ÐâØ"
#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:189
-#: engines/scumm/help.cpp:207
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
msgid "Open"
msgstr "²öÔÚàØâØ"
@@ -1434,9 +1534,9 @@ msgid "Get"
msgstr "¾âàØÜÐâØ"
#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:212 engines/scumm/help.cpp:223
-#: engines/scumm/help.cpp:248
+#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224
+#: engines/scumm/help.cpp:250
msgid "Use"
msgstr "²ØÚÞàØáâÐâØ"
@@ -1459,13 +1559,13 @@ msgid "Turn off"
msgstr "²ØÜÚÝãâØ"
#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:193
+#: engines/scumm/help.cpp:194
msgid "Walk to"
msgstr "¦âØ ÔÞ"
#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:209
-#: engines/scumm/help.cpp:226
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
msgid "Pick up"
msgstr "¿öÔöÑàÐâØ"
@@ -1493,11 +1593,11 @@ msgstr "½ÐÛÐÓÞÔØâØ"
msgid "Switch"
msgstr "¿ÕàÕÜÚÝãâØ"
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:227
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
msgid "Look"
msgstr "³ÛïÝãâØ"
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:222
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
msgid "Talk"
msgstr "³ÞÒÞàØâØ"
@@ -1509,277 +1609,281 @@ msgstr "¿ÞÔÞàÞÖ"
msgid "To Henry / To Indy"
msgstr "à ³ÕÝàö / à ¦ÝÔö"
-#: engines/scumm/help.cpp:178
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
msgid "play C minor on distaff"
msgstr "ÓàÐâØ ÔÞ ÜöÝÞà ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:179
+#: engines/scumm/help.cpp:180
msgid "play D on distaff"
msgstr "ÓàÐâØ àÕ ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:180
+#: engines/scumm/help.cpp:181
msgid "play E on distaff"
msgstr "ÓàÐâØ Üö ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:181
+#: engines/scumm/help.cpp:182
msgid "play F on distaff"
msgstr "ÓàÐâØ äÐ ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:182
+#: engines/scumm/help.cpp:183
msgid "play G on distaff"
msgstr "ÓàÐâØ áÞÛì ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:183
+#: engines/scumm/help.cpp:184
msgid "play A on distaff"
msgstr "ÓàÐâØ Ûï ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:184
+#: engines/scumm/help.cpp:185
msgid "play B on distaff"
msgstr "ÓàÐâØ áö ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:185
+#: engines/scumm/help.cpp:186
msgid "play C major on distaff"
msgstr "ÓàÐâØ ÔÞ ÜÐÖÞà ÝÐ ßàïÔæö"
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
msgid "puSh"
msgstr "¿ÞèâÞÒå"
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
msgid "pull (Yank)"
msgstr "âïÓÝãâØ (ÁÜØÚÝãâØ)"
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:211
-#: engines/scumm/help.cpp:246
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
msgid "Talk to"
msgstr "³ÞÒÞàØâØ ÔÞ"
-#: engines/scumm/help.cpp:198 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
msgid "Look at"
msgstr "³ÛïÝãâØ ÝÐ"
-#: engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:200
msgid "turn oN"
msgstr "ÃÒöÜÚÝãâØ"
-#: engines/scumm/help.cpp:200
+#: engines/scumm/help.cpp:201
msgid "turn oFf"
msgstr "²ØÜÚÝãâØ"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "KeyUp"
msgstr "½ÐâØáÝãâØ"
-#: engines/scumm/help.cpp:216
+#: engines/scumm/help.cpp:217
msgid "Highlight prev dialogue"
msgstr "²ØÔöÛØâØ ßÞßÕàÕÔÝöÙ ÔöÐÛÞÓ"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "KeyDown"
msgstr "²öÔßãáâØâØ"
-#: engines/scumm/help.cpp:217
+#: engines/scumm/help.cpp:218
msgid "Highlight next dialogue"
msgstr "²ØÔöÛØâØ ÝÐáâãßÝØÙ ÔöÐÛÞÓ"
-#: engines/scumm/help.cpp:221
+#: engines/scumm/help.cpp:222
msgid "Walk"
msgstr "¦âØ"
-#: engines/scumm/help.cpp:224 engines/scumm/help.cpp:233
-#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:247
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
msgid "Inventory"
msgstr "¦ÝÒÕÝâÐà"
-#: engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:226
msgid "Object"
msgstr "¾Ñ'ôÚâ"
-#: engines/scumm/help.cpp:228
+#: engines/scumm/help.cpp:229
msgid "Black and White / Color"
-msgstr "ÇÞàÝÞÑöÛØÙ/ºÞÛìÞàÞÒØÙ"
+msgstr "ÇÞàÝÞÑöÛØÙ / ºÞÛìÞàÞÒØÙ"
-#: engines/scumm/help.cpp:231
+#: engines/scumm/help.cpp:232
msgid "Eyes"
msgstr "¾çö"
-#: engines/scumm/help.cpp:232
+#: engines/scumm/help.cpp:233
msgid "Tongue"
-msgstr "ÀÞ×ÜÞÒÛïâØ"
+msgstr "Ï×ØÚ"
-#: engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:235
msgid "Punch"
msgstr "²ÔÐàØâØ ÚãÛÐÚÞÜ"
-#: engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:236
msgid "Kick"
msgstr "²ÔÐàØâØ ÝÞÓÞî"
-#: engines/scumm/help.cpp:238 engines/scumm/help.cpp:245
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
msgid "Examine"
msgstr "ÀÞ×ÓÛïÝãâØ"
-#: engines/scumm/help.cpp:239
+#: engines/scumm/help.cpp:240
msgid "Regular cursor"
msgstr "·ÒØçÐÙÝØÙ ÚãàáÞà"
-#: engines/scumm/help.cpp:241
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
msgid "Comm"
-msgstr "Comm"
+msgstr "ºÞÜÜ"
-#: engines/scumm/help.cpp:244
+#: engines/scumm/help.cpp:246
msgid "Save / Load / Options"
-msgstr "·ÑÕàÕÖÕÝÝï / ·ÐÒÐÝâÐÖÕÝÝï / ¾ßæö÷"
+msgstr "·ÑÕàÕÖÕÝÝï / ·ÐÒÐÝâÐÖÕÝÝï / ½ÐÛÐèâãÒÐÝÝï"
-#: engines/scumm/help.cpp:253
+#: engines/scumm/help.cpp:255
msgid "Other game controls:"
-msgstr "¦Ýèö Þßæö÷ ÚÕàãÒÐÝÝï:"
+msgstr "¦ÝèÕ ÚÕàãÒÐÝÝï ÓàÞî:"
-#: engines/scumm/help.cpp:255 engines/scumm/help.cpp:265
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
msgid "Inventory:"
msgstr "¦ÝÒÕÝâÐà:"
-#: engines/scumm/help.cpp:256 engines/scumm/help.cpp:272
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
msgid "Scroll list up"
msgstr "¿àÞÚàãçÕÝÝï áßØáÚã ÔÞÓÞàØ"
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:273
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
msgid "Scroll list down"
msgstr "¿àÞÚàãçÕÝÝï áßØáÚã ÔÞÝØ×ã"
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:266
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
msgid "Upper left item"
msgstr "²ÕàåÝï ×ÛöÒÐ àöç"
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:268
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
msgid "Lower left item"
msgstr "½ØÖÝï ×ÛöÒÐ àöç"
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:269
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
msgid "Upper right item"
msgstr "²ÕàåÝï áßàÐÒÐ àöç"
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:271
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
msgid "Lower right item"
msgstr "½ØÖÝï áßàÐÒÐ àöç"
-#: engines/scumm/help.cpp:267
+#: engines/scumm/help.cpp:269
msgid "Middle left item"
msgstr "ÁÕàÕÔÝï ×ÛöÒÐ àöç"
-#: engines/scumm/help.cpp:270
+#: engines/scumm/help.cpp:272
msgid "Middle right item"
msgstr "ÁÕàÕÔÝï áßàÐÒÐ àöç"
-#: engines/scumm/help.cpp:277 engines/scumm/help.cpp:282
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
msgid "Switching characters:"
-msgstr "¿ÕàÕÚÛîçÕÝÝï ÓÕàÞ÷Ò"
+msgstr "¿ÕàÕÚÛîçÕÝÝï ÓÕàÞ÷Ò:"
-#: engines/scumm/help.cpp:279
+#: engines/scumm/help.cpp:281
msgid "Second kid"
msgstr "´àãÓÐ ÔØâØÝÐ"
-#: engines/scumm/help.cpp:280
+#: engines/scumm/help.cpp:282
msgid "Third kid"
msgstr "ÂàÕâï ÔØâØÝÐ"
-#: engines/scumm/help.cpp:292
+#: engines/scumm/help.cpp:294
msgid "Fighting controls (numpad):"
msgstr "ºÕàãÒÐÝÝï ÑöÙÚÞî (numpad):"
-#: engines/scumm/help.cpp:293 engines/scumm/help.cpp:294
-#: engines/scumm/help.cpp:295
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
msgid "Step back"
msgstr "ºàÞÚ ÝÐ×ÐÔ"
-#: engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:298
msgid "Block high"
-msgstr "±ÛÞÚãÒÐâØ ÒØéÕ"
+msgstr "±ÛÞÚãÒÐâØ ×ÒÕàåã"
-#: engines/scumm/help.cpp:297
+#: engines/scumm/help.cpp:299
msgid "Block middle"
msgstr "±ÛÞÚãÒÐâØ ßÞáÕàÕÔØÝö"
-#: engines/scumm/help.cpp:298
+#: engines/scumm/help.cpp:300
msgid "Block low"
-msgstr "±ÛÞÚãÒÐâØ ÝØÖçÕ"
+msgstr "±ÛÞÚãÒÐâØ ×ÝØ×ã"
-#: engines/scumm/help.cpp:299
+#: engines/scumm/help.cpp:301
msgid "Punch high"
-msgstr "±ØâØ ÒØéÕ"
+msgstr "±ØâØ ×ÒÕàåã"
-#: engines/scumm/help.cpp:300
+#: engines/scumm/help.cpp:302
msgid "Punch middle"
msgstr "±ØâØ ßÞáÕàÕÔØÝö"
-#: engines/scumm/help.cpp:301
+#: engines/scumm/help.cpp:303
msgid "Punch low"
-msgstr "±ØâØ ÝØÖçÕ"
+msgstr "±ØâØ ×ÝØ×ã"
-#: engines/scumm/help.cpp:304
+#: engines/scumm/help.cpp:306
msgid "These are for Indy on left."
msgstr "à ÒØßÐÔÚã ÔÛï ¦ÝÔö ×ÛöÒÐ."
-#: engines/scumm/help.cpp:305
+#: engines/scumm/help.cpp:307
msgid "When Indy is on the right,"
msgstr "ºÞÛØ ¦ÝÔö ô áßàÐÒÐ,"
-#: engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:308
msgid "7, 4, and 1 are switched with"
msgstr "7, 4, ö 1 ßÕàÕÜØÚÐîâìáï ÝÐ"
-#: engines/scumm/help.cpp:307
+#: engines/scumm/help.cpp:309
msgid "9, 6, and 3, respectively."
msgstr "9, 6 ö 3 ÒöÔßÞÒöÔÝÞ."
-#: engines/scumm/help.cpp:314
+#: engines/scumm/help.cpp:316
msgid "Biplane controls (numpad):"
msgstr "ºÕàãÒÐÝÝï ÑößÛÐÝÞÜ (numpad):"
-#: engines/scumm/help.cpp:315
+#: engines/scumm/help.cpp:317
msgid "Fly to upper left"
msgstr "»ÕâöâØ ÔÞÓÞàØ ÝÐÛöÒÞ"
-#: engines/scumm/help.cpp:316
+#: engines/scumm/help.cpp:318
msgid "Fly to left"
msgstr "»ÕâöâØ ÝÐÛöÒÞ"
-#: engines/scumm/help.cpp:317
+#: engines/scumm/help.cpp:319
msgid "Fly to lower left"
-msgstr "»ÕâöâØ ÝØÖçÕ ÒÛöÒÞ"
+msgstr "»ÕâöâØ ÝØÖçÕ ÝÐÛöÒÞ"
-#: engines/scumm/help.cpp:318
+#: engines/scumm/help.cpp:320
msgid "Fly upwards"
msgstr "»ÕâöâØ ÔÞÓÞàØ"
-#: engines/scumm/help.cpp:319
+#: engines/scumm/help.cpp:321
msgid "Fly straight"
msgstr "»ÕâöâØ ßàïÜÞ"
-#: engines/scumm/help.cpp:320
+#: engines/scumm/help.cpp:322
msgid "Fly down"
msgstr "»ÕâöâØ ÔÞÝØ×ã"
-#: engines/scumm/help.cpp:321
+#: engines/scumm/help.cpp:323
msgid "Fly to upper right"
msgstr "»ÕâöâØ ÔÞÓÞàØ ÝÐßàÐÒÞ"
-#: engines/scumm/help.cpp:322
+#: engines/scumm/help.cpp:324
msgid "Fly to right"
msgstr "»ÕâöâØ ÝÐßàÐÒÞ"
-#: engines/scumm/help.cpp:323
+#: engines/scumm/help.cpp:325
msgid "Fly to lower right"
msgstr "»ÕâöâØ ÔÞÝØ×ã ÝÐßàÐÒÞ"
-#: engines/scumm/scumm.cpp:1794
+#: engines/scumm/scumm.cpp:1774
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
+"ÀÕÖØÜ \"àöÔÝÞÓÞ\" MIDI ßÞâàÕÑãô ßÞÝÞÒÛÕÝÝï Roland Upgrade ÒöÔ\n"
+"LucasArts, ßàÞâÕ %s ÒöÔáãâÝöÙ. ¿ÕàÕÜØÚÐîáì ÝÐ AdLib."
-#: engines/scumm/scumm.cpp:2280 engines/agos/saveload.cpp:190
+#: engines/scumm/scumm.cpp:2264 engines/agos/saveload.cpp:189
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -1790,7 +1894,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2287 engines/agos/saveload.cpp:155
+#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:154
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -1801,7 +1905,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2299 engines/agos/saveload.cpp:198
+#: engines/scumm/scumm.cpp:2283 engines/agos/saveload.cpp:197
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -1812,7 +1916,7 @@ msgstr ""
"\n"
"%s"
-#: engines/scumm/scumm.cpp:2514
+#: engines/scumm/scumm.cpp:2498
msgid ""
"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To "
"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' "
@@ -1822,71 +1926,61 @@ msgstr ""
"ÒÜöô. ÉÞÑ ÓàÐâØ ã ÝìÞÓÞ, ÞÑÕàöâì '´ÞÔÐâØ Óàã' ã ßÞçÐâÚÞÒÞÜã ÜÕÝî ScummVM, ö "
"ÒØÑÕàöâì ßÐßÚã Maniac ÒáÕàÕÔÕÝö ßÒßÚØ × ÓàÞî Tentacle."
-#: engines/mohawk/dialogs.cpp:90 engines/mohawk/dialogs.cpp:149
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171
msgid "~Z~ip Mode Activated"
msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝÞ"
-#: engines/mohawk/dialogs.cpp:91
+#: engines/mohawk/dialogs.cpp:93
msgid "~T~ransitions Enabled"
msgstr "¿ÕàÕåÞÔØ ÐÚâØÒÞÒÐÝÞ"
-#: engines/mohawk/dialogs.cpp:92
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
msgid "~D~rop Page"
-msgstr ""
+msgstr "²ØÚØÝãâØ áâÞàöÝÚã"
-#: engines/mohawk/dialogs.cpp:96
+#: engines/mohawk/dialogs.cpp:99
msgid "~S~how Map"
-msgstr ""
+msgstr "¿ÞÚÐ×ÐâØ ÜÐßã"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "³ÞÛÞÒÝÕ ÜÕÝî"
-#: engines/mohawk/dialogs.cpp:150
+#: engines/mohawk/dialogs.cpp:172
msgid "~W~ater Effect Enabled"
-msgstr "µäÕÚâØ ÒÞÔØ ÒÚÛîçÕÝÞ"
+msgstr "µäÕÚâØ ÒÞÔØ ãÒöÜÚÝÕÝÞ"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore game:"
-msgstr "²öÔÝÞÒØâØ Óàã: "
+msgstr "²öÔÝÞÒØâØ Óàã:"
-#: engines/sci/engine/kfile.cpp:678
+#: engines/sci/engine/kfile.cpp:685
msgid "Restore"
msgstr "²öÔÝÞÒØâØ"
-#: engines/agos/animation.cpp:544
+#: engines/agos/animation.cpp:550
#, c-format
msgid "Cutscene file '%s' not found!"
-msgstr ""
+msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ×ÝÐÙÔÕÝÞ!"
#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283
-#: engines/tinsel/saveload.cpp:468
-#, fuzzy
+#: engines/tinsel/saveload.cpp:482
msgid "Failed to load game state from file."
-msgstr ""
-"½Õ ÒÔÐÛÞáï ×ÐÒÐÝâÐÖØâØ áâÐÝ ÓàØ × äÐÙÛã:\n"
-"\n"
-"%s"
+msgstr "½Õ ÒÔÐÛÞáï ×ÐÒÐÝâÐÖØâØ áâÐÝ ÓàØ × äÐÙÛã."
-#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:546
-#, fuzzy
+#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:560
msgid "Failed to save game state to file."
-msgstr ""
-"½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ:\n"
-"\n"
-"%s"
+msgstr "½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ."
#: engines/gob/inter_v5.cpp:107
-#, fuzzy
msgid "Failed to delete file."
-msgstr ""
-"½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ:\n"
-"\n"
-"%s"
+msgstr "½Õ ÒÔÐÛÞáï ÒØÔÐÛØâØ äÐÙÛ."
-#: engines/groovie/script.cpp:417
-#, fuzzy
+#: engines/groovie/script.cpp:420
msgid "Failed to save game"
-msgstr ""
-"½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ:\n"
-"\n"
-"%s"
+msgstr "½Õ ÒÔÐÛÞáï ×ÐßØáÐâØ Óàã"
#: engines/kyra/sound_midi.cpp:475
msgid ""
@@ -1896,36 +1990,44 @@ msgid ""
"General MIDI ones. After all it might happen\n"
"that a few tracks will not be correctly played."
msgstr ""
+"·ÔÐôâìáï, éÞ ²Ø ÒØÚÞàØáâÞÒãôâÕ ßàØáâàöÙ General\n"
+"MIDI, ÐÛÕ ²ÐèÐ ÓàÐ ßöÔâàØÜãô âöÛìÚØ Roland MT32\n"
+"MIDI. ¼Ø áßàÞÑãôÜÞ ×ÐÜÐßØâØ öÝáâàãÜÕÝâØ Roland\n"
+"MT32 ÝÐ General MIDI. °ÛÕ Ò àÕ×ãÛìâÐâö ÜÞÖÕ\n"
+"áâÐâØáï, éÞ ÔÕïÚö âàÕÚØ ÑãÔãâì ÓàÐâØ ÝÕßàÐÒØÛìÝÞ."
#: engines/m4/m4_menus.cpp:138
-#, fuzzy
msgid "Save game failed!"
-msgstr "·ÑÕàÕÓâØ Óàã: "
+msgstr "½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ Óàã!"
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
"Please download it from www.scummvm.org"
msgstr ""
+"½Õ ÒÔÐÛÞáï ×ÝÐÙâØ äÐÙÛ sky.cpt!\n"
+"±ãÔì ÛÐáÚÐ, ×ÐÒÐÝâÐÖâÕ ÙÞÓÞ × www.scummvm.org"
#: engines/sky/compact.cpp:141
msgid ""
"The \"sky.cpt\" file has an incorrect size.\n"
"Please (re)download it from www.scummvm.org"
msgstr ""
+"ÄÐÙÛ sky.cpt ÜÐô ÝÕÒöàÝØÙ àÞ×Üöà.\n"
+"±ãÔì ÛÐáÚÐ, (ßÕàÕ)×ÐÒÐÝâÐÖâÕ ÙÞÓÞ × www.scummvm.org"
#: engines/sword1/animation.cpp:344 engines/sword2/animation.cpp:379
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
-msgstr ""
+msgstr "·ÝÐÙÔÕÝÞ ×ÐáâÐÒÚØ DXA, ÐÛÕ ScummVM ÑãÒ ßÞÑãÔÞÒÐÝØÙ ÑÕ× ßöÔâàØÜÚØ zlib"
#: engines/sword1/animation.cpp:354 engines/sword2/animation.cpp:389
msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
+msgstr "·ÐáâÐÒÚØ MPEG2 ÑöÛìèÕ ÝÕ ßöÔâàØÜãîâìáï"
#: engines/sword1/animation.cpp:359 engines/sword2/animation.cpp:397
#, c-format
msgid "Cutscene '%s' not found"
-msgstr ""
+msgstr "·ÐáâÐÒÚã '%s' ÝÕ ×ÝÐÙÔÕÝÞ"
#: engines/sword1/control.cpp:863
msgid ""
@@ -1937,6 +2039,12 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
+"ScummVM ×ÝÐÙèÞÒ, éÞ ²Ø ÜÐôâÕ áâÐàö ×ÑÕàÕÖÕÝÝï öÓÞà ÔÛï Broken Sword 1.\n"
+"·ÑÕàÕÖÕÝÝï ã áâÐàÞÜã äÞàÜÐâö ÝÕ ßöÔâàØÜãîâìáï, ö ²Ø ÝÕ ×ÜÞÖÕâÕ ÷å "
+"×ÐÒÐÝâÐÖØâØ, ïÚéÞ ÝÕ ßÕàÕÒÕÔÕâÕ ã ÝÞÒØÙ äÞàÜÐâ.\n"
+"\n"
+"½ÐâØáÝöâì ¾º, éÞÑ ßÕàÕÒÕáâØ ÷å ×ÐàÐ×, öÝÐÚèÕ ãÕ ßÞÒöÔÞÜÛÕÝÝï ×'ïÒØâìáï ßàØ "
+"ÝÐáâãßÝÞÜã ×ÐßãáÚã ÓàØ.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -1944,18 +2052,20 @@ msgid ""
"Target new save game already exists!\n"
"Would you like to keep the old save game (%s) or the new one (%s)?\n"
msgstr ""
+"·ÑÕàÕÖÕÝÝï ÓàØ × âÐÚÞî ÝÐ×ÒÞî ÒÖÕ öáÝãô!\n"
+"ÇØ ÒØ åÞçÕâÕ ÛØèØâØ áâÐàÕ ×ÑÕàÕÖÕÝÝï (%s) ÐÑÞ ÝÞÒÕ (%s)?\n"
#: engines/sword1/control.cpp:1235
msgid "Keep the old one"
-msgstr ""
+msgstr "»ØèØâØ áâÐàÕ"
#: engines/sword1/control.cpp:1235
msgid "Keep the new one"
-msgstr ""
+msgstr "²×ïâØ ÝÞÒÕ"
#: engines/sword1/logic.cpp:1633
msgid "This is the end of the Broken Sword 1 Demo"
-msgstr ""
+msgstr "½Ð æìÞÜã ×ÐÚöÝçãôâìáï ÔÕÜÞ Broken Sword 1"
#: engines/parallaction/saveload.cpp:133
#, c-format
@@ -1963,16 +2073,16 @@ msgid ""
"Can't save game in slot %i\n"
"\n"
msgstr ""
+"½Õ ÜÞÖã ×ÑÕàÕÓâØ Óàã ã áÛÞâ %i\n"
+"\n"
#: engines/parallaction/saveload.cpp:211
-#, fuzzy
msgid "Loading game..."
-msgstr "·ÐÒÐÝâÐÖØâØ Óàã:"
+msgstr "·ÐÒÐÝâÐÖãî Óàã..."
#: engines/parallaction/saveload.cpp:226
-#, fuzzy
msgid "Saving game..."
-msgstr "·ÑÕàÕÓâØ Óàã: "
+msgstr "·ÑÕàÕÖãî Óàã..."
#: engines/parallaction/saveload.cpp:279
msgid ""
@@ -1983,10 +2093,16 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
+"ScummVM ×ÝÐÙèÞÒ, éÞ ²Ø ÜÐôâÕ áâÐàö ×ÑÕàÕÖÕÝÝï öÓÞà ÔÛï Nippon Safes.\n"
+"·ÑÕàÕÖÕÝÝï ã áâÐàÞÜã äÞàÜÐâö ÝÕ ßöÔâàØÜãîâìáï, ö ²Ø ÝÕ ×ÜÞÖÕâÕ ÷å "
+"×ÐÒÐÝâÐÖØâØ, ïÚéÞ ÝÕ ßÕàÕÒÕÔÕâÕ ã ÝÞÒØÙ äÞàÜÐâ.\n"
+"\n"
+"½ÐâØáÝöâì ¾º, éÞÑ ßÕàÕÒÕáâØ ÷å ×ÐàÐ×, öÝÐÚèÕ ãÕ ßÞÒöÔÞÜÛÕÝÝï ×'ïÒØâìáï ßàØ "
+"ÝÐáâãßÝÞÜã ×ÐßãáÚã ÓàØ.\n"
#: engines/parallaction/saveload.cpp:326
msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
+msgstr "ScummVM ãáßöèÝÞ ßÕàÕÒöÒ ãáö ²Ðèö ×ÑÕàÕÖÕÝÝï."
#: engines/parallaction/saveload.cpp:328
msgid ""
@@ -1995,6 +2111,10 @@ msgid ""
"\n"
"Please report to the team."
msgstr ""
+"ScummVM ÝÐÔàãÚãÒÐÒ ÔÕïÚö ßÞßÕàÕÔÖÕÝÝï ã ÒöÚÝö ÚÞÝáÞÛö, ö ÝÕÜÐô ÓÐàÐÝâö÷, éÞ "
+"ãáö ²Ðèö äÐÙÛØ ÑãÛÞ ßÕàÕÒÕÔÕÝÞ.\n"
+"\n"
+"±ãÔì ÛÐáÚÐ, ßÞÒöÔÞÜâÕ ßàÞ æÕ ÚÞÜÐÝÔö."
#: audio/fmopl.cpp:49
msgid "MAME OPL emulator"
@@ -2004,33 +2124,46 @@ msgstr "µÜãÛïâÞà MAME OPL:"
msgid "DOSBox OPL emulator"
msgstr "µÜãÛïâÞà DOSBox OPL"
-#: audio/mididrv.cpp:204
+#: audio/mididrv.cpp:205
#, c-format
msgid ""
"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"²ØÑàÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ %s ÝÕ ÑãÛÞ ×ÝÐÙÔÕÝÞ (âÞÑâÞ, ÙÞÓÞ ÜÞÖÕ ÑãâØ "
+"ÒØÜÚÝÕÝÞ ÐÑÞ ÝÕ ßöÔÚÛîçÕÝÞ)."
+
+#: audio/mididrv.cpp:205 audio/mididrv.cpp:217 audio/mididrv.cpp:253
+#: audio/mididrv.cpp:268
+msgid "Attempting to fall back to the next available device..."
+msgstr "½ÐÜÐÓÐîáï ÒØÚÞàØáâÐâØ ÝÐáâãßÝØÙ ÔÞáâãßÝØÙ ßàØáâàöÙ..."
-#: audio/mididrv.cpp:216
+#: audio/mididrv.cpp:217
#, c-format
msgid ""
"The selected audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"²ØÑàÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ %s ÝÕ ÜÞÖÕ ÑãâØ ÒØÚÞàØáâÐÝØÙ. ´ØÒöâìáï äÐÙÛ ÛÞÓã "
+"ÔÛï ÔÞÔÐâÚÞÒÞ÷ öÝäÞàÜÐæö÷."
-#: audio/mididrv.cpp:250
+#: audio/mididrv.cpp:253
#, c-format
msgid ""
"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected). Attempting to fall back to the next available device..."
+"disconnected)."
msgstr ""
+"ÃßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ %s ÝÕ ÑãÛÞ ×ÝÐÙÔÕÝÞ (âÞÑâÞ, ÙÞÓÞ ÜÞÖÕ ÑãâØ "
+"ÒØÜÚÝÕÝÞ ÐÑÞ ÝÕ ßöÔÚÛîçÕÝÞ)."
-#: audio/mididrv.cpp:265
+#: audio/mididrv.cpp:268
#, c-format
msgid ""
"The preferred audio device '%s' cannot be used. See log file for more "
-"information. Attempting to fall back to the next available device..."
+"information."
msgstr ""
+"ÃßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ %s ÝÕ ÜÞÖÕ ÑãâØ ÒØÚÞàØáâÐÝØÙ. ´ØÒöâìáï äÐÙÛ "
+"ÛÞÓã ÔÛï ÔÞÔÐâÚÞÒÞ÷ öÝäÞàÜÐæö÷."
#: audio/null.h:43
msgid "No music"
@@ -2053,9 +2186,8 @@ msgid "C64 Audio Emulator"
msgstr "C64 °ãÔöÞ µÜãÛïâÞà"
#: audio/softsynth/mt32.cpp:329
-#, fuzzy
msgid "Initializing MT-32 Emulator"
-msgstr "½ÐáâàÞîî ÕÜãÛïâÞà MT-32"
+msgstr "½ÐÛÐèâÞÒãî ÕÜãÛïâÞà MT-32"
#: audio/softsynth/mt32.cpp:543
msgid "MT-32 Emulator"
@@ -2071,7 +2203,7 @@ msgstr "µÜãÛïâÞà IBM PCjr"
#: backends/keymapper/remap-dialog.cpp:47
msgid "Keymap:"
-msgstr "ÂÐÑÛØæï ÚÛÐÒöè:"
+msgstr "¼ÐßÐ ÚÛÐÒöè:"
#: backends/keymapper/remap-dialog.cpp:64
msgid " (Active)"
@@ -2162,14 +2294,12 @@ msgid "Disable power off"
msgstr "·ÐÑÞàÞÝØâØ ÒØÜÚÝÕÝÝï"
#: backends/platform/iphone/osys_events.cpp:338
-#, fuzzy
msgid "Mouse-click-and-drag mode enabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔã ãÒöÜÚÝÕÝÞ."
+msgstr "ÀÕÖØÜ ÜØèö ÚÛöÚÝãâØ-âÐ-âïÓÝãâØ ãÒöÜÚÝÕÝÞ."
#: backends/platform/iphone/osys_events.cpp:340
-#, fuzzy
msgid "Mouse-click-and-drag mode disabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝÞ."
+msgstr "ÀÕÖØÜ ÜØèö ÚÛöÚÝãâØ-âÐ-âïÓÝãâØ ÒØÜÚÝÕÝÞ."
#: backends/platform/iphone/osys_events.cpp:351
msgid "Touchpad mode enabled."
@@ -2179,6 +2309,27 @@ msgstr "ÀÕÖØÜ âÐçßÐÔã ãÒöÜÚÝÕÝÞ."
msgid "Touchpad mode disabled."
msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝÞ."
+#: backends/platform/sdl/macosx/appmenu_osx.mm:67
+msgid "Hide ScummVM"
+msgstr "ÁåÞÒÐâØ ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:70
+msgid "Hide Others"
+msgstr "ÁåÞÒÐâØ ¦Ýèö"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:74
+msgid "Show All"
+msgstr "¿ÞÚÐ×ÐâØ ²áÕ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:92
+#: backends/platform/sdl/macosx/appmenu_osx.mm:99
+msgid "Window"
+msgstr "²öÚÝÞ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:95
+msgid "Minimize"
+msgstr "¼öÝöÜö×ãÒÐâØ"
+
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
msgid "Normal (no scaling)"
msgstr "±Õ× ×ÑöÛìèÕÝÝï"
@@ -2188,57 +2339,52 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "±Õ× ×ÑöÛìèÕÝÝï"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2137
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:521
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
msgid "Enabled aspect ratio correction"
-msgstr "ºÞàÕÚæöï áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ"
+msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ãÒöÜÚÝÕÝÞ"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2143
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:526
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
msgid "Disabled aspect ratio correction"
-msgstr "ºÞàÕÚæöï áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ"
+msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÒØÜÚÝÕÝÞ"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2198
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208
msgid "Active graphics filter:"
-msgstr "¿ÕàÕÚÛîçÕÝÝï ÜöÖ ÓàÐäöçÝØÜØ äöÛìâàÐÜØ"
+msgstr "¿ÞâÞçÝØÙ ÓàÐäöçÝØÙ äöÛìâà:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2254
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:465
-#, fuzzy
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
msgid "Windowed mode"
-msgstr "ÀÕÖØÜ àÐáâàãÒ.:"
+msgstr "²öÚÞÝÝØÙ àÕÖØÜ"
-#: backends/graphics/opengl/opengl-graphics.cpp:139
+#: backends/graphics/opengl/opengl-graphics.cpp:130
msgid "OpenGL Normal"
msgstr "OpenGL ÝÞàÜÐÛìÝØÙ"
-#: backends/graphics/opengl/opengl-graphics.cpp:140
+#: backends/graphics/opengl/opengl-graphics.cpp:131
msgid "OpenGL Conserve"
-msgstr "OpenGL ×ÑÕàÕÖÕÝØÙ"
+msgstr "OpenGL ·ÑÕàÕÖÕÝØÙ"
-#: backends/graphics/opengl/opengl-graphics.cpp:141
+#: backends/graphics/opengl/opengl-graphics.cpp:132
msgid "OpenGL Original"
-msgstr "OpenGL ÞàØÓöÝÐÛìÝØÙ"
+msgstr "OpenGL ¾àØÓöÝÐÛìÝØÙ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:403
-#, fuzzy
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
msgid "Current display mode"
-msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ:"
+msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:416
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
msgid "Current scale"
-msgstr ""
+msgstr "¿ÞâÞçÝØÙ ÜÐáèâÐÑ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:546
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
msgid "Active filter mode: Linear"
-msgstr ""
+msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: »öÝöÙÝØÙ"
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:548
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
msgid "Active filter mode: Nearest"
-msgstr ""
+msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: ½ÐÙÑÛØÖçÕ"
#: backends/platform/symbian/src/SymbianActions.cpp:38
#: backends/platform/wince/CEActionsSmartphone.cpp:39
@@ -2263,11 +2409,13 @@ msgstr "½ÐßàÐÒÞ"
#: backends/platform/symbian/src/SymbianActions.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:60
#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/bada/form.cpp:281
msgid "Left Click"
msgstr "»öÒØÙ ÚÛöÚ"
#: backends/platform/symbian/src/SymbianActions.cpp:43
#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/bada/form.cpp:273
msgid "Right Click"
msgstr "¿àÐÒØÙ ÚÛöÚ"
@@ -2312,7 +2460,7 @@ msgstr "¿àØ×ÝÐçÕÝÝï ÚÛÐÒöè"
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
msgid "Do you want to quit ?"
-msgstr "²Ø åÞçÕâÕ ÒØÙâØ?"
+msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÙâØ?"
#: backends/platform/wii/options.cpp:51
msgid "Video"
@@ -2388,7 +2536,7 @@ msgstr "¿ÐàÞÛì:"
#: backends/platform/wii/options.cpp:121
msgid "Init network"
-msgstr "¦ÝöæöÐÛö×Ðæöï ÜÕàÕÖö"
+msgstr "½ÐÛÐèâãÒÐÝÝï ÜÕàÕÖö"
#: backends/platform/wii/options.cpp:123
msgid "Mount SMB"
@@ -2431,19 +2579,17 @@ msgid "Network down"
msgstr "¼ÕàÕÖã ÒØÜÚÝÕÝÞ"
#: backends/platform/wii/options.cpp:178
-#, fuzzy
msgid "Initializing network"
msgstr "½ÐÛÐèâÞÒãî ÜÕàÕÖã"
#: backends/platform/wii/options.cpp:182
-#, fuzzy
msgid "Timeout while initializing network"
msgstr "ÇÐá ßöÔÚÛîçÕÝÝï ÔÞ ÜÕàÕÖö ÒØÙèÞÒ"
#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
+#, c-format
msgid "Network not initialized (%d)"
-msgstr "¼ÕàÕÖã ÝÕ ÝÐÛÐÓÞÔÖÕÝÞ (%d)"
+msgstr "¼ÕàÕÖã ÝÕ ÝÐÛÐèâÞÒÐÝÞ (%d)"
#: backends/platform/wince/CEActionsPocket.cpp:46
msgid "Hide Toolbar"
@@ -2498,13 +2644,13 @@ msgstr "ºãàáÞà ÝÐÛöÒÞ"
msgid "Cursor Right"
msgstr "ºãàáÞà ÝÐßàÐÒÞ"
-#: backends/platform/wince/CEActionsPocket.cpp:264
-#: backends/platform/wince/CEActionsSmartphone.cpp:228
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
msgid "Do you want to load or save the game?"
msgstr "²Ø åÞçÕâÕ ×ÐÒÐÝâÐÖØâØ ÐÑÞ ×ÑÕàÕÓâØ Óàã?"
-#: backends/platform/wince/CEActionsPocket.cpp:314
-#: backends/platform/wince/CEActionsSmartphone.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
msgstr " ²Ø ãßÕÒÝÕÝö, éÞ åÞçÕâÕ ÒØÙâØ? "
@@ -2516,45 +2662,45 @@ msgstr "ºÛÐÒöÐâãàÐ"
msgid "Rotate"
msgstr "¿ÞÒÕàÝãâØ"
-#: backends/platform/wince/CELauncherDialog.cpp:54
+#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
msgstr "²ØÚÞàØáâÞÒãî ÔàÐÙÒÕà SDL "
-#: backends/platform/wince/CELauncherDialog.cpp:58
+#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
msgstr "¿ÞÚÐ×ÐâØ "
-#: backends/platform/wince/CELauncherDialog.cpp:77
+#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
msgstr "²Ø åÞçÕâÕ ×ÔöÙáÝØâØ ÐÒâÞÜÐâØçÝØÙ ßÞèãÚ?"
-#: backends/platform/wince/wince-sdl.cpp:487
+#: backends/platform/wince/wince-sdl.cpp:515
msgid "Map right click action"
msgstr "¿ÕàÕßàØ×ÝÐçÕÝÝï ßàÐÒÞÓÞ ÚÛöÚã"
-#: backends/platform/wince/wince-sdl.cpp:491
+#: backends/platform/wince/wince-sdl.cpp:519
msgid "You must map a key to the 'Right Click' action to play this game"
msgstr "²Ø ßÞÒØÝÝö ßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÞ Ôö÷ '¿àÐÒØÙ ÚÛöÚ', éÞÑ ÓàÐâØ ã æî Óàã"
-#: backends/platform/wince/wince-sdl.cpp:500
+#: backends/platform/wince/wince-sdl.cpp:528
msgid "Map hide toolbar action"
msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.'"
-#: backends/platform/wince/wince-sdl.cpp:504
+#: backends/platform/wince/wince-sdl.cpp:532
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
"²Ø ßÞÒØÝÝö ßÕàÕßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÛï Ôö÷ 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.', éÞÑ ÓàÐâØ "
"Ò æî Óàã"
-#: backends/platform/wince/wince-sdl.cpp:513
+#: backends/platform/wince/wince-sdl.cpp:541
msgid "Map Zoom Up action (optional)"
-msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÑöÛìèÕÝÝï (ÝÕÞÑÞÒï×ÚÞÒÞ)"
+msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÑöÛìèÕÝÝï (ÝÕÞÑÞÒ'ï×ÚÞÒÞ)"
-#: backends/platform/wince/wince-sdl.cpp:516
+#: backends/platform/wince/wince-sdl.cpp:544
msgid "Map Zoom Down action (optional)"
-msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÜÕÝèÕÝÝï (ÝÕÞÑÞÒï×ÚÞÒÞ)"
+msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÜÕÝèÕÝÝï (ÝÕÞÑÞÒ'ï×ÚÞÒÞ)"
-#: backends/platform/wince/wince-sdl.cpp:524
+#: backends/platform/wince/wince-sdl.cpp:552
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
@@ -2562,55 +2708,93 @@ msgstr ""
"ßÞÑÐçØâØ ÒÕáì öÝÒÕÝâÐà"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Do you really want to return to the Launcher?"
-msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐÛØâØ æÕ ×ÑÕàÕÖÕÝÝï?"
+msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ßÞÒÕàÝãâØáï ÔÞ ÓÞÛÞÒÝÞÓÞ ÜÕÝî?"
#: backends/events/default/default-events.cpp:222
-#, fuzzy
msgid "Launcher"
-msgstr "²ÔÐàØâØ ÚãÛÐÚÞÜ"
+msgstr "³ÞÛÞÒÝÕ ÜÕÝî"
#: backends/events/default/default-events.cpp:244
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "²Ø åÞçÕâÕ ÒØÙâØ?"
+msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÙâØ?"
-#: backends/events/gph/gph-events.cpp:366
-#: backends/events/gph/gph-events.cpp:409
-#: backends/events/openpandora/op-events.cpp:141
+#: backends/events/gph/gph-events.cpp:338
+#: backends/events/gph/gph-events.cpp:381
+#: backends/events/openpandora/op-events.cpp:139
msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
+msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - »öÒØÙ ÚÛöÚ"
-#: backends/events/gph/gph-events.cpp:368
-#: backends/events/gph/gph-events.cpp:411
-#: backends/events/openpandora/op-events.cpp:143
+#: backends/events/gph/gph-events.cpp:340
+#: backends/events/gph/gph-events.cpp:383
+#: backends/events/openpandora/op-events.cpp:141
msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
+msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÐÒØÙ ÚÛöÚ"
-#: backends/events/gph/gph-events.cpp:370
-#: backends/events/gph/gph-events.cpp:413
-#: backends/events/openpandora/op-events.cpp:145
+#: backends/events/gph/gph-events.cpp:342
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/openpandora/op-events.cpp:143
msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
+msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÞÛöâ (ÑÕ× ÚÛöÚã)"
-#: backends/events/gph/gph-events.cpp:390
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:362
msgid "Maximum Volume"
-msgstr "³ãçÝöáâì"
+msgstr "¼ÐÚáØÜÐÛìÝÐ ³ãçÝöáâì"
-#: backends/events/gph/gph-events.cpp:392
+#: backends/events/gph/gph-events.cpp:364
msgid "Increasing Volume"
-msgstr ""
+msgstr "¿öÔÒØéÕÝÝï ÓãçÝÞáâö"
-#: backends/events/gph/gph-events.cpp:398
-#, fuzzy
+#: backends/events/gph/gph-events.cpp:370
msgid "Minimal Volume"
-msgstr "³ãçÝöáâì"
+msgstr "¼öÝöÜÐÛìÝÐ ³ãçÝöáâì"
-#: backends/events/gph/gph-events.cpp:400
+#: backends/events/gph/gph-events.cpp:372
msgid "Decreasing Volume"
-msgstr ""
+msgstr "¿ÞÝØÖÕÝÝï ÓãçÝÞáâö"
+
+#: backends/updates/macosx/macosx-updates.mm:65
+msgid "Check for Updates..."
+msgstr "¿ÕàÕÒöàïî ÞÝÞÒÛÕÝÝï..."
+
+#: backends/platform/bada/form.cpp:269
+msgid "Right Click Once"
+msgstr "¾ÔØÝ ßàÐÒØÙ ÚÛöÚ"
+
+#: backends/platform/bada/form.cpp:277
+msgid "Move Only"
+msgstr "ÂöÛìÚØ ßÕàÕÜöáâØâØ"
+
+#: backends/platform/bada/form.cpp:291
+msgid "Escape Key"
+msgstr "ºÛÐÒöèÐ ESC"
+
+#: backends/platform/bada/form.cpp:296
+msgid "Game Menu"
+msgstr "¼ÕÝî ÓàØ"
+
+#: backends/platform/bada/form.cpp:301
+msgid "Show Keypad"
+msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
+
+#: backends/platform/bada/form.cpp:309
+msgid "Control Mouse"
+msgstr "ÃßàÐÒÛöÝÝï ÜØèÕî"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Enabled"
+msgstr "ºÛöÚØ ãÒöÜÚÝÕÝÞ"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:121
+msgid "Clicking Disabled"
+msgstr "ºÛöÚØ ÒØÜÚÝÕÝÞ"
+
+#~ msgctxt "lowres"
+#~ msgid "Add Game..."
+#~ msgstr "´ÞÔÐâØ Óàã..."
+
+#~ msgid "Add Game..."
+#~ msgstr "´ÞÔÐâØ Óàã..."
#~ msgid "Discovered %d new games."
#~ msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà."
diff --git a/ports.mk b/ports.mk
index 15dc7e854b..ddb841c571 100644
--- a/ports.mk
+++ b/ports.mk
@@ -39,6 +39,11 @@ bundle: scummvm-static
mkdir -p $(bundle_name)/Contents/Resources
echo "APPL????" > $(bundle_name)/Contents/PkgInfo
cp $(srcdir)/dists/macosx/Info.plist $(bundle_name)/Contents/
+ifdef USE_SPARKLE
+ mkdir -p $(bundle_name)/Contents/Frameworks
+ cp $(srcdir)/dists/macosx/dsa_pub.pem $(bundle_name)/Contents/Resources/
+ cp -R $(STATICLIBPATH)/Sparkle.framework $(bundle_name)/Contents/Frameworks/
+endif
cp $(srcdir)/icons/scummvm.icns $(bundle_name)/Contents/Resources/
cp $(DIST_FILES_DOCS) $(bundle_name)/
cp $(DIST_FILES_THEMES) $(bundle_name)/Contents/Resources/
@@ -108,6 +113,10 @@ ifdef USE_ZLIB
OSX_ZLIB ?= -lz
endif
+ifdef USE_SPARKLE
+OSX_STATIC_LIBS += -framework Sparkle -F$(STATICLIBPATH)
+endif
+
ifdef USE_TERMCONV
OSX_ICONV ?= -liconv
endif
@@ -120,8 +129,7 @@ scummvm-static: $(OBJS)
-framework CoreMIDI \
$(OSX_STATIC_LIBS) \
$(OSX_ZLIB) \
- $(OSX_ICONV) \
- -lSystemStubs
+ $(OSX_ICONV)
# Special target to create a static linked binary for the iPhone
iphone: $(OBJS)
@@ -143,7 +151,28 @@ osxsnap: bundle
cp $(srcdir)/COPYRIGHT ./ScummVM-snapshot/Copyright\ Holders
cp $(srcdir)/NEWS ./ScummVM-snapshot/News
cp $(srcdir)/README ./ScummVM-snapshot/ScummVM\ ReadMe
+ mkdir ScummVM-snapshot/doc
+ cp $(srcdir)/doc/QuickStart ./ScummVM-snapshot/doc/QuickStart
+ mkdir ScummVM-snapshot/doc/cz
+ cp $(srcdir)/doc/cz/PrectiMe ./ScummVM-snapshot/doc/cz/PrectiMe
+ mkdir ScummVM-snapshot/doc/de
+ cp $(srcdir)/doc/de/Liesmich ./ScummVM-snapshot/doc/de/Liesmich
+ cp $(srcdir)/doc/de/Schnellstart ./ScummVM-snapshot/doc/de/Schnellstart
+ mkdir ScummVM-snapshot/doc/es
+ cp $(srcdir)/doc/es/"Inicio Rápido" ./ScummVM-snapshot/doc/es
+ mkdir ScummVM-snapshot/doc/fr
+ cp $(srcdir)/doc/fr/DemarrageRapide ./ScummVM-snapshot/doc/fr/DemarrageRapide
+ mkdir ScummVM-snapshot/doc/it
+ cp $(srcdir)/doc/it/GuidaRapida ./ScummVM-snapshot/doc/it/GuidaRapida
+ mkdir ScummVM-snapshot/doc/no-nb
+ cp $(srcdir)doc/no-nb/HurtigStart ./ScummVM-snapshot/doc/no-nb/HurtigStart
/Developer/Tools/SetFile -t ttro -c ttxt ./ScummVM-snapshot/*
+ xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/cz/*
+ xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/de/*
+ xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/es/*
+ xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/fr/*
+ xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/it/*
+ xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/no-nb/*
/Developer/Tools/CpMac -r $(bundle_name) ./ScummVM-snapshot/
cp $(srcdir)/dists/macosx/DS_Store ./ScummVM-snapshot/.DS_Store
cp $(srcdir)/dists/macosx/background.jpg ./ScummVM-snapshot/background.jpg
@@ -162,39 +191,56 @@ osxsnap: bundle
scummvmwinres.o: $(srcdir)/icons/scummvm.ico $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(srcdir)/dists/scummvm.rc
$(QUIET_WINDRES)$(WINDRES) -DHAVE_CONFIG_H $(WINDRESFLAGS) $(DEFINES) -I. -I$(srcdir) $(srcdir)/dists/scummvm.rc scummvmwinres.o
-# Special target to prepare data files for distribution / installer creation
-win32data: $(EXECUTABLE)
- mkdir -p $(srcdir)/$(WIN32PATH)
- cp $(srcdir)/AUTHORS $(srcdir)/$(WIN32PATH)
- cp $(srcdir)/COPYING $(srcdir)/$(WIN32PATH)
- cp $(srcdir)/COPYING.LGPL $(srcdir)/$(WIN32PATH)
- cp $(srcdir)/COPYRIGHT $(srcdir)/$(WIN32PATH)
- cp $(srcdir)/NEWS $(srcdir)/$(WIN32PATH)
- cp $(srcdir)/README $(srcdir)/$(WIN32PATH)
- cp /usr/local/README-SDL.txt $(srcdir)/$(WIN32PATH)/README-SDL
- unix2dos $(srcdir)/$(WIN32PATH)/*.*
- $(STRIP) $(EXECUTABLE) -o $(srcdir)/$(WIN32PATH)/$(EXECUTABLE)
- cp $(DIST_FILES_THEMES) $(srcdir)/$(WIN32PATH)
+# Special target to create a win32 snapshot binary (for Inno Setup)
+win32dist: $(EXECUTABLE)
+ mkdir -p $(WIN32PATH)
+ mkdir -p $(WIN32PATH)/graphics
+ mkdir -p $(WIN32PATH)/doc
+ mkdir -p $(WIN32PATH)/doc/cz
+ mkdir -p $(WIN32PATH)/doc/de
+ mkdir -p $(WIN32PATH)/doc/es
+ mkdir -p $(WIN32PATH)/doc/fr
+ mkdir -p $(WIN32PATH)/doc/it
+ mkdir -p $(WIN32PATH)/doc/no-nb
+ $(STRIP) $(EXECUTABLE) -o $(WIN32PATH)/$(EXECUTABLE)
+ cp $(DIST_FILES_THEMES) $(WIN32PATH)
ifdef DIST_FILES_ENGINEDATA
- cp $(DIST_FILES_ENGINEDATA) $(srcdir)/$(WIN32PATH)
+ cp $(DIST_FILES_ENGINEDATA) $(WIN32PATH)
endif
- cp /usr/local/bin/SDL.dll $(srcdir)/$(WIN32PATH)
-
-# Special target to create a win32 snapshot binary (for Inno Setup)
-win32dist: win32data
- cp $(srcdir)/icons/scummvm.ico $(srcdir)/$(WIN32PATH)
- cp $(srcdir)/dists/win32/ScummVM.iss $(srcdir)/$(WIN32PATH)
- mv $(WIN32PATH)/AUTHORS $(srcdir)/$(WIN32PATH)/AUTHORS.txt
- mv $(WIN32PATH)/COPYING $(srcdir)/$(WIN32PATH)/COPYING.txt
- mv $(WIN32PATH)/COPYING.LGPL $(srcdir)/$(WIN32PATH)/COPYING.LGPL.txt
- mv $(WIN32PATH)/COPYRIGHT $(srcdir)/$(WIN32PATH)/COPYRIGHT.txt
- mv $(WIN32PATH)/NEWS $(srcdir)/$(WIN32PATH)/NEWS.txt
- mv $(WIN32PATH)/README $(srcdir)/$(WIN32PATH)/README.txt
- mv $(WIN32PATH)/README-SDL $(srcdir)/$(WIN32PATH)/README-SDL.txt
+ cp $(srcdir)/AUTHORS $(WIN32PATH)/AUTHORS.txt
+ cp $(srcdir)/COPYING $(WIN32PATH)/COPYING.txt
+ cp $(srcdir)/COPYING.LGPL $(WIN32PATH)/COPYING.LGPL.txt
+ cp $(srcdir)/COPYRIGHT $(WIN32PATH)/COPYRIGHT.txt
+ cp $(srcdir)/NEWS $(WIN32PATH)/NEWS.txt
+ cp $(srcdir)/doc/cz/PrectiMe $(WIN32PATH)/doc/cz/PrectiMe.txt
+ cp $(srcdir)/doc/de/Neues $(WIN32PATH)/doc/de/Neues.txt
+ cp $(srcdir)/doc/QuickStart $(WIN32PATH)/doc/QuickStart.txt
+ cp $(srcdir)/doc/es/"Inicio Rápido" $(WIN32PATH)/doc/es/"Inicio Rápido".txt
+ cp $(srcdir)/doc/fr/DemarrageRapide $(WIN32PATH)/doc/fr/DemarrageRapide.txt
+ cp $(srcdir)/doc/it/GuidaRapida $(WIN32PATH)/doc/it/GuidaRapida.txt
+ cp $(srcdir)/doc/no-nb/HurtigStart $(WIN32PATH)/doc/no-nb/HurtigStart.txt
+ cp $(srcdir)/doc/de/Schnellstart $(WIN32PATH)/doc/de/Schnellstart.txt
+ cp $(srcdir)/README $(WIN32PATH)/README.txt
+ cp $(srcdir)/doc/de/Liesmich $(WIN32PATH)/doc/de/Liesmich.txt
+ cp /usr/local/README-SDL.txt $(WIN32PATH)
+ cp /usr/local/bin/SDL.dll $(WIN32PATH)
+ cp $(srcdir)/dists/win32/graphics/left.bmp $(WIN32PATH)/graphics
+ cp $(srcdir)/dists/win32/graphics/scummvm-install.ico $(WIN32PATH)/graphics
+ cp $(srcdir)/dists/win32/ScummVM.iss $(WIN32PATH)
+ unix2dos $(WIN32PATH)/*.txt
+ unix2dos $(WIN32PATH)/doc/cz/*.txt
+ unix2dos $(WIN32PATH)/doc/de/*.txt
+ unix2dos $(WIN32PATH)/doc/es/*.txt
+ unix2dos $(WIN32PATH)/doc/fr/*.txt
+ unix2dos $(WIN32PATH)/doc/it/*.txt
+ unix2dos $(WIN32PATH)/doc/no-nb/*.txt
# Special target to create a win32 NSIS installer
-win32setup: win32data
- makensis -V2 -Dtop_srcdir="../.." -Dtext_dir="../../$(WIN32PATH)" -Dbuild_dir="../../$(WIN32PATH)" $(srcdir)/dists/nsis/scummvm.nsi
+win32setup: $(EXECUTABLE)
+ mkdir -p $(srcdir)/$(STAGINGPATH)
+ $(STRIP) $(EXECUTABLE) -o $(srcdir)/$(STAGINGPATH)/$(EXECUTABLE)
+ cp /usr/local/bin/SDL.dll $(srcdir)/$(STAGINGPATH)
+ makensis -V2 -Dtop_srcdir="../.." -Dstaging_dir="../../$(STAGINGPATH)" -Darch=$(ARCH) $(srcdir)/dists/win32/scummvm.nsi
#
# AmigaOS specific
@@ -211,6 +257,34 @@ ifdef DIST_FILES_ENGINEDATA
endif
cp $(DIST_FILES_DOCS) $(AOS4PATH)
-# Mark special targets as phony
-.PHONY: deb bundle osxsnap win32dist install uninstall
+#
+# PlayStation 3 specific
+#
+ps3pkg: $(EXECUTABLE)
+ $(STRIP) $(EXECUTABLE)
+ sprxlinker $(EXECUTABLE)
+ mkdir -p ps3pkg/USRDIR/data/
+ mkdir -p ps3pkg/USRDIR/doc/
+ mkdir -p ps3pkg/USRDIR/saves/
+ make_self_npdrm "$(EXECUTABLE)" ps3pkg/USRDIR/EBOOT.BIN UP0001-SCUM12000_00-0000000000000000
+ cp $(DIST_FILES_THEMES) ps3pkg/USRDIR/data/
+ifdef DIST_FILES_ENGINEDATA
+ cp $(DIST_FILES_ENGINEDATA) ps3pkg/USRDIR/data/
+endif
+ cp $(DIST_FILES_DOCS) ps3pkg/USRDIR/doc/
+ cp $(srcdir)/dists/ps3/readme-ps3.md ps3pkg/USRDIR/doc/
+ cp $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip ps3pkg/USRDIR/data/
+ cp $(srcdir)/dists/ps3/ICON0.PNG ps3pkg/
+ cp $(srcdir)/dists/ps3/PIC1.PNG ps3pkg/
+ sfo.py -f $(srcdir)/dists/ps3/sfo.xml ps3pkg/PARAM.SFO
+ pkg.py --contentid UP0001-SCUM12000_00-0000000000000000 ps3pkg/ scummvm-ps3.pkg
+ package_finalize scummvm-ps3.pkg
+
+ps3run: $(EXECUTABLE)
+ $(STRIP) $(EXECUTABLE)
+ sprxlinker $(EXECUTABLE)
+ make_self $(EXECUTABLE) $(EXECUTABLE).self
+ ps3load $(EXECUTABLE).self
+# Mark special targets as phony
+.PHONY: deb bundle osxsnap win32dist install uninstall ps3pkg
diff --git a/test/README b/test/README
index 479b290967..25c378374e 100644
--- a/test/README
+++ b/test/README
@@ -2,4 +2,4 @@ This directory contains some unit tests for ScummVM. They are based on
CxxTest <http://cxxtest.com/>, which you can find in the cxxtest
subdirectory, including its manual.
-To run the unit tests, simply use "make test". \ No newline at end of file
+To run the unit tests, simply use "make test".
diff --git a/test/audio/audiostream.h b/test/audio/audiostream.h
index 1ffb2308ec..b94ee087d0 100644
--- a/test/audio/audiostream.h
+++ b/test/audio/audiostream.h
@@ -206,4 +206,3 @@ public:
testSubLoopingAudioStreamFixedIter(22050, true, 2, 2);
}
};
-
diff --git a/test/audio/helper.h b/test/audio/helper.h
index e0d034aaea..5080c79eef 100644
--- a/test/audio/helper.h
+++ b/test/audio/helper.h
@@ -109,4 +109,3 @@ static Audio::SeekableAudioStream *createSineStream(const int sampleRate, const
}
#endif
-
diff --git a/test/common/algorithm.h b/test/common/algorithm.h
index 4d7e9b2e20..6eecae3635 100644
--- a/test/common/algorithm.h
+++ b/test/common/algorithm.h
@@ -38,30 +38,30 @@ public:
const int arraySorted[] = { 1, 2, 3, 3, 4, 5 };
const int arrayUnsorted[] = { 5, 3, 1, 2, 4, 3 };
- TS_ASSERT_EQUALS(checkSort(arraySorted, arraySorted + ARRAYSIZE(arraySorted), Common::Less<int>()), true);
- TS_ASSERT_EQUALS(checkSort(arraySorted, arraySorted + ARRAYSIZE(arraySorted), Common::Greater<int>()), false);
+ TS_ASSERT_EQUALS(checkSort(arraySorted, ARRAYEND(arraySorted), Common::Less<int>()), true);
+ TS_ASSERT_EQUALS(checkSort(arraySorted, ARRAYEND(arraySorted), Common::Greater<int>()), false);
- TS_ASSERT_EQUALS(checkSort(arrayUnsorted, arrayUnsorted + ARRAYSIZE(arrayUnsorted), Common::Less<int>()), false);
- TS_ASSERT_EQUALS(checkSort(arrayUnsorted, arrayUnsorted + ARRAYSIZE(arrayUnsorted), Common::Greater<int>()), false);
+ TS_ASSERT_EQUALS(checkSort(arrayUnsorted, ARRAYEND(arrayUnsorted), Common::Less<int>()), false);
+ TS_ASSERT_EQUALS(checkSort(arrayUnsorted, ARRAYEND(arrayUnsorted), Common::Greater<int>()), false);
}
void test_pod_sort() {
{
int array[] = { 63, 11, 31, 72, 1, 48, 32, 69, 38, 31 };
- Common::sort(array, array + ARRAYSIZE(array));
- TS_ASSERT_EQUALS(checkSort(array, array + ARRAYSIZE(array), Common::Less<int>()), true);
+ Common::sort(array, ARRAYEND(array));
+ TS_ASSERT_EQUALS(checkSort(array, ARRAYEND(array), Common::Less<int>()), true);
// already sorted
- Common::sort(array, array + ARRAYSIZE(array));
- TS_ASSERT_EQUALS(checkSort(array, array + ARRAYSIZE(array), Common::Less<int>()), true);
+ Common::sort(array, ARRAYEND(array));
+ TS_ASSERT_EQUALS(checkSort(array, ARRAYEND(array), Common::Less<int>()), true);
}
{
int array[] = { 90, 80, 70, 60, 50, 40, 30, 20, 10 };
- Common::sort(array, array + ARRAYSIZE(array));
- TS_ASSERT_EQUALS(checkSort(array, array + ARRAYSIZE(array), Common::Less<int>()), true);
+ Common::sort(array, ARRAYEND(array));
+ TS_ASSERT_EQUALS(checkSort(array, ARRAYEND(array), Common::Less<int>()), true);
- Common::sort(array, array + ARRAYSIZE(array), Common::Greater<int>());
- TS_ASSERT_EQUALS(checkSort(array, array + ARRAYSIZE(array), Common::Greater<int>()), true);
+ Common::sort(array, ARRAYEND(array), Common::Greater<int>());
+ TS_ASSERT_EQUALS(checkSort(array, ARRAYEND(array), Common::Greater<int>()), true);
}
}
@@ -80,4 +80,3 @@ public:
TS_ASSERT_EQUALS(checkSort(list.begin(), list.end(), Common::Less<Item>()), true);
}
};
-
diff --git a/test/common/array.h b/test/common/array.h
index c10270436f..f0027ec201 100644
--- a/test/common/array.h
+++ b/test/common/array.h
@@ -215,6 +215,11 @@ class ArrayTestSuite : public CxxTest::TestSuite
Common::Array<int> array2(array1);
+ // Alter the original array
+ array1[0] = 7;
+ array1[1] = -5;
+ array1[2] = 2;
+
TS_ASSERT_EQUALS(array2[0], -3);
TS_ASSERT_EQUALS(array2[1], 5);
TS_ASSERT_EQUALS(array2[2], 9);
diff --git a/test/common/fixedstack.h b/test/common/fixedstack.h
index 62e536d5fa..9aa00b4680 100644
--- a/test/common/fixedstack.h
+++ b/test/common/fixedstack.h
@@ -79,4 +79,3 @@ public:
TS_ASSERT(!q2.empty());
}
};
-
diff --git a/test/common/math.h b/test/common/math.h
new file mode 100644
index 0000000000..5da0410e8e
--- /dev/null
+++ b/test/common/math.h
@@ -0,0 +1,18 @@
+#include <cxxtest/TestSuite.h>
+
+#include "common/math.h"
+
+class MathTestSuite : public CxxTest::TestSuite
+{
+ public:
+ void test_intLog2() {
+ // Test special case for 0
+ TS_ASSERT_EQUALS(Common::intLog2(0), -1);
+
+ // intLog2 should round the result towards 0
+ TS_ASSERT_EQUALS(Common::intLog2(7), 2);
+
+ // Some simple test for 2^10
+ TS_ASSERT_EQUALS(Common::intLog2(1024), 10);
+ }
+};
diff --git a/test/common/queue.h b/test/common/queue.h
index cadb3979d7..c11f7a31ca 100644
--- a/test/common/queue.h
+++ b/test/common/queue.h
@@ -80,4 +80,3 @@ public:
TS_ASSERT(!q2.empty());
}
};
-
diff --git a/test/common/stack.h b/test/common/stack.h
index 66ba5f5e2b..0b1bcee350 100644
--- a/test/common/stack.h
+++ b/test/common/stack.h
@@ -79,4 +79,3 @@ public:
TS_ASSERT(!q2.empty());
}
};
-
diff --git a/test/common/tokenizer.h b/test/common/tokenizer.h
index 9c14875b81..c6a73d77b7 100644
--- a/test/common/tokenizer.h
+++ b/test/common/tokenizer.h
@@ -55,4 +55,3 @@ public:
}
};
-
diff --git a/test/cxxtest/COPYING b/test/cxxtest/COPYING
index b1e3f5a263..cfe59bcadb 100644
--- a/test/cxxtest/COPYING
+++ b/test/cxxtest/COPYING
@@ -500,5 +500,3 @@ necessary. Here is a sample; alter the names:
Ty Coon, President of Vice
That's all there is to it!
-
-
diff --git a/test/cxxtest/TODO b/test/cxxtest/TODO
index 7a7f926e50..63afa6896a 100644
--- a/test/cxxtest/TODO
+++ b/test/cxxtest/TODO
@@ -31,4 +31,3 @@ Seems logical, since they evolve separately. But then you'd want to download bo
-fomit-frame-pointer
** TS_HEX
-
diff --git a/test/cxxtest/cxxtest.spec b/test/cxxtest/cxxtest.spec
index 0f1ded6c53..c4d0017bb9 100644
--- a/test/cxxtest/cxxtest.spec
+++ b/test/cxxtest/cxxtest.spec
@@ -37,4 +37,3 @@ rm -rf $RPM_BUILD_ROOT
%attr(-, root, root) /usr/include/cxxtest
%attr(-, root, root) /usr/bin/cxxtestgen.pl
%attr(-, root, root) /usr/bin/cxxtestgen.py
-
diff --git a/test/cxxtest/cxxtest/Descriptions.h b/test/cxxtest/cxxtest/Descriptions.h
index c25b88dd99..f0e26cb942 100644
--- a/test/cxxtest/cxxtest/Descriptions.h
+++ b/test/cxxtest/cxxtest/Descriptions.h
@@ -71,4 +71,3 @@ namespace CxxTest
}
#endif // __cxxtest__Descriptions_h__
-
diff --git a/test/cxxtest/cxxtest/DummyDescriptions.cpp b/test/cxxtest/cxxtest/DummyDescriptions.cpp
index 04869bfc06..c8eca15827 100644
--- a/test/cxxtest/cxxtest/DummyDescriptions.cpp
+++ b/test/cxxtest/cxxtest/DummyDescriptions.cpp
@@ -46,4 +46,3 @@ namespace CxxTest
bool DummyWorldDescription::setUp() { return true;}
bool DummyWorldDescription::tearDown() { return true;}
}
-
diff --git a/test/cxxtest/cxxtest/DummyDescriptions.h b/test/cxxtest/cxxtest/DummyDescriptions.h
index 69d1116f84..e3aef921ca 100644
--- a/test/cxxtest/cxxtest/DummyDescriptions.h
+++ b/test/cxxtest/cxxtest/DummyDescriptions.h
@@ -73,4 +73,3 @@ namespace CxxTest
}
#endif // __cxxtest__DummyDescriptions_h__
-
diff --git a/test/cxxtest/cxxtest/GlobalFixture.cpp b/test/cxxtest/cxxtest/GlobalFixture.cpp
index edcaf1efe4..a5b2cf8340 100644
--- a/test/cxxtest/cxxtest/GlobalFixture.cpp
+++ b/test/cxxtest/cxxtest/GlobalFixture.cpp
@@ -20,4 +20,3 @@ namespace CxxTest
}
#endif // __cxxtest__GlobalFixture_cpp__
-
diff --git a/test/cxxtest/cxxtest/GlobalFixture.h b/test/cxxtest/cxxtest/GlobalFixture.h
index cbecb0daf8..3c4e12ec14 100644
--- a/test/cxxtest/cxxtest/GlobalFixture.h
+++ b/test/cxxtest/cxxtest/GlobalFixture.h
@@ -27,4 +27,3 @@ namespace CxxTest
}
#endif // __cxxtest__GlobalFixture_h__
-
diff --git a/test/cxxtest/cxxtest/LinkedList.h b/test/cxxtest/cxxtest/LinkedList.h
index bb5e842c97..0d134d2712 100644
--- a/test/cxxtest/cxxtest/LinkedList.h
+++ b/test/cxxtest/cxxtest/LinkedList.h
@@ -62,4 +62,3 @@ namespace CxxTest
}
#endif // __cxxtest__LinkedList_h__
-
diff --git a/test/cxxtest/cxxtest/RealDescriptions.cpp b/test/cxxtest/cxxtest/RealDescriptions.cpp
index 234622cbbf..079a9cf056 100644
--- a/test/cxxtest/cxxtest/RealDescriptions.cpp
+++ b/test/cxxtest/cxxtest/RealDescriptions.cpp
@@ -308,4 +308,3 @@ namespace CxxTest
}
#endif // __cxxtest__RealDescriptions_cpp__
-
diff --git a/test/cxxtest/cxxtest/RealDescriptions.h b/test/cxxtest/cxxtest/RealDescriptions.h
index ad455db0c2..76eee1a852 100644
--- a/test/cxxtest/cxxtest/RealDescriptions.h
+++ b/test/cxxtest/cxxtest/RealDescriptions.h
@@ -220,4 +220,3 @@ namespace CxxTest
}
#endif // __cxxtest__RealDescriptions_h__
-
diff --git a/test/cxxtest/docs/guide.html b/test/cxxtest/docs/guide.html
index fb435fb8f1..3e628ff742 100644
--- a/test/cxxtest/docs/guide.html
+++ b/test/cxxtest/docs/guide.html
@@ -1957,4 +1957,3 @@ no limit, or <code>CXXTEST_MAX_DUMP_SIZE</code> if you <code>#define</code> it.
</body></html>
-
diff --git a/test/cxxtest/sample/Construct b/test/cxxtest/sample/Construct
index b8019616a9..994daa4fa5 100644
--- a/test/cxxtest/sample/Construct
+++ b/test/cxxtest/sample/Construct
@@ -60,5 +60,3 @@ sub cons::CxxTestErrorPrinter($$@) {
my ($env, $dst, @srcs) = @_;
CxxTestRunner $env $dst, 'ErrorPrinter', @srcs;
}
-
-
diff --git a/test/cxxtest/sample/aborter.tpl b/test/cxxtest/sample/aborter.tpl
index 14fc50d2c7..ec6e187c98 100644
--- a/test/cxxtest/sample/aborter.tpl
+++ b/test/cxxtest/sample/aborter.tpl
@@ -13,4 +13,3 @@ int main()
// The CxxTest "world"
<CxxTest world>
-
diff --git a/test/cxxtest/sample/file_printer.tpl b/test/cxxtest/sample/file_printer.tpl
index a9627d6d0d..8bd11cada0 100644
--- a/test/cxxtest/sample/file_printer.tpl
+++ b/test/cxxtest/sample/file_printer.tpl
@@ -19,4 +19,3 @@ int main( int argc, char *argv[] )
// The CxxTest "world"
<CxxTest world>
-
diff --git a/test/cxxtest/sample/mock/Dice.cpp b/test/cxxtest/sample/mock/Dice.cpp
index 161b80fa2b..afd0641ac1 100644
--- a/test/cxxtest/sample/mock/Dice.cpp
+++ b/test/cxxtest/sample/mock/Dice.cpp
@@ -10,5 +10,3 @@ unsigned Dice::roll()
{
return (T::rand() % 6) + 1;
}
-
-
diff --git a/test/cxxtest/sample/mock/Dice.h b/test/cxxtest/sample/mock/Dice.h
index 3a393ef262..2ffd2562c5 100644
--- a/test/cxxtest/sample/mock/Dice.h
+++ b/test/cxxtest/sample/mock/Dice.h
@@ -10,4 +10,3 @@ public:
};
#endif // __DICE_H
-
diff --git a/test/cxxtest/sample/msvc/CxxTest_Workspace.dsw b/test/cxxtest/sample/msvc/CxxTest_Workspace.dsw
index 9a88de6ef7..e59b75c11c 100644
--- a/test/cxxtest/sample/msvc/CxxTest_Workspace.dsw
+++ b/test/cxxtest/sample/msvc/CxxTest_Workspace.dsw
@@ -56,4 +56,3 @@ Package=<3>
}}}
###############################################################################
-
diff --git a/test/cxxtest/sample/only.tpl b/test/cxxtest/sample/only.tpl
index b2a7277cf6..12fde95224 100644
--- a/test/cxxtest/sample/only.tpl
+++ b/test/cxxtest/sample/only.tpl
@@ -30,4 +30,3 @@ int main( int argc, char *argv[] )
// The CxxTest "world"
<CxxTest world>
-
diff --git a/test/cxxtest/sample/winddk/SOURCES b/test/cxxtest/sample/winddk/SOURCES
index dae0148885..3129141d8a 100644
--- a/test/cxxtest/sample/winddk/SOURCES
+++ b/test/cxxtest/sample/winddk/SOURCES
@@ -43,4 +43,3 @@ SOURCES=RunTests.cpp
# This line tells the build utility to process Makefile.inc
#
NTTARGETFILE0=RunTests.cpp
-
diff --git a/test/cxxtest_mingw.h b/test/cxxtest_mingw.h
new file mode 100644
index 0000000000..f407105bfe
--- /dev/null
+++ b/test/cxxtest_mingw.h
@@ -0,0 +1,11 @@
+
+#ifndef CXXTEST_MINGW
+#define CXXTEST_MINGW
+
+// HACK to allow building with the SDL backend on MinGW
+// see bug #1800764 "TOOLS: MinGW tools building broken"
+#ifdef main
+#undef main
+#endif // main
+
+#endif // CXXTEST_MINGW \ No newline at end of file
diff --git a/test/module.mk b/test/module.mk
index 4e5cbf62e1..11ee6bd200 100644
--- a/test/module.mk
+++ b/test/module.mk
@@ -9,7 +9,7 @@ TESTS := $(srcdir)/test/common/*.h $(srcdir)/test/audio/*.h
TEST_LIBS := audio/libaudio.a common/libcommon.a
#
-TEST_FLAGS := --runner=StdioPrinter --no-std --no-eh
+TEST_FLAGS := --runner=StdioPrinter --no-std --no-eh --include=$(srcdir)/test/cxxtest_mingw.h
TEST_CFLAGS := -I$(srcdir)/test/cxxtest
TEST_LDFLAGS := $(LIBS)
TEST_CXXFLAGS := $(filter-out -Wglobal-constructors,$(CXXFLAGS))
diff --git a/video/bink_decoder.cpp b/video/bink_decoder.cpp
new file mode 100644
index 0000000000..46ac8ac386
--- /dev/null
+++ b/video/bink_decoder.cpp
@@ -0,0 +1,1644 @@
+/* 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.
+ *
+ */
+
+// Based on eos' Bink decoder which is in turn
+// based quite heavily on the Bink decoder found in FFmpeg.
+// Many thanks to Kostya Shishkov for doing the hard work.
+
+#include "audio/decoders/raw.h"
+
+#include "common/util.h"
+#include "common/textconsole.h"
+#include "common/math.h"
+#include "common/stream.h"
+#include "common/substream.h"
+#include "common/file.h"
+#include "common/str.h"
+#include "common/bitstream.h"
+#include "common/huffman.h"
+#include "common/rdft.h"
+#include "common/dct.h"
+#include "common/system.h"
+
+#include "graphics/yuv_to_rgb.h"
+#include "graphics/surface.h"
+
+#include "video/binkdata.h"
+#include "video/bink_decoder.h"
+
+static const uint32 kBIKfID = MKTAG('B', 'I', 'K', 'f');
+static const uint32 kBIKgID = MKTAG('B', 'I', 'K', 'g');
+static const uint32 kBIKhID = MKTAG('B', 'I', 'K', 'h');
+static const uint32 kBIKiID = MKTAG('B', 'I', 'K', 'i');
+
+static const uint32 kVideoFlagAlpha = 0x00100000;
+
+static const uint16 kAudioFlagDCT = 0x1000;
+static const uint16 kAudioFlagStereo = 0x2000;
+
+// Number of bits used to store first DC value in bundle
+static const uint32 kDCStartBits = 11;
+
+namespace Video {
+
+BinkDecoder::VideoFrame::VideoFrame() : bits(0) {
+}
+
+BinkDecoder::VideoFrame::~VideoFrame() {
+ delete bits;
+}
+
+
+BinkDecoder::AudioTrack::AudioTrack() : bits(0), bands(0), rdft(0), dct(0) {
+}
+
+BinkDecoder::AudioTrack::~AudioTrack() {
+ delete bits;
+
+ delete[] bands;
+
+ delete rdft;
+ delete dct;
+}
+
+
+BinkDecoder::BinkDecoder() {
+ _bink = 0;
+ _audioTrack = 0;
+
+ for (int i = 0; i < 16; i++)
+ _huffman[i] = 0;
+
+ for (int i = 0; i < kSourceMAX; i++) {
+ _bundles[i].countLength = 0;
+
+ _bundles[i].huffman.index = 0;
+ for (int j = 0; j < 16; j++)
+ _bundles[i].huffman.symbols[j] = j;
+
+ _bundles[i].data = 0;
+ _bundles[i].dataEnd = 0;
+ _bundles[i].curDec = 0;
+ _bundles[i].curPtr = 0;
+ }
+
+ for (int i = 0; i < 16; i++) {
+ _colHighHuffman[i].index = 0;
+ for (int j = 0; j < 16; j++)
+ _colHighHuffman[i].symbols[j] = j;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ _curPlanes[i] = 0;
+ _oldPlanes[i] = 0;
+ }
+
+ _audioStream = 0;
+ _audioStarted = false;
+}
+
+BinkDecoder::~BinkDecoder() {
+ close();
+}
+
+void BinkDecoder::close() {
+ reset();
+
+ if (_audioStream) {
+ // Stop audio
+ g_system->getMixer()->stopHandle(_audioHandle);
+ _audioStream = 0;
+ }
+
+ _audioStarted = false;
+
+ for (int i = 0; i < 4; i++) {
+ delete[] _curPlanes[i]; _curPlanes[i] = 0;
+ delete[] _oldPlanes[i]; _oldPlanes[i] = 0;
+ }
+
+ deinitBundles();
+
+ for (int i = 0; i < 16; i++) {
+ delete _huffman[i];
+ _huffman[i] = 0;
+ }
+
+ delete _bink; _bink = 0;
+ _surface.free();
+
+ _audioTrack = 0;
+
+ for (int i = 0; i < kSourceMAX; i++) {
+ _bundles[i].countLength = 0;
+
+ _bundles[i].huffman.index = 0;
+ for (int j = 0; j < 16; j++)
+ _bundles[i].huffman.symbols[j] = j;
+
+ _bundles[i].data = 0;
+ _bundles[i].dataEnd = 0;
+ _bundles[i].curDec = 0;
+ _bundles[i].curPtr = 0;
+ }
+
+ for (int i = 0; i < 16; i++) {
+ _colHighHuffman[i].index = 0;
+ for (int j = 0; j < 16; j++)
+ _colHighHuffman[i].symbols[j] = j;
+ }
+
+ _audioTracks.clear();
+ _frames.clear();
+}
+
+uint32 BinkDecoder::getElapsedTime() const {
+ if (_audioStream && g_system->getMixer()->isSoundHandleActive(_audioHandle))
+ return g_system->getMixer()->getSoundElapsedTime(_audioHandle);
+
+ return g_system->getMillis() - _startTime;
+}
+
+const Graphics::Surface *BinkDecoder::decodeNextFrame() {
+ if (endOfVideo())
+ return 0;
+
+ VideoFrame &frame = _frames[_curFrame + 1];
+
+ if (!_bink->seek(frame.offset))
+ error("Bad bink seek");
+
+ uint32 frameSize = frame.size;
+
+ for (uint32 i = 0; i < _audioTracks.size(); i++) {
+ AudioTrack &audio = _audioTracks[i];
+
+ uint32 audioPacketLength = _bink->readUint32LE();
+
+ frameSize -= 4;
+
+ if (frameSize < audioPacketLength)
+ error("Audio packet too big for the frame");
+
+ if (audioPacketLength >= 4) {
+ uint32 audioPacketStart = _bink->pos();
+ uint32 audioPacketEnd = _bink->pos() + audioPacketLength;
+
+ if (i == _audioTrack) {
+ // Only play one audio track
+
+ // Number of samples in bytes
+ audio.sampleCount = _bink->readUint32LE() / (2 * audio.channels);
+
+ audio.bits =
+ new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink,
+ audioPacketStart + 4, audioPacketEnd), true);
+
+ audioPacket(audio);
+
+ delete audio.bits;
+ audio.bits = 0;
+ }
+
+ _bink->seek(audioPacketEnd);
+
+ frameSize -= audioPacketLength;
+ }
+ }
+
+ uint32 videoPacketStart = _bink->pos();
+ uint32 videoPacketEnd = _bink->pos() + frameSize;
+
+ frame.bits =
+ new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink,
+ videoPacketStart, videoPacketEnd), true);
+
+ videoPacket(frame);
+
+ delete frame.bits;
+ frame.bits = 0;
+
+ _curFrame++;
+ if (_curFrame == 0)
+ _startTime = g_system->getMillis();
+
+ if (!_audioStarted && _audioStream) {
+ _audioStarted = true;
+ g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audioHandle, _audioStream);
+ }
+
+ return &_surface;
+}
+
+void BinkDecoder::audioPacket(AudioTrack &audio) {
+ if (!_audioStream)
+ return;
+
+ int outSize = audio.frameLen * audio.channels;
+ while (audio.bits->pos() < audio.bits->size()) {
+ int16 *out = (int16 *)malloc(outSize * 2);
+ memset(out, 0, outSize * 2);
+
+ audioBlock(audio, out);
+
+ byte flags = Audio::FLAG_16BITS;
+ if (audio.outChannels == 2)
+ flags |= Audio::FLAG_STEREO;
+
+#ifdef SCUMM_LITTLE_ENDIAN
+ flags |= Audio::FLAG_LITTLE_ENDIAN;
+#endif
+
+ _audioStream->queueBuffer((byte *)out, audio.blockSize * 2, DisposeAfterUse::YES, flags);
+
+ if (audio.bits->pos() & 0x1F) // next data block starts at a 32-byte boundary
+ audio.bits->skip(32 - (audio.bits->pos() & 0x1F));
+ }
+}
+
+void BinkDecoder::videoPacket(VideoFrame &video) {
+ assert(video.bits);
+
+ if (_hasAlpha) {
+ if (_id == kBIKiID)
+ video.bits->skip(32);
+
+ decodePlane(video, 3, false);
+ }
+
+ if (_id == kBIKiID)
+ video.bits->skip(32);
+
+ for (int i = 0; i < 3; i++) {
+ int planeIdx = ((i == 0) || !_swapPlanes) ? i : (i ^ 3);
+
+ decodePlane(video, planeIdx, i != 0);
+
+ if (video.bits->pos() >= video.bits->size())
+ break;
+ }
+
+ // Convert the YUV data we have to our format
+ // We're ignoring alpha for now
+ assert(_curPlanes[0] && _curPlanes[1] && _curPlanes[2]);
+ Graphics::convertYUV420ToRGB(&_surface, _curPlanes[0], _curPlanes[1], _curPlanes[2],
+ _surface.w, _surface.h, _surface.w, _surface.w >> 1);
+
+ // And swap the planes with the reference planes
+ for (int i = 0; i < 4; i++)
+ SWAP(_curPlanes[i], _oldPlanes[i]);
+}
+
+void BinkDecoder::decodePlane(VideoFrame &video, int planeIdx, bool isChroma) {
+
+ uint32 blockWidth = isChroma ? ((_surface.w + 15) >> 4) : ((_surface.w + 7) >> 3);
+ uint32 blockHeight = isChroma ? ((_surface.h + 15) >> 4) : ((_surface.h + 7) >> 3);
+ uint32 width = isChroma ? (_surface.w >> 1) : _surface.w;
+ uint32 height = isChroma ? (_surface.h >> 1) : _surface.h;
+
+ DecodeContext ctx;
+
+ ctx.video = &video;
+ ctx.planeIdx = planeIdx;
+ ctx.destStart = _curPlanes[planeIdx];
+ ctx.destEnd = _curPlanes[planeIdx] + width * height;
+ ctx.prevStart = _oldPlanes[planeIdx];
+ ctx.prevEnd = _oldPlanes[planeIdx] + width * height;
+ ctx.pitch = width;
+
+ for (int i = 0; i < 64; i++) {
+ ctx.coordMap[i] = (i & 7) + (i >> 3) * ctx.pitch;
+
+ ctx.coordScaledMap1[i] = ((i & 7) * 2 + 0) + (((i >> 3) * 2 + 0) * ctx.pitch);
+ ctx.coordScaledMap2[i] = ((i & 7) * 2 + 1) + (((i >> 3) * 2 + 0) * ctx.pitch);
+ ctx.coordScaledMap3[i] = ((i & 7) * 2 + 0) + (((i >> 3) * 2 + 1) * ctx.pitch);
+ ctx.coordScaledMap4[i] = ((i & 7) * 2 + 1) + (((i >> 3) * 2 + 1) * ctx.pitch);
+ }
+
+ for (int i = 0; i < kSourceMAX; i++) {
+ _bundles[i].countLength = _bundles[i].countLengths[isChroma ? 1 : 0];
+
+ readBundle(video, (Source) i);
+ }
+
+ for (ctx.blockY = 0; ctx.blockY < blockHeight; ctx.blockY++) {
+ readBlockTypes (video, _bundles[kSourceBlockTypes]);
+ readBlockTypes (video, _bundles[kSourceSubBlockTypes]);
+ readColors (video, _bundles[kSourceColors]);
+ readPatterns (video, _bundles[kSourcePattern]);
+ readMotionValues(video, _bundles[kSourceXOff]);
+ readMotionValues(video, _bundles[kSourceYOff]);
+ readDCS (video, _bundles[kSourceIntraDC], kDCStartBits, false);
+ readDCS (video, _bundles[kSourceInterDC], kDCStartBits, true);
+ readRuns (video, _bundles[kSourceRun]);
+
+ ctx.dest = ctx.destStart + 8 * ctx.blockY * ctx.pitch;
+ ctx.prev = ctx.prevStart + 8 * ctx.blockY * ctx.pitch;
+
+ for (ctx.blockX = 0; ctx.blockX < blockWidth; ctx.blockX++, ctx.dest += 8, ctx.prev += 8) {
+ BlockType blockType = (BlockType) getBundleValue(kSourceBlockTypes);
+
+ // 16x16 block type on odd line means part of the already decoded block, so skip it
+ if ((ctx.blockY & 1) && (blockType == kBlockScaled)) {
+ ctx.blockX += 1;
+ ctx.dest += 8;
+ ctx.prev += 8;
+ continue;
+ }
+
+ switch (blockType) {
+ case kBlockSkip:
+ blockSkip(ctx);
+ break;
+
+ case kBlockScaled:
+ blockScaled(ctx);
+ break;
+
+ case kBlockMotion:
+ blockMotion(ctx);
+ break;
+
+ case kBlockRun:
+ blockRun(ctx);
+ break;
+
+ case kBlockResidue:
+ blockResidue(ctx);
+ break;
+
+ case kBlockIntra:
+ blockIntra(ctx);
+ break;
+
+ case kBlockFill:
+ blockFill(ctx);
+ break;
+
+ case kBlockInter:
+ blockInter(ctx);
+ break;
+
+ case kBlockPattern:
+ blockPattern(ctx);
+ break;
+
+ case kBlockRaw:
+ blockRaw(ctx);
+ break;
+
+ default:
+ error("Unknown block type: %d", blockType);
+ }
+
+ }
+
+ }
+
+ if (video.bits->pos() & 0x1F) // next plane data starts at 32-bit boundary
+ video.bits->skip(32 - (video.bits->pos() & 0x1F));
+
+}
+
+void BinkDecoder::readBundle(VideoFrame &video, Source source) {
+ if (source == kSourceColors) {
+ for (int i = 0; i < 16; i++)
+ readHuffman(video, _colHighHuffman[i]);
+
+ _colLastVal = 0;
+ }
+
+ if ((source != kSourceIntraDC) && (source != kSourceInterDC))
+ readHuffman(video, _bundles[source].huffman);
+
+ _bundles[source].curDec = _bundles[source].data;
+ _bundles[source].curPtr = _bundles[source].data;
+}
+
+void BinkDecoder::readHuffman(VideoFrame &video, Huffman &huffman) {
+ huffman.index = video.bits->getBits(4);
+
+ if (huffman.index == 0) {
+ // The first tree always gives raw nibbles
+
+ for (int i = 0; i < 16; i++)
+ huffman.symbols[i] = i;
+
+ return;
+ }
+
+ byte hasSymbol[16];
+
+ if (video.bits->getBit()) {
+ // Symbol selection
+
+ memset(hasSymbol, 0, 16);
+
+ uint8 length = video.bits->getBits(3);
+ for (int i = 0; i <= length; i++) {
+ huffman.symbols[i] = video.bits->getBits(4);
+ hasSymbol[huffman.symbols[i]] = 1;
+ }
+
+ for (int i = 0; i < 16; i++)
+ if (hasSymbol[i] == 0)
+ huffman.symbols[++length] = i;
+
+ return;
+ }
+
+ // Symbol shuffling
+
+ byte tmp1[16], tmp2[16];
+ byte *in = tmp1, *out = tmp2;
+
+ uint8 depth = video.bits->getBits(2);
+
+ for (int i = 0; i < 16; i++)
+ in[i] = i;
+
+ for (int i = 0; i <= depth; i++) {
+ int size = 1 << i;
+
+ for (int j = 0; j < 16; j += (size << 1))
+ mergeHuffmanSymbols(video, out + j, in + j, size);
+
+ SWAP(in, out);
+ }
+
+ memcpy(huffman.symbols, in, 16);
+}
+
+void BinkDecoder::mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte *src, int size) {
+ const byte *src2 = src + size;
+ int size2 = size;
+
+ do {
+ if (!video.bits->getBit()) {
+ *dst++ = *src++;
+ size--;
+ } else {
+ *dst++ = *src2++;
+ size2--;
+ }
+
+ } while (size && size2);
+
+ while (size--)
+ *dst++ = *src++;
+ while (size2--)
+ *dst++ = *src2++;
+}
+
+bool BinkDecoder::loadStream(Common::SeekableReadStream *stream) {
+ close();
+
+ _id = stream->readUint32BE();
+ if ((_id != kBIKfID) && (_id != kBIKgID) && (_id != kBIKhID) && (_id != kBIKiID))
+ return false;
+
+ uint32 fileSize = stream->readUint32LE() + 8;
+ uint32 frameCount = stream->readUint32LE();
+ uint32 largestFrameSize = stream->readUint32LE();
+
+ if (largestFrameSize > fileSize) {
+ warning("Largest frame size greater than file size");
+ return false;
+ }
+
+ stream->skip(4);
+
+ uint32 width = stream->readUint32LE();
+ uint32 height = stream->readUint32LE();
+
+ uint32 frameRateNum = stream->readUint32LE();
+ uint32 frameRateDen = stream->readUint32LE();
+ if (frameRateNum == 0 || frameRateDen == 0) {
+ warning("Invalid frame rate (%d/%d)", frameRateNum, frameRateDen);
+ return false;
+ }
+
+ _frameRate = Common::Rational(frameRateNum, frameRateDen);
+ _bink = stream;
+
+ _videoFlags = _bink->readUint32LE();
+
+ uint32 audioTrackCount = _bink->readUint32LE();
+
+ if (audioTrackCount > 1) {
+ warning("More than one audio track found. Using the first one");
+
+ _audioTrack = 0;
+ }
+
+ if (audioTrackCount > 0) {
+ _audioTracks.reserve(audioTrackCount);
+
+ _bink->skip(4 * audioTrackCount);
+
+ // Reading audio track properties
+ for (uint32 i = 0; i < audioTrackCount; i++) {
+ AudioTrack track;
+
+ track.sampleRate = _bink->readUint16LE();
+ track.flags = _bink->readUint16LE();
+
+ _audioTracks.push_back(track);
+
+ initAudioTrack(_audioTracks[i]);
+ }
+
+ _bink->skip(4 * audioTrackCount);
+ }
+
+ // Reading video frame properties
+ _frames.resize(frameCount);
+ for (uint32 i = 0; i < frameCount; i++) {
+ _frames[i].offset = _bink->readUint32LE();
+ _frames[i].keyFrame = _frames[i].offset & 1;
+
+ _frames[i].offset &= ~1;
+
+ if (i != 0)
+ _frames[i - 1].size = _frames[i].offset - _frames[i - 1].offset;
+
+ _frames[i].bits = 0;
+ }
+
+ _frames[frameCount - 1].size = _bink->size() - _frames[frameCount - 1].offset;
+
+ _hasAlpha = _videoFlags & kVideoFlagAlpha;
+ _swapPlanes = (_id == kBIKhID) || (_id == kBIKiID); // BIKh and BIKi swap the chroma planes
+
+ Graphics::PixelFormat format = g_system->getScreenFormat();
+ _surface.create(width, height, format);
+
+ // Give the planes a bit extra space
+ width = _surface.w + 32;
+ height = _surface.h + 32;
+
+ _curPlanes[0] = new byte[ width * height ]; // Y
+ _curPlanes[1] = new byte[(width >> 1) * (height >> 1)]; // U, 1/4 resolution
+ _curPlanes[2] = new byte[(width >> 1) * (height >> 1)]; // V, 1/4 resolution
+ _curPlanes[3] = new byte[ width * height ]; // A
+ _oldPlanes[0] = new byte[ width * height ]; // Y
+ _oldPlanes[1] = new byte[(width >> 1) * (height >> 1)]; // U, 1/4 resolution
+ _oldPlanes[2] = new byte[(width >> 1) * (height >> 1)]; // V, 1/4 resolution
+ _oldPlanes[3] = new byte[ width * height ]; // A
+
+ // Initialize the video with solid black
+ memset(_curPlanes[0], 0, width * height );
+ memset(_curPlanes[1], 0, (width >> 1) * (height >> 1));
+ memset(_curPlanes[2], 0, (width >> 1) * (height >> 1));
+ memset(_curPlanes[3], 255, width * height );
+ memset(_oldPlanes[0], 0, width * height );
+ memset(_oldPlanes[1], 0, (width >> 1) * (height >> 1));
+ memset(_oldPlanes[2], 0, (width >> 1) * (height >> 1));
+ memset(_oldPlanes[3], 255, width * height );
+
+ initBundles();
+ initHuffman();
+
+ if (_audioTrack < _audioTracks.size()) {
+ const AudioTrack &audio = _audioTracks[_audioTrack];
+
+ _audioStream = Audio::makeQueuingAudioStream(audio.outSampleRate, audio.outChannels == 2);
+ }
+
+ return true;
+}
+
+void BinkDecoder::initAudioTrack(AudioTrack &audio) {
+ audio.sampleCount = 0;
+ audio.bits = 0;
+
+ audio.channels = ((audio.flags & kAudioFlagStereo) != 0) ? 2 : 1;
+ audio.codec = ((audio.flags & kAudioFlagDCT ) != 0) ? kAudioCodecDCT : kAudioCodecRDFT;
+
+ if (audio.channels > kAudioChannelsMax)
+ error("Too many audio channels: %d", audio.channels);
+
+ uint32 frameLenBits;
+ // Calculate frame length
+ if (audio.sampleRate < 22050)
+ frameLenBits = 9;
+ else if(audio.sampleRate < 44100)
+ frameLenBits = 10;
+ else
+ frameLenBits = 11;
+
+ audio.frameLen = 1 << frameLenBits;
+
+ audio.outSampleRate = audio.sampleRate;
+ audio.outChannels = audio.channels;
+
+ if (audio.codec == kAudioCodecRDFT) {
+ // RDFT audio already interleaves the samples correctly
+
+ if (audio.channels == 2)
+ frameLenBits++;
+
+ audio.sampleRate *= audio.channels;
+ audio.frameLen *= audio.channels;
+ audio.channels = 1;
+ }
+
+ audio.overlapLen = audio.frameLen / 16;
+ audio.blockSize = (audio.frameLen - audio.overlapLen) * audio.channels;
+ audio.root = 2.0 / sqrt((double)audio.frameLen);
+
+ uint32 sampleRateHalf = (audio.sampleRate + 1) / 2;
+
+ // Calculate number of bands
+ for (audio.bandCount = 1; audio.bandCount < 25; audio.bandCount++)
+ if (sampleRateHalf <= binkCriticalFreqs[audio.bandCount - 1])
+ break;
+
+ audio.bands = new uint32[audio.bandCount + 1];
+
+ // Populate bands
+ audio.bands[0] = 1;
+ for (uint32 i = 1; i < audio.bandCount; i++)
+ audio.bands[i] = binkCriticalFreqs[i - 1] * (audio.frameLen / 2) / sampleRateHalf;
+ audio.bands[audio.bandCount] = audio.frameLen / 2;
+
+ audio.first = true;
+
+ for (uint8 i = 0; i < audio.channels; i++)
+ audio.coeffsPtr[i] = audio.coeffs + i * audio.frameLen;
+
+ audio.codec = ((audio.flags & kAudioFlagDCT) != 0) ? kAudioCodecDCT : kAudioCodecRDFT;
+
+ if (audio.codec == kAudioCodecRDFT)
+ audio.rdft = new Common::RDFT(frameLenBits, Common::RDFT::DFT_C2R);
+ else if (audio.codec == kAudioCodecDCT)
+ audio.dct = new Common::DCT(frameLenBits, Common::DCT::DCT_III);
+}
+
+void BinkDecoder::initBundles() {
+ uint32 bw = (_surface.w + 7) >> 3;
+ uint32 bh = (_surface.h + 7) >> 3;
+ uint32 blocks = bw * bh;
+
+ for (int i = 0; i < kSourceMAX; i++) {
+ _bundles[i].data = new byte[blocks * 64];
+ _bundles[i].dataEnd = _bundles[i].data + blocks * 64;
+ }
+
+ uint32 cbw[2] = { (_surface.w + 7) >> 3, (_surface.w + 15) >> 4 };
+ uint32 cw [2] = { _surface.w , _surface.w >> 1 };
+
+ // Calculate the lengths of an element count in bits
+ for (int i = 0; i < 2; i++) {
+ int width = MAX<uint32>(cw[i], 8);
+
+ _bundles[kSourceBlockTypes ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1;
+ _bundles[kSourceSubBlockTypes].countLengths[i] = Common::intLog2((width >> 4) + 511) + 1;
+ _bundles[kSourceColors ].countLengths[i] = Common::intLog2((cbw[i] )*64 + 511) + 1;
+ _bundles[kSourceIntraDC ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1;
+ _bundles[kSourceInterDC ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1;
+ _bundles[kSourceXOff ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1;
+ _bundles[kSourceYOff ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1;
+ _bundles[kSourcePattern ].countLengths[i] = Common::intLog2((cbw[i] << 3) + 511) + 1;
+ _bundles[kSourceRun ].countLengths[i] = Common::intLog2((cbw[i] )*48 + 511) + 1;
+ }
+}
+
+void BinkDecoder::deinitBundles() {
+ for (int i = 0; i < kSourceMAX; i++)
+ delete[] _bundles[i].data;
+}
+
+void BinkDecoder::initHuffman() {
+ for (int i = 0; i < 16; i++)
+ _huffman[i] = new Common::Huffman(binkHuffmanLengths[i][15], 16, binkHuffmanCodes[i], binkHuffmanLengths[i]);
+}
+
+byte BinkDecoder::getHuffmanSymbol(VideoFrame &video, Huffman &huffman) {
+ return huffman.symbols[_huffman[huffman.index]->getSymbol(*video.bits)];
+}
+
+int32 BinkDecoder::getBundleValue(Source source) {
+ if ((source < kSourceXOff) || (source == kSourceRun))
+ return *_bundles[source].curPtr++;
+
+ if ((source == kSourceXOff) || (source == kSourceYOff))
+ return (int8) *_bundles[source].curPtr++;
+
+ int16 ret = *((int16 *) _bundles[source].curPtr);
+
+ _bundles[source].curPtr += 2;
+
+ return ret;
+}
+
+uint32 BinkDecoder::readBundleCount(VideoFrame &video, Bundle &bundle) {
+ if (!bundle.curDec || (bundle.curDec > bundle.curPtr))
+ return 0;
+
+ uint32 n = video.bits->getBits(bundle.countLength);
+ if (n == 0)
+ bundle.curDec = 0;
+
+ return n;
+}
+
+void BinkDecoder::blockSkip(DecodeContext &ctx) {
+ byte *dest = ctx.dest;
+ byte *prev = ctx.prev;
+
+ for (int j = 0; j < 8; j++, dest += ctx.pitch, prev += ctx.pitch)
+ memcpy(dest, prev, 8);
+}
+
+void BinkDecoder::blockScaledSkip(DecodeContext &ctx) {
+ byte *dest = ctx.dest;
+ byte *prev = ctx.prev;
+
+ for (int j = 0; j < 16; j++, dest += ctx.pitch, prev += ctx.pitch)
+ memcpy(dest, prev, 16);
+}
+
+void BinkDecoder::blockScaledRun(DecodeContext &ctx) {
+ const uint8 *scan = binkPatterns[ctx.video->bits->getBits(4)];
+
+ int i = 0;
+ do {
+ int run = getBundleValue(kSourceRun) + 1;
+
+ i += run;
+ if (i > 64)
+ error("Run went out of bounds");
+
+ if (ctx.video->bits->getBit()) {
+
+ byte v = getBundleValue(kSourceColors);
+ for (int j = 0; j < run; j++, scan++)
+ ctx.dest[ctx.coordScaledMap1[*scan]] =
+ ctx.dest[ctx.coordScaledMap2[*scan]] =
+ ctx.dest[ctx.coordScaledMap3[*scan]] =
+ ctx.dest[ctx.coordScaledMap4[*scan]] = v;
+
+ } else
+ for (int j = 0; j < run; j++, scan++)
+ ctx.dest[ctx.coordScaledMap1[*scan]] =
+ ctx.dest[ctx.coordScaledMap2[*scan]] =
+ ctx.dest[ctx.coordScaledMap3[*scan]] =
+ ctx.dest[ctx.coordScaledMap4[*scan]] = getBundleValue(kSourceColors);
+
+ } while (i < 63);
+
+ if (i == 63)
+ ctx.dest[ctx.coordScaledMap1[*scan]] =
+ ctx.dest[ctx.coordScaledMap2[*scan]] =
+ ctx.dest[ctx.coordScaledMap3[*scan]] =
+ ctx.dest[ctx.coordScaledMap4[*scan]] = getBundleValue(kSourceColors);
+}
+
+void BinkDecoder::blockScaledIntra(DecodeContext &ctx) {
+ int16 block[64];
+ memset(block, 0, 64 * sizeof(int16));
+
+ block[0] = getBundleValue(kSourceIntraDC);
+
+ readDCTCoeffs(*ctx.video, block, true);
+
+ IDCT(block);
+
+ int16 *src = block;
+ byte *dest1 = ctx.dest;
+ byte *dest2 = ctx.dest + ctx.pitch;
+ for (int j = 0; j < 8; j++, dest1 += (ctx.pitch << 1) - 16, dest2 += (ctx.pitch << 1) - 16, src += 8) {
+
+ for (int i = 0; i < 8; i++, dest1 += 2, dest2 += 2)
+ dest1[0] = dest1[1] = dest2[0] = dest2[1] = src[i];
+
+ }
+}
+
+void BinkDecoder::blockScaledFill(DecodeContext &ctx) {
+ byte v = getBundleValue(kSourceColors);
+
+ byte *dest = ctx.dest;
+ for (int i = 0; i < 16; i++, dest += ctx.pitch)
+ memset(dest, v, 16);
+}
+
+void BinkDecoder::blockScaledPattern(DecodeContext &ctx) {
+ byte col[2];
+
+ for (int i = 0; i < 2; i++)
+ col[i] = getBundleValue(kSourceColors);
+
+ byte *dest1 = ctx.dest;
+ byte *dest2 = ctx.dest + ctx.pitch;
+ for (int j = 0; j < 8; j++, dest1 += (ctx.pitch << 1) - 16, dest2 += (ctx.pitch << 1) - 16) {
+ byte v = getBundleValue(kSourcePattern);
+
+ for (int i = 0; i < 8; i++, dest1 += 2, dest2 += 2, v >>= 1)
+ dest1[0] = dest1[1] = dest2[0] = dest2[1] = col[v & 1];
+ }
+}
+
+void BinkDecoder::blockScaledRaw(DecodeContext &ctx) {
+ byte row[8];
+
+ byte *dest1 = ctx.dest;
+ byte *dest2 = ctx.dest + ctx.pitch;
+ for (int j = 0; j < 8; j++, dest1 += (ctx.pitch << 1) - 16, dest2 += (ctx.pitch << 1) - 16) {
+ memcpy(row, _bundles[kSourceColors].curPtr, 8);
+
+ for (int i = 0; i < 8; i++, dest1 += 2, dest2 += 2)
+ dest1[0] = dest1[1] = dest2[0] = dest2[1] = row[i];
+
+ _bundles[kSourceColors].curPtr += 8;
+ }
+}
+
+void BinkDecoder::blockScaled(DecodeContext &ctx) {
+ BlockType blockType = (BlockType) getBundleValue(kSourceSubBlockTypes);
+
+ switch (blockType) {
+ case kBlockRun:
+ blockScaledRun(ctx);
+ break;
+
+ case kBlockIntra:
+ blockScaledIntra(ctx);
+ break;
+
+ case kBlockFill:
+ blockScaledFill(ctx);
+ break;
+
+ case kBlockPattern:
+ blockScaledPattern(ctx);
+ break;
+
+ case kBlockRaw:
+ blockScaledRaw(ctx);
+ break;
+
+ default:
+ error("Invalid 16x16 block type: %d", blockType);
+ }
+
+ ctx.blockX += 1;
+ ctx.dest += 8;
+ ctx.prev += 8;
+}
+
+void BinkDecoder::blockMotion(DecodeContext &ctx) {
+ int8 xOff = getBundleValue(kSourceXOff);
+ int8 yOff = getBundleValue(kSourceYOff);
+
+ byte *dest = ctx.dest;
+ byte *prev = ctx.prev + yOff * ((int32) ctx.pitch) + xOff;
+ if ((prev < ctx.prevStart) || (prev > ctx.prevEnd))
+ error("Copy out of bounds (%d | %d)", ctx.blockX * 8 + xOff, ctx.blockY * 8 + yOff);
+
+ for (int j = 0; j < 8; j++, dest += ctx.pitch, prev += ctx.pitch)
+ memcpy(dest, prev, 8);
+}
+
+void BinkDecoder::blockRun(DecodeContext &ctx) {
+ const uint8 *scan = binkPatterns[ctx.video->bits->getBits(4)];
+
+ int i = 0;
+ do {
+ int run = getBundleValue(kSourceRun) + 1;
+
+ i += run;
+ if (i > 64)
+ error("Run went out of bounds");
+
+ if (ctx.video->bits->getBit()) {
+
+ byte v = getBundleValue(kSourceColors);
+ for (int j = 0; j < run; j++)
+ ctx.dest[ctx.coordMap[*scan++]] = v;
+
+ } else
+ for (int j = 0; j < run; j++)
+ ctx.dest[ctx.coordMap[*scan++]] = getBundleValue(kSourceColors);
+
+ } while (i < 63);
+
+ if (i == 63)
+ ctx.dest[ctx.coordMap[*scan++]] = getBundleValue(kSourceColors);
+}
+
+void BinkDecoder::blockResidue(DecodeContext &ctx) {
+ blockMotion(ctx);
+
+ byte v = ctx.video->bits->getBits(7);
+
+ int16 block[64];
+ memset(block, 0, 64 * sizeof(int16));
+
+ readResidue(*ctx.video, block, v);
+
+ byte *dst = ctx.dest;
+ int16 *src = block;
+ for (int i = 0; i < 8; i++, dst += ctx.pitch, src += 8)
+ for (int j = 0; j < 8; j++)
+ dst[j] += src[j];
+}
+
+void BinkDecoder::blockIntra(DecodeContext &ctx) {
+ int16 block[64];
+ memset(block, 0, 64 * sizeof(int16));
+
+ block[0] = getBundleValue(kSourceIntraDC);
+
+ readDCTCoeffs(*ctx.video, block, true);
+
+ IDCTPut(ctx, block);
+}
+
+void BinkDecoder::blockFill(DecodeContext &ctx) {
+ byte v = getBundleValue(kSourceColors);
+
+ byte *dest = ctx.dest;
+ for (int i = 0; i < 8; i++, dest += ctx.pitch)
+ memset(dest, v, 8);
+}
+
+void BinkDecoder::blockInter(DecodeContext &ctx) {
+ blockMotion(ctx);
+
+ int16 block[64];
+ memset(block, 0, 64 * sizeof(int16));
+
+ block[0] = getBundleValue(kSourceInterDC);
+
+ readDCTCoeffs(*ctx.video, block, false);
+
+ IDCTAdd(ctx, block);
+}
+
+void BinkDecoder::blockPattern(DecodeContext &ctx) {
+ byte col[2];
+
+ for (int i = 0; i < 2; i++)
+ col[i] = getBundleValue(kSourceColors);
+
+ byte *dest = ctx.dest;
+ for (int i = 0; i < 8; i++, dest += ctx.pitch - 8) {
+ byte v = getBundleValue(kSourcePattern);
+
+ for (int j = 0; j < 8; j++, v >>= 1)
+ *dest++ = col[v & 1];
+ }
+}
+
+void BinkDecoder::blockRaw(DecodeContext &ctx) {
+ byte *dest = ctx.dest;
+ byte *data = _bundles[kSourceColors].curPtr;
+ for (int i = 0; i < 8; i++, dest += ctx.pitch, data += 8)
+ memcpy(dest, data, 8);
+
+ _bundles[kSourceColors].curPtr += 64;
+}
+
+void BinkDecoder::readRuns(VideoFrame &video, Bundle &bundle) {
+ uint32 n = readBundleCount(video, bundle);
+ if (n == 0)
+ return;
+
+ byte *decEnd = bundle.curDec + n;
+ if (decEnd > bundle.dataEnd)
+ error("Run value went out of bounds");
+
+ if (video.bits->getBit()) {
+ byte v = video.bits->getBits(4);
+
+ memset(bundle.curDec, v, n);
+ bundle.curDec += n;
+
+ } else
+ while (bundle.curDec < decEnd)
+ *bundle.curDec++ = getHuffmanSymbol(video, bundle.huffman);
+}
+
+void BinkDecoder::readMotionValues(VideoFrame &video, Bundle &bundle) {
+ uint32 n = readBundleCount(video, bundle);
+ if (n == 0)
+ return;
+
+ byte *decEnd = bundle.curDec + n;
+ if (decEnd > bundle.dataEnd)
+ error("Too many motion values");
+
+ if (video.bits->getBit()) {
+ byte v = video.bits->getBits(4);
+
+ if (v) {
+ int sign = -(int)video.bits->getBit();
+ v = (v ^ sign) - sign;
+ }
+
+ memset(bundle.curDec, v, n);
+
+ bundle.curDec += n;
+ return;
+ }
+
+ do {
+ byte v = getHuffmanSymbol(video, bundle.huffman);
+
+ if (v) {
+ int sign = -(int)video.bits->getBit();
+ v = (v ^ sign) - sign;
+ }
+
+ *bundle.curDec++ = v;
+
+ } while (bundle.curDec < decEnd);
+}
+
+const uint8 rleLens[4] = { 4, 8, 12, 32 };
+void BinkDecoder::readBlockTypes(VideoFrame &video, Bundle &bundle) {
+ uint32 n = readBundleCount(video, bundle);
+ if (n == 0)
+ return;
+
+ byte *decEnd = bundle.curDec + n;
+ if (decEnd > bundle.dataEnd)
+ error("Too many block type values");
+
+ if (video.bits->getBit()) {
+ byte v = video.bits->getBits(4);
+
+ memset(bundle.curDec, v, n);
+
+ bundle.curDec += n;
+ return;
+ }
+
+ byte last = 0;
+ do {
+
+ byte v = getHuffmanSymbol(video, bundle.huffman);
+
+ if (v < 12) {
+ last = v;
+ *bundle.curDec++ = v;
+ } else {
+ int run = rleLens[v - 12];
+
+ memset(bundle.curDec, last, run);
+
+ bundle.curDec += run;
+ }
+
+ } while (bundle.curDec < decEnd);
+}
+
+void BinkDecoder::readPatterns(VideoFrame &video, Bundle &bundle) {
+ uint32 n = readBundleCount(video, bundle);
+ if (n == 0)
+ return;
+
+ byte *decEnd = bundle.curDec + n;
+ if (decEnd > bundle.dataEnd)
+ error("Too many pattern values");
+
+ byte v;
+ while (bundle.curDec < decEnd) {
+ v = getHuffmanSymbol(video, bundle.huffman);
+ v |= getHuffmanSymbol(video, bundle.huffman) << 4;
+ *bundle.curDec++ = v;
+ }
+}
+
+
+void BinkDecoder::readColors(VideoFrame &video, Bundle &bundle) {
+ uint32 n = readBundleCount(video, bundle);
+ if (n == 0)
+ return;
+
+ byte *decEnd = bundle.curDec + n;
+ if (decEnd > bundle.dataEnd)
+ error("Too many color values");
+
+ if (video.bits->getBit()) {
+ _colLastVal = getHuffmanSymbol(video, _colHighHuffman[_colLastVal]);
+
+ byte v;
+ v = getHuffmanSymbol(video, bundle.huffman);
+ v = (_colLastVal << 4) | v;
+
+ if (_id != kBIKiID) {
+ int sign = ((int8) v) >> 7;
+ v = ((v & 0x7F) ^ sign) - sign;
+ v += 0x80;
+ }
+
+ memset(bundle.curDec, v, n);
+ bundle.curDec += n;
+
+ return;
+ }
+
+ while (bundle.curDec < decEnd) {
+ _colLastVal = getHuffmanSymbol(video, _colHighHuffman[_colLastVal]);
+
+ byte v;
+ v = getHuffmanSymbol(video, bundle.huffman);
+ v = (_colLastVal << 4) | v;
+
+ if (_id != kBIKiID) {
+ int sign = ((int8) v) >> 7;
+ v = ((v & 0x7F) ^ sign) - sign;
+ v += 0x80;
+ }
+ *bundle.curDec++ = v;
+ }
+}
+
+void BinkDecoder::readDCS(VideoFrame &video, Bundle &bundle, int startBits, bool hasSign) {
+ uint32 length = readBundleCount(video, bundle);
+ if (length == 0)
+ return;
+
+ int16 *dest = (int16 *) bundle.curDec;
+
+ int32 v = video.bits->getBits(startBits - (hasSign ? 1 : 0));
+ if (v && hasSign) {
+ int sign = -(int)video.bits->getBit();
+ v = (v ^ sign) - sign;
+ }
+
+ *dest++ = v;
+ length--;
+
+ for (uint32 i = 0; i < length; i += 8) {
+ uint32 length2 = MIN<uint32>(length - i, 8);
+
+ byte bSize = video.bits->getBits(4);
+
+ if (bSize) {
+
+ for (uint32 j = 0; j < length2; j++) {
+ int16 v2 = video.bits->getBits(bSize);
+ if (v2) {
+ int sign = -(int)video.bits->getBit();
+ v2 = (v2 ^ sign) - sign;
+ }
+
+ v += v2;
+ *dest++ = v;
+
+ if ((v < -32768) || (v > 32767))
+ error("DC value went out of bounds: %d", v);
+ }
+
+ } else
+ for (uint32 j = 0; j < length2; j++)
+ *dest++ = v;
+ }
+
+ bundle.curDec = (byte *) dest;
+}
+
+/** Reads 8x8 block of DCT coefficients. */
+void BinkDecoder::readDCTCoeffs(VideoFrame &video, int16 *block, bool isIntra) {
+ int coefCount = 0;
+ int coefIdx[64];
+
+ int listStart = 64;
+ int listEnd = 64;
+
+ int coefList[128]; int modeList[128];
+ coefList[listEnd] = 4; modeList[listEnd++] = 0;
+ coefList[listEnd] = 24; modeList[listEnd++] = 0;
+ coefList[listEnd] = 44; modeList[listEnd++] = 0;
+ coefList[listEnd] = 1; modeList[listEnd++] = 3;
+ coefList[listEnd] = 2; modeList[listEnd++] = 3;
+ coefList[listEnd] = 3; modeList[listEnd++] = 3;
+
+ int bits = video.bits->getBits(4) - 1;
+ for (int mask = 1 << bits; bits >= 0; mask >>= 1, bits--) {
+ int listPos = listStart;
+
+ while (listPos < listEnd) {
+
+ if (!(modeList[listPos] | coefList[listPos]) || !video.bits->getBit()) {
+ listPos++;
+ continue;
+ }
+
+ int ccoef = coefList[listPos];
+ int mode = modeList[listPos];
+
+ switch (mode) {
+ case 0:
+ coefList[listPos] = ccoef + 4;
+ modeList[listPos] = 1;
+ case 2:
+ if (mode == 2) {
+ coefList[listPos] = 0;
+ modeList[listPos++] = 0;
+ }
+ for (int i = 0; i < 4; i++, ccoef++) {
+ if (video.bits->getBit()) {
+ coefList[--listStart] = ccoef;
+ modeList[ listStart] = 3;
+ } else {
+ int t;
+ if (!bits) {
+ t = 1 - (video.bits->getBit() << 1);
+ } else {
+ t = video.bits->getBits(bits) | mask;
+
+ int sign = -(int)video.bits->getBit();
+ t = (t ^ sign) - sign;
+ }
+ block[binkScan[ccoef]] = t;
+ coefIdx[coefCount++] = ccoef;
+ }
+ }
+ break;
+
+ case 1:
+ modeList[listPos] = 2;
+ for (int i = 0; i < 3; i++) {
+ ccoef += 4;
+ coefList[listEnd] = ccoef;
+ modeList[listEnd++] = 2;
+ }
+ break;
+
+ case 3:
+ int t;
+ if (!bits) {
+ t = 1 - (video.bits->getBit() << 1);
+ } else {
+ t = video.bits->getBits(bits) | mask;
+
+ int sign = -(int)video.bits->getBit();
+ t = (t ^ sign) - sign;
+ }
+ block[binkScan[ccoef]] = t;
+ coefIdx[coefCount++] = ccoef;
+ coefList[listPos] = 0;
+ modeList[listPos++] = 0;
+ break;
+ }
+ }
+ }
+
+ uint8 quantIdx = video.bits->getBits(4);
+ const uint32 *quant = isIntra ? binkIntraQuant[quantIdx] : binkInterQuant[quantIdx];
+ block[0] = (block[0] * quant[0]) >> 11;
+
+ for (int i = 0; i < coefCount; i++) {
+ int idx = coefIdx[i];
+ block[binkScan[idx]] = (block[binkScan[idx]] * quant[idx]) >> 11;
+ }
+
+}
+
+/** Reads 8x8 block with residue after motion compensation. */
+void BinkDecoder::readResidue(VideoFrame &video, int16 *block, int masksCount) {
+ int nzCoeff[64];
+ int nzCoeffCount = 0;
+
+ int listStart = 64;
+ int listEnd = 64;
+
+ int coefList[128]; int modeList[128];
+ coefList[listEnd] = 4; modeList[listEnd++] = 0;
+ coefList[listEnd] = 24; modeList[listEnd++] = 0;
+ coefList[listEnd] = 44; modeList[listEnd++] = 0;
+ coefList[listEnd] = 0; modeList[listEnd++] = 2;
+
+ for (int mask = 1 << video.bits->getBits(3); mask; mask >>= 1) {
+
+ for (int i = 0; i < nzCoeffCount; i++) {
+ if (!video.bits->getBit())
+ continue;
+ if (block[nzCoeff[i]] < 0)
+ block[nzCoeff[i]] -= mask;
+ else
+ block[nzCoeff[i]] += mask;
+ masksCount--;
+ if (masksCount < 0)
+ return;
+ }
+
+ int listPos = listStart;
+ while (listPos < listEnd) {
+
+ if (!(coefList[listPos] | modeList[listPos]) || !video.bits->getBit()) {
+ listPos++;
+ continue;
+ }
+
+ int ccoef = coefList[listPos];
+ int mode = modeList[listPos];
+
+ switch (mode) {
+ case 0:
+ coefList[listPos] = ccoef + 4;
+ modeList[listPos] = 1;
+ case 2:
+ if (mode == 2) {
+ coefList[listPos] = 0;
+ modeList[listPos++] = 0;
+ }
+
+ for (int i = 0; i < 4; i++, ccoef++) {
+ if (video.bits->getBit()) {
+ coefList[--listStart] = ccoef;
+ modeList[ listStart] = 3;
+ } else {
+ nzCoeff[nzCoeffCount++] = binkScan[ccoef];
+
+ int sign = -(int)video.bits->getBit();
+ block[binkScan[ccoef]] = (mask ^ sign) - sign;
+
+ masksCount--;
+ if (masksCount < 0)
+ return;
+ }
+ }
+ break;
+
+ case 1:
+ modeList[listPos] = 2;
+ for (int i = 0; i < 3; i++) {
+ ccoef += 4;
+ coefList[listEnd] = ccoef;
+ modeList[listEnd++] = 2;
+ }
+ break;
+
+ case 3:
+ nzCoeff[nzCoeffCount++] = binkScan[ccoef];
+
+ int sign = -(int)video.bits->getBit();
+ block[binkScan[ccoef]] = (mask ^ sign) - sign;
+
+ coefList[listPos] = 0;
+ modeList[listPos++] = 0;
+ masksCount--;
+ if (masksCount < 0)
+ return;
+ break;
+ }
+ }
+ }
+}
+
+float BinkDecoder::getFloat(AudioTrack &audio) {
+ int power = audio.bits->getBits(5);
+
+ float f = ldexp((float)audio.bits->getBits(23), power - 23);
+
+ if (audio.bits->getBit())
+ f = -f;
+
+ return f;
+}
+
+void BinkDecoder::audioBlock(AudioTrack &audio, int16 *out) {
+ if (audio.codec == kAudioCodecDCT)
+ audioBlockDCT (audio);
+ else if (audio.codec == kAudioCodecRDFT)
+ audioBlockRDFT(audio);
+
+ floatToInt16Interleave(out, const_cast<const float **>(audio.coeffsPtr), audio.frameLen, audio.channels);
+
+ if (!audio.first) {
+ int count = audio.overlapLen * audio.channels;
+ int shift = Common::intLog2(count);
+ for (int i = 0; i < count; i++) {
+ out[i] = (audio.prevCoeffs[i] * (count - i) + out[i] * i) >> shift;
+ }
+ }
+
+ memcpy(audio.prevCoeffs, out + audio.blockSize, audio.overlapLen * audio.channels * sizeof(*out));
+
+ audio.first = false;
+}
+
+void BinkDecoder::audioBlockDCT(AudioTrack &audio) {
+ audio.bits->skip(2);
+
+ for (uint8 i = 0; i < audio.channels; i++) {
+ float *coeffs = audio.coeffsPtr[i];
+
+ readAudioCoeffs(audio, coeffs);
+
+ coeffs[0] /= 0.5;
+
+ audio.dct->calc(coeffs);
+
+ for (uint32 j = 0; j < audio.frameLen; j++)
+ coeffs[j] *= (audio.frameLen / 2.0);
+ }
+
+}
+
+void BinkDecoder::audioBlockRDFT(AudioTrack &audio) {
+ for (uint8 i = 0; i < audio.channels; i++) {
+ float *coeffs = audio.coeffsPtr[i];
+
+ readAudioCoeffs(audio, coeffs);
+
+ audio.rdft->calc(coeffs);
+ }
+}
+
+static const uint8 rleLengthTab[16] = {
+ 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 32, 64
+};
+
+void BinkDecoder::readAudioCoeffs(AudioTrack &audio, float *coeffs) {
+ coeffs[0] = getFloat(audio) * audio.root;
+ coeffs[1] = getFloat(audio) * audio.root;
+
+ float quant[25];
+
+ for (uint32 i = 0; i < audio.bandCount; i++) {
+ int value = audio.bits->getBits(8);
+
+ // 0.066399999 / log10(M_E)
+ quant[i] = exp(MIN(value, 95) * 0.15289164787221953823f) * audio.root;
+ }
+
+ float q = 0.0;
+
+ // Find band (k)
+ int k;
+ for (k = 0; audio.bands[k] < 1; k++)
+ q = quant[k];
+
+ // Parse coefficients
+ uint32 i = 2;
+ while (i < audio.frameLen) {
+
+ uint32 j = 0;
+ if (audio.bits->getBit())
+ j = i + rleLengthTab[audio.bits->getBits(4)] * 8;
+ else
+ j = i + 8;
+
+ j = MIN(j, audio.frameLen);
+
+ int width = audio.bits->getBits(4);
+ if (width == 0) {
+
+ memset(coeffs + i, 0, (j - i) * sizeof(*coeffs));
+ i = j;
+ while (audio.bands[k] * 2 < i)
+ q = quant[k++];
+
+ } else {
+
+ while (i < j) {
+ if (audio.bands[k] * 2 == i)
+ q = quant[k++];
+
+ int coeff = audio.bits->getBits(width);
+ if (coeff) {
+
+ if (audio.bits->getBit())
+ coeffs[i] = -q * coeff;
+ else
+ coeffs[i] = q * coeff;
+
+ } else {
+ coeffs[i] = 0.0;
+ }
+ i++;
+ }
+
+ }
+
+ }
+
+}
+
+static inline int floatToInt16One(float src) {
+ return (int16) CLIP<int>((int) floor(src + 0.5), -32768, 32767);
+}
+
+void BinkDecoder::floatToInt16Interleave(int16 *dst, const float **src, uint32 length, uint8 channels) {
+ if (channels == 2) {
+ for (uint32 i = 0; i < length; i++) {
+ dst[2 * i ] = floatToInt16One(src[0][i]);
+ dst[2 * i + 1] = floatToInt16One(src[1][i]);
+ }
+ } else {
+ for(uint8 c = 0; c < channels; c++)
+ for(uint32 i = 0, j = c; i < length; i++, j += channels)
+ dst[j] = floatToInt16One(src[c][i]);
+ }
+}
+
+#define A1 2896 /* (1/sqrt(2))<<12 */
+#define A2 2217
+#define A3 3784
+#define A4 -5352
+
+#define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\
+ const int a0 = (src)[s0] + (src)[s4]; \
+ const int a1 = (src)[s0] - (src)[s4]; \
+ const int a2 = (src)[s2] + (src)[s6]; \
+ const int a3 = (A1*((src)[s2] - (src)[s6])) >> 11; \
+ const int a4 = (src)[s5] + (src)[s3]; \
+ const int a5 = (src)[s5] - (src)[s3]; \
+ const int a6 = (src)[s1] + (src)[s7]; \
+ const int a7 = (src)[s1] - (src)[s7]; \
+ const int b0 = a4 + a6; \
+ const int b1 = (A3*(a5 + a7)) >> 11; \
+ const int b2 = ((A4*a5) >> 11) - b0 + b1; \
+ const int b3 = (A1*(a6 - a4) >> 11) - b2; \
+ const int b4 = ((A2*a7) >> 11) + b3 - b1; \
+ (dest)[d0] = munge(a0+a2 +b0); \
+ (dest)[d1] = munge(a1+a3-a2+b2); \
+ (dest)[d2] = munge(a1-a3+a2+b3); \
+ (dest)[d3] = munge(a0-a2 -b4); \
+ (dest)[d4] = munge(a0-a2 +b4); \
+ (dest)[d5] = munge(a1-a3+a2-b3); \
+ (dest)[d6] = munge(a1+a3-a2-b2); \
+ (dest)[d7] = munge(a0+a2 -b0); \
+}
+/* end IDCT_TRANSFORM macro */
+
+#define MUNGE_NONE(x) (x)
+#define IDCT_COL(dest,src) IDCT_TRANSFORM(dest,0,8,16,24,32,40,48,56,0,8,16,24,32,40,48,56,MUNGE_NONE,src)
+
+#define MUNGE_ROW(x) (((x) + 0x7F)>>8)
+#define IDCT_ROW(dest,src) IDCT_TRANSFORM(dest,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,MUNGE_ROW,src)
+
+static inline void IDCTCol(int16 *dest, const int16 *src)
+{
+ if ((src[8] | src[16] | src[24] | src[32] | src[40] | src[48] | src[56]) == 0) {
+ dest[ 0] =
+ dest[ 8] =
+ dest[16] =
+ dest[24] =
+ dest[32] =
+ dest[40] =
+ dest[48] =
+ dest[56] = src[0];
+ } else {
+ IDCT_COL(dest, src);
+ }
+}
+
+void BinkDecoder::IDCT(int16 *block) {
+ int i;
+ int16 temp[64];
+
+ for (i = 0; i < 8; i++)
+ IDCTCol(&temp[i], &block[i]);
+ for (i = 0; i < 8; i++) {
+ IDCT_ROW( (&block[8*i]), (&temp[8*i]) );
+ }
+}
+
+void BinkDecoder::IDCTAdd(DecodeContext &ctx, int16 *block) {
+ int i, j;
+
+ IDCT(block);
+ byte *dest = ctx.dest;
+ for (i = 0; i < 8; i++, dest += ctx.pitch, block += 8)
+ for (j = 0; j < 8; j++)
+ dest[j] += block[j];
+}
+
+void BinkDecoder::IDCTPut(DecodeContext &ctx, int16 *block) {
+ int i;
+ int16 temp[64];
+ for (i = 0; i < 8; i++)
+ IDCTCol(&temp[i], &block[i]);
+ for (i = 0; i < 8; i++) {
+ IDCT_ROW( (&ctx.dest[i*ctx.pitch]), (&temp[8*i]) );
+ }
+}
+
+} // End of namespace Video
diff --git a/video/bink_decoder.h b/video/bink_decoder.h
new file mode 100644
index 0000000000..dd1b7ca67d
--- /dev/null
+++ b/video/bink_decoder.h
@@ -0,0 +1,336 @@
+/* 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.
+ *
+ */
+
+// Based on eos' Bink decoder which is in turn
+// based quite heavily on the Bink decoder found in FFmpeg.
+// Many thanks to Kostya Shishkov for doing the hard work.
+
+#include "common/scummsys.h"
+
+#ifdef USE_BINK
+
+#ifndef VIDEO_BINK_DECODER_H
+#define VIDEO_BINK_DECODER_H
+
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+#include "common/array.h"
+#include "common/rational.h"
+
+#include "graphics/surface.h"
+
+#include "video/video_decoder.h"
+
+namespace Common {
+ class SeekableReadStream;
+ class BitStream;
+ class Huffman;
+
+ class RDFT;
+ class DCT;
+}
+
+namespace Video {
+
+/**
+ * Decoder for Bink videos.
+ *
+ * Video decoder used in engines:
+ * - scumm (he)
+ */
+class BinkDecoder : public FixedRateVideoDecoder {
+public:
+ BinkDecoder();
+ ~BinkDecoder();
+
+ // VideoDecoder API
+ bool loadStream(Common::SeekableReadStream *stream);
+ void close();
+ bool isVideoLoaded() const { return _bink != 0; }
+ uint16 getWidth() const { return _surface.w; }
+ uint16 getHeight() const { return _surface.h; }
+ Graphics::PixelFormat getPixelFormat() const { return _surface.format; }
+ uint32 getFrameCount() const { return _frames.size(); }
+ uint32 getElapsedTime() const;
+ const Graphics::Surface *decodeNextFrame();
+
+ // FixedRateVideoDecoder
+ Common::Rational getFrameRate() const { return _frameRate; }
+
+private:
+ static const int kAudioChannelsMax = 2;
+ static const int kAudioBlockSizeMax = (kAudioChannelsMax << 11);
+
+ /** IDs for different data types used in Bink video codec. */
+ enum Source {
+ kSourceBlockTypes = 0, ///< 8x8 block types.
+ kSourceSubBlockTypes , ///< 16x16 block types (a subset of 8x8 block types).
+ kSourceColors , ///< Pixel values used for different block types.
+ kSourcePattern , ///< 8-bit values for 2-color pattern fill.
+ kSourceXOff , ///< X components of motion value.
+ kSourceYOff , ///< Y components of motion value.
+ kSourceIntraDC , ///< DC values for intrablocks with DCT.
+ kSourceInterDC , ///< DC values for interblocks with DCT.
+ kSourceRun , ///< Run lengths for special fill block.
+
+ kSourceMAX
+ };
+
+ /** Bink video block types. */
+ enum BlockType {
+ kBlockSkip = 0, ///< Skipped block.
+ kBlockScaled , ///< Block has size 16x16.
+ kBlockMotion , ///< Block is copied from previous frame with some offset.
+ kBlockRun , ///< Block is composed from runs of colors with custom scan order.
+ kBlockResidue , ///< Motion block with some difference added.
+ kBlockIntra , ///< Intra DCT block.
+ kBlockFill , ///< Block is filled with single color.
+ kBlockInter , ///< Motion block with DCT applied to the difference.
+ kBlockPattern , ///< Block is filled with two colors following custom pattern.
+ kBlockRaw ///< Uncoded 8x8 block.
+ };
+
+ /** Data structure for decoding and tranlating Huffman'd data. */
+ struct Huffman {
+ int index; ///< Index of the Huffman codebook to use.
+ byte symbols[16]; ///< Huffman symbol => Bink symbol tranlation list.
+ };
+
+ /** Data structure used for decoding a single Bink data type. */
+ struct Bundle {
+ int countLengths[2]; ///< Lengths of number of entries to decode (in bits).
+ int countLength; ///< Length of number of entries to decode (in bits) for the current plane.
+
+ Huffman huffman; ///< Huffman codebook.
+
+ byte *data; ///< Buffer for decoded symbols.
+ byte *dataEnd; ///< Buffer end.
+
+ byte *curDec; ///< Pointer to the data that wasn't yet decoded.
+ byte *curPtr; ///< Pointer to the data that wasn't yet read.
+ };
+
+ enum AudioCodec {
+ kAudioCodecDCT,
+ kAudioCodecRDFT
+ };
+
+ /** An audio track. */
+ struct AudioTrack {
+ uint16 flags;
+
+ uint32 sampleRate;
+ uint8 channels;
+
+ uint32 outSampleRate;
+ uint8 outChannels;
+
+ AudioCodec codec;
+
+ uint32 sampleCount;
+
+ Common::BitStream *bits;
+
+ bool first;
+
+ uint32 frameLen;
+ uint32 overlapLen;
+
+ uint32 blockSize;
+
+ uint32 bandCount;
+ uint32 *bands;
+
+ float root;
+
+ float coeffs[16 * kAudioBlockSizeMax];
+ int16 prevCoeffs[kAudioBlockSizeMax];
+
+ float *coeffsPtr[kAudioChannelsMax];
+
+ Common::RDFT *rdft;
+ Common::DCT *dct;
+
+ AudioTrack();
+ ~AudioTrack();
+ };
+
+ /** A video frame. */
+ struct VideoFrame {
+ bool keyFrame;
+
+ uint32 offset;
+ uint32 size;
+
+ Common::BitStream *bits;
+
+ VideoFrame();
+ ~VideoFrame();
+ };
+
+ /** A decoder state. */
+ struct DecodeContext {
+ VideoFrame *video;
+
+ uint32 planeIdx;
+
+ uint32 blockX;
+ uint32 blockY;
+
+ byte *dest;
+ byte *prev;
+
+ byte *destStart, *destEnd;
+ byte *prevStart, *prevEnd;
+
+ uint32 pitch;
+
+ int coordMap[64];
+ int coordScaledMap1[64];
+ int coordScaledMap2[64];
+ int coordScaledMap3[64];
+ int coordScaledMap4[64];
+ };
+
+ Common::SeekableReadStream *_bink;
+
+ uint32 _id; ///< The BIK FourCC.
+
+ Common::Rational _frameRate;
+
+ Graphics::Surface _surface;
+
+ Audio::SoundHandle _audioHandle;
+ Audio::QueuingAudioStream *_audioStream;
+ bool _audioStarted;
+
+ uint32 _videoFlags; ///< Video frame features.
+
+ bool _hasAlpha; ///< Do video frames have alpha?
+ bool _swapPlanes; ///< Are the planes ordered (A)YVU instead of (A)YUV?
+
+ uint32 _audioFrame;
+
+ Common::Array<AudioTrack> _audioTracks; ///< All audio tracks.
+ Common::Array<VideoFrame> _frames; ///< All video frames.
+
+ uint32 _audioTrack; ///< Audio track to use.
+
+ Common::Huffman *_huffman[16]; ///< The 16 Huffman codebooks used in Bink decoding.
+
+ Bundle _bundles[kSourceMAX]; ///< Bundles for decoding all data types.
+
+ /** Huffman codebooks to use for decoding high nibbles in color data types. */
+ Huffman _colHighHuffman[16];
+ /** Value of the last decoded high nibble in color data types. */
+ int _colLastVal;
+
+ byte *_curPlanes[4]; ///< The 4 color planes, YUVA, current frame.
+ byte *_oldPlanes[4]; ///< The 4 color planes, YUVA, last frame.
+
+
+ /** Initialize the bundles. */
+ void initBundles();
+ /** Deinitialize the bundles. */
+ void deinitBundles();
+
+ /** Initialize the Huffman decoders. */
+ void initHuffman();
+
+ /** Decode an audio packet. */
+ void audioPacket(AudioTrack &audio);
+ /** Decode a video packet. */
+ void videoPacket(VideoFrame &video);
+
+ /** Decode a plane. */
+ void decodePlane(VideoFrame &video, int planeIdx, bool isChroma);
+
+ /** Read/Initialize a bundle for decoding a plane. */
+ void readBundle(VideoFrame &video, Source source);
+
+ /** Read the symbols for a Huffman code. */
+ void readHuffman(VideoFrame &video, Huffman &huffman);
+ /** Merge two Huffman symbol lists. */
+ void mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte *src, int size);
+
+ /** Read and translate a symbol out of a Huffman code. */
+ byte getHuffmanSymbol(VideoFrame &video, Huffman &huffman);
+
+ /** Get a direct value out of a bundle. */
+ int32 getBundleValue(Source source);
+ /** Read a count value out of a bundle. */
+ uint32 readBundleCount(VideoFrame &video, Bundle &bundle);
+
+ // Handle the block types
+ void blockSkip (DecodeContext &ctx);
+ void blockScaledSkip (DecodeContext &ctx);
+ void blockScaledRun (DecodeContext &ctx);
+ void blockScaledIntra (DecodeContext &ctx);
+ void blockScaledFill (DecodeContext &ctx);
+ void blockScaledPattern(DecodeContext &ctx);
+ void blockScaledRaw (DecodeContext &ctx);
+ void blockScaled (DecodeContext &ctx);
+ void blockMotion (DecodeContext &ctx);
+ void blockRun (DecodeContext &ctx);
+ void blockResidue (DecodeContext &ctx);
+ void blockIntra (DecodeContext &ctx);
+ void blockFill (DecodeContext &ctx);
+ void blockInter (DecodeContext &ctx);
+ void blockPattern (DecodeContext &ctx);
+ void blockRaw (DecodeContext &ctx);
+
+ // Read the bundles
+ void readRuns (VideoFrame &video, Bundle &bundle);
+ void readMotionValues(VideoFrame &video, Bundle &bundle);
+ void readBlockTypes (VideoFrame &video, Bundle &bundle);
+ void readPatterns (VideoFrame &video, Bundle &bundle);
+ void readColors (VideoFrame &video, Bundle &bundle);
+ void readDCS (VideoFrame &video, Bundle &bundle, int startBits, bool hasSign);
+ void readDCTCoeffs (VideoFrame &video, int16 *block, bool isIntra);
+ void readResidue (VideoFrame &video, int16 *block, int masksCount);
+
+ void initAudioTrack(AudioTrack &audio);
+
+ float getFloat(AudioTrack &audio);
+
+ /** Decode an audio block. */
+ void audioBlock (AudioTrack &audio, int16 *out);
+ /** Decode a DCT'd audio block. */
+ void audioBlockDCT (AudioTrack &audio);
+ /** Decode a RDFT'd audio block. */
+ void audioBlockRDFT(AudioTrack &audio);
+
+ void readAudioCoeffs(AudioTrack &audio, float *coeffs);
+
+ void floatToInt16Interleave(int16 *dst, const float **src, uint32 length, uint8 channels);
+
+ // Bink video IDCT
+ void IDCT(int16 *block);
+ void IDCTPut(DecodeContext &ctx, int16 *block);
+ void IDCTAdd(DecodeContext &ctx, int16 *block);
+};
+
+} // End of namespace Video
+
+#endif // VIDEO_BINK_DECODER_H
+
+#endif // USE_BINK
diff --git a/video/binkdata.h b/video/binkdata.h
new file mode 100644
index 0000000000..02105a7493
--- /dev/null
+++ b/video/binkdata.h
@@ -0,0 +1,578 @@
+/* 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 VIDEO_BINKDATA_H
+#define VIDEO_BINKDATA_H
+
+#include "common/scummsys.h"
+
+namespace Video {
+
+static const uint16 binkCriticalFreqs[25] = {
+ 100, 200, 300, 400, 510, 630, 770, 920,
+ 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150,
+ 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500,
+ 24500,
+};
+
+/** Bink DCT and residue 8x8 block scan order */
+static const uint8 binkScan[64] = {
+ 0, 1, 8, 9, 2, 3, 10, 11,
+ 4, 5, 12, 13, 6, 7, 14, 15,
+ 20, 21, 28, 29, 22, 23, 30, 31,
+ 16, 17, 24, 25, 32, 33, 40, 41,
+ 34, 35, 42, 43, 48, 49, 56, 57,
+ 50, 51, 58, 59, 18, 19, 26, 27,
+ 36, 37, 44, 45, 38, 39, 46, 47,
+ 52, 53, 60, 61, 54, 55, 62, 63
+};
+
+static const uint32 binkHuffmanCodes[16][16] = {
+ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F },
+ { 0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F },
+ { 0x00, 0x02, 0x01, 0x09, 0x05, 0x15, 0x0D, 0x1D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F },
+ { 0x00, 0x02, 0x06, 0x01, 0x09, 0x05, 0x0D, 0x1D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F },
+ { 0x00, 0x04, 0x02, 0x06, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F },
+ { 0x00, 0x04, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x17, 0x0F, 0x1F },
+ { 0x00, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F },
+ { 0x00, 0x01, 0x05, 0x03, 0x13, 0x0B, 0x1B, 0x3B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F },
+ { 0x00, 0x01, 0x03, 0x13, 0x0B, 0x2B, 0x1B, 0x3B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F },
+ { 0x00, 0x01, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F },
+ { 0x00, 0x02, 0x01, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F },
+ { 0x00, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F },
+ { 0x00, 0x02, 0x01, 0x03, 0x13, 0x0B, 0x1B, 0x3B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F },
+ { 0x00, 0x01, 0x05, 0x03, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x4F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F },
+ { 0x00, 0x01, 0x05, 0x03, 0x07, 0x17, 0x37, 0x77, 0x0F, 0x4F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F },
+ { 0x00, 0x02, 0x01, 0x05, 0x03, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F }
+};
+
+static const uint8 binkHuffmanLengths[16][16] = {
+ { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 },
+ { 1, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 },
+ { 2, 2, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 },
+ { 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 },
+ { 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5 },
+ { 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5 },
+ { 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5 },
+ { 1, 3, 3, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
+ { 1, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
+ { 1, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6 },
+ { 2, 2, 3, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 },
+ { 1, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 },
+ { 2, 2, 2, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
+ { 1, 3, 3, 3, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 },
+ { 1, 3, 3, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
+ { 2, 2, 3, 3, 3, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7 }
+};
+
+static const uint8 binkPatterns[16][64] = {
+{
+ 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38,
+ 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01,
+ 0x02, 0x0A, 0x12, 0x1A, 0x22, 0x2A, 0x32, 0x3A,
+ 0x3B, 0x33, 0x2B, 0x23, 0x1B, 0x13, 0x0B, 0x03,
+ 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C,
+ 0x3D, 0x35, 0x2D, 0x25, 0x1D, 0x15, 0x0D, 0x05,
+ 0x06, 0x0E, 0x16, 0x1E, 0x26, 0x2E, 0x36, 0x3E,
+ 0x3F, 0x37, 0x2F, 0x27, 0x1F, 0x17, 0x0F, 0x07
+},
+{
+ 0x3B, 0x3A, 0x39, 0x38, 0x30, 0x31, 0x32, 0x33,
+ 0x2B, 0x2A, 0x29, 0x28, 0x20, 0x21, 0x22, 0x23,
+ 0x1B, 0x1A, 0x19, 0x18, 0x10, 0x11, 0x12, 0x13,
+ 0x0B, 0x0A, 0x09, 0x08, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x0F, 0x0E, 0x0D, 0x0C,
+ 0x14, 0x15, 0x16, 0x17, 0x1F, 0x1E, 0x1D, 0x1C,
+ 0x24, 0x25, 0x26, 0x27, 0x2F, 0x2E, 0x2D, 0x2C,
+ 0x34, 0x35, 0x36, 0x37, 0x3F, 0x3E, 0x3D, 0x3C
+},
+{
+ 0x19, 0x11, 0x12, 0x1A, 0x1B, 0x13, 0x0B, 0x03,
+ 0x02, 0x0A, 0x09, 0x01, 0x00, 0x08, 0x10, 0x18,
+ 0x20, 0x28, 0x30, 0x38, 0x39, 0x31, 0x29, 0x2A,
+ 0x32, 0x3A, 0x3B, 0x33, 0x2B, 0x23, 0x22, 0x21,
+ 0x1D, 0x15, 0x16, 0x1E, 0x1F, 0x17, 0x0F, 0x07,
+ 0x06, 0x0E, 0x0D, 0x05, 0x04, 0x0C, 0x14, 0x1C,
+ 0x24, 0x2C, 0x34, 0x3C, 0x3D, 0x35, 0x2D, 0x2E,
+ 0x36, 0x3E, 0x3F, 0x37, 0x2F, 0x27, 0x26, 0x25
+},
+{
+ 0x03, 0x0B, 0x02, 0x0A, 0x01, 0x09, 0x00, 0x08,
+ 0x10, 0x18, 0x11, 0x19, 0x12, 0x1A, 0x13, 0x1B,
+ 0x23, 0x2B, 0x22, 0x2A, 0x21, 0x29, 0x20, 0x28,
+ 0x30, 0x38, 0x31, 0x39, 0x32, 0x3A, 0x33, 0x3B,
+ 0x3C, 0x34, 0x3D, 0x35, 0x3E, 0x36, 0x3F, 0x37,
+ 0x2F, 0x27, 0x2E, 0x26, 0x2D, 0x25, 0x2C, 0x24,
+ 0x1C, 0x14, 0x1D, 0x15, 0x1E, 0x16, 0x1F, 0x17,
+ 0x0F, 0x07, 0x0E, 0x06, 0x0D, 0x05, 0x0C, 0x04
+},
+{
+ 0x18, 0x19, 0x10, 0x11, 0x08, 0x09, 0x00, 0x01,
+ 0x02, 0x03, 0x0A, 0x0B, 0x12, 0x13, 0x1A, 0x1B,
+ 0x1C, 0x1D, 0x14, 0x15, 0x0C, 0x0D, 0x04, 0x05,
+ 0x06, 0x07, 0x0E, 0x0F, 0x16, 0x17, 0x1E, 0x1F,
+ 0x27, 0x26, 0x2F, 0x2E, 0x37, 0x36, 0x3F, 0x3E,
+ 0x3D, 0x3C, 0x35, 0x34, 0x2D, 0x2C, 0x25, 0x24,
+ 0x23, 0x22, 0x2B, 0x2A, 0x33, 0x32, 0x3B, 0x3A,
+ 0x39, 0x38, 0x31, 0x30, 0x29, 0x28, 0x21, 0x20
+},
+{
+ 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0A, 0x0B,
+ 0x10, 0x11, 0x12, 0x13, 0x18, 0x19, 0x1A, 0x1B,
+ 0x20, 0x21, 0x22, 0x23, 0x28, 0x29, 0x2A, 0x2B,
+ 0x30, 0x31, 0x32, 0x33, 0x38, 0x39, 0x3A, 0x3B,
+ 0x04, 0x05, 0x06, 0x07, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x24, 0x25, 0x26, 0x27, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x34, 0x35, 0x36, 0x37, 0x3C, 0x3D, 0x3E, 0x3F
+},
+{
+ 0x06, 0x07, 0x0F, 0x0E, 0x0D, 0x05, 0x0C, 0x04,
+ 0x03, 0x0B, 0x02, 0x0A, 0x09, 0x01, 0x00, 0x08,
+ 0x10, 0x18, 0x11, 0x19, 0x12, 0x1A, 0x13, 0x1B,
+ 0x14, 0x1C, 0x15, 0x1D, 0x16, 0x1E, 0x17, 0x1F,
+ 0x27, 0x2F, 0x26, 0x2E, 0x25, 0x2D, 0x24, 0x2C,
+ 0x23, 0x2B, 0x22, 0x2A, 0x21, 0x29, 0x20, 0x28,
+ 0x31, 0x30, 0x38, 0x39, 0x3A, 0x32, 0x3B, 0x33,
+ 0x3C, 0x34, 0x3D, 0x35, 0x36, 0x37, 0x3F, 0x3E
+},
+{
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38
+},
+{
+ 0x00, 0x08, 0x09, 0x01, 0x02, 0x03, 0x0B, 0x0A,
+ 0x12, 0x13, 0x1B, 0x1A, 0x19, 0x11, 0x10, 0x18,
+ 0x20, 0x28, 0x29, 0x21, 0x22, 0x23, 0x2B, 0x2A,
+ 0x32, 0x31, 0x30, 0x38, 0x39, 0x3A, 0x3B, 0x33,
+ 0x34, 0x3C, 0x3D, 0x3E, 0x3F, 0x37, 0x36, 0x35,
+ 0x2D, 0x2C, 0x24, 0x25, 0x26, 0x2E, 0x2F, 0x27,
+ 0x1F, 0x17, 0x16, 0x1E, 0x1D, 0x1C, 0x14, 0x15,
+ 0x0D, 0x0C, 0x04, 0x05, 0x06, 0x0E, 0x0F, 0x07
+},
+{
+ 0x18, 0x19, 0x10, 0x11, 0x08, 0x09, 0x00, 0x01,
+ 0x02, 0x03, 0x0A, 0x0B, 0x12, 0x13, 0x1A, 0x1B,
+ 0x1C, 0x1D, 0x14, 0x15, 0x0C, 0x0D, 0x04, 0x05,
+ 0x06, 0x07, 0x0E, 0x0F, 0x16, 0x17, 0x1E, 0x1F,
+ 0x26, 0x27, 0x2E, 0x2F, 0x36, 0x37, 0x3E, 0x3F,
+ 0x3C, 0x3D, 0x34, 0x35, 0x2C, 0x2D, 0x24, 0x25,
+ 0x22, 0x23, 0x2A, 0x2B, 0x32, 0x33, 0x3A, 0x3B,
+ 0x38, 0x39, 0x30, 0x31, 0x28, 0x29, 0x20, 0x21
+},
+{
+ 0x00, 0x08, 0x01, 0x09, 0x02, 0x0A, 0x03, 0x0B,
+ 0x13, 0x1B, 0x12, 0x1A, 0x11, 0x19, 0x10, 0x18,
+ 0x20, 0x28, 0x21, 0x29, 0x22, 0x2A, 0x23, 0x2B,
+ 0x33, 0x3B, 0x32, 0x3A, 0x31, 0x39, 0x30, 0x38,
+ 0x3C, 0x34, 0x3D, 0x35, 0x3E, 0x36, 0x3F, 0x37,
+ 0x2F, 0x27, 0x2E, 0x26, 0x2D, 0x25, 0x2C, 0x24,
+ 0x1F, 0x17, 0x1E, 0x16, 0x1D, 0x15, 0x1C, 0x14,
+ 0x0C, 0x04, 0x0D, 0x05, 0x0E, 0x06, 0x0F, 0x07
+},
+{
+ 0x00, 0x08, 0x10, 0x18, 0x19, 0x1A, 0x1B, 0x13,
+ 0x0B, 0x03, 0x02, 0x01, 0x09, 0x11, 0x12, 0x0A,
+ 0x04, 0x0C, 0x14, 0x1C, 0x1D, 0x1E, 0x1F, 0x17,
+ 0x0F, 0x07, 0x06, 0x05, 0x0D, 0x15, 0x16, 0x0E,
+ 0x24, 0x2C, 0x34, 0x3C, 0x3D, 0x3E, 0x3F, 0x37,
+ 0x2F, 0x27, 0x26, 0x25, 0x2D, 0x35, 0x36, 0x2E,
+ 0x20, 0x28, 0x30, 0x38, 0x39, 0x3A, 0x3B, 0x33,
+ 0x2B, 0x23, 0x22, 0x21, 0x29, 0x31, 0x32, 0x2A
+},
+{
+ 0x00, 0x08, 0x09, 0x01, 0x02, 0x03, 0x0B, 0x0A,
+ 0x13, 0x1B, 0x1A, 0x12, 0x11, 0x10, 0x18, 0x19,
+ 0x21, 0x20, 0x28, 0x29, 0x2A, 0x22, 0x23, 0x2B,
+ 0x33, 0x3B, 0x3A, 0x32, 0x31, 0x39, 0x38, 0x30,
+ 0x34, 0x3C, 0x3D, 0x35, 0x36, 0x3E, 0x3F, 0x37,
+ 0x2F, 0x27, 0x26, 0x2E, 0x2D, 0x2C, 0x24, 0x25,
+ 0x1D, 0x1C, 0x14, 0x15, 0x16, 0x1E, 0x1F, 0x17,
+ 0x0E, 0x0F, 0x07, 0x06, 0x05, 0x0D, 0x0C, 0x04
+},
+{
+ 0x18, 0x10, 0x08, 0x00, 0x01, 0x02, 0x03, 0x0B,
+ 0x13, 0x1B, 0x1A, 0x19, 0x11, 0x0A, 0x09, 0x12,
+ 0x1C, 0x14, 0x0C, 0x04, 0x05, 0x06, 0x07, 0x0F,
+ 0x17, 0x1F, 0x1E, 0x1D, 0x15, 0x0E, 0x0D, 0x16,
+ 0x3C, 0x34, 0x2C, 0x24, 0x25, 0x26, 0x27, 0x2F,
+ 0x37, 0x3F, 0x3E, 0x3D, 0x35, 0x2E, 0x2D, 0x36,
+ 0x38, 0x30, 0x28, 0x20, 0x21, 0x22, 0x23, 0x2B,
+ 0x33, 0x3B, 0x3A, 0x39, 0x31, 0x2A, 0x29, 0x32
+},
+{
+ 0x00, 0x08, 0x09, 0x01, 0x02, 0x0A, 0x12, 0x11,
+ 0x10, 0x18, 0x19, 0x1A, 0x1B, 0x13, 0x0B, 0x03,
+ 0x07, 0x06, 0x0E, 0x0F, 0x17, 0x16, 0x15, 0x0D,
+ 0x05, 0x04, 0x0C, 0x14, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x3F, 0x3E, 0x36, 0x37, 0x2F, 0x2E, 0x2D, 0x35,
+ 0x3D, 0x3C, 0x34, 0x2C, 0x24, 0x25, 0x26, 0x27,
+ 0x38, 0x30, 0x31, 0x39, 0x3A, 0x32, 0x2A, 0x29,
+ 0x28, 0x20, 0x21, 0x22, 0x23, 0x2B, 0x33, 0x3B
+},
+{
+ 0x00, 0x01, 0x08, 0x09, 0x10, 0x11, 0x18, 0x19,
+ 0x20, 0x21, 0x28, 0x29, 0x30, 0x31, 0x38, 0x39,
+ 0x3A, 0x3B, 0x32, 0x33, 0x2A, 0x2B, 0x22, 0x23,
+ 0x1A, 0x1B, 0x12, 0x13, 0x0A, 0x0B, 0x02, 0x03,
+ 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
+ 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x3C, 0x3D,
+ 0x3E, 0x3F, 0x36, 0x37, 0x2E, 0x2F, 0x26, 0x27,
+ 0x1E, 0x1F, 0x16, 0x17, 0x0E, 0x0F, 0x06, 0x07
+}
+};
+
+static const uint32 binkIntraQuant[16][64] = {
+{
+ 0x010000, 0x016315, 0x01E83D, 0x02A535, 0x014E7B, 0x016577, 0x02F1E6, 0x02724C,
+ 0x010000, 0x00EEDA, 0x024102, 0x017F9B, 0x00BE80, 0x00611E, 0x01083C, 0x00A552,
+ 0x021F88, 0x01DC53, 0x027FAD, 0x01F697, 0x014819, 0x00A743, 0x015A31, 0x009688,
+ 0x02346F, 0x030EE5, 0x01FBFA, 0x02C096, 0x01D000, 0x028396, 0x019247, 0x01F9AA,
+ 0x02346F, 0x01FBFA, 0x01DC53, 0x0231B8, 0x012F12, 0x01E06C, 0x00CB10, 0x0119A8,
+ 0x01C48C, 0x019748, 0x014E86, 0x0122AF, 0x02C628, 0x027F20, 0x0297B5, 0x023F32,
+ 0x025000, 0x01AB6B, 0x01D122, 0x0159B3, 0x012669, 0x008D43, 0x00EE1F, 0x0075ED,
+ 0x01490C, 0x010288, 0x00F735, 0x00EF51, 0x00E0F1, 0x0072AD, 0x00A4D8, 0x006517,
+},
+{
+ 0x015555, 0x01D971, 0x028AFC, 0x0386F1, 0x01BDF9, 0x01DC9F, 0x03ED33, 0x034311,
+ 0x015555, 0x013E78, 0x030158, 0x01FF7A, 0x00FE00, 0x00817D, 0x01604F, 0x00DC6D,
+ 0x02D4B5, 0x027B19, 0x0354E7, 0x029E1F, 0x01B577, 0x00DF04, 0x01CD96, 0x00C8B6,
+ 0x02F095, 0x0413DC, 0x02A54E, 0x03AB73, 0x026AAB, 0x035A1E, 0x02185E, 0x02A238,
+ 0x02F095, 0x02A54E, 0x027B19, 0x02ECF5, 0x019418, 0x028090, 0x010EC0, 0x01778A,
+ 0x025B66, 0x021F0B, 0x01BE09, 0x018394, 0x03B2E0, 0x03542A, 0x0374F1, 0x02FEEE,
+ 0x031555, 0x0239E4, 0x026C2D, 0x01CCEE, 0x01888C, 0x00BC59, 0x013D7E, 0x009D3C,
+ 0x01B6BB, 0x0158B5, 0x01499C, 0x013F17, 0x012BEC, 0x0098E6, 0x00DBCB, 0x0086C9,
+},
+{
+ 0x01AAAB, 0x024FCE, 0x032DBB, 0x0468AD, 0x022D78, 0x0253C7, 0x04E87F, 0x0413D5,
+ 0x01AAAB, 0x018E16, 0x03C1AE, 0x027F58, 0x013D80, 0x00A1DC, 0x01B863, 0x011388,
+ 0x0389E2, 0x0319DF, 0x042A21, 0x0345A7, 0x0222D4, 0x0116C5, 0x0240FC, 0x00FAE3,
+ 0x03ACBA, 0x0518D3, 0x034EA1, 0x04964F, 0x030555, 0x0430A5, 0x029E76, 0x034AC5,
+ 0x03ACBA, 0x034EA1, 0x0319DF, 0x03A833, 0x01F91E, 0x0320B4, 0x015270, 0x01D56D,
+ 0x02F23F, 0x02A6CE, 0x022D8B, 0x01E479, 0x049F98, 0x042935, 0x04522D, 0x03BEA9,
+ 0x03DAAB, 0x02C85D, 0x030738, 0x02402A, 0x01EAAF, 0x00EB6F, 0x018CDE, 0x00C48A,
+ 0x022469, 0x01AEE2, 0x019C02, 0x018EDD, 0x0176E7, 0x00BF20, 0x0112BE, 0x00A87B,
+},
+{
+ 0x020000, 0x02C62A, 0x03D07A, 0x054A69, 0x029CF6, 0x02CAEF, 0x05E3CC, 0x04E499,
+ 0x020000, 0x01DDB4, 0x048204, 0x02FF36, 0x017D01, 0x00C23C, 0x021077, 0x014AA3,
+ 0x043F0F, 0x03B8A6, 0x04FF5A, 0x03ED2E, 0x029032, 0x014E86, 0x02B461, 0x012D11,
+ 0x0468DF, 0x061DCA, 0x03F7F5, 0x05812C, 0x03A000, 0x05072C, 0x03248D, 0x03F353,
+ 0x0468DF, 0x03F7F5, 0x03B8A6, 0x046370, 0x025E24, 0x03C0D8, 0x019620, 0x02334F,
+ 0x038919, 0x032E91, 0x029D0D, 0x02455E, 0x058C50, 0x04FE3F, 0x052F69, 0x047E65,
+ 0x04A000, 0x0356D6, 0x03A243, 0x02B365, 0x024CD2, 0x011A85, 0x01DC3E, 0x00EBD9,
+ 0x029218, 0x020510, 0x01EE69, 0x01DEA2, 0x01C1E2, 0x00E559, 0x0149B0, 0x00CA2D,
+},
+{
+ 0x02AAAB, 0x03B2E3, 0x0515F8, 0x070DE2, 0x037BF2, 0x03B93E, 0x07DA65, 0x068621,
+ 0x02AAAB, 0x027CF0, 0x0602B1, 0x03FEF3, 0x01FC01, 0x0102FA, 0x02C09F, 0x01B8DA,
+ 0x05A96A, 0x04F632, 0x06A9CE, 0x053C3E, 0x036AED, 0x01BE09, 0x039B2D, 0x01916B,
+ 0x05E129, 0x0827B8, 0x054A9C, 0x0756E5, 0x04D555, 0x06B43B, 0x0430BC, 0x05446F,
+ 0x05E129, 0x054A9C, 0x04F632, 0x05D9EB, 0x032830, 0x050121, 0x021D80, 0x02EF14,
+ 0x04B6CC, 0x043E16, 0x037C11, 0x030728, 0x0765C0, 0x06A855, 0x06E9E2, 0x05FDDB,
+ 0x062AAB, 0x0473C8, 0x04D85A, 0x0399DC, 0x031118, 0x0178B2, 0x027AFD, 0x013A77,
+ 0x036D76, 0x02B16A, 0x029337, 0x027E2E, 0x0257D8, 0x0131CC, 0x01B796, 0x010D91,
+},
+{
+ 0x038000, 0x04DACA, 0x06ACD5, 0x094238, 0x0492AE, 0x04E322, 0x0A4EA5, 0x08900C,
+ 0x038000, 0x0343FB, 0x07E388, 0x053E9F, 0x029AC1, 0x0153E8, 0x039CD0, 0x02429E,
+ 0x076E5B, 0x068322, 0x08BEDE, 0x06DF11, 0x047C57, 0x02496B, 0x04BBAB, 0x020EDD,
+ 0x07B786, 0x0AB421, 0x06F1ED, 0x09A20D, 0x065800, 0x08CC8E, 0x057FF7, 0x06E9D2,
+ 0x07B786, 0x06F1ED, 0x068322, 0x07AE04, 0x0424BF, 0x06917B, 0x02C6B8, 0x03D9CB,
+ 0x062FEB, 0x05917D, 0x0492D7, 0x03F964, 0x09B58C, 0x08BCEF, 0x0912F8, 0x07DD30,
+ 0x081800, 0x05D7F7, 0x065BF6, 0x04B9F1, 0x040670, 0x01EE69, 0x03416C, 0x019CBC,
+ 0x047FAA, 0x0388DC, 0x036138, 0x03459C, 0x03134C, 0x01915C, 0x0240F5, 0x0161CF,
+},
+{
+ 0x040000, 0x058C54, 0x07A0F4, 0x0A94D3, 0x0539EC, 0x0595DD, 0x0BC798, 0x09C932,
+ 0x040000, 0x03BB68, 0x090409, 0x05FE6D, 0x02FA01, 0x018477, 0x0420EE, 0x029547,
+ 0x087E1F, 0x07714C, 0x09FEB5, 0x07DA5D, 0x052064, 0x029D0D, 0x0568C3, 0x025A21,
+ 0x08D1BE, 0x0C3B94, 0x07EFEA, 0x0B0258, 0x074000, 0x0A0E59, 0x06491A, 0x07E6A7,
+ 0x08D1BE, 0x07EFEA, 0x07714C, 0x08C6E0, 0x04BC48, 0x0781B1, 0x032C3F, 0x04669F,
+ 0x071232, 0x065D22, 0x053A1A, 0x048ABC, 0x0B18A0, 0x09FC7F, 0x0A5ED3, 0x08FCC9,
+ 0x094000, 0x06ADAC, 0x074487, 0x0566CA, 0x0499A5, 0x02350B, 0x03B87B, 0x01D7B3,
+ 0x052430, 0x040A20, 0x03DCD3, 0x03BD45, 0x0383C5, 0x01CAB3, 0x029361, 0x01945A,
+},
+{
+ 0x050000, 0x06EF69, 0x098931, 0x0D3A07, 0x068867, 0x06FB55, 0x0EB97E, 0x0C3B7E,
+ 0x050000, 0x04AA42, 0x0B450B, 0x077E08, 0x03B881, 0x01E595, 0x05292A, 0x033A99,
+ 0x0A9DA7, 0x094D9F, 0x0C7E62, 0x09D0F4, 0x06687D, 0x034450, 0x06C2F4, 0x02F0AA,
+ 0x0B062D, 0x0F4A78, 0x09EBE4, 0x0DC2EE, 0x091000, 0x0C91EF, 0x07DB61, 0x09E050,
+ 0x0B062D, 0x09EBE4, 0x094D9F, 0x0AF898, 0x05EB59, 0x09621D, 0x03F74F, 0x058046,
+ 0x08D6BE, 0x07F46A, 0x0688A0, 0x05AD6B, 0x0DDEC8, 0x0C7B9F, 0x0CF687, 0x0B3BFB,
+ 0x0B9000, 0x085917, 0x0915A8, 0x06C07D, 0x05C00E, 0x02C24D, 0x04A69A, 0x024D9F,
+ 0x066D3C, 0x050CA7, 0x04D407, 0x04AC96, 0x0464B6, 0x023D5F, 0x033839, 0x01F971,
+},
+{
+ 0x060000, 0x08527E, 0x0B716E, 0x0FDF3C, 0x07D6E1, 0x0860CC, 0x11AB63, 0x0EADCB,
+ 0x060000, 0x05991C, 0x0D860D, 0x08FDA3, 0x047702, 0x0246B3, 0x063165, 0x03DFEA,
+ 0x0CBD2E, 0x0B29F1, 0x0EFE0F, 0x0BC78B, 0x07B096, 0x03EB93, 0x081D24, 0x038732,
+ 0x0D3A9C, 0x12595D, 0x0BE7DF, 0x108384, 0x0AE000, 0x0F1585, 0x096DA8, 0x0BD9FA,
+ 0x0D3A9C, 0x0BE7DF, 0x0B29F1, 0x0D2A50, 0x071A6B, 0x0B4289, 0x04C25F, 0x0699EE,
+ 0x0A9B4A, 0x098BB2, 0x07D727, 0x06D01A, 0x10A4F0, 0x0EFABE, 0x0F8E3C, 0x0D7B2E,
+ 0x0DE000, 0x0A0482, 0x0AE6CA, 0x081A2F, 0x06E677, 0x034F90, 0x0594B9, 0x02C38C,
+ 0x07B649, 0x060F2F, 0x05CB3C, 0x059BE7, 0x0545A7, 0x02B00C, 0x03DD11, 0x025E87,
+},
+{
+ 0x080000, 0x0B18A8, 0x0F41E8, 0x1529A5, 0x0A73D7, 0x0B2BBB, 0x178F2F, 0x139264,
+ 0x080000, 0x0776CF, 0x120812, 0x0BFCD9, 0x05F402, 0x0308EF, 0x0841DC, 0x052A8E,
+ 0x10FC3E, 0x0EE297, 0x13FD69, 0x0FB4B9, 0x0A40C8, 0x053A1A, 0x0AD186, 0x04B442,
+ 0x11A37B, 0x187727, 0x0FDFD4, 0x1604B0, 0x0E8000, 0x141CB1, 0x0C9235, 0x0FCD4D,
+ 0x11A37B, 0x0FDFD4, 0x0EE297, 0x118DC0, 0x09788F, 0x0F0362, 0x06587F, 0x08CD3D,
+ 0x0E2463, 0x0CBA43, 0x0A7434, 0x091577, 0x163140, 0x13F8FE, 0x14BDA5, 0x11F992,
+ 0x128000, 0x0D5B58, 0x0E890D, 0x0ACD94, 0x093349, 0x046A15, 0x0770F7, 0x03AF65,
+ 0x0A4861, 0x08143F, 0x07B9A6, 0x077A89, 0x070789, 0x039565, 0x0526C2, 0x0328B4,
+},
+{
+ 0x0C0000, 0x10A4FD, 0x16E2DB, 0x1FBE78, 0x0FADC3, 0x10C198, 0x2356C7, 0x1D5B96,
+ 0x0C0000, 0x0B3237, 0x1B0C1A, 0x11FB46, 0x08EE03, 0x048D66, 0x0C62CA, 0x07BFD5,
+ 0x197A5D, 0x1653E3, 0x1DFC1E, 0x178F16, 0x0F612C, 0x07D727, 0x103A49, 0x070E64,
+ 0x1A7539, 0x24B2BB, 0x17CFBD, 0x210709, 0x15C000, 0x1E2B0A, 0x12DB4F, 0x17B3F4,
+ 0x1A7539, 0x17CFBD, 0x1653E3, 0x1A54A0, 0x0E34D7, 0x168513, 0x0984BE, 0x0D33DC,
+ 0x153695, 0x131765, 0x0FAE4E, 0x0DA033, 0x2149E1, 0x1DF57D, 0x1F1C78, 0x1AF65B,
+ 0x1BC000, 0x140904, 0x15CD94, 0x10345E, 0x0DCCEE, 0x069F20, 0x0B2972, 0x058718,
+ 0x0F6C91, 0x0C1E5E, 0x0B9678, 0x0B37CE, 0x0A8B4E, 0x056018, 0x07BA22, 0x04BD0E,
+},
+{
+ 0x110000, 0x179466, 0x206C0C, 0x2CF87F, 0x16362A, 0x17BCED, 0x321044, 0x299714,
+ 0x110000, 0x0FDC79, 0x265125, 0x19794E, 0x0CA685, 0x0672FB, 0x118BF4, 0x0AFA6D,
+ 0x241804, 0x1FA181, 0x2A7A80, 0x21600A, 0x15C9A9, 0x0B1B77, 0x16FD3C, 0x09FF0D,
+ 0x257B66, 0x33FD33, 0x21BBA2, 0x2EC9F7, 0x1ED000, 0x2ABCF9, 0x1AB6B0, 0x219444,
+ 0x257B66, 0x21BBA2, 0x1FA181, 0x254D38, 0x142030, 0x1FE730, 0x0D7C0E, 0x12B423,
+ 0x1E0D52, 0x1B0BCF, 0x1636EE, 0x134D9E, 0x2F28A9, 0x2A711B, 0x2C12FF, 0x263256,
+ 0x275000, 0x1C621B, 0x1EE33C, 0x16F4DB, 0x138CFB, 0x09616E, 0x0FD00C, 0x07D4B7,
+ 0x15D9CE, 0x112B06, 0x106A80, 0x0FE464, 0x0EF004, 0x079D77, 0x0AF25B, 0x06B67F,
+},
+{
+ 0x160000, 0x1E83CF, 0x29F53D, 0x3A3286, 0x1CBE90, 0x1EB842, 0x40C9C2, 0x35D293,
+ 0x160000, 0x1486BA, 0x319630, 0x20F756, 0x105F06, 0x085891, 0x16B51E, 0x0E3506,
+ 0x2EB5AA, 0x28EF20, 0x36F8E1, 0x2B30FE, 0x1C3225, 0x0E5FC7, 0x1DC030, 0x0CEFB7,
+ 0x308193, 0x4347AC, 0x2BA786, 0x3C8CE5, 0x27E000, 0x374EE7, 0x229212, 0x2B7494,
+ 0x308193, 0x2BA786, 0x28EF20, 0x3045D0, 0x1A0B89, 0x29494D, 0x11735D, 0x183469,
+ 0x26E410, 0x230039, 0x1CBF8F, 0x18FB09, 0x3D0771, 0x36ECBA, 0x390986, 0x316E52,
+ 0x32E000, 0x24BB33, 0x27F8E4, 0x1DB557, 0x194D09, 0x0C23BB, 0x1476A6, 0x0A2256,
+ 0x1C470A, 0x1637AD, 0x153E87, 0x1490FA, 0x1354B9, 0x09DAD6, 0x0E2A94, 0x08AFF0,
+},
+{
+ 0x1C0000, 0x26D64D, 0x3566AA, 0x4A11C2, 0x249572, 0x27190E, 0x527525, 0x44805E,
+ 0x1C0000, 0x1A1FD6, 0x3F1C3E, 0x29F4F9, 0x14D607, 0x0A9F44, 0x1CE683, 0x1214F0,
+ 0x3B72D9, 0x341911, 0x45F6F0, 0x36F889, 0x23E2BB, 0x124B5B, 0x25DD54, 0x1076E9,
+ 0x3DBC30, 0x55A109, 0x378F64, 0x4D1069, 0x32C000, 0x46646C, 0x2BFFB9, 0x374E8E,
+ 0x3DBC30, 0x378F64, 0x341911, 0x3D7020, 0x2125F5, 0x348BD6, 0x1635BC, 0x1ECE57,
+ 0x317F5B, 0x2C8BEB, 0x2496B6, 0x1FCB22, 0x4DAC61, 0x45E778, 0x4897C2, 0x3EE97F,
+ 0x40C000, 0x2EBFB5, 0x32DFAE, 0x25CF86, 0x203380, 0x0F734B, 0x1A0B5F, 0x0CE5E2,
+ 0x23FD53, 0x1C46DC, 0x1B09C4, 0x1A2CE1, 0x189A60, 0x0C8AE2, 0x1207A5, 0x0B0E77,
+},
+{
+ 0x220000, 0x2F28CC, 0x40D818, 0x59F0FE, 0x2C6C53, 0x2F79DA, 0x642089, 0x532E29,
+ 0x220000, 0x1FB8F1, 0x4CA24B, 0x32F29C, 0x194D09, 0x0CE5F7, 0x2317E8, 0x15F4DB,
+ 0x483007, 0x3F4303, 0x54F4FF, 0x42C014, 0x2B9351, 0x1636EE, 0x2DFA79, 0x13FE1A,
+ 0x4AF6CC, 0x67FA67, 0x437743, 0x5D93EE, 0x3DA000, 0x5579F1, 0x356D61, 0x432888,
+ 0x4AF6CC, 0x437743, 0x3F4303, 0x4A9A70, 0x284060, 0x3FCE60, 0x1AF81B, 0x256845,
+ 0x3C1AA5, 0x36179D, 0x2C6DDD, 0x269B3C, 0x5E5152, 0x54E237, 0x5825FE, 0x4C64AD,
+ 0x4EA000, 0x38C437, 0x3DC678, 0x2DE9B5, 0x2719F7, 0x12C2DB, 0x1FA018, 0x0FA96E,
+ 0x2BB39B, 0x22560C, 0x20D500, 0x1FC8C8, 0x1DE007, 0x0F3AEE, 0x15E4B7, 0x0D6CFE,
+},
+{
+ 0x2C0000, 0x3D079E, 0x53EA79, 0x74650C, 0x397D20, 0x3D7083, 0x819383, 0x6BA525,
+ 0x2C0000, 0x290D75, 0x632C61, 0x41EEAC, 0x20BE0C, 0x10B121, 0x2D6A3B, 0x1C6A0C,
+ 0x5D6B54, 0x51DE40, 0x6DF1C2, 0x5661FB, 0x38644B, 0x1CBF8F, 0x3B8060, 0x19DF6D,
+ 0x610326, 0x868F57, 0x574F0B, 0x7919CA, 0x4FC000, 0x6E9DCE, 0x452423, 0x56E928,
+ 0x610326, 0x574F0B, 0x51DE40, 0x608BA0, 0x341713, 0x52929A, 0x22E6BA, 0x3068D2,
+ 0x4DC821, 0x460071, 0x397F1E, 0x31F611, 0x7A0EE2, 0x6DD974, 0x72130C, 0x62DCA3,
+ 0x65C000, 0x497665, 0x4FF1C9, 0x3B6AAE, 0x329A12, 0x184776, 0x28ED4D, 0x1444AC,
+ 0x388E14, 0x2C6F5A, 0x2A7D0F, 0x2921F4, 0x26A973, 0x13B5AD, 0x1C5528, 0x115FDF,
+},
+};
+
+static const uint32 binkInterQuant[16][64] = {
+{
+ 0x010000, 0x017946, 0x01A5A9, 0x0248DC, 0x016363, 0x0152A7, 0x0243EC, 0x0209EA,
+ 0x012000, 0x00E248, 0x01BBDA, 0x015CBC, 0x00A486, 0x0053E0, 0x00F036, 0x008095,
+ 0x01B701, 0x016959, 0x01B0B9, 0x0153FD, 0x00F8E7, 0x007EE4, 0x00EA30, 0x007763,
+ 0x01B701, 0x0260EB, 0x019DE9, 0x023E1B, 0x017000, 0x01FE6E, 0x012DB5, 0x01A27B,
+ 0x01E0D1, 0x01B0B9, 0x018A33, 0x01718D, 0x00D87A, 0x014449, 0x007B9A, 0x00AB71,
+ 0x013178, 0x0112EA, 0x00AD08, 0x009BB9, 0x023D97, 0x020437, 0x021CCC, 0x01E6B4,
+ 0x018000, 0x012DB5, 0x0146D9, 0x0100CE, 0x00CFD2, 0x006E5C, 0x00B0E4, 0x005A2D,
+ 0x00E9CC, 0x00B7B1, 0x00846F, 0x006B85, 0x008337, 0x0042E5, 0x004A10, 0x002831,
+},
+{
+ 0x015555, 0x01F708, 0x023237, 0x030BD0, 0x01D9D9, 0x01C389, 0x03053B, 0x02B7E3,
+ 0x018000, 0x012DB5, 0x024FCE, 0x01D0FA, 0x00DB5D, 0x006FD5, 0x014048, 0x00AB71,
+ 0x024957, 0x01E1CC, 0x0240F7, 0x01C551, 0x014BDE, 0x00A92F, 0x013840, 0x009F2F,
+ 0x024957, 0x032BE4, 0x0227E1, 0x02FD7A, 0x01EAAB, 0x02A893, 0x019247, 0x022DF9,
+ 0x028116, 0x0240F7, 0x020D99, 0x01ECBC, 0x0120A3, 0x01B061, 0x00A4CE, 0x00E497,
+ 0x01974B, 0x016E8E, 0x00E6B5, 0x00CFA2, 0x02FCC9, 0x02B04A, 0x02D110, 0x0288F1,
+ 0x020000, 0x019247, 0x01B3CC, 0x015668, 0x011518, 0x009325, 0x00EBDA, 0x00783D,
+ 0x0137BB, 0x00F4ED, 0x00B093, 0x008F5C, 0x00AEF4, 0x005931, 0x0062BF, 0x003597,
+},
+{
+ 0x01AAAB, 0x0274CB, 0x02BEC4, 0x03CEC4, 0x02504F, 0x02346C, 0x03C689, 0x0365DC,
+ 0x01E000, 0x017922, 0x02E3C1, 0x024539, 0x011235, 0x008BCA, 0x01905A, 0x00D64D,
+ 0x02DBAD, 0x025A40, 0x02D134, 0x0236A5, 0x019ED6, 0x00D37B, 0x018650, 0x00C6FB,
+ 0x02DBAD, 0x03F6DD, 0x02B1D9, 0x03BCD8, 0x026555, 0x0352B8, 0x01F6D8, 0x02B977,
+ 0x03215C, 0x02D134, 0x029100, 0x0267EB, 0x0168CC, 0x021C7A, 0x00CE01, 0x011DBD,
+ 0x01FD1E, 0x01CA31, 0x012062, 0x01038A, 0x03BBFB, 0x035C5C, 0x038554, 0x032B2D,
+ 0x028000, 0x01F6D8, 0x0220C0, 0x01AC02, 0x015A5E, 0x00B7EF, 0x0126D1, 0x00964C,
+ 0x0185A9, 0x013228, 0x00DCB8, 0x00B333, 0x00DAB2, 0x006F7D, 0x007B6F, 0x0042FC,
+},
+{
+ 0x020000, 0x02F28D, 0x034B52, 0x0491B8, 0x02C6C5, 0x02A54E, 0x0487D8, 0x0413D5,
+ 0x024000, 0x01C48F, 0x0377B5, 0x02B977, 0x01490C, 0x00A7BF, 0x01E06C, 0x01012A,
+ 0x036E03, 0x02D2B3, 0x036172, 0x02A7FA, 0x01F1CE, 0x00FDC7, 0x01D460, 0x00EEC7,
+ 0x036E03, 0x04C1D6, 0x033BD1, 0x047C37, 0x02E000, 0x03FCDD, 0x025B6A, 0x0344F5,
+ 0x03C1A1, 0x036172, 0x031466, 0x02E31B, 0x01B0F5, 0x028892, 0x00F735, 0x0156E2,
+ 0x0262F1, 0x0225D5, 0x015A10, 0x013772, 0x047B2D, 0x04086E, 0x043998, 0x03CD69,
+ 0x030000, 0x025B6A, 0x028DB3, 0x02019B, 0x019FA3, 0x00DCB8, 0x0161C7, 0x00B45B,
+ 0x01D398, 0x016F63, 0x0108DD, 0x00D70A, 0x01066F, 0x0085C9, 0x00941F, 0x005062,
+},
+{
+ 0x02AAAB, 0x03EE11, 0x04646D, 0x0617A0, 0x03B3B2, 0x038713, 0x060A75, 0x056FC6,
+ 0x030000, 0x025B6A, 0x049F9B, 0x03A1F4, 0x01B6BB, 0x00DFAA, 0x028090, 0x0156E2,
+ 0x0492AE, 0x03C399, 0x0481ED, 0x038AA2, 0x0297BD, 0x01525F, 0x027080, 0x013E5E,
+ 0x0492AE, 0x0657C8, 0x044FC1, 0x05FAF4, 0x03D555, 0x055126, 0x03248D, 0x045BF2,
+ 0x05022D, 0x0481ED, 0x041B33, 0x03D979, 0x024147, 0x0360C3, 0x01499C, 0x01C92E,
+ 0x032E96, 0x02DD1C, 0x01CD6A, 0x019F43, 0x05F991, 0x056093, 0x05A220, 0x0511E1,
+ 0x040000, 0x03248D, 0x036799, 0x02ACCF, 0x022A2F, 0x01264B, 0x01D7B5, 0x00F079,
+ 0x026F75, 0x01E9D9, 0x016127, 0x011EB8, 0x015DE9, 0x00B262, 0x00C57F, 0x006B2D,
+},
+{
+ 0x038000, 0x052876, 0x05C3CF, 0x07FF02, 0x04DBD9, 0x04A148, 0x07EDBA, 0x0722B4,
+ 0x03F000, 0x0317FB, 0x06117C, 0x04C491, 0x023FD5, 0x01258F, 0x0348BD, 0x01C209,
+ 0x060085, 0x04F0B9, 0x05EA87, 0x04A5F5, 0x036728, 0x01BC1C, 0x0333A8, 0x01A1DB,
+ 0x060085, 0x085336, 0x05A8AE, 0x07D960, 0x050800, 0x06FA82, 0x041FF9, 0x05B8AE,
+ 0x0692DA, 0x05EA87, 0x0563B2, 0x050D6E, 0x02F5AD, 0x046F00, 0x01B09C, 0x02580C,
+ 0x042D25, 0x03C235, 0x025D9B, 0x022108, 0x07D78F, 0x070EC1, 0x0764CA, 0x06A777,
+ 0x054000, 0x041FF9, 0x0477F9, 0x0382D0, 0x02D75E, 0x018242, 0x026B1D, 0x013B9F,
+ 0x03324A, 0x0282ED, 0x01CF83, 0x017851, 0x01CB42, 0x00EA21, 0x010336, 0x008CAC,
+},
+{
+ 0x040000, 0x05E519, 0x0696A4, 0x092370, 0x058D8A, 0x054A9C, 0x090FB0, 0x0827AA,
+ 0x048000, 0x03891F, 0x06EF69, 0x0572EE, 0x029218, 0x014F7E, 0x03C0D8, 0x020254,
+ 0x06DC05, 0x05A565, 0x06C2E4, 0x054FF3, 0x03E39B, 0x01FB8E, 0x03A8C0, 0x01DD8D,
+ 0x06DC05, 0x0983AC, 0x0677A2, 0x08F86E, 0x05C000, 0x07F9B9, 0x04B6D4, 0x0689EB,
+ 0x078343, 0x06C2E4, 0x0628CC, 0x05C635, 0x0361EA, 0x051124, 0x01EE69, 0x02ADC5,
+ 0x04C5E1, 0x044BAA, 0x02B41F, 0x026EE5, 0x08F65A, 0x0810DD, 0x087330, 0x079AD1,
+ 0x060000, 0x04B6D4, 0x051B65, 0x040337, 0x033F47, 0x01B970, 0x02C38F, 0x0168B6,
+ 0x03A730, 0x02DEC6, 0x0211BA, 0x01AE14, 0x020CDD, 0x010B93, 0x01283E, 0x00A0C4,
+},
+{
+ 0x050000, 0x075E60, 0x083C4D, 0x0B6C4C, 0x06F0ED, 0x069D43, 0x0B539C, 0x0A3194,
+ 0x05A000, 0x046B67, 0x08AB44, 0x06CFAA, 0x03369E, 0x01A35E, 0x04B10F, 0x0282E8,
+ 0x089307, 0x070EBF, 0x08739C, 0x06A3F0, 0x04DC82, 0x027A72, 0x0492F0, 0x0254F0,
+ 0x089307, 0x0BE497, 0x08158B, 0x0B3689, 0x073000, 0x09F827, 0x05E489, 0x082C66,
+ 0x096413, 0x08739C, 0x07B2FF, 0x0737C2, 0x043A64, 0x06556D, 0x026A04, 0x035936,
+ 0x05F75A, 0x055E94, 0x036127, 0x030A9E, 0x0B33F1, 0x0A1514, 0x0A8FFC, 0x098186,
+ 0x078000, 0x05E489, 0x06623F, 0x050405, 0x040F19, 0x0227CC, 0x037473, 0x01C2E3,
+ 0x0490FC, 0x039677, 0x029629, 0x021999, 0x029015, 0x014E78, 0x01724E, 0x00C8F5,
+},
+{
+ 0x060000, 0x08D7A6, 0x09E1F6, 0x0DB528, 0x085450, 0x07EFEA, 0x0D9788, 0x0C3B7E,
+ 0x06C000, 0x054DAE, 0x0A671E, 0x082C66, 0x03DB24, 0x01F73E, 0x05A145, 0x03037D,
+ 0x0A4A08, 0x087818, 0x0A2455, 0x07F7ED, 0x05D569, 0x02F955, 0x057D20, 0x02CC54,
+ 0x0A4A08, 0x0E4582, 0x09B373, 0x0D74A5, 0x08A000, 0x0BF696, 0x07123E, 0x09CEE0,
+ 0x0B44E4, 0x0A2455, 0x093D32, 0x08A950, 0x0512DF, 0x0799B6, 0x02E59E, 0x0404A7,
+ 0x0728D2, 0x06717F, 0x040E2F, 0x03A657, 0x0D7187, 0x0C194B, 0x0CACC8, 0x0B683A,
+ 0x090000, 0x07123E, 0x07A918, 0x0604D2, 0x04DEEA, 0x029629, 0x042556, 0x021D11,
+ 0x057AC8, 0x044E28, 0x031A97, 0x02851E, 0x03134C, 0x01915C, 0x01BC5D, 0x00F126,
+},
+{
+ 0x080000, 0x0BCA33, 0x0D2D48, 0x1246E0, 0x0B1B15, 0x0A9538, 0x121F5F, 0x104F53,
+ 0x090000, 0x07123E, 0x0DDED2, 0x0AE5DD, 0x052430, 0x029EFD, 0x0781B1, 0x0404A7,
+ 0x0DB80B, 0x0B4ACB, 0x0D85C7, 0x0A9FE7, 0x07C736, 0x03F71D, 0x075180, 0x03BB1A,
+ 0x0DB80B, 0x130757, 0x0CEF44, 0x11F0DC, 0x0B8000, 0x0FF372, 0x096DA8, 0x0D13D6,
+ 0x0F0686, 0x0D85C7, 0x0C5198, 0x0B8C6A, 0x06C3D4, 0x0A2248, 0x03DCD3, 0x055B8A,
+ 0x098BC3, 0x089754, 0x05683E, 0x04DDC9, 0x11ECB4, 0x1021B9, 0x10E661, 0x0F35A3,
+ 0x0C0000, 0x096DA8, 0x0A36CB, 0x08066E, 0x067E8E, 0x0372E1, 0x05871E, 0x02D16B,
+ 0x074E60, 0x05BD8B, 0x042374, 0x035C28, 0x0419BB, 0x021726, 0x02507C, 0x014188,
+},
+{
+ 0x0C0000, 0x11AF4C, 0x13C3EC, 0x1B6A50, 0x10A89F, 0x0FDFD4, 0x1B2F0F, 0x1876FD,
+ 0x0D8000, 0x0A9B5D, 0x14CE3C, 0x1058CB, 0x07B649, 0x03EE7B, 0x0B4289, 0x0606FB,
+ 0x149410, 0x10F030, 0x1448AB, 0x0FEFDA, 0x0BAAD2, 0x05F2AB, 0x0AFA40, 0x0598A7,
+ 0x149410, 0x1C8B03, 0x1366E6, 0x1AE949, 0x114000, 0x17ED2B, 0x0E247C, 0x139DC1,
+ 0x1689C8, 0x1448AB, 0x127A63, 0x11529F, 0x0A25BE, 0x0F336D, 0x05CB3C, 0x08094E,
+ 0x0E51A4, 0x0CE2FE, 0x081C5D, 0x074CAE, 0x1AE30E, 0x183296, 0x195991, 0x16D074,
+ 0x120000, 0x0E247C, 0x0F5230, 0x0C09A5, 0x09BDD5, 0x052C51, 0x084AAC, 0x043A21,
+ 0x0AF590, 0x089C51, 0x06352E, 0x050A3B, 0x062698, 0x0322B9, 0x0378BA, 0x01E24D,
+},
+{
+ 0x110000, 0x190DAC, 0x1C0039, 0x26D69C, 0x17998C, 0x167D16, 0x2682AB, 0x22A891,
+ 0x132000, 0x0F06C3, 0x1D797F, 0x172876, 0x0AECE7, 0x0591D9, 0x0FF398, 0x0889E3,
+ 0x1D2717, 0x17FEEF, 0x1CBC47, 0x1693CA, 0x108754, 0x086D1D, 0x0F8D30, 0x07ED98,
+ 0x1D2717, 0x286F9A, 0x1B7C71, 0x261FD3, 0x187000, 0x21E552, 0x140904, 0x1BCA27,
+ 0x1FEDDC, 0x1CBC47, 0x1A2D62, 0x188A62, 0x0E6022, 0x1588DA, 0x083540, 0x0B6284,
+ 0x1448FE, 0x124192, 0x0B7D84, 0x0A574B, 0x2616FF, 0x2247AA, 0x23E98D, 0x2051FA,
+ 0x198000, 0x140904, 0x15B46F, 0x110DAA, 0x0DCCEE, 0x07541E, 0x0BBF1F, 0x05FD04,
+ 0x0F868B, 0x0C32C8, 0x08CB57, 0x0723D4, 0x08B6AD, 0x047130, 0x04EB08, 0x02AB42,
+},
+{
+ 0x160000, 0x206C0C, 0x243C86, 0x3242E8, 0x1E8A79, 0x1D1A59, 0x31D646, 0x2CDA25,
+ 0x18C000, 0x13722A, 0x2624C3, 0x1DF820, 0x0E2385, 0x073537, 0x14A4A7, 0x0B0CCC,
+ 0x25BA1D, 0x1F0DAE, 0x252FE4, 0x1D37BB, 0x1563D6, 0x0AE78E, 0x142021, 0x0A4288,
+ 0x25BA1D, 0x345430, 0x2391FB, 0x31565C, 0x1FA000, 0x2BDD7A, 0x19ED8D, 0x23F68C,
+ 0x2951EF, 0x252FE4, 0x21E061, 0x1FC224, 0x129A87, 0x1BDE47, 0x0A9F44, 0x0EBBBA,
+ 0x1A4058, 0x17A026, 0x0EDEAB, 0x0D61E9, 0x314AEF, 0x2C5CBE, 0x2E798A, 0x29D380,
+ 0x210000, 0x19ED8D, 0x1C16AE, 0x1611AE, 0x11DC06, 0x097BEA, 0x0F3391, 0x07BFE7,
+ 0x141787, 0x0FC93E, 0x0B617F, 0x093D6D, 0x0B46C1, 0x05BFA8, 0x065D55, 0x037437,
+},
+{
+ 0x1C0000, 0x2943B2, 0x2E1E7C, 0x3FF810, 0x26DEC9, 0x250A43, 0x3F6DCE, 0x3915A3,
+ 0x1F8000, 0x18BFD8, 0x308BE1, 0x262485, 0x11FEA9, 0x092C75, 0x1A45EB, 0x0E1049,
+ 0x300425, 0x2785C6, 0x2F5439, 0x252FA8, 0x1B393F, 0x0DE0E4, 0x199D41, 0x0D0EDC,
+ 0x300425, 0x4299B2, 0x2D456E, 0x3ECB00, 0x284000, 0x37D40F, 0x20FFCB, 0x2DC56D,
+ 0x3496D3, 0x2F5439, 0x2B1D93, 0x286B74, 0x17AD66, 0x2377FE, 0x0D84E2, 0x12C062,
+ 0x21692A, 0x1E11A5, 0x12ECDA, 0x110840, 0x3EBC76, 0x387608, 0x3B2652, 0x353BBA,
+ 0x2A0000, 0x20FFCB, 0x23BFC6, 0x1C1681, 0x16BAF1, 0x0C1213, 0x1358E8, 0x09DCF8,
+ 0x19924F, 0x141767, 0x0E7C16, 0x0BC28A, 0x0E5A0D, 0x075104, 0x0819B2, 0x04655D,
+},
+{
+ 0x220000, 0x321B58, 0x380072, 0x4DAD38, 0x2F3318, 0x2CFA2D, 0x4D0556, 0x455122,
+ 0x264000, 0x1E0D86, 0x3AF2FE, 0x2E50EB, 0x15D9CE, 0x0B23B2, 0x1FE730, 0x1113C7,
+ 0x3A4E2D, 0x2FFDDF, 0x39788E, 0x2D2795, 0x210EA8, 0x10DA39, 0x1F1A61, 0x0FDB2F,
+ 0x3A4E2D, 0x50DF33, 0x36F8E1, 0x4C3FA5, 0x30E000, 0x43CAA5, 0x281209, 0x37944D,
+ 0x3FDBB7, 0x39788E, 0x345AC4, 0x3114C3, 0x1CC044, 0x2B11B4, 0x106A80, 0x16C509,
+ 0x2891FC, 0x248324, 0x16FB08, 0x14AE97, 0x4C2DFD, 0x448F54, 0x47D31B, 0x40A3F5,
+ 0x330000, 0x281209, 0x2B68DF, 0x221B53, 0x1B99DB, 0x0EA83B, 0x177E3E, 0x0BFA09,
+ 0x1F0D17, 0x18658F, 0x1196AE, 0x0E47A8, 0x116D5A, 0x08E260, 0x09D60F, 0x055684,
+},
+{
+ 0x2C0000, 0x40D818, 0x48790C, 0x6485D0, 0x3D14F2, 0x3A34B2, 0x63AC8D, 0x59B44A,
+ 0x318000, 0x26E454, 0x4C4986, 0x3BF03F, 0x1C470A, 0x0E6A6E, 0x29494D, 0x161998,
+ 0x4B743A, 0x3E1B5C, 0x4A5FC7, 0x3A6F75, 0x2AC7AC, 0x15CF1D, 0x284041, 0x148510,
+ 0x4B743A, 0x68A861, 0x4723F6, 0x62ACB8, 0x3F4000, 0x57BAF3, 0x33DB1A, 0x47ED19,
+ 0x52A3DE, 0x4A5FC7, 0x43C0C2, 0x3F8448, 0x25350D, 0x37BC8E, 0x153E87, 0x1D7775,
+ 0x3480B0, 0x2F404C, 0x1DBD56, 0x1AC3D2, 0x6295DE, 0x58B97B, 0x5CF313, 0x53A701,
+ 0x420000, 0x33DB1A, 0x382D5C, 0x2C235D, 0x23B80D, 0x12F7D4, 0x1E6723, 0x0F7FCF,
+ 0x282F0E, 0x1F927D, 0x16C2FF, 0x127AD9, 0x168D83, 0x0B7F50, 0x0CBAAA, 0x06E86E,
+},
+};
+
+} // End of namespace Video
+
+#endif // GRAPHICS_VIDEO_BINKDATA_H
diff --git a/video/codecs/cdtoons.cpp b/video/codecs/cdtoons.cpp
index 9bdc794fa6..528cee8094 100644
--- a/video/codecs/cdtoons.cpp
+++ b/video/codecs/cdtoons.cpp
@@ -24,6 +24,7 @@
#include "common/rect.h"
#include "common/stream.h"
#include "common/textconsole.h"
+#include "common/array.h"
namespace Video {
diff --git a/video/codecs/cinepak.cpp b/video/codecs/cinepak.cpp
index c8b23dfc3f..c197e0cc35 100644
--- a/video/codecs/cinepak.cpp
+++ b/video/codecs/cinepak.cpp
@@ -73,7 +73,8 @@ CinepakDecoder::~CinepakDecoder() {
const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream *stream) {
_curFrame.flags = stream->readByte();
- _curFrame.length = (stream->readByte() << 16) + stream->readUint16BE();
+ _curFrame.length = (stream->readByte() << 16);
+ _curFrame.length |= stream->readUint16BE();
_curFrame.width = stream->readUint16BE();
_curFrame.height = stream->readUint16BE();
_curFrame.stripCount = stream->readUint16BE();
@@ -86,8 +87,11 @@ const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream
// Borrowed from FFMPEG. This should cut out the extra data Cinepak for Sega has (which is useless).
// The theory behind this is that this is here to confuse standard Cinepak decoders. But, we won't let that happen! ;)
if (_curFrame.length != (uint32)stream->size()) {
- if (stream->readUint16BE() == 0xFE00)
+ uint16 temp = stream->readUint16BE();
+ if (temp == 0xFE00)
stream->readUint32BE();
+ else if (temp != _curFrame.width)
+ stream->seek(-2, SEEK_CUR);
}
if (!_curFrame.surface) {
diff --git a/video/module.mk b/video/module.mk
index d813218785..ceeac94384 100644
--- a/video/module.mk
+++ b/video/module.mk
@@ -19,5 +19,10 @@ MODULE_OBJS := \
codecs/smc.o \
codecs/truemotion1.o
+ifdef USE_BINK
+MODULE_OBJS += \
+ bink_decoder.o
+endif
+
# Include common rules
include $(srcdir)/rules.mk
diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp
index f93f0d616e..74bf533e62 100644
--- a/video/qt_decoder.cpp
+++ b/video/qt_decoder.cpp
@@ -176,6 +176,10 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) {
// Restart the audio
startAudio();
+
+ // Pause the audio again if we're still paused
+ if (isPaused() && _audStream)
+ g_system->getMixer()->pauseHandle(_audHandle, true);
}
}
@@ -479,23 +483,18 @@ Common::SeekableReadStream *QuickTimeDecoder::getNextFramePacket(uint32 &descId)
int32 totalSampleCount = 0;
int32 sampleInChunk = 0;
int32 actualChunk = -1;
+ uint32 sampleToChunkIndex = 0;
for (uint32 i = 0; i < _tracks[_videoTrackIndex]->chunkCount; i++) {
- int32 sampleToChunkIndex = -1;
-
- for (uint32 j = 0; j < _tracks[_videoTrackIndex]->sampleToChunkCount; j++)
- if (i >= _tracks[_videoTrackIndex]->sampleToChunk[j].first)
- sampleToChunkIndex = j;
-
- if (sampleToChunkIndex < 0)
- error("This chunk (%d) is imaginary", sampleToChunkIndex);
+ if (sampleToChunkIndex < _tracks[_videoTrackIndex]->sampleToChunkCount && i >= _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex].first)
+ sampleToChunkIndex++;
- totalSampleCount += _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex].count;
+ totalSampleCount += _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex - 1].count;
if (totalSampleCount > getCurFrame()) {
actualChunk = i;
- descId = _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex].id;
- sampleInChunk = _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex].count - totalSampleCount + getCurFrame();
+ descId = _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex - 1].id;
+ sampleInChunk = _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex - 1].count - totalSampleCount + getCurFrame();
break;
}
}
diff --git a/video/smk_decoder.cpp b/video/smk_decoder.cpp
index 05a20ecd8d..e0e771f04b 100644
--- a/video/smk_decoder.cpp
+++ b/video/smk_decoder.cpp
@@ -29,6 +29,8 @@
#include "common/endian.h"
#include "common/util.h"
#include "common/stream.h"
+#include "common/memstream.h"
+#include "common/bitstream.h"
#include "common/system.h"
#include "common/textconsole.h"
@@ -46,85 +48,15 @@ enum SmkBlockTypes {
};
/*
- * class BitStream
- * Little-endian bit stream provider.
- */
-
-class BitStream {
-public:
- BitStream(byte *buf, uint32 length)
- : _buf(buf), _end(buf+length), _bitCount(8) {
- _curByte = *_buf++;
- }
-
- bool getBit();
- byte getBits8();
-
- byte peek8() const;
- void skip(int n);
-
-private:
- byte *_buf;
- byte *_end;
- byte _curByte;
- byte _bitCount;
-};
-
-bool BitStream::getBit() {
- if (_bitCount == 0) {
- assert(_buf < _end);
- _curByte = *_buf++;
- _bitCount = 8;
- }
-
- bool v = _curByte & 1;
-
- _curByte >>= 1;
- --_bitCount;
-
- return v;
-}
-
-byte BitStream::getBits8() {
- assert(_buf < _end);
-
- byte v = (*_buf << _bitCount) | _curByte;
- _curByte = *_buf++ >> (8 - _bitCount);
-
- return v;
-}
-
-byte BitStream::peek8() const {
- if (_buf == _end)
- return _curByte;
-
- assert(_buf < _end);
- return (*_buf << _bitCount) | _curByte;
-}
-
-void BitStream::skip(int n) {
- assert(n <= 8);
- _curByte >>= n;
-
- if (_bitCount >= n) {
- _bitCount -= n;
- } else {
- assert(_buf < _end);
- _bitCount = _bitCount + 8 - n;
- _curByte = *_buf++ >> (8 - _bitCount);
- }
-}
-
-/*
* class SmallHuffmanTree
* A Huffman-tree to hold 8-bit values.
*/
class SmallHuffmanTree {
public:
- SmallHuffmanTree(BitStream &bs);
+ SmallHuffmanTree(Common::BitStream &bs);
- uint16 getCode(BitStream &bs);
+ uint16 getCode(Common::BitStream &bs);
private:
enum {
SMK_NODE = 0x8000
@@ -138,10 +70,10 @@ private:
uint16 _prefixtree[256];
byte _prefixlength[256];
- BitStream &_bs;
+ Common::BitStream &_bs;
};
-SmallHuffmanTree::SmallHuffmanTree(BitStream &bs)
+SmallHuffmanTree::SmallHuffmanTree(Common::BitStream &bs)
: _treeSize(0), _bs(bs) {
uint32 bit = _bs.getBit();
assert(bit);
@@ -157,7 +89,7 @@ SmallHuffmanTree::SmallHuffmanTree(BitStream &bs)
uint16 SmallHuffmanTree::decodeTree(uint32 prefix, int length) {
if (!_bs.getBit()) { // Leaf
- _tree[_treeSize] = _bs.getBits8();
+ _tree[_treeSize] = _bs.getBits(8);
if (length <= 8) {
for (int i = 0; i < 256; i += (1 << length)) {
@@ -186,8 +118,8 @@ uint16 SmallHuffmanTree::decodeTree(uint32 prefix, int length) {
return r1+r2+1;
}
-uint16 SmallHuffmanTree::getCode(BitStream &bs) {
- byte peek = bs.peek8();
+uint16 SmallHuffmanTree::getCode(Common::BitStream &bs) {
+ byte peek = bs.peekBits(8);
uint16 *p = &_tree[_prefixtree[peek]];
bs.skip(_prefixlength[peek]);
@@ -207,11 +139,11 @@ uint16 SmallHuffmanTree::getCode(BitStream &bs) {
class BigHuffmanTree {
public:
- BigHuffmanTree(BitStream &bs, int allocSize);
+ BigHuffmanTree(Common::BitStream &bs, int allocSize);
~BigHuffmanTree();
void reset();
- uint32 getCode(BitStream &bs);
+ uint32 getCode(Common::BitStream &bs);
private:
enum {
SMK_NODE = 0x80000000
@@ -227,13 +159,13 @@ private:
byte _prefixlength[256];
/* Used during construction */
- BitStream &_bs;
+ Common::BitStream &_bs;
uint32 _markers[3];
SmallHuffmanTree *_loBytes;
SmallHuffmanTree *_hiBytes;
};
-BigHuffmanTree::BigHuffmanTree(BitStream &bs, int allocSize)
+BigHuffmanTree::BigHuffmanTree(Common::BitStream &bs, int allocSize)
: _bs(bs) {
uint32 bit = _bs.getBit();
if (!bit) {
@@ -249,12 +181,9 @@ BigHuffmanTree::BigHuffmanTree(BitStream &bs, int allocSize)
_loBytes = new SmallHuffmanTree(_bs);
_hiBytes = new SmallHuffmanTree(_bs);
- _markers[0] = _bs.getBits8();
- _markers[0] |= (_bs.getBits8() << 8);
- _markers[1] = _bs.getBits8();
- _markers[1] |= (_bs.getBits8() << 8);
- _markers[2] = _bs.getBits8();
- _markers[2] |= (_bs.getBits8() << 8);
+ _markers[0] = _bs.getBits(16);
+ _markers[1] = _bs.getBits(16);
+ _markers[2] = _bs.getBits(16);
_last[0] = _last[1] = _last[2] = 0xffffffff;
@@ -328,8 +257,8 @@ uint32 BigHuffmanTree::decodeTree(uint32 prefix, int length) {
return r1+r2+1;
}
-uint32 BigHuffmanTree::getCode(BitStream &bs) {
- byte peek = bs.peek8();
+uint32 BigHuffmanTree::getCode(Common::BitStream &bs) {
+ byte peek = bs.peekBits(8);
uint32 *p = &_tree[_prefixtree[peek]];
bs.skip(_prefixlength[peek]);
@@ -372,17 +301,11 @@ bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) {
_fileStream = stream;
- // Seek to the first frame
+ // Read in the Smacker header
_header.signature = _fileStream->readUint32BE();
- // No BINK support available
- if (_header.signature == MKTAG('B','I','K','i')) {
- delete _fileStream;
- _fileStream = 0;
+ if (_header.signature != MKTAG('S', 'M', 'K', '2') && _header.signature != MKTAG('S', 'M', 'K', '4'))
return false;
- }
-
- assert(_header.signature == MKTAG('S','M','K','2') || _header.signature == MKTAG('S','M','K','4'));
uint32 width = _fileStream->readUint32LE();
uint32 height = _fileStream->readUint32LE();
@@ -465,18 +388,16 @@ bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) {
for (i = 0; i < _frameCount; ++i)
_frameTypes[i] = _fileStream->readByte();
- byte *huffmanTrees = new byte[_header.treesSize];
+ byte *huffmanTrees = (byte *) malloc(_header.treesSize);
_fileStream->read(huffmanTrees, _header.treesSize);
- BitStream bs(huffmanTrees, _header.treesSize);
+ Common::BitStream8LSB bs(new Common::MemoryReadStream(huffmanTrees, _header.treesSize, DisposeAfterUse::YES), true);
_MMapTree = new BigHuffmanTree(bs, _header.mMapSize);
_MClrTree = new BigHuffmanTree(bs, _header.mClrSize);
_FullTree = new BigHuffmanTree(bs, _header.fullSize);
_TypeTree = new BigHuffmanTree(bs, _header.typeSize);
- delete[] huffmanTrees;
-
_surface = new Graphics::Surface();
// Height needs to be doubled if we have flags (Y-interlaced or Y-doubled)
@@ -562,10 +483,13 @@ const Graphics::Surface *SmackerDecoder::decodeNextFrame() {
uint32 frameDataSize = frameSize - (_fileStream->pos() - startPos);
- _frameData = (byte *)malloc(frameDataSize);
+ _frameData = (byte *)malloc(frameDataSize + 1);
+ // Padding to keep the BigHuffmanTrees from reading past the data end
+ _frameData[frameDataSize] = 0x00;
+
_fileStream->read(_frameData, frameDataSize);
- BitStream bs(_frameData, frameDataSize);
+ Common::BitStream8LSB bs(new Common::MemoryReadStream(_frameData, frameDataSize + 1, DisposeAfterUse::YES), true);
_MMapTree->reset();
_MClrTree->reset();
@@ -707,8 +631,6 @@ const Graphics::Surface *SmackerDecoder::decodeNextFrame() {
_fileStream->seek(startPos + frameSize);
- free(_frameData);
-
if (_curFrame == 0)
_startTime = g_system->getMillis();
@@ -718,7 +640,9 @@ const Graphics::Surface *SmackerDecoder::decodeNextFrame() {
void SmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize) {
if (_header.audioInfo[track].hasAudio && chunkSize > 0 && track == 0) {
// If it's track 0, play the audio data
- byte *soundBuffer = (byte *)malloc(chunkSize);
+ byte *soundBuffer = (byte *)malloc(chunkSize + 1);
+ // Padding to keep the SmallHuffmanTrees from reading past the data end
+ soundBuffer[chunkSize] = 0x00;
_fileStream->read(soundBuffer, chunkSize);
@@ -728,7 +652,7 @@ void SmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpac
return;
} else if (_header.audioInfo[track].compression == kCompressionDPCM) {
// Compressed audio (Huffman DPCM encoded)
- queueCompressedBuffer(soundBuffer, chunkSize, unpackedSize, track);
+ queueCompressedBuffer(soundBuffer, chunkSize + 1, unpackedSize, track);
free(soundBuffer);
} else {
// Uncompressed audio (PCM)
@@ -758,7 +682,7 @@ void SmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpac
void SmackerDecoder::queueCompressedBuffer(byte *buffer, uint32 bufferSize,
uint32 unpackedSize, int streamNum) {
- BitStream audioBS(buffer, bufferSize);
+ Common::BitStream8LSB audioBS(new Common::MemoryReadStream(buffer, bufferSize), true);
bool dataPresent = audioBS.getBit();
if (!dataPresent)
@@ -785,20 +709,16 @@ void SmackerDecoder::queueCompressedBuffer(byte *buffer, uint32 bufferSize,
if (isStereo) {
if (is16Bits) {
- byte hi = audioBS.getBits8();
- byte lo = audioBS.getBits8();
- bases[1] = (int16) ((hi << 8) | lo);
+ bases[1] = FROM_BE_16(audioBS.getBits(16));
} else {
- bases[1] = audioBS.getBits8();
+ bases[1] = audioBS.getBits(8);
}
}
if (is16Bits) {
- byte hi = audioBS.getBits8();
- byte lo = audioBS.getBits8();
- bases[0] = (int16) ((hi << 8) | lo);
+ bases[0] = FROM_BE_16(audioBS.getBits(16));
} else {
- bases[0] = audioBS.getBits8();
+ bases[0] = audioBS.getBits(8);
}
// The bases are the first samples, too